]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/client/hud/panel/strafehud.qc
strafehud: improve visual fidelity of arrows
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / hud / panel / strafehud.qc
index eada3b57dfb173f35b9beeadbafe9e0787570d21..86827b62b8c6ea923ca10a8b7f4c16432c814054 100644 (file)
@@ -705,37 +705,13 @@ void HUD_StrafeHUD()
 
             if(autocvar_hud_panel_strafehud_angle_arrow > 0)
             {
-                vector arrow_size = currentangle_size;
-                arrow_size.x = panel_size.x * autocvar_hud_panel_strafehud_angle_arrow_width;
-                arrow_size.y = panel_size.y * min(autocvar_hud_panel_strafehud_angle_arrow_height, 10);
-                vector arrow_fragment = '0 0.2 0';
-
-                if(arrow_size.x > 0 && arrow_size.y > 0)
+                float arrow_size = panel_size.y * min(autocvar_hud_panel_strafehud_angle_arrow_size, 10); // there's only one size cvar, arrows always have a 45° angle to ensure proper rendering without antialiasing
+                if(arrow_size > 0)
                 {
-                    // find a suitable fragment size to draw all the parts evenly
-                    float fragment_divisor1 = arrow_size.y / arrow_fragment.y;
-                    float fragment_divisor2 = fragment_divisor1 - floor(fragment_divisor1);
-                    fragment_divisor1 = floor(fragment_divisor1);
-                    if(fragment_divisor1 >= 1)
-                    {
-                        if(fragment_divisor2 < 0.5)
-                            arrow_fragment.y += arrow_fragment.y * fragment_divisor2 / fragment_divisor1;
-                        else
-                            arrow_fragment.y -= arrow_fragment.y * (1 - fragment_divisor2) / (fragment_divisor1 + 1);
-                    }
-                    else
-                    {
-                        arrow_fragment.y = arrow_size.y;
-                    }
-
-                    for(float i = arrow_size.y; i > 0; i -= arrow_fragment.y)
-                    {
-                        arrow_fragment.x = arrow_size.x * (i/arrow_size.y);
-                        if(autocvar_hud_panel_strafehud_angle_arrow == 1 || autocvar_hud_panel_strafehud_angle_arrow >= 3)
-                            drawfill(panel_pos - eY * ((currentangle_size.y - panel_size.y) / 2 + i) + eX * (currentangle_offset - arrow_fragment.x/2), arrow_fragment, currentangle_color, autocvar_hud_panel_strafehud_angle_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
-                        if(autocvar_hud_panel_strafehud_angle_arrow >= 2)
-                            drawfill(panel_pos + eY * (-(currentangle_size.y - panel_size.y) / 2 + currentangle_size.y + i - arrow_fragment.y) + eX * (currentangle_offset - arrow_fragment.x/2), arrow_fragment, currentangle_color, autocvar_hud_panel_strafehud_angle_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
-                    }
+                    if(autocvar_hud_panel_strafehud_angle_arrow == 1 || autocvar_hud_panel_strafehud_angle_arrow >= 3)
+                        StrafeHUD_drawStrafeArrow(panel_pos + eY * ((panel_size.y - currentangle_size.y) / 2) + eX * currentangle_offset, arrow_size, currentangle_color, autocvar_hud_panel_strafehud_angle_alpha * panel_fg_alpha, true);
+                    if(autocvar_hud_panel_strafehud_angle_arrow >= 2)
+                        StrafeHUD_drawStrafeArrow(panel_pos + eY * ((panel_size.y - currentangle_size.y) / 2 + currentangle_size.y) + eX * currentangle_offset, arrow_size, currentangle_color, autocvar_hud_panel_strafehud_angle_alpha * panel_fg_alpha, false);
                 }
             }
         }
@@ -968,6 +944,17 @@ void StrafeHUD_drawGradient(vector color1, vector color2, vector size, float ori
     }
 }
 
+// draw the strafe arrows (inspired by drawspritearrow() in common/mutators/mutator/waypoints/waypointsprites.qc)
+void StrafeHUD_drawStrafeArrow(vector origin, float size, vector color, float alpha, bool flipped)
+{
+    if(flipped) origin -= size*eY;
+    R_BeginPolygon("", DRAWFLAG_NORMAL, true);
+    R_PolygonVertex(origin + (flipped ? size*eY : '0 0 0')          , '0 0 0', color, alpha);
+    R_PolygonVertex(origin + (flipped ? '0 0 0' : size*eY) - size*eX, '0 0 0', color, alpha);
+    R_PolygonVertex(origin + (flipped ? '0 0 0' : size*eY) + size*eX, '0 0 0', color, alpha);
+    R_EndPolygon();
+}
+
 // length unit conversion (km and miles are only included to match the GetSpeedUnit* functions)
 float GetLengthUnitFactor(int length_unit)
 {