diff --git a/editor/src/Viewport/SceneViewportPostPassPlan.h b/editor/src/Viewport/SceneViewportPostPassPlan.h deleted file mode 100644 index 7fb0718c..00000000 --- a/editor/src/Viewport/SceneViewportPostPassPlan.h +++ /dev/null @@ -1,65 +0,0 @@ -#pragma once - -#include -#include - -namespace XCEngine { -namespace Editor { - -enum class SceneViewportPostPassStep : uint8_t { - ColorToRenderTarget, - InfiniteGrid, - SelectionOutline, - ColorToShaderResource, - SelectionMaskDebug -}; - -struct SceneViewportPostPassPlanInput { - bool overlayValid = false; - bool hasSelection = false; - bool debugSelectionMask = false; - bool hasObjectIdShaderView = false; -}; - -struct SceneViewportPostPassPlan { - bool valid = false; - std::vector steps; -}; - -inline SceneViewportPostPassPlan BuildSceneViewportPostPassPlan( - const SceneViewportPostPassPlanInput& input) { - SceneViewportPostPassPlan plan = {}; - if (!input.overlayValid) { - return plan; - } - - plan.valid = true; - - if (input.debugSelectionMask) { - plan.steps.push_back(SceneViewportPostPassStep::ColorToRenderTarget); - if (input.hasSelection && input.hasObjectIdShaderView) { - plan.steps.push_back(SceneViewportPostPassStep::SelectionMaskDebug); - } - plan.steps.push_back(SceneViewportPostPassStep::ColorToShaderResource); - return plan; - } - - plan.steps.push_back(SceneViewportPostPassStep::ColorToRenderTarget); - plan.steps.push_back(SceneViewportPostPassStep::InfiniteGrid); - - if (input.hasSelection && input.hasObjectIdShaderView) { - plan.steps = { - SceneViewportPostPassStep::ColorToRenderTarget, - SceneViewportPostPassStep::InfiniteGrid, - SceneViewportPostPassStep::SelectionOutline, - SceneViewportPostPassStep::ColorToShaderResource - }; - return plan; - } - - plan.steps.push_back(SceneViewportPostPassStep::ColorToShaderResource); - return plan; -} - -} // namespace Editor -} // namespace XCEngine diff --git a/editor/src/Viewport/ViewportHostService.h b/editor/src/Viewport/ViewportHostService.h index c0336095..f9d8ee2f 100644 --- a/editor/src/Viewport/ViewportHostService.h +++ b/editor/src/Viewport/ViewportHostService.h @@ -6,7 +6,6 @@ #include "IViewportHostService.h" #include "SceneViewportPicker.h" #include "SceneViewportCameraController.h" -#include "SceneViewportPostPassPlan.h" #include "UI/ImGuiBackendBridge.h" #include @@ -18,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -688,25 +688,25 @@ private: } void AddSceneViewPostPassStep( - SceneViewportPostPassStep step, + Rendering::Passes::BuiltinSceneViewPostPassStep step, ViewportEntry& entry, const SceneViewportOverlayData& overlay, const std::vector& selectedObjectIds, Rendering::RenderPassSequence& outPostPasses) { switch (step) { - case SceneViewportPostPassStep::ColorToRenderTarget: + case Rendering::Passes::BuiltinSceneViewPostPassStep::ColorToRenderTarget: AddSceneColorToRenderTargetPass(entry, outPostPasses); break; - case SceneViewportPostPassStep::InfiniteGrid: + case Rendering::Passes::BuiltinSceneViewPostPassStep::InfiniteGrid: AddSceneInfiniteGridPass(entry, overlay, outPostPasses); break; - case SceneViewportPostPassStep::SelectionOutline: + case Rendering::Passes::BuiltinSceneViewPostPassStep::SelectionOutline: AddSceneSelectionOutlinePass(entry, selectedObjectIds, outPostPasses); break; - case SceneViewportPostPassStep::ColorToShaderResource: + case Rendering::Passes::BuiltinSceneViewPostPassStep::ColorToShaderResource: AddSceneColorToShaderResourcePass(entry, outPostPasses); break; - case SceneViewportPostPassStep::SelectionMaskDebug: + case Rendering::Passes::BuiltinSceneViewPostPassStep::SelectionMaskDebug: AddSceneSelectionMaskDebugPass( entry, selectedObjectIds, @@ -731,7 +731,8 @@ private: SetViewportStatusIfEmpty(entry.statusText, "Scene object id shader view is unavailable"); } - const SceneViewportPostPassPlan plan = BuildSceneViewportPostPassPlan({ + const Rendering::Passes::BuiltinSceneViewPostPassPlan plan = + Rendering::Passes::BuildBuiltinSceneViewPostPassPlan({ overlay.valid, hasSelection, kDebugSceneSelectionMask, @@ -741,7 +742,7 @@ private: return false; } - for (const SceneViewportPostPassStep step : plan.steps) { + for (const Rendering::Passes::BuiltinSceneViewPostPassStep step : plan.steps) { AddSceneViewPostPassStep( step, entry, diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index 6fd5c541..18f3a090 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -346,6 +346,7 @@ add_library(XCEngine STATIC ${CMAKE_CURRENT_SOURCE_DIR}/include/XCEngine/Rendering/SceneRenderer.h ${CMAKE_CURRENT_SOURCE_DIR}/include/XCEngine/Rendering/Passes/BuiltinObjectIdPass.h ${CMAKE_CURRENT_SOURCE_DIR}/include/XCEngine/Rendering/Passes/BuiltinInfiniteGridPass.h + ${CMAKE_CURRENT_SOURCE_DIR}/include/XCEngine/Rendering/Passes/BuiltinSceneViewPostPassPlan.h ${CMAKE_CURRENT_SOURCE_DIR}/include/XCEngine/Rendering/Passes/BuiltinObjectIdOutlinePass.h ${CMAKE_CURRENT_SOURCE_DIR}/include/XCEngine/Rendering/Pipelines/BuiltinForwardPipeline.h ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/CameraRenderer.cpp diff --git a/engine/include/XCEngine/Rendering/Passes/BuiltinSceneViewPostPassPlan.h b/engine/include/XCEngine/Rendering/Passes/BuiltinSceneViewPostPassPlan.h new file mode 100644 index 00000000..8f0b2d54 --- /dev/null +++ b/engine/include/XCEngine/Rendering/Passes/BuiltinSceneViewPostPassPlan.h @@ -0,0 +1,67 @@ +#pragma once + +#include +#include + +namespace XCEngine { +namespace Rendering { +namespace Passes { + +enum class BuiltinSceneViewPostPassStep : uint8_t { + ColorToRenderTarget, + InfiniteGrid, + SelectionOutline, + ColorToShaderResource, + SelectionMaskDebug +}; + +struct BuiltinSceneViewPostPassPlanInput { + bool overlayValid = false; + bool hasSelection = false; + bool debugSelectionMask = false; + bool hasObjectIdShaderView = false; +}; + +struct BuiltinSceneViewPostPassPlan { + bool valid = false; + std::vector steps; +}; + +inline BuiltinSceneViewPostPassPlan BuildBuiltinSceneViewPostPassPlan( + const BuiltinSceneViewPostPassPlanInput& input) { + BuiltinSceneViewPostPassPlan plan = {}; + if (!input.overlayValid) { + return plan; + } + + plan.valid = true; + + if (input.debugSelectionMask) { + plan.steps.push_back(BuiltinSceneViewPostPassStep::ColorToRenderTarget); + if (input.hasSelection && input.hasObjectIdShaderView) { + plan.steps.push_back(BuiltinSceneViewPostPassStep::SelectionMaskDebug); + } + plan.steps.push_back(BuiltinSceneViewPostPassStep::ColorToShaderResource); + return plan; + } + + plan.steps.push_back(BuiltinSceneViewPostPassStep::ColorToRenderTarget); + plan.steps.push_back(BuiltinSceneViewPostPassStep::InfiniteGrid); + + if (input.hasSelection && input.hasObjectIdShaderView) { + plan.steps = { + BuiltinSceneViewPostPassStep::ColorToRenderTarget, + BuiltinSceneViewPostPassStep::InfiniteGrid, + BuiltinSceneViewPostPassStep::SelectionOutline, + BuiltinSceneViewPostPassStep::ColorToShaderResource + }; + return plan; + } + + plan.steps.push_back(BuiltinSceneViewPostPassStep::ColorToShaderResource); + return plan; +} + +} // namespace Passes +} // namespace Rendering +} // namespace XCEngine diff --git a/tests/Rendering/unit/CMakeLists.txt b/tests/Rendering/unit/CMakeLists.txt index 47dd12f8..a050811f 100644 --- a/tests/Rendering/unit/CMakeLists.txt +++ b/tests/Rendering/unit/CMakeLists.txt @@ -5,6 +5,7 @@ project(XCEngine_RenderingUnitTests) set(RENDERING_UNIT_TEST_SOURCES test_render_pass.cpp test_builtin_forward_pipeline.cpp + test_builtin_scene_view_post_pass_plan.cpp test_camera_scene_renderer.cpp test_render_scene_extractor.cpp ) diff --git a/tests/Rendering/unit/test_builtin_scene_view_post_pass_plan.cpp b/tests/Rendering/unit/test_builtin_scene_view_post_pass_plan.cpp new file mode 100644 index 00000000..be8b8748 --- /dev/null +++ b/tests/Rendering/unit/test_builtin_scene_view_post_pass_plan.cpp @@ -0,0 +1,108 @@ +#include + +#include + +#include + +namespace { + +using XCEngine::Rendering::Passes::BuildBuiltinSceneViewPostPassPlan; +using XCEngine::Rendering::Passes::BuiltinSceneViewPostPassPlanInput; +using XCEngine::Rendering::Passes::BuiltinSceneViewPostPassStep; + +TEST(BuiltinSceneViewPostPassPlan_Test, ReturnsInvalidPlanWhenOverlayIsUnavailable) { + const auto plan = BuildBuiltinSceneViewPostPassPlan({}); + + EXPECT_FALSE(plan.valid); + EXPECT_TRUE(plan.steps.empty()); +} + +TEST(BuiltinSceneViewPostPassPlan_Test, BuildsGridOnlyPlanWhenNothingIsSelected) { + BuiltinSceneViewPostPassPlanInput input = {}; + input.overlayValid = true; + + const auto plan = BuildBuiltinSceneViewPostPassPlan(input); + + ASSERT_TRUE(plan.valid); + EXPECT_EQ( + plan.steps, + (std::vector{ + BuiltinSceneViewPostPassStep::ColorToRenderTarget, + BuiltinSceneViewPostPassStep::InfiniteGrid, + BuiltinSceneViewPostPassStep::ColorToShaderResource + })); +} + +TEST(BuiltinSceneViewPostPassPlan_Test, BuildsSelectionOutlinePlanWhenObjectIdShaderViewExists) { + BuiltinSceneViewPostPassPlanInput input = {}; + input.overlayValid = true; + input.hasSelection = true; + input.hasObjectIdShaderView = true; + + const auto plan = BuildBuiltinSceneViewPostPassPlan(input); + + ASSERT_TRUE(plan.valid); + EXPECT_EQ( + plan.steps, + (std::vector{ + BuiltinSceneViewPostPassStep::ColorToRenderTarget, + BuiltinSceneViewPostPassStep::InfiniteGrid, + BuiltinSceneViewPostPassStep::SelectionOutline, + BuiltinSceneViewPostPassStep::ColorToShaderResource + })); +} + +TEST(BuiltinSceneViewPostPassPlan_Test, SkipsSelectionOutlineWhenObjectIdShaderViewIsMissing) { + BuiltinSceneViewPostPassPlanInput input = {}; + input.overlayValid = true; + input.hasSelection = true; + + const auto plan = BuildBuiltinSceneViewPostPassPlan(input); + + ASSERT_TRUE(plan.valid); + EXPECT_EQ( + plan.steps, + (std::vector{ + BuiltinSceneViewPostPassStep::ColorToRenderTarget, + BuiltinSceneViewPostPassStep::InfiniteGrid, + BuiltinSceneViewPostPassStep::ColorToShaderResource + })); +} + +TEST(BuiltinSceneViewPostPassPlan_Test, BuildsDebugMaskPlanFromObjectIdShaderView) { + BuiltinSceneViewPostPassPlanInput input = {}; + input.overlayValid = true; + input.hasSelection = true; + input.debugSelectionMask = true; + input.hasObjectIdShaderView = true; + + const auto plan = BuildBuiltinSceneViewPostPassPlan(input); + + ASSERT_TRUE(plan.valid); + EXPECT_EQ( + plan.steps, + (std::vector{ + BuiltinSceneViewPostPassStep::ColorToRenderTarget, + BuiltinSceneViewPostPassStep::SelectionMaskDebug, + BuiltinSceneViewPostPassStep::ColorToShaderResource + })); +} + +TEST(BuiltinSceneViewPostPassPlan_Test, DebugMaskPlanFallsBackWhenObjectIdShaderViewIsMissing) { + BuiltinSceneViewPostPassPlanInput input = {}; + input.overlayValid = true; + input.hasSelection = true; + input.debugSelectionMask = true; + + const auto plan = BuildBuiltinSceneViewPostPassPlan(input); + + ASSERT_TRUE(plan.valid); + EXPECT_EQ( + plan.steps, + (std::vector{ + BuiltinSceneViewPostPassStep::ColorToRenderTarget, + BuiltinSceneViewPostPassStep::ColorToShaderResource + })); +} + +} // namespace diff --git a/tests/editor/CMakeLists.txt b/tests/editor/CMakeLists.txt index b63470f8..5dde6a17 100644 --- a/tests/editor/CMakeLists.txt +++ b/tests/editor/CMakeLists.txt @@ -8,7 +8,6 @@ set(EDITOR_TEST_SOURCES test_scene_viewport_move_gizmo.cpp test_scene_viewport_rotate_gizmo.cpp test_scene_viewport_scale_gizmo.cpp - test_scene_viewport_post_pass_plan.cpp test_scene_viewport_picker.cpp test_scene_viewport_overlay_renderer.cpp test_scene_viewport_selection_utils.cpp diff --git a/tests/editor/test_scene_viewport_post_pass_plan.cpp b/tests/editor/test_scene_viewport_post_pass_plan.cpp deleted file mode 100644 index e38b1a5f..00000000 --- a/tests/editor/test_scene_viewport_post_pass_plan.cpp +++ /dev/null @@ -1,108 +0,0 @@ -#include - -#include "Viewport/SceneViewportPostPassPlan.h" - -#include - -namespace { - -using XCEngine::Editor::BuildSceneViewportPostPassPlan; -using XCEngine::Editor::SceneViewportPostPassPlanInput; -using XCEngine::Editor::SceneViewportPostPassStep; - -TEST(SceneViewportPostPassPlan_Test, ReturnsInvalidPlanWhenOverlayIsUnavailable) { - const auto plan = BuildSceneViewportPostPassPlan({}); - - EXPECT_FALSE(plan.valid); - EXPECT_TRUE(plan.steps.empty()); -} - -TEST(SceneViewportPostPassPlan_Test, BuildsGridOnlyPlanWhenNothingIsSelected) { - SceneViewportPostPassPlanInput input = {}; - input.overlayValid = true; - - const auto plan = BuildSceneViewportPostPassPlan(input); - - ASSERT_TRUE(plan.valid); - EXPECT_EQ( - plan.steps, - (std::vector{ - SceneViewportPostPassStep::ColorToRenderTarget, - SceneViewportPostPassStep::InfiniteGrid, - SceneViewportPostPassStep::ColorToShaderResource - })); -} - -TEST(SceneViewportPostPassPlan_Test, BuildsSelectionOutlinePlanWhenObjectIdShaderViewExists) { - SceneViewportPostPassPlanInput input = {}; - input.overlayValid = true; - input.hasSelection = true; - input.hasObjectIdShaderView = true; - - const auto plan = BuildSceneViewportPostPassPlan(input); - - ASSERT_TRUE(plan.valid); - EXPECT_EQ( - plan.steps, - (std::vector{ - SceneViewportPostPassStep::ColorToRenderTarget, - SceneViewportPostPassStep::InfiniteGrid, - SceneViewportPostPassStep::SelectionOutline, - SceneViewportPostPassStep::ColorToShaderResource - })); -} - -TEST(SceneViewportPostPassPlan_Test, SkipsSelectionOutlineWhenObjectIdShaderViewIsMissing) { - SceneViewportPostPassPlanInput input = {}; - input.overlayValid = true; - input.hasSelection = true; - - const auto plan = BuildSceneViewportPostPassPlan(input); - - ASSERT_TRUE(plan.valid); - EXPECT_EQ( - plan.steps, - (std::vector{ - SceneViewportPostPassStep::ColorToRenderTarget, - SceneViewportPostPassStep::InfiniteGrid, - SceneViewportPostPassStep::ColorToShaderResource - })); -} - -TEST(SceneViewportPostPassPlan_Test, BuildsDebugMaskPlanFromObjectIdShaderView) { - SceneViewportPostPassPlanInput input = {}; - input.overlayValid = true; - input.hasSelection = true; - input.debugSelectionMask = true; - input.hasObjectIdShaderView = true; - - const auto plan = BuildSceneViewportPostPassPlan(input); - - ASSERT_TRUE(plan.valid); - EXPECT_EQ( - plan.steps, - (std::vector{ - SceneViewportPostPassStep::ColorToRenderTarget, - SceneViewportPostPassStep::SelectionMaskDebug, - SceneViewportPostPassStep::ColorToShaderResource - })); -} - -TEST(SceneViewportPostPassPlan_Test, DebugMaskPlanFallsBackWhenObjectIdShaderViewIsMissing) { - SceneViewportPostPassPlanInput input = {}; - input.overlayValid = true; - input.hasSelection = true; - input.debugSelectionMask = true; - - const auto plan = BuildSceneViewportPostPassPlan(input); - - ASSERT_TRUE(plan.valid); - EXPECT_EQ( - plan.steps, - (std::vector{ - SceneViewportPostPassStep::ColorToRenderTarget, - SceneViewportPostPassStep::ColorToShaderResource - })); -} - -} // namespace