diff --git a/src/Gui.h b/src/Gui.h index ba370db0c..5fd8eee37 100644 --- a/src/Gui.h +++ b/src/Gui.h @@ -74,7 +74,7 @@ struct ScreenVTABLE { cc_bool blocksWorld; /* Whether this screen completely and opaquely covers the game world behind it. */ \ cc_bool closable; /* Whether this screen is automatically closed when pressing Escape */ \ cc_bool dirty; /* Whether this screens needs to have its mesh rebuilt. */ \ - GfxResourceID vb; struct Widget** widgets; int numWidgets; + int maxVertices; GfxResourceID vb; struct Widget** widgets; int numWidgets; /* Represents a container of widgets and other 2D elements. May cover entire window. */ struct Screen { Screen_Body }; diff --git a/src/Menus.c b/src/Menus.c index 1c58015da..772e15da7 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -376,6 +376,7 @@ static void ListScreen_Init(void* screen) { s->numWidgets = Array_Elems(list_widgets); s->wheelAcc = 0.0f; s->currentIndex = 0; + s->maxVertices = LIST_MAX_VERTICES; for (i = 0; i < LIST_SCREEN_ITEMS; i++) { ButtonWidget_Make(&s->btns[i], 300, s->EntryClick, @@ -414,7 +415,7 @@ static void ListScreen_ContextLost(void* screen) { static void ListScreen_ContextRecreated(void* screen) { struct ListScreen* s = (struct ListScreen*)screen; - s->vb = Gfx_CreateDynamicVb(VERTEX_FORMAT_P3FT2FC4B, LIST_MAX_VERTICES); + Screen_CreateVb(screen); Menu_MakeTitleFont(&s->font); ListScreen_RedrawEntries(s); @@ -425,26 +426,18 @@ static void ListScreen_ContextRecreated(void* screen) { ListScreen_UpdatePage(s); } -static void ListScreen_BuildMesh(void* screen) { - struct Screen* s = (struct Screen*)screen; - VertexP3fT2fC4b vertices[LIST_MAX_VERTICES]; - - Screen_BuildMesh(screen, vertices); - Gfx_SetDynamicVbData(s->vb, vertices, LIST_MAX_VERTICES); -} - static const struct ScreenVTABLE ListScreen_VTABLE = { ListScreen_Init, Screen_NullUpdate, ListScreen_Free, - ListScreen_Render, ListScreen_BuildMesh, + ListScreen_Render, Screen_BuildMesh, ListScreen_KeyDown, Screen_TInput, Screen_TKeyPress, Screen_TText, Menu_PointerDown, Screen_TPointer, Menu_PointerMove, ListScreen_MouseScroll, Screen_Layout, ListScreen_ContextLost, ListScreen_ContextRecreated }; void ListScreen_Show(void) { struct ListScreen* s = &ListScreen; - s->grabsInput = true; - s->closable = true; - s->VTABLE = &ListScreen_VTABLE; + s->grabsInput = true; + s->closable = true; + s->VTABLE = &ListScreen_VTABLE; Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); } @@ -627,7 +620,7 @@ static void OptionsGroupScreen_ContextLost(void* screen) { static void OptionsGroupScreen_ContextRecreated(void* screen) { struct OptionsGroupScreen* s = (struct OptionsGroupScreen*)screen; struct FontDesc titleFont; - s->vb = Gfx_CreateDynamicVb(VERTEX_FORMAT_P3FT2FC4B, OPTGROUPS_MAX_VERTICES); + Screen_CreateVb(screen); Menu_MakeTitleFont(&titleFont); Menu_MakeBodyFont(&s->textFont); @@ -640,21 +633,14 @@ static void OptionsGroupScreen_ContextRecreated(void* screen) { Font_Free(&titleFont); } -static void OptionsGroupScreen_BuildMesh(void* screen) { - struct Screen* s = (struct Screen*)screen; - VertexP3fT2fC4b vertices[OPTGROUPS_MAX_VERTICES]; - - Screen_BuildMesh(screen, vertices); - Gfx_SetDynamicVbData(s->vb, vertices, OPTGROUPS_MAX_VERTICES); -} - static void OptionsGroupScreen_Init(void* screen) { struct OptionsGroupScreen* s = (struct OptionsGroupScreen*)screen; Event_RegisterVoid(&UserEvents.HackPermissionsChanged, s, OptionsGroupScreen_CheckHacksAllowed); - s->widgets = optGroups_widgets; - s->numWidgets = Array_Elems(optGroups_widgets); - s->selectedI = -1; + s->widgets = optGroups_widgets; + s->numWidgets = Array_Elems(optGroups_widgets); + s->selectedI = -1; + s->maxVertices = OPTGROUPS_MAX_VERTICES; Menu_Buttons(s, s->btns, 300, optsGroup_btns, 7); TextWidget_Make(&s->desc, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 100); @@ -679,7 +665,7 @@ static int OptionsGroupScreen_PointerMove(void* screen, int id, int x, int y) { static const struct ScreenVTABLE OptionsGroupScreen_VTABLE = { OptionsGroupScreen_Init, Screen_NullUpdate, OptionsGroupScreen_Free, - MenuScreen_Render2, OptionsGroupScreen_BuildMesh, + MenuScreen_Render2, Screen_BuildMesh, Screen_InputDown, Screen_TInput, Screen_TKeyPress, Screen_TText, Menu_PointerDown, Screen_TPointer, OptionsGroupScreen_PointerMove, Screen_TMouseScroll, Screen_Layout, OptionsGroupScreen_ContextLost, OptionsGroupScreen_ContextRecreated @@ -1139,7 +1125,7 @@ static void ClassicGenScreen_Huge(void* a, void* b) { ClassicGenScreen_Gen(512 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); + Screen_CreateVb(screen); Menu_MakeTitleFont(&titleFont); ButtonWidget_SetConst(&s->btns[0], "Small", &titleFont); @@ -1149,22 +1135,15 @@ static void ClassicGenScreen_ContextRecreated(void* screen) { Font_Free(&titleFont); } -static void ClassicGenScreen_BuildMesh(void* screen) { - struct Screen* s = (struct Screen*)screen; - VertexP3fT2fC4b vertices[CLASSICGEN_MAX_VERTICES]; - - Screen_BuildMesh(screen, vertices); - Gfx_SetDynamicVbData(s->vb, vertices, CLASSICGEN_MAX_VERTICES); -} - static void ClassicGenScreen_Make(struct ClassicGenScreen* s, int i, int y, Widget_LeftClick onClick) { ButtonWidget_Make(&s->btns[i], 400, onClick, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, y); } static void ClassicGenScreen_Init(void* screen) { struct ClassicGenScreen* s = (struct ClassicGenScreen*)screen; - s->widgets = classicgen_widgets; - s->numWidgets = Array_Elems(classicgen_widgets); + s->widgets = classicgen_widgets; + s->numWidgets = Array_Elems(classicgen_widgets); + s->maxVertices = CLASSICGEN_MAX_VERTICES; ClassicGenScreen_Make(s, 0, -100, ClassicGenScreen_Small); ClassicGenScreen_Make(s, 1, -50, ClassicGenScreen_Medium); @@ -1175,7 +1154,7 @@ static void ClassicGenScreen_Init(void* screen) { static const struct ScreenVTABLE ClassicGenScreen_VTABLE = { ClassicGenScreen_Init, Screen_NullUpdate, Screen_NullFunc, - MenuScreen_Render2, ClassicGenScreen_BuildMesh, + MenuScreen_Render2, Screen_BuildMesh, Screen_InputDown, Screen_TInput, Screen_TKeyPress, Screen_TText, Menu_PointerDown, Screen_TPointer, Menu_PointerMove, Screen_TMouseScroll, Screen_Layout, Screen_ContextLost, ClassicGenScreen_ContextRecreated @@ -3139,7 +3118,7 @@ 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); + Screen_CreateVb(screen); Menu_MakeTitleFont(&titleFont); Menu_MakeBodyFont(&textFont); @@ -3155,18 +3134,11 @@ static void UrlWarningOverlay_ContextRecreated(void* screen) { Font_Free(&textFont); } -static void UrlWarningOverlay_BuildMesh(void* screen) { - struct Screen* s = (struct Screen*)screen; - VertexP3fT2fC4b vertices[URLWARNING_MAX_VERTICES]; - - Screen_BuildMesh(screen, vertices); - Gfx_SetDynamicVbData(s->vb, vertices, URLWARNING_MAX_VERTICES); -} - static void UrlWarningOverlay_Init(void* screen) { struct UrlWarningOverlay* s = (struct UrlWarningOverlay*)screen; - s->widgets = urlwarning_widgets; - s->numWidgets = Array_Elems(urlwarning_widgets); + s->widgets = urlwarning_widgets; + s->numWidgets = Array_Elems(urlwarning_widgets); + s->maxVertices = URLWARNING_MAX_VERTICES; Overlay_MakeLabels(s->lbls); Overlay_MakeMainButtons(s->btns); @@ -3176,7 +3148,7 @@ static void UrlWarningOverlay_Init(void* screen) { static const struct ScreenVTABLE UrlWarningOverlay_VTABLE = { UrlWarningOverlay_Init, Screen_NullUpdate, Screen_NullFunc, - MenuScreen_Render2, UrlWarningOverlay_BuildMesh, + MenuScreen_Render2, Screen_BuildMesh, Screen_InputDown, Screen_TInput, Screen_TKeyPress, Screen_TText, Menu_PointerDown, Screen_TPointer, Menu_PointerMove, Screen_TMouseScroll, Screen_Layout, Screen_ContextLost, UrlWarningOverlay_ContextRecreated @@ -3295,7 +3267,7 @@ static void TexPackOverlay_ContextLost(void* screen) { static void TexPackOverlay_ContextRecreated(void* screen) { struct TexPackOverlay* s = (struct TexPackOverlay*)screen; struct FontDesc titleFont; - s->vb = Gfx_CreateDynamicVb(VERTEX_FORMAT_P3FT2FC4B, TEXPACK_MAX_VERTICES); + Screen_CreateVb(screen); Menu_MakeTitleFont(&titleFont); Menu_MakeBodyFont(&s->textFont); @@ -3323,18 +3295,11 @@ static void TexPackOverlay_ContextRecreated(void* screen) { Font_Free(&titleFont); } -static void TexPackOverlay_BuildMesh(void* screen) { - struct Screen* s = (struct Screen*)screen; - VertexP3fT2fC4b vertices[TEXPACK_MAX_VERTICES]; - - Screen_BuildMesh(screen, vertices); - Gfx_SetDynamicVbData(s->vb, vertices, TEXPACK_MAX_VERTICES); -} - static void TexPackOverlay_Init(void* screen) { struct TexPackOverlay* s = (struct TexPackOverlay*)screen; - s->widgets = texpack_widgets; - s->numWidgets = Array_Elems(texpack_widgets); + s->widgets = texpack_widgets; + s->numWidgets = Array_Elems(texpack_widgets); + s->maxVertices = TEXPACK_MAX_VERTICES; s->contentLength = 0; s->deny = false; @@ -3349,7 +3314,7 @@ static void TexPackOverlay_Init(void* screen) { static const struct ScreenVTABLE TexPackOverlay_VTABLE = { TexPackOverlay_Init, TexPackOverlay_Update, Screen_NullFunc, - MenuScreen_Render2, TexPackOverlay_BuildMesh, + MenuScreen_Render2, Screen_BuildMesh, Screen_InputDown, Screen_TInput, Screen_TKeyPress, Screen_TText, Menu_PointerDown, Screen_TPointer, Menu_PointerMove, Screen_TMouseScroll, Screen_Layout, TexPackOverlay_ContextLost, TexPackOverlay_ContextRecreated diff --git a/src/Particle.c b/src/Particle.c index 126b71645..c173be97f 100644 --- a/src/Particle.c +++ b/src/Particle.c @@ -168,7 +168,7 @@ static void Rain_Render(float t) { int i; if (!rain_count) return; - data = Gfx_LockDynamicVb(Particles_VB, VERTEX_FORMAT_P3FT2FC4B, rain_count * 4); + data = (VertexP3fT2fC4b*)Gfx_LockDynamicVb(Particles_VB, VERTEX_FORMAT_P3FT2FC4B, rain_count * 4); for (i = 0; i < rain_count; i++) { RainParticle_Render(&rain_Particles[i], t, data); data += 4; @@ -260,7 +260,7 @@ static void Terrain_Render(float t) { int i, index; if (!terrain_count) return; - data = Gfx_LockDynamicVb(Particles_VB, VERTEX_FORMAT_P3FT2FC4B, terrain_count * 4); + data = (VertexP3fT2fC4b*)Gfx_LockDynamicVb(Particles_VB, VERTEX_FORMAT_P3FT2FC4B, terrain_count * 4); Terrain_Update1DCounts(); for (i = 0; i < terrain_count; i++) { index = Atlas1D_Index(terrain_particles[i].texLoc); diff --git a/src/Screens.c b/src/Screens.c index f94c54267..fd55da8f1 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -99,16 +99,26 @@ void Screen_ContextLost(void* screen) { } } -void Screen_BuildMesh(void* screen, VertexP3fT2fC4b* vertices) { +void Screen_CreateVb(void* screen) { + struct Screen* s = (struct Screen*)screen; + s->vb = Gfx_CreateDynamicVb(VERTEX_FORMAT_P3FT2FC4B, s->maxVertices); +} + +void Screen_BuildMesh(void* screen) { struct Screen* s = (struct Screen*)screen; struct Widget** widgets = s->widgets; - VertexP3fT2fC4b** ptr = &vertices; + VertexP3fT2fC4b* data; + VertexP3fT2fC4b** ptr; int i; + data = (VertexP3fT2fC4b*)Gfx_LockDynamicVb(s->vb, VERTEX_FORMAT_P3FT2FC4B, s->maxVertices); + ptr = &data; + for (i = 0; i < s->numWidgets; i++) { if (!widgets[i]) continue; Widget_BuildMesh(widgets[i], ptr); } + Gfx_UnlockDynamicVb(s->vb); } @@ -1468,7 +1478,7 @@ static void DisconnectScreen_ContextLost(void* 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, DISCONNECT_MAX_VERTICES); + Screen_CreateVb(screen); Drawer2D_MakeFont(&s->titleFont, 16, FONT_STYLE_BOLD); Drawer2D_MakeFont(&s->messageFont, 16, FONT_STYLE_NORMAL); @@ -1480,14 +1490,6 @@ static void DisconnectScreen_ContextRecreated(void* screen) { ButtonWidget_Set(&s->reconnect, &msg, &s->titleFont); } -static void DisconnectScreen_BuildMesh(void* screen) { - struct Screen* s = (struct Screen*)screen; - VertexP3fT2fC4b vertices[DISCONNECT_MAX_VERTICES]; - - Screen_BuildMesh(screen, vertices); - Gfx_SetDynamicVbData(s->vb, vertices, DISCONNECT_MAX_VERTICES); -} - static void DisconnectScreen_Init(void* screen) { struct DisconnectScreen* s = (struct DisconnectScreen*)screen; @@ -1497,6 +1499,7 @@ static void DisconnectScreen_Init(void* screen) { ButtonWidget_Make(&s->reconnect, 300, NULL, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 80); s->reconnect.disabled = !s->canReconnect; + s->maxVertices = DISCONNECT_MAX_VERTICES; /* NOTE: changing VSync can't be done within frame, causes crash on some GPUs */ Gfx_SetFpsLimit(Game_FpsLimit == FPS_LIMIT_VSYNC, 1000 / 5.0f); @@ -1546,7 +1549,7 @@ static int DisconnectScreen_PointerMove(void* screen, int idx, int x, int y) { static const struct ScreenVTABLE DisconnectScreen_VTABLE = { DisconnectScreen_Init, DisconnectScreen_Update, DisconnectScreen_Free, - DisconnectScreen_Render, DisconnectScreen_BuildMesh, + DisconnectScreen_Render, Screen_BuildMesh, Screen_InputDown, Screen_TInput, Screen_TKeyPress, Screen_TText, DisconnectScreen_PointerDown, Screen_TPointer, DisconnectScreen_PointerMove, Screen_TMouseScroll, Screen_Layout, DisconnectScreen_ContextLost, DisconnectScreen_ContextRecreated @@ -1631,9 +1634,8 @@ static void TouchScreen_ContextRecreated(void* screen) { struct TouchScreen* s = (struct TouchScreen*)screen; const struct TouchBindDesc* desc; int i; - + Screen_CreateVb(screen); Drawer2D_MakeFont(&s->font, 16, FONT_STYLE_BOLD); - s->vb = Gfx_CreateDynamicVb(VERTEX_FORMAT_P3FT2FC4B, TOUCH_MAX_VERTICES); for (i = 0; i < s->numWidgets; i++) { desc = &touchDescs[i]; @@ -1689,21 +1691,14 @@ static int TouchScreen_PointerUp(void* screen, int id, int x, int y) { return false; } -static void TouchScreen_BuildMesh(void* screen) { - struct Screen* s = (struct Screen*)screen; - VertexP3fT2fC4b vertices[TOUCH_MAX_VERTICES]; - - Screen_BuildMesh(screen, vertices); - Gfx_SetDynamicVbData(s->vb, vertices, TOUCH_MAX_VERTICES); -} - static void TouchScreen_Init(void* screen) { struct TouchScreen* s = (struct TouchScreen*)screen; const struct TouchBindDesc* desc; int i; - s->widgets = touch_widgets; - s->numWidgets = Array_Elems(touch_widgets); + s->widgets = touch_widgets; + s->numWidgets = Array_Elems(touch_widgets); + s->maxVertices = TOUCH_MAX_VERTICES; for (i = 0; i < s->numWidgets; i++) { desc = &touchDescs[i]; @@ -1718,7 +1713,7 @@ static void TouchScreen_Init(void* screen) { static const struct ScreenVTABLE TouchScreen_VTABLE = { TouchScreen_Init, Screen_NullUpdate, Screen_NullFunc, - TouchScreen_Render, TouchScreen_BuildMesh, + TouchScreen_Render, Screen_BuildMesh, Screen_FInput, Screen_FInput, Screen_FKeyPress, Screen_FText, TouchScreen_PointerDown, TouchScreen_PointerUp, Screen_FPointer, Screen_FMouseScroll, Screen_Layout, TouchScreen_ContextLost, TouchScreen_ContextRecreated diff --git a/src/Screens.h b/src/Screens.h index 7f5939b77..9ffad6890 100644 --- a/src/Screens.h +++ b/src/Screens.h @@ -34,8 +34,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 Screen_CreateVb(void* screen); +void Screen_BuildMesh(void* screen); void InventoryScreen_Show(void); void HUDScreen_Show(void); diff --git a/src/SelectionBox.c b/src/SelectionBox.c index 22282b1cb..c7e38b0a5 100644 --- a/src/SelectionBox.c +++ b/src/SelectionBox.c @@ -189,14 +189,14 @@ void Selections_Render(void) { count = selections_count * SELECTIONS_VERTICES; Gfx_SetVertexFormat(VERTEX_FORMAT_P3FC4B); - data = Gfx_LockDynamicVb(selections_LineVB, VERTEX_FORMAT_P3FC4B, count); + data = (VertexP3fC4b*)Gfx_LockDynamicVb(selections_LineVB, VERTEX_FORMAT_P3FC4B, count); for (i = 0; i < selections_count; i++, data += SELECTIONS_VERTICES) { SelectionBox_RenderEdges(&selections_list[i], data); } Gfx_UnlockDynamicVb(selections_LineVB); Gfx_DrawVb_Lines(count); - data = Gfx_LockDynamicVb(selections_VB, VERTEX_FORMAT_P3FC4B, count); + data = (VertexP3fC4b*)Gfx_LockDynamicVb(selections_VB, VERTEX_FORMAT_P3FC4B, count); for (i = 0; i < selections_count; i++, data += SELECTIONS_VERTICES) { SelectionBox_RenderFaces(&selections_list[i], data); }