UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ClusterUnionManager.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
7#include "Containers/Array.h"
8#include "Containers/Map.h"
10
11namespace Chaos
12{
15
16 class FRigidClustering;
19
21 {
22 Add,
23 // AddReleased is the original behavior where if the particle to be added is a cluster, we will release the cluster first
24 // and add its children instead.
26 Remove,
28 };
29
31 {
32 Never,
33 Defer,
35 };
36
50
52 {
53 Add,
54 Remove
55 };
56
58 {
59 Add,
60 Remove,
62 };
63
72
74 {
79 // An auxiliary particle will be removed from the cluster union if FRigidClustering::HandleConnectivityOnReleaseClusterParticle detects an island made up of only auxiliary particles.
81 // Really just a protection for external users accidentally incurring a perf cost if they try to manually generate edges. We will never do this more than once per particle per cluster union.
83 };
84
86 {
87 // The root cluster particle that we created internally to represent the cluster.
89
90 // The thread-safe collision geometry that can be shared between the GT and PT.
92
93 // All the particles that belong to this cluster.
95
96 // All the particles that belong to this cluster that are currently in the implicit object geometry. There is a delay between removal from ChildParticles and its subsequent
97 // removal from GeometryChildParticles.
99
100 // Additional properties that are only relevant for particles that have been added into a cluster union.
102
103 // The internal index used to reference the cluster union.
105
106 // An explicit index set by the user if any.
108
109 // Need to remember the parameters used to create the cluster so we can update it later.
111
112 // Other parameters that aren't related to clusters generally but are related to info we need about the cluster union.
114
115 // Whether or not the position/rotation needs to be computed the first time a particle is added.
116 bool bNeedsXRInitialization : 1 = true;
117
118 // Whether or not the anchor got set by the GT and we shouldn't try to recompute its value.
119 bool bAnchorLock : 1 = false;
120
121 // Whether or not we need to check for connectivity for this cluster union.
122 bool bCheckConnectivity : 1 = false;
123
124 // Whether or not to generate connectivity edges (used to differentiate between server graphs vs client graphs).
126
127 // Whether the geometry for the union has change such that we will need to push a copy to the game thread
128 bool bGeometryModified : 1 = true;
129
130 // Pending particles that need to be added into the connectivity graph.
132
134
139
140 private:
141 // Pending particles that need to be added into/removed from the cluster union's geometry.
142 // These need to be arrays to be able to maintain ordering.
144 };
145
152
159 {
160 public:
161
162 template<EThreadContext Id>
169
171
172 // Creates a new cluster union with an automatically assigned cluster union index.
174
175 // Destroy a given cluster union.
177
178 // Add a new operation to the queue. Note that we currently only support the pending/flush operations for explicit operations. The behavior is legacy anyway so this should be fine.
181
182 // Actually performs the change specified in the FClusterUnionOperationData structure.
184
185 // Removes the specified particles from the specified cluster.
187
188 // Helper function to remove particles given only the particle handle. This will consult the lookup table to find which cluster the particle is in before doing a normal remove operation.
190
191 // Performs the queued child to parent modifications.
193
194 // Will be called at the beginning of every time step to ensure that all the expected cluster unions have been modified.
196
197 // Update cluster union properties here if they were deferred. This can be called manually but will otherwise also be handled in FlushPendingOperations.
199
200 // Access the cluster union externally.
203 CHAOS_API const FClusterUnion* FindClusterUnion(FClusterUnionIndex Index) const;
205 CHAOS_API const FClusterUnion* FindClusterUnionFromParticle(const FPBDRigidParticleHandle* Particle) const;
207
208 // An extension to FindClusterUnionIndexFromParticle to check whether or not the given particle is the cluster union particle itself.
210
211 // Changes the ChildToParent of a number of particles in a cluster union. bLock will prevent other functions from overriding the ChildToParent (aside from another call to UpdateClusterUnionParticlesChildToParent).
213
214 // Update the cluster union's properties after its set of particle changes.
216
218
221
222 // Returns all cluster unions. Really meant only to be used for debugging.
223 const TMap<FClusterUnionIndex, FClusterUnion>& GetAllClusterUnions() const { return ClusterUnions; }
224
226
227 // Put in a deferred request to update the properties of the specified cluster union. Flags can limit the scope of the update.
229 private:
230 FRigidClustering& MClustering;
231 FPBDRigidsEvolutionGBF& MEvolution;
232
234 template<typename TIndex>
235 using TClusterIndexOpMap = TMap<TIndex, FClusterOpMap>;
236
237 TClusterIndexOpMap<FClusterUnionIndex> PendingClusterIndexOperations;
238 TClusterIndexOpMap<FClusterUnionExplicitIndex> PendingExplicitIndexOperations;
240 TSet<FPBDRigidClusteredParticleHandle*> PendingParticlesToUndoChildToParentLock;
241
242 template<typename TIndex>
244 {
245 FClusterOpMap& Ops = OpMap.FindOrAdd(Index);
246 TArray<FPBDRigidParticleHandle*>& OpData = Ops.FindOrAdd(Op);
247 OpData.Append(Particles);
248 }
249
250 // All of our actively managed cluster unions. We need to keep track of these
251 // so a user could use the index to request modifications to a specific cluster union.
253
254 // The set of cluster unions that we want to defer updating their cluster union properties for.
255 TMap<FClusterUnionIndex, EUpdateClusterUnionPropertiesFlags> DeferredClusterUnionsForUpdateProperties;
256
257 //
258 // There are two ways we can pick a new union index:
259 // - If a cluster union gets released/destroyed, that index can be reused.
260 // - Otherwise, we use the NextAvailableUnionIndex which is just the max index we've seen + 1.
261 //
262 CHAOS_API FClusterUnionIndex ClaimNextUnionIndex();
263 TArray<FClusterUnionIndex> ReusableIndices;
264 FClusterUnionIndex NextAvailableUnionIndex = 1;
265
266 // Using the user's passed in FClusterUnionIndex may result in strange unexpected behavior if the
267 // user creates a cluster with a specified index. Thus we will map all explicitly requested indices
268 // (i.e. an index that comes in via FClusterUnionOperationData for the first time) to an automatically
269 // generated index (i.e one that would returned via CreateNewClusterUnion).
271 CHAOS_API FClusterCreationParameters DefaultClusterCreationParameters() const;
272
273 // If no cluster index is set but an explicit index is set, map the explicit index to a regular index.
274 CHAOS_API FClusterUnionIndex GetOrCreateClusterUnionIndexFromExplicitIndex(FClusterUnionExplicitIndex InIndex);
275
276 // Forcefully recreate the shared geometry on a cluster. Potentially expensive so ideally should be used rarely.
277 CHAOS_API FImplicitObjectPtr ForceRecreateClusterUnionGeometry(const FClusterUnion& Union);
278
279 UE_DEPRECATED(5.4, "Please use ForceRecreateClusterUnionGeometry instead")
280 TSharedPtr<FImplicitObject, ESPMode::ThreadSafe> ForceRecreateClusterUnionSharedGeometry(const FClusterUnion& Union)
281 {
282 check(false);
283 return nullptr;
284 }
285
286 // Handles updating the cluster union.
287 CHAOS_API void DeferredClusterUnionUpdate(FClusterUnion& Union, EUpdateClusterUnionPropertiesFlags Flags);
288
289 // Flush the cluster union's incremental connectivity operations
290 CHAOS_API void FlushIncrementalConnectivityGraphOperations(FClusterUnion& ClusterUnion);
291
292 // Forcefully regenerate the cluster union's geometry.
293 void ForceRegenerateGeometry(FClusterUnion& ClusterUnion, const TSet<FPBDRigidParticleHandle*>& FullChildrenSet);
294
295 // Flush the cluster union's incremental geometry operations.
296 void FlushIncrementalGeometryOperations(FClusterUnion& ClusterUnion);
297 };
298
299 template<typename TParticle>
301 {
302 if (ShapeData && TemplateShape)
303 {
304 {
305 FCollisionData Data = TemplateShape->GetCollisionData();
306 Data.UserData = nullptr;
307 ShapeData->SetCollisionData(Data);
308 }
309
310 {
311 FCollisionFilterData Data = TemplateShape->GetQueryData();
312 Data.Word0 = ActorId;
313 ShapeData->SetQueryData(Data);
314 }
315
316 {
317 FCollisionFilterData Data = TemplateShape->GetSimData();
318 Data.Word0 = 0;
319 Data.Word2 = ComponentId;
320 ShapeData->SetSimData(Data);
321 }
322
323 {
324 const int32 NumTemplateMaterials = TemplateShape->NumMaterials();
325
326 if(NumTemplateMaterials == 1)
327 {
328 // We have a special case for 1 material, calling GetMaterials
329 // would allocate a material storage object to apply to the shape
330 // whereas for 1 material we store it inline to the shape data
331 ShapeData->SetMaterial(TemplateShape->GetMaterial(0));
332 }
333 else if(NumTemplateMaterials > 1)
334 {
335 ShapeData->SetMaterials(TemplateShape->GetMaterials());
336 }
337 }
338 }
339 }
340
347 template<typename TClusterParticle, typename TParticle, typename TLambda>
349 {
350 if (!ClusterParticle || Particles.IsEmpty())
351 {
352 return;
353 }
354
355 FImplicitObjectUnion* ImplicitUnion = ClusterParticle->GetGeometry() ? ClusterParticle->GetGeometry()->template AsA<FImplicitObjectUnion>() : nullptr;
356 const int32 OldNumChildShapes = ImplicitUnion ? ImplicitUnion->GetNumRootObjects() : 0;
357
358 Func();
359
360 // We must have a union at this point since the contract is that Func is adding a shape
361 // which means we must be in a union already.
362 check(ClusterParticle->GetGeometry() != nullptr);
363 ImplicitUnion = ClusterParticle->GetGeometry()->template AsA<FImplicitObjectUnion>();
364 check(ImplicitUnion != nullptr);
365
366 const int32 NewNumChildShapes = ImplicitUnion->GetNumRootObjects();
367 const FShapesArray& ShapeArray = ClusterParticle->ShapesArray();
368 check(ShapeArray.Num() == NewNumChildShapes);
370
371 for (int32 Index = 0; Index < Particles.Num(); ++Index)
372 {
373 TParticle* Particle = Particles[Index];
374 if (!Particle)
375 {
376 continue;
377 }
378
379 const TUniquePtr<Chaos::FPerShapeData>& TemplateShape = Particle->ShapesArray()[0];
380 if (!TemplateShape)
381 {
382 continue;
383 }
384
385 const int32 ShapeIndex = OldNumChildShapes + Index;
386 if (const TUniquePtr<Chaos::FPerShapeData>& ShapeData = ShapeArray[ShapeIndex])
387 {
388 TransferClusterUnionShapeData(ShapeData, Particle, TemplateShape, ActorId, ComponentId);
389 }
390 }
391 }
392
396 template<typename TClusterParticle, typename TParticle>
398 {
400 {
401 return;
402 }
403
404 // Don't try to remove anything if the shape array is already empty
405 if (!ClusterParticle->ShapesArray().IsEmpty() && !AllChildParticles.IsEmpty())
406 {
407#if WITH_EDITOR
409 AllChildParticles.Num() == ClusterParticle->ShapesArray().Num(),
410 TEXT("RemoveParticlesFromClusterUnionGeometry : More than one shape per child particle : ShapeArray=[%d] AllChildParticles=[%d] ShapeParticles=[%d]"),
411 ClusterParticle->ShapesArray().Num(),
412 AllChildParticles.Num(),
413 ShapeParticles.Num()
414 );
415#else
416 checkf(
417 AllChildParticles.Num() == ClusterParticle->ShapesArray().Num(),
418 TEXT("RemoveParticlesFromClusterUnionGeometry : More than one shape per child particle : ShapeArray=[%d] AllChildParticles=[%d] ShapeParticles=[%d]"),
419 ClusterParticle->ShapesArray().Num(),
420 AllChildParticles.Num(),
421 ShapeParticles.Num()
422 );
423#endif
424
425
429 {
430 check(ShapeParticle != nullptr);
432 if (Index != INDEX_NONE)
433 {
435 }
436 }
437
439
440 ClusterParticle->RemoveShapesAtSortedIndices(ShapeIndicesToRemove);
441
443
444#if WITH_EDITOR
446 AllChildParticles.Num() == ClusterParticle->ShapesArray().Num(),
447 TEXT("RemoveParticlesFromClusterUnionGeometry : More than one shape per child particle : ShapeArray=[%d] AllChildParticles=[%d] ShapeParticles=[%d]"),
448 ClusterParticle->ShapesArray().Num(),
449 AllChildParticles.Num(),
450 ShapeParticles.Num()
451 );
452#else
453 checkf(
454 AllChildParticles.Num() == ClusterParticle->ShapesArray().Num(),
455 TEXT("RemoveParticlesFromClusterUnionGeometry : More than one shape per child particle : ShapeArray=[%d] AllChildParticles=[%d] ShapeParticles=[%d]"),
456 ClusterParticle->ShapesArray().Num(),
457 AllChildParticles.Num(),
458 ShapeParticles.Num()
459 );
460#endif
461 }
462 // If we remove particles from the cluster union geometry then we need to switch the geometry back to a FImplicitObjectUnionClustered to avoid errors with empty unions.
463 if (ClusterParticle->ShapesArray().IsEmpty())
464 {
466 }
467 }
468}
#define check(expr)
Definition AssertionMacros.h:314
#define ensureMsgf( InExpression, InFormat,...)
Definition AssertionMacros.h:465
#define ensure( InExpression)
Definition AssertionMacros.h:464
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
FPlatformTypes::int8 int8
An 8-bit signed integer.
Definition Platform.h:1121
#define TEXT(x)
Definition Platform.h:1272
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
#define ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:6
ESPMode
Definition SharedPointerFwd.h:12
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition ClusterUnionManager.h:159
bool IsDirectlyConnectedToMainParticleInClusterUnion(const FClusterUnion &ClusterUnion, FPBDRigidParticleHandle *Particle) const
Definition ClusterUnionManager.cpp:1502
CHAOS_API FClusterUnionIndex CreateNewClusterUnion(const FClusterCreationParameters &Parameters, const FClusterUnionCreationParameters &ClusterUnionParameters=FClusterUnionCreationParameters{})
Definition ClusterUnionManager.cpp:287
CHAOS_API void AddPendingClusterIndexOperation(FClusterUnionIndex Index, EClusterUnionOperation Op, const TArray< FPBDRigidParticleHandle * > &Particles)
Definition ClusterUnionManager.cpp:411
CHAOS_API void HandleDeferredClusterUnionUpdateProperties()
Definition ClusterUnionManager.cpp:783
static FImplicitObjectTransformed * CreateTransformGeometryForClusterUnion(TThreadRigidParticle< Id > *Child, const FTransform &Frame)
Definition ClusterUnionManager.h:163
CHAOS_API FClusterUnion * FindClusterUnionFromParticle(FPBDRigidParticleHandle *Particle)
Definition ClusterUnionManager.cpp:500
CHAOS_API void UpdateClusterUnionParticlesChildToParent(FClusterUnionIndex Index, const TArray< FPBDRigidParticleHandle * > &Particles, const TArray< FTransform > &ChildToParent, bool bLock)
Definition ClusterUnionManager.cpp:1390
CHAOS_API FClusterUnionIndex FindClusterUnionIndexFromParticle(const FPBDRigidParticleHandle *Particle) const
Definition ClusterUnionManager.cpp:1347
CHAOS_API FClusterUnion * FindClusterUnion(FClusterUnionIndex Index)
Definition ClusterUnionManager.cpp:490
CHAOS_API void GenerateInterclusterEdgesBetweenParticles(FClusterUnion &ClusterUnion, FPBDRigidParticleHandle *Particle, FPBDRigidParticleHandle *OtherParticle)
Definition ClusterUnionManager.cpp:1094
CHAOS_API bool IsClusterUnionParticle(FPBDRigidClusteredParticleHandle *Particle)
Definition ClusterUnionManager.cpp:1379
CHAOS_API void AddPendingExplicitIndexOperation(FClusterUnionExplicitIndex Index, EClusterUnionOperation Op, const TArray< FPBDRigidParticleHandle * > &Particles)
Definition ClusterUnionManager.cpp:403
CHAOS_API void HandleRemoveOperation(FClusterUnionIndex ClusterIndex, const TArray< FPBDRigidParticleHandle * > &Particles, EClusterUnionOperationTiming UpdateClusterPropertiesTiming)
Definition ClusterUnionManager.cpp:813
CHAOS_API void UpdateAllClusterUnionProperties(FClusterUnion &ClusterUnion, EUpdateClusterUnionPropertiesFlags Flags=EUpdateClusterUnionPropertiesFlags::All)
Definition ClusterUnionManager.cpp:957
CHAOS_API void AddParticleToConnectionGraphInCluster(FClusterUnion &ClusterUnion, FPBDRigidParticleHandle *Particle)
Definition ClusterUnionManager.cpp:1035
CHAOS_API FClusterUnion * FindClusterUnionFromExplicitIndex(FClusterUnionExplicitIndex Index)
Definition ClusterUnionManager.cpp:479
CHAOS_API void HandleRemoveOperationWithClusterLookup(const TArray< FPBDRigidParticleHandle * > &InParticles, EClusterUnionOperationTiming UpdateClusterPropertiesTiming)
Definition ClusterUnionManager.cpp:938
CHAOS_API void HandleUpdateChildToParentOperation(FClusterUnionIndex ClusterIndex, const TArray< FPBDRigidParticleHandle * > &Particles)
Definition ClusterUnionManager.cpp:1418
CHAOS_API void DestroyClusterUnion(FClusterUnionIndex Index)
Definition ClusterUnionManager.cpp:331
CHAOS_API void RequestDeferredClusterPropertiesUpdate(FClusterUnionIndex ClusterIndex, EUpdateClusterUnionPropertiesFlags Flags)
Definition ClusterUnionManager.cpp:1542
CHAOS_API void FlushPendingOperations()
Definition ClusterUnionManager.cpp:419
CHAOS_API void HandleAddOperation(FClusterUnionIndex ClusterIndex, const TArray< FPBDRigidParticleHandle * > &InParticles, bool bReleaseClustersFirst)
Definition ClusterUnionManager.cpp:513
CHAOS_API void GenerateInterclusterEdgesForParticle(FClusterUnion &ClusterUnion, FPBDRigidParticleHandle *Particle)
Definition ClusterUnionManager.cpp:1041
const TMap< FClusterUnionIndex, FClusterUnion > & GetAllClusterUnions() const
Definition ClusterUnionManager.h:223
Definition ImplicitObjectUnion.h:27
Definition PBDRigidsEvolutionGBF.h:51
Definition PBDRigidClustering.h:56
Definition ImplicitObjectTransformed.h:37
Definition ParticleHandle.h:987
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_REWRITE bool IsEmpty() const
Definition Array.h:1133
void Append(const TArray< OtherElementType, OtherAllocatorType > &Source)
Definition Array.h:2412
UE_FORCEINLINE_HINT void Reserve(SizeType Number)
Definition Array.h:3016
Definition UnrealString.h.inl:34
Definition SharedPointer.h:692
Definition UniquePtr.h:107
Definition SkeletalMeshComponent.h:307
int32 FClusterUnionExplicitIndex
Definition ClusterUnionManager.h:14
TPBDRigidParticleHandle< FReal, 3 > FPBDRigidParticleHandle
Definition ParticleHandleFwd.h:60
TRefCountPtr< FImplicitObject > FImplicitObjectPtr
Definition ImplicitFwd.h:33
EClusterUnionOperation
Definition ClusterUnionManager.h:21
EClusterUnionOperationTiming
Definition ClusterUnionManager.h:31
void TransferClusterUnionShapeData(const TUniquePtr< Chaos::FPerShapeData > &ShapeData, TParticle *TemplateParticle, const TUniquePtr< Chaos::FPerShapeData > &TemplateShape, int32 ActorId, int32 ComponentId)
Definition ClusterUnionManager.h:300
void ModifyAdditionOfChildrenToClusterUnionGeometry(TClusterParticle *ClusterParticle, const TArray< TParticle * > &Particles, int32 ActorId, int32 ComponentId, TLambda &&Func)
Definition ClusterUnionManager.h:348
EClusterUnionConnectivityOperation
Definition ClusterUnionManager.h:52
void RemoveArrayItemsAtSortedIndices(TItemArray &Items, const TArrayView< const int32 > &SortedIndicesToRemove)
Definition ArrayAlgorithm.h:35
int32 FClusterUnionIndex
Definition ClusterUnionManager.h:13
@ Add
Definition PendingSpatialData.h:18
EUpdateClusterUnionPropertiesFlags
Definition ClusterUnionManager.h:38
TPBDRigidClusteredParticleHandle< FReal, 3 > FPBDRigidClusteredParticleHandle
Definition ParticleHandleFwd.h:75
EClusterUnionGeometryOperation
Definition ClusterUnionManager.h:58
void RemoveParticlesFromClusterUnionGeometry(TClusterParticle *ClusterParticle, const TArray< TParticle * > &ShapeParticles, TArray< TParticle * > &AllChildParticles)
Definition ClusterUnionManager.h:397
std::conditional_t< Id==EThreadContext::External, FPBDRigidParticle, FPBDRigidParticleHandle > TThreadRigidParticle
Definition ParticleHandleFwd.h:126
U16 Index
Definition radfft.cpp:71
Definition ClusterCreationParameters.h:14
Definition ClusterUnionManager.h:147
FClusterUnionIndex ClusterUnionIndex
Definition ClusterUnionManager.h:150
bool bLock
Definition ClusterUnionManager.h:149
FTransform ChildToParent
Definition ClusterUnionManager.h:148
Definition ClusterUnionManager.h:65
const FUniqueIdx * UniqueIndex
Definition ClusterUnionManager.h:67
uint32 ActorId
Definition ClusterUnionManager.h:68
FClusterUnionExplicitIndex ExplicitIndex
Definition ClusterUnionManager.h:66
uint32 ComponentId
Definition ClusterUnionManager.h:69
int32 GravityGroupOverride
Definition ClusterUnionManager.h:70
Definition ClusterUnionManager.h:74
uint8 bIsAuxiliaryParticle
Definition ClusterUnionManager.h:80
uint8 bEdgesAreGenerated
Definition ClusterUnionManager.h:82
FClusterUnionParticleProperties()
Definition ClusterUnionManager.h:75
Definition ClusterUnionManager.h:86
TArray< TPair< FPBDRigidParticleHandle *, EClusterUnionConnectivityOperation > > PendingConnectivityOperations
Definition ClusterUnionManager.h:131
TArray< FPBDRigidParticleHandle * > ChildParticles
Definition ClusterUnionManager.h:94
FPBDRigidClusteredParticleHandle * InternalCluster
Definition ClusterUnionManager.h:88
const TArray< FPBDRigidParticleHandle * > & GetPendingGeometryOperationParticles(EClusterUnionGeometryOperation Op) const
Definition ClusterUnionManager.cpp:253
TMap< FPBDRigidParticleHandle *, FClusterUnionParticleProperties > ChildProperties
Definition ClusterUnionManager.h:101
TArray< FPBDRigidParticleHandle * > GeometryChildParticles
Definition ClusterUnionManager.h:98
bool bGeometryModified
Definition ClusterUnionManager.h:128
void ClearAllPendingGeometryOperations()
Definition ClusterUnionManager.cpp:268
FClusterUnionCreationParameters ClusterUnionParameters
Definition ClusterUnionManager.h:113
bool bNeedsXRInitialization
Definition ClusterUnionManager.h:116
bool bCheckConnectivity
Definition ClusterUnionManager.h:122
FClusterCreationParameters Parameters
Definition ClusterUnionManager.h:110
bool bAnchorLock
Definition ClusterUnionManager.h:119
void AddPendingGeometryOperation(EClusterUnionGeometryOperation Op, FPBDRigidParticleHandle *Particle)
Definition ClusterUnionManager.cpp:263
bool IsGravityOverrideSet() const
Definition ClusterUnionManager.h:133
FClusterUnionExplicitIndex ExplicitIndex
Definition ClusterUnionManager.h:107
FClusterUnionIndex InternalIndex
Definition ClusterUnionManager.h:104
bool bGenerateConnectivityEdges
Definition ClusterUnionManager.h:125
void ClearPendingGeometryOperations(EClusterUnionGeometryOperation Op)
Definition ClusterUnionManager.cpp:274
Chaos::FImplicitObjectPtr Geometry
Definition ClusterUnionManager.h:91
Definition ParticleDirtyFlags.h:722
Definition GeometryParticlesfwd.h:87
Definition CollisionFilterData.h:46