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