Files
XCEngine/editor/src/Viewport/SceneViewportRenderPlan.h

120 lines
4.2 KiB
C++

#pragma once
#include "Passes/SceneViewportGridPass.h"
#include "Passes/SceneViewportSelectionOutlinePass.h"
#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::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&)>;
using SceneViewportGridPassFactory =
std::function<std::unique_ptr<Rendering::RenderPass>(const SceneViewportGridPassData&)>;
using SceneViewportSelectionOutlinePassFactory = std::function<std::unique_ptr<Rendering::RenderPass>(
ViewportRenderTargets*,
const std::vector<uint64_t>&,
const SceneViewportSelectionOutlineStyle&)>;
struct SceneViewportRenderPlanBuildResult {
SceneViewportRenderPlan plan = {};
const char* warningStatusText = nullptr;
};
inline SceneViewportRenderPlanBuildResult BuildSceneViewportRenderPlan(
ViewportRenderTargets& targets,
const SceneViewportOverlayData& overlay,
const std::vector<uint64_t>& selectedObjectIds,
const SceneViewportOverlayFrameData& editorOverlayFrameData,
const SceneViewportGridPassFactory& gridPassFactory,
const SceneViewportSelectionOutlinePassFactory& selectionOutlinePassFactory,
const SceneViewportOverlayPassFactory& overlayPassFactory,
bool debugSelectionMask = false) {
SceneViewportRenderPlanBuildResult result = {};
if (!overlay.valid) {
return result;
}
const SceneViewportGridPassData gridPassData = BuildSceneViewportGridPassData(overlay);
if (gridPassData.valid && gridPassFactory != nullptr) {
std::unique_ptr<Rendering::RenderPass> gridPass = gridPassFactory(gridPassData);
if (gridPass != nullptr) {
result.plan.postScenePasses.AddPass(std::move(gridPass));
}
}
if (!selectedObjectIds.empty()) {
if (targets.selectionMaskView != nullptr &&
targets.selectionMaskShaderView != nullptr &&
targets.depthView != nullptr &&
targets.depthShaderView != nullptr &&
selectionOutlinePassFactory != nullptr) {
std::unique_ptr<Rendering::RenderPass> selectionOutlinePass =
selectionOutlinePassFactory(
&targets,
selectedObjectIds,
BuildSceneViewportSelectionOutlineStyle(debugSelectionMask));
if (selectionOutlinePass != nullptr) {
result.plan.postScenePasses.AddPass(std::move(selectionOutlinePass));
}
} else if (!debugSelectionMask) {
result.warningStatusText = "Scene selection outline resources are unavailable";
}
}
if (editorOverlayFrameData.HasRenderPassPrimitives() &&
overlayPassFactory != nullptr) {
std::unique_ptr<Rendering::RenderPass> overlayPass = overlayPassFactory(editorOverlayFrameData);
if (overlayPass != nullptr) {
result.plan.overlayPasses.AddPass(std::move(overlayPass));
}
}
return result;
}
inline void ApplySceneViewportRenderPlan(
const ViewportRenderTargets& targets,
SceneViewportRenderPlan& plan,
Rendering::CameraFramePlan& framePlan) {
ApplySceneViewportRenderRequestSetup(
targets,
&plan.postScenePasses,
framePlan);
if (plan.HasOverlayPasses()) {
framePlan.overlayPasses = &plan.overlayPasses;
}
framePlan.request.hasClearColorOverride = plan.hasClearColorOverride;
framePlan.request.clearColorOverride = plan.clearColorOverride;
}
} // namespace Editor
} // namespace XCEngine