Stabilize visible render item sorting

This commit is contained in:
2026-04-05 19:19:47 +08:00
parent 31693a83b6
commit 1de8091b77
4 changed files with 73 additions and 16 deletions

View File

@@ -11,6 +11,8 @@
#include <cmath>
#include <memory>
#include <new>
#include <type_traits>
#include <vector>
namespace {
@@ -24,7 +26,9 @@ using XCEngine::Components::Scene;
using XCEngine::Math::Matrix4x4;
using XCEngine::Math::Vector3;
using XCEngine::Rendering::BuildRenderCameraData;
using XCEngine::Rendering::CompareVisibleRenderItemsStable;
using XCEngine::Rendering::CollectRenderItemsForEntityIds;
using XCEngine::Rendering::VisibleRenderItem;
using XCEngine::Resources::Mesh;
using XCEngine::Resources::MeshSection;
using XCEngine::Resources::StaticMeshVertex;
@@ -211,4 +215,33 @@ TEST_F(RenderSceneUtilityTest, CollectRenderItemsForEntityIdsExpandsMeshSections
EXPECT_EQ(renderables[1].materialIndex, 1u);
}
TEST(RenderSceneUtilityStandaloneTest, CompareVisibleRenderItemsUsesStableObjectIdOrdering) {
using Storage = std::aligned_storage_t<sizeof(GameObject), alignof(GameObject)>;
Storage storage[2];
GameObject* lowerIdHigherAddress = new (&storage[1]) GameObject("LowerId");
GameObject* higherIdLowerAddress = new (&storage[0]) GameObject("HigherId");
ASSERT_LT(lowerIdHigherAddress->GetID(), higherIdLowerAddress->GetID());
ASSERT_GT(
reinterpret_cast<uintptr_t>(lowerIdHigherAddress),
reinterpret_cast<uintptr_t>(higherIdLowerAddress));
VisibleRenderItem lhs = {};
lhs.gameObject = lowerIdHigherAddress;
lhs.renderQueue = 2000;
lhs.cameraDistanceSq = 9.0f;
VisibleRenderItem rhs = {};
rhs.gameObject = higherIdLowerAddress;
rhs.renderQueue = 2000;
rhs.cameraDistanceSq = 9.0f;
EXPECT_TRUE(CompareVisibleRenderItemsStable(lhs, rhs));
EXPECT_FALSE(CompareVisibleRenderItemsStable(rhs, lhs));
higherIdLowerAddress->~GameObject();
lowerIdHigherAddress->~GameObject();
}
} // namespace