From 131f46682bf5456d0325ce7d831578729014fc5e Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Fri, 10 Apr 2026 02:03:45 +0800 Subject: [PATCH] test: close render object id coverage gaps --- .../builtin/shaders/object-id-outline.shader | 6 +++--- tests/Rendering/unit/test_render_scene_utility.cpp | 6 +++++- tests/editor/test_viewport_object_id_picker.cpp | 14 ++++++++++++++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/engine/assets/builtin/shaders/object-id-outline.shader b/engine/assets/builtin/shaders/object-id-outline.shader index d199b6e1..5a5da620 100644 --- a/engine/assets/builtin/shaders/object-id-outline.shader +++ b/engine/assets/builtin/shaders/object-id-outline.shader @@ -46,9 +46,9 @@ Shader "Builtin Object Id Outline" bool IsSelectedObject(float4 objectIdColor) { - // Object-id surfaces encode the low 32 bits across RGBA, so low-valued - // runtime ids legitimately have zero alpha. Only the all-zero clear - // color should be treated as "no object". + // Object-id surfaces encode the formal 32-bit render object id across + // RGBA. Low-valued ids legitimately have zero alpha, so only the + // all-zero clear color should be treated as "no object". if (all(abs(objectIdColor) <= float4( 0.0025, 0.0025, diff --git a/tests/Rendering/unit/test_render_scene_utility.cpp b/tests/Rendering/unit/test_render_scene_utility.cpp index 4b18ccbe..994035a4 100644 --- a/tests/Rendering/unit/test_render_scene_utility.cpp +++ b/tests/Rendering/unit/test_render_scene_utility.cpp @@ -29,6 +29,7 @@ using XCEngine::Rendering::BuildRenderCameraData; using XCEngine::Rendering::CompareVisibleRenderItemsStable; using XCEngine::Rendering::CollectRenderItemsForEntityIds; using XCEngine::Rendering::ConvertRenderObjectIdToRuntimeObjectId; +using XCEngine::Rendering::IsValidRenderObjectId; using XCEngine::Rendering::VisibleRenderItem; using XCEngine::Rendering::kInvalidRenderObjectId; using XCEngine::Resources::Mesh; @@ -200,9 +201,10 @@ TEST_F(RenderSceneUtilityTest, CollectRenderItemsForEntityIdsFiltersInvalidTarge ASSERT_EQ(renderables.size(), 1u); EXPECT_EQ(renderables[0].gameObject, validObject); EXPECT_EQ(renderables[0].meshRenderer, validObject->GetComponent()); - EXPECT_TRUE(renderables[0].hasSection); + EXPECT_TRUE(IsValidRenderObjectId(renderables[0].renderObjectId)); EXPECT_NE(renderables[0].renderObjectId, kInvalidRenderObjectId); EXPECT_EQ(ConvertRenderObjectIdToRuntimeObjectId(renderables[0].renderObjectId), validObject->GetID()); + EXPECT_TRUE(renderables[0].hasSection); } TEST_F(RenderSceneUtilityTest, CollectRenderItemsForEntityIdsExpandsMeshSections) { @@ -221,6 +223,8 @@ TEST_F(RenderSceneUtilityTest, CollectRenderItemsForEntityIdsExpandsMeshSections ASSERT_EQ(renderables.size(), 2u); EXPECT_EQ(renderables[0].gameObject, object); + EXPECT_TRUE(IsValidRenderObjectId(renderables[0].renderObjectId)); + EXPECT_EQ(renderables[0].renderObjectId, renderables[1].renderObjectId); EXPECT_EQ(renderables[0].sectionIndex, 0u); EXPECT_EQ(renderables[0].materialIndex, 0u); EXPECT_EQ(renderables[1].sectionIndex, 1u); diff --git a/tests/editor/test_viewport_object_id_picker.cpp b/tests/editor/test_viewport_object_id_picker.cpp index 4ac7d02e..a75e6ad2 100644 --- a/tests/editor/test_viewport_object_id_picker.cpp +++ b/tests/editor/test_viewport_object_id_picker.cpp @@ -17,6 +17,7 @@ using XCEngine::Editor::ViewportObjectIdReadbackRequest; using XCEngine::RHI::RHICommandQueue; using XCEngine::RHI::RHITexture; using XCEngine::RHI::ResourceStates; +using XCEngine::Rendering::kInvalidRenderObjectId; using XCEngine::UI::UIPoint; using XCEngine::UI::UISize; @@ -85,6 +86,16 @@ TEST(ViewportObjectIdPickerTest, BuildReadbackRequestMapsViewportCoordinatesToTe TEST(ViewportObjectIdPickerTest, TryPickViewportObjectIdEntityDecodesReadbackColor) { const ViewportObjectIdPickContext context = CreateValidContext(); + const ViewportObjectIdPickResult result = PickViewportObjectIdEntity( + context, + [](const ViewportObjectIdReadbackRequest&, std::array& outRgba) { + outRgba = { 0x78, 0x56, 0x34, 0x12 }; + return true; + }); + EXPECT_EQ(result.renderObjectId, 0x12345678u); + EXPECT_EQ(result.entityId, 0x12345678ull); + EXPECT_TRUE(result.HasResolvedSample()); + uint64_t entityId = 0; ViewportObjectIdReadbackRequest capturedRequest = {}; const bool picked = TryPickViewportObjectIdEntity( @@ -113,6 +124,7 @@ TEST(ViewportObjectIdPickerTest, PickViewportObjectIdEntityReturnsSuccessForZero }); EXPECT_EQ(result.status, ViewportObjectIdPickStatus::Success); + EXPECT_EQ(result.renderObjectId, kInvalidRenderObjectId); EXPECT_EQ(result.entityId, 0u); EXPECT_TRUE(result.HasResolvedSample()); } @@ -128,6 +140,7 @@ TEST(ViewportObjectIdPickerTest, PickViewportObjectIdEntityReturnsUnavailableWhe }); EXPECT_EQ(result.status, ViewportObjectIdPickStatus::Unavailable); + EXPECT_EQ(result.renderObjectId, kInvalidRenderObjectId); EXPECT_EQ(result.entityId, 0u); EXPECT_FALSE(result.HasResolvedSample()); } @@ -157,6 +170,7 @@ TEST(ViewportObjectIdPickerTest, PickViewportObjectIdEntityReportsReadbackFailur }); EXPECT_EQ(result.status, ViewportObjectIdPickStatus::ReadbackFailed); + EXPECT_EQ(result.renderObjectId, kInvalidRenderObjectId); EXPECT_EQ(result.entityId, 0u); EXPECT_FALSE(result.HasResolvedSample()); }