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{
67
68public:
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 uint mNumVelocityStepsOverride = 0;
86
88 uint mNumPositionStepsOverride = 0;
89
91 float mDrawConstraintSize = 1.0f;
92
94 uint64 mUserData = 0;
95
96protected:
98 ConstraintSettings() = default;
101
103 virtual void RestoreBinaryState(StreamIn &inStream);
104};
105
107class JPH_EXPORT Constraint : public RefTarget<Constraint>, public NonCopyable
108{
109public:
111
113 explicit Constraint(const ConstraintSettings &inSettings) :
114#ifdef JPH_DEBUG_RENDERER
115 mDrawConstraintSize(inSettings.mDrawConstraintSize),
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
196 float GetDrawConstraintSize() const { return mDrawConstraintSize; }
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
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.
std::uint8_t uint8
Definition Core.h:493
#define JPH_EXPORT
Definition Core.h:275
std::uint64_t uint64
Definition Core.h:496
unsigned int uint
Definition Core.h:492
#define JPH_NAMESPACE_END
Definition Core.h:419
std::uint32_t uint32
Definition Core.h:495
#define JPH_NAMESPACE_BEGIN
Definition Core.h:413
#define JPH_ASSERT(...)
Definition IssueReporting.h:33
#define JPH_OVERRIDE_NEW_DELETE
Macro to override the new and delete functions.
Definition Memory.h:43
#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
Class that contains all bodies.
Definition BodyManager.h:44
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 SetEnabled(bool inEnabled)
Definition Constraint.h:153
virtual void WarmStartVelocityConstraint(float inWarmStartImpulseRatio)=0
virtual void DrawConstraint(DebugRenderer *inRenderer) const =0
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
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
ConstraintSettings(const ConstraintSettings &)=default
uint mNumPositionStepsOverride
Used only when the constraint is active. Override for the number of solver position iterations to run...
Definition Constraint.h:88
ConstraintSettings()=default
Don't allow (copy) constructing this base class, but allow derived classes to (copy) construct themse...
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:25
Class that makes another class non-copyable. Usage: Inherit from NonCopyable.
Definition NonCopyable.h:11
Definition Reference.h:107
Definition Reference.h:35
Helper class that either contains a valid result or an error.
Definition Result.h:12
Definition SerializableObject.h:156
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
Definition Vec3.h:17