summaryrefslogtreecommitdiff
path: root/frontend/_wasm/mathlib.h
blob: bc84b724b37483108363efd8115f326dcd0ba3ca (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
#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 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;
    }
};