Jolt Physics
A multi core friendly Game Physics Engine
Loading...
Searching...
No Matches
MotionProperties.h
Go to the documentation of this file.
1// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
2// SPDX-FileCopyrightText: 2021 Jorrit Rouwe
3// SPDX-License-Identifier: MIT
4
5#pragma once
6
15
17
18class StateRecorder;
19
21enum class ECanSleep
22{
23 CannotSleep = 0,
24 CanSleep = 1,
25};
26
29{
30public:
32
34 EMotionQuality GetMotionQuality() const { return mMotionQuality; }
35
37 inline EAllowedDOFs GetAllowedDOFs() const { return mAllowedDOFs; }
38
40 inline bool GetAllowSleeping() const { return mAllowSleeping; }
41
43 inline Vec3 GetLinearVelocity() const { JPH_ASSERT(BodyAccess::sCheckRights(BodyAccess::sVelocityAccess(), BodyAccess::EAccess::Read)); return mLinearVelocity; }
44
48 void SetLinearVelocity(Vec3Arg inLinearVelocity) { JPH_ASSERT(BodyAccess::sCheckRights(BodyAccess::sVelocityAccess(), BodyAccess::EAccess::ReadWrite)); JPH_ASSERT(inLinearVelocity.Length() <= mMaxLinearVelocity); mLinearVelocity = LockTranslation(inLinearVelocity); }
49
53 void SetLinearVelocityClamped(Vec3Arg inLinearVelocity) { mLinearVelocity = LockTranslation(inLinearVelocity); ClampLinearVelocity(); }
54
56 inline Vec3 GetAngularVelocity() const { JPH_ASSERT(BodyAccess::sCheckRights(BodyAccess::sVelocityAccess(), BodyAccess::EAccess::Read)); return mAngularVelocity; }
57
61 void SetAngularVelocity(Vec3Arg inAngularVelocity) { JPH_ASSERT(BodyAccess::sCheckRights(BodyAccess::sVelocityAccess(), BodyAccess::EAccess::ReadWrite)); JPH_ASSERT(inAngularVelocity.Length() <= mMaxAngularVelocity); mAngularVelocity = LockAngular(inAngularVelocity); }
62
66 void SetAngularVelocityClamped(Vec3Arg inAngularVelocity) { mAngularVelocity = LockAngular(inAngularVelocity); ClampAngularVelocity(); }
67
71 inline void MoveKinematic(Vec3Arg inDeltaPosition, QuatArg inDeltaRotation, float inDeltaTime);
72
75
77 inline float GetMaxLinearVelocity() const { return mMaxLinearVelocity; }
78 inline void SetMaxLinearVelocity(float inLinearVelocity) { JPH_ASSERT(inLinearVelocity >= 0.0f); mMaxLinearVelocity = inLinearVelocity; }
79
81 inline float GetMaxAngularVelocity() const { return mMaxAngularVelocity; }
82 inline void SetMaxAngularVelocity(float inAngularVelocity) { JPH_ASSERT(inAngularVelocity >= 0.0f); mMaxAngularVelocity = inAngularVelocity; }
84
86 inline void ClampLinearVelocity();
87 inline void ClampAngularVelocity();
88
90 inline float GetLinearDamping() const { return mLinearDamping; }
91 void SetLinearDamping(float inLinearDamping) { JPH_ASSERT(inLinearDamping >= 0.0f); mLinearDamping = inLinearDamping; }
92
94 inline float GetAngularDamping() const { return mAngularDamping; }
95 void SetAngularDamping(float inAngularDamping) { JPH_ASSERT(inAngularDamping >= 0.0f); mAngularDamping = inAngularDamping; }
96
98 inline float GetGravityFactor() const { return mGravityFactor; }
99 void SetGravityFactor(float inGravityFactor) { mGravityFactor = inGravityFactor; }
100
102 void SetMassProperties(EAllowedDOFs inAllowedDOFs, const MassProperties &inMassProperties);
103
105 inline float GetInverseMass() const { JPH_ASSERT(mCachedMotionType == EMotionType::Dynamic); return mInvMass; }
106 inline float GetInverseMassUnchecked() const { return mInvMass; }
107
112 void SetInverseMass(float inInverseMass) { mInvMass = inInverseMass; }
113
115 inline Vec3 GetInverseInertiaDiagonal() const { JPH_ASSERT(mCachedMotionType == EMotionType::Dynamic); return mInvInertiaDiagonal; }
116
118 inline Quat GetInertiaRotation() const { return mInertiaRotation; }
119
124 void SetInverseInertia(Vec3Arg inDiagonal, QuatArg inRot) { mInvInertiaDiagonal = inDiagonal; mInertiaRotation = inRot; }
125
128 void ScaleToMass(float inMass);
129
131 inline Mat44 GetLocalSpaceInverseInertia() const;
132
134 inline Mat44 GetLocalSpaceInverseInertiaUnchecked() const;
135
137 inline Mat44 GetInverseInertiaForRotation(Mat44Arg inRotation) const;
138
140 JPH_INLINE Vec3 MultiplyWorldSpaceInverseInertiaByVector(QuatArg inBodyRotation, Vec3Arg inV) const;
141
143 JPH_INLINE Vec3 GetPointVelocityCOM(Vec3Arg inPointRelativeToCOM) const { return mLinearVelocity + mAngularVelocity.Cross(inPointRelativeToCOM); }
144
145 // Get the total amount of force applied to the center of mass this time step (through Body::AddForce calls). Note that it will reset to zero after PhysicsSystem::Update.
146 JPH_INLINE Vec3 GetAccumulatedForce() const { return Vec3::sLoadFloat3Unsafe(mForce); }
147
148 // Get the total amount of torque applied to the center of mass this time step (through Body::AddForce/Body::AddTorque calls). Note that it will reset to zero after PhysicsSystem::Update.
149 JPH_INLINE Vec3 GetAccumulatedTorque() const { return Vec3::sLoadFloat3Unsafe(mTorque); }
150
151 // Reset the total accumulated force, note that this will be done automatically after every time step.
152 JPH_INLINE void ResetForce() { mForce = Float3(0, 0, 0); }
153
154 // Reset the total accumulated torque, note that this will be done automatically after every time step.
155 JPH_INLINE void ResetTorque() { mTorque = Float3(0, 0, 0); }
156
157 // Reset the current velocity and accumulated force and torque.
158 JPH_INLINE void ResetMotion()
159 {
160 JPH_ASSERT(BodyAccess::sCheckRights(BodyAccess::sVelocityAccess(), BodyAccess::EAccess::ReadWrite));
161 mLinearVelocity = mAngularVelocity = Vec3::sZero();
162 mForce = mTorque = Float3(0, 0, 0);
163 }
164
171
173 JPH_INLINE Vec3 LockTranslation(Vec3Arg inV) const
174 {
175 return Vec3::sAnd(inV, Vec3(GetLinearDOFsMask().ReinterpretAsFloat()));
176 }
177
184
186 JPH_INLINE Vec3 LockAngular(Vec3Arg inV) const
187 {
188 return Vec3::sAnd(inV, Vec3(GetAngularDOFsMask().ReinterpretAsFloat()));
189 }
190
192 void SetNumVelocityStepsOverride(uint inN) { JPH_ASSERT(inN < 256); mNumVelocityStepsOverride = uint8(inN); }
193 uint GetNumVelocityStepsOverride() const { return mNumVelocityStepsOverride; }
194
196 void SetNumPositionStepsOverride(uint inN) { JPH_ASSERT(inN < 256); mNumPositionStepsOverride = uint8(inN); }
197 uint GetNumPositionStepsOverride() const { return mNumPositionStepsOverride; }
198
199#ifdef JPH_TRACK_SIMULATION_STATS
201 struct SimulationStats
202 {
203 void Reset() { mBroadPhaseTicks = 0; mNarrowPhaseTicks.store(0, memory_order_relaxed); mVelocityConstraintTicks = 0; mPositionConstraintTicks = 0; mUpdateBoundsTicks = 0; mCCDTicks.store(0, memory_order_relaxed); mNumContactConstraints.store(0, memory_order_relaxed); mNumCollisionSteps = 0; mNumVelocitySteps = 0; mNumPositionSteps = 0; mIsLargeIsland = false; }
204
205 uint64 mBroadPhaseTicks = 0;
206 atomic<uint64> mNarrowPhaseTicks = 0;
207 uint64 mVelocityConstraintTicks = 0;
208 uint64 mPositionConstraintTicks = 0;
209 uint64 mUpdateBoundsTicks = 0;
210 atomic<uint64> mCCDTicks = 0;
211 atomic<uint32> mNumContactConstraints = 0;
212 uint8 mNumCollisionSteps = 0;
213 uint8 mNumVelocitySteps = 0;
214 uint8 mNumPositionSteps = 0;
215 bool mIsLargeIsland = false;
216 };
217
218 const SimulationStats & GetSimulationStats() const { return mSimulationStats; }
219 SimulationStats & GetSimulationStats() { return mSimulationStats; }
220#endif // JPH_TRACK_SIMULATION_STATS
221
223 // FUNCTIONS BELOW THIS LINE ARE FOR INTERNAL USE ONLY
225
228 inline void ApplyLinearVelocityStep(Vec3Arg inLinearVelocity)
229 {
230 JPH_DET_LOG("ApplyLinearVelocityStep: " << inLinearVelocity);
231 JPH_ASSERT(BodyAccess::sCheckRights(BodyAccess::sVelocityAccess(), BodyAccess::EAccess::ReadWrite));
232 JPH_ASSERT(mCachedMotionType == EMotionType::Dynamic);
233 JPH_ASSERT(!inLinearVelocity.IsNaN());
234 mLinearVelocity = LockTranslation(inLinearVelocity);
235 }
236 inline void AddLinearVelocityStep(Vec3Arg inLinearVelocityChange) { ApplyLinearVelocityStep(mLinearVelocity + inLinearVelocityChange); }
237 inline void SubLinearVelocityStep(Vec3Arg inLinearVelocityChange) { ApplyLinearVelocityStep(mLinearVelocity - inLinearVelocityChange); }
238
239 inline void ApplyAngularVelocityStep(Vec3Arg inAngularVelocity)
240 {
241 JPH_DET_LOG("ApplyAngularVelocityStep: " << inAngularVelocity);
242 JPH_ASSERT(BodyAccess::sCheckRights(BodyAccess::sVelocityAccess(), BodyAccess::EAccess::ReadWrite));
243 JPH_ASSERT(mCachedMotionType == EMotionType::Dynamic);
244 JPH_ASSERT(!inAngularVelocity.IsNaN());
245 mAngularVelocity = inAngularVelocity;
246 }
247 inline void AddAngularVelocityStep(Vec3Arg inAngularVelocityChange) { ApplyAngularVelocityStep(mAngularVelocity + inAngularVelocityChange); }
248 inline void SubAngularVelocityStep(Vec3Arg inAngularVelocityChange) { ApplyAngularVelocityStep(mAngularVelocity - inAngularVelocityChange); }
250
252 inline void ApplyGyroscopicForceInternal(QuatArg inBodyRotation, float inDeltaTime);
253
255 inline void ApplyForceTorqueAndDragInternal(QuatArg inBodyRotation, Vec3Arg inGravity, float inDeltaTime);
256
258 uint32 GetIslandIndexInternal() const { return mIslandIndex; }
259 void SetIslandIndexInternal(uint32 inIndex) { mIslandIndex = inIndex; }
260
262 uint32 GetIndexInActiveBodiesInternal() const { return mIndexInActiveBodies; }
263
264#ifdef JPH_DOUBLE_PRECISION
265 inline DVec3 GetSleepTestOffset() const { return DVec3::sLoadDouble3Unsafe(mSleepTestOffset); }
266#endif // JPH_DOUBLE_PRECISION
267
269 inline void ResetSleepTestSpheres(const RVec3 *inPoints);
270
272 inline void ResetSleepTestTimer() { mSleepTestTimer = 0.0f; }
273
275 inline ECanSleep AccumulateSleepTime(float inDeltaTime, float inTimeBeforeSleep);
276
278 void SaveState(StateRecorder &inStream) const;
279
281 void RestoreState(StateRecorder &inStream);
282
283 static constexpr uint32 cInactiveIndex = uint32(-1);
284
285private:
286 friend class BodyManager;
287 friend class Body;
288
289 // 1st cache line
290 // 16 byte aligned
291 Vec3 mLinearVelocity { Vec3::sZero() };
292 Vec3 mAngularVelocity { Vec3::sZero() };
293 Vec3 mInvInertiaDiagonal;
294 Quat mInertiaRotation;
295
296 // 2nd cache line
297 // 4 byte aligned
298 Float3 mForce { 0, 0, 0 };
299 Float3 mTorque { 0, 0, 0 };
300 float mInvMass;
301 float mLinearDamping;
302 float mAngularDamping;
303 float mMaxLinearVelocity;
304 float mMaxAngularVelocity;
305 float mGravityFactor;
306 uint32 mIndexInActiveBodies = cInactiveIndex;
307 uint32 mIslandIndex = cInactiveIndex;
308
309 // 1 byte aligned
310 EMotionQuality mMotionQuality;
311 bool mAllowSleeping;
312 EAllowedDOFs mAllowedDOFs = EAllowedDOFs::All;
313 uint8 mNumVelocityStepsOverride = 0;
314 uint8 mNumPositionStepsOverride = 0;
315
316 // 3rd cache line (least frequently used)
317 // 4 byte aligned (or 8 byte if running in double precision)
318#ifdef JPH_DOUBLE_PRECISION
319 Double3 mSleepTestOffset;
320#endif // JPH_DOUBLE_PRECISION
321 Sphere mSleepTestSpheres[3];
322 float mSleepTestTimer;
323
324#ifdef JPH_ENABLE_ASSERTS
325 EBodyType mCachedBodyType;
326 EMotionType mCachedMotionType;
327#endif
328
329#ifdef JPH_TRACK_SIMULATION_STATS
330 SimulationStats mSimulationStats;
331#endif // JPH_TRACK_SIMULATION_STATS
332};
333
335
336#include "MotionProperties.inl"
EAllowedDOFs
Enum used in BodyCreationSettings and MotionProperties to indicate which degrees of freedom a body ha...
Definition AllowedDOFs.h:11
@ RotationX
Body can rotate around world space X axis.
@ TranslationY
Body can move in world space Y axis.
@ RotationY
Body can rotate around world space Y axis.
@ TranslationZ
Body can move in world space Z axis.
@ All
All degrees of freedom are allowed.
@ TranslationX
Body can move in world space X axis.
@ RotationZ
Body can rotate around world space Z axis.
EBodyType
Type of body.
Definition BodyType.h:11
std::uint8_t uint8
Definition Core.h:547
#define JPH_EXPORT
Definition Core.h:286
std::uint64_t uint64
Definition Core.h:551
unsigned int uint
Definition Core.h:546
#define JPH_NAMESPACE_END
Definition Core.h:469
std::uint32_t uint32
Definition Core.h:549
#define JPH_NAMESPACE_BEGIN
Definition Core.h:463
#define JPH_DET_LOG(...)
Definition DeterminismLog.h:177
#define JPH_ASSERT(...)
Definition IssueReporting.h:33
#define JPH_OVERRIDE_NEW_DELETE
Macro to override the new and delete functions.
Definition Memory.h:50
ECanSleep
Enum that determines if an object can go to sleep.
Definition MotionProperties.h:22
@ CanSleep
Object can go to sleep.
@ CannotSleep
Object cannot go to sleep.
EMotionQuality
Motion quality, or how well it detects collisions when it has a high velocity.
Definition MotionQuality.h:11
EMotionType
Motion type of a physics body.
Definition MotionType.h:11
@ Dynamic
Responds to forces as a normal physics object.
Definition Body.h:39
Definition BodyManager.h:47
Definition DVec3.h:14
static JPH_INLINE DVec3 sLoadDouble3Unsafe(const Double3 &inV)
Load 3 doubles from memory (reads 64 bits extra which it doesn't use)
Definition DVec3.inl:188
Class that holds 3 doubles. Used as a storage class. Convert to DVec3 for calculations.
Definition Double3.h:13
Class that holds 3 floats. Used as a storage class. Convert to Vec3 for calculations.
Definition Float3.h:13
Describes the mass and inertia properties of a body. Used during body construction only.
Definition MassProperties.h:16
Holds a 4x4 matrix of floats, but supports also operations on the 3x3 upper left part of the matrix.
Definition Mat44.h:13
The Body class only keeps track of state for static bodies, the MotionProperties class keeps the addi...
Definition MotionProperties.h:29
void SetLinearVelocity(Vec3Arg inLinearVelocity)
Definition MotionProperties.h:48
uint32 GetIslandIndexInternal() const
Access to the island index.
Definition MotionProperties.h:258
void SetNumVelocityStepsOverride(uint inN)
Used only when this body is dynamic and colliding. Override for the number of solver velocity iterati...
Definition MotionProperties.h:192
void SetAngularVelocityClamped(Vec3Arg inAngularVelocity)
Definition MotionProperties.h:66
Quat GetInertiaRotation() const
Rotation (R) that takes inverse inertia diagonal to local space: .
Definition MotionProperties.h:118
float GetMaxLinearVelocity() const
Maximum linear velocity that a body can achieve. Used to prevent the system from exploding.
Definition MotionProperties.h:77
JPH_INLINE Vec3 GetPointVelocityCOM(Vec3Arg inPointRelativeToCOM) const
Velocity of point inPoint (in center of mass space, e.g. on the surface of the body) of the body (uni...
Definition MotionProperties.h:143
Vec3 GetInverseInertiaDiagonal() const
Diagonal of inverse inertia matrix: D. Should only be called on a dynamic object (static or kinematic...
Definition MotionProperties.h:115
void ApplyAngularVelocityStep(Vec3Arg inAngularVelocity)
Definition MotionProperties.h:239
uint GetNumPositionStepsOverride() const
Definition MotionProperties.h:197
void SetInverseInertia(Vec3Arg inDiagonal, QuatArg inRot)
Definition MotionProperties.h:124
float GetGravityFactor() const
Get gravity factor (1 = normal gravity, 0 = no gravity)
Definition MotionProperties.h:98
void AddLinearVelocityStep(Vec3Arg inLinearVelocityChange)
Definition MotionProperties.h:236
float GetMaxAngularVelocity() const
Maximum angular velocity that a body can achieve. Used to prevent the system from exploding.
Definition MotionProperties.h:81
void SetLinearVelocityClamped(Vec3Arg inLinearVelocity)
Definition MotionProperties.h:53
uint GetNumVelocityStepsOverride() const
Definition MotionProperties.h:193
float GetInverseMassUnchecked() const
Definition MotionProperties.h:106
Vec3 GetLinearVelocity() const
Get world space linear velocity of the center of mass.
Definition MotionProperties.h:43
Vec3 GetAngularVelocity() const
Get world space angular velocity of the center of mass.
Definition MotionProperties.h:56
void SetMaxAngularVelocity(float inAngularVelocity)
Definition MotionProperties.h:82
JPH_INLINE Vec3 LockAngular(Vec3Arg inV) const
Takes an angular velocity / torque vector inV and returns a vector where the components that are not ...
Definition MotionProperties.h:186
JPH_INLINE void ResetMotion()
Definition MotionProperties.h:158
JPH_INLINE Vec3 GetAccumulatedTorque() const
Definition MotionProperties.h:149
void SetIslandIndexInternal(uint32 inIndex)
Definition MotionProperties.h:259
float GetAngularDamping() const
Get angular damping: dw/dt = -c * w. c. Value should be zero or positive and is usually close to 0.
Definition MotionProperties.h:94
void SubLinearVelocityStep(Vec3Arg inLinearVelocityChange)
Definition MotionProperties.h:237
float GetInverseMass() const
Get inverse mass (1 / mass). Should only be called on a dynamic object (static or kinematic bodies ha...
Definition MotionProperties.h:105
void SetGravityFactor(float inGravityFactor)
Definition MotionProperties.h:99
JPH_INLINE UVec4 GetLinearDOFsMask() const
Returns a vector where the linear components that are not allowed by mAllowedDOFs are set to 0 and th...
Definition MotionProperties.h:166
uint32 GetIndexInActiveBodiesInternal() const
Access to the index in the active bodies array.
Definition MotionProperties.h:262
float GetLinearDamping() const
Get linear damping: dv/dt = -c * v. c. Value should be zero or positive and is usually close to 0.
Definition MotionProperties.h:90
void SubAngularVelocityStep(Vec3Arg inAngularVelocityChange)
Definition MotionProperties.h:248
JPH_INLINE void ResetForce()
Definition MotionProperties.h:152
void SetInverseMass(float inInverseMass)
Definition MotionProperties.h:112
void ResetSleepTestTimer()
Reset the sleep test timer without resetting the sleep test spheres.
Definition MotionProperties.h:272
void SetAngularVelocity(Vec3Arg inAngularVelocity)
Definition MotionProperties.h:61
void ApplyLinearVelocityStep(Vec3Arg inLinearVelocity)
Definition MotionProperties.h:228
JPH_INLINE Vec3 GetAccumulatedForce() const
Definition MotionProperties.h:146
JPH_INLINE Vec3 LockTranslation(Vec3Arg inV) const
Takes a translation vector inV and returns a vector where the components that are not allowed by mAll...
Definition MotionProperties.h:173
void SetMaxLinearVelocity(float inLinearVelocity)
Definition MotionProperties.h:78
JPH_OVERRIDE_NEW_DELETE EMotionQuality GetMotionQuality() const
Motion quality, or how well it detects collisions when it has a high velocity.
Definition MotionProperties.h:34
void SetLinearDamping(float inLinearDamping)
Definition MotionProperties.h:91
void SetAngularDamping(float inAngularDamping)
Definition MotionProperties.h:95
JPH_INLINE UVec4 GetAngularDOFsMask() const
Returns a vector where the angular components that are not allowed by mAllowedDOFs are set to 0 and t...
Definition MotionProperties.h:179
void SetNumPositionStepsOverride(uint inN)
Used only when this body is dynamic and colliding. Override for the number of solver position iterati...
Definition MotionProperties.h:196
EAllowedDOFs GetAllowedDOFs() const
Get the allowed degrees of freedom that this body has (this can be changed by calling SetMassProperti...
Definition MotionProperties.h:37
bool GetAllowSleeping() const
If this body can go to sleep.
Definition MotionProperties.h:40
void AddAngularVelocityStep(Vec3Arg inAngularVelocityChange)
Definition MotionProperties.h:247
JPH_INLINE void ResetTorque()
Definition MotionProperties.h:155
Definition Quat.h:33
Definition Sphere.h:12
Definition StateRecorder.h:110
Definition UVec4.h:12
static JPH_INLINE UVec4 sReplicate(uint32 inV)
Replicate int inV across all components.
Definition UVec4.inl:75
static JPH_INLINE UVec4 sAnd(UVec4Arg inV1, UVec4Arg inV2)
Logical and (component wise)
Definition UVec4.inl:292
static JPH_INLINE UVec4 sEquals(UVec4Arg inV1, UVec4Arg inV2)
Equals (component wise)
Definition UVec4.inl:198
Definition Vec3.h:17
JPH_INLINE Vec3 Cross(Vec3Arg inV2) const
Cross product.
Definition Vec3.inl:855
JPH_INLINE float Length() const
Length of vector.
Definition Vec3.inl:951
static JPH_INLINE Vec3 sAnd(Vec3Arg inV1, Vec3Arg inV2)
Logical and (component wise)
Definition Vec3.inl:447
static JPH_INLINE Vec3 sZero()
Vector with all zeros.
Definition Vec3.inl:125
JPH_INLINE bool IsNaN() const
Test if vector contains NaN elements.
Definition Vec3.inl:1035
static JPH_INLINE Vec3 sLoadFloat3Unsafe(const Float3 &inV)
Load 3 floats from memory (reads 32 bits extra which it doesn't use)
Definition Vec3.inl:167