mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
DInput/XInput: Further fixes & improvements
* Remove redundant second analog settings for XInput * Replace DInput circle->square mapping with improved XInput version
This commit is contained in:
parent
6856709b1d
commit
4c6410cd0d
5 changed files with 32 additions and 57 deletions
|
@ -564,22 +564,14 @@ static ConfigSetting controlSettings[] = {
|
|||
ConfigSetting("AnalogStickScale", &g_Config.fAnalogStickScale, defaultControlScale, true, true),
|
||||
#ifdef _WIN32
|
||||
ConfigSetting("DInputAnalogDeadzone", &g_Config.fDInputAnalogDeadzone, 0.1f, true, true),
|
||||
ConfigSetting("DInputAnalogInverseMode", &g_Config.iDInputAnalogInverseMode, 0, true, true),
|
||||
ConfigSetting("DInputAnalogInverseDeadzone", &g_Config.fDInputAnalogInverseDeadzone, 0.0f, true, true),
|
||||
ConfigSetting("DInputAnalogSensitivity", &g_Config.fDInputAnalogSensitivity, 1.0f, true, true),
|
||||
|
||||
ConfigSetting("DInputAnalogInverseMode", &g_Config.iDInputAnalogInverseMode, 0, true, true),
|
||||
ConfigSetting("DInputAnalogInverseDeadzone", &g_Config.fDInputAnalogInverseDeadzone, 0.0f, true, true),
|
||||
|
||||
ConfigSetting("XInputLeftAnalogDeadzone", &g_Config.fXInputLeftAnalogDeadzone, 0.24f, true, true),
|
||||
ConfigSetting("XInputRightAnalogDeadzone", &g_Config.fXInputRightAnalogDeadzone, 0.27f, true, true),
|
||||
|
||||
ConfigSetting("XInputLeftAnalogInverseMode", &g_Config.iXInputLeftAnalogInverseMode, 0, true, true),
|
||||
ConfigSetting("XInputLeftAnalogInverseDeadzone", &g_Config.fXInputLeftAnalogInverseDeadzone, 0.0f, true, true),
|
||||
ConfigSetting("XInputLeftAnalogSensitivity", &g_Config.fXInputLeftAnalogSensitivity, 1.0f, true, true),
|
||||
|
||||
ConfigSetting("XInputRightAnalogInverseMode", &g_Config.iXInputRightAnalogInverseMode, 0, true, true),
|
||||
ConfigSetting("XInputRightAnalogInverseDeadzone", &g_Config.fXInputRightAnalogInverseDeadzone, 0.0f, true, true),
|
||||
ConfigSetting("XInputRightAnalogSensitivity", &g_Config.fXInputRightAnalogSensitivity, 1.0f, true, true),
|
||||
ConfigSetting("XInputAnalogDeadzone", &g_Config.fXInputAnalogDeadzone, 0.24f, true, true),
|
||||
ConfigSetting("XInputAnalogInverseMode", &g_Config.iXInputAnalogInverseMode, 0, true, true),
|
||||
ConfigSetting("XInputAnalogInverseDeadzone", &g_Config.fXInputAnalogInverseDeadzone, 0.0f, true, true),
|
||||
ConfigSetting("XInputAnalogSensitivity", &g_Config.fXInputAnalogSensitivity, 1.0f, true, true),
|
||||
#endif
|
||||
ConfigSetting("AnalogLimiterDeadzone", &g_Config.fAnalogLimiterDeadzone, 0.6f, true, true),
|
||||
|
||||
|
|
|
@ -281,16 +281,10 @@ public:
|
|||
float fDInputAnalogInverseDeadzone;
|
||||
float fDInputAnalogSensitivity;
|
||||
|
||||
float fXInputLeftAnalogDeadzone;
|
||||
float fXInputRightAnalogDeadzone;
|
||||
|
||||
int iXInputLeftAnalogInverseMode;
|
||||
float fXInputLeftAnalogInverseDeadzone;
|
||||
float fXInputLeftAnalogSensitivity;
|
||||
|
||||
int iXInputRightAnalogInverseMode;
|
||||
float fXInputRightAnalogInverseDeadzone;
|
||||
float fXInputRightAnalogSensitivity;
|
||||
float fXInputAnalogDeadzone;
|
||||
int iXInputAnalogInverseMode;
|
||||
float fXInputAnalogInverseDeadzone;
|
||||
float fXInputAnalogSensitivity;
|
||||
|
||||
float fAnalogLimiterDeadzone;
|
||||
// GLES backend-specific hacks. Not saved to the ini file, do not add checkboxes. Will be made into
|
||||
|
|
|
@ -381,16 +381,10 @@ void GameSettingsScreen::CreateViews() {
|
|||
controlsSettings->Add(new PopupSliderChoiceFloat(&g_Config.fDInputAnalogSensitivity, 0.0f, 10.0f, c->T("Sensitivity"), screenManager()));
|
||||
|
||||
controlsSettings->Add(new ItemHeader(c->T("XInput Analog Settings", "XInput Analog Settings")));
|
||||
controlsSettings->Add(new PopupSliderChoiceFloat(&g_Config.fXInputLeftAnalogDeadzone, 0.0f, 1.0f, c->T("Dead Zone (Left Stick)"), screenManager()));
|
||||
controlsSettings->Add(new PopupSliderChoiceFloat(&g_Config.fXInputRightAnalogDeadzone, 0.0f, 1.0f, c->T("Dead Zone (Right Stick)"), screenManager()));
|
||||
|
||||
controlsSettings->Add(new PopupMultiChoice(&g_Config.iXInputLeftAnalogInverseMode, c->T("Inverse Dead Zone Mode (Left Stick)"), inverseDeadzoneModes, 0, ARRAY_SIZE(inverseDeadzoneModes), c, screenManager()));
|
||||
controlsSettings->Add(new PopupSliderChoiceFloat(&g_Config.fXInputLeftAnalogInverseDeadzone, 0.0f, 1.0f, c->T("Inverse Dead Zone Size (Left Stick)"), screenManager()));
|
||||
controlsSettings->Add(new PopupSliderChoiceFloat(&g_Config.fXInputLeftAnalogSensitivity, 0.0f, 10.0f, c->T("Sensitivity (Left Stick)"), screenManager()));
|
||||
|
||||
controlsSettings->Add(new PopupMultiChoice(&g_Config.iXInputRightAnalogInverseMode, c->T("Inverse Dead Zone Mode (Right Stick)"), inverseDeadzoneModes, 0, ARRAY_SIZE(inverseDeadzoneModes), c, screenManager()));
|
||||
controlsSettings->Add(new PopupSliderChoiceFloat(&g_Config.fXInputRightAnalogInverseDeadzone, 0.0f, 1.0f, c->T("Inverse Dead Zone Size (Right Stick)"), screenManager()));
|
||||
controlsSettings->Add(new PopupSliderChoiceFloat(&g_Config.fXInputRightAnalogSensitivity, 0.0f, 10.0f, c->T("Sensitivity (Right Stick)"), screenManager()));
|
||||
controlsSettings->Add(new PopupSliderChoiceFloat(&g_Config.fXInputAnalogDeadzone, 0.0f, 1.0f, c->T("Dead Zone"), screenManager()));
|
||||
controlsSettings->Add(new PopupMultiChoice(&g_Config.iXInputAnalogInverseMode, c->T("Inverse Dead Zone Mode"), inverseDeadzoneModes, 0, ARRAY_SIZE(inverseDeadzoneModes), c, screenManager()));
|
||||
controlsSettings->Add(new PopupSliderChoiceFloat(&g_Config.fXInputAnalogInverseDeadzone, 0.0f, 1.0f, c->T("Inverse Dead Zone Size"), screenManager()));
|
||||
controlsSettings->Add(new PopupSliderChoiceFloat(&g_Config.fXInputAnalogSensitivity, 0.0f, 10.0f, c->T("Sensitivity"), screenManager()));
|
||||
|
||||
controlsSettings->Add(new ItemHeader(c->T("Keyboard", "Keyboard Control Settings")));
|
||||
#if defined(USING_WIN_UI)
|
||||
|
|
|
@ -208,8 +208,7 @@ void SendNativeAxis(int deviceId, short value, short &lastValue, int axisId) {
|
|||
AxisInput axis;
|
||||
axis.deviceId = deviceId;
|
||||
axis.axisId = axisId;
|
||||
//axis.value = NormalizedDeadzoneFilter(value);
|
||||
axis.value = (float)value / 10000.0f;
|
||||
axis.value = (float)value / 10000.0f; // Convert axis to normalised float
|
||||
NativeAxis(axis);
|
||||
|
||||
lastValue = value;
|
||||
|
@ -241,6 +240,13 @@ int DinputDevice::UpdateState(InputState &input_state) {
|
|||
if (analog) {
|
||||
AxisInput axis;
|
||||
axis.deviceId = DEVICE_ID_PAD_0 + pDevNum;
|
||||
|
||||
// Circle to Square mapping, cribbed from XInputDevice
|
||||
float sx = js.lX;
|
||||
float sy = js.lY;
|
||||
float scaleFactor = sqrtf((sx * sx + sy * sy) / std::max(sx * sx, sy * sy));
|
||||
js.lX = (short)(sx * scaleFactor);
|
||||
js.lY = (short)(sy * scaleFactor);
|
||||
|
||||
// Linear range mapping (used to invert deadzones)
|
||||
float dz = g_Config.fDInputAnalogDeadzone;
|
||||
|
@ -280,6 +286,9 @@ int DinputDevice::UpdateState(InputState &input_state) {
|
|||
js.lY = 0;
|
||||
}
|
||||
|
||||
js.lX = (short)std::min(10000.0f, std::max((float)js.lX, -10000.0f));
|
||||
js.lY = (short)std::min(10000.0f, std::max((float)js.lY, -10000.0f));
|
||||
|
||||
SendNativeAxis(DEVICE_ID_PAD_0 + pDevNum, js.lX, last_lX_, JOYSTICK_AXIS_X);
|
||||
SendNativeAxis(DEVICE_ID_PAD_0 + pDevNum, js.lY, last_lY_, JOYSTICK_AXIS_Y);
|
||||
SendNativeAxis(DEVICE_ID_PAD_0 + pDevNum, js.lZ, last_lZ_, JOYSTICK_AXIS_Z);
|
||||
|
@ -300,15 +309,6 @@ int DinputDevice::UpdateState(InputState &input_state) {
|
|||
return -1;
|
||||
}
|
||||
|
||||
static float NormalizedDeadzoneFilter(short value) {
|
||||
float result = (float)value / 10000.0f;
|
||||
|
||||
// Expand and clamp. Hack to let us reach the corners on most pads.
|
||||
result = std::min(1.0f, std::max(result * 1.2f, -1.0f));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void DinputDevice::ApplyButtons(DIJOYSTATE2 &state, InputState &input_state) {
|
||||
BYTE *buttons = state.rgbButtons;
|
||||
u32 downMask = 0x80;
|
||||
|
|
|
@ -235,13 +235,13 @@ int XinputDevice::UpdateState(InputState &input_state) {
|
|||
}
|
||||
ApplyButtons(state, input_state);
|
||||
|
||||
const float LEFT_STICK_DEADZONE = g_Config.fXInputLeftAnalogDeadzone;
|
||||
const int LEFT_STICK_INV_MODE = g_Config.iXInputLeftAnalogInverseMode;
|
||||
const float LEFT_STICK_INV_DEADZONE = g_Config.fXInputLeftAnalogInverseDeadzone;
|
||||
const float LEFT_STICK_SENSITIVITY = g_Config.fXInputLeftAnalogSensitivity;
|
||||
const float STICK_DEADZONE = g_Config.fXInputAnalogDeadzone;
|
||||
const int STICK_INV_MODE = g_Config.iXInputAnalogInverseMode;
|
||||
const float STICK_INV_DEADZONE = g_Config.fXInputAnalogInverseDeadzone;
|
||||
const float STICK_SENSITIVITY = g_Config.fXInputAnalogSensitivity;
|
||||
|
||||
if (NormalizedDeadzoneDiffers(prevState.Gamepad.sThumbLX, prevState.Gamepad.sThumbLY, state.Gamepad.sThumbLX, state.Gamepad.sThumbLY, LEFT_STICK_DEADZONE)) {
|
||||
Stick left = NormalizedDeadzoneFilter(state.Gamepad.sThumbLX, state.Gamepad.sThumbLY, LEFT_STICK_DEADZONE, LEFT_STICK_INV_MODE, LEFT_STICK_INV_DEADZONE, LEFT_STICK_SENSITIVITY);
|
||||
if (NormalizedDeadzoneDiffers(prevState.Gamepad.sThumbLX, prevState.Gamepad.sThumbLY, state.Gamepad.sThumbLX, state.Gamepad.sThumbLY, STICK_DEADZONE)) {
|
||||
Stick left = NormalizedDeadzoneFilter(state.Gamepad.sThumbLX, state.Gamepad.sThumbLY, STICK_DEADZONE, STICK_INV_MODE, STICK_INV_DEADZONE, STICK_SENSITIVITY);
|
||||
|
||||
AxisInput axis;
|
||||
axis.deviceId = DEVICE_ID_X360_0;
|
||||
|
@ -257,13 +257,8 @@ int XinputDevice::UpdateState(InputState &input_state) {
|
|||
}
|
||||
}
|
||||
|
||||
const float RIGHT_STICK_DEADZONE = g_Config.fXInputRightAnalogDeadzone;
|
||||
const int RIGHT_STICK_INV_MODE = g_Config.iXInputRightAnalogInverseMode;
|
||||
const float RIGHT_STICK_INV_DEADZONE = g_Config.fXInputRightAnalogInverseDeadzone;
|
||||
const float RIGHT_STICK_SENSITIVITY = g_Config.fXInputRightAnalogSensitivity;
|
||||
|
||||
if (NormalizedDeadzoneDiffers(prevState.Gamepad.sThumbRX, prevState.Gamepad.sThumbRY, state.Gamepad.sThumbRX, state.Gamepad.sThumbRY, RIGHT_STICK_DEADZONE)) {
|
||||
Stick right = NormalizedDeadzoneFilter(state.Gamepad.sThumbRX, state.Gamepad.sThumbRY, RIGHT_STICK_DEADZONE, RIGHT_STICK_INV_MODE, RIGHT_STICK_INV_DEADZONE, RIGHT_STICK_SENSITIVITY);
|
||||
if (NormalizedDeadzoneDiffers(prevState.Gamepad.sThumbRX, prevState.Gamepad.sThumbRY, state.Gamepad.sThumbRX, state.Gamepad.sThumbRY, STICK_DEADZONE)) {
|
||||
Stick right = NormalizedDeadzoneFilter(state.Gamepad.sThumbRX, state.Gamepad.sThumbRY, STICK_DEADZONE, STICK_INV_MODE, STICK_INV_DEADZONE, STICK_SENSITIVITY);
|
||||
|
||||
AxisInput axis;
|
||||
axis.deviceId = DEVICE_ID_X360_0;
|
||||
|
|
Loading…
Add table
Reference in a new issue