diff options
Diffstat (limited to 'prb_math.c')
-rw-r--r-- | prb_math.c | 305 |
1 files changed, 215 insertions, 90 deletions
@@ -1,242 +1,341 @@ F32 f32sin(F32 a) { - F32 r = sinf(a); + F32 r; + r = sinf(a); return r; } F32 f32cos(F32 a) { - F32 r = cosf(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 = sqrtf(a); + F32 r; + r = sqrtf(a); return r; } /* NOTE(pryazha): Vectors */ V2 v2(F32 x, F32 y) { - V2 r = { x, y }; + V2 r; + r.x = x; + r.y = y; return r; } V2 v2a(F32 x) { - V2 r = { x, x }; + V2 r; + r = v2(x, x); return r; } -V2 v2neg(V2 a) +V2 v2inv(V2 a) { - V2 r = { -a.x, -a.y }; + V2 r; + r = v2(-a.x, -a.y); return r; } V2 v2add(V2 a, V2 b) { - V2 r = { a.x+b.x, a.y+b.y }; + V2 r; + r = v2(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 }; + V2 r; + r = v2(a.x-b.x, a.y-b.y); return r; } V2 v2scalef(V2 a, F32 s) { - V2 r = { a.x*s, a.y*s }; + V2 r; + r = v2(a.x*s, a.y*s); return r; } V2 v2scale(V2 a, V2 s) { - V2 r = { a.x*s.x, a.y*s.y }; + V2 r; + r = v2(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; + F32 r; + r = a.x*b.x+a.y*b.y; return r; } F32 v2len2(V2 a) { - F32 r = v2dot(a, a); + F32 r; + r = v2dot(a, a); return r; } F32 v2len(V2 a) { - F32 r = f32sqrt(v2len2(a)); + F32 r; + r = f32sqrt(v2len2(a)); + return r; +} + +V2 v2norm(V2 a) +{ + F32 len; + V2 r; + + r = V2_ZERO; + len = v2len(a); + if (len) + r = v2(a.x/len, a.y/len); + return r; } void v2print(V2 a) { - fprintf(stdout, "{%f, %f}\n", a.x, a.y); + fprintf(stdout, "{%f, %f}T\n", a.x, a.y); } V3 v3(F32 x, F32 y, F32 z) { - V3 r = { x, y, z }; + V3 r; + r.x = x; + r.y = y; + r.z = z; return r; } V3 v3a(F32 x) { - V3 r = { x, x, x }; + V3 r; + r = v3(x, x, x); return r; } -V3 v3neg(V3 a) +V3 v3fromv2(V2 a) { - V3 r = { -a.x, -a.y, -a.z }; + 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 v3inv(V3 a) +{ + V3 r; + r = v3(-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 }; + V3 r; + r = v3(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 }; + V3 r; + r = v3(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 }; + V3 r; + r = v3(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 }; + V3 r; + r = v3(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; + F32 r; + 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) - }; + 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 v3len2(V3 a) { - F32 r = v3dot(a, a); + F32 r; + r = v3dot(a, a); return r; } F32 v3len(V3 a) { - F32 r = f32sqrt(v3len2(a)); + F32 r; + r = f32sqrt(v3len2(a)); + return r; +} + +V3 v3norm(V3 a) +{ + F32 len; + V3 r; + + r = V3_ZERO; + len = v3len(a); + if (len) + r = v3(a.x/len, a.y/len, a.z/len); + return r; } void v3print(V3 a) { - fprintf(stdout, "{%f, %f, %f}\n", a.x, a.y, a.z); + 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 = { x, y, z, w }; + V4 r; + r.x = x; + r.y = y; + r.z = z; + r.w = w; return r; } V4 v4a(F32 x) { - V4 r = { x, x, x, x }; + V4 r; + r = v4(x, x, x, x); return r; } V4 v4fromv3(V3 a) { - V4 r = { a.x, a.y, a.z, 0.0f }; + V4 r; + r = v4(a.x, a.y, a.z, 0.0f); return r; } -V4 v4neg(V4 a) +V4 v4inv(V4 a) { - V4 r = { -a.x, -a.y, -a.z, -a.w }; + V4 r; + r = v4(-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 }; + V4 r; + r = v4(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 }; + V4 r; + r = v4(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 }; + V4 r; + r = v4(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 }; + V4 r; + r = v4(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; + F32 r; + 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); + F32 r; + r = v4dot(a, a); return r; } F32 v4len(V4 a) { - F32 r = f32sqrt(v4len2(a)); + F32 r; + r = f32sqrt(v4len2(a)); + return r; +} + +V4 v4norm(V4 a) +{ + F32 len; + V4 r; + + r = V4_ZERO; + len = v4len(a); + if (len) + r = v4(a.x/len, a.y/len, a.z/len, a.w/len); + return r; } void v4print(V4 a) { - fprintf(stdout, "{%f, %f, %f, %f}\n", a.x, a.y, a.z, a.w); + fprintf(stdout, "{%f, %f, %f, %f}T\n", a.x, a.y, a.z, a.w); } /* NOTE(pryazha): Matrices */ -F32 mat4det(Mat4 m) +F32 mat4det(MAT4 m) { - F32 r, m00minor, m01minor, m02minor, m03minor; + 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; + 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)); @@ -250,14 +349,16 @@ F32 mat4det(Mat4 m) 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; + r = m00*m00minor + m01*m01minor - m02*m02minor + m03*m03minor; return r; } -Mat4 mat4transpose(Mat4 m) +MAT4 mat4transp(MAT4 m) { - Mat4 r = m; + MAT4 r; + + r = m; Swap(F32, r.m0.y, r.m1.x); Swap(F32, r.m0.z, r.m2.x); @@ -271,19 +372,29 @@ Mat4 mat4transpose(Mat4 m) return r; } -Mat4 mat4mul(Mat4 left, Mat4 right) +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 l00, l01, l02, l03; + F32 l10, l11, l12, l13; + F32 l20, l21, l22, l23; + F32 l30, l31, l32, l33; - 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; + F32 r00, r01, r02, r03; + F32 r10, r11, r12, r13; + F32 r20, r21, r22, r23; + F32 r30, r31, r32, r33; - Mat4 r; + 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; @@ -308,28 +419,41 @@ Mat4 mat4mul(Mat4 left, Mat4 right) return r; } -Mat4 mat4translate(Mat4 m, V3 v) +MAT4 mat4transl(MAT4 m, V3 v) { - Mat4 t = MAT4_IDENTITY; - t.m3 = v4fromv3(v); - Mat4 r = mat4mul(t, m); + MAT4 t, r; + + t = MAT4_IDENTITY; + t.m3.x = v.x; + t.m3.y = v.y; + t.m3.z = v.z; + r = mat4mul(t, m); + return r; } -Mat4 mat4scale(Mat4 m, V3 v) +MAT4 mat4scale(MAT4 m, V3 v) { - Mat4 s = MAT4_IDENTITY; - s.m0 = v4fromv3(v); - Mat4 r = mat4mul(s, m); + MAT4 s, r; + + s = MAT4_IDENTITY; + s.m0.x = v.x; + s.m1.y = v.y; + s.m2.z = v.z; + r = mat4mul(s, m); + return r; } -Mat4 mat4_change_basis(V3 x, V3 y, V3 z) +MAT4 mat4_change_basis(V3 x, V3 y, V3 z) { - Mat4 r = MAT4_IDENTITY; + 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; } @@ -339,11 +463,11 @@ Mat4 mat4_change_basis(V3 x, V3 y, V3 z) * | 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) +MAT4 mat4rotate(MAT4 m, V3 angles) { - F32 angle, cx, sx, cy, sy, cz, sz; - Mat4 rotate, r; - V3 newx, newy, newz; + F32 angle, cx, sx, cy, sy, cz, sz; + MAT4 rotate, r; + V3 newx, newy, newz; angle = DEG2RAD*angles.x; cx = f32cos(angle); @@ -365,21 +489,22 @@ Mat4 mat4rotate(Mat4 m, V3 angles) return r; } -V4 mat4v4mul(Mat4 m, V4 v) +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 - }; + 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 mat4print(Mat4 m) +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); + 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); } |