3
0
mirror of https://github.com/hyprwm/Hyprland.git synced 2026-08-18 11:02:10 +00:00
Files
Hyprland/tests/helpers/DeformableMesh.cpp
Vaxry 2f9169f05f renderer/wobble: fix wobble on transformed outputs (#15694)
* renderer/wobble: fix wobble on transformed outputs

* sc
2026-08-01 18:01:50 +02:00

123 lines
4.6 KiB
C++

#include <helpers/DeformableMesh.hpp>
#include <gtest/gtest.h>
#include <algorithm>
#include <array>
#include <cmath>
TEST(Helpers, deformableMeshSetSizeClamps) {
CDeformableMesh mesh;
mesh.setSize(1);
EXPECT_EQ(mesh.size(), 2u);
mesh.setSize(64);
EXPECT_EQ(mesh.size(), 32u);
}
TEST(Helpers, deformableMeshNoopUpdateKeepsExtents) {
CDeformableMesh mesh(4);
CBox box = {10, 20, 100, 50};
mesh.onPositionUpdate(box, box, 1.F);
const auto EXTENTS = mesh.transformedExtents(box);
EXPECT_DOUBLE_EQ(EXTENTS.x, box.x);
EXPECT_DOUBLE_EQ(EXTENTS.y, box.y);
EXPECT_DOUBLE_EQ(EXTENTS.w, box.w);
EXPECT_DOUBLE_EQ(EXTENTS.h, box.h);
EXPECT_TRUE(mesh.stable(0.F, 0.F));
}
TEST(Helpers, deformableMeshPositionUpdateExpandsExtents) {
CDeformableMesh mesh(4);
const CBox PREVIOUS = {0, 0, 100, 50};
const CBox CURRENT = {10, 0, 100, 50};
mesh.onPositionUpdate(PREVIOUS, CURRENT, 1.F);
const auto EXTENTS = mesh.transformedExtents(CURRENT);
EXPECT_LT(EXTENTS.x, CURRENT.x);
EXPECT_GE(EXTENTS.x + EXTENTS.w, CURRENT.x + CURRENT.w);
EXPECT_FALSE(mesh.stable(0.F, 0.F));
}
TEST(Helpers, deformableMeshGrabPointAnchorsNearestVertices) {
CDeformableMesh mesh(3);
const CBox PREVIOUS = {0, 0, 100, 100};
const CBox CURRENT = {0, 0, 100, 120};
mesh.onPositionUpdate(PREVIOUS, CURRENT, 1.F, Vector2D{0.5, 0.0});
const auto VERTICES = mesh.verticesForBox(CURRENT, CURRENT, {100, 120});
const auto TOPCENTER = std::ranges::find_if(VERTICES, [](const auto& v) { return v.u == 0.5F && v.v == 0.F; });
const auto CENTER = std::ranges::find_if(VERTICES, [](const auto& v) { return v.u == 0.5F && v.v == 0.5F; });
ASSERT_NE(TOPCENTER, VERTICES.end());
ASSERT_NE(CENTER, VERTICES.end());
EXPECT_LT(std::abs(TOPCENTER->y - TOPCENTER->v), std::abs(CENTER->y - CENTER->v));
}
TEST(Helpers, deformableMeshPositionUpdateClampsDisplacement) {
CDeformableMesh mesh(4);
const CBox PREVIOUS = {0, 0, 100, 50};
const CBox CURRENT = {1000, 1000, 100, 50};
mesh.onPositionUpdate(PREVIOUS, CURRENT, 2.F);
const auto EXTENTS = mesh.transformedExtents(CURRENT);
EXPECT_GE(EXTENTS.x, CURRENT.x - 16.001);
EXPECT_GE(EXTENTS.y, CURRENT.y - 16.001);
EXPECT_LE(EXTENTS.x + EXTENTS.w, CURRENT.x + CURRENT.w + 16.001);
EXPECT_LE(EXTENTS.y + EXTENTS.h, CURRENT.y + CURRENT.h + 16.001);
}
TEST(Helpers, deformableMeshVerticesForBoxBuildsTriangles) {
CDeformableMesh mesh(2);
const auto VERTICES = mesh.verticesForBox({0, 0, 100, 50}, {0, 0, 100, 50}, {100, 50});
ASSERT_EQ(VERTICES.size(), 6u);
EXPECT_FLOAT_EQ(VERTICES.front().x, 0.F);
EXPECT_FLOAT_EQ(VERTICES.front().y, 0.F);
EXPECT_FLOAT_EQ(VERTICES.front().u, 0.F);
EXPECT_FLOAT_EQ(VERTICES.front().v, 0.F);
EXPECT_FLOAT_EQ(VERTICES.back().x, 1.F);
EXPECT_FLOAT_EQ(VERTICES.back().y, 1.F);
EXPECT_FLOAT_EQ(VERTICES.back().u, 1.F);
EXPECT_FLOAT_EQ(VERTICES.back().v, 1.F);
}
TEST(Helpers, deformableMeshVerticesForBoxTransformsUVs) {
struct STransformCase {
eTransform transform = HYPRUTILS_TRANSFORM_NORMAL;
Vector2D topLeft;
Vector2D bottomRight;
};
const CBox BOX = {100, 200, 300, 400};
constexpr Vector2D TEXTURESIZE = {1920, 1080};
const auto CASES = std::array{
STransformCase{HYPRUTILS_TRANSFORM_NORMAL, {100, 200}, {400, 600}}, STransformCase{HYPRUTILS_TRANSFORM_90, {200, 980}, {600, 680}},
STransformCase{HYPRUTILS_TRANSFORM_180, {1820, 880}, {1520, 480}}, STransformCase{HYPRUTILS_TRANSFORM_270, {1720, 100}, {1320, 400}},
STransformCase{HYPRUTILS_TRANSFORM_FLIPPED, {1820, 200}, {1520, 600}}, STransformCase{HYPRUTILS_TRANSFORM_FLIPPED_90, {200, 100}, {600, 400}},
STransformCase{HYPRUTILS_TRANSFORM_FLIPPED_180, {100, 880}, {400, 480}}, STransformCase{HYPRUTILS_TRANSFORM_FLIPPED_270, {1720, 980}, {1320, 680}},
};
CDeformableMesh mesh(2);
for (const auto& test : CASES) {
SCOPED_TRACE(static_cast<int>(test.transform));
const auto VERTICES = mesh.verticesForBox(BOX, BOX, TEXTURESIZE, 1.0, test.transform);
ASSERT_EQ(VERTICES.size(), 6u);
EXPECT_FLOAT_EQ(VERTICES.front().u, static_cast<float>(test.topLeft.x / TEXTURESIZE.x));
EXPECT_FLOAT_EQ(VERTICES.front().v, static_cast<float>(test.topLeft.y / TEXTURESIZE.y));
EXPECT_FLOAT_EQ(VERTICES.back().u, static_cast<float>(test.bottomRight.x / TEXTURESIZE.x));
EXPECT_FLOAT_EQ(VERTICES.back().v, static_cast<float>(test.bottomRight.y / TEXTURESIZE.y));
}
}