From 2ec56be1a9553e4b0ad6280ce4271bc5c057ee29 Mon Sep 17 00:00:00 2001 From: headshot2017 Date: Tue, 9 Jul 2024 21:34:06 -0400 Subject: [PATCH] add inverted rotation screen mode (#2) --- arm9/src/nds_input.cpp | 38 +++++--- arm9/src/ndsfb_graphics.cpp | 177 ++++++++++++++++++++++++++++------- arm9/src/ndsfb_graphics.h | 5 +- graphics/bg_screenmode3.grit | 2 + graphics/bg_screenmode3.png | Bin 0 -> 26417 bytes 5 files changed, 174 insertions(+), 48 deletions(-) create mode 100644 graphics/bg_screenmode3.grit create mode 100644 graphics/bg_screenmode3.png diff --git a/arm9/src/nds_input.cpp b/arm9/src/nds_input.cpp index 4cf0aca..5039c71 100644 --- a/arm9/src/nds_input.cpp +++ b/arm9/src/nds_input.cpp @@ -9,21 +9,31 @@ static u32 nudgeKey, launchKey, leftKey, rightKey, upKey; void nds_input::Initialize() { - if (!ndsfb_graphics::isRotated()) + switch (ndsfb_graphics::getRotation()) { - nudgeKey = KEY_X; - launchKey = KEY_DOWN | KEY_B; - leftKey = KEY_LEFT | KEY_Y | KEY_L; - rightKey = KEY_RIGHT | KEY_A | KEY_R; - upKey = KEY_UP; - } - else - { - nudgeKey = KEY_L; - launchKey = KEY_LEFT; - leftKey = KEY_UP; - rightKey = KEY_DOWN; - upKey = KEY_RIGHT; + case 0: // default + nudgeKey = KEY_X; + launchKey = KEY_DOWN | KEY_B; + leftKey = KEY_LEFT | KEY_Y | KEY_L; + rightKey = KEY_RIGHT | KEY_A | KEY_R; + upKey = KEY_UP; + break; + + case 1: // portrait (90° CCW) + nudgeKey = KEY_L; + launchKey = KEY_LEFT; + leftKey = KEY_UP; + rightKey = KEY_DOWN; + upKey = KEY_RIGHT; + break; + + case 2: // inverted portrait (90° CW) + nudgeKey = KEY_R; + launchKey = KEY_A; + leftKey = KEY_B; + rightKey = KEY_X; + upKey = KEY_Y; + break; } } diff --git a/arm9/src/ndsfb_graphics.cpp b/arm9/src/ndsfb_graphics.cpp index 6139a15..c566e62 100644 --- a/arm9/src/ndsfb_graphics.cpp +++ b/arm9/src/ndsfb_graphics.cpp @@ -6,16 +6,22 @@ #include "bg_screenmode.h" #include "bg_screenmode2.h" +#include "bg_screenmode3.h" +#include #include #include #include -static int tableStartPos = (0) * 256 + (256-1-16); // pinbal table start position for rotated screen mode +typedef void (*voidCallback)(); + +static int tableStartPos1 = (0) * 256 + (256-1-16); // pinball table start position for rotated screen mode +static int tableStartPos2 = (192-1-0) * 256 + (16); // pinball table start position for inv. rotated screen mode +static std::array rotationCb; bool ndsfb_graphics::isConsoleInitialized = false; -bool ndsfb_graphics::rotated = false; +int ndsfb_graphics::rotation = 0; int ndsfb_graphics::bgMainID = 0; int ndsfb_graphics::bgSubID = 0; @@ -30,6 +36,10 @@ void ndsfb_graphics::Initialize() vramSetBankA(VRAM_A_LCD); vramSetBankC(VRAM_C_SUB_BG); + + rotationCb[0] = UpdateNormalMode; + rotationCb[1] = UpdateRotatedMode; + rotationCb[2] = UpdateInvRotatedMode; } void ndsfb_graphics::SwapBuffers() @@ -43,17 +53,17 @@ void ndsfb_graphics::AskRotationMode() vramSetBankC(VRAM_C_SUB_BG); int bgID = bgInitSub(0, BgType_Text8bpp, BgSize_T_256x256, 0, 1); - const unsigned* bgTiles[] = {bg_screenmodeTiles, bg_screenmode2Tiles}; - const u16* bgMap[] = {bg_screenmodeMap, bg_screenmode2Map}; - const u16* bgPal[] = {bg_screenmodePal, bg_screenmode2Pal}; - u32 bgTilesLen[] = {bg_screenmodeTilesLen, bg_screenmode2TilesLen}; + const unsigned* bgTiles[] = {bg_screenmodeTiles, bg_screenmode2Tiles, bg_screenmode3Tiles}; + const u16* bgMap[] = {bg_screenmodeMap, bg_screenmode2Map, bg_screenmode3Map}; + const u16* bgPal[] = {bg_screenmodePal, bg_screenmode2Pal, bg_screenmode3Pal}; + u32 bgTilesLen[] = {bg_screenmodeTilesLen, bg_screenmode2TilesLen, bg_screenmode3TilesLen}; bool selected = false; int selection = 0; while (!selected) { - rotated = (selection == 1); + rotation = selection; dmaCopy(bgTiles[selection], bgGetGfxPtr(bgID), bgTilesLen[selection]); dmaCopy(bgMap[selection], bgGetMapPtr(bgID), 1536); @@ -68,13 +78,13 @@ void ndsfb_graphics::AskRotationMode() int key = keysDown(); if (key & KEY_RIGHT) { - selection = (selection+1) % 2; + selection = (selection+1) % 3; break; } if (key & KEY_LEFT) { - selection = (selection-1) % 2; - if (selection < 0) selection = -selection; + selection--; + if (selection < 0) selection += 3; break; } if (key & KEY_A) @@ -90,7 +100,7 @@ void ndsfb_graphics::AskRotationMode() void ndsfb_graphics::UpdateFull(bool sub) { // copy full bitmap to screen, depending on rotation mode - if (!rotated) + if (rotation == 0) // default rotation { // Full bitmap for (int y = 0; y < 192; y++) @@ -107,40 +117,84 @@ void ndsfb_graphics::UpdateFull(bool sub) return; } - // Rotated 90° CCW index: (x) * 256 + (256 - 1 - y) + if (rotation == 1) // rotated 90° CCW + { + // Rotated 90° CCW index: (x) * 256 + (256 - 1 - y) - // Table bitmap - int vwidth = 360; - if (!dsi::isDSi()) vwidth /= 2; + // Table bitmap + int vwidth = 360; + if (!dsi::isDSi()) vwidth /= 2; - for (int y = 0; y < 224; y++) - { - for (int x = 0; x < 360; x++) + for (int y = 0; y < 224; y++) { - int px = f32toint( mulf32( divf32( inttof32(x), inttof32(192) ), inttof32(vwidth) ) ); - int py = f32toint( mulf32( divf32( inttof32(y), inttof32(224) ), inttof32(render::vscreen->Height) ) ); + for (int x = 0; x < 360; x++) + { + int px = f32toint( mulf32( divf32( inttof32(x), inttof32(192) ), inttof32(vwidth) ) ); + int py = f32toint( mulf32( divf32( inttof32(y), inttof32(224) ), inttof32(render::vscreen->Height) ) ); - Rgba color = render::vscreen->BmpBufPtr1[py * render::vscreen->Width + px].rgba; - int ind = tableStartPos + ((x-3) * 256 + (256-1-y)); - VRAM_A[ind] = (!color.Alpha) ? 0 : ARGB16(1, color.Blue>>3, color.Green>>3, color.Red>>3); + Rgba color = render::vscreen->BmpBufPtr1[py * render::vscreen->Width + px].rgba; + int ind = tableStartPos1 + ((x-3) * 256 + (256-1-y)); + VRAM_A[ind] = (!color.Alpha) ? 0 : ARGB16(1, color.Blue>>3, color.Green>>3, color.Red>>3); + } } + + if (!sub) return; + + // Info bitmap + vwidth = 380; + if (!dsi::isDSi()) vwidth /= 2; + for (int y = 0; y < 256; y++) + { + for (int x = 328; x < 328+192; x++) + { + int px = f32toint( mulf32( divf32( inttof32(x), inttof32(192) ), inttof32(render::vscreen->Width-vwidth) ) ); + int py = f32toint( mulf32( divf32( inttof32(y), inttof32(256) ), inttof32(render::vscreen->Height) ) ); + u16* vram_ptr = bgGetGfxPtr(bgSubID); + + Rgba color = render::vscreen->BmpBufPtr1[py * render::vscreen->Width + px].rgba; + int ind = (x-328) * 256 + (256-1-y); + vram_ptr[ind] = (!color.Alpha) ? 0 : ARGB16(1, color.Blue>>3, color.Green>>3, color.Red>>3); + } + } + + return; } - if (!sub) return; + // Inverted rotation (90° CW) index: (192 - 1 - x) * 256 + (y) // Info bitmap - vwidth = 380; + int vwidth = 380; if (!dsi::isDSi()) vwidth /= 2; + for (int y = 0; y < 256; y++) { for (int x = 328; x < 328+192; x++) { int px = f32toint( mulf32( divf32( inttof32(x), inttof32(192) ), inttof32(render::vscreen->Width-vwidth) ) ); int py = f32toint( mulf32( divf32( inttof32(y), inttof32(256) ), inttof32(render::vscreen->Height) ) ); + + Rgba color = render::vscreen->BmpBufPtr1[py * render::vscreen->Width + px].rgba; + int ind = (192-1-(x-328)) * 256 + (y); + VRAM_A[ind] = (!color.Alpha) ? 0 : ARGB16(1, color.Blue>>3, color.Green>>3, color.Red>>3); + } + } + + if (!sub) return; + + // Table bitmap + vwidth = 360; + if (!dsi::isDSi()) vwidth /= 2; + + for (int y = 0; y < 224; y++) + { + for (int x = 0; x < 360; x++) + { + int px = f32toint( mulf32( divf32( inttof32(x), inttof32(192) ), inttof32(vwidth) ) ); + int py = f32toint( mulf32( divf32( inttof32(y), inttof32(224) ), inttof32(render::vscreen->Height) ) ); u16* vram_ptr = bgGetGfxPtr(bgSubID); Rgba color = render::vscreen->BmpBufPtr1[py * render::vscreen->Width + px].rgba; - int ind = (x-328) * 256 + (256-1-y); + int ind = tableStartPos2 - ((x-2) * 256) + (y+1); vram_ptr[ind] = (!color.Alpha) ? 0 : ARGB16(1, color.Blue>>3, color.Green>>3, color.Red>>3); } } @@ -149,10 +203,7 @@ void ndsfb_graphics::UpdateFull(bool sub) void ndsfb_graphics::Update() { // update dirty bitmap regions, depending on rotation mode - if (!rotated) - UpdateNormalMode(); - else - UpdateRotatedMode(); + rotationCb[rotation](); render::get_dirty_regions().clear(); } @@ -254,10 +305,72 @@ void ndsfb_graphics::UpdateRotatedMode() Rgba color = render::vscreen->BmpBufPtr1[py * render::vscreen->Width + px].rgba; ind = (vram_ptr == VRAM_A) ? - tableStartPos + ((x-3) * 256 + (256-1-y)) : + tableStartPos1 + ((x-3) * 256 + (256-1-y)) : (x-328) * 256 + (256-1-y); vram_ptr[ind] = (!color.Alpha) ? 0 : ARGB16(1, color.Blue>>3, color.Green>>3, color.Red>>3); } } } -} \ No newline at end of file +} + +void ndsfb_graphics::UpdateInvRotatedMode() +{ + int vwidthTable = 360; + int vwidthInfo = 380; + int xPosCheck = 370; + if (!dsi::isDSi()) + { + vwidthTable /= 2; + vwidthInfo /= 2; + xPosCheck /= 2; + } + + for (u32 i=0; iHeight) ), inttof32(224) ) ) )-1; + dirty.Width = f32toint( maths::ceilf32(mulf32( divf32( inttof32(dirty.Width), inttof32(vwidthTable) ), inttof32(192) ) ) )+1; + dirty.Height = f32toint( maths::ceilf32(mulf32( divf32( inttof32(dirty.Height), inttof32(render::vscreen->Height) ), inttof32(224) ) ) )+1; + } + else + { + dirty.XPosition = f32toint( maths::ceilf32(mulf32( divf32( inttof32(dirty.XPosition), inttof32(render::vscreen->Width-vwidthInfo) ), inttof32(192) ) ) )-1; + dirty.YPosition = f32toint( maths::ceilf32(mulf32( divf32( inttof32(dirty.YPosition), inttof32(render::vscreen->Height) ), inttof32(256) ) ) )-1; + dirty.Width = f32toint( maths::ceilf32(mulf32( divf32( inttof32(dirty.Width), inttof32(render::vscreen->Width-vwidthInfo) ), inttof32(192) ) ) )+1; + dirty.Height = f32toint( maths::ceilf32(mulf32( divf32( inttof32(dirty.Height), inttof32(render::vscreen->Height) ), inttof32(256) ) ) )+1; + } + + for (int y = dirty.YPosition; y < dirty.YPosition+dirty.Height; y++) + { + for (int x = dirty.XPosition; x < dirty.XPosition+dirty.Width; x++) + { + int px, py, ind; + + if (vram_ptr != VRAM_A) + { + px = f32toint( mulf32( divf32( inttof32(x), inttof32(192) ), inttof32(vwidthTable) ) ); + py = f32toint( mulf32( divf32( inttof32(y), inttof32(224) ), inttof32(render::vscreen->Height) ) ); + if (px >= vwidthTable) px = vwidthTable-1; + if (py >= render::vscreen->Height) py = render::vscreen->Height-1; + } + else + { + px = f32toint( mulf32( divf32( inttof32(x), inttof32(192) ), inttof32(render::vscreen->Width-vwidthInfo) ) ); + py = f32toint( mulf32( divf32( inttof32(y), inttof32(256) ), inttof32(render::vscreen->Height) ) ); + } + + Rgba color = render::vscreen->BmpBufPtr1[py * render::vscreen->Width + px].rgba; + + ind = (vram_ptr == VRAM_A) ? + (192-1-(x-328)) * 256 + (y) : + tableStartPos2 - ((x-2) * 256) + (y+1); + vram_ptr[ind] = (!color.Alpha) ? 0 : ARGB16(1, color.Blue>>3, color.Green>>3, color.Red>>3); + } + } + } +} diff --git a/arm9/src/ndsfb_graphics.h b/arm9/src/ndsfb_graphics.h index 6378316..02fbfea 100644 --- a/arm9/src/ndsfb_graphics.h +++ b/arm9/src/ndsfb_graphics.h @@ -5,7 +5,7 @@ class ndsfb_graphics { static bool isConsoleInitialized; - static bool rotated; + static int rotation; static int bgMainID; static int bgSubID; @@ -14,7 +14,7 @@ class ndsfb_graphics static void SwapBuffers(); static void AskRotationMode(); - static bool isRotated() {return rotated;} + static int getRotation() {return rotation;} static void UpdateFull(bool sub=true); static void Update(); @@ -24,4 +24,5 @@ class ndsfb_graphics private: static void UpdateNormalMode(); static void UpdateRotatedMode(); + static void UpdateInvRotatedMode(); }; \ No newline at end of file diff --git a/graphics/bg_screenmode3.grit b/graphics/bg_screenmode3.grit new file mode 100644 index 0000000..3a2b126 --- /dev/null +++ b/graphics/bg_screenmode3.grit @@ -0,0 +1,2 @@ +# 8-bit tiles +-g -gt -gB8 -m -p diff --git a/graphics/bg_screenmode3.png b/graphics/bg_screenmode3.png new file mode 100644 index 0000000000000000000000000000000000000000..2024c6fde33a33eb72b98b1a1c9ff0b0b112344b GIT binary patch literal 26417 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 literal 0 HcmV?d00001