diff --git a/CHANGELOG.md b/CHANGELOG.md index af55acae5..dffa50d44 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Handle body rotation on physics integration (#1242, **&fallenatlas**). - Binary Serializer and Deserializer (#1306, **@RiscadoA**). - Type Client and Type Server (#1302, **@RiscadoA**). +- Deadzone for axis (#844, **@kuukitenshi**) ### Fixed diff --git a/engine/include/cubos/engine/input/axis.hpp b/engine/include/cubos/engine/input/axis.hpp index 11d60e47e..085767eb5 100644 --- a/engine/include/cubos/engine/input/axis.hpp +++ b/engine/include/cubos/engine/input/axis.hpp @@ -35,10 +35,11 @@ namespace cubos::engine /// @param negative Negative input combinations. /// @param gamepadAxes Gamepad axis bindings. InputAxis(std::vector positive, std::vector negative, - std::vector gamepadAxes) + std::vector gamepadAxes, float deadzone = 0.0F) : mPositive(std::move(positive)) , mNegative(std::move(negative)) , mGamepadAxes(std::move(gamepadAxes)) + , mDeadzone(deadzone) { } @@ -74,11 +75,20 @@ namespace cubos::engine /// @param value New value. void value(float value); + /// @brief Gets the deadzone. + /// @return Deadzone. + float deadzone() const; + + /// @brief Sets the deadzone. + /// @param deadzone New deadzone. + void deadzone(float deadzone); + private: std::vector mPositive; std::vector mNegative; std::vector mGamepadAxes; float mValue{0.0F}; ///< Not serialized. + float mDeadzone{0.0F}; }; } // namespace cubos::engine diff --git a/engine/src/input/axis.cpp b/engine/src/input/axis.cpp index de32779c9..1a54a80d0 100644 --- a/engine/src/input/axis.cpp +++ b/engine/src/input/axis.cpp @@ -20,7 +20,8 @@ CUBOS_REFLECT_IMPL(cubos::engine::InputAxis) .with(FieldsTrait{} .withField("positive", &InputAxis::mPositive) .withField("negative", &InputAxis::mNegative) - .withField("gamepadAxes", &InputAxis::mGamepadAxes)); + .withField("gamepadAxes", &InputAxis::mGamepadAxes) + .withField("mDeadzone", &InputAxis::mDeadzone)); } const std::vector& InputAxis::positive() const @@ -60,7 +61,7 @@ float InputAxis::value() const void InputAxis::value(float value) { - mValue = value; + mValue = std::abs(value) < mDeadzone ? 0.0F : value; if (std::abs(mValue) > 1.0F) { @@ -68,3 +69,21 @@ void InputAxis::value(float value) mValue = mValue > 1.0F ? 1.0F : -1.0F; } } + +float InputAxis::deadzone() const +{ + return mDeadzone; +} + +void InputAxis::deadzone(float deadzone) +{ + if (deadzone < 0.0F || deadzone > 1.0F) + { + CUBOS_WARN("Invalid deadzone value: {}. Value must be between 0.0 and 1.0.", deadzone); + mDeadzone = deadzone > 1.0F ? 1.0F : 0.0F; + } + else + { + mDeadzone = deadzone; + } +}