Files
UnrealEngine/Engine/Plugins/Runtime/nDisplay/Source/DisplayCluster/Private/DisplayClusterModule.cpp
2025-05-18 13:04:45 +08:00

259 lines
6.9 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "DisplayClusterModule.h"
#include "Cluster/DisplayClusterClusterManager.h"
#include "Config/DisplayClusterConfigManager.h"
#include "Game/DisplayClusterGameManager.h"
#include "Render/DisplayClusterRenderManager.h"
#include "DisplayClusterConfigurationTypes.h"
#include "DisplayClusterLightCardActor.h"
#include "DisplayClusterRootActor.h"
#if WITH_EDITOR
#include "Filters/CustomClassFilterData.h"
#include "LevelEditor.h"
#endif
#include "Misc/DisplayClusterGlobals.h"
#include "Misc/DisplayClusterLog.h"
#include "Misc/DisplayClusterTypesConverter.h"
FDisplayClusterModule::FDisplayClusterModule()
{
GDisplayCluster = this;
UE_LOG(LogDisplayClusterModule, Log, TEXT("Instantiating subsystem managers..."));
// Initialize internals (the order is important)
Managers.Add(MgrConfig = new FDisplayClusterConfigManager);
Managers.Add(MgrCluster = new FDisplayClusterClusterManager);
Managers.Add(MgrGame = new FDisplayClusterGameManager);
Managers.Add(MgrRender = new FDisplayClusterRenderManager);
}
FDisplayClusterModule::~FDisplayClusterModule()
{
GDisplayCluster = nullptr;
}
//////////////////////////////////////////////////////////////////////////////////////////////
// IModuleInterface
//////////////////////////////////////////////////////////////////////////////////////////////
void FDisplayClusterModule::StartupModule()
{
UE_LOG(LogDisplayClusterModule, Log, TEXT("DisplayCluster module has been started"));
#if WITH_EDITOR
RegisterOutlinerFilters();
#endif
}
void FDisplayClusterModule::ShutdownModule()
{
// Clean everything before .dtor call
Release();
}
#if WITH_EDITOR
void FDisplayClusterModule::RegisterOutlinerFilters()
{
if (FLevelEditorModule* LevelEditorModule = FModuleManager::GetModulePtr<FLevelEditorModule>(TEXT("LevelEditor")))
{
if (const TSharedPtr<FFilterCategory> FilterCategory = LevelEditorModule->GetOutlinerFilterCategory(FLevelEditorOutlinerBuiltInCategories::VirtualProduction()))
{
const TSharedRef<FCustomClassFilterData> LightCardActorClassData =
MakeShared<FCustomClassFilterData>(ADisplayClusterLightCardActor::StaticClass(), FilterCategory, FLinearColor::White);
LevelEditorModule->AddCustomClassFilterToOutliner(LightCardActorClassData);
const TSharedRef<FCustomClassFilterData> RootActorClassData =
MakeShared<FCustomClassFilterData>(ADisplayClusterRootActor::StaticClass(), FilterCategory, FLinearColor::White);
LevelEditorModule->AddCustomClassFilterToOutliner(RootActorClassData);
}
}
}
#endif
//////////////////////////////////////////////////////////////////////////////////////////////
// IPDisplayCluster
//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
// IPDisplayClusterManager
//////////////////////////////////////////////////////////////////////////////////////////////
bool FDisplayClusterModule::Init(EDisplayClusterOperationMode OperationMode)
{
CurrentOperationMode = OperationMode;
UE_LOG(LogDisplayClusterModule, Log, TEXT("Initializing subsystems to %s operation mode"), *DisplayClusterTypesConverter::template ToString(CurrentOperationMode));
bool bResult = true;
auto it = Managers.CreateIterator();
while (bResult && it)
{
bResult = bResult && (*it)->Init(CurrentOperationMode);
++it;
}
if (!bResult)
{
UE_LOG(LogDisplayClusterModule, Error, TEXT("An error occurred during internal initialization"));
}
return bResult;
}
void FDisplayClusterModule::Release()
{
UE_LOG(LogDisplayClusterModule, Log, TEXT("Cleaning up internals..."));
for (IPDisplayClusterManager* Manager : Managers)
{
Manager->Release();
delete Manager;
}
MgrCluster = nullptr;
MgrRender = nullptr;
MgrConfig = nullptr;
MgrGame = nullptr;
Managers.Empty();
}
bool FDisplayClusterModule::StartSession(UDisplayClusterConfigurationData* InConfigData, const FString& NodeId)
{
UE_LOG(LogDisplayClusterModule, Log, TEXT("StartSession with node ID '%s'"), *NodeId);
bool bResult = true;
auto it = Managers.CreateIterator();
while (bResult && it)
{
bResult = bResult && (*it)->StartSession(InConfigData, NodeId);
++it;
}
GetCallbacks().OnDisplayClusterStartSession().Broadcast();
if (!bResult)
{
UE_LOG(LogDisplayClusterModule, Error, TEXT("An error occurred during session start"));
}
return bResult;
}
void FDisplayClusterModule::EndSession()
{
UE_LOG(LogDisplayClusterModule, Log, TEXT("Stopping DisplayCluster session..."));
GetCallbacks().OnDisplayClusterEndSession().Broadcast();
for (IPDisplayClusterManager* const Manager : Managers)
{
Manager->EndSession();
}
}
bool FDisplayClusterModule::StartScene(UWorld* InWorld)
{
UE_LOG(LogDisplayClusterModule, Log, TEXT("Starting game..."));
checkSlow(InWorld);
bool bResult = true;
auto it = Managers.CreateIterator();
while (bResult && it)
{
bResult = bResult && (*it)->StartScene(InWorld);
++it;
}
if (!bResult)
{
UE_LOG(LogDisplayClusterModule, Error, TEXT("An error occurred during game (level) start"));
}
GetCallbacks().OnDisplayClusterStartScene().Broadcast();
return bResult;
}
void FDisplayClusterModule::EndScene()
{
UE_LOG(LogDisplayClusterModule, Log, TEXT("Stopping game..."));
GetCallbacks().OnDisplayClusterEndScene().Broadcast();
for (IPDisplayClusterManager* const Manager : Managers)
{
Manager->EndScene();
}
}
void FDisplayClusterModule::StartFrame(uint64 FrameNum)
{
UE_LOG(LogDisplayClusterModule, Verbose, TEXT("StartFrame: frame num - %llu"), FrameNum);
for (IPDisplayClusterManager* const Manager : Managers)
{
Manager->StartFrame(FrameNum);
}
GetCallbacks().OnDisplayClusterStartFrame().Broadcast(FrameNum);
}
void FDisplayClusterModule::EndFrame(uint64 FrameNum)
{
UE_LOG(LogDisplayClusterModule, Verbose, TEXT("EndFrame: frame num - %llu"), FrameNum);
for (IPDisplayClusterManager* const Manager : Managers)
{
Manager->EndFrame(FrameNum);
}
GetCallbacks().OnDisplayClusterEndFrame().Broadcast(FrameNum);
}
void FDisplayClusterModule::PreTick(float DeltaSeconds)
{
UE_LOG(LogDisplayClusterModule, Verbose, TEXT("PreTick: delta time - %f"), DeltaSeconds);
for (IPDisplayClusterManager* const Manager : Managers)
{
Manager->PreTick(DeltaSeconds);
}
GetCallbacks().OnDisplayClusterPreTick().Broadcast();
}
void FDisplayClusterModule::Tick(float DeltaSeconds)
{
UE_LOG(LogDisplayClusterModule, Verbose, TEXT("Tick: delta time - %f"), DeltaSeconds);
for (IPDisplayClusterManager* const Manager : Managers)
{
Manager->Tick(DeltaSeconds);
}
GetCallbacks().OnDisplayClusterTick().Broadcast();
}
void FDisplayClusterModule::PostTick(float DeltaSeconds)
{
UE_LOG(LogDisplayClusterModule, Verbose, TEXT("PostTick: delta time - %f"), DeltaSeconds);
for (IPDisplayClusterManager* const Manager : Managers)
{
Manager->PostTick(DeltaSeconds);
}
GetCallbacks().OnDisplayClusterPostTick().Broadcast();
}
IMPLEMENT_MODULE(FDisplayClusterModule, DisplayCluster)