summaryrefslogtreecommitdiff
path: root/frontend/_wasm/intro/mathlib.h
blob: 93ddbbd73643a1b5e6ee3da00e62a50fc31c0383 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#pragma once
#include <cstdio>
#include <cstdlib>
#include <cstring>

struct Vector2 {
    float x = 0;
    float y = 0;

    Vector2 operator+(Vector2 other) {
        return { x + other.x, y + other.y };
    }

    Vector2 operator-(Vector2 other) {
        return { x - other.x, y - other.y };
    }

    Vector2 operator*(float s) {
        return { x * s, y * s };
    }

    float dot(Vector2 other) {
        return x * other.x + y * other.y;
    }

    float length() {
        return sqrtf(x * x + y * y);
    }

    Vector2 normalize() {
        float len = length();
        float inverseLength = len == 0 ? 1.0 : 1.0 / len;

        return { x * inverseLength, y * inverseLength };
    }

    Vector2 negate() {
        return { -x, -y };
    }

    Vector2 getPerp() {
        return { -y, x };
    }
};

struct Vector3 {
    float x = 0.f;
    float y = 0.f;
    float z = 0.f;
};

struct Vector4 {
    float x = 0.f;
    float y = 0.f;
    float z = 0.f;
    float w = 0.f;
};

struct Mat4x4 {
    float m[16] = {
        1, 0, 0, 0,
        0, 1, 0, 0,
        0, 0, 1, 0,
        0, 0, 0, 1
    };

    Mat4x4 copy() {
        Mat4x4 result;
        memcpy(result.m, m, sizeof(float) * 16);
        return result;
    }

    Mat4x4 scale(Vector3 v) {
        Mat4x4 result = copy();
        result.m[0] = result.m[0] * v.x;
        result.m[5] = result.m[5] *v.y;
        result.m[10] = result.m[10] * v.z;
        return result;
    }

    Mat4x4 translate(Vector3 v) {
        Mat4x4 result = copy();
        result.m[12] += v.x;
        result.m[13] += v.y;
        result.m[14] += v.z;
        return result;
    }

	Mat4x4 translateByVec2(Vector2 v) {
        Mat4x4 result = copy();
        result.m[12] += v.x;
        result.m[13] += v.y;
        return result;
    }

    Mat4x4 rotate2D(float angle) {
        Mat4x4 result = copy();
        result.m[0] = cos(angle);
        result.m[1] = -sin(angle);
        result.m[4] = sin(angle);
        result.m[5] = cos(angle);
        return result;
    }

    Vector2 multByVec2(Vector2 v) {
        Vector4 vec4 = { v.x, v.y, 0.0, 1.0 };
        return {
            vec4.x * m[0] + vec4.y * m[4] + vec4.z * m[8] + vec4.w * m[12],
            vec4.x * m[1] + vec4.y * m[5] + vec4.z * m[9] + vec4.w * m[13]
        };
    }

    Mat4x4 getOrthographicMatrix(float left, float right, float bottom, float top) {
        Mat4x4 result;
        result.m[0] = 2.0 / (right - left);
        result.m[5] = 2.0 / (top - bottom);
        result.m[10] = 1.0;
        result.m[12] = -(right + left) / (right - left);
        result.m[13] = -(top + bottom) / (top - bottom);
        return result;
    }

	void print() {
		printf("[ ");
		for (int idx = 0; idx < 16; idx++) {
			printf("%d, ", idx);
		}
		printf(" ]\n");
	}
};