summaryrefslogtreecommitdiff
path: root/libs/pwyazh/mat4.h
diff options
context:
space:
mode:
authorpryazha <pryadeiniv@mail.ru>2025-01-19 17:33:44 +0500
committerpryazha <pryadeiniv@mail.ru>2025-01-19 17:33:44 +0500
commitbd49bd525f4c6c6c15c4142bf42d1dd38be6fc16 (patch)
tree9e69f473c34b53e9e57d8af1873c39698bf5c80e /libs/pwyazh/mat4.h
initial commit
Diffstat (limited to 'libs/pwyazh/mat4.h')
-rw-r--r--libs/pwyazh/mat4.h161
1 files changed, 161 insertions, 0 deletions
diff --git a/libs/pwyazh/mat4.h b/libs/pwyazh/mat4.h
new file mode 100644
index 0000000..4610fa8
--- /dev/null
+++ b/libs/pwyazh/mat4.h
@@ -0,0 +1,161 @@
+#ifndef MAT4_H
+#define MAT4_H
+
+#define Swap(t, a, b) { t temp = a; a = b; b = temp; }
+
+MAT4
+mat4_zero()
+{
+ MAT4 result = {
+ { 0.0f, 0.0f, 0.0f, 0.0f },
+ { 0.0f, 0.0f, 0.0f, 0.0f },
+ { 0.0f, 0.0f, 0.0f, 0.0f },
+ { 0.0f, 0.0f, 0.0f, 0.0f }
+ };
+ return(result);
+}
+
+MAT4
+mat4_identity()
+{
+ MAT4 result = {
+ { 1.0f, 0.0f, 0.0f, 0.0f },
+ { 0.0f, 1.0f, 0.0f, 0.0f },
+ { 0.0f, 0.0f, 1.0f, 0.0f },
+ { 0.0f, 0.0f, 0.0f, 1.0f }
+ };
+ return(result);
+}
+
+F32
+mat4_det(MAT4 mat)
+{
+ F32 a = mat.m0.x, b = mat.m0.y, c = mat.m0.z, d = mat.m0.w;
+ F32 e = mat.m1.x, f = mat.m1.y, g = mat.m1.z, h = mat.m1.w;
+ F32 i = mat.m2.x, j = mat.m2.y, k = mat.m2.z, l = mat.m2.w;
+ F32 m = mat.m3.x, n = mat.m3.y, o = mat.m3.z, p = mat.m3.w;
+
+ F32 aminor = (f*k*p)+(j*o*h)+(g*l*n)-(h*k*n)-(g*j*p)-(f*l*o);
+ F32 eminor = (b*k*p)+(j*o*d)+(c*l*n)-(n*k*d)-(o*l*b)-(j*c*p);
+ F32 iminor = (b*g*p)+(c*h*n)+(f*o*h)-(n*g*d)-(o*h*b)-(f*c*p);
+ F32 mminor = (b*g*l)+(c*h*j)+(f*k*d)-(j*g*d)-(f*c*l)-(k*h*b);
+
+ return(a*aminor+e*eminor-i*iminor+m*mminor);
+}
+
+MAT4
+mat4_transpose(MAT4 mat)
+{
+ MAT4 result = mat;
+
+ Swap(F32, result.m0.y, result.m1.x);
+ Swap(F32, result.m0.z, result.m2.x);
+ Swap(F32, result.m0.w, result.m3.x);
+
+ Swap(F32, result.m1.z, result.m2.y);
+ Swap(F32, result.m1.w, result.m3.y);
+
+ Swap(F32, result.m2.w, result.m3.z);
+
+ return(result);
+}
+
+MAT4
+mat4_mul(MAT4 left, MAT4 right)
+{
+ F32 l00 = left.m0.x, l01 = left.m0.y, l02 = left.m0.z, l03 = left.m0.w;
+ F32 l10 = left.m1.x, l11 = left.m1.y, l12 = left.m1.z, l13 = left.m1.w;
+ F32 l20 = left.m2.x, l21 = left.m2.y, l22 = left.m2.z, l23 = left.m2.w;
+ F32 l30 = left.m3.x, l31 = left.m3.y, l32 = left.m3.z, l33 = left.m3.w;
+
+ F32 r00 = right.m0.x, r01 = right.m0.y, r02 = right.m0.z, r03 = right.m0.w;
+ F32 r10 = right.m1.x, r11 = right.m1.y, r12 = right.m1.z, r13 = right.m1.w;
+ F32 r20 = right.m2.x, r21 = right.m2.y, r22 = right.m2.z, r23 = right.m2.w;
+ F32 r30 = right.m3.x, r31 = right.m3.y, r32 = right.m3.z, r33 = right.m3.w;
+
+ MAT4 result;
+
+ result.m0.x = l00*r00+l10*r01+l20*r02+l30*r03;
+ result.m0.y = l01*r00+l11*r01+l21*r02+l31*r03;
+ result.m0.z = l02*r00+l12*r01+l22*r02+l32*r03;
+ result.m0.w = l03*r00+l13*r01+l23*r02+l33*r03;
+
+ result.m1.x = l00*r10+l10*r11+l20*r12+l30*r13;
+ result.m1.y = l01*r10+l11*r11+l21*r12+l31*r13;
+ result.m1.z = l02*r10+l12*r11+l22*r12+l32*r13;
+ result.m1.w = l03*r10+l13*r11+l23*r12+l33*r13;
+
+ result.m2.x = l00*r20+l10*r21+l20*r22+l30*r23;
+ result.m2.y = l01*r20+l11*r21+l21*r22+l31*r23;
+ result.m2.z = l02*r20+l12*r21+l22*r22+l32*r23;
+ result.m2.w = l03*r20+l13*r21+l23*r22+l33*r23;
+
+ result.m3.x = l00*r30+l10*r31+l20*r32+l30*r33;
+ result.m3.y = l01*r30+l11*r31+l21*r32+l31*r33;
+ result.m3.z = l02*r30+l12*r31+l22*r32+l32*r33;
+ result.m3.w = l03*r30+l13*r31+l23*r32+l33*r33;
+
+ return(result);
+}
+
+MAT4
+mat4_make_translate(V3F vec)
+{
+ MAT4 result = mat4_identity();
+ result.m3.x = vec.x;
+ result.m3.y = vec.y;
+ result.m3.z = vec.z;
+ return(result);
+}
+
+MAT4
+mat4_translate(MAT4 mat, V3F vec)
+{
+ MAT4 translate = mat4_make_translate(vec);
+ MAT4 result = mat4_mul(translate, mat);
+ return(result);
+}
+
+MAT4
+mat4_make_scale(V3F scale)
+{
+ MAT4 result = mat4_identity();
+ result.m0.x = scale.x;
+ result.m1.y = scale.y;
+ result.m2.z = scale.z;
+ return(result);
+}
+
+MAT4
+mat4_scale(MAT4 mat, V3F scale)
+{
+ MAT4 mat_scale = mat4_make_scale(scale);
+ MAT4 result = mat4_mul(mat_scale, mat);
+ return(result);
+}
+
+V4F
+mat4_v4f_mul(MAT4 m, V4F v)
+{
+ V4F result;
+ result.x = m.m0.x*v.x+m.m1.x*v.y+m.m2.x*v.z+m.m3.x*v.w;
+ result.y = m.m0.y*v.x+m.m1.y*v.y+m.m2.y*v.z+m.m3.y*v.w;
+ result.z = m.m0.z*v.x+m.m1.z*v.y+m.m2.z*v.z+m.m3.z*v.w;
+ result.w = m.m0.w*v.x+m.m1.w*v.y+m.m2.w*v.z+m.m3.w*v.w;
+ return(result);
+}
+
+void
+mat4_print(MAT4 a)
+{
+ printf("%.4f %.4f %.4f %.4f\n",
+ a.m0.x, a.m1.x, a.m2.x, a.m3.x);
+ printf("%.4f %.4f %.4f %.4f\n",
+ a.m0.y, a.m1.y, a.m2.y, a.m3.y);
+ printf("%.4f %.4f %.4f %.4f\n",
+ a.m0.z, a.m1.z, a.m2.z, a.m3.z);
+ printf("%.4f %.4f %.4f %.4f\n\n",
+ a.m0.w, a.m1.w, a.m2.w, a.m3.w);
+}
+
+#endif /* MAT4_H */