From 83a64a4110a94ff3e8c59bbd6a27a9106e388273 Mon Sep 17 00:00:00 2001 From: nullsystem <15316579+nullsystem@users.noreply.github.com> Date: Fri, 27 Sep 2024 21:47:44 +0100 Subject: [PATCH] Abs/Screen half sizing, self managed NeoUI section --- mp/src/game/client/hud_crosshair.cpp | 2 + .../game/client/neo/ui/neo_hud_crosshair.cpp | 69 +++++++++++-------- mp/src/game/client/neo/ui/neo_hud_crosshair.h | 15 +++- mp/src/game/client/neo/ui/neo_root.cpp | 37 ++++++---- .../game/client/neo/ui/neo_root_settings.cpp | 47 +++++++++---- mp/src/game/client/neo/ui/neo_root_settings.h | 2 + 6 files changed, 119 insertions(+), 53 deletions(-) diff --git a/mp/src/game/client/hud_crosshair.cpp b/mp/src/game/client/hud_crosshair.cpp index 8fbf261b3..b87313c09 100644 --- a/mp/src/game/client/hud_crosshair.cpp +++ b/mp/src/game/client/hud_crosshair.cpp @@ -379,7 +379,9 @@ void CHudCrosshair::Paint( void ) .color = Color( neo_cl_crosshair_color_r.GetInt(), neo_cl_crosshair_color_g.GetInt(), neo_cl_crosshair_color_b.GetInt(), neo_cl_crosshair_color_a.GetInt()), + .iESizeType = neo_cl_crosshair_size_type.GetInt(), .iSize = neo_cl_crosshair_size.GetInt(), + .flScrSize = neo_cl_crosshair_size_screen.GetFloat(), .iThick = neo_cl_crosshair_thickness.GetInt(), .iGap = neo_cl_crosshair_gap.GetInt(), .iOutline = neo_cl_crosshair_outline.GetInt(), diff --git a/mp/src/game/client/neo/ui/neo_hud_crosshair.cpp b/mp/src/game/client/neo/ui/neo_hud_crosshair.cpp index 00e1c9b0a..e0670d963 100644 --- a/mp/src/game/client/neo/ui/neo_hud_crosshair.cpp +++ b/mp/src/game/client/neo/ui/neo_hud_crosshair.cpp @@ -9,6 +9,8 @@ ConVar neo_cl_crosshair_color_g("neo_cl_crosshair_color_g", "255", FCVAR_ARCHIVE ConVar neo_cl_crosshair_color_b("neo_cl_crosshair_color_b", "255", FCVAR_ARCHIVE | FCVAR_USERINFO, "", true, 0.0f, true, 255.0f); ConVar neo_cl_crosshair_color_a("neo_cl_crosshair_color_a", "255", FCVAR_ARCHIVE | FCVAR_USERINFO, "", true, 0.0f, true, 255.0f); ConVar neo_cl_crosshair_size("neo_cl_crosshair_size", "15", FCVAR_ARCHIVE | FCVAR_USERINFO, "", true, 0.0f, true, CROSSHAIR_MAX_SIZE); +ConVar neo_cl_crosshair_size_screen("neo_cl_crosshair_size_screen", "0", FCVAR_ARCHIVE | FCVAR_USERINFO, "", true, 0.0f, true, 1.0f); +ConVar neo_cl_crosshair_size_type("neo_cl_crosshair_size_type", "0", FCVAR_ARCHIVE | FCVAR_USERINFO, "", true, 0.0f, true, (CROSSHAIR_SIZETYPE__TOTAL - 1)); ConVar neo_cl_crosshair_thickness("neo_cl_crosshair_thickness", "1", FCVAR_ARCHIVE | FCVAR_USERINFO, "", true, 0.0f, true, CROSSHAIR_MAX_THICKNESS); ConVar neo_cl_crosshair_gap("neo_cl_crosshair_gap", "5", FCVAR_ARCHIVE | FCVAR_USERINFO, "", true, 0.0f, true, CROSSHAIR_MAX_GAP); ConVar neo_cl_crosshair_outline("neo_cl_crosshair_outline", "0", FCVAR_ARCHIVE | FCVAR_USERINFO, "", true, 0.0f, true, CROSSHAIR_MAX_OUTLINE); @@ -23,39 +25,52 @@ const char **CROSSHAIR_FILES = INTERNAL_CROSSHAIR_FILES; static const wchar_t *INTERNAL_CROSSHAIR_LABELS[CROSSHAIR_STYLE__TOTAL] = { L"Default", L"Custom" }; const wchar_t **CROSSHAIR_LABELS = INTERNAL_CROSSHAIR_LABELS; +static const wchar_t *INTERNAL_CROSSHAIR_SIZETYPE_LABELS[CROSSHAIR_SIZETYPE__TOTAL] = { L"Absolute", L"Screen halves" }; +const wchar_t **CROSSHAIR_SIZETYPE_LABELS = INTERNAL_CROSSHAIR_SIZETYPE_LABELS; + void PaintCrosshair(const CrosshairInfo &crh, const int x, const int y) { - vgui::IntRect iRects[4] = { - { -crh.iSize - crh.iGap, -crh.iThick, -crh.iGap, crh.iThick }, // Left - { crh.iGap, -crh.iThick, crh.iGap + crh.iSize, crh.iThick }, // Right - { -crh.iThick, crh.iGap, crh.iThick, crh.iGap + crh.iSize }, // Bottom - { -crh.iThick, -crh.iSize - crh.iGap, crh.iThick, -crh.iGap }, // Top (Must be last for bTopLine) - }; - for (vgui::IntRect &rect : iRects) - { - rect.x0 += x; - rect.y0 += y; - rect.x1 += x; - rect.y1 += y; - } - const int iRectSize = (crh.bTopLine) ? 4 : 3; - if (crh.iOutline > 0) + if (crh.iSize > 0 && crh.iThick > 0) { - vgui::IntRect iOutRects[4] = {}; - V_memcpy(iOutRects, iRects, sizeof(vgui::IntRect) * 4); - for (vgui::IntRect &rect : iOutRects) + int iSize = crh.iSize; + if (crh.iESizeType == CROSSHAIR_SIZETYPE_SCREEN) { - rect.x0 -= crh.iOutline; - rect.y0 -= crh.iOutline; - rect.x1 += crh.iOutline; - rect.y1 += crh.iOutline; + int wide, tall; + vgui::surface()->GetScreenSize(wide, tall); + iSize = (crh.flScrSize * (max(wide, tall) / 2)); + } + vgui::IntRect iRects[4] = { + { -iSize - crh.iGap, -crh.iThick, -crh.iGap, crh.iThick }, // Left + { crh.iGap, -crh.iThick, crh.iGap + iSize, crh.iThick }, // Right + { -crh.iThick, crh.iGap, crh.iThick, crh.iGap + iSize }, // Bottom + { -crh.iThick, -iSize - crh.iGap, crh.iThick, -crh.iGap }, // Top (Must be last for bTopLine) + }; + for (vgui::IntRect &rect : iRects) + { + rect.x0 += x; + rect.y0 += y; + rect.x1 += x; + rect.y1 += y; + } + const int iRectSize = (crh.bTopLine) ? 4 : 3; + if (crh.iOutline > 0) + { + vgui::IntRect iOutRects[4] = {}; + V_memcpy(iOutRects, iRects, sizeof(vgui::IntRect) * 4); + for (vgui::IntRect &rect : iOutRects) + { + rect.x0 -= crh.iOutline; + rect.y0 -= crh.iOutline; + rect.x1 += crh.iOutline; + rect.y1 += crh.iOutline; + } + vgui::surface()->DrawSetColor(COLOR_BLACK); + vgui::surface()->DrawFilledRectArray(iOutRects, iRectSize); } - vgui::surface()->DrawSetColor(COLOR_BLACK); - vgui::surface()->DrawFilledRectArray(iOutRects, iRectSize); - } - vgui::surface()->DrawSetColor(crh.color); - vgui::surface()->DrawFilledRectArray(iRects, iRectSize); + vgui::surface()->DrawSetColor(crh.color); + vgui::surface()->DrawFilledRectArray(iRects, iRectSize); + } if (crh.iCenterDot > 0) { diff --git a/mp/src/game/client/neo/ui/neo_hud_crosshair.h b/mp/src/game/client/neo/ui/neo_hud_crosshair.h index 0bbff1a7d..02cbbf6b0 100644 --- a/mp/src/game/client/neo/ui/neo_hud_crosshair.h +++ b/mp/src/game/client/neo/ui/neo_hud_crosshair.h @@ -1,6 +1,6 @@ #pragma once -static constexpr int CROSSHAIR_MAX_SIZE = 25; +static constexpr int CROSSHAIR_MAX_SIZE = 100; static constexpr int CROSSHAIR_MAX_THICKNESS = 5; static constexpr int CROSSHAIR_MAX_GAP = 25; static constexpr int CROSSHAIR_MAX_OUTLINE = 5; @@ -19,12 +19,22 @@ enum NeoHudCrosshairStyle CROSSHAIR_STYLE__TOTAL, }; +enum NeoHudCrosshairSizeType +{ + CROSSHAIR_SIZETYPE_ABSOLUTE = 0, + CROSSHAIR_SIZETYPE_SCREEN, + + CROSSHAIR_SIZETYPE__TOTAL, +}; + extern ConVar neo_cl_crosshair_style; extern ConVar neo_cl_crosshair_color_r; extern ConVar neo_cl_crosshair_color_g; extern ConVar neo_cl_crosshair_color_b; extern ConVar neo_cl_crosshair_color_a; extern ConVar neo_cl_crosshair_size; +extern ConVar neo_cl_crosshair_size_screen; +extern ConVar neo_cl_crosshair_size_type; extern ConVar neo_cl_crosshair_thickness; extern ConVar neo_cl_crosshair_gap; extern ConVar neo_cl_crosshair_outline; @@ -35,11 +45,14 @@ extern ConVar neo_cl_crosshair_circle_segments; extern const char **CROSSHAIR_FILES; extern const wchar_t **CROSSHAIR_LABELS; +extern const wchar_t **CROSSHAIR_SIZETYPE_LABELS; struct CrosshairInfo { Color color; + int iESizeType; // int NeoHudCrosshairSizeType int iSize; + float flScrSize; int iThick; int iGap; int iOutline; diff --git a/mp/src/game/client/neo/ui/neo_root.cpp b/mp/src/game/client/neo/ui/neo_root.cpp index fa65eb7aa..8437921c9 100644 --- a/mp/src/game/client/neo/ui/neo_root.cpp +++ b/mp/src/game/client/neo/ui/neo_root.cpp @@ -47,10 +47,10 @@ void NeoToggleconsole(); inline NeoUI::Context g_uiCtx; inline ConVar neo_cl_toggleconsole("neo_cl_toggleconsole", "0", FCVAR_ARCHIVE, "If the console can be toggled with the ` keybind or not.", true, 0.0f, true, 1.0f); +inline int g_iRowsInScreen; namespace { -int g_iRowsInScreen; int g_iAvatar = 64; int g_iRootSubPanelWide = 600; constexpr wchar_t WSZ_GAME_TITLE[] = L"neatbkyoc ue"; @@ -693,13 +693,18 @@ void CNeoRoot::MainLoopRoot(const MainLoopParam param) void CNeoRoot::MainLoopSettings(const MainLoopParam param) { - static constexpr void (*P_FN[])(NeoSettings *) = { - NeoSettings_General, - NeoSettings_Keys, - NeoSettings_Mouse, - NeoSettings_Audio, - NeoSettings_Video, - NeoSettings_Crosshair, + struct NeoSettingsFunc + { + void (*func)(NeoSettings *); + bool bUISectionManaged; + }; + static constexpr NeoSettingsFunc P_FN[] = { + {NeoSettings_General, false}, + {NeoSettings_Keys, false}, + {NeoSettings_Mouse, false}, + {NeoSettings_Audio, false}, + {NeoSettings_Video, false}, + {NeoSettings_Crosshair, true}, }; static const wchar_t *WSZ_TABS_LABELS[ARRAYSIZE(P_FN)] = { L"Multiplayer", L"Keybinds", L"Mouse", L"Audio", L"Video", L"Crosshair" @@ -721,13 +726,19 @@ void CNeoRoot::MainLoopSettings(const MainLoopParam param) NeoUI::Tabs(WSZ_TABS_LABELS, ARRAYSIZE(WSZ_TABS_LABELS), &m_ns.iCurTab); } NeoUI::EndSection(); - g_uiCtx.dPanel.y += g_uiCtx.dPanel.tall; - g_uiCtx.dPanel.tall = g_uiCtx.iRowTall * g_iRowsInScreen; - NeoUI::BeginSection(true); + if (!P_FN[m_ns.iCurTab].bUISectionManaged) + { + g_uiCtx.dPanel.y += g_uiCtx.dPanel.tall; + g_uiCtx.dPanel.tall = g_uiCtx.iRowTall * g_iRowsInScreen; + NeoUI::BeginSection(true); + } { - P_FN[m_ns.iCurTab](&m_ns); + P_FN[m_ns.iCurTab].func(&m_ns); + } + if (!P_FN[m_ns.iCurTab].bUISectionManaged) + { + NeoUI::EndSection(); } - NeoUI::EndSection(); g_uiCtx.dPanel.y += g_uiCtx.dPanel.tall; g_uiCtx.dPanel.tall = g_uiCtx.iRowTall; NeoUI::BeginSection(); diff --git a/mp/src/game/client/neo/ui/neo_root_settings.cpp b/mp/src/game/client/neo/ui/neo_root_settings.cpp index fa71a0944..2768fd070 100644 --- a/mp/src/game/client/neo/ui/neo_root_settings.cpp +++ b/mp/src/game/client/neo/ui/neo_root_settings.cpp @@ -33,6 +33,7 @@ extern ConVar hud_fastswitch; extern ConVar neo_cl_toggleconsole; extern NeoUI::Context g_uiCtx; +extern int g_iRowsInScreen; const wchar_t *QUALITY_LABELS[] = { L"Low", @@ -338,7 +339,9 @@ void NeoSettingsRestore(NeoSettings *ns) pCrosshair->info.color[1] = (uint8)(cvr->neo_cl_crosshair_color_g.GetInt()); pCrosshair->info.color[2] = (uint8)(cvr->neo_cl_crosshair_color_b.GetInt()); pCrosshair->info.color[3] = (uint8)(cvr->neo_cl_crosshair_color_a.GetInt()); + pCrosshair->info.iESizeType = cvr->neo_cl_crosshair_size_type.GetInt(); pCrosshair->info.iSize = cvr->neo_cl_crosshair_size.GetInt(); + pCrosshair->info.flScrSize = cvr->neo_cl_crosshair_size_screen.GetFloat(); pCrosshair->info.iThick = cvr->neo_cl_crosshair_thickness.GetInt(); pCrosshair->info.iGap = cvr->neo_cl_crosshair_gap.GetInt(); pCrosshair->info.iOutline = cvr->neo_cl_crosshair_outline.GetInt(); @@ -510,7 +513,9 @@ void NeoSettingsSave(const NeoSettings *ns) cvr->neo_cl_crosshair_color_g.SetValue(pCrosshair->info.color.g()); cvr->neo_cl_crosshair_color_b.SetValue(pCrosshair->info.color.b()); cvr->neo_cl_crosshair_color_a.SetValue(pCrosshair->info.color.a()); + cvr->neo_cl_crosshair_size_type.SetValue(pCrosshair->info.iESizeType); cvr->neo_cl_crosshair_size.SetValue(pCrosshair->info.iSize); + cvr->neo_cl_crosshair_size_screen.SetValue(pCrosshair->info.flScrSize); cvr->neo_cl_crosshair_thickness.SetValue(pCrosshair->info.iThick); cvr->neo_cl_crosshair_gap.SetValue(pCrosshair->info.iGap); cvr->neo_cl_crosshair_outline.SetValue(pCrosshair->info.iOutline); @@ -672,14 +677,14 @@ void NeoSettings_Video(NeoSettings *ns) void NeoSettings_Crosshair(NeoSettings *ns) { - NeoSettings::Crosshair *pCrosshair = &ns->crosshair; - NeoUI::RingBox(L"Crosshair style", CROSSHAIR_LABELS, CROSSHAIR_STYLE__TOTAL, &pCrosshair->iStyle); - NeoUI::SliderU8(L"Red", &pCrosshair->info.color[0], 0, UCHAR_MAX); - NeoUI::SliderU8(L"Green", &pCrosshair->info.color[1], 0, UCHAR_MAX); - NeoUI::SliderU8(L"Blue", &pCrosshair->info.color[2], 0, UCHAR_MAX); - NeoUI::SliderU8(L"Alpha", &pCrosshair->info.color[3], 0, UCHAR_MAX); + static constexpr int IVIEW_ROWS = 5; - if (CROSSHAIR_FILES[pCrosshair->iStyle][0]) + g_uiCtx.dPanel.y += g_uiCtx.dPanel.tall; + g_uiCtx.dPanel.tall = g_uiCtx.iRowTall * IVIEW_ROWS; + NeoUI::BeginSection(); + NeoSettings::Crosshair *pCrosshair = &ns->crosshair; + const bool bTextured = CROSSHAIR_FILES[pCrosshair->iStyle][0]; + if (bTextured) { NeoSettings::Crosshair::Texture *pTex = &ns->crosshair.arTextures[pCrosshair->iStyle]; vgui::surface()->DrawSetTexture(pTex->iTexId); @@ -692,7 +697,28 @@ void NeoSettings_Crosshair(NeoSettings *ns) } else { - NeoUI::SliderInt(L"Size", &pCrosshair->info.iSize, 0, CROSSHAIR_MAX_SIZE); + PaintCrosshair(pCrosshair->info, + g_uiCtx.dPanel.x + g_uiCtx.iLayoutX + (g_uiCtx.dPanel.wide / 2), + g_uiCtx.dPanel.y + g_uiCtx.iLayoutY + (g_uiCtx.dPanel.tall / 2)); + } + NeoUI::EndSection(); + + g_uiCtx.dPanel.y += g_uiCtx.dPanel.tall; + g_uiCtx.dPanel.tall = g_uiCtx.iRowTall * (g_iRowsInScreen - IVIEW_ROWS); + NeoUI::BeginSection(true); + NeoUI::RingBox(L"Crosshair style", CROSSHAIR_LABELS, CROSSHAIR_STYLE__TOTAL, &pCrosshair->iStyle); + NeoUI::SliderU8(L"Red", &pCrosshair->info.color[0], 0, UCHAR_MAX); + NeoUI::SliderU8(L"Green", &pCrosshair->info.color[1], 0, UCHAR_MAX); + NeoUI::SliderU8(L"Blue", &pCrosshair->info.color[2], 0, UCHAR_MAX); + NeoUI::SliderU8(L"Alpha", &pCrosshair->info.color[3], 0, UCHAR_MAX); + if (!bTextured) + { + NeoUI::RingBox(L"Size type", CROSSHAIR_SIZETYPE_LABELS, CROSSHAIR_SIZETYPE__TOTAL, &pCrosshair->info.iESizeType); + switch (pCrosshair->info.iESizeType) + { + case CROSSHAIR_SIZETYPE_ABSOLUTE: NeoUI::SliderInt(L"Size", &pCrosshair->info.iSize, 0, CROSSHAIR_MAX_SIZE); break; + case CROSSHAIR_SIZETYPE_SCREEN: NeoUI::Slider(L"Size", &pCrosshair->info.flScrSize, 0.0f, 1.0f, 5, 0.01f); break; + } NeoUI::SliderInt(L"Thickness", &pCrosshair->info.iThick, 0, CROSSHAIR_MAX_THICKNESS); NeoUI::SliderInt(L"Gap", &pCrosshair->info.iGap, 0, CROSSHAIR_MAX_GAP); NeoUI::SliderInt(L"Outline", &pCrosshair->info.iOutline, 0, CROSSHAIR_MAX_OUTLINE); @@ -700,9 +726,6 @@ void NeoSettings_Crosshair(NeoSettings *ns) NeoUI::RingBoxBool(L"Draw top line", &pCrosshair->info.bTopLine); NeoUI::SliderInt(L"Circle radius", &pCrosshair->info.iCircleRad, 0, CROSSHAIR_MAX_CIRCLE_RAD); NeoUI::SliderInt(L"Circle segments", &pCrosshair->info.iCircleSegments, 0, CROSSHAIR_MAX_CIRCLE_SEGMENTS); - - PaintCrosshair(pCrosshair->info, - g_uiCtx.dPanel.x + g_uiCtx.iLayoutX + (g_uiCtx.dPanel.wide / 2), - g_uiCtx.dPanel.y + g_uiCtx.iLayoutY + (pCrosshair->info.iSize * 2)); } + NeoUI::EndSection(); } diff --git a/mp/src/game/client/neo/ui/neo_root_settings.h b/mp/src/game/client/neo/ui/neo_root_settings.h index 79c77b431..8a6ff5434 100644 --- a/mp/src/game/client/neo/ui/neo_root_settings.h +++ b/mp/src/game/client/neo/ui/neo_root_settings.h @@ -165,7 +165,9 @@ struct NeoSettings CONVARREF_DEF(neo_cl_crosshair_color_g); CONVARREF_DEF(neo_cl_crosshair_color_b); CONVARREF_DEF(neo_cl_crosshair_color_a); + CONVARREF_DEF(neo_cl_crosshair_size_type); CONVARREF_DEF(neo_cl_crosshair_size); + CONVARREF_DEF(neo_cl_crosshair_size_screen); CONVARREF_DEF(neo_cl_crosshair_thickness); CONVARREF_DEF(neo_cl_crosshair_gap); CONVARREF_DEF(neo_cl_crosshair_outline);