Remove scene viewport postprocess API from engine
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user