filter input while workshop form is open
[carveJwlIkooP6JGAAIwe30JlM.git] / input.h
1 #pragma once
2 #include "vg/vg_platform.h"
3 #include "vg/vg_console.h"
4 #include "vg/vg_input.h"
5 #include "vg/vg_m.h"
6 #include "font.h"
7
8 enum sr_bind
9 {
10 k_srbind_jump = 0,
11 k_srbind_push,
12 k_srbind_skid,
13 k_srbind_trick0,
14 k_srbind_trick1,
15 k_srbind_trick2,
16 k_srbind_sit,
17 k_srbind_use,
18 k_srbind_reset,
19 k_srbind_dead_respawn,
20 k_srbind_camera,
21 k_srbind_mleft,
22 k_srbind_mright,
23 k_srbind_mup,
24 k_srbind_mdown,
25 k_srbind_mback,
26 k_srbind_maccept,
27 k_srbind_mopen,
28 k_srbind_mhub,
29 k_srbind_replay_play,
30 k_srbind_replay_freecam,
31 k_srbind_replay_resume,
32 k_srbind_world_left,
33 k_srbind_world_right,
34 k_srbind_home,
35 k_srbind_lobby,
36 k_srbind_chat,
37 k_srbind_run,
38
39 k_srbind_miniworld_teleport,
40 k_srbind_miniworld_resume,
41 k_srbind_devbutton,
42 k_srbind_max,
43 };
44
45 enum sr_joystick{
46 k_srjoystick_steer = 0,
47 k_srjoystick_grab,
48 k_srjoystick_look,
49 k_srjoystick_max
50 };
51
52 enum sr_axis{
53 k_sraxis_grab = 0,
54 k_sraxis_mbrowse_h,
55 k_sraxis_mbrowse_v,
56 k_sraxis_replay_h,
57 k_sraxis_skid,
58 k_sraxis_max
59 };
60
61
62 #define INPUT_BASIC( KB, JS ) \
63 (vg_input_op[]){vg_keyboard, KB, vg_joy_button, JS, vg_end}
64
65 static vg_input_op *input_button_list[] = {
66 [k_srbind_jump] = INPUT_BASIC( SDLK_SPACE, SDL_CONTROLLER_BUTTON_A ),
67 [k_srbind_push] = INPUT_BASIC( SDLK_w, SDL_CONTROLLER_BUTTON_B ),
68 [k_srbind_trick0] = (vg_input_op[]){
69 vg_mouse, SDL_BUTTON_LEFT,
70 vg_joy_button, SDL_CONTROLLER_BUTTON_A, vg_end
71 },
72 [k_srbind_trick1] = (vg_input_op[]){
73 vg_mouse, SDL_BUTTON_RIGHT,
74 vg_joy_button, SDL_CONTROLLER_BUTTON_B, vg_end
75 },
76 [k_srbind_trick2] = (vg_input_op[]){
77 vg_mouse, SDL_BUTTON_LEFT, vg_mode_mul, vg_mouse, SDL_BUTTON_RIGHT,
78 vg_mode_absmax, vg_joy_button, SDL_CONTROLLER_BUTTON_X, vg_end
79 },
80 [k_srbind_use] = INPUT_BASIC( SDLK_e, SDL_CONTROLLER_BUTTON_Y ),
81 [k_srbind_reset] = INPUT_BASIC( SDLK_r, SDL_CONTROLLER_BUTTON_DPAD_LEFT ),
82 [k_srbind_dead_respawn] =
83 INPUT_BASIC( SDLK_q, SDL_CONTROLLER_BUTTON_DPAD_UP ),
84 [k_srbind_camera]= INPUT_BASIC( SDLK_c, SDL_CONTROLLER_BUTTON_DPAD_RIGHT ),
85 [k_srbind_mleft] = INPUT_BASIC( SDLK_LEFT, SDL_CONTROLLER_BUTTON_DPAD_LEFT ),
86 [k_srbind_mright]= INPUT_BASIC( SDLK_RIGHT, SDL_CONTROLLER_BUTTON_DPAD_RIGHT ),
87 [k_srbind_world_left] =
88 INPUT_BASIC( SDLK_LEFT, SDL_CONTROLLER_BUTTON_DPAD_LEFT ),
89 [k_srbind_world_right] =
90 INPUT_BASIC( SDLK_RIGHT, SDL_CONTROLLER_BUTTON_DPAD_RIGHT ),
91 [k_srbind_mup] = INPUT_BASIC( SDLK_UP, SDL_CONTROLLER_BUTTON_DPAD_UP ),
92 [k_srbind_mdown] = INPUT_BASIC( SDLK_DOWN, SDL_CONTROLLER_BUTTON_DPAD_DOWN ),
93 [k_srbind_mback] = INPUT_BASIC( SDLK_ESCAPE, SDL_CONTROLLER_BUTTON_B ),
94 [k_srbind_mopen] = INPUT_BASIC( SDLK_ESCAPE, SDL_CONTROLLER_BUTTON_START ),
95 [k_srbind_mhub] = INPUT_BASIC( SDLK_h, SDL_CONTROLLER_BUTTON_Y ),
96 [k_srbind_maccept] = (vg_input_op[]){
97 vg_keyboard, SDLK_e, vg_gui_visible, 0,
98 vg_keyboard, SDLK_RETURN, vg_keyboard, SDLK_RETURN2,
99 vg_gui_visible, 1,
100 vg_joy_button, SDL_CONTROLLER_BUTTON_A, vg_end
101 },
102 [k_srbind_replay_play] = INPUT_BASIC( SDLK_g, SDL_CONTROLLER_BUTTON_X ),
103 [k_srbind_replay_resume] = INPUT_BASIC( SDLK_SPACE, SDL_CONTROLLER_BUTTON_A ),
104 [k_srbind_replay_freecam] = INPUT_BASIC( SDLK_f, SDL_CONTROLLER_BUTTON_Y ),
105 [k_srbind_sit] = INPUT_BASIC( SDLK_z, SDL_CONTROLLER_BUTTON_B ),
106 [k_srbind_lobby] = INPUT_BASIC( SDLK_TAB, SDL_CONTROLLER_BUTTON_DPAD_LEFT ),
107 [k_srbind_chat ] = (vg_input_op[]){ vg_keyboard, SDLK_y, vg_end },
108 [k_srbind_run ] = (vg_input_op[]){ vg_keyboard, SDLK_LSHIFT,
109 vg_joy_axis, SDL_CONTROLLER_AXIS_TRIGGERLEFT, vg_end },
110
111 [k_srbind_miniworld_resume] = (vg_input_op[]){
112 vg_keyboard, SDLK_RETURN, vg_gui_visible, 0,
113 vg_keyboard, SDLK_RETURN2,
114 vg_gui_visible, 1,
115 vg_joy_button, SDL_CONTROLLER_BUTTON_X, vg_end
116 },
117 [k_srbind_miniworld_teleport]= INPUT_BASIC( SDLK_q,
118 SDL_CONTROLLER_BUTTON_LEFTSHOULDER ),
119 [k_srbind_skid] = (vg_input_op[]){ vg_keyboard, SDLK_LCTRL, vg_end },
120 [k_srbind_devbutton] = (vg_input_op[]){ vg_keyboard, SDLK_3, vg_end },
121 [k_srbind_max]=NULL
122 };
123
124 static vg_input_op *input_axis_list[] = {
125 [k_sraxis_grab] = (vg_input_op[]){
126 vg_keyboard, SDLK_LSHIFT,
127 vg_joy_axis, SDL_CONTROLLER_AXIS_TRIGGERRIGHT, vg_end
128 },
129 [k_sraxis_mbrowse_h] = (vg_input_op[]){
130 vg_mode_sub, vg_keyboard, SDLK_LEFT,
131 vg_mode_add, vg_keyboard, SDLK_RIGHT,
132 vg_mode_add, vg_joy_axis, SDL_CONTROLLER_AXIS_LEFTX,
133 vg_end
134 },
135 [k_sraxis_mbrowse_v] = (vg_input_op[]){
136 vg_mode_sub, vg_keyboard, SDLK_DOWN,
137 vg_mode_add, vg_keyboard, SDLK_UP,
138 vg_mode_sub, vg_joy_axis, SDL_CONTROLLER_AXIS_LEFTY,
139 vg_end
140 },
141 [k_sraxis_replay_h] = (vg_input_op[]){
142 vg_mode_sub, vg_keyboard, SDLK_q,
143 vg_mode_add, vg_keyboard, SDLK_e,
144 vg_mode_sub, vg_joy_axis, SDL_CONTROLLER_AXIS_TRIGGERLEFT,
145 vg_mode_add, vg_joy_axis, SDL_CONTROLLER_AXIS_TRIGGERRIGHT,
146 vg_end
147 },
148 [k_sraxis_skid] = (vg_input_op[]){
149 vg_mode_sub, vg_joy_button, SDL_CONTROLLER_BUTTON_LEFTSHOULDER,
150 vg_mode_add, vg_joy_button, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER,
151 vg_end
152 },
153 [k_sraxis_max]=NULL
154 };
155
156 static vg_input_op *input_joy_list[] = {
157 [k_srjoystick_steer] = (vg_input_op[]){
158 vg_index, 0, vg_mode_sub, vg_keyboard, SDLK_a,
159 vg_mode_add, vg_keyboard, SDLK_d,
160 vg_index, 1, vg_mode_sub, vg_keyboard, SDLK_w,
161 vg_mode_add, vg_keyboard, SDLK_s,
162 vg_mode_absmax, vg_joy_ls,
163 vg_end
164 },
165 [k_srjoystick_grab] = (vg_input_op[]){
166 vg_joy_rs, vg_end
167 },
168 [k_srjoystick_look] = (vg_input_op[]){
169 vg_joy_rs, vg_end
170 },
171 [k_srjoystick_max]=NULL
172 };
173
174 struct {
175 float axis_states[ k_sraxis_max ][2];
176 v2f joystick_states[ k_srjoystick_max ][2];
177 u8 button_states[ k_srbind_max ][2];
178
179 enum input_state {
180 k_input_state_enabled,
181 k_input_state_resume,
182 k_input_state_resuming,
183 k_input_state_pause
184 }
185 state;
186 }
187 static srinput;
188
189 static int input_filter_generic(void){
190 if( (srinput.state != k_input_state_enabled) || vg_console.enabled ||
191 (workshop_form.page != k_workshop_form_hidden) )
192 return 1;
193 else
194 return 0;
195 }
196
197 static int buttons_filter_fixed(void){
198 if( input_filter_generic() )
199 return 1;
200
201 if( vg.engine_stage == k_engine_stage_update_fixed )
202 if( vg.fixed_iterations > 0 )
203 return 1;
204
205 return 0;
206 }
207
208 /* Rising edge of button */
209 static int button_down( enum sr_bind button ){
210 if( buttons_filter_fixed() ) return 0;
211
212 if( srinput.button_states[ button ][0] &&
213 !srinput.button_states[ button ][1] )
214 return 1;
215 else
216 return 0;
217 }
218
219 /* Falling edge of button */
220 static int button_up( enum sr_bind button ){
221 if( buttons_filter_fixed() ) return 0;
222
223 if( !srinput.button_states[ button ][0] &&
224 srinput.button_states[ button ][1] )
225 return 1;
226 else
227 return 0;
228 }
229
230 /* State of button */
231 static int button_press( enum sr_bind button ){
232 if( input_filter_generic() )
233 return 0;
234 return
235 srinput.button_states[ button ][0];
236 }
237
238 static void joystick_state( enum sr_joystick joystick, v2f state ){
239 if( input_filter_generic() )
240 v2_zero( state );
241 else
242 v2_copy( srinput.joystick_states[ joystick ][0], state );
243 }
244
245 static float axis_state( enum sr_axis axis ){
246 if( input_filter_generic() )
247 return 0.0f;
248 else
249 return srinput.axis_states[axis][0];
250 }
251
252 static void skaterift_preupdate_inputs(void){
253 if( srinput.state == k_input_state_resuming )
254 srinput.state = k_input_state_enabled;
255
256 if( srinput.state == k_input_state_resume )
257 srinput.state = k_input_state_resuming;
258
259 for( u32 i=0; i<k_srbind_max; i++ ){
260 srinput.button_states[i][1] = srinput.button_states[i][0];
261 srinput.button_states[i][0] = 0;
262 }
263
264 for( u32 i=0; i<k_srjoystick_max; i++ ){
265 v2_copy( srinput.joystick_states[i][0], srinput.joystick_states[i][1] );
266 v2_zero( srinput.joystick_states[i][0] );
267 }
268
269 for( u32 i=0; i<k_sraxis_max; i++ ){
270 srinput.axis_states[i][1] = srinput.axis_states[i][0];
271 srinput.axis_states[i][0] = 0.0f;
272 }
273
274 for( int i=0; i<k_srbind_max; i++ ){
275 vg_input_op *prog = input_button_list[i];
276 if( prog ){
277 vg_exec_input_program( k_vg_input_type_button_u8, prog,
278 &srinput.button_states[i][0] );
279 }
280 }
281
282 for( int i=0; i<k_sraxis_max; i++ ){
283 vg_input_op *prog = input_axis_list[i];
284 if( prog ){
285 vg_exec_input_program( k_vg_input_type_axis_f32, prog,
286 &srinput.axis_states[i][0] );
287 }
288 }
289
290 for( int i=0; i<k_srjoystick_max; i++ ){
291 vg_input_op *prog = input_joy_list[i];
292 if( prog ){
293 vg_exec_input_program( k_vg_input_type_joy_v2f, prog,
294 srinput.joystick_states[i][0] );
295 }
296 }
297
298 f32 x = srinput.axis_states[k_sraxis_mbrowse_h][0],
299 y = srinput.axis_states[k_sraxis_mbrowse_v][0],
300 sensitivity = 0.35f;
301
302 if( fabsf(x) > sensitivity ){
303 if( x > 0.0f ) srinput.button_states[k_srbind_mright][0] = 1;
304 else srinput.button_states[k_srbind_mleft][0] = 1;
305 }
306
307 if( fabsf(y) > sensitivity ){
308 if( y > 0.0f ) srinput.button_states[k_srbind_mup][0] = 1;
309 else srinput.button_states[k_srbind_mdown][0] = 1;
310 }
311 }