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
}
keyboard_positive,
keyboard_negative;
+ int gamepad_inverted;
float value;
}
axis;
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 )
{
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];
{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},
{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 )
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) ||
}
}
+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[] )
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;
}
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;
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];
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;
}
}
+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 )
{
if(vg_get_button( button )) return k_button_state_pressed;
return k_button_state_none;
}
+#endif
void vg_update_inputs(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;