]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
strafehud: refactored the fast gradient and added fast gradient support for non-linea...
authorJuhu <5894800-Juhu_@users.noreply.gitlab.com>
Tue, 24 Dec 2024 16:48:43 +0000 (17:48 +0100)
committerJuhu <5894800-Juhu_@users.noreply.gitlab.com>
Tue, 24 Dec 2024 16:48:43 +0000 (17:48 +0100)
_hud_common.cfg
qcsrc/client/hud/panel/strafehud.qh
qcsrc/client/hud/panel/strafehud/draw.qc
qcsrc/client/hud/panel/strafehud/draw.qh

index e2c5bb2a6e55156c3dd72ca5cfd89b8e5e1c21a3..0ac7c7d0ab41b08ef525317dd73b6bb405e9af4d 100644 (file)
@@ -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"
index 82e14884cc1dbbfe5613a4eee6072730d1038fce..8ec7394d469ede65fa486bcb5f3ddb5c3db02369 100644 (file)
@@ -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;
index 7924450eae0b6943442af89d7b46b045b32ccfe6..96de0b54f99a0cdfb0a1504314a514e8eade96a3 100644 (file)
@@ -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();
 }
 
index b3d140fcf76c391681370da1e867ff34a8bce7d8..57b522bd4e0f5beff567eefd4b08f329d281468f 100644 (file)
@@ -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);