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 #define INPUT_BASIC( KB, JS ) \
59 (vg_input_op[]){vg_keyboard, KB, vg_joy_button, JS, vg_end}
61 static vg_input_op
*input_button_list
[] = {
62 [k_srbind_jump
] = INPUT_BASIC( SDLK_SPACE
, SDL_CONTROLLER_BUTTON_A
),
63 [k_srbind_push
] = INPUT_BASIC( SDLK_w
, SDL_CONTROLLER_BUTTON_B
),
64 [k_srbind_trick0
] = (vg_input_op
[]){
65 vg_mouse
, SDL_BUTTON_LEFT
,
66 vg_joy_button
, SDL_CONTROLLER_BUTTON_A
, vg_end
68 [k_srbind_trick1
] = (vg_input_op
[]){
69 vg_mouse
, SDL_BUTTON_RIGHT
,
70 vg_joy_button
, SDL_CONTROLLER_BUTTON_B
, vg_end
72 [k_srbind_trick2
] = (vg_input_op
[]){
73 vg_mode_mul
, vg_mouse
, SDL_BUTTON_LEFT
, vg_mouse
, SDL_BUTTON_RIGHT
,
74 vg_mode_absmax
, vg_joy_button
, SDL_CONTROLLER_BUTTON_X
, vg_end
76 [k_srbind_use
] = INPUT_BASIC( SDLK_e
, SDL_CONTROLLER_BUTTON_Y
),
77 [k_srbind_reset
] = INPUT_BASIC( SDLK_r
, SDL_CONTROLLER_BUTTON_LEFTSHOULDER
),
78 [k_srbind_camera
]= INPUT_BASIC( SDLK_c
, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER
),
79 [k_srbind_mleft
] = INPUT_BASIC( SDLK_LEFT
, SDL_CONTROLLER_BUTTON_DPAD_LEFT
),
80 [k_srbind_mright
]= INPUT_BASIC( SDLK_RIGHT
, SDL_CONTROLLER_BUTTON_DPAD_RIGHT
),
81 [k_srbind_world_left
] =
82 INPUT_BASIC( SDLK_LEFT
, SDL_CONTROLLER_BUTTON_DPAD_LEFT
),
83 [k_srbind_world_right
] =
84 INPUT_BASIC( SDLK_RIGHT
, SDL_CONTROLLER_BUTTON_DPAD_RIGHT
),
85 [k_srbind_home
] = INPUT_BASIC( SDLK_h
, SDL_CONTROLLER_BUTTON_Y
),
86 [k_srbind_mup
] = INPUT_BASIC( SDLK_UP
, SDL_CONTROLLER_BUTTON_DPAD_UP
),
87 [k_srbind_mdown
] = INPUT_BASIC( SDLK_DOWN
, SDL_CONTROLLER_BUTTON_DPAD_DOWN
),
88 [k_srbind_mback
] = INPUT_BASIC( SDLK_ESCAPE
, SDL_CONTROLLER_BUTTON_B
),
89 [k_srbind_mopen
] = INPUT_BASIC( SDLK_ESCAPE
, SDL_CONTROLLER_BUTTON_START
),
90 [k_srbind_maccept
] = (vg_input_op
[]){
91 vg_keyboard
, SDLK_e
, vg_keyboard
, SDLK_RETURN
, vg_keyboard
, SDLK_RETURN2
,
92 vg_joy_button
, SDL_CONTROLLER_BUTTON_A
, vg_end
94 [k_srbind_replay_play
] = INPUT_BASIC( SDLK_g
, SDL_CONTROLLER_BUTTON_X
),
95 [k_srbind_replay_resume
] = INPUT_BASIC( SDLK_SPACE
, SDL_CONTROLLER_BUTTON_A
),
96 [k_srbind_replay_freecam
] = INPUT_BASIC( SDLK_f
, SDL_CONTROLLER_BUTTON_Y
),
97 [k_srbind_sit
] = INPUT_BASIC( SDLK_z
, SDL_CONTROLLER_BUTTON_B
),
98 [k_srbind_lobby
] = INPUT_BASIC( SDLK_TAB
, SDL_CONTROLLER_BUTTON_DPAD_LEFT
),
99 [k_srbind_chat
] = (vg_input_op
[]){ vg_keyboard
, SDLK_y
, vg_end
},
103 static vg_input_op
*input_axis_list
[] = {
104 [k_sraxis_grab
] = (vg_input_op
[]){
105 vg_keyboard
, SDLK_LSHIFT
,
106 vg_joy_axis
, SDL_CONTROLLER_AXIS_TRIGGERRIGHT
, vg_end
108 [k_sraxis_mbrowse_h
] = (vg_input_op
[]){
109 vg_mode_add
, vg_keyboard
, SDLK_RIGHT
,
110 vg_mode_sub
, vg_keyboard
, SDLK_LEFT
,
111 vg_mode_absmax
, vg_joy_axis
, SDL_CONTROLLER_AXIS_LEFTX
,
114 [k_sraxis_mbrowse_v
] = (vg_input_op
[]){
115 vg_mode_add
, vg_keyboard
, SDLK_UP
,
116 vg_mode_sub
, vg_keyboard
, SDLK_DOWN
,
117 vg_mode_absmax
, vg_joy_axis
, SDL_CONTROLLER_AXIS_LEFTY
,
120 [k_sraxis_replay_h
] = (vg_input_op
[]){
121 vg_mode_add
, vg_keyboard
, SDLK_e
,
122 vg_mode_sub
, vg_keyboard
, SDLK_q
,
123 vg_mode_add
, vg_joy_axis
, SDL_CONTROLLER_AXIS_TRIGGERRIGHT
,
124 vg_mode_sub
, vg_joy_axis
, SDL_CONTROLLER_AXIS_TRIGGERLEFT
,
130 static vg_input_op
*input_joy_list
[] = {
131 [k_srjoystick_steer
] = (vg_input_op
[]){
132 vg_index
, 0, vg_mode_add
, vg_keyboard
, SDLK_d
,
133 vg_mode_sub
, vg_keyboard
, SDLK_a
,
134 vg_mode_absmax
, vg_joy_axis
, SDL_CONTROLLER_AXIS_LEFTX
,
135 vg_index
, 1, vg_mode_add
, vg_keyboard
, SDLK_s
,
136 vg_mode_sub
, vg_keyboard
, SDLK_w
,
137 vg_mode_absmax
, vg_joy_axis
, SDL_CONTROLLER_AXIS_LEFTY
,
140 [k_srjoystick_grab
] = (vg_input_op
[]){
141 vg_index
, 0, vg_mode_absmax
, vg_joy_axis
, SDL_CONTROLLER_AXIS_RIGHTX
,
142 vg_index
, 1, vg_mode_absmax
, vg_joy_axis
, SDL_CONTROLLER_AXIS_RIGHTY
,
145 [k_srjoystick_look
] = (vg_input_op
[]){
146 vg_index
, 0, vg_mode_absmax
, vg_joy_axis
, SDL_CONTROLLER_AXIS_RIGHTX
,
147 vg_index
, 1, vg_mode_absmax
, vg_joy_axis
, SDL_CONTROLLER_AXIS_RIGHTY
,
150 [k_srjoystick_max
]=NULL
154 float axis_states
[ k_sraxis_max
][2];
155 v2f joystick_states
[ k_srjoystick_max
][2];
156 u8 button_states
[ k_srbind_max
][2];
159 k_input_state_enabled
,
160 k_input_state_resume
,
167 static const char *controller_glyphs
[ SDL_CONTROLLER_BUTTON_MAX
][2] =
168 { /* xbox/generic playstation */
169 [ SDL_CONTROLLER_BUTTON_A
] = { "\x1e\x85","\x1e\x82" },
170 [ SDL_CONTROLLER_BUTTON_B
] = { "\x1e\x86","\x1e\x81" },
171 [ SDL_CONTROLLER_BUTTON_X
] = { "\x1e\x83","\x1e\x7f" },
172 [ SDL_CONTROLLER_BUTTON_Y
] = { "\x1e\x84","\x1e\x80" },
173 [ SDL_CONTROLLER_BUTTON_LEFTSTICK
] = { "\x87", "\x87" },
174 [ SDL_CONTROLLER_BUTTON_RIGHTSTICK
] = { "\x8b", "\x8b" },
175 [ SDL_CONTROLLER_BUTTON_LEFTSHOULDER
] = { "\x91", "\x91" },
176 [ SDL_CONTROLLER_BUTTON_RIGHTSHOULDER
]= { "\x92", "\x92" },
177 [ SDL_CONTROLLER_BUTTON_DPAD_LEFT
] = { "\x1e\x93","\x1e\x93" },
178 [ SDL_CONTROLLER_BUTTON_DPAD_UP
] = { "\x1e\x94","\x1e\x94" },
179 [ SDL_CONTROLLER_BUTTON_DPAD_RIGHT
] = { "\x1e\x95","\x1e\x95" },
180 [ SDL_CONTROLLER_BUTTON_DPAD_DOWN
] = { "\x1e\x96","\x1e\x96" },
181 [ SDL_CONTROLLER_BUTTON_GUIDE
] = { "\x91", "\x91" },
184 static const char *controller_glyph( u32 sdl_index
){
185 if( vg_input
.display_input_type
== SDL_CONTROLLER_TYPE_PS3
||
186 vg_input
.display_input_type
== SDL_CONTROLLER_TYPE_PS4
||
187 vg_input
.display_input_type
== SDL_CONTROLLER_TYPE_PS5
)
189 return controller_glyphs
[ sdl_index
][ 1 ];
191 else if( vg_input
.display_input_type
==
192 SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO
||
193 vg_input
.display_input_type
==
194 SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_LEFT
||
195 vg_input
.display_input_type
==
196 SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_PAIR
||
197 vg_input
.display_input_type
==
198 SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT
)
203 return controller_glyphs
[ sdl_index
][ 0 ];
206 #define KEYBOARD_GLYPH( X ) "\x1f" X " "
208 static const char *button_display_string( enum sr_bind button
)
210 const char *controller_table
[ k_srbind_max
] = {
211 [k_srbind_jump
] = controller_glyph( SDL_CONTROLLER_BUTTON_A
),
212 [k_srbind_push
] = controller_glyph( SDL_CONTROLLER_BUTTON_B
),
213 [k_srbind_trick0
] = controller_glyph( SDL_CONTROLLER_BUTTON_A
),
214 [k_srbind_trick1
] = controller_glyph( SDL_CONTROLLER_BUTTON_B
),
215 [k_srbind_trick2
] = controller_glyph( SDL_CONTROLLER_BUTTON_X
),
216 [k_srbind_use
] = controller_glyph( SDL_CONTROLLER_BUTTON_Y
),
217 [k_srbind_reset
] = controller_glyph( SDL_CONTROLLER_BUTTON_LEFTSHOULDER
),
218 [k_srbind_camera
] = controller_glyph( SDL_CONTROLLER_BUTTON_RIGHTSHOULDER
),
219 [k_srbind_mleft
] = controller_glyph( SDL_CONTROLLER_BUTTON_DPAD_LEFT
),
220 [k_srbind_mright
] = controller_glyph( SDL_CONTROLLER_BUTTON_DPAD_RIGHT
),
221 [k_srbind_world_left
] = controller_glyph( SDL_CONTROLLER_BUTTON_DPAD_LEFT
),
222 [k_srbind_world_right
] = controller_glyph( SDL_CONTROLLER_BUTTON_DPAD_RIGHT
),
223 [k_srbind_home
] = controller_glyph( SDL_CONTROLLER_BUTTON_Y
),
224 [k_srbind_mup
] = controller_glyph( SDL_CONTROLLER_BUTTON_DPAD_UP
),
225 [k_srbind_mdown
] = controller_glyph( SDL_CONTROLLER_BUTTON_DPAD_DOWN
),
226 [k_srbind_mback
] = controller_glyph( SDL_CONTROLLER_BUTTON_B
),
227 [k_srbind_maccept
]= controller_glyph( SDL_CONTROLLER_BUTTON_A
),
228 [k_srbind_mopen
] = controller_glyph( SDL_CONTROLLER_BUTTON_GUIDE
),
229 [k_srbind_replay_play
]= controller_glyph( SDL_CONTROLLER_BUTTON_X
),
230 [k_srbind_replay_freecam
]=controller_glyph(SDL_CONTROLLER_BUTTON_Y
),
231 [k_srbind_replay_resume
]=controller_glyph( SDL_CONTROLLER_BUTTON_A
),
232 [k_srbind_sit
] = controller_glyph( SDL_CONTROLLER_BUTTON_B
),
233 [k_srbind_lobby
] = controller_glyph( SDL_CONTROLLER_BUTTON_DPAD_LEFT
),
237 const char *keyboard_table
[ k_srbind_max
] = {
238 [k_srbind_jump
] = "\xa1",
239 [k_srbind_push
] = KEYBOARD_GLYPH( "W" ),
240 [k_srbind_trick0
] = "\x99",
241 [k_srbind_trick1
] = "\x9a",
242 [k_srbind_trick2
] = "\x9b",
243 [k_srbind_use
] = KEYBOARD_GLYPH( "E" ),
244 [k_srbind_reset
] = KEYBOARD_GLYPH( "R" ),
245 [k_srbind_camera
] = KEYBOARD_GLYPH( "C" ),
246 [k_srbind_mleft
] = KEYBOARD_GLYPH( "\x93" ),
247 [k_srbind_mright
] = KEYBOARD_GLYPH( "\x95" ),
248 [k_srbind_world_left
] = KEYBOARD_GLYPH( "\x93" ),
249 [k_srbind_world_right
] = KEYBOARD_GLYPH( "\x95" ),
250 [k_srbind_home
] = KEYBOARD_GLYPH( "H" ),
251 [k_srbind_mup
] = KEYBOARD_GLYPH( "\x94" ),
252 [k_srbind_mdown
] = KEYBOARD_GLYPH( "\x96" ),
253 [k_srbind_mback
] = "\xa3",
254 [k_srbind_maccept
]= "\xa2",
255 [k_srbind_mopen
] = "\xa3" ,
256 [k_srbind_replay_play
]= KEYBOARD_GLYPH( "G" ),
257 [k_srbind_replay_freecam
] = KEYBOARD_GLYPH( "F" ),
258 [k_srbind_replay_resume
]= "\xa1",
259 [k_srbind_sit
] = KEYBOARD_GLYPH( "Z" ),
260 [k_srbind_lobby
] = KEYBOARD_GLYPH( "" ), // FIXME: what is tab?
261 [k_srbind_chat
] = KEYBOARD_GLYPH( "Y" )
264 if( vg_input
.display_input_method
== k_input_method_controller
)
265 return controller_table
[ button
];
267 return keyboard_table
[ button
];
270 static const char *axis_display_string( enum sr_axis axis
)
272 const char *controller_table
[ k_sraxis_max
] = {
273 [k_sraxis_grab
] = "\x90",
274 [k_sraxis_mbrowse_h
] = "\x88",
275 [k_sraxis_mbrowse_v
] = "\x89",
276 [k_sraxis_replay_h
] = "\x8f\x90",
277 [k_sraxis_mworld_h
] = "\x93\x95"
280 const char *keyboard_table
[ k_sraxis_max
] = {
281 [k_sraxis_grab
] = "\x9e",
282 [k_sraxis_mbrowse_h
] = KEYBOARD_GLYPH("\x93")KEYBOARD_GLYPH("\x95"),
283 [k_sraxis_mbrowse_v
] = KEYBOARD_GLYPH("\x96")KEYBOARD_GLYPH("\x94"),
284 [k_sraxis_replay_h
] = KEYBOARD_GLYPH("Q")KEYBOARD_GLYPH("E"),
285 [k_sraxis_mworld_h
] = KEYBOARD_GLYPH("\x93")KEYBOARD_GLYPH("\x95"),
288 if( vg_input
.display_input_method
== k_input_method_controller
)
289 return controller_table
[ axis
];
291 return keyboard_table
[ axis
];
294 static const char *joystick_display_string( enum sr_joystick joystick
,
297 const char *controller_table
[ k_srjoystick_max
][3] = {
298 [k_srjoystick_steer
] = {"\x88","\x89","\x8a"},
299 [k_srjoystick_grab
] = {"\x8c","\x8d","\x8e"},
300 [k_srjoystick_look
] = {"\x8c","\x8d","\x8e"}
303 const char *keyboard_table
[ k_srjoystick_max
][3] = {
304 [k_srjoystick_steer
] = {KEYBOARD_GLYPH("A")KEYBOARD_GLYPH("D"), /*h*/
305 KEYBOARD_GLYPH("W")KEYBOARD_GLYPH("S"), /*v*/
307 KEYBOARD_GLYPH("A")KEYBOARD_GLYPH("D") /*hv*/
308 KEYBOARD_GLYPH("W")KEYBOARD_GLYPH("S"), },
309 [k_srjoystick_grab
] = {"\xa4","\xa4","\xa4"},
310 [k_srjoystick_look
] = {"\xa4","\xa4","\xa4"}
313 if( vg_input
.display_input_method
== k_input_method_controller
)
314 return controller_table
[ joystick
][axis
];
315 else return keyboard_table
[ joystick
][axis
];
318 static int input_filter_generic(void){
319 if( srinput
.state
!= k_input_state_enabled
||
320 vg_ui
.wants_mouse
|| vg_console
.enabled
)
326 static int buttons_filter_fixed(void){
327 if( input_filter_generic() )
330 if( vg
.engine_stage
== k_engine_stage_update_fixed
)
331 if( vg
.fixed_iterations
> 0 )
337 /* Rising edge of button */
338 static int button_down( enum sr_bind button
){
339 if( buttons_filter_fixed() ) return 0;
341 if( srinput
.button_states
[ button
][0] &&
342 !srinput
.button_states
[ button
][1] )
348 /* Falling edge of button */
349 static int button_up( enum sr_bind button
){
350 if( buttons_filter_fixed() ) return 0;
352 if( !srinput
.button_states
[ button
][0] &&
353 srinput
.button_states
[ button
][1] )
359 /* State of button */
360 static int button_press( enum sr_bind button
){
361 if( input_filter_generic() )
364 srinput
.button_states
[ button
][0];
367 static void joystick_state( enum sr_joystick joystick
, v2f state
){
368 if( input_filter_generic() )
371 v2_copy( srinput
.joystick_states
[ joystick
][0], state
);
374 static float axis_state( enum sr_axis axis
){
375 if( input_filter_generic() )
378 return srinput
.axis_states
[axis
][0];
381 static void setbtn( enum sr_bind button
, u8 value
)
383 srinput
.button_states
[button
][0] |= value
;
386 static void skaterift_preupdate_inputs(void){
387 if( srinput
.state
== k_input_state_resume
)
388 srinput
.state
= k_input_state_enabled
;
390 for( u32 i
=0; i
<k_srbind_max
; i
++ ){
391 srinput
.button_states
[i
][1] = srinput
.button_states
[i
][0];
392 srinput
.button_states
[i
][0] = 0;
395 for( u32 i
=0; i
<k_srjoystick_max
; i
++ ){
396 v2_copy( srinput
.joystick_states
[i
][0], srinput
.joystick_states
[i
][1] );
397 v2_zero( srinput
.joystick_states
[i
][0] );
400 for( u32 i
=0; i
<k_sraxis_max
; i
++ ){
401 srinput
.axis_states
[i
][1] = srinput
.axis_states
[i
][0];
402 srinput
.axis_states
[i
][0] = 0.0f
;
405 u32 mouse
= SDL_GetMouseState(NULL
,NULL
),
406 mouse1
= (mouse
& SDL_BUTTON(SDL_BUTTON_LEFT
))? 1: 0,
407 mouse2
= (mouse
& SDL_BUTTON(SDL_BUTTON_RIGHT
))? 1: 0;
409 for( int i
=0; i
<k_srbind_max
; i
++ ){
410 vg_input_op
*prog
= input_button_list
[i
];
412 vg_exec_input_program( k_vg_input_type_button_u8
, prog
,
413 &srinput
.button_states
[i
][0] );
417 for( int i
=0; i
<k_sraxis_max
; i
++ ){
418 vg_input_op
*prog
= input_axis_list
[i
];
420 vg_exec_input_program( k_vg_input_type_axis_f32
, prog
,
421 &srinput
.axis_states
[i
][0] );
425 for( int i
=0; i
<k_srjoystick_max
; i
++ ){
426 vg_input_op
*prog
= input_joy_list
[i
];
428 vg_exec_input_program( k_vg_input_type_joy_v2f
, prog
,
429 srinput
.joystick_states
[i
][0] );