build scripts
[fishladder.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 "vg/vg_tex.h"
7 #include "vg/vg_imgui.h"
8
9 enum sr_bind{
10 k_srbind_primary = 0,
11 k_srbind_secondary,
12 k_srbind_tertiary,
13 k_srbind_go,
14 k_srbind_max,
15 };
16
17 enum sr_joystick{
18 k_srjoystick_max
19 };
20
21 enum sr_axis{
22 k_sraxis_max
23 };
24
25
26 #define INPUT_BASIC( KB, JS ) \
27 (vg_input_op[]){vg_keyboard, KB, vg_joy_button, JS, vg_end}
28
29 static vg_input_op *input_button_list[] = {
30 [k_srbind_primary] = (vg_input_op[]){
31 vg_mouse, SDL_BUTTON_LEFT, vg_end
32 },
33 [k_srbind_secondary] = (vg_input_op[]){
34 vg_mouse, SDL_BUTTON_RIGHT, vg_end
35 },
36 [k_srbind_tertiary] = (vg_input_op[]){
37 vg_mouse, SDL_BUTTON_MIDDLE, vg_end
38 },
39 [k_srbind_go] = (vg_input_op[]){
40 vg_keyboard, SDLK_SPACE, vg_end
41 },
42 [k_srbind_max]=NULL
43 };
44
45 static vg_input_op *input_axis_list[] = {
46 [k_sraxis_max]=NULL
47 };
48
49 static vg_input_op *input_joy_list[] = {
50 [k_srjoystick_max]=NULL
51 };
52
53 struct {
54 float axis_states[ k_sraxis_max ][2];
55 v2f joystick_states[ k_srjoystick_max ][2];
56 u8 button_states[ k_srbind_max ][2];
57
58 enum input_state {
59 k_input_state_enabled,
60 k_input_state_resume,
61 k_input_state_resuming,
62 k_input_state_pause
63 }
64 state;
65 }
66 static srinput;
67
68 static int input_filter_generic(void){
69 if( (srinput.state != k_input_state_enabled) ||
70 vg_console.enabled || vg.settings_open )
71 return 1;
72 else
73 return 0;
74 }
75
76 static int buttons_filter_fixed(void){
77 if( input_filter_generic() )
78 return 1;
79
80 if( vg.engine_stage == k_engine_stage_update_fixed )
81 if( vg.fixed_iterations > 0 )
82 return 1;
83
84 return 0;
85 }
86
87 /* Rising edge of button */
88 static int button_down( enum sr_bind button ){
89 if( buttons_filter_fixed() ) return 0;
90
91 if( srinput.button_states[ button ][0] &&
92 !srinput.button_states[ button ][1] )
93 return 1;
94 else
95 return 0;
96 }
97
98 /* Falling edge of button */
99 static int button_up( enum sr_bind button ){
100 if( buttons_filter_fixed() ) return 0;
101
102 if( !srinput.button_states[ button ][0] &&
103 srinput.button_states[ button ][1] )
104 return 1;
105 else
106 return 0;
107 }
108
109 /* State of button */
110 static int button_press( enum sr_bind button ){
111 if( input_filter_generic() )
112 return 0;
113 return
114 srinput.button_states[ button ][0];
115 }
116
117 static void joystick_state( enum sr_joystick joystick, v2f state ){
118 if( input_filter_generic() )
119 v2_zero( state );
120 else
121 v2_copy( srinput.joystick_states[ joystick ][0], state );
122 }
123
124 static float axis_state( enum sr_axis axis ){
125 if( input_filter_generic() )
126 return 0.0f;
127 else
128 return srinput.axis_states[axis][0];
129 }
130
131 static void skaterift_preupdate_inputs(void){
132 if( srinput.state == k_input_state_resuming )
133 srinput.state = k_input_state_enabled;
134
135 if( srinput.state == k_input_state_resume )
136 srinput.state = k_input_state_resuming;
137
138 for( u32 i=0; i<k_srbind_max; i++ ){
139 srinput.button_states[i][1] = srinput.button_states[i][0];
140 srinput.button_states[i][0] = 0;
141 }
142
143 for( u32 i=0; i<k_srjoystick_max; i++ ){
144 v2_copy( srinput.joystick_states[i][0], srinput.joystick_states[i][1] );
145 v2_zero( srinput.joystick_states[i][0] );
146 }
147
148 for( u32 i=0; i<k_sraxis_max; i++ ){
149 srinput.axis_states[i][1] = srinput.axis_states[i][0];
150 srinput.axis_states[i][0] = 0.0f;
151 }
152
153 for( int i=0; i<k_srbind_max; i++ ){
154 vg_input_op *prog = input_button_list[i];
155 if( prog ){
156 vg_exec_input_program( k_vg_input_type_button_u8, prog,
157 &srinput.button_states[i][0] );
158 }
159 }
160
161 for( int i=0; i<k_sraxis_max; i++ ){
162 vg_input_op *prog = input_axis_list[i];
163 if( prog ){
164 vg_exec_input_program( k_vg_input_type_axis_f32, prog,
165 &srinput.axis_states[i][0] );
166 }
167 }
168
169 for( int i=0; i<k_srjoystick_max; i++ ){
170 vg_input_op *prog = input_joy_list[i];
171 if( prog ){
172 vg_exec_input_program( k_vg_input_type_joy_v2f, prog,
173 srinput.joystick_states[i][0] );
174 }
175 }
176 }