21 return {std::vector<std::uint8_t>(96, 0xA5), {
22 {
"Scalar", 4,
sizeof(float), Type::Float},
23 {
"Pair", 16,
sizeof(glm::vec2), Type::Vec2},
24 {
"Triple", 32,
sizeof(glm::vec3), Type::Vec3},
25 {
"Color", 64,
sizeof(glm::vec4), Type::Vec4}
33 std::memcpy(&value, material.
buffer.data() + offset,
sizeof(T));
38 const std::vector<std::uint8_t>& before,
39 std::size_t offset, std::size_t size)
41 ASSERT_EQ(material.
buffer.size(), before.size());
42 for (std::size_t i = 0; i < before.size(); ++i)
44 if (i < offset || i >= offset + size)
46 EXPECT_EQ(material.
buffer[i], before[i]) <<
"byte " << i;
51void ExpectLayout(
const std::vector<MaterialParameterLayoutEntry>& actual,
52 const std::vector<MaterialParameterLayoutEntry>& expected)
54 ASSERT_EQ(actual.size(), expected.size());
55 for (
const auto& entry : expected)
57 SCOPED_TRACE(entry.name);
59 const auto found = std::find_if(actual.begin(), actual.end(),
61 ASSERT_NE(found, actual.end());
62 EXPECT_EQ(found->type, entry.type);
63 EXPECT_EQ(found->offset, entry.offset);
64 EXPECT_EQ(found->size, entry.size);
71 auto material = MakeMaterial();
72 const auto before = material.
buffer;
74 EXPECT_FLOAT_EQ(ReadValue<float>(material, 4), 1.25f);
75 ExpectUnchangedOutside(material, before, 4,
sizeof(
float));
80 auto material = MakeMaterial();
81 const auto before = material.
buffer;
83 ExpectNear(ReadValue<glm::vec2>(material, 16), glm::vec2(1.25f, -2.5f));
84 ExpectUnchangedOutside(material, before, 16,
sizeof(glm::vec2));
89 auto material = MakeMaterial();
90 const auto before = material.
buffer;
92 ExpectNear(ReadValue<glm::vec3>(material, 32), glm::vec3(1.25f, -2.5f, 3.75f));
93 ExpectUnchangedOutside(material, before, 32,
sizeof(glm::vec3));
98 auto material = MakeMaterial();
99 const auto before = material.
buffer;
100 material.
SetMaterialVec4(
"Color", glm::vec4(1.25f, -2.5f, 3.75f, 0.5f));
101 ExpectNear(ReadValue<glm::vec4>(material, 64), glm::vec4(1.25f, -2.5f, 3.75f, 0.5f));
102 ExpectUnchangedOutside(material, before, 64,
sizeof(glm::vec4));
107 auto material = MakeMaterial();
108 const auto before = material.
buffer;
110 EXPECT_EQ(material.
buffer, before);
112 EXPECT_EQ(material.
buffer, before);
114 EXPECT_EQ(material.
buffer, before);
116 EXPECT_EQ(material.
buffer, before);
118 EXPECT_EQ(material.
buffer, before);
120 EXPECT_EQ(material.
buffer, before);
122 EXPECT_EQ(material.
buffer, before);
124 EXPECT_EQ(material.
buffer, before);
127TEST(MaterialLayouts, Font2DProtectsShaderPackingContract)
130 {
"FontColor", 0, 16, Type::Vec4},
131 {
"OutlineColor", 16, 16, Type::Vec4},
132 {
"OutlineThicknessPx", 32, 4, Type::Float},
133 {
"InvAtlasSizeWidth", 36, 4, Type::Float},
134 {
"InvAtlasSizeHeight", 40, 4, Type::Float}
138TEST(MaterialLayouts, Rectangle2DProtectsShaderPackingContract)
TEST(PackedMaterialData, FloatWritesOnlyItsLayoutSlot)
void ExpectNear(const glm::vec< N, T, Q > &actual, const glm::vec< N, T, Q > &expected, float tolerance=1e-5f)
static const std::vector< MaterialParameterLayoutEntry > Font2DLayout
static const std::vector< MaterialParameterLayoutEntry > Rectangle2DLayout
Describes the layout of a single packed parameter inside a uniform buffer.
Contains the raw buffer data and layout metadata of packed material parameters.
void SetMaterialVec2(const std::string &name, const glm::vec2 &value)
std::vector< uint8_t > buffer
void SetMaterialFloat(const std::string &name, float value)
void SetMaterialVec3(const std::string &name, const glm::vec3 &value)
void SetMaterialVec4(const std::string &name, const glm::vec4 &value)