cesium-native/CesiumUtility/test/TestAttributeCompression.cpp

77 lines
2.2 KiB
C++

#include <CesiumUtility/AttributeCompression.h>
#include <CesiumUtility/Math.h>
#include <doctest/doctest.h>
#include <glm/ext/vector_double3.hpp>
#include <glm/ext/vector_uint2_sized.hpp>
#include <glm/geometric.hpp>
#include <cstddef>
#include <cstdint>
#include <vector>
using namespace CesiumUtility;
TEST_CASE("AttributeCompression::octDecode") {
const std::vector<glm::u8vec2> input{
glm::u8vec2(128, 128),
glm::u8vec2(255, 255),
glm::u8vec2(128, 255),
glm::u8vec2(128, 0),
glm::u8vec2(255, 128),
glm::u8vec2(0, 128),
glm::u8vec2(170, 170),
glm::u8vec2(170, 85),
glm::u8vec2(85, 85),
glm::u8vec2(85, 170),
glm::u8vec2(213, 213),
glm::u8vec2(213, 42),
glm::u8vec2(42, 42),
glm::u8vec2(42, 213),
};
const std::vector<glm::dvec3> expected{
glm::dvec3(0.0, 0.0, 1.0),
glm::dvec3(0.0, 0.0, -1.0),
glm::dvec3(0.0, 1.0, 0.0),
glm::dvec3(0.0, -1.0, 0.0),
glm::dvec3(1.0, 0.0, 0.0),
glm::dvec3(-1.0, 0.0, 0.0),
glm::normalize(glm::dvec3(1.0, 1.0, 1.0)),
glm::normalize(glm::dvec3(1.0, -1.0, 1.0)),
glm::normalize(glm::dvec3(-1.0, -1.0, 1.0)),
glm::normalize(glm::dvec3(-1.0, 1.0, 1.0)),
glm::normalize(glm::dvec3(1.0, 1.0, -1.0)),
glm::normalize(glm::dvec3(1.0, -1.0, -1.0)),
glm::normalize(glm::dvec3(-1.0, -1.0, -1.0)),
glm::normalize(glm::dvec3(-1.0, 1.0, -1.0)),
};
for (size_t i = 0; i < expected.size(); i++) {
const glm::dvec3 value =
AttributeCompression::octDecode(input[i].x, input[i].y);
CHECK(Math::equalsEpsilon(value, expected[i], Math::Epsilon1));
}
}
TEST_CASE("AttributeCompression::decodeRGB565") {
const std::vector<uint16_t> input{
0,
// 0b00001_000001_00001
2081,
// 0b10000_100000_01000
33800,
// 0b11111_111111_11111
65535,
};
const std::vector<glm::dvec3> expected{
glm::dvec3(0.0),
glm::dvec3(1.0 / 31.0, 1.0 / 63.0, 1.0 / 31.0),
glm::dvec3(16.0 / 31.0, 32.0 / 63.0, 8.0 / 31.0),
glm::dvec3(1.0)};
for (size_t i = 0; i < expected.size(); i++) {
const glm::dvec3 value = AttributeCompression::decodeRGB565(input[i]);
CHECK(Math::equalsEpsilon(value, expected[i], Math::Epsilon6));
}
}