XInputSource: Arrays to std::array and forward generic axis

This commit is contained in:
Stenzek 2025-01-13 14:19:00 +10:00
parent 9d3c56fe6c
commit 21aef088ed
No known key found for this signature in database

View File

@ -5,6 +5,7 @@
#include "input_manager.h" #include "input_manager.h"
#include "common/assert.h" #include "common/assert.h"
#include "common/bitutils.h"
#include "common/error.h" #include "common/error.h"
#include "common/log.h" #include "common/log.h"
#include "common/string_util.h" #include "common/string_util.h"
@ -16,32 +17,33 @@
LOG_CHANNEL(XInputSource); LOG_CHANNEL(XInputSource);
static const char* s_axis_names[XInputSource::NUM_AXES] = { static constexpr std::array<const char*, XInputSource::NUM_AXES> s_axis_names = {{
"LeftX", // AXIS_LEFTX "LeftX", // AXIS_LEFTX
"LeftY", // AXIS_LEFTY "LeftY", // AXIS_LEFTY
"RightX", // AXIS_RIGHTX "RightX", // AXIS_RIGHTX
"RightY", // AXIS_RIGHTY "RightY", // AXIS_RIGHTY
"LeftTrigger", // AXIS_TRIGGERLEFT "LeftTrigger", // AXIS_TRIGGERLEFT
"RightTrigger", // AXIS_TRIGGERRIGHT "RightTrigger", // AXIS_TRIGGERRIGHT
}; }};
static constexpr const char* s_axis_icons[][2] = { static constexpr std::array<std::array<const char*, 2>, XInputSource::NUM_AXES> s_axis_icons = {{
{ICON_PF_LEFT_ANALOG_LEFT, ICON_PF_LEFT_ANALOG_RIGHT}, // AXIS_LEFTX {{ICON_PF_LEFT_ANALOG_LEFT, ICON_PF_LEFT_ANALOG_RIGHT}}, // AXIS_LEFTX
{ICON_PF_LEFT_ANALOG_UP, ICON_PF_LEFT_ANALOG_DOWN}, // AXIS_LEFTY {{ICON_PF_LEFT_ANALOG_UP, ICON_PF_LEFT_ANALOG_DOWN}}, // AXIS_LEFTY
{ICON_PF_RIGHT_ANALOG_LEFT, ICON_PF_RIGHT_ANALOG_RIGHT}, // AXIS_RIGHTX {{ICON_PF_RIGHT_ANALOG_LEFT, ICON_PF_RIGHT_ANALOG_RIGHT}}, // AXIS_RIGHTX
{ICON_PF_RIGHT_ANALOG_UP, ICON_PF_RIGHT_ANALOG_DOWN}, // AXIS_RIGHTY {{ICON_PF_RIGHT_ANALOG_UP, ICON_PF_RIGHT_ANALOG_DOWN}}, // AXIS_RIGHTY
{nullptr, ICON_PF_LEFT_TRIGGER_LT}, // AXIS_TRIGGERLEFT {{nullptr, ICON_PF_LEFT_TRIGGER_LT}}, // AXIS_TRIGGERLEFT
{nullptr, ICON_PF_RIGHT_TRIGGER_RT}, // AXIS_TRIGGERRIGHT {{nullptr, ICON_PF_RIGHT_TRIGGER_RT}}, // AXIS_TRIGGERRIGHT
}; }};
static const GenericInputBinding s_xinput_generic_binding_axis_mapping[][2] = { static constexpr std::array<std::array<GenericInputBinding, 2>, XInputSource::NUM_AXES>
{GenericInputBinding::LeftStickLeft, GenericInputBinding::LeftStickRight}, // AXIS_LEFTX s_xinput_generic_binding_axis_mapping = {{
{GenericInputBinding::LeftStickUp, GenericInputBinding::LeftStickDown}, // AXIS_LEFTY {{GenericInputBinding::LeftStickLeft, GenericInputBinding::LeftStickRight}}, // AXIS_LEFTX
{GenericInputBinding::RightStickLeft, GenericInputBinding::RightStickRight}, // AXIS_RIGHTX {{GenericInputBinding::LeftStickUp, GenericInputBinding::LeftStickDown}}, // AXIS_LEFTY
{GenericInputBinding::RightStickUp, GenericInputBinding::RightStickDown}, // AXIS_RIGHTY {{GenericInputBinding::RightStickLeft, GenericInputBinding::RightStickRight}}, // AXIS_RIGHTX
{GenericInputBinding::Unknown, GenericInputBinding::L2}, // AXIS_TRIGGERLEFT {{GenericInputBinding::RightStickUp, GenericInputBinding::RightStickDown}}, // AXIS_RIGHTY
{GenericInputBinding::Unknown, GenericInputBinding::R2}, // AXIS_TRIGGERRIGHT {{GenericInputBinding::Unknown, GenericInputBinding::L2}}, // AXIS_TRIGGERLEFT
}; {{GenericInputBinding::Unknown, GenericInputBinding::R2}}, // AXIS_TRIGGERRIGHT
}};
static const char* s_button_names[XInputSource::NUM_BUTTONS] = { static constexpr std::array<const char*, XInputSource::NUM_BUTTONS> s_button_names = {{
"DPadUp", // XINPUT_GAMEPAD_DPAD_UP "DPadUp", // XINPUT_GAMEPAD_DPAD_UP
"DPadDown", // XINPUT_GAMEPAD_DPAD_DOWN "DPadDown", // XINPUT_GAMEPAD_DPAD_DOWN
"DPadLeft", // XINPUT_GAMEPAD_DPAD_LEFT "DPadLeft", // XINPUT_GAMEPAD_DPAD_LEFT
@ -57,25 +59,15 @@ static const char* s_button_names[XInputSource::NUM_BUTTONS] = {
"X", // XINPUT_GAMEPAD_X "X", // XINPUT_GAMEPAD_X
"Y", // XINPUT_GAMEPAD_Y "Y", // XINPUT_GAMEPAD_Y
"Guide", // XINPUT_GAMEPAD_GUIDE "Guide", // XINPUT_GAMEPAD_GUIDE
}; }};
static const u16 s_button_masks[XInputSource::NUM_BUTTONS] = { static constexpr std::array<u16, XInputSource::NUM_BUTTONS> s_button_masks = {{
XINPUT_GAMEPAD_DPAD_UP, XINPUT_GAMEPAD_DPAD_UP, XINPUT_GAMEPAD_DPAD_DOWN, XINPUT_GAMEPAD_DPAD_LEFT, XINPUT_GAMEPAD_DPAD_RIGHT,
XINPUT_GAMEPAD_DPAD_DOWN, XINPUT_GAMEPAD_START, XINPUT_GAMEPAD_BACK, XINPUT_GAMEPAD_LEFT_THUMB, XINPUT_GAMEPAD_RIGHT_THUMB,
XINPUT_GAMEPAD_DPAD_LEFT, XINPUT_GAMEPAD_LEFT_SHOULDER, XINPUT_GAMEPAD_RIGHT_SHOULDER, XINPUT_GAMEPAD_A, XINPUT_GAMEPAD_B, XINPUT_GAMEPAD_X,
XINPUT_GAMEPAD_DPAD_RIGHT,
XINPUT_GAMEPAD_START,
XINPUT_GAMEPAD_BACK,
XINPUT_GAMEPAD_LEFT_THUMB,
XINPUT_GAMEPAD_RIGHT_THUMB,
XINPUT_GAMEPAD_LEFT_SHOULDER,
XINPUT_GAMEPAD_RIGHT_SHOULDER,
XINPUT_GAMEPAD_A,
XINPUT_GAMEPAD_B,
XINPUT_GAMEPAD_X,
XINPUT_GAMEPAD_Y, XINPUT_GAMEPAD_Y,
0x400, // XINPUT_GAMEPAD_GUIDE 0x400, // XINPUT_GAMEPAD_GUIDE
}; }};
static constexpr const char* s_button_icons[] = { static constexpr std::array<const char*, XInputSource::NUM_BUTTONS> s_button_icons = {{
ICON_PF_XBOX_DPAD_UP, // XINPUT_GAMEPAD_DPAD_UP ICON_PF_XBOX_DPAD_UP, // XINPUT_GAMEPAD_DPAD_UP
ICON_PF_XBOX_DPAD_DOWN, // XINPUT_GAMEPAD_DPAD_DOWN ICON_PF_XBOX_DPAD_DOWN, // XINPUT_GAMEPAD_DPAD_DOWN
ICON_PF_XBOX_DPAD_LEFT, // XINPUT_GAMEPAD_DPAD_LEFT ICON_PF_XBOX_DPAD_LEFT, // XINPUT_GAMEPAD_DPAD_LEFT
@ -91,8 +83,8 @@ static constexpr const char* s_button_icons[] = {
ICON_PF_BUTTON_X, // XINPUT_GAMEPAD_X ICON_PF_BUTTON_X, // XINPUT_GAMEPAD_X
ICON_PF_BUTTON_Y, // XINPUT_GAMEPAD_Y ICON_PF_BUTTON_Y, // XINPUT_GAMEPAD_Y
ICON_PF_XBOX, // XINPUT_GAMEPAD_GUIDE ICON_PF_XBOX, // XINPUT_GAMEPAD_GUIDE
}; }};
static const GenericInputBinding s_xinput_generic_binding_button_mapping[] = { static constexpr std::array<GenericInputBinding, XInputSource::NUM_BUTTONS> s_xinput_generic_binding_button_mapping = {{
GenericInputBinding::DPadUp, // XINPUT_GAMEPAD_DPAD_UP GenericInputBinding::DPadUp, // XINPUT_GAMEPAD_DPAD_UP
GenericInputBinding::DPadDown, // XINPUT_GAMEPAD_DPAD_DOWN GenericInputBinding::DPadDown, // XINPUT_GAMEPAD_DPAD_DOWN
GenericInputBinding::DPadLeft, // XINPUT_GAMEPAD_DPAD_LEFT GenericInputBinding::DPadLeft, // XINPUT_GAMEPAD_DPAD_LEFT
@ -108,7 +100,7 @@ static const GenericInputBinding s_xinput_generic_binding_button_mapping[] = {
GenericInputBinding::Square, // XINPUT_GAMEPAD_X GenericInputBinding::Square, // XINPUT_GAMEPAD_X
GenericInputBinding::Triangle, // XINPUT_GAMEPAD_Y GenericInputBinding::Triangle, // XINPUT_GAMEPAD_Y
GenericInputBinding::System, // XINPUT_GAMEPAD_GUIDE GenericInputBinding::System, // XINPUT_GAMEPAD_GUIDE
}; }};
XInputSource::XInputSource() = default; XInputSource::XInputSource() = default;
@ -483,7 +475,7 @@ void XInputSource::CheckForStateChanges(u32 index, const XINPUT_STATE& new_state
{ \ { \
InputManager::InvokeEvents(MakeGenericControllerAxisKey(InputSourceType::XInput, index, axis), \ InputManager::InvokeEvents(MakeGenericControllerAxisKey(InputSourceType::XInput, index, axis), \
static_cast<float>(ngp.field) / ((ngp.field < 0) ? min_value : max_value), \ static_cast<float>(ngp.field) / ((ngp.field < 0) ? min_value : max_value), \
GenericInputBinding::Unknown); \ s_xinput_generic_binding_axis_mapping[axis][BoolToUInt8(ngp.field >= 0)]); \
} }
// Y axes is inverted in XInput when compared to SDL. // Y axes is inverted in XInput when compared to SDL.
@ -505,9 +497,7 @@ void XInputSource::CheckForStateChanges(u32 index, const XINPUT_STATE& new_state
const u16 button_mask = s_button_masks[button]; const u16 button_mask = s_button_masks[button];
if ((old_button_bits & button_mask) != (new_button_bits & button_mask)) if ((old_button_bits & button_mask) != (new_button_bits & button_mask))
{ {
const GenericInputBinding generic_key = (button < std::size(s_xinput_generic_binding_button_mapping)) ? const GenericInputBinding generic_key = s_xinput_generic_binding_button_mapping[button];
s_xinput_generic_binding_button_mapping[button] :
GenericInputBinding::Unknown;
const float value = ((new_button_bits & button_mask) != 0) ? 1.0f : 0.0f; const float value = ((new_button_bits & button_mask) != 0) ? 1.0f : 0.0f;
InputManager::InvokeEvents(MakeGenericControllerButtonKey(InputSourceType::XInput, index, button), value, InputManager::InvokeEvents(MakeGenericControllerButtonKey(InputSourceType::XInput, index, button), value,
generic_key); generic_key);