UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ClusterUnionPhysicsProxy.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
10#include "Containers/Map.h"
11#include "Containers/Set.h"
12#include "Framework/Threading.h"
13#include "PBDRigidsSolver.h"
14#include "Templates/UniquePtr.h"
15
16namespace Chaos
17{
18 struct FDirtyClusterUnionData;
19
28
45
50 {
51 // Whether the cluster is anchored or not.
52 bool bIsAnchored = true;
53
54 // Whether we assigned new geometry from the PT in PullFromPhysicsState
55 bool bDidSyncGeometry = false;
56
57 // Data on every child particle in the cluster union.
59 };
60
61
62 class FClusterUnionPhysicsProxy : public TPhysicsProxy<FClusterUnionPhysicsProxy, void, FClusterUnionProxyTimestamp>
63 {
65 public:
66 // The mismatch here is fine since we really only need to sync a few properties between the PT and the GT.
69
72
73 // Add physics objects to the cluster union. Should only be called from the game thread.
75 const FClusterUnionSyncedData& GetSyncedData_External() const { return SyncedData_External; }
76
77 // Remove physics objects from the cluster union.
79
80 // Set/Remove any anchors on the cluster particle.
81 CHAOS_API void SetIsAnchored_External(bool bIsAnchored);
82
83 // Set Object State.
86
87 // Explicitly wake the physics object. The wakes the physics object if it is sleeping and resets any sleep state (whether awake or sleeping)
89
90 // Set the cluster mass.
91 // NOTE: When a cluster breaks its mass will be recalculated from the remaining children on the PT, effectively undoing this work.
93
94 // Set GT geometry - this is only for smoothing over any changes until the PT syncs back to the GT.
96
97 // Merge GT geometry into the existing union
99
100 // Remove GT shapes from the existing unions
102
103 UE_DEPRECATED(5.4, "Please use SetGeometry_External instead")
108
109 // Cluster union proxy initialization happens in two first on the game thread (external) then on the
110 // physics thread (internal). Cluster unions are a primarily physics concept so the things exposed to
111 // an external context is just there to be able to safely query the state on the physics thread and to
112 // be able to add/remove things to the proxy itself (rather than to move it, for example).
114
115 bool IsInitializedOnPhysicsThread() const { return bIsInitializedOnPhysicsThread; }
117
118 FExternalParticle* GetParticle_External() const { return Particle_External.Get(); }
119 FInternalParticle* GetParticle_Internal() const { return Particle_Internal; }
120 virtual void* GetHandleUnsafe() const override { return Particle_Internal; }
121 FPhysicsObjectHandle GetPhysicsObjectHandle() const { return PhysicsObject.Get(); }
122
123 bool HasChildren_External() const { return !SyncedData_External.ChildParticles.IsEmpty(); }
124 CHAOS_API bool HasChildren_Internal() const;
125
126 bool IsAnchored_External() const { return SyncedData_External.bIsAnchored; }
127
128 CHAOS_API void SetXR_External(const FVector& X, const FQuat& R);
131 CHAOS_API void SetChildToParent_External(FPhysicsObjectHandle Child, const FTransform& RelativeTransform, bool bLock);
132 CHAOS_API void BulkSetChildToParent_External(const TArray<FPhysicsObjectHandle>& Objects, const TArray<FTransform>& Transforms, bool bLock);
134
135 //
136 // These functions take care of marshaling data back and forth between the game thread
137 // and the physics thread.
138 //
139 CHAOS_API void PushToPhysicsState(const FDirtyPropertiesManager& Manager, int32 DataIdx, const FDirtyProxy& Dirty);
141
144
147
148 FProxyInterpolationBase* GetInterpolationData() { return InterpolationData.Get(); }
149 const FProxyInterpolationBase* GetInterpolationData() const { return InterpolationData.Get(); }
150
151 FClusterUnionIndex GetClusterUnionIndex() const { return ClusterUnionIndex; }
152
154
156 bool GetEnableStrainOnCollision_Internal() const { return bEnableStrainOnCollision_Internal; }
157
158 private:
159 bool bIsInitializedOnPhysicsThread: 1 = false;
160 bool bEnableStrainOnCollision_Internal : 1 = true;
161
162 FClusterCreationParameters ClusterParameters;
163 const FClusterUnionInitData InitData;
164
165 FPhysicsObjectUniquePtr PhysicsObject;
166 TUniquePtr<FExternalParticle> Particle_External;
167 FClusterUnionSyncedData SyncedData_External;
168
169 FInternalParticle* Particle_Internal = nullptr;
170 FClusterUnionIndex ClusterUnionIndex = INDEX_NONE;
171
172 TUniquePtr<FProxyInterpolationBase> InterpolationData;
173
174 public:
176 template<typename ErrorDataType>
178 {
179 if (!InterpolationData.IsValid())
180 {
181 InterpolationData = MakeUnique<ErrorDataType>();
182 }
183 else if (InterpolationData.Get()->GetInterpolationType() != ErrorDataType::InterpolationType)
184 {
185 InterpolationData = MakeUnique<ErrorDataType>(InterpolationData.Get()->GetPullDataInterpIdx_External(), InterpolationData.Get()->GetInterpChannel_External());
186 }
187
188 return static_cast<ErrorDataType*>(InterpolationData.Get());
189 }
190
191 private:
192 // An array of a particles that exist in the external implicit object union.
193 // Note that this array should only be used for book-keeping. It is generally
194 // unsafe to try and access the particles within this array.
195 TArray<FExternalParticle*> GeometryChildParticles_External;
196
197 //~ Begin TPhysicsProxy Interface
198 public:
199 bool IsSimulating() const { return true; }
201 void StartFrameCallback(const float InDt, const float InTime) {}
202 void EndFrameCallback(const float InDt) {}
210 bool IsDirty() { return false; }
211
212 //~ End TPhysicsProxy Interface
213 };
214
215}
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define check(expr)
Definition AssertionMacros.h:314
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
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
EPhysicsProxyType
Definition PhysicsProxyBase.h:11
ESPMode
Definition SharedPointerFwd.h:12
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition ClusterUnionPhysicsProxy.h:63
CHAOS_API void SetGeometry_External(const Chaos::FImplicitObjectPtr &Geometry, const TArray< FPBDRigidParticle * > &ShapeParticles)
Definition ClusterUnionPhysicsProxy.cpp:383
void CreateRigidBodyCallback(FParticlesType &InOutParticles)
Definition ClusterUnionPhysicsProxy.h:203
static constexpr EPhysicsProxyType ConcreteType()
Definition ClusterUnionPhysicsProxy.h:207
CHAOS_API bool HasChildren_Internal() const
Definition ClusterUnionPhysicsProxy.cpp:172
void BindParticleCallbackMapping(Chaos::TArrayCollectionArray< PhysicsProxyWrapper > &PhysicsProxyReverseMap, Chaos::TArrayCollectionArray< int32 > &ParticleIDReverseMap)
Definition ClusterUnionPhysicsProxy.h:206
FClusterUnionIndex GetClusterUnionIndex() const
Definition ClusterUnionPhysicsProxy.h:151
CHAOS_API void SetIsAnchored_External(bool bIsAnchored)
Definition ClusterUnionPhysicsProxy.cpp:220
void UpdateKinematicBodiesCallback(const FParticlesType &InParticles, const float InDt, const float InTime, FKinematicProxy &InKinematicProxy)
Definition ClusterUnionPhysicsProxy.h:200
CHAOS_API void SetEnableStrainOnCollision_External(bool bEnable)
Definition ClusterUnionPhysicsProxy.cpp:928
CHAOS_API void SetMass_External(Chaos::FReal Mass)
Definition ClusterUnionPhysicsProxy.cpp:310
CHAOS_API void RemoveShapes_External(const TArray< FPBDRigidParticle * > &ShapeParticles)
Definition ClusterUnionPhysicsProxy.cpp:356
void StartFrameCallback(const float InDt, const float InTime)
Definition ClusterUnionPhysicsProxy.h:201
void EndFrameCallback(const float InDt)
Definition ClusterUnionPhysicsProxy.h:202
bool IsInitializedOnPhysicsThread() const
Definition ClusterUnionPhysicsProxy.h:115
FExternalParticle * GetParticle_External() const
Definition ClusterUnionPhysicsProxy.h:118
void ForceSetGeometryChildParticles_External(TArray< FExternalParticle * > &&InParticles)
Definition ClusterUnionPhysicsProxy.h:153
virtual void * GetHandleUnsafe() const override
Definition ClusterUnionPhysicsProxy.h:120
void SyncBeforeDestroy()
Definition ClusterUnionPhysicsProxy.h:208
void SetSharedGeometry_External(const TSharedPtr< Chaos::FImplicitObject, ESPMode::ThreadSafe > &Geometry, const TArray< FPBDRigidParticle * > &ShapeParticles)
Definition ClusterUnionPhysicsProxy.h:104
CHAOS_API void BufferPhysicsResults_External(FDirtyClusterUnionData &BufferData)
Definition ClusterUnionPhysicsProxy.cpp:791
CHAOS_API void SetAngularVelocity_External(const FVector &W)
Definition ClusterUnionPhysicsProxy.cpp:882
bool HasChildren_External() const
Definition ClusterUnionPhysicsProxy.h:123
CHAOS_API EObjectStateType GetObjectState_External() const
Definition ClusterUnionPhysicsProxy.cpp:255
CHAOS_API void SyncRemoteData(FDirtyPropertiesManager &Manager, int32 DataIdx, FDirtyChaosProperties &RemoteData) const
Definition ClusterUnionPhysicsProxy.cpp:811
CHAOS_API void ClearAccumulatedData()
Definition ClusterUnionPhysicsProxy.cpp:838
FInternalParticle * GetParticle_Internal() const
Definition ClusterUnionPhysicsProxy.h:119
bool IsSimulating() const
Definition ClusterUnionPhysicsProxy.h:199
CHAOS_API void RemovePhysicsObjects_External(const TSet< FPhysicsObjectHandle > &Objects)
Definition ClusterUnionPhysicsProxy.cpp:201
CHAOS_API void BulkSetChildToParent_External(const TArray< FPhysicsObjectHandle > &Objects, const TArray< FTransform > &Transforms, bool bLock)
Definition ClusterUnionPhysicsProxy.cpp:906
bool IsAnchored_External() const
Definition ClusterUnionPhysicsProxy.h:126
TPBDRigidClusteredParticleHandle< Chaos::FReal, 3 > FInternalParticle
Definition ClusterUnionPhysicsProxy.h:68
CHAOS_API void SetChildToParent_External(FPhysicsObjectHandle Child, const FTransform &RelativeTransform, bool bLock)
Definition ClusterUnionPhysicsProxy.cpp:898
CHAOS_API void SetLinearVelocity_External(const FVector &V)
Definition ClusterUnionPhysicsProxy.cpp:866
ErrorDataType * GetOrCreateErrorInterpolationData()
Definition ClusterUnionPhysicsProxy.h:177
CHAOS_API void SetXR_External(const FVector &X, const FQuat &R)
Definition ClusterUnionPhysicsProxy.cpp:848
CHAOS_API void Initialize_Internal(FPBDRigidsSolver *RigidsSolver, FPBDRigidsSolver::FParticlesType &Particles)
Definition ClusterUnionPhysicsProxy.cpp:112
bool GetEnableStrainOnCollision_Internal() const
Definition ClusterUnionPhysicsProxy.h:156
FProxyInterpolationBase * GetInterpolationData()
Definition ClusterUnionPhysicsProxy.h:148
CHAOS_API void Wake_External()
Definition ClusterUnionPhysicsProxy.cpp:289
CHAOS_API void PushToPhysicsState(const FDirtyPropertiesManager &Manager, int32 DataIdx, const FDirtyProxy &Dirty)
Definition ClusterUnionPhysicsProxy.cpp:406
CHAOS_API void ChangeMainParticleStatus_External(const TArray< FPhysicsObjectHandle > &Objects, bool bIsMain)
Definition ClusterUnionPhysicsProxy.cpp:941
const FProxyInterpolationBase * GetInterpolationData() const
Definition ClusterUnionPhysicsProxy.h:149
void AddForceCallback(FParticlesType &InParticles, const float InDt, const int32 InIndex)
Definition ClusterUnionPhysicsProxy.h:205
CHAOS_API bool PullFromPhysicsState(const FDirtyClusterUnionData &PullData, int32 SolverSyncTimestamp, const FDirtyClusterUnionData *NextPullData=nullptr, const FRealSingle *Alpha=nullptr, const FDirtyRigidParticleReplicationErrorData *Error=nullptr, const Chaos::FReal AsyncFixedTimeStep=0)
Definition ClusterUnionPhysicsProxy.cpp:476
bool IsDirty()
Definition ClusterUnionPhysicsProxy.h:210
CHAOS_API void Initialize_External()
Definition ClusterUnionPhysicsProxy.cpp:86
CHAOS_API void MergeGeometry_External(TArray< Chaos::FImplicitObjectPtr > &&ImplicitGeometries, const TArray< FPBDRigidParticle * > &ShapeParticles)
Definition ClusterUnionPhysicsProxy.cpp:361
const FClusterUnionSyncedData & GetSyncedData_External() const
Definition ClusterUnionPhysicsProxy.h:75
CHAOS_API void BufferPhysicsResults_Internal(FDirtyClusterUnionData &BufferData)
Definition ClusterUnionPhysicsProxy.cpp:711
void DisableCollisionsCallback(TSet< TTuple< int32, int32 > > &InPairs)
Definition ClusterUnionPhysicsProxy.h:204
void OnRemoveFromScene()
Definition ClusterUnionPhysicsProxy.h:209
CHAOS_API void SetObjectState_External(EObjectStateType State)
Definition ClusterUnionPhysicsProxy.cpp:265
CHAOS_API void AddPhysicsObjects_External(const TArray< FPhysicsObjectHandle > &Objects)
Definition ClusterUnionPhysicsProxy.cpp:182
FPhysicsObjectHandle GetPhysicsObjectHandle() const
Definition ClusterUnionPhysicsProxy.h:121
Definition ParticleDirtyFlags.h:1129
Definition ParticleDirtyFlags.h:1039
Definition ImplicitObject.h:111
Definition PBDRigidsSOAs.h:269
Definition PBDRigidsSolver.h:84
Definition ArrayCollectionArray.h:15
Definition PBDRigidParticles.h:22
Definition PhysicsProxyBase.h:97
Definition Array.h:670
Definition PhysicsProxy.h:45
Definition SharedPointer.h:692
bool IsValid() const
Definition UniquePtr.h:280
UE_FORCEINLINE_HINT T * Get() const
Definition UniquePtr.h:324
Definition Object.h:95
Definition SkeletalMeshComponent.h:307
@ X
Definition SimulationModuleBase.h:152
FRealDouble FReal
Definition Real.h:22
EObjectStateType
Definition ObjectState.h:10
int32 FClusterUnionIndex
Definition ClusterUnionManager.h:13
float FRealSingle
Definition Real.h:14
Definition ClusterCreationParameters.h:14
Definition ClusterUnionPhysicsProxy.h:21
FTransform ChildToParent
Definition ClusterUnionPhysicsProxy.h:23
FUniqueIdx ParticleIdx
Definition ClusterUnionPhysicsProxy.h:22
int32 BoneId
Definition ClusterUnionPhysicsProxy.h:26
IPhysicsProxyBase * Proxy
Definition ClusterUnionPhysicsProxy.h:24
void * CachedOwner
Definition ClusterUnionPhysicsProxy.h:25
Definition ClusterUnionPhysicsProxy.h:30
bool bGenerateConnectivityEdges
Definition ClusterUnionPhysicsProxy.h:37
uint32 ComponentId
Definition ClusterUnionPhysicsProxy.h:34
bool bCheckConnectivity
Definition ClusterUnionPhysicsProxy.h:35
FTransform InitialTransform
Definition ClusterUnionPhysicsProxy.h:32
bool bMACDEnabled
Definition ClusterUnionPhysicsProxy.h:40
bool bCCDEnabled
Definition ClusterUnionPhysicsProxy.h:39
int32 GravityGroupOverride
Definition ClusterUnionPhysicsProxy.h:38
uint32 ActorId
Definition ClusterUnionPhysicsProxy.h:33
void * UserData
Definition ClusterUnionPhysicsProxy.h:31
bool bUnbreakable
Definition ClusterUnionPhysicsProxy.h:36
Definition ClusterUnionPhysicsProxy.h:50
bool bIsAnchored
Definition ClusterUnionPhysicsProxy.h:52
TArray< FClusterUnionChildData > ChildParticles
Definition ClusterUnionPhysicsProxy.h:58
bool bDidSyncGeometry
Definition ClusterUnionPhysicsProxy.h:55
Definition PullPhysicsDataImp.h:107
Definition ChaosMarshallingManager.h:21
Definition PullPhysicsDataImp.h:62
Definition PhysicsObjectInternal.h:16
Definition GeometryParticlesfwd.h:87
Definition PhysicsProxyBase.h:258
Definition Tuple.h:652