Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
draw_core.qc
Go to the documentation of this file.
1#include "draw_core.qh"
2
3#include <client/draw.qh>
4
6 float shiftangle, float wishangle, float absolute_bestangle,
7 float absolute_prebestangle, float absolute_overturnangle,
8 bool moving, float hudangle)
9{
10 // the neutral zone fills the whole strafe bar
11 if (!moving)
12 {
13 // draw neutral zone
15 {
17 {
18 default:
25 break;
26
29 panel_pos, panel_size, "progressbar", 1, 0, 0,
33 break;
34 }
35 }
36 }
37 else
38 {
39 // calculate various zones of the strafe-o-meter
40 float accelzone_left_startangle;
41 float accelzone_right_startangle;
42 float preaccelzone_left_startangle;
43 float preaccelzone_right_startangle;
44 float neutral_startangle;
45 float overturn_startangle;
46
47 float accelzone_offsetangle = absolute_overturnangle - absolute_bestangle;
48 float preaccelzone_offsetangle = fabs(absolute_bestangle - absolute_prebestangle);
49 float neutral_offsetangle = 360;
50 float overturn_offsetangle = 360 - absolute_overturnangle * 2;
51
53 preaccelzone_offsetangle = 0;
54
55 // assign starting angles and shift the current offset for every element
56 float current_startangle = 0;
57
58 preaccelzone_right_startangle = current_startangle;
59 current_startangle += preaccelzone_offsetangle;
60
61 accelzone_right_startangle = current_startangle;
62 current_startangle += accelzone_offsetangle;
63
64 overturn_startangle = current_startangle;
65 current_startangle += overturn_offsetangle;
66
67 accelzone_left_startangle = current_startangle;
68 current_startangle += accelzone_offsetangle;
69
70 preaccelzone_left_startangle = current_startangle;
71 current_startangle += preaccelzone_offsetangle;
72
73 neutral_startangle = current_startangle;
74 neutral_offsetangle = 360 - current_startangle;
75
76 // calculate how far off-center the strafe zones currently are
77 shiftangle += neutral_offsetangle * 0.5 - wishangle;
78
79 // shift strafe zones into correct place
80 neutral_startangle += shiftangle;
81 accelzone_left_startangle += shiftangle;
82 accelzone_right_startangle += shiftangle;
83 preaccelzone_left_startangle += shiftangle;
84 preaccelzone_right_startangle += shiftangle;
85 overturn_startangle += shiftangle;
86
87 // draw left acceleration zone
88 if (accelzone_offsetangle > 0)
90 accelzone_left_startangle, accelzone_offsetangle,
94 hudangle);
95 if (autocvar_hud_panel_strafehud_bar_preaccel && preaccelzone_offsetangle > 0)
97 preaccelzone_left_startangle, preaccelzone_offsetangle,
101 hudangle);
102
103 // draw right acceleration zone
104 if (accelzone_offsetangle > 0)
106 accelzone_right_startangle, accelzone_offsetangle,
110 hudangle);
111 if (autocvar_hud_panel_strafehud_bar_preaccel && preaccelzone_offsetangle > 0)
113 preaccelzone_right_startangle, preaccelzone_offsetangle,
117 hudangle);
118
119 // draw overturn zone
120 if (overturn_offsetangle > 0)
122 overturn_startangle, overturn_offsetangle,
126 hudangle);
127
128 // draw neutral zone
129 if (neutral_offsetangle > 0)
131 neutral_startangle, neutral_offsetangle,
135 hudangle);
136 }
137}
138
139// draw the actual strafe angle indicator
141 float angle, vector line_size, float arrow_size, int num_dashes,
142 bool has_top_arrow, bool has_bottom_arrow, vector color, float alpha, float hudangle)
143{
144 if (alpha <= 0)
145 return;
146
147 // bound to HUD area
148 angle = bound(hudangle * -0.5, angle, hudangle * 0.5);
149
150 float offset = StrafeHUD_AngleToOffset(angle, hudangle);
151 offset = StrafeHUD_ProjectOffset(offset, hudangle, false);
152
153 StrafeHUD_DrawAngleIndicatorLine(line_size, offset, num_dashes, color, alpha);
154
155 if (has_top_arrow)
156 StrafeHUD_DrawAngleIndicatorArrow(arrow_size, offset, line_size, color, alpha, true);
157
158 if (has_bottom_arrow)
159 StrafeHUD_DrawAngleIndicatorArrow(arrow_size, offset, line_size, color, alpha, false);
160}
161
162// draw the line of the angle indicator
163void StrafeHUD_DrawAngleIndicatorLine(vector size, float offset, int num_dashes, vector color, float alpha)
164{
165 if (num_dashes <= 0 || size.x <= 0 || size.y <= 0)
166 return;
167
168 vector segment_size = size;
169 segment_size.y = size.y / (bound(1, num_dashes, size.y) * 2 - 1);
170
171 for (float i = 0; i < size.y; i += segment_size.y * 2)
172 {
173 // check if last iteration
174 if (i + segment_size.y * 2 >= size.y)
175 segment_size.y = size.y - i;
176
177 drawfill(
178 panel_pos - eY * ((size.y - panel_size.y) * 0.5 - i) + eX * (offset - segment_size.x * 0.5),
179 segment_size, color, alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
180 }
181}
182
183// draw the arrows on the angle indicator
184void StrafeHUD_DrawAngleIndicatorArrow(float size, float offset, vector line_size, vector color, float alpha, bool top)
185{
186 if (size <= 0)
187 return;
188
189 if (top)
191 panel_pos + eY * ((panel_size.y - line_size.y) * 0.5) + eX * offset,
192 size, color, alpha * panel_fg_alpha, true, line_size.x);
193 else
195 panel_pos + eY * ((panel_size.y - line_size.y) * 0.5 + line_size.y) + eX * offset,
196 size, color, alpha * panel_fg_alpha, false, line_size.x);
197}
198
199// direction indicator
200void StrafeHUD_DrawDirectionIndicator(int direction, bool opposite_direction, bool fwd)
201{
202 vector direction_size_vertical;
203 direction_size_vertical.x = max(panel_size.y * min(autocvar_hud_panel_strafehud_direction_width, 1), 1);
204 direction_size_vertical.y = panel_size.y + direction_size_vertical.x * 2;
205 direction_size_vertical.z = 0;
206
207 vector direction_size_horizontal;
208 direction_size_horizontal.x = panel_size.x * min(autocvar_hud_panel_strafehud_direction_length, 0.5);
209 direction_size_horizontal.y = direction_size_vertical.x;
210 direction_size_horizontal.z = 0;
211
212 if (direction != STRAFEHUD_DIRECTION_NONE
213 && direction_size_vertical.x > 0
215 {
216 bool indicator_direction = direction == STRAFEHUD_DIRECTION_LEFT;
217
218 // invert left/right when strafing backwards or when strafing towards the opposite side indicated by the direction variable
219 // if both conditions are true then it's inverted twice hence not inverted at all
220 if (!fwd != opposite_direction)
221 indicator_direction = !indicator_direction;
222
223 // draw the direction indicator caps at the sides of the hud
224 // vertical line
225 if (direction_size_vertical.y > 0)
226 drawfill(
227 panel_pos - eY * direction_size_horizontal.y + eX * (indicator_direction ? -direction_size_vertical.x : panel_size.x),
228 direction_size_vertical, autocvar_hud_panel_strafehud_direction_color,
231
232 // top horizontal line
233 drawfill(
234 panel_pos + eX * (indicator_direction ? 0 : panel_size.x - direction_size_horizontal.x) - eY * direction_size_horizontal.y,
235 direction_size_horizontal, autocvar_hud_panel_strafehud_direction_color,
238
239 // bottom horizontal line
240 drawfill(
241 panel_pos + eX * (indicator_direction ? 0 : panel_size.x - direction_size_horizontal.x) + eY * panel_size.y,
242 direction_size_horizontal, autocvar_hud_panel_strafehud_direction_color,
245 }
246}
#define drawfill(position, size, rgb, alpha, flag)
Definition draw.qh:36
void StrafeHUD_DrawStrafeArrow(vector origin, float size, vector color, float alpha, bool flipped, float connection_width)
Definition draw.qc:284
void StrafeHUD_DrawStrafeHUD(float startangle, float offsetangle, vector color, float alpha, int type, int gradient_type, float range)
Definition draw.qc:8
float StrafeHUD_AngleToOffset(float angle, float range)
Definition util.qc:18
float StrafeHUD_ProjectOffset(float offset, float range, bool reverse)
Definition util.qc:61
float alpha
Definition items.qc:13
const float DRAWFLAG_NORMAL
vector size
void StrafeHUD_DrawStrafeMeter(float shiftangle, float wishangle, float absolute_bestangle, float absolute_prebestangle, float absolute_overturnangle, bool moving, float hudangle)
Definition draw_core.qc:5
void StrafeHUD_DrawAngleIndicatorLine(vector size, float offset, int num_dashes, vector color, float alpha)
Definition draw_core.qc:163
void StrafeHUD_DrawDirectionIndicator(int direction, bool opposite_direction, bool fwd)
Definition draw_core.qc:200
void StrafeHUD_DrawAngleIndicatorArrow(float size, float offset, vector line_size, vector color, float alpha, bool top)
Definition draw_core.qc:184
void StrafeHUD_DrawAngleIndicator(float angle, vector line_size, float arrow_size, int num_dashes, bool has_top_arrow, bool has_bottom_arrow, vector color, float alpha, float hudangle)
Definition draw_core.qc:140
vector color
Definition dynlight.qc:15
void HUD_Panel_DrawProgressBar(vector theOrigin, vector theSize, string pic, float length_ratio, bool vertical, float baralign, vector theColor, float theAlpha, int drawflag)
Definition hud.qc:269
vector panel_size
Definition hud.qh:163
float panel_fg_alpha
Definition hud.qh:169
vector panel_pos
Definition hud.qh:162
float angle
Definition viewloc.qc:114
float bound(float min, float value, float max)
float min(float f,...)
float fabs(float f)
float max(float f,...)
vector
Definition self.qh:92
vector autocvar_hud_panel_strafehud_bar_overturn_color
Definition strafehud.qh:28
float autocvar_hud_panel_strafehud_bar_overturn_alpha
Definition strafehud.qh:29
float autocvar_hud_panel_strafehud_direction_width
Definition strafehud.qh:72
const int STRAFEHUD_GRADIENT_RIGHT
Definition strafehud.qh:147
float autocvar_hud_panel_strafehud_direction_alpha
Definition strafehud.qh:71
float autocvar_hud_panel_strafehud_bar_preaccel_alpha
Definition strafehud.qh:23
const int STRAFEHUD_GRADIENT_NONE
Definition strafehud.qh:145
float autocvar_hud_panel_strafehud_bar_neutral_alpha
Definition strafehud.qh:25
const int STRAFEHUD_GRADIENT_BOTH
Definition strafehud.qh:148
float autocvar_hud_panel_strafehud_direction_length
Definition strafehud.qh:73
const int STRAFEHUD_STYLE_DRAWFILL
Definition strafehud.qh:140
const int STRAFEHUD_GRADIENT_LEFT
Definition strafehud.qh:146
int autocvar_hud_panel_strafehud_style
Definition strafehud.qh:11
vector autocvar_hud_panel_strafehud_bar_neutral_color
Definition strafehud.qh:24
bool autocvar_hud_panel_strafehud_bar_preaccel
Definition strafehud.qh:21
const int STRAFEHUD_STYLE_PROGRESSBAR
Definition strafehud.qh:141
vector autocvar_hud_panel_strafehud_bar_preaccel_color
Definition strafehud.qh:22
vector autocvar_hud_panel_strafehud_direction_color
Definition strafehud.qh:70
const int STRAFEHUD_DIRECTION_LEFT
Definition strafehud.qh:123
float autocvar_hud_panel_strafehud_bar_accel_alpha
Definition strafehud.qh:27
const int STRAFEHUD_DIRECTION_NONE
Definition strafehud.qh:122
vector autocvar_hud_panel_strafehud_bar_accel_color
Definition strafehud.qh:26
const vector eY
Definition vector.qh:45
const vector eX
Definition vector.qh:44