226 lines
4.5 KiB
C++
226 lines
4.5 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "StateStreamManagerImpl.h"
|
|
#include "StateStreamCreator.h"
|
|
#include "StateStreamDebugRenderer.h"
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
void FStateStreamManagerImpl::Game_BeginTick()
|
|
{
|
|
check(!bIsInTick);
|
|
check (!bGameExited);
|
|
bIsInTick = true;
|
|
for (const StateStreamRec& Rec : StateStreams)
|
|
{
|
|
Rec.Stream->Game_BeginTick();
|
|
}
|
|
}
|
|
|
|
void FStateStreamManagerImpl::Game_EndTick(double AbsoluteTime)
|
|
{
|
|
check(bIsInTick);
|
|
bIsInTick = false;
|
|
for (const StateStreamRec& Rec : StateStreams)
|
|
{
|
|
Rec.Stream->Game_EndTick(AbsoluteTime);
|
|
}
|
|
}
|
|
|
|
void FStateStreamManagerImpl::Game_Exit()
|
|
{
|
|
check(!bIsInTick);
|
|
for (const StateStreamRec& Rec : StateStreams)
|
|
{
|
|
Rec.Stream->Game_Exit();
|
|
}
|
|
bGameExited = true;
|
|
}
|
|
|
|
bool FStateStreamManagerImpl::Game_IsInTick()
|
|
{
|
|
return bIsInTick;
|
|
}
|
|
|
|
void* FStateStreamManagerImpl::Game_GetStreamPointer(uint32 Id)
|
|
{
|
|
check(Id < uint32(StateStreamsLookup.Num()));
|
|
return StateStreamsLookup[Id]->Game_GetVoidPointer();
|
|
}
|
|
|
|
void FStateStreamManagerImpl::Render_Register(IStateStream& Stream, bool TakeOwnership)
|
|
{
|
|
StateStreamRec Rec { &Stream, TakeOwnership };
|
|
StateStreams.Add(Rec);
|
|
|
|
uint32 Id = Stream.GetId();
|
|
if (uint32(StateStreamsLookup.Num()) <= Id)
|
|
{
|
|
StateStreamsLookup.SetNum(Id+1);
|
|
}
|
|
check(StateStreamsLookup[Id] == nullptr);
|
|
StateStreamsLookup[Id] = &Stream;
|
|
}
|
|
|
|
void FStateStreamManagerImpl::Render_RegisterDependency(uint32 FromId, uint32 ToId)
|
|
{
|
|
// TODO
|
|
}
|
|
|
|
void FStateStreamManagerImpl::Render_RegisterDependency(IStateStream& From, IStateStream& To)
|
|
{
|
|
Render_RegisterDependency(From.GetId(), To.GetId());
|
|
}
|
|
|
|
void FStateStreamManagerImpl::Render_Update(double AbsoluteTime)
|
|
{
|
|
for (const StateStreamRec& Rec : StateStreams)
|
|
{
|
|
Rec.Stream->Render_Update(AbsoluteTime);
|
|
}
|
|
|
|
for (const StateStreamRec& Rec : StateStreams)
|
|
{
|
|
Rec.Stream->Render_PostUpdate();
|
|
}
|
|
}
|
|
|
|
void FStateStreamManagerImpl::Render_Exit()
|
|
{
|
|
GarbageCollectTask.Wait();
|
|
|
|
for (const StateStreamRec& Rec : StateStreams)
|
|
{
|
|
Rec.Stream->Render_Exit();
|
|
}
|
|
bRenderExited = true;
|
|
}
|
|
|
|
void FStateStreamManagerImpl::Render_GarbageCollect(bool AsTask)
|
|
{
|
|
GarbageCollectTask.Wait();
|
|
|
|
auto Func = [this]()
|
|
{
|
|
for (const StateStreamRec& Rec : StateStreams)
|
|
{
|
|
Rec.Stream->Render_GarbageCollect();
|
|
}
|
|
};
|
|
if (AsTask)
|
|
{
|
|
GarbageCollectTask = UE::Tasks::Launch(UE_SOURCE_LOCATION, MoveTemp(Func));
|
|
}
|
|
else
|
|
{
|
|
Func();
|
|
}
|
|
}
|
|
|
|
IStateStream* FStateStreamManagerImpl::Render_GetStream(uint32 Id)
|
|
{
|
|
check(Id < uint32(StateStreamsLookup.Num()));
|
|
return StateStreamsLookup[Id];
|
|
}
|
|
|
|
void FStateStreamManagerImpl::Game_DebugRender(IStateStreamDebugRenderer& Renderer)
|
|
{
|
|
for (const StateStreamRec& Rec : StateStreams)
|
|
{
|
|
Rec.Stream->DebugRender(Renderer);
|
|
}
|
|
}
|
|
|
|
FStateStreamManagerImpl::~FStateStreamManagerImpl()
|
|
{
|
|
for (const StateStreamRec& Rec : StateStreams)
|
|
{
|
|
if (Rec.Owned)
|
|
{
|
|
delete Rec.Stream;
|
|
}
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
FStateStreamCreator* FStateStreamCreator::First;
|
|
|
|
FStateStreamCreator::FStateStreamCreator(uint32 Id_, FRegisterFunction&& InRegisterFunction, FUnregisterFunction&& InUnregisterFunction)
|
|
: RegisterFunction(MoveTemp(InRegisterFunction))
|
|
, UnregisterFunction(MoveTemp(InUnregisterFunction))
|
|
, Id(Id_)
|
|
{
|
|
Prev = nullptr;
|
|
for (FStateStreamCreator* It=First; It; It=It->Next)
|
|
{
|
|
if (Id < It->Id)
|
|
break;
|
|
Prev = It;
|
|
}
|
|
|
|
if (!Prev)
|
|
{
|
|
Next = First;
|
|
First = this;
|
|
}
|
|
else
|
|
{
|
|
Next = Prev->Next;
|
|
Prev->Next = this;
|
|
}
|
|
|
|
if (Next)
|
|
{
|
|
Next->Prev = this;
|
|
}
|
|
}
|
|
|
|
FStateStreamCreator::~FStateStreamCreator()
|
|
{
|
|
if (Next)
|
|
{
|
|
Next->Prev = Prev;
|
|
}
|
|
|
|
if (Prev)
|
|
{
|
|
Prev->Next = Next;
|
|
}
|
|
else
|
|
{
|
|
First = Next;
|
|
}
|
|
|
|
Next = nullptr;
|
|
Prev = nullptr;
|
|
}
|
|
|
|
void FStateStreamCreator::RegisterStateStreams(const FStateStreamRegisterContext& Context)
|
|
{
|
|
for (FStateStreamCreator* It=First; It; It=It->Next)
|
|
{
|
|
It->RegisterFunction(Context);
|
|
}
|
|
}
|
|
|
|
void FStateStreamCreator::UnregisterStateStreams(const FStateStreamUnregisterContext& Context)
|
|
{
|
|
for (FStateStreamCreator* It=First; It; It=It->Next)
|
|
{
|
|
It->UnregisterFunction(Context);
|
|
}
|
|
}
|
|
|
|
void FStateStreamRegisterContext::Register(IStateStream& StateStream, bool TakeOwnership) const
|
|
{
|
|
Manager.Render_Register(StateStream, TakeOwnership);
|
|
}
|
|
|
|
void FStateStreamRegisterContext::RegisterDependency(uint32 FromId, uint32 ToId) const
|
|
{
|
|
Manager.Render_RegisterDependency(FromId, ToId);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|