UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ISpatialAcceleration.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3#include "Chaos/Vector.h"
4#include "Chaos/Box.h"
6#include "ChaosCheck.h"
8#include "Containers/HashTable.h"
9
10namespace Chaos
11{
12
14{
16 : Dir(InDir)
17 , InvDir( (FMath::Abs(InDir[0]) < UE_SMALL_NUMBER) ? 0 : 1 / Dir[0], (FMath::Abs(InDir[1]) < UE_SMALL_NUMBER) ? 0 : 1 / Dir[1], (FMath::Abs(InDir[2]) < UE_SMALL_NUMBER) ? 0 : 1 / Dir[2])
19 {
20 CHAOS_ENSURE(InLength != 0.0f);
22 }
23
24 const FVec3& Dir;
26
29
30 const bool bParallel[3];
31
32#ifdef _MSC_VER
33 #pragma warning (push)
34 #pragma warning(disable:4723)
35#endif
36 //compiler complaining about divide by 0, but we are guarding against it.
37 //Seems like it's trying to evaluate div independent of the guard?
38
40 {
42
43 if(InLength != 0.0f)
44 {
46 }
47 }
48
49#ifdef _MSC_VER
50 #pragma warning(pop)
51#endif
52
53
54protected:
57 , InvDir()
58 , bParallel{}
59 {}
60};
61
62//dummy struct for templatized paths
69
70template <typename T, int d>
71class TAABB;
72
73template <typename T, int d>
75
76template <typename T, int d>
78{
79public:
81 : Start((T)0)
82 , End((T)0)
83 {}
84
89
92};
93
97template <typename TPayloadType>
99{
100 TPayloadType Payload;
101 TSpatialVisitorData(const TPayloadType& InPayload, const bool bInHasBounds = false, const FAABB3& InBounds = FAABB3::ZeroAABB())
105 , Bounds(InBounds)
106 { }
107 bool bHasBounds;
108 FAABB3 Bounds;
109#else
110 { }
111#endif
112};
113
118template <typename TPayloadType, typename T = FReal>
120{
121public:
122
123 virtual ~ISpatialVisitor() = default;
124
130
137
144
145 virtual const void* GetQueryData() const { return nullptr; }
146
147 virtual const void* GetSimData() const { return nullptr; }
148
149 virtual bool ShouldIgnore(const TSpatialVisitorData<TPayloadType>& Instance) const { return false; }
150
152 virtual const void* GetQueryPayload() const { return nullptr; }
153
154 virtual bool HasBlockingHit() const { return false; }
155};
156
164template <typename T>
166{
167public:
168
169 virtual ~ISpacialDebugDrawInterface() = default;
170
171 virtual void Box(const TAABB<T, 3>& InBox, const TVector<T, 3>& InLinearColor, float InThickness) = 0;
172 virtual void Line(const TVector<T, 3>& InBegin, const TVector<T, 3>& InEnd, const TVector<T, 3>& InLinearColor, float InThickness) = 0;
173
174};
175
177
178using SpatialAccelerationType = uint8; //see ESpatialAcceleration. Projects can add their own custom types by using enum values higher than ESpatialAcceleration::Unknown
180{
182 AABBTree,
185 Unknown,
186 //For custom types continue the enum after ESpatialAcceleration::Unknown
187};
188
194
195template <typename TPayload>
197{
198 const FUniqueIdx Idx = Payload.UniqueIdx();
199 ensure(Idx.IsValid());
200 return Idx;
201}
202
203template <typename TPayload>
205{
206 const FUniqueIdx Idx = Payload->UniqueIdx();
207 ensure(Idx.IsValid());
208 return Idx;
209}
210
212{
213 ensure(Payload >=0); //-1 idx implies it was never set
214 return FUniqueIdx(Payload);
215}
216
218{
219 ensure(Payload.IsValid());
220 return Payload;
221}
222
223
224template <typename TPayloadType, typename T>
226{
227 TPayloadType Payload;
229
231 {
232 Ar << Payload;
234 }
235
236 template <typename TPayloadType2>
237 TPayloadType2 GetPayload(int32 Idx) const { return Payload; }
238
239 bool HasBoundingBox() const { return true; }
240
241 const TAABB<T, 3>& BoundingBox() const { return Bounds; }
242
244 {
245 return ::Chaos::GetUniqueIdx(Payload);
246 }
247};
248
249template <typename TPayloadType, typename T>
255
256template<typename TPayloadType, typename T, int d>
257class ISpatialAcceleration;
258
259template<ESpatialAcceleration SpatialType, typename TPayloadType, typename T, int d>
264
265template <typename TPayloadType, typename T, int d>
267{
268public:
270
271 using TPayload = TPayloadType;
272
276
280
281 virtual ~ISpatialAcceleration() = default;
282
283 virtual bool IsAsyncTimeSlicingComplete() { return AsyncTimeSlicingComplete; }
284 virtual void ProgressAsyncTimeSlicing(bool ForceBuildCompletion = false) {}
285 virtual bool ShouldRebuild() { return true; } // Used to find out if something changed since last reset for optimizations
286 virtual bool IsTreeDynamic() const { return false; } // Dynamic trees rebuild on the fly without adding dirty elements
287 virtual void ClearShouldRebuild() {}
290
292 virtual void CacheOverlappingLeaves() {}
293
294 // IMPORTANT : (LWC) this API should be typed on Freal not T, as we want the query API to be using the highest precision while maintaining arbitrary internal precision for the acceleration structure ( based on T )
296 virtual void Raycast(const FVec3& Start, const FVec3& Dir, const FReal Length, ISpatialVisitor<TPayloadType, FReal>& Visitor) const { check(false); }
297 virtual void Sweep(const FVec3& Start, const FVec3& Dir, const FReal Length, const FVec3 QueryHalfExtents, ISpatialVisitor<TPayloadType, FReal>& Visitor) const { check(false);}
298 virtual void Overlap(const FAABB3& QueryBounds, ISpatialVisitor<TPayloadType, FReal>& Visitor) const { check(false); }
299
300 virtual void Reset()
301 {
302 check(false);
303 }
304
305 // Returns true if element was removed successfully
306 virtual bool RemoveElement(const TPayloadType& Payload)
307 {
308 check(false); //not implemented
309 return true;
310 }
311
312 virtual bool NeedUpdateElement(const TPayloadType& Payload, const TAABB<T, 3>& NewBounds)
313 {
314 return true;
315 }
316
317 virtual bool UpdateElement(const TPayloadType& Payload, const TAABB<T, d>& NewBounds, bool bHasBounds)
318 {
319 check(false);
320 return true;
321 }
322
323 virtual bool RemoveElementFrom(const TPayloadType& Payload, FSpatialAccelerationIdx Idx)
324 {
325 return RemoveElement(Payload);
326 }
327
328 virtual bool NeedUpdateElementIn(const TPayloadType& Payload, const TAABB<T, d>& NewBounds, FSpatialAccelerationIdx Idx)
329 {
330 return NeedUpdateElement(Payload, NewBounds);
331 }
332
333 virtual bool UpdateElementIn(const TPayloadType& Payload, const TAABB<T, d>& NewBounds, bool bHasBounds, FSpatialAccelerationIdx Idx)
334 {
335 return UpdateElement(Payload, NewBounds, bHasBounds);
336 }
337
339 {
340 check(false); //not implemented
341 return nullptr;
342 }
343
345 {
346 Type = Other.Type;
347 SyncTimestamp = Other.SyncTimestamp;
348 AsyncTimeSlicingComplete = Other.AsyncTimeSlicingComplete;
349 }
350
351#if !UE_BUILD_SHIPPING
354 virtual void DumpStats() const {}
355 virtual void DumpStatsTo(class FOutputDevice& Ar) const {}
356#endif
357
376
377 virtual void Serialize(FChaosArchive& Ar)
378 {
379 check(false);
380 }
381
382 SpatialAccelerationType GetType() const { return Type; }
383
384 template <typename TConcrete>
386 {
387 return Type == TConcrete::StaticType ? static_cast<TConcrete*>(this) : nullptr;
388 }
389
390 template <typename TConcrete>
391 const TConcrete* As() const
392 {
393 return Type == TConcrete::StaticType ? static_cast<const TConcrete*>(this) : nullptr;
394 }
395
396 template <typename TConcrete>
398 {
399 check(Type == TConcrete::StaticType);
400 return static_cast<TConcrete&>(*this);
401 }
402
403 template <typename TConcrete>
404 const TConcrete& AsChecked() const
405 {
406 check(Type == TConcrete::StaticType);
407 return static_cast<const TConcrete&>(*this);
408 }
409
412 {
413 return SyncTimestamp;
414 }
415
418 {
419 SyncTimestamp = InTimestamp;
420 }
421
422protected:
423 virtual void SetAsyncTimeSlicingComplete(bool InState) { AsyncTimeSlicingComplete = InState; }
424
425private:
426 int32 SyncTimestamp; //The set of inputs the acceleration structure is in sync with. GT moves forward in time and enqueues inputs
427 bool AsyncTimeSlicingComplete;
429};
430
431template <typename TBase, typename TDerived>
432static TUniquePtr<TDerived> AsUniqueSpatialAcceleration(TUniquePtr<TBase>&& Base)
433{
434 if (TDerived* Derived = Base->template As<TDerived>())
435 {
436 (void)Base.Release();
438 }
439 return nullptr;
440}
441
442template <typename TDerived, typename TBase>
443static TUniquePtr<TDerived> AsUniqueSpatialAccelerationChecked(TUniquePtr<TBase>&& Base)
444{
446 (void)Base.Release();
448}
449
451template <typename TPayloadType, typename T>
453{
454public:
461
466
471
472 FORCEINLINE const void* GetQueryData() const
473 {
474 return Visitor.GetQueryData();
475 }
476
477 FORCEINLINE const void* GetSimData() const
478 {
479 return Visitor.GetSimData();
480 }
481
483 {
484 return Visitor.ShouldIgnore(Instance);
485 }
486
488 FORCEINLINE const void* GetQueryPayload() const
489 {
490 return Visitor.GetQueryPayload();
491 }
492
494 {
495 return Visitor.HasBlockingHit();
496 }
497
498private:
500};
501
502#ifndef CHAOS_SERIALIZE_OUT
503#define CHAOS_SERIALIZE_OUT WITH_EDITOR
504#endif
505
506//Provides a TMap like API but backed by a dense array. The keys provided must implement GetUniqueIdx
507template <typename TKey, typename TValue>
509{
510 struct FEntry
511 {
512 TValue Value;
513 bool bSet;
514
515 FEntry()
516 : bSet(false)
517 {
518
519 }
520 };
521
522public:
523 // @todo(chaos): rename with "F"
524 using ElementType = TValue;
525
526 static constexpr uint32 GetTypeSize()
527 {
528 return sizeof(FEntry);
529 }
530
532 {
533 SIZE_T AllocatedSize = Entries.GetAllocatedSize();
534
535#if CHAOS_SERIALIZE_OUT
536 AllocatedSize += KeysToSerializeOut.GetAllocatedSize();
537#endif
538
539 return AllocatedSize;
540 }
541
543 {
544 return Entries.Max();
545 }
546
547 // @todo(chaos): rename with "F"
548 struct Element
549 {
550#if CHAOS_SERIALIZE_OUT
552#endif
553 TValue Entry;
554 };
555
556 int32 Num() const
557 {
558 return Entries.Num();
559 }
560
562 {
563 Entries.Reserve(Size);
564#if CHAOS_SERIALIZE_OUT
565 KeysToSerializeOut.Reserve(Size);
566#endif
567 }
568
569 TValue* Find(const TKey& Key)
570 {
571 const int32 Idx = GetUniqueIdx(Key).Idx;
572 if(Entries.IsValidIndex(Idx) && Entries[Idx].bSet)
573 {
574 return &Entries[Idx].Value;
575 }
576 return nullptr;
577 }
578
579 const TValue* Find(const TKey& Key) const
580 {
581 const int32 Idx = GetUniqueIdx(Key).Idx;
582 if(Idx < Entries.Num() && Entries[Idx].bSet)
583 {
584 return &Entries[Idx].Value;
585 }
586 return nullptr;
587 }
588
589 TValue& FindChecked(const TKey& Key)
590 {
591 return Entries[GetUniqueIdx(Key).Idx].Value;
592 }
593
594 const TValue& FindChecked(const TKey& Key) const
595 {
596 return Entries[GetUniqueIdx(Key).Idx].Value;
597 }
598
599 TValue& FindOrAdd(const TKey& Key)
600 {
601 if(TValue* Elem = Find(Key))
602 {
603 return *Elem;
604 }
605
606 return Add(Key);
607 }
608
609 void Empty()
610 {
611 Entries.Empty();
612 }
613
614 TValue& Add(const TKey& Key)
615 {
616 const int32 Idx = GetUniqueIdx(Key).Idx;
617 if(Idx >= Entries.Num())
618 {
619 const int32 NumToAdd = Idx + 1 - Entries.Num();
620 Entries.AddDefaulted(NumToAdd);
621#if CHAOS_SERIALIZE_OUT
622 KeysToSerializeOut.AddDefaulted(NumToAdd);
623#endif
624 }
625
626 ensure(Entries[Idx].bSet == false); //element already added
627 Entries[Idx].bSet = true;
628
629#if CHAOS_SERIALIZE_OUT
630 KeysToSerializeOut[Idx] = Key;
631#endif
632
633 return Entries[Idx].Value;
634 }
635
636 void Add(const TKey& Key, const TValue& Value)
637 {
638 Add(Key) = Value;
639 }
640
641 void RemoveChecked(const TKey& Key)
642 {
643 const int32 Idx = GetUniqueIdx(Key).Idx;
644 Entries[Idx] = FEntry(); //Mark as free, also resets default values for next use of value
645#if CHAOS_SERIALIZE_OUT
646 KeysToSerializeOut[Idx] = TKey();
647#endif
648 }
649
650 void Remove(const TKey& Key)
651 {
652 const int32 Idx = GetUniqueIdx(Key).Idx;
653 if(Idx >= 0 && Idx < Entries.Num())
654 {
655 Entries[Idx] = FEntry(); //Mark as free, also resets default values for next use of value
656#if CHAOS_SERIALIZE_OUT
657 KeysToSerializeOut[Idx] = TKey();
658#endif
659 }
660 }
661
662 void Reset()
663 {
664 Entries.Reset();
665#if CHAOS_SERIALIZE_OUT
666 KeysToSerializeOut.Reset();
667#endif
668 }
669
671 {
672 bool bCanSerialize = Ar.IsLoading();
673#if CHAOS_SERIALIZE_OUT
674 bCanSerialize = true;
675#endif
676
677 if(bCanSerialize)
678 {
680 Ar << DirectKeys;
681
682 for(auto& Key : DirectKeys)
683 {
684 TValue& Value = Add(Key);
685 Ar << Value;
686 }
687 }
688 else
689 {
690 CHAOS_ENSURE(false); //can't serialize out, if you are trying to serialize for perf/debug set CHAOS_SERIALIZE_OUT to 1
691 }
692 }
693
694 void AddFrom(const TArrayAsMap<TKey, TValue>& Source, int32 SourceIndex)
695 {
696 Entries.Add(Source.Entries[SourceIndex]);
697#if CHAOS_SERIALIZE_OUT
698 KeysToSerializeOut.Add(Source.KeysToSerializeOut[SourceIndex]);
699#endif
700 }
701
702private:
703
704 TArray<FEntry> Entries;
705
706#if CHAOS_SERIALIZE_OUT
707 //The indices are generated at runtime, so there's no way to serialize them directly
708 //Because of that we serialize the actual key which we can find, and then at runtime we use its transient index
710#endif
711};
712
713template <typename TKey, typename TValue>
715{
716 SQMapKeyWithValue() = default;
717 SQMapKeyWithValue(const TKey& InKey, const TValue& InValue)
718 : Key(InKey)
719 , Value(InValue)
720 {}
721
722 TKey Key;
723 TValue Value;
724};
725
726template <typename TKey, typename TValue>
728{
729 Ar << Pair.Key;
730 Ar << Pair.Value;
731
732 return Ar;
733}
734
736{
737public:
739 {
740 return IndexSize == 0 ? 0 : (IndexSize + HashSize) * sizeof(uint32);
741 }
742
744 {
745 return IndexSize;
746 }
747};
748
755template <typename TKey, typename TValue>
757{
758public:
759
760 using ElementType = TValue;
762
763 static constexpr uint32 GetTypeSize()
764 {
765 return sizeof(PairType);
766 }
767
769 {
770 return Elements.GetAllocatedSize() + HashTable.GetAllocatedSize();
771 }
772
773 int32 Num() const
774 {
775 return Elements.Num();
776 }
777
779 {
780 return HashTable.GetIndexSize();
781 }
782
784 {
785 Elements.Reserve(NumToReserve);
786
787 // FHashTable requires powers of two but doesn't assert it.
788 const uint32 RequiredSize = FMath::RoundUpToPowerOfTwo(NumToReserve + 1);
789
790 // #TODO should we allow SQ shrinking?
792 {
794 }
795 }
796
798 {
799 const uint32 NumElements = Elements.Num();
800 HashTable.Clear(NewSize, FMath::RoundUpToPowerOfTwo(NumElements + 1));
801
802 // Rehash the elements, we don't use the other Add function here
803 // as that will search for the element and we know it's not in here
804 // as we're building a new hash table
805 for(uint32 ElemIdx = 0; ElemIdx < NumElements; ++ElemIdx)
806 {
809 }
810 }
811
812 TValue* Find(const TKey& Key)
813 {
814 int32 Index = FindIndex(Key);
815
816 if(Index != INDEX_NONE)
817 {
818 return &Elements[Index].Value;
819 }
820
821 return nullptr;
822 }
823
824 const TValue* Find(const TKey& Key) const
825 {
826 int32 Index = FindIndex(Key);
827
828 if(Index != INDEX_NONE)
829 {
830 return &Elements[Index].Value;
831 }
832
833 return nullptr;
834 }
835
836 TValue& FindChecked(const TKey& Key)
837 {
838 int32 Index = FindIndex(Key);
840 return Elements[Index].Value;
841 }
842
843 const TValue& FindChecked(const TKey& Key) const
844 {
845 int32 Index = FindIndex(Key);
847 return Elements[Index].Value;
848 }
849
850 TValue& FindOrAdd(const TKey& Key)
851 {
852 const int32 KeyIndex = GetUniqueIdx(Key).Idx;
853 const uint32 Hash = MurmurFinalize32(KeyIndex);
854 int32 Index = FindIndex(Hash, KeyIndex);
855
856 if(Index == INDEX_NONE)
857 {
858 return Add(Hash, Key);
859 }
860
861 return Elements[Index].Value;
862 }
863
864 void Empty()
865 {
866 Elements.Empty();
867 HashTable.Free();
868 }
869
870 FORCEINLINE TValue& Add(const TKey& Key)
871 {
872 return Add(MurmurFinalize32(GetUniqueIdx(Key).Idx), Key);
873 }
874
875 FORCEINLINE TValue& Add(uint32 InHash, const TKey& Key)
876 {
878
880 {
881 Elements.Emplace(Key, TValue{});
882 ExistingIndex = Elements.Num() - 1;
884 }
885
886 return Elements[ExistingIndex].Value;
887 }
888
889 void Add(const TKey& Key, const TValue& Value)
890 {
891 Add(Key) = Value;
892 }
893
894 void RemoveChecked(const TKey& Key)
895 {
896 const int32 NumBefore = Elements.Num();
897 Remove(Key);
898 check(NumBefore > Elements.Num());
899 }
900
901 void Remove(const TKey& Key)
902 {
903 const int32 KeyIndex = GetUniqueIdx(Key).Idx;
904 const uint32 Hash = MurmurFinalize32(KeyIndex);
905 const int32 Index = FindIndex(Hash, KeyIndex);
906
907 if(Index != INDEX_NONE)
908 {
910
911 // Before removing from the array, if we have more than 1 element we
912 // swap the back element into the empty slot and rehash it. Maybe
913 // we should use a freelist? (profile this)
914 const int32 NumElems = Elements.Num();
915 const int32 BackIndex = NumElems - 1;
916 if(NumElems > 1)
917 {
918 if(Index == BackIndex)
919 {
920 // If we're already the back element, there's nothing to re-add
921 Elements.RemoveAtSwap(Index, EAllowShrinking::No);
922 }
923 else
924 {
925 PairType& BackPair = Elements[NumElems - 1];
927 HashTable.Remove(BackHash, NumElems - 1);
928 Elements.RemoveAtSwap(Index, EAllowShrinking::No);
930 }
931 }
932 else
933 {
934 Elements.Reset();
935 }
936 }
937 }
938
939 void Reset()
940 {
941 Elements.Reset();
943 }
944
945 FORCEINLINE int32 FindIndex(const TKey& Key) const
946 {
947 const int32 KeyIndex = GetUniqueIdx(Key).Idx;
948 return FindIndex(MurmurFinalize32(KeyIndex), KeyIndex);
949 }
950
952 {
954 {
955 if(GetUniqueIdx(Elements[i].Key).Idx == UniqueIndex)
956 {
957 return i;
958 }
959 }
960
961 return INDEX_NONE;
962 }
963
965 {
966 Ar << Elements;
967
968 if(Ar.IsLoading())
969 {
970 const uint32 NumElements = Elements.Num();
971 HashTable.Clear(1024, FMath::RoundUpToPowerOfTwo(NumElements));
972 for(uint32 i = 0; i < NumElements; ++i)
973 {
975 }
976 }
977 }
978
979 void AddFrom(const TSQMap<TKey, TValue>& Source, int32 SourceIndex)
980 {
981 const PairType& SourcePair = Source.Elements[SourceIndex];
982 Add(SourcePair.Key, SourcePair.Value);
983 }
984
987};
988
989template <typename TKey, typename TValue>
995
996template <typename TKey, typename TValue>
998{
999 Map.Serialize(Ar);
1000 return Ar;
1001}
1002
1003template <typename TPayload, typename TVisitor>
1004typename TEnableIf<!TIsPointer<TPayload>::Value, bool>::Type PrePreFilterHelper(const TPayload& Payload, const TVisitor& Visitor)
1005{
1006 if (Visitor.ShouldIgnore(Payload))
1007 {
1008 return true;
1009 }
1010 if (const void* QueryData = Visitor.GetQueryData())
1011 {
1012 return Payload.PrePreQueryFilter(QueryData);
1013 }
1014 if (const void* SimData = Visitor.GetSimData())
1015 {
1016 return Payload.PrePreSimFilter(SimData);
1017 }
1018 return false;
1019}
1020
1021template <typename TPayload, typename TVisitor>
1022typename TEnableIf<TIsPointer<TPayload>::Value, bool>::Type PrePreFilterHelper(const TPayload& Payload, const TVisitor& Visitor)
1023{
1024 return false;
1025}
1026
1027template <typename TVisitor>
1028FORCEINLINE bool PrePreFilterHelper(const int32 Payload, const TVisitor& Visitor)
1029{
1030 return false;
1031}
1032
1033#if !UE_MERGED_MODULES
1034#if PLATFORM_COMPILER_CLANG
1035extern template class CHAOS_API ISpatialAcceleration<int32, FReal, 3>;
1036extern template class CHAOS_API ISpatialVisitor<int32, FReal>;
1037#else
1038extern template class ISpatialAcceleration<int32, FReal, 3>;
1039extern template class ISpatialVisitor<int32, FReal>;
1040#endif
1041#endif
1042
1043}
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 CHAOS_ENSURE(Condition)
Definition ChaosCheck.h:22
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define UE_NONCOPYABLE(TypeName)
Definition CoreMiscDefines.h:457
uint32 MurmurFinalize32(uint32 Hash)
Definition HashTable.h:23
FPlatformTypes::int8 int8
An 8-bit signed integer.
Definition Platform.h:1121
FPlatformTypes::SIZE_T SIZE_T
An unsigned integer the same size as a pointer, the same as UPTRINT.
Definition Platform.h:1150
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
#define CHAOS_DEBUG_DRAW
Definition Declares.h:20
return true
Definition ExternalRpcRegistry.cpp:601
#define UE_SMALL_NUMBER
Definition UnrealMathUtility.h:130
uint32 Size
Definition VulkanMemory.cpp:4034
if(Failed) console_printf("Failed.\n")
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition ChaosArchive.h:167
Definition ISpatialAcceleration.h:736
uint32 GetIndexSize() const
Definition ISpatialAcceleration.h:743
SIZE_T GetAllocatedSize() const
Definition ISpatialAcceleration.h:738
Definition ISpatialAcceleration.h:166
virtual void Box(const TAABB< T, 3 > &InBox, const TVector< T, 3 > &InLinearColor, float InThickness)=0
virtual ~ISpacialDebugDrawInterface()=default
virtual void Line(const TVector< T, 3 > &InBegin, const TVector< T, 3 > &InEnd, const TVector< T, 3 > &InLinearColor, float InThickness)=0
Definition ISpatialAcceleration.h:267
virtual void SetAsyncTimeSlicingComplete(bool InState)
Definition ISpatialAcceleration.h:423
virtual bool ShouldRebuild()
Definition ISpatialAcceleration.h:285
virtual void DebugDraw(ISpacialDebugDrawInterface< T > *InInterface) const
Definition ISpatialAcceleration.h:352
virtual TArray< TPayloadType > FindAllIntersections(const FAABB3 &Box) const
Definition ISpatialAcceleration.h:295
TConcrete * As()
Definition ISpatialAcceleration.h:385
static ISpatialAcceleration< TPayloadType, T, d > * SerializationFactory(FChaosArchive &Ar, ISpatialAcceleration< TPayloadType, T, d > *Accel)
Definition ISpatialAcceleration.h:358
virtual void PrepareCopyTimeSliced(const ISpatialAcceleration< TPayloadType, T, 3 > &InFrom)
Definition ISpatialAcceleration.h:288
virtual bool UpdateElementIn(const TPayloadType &Payload, const TAABB< T, d > &NewBounds, bool bHasBounds, FSpatialAccelerationIdx Idx)
Definition ISpatialAcceleration.h:333
virtual void Overlap(const FAABB3 &QueryBounds, ISpatialVisitor< TPayloadType, FReal > &Visitor) const
Definition ISpatialAcceleration.h:298
virtual bool NeedUpdateElementIn(const TPayloadType &Payload, const TAABB< T, d > &NewBounds, FSpatialAccelerationIdx Idx)
Definition ISpatialAcceleration.h:328
int32 GetSyncTimestamp()
Definition ISpatialAcceleration.h:411
ISpatialAcceleration(ESpatialAcceleration InType)
Definition ISpatialAcceleration.h:277
virtual void DumpStats() const
Definition ISpatialAcceleration.h:354
virtual void ClearShouldRebuild()
Definition ISpatialAcceleration.h:287
virtual bool IsAsyncTimeSlicingComplete()
Definition ISpatialAcceleration.h:283
virtual bool IsTreeDynamic() const
Definition ISpatialAcceleration.h:286
virtual bool NeedUpdateElement(const TPayloadType &Payload, const TAABB< T, 3 > &NewBounds)
Definition ISpatialAcceleration.h:312
virtual void Serialize(FChaosArchive &Ar)
Definition ISpatialAcceleration.h:377
virtual bool RemoveElement(const TPayloadType &Payload)
Definition ISpatialAcceleration.h:306
virtual void Raycast(const FVec3 &Start, const FVec3 &Dir, const FReal Length, ISpatialVisitor< TPayloadType, FReal > &Visitor) const
Definition ISpatialAcceleration.h:296
TConcrete & AsChecked()
Definition ISpatialAcceleration.h:397
virtual void DeepAssign(const ISpatialAcceleration< TPayloadType, T, d > &Other)
Definition ISpatialAcceleration.h:344
const TConcrete & AsChecked() const
Definition ISpatialAcceleration.h:404
virtual ~ISpatialAcceleration()=default
virtual void CacheOverlappingLeaves()
Definition ISpatialAcceleration.h:292
SpatialAccelerationType GetType() const
Definition ISpatialAcceleration.h:382
virtual bool UpdateElement(const TPayloadType &Payload, const TAABB< T, d > &NewBounds, bool bHasBounds)
Definition ISpatialAcceleration.h:317
virtual void DumpStatsTo(class FOutputDevice &Ar) const
Definition ISpatialAcceleration.h:355
virtual TUniquePtr< ISpatialAcceleration< TPayloadType, T, d > > Copy() const
Definition ISpatialAcceleration.h:338
void SetSyncTimestamp(int32 InTimestamp)
Definition ISpatialAcceleration.h:417
virtual void DebugDrawLeaf(ISpacialDebugDrawInterface< T > &InInterface, const FLinearColor &InLinearColor, float InThickness) const
Definition ISpatialAcceleration.h:353
virtual void Reset()
Definition ISpatialAcceleration.h:300
virtual bool RemoveElementFrom(const TPayloadType &Payload, FSpatialAccelerationIdx Idx)
Definition ISpatialAcceleration.h:323
const TConcrete * As() const
Definition ISpatialAcceleration.h:391
virtual void ProgressAsyncTimeSlicing(bool ForceBuildCompletion=false)
Definition ISpatialAcceleration.h:284
virtual void Sweep(const FVec3 &Start, const FVec3 &Dir, const FReal Length, const FVec3 QueryHalfExtents, ISpatialVisitor< TPayloadType, FReal > &Visitor) const
Definition ISpatialAcceleration.h:297
virtual void ProgressCopyTimeSliced(const ISpatialAcceleration< TPayloadType, T, 3 > &InFrom, int MaximumBytesToCopy)
Definition ISpatialAcceleration.h:289
Definition ISpatialAcceleration.h:120
virtual bool Raycast(const TSpatialVisitorData< TPayloadType > &Instance, FQueryFastData &CurData)=0
virtual const void * GetQueryPayload() const
Definition ISpatialAcceleration.h:152
virtual ~ISpatialVisitor()=default
virtual const void * GetQueryData() const
Definition ISpatialAcceleration.h:145
virtual bool ShouldIgnore(const TSpatialVisitorData< TPayloadType > &Instance) const
Definition ISpatialAcceleration.h:149
virtual bool Sweep(const TSpatialVisitorData< TPayloadType > &Instance, FQueryFastData &CurData)=0
virtual bool Overlap(const TSpatialVisitorData< TPayloadType > &Instance)=0
virtual const void * GetSimData() const
Definition ISpatialAcceleration.h:147
virtual bool HasBlockingHit() const
Definition ISpatialAcceleration.h:154
Definition AABB.h:37
static FORCEINLINE TAABB< FReal, d > ZeroAABB()
Definition AABB.h:630
Definition ISpatialAcceleration.h:509
TValue & FindChecked(const TKey &Key)
Definition ISpatialAcceleration.h:589
void AddFrom(const TArrayAsMap< TKey, TValue > &Source, int32 SourceIndex)
Definition ISpatialAcceleration.h:694
void Reserve(int32 Size)
Definition ISpatialAcceleration.h:561
TValue & Add(const TKey &Key)
Definition ISpatialAcceleration.h:614
static constexpr uint32 GetTypeSize()
Definition ISpatialAcceleration.h:526
void Reset()
Definition ISpatialAcceleration.h:662
void Remove(const TKey &Key)
Definition ISpatialAcceleration.h:650
const TValue & FindChecked(const TKey &Key) const
Definition ISpatialAcceleration.h:594
int32 Num() const
Definition ISpatialAcceleration.h:556
int32 Capacity() const
Definition ISpatialAcceleration.h:542
TValue * Find(const TKey &Key)
Definition ISpatialAcceleration.h:569
void RemoveChecked(const TKey &Key)
Definition ISpatialAcceleration.h:641
void Serialize(FChaosArchive &Ar)
Definition ISpatialAcceleration.h:670
TValue ElementType
Definition ISpatialAcceleration.h:524
void Empty()
Definition ISpatialAcceleration.h:609
TValue & FindOrAdd(const TKey &Key)
Definition ISpatialAcceleration.h:599
void Add(const TKey &Key, const TValue &Value)
Definition ISpatialAcceleration.h:636
const TValue * Find(const TKey &Key) const
Definition ISpatialAcceleration.h:579
SIZE_T GetAllocatedSize() const
Definition ISpatialAcceleration.h:531
static void SerializeAsAABB(FArchive &Ar, TAABB< T, d > &AABB)
Definition Box.h:467
Definition ParticleHandle.h:2739
Definition ISpatialAcceleration.h:757
FORCEINLINE int32 FindIndex(uint32 InHash, int32 UniqueIndex) const
Definition ISpatialAcceleration.h:951
void Reset()
Definition ISpatialAcceleration.h:939
void Remove(const TKey &Key)
Definition ISpatialAcceleration.h:901
TValue * Find(const TKey &Key)
Definition ISpatialAcceleration.h:812
const TValue * Find(const TKey &Key) const
Definition ISpatialAcceleration.h:824
void RemoveChecked(const TKey &Key)
Definition ISpatialAcceleration.h:894
FORCEINLINE int32 FindIndex(const TKey &Key) const
Definition ISpatialAcceleration.h:945
FORCEINLINE TValue & Add(const TKey &Key)
Definition ISpatialAcceleration.h:870
TArray< PairType > Elements
Definition ISpatialAcceleration.h:985
FORCEINLINE TValue & Add(uint32 InHash, const TKey &Key)
Definition ISpatialAcceleration.h:875
void ResizeHashBuckets(uint32 NewSize)
Definition ISpatialAcceleration.h:797
TValue & FindChecked(const TKey &Key)
Definition ISpatialAcceleration.h:836
SQMapKeyWithValue< TKey, TValue > PairType
Definition ISpatialAcceleration.h:761
TValue ElementType
Definition ISpatialAcceleration.h:760
int32 Num() const
Definition ISpatialAcceleration.h:773
const TValue & FindChecked(const TKey &Key) const
Definition ISpatialAcceleration.h:843
void Reserve(int32 NumToReserve)
Definition ISpatialAcceleration.h:783
void Add(const TKey &Key, const TValue &Value)
Definition ISpatialAcceleration.h:889
void Serialize(FChaosArchive &Ar)
Definition ISpatialAcceleration.h:964
int32 Capacity() const
Definition ISpatialAcceleration.h:778
void AddFrom(const TSQMap< TKey, TValue > &Source, int32 SourceIndex)
Definition ISpatialAcceleration.h:979
FSQHashTable HashTable
Definition ISpatialAcceleration.h:986
static constexpr uint32 GetTypeSize()
Definition ISpatialAcceleration.h:763
SIZE_T GetAllocatedSize() const
Definition ISpatialAcceleration.h:768
void Empty()
Definition ISpatialAcceleration.h:864
TValue & FindOrAdd(const TKey &Key)
Definition ISpatialAcceleration.h:850
Definition ISpatialAcceleration.h:78
TVector< T, d > Start
Definition ISpatialAcceleration.h:90
TSpatialRay()
Definition ISpatialAcceleration.h:80
TVector< T, d > End
Definition ISpatialAcceleration.h:91
TSpatialRay(const TVector< T, d > &InStart, const TVector< T, d > InEnd)
Definition ISpatialAcceleration.h:85
Definition ISpatialAcceleration.h:453
FORCEINLINE bool ShouldIgnore(const TSpatialVisitorData< TPayloadType > &Instance) const
Definition ISpatialAcceleration.h:482
FORCEINLINE bool VisitSweep(const TSpatialVisitorData< TPayloadType > &Instance, FQueryFastData &CurData)
Definition ISpatialAcceleration.h:467
FORCEINLINE bool VisitOverlap(const TSpatialVisitorData< TPayloadType > &Instance)
Definition ISpatialAcceleration.h:457
FORCEINLINE const void * GetSimData() const
Definition ISpatialAcceleration.h:477
FORCEINLINE const void * GetQueryPayload() const
Definition ISpatialAcceleration.h:488
FORCEINLINE bool HasBlockingHit() const
Definition ISpatialAcceleration.h:493
FORCEINLINE const void * GetQueryData() const
Definition ISpatialAcceleration.h:472
TSpatialVisitor(ISpatialVisitor< TPayloadType, T > &InVisitor)
Definition ISpatialAcceleration.h:455
FORCEINLINE bool VisitRaycast(const TSpatialVisitorData< TPayloadType > &Instance, FQueryFastData &CurData)
Definition ISpatialAcceleration.h:462
virtual void Serialize(void *V, int64 Length) override
Definition ArchiveProxy.h:97
UE_FORCEINLINE_HINT bool IsLoading() const
Definition Archive.h:236
CORE_API int32 CustomVer(const struct FGuid &Key) const
Definition Archive.cpp:602
Definition HashTable.h:210
uint32 HashSize
Definition HashTable.h:249
void Free()
Definition HashTable.h:379
bool IsValid(uint32 Index) const
Definition HashTable.h:409
void Clear()
Definition HashTable.h:350
CORE_API void Resize(uint32 NewIndexSize)
Definition HashTable.cpp:7
void Remove(uint32 Key, uint32 Index)
Definition HashTable.h:437
void Add(uint32 Key, uint32 Index)
Definition HashTable.h:414
uint32 First(uint32 Key) const
Definition HashTable.h:395
uint32 IndexSize
Definition HashTable.h:251
uint32 Next(uint32 Index) const
Definition HashTable.h:402
Definition OutputDevice.h:133
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
void Reset(SizeType NewSize=0)
Definition Array.h:2246
SizeType AddDefaulted()
Definition Array.h:2795
UE_REWRITE SizeType Max() const
Definition Array.h:1161
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
UE_NODEBUG UE_FORCEINLINE_HINT bool IsValidIndex(SizeType Index) const
Definition Array.h:1122
UE_NODEBUG UE_FORCEINLINE_HINT SIZE_T GetAllocatedSize(void) const
Definition Array.h:1059
void Empty(SizeType Slack=0)
Definition Array.h:2273
UE_FORCEINLINE_HINT void Reserve(SizeType Number)
Definition Array.h:3016
Definition EnableIf.h:20
Definition UniquePtr.h:107
Definition SkeletalMeshComponent.h:307
bool SpatialAccelerationEqual(ESpatialAcceleration A, SpatialAccelerationType B)
Definition ISpatialAcceleration.h:189
bool operator==(ESpatialAcceleration A, SpatialAccelerationType B)
Definition ISpatialAcceleration.h:190
ESpatialAcceleration
Definition ISpatialAcceleration.h:180
FChaosArchive & operator<<(FChaosArchive &Ar, FRigidParticleControlFlags &Flags)
Definition RigidParticleControlFlags.cpp:15
FRealDouble FReal
Definition Real.h:22
@ Add
Definition PendingSpatialData.h:18
bool PrePreFilterHelper(const FAccelerationStructureHandle &Payload, const Private::FSimOverlapVisitor &Visitor)
Definition SpatialAccelerationBroadPhase.h:323
uint8 SpatialAccelerationType
Definition ISpatialAcceleration.h:178
bool operator!=(ESpatialAcceleration A, SpatialAccelerationType B)
Definition ISpatialAcceleration.h:192
TEnableIf<!TIsPointer< TPayload >::Value, FUniqueIdx >::Type GetUniqueIdx(const TPayload &Payload)
Definition ISpatialAcceleration.h:196
U16 Index
Definition radfft.cpp:71
Definition ISpatialAcceleration.h:64
FQueryFastDataVoid()
Definition ISpatialAcceleration.h:65
FVec3 DummyDir
Definition ISpatialAcceleration.h:67
Definition ISpatialAcceleration.h:14
const FVec3 & Dir
Definition ISpatialAcceleration.h:24
void SetLength(const FReal InLength)
Definition ISpatialAcceleration.h:39
const FVec3 InvDir
Definition ISpatialAcceleration.h:25
FQueryFastData(const FVec3 &InDir, const FReal InLength)
Definition ISpatialAcceleration.h:15
FReal CurrentLength
Definition ISpatialAcceleration.h:27
FReal InvCurrentLength
Definition ISpatialAcceleration.h:28
const bool bParallel[3]
Definition ISpatialAcceleration.h:30
FQueryFastData(const FVec3 &InDummyDir)
Definition ISpatialAcceleration.h:55
Definition GeometryParticlesfwd.h:59
Definition GeometryParticlesfwd.h:87
bool IsValid() const
Definition GeometryParticlesfwd.h:92
Definition Pair.h:8
Definition ISpatialAcceleration.h:715
TValue Value
Definition ISpatialAcceleration.h:723
SQMapKeyWithValue(const TKey &InKey, const TValue &InValue)
Definition ISpatialAcceleration.h:717
TKey Key
Definition ISpatialAcceleration.h:722
Definition ISpatialAcceleration.h:549
TValue Entry
Definition ISpatialAcceleration.h:553
Definition ISpatialAcceleration.h:226
bool HasBoundingBox() const
Definition ISpatialAcceleration.h:239
TAABB< T, 3 > Bounds
Definition ISpatialAcceleration.h:228
TPayloadType Payload
Definition ISpatialAcceleration.h:227
void Serialize(FChaosArchive &Ar)
Definition ISpatialAcceleration.h:230
const TAABB< T, 3 > & BoundingBox() const
Definition ISpatialAcceleration.h:241
TPayloadType2 GetPayload(int32 Idx) const
Definition ISpatialAcceleration.h:237
FUniqueIdx UniqueIdx() const
Definition ISpatialAcceleration.h:243
Definition ISpatialAcceleration.h:261
static CHAOS_API ISpatialAcceleration< TPayloadType, T, d > * Create()
Definition SpatialAcceleration.cpp:12
Definition ISpatialAcceleration.h:99
TPayloadType Payload
Definition ISpatialAcceleration.h:100
TSpatialVisitorData(const TPayloadType &InPayload, const bool bInHasBounds=false, const FAABB3 &InBounds=FAABB3::ZeroAABB())
Definition ISpatialAcceleration.h:101
CORE_API static const FGuid GUID
Definition ExternalPhysicsCustomObjectVersion.h:144
@ SerializeEvolutionGenericAcceleration
Definition ExternalPhysicsCustomObjectVersion.h:25
Definition Color.h:48
Definition UnrealMathUtility.h:270
Definition DelegateInstanceInterface.h:67