]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
strafehud: fix switch indicator positioning when using projection
authorJuhu <5894800-Juhu_@users.noreply.gitlab.com>
Wed, 25 Jan 2023 19:33:19 +0000 (20:33 +0100)
committerJuhu <5894800-Juhu_@users.noreply.gitlab.com>
Tue, 4 Apr 2023 18:05:36 +0000 (20:05 +0200)
qcsrc/client/hud/panel/strafehud.qc
qcsrc/client/hud/panel/strafehud.qh

index 9a2c90d14ad8d0cabb73425ca5ccdc21551f42cc..edec4fb006b8acfe2f162f34a65be38a4b1b4c60 100644 (file)
@@ -761,6 +761,9 @@ void HUD_StrafeHUD()
                                float offset = !odd_angles ? bestangle_offset : odd_bestangle_offset;
                                float switch_offset = !odd_angles ? switch_bestangle_offset : switch_odd_bestangle_offset;
 
+                               offset = StrafeHUD_projectOffset(offset, hudangle);
+                               switch_offset = StrafeHUD_projectOffset(switch_offset, hudangle);
+
                                // remove switch indicator width from offset
                                if(direction == STRAFEHUD_DIRECTION_LEFT)
                                {
@@ -1209,7 +1212,7 @@ float StrafeHUD_projectWidth(float offset, float width, float range)
 }
 
 // functions to make hud elements align perfectly in the hud area
-void HUD_Panel_DrawStrafeHUD(float offset, float width, float hidden_width, vector color, float alpha, int type, int gradientType, bool projectWidth, float range)
+void HUD_Panel_DrawStrafeHUD(float offset, float width, float hidden_width, vector color, float alpha, int type, int gradientType, bool doProject, float range)
 {
        float mirror_offset, mirror_width;
        vector size = panel_size;
@@ -1246,8 +1249,11 @@ void HUD_Panel_DrawStrafeHUD(float offset, float width, float hidden_width, vect
 
        vector original_size = size;
        float original_offset = offset;
-       if(projectWidth && size.x > 0) size.x = StrafeHUD_projectWidth(offset, size.x, range);
-       offset = StrafeHUD_projectOffset(offset, range);
+       if(doProject)
+       {
+               if(size.x > 0) size.x = StrafeHUD_projectWidth(offset, size.x, range);
+               offset = StrafeHUD_projectOffset(offset, range);
+       }
 
        if(mirror_offset < 0)
        {
@@ -1265,8 +1271,11 @@ void HUD_Panel_DrawStrafeHUD(float offset, float width, float hidden_width, vect
 
        vector original_mirror_size = mirror_size;
        float original_mirror_offset = mirror_offset;
-       if(projectWidth && mirror_size.x > 0) mirror_size.x = StrafeHUD_projectWidth(mirror_offset, mirror_size.x, range);
-       mirror_offset = StrafeHUD_projectOffset(mirror_offset, range);
+       if(doProject)
+       {
+               if(mirror_size.x > 0) mirror_size.x = StrafeHUD_projectWidth(mirror_offset, mirror_size.x, range);
+               mirror_offset = StrafeHUD_projectOffset(mirror_offset, range);
+       }
 
        switch(type)
        {
@@ -1323,12 +1332,12 @@ void HUD_Panel_DrawStrafeHUD(float offset, float width, float hidden_width, vect
                        StrafeHUD_drawGradient(
                                color, autocvar_hud_panel_strafehud_bar_neutral_color,
                                original_mirror_size, original_width, original_mirror_offset,
-                               alpha, gradient_mirror_offset, gradientType, range);
+                               alpha, gradient_mirror_offset, gradientType, doProject, range);
 
                        StrafeHUD_drawGradient(
                                color, autocvar_hud_panel_strafehud_bar_neutral_color,
                                original_size, original_width, original_offset,
-                               alpha, gradient_offset, gradientType, range);
+                               alpha, gradient_offset, gradientType, doProject, range);
        }
 }
 
@@ -1343,7 +1352,7 @@ vector StrafeHUD_mixColors(vector color1, vector color2, float ratio)
        return mixedColor;
 }
 
-void StrafeHUD_drawGradient(vector color1, vector color2, vector size, float original_width, float offset, float alpha, float gradientOffset, int gradientType, float range)
+void StrafeHUD_drawGradient(vector color1, vector color2, vector size, float original_width, float offset, float alpha, float gradientOffset, int gradientType, bool doProject, float range)
 {
        float color_ratio, alpha1, alpha2;
        vector segment_size = size;
@@ -1354,10 +1363,13 @@ void StrafeHUD_drawGradient(vector color1, vector color2, vector size, float ori
        for(int i = 0; i < size.x; ++i)
        {
                float ratio, alpha_ratio, combine_ratio1, combine_ratio2, segment_offset;
-               segment_offset = offset + i;
                segment_size.x = min(size.x - i, 1); // each gradient segment is 1 unit wide except if there is less than 1 unit of gradient remaining
-               segment_size.x = StrafeHUD_projectWidth(segment_offset, segment_size.x, range);
-               segment_offset = StrafeHUD_projectOffset(segment_offset, range);
+               segment_offset = offset + i;
+               if(doProject)
+               {
+                       segment_size.x = StrafeHUD_projectWidth(segment_offset, segment_size.x, range);
+                       segment_offset = StrafeHUD_projectOffset(segment_offset, range);
+               }
                ratio = (i + segment_size.x / 2 + gradientOffset) / original_width * (gradientType == STRAFEHUD_GRADIENT_BOTH ? 2 : 1);
                if(ratio > 1) ratio = 2 - ratio;
                if(gradientType != STRAFEHUD_GRADIENT_RIGHT) ratio = 1 - ratio;
index d5a9f6bddaf5f2497329dede8ca2133a018bd3d8..19959b7f9732501154dccbc91962ba8a8cf321ce 100644 (file)
@@ -77,7 +77,7 @@ int autocvar_hud_panel_strafehud_projection = 0;
 
 void HUD_Panel_DrawStrafeHUD(float, float, float, vector, float, int, int, bool, float);
 vector StrafeHUD_mixColors(vector, vector, float);
-void StrafeHUD_drawGradient(vector, vector, vector, float, float, float, float, int, float);
+void StrafeHUD_drawGradient(vector, vector, vector, float, float, float, float, int, bool, float);
 float GetLengthUnitFactor(int);
 string GetLengthUnit(int);
 void StrafeHUD_drawStrafeArrow(vector, float, vector, float, bool, float);