diff --git a/CMakeLists.txt b/CMakeLists.txt index af926340e..9d0374a20 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -839,7 +839,6 @@ set(EXPECTED_DATA audio/wp_switch-02.wv audio/wp_switch-03.wv blob.png - browse_icons.png censorlist.txt console.png console_bar.png @@ -1138,7 +1137,7 @@ set(EXPECTED_DATA file_icons.png fonts/DejaVuSans.ttf fonts/GlowSansJCompressed-Book.otf - fonts/Icons.ttf + fonts/Icons.otf fonts/SourceHanSansSC-Regular.otf game.png gui_buttons.png diff --git a/data/browse_icons.png b/data/browse_icons.png deleted file mode 100644 index e8eb8d49d..000000000 Binary files a/data/browse_icons.png and /dev/null differ diff --git a/data/fonts/Icons.otf b/data/fonts/Icons.otf new file mode 100644 index 000000000..dc287d5c6 Binary files /dev/null and b/data/fonts/Icons.otf differ diff --git a/data/fonts/Icons.ttf b/data/fonts/Icons.ttf deleted file mode 100644 index 7015564ad..000000000 Binary files a/data/fonts/Icons.ttf and /dev/null differ diff --git a/datasrc/content.py b/datasrc/content.py index 8b40d84a0..d5b1b6c6a 100644 --- a/datasrc/content.py +++ b/datasrc/content.py @@ -228,7 +228,6 @@ container.sounds.Add(SoundSet("menu", ["audio/music_menu.wv"])) image_null = Image("null", "") image_particles = Image("particles", "particles.png") image_game = Image("game", "game.png") -image_browseicons = Image("browseicons", "browse_icons.png") image_emoticons = Image("emoticons", "emoticons.png") image_speedup_arrow = Image("speedup_arrow", "editor/speed_arrow.png") image_demobuttons = Image("demobuttons", "demo_buttons.png") @@ -246,7 +245,6 @@ container.images.Add(image_particles) container.images.Add(Image("cursor", "gui_cursor.png")) container.images.Add(Image("banner", "gui_logo.png")) container.images.Add(image_emoticons) -container.images.Add(image_browseicons) container.images.Add(Image("console_bg", "console.png")) container.images.Add(Image("console_bar", "console_bar.png")) container.images.Add(image_speedup_arrow) @@ -267,7 +265,6 @@ container.pickups.Add(Pickup("ninja", 90, 90)) set_particles = SpriteSet("particles", image_particles, 8, 8) set_game = SpriteSet("game", image_game, 32, 16) set_tee = SpriteSet("tee", image_null, 8, 4) -set_browseicons = SpriteSet("browseicons", image_browseicons, 6, 1) set_emoticons = SpriteSet("emoticons", image_emoticons, 4, 4) set_speedup_arrow = SpriteSet("speedup_arrow", image_speedup_arrow, 1, 1) set_demobuttons = SpriteSet("demobuttons", image_demobuttons, 5, 1) @@ -281,7 +278,6 @@ set_strongweak = SpriteSet("strongweak", image_strongweak, 2, 1) container.spritesets.Add(set_particles) container.spritesets.Add(set_game) container.spritesets.Add(set_tee) -container.spritesets.Add(set_browseicons) container.spritesets.Add(set_emoticons) container.spritesets.Add(set_speedup_arrow) container.spritesets.Add(set_demobuttons) @@ -398,12 +394,6 @@ container.sprites.Add(Sprite("wtf", set_emoticons, 1, 3, 1, 1)) container.sprites.Add(Sprite("eyes", set_emoticons, 2, 3, 1, 1)) container.sprites.Add(Sprite("question", set_emoticons, 3, 3, 1, 1)) -container.sprites.Add(Sprite("browse_lock", set_browseicons, 0,0,1,1)) -container.sprites.Add(Sprite("browse_heart", set_browseicons, 1,0,1,1)) -container.sprites.Add(Sprite("browse_unpure", set_browseicons, 3,0,1,1)) -container.sprites.Add(Sprite("browse_ddnet", set_browseicons, 4,0,1,1)) -container.sprites.Add(Sprite("browse_rank", set_browseicons, 5,0,1,1)) - container.sprites.Add(Sprite("speedup_arrow", set_speedup_arrow, 0,0,1,1)) container.sprites.Add(Sprite("demobutton_play", set_demobuttons, 0,0,1,1)) diff --git a/license.txt b/license.txt index c144a052d..d74f9b63e 100644 --- a/license.txt +++ b/license.txt @@ -23,20 +23,17 @@ freely, subject to the following restrictions: All content under 'data' except the assets, font, language & skin files, (which have their own licenses) are released under CC-BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/). -Apache 2.0 for the 'Icon.tff' file: -Copyright Google +SIL OFL 1.1 License for the 'Icon.otf' ('Font Awesome 6 Free-Solid-900.otf') file: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at +Copyright (c) 2022 Fonticons, Inc. (https://fontawesome.com) +with Reserved Font Name: "Font Awesome". - http://www.apache.org/licenses/LICENSE-2.0 +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. +SIL OPEN FONT LICENSE +Version 1.1 - 26 February 2007 The other fonts are released under CC-BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/). diff --git a/src/engine/client/text.cpp b/src/engine/client/text.cpp index 74954e994..496779036 100644 --- a/src/engine/client/text.cpp +++ b/src/engine/client/text.cpp @@ -693,7 +693,7 @@ public: IStorage *pStorage = Kernel()->RequestInterface(); char aFilename[IO_MAX_PATH_LENGTH]; - const char *pFontFile = "fonts/Icons.ttf"; + const char *pFontFile = "fonts/Icons.otf"; IOHANDLE File = pStorage->OpenFile(pFontFile, IOFLAG_READ, IStorage::TYPE_ALL, aFilename, sizeof(aFilename)); if(File) { diff --git a/src/game/client/components/menus.cpp b/src/game/client/components/menus.cpp index 26fd8a319..6c50d0836 100644 --- a/src/game/client/components/menus.cpp +++ b/src/game/client/components/menus.cpp @@ -346,7 +346,7 @@ int CMenus::DoButton_CheckBox_Common(const void *pID, const char *pText, const c { TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT); TextRender()->SetCurFont(TextRender()->GetFont(TEXT_FONT_ICON_FONT)); - UI()->DoLabel(&c, "\xEE\x97\x8D", c.h * CUI::ms_FontmodHeight, TEXTALIGN_CENTER, Props); + UI()->DoLabel(&c, "\xEF\x80\x8D", c.h * CUI::ms_FontmodHeight, TEXTALIGN_CENTER, Props); TextRender()->SetCurFont(NULL); } else @@ -719,10 +719,10 @@ int CMenus::RenderMenubar(CUIRect r) ColorRGBA *pHomeButtonColor = NULL; ColorRGBA *pHomeButtonColorHover = NULL; - const char *pHomeScreenButtonLabel = "\xEE\xA2\x8A"; + const char *pHomeScreenButtonLabel = "\xEF\x80\x95"; if(GotNewsOrUpdate) { - pHomeScreenButtonLabel = "\xEE\x80\xB1"; + pHomeScreenButtonLabel = "\xEF\x87\xAA"; pHomeButtonColor = &HomeButtonColorAlert; pHomeButtonColorHover = &HomeButtonColorAlertHover; } @@ -868,7 +868,7 @@ int CMenus::RenderMenubar(CUIRect r) Box.VSplitRight(33.0f, &Box, &Button); static int s_QuitButton = 0; ColorRGBA QuitColor(1, 0, 0, 0.5f); - if(DoButton_MenuTab(&s_QuitButton, "\xEE\xA2\xAC", 0, &Button, CUI::CORNER_T, &m_aAnimatorsSmallPage[SMALL_TAB_QUIT], NULL, NULL, &QuitColor, 10.0f, 0)) + if(DoButton_MenuTab(&s_QuitButton, "\xEF\x80\x91", 0, &Button, CUI::CORNER_T, &m_aAnimatorsSmallPage[SMALL_TAB_QUIT], NULL, NULL, &QuitColor, 10.0f, 0)) { if(m_pClient->Editor()->HasUnsavedData() || (Client()->GetCurrentRaceTime() / 60 >= g_Config.m_ClConfirmQuitTime && g_Config.m_ClConfirmQuitTime >= 0)) { @@ -884,13 +884,13 @@ int CMenus::RenderMenubar(CUIRect r) Box.VSplitRight(33.0f, &Box, &Button); static int s_SettingsButton = 0; - if(DoButton_MenuTab(&s_SettingsButton, "\xEE\xA2\xB8", m_ActivePage == PAGE_SETTINGS, &Button, CUI::CORNER_T, &m_aAnimatorsSmallPage[SMALL_TAB_SETTINGS], NULL, NULL, NULL, 10.0f, 0)) + if(DoButton_MenuTab(&s_SettingsButton, "\xEF\x80\x93", m_ActivePage == PAGE_SETTINGS, &Button, CUI::CORNER_T, &m_aAnimatorsSmallPage[SMALL_TAB_SETTINGS], NULL, NULL, NULL, 10.0f, 0)) NewPage = PAGE_SETTINGS; Box.VSplitRight(10.0f, &Box, &Button); Box.VSplitRight(33.0f, &Box, &Button); static int s_EditorButton = 0; - if(DoButton_MenuTab(&s_EditorButton, "\xEE\x8F\x89", 0, &Button, CUI::CORNER_T, &m_aAnimatorsSmallPage[SMALL_TAB_EDITOR], NULL, NULL, NULL, 10.0f, 0)) + if(DoButton_MenuTab(&s_EditorButton, "\xEF\x81\x84", 0, &Button, CUI::CORNER_T, &m_aAnimatorsSmallPage[SMALL_TAB_EDITOR], NULL, NULL, NULL, 10.0f, 0)) { g_Config.m_ClEditor = 1; } @@ -901,14 +901,14 @@ int CMenus::RenderMenubar(CUIRect r) Box.VSplitRight(33.0f, &Box, &Button); static int s_DemoButton = 0; - if(DoButton_MenuTab(&s_DemoButton, "\xEE\x80\xAC", m_ActivePage == PAGE_DEMOS, &Button, CUI::CORNER_T, &m_aAnimatorsSmallPage[SMALL_TAB_DEMOBUTTON], NULL, NULL, NULL, 10.0f, 0)) + if(DoButton_MenuTab(&s_DemoButton, "\xEE\x84\xB1", m_ActivePage == PAGE_DEMOS, &Button, CUI::CORNER_T, &m_aAnimatorsSmallPage[SMALL_TAB_DEMOBUTTON], NULL, NULL, NULL, 10.0f, 0)) NewPage = PAGE_DEMOS; Box.VSplitRight(10.0f, &Box, &Button); Box.VSplitRight(33.0f, &Box, &Button); static int s_ServerButton = 0; - if(DoButton_MenuTab(&s_ServerButton, "\xEE\xA0\x8B", m_ActivePage == g_Config.m_UiPage, &Button, CUI::CORNER_T, &m_aAnimatorsSmallPage[SMALL_TAB_SERVER], NULL, NULL, NULL, 10.0f, 0)) + if(DoButton_MenuTab(&s_ServerButton, "\xEF\x95\xBD", m_ActivePage == g_Config.m_UiPage, &Button, CUI::CORNER_T, &m_aAnimatorsSmallPage[SMALL_TAB_SERVER], NULL, NULL, NULL, 10.0f, 0)) NewPage = g_Config.m_UiPage; } diff --git a/src/game/client/components/menus_browser.cpp b/src/game/client/components/menus_browser.cpp index edcdfda82..a9c7bb12a 100644 --- a/src/game/client/components/menus_browser.cpp +++ b/src/game/client/components/menus_browser.cpp @@ -224,6 +224,21 @@ void CMenus::RenderServerbrowserServerList(CUIRect View) for(int i = 0; i < m_lFriends.size(); m_lFriends[i++].m_NumFound = 0) ; + auto RenderBrowserIcons = [this](CUIElement::SUIElementRect &UIRect, CUIRect *pRect, const ColorRGBA &TextColor, const ColorRGBA &TextOutlineColor, const char *pText, ETextAlignment TextAlign, bool SmallFont = false) { + float FontSize = 14.0f * UI()->Scale(); + if(SmallFont) + FontSize = 6.0f * UI()->Scale(); + TextRender()->SetCurFont(TextRender()->GetFont(TEXT_FONT_ICON_FONT)); + TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); + TextRender()->TextColor(TextColor); + TextRender()->TextOutlineColor(TextOutlineColor); + UI()->DoLabelStreamed(UIRect, pRect, pText, FontSize, TextAlign, -1, 0); + TextRender()->TextOutlineColor(TextRender()->DefaultTextOutlineColor()); + TextRender()->TextColor(TextRender()->DefaultTextColor()); + TextRender()->SetRenderFlags(0); + TextRender()->SetCurFont(nullptr); + }; + for(int i = 0; i < NumServers; i++) { int ItemIndex = i; @@ -328,17 +343,24 @@ void CMenus::RenderServerbrowserServerList(CUIRect View) if(ID == COL_FLAG_LOCK) { if(pItem->m_Flags & SERVER_FLAG_PASSWORD) - DoButton_Icon(IMAGE_BROWSEICONS, SPRITE_BROWSE_LOCK, &Button); + { + RenderBrowserIcons(*pItem->m_pUIElement->Get(g_OffsetColFlagLock + 0), &Button, {0.75f, 0.75f, 0.75f, 1}, TextRender()->DefaultTextOutlineColor(), "\xEF\x80\xA3", TEXTALIGN_CENTER); + } } else if(ID == COL_FLAG_FAV) { if(pItem->m_Favorite) - DoButton_Icon(IMAGE_BROWSEICONS, SPRITE_BROWSE_HEART, &Button); + { + RenderBrowserIcons(*pItem->m_pUIElement->Get(g_OffsetColFav + 0), &Button, {0.94f, 0.4f, 0.4f, 1}, TextRender()->DefaultTextOutlineColor(), "\xEF\x80\x84", TEXTALIGN_CENTER); + } } else if(ID == COL_FLAG_OFFICIAL) { if(pItem->m_Official && g_Config.m_UiPage != PAGE_DDNET && g_Config.m_UiPage != PAGE_KOG) - DoButton_Icon(IMAGE_BROWSEICONS, SPRITE_BROWSE_DDNET, &Button); + { + RenderBrowserIcons(*pItem->m_pUIElement->Get(g_OffsetColOff + 0), &Button, {0.4f, 0.7f, 0.94f, 1}, {0.0f, 0.0f, 0.0f, 1.0f}, "\xEF\x82\xA3", TEXTALIGN_CENTER); + RenderBrowserIcons(*pItem->m_pUIElement->Get(g_OffsetColOff + 1), &Button, {0.0f, 0.0f, 0.0f, 1.0f}, {0.0f, 0.0f, 0.0f, 0.0f}, "\xEF\x80\x8C", TEXTALIGN_CENTER, true); + } } else if(ID == COL_NAME) { @@ -372,7 +394,9 @@ void CMenus::RenderServerbrowserServerList(CUIRect View) Icon.Margin(2.0f, &Icon); if(g_Config.m_BrIndicateFinished && pItem->m_HasRank == 1) - DoButton_Icon(IMAGE_BROWSEICONS, SPRITE_BROWSE_RANK, &Icon); + { + RenderBrowserIcons(*pItem->m_pUIElement->Get(g_OffsetColFlagLock + 1), &Icon, TextRender()->DefaultTextColor(), TextRender()->DefaultTextOutlineColor(), "\xEF\x84\x9E", TEXTALIGN_CENTER); + } } float FontSize = 12.0f * UI()->Scale(); @@ -403,7 +427,7 @@ void CMenus::RenderServerbrowserServerList(CUIRect View) { Button.VSplitLeft(Button.h, &Icon, &Button); Icon.Margin(2.0f, &Icon); - DoButton_Icon(IMAGE_BROWSEICONS, SPRITE_BROWSE_HEART, &Icon); + RenderBrowserIcons(*pItem->m_pUIElement->Get(g_OffsetColFav + 1), &Icon, {0.94f, 0.4f, 0.4f, 1}, TextRender()->DefaultTextOutlineColor(), "\xEF\x80\x84", TEXTALIGN_LEFT); } str_format(aTemp, sizeof(aTemp), "%i/%i", pItem->m_NumFilteredPlayers, ServerBrowser()->Max(*pItem)); @@ -507,8 +531,8 @@ void CMenus::RenderServerbrowserServerList(CUIRect View) float SearchIconWidth = 0; float ExcludeIconWidth = 0; float ExcludeSearchIconMax = 0; - const char *pSearchLabel = "\xEE\xA2\xB6"; // U+0e8b6 - const char *pExcludeLabel = "\xEE\x85\x8B"; // U+0e14b + const char *pSearchLabel = "\xEF\x80\x82"; + const char *pExcludeLabel = "\xEF\x81\x9E"; // render quick search { diff --git a/src/game/client/components/menus_ingame.cpp b/src/game/client/components/menus_ingame.cpp index b342da5aa..7303e4225 100644 --- a/src/game/client/components/menus_ingame.cpp +++ b/src/game/client/components/menus_ingame.cpp @@ -670,7 +670,7 @@ void CMenus::RenderServerControl(CUIRect MainView) { Bottom.VSplitLeft(240.0f, &QuickSearch, &Bottom); QuickSearch.HSplitTop(5.0f, 0, &QuickSearch); - const char *pSearchLabel = "\xEE\xA2\xB6"; + const char *pSearchLabel = "\xEF\x80\x82"; TextRender()->SetCurFont(TextRender()->GetFont(TEXT_FONT_ICON_FONT)); TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); diff --git a/src/game/client/components/menus_settings.cpp b/src/game/client/components/menus_settings.cpp index d9b12546a..76e03c924 100644 --- a/src/game/client/components/menus_settings.cpp +++ b/src/game/client/components/menus_settings.cpp @@ -726,7 +726,7 @@ void CMenus::RenderSettingsTee(CUIRect MainView) MainView.HSplitBottom(ms_ButtonHeight, &MainView, &QuickSearch); QuickSearch.VSplitLeft(240.0f, &QuickSearch, &SkinDB); QuickSearch.HSplitTop(5.0f, 0, &QuickSearch); - const char *pSearchLabel = "\xEE\xA2\xB6"; + const char *pSearchLabel = "\xEF\x80\x82"; TextRender()->SetCurFont(TextRender()->GetFont(TEXT_FONT_ICON_FONT)); TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); @@ -783,7 +783,7 @@ void CMenus::RenderSettingsTee(CUIRect MainView) TextRender()->SetCurFont(TextRender()->GetFont(TEXT_FONT_ICON_FONT)); TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); static int s_SkinRefreshButtonID = 0; - if(DoButton_Menu(&s_SkinRefreshButtonID, "\xEE\x97\x95", 0, &RefreshButton, NULL, 15, 5, 0, vec4(1.0f, 1.0f, 1.0f, 0.75f), vec4(1, 1, 1, 0.5f), 0)) + if(DoButton_Menu(&s_SkinRefreshButtonID, "\xEF\x80\x9E", 0, &RefreshButton, NULL, 15, 5, 0, vec4(1.0f, 1.0f, 1.0f, 0.75f), vec4(1, 1, 1, 0.5f), 0)) { m_pClient->m_Skins.Refresh(); s_InitSkinlist = true; diff --git a/src/game/client/components/menus_settings_assets.cpp b/src/game/client/components/menus_settings_assets.cpp index 0f2e4a578..d2734d28d 100644 --- a/src/game/client/components/menus_settings_assets.cpp +++ b/src/game/client/components/menus_settings_assets.cpp @@ -509,7 +509,7 @@ void CMenus::RenderSettingsCustom(CUIRect MainView) MainView.HSplitBottom(ms_ButtonHeight, &MainView, &QuickSearch); QuickSearch.VSplitLeft(240.0f, &QuickSearch, &DirectoryButton); QuickSearch.HSplitTop(5.0f, 0, &QuickSearch); - const char *pSearchLabel = "\xEE\xA2\xB6"; + const char *pSearchLabel = "\xEF\x80\x82"; TextRender()->SetCurFont(TextRender()->GetFont(TEXT_FONT_ICON_FONT)); TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); @@ -564,7 +564,7 @@ void CMenus::RenderSettingsCustom(CUIRect MainView) TextRender()->SetCurFont(TextRender()->GetFont(TEXT_FONT_ICON_FONT)); TextRender()->SetRenderFlags(ETextRenderFlags::TEXT_RENDER_FLAG_ONLY_ADVANCE_WIDTH | ETextRenderFlags::TEXT_RENDER_FLAG_NO_X_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_Y_BEARING | ETextRenderFlags::TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT | ETextRenderFlags::TEXT_RENDER_FLAG_NO_OVERSIZE); static int s_AssetsReloadBtnID = 0; - if(DoButton_Menu(&s_AssetsReloadBtnID, "\xEE\x97\x95", 0, &ReloadButton, NULL, 15, 5, 0, vec4(1.0f, 1.0f, 1.0f, 0.75f), vec4(1, 1, 1, 0.5f), 0)) + if(DoButton_Menu(&s_AssetsReloadBtnID, "\xEF\x80\x9E", 0, &ReloadButton, NULL, 15, 5, 0, vec4(1.0f, 1.0f, 1.0f, 0.75f), vec4(1, 1, 1, 0.5f), 0)) { ClearCustomItems(s_CurCustomTab); }