UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ImplicitObjectUnion.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "Chaos/Array.h"
9
10#include "ChaosArchive.h"
11
12namespace Chaos
13{
14
15namespace Private
16{
17 class FImplicitBVH;
18 class FImplicitBVHObject;
19}
20
21namespace CVars
22{
23 extern bool bChaosUnionBVHEnabled;
24}
25
27{
28 public:
29
31
32 UE_DEPRECATED(5.4, "Constructor no longer used")
34
39
44 UE_DEPRECATED(5.4, "Please use Combine with an array of implicit object ptrs instead")
46
48 CHAOS_API void RemoveAt(int32 RemoveIndex);
50
51 // The total number of root objects in the hierarchy (same as GetObjects().Num())
53 {
54 return MObjects.Num();
55 }
56
57 // The total number of leaf objects in the hierarchy
59 {
60 return NumLeafObjects;
61 }
62
63 // Enable BVH suport for this Union. This should only be done for the root Union in a hierarchy
64 void SetAllowBVH(const bool bInAllowBVH)
65 {
67 {
69
71 RebuildBVH();
72 }
73 }
74
75 // Recurively locked the union. Once locked, it is an error to make a change to the Union or any children
76 void SetLocked(const bool bInLocked)
77 {
79 }
80
82 {
83 if (bInLocked != IsLocked())
84 {
86 {
88 {
89 Union->SetLockedRecursive(bInLocked);
90 }
91 }
92
94 }
95 }
96
97 bool IsLocked() const
98 {
99 return !!Flags.bIsLocked;
100 }
101
106
107 virtual FReal PhiWithNormal(const FVec3& x, FVec3& Normal) const override
108 {
109 const Chaos::FImplicitObjectsArray& Objects = MObjects;
111 bool NeedsNormalize = false;
112 for (int32 i = 0; i < Objects.Num(); ++i)
113 {
114 if(!ensure(Objects[i]))
115 {
116 continue;
117 }
119 FReal NextPhi = Objects[i]->PhiWithNormal(x, NextNormal);
120 if (NextPhi < Phi)
121 {
122 Phi = NextPhi;
124 NeedsNormalize = false;
125 }
126 else if (NextPhi == Phi)
127 {
129 NeedsNormalize = true;
130 }
131 }
133 {
134 Normal.Normalize();
135 }
136 return Phi;
137 }
138
139 virtual const FAABB3 BoundingBox() const override { return MLocalBoundingBox; }
140
142 {
144 {
145 Object->AccumulateAllImplicitObjects(Out, ParentTM);
146 }
147 }
148
150
152
153 virtual bool Raycast(const FVec3& StartPoint, const FVec3& Dir, const FReal Length, const FReal Thickness, FReal& OutTime, FVec3& OutPosition, FVec3& OutNormal, int32& OutFaceIndex) const override
154 {
155 FReal MinTime = 0; //initialization not needed, but doing it to avoid warning
156 bool bFound = false;
157
158 for (const Chaos::FImplicitObjectPtr& Obj : MObjects)
159 {
162 FReal Time;
163 int32 FaceIdx;
164 if (Obj->Raycast(StartPoint, Dir, Length, Thickness, Time, Position, Normal, FaceIdx))
165 {
166 if (!bFound || Time < MinTime)
167 {
168 MinTime = Time;
169 OutTime = Time;
170 OutPosition = Position;
171 OutNormal = Normal;
172 OutFaceIndex = FaceIdx;
173 bFound = true;
174 }
175 }
176 }
177
178 return bFound;
179 }
180
181 virtual bool Overlap(const FVec3& Point, const FReal Thickness) const override
182 {
183 for (const Chaos::FImplicitObjectPtr& Obj : MObjects)
184 {
185 if (Obj->Overlap(Point, Thickness))
186 {
187 return true;
188 }
189 }
190
191 return false;
192 }
193
194 CHAOS_API virtual void Serialize(FChaosArchive& Ar) override;
195
196 virtual bool IsValidGeometry() const
197 {
198 bool bValid = FImplicitObject::IsValidGeometry();
199 bValid = bValid && GetObjects().Num();
200 return bValid;
201 }
202
203 // Return the list of objects that will be part of the union
205
206 // Return the const list of objects that will be part of the union
208
209 // The lambda returns TRUE if an object was found and iteration should stop.
210 CHAOS_API void ForEachObject(TFunctionRef<bool(const FImplicitObject&, const FRigidTransform3&)> Lambda) const;
211
212 virtual uint32 GetTypeHash() const override
213 {
214 uint32 Result = 0;
215
216 // Union hash is just the hash of all internal objects
218 {
219 Result = HashCombine(Result, InnerObj->GetTypeHash());
220 }
221
222 return Result;
223 }
224
226 {
227 return BVH.Get();
228 }
229
230#if INTEL_ISPC
231 // See PerParticlePBDCollisionConstraint.cpp
232 // ISPC code has matching structs for interpreting FImplicitObjects.
233 // This is used to verify that the structs stay the same.
234 struct FISPCDataVerifier
235 {
236 static constexpr int32 OffsetOfMObjects() { return offsetof(FImplicitObjectUnion, MObjects); }
237 static constexpr int32 SizeOfMObjects() { return sizeof(FImplicitObjectUnion::MObjects); }
238 };
239 friend FISPCDataVerifier;
240#endif // #if INTEL_ISPC
241
242protected:
243
244 virtual Pair<FVec3, bool> FindClosestIntersectionImp(const FVec3& StartPoint, const FVec3& EndPoint, const FReal Thickness) const override
245 {
246 check(MObjects.Num());
247 auto ClosestIntersection = MObjects[0]->FindClosestIntersection(StartPoint, EndPoint, Thickness);
248 FReal Length = ClosestIntersection.Second ? (ClosestIntersection.First - StartPoint).Size() : 0;
249 for (int32 i = 1; i < MObjects.Num(); ++i)
250 {
251 auto NextClosestIntersection = MObjects[i]->FindClosestIntersection(StartPoint, EndPoint, Thickness);
252 if (!NextClosestIntersection.Second)
253 continue;
254 FReal NewLength = (NextClosestIntersection.First - StartPoint).Size();
255 if (!ClosestIntersection.Second || NewLength < Length)
256 {
259 }
260 }
261 return ClosestIntersection;
262 }
263
266
268 const FAABB3& LocalBounds,
270 const int32 RootObjectIndex,
271 int32& ObjectIndex,
273 const FImplicitHierarchyVisitor& VisitorFunc) const override final;
274
277 const int32 RootObjectIndex,
278 int32& ObjectIndex,
280 const FImplicitHierarchyVisitor& VisitorFunc) const override final;
281
284 const int32 RootObjectIndex,
285 int32& ObjectIndex,
287 const FImplicitHierarchyVisitorBool& VisitorFunc) const override final;
288
290 const FAABB3& LocalBounds) const override final;
291
292 protected:
293 // Needed for serialization
296
298 CHAOS_API void CreateBVH();
299 CHAOS_API void DestroyBVH();
300 CHAOS_API void RebuildBVH();
301
303
305 {
306 public:
307 FFLags() : Bits(0) {}
308 struct
309 {
310 // NOTE: Flags are serialized. Ordering must be retained
311 uint8 bAllowBVH : 1; // Are we allowed to use a BVH for this Union? (We generally only want a BVH in the root union)
312 uint8 bHasBVH : 1; // Do we currently have a BVH? Equivalent to checking BVH pointer, but used by serialization to know whether to load a BVH
313 uint8 bIsLocked : 1; // If the union is locked, it is an error to change children
314 };
316 };
317
318 // Check if the BVH could be used and valid
319 bool HasValidBVH() const;
320
321 // Log an error we try to modify a union after it has been shared
322 CHAOS_API void CheckNotLocked() const;
323
324 // list of implicit objects that are part of the union
326
328
329 // BVH is only created when there are many objects.
330 // @todo(chaos): consider registering particles that may need BVH updated in evolution instead
334};
335
349
351{
352public:
358
363
364 UE_DEPRECATED(5.3, "Not supported")
366
368
369 // DO NOT USE!!
370 // @todo(chaos): we should get rid of this. Instead we should hold the map/whatever on the GeometryParticle that currently owns the geom
372
373 // DO NOT USE!!
374 // @todo(chaos): move this fucntionality to the geometry particle?
375 CHAOS_API const FBVHParticles* GetChildSimplicial(const int32 ChildIndex) const;
376
377private:
378 // Temp hack for finding original particles
379 TArray<FPBDRigidParticleHandle*> MOriginalParticleLookupHack;
380 TMap<const FImplicitObject*,FPBDRigidParticleHandle*> MCollisionParticleLookupHack; //temp hack for finding collision particles
381};
382
383template<>
385{
386 // @todo(chaos): this is a bit topsy-turvy because the base class needs to know about all derived classes.
387 // Ideally we would have a function like GetBaseType(InType) and implement TImplicitTypeInfo<FImplicitObjectUnionClustered>
388 // but then we'd need a runtime of type->basetype for all valid types (and then there's the bitmask complication)
393};
394
395}
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define FORCEINLINE
Definition AndroidPlatform.h:140
#define check(expr)
Definition AssertionMacros.h:314
#define ensure( InExpression)
Definition AssertionMacros.h:464
#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
constexpr uint32 HashCombine(uint32 A, uint32 C)
Definition TypeHash.h:36
uint32 Size
Definition VulkanMemory.cpp:4034
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition BVHParticles.h:24
Definition ChaosArchive.h:167
Definition ImplicitObjectUnion.h:351
static FORCEINLINE constexpr EImplicitObjectType StaticType()
Definition ImplicitObjectUnion.h:359
void FindAllIntersectingClusteredObjects(TArray< FLargeUnionClusteredImplicitInfo > &Out, const FAABB3 &LocalBounds) const
Definition ImplicitObjectUnion.h:365
CHAOS_API TArray< FPBDRigidParticleHandle * > FindAllIntersectingChildren(const FAABB3 &LocalBounds) const
Definition ImplicitObjectUnion.cpp:567
CHAOS_API FImplicitObjectUnionClustered()
Definition ImplicitObjectUnion.cpp:523
FImplicitObjectUnionClustered(const FImplicitObjectUnionClustered &Other)=delete
virtual ~FImplicitObjectUnionClustered()=default
CHAOS_API const FBVHParticles * GetChildSimplicial(const int32 ChildIndex) const
Definition ImplicitObjectUnion.cpp:612
CHAOS_API const FPBDRigidParticleHandle * FindParticleForImplicitObject(const FImplicitObject *Object) const
Definition ImplicitObjectUnion.cpp:597
Definition ImplicitObjectUnion.h:27
TArray< Chaos::FImplicitObjectPtr > & GetObjects()
Definition ImplicitObjectUnion.h:207
virtual void CacheAllImplicitObjects()
Definition ImplicitObjectUnion.h:151
virtual CHAOS_API int32 CountLeafObjectsInHierarchyImpl() const override final
Definition ImplicitObjectUnion.cpp:244
virtual CHAOS_API bool VisitObjectsImpl(const FRigidTransform3 &ObjectTransform, const int32 RootObjectIndex, int32 &ObjectIndex, int32 &LeafObjectIndex, const FImplicitHierarchyVisitorBool &VisitorFunc) const override final
Definition ImplicitObjectUnion.cpp:308
CHAOS_API void RemoveAt(int32 RemoveIndex)
Definition ImplicitObjectUnion.cpp:134
FImplicitObjectUnion(const FImplicitObjectUnion &Other)=delete
static FORCEINLINE constexpr EImplicitObjectType StaticType()
Definition ImplicitObjectUnion.h:40
virtual CHAOS_API void FindAllIntersectingObjects(TArray< Pair< const FImplicitObject *, FRigidTransform3 > > &Out, const FAABB3 &LocalBounds) const
Definition ImplicitObjectUnion.cpp:203
virtual CHAOS_API ~FImplicitObjectUnion()
virtual CHAOS_API bool IsOverlappingBoundsImpl(const FAABB3 &LocalBounds) const override final
Definition ImplicitObjectUnion.cpp:330
virtual void AccumulateAllImplicitObjects(TArray< Pair< const FImplicitObject *, FRigidTransform3 > > &Out, const FRigidTransform3 &ParentTM) const
Definition ImplicitObjectUnion.h:141
virtual CHAOS_API Chaos::FImplicitObjectPtr DeepCopyGeometry() const
Definition ImplicitObjectUnion.cpp:375
CHAOS_API void DestroyBVH()
Definition ImplicitObjectUnion.cpp:188
virtual CHAOS_API Chaos::FImplicitObjectPtr CopyGeometryWithScale(const FVec3 &Scale) const override
Definition ImplicitObjectUnion.cpp:364
virtual FReal PhiWithNormal(const FVec3 &x, FVec3 &Normal) const override
Definition ImplicitObjectUnion.h:107
const TArray< Chaos::FImplicitObjectPtr > & GetObjects() const
Definition ImplicitObjectUnion.h:204
bool IsLocked() const
Definition ImplicitObjectUnion.h:97
void SetLocked(const bool bInLocked)
Definition ImplicitObjectUnion.h:76
virtual CHAOS_API Chaos::FImplicitObjectPtr DeepCopyGeometryWithScale(const FVec3 &Scale) const override
Definition ImplicitObjectUnion.cpp:386
CHAOS_API void CreateBVH()
Definition ImplicitObjectUnion.cpp:176
int32 GetNumRootObjects() const
Definition ImplicitObjectUnion.h:52
virtual bool Raycast(const FVec3 &StartPoint, const FVec3 &Dir, const FReal Length, const FReal Thickness, FReal &OutTime, FVec3 &OutPosition, FVec3 &OutNormal, int32 &OutFaceIndex) const override
Definition ImplicitObjectUnion.h:153
virtual Pair< FVec3, bool > FindClosestIntersectionImp(const FVec3 &StartPoint, const FVec3 &EndPoint, const FReal Thickness) const override
Definition ImplicitObjectUnion.h:244
CHAOS_API void ForEachObject(TFunctionRef< bool(const FImplicitObject &, const FRigidTransform3 &)> Lambda) const
Definition ImplicitObjectUnion.cpp:397
TArray< Chaos::FImplicitObjectPtr > MObjects
Definition ImplicitObjectUnion.h:325
CHAOS_API void RemoveAtSortedIndices(const TArrayView< const int32 > &InIndices)
Definition ImplicitObjectUnion.cpp:149
CHAOS_API void LegacySerializeBVH(FChaosArchive &Ar)
Definition ImplicitObjectUnion.cpp:496
CHAOS_API void SetNumLeafObjects(const int32 InNumLeafObjects)
Definition ImplicitObjectUnion.cpp:167
void SetAllowBVH(const bool bInAllowBVH)
Definition ImplicitObjectUnion.h:64
TUniquePtr< Private::FImplicitBVH > BVH
Definition ImplicitObjectUnion.h:331
virtual CHAOS_API Chaos::FImplicitObjectPtr CopyGeometry() const
Definition ImplicitObjectUnion.cpp:353
CHAOS_API FImplicitObjectUnion()
Definition ImplicitObjectUnion.cpp:59
FFLags Flags
Definition ImplicitObjectUnion.h:333
virtual bool Overlap(const FVec3 &Point, const FReal Thickness) const override
Definition ImplicitObjectUnion.h:181
void SetLockedRecursive(const bool bInLocked)
Definition ImplicitObjectUnion.h:81
virtual uint32 GetTypeHash() const override
Definition ImplicitObjectUnion.h:212
CHAOS_API void RebuildBVH()
Definition ImplicitObjectUnion.cpp:197
virtual CHAOS_API void VisitLeafObjectsImpl(const FRigidTransform3 &ObjectTransform, const int32 RootObjectIndex, int32 &ObjectIndex, int32 &LeafObjectIndex, const FImplicitHierarchyVisitor &VisitorFunc) const override final
Definition ImplicitObjectUnion.cpp:290
virtual bool IsValidGeometry() const
Definition ImplicitObjectUnion.h:196
const Private::FImplicitBVH * GetBVH() const
Definition ImplicitObjectUnion.h:225
bool HasValidBVH() const
Definition ImplicitObjectUnion.cpp:100
CHAOS_API void CheckNotLocked() const
Definition ImplicitObjectUnion.cpp:106
int32 GetNumLeafObjects() const
Definition ImplicitObjectUnion.h:58
virtual const FAABB3 BoundingBox() const override
Definition ImplicitObjectUnion.h:139
int32 NumLeafObjects
Definition ImplicitObjectUnion.h:332
FAABB3 MLocalBoundingBox
Definition ImplicitObjectUnion.h:327
virtual CHAOS_API void VisitOverlappingLeafObjectsImpl(const FAABB3 &LocalBounds, const FRigidTransform3 &ObjectTransform, const int32 RootObjectIndex, int32 &ObjectIndex, int32 &LeafObjectIndex, const FImplicitHierarchyVisitor &VisitorFunc) const override final
Definition ImplicitObjectUnion.cpp:258
virtual CHAOS_API int32 CountObjectsInHierarchyImpl() const override final
Definition ImplicitObjectUnion.cpp:230
Definition ImplicitObject.h:111
virtual FName GetTypeName() const
Definition ImplicitObject.h:414
virtual CHAOS_API bool IsValidGeometry() const
Definition ImplicitObject.cpp:77
Definition ImplicitObjectBVH.h:104
Definition ParticleHandle.h:987
Definition ArrayView.h:139
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
Definition AssetRegistryState.h:50
Definition UnrealString.h.inl:34
Definition UniquePtr.h:107
friend UE_FORCEINLINE_HINT uint32 GetTypeHash(const UE_STRING_CLASS &S)
Definition UnrealString.h.inl:2176
bool bChaosUnionBVHEnabled
Definition ImplicitObjectUnion.cpp:19
@ Union
Definition ImplicitObjectType.h:18
@ UnionClustered
Definition ImplicitObjectType.h:28
Definition SkeletalMeshComponent.h:307
uint8 EImplicitObjectType
Definition ImplicitObjectType.h:41
FRealDouble FReal
Definition Real.h:22
Definition OverriddenPropertySet.cpp:45
FAutoConsoleVariableRef CVars[]
Definition MassProcessingPhaseManager.cpp:29
Definition ImplicitObjectUnion.h:337
FLargeUnionClusteredImplicitInfo(const FImplicitObject *InImplicit, const FRigidTransform3 &InTransform, const FBVHParticles *InBVHParticles)
Definition ImplicitObjectUnion.h:338
const FImplicitObject * Implicit
Definition ImplicitObjectUnion.h:345
FRigidTransform3 Transform
Definition ImplicitObjectUnion.h:346
const FBVHParticles * BVHParticles
Definition ImplicitObjectUnion.h:347
Definition Pair.h:8
static bool IsBaseOf(const EImplicitObjectType InType)
Definition ImplicitObjectUnion.h:389
Definition ImplicitObject.h:83
static bool IsBaseOf(const EImplicitObjectType InType)
Definition ImplicitObject.h:86
Definition NumericLimits.h:41
Definition ImplicitObjectUnion.h:305
uint8 bAllowBVH
Definition ImplicitObjectUnion.h:311
uint8 bHasBVH
Definition ImplicitObjectUnion.h:312
uint8 bIsLocked
Definition ImplicitObjectUnion.h:313
FFLags()
Definition ImplicitObjectUnion.h:307
uint8 Bits
Definition ImplicitObjectUnion.h:315