From e91cc7cfd8741c25783cd0aca84c5c568db48d69 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Thu, 8 Feb 2024 22:34:31 +1100 Subject: [PATCH 1/2] WIP on avoiding calling Window_SetRenderScreen so often --- src/Gui.c | 28 +++++++++++----------- src/Gui.h | 10 +++++++- src/Menus.c | 16 ++++++------- src/Screens.c | 64 +++++++++++++++++++++++++++------------------------ src/Widgets.c | 2 +- 5 files changed, 67 insertions(+), 53 deletions(-) diff --git a/src/Gui.c b/src/Gui.c index 07dcc1d53..34a189128 100644 --- a/src/Gui.c +++ b/src/Gui.c @@ -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,12 +185,12 @@ 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); s->VTABLE->Layout(s); + + enum Screen3DS scr = Window_3DS_SetRenderScreen(BOTTOM_SCREEN); /* for selecting active button etc */ for (i = 0; i < Pointers_Count; i++) @@ -409,8 +401,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) { @@ -689,4 +691,4 @@ struct IGameComponent Gui_Component = { OnReset, /* Reset */ NULL, /* OnNewMap */ NULL, /* OnNewMapLoaded */ -}; +}; \ No newline at end of file diff --git a/src/Gui.h b/src/Gui.h index e5edce528..089c80834 100644 --- a/src/Gui.h +++ b/src/Gui.h @@ -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 }; @@ -270,4 +278,4 @@ void TextAtlas_AddInt(struct TextAtlas* atlas, int value, struct VertexTextured* #define Widget_BuildMesh(widget, vertices) (widget)->VTABLE->BuildMesh(widget, vertices) #define Widget_Render2(widget, offset) (widget)->VTABLE->Render2(widget, offset) #define Widget_Layout(widget) (widget)->VTABLE->Reposition(widget) -#endif +#endif \ No newline at end of file diff --git a/src/Menus.c b/src/Menus.c index f8e3dbe5b..5f81d7680 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -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 */ @@ -4401,4 +4401,4 @@ void TouchMoreScreen_Show(void) { Gui_Add((struct Screen*)s, GUI_PRIORITY_TOUCHMORE); } -#endif +#endif \ No newline at end of file diff --git a/src/Screens.c b/src/Screens.c index 343391c86..40a810c07 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -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; } @@ -294,6 +292,10 @@ static void HUDScreen_Init(void* screen) { HotbarWidget_Create(&s->hotbar); TextWidget_Init(&s->line1); TextWidget_Init(&s->line2); + + s->hotbar.flags |= WIDGET_FLAG_MAINSCREEN; + 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); @@ -339,17 +341,14 @@ 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; - tex.y = (Window_Main.Height / 2) - extent; + extent = (int)(CH_EXTENT * Gui_Scale(Window_UI.Height / 480.0f)); + tex.x = (Window_UI.Width / 2) - extent; + tex.y = (Window_UI.Height / 2) - extent; tex.Width = extent * 2; tex.Height = extent * 2; Gfx_Make2DQuad(&tex, PACKEDCOL_WHITE, ptr); - - Window_3DS_SetRenderScreen(scr); } static void HUDScreen_BuildMesh(void* screen) { @@ -504,8 +503,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 +518,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 +539,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) { @@ -906,11 +901,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); @@ -1239,8 +1234,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 +1253,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); @@ -1471,6 +1462,19 @@ static void ChatScreen_Init(void* screen) { Event_Register_(&ChatEvents.ColCodeChanged, s, ChatScreen_ColCodeChanged); 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); @@ -1802,7 +1806,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 +1818,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 +1854,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; @@ -2460,4 +2464,4 @@ void TouchScreen_Show(void) { if (!Input_TouchMode) return; Gui_Add((struct Screen*)s, GUI_PRIORITY_TOUCH); } -#endif +#endif \ No newline at end of file diff --git a/src/Widgets.c b/src/Widgets.c index acf9a615a..1d50a3b0d 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -2792,4 +2792,4 @@ void ThumbstickWidget_GetMovement(struct ThumbstickWidget* w, float* xMoving, fl if (dirs & DIR_YMIN) *zMoving -= 1; if (dirs & DIR_YMAX) *zMoving += 1; } -#endif +#endif \ No newline at end of file From 475cb602cae970697a86b984bb15434ed47634a8 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Thu, 8 Feb 2024 23:04:36 +1100 Subject: [PATCH 2/2] 3DS: Set gfx render screen target directly --- src/Graphics.h | 12 +++++++++--- src/Graphics_3DS.c | 14 +++++--------- src/Gui.c | 13 ++----------- src/Launcher.c | 10 ++++++---- src/Menus.c | 2 +- src/Screens.c | 25 ++++++++++++------------- src/Widgets.c | 4 ++-- src/Window.h | 11 +---------- src/Window_3DS.c | 32 +++++++++++--------------------- 9 files changed, 49 insertions(+), 74 deletions(-) diff --git a/src/Graphics.h b/src/Graphics.h index 16af4c859..04d1fbc05 100644 --- a/src/Graphics.h +++ b/src/Graphics.h @@ -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); @@ -283,4 +289,4 @@ void Gfx_RestoreAlphaState(cc_uint8 draw); void Texture_Render(const struct Texture* tex); /* Binds then renders the given texture */ void Texture_RenderShaded(const struct Texture* tex, PackedCol shadeColor); -#endif +#endif \ No newline at end of file diff --git a/src/Graphics_3DS.c b/src/Graphics_3DS.c index 2c90aa33a..59a7ad41c 100644 --- a/src/Graphics_3DS.c +++ b/src/Graphics_3DS.c @@ -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); } /*########################################################################################################################* @@ -375,8 +371,8 @@ void Gfx_BeginFrame(void) { } void Gfx_Clear(void) { - C3D_RenderTargetClear(topTarget, C3D_CLEAR_ALL, clear_color, 0); - C3D_RenderTargetClear(bottomTarget, C3D_CLEAR_ALL, 0, 0); + C3D_RenderTargetClear(topTarget, C3D_CLEAR_ALL, clear_color, 0); + C3D_RenderTargetClear(bottomTarget, C3D_CLEAR_ALL, 0, 0); } void Gfx_EndFrame(void) { @@ -797,4 +793,4 @@ void Gfx_Draw2DTexture(const struct Texture* tex, PackedCol color) { C3D_ImmSendAttrib(v[0].U, v[0].V, 0.0f, 0.0f); C3D_ImmDrawEnd(); } -#endif +#endif \ No newline at end of file diff --git a/src/Gui.c b/src/Gui.c index 34a189128..d6287e69a 100644 --- a/src/Gui.c +++ b/src/Gui.c @@ -190,15 +190,11 @@ static void Gui_AddCore(struct Screen* s, int priority) { s->VTABLE->ContextRecreated(s); s->VTABLE->Layout(s); - enum Screen3DS scr = Window_3DS_SetRenderScreen(BOTTOM_SCREEN); - /* for selecting active button etc */ for (i = 0; i < Pointers_Count; i++) { 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 */ @@ -293,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 @@ -309,7 +304,7 @@ void Gui_RenderGui(double delta) { s->VTABLE->Render(s, delta); } - Window_3DS_SetRenderScreen(scr); + Gfx_3DS_SetRenderScreen(TOP_SCREEN); } @@ -477,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--) @@ -493,9 +487,6 @@ int Screen_DoPointerDown(void* screen, int id, int x, int y) { } break; } - - Window_3DS_SetRenderScreen(scr); - return i; } diff --git a/src/Launcher.c b/src/Launcher.c index 35906e6d6..8293dc74e 100644 --- a/src/Launcher.c +++ b/src/Launcher.c @@ -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) { diff --git a/src/Menus.c b/src/Menus.c index 5f81d7680..8a2e1b640 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -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); } diff --git a/src/Screens.c b/src/Screens.c index 40a810c07..1dda5ea00 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -293,7 +293,6 @@ static void HUDScreen_Init(void* screen) { TextWidget_Init(&s->line1); TextWidget_Init(&s->line2); - s->hotbar.flags |= WIDGET_FLAG_MAINSCREEN; s->line1.flags |= WIDGET_FLAG_MAINSCREEN; s->line2.flags |= WIDGET_FLAG_MAINSCREEN; @@ -342,9 +341,9 @@ static void HUDScreen_BuildCrosshairsMesh(struct VertexTextured** ptr) { 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; - extent = (int)(CH_EXTENT * Gui_Scale(Window_UI.Height / 480.0f)); - tex.x = (Window_UI.Width / 2) - extent; - tex.y = (Window_UI.Height / 2) - extent; + extent = (int)(CH_EXTENT * Gui_Scale(Window_Main.Height / 480.0f)); + tex.x = (Window_Main.Width / 2) - extent; + tex.y = (Window_Main.Height / 2) - extent; tex.Width = extent * 2; tex.Height = extent * 2; @@ -373,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); @@ -399,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 = { @@ -814,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); @@ -831,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) { @@ -1166,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 } } @@ -1485,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); @@ -1497,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) { @@ -2130,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); } diff --git a/src/Widgets.c b/src/Widgets.c index 1d50a3b0d..f0329202e 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -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; } diff --git a/src/Window.h b/src/Window.h index 02b51b33f..258c376c0 100644 --- a/src/Window.h +++ b/src/Window.h @@ -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 +#endif \ No newline at end of file diff --git a/src/Window_3DS.c b/src/Window_3DS.c index 870849e8b..d3d160413 100644 --- a/src/Window_3DS.c +++ b/src/Window_3DS.c @@ -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,28 +54,18 @@ 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) { + DisplayInfo.Width = btm_width; + Window_Main.Width = btm_width; + Window_Alt.Width = top_width; + launcherMode = true; } -void Window_Create2D(int width, int height) { - Window_3DS_SetRenderScreen(BOTTOM_SCREEN); - launcherMode = true; -} void Window_Create3D(int width, int height) { - Window_3DS_SetRenderScreen(TOP_SCREEN); - launcherMode = false; + DisplayInfo.Width = top_width; + Window_Main.Width = top_width; + Window_Alt.Width = btm_width; + launcherMode = false; } void Window_SetTitle(const cc_string* title) { } @@ -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);