UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PBDRigidClusteredParticles.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
8
9namespace Chaos
10{
11
12namespace Private
13{
14 class FConvexOptimizer;
15}
16
37
38
46template <typename T>
48{
50 : Sibling(nullptr)
51 , Strain(0.0)
52 {}
53
58
63
67
68 // getter/functions functions to make calling code less confusing
70 Chaos::FRealSingle GetArea() const { return Strain; }
71
73 // this can be both strain or area based on the damage model, but cannot rename it for backward compatibility reasons
75};
78
79template<typename T>
81{
82 if (!Edge.Sibling)
83 {
84 return false;
85 }
86
89
91 {
92 return false;
93 }
94
95 return ClusterParticle->Parent() != SiblingParticle->Parent();
96}
97
99{
100public:
102
104 : Bits(0)
105 {
106 }
107
108 // set to true if the particle is an internal cluster formed of the subset of children from an original cluster
109 bool GetInternalCluster() const { return Flags.bInternalCluster; }
110 void SetInternalCluster(bool bSet) { Flags.bInternalCluster = bSet; }
111
112 // set to true make the particle act as a kinematic anchor, this allows the particle to be broken off while still be anchor contributor through the connection graph
113 bool GetAnchored() const { return Flags.bAnchored; }
114 void SetAnchored(bool bSet) { Flags.bAnchored = bSet; }
115
116 // set to true to make the particle unbreakable by destruction operations from breaking server authoritative particles
117 bool GetUnbreakable() const { return Flags.bUnbreakable; }
118 void SetUnbreakable(bool bSet) { Flags.bUnbreakable = bSet; }
119
120 // Set to true if we want to soft lock the particle's ChildToParent transform. This prevents its from being updated in Chaos::UpdateGeometry.
121 bool GetChildToParentLocked() const { return Flags.bChildToParentLocked; }
122 void SetChildToParentLocked(bool bSet) { Flags.bChildToParentLocked = bSet; }
123
124private:
125 struct FFlags
126 {
127 FStorage bInternalCluster : 1;
128 FStorage bAnchored : 1;
129 FStorage bUnbreakable : 1;
130 FStorage bChildToParentLocked : 1;
131
132 // Add new properties above this line
133 // Change FStorage typedef if we exceed the max bits
134 };
135 union
136 {
137 FFlags Flags;
139 };
140 static_assert(sizeof(FFlags) <= sizeof(FStorage));
141};
142
143
144template<class T, int d>
146{
147 public:
149 : TPBDRigidParticles<T, d>()
150 {
151 InitHelper();
152 }
156 , MClusterIds(MoveTemp(Other.MClusterIds))
157 , MChildToParent(MoveTemp(Other.MChildToParent))
158 , MClusterGroupIndex(MoveTemp(Other.MClusterGroupIndex))
159 , MChildrenSpatial(MoveTemp(Other.MChildrenSpatial))
160 , MPhysicsProxies(MoveTemp(Other.MPhysicsProxies))
161 , MCollisionImpulses(MoveTemp(Other.MCollisionImpulses))
162 , MStrains(MoveTemp(Other.MStrains))
163 , MConnectivityEdges(MoveTemp(Other.MConnectivityEdges))
164 , MExternalStrains(MoveTemp(Other.MExternalStrains))
165 , MRigidClusteredFlags(MoveTemp(Other.MRigidClusteredFlags))
166 , MConvexOptimizers(MoveTemp(Other.MConvexOptimizers))
167 {
168 InitHelper();
169 }
171
172 const auto& ClusterIds(int32 Idx) const { return MClusterIds[Idx]; }
173 auto& ClusterIds(int32 Idx) { return MClusterIds[Idx]; }
174
175 const auto& ChildToParent(int32 Idx) const { return MChildToParent[Idx]; }
176 auto& ChildToParent(int32 Idx) { return MChildToParent[Idx]; }
177
178 const auto& ClusterGroupIndex(int32 Idx) const { return MClusterGroupIndex[Idx]; }
179 auto& ClusterGroupIndex(int32 Idx) { return MClusterGroupIndex[Idx]; }
180
181 const auto& GetChildrenSpatial(int32 Idx) const { return MChildrenSpatial[Idx]; }
182 auto& GetChildrenSpatial(int32 Idx) { return MChildrenSpatial[Idx]; }
183
184 UE_DEPRECATED(5.4, "Use GetChildrenSpatial instead")
186 {
187 check(false);
189 return DummyPtr;
190 }
191
192 UE_DEPRECATED(5.4, "Use GetChildrenSpatial instead")
199
200 const auto& PhysicsProxies(int32 Idx) const { return MPhysicsProxies[Idx]; }
201 auto& PhysicsProxies(int32 Idx) { return MPhysicsProxies[Idx]; }
202
203 const auto& CollisionImpulses(int32 Idx) const { return MCollisionImpulses[Idx]; }
204 auto& CollisionImpulses(int32 Idx) { return MCollisionImpulses[Idx]; }
205 auto& CollisionImpulsesArray() { return MCollisionImpulses; }
206
207 const auto& ExternalStrains(int32 Idx) const { return MExternalStrains[Idx]; }
208 auto& ExternalStrains(int32 Idx) { return MExternalStrains[Idx]; }
209 auto& ExternalStrainsArray() { return MExternalStrains; }
210
211 const auto& Strains(int32 Idx) const { return MStrains[Idx]; }
212 auto& Strains(int32 Idx) { return MStrains[Idx]; }
213
214 const auto& ConnectivityEdges(int32 Idx) const { return MConnectivityEdges[Idx]; }
215 auto& ConnectivityEdges(int32 Idx) { return MConnectivityEdges[Idx]; }
216
217 const FRigidClusteredFlags& RigidClusteredFlags(int32 Idx) const { return MRigidClusteredFlags[Idx]; }
218 FRigidClusteredFlags& RigidClusteredFlags(int32 Idx) { return MRigidClusteredFlags[Idx]; }
219
220 const auto& ConnectivityEdgesArray() const { return MConnectivityEdges; }
221
222 const auto& ClusterIdsArray() const { return MClusterIds; }
223 auto& ClusterIdsArray() { return MClusterIds; }
224
225 const auto& ChildToParentArray() const { return MChildToParent; }
226 auto& ChildToParentArray() { return MChildToParent; }
227
228 const auto& StrainsArray() const { return MStrains; }
229 auto& StrainsArray() { return MStrains; }
230
231 const auto& ClusterGroupIndexArray() const { return MClusterGroupIndex; }
232 auto& ClusterGroupIndexArray() { return MClusterGroupIndex; }
233
234 const auto& RigidClusteredFlags() const { return MRigidClusteredFlags; }
235 auto& RigidClusteredFlags() { return MRigidClusteredFlags; }
236
237 const auto& ConvexOptimizers(int32 Idx) const { return MConvexOptimizers[Idx]; }
238 auto& ConvexOptimizers(int32 Idx) { return MConvexOptimizers[Idx]; }
239
241 const THandleType* Handle(int32 Index) const { return static_cast<const THandleType*>(TGeometryParticles<T,d>::Handle(Index)); }
242
243 //cannot be reference because double pointer would allow for badness, but still useful to have non const access to handle
245
246
247 private:
248
249 void InitHelper()
250 {
252 TArrayCollection::AddArray(&MClusterIds);
253 TArrayCollection::AddArray(&MChildToParent);
254 TArrayCollection::AddArray(&MClusterGroupIndex);
255 TArrayCollection::AddArray(&MChildrenSpatial);
256 TArrayCollection::AddArray(&MPhysicsProxies);
257 TArrayCollection::AddArray(&MCollisionImpulses);
259 TArrayCollection::AddArray(&MConnectivityEdges);
260 TArrayCollection::AddArray(&MExternalStrains);
261 TArrayCollection::AddArray(&MRigidClusteredFlags);
262 TArrayCollection::AddArray(&MConvexOptimizers);
263 }
264
267 TArrayCollectionArray<int32> MClusterGroupIndex;
269
270 // Multiple proxy pointers required for internal clusters
272
273 // Collision Impulses
274 TArrayCollectionArray<Chaos::FRealSingle> MCollisionImpulses;
275
276 // external strains ( use by fields )
277 // @todo(chaos) we should eventually merge MCollisionImpulses into MExternalStrains when Clustering code has been updated to not clear the impulses just before processing them
278 TArrayCollectionArray<Chaos::FRealSingle> MExternalStrains;
279
280 // User set parameters
281 TArrayCollectionArray<Chaos::FRealSingle> MStrains;
282
284
286
287 // Per clustered particle convex optimizer to reduce the collision cost
289};
290
292
293} // namespace Chaos
#define check(expr)
Definition AssertionMacros.h:314
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
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint8_t uint8
Definition binka_ue_file_header.h:8
Definition ImplicitObjectUnion.h:351
Definition PBDRigidClusteredParticles.h:99
void SetInternalCluster(bool bSet)
Definition PBDRigidClusteredParticles.h:110
bool GetAnchored() const
Definition PBDRigidClusteredParticles.h:113
bool GetInternalCluster() const
Definition PBDRigidClusteredParticles.h:109
bool GetUnbreakable() const
Definition PBDRigidClusteredParticles.h:117
void SetUnbreakable(bool bSet)
Definition PBDRigidClusteredParticles.h:118
FFlags Flags
Definition PBDRigidClusteredParticles.h:137
FStorage Bits
Definition PBDRigidClusteredParticles.h:138
uint8 FStorage
Definition PBDRigidClusteredParticles.h:101
bool GetChildToParentLocked() const
Definition PBDRigidClusteredParticles.h:121
void SetAnchored(bool bSet)
Definition PBDRigidClusteredParticles.h:114
void SetChildToParentLocked(bool bSet)
Definition PBDRigidClusteredParticles.h:122
FRigidClusteredFlags()
Definition PBDRigidClusteredParticles.h:103
int32 AddArray(TArrayCollectionArrayBase *Array)
Definition ArrayCollection.h:36
const TPBDRigidClusteredParticleHandleImp< T, d, bPersistent > * CastToClustered() const
Definition ParticleHandle.h:1703
FORCEINLINE THandleType * Handle(int32 Index) const
Definition GeometryParticles.h:474
EParticleType MParticleType
Definition GeometryParticles.h:637
Definition PBDRigidClusteredParticles.h:146
auto & GetChildrenSpatial(int32 Idx)
Definition PBDRigidClusteredParticles.h:182
auto & ClusterIds(int32 Idx)
Definition PBDRigidClusteredParticles.h:173
const auto & ClusterIdsArray() const
Definition PBDRigidClusteredParticles.h:222
TPBDRigidClusteredParticles(const TPBDRigidParticles< T, d > &Other)=delete
THandleType * Handle(int32 Index)
Definition PBDRigidClusteredParticles.h:244
auto & ConnectivityEdges(int32 Idx)
Definition PBDRigidClusteredParticles.h:215
const auto & CollisionImpulses(int32 Idx) const
Definition PBDRigidClusteredParticles.h:203
const auto & ClusterIds(int32 Idx) const
Definition PBDRigidClusteredParticles.h:172
auto & ConvexOptimizers(int32 Idx)
Definition PBDRigidClusteredParticles.h:238
~TPBDRigidClusteredParticles()
Definition PBDRigidClusteredParticles.h:170
const auto & ClusterGroupIndexArray() const
Definition PBDRigidClusteredParticles.h:231
auto & Strains(int32 Idx)
Definition PBDRigidClusteredParticles.h:212
const TUniquePtr< FImplicitObjectUnionClustered > & ChildrenSpatial(int32 Idx) const
Definition PBDRigidClusteredParticles.h:185
auto & CollisionImpulsesArray()
Definition PBDRigidClusteredParticles.h:205
auto & ClusterGroupIndexArray()
Definition PBDRigidClusteredParticles.h:232
TPBDRigidClusteredParticles(TPBDRigidParticles< T, d > &&Other)
Definition PBDRigidClusteredParticles.h:154
const auto & ConnectivityEdgesArray() const
Definition PBDRigidClusteredParticles.h:220
const auto & ExternalStrains(int32 Idx) const
Definition PBDRigidClusteredParticles.h:207
const auto & StrainsArray() const
Definition PBDRigidClusteredParticles.h:228
TPBDRigidClusteredParticles()
Definition PBDRigidClusteredParticles.h:148
const THandleType * Handle(int32 Index) const
Definition PBDRigidClusteredParticles.h:241
const auto & ConnectivityEdges(int32 Idx) const
Definition PBDRigidClusteredParticles.h:214
const auto & GetChildrenSpatial(int32 Idx) const
Definition PBDRigidClusteredParticles.h:181
TPBDRigidClusteredParticleHandle< T, d > THandleType
Definition PBDRigidClusteredParticles.h:240
auto & RigidClusteredFlags()
Definition PBDRigidClusteredParticles.h:235
auto & StrainsArray()
Definition PBDRigidClusteredParticles.h:229
auto & ClusterGroupIndex(int32 Idx)
Definition PBDRigidClusteredParticles.h:179
FRigidClusteredFlags & RigidClusteredFlags(int32 Idx)
Definition PBDRigidClusteredParticles.h:218
const auto & Strains(int32 Idx) const
Definition PBDRigidClusteredParticles.h:211
auto & CollisionImpulses(int32 Idx)
Definition PBDRigidClusteredParticles.h:204
const auto & ChildToParent(int32 Idx) const
Definition PBDRigidClusteredParticles.h:175
const auto & PhysicsProxies(int32 Idx) const
Definition PBDRigidClusteredParticles.h:200
const auto & ConvexOptimizers(int32 Idx) const
Definition PBDRigidClusteredParticles.h:237
auto & PhysicsProxies(int32 Idx)
Definition PBDRigidClusteredParticles.h:201
const auto & RigidClusteredFlags() const
Definition PBDRigidClusteredParticles.h:234
const auto & ClusterGroupIndex(int32 Idx) const
Definition PBDRigidClusteredParticles.h:178
auto & ClusterIdsArray()
Definition PBDRigidClusteredParticles.h:223
auto & ExternalStrains(int32 Idx)
Definition PBDRigidClusteredParticles.h:208
auto & ChildToParent(int32 Idx)
Definition PBDRigidClusteredParticles.h:176
const FRigidClusteredFlags & RigidClusteredFlags(int32 Idx) const
Definition PBDRigidClusteredParticles.h:217
auto & ChildToParentArray()
Definition PBDRigidClusteredParticles.h:226
auto & ExternalStrainsArray()
Definition PBDRigidClusteredParticles.h:209
const auto & ChildToParentArray() const
Definition PBDRigidClusteredParticles.h:225
Definition ParticleHandle.h:987
Definition PBDRigidParticles.h:22
Definition Array.h:670
Definition UniquePtr.h:107
Definition SkeletalMeshComponent.h:307
bool IsInterclusterEdge(const TPBDRigidParticleHandle< T, 3 > &Particle, const TConnectivityEdge< T > &Edge)
Definition PBDRigidClusteredParticles.h:80
TConnectivityEdge< FReal > FConnectivityEdge
Definition PBDRigidClusteredParticles.h:76
float FRealSingle
Definition Real.h:14
TArray< FConnectivityEdge > FConnectivityEdgeArray
Definition PBDRigidClusteredParticles.h:77
Definition OverriddenPropertySet.cpp:45
U16 Index
Definition radfft.cpp:71
Definition PBDRigidClusteredParticles.h:25
ClusterId()
Definition PBDRigidClusteredParticles.h:26
int32 NumChildren
Definition PBDRigidClusteredParticles.h:35
ClusterId(FPBDRigidParticleHandle *NewId, int NumChildrenIn)
Definition PBDRigidClusteredParticles.h:30
FPBDRigidParticleHandle * Id
Definition PBDRigidClusteredParticles.h:34
Definition PBDRigidClusteredParticles.h:48
bool operator==(const TPBDRigidParticleHandle< T, 3 > *OtherSibling) const
Definition PBDRigidClusteredParticles.h:65
Chaos::FRealSingle GetArea() const
Definition PBDRigidClusteredParticles.h:70
TPBDRigidParticleHandle< T, 3 > * Sibling
Definition PBDRigidClusteredParticles.h:72
TConnectivityEdge(const TConnectivityEdge &Other)
Definition PBDRigidClusteredParticles.h:59
void SetArea(Chaos::FRealSingle Area)
Definition PBDRigidClusteredParticles.h:69
TConnectivityEdge(TPBDRigidParticleHandle< T, 3 > *InSibling, const FRealSingle InStrain)
Definition PBDRigidClusteredParticles.h:54
Chaos::FRealSingle Strain
Definition PBDRigidClusteredParticles.h:74
TConnectivityEdge()
Definition PBDRigidClusteredParticles.h:49