diff --git a/src/platform/qt/InputController.cpp b/src/platform/qt/InputController.cpp
index 9a8458e1d..a0fb91397 100644
--- a/src/platform/qt/InputController.cpp
+++ b/src/platform/qt/InputController.cpp
@@ -341,6 +341,11 @@ void InputController::registerGyroAxisX(int axis) {
#ifdef BUILD_SDL
if (m_playerAttached) {
m_sdlPlayer.rotation.gyroX = axis;
+ if (m_sdlPlayer.rotation.gyroY == axis) {
+ m_sdlPlayer.rotation.gyroZ = axis;
+ } else {
+ m_sdlPlayer.rotation.gyroZ = -1;
+ }
}
#endif
}
@@ -349,6 +354,11 @@ void InputController::registerGyroAxisY(int axis) {
#ifdef BUILD_SDL
if (m_playerAttached) {
m_sdlPlayer.rotation.gyroY = axis;
+ if (m_sdlPlayer.rotation.gyroX == axis) {
+ m_sdlPlayer.rotation.gyroZ = axis;
+ } else {
+ m_sdlPlayer.rotation.gyroZ = -1;
+ }
}
#endif
}
diff --git a/src/platform/qt/SensorView.ui b/src/platform/qt/SensorView.ui
index d75b5329d..7d65ba52c 100644
--- a/src/platform/qt/SensorView.ui
+++ b/src/platform/qt/SensorView.ui
@@ -284,10 +284,10 @@
false
- -2147483647
+ -1073741823
- 2147483647
+ 1073741823
0
diff --git a/src/platform/sdl/sdl-events.c b/src/platform/sdl/sdl-events.c
index b7e8b002b..a675ff2c0 100644
--- a/src/platform/sdl/sdl-events.c
+++ b/src/platform/sdl/sdl-events.c
@@ -199,6 +199,7 @@ bool mSDLAttachPlayer(struct mSDLEvents* events, struct mSDLPlayer* player) {
player->rotation.gyroSensitivity = 2.2e9f;
player->rotation.gyroX = 0;
player->rotation.gyroY = 1;
+ player->rotation.gyroZ = -1;
player->rotation.zDelta = 0;
CircleBufferInit(&player->rotation.zHistory, sizeof(float) * GYRO_STEPS);
player->rotation.p = player;
@@ -327,6 +328,13 @@ void mSDLPlayerLoadConfig(struct mSDLPlayer* context, const struct Configuration
context->rotation.gyroY = axis;
}
}
+ value = mInputGetCustomValue(config, "gba", SDL_BINDING_BUTTON, "gyroAxisZ", name);
+ if (value) {
+ axis = strtol(value, &end, 0);
+ if (axis >= 0 && axis < numAxes && end && !*end) {
+ context->rotation.gyroZ = axis;
+ }
+ }
value = mInputGetCustomValue(config, "gba", SDL_BINDING_BUTTON, "gyroSensitivity", name);
if (value) {
float sensitivity = strtof_u(value, &end);
@@ -357,6 +365,8 @@ void mSDLPlayerSaveConfig(const struct mSDLPlayer* context, struct Configuration
mInputSetCustomValue(config, "gba", SDL_BINDING_BUTTON, "gyroAxisX", value, name);
snprintf(value, sizeof(value), "%i", context->rotation.gyroY);
mInputSetCustomValue(config, "gba", SDL_BINDING_BUTTON, "gyroAxisY", value, name);
+ snprintf(value, sizeof(value), "%i", context->rotation.gyroZ);
+ mInputSetCustomValue(config, "gba", SDL_BINDING_BUTTON, "gyroAxisZ", value, name);
snprintf(value, sizeof(value), "%g", context->rotation.gyroSensitivity);
mInputSetCustomValue(config, "gba", SDL_BINDING_BUTTON, "gyroSensitivity", value, name);
}
@@ -750,6 +760,10 @@ static void _mSDLRotationSample(struct mRotationSource* source) {
}
}
#endif
+ if (rotation->gyroZ >= 0) {
+ rotation->zDelta = SDL_JoystickGetAxis(rotation->p->joystick->joystick, rotation->gyroZ) / 1.e5f;
+ return;
+ }
int x = SDL_JoystickGetAxis(rotation->p->joystick->joystick, rotation->gyroX);
int y = SDL_JoystickGetAxis(rotation->p->joystick->joystick, rotation->gyroY);
diff --git a/src/platform/sdl/sdl-events.h b/src/platform/sdl/sdl-events.h
index 1763865e2..8bdbd7c0b 100644
--- a/src/platform/sdl/sdl-events.h
+++ b/src/platform/sdl/sdl-events.h
@@ -95,6 +95,7 @@ struct mSDLPlayer {
// Gyro
int gyroX;
int gyroY;
+ int gyroZ;
float gyroSensitivity;
struct CircleBuffer zHistory;
int oldX;