diff options
Diffstat (limited to 'prb_math.c')
-rw-r--r-- | prb_math.c | 510 |
1 files changed, 0 insertions, 510 deletions
diff --git a/prb_math.c b/prb_math.c deleted file mode 100644 index 2efb091..0000000 --- a/prb_math.c +++ /dev/null @@ -1,510 +0,0 @@ -F32 f32sin(F32 a) -{ - F32 r; - r = sinf(a); - return r; -} - -F32 f32cos(F32 a) -{ - F32 r; - r = cosf(a); - return r; -} - -F32 f32tan(F32 a) -{ - F32 r; - r = tanf(a); - return r; -} - -F32 f32sqrt(F32 a) -{ - F32 r; - r = sqrtf(a); - return r; -} - -/* NOTE(pryazha): Vectors */ -V2 v2(F32 x, F32 y) -{ - V2 r; - r.x = x; - r.y = y; - return r; -} - -V2 v2a(F32 x) -{ - V2 r; - r = v2(x, x); - return r; -} - -V2 invv2(V2 a) -{ - V2 r; - r = v2(-a.x, -a.y); - return r; -} - -V2 addv2(V2 a, V2 b) -{ - V2 r; - r = v2(a.x+b.x, a.y+b.y); - return r; -} - -V2 subv2(V2 a, V2 b) -{ - V2 r; - r = v2(a.x-b.x, a.y-b.y); - return r; -} - -V2 scalefv2(V2 a, F32 s) -{ - V2 r; - r = v2(a.x*s, a.y*s); - return r; -} - -V2 scalev2(V2 a, V2 s) -{ - V2 r; - r = v2(a.x*s.x, a.y*s.y); - return r; -} - -F32 dotv2(V2 a, V2 b) -{ - F32 r; - r = a.x*b.x+a.y*b.y; - return r; -} - -F32 len2v2(V2 a) -{ - F32 r; - r = dotv2(a, a); - return r; -} - -F32 lenv2(V2 a) -{ - F32 r; - r = f32sqrt(len2v2(a)); - return r; -} - -V2 normv2(V2 a) -{ - F32 len; - V2 r; - - r = V2_ZERO; - len = lenv2(a); - if (len) - r = v2(a.x/len, a.y/len); - - return r; -} - -void printv2(V2 a) -{ - fprintf(stdout, "{%f, %f}T\n", a.x, a.y); -} - -V3 v3(F32 x, F32 y, F32 z) -{ - V3 r; - r.x = x; - r.y = y; - r.z = z; - return r; -} - -V3 v3a(F32 x) -{ - V3 r; - r = v3(x, x, x); - return r; -} - -V3 v3fromv2(V2 a) -{ - V3 r; - r = v3(a.x, a.y, 0.0f); - return r; -} - -V3 v3fromv4(V4 a) -{ - V3 r; - r = v3(a.x, a.y, a.z); - return r; -} - -V3 invv3(V3 a) -{ - V3 r; - r = v3(-a.x, -a.y, -a.z); - return r; -} - -V3 addv3(V3 a, V3 b) -{ - V3 r; - r = v3(a.x+b.x, a.y+b.y, a.z+b.z); - return r; -} - -V3 subv3(V3 a, V3 b) -{ - V3 r; - r = v3(a.x-b.x, a.y-b.y, a.z-b.z); - return r; -} - -V3 scalefv3(V3 a, F32 s) -{ - V3 r; - r = v3(a.x*s, a.y*s, a.z*s); - return r; -} - -V3 scalev3(V3 a, V3 s) -{ - V3 r; - r = v3(a.x*s.x, a.y*s.y, a.z*s.z); - return r; -} - -F32 dotv3(V3 a, V3 b) -{ - F32 r; - r = a.x*b.x + a.y*b.y + a.z*b.z; - return r; -} - -V3 crossv3(V3 left, V3 right) -{ - V3 r; - r = v3((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 len2v3(V3 a) -{ - F32 r; - r = dotv3(a, a); - return r; -} - -F32 lenv3(V3 a) -{ - F32 r; - r = f32sqrt(len2v3(a)); - return r; -} - -V3 normv3(V3 a) -{ - F32 len; - V3 r; - - r = V3_ZERO; - len = lenv3(a); - if (len) - r = v3(a.x/len, a.y/len, a.z/len); - - return r; -} - -void printv3(V3 a) -{ - fprintf(stdout, "{%f, %f, %f}T\n", a.x, a.y, a.z); -} - -V4 v4(F32 x, F32 y, F32 z, F32 w) -{ - V4 r; - r.x = x; - r.y = y; - r.z = z; - r.w = w; - return r; -} - -V4 v4a(F32 x) -{ - V4 r; - r = v4(x, x, x, x); - return r; -} - -V4 v4fromv3(V3 a) -{ - V4 r; - r = v4(a.x, a.y, a.z, 0.0f); - return r; -} - -V4 invv4(V4 a) -{ - V4 r; - r = v4(-a.x, -a.y, -a.z, -a.w); - return r; -} - -V4 addv4(V4 a, V4 b) -{ - V4 r; - r = v4(a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w); - return r; -} - -V4 subv4(V4 a, V4 b) -{ - V4 r; - r = v4(a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w); - return r; -} - -V4 scalefv4(V4 a, F32 s) -{ - V4 r; - r = v4(a.x*s, a.y*s, a.z*s, a.w*s); - return r; -} - -V4 scalev4(V4 a, V4 s) -{ - V4 r; - r = v4(a.x*s.x, a.y*s.y, a.z*s.z, a.w*s.w); - return r; -} - -F32 dotv4(V4 a, V4 b) -{ - F32 r; - r = a.x*b.x+a.y*b.y+a.z*b.z+a.w*b.w; - return r; -} - -F32 len2v4(V4 a) -{ - F32 r; - r = dotv4(a, a); - return r; -} - -F32 lenv4(V4 a) -{ - F32 r; - r = f32sqrt(len2v4(a)); - return r; -} - -V4 normv4(V4 a) -{ - F32 len; - V4 r; - - r = V4_ZERO; - len = lenv4(a); - if (len) - r = v4(a.x/len, a.y/len, a.z/len, a.w/len); - - return r; -} - -void printv4(V4 a) -{ - fprintf(stdout, "{%f, %f, %f, %f}T\n", a.x, a.y, a.z, a.w); -} - -/* NOTE(pryazha): Matrices */ -F32 detmat4(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 transpmat4(MAT4 m) -{ - MAT4 r; - - 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 mulmat4(MAT4 left, MAT4 right) -{ - F32 l00, l01, l02, l03; - F32 l10, l11, l12, l13; - F32 l20, l21, l22, l23; - F32 l30, l31, l32, l33; - - F32 r00, r01, r02, r03; - F32 r10, r11, r12, r13; - F32 r20, r21, r22, r23; - F32 r30, r31, r32, r33; - - MAT4 r; - - l00 = left.m0.x; l01 = left.m0.y; l02 = left.m0.z; l03 = left.m0.w; - l10 = left.m1.x; l11 = left.m1.y; l12 = left.m1.z; l13 = left.m1.w; - l20 = left.m2.x; l21 = left.m2.y; l22 = left.m2.z; l23 = left.m2.w; - l30 = left.m3.x; l31 = left.m3.y; l32 = left.m3.z; l33 = left.m3.w; - - r00 = right.m0.x; r01 = right.m0.y; r02 = right.m0.z; r03 = right.m0.w; - r10 = right.m1.x; r11 = right.m1.y; r12 = right.m1.z; r13 = right.m1.w; - r20 = right.m2.x; r21 = right.m2.y; r22 = right.m2.z; r23 = right.m2.w; - r30 = right.m3.x; r31 = right.m3.y; r32 = right.m3.z; r33 = right.m3.w; - - 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 translmat4(MAT4 m, V3 v) -{ - MAT4 t, r; - - t = MAT4_IDENTITY; - t.m3.x = v.x; - t.m3.y = v.y; - t.m3.z = v.z; - r = mulmat4(t, m); - - return r; -} - -MAT4 scalemat4(MAT4 m, V3 v) -{ - MAT4 s, r; - - s = MAT4_IDENTITY; - s.m0.x = v.x; - s.m1.y = v.y; - s.m2.z = v.z; - r = mulmat4(s, m); - - return r; -} - -MAT4 rotateaxismat4(V3 x, V3 y, V3 z) -{ - MAT4 r; - - 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 rotatemat4(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 = rotateaxismat4(newx, newy, newz); - - r = mulmat4(rotate, m); - - return r; -} - -V4 mulmat4v4(MAT4 m, V4 v) -{ - V4 r; - - r = v4(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 printmat4(MAT4 m) -{ - fprintf(stdout, "| %.4f %.4f %.4f %.4f |\n", m.m0.x, m.m1.x, m.m2.x, m.m3.x); - fprintf(stdout, "| %.4f %.4f %.4f %.4f |\n", m.m0.y, m.m1.y, m.m2.y, m.m3.y); - fprintf(stdout, "| %.4f %.4f %.4f %.4f |\n", m.m0.z, m.m1.z, m.m2.z, m.m3.z); - fprintf(stdout, "| %.4f %.4f %.4f %.4f |\n\n", m.m0.w, m.m1.w, m.m2.w, m.m3.w); -} |