controls overlay
[carveJwlIkooP6JGAAIwe30JlM.git] / control_overlay.c
1 #include "control_overlay.h"
2 #include "model.h"
3 #include "input.h"
4 #include "player.h"
5 #include "player_skate.h"
6 #include "player_walk.h"
7 #include "shaders/model_menu.h"
8 #include "vg/vg_engine.h"
9 #include "vg/vg_mem.h"
10 #include "vg/vg_m.h"
11
12 struct control_overlay control_overlay = { .enabled = 1 };
13
14 void control_overlay_init(void)
15 {
16 void *alloc = vg_mem.rtmemory;
17 mdl_context *mdl = &control_overlay.mdl;
18
19 mdl_open( mdl, "models/rs_overlay.mdl", alloc );
20 mdl_load_metadata_block( mdl, alloc );
21 mdl_async_full_load_std( mdl );
22 mdl_close( mdl );
23
24 vg_async_stall();
25
26 if( mdl_arrcount( &mdl->textures ) )
27 {
28 mdl_texture *tex = mdl_arritm( &mdl->textures, 0 );
29 control_overlay.tex = tex->glname;
30 }
31 else
32 {
33 control_overlay.tex = vg.tex_missing;
34 vg_error( "No texture in control overlay\n" );
35 }
36
37 control_overlay.m_key = mdl_find_submesh( mdl, "ov_key" );
38 control_overlay.m_key_down = mdl_find_submesh( mdl, "ov_key_down" );
39 control_overlay.m_shift = mdl_find_submesh( mdl, "ov_shift" );
40 control_overlay.m_shift_down = mdl_find_submesh( mdl, "ov_shift_down" );
41 control_overlay.m_space = mdl_find_submesh( mdl, "ov_space" );
42 control_overlay.m_space_down = mdl_find_submesh( mdl, "ov_space_down" );
43 control_overlay.m_jump_ind = mdl_find_submesh( mdl, "ov_jump_ind" );
44 control_overlay.m_text_jump = mdl_find_submesh( mdl, "ov_text_jump" );
45 control_overlay.m_text_crouch = mdl_find_submesh( mdl, "ov_text_crouch" );
46 control_overlay.m_text_shift = mdl_find_submesh( mdl, "ov_text_shift" );
47 control_overlay.m_text_grab = mdl_find_submesh( mdl, "ov_text_grab" );
48 control_overlay.m_text_carve = mdl_find_submesh( mdl, "ov_text_carve" );
49 control_overlay.m_stored_ind = mdl_find_submesh( mdl, "ov_stored_ind" );
50 control_overlay.m_text_stored = mdl_find_submesh( mdl, "ov_text_stored" );
51 control_overlay.m_text_left = mdl_find_submesh( mdl, "ov_text_left" );
52 control_overlay.m_text_right = mdl_find_submesh( mdl, "ov_text_right" );
53 control_overlay.m_text_push = mdl_find_submesh( mdl, "ov_text_push" );
54 control_overlay.m_text_manual = mdl_find_submesh( mdl, "ov_text_manual" );
55 control_overlay.m_text_front_flip = mdl_find_submesh( mdl, "ov_text_front_flip" );
56 control_overlay.m_text_back_flip = mdl_find_submesh( mdl, "ov_text_back_flip" );
57 control_overlay.m_text_s = mdl_find_submesh( mdl, "ov_text_s" );
58 control_overlay.m_text_w = mdl_find_submesh( mdl, "ov_text_w" );
59
60 control_overlay.m_text_walk = mdl_find_submesh( mdl, "ov_text_walk" );
61 control_overlay.m_text_back = mdl_find_submesh( mdl, "ov_text_back" );
62 control_overlay.m_text_forward = mdl_find_submesh( mdl, "ov_text_forward" );
63 control_overlay.m_text_skate = mdl_find_submesh( mdl, "ov_text_skate" );
64 control_overlay.m_text_walk_lwr = mdl_find_submesh( mdl, "ov_text_walk_lwr" );
65 control_overlay.m_text_e = mdl_find_submesh( mdl, "ov_text_e" );
66 control_overlay.m_text_glide = mdl_find_submesh( mdl, "ov_text_glide" );
67 control_overlay.m_text_camera = mdl_find_submesh( mdl, "ov_text_camera" );
68 control_overlay.m_text_run = mdl_find_submesh( mdl, "ov_text_run" );
69 control_overlay.m_text_look = mdl_find_submesh( mdl, "ov_text_look" );
70 control_overlay.m_text_rewind = mdl_find_submesh( mdl, "ov_text_rewind" );
71
72 control_overlay.m_lmb = mdl_find_submesh( mdl, "ov_lmb" );
73 control_overlay.m_lmb_down = mdl_find_submesh( mdl, "ov_lmb_down" );
74 control_overlay.m_rmb = mdl_find_submesh( mdl, "ov_rmb" );
75 control_overlay.m_rmb_down = mdl_find_submesh( mdl, "ov_rmb_down" );
76 control_overlay.m_mouse = mdl_find_submesh( mdl, "ov_mouse" );
77 control_overlay.m_mouse_grabs = mdl_find_submesh( mdl, "ov_mouse_grabs" );
78 control_overlay.m_text_kickflip = mdl_find_submesh( mdl, "ov_text_kickflip" );
79 control_overlay.m_text_treflip = mdl_find_submesh( mdl, "ov_text_treflip" );
80 control_overlay.m_text_shuvit = mdl_find_submesh( mdl, "ov_text_shuvit" );
81 control_overlay.m_text_respawn = mdl_find_submesh( mdl, "ov_text_respawn" );
82
83 control_overlay.m_ls = mdl_find_submesh( mdl, "ov_ls" );
84 control_overlay.m_ls_circ_backflip = mdl_find_submesh( mdl, "ov_ls_circ_backflip" );
85 control_overlay.m_ls_circ_frontflip = mdl_find_submesh( mdl, "ov_ls_circ_frontflip" );
86 control_overlay.m_ls_circ_manual = mdl_find_submesh( mdl, "ov_ls_circ_manual" );
87 control_overlay.m_ls_circ_skate = mdl_find_submesh( mdl, "ov_ls_circ_skate" );
88 control_overlay.m_ls_circ_walk = mdl_find_submesh( mdl, "ov_ls_circ_walk" );
89 control_overlay.m_rs = mdl_find_submesh( mdl, "ov_rs" );
90 control_overlay.m_rs_circ_look = mdl_find_submesh( mdl, "ov_rs_circ_look" );
91 control_overlay.m_rs_circ_grab = mdl_find_submesh( mdl, "ov_rs_circ_grab" );
92
93 control_overlay.m_lb = mdl_find_submesh( mdl, "ov_lb" );
94 control_overlay.m_lb_down = mdl_find_submesh( mdl, "ov_lb_down" );
95 control_overlay.m_carve_l = mdl_find_submesh( mdl, "ov_carve_l" );
96 control_overlay.m_rb = mdl_find_submesh( mdl, "ov_rb" );
97 control_overlay.m_rb_down = mdl_find_submesh( mdl, "ov_rb_down" );
98 control_overlay.m_carve_r = mdl_find_submesh( mdl, "ov_carve_r" );
99 control_overlay.m_lt = mdl_find_submesh( mdl, "ov_lt" );
100 control_overlay.m_lt_act = mdl_find_submesh( mdl, "ov_lt_act" );
101 control_overlay.m_lt_run = mdl_find_submesh( mdl, "ov_lt_run" );
102 control_overlay.m_rt = mdl_find_submesh( mdl, "ov_rt" );
103 control_overlay.m_rt_act = mdl_find_submesh( mdl, "ov_rt_act" );
104 control_overlay.m_rt_grab = mdl_find_submesh( mdl, "ov_rt_grab" );
105 control_overlay.m_rt_crouch = mdl_find_submesh( mdl, "ov_rt_crouch" );
106
107 control_overlay.m_y = mdl_find_submesh( mdl, "ov_y" );
108 control_overlay.m_y_down = mdl_find_submesh( mdl, "ov_y_down" );
109 control_overlay.m_text_y_walk = mdl_find_submesh( mdl, "ov_text_y_walk" );
110 control_overlay.m_text_y_walk_lwr = mdl_find_submesh( mdl, "ov_text_y_walk_lwr" );
111 control_overlay.m_text_y_glide = mdl_find_submesh( mdl, "ov_text_y_glide" );
112 control_overlay.m_text_y_skate = mdl_find_submesh( mdl, "ov_text_y_skate" );
113 control_overlay.m_b = mdl_find_submesh( mdl, "ov_b" );
114 control_overlay.m_b_down = mdl_find_submesh( mdl, "ov_b_down" );
115 control_overlay.m_text_b_kickflip = mdl_find_submesh( mdl, "ov_text_b_kickflip" );
116 control_overlay.m_text_b_push = mdl_find_submesh( mdl, "ov_text_b_push" );
117 control_overlay.m_x = mdl_find_submesh( mdl, "ov_x" );
118 control_overlay.m_x_down = mdl_find_submesh( mdl, "ov_x_down" );
119 control_overlay.m_text_x_treflip = mdl_find_submesh( mdl, "ov_text_x_treflip" );
120 control_overlay.m_a = mdl_find_submesh( mdl, "ov_a" );
121 control_overlay.m_a_down = mdl_find_submesh( mdl, "ov_a_down" );
122 control_overlay.m_text_a_shuvit = mdl_find_submesh( mdl, "ov_text_a_shuvit" );
123 control_overlay.m_text_a_jump = mdl_find_submesh( mdl, "ov_text_a_jump" );
124 control_overlay.m_text_a_jump_mid = mdl_find_submesh( mdl, "ov_text_a_jump_mid" );
125
126 control_overlay.m_dpad = mdl_find_submesh( mdl, "ov_dpad" );
127 control_overlay.m_dpad_w = mdl_find_submesh( mdl, "ov_dpad_w" );
128 control_overlay.m_dpad_n = mdl_find_submesh( mdl, "ov_dpad_n" );
129 control_overlay.m_dpad_e = mdl_find_submesh( mdl, "ov_dpad_e" );
130 control_overlay.m_dpad_s = mdl_find_submesh( mdl, "ov_dpad_s" );
131 control_overlay.m_text_dw_rewind = mdl_find_submesh( mdl, "ov_text_dw_rewind" );
132 control_overlay.m_text_de_camera = mdl_find_submesh( mdl, "ov_text_de_camera" );
133 control_overlay.m_text_dn_respawn = mdl_find_submesh( mdl, "ov_text_dn_respawn" );
134
135 control_overlay.m_met = mdl_find_submesh( mdl, "ov_met" );
136 control_overlay.m_met_r = mdl_find_submesh( mdl, "ov_met_r" );
137 control_overlay.m_met_l = mdl_find_submesh( mdl, "ov_met_l" );
138 control_overlay.m_met_r_down = mdl_find_submesh( mdl, "ov_met_r_down" );
139 control_overlay.m_met_l_down = mdl_find_submesh( mdl, "ov_met_l_down" );
140 control_overlay.m_text_met_menu = mdl_find_submesh( mdl, "ov_text_met_menu" );
141
142 control_overlay.m_key_menu = mdl_find_submesh( mdl, "ov_key_menu" );
143 control_overlay.m_key_menu_down = mdl_find_submesh( mdl, "ov_key_menu_down" );
144 control_overlay.m_text_menu = mdl_find_submesh( mdl, "ov_text_menu" );
145
146 vg_console_reg_var( "control_overlay", &control_overlay.enabled,
147 k_var_dtype_i32, VG_VAR_PERSISTENT );
148 }
149
150 static void draw_key( bool press, bool wide )
151 {
152 if( wide )
153 mdl_draw_submesh( press?
154 control_overlay.m_shift_down: control_overlay.m_shift );
155 else
156 mdl_draw_submesh( press?
157 control_overlay.m_key_down: control_overlay.m_key );
158 }
159
160 static void colorize( bool press, bool condition )
161 {
162 v4f cnorm = { 1,1,1,0.76f },
163 cdis = { 1,1,1,0.35f },
164 chit = { 1,0.5f,0.2f,0.8f };
165
166 if( condition )
167 if( press )
168 shader_model_menu_uColour( chit );
169 else
170 shader_model_menu_uColour( cnorm );
171 else
172 shader_model_menu_uColour( cdis );
173 }
174
175 void control_overlay_render(void)
176 {
177 if( !control_overlay.enabled ) return;
178 if( skaterift.activity != k_skaterift_default ) return;
179
180 glEnable(GL_BLEND);
181 glDisable(GL_DEPTH_TEST);
182 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
183 glBlendEquation(GL_FUNC_ADD);
184
185 m4x4f ortho;
186 f32 r = (f32)vg.window_x / (f32)vg.window_y,
187 fl = -r,
188 fr = r,
189 fb = 1.0f,
190 ft = -1.0f,
191 rl = 1.0f / (fr-fl),
192 tb = 1.0f / (ft-fb);
193
194 m4x4_zero( ortho );
195 ortho[0][0] = 2.0f * rl;
196 ortho[2][1] = 2.0f * tb;
197 ortho[3][0] = (fr + fl) * -rl;
198 ortho[3][1] = (ft + fb) * -tb;
199 ortho[3][3] = 1.0f;
200
201 v4f cnorm = { 1,1,1,0.76f },
202 cdis = { 1,1,1,0.35f },
203 chit = { 1,0.5f,0.2f,0.8f };
204
205 shader_model_menu_use();
206 shader_model_menu_uTexMain( 1 );
207 shader_model_menu_uPv( ortho );
208 shader_model_menu_uColour( cnorm );
209
210 mdl_context *mdl = &control_overlay.mdl;
211 mesh_bind( &mdl->mesh );
212 glActiveTexture( GL_TEXTURE1 );
213 glBindTexture( GL_TEXTURE_2D, control_overlay.tex );
214
215 enum player_subsystem subsytem = localplayer.subsystem;
216
217 m4x3f mmdl;
218 m4x3_identity( mmdl );
219
220 bool in_air = 0, grinding = 0;
221
222 if( subsytem == k_player_subsystem_walk )
223 in_air = player_walk.state.activity == k_walk_activity_air;
224 else if( subsytem == k_player_subsystem_skate )
225 in_air = player_skate.state.activity < k_skate_activity_ground;
226
227 grinding = (subsytem == k_player_subsystem_skate) &&
228 (player_skate.state.activity >= k_skate_activity_grind_any);
229
230 if( vg_input.display_input_method == k_input_method_controller )
231 {
232 bool press_jump = player_skate.state.jump_charge > 0.2f;
233 u8 lb_down = 0, rb_down = 0;
234 vg_exec_input_program( k_vg_input_type_button_u8,
235 (vg_input_op[]){
236 vg_joy_button, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER, vg_end
237 }, &rb_down );
238 vg_exec_input_program( k_vg_input_type_button_u8,
239 (vg_input_op[]){
240 vg_joy_button, SDL_CONTROLLER_BUTTON_LEFTSHOULDER, vg_end
241 }, &lb_down );
242 f32 lt_amt = 0.0f, rt_amt = 0.0f;
243 vg_exec_input_program( k_vg_input_type_axis_f32,
244 (vg_input_op[]){ vg_joy_axis, SDL_CONTROLLER_AXIS_TRIGGERLEFT, vg_end },
245 &lt_amt );
246 vg_exec_input_program( k_vg_input_type_axis_f32,
247 (vg_input_op[]){ vg_joy_axis, SDL_CONTROLLER_AXIS_TRIGGERRIGHT, vg_end },
248 &rt_amt );
249
250 /* joystick L */
251 v2f steer;
252 joystick_state( k_srjoystick_steer, steer );
253
254 mmdl[3][0] = -r + 0.375f;
255 mmdl[3][2] = 1.0f - 0.375f;
256 shader_model_menu_uMdl( mmdl );
257
258 if( subsytem == k_player_subsystem_skate )
259 {
260 colorize( 0, 1 );
261 mdl_draw_submesh( control_overlay.m_ls_circ_skate );
262
263 colorize( steer[1]>=0.5f, press_jump );
264 mdl_draw_submesh( control_overlay.m_ls_circ_backflip );
265 colorize( steer[1]<=-0.5f, press_jump );
266 mdl_draw_submesh( control_overlay.m_ls_circ_frontflip );
267
268 colorize( steer[1] > 0.7f, !press_jump && !in_air );
269 mdl_draw_submesh( control_overlay.m_ls_circ_manual );
270 }
271 else if( subsytem == k_player_subsystem_walk )
272 {
273 colorize( 0, 1 );
274 mdl_draw_submesh( control_overlay.m_ls_circ_walk );
275 }
276
277 mmdl[3][0] += steer[0]*0.125f*0.75f;
278 mmdl[3][2] += steer[1]*0.125f*0.75f;
279
280 colorize( 0, 1 );
281 shader_model_menu_uMdl( mmdl );
282 mdl_draw_submesh( control_overlay.m_ls );
283
284 /* joystick R */
285 mmdl[3][0] = r - 0.375f;
286 mmdl[3][2] = 1.0f - 0.375f;
287 shader_model_menu_uMdl( mmdl );
288
289 if( subsytem == k_player_subsystem_skate )
290 {
291 colorize( rt_amt > 0.5f, in_air );
292 mdl_draw_submesh( control_overlay.m_rs_circ_grab );
293 colorize( 0, in_air );
294 }
295 else if( subsytem == k_player_subsystem_walk )
296 {
297 colorize( 0, 1 );
298 mdl_draw_submesh( control_overlay.m_rs_circ_look );
299 }
300
301 v2f jlook;
302 joystick_state( k_srjoystick_look, jlook );
303
304 mmdl[3][0] += jlook[0]*0.125f*0.75f;
305 mmdl[3][2] += jlook[1]*0.125f*0.75f;
306 shader_model_menu_uMdl( mmdl );
307 mdl_draw_submesh( control_overlay.m_rs );
308
309
310
311 /* LEFT UPPERS */
312 mmdl[3][0] = -r;
313 mmdl[3][2] = -1.0f;
314 shader_model_menu_uMdl( mmdl );
315
316 /* LB -------------------------------------------------------------- */
317
318 if( subsytem == k_player_subsystem_skate )
319 {
320 colorize( lb_down, !in_air );
321 mdl_draw_submesh( control_overlay.m_carve_l );
322 }
323 else
324 colorize( 0, 0 );
325
326 mdl_draw_submesh( lb_down? control_overlay.m_lb_down: control_overlay.m_lb );
327
328 /* LT ---------------------------------------------------------------- */
329
330 if( subsytem == k_player_subsystem_skate )
331 {
332 colorize( 0, 0 );
333 }
334 else if( subsytem == k_player_subsystem_walk )
335 {
336 colorize( lt_amt>0.2f, 1 );
337 mdl_draw_submesh( control_overlay.m_lt_run );
338 }
339
340 mdl_draw_submesh( control_overlay.m_lt );
341
342 mmdl[3][2] += lt_amt*0.125f*0.5f;
343 shader_model_menu_uMdl( mmdl );
344 mdl_draw_submesh( control_overlay.m_lt_act );
345
346 /* RIGHT UPPERS */
347 mmdl[3][0] = r;
348 mmdl[3][2] = -1.0f;
349 shader_model_menu_uMdl( mmdl );
350
351 if( subsytem == k_player_subsystem_skate )
352 {
353 colorize( rb_down, !in_air );
354 mdl_draw_submesh( control_overlay.m_carve_r );
355 }
356 else
357 colorize( 0, 0 );
358
359 mdl_draw_submesh( rb_down? control_overlay.m_rb_down: control_overlay.m_rb );
360
361 /* RT ---------------------------------------------------------------- */
362
363 if( subsytem == k_player_subsystem_skate )
364 {
365 colorize( rt_amt>0.2f, in_air );
366 mdl_draw_submesh( control_overlay.m_rt_grab );
367 colorize( rt_amt>0.2f, !in_air );
368 mdl_draw_submesh( control_overlay.m_rt_crouch );
369 colorize( rt_amt>0.2f, 1 );
370 }
371 else if( subsytem == k_player_subsystem_walk )
372 {
373 colorize( 0, 0 );
374 }
375
376 mdl_draw_submesh( control_overlay.m_rt );
377
378 mmdl[3][2] += rt_amt*0.125f*0.5f;
379 shader_model_menu_uMdl( mmdl );
380 mdl_draw_submesh( control_overlay.m_rt_act );
381
382 /* RIGHT SIDE BUTTONS */
383 bool press_a = 0, press_b = 0, press_x = 0, press_y = 0,
384 press_dpad_w = 0, press_dpad_e = 0, press_dpad_n = 0, press_dpad_s = 0,
385 press_menu = 0, press_back = 0;
386
387 vg_exec_input_program( k_vg_input_type_button_u8,
388 (vg_input_op[]){
389 vg_joy_button, SDL_CONTROLLER_BUTTON_A, vg_end }, &press_a );
390 vg_exec_input_program( k_vg_input_type_button_u8,
391 (vg_input_op[]){
392 vg_joy_button, SDL_CONTROLLER_BUTTON_B, vg_end }, &press_b );
393 vg_exec_input_program( k_vg_input_type_button_u8,
394 (vg_input_op[]){
395 vg_joy_button, SDL_CONTROLLER_BUTTON_X, vg_end }, &press_x );
396 vg_exec_input_program( k_vg_input_type_button_u8,
397 (vg_input_op[]){
398 vg_joy_button, SDL_CONTROLLER_BUTTON_Y, vg_end }, &press_y );
399 vg_exec_input_program( k_vg_input_type_button_u8,
400 (vg_input_op[]){
401 vg_joy_button, SDL_CONTROLLER_BUTTON_DPAD_LEFT, vg_end }, &press_dpad_w );
402 vg_exec_input_program( k_vg_input_type_button_u8,
403 (vg_input_op[]){
404 vg_joy_button, SDL_CONTROLLER_BUTTON_DPAD_RIGHT, vg_end }, &press_dpad_e );
405 vg_exec_input_program( k_vg_input_type_button_u8,
406 (vg_input_op[]){
407 vg_joy_button, SDL_CONTROLLER_BUTTON_DPAD_UP, vg_end }, &press_dpad_n );
408 vg_exec_input_program( k_vg_input_type_button_u8,
409 (vg_input_op[]){
410 vg_joy_button, SDL_CONTROLLER_BUTTON_DPAD_DOWN, vg_end }, &press_dpad_s );
411 vg_exec_input_program( k_vg_input_type_button_u8,
412 (vg_input_op[]){
413 vg_joy_button, SDL_CONTROLLER_BUTTON_BACK, vg_end }, &press_back );
414 vg_exec_input_program( k_vg_input_type_button_u8,
415 (vg_input_op[]){
416 vg_joy_button, SDL_CONTROLLER_BUTTON_START, vg_end }, &press_menu );
417
418 mmdl[3][0] = r;
419 mmdl[3][2] = 0.0f;
420 shader_model_menu_uMdl( mmdl );
421
422 /* B / KICKFLIP / PUSH */
423 if( subsytem == k_player_subsystem_skate )
424 {
425 colorize( press_b, !in_air );
426 mdl_draw_submesh( control_overlay.m_text_b_push );
427 colorize( press_b, in_air );
428 mdl_draw_submesh( control_overlay.m_text_b_kickflip );
429 colorize( press_b, 1 );
430 }
431 else
432 {
433 colorize( 0, 0 );
434 }
435 mdl_draw_submesh( press_b? control_overlay.m_b_down: control_overlay.m_b );
436
437 /* Y / SKATE / WALK / GLIDE */
438
439 if( subsytem == k_player_subsystem_skate )
440 {
441 if( localplayer.have_glider )
442 {
443 colorize( press_y, !in_air );
444 mdl_draw_submesh( control_overlay.m_text_y_glide );
445 colorize( press_y, in_air );
446 mdl_draw_submesh( control_overlay.m_text_y_walk_lwr );
447 }
448 else
449 {
450 colorize( press_y, 1 );
451 mdl_draw_submesh( control_overlay.m_text_y_walk );
452 }
453 }
454 else if( subsytem == k_player_subsystem_walk )
455 {
456 colorize( press_y, player_walk.state.activity < k_walk_activity_inone );
457 mdl_draw_submesh( control_overlay.m_text_y_skate );
458 }
459 else if( subsytem == k_player_subsystem_glide )
460 {
461 colorize( press_y, 1 );
462 mdl_draw_submesh( control_overlay.m_text_y_skate );
463 }
464 else
465 colorize( 0, 0 );
466 mdl_draw_submesh( press_y? control_overlay.m_y_down: control_overlay.m_y );
467
468 /* X / TREFLIP */
469 if( subsytem == k_player_subsystem_skate )
470 {
471 colorize( press_x, in_air );
472 mdl_draw_submesh( control_overlay.m_text_x_treflip );
473 }
474 else
475 colorize( press_x, 0 );
476 mdl_draw_submesh( press_x? control_overlay.m_x_down: control_overlay.m_x );
477
478 /* A / JUMP / SHUVIT */
479 if( subsytem == k_player_subsystem_skate )
480 {
481 colorize( press_a, !in_air );
482 mdl_draw_submesh( control_overlay.m_text_a_jump );
483 colorize( press_a, in_air );
484 mdl_draw_submesh( control_overlay.m_text_a_shuvit );
485 colorize( press_a, 1 );
486 }
487 else if( subsytem == k_player_subsystem_walk )
488 {
489 colorize( press_a, !in_air );
490 mdl_draw_submesh( control_overlay.m_text_a_jump_mid );
491 }
492 mdl_draw_submesh( press_a? control_overlay.m_a_down: control_overlay.m_a );
493
494 /* JUMP CHARGE */
495 if( subsytem == k_player_subsystem_skate )
496 {
497 if( player_skate.state.jump_charge > 0.01f )
498 {
499 mmdl[0][0] = player_skate.state.jump_charge * 0.465193f;
500 mmdl[3][0] += -0.4375f;
501 mmdl[3][2] += 0.09375f;
502 shader_model_menu_uMdl( mmdl );
503 mdl_draw_submesh( control_overlay.m_jump_ind );
504 mmdl[0][0] = 1.0f;
505 }
506 }
507
508
509 /* DPAD --------------------------------------------------- */
510
511 mmdl[3][0] = -r;
512 mmdl[3][2] = 0.0f;
513 shader_model_menu_uMdl( mmdl );
514 colorize( 0, 1 );
515 mdl_draw_submesh( control_overlay.m_dpad );
516
517 colorize( press_dpad_e, 1 );
518 mdl_draw_submesh( control_overlay.m_text_de_camera );
519 if( press_dpad_e )
520 mdl_draw_submesh( control_overlay.m_dpad_e );
521
522 colorize( press_dpad_w, 1 );
523 mdl_draw_submesh( control_overlay.m_text_dw_rewind );
524 if( press_dpad_w )
525 mdl_draw_submesh( control_overlay.m_dpad_w );
526
527 if( subsytem == k_player_subsystem_dead )
528 {
529 colorize( press_dpad_n, 1 );
530 mdl_draw_submesh( control_overlay.m_text_dn_respawn );
531 }
532 else colorize( press_dpad_n, 0 );
533 if( press_dpad_n )
534 mdl_draw_submesh( control_overlay.m_dpad_n );
535
536 colorize( press_dpad_s, 0 );
537 if( press_dpad_s )
538 mdl_draw_submesh( control_overlay.m_dpad_s );
539
540
541 /* WEIGHT */
542 if( subsytem == k_player_subsystem_skate )
543 {
544 /* stored indicator text */
545 mmdl[3][0] = r -0.842671f;
546 mmdl[3][2] = -1.0f + 0.435484f;
547 colorize( 0, !in_air );
548 shader_model_menu_uMdl( mmdl );
549 mdl_draw_submesh( control_overlay.m_text_stored );
550
551 mmdl[0][0] = v3_length( player_skate.state.throw_v ) / k_mmthrow_scale;
552 shader_model_menu_uMdl( mmdl );
553 colorize( 0, !in_air );
554 mdl_draw_submesh( control_overlay.m_stored_ind );
555
556 static f32 collect = 0.0f;
557 collect = vg_lerpf( collect, player_skate.collect_feedback,
558 vg.time_frame_delta * 15.0f );
559 collect = vg_clampf( collect, 0.0f, 1.0f );
560
561 mmdl[0][0] = collect;
562 mmdl[3][2] += 0.015625f;
563 shader_model_menu_uMdl( mmdl );
564 mdl_draw_submesh( control_overlay.m_stored_ind );
565 }
566
567 mmdl[0][0] = 1.0f;
568 mmdl[3][0] = 0.0f;
569 mmdl[3][2] = -1.0f;
570 shader_model_menu_uMdl( mmdl );
571 colorize( press_menu, 1 );
572 mdl_draw_submesh( press_menu? control_overlay.m_met_r_down: control_overlay.m_met_r );
573 mdl_draw_submesh( control_overlay.m_text_met_menu );
574
575 colorize( press_back, 0 );
576 mdl_draw_submesh( press_back? control_overlay.m_met_l_down: control_overlay.m_met_l );
577
578 colorize( 0, 0 );
579 mdl_draw_submesh( control_overlay.m_met );
580 }
581 else
582 {
583 static v2f gd;
584 v2_lerp( gd, player_skate.state.grab_mouse_delta, vg.time_frame_delta*20.0f, gd );
585
586 /* CTRL || CARVE */
587 if( subsytem == k_player_subsystem_skate )
588 {
589 bool press_ctrl = vg_getkey(SDLK_LCTRL);
590 mmdl[3][0] = -r + 0.25f;
591 mmdl[3][2] = 1.0f - 0.125f;
592 shader_model_menu_uMdl( mmdl );
593 colorize( press_ctrl, !in_air && !grinding );
594 draw_key( press_ctrl, 1 );
595 mdl_draw_submesh( control_overlay.m_text_carve );
596 }
597
598 /* SHIFT || CROUCH / GRAB / RUN */
599 bool press_shift = vg_getkey( SDLK_LSHIFT );
600 if( subsytem == k_player_subsystem_skate ||
601 subsytem == k_player_subsystem_walk )
602 {
603 mmdl[3][0] = -r + 0.25f;
604 mmdl[3][2] = 1.0f - 0.125f - 0.25f;
605 shader_model_menu_uMdl( mmdl );
606 colorize( press_shift, !grinding );
607 draw_key( press_shift, 1 );
608 mdl_draw_submesh( control_overlay.m_text_shift );
609
610 if( subsytem == k_player_subsystem_skate )
611 {
612 colorize( press_shift, !in_air && !grinding );
613 mdl_draw_submesh( control_overlay.m_text_crouch );
614 colorize( press_shift, in_air && !grinding );
615 mdl_draw_submesh( control_overlay.m_text_grab );
616 }
617 else if( subsytem == k_player_subsystem_walk )
618 {
619 mdl_draw_submesh( control_overlay.m_text_run );
620 }
621 }
622
623 if( subsytem == k_player_subsystem_skate )
624 {
625 /* stored indicator text */
626 mmdl[3][0] = -r + 0.25f + 0.203125f + 0.007812f;
627 colorize( 0, !in_air );
628 shader_model_menu_uMdl( mmdl );
629 mdl_draw_submesh( control_overlay.m_text_stored );
630
631 mmdl[0][0] = v3_length( player_skate.state.throw_v ) / k_mmthrow_scale;
632 shader_model_menu_uMdl( mmdl );
633 colorize( 0, !in_air );
634 mdl_draw_submesh( control_overlay.m_stored_ind );
635
636 static f32 collect = 0.0f;
637 collect = vg_lerpf( collect, player_skate.collect_feedback,
638 vg.time_frame_delta * 15.0f );
639 collect = vg_clampf( collect, 0.0f, 1.0f );
640
641 mmdl[0][0] = collect;
642 mmdl[3][2] += 0.015625f;
643 shader_model_menu_uMdl( mmdl );
644 mdl_draw_submesh( control_overlay.m_stored_ind );
645 }
646
647 /* -1 */
648 if( subsytem != k_player_subsystem_dead )
649 {
650 bool press_c = vg_getkey(SDLK_c);
651 mmdl[0][0] = 1.0f;
652 mmdl[3][0] = -r + 0.125f + 1.0f;
653 mmdl[3][2] = 1.0f - 0.125f - 0.25f;
654 shader_model_menu_uMdl( mmdl );
655 colorize( press_c, 1 );
656 draw_key( press_c, 0 );
657 mdl_draw_submesh( control_overlay.m_text_camera );
658 }
659
660 /* +0 */
661 mmdl[0][0] = 1.0f;
662 mmdl[3][2] = 1.0f - 0.125f - 0.25f - 0.25f;
663
664 /* A || LEFT */
665 if( subsytem != k_player_subsystem_dead )
666 {
667 bool press_a = vg_getkey(SDLK_a);
668 mmdl[3][0] = -r + 0.125f;
669 shader_model_menu_uMdl( mmdl );
670 colorize( press_a, 1 );
671 draw_key( press_a, 0 );
672 mdl_draw_submesh( control_overlay.m_text_left );
673 }
674
675 bool press_jump = player_skate.state.jump_charge < 0.2f;
676
677 /* S || MANUAL / BACKFLIP */
678 bool press_s = vg_getkey(SDLK_s);
679 mmdl[3][0] = -r + 0.125f + 0.25f;
680 shader_model_menu_uMdl( mmdl );
681
682 if( subsytem == k_player_subsystem_skate )
683 {
684 colorize( press_s, !in_air );
685 draw_key( press_s, 0 );
686 mdl_draw_submesh( control_overlay.m_text_s );
687 /* backflip/manual */
688 colorize( press_s, !in_air && !press_jump );
689 mdl_draw_submesh( control_overlay.m_text_back_flip );
690 colorize( press_s, !in_air && press_jump );
691 mdl_draw_submesh( control_overlay.m_text_manual );
692 }
693 else if( subsytem != k_player_subsystem_dead )
694 {
695 colorize( press_s, 1 );
696 draw_key( press_s, 0 );
697 mdl_draw_submesh( control_overlay.m_text_s );
698 mdl_draw_submesh( control_overlay.m_text_back );
699 }
700
701 /* D || RIGHT */
702 if( subsytem != k_player_subsystem_dead )
703 {
704 bool press_d = vg_getkey(SDLK_d);
705 mmdl[3][0] = -r + 0.125f + 0.25f + 0.25f;
706 shader_model_menu_uMdl( mmdl );
707 colorize( press_d, 1 );
708 draw_key( press_d, 0 );
709 mdl_draw_submesh( control_overlay.m_text_right );
710 }
711
712 /* +1 */
713 mmdl[3][2] = 1.0f - 0.125f - 0.25f - 0.25f - 0.25f;
714
715 /* Q */
716 if( subsytem == k_player_subsystem_dead )
717 {
718 bool press_q = vg_getkey(SDLK_q);
719 mmdl[3][0] = -r + 0.125f;
720 shader_model_menu_uMdl( mmdl );
721 colorize( press_q, 1 );
722 draw_key( press_q, 0 );
723 mdl_draw_submesh( control_overlay.m_text_respawn );
724 }
725
726 /* W || PUSH / FRONTFLIP */
727 bool press_w = vg_getkey(SDLK_w);
728 mmdl[3][0] = -r + 0.125f + 0.25f;
729 shader_model_menu_uMdl( mmdl );
730
731 if( subsytem == k_player_subsystem_skate )
732 {
733 colorize( press_w, !in_air );
734 draw_key( press_w, 0 );
735 mdl_draw_submesh( control_overlay.m_text_w );
736 /* frontflip/push */
737 colorize( press_w, !in_air && !press_jump );
738 mdl_draw_submesh( control_overlay.m_text_front_flip );
739 colorize( press_w, !in_air && press_jump );
740 mdl_draw_submesh( control_overlay.m_text_push );
741 }
742 else if( subsytem != k_player_subsystem_dead )
743 {
744 colorize( press_w, 1 );
745 draw_key( press_w, 0 );
746 mdl_draw_submesh( control_overlay.m_text_w );
747 mdl_draw_submesh( control_overlay.m_text_forward );
748 }
749
750 /* E */
751 bool press_e = vg_getkey(SDLK_e);
752 mmdl[3][0] = -r + 0.125f + 0.25f + 0.25f;
753
754 shader_model_menu_uMdl( mmdl );
755
756 if( subsytem == k_player_subsystem_skate )
757 {
758 if( localplayer.have_glider )
759 {
760 colorize( press_e, !in_air );
761 mdl_draw_submesh( control_overlay.m_text_walk_lwr );
762
763 colorize( press_e, in_air );
764 mdl_draw_submesh( control_overlay.m_text_glide );
765 }
766 else
767 {
768 colorize( press_e, 1 );
769 mdl_draw_submesh( control_overlay.m_text_walk );
770 }
771 }
772 else if( subsytem == k_player_subsystem_glide )
773 {
774 colorize( press_e, 1 );
775 mdl_draw_submesh( control_overlay.m_text_skate );
776 }
777 else if( subsytem == k_player_subsystem_walk )
778 {
779 colorize( press_e, player_walk.state.activity < k_walk_activity_inone );
780 mdl_draw_submesh( control_overlay.m_text_skate );
781 }
782
783 if( subsytem != k_player_subsystem_dead )
784 {
785 draw_key( press_e, 0 );
786 mdl_draw_submesh( control_overlay.m_text_e );
787 }
788
789 /* R */
790 bool press_r = vg_getkey(SDLK_r);
791 mmdl[3][0] = -r + 0.125f + 0.25f + 0.25f + 0.25f;
792 shader_model_menu_uColour( cnorm );
793 shader_model_menu_uMdl( mmdl );
794
795 colorize( press_r, 1 );
796 draw_key( press_r, 0 );
797 mdl_draw_submesh( control_overlay.m_text_rewind );
798
799 /* space */
800 bool press_space = vg_getkey(SDLK_SPACE);
801 mmdl[3][0] = 0.0f;
802 mmdl[3][2] = 1.0f - 0.125f;
803
804
805 if( subsytem == k_player_subsystem_skate ||
806 subsytem == k_player_subsystem_walk )
807 {
808 shader_model_menu_uMdl( mmdl );
809 colorize( press_space, !in_air );
810
811 mdl_draw_submesh( press_space?
812 control_overlay.m_space_down: control_overlay.m_space );
813 mdl_draw_submesh( control_overlay.m_text_jump );
814 }
815
816 if( subsytem == k_player_subsystem_skate )
817 {
818 if( player_skate.state.jump_charge > 0.01f )
819 {
820 mmdl[0][0] = player_skate.state.jump_charge;
821 mmdl[3][0] = -0.4375f;
822 shader_model_menu_uMdl( mmdl );
823 mdl_draw_submesh( control_overlay.m_jump_ind );
824 }
825 }
826
827 bool press_esc = vg_getkey(SDLK_ESCAPE);
828 mmdl[0][0] = 1.0f;
829 mmdl[3][0] = -r + 0.125f;;
830 mmdl[3][2] = -1.0f + 0.125f;
831 shader_model_menu_uMdl( mmdl );
832 colorize( press_esc, 1 );
833 mdl_draw_submesh( control_overlay.m_text_menu );
834 mdl_draw_submesh( press_esc? control_overlay.m_key_menu_down: control_overlay.m_key_menu );
835 mmdl[3][0] = r - 0.38f;
836 mmdl[3][2] = 0.0f;
837 shader_model_menu_uMdl( mmdl );
838 colorize( press_shift, in_air );
839
840 if( subsytem == k_player_subsystem_skate )
841 {
842 mdl_draw_submesh( control_overlay.m_mouse_grabs );
843
844 if( in_air && press_shift )
845 {
846 mmdl[3][0] += gd[0]*0.125f;
847 mmdl[3][2] += gd[1]*0.125f;
848 }
849 }
850
851 shader_model_menu_uMdl( mmdl );
852
853 bool lmb = button_press( k_srbind_trick0 ),
854 rmb = button_press( k_srbind_trick1 );
855
856 if( subsytem == k_player_subsystem_skate )
857 {
858 colorize( 0, press_space || in_air );
859 mdl_draw_submesh( control_overlay.m_mouse );
860
861 colorize( lmb&&!rmb, press_space || in_air );
862 mdl_draw_submesh( control_overlay.m_text_shuvit );
863
864 colorize( lmb, press_space || in_air );
865 mdl_draw_submesh( lmb? control_overlay.m_lmb_down: control_overlay.m_lmb );
866
867 colorize( rmb&&!lmb, press_space || in_air );
868 mdl_draw_submesh( control_overlay.m_text_kickflip );
869
870 colorize( rmb, press_space || in_air );
871 mdl_draw_submesh( rmb? control_overlay.m_rmb_down: control_overlay.m_rmb );
872
873 colorize( rmb&&lmb, press_space || in_air );
874 mdl_draw_submesh( control_overlay.m_text_treflip );
875 }
876 else if( subsytem == k_player_subsystem_walk )
877 {
878 colorize( 0, 1 );
879 mdl_draw_submesh( control_overlay.m_mouse );
880 mdl_draw_submesh( control_overlay.m_text_look );
881
882 mdl_draw_submesh( lmb? control_overlay.m_lmb_down: control_overlay.m_lmb );
883 mdl_draw_submesh( rmb? control_overlay.m_rmb_down: control_overlay.m_rmb );
884 }
885 }
886 }