84 lines
2.7 KiB
C++
84 lines
2.7 KiB
C++
#include <gtest/gtest.h>
|
|
|
|
#include <XCEngine/Rendering/Picking/ObjectIdCodec.h>
|
|
#include <XCEngine/Rendering/Picking/RenderObjectIdRegistry.h>
|
|
|
|
using namespace XCEngine::Rendering;
|
|
|
|
TEST(ObjectIdEncoding_Test, RegistryMapsRuntimeObjectIdsToStableRenderObjectIds) {
|
|
RenderObjectIdRegistry& registry = RenderObjectIdRegistry::Get();
|
|
registry.Reset();
|
|
|
|
constexpr uint64_t runtimeObjectId = 0x1ABCDEF0123ull;
|
|
const RenderObjectId renderObjectId =
|
|
registry.GetOrAllocateRenderObjectId(runtimeObjectId);
|
|
|
|
ASSERT_TRUE(IsValidRenderObjectId(renderObjectId));
|
|
EXPECT_EQ(
|
|
registry.GetOrAllocateRenderObjectId(runtimeObjectId),
|
|
renderObjectId);
|
|
|
|
RenderObjectId resolvedRenderObjectId = kInvalidRenderObjectId;
|
|
EXPECT_TRUE(
|
|
registry.TryGetRenderObjectId(
|
|
runtimeObjectId,
|
|
resolvedRenderObjectId));
|
|
EXPECT_EQ(resolvedRenderObjectId, renderObjectId);
|
|
|
|
uint64_t resolvedRuntimeObjectId = 0u;
|
|
EXPECT_TRUE(
|
|
registry.TryResolveRuntimeObjectId(
|
|
renderObjectId,
|
|
resolvedRuntimeObjectId));
|
|
EXPECT_EQ(resolvedRuntimeObjectId, runtimeObjectId);
|
|
EXPECT_EQ(
|
|
registry.ResolveRuntimeObjectId(renderObjectId),
|
|
runtimeObjectId);
|
|
}
|
|
|
|
TEST(ObjectIdEncoding_Test, RegistryRejectsInvalidRuntimeAndRenderObjectIds) {
|
|
RenderObjectIdRegistry& registry = RenderObjectIdRegistry::Get();
|
|
registry.Reset();
|
|
|
|
EXPECT_EQ(
|
|
registry.GetOrAllocateRenderObjectId(0u),
|
|
kInvalidRenderObjectId);
|
|
|
|
RenderObjectId renderObjectId = 123u;
|
|
EXPECT_FALSE(
|
|
registry.TryGetRenderObjectId(
|
|
0u,
|
|
renderObjectId));
|
|
EXPECT_EQ(renderObjectId, kInvalidRenderObjectId);
|
|
|
|
uint64_t runtimeObjectId = 99u;
|
|
EXPECT_FALSE(
|
|
registry.TryResolveRuntimeObjectId(
|
|
kInvalidRenderObjectId,
|
|
runtimeObjectId));
|
|
EXPECT_EQ(runtimeObjectId, 0u);
|
|
EXPECT_EQ(
|
|
registry.ResolveRuntimeObjectId(kInvalidRenderObjectId),
|
|
0u);
|
|
}
|
|
|
|
TEST(ObjectIdEncoding_Test, DecodesColorBackToRenderObjectId) {
|
|
constexpr uint8_t r = 0x12u;
|
|
constexpr uint8_t g = 0x34u;
|
|
constexpr uint8_t b = 0x56u;
|
|
constexpr uint8_t a = 0x78u;
|
|
|
|
EXPECT_EQ(DecodeEncodedObjectIdFromColor(r, g, b, a), 0x78563412u);
|
|
EXPECT_EQ(DecodeRenderObjectIdFromColor(r, g, b, a), 0x78563412u);
|
|
}
|
|
|
|
TEST(ObjectIdEncoding_Test, EncodesColorChannelsFromRenderObjectId) {
|
|
const auto encodedColor = EncodeRenderObjectIdToColor(0x78563412u);
|
|
constexpr float kInv255 = 1.0f / 255.0f;
|
|
|
|
EXPECT_FLOAT_EQ(encodedColor.x, 0x12u * kInv255);
|
|
EXPECT_FLOAT_EQ(encodedColor.y, 0x34u * kInv255);
|
|
EXPECT_FLOAT_EQ(encodedColor.z, 0x56u * kInv255);
|
|
EXPECT_FLOAT_EQ(encodedColor.w, 0x78u * kInv255);
|
|
}
|