Remove scene viewport postprocess API from engine

This commit is contained in:
2026-04-03 15:26:17 +08:00
parent 7cc4aa3b45
commit e8f64407ba
13 changed files with 20 additions and 831 deletions

View File

@@ -86,7 +86,6 @@ CameraRenderer::~CameraRenderer() {
if (m_objectIdPass != nullptr) {
m_objectIdPass->Shutdown();
}
m_builtinPostProcessBuilder.Shutdown();
}
void CameraRenderer::SetPipeline(std::unique_ptr<RenderPipeline> pipeline) {
@@ -136,12 +135,6 @@ bool CameraRenderer::Render(
!request.objectId.IsValid()) {
return false;
}
if (request.builtinPostProcess.IsRequested() &&
request.builtinPostProcess.objectIdTextureView != nullptr &&
!request.objectId.IsRequested()) {
return false;
}
RenderSceneData sceneData = m_sceneExtractor.ExtractForCamera(
*request.scene,
*request.camera,
@@ -201,37 +194,6 @@ bool CameraRenderer::Render(
return false;
}
RenderPassSequence builtinPostProcessPasses = {};
bool builtinPostProcessPassesInitialized = false;
if (request.builtinPostProcess.IsRequested()) {
const Passes::BuiltinPostProcessPassSequenceBuildResult buildResult =
m_builtinPostProcessBuilder.Build(
{
request.builtinPostProcess.gridPassData,
request.builtinPostProcess.objectIdTextureView,
request.builtinPostProcess.selectedObjectIds,
request.builtinPostProcess.outlineStyle
},
builtinPostProcessPasses);
if (!buildResult.valid ||
!InitializePassSequence(
&builtinPostProcessPasses,
request.context,
builtinPostProcessPassesInitialized)) {
ShutdownPassSequence(request.postScenePasses, postScenePassesInitialized);
ShutdownPassSequence(request.preScenePasses, preScenePassesInitialized);
return false;
}
if (!builtinPostProcessPasses.Execute(passContext)) {
ShutdownPassSequence(&builtinPostProcessPasses, builtinPostProcessPassesInitialized);
ShutdownPassSequence(request.postScenePasses, postScenePassesInitialized);
ShutdownPassSequence(request.preScenePasses, preScenePassesInitialized);
return false;
}
}
ShutdownPassSequence(&builtinPostProcessPasses, builtinPostProcessPassesInitialized);
bool overlayPassesInitialized = false;
if (!InitializePassSequence(
request.overlayPasses,

View File

@@ -1,214 +0,0 @@
#include "Rendering/Passes/BuiltinPostProcessPassSequenceBuilder.h"
#include "Rendering/Passes/BuiltinPostProcessPassPlan.h"
#include <XCEngine/Core/Math/Color.h>
#include <XCEngine/RHI/RHICommandList.h>
#include <functional>
#include <memory>
#include <string>
#include <utility>
namespace XCEngine {
namespace Rendering {
namespace Passes {
namespace {
class LambdaRenderPass final : public RenderPass {
public:
using ExecuteCallback = std::function<bool(const RenderPassContext&)>;
LambdaRenderPass(std::string name, ExecuteCallback executeCallback)
: m_name(std::move(name))
, m_executeCallback(std::move(executeCallback)) {
}
const char* GetName() const override {
return m_name.c_str();
}
bool Execute(const RenderPassContext& context) override {
return m_executeCallback != nullptr && m_executeCallback(context);
}
private:
std::string m_name;
ExecuteCallback m_executeCallback;
};
template <typename Callback>
std::unique_ptr<RenderPass> MakeLambdaRenderPass(const char* name, Callback&& callback) {
return std::make_unique<LambdaRenderPass>(
name,
LambdaRenderPass::ExecuteCallback(std::forward<Callback>(callback)));
}
} // namespace
BuiltinPostProcessPassSequenceBuilder::~BuiltinPostProcessPassSequenceBuilder() {
Shutdown();
}
void BuiltinPostProcessPassSequenceBuilder::Shutdown() {
m_outlinePass.Shutdown();
m_gridPass.Shutdown();
}
BuiltinPostProcessPassSequenceBuildResult BuiltinPostProcessPassSequenceBuilder::Build(
const BuiltinPostProcessPassSequenceInput& input,
RenderPassSequence& outSequence) {
BuiltinPostProcessPassSequenceBuildResult result = {};
const bool hasSelection = !input.selectedObjectIds.empty();
const bool hasObjectIdTextureView = input.objectIdTextureView != nullptr;
if (hasSelection && !hasObjectIdTextureView) {
result.missingObjectIdTextureViewForSelection = true;
}
const BuiltinPostProcessPassPlan plan = BuildBuiltinPostProcessPassPlan({
input.gridPassData.valid,
hasSelection,
input.outlineStyle.debugSelectionMask,
hasObjectIdTextureView
});
if (!plan.valid) {
return result;
}
result.valid = true;
for (const BuiltinPostProcessPassStep step : plan.steps) {
switch (step) {
case BuiltinPostProcessPassStep::ColorToRenderTarget:
AddColorToRenderTargetPass(outSequence);
break;
case BuiltinPostProcessPassStep::InfiniteGrid:
AddInfiniteGridPass(input.gridPassData, outSequence);
break;
case BuiltinPostProcessPassStep::SelectionOutline:
AddSelectionOutlinePass(
input.objectIdTextureView,
input.selectedObjectIds,
input.outlineStyle,
outSequence);
break;
case BuiltinPostProcessPassStep::ColorToShaderResource:
AddColorToShaderResourcePass(outSequence);
break;
case BuiltinPostProcessPassStep::SelectionMaskDebug:
AddSelectionMaskDebugPass(
input.objectIdTextureView,
input.selectedObjectIds,
input.outlineStyle,
outSequence);
break;
default:
break;
}
}
return result;
}
void BuiltinPostProcessPassSequenceBuilder::AddColorToRenderTargetPass(
RenderPassSequence& outSequence) {
outSequence.AddPass(MakeLambdaRenderPass(
"SceneColorToRenderTarget",
[](const RenderPassContext& context) {
const std::vector<RHI::RHIResourceView*>& colorAttachments = context.surface.GetColorAttachments();
if (colorAttachments.empty() || colorAttachments[0] == nullptr || context.renderContext.commandList == nullptr) {
return false;
}
context.renderContext.commandList->TransitionBarrier(
colorAttachments[0],
context.surface.GetColorStateAfter(),
RHI::ResourceStates::RenderTarget);
return true;
}));
}
void BuiltinPostProcessPassSequenceBuilder::AddInfiniteGridPass(
const InfiniteGridPassData& gridPassData,
RenderPassSequence& outSequence) {
outSequence.AddPass(MakeLambdaRenderPass(
"SceneInfiniteGrid",
[this, gridPassData](const RenderPassContext& context) {
return m_gridPass.Render(
context.renderContext,
context.surface,
gridPassData);
}));
}
void BuiltinPostProcessPassSequenceBuilder::AddSelectionOutlinePass(
RHI::RHIResourceView* objectIdTextureView,
const std::vector<uint64_t>& selectedObjectIds,
const ObjectIdOutlineStyle& outlineStyle,
RenderPassSequence& outSequence) {
outSequence.AddPass(MakeLambdaRenderPass(
"SceneSelectionOutline",
[this, objectIdTextureView, selectedObjectIds, outlineStyle](const RenderPassContext& context) {
return m_outlinePass.Render(
context.renderContext,
context.surface,
objectIdTextureView,
selectedObjectIds,
outlineStyle);
}));
}
void BuiltinPostProcessPassSequenceBuilder::AddColorToShaderResourcePass(
RenderPassSequence& outSequence) {
outSequence.AddPass(MakeLambdaRenderPass(
"SceneColorToShaderResource",
[](const RenderPassContext& context) {
const std::vector<RHI::RHIResourceView*>& colorAttachments = context.surface.GetColorAttachments();
if (colorAttachments.empty() || colorAttachments[0] == nullptr || context.renderContext.commandList == nullptr) {
return false;
}
context.renderContext.commandList->TransitionBarrier(
colorAttachments[0],
RHI::ResourceStates::RenderTarget,
context.surface.GetColorStateAfter());
return true;
}));
}
void BuiltinPostProcessPassSequenceBuilder::AddSelectionMaskDebugPass(
RHI::RHIResourceView* objectIdTextureView,
const std::vector<uint64_t>& selectedObjectIds,
const ObjectIdOutlineStyle& outlineStyle,
RenderPassSequence& outSequence) {
outSequence.AddPass(MakeLambdaRenderPass(
"SceneSelectionMaskDebug",
[this, objectIdTextureView, selectedObjectIds, outlineStyle](const RenderPassContext& context) {
const std::vector<RHI::RHIResourceView*>& colorAttachments = context.surface.GetColorAttachments();
if (colorAttachments.empty() || colorAttachments[0] == nullptr || context.renderContext.commandList == nullptr) {
return false;
}
const float debugClearColor[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
RHI::RHIResourceView* colorView = colorAttachments[0];
context.renderContext.commandList->SetRenderTargets(
1,
&colorView,
context.surface.GetDepthAttachment());
context.renderContext.commandList->ClearRenderTarget(colorView, debugClearColor);
ObjectIdOutlineStyle debugStyle = outlineStyle;
debugStyle.debugSelectionMask = true;
return m_outlinePass.Render(
context.renderContext,
context.surface,
objectIdTextureView,
selectedObjectIds,
debugStyle);
}));
}
} // namespace Passes
} // namespace Rendering
} // namespace XCEngine