diff options
-rw-r--r-- | src/i_joystick.c | 79 | ||||
-rw-r--r-- | src/i_joystick.h | 5 | ||||
-rw-r--r-- | src/m_config.c | 60 | ||||
-rw-r--r-- | src/m_controls.h | 2 | ||||
-rw-r--r-- | src/setup/joystick.c | 15 |
5 files changed, 144 insertions, 17 deletions
diff --git a/src/i_joystick.c b/src/i_joystick.c index de10fa08..da93ce41 100644 --- a/src/i_joystick.c +++ b/src/i_joystick.c @@ -37,6 +37,7 @@ #include "i_system.h" #include "m_config.h" +#include "m_misc.h" // When an axis is within the dead zone, it is set to zero. // This is 5% of the full range: @@ -72,6 +73,12 @@ static int joystick_y_invert = 0; static int joystick_strafe_axis = -1; static int joystick_strafe_invert = 0; +// Virtual to physical button joystick button mapping. By default this +// is a straight mapping. +static int joystick_physical_buttons[NUM_VIRTUAL_BUTTONS] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 +}; + void I_ShutdownJoystick(void) { if (joystick != NULL) @@ -159,49 +166,78 @@ void I_InitJoystick(void) I_AtExit(I_ShutdownJoystick, true); } -static int ButtonAxisMask(void) +static boolean IsAxisButton(int physbutton) { - int result = 0; - if (IS_BUTTON_AXIS(joystick_x_axis)) { - result |= 1 << BUTTON_AXIS_NEG(joystick_x_axis); - result |= 1 << BUTTON_AXIS_POS(joystick_x_axis); + if (physbutton == BUTTON_AXIS_NEG(joystick_x_axis) + || physbutton == BUTTON_AXIS_POS(joystick_x_axis)) + { + return true; + } } if (IS_BUTTON_AXIS(joystick_y_axis)) { - result |= 1 << BUTTON_AXIS_NEG(joystick_y_axis); - result |= 1 << BUTTON_AXIS_POS(joystick_y_axis); + if (physbutton == BUTTON_AXIS_NEG(joystick_y_axis) + || physbutton == BUTTON_AXIS_POS(joystick_y_axis)) + { + return true; + } } if (IS_BUTTON_AXIS(joystick_strafe_axis)) { - result |= 1 << BUTTON_AXIS_NEG(joystick_strafe_axis); - result |= 1 << BUTTON_AXIS_POS(joystick_strafe_axis); + if (physbutton == BUTTON_AXIS_NEG(joystick_strafe_axis) + || physbutton == BUTTON_AXIS_POS(joystick_strafe_axis)) + { + return true; + } } - return result; + return false; +} + +// Get the state of the given virtual button. + +static int ReadButtonState(int vbutton) +{ + int physbutton; + + // Map from virtual button to physical (SDL) button. + if (vbutton < NUM_VIRTUAL_BUTTONS) + { + physbutton = joystick_physical_buttons[vbutton]; + } + else + { + physbutton = vbutton; + } + + // Never read axis buttons as buttons. + if (IsAxisButton(physbutton)) + { + return 0; + } + + return SDL_JoystickGetButton(joystick, physbutton); } // Get a bitmask of all currently-pressed buttons -static int GetButtonState(void) +static int GetButtonsState(void) { int i; int result; result = 0; - for (i=0; i<SDL_JoystickNumButtons(joystick); ++i) + for (i = 0; i < 20; ++i) { - if (SDL_JoystickGetButton(joystick, i)) + if (ReadButtonState(i)) { result |= 1 << i; } } - // Mask out any buttons that are actually used in axes. - result &= ~ButtonAxisMask(); - return result; } @@ -287,7 +323,7 @@ void I_UpdateJoystick(void) event_t ev; ev.type = ev_joystick; - ev.data1 = GetButtonState(); + ev.data1 = GetButtonsState(); ev.data2 = GetAxisState(joystick_x_axis, joystick_x_invert); ev.data3 = GetAxisState(joystick_y_axis, joystick_y_invert); ev.data4 = GetAxisState(joystick_strafe_axis, joystick_strafe_invert); @@ -298,6 +334,8 @@ void I_UpdateJoystick(void) void I_BindJoystickVariables(void) { + int i; + M_BindVariable("use_joystick", &usejoystick); M_BindVariable("joystick_index", &joystick_index); M_BindVariable("joystick_x_axis", &joystick_x_axis); @@ -306,5 +344,12 @@ void I_BindJoystickVariables(void) M_BindVariable("joystick_x_invert", &joystick_x_invert); M_BindVariable("joystick_y_invert", &joystick_y_invert); M_BindVariable("joystick_strafe_invert",&joystick_strafe_invert); + + for (i = 0; i < NUM_VIRTUAL_BUTTONS; ++i) + { + char name[32]; + M_snprintf(name, sizeof(name), "joystick_physical_button%i", i); + M_BindVariable(name, &joystick_physical_buttons[i]); + } } diff --git a/src/i_joystick.h b/src/i_joystick.h index 7c28eb6c..c9e5b380 100644 --- a/src/i_joystick.h +++ b/src/i_joystick.h @@ -27,6 +27,11 @@ #ifndef __I_JOYSTICK__ #define __I_JOYSTICK__ +// Number of "virtual" joystick buttons defined in configuration files. +// This needs to be at least as large as the number of different key +// bindings supported by the higher-level game code (joyb* variables). +#define NUM_VIRTUAL_BUTTONS 10 + // If this bit is set in a configuration file axis value, the axis is // not actually a joystick axis, but instead is a "button axis". This // means that instead of reading an SDL joystick axis, we read the diff --git a/src/m_config.c b/src/m_config.c index 898c9368..90d3776f 100644 --- a/src/m_config.c +++ b/src/m_config.c @@ -939,6 +939,66 @@ static default_t extra_defaults_list[] = CONFIG_VARIABLE_INT(joystick_strafe_invert), //! + // The physical joystick button that corresponds to button #0. + // + + CONFIG_VARIABLE_INT(joystick_physical_button0), + + //! + // The physical joystick button that corresponds to button #1. + // + + CONFIG_VARIABLE_INT(joystick_physical_button1), + + //! + // The physical joystick button that corresponds to button #2. + // + + CONFIG_VARIABLE_INT(joystick_physical_button2), + + //! + // The physical joystick button that corresponds to button #3. + // + + CONFIG_VARIABLE_INT(joystick_physical_button3), + + //! + // The physical joystick button that corresponds to button #4. + // + + CONFIG_VARIABLE_INT(joystick_physical_button4), + + //! + // The physical joystick button that corresponds to button #5. + // + + CONFIG_VARIABLE_INT(joystick_physical_button5), + + //! + // The physical joystick button that corresponds to button #6. + // + + CONFIG_VARIABLE_INT(joystick_physical_button6), + + //! + // The physical joystick button that corresponds to button #7. + // + + CONFIG_VARIABLE_INT(joystick_physical_button7), + + //! + // The physical joystick button that corresponds to button #8. + // + + CONFIG_VARIABLE_INT(joystick_physical_button8), + + //! + // The physical joystick button that corresponds to button #9. + // + + CONFIG_VARIABLE_INT(joystick_physical_button9), + + //! // Joystick button to strafe left. // diff --git a/src/m_controls.h b/src/m_controls.h index 5b2f34d6..6ae15880 100644 --- a/src/m_controls.h +++ b/src/m_controls.h @@ -157,6 +157,8 @@ extern int joybstraferight; extern int joybprevweapon; extern int joybnextweapon; +extern int joy_physical_buttons[10]; + extern int joybmenu; extern int dclick_use; diff --git a/src/setup/joystick.c b/src/setup/joystick.c index ab442fe2..cc5c4a8e 100644 --- a/src/setup/joystick.c +++ b/src/setup/joystick.c @@ -26,6 +26,7 @@ #include "i_joystick.h" #include "m_config.h" #include "m_controls.h" +#include "m_misc.h" #include "textscreen.h" #include "execute.h" @@ -88,6 +89,11 @@ static int joystick_y_invert = 0; static int joystick_strafe_axis = -1; static int joystick_strafe_invert = 0; +// Virtual to physical mapping. +static int joystick_physical_buttons[NUM_VIRTUAL_BUTTONS] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 +}; + static txt_button_t *joystick_button; static int *all_joystick_buttons[] = { @@ -682,6 +688,8 @@ void ConfigJoystick(void) void BindJoystickVariables(void) { + int i; + M_BindVariable("use_joystick", &usejoystick); M_BindVariable("joystick_index", &joystick_index); M_BindVariable("joystick_x_axis", &joystick_x_axis); @@ -690,5 +698,12 @@ void BindJoystickVariables(void) M_BindVariable("joystick_x_invert", &joystick_x_invert); M_BindVariable("joystick_y_invert", &joystick_y_invert); M_BindVariable("joystick_strafe_invert",&joystick_strafe_invert); + + for (i = 0; i < NUM_VIRTUAL_BUTTONS; ++i) + { + char name[32]; + M_snprintf(name, sizeof(name), "joystick_physical_button%i", i); + M_BindVariable(name, &joystick_physical_buttons[i]); + } } |