Jolt Physics
A multi core friendly Game Physics Engine
Loading...
Searching...
No Matches
Ragdoll.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
8#include <Jolt/Core/Result.h>
14
16
17class Ragdoll;
18class PhysicsSystem;
19
21class JPH_EXPORT RagdollSettings : public RefTarget<RagdollSettings>
22{
24
25public:
28 bool Stabilize();
29
33 void CalculateConstraintPriorities(uint32 inBasePriority = 0);
34
47 void DisableParentChildCollisions(const Mat44 *inJointMatrices = nullptr, float inMinSeparationDistance = 0.0f);
48
53 void SaveBinaryState(StreamOut &inStream, bool inSaveShapes, bool inSaveGroupFilter) const;
54
56
58 static RagdollResult sRestoreFromBinaryState(StreamIn &inStream);
59
62 Ragdoll * CreateRagdoll(CollisionGroup::GroupID inCollisionGroup, uint64 inUserData, PhysicsSystem *inSystem) const;
63
65 const Skeleton * GetSkeleton() const { return mSkeleton; }
66 Skeleton * GetSkeleton() { return mSkeleton; }
67
69 void CalculateBodyIndexToConstraintIndex();
70
73 const Array<int> & GetBodyIndexToConstraintIndex() const { return mBodyIndexToConstraintIndex; }
74
76 int GetConstraintIndexForBodyIndex(int inBodyIndex) const { return mBodyIndexToConstraintIndex[inBodyIndex]; }
77
79 void CalculateConstraintIndexToBodyIdxPair();
80
81 using BodyIdxPair = std::pair<int, int>;
82
84 const Array<BodyIdxPair> & GetConstraintIndexToBodyIdxPair() const { return mConstraintIndexToBodyIdxPair; }
85
87 BodyIdxPair GetBodyIndicesForConstraintIndex(int inConstraintIndex) const { return mConstraintIndexToBodyIdxPair[inConstraintIndex]; }
88
97
100
103 {
105
106 public:
109 AdditionalConstraint(int inBodyIdx1, int inBodyIdx2, TwoBodyConstraintSettings *inConstraint) : mBodyIdx { inBodyIdx1, inBodyIdx2 }, mConstraint(inConstraint) { }
110
111 int mBodyIdx[2];
113 };
114
117
120
123
126
127private:
129 Array<int> mBodyIndexToConstraintIndex;
130
132 Array<BodyIdxPair> mConstraintIndexToBodyIdxPair;
133};
134
136class JPH_EXPORT Ragdoll : public RefTarget<Ragdoll>, public NonCopyable
137{
138public:
140
142 explicit Ragdoll(PhysicsSystem *inSystem) : mSystem(inSystem) { }
143
145 ~Ragdoll();
146
148 void AddToPhysicsSystem(EActivation inActivationMode, bool inLockBodies = true);
149
151 void RemoveFromPhysicsSystem(bool inLockBodies = true);
152
154 void Activate(bool inLockBodies = true);
155
160 bool IsActive(bool inLockBodies = true) const;
161
163 void SetGroupID(CollisionGroup::GroupID inGroupID, bool inLockBodies = true);
164
166 void SetPose(const SkeletonPose &inPose, bool inLockBodies = true);
167
169 void SetPose(RVec3Arg inRootOffset, const Mat44 *inJointMatrices, bool inLockBodies = true);
170
172 void GetPose(SkeletonPose &outPose, bool inLockBodies = true);
173
175 void GetPose(RVec3 &outRootOffset, Mat44 *outJointMatrices, bool inLockBodies = true);
176
178 void ResetWarmStart();
179
181 void DriveToPoseUsingKinematics(const SkeletonPose &inPose, float inDeltaTime, bool inLockBodies = true);
182
184 void DriveToPoseUsingKinematics(RVec3Arg inRootOffset, const Mat44 *inJointMatrices, float inDeltaTime, bool inLockBodies = true);
185
187 void DriveToPoseUsingMotors(const SkeletonPose &inPose);
188
190 void SetLinearAndAngularVelocity(Vec3Arg inLinearVelocity, Vec3Arg inAngularVelocity, bool inLockBodies = true);
191
193 void SetLinearVelocity(Vec3Arg inLinearVelocity, bool inLockBodies = true);
194
196 void AddLinearVelocity(Vec3Arg inLinearVelocity, bool inLockBodies = true);
197
199 void AddImpulse(Vec3Arg inImpulse, bool inLockBodies = true);
200
202 void GetRootTransform(RVec3 &outPosition, Quat &outRotation, bool inLockBodies = true) const;
203
205 size_t GetBodyCount() const { return mBodyIDs.size(); }
206
208 BodyID GetBodyID(int inBodyIndex) const { return mBodyIDs[inBodyIndex]; }
209
211 const Array<BodyID> & GetBodyIDs() const { return mBodyIDs; }
212
214 size_t GetConstraintCount() const { return mConstraints.size(); }
215
217 TwoBodyConstraint * GetConstraint(int inConstraintIndex) { return mConstraints[inConstraintIndex]; }
218
220 const TwoBodyConstraint * GetConstraint(int inConstraintIndex) const { return mConstraints[inConstraintIndex]; }
221
223 AABox GetWorldSpaceBounds(bool inLockBodies = true) const;
224
226 const RagdollSettings * GetRagdollSettings() const { return mRagdollSettings; }
227
228private:
230 friend class RagdollSettings;
231
233 RefConst<RagdollSettings> mRagdollSettings;
234
236 Array<BodyID> mBodyIDs;
237
239 Array<Ref<TwoBodyConstraint>> mConstraints;
240
242 PhysicsSystem * mSystem;
243};
244
#define JPH_EXPORT
Definition Core.h:275
std::uint64_t uint64
Definition Core.h:497
#define JPH_NAMESPACE_END
Definition Core.h:419
std::uint32_t uint32
Definition Core.h:496
#define JPH_NAMESPACE_BEGIN
Definition Core.h:413
EActivation
Enum used by AddBody to determine if the body needs to be initially active.
Definition EActivation.h:11
@ Activate
Activate the body, making it part of the simulation.
#define JPH_OVERRIDE_NEW_DELETE
Macro to override the new and delete functions.
Definition Memory.h:43
#define JPH_DECLARE_SERIALIZABLE_NON_VIRTUAL(linkage, class_name)
Definition SerializableObject.h:80
Axis aligned box.
Definition AABox.h:16
Definition Array.h:36
Settings for constructing a rigid body.
Definition BodyCreationSettings.h:31
ID of a body. This is a way of reasoning about bodies in a multithreaded simulation while avoiding ra...
Definition BodyID.h:13
uint32 GroupID
Definition CollisionGroup.h:24
Holds a 4x4 matrix of floats, but supports also operations on the 3x3 upper left part of the matrix.
Definition Mat44.h:13
Class that makes another class non-copyable. Usage: Inherit from NonCopyable.
Definition NonCopyable.h:11
Definition PhysicsSystem.h:30
Definition Quat.h:33
Runtime ragdoll information.
Definition Ragdoll.h:137
const TwoBodyConstraint * GetConstraint(int inConstraintIndex) const
Access a constraint by index.
Definition Ragdoll.h:220
size_t GetConstraintCount() const
Get number of constraints in the ragdoll.
Definition Ragdoll.h:214
size_t GetBodyCount() const
Get number of bodies in the ragdoll.
Definition Ragdoll.h:205
TwoBodyConstraint * GetConstraint(int inConstraintIndex)
Access a constraint by index.
Definition Ragdoll.h:217
const Array< BodyID > & GetBodyIDs() const
Access to the array of body IDs.
Definition Ragdoll.h:211
JPH_OVERRIDE_NEW_DELETE Ragdoll(PhysicsSystem *inSystem)
Constructor.
Definition Ragdoll.h:142
BodyID GetBodyID(int inBodyIndex) const
Access a body ID.
Definition Ragdoll.h:208
const RagdollSettings * GetRagdollSettings() const
Get the settings object that created this ragdoll.
Definition Ragdoll.h:226
A constraint that connects two bodies in a ragdoll (for non parent child related constraints)
Definition Ragdoll.h:103
AdditionalConstraint()=default
Constructors.
Ref< TwoBodyConstraintSettings > mConstraint
The constraint that connects these bodies.
Definition Ragdoll.h:112
AdditionalConstraint(int inBodyIdx1, int inBodyIdx2, TwoBodyConstraintSettings *inConstraint)
Definition Ragdoll.h:109
A single rigid body sub part of the ragdoll.
Definition Ragdoll.h:91
Ref< TwoBodyConstraintSettings > mToParent
Definition Ragdoll.h:95
Contains the structure of a ragdoll.
Definition Ragdoll.h:22
const Array< int > & GetBodyIndexToConstraintIndex() const
Definition Ragdoll.h:73
std::pair< int, int > BodyIdxPair
Definition Ragdoll.h:81
Skeleton * GetSkeleton()
Definition Ragdoll.h:66
int GetConstraintIndexForBodyIndex(int inBodyIndex) const
Map a single body index to a constraint index.
Definition Ragdoll.h:76
const Skeleton * GetSkeleton() const
Access to the skeleton of this ragdoll.
Definition Ragdoll.h:65
const Array< BodyIdxPair > & GetConstraintIndexToBodyIdxPair() const
Table that maps a constraint index (index in mConstraints) to the indices of the bodies that the cons...
Definition Ragdoll.h:84
AdditionalConstraintVector mAdditionalConstraints
A list of constraints that connects two bodies in a ragdoll (for non parent child related constraints...
Definition Ragdoll.h:125
BodyIdxPair GetBodyIndicesForConstraintIndex(int inConstraintIndex) const
Map a single constraint index (index in mConstraints) to the indices of the bodies that the constrain...
Definition Ragdoll.h:87
PartVector mParts
For each of the joints, the body and constraint attaching it to its parent body (1-on-1 with mSkeleto...
Definition Ragdoll.h:122
Ref< Skeleton > mSkeleton
The skeleton for this ragdoll.
Definition Ragdoll.h:119
Definition Reference.h:163
Definition Reference.h:107
Definition Reference.h:35
Helper class that either contains a valid result or an error.
Definition Result.h:12
Resource that contains the joint hierarchy for a skeleton.
Definition Skeleton.h:18
Instance of a skeleton, contains the pose the current skeleton is in.
Definition SkeletonPose.h:18
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
Base class for settings for all constraints that involve 2 bodies.
Definition TwoBodyConstraint.h:16
Definition Vec3.h:17