mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-05-18 09:24:58 +00:00
Fix SDL gyro and acceleration sensor handling (#2532)
* Fix sensor handling if they are enabled but an error was thrown regardless * Initialise orientation to a default value + clang
This commit is contained in:
parent
fd3bfdae80
commit
b8aac357cb
4 changed files with 17 additions and 11 deletions
|
@ -315,12 +315,13 @@ int PS4_SYSV_ABI scePadRead(s32 handle, OrbisPadData* pData, s32 num) {
|
||||||
pData[i].angularVelocity.x = states[i].angularVelocity.x;
|
pData[i].angularVelocity.x = states[i].angularVelocity.x;
|
||||||
pData[i].angularVelocity.y = states[i].angularVelocity.y;
|
pData[i].angularVelocity.y = states[i].angularVelocity.y;
|
||||||
pData[i].angularVelocity.z = states[i].angularVelocity.z;
|
pData[i].angularVelocity.z = states[i].angularVelocity.z;
|
||||||
|
pData[i].orientation = {0.0f, 0.0f, 0.0f, 1.0f};
|
||||||
if (engine) {
|
if (engine) {
|
||||||
const auto accel_poll_rate = engine->GetAccelPollRate();
|
const auto gyro_poll_rate = engine->GetAccelPollRate();
|
||||||
if (accel_poll_rate != 0.0f) {
|
if (gyro_poll_rate != 0.0f) {
|
||||||
GameController::CalculateOrientation(pData[i].acceleration,
|
GameController::CalculateOrientation(pData[i].acceleration,
|
||||||
pData[i].angularVelocity,
|
pData[i].angularVelocity,
|
||||||
1.0f / accel_poll_rate, pData[i].orientation);
|
1.0f / gyro_poll_rate, pData[i].orientation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pData[i].touchData.touchNum =
|
pData[i].touchData.touchNum =
|
||||||
|
@ -384,11 +385,12 @@ int PS4_SYSV_ABI scePadReadState(s32 handle, OrbisPadData* pData) {
|
||||||
pData->angularVelocity.x = state.angularVelocity.x;
|
pData->angularVelocity.x = state.angularVelocity.x;
|
||||||
pData->angularVelocity.y = state.angularVelocity.y;
|
pData->angularVelocity.y = state.angularVelocity.y;
|
||||||
pData->angularVelocity.z = state.angularVelocity.z;
|
pData->angularVelocity.z = state.angularVelocity.z;
|
||||||
|
pData->orientation = {0.0f, 0.0f, 0.0f, 1.0f};
|
||||||
if (engine) {
|
if (engine) {
|
||||||
const auto accel_poll_rate = engine->GetAccelPollRate();
|
const auto gyro_poll_rate = engine->GetAccelPollRate();
|
||||||
if (accel_poll_rate != 0.0f) {
|
if (gyro_poll_rate != 0.0f) {
|
||||||
GameController::CalculateOrientation(pData->acceleration, pData->angularVelocity,
|
GameController::CalculateOrientation(pData->acceleration, pData->angularVelocity,
|
||||||
1.0f / accel_poll_rate, pData->orientation);
|
1.0f / gyro_poll_rate, pData->orientation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pData->touchData.touchNum =
|
pData->touchData.touchNum =
|
||||||
|
|
|
@ -182,7 +182,7 @@ void GameController::CalculateOrientation(Libraries::Pad::OrbisFVector3& acceler
|
||||||
|
|
||||||
// Normalize accelerometer measurement
|
// Normalize accelerometer measurement
|
||||||
float norm = std::sqrt(ax * ax + ay * ay + az * az);
|
float norm = std::sqrt(ax * ax + ay * ay + az * az);
|
||||||
if (norm == 0.0f)
|
if (norm == 0.0f || deltaTime == 0.0f)
|
||||||
return; // Handle NaN
|
return; // Handle NaN
|
||||||
norm = 1.0f / norm;
|
norm = 1.0f / norm;
|
||||||
ax *= norm;
|
ax *= norm;
|
||||||
|
|
|
@ -134,13 +134,17 @@ void SDLInputEngine::Init() {
|
||||||
m_gyro_poll_rate = SDL_GetGamepadSensorDataRate(m_gamepad, SDL_SENSOR_GYRO);
|
m_gyro_poll_rate = SDL_GetGamepadSensorDataRate(m_gamepad, SDL_SENSOR_GYRO);
|
||||||
LOG_INFO(Input, "Gyro initialized, poll rate: {}", m_gyro_poll_rate);
|
LOG_INFO(Input, "Gyro initialized, poll rate: {}", m_gyro_poll_rate);
|
||||||
} else {
|
} else {
|
||||||
LOG_ERROR(Input, "Failed to initialize gyro controls for gamepad");
|
LOG_ERROR(Input, "Failed to initialize gyro controls for gamepad, error: {}",
|
||||||
|
SDL_GetError());
|
||||||
|
SDL_SetGamepadSensorEnabled(m_gamepad, SDL_SENSOR_GYRO, false);
|
||||||
}
|
}
|
||||||
if (SDL_SetGamepadSensorEnabled(m_gamepad, SDL_SENSOR_ACCEL, true)) {
|
if (SDL_SetGamepadSensorEnabled(m_gamepad, SDL_SENSOR_ACCEL, true)) {
|
||||||
m_accel_poll_rate = SDL_GetGamepadSensorDataRate(m_gamepad, SDL_SENSOR_ACCEL);
|
m_accel_poll_rate = SDL_GetGamepadSensorDataRate(m_gamepad, SDL_SENSOR_ACCEL);
|
||||||
LOG_INFO(Input, "Accel initialized, poll rate: {}", m_accel_poll_rate);
|
LOG_INFO(Input, "Accel initialized, poll rate: {}", m_accel_poll_rate);
|
||||||
} else {
|
} else {
|
||||||
LOG_ERROR(Input, "Failed to initialize accel controls for gamepad");
|
LOG_ERROR(Input, "Failed to initialize accel controls for gamepad, error: {}",
|
||||||
|
SDL_GetError());
|
||||||
|
SDL_SetGamepadSensorEnabled(m_gamepad, SDL_SENSOR_ACCEL, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,8 +27,8 @@ public:
|
||||||
private:
|
private:
|
||||||
SDL_Gamepad* m_gamepad = nullptr;
|
SDL_Gamepad* m_gamepad = nullptr;
|
||||||
|
|
||||||
float m_gyro_poll_rate{};
|
float m_gyro_poll_rate = 0.0f;
|
||||||
float m_accel_poll_rate{};
|
float m_accel_poll_rate = 0.0f;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Input
|
} // namespace Input
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue