input update 1
[carveJwlIkooP6JGAAIwe30JlM.git] / input.h
diff --git a/input.h b/input.h
new file mode 100644 (file)
index 0000000..c6710f2
--- /dev/null
+++ b/input.h
@@ -0,0 +1,174 @@
+#ifndef INPUT_H
+#define INPUT_H
+
+#define VG_GAME
+#include "vg/vg.h"
+#include "vg/vg_platform.h" 
+#include "vg/vg_console.h"
+#include "vg/vg_input.h"
+#include "vg/vg_m.h"
+#include "conf.h"
+
+enum sr_bind{
+   k_srbind_jump = 0,
+   k_srbind_push,
+   k_srbind_trick0,
+   k_srbind_trick1,
+   k_srbind_trick2,
+   k_srbind_use,
+   k_srbind_reset,
+   k_srbind_camera,
+   k_srbind_mleft, 
+   k_srbind_mright, 
+   k_srbind_mup, 
+   k_srbind_mdown,
+   k_srbind_mback, 
+   k_srbind_maccept,
+   k_srbind_max
+};
+
+struct {
+   v2f joy_steer,
+       joy_grab,
+       joy_look;
+
+   float axis_grab;
+
+   u8 button_states[ k_srbind_max ][2];
+   float repeaters[4];
+}
+static srinput;
+
+static int button_down( enum sr_bind button )
+{
+   if( vg_console.enabled )
+      return 0;
+
+   if( vg.engine_stage == k_engine_stage_update_fixed )
+      if( vg.fixed_iterations > 0 )
+         return 0;
+   
+   if(  srinput.button_states[ button ][0] && 
+       !srinput.button_states[ button ][1] )
+      return 1;
+   else
+      return 0;
+}
+
+static int button_up( enum sr_bind button )
+{
+   if( vg_console.enabled )
+      return 0;
+
+   if( vg.engine_stage == k_engine_stage_update_fixed )
+      if( vg.fixed_iterations > 0 )
+         return 0;
+   
+   if( !srinput.button_states[ button ][0] && 
+        srinput.button_states[ button ][1] )
+      return 1;
+   else
+      return 0;
+}
+
+static int button_press( enum sr_bind button )
+{
+   if( vg_console.enabled )
+      return 0;
+
+   return srinput.button_states[ button ][0];
+}
+
+static void setbtn( enum sr_bind button, u8 value )
+{
+   srinput.button_states[button][0] |= value;
+}
+
+static void skaterift_preupdate_inputs(void)
+{
+   for( u32 i=0; i<k_srbind_max; i++ ){
+      srinput.button_states[i][1] = srinput.button_states[i][0];
+      srinput.button_states[i][0] = 0;
+   }
+
+   u32 mouse = SDL_GetMouseState(NULL,NULL),
+       mouse1= (mouse & SDL_BUTTON(SDL_BUTTON_LEFT))? 1: 0,
+       mouse2= (mouse & SDL_BUTTON(SDL_BUTTON_RIGHT))? 1: 0;
+
+   /* button inputs
+    * ------------------------------------- */
+   setbtn( k_srbind_jump,    vg_getkey(SDLK_SPACE) );
+   setbtn( k_srbind_push,    vg_getkey(SDLK_w) );
+   setbtn( k_srbind_trick0,  mouse1 );
+   setbtn( k_srbind_trick1,  mouse2 );
+   setbtn( k_srbind_trick2,  mouse1 & mouse2 );
+   setbtn( k_srbind_use,     vg_getkey(SDLK_e) );
+   setbtn( k_srbind_reset,   vg_getkey(SDLK_r) );
+   setbtn( k_srbind_camera,  vg_getkey(SDLK_c) );
+   setbtn( k_srbind_mleft,   vg_getkey(SDLK_LEFT) );
+   setbtn( k_srbind_mright,  vg_getkey(SDLK_RIGHT) );
+   setbtn( k_srbind_mup,     vg_getkey(SDLK_UP) );
+   setbtn( k_srbind_mdown,   vg_getkey(SDLK_DOWN) );
+   setbtn( k_srbind_mback,   vg_getkey(SDLK_ESCAPE) );
+   setbtn( k_srbind_maccept, vg_getkey(SDLK_e) );
+   setbtn( k_srbind_maccept, vg_getkey(SDLK_RETURN));
+   setbtn( k_srbind_maccept, vg_getkey(SDLK_RETURN2));
+
+   /* axis
+    * --------------------------------------------*/
+   srinput.axis_grab = vg_getkey( SDLK_LSHIFT );
+
+   v2_zero( srinput.joy_steer );
+   v2_zero( srinput.joy_grab );
+   v2_zero( srinput.joy_look );
+
+   if( vg_getkey( SDLK_d ) ) srinput.joy_steer[0] += 1.0f;
+   if( vg_getkey( SDLK_a ) ) srinput.joy_steer[0] -= 1.0f;
+   if( vg_getkey( SDLK_w ) ) srinput.joy_steer[1] -= 1.0f;
+   if( vg_getkey( SDLK_s ) ) srinput.joy_steer[1] += 1.0f;
+
+   if( vg_input.active_controller_index != -1 ){
+      struct vg_controller *controller = 
+         &vg_input.controllers[vg_input.active_controller_index];
+
+      u32 *buttons = controller->buttons;
+      setbtn( k_srbind_jump,   buttons[ SDL_CONTROLLER_BUTTON_A ] );
+      setbtn( k_srbind_push,   buttons[ SDL_CONTROLLER_BUTTON_B ] );
+      setbtn( k_srbind_trick0, buttons[ SDL_CONTROLLER_BUTTON_A ] );
+      setbtn( k_srbind_trick1, buttons[ SDL_CONTROLLER_BUTTON_B ] );
+      setbtn( k_srbind_trick2, buttons[ SDL_CONTROLLER_BUTTON_X ] );
+      setbtn( k_srbind_use,    buttons[ SDL_CONTROLLER_BUTTON_Y ] );
+      setbtn( k_srbind_reset,  buttons[ SDL_CONTROLLER_BUTTON_LEFTSHOULDER ] );
+      setbtn( k_srbind_camera, buttons[ SDL_CONTROLLER_BUTTON_RIGHTSHOULDER ] );
+      setbtn( k_srbind_mleft,  buttons[ SDL_CONTROLLER_BUTTON_DPAD_LEFT ] );
+      setbtn( k_srbind_mright, buttons[ SDL_CONTROLLER_BUTTON_DPAD_RIGHT ] );
+      setbtn( k_srbind_mup,    buttons[ SDL_CONTROLLER_BUTTON_DPAD_UP ] );
+      setbtn( k_srbind_mdown,  buttons[ SDL_CONTROLLER_BUTTON_DPAD_DOWN ] );
+
+      float *axis = controller->axises;
+      
+      srinput.joy_steer[0] += axis[ SDL_CONTROLLER_AXIS_LEFTX ],
+      srinput.joy_steer[1] += axis[ SDL_CONTROLLER_AXIS_LEFTY ],
+      srinput.joy_look[0]  += axis[ SDL_CONTROLLER_AXIS_RIGHTX ];
+      srinput.joy_look[1]  += axis[ SDL_CONTROLLER_AXIS_RIGHTY ];
+      srinput.joy_grab[0]  += axis[ SDL_CONTROLLER_AXIS_RIGHTX ];
+      srinput.joy_grab[1]  += axis[ SDL_CONTROLLER_AXIS_RIGHTY ];
+      srinput.axis_grab    += vg_maxf( 0.0f, 
+                                    axis[ SDL_CONTROLLER_AXIS_TRIGGERRIGHT ] );
+
+      float lh = axis[ SDL_CONTROLLER_AXIS_LEFTX ],
+            lv = axis[ SDL_CONTROLLER_AXIS_LEFTY ],
+            sensitivity = 0.35f;
+
+      if( lh >  sensitivity ) setbtn( k_srbind_mright, 1 );
+      if( lh < -sensitivity ) setbtn( k_srbind_mleft, 1 );
+      if( lv >  sensitivity ) setbtn( k_srbind_mup, 1 );
+      if( lv < -sensitivity ) setbtn( k_srbind_mdown, 1 );
+   }
+
+   //v2_normalize_clamp( srinput.joy_steer );
+   //v2_normalize_clamp( srinput.joy_grab );
+   srinput.axis_grab = vg_minf( 1.0f, srinput.axis_grab );
+}
+
+#endif /* INPUT_H */