BodyCreationSettings.h 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #pragma once
  4. #include <Jolt/Physics/Collision/Shape/Shape.h>
  5. #include <Jolt/Physics/Collision/ObjectLayer.h>
  6. #include <Jolt/Physics/Collision/CollisionGroup.h>
  7. #include <Jolt/Physics/Body/MotionType.h>
  8. #include <Jolt/Physics/Body/MotionQuality.h>
  9. #include <Jolt/ObjectStream/SerializableObject.h>
  10. JPH_NAMESPACE_BEGIN
  11. class StreamIn;
  12. class StreamOut;
  13. /// Enum used in BodyCreationSettings to indicate how mass and inertia should be calculated
  14. enum class EOverrideMassProperties : uint8
  15. {
  16. CalculateMassAndInertia, ///< Tells the system to calculate the mass and inertia based on density
  17. CalculateInertia, ///< Tells the system to take the mass from mMassPropertiesOverride and to calculate the inertia based on density of the shapes and to scale it to the provided mass
  18. MassAndInertiaProvided ///< Tells the system to take the mass and inertia from mMassPropertiesOverride
  19. };
  20. /// Settings for constructing a rigid body
  21. class BodyCreationSettings
  22. {
  23. public:
  24. JPH_DECLARE_SERIALIZABLE_NON_VIRTUAL(BodyCreationSettings)
  25. /// Constructor
  26. BodyCreationSettings() = default;
  27. BodyCreationSettings(const ShapeSettings *inShape, RVec3Arg inPosition, QuatArg inRotation, EMotionType inMotionType, ObjectLayer inObjectLayer) : mPosition(inPosition), mRotation(inRotation), mObjectLayer(inObjectLayer), mMotionType(inMotionType), mShape(inShape) { }
  28. BodyCreationSettings(const Shape *inShape, RVec3Arg inPosition, QuatArg inRotation, EMotionType inMotionType, ObjectLayer inObjectLayer) : mPosition(inPosition), mRotation(inRotation), mObjectLayer(inObjectLayer), mMotionType(inMotionType), mShapePtr(inShape) { }
  29. /// Access to the shape settings object. This contains serializable (non-runtime optimized) information about the Shape.
  30. const ShapeSettings * GetShapeSettings() const { return mShape; }
  31. void SetShapeSettings(const ShapeSettings *inShape) { mShape = inShape; mShapePtr = nullptr; }
  32. /// Convert ShapeSettings object into a Shape object. This will free the ShapeSettings object and make the object ready for runtime. Serialization is no longer possible after this.
  33. Shape::ShapeResult ConvertShapeSettings();
  34. /// Access to the run-time shape object. Will convert from ShapeSettings object if needed.
  35. const Shape * GetShape() const;
  36. void SetShape(const Shape *inShape) { mShapePtr = inShape; mShape = nullptr; }
  37. /// Check if the mass properties of this body will be calculated (only relevant for kinematic or dynamic objects that need a MotionProperties object)
  38. bool HasMassProperties() const { return mAllowDynamicOrKinematic || mMotionType != EMotionType::Static; }
  39. /// Calculate (or return when overridden) the mass and inertia for this body
  40. MassProperties GetMassProperties() const;
  41. /// Saves the state of this object in binary form to inStream. Doesn't store the shape nor the group filter.
  42. void SaveBinaryState(StreamOut &inStream) const;
  43. /// Restore the state of this object from inStream. Doesn't restore the shape nor the group filter.
  44. void RestoreBinaryState(StreamIn &inStream);
  45. using GroupFilterToIDMap = UnorderedMap<const GroupFilter *, uint32>;
  46. using IDToGroupFilterMap = Array<RefConst<GroupFilter>>;
  47. using ShapeToIDMap = Shape::ShapeToIDMap;
  48. using IDToShapeMap = Shape::IDToShapeMap;
  49. using MaterialToIDMap = Shape::MaterialToIDMap;
  50. using IDToMaterialMap = Shape::IDToMaterialMap;
  51. /// Save this body creation settings, its shape and gropu filter. Pass in an empty map in ioShapeMap / ioMaterialMap / ioGroupFilterMap or reuse the same map while saving multiple shapes to the same stream in order to avoid writing duplicates.
  52. /// Pass nullptr to ioShapeMap and ioMaterial map to skip saving shapes
  53. /// Pass nullptr to ioGroupFilterMap to skip saving group filters
  54. void SaveWithChildren(StreamOut &inStream, ShapeToIDMap *ioShapeMap, MaterialToIDMap *ioMaterialMap, GroupFilterToIDMap *ioGroupFilterMap) const;
  55. using BCSResult = Result<BodyCreationSettings>;
  56. /// Restore a shape, all its children and materials. Pass in an empty map in ioShapeMap / ioMaterialMap / ioGroupFilterMap or reuse the same map while reading multiple shapes from the same stream in order to restore duplicates.
  57. static BCSResult sRestoreWithChildren(StreamIn &inStream, IDToShapeMap &ioShapeMap, IDToMaterialMap &ioMaterialMap, IDToGroupFilterMap &ioGroupFilterMap);
  58. RVec3 mPosition = RVec3::sZero(); ///< Position of the body (not of the center of mass)
  59. Quat mRotation = Quat::sIdentity(); ///< Rotation of the body
  60. Vec3 mLinearVelocity = Vec3::sZero(); ///< World space linear velocity of the center of mass (m/s)
  61. Vec3 mAngularVelocity = Vec3::sZero(); ///< World space angular velocity (rad/s)
  62. /// User data value (can be used by application)
  63. uint64 mUserData = 0;
  64. ///@name Collision settings
  65. ObjectLayer mObjectLayer = 0; ///< The collision layer this body belongs to (determines if two objects can collide)
  66. CollisionGroup mCollisionGroup; ///< The collision group this body belongs to (determines if two objects can collide)
  67. ///@name Simulation properties
  68. EMotionType mMotionType = EMotionType::Dynamic; ///< Motion type, determines if the object is static, dynamic or kinematic
  69. bool mAllowDynamicOrKinematic = false; ///< When this body is created as static, this setting tells the system to create a MotionProperties object so that the object can be switched to kinematic or dynamic
  70. bool mIsSensor = false; ///< If this body is a sensor. A sensor will receive collision callbacks, but will not cause any collision responses and can be used as a trigger volume. See description at Body::SetIsSensor.
  71. bool mUseManifoldReduction = true; ///< If this body should use manifold reduction (see description at Body::SetUseManifoldReduction)
  72. EMotionQuality mMotionQuality = EMotionQuality::Discrete; ///< Motion quality, or how well it detects collisions when it has a high velocity
  73. bool mAllowSleeping = true; ///< If this body can go to sleep or not
  74. float mFriction = 0.2f; ///< Friction of the body (dimensionless number, usually between 0 and 1, 0 = no friction, 1 = friction force equals force that presses the two bodies together)
  75. float mRestitution = 0.0f; ///< Restitution of body (dimensionless number, usually between 0 and 1, 0 = completely inelastic collision response, 1 = completely elastic collision response)
  76. float mLinearDamping = 0.05f; ///< Linear damping: dv/dt = -c * v. c must be between 0 and 1 but is usually close to 0.
  77. float mAngularDamping = 0.05f; ///< Angular damping: dw/dt = -c * w. c must be between 0 and 1 but is usually close to 0.
  78. float mMaxLinearVelocity = 500.0f; ///< Maximum linear velocity that this body can reach (m/s)
  79. float mMaxAngularVelocity = 0.25f * JPH_PI * 60.0f; ///< Maximum angular velocity that this body can reach (rad/s)
  80. float mGravityFactor = 1.0f; ///< Value to multiply gravity with for this body
  81. ///@name Mass properties of the body (by default calculated by the shape)
  82. EOverrideMassProperties mOverrideMassProperties = EOverrideMassProperties::CalculateMassAndInertia; ///< Determines how mMassPropertiesOverride will be used
  83. float mInertiaMultiplier = 1.0f; ///< When calculating the inertia (not when it is provided) the calculated inertia will be multiplied by this value
  84. MassProperties mMassPropertiesOverride; ///< Contains replacement mass settings which override the automatically calculated values
  85. private:
  86. /// Collision volume for the body
  87. RefConst<ShapeSettings> mShape; ///< Shape settings, can be serialized. Mutually exclusive with mShapePtr
  88. RefConst<Shape> mShapePtr; ///< Actual shape, cannot be serialized. Mutually exclusive with mShape
  89. };
  90. JPH_NAMESPACE_END