assorted
[vg.git] / src / vg / vg_input.h
index 19e1f36ce796725fe15a718f6e167df24e9b4732..5b16287fbce20ca63238037d95a1b5712dad067b 100644 (file)
@@ -34,6 +34,7 @@ VG_STATIC struct input_binding
 
       k_input_type_unknown,
       k_input_type_keyboard_key,
+      k_input_type_mouse_button, /* ? TODO */
       k_input_type_gamepad_axis,
       k_input_type_gamepad_button
    }
@@ -47,6 +48,7 @@ VG_STATIC struct input_binding
              keyboard_positive,
              keyboard_negative;
 
+         int gamepad_inverted;
          float value;
       }
       axis;
@@ -64,6 +66,22 @@ VG_STATIC struct input_binding
 vg_named_inputs[ 32 ];
 VG_STATIC u32 vg_named_input_count = 0;
 
+VG_STATIC void vg_create_unnamed_input( struct input_binding *bind,
+                                        enum input_type type )
+{
+   memset( bind, 0, sizeof(struct input_binding) );
+
+   bind->name = "API DEFINED";
+   bind->save_this = 0;
+   bind->type = type;
+
+   bind->axis.gamepad_axis = -1;
+   bind->axis.keyboard_positive = -1;
+   bind->axis.keyboard_negative = -1;
+   bind->button.gamepad_id = -1;
+   bind->button.keyboard_id = -1;
+}
+
 VG_STATIC struct input_binding *vg_create_named_input( const char *name,
                                                        enum input_type type )
 {
@@ -74,11 +92,20 @@ VG_STATIC struct input_binding *vg_create_named_input( const char *name,
    bind->save_this = 0;
    bind->type = type;
 
+   bind->axis.gamepad_axis = -1;
+   bind->axis.keyboard_positive = -1;
+   bind->axis.keyboard_negative = -1;
+   bind->button.gamepad_id = -1;
+   bind->button.keyboard_id = -1;
+
    return bind;
 }
 
 VG_STATIC struct input_binding *vg_get_named_input( const char *name )
 {
+   if( name[0] == '+' || name[0] == '-' )
+      name ++;
+
    for( u32 i=0; i<vg_named_input_count; i++ )
    {
       struct input_binding *bind = &vg_named_inputs[i];
@@ -112,6 +139,8 @@ vg_all_bindable_inputs[] =
  {k_input_type_keyboard_key, "down", GLFW_KEY_DOWN},
  {k_input_type_keyboard_key, "shift", GLFW_KEY_LEFT_SHIFT},
  {k_input_type_keyboard_key, "control", GLFW_KEY_LEFT_CONTROL},
+ {k_input_type_keyboard_key, "\2enter", GLFW_KEY_ENTER},
+ {k_input_type_keyboard_key, "\2escape", GLFW_KEY_ESCAPE },
  
  {k_input_type_gamepad_axis, "gp-lt", GLFW_GAMEPAD_AXIS_LEFT_TRIGGER},
  {k_input_type_gamepad_axis, "gp-rt", GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER},
@@ -131,7 +160,8 @@ vg_all_bindable_inputs[] =
  {k_input_type_gamepad_button, "gp-dpad-down", GLFW_GAMEPAD_BUTTON_DPAD_DOWN},
  {k_input_type_gamepad_button, "gp-dpad-left", GLFW_GAMEPAD_BUTTON_DPAD_LEFT},
  {k_input_type_gamepad_button, "gp-dpad-right", GLFW_GAMEPAD_BUTTON_DPAD_RIGHT},
- {k_input_type_gamepad_button, "gp-dpad-up", GLFW_GAMEPAD_BUTTON_DPAD_UP}
+ {k_input_type_gamepad_button, "gp-dpad-up", GLFW_GAMEPAD_BUTTON_DPAD_UP},
+ {k_input_type_gamepad_button, "\2gp-menu", GLFW_GAMEPAD_BUTTON_BACK}
 };
 
 VG_STATIC const char *vg_input_to_str( u32 input, enum input_type input_type )
@@ -216,7 +246,8 @@ VG_STATIC enum input_type vg_str_to_input( const char *str, u32 *input )
 VG_STATIC void vg_print_binding_info( struct input_binding *bind )
 {
    vg_info( "    name: %s\n", bind->name );
-   vg_info( "    type: %s\n", (const char *[]){"button","axis"}[ bind->type ] );
+   vg_info( "    type: %s\n", (const char *[]){"button","axis","axis[0-1]"}
+                                                [ bind->type ] );
    vg_info( "    save this? %d\n", bind->save_this );
 
    if( (bind->type == k_input_type_axis) ||
@@ -243,10 +274,98 @@ VG_STATIC void vg_print_binding_info( struct input_binding *bind )
    }
 }
 
+VG_STATIC void vg_apply_bind_str( struct input_binding *bind,
+                                  const char *mod,
+                                  const char *str )
+{
+   int axis_mod = 0;
+   char modch = ' ';
+   if( (mod[0] == '-') || (mod[0] == '+') )
+   {
+      axis_mod = 1;
+      modch = mod[0];
+      mod ++;
+   }
+   
+   int invert = 0;
+   if( (str[0] == '-' ) )
+   {
+      invert = 1;
+      str ++;
+   }
+
+   u32 id;
+   enum input_type type = vg_str_to_input( str, &id );
+
+   if( bind->type == k_input_type_button )
+   {
+      if( axis_mod )
+      {
+         vg_error( "Cannot use axis modifiers on button input!\n" );
+         return;
+      }
+
+      if( invert )
+      {
+         vg_error( "Cannot invert button input!\n" );
+         return;
+      }
+
+      if( type == k_input_type_keyboard_key )
+         bind->button.keyboard_id = id;
+      else if( type == k_input_type_gamepad_button )
+         bind->button.gamepad_id = id;
+      else
+      {
+         vg_error( "Unknown button or key '%s'\n", str );
+         return;
+      }
+   }
+   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 )
+            {
+               vg_error( "Cannot invert a keyboard key!\n" );
+               return;
+            }
+
+            if( modch == '+' )
+               bind->axis.keyboard_positive = id;
+            else
+               bind->axis.keyboard_negative = id;
+         }
+         else
+         {
+            vg_error( "You can only bind keyboard keys to +- axises\n" );
+            return;
+         }
+      }
+      else
+      {
+         if( type == k_input_type_gamepad_axis )
+         {
+            bind->axis.gamepad_inverted = invert;
+            bind->axis.gamepad_axis = id;
+         }
+         else
+         {
+            vg_error( "You can only bind gamepad axises to this\n" );
+            return;
+         }
+      }
+   }
+}
+
 /* 
  * bind x jump 
  * bind a -horizontal
  * bind d +horizontal
+ * bind -gp-ls-h horizontal
  */
 
 VG_STATIC int vg_rebind_input_cmd( int argc, const char *argv[] )
