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