Make motion controls work with multiple controllers

This commit is contained in:
kalaposfos13 2025-04-15 15:07:39 +02:00
parent fa27744588
commit ce359b5b4d
2 changed files with 37 additions and 2 deletions

View file

@ -271,11 +271,10 @@ void GameControllers::TryOpenSDLControllers(GameControllers& controllers) {
}
}
// Now, add any new controllers not already assigned
for (int j = 0; j < controller_count; j++) {
SDL_JoystickID id = new_joysticks[j];
if (assigned_ids.contains(id))
continue; // already handled
continue;
SDL_Gamepad* pad = SDL_OpenGamepad(id);
if (!pad)
@ -288,6 +287,27 @@ void GameControllers::TryOpenSDLControllers(GameControllers& controllers) {
slot_taken[i] = true;
AddUserServiceEvent(
{OrbisUserServiceEventType::Login, SDL_GetGamepadPlayerIndex(pad) + 1});
if (SDL_SetGamepadSensorEnabled(controllers[i]->m_sdl_gamepad, SDL_SENSOR_GYRO,
true)) {
controllers[i]->gyro_poll_rate = SDL_GetGamepadSensorDataRate(
controllers[i]->m_sdl_gamepad, SDL_SENSOR_GYRO);
LOG_INFO(Input, "Gyro initialized, poll rate: {}",
controllers[i]->gyro_poll_rate);
} else {
LOG_ERROR(Input, "Failed to initialize gyro controls for gamepad {}",
controllers[i]->user_id);
}
if (SDL_SetGamepadSensorEnabled(controllers[i]->m_sdl_gamepad, SDL_SENSOR_ACCEL,
true)) {
controllers[i]->accel_poll_rate = SDL_GetGamepadSensorDataRate(
controllers[i]->m_sdl_gamepad, SDL_SENSOR_ACCEL);
LOG_INFO(Input, "Accel initialized, poll rate: {}",
controllers[i]->accel_poll_rate);
} else {
LOG_ERROR(Input, "Failed to initialize accel controls for gamepad {}",
controllers[i]->user_id);
}
break;
}
}

View file

@ -194,6 +194,21 @@ void WindowSDL::WaitEvent() {
case SDL_EVENT_GAMEPAD_AXIS_MOTION:
OnGamepadEvent(&event);
break;
case SDL_EVENT_GAMEPAD_SENSOR_UPDATE:{
int controller_id = Input::GetGamepadIndexFromJoystickId(event.gsensor.which) - 1;
switch ((SDL_SensorType)event.gsensor.sensor) {
case SDL_SENSOR_GYRO:
controllers[controller_id]->Gyro(
0, event.gsensor.data);
break;
case SDL_SENSOR_ACCEL:
controllers[controller_id]->Acceleration(
0, event.gsensor.data);
break;
default:
break;
}
break;}
case SDL_EVENT_QUIT:
is_open = false;
break;