MotorSettings.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #pragma once
  4. #include <Core/Reference.h>
  5. #include <ObjectStream/SerializableObject.h>
  6. namespace JPH {
  7. class StreamIn;
  8. class StreamOut;
  9. enum class EMotorState
  10. {
  11. Off, ///< Motor is off
  12. Velocity, ///< Motor will drive to target velocity
  13. Position ///< Motor will drive to target position
  14. };
  15. /// Class that contains the settings for a constraint motor
  16. class MotorSettings
  17. {
  18. public:
  19. JPH_DECLARE_SERIALIZABLE_NON_VIRTUAL(MotorSettings)
  20. /// Constructor
  21. MotorSettings() = default;
  22. MotorSettings(const MotorSettings &inRHS) = default;
  23. MotorSettings(float inFrequency, float inDamping) : mFrequency(inFrequency), mDamping(inDamping) { JPH_ASSERT(IsValid()); }
  24. MotorSettings(float inFrequency, float inDamping, float inForceLimit, float inTorqueLimit) : mFrequency(inFrequency), mDamping(inDamping), mMinForceLimit(-inForceLimit), mMaxForceLimit(inForceLimit), mMinTorqueLimit(-inTorqueLimit), mMaxTorqueLimit(inTorqueLimit) { JPH_ASSERT(IsValid()); }
  25. /// Set asymmetric force limits
  26. void SetForceLimits(float inMin, float inMax) { JPH_ASSERT(inMin <= inMax); mMinForceLimit = inMin; mMaxForceLimit = inMax; }
  27. /// Set asymmetric torque limits
  28. void SetTorqueLimits(float inMin, float inMax) { JPH_ASSERT(inMin <= inMax); mMinTorqueLimit = inMin; mMaxTorqueLimit = inMax; }
  29. /// Set symmetric force limits
  30. void SetForceLimit(float inLimit) { mMinForceLimit = -inLimit; mMaxForceLimit = inLimit; }
  31. /// Set symmetric torque limits
  32. void SetTorqueLimit(float inLimit) { mMinTorqueLimit = -inLimit; mMaxTorqueLimit = inLimit; }
  33. /// Check if settings are valid
  34. bool IsValid() const { return mFrequency >= 0.0f && mDamping >= 0.0f && mMinForceLimit <= mMaxForceLimit && mMinTorqueLimit <= mMaxTorqueLimit; }
  35. /// Saves the contents of the motor settings in binary form to inStream.
  36. void SaveBinaryState(StreamOut &inStream) const;
  37. /// Restores contents from the binary stream inStream.
  38. void RestoreBinaryState(StreamIn &inStream);
  39. // Settings
  40. float mFrequency = 2.0f; ///< Oscillation frequency when solving position target (Hz)
  41. float mDamping = 1.0f; ///< Damping when solving position target (0 = minimal damping, 1 = critical damping)
  42. float mMinForceLimit = -FLT_MAX; ///< Minimum force to apply in case of a linear constraint (N)
  43. float mMaxForceLimit = FLT_MAX; ///< Maximum force to apply in case of a linear constraint (N)
  44. float mMinTorqueLimit = -FLT_MAX; ///< Minimum torque to apply in case of a angular constraint (N m)
  45. float mMaxTorqueLimit = FLT_MAX; ///< Maximum torque to apply in case of a angular constraint (N m)
  46. };
  47. } // JPH