UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
AnalyticImplicitGroup.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "Chaos/Box.h"
5#include "Chaos/Capsule.h"
6#include "Chaos/Convex.h"
10#include "Chaos/Levelset.h"
12#include "Chaos/Sphere.h"
15
24{
25public:
63 {
64 for (Chaos::FSphere* Sphere : Spheres) if (Sphere) delete Sphere;
65 for (Chaos::TBox<Chaos::FReal, 3>* Box : Boxes) if (Box) delete Box;
66 for (Chaos::FCapsule* Capsule : Capsules) if (Capsule) delete Capsule;
67 for (Chaos::FTaperedCylinder* TaperedCylinder : TaperedCylinders) if (TaperedCylinder) delete TaperedCylinder;
69 for (Chaos::FLevelSet* LevelSet : LevelSets) if (LevelSet) delete LevelSet;
70 }
71
72 void Init(const int32 NumStructures, const bool DoCollGeom=true)
73 {
75 if (DoCollGeom)
76 {
79 }
80 }
81
83 int32 NumStructures() const { return Transforms.Num(); }
84
85 bool IsValid() { return BoneIndex != INDEX_NONE; }
86
87 const FName& GetBoneName() const { return BoneName; }
88 const int32 GetBoneIndex() const { return BoneIndex; }
89
91 const int32 GetParentBoneIndex() const { return ParentBoneIndex; }
92
94 int32 GetRigidBodyId() const { return RigidBodyId; }
95
98
102 int32 Add(const FTransform &InitialXf, Chaos::FTaperedCylinder *TaperedCylinder) { TaperedCylinders.Add(TaperedCylinder); return Transforms.Insert(InitialXf, Spheres.Num()+Boxes.Num()+Capsules.Num()+TaperedCylinders.Num()-1); }
104 int32 Add(const FTransform &InitialXf, Chaos::FLevelSet *LevelSet) { LevelSets.Add(LevelSet); return Transforms.Add(InitialXf); }
105
107 const int32 Index,
108 TArray<Chaos::FVec3>&& Points,
109 TArray<Chaos::TVec3<int32>>&& Triangles)
110 { CollisionPoints[Index] = MoveTemp(Points); CollisionTriangles[Index] = MoveTemp(Triangles); }
111
114
116 const Chaos::FReal Density,
118 {
119 // Make sure this function is being called before we've transfered ownership
120 // of our implicit shapes to the simulator.
121 checkSlow(!Spheres.Contains(nullptr) && !Boxes.Contains(nullptr) && !Capsules.Contains(nullptr) &&
122 !TaperedCylinders.Contains(nullptr) && !ConvexHulls.Contains(nullptr) && !LevelSets.Contains(nullptr));
123
124 const int32 Num = NumStructures();
128 BBoxes.SetNum(Num);
129
130 int32 TransformIndex = 0;
132 {
133 const FTransform& Xf = Transforms[TransformIndex];
134 BBoxes[TransformIndex] = Sphere->BoundingBox().TransformedAABB(Xf);
135 Chaos::FMassProperties &MP = MPArray[TransformIndex++];
136 MP.Volume = Sphere->GetVolume();
137 MP.CenterOfMass = Xf.TransformPositionNoScale(Sphere->GetCenterOfMass());
138 MP.RotationOfMass = Xf.TransformRotation(Sphere->GetRotationOfMass());
139 }
141 {
142 const FTransform& Xf = Transforms[TransformIndex];
143 BBoxes[TransformIndex] = Box->BoundingBox().TransformedAABB(Xf);
144 Chaos::FMassProperties&MP = MPArray[TransformIndex++];
145 MP.Volume = Box->GetVolume();
146 MP.CenterOfMass = Xf.TransformPositionNoScale(Box->GetCenterOfMass());
147 MP.RotationOfMass = Xf.TransformRotation(Box->GetRotationOfMass());
148 }
150 {
151 const FTransform& Xf = Transforms[TransformIndex];
152 BBoxes[TransformIndex] = Capsule->BoundingBox().TransformedAABB(Xf);
153 Chaos::FMassProperties &MP = MPArray[TransformIndex++];
154 MP.Volume = Capsule->GetVolume();
155 MP.CenterOfMass = Xf.TransformPositionNoScale(FVector3d(Capsule->GetCenterOfMassf()));
156 MP.RotationOfMass = Xf.TransformRotation(Capsule->GetRotationOfMass());
157 }
158 for (Chaos::FTaperedCylinder* TaperedCylinder : TaperedCylinders)
159 {
160 const FTransform& Xf = Transforms[TransformIndex];
161 BBoxes[TransformIndex] = TaperedCylinder->BoundingBox().TransformedAABB(Xf);
162 Chaos::FMassProperties &MP = MPArray[TransformIndex++];
163 MP.Volume = TaperedCylinder->GetVolume();
164 MP.CenterOfMass = Xf.TransformPositionNoScale(TaperedCylinder->GetCenterOfMass());
165 MP.RotationOfMass = Xf.TransformRotation(TaperedCylinder->GetRotationOfMass());
166 }
168 {
169 const FTransform& Xf = Transforms[TransformIndex];
170 BBoxes[TransformIndex] = Convex->BoundingBox().TransformedAABB(Xf);
171 Chaos::FMassProperties &MP = MPArray[TransformIndex++];
172 MP.Volume = Convex->BoundingBox().GetVolume();
173 MP.CenterOfMass = Xf.TransformPositionNoScale(Convex->BoundingBox().Center());
174 MP.RotationOfMass = Xf.TransformRotation(Convex->BoundingBox().GetRotationOfMass());
175 }
176 for (Chaos::FLevelSet* LevelSet : LevelSets)
177 {
178 const FTransform& Xf = Transforms[TransformIndex];
179 BBoxes[TransformIndex] = LevelSet->BoundingBox().TransformedAABB(Xf);
180 Chaos::FMassProperties &MP = MPArray[TransformIndex++];
181 MP.Volume = LevelSet->BoundingBox().GetVolume();
182 MP.CenterOfMass = Xf.TransformPositionNoScale(LevelSet->BoundingBox().Center());
183 MP.RotationOfMass = Xf.TransformRotation(LevelSet->BoundingBox().GetRotationOfMass());
184 }
185
186 // Find overlap and adjust volumes accordingly. We do this by determining
187 // how much their AABB's overlap for sake of speed and simplicity. Ideally
188 // we'd do something more accurate...
189 for (int32 i=0; i < Num-1; i++)
190 {
191 const Chaos::FAABB3& BoxI = BBoxes[i];
192 for (int32 j = i+1; j < Num; j++)
193 {
194 const Chaos::FAABB3& BoxJ = BBoxes[j];
195 if (BoxI.Intersects(BoxJ))
196 {
200 {
201 const Chaos::FReal VolI = BoxI.GetVolume();
202 const Chaos::FReal VolJ = BoxJ.GetVolume();
205 // Split the overlapping volume between i and j
206 MPArray[i].Volume *= static_cast<Chaos::FReal>(1.0 - PctOverlapI / 2.0);
207 MPArray[j].Volume *= static_cast<Chaos::FReal>(1.0 - PctOverlapJ / 2.0);
208 }
209 }
210 }
211 }
212
213 TotalMass = 0.f;
214 TransformIndex = 0;
216 {
217 Chaos::FMassProperties &MP = MPArray[TransformIndex++];
219 TotalMass += Mass;
220 MP.InertiaTensor = Sphere->GetInertiaTensor(Mass);
221 }
223 {
224 Chaos::FMassProperties &MP = MPArray[TransformIndex++];
226 TotalMass += Mass;
227 MP.InertiaTensor = Box->GetInertiaTensor(Mass);
228 }
230 {
231 Chaos::FMassProperties &MP = MPArray[TransformIndex++];
233 TotalMass += Mass;
234 MP.InertiaTensor = Capsule->GetInertiaTensor(Mass);
235 }
236 for (Chaos::FTaperedCylinder* TaperedCylinder : TaperedCylinders)
237 {
238 Chaos::FMassProperties &MP = MPArray[TransformIndex++];
240 TotalMass += Mass;
241 MP.InertiaTensor = TaperedCylinder->GetInertiaTensor(Mass);
242 }
244 {
245 Chaos::FMassProperties &MP = MPArray[TransformIndex++];
247 TotalMass += Mass;
248 MP.InertiaTensor = Convex->BoundingBox().GetInertiaTensor(Mass);
249 }
250 for (Chaos::FLevelSet* LevelSet : LevelSets)
251 {
252 Chaos::FMassProperties &MP = MPArray[TransformIndex++];
254 TotalMass += Mass;
255 MP.InertiaTensor = LevelSet->BoundingBox().GetInertiaTensor(Mass);
256 }
257
258 return Chaos::Combine(MPArray);
259 }
260
262 const Chaos::FReal ParticlesPerUnitArea,
263 const int32 MinParticles,
264 const int32 MaxParticles)
265 {
266 // Make sure this function is being called before we've transfered ownership
267 // of our implicit shapes to the simulator.
268 checkSlow(!Spheres.Contains(nullptr) && !Boxes.Contains(nullptr) && !Capsules.Contains(nullptr) &&
269 !TaperedCylinders.Contains(nullptr) && !ConvexHulls.Contains(nullptr) && !LevelSets.Contains(nullptr));
270
272 const int32 Num = NumStructures();
273 if (Num == 0)
274 {
276 }
277
278 int32 TransformIndex = 0;
280 {
281 TArray<Chaos::FVec3>& Points = CollisionPoints[TransformIndex];
282 if (!Points.Num())
283 Points = Sphere->ComputeSamplePoints(ParticlesPerUnitArea, MinParticles, MaxParticles);
284 CullDeepPoints(Points, TransformIndex);
285 TransformIndex++;
286 }
288 {
289 TArray<Chaos::FVec3>& Points = CollisionPoints[TransformIndex];
290 if (!Points.Num())
291 Points = Box->ComputeSamplePoints();
292 CullDeepPoints(Points, TransformIndex);
293 TransformIndex++;
294 }
296 {
297 TArray<Chaos::FVec3>& Points = CollisionPoints[TransformIndex];
298 if (!Points.Num())
299 Points = Capsule->ComputeSamplePoints(ParticlesPerUnitArea, MinParticles, MaxParticles);
300 CullDeepPoints(Points, TransformIndex);
301 TransformIndex++;
302 }
303 for (Chaos::FTaperedCylinder* TaperedCylinder : TaperedCylinders)
304 {
305 TArray<Chaos::FVec3>& Points = CollisionPoints[TransformIndex];
306 if (!Points.Num())
307 Points = TaperedCylinder->ComputeSamplePoints(ParticlesPerUnitArea, false, MinParticles, MaxParticles);
308 CullDeepPoints(Points, TransformIndex);
309 TransformIndex++;
310 }
312 {
313 TArray<Chaos::FVec3>& Points = CollisionPoints[TransformIndex];
314 if (!Points.Num())
315 {
316 const Chaos::FAABB3& BBox = Convex->BoundingBox();
317 Chaos::FSphere Sphere(BBox.Center(), BBox.Extents().Size() / 2);
318 Points = Sphere.ComputeSamplePoints(ParticlesPerUnitArea, MinParticles, MaxParticles);
320 for (Chaos::FVec3 &Pt : Points)
321 {
322 const Chaos::FReal Phi = Convex->PhiWithNormal(Pt, Normal);
323 Pt += Normal * -Phi;
324 //check(FMath::Abs(Convex->SignedDistance(Pt)) <= KINDA_SMALL_NUMBER);
325 }
326 }
327 CullDeepPoints(Points, TransformIndex);
328 TransformIndex++;
329 }
330 for (Chaos::FLevelSet* LevelSet : LevelSets)
331 {
332 TArray<Chaos::FVec3>& Points = CollisionPoints[TransformIndex];
333 if (!Points.Num())
334 {
335 const Chaos::FAABB3& BBox = LevelSet->BoundingBox();
336 Chaos::FSphere Sphere(BBox.Center(), BBox.Extents().Size() / 2);
337 Points = Sphere.ComputeSamplePoints(ParticlesPerUnitArea, MinParticles, MaxParticles);
339 for (Chaos::FVec3 &Pt : Points)
340 {
341 const Chaos::FReal Phi = LevelSet->PhiWithNormal(Pt, Normal);
342 Pt += Normal * -Phi;
343 //check(FMath::Abs(LevelSet->SignedDistance(Pt)) <= KINDA_SMALL_NUMBER);
344 }
345 }
346 CullDeepPoints(Points, TransformIndex);
347 TransformIndex++;
348 }
349
350 if (Num > 1)
351 {
352 int32 NumPoints = 0;
353 for (const auto& PtArray : CollisionPoints)
354 NumPoints += PtArray.Num();
355 ContiguousCollisionPoints.Reserve(NumPoints);
356 }
357 for (TransformIndex = 0; TransformIndex < Num; TransformIndex++)
358 {
360 const FTransform& Xf = Transforms[TransformIndex];
361 if(!Xf.Equals(FTransform::Identity))
362 {
363 for (Chaos::FVec3& Pt : PtArray)
365 }
366 if (Num == 1)
367 {
368 // Free memory we're not going to use
370 return &PtArray;
371 }
373 }
374
375 // Free memory we're not going to use
376 CollisionPoints.Empty();
378 }
379
381 {
382 int32 NumTris = 0;
384 {
385 NumTris += Tris.Num();
386 }
387
390 int32 Offset = 0;
391 for (int32 Index=0; Index < CollisionTriangles.Num(); Index++)
392 {
394 {
395 AllTriangles.Add(Tri + Offset);
396 }
397 Offset += CollisionPoints[Index].Num();
398 }
399
400 return AllTriangles;
401 }
402
409 {
410 // TODO: We make copies of implicit objects owned by this class, so we
411 // give the solver memory it can own. It'd be nice if we could transfer
412 // or share the memory this class owns to/with the solver.
413
414 const int32 Num = NumStructures();
415 if (Num == 0)
416 {
417 return nullptr;
418 }
419 else if (Num == 1)
420 {
422 {
423 return TransferImplicitObj(0);
424 }
425 else
426 {
427 // Make a copy and transfer ownership to the transformed implicit.
430 MoveTemp(ObjPtr),
432 }
433 }
434 else
435 {
436 // Make copies of the implicits owned by transformed immplicits, and
437 // transfer ownership of the transformed implicits to the implicit union.
438 TArray<Chaos::FImplicitObjectPtr> ImplicitObjects;
439 ImplicitObjects.Reserve(Num);
440 for (int i = 0; i < Num; i++)
441 {
443
444 const FTransform &Xf = Transforms[i];
445 if (Xf.Equals(FTransform::Identity))
446 {
447 // If we ever support animated substructures, we'll need all
448 // of them wrapped by a transform.
449 ImplicitObjects.Add(MoveTemp(ObjPtr));
450 }
451 else
452 {
453 ImplicitObjects.Add(
456 MoveTemp(ObjPtr),
458 }
459 }
460 return new Chaos::FImplicitObjectUnion(MoveTemp(ImplicitObjects));
461 }
462 }
463
464protected:
465 friend class FBoneHierarchy;
466
470 { return Parent; }
471
476
478 { Parent = nullptr; Children.Reset(); }
479
480 template<class TImplicitShape>
482 {
483 const Chaos::FAABB3& BBox = Shape.BoundingBox();
484 const Chaos::FReal Tolerance = -BBox.Extents().Max() / (Chaos::FReal)100.; // -1/100th the largest dimension
485 if (Xf.Equals(FTransform::Identity))
486 {
487 for (int32 i = Points.Num(); i--; )
488 {
489 const Chaos::FVec3& LocalPoint = Points[i];
490 const Chaos::FReal Phi = Shape.SignedDistance(LocalPoint);
491 if (Phi < Tolerance)
492 {
493 Points.RemoveAt(i);
494 }
495 }
496 }
497 else
498 {
499 const FTransform InvXf = Xf.Inverse();
500 for (int32 i = Points.Num(); i--; )
501 {
502 const Chaos::FVec3 LocalPoint = InvXf.TransformPosition(Points[i]);
503 const Chaos::FReal Phi = Shape.SignedDistance(LocalPoint);
504 if (Phi < Tolerance)
505 {
506 Points.RemoveAt(i);
507 }
508 }
509 }
510 }
511
513 {
514 int32 TransformIndex = 0;
516 {
517 if (TransformIndex != SkipIndex)
518 {
519 CullDeepPoints(Points, *Sphere, Transforms[TransformIndex]);
520 }
521 TransformIndex++;
522 }
524 {
525 if (TransformIndex != SkipIndex)
526 {
527 CullDeepPoints(Points, *Box, Transforms[TransformIndex]);
528 }
529 TransformIndex++;
530 }
532 {
533 if (TransformIndex != SkipIndex)
534 {
535 CullDeepPoints(Points, *Capsule, Transforms[TransformIndex]);
536 }
537 TransformIndex++;
538 }
539 for (Chaos::FTaperedCylinder* TaperedCylinder : TaperedCylinders)
540 {
541 if (TransformIndex != SkipIndex)
542 {
543 CullDeepPoints(Points, *TaperedCylinder, Transforms[TransformIndex]);
544 }
545 TransformIndex++;
546 }
548 {
549 if (TransformIndex != SkipIndex)
550 {
551 CullDeepPoints(Points, *Convex, Transforms[TransformIndex]);
552 }
553 TransformIndex++;
554 }
555 for (Chaos::FLevelSet* LevelSet : LevelSets)
556 {
557 if (TransformIndex != SkipIndex)
558 {
559 CullDeepPoints(Points, *LevelSet, Transforms[TransformIndex]);
560 }
561 TransformIndex++;
562 }
563 }
564
566 {
567 Chaos::FImplicitObject* Obj = nullptr;
568 if (Idx < Spheres.Num())
569 {
570 Obj = Spheres[Idx];
571 Spheres[Idx] = nullptr;
572 return Obj;
573 }
574 Idx -= Spheres.Num();
575
576 if (Idx < Boxes.Num())
577 {
578 Obj = Boxes[Idx];
579 Boxes[Idx] = nullptr;
580 return Obj;
581 }
582 Idx -= Boxes.Num();
583
584 if (Idx < Capsules.Num())
585 {
586 Obj = Capsules[Idx];
587 Capsules[Idx] = nullptr;
588 return Obj;
589 }
590 Idx -= Capsules.Num();
591
592 if (Idx < TaperedCylinders.Num())
593 {
594 Obj = TaperedCylinders[Idx];
595 TaperedCylinders[Idx] = nullptr;
596 return Obj;
597 }
598 Idx -= TaperedCylinders.Num();
599
600 if (Idx < ConvexHulls.Num())
601 {
602 Obj = ConvexHulls[Idx];
603 ConvexHulls[Idx] = nullptr;
604 return Obj;
605 }
606 Idx -= ConvexHulls.Num();
607
608 if (Idx < LevelSets.Num())
609 {
610 Obj = LevelSets[Idx];
611 LevelSets[Idx] = nullptr;
612 return Obj;
613 }
614
615 check(false); // Index out of range!
616 return Obj;
617 }
618
619protected:
620 //friend class USkeletalMeshSimulationComponent;
622
626
629
630 // FkSphereElem and FKTaperedCapsuleElem ends
632 // FKBoxElem
634 // FKSphylElem - Z axis is capsule axis
636 // FKTaperedCapsuleElem - Z axis is the capsule axis
638 // FKConvexElem
640 // Chaos::TConvex replacement
642
646
649
652};
@ Normal
Definition AndroidInputInterface.h:116
#define checkSlow(expr)
Definition AssertionMacros.h:332
#define check(expr)
Definition AssertionMacros.h:314
@ INDEX_NONE
Definition CoreMiscDefines.h:150
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
EObjectStateTypeEnum
Definition GeometryCollectionSimulationTypes.h:34
UE::Math::TVector< double > FVector3d
Definition MathFwd.h:60
@ Num
Definition MetalRHIPrivate.h:234
#define UE_KINDA_SMALL_NUMBER
Definition UnrealMathUtility.h:131
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint32 Offset
Definition VulkanMemory.cpp:4033
Definition Capsule.h:23
Definition Convex.h:26
Definition ImplicitObjectUnion.h:27
Definition ImplicitObject.h:111
Definition Levelset.h:30
Definition TaperedCylinder.h:13
FORCEINLINE T GetVolume() const
Definition AABB.h:613
FORCEINLINE TAABB< T, d > GetIntersection(const TAABB< T, d > &Other) const
Definition AABB.h:122
Definition Box.h:23
Definition ImplicitObjectTransformed.h:37
Definition Vector.h:1000
Definition AnalyticImplicitGroup.h:24
const int32 GetParentBoneIndex() const
Definition AnalyticImplicitGroup.h:91
const FAnalyticImplicitGroup * GetParent() const
Definition AnalyticImplicitGroup.h:469
int32 Add(const FTransform &InitialXf, Chaos::FLevelSet *LevelSet)
Definition AnalyticImplicitGroup.h:104
TArray< Chaos::FSphere * > Spheres
Definition AnalyticImplicitGroup.h:631
void ClearHierarchy()
Definition AnalyticImplicitGroup.h:477
TArray< FTransform > Transforms
Definition AnalyticImplicitGroup.h:647
int32 Add(const FTransform &InitialXf, Chaos::FSphere *Sphere)
Definition AnalyticImplicitGroup.h:99
FName BoneName
Definition AnalyticImplicitGroup.h:623
int32 NumStructures() const
Definition AnalyticImplicitGroup.h:83
int32 Add(const FTransform &InitialXf, Chaos::TBox< Chaos::FReal, 3 > *Box)
Definition AnalyticImplicitGroup.h:100
TArray< Chaos::FTaperedCylinder * > TaperedCylinders
Definition AnalyticImplicitGroup.h:637
TArray< Chaos::FLevelSet * > LevelSets
Definition AnalyticImplicitGroup.h:641
TArray< Chaos::FConvex * > ConvexHulls
Definition AnalyticImplicitGroup.h:639
int32 Add(const FTransform &InitialXf, Chaos::FConvex *ConvexHull)
Definition AnalyticImplicitGroup.h:103
const FName & GetBoneName() const
Definition AnalyticImplicitGroup.h:87
void AddChild(FAnalyticImplicitGroup *Child)
Definition AnalyticImplicitGroup.h:472
int32 BoneIndex
Definition AnalyticImplicitGroup.h:624
int32 ParentBoneIndex
Definition AnalyticImplicitGroup.h:625
EObjectStateTypeEnum GetRigidBodyState() const
Definition AnalyticImplicitGroup.h:97
void CullDeepPoints(TArray< Chaos::FVec3 > &Points, const TImplicitShape &Shape, const FTransform &Xf)
Definition AnalyticImplicitGroup.h:481
int32 GetRigidBodyId() const
Definition AnalyticImplicitGroup.h:94
void SetParentBoneIndex(const int32 InParentBoneIndex)
Definition AnalyticImplicitGroup.h:90
FAnalyticImplicitGroup(const FName &InBoneName, const int32 InBoneIndex)
Definition AnalyticImplicitGroup.h:34
bool IsValid()
Definition AnalyticImplicitGroup.h:85
FAnalyticImplicitGroup()
Definition AnalyticImplicitGroup.h:26
TArray< Chaos::FCapsule * > Capsules
Definition AnalyticImplicitGroup.h:635
FAnalyticImplicitGroup(const FAnalyticImplicitGroup &)=delete
TArray< Chaos::TVec3< int32 > > BuildSampleTopology() const
Definition AnalyticImplicitGroup.h:380
TArray< Chaos::FVec3 > * BuildSamplePoints(const Chaos::FReal ParticlesPerUnitArea, const int32 MinParticles, const int32 MaxParticles)
Definition AnalyticImplicitGroup.h:261
void ResetTransforms()
Definition AnalyticImplicitGroup.h:113
void CullDeepPoints(TArray< Chaos::FVec3 > &Points, const int32 SkipIndex)
Definition AnalyticImplicitGroup.h:512
TArray< Chaos::FVec3 > ContiguousCollisionPoints
Definition AnalyticImplicitGroup.h:643
void Init(const int32 NumStructures, const bool DoCollGeom=true)
Definition AnalyticImplicitGroup.h:72
void SetCollisionTopology(const int32 Index, TArray< Chaos::FVec3 > &&Points, TArray< Chaos::TVec3< int32 > > &&Triangles)
Definition AnalyticImplicitGroup.h:106
TArray< FAnalyticImplicitGroup * > Children
Definition AnalyticImplicitGroup.h:651
int32 RigidBodyId
Definition AnalyticImplicitGroup.h:627
int32 Add(const FTransform &InitialXf, Chaos::FCapsule *Capsule)
Definition AnalyticImplicitGroup.h:101
TArray< TArray< Chaos::FVec3 > > CollisionPoints
Definition AnalyticImplicitGroup.h:644
Chaos::FImplicitObject * BuildSimImplicitObject()
Definition AnalyticImplicitGroup.h:408
FTransform RefBoneXf
Definition AnalyticImplicitGroup.h:648
EObjectStateTypeEnum RigidBodyState
Definition AnalyticImplicitGroup.h:628
int32 Add(const FTransform &InitialXf, Chaos::FTaperedCylinder *TaperedCylinder)
Definition AnalyticImplicitGroup.h:102
const TArray< FTransform > & GetInitialStructureTransforms() const
Definition AnalyticImplicitGroup.h:112
FAnalyticImplicitGroup(FAnalyticImplicitGroup &&Other)
Definition AnalyticImplicitGroup.h:43
FAnalyticImplicitGroup * Parent
Definition AnalyticImplicitGroup.h:650
~FAnalyticImplicitGroup()
Definition AnalyticImplicitGroup.h:62
Chaos::FImplicitObject * TransferImplicitObj(int32 Idx)
Definition AnalyticImplicitGroup.h:565
void SetParent(FAnalyticImplicitGroup *InParent)
Definition AnalyticImplicitGroup.h:467
TArray< TArray< Chaos::TVec3< int32 > > > CollisionTriangles
Definition AnalyticImplicitGroup.h:645
void SetRigidBodyId(const int32 InRigidBodyId)
Definition AnalyticImplicitGroup.h:93
TArray< Chaos::TBox< Chaos::FReal, 3 > * > Boxes
Definition AnalyticImplicitGroup.h:633
const int32 GetBoneIndex() const
Definition AnalyticImplicitGroup.h:88
Chaos::FMassProperties BuildMassProperties(const Chaos::FReal Density, Chaos::FReal &TotalMass)
Definition AnalyticImplicitGroup.h:115
void SetRigidBodyState(const EObjectStateTypeEnum State)
Definition AnalyticImplicitGroup.h:96
const TArray< FAnalyticImplicitGroup * > & GetChildren() const
Definition AnalyticImplicitGroup.h:474
Definition BoneHierarchy.h:18
Definition NameTypes.h:617
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
void RemoveAt(SizeType Index, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2083
void Reset(SizeType NewSize=0)
Definition Array.h:2246
bool Contains(const ComparisonType &Item) const
Definition Array.h:1518
void SetNum(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2308
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
UE_FORCEINLINE_HINT void Reserve(SizeType Number)
Definition Array.h:3016
FRealDouble FReal
Definition Real.h:22
FMassProperties Combine(const TArray< FMassProperties > &MPArray)
Definition MassProperties.cpp:274
U16 Index
Definition radfft.cpp:71
Definition MassProperties.h:24
FVec3 CenterOfMass
Definition MassProperties.h:34
FReal Volume
Definition MassProperties.h:33
FMatrix33 InertiaTensor
Definition MassProperties.h:36
FRotation3 RotationOfMass
Definition MassProperties.h:35
Definition PhysicsAssetSimulation.h:18
TTransform< T > Inverse() const
Definition TransformNonVectorized.h:307
static CORE_API const TTransform< double > Identity
Definition TransformNonVectorized.h:58
UE_FORCEINLINE_HINT TVector< T > TransformPosition(const TVector< T > &V) const
Definition TransformNonVectorized.h:1423