#pragma once #include "Passes/SceneViewportGridPass.h" #include "Passes/SceneViewportSelectionOutlinePass.h" #include "Passes/SceneViewportEditorOverlayPass.h" #include "SceneViewportEditorOverlayData.h" #include "ViewportHostRenderFlowUtils.h" #include #include #include #include #include #include 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(const SceneViewportOverlayFrameData&)>; using SceneViewportGridPassFactory = std::function(const SceneViewportGridPassData&)>; using SceneViewportSelectionOutlinePassFactory = std::function( ViewportRenderTargets*, const std::vector&, const SceneViewportSelectionOutlineStyle&)>; struct SceneViewportRenderPlanBuildResult { SceneViewportRenderPlan plan = {}; const char* warningStatusText = nullptr; }; inline SceneViewportRenderPlanBuildResult BuildSceneViewportRenderPlan( ViewportRenderTargets& targets, const SceneViewportOverlayData& overlay, const std::vector& 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 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 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 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