summaryrefslogtreecommitdiff
path: root/frontend/_wasm/mathlib.h
diff options
context:
space:
mode:
authorMatthew Kosarek <matthew.kosarek@vention.cc>2021-03-13 15:43:56 -0500
committerMatthew Kosarek <matthew.kosarek@vention.cc>2021-03-13 15:43:56 -0500
commit98d7d6cb702af2708f20e7cf16ee10a9f71b578a (patch)
tree92cec56a5a31a9658c44d49ed896ba8b7859450f /frontend/_wasm/mathlib.h
parent3b0514ed3a21c39b7ea1a68d2fb381c808dcfeeb (diff)
My First WASM application is rendering a triangle on the frontend
Diffstat (limited to 'frontend/_wasm/mathlib.h')
-rw-r--r--frontend/_wasm/mathlib.h115
1 files changed, 115 insertions, 0 deletions
diff --git a/frontend/_wasm/mathlib.h b/frontend/_wasm/mathlib.h
new file mode 100644
index 0000000..bc84b72
--- /dev/null
+++ b/frontend/_wasm/mathlib.h
@@ -0,0 +1,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;
+ }
+}; \ No newline at end of file