6#include "Misc/Optional.h"
16template<
typename TInterfaceType,
typename TUserDataType =
void>
21 enum {
Id = InterfaceType::Id };
22 static inline constexpr const TCHAR*
DebugName = InterfaceType::Handle::DebugName;
33template<
typename Settings>
38 using FHandle =
typename InterfaceType::Handle;
42 enum {
Id = Settings::Id };
93 template<
typename InDynamicState>
102 void MakeInternal(T& State);
107 FInstance() =
default;
124 FTick* PrevTick =
nullptr;
125 FTick* NextTick =
nullptr;
131 FTick* CurrentTick =
nullptr;
132 FTick* OldestAvailableTick =
nullptr;
133 FTick* NewestAvailableTick =
nullptr;
139 FTick* RendTick =
nullptr;
152template<
typename Settings>
157 uint32 InstanceIndex = Instances.Emplace(
Ss, 1, CurrentTick->Index);
161 CurrentTickLock.WriteLock();
163 if (
uint32(CurrentTick->DynamicStates.Num()) <= InstanceIndex)
165 CurrentTick->DynamicStates.SetNum(InstanceIndex + 1);
166 CurrentTick->ModifiedInstances.SetNum(InstanceIndex + 1,
false);
168 CurrentTick->ModifiedInstances[InstanceIndex] =
true;
171 CurrentTickLock.WriteUnlock();
173 return { *
this, InstanceIndex + 1 };
176template<
typename Settings>
180 check(HandleId != 0);
181 uint32 InstanceIndex = HandleId - 1;
182 FInstance&
Instance = Instances[InstanceIndex];
187template<
typename Settings>
191 check(HandleId != 0);
192 uint32 InstanceIndex = HandleId - 1;
193 FInstance&
Instance = Instances[InstanceIndex];
200 Instance.DeleteTick = CurrentTick->Index;
203 CurrentTickLock.ReadLock();
205 CurrentTick->ModifiedInstances[InstanceIndex] =
true;
208 CurrentTickLock.ReadUnlock();
210 MakeInternal(DynamicStates[
DsIndex]);
213template<
typename Settings>
222template<
typename Settings>
229template<
typename Settings>
232 check(HandleId != 0);
233 uint32 InstanceIndex = HandleId - 1;
236 check(InstanceIndex <
uint32(CurrentTick->DynamicStates.Num()));
238 CurrentTickLock.ReadLock();
242 if (CurrentTick->ModifiedInstances[InstanceIndex])
245 CurrentTickLock.ReadUnlock();
252 CurrentTick->ModifiedInstances[InstanceIndex] =
true;
256 CurrentTickLock.ReadUnlock();
265template<
typename Settings>
266template<
typename InDynamicState>
290template<
typename Settings>
294 uint32 InstanceIndex = HandleId - 1;
295 return Instances[InstanceIndex].UserData;
298template<
typename Settings>
302 CurrentTick =
new FTick();
303 CurrentTick->Index = TickCounter++;
304 if (NewestAvailableTick)
306 CurrentTick->DynamicStates = NewestAvailableTick->DynamicStates;
307 CurrentTick->ModifiedInstances.SetNum(CurrentTick->DynamicStates.Num(),
false);
311template<
typename Settings>
316 CurrentTick->Time = AbsoluteTime;
317 CurrentTick->PrevTick = NewestAvailableTick;
318 if (NewestAvailableTick)
320 check(NewestAvailableTick->Time <= AbsoluteTime);
321 NewestAvailableTick->NextTick = CurrentTick;
325 OldestAvailableTick = CurrentTick;
328 NewestAvailableTick = CurrentTick;
329 CurrentTick =
nullptr;
332template<
typename Settings>
344template<
typename Settings>
350template<
typename Settings>
356template<
typename Settings>
359 if (!NewestAvailableTick || AbsoluteTime == RendTime)
361 check(AbsoluteTime > RendTime);
367 PrevTick = RendTick->Index;
371 RendTick = OldestAvailableTick;
376 RendTime = AbsoluteTime;
382 ApplyChanges(*RendTick, RendTime, PrevTick,
PrevTime, RendTick->ModifiedInstances);
404 ApplyChanges(*RendTick, RendTime, PrevTick,
PrevTime, RendTick->ModifiedInstances);
410 TBitArray<> ModifiedInstances(RendTick->ModifiedInstances);
411 while (RendTick->Time < RendTime)
413 if (!RendTick->NextTick)
415 RendTime = RendTick->Time;
418 RendTick = RendTick->NextTick;
422 ApplyChanges(*RendTick, RendTime, PrevTick,
PrevTime, ModifiedInstances);
425template<
typename Settings>
428 for (FInstance*
Instance : DeferredDestroys)
433 DeferredDestroys.SetNum(0);
436template<
typename Settings>
439 if (NewestAvailableTick)
447template<
typename Settings>
450 if (!OldestAvailableTick)
456 if (RendTick && RendTick->Time != RendTime && RendTick->PrevTick)
459 FTick*
Tick = OldestAvailableTick;
468 uint32 InstanceIndex = It.GetIndex();
469 if (InstanceIndex >=
uint32(
Tick->DynamicStates.Num()))
475 FInstance&
Instance = Instances[InstanceIndex];
493 uint32 InstanceIndex = It.GetIndex();
494 FInstance&
Instance = Instances[InstanceIndex];
501 DynamicStates.Remove(
Tick->DynamicStates[InstanceIndex]);
503 Instances.Remove(InstanceIndex);
509 OldestAvailableTick =
Tick;
513template<
typename Settings>
516 return Settings::DebugName;
519template<
typename Settings>
524 if (FTick*
Tick = NewestAvailableTick)
532template<
typename Settings>
538 return Instances[InstanceIndex].UserData;
541template<
typename Settings>
547 return *Instances[InstanceIndex].RendDynamicState;
550template<
typename Settings>
561 uint32 InstanceIndex = It.GetIndex();
562 FInstance&
Instance = Instances[InstanceIndex];
576 if (Settings::SkipCreatingDeletes &&
IsDestroy)
591 FDynamicState& Ds = *
Instance.RendDynamicState;
598 Ds.Apply(
Context, DynamicStates[
Tick.DynamicStates[InstanceIndex]]);
603 const FTick& PrevTick = *
Tick.PrevTick;
604 uint32 FromIndex = PrevTick.DynamicStates[InstanceIndex];
611 FDynamicState& From = DynamicStates[FromIndex];
612 FDynamicState&
To = DynamicStates[
ToIndex];
616 Ds.Interpolate(
Context, From, To);
661template<
typename Settings>
#define check(expr)
Definition AssertionMacros.h:314
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
FORCEINLINE uint32 ToIndex(FHairStrandsTiles::ETileType Type)
Definition HairStrandsData.h:93
UE_STATESTREAM_TIME_TYPE StateStreamTime
Definition StateStreamDefinitions.h:21
#define UE_ARRAY_COUNT(array)
Definition UnrealTemplate.h:212
Definition StateStreamDebugRenderer.h:10
Definition StateStreamHandle.h:57
Definition StateStream.h:14
Definition Renderer.Build.cs:6
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
TBitArray & CombineWithBitwiseOR(const TBitArray< OtherAllocator > &InOther, EBitwiseOperatorFlags InFlags)
Definition BitArray.h:1337
Definition BitArray.h:1944
Definition StateStreamStore.h:15
uint32 GetUsedCount() const
Definition StateStreamStore.h:114
Definition GenericStateStream.h:35
void Render_OnDestroyInline(const FStaticState &Ss, const FDynamicState &Ds, FUserDataType *&UserData)
Definition GenericStateStream.h:81
virtual const TCHAR * GetDebugName() override
Definition GenericStateStream.h:514
void Render_OnCreateInline(const FStaticState &Ss, const FDynamicState &Ds, FUserDataType *&UserData, bool IsDestroyedInSameFrame)
Definition GenericStateStream.h:79
virtual void Game_Exit() override
Definition GenericStateStream.h:333
typename InterfaceType::Handle FHandle
Definition GenericStateStream.h:38
virtual void Render_GarbageCollect() override
Definition GenericStateStream.h:448
virtual void Render_OnCreate(const FStaticState &Ss, const FDynamicState &Ds, FUserDataType *&UserData, bool IsDestroyedInSameFrame)
Definition GenericStateStream.h:74
virtual void Game_EndTick(StateStreamTime AbsoluteTime) override
Definition GenericStateStream.h:312
typename Settings::InterfaceType InterfaceType
Definition GenericStateStream.h:37
virtual void Game_AddRef(uint32 HandleId) override final
Definition GenericStateStream.h:177
void Render_OnUpdateInline(const FStaticState &Ss, const FDynamicState &Ds, FUserDataType *&UserData)
Definition GenericStateStream.h:80
FUserDataType *& Render_GetUserData(const FHandle &Handle)
Definition GenericStateStream.h:533
uint32 GetUsedDynamicstatesCount() const
Definition GenericStateStream.h:85
virtual void * Game_GetVoidPointer() override
Definition GenericStateStream.h:345
virtual void Render_OnUpdate(const FStaticState &Ss, const FDynamicState &Ds, FUserDataType *&UserData)
Definition GenericStateStream.h:75
virtual FHandle Game_CreateInstance(const FStaticState &Ss, const FDynamicState &Ds) override final
Definition GenericStateStream.h:153
virtual void * Render_GetUserData(uint32 HandleId) override final
Definition GenericStateStream.h:291
virtual void Game_Update(uint32 HandleId, const void *Ds, double TimeFactor, uint64 UserData) override
Definition GenericStateStream.h:214
typename Settings::UserDataType FUserDataType
Definition GenericStateStream.h:41
uint32 GetUsedInstancesCount() const
Definition GenericStateStream.h:84
FDynamicState & Edit(uint32 HandleId, double TimeFactor)
Definition GenericStateStream.h:230
virtual void Game_Release(uint32 HandleId) override final
Definition GenericStateStream.h:188
virtual void Game_BeginTick() override
Definition GenericStateStream.h:299
virtual void Render_PostUpdate() override
Definition GenericStateStream.h:426
typename InterfaceType::DynamicState FDynamicState
Definition GenericStateStream.h:40
virtual void Render_Exit() override
Definition GenericStateStream.h:437
void Update(uint32 HandleId, const InDynamicState &Ds, double TimeFactor)
Definition GenericStateStream.h:267
@ Id
Definition GenericStateStream.h:42
virtual void DebugRender(IStateStreamDebugRenderer &Renderer) override
Definition GenericStateStream.h:520
virtual void Render_Update(StateStreamTime AbsoluteTime) override
Definition GenericStateStream.h:357
virtual uint32 GetId() override
Definition GenericStateStream.h:351
virtual void Render_OnDestroy(const FStaticState &Ss, const FDynamicState &Ds, FUserDataType *&UserData)
Definition GenericStateStream.h:76
typename InterfaceType::StaticState FStaticState
Definition GenericStateStream.h:39
virtual void * Game_Edit(uint32 HandleId, double TimeFactor, uint64 UserData) override
Definition GenericStateStream.h:223
const FDynamicState & Render_GetDynamicState(const FHandle &Handle)
Definition GenericStateStream.h:542
BuilderType & Appendf(const FmtType &Fmt, Types... Args)
Definition StringBuilder.h:419
Definition StringBuilder.h:509
State
Definition PacketHandler.h:88
U16 Index
Definition radfft.cpp:71
Definition StateStreamHandle.h:71
uint32 IsInternal
Definition StateStreamHandle.h:72
Definition StateStreamHandle.h:25
UE_API void MakeInternal()
Definition StateStreamHandle.cpp:120
Definition StateStreamDefinitions.h:27
double Factor
Definition StateStreamDefinitions.h:28
Definition Optional.h:131
Definition GenericStateStream.h:18
@ Id
Definition GenericStateStream.h:21
static constexpr const TCHAR * DebugName
Definition GenericStateStream.h:22
TUserDataType UserDataType
Definition GenericStateStream.h:20
TInterfaceType InterfaceType
Definition GenericStateStream.h:19
static constexpr bool SkipCreatingDeletes
Definition GenericStateStream.h:23