@@ -259,18 +378,12 @@ VG_STATIC int vg_rebind_input_cmd( int argc, const char *argv[] )
       return 0;
    }
 
-   if( strlen(argv[0]) == 0 )
-      return 0;
-
-   int axis_mod = 0;
-   if( (argv[0][0] == '-') || (argv[0][0] == '+') )
-      axis_mod = 1;
-
-   struct input_binding *bind = vg_get_named_input( argv[0]+axis_mod );
+   const char *str_bind_name = argv[0];
+   struct input_binding *bind = vg_get_named_input( str_bind_name );
 
    if( !bind )
    {
-      vg_error( "There is no named input called %s\n", argv[0]+axis_mod );
+      vg_error( "There is no bind with that name '%s'\n", str_bind_name );
       return 0;
    }
 
@@ -282,56 +395,10 @@ VG_STATIC int vg_rebind_input_cmd( int argc, const char *argv[] )
 
    if( argc == 2 )
    {
-      u32 id;
-      enum input_type type = vg_str_to_input( argv[1], &id );
-
-      if( bind->type == k_input_type_button )
-      {
-         if( axis_mod )
-         {
-            vg_error( "Cannot use axis modifiers on button input!\n" );
-            return 0;
-         }
+      const char *str_input_id  = argv[1];
 
-         if( type == k_input_type_keyboard_key )
-            bind->button.keyboard_id = id;
-         else if( type == k_input_type_gamepad_button )
-            bind->button.gamepad_id = id;
-         else
-         {
-            vg_error( "Unknown button or key '%s'\n", argv[1] );
-            return 0;
-         }
-      }
-      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( argv[0][0] == '+' )
-                  bind->axis.keyboard_positive = id;
-               else
-                  bind->axis.keyboard_negative = id;
-            }
-            else
-            {
-               vg_error( "You can only bind keyboard keys to +- axises\n" );
-               return 0;
-            }
-         }
-         else
-         {
-            if( type == k_input_type_gamepad_axis )
-               bind->axis.gamepad_axis = id;
-            else
-            {
-               vg_error( "You can only bind gamepad axises to this\n" );
-               return 0;
-            }
-         }
-      }
+      vg_apply_bind_str( bind, str_bind_name, str_input_id );
+      return 0;
    }
 
    return 0;
