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;
}
};
|