refactor: move scene view post-pass planning into renderer

This commit is contained in:
2026-04-01 18:42:51 +08:00
parent 1ff2800b29
commit 44771d3cc1
8 changed files with 187 additions and 183 deletions

View File

@@ -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
)

View File

@@ -0,0 +1,108 @@
#include <gtest/gtest.h>
#include <XCEngine/Rendering/Passes/BuiltinSceneViewPostPassPlan.h>
#include <vector>
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>{
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>{
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>{
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>{
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>{
BuiltinSceneViewPostPassStep::ColorToRenderTarget,
BuiltinSceneViewPostPassStep::ColorToShaderResource
}));
}
} // namespace

View File

@@ -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

View File

@@ -1,108 +0,0 @@
#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());
}
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
}));
}
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>{
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>{
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>{
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>{
SceneViewportPostPassStep::ColorToRenderTarget,
SceneViewportPostPassStep::ColorToShaderResource
}));
}
} // namespace