From 3381828cc6cea626c4e0dfb760b8c37aae19cd14 Mon Sep 17 00:00:00 2001
From: zoeyjodon <[EMAIL REDACTED]>
Date: Wed, 22 Nov 2023 13:34:01 -0500
Subject: [PATCH] Fix 3DS Analog Values (#8581)
(cherry picked from commit 059e550e981e7b2a654b54f548c64a73f5a5fe13)
---
src/joystick/n3ds/SDL_sysjoystick.c | 24 +++++++++++++++++-------
1 file changed, 17 insertions(+), 7 deletions(-)
diff --git a/src/joystick/n3ds/SDL_sysjoystick.c b/src/joystick/n3ds/SDL_sysjoystick.c
index 49b9937ae135..9c582a728a9c 100644
--- a/src/joystick/n3ds/SDL_sysjoystick.c
+++ b/src/joystick/n3ds/SDL_sysjoystick.c
@@ -32,18 +32,28 @@
#define NB_BUTTONS 23
/*
- N3DS sticks values are roughly within +/-160
+ N3DS sticks values are roughly within +/-170
which is too small to pass the jitter tolerance.
This correction is applied to axis values
so they fit better in SDL's value range.
*/
-#define CORRECT_AXIS_X(X) ((X * SDL_JOYSTICK_AXIS_MAX) / 160)
+static inline int Correct_Axis_X(int X) {
+ if (X > 160) {
+ return SDL_JOYSTICK_AXIS_MAX;
+ }
+ else if (X < -160) {
+ return -SDL_JOYSTICK_AXIS_MAX;
+ }
+ return (X * SDL_JOYSTICK_AXIS_MAX) / 160;
+}
/*
The Y axis needs to be flipped because SDL's "up"
is reversed compared to libctru's "up"
*/
-#define CORRECT_AXIS_Y(Y) CORRECT_AXIS_X(-Y)
+static inline int Correct_Axis_Y(int Y) {
+ return Correct_Axis_X(-Y);
+}
SDL_FORCE_INLINE void UpdateN3DSPressedButtons(SDL_Joystick *joystick);
SDL_FORCE_INLINE void UpdateN3DSReleasedButtons(SDL_Joystick *joystick);
@@ -143,12 +153,12 @@ UpdateN3DSCircle(SDL_Joystick *joystick)
if (previous_state.dx != current_state.dx) {
SDL_PrivateJoystickAxis(joystick,
0,
- CORRECT_AXIS_X(current_state.dx));
+ Correct_Axis_X(current_state.dx));
}
if (previous_state.dy != current_state.dy) {
SDL_PrivateJoystickAxis(joystick,
1,
- CORRECT_AXIS_Y(current_state.dy));
+ Correct_Axis_Y(current_state.dy));
}
previous_state = current_state;
}
@@ -162,12 +172,12 @@ UpdateN3DSCStick(SDL_Joystick *joystick)
if (previous_state.dx != current_state.dx) {
SDL_PrivateJoystickAxis(joystick,
2,
- CORRECT_AXIS_X(current_state.dx));
+ Correct_Axis_X(current_state.dx));
}
if (previous_state.dy != current_state.dy) {
SDL_PrivateJoystickAxis(joystick,
3,
- CORRECT_AXIS_Y(current_state.dy));
+ Correct_Axis_Y(current_state.dy));
}
previous_state = current_state;
}