6 #include "vg/vg_platform.h"
7 #include "vg/vg_console.h"
8 #include "vg/vg_input.h"
30 k_srbind_replay_freecam
,
31 k_srbind_replay_resume
,
41 k_srjoystick_steer
= 0,
58 float axis_states
[ k_sraxis_max
][2];
59 v2f joystick_states
[ k_srjoystick_max
][2];
60 u8 button_states
[ k_srbind_max
][2];
65 static const char *controller_glyphs
[ SDL_CONTROLLER_BUTTON_MAX
][2] =
66 { /* xbox/generic playstation */
67 [ SDL_CONTROLLER_BUTTON_A
] = { "\x1e\x85","\x1e\x82" },
68 [ SDL_CONTROLLER_BUTTON_B
] = { "\x1e\x86","\x1e\x81" },
69 [ SDL_CONTROLLER_BUTTON_X
] = { "\x1e\x83","\x1e\x7f" },
70 [ SDL_CONTROLLER_BUTTON_Y
] = { "\x1e\x84","\x1e\x80" },
71 [ SDL_CONTROLLER_BUTTON_LEFTSTICK
] = { "\x87", "\x87" },
72 [ SDL_CONTROLLER_BUTTON_RIGHTSTICK
] = { "\x8b", "\x8b" },
73 [ SDL_CONTROLLER_BUTTON_LEFTSHOULDER
] = { "\x91", "\x91" },
74 [ SDL_CONTROLLER_BUTTON_RIGHTSHOULDER
]= { "\x92", "\x92" },
75 [ SDL_CONTROLLER_BUTTON_DPAD_LEFT
] = { "\x1e\x93","\x1e\x93" },
76 [ SDL_CONTROLLER_BUTTON_DPAD_UP
] = { "\x1e\x94","\x1e\x94" },
77 [ SDL_CONTROLLER_BUTTON_DPAD_RIGHT
] = { "\x1e\x95","\x1e\x95" },
78 [ SDL_CONTROLLER_BUTTON_DPAD_DOWN
] = { "\x1e\x96","\x1e\x96" },
79 [ SDL_CONTROLLER_BUTTON_GUIDE
] = { "\x91", "\x91" },
82 static const char *controller_glyph( u32 sdl_index
){
83 if( vg_input
.display_input_type
== SDL_CONTROLLER_TYPE_PS3
||
84 vg_input
.display_input_type
== SDL_CONTROLLER_TYPE_PS4
||
85 vg_input
.display_input_type
== SDL_CONTROLLER_TYPE_PS5
)
87 return controller_glyphs
[ sdl_index
][ 1 ];
89 else if( vg_input
.display_input_type
==
90 SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO
||
91 vg_input
.display_input_type
==
92 SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_LEFT
||
93 vg_input
.display_input_type
==
94 SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_PAIR
||
95 vg_input
.display_input_type
==
96 SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT
)
101 return controller_glyphs
[ sdl_index
][ 0 ];
104 #define KEYBOARD_GLYPH( X ) "\x1f" X " "
106 static const char *button_display_string( enum sr_bind button
)
108 const char *controller_table
[ k_srbind_max
] = {
109 [k_srbind_jump
] = controller_glyph( SDL_CONTROLLER_BUTTON_A
),
110 [k_srbind_push
] = controller_glyph( SDL_CONTROLLER_BUTTON_B
),
111 [k_srbind_trick0
] = controller_glyph( SDL_CONTROLLER_BUTTON_A
),
112 [k_srbind_trick1
] = controller_glyph( SDL_CONTROLLER_BUTTON_B
),
113 [k_srbind_trick2
] = controller_glyph( SDL_CONTROLLER_BUTTON_X
),
114 [k_srbind_use
] = controller_glyph( SDL_CONTROLLER_BUTTON_Y
),
115 [k_srbind_reset
] = controller_glyph( SDL_CONTROLLER_BUTTON_LEFTSHOULDER
),
116 [k_srbind_camera
] = controller_glyph( SDL_CONTROLLER_BUTTON_RIGHTSHOULDER
),
117 [k_srbind_mleft
] = controller_glyph( SDL_CONTROLLER_BUTTON_DPAD_LEFT
),
118 [k_srbind_mright
] = controller_glyph( SDL_CONTROLLER_BUTTON_DPAD_RIGHT
),
119 [k_srbind_world_left
] = controller_glyph( SDL_CONTROLLER_BUTTON_DPAD_LEFT
),
120 [k_srbind_world_right
] = controller_glyph( SDL_CONTROLLER_BUTTON_DPAD_RIGHT
),
121 [k_srbind_home
] = controller_glyph( SDL_CONTROLLER_BUTTON_Y
),
122 [k_srbind_mup
] = controller_glyph( SDL_CONTROLLER_BUTTON_DPAD_UP
),
123 [k_srbind_mdown
] = controller_glyph( SDL_CONTROLLER_BUTTON_DPAD_DOWN
),
124 [k_srbind_mback
] = controller_glyph( SDL_CONTROLLER_BUTTON_B
),
125 [k_srbind_maccept
]= controller_glyph( SDL_CONTROLLER_BUTTON_A
),
126 [k_srbind_mopen
] = controller_glyph( SDL_CONTROLLER_BUTTON_GUIDE
),
127 [k_srbind_replay_play
]= controller_glyph( SDL_CONTROLLER_BUTTON_X
),
128 [k_srbind_replay_freecam
]=controller_glyph(SDL_CONTROLLER_BUTTON_Y
),
129 [k_srbind_replay_resume
]=controller_glyph( SDL_CONTROLLER_BUTTON_A
),
130 [k_srbind_sit
] = controller_glyph( SDL_CONTROLLER_BUTTON_B
),
131 [k_srbind_lobby
] = controller_glyph( SDL_CONTROLLER_BUTTON_DPAD_LEFT
),
135 const char *keyboard_table
[ k_srbind_max
] = {
136 [k_srbind_jump
] = "\xa1",
137 [k_srbind_push
] = KEYBOARD_GLYPH( "W" ),
138 [k_srbind_trick0
] = "\x99",
139 [k_srbind_trick1
] = "\x9a",
140 [k_srbind_trick2
] = "\x9b",
141 [k_srbind_use
] = KEYBOARD_GLYPH( "E" ),
142 [k_srbind_reset
] = KEYBOARD_GLYPH( "R" ),
143 [k_srbind_camera
] = KEYBOARD_GLYPH( "C" ),
144 [k_srbind_mleft
] = KEYBOARD_GLYPH( "\x93" ),
145 [k_srbind_mright
] = KEYBOARD_GLYPH( "\x95" ),
146 [k_srbind_world_left
] = KEYBOARD_GLYPH( "\x93" ),
147 [k_srbind_world_right
] = KEYBOARD_GLYPH( "\x95" ),
148 [k_srbind_home
] = KEYBOARD_GLYPH( "H" ),
149 [k_srbind_mup
] = KEYBOARD_GLYPH( "\x94" ),
150 [k_srbind_mdown
] = KEYBOARD_GLYPH( "\x96" ),
151 [k_srbind_mback
] = "\xa3",
152 [k_srbind_maccept
]= "\xa2",
153 [k_srbind_mopen
] = "\xa3" ,
154 [k_srbind_replay_play
]= KEYBOARD_GLYPH( "G" ),
155 [k_srbind_replay_freecam
] = KEYBOARD_GLYPH( "F" ),
156 [k_srbind_replay_resume
]= "\xa1",
157 [k_srbind_sit
] = KEYBOARD_GLYPH( "Z" ),
158 [k_srbind_lobby
] = KEYBOARD_GLYPH( "" ), // FIXME: what is tab?
159 [k_srbind_chat
] = KEYBOARD_GLYPH( "Y" )
162 if( vg_input
.display_input_method
== k_input_method_controller
)
163 return controller_table
[ button
];
165 return keyboard_table
[ button
];
168 static const char *axis_display_string( enum sr_axis axis
)
170 const char *controller_table
[ k_sraxis_max
] = {
171 [k_sraxis_grab
] = "\x90",
172 [k_sraxis_mbrowse_h
] = "\x88",
173 [k_sraxis_mbrowse_v
] = "\x89",
174 [k_sraxis_replay_h
] = "\x8f\x90",
175 [k_sraxis_mworld_h
] = "\x93\x95"
178 const char *keyboard_table
[ k_sraxis_max
] = {
179 [k_sraxis_grab
] = "\x9e",
180 [k_sraxis_mbrowse_h
] = KEYBOARD_GLYPH("\x93")KEYBOARD_GLYPH("\x95"),
181 [k_sraxis_mbrowse_v
] = KEYBOARD_GLYPH("\x96")KEYBOARD_GLYPH("\x94"),
182 [k_sraxis_replay_h
] = KEYBOARD_GLYPH("Q")KEYBOARD_GLYPH("E"),
183 [k_sraxis_mworld_h
] = KEYBOARD_GLYPH("\x93")KEYBOARD_GLYPH("\x95"),
186 if( vg_input
.display_input_method
== k_input_method_controller
)
187 return controller_table
[ axis
];
189 return keyboard_table
[ axis
];
192 static const char *joystick_display_string( enum sr_joystick joystick
,
195 const char *controller_table
[ k_srjoystick_max
][3] = {
196 [k_srjoystick_steer
] = {"\x88","\x89","\x8a"},
197 [k_srjoystick_grab
] = {"\x8c","\x8d","\x8e"},
198 [k_srjoystick_look
] = {"\x8c","\x8d","\x8e"}
201 const char *keyboard_table
[ k_srjoystick_max
][3] = {
202 [k_srjoystick_steer
] = {KEYBOARD_GLYPH("A")KEYBOARD_GLYPH("D"), /*h*/
203 KEYBOARD_GLYPH("W")KEYBOARD_GLYPH("S"), /*v*/
205 KEYBOARD_GLYPH("A")KEYBOARD_GLYPH("D") /*hv*/
206 KEYBOARD_GLYPH("W")KEYBOARD_GLYPH("S"), },
207 [k_srjoystick_grab
] = {"\xa4","\xa4","\xa4"},
208 [k_srjoystick_look
] = {"\xa4","\xa4","\xa4"}
211 if( vg_input
.display_input_method
== k_input_method_controller
)
212 return controller_table
[ joystick
][axis
];
213 else return keyboard_table
[ joystick
][axis
];
216 static int input_filter_generic(void){
217 if( !srinput
.enabled
|| vg_ui
.wants_mouse
|| vg_console
.enabled
)
223 static int buttons_filter_fixed(void){
224 if( input_filter_generic() )
227 if( vg
.engine_stage
== k_engine_stage_update_fixed
)
228 if( vg
.fixed_iterations
> 0 )
234 /* Rising edge of button */
235 static int button_down( enum sr_bind button
){
236 if( buttons_filter_fixed() ) return 0;
238 if( srinput
.button_states
[ button
][0] &&
239 !srinput
.button_states
[ button
][1] )
245 /* Falling edge of button */
246 static int button_up( enum sr_bind button
){
247 if( buttons_filter_fixed() ) return 0;
249 if( !srinput
.button_states
[ button
][0] &&
250 srinput
.button_states
[ button
][1] )
256 /* State of button */
257 static int button_press( enum sr_bind button
){
258 if( input_filter_generic() )
261 srinput
.button_states
[ button
][0];
264 static void joystick_state( enum sr_joystick joystick
, v2f state
){
265 if( input_filter_generic() )
268 v2_copy( srinput
.joystick_states
[ joystick
][0], state
);
271 static float axis_state( enum sr_axis axis
){
272 if( input_filter_generic() )
275 return srinput
.axis_states
[axis
][0];
278 static void setbtn( enum sr_bind button
, u8 value
)
280 srinput
.button_states
[button
][0] |= value
;
283 static void skaterift_preupdate_inputs(void)
285 for( u32 i
=0; i
<k_srbind_max
; i
++ ){
286 srinput
.button_states
[i
][1] = srinput
.button_states
[i
][0];
287 srinput
.button_states
[i
][0] = 0;
290 for( u32 i
=0; i
<k_srjoystick_max
; i
++ ){
291 v2_copy( srinput
.joystick_states
[i
][0], srinput
.joystick_states
[i
][1] );
292 v2_zero( srinput
.joystick_states
[i
][0] );
295 for( u32 i
=0; i
<k_sraxis_max
; i
++ ){
296 srinput
.axis_states
[i
][1] = srinput
.axis_states
[i
][0];
297 srinput
.axis_states
[i
][0] = 0.0f
;
300 u32 mouse
= SDL_GetMouseState(NULL
,NULL
),
301 mouse1
= (mouse
& SDL_BUTTON(SDL_BUTTON_LEFT
))? 1: 0,
302 mouse2
= (mouse
& SDL_BUTTON(SDL_BUTTON_RIGHT
))? 1: 0;
305 * ------------------------------------- */
306 setbtn( k_srbind_jump
, vg_getkey(SDLK_SPACE
) );
307 setbtn( k_srbind_push
, vg_getkey(SDLK_w
) );
308 setbtn( k_srbind_trick0
, mouse1
);
309 setbtn( k_srbind_trick1
, mouse2
);
310 setbtn( k_srbind_trick2
, mouse1
& mouse2
);
311 setbtn( k_srbind_use
, vg_getkey(SDLK_e
) );
312 setbtn( k_srbind_reset
, vg_getkey(SDLK_r
) );
313 setbtn( k_srbind_camera
, vg_getkey(SDLK_c
) );
314 setbtn( k_srbind_mleft
, vg_getkey(SDLK_LEFT
) );
315 setbtn( k_srbind_mright
, vg_getkey(SDLK_RIGHT
) );
316 setbtn( k_srbind_world_left
, vg_getkey(SDLK_LEFT
) );
317 setbtn( k_srbind_world_right
, vg_getkey(SDLK_RIGHT
) );
318 setbtn( k_srbind_home
, vg_getkey(SDLK_h
) );
319 setbtn( k_srbind_mup
, vg_getkey(SDLK_UP
) );
320 setbtn( k_srbind_mdown
, vg_getkey(SDLK_DOWN
) );
321 setbtn( k_srbind_mback
, vg_getkey(SDLK_ESCAPE
) );
322 setbtn( k_srbind_mopen
, vg_getkey(SDLK_ESCAPE
) );
323 setbtn( k_srbind_maccept
, vg_getkey(SDLK_e
) );
324 setbtn( k_srbind_maccept
, vg_getkey(SDLK_RETURN
));
325 setbtn( k_srbind_maccept
, vg_getkey(SDLK_RETURN2
));
326 setbtn( k_srbind_replay_play
, vg_getkey(SDLK_g
) );
327 setbtn( k_srbind_replay_freecam
, vg_getkey(SDLK_f
) );
328 setbtn( k_srbind_replay_resume
, vg_getkey(SDLK_SPACE
) );
329 setbtn( k_srbind_sit
, vg_getkey(SDLK_z
) );
330 setbtn( k_srbind_lobby
, vg_getkey(SDLK_TAB
) );
331 setbtn( k_srbind_chat
, vg_getkey(SDLK_y
) );
334 * --------------------------------------------*/
335 srinput
.axis_states
[ k_sraxis_grab
][0] = vg_getkey( SDLK_LSHIFT
);
337 if( vg_getkey( SDLK_e
) )
338 srinput
.axis_states
[ k_sraxis_replay_h
][0] += 1.0f
;
339 if( vg_getkey( SDLK_q
) )
340 srinput
.axis_states
[ k_sraxis_replay_h
][0] -= 1.0f
;
342 if( vg_getkey( SDLK_d
) )
343 srinput
.joystick_states
[k_srjoystick_steer
][0][0] += 1.0f
;
344 if( vg_getkey( SDLK_a
) )
345 srinput
.joystick_states
[k_srjoystick_steer
][0][0] -= 1.0f
;
346 if( vg_getkey( SDLK_w
) )
347 srinput
.joystick_states
[k_srjoystick_steer
][0][1] -= 1.0f
;
348 if( vg_getkey( SDLK_s
) )
349 srinput
.joystick_states
[k_srjoystick_steer
][0][1] += 1.0f
;
351 if( vg_getkey( SDLK_DOWN
) )
352 srinput
.axis_states
[ k_sraxis_mbrowse_v
][0] -= 1.0f
;
353 if( vg_getkey( SDLK_UP
) )
354 srinput
.axis_states
[ k_sraxis_mbrowse_v
][0] += 1.0f
;
356 if( vg_getkey( SDLK_LEFT
) ){
357 srinput
.axis_states
[ k_sraxis_mbrowse_h
][0] -= 1.0f
;
358 srinput
.axis_states
[ k_sraxis_mworld_h
][0] -= 1.0f
;
360 if( vg_getkey( SDLK_RIGHT
) ){
361 srinput
.axis_states
[ k_sraxis_mbrowse_h
][0] += 1.0f
;
362 srinput
.axis_states
[ k_sraxis_mworld_h
][0] += 1.0f
;
365 if( vg_input
.active_controller_index
>= 0 ){
366 struct vg_controller
*controller
=
367 &vg_input
.controllers
[vg_input
.active_controller_index
];
369 u32
*buttons
= controller
->buttons
;
370 setbtn( k_srbind_jump
, buttons
[ SDL_CONTROLLER_BUTTON_A
] );
371 setbtn( k_srbind_push
, buttons
[ SDL_CONTROLLER_BUTTON_B
] );
372 setbtn( k_srbind_trick0
, buttons
[ SDL_CONTROLLER_BUTTON_A
] );
373 setbtn( k_srbind_trick1
, buttons
[ SDL_CONTROLLER_BUTTON_B
] );
374 setbtn( k_srbind_trick2
, buttons
[ SDL_CONTROLLER_BUTTON_X
] );
375 setbtn( k_srbind_use
, buttons
[ SDL_CONTROLLER_BUTTON_Y
] );
376 setbtn( k_srbind_reset
, buttons
[ SDL_CONTROLLER_BUTTON_LEFTSHOULDER
] );
377 setbtn( k_srbind_camera
, buttons
[ SDL_CONTROLLER_BUTTON_RIGHTSHOULDER
] );
378 setbtn( k_srbind_mleft
, buttons
[ SDL_CONTROLLER_BUTTON_DPAD_LEFT
] );
379 setbtn( k_srbind_mright
, buttons
[ SDL_CONTROLLER_BUTTON_DPAD_RIGHT
] );
380 setbtn( k_srbind_world_left
, buttons
[ SDL_CONTROLLER_BUTTON_DPAD_LEFT
] );
381 setbtn( k_srbind_world_right
,buttons
[ SDL_CONTROLLER_BUTTON_DPAD_RIGHT
]);
382 setbtn( k_srbind_home
, buttons
[ SDL_CONTROLLER_BUTTON_Y
] );
383 setbtn( k_srbind_mup
, buttons
[ SDL_CONTROLLER_BUTTON_DPAD_UP
] );
384 setbtn( k_srbind_mdown
, buttons
[ SDL_CONTROLLER_BUTTON_DPAD_DOWN
] );
385 setbtn( k_srbind_mback
, buttons
[ SDL_CONTROLLER_BUTTON_B
] );
386 setbtn( k_srbind_maccept
,buttons
[ SDL_CONTROLLER_BUTTON_A
] );
387 setbtn( k_srbind_mopen
, buttons
[ SDL_CONTROLLER_BUTTON_START
] );
388 setbtn( k_srbind_mback
, buttons
[ SDL_CONTROLLER_BUTTON_START
] );
389 setbtn( k_srbind_replay_resume
, buttons
[ SDL_CONTROLLER_BUTTON_A
] );
390 setbtn( k_srbind_replay_play
, buttons
[ SDL_CONTROLLER_BUTTON_X
] );
391 setbtn( k_srbind_replay_freecam
, buttons
[ SDL_CONTROLLER_BUTTON_Y
] );
392 setbtn( k_srbind_sit
, buttons
[ SDL_CONTROLLER_BUTTON_B
] );
393 setbtn( k_srbind_lobby
, buttons
[ SDL_CONTROLLER_BUTTON_DPAD_LEFT
] );
396 float *axis
= controller
->axises
;
397 float *steer
= srinput
.joystick_states
[ k_srjoystick_steer
][0],
398 *look
= srinput
.joystick_states
[ k_srjoystick_look
][0],
399 *grab
= srinput
.joystick_states
[ k_srjoystick_grab
][0],
400 *axisgrab
= &srinput
.axis_states
[ k_sraxis_grab
][0],
401 *axisbrowseh
= &srinput
.axis_states
[ k_sraxis_mbrowse_h
][0],
402 *axisbrowsev
= &srinput
.axis_states
[ k_sraxis_mbrowse_v
][0],
403 *axisreplayh
= &srinput
.axis_states
[ k_sraxis_replay_h
][0];
405 steer
[0] += axis
[ SDL_CONTROLLER_AXIS_LEFTX
];
406 steer
[1] += axis
[ SDL_CONTROLLER_AXIS_LEFTY
];
407 look
[0] += axis
[ SDL_CONTROLLER_AXIS_RIGHTX
];
408 look
[1] += axis
[ SDL_CONTROLLER_AXIS_RIGHTY
];
409 grab
[0] += axis
[ SDL_CONTROLLER_AXIS_RIGHTX
];
410 grab
[1] += axis
[ SDL_CONTROLLER_AXIS_RIGHTY
];
411 axisgrab
[0] += vg_maxf( 0.0f
, axis
[ SDL_CONTROLLER_AXIS_TRIGGERRIGHT
] );
412 axisbrowseh
[0] += axis
[ SDL_CONTROLLER_AXIS_LEFTX
];
413 axisbrowsev
[0] += axis
[ SDL_CONTROLLER_AXIS_LEFTY
];
414 axisreplayh
[0] += vg_maxf(0.0f
,axis
[SDL_CONTROLLER_AXIS_TRIGGERRIGHT
]);
415 axisreplayh
[0] -= vg_maxf(0.0f
,axis
[SDL_CONTROLLER_AXIS_TRIGGERLEFT
]);
417 float lh
= axis
[ SDL_CONTROLLER_AXIS_LEFTX
],
418 lv
= axis
[ SDL_CONTROLLER_AXIS_LEFTY
],
421 if( lh
> sensitivity
) setbtn( k_srbind_mright
, 1 );
422 if( lh
< -sensitivity
) setbtn( k_srbind_mleft
, 1 );
423 if( lv
> sensitivity
) setbtn( k_srbind_mdown
, 1 );
424 if( lv
< -sensitivity
) setbtn( k_srbind_mup
, 1 );
427 srinput
.axis_states
[ k_sraxis_grab
][0] =
428 vg_minf( 1.0f
, srinput
.axis_states
[ k_sraxis_grab
][0] );