Jolt Physics
A multi core friendly Game Physics Engine
Loading...
Searching...
No Matches
SoftBodySharedSettings.h
Go to the documentation of this file.
1// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
2// SPDX-FileCopyrightText: 2023 Jorrit Rouwe
3// SPDX-License-Identifier: MIT
4
5#pragma once
6
10
12
15class JPH_EXPORT SoftBodySharedSettings : public RefTarget<SoftBodySharedSettings>
16{
18
19public:
21 enum class EBendType
22 {
23 None,
24 Distance,
25 Dihedral,
26 };
27
29 enum class ELRAType
30 {
31 None,
32 EuclideanDistance,
33 GeodesicDistance,
34 };
35
40 {
42 VertexAttributes() = default;
43 VertexAttributes(float inCompliance, float inShearCompliance, float inBendCompliance, ELRAType inLRAType = ELRAType::None, float inLRAMaxDistanceMultiplier = 1.0f) : mCompliance(inCompliance), mShearCompliance(inShearCompliance), mBendCompliance(inBendCompliance), mLRAType(inLRAType), mLRAMaxDistanceMultiplier(inLRAMaxDistanceMultiplier) { }
44
45 float mCompliance = 0.0f;
46 float mShearCompliance = 0.0f;
47 float mBendCompliance = FLT_MAX;
48 ELRAType mLRAType = ELRAType::None;
49 float mLRAMaxDistanceMultiplier = 1.0f;
50 };
51
57 void CreateConstraints(const VertexAttributes *inVertexAttributes, uint inVertexAttributesLength, EBendType inBendType = EBendType::Distance, float inAngleTolerance = DegreesToRadians(8.0f));
58
60 void CalculateEdgeLengths();
61
64 void CalculateRodProperties();
65
68 void CalculateLRALengths(float inMaxDistanceMultiplier = 1.0f);
69
71 void CalculateBendConstraintConstants();
72
74 void CalculateVolumeConstraintVolumes();
75
77 void CalculateSkinnedConstraintNormals();
78
91
93 void Optimize(OptimizationResults &outResults);
94
96 void Optimize() { OptimizationResults results; Optimize(results); }
97
99 Ref<SoftBodySharedSettings> Clone() const;
100
102 void SaveBinaryState(StreamOut &inStream) const;
103
105 void RestoreBinaryState(StreamIn &inStream);
106
111
113 void SaveWithMaterials(StreamOut &inStream, SharedSettingsToIDMap &ioSettingsMap, MaterialToIDMap &ioMaterialMap) const;
114
116
118 static SettingsResult sRestoreWithMaterials(StreamIn &inStream, IDToSharedSettingsMap &ioSettingsMap, IDToMaterialMap &ioMaterialMap);
119
124 static Ref<SoftBodySharedSettings> sCreateCube(uint inGridSize, float inGridSpacing);
125
128 {
130
131
132 Vertex() = default;
133 Vertex(const Float3 &inPosition, const Float3 &inVelocity = Float3(0, 0, 0), float inInvMass = 1.0f) : mPosition(inPosition), mVelocity(inVelocity), mInvMass(inInvMass) { }
134
135 Float3 mPosition { 0, 0, 0 };
136 Float3 mVelocity { 0, 0, 0 };
137 float mInvMass = 1.0f;
138 };
139
142 {
144
145
146 Face() = default;
147 Face(uint32 inVertex1, uint32 inVertex2, uint32 inVertex3, uint32 inMaterialIndex = 0) : mVertex { inVertex1, inVertex2, inVertex3 }, mMaterialIndex(inMaterialIndex) { }
148
150 bool IsDegenerate() const { return mVertex[0] == mVertex[1] || mVertex[0] == mVertex[2] || mVertex[1] == mVertex[2]; }
151
152 uint32 mVertex[3];
153 uint32 mMaterialIndex = 0;
154 };
155
158 {
160
161
162 Edge() = default;
163 Edge(uint32 inVertex1, uint32 inVertex2, float inCompliance = 0.0f) : mVertex { inVertex1, inVertex2 }, mCompliance(inCompliance) { }
164
166 uint32 GetMinVertexIndex() const { return min(mVertex[0], mVertex[1]); }
167
168 uint32 mVertex[2];
169 float mRestLength = 1.0f;
170 float mCompliance = 0.0f;
171 };
172
192 {
194
195
196 DihedralBend() = default;
197 DihedralBend(uint32 inVertex1, uint32 inVertex2, uint32 inVertex3, uint32 inVertex4, float inCompliance = 0.0f) : mVertex { inVertex1, inVertex2, inVertex3, inVertex4 }, mCompliance(inCompliance) { }
198
200 uint32 GetMinVertexIndex() const { return min(min(mVertex[0], mVertex[1]), min(mVertex[2], mVertex[3])); }
201
202 uint32 mVertex[4];
203 float mCompliance = 0.0f;
204 float mInitialAngle = 0.0f;
205 };
206
209 {
211
212
213 Volume() = default;
214 Volume(uint32 inVertex1, uint32 inVertex2, uint32 inVertex3, uint32 inVertex4, float inCompliance = 0.0f) : mVertex { inVertex1, inVertex2, inVertex3, inVertex4 }, mCompliance(inCompliance) { }
215
217 uint32 GetMinVertexIndex() const { return min(min(mVertex[0], mVertex[1]), min(mVertex[2], mVertex[3])); }
218
219 uint32 mVertex[4];
220 float mSixRestVolume = 1.0f;
221 float mCompliance = 0.0f;
222 };
223
226 {
228
229 public:
231 InvBind() = default;
232 InvBind(uint32 inJointIndex, Mat44Arg inInvBind) : mJointIndex(inJointIndex), mInvBind(inInvBind) { }
233
234 uint32 mJointIndex = 0;
235 Mat44 mInvBind = Mat44::sIdentity();
236 };
237
240 {
242
243 public:
245 SkinWeight() = default;
246 SkinWeight(uint32 inInvBindIndex, float inWeight) : mInvBindIndex(inInvBindIndex), mWeight(inWeight) { }
247
248 uint32 mInvBindIndex = 0;
249 float mWeight = 0.0f;
250 };
251
254 {
256
257 public:
259 Skinned() = default;
260 Skinned(uint32 inVertex, float inMaxDistance, float inBackStopDistance, float inBackStopRadius) : mVertex(inVertex), mMaxDistance(inMaxDistance), mBackStopDistance(inBackStopDistance), mBackStopRadius(inBackStopRadius) { }
261
264 {
265 // Get the total weight
266 float total = 0.0f;
267 for (const SkinWeight &w : mWeights)
268 total += w.mWeight;
269
270 // Normalize
271 if (total > 0.0f)
272 for (SkinWeight &w : mWeights)
273 w.mWeight /= total;
274 }
275
277 static constexpr uint cMaxSkinWeights = 4;
278
279 uint32 mVertex = 0;
280 SkinWeight mWeights[cMaxSkinWeights];
281 float mMaxDistance = FLT_MAX;
282 float mBackStopDistance = FLT_MAX;
283 float mBackStopRadius = 40.0f;
284 uint32 mNormalInfo = 0;
285 };
286
290 {
292
293 public:
295 LRA() = default;
296 LRA(uint32 inVertex1, uint32 inVertex2, float inMaxDistance) : mVertex { inVertex1, inVertex2 }, mMaxDistance(inMaxDistance) { }
297
299 uint32 GetMinVertexIndex() const { return min(mVertex[0], mVertex[1]); }
300
301 uint32 mVertex[2];
302 float mMaxDistance = 0.0f;
303 };
304
313 {
315
316
317 RodStretchShear() = default;
318 RodStretchShear(uint32 inVertex1, uint32 inVertex2, float inCompliance = 0.0f) : mVertex { inVertex1, inVertex2 }, mCompliance(inCompliance) { }
319
321 uint32 GetMinVertexIndex() const { return min(mVertex[0], mVertex[1]); }
322
323 uint32 mVertex[2];
324 float mLength = 1.0f;
325 float mInvMass = 1.0f;
326 float mCompliance = 0.0f;
327 Quat mBishop = Quat::sZero();
328 };
329
332 {
334
335
336 RodBendTwist() = default;
337 RodBendTwist(uint32 inRod1, uint32 inRod2, float inCompliance = 0.0f) : mRod { inRod1, inRod2 }, mCompliance(inCompliance) { }
338
339 uint32 mRod[2];
340 float mCompliance = 0.0f;
341 Quat mOmega0 = Quat::sZero();
342 };
343
345 void AddFace(const Face &inFace) { JPH_ASSERT(!inFace.IsDegenerate()); mFaces.push_back(inFace); }
346
358 float mVertexRadius = 0.0f;
359
360private:
362
364 void CalculateClosestKinematic();
365
367 struct ClosestKinematic
368 {
369 uint32 mVertex = 0xffffffff;
370 float mDistance = FLT_MAX;
371 };
372
374 struct UpdateGroup
375 {
376 uint mEdgeEndIndex;
377 uint mLRAEndIndex;
378 uint mRodStretchShearEndIndex;
379 uint mRodBendTwistEndIndex;
380 uint mDihedralBendEndIndex;
381 uint mVolumeEndIndex;
382 uint mSkinnedEndIndex;
383 };
384
385 Array<ClosestKinematic> mClosestKinematic;
386 Array<UpdateGroup> mUpdateGroups;
387 Array<uint32> mSkinnedConstraintNormals;
388};
389
@ None
No degrees of freedom are allowed. Note that this is not valid and will crash. Use a static body inst...
#define JPH_EXPORT
Definition Core.h:275
unsigned int uint
Definition Core.h:487
#define JPH_NAMESPACE_END
Definition Core.h:419
std::uint32_t uint32
Definition Core.h:490
#define JPH_NAMESPACE_BEGIN
Definition Core.h:413
#define JPH_ASSERT(...)
Definition IssueReporting.h:33
JPH_INLINE constexpr float DegreesToRadians(float inV)
Convert a value from degrees to radians.
Definition Math.h:16
#define JPH_DECLARE_SERIALIZABLE_NON_VIRTUAL(linkage, class_name)
Definition SerializableObject.h:80
Definition Array.h:36
Class that holds 3 floats. Used as a storage class. Convert to Vec3 for calculations.
Definition Float3.h:13
Holds a 4x4 matrix of floats, but supports also operations on the 3x3 upper left part of the matrix.
Definition Mat44.h:13
static JPH_INLINE Mat44 sIdentity()
Identity matrix.
Definition Mat44.inl:35
static RefConst< PhysicsMaterial > sDefault
Default material that is used when a shape has no materials defined.
Definition PhysicsMaterial.h:31
Definition Quat.h:33
static JPH_INLINE Quat sZero()
Definition Quat.h:100
Definition Reference.h:107
Definition Reference.h:35
Helper class that either contains a valid result or an error.
Definition Result.h:12
This class contains the runtime information of a soft body.
Definition SoftBodyMotionProperties.h:35
An inverse bind matrix take a skinned vertex from its bind pose into joint local space.
Definition SoftBodySharedSettings.h:226
InvBind()=default
Constructor.
InvBind(uint32 inJointIndex, Mat44Arg inInvBind)
Definition SoftBodySharedSettings.h:232
Definition SoftBodySharedSettings.h:290
uint32 GetMinVertexIndex() const
Return the lowest vertex index of this constraint.
Definition SoftBodySharedSettings.h:299
LRA()=default
Constructor.
LRA(uint32 inVertex1, uint32 inVertex2, float inMaxDistance)
Definition SoftBodySharedSettings.h:296
Information about the optimization of the soft body, the indices of certain elements may have changed...
Definition SoftBodySharedSettings.h:81
Array< uint > mLRARemap
Maps old LRA index to new LRA index.
Definition SoftBodySharedSettings.h:84
Array< uint > mRodStretchShearConstraintRemap
Maps old rod stretch shear constraint index to new stretch shear rod constraint index.
Definition SoftBodySharedSettings.h:85
Array< uint > mVolumeRemap
Maps old volume constraint index to new volume constraint index.
Definition SoftBodySharedSettings.h:88
Array< uint > mDihedralBendRemap
Maps old dihedral bend index to new dihedral bend index.
Definition SoftBodySharedSettings.h:87
Array< uint > mSkinnedRemap
Maps old skinned constraint index to new skinned constraint index.
Definition SoftBodySharedSettings.h:89
Array< uint > mEdgeRemap
Maps old edge index to new edge index.
Definition SoftBodySharedSettings.h:83
Array< uint > mRodBendTwistConstraintRemap
Maps old rod bend twist constraint index to new bend twist rod constraint index.
Definition SoftBodySharedSettings.h:86
A joint and its skin weight.
Definition SoftBodySharedSettings.h:240
SkinWeight()=default
Constructor.
SkinWeight(uint32 inInvBindIndex, float inWeight)
Definition SoftBodySharedSettings.h:246
A constraint that skins a vertex to joints and limits the distance that the simulated vertex can trav...
Definition SoftBodySharedSettings.h:254
void NormalizeWeights()
Normalize the weights so that they add up to 1.
Definition SoftBodySharedSettings.h:263
Skinned()=default
Constructor.
Skinned(uint32 inVertex, float inMaxDistance, float inBackStopDistance, float inBackStopRadius)
Definition SoftBodySharedSettings.h:260
Definition SoftBodySharedSettings.h:16
Array< RodStretchShear > mRodStretchShearConstraints
The list of Cosserat rod constraints that connect two vertices and that limit stretch and shear.
Definition SoftBodySharedSettings.h:355
Array< Vertex > mVertices
The list of vertices or particles of the body.
Definition SoftBodySharedSettings.h:347
ELRAType
The type of long range attachment constraint to create.
Definition SoftBodySharedSettings.h:30
Array< LRA > mLRAConstraints
The list of long range attachment constraints.
Definition SoftBodySharedSettings.h:354
EBendType
Which type of bend constraint should be created.
Definition SoftBodySharedSettings.h:22
Array< RodBendTwist > mRodBendTwistConstraints
The list of Cosserat rod constraints that connect two rods and limit the bend and twist.
Definition SoftBodySharedSettings.h:356
Array< Skinned > mSkinnedConstraints
The list of vertices that are constrained to a skinned vertex.
Definition SoftBodySharedSettings.h:352
void Optimize()
Optimize the soft body settings without results.
Definition SoftBodySharedSettings.h:96
Array< Face > mFaces
The list of faces of the body.
Definition SoftBodySharedSettings.h:348
Array< DihedralBend > mDihedralBendConstraints
The list of dihedral bend constraints of the body.
Definition SoftBodySharedSettings.h:350
Array< Volume > mVolumeConstraints
The list of volume constraints of the body that keep the volume of tetrahedra in the soft body consta...
Definition SoftBodySharedSettings.h:351
Array< Edge > mEdgeConstraints
The list of edges or springs of the body.
Definition SoftBodySharedSettings.h:349
Array< InvBind > mInvBindMatrices
The list of inverse bind matrices for skinning vertices.
Definition SoftBodySharedSettings.h:353
void AddFace(const Face &inFace)
Add a face to this soft body.
Definition SoftBodySharedSettings.h:345
Simple binary input stream.
Definition StreamIn.h:13
Simple binary output stream.
Definition StreamOut.h:13
Definition UnorderedMap.h:30
Definition SoftBodySharedSettings.h:192
uint32 GetMinVertexIndex() const
Return the lowest vertex index of this constraint.
Definition SoftBodySharedSettings.h:200
An edge keeps two vertices at a constant distance using a spring: |x1 - x2| = rest length.
Definition SoftBodySharedSettings.h:158
uint32 GetMinVertexIndex() const
Return the lowest vertex index of this constraint.
Definition SoftBodySharedSettings.h:166
A face defines the surface of the body.
Definition SoftBodySharedSettings.h:142
bool IsDegenerate() const
Check if this is a degenerate face (a face which points to the same vertex twice)
Definition SoftBodySharedSettings.h:150
A constraint that connects two Cosserat rods and limits bend and twist between the rods.
Definition SoftBodySharedSettings.h:332
Definition SoftBodySharedSettings.h:313
uint32 GetMinVertexIndex() const
Return the lowest vertex index of this constraint.
Definition SoftBodySharedSettings.h:321
Definition SoftBodySharedSettings.h:40
VertexAttributes(float inCompliance, float inShearCompliance, float inBendCompliance, ELRAType inLRAType=ELRAType::None, float inLRAMaxDistanceMultiplier=1.0f)
Definition SoftBodySharedSettings.h:43
A vertex is a particle, the data in this structure is only used during creation of the soft body and ...
Definition SoftBodySharedSettings.h:128
Volume constraint, keeps the volume of a tetrahedron constant.
Definition SoftBodySharedSettings.h:209
uint32 GetMinVertexIndex() const
Return the lowest vertex index of this constraint.
Definition SoftBodySharedSettings.h:217