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