CHudVisorBeamMenu: Dehardcode array sizes

Same behavior, but queries the container for the size rather than
hardcoding it in loop bounds.
This commit is contained in:
Lioncash 2020-03-29 02:45:22 -04:00
parent 413483a996
commit fda08db9b1
2 changed files with 46 additions and 33 deletions

View File

@ -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<CGuiTextPane*>(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<zeus::CColor, 4> 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<bool, 4>& 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;
}
}
}

View File

@ -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<bool, 4>& enables);
@ -53,7 +53,7 @@ public:
void UpdateHudAlpha(float alpha);
void SetIsVisibleGame(bool v);
void SetPlayerHas(const rstl::reserved_vector<bool, 4>& enables);
void SetSelection(int, int, float);
void SetSelection(int selection, int pending, float interp);
};
} // namespace urde