From 33317e349688acbe21e895f4a6a7ba5f0539ad72 Mon Sep 17 00:00:00 2001 From: Juhu <5894800-Juhu_@users.noreply.gitlab.com> Date: Tue, 24 Dec 2024 17:48:43 +0100 Subject: [PATCH] strafehud: refactored the fast gradient and added fast gradient support for non-linear projection, this gradient is now the default --- _hud_common.cfg | 2 +- qcsrc/client/hud/panel/strafehud.qh | 2 +- qcsrc/client/hud/panel/strafehud/draw.qc | 63 +++++++++++++++--------- qcsrc/client/hud/panel/strafehud/draw.qh | 2 +- 4 files changed, 43 insertions(+), 26 deletions(-) diff --git a/_hud_common.cfg b/_hud_common.cfg index e2c5bb2a6..0ac7c7d0a 100644 --- a/_hud_common.cfg +++ b/_hud_common.cfg @@ -168,7 +168,7 @@ seta _hud_panel_strafehud_demo "0" "strafehud changes angle during configure" seta hud_panel_strafehud_mode "0" "strafehud mode which controls whether the strafehud is centered at 0 = view angle, 1 = velocity angle" seta hud_panel_strafehud_range "90" "the angle range up to 360 degrees displayed on the strafehud, -1 = current fov, 0 = dynamic (chooses the minimum range required to still see the whole area needed for accelerating)" seta hud_panel_strafehud_range_sidestrafe "-2" "the angle range up to 360 degrees displayed on the strafehud when side strafing, 0 = dynamic (chooses the minimum range required to still see the whole area needed for accelerating), -1 = current fov, -2 = same as the normal range" -seta hud_panel_strafehud_style "2" "0 = no styling, 1 = progress bar style for the strafe bar, 2 = gradient for the strafe bar, 3 = fast gradient for the strafe bar (requires linear projection mode)" +seta hud_panel_strafehud_style "3" "0 = no styling, 1 = progress bar style for the strafe bar, 2 = gradient for the strafe bar, 3 = fast gradient for the strafe bar (gradient itself will not be projected)" seta hud_panel_strafehud_unit_show "1" "show units" seta hud_panel_strafehud_onground_mode "2" "handling of landing at speeds where friction is higher than optimal acceleration, 0 = fill the whole hud with overturn, 1 = show zones regardless, 2 = show the zones as if airborne (useful for quake2 and quake3 physics)" seta hud_panel_strafehud_onground_friction "1" "set to 1 to account for friction in calculations" diff --git a/qcsrc/client/hud/panel/strafehud.qh b/qcsrc/client/hud/panel/strafehud.qh index 82e14884c..8ec7394d4 100644 --- a/qcsrc/client/hud/panel/strafehud.qh +++ b/qcsrc/client/hud/panel/strafehud.qh @@ -11,7 +11,7 @@ bool autocvar_hud_panel_strafehud_dynamichud = true; int autocvar_hud_panel_strafehud_mode = 0; float autocvar_hud_panel_strafehud_range = 90; float autocvar_hud_panel_strafehud_range_sidestrafe = -2; -int autocvar_hud_panel_strafehud_style = 2; +int autocvar_hud_panel_strafehud_style = 3; bool autocvar_hud_panel_strafehud_unit_show = true; int autocvar_hud_panel_strafehud_onground_mode = 2; bool autocvar_hud_panel_strafehud_onground_friction = true; diff --git a/qcsrc/client/hud/panel/strafehud/draw.qc b/qcsrc/client/hud/panel/strafehud/draw.qc index 7924450ea..96de0b54f 100644 --- a/qcsrc/client/hud/panel/strafehud/draw.qc +++ b/qcsrc/client/hud/panel/strafehud/draw.qc @@ -12,7 +12,7 @@ void StrafeHUD_DrawStrafeHUD(float startangle, float offsetangle, vector color, float mirror_offset; float mirror_width; - if(type == STRAFEHUD_STYLE_GRADIENT || type == STRAFEHUD_STYLE_FAST_GRADIENT) + if(type == STRAFEHUD_STYLE_GRADIENT) { project_width = true; // must be fully projected for gradients if(gradient_type == STRAFEHUD_GRADIENT_NONE) @@ -52,10 +52,15 @@ void StrafeHUD_DrawStrafeHUD(float startangle, float offsetangle, vector color, size.x = width; float original_offset = offset; - if(project_width && size.x > 0) - size.x = StrafeHUD_ProjectWidth(offset, size.x, range); - offset = StrafeHUD_ProjectOffset(offset, range, false); + // the fast gradient does the projection later + if(type != STRAFEHUD_STYLE_FAST_GRADIENT) + { + if(project_width && size.x > 0) + size.x = StrafeHUD_ProjectWidth(offset, size.x, range); + + offset = StrafeHUD_ProjectOffset(offset, range, false); + } if(mirror_offset < 0) { @@ -74,10 +79,15 @@ void StrafeHUD_DrawStrafeHUD(float startangle, float offsetangle, vector color, mirror_size.x = mirror_width; float original_mirror_offset = mirror_offset; - if(project_width && mirror_size.x > 0) - mirror_size.x = StrafeHUD_ProjectWidth(mirror_offset, mirror_size.x, range); - mirror_offset = StrafeHUD_ProjectOffset(mirror_offset, range, false); + // the fast gradient does the projection later + if(type != STRAFEHUD_STYLE_FAST_GRADIENT) + { + if(project_width && mirror_size.x > 0) + mirror_size.x = StrafeHUD_ProjectWidth(mirror_offset, mirror_size.x, range); + + mirror_offset = StrafeHUD_ProjectOffset(mirror_offset, range, false); + } switch(type) { @@ -132,19 +142,19 @@ void StrafeHUD_DrawStrafeHUD(float startangle, float offsetangle, vector color, gradient_mirror_offset = 0; } - if(type == STRAFEHUD_STYLE_FAST_GRADIENT && autocvar_hud_panel_strafehud_projection == STRAFEHUD_PROJECTION_LINEAR) + if(type == STRAFEHUD_STYLE_FAST_GRADIENT) { if(mirror_size.x > 0) StrafeHUD_DrawGradientFast( color, autocvar_hud_panel_strafehud_bar_neutral_color, mirror_size, original_width, mirror_offset, alpha, - gradient_mirror_offset, gradient_type); + gradient_mirror_offset, gradient_type, range); if(size.x > 0) StrafeHUD_DrawGradientFast( color, autocvar_hud_panel_strafehud_bar_neutral_color, size, original_width, offset, alpha, - gradient_offset, gradient_type); + gradient_offset, gradient_type, range); } else { @@ -198,7 +208,7 @@ void StrafeHUD_DrawGradient(vector color1, vector color2, vector size, float ori } // optimized gradient, does not work with projection modes other than linear, decreased visual fidelity -void StrafeHUD_DrawGradientFast(vector color1, vector color2, vector size, float original_width, float offset, float alpha, float gradient_offset, int gradient_type) +void StrafeHUD_DrawGradientFast(vector color1, vector color2, vector size, float original_width, float offset, float alpha, float gradient_offset, int gradient_type, float range) { if(gradient_type == STRAFEHUD_GRADIENT_BOTH) { @@ -211,14 +221,20 @@ void StrafeHUD_DrawGradientFast(vector color1, vector color2, vector size, float size2.x = size.x - size1.x; if(size1.x > 0) - StrafeHUD_DrawGradientFast(color1, color2, size1, original_width, offset, alpha, gradient_offset, STRAFEHUD_GRADIENT_LEFT); + StrafeHUD_DrawGradientFast(color1, color2, size1, original_width, offset, alpha, gradient_offset, STRAFEHUD_GRADIENT_LEFT, range); if(size2.x > 0) - StrafeHUD_DrawGradientFast(color1, color2, size2, original_width, offset + size1.x, alpha, max(0, gradient_offset - original_width), STRAFEHUD_GRADIENT_RIGHT); + StrafeHUD_DrawGradientFast(color1, color2, size2, original_width, offset + size1.x, alpha, max(0, gradient_offset - original_width), STRAFEHUD_GRADIENT_RIGHT, range); return; } + vector gradient_start = eX * offset; + float gradient_width = StrafeHUD_ProjectWidth(gradient_start.x, size.x, range); + gradient_start.x = StrafeHUD_ProjectOffset(gradient_start.x, range, false); + vector gradient_end = gradient_start + eX * gradient_width; + vector gradient_height = eY * size.y; + float alpha1 = bound(0, alpha, 1); float alpha2 = bound(0, autocvar_hud_panel_strafehud_bar_neutral_alpha * panel_fg_alpha, 1); if((alpha1 + alpha2) == 0) return; @@ -232,21 +248,22 @@ void StrafeHUD_DrawGradientFast(vector color1, vector color2, vector size, float ratio2 = 1 - ratio2; vector origin = HUD_Shift(panel_pos); - offset = HUD_ScaleX(offset); - size = HUD_Scale(size); + gradient_start.x = HUD_ScaleX(gradient_start.x); + gradient_end.x = HUD_ScaleX(gradient_end.x); + gradient_height.y = HUD_ScaleY(gradient_height.y); R_BeginPolygon("", DRAWFLAG_NORMAL, true); - R_PolygonVertex(origin + eX * offset, '0 0 0', color1, alpha1 * (1 - ratio1)); - R_PolygonVertex(origin + eX * offset + eY * size.y, '0 0 0', color1, alpha1 * (1 - ratio1)); - R_PolygonVertex(origin + eX * (offset + size.x) + eY * size.y, '0 0 0', color1, alpha1 * (1 - ratio2)); - R_PolygonVertex(origin + eX * (offset + size.x), '0 0 0', color1, alpha1 * (1 - ratio2)); + R_PolygonVertex(origin + gradient_start, '0 0 0', color1, alpha1 * (1 - ratio1)); + R_PolygonVertex(origin + gradient_start + gradient_height, '0 0 0', color1, alpha1 * (1 - ratio1)); + R_PolygonVertex(origin + gradient_end + gradient_height, '0 0 0', color1, alpha1 * (1 - ratio2)); + R_PolygonVertex(origin + gradient_end, '0 0 0', color1, alpha1 * (1 - ratio2)); R_EndPolygon(); R_BeginPolygon("", DRAWFLAG_NORMAL, true); - R_PolygonVertex(origin + eX * offset, '0 0 0', color2, alpha2 * ratio1); - R_PolygonVertex(origin + eX * offset + eY * size.y, '0 0 0', color2, alpha2 * ratio1); - R_PolygonVertex(origin + eX * (offset + size.x) + eY * size.y, '0 0 0', color2, alpha2 * ratio2); - R_PolygonVertex(origin + eX * (offset + size.x), '0 0 0', color2, alpha2 * ratio2); + R_PolygonVertex(origin + gradient_start, '0 0 0', color2, alpha2 * ratio1); + R_PolygonVertex(origin + gradient_start + gradient_height, '0 0 0', color2, alpha2 * ratio1); + R_PolygonVertex(origin + gradient_end + gradient_height, '0 0 0', color2, alpha2 * ratio2); + R_PolygonVertex(origin + gradient_end, '0 0 0', color2, alpha2 * ratio2); R_EndPolygon(); } diff --git a/qcsrc/client/hud/panel/strafehud/draw.qh b/qcsrc/client/hud/panel/strafehud/draw.qh index b3d140fcf..57b522bd4 100644 --- a/qcsrc/client/hud/panel/strafehud/draw.qh +++ b/qcsrc/client/hud/panel/strafehud/draw.qh @@ -3,7 +3,7 @@ void StrafeHUD_DrawStrafeHUD(float, float, vector, float, int, int, bool, float); void StrafeHUD_DrawGradient(vector, vector, vector, float, float, float, float, float, int, float); -void StrafeHUD_DrawGradientFast(vector, vector, vector, float, float, float, float, int); +void StrafeHUD_DrawGradientFast(vector, vector, vector, float, float, float, float, int, float); void StrafeHUD_DrawStrafeArrow(vector, float, vector, float, bool, float); void StrafeHUD_DrawTextIndicator(string, float, vector, float, float, vector, float, float); vector StrafeHUD_CalculateTextIndicatorPosition(vector); -- 2.39.2