@@ -339,6 +406,22 @@ VG_STATIC int vg_rebind_input_cmd( int argc, const char *argv[] )
 
 VG_STATIC void vg_input_update( u32 num, struct input_binding *binds )
 {
+   if( vg_console.enabled )
+   {
+      for( i32 i=0; i<num; i++ )
+      {
+         struct input_binding *bind = &binds[i];
+
+         if( bind->type == k_input_type_button )
+         {
+            bind->button.prev = bind->button.value;
+            bind->button.value = 0;
+         }
+      }
+
+      return;
+   }
+
    for( i32 i=0; i<num; i++ )
    {
       struct input_binding *bind = &binds[i];
@@ -369,7 +452,11 @@ VG_STATIC void vg_input_update( u32 num, struct input_binding *binds )
                keyboard_value -= 1.0f;
 
          if( bind->axis.gamepad_axis != -1 )
+         {
             gamepad_value = vg.gamepad.axes[ bind->axis.gamepad_axis ];
+            if( bind->axis.gamepad_inverted )
+               gamepad_value *= -1.0f;
+         }
 
          if( fabsf(gamepad_value) <= 0.01f )
             gamepad_value = 0.0f;
@@ -394,19 +481,20 @@ VG_STATIC void vg_input_update( u32 num, struct input_binding *binds )
    }
 }
 
+VG_STATIC int vg_console_enabled(void);
 VG_STATIC int vg_input_button_down( struct input_binding *bind )
 {
    if( bind->button.value && !bind->button.prev )
       return 1;
    return 0;
 }
+#if 0
 
 VG_STATIC float vg_get_axis( const char *axis )
 {
    return 0.0f;
 }
 
-VG_STATIC int vg_console_enabled(void);
 
 VG_STATIC void vg_get_button_states( const char *name, int *cur, int *prev )
 {
@@ -434,6 +522,7 @@ VG_STATIC enum vg_button_state vg_get_button_state( const char *button )
        if(vg_get_button( button )) return k_button_state_pressed;
        return k_button_state_none;
 }
+#endif
 
 void vg_update_inputs(void)
 {
@@ -470,6 +559,10 @@ VG_STATIC void vg_gamepad_init(void)
          vg.gamepad_name = glfwGetGamepadName( id );
          vg_success( "Gamepad mapping registered: %s\n", vg.gamepad_name );
          
+         /* This path usually only gets chosen when starting outside of steam */
+         if( !strcmp(vg.gamepad_name, "Steam Controller") )
+            vg.gamepad_use_trackpad_look = 1;
+         
          vg.gamepad_ready = 1;
          vg.gamepad_id = id;
          break;