summaryrefslogtreecommitdiff
path: root/in_practice/breakout/my_math.c
diff options
context:
space:
mode:
Diffstat (limited to 'in_practice/breakout/my_math.c')
-rw-r--r--in_practice/breakout/my_math.c136
1 files changed, 136 insertions, 0 deletions
diff --git a/in_practice/breakout/my_math.c b/in_practice/breakout/my_math.c
new file mode 100644
index 0000000..5d69b92
--- /dev/null
+++ b/in_practice/breakout/my_math.c
@@ -0,0 +1,136 @@
+#include "my_math.h"
+#include <math.h>
+
+v2 scale_v2(v2 v, f32 x)
+{
+ return (v2){v.x * x, v.y * x};
+}
+
+v2 add_v2(v2 a, v2 b)
+{
+ return (v2){a.x + b.x, a.y + b.y};
+}
+
+v2 v2a(f32 x)
+{
+ return (v2){x, x};
+}
+
+v3 v3a(f32 x)
+{
+ return (v3){x, x, x};
+}
+
+mat mul_mat(mat l, mat r)
+{
+ f32 l00 = l.c0.x, l01 = l.c0.y, l02 = l.c0.z, l03 = l.c0.w;
+ f32 l10 = l.c1.x, l11 = l.c1.y, l12 = l.c1.z, l13 = l.c1.w;
+ f32 l20 = l.c2.x, l21 = l.c2.y, l22 = l.c2.z, l23 = l.c2.w;
+ f32 l30 = l.c3.x, l31 = l.c3.y, l32 = l.c3.z, l33 = l.c3.w;
+
+ f32 r00 = r.c0.x, r01 = r.c0.y, r02 = r.c0.z, r03 = r.c0.w;
+ f32 r10 = r.c1.x, r11 = r.c1.y, r12 = r.c1.z, r13 = r.c1.w;
+ f32 r20 = r.c2.x, r21 = r.c2.y, r22 = r.c2.z, r23 = r.c2.w;
+ f32 r30 = r.c3.x, r31 = r.c3.y, r32 = r.c3.z, r33 = r.c3.w;
+
+ mat result = {
+ {
+ l00*r00+l10*r01+l20*r02+l30*r03,
+ l01*r00+l11*r01+l21*r02+l31*r03,
+ l02*r00+l12*r01+l22*r02+l32*r03,
+ l03*r00+l13*r01+l23*r02+l33*r03
+ },
+ {
+ l00*r10+l10*r11+l20*r12+l30*r13,
+ l01*r10+l11*r11+l21*r12+l31*r13,
+ l02*r10+l12*r11+l22*r12+l32*r13,
+ l03*r10+l13*r11+l23*r12+l33*r13
+ },
+ {
+ l00*r20+l10*r21+l20*r22+l30*r23,
+ l01*r20+l11*r21+l21*r22+l31*r23,
+ l02*r20+l12*r21+l22*r22+l32*r23,
+ l03*r20+l13*r21+l23*r22+l33*r23
+ },
+ {
+ l00*r30+l10*r31+l20*r32+l30*r33,
+ l01*r30+l11*r31+l21*r32+l31*r33,
+ l02*r30+l12*r31+l22*r32+l32*r33,
+ l03*r30+l13*r31+l23*r32+l33*r33
+ }
+ };
+
+ return result;
+}
+
+mat make_scale_mat(v3 v)
+{
+ mat m = {0};
+ m.c0.x = v.x;
+ m.c1.y = v.y;
+ m.c2.z = v.z;
+ m.c3.w = 1.0f;
+ return m;
+}
+
+mat make_rotate_mat(v3 x, v3 y, v3 z)
+{
+ mat m = {
+ {x.x, x.y, x.z, 0.0f},
+ {y.x, y.y, y.z, 0.0f},
+ {z.x, z.y, z.z, 0.0f},
+ {0.0f, 0.0f, 0.0f, 1.0f}
+ };
+ return m;
+}
+
+mat make_translate_mat(v3 v)
+{
+ mat m = mat_identity;
+ m.c3.x = v.x;
+ m.c3.y = v.y;
+ m.c3.z = v.z;
+ return m;
+}
+
+mat scale_mat(mat m, v3 v)
+{
+ return mul_mat(make_scale_mat(v), m);
+}
+
+mat rotate_mat(mat m, v3 angles)
+{
+ f32 angle = deg2rad(angles.x);
+ f32 cx = cosf(angle);
+ f32 sx = sinf(angle);
+ angle = deg2rad(angles.y);
+ f32 cy = cosf(angle);
+ f32 sy = sinf(angle);
+ angle = deg2rad(angles.z);
+ f32 cz = cosf(angle);
+ f32 sz = sinf(angle);
+
+ v3 x = {cy * cz, sx * sy * cz + cx * sz, -cx * sy * cz + sx * sz};
+ v3 y = {-cy * sz, -sx * sy * sz + cx * cz, cx * sy * sz + sx * cz};
+ v3 z = {sy, -sx * cy, cx * cy};
+
+ return mul_mat(make_rotate_mat(x, y, z), m);
+}
+
+mat translate_mat(mat m, v3 v)
+{
+ return mul_mat(make_translate_mat(v), m);
+}
+
+mat ortho(f32 l, f32 r, f32 b, f32 t, f32 n, f32 f)
+{
+ mat ortho = {0};
+ ortho.c0.x = 2.0f / (r - l);
+ ortho.c1.y = 2.0f / (t - b);
+ ortho.c2.z = -2.0f / (f - n);
+ ortho.c3.x = -((r + l) / (r - l));
+ ortho.c3.y = -((t + b) / (t - b));
+ ortho.c3.z = -((f + n) / (f - n));
+ ortho.c3.w = 1.0f;
+ return ortho;
+}