Refactor scene viewport render planning
This commit is contained in:
96
editor/src/Viewport/SceneViewportRenderPlan.h
Normal file
96
editor/src/Viewport/SceneViewportRenderPlan.h
Normal file
@@ -0,0 +1,96 @@
|
||||
#pragma once
|
||||
|
||||
#include "Passes/SceneViewportEditorOverlayPass.h"
|
||||
#include "SceneViewportEditorOverlayData.h"
|
||||
#include "ViewportHostRenderFlowUtils.h"
|
||||
|
||||
#include <XCEngine/Core/Math/Color.h>
|
||||
#include <XCEngine/Rendering/RenderPass.h>
|
||||
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
namespace XCEngine {
|
||||
namespace Editor {
|
||||
|
||||
struct SceneViewportRenderPlan {
|
||||
Rendering::BuiltinPostProcessRequest builtinPostProcess = {};
|
||||
Rendering::RenderPassSequence postScenePasses = {};
|
||||
Rendering::RenderPassSequence overlayPasses = {};
|
||||
bool hasClearColorOverride = true;
|
||||
Math::Color clearColorOverride = Math::Color(0.27f, 0.27f, 0.27f, 1.0f);
|
||||
|
||||
bool HasPostScenePasses() const {
|
||||
return postScenePasses.GetPassCount() > 0;
|
||||
}
|
||||
|
||||
bool HasOverlayPasses() const {
|
||||
return overlayPasses.GetPassCount() > 0;
|
||||
}
|
||||
};
|
||||
|
||||
using SceneViewportOverlayPassFactory =
|
||||
std::function<std::unique_ptr<Rendering::RenderPass>(const SceneViewportOverlayFrameData&)>;
|
||||
|
||||
struct SceneViewportRenderPlanBuildResult {
|
||||
SceneViewportRenderPlan plan = {};
|
||||
const char* warningStatusText = nullptr;
|
||||
};
|
||||
|
||||
inline SceneViewportRenderPlanBuildResult BuildSceneViewportRenderPlan(
|
||||
const ViewportRenderTargets& targets,
|
||||
const SceneViewportOverlayData& overlay,
|
||||
const std::vector<uint64_t>& selectedObjectIds,
|
||||
const SceneViewportOverlayFrameData& editorOverlayFrameData,
|
||||
const SceneViewportOverlayFrameData& transientOverlayFrameData,
|
||||
const SceneViewportOverlayPassFactory& overlayPassFactory,
|
||||
bool debugSelectionMask = false) {
|
||||
SceneViewportRenderPlanBuildResult result = {};
|
||||
if (!overlay.valid) {
|
||||
return result;
|
||||
}
|
||||
|
||||
const SceneViewportBuiltinPostProcessBuildResult builtinPostProcess =
|
||||
BuildSceneViewportBuiltinPostProcess(
|
||||
overlay,
|
||||
selectedObjectIds,
|
||||
targets.objectIdShaderView != nullptr,
|
||||
debugSelectionMask);
|
||||
result.plan.builtinPostProcess = builtinPostProcess.request;
|
||||
result.warningStatusText = builtinPostProcess.warningStatusText;
|
||||
|
||||
SceneViewportOverlayFrameData renderOverlayFrameData = editorOverlayFrameData;
|
||||
AppendSceneViewportOverlayFrameData(renderOverlayFrameData, transientOverlayFrameData);
|
||||
if (renderOverlayFrameData.HasOverlayPrimitives() &&
|
||||
overlayPassFactory != nullptr) {
|
||||
std::unique_ptr<Rendering::RenderPass> overlayPass = overlayPassFactory(renderOverlayFrameData);
|
||||
if (overlayPass != nullptr) {
|
||||
result.plan.overlayPasses.AddPass(std::move(overlayPass));
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
inline void ApplySceneViewportRenderPlan(
|
||||
const ViewportRenderTargets& targets,
|
||||
SceneViewportRenderPlan& plan,
|
||||
Rendering::CameraRenderRequest& request) {
|
||||
ApplySceneViewportRenderRequestSetup(
|
||||
targets,
|
||||
&plan.builtinPostProcess,
|
||||
&plan.postScenePasses,
|
||||
request);
|
||||
|
||||
if (plan.HasOverlayPasses()) {
|
||||
request.overlayPasses = &plan.overlayPasses;
|
||||
}
|
||||
|
||||
request.hasClearColorOverride = plan.hasClearColorOverride;
|
||||
request.clearColorOverride = plan.clearColorOverride;
|
||||
}
|
||||
|
||||
} // namespace Editor
|
||||
} // namespace XCEngine
|
||||
Reference in New Issue
Block a user