From 43ccc9a089397b49354c160639325e1acfbcee9b Mon Sep 17 00:00:00 2001 From: vgmoose Date: Thu, 4 Apr 2024 23:53:53 -0400 Subject: [PATCH] initial switch changes/abstractions --- .github/workflows/main.yml | 5 +- src/draw.c | 70 ----------------- src/program.c | 4 - src/switch/switch_draw.c | 116 +++++++++++++++++++++++++++ src/switch/switch_draw.h | 152 ++++++++++++++++++++++++++++++++++++ src/switch/switch_paddata.c | 66 ++++++++++++++++ src/switch/switch_paddata.h | 29 +++++++ src/wiiu_draw.c | 72 +++++++++++++++++ 8 files changed, 436 insertions(+), 78 deletions(-) create mode 100644 src/switch/switch_draw.c create mode 100644 src/switch/switch_draw.h create mode 100644 src/switch/switch_paddata.c create mode 100644 src/switch/switch_paddata.h create mode 100644 src/wiiu_draw.c diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 073fe18..6fef3b3 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -4,6 +4,7 @@ on: push: branches: - main + - switch-rewrite pull_request: branches: - main @@ -19,10 +20,6 @@ jobs: submodules: recursive - name: Build ${{ matrix.platform }} run: make - - uses: actions/upload-artifact@v3 - with: - name: wiiu-space.rpx - path: /__w/wiiu-space/wiiu-space/wiiu-space.rpx - uses: actions/upload-artifact@v3 with: name: wiiu-space.wuhb diff --git a/src/draw.c b/src/draw.c index d571148..fa222c7 100755 --- a/src/draw.c +++ b/src/draw.c @@ -2,76 +2,6 @@ #include "space.h" #include "program.h" -#include -#include - -void flipBuffers() -{ - //Grab the buffer size for each screen (TV and gamepad) - int buf0_size = OSScreenGetBufferSizeEx(0); - int buf1_size = OSScreenGetBufferSizeEx(1); - - //Flush the cache - DCFlushRange((void *)screenBuffer + buf0_size, buf1_size); - DCFlushRange((void *)screenBuffer, buf0_size); - - //Flip the buffer - OSScreenFlipBuffersEx(0); - OSScreenFlipBuffersEx(1); -} - -/** -This is the main function that does the grunt work of drawing to both screens. It takes in the -Services structure that is constructed in program.c, which contains the pointer to the function -that is responsible for putting a pixel on the screen. By doing it this way, the OSScreenPutPixelEx function pointer is only -looked up once, at the program initialization, which makes successive calls to this pixel caller quicker. -**/ -void putAPixel(int x, int y, int r, int g, int b) -{ - uint32_t num = (r << 24) | (g << 16) | (b << 8) | 0; - x *= 2; - y *= 2; - - int ax, ay, az; - for (ax=0; ax<2; ax++) - for (ay=0; ay<2; ay++) - for (az=0; az<2; az++) - if (ax) { // uncomment for fullscreen on TV, text on the TV will have to be moved though - OSScreenPutPixelEx(ax, x + ay, y + az, num); - } // uncomment for fullscreen on TV, text on the TV will have to be moved though - else { // uncomment for fullscreen on TV, text on the TV will have to be moved though - int a; // uncomment for fullscreen on TV, text on the TV will have to be moved though - for (a = 0; a < 2; a++) { // uncomment for fullscreen on TV, text on the TV will have to be moved though - int x1 = ( ( (x + ay) * 3 ) / 2 ) + a; // uncomment for fullscreen on TV, text on the TV will have to be moved though - int y1 = ( ( (y + az) * 3 ) / 2 ) + a; // uncomment for fullscreen on TV, text on the TV will have to be moved though - int x2 = ( ( (x + ay) * 3 ) / 2 ) + ( 1 - a ); // uncomment for fullscreen on TV, text on the TV will have to be moved though - int y2 = ( ( (y + az) * 3 ) / 2 ) + a; // uncomment for fullscreen on TV, text on the TV will have to be moved though - OSScreenPutPixelEx( 0, x1, y1, num ); // uncomment for fullscreen on TV, text on the TV will have to be moved though - OSScreenPutPixelEx( 0, x2, y2, num ); // uncomment for fullscreen on TV, text on the TV will have to be moved though - } // uncomment for fullscreen on TV, text on the TV will have to be moved though - OSScreenPutPixelEx( 1, x, y, num ); // uncomment for fullscreen on TV, text on the TV will have to be moved though - } // uncomment for fullscreen on TV, text on the TV will have to be moved though -} - -void drawString(int x, int y, char * string) -{ - //OSScreenPutFontEx(0, x, y, string); - OSScreenPutFontEx(1, x, y, string); -} - -void drawStringTv(int x, int y, char * string) -{ - OSScreenPutFontEx(0, x, y, string); -} - -void fillScreen(char r,char g,char b,char a) -{ - uint32_t num = (r << 24) | (g << 16) | (b << 8) | a; - - OSScreenClearBufferEx(0, num); - OSScreenClearBufferEx(1, num); -} - // draw black rect all at once void fillRect(int ox, int oy, int width, int height, int r, int g, int b) { diff --git a/src/program.c b/src/program.c index d4b43be..58a52dc 100755 --- a/src/program.c +++ b/src/program.c @@ -6,7 +6,6 @@ #include #include #include -#include "memory.h" #include "program.h" //#include "trigmath.h" @@ -88,7 +87,6 @@ bool AppRunning() { initialized = false; screenDeinit(); - memoryRelease(); } ProcUIShutdown(); } @@ -98,7 +96,6 @@ bool AppRunning() initialized = false; screenDeinit(); - memoryRelease(); ProcUIDrawDoneRelease(); } else if(status == PROCUI_STATUS_IN_FOREGROUND) @@ -107,7 +104,6 @@ bool AppRunning() if(!initialized) { initialized = true; - memoryInitialize(); screenInit(); // redraw the screen upon resume diff --git a/src/switch/switch_draw.c b/src/switch/switch_draw.c new file mode 100644 index 0000000..4174d58 --- /dev/null +++ b/src/switch/switch_draw.c @@ -0,0 +1,116 @@ +#include "switch_draw.h" +#include + +#define FB_WIDTH 1920 +#define FB_HEIGHT 1080 + + +Framebuffer fb; +u32 stride; + +bool bufferOpen = false; + +void screenInit() +{ + NWindow* win = nwindowGetDefault(); + + // Create a linear double-buffered framebuffer + framebufferCreate(&fb, win, FB_WIDTH, FB_HEIGHT, PIXEL_FORMAT_RGBA_8888, 2); + framebufferMakeLinear(&fb); + + //Clear both framebuffers. + for (int ii = 0; ii < 2; ii++) + { + fillScreen(0,0,0,0); + flipBuffers(); + } +} + +void screenDeinit() +{ + for(int ii = 0; ii < 2; ii++) + { + fillScreen(0,0,0,0); + flipBuffers(); + } + + framebufferClose(&fb); +} + +void flipBuffers() +{ + if (bufferOpen) { + framebufferEnd(&fb); + bufferOpen = false; + } else { + // Retrieve the framebuffer + u32* framebuf = (u32*) framebufferBegin(&fb, &stride); + bufferOpen = true; + } +} + +/** +This is the main function that does the grunt work of drawing to both screens. It takes in the +Services structure that is constructed in program.c, which contains the pointer to the function +that is responsible for putting a pixel on the screen. By doing it this way, the OSScreenPutPixelEx function pointer is only +looked up once, at the program initialization, which makes successive calls to this pixel caller quicker. +**/ +void putAPixel(int x, int y, int r, int g, int b) +{ + uint32_t num = (r << 24) | (g << 16) | (b << 8) | 0; + x *= 2; + y *= 2; + + int ax, ay; + for (ay=0; ay<2; ay++) + for (ax=0; ax<2; ax++) { + u32 pos = (y+ay) * stride / sizeof(u32) + (x+ax); + // if (pos < FB_WIDTH * FB_HEIGHT) + ((u32*)fb.framebuffer)[pos] = num; + } +} + +void drawString(struct Graphics* g, int xi, int yi, char * string) +{ + // on Switch, we only use the TV screen + drawStringTv(g, xi, yi, string); +} + +void drawStringTv(struct Graphics* g, int xi, int yi, char * string) +{ + // for every character in the string, if it's within range, render it at the current position + // and move over 8 characters + + xi *= 6.25; + yi *= 13; + + char next = -1; + int i = 0; + while (next != '\0') + { + next = string[i++]; + + // actually draw this char pixel by pixel, if it's within range + if (next >= 0 && next < 128) + { + char* bitmap = font[next]; + int x, y; + for (x=0; x < 8; x++) { + for (y=0; y < 8; y++) { + if (bitmap[x] & 1 << y) + putAPixel(g, xi+y+i*8, yi+x, 0xff, 0xff, 0xff); + } +// printf("\n"); + } + } + } +} + +void fillScreen(char r,char g,char b,char a) +{ + uint32_t num = (r << 24) | (g << 16) | (b << 8) | a; + + // TODO: clear screen + // OSScreenClearBufferEx(0, num); + // OSScreenClearBufferEx(1, num); +} \ No newline at end of file diff --git a/src/switch/switch_draw.h b/src/switch/switch_draw.h new file mode 100644 index 0000000..cd3cd0c --- /dev/null +++ b/src/switch/switch_draw.h @@ -0,0 +1,152 @@ +/** + * 8x8 monochrome bitmap fonts for rendering + * Author: Daniel Hepper + * + * License: Public Domain + * + * Based on: + * // Summary: font8x8.h + * // 8x8 monochrome bitmap fonts for rendering + * // + * // Author: + * // Marcel Sondaar + * // International Business Machines (public domain VGA fonts) + * // + * // License: + * // Public Domain + * + * Fetched from: http://dimensionalrift.homelinux.net/combuster/mos3/?p=viewsource&file=/modules/gfx/font8_8.asm + **/ + +// Constant: font8x8_basic +// Contains an 8x8 font map for unicode points U+0000 - U+007F (basic latin) +char font[128][8] = { + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0000 (nul) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0001 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0002 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0003 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0004 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0005 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0006 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0007 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0008 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0009 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000A + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000B + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000C + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000D + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000E + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000F + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0010 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0011 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0012 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0013 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0014 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0015 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0016 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0017 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0018 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0019 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001A + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001B + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001C + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001D + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001E + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001F + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0020 (space) + { 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00}, // U+0021 (!) + { 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0022 (") + { 0x36, 0x36, 0x7F, 0x36, 0x7F, 0x36, 0x36, 0x00}, // U+0023 (#) + { 0x0C, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x0C, 0x00}, // U+0024 ($) + { 0x00, 0x63, 0x33, 0x18, 0x0C, 0x66, 0x63, 0x00}, // U+0025 (%) + { 0x1C, 0x36, 0x1C, 0x6E, 0x3B, 0x33, 0x6E, 0x00}, // U+0026 (&) + { 0x06, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0027 (') + { 0x18, 0x0C, 0x06, 0x06, 0x06, 0x0C, 0x18, 0x00}, // U+0028 (() + { 0x06, 0x0C, 0x18, 0x18, 0x18, 0x0C, 0x06, 0x00}, // U+0029 ()) + { 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00}, // U+002A (*) + { 0x00, 0x0C, 0x0C, 0x3F, 0x0C, 0x0C, 0x00, 0x00}, // U+002B (+) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x06}, // U+002C (,) + { 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00}, // U+002D (-) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00}, // U+002E (.) + { 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x00}, // U+002F (/) + { 0x3E, 0x63, 0x73, 0x7B, 0x6F, 0x67, 0x3E, 0x00}, // U+0030 (0) + { 0x0C, 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00}, // U+0031 (1) + { 0x1E, 0x33, 0x30, 0x1C, 0x06, 0x33, 0x3F, 0x00}, // U+0032 (2) + { 0x1E, 0x33, 0x30, 0x1C, 0x30, 0x33, 0x1E, 0x00}, // U+0033 (3) + { 0x38, 0x3C, 0x36, 0x33, 0x7F, 0x30, 0x78, 0x00}, // U+0034 (4) + { 0x3F, 0x03, 0x1F, 0x30, 0x30, 0x33, 0x1E, 0x00}, // U+0035 (5) + { 0x1C, 0x06, 0x03, 0x1F, 0x33, 0x33, 0x1E, 0x00}, // U+0036 (6) + { 0x3F, 0x33, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x00}, // U+0037 (7) + { 0x1E, 0x33, 0x33, 0x1E, 0x33, 0x33, 0x1E, 0x00}, // U+0038 (8) + { 0x1E, 0x33, 0x33, 0x3E, 0x30, 0x18, 0x0E, 0x00}, // U+0039 (9) + { 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00}, // U+003A (:) + { 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x06}, // U+003B (//) + { 0x18, 0x0C, 0x06, 0x03, 0x06, 0x0C, 0x18, 0x00}, // U+003C (<) + { 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00}, // U+003D (=) + { 0x06, 0x0C, 0x18, 0x30, 0x18, 0x0C, 0x06, 0x00}, // U+003E (>) + { 0x1E, 0x33, 0x30, 0x18, 0x0C, 0x00, 0x0C, 0x00}, // U+003F (?) + { 0x3E, 0x63, 0x7B, 0x7B, 0x7B, 0x03, 0x1E, 0x00}, // U+0040 (@) + { 0x0C, 0x1E, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x00}, // U+0041 (A) + { 0x3F, 0x66, 0x66, 0x3E, 0x66, 0x66, 0x3F, 0x00}, // U+0042 (B) + { 0x3C, 0x66, 0x03, 0x03, 0x03, 0x66, 0x3C, 0x00}, // U+0043 (C) + { 0x1F, 0x36, 0x66, 0x66, 0x66, 0x36, 0x1F, 0x00}, // U+0044 (D) + { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x46, 0x7F, 0x00}, // U+0045 (E) + { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x06, 0x0F, 0x00}, // U+0046 (F) + { 0x3C, 0x66, 0x03, 0x03, 0x73, 0x66, 0x7C, 0x00}, // U+0047 (G) + { 0x33, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x33, 0x00}, // U+0048 (H) + { 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0049 (I) + { 0x78, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E, 0x00}, // U+004A (J) + { 0x67, 0x66, 0x36, 0x1E, 0x36, 0x66, 0x67, 0x00}, // U+004B (K) + { 0x0F, 0x06, 0x06, 0x06, 0x46, 0x66, 0x7F, 0x00}, // U+004C (L) + { 0x63, 0x77, 0x7F, 0x7F, 0x6B, 0x63, 0x63, 0x00}, // U+004D (M) + { 0x63, 0x67, 0x6F, 0x7B, 0x73, 0x63, 0x63, 0x00}, // U+004E (N) + { 0x1C, 0x36, 0x63, 0x63, 0x63, 0x36, 0x1C, 0x00}, // U+004F (O) + { 0x3F, 0x66, 0x66, 0x3E, 0x06, 0x06, 0x0F, 0x00}, // U+0050 (P) + { 0x1E, 0x33, 0x33, 0x33, 0x3B, 0x1E, 0x38, 0x00}, // U+0051 (Q) + { 0x3F, 0x66, 0x66, 0x3E, 0x36, 0x66, 0x67, 0x00}, // U+0052 (R) + { 0x1E, 0x33, 0x07, 0x0E, 0x38, 0x33, 0x1E, 0x00}, // U+0053 (S) + { 0x3F, 0x2D, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0054 (T) + { 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0x00}, // U+0055 (U) + { 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}, // U+0056 (V) + { 0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0x00}, // U+0057 (W) + { 0x63, 0x63, 0x36, 0x1C, 0x1C, 0x36, 0x63, 0x00}, // U+0058 (X) + { 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x0C, 0x1E, 0x00}, // U+0059 (Y) + { 0x7F, 0x63, 0x31, 0x18, 0x4C, 0x66, 0x7F, 0x00}, // U+005A (Z) + { 0x1E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1E, 0x00}, // U+005B ([) + { 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00}, // U+005C (\) + { 0x1E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1E, 0x00}, // U+005D (]) + { 0x08, 0x1C, 0x36, 0x63, 0x00, 0x00, 0x00, 0x00}, // U+005E (^) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF}, // U+005F (_) + { 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0060 (`) + { 0x00, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x6E, 0x00}, // U+0061 (a) + { 0x07, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x3B, 0x00}, // U+0062 (b) + { 0x00, 0x00, 0x1E, 0x33, 0x03, 0x33, 0x1E, 0x00}, // U+0063 (c) + { 0x38, 0x30, 0x30, 0x3e, 0x33, 0x33, 0x6E, 0x00}, // U+0064 (d) + { 0x00, 0x00, 0x1E, 0x33, 0x3f, 0x03, 0x1E, 0x00}, // U+0065 (e) + { 0x1C, 0x36, 0x06, 0x0f, 0x06, 0x06, 0x0F, 0x00}, // U+0066 (f) + { 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x1F}, // U+0067 (g) + { 0x07, 0x06, 0x36, 0x6E, 0x66, 0x66, 0x67, 0x00}, // U+0068 (h) + { 0x0C, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0069 (i) + { 0x30, 0x00, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E}, // U+006A (j) + { 0x07, 0x06, 0x66, 0x36, 0x1E, 0x36, 0x67, 0x00}, // U+006B (k) + { 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+006C (l) + { 0x00, 0x00, 0x33, 0x7F, 0x7F, 0x6B, 0x63, 0x00}, // U+006D (m) + { 0x00, 0x00, 0x1F, 0x33, 0x33, 0x33, 0x33, 0x00}, // U+006E (n) + { 0x00, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00}, // U+006F (o) + { 0x00, 0x00, 0x3B, 0x66, 0x66, 0x3E, 0x06, 0x0F}, // U+0070 (p) + { 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x78}, // U+0071 (q) + { 0x00, 0x00, 0x3B, 0x6E, 0x66, 0x06, 0x0F, 0x00}, // U+0072 (r) + { 0x00, 0x00, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x00}, // U+0073 (s) + { 0x08, 0x0C, 0x3E, 0x0C, 0x0C, 0x2C, 0x18, 0x00}, // U+0074 (t) + { 0x00, 0x00, 0x33, 0x33, 0x33, 0x33, 0x6E, 0x00}, // U+0075 (u) + { 0x00, 0x00, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}, // U+0076 (v) + { 0x00, 0x00, 0x63, 0x6B, 0x7F, 0x7F, 0x36, 0x00}, // U+0077 (w) + { 0x00, 0x00, 0x63, 0x36, 0x1C, 0x36, 0x63, 0x00}, // U+0078 (x) + { 0x00, 0x00, 0x33, 0x33, 0x33, 0x3E, 0x30, 0x1F}, // U+0079 (y) + { 0x00, 0x00, 0x3F, 0x19, 0x0C, 0x26, 0x3F, 0x00}, // U+007A (z) + { 0x38, 0x0C, 0x0C, 0x07, 0x0C, 0x0C, 0x38, 0x00}, // U+007B ({) + { 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00}, // U+007C (|) + { 0x07, 0x0C, 0x0C, 0x38, 0x0C, 0x0C, 0x07, 0x00}, // U+007D (}) + { 0x6E, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+007E (~) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} // U+007F +}; \ No newline at end of file diff --git a/src/switch/switch_paddata.c b/src/switch/switch_paddata.c new file mode 100644 index 0000000..6106e24 --- /dev/null +++ b/src/switch/switch_paddata.c @@ -0,0 +1,66 @@ +#include + +#include "switch_input.h" + +PadState pad; + +void PADInit() +{ + padConfigureInput(1, HidNpadStyleSet_NpadStandard); + + padInitializeDefault(&pad); + + // init touch screen + hidInitializeTouchScreen(); + +} + +void PADDestroy() +{ + +} + +void PADRead(struct PADData* data) +{ + // reset buttons + data->btns_h = 0b00000000; + + data->lstick_x = 0; + data->lstick_y = 0; + data->rstick_x = 0; + data->rstick_y = 0; + + padUpdate(&pad); + + // update pushed buttons + data->btns_d = padGetButtonsDown(&pad); + data->btns_h = padGetButtons(&pad); + + // update sticks + HidAnalogStickState analog_stick_l = padGetStickPos(&pad, 0); + HidAnalogStickState analog_stick_r = padGetStickPos(&pad, 1); + data->lstick_x = analog_stick_l.x; + data->lstick_y = analog_stick_l.y; + data->rstick_x = analog_stick_r.x; + data->rstick_y = analog_stick_r.y; + + // reset touched flag + data->touched = 0; + + HidTouchScreenState state={0}; + int largest_touch = 0; + if (hidGetTouchScreenStates(&state, 1)) { + for(s32 i=0; i largest_touch) + { + largest_touch = curTouch; + data->touched = 1; // mark as touched + data->touched_y = state.touches[i].y; + data->touched_x = state.touches[i].x; + } + } + } +} \ No newline at end of file diff --git a/src/switch/switch_paddata.h b/src/switch/switch_paddata.h new file mode 100644 index 0000000..95e878a --- /dev/null +++ b/src/switch/switch_paddata.h @@ -0,0 +1,29 @@ +// These files implement WiiU-style wrappers for reading controller/touch data on the Switch + +#define PAD_BUTTON_LEFT BIT(12) +#define PAD_BUTTON_RIGHT BIT(14) +#define PAD_BUTTON_UP BIT(13) +#define PAD_BUTTON_DOWN BIT(15) + +#define PAD_BUTTON_MINUS BIT(11) +#define PAD_BUTTON_PLUS BIT(10) + +#define PAD_BUTTON_A BIT(0) +#define PAD_BUTTON_B BIT(2) + +struct PADData { + int btns_h; + + float rstick_x; + float lstick_x; + float rstick_y; + float lstick_y; + + int touched; + int touched_x; + int touched_y; +}; + +void PADInit(); +void PADDestroy(); +void PADRead(struct PADData* data); \ No newline at end of file diff --git a/src/wiiu_draw.c b/src/wiiu_draw.c new file mode 100644 index 0000000..dd0598c --- /dev/null +++ b/src/wiiu_draw.c @@ -0,0 +1,72 @@ + +#include "draw.h" + +#include +#include + +void flipBuffers() +{ + //Grab the buffer size for each screen (TV and gamepad) + int buf0_size = OSScreenGetBufferSizeEx(0); + int buf1_size = OSScreenGetBufferSizeEx(1); + + //Flush the cache + DCFlushRange((void *)screenBuffer + buf0_size, buf1_size); + DCFlushRange((void *)screenBuffer, buf0_size); + + //Flip the buffer + OSScreenFlipBuffersEx(0); + OSScreenFlipBuffersEx(1); +} + +/** +This is the main function that does the grunt work of drawing to both screens. It takes in the +Services structure that is constructed in program.c, which contains the pointer to the function +that is responsible for putting a pixel on the screen. By doing it this way, the OSScreenPutPixelEx function pointer is only +looked up once, at the program initialization, which makes successive calls to this pixel caller quicker. +**/ +void putAPixel(int x, int y, int r, int g, int b) +{ + uint32_t num = (r << 24) | (g << 16) | (b << 8) | 0; + x *= 2; + y *= 2; + + int ax, ay, az; + for (ax=0; ax<2; ax++) + for (ay=0; ay<2; ay++) + for (az=0; az<2; az++) + if (ax) { // uncomment for fullscreen on TV, text on the TV will have to be moved though + OSScreenPutPixelEx(ax, x + ay, y + az, num); + } // uncomment for fullscreen on TV, text on the TV will have to be moved though + else { // uncomment for fullscreen on TV, text on the TV will have to be moved though + int a; // uncomment for fullscreen on TV, text on the TV will have to be moved though + for (a = 0; a < 2; a++) { // uncomment for fullscreen on TV, text on the TV will have to be moved though + int x1 = ( ( (x + ay) * 3 ) / 2 ) + a; // uncomment for fullscreen on TV, text on the TV will have to be moved though + int y1 = ( ( (y + az) * 3 ) / 2 ) + a; // uncomment for fullscreen on TV, text on the TV will have to be moved though + int x2 = ( ( (x + ay) * 3 ) / 2 ) + ( 1 - a ); // uncomment for fullscreen on TV, text on the TV will have to be moved though + int y2 = ( ( (y + az) * 3 ) / 2 ) + a; // uncomment for fullscreen on TV, text on the TV will have to be moved though + OSScreenPutPixelEx( 0, x1, y1, num ); // uncomment for fullscreen on TV, text on the TV will have to be moved though + OSScreenPutPixelEx( 0, x2, y2, num ); // uncomment for fullscreen on TV, text on the TV will have to be moved though + } // uncomment for fullscreen on TV, text on the TV will have to be moved though + OSScreenPutPixelEx( 1, x, y, num ); // uncomment for fullscreen on TV, text on the TV will have to be moved though + } // uncomment for fullscreen on TV, text on the TV will have to be moved though +} + +void drawString(int x, int y, char * string) +{ + //OSScreenPutFontEx(0, x, y, string); + OSScreenPutFontEx(1, x, y, string); +} + +void drawStringTv(int x, int y, char * string) +{ + OSScreenPutFontEx(0, x, y, string); +} + +void fillScreen(char r,char g,char b,char a) +{ + uint32_t num = (r << 24) | (g << 16) | (b << 8) | a; + + OSScreenClearBufferEx(0, num); + OSScreenClearBufferEx(1, num); +} \ No newline at end of file