177 lines
4.8 KiB
C++
177 lines
4.8 KiB
C++
// Fill out your copyright notice in the Description page of Project Settings.
|
|
|
|
|
|
#include "VRM4U_RenderSubsystem.h"
|
|
#include "VrmExtensionRimFilterData.h"
|
|
#include "RenderGraphBuilder.h"
|
|
#include "RenderGraphResources.h"
|
|
#include "RenderGraphUtils.h"
|
|
#include "EngineModule.h"
|
|
#include "Engine/TextureRenderTarget2D.h"
|
|
#include "TextureResource.h"
|
|
#include "Engine/SkeletalMesh.h"
|
|
#include "RendererInterface.h"
|
|
#include "ScreenPass.h"
|
|
#include "Runtime/Renderer/Private/SceneRendering.h"
|
|
#include "SceneRenderTargetParameters.h"
|
|
#include "Slate/SceneViewport.h"
|
|
#include "ScreenRendering.h"
|
|
#if UE_VERSION_OLDER_THAN(5,4,0)
|
|
#include "Runtime/Renderer/Private/SceneTextures.h"
|
|
#endif
|
|
|
|
|
|
#if WITH_EDITOR
|
|
#include "LevelEditor.h"
|
|
#endif
|
|
|
|
void UVRM4U_RenderSubsystem::Initialize(FSubsystemCollectionBase& Collection) {
|
|
Super::Initialize(Collection);
|
|
|
|
// generate
|
|
SceneViewExtension = FSceneViewExtensions::NewExtension<FVrmSceneViewExtension>();
|
|
}
|
|
|
|
void UVRM4U_RenderSubsystem::Deinitialize() {
|
|
|
|
{
|
|
FScopeLock lock(&cs_rim);
|
|
RimFilterData.Empty();
|
|
}
|
|
Super::Deinitialize();
|
|
}
|
|
|
|
void UVRM4U_RenderSubsystem::OnResolvedSceneColor_RenderThread(FRDGBuilder& GraphBuilder, const FSceneTextures& SceneTextures) {
|
|
}
|
|
|
|
|
|
#if WITH_EDITOR
|
|
void UVRM4U_RenderSubsystem::OnMapChange(UWorld* World, EMapChangeType ChangeType) {
|
|
FVRM4URenderModule* m = FModuleManager::GetModulePtr<FVRM4URenderModule>("VRM4URender");
|
|
if (m != nullptr) {
|
|
m->OnMapChange(World, ChangeType);
|
|
}
|
|
}
|
|
|
|
void UVRM4U_RenderSubsystem::OnPIEEvent(bool bPIEBegin, bool bPIEEnd) {
|
|
FVRM4URenderModule* m = FModuleManager::GetModulePtr<FVRM4URenderModule>("VRM4URender");
|
|
if (m != nullptr) {
|
|
m->OnPIEEvent(bPIEBegin, bPIEEnd);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
|
|
void UVRM4U_RenderSubsystem::RenderPre(FRDGBuilder& GraphBuilder) {
|
|
}
|
|
void UVRM4U_RenderSubsystem::RenderPost(FRDGBuilder& GraphBuilder) {
|
|
}
|
|
|
|
void UVRM4U_RenderSubsystem::AddCaptureTexture(UTextureRenderTarget2D* Texture, EVRM4U_CaptureSource CaptureSource) {
|
|
if (Texture == nullptr) return;
|
|
|
|
FVRM4URenderModule* m = FModuleManager::GetModulePtr<FVRM4URenderModule>("VRM4URender");
|
|
if (m != nullptr){
|
|
m->CaptureList.FindOrAdd(Texture) = CaptureSource;
|
|
}
|
|
|
|
|
|
#if WITH_EDITOR
|
|
if (HandleTearDown.IsValid() == false){
|
|
if (FModuleManager::Get().IsModuleLoaded("LevelEditor"))
|
|
{
|
|
FLevelEditorModule& LevelEditor = FModuleManager::GetModuleChecked<FLevelEditorModule>("LevelEditor");
|
|
|
|
|
|
HandleTearDown = LevelEditor.OnMapChanged().AddUObject(this, &UVRM4U_RenderSubsystem::OnMapChange);
|
|
/*
|
|
HandleTearDown = LevelEditor.OnMapChanged().AddLambda([&](UWorld* World, EMapChangeType ChangeType)
|
|
{
|
|
if (ChangeType == EMapChangeType::TearDownWorld)
|
|
{
|
|
CaptureList.Empty();
|
|
}
|
|
});
|
|
*/
|
|
}
|
|
}
|
|
|
|
if (bInitPIE == false) {
|
|
bInitPIE = true;
|
|
FEditorDelegates::BeginPIE.AddLambda([&](const bool bIsSimulating) {
|
|
this->OnPIEEvent(true, false);
|
|
});
|
|
FEditorDelegates::EndPIE.AddLambda([&](const bool bIsSimulating) {
|
|
this->OnPIEEvent(false, true);
|
|
});
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void UVRM4U_RenderSubsystem::RemoveCaptureTexture(UTextureRenderTarget2D* Texture) {
|
|
FVRM4URenderModule* m = FModuleManager::GetModulePtr<FVRM4URenderModule>("VRM4URender");
|
|
if (m != nullptr) {
|
|
m->CaptureList.Remove(Texture);
|
|
}
|
|
}
|
|
|
|
void UVRM4U_RenderSubsystem::RemoveAllCaptureTexture() {
|
|
FVRM4URenderModule* m = FModuleManager::GetModulePtr<FVRM4URenderModule>("VRM4URender");
|
|
if (m != nullptr) {
|
|
m->CaptureList.Empty();
|
|
}
|
|
}
|
|
|
|
|
|
void UVRM4U_RenderSubsystem::ResetSceneTextureExtentHistory() {
|
|
::ResetSceneTextureExtentHistory();
|
|
}
|
|
|
|
void UVRM4U_RenderSubsystem::SetViewExtension(bool bEnable) {
|
|
}
|
|
|
|
void UVRM4U_RenderSubsystem::AddRimFilterData(class UVrmExtensionRimFilterData* FilterData) {
|
|
FScopeLock lock(&cs_rim);
|
|
RimFilterData.AddUnique(FilterData);
|
|
}
|
|
|
|
void UVRM4U_RenderSubsystem::RemoveRimFilterData(class UVrmExtensionRimFilterData* FilterData) {
|
|
FScopeLock lock(&cs_rim);
|
|
RimFilterData.Remove(FilterData);
|
|
}
|
|
|
|
void UVRM4U_RenderSubsystem::RemoveRimFilterDataByPriority(int Priority) {
|
|
FScopeLock lock(&cs_rim);
|
|
if (Priority < 0) {
|
|
RimFilterData.Empty();
|
|
return;
|
|
}
|
|
RimFilterData.RemoveAll([&Priority](const TWeakObjectPtr<UVrmExtensionRimFilterData>& Item) {
|
|
if (Item.IsValid() == false) return true;
|
|
return Item->Priority == Priority;
|
|
});
|
|
}
|
|
|
|
TArray<UVrmExtensionRimFilterData::FFilterData> UVRM4U_RenderSubsystem::GenerateFilterData() {
|
|
FScopeLock lock(&cs_rim);
|
|
|
|
RimFilterData.RemoveAll([](const TWeakObjectPtr<UVrmExtensionRimFilterData>& Item) {
|
|
return !Item.IsValid();
|
|
});
|
|
|
|
RimFilterData.Sort([](const TWeakObjectPtr<UVrmExtensionRimFilterData>& A, const TWeakObjectPtr<UVrmExtensionRimFilterData>& B)
|
|
{
|
|
return A->Priority < B->Priority;
|
|
});
|
|
|
|
TArray<UVrmExtensionRimFilterData::FFilterData> f;
|
|
for (auto& a : RimFilterData) {
|
|
auto d = a->GetFilterData();
|
|
if (d.bUseFilter == false) continue;
|
|
f.Add(MoveTemp(d));
|
|
}
|
|
return MoveTemp(f);
|
|
}
|
|
|
|
|