44 JPH_INLINE
bool ApplyVelocityStep(
Body &ioBody1,
Body &ioBody2,
Vec3Arg inWorldSpaceAxis,
float inLambda)
const
75 JPH_INLINE
float CalculateInverseEffectiveMass(
const Body &inBody1,
Vec3Arg inR1PlusU,
const Body &inBody2,
Vec3Arg inR2,
Vec3Arg inWorldSpaceAxis)
80 float inv_effective_mass;
84 Vec3 r1_plus_u_x_axis = inR1PlusU.
Cross(inWorldSpaceAxis);
91 invi1_r1_plus_u_x_axis.
StoreFloat3(&mInvI1_R1PlusUxAxis);
93 inv_effective_mass = mp1->
GetInverseMass() + invi1_r1_plus_u_x_axis.
Dot(r1_plus_u_x_axis);
99 inv_effective_mass = 0.0f;
107 inv_effective_mass = 0.0f;
112 Vec3 r2_x_axis = inR2.
Cross(inWorldSpaceAxis);
134 return inv_effective_mass;
147 float inv_effective_mass = CalculateInverseEffectiveMass(inBody1, inR1PlusU, inBody2, inR2, inWorldSpaceAxis);
149 if (inv_effective_mass == 0.0f)
153 mEffectiveMass = 1.0f / inv_effective_mass;
171 float inv_effective_mass = CalculateInverseEffectiveMass(inBody1, inR1PlusU, inBody2, inR2, inWorldSpaceAxis);
173 if (inv_effective_mass == 0.0f)
192 float inv_effective_mass = CalculateInverseEffectiveMass(inBody1, inR1PlusU, inBody2, inR2, inWorldSpaceAxis);
194 if (inv_effective_mass == 0.0f)
203 float inv_effective_mass = CalculateInverseEffectiveMass(inBody1, inR1PlusU, inBody2, inR2, inWorldSpaceAxis);
205 if (inv_effective_mass == 0.0f)
216 mEffectiveMass = 0.0f;
223 return mEffectiveMass != 0.0f;
233 mTotalLambda *= inWarmStartImpulseRatio;
235 ApplyVelocityStep(ioBody1, ioBody2, inWorldSpaceAxis, mTotalLambda);
273 float lambda = mEffectiveMass * (jv - mSpringPart.
GetBias(mTotalLambda));
274 float new_lambda =
Clamp(mTotalLambda + lambda, inMinLambda, inMaxLambda);
275 lambda = new_lambda - mTotalLambda;
276 mTotalLambda = new_lambda;
278 return ApplyVelocityStep(ioBody1, ioBody2, inWorldSpaceAxis, lambda);
296 if (inC != 0.0f && !mSpringPart.
IsActive())
303 float lambda = -mEffectiveMass * inBaumgarte * inC;
339 inStream.
Write(mTotalLambda);
345 inStream.
Read(mTotalLambda);
351 Float3 mInvI1_R1PlusUxAxis;
353 float mEffectiveMass = 0.0f;
355 float mTotalLambda = 0.0f;
#define JPH_IF_DEBUG(...)
Definition Core.h:569
#define JPH_NAMESPACE_END
Definition Core.h:428
#define JPH_NAMESPACE_BEGIN
Definition Core.h:422
#define JPH_ASSERT(...)
Definition IssueReporting.h:33
JPH_INLINE constexpr T Clamp(T inV, T inMin, T inMax)
Clamp a value between two values.
Definition Math.h:48
@ FrequencyAndDamping
Frequency and damping are specified.
Definition AxisConstraintPart.h:42
float GetTotalLambda() const
Return lagrange multiplier.
Definition AxisConstraintPart.h:282
bool SolveVelocityConstraint(Body &ioBody1, Body &ioBody2, Vec3Arg inWorldSpaceAxis, float inMinLambda, float inMaxLambda)
Definition AxisConstraintPart.h:244
void CalculateConstraintPropertiesWithSettings(float inDeltaTime, const Body &inBody1, Vec3Arg inR1PlusU, const Body &inBody2, Vec3Arg inR2, Vec3Arg inWorldSpaceAxis, float inBias, float inC, const SpringSettings &inSpringSettings)
Selects one of the above functions based on the spring settings.
Definition AxisConstraintPart.h:201
bool SolvePositionConstraint(Body &ioBody1, Body &ioBody2, Vec3Arg inWorldSpaceAxis, float inC, float inBaumgarte) const
Definition AxisConstraintPart.h:293
bool IsActive() const
Check if constraint is active.
Definition AxisConstraintPart.h:221
void CalculateConstraintPropertiesWithFrequencyAndDamping(float inDeltaTime, const Body &inBody1, Vec3Arg inR1PlusU, const Body &inBody2, Vec3Arg inR2, Vec3Arg inWorldSpaceAxis, float inBias, float inC, float inFrequency, float inDamping)
Definition AxisConstraintPart.h:169
void WarmStart(Body &ioBody1, Body &ioBody2, Vec3Arg inWorldSpaceAxis, float inWarmStartImpulseRatio)
Definition AxisConstraintPart.h:231
void Deactivate()
Deactivate this constraint.
Definition AxisConstraintPart.h:214
void SaveState(StateRecorder &inStream) const
Save state of this constraint part.
Definition AxisConstraintPart.h:337
void CalculateConstraintPropertiesWithStiffnessAndDamping(float inDeltaTime, const Body &inBody1, Vec3Arg inR1PlusU, const Body &inBody2, Vec3Arg inR2, Vec3Arg inWorldSpaceAxis, float inBias, float inC, float inStiffness, float inDamping)
Definition AxisConstraintPart.h:190
void CalculateConstraintProperties(const Body &inBody1, Vec3Arg inR1PlusU, const Body &inBody2, Vec3Arg inR2, Vec3Arg inWorldSpaceAxis, float inBias=0.0f)
Definition AxisConstraintPart.h:145
void RestoreState(StateRecorder &inStream)
Restore state of this constraint part.
Definition AxisConstraintPart.h:343
const MotionProperties * GetMotionProperties() const
Access to the motion properties.
Definition Body.h:308
bool IsDynamic() const
Check if this body is dynamic, which means that it moves and forces can act on it.
Definition Body.h:67
void AddRotationStep(Vec3Arg inAngularVelocityTimesDeltaTime)
Update rotation using an Euler step (used during position integrate & constraint solving)
Definition Body.inl:81
void SubPositionStep(Vec3Arg inLinearVelocityTimesDeltaTime)
Definition Body.h:343
bool IsStatic() const
Check if this body is static (not movable)
Definition Body.h:61
Quat GetRotation() const
World space rotation of the body.
Definition Body.h:271
void SubRotationStep(Vec3Arg inAngularVelocityTimesDeltaTime)
Definition Body.inl:100
const MotionProperties * GetMotionPropertiesUnchecked() const
Access to the motion properties (version that does not check if the object is kinematic or dynamic)
Definition Body.h:312
void AddPositionStep(Vec3Arg inLinearVelocityTimesDeltaTime)
Update position using an Euler step (used during position integrate & constraint solving)
Definition Body.h:342
Class that holds 3 floats. Used as a storage class. Convert to Vec3 for calculations.
Definition Float3.h:13
The Body class only keeps track of state for static bodies, the MotionProperties class keeps the addi...
Definition MotionProperties.h:29
void AddLinearVelocityStep(Vec3Arg inLinearVelocityChange)
Definition MotionProperties.h:217
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:52
void SubLinearVelocityStep(Vec3Arg inLinearVelocityChange)
Definition MotionProperties.h:218
float GetInverseMass() const
Get inverse mass (1 / mass). Should only be called on a dynamic object (static or kinematic bodies ha...
Definition MotionProperties.h:95
void SubAngularVelocityStep(Vec3Arg inAngularVelocityChange)
Definition MotionProperties.h:221
JPH_INLINE Vec3 MultiplyWorldSpaceInverseInertiaByVector(QuatArg inBodyRotation, Vec3Arg inV) const
Multiply a vector with the inverse world space inertia tensor ( ). Zero if object is static or kinema...
Definition MotionProperties.inl:83
void AddAngularVelocityStep(Vec3Arg inAngularVelocityChange)
Definition MotionProperties.h:220
Class used in other constraint parts to calculate the required bias factor in the lagrange multiplier...
Definition SpringPart.h:14
void CalculateSpringPropertiesWithFrequencyAndDamping(float inDeltaTime, float inInvEffectiveMass, float inBias, float inC, float inFrequency, float inDamping, float &outEffectiveMass)
Definition SpringPart.h:86
void CalculateSpringPropertiesWithStiffnessAndDamping(float inDeltaTime, float inInvEffectiveMass, float inBias, float inC, float inStiffness, float inDamping, float &outEffectiveMass)
Definition SpringPart.h:116
float GetBias(float inTotalLambda) const
Get total bias b, including supplied bias and bias for spring: lambda = J v + b.
Definition SpringPart.h:137
void CalculateSpringPropertiesWithBias(float inBias)
Definition SpringPart.h:71
bool IsActive() const
Returns if this spring is active.
Definition SpringPart.h:131
Settings for a linear or angular spring.
Definition SpringSettings.h:23
float mStiffness
Definition SpringSettings.h:60
float mDamping
Definition SpringSettings.h:67
ESpringMode mMode
Definition SpringSettings.h:44
float mFrequency
Definition SpringSettings.h:51
Definition StateRecorder.h:110
void Read(T &outT)
Read a primitive (e.g. float, int, etc.) from the binary stream.
Definition StreamIn.h:30
void Write(const T &inT)
Write a primitive (e.g. float, int, etc.) to the binary stream.
Definition StreamOut.h:26
JPH_INLINE float Dot(Vec3Arg inV2) const
Dot product.
Definition Vec3.inl:943
JPH_INLINE Vec3 Cross(Vec3Arg inV2) const
Cross product.
Definition Vec3.inl:841
JPH_INLINE bool IsNormalized(float inTolerance=1.0e-6f) const
Test if vector is normalized.
Definition Vec3.inl:1128
JPH_INLINE void StoreFloat3(Float3 *outV) const
Store 3 floats to memory.
Definition Vec3.inl:1153
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
static JPH_INLINE Vec3 sNaN()
Vector with all NaN's.
Definition Vec3.inl:162