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
27{
30};
31
34{
35 Fixed,
36 Point,
37 Hinge,
38 Slider,
40 Cone,
42 SixDOF,
43 Path,
44 Vehicle,
46 Gear,
47 Pulley,
48
50 User1,
51 User2,
52 User3,
53 User4
54};
55
58{
61};
62
64class JPH_EXPORT ConstraintSettings : public SerializableObject, public RefTarget<ConstraintSettings>
65{
66public:
68
70
72 virtual void SaveBinaryState(StreamOut &inStream) const;
73
75 static ConstraintResult sRestoreFromBinaryState(StreamIn &inStream);
76
78 bool mEnabled = true;
79
82 uint32 mConstraintPriority = 0;
83
85 int mNumVelocityStepsOverride = 0;
86
88 int mNumPositionStepsOverride = 0;
89
91 float mDrawConstraintSize = 1.0f;
92
94 uint64 mUserData = 0;
95
96protected:
98 virtual void RestoreBinaryState(StreamIn &inStream);
99};
100
103{
104public:
106
108 explicit Constraint(const ConstraintSettings &inSettings) :
109#ifdef JPH_DEBUG_RENDERER
110 mDrawConstraintSize(inSettings.mDrawConstraintSize),
111#endif // JPH_DEBUG_RENDERER
112 mConstraintPriority(inSettings.mConstraintPriority),
113 mNumVelocityStepsOverride(inSettings.mNumVelocityStepsOverride),
114 mNumPositionStepsOverride(inSettings.mNumPositionStepsOverride),
115 mEnabled(inSettings.mEnabled),
116 mUserData(inSettings.mUserData)
117 {
118 }
119
121 virtual ~Constraint() = default;
122
124 virtual EConstraintType GetType() const { return EConstraintType::Constraint; }
125
127 virtual EConstraintSubType GetSubType() const = 0;
128
131 uint32 GetConstraintPriority() const { return mConstraintPriority; }
132 void SetConstraintPriority(uint32 inPriority) { mConstraintPriority = inPriority; }
133
135 void SetNumVelocityStepsOverride(int inN) { mNumVelocityStepsOverride = inN; }
136 int GetNumVelocityStepsOverride() const { return mNumVelocityStepsOverride; }
137
139 void SetNumPositionStepsOverride(int inN) { mNumPositionStepsOverride = inN; }
140 int GetNumPositionStepsOverride() const { return mNumPositionStepsOverride; }
141
146 void SetEnabled(bool inEnabled) { mEnabled = inEnabled; }
147
149 bool GetEnabled() const { return mEnabled; }
150
152 uint64 GetUserData() const { return mUserData; }
153 void SetUserData(uint64 inUserData) { mUserData = inUserData; }
154
159 virtual void NotifyShapeChanged(const BodyID &inBodyID, Vec3Arg inDeltaCOM) = 0;
160
163 virtual bool IsActive() const { return mEnabled; }
164 virtual void SetupVelocityConstraint(float inDeltaTime) = 0;
165 virtual void WarmStartVelocityConstraint(float inWarmStartImpulseRatio) = 0;
166 virtual bool SolveVelocityConstraint(float inDeltaTime) = 0;
167 virtual bool SolvePositionConstraint(float inDeltaTime, float inBaumgarte) = 0;
169
171 virtual void BuildIslands(uint32 inConstraintIndex, IslandBuilder &ioBuilder, BodyManager &inBodyManager) = 0;
172
174 virtual uint BuildIslandSplits(LargeIslandSplitter &ioSplitter) const = 0;
175
176#ifdef JPH_DEBUG_RENDERER
177 // Drawing interface
178 virtual void DrawConstraint(DebugRenderer *inRenderer) const = 0;
179 virtual void DrawConstraintLimits([[maybe_unused]] DebugRenderer *inRenderer) const { }
180 virtual void DrawConstraintReferenceFrame([[maybe_unused]] DebugRenderer *inRenderer) const { }
181
183 float GetDrawConstraintSize() const { return mDrawConstraintSize; }
184 void SetDrawConstraintSize(float inSize) { mDrawConstraintSize = inSize; }
185#endif // JPH_DEBUG_RENDERER
186
188 virtual void SaveState(StateRecorder &inStream) const;
189
191 virtual void RestoreState(StateRecorder &inStream);
192
195
196protected:
198 void ToConstraintSettings(ConstraintSettings &outSettings) const;
199
200#ifdef JPH_DEBUG_RENDERER
203#endif // JPH_DEBUG_RENDERER
204
205private:
206 friend class ConstraintManager;
207
209 static constexpr uint32 cInvalidConstraintIndex = 0xffffffff;
210
212 uint32 mConstraintIndex = cInvalidConstraintIndex;
213
215 uint32 mConstraintPriority = 0;
216
218 int mNumVelocityStepsOverride = 0;
219
221 int mNumPositionStepsOverride = 0;
222
224 bool mEnabled = true;
225
227 uint64 mUserData;
228};
229
EConstraintType
Enum to identify constraint type.
Definition: Constraint.h:27
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...
@ WorldSpace
All constraint properties are specified in world space.
EConstraintSubType
Enum to identify constraint sub type.
Definition: Constraint.h:34
@ User1
User defined constraint types start here.
#define JPH_EXPORT
Definition: Core.h:214
std::uint64_t uint64
Definition: Core.h:430
unsigned int uint
Definition: Core.h:426
#define JPH_NAMESPACE_END
Definition: Core.h:354
std::uint32_t uint32
Definition: Core.h:429
#define JPH_NAMESPACE_BEGIN
Definition: Core.h:348
#define JPH_OVERRIDE_NEW_DELETE
Macro to override the new and delete functions.
Definition: Memory.h:29
#define JPH_DECLARE_SERIALIZABLE_VIRTUAL(linkage, class_name)
Definition: SerializableObject.h:100
ID of a body. This is a way of reasoning about bodies in a multithreaded simulation while avoiding ra...
Definition: BodyID.h:13
Class that contains all bodies.
Definition: BodyManager.h:32
Base class for all physics constraints. A constraint removes one or more degrees of freedom for a rig...
Definition: Constraint.h:103
virtual ~Constraint()=default
Virtual destructor.
virtual void SetupVelocityConstraint(float inDeltaTime)=0
virtual bool IsActive() const
Definition: Constraint.h:163
int GetNumVelocityStepsOverride() const
Definition: Constraint.h:136
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:149
void SetUserData(uint64 inUserData)
Definition: Constraint.h:153
virtual bool SolveVelocityConstraint(float inDeltaTime)=0
virtual void NotifyShapeChanged(const BodyID &inBodyID, Vec3Arg inDeltaCOM)=0
void SetConstraintPriority(uint32 inPriority)
Definition: Constraint.h:132
uint64 GetUserData() const
Access to the user data, can be used for anything by the application.
Definition: Constraint.h:152
virtual void DrawConstraintLimits(DebugRenderer *inRenderer) const
Definition: Constraint.h:179
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.
void SetNumVelocityStepsOverride(int inN)
Override for the number of solver velocity iterations to run, the total amount of iterations is the m...
Definition: Constraint.h:135
uint32 GetConstraintPriority() const
Definition: Constraint.h:131
virtual EConstraintType GetType() const
Get the type of a constraint.
Definition: Constraint.h:124
float GetDrawConstraintSize() const
Size of constraint when drawing it through the debug renderer.
Definition: Constraint.h:183
void SetNumPositionStepsOverride(int inN)
Override for the number of position velocity iterations to run, the total amount of iterations is the...
Definition: Constraint.h:139
int GetNumPositionStepsOverride() const
Definition: Constraint.h:140
virtual void DrawConstraintReferenceFrame(DebugRenderer *inRenderer) const
Definition: Constraint.h:180
void SetEnabled(bool inEnabled)
Definition: Constraint.h:146
virtual void WarmStartVelocityConstraint(float inWarmStartImpulseRatio)=0
virtual void DrawConstraint(DebugRenderer *inRenderer) const =0
virtual bool SolvePositionConstraint(float inDeltaTime, float inBaumgarte)=0
JPH_OVERRIDE_NEW_DELETE Constraint(const ConstraintSettings &inSettings)
Constructor.
Definition: Constraint.h:108
void SetDrawConstraintSize(float inSize)
Definition: Constraint.h:184
float mDrawConstraintSize
Size of constraint when drawing it through the debug renderer.
Definition: Constraint.h:202
virtual void BuildIslands(uint32 inConstraintIndex, IslandBuilder &ioBuilder, BodyManager &inBodyManager)=0
Link bodies that are connected by this constraint in the island builder.
A constraint manager manages all constraints of the same type.
Definition: ConstraintManager.h:25
Class used to store the configuration of a constraint. Allows run-time creation of constraints.
Definition: Constraint.h:65
Simple triangle renderer for debugging purposes.
Definition: DebugRenderer.h:30
Keeps track of connected bodies and builds islands for multithreaded velocity/position update.
Definition: IslandBuilder.h:19
Definition: LargeIslandSplitter.h:24
Class that makes another class non-copyable. Usage: Inherit from NonCopyable.
Definition: NonCopyable.h:11
Definition: Reference.h:101
Definition: Reference.h:35
Helper class that either contains a valid result or an error.
Definition: Result.h:15
Definition: SerializableObject.h:147
Definition: StateRecorder.h:48
Simple binary input stream.
Definition: StreamIn.h:13
Simple binary output stream.
Definition: StreamOut.h:13
Definition: Vec3.h:16