Merge pull request #1146 from UnknownShadow200/UIFixes_3DS

Try to simplify code for 3DS dual screen behaviour
This commit is contained in:
UnknownShadow200 2024-02-09 11:47:34 +11:00 committed by GitHub
commit 09a33815a1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 108 additions and 119 deletions

View File

@ -238,8 +238,14 @@ void Gfx_OnWindowResize(void);
/* NOTE: Each line is separated by \n */
void Gfx_GetApiInfo(cc_string* info);
void Gfx_3DS_DrawToTopScreen(void);
void Gfx_3DS_DrawToBottomScreen(void);
enum Screen3DS { TOP_SCREEN, BOTTOM_SCREEN };
#ifdef CC_BUILD_DUALSCREEN
/* Selects which screen on the 3DS to render to */
void Gfx_3DS_SetRenderScreen(enum Screen3DS screen);
#else
static inline
void Gfx_3DS_SetRenderScreen(enum Screen3DS screen) { }
#endif
/* Raises ContextLost event and updates state for lost contexts */
void Gfx_LoseContext(const char* reason);

View File

@ -181,12 +181,8 @@ void Gfx_FreeState(void) {
Gfx_DeleteTexture(&white_square);
}
void Gfx_3DS_DrawToTopScreen(void) {
C3D_FrameDrawOn(topTarget);
}
void Gfx_3DS_DrawToBottomScreen(void) {
C3D_FrameDrawOn(bottomTarget);
void Gfx_3DS_SetRenderScreen(enum Screen3DS screen) {
C3D_FrameDrawOn(screen == TOP_SCREEN ? topTarget : bottomTarget);
}
/*########################################################################################################################*

View File

@ -143,16 +143,12 @@ void Gui_LayoutAll(void) {
struct Screen* s;
int i;
enum Screen3DS scr = Window_3DS_SetRenderScreen(BOTTOM_SCREEN);
for (i = 0; i < Gui.ScreensCount; i++)
{
s = Gui_Screens[i];
s->VTABLE->Layout(s);
s->dirty = true;
}
Window_3DS_SetRenderScreen(scr);
}
void Gui_RefreshAll(void) {
@ -162,14 +158,10 @@ void Gui_RefreshAll(void) {
}
void Gui_Refresh(struct Screen* s) {
enum Screen3DS scr = Window_3DS_SetRenderScreen(BOTTOM_SCREEN);
s->VTABLE->ContextLost(s);
s->VTABLE->ContextRecreated(s);
s->VTABLE->Layout(s);
s->dirty = true;
Window_3DS_SetRenderScreen(scr);
}
static void Gui_AddCore(struct Screen* s, int priority) {
@ -193,8 +185,6 @@ static void Gui_AddCore(struct Screen* s, int priority) {
priorities[i] = priority;
Gui.ScreensCount++;
enum Screen3DS scr = Window_3DS_SetRenderScreen(BOTTOM_SCREEN);
s->dirty = true;
s->VTABLE->Init(s);
s->VTABLE->ContextRecreated(s);
@ -205,8 +195,6 @@ static void Gui_AddCore(struct Screen* s, int priority) {
{
s->VTABLE->HandlesPointerMove(s, i, Pointers[i].x, Pointers[i].y);
}
Window_3DS_SetRenderScreen(scr);
}
/* Returns index of the given screen in the screens list, -1 if not */
@ -301,8 +289,7 @@ void Gui_RenderGui(double delta) {
struct Screen* s;
int i;
enum Screen3DS scr = Window_3DS_SetRenderScreen(BOTTOM_SCREEN);
Gfx_3DS_SetRenderScreen(BOTTOM_SCREEN);
#ifdef CC_BUILD_DUALSCREEN
Texture_Render(&touchBgTex);
#endif
@ -317,7 +304,7 @@ void Gui_RenderGui(double delta) {
s->VTABLE->Render(s, delta);
}
Window_3DS_SetRenderScreen(scr);
Gfx_3DS_SetRenderScreen(TOP_SCREEN);
}
@ -409,8 +396,18 @@ void Widget_SetLocation(void* widget, cc_uint8 horAnchor, cc_uint8 verAnchor, in
void Widget_CalcPosition(void* widget) {
struct Widget* w = (struct Widget*)widget;
w->x = Gui_CalcPos(w->horAnchor, w->xOffset, w->width , Window_Main.Width );
w->y = Gui_CalcPos(w->verAnchor, w->yOffset, w->height, Window_Main.Height);
int windowWidth, windowHeight;
#ifdef CC_BUILD_DUALSCREEN
windowWidth = (w->flags & WIDGET_FLAG_MAINSCREEN) ? Window_Main.Width : Window_Alt.Width;
windowHeight = (w->flags & WIDGET_FLAG_MAINSCREEN) ? Window_Main.Height : Window_Alt.Height;
#else
windowWidth = Window_Main.Width;
windowHeight = Window_Main.Height;
#endif
w->x = Gui_CalcPos(w->horAnchor, w->xOffset, w->width , windowWidth );
w->y = Gui_CalcPos(w->verAnchor, w->yOffset, w->height, windowHeight);
}
void Widget_Reset(void* widget) {
@ -475,7 +472,6 @@ int Screen_DoPointerDown(void* screen, int id, int x, int y) {
struct Screen* s = (struct Screen*)screen;
struct Widget** widgets = s->widgets;
int i, count = s->numWidgets;
enum Screen3DS scr = Window_3DS_SetRenderScreen(BOTTOM_SCREEN);
/* iterate backwards (because last elements rendered are shown over others) */
for (i = count - 1; i >= 0; i--)
@ -491,9 +487,6 @@ int Screen_DoPointerDown(void* screen, int id, int x, int y) {
}
break;
}
Window_3DS_SetRenderScreen(scr);
return i;
}

View File

@ -173,6 +173,14 @@ struct WidgetVTABLE {
#define WIDGET_FLAG_DISABLED 0x01
/* Whether a widget can be selected via up/down */
#define WIDGET_FLAG_SELECTABLE 0x02
/* Whether for dual screen builds, this widget still appears on */
/* the main game screen instead of the dedicated UI screen */
#define WIDGET_FLAG_MAINSCREEN 0x04
#ifdef CC_BUILD_DUALSCREEN
#define Window_UI Window_Alt
#else
#define Window_UI Window_Main
#endif
/* Represents an individual 2D gui component. */
struct Widget { Widget_Body };

View File

@ -541,15 +541,17 @@ static void DrawTitleText(struct FontDesc* font, const char* text, struct Contex
}
#ifdef CC_BUILD_DUALSCREEN
extern cc_bool launcherTop;
void Launcher_DrawTitle(struct FontDesc* font, const char* text, struct Context2D* ctx) {
/* Put title on top screen */
Window_3DS_SetRenderScreen(TOP_SCREEN);
struct Context2D topCtx;
struct Bitmap bmp;
launcherTop = true;
ctx = &topCtx;
bmp.width = max(Window_Main.Width, 1);
bmp.height = max(Window_Main.Height, 1);
bmp.width = Window_Alt.Width;
bmp.height = Window_Alt.Height;
Window_AllocFramebuffer(&bmp);
Context2D_Wrap(ctx, &bmp);
@ -558,8 +560,8 @@ void Launcher_DrawTitle(struct FontDesc* font, const char* text, struct Context2
Rect2D rect = { 0, 0, bmp.width, bmp.height };
Window_DrawFramebuffer(rect, &bmp);
Window_3DS_SetRenderScreen(BOTTOM_SCREEN);
Window_FreeFramebuffer(&bmp);
launcherTop = false;
}
#else
void Launcher_DrawTitle(struct FontDesc* font, const char* text, struct Context2D* ctx) {

View File

@ -79,7 +79,7 @@ static void Menu_RenderBounds(void) {
Then using wolfram alpha to solve the glblendfunc equation */
PackedCol topCol = PackedCol_Make(24, 24, 24, 105);
PackedCol bottomCol = PackedCol_Make(51, 51, 98, 162);
Gfx_Draw2DGradient(0, 0, Window_Main.Width, Window_Main.Height, topCol, bottomCol);
Gfx_Draw2DGradient(0, 0, Window_UI.Width, Window_UI.Height, topCol, bottomCol);
}
@ -994,13 +994,13 @@ static void EditHotkeyScreen_Update(void* screen, double delta) {
static void EditHotkeyScreen_Layout(void* screen) {
struct EditHotkeyScreen* s = (struct EditHotkeyScreen*)screen;
s->barWidth = Display_ScaleX(500);
s->barX = Gui_CalcPos(ANCHOR_CENTRE, 0, s->barWidth, Window_Main.Width);
s->barX = Gui_CalcPos(ANCHOR_CENTRE, 0, s->barWidth, Window_UI.Width);
s->barHeight = Display_ScaleY(2);
s->barY[0] = Gui_CalcPos(ANCHOR_CENTRE, Display_ScaleY(-65),
s->barHeight, Window_Main.Height);
s->barHeight, Window_UI.Height);
s->barY[1] = Gui_CalcPos(ANCHOR_CENTRE, Display_ScaleY( 45),
s->barHeight, Window_Main.Height);
s->barHeight, Window_UI.Height);
Widget_SetLocation(&s->btns[0], ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -150);
Widget_SetLocation(&s->btns[1], ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -100);
@ -2458,7 +2458,7 @@ static void MenuOptionsScreen_LayoutExtHelp(struct MenuOptionsScreen* s) {
Widget_SetLocation(&s->extHelp, ANCHOR_MIN, ANCHOR_CENTRE_MIN, 0, 100);
/* If use centre align above, then each line in extended help gets */
/* centered aligned separately - which is not the desired behaviour. */
s->extHelp.xOffset = Window_Main.Width / 2 - s->extHelp.width / 2;
s->extHelp.xOffset = Window_UI.Width / 2 - s->extHelp.width / 2;
Widget_Layout(&s->extHelp);
}
@ -3551,12 +3551,12 @@ static void TexIdsOverlay_Layout(void* screen) {
struct TexIdsOverlay* s = (struct TexIdsOverlay*)screen;
int size;
size = Window_Main.Height / ATLAS2D_TILES_PER_ROW;
size = Window_UI.Height / ATLAS2D_TILES_PER_ROW;
size = (size / 8) * 8;
Math_Clamp(size, 8, 40);
s->xOffset = Gui_CalcPos(ANCHOR_CENTRE, 0, size * Atlas2D.RowsCount, Window_Main.Width);
s->yOffset = Gui_CalcPos(ANCHOR_CENTRE, 0, size * ATLAS2D_TILES_PER_ROW, Window_Main.Height);
s->xOffset = Gui_CalcPos(ANCHOR_CENTRE, 0, size * Atlas2D.RowsCount, Window_UI.Width);
s->yOffset = Gui_CalcPos(ANCHOR_CENTRE, 0, size * ATLAS2D_TILES_PER_ROW, Window_UI.Height);
s->tileSize = size;
/* Can't use vertical centreing here */

View File

@ -202,11 +202,9 @@ static void HUDScreen_ContextRecreated(void* screen) {
}
static int HUDScreen_LayoutHotbar(void) {
enum Screen3DS scr = Window_3DS_SetRenderScreen(BOTTOM_SCREEN);
struct HUDScreen* s = &HUDScreen_Instance;
s->hotbar.scale = Gui_GetHotbarScale();
Widget_Layout(&s->hotbar);
Window_3DS_SetRenderScreen(scr);
return s->hotbar.height;
}
@ -295,6 +293,9 @@ static void HUDScreen_Init(void* screen) {
TextWidget_Init(&s->line1);
TextWidget_Init(&s->line2);
s->line1.flags |= WIDGET_FLAG_MAINSCREEN;
s->line2.flags |= WIDGET_FLAG_MAINSCREEN;
Event_Register_(&UserEvents.HacksStateChanged, s, HUDScreen_HacksChanged);
Event_Register_(&TextureEvents.AtlasChanged, s, HUDScreen_NeedRedrawing);
Event_Register_(&BlockEvents.BlockDefChanged, s, HUDScreen_NeedRedrawing);
@ -339,7 +340,6 @@ static void HUDScreen_BuildCrosshairsMesh(struct VertexTextured** ptr) {
/* Only top quarter of icons.png is used */
static struct Texture tex = { 0, Tex_Rect(0,0,0,0), Tex_UV(0.0f,0.0f, 15/256.0f,15/64.0f) };
int extent;
enum Screen3DS scr = Window_3DS_SetRenderScreen(TOP_SCREEN);
extent = (int)(CH_EXTENT * Gui_Scale(Window_Main.Height / 480.0f));
tex.x = (Window_Main.Width / 2) - extent;
@ -348,8 +348,6 @@ static void HUDScreen_BuildCrosshairsMesh(struct VertexTextured** ptr) {
tex.Width = extent * 2;
tex.Height = extent * 2;
Gfx_Make2DQuad(&tex, PACKEDCOL_WHITE, ptr);
Window_3DS_SetRenderScreen(scr);
}
static void HUDScreen_BuildMesh(void* screen) {
@ -374,7 +372,7 @@ static void HUDScreen_Render(void* screen, double delta) {
struct HUDScreen* s = (struct HUDScreen*)screen;
if (Game_HideGui) return;
enum Screen3DS scr = Window_3DS_SetRenderScreen(TOP_SCREEN);
Gfx_3DS_SetRenderScreen(TOP_SCREEN);
Gfx_SetVertexFormat(VERTEX_FORMAT_TEXTURED);
Gfx_BindDynamicVb(s->vb);
@ -400,7 +398,7 @@ static void HUDScreen_Render(void* screen, double delta) {
}
}
Window_3DS_SetRenderScreen(scr);
Gfx_3DS_SetRenderScreen(BOTTOM_SCREEN);
}
static const struct ScreenVTABLE HUDScreen_VTABLE = {
@ -504,8 +502,6 @@ static void TabListOverlay_Layout(void* screen) {
int i, x, y, width = 0, height = 0;
int columns = Math_CeilDiv(s->usedCount, LIST_NAMES_PER_COLUMN);
enum Screen3DS scr = Window_3DS_SetRenderScreen(TOP_SCREEN);
for (i = 0; i < columns; i++)
{
width += TabListOverlay_GetColumnWidth(s, i);
@ -521,9 +517,9 @@ static void TabListOverlay_Layout(void* screen) {
width += paddingX * 2;
height += paddingY * 2;
y = Window_Main.Height / 4 - height / 2;
s->x = Gui_CalcPos(ANCHOR_CENTRE, 0, width , Window_Main.Width );
s->y = Gui_CalcPos(ANCHOR_CENTRE, -max(0, y), height, Window_Main.Height);
y = Window_UI.Height / 4 - height / 2;
s->x = Gui_CalcPos(ANCHOR_CENTRE, 0, width , Window_UI.Width );
s->y = Gui_CalcPos(ANCHOR_CENTRE, -max(0, y), height, Window_UI.Height);
x = s->x + paddingX;
y = s->y + paddingY;
@ -542,8 +538,6 @@ static void TabListOverlay_Layout(void* screen) {
s->title.horAnchor = ANCHOR_CENTRE;
s->title.yOffset = s->y + paddingY / 2;
Widget_Layout(&s->title);
Window_3DS_SetRenderScreen(scr);
}
static void TabListOverlay_AddName(struct TabListOverlay* s, EntityID id, int index) {
@ -819,7 +813,7 @@ static void TabListOverlay_Render(void* screen, double delta) {
if (Game_HideGui || !IsOnlyChatActive()) return;
enum Screen3DS scr = Window_3DS_SetRenderScreen(TOP_SCREEN);
Gfx_3DS_SetRenderScreen(TOP_SCREEN);
Gfx_Draw2DGradient(s->x, s->y, s->width, s->height, topCol, bottomCol);
@ -836,7 +830,7 @@ static void TabListOverlay_Render(void* screen, double delta) {
offset += 4;
}
Window_3DS_SetRenderScreen(scr);
Gfx_3DS_SetRenderScreen(BOTTOM_SCREEN);
}
static void TabListOverlay_Free(void* screen) {
@ -906,11 +900,11 @@ static void ChatScreen_UpdateChatYOffsets(struct ChatScreen* s) {
y = min(s->input.base.y, Gui_HUD->hotbar.y);
y -= s->input.base.yOffset; /* add some padding */
s->altText.yOffset = Window_Main.Height - y;
s->altText.yOffset = Window_UI.Height - y;
Widget_Layout(&s->altText);
pad = s->altText.active ? 5 : 10;
s->clientStatus.yOffset = Window_Main.Height - s->altText.y + pad;
s->clientStatus.yOffset = Window_UI.Height - s->altText.y + pad;
Widget_Layout(&s->clientStatus);
s->chat.yOffset = s->clientStatus.yOffset + s->clientStatus.height;
Widget_Layout(&s->chat);
@ -1171,11 +1165,11 @@ static void ChatScreen_DrawChat(struct ChatScreen* s, double delta) {
#ifdef CC_BUILD_TOUCH
if (!Input_TouchMode) return;
enum Screen3DS scr = Window_3DS_SetRenderScreen(BOTTOM_SCREEN);
Gfx_3DS_SetRenderScreen(BOTTOM_SCREEN);
Elem_Render(&s->more, delta);
Elem_Render(&s->send, delta);
Elem_Render(&s->cancel, delta);
Window_3DS_SetRenderScreen(scr);
Gfx_3DS_SetRenderScreen(TOP_SCREEN);
#endif
}
}
@ -1239,8 +1233,6 @@ static void ChatScreen_BuildMesh(void* screen) {
}
static void ChatScreen_Layout(void* screen) {
enum Screen3DS scr = Window_3DS_SetRenderScreen(TOP_SCREEN);
struct ChatScreen* s = (struct ChatScreen*)screen;
if (ChatScreen_ChatUpdateFont(s)) ChatScreen_Redraw(s);
@ -1260,19 +1252,17 @@ static void ChatScreen_Layout(void* screen) {
Widget_Layout(&s->bottomRight);
Widget_SetLocation(&s->announcement, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 0);
s->announcement.yOffset = -Window_Main.Height / 4;
s->announcement.yOffset = -Window_UI.Height / 4;
Widget_Layout(&s->announcement);
Widget_SetLocation(&s->bigAnnouncement, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 0);
s->bigAnnouncement.yOffset = -Window_Main.Height / 16;
s->bigAnnouncement.yOffset = -Window_UI.Height / 16;
Widget_Layout(&s->bigAnnouncement);
Widget_SetLocation(&s->smallAnnouncement, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 0);
s->smallAnnouncement.yOffset = Window_Main.Height / 20;
s->smallAnnouncement.yOffset = Window_UI.Height / 20;
Widget_Layout(&s->smallAnnouncement);
Window_3DS_SetRenderScreen(scr);
#ifdef CC_BUILD_TOUCH
if (Window_Main.SoftKeyboard == SOFT_KEYBOARD_SHIFT) {
Widget_SetLocation(&s->send, ANCHOR_MAX, ANCHOR_MAX, 10, 60);
@ -1472,6 +1462,19 @@ static void ChatScreen_Init(void* screen) {
s->maxVertices = ChatScreen_CalcMaxVertices(s);
/* For dual screen builds, chat is still rendered on the main game screen */
s->input.base.flags |= WIDGET_FLAG_MAINSCREEN;
s->altText.flags |= WIDGET_FLAG_MAINSCREEN;
s->status.flags |= WIDGET_FLAG_MAINSCREEN;
s->bottomRight.flags |= WIDGET_FLAG_MAINSCREEN;
s->chat.flags |= WIDGET_FLAG_MAINSCREEN;
s->clientStatus.flags |= WIDGET_FLAG_MAINSCREEN;
s->bottomRight.flags |= WIDGET_FLAG_MAINSCREEN;
s->announcement.flags |= WIDGET_FLAG_MAINSCREEN;
s->bigAnnouncement.flags |= WIDGET_FLAG_MAINSCREEN;
s->smallAnnouncement.flags |= WIDGET_FLAG_MAINSCREEN;
#ifdef CC_BUILD_TOUCH
ButtonWidget_Init(&s->send, 100, NULL);
ButtonWidget_Init(&s->cancel, 100, NULL);
@ -1481,7 +1484,7 @@ static void ChatScreen_Init(void* screen) {
static void ChatScreen_Render(void* screen, double delta) {
struct ChatScreen* s = (struct ChatScreen*)screen;
enum Screen3DS scr = Window_3DS_SetRenderScreen(TOP_SCREEN);
Gfx_3DS_SetRenderScreen(TOP_SCREEN);
if (Game_HideGui && s->grabsInput) {
Elem_Render(&s->input.base, delta);
@ -1493,7 +1496,7 @@ static void ChatScreen_Render(void* screen, double delta) {
ChatScreen_DrawChat(s, delta);
}
Window_3DS_SetRenderScreen(scr);
Gfx_3DS_SetRenderScreen(BOTTOM_SCREEN);
}
static void ChatScreen_Free(void* screen) {
@ -1802,7 +1805,7 @@ static void LoadingScreen_SetMessage(struct LoadingScreen* s) {
}
static void LoadingScreen_CalcMaxVertices(struct LoadingScreen* s) {
s->rows = Math_CeilDiv(Window_Main.Height, LOADING_TILE_SIZE);
s->rows = Math_CeilDiv(Window_UI.Height, LOADING_TILE_SIZE);
s->maxVertices = Screen_CalcDefaultMaxVertices(s) + s->rows * 4;
}
@ -1814,9 +1817,9 @@ static void LoadingScreen_Layout(void* screen) {
y = Display_ScaleY(34);
s->progWidth = Display_ScaleX(200);
s->progX = Gui_CalcPos(ANCHOR_CENTRE, 0, s->progWidth, Window_Main.Width);
s->progX = Gui_CalcPos(ANCHOR_CENTRE, 0, s->progWidth, Window_UI.Width);
s->progHeight = Display_ScaleY(4);
s->progY = Gui_CalcPos(ANCHOR_CENTRE, y, s->progHeight, Window_Main.Height);
s->progY = Gui_CalcPos(ANCHOR_CENTRE, y, s->progHeight, Window_UI.Height);
oldRows = s->rows;
LoadingScreen_CalcMaxVertices(s);
@ -1850,9 +1853,9 @@ static void LoadingScreen_BuildMesh(void* screen) {
ptr = &data;
loc = Block_Tex(BLOCK_DIRT, FACE_YMAX);
Tex_SetRect(tex, 0,0, Window_Main.Width,LOADING_TILE_SIZE);
Tex_SetRect(tex, 0,0, Window_UI.Width,LOADING_TILE_SIZE);
tex.uv = Atlas1D_TexRec(loc, 1, &atlasIndex);
tex.uv.U2 = (float)Window_Main.Width / LOADING_TILE_SIZE;
tex.uv.U2 = (float)Window_UI.Width / LOADING_TILE_SIZE;
for (i = 0; i < s->rows; i++) {
tex.y = i * LOADING_TILE_SIZE;
@ -2126,7 +2129,7 @@ static void DisconnectScreen_Update(void* screen, double delta) {
static void DisconnectScreen_Render(void* screen, double delta) {
PackedCol top = PackedCol_Make(64, 32, 32, 255);
PackedCol bottom = PackedCol_Make(80, 16, 16, 255);
Gfx_Draw2DGradient(0, 0, Window_Main.Width, Window_Main.Height, top, bottom);
Gfx_Draw2DGradient(0, 0, Window_UI.Width, Window_UI.Height, top, bottom);
Screen_Render2Widgets(screen, delta);
}

View File

@ -448,7 +448,7 @@ static void HotbarWidget_RenderEntries(struct HotbarWidget* w, int offset) {
}
static int HotbarWidget_Render2(void* widget, int offset) {
enum Screen3DS scr = Window_3DS_SetRenderScreen(BOTTOM_SCREEN);
Gfx_3DS_SetRenderScreen(BOTTOM_SCREEN);
struct HotbarWidget* w = (struct HotbarWidget*)widget;
HotbarWidget_RenderOutline(w, offset );
@ -462,7 +462,7 @@ static int HotbarWidget_Render2(void* widget, int offset) {
}
#endif
Window_3DS_SetRenderScreen(scr);
Gfx_3DS_SetRenderScreen(TOP_SCREEN);
return HOTBAR_MAX_VERTICES;
}

View File

@ -235,13 +235,4 @@ void GLContext_SetFpsLimit(cc_bool vsync, float minFrameMs);
void GLContext_GetApiInfo(cc_string* info);
#endif
enum Screen3DS { TOP_SCREEN, BOTTOM_SCREEN };
#ifdef CC_BUILD_DUALSCREEN
/* Selects which screen on the 3DS to render to. Returns the previous screen */
enum Screen3DS Window_3DS_SetRenderScreen(enum Screen3DS screen);
#else
static inline
enum Screen3DS Window_3DS_SetRenderScreen(enum Screen3DS screen) { return TOP_SCREEN; }
#endif
#endif

View File

@ -14,13 +14,13 @@
static cc_bool launcherMode;
static Result irrst_result;
static enum Screen3DS renderScreen = TOP_SCREEN;
static u16 top_width, top_height;
static u16 btm_width, btm_height;
struct _DisplayData DisplayInfo;
struct _WindowData WindowInfo;
struct _WindowData Window_Alt;
cc_bool launcherTop;
// Note from https://github.com/devkitPro/libctru/blob/master/libctru/include/3ds/gfx.h
// * Please note that the 3DS uses *portrait* screens rotated 90 degrees counterclockwise.
@ -54,27 +54,17 @@ void Window_Init(void) {
void Window_Free(void) { irrstExit(); }
enum Screen3DS Window_3DS_SetRenderScreen(enum Screen3DS screen) {
enum Screen3DS prev = renderScreen;
if (screen != prev)
{
renderScreen = screen;
DisplayInfo.Width = (screen == TOP_SCREEN) ? 400 : 320;
WindowInfo.Width = DisplayInfo.Width;
if (screen == TOP_SCREEN)
Gfx_3DS_DrawToTopScreen();
else
Gfx_3DS_DrawToBottomScreen();
}
return prev;
}
void Window_Create2D(int width, int height) {
Window_3DS_SetRenderScreen(BOTTOM_SCREEN);
DisplayInfo.Width = btm_width;
Window_Main.Width = btm_width;
Window_Alt.Width = top_width;
launcherMode = true;
}
void Window_Create3D(int width, int height) {
Window_3DS_SetRenderScreen(TOP_SCREEN);
DisplayInfo.Width = top_width;
Window_Main.Width = top_width;
Window_Alt.Width = btm_width;
launcherMode = false;
}
@ -190,7 +180,7 @@ void Window_AllocFramebuffer(struct Bitmap* bmp) {
void Window_DrawFramebuffer(Rect2D r, struct Bitmap* bmp) {
u16 width, height;
gfxScreen_t screen = (renderScreen == TOP_SCREEN) ? GFX_TOP : GFX_BOTTOM;
gfxScreen_t screen = launcherTop ? GFX_TOP : GFX_BOTTOM;
gfxSetDoubleBuffering(screen, false);
u8* fb = gfxGetFramebuffer(screen, GFX_LEFT, &width, &height);