summaryrefslogtreecommitdiff
path: root/prb_math.c
diff options
context:
space:
mode:
authorpryazha <pryadeiniv@mail.ru>2025-02-20 15:08:47 +0500
committerpryazha <pryadeiniv@mail.ru>2025-02-20 15:08:47 +0500
commit0bd7c5dc0725a4882cb33c5d8f1a3b101d4025cd (patch)
treeecb3e42bf4855ba9e4836a20b94cb4857943eda6 /prb_math.c
initial
Diffstat (limited to 'prb_math.c')
-rw-r--r--prb_math.c385
1 files changed, 385 insertions, 0 deletions
diff --git a/prb_math.c b/prb_math.c
new file mode 100644
index 0000000..a2d58bc
--- /dev/null
+++ b/prb_math.c
@@ -0,0 +1,385 @@
+F32 f32sin(F32 a)
+{
+ F32 r = sinf(a);
+ return r;
+}
+
+F32 f32cos(F32 a)
+{
+ F32 r = cosf(a);
+ return r;
+}
+
+F32 f32sqrt(F32 a)
+{
+ F32 r = sqrtf(a);
+ return r;
+}
+
+/* NOTE(pryazha): Vectors */
+V2 v2(F32 x, F32 y)
+{
+ V2 r = { x, y };
+ return r;
+}
+
+V2 v2a(F32 x)
+{
+ V2 r = { x, x };
+ return r;
+}
+
+V2 v2neg(V2 a)
+{
+ V2 r = { -a.x, -a.y };
+ return r;
+}
+
+V2 v2add(V2 a, V2 b)
+{
+ V2 r = { a.x+b.x, a.y+b.y };
+ return r;
+}
+
+V2 v2sub(V2 a, V2 b)
+{
+ V2 r = { a.x-b.x, a.y-b.y };
+ return r;
+}
+
+V2 v2scalef(V2 a, F32 s)
+{
+ V2 r = { a.x*s, a.y*s };
+ return r;
+}
+
+V2 v2scale(V2 a, V2 s)
+{
+ V2 r = { a.x*s.x, a.y*s.y };
+ return r;
+}
+
+F32 v2dot(V2 a, V2 b)
+{
+ F32 r = a.x*b.x+a.y*b.y;
+ return r;
+}
+
+F32 v2len2(V2 a)
+{
+ F32 r = v2dot(a, a);
+ return r;
+}
+
+F32 v2len(V2 a)
+{
+ F32 r = f32sqrt(v2len2(a));
+ return r;
+}
+
+void v2print(V2 a)
+{
+ fprintf(stdout, "{%f, %f}\n", a.x, a.y);
+}
+
+V3 v3(F32 x, F32 y, F32 z)
+{
+ V3 r = { x, y, z };
+ return r;
+}
+
+V3 v3a(F32 x)
+{
+ V3 r = { x, x, x };
+ return r;
+}
+
+V3 v3neg(V3 a)
+{
+ V3 r = { -a.x, -a.y, -a.z };
+ return r;
+}
+
+V3 v3add(V3 a, V3 b)
+{
+ V3 r = { a.x+b.x, a.y+b.y, a.z+b.z };
+ return r;
+}
+
+V3 v3sub(V3 a, V3 b)
+{
+ V3 r = { a.x-b.x, a.y-b.y, a.z-b.z };
+ return r;
+}
+
+V3 v3scalef(V3 a, F32 s)
+{
+ V3 r = { a.x*s, a.y*s, a.z*s };
+ return r;
+}
+
+V3 v3scale(V3 a, V3 s)
+{
+ V3 r = { a.x*s.x, a.y*s.y, a.z*s.z };
+ return r;
+}
+
+F32 v3dot(V3 a, V3 b)
+{
+ F32 r = a.x*b.x+a.y*b.y+a.z*b.z;
+ return r;
+}
+
+V3 v3cross(V3 left, V3 right)
+{
+ V3 r = {
+ (left.y*right.z-right.y*left.z),
+ (right.x*left.z-left.x*right.z),
+ (left.x*right.y-right.x*left.y)
+ };
+ return r;
+}
+
+F32 v3len2(V3 a)
+{
+ F32 r = v3dot(a, a);
+ return r;
+}
+
+F32 v3len(V3 a)
+{
+ F32 r = f32sqrt(v3len2(a));
+ return r;
+}
+
+void v3print(V3 a)
+{
+ fprintf(stdout, "{%f, %f, %f}\n", a.x, a.y, a.z);
+}
+
+V4 v4(F32 x, F32 y, F32 z, F32 w)
+{
+ V4 r = { x, y, z, w };
+ return r;
+}
+
+V4 v4a(F32 x)
+{
+ V4 r = { x, x, x, x };
+ return r;
+}
+
+V4 v4fromv3(V3 a)
+{
+ V4 r = { a.x, a.y, a.z, 0.0f };
+ return r;
+}
+
+V4 v4neg(V4 a)
+{
+ V4 r = { -a.x, -a.y, -a.z, -a.w };
+ return r;
+}
+
+V4 v4add(V4 a, V4 b)
+{
+ V4 r = { a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w };
+ return r;
+}
+
+V4 v4sub(V4 a, V4 b)
+{
+ V4 r = { a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w };
+ return r;
+}
+
+V4 v4scalef(V4 a, F32 s)
+{
+ V4 r = { a.x*s, a.y*s, a.z*s, a.w*s };
+ return r;
+}
+
+V4 v4scale(V4 a, V4 s)
+{
+ V4 r = { a.x*s.x, a.y*s.y, a.z*s.z, a.w*s.w };
+ return r;
+}
+
+F32 v4dot(V4 a, V4 b)
+{
+ F32 r = a.x*b.x+a.y*b.y+a.z*b.z+a.w*b.w;
+ return r;
+}
+
+F32 v4len2(V4 a)
+{
+ F32 r = v4dot(a, a);
+ return r;
+}
+
+F32 v4len(V4 a)
+{
+ F32 r = f32sqrt(v4len2(a));
+ return r;
+}
+
+void v4print(V4 a)
+{
+ fprintf(stdout, "{%f, %f, %f, %f}\n", a.x, a.y, a.z, a.w);
+}
+
+/* NOTE(pryazha): Matrices */
+F32 mat4det(Mat4 m)
+{
+ F32 r, m00minor, m01minor, m02minor, m03minor;
+
+ F32 m00 = m.m0.x, m10 = m.m0.y, m20 = m.m0.z, m30 = m.m0.w;
+ F32 m01 = m.m1.x, m11 = m.m1.y, m21 = m.m1.z, m31 = m.m1.w;
+ F32 m02 = m.m2.x, m12 = m.m2.y, m22 = m.m2.z, m32 = m.m2.w;
+ F32 m03 = m.m3.x, m13 = m.m3.y, m23 = m.m3.z, m33 = m.m3.w;
+
+ m00minor = ((m11*m22*m33)+(m12*m23*m31)+(m21*m32*m13)-
+ (m31*m22*m13)-(m21*m12*m33)-(m11*m32*m23));
+
+ m01minor = ((m10*m22*m33)+(m12*m23*m30)+(m20*m32*m13)-
+ (m13*m22*m30)-(m23*m32*m10)-(m12*m20*m33));
+
+ m02minor = ((m10*m21*m33)+(m20*m31*m13)+(m11*m23*m31)-
+ (m13*m21*m30)-(m23*m31*m10)-(m11*m20*m33));
+
+ m03minor = ((m10*m21*m32)+(m20*m31*m12)+(m11*m22*m30)-
+ (m12*m21*m30)-(m11*m20*m32)-(m22*m31*m10));
+
+ r = m00*m00minor+m01*m01minor-m02*m02minor+m03*m03minor;
+
+ return r;
+}
+
+Mat4 mat4transpose(Mat4 m)
+{
+ Mat4 r = m;
+
+ Swap(F32, r.m0.y, r.m1.x);
+ Swap(F32, r.m0.z, r.m2.x);
+ Swap(F32, r.m0.w, r.m3.x);
+
+ Swap(F32, r.m1.z, r.m2.y);
+ Swap(F32, r.m1.w, r.m3.y);
+
+ Swap(F32, r.m2.w, r.m3.z);
+
+ return r;
+}
+
+Mat4 mat4mul(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 r;
+
+ r.m0.x = l00*r00+l10*r01+l20*r02+l30*r03;
+ r.m0.y = l01*r00+l11*r01+l21*r02+l31*r03;
+ r.m0.z = l02*r00+l12*r01+l22*r02+l32*r03;
+ r.m0.w = l03*r00+l13*r01+l23*r02+l33*r03;
+
+ r.m1.x = l00*r10+l10*r11+l20*r12+l30*r13;
+ r.m1.y = l01*r10+l11*r11+l21*r12+l31*r13;
+ r.m1.z = l02*r10+l12*r11+l22*r12+l32*r13;
+ r.m1.w = l03*r10+l13*r11+l23*r12+l33*r13;
+
+ r.m2.x = l00*r20+l10*r21+l20*r22+l30*r23;
+ r.m2.y = l01*r20+l11*r21+l21*r22+l31*r23;
+ r.m2.z = l02*r20+l12*r21+l22*r22+l32*r23;
+ r.m2.w = l03*r20+l13*r21+l23*r22+l33*r23;
+
+ r.m3.x = l00*r30+l10*r31+l20*r32+l30*r33;
+ r.m3.y = l01*r30+l11*r31+l21*r32+l31*r33;
+ r.m3.z = l02*r30+l12*r31+l22*r32+l32*r33;
+ r.m3.w = l03*r30+l13*r31+l23*r32+l33*r33;
+
+ return r;
+}
+
+Mat4 mat4translate(Mat4 m, V3 v)
+{
+ Mat4 t = MAT4_IDENTITY;
+ t.m3 = v4fromv3(v);
+ Mat4 r = mat4mul(t, m);
+ return r;
+}
+
+Mat4 mat4scale(Mat4 m, V3 v)
+{
+ Mat4 s = MAT4_IDENTITY;
+ s.m0 = v4fromv3(v);
+ Mat4 r = mat4mul(s, m);
+ return r;
+}
+
+Mat4 mat4_change_basis(V3 x, V3 y, V3 z)
+{
+ Mat4 r = MAT4_IDENTITY;
+ r.m0 = v4(x.x, x.y, x.z, 0.0f);
+ r.m1 = v4(y.x, y.y, y.z, 0.0f);
+ r.m2 = v4(z.x, z.y, z.z, 0.0f);
+ return r;
+}
+
+/*
+ * NOTE(pryazha): Angles in degrees
+ * | 1 0 0 | | cy 0 sy | | cz -sz 0 | | cy*cz -cy*sz sy |
+ * | 0 cx -sx |*| 0 1 0 |*| sz cz 0 |=| sx*sy*cz+cx*sz -sx*sy*sz+cx*cz -sx*cy |
+ * | 0 sx cx | | -sy 0 cy | | 0 0 1 | | -cx*sy*cz+sx*sz cx*sy*sz+sx*cz cx*cy |
+ */
+Mat4 mat4rotate(Mat4 m, V3 angles)
+{
+ F32 angle, cx, sx, cy, sy, cz, sz;
+ Mat4 rotate, r;
+ V3 newx, newy, newz;
+
+ angle = DEG2RAD*angles.x;
+ cx = f32cos(angle);
+ sx = f32sin(angle);
+ angle = DEG2RAD*angles.y;
+ cy = f32cos(angle);
+ sy = f32sin(angle);
+ angle = DEG2RAD*angles.z;
+ cz = f32cos(angle);
+ sz = f32sin(angle);
+
+ newx = v3(cy*cz, sx*sy*cz+cx*sz, -cx*sy*cz+sx*sz);
+ newy = v3(-cy*sz, -sx*sy*sz+cx*cz, cx*sy*sz+sx*cz);
+ newz = v3(sy, -sx*cy, cx*cy);
+ rotate = mat4_change_basis(newx, newy, newz);
+
+ r = mat4mul(rotate, m);
+
+ return r;
+}
+
+V4 mat4v4mul(Mat4 m, V4 v)
+{
+ V4 r = {
+ m.m0.x*v.x+m.m1.x*v.y+m.m2.x*v.z+m.m3.x*v.w,
+ m.m0.y*v.x+m.m1.y*v.y+m.m2.y*v.z+m.m3.y*v.w,
+ m.m0.z*v.x+m.m1.z*v.y+m.m2.z*v.z+m.m3.z*v.w,
+ m.m0.w*v.x+m.m1.w*v.y+m.m2.w*v.z+m.m3.w*v.w
+ };
+ return r;
+}
+
+void mat4print(Mat4 m)
+{
+ printf("| %.4f %.4f %.4f %.4f |\n", m.m0.x, m.m1.x, m.m2.x, m.m3.x);
+ printf("| %.4f %.4f %.4f %.4f |\n", m.m0.y, m.m1.y, m.m2.y, m.m3.y);
+ printf("| %.4f %.4f %.4f %.4f |\n", m.m0.z, m.m1.z, m.m2.z, m.m3.z);
+ printf("| %.4f %.4f %.4f %.4f |\n\n", m.m0.w, m.m1.w, m.m2.w, m.m3.w);
+}