UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PendingSpatialData.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
5#include "Chaos/Transform.h"
7#include "Chaos/Defines.h"
8#include "Tasks/Task.h"
10
11
12namespace Chaos
13{
15{
17 // Note: Updates and Adds are treated the same right now. TODO: Distinguish between them
18 Add, // Use this if the element does not exist in the acceleration structure
19 Update // Use this when it is known that the element already exists in the acceleration structure
20
21};
22
25{
28 int32 SyncTimestamp; //indicates the inputs timestamp associated with latest change. Only relevant for external queue
30
35
37 {
38 /*Ar.UsingCustomVersion(FExternalPhysicsCustomObjectVersion::GUID);
39 if (Ar.CustomVer(FExternalPhysicsCustomObjectVersion::GUID) >= FExternalPhysicsCustomObjectVersion::SerializeHashResult)
40 {
41 Ar << UpdateAccelerationHandle;
42 Ar << DeleteAccelerationHandle;
43 }
44 else
45 {
46 Ar << UpdateAccelerationHandle;
47 DeleteAccelerationHandle = UpdateAccelerationHandle;
48 }
49
50 Ar << bUpdate;
51 Ar << bDelete;
52
53 Ar << UpdatedSpatialIdx;
54 Ar << DeletedSpatialIdx;*/
55 ensure(false); //Serialization of transient data like this is currently broken. Need to reevaluate
56 }
57
59 {
61 }
62};
63
65{
66 // PendingDataArrays store in
67 // - [0] all elements added in push data
68 // - [1 -> KinematicBatchStartIndex] all dynamic particle contained in GetActiveParticlesArray
69 // - [KinematicBatchStartIndex -> PendingDataArrays.Num()] all kinematic particle in GetActiveMovingKinematicParticlesView
71 // ParticleToPendingData ensure all particle in index [0] are unique
73 // This array is access to mark duplicated data from array [0], not we cannot use bit array because it could be used from different thread.
76
77 void Reset()
78 {
81 {
82 PendingData.Reset();
83 }
84 PendingDataArrays.Reset();
87 }
88
89 int32 Num() const
90 {
92 for (const TArray<FPendingSpatialData>& PendingData : PendingDataArrays)
93 {
94 NumPendingData += PendingData.Num();
95 }
96 return NumPendingData;
97 }
98
100 {
101 if (PendingDataArrays.IsEmpty())
102 {
103 check(BatchIndex == 0);
104 PendingDataArrays.SetNum(1);
105 }
106
108 // Check if duplicate
109 if (BatchIndex != 0)
110 {
111 if (int32* Existing = ParticleToPendingData.Find(UniqueIdx))
112 {
113 Duplicated[*Existing] = true;
114 }
115 const int32 NewIdx = PendingDataArrays[BatchIndex].AddDefaulted(1);
116 PendingDataArrays[BatchIndex][NewIdx].Operation = Operation;
118 return PendingDataArrays[BatchIndex][NewIdx];
119 }
120 else // Adding at Index 0 would be always in Single thread
121 {
122 if (int32* Existing = ParticleToPendingData.Find(UniqueIdx))
123 {
125 return PendingDataArrays[0][*Existing];
126 }
127 const int32 NewIdx = PendingDataArrays[0].AddDefaulted(1);
128 ParticleToPendingData.Add(UniqueIdx, NewIdx);
129 PendingDataArrays[0][NewIdx].Operation = Operation;
130 Duplicated.Add(false);
132 return PendingDataArrays[0][NewIdx];
133 }
134 }
135
136 void Remove(const FUniqueIdx UniqueIdx)
137 {
138 if (!PendingDataArrays.IsEmpty())
139 {
142 if (int32* Existing = ParticleToPendingData.Find(UniqueIdx))
143 {
144 const int32 SlotIdx = *Existing;
145 if (SlotIdx + 1 < PendingData.Num())
146 {
147 const FUniqueIdx LastElemUniqueIdx = PendingData.Last().UniqueIdx();
148 ParticleToPendingData.FindChecked(LastElemUniqueIdx) = SlotIdx; //We're going to swap elements so the last element is now in the position of the element we removed
149 }
150
151 Duplicated.RemoveAtSwap(SlotIdx);
152 PendingData.RemoveAtSwap(SlotIdx);
153 ParticleToPendingData.RemoveChecked(UniqueIdx);
154 }
156 }
157 }
158
160 {
161 if (!PendingDataArrays.IsEmpty())
162 {
164 ParticleToPendingData.Reset();
166 for (int32 Index = 0; Index < Duplicated.Num(); Index++)
167 {
168 const bool bIsDuplicated = Duplicated[Index];
169 if (!bIsDuplicated)
170 {
173 }
174 }
175 Duplicated.Init(false, NoDuplicatedData.Num());
178 }
179 }
180
181};
182
184{
187
188 void Reset()
189 {
190 PendingData.Reset();
191 ParticleToPendingData.Reset();
192 }
193
194 int32 Num() const
195 {
196 return PendingData.Num();
197 }
198
200 {
201 if(int32* Existing = ParticleToPendingData.Find(UniqueIdx))
202 {
203 return PendingData[*Existing];
204 } else
205 {
206 const int32 NewIdx = PendingData.AddDefaulted(1);
207 ParticleToPendingData.Add(UniqueIdx,NewIdx);
208 PendingData[NewIdx].Operation = Operation;
209 return PendingData[NewIdx];
210 }
211 }
212
213 void Remove(const FUniqueIdx UniqueIdx)
214 {
215 if(int32* Existing = ParticleToPendingData.Find(UniqueIdx))
216 {
217 const int32 SlotIdx = *Existing;
218 if(SlotIdx + 1 < PendingData.Num())
219 {
220 const FUniqueIdx LastElemUniqueIdx = PendingData.Last().UniqueIdx();
221 ParticleToPendingData.FindChecked(LastElemUniqueIdx) = SlotIdx; //We're going to swap elements so the last element is now in the position of the element we removed
222 }
223
224 PendingData.RemoveAtSwap(SlotIdx);
225 ParticleToPendingData.RemoveChecked(UniqueIdx);
226 }
227 }
228};
229
230}
#define check(expr)
Definition AssertionMacros.h:314
#define ensure( InExpression)
Definition AssertionMacros.h:464
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 ParticleHandle.h:213
FUniqueIdx UniqueIdx() const
Definition ParticleHandle.h:243
Definition ChaosArchive.h:167
Definition ISpatialAcceleration.h:509
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_NODEBUG UE_FORCEINLINE_HINT ElementType & Last(SizeType IndexFromTheEnd=0) UE_LIFETIMEBOUND
Definition Array.h:1263
void Reset(SizeType NewSize=0)
Definition Array.h:2246
UE_FORCEINLINE_HINT void RemoveAtSwap(SizeType Index, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2185
SizeType AddDefaulted()
Definition Array.h:2795
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
void Init(const ElementType &Element, SizeType Number)
Definition Array.h:3043
Definition SkeletalMeshComponent.h:307
EPendingSpatialDataOperation
Definition PendingSpatialData.h:15
@ Delete
Definition PendingSpatialData.h:16
@ Add
Definition PendingSpatialData.h:18
@ Update
Definition PendingSpatialData.h:19
U16 Index
Definition radfft.cpp:71
Definition PendingSpatialData.h:184
void Reset()
Definition PendingSpatialData.h:188
FPendingSpatialData & FindOrAdd(const FUniqueIdx UniqueIdx, EPendingSpatialDataOperation Operation=EPendingSpatialDataOperation::Add)
Definition PendingSpatialData.h:199
void Remove(const FUniqueIdx UniqueIdx)
Definition PendingSpatialData.h:213
TArray< FPendingSpatialData > PendingData
Definition PendingSpatialData.h:185
int32 Num() const
Definition PendingSpatialData.h:194
TArrayAsMap< FUniqueIdx, int32 > ParticleToPendingData
Definition PendingSpatialData.h:186
Definition PendingSpatialData.h:25
void Serialize(FChaosArchive &Ar)
Definition PendingSpatialData.h:36
FPendingSpatialData()
Definition PendingSpatialData.h:31
int32 SyncTimestamp
Definition PendingSpatialData.h:28
FUniqueIdx UniqueIdx() const
Definition PendingSpatialData.h:58
FAccelerationStructureHandle AccelerationHandle
Definition PendingSpatialData.h:26
FSpatialAccelerationIdx SpatialIdx
Definition PendingSpatialData.h:27
EPendingSpatialDataOperation Operation
Definition PendingSpatialData.h:29
Definition PendingSpatialData.h:65
void Reset()
Definition PendingSpatialData.h:77
void Remove(const FUniqueIdx UniqueIdx)
Definition PendingSpatialData.h:136
int32 KinematicBatchStartIndex
Definition PendingSpatialData.h:75
TArray< TArray< FPendingSpatialData > > PendingDataArrays
Definition PendingSpatialData.h:70
TArray< bool > Duplicated
Definition PendingSpatialData.h:74
TArrayAsMap< FUniqueIdx, int32 > ParticleToPendingData
Definition PendingSpatialData.h:72
void CleanUpDuplicated()
Definition PendingSpatialData.h:159
FPendingSpatialData & Add(int32 BatchIndex, const FUniqueIdx UniqueIdx, EPendingSpatialDataOperation Operation=EPendingSpatialDataOperation::Add)
Definition PendingSpatialData.h:99
int32 Num() const
Definition PendingSpatialData.h:89
Definition GeometryParticlesfwd.h:59
Definition GeometryParticlesfwd.h:87