diff options
Diffstat (limited to 'js/wgpu/math')
| -rw-r--r-- | js/wgpu/math/Mat4.js | 126 | ||||
| -rw-r--r-- | js/wgpu/math/Math.js | 3 | ||||
| -rw-r--r-- | js/wgpu/math/Vec2.js | 103 | ||||
| -rw-r--r-- | js/wgpu/math/Vec3.js | 156 | ||||
| -rw-r--r-- | js/wgpu/math/Vec4.js | 132 |
5 files changed, 520 insertions, 0 deletions
diff --git a/js/wgpu/math/Mat4.js b/js/wgpu/math/Mat4.js new file mode 100644 index 0000000..d4846f1 --- /dev/null +++ b/js/wgpu/math/Mat4.js @@ -0,0 +1,126 @@ +export class Mat4 { + + constructor(data) { + this.data = data ?? [ + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0 + ] + } + + mulV(v) { + let d = this.data; + return new Vec4( + new Vec4(d[0], d[1], d[2], d[3]).dot(v), + new Vec4(d[4], d[5], d[6], d[7]).dot(v), + new Vec4(d[8], d[9], d[10], d[11]).dot(v), + new Vec4(d[12], d[13], d[14], d[15]).dot(v), + ) + } + + determinant() { + // taken from gl-matrix + + let a = this.data; + let a00 = a[0], + a01 = a[1], + a02 = a[2], + a03 = a[3]; + let a10 = a[4], + a11 = a[5], + a12 = a[6], + a13 = a[7]; + let a20 = a[8], + a21 = a[9], + a22 = a[10], + a23 = a[11]; + let a30 = a[12], + a31 = a[13], + a32 = a[14], + a33 = a[15]; + let b0 = a00 * a11 - a01 * a10; + let b1 = a00 * a12 - a02 * a10; + let b2 = a01 * a12 - a02 * a11; + let b3 = a20 * a31 - a21 * a30; + let b4 = a20 * a32 - a22 * a30; + let b5 = a21 * a32 - a22 * a31; + let b6 = a00 * b5 - a01 * b4 + a02 * b3; + let b7 = a10 * b5 - a11 * b4 + a12 * b3; + let b8 = a20 * b2 - a21 * b1 + a22 * b0; + let b9 = a30 * b2 - a31 * b1 + a32 * b0; + + // Calculate the determinant + return a13 * b6 - a03 * b7 + a33 * b8 - a23 * b9; + } + + invert() { + // taken from gl-matrix + + let a = this.data; + let a00 = a[0], + a01 = a[1], + a02 = a[2], + a03 = a[3]; + let a10 = a[4], + a11 = a[5], + a12 = a[6], + a13 = a[7]; + let a20 = a[8], + a21 = a[9], + a22 = a[10], + a23 = a[11]; + let a30 = a[12], + a31 = a[13], + a32 = a[14], + a33 = a[15]; + let b00 = a00 * a11 - a01 * a10; + let b01 = a00 * a12 - a02 * a10; + let b02 = a00 * a13 - a03 * a10; + let b03 = a01 * a12 - a02 * a11; + let b04 = a01 * a13 - a03 * a11; + let b05 = a02 * a13 - a03 * a12; + let b06 = a20 * a31 - a21 * a30; + let b07 = a20 * a32 - a22 * a30; + let b08 = a20 * a33 - a23 * a30; + let b09 = a21 * a32 - a22 * a31; + let b10 = a21 * a33 - a23 * a31; + let b11 = a22 * a33 - a23 * a32; + + let det = this.determinant(); + if (!det) + return null; + + det = 1.0 / det; + + let out = []; + out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; + out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det; + out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det; + out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det; + out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det; + out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det; + out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det; + out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det; + out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det; + out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det; + out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det; + out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det; + out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det; + out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det; + out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det; + out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det; + + return new Mat4(out); + } + + static identity() { + return new Mat4([ + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + ]); + } + +} diff --git a/js/wgpu/math/Math.js b/js/wgpu/math/Math.js new file mode 100644 index 0000000..45e5bf8 --- /dev/null +++ b/js/wgpu/math/Math.js @@ -0,0 +1,3 @@ +export const M = {} + +M.clamp = (num, min, max) => Math.min(Math.max(num, min), max) diff --git a/js/wgpu/math/Vec2.js b/js/wgpu/math/Vec2.js new file mode 100644 index 0000000..9c7f68b --- /dev/null +++ b/js/wgpu/math/Vec2.js @@ -0,0 +1,103 @@ +export class Vec2 { + + constructor(x = 0, y = 0) { + this.x = x + this.y = y + } + + setAxis(axis, value) { + switch (axis) { + case 0: + this.x = value; + break; + case 1: + this.y = value; + break; + }; + } + + getAxis(axis) { + switch (axis) { + case 0: + return this.x; + case 1: + return this.y; + }; + } + + add(n) { + return new Vec2( + this.x + n, + this.y + n, + ); + } + + addV(v) { + return new Vec2( + this.x + v.x, + this.y + v.y, + ); + } + + sub(n) { + return new Vec2( + this.x - n, + this.y - n, + ); + } + + subV(v) { + return new Vec2( + this.x - v.x, + this.y - v.y, + ); + } + + mul(s) { + return new Vec2( + this.x * s, + this.y * s, + ); + } + + mulV(v) { + return new Vec2( + this.x * v.x, + this.y * v.y, + ); + } + + div(s) { + return new Vec2( + this.x / s, + this.y / s, + ); + } + + divV(v) { + return new Vec2( + this.x / v.x, + this.y / v.y, + ); + } + + invert() { + return new Vec2( + 1 / this.x, + 1 / this.y, + ); + } + + normalize() { + return this.div(this.length() || 1); + } + + dot(v) { + return this.x * v.x + this.y * v.y; + } + + length() { + return Math.sqrt(this.x * this.x + this.y * this.y); + } + +} diff --git a/js/wgpu/math/Vec3.js b/js/wgpu/math/Vec3.js new file mode 100644 index 0000000..f084fee --- /dev/null +++ b/js/wgpu/math/Vec3.js @@ -0,0 +1,156 @@ +export class Vec3 { + + constructor(x = 0, y = 0, z = 0) { + this.x = x + this.y = y + this.z = z + } + + setAxis(axis, value) { + switch (axis) { + case 0: + this.x = value; + break; + case 1: + this.y = value; + break; + case 2: + this.z = value; + break; + }; + } + + getAxis(axis) { + switch (axis) { + case 0: + return this.x; + case 1: + return this.y; + case 2: + return this.z; + }; + } + + add(n) { + return new Vec3( + this.x + n, + this.y + n, + this.z + n, + ); + } + + addV(v) { + return new Vec3( + this.x + v.x, + this.y + v.y, + this.z + v.z, + ); + } + + sub(n) { + return new Vec3( + this.x - n, + this.y - n, + this.z - n, + ); + } + + subV(v) { + return new Vec3( + this.x - v.x, + this.y - v.y, + this.z - v.z, + ); + } + + mul(s) { + return new Vec3( + this.x * s, + this.y * s, + this.z * s, + ); + } + + mulV(v) { + return new Vec3( + this.x * v.x, + this.y * v.y, + this.z * v.z, + ); + } + + div(s) { + return new Vec3( + this.x / s, + this.y / s, + this.z / s, + ); + } + + divV(v) { + return new Vec3( + this.x / v.x, + this.y / v.y, + this.z / v.z, + ); + } + + invert() { + return new Vec3( + 1 / this.x, + 1 / this.y, + 1 / this.z, + ); + } + + normalize() { + return this.div(this.length() || 1); + } + + dot(v) { + return this.x * v.x + this.y * v.y + this.z * v.z; + } + + length() { + return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z); + } + + floor() { + return new Vec3( + Math.floor(this.x), + Math.floor(this.y), + Math.floor(this.z), + ) + } + + ciel() { + return new Vec3( + Math.ceil(this.x), + Math.ceil(this.y), + Math.ceil(this.z), + ) + } + + trunc() { + return new Vec3( + Math.trunc(this.x), + Math.trunc(this.y), + Math.trunc(this.z), + ) + } + + and(n) { + return new Vec3( + this.x & n, + this.y & n, + this.z & n, + ); + } + + eq(v) { + return v && + this.x == v.x && + this.y == v.y && + this.z == v.z + } +} diff --git a/js/wgpu/math/Vec4.js b/js/wgpu/math/Vec4.js new file mode 100644 index 0000000..ea3ded2 --- /dev/null +++ b/js/wgpu/math/Vec4.js @@ -0,0 +1,132 @@ +export class Vec4 { + + constructor(x = 0, y = 0, z = 0, w = 0) { + this.x = x + this.y = y + this.z = z + this.w = w + } + + setAxis(axis, value) { + switch (axis) { + case 0: + this.x = value; + break; + case 1: + this.y = value; + break; + case 2: + this.z = value; + break; + case 3: + this.w = value; + break; + }; + } + + getAxis(axis) { + switch (axis) { + case 0: + return this.x; + case 1: + return this.y; + case 2: + return this.z; + case 3: + return this.w; + }; + } + + add(n) { + return new Vec4( + this.x + n, + this.y + n, + this.z + n, + this.w + n, + ); + } + + addV(v) { + return new Vec4( + this.x + v.x, + this.y + v.y, + this.z + v.z, + this.w + v.w, + ); + } + + sub(n) { + return new Vec4( + this.x - n, + this.y - n, + this.z - n, + this.w - n, + ); + } + + subV(v) { + return new Vec4( + this.x - v.x, + this.y - v.y, + this.z - v.z, + this.w - v.w, + ); + } + + mul(s) { + return new Vec4( + this.x * s, + this.y * s, + this.z * s, + this.w * s, + ); + } + + mulV(v) { + return new Vec4( + this.x * v.x, + this.y * v.y, + this.z * v.z, + this.w * v.w, + ); + } + + div(s) { + return new Vec4( + this.x / s, + this.y / s, + this.z / s, + this.w / s, + ); + } + + divV(v) { + return new Vec4( + this.x / v.x, + this.y / v.y, + this.z / v.z, + this.w / v.w, + ); + } + + invert() { + return new Vec4( + 1 / this.x, + 1 / this.y, + 1 / this.z, + 1 / this.w, + ); + } + + normalize() { + return this.div(this.length() || 1); + } + + dot(v) { + return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; + } + + length() { + return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w); + } +} |