summaryrefslogtreecommitdiff
path: root/src/helpers/math/Math.cpp
diff options
context:
space:
mode:
authorVaxry <vaxry@vaxry.net>2024-06-19 16:20:06 +0200
committerVaxry <vaxry@vaxry.net>2024-06-19 16:20:15 +0200
commitfb15b7aa2a9bba0f0693f84d0c65d386942583f8 (patch)
treed4403944b5d6a3e03d2262f03a7d0b3ed6ffae24 /src/helpers/math/Math.cpp
parent6e5804b53de753f24953d9d647940df66bc68f6d (diff)
core: Move to hyprutils for Math
Moves CRegion, CBox and Vector2D over to hyprutils. Requires hyprutils>=0.1.4
Diffstat (limited to 'src/helpers/math/Math.cpp')
-rw-r--r--src/helpers/math/Math.cpp220
1 files changed, 220 insertions, 0 deletions
diff --git a/src/helpers/math/Math.cpp b/src/helpers/math/Math.cpp
new file mode 100644
index 00000000..df4f1bb5
--- /dev/null
+++ b/src/helpers/math/Math.cpp
@@ -0,0 +1,220 @@
+#include "Math.hpp"
+#include <unordered_map>
+
+Hyprutils::Math::eTransform wlTransformToHyprutils(wl_output_transform t) {
+ switch (t) {
+ case WL_OUTPUT_TRANSFORM_NORMAL: return Hyprutils::Math::eTransform::HYPRUTILS_TRANSFORM_NORMAL;
+ case WL_OUTPUT_TRANSFORM_180: return Hyprutils::Math::eTransform::HYPRUTILS_TRANSFORM_180;
+ case WL_OUTPUT_TRANSFORM_90: return Hyprutils::Math::eTransform::HYPRUTILS_TRANSFORM_90;
+ case WL_OUTPUT_TRANSFORM_270: return Hyprutils::Math::eTransform::HYPRUTILS_TRANSFORM_270;
+ case WL_OUTPUT_TRANSFORM_FLIPPED: return Hyprutils::Math::eTransform::HYPRUTILS_TRANSFORM_FLIPPED;
+ case WL_OUTPUT_TRANSFORM_FLIPPED_180: return Hyprutils::Math::eTransform::HYPRUTILS_TRANSFORM_FLIPPED_180;
+ case WL_OUTPUT_TRANSFORM_FLIPPED_270: return Hyprutils::Math::eTransform::HYPRUTILS_TRANSFORM_FLIPPED_270;
+ case WL_OUTPUT_TRANSFORM_FLIPPED_90: return Hyprutils::Math::eTransform::HYPRUTILS_TRANSFORM_FLIPPED_90;
+ default: break;
+ }
+ return Hyprutils::Math::eTransform::HYPRUTILS_TRANSFORM_NORMAL;
+}
+
+static void matrixIdentity(float mat[9]) {
+ static const float identity[9] = {
+ 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
+ };
+ memcpy(mat, identity, sizeof(identity));
+}
+
+static void matrixMultiply(float mat[9], const float a[9], const float b[9]) {
+ float product[9];
+
+ product[0] = a[0] * b[0] + a[1] * b[3] + a[2] * b[6];
+ product[1] = a[0] * b[1] + a[1] * b[4] + a[2] * b[7];
+ product[2] = a[0] * b[2] + a[1] * b[5] + a[2] * b[8];
+
+ product[3] = a[3] * b[0] + a[4] * b[3] + a[5] * b[6];
+ product[4] = a[3] * b[1] + a[4] * b[4] + a[5] * b[7];
+ product[5] = a[3] * b[2] + a[4] * b[5] + a[5] * b[8];
+
+ product[6] = a[6] * b[0] + a[7] * b[3] + a[8] * b[6];
+ product[7] = a[6] * b[1] + a[7] * b[4] + a[8] * b[7];
+ product[8] = a[6] * b[2] + a[7] * b[5] + a[8] * b[8];
+
+ memcpy(mat, product, sizeof(product));
+}
+
+static void matrixTranspose(float mat[9], const float a[9]) {
+ float transposition[9] = {
+ a[0], a[3], a[6], a[1], a[4], a[7], a[2], a[5], a[8],
+ };
+ memcpy(mat, transposition, sizeof(transposition));
+}
+
+static void matrixTranslate(float mat[9], float x, float y) {
+ float translate[9] = {
+ 1.0f, 0.0f, x, 0.0f, 1.0f, y, 0.0f, 0.0f, 1.0f,
+ };
+ wlr_matrix_multiply(mat, mat, translate);
+}
+
+static void matrixScale(float mat[9], float x, float y) {
+ float scale[9] = {
+ x, 0.0f, 0.0f, 0.0f, y, 0.0f, 0.0f, 0.0f, 1.0f,
+ };
+ wlr_matrix_multiply(mat, mat, scale);
+}
+
+static void matrixRotate(float mat[9], float rad) {
+ float rotate[9] = {
+ cos(rad), -sin(rad), 0.0f, sin(rad), cos(rad), 0.0f, 0.0f, 0.0f, 1.0f,
+ };
+ wlr_matrix_multiply(mat, mat, rotate);
+}
+
+static std::unordered_map<eTransform, std::array<float, 9>> transforms = {
+ {HYPRUTILS_TRANSFORM_NORMAL,
+ {
+ 1.0f,
+ 0.0f,
+ 0.0f,
+ 0.0f,
+ 1.0f,
+ 0.0f,
+ 0.0f,
+ 0.0f,
+ 1.0f,
+ }},
+ {HYPRUTILS_TRANSFORM_90,
+ {
+ 0.0f,
+ 1.0f,
+ 0.0f,
+ -1.0f,
+ 0.0f,
+ 0.0f,
+ 0.0f,
+ 0.0f,
+ 1.0f,
+ }},
+ {HYPRUTILS_TRANSFORM_180,
+ {
+ -1.0f,
+ 0.0f,
+ 0.0f,
+ 0.0f,
+ -1.0f,
+ 0.0f,
+ 0.0f,
+ 0.0f,
+ 1.0f,
+ }},
+ {HYPRUTILS_TRANSFORM_270,
+ {
+ 0.0f,
+ -1.0f,
+ 0.0f,
+ 1.0f,
+ 0.0f,
+ 0.0f,
+ 0.0f,
+ 0.0f,
+ 1.0f,
+ }},
+ {HYPRUTILS_TRANSFORM_FLIPPED,
+ {
+ -1.0f,
+ 0.0f,
+ 0.0f,
+ 0.0f,
+ 1.0f,
+ 0.0f,
+ 0.0f,
+ 0.0f,
+ 1.0f,
+ }},
+ {HYPRUTILS_TRANSFORM_FLIPPED_90,
+ {
+ 0.0f,
+ 1.0f,
+ 0.0f,
+ 1.0f,
+ 0.0f,
+ 0.0f,
+ 0.0f,
+ 0.0f,
+ 1.0f,
+ }},
+ {HYPRUTILS_TRANSFORM_FLIPPED_180,
+ {
+ 1.0f,
+ 0.0f,
+ 0.0f,
+ 0.0f,
+ -1.0f,
+ 0.0f,
+ 0.0f,
+ 0.0f,
+ 1.0f,
+ }},
+ {HYPRUTILS_TRANSFORM_FLIPPED_270,
+ {
+ 0.0f,
+ -1.0f,
+ 0.0f,
+ -1.0f,
+ 0.0f,
+ 0.0f,
+ 0.0f,
+ 0.0f,
+ 1.0f,
+ }},
+};
+
+static void matrixTransform(float mat[9], eTransform transform) {
+ matrixMultiply(mat, mat, transforms.at(transform).data());
+}
+
+static void matrixProjection(float mat[9], int width, int height, eTransform transform) {
+ memset(mat, 0, sizeof(*mat) * 9);
+
+ const float* t = transforms.at(transform).data();
+ float x = 2.0f / width;
+ float y = 2.0f / height;
+
+ // Rotation + reflection
+ mat[0] = x * t[0];
+ mat[1] = x * t[1];
+ mat[3] = y * -t[3];
+ mat[4] = y * -t[4];
+
+ // Translation
+ mat[2] = -copysign(1.0f, mat[0] + mat[1]);
+ mat[5] = -copysign(1.0f, mat[3] + mat[4]);
+
+ // Identity
+ mat[8] = 1.0f;
+}
+
+void projectBox(float mat[9], CBox& box, eTransform transform, float rotation, const float projection[9]) {
+ double x = box.x;
+ double y = box.y;
+ double width = box.width;
+ double height = box.height;
+
+ matrixIdentity(mat);
+ matrixTranslate(mat, x, y);
+
+ if (rotation != 0) {
+ matrixTranslate(mat, width / 2, height / 2);
+ matrixRotate(mat, rotation);
+ matrixTranslate(mat, -width / 2, -height / 2);
+ }
+
+ wlr_matrix_scale(mat, width, height);
+
+ if (transform != HYPRUTILS_TRANSFORM_NORMAL) {
+ matrixTranslate(mat, 0.5, 0.5);
+ matrixTransform(mat, transform);
+ matrixTranslate(mat, -0.5, -0.5);
+ }
+
+ matrixMultiply(mat, projection, mat);
+}