improved motion controls emulation (#4022)

This commit is contained in:
kalaposfos13 2026-02-11 17:09:34 +01:00 committed by GitHub
parent c2a47d2a99
commit 7bdb5eb7e1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -269,9 +269,14 @@ namespace Frontend {
using namespace Libraries::Pad; using namespace Libraries::Pad;
static Uint32 SDLCALL PollController(void* userdata, SDL_TimerID timer_id, Uint32 interval) { std::mutex motion_control_mutex;
float gyro_buf[3] = {0.0f, 0.0f, 0.0f}, accel_buf[3] = {0.0f, -9.81f, 0.0f};
static Uint32 SDLCALL PollGyroAndAccel(void* userdata, SDL_TimerID timer_id, Uint32 interval) {
auto* controller = reinterpret_cast<Input::GameController*>(userdata); auto* controller = reinterpret_cast<Input::GameController*>(userdata);
return controller->Poll(); std::scoped_lock l{motion_control_mutex};
controller->Gyro(0, gyro_buf);
controller->Acceleration(0, accel_buf);
return 4;
} }
WindowSDL::WindowSDL(s32 width_, s32 height_, Input::GameController* controller_, WindowSDL::WindowSDL(s32 width_, s32 height_, Input::GameController* controller_,
@ -407,12 +412,16 @@ void WindowSDL::WaitEvent() {
// AND IT DOESN'T EVEN USE PROPER ENUMS // AND IT DOESN'T EVEN USE PROPER ENUMS
case SDL_EVENT_GAMEPAD_SENSOR_UPDATE: case SDL_EVENT_GAMEPAD_SENSOR_UPDATE:
switch ((SDL_SensorType)event.gsensor.sensor) { switch ((SDL_SensorType)event.gsensor.sensor) {
case SDL_SENSOR_GYRO: case SDL_SENSOR_GYRO: {
controller->Gyro(0, event.gsensor.data); std::scoped_lock l{motion_control_mutex};
memcpy(gyro_buf, event.gsensor.data, sizeof(gyro_buf));
break; break;
case SDL_SENSOR_ACCEL: }
controller->Acceleration(0, event.gsensor.data); case SDL_SENSOR_ACCEL: {
std::scoped_lock l{motion_control_mutex};
memcpy(accel_buf, event.gsensor.data, sizeof(accel_buf));
break; break;
}
default: default:
break; break;
} }
@ -471,7 +480,7 @@ void WindowSDL::WaitEvent() {
} }
void WindowSDL::InitTimers() { void WindowSDL::InitTimers() {
SDL_AddTimer(33, &PollController, controller); SDL_AddTimer(4, &PollGyroAndAccel, controller);
SDL_AddTimer(33, Input::MousePolling, (void*)controller); SDL_AddTimer(33, Input::MousePolling, (void*)controller);
} }