Skip to content

Commit

Permalink
Abs/Screen half sizing, self managed NeoUI section
Browse files Browse the repository at this point in the history
  • Loading branch information
nullsystem committed Sep 27, 2024
1 parent a461307 commit 83a64a4
Show file tree
Hide file tree
Showing 6 changed files with 119 additions and 53 deletions.
2 changes: 2 additions & 0 deletions mp/src/game/client/hud_crosshair.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand Down
69 changes: 42 additions & 27 deletions mp/src/game/client/neo/ui/neo_hud_crosshair.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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)
{
Expand Down
15 changes: 14 additions & 1 deletion mp/src/game/client/neo/ui/neo_hud_crosshair.h
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down
37 changes: 24 additions & 13 deletions mp/src/game/client/neo/ui/neo_root.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -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"
Expand All @@ -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();
Expand Down
47 changes: 35 additions & 12 deletions mp/src/game/client/neo/ui/neo_root_settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand All @@ -692,17 +697,35 @@ 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);
NeoUI::SliderInt(L"Center dot", &pCrosshair->info.iCenterDot, 0, CROSSHAIR_MAX_CENTER_DOT);
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();
}
2 changes: 2 additions & 0 deletions mp/src/game/client/neo/ui/neo_root_settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 83a64a4

Please sign in to comment.