From 4c6410cd0d1d5eb10d031724c3844d49405ba990 Mon Sep 17 00:00:00 2001 From: Josh Palmer Date: Thu, 5 Feb 2015 05:48:29 +0000 Subject: [PATCH] DInput/XInput: Further fixes & improvements * Remove redundant second analog settings for XInput * Replace DInput circle->square mapping with improved XInput version --- Core/Config.cpp | 18 +++++------------- Core/Config.h | 14 ++++---------- UI/GameSettingsScreen.cpp | 14 ++++---------- Windows/DinputDevice.cpp | 22 +++++++++++----------- Windows/XinputDevice.cpp | 21 ++++++++------------- 5 files changed, 32 insertions(+), 57 deletions(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index ee1b5f5141..53c5e131c1 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -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), diff --git a/Core/Config.h b/Core/Config.h index efff6df126..bd3079dd32 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -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 diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 24fda800db..8dd9337886 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -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) diff --git a/Windows/DinputDevice.cpp b/Windows/DinputDevice.cpp index 5d5205c3fa..d98b8b97a7 100644 --- a/Windows/DinputDevice.cpp +++ b/Windows/DinputDevice.cpp @@ -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; diff --git a/Windows/XinputDevice.cpp b/Windows/XinputDevice.cpp index dd5bc6e350..a3ea140ae7 100644 --- a/Windows/XinputDevice.cpp +++ b/Windows/XinputDevice.cpp @@ -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;