dusting
[vg.git] / vg_input.h
index af0ac6882d9ff285cdbe6e95ba91d71a930553a8..8a75b70a37988e77741e0e98b4869e2fbd4f50c7 100644 (file)
@@ -13,23 +13,19 @@ VG_STATIC inline int vg_get_button( const char *button );
  */
 VG_STATIC inline int vg_get_button_down( const char *button );
 VG_STATIC inline int vg_get_button_up( const char *button );
+VG_STATIC float controller_deadzone = 0.05f;
 
-VG_STATIC float g_controller_deadzone = 0.05f;
-
-enum vg_button_state
-{
+enum vg_button_state{
        k_button_state_down = 1,
        k_button_state_up = 3,
        k_button_state_pressed = 2,
        k_button_state_none = 0
 };
 
-struct input_binding
-{
+struct input_binding{
        const char *name;
 
-   enum input_type
-   {
+   enum input_type{
       k_input_type_button,
       k_input_type_axis,
       k_input_type_axis_norm,
@@ -42,10 +38,8 @@ struct input_binding
    }
    type;
 
-   union
-   {
-      struct input_axis
-      {
+   union{
+      struct input_axis{
          SDL_GameControllerAxis gamepad_axis;
          SDL_Keycode            keyboard_positive,
                                 keyboard_negative;
@@ -55,8 +49,7 @@ struct input_binding
       }
       axis;
 
-      struct
-      {
+      struct{
          SDL_GameControllerButton gamepad_id;
          SDL_Keycode              keyboard_id;
          int                      mouse_id;
@@ -127,8 +120,7 @@ VG_STATIC struct input_binding *vg_get_named_input( const char *name )
    if( name[0] == '+' || name[0] == '-' )
       name ++;
 
-   for( u32 i=0; i<vg_input.named_input_count; i++ )
-   {
+   for( u32 i=0; i<vg_input.named_input_count; i++ ){
       struct input_binding *bind = &vg_input.named_inputs[i];
       if( !strcmp( bind->name, name ) )
          return bind;
@@ -193,23 +185,19 @@ VG_STATIC const char *vg_input_to_str( u32 input, enum input_type input_type )
    if( input == -1 )
       return NULL;
 
-   if( input_type == k_input_type_keyboard_key )
-   {
-      if( (input >= SDLK_a) && (input <= SDLK_z) )
-      {
+   if( input_type == k_input_type_keyboard_key ){
+      if( (input >= SDLK_a) && (input <= SDLK_z) ){
          return &"a\0b\0c\0d\0e\0f\0g\0h\0i\0j\0k\0l\0m\0n\0o\0p\0"
                  "q\0r\0s\0t\0u\0v\0w\0x\0y\0z\0"[(input-SDLK_a)*2];
       }
 
-      if( (input >= SDLK_0) && (input <= SDLK_9) )
-      {
+      if( (input >= SDLK_0) && (input <= SDLK_9) ){
          return &"0\0" "1\0" "2\0" "3\0" "4\0" 
                  "5\0" "6\0" "7\0" "8\0" "9\0"[(input-SDLK_0)*2];
       }
    }
 
-   for( int i=0; i<vg_list_size(vg_all_bindable_inputs); i++ )
-   {
+   for( int i=0; i<vg_list_size(vg_all_bindable_inputs); i++ ){
       struct input_en *desc = &vg_all_bindable_inputs[i];
 
       if( (desc->type == input_type) && (desc->id == input) )
@@ -221,43 +209,36 @@ VG_STATIC const char *vg_input_to_str( u32 input, enum input_type input_type )
 
 VG_STATIC enum input_type vg_str_to_input( const char *str, u32 *input )
 {
-   if( !str )
-   {
+   if( !str ){
       *input = -1;
       return k_input_type_unknown;
    }
 
    u32 len = strlen(str);
 
-   if( len == 0 )
-   {
+   if( len == 0 ){
       *input = -1;
       return k_input_type_unknown;
    }
 
-   if( len == 1 )
-   {
+   if( len == 1 ){
       u8 uch = str[0];
 
-      if( (uch >= (u8)'a') && (uch <= (u8)'z') )
-      {
+      if( (uch >= (u8)'a') && (uch <= (u8)'z') ){
          *input = SDLK_a + (uch-(u8)'a');
          return k_input_type_keyboard_key;
       }
 
-      if( (uch >= (u8)'0') && (uch <= (u8)'9') )
-      {
+      if( (uch >= (u8)'0') && (uch <= (u8)'9') ){
          *input = SDLK_0 + (uch-(u8)'0');
          return k_input_type_keyboard_key;
       }
    }
 
-   for( int i=0; i<vg_list_size(vg_all_bindable_inputs); i++ )
-   {
+   for( int i=0; i<vg_list_size(vg_all_bindable_inputs); i++ ){
       struct input_en *desc = &vg_all_bindable_inputs[i];
 
-      if( !strcmp( desc->alias, str ) )
-      {
+      if( !strcmp( desc->alias, str ) ){
          *input = desc->id;
          return desc->type;
       }
@@ -288,8 +269,7 @@ VG_STATIC void vg_print_binding_info( struct input_binding *bind )
          vg_input_to_str(bind->axis.keyboard_negative, 
                          k_input_type_keyboard_key ));
    }
-   else
-   {
+   else{
       vg_info( "      gamepad_id: %s\n", 
          vg_input_to_str(bind->button.gamepad_id, k_input_type_gamepad_button));
       vg_info( "      keyboard_id: %s\n",
@@ -307,16 +287,14 @@ VG_STATIC void vg_apply_bind_str( struct input_binding *bind,
 {
    int axis_mod = 0;
    char modch = ' ';
-   if( (mod[0] == '-') || (mod[0] == '+') )
-   {
+   if( (mod[0] == '-') || (mod[0] == '+') ){
       axis_mod = 1;
       modch = mod[0];
       mod ++;
    }
    
    int invert = 0;
-   if( (str[0] == '-' ) )
-   {
+   if( (str[0] == '-' ) ){
       invert = 1;
       str ++;
    }
@@ -324,16 +302,13 @@ VG_STATIC void vg_apply_bind_str( struct input_binding *bind,
    u32 id;
    enum input_type type = vg_str_to_input( str, &id );
 
-   if( bind->type == k_input_type_button )
-   {
-      if( axis_mod )
-      {
+   if( bind->type == k_input_type_button ){
+      if( axis_mod ){
          vg_error( "Cannot use axis modifiers on button input!\n" );
          return;
       }
 
-      if( invert )
-      {
+      if( invert ){
          vg_error( "Cannot invert button input!\n" );
          return;
       }
@@ -344,8 +319,7 @@ VG_STATIC void vg_apply_bind_str( struct input_binding *bind,
          bind->button.mouse_id = id;
       else if( type == k_input_type_gamepad_button )
          bind->button.gamepad_id = id;
-      else
-      {
+      else{
          vg_error( "Unknown button or key '%s'\n", str );
          return;
       }
@@ -353,12 +327,9 @@ VG_STATIC void vg_apply_bind_str( struct input_binding *bind,
    else if( (bind->type == k_input_type_axis ) ||
             (bind->type == k_input_type_axis_norm))
    {
-      if( axis_mod )
-      {
-         if( type == k_input_type_keyboard_key )
-         {
-            if( invert )
-            {
+      if( axis_mod ){
+         if( type == k_input_type_keyboard_key ){
+            if( invert ){
                vg_error( "Cannot invert a keyboard key!\n" );
                return;
             }
@@ -368,21 +339,17 @@ VG_STATIC void vg_apply_bind_str( struct input_binding *bind,
             else
                bind->axis.keyboard_negative = id;
          }
-         else
-         {
+         else{
             vg_error( "You can only bind keyboard keys to +- axises\n" );
             return;
          }
       }
-      else
-      {
-         if( type == k_input_type_gamepad_axis )
-         {
+      else{
+         if( type == k_input_type_gamepad_axis ){
             bind->axis.gamepad_inverted = invert;
             bind->axis.gamepad_axis = id;
          }
-         else
-         {
+         else{
             vg_error( "You can only bind gamepad axises to this\n" );
             return;
          }
@@ -399,8 +366,7 @@ VG_STATIC void vg_apply_bind_str( struct input_binding *bind,
 
 VG_STATIC int vg_rebind_input_cmd( int argc, const char *argv[] )
 {
-   if( argc == 0 )
-   {
+   if( argc == 0 ){
       vg_info( "Usage: bind jump x\n" );
       vg_info( "       bind -steerh j\n" );
       vg_info( "       bind steerh gp-ls-h\n" );
@@ -410,20 +376,17 @@ VG_STATIC int vg_rebind_input_cmd( int argc, const char *argv[] )
    const char *str_bind_name = argv[0];
    struct input_binding *bind = vg_get_named_input( str_bind_name );
 
-   if( !bind )
-   {
+   if( !bind ){
       vg_error( "There is no bind with that name '%s'\n", str_bind_name );
       return 0;
    }
 
-   if( argc == 1 )
-   {
+   if( argc == 1 ){
       vg_print_binding_info( bind );
       return 0;
    }
 
-   if( argc == 2 )
-   {
+   if( argc == 2 ){
       const char *str_input_id  = argv[1];
 
       vg_apply_bind_str( bind, str_bind_name, str_input_id );
@@ -440,19 +403,14 @@ VG_STATIC void vg_rebind_input_cmd_poll( int argc, const char *argv[] )
 
    const char *str_bind_name = argv[0];
 
-   if( argc == 1 )
-   {
-      for( u32 i=0; i<vg_input.named_input_count; i++ )
-      {
+   if( argc == 1 ){
+      for( u32 i=0; i<vg_input.named_input_count; i++ ){
          struct input_binding *bind = &vg_input.named_inputs[i];
          console_suggest_score_text( bind->name, argv[argc-1], 0 );
       }
    }
-
-   else if( argc == 2 )
-   {
-      for( int i=0; i<vg_list_size(vg_all_bindable_inputs); i++ )
-      {
+   else if( argc == 2 ){
+      for( int i=0; i<vg_list_size(vg_all_bindable_inputs); i++ ){
          struct input_en *desc = &vg_all_bindable_inputs[i];
          console_suggest_score_text( desc->alias, argv[argc-1], 0 );
       }
@@ -467,14 +425,11 @@ VG_STATIC u8 vg_getkey( SDL_Keycode kc )
 
 VG_STATIC void vg_input_update( u32 num, struct input_binding *binds )
 {
-   if( vg_console.enabled )
-   {
-      for( i32 i=0; i<num; i++ )
-      {
+   if( vg_console.enabled ){
+      for( i32 i=0; i<num; i++ ){
          struct input_binding *bind = &binds[i];
 
-         if( bind->type == k_input_type_button )
-         {
+         if( bind->type == k_input_type_button ){
             bind->button.prev = bind->button.value;
             bind->button.value = 0;
          }
@@ -483,12 +438,10 @@ VG_STATIC void vg_input_update( u32 num, struct input_binding *binds )
       return;
    }
 
-   for( i32 i=0; i<num; i++ )
-   {
+   for( i32 i=0; i<num; i++ ){
       struct input_binding *bind = &binds[i];
 
-      if( bind->type == k_input_type_button )
-      {
+      if( bind->type == k_input_type_button ){
          bind->button.prev = bind->button.value;
          bind->button.value = 0;
 
@@ -496,20 +449,17 @@ VG_STATIC void vg_input_update( u32 num, struct input_binding *binds )
             bind->button.value |= 
                vg_input.controller_buttons[ bind->button.gamepad_id ];
 
-         if( bind->button.keyboard_id != -1 )
-         {
+         if( bind->button.keyboard_id != -1 ){
             bind->button.value |= vg_getkey( bind->button.keyboard_id );
          }
 
-         if( bind->button.mouse_id != -1 )
-         {
+         if( bind->button.mouse_id != -1 ){
             if( SDL_GetMouseState(NULL, NULL) & 
                                     SDL_BUTTON( bind->button.mouse_id ) )
                bind->button.value |= 1;
          }
       }
-      else if( bind->type == k_input_type_axis )
-      {
+      else if( bind->type == k_input_type_axis ){
          float keyboard_value = 0.0f,
                gamepad_value = 0.0f;
 
@@ -521,8 +471,7 @@ VG_STATIC void vg_input_update( u32 num, struct input_binding *binds )
             if( vg_getkey( bind->axis.keyboard_negative ) )
                keyboard_value -= 1.0f;
 
-         if( bind->axis.gamepad_axis != -1 )
-         {
+         if( bind->axis.gamepad_axis != -1 ){
             gamepad_value = 
                vg_input.controller_axises[ bind->axis.gamepad_axis ];
 
@@ -530,7 +479,7 @@ VG_STATIC void vg_input_update( u32 num, struct input_binding *binds )
                gamepad_value *= -1.0f;
          }
 
-         float deadz   = vg_clampf( g_controller_deadzone, 0.0f, 0.999f ),
+         float deadz   = vg_clampf( controller_deadzone, 0.0f, 0.999f ),
                high    = vg_maxf( 0.0f, fabsf(gamepad_value) - deadz ),
                norm    = high / (1.0f-deadz);
 
@@ -541,8 +490,7 @@ VG_STATIC void vg_input_update( u32 num, struct input_binding *binds )
          else
             bind->axis.value = gamepad_value;
       }
-      else if( bind->type == k_input_type_axis_norm )
-      {
+      else if( bind->type == k_input_type_axis_norm ){
          float value = 0.0f;
          if( bind->axis.keyboard_positive != -1 )
             if( vg_getkey( bind->axis.keyboard_positive ))
@@ -559,21 +507,17 @@ VG_STATIC void vg_input_update( u32 num, struct input_binding *binds )
 
 VG_STATIC void vg_input_controller_event( SDL_Event *ev )
 {
-   if( ev->type == SDL_CONTROLLERAXISMOTION )
-   {
-      if( ev->caxis.which == vg_input.controller_joystick_id )
-      {
+   if( ev->type == SDL_CONTROLLERAXISMOTION ){
+      if( ev->caxis.which == vg_input.controller_joystick_id ){
          vg_input.controller_axises[ ev->caxis.axis ] = 
             (float)ev->caxis.value / 32767.0f;
       }
    }
-   else if( ev->type == SDL_CONTROLLERBUTTONDOWN )
-   {
+   else if( ev->type == SDL_CONTROLLERBUTTONDOWN ){
       if( ev->cbutton.which == vg_input.controller_joystick_id )
          vg_input.controller_buttons[ ev->cbutton.button ] = 1;
    }
-   else if( ev->type == SDL_CONTROLLERBUTTONUP )
-   {
+   else if( ev->type == SDL_CONTROLLERBUTTONUP ){
       if( ev->cbutton.which == vg_input.controller_joystick_id )
          vg_input.controller_buttons[ ev->cbutton.button ] = 0;
    }
@@ -582,10 +526,8 @@ VG_STATIC void vg_input_controller_event( SDL_Event *ev )
 VG_STATIC void vg_try_attach_controller(void)
 {
    int joy_count = SDL_NumJoysticks();
-   for( int i=0; i<joy_count; i++ ) 
-   {
-      if( SDL_IsGameController(i) ) 
-      {
+   for( int i=0; i<joy_count; i++ ) {
+      if( SDL_IsGameController(i) ) {
          vg_input.controller_handle = SDL_GameControllerOpen(i);
          vg_input.controller_joystick_id = i;
          vg_success( "Attached game controller with joystick ID %d\n", i );
@@ -594,22 +536,18 @@ VG_STATIC void vg_try_attach_controller(void)
    }
 }
 
-
 VG_STATIC void vg_update_inputs(void)
 {
    vg_input.sdl_keys = SDL_GetKeyboardState(NULL);
 
-   if( vg_input.controller_handle )
-   {
-      if( !SDL_GameControllerGetAttached( vg_input.controller_handle ) )
-      {
+   if( vg_input.controller_handle ){
+      if( !SDL_GameControllerGetAttached( vg_input.controller_handle ) ){
          SDL_GameControllerClose( vg_input.controller_handle );
          vg_input.controller_handle = NULL;
       }
    }
 
-   if( !vg_input.controller_handle )
-   {
+   if( !vg_input.controller_handle ){
       vg_input.controller_axises[ SDL_CONTROLLER_AXIS_TRIGGERLEFT ] = -1.0f;
       vg_input.controller_axises[ SDL_CONTROLLER_AXIS_TRIGGERRIGHT ] = -1.0f;
       vg_try_attach_controller();
@@ -631,21 +569,9 @@ VG_STATIC void vg_input_init(void)
 {
    vg_acquire_thread_sync();
 
-   vg_function_push( (struct vg_cmd)
-   {
-      .name = "bind",
-      .function = vg_rebind_input_cmd,
-      .poll_suggest = vg_rebind_input_cmd_poll
-   });
-
-   vg_var_push( (struct vg_var){
-      .name = "controller_deadzone",
-      .data = &g_controller_deadzone,
-      .data_type = k_var_dtype_f32,
-      .opt_f32 = { .clamp = 0 },
-      .persistent = 1
-   });
+   vg_console_reg_cmd( "bind", vg_rebind_input_cmd, vg_rebind_input_cmd_poll );
 
+   VG_VAR_F32( controller_deadzone, flags=VG_VAR_PERSISTENT );
    vg_info( "Checking for controller\n" );
    SDL_GameControllerAddMappingsFromFile( "gamecontrollerdb.txt" );
    
@@ -667,8 +593,7 @@ VG_STATIC void vg_input_init(void)
 
 VG_STATIC void vg_input_free(void)
 {
-   if( vg_input.controller_handle )
-   {
+   if( vg_input.controller_handle ){
       SDL_GameControllerClose( vg_input.controller_handle );
       vg_input.controller_handle = NULL;
    }