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
1 changed files with 33 additions and 43 deletions

View File

@ -5,6 +5,7 @@
#include "input_manager.h"
#include "common/assert.h"
#include "common/bitutils.h"
#include "common/error.h"
#include "common/log.h"
#include "common/string_util.h"
@ -16,32 +17,33 @@
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
"LeftY", // AXIS_LEFTY
"RightX", // AXIS_RIGHTX
"RightY", // AXIS_RIGHTY
"LeftTrigger", // AXIS_TRIGGERLEFT
"RightTrigger", // AXIS_TRIGGERRIGHT
};
static constexpr const char* s_axis_icons[][2] = {
{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_RIGHT_ANALOG_LEFT, ICON_PF_RIGHT_ANALOG_RIGHT}, // AXIS_RIGHTX
{ICON_PF_RIGHT_ANALOG_UP, ICON_PF_RIGHT_ANALOG_DOWN}, // AXIS_RIGHTY
{nullptr, ICON_PF_LEFT_TRIGGER_LT}, // AXIS_TRIGGERLEFT
{nullptr, ICON_PF_RIGHT_TRIGGER_RT}, // AXIS_TRIGGERRIGHT
};
static const GenericInputBinding s_xinput_generic_binding_axis_mapping[][2] = {
{GenericInputBinding::LeftStickLeft, GenericInputBinding::LeftStickRight}, // AXIS_LEFTX
{GenericInputBinding::LeftStickUp, GenericInputBinding::LeftStickDown}, // AXIS_LEFTY
{GenericInputBinding::RightStickLeft, GenericInputBinding::RightStickRight}, // AXIS_RIGHTX
{GenericInputBinding::RightStickUp, GenericInputBinding::RightStickDown}, // AXIS_RIGHTY
{GenericInputBinding::Unknown, GenericInputBinding::L2}, // AXIS_TRIGGERLEFT
{GenericInputBinding::Unknown, GenericInputBinding::R2}, // AXIS_TRIGGERRIGHT
};
}};
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_UP, ICON_PF_LEFT_ANALOG_DOWN}}, // AXIS_LEFTY
{{ICON_PF_RIGHT_ANALOG_LEFT, ICON_PF_RIGHT_ANALOG_RIGHT}}, // AXIS_RIGHTX
{{ICON_PF_RIGHT_ANALOG_UP, ICON_PF_RIGHT_ANALOG_DOWN}}, // AXIS_RIGHTY
{{nullptr, ICON_PF_LEFT_TRIGGER_LT}}, // AXIS_TRIGGERLEFT
{{nullptr, ICON_PF_RIGHT_TRIGGER_RT}}, // AXIS_TRIGGERRIGHT
}};
static constexpr std::array<std::array<GenericInputBinding, 2>, XInputSource::NUM_AXES>
s_xinput_generic_binding_axis_mapping = {{
{{GenericInputBinding::LeftStickLeft, GenericInputBinding::LeftStickRight}}, // AXIS_LEFTX
{{GenericInputBinding::LeftStickUp, GenericInputBinding::LeftStickDown}}, // AXIS_LEFTY
{{GenericInputBinding::RightStickLeft, GenericInputBinding::RightStickRight}}, // AXIS_RIGHTX
{{GenericInputBinding::RightStickUp, GenericInputBinding::RightStickDown}}, // AXIS_RIGHTY
{{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
"DPadDown", // XINPUT_GAMEPAD_DPAD_DOWN
"DPadLeft", // XINPUT_GAMEPAD_DPAD_LEFT
@ -57,25 +59,15 @@ static const char* s_button_names[XInputSource::NUM_BUTTONS] = {
"X", // XINPUT_GAMEPAD_X
"Y", // XINPUT_GAMEPAD_Y
"Guide", // XINPUT_GAMEPAD_GUIDE
};
static const u16 s_button_masks[XInputSource::NUM_BUTTONS] = {
XINPUT_GAMEPAD_DPAD_UP,
XINPUT_GAMEPAD_DPAD_DOWN,
XINPUT_GAMEPAD_DPAD_LEFT,
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,
}};
static constexpr std::array<u16, XInputSource::NUM_BUTTONS> s_button_masks = {{
XINPUT_GAMEPAD_DPAD_UP, XINPUT_GAMEPAD_DPAD_DOWN, XINPUT_GAMEPAD_DPAD_LEFT, 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,
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_DOWN, // XINPUT_GAMEPAD_DPAD_DOWN
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_Y, // XINPUT_GAMEPAD_Y
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::DPadDown, // XINPUT_GAMEPAD_DPAD_DOWN
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::Triangle, // XINPUT_GAMEPAD_Y
GenericInputBinding::System, // XINPUT_GAMEPAD_GUIDE
};
}};
XInputSource::XInputSource() = default;
@ -483,7 +475,7 @@ void XInputSource::CheckForStateChanges(u32 index, const XINPUT_STATE& new_state
{ \
InputManager::InvokeEvents(MakeGenericControllerAxisKey(InputSourceType::XInput, index, axis), \
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.
@ -505,9 +497,7 @@ void XInputSource::CheckForStateChanges(u32 index, const XINPUT_STATE& new_state
const u16 button_mask = s_button_masks[button];
if ((old_button_bits & button_mask) != (new_button_bits & button_mask))
{
const GenericInputBinding generic_key = (button < std::size(s_xinput_generic_binding_button_mapping)) ?
s_xinput_generic_binding_button_mapping[button] :
GenericInputBinding::Unknown;
const GenericInputBinding generic_key = s_xinput_generic_binding_button_mapping[button];
const float value = ((new_button_bits & button_mask) != 0) ? 1.0f : 0.0f;
InputManager::InvokeEvents(MakeGenericControllerButtonKey(InputSourceType::XInput, index, button), value,
generic_key);