refactor: extract scene viewport post-pass planning

This commit is contained in:
2026-03-31 21:54:00 +08:00
parent ad237cb81e
commit f85fa78dd1
6 changed files with 435 additions and 114 deletions

View File

@@ -6,6 +6,8 @@ set(EDITOR_TEST_SOURCES
test_action_routing.cpp
test_scene_viewport_camera_controller.cpp
test_scene_viewport_move_gizmo.cpp
test_scene_viewport_rotate_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
@@ -14,6 +16,7 @@ set(EDITOR_TEST_SOURCES
${CMAKE_SOURCE_DIR}/editor/src/Managers/ProjectManager.cpp
${CMAKE_SOURCE_DIR}/editor/src/Viewport/SceneViewportPicker.cpp
${CMAKE_SOURCE_DIR}/editor/src/Viewport/SceneViewportMoveGizmo.cpp
${CMAKE_SOURCE_DIR}/editor/src/Viewport/SceneViewportRotateGizmo.cpp
${CMAKE_SOURCE_DIR}/editor/src/Viewport/SceneViewportGrid.cpp
)

View File

@@ -0,0 +1,104 @@
#include <gtest/gtest.h>
#include "Viewport/SceneViewportPostPassPlan.h"
#include <vector>
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());
EXPECT_FALSE(plan.usesSelectionMaskSurface);
EXPECT_FALSE(plan.usesSelectionMaskShaderView);
}
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>{
SceneViewportPostPassStep::ColorToRenderTarget,
SceneViewportPostPassStep::InfiniteGrid,
SceneViewportPostPassStep::ColorToShaderResource
}));
EXPECT_FALSE(plan.usesSelectionMaskSurface);
EXPECT_FALSE(plan.usesSelectionMaskShaderView);
}
TEST(SceneViewportPostPassPlan_Test, BuildsSelectionOutlinePlanWhenSelectionResourcesExist) {
SceneViewportPostPassPlanInput input = {};
input.overlayValid = true;
input.hasSelection = true;
input.hasSelectionMaskRenderTarget = true;
input.hasSelectionMaskShaderView = true;
const auto plan = BuildSceneViewportPostPassPlan(input);
ASSERT_TRUE(plan.valid);
EXPECT_EQ(
plan.steps,
(std::vector<SceneViewportPostPassStep>{
SceneViewportPostPassStep::SelectionMask,
SceneViewportPostPassStep::ColorToRenderTarget,
SceneViewportPostPassStep::InfiniteGrid,
SceneViewportPostPassStep::SelectionOutline,
SceneViewportPostPassStep::ColorToShaderResource
}));
EXPECT_TRUE(plan.usesSelectionMaskSurface);
EXPECT_TRUE(plan.usesSelectionMaskShaderView);
}
TEST(SceneViewportPostPassPlan_Test, SkipsSelectionSpecificPassesWhenMaskResourcesAreMissing) {
SceneViewportPostPassPlanInput input = {};
input.overlayValid = true;
input.hasSelection = true;
input.hasSelectionMaskRenderTarget = true;
input.hasSelectionMaskShaderView = false;
const auto plan = BuildSceneViewportPostPassPlan(input);
ASSERT_TRUE(plan.valid);
EXPECT_EQ(
plan.steps,
(std::vector<SceneViewportPostPassStep>{
SceneViewportPostPassStep::ColorToRenderTarget,
SceneViewportPostPassStep::InfiniteGrid,
SceneViewportPostPassStep::ColorToShaderResource
}));
EXPECT_FALSE(plan.usesSelectionMaskSurface);
EXPECT_FALSE(plan.usesSelectionMaskShaderView);
}
TEST(SceneViewportPostPassPlan_Test, BuildsDebugMaskPlanWithoutSelectionMaskTarget) {
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>{
SceneViewportPostPassStep::ColorToRenderTarget,
SceneViewportPostPassStep::SelectionMaskDebug,
SceneViewportPostPassStep::ColorToShaderResource
}));
EXPECT_FALSE(plan.usesSelectionMaskSurface);
EXPECT_FALSE(plan.usesSelectionMaskShaderView);
}
} // namespace