Stabilize visible render item sorting
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user