diff options
-rw-r--r-- | .gitignore | 3 | ||||
-rw-r--r-- | Ryujinx.Input/HLE/NpadController.cs | 23 |
2 files changed, 17 insertions, 9 deletions
@@ -74,6 +74,9 @@ _TeamCity* # DotCover is a Code Coverage Tool *.dotCover +# Rider is a Visual Studio alternative +.idea/* + # NCrunch *.ncrunch* .*crunch*.local.xml diff --git a/Ryujinx.Input/HLE/NpadController.cs b/Ryujinx.Input/HLE/NpadController.cs index 2af114d2..eb9989b0 100644 --- a/Ryujinx.Input/HLE/NpadController.cs +++ b/Ryujinx.Input/HLE/NpadController.cs @@ -391,24 +391,29 @@ namespace Ryujinx.Input.HLE [MethodImpl(MethodImplOptions.AggressiveInlining)] private static JoystickPosition ApplyDeadzone(float x, float y, float deadzone) { - return new JoystickPosition + float magnitudeClamped = Math.Min(MathF.Sqrt(x * x + y * y), 1f); + + if (magnitudeClamped <= deadzone) + { + return new JoystickPosition() {Dx = 0, Dy = 0}; + } + + return new JoystickPosition() { - Dx = ClampAxis(MathF.Abs(x) > deadzone ? x : 0.0f), - Dy = ClampAxis(MathF.Abs(y) > deadzone ? y : 0.0f) + Dx = ClampAxis((x / magnitudeClamped) * ((magnitudeClamped - deadzone) / (1 - deadzone))), + Dy = ClampAxis((y / magnitudeClamped) * ((magnitudeClamped - deadzone) / (1 - deadzone))) }; } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static short ClampAxis(float value) { - if (value <= -short.MaxValue) + if (Math.Sign(value) < 0) { - return -short.MaxValue; - } - else - { - return (short)(value * short.MaxValue); + return (short)Math.Max(value * -short.MinValue, short.MinValue); } + + return (short)Math.Min(value * short.MaxValue, short.MaxValue); } [MethodImpl(MethodImplOptions.AggressiveInlining)] |