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