From d374e3f8438d553da6f15ad6a0d63f4f4fbb0bce Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Fri, 6 Dec 2019 20:49:12 +1100 Subject: [PATCH] UrlWarningOverlay uses new rendering method --- src/Menus.c | 82 +++++++++++++++++++++++++++------------------------ src/Screens.c | 19 ++++++++---- src/Screens.h | 4 ++- 3 files changed, 61 insertions(+), 44 deletions(-) diff --git a/src/Menus.c b/src/Menus.c index d3be49977..7807c693b 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -79,6 +79,11 @@ static void Menu_Back(void* s, int i, struct ButtonWidget* btn, Widget_LeftClick Menu_Button(s, i, btn, width, onClick, ANCHOR_CENTRE, ANCHOR_MAX, 0, 25); } +static void Menu_MakeBack(struct ButtonWidget* btn, Widget_LeftClick onClick) { + int width = Gui_ClassicMenu ? 400 : 200; + ButtonWidget_Make(btn, width, onClick, ANCHOR_CENTRE, ANCHOR_MAX, 0, 25); +} + CC_NOINLINE static void Menu_MakeTitleFont(struct FontDesc* font) { Drawer2D_MakeFont(font, 16, FONT_STYLE_BOLD); } CC_NOINLINE static void Menu_MakeBodyFont(struct FontDesc* font) { Drawer2D_MakeFont(font, 16, FONT_STYLE_NORMAL); } static void Menu_NullFunc(void* s) { } @@ -386,7 +391,7 @@ static void ListScreen_Init(void* screen) { ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -155); TextWidget_Make(&s->page, ANCHOR_CENTRE, ANCHOR_MAX, 0, 75); - Menu_Back(s, 9, &s->done, s->DoneClick); + Menu_MakeBack(&s->done, s->DoneClick); s->LoadEntries(s); } @@ -424,17 +429,8 @@ static void ListScreen_ContextRecreated(void* screen) { static void ListScreen_BuildMesh(void* screen) { struct ListScreen* s = (struct ListScreen*)screen; VertexP3fT2fC4b vertices[LIST_MAX_VERTICES]; - VertexP3fT2fC4b* ptr = vertices; - int i; - for (i = 0; i < LIST_SCREEN_ITEMS; i++) { - Widget_BuildMesh(&s->btns[i], &ptr); - } - Widget_BuildMesh(&s->left, &ptr); - Widget_BuildMesh(&s->right, &ptr); - Widget_BuildMesh(&s->title, &ptr); - Widget_BuildMesh(&s->page, &ptr); - Widget_BuildMesh(&s->done, &ptr); + Screen_BuildMesh(screen, vertices); Gfx_SetDynamicVbData(s->vb, vertices, LIST_MAX_VERTICES); } @@ -1137,12 +1133,8 @@ static void ClassicGenScreen_ContextRecreated(void* screen) { static void ClassicGenScreen_BuildMesh(void* screen) { struct ClassicGenScreen* s = (struct ClassicGenScreen*)screen; VertexP3fT2fC4b vertices[CLASSICGEN_MAX_VERTICES]; - VertexP3fT2fC4b* ptr = vertices; - Widget_BuildMesh(&s->btns[0], &ptr); - Widget_BuildMesh(&s->btns[1], &ptr); - Widget_BuildMesh(&s->btns[2], &ptr); - Widget_BuildMesh(&s->cancel, &ptr); + Screen_BuildMesh(screen, vertices); Gfx_SetDynamicVbData(s->vb, vertices, CLASSICGEN_MAX_VERTICES); } @@ -1159,7 +1151,7 @@ static void ClassicGenScreen_Init(void* screen) { ClassicGenScreen_Make(s, 1, -50, ClassicGenScreen_Medium); ClassicGenScreen_Make(s, 2, 0, ClassicGenScreen_Huge); - Menu_Back(s, 3, &s->cancel, Menu_SwitchPause); + Menu_MakeBack(&s->cancel, Menu_SwitchPause); } static const struct ScreenVTABLE ClassicGenScreen_VTABLE = { @@ -3108,10 +3100,17 @@ void TexIdsOverlay_Show(void) { static struct UrlWarningOverlay { Screen_Body String url; - struct ButtonWidget buttons[2]; - struct TextWidget labels[4]; + struct ButtonWidget btns[2]; + struct TextWidget lbls[4]; char _urlBuffer[STRING_SIZE * 4]; -} UrlWarningOverlay_Instance; +} UrlWarningOverlay; + +static struct Widget* urlwarning_widgets[6] = { + (struct Widget*)&UrlWarningOverlay.lbls[0], (struct Widget*)&UrlWarningOverlay.lbls[1], + (struct Widget*)&UrlWarningOverlay.lbls[2], (struct Widget*)&UrlWarningOverlay.lbls[3], + (struct Widget*)&UrlWarningOverlay.btns[0], (struct Widget*)&UrlWarningOverlay.btns[1] +}; +#define URLWARNING_MAX_VERTICES (4 * TEXTWIDGET_MAX + 2 * BUTTONWIDGET_MAX) static void UrlWarningOverlay_OpenUrl(void* screen, void* b) { struct UrlWarningOverlay* s = (struct UrlWarningOverlay*)screen; @@ -3128,42 +3127,49 @@ static void UrlWarningOverlay_AppendUrl(void* screen, void* b) { static void UrlWarningOverlay_ContextRecreated(void* screen) { struct UrlWarningOverlay* s = (struct UrlWarningOverlay*)screen; struct FontDesc titleFont, textFont; + s->vb = Gfx_CreateDynamicVb(VERTEX_FORMAT_P3FT2FC4B, URLWARNING_MAX_VERTICES); + Menu_MakeTitleFont(&titleFont); Menu_MakeBodyFont(&textFont); - TextWidget_SetConst(&s->labels[0], "&eAre you sure you want to open this link?", &titleFont); - TextWidget_Set(&s->labels[1], &s->url, &textFont); - TextWidget_SetConst(&s->labels[2], "Be careful - links from strangers may be websites that", &textFont); - TextWidget_SetConst(&s->labels[3], " have viruses, or things you may not want to open/see.", &textFont); + TextWidget_SetConst(&s->lbls[0], "&eAre you sure you want to open this link?", &titleFont); + TextWidget_Set(&s->lbls[1], &s->url, &textFont); + TextWidget_SetConst(&s->lbls[2], "Be careful - links from strangers may be websites that", &textFont); + TextWidget_SetConst(&s->lbls[3], " have viruses, or things you may not want to open/see.", &textFont); - ButtonWidget_SetConst(&s->buttons[0], "Yes", &titleFont); - ButtonWidget_SetConst(&s->buttons[1], "No", &titleFont); + ButtonWidget_SetConst(&s->btns[0], "Yes", &titleFont); + ButtonWidget_SetConst(&s->btns[1], "No", &titleFont); Font_Free(&titleFont); Font_Free(&textFont); } -static void UrlWarningOverlay_BuildMesh(void* screen) { } +static void UrlWarningOverlay_BuildMesh(void* screen) { + struct UrlWarningOverlay* s = (struct UrlWarningOverlay*)screen; + VertexP3fT2fC4b vertices[URLWARNING_MAX_VERTICES]; + + Screen_BuildMesh(screen, vertices); + Gfx_SetDynamicVbData(s->vb, vertices, URLWARNING_MAX_VERTICES); +} static void UrlWarningOverlay_Init(void* screen) { - static struct Widget* widgets[6]; struct UrlWarningOverlay* s = (struct UrlWarningOverlay*)screen; - s->widgets = widgets; - s->numWidgets = Array_Elems(widgets); + s->widgets = urlwarning_widgets; + s->numWidgets = Array_Elems(urlwarning_widgets); - Overlay_MakeLabels(s, s->labels); - Overlay_MakeMainButtons(s, s->buttons); - s->buttons[0].MenuClick = UrlWarningOverlay_OpenUrl; - s->buttons[1].MenuClick = UrlWarningOverlay_AppendUrl; + Overlay_MakeLabels(s, s->lbls); + Overlay_MakeMainButtons(s, s->btns); + s->btns[0].MenuClick = UrlWarningOverlay_OpenUrl; + s->btns[1].MenuClick = UrlWarningOverlay_AppendUrl; } static const struct ScreenVTABLE UrlWarningOverlay_VTABLE = { - UrlWarningOverlay_Init, MenuScreen_Render, Menu_NullFunc, UrlWarningOverlay_BuildMesh, - Screen_TInput, Screen_TInput, Screen_TKeyPress, Screen_TText, - Menu_PointerDown, Screen_TPointer, Menu_PointerMove, Screen_TMouseScroll, + UrlWarningOverlay_Init, MenuScreen_Render2, Menu_NullFunc, UrlWarningOverlay_BuildMesh, + Screen_TInput, Screen_TInput, Screen_TKeyPress, Screen_TText, + Menu_PointerDown, Screen_TPointer, Menu_PointerMove, Screen_TMouseScroll, Screen_Layout, Screen_ContextLost, UrlWarningOverlay_ContextRecreated }; void UrlWarningOverlay_Show(const String* url) { - struct UrlWarningOverlay* s = &UrlWarningOverlay_Instance; + struct UrlWarningOverlay* s = &UrlWarningOverlay; s->grabsInput = true; s->closable = true; s->VTABLE = &UrlWarningOverlay_VTABLE; diff --git a/src/Screens.c b/src/Screens.c index c3494aa12..cb3db889e 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -96,6 +96,18 @@ void Screen_ContextLost(void* screen) { } } +void Screen_BuildMesh(void* screen, VertexP3fT2fC4b* vertices) { + struct Screen* s = (struct Screen*)screen; + struct Widget** widgets = s->widgets; + VertexP3fT2fC4b** ptr = &vertices; + int i; + + for (i = 0; i < s->numWidgets; i++) { + if (!widgets[i]) continue; + Widget_BuildMesh(widgets[i], ptr); + } +} + /*########################################################################################################################* *--------------------------------------------------------HUDScreen--------------------------------------------------------* @@ -1335,7 +1347,7 @@ static struct Widget* disconnect_widgets[3] = { (struct Widget*)&DisconnectScreen.message, (struct Widget*)&DisconnectScreen.reconnect }; -#define DISCONNECT_MAX_VERTICES (BUTTONWIDGET_MAX + 2 * TEXTWIDGET_MAX) +#define DISCONNECT_MAX_VERTICES (2 * TEXTWIDGET_MAX + BUTTONWIDGET_MAX) #define DISCONNECT_DELAY_MS 5000 static void DisconnectScreen_ReconnectMessage(struct DisconnectScreen* s, String* msg) { @@ -1394,11 +1406,8 @@ static void DisconnectScreen_ContextRecreated(void* screen) { static void DisconnectScreen_BuildMesh(void* screen) { struct DisconnectScreen* s = (struct DisconnectScreen*)screen; VertexP3fT2fC4b vertices[DISCONNECT_MAX_VERTICES]; - VertexP3fT2fC4b* ptr = vertices; - Widget_BuildMesh(&s->title, &ptr); - Widget_BuildMesh(&s->message, &ptr); - Widget_BuildMesh(&s->reconnect, &ptr); + Screen_BuildMesh(screen, vertices); Gfx_SetDynamicVbData(s->vb, vertices, DISCONNECT_MAX_VERTICES); } diff --git a/src/Screens.h b/src/Screens.h index 8e9007b1b..fdcdca775 100644 --- a/src/Screens.h +++ b/src/Screens.h @@ -1,6 +1,6 @@ #ifndef CC_SCREENS_H #define CC_SCREENS_H -#include "String.h" +#include "VertexStructs.h" /* Contains all 2D non-menu screen implementations. Copyright 2014-2019 ClassiCube | Licensed under BSD-3 */ @@ -30,6 +30,8 @@ void Screen_Layout(void* screen); /* Calls Widget_Free on each widget in the screen. */ /* Also deletes the screen's vb. */ void Screen_ContextLost(void* screen); +/* Calls Widget_BuildMesh on each widget in the screen. */ +void Screen_BuildMesh(void* screen, VertexP3fT2fC4b* vertices); void InventoryScreen_Show(void); void HUDScreen_Show(void);