MotorSettings.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #pragma once
  5. #include <Jolt/Core/Reference.h>
  6. #include <Jolt/ObjectStream/SerializableObject.h>
  7. #include <Jolt/Physics/Constraints/SpringSettings.h>
  8. JPH_NAMESPACE_BEGIN
  9. class StreamIn;
  10. class StreamOut;
  11. enum class EMotorState
  12. {
  13. Off, ///< Motor is off
  14. Velocity, ///< Motor will drive to target velocity
  15. Position ///< Motor will drive to target position
  16. };
  17. /// Class that contains the settings for a constraint motor.
  18. /// See the main page of the API documentation for more information on how to configure a motor.
  19. class JPH_EXPORT MotorSettings
  20. {
  21. public:
  22. JPH_DECLARE_SERIALIZABLE_NON_VIRTUAL(JPH_EXPORT, MotorSettings)
  23. /// Constructor
  24. MotorSettings() = default;
  25. MotorSettings(const MotorSettings &) = default;
  26. MotorSettings & operator = (const MotorSettings &) = default;
  27. MotorSettings(float inFrequency, float inDamping) : mSpringSettings(ESpringMode::FrequencyAndDamping, inFrequency, inDamping) { JPH_ASSERT(IsValid()); }
  28. MotorSettings(float inFrequency, float inDamping, float inForceLimit, float inTorqueLimit) : mSpringSettings(ESpringMode::FrequencyAndDamping, inFrequency, inDamping), mMinForceLimit(-inForceLimit), mMaxForceLimit(inForceLimit), mMinTorqueLimit(-inTorqueLimit), mMaxTorqueLimit(inTorqueLimit) { JPH_ASSERT(IsValid()); }
  29. /// Set asymmetric force limits
  30. void SetForceLimits(float inMin, float inMax) { JPH_ASSERT(inMin <= inMax); mMinForceLimit = inMin; mMaxForceLimit = inMax; }
  31. /// Set asymmetric torque limits
  32. void SetTorqueLimits(float inMin, float inMax) { JPH_ASSERT(inMin <= inMax); mMinTorqueLimit = inMin; mMaxTorqueLimit = inMax; }
  33. /// Set symmetric force limits
  34. void SetForceLimit(float inLimit) { mMinForceLimit = -inLimit; mMaxForceLimit = inLimit; }
  35. /// Set symmetric torque limits
  36. void SetTorqueLimit(float inLimit) { mMinTorqueLimit = -inLimit; mMaxTorqueLimit = inLimit; }
  37. /// Check if settings are valid
  38. bool IsValid() const { return mSpringSettings.mFrequency >= 0.0f && mSpringSettings.mDamping >= 0.0f && mMinForceLimit <= mMaxForceLimit && mMinTorqueLimit <= mMaxTorqueLimit; }
  39. /// Saves the contents of the motor settings in binary form to inStream.
  40. void SaveBinaryState(StreamOut &inStream) const;
  41. /// Restores contents from the binary stream inStream.
  42. void RestoreBinaryState(StreamIn &inStream);
  43. // Settings
  44. SpringSettings mSpringSettings { ESpringMode::FrequencyAndDamping, 2.0f, 1.0f }; ///< Settings for the spring that is used to drive to the position target (not used when motor is a velocity motor).
  45. float mMinForceLimit = -FLT_MAX; ///< Minimum force to apply in case of a linear constraint (N). Usually this is -mMaxForceLimit unless you want a motor that can e.g. push but not pull. Not used when motor is an angular motor.
  46. float mMaxForceLimit = FLT_MAX; ///< Maximum force to apply in case of a linear constraint (N). Not used when motor is an angular motor.
  47. float mMinTorqueLimit = -FLT_MAX; ///< Minimum torque to apply in case of a angular constraint (N m). Usually this is -mMaxTorqueLimit unless you want a motor that can e.g. push but not pull. Not used when motor is a position motor.
  48. float mMaxTorqueLimit = FLT_MAX; ///< Maximum torque to apply in case of a angular constraint (N m). Not used when motor is a position motor.
  49. };
  50. JPH_NAMESPACE_END