1 #include "control_overlay.h"
5 #include "player_skate.h"
6 #include "player_walk.h"
7 #include "shaders/model_menu.h"
8 #include "vg/vg_engine.h"
12 struct control_overlay control_overlay
= { .enabled
= 1 };
14 void control_overlay_init(void)
16 void *alloc
= vg_mem
.rtmemory
;
17 mdl_context
*mdl
= &control_overlay
.mdl
;
19 mdl_open( mdl
, "models/rs_overlay.mdl", alloc
);
20 mdl_load_metadata_block( mdl
, alloc
);
21 mdl_async_full_load_std( mdl
);
26 if( mdl_arrcount( &mdl
->textures
) )
28 mdl_texture
*tex
= mdl_arritm( &mdl
->textures
, 0 );
29 control_overlay
.tex
= tex
->glname
;
33 control_overlay
.tex
= vg
.tex_missing
;
34 vg_error( "No texture in control overlay\n" );
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" );
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" );
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" );
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" );
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" );
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" );
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" );
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" );
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" );
146 vg_console_reg_var( "control_overlay", &control_overlay
.enabled
,
147 k_var_dtype_i32
, VG_VAR_PERSISTENT
);
150 static void draw_key( bool press
, bool wide
)
153 mdl_draw_submesh( press
?
154 control_overlay
.m_shift_down
: control_overlay
.m_shift
);
156 mdl_draw_submesh( press
?
157 control_overlay
.m_key_down
: control_overlay
.m_key
);
160 static void colorize( bool press
, bool condition
)
162 v4f cnorm
= { 1,1,1,0.76f
},
163 cdis
= { 1,1,1,0.35f
},
164 chit
= { 1,0.5f
,0.2f
,0.8f
};
168 shader_model_menu_uColour( chit
);
170 shader_model_menu_uColour( cnorm
);
172 shader_model_menu_uColour( cdis
);
175 void control_overlay_render(void)
177 if( !control_overlay
.enabled
) return;
178 if( skaterift
.activity
!= k_skaterift_default
) return;
181 glDisable(GL_DEPTH_TEST
);
182 glBlendFunc( GL_SRC_ALPHA
, GL_ONE_MINUS_SRC_ALPHA
);
183 glBlendEquation(GL_FUNC_ADD
);
186 f32 r
= (f32
)vg
.window_x
/ (f32
)vg
.window_y
,
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
;
201 v4f cnorm
= { 1,1,1,0.76f
},
202 cdis
= { 1,1,1,0.35f
},
203 chit
= { 1,0.5f
,0.2f
,0.8f
};
205 shader_model_menu_use();
206 shader_model_menu_uTexMain( 1 );
207 shader_model_menu_uPv( ortho
);
208 shader_model_menu_uColour( cnorm
);
210 mdl_context
*mdl
= &control_overlay
.mdl
;
211 mesh_bind( &mdl
->mesh
);
212 glActiveTexture( GL_TEXTURE1
);
213 glBindTexture( GL_TEXTURE_2D
, control_overlay
.tex
);
215 enum player_subsystem subsytem
= localplayer
.subsystem
;
218 m4x3_identity( mmdl
);
220 bool in_air
= 0, grinding
= 0;
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
;
227 grinding
= (subsytem
== k_player_subsystem_skate
) &&
228 (player_skate
.state
.activity
>= k_skate_activity_grind_any
);
230 if( vg_input
.display_input_method
== k_input_method_controller
)
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
,
236 vg_joy_button
, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER
, vg_end
238 vg_exec_input_program( k_vg_input_type_button_u8
,
240 vg_joy_button
, SDL_CONTROLLER_BUTTON_LEFTSHOULDER
, vg_end
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
},
246 vg_exec_input_program( k_vg_input_type_axis_f32
,
247 (vg_input_op
[]){ vg_joy_axis
, SDL_CONTROLLER_AXIS_TRIGGERRIGHT
, vg_end
},
252 joystick_state( k_srjoystick_steer
, steer
);
254 mmdl
[3][0] = -r
+ 0.375f
;
255 mmdl
[3][2] = 1.0f
- 0.375f
;
256 shader_model_menu_uMdl( mmdl
);
258 if( subsytem
== k_player_subsystem_skate
)
261 mdl_draw_submesh( control_overlay
.m_ls_circ_skate
);
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
);
268 colorize( steer
[1] > 0.7f
, !press_jump
&& !in_air
);
269 mdl_draw_submesh( control_overlay
.m_ls_circ_manual
);
271 else if( subsytem
== k_player_subsystem_walk
)
274 mdl_draw_submesh( control_overlay
.m_ls_circ_walk
);
277 mmdl
[3][0] += steer
[0]*0.125f
*0.75f
;
278 mmdl
[3][2] += steer
[1]*0.125f
*0.75f
;
281 shader_model_menu_uMdl( mmdl
);
282 mdl_draw_submesh( control_overlay
.m_ls
);
285 mmdl
[3][0] = r
- 0.375f
;
286 mmdl
[3][2] = 1.0f
- 0.375f
;
287 shader_model_menu_uMdl( mmdl
);
289 if( subsytem
== k_player_subsystem_skate
)
291 colorize( rt_amt
> 0.5f
, in_air
);
292 mdl_draw_submesh( control_overlay
.m_rs_circ_grab
);
293 colorize( 0, in_air
);
295 else if( subsytem
== k_player_subsystem_walk
)
298 mdl_draw_submesh( control_overlay
.m_rs_circ_look
);
302 joystick_state( k_srjoystick_look
, jlook
);
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
);
314 shader_model_menu_uMdl( mmdl
);
316 /* LB -------------------------------------------------------------- */
318 if( subsytem
== k_player_subsystem_skate
)
320 colorize( lb_down
, !in_air
);
321 mdl_draw_submesh( control_overlay
.m_carve_l
);
326 mdl_draw_submesh( lb_down
? control_overlay
.m_lb_down
: control_overlay
.m_lb
);
328 /* LT ---------------------------------------------------------------- */
330 if( subsytem
== k_player_subsystem_skate
)
334 else if( subsytem
== k_player_subsystem_walk
)
336 colorize( lt_amt
>0.2f
, 1 );
337 mdl_draw_submesh( control_overlay
.m_lt_run
);
340 mdl_draw_submesh( control_overlay
.m_lt
);
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
);
349 shader_model_menu_uMdl( mmdl
);
351 if( subsytem
== k_player_subsystem_skate
)
353 colorize( rb_down
, !in_air
);
354 mdl_draw_submesh( control_overlay
.m_carve_r
);
359 mdl_draw_submesh( rb_down
? control_overlay
.m_rb_down
: control_overlay
.m_rb
);
361 /* RT ---------------------------------------------------------------- */
363 if( subsytem
== k_player_subsystem_skate
)
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 );
371 else if( subsytem
== k_player_subsystem_walk
)
376 mdl_draw_submesh( control_overlay
.m_rt
);
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
);
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;
387 vg_exec_input_program( k_vg_input_type_button_u8
,
389 vg_joy_button
, SDL_CONTROLLER_BUTTON_A
, vg_end
}, &press_a
);
390 vg_exec_input_program( k_vg_input_type_button_u8
,
392 vg_joy_button
, SDL_CONTROLLER_BUTTON_B
, vg_end
}, &press_b
);
393 vg_exec_input_program( k_vg_input_type_button_u8
,
395 vg_joy_button
, SDL_CONTROLLER_BUTTON_X
, vg_end
}, &press_x
);
396 vg_exec_input_program( k_vg_input_type_button_u8
,
398 vg_joy_button
, SDL_CONTROLLER_BUTTON_Y
, vg_end
}, &press_y
);
399 vg_exec_input_program( k_vg_input_type_button_u8
,
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
,
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
,
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
,
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
,
413 vg_joy_button
, SDL_CONTROLLER_BUTTON_BACK
, vg_end
}, &press_back
);
414 vg_exec_input_program( k_vg_input_type_button_u8
,
416 vg_joy_button
, SDL_CONTROLLER_BUTTON_START
, vg_end
}, &press_menu
);
420 shader_model_menu_uMdl( mmdl
);
422 /* B / KICKFLIP / PUSH */
423 if( subsytem
== k_player_subsystem_skate
)
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 );
435 mdl_draw_submesh( press_b
? control_overlay
.m_b_down
: control_overlay
.m_b
);
437 /* Y / SKATE / WALK / GLIDE */
439 if( subsytem
== k_player_subsystem_skate
)
441 if( localplayer
.have_glider
)
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
);
450 colorize( press_y
, 1 );
451 mdl_draw_submesh( control_overlay
.m_text_y_walk
);
454 else if( subsytem
== k_player_subsystem_walk
)
456 colorize( press_y
, player_walk
.state
.activity
< k_walk_activity_inone
);
457 mdl_draw_submesh( control_overlay
.m_text_y_skate
);
459 else if( subsytem
== k_player_subsystem_glide
)
461 colorize( press_y
, 1 );
462 mdl_draw_submesh( control_overlay
.m_text_y_skate
);
466 mdl_draw_submesh( press_y
? control_overlay
.m_y_down
: control_overlay
.m_y
);
469 if( subsytem
== k_player_subsystem_skate
)
471 colorize( press_x
, in_air
);
472 mdl_draw_submesh( control_overlay
.m_text_x_treflip
);
475 colorize( press_x
, 0 );
476 mdl_draw_submesh( press_x
? control_overlay
.m_x_down
: control_overlay
.m_x
);
478 /* A / JUMP / SHUVIT */
479 if( subsytem
== k_player_subsystem_skate
)
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 );
487 else if( subsytem
== k_player_subsystem_walk
)
489 colorize( press_a
, !in_air
);
490 mdl_draw_submesh( control_overlay
.m_text_a_jump_mid
);
492 mdl_draw_submesh( press_a
? control_overlay
.m_a_down
: control_overlay
.m_a
);
495 if( subsytem
== k_player_subsystem_skate
)
497 if( player_skate
.state
.jump_charge
> 0.01f
)
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
);
509 /* DPAD --------------------------------------------------- */
513 shader_model_menu_uMdl( mmdl
);
515 mdl_draw_submesh( control_overlay
.m_dpad
);
517 colorize( press_dpad_e
, 1 );
518 mdl_draw_submesh( control_overlay
.m_text_de_camera
);
520 mdl_draw_submesh( control_overlay
.m_dpad_e
);
522 colorize( press_dpad_w
, 1 );
523 mdl_draw_submesh( control_overlay
.m_text_dw_rewind
);
525 mdl_draw_submesh( control_overlay
.m_dpad_w
);
527 if( subsytem
== k_player_subsystem_dead
)
529 colorize( press_dpad_n
, 1 );
530 mdl_draw_submesh( control_overlay
.m_text_dn_respawn
);
532 else colorize( press_dpad_n
, 0 );
534 mdl_draw_submesh( control_overlay
.m_dpad_n
);
536 colorize( press_dpad_s
, 0 );
538 mdl_draw_submesh( control_overlay
.m_dpad_s
);
542 if( subsytem
== k_player_subsystem_skate
)
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
);
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
);
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
);
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
);
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
);
575 colorize( press_back
, 0 );
576 mdl_draw_submesh( press_back
? control_overlay
.m_met_l_down
: control_overlay
.m_met_l
);
579 mdl_draw_submesh( control_overlay
.m_met
);
584 v2_lerp( gd
, player_skate
.state
.grab_mouse_delta
, vg
.time_frame_delta
*20.0f
, gd
);
587 if( subsytem
== k_player_subsystem_skate
)
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
);
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
)
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
);
610 if( subsytem
== k_player_subsystem_skate
)
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
);
617 else if( subsytem
== k_player_subsystem_walk
)
619 mdl_draw_submesh( control_overlay
.m_text_run
);
623 if( subsytem
== k_player_subsystem_skate
)
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
);
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
);
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
);
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
);
648 if( subsytem
!= k_player_subsystem_dead
)
650 bool press_c
= vg_getkey(SDLK_c
);
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
);
662 mmdl
[3][2] = 1.0f
- 0.125f
- 0.25f
- 0.25f
;
665 if( subsytem
!= k_player_subsystem_dead
)
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
);
675 bool press_jump
= player_skate
.state
.jump_charge
< 0.2f
;
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
);
682 if( subsytem
== k_player_subsystem_skate
)
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
);
693 else if( subsytem
!= k_player_subsystem_dead
)
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
);
702 if( subsytem
!= k_player_subsystem_dead
)
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
);
713 mmdl
[3][2] = 1.0f
- 0.125f
- 0.25f
- 0.25f
- 0.25f
;
716 if( subsytem
== k_player_subsystem_dead
)
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
);
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
);
731 if( subsytem
== k_player_subsystem_skate
)
733 colorize( press_w
, !in_air
);
734 draw_key( press_w
, 0 );
735 mdl_draw_submesh( control_overlay
.m_text_w
);
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
);
742 else if( subsytem
!= k_player_subsystem_dead
)
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
);
751 bool press_e
= vg_getkey(SDLK_e
);
752 mmdl
[3][0] = -r
+ 0.125f
+ 0.25f
+ 0.25f
;
754 shader_model_menu_uMdl( mmdl
);
756 if( subsytem
== k_player_subsystem_skate
)
758 if( localplayer
.have_glider
)
760 colorize( press_e
, !in_air
);
761 mdl_draw_submesh( control_overlay
.m_text_walk_lwr
);
763 colorize( press_e
, in_air
);
764 mdl_draw_submesh( control_overlay
.m_text_glide
);
768 colorize( press_e
, 1 );
769 mdl_draw_submesh( control_overlay
.m_text_walk
);
772 else if( subsytem
== k_player_subsystem_glide
)
774 colorize( press_e
, 1 );
775 mdl_draw_submesh( control_overlay
.m_text_skate
);
777 else if( subsytem
== k_player_subsystem_walk
)
779 colorize( press_e
, player_walk
.state
.activity
< k_walk_activity_inone
);
780 mdl_draw_submesh( control_overlay
.m_text_skate
);
783 if( subsytem
!= k_player_subsystem_dead
)
785 draw_key( press_e
, 0 );
786 mdl_draw_submesh( control_overlay
.m_text_e
);
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
);
795 colorize( press_r
, 1 );
796 draw_key( press_r
, 0 );
797 mdl_draw_submesh( control_overlay
.m_text_rewind
);
800 bool press_space
= vg_getkey(SDLK_SPACE
);
802 mmdl
[3][2] = 1.0f
- 0.125f
;
805 if( subsytem
== k_player_subsystem_skate
||
806 subsytem
== k_player_subsystem_walk
)
808 shader_model_menu_uMdl( mmdl
);
809 colorize( press_space
, !in_air
);
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
);
816 if( subsytem
== k_player_subsystem_skate
)
818 if( player_skate
.state
.jump_charge
> 0.01f
)
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
);
827 bool press_esc
= vg_getkey(SDLK_ESCAPE
);
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
;
837 shader_model_menu_uMdl( mmdl
);
838 colorize( press_shift
, in_air
);
840 if( subsytem
== k_player_subsystem_skate
)
842 mdl_draw_submesh( control_overlay
.m_mouse_grabs
);
844 if( in_air
&& press_shift
)
846 mmdl
[3][0] += gd
[0]*0.125f
;
847 mmdl
[3][2] += gd
[1]*0.125f
;
851 shader_model_menu_uMdl( mmdl
);
853 bool lmb
= button_press( k_srbind_trick0
),
854 rmb
= button_press( k_srbind_trick1
);
856 if( subsytem
== k_player_subsystem_skate
)
858 colorize( 0, press_space
|| in_air
);
859 mdl_draw_submesh( control_overlay
.m_mouse
);
861 colorize( lmb
&&!rmb
, press_space
|| in_air
);
862 mdl_draw_submesh( control_overlay
.m_text_shuvit
);
864 colorize( lmb
, press_space
|| in_air
);
865 mdl_draw_submesh( lmb
? control_overlay
.m_lmb_down
: control_overlay
.m_lmb
);
867 colorize( rmb
&&!lmb
, press_space
|| in_air
);
868 mdl_draw_submesh( control_overlay
.m_text_kickflip
);
870 colorize( rmb
, press_space
|| in_air
);
871 mdl_draw_submesh( rmb
? control_overlay
.m_rmb_down
: control_overlay
.m_rmb
);
873 colorize( rmb
&&lmb
, press_space
|| in_air
);
874 mdl_draw_submesh( control_overlay
.m_text_treflip
);
876 else if( subsytem
== k_player_subsystem_walk
)
879 mdl_draw_submesh( control_overlay
.m_mouse
);
880 mdl_draw_submesh( control_overlay
.m_text_look
);
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
);