Gyro: Revisions & Rollgoal Mirror Mode

This commit is contained in:
Irastris
2026-04-16 15:31:58 -04:00
parent 649fc8d073
commit af624bb3ea
6 changed files with 74 additions and 68 deletions
+27 -27
View File
@@ -3,31 +3,28 @@
namespace dusk::gyro {
namespace {
// TODO: Make deadband and smoothing configurable
constexpr float kDeadbandRadS = 0.04f;
constexpr float kSmoothAlpha = 0.35f;
constexpr s32 kRollgoalTableMaxOffset = 12000;
constexpr float kGyroEmaAlphaMin = 0.05f;
constexpr float kGyroEmaAlphaMax = 1.0f;
bool s_sensor_enabled = false;
float s_smooth_gx = 0.0f;
float s_smooth_gy = 0.0f;
float s_smooth_gz = 0.0f;
float s_yaw_rad = 0.0f;
float s_yaw_rad_pending = 0.0f;
float s_pitch_rad = 0.0f;
float s_pitch_rad_pending = 0.0f;
float s_roll_rad = 0.0f;
s32 s_rollgoal_ax = 0;
s32 s_rollgoal_az = 0;
void reset_filter_state() {
s_smooth_gx = s_smooth_gy = s_smooth_gz = 0.0f;
s_yaw_rad_pending = s_pitch_rad_pending = s_roll_rad = 0.0f;
s_yaw_rad = s_pitch_rad = s_roll_rad = 0.0f;
s_rollgoal_ax = s_rollgoal_az = 0;
}
float apply_deadband(float v) {
if (v > -kDeadbandRadS && v < kDeadbandRadS) {
float apply_deadband(float v, float deadband_rad_s) {
if (v > -deadband_rad_s && v < deadband_rad_s) {
return 0.0f;
}
return v;
@@ -35,7 +32,6 @@ float apply_deadband(float v) {
} // namespace
bool s_sensor_keep_alive = false;
bool get_sensor_keep_alive() { return s_sensor_keep_alive; }
void set_sensor_keep_alive(bool value) { s_sensor_keep_alive = value; }
@@ -77,22 +73,25 @@ void read(float dt) {
return;
}
s_smooth_gx += kSmoothAlpha * (gyro[0] - s_smooth_gx);
s_smooth_gy += kSmoothAlpha * (gyro[1] - s_smooth_gy);
s_smooth_gz += kSmoothAlpha * (gyro[2] - s_smooth_gz);
const float smooth_alpha = kGyroEmaAlphaMax + dusk::getSettings().game.gyroSmoothing * (kGyroEmaAlphaMin - kGyroEmaAlphaMax);
const float deadband = dusk::getSettings().game.gyroDeadband;
s_pitch_rad = apply_deadband(s_smooth_gx) * dt * dusk::getSettings().game.gyroAimSensitivityX;
s_yaw_rad = apply_deadband(s_smooth_gy) * dt * dusk::getSettings().game.gyroAimSensitivityY;
s_roll_rad = apply_deadband(s_smooth_gz) * dt * dusk::getSettings().game.gyroAimSensitivityX; // GYRO NOTE: Exposing Z sensitivity seems unusual, so I'm just using X
s_smooth_gx += smooth_alpha * (gyro[0] - s_smooth_gx);
s_smooth_gy += smooth_alpha * (gyro[1] - s_smooth_gy);
s_smooth_gz += smooth_alpha * (gyro[2] - s_smooth_gz);
s_pitch_rad_pending += s_pitch_rad;
s_yaw_rad_pending += s_yaw_rad;
s_pitch_rad = -apply_deadband(s_smooth_gx, deadband) * dt * dusk::getSettings().game.gyroSensitivityX;
s_yaw_rad = apply_deadband(s_smooth_gy, deadband) * dt * dusk::getSettings().game.gyroSensitivityY;
s_roll_rad = apply_deadband(s_smooth_gz, deadband) * dt * dusk::getSettings().game.gyroSensitivityX; // GYRO NOTE: Exposing Z sensitivity seems unusual, so I'm just using X
s_pitch_rad = dusk::getSettings().game.gyroInvertPitch ? -s_pitch_rad : s_pitch_rad;
s_yaw_rad = dusk::getSettings().game.gyroInvertYaw ? -s_yaw_rad : s_yaw_rad;
s_yaw_rad = dusk::getSettings().game.enableMirrorMode ? -s_yaw_rad : s_yaw_rad;
}
void consumeAimDeltas(float& out_yaw_rad, float& out_pitch_rad) {
out_yaw_rad = s_yaw_rad_pending;
out_pitch_rad = s_pitch_rad_pending;
s_yaw_rad_pending = s_pitch_rad_pending = 0.0f;
void getAimDeltas(float& out_yaw, float& out_pitch) {
out_yaw = s_yaw_rad;
out_pitch = s_pitch_rad;
}
void rollgoalTick(bool play_active, s16 camera_yaw) {
@@ -101,13 +100,14 @@ void rollgoalTick(bool play_active, s16 camera_yaw) {
return;
}
const float pitch_rad = s_pitch_rad * dusk::getSettings().game.gyroRollgoalSensitivity;
const float roll_rad = s_roll_rad * dusk::getSettings().game.gyroRollgoalSensitivity;
float pitch_rad = -s_pitch_rad * dusk::getSettings().game.gyroSensitivityRollgoal;
float roll_rad = s_roll_rad * dusk::getSettings().game.gyroSensitivityRollgoal;
roll_rad = dusk::getSettings().game.enableMirrorMode ? -roll_rad : roll_rad;
s_rollgoal_az += cM_rad2s(roll_rad);
cXyz in(roll_rad, 0.0f, pitch_rad);
cXyz out;
cMtx_YrotS(*calc_mtx, static_cast<s16>(-camera_yaw));
cMtx_YrotS(*calc_mtx, -camera_yaw);
MtxPosition(&in, &out);
s_rollgoal_ax += cM_rad2s(out.z);
@@ -116,8 +116,8 @@ void rollgoalTick(bool play_active, s16 camera_yaw) {
s_rollgoal_az = std::clamp(s_rollgoal_az, -kRollgoalTableMaxOffset, kRollgoalTableMaxOffset);
}
void rollgoalTableOffset(s16& out_add_x, s16& out_add_z) {
out_add_x = static_cast<s16>(s_rollgoal_ax);
out_add_z = static_cast<s16>(s_rollgoal_az);
void rollgoalTableOffset(s16& out_ax, s16& out_az) {
out_ax = static_cast<s16>(s_rollgoal_ax);
out_az = static_cast<s16>(s_rollgoal_az);
}
} // namespace dusk::gyro