21#include <unordered_set>
30template <
typename T,
bool>
35template <
typename TSOA>
68template<
typename TPayloadType,
typename T,
int d>
85template<
typename TPayloadType,
class T,
int d>
92template <
typename T,
int d>
109template <
typename T,
int d>
116template<
typename InPayloadType,
typename T = FReal,
int d = 3>
123 static constexpr int D = d;
134 template <
typename ParticleView>
149 , MaxPayloadBounds(
Other.MaxPayloadBounds)
150 , bIsEmpty(
Other.bIsEmpty)
157 , MGlobalPayloads(
Other.MGlobalPayloads)
160 , MDirtyElements(
Other.MDirtyElements)
161 , MPayloadInfo(
Other.MPayloadInfo)
162 , MaxPayloadBounds(
Other.MaxPayloadBounds)
163 , bIsEmpty(
Other.bIsEmpty)
179 MGlobalPayloads =
Other.MGlobalPayloads;
181 MElements =
Other.MElements;
182 MDirtyElements =
Other.MDirtyElements;
183 MPayloadInfo =
Other.MPayloadInfo;
184 MaxPayloadBounds =
Other.MaxPayloadBounds;
185 bIsEmpty =
Other.bIsEmpty;
196 MaxPayloadBounds =
Other.MaxPayloadBounds;
197 bIsEmpty =
Other.bIsEmpty;
206 template <
typename ParticleView>
219 CollectedResults.Add(
Instance.Payload);
222 const void* GetQueryData()
const {
return nullptr; }
223 const void* GetSimData()
const {
return nullptr; }
224 const void* GetQueryPayload()
const {
return nullptr; }
231 Overlap(Intersection, Collector);
238 MGlobalPayloads.Reset();
241 MDirtyElements.Reset();
242 MPayloadInfo.Reset();
257 RemoveElementFromExistingGrid(Payload, *
PayloadInfo);
260 MPayloadInfo.Remove(Payload);
275 RemoveElementFromExistingGrid(Payload, *
PayloadInfo);
322 return MGlobalPayloads;
331 template <
typename SQVisitor>
334 return RaycastImp(Start,
CurData, Visitor, Dir, InvDir, bParallel);
337 template <
typename SQVisitor>
345 template <
typename SQVisitor,
bool bPruneDuplicates = true>
358 template <
typename SQVisitor>
364 template <
typename SQVisitor,
bool bPruneDuplicates = true>
377 template <
typename SQVisitor>
383 template <
typename SQVisitor,
bool bPruneDuplicates = true>
419 Ar << MGlobalPayloads;
420 Ar << MaxPayloadBounds;
425 Ar << MDirtyElements;
443 const auto& Counts = MGrid.Counts();
444 for (
int32 X = 0;
X < Counts[0]; ++
X)
446 for (
int32 Y = 0;
Y < Counts[1]; ++
Y)
448 for (
int32 Z = 0;
Z < Counts[2]; ++
Z)
450 const auto& Elems = MElements(
X,
Y,
Z);
451 for (
const auto&
Elem : Elems)
468 const int32 GridCount = Counts[0] * Counts[1] * Counts[2] * MElements.Num();
469 return MGlobalPayloads.Num() + MDirtyElements.Num() +
GridCount;
474 return TAABB<T, d>(MGrid.MinCorner(), MGrid.MaxCorner());
490 MGlobalPayloads.RemoveAtSwap(
PayloadInfo.GlobalPayloadIdx);
493 template <
typename SQVisitor,
bool bPruneDuplicates = true>
498 for (
const auto&
Elem : MGlobalPayloads)
519 for (
const auto&
Elem : MDirtyElements)
546 TVector<int32, d> CellIdx;
548 InvDir, bParallel,
CurData.CurrentLength,
CurData.InvCurrentLength, TOI, NextStart);
551 CellIdx = MGrid.Cell(NextStart);
557 const auto& Elems = MElements(CellIdx);
560 for (
const auto&
Elem : Elems)
626 if (!bParallel[
Axis])
653 if (CellIdx[
Axis] < 0 || CellIdx[
Axis] >= MGrid.Counts()[
Axis])
659 NextStart = NextStart + Dir *
BestTime;
666 template <
typename SQVisitor,
bool bPruneDuplicates = true>
670 for (
const auto&
Elem : MGlobalPayloads)
692 for (
const auto&
Elem : MDirtyElements)
724 TVector<int32, d> CellIdx;
741 for (
const auto&
Elem : Elems)
771 const TVector<int32, 3> Idx(
X,
Y,
Z);
804 static const TVector<int32, 3>
Neighbors[] =
807 {-1, -1, -1}, {0, -1, -1}, {1, -1, -1},
808 {-1, 0, -1}, {0, 0, -1}, {1, 0, -1},
809 {-1, 1, -1}, {0, 1, -1}, {1, 1, -1},
812 {-1, -1, 0}, {0, -1, 0}, {1, -1, 0},
813 {-1, 0, 0}, {1, 0, 0},
814 {-1, 1, 0}, {0, 1, 0}, {1, 0, 0},
817 {-1, -1, 1}, {0, -1, 1}, {1, -1, 1},
818 {-1, 0, 1}, {0, 0, 1}, {1, 0, 1},
819 {-1, 1, 1}, {0, 1, 1}, {1, 1, 1}
822 for (
const TVector<int32, 3>& Neighbor :
Neighbors)
850 for (
const auto&
Elem : Elems)
905 template <
typename SQVisitor,
bool bPruneDuplicates = true>
908 for (
const auto&
Elem : MGlobalPayloads)
926 for (
const auto&
Elem : MDirtyElements)
951 const TVector<int32, d> StartIndex = MGrid.Cell(
QueryBounds.Min());
952 const TVector<int32, d> EndIndex = MGrid.Cell(
QueryBounds.Max());
955 for (
int32 X = StartIndex[0];
X <= EndIndex[0]; ++
X)
957 for (
int32 Y = StartIndex[1];
Y <= EndIndex[1]; ++
Y)
959 for (
int32 Z = StartIndex[2];
Z <= EndIndex[2]; ++
Z)
961 const auto& Elems = MElements(
X,
Y,
Z);
962 for (
const auto&
Elem : Elems)
993 template <
typename ParticleView>
996 MGlobalPayloads.Reset();
997 MPayloadInfo.Reset();
1000 if (!Particles.Num())
1011 HasBounds.
SetNum(Particles.Num());
1029 auto& GlobalPayloads = MGlobalPayloads;
1037 constexpr T
InvD = (T)1 / d;
1041 for (
auto& Particle : Particles)
1046 HasBounds[Idx] =
true;
1053 HasBounds[Idx] =
false;
1056 const int32 GlobalPayloadIdx = GlobalPayloads.Num();
1074 for (
auto& Particle : Particles)
1093 HasBounds[Idx] =
false;
1096 const int32 GlobalPayloadIdx = GlobalPayloads.Num();
1098 MPayloadInfo.Add(Payload, FPayloadInfo{ GlobalPayloadIdx,
INDEX_NONE});
1112 Cells += TVector<int32, d>(1);
1123#if ENABLE_NAN_DIAGNOSTIC
1126 UE_LOG(
LogChaos,
Error,
TEXT(
"BoundingVolume computed invalid GlobalBox from bounds: GlobalBox.Min(): (%f, %f, %f), GlobalBox.Max(): (%f, %f, %f)"),
1139 for (
auto& Particle : Particles)
1145 const auto StartIndex = MGrid.Cell(
ObjectBox.Min());
1146 const auto EndIndex = MGrid.Cell(
ObjectBox.Max());
1151 for (
int32 x = StartIndex[0]; x <= EndIndex[0]; ++x)
1153 for (
int32 y = StartIndex[1]; y <= EndIndex[1]; ++y)
1155 for (
int32 z = StartIndex[2]; z <= EndIndex[2]; ++z)
1157 MElements(x, y, z).Add({
ObjectBox, Payload, StartIndex, EndIndex });
1184 for (FCellElement&
Elem : Elems)
1186 if (
Elem.Payload == Payload)
1205 MDirtyElements.RemoveAtSwap(
PayloadInfo.DirtyPayloadIdx);
1214 if (
NewBounds.Extents().Max() > MaxPayloadBounds)
1225 if (bIsEmpty ==
false)
1228 TVector<int32, 3> StartIndex = MGrid.CellUnsafe(
NewBounds.Min());
1229 TVector<int32, 3> EndIndex = MGrid.CellUnsafe(
NewBounds.Max());
1231 bool bDirty =
false;
1234 if (StartIndex[
Axis] < 0 || EndIndex[
Axis] >= MGrid.Counts()[
Axis])
1247 for (
int32 x = StartIndex[0]; x <= EndIndex[0]; ++x)
1249 for (
int32 y = StartIndex[1]; y <= EndIndex[1]; ++y)
1251 for (
int32 z = StartIndex[2]; z <= EndIndex[2]; ++z)
1253 MElements(x, y, z).Add({
NewBounds, Payload, StartIndex, EndIndex });
1262 PayloadInfo.DirtyPayloadIdx = MDirtyElements.Num();
1263 MDirtyElements.Add({
NewBounds, Payload });
1267 PayloadInfo.GlobalPayloadIdx = MGlobalPayloads.Num();
1276 const auto StartIndex = MGrid.Cell(
ObjectBox.Min());
1277 const auto EndIndex = MGrid.Cell(
ObjectBox.Max());
1278 for (
int32 x = StartIndex[0]; x <= EndIndex[0]; ++x)
1280 for (
int32 y = StartIndex[1]; y <= EndIndex[1]; ++y)
1282 for (
int32 z = StartIndex[2]; z <= EndIndex[2]; ++z)
1290 Intersections.
Add(
Elem.Payload);
1302 for (
int32 i = Intersections.
Num() - 1; i > 0; i--)
1304 if (Intersections[i] == Intersections[i - 1])
1310 return Intersections;
1316 FGridSet(TVector<int32, 3>
Size)
1327 bool Contains(
const TVector<int32, 3>& Coordinate)
1330 int32 Idx = (NumY * NumZ) * Coordinate[0] + (NumZ * Coordinate[1]) + Coordinate[2];
1337 void Add(
const TVector<int32, 3>& Coordinate)
1340 int32 Idx = (NumY * NumZ) * Coordinate[0] + (NumZ * Coordinate[1]) + Coordinate[2];
1367 friend ::FChaosVDDataWrapperUtils;
1370template<
typename TPayloadType,
class T,
int d>
1377template<
typename TPayloadType,
class T,
int d>
1384#if !UE_MERGED_MODULES
1385#if PLATFORM_COMPILER_CLANG
#define check(expr)
Definition AssertionMacros.h:314
#define ensure( InExpression)
Definition AssertionMacros.h:464
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define DECLARE_CYCLE_STAT(CounterName, StatId, GroupId)
Definition Stats.h:669
#define SCOPE_CYCLE_COUNTER(Stat)
Definition Stats.h:650
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
return true
Definition ExternalRpcRegistry.cpp:601
#define UE_LOG(CategoryName, Verbosity, Format,...)
Definition LogMacros.h:270
FORCEINLINE void VectorStoreDouble3(VectorRegister4Double Vec, double *Ptr)
Definition UnrealMathVectorCommon.h.inl:825
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint32 Size
Definition VulkanMemory.cpp:4034
Definition ChaosArchive.h:167
Definition ISpatialAcceleration.h:267
virtual void DeepAssign(const ISpatialAcceleration< TPayloadType, T, d > &Other)
Definition ISpatialAcceleration.h:344
Definition ISpatialAcceleration.h:120
static FORCEINLINE TAABB< T, d > EmptyAABB()
Definition AABB.h:623
Definition BoundingVolume.h:118
virtual TUniquePtr< ISpatialAcceleration< TPayloadType, T, d > > Copy() const override
Definition BoundingVolume.h:201
virtual void DeepAssign(const ISpatialAcceleration< TPayloadType, T, d > &Other) override
Definition BoundingVolume.h:169
bool RaycastFast(const TVector< T, d > &Start, FQueryFastData &CurData, SQVisitor &Visitor, const FVec3 &Dir, const FVec3 InvDir, const bool bParallel[3]) const
Definition BoundingVolume.h:332
static constexpr T DefaultMaxPayloadBounds
Definition BoundingVolume.h:126
virtual void Serialize(FChaosArchive &Ar) override
Definition BoundingVolume.h:403
void AddElement(const TPayloadBoundsElement< TPayloadType, T > &Payload)
Definition BoundingVolume.h:299
void GatherElements(TArray< TPayloadBoundsElement< TPayloadType, T > > &OutElements) const
Definition BoundingVolume.h:433
static constexpr int32 DefaultMaxCells
Definition BoundingVolume.h:125
virtual TArray< TPayloadType > FindAllIntersections(const FAABB3 &Box) const override
Definition BoundingVolume.h:318
TAABB< T, d > GetBounds() const
Definition BoundingVolume.h:472
void Sweep(const TVector< T, d > &Start, const TVector< T, d > &Dir, const T Length, const TVector< T, d > QueryHalfExtents, SQVisitor &Visitor) const
Definition BoundingVolume.h:365
InPayloadType TPayloadType
Definition BoundingVolume.h:120
TBoundingVolume< TPayloadType, T, d > & operator=(const TBoundingVolume< TPayloadType, T, d > &Other)
Definition BoundingVolume.h:176
TArray< TPayloadType > FindAllIntersectionsImp(const TAABB< T, d > &Intersection) const
Definition BoundingVolume.h:212
bool RaycastFastSimd(const VectorRegister4Double &Start, FQueryFastData &CurData, SQVisitor &Visitor, const VectorRegister4Double &Dir, const VectorRegister4Double &InvDir, const VectorRegister4Double &Parallel, const VectorRegister4Double &Length) const
Definition BoundingVolume.h:338
bool OverlapFast(const TAABB< T, d > &QueryBounds, SQVisitor &Visitor) const
Definition BoundingVolume.h:378
static constexpr ESpatialAcceleration StaticType
Definition BoundingVolume.h:127
int32 GetReserveCount() const
Definition BoundingVolume.h:464
TBoundingVolume(const ParticleView &Particles, const bool bUseVelocity=false, const T Dt=0, const int32 MaxCells=DefaultMaxCells, const T InMaxPayloadBounds=DefaultMaxPayloadBounds)
Definition BoundingVolume.h:135
void Reinitialize(const ParticleView &Particles, const bool bUseVelocity=false, const T Dt=0, const int32 MaxCells=DefaultMaxCells)
Definition BoundingVolume.h:207
T TType
Definition BoundingVolume.h:122
void Raycast(const TVector< T, d > &Start, const TVector< T, d > &Dir, const T Length, SQVisitor &Visitor) const
Definition BoundingVolume.h:346
virtual bool UpdateElement(const TPayloadType &Payload, const TAABB< T, d > &NewBounds, bool bHasBounds) override
Definition BoundingVolume.h:266
virtual void Reset() override
Definition BoundingVolume.h:236
void UpdateElementWithoutDirty(const TPayloadType &Payload, const TAABB< T, 3 > &NewBounds)
Definition BoundingVolume.h:293
static constexpr int D
Definition BoundingVolume.h:123
bool SweepFast(const TVector< T, d > &Start, FQueryFastData &CurData, const TVector< T, d > &QueryHalfExtents, SQVisitor &Visitor, const FVec3 &Dir, const FVec3 InvDir, const bool bParallel[3]) const
Definition BoundingVolume.h:359
void SetDirtyState(const bool bDirtyState)
Definition BoundingVolume.h:400
TBoundingVolume(const TBoundingVolume< TPayloadType, T, d > &Other)
Definition BoundingVolume.h:155
TBoundingVolume()
Definition BoundingVolume.h:128
virtual void Overlap(const TAABB< T, d > &QueryBounds, ISpatialVisitor< TPayloadType, T > &Visitor) const override
Definition BoundingVolume.h:371
bool IsLeafDirty() const
Definition BoundingVolume.h:392
const TArray< TPayloadBoundsElement< TPayloadType, T > > & GlobalObjects() const
Definition BoundingVolume.h:320
void RecomputeBounds(bool bDynamicTree)
Definition BoundingVolume.h:305
void Overlap(const TAABB< T, d > &QueryBounds, SQVisitor &Visitor) const
Definition BoundingVolume.h:384
virtual bool RemoveElement(const TPayloadType &Payload) override
Definition BoundingVolume.h:246
int32 GetElementCount()
Definition BoundingVolume.h:309
void Sweep(const TVector< T, d > &Start, const TVector< T, d > &Dir, const T Length, const TVector< T, d > QueryHalfExtents, ISpatialVisitor< TPayloadType, T > &Visitor) const override
Definition BoundingVolume.h:352
TBoundingVolume(TBoundingVolume< TPayloadType, T, d > &&Other)
Definition BoundingVolume.h:142
TPayloadType PayloadType
Definition BoundingVolume.h:121
TBoundingVolume< TPayloadType, T, d > & operator=(TBoundingVolume< TPayloadType, T, d > &&Other)
Definition BoundingVolume.h:189
virtual void Raycast(const TVector< T, d > &Start, const TVector< T, d > &Dir, const T Length, ISpatialVisitor< TPayloadType, T > &Visitor) const override
Definition BoundingVolume.h:325
static void SerializeAsAABB(FArchive &Ar, TAABB< T, d > &AABB)
Definition Box.h:467
Definition ISpatialAcceleration.h:453
virtual void Serialize(void *V, int64 Length) override
Definition ArchiveProxy.h:97
Definition Archive.h:1208
virtual CORE_API void UsingCustomVersion(const struct FGuid &Guid)
Definition Archive.cpp:590
CORE_API int32 CustomVer(const struct FGuid &Key) const
Definition Archive.cpp:602
Definition IConsoleManager.h:1580
Definition ChaosVDDataWrapperUtils.h:77
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_FORCEINLINE_HINT void RemoveAtSwap(SizeType Index, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2185
void SetNum(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2308
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
UE_FORCEINLINE_HINT void Reserve(SizeType Number)
Definition Array.h:3016
Definition UniquePtr.h:107
UE_REWRITE void Sort(RangeType &&Range)
Definition Sort.h:16
GeometryCollection::Facades::FMuscleActivationData Data
Definition MuscleActivationConstraints.h:15
Definition SkeletalMeshComponent.h:307
ESpatialAcceleration
Definition ISpatialAcceleration.h:180
@ Y
Definition SimulationModuleBase.h:153
@ X
Definition SimulationModuleBase.h:152
FChaosArchive & operator<<(FChaosArchive &Ar, FRigidParticleControlFlags &Flags)
Definition RigidParticleControlFlags.cpp:15
TAABB< T, d > ComputeWorldSpaceBoundingBox(const TParticles< T, d > &Objects, const int32 i, bool bUseVelocity=false, T Dt=0)
Definition BoundingVolumeUtilities.h:167
@ Add
Definition PendingSpatialData.h:18
bool PrePreFilterHelper(const FAccelerationStructureHandle &Payload, const Private::FSimOverlapVisitor &Visitor)
Definition SpatialAccelerationBroadPhase.h:323
bool HasBoundingBox(const OBJECT_ARRAY &Objects, const int32 i)
Definition BoundingVolumeUtilities.h:97
@ Raycast
Definition SimulationModuleBase.h:145
TVector< FReal, 3 > FVec3
Definition Core.h:17
TEnableIf<!TIsPointer< TPayload >::Value, FUniqueIdx >::Type GetUniqueIdx(const TPayload &Payload)
Definition ISpatialAcceleration.h:196
@ Contains
Definition AutomationTest.h:160
@ Visitor
Definition XmppMultiUserChat.h:94
const FColor Neighbor(0, 192, 128)
constexpr double Epsilon
Definition SlopeUtils.h:114
@ Start
Definition GeoEnum.h:100
@ false
Definition radaudio_common.h:23
Definition BoundingVolume.h:48
auto Requires(typename T::THandleType) -> void
Definition ISpatialAcceleration.h:14
Definition BoundingVolume.h:70
TVector< int32, 3 > StartIdx
Definition BoundingVolume.h:73
TVector< int32, 3 > EndIdx
Definition BoundingVolume.h:74
void Serialize(FChaosArchive &Ar)
Definition BoundingVolume.h:76
TPayloadType Payload
Definition BoundingVolume.h:72
TAABB< T, d > Bounds
Definition BoundingVolume.h:71
Definition BoundingVolume.h:94
int32 GlobalPayloadIdx
Definition BoundingVolume.h:95
TVector< int32, d > EndIdx
Definition BoundingVolume.h:98
void Serialize(FArchive &Ar)
Definition BoundingVolume.h:100
int32 DirtyPayloadIdx
Definition BoundingVolume.h:96
TVector< int32, d > StartIdx
Definition BoundingVolume.h:97
Definition ISpatialAcceleration.h:226
TPayloadType Payload
Definition ISpatialAcceleration.h:227
Definition ISpatialAcceleration.h:99
Definition BoundingVolume.h:54
static int32 FilterFarBodies
Definition BoundingVolume.h:55
static FAutoConsoleVariableRef CVarFilterFarBodies
Definition BoundingVolume.h:56
CORE_API static const FGuid GUID
Definition ExternalPhysicsCustomObjectVersion.h:144
@ GlobalElementsHaveBounds
Definition ExternalPhysicsCustomObjectVersion.h:28
static UE_FORCEINLINE_HINT void * Memzero(void *Dest, SIZE_T Count)
Definition UnrealMemory.h:131
Definition NumericLimits.h:41
typename TSOA::THandleType TPayloadType
Definition BoundingVolume.h:38
int32 TPayloadType
Definition BoundingVolume.h:44
Definition BoundingVolume.h:32
Definition UnrealMathFPU.h:42