From 3e53d1e895ce8763eea7b796a52b1b08b55cda14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 31 Dec 2023 16:47:26 +0100 Subject: [PATCH] Joystick input: Fix low-end radius (inverse deadzone) --- Core/ControlMapper.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Core/ControlMapper.cpp b/Core/ControlMapper.cpp index 57e5066a12..17c8e9ff9e 100644 --- a/Core/ControlMapper.cpp +++ b/Core/ControlMapper.cpp @@ -109,13 +109,23 @@ static bool IsSignedAxis(int axis) { } // This is applied on the circular radius, not directly on the axes. +// TODO: Share logic with tilt? + static float MapAxisValue(float v) { const float deadzone = g_Config.fAnalogDeadzone; const float invDeadzone = g_Config.fAnalogInverseDeadzone; const float sensitivity = g_Config.fAnalogSensitivity; const float sign = v >= 0.0f ? 1.0f : -1.0f; - return sign * Clamp(invDeadzone + (fabsf(v) - deadzone) / (1.0f - deadzone) * (sensitivity - invDeadzone), 0.0f, 1.0f); + // Apply deadzone. + v = Clamp((fabsf(v) - deadzone) / (1.0f - deadzone), 0.0f, 1.0f); + + // Apply sensitivity and inverse deadzone. + if (v != 0.0f) { + v = Clamp(invDeadzone + v * (sensitivity - invDeadzone), 0.0f, 1.0f); + } + + return sign * v; } void ConvertAnalogStick(float x, float y, float *outX, float *outY) {