From fda08db9b16dc68bb7355ad97704e6b294bceb16 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 29 Mar 2020 02:45:22 -0400 Subject: [PATCH] CHudVisorBeamMenu: Dehardcode array sizes Same behavior, but queries the container for the size rather than hardcoding it in loop bounds. --- Runtime/GuiSys/CHudVisorBeamMenu.cpp | 75 ++++++++++++++++------------ Runtime/GuiSys/CHudVisorBeamMenu.hpp | 4 +- 2 files changed, 46 insertions(+), 33 deletions(-) diff --git a/Runtime/GuiSys/CHudVisorBeamMenu.cpp b/Runtime/GuiSys/CHudVisorBeamMenu.cpp index 843dd9367..3153cf848 100644 --- a/Runtime/GuiSys/CHudVisorBeamMenu.cpp +++ b/Runtime/GuiSys/CHudVisorBeamMenu.cpp @@ -98,7 +98,7 @@ CHudVisorBeamMenu::CHudVisorBeamMenu(CGuiFrame& baseHud, EHudVisorBeamMenu type, x20_textpane_menu->TextSupport().SetText( g_MainStringTable->GetString(MenuStringIdx[size_t(x4_type)][x8_selectedItem])); - for (int i = 0; i < 4; ++i) { + for (size_t i = 0; i < x28_menuItems.size(); ++i) { SMenuItem& item = x28_menuItems[i]; item.x0_model_loz->SetColor(g_tweakGuiColors->GetVisorBeamMenuLozColor()); UpdateMenuWidgetTransform(i, *item.x0_model_loz, 1.f); @@ -107,20 +107,22 @@ CHudVisorBeamMenu::CHudVisorBeamMenu(CGuiFrame& baseHud, EHudVisorBeamMenu type, Update(0.f, true); } -void CHudVisorBeamMenu::UpdateMenuWidgetTransform(int idx, CGuiWidget& w, float t) { - float translate = t * g_tweakGui->GetVisorBeamMenuItemTranslate(); - float scale = +void CHudVisorBeamMenu::UpdateMenuWidgetTransform(size_t idx, CGuiWidget& w, float t) { + const float translate = t * g_tweakGui->GetVisorBeamMenuItemTranslate(); + const float scale = t * g_tweakGui->GetVisorBeamMenuItemInactiveScale() + (1.f - t) * g_tweakGui->GetVisorBeamMenuItemActiveScale(); if (x4_type == EHudVisorBeamMenu::Visor) { - if (idx == 2) + if (idx == 2) { idx = 3; - else if (idx == 3) + } else if (idx == 3) { idx = 2; + } } else { - if (idx == 1) + if (idx == 1) { idx = 2; - else if (idx == 2) + } else if (idx == 2) { idx = 1; + } } switch (idx) { @@ -159,13 +161,13 @@ void CHudVisorBeamMenu::Update(float dt, bool init) { x20_textpane_menu = static_cast(x0_baseHud.FindWidget(TextNames[size_t(swappedType)])); x1c_basewidget_menutitle = x0_baseHud.FindWidget(BaseTitleNames[size_t(swappedType)]); - for (int i = 0; i < 4; ++i) { + for (size_t i = 0; i < x28_menuItems.size(); ++i) { SMenuItem& item = x28_menuItems[i]; UpdateMenuWidgetTransform(i, *item.x4_model_icon, item.x8_positioner); UpdateMenuWidgetTransform(i, *item.x0_model_loz, 1.f); } - UpdateMenuWidgetTransform(x8_selectedItem, *x24_model_ghost, x28_menuItems[x8_selectedItem].x8_positioner); + UpdateMenuWidgetTransform(size_t(x8_selectedItem), *x24_model_ghost, x28_menuItems[x8_selectedItem].x8_positioner); } zeus::CColor activeColor = g_tweakGuiColors->GetVisorBeamMenuItemActive(); @@ -173,24 +175,30 @@ void CHudVisorBeamMenu::Update(float dt, bool init) { zeus::CColor lozColor = g_tweakGuiColors->GetVisorBeamMenuLozColor(); std::array tmpColors; - for (int i = 0; i < 4; ++i) { + for (size_t i = 0; i < x28_menuItems.size(); ++i) { SMenuItem& item = x28_menuItems[i]; - if (item.xc_opacity > 0.f) + if (item.xc_opacity > 0.f) { item.xc_opacity = std::min(item.xc_opacity + dt, 1.f); + } tmpColors[i] = zeus::CColor::lerp(activeColor, zeus::skClear, item.xc_opacity); } switch (x6c_animPhase) { case EAnimPhase::Steady: - for (int i = 0; i < 4; ++i) { + for (size_t i = 0; i < x28_menuItems.size(); ++i) { SMenuItem& item = x28_menuItems[i]; - zeus::CColor& color0 = (x8_selectedItem == i) ? activeColor : inactiveColor; - zeus::CColor& color1 = (x8_selectedItem == i) ? lozColor : inactiveColor; - zeus::CColor iconColor = (item.xc_opacity == 0.f) ? zeus::skClear : color0 + tmpColors[i]; - zeus::CColor lColor = (item.xc_opacity == 0.f) ? lozColor : color1 + tmpColors[i]; + + const bool isSelectedItem = x8_selectedItem == int(i); + const bool isClear = item.xc_opacity == 0.0f; + + const zeus::CColor& color0 = isSelectedItem ? activeColor : inactiveColor; + const zeus::CColor& color1 = isSelectedItem ? lozColor : inactiveColor; + const zeus::CColor iconColor = isClear ? zeus::skClear : color0 + tmpColors[i]; + const zeus::CColor lColor = isClear ? lozColor : color1 + tmpColors[i]; + item.x4_model_icon->SetColor(iconColor); item.x0_model_loz->SetColor(lColor); - item.x8_positioner = (x8_selectedItem == i) ? 0.f : 1.f; + item.x8_positioner = isSelectedItem ? 0.f : 1.f; } x24_model_ghost->SetColor(activeColor); break; @@ -210,20 +218,25 @@ void CHudVisorBeamMenu::Update(float dt, bool init) { item1.x4_model_icon->SetColor(color); item1.x0_model_loz->SetColor(lozColor); - for (int i = 0; i < 4; ++i) - x28_menuItems[i].x8_positioner = (x8_selectedItem == i) ? 1.f - x10_interp : 1.f; + for (size_t i = 0; i < x28_menuItems.size(); ++i) { + const bool isSelectedItem = x8_selectedItem == int(i); + x28_menuItems[i].x8_positioner = isSelectedItem ? 1.f - x10_interp : 1.f; + } x24_model_ghost->SetColor(zeus::CColor::lerp(activeColor, inactiveColor, item1.x8_positioner)); break; } case EAnimPhase::Animate: - for (int i = 0; i < 4; ++i) { + for (size_t i = 0; i < x28_menuItems.size(); ++i) { SMenuItem& item = x28_menuItems[i]; - zeus::CColor& color0 = (x8_selectedItem == i) ? activeColor : inactiveColor; - zeus::CColor iconColor = (item.xc_opacity == 0.f) ? zeus::skClear : color0 + tmpColors[i]; + const bool isSelectedItem = x8_selectedItem == int(i); + const bool isClear = item.xc_opacity == 0.f; + const zeus::CColor& color0 = isSelectedItem ? activeColor : inactiveColor; + const zeus::CColor iconColor = isClear ? zeus::skClear : color0 + tmpColors[i]; + item.x4_model_icon->SetColor(iconColor); - item.x0_model_loz->SetColor((item.xc_opacity == 0.f || x8_selectedItem == i) ? lozColor : inactiveColor); - item.x8_positioner = (x8_selectedItem == i) ? 1.f - x10_interp : 1.f; + item.x0_model_loz->SetColor((isClear || isSelectedItem) ? lozColor : inactiveColor); + item.x8_positioner = isSelectedItem ? 1.f - x10_interp : 1.f; } x24_model_ghost->SetColor( zeus::CColor::lerp(activeColor, inactiveColor, x28_menuItems[x8_selectedItem].x8_positioner)); @@ -241,11 +254,11 @@ void CHudVisorBeamMenu::Update(float dt, bool init) { if (x14_26_dirty || init) { x14_26_dirty = false; - for (int i = 0; i < 4; ++i) { + for (size_t i = 0; i < x28_menuItems.size(); ++i) { SMenuItem& item = x28_menuItems[i]; UpdateMenuWidgetTransform(i, *item.x4_model_icon, item.x8_positioner); } - UpdateMenuWidgetTransform(x8_selectedItem, *x24_model_ghost, x28_menuItems[x8_selectedItem].x8_positioner); + UpdateMenuWidgetTransform(size_t(x8_selectedItem), *x24_model_ghost, x28_menuItems[x8_selectedItem].x8_positioner); } if (!x14_24_visibleDebug || !x14_25_visibleGame) @@ -254,8 +267,7 @@ void CHudVisorBeamMenu::Update(float dt, bool init) { x1c_basewidget_menutitle->SetVisibility(x1c_basewidget_menutitle->GetGeometryColor().a() != 0.f, ETraversalMode::Children); - for (int i = 0; i < 4; ++i) { - SMenuItem& item = x28_menuItems[i]; + for (SMenuItem& item : x28_menuItems) { item.x4_model_icon->SetIsVisible(item.x4_model_icon->GetGeometryColor().a() != 0.f); } } @@ -275,10 +287,11 @@ void CHudVisorBeamMenu::SetIsVisibleGame(bool v) { } void CHudVisorBeamMenu::SetPlayerHas(const rstl::reserved_vector& enables) { - for (int i = 0; i < 4; ++i) { + for (size_t i = 0; i < x28_menuItems.size(); ++i) { SMenuItem& item = x28_menuItems[i]; - if (item.xc_opacity == 0.f && enables[i]) + if (item.xc_opacity == 0.f && enables[i]) { item.xc_opacity = FLT_EPSILON; + } } } diff --git a/Runtime/GuiSys/CHudVisorBeamMenu.hpp b/Runtime/GuiSys/CHudVisorBeamMenu.hpp index 3cf9b45a9..6306fd19f 100644 --- a/Runtime/GuiSys/CHudVisorBeamMenu.hpp +++ b/Runtime/GuiSys/CHudVisorBeamMenu.hpp @@ -45,7 +45,7 @@ private: float x7c_animDur; bool x80_24_swapBeamControls : 1; - void UpdateMenuWidgetTransform(int, CGuiWidget& w, float); + void UpdateMenuWidgetTransform(size_t idx, CGuiWidget& w, float t); public: CHudVisorBeamMenu(CGuiFrame& baseHud, EHudVisorBeamMenu type, const rstl::reserved_vector& enables); @@ -53,7 +53,7 @@ public: void UpdateHudAlpha(float alpha); void SetIsVisibleGame(bool v); void SetPlayerHas(const rstl::reserved_vector& enables); - void SetSelection(int, int, float); + void SetSelection(int selection, int pending, float interp); }; } // namespace urde