26template <
typename InSceneInfoType,
typename EInDirtyFlagsType,
typename EInId>
32 struct FBasePayloadArray;
33 template <
typename PayloadType>
44 static_assert(
MaxId <= 64,
"The max update ID must fit in the 64 bits we use to store the mask.");
54 template <
typename PayloadType>
57 if (PayloadType::IdBit & PayloadMask)
59 int32 Index = FPlatformMath::CountBits(PayloadMask& PayloadType::ExclusiveIdMask);
61 return PayloadDataSlots[
Index];
66 template <
typename PayloadType>
71 int32 Index = FPlatformMath::CountBits(PayloadMask& PayloadType::ExclusiveIdMask);
73 if (PayloadType::IdBit& PayloadMask)
75 PayloadDataSlots[
Index] = PayloadOffset;
79 PayloadMask |= PayloadType::IdBit;
80 PayloadDataSlots.Insert(PayloadOffset,
Index);
87 bool IsAdd()
const {
return bAdded; }
101 bool bDeleted =
false;
122 Other.CommandSlots.Empty();
132 bool IsEmpty()
const {
return Commands.IsEmpty(); }
138 return CommandSlots.
Find(SceneInfo) !=
nullptr;
146 return &Commands[
Id.GetIndex()];
164 Command.bDeleted =
true;
178 check(CommandSlots.
Find(SceneInfo) ==
nullptr);
183 check(!Command.bAdded);
184 check(!Command.bDeleted);
185 Command.bAdded =
true;
191 template <
typename PayloadType>
201 if (PayloadArrays[
int32(PayloadType::Id)] ==
nullptr)
206 check(Payloads !=
nullptr);
217 int32 PayloadOffset = Payloads->CommandSlots.Num();
220 Payloads->PayloadData.Emplace(
MoveTemp(Payload));
227 template <
typename PayloadType>
230 if (PayloadArrays[
int32(PayloadType::Id)] ==
nullptr)
236 check(Payloads !=
nullptr);
244 check(&Commands[Payloads->CommandSlots[PayloadOffset]] == &Command);
245 return &Payloads->PayloadData[PayloadOffset];
259 CommandSlots.
Empty();
272 template <
typename CallbackFuncType>
284 template <
typename CallbackFuncType>
295 template <
typename CallbackFuncType>
306 if (Command.bAdded || Command.bDeleted || (
UpdatePayloadMask& Command.PayloadMask) != 0)
318 template <
typename CallbackFuncType>
328 if (Command.bAdded || Command.bDeleted ||
EnumHasAnyFlags(Command.DirtyFlags, DirtyFlags))
340 template <
typename PayloadType>
375 check(!Command.bDeleted);
376 return { Payloads->PayloadData[
Index], Command.SceneInfo };
381 check(Payloads == It.Payloads);
382 return Index != It.Index;
385 explicit operator bool()
const {
return Payloads!=
nullptr &&
Index < Payloads->CommandSlots.Num(); }
396 template <
typename PayloadType>
406 template <
typename PayloadType>
410 return Payloads !=
nullptr ? Payloads->PayloadData.Num() : 0;
413 template <
typename PayloadType>
421 UpdateBuffer.BeginReadAccess();
427 UpdateBuffer.EndReadAccess();
436 bool IsEmpty()
const {
return NumItems == 0; }
448 template <
typename PayloadType>
458 template <EId InId, EDirtyFlags InDirtyFlags>
487 UpdateQueue.BeginReadAccess();
491 UpdateQueue.EndReadAccess();
502 template <
typename PayloadType>
509 struct FBasePayloadArray
512 virtual ~FBasePayloadArray() { };
513 virtual void Reset() = 0;
515 int32 PayloadByteSize = 0;
518 template <
typename PayloadType>
519 struct TPayloadArray :
public FBasePayloadArray
524 TPayloadArray() : FBasePayloadArray(
sizeof(PayloadType)) {}
526 virtual void Reset()
override
529 CommandSlots.
Reset();
543 Commands.Emplace(SceneInfo, SceneInfo->GetPersistentIndex());
563 template <
typename PayloadType>
566 check(PayloadArrays[
int32(PayloadType::Id)] ==
nullptr || PayloadArrays[
int32(PayloadType::Id)]->PayloadByteSize ==
sizeof(PayloadType));
569 template <
typename PayloadType>
576 FPayloadArrays PayloadArrays = FPayloadArrays(
InPlace);
#define check(expr)
Definition AssertionMacros.h:314
TSizedDefaultAllocator< 32 > FDefaultAllocator
Definition ContainerAllocationPolicies.h:831
@ INDEX_NONE
Definition CoreMiscDefines.h:150
@ InPlace
Definition CoreMiscDefines.h:162
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
constexpr bool EnumHasAnyFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:35
#define ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:6
const bool
Definition NetworkReplayStreaming.h:178
ESceneUpdateCommandFilter
Definition SceneUpdateCommandQueue.h:9
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition RobinHoodHashTable.h:72
FindValueType Find(const KeyType &Key)
Definition RobinHoodHashTable.h:918
FHashElementId FindId(const KeyType &Key) const
Definition RobinHoodHashTable.h:901
void Empty()
Definition RobinHoodHashTable.h:1059
Definition RobinHoodHashTable.h:1419
void Reset(SizeType NewSize=0)
Definition Array.h:2246
Definition SceneUpdateCommandQueue.h:28
void Enqueue(FSceneInfo *SceneInfo, PayloadType &&Payload)
Definition SceneUpdateCommandQueue.h:192
void ForEachCommand(CallbackFuncType CallbackFunc)
Definition SceneUpdateCommandQueue.h:285
const FUpdateCommand * FindCommand(FSceneInfo *SceneInfo) const
Definition SceneUpdateCommandQueue.h:141
static constexpr int32 MaxId
Definition SceneUpdateCommandQueue.h:43
int32 GetNumItems() const
Definition SceneUpdateCommandQueue.h:407
typename InSceneInfoType::FPersistentId FSceneInfoPersistentId
Definition SceneUpdateCommandQueue.h:39
TSceneUpdateCommandQueue()
Definition SceneUpdateCommandQueue.h:108
TSceneUpdateCommandQueue(TSceneUpdateCommandQueue &&Other)
Definition SceneUpdateCommandQueue.h:115
void ForEachUpdateCommand(ESceneUpdateCommandFilter CommandFilter, uint64 UpdatePayloadMask, CallbackFuncType CallbackFunc) const
Definition SceneUpdateCommandQueue.h:296
EInDirtyFlagsType EDirtyFlags
Definition SceneUpdateCommandQueue.h:37
bool HasCommand(FSceneInfo *SceneInfo) const
Definition SceneUpdateCommandQueue.h:136
void EnqueueDelete(FSceneInfo *SceneInfo)
Definition SceneUpdateCommandQueue.h:155
void EnqueueAdd(FSceneInfo *SceneInfo)
Definition SceneUpdateCommandQueue.h:171
TSceneUpdateCommandQueue(const TSceneUpdateCommandQueue &)=delete
TConstPayloadIterator< PayloadType > GetIterator() const
Definition SceneUpdateCommandQueue.h:397
bool IsEmpty() const
Definition SceneUpdateCommandQueue.h:132
void Reset()
Definition SceneUpdateCommandQueue.h:253
InSceneInfoType FSceneInfo
Definition SceneUpdateCommandQueue.h:38
TPayloadRangeView< PayloadType > GetRangeView()
Definition SceneUpdateCommandQueue.h:449
~TSceneUpdateCommandQueue()
Definition SceneUpdateCommandQueue.h:125
EInId EId
Definition SceneUpdateCommandQueue.h:41
PayloadType * GetPayloadPtr(const FUpdateCommand &Command)
Definition SceneUpdateCommandQueue.h:228
int32 NumCommands() const
Definition SceneUpdateCommandQueue.h:134
void ForEachCommand(ESceneUpdateCommandFilter CommandFilter, CallbackFuncType CallbackFunc)
Definition SceneUpdateCommandQueue.h:273
void ForEachUpdateCommand(ESceneUpdateCommandFilter CommandFilter, EDirtyFlags DirtyFlags, CallbackFuncType CallbackFunc) const
Definition SceneUpdateCommandQueue.h:319
Definition ContainerAllocationPolicies.h:830
Definition StaticArray.h:26
const Type Command
Definition GenericApplication.h:46
U16 Index
Definition radfft.cpp:71
Definition SceneUpdateCommandQueue.h:51
void SetPersistentId(FSceneInfoPersistentId InId)
Definition SceneUpdateCommandQueue.h:90
bool IsAdd() const
Definition SceneUpdateCommandQueue.h:87
FSceneInfo * GetSceneInfo() const
Definition SceneUpdateCommandQueue.h:84
bool IsDelete() const
Definition SceneUpdateCommandQueue.h:86
FUpdateCommand(FSceneInfo *InSceneInfo, FSceneInfoPersistentId InPersistentId)
Definition SceneUpdateCommandQueue.h:52
int32 GetPayloadOffset() const
Definition SceneUpdateCommandQueue.h:55
void SetOrAddPayloadOffset(int32 PayloadOffset, EDirtyFlags InDirtyFlags)
Definition SceneUpdateCommandQueue.h:67
FSceneInfoPersistentId GetPersistentId() const
Definition SceneUpdateCommandQueue.h:85
Definition SceneUpdateCommandQueue.h:344
FSceneInfo * SceneInfo
Definition SceneUpdateCommandQueue.h:346
const PayloadType & Payload
Definition SceneUpdateCommandQueue.h:345
Definition SceneUpdateCommandQueue.h:342
TConstPayloadIterator(const TPayloadArray< PayloadType > *InPayloads, const TArray< FUpdateCommand, FAllocator > &InCommands, int32 InIndex=0)
Definition SceneUpdateCommandQueue.h:349
void operator++()
Definition SceneUpdateCommandQueue.h:365
bool operator!=(const TConstPayloadIterator &It) const
Definition SceneUpdateCommandQueue.h:379
void SkipDeleted()
Definition SceneUpdateCommandQueue.h:357
FItem operator*() const
Definition SceneUpdateCommandQueue.h:371
Definition SceneUpdateCommandQueue.h:460
static constexpr uint64 IdBit
Definition SceneUpdateCommandQueue.h:463
EDirtyFlags GetDirtyFlags() const
Definition SceneUpdateCommandQueue.h:468
static constexpr EId Id
Definition SceneUpdateCommandQueue.h:462
static constexpr uint64 ExclusiveIdMask
Definition SceneUpdateCommandQueue.h:464
static constexpr EDirtyFlags DirtyFlags
Definition SceneUpdateCommandQueue.h:465
Definition SceneUpdateCommandQueue.h:415
int32 Num() const
Definition SceneUpdateCommandQueue.h:434
TConstPayloadIterator< PayloadType > end() const
Definition SceneUpdateCommandQueue.h:432
TPayloadRangeView(TSceneUpdateCommandQueue &InUpdateBuffer, int32 InNumItems)
Definition SceneUpdateCommandQueue.h:416
~TPayloadRangeView()
Definition SceneUpdateCommandQueue.h:424
bool IsEmpty() const
Definition SceneUpdateCommandQueue.h:436
TConstPayloadIterator< PayloadType > begin() const
Definition SceneUpdateCommandQueue.h:431