diff options
Diffstat (limited to 'Source/Core/InputCommon/ControllerEmu/ControlGroup')
| -rw-r--r-- | Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.cpp | 31 | ||||
| -rw-r--r-- | Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.h | 8 |
2 files changed, 35 insertions, 4 deletions
diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.cpp b/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.cpp index 84f9f20821..6109f20b8c 100644 --- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.cpp +++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.cpp @@ -7,6 +7,7 @@ #include <memory> #include "Common/Common.h" +#include "Common/MathUtil.h" #include "InputCommon/ControlReference/ControlReference.h" #include "InputCommon/ControllerEmu/Control/Control.h" @@ -23,6 +24,21 @@ IMUGyroscope::IMUGyroscope(std::string name, std::string ui_name) AddInput(Translate, _trans("Roll Right")); AddInput(Translate, _trans("Yaw Left")); AddInput(Translate, _trans("Yaw Right")); + + AddSetting(&m_deadzone_setting, + {_trans("Dead Zone"), + // i18n: "°/s" is the symbol for degrees (angular measurement) divided by seconds. + _trans("°/s"), + // i18n: Refers to the dead-zone setting of gyroscope input. + _trans("Angular velocity to ignore.")}, + 1, 0, 180); +} + +auto IMUGyroscope::GetRawState() const -> StateData +{ + return StateData(controls[1]->GetState() - controls[0]->GetState(), + controls[2]->GetState() - controls[3]->GetState(), + controls[4]->GetState() - controls[5]->GetState()); } std::optional<IMUGyroscope::StateData> IMUGyroscope::GetState() const @@ -30,11 +46,18 @@ std::optional<IMUGyroscope::StateData> IMUGyroscope::GetState() const if (controls[0]->control_ref->BoundCount() == 0) return std::nullopt; - StateData state; - state.x = (controls[1]->GetState() - controls[0]->GetState()); - state.y = (controls[2]->GetState() - controls[3]->GetState()); - state.z = (controls[4]->GetState() - controls[5]->GetState()); + auto state = GetRawState(); + + // Apply "deadzone". + for (auto& c : state.data) + c *= std::abs(c) > GetDeadzone(); + return state; } +ControlState IMUGyroscope::GetDeadzone() const +{ + return m_deadzone_setting.GetValue() / 360 * MathUtil::TAU; +} + } // namespace ControllerEmu diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.h b/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.h index c173c2f8b2..1258a3eb76 100644 --- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.h +++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.h @@ -9,6 +9,7 @@ #include "Common/Matrix.h" #include "InputCommon/ControllerEmu/ControlGroup/ControlGroup.h" +#include "InputCommon/ControllerEmu/Setting/NumericSetting.h" namespace ControllerEmu { @@ -19,6 +20,13 @@ public: IMUGyroscope(std::string name, std::string ui_name); + StateData GetRawState() const; std::optional<StateData> GetState() const; + + // Value is in rad/s. + ControlState GetDeadzone() const; + +private: + SettingValue<double> m_deadzone_setting; }; } // namespace ControllerEmu |
