UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
BoundingVolumeHierarchy.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"
5#include "Chaos/AABB.h"
6#include "Chaos/Defines.h"
10#include "Chaos/Transform.h"
11#include "ChaosLog.h"
13#include "Templates/Models.h"
14
15template <typename T, bool>
17{
18};
19
20template <typename T>
22{
23 using TPayloadType = typename T::TPayloadType;
24};
25
26template <typename T>
28{
29 using TPayloadType = typename T::ElementType;
30};
31
33{
34 template <typename T>
35 auto Requires(typename T::TPayloadType) ->void;
36};
37
38namespace Chaos
39{
40
41template <typename T, int d>
51
52template <typename T, int d>
54{
55 return Ar << LeafNode.LeafIndex << LeafNode.MAxis << LeafNode.MChildren << LeafNode.MMax << LeafNode.MMin;
56}
57
58template<class OBJECT_ARRAY, class LEAF_TYPE, class T = FReal, int d = 3>
59class TBoundingVolumeHierarchy final : public ISpatialAcceleration<int32, T,d>
60{
61 public:
62 static constexpr int32 DefaultMaxLevels = 12;
63 static constexpr bool DefaultAllowMultipleSplitting = false;
64 static constexpr bool DefaultUseVelocity = false;
65 static constexpr T DefaultDt = 0;
67
69 : MObjects(nullptr)
70 , MMaxLevels(DefaultMaxLevels)
71 {
72 }
73
76
79 : MObjects(Other.MObjects), MGlobalObjects(MoveTemp(Other.MGlobalObjects)), MWorldSpaceBoxes(MoveTemp(Other.MWorldSpaceBoxes)), MMaxLevels(Other.MMaxLevels), Elements(MoveTemp(Other.Elements)), Leafs(MoveTemp(Other.Leafs))
80 {
81 }
82
84 {
85
88 }
89
91 {
93 MObjects = Other.MObjects;
94 MGlobalObjects = Other.MGlobalObjects;
95 MWorldSpaceBoxes = Other.MWorldSpaceBoxes;
96 MMaxLevels = Other.MMaxLevels;
97 Elements = Other.Elements;
98 Leafs = Other.Leafs;
99 return *this;
100 }
101
103 {
104 MObjects = Other.MObjects;
105 MGlobalObjects = MoveTemp(Other.MGlobalObjects);
106 MWorldSpaceBoxes = MoveTemp(Other.MWorldSpaceBoxes);
107 MMaxLevels = Other.MMaxLevels;
108 Elements = MoveTemp(Other.Elements);
109 Leafs = MoveTemp(Other.Leafs);
110 return *this;
111 }
112
115
120
125
126 template<class T_INTERSECTION>
128 {
129 if (Elements.Num())
130 {
131 TArray<int32> IntersectionList = FindAllIntersectionsHelper(Elements[0], Intersection);
132 IntersectionList.Append(MGlobalObjects);
133 return IntersectionList;
134 }
135 else
136 {
137 return MGlobalObjects;
138 }
139 }
140
141 // Calls the visitor for every overlapping leaf.
142 // @tparam TVisitor void(const LEAF_TYPE& Leaf)
143 template<typename TVisitor>
144 void VisitAllIntersections(const FAABB3& LocalBounds, const TVisitor& Visitor) const
145 {
146 if (Elements.Num())
147 {
148 VisitAllIntersectionsRecursive(Elements[0], LocalBounds, Visitor);
149 }
150 }
151
152 // Begin ISpatialAcceleration interface
157 // End ISpatialAcceleration interface
158
160 {
161 return MGlobalObjects;
162 }
163
164 // TODO(mlentine): Need to move this elsewhere; probably on CollisionConstraint
166
167#if !UE_BUILD_SHIPPING
168 CHAOS_API virtual void DebugDraw(ISpacialDebugDrawInterface<T>* InInterface) const override;
169#endif
170
171 CHAOS_API void Serialize(FArchive& Ar);
172
173 virtual void Serialize(FChaosArchive& Ar) override
174 {
175 check(false);
176 }
177
178 private:
179 void PrintTree(FString Prefix, const TBVHNode<T,d>* MyNode) const
180 {
181 UE_LOG(LogChaos, Verbose, TEXT("%sNode has Box: (%f, %f, %f) to (%f, %f, %f) with %d Children"), *Prefix, MyNode->MMin[0], MyNode->MMin[1], MyNode->MMin[2], MyNode->MMax[0], MyNode->MMax[1], MyNode->MMax[2], MyNode->MChildren.Num());
182 for (auto& Child : MyNode->MChildren)
183 {
184 PrintTree(Prefix + " ", &Elements[Child]);
185 }
186 }
187
188 template<typename TVisitor>
189 void VisitAllIntersectionsRecursive(const TBVHNode<T, d>& MyNode, const FAABB3& ObjectBox, const TVisitor& Visitor) const
190 {
191 TAABB<T, d> Box(MyNode.MMin, MyNode.MMax);
192 if (!Box.Intersects(ObjectBox))
193 {
194 return;
195 }
196
197 if (MyNode.MChildren.Num() == 0)
198 {
199 Visitor(Leafs[MyNode.LeafIndex]);
200 return;
201 }
202
203 int32 NumChildren = MyNode.MChildren.Num();
204 for (int32 Child = 0; Child < NumChildren; ++Child)
205 {
206 VisitAllIntersectionsRecursive(Elements[MyNode.MChildren[Child]], ObjectBox, Visitor);
207 }
208 }
209
210
211 CHAOS_API TArray<int32> FindAllIntersectionsHelper(const TBVHNode<T,d>& MyNode, const TVector<T, d>& Point) const;
212 CHAOS_API TArray<int32> FindAllIntersectionsHelper(const TBVHNode<T,d>& MyNode, const TAABB<T, d>& ObjectBox) const;
213 CHAOS_API TArray<int32> FindAllIntersectionsHelper(const TBVHNode<T, d>& MyNode, const TSpatialRay<T, d>& Ray) const;
214
215 template <typename QUERY_OBJECT>
216 void FindAllIntersectionsHelperRecursive(const TBVHNode<T,d>& MyNode, const QUERY_OBJECT& ObjectBox, TArray<int32>& AccumulateElements) const;
217 void UpdateHierarchyImp(const TArray<int32>& AllObjects, const bool bAllowMultipleSplitting, const bool bUseVelocity, const T Dt);
218
219 int32 GenerateNextLevel(const TVector<T, d>& GlobalMin, const TVector<T, d>& GlobalMax, const TArray<int32>& Objects, const int32 Axis, const int32 Level, const bool AllowMultipleSplitting);
220 int32 GenerateNextLevel(const TVector<T, d>& GlobalMin, const TVector<T, d>& GlobalMax, const TArray<int32>& Objects, const int32 Level);
221
222 OBJECT_ARRAY const* MObjects;
223 TArray<int32> MGlobalObjects;
224 TMap<int32, TAABB<T, d>> MWorldSpaceBoxes;
225 TArray<int32> MScratchAllObjects;
226 int32 MMaxLevels;
227 TArray<TBVHNode<T,d>> Elements;
228 TArray<LEAF_TYPE> Leafs;
229 FCriticalSection CriticalSection;
230};
231
232template<class OBJECT_ARRAY, class LEAF_TYPE, class T, int d>
238
239}
#define check(expr)
Definition AssertionMacros.h:314
#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
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
return true
Definition ExternalRpcRegistry.cpp:601
#define UE_LOG(CategoryName, Verbosity, Format,...)
Definition LogMacros.h:270
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition ChaosArchive.h:167
Definition ISpatialAcceleration.h:166
Definition ISpatialAcceleration.h:267
virtual void DeepAssign(const ISpatialAcceleration< TPayloadType, T, d > &Other)
Definition ISpatialAcceleration.h:344
Definition BoundingVolumeHierarchy.h:60
TBoundingVolumeHierarchy()
Definition BoundingVolumeHierarchy.h:68
CHAOS_API void Serialize(FArchive &Ar)
Definition BoundingVolumeHierarchy.cpp:696
TBoundingVolumeHierarchy(TBoundingVolumeHierarchy< OBJECT_ARRAY, LEAF_TYPE, T, d > &&Other)
Definition BoundingVolumeHierarchy.h:78
TArray< int32 > FindAllIntersections(const TSpatialRay< T, d > &Ray) const
Definition BoundingVolumeHierarchy.h:154
TBoundingVolumeHierarchy & operator=(TBoundingVolumeHierarchy< OBJECT_ARRAY, LEAF_TYPE, T, d > &&Other)
Definition BoundingVolumeHierarchy.h:102
CHAOS_API const TAABB< T, d > & GetWorldSpaceBoundingBox(const TGeometryParticles< T, d > &InParticles, const int32 Index)
Definition BoundingVolumeHierarchy.cpp:43
TArray< int32 > FindAllIntersectionsImp(const T_INTERSECTION &Intersection) const
Definition BoundingVolumeHierarchy.h:127
TBoundingVolumeHierarchy & operator=(const TBoundingVolumeHierarchy< OBJECT_ARRAY, LEAF_TYPE, T, d > &Other)
Definition BoundingVolumeHierarchy.h:90
static constexpr T DefaultDt
Definition BoundingVolumeHierarchy.h:65
const TArray< int32 > & GlobalObjects() const
Definition BoundingVolumeHierarchy.h:159
virtual void Serialize(FChaosArchive &Ar) override
Definition BoundingVolumeHierarchy.h:173
static constexpr bool DefaultAllowMultipleSplitting
Definition BoundingVolumeHierarchy.h:63
CHAOS_API void UpdateHierarchy(const bool AllowMultipleSplitting=DefaultAllowMultipleSplitting, const bool bUseVelocity=DefaultUseVelocity, const T Dt=DefaultDt)
Definition BoundingVolumeHierarchy.cpp:93
typename TBVHLeafTraits< LEAF_TYPE, TModels_V< CComplexBVHLeaf, LEAF_TYPE > >::TPayloadType TPayloadType
Definition BoundingVolumeHierarchy.h:66
static constexpr int32 DefaultMaxLevels
Definition BoundingVolumeHierarchy.h:62
static constexpr bool DefaultUseVelocity
Definition BoundingVolumeHierarchy.h:64
void Reinitialize(const TArray< uint32 > &ActiveIndices, bool bUseVelocity, T Dt)
Definition BoundingVolumeHierarchy.h:121
void Reinitialize(bool bUseVelocity, T Dt)
Definition BoundingVolumeHierarchy.h:116
void VisitAllIntersections(const FAABB3 &LocalBounds, const TVisitor &Visitor) const
Definition BoundingVolumeHierarchy.h:144
TArray< int32 > FindAllIntersections(const FAABB3 &Box) const
Definition BoundingVolumeHierarchy.h:153
TBoundingVolumeHierarchy(const TBoundingVolumeHierarchy< OBJECT_ARRAY, LEAF_TYPE, T, d > &Other)=delete
virtual void DeepAssign(const ISpatialAcceleration< int32, T, d > &Other) override
Definition BoundingVolumeHierarchy.h:83
TArray< int32 > FindAllIntersections(const TVector< T, d > &Point) const
Definition BoundingVolumeHierarchy.h:155
Definition GeometryParticles.h:152
Definition ISpatialAcceleration.h:78
Definition Vector.h:41
Definition Archive.h:1208
Definition Array.h:670
Definition UnrealString.h.inl:34
Definition SkeletalMeshComponent.h:307
FChaosArchive & operator<<(FChaosArchive &Ar, FRigidParticleControlFlags &Flags)
Definition RigidParticleControlFlags.cpp:15
TAABB< FReal, 3 > FAABB3
Definition ImplicitObject.h:34
@ Visitor
Definition XmppMultiUserChat.h:94
@ false
Definition radaudio_common.h:23
U16 Index
Definition radfft.cpp:71
Definition BoundingVolumeHierarchy.h:33
auto Requires(typename T::TPayloadType) -> void
Definition BoundingVolumeHierarchy.h:43
TVector< T, d > MMin
Definition BoundingVolumeHierarchy.h:46
~TBVHNode()
Definition BoundingVolumeHierarchy.h:45
TArray< int32 > MChildren
Definition BoundingVolumeHierarchy.h:48
int32 MAxis
Definition BoundingVolumeHierarchy.h:47
TVector< T, d > MMax
Definition BoundingVolumeHierarchy.h:46
int32 LeafIndex
Definition BoundingVolumeHierarchy.h:49
TBVHNode()
Definition BoundingVolumeHierarchy.h:44
typename T::ElementType TPayloadType
Definition BoundingVolumeHierarchy.h:29
typename T::TPayloadType TPayloadType
Definition BoundingVolumeHierarchy.h:23
Definition BoundingVolumeHierarchy.h:17