X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=src%2Fvg%2Fvg_input.h;h=5b16287fbce20ca63238037d95a1b5712dad067b;hb=3dd767bb10e6fee9cbffeb185d1a9685810c17b5;hp=19e1f36ce796725fe15a718f6e167df24e9b4732;hpb=a00e095e762b56ffcfe9d5fc5ef7e4c597df765d;p=vg.git diff --git a/src/vg/vg_input.h b/src/vg/vg_input.h index 19e1f36..5b16287 100644 --- a/src/vg/vg_input.h +++ b/src/vg/vg_input.h @@ -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; iname ); - 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; itype == k_input_type_button ) + { + bind->button.prev = bind->button.value; + bind->button.value = 0; + } + } + + return; + } + for( i32 i=0; iaxis.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;