Jolt Physics
A multi core friendly Game Physics Engine
Loading...
Searching...
No Matches
Constraint.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
9#include <Jolt/Core/Result.h>
11
13
14class BodyID;
15class IslandBuilder;
17class BodyManager;
18class StateRecorder;
19class StreamIn;
20class StreamOut;
21#ifdef JPH_DEBUG_RENDERER
22class DebugRenderer;
23#endif // JPH_DEBUG_RENDERER
24
31
55
62
105
107class JPH_EXPORT Constraint : public RefTarget<Constraint>, public NonCopyable
108{
109public:
111
113 explicit Constraint(const ConstraintSettings &inSettings) :
114#ifdef JPH_DEBUG_RENDERER
116#endif // JPH_DEBUG_RENDERER
117 mConstraintPriority(inSettings.mConstraintPriority),
118 mNumVelocityStepsOverride(uint8(inSettings.mNumVelocityStepsOverride)),
119 mNumPositionStepsOverride(uint8(inSettings.mNumPositionStepsOverride)),
120 mEnabled(inSettings.mEnabled),
121 mUserData(inSettings.mUserData)
122 {
123 JPH_ASSERT(inSettings.mNumVelocityStepsOverride < 256);
124 JPH_ASSERT(inSettings.mNumPositionStepsOverride < 256);
125 }
126
128 virtual ~Constraint() = default;
129
132
134 virtual EConstraintSubType GetSubType() const = 0;
135
138 uint32 GetConstraintPriority() const { return mConstraintPriority; }
139 void SetConstraintPriority(uint32 inPriority) { mConstraintPriority = inPriority; }
140
142 void SetNumVelocityStepsOverride(uint inN) { JPH_ASSERT(inN < 256); mNumVelocityStepsOverride = uint8(inN); }
143 uint GetNumVelocityStepsOverride() const { return mNumVelocityStepsOverride; }
144
146 void SetNumPositionStepsOverride(uint inN) { JPH_ASSERT(inN < 256); mNumPositionStepsOverride = uint8(inN); }
147 uint GetNumPositionStepsOverride() const { return mNumPositionStepsOverride; }
148
153 void SetEnabled(bool inEnabled) { mEnabled = inEnabled; }
154
156 bool GetEnabled() const { return mEnabled; }
157
159 uint64 GetUserData() const { return mUserData; }
160 void SetUserData(uint64 inUserData) { mUserData = inUserData; }
161
166 virtual void NotifyShapeChanged(const BodyID &inBodyID, Vec3Arg inDeltaCOM) = 0;
167
172 virtual void ResetWarmStart() = 0;
173
176 virtual bool IsActive() const { return mEnabled; }
177 virtual void SetupVelocityConstraint(float inDeltaTime) = 0;
178 virtual void WarmStartVelocityConstraint(float inWarmStartImpulseRatio) = 0;
179 virtual bool SolveVelocityConstraint(float inDeltaTime) = 0;
180 virtual bool SolvePositionConstraint(float inDeltaTime, float inBaumgarte) = 0;
182
184 virtual void BuildIslands(uint32 inConstraintIndex, IslandBuilder &ioBuilder, BodyManager &inBodyManager) = 0;
185
187 virtual uint BuildIslandSplits(LargeIslandSplitter &ioSplitter) const = 0;
188
189#ifdef JPH_DEBUG_RENDERER
190 // Drawing interface
191 virtual void DrawConstraint(DebugRenderer *inRenderer) const = 0;
192 virtual void DrawConstraintLimits([[maybe_unused]] DebugRenderer *inRenderer) const { }
193 virtual void DrawConstraintReferenceFrame([[maybe_unused]] DebugRenderer *inRenderer) const { }
194
197 void SetDrawConstraintSize(float inSize) { mDrawConstraintSize = inSize; }
198#endif // JPH_DEBUG_RENDERER
199
201 virtual void SaveState(StateRecorder &inStream) const;
202
204 virtual void RestoreState(StateRecorder &inStream);
205
208
209protected:
211 void ToConstraintSettings(ConstraintSettings &outSettings) const;
212
213#ifdef JPH_DEBUG_RENDERER
216#endif // JPH_DEBUG_RENDERER
217
218private:
219 friend class ConstraintManager;
220
222 static constexpr uint32 cInvalidConstraintIndex = 0xffffffff;
223
225 uint32 mConstraintIndex = cInvalidConstraintIndex;
226
228 uint32 mConstraintPriority = 0;
229
231 uint8 mNumVelocityStepsOverride = 0;
232
234 uint8 mNumPositionStepsOverride = 0;
235
237 bool mEnabled = true;
238
240 uint64 mUserData;
241};
242
EConstraintType
Enum to identify constraint type.
Definition Constraint.h:27
@ Constraint
Definition Constraint.h:28
EConstraintSpace
Certain constraints support setting them up in local or world space. This governs what is used.
Definition Constraint.h:58
@ LocalToBodyCOM
All constraint properties are specified in local space to center of mass of the bodies that are being...
Definition Constraint.h:59
@ WorldSpace
All constraint properties are specified in world space.
Definition Constraint.h:60
EConstraintSubType
Enum to identify constraint sub type.
Definition Constraint.h:34
@ Distance
Definition Constraint.h:39
@ Hinge
Definition Constraint.h:37
@ Point
Definition Constraint.h:36
@ Slider
Definition Constraint.h:38
@ Fixed
Definition Constraint.h:35
@ SwingTwist
Definition Constraint.h:41
@ User4
Definition Constraint.h:53
@ User1
User defined constraint types start here.
Definition Constraint.h:50
@ RackAndPinion
Definition Constraint.h:45
@ User2
Definition Constraint.h:51
@ Path
Definition Constraint.h:43
@ Pulley
Definition Constraint.h:47
@ SixDOF
Definition Constraint.h:42
@ Cone
Definition Constraint.h:40
@ Vehicle
Definition Constraint.h:44
@ User3
Definition Constraint.h:52
@ Gear
Definition Constraint.h:46
std::uint8_t uint8
Definition Core.h:501
#define JPH_EXPORT
Definition Core.h:275
std::uint64_t uint64
Definition Core.h:504
unsigned int uint
Definition Core.h:500
#define JPH_NAMESPACE_END
Definition Core.h:425
std::uint32_t uint32
Definition Core.h:503
#define JPH_NAMESPACE_BEGIN
Definition Core.h:419
#define JPH_ASSERT(...)
Definition IssueReporting.h:33
const Vec3 Vec3Arg
Definition MathTypes.h:19
#define JPH_OVERRIDE_NEW_DELETE
Macro to override the new and delete functions.
Definition Memory.h:50
#define JPH_DECLARE_SERIALIZABLE_VIRTUAL(linkage, class_name)
Definition SerializableObject.h:109
ID of a body. This is a way of reasoning about bodies in a multithreaded simulation while avoiding ra...
Definition BodyID.h:13
Definition BodyManager.h:47
Base class for all physics constraints. A constraint removes one or more degrees of freedom for a rig...
Definition Constraint.h:108
virtual ~Constraint()=default
Virtual destructor.
virtual void SetupVelocityConstraint(float inDeltaTime)=0
virtual bool IsActive() const
Definition Constraint.h:176
virtual Ref< ConstraintSettings > GetConstraintSettings() const =0
Debug function to convert a constraint to its settings, note that this will not save to which bodies ...
bool GetEnabled() const
Test if a constraint is enabled.
Definition Constraint.h:156
void SetUserData(uint64 inUserData)
Definition Constraint.h:160
virtual bool SolveVelocityConstraint(float inDeltaTime)=0
virtual void NotifyShapeChanged(const BodyID &inBodyID, Vec3Arg inDeltaCOM)=0
void SetConstraintPriority(uint32 inPriority)
Definition Constraint.h:139
void SetNumVelocityStepsOverride(uint inN)
Used only when the constraint is active. Override for the number of solver velocity iterations to run...
Definition Constraint.h:142
uint64 GetUserData() const
Access to the user data, can be used for anything by the application.
Definition Constraint.h:159
virtual void DrawConstraintLimits(DebugRenderer *inRenderer) const
Definition Constraint.h:192
uint GetNumVelocityStepsOverride() const
Definition Constraint.h:143
virtual EConstraintSubType GetSubType() const =0
Get the sub type of a constraint.
virtual uint BuildIslandSplits(LargeIslandSplitter &ioSplitter) const =0
Link bodies that are connected by this constraint in the same split. Returns the split index.
uint32 GetConstraintPriority() const
Definition Constraint.h:138
virtual EConstraintType GetType() const
Get the type of a constraint.
Definition Constraint.h:131
float GetDrawConstraintSize() const
Size of constraint when drawing it through the debug renderer.
Definition Constraint.h:196
void SetNumPositionStepsOverride(uint inN)
Used only when the constraint is active. Override for the number of solver position iterations to run...
Definition Constraint.h:146
virtual void DrawConstraintReferenceFrame(DebugRenderer *inRenderer) const
Definition Constraint.h:193
void ToConstraintSettings(ConstraintSettings &outSettings) const
Helper function to copy settings back to constraint settings for this base class.
Definition Constraint.cpp:61
void SetEnabled(bool inEnabled)
Definition Constraint.h:153
virtual void WarmStartVelocityConstraint(float inWarmStartImpulseRatio)=0
virtual void DrawConstraint(DebugRenderer *inRenderer) const =0
friend class ConstraintManager
Definition Constraint.h:219
uint GetNumPositionStepsOverride() const
Definition Constraint.h:147
virtual bool SolvePositionConstraint(float inDeltaTime, float inBaumgarte)=0
JPH_OVERRIDE_NEW_DELETE Constraint(const ConstraintSettings &inSettings)
Constructor.
Definition Constraint.h:113
void SetDrawConstraintSize(float inSize)
Definition Constraint.h:197
float mDrawConstraintSize
Size of constraint when drawing it through the debug renderer.
Definition Constraint.h:215
virtual void BuildIslands(uint32 inConstraintIndex, IslandBuilder &ioBuilder, BodyManager &inBodyManager)=0
Link bodies that are connected by this constraint in the island builder.
virtual void ResetWarmStart()=0
Class used to store the configuration of a constraint. Allows run-time creation of constraints.
Definition Constraint.h:65
static ConstraintResult sRestoreFromBinaryState(StreamIn &inStream)
Creates a constraint of the correct type and restores its contents from the binary stream inStream.
Definition Constraint.cpp:46
bool mEnabled
If this constraint is enabled initially. Use Constraint::SetEnabled to toggle after creation.
Definition Constraint.h:78
virtual void SaveBinaryState(StreamOut &inStream) const
Saves the contents of the constraint settings in binary form to inStream.
Definition Constraint.cpp:26
ConstraintSettings(const ConstraintSettings &)=default
uint64 mUserData
User data value (can be used by application).
Definition Constraint.h:94
uint mNumPositionStepsOverride
Used only when the constraint is active. Override for the number of solver position iterations to run...
Definition Constraint.h:88
virtual void RestoreBinaryState(StreamIn &inStream)
This function should not be called directly, it is used by sRestoreFromBinaryState.
Definition Constraint.cpp:36
ConstraintSettings()=default
Don't allow (copy) constructing this base class, but allow derived classes to (copy) construct themse...
uint32 mConstraintPriority
Definition Constraint.h:82
Result< Ref< ConstraintSettings > > ConstraintResult
Definition Constraint.h:69
float mDrawConstraintSize
Size of constraint when drawing it through the debug renderer.
Definition Constraint.h:91
uint mNumVelocityStepsOverride
Used only when the constraint is active. Override for the number of solver velocity iterations to run...
Definition Constraint.h:85
Definition DebugRenderer.h:47
Keeps track of connected bodies and builds islands for multithreaded velocity/position update.
Definition IslandBuilder.h:19
Definition LargeIslandSplitter.h:27
NonCopyable()=default
Definition Reference.h:107
Helper class that either contains a valid result or an error.
Definition Result.h:12
SerializableObject()=default
Don't allow (copy) constructing this base class, but allow derived classes to (copy) construct themse...
SerializableObject & operator=(const SerializableObject &)=default
Definition StateRecorder.h:110
Simple binary input stream.
Definition StreamIn.h:13
Simple binary output stream.
Definition StreamOut.h:13
Base class for all constraints that involve 2 bodies. Body1 is usually considered the parent,...
Definition TwoBodyConstraint.h:27