refactor: drive scene view outline from object id

This commit is contained in:
2026-04-01 17:33:07 +08:00
parent 409e08d03c
commit b85571d9d4
8 changed files with 168 additions and 710 deletions

View File

@@ -15,8 +15,6 @@ TEST(SceneViewportPostPassPlan_Test, ReturnsInvalidPlanWhenOverlayIsUnavailable)
EXPECT_FALSE(plan.valid);
EXPECT_TRUE(plan.steps.empty());
EXPECT_FALSE(plan.usesSelectionMaskSurface);
EXPECT_FALSE(plan.usesSelectionMaskShaderView);
}
TEST(SceneViewportPostPassPlan_Test, BuildsGridOnlyPlanWhenNothingIsSelected) {
@@ -33,16 +31,13 @@ TEST(SceneViewportPostPassPlan_Test, BuildsGridOnlyPlanWhenNothingIsSelected) {
SceneViewportPostPassStep::InfiniteGrid,
SceneViewportPostPassStep::ColorToShaderResource
}));
EXPECT_FALSE(plan.usesSelectionMaskSurface);
EXPECT_FALSE(plan.usesSelectionMaskShaderView);
}
TEST(SceneViewportPostPassPlan_Test, BuildsSelectionOutlinePlanWhenSelectionResourcesExist) {
TEST(SceneViewportPostPassPlan_Test, BuildsSelectionOutlinePlanWhenObjectIdShaderViewExists) {
SceneViewportPostPassPlanInput input = {};
input.overlayValid = true;
input.hasSelection = true;
input.hasSelectionMaskRenderTarget = true;
input.hasSelectionMaskShaderView = true;
input.hasObjectIdShaderView = true;
const auto plan = BuildSceneViewportPostPassPlan(input);
@@ -50,22 +45,17 @@ TEST(SceneViewportPostPassPlan_Test, BuildsSelectionOutlinePlanWhenSelectionReso
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) {
TEST(SceneViewportPostPassPlan_Test, SkipsSelectionOutlineWhenObjectIdShaderViewIsMissing) {
SceneViewportPostPassPlanInput input = {};
input.overlayValid = true;
input.hasSelection = true;
input.hasSelectionMaskRenderTarget = true;
input.hasSelectionMaskShaderView = false;
const auto plan = BuildSceneViewportPostPassPlan(input);
@@ -77,11 +67,28 @@ TEST(SceneViewportPostPassPlan_Test, SkipsSelectionSpecificPassesWhenMaskResourc
SceneViewportPostPassStep::InfiniteGrid,
SceneViewportPostPassStep::ColorToShaderResource
}));
EXPECT_FALSE(plan.usesSelectionMaskSurface);
EXPECT_FALSE(plan.usesSelectionMaskShaderView);
}
TEST(SceneViewportPostPassPlan_Test, BuildsDebugMaskPlanWithoutSelectionMaskTarget) {
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;
@@ -94,11 +101,8 @@ TEST(SceneViewportPostPassPlan_Test, BuildsDebugMaskPlanWithoutSelectionMaskTarg
plan.steps,
(std::vector<SceneViewportPostPassStep>{
SceneViewportPostPassStep::ColorToRenderTarget,
SceneViewportPostPassStep::SelectionMaskDebug,
SceneViewportPostPassStep::ColorToShaderResource
}));
EXPECT_FALSE(plan.usesSelectionMaskSurface);
EXPECT_FALSE(plan.usesSelectionMaskShaderView);
}
} // namespace