#include #include #include #include #include int main(int argc, char **argv) { WHBProcInit(); OSScreenInit(); size_t tvBufferSize = OSScreenGetBufferSizeEx(SCREEN_TV); size_t drcBufferSize = OSScreenGetBufferSizeEx(SCREEN_DRC); void *tvBuffer = memalign(0x100, tvBufferSize); void *drcBuffer = memalign(0x100, drcBufferSize); void quit(void) { if (tvBuffer) free(tvBuffer); if (drcBuffer) free(drcBuffer); OSScreenShutdown(); WHBProcShutdown(); } if (!tvBuffer || !drcBuffer) { quit(); return 1; } OSScreenSetBufferEx(SCREEN_TV, tvBuffer); OSScreenSetBufferEx(SCREEN_DRC, drcBuffer); OSScreenEnableEx(SCREEN_TV, true); OSScreenEnableEx(SCREEN_DRC, true); VPADStatus status; VPADReadError error; VPADTouchData gamepadTouchScreen; bool vpad_fatal = false; uint32_t penColor = 0xFFFFFF00; while (WHBProcIsRunning()) { VPADRead(VPAD_CHAN_0, &status, 1, &error); switch (error) { case VPAD_READ_SUCCESS: { VPADGetTPCalibratedPoint(VPAD_CHAN_0, &gamepadTouchScreen, &status.tpNormal); break; } case VPAD_READ_NO_SAMPLES: { continue; } case VPAD_READ_INVALID_CONTROLLER: { vpad_fatal = true; break; } default: { vpad_fatal = true; break; } } if (vpad_fatal) break; OSScreenPutFontEx(SCREEN_TV, 0, 0, "SimpleDrawU (TV)."); OSScreenPutFontEx(SCREEN_DRC, 0, 0, "SimpleDrawU (Gamepad)."); // clear screen if ((status.trigger & VPAD_BUTTON_PLUS) && (status.trigger & VPAD_BUTTON_MINUS)) { OSScreenClearBufferEx(SCREEN_TV, 0x00000000); OSScreenClearBufferEx(SCREEN_DRC, 0x00000000); } // select color if (status.trigger & VPAD_BUTTON_PLUS) { penColor = 0xFFFFFF00; } // white if (status.trigger & VPAD_BUTTON_MINUS) { penColor = 0x00000000; } // black if (status.trigger & VPAD_BUTTON_A) { penColor = 0xBF5B5B00; } // red if (status.trigger & VPAD_BUTTON_B) { penColor = 0xC6B95500; } // yellow if (status.trigger & VPAD_BUTTON_X) { penColor = 0x3C8D8800; } // blue if (status.trigger & VPAD_BUTTON_Y) { penColor = 0x86B46000; } // green // draw on screen if (gamepadTouchScreen.touched) { OSScreenPutPixelEx(SCREEN_TV, gamepadTouchScreen.x - 1, gamepadTouchScreen.y - 1, penColor); OSScreenPutPixelEx(SCREEN_TV, gamepadTouchScreen.x + 1, gamepadTouchScreen.y + 1, penColor); OSScreenPutPixelEx(SCREEN_TV, gamepadTouchScreen.x, gamepadTouchScreen.y, penColor); OSScreenPutPixelEx(SCREEN_TV, gamepadTouchScreen.x - 1, gamepadTouchScreen.y + 1, penColor); OSScreenPutPixelEx(SCREEN_TV, gamepadTouchScreen.x + 1, gamepadTouchScreen.y - 1, penColor); OSScreenPutPixelEx(SCREEN_DRC, gamepadTouchScreen.x + 1, gamepadTouchScreen.y + 1, penColor); OSScreenPutPixelEx(SCREEN_DRC, gamepadTouchScreen.x - 1, gamepadTouchScreen.y - 1, penColor); OSScreenPutPixelEx(SCREEN_DRC, gamepadTouchScreen.x, gamepadTouchScreen.y, penColor); OSScreenPutPixelEx(SCREEN_DRC, gamepadTouchScreen.x - 1, gamepadTouchScreen.y + 1, penColor); OSScreenPutPixelEx(SCREEN_DRC, gamepadTouchScreen.x + 1, gamepadTouchScreen.y - 1, penColor); } /* Flush all caches - read the tutorial, please! */ DCFlushRange(tvBuffer, tvBufferSize); DCFlushRange(drcBuffer, drcBufferSize); /* Flip buffers - the text is now on screen! Flipping is kinda like committing your graphics changes. */ OSScreenFlipBuffersEx(SCREEN_TV); OSScreenFlipBuffersEx(SCREEN_DRC); } quit(); return 0; }