From af6d0c6614c02820a4dcd722c2f9a1c012a08f5d Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Thu, 5 Dec 2019 21:36:32 +1100 Subject: [PATCH] ClassicGenScreen uses new rendering method --- src/Graphics.c | 10 +++---- src/Menus.c | 80 +++++++++++++++++++++++++++++--------------------- src/Program.c | 4 +-- src/Screens.c | 58 ++++++++++++++++++++---------------- src/Screens.h | 3 ++ 5 files changed, 89 insertions(+), 66 deletions(-) diff --git a/src/Graphics.c b/src/Graphics.c index a5b4e28d9..4dcbb4f8b 100644 --- a/src/Graphics.c +++ b/src/Graphics.c @@ -686,14 +686,14 @@ GfxResourceID Gfx_CreateDynamicVb(VertexFormat fmt, int maxVertices) { return vbuffer; } -static void D3D9_SetVbData(IDirect3DVertexBuffer9* buffer, void* data, int size, const char* lockMsg, const char* unlockMsg, int lockFlags) { +static void D3D9_SetVbData(IDirect3DVertexBuffer9* buffer, void* data, int size, int lockFlags) { void* dst = NULL; cc_result res = IDirect3DVertexBuffer9_Lock(buffer, 0, size, &dst, lockFlags); - if (res) Logger_Abort2(res, lockMsg); + if (res) Logger_Abort2(res, "D3D9_LockVb"); Mem_Copy(dst, data, size); res = IDirect3DVertexBuffer9_Unlock(buffer); - if (res) Logger_Abort2(res, unlockMsg); + if (res) Logger_Abort2(res, "D3D9_UnlockVb"); } GfxResourceID Gfx_CreateVb(void* vertices, VertexFormat fmt, int count) { @@ -710,7 +710,7 @@ GfxResourceID Gfx_CreateVb(void* vertices, VertexFormat fmt, int count) { Event_RaiseVoid(&GfxEvents.LowVRAMDetected); } - D3D9_SetVbData(vbuffer, vertices, size, "D3D9_LockVb", "D3D9_UnlockVb", 0); + D3D9_SetVbData(vbuffer, vertices, size, 0); return vbuffer; } @@ -761,7 +761,7 @@ void Gfx_SetVertexFormat(VertexFormat fmt) { void Gfx_SetDynamicVbData(GfxResourceID vb, void* vertices, int vCount) { int size = vCount * gfx_batchStride; IDirect3DVertexBuffer9* vbuffer = (IDirect3DVertexBuffer9*)vb; - D3D9_SetVbData(vbuffer, vertices, size, "D3D9_LockDynamicVbData", "D3D9_UnlockDynamicVbData", D3DLOCK_DISCARD); + D3D9_SetVbData(vbuffer, vertices, size, D3DLOCK_DISCARD); cc_result res = IDirect3DDevice9_SetStreamSource(device, 0, vbuffer, 0, gfx_batchStride); if (res) Logger_Abort2(res, "D3D9_SetDynamicVbData - Bind"); diff --git a/src/Menus.c b/src/Menus.c index b0d1b068e..a25dc9cca 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -84,17 +84,6 @@ CC_NOINLINE static void Menu_MakeBodyFont(struct FontDesc* font) { Drawer2D_Mak static void Menu_NullFunc(void* s) { } static void Menu_CloseKeyboard(void* s) { Window_CloseKeyboard(); } -static void Menu_ContextLost(void* screen) { - struct Screen* s = (struct Screen*)screen; - struct Widget** widgets = s->widgets; - int i; - - for (i = 0; i < s->numWidgets; i++) { - if (!widgets[i]) continue; - Elem_Free(widgets[i]); - } -} - static void Menu_RenderBounds(void) { /* These were sourced by taking a screenshot of vanilla Then using paint to extract the colour components @@ -408,7 +397,7 @@ static void ListScreen_Free(void* screen) { static void ListScreen_ContextLost(void* screen) { struct ListScreen* s = (struct ListScreen*)screen; - Menu_ContextLost(screen); + Screen_ContextLost(screen); Font_Free(&s->font); } @@ -453,6 +442,13 @@ static void MenuScreen_Render(void* screen, double delta) { Gfx_SetTexturing(false); } +static void MenuScreen_Render2(void* screen, double delta) { + Menu_RenderBounds(); + Gfx_SetTexturing(true); + Screen_Render2Widgets(screen, delta); + Gfx_SetTexturing(false); +} + /*########################################################################################################################* *-------------------------------------------------------PauseScreen-------------------------------------------------------* @@ -543,7 +539,7 @@ static const struct ScreenVTABLE PauseScreen_VTABLE = { PauseScreen_Init, MenuScreen_Render, PauseScreen_Free, PauseScreen_BuildMesh, MenuScreen_KeyDown, Screen_TInput, Screen_TKeyPress, Screen_TText, Menu_PointerDown, Screen_TPointer, Menu_PointerMove, Screen_TMouseScroll, - Screen_Layout, Menu_ContextLost, PauseScreen_ContextRecreated + Screen_Layout, Screen_ContextLost, PauseScreen_ContextRecreated }; void PauseScreen_Show(void) { struct PauseScreen* s = &PauseScreen_Instance; @@ -597,7 +593,7 @@ CC_NOINLINE static void OptionsGroupScreen_UpdateDesc(struct OptionsGroupScreen* static void OptionsGroupScreen_ContextLost(void* screen) { struct OptionsGroupScreen* s = (struct OptionsGroupScreen*)screen; Font_Free(&s->textFont); - Menu_ContextLost(screen); + Screen_ContextLost(screen); } static void OptionsGroupScreen_ContextRecreated(void* screen) { @@ -830,7 +826,7 @@ static void EditHotkeyScreen_ContextLost(void* screen) { struct EditHotkeyScreen* s = (struct EditHotkeyScreen*)screen; Font_Free(&s->titleFont); Font_Free(&s->textFont); - Menu_ContextLost(screen); + Screen_ContextLost(screen); } static void EditHotkeyScreen_ContextRecreated(void* screen) { @@ -1010,7 +1006,7 @@ static int GenLevelScreen_PointerDown(void* screen, int id, int x, int y) { static void GenLevelScreen_ContextLost(void* screen) { struct GenLevelScreen* s = (struct GenLevelScreen*)screen; Font_Free(&s->textFont); - Menu_ContextLost(screen); + Screen_ContextLost(screen); } static void GenLevelScreen_ContextRecreated(void* screen) { @@ -1081,14 +1077,20 @@ void GenLevelScreen_Show(void) { static struct ClassicGenScreen { Screen_Body struct ButtonWidget buttons[3], cancel; -} ClassicGenScreen_Instance; +} ClassicGenScreen; + +static struct Widget* classicgen_widgets[4] = { + (struct Widget*)&ClassicGenScreen.buttons[0], (struct Widget*)&ClassicGenScreen.buttons[1], + (struct Widget*)&ClassicGenScreen.buttons[2], (struct Widget*)&ClassicGenScreen.cancel +}; +#define CLASSICGEN_MAX_VERTICES (4 * BUTTONWIDGET_MAX) static void ClassicGenScreen_Gen(int size) { RNGState rnd; Random_SeedFromCurrentTime(&rnd); Gen_Vanilla = true; Gen_Seed = Random_Next(&rnd, Int32_MaxValue); - Gui_Remove((struct Screen*)&ClassicGenScreen_Instance); + Gui_Remove((struct Screen*)&ClassicGenScreen); Menu_BeginGen(size, 64, size); } @@ -1097,12 +1099,13 @@ static void ClassicGenScreen_Medium(void* a, void* b) { ClassicGenScreen_Gen(256 static void ClassicGenScreen_Huge(void* a, void* b) { ClassicGenScreen_Gen(512); } static void ClassicGenScreen_Make(struct ClassicGenScreen* s, int i, int y, Widget_LeftClick onClick) { - Menu_Button(s, i, &s->buttons[i], 400, onClick, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, y); + ButtonWidget_Make(&s->buttons[i], 400, onClick, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, y); } static void ClassicGenScreen_ContextRecreated(void* screen) { struct ClassicGenScreen* s = (struct ClassicGenScreen*)screen; struct FontDesc titleFont; + s->vb = Gfx_CreateDynamicVb(VERTEX_FORMAT_P3FT2FC4B, CLASSICGEN_MAX_VERTICES); Menu_MakeTitleFont(&titleFont); ButtonWidget_SetConst(&s->buttons[0], "Small", &titleFont); @@ -1112,13 +1115,22 @@ static void ClassicGenScreen_ContextRecreated(void* screen) { Font_Free(&titleFont); } -static void ClassicGenScreen_BuildMesh(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->buttons[0], &ptr); + Widget_BuildMesh(&s->buttons[1], &ptr); + Widget_BuildMesh(&s->buttons[2], &ptr); + Widget_BuildMesh(&s->cancel, &ptr); + Gfx_SetDynamicVbData(s->vb, vertices, CLASSICGEN_MAX_VERTICES); +} static void ClassicGenScreen_Init(void* screen) { - static struct Widget* widgets[4]; struct ClassicGenScreen* s = (struct ClassicGenScreen*)screen; - s->widgets = widgets; - s->numWidgets = Array_Elems(widgets); + s->widgets = classicgen_widgets; + s->numWidgets = Array_Elems(classicgen_widgets); ClassicGenScreen_Make(s, 0, -100, ClassicGenScreen_Small); ClassicGenScreen_Make(s, 1, -50, ClassicGenScreen_Medium); @@ -1128,16 +1140,16 @@ static void ClassicGenScreen_Init(void* screen) { } static const struct ScreenVTABLE ClassicGenScreen_VTABLE = { - ClassicGenScreen_Init, MenuScreen_Render, Menu_NullFunc, ClassicGenScreen_BuildMesh, + ClassicGenScreen_Init, MenuScreen_Render2, Menu_NullFunc, ClassicGenScreen_BuildMesh, MenuScreen_KeyDown, Screen_TInput, Screen_TKeyPress, Screen_TText, Menu_PointerDown, Screen_TPointer, Menu_PointerMove, Screen_TMouseScroll, - Screen_Layout, Menu_ContextLost, ClassicGenScreen_ContextRecreated + Screen_Layout, Screen_ContextLost, ClassicGenScreen_ContextRecreated }; void ClassicGenScreen_Show(void) { - struct ClassicGenScreen* s = &ClassicGenScreen_Instance; + struct ClassicGenScreen* s = &ClassicGenScreen; s->grabsInput = true; s->closable = true; - s->VTABLE = &ClassicGenScreen_VTABLE; + s->VTABLE = &ClassicGenScreen_VTABLE; Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); } @@ -1348,7 +1360,7 @@ static void SaveLevelScreen_ContextLost(void* screen) { struct SaveLevelScreen* s = (struct SaveLevelScreen*)screen; Font_Free(&s->titleFont); Font_Free(&s->textFont); - Menu_ContextLost(screen); + Screen_ContextLost(screen); } static void SaveLevelScreen_ContextRecreated(void* screen) { @@ -1687,7 +1699,7 @@ static int KeyBindingsScreen_KeyDown(void* screen, int key) { static void KeyBindingsScreen_ContextLost(void* screen) { struct KeyBindingsScreen* s = (struct KeyBindingsScreen*)screen; Font_Free(&s->titleFont); - Menu_ContextLost(screen); + Screen_ContextLost(screen); } static void KeyBindingsScreen_ContextRecreated(void* screen) { @@ -2189,7 +2201,7 @@ static void MenuOptionsScreen_ContextLost(void* screen) { struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; Font_Free(&s->titleFont); Font_Free(&s->textFont); - Menu_ContextLost(s); + Screen_ContextLost(s); Elem_Free(&s->extHelp); } @@ -2919,7 +2931,7 @@ static struct TexIdsOverlay { static void TexIdsOverlay_ContextLost(void* screen) { struct TexIdsOverlay* s = (struct TexIdsOverlay*)screen; - Menu_ContextLost(s); + Screen_ContextLost(s); Gfx_DeleteVb(&s->dynamicVb); TextAtlas_Free(&s->idAtlas); } @@ -3125,7 +3137,7 @@ 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, - Screen_Layout, Menu_ContextLost, UrlWarningOverlay_ContextRecreated + Screen_Layout, Screen_ContextLost, UrlWarningOverlay_ContextRecreated }; void UrlWarningOverlay_Show(const String* url) { struct UrlWarningOverlay* s = &UrlWarningOverlay_Instance; @@ -3225,7 +3237,7 @@ static void TexPackOverlay_Render(void* screen, double delta) { static void TexPackOverlay_ContextLost(void* screen) { struct TexPackOverlay* s = (struct TexPackOverlay*)screen; Font_Free(&s->textFont); - Menu_ContextLost(screen); + Screen_ContextLost(screen); } static void TexPackOverlay_ContextRecreated(void* screen) { @@ -3359,7 +3371,7 @@ static const struct ScreenVTABLE TouchMoreOverlay_VTABLE = { TouchMoreOverlay_Init, MenuScreen_Render, Menu_NullFunc, Screen_TInput, Screen_TInput, Screen_TKeyPress, Screen_TText, Menu_PointerDown, Screen_TPointer, Menu_PointerMove, Screen_TMouseScroll, - Screen_Layout, Menu_ContextLost, TouchMoreOverlay_ContextRecreated + Screen_Layout, Screen_ContextLost, TouchMoreOverlay_ContextRecreated }; void TouchMoreOverlay_Show(void) { struct TouchMoreOverlay* s = &TouchMoreOverlay_Instance; diff --git a/src/Program.c b/src/Program.c index 786def20d..ef0ff25ab 100644 --- a/src/Program.c +++ b/src/Program.c @@ -106,8 +106,8 @@ static int Program_Run(int argc, char** argv) { int argsCount = Platform_GetCommandLineArgs(argc, argv, args); #ifdef _MSC_VER /* NOTE: Make sure to comment this out before pushing a commit */ - String rawArgs = String_FromConst("UnknownShadow200 fffff 127.0.0.1 25565"); - //String rawArgs = String_FromConst("UnknownShadow200"); + //String rawArgs = String_FromConst("UnknownShadow200 fffff 127.0.0.1 25565"); + String rawArgs = String_FromConst("UnknownShadow200"); argsCount = String_UNSAFE_Split(&rawArgs, ' ', args, 4); #endif diff --git a/src/Screens.c b/src/Screens.c index d439cc267..c3494aa12 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -84,6 +84,18 @@ void Screen_Layout(void* screen) { } } +void Screen_ContextLost(void* screen) { + struct Screen* s = (struct Screen*)screen; + struct Widget** widgets = s->widgets; + int i; + Gfx_DeleteVb(&s->vb); + + for (i = 0; i < s->numWidgets; i++) { + if (!widgets[i]) continue; + Elem_Free(widgets[i]); + } +} + /*########################################################################################################################* *--------------------------------------------------------HUDScreen--------------------------------------------------------* @@ -1079,7 +1091,7 @@ static struct LoadingScreen { char _titleBuffer[STRING_SIZE]; char _messageBuffer[STRING_SIZE]; -} LoadingScreen_Instance; +} LoadingScreen; static void LoadingScreen_SetTitle(struct LoadingScreen* s) { TextWidget_Set(&s->title, &s->titleStr, &s->font); @@ -1201,7 +1213,7 @@ static void LoadingScreen_Free(void* screen) { } CC_NOINLINE static void LoadingScreen_ShowCommon(const String* title, const String* message) { - struct LoadingScreen* s = &LoadingScreen_Instance; + struct LoadingScreen* s = &LoadingScreen; s->lastState = NULL; s->progress = 0.0f; @@ -1223,10 +1235,10 @@ static const struct ScreenVTABLE LoadingScreen_VTABLE = { LoadingScreen_Layout, LoadingScreen_ContextLost, LoadingScreen_ContextRecreated }; void LoadingScreen_Show(const String* title, const String* message) { - LoadingScreen_Instance.VTABLE = &LoadingScreen_VTABLE; + LoadingScreen.VTABLE = &LoadingScreen_VTABLE; LoadingScreen_ShowCommon(title, message); } -struct Screen* LoadingScreen_UNSAFE_RawPointer = (struct Screen*)&LoadingScreen_Instance; +struct Screen* LoadingScreen_UNSAFE_RawPointer = (struct Screen*)&LoadingScreen; /*########################################################################################################################* @@ -1253,7 +1265,7 @@ static void GeneratingScreen_EndGeneration(void) { struct LocationUpdate update; float x, z; - Gui_Remove((struct Screen*)&LoadingScreen_Instance); + Gui_Remove((struct Screen*)&LoadingScreen); Gen_Done = false; if (!Gen_Blocks) { Chat_AddRaw("&cFailed to generate the map."); return; } @@ -1296,7 +1308,7 @@ void GeneratingScreen_Show(void) { static const String title = String_FromConst("Generating level"); static const String message = String_FromConst("Generating.."); - LoadingScreen_Instance.VTABLE = &GeneratingScreen_VTABLE; + LoadingScreen.VTABLE = &GeneratingScreen_VTABLE; LoadingScreen_ShowCommon(&title, &message); } @@ -1316,10 +1328,16 @@ static struct DisconnectScreen { char _titleBuffer[STRING_SIZE]; char _messageBuffer[STRING_SIZE]; String titleStr, messageStr; -} DisconnectScreen_Instance; -#define DISCONNECTSCREEN_MAX_VERTICES (BUTTONWIDGET_MAX + 2 * TEXTWIDGET_MAX) +} DisconnectScreen; +static struct Widget* disconnect_widgets[3] = { + (struct Widget*)&DisconnectScreen.title, + (struct Widget*)&DisconnectScreen.message, + (struct Widget*)&DisconnectScreen.reconnect +}; +#define DISCONNECT_MAX_VERTICES (BUTTONWIDGET_MAX + 2 * TEXTWIDGET_MAX) #define DISCONNECT_DELAY_MS 5000 + static void DisconnectScreen_ReconnectMessage(struct DisconnectScreen* s, String* msg) { if (s->canReconnect) { int elapsedMS = (int)(DateTime_CurrentUTC_MS() - s->initTime); @@ -1355,18 +1373,13 @@ static void DisconnectScreen_ContextLost(void* screen) { struct DisconnectScreen* s = (struct DisconnectScreen*)screen; Font_Free(&s->titleFont); Font_Free(&s->messageFont); - Gfx_DeleteVb(&s->vb); - - if (!s->title.VTABLE) return; - Elem_Free(&s->title); - Elem_Free(&s->message); - Elem_Free(&s->reconnect); + Screen_ContextLost(screen); } static void DisconnectScreen_ContextRecreated(void* screen) { String msg; char msgBuffer[STRING_SIZE]; struct DisconnectScreen* s = (struct DisconnectScreen*)screen; - s->vb = Gfx_CreateDynamicVb(VERTEX_FORMAT_P3FT2FC4B, DISCONNECTSCREEN_MAX_VERTICES); + s->vb = Gfx_CreateDynamicVb(VERTEX_FORMAT_P3FT2FC4B, DISCONNECT_MAX_VERTICES); Drawer2D_MakeFont(&s->titleFont, 16, FONT_STYLE_BOLD); Drawer2D_MakeFont(&s->messageFont, 16, FONT_STYLE_NORMAL); @@ -1380,13 +1393,13 @@ static void DisconnectScreen_ContextRecreated(void* screen) { static void DisconnectScreen_BuildMesh(void* screen) { struct DisconnectScreen* s = (struct DisconnectScreen*)screen; - VertexP3fT2fC4b vertices[DISCONNECTSCREEN_MAX_VERTICES]; + VertexP3fT2fC4b vertices[DISCONNECT_MAX_VERTICES]; VertexP3fT2fC4b* ptr = vertices; Widget_BuildMesh(&s->title, &ptr); Widget_BuildMesh(&s->message, &ptr); Widget_BuildMesh(&s->reconnect, &ptr); - Gfx_SetDynamicVbData(s->vb, vertices, DISCONNECTSCREEN_MAX_VERTICES); + Gfx_SetDynamicVbData(s->vb, vertices, DISCONNECT_MAX_VERTICES); } static void DisconnectScreen_Init(void* screen) { @@ -1405,13 +1418,8 @@ static void DisconnectScreen_Init(void* screen) { s->initTime = DateTime_CurrentUTC_MS(); s->lastSecsLeft = DISCONNECT_DELAY_MS / MILLIS_PER_SEC; - - /* TODO: static init */ - s->widgets = widgets; - s->widgets[0] = &s->title; - s->widgets[1] = &s->message; - s->widgets[2] = &s->reconnect; - s->numWidgets = s->canReconnect ? 3 : 2; + s->widgets = disconnect_widgets; + s->numWidgets = s->canReconnect ? 3 : 2; } static void DisconnectScreen_Render(void* screen, double delta) { @@ -1463,7 +1471,7 @@ void DisconnectScreen_Show(const String* title, const String* message) { static const String kick = String_FromConst("Kicked "); static const String ban = String_FromConst("Banned "); String why; char whyBuffer[STRING_SIZE]; - struct DisconnectScreen* s = &DisconnectScreen_Instance; + struct DisconnectScreen* s = &DisconnectScreen; s->grabsInput = true; s->blocksWorld = true; diff --git a/src/Screens.h b/src/Screens.h index 18a3621e3..8e9007b1b 100644 --- a/src/Screens.h +++ b/src/Screens.h @@ -27,6 +27,9 @@ void Screen_RenderWidgets(void* screen, double delta); void Screen_Render2Widgets(void* screen, double delta); /* Calls Widget_Layout on each widget in the screen. */ 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); void InventoryScreen_Show(void); void HUDScreen_Show(void);