diff --git a/src/Commands.c b/src/Commands.c index c5d24c722..78ef4d027 100644 --- a/src/Commands.c +++ b/src/Commands.c @@ -590,7 +590,7 @@ static void BlockEditCommand_Execute(const cc_string* args, int argsCount__) { Chat_AddRaw("&eEditable block properties (page 2):"); Chat_AddRaw("&a walksound &e- Sets walk/step sound of the block"); Chat_AddRaw("&a breaksound &e- Sets break sound of the block"); - Chat_AddRaw("&a emitslight &e- Sets whether the block emits light"); + Chat_AddRaw("&a fullbright &e- Sets whether the block is fully lit"); Chat_AddRaw("&a blockslight &e- Sets whether the block stops light"); return; } @@ -670,8 +670,8 @@ static void BlockEditCommand_Execute(const cc_string* args, int argsCount__) { if (!BlockEditCommand_GetInt(value, "Sound", &v, 0, SOUND_COUNT - 1)) return; Blocks.DigSounds[block] = v; - } else if (String_CaselessEqualsConst(prop, "emitslight")) { - if (!BlockEditCommand_GetBool(value, "Emits light", &b)) return; + } else if (String_CaselessEqualsConst(prop, "fullbright")) { + if (!BlockEditCommand_GetBool(value, "Full brightness", &b)) return; Blocks.FullBright[block] = b; } else if (String_CaselessEqualsConst(prop, "blockslight")) { diff --git a/src/Gui.c b/src/Gui.c index ce1055e7c..80dc77b40 100644 --- a/src/Gui.c +++ b/src/Gui.c @@ -480,6 +480,20 @@ int Screen_Index(void* screen, void* widget) { return -1; } +int Screen_CalcDefaultMaxVertices(void* screen) { + struct Screen* s = (struct Screen*)screen; + struct Widget** widgets = s->widgets; + int i, count = 0; + + for (i = 0; i < s->numWidgets; i++) + { + if (!widgets[i]) continue; + count += widgets[i]->VTABLE->GetMaxVertices(widgets[i]); + } + return count; +} + + void Screen_BuildMesh(void* screen) { struct Screen* s = (struct Screen*)screen; struct Widget** widgets = s->widgets; diff --git a/src/Gui.h b/src/Gui.h index b0786996b..e5edce528 100644 --- a/src/Gui.h +++ b/src/Gui.h @@ -112,6 +112,7 @@ void Screen_UpdateVb(void* screen); struct VertexTextured* Screen_LockVb(void* screen); int Screen_DoPointerDown(void* screen, int id, int x, int y); int Screen_Index(void* screen, void* w); +int Screen_CalcDefaultMaxVertices(void* screen); /* Default mesh building implementation for a screen */ /* (Locks vb, calls Widget_BuildMesh on each widget, then unlocks vb) */ @@ -156,7 +157,10 @@ struct WidgetVTABLE { void (*BuildMesh)(void* elem, struct VertexTextured** vertices); /* Draws this widget on-screen. */ int (*Render2)(void* elem, int offset); + /* Returns the maximum number of vertices this widget may use */ + int (*GetMaxVertices)(void* elem); }; + #define Widget_Body const struct WidgetVTABLE* VTABLE; \ int x, y, width, height; /* Top left corner, and dimensions, of this widget */ \ cc_bool active; /* Whether this widget is currently being moused over */ \ diff --git a/src/Menus.c b/src/Menus.c index 4e82684ad..4f72d7f4e 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -258,7 +258,6 @@ static struct Widget* list_widgets[] = { (struct Widget*)&ListScreen.right, (struct Widget*)&ListScreen.title, (struct Widget*)&ListScreen.done, NULL }; -#define LIST_MAX_VERTICES (9 * BUTTONWIDGET_MAX + TEXTWIDGET_MAX) #define LISTSCREEN_EMPTY "-" static void ListScreen_Layout(void* screen) { @@ -400,7 +399,6 @@ 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_Init(&s->btns[i], 300, s->EntryClick); @@ -419,6 +417,8 @@ static void ListScreen_Init(void* screen) { ButtonWidget_Init(&s->left, 40, ListScreen_MoveBackwards); ButtonWidget_Init(&s->right, 40, ListScreen_MoveForwards); TextWidget_Init(&s->title); + + s->maxVertices = Screen_CalcDefaultMaxVertices(screen); s->LoadEntries(s); } @@ -499,7 +499,6 @@ static struct PauseScreen { struct ButtonWidget btns[PAUSE_MAX_BTNS], quit, back; struct TextWidget title; } PauseScreen; -#define PAUSE_MAX_VERTICES (TEXTWIDGET_MAX + (PAUSE_MAX_BTNS + 2) * BUTTONWIDGET_MAX) static void PauseScreenBase_Quit(void* a, void* b) { Window_Close(); } static void PauseScreenBase_Game(void* a, void* b) { Gui_Remove((struct Screen*)&PauseScreen); } @@ -513,10 +512,11 @@ static void PauseScreenBase_ContextRecreated(struct PauseScreen* s, struct FontD } static void PauseScreenBase_Init(struct PauseScreen* s, int width) { - s->maxVertices = PAUSE_MAX_VERTICES; Menu_InitButtons(s->btns, width, s->descs, s->descsCount); ButtonWidget_Init(&s->back, 400, PauseScreenBase_Game); TextWidget_Init(&s->title); + + s->maxVertices = Screen_CalcDefaultMaxVertices(s); } @@ -683,7 +683,6 @@ static struct Widget* optGroups_widgets[] = { (struct Widget*)&OptionsGroupScreen.btns[6], (struct Widget*)&OptionsGroupScreen.btns[7], (struct Widget*)&OptionsGroupScreen.desc, (struct Widget*)&OptionsGroupScreen.done }; -#define OPTGROUPS_MAX_VERTICES (8 * BUTTONWIDGET_MAX + TEXTWIDGET_MAX + BUTTONWIDGET_MAX) static const char* const optsGroup_descs[8] = { "&eMusic/Sound, view bobbing, and more", @@ -753,11 +752,12 @@ static void OptionsGroupScreen_Init(void* screen) { s->widgets = optGroups_widgets; s->numWidgets = Array_Elems(optGroups_widgets); s->selectedI = -1; - s->maxVertices = OPTGROUPS_MAX_VERTICES; Menu_InitButtons(s->btns, 300, optsGroup_btns, 8); TextWidget_Init(&s->desc); ButtonWidget_Init(&s->done, 400, Menu_SwitchPause); + + s->maxVertices = Screen_CalcDefaultMaxVertices(s); } static void OptionsGroupScreen_Free(void* screen) { @@ -805,13 +805,12 @@ static struct EditHotkeyScreen { struct ButtonWidget btns[5], cancel; } EditHotkeyScreen; -static struct Widget* edithotkey_widgets[7] = { +static struct Widget* edithotkey_widgets[] = { (struct Widget*)&EditHotkeyScreen.btns[0], (struct Widget*)&EditHotkeyScreen.btns[1], (struct Widget*)&EditHotkeyScreen.btns[2], (struct Widget*)&EditHotkeyScreen.btns[3], (struct Widget*)&EditHotkeyScreen.btns[4], (struct Widget*)&EditHotkeyScreen.input, (struct Widget*)&EditHotkeyScreen.cancel }; -#define EDITHOTKEY_MAX_VERTICES (MENUINPUTWIDGET_MAX + 6 * BUTTONWIDGET_MAX) static void HotkeyListScreen_MakeFlags(int flags, cc_string* str); static void EditHotkeyScreen_MakeFlags(int flags, cc_string* str) { @@ -1020,7 +1019,6 @@ static void EditHotkeyScreen_Init(void* screen) { s->widgets = edithotkey_widgets; s->numWidgets = Array_Elems(edithotkey_widgets); s->selectedI = -1; - s->maxVertices = EDITHOTKEY_MAX_VERTICES; MenuInput_String(desc); ButtonWidget_Init(&s->btns[0], 300, EditHotkeyScreen_BaseKey); @@ -1036,6 +1034,8 @@ static void EditHotkeyScreen_Init(void* screen) { TextInputWidget_Create(&s->input, 500, &text, &desc); ButtonWidget_Init(&s->cancel, 400, Menu_SwitchHotkeys); s->input.onscreenPlaceholder = "Hotkey text"; + + s->maxVertices = Screen_CalcDefaultMaxVertices(s); } static const struct ScreenVTABLE EditHotkeyScreen_VTABLE = { @@ -1068,7 +1068,7 @@ static struct GenLevelScreen { } GenLevelScreen; #define GENLEVEL_NUM_INPUTS 4 -static struct Widget* gen_widgets[12] = { +static struct Widget* gen_widgets[] = { (struct Widget*)&GenLevelScreen.inputs[0], (struct Widget*)&GenLevelScreen.inputs[1], (struct Widget*)&GenLevelScreen.inputs[2], (struct Widget*)&GenLevelScreen.inputs[3], (struct Widget*)&GenLevelScreen.labels[0], (struct Widget*)&GenLevelScreen.labels[1], @@ -1076,7 +1076,6 @@ static struct Widget* gen_widgets[12] = { (struct Widget*)&GenLevelScreen.title, (struct Widget*)&GenLevelScreen.flatgrass, (struct Widget*)&GenLevelScreen.vanilla, (struct Widget*)&GenLevelScreen.cancel }; -#define GEN_MAX_VERTICES (3 * BUTTONWIDGET_MAX + 4 * MENUINPUTWIDGET_MAX + 5 * TEXTWIDGET_MAX) CC_NOINLINE static int GenLevelScreen_GetInt(struct GenLevelScreen* s, int index) { struct TextInputWidget* input = &s->inputs[index]; @@ -1252,7 +1251,6 @@ static void GenLevelScreen_Init(void* screen) { s->widgets = gen_widgets; s->numWidgets = Array_Elems(gen_widgets); s->selectedI = -1; - s->maxVertices = GEN_MAX_VERTICES; GenLevelScreen_Make(s, 0, World.Width); GenLevelScreen_Make(s, 1, World.Height); @@ -1263,6 +1261,8 @@ static void GenLevelScreen_Init(void* screen) { ButtonWidget_Init(&s->flatgrass, 200, GenLevelScreen_Flatgrass); ButtonWidget_Init(&s->vanilla, 200, GenLevelScreen_Notchy); ButtonWidget_Init(&s->cancel, 400, Menu_SwitchPause); + + s->maxVertices = Screen_CalcDefaultMaxVertices(s); } static const struct ScreenVTABLE GenLevelScreen_VTABLE = { @@ -1295,7 +1295,6 @@ static struct Widget* classicgen_widgets[] = { (struct Widget*)&ClassicGenScreen.btns[0], (struct Widget*)&ClassicGenScreen.btns[1], (struct Widget*)&ClassicGenScreen.btns[2], (struct Widget*)&ClassicGenScreen.cancel }; -#define CLASSICGEN_MAX_VERTICES (TEXTWIDGET_MAX + 4 * BUTTONWIDGET_MAX) static void ClassicGenScreen_Gen(int size) { RNGState rnd; Random_SeedFromCurrentTime(&rnd); @@ -1338,13 +1337,14 @@ static void ClassicGenScreen_Init(void* screen) { struct ClassicGenScreen* s = (struct ClassicGenScreen*)screen; s->widgets = classicgen_widgets; s->numWidgets = Array_Elems(classicgen_widgets); - s->maxVertices = CLASSICGEN_MAX_VERTICES; TextWidget_Init(&s->title); ButtonWidget_Init(&s->btns[0], 400, ClassicGenScreen_Small); ButtonWidget_Init(&s->btns[1], 400, ClassicGenScreen_Medium); ButtonWidget_Init(&s->btns[2], 400, ClassicGenScreen_Huge); ButtonWidget_Init(&s->cancel, 400, Menu_SwitchPause); + + s->maxVertices = Screen_CalcDefaultMaxVertices(s); } static const struct ScreenVTABLE ClassicGenScreen_VTABLE = { @@ -1379,7 +1379,6 @@ static struct Widget* save_widgets[] = { (struct Widget*)&SaveLevelScreen.cancel, (struct Widget*)&SaveLevelScreen.input, (struct Widget*)&SaveLevelScreen.desc, }; -#define SAVE_MAX_VERTICES (3 * BUTTONWIDGET_MAX + MENUINPUTWIDGET_MAX + TEXTWIDGET_MAX) static void SaveLevelScreen_UpdateSave(struct SaveLevelScreen* s) { ButtonWidget_SetConst(&s->save, @@ -1554,7 +1553,6 @@ static void SaveLevelScreen_Init(void* screen) { s->widgets = save_widgets; s->numWidgets = Array_Elems(save_widgets); - s->maxVertices = SAVE_MAX_VERTICES; MenuInput_Path(desc); ButtonWidget_Init(&s->save, 400, SaveLevelScreen_Save); @@ -1564,6 +1562,8 @@ static void SaveLevelScreen_Init(void* screen) { TextInputWidget_Create(&s->input, 400, &World.Name, &desc); TextWidget_Init(&s->desc); s->input.onscreenPlaceholder = "Map name"; + + s->maxVertices = Screen_CalcDefaultMaxVertices(s); } static const struct ScreenVTABLE SaveLevelScreen_VTABLE = { @@ -1853,7 +1853,6 @@ static struct Widget* bindsSource_widgets[] = { (struct Widget*)&BindsSourceScreen.btns[0], (struct Widget*)&BindsSourceScreen.btns[1], (struct Widget*)&BindsSourceScreen.cancel }; -#define BINDSSOURCE_MAX_VERTICES (BUTTONWIDGET_MAX * 3) static void BindsSourceScreen_ModeNormal(void* screen, void* b) { binds_gamepad = false; @@ -1890,11 +1889,12 @@ static void BindsSourceScreen_Init(void* screen) { s->widgets = bindsSource_widgets; s->numWidgets = Array_Elems(bindsSource_widgets); s->selectedI = -1; - s->maxVertices = BINDSSOURCE_MAX_VERTICES; ButtonWidget_Init(&s->btns[0], 300, BindsSourceScreen_ModeNormal); ButtonWidget_Init(&s->btns[1], 300, BindsSourceScreen_ModeGamepad); ButtonWidget_Init(&s->cancel, 400, Menu_SwitchPause); + + s->maxVertices = Screen_CalcDefaultMaxVertices(s); } static const struct ScreenVTABLE BindsSourceScreen_VTABLE = { @@ -1947,7 +1947,6 @@ static struct KeyBindsScreen { struct ButtonWidget back, left, right; struct ButtonWidget buttons[KEYBINDS_MAX_BTNS]; } KeyBindsScreen; -#define KEYBINDS_MAX_VERTICES ((KEYBINDS_MAX_BTNS + 3) * BUTTONWIDGET_MAX + 2 * TEXTWIDGET_MAX) static struct Widget* key_widgets[KEYBINDS_MAX_BTNS + 5] = { NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL, @@ -2057,7 +2056,6 @@ static void KeyBindsScreen_Init(void* screen) { s->widgets = key_widgets; s->numWidgets = KEYBINDS_MAX_BTNS + 3; s->curI = -1; - s->maxVertices = KEYBINDS_MAX_VERTICES; for (i = 0; i < s->bindsCount; i++) { ButtonWidget_Init(&s->buttons[i], s->btnWidth, KeyBindsScreen_OnBindingClick); @@ -2074,8 +2072,10 @@ static void KeyBindsScreen_Init(void* screen) { Widget_SetDisabled(&s->left, !s->leftPage); Widget_SetDisabled(&s->right, !s->rightPage); - if (!s->leftPage && !s->rightPage) return; - s->numWidgets += 2; + if (s->leftPage || s->rightPage) + s->numWidgets += 2; + + s->maxVertices = Screen_CalcDefaultMaxVertices(s); } static const struct ScreenVTABLE KeyBindsScreen_VTABLE = { @@ -2229,11 +2229,10 @@ static struct MenuInputOverlay { cc_string value; char valueBuffer[STRING_SIZE]; } MenuInputOverlay; -static struct Widget* menuInput_widgets[3] = { +static struct Widget* menuInput_widgets[] = { (struct Widget*)&MenuInputOverlay.ok, (struct Widget*)&MenuInputOverlay.Default, (struct Widget*)&MenuInputOverlay.input }; -#define MENUINPUT_MAX_VERTICES (2 * BUTTONWIDGET_MAX + MENUINPUTWIDGET_MAX) static void MenuInputOverlay_Close(struct MenuInputOverlay* s, cc_bool valid) { Gui_Remove((struct Screen*)&MenuInputOverlay); @@ -2295,7 +2294,6 @@ static void MenuInputOverlay_Init(void* screen) { struct MenuInputOverlay* s = (struct MenuInputOverlay*)screen; s->widgets = menuInput_widgets; s->numWidgets = Array_Elems(menuInput_widgets); - s->maxVertices = MENUINPUT_MAX_VERTICES; TextInputWidget_Create(&s->input, 400, &s->value, s->desc); ButtonWidget_Init(&s->Default, 200, MenuInputOverlay_Default); @@ -2306,6 +2304,8 @@ static void MenuInputOverlay_Init(void* screen) { } else if (s->desc->VTABLE == &FloatInput_VTABLE) { s->input.onscreenType = KEYBOARD_TYPE_NUMBER; } + + s->maxVertices = Screen_CalcDefaultMaxVertices(s); } static void MenuInputOverlay_Update(void* screen, double delta) { @@ -3314,7 +3314,6 @@ static struct Widget* nostalgiaMenu_widgets[] = { (struct Widget*)&NostalgiaMenuScreen.btnA, (struct Widget*)&NostalgiaMenuScreen.btnF, (struct Widget*)&NostalgiaMenuScreen.done, (struct Widget*)&NostalgiaMenuScreen.title }; -#define NOSTALGIA_MENU_MAX_VERTICES (3 * BUTTONWIDGET_MAX + TEXTWIDGET_MAX) static void NostalgiaMenuScreen_Appearance(void* a, void* b) { NostalgiaAppearanceScreen_Show(); } static void NostalgiaMenuScreen_Functionality(void* a, void* b) { NostalgiaFunctionalityScreen_Show(); } @@ -3350,12 +3349,13 @@ static void NostalgiaMenuScreen_Init(void* screen) { s->widgets = nostalgiaMenu_widgets; s->numWidgets = Array_Elems(nostalgiaMenu_widgets); - s->maxVertices = NOSTALGIA_MENU_MAX_VERTICES; TextWidget_Init(&s->title); ButtonWidget_Init(&s->btnA, 400, NostalgiaMenuScreen_Appearance); ButtonWidget_Init(&s->btnF, 400, NostalgiaMenuScreen_Functionality); ButtonWidget_Init(&s->done, 400, NostalgiaMenuScreen_SwitchBack); + + s->maxVertices = Screen_CalcDefaultMaxVertices(s); } static const struct ScreenVTABLE NostalgiaMenuScreen_VTABLE = { @@ -3734,12 +3734,11 @@ static struct UrlWarningOverlay { char _urlBuffer[STRING_SIZE * 4]; } UrlWarningOverlay; -static struct Widget* urlwarning_widgets[6] = { +static struct Widget* urlwarning_widgets[] = { (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; @@ -3783,11 +3782,12 @@ static void UrlWarningOverlay_Init(void* screen) { struct UrlWarningOverlay* s = (struct UrlWarningOverlay*)screen; s->widgets = urlwarning_widgets; s->numWidgets = Array_Elems(urlwarning_widgets); - s->maxVertices = URLWARNING_MAX_VERTICES; Overlay_InitLabels(s->lbls); ButtonWidget_Init(&s->btns[0], 160, UrlWarningOverlay_OpenUrl); ButtonWidget_Init(&s->btns[1], 160, UrlWarningOverlay_AppendUrl); + + s->maxVertices = Screen_CalcDefaultMaxVertices(s); } static const struct ScreenVTABLE UrlWarningOverlay_VTABLE = { @@ -3830,7 +3830,6 @@ static struct Widget* texpack_widgets[] = { (struct Widget*)&TexPackOverlay.btns[0], (struct Widget*)&TexPackOverlay.btns[1], (struct Widget*)&TexPackOverlay.btns[2], (struct Widget*)&TexPackOverlay.btns[3] }; -#define TEXPACK_MAX_VERTICES (4 * TEXTWIDGET_MAX + 4 * BUTTONWIDGET_MAX) static cc_bool TexPackOverlay_IsAlways(void* screen, void* w) { return Screen_Index(screen, w) >= 6; } @@ -3957,7 +3956,6 @@ static void TexPackOverlay_Init(void* screen) { struct TexPackOverlay* s = (struct TexPackOverlay*)screen; s->widgets = texpack_widgets; s->numWidgets = Array_Elems(texpack_widgets); - s->maxVertices = TEXPACK_MAX_VERTICES; s->contentLength = 0; s->gotContent = false; @@ -3968,6 +3966,8 @@ static void TexPackOverlay_Init(void* screen) { ButtonWidget_Init(&s->btns[1], 160, NULL); ButtonWidget_Init(&s->btns[2], 160, NULL); ButtonWidget_Init(&s->btns[3], 160, NULL); + + s->maxVertices = Screen_CalcDefaultMaxVertices(s); } static const struct ScreenVTABLE TexPackOverlay_VTABLE = { diff --git a/src/Screens.c b/src/Screens.c index ed9b855e2..bcbf81f62 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -1502,7 +1502,11 @@ static struct InventoryScreen { struct TableWidget table; struct TextWidget title; cc_bool releasedInv, deferredSelect; -} InventoryScreen_Instance; +} InventoryScreen; + +static struct Widget* inventory_widgets[] = { + (struct Widget*)&InventoryScreen.title, (struct Widget*)&InventoryScreen.table +}; static void InventoryScreen_GetTitleText(cc_string* desc, BlockID block) { @@ -1531,7 +1535,7 @@ static void InventoryScreen_UpdateTitle(struct InventoryScreen* s, BlockID block } static void InventoryScreen_OnUpdateTitle(BlockID block) { - InventoryScreen_UpdateTitle(&InventoryScreen_Instance, block); + InventoryScreen_UpdateTitle(&InventoryScreen, block); } @@ -1547,12 +1551,9 @@ static void InventoryScreen_NeedRedrawing(void* screen) { static void InventoryScreen_ContextLost(void* screen) { struct InventoryScreen* s = (struct InventoryScreen*)screen; - Gfx_DeleteDynamicVb(&s->vb); - s->table.vb = 0; - Font_Free(&s->font); - Elem_Free(&s->table); - Elem_Free(&s->title); + Screen_ContextLost(s); + s->table.vb = 0; } static void InventoryScreen_ContextRecreated(void* screen) { @@ -1564,19 +1565,6 @@ static void InventoryScreen_ContextRecreated(void* screen) { TableWidget_Recreate(&s->table); } -static void InventoryScreen_BuildMesh(void* screen) { - struct InventoryScreen* s = (struct InventoryScreen*)screen; - struct VertexTextured* data; - struct VertexTextured** ptr; - - data = Screen_LockVb(s); - ptr = &data; - - Widget_BuildMesh(&s->title, ptr); - Widget_BuildMesh(&s->table, ptr); - Gfx_UnlockDynamicVb(s->vb); -} - static void InventoryScreen_MoveToSelected(struct InventoryScreen* s) { struct TableWidget* table = &s->table; TableWidget_SetBlockTo(table, Inventory_SelectedBlock); @@ -1591,7 +1579,8 @@ static void InventoryScreen_MoveToSelected(struct InventoryScreen* s) { static void InventoryScreen_Init(void* screen) { struct InventoryScreen* s = (struct InventoryScreen*)screen; - s->maxVertices = TEXTWIDGET_MAX + TABLE_MAX_VERTICES; + s->widgets = inventory_widgets; + s->numWidgets = Array_Elems(inventory_widgets); TextWidget_Init(&s->title); TableWidget_Create(&s->table, 22 * Options_GetFloat(OPT_INV_SCROLLBAR_SCALE, 0, 10, 1)); @@ -1607,6 +1596,8 @@ static void InventoryScreen_Init(void* screen) { Event_Register_(&TextureEvents.AtlasChanged, s, InventoryScreen_NeedRedrawing); Event_Register_(&BlockEvents.PermissionsChanged, s, InventoryScreen_OnBlockChanged); Event_Register_(&BlockEvents.BlockDefChanged, s, InventoryScreen_OnBlockChanged); + + s->maxVertices = Screen_CalcDefaultMaxVertices(s); } static void InventoryScreen_Free(void* screen) { @@ -1658,7 +1649,7 @@ static int InventoryScreen_KeyDown(void* screen, int key) { static cc_bool InventoryScreen_IsHotbarActive(void) { struct Screen* grabbed = Gui.InputGrab; /* Only toggle hotbar when inventory or no grab screen is open */ - return !grabbed || grabbed == (struct Screen*)&InventoryScreen_Instance; + return !grabbed || grabbed == (struct Screen*)&InventoryScreen; } static void InventoryScreen_KeyUp(void* screen, int key) { @@ -1702,13 +1693,13 @@ static int InventoryScreen_MouseScroll(void* screen, float delta) { static const struct ScreenVTABLE InventoryScreen_VTABLE = { InventoryScreen_Init, InventoryScreen_Update, InventoryScreen_Free, - InventoryScreen_Render, InventoryScreen_BuildMesh, + InventoryScreen_Render, Screen_BuildMesh, InventoryScreen_KeyDown, InventoryScreen_KeyUp, Screen_TKeyPress, Screen_TText, InventoryScreen_PointerDown, InventoryScreen_PointerUp, InventoryScreen_PointerMove, InventoryScreen_MouseScroll, InventoryScreen_Layout, InventoryScreen_ContextLost, InventoryScreen_ContextRecreated }; void InventoryScreen_Show(void) { - struct InventoryScreen* s = &InventoryScreen_Instance; + struct InventoryScreen* s = &InventoryScreen; s->grabsInput = true; s->closable = true; @@ -1734,10 +1725,9 @@ static struct LoadingScreen { char _titleBuffer[STRING_SIZE]; char _messageBuffer[STRING_SIZE]; } LoadingScreen; -#define LOADING_MAX_VERTICES (2 * TEXTWIDGET_MAX) #define LOADING_TILE_SIZE 64 -static struct Widget* loading_widgets[2] = { +static struct Widget* loading_widgets[] = { (struct Widget*)&LoadingScreen.title, (struct Widget*)&LoadingScreen.message }; @@ -1752,7 +1742,7 @@ static void LoadingScreen_SetMessage(struct LoadingScreen* s) { static void LoadingScreen_CalcMaxVertices(struct LoadingScreen* s) { s->rows = Math_CeilDiv(WindowInfo.Height, LOADING_TILE_SIZE); - s->maxVertices = LOADING_MAX_VERTICES + s->rows * 4; + s->maxVertices = Screen_CalcDefaultMaxVertices(s) + s->rows * 4; } static void LoadingScreen_Layout(void* screen) { @@ -1980,7 +1970,6 @@ static struct Widget* disconnect_widgets[] = { (struct Widget*)&DisconnectScreen.reconnect, (struct Widget*)&DisconnectScreen.quit }; -#define DISCONNECT_MAX_VERTICES (2 * TEXTWIDGET_MAX + 2 * BUTTONWIDGET_MAX) #define DISCONNECT_DELAY_SECS 5 static void DisconnectScreen_Layout(void* screen) { @@ -2039,8 +2028,6 @@ static void DisconnectScreen_OnQuit(void* s, void* w) { Window_Close(); } static void DisconnectScreen_Init(void* screen) { struct DisconnectScreen* s = (struct DisconnectScreen*)screen; - s->maxVertices = DISCONNECT_MAX_VERTICES; - TextWidget_Init(&s->title); TextWidget_Init(&s->message); @@ -2055,6 +2042,7 @@ static void DisconnectScreen_Init(void* screen) { s->lastSecsLeft = DISCONNECT_DELAY_SECS; s->widgets = disconnect_widgets; s->numWidgets = Array_Elems(disconnect_widgets); + s->maxVertices = Screen_CalcDefaultMaxVertices(s); } static void DisconnectScreen_Update(void* screen, double delta) { diff --git a/src/Widgets.c b/src/Widgets.c index 9c0dfe269..01ba93ea9 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -59,11 +59,13 @@ static int TextWidget_Render2(void* widget, int offset) { return offset + 4; } +static int TextWidget_MaxVertices(void* widget) { return TEXTWIDGET_MAX; } + static const struct WidgetVTABLE TextWidget_VTABLE = { TextWidget_Render, TextWidget_Free, TextWidget_Reposition, Widget_InputDown, Widget_InputUp, Widget_MouseScroll, Widget_Pointer, Widget_PointerUp, Widget_PointerMove, - TextWidget_BuildMesh, TextWidget_Render2 + TextWidget_BuildMesh, TextWidget_Render2, TextWidget_MaxVertices }; void TextWidget_Init(struct TextWidget* w) { Widget_Reset(w); @@ -209,11 +211,13 @@ static int ButtonWidget_Render2(void* widget, int offset) { return offset + 12; } +static int ButtonWidget_MaxVertices(void* widget) { return BUTTONWIDGET_MAX; } + static const struct WidgetVTABLE ButtonWidget_VTABLE = { ButtonWidget_Render, ButtonWidget_Free, ButtonWidget_Reposition, Widget_InputDown, Widget_InputUp, Widget_MouseScroll, Widget_Pointer, Widget_PointerUp, Widget_PointerMove, - ButtonWidget_BuildMesh, ButtonWidget_Render2 + ButtonWidget_BuildMesh, ButtonWidget_Render2, ButtonWidget_MaxVertices }; void ButtonWidget_Make(struct ButtonWidget* w, int minWidth, Widget_LeftClick onClick, cc_uint8 horAnchor, cc_uint8 verAnchor, int xOffset, int yOffset) { ButtonWidget_Init(w, minWidth, onClick); @@ -456,6 +460,8 @@ static int HotbarWidget_Render2(void* widget, int offset) { return HOTBAR_MAX_VERTICES; } +static int HotbarWidget_MaxVertices(void* w) { return HOTBAR_MAX_VERTICES; } + void HotbarWidget_Update(struct HotbarWidget* w, double delta) { #ifdef CC_BUILD_TOUCH int i; @@ -653,7 +659,7 @@ static const struct WidgetVTABLE HotbarWidget_VTABLE = { NULL, HotbarWidget_Free, HotbarWidget_Reposition, HotbarWidget_KeyDown, HotbarWidget_InputUp, HotbarWidget_MouseScroll, HotbarWidget_PointerDown, HotbarWidget_PointerUp, HotbarWidget_PointerMove, - HotbarWidget_BuildMesh, HotbarWidget_Render2, + HotbarWidget_BuildMesh, HotbarWidget_Render2, HotbarWidget_MaxVertices }; void HotbarWidget_Create(struct HotbarWidget* w) { Widget_Reset(w); @@ -823,6 +829,8 @@ static int TableWidget_Render2(void* widget, int offset) { return offset + TABLE_MAX_VERTICES; } +static int TableWidget_MaxVertices(void* w) { return TABLE_MAX_VERTICES; } + static void TableWidget_Free(void* widget) { } void TableWidget_Recreate(struct TableWidget* w) { @@ -970,7 +978,7 @@ static const struct WidgetVTABLE TableWidget_VTABLE = { NULL, TableWidget_Free, TableWidget_Reposition, TableWidget_KeyDown, Widget_InputUp, TableWidget_MouseScroll, TableWidget_PointerDown, TableWidget_PointerUp, TableWidget_PointerMove, - TableWidget_BuildMesh, TableWidget_Render2 + TableWidget_BuildMesh, TableWidget_Render2, TableWidget_MaxVertices }; void TableWidget_Create(struct TableWidget* w, int sbWidth) { cc_bool classic; @@ -1569,6 +1577,8 @@ static int TextInputWidget_Render2(void* widget, int offset) { return offset + 4; } +static int TextInputWidget_MaxVertices(void* widget) { return MENUINPUTWIDGET_MAX; } + static void TextInputWidget_RemakeTexture(void* widget) { cc_string range; char rangeBuffer[STRING_SIZE]; struct TextInputWidget* w = (struct TextInputWidget*)widget; @@ -1655,7 +1665,7 @@ static const struct WidgetVTABLE TextInputWidget_VTABLE = { TextInputWidget_Render, InputWidget_Free, InputWidget_Reposition, InputWidget_KeyDown, Widget_InputUp, Widget_MouseScroll, TextInputWidget_PointerDown, Widget_PointerUp, Widget_PointerMove, - TextInputWidget_BuildMesh, TextInputWidget_Render2 + TextInputWidget_BuildMesh, TextInputWidget_Render2, TextInputWidget_MaxVertices }; void TextInputWidget_Create(struct TextInputWidget* w, int width, const cc_string* text, struct MenuInputDesc* desc) { InputWidget_Reset(&w->base);