refactor: route scene view passes through camera renderer

This commit is contained in:
2026-04-02 12:47:06 +08:00
parent 0d3851204f
commit 697deb4e41
6 changed files with 107 additions and 29 deletions

View File

@@ -1,5 +1,7 @@
#pragma once
#include <XCEngine/Rendering/Passes/BuiltinInfiniteGridPass.h>
#include <XCEngine/Rendering/Passes/BuiltinObjectIdOutlinePass.h>
#include <XCEngine/Rendering/RenderPass.h>
#include <XCEngine/Rendering/RenderCameraData.h>
#include <XCEngine/Rendering/RenderContext.h>
@@ -30,12 +32,24 @@ struct ObjectIdRenderRequest {
}
};
struct BuiltinSceneViewPostProcessRequest {
Passes::InfiniteGridPassData gridPassData = {};
RHI::RHIResourceView* objectIdTextureView = nullptr;
std::vector<uint64_t> selectedObjectIds = {};
Passes::ObjectIdOutlineStyle outlineStyle = {};
bool IsRequested() const {
return gridPassData.valid;
}
};
struct CameraRenderRequest {
const Components::Scene* scene = nullptr;
Components::CameraComponent* camera = nullptr;
RenderContext context;
RenderSurface surface;
ObjectIdRenderRequest objectId;
BuiltinSceneViewPostProcessRequest builtinSceneViewPostProcess;
float cameraDepth = 0.0f;
uint8_t cameraStackOrder = 0;
RenderClearFlags clearFlags = RenderClearFlags::All;

View File

@@ -2,6 +2,7 @@
#include <XCEngine/Rendering/CameraRenderRequest.h>
#include <XCEngine/Rendering/ObjectIdPass.h>
#include <XCEngine/Rendering/Passes/BuiltinSceneViewPostPassSequenceBuilder.h>
#include <XCEngine/Rendering/RenderPipeline.h>
#include <memory>
@@ -43,6 +44,7 @@ private:
std::shared_ptr<const RenderPipelineAsset> m_pipelineAsset;
std::unique_ptr<RenderPipeline> m_pipeline;
std::unique_ptr<ObjectIdPass> m_objectIdPass;
Passes::BuiltinSceneViewPostPassSequenceBuilder m_builtinSceneViewPostProcessBuilder;
};
} // namespace Rendering

View File

@@ -86,6 +86,7 @@ CameraRenderer::~CameraRenderer() {
if (m_objectIdPass != nullptr) {
m_objectIdPass->Shutdown();
}
m_builtinSceneViewPostProcessBuilder.Shutdown();
}
void CameraRenderer::SetPipeline(std::unique_ptr<RenderPipeline> pipeline) {
@@ -135,6 +136,11 @@ bool CameraRenderer::Render(
!request.objectId.IsValid()) {
return false;
}
if (request.builtinSceneViewPostProcess.IsRequested() &&
request.builtinSceneViewPostProcess.objectIdTextureView != nullptr &&
!request.objectId.IsRequested()) {
return false;
}
RenderSceneData sceneData = m_sceneExtractor.ExtractForCamera(
*request.scene,
@@ -195,6 +201,36 @@ bool CameraRenderer::Render(
return false;
}
RenderPassSequence builtinSceneViewPostPasses = {};
bool builtinSceneViewPostPassesInitialized = false;
if (request.builtinSceneViewPostProcess.IsRequested()) {
const Passes::BuiltinSceneViewPostPassSequenceBuildResult buildResult =
m_builtinSceneViewPostProcessBuilder.Build(
{
request.builtinSceneViewPostProcess.gridPassData,
request.builtinSceneViewPostProcess.objectIdTextureView,
request.builtinSceneViewPostProcess.selectedObjectIds,
request.builtinSceneViewPostProcess.outlineStyle
},
builtinSceneViewPostPasses);
if (!buildResult.valid ||
!InitializePassSequence(
&builtinSceneViewPostPasses,
request.context,
builtinSceneViewPostPassesInitialized)) {
ShutdownPassSequence(request.postScenePasses, postScenePassesInitialized);
ShutdownPassSequence(request.preScenePasses, preScenePassesInitialized);
return false;
}
if (!builtinSceneViewPostPasses.Execute(passContext)) {
ShutdownPassSequence(&builtinSceneViewPostPasses, builtinSceneViewPostPassesInitialized);
ShutdownPassSequence(request.postScenePasses, postScenePassesInitialized);
ShutdownPassSequence(request.preScenePasses, preScenePassesInitialized);
return false;
}
}
ShutdownPassSequence(&builtinSceneViewPostPasses, builtinSceneViewPostPassesInitialized);
ShutdownPassSequence(request.postScenePasses, postScenePassesInitialized);
ShutdownPassSequence(request.preScenePasses, preScenePassesInitialized);