From aa88fa305e98c1211ed74a33e14b8db5f4dd3c04 Mon Sep 17 00:00:00 2001 From: solarunes Date: Thu, 1 Jan 2026 20:41:41 +0100 Subject: [PATCH 1/4] various performance improvements --- .size-snapshot.json | 6 +- LICENSE.md | 2 +- dist/esm/common.js | 49 +++- dist/esm/mat2.js | 45 +--- dist/esm/mat2d.js | 30 +-- dist/esm/mat3.js | 64 ++--- dist/esm/mat4.js | 110 ++------- dist/esm/vec2.js | 52 ++-- dist/esm/vec3.js | 68 ++---- dist/esm/vec4.js | 78 ++---- dist/gl-matrix-min.js | 4 +- dist/gl-matrix.js | 556 ++++++++++++++++-------------------------- src/common.js | 35 ++- src/mat2.js | 58 ++--- src/mat2d.js | 46 +--- src/mat3.js | 97 ++------ src/mat4.js | 160 +++--------- src/vec2.js | 57 ++--- src/vec3.js | 72 ++---- src/vec4.js | 84 ++----- 20 files changed, 548 insertions(+), 1125 deletions(-) diff --git a/.size-snapshot.json b/.size-snapshot.json index dc939dfa..243c9eed 100644 --- a/.size-snapshot.json +++ b/.size-snapshot.json @@ -10,8 +10,8 @@ "gzipped": 12913 }, "gl-matrix-min.js": { - "bundled": 207220, - "minified": 52740, - "gzipped": 13405 + "bundled": 205177, + "minified": 52126, + "gzipped": 13856 } } diff --git a/LICENSE.md b/LICENSE.md index be8c473a..9d5e4a31 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,4 +1,4 @@ -Copyright (c) 2015-2025, Brandon Jones, Colin MacKenzie IV. +Copyright (c) 2015-2026, Brandon Jones, Colin MacKenzie IV. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/dist/esm/common.js b/dist/esm/common.js index 2b94e95f..b658cd72 100644 --- a/dist/esm/common.js +++ b/dist/esm/common.js @@ -1,3 +1,16 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } /** * Common utilities * @module glMatrix @@ -6,18 +19,18 @@ // Configuration Constants export var EPSILON = 0.000001; export var ARRAY_TYPE = typeof Float32Array !== "undefined" ? Float32Array : Array; +// If an array is required to initialize to zero. +export var ARRAY_ZERO_INIT_TYPE = ARRAY_TYPE === Array ? _createFastZeroInit(ARRAY_TYPE) : ARRAY_TYPE; export var RANDOM = Math.random; export var ANGLE_ORDER = "zyx"; /** * Symmetric round - * see https://www.npmjs.com/package/round-half-up-symmetric#user-content-detailed-background * * @param {Number} a value to round */ export function round(a) { - if (a >= 0) return Math.round(a); - return a % 0.5 === 0 ? Math.floor(a) : Math.round(a); + return Math.round(Math.abs(a)) * Math.sign(a); } /** @@ -27,6 +40,13 @@ export function round(a) { */ export function setMatrixArrayType(type) { ARRAY_TYPE = type; + + // If the Array is not a TypedArray, create a constructor that automatically fills it with zeroes. + if (Array.isArray(type)) { + ARRAY_ZERO_INIT_TYPE = _createFastZeroInit(type); + return; + } + ARRAY_ZERO_INIT_TYPE = type; } var degree = Math.PI / 180; var radian = 180 / Math.PI; @@ -62,4 +82,27 @@ export function toDegree(a) { export function equals(a, b) { var tolerance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : EPSILON; return Math.abs(a - b) <= tolerance * Math.max(1, Math.abs(a), Math.abs(b)); +} + +/** + * Creates a subclass of an Array-like class that initializes all it's elements to zero. + * @private + * @param {ArrayConstructor} type The Array-like class. + * @returns {ArrayConstructor} The zero-initializer subclass. + */ +function _createFastZeroInit(type) { + return /*#__PURE__*/function (_type) { + function ArrayInitZero() { + var _this; + _classCallCheck(this, ArrayInitZero); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _callSuper(this, ArrayInitZero, [].concat(args)); + _this.fill(0); + return _this; + } + _inherits(ArrayInitZero, _type); + return _createClass(ArrayInitZero); + }(type); } \ No newline at end of file diff --git a/dist/esm/mat2.js b/dist/esm/mat2.js index f51bfec0..b3e15f25 100644 --- a/dist/esm/mat2.js +++ b/dist/esm/mat2.js @@ -11,11 +11,7 @@ import * as glMatrix from "./common.js"; * @returns {mat2} a new 2x2 matrix */ export function create() { - var out = new glMatrix.ARRAY_TYPE(4); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - } + var out = new glMatrix.ARRAY_ZERO_INIT_TYPE(4); out[0] = 1; out[3] = 1; return out; @@ -109,18 +105,11 @@ export function set(out, m00, m01, m10, m11) { * @returns {mat2} out */ export function transpose(out, a) { - // If we are transposing ourselves we can skip a few steps but have to cache - // some values - if (out === a) { - var a1 = a[1]; - out[1] = a[2]; - out[2] = a1; - } else { - out[0] = a[0]; - out[1] = a[2]; - out[2] = a[1]; - out[3] = a[3]; - } + out[0] = a[0]; + var o1 = a[1]; + out[1] = a[2]; + out[2] = o1; + out[3] = a[3]; return out; } @@ -232,16 +221,12 @@ export function rotate(out, a, rad) { * @returns {mat2} out **/ export function scale(out, a, v) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; var v0 = v[0], v1 = v[1]; - out[0] = a0 * v0; - out[1] = a1 * v0; - out[2] = a2 * v1; - out[3] = a3 * v1; + out[0] = a[0] * v0; + out[1] = a[1] * v0; + out[2] = a[2] * v1; + out[3] = a[3] * v1; return out; } @@ -372,15 +357,7 @@ export function exactEquals(a, b) { * @returns {Boolean} True if the matrices are equal, false otherwise. */ export function equals(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3]; - return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)); + return glMatrix.equals(a[0], b[0]) && glMatrix.equals(a[1], b[1]) && glMatrix.equals(a[2], b[2]) && glMatrix.equals(a[3], b[3]); } /** diff --git a/dist/esm/mat2d.js b/dist/esm/mat2d.js index 16e60541..f8c117cc 100644 --- a/dist/esm/mat2d.js +++ b/dist/esm/mat2d.js @@ -25,13 +25,7 @@ import * as glMatrix from "./common.js"; * @returns {mat2d} a new 2x3 matrix */ export function create() { - var out = new glMatrix.ARRAY_TYPE(6); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - out[4] = 0; - out[5] = 0; - } + var out = new glMatrix.ARRAY_ZERO_INIT_TYPE(6); out[0] = 1; out[3] = 1; return out; @@ -211,17 +205,15 @@ export function rotate(out, a, rad) { var a0 = a[0], a1 = a[1], a2 = a[2], - a3 = a[3], - a4 = a[4], - a5 = a[5]; + a3 = a[3]; var s = Math.sin(rad); var c = Math.cos(rad); out[0] = a0 * c + a2 * s; out[1] = a1 * c + a3 * s; out[2] = a0 * -s + a2 * c; out[3] = a1 * -s + a3 * c; - out[4] = a4; - out[5] = a5; + out[4] = a[4]; + out[5] = a[5]; return out; } @@ -454,19 +446,7 @@ export function exactEquals(a, b) { * @returns {Boolean} True if the matrices are equal, false otherwise. */ export function equals(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3], - a4 = a[4], - a5 = a[5]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3], - b4 = b[4], - b5 = b[5]; - return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)); + return glMatrix.equals(a[0], b[0]) && glMatrix.equals(a[1], b[1]) && glMatrix.equals(a[2], b[2]) && glMatrix.equals(a[3], b[3]) && glMatrix.equals(a[4], b[4]) && glMatrix.equals(a[5], b[5]); } /** diff --git a/dist/esm/mat3.js b/dist/esm/mat3.js index 66df4510..753bca04 100644 --- a/dist/esm/mat3.js +++ b/dist/esm/mat3.js @@ -11,15 +11,7 @@ import * as glMatrix from "./common.js"; * @returns {mat3} a new 3x3 matrix */ export function create() { - var out = new glMatrix.ARRAY_TYPE(9); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[5] = 0; - out[6] = 0; - out[7] = 0; - } + var out = new glMatrix.ARRAY_ZERO_INIT_TYPE(9); out[0] = 1; out[4] = 1; out[8] = 1; @@ -169,28 +161,18 @@ export function identity(out) { * @returns {mat3} out */ export function transpose(out, a) { - // If we are transposing ourselves we can skip a few steps but have to cache some values - if (out === a) { - var a01 = a[1], - a02 = a[2], - a12 = a[5]; - out[1] = a[3]; - out[2] = a[6]; - out[3] = a01; - out[5] = a[7]; - out[6] = a02; - out[7] = a12; - } else { - out[0] = a[0]; - out[1] = a[3]; - out[2] = a[6]; - out[3] = a[1]; - out[4] = a[4]; - out[5] = a[7]; - out[6] = a[2]; - out[7] = a[5]; - out[8] = a[8]; - } + var a01 = a[1], + a02 = a[2], + a12 = a[5]; + out[0] = a[0]; + out[1] = a[3]; + out[2] = a[6]; + out[3] = a01; + out[4] = a[4]; + out[5] = a[7]; + out[6] = a02; + out[7] = a12; + out[8] = a[8]; return out; } @@ -739,25 +721,7 @@ export function exactEquals(a, b) { * @returns {Boolean} True if the matrices are equal, false otherwise. */ export function equals(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3], - a4 = a[4], - a5 = a[5], - a6 = a[6], - a7 = a[7], - a8 = a[8]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3], - b4 = b[4], - b5 = b[5], - b6 = b[6], - b7 = b[7], - b8 = b[8]; - return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)); + return glMatrix.equals(a[0], b[0]) && glMatrix.equals(a[1], b[1]) && glMatrix.equals(a[2], b[2]) && glMatrix.equals(a[3], b[3]) && glMatrix.equals(a[4], b[4]) && glMatrix.equals(a[5], b[5]) && glMatrix.equals(a[6], b[6]) && glMatrix.equals(a[7], b[7]) && glMatrix.equals(a[8], b[8]); } /** diff --git a/dist/esm/mat4.js b/dist/esm/mat4.js index 184b4d53..aee12476 100644 --- a/dist/esm/mat4.js +++ b/dist/esm/mat4.js @@ -11,21 +11,7 @@ import * as glMatrix from "./common.js"; * @returns {mat4} a new 4x4 matrix */ export function create() { - var out = new glMatrix.ARRAY_TYPE(16); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[6] = 0; - out[7] = 0; - out[8] = 0; - out[9] = 0; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - } + var out = new glMatrix.ARRAY_ZERO_INIT_TYPE(16); out[0] = 1; out[5] = 1; out[10] = 1; @@ -205,44 +191,28 @@ export function identity(out) { * @returns {mat4} out */ export function transpose(out, a) { - // If we are transposing ourselves we can skip a few steps but have to cache some values - if (out === a) { - var a01 = a[1], - a02 = a[2], - a03 = a[3]; - var a12 = a[6], - a13 = a[7]; - var a23 = a[11]; - out[1] = a[4]; - out[2] = a[8]; - out[3] = a[12]; - out[4] = a01; - out[6] = a[9]; - out[7] = a[13]; - out[8] = a02; - out[9] = a12; - out[11] = a[14]; - out[12] = a03; - out[13] = a13; - out[14] = a23; - } else { - out[0] = a[0]; - out[1] = a[4]; - out[2] = a[8]; - out[3] = a[12]; - out[4] = a[1]; - out[5] = a[5]; - out[6] = a[9]; - out[7] = a[13]; - out[8] = a[2]; - out[9] = a[6]; - out[10] = a[10]; - out[11] = a[14]; - out[12] = a[3]; - out[13] = a[7]; - out[14] = a[11]; - out[15] = a[15]; - } + var a01 = a[1], + a02 = a[2], + a03 = a[3]; + var a12 = a[6], + a13 = a[7]; + var a23 = a[11]; + out[0] = a[0]; + out[1] = a[4]; + out[2] = a[8]; + out[3] = a[12]; + out[4] = a01; + out[5] = a[5]; + out[6] = a[9]; + out[7] = a[13]; + out[8] = a02; + out[9] = a12; + out[10] = a[10]; + out[11] = a[14]; + out[12] = a03; + out[13] = a13; + out[14] = a23; + out[15] = a[15]; return out; } @@ -1913,39 +1883,7 @@ export function exactEquals(a, b) { * @returns {Boolean} True if the matrices are equal, false otherwise. */ export function equals(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; - var a4 = a[4], - a5 = a[5], - a6 = a[6], - a7 = a[7]; - var a8 = a[8], - a9 = a[9], - a10 = a[10], - a11 = a[11]; - var a12 = a[12], - a13 = a[13], - a14 = a[14], - a15 = a[15]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3]; - var b4 = b[4], - b5 = b[5], - b6 = b[6], - b7 = b[7]; - var b8 = b[8], - b9 = b[9], - b10 = b[10], - b11 = b[11]; - var b12 = b[12], - b13 = b[13], - b14 = b[14], - b15 = b[15]; - return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15)); + return glMatrix.equals(a[0], b[0]) && glMatrix.equals(a[1], b[1]) && glMatrix.equals(a[2], b[2]) && glMatrix.equals(a[3], b[3]) && glMatrix.equals(a[4], b[4]) && glMatrix.equals(a[5], b[5]) && glMatrix.equals(a[6], b[6]) && glMatrix.equals(a[7], b[7]) && glMatrix.equals(a[8], b[8]) && glMatrix.equals(a[9], b[9]) && glMatrix.equals(a[10], b[10]) && glMatrix.equals(a[11], b[11]) && glMatrix.equals(a[12], b[12]) && glMatrix.equals(a[13], b[13]) && glMatrix.equals(a[14], b[14]) && glMatrix.equals(a[15], b[15]); } /** diff --git a/dist/esm/vec2.js b/dist/esm/vec2.js index 263e14a8..a65bbf86 100644 --- a/dist/esm/vec2.js +++ b/dist/esm/vec2.js @@ -11,12 +11,7 @@ import * as glMatrix from "./common.js"; * @returns {vec2} a new 2D vector */ export function create() { - var out = new glMatrix.ARRAY_TYPE(2); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[0] = 0; - out[1] = 0; - } - return out; + return new glMatrix.ARRAY_ZERO_INIT_TYPE(2); } /** @@ -233,9 +228,7 @@ export function scaleAndAdd(out, a, b, scale) { * @returns {Number} distance between a and b */ export function distance(a, b) { - var x = b[0] - a[0], - y = b[1] - a[1]; - return Math.sqrt(x * x + y * y); + return Math.hypot(b[0] - a[0], b[1] - a[1]); } /** @@ -258,9 +251,7 @@ export function squaredDistance(a, b) { * @returns {Number} length of a */ export function length(a) { - var x = a[0], - y = a[1]; - return Math.sqrt(x * x + y * y); + return Math.hypot(a[0], a[1]); } /** @@ -309,15 +300,9 @@ export function inverse(out, a) { * @returns {vec2} out */ export function normalize(out, a) { - var x = a[0], - y = a[1]; - var len = x * x + y * y; - if (len > 0) { - //TODO: evaluate use of glm_invsqrt here? - len = 1 / Math.sqrt(len); - } - out[0] = a[0] * len; - out[1] = a[1] * len; + var len = Math.max(Math.hypot(a[0], a[1]), glMatrix.EPSILON); + out[0] = a[0] / len; + out[1] = a[1] / len; return out; } @@ -372,8 +357,8 @@ export function lerp(out, a, b, t) { * @param {Number} [scale] Length of the resulting vector. If omitted, a unit vector will be returned * @returns {vec2} out */ -export function random(out, scale) { - scale = scale === undefined ? 1.0 : scale; +export function random(out) { + var scale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1.0; var r = glMatrix.RANDOM() * 2.0 * Math.PI; out[0] = Math.cos(r) * scale; out[1] = Math.sin(r) * scale; @@ -484,7 +469,7 @@ export function angle(a, b) { /** * Get the signed angle in the interval [-pi,pi] between two 2D vectors (positive if `a` is to the right of `b`) - * + * * @param {ReadonlyVec2} a The first vector * @param {ReadonlyVec2} b The second vector * @returns {number} The signed angle in radians @@ -538,11 +523,7 @@ export function exactEquals(a, b) { * @returns {Boolean} True if the vectors are equal, false otherwise. */ export function equals(a, b) { - var a0 = a[0], - a1 = a[1]; - var b0 = b[0], - b1 = b[1]; - return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)); + return glMatrix.equals(a[0], b[0]) && glMatrix.equals(a[1], b[1]); } /** @@ -601,14 +582,13 @@ export var sqrLen = squaredLength; */ export var forEach = function () { var vec = create(); - return function (a, stride, offset, count, fn, arg) { + return function (a, stride) { + var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; + var count = arguments.length > 3 ? arguments[3] : undefined; + var fn = arguments.length > 4 ? arguments[4] : undefined; + var arg = arguments.length > 5 ? arguments[5] : undefined; var i, l; - if (!stride) { - stride = 2; - } - if (!offset) { - offset = 0; - } + stride = stride || 2; if (count) { l = Math.min(count * stride + offset, a.length); } else { diff --git a/dist/esm/vec3.js b/dist/esm/vec3.js index caf84a5f..d71453d7 100644 --- a/dist/esm/vec3.js +++ b/dist/esm/vec3.js @@ -11,13 +11,7 @@ import * as glMatrix from "./common.js"; * @returns {vec3} a new 3D vector */ export function create() { - var out = new glMatrix.ARRAY_TYPE(3); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[0] = 0; - out[1] = 0; - out[2] = 0; - } - return out; + return new glMatrix.ARRAY_ZERO_INIT_TYPE(3); } /** @@ -41,10 +35,7 @@ export function clone(a) { * @returns {Number} length of a */ export function length(a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - return Math.sqrt(x * x + y * y + z * z); + return Math.hypot(a[0], a[1], a[2]); } /** @@ -264,10 +255,7 @@ export function scaleAndAdd(out, a, b, scale) { * @returns {Number} distance between a and b */ export function distance(a, b) { - var x = b[0] - a[0]; - var y = b[1] - a[1]; - var z = b[2] - a[2]; - return Math.sqrt(x * x + y * y + z * z); + return Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2]); } /** @@ -278,10 +266,7 @@ export function distance(a, b) { * @returns {Number} squared distance between a and b */ export function squaredDistance(a, b) { - var x = b[0] - a[0]; - var y = b[1] - a[1]; - var z = b[2] - a[2]; - return x * x + y * y + z * z; + return Math.pow(Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2]), 2); } /** @@ -291,10 +276,7 @@ export function squaredDistance(a, b) { * @returns {Number} squared length of a */ export function squaredLength(a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - return x * x + y * y + z * z; + return Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2); } /** @@ -333,17 +315,10 @@ export function inverse(out, a) { * @returns {vec3} out */ export function normalize(out, a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - var len = x * x + y * y + z * z; - if (len > 0) { - //TODO: evaluate use of glm_invsqrt here? - len = 1 / Math.sqrt(len); - } - out[0] = a[0] * len; - out[1] = a[1] * len; - out[2] = a[2] * len; + var len = Math.max(Math.hypot(a[0], a[1], a[2]), glMatrix.EPSILON); + out[0] = a[0] / len; + out[1] = a[1] / len; + out[2] = a[2] / len; return out; } @@ -473,8 +448,8 @@ export function bezier(out, a, b, c, d, t) { * @param {Number} [scale] Length of the resulting vector. If omitted, a unit vector will be returned * @returns {vec3} out */ -export function random(out, scale) { - scale = scale === undefined ? 1.0 : scale; +export function random(out) { + var scale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1.0; var r = glMatrix.RANDOM() * 2.0 * Math.PI; var z = glMatrix.RANDOM() * 2.0 - 1.0; var zScale = Math.sqrt(1.0 - z * z) * scale; @@ -705,13 +680,7 @@ export function exactEquals(a, b) { * @returns {Boolean} True if the vectors are equal, false otherwise. */ export function equals(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2]; - var b0 = b[0], - b1 = b[1], - b2 = b[2]; - return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)); + return glMatrix.equals(a[0], b[0]) && glMatrix.equals(a[1], b[1]) && glMatrix.equals(a[2], b[2]); } /** @@ -770,14 +739,13 @@ export var sqrLen = squaredLength; */ export var forEach = function () { var vec = create(); - return function (a, stride, offset, count, fn, arg) { + return function (a, stride) { + var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; + var count = arguments.length > 3 ? arguments[3] : undefined; + var fn = arguments.length > 4 ? arguments[4] : undefined; + var arg = arguments.length > 5 ? arguments[5] : undefined; var i, l; - if (!stride) { - stride = 3; - } - if (!offset) { - offset = 0; - } + stride = stride || 3; if (count) { l = Math.min(count * stride + offset, a.length); } else { diff --git a/dist/esm/vec4.js b/dist/esm/vec4.js index a52b5bfc..91247a92 100644 --- a/dist/esm/vec4.js +++ b/dist/esm/vec4.js @@ -11,14 +11,7 @@ import * as glMatrix from "./common.js"; * @returns {vec4} a new 4D vector */ export function create() { - var out = new glMatrix.ARRAY_TYPE(4); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[0] = 0; - out[1] = 0; - out[2] = 0; - out[3] = 0; - } - return out; + return new glMatrix.ARRAY_ZERO_INIT_TYPE(4); } /** @@ -269,11 +262,7 @@ export function scaleAndAdd(out, a, b, scale) { * @returns {Number} distance between a and b */ export function distance(a, b) { - var x = b[0] - a[0]; - var y = b[1] - a[1]; - var z = b[2] - a[2]; - var w = b[3] - a[3]; - return Math.sqrt(x * x + y * y + z * z + w * w); + return Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2], b[3] - a[3]); } /** @@ -284,11 +273,7 @@ export function distance(a, b) { * @returns {Number} squared distance between a and b */ export function squaredDistance(a, b) { - var x = b[0] - a[0]; - var y = b[1] - a[1]; - var z = b[2] - a[2]; - var w = b[3] - a[3]; - return x * x + y * y + z * z + w * w; + return Math.pow(Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2], b[3] - a[3]), 2); } /** @@ -298,11 +283,8 @@ export function squaredDistance(a, b) { * @returns {Number} length of a */ export function length(a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - var w = a[3]; - return Math.sqrt(x * x + y * y + z * z + w * w); + return Math.hypot(a[0], a[1], a[2], a[3]); + ; } /** @@ -312,11 +294,7 @@ export function length(a) { * @returns {Number} squared length of a */ export function squaredLength(a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - var w = a[3]; - return x * x + y * y + z * z + w * w; + return Math.pow(Math.hypot(a[0], a[1], a[2], a[3]), 2); } /** @@ -357,18 +335,15 @@ export function inverse(out, a) { * @returns {vec4} out */ export function normalize(out, a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - var w = a[3]; - var len = x * x + y * y + z * z + w * w; - if (len > 0) { - len = 1 / Math.sqrt(len); - } - out[0] = x * len; - out[1] = y * len; - out[2] = z * len; - out[3] = w * len; + var x = a[0], + y = a[1], + z = a[2], + w = a[3]; + var len = Math.max(Math.hypot(x, y, z, w), glMatrix.EPSILON); + out[0] = x / len; + out[1] = y / len; + out[2] = z / len; + out[3] = w / len; return out; } @@ -564,15 +539,7 @@ export function exactEquals(a, b) { * @returns {Boolean} True if the vectors are equal, false otherwise. */ export function equals(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3]; - return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)); + return glMatrix.equals(a[0], b[0]) && glMatrix.equals(a[1], b[1]) && glMatrix.equals(a[2], b[2]) && glMatrix.equals(a[3], b[3]); } /** @@ -631,14 +598,13 @@ export var sqrLen = squaredLength; */ export var forEach = function () { var vec = create(); - return function (a, stride, offset, count, fn, arg) { + return function (a, stride) { + var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; + var count = arguments.length > 3 ? arguments[3] : undefined; + var fn = arguments.length > 4 ? arguments[4] : undefined; + var arg = arguments.length > 5 ? arguments[5] : undefined; var i, l; - if (!stride) { - stride = 4; - } - if (!offset) { - offset = 0; - } + stride = stride || 4; if (count) { l = Math.min(count * stride + offset, a.length); } else { diff --git a/dist/gl-matrix-min.js b/dist/gl-matrix-min.js index fffed8e8..dc647682 100644 --- a/dist/gl-matrix-min.js +++ b/dist/gl-matrix-min.js @@ -4,7 +4,7 @@ @author Colin MacKenzie IV @version 3.4.4 -Copyright (c) 2015-2025, Brandon Jones, Colin MacKenzie IV. +Copyright (c) 2015-2026, Brandon Jones, Colin MacKenzie IV. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -25,4 +25,4 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((t="undefined"!=typeof globalThis?globalThis:t||self).glMatrix={})}(this,(function(t){"use strict";var n=1e-6,a="undefined"!=typeof Float32Array?Float32Array:Array,r=Math.random;function u(t){return t>=0?Math.round(t):t%.5==0?Math.floor(t):Math.round(t)}var e=Math.PI/180,o=180/Math.PI;var i=Object.freeze({__proto__:null,EPSILON:n,get ARRAY_TYPE(){return a},RANDOM:r,ANGLE_ORDER:"zyx",round:u,setMatrixArrayType:function(t){a=t},toRadian:function(t){return t*e},toDegree:function(t){return t*o},equals:function(t,a){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:n;return Math.abs(t-a)<=r*Math.max(1,Math.abs(t),Math.abs(a))}});function s(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=a[0],s=a[1],c=a[2],h=a[3];return t[0]=r*i+e*s,t[1]=u*i+o*s,t[2]=r*c+e*h,t[3]=u*c+o*h,t}function c(t,n,a){return t[0]=n[0]-a[0],t[1]=n[1]-a[1],t[2]=n[2]-a[2],t[3]=n[3]-a[3],t}var h=s,M=c,f=Object.freeze({__proto__:null,create:function(){var t=new a(4);return a!=Float32Array&&(t[1]=0,t[2]=0),t[0]=1,t[3]=1,t},clone:function(t){var n=new a(4);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n},copy:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t},identity:function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t},fromValues:function(t,n,r,u){var e=new a(4);return e[0]=t,e[1]=n,e[2]=r,e[3]=u,e},set:function(t,n,a,r,u){return t[0]=n,t[1]=a,t[2]=r,t[3]=u,t},transpose:function(t,n){if(t===n){var a=n[1];t[1]=n[2],t[2]=a}else t[0]=n[0],t[1]=n[2],t[2]=n[1],t[3]=n[3];return t},invert:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=a*e-u*r;return o?(o=1/o,t[0]=e*o,t[1]=-r*o,t[2]=-u*o,t[3]=a*o,t):null},adjoint:function(t,n){var a=n[0];return t[0]=n[3],t[1]=-n[1],t[2]=-n[2],t[3]=a,t},determinant:function(t){return t[0]*t[3]-t[2]*t[1]},multiply:s,rotate:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=Math.sin(a),s=Math.cos(a);return t[0]=r*s+e*i,t[1]=u*s+o*i,t[2]=r*-i+e*s,t[3]=u*-i+o*s,t},scale:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=a[0],s=a[1];return t[0]=r*i,t[1]=u*i,t[2]=e*s,t[3]=o*s,t},fromRotation:function(t,n){var a=Math.sin(n),r=Math.cos(n);return t[0]=r,t[1]=a,t[2]=-a,t[3]=r,t},fromScaling:function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=n[1],t},str:function(t){return"mat2("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},frob:function(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]+t[3]*t[3])},LDU:function(t,n,a,r){return t[2]=r[2]/r[0],a[0]=r[0],a[1]=r[1],a[3]=r[3]-t[2]*a[1],[t,n,a]},add:function(t,n,a){return t[0]=n[0]+a[0],t[1]=n[1]+a[1],t[2]=n[2]+a[2],t[3]=n[3]+a[3],t},subtract:c,exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]},equals:function(t,a){var r=t[0],u=t[1],e=t[2],o=t[3],i=a[0],s=a[1],c=a[2],h=a[3];return Math.abs(r-i)<=n*Math.max(1,Math.abs(r),Math.abs(i))&&Math.abs(u-s)<=n*Math.max(1,Math.abs(u),Math.abs(s))&&Math.abs(e-c)<=n*Math.max(1,Math.abs(e),Math.abs(c))&&Math.abs(o-h)<=n*Math.max(1,Math.abs(o),Math.abs(h))},multiplyScalar:function(t,n,a){return t[0]=n[0]*a,t[1]=n[1]*a,t[2]=n[2]*a,t[3]=n[3]*a,t},multiplyScalarAndAdd:function(t,n,a,r){return t[0]=n[0]+a[0]*r,t[1]=n[1]+a[1]*r,t[2]=n[2]+a[2]*r,t[3]=n[3]+a[3]*r,t},mul:h,sub:M});function l(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],s=n[5],c=a[0],h=a[1],M=a[2],f=a[3],l=a[4],v=a[5];return t[0]=r*c+e*h,t[1]=u*c+o*h,t[2]=r*M+e*f,t[3]=u*M+o*f,t[4]=r*l+e*v+i,t[5]=u*l+o*v+s,t}function v(t,n,a){return t[0]=n[0]-a[0],t[1]=n[1]-a[1],t[2]=n[2]-a[2],t[3]=n[3]-a[3],t[4]=n[4]-a[4],t[5]=n[5]-a[5],t}var b=l,m=v,d=Object.freeze({__proto__:null,create:function(){var t=new a(6);return a!=Float32Array&&(t[1]=0,t[2]=0,t[4]=0,t[5]=0),t[0]=1,t[3]=1,t},clone:function(t){var n=new a(6);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n},copy:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t},identity:function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},fromValues:function(t,n,r,u,e,o){var i=new a(6);return i[0]=t,i[1]=n,i[2]=r,i[3]=u,i[4]=e,i[5]=o,i},set:function(t,n,a,r,u,e,o){return t[0]=n,t[1]=a,t[2]=r,t[3]=u,t[4]=e,t[5]=o,t},invert:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=n[4],i=n[5],s=a*e-r*u;return s?(s=1/s,t[0]=e*s,t[1]=-r*s,t[2]=-u*s,t[3]=a*s,t[4]=(u*i-e*o)*s,t[5]=(r*o-a*i)*s,t):null},determinant:function(t){return t[0]*t[3]-t[1]*t[2]},multiply:l,rotate:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],s=n[5],c=Math.sin(a),h=Math.cos(a);return t[0]=r*h+e*c,t[1]=u*h+o*c,t[2]=r*-c+e*h,t[3]=u*-c+o*h,t[4]=i,t[5]=s,t},scale:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],s=n[5],c=a[0],h=a[1];return t[0]=r*c,t[1]=u*c,t[2]=e*h,t[3]=o*h,t[4]=i,t[5]=s,t},translate:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],s=n[5],c=a[0],h=a[1];return t[0]=r,t[1]=u,t[2]=e,t[3]=o,t[4]=r*c+e*h+i,t[5]=u*c+o*h+s,t},fromRotation:function(t,n){var a=Math.sin(n),r=Math.cos(n);return t[0]=r,t[1]=a,t[2]=-a,t[3]=r,t[4]=0,t[5]=0,t},fromScaling:function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=n[1],t[4]=0,t[5]=0,t},fromTranslation:function(t,n){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=n[0],t[5]=n[1],t},str:function(t){return"mat2d("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+")"},frob:function(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]+t[3]*t[3]+t[4]*t[4]+t[5]*t[5]+1)},add:function(t,n,a){return t[0]=n[0]+a[0],t[1]=n[1]+a[1],t[2]=n[2]+a[2],t[3]=n[3]+a[3],t[4]=n[4]+a[4],t[5]=n[5]+a[5],t},subtract:v,multiplyScalar:function(t,n,a){return t[0]=n[0]*a,t[1]=n[1]*a,t[2]=n[2]*a,t[3]=n[3]*a,t[4]=n[4]*a,t[5]=n[5]*a,t},multiplyScalarAndAdd:function(t,n,a,r){return t[0]=n[0]+a[0]*r,t[1]=n[1]+a[1]*r,t[2]=n[2]+a[2]*r,t[3]=n[3]+a[3]*r,t[4]=n[4]+a[4]*r,t[5]=n[5]+a[5]*r,t},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]&&t[4]===n[4]&&t[5]===n[5]},equals:function(t,a){var r=t[0],u=t[1],e=t[2],o=t[3],i=t[4],s=t[5],c=a[0],h=a[1],M=a[2],f=a[3],l=a[4],v=a[5];return Math.abs(r-c)<=n*Math.max(1,Math.abs(r),Math.abs(c))&&Math.abs(u-h)<=n*Math.max(1,Math.abs(u),Math.abs(h))&&Math.abs(e-M)<=n*Math.max(1,Math.abs(e),Math.abs(M))&&Math.abs(o-f)<=n*Math.max(1,Math.abs(o),Math.abs(f))&&Math.abs(i-l)<=n*Math.max(1,Math.abs(i),Math.abs(l))&&Math.abs(s-v)<=n*Math.max(1,Math.abs(s),Math.abs(v))},mul:b,sub:m});function x(){var t=new a(9);return a!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[5]=0,t[6]=0,t[7]=0),t[0]=1,t[4]=1,t[8]=1,t}function q(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],s=n[5],c=n[6],h=n[7],M=n[8],f=a[0],l=a[1],v=a[2],b=a[3],m=a[4],d=a[5],x=a[6],q=a[7],p=a[8];return t[0]=f*r+l*o+v*c,t[1]=f*u+l*i+v*h,t[2]=f*e+l*s+v*M,t[3]=b*r+m*o+d*c,t[4]=b*u+m*i+d*h,t[5]=b*e+m*s+d*M,t[6]=x*r+q*o+p*c,t[7]=x*u+q*i+p*h,t[8]=x*e+q*s+p*M,t}function p(t,n,a){return t[0]=n[0]-a[0],t[1]=n[1]-a[1],t[2]=n[2]-a[2],t[3]=n[3]-a[3],t[4]=n[4]-a[4],t[5]=n[5]-a[5],t[6]=n[6]-a[6],t[7]=n[7]-a[7],t[8]=n[8]-a[8],t}var y=q,g=p,_=Object.freeze({__proto__:null,create:x,fromMat4:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[4],t[4]=n[5],t[5]=n[6],t[6]=n[8],t[7]=n[9],t[8]=n[10],t},clone:function(t){var n=new a(9);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n[8]=t[8],n},copy:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t},fromValues:function(t,n,r,u,e,o,i,s,c){var h=new a(9);return h[0]=t,h[1]=n,h[2]=r,h[3]=u,h[4]=e,h[5]=o,h[6]=i,h[7]=s,h[8]=c,h},set:function(t,n,a,r,u,e,o,i,s,c){return t[0]=n,t[1]=a,t[2]=r,t[3]=u,t[4]=e,t[5]=o,t[6]=i,t[7]=s,t[8]=c,t},identity:function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},transpose:function(t,n){if(t===n){var a=n[1],r=n[2],u=n[5];t[1]=n[3],t[2]=n[6],t[3]=a,t[5]=n[7],t[6]=r,t[7]=u}else t[0]=n[0],t[1]=n[3],t[2]=n[6],t[3]=n[1],t[4]=n[4],t[5]=n[7],t[6]=n[2],t[7]=n[5],t[8]=n[8];return t},invert:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=n[4],i=n[5],s=n[6],c=n[7],h=n[8],M=h*o-i*c,f=-h*e+i*s,l=c*e-o*s,v=a*M+r*f+u*l;return v?(v=1/v,t[0]=M*v,t[1]=(-h*r+u*c)*v,t[2]=(i*r-u*o)*v,t[3]=f*v,t[4]=(h*a-u*s)*v,t[5]=(-i*a+u*e)*v,t[6]=l*v,t[7]=(-c*a+r*s)*v,t[8]=(o*a-r*e)*v,t):null},adjoint:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=n[4],i=n[5],s=n[6],c=n[7],h=n[8];return t[0]=o*h-i*c,t[1]=u*c-r*h,t[2]=r*i-u*o,t[3]=i*s-e*h,t[4]=a*h-u*s,t[5]=u*e-a*i,t[6]=e*c-o*s,t[7]=r*s-a*c,t[8]=a*o-r*e,t},determinant:function(t){var n=t[0],a=t[1],r=t[2],u=t[3],e=t[4],o=t[5],i=t[6],s=t[7],c=t[8];return n*(c*e-o*s)+a*(-c*u+o*i)+r*(s*u-e*i)},multiply:q,translate:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],s=n[5],c=n[6],h=n[7],M=n[8],f=a[0],l=a[1];return t[0]=r,t[1]=u,t[2]=e,t[3]=o,t[4]=i,t[5]=s,t[6]=f*r+l*o+c,t[7]=f*u+l*i+h,t[8]=f*e+l*s+M,t},rotate:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],s=n[5],c=n[6],h=n[7],M=n[8],f=Math.sin(a),l=Math.cos(a);return t[0]=l*r+f*o,t[1]=l*u+f*i,t[2]=l*e+f*s,t[3]=l*o-f*r,t[4]=l*i-f*u,t[5]=l*s-f*e,t[6]=c,t[7]=h,t[8]=M,t},scale:function(t,n,a){var r=a[0],u=a[1];return t[0]=r*n[0],t[1]=r*n[1],t[2]=r*n[2],t[3]=u*n[3],t[4]=u*n[4],t[5]=u*n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t},fromTranslation:function(t,n){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=n[0],t[7]=n[1],t[8]=1,t},fromRotation:function(t,n){var a=Math.sin(n),r=Math.cos(n);return t[0]=r,t[1]=a,t[2]=0,t[3]=-a,t[4]=r,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},fromScaling:function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=0,t[4]=n[1],t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},fromMat2d:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=0,t[3]=n[2],t[4]=n[3],t[5]=0,t[6]=n[4],t[7]=n[5],t[8]=1,t},fromQuat:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=a+a,i=r+r,s=u+u,c=a*o,h=r*o,M=r*i,f=u*o,l=u*i,v=u*s,b=e*o,m=e*i,d=e*s;return t[0]=1-M-v,t[3]=h-d,t[6]=f+m,t[1]=h+d,t[4]=1-c-v,t[7]=l-b,t[2]=f-m,t[5]=l+b,t[8]=1-c-M,t},normalFromMat4:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=n[4],i=n[5],s=n[6],c=n[7],h=n[8],M=n[9],f=n[10],l=n[11],v=n[12],b=n[13],m=n[14],d=n[15],x=a*i-r*o,q=a*s-u*o,p=a*c-e*o,y=r*s-u*i,g=r*c-e*i,_=u*c-e*s,A=h*b-M*v,w=h*m-f*v,z=h*d-l*v,R=M*m-f*b,O=M*d-l*b,j=f*d-l*m,E=x*j-q*O+p*R+y*z-g*w+_*A;return E?(E=1/E,t[0]=(i*j-s*O+c*R)*E,t[1]=(s*z-o*j-c*w)*E,t[2]=(o*O-i*z+c*A)*E,t[3]=(u*O-r*j-e*R)*E,t[4]=(a*j-u*z+e*w)*E,t[5]=(r*z-a*O-e*A)*E,t[6]=(b*_-m*g+d*y)*E,t[7]=(m*p-v*_-d*q)*E,t[8]=(v*g-b*p+d*x)*E,t):null},projection:function(t,n,a){return t[0]=2/n,t[1]=0,t[2]=0,t[3]=0,t[4]=-2/a,t[5]=0,t[6]=-1,t[7]=1,t[8]=1,t},str:function(t){return"mat3("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+", "+t[8]+")"},frob:function(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]+t[3]*t[3]+t[4]*t[4]+t[5]*t[5]+t[6]*t[6]+t[7]*t[7]+t[8]*t[8])},add:function(t,n,a){return t[0]=n[0]+a[0],t[1]=n[1]+a[1],t[2]=n[2]+a[2],t[3]=n[3]+a[3],t[4]=n[4]+a[4],t[5]=n[5]+a[5],t[6]=n[6]+a[6],t[7]=n[7]+a[7],t[8]=n[8]+a[8],t},subtract:p,multiplyScalar:function(t,n,a){return t[0]=n[0]*a,t[1]=n[1]*a,t[2]=n[2]*a,t[3]=n[3]*a,t[4]=n[4]*a,t[5]=n[5]*a,t[6]=n[6]*a,t[7]=n[7]*a,t[8]=n[8]*a,t},multiplyScalarAndAdd:function(t,n,a,r){return t[0]=n[0]+a[0]*r,t[1]=n[1]+a[1]*r,t[2]=n[2]+a[2]*r,t[3]=n[3]+a[3]*r,t[4]=n[4]+a[4]*r,t[5]=n[5]+a[5]*r,t[6]=n[6]+a[6]*r,t[7]=n[7]+a[7]*r,t[8]=n[8]+a[8]*r,t},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]&&t[4]===n[4]&&t[5]===n[5]&&t[6]===n[6]&&t[7]===n[7]&&t[8]===n[8]},equals:function(t,a){var r=t[0],u=t[1],e=t[2],o=t[3],i=t[4],s=t[5],c=t[6],h=t[7],M=t[8],f=a[0],l=a[1],v=a[2],b=a[3],m=a[4],d=a[5],x=a[6],q=a[7],p=a[8];return Math.abs(r-f)<=n*Math.max(1,Math.abs(r),Math.abs(f))&&Math.abs(u-l)<=n*Math.max(1,Math.abs(u),Math.abs(l))&&Math.abs(e-v)<=n*Math.max(1,Math.abs(e),Math.abs(v))&&Math.abs(o-b)<=n*Math.max(1,Math.abs(o),Math.abs(b))&&Math.abs(i-m)<=n*Math.max(1,Math.abs(i),Math.abs(m))&&Math.abs(s-d)<=n*Math.max(1,Math.abs(s),Math.abs(d))&&Math.abs(c-x)<=n*Math.max(1,Math.abs(c),Math.abs(x))&&Math.abs(h-q)<=n*Math.max(1,Math.abs(h),Math.abs(q))&&Math.abs(M-p)<=n*Math.max(1,Math.abs(M),Math.abs(p))},mul:y,sub:g});function A(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}function w(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],s=n[5],c=n[6],h=n[7],M=n[8],f=n[9],l=n[10],v=n[11],b=n[12],m=n[13],d=n[14],x=n[15],q=a[0],p=a[1],y=a[2],g=a[3];return t[0]=q*r+p*i+y*M+g*b,t[1]=q*u+p*s+y*f+g*m,t[2]=q*e+p*c+y*l+g*d,t[3]=q*o+p*h+y*v+g*x,q=a[4],p=a[5],y=a[6],g=a[7],t[4]=q*r+p*i+y*M+g*b,t[5]=q*u+p*s+y*f+g*m,t[6]=q*e+p*c+y*l+g*d,t[7]=q*o+p*h+y*v+g*x,q=a[8],p=a[9],y=a[10],g=a[11],t[8]=q*r+p*i+y*M+g*b,t[9]=q*u+p*s+y*f+g*m,t[10]=q*e+p*c+y*l+g*d,t[11]=q*o+p*h+y*v+g*x,q=a[12],p=a[13],y=a[14],g=a[15],t[12]=q*r+p*i+y*M+g*b,t[13]=q*u+p*s+y*f+g*m,t[14]=q*e+p*c+y*l+g*d,t[15]=q*o+p*h+y*v+g*x,t}function z(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=r+r,s=u+u,c=e+e,h=r*i,M=r*s,f=r*c,l=u*s,v=u*c,b=e*c,m=o*i,d=o*s,x=o*c;return t[0]=1-(l+b),t[1]=M+x,t[2]=f-d,t[3]=0,t[4]=M-x,t[5]=1-(h+b),t[6]=v+m,t[7]=0,t[8]=f+d,t[9]=v-m,t[10]=1-(h+l),t[11]=0,t[12]=a[0],t[13]=a[1],t[14]=a[2],t[15]=1,t}function R(t,n){return t[0]=n[12],t[1]=n[13],t[2]=n[14],t}function O(t,n){var a=n[0],r=n[1],u=n[2],e=n[4],o=n[5],i=n[6],s=n[8],c=n[9],h=n[10];return t[0]=Math.sqrt(a*a+r*r+u*u),t[1]=Math.sqrt(e*e+o*o+i*i),t[2]=Math.sqrt(s*s+c*c+h*h),t}function j(t,n){var r=new a(3);O(r,n);var u=1/r[0],e=1/r[1],o=1/r[2],i=n[0]*u,s=n[1]*e,c=n[2]*o,h=n[4]*u,M=n[5]*e,f=n[6]*o,l=n[8]*u,v=n[9]*e,b=n[10]*o,m=i+M+b,d=0;return m>0?(d=2*Math.sqrt(m+1),t[3]=.25*d,t[0]=(f-v)/d,t[1]=(l-c)/d,t[2]=(s-h)/d):i>M&&i>b?(d=2*Math.sqrt(1+i-M-b),t[3]=(f-v)/d,t[0]=.25*d,t[1]=(s+h)/d,t[2]=(l+c)/d):M>b?(d=2*Math.sqrt(1+M-i-b),t[3]=(l-c)/d,t[0]=(s+h)/d,t[1]=.25*d,t[2]=(f+v)/d):(d=2*Math.sqrt(1+b-i-M),t[3]=(s-h)/d,t[0]=(l+c)/d,t[1]=(f+v)/d,t[2]=.25*d),t}function E(t,n,a,r,u){var e=1/Math.tan(n/2);if(t[0]=e/a,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=e,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=-1,t[12]=0,t[13]=0,t[15]=0,null!=u&&u!==1/0){var o=1/(r-u);t[10]=(u+r)*o,t[14]=2*u*r*o}else t[10]=-1,t[14]=-2*r;return t}var P=E;function T(t,n,a,r,u,e,o){var i=1/(n-a),s=1/(r-u),c=1/(e-o);return t[0]=-2*i,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*s,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*c,t[11]=0,t[12]=(n+a)*i,t[13]=(u+r)*s,t[14]=(o+e)*c,t[15]=1,t}var D=T;function S(t,n,a){return t[0]=n[0]-a[0],t[1]=n[1]-a[1],t[2]=n[2]-a[2],t[3]=n[3]-a[3],t[4]=n[4]-a[4],t[5]=n[5]-a[5],t[6]=n[6]-a[6],t[7]=n[7]-a[7],t[8]=n[8]-a[8],t[9]=n[9]-a[9],t[10]=n[10]-a[10],t[11]=n[11]-a[11],t[12]=n[12]-a[12],t[13]=n[13]-a[13],t[14]=n[14]-a[14],t[15]=n[15]-a[15],t}var I=w,F=S,L=Object.freeze({__proto__:null,create:function(){var t=new a(16);return a!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0),t[0]=1,t[5]=1,t[10]=1,t[15]=1,t},clone:function(t){var n=new a(16);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n[8]=t[8],n[9]=t[9],n[10]=t[10],n[11]=t[11],n[12]=t[12],n[13]=t[13],n[14]=t[14],n[15]=t[15],n},copy:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t[9]=n[9],t[10]=n[10],t[11]=n[11],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15],t},fromValues:function(t,n,r,u,e,o,i,s,c,h,M,f,l,v,b,m){var d=new a(16);return d[0]=t,d[1]=n,d[2]=r,d[3]=u,d[4]=e,d[5]=o,d[6]=i,d[7]=s,d[8]=c,d[9]=h,d[10]=M,d[11]=f,d[12]=l,d[13]=v,d[14]=b,d[15]=m,d},set:function(t,n,a,r,u,e,o,i,s,c,h,M,f,l,v,b,m){return t[0]=n,t[1]=a,t[2]=r,t[3]=u,t[4]=e,t[5]=o,t[6]=i,t[7]=s,t[8]=c,t[9]=h,t[10]=M,t[11]=f,t[12]=l,t[13]=v,t[14]=b,t[15]=m,t},identity:A,transpose:function(t,n){if(t===n){var a=n[1],r=n[2],u=n[3],e=n[6],o=n[7],i=n[11];t[1]=n[4],t[2]=n[8],t[3]=n[12],t[4]=a,t[6]=n[9],t[7]=n[13],t[8]=r,t[9]=e,t[11]=n[14],t[12]=u,t[13]=o,t[14]=i}else t[0]=n[0],t[1]=n[4],t[2]=n[8],t[3]=n[12],t[4]=n[1],t[5]=n[5],t[6]=n[9],t[7]=n[13],t[8]=n[2],t[9]=n[6],t[10]=n[10],t[11]=n[14],t[12]=n[3],t[13]=n[7],t[14]=n[11],t[15]=n[15];return t},invert:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=n[4],i=n[5],s=n[6],c=n[7],h=n[8],M=n[9],f=n[10],l=n[11],v=n[12],b=n[13],m=n[14],d=n[15],x=a*i-r*o,q=a*s-u*o,p=a*c-e*o,y=r*s-u*i,g=r*c-e*i,_=u*c-e*s,A=h*b-M*v,w=h*m-f*v,z=h*d-l*v,R=M*m-f*b,O=M*d-l*b,j=f*d-l*m,E=x*j-q*O+p*R+y*z-g*w+_*A;return E?(E=1/E,t[0]=(i*j-s*O+c*R)*E,t[1]=(u*O-r*j-e*R)*E,t[2]=(b*_-m*g+d*y)*E,t[3]=(f*g-M*_-l*y)*E,t[4]=(s*z-o*j-c*w)*E,t[5]=(a*j-u*z+e*w)*E,t[6]=(m*p-v*_-d*q)*E,t[7]=(h*_-f*p+l*q)*E,t[8]=(o*O-i*z+c*A)*E,t[9]=(r*z-a*O-e*A)*E,t[10]=(v*g-b*p+d*x)*E,t[11]=(M*p-h*g-l*x)*E,t[12]=(i*w-o*R-s*A)*E,t[13]=(a*R-r*w+u*A)*E,t[14]=(b*q-v*y-m*x)*E,t[15]=(h*y-M*q+f*x)*E,t):null},adjoint:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=n[4],i=n[5],s=n[6],c=n[7],h=n[8],M=n[9],f=n[10],l=n[11],v=n[12],b=n[13],m=n[14],d=n[15],x=a*i-r*o,q=a*s-u*o,p=a*c-e*o,y=r*s-u*i,g=r*c-e*i,_=u*c-e*s,A=h*b-M*v,w=h*m-f*v,z=h*d-l*v,R=M*m-f*b,O=M*d-l*b,j=f*d-l*m;return t[0]=i*j-s*O+c*R,t[1]=u*O-r*j-e*R,t[2]=b*_-m*g+d*y,t[3]=f*g-M*_-l*y,t[4]=s*z-o*j-c*w,t[5]=a*j-u*z+e*w,t[6]=m*p-v*_-d*q,t[7]=h*_-f*p+l*q,t[8]=o*O-i*z+c*A,t[9]=r*z-a*O-e*A,t[10]=v*g-b*p+d*x,t[11]=M*p-h*g-l*x,t[12]=i*w-o*R-s*A,t[13]=a*R-r*w+u*A,t[14]=b*q-v*y-m*x,t[15]=h*y-M*q+f*x,t},determinant:function(t){var n=t[0],a=t[1],r=t[2],u=t[3],e=t[4],o=t[5],i=t[6],s=t[7],c=t[8],h=t[9],M=t[10],f=t[11],l=t[12],v=t[13],b=t[14],m=n*o-a*e,d=n*i-r*e,x=a*i-r*o,q=c*v-h*l,p=c*b-M*l,y=h*b-M*v;return s*(n*y-a*p+r*q)-u*(e*y-o*p+i*q)+t[15]*(c*x-h*d+M*m)-f*(l*x-v*d+b*m)},multiply:w,translate:function(t,n,a){var r,u,e,o,i,s,c,h,M,f,l,v,b=a[0],m=a[1],d=a[2];return n===t?(t[12]=n[0]*b+n[4]*m+n[8]*d+n[12],t[13]=n[1]*b+n[5]*m+n[9]*d+n[13],t[14]=n[2]*b+n[6]*m+n[10]*d+n[14],t[15]=n[3]*b+n[7]*m+n[11]*d+n[15]):(r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],s=n[5],c=n[6],h=n[7],M=n[8],f=n[9],l=n[10],v=n[11],t[0]=r,t[1]=u,t[2]=e,t[3]=o,t[4]=i,t[5]=s,t[6]=c,t[7]=h,t[8]=M,t[9]=f,t[10]=l,t[11]=v,t[12]=r*b+i*m+M*d+n[12],t[13]=u*b+s*m+f*d+n[13],t[14]=e*b+c*m+l*d+n[14],t[15]=o*b+h*m+v*d+n[15]),t},scale:function(t,n,a){var r=a[0],u=a[1],e=a[2];return t[0]=n[0]*r,t[1]=n[1]*r,t[2]=n[2]*r,t[3]=n[3]*r,t[4]=n[4]*u,t[5]=n[5]*u,t[6]=n[6]*u,t[7]=n[7]*u,t[8]=n[8]*e,t[9]=n[9]*e,t[10]=n[10]*e,t[11]=n[11]*e,t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15],t},rotate:function(t,a,r,u){var e,o,i,s,c,h,M,f,l,v,b,m,d,x,q,p,y,g,_,A,w,z,R,O,j=u[0],E=u[1],P=u[2],T=Math.sqrt(j*j+E*E+P*P);return T0?(r[0]=2*(s*i+M*u+c*o-h*e)/f,r[1]=2*(c*i+M*e+h*u-s*o)/f,r[2]=2*(h*i+M*o+s*e-c*u)/f):(r[0]=2*(s*i+M*u+c*o-h*e),r[1]=2*(c*i+M*e+h*u-s*o),r[2]=2*(h*i+M*o+s*e-c*u)),z(t,n,r),t},getTranslation:R,getScaling:O,getRotation:j,decompose:function(t,n,a,r){n[0]=r[12],n[1]=r[13],n[2]=r[14];var u=r[0],e=r[1],o=r[2],i=r[4],s=r[5],c=r[6],h=r[8],M=r[9],f=r[10];a[0]=Math.sqrt(u*u+e*e+o*o),a[1]=Math.sqrt(i*i+s*s+c*c),a[2]=Math.sqrt(h*h+M*M+f*f);var l=1/a[0],v=1/a[1],b=1/a[2],m=u*l,d=e*v,x=o*b,q=i*l,p=s*v,y=c*b,g=h*l,_=M*v,A=f*b,w=m+p+A,z=0;return w>0?(z=2*Math.sqrt(w+1),t[3]=.25*z,t[0]=(y-_)/z,t[1]=(g-x)/z,t[2]=(d-q)/z):m>p&&m>A?(z=2*Math.sqrt(1+m-p-A),t[3]=(y-_)/z,t[0]=.25*z,t[1]=(d+q)/z,t[2]=(g+x)/z):p>A?(z=2*Math.sqrt(1+p-m-A),t[3]=(g-x)/z,t[0]=(d+q)/z,t[1]=.25*z,t[2]=(y+_)/z):(z=2*Math.sqrt(1+A-m-p),t[3]=(d-q)/z,t[0]=(g+x)/z,t[1]=(y+_)/z,t[2]=.25*z),t},fromRotationTranslationScale:function(t,n,a,r){var u=n[0],e=n[1],o=n[2],i=n[3],s=u+u,c=e+e,h=o+o,M=u*s,f=u*c,l=u*h,v=e*c,b=e*h,m=o*h,d=i*s,x=i*c,q=i*h,p=r[0],y=r[1],g=r[2];return t[0]=(1-(v+m))*p,t[1]=(f+q)*p,t[2]=(l-x)*p,t[3]=0,t[4]=(f-q)*y,t[5]=(1-(M+m))*y,t[6]=(b+d)*y,t[7]=0,t[8]=(l+x)*g,t[9]=(b-d)*g,t[10]=(1-(M+v))*g,t[11]=0,t[12]=a[0],t[13]=a[1],t[14]=a[2],t[15]=1,t},fromRotationTranslationScaleOrigin:function(t,n,a,r,u){var e=n[0],o=n[1],i=n[2],s=n[3],c=e+e,h=o+o,M=i+i,f=e*c,l=e*h,v=e*M,b=o*h,m=o*M,d=i*M,x=s*c,q=s*h,p=s*M,y=r[0],g=r[1],_=r[2],A=u[0],w=u[1],z=u[2],R=(1-(b+d))*y,O=(l+p)*y,j=(v-q)*y,E=(l-p)*g,P=(1-(f+d))*g,T=(m+x)*g,D=(v+q)*_,S=(m-x)*_,I=(1-(f+b))*_;return t[0]=R,t[1]=O,t[2]=j,t[3]=0,t[4]=E,t[5]=P,t[6]=T,t[7]=0,t[8]=D,t[9]=S,t[10]=I,t[11]=0,t[12]=a[0]+A-(R*A+E*w+D*z),t[13]=a[1]+w-(O*A+P*w+S*z),t[14]=a[2]+z-(j*A+T*w+I*z),t[15]=1,t},fromQuat:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=a+a,i=r+r,s=u+u,c=a*o,h=r*o,M=r*i,f=u*o,l=u*i,v=u*s,b=e*o,m=e*i,d=e*s;return t[0]=1-M-v,t[1]=h+d,t[2]=f-m,t[3]=0,t[4]=h-d,t[5]=1-c-v,t[6]=l+b,t[7]=0,t[8]=f+m,t[9]=l-b,t[10]=1-c-M,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},frustum:function(t,n,a,r,u,e,o){var i=1/(a-n),s=1/(u-r),c=1/(e-o);return t[0]=2*e*i,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=2*e*s,t[6]=0,t[7]=0,t[8]=(a+n)*i,t[9]=(u+r)*s,t[10]=(o+e)*c,t[11]=-1,t[12]=0,t[13]=0,t[14]=o*e*2*c,t[15]=0,t},perspectiveNO:E,perspective:P,perspectiveZO:function(t,n,a,r,u){var e=1/Math.tan(n/2);if(t[0]=e/a,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=e,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=-1,t[12]=0,t[13]=0,t[15]=0,null!=u&&u!==1/0){var o=1/(r-u);t[10]=u*o,t[14]=u*r*o}else t[10]=-1,t[14]=-r;return t},perspectiveFromFieldOfView:function(t,n,a,r){var u=Math.tan(n.upDegrees*Math.PI/180),e=Math.tan(n.downDegrees*Math.PI/180),o=Math.tan(n.leftDegrees*Math.PI/180),i=Math.tan(n.rightDegrees*Math.PI/180),s=2/(o+i),c=2/(u+e);return t[0]=s,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=c,t[6]=0,t[7]=0,t[8]=-(o-i)*s*.5,t[9]=(u-e)*c*.5,t[10]=r/(a-r),t[11]=-1,t[12]=0,t[13]=0,t[14]=r*a/(a-r),t[15]=0,t},orthoNO:T,ortho:D,orthoZO:function(t,n,a,r,u,e,o){var i=1/(n-a),s=1/(r-u),c=1/(e-o);return t[0]=-2*i,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*s,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=c,t[11]=0,t[12]=(n+a)*i,t[13]=(u+r)*s,t[14]=e*c,t[15]=1,t},lookAt:function(t,a,r,u){var e,o,i,s,c,h,M,f,l,v,b=a[0],m=a[1],d=a[2],x=u[0],q=u[1],p=u[2],y=r[0],g=r[1],_=r[2];return Math.abs(b-y)0&&(h*=l=1/Math.sqrt(l),M*=l,f*=l);var v=s*f-c*M,b=c*h-i*f,m=i*M-s*h;return(l=v*v+b*b+m*m)>0&&(v*=l=1/Math.sqrt(l),b*=l,m*=l),t[0]=v,t[1]=b,t[2]=m,t[3]=0,t[4]=M*m-f*b,t[5]=f*v-h*m,t[6]=h*b-M*v,t[7]=0,t[8]=h,t[9]=M,t[10]=f,t[11]=0,t[12]=u,t[13]=e,t[14]=o,t[15]=1,t},str:function(t){return"mat4("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+", "+t[8]+", "+t[9]+", "+t[10]+", "+t[11]+", "+t[12]+", "+t[13]+", "+t[14]+", "+t[15]+")"},frob:function(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]+t[3]*t[3]+t[4]*t[4]+t[5]*t[5]+t[6]*t[6]+t[7]*t[7]+t[8]*t[8]+t[9]*t[9]+t[10]*t[10]+t[11]*t[11]+t[12]*t[12]+t[13]*t[13]+t[14]*t[14]+t[15]*t[15])},add:function(t,n,a){return t[0]=n[0]+a[0],t[1]=n[1]+a[1],t[2]=n[2]+a[2],t[3]=n[3]+a[3],t[4]=n[4]+a[4],t[5]=n[5]+a[5],t[6]=n[6]+a[6],t[7]=n[7]+a[7],t[8]=n[8]+a[8],t[9]=n[9]+a[9],t[10]=n[10]+a[10],t[11]=n[11]+a[11],t[12]=n[12]+a[12],t[13]=n[13]+a[13],t[14]=n[14]+a[14],t[15]=n[15]+a[15],t},subtract:S,multiplyScalar:function(t,n,a){return t[0]=n[0]*a,t[1]=n[1]*a,t[2]=n[2]*a,t[3]=n[3]*a,t[4]=n[4]*a,t[5]=n[5]*a,t[6]=n[6]*a,t[7]=n[7]*a,t[8]=n[8]*a,t[9]=n[9]*a,t[10]=n[10]*a,t[11]=n[11]*a,t[12]=n[12]*a,t[13]=n[13]*a,t[14]=n[14]*a,t[15]=n[15]*a,t},multiplyScalarAndAdd:function(t,n,a,r){return t[0]=n[0]+a[0]*r,t[1]=n[1]+a[1]*r,t[2]=n[2]+a[2]*r,t[3]=n[3]+a[3]*r,t[4]=n[4]+a[4]*r,t[5]=n[5]+a[5]*r,t[6]=n[6]+a[6]*r,t[7]=n[7]+a[7]*r,t[8]=n[8]+a[8]*r,t[9]=n[9]+a[9]*r,t[10]=n[10]+a[10]*r,t[11]=n[11]+a[11]*r,t[12]=n[12]+a[12]*r,t[13]=n[13]+a[13]*r,t[14]=n[14]+a[14]*r,t[15]=n[15]+a[15]*r,t},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]&&t[4]===n[4]&&t[5]===n[5]&&t[6]===n[6]&&t[7]===n[7]&&t[8]===n[8]&&t[9]===n[9]&&t[10]===n[10]&&t[11]===n[11]&&t[12]===n[12]&&t[13]===n[13]&&t[14]===n[14]&&t[15]===n[15]},equals:function(t,a){var r=t[0],u=t[1],e=t[2],o=t[3],i=t[4],s=t[5],c=t[6],h=t[7],M=t[8],f=t[9],l=t[10],v=t[11],b=t[12],m=t[13],d=t[14],x=t[15],q=a[0],p=a[1],y=a[2],g=a[3],_=a[4],A=a[5],w=a[6],z=a[7],R=a[8],O=a[9],j=a[10],E=a[11],P=a[12],T=a[13],D=a[14],S=a[15];return Math.abs(r-q)<=n*Math.max(1,Math.abs(r),Math.abs(q))&&Math.abs(u-p)<=n*Math.max(1,Math.abs(u),Math.abs(p))&&Math.abs(e-y)<=n*Math.max(1,Math.abs(e),Math.abs(y))&&Math.abs(o-g)<=n*Math.max(1,Math.abs(o),Math.abs(g))&&Math.abs(i-_)<=n*Math.max(1,Math.abs(i),Math.abs(_))&&Math.abs(s-A)<=n*Math.max(1,Math.abs(s),Math.abs(A))&&Math.abs(c-w)<=n*Math.max(1,Math.abs(c),Math.abs(w))&&Math.abs(h-z)<=n*Math.max(1,Math.abs(h),Math.abs(z))&&Math.abs(M-R)<=n*Math.max(1,Math.abs(M),Math.abs(R))&&Math.abs(f-O)<=n*Math.max(1,Math.abs(f),Math.abs(O))&&Math.abs(l-j)<=n*Math.max(1,Math.abs(l),Math.abs(j))&&Math.abs(v-E)<=n*Math.max(1,Math.abs(v),Math.abs(E))&&Math.abs(b-P)<=n*Math.max(1,Math.abs(b),Math.abs(P))&&Math.abs(m-T)<=n*Math.max(1,Math.abs(m),Math.abs(T))&&Math.abs(d-D)<=n*Math.max(1,Math.abs(d),Math.abs(D))&&Math.abs(x-S)<=n*Math.max(1,Math.abs(x),Math.abs(S))},mul:I,sub:F});function V(){var t=new a(3);return a!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0),t}function k(t){var n=t[0],a=t[1],r=t[2];return Math.sqrt(n*n+a*a+r*r)}function Q(t,n,r){var u=new a(3);return u[0]=t,u[1]=n,u[2]=r,u}function Y(t,n,a){return t[0]=n[0]-a[0],t[1]=n[1]-a[1],t[2]=n[2]-a[2],t}function Z(t,n,a){return t[0]=n[0]*a[0],t[1]=n[1]*a[1],t[2]=n[2]*a[2],t}function N(t,n,a){return t[0]=n[0]/a[0],t[1]=n[1]/a[1],t[2]=n[2]/a[2],t}function X(t,n){var a=n[0]-t[0],r=n[1]-t[1],u=n[2]-t[2];return Math.sqrt(a*a+r*r+u*u)}function B(t,n){var a=n[0]-t[0],r=n[1]-t[1],u=n[2]-t[2];return a*a+r*r+u*u}function U(t){var n=t[0],a=t[1],r=t[2];return n*n+a*a+r*r}function G(t,n){var a=n[0],r=n[1],u=n[2],e=a*a+r*r+u*u;return e>0&&(e=1/Math.sqrt(e)),t[0]=n[0]*e,t[1]=n[1]*e,t[2]=n[2]*e,t}function W(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]}function C(t,n,a){var r=n[0],u=n[1],e=n[2],o=a[0],i=a[1],s=a[2];return t[0]=u*s-e*i,t[1]=e*o-r*s,t[2]=r*i-u*o,t}var H,J=Y,K=Z,$=N,tt=X,nt=B,at=k,rt=U,ut=(H=V(),function(t,n,a,r,u,e){var o,i;for(n||(n=3),a||(a=0),i=r?Math.min(r*n+a,t.length):t.length,o=a;o0&&(o=1/Math.sqrt(o)),t[0]=a*o,t[1]=r*o,t[2]=u*o,t[3]=e*o,t}function yt(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]+t[3]*n[3]}function gt(t,n,a,r){var u=n[0],e=n[1],o=n[2],i=n[3];return t[0]=u+r*(a[0]-u),t[1]=e+r*(a[1]-e),t[2]=o+r*(a[2]-o),t[3]=i+r*(a[3]-i),t}function _t(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]}var At=ft,wt=lt,zt=vt,Rt=mt,Ot=dt,jt=xt,Et=qt,Pt=function(){var t=ot();return function(n,a,r,u,e,o){var i,s;for(a||(a=4),r||(r=0),s=u?Math.min(u*a+r,n.length):n.length,i=r;i0?i*Math.sin(o)/o:0;return t[0]=a*s,t[1]=r*s,t[2]=u*s,t[3]=i*Math.cos(o),t}function Qt(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=Math.sqrt(a*a+r*r+u*u),i=o>0?Math.atan2(o,e)/o:0;return t[0]=a*i,t[1]=r*i,t[2]=u*i,t[3]=.5*Math.log(a*a+r*r+u*u+e*e),t}function Yt(t,a,r,u){var e,o,i,s,c,h=a[0],M=a[1],f=a[2],l=a[3],v=r[0],b=r[1],m=r[2],d=r[3];return(o=h*v+M*b+f*m+l*d)<0&&(o=-o,v=-v,b=-b,m=-m,d=-d),1-o>n?(e=Math.acos(o),i=Math.sin(e),s=Math.sin((1-u)*e)/i,c=Math.sin(u*e)/i):(s=1-u,c=u),t[0]=s*h+c*v,t[1]=s*M+c*b,t[2]=s*f+c*m,t[3]=s*l+c*d,t}function Zt(t,n){var a,r=n[0]+n[4]+n[8];if(r>0)a=Math.sqrt(r+1),t[3]=.5*a,a=.5/a,t[0]=(n[5]-n[7])*a,t[1]=(n[6]-n[2])*a,t[2]=(n[1]-n[3])*a;else{var u=0;n[4]>n[0]&&(u=1),n[8]>n[3*u+u]&&(u=2);var e=(u+1)%3,o=(u+2)%3;a=Math.sqrt(n[3*u+u]-n[3*e+e]-n[3*o+o]+1),t[u]=.5*a,a=.5/a,t[3]=(n[3*e+o]-n[3*o+e])*a,t[e]=(n[3*e+u]+n[3*u+e])*a,t[o]=(n[3*o+u]+n[3*u+o])*a}return t}var Nt=it,Xt=st,Bt=ct,Ut=ht,Gt=Mt,Wt=It,Ct=bt,Ht=yt,Jt=gt,Kt=xt,$t=Kt,tn=qt,nn=tn,an=pt,rn=_t;var un,en,on,sn,cn,hn,Mn=(un=V(),en=Q(1,0,0),on=Q(0,1,0),function(t,n,a){var r=W(n,a);return r<-.999999?(C(un,en,n),at(un)<1e-6&&C(un,on,n),G(un,un),St(t,un,Math.PI),t):r>.999999?(t[0]=0,t[1]=0,t[2]=0,t[3]=1,t):(C(un,n,a),t[0]=un[0],t[1]=un[1],t[2]=un[2],t[3]=1+r,an(t,t))}),fn=(sn=Dt(),cn=Dt(),function(t,n,a,r,u,e){return Yt(sn,n,u,e),Yt(cn,a,r,e),Yt(t,sn,cn,2*e*(1-e)),t}),ln=(hn=x(),function(t,n,a,r){return hn[0]=a[0],hn[3]=a[1],hn[6]=a[2],hn[1]=r[0],hn[4]=r[1],hn[7]=r[2],hn[2]=-n[0],hn[5]=-n[1],hn[8]=-n[2],an(t,Zt(t,hn))}),vn=Object.freeze({__proto__:null,create:Dt,identity:function(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t},setAxisAngle:St,getAxisAngle:function(t,a){var r=2*Math.acos(a[3]),u=Math.sin(r/2);return u>n?(t[0]=a[0]/u,t[1]=a[1]/u,t[2]=a[2]/u):(t[0]=1,t[1]=0,t[2]=0),r},getAngle:function(t,n){var a=Ht(t,n);return Math.acos(2*a*a-1)},multiply:It,rotateX:Ft,rotateY:Lt,rotateZ:Vt,calculateW:function(t,n){var a=n[0],r=n[1],u=n[2];return t[0]=a,t[1]=r,t[2]=u,t[3]=Math.sqrt(Math.abs(1-a*a-r*r-u*u)),t},exp:kt,ln:Qt,pow:function(t,n,a){return Qt(t,n),Ct(t,t,a),kt(t,t),t},slerp:Yt,random:function(t){var n=r(),a=r(),u=r(),e=Math.sqrt(1-n),o=Math.sqrt(n);return t[0]=e*Math.sin(2*Math.PI*a),t[1]=e*Math.cos(2*Math.PI*a),t[2]=o*Math.sin(2*Math.PI*u),t[3]=o*Math.cos(2*Math.PI*u),t},invert:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=a*a+r*r+u*u+e*e,i=o?1/o:0;return t[0]=-a*i,t[1]=-r*i,t[2]=-u*i,t[3]=e*i,t},conjugate:function(t,n){return t[0]=-n[0],t[1]=-n[1],t[2]=-n[2],t[3]=n[3],t},fromMat3:Zt,fromEuler:function(t,n,a,r){var u=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"zyx",e=Math.PI/360;n*=e,r*=e,a*=e;var o=Math.sin(n),i=Math.cos(n),s=Math.sin(a),c=Math.cos(a),h=Math.sin(r),M=Math.cos(r);switch(u){case"xyz":t[0]=o*c*M+i*s*h,t[1]=i*s*M-o*c*h,t[2]=i*c*h+o*s*M,t[3]=i*c*M-o*s*h;break;case"xzy":t[0]=o*c*M-i*s*h,t[1]=i*s*M-o*c*h,t[2]=i*c*h+o*s*M,t[3]=i*c*M+o*s*h;break;case"yxz":t[0]=o*c*M+i*s*h,t[1]=i*s*M-o*c*h,t[2]=i*c*h-o*s*M,t[3]=i*c*M+o*s*h;break;case"yzx":t[0]=o*c*M+i*s*h,t[1]=i*s*M+o*c*h,t[2]=i*c*h-o*s*M,t[3]=i*c*M-o*s*h;break;case"zxy":t[0]=o*c*M-i*s*h,t[1]=i*s*M+o*c*h,t[2]=i*c*h+o*s*M,t[3]=i*c*M-o*s*h;break;case"zyx":t[0]=o*c*M-i*s*h,t[1]=i*s*M+o*c*h,t[2]=i*c*h-o*s*M,t[3]=i*c*M+o*s*h;break;default:throw new Error("Unknown angle order "+u)}return t},str:function(t){return"quat("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},clone:Nt,fromValues:Xt,copy:Bt,set:Ut,add:Gt,mul:Wt,scale:Ct,dot:Ht,lerp:Jt,length:Kt,len:$t,squaredLength:tn,sqrLen:nn,normalize:an,exactEquals:rn,equals:function(t,n){return Math.abs(yt(t,n))>=.999999},rotationTo:Mn,sqlerp:fn,setAxes:ln});function bn(t,n,a){var r=.5*a[0],u=.5*a[1],e=.5*a[2],o=n[0],i=n[1],s=n[2],c=n[3];return t[0]=o,t[1]=i,t[2]=s,t[3]=c,t[4]=r*c+u*s-e*i,t[5]=u*c+e*o-r*s,t[6]=e*c+r*i-u*o,t[7]=-r*o-u*i-e*s,t}function mn(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t}var dn=Bt;var xn=Bt;function qn(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=a[4],s=a[5],c=a[6],h=a[7],M=n[4],f=n[5],l=n[6],v=n[7],b=a[0],m=a[1],d=a[2],x=a[3];return t[0]=r*x+o*b+u*d-e*m,t[1]=u*x+o*m+e*b-r*d,t[2]=e*x+o*d+r*m-u*b,t[3]=o*x-r*b-u*m-e*d,t[4]=r*h+o*i+u*c-e*s+M*x+v*b+f*d-l*m,t[5]=u*h+o*s+e*i-r*c+f*x+v*m+l*b-M*d,t[6]=e*h+o*c+r*s-u*i+l*x+v*d+M*m-f*b,t[7]=o*h-r*i-u*s-e*c+v*x-M*b-f*m-l*d,t}var pn=qn;var yn=Ht;var gn=Kt,_n=gn,An=tn,wn=An;var zn=Object.freeze({__proto__:null,create:function(){var t=new a(8);return a!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0,t[4]=0,t[5]=0,t[6]=0,t[7]=0),t[3]=1,t},clone:function(t){var n=new a(8);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n},fromValues:function(t,n,r,u,e,o,i,s){var c=new a(8);return c[0]=t,c[1]=n,c[2]=r,c[3]=u,c[4]=e,c[5]=o,c[6]=i,c[7]=s,c},fromRotationTranslationValues:function(t,n,r,u,e,o,i){var s=new a(8);s[0]=t,s[1]=n,s[2]=r,s[3]=u;var c=.5*e,h=.5*o,M=.5*i;return s[4]=c*u+h*r-M*n,s[5]=h*u+M*t-c*r,s[6]=M*u+c*n-h*t,s[7]=-c*t-h*n-M*r,s},fromRotationTranslation:bn,fromTranslation:function(t,n){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t[4]=.5*n[0],t[5]=.5*n[1],t[6]=.5*n[2],t[7]=0,t},fromRotation:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=0,t[5]=0,t[6]=0,t[7]=0,t},fromMat4:function(t,n){var r=Dt();j(r,n);var u=new a(3);return R(u,n),bn(t,r,u),t},copy:mn,identity:function(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t[6]=0,t[7]=0,t},set:function(t,n,a,r,u,e,o,i,s){return t[0]=n,t[1]=a,t[2]=r,t[3]=u,t[4]=e,t[5]=o,t[6]=i,t[7]=s,t},getReal:dn,getDual:function(t,n){return t[0]=n[4],t[1]=n[5],t[2]=n[6],t[3]=n[7],t},setReal:xn,setDual:function(t,n){return t[4]=n[0],t[5]=n[1],t[6]=n[2],t[7]=n[3],t},getTranslation:function(t,n){var a=n[4],r=n[5],u=n[6],e=n[7],o=-n[0],i=-n[1],s=-n[2],c=n[3];return t[0]=2*(a*c+e*o+r*s-u*i),t[1]=2*(r*c+e*i+u*o-a*s),t[2]=2*(u*c+e*s+a*i-r*o),t},translate:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=.5*a[0],s=.5*a[1],c=.5*a[2],h=n[4],M=n[5],f=n[6],l=n[7];return t[0]=r,t[1]=u,t[2]=e,t[3]=o,t[4]=o*i+u*c-e*s+h,t[5]=o*s+e*i-r*c+M,t[6]=o*c+r*s-u*i+f,t[7]=-r*i-u*s-e*c+l,t},rotateX:function(t,n,a){var r=-n[0],u=-n[1],e=-n[2],o=n[3],i=n[4],s=n[5],c=n[6],h=n[7],M=i*o+h*r+s*e-c*u,f=s*o+h*u+c*r-i*e,l=c*o+h*e+i*u-s*r,v=h*o-i*r-s*u-c*e;return Ft(t,n,a),r=t[0],u=t[1],e=t[2],o=t[3],t[4]=M*o+v*r+f*e-l*u,t[5]=f*o+v*u+l*r-M*e,t[6]=l*o+v*e+M*u-f*r,t[7]=v*o-M*r-f*u-l*e,t},rotateY:function(t,n,a){var r=-n[0],u=-n[1],e=-n[2],o=n[3],i=n[4],s=n[5],c=n[6],h=n[7],M=i*o+h*r+s*e-c*u,f=s*o+h*u+c*r-i*e,l=c*o+h*e+i*u-s*r,v=h*o-i*r-s*u-c*e;return Lt(t,n,a),r=t[0],u=t[1],e=t[2],o=t[3],t[4]=M*o+v*r+f*e-l*u,t[5]=f*o+v*u+l*r-M*e,t[6]=l*o+v*e+M*u-f*r,t[7]=v*o-M*r-f*u-l*e,t},rotateZ:function(t,n,a){var r=-n[0],u=-n[1],e=-n[2],o=n[3],i=n[4],s=n[5],c=n[6],h=n[7],M=i*o+h*r+s*e-c*u,f=s*o+h*u+c*r-i*e,l=c*o+h*e+i*u-s*r,v=h*o-i*r-s*u-c*e;return Vt(t,n,a),r=t[0],u=t[1],e=t[2],o=t[3],t[4]=M*o+v*r+f*e-l*u,t[5]=f*o+v*u+l*r-M*e,t[6]=l*o+v*e+M*u-f*r,t[7]=v*o-M*r-f*u-l*e,t},rotateByQuatAppend:function(t,n,a){var r=a[0],u=a[1],e=a[2],o=a[3],i=n[0],s=n[1],c=n[2],h=n[3];return t[0]=i*o+h*r+s*e-c*u,t[1]=s*o+h*u+c*r-i*e,t[2]=c*o+h*e+i*u-s*r,t[3]=h*o-i*r-s*u-c*e,i=n[4],s=n[5],c=n[6],h=n[7],t[4]=i*o+h*r+s*e-c*u,t[5]=s*o+h*u+c*r-i*e,t[6]=c*o+h*e+i*u-s*r,t[7]=h*o-i*r-s*u-c*e,t},rotateByQuatPrepend:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=a[0],s=a[1],c=a[2],h=a[3];return t[0]=r*h+o*i+u*c-e*s,t[1]=u*h+o*s+e*i-r*c,t[2]=e*h+o*c+r*s-u*i,t[3]=o*h-r*i-u*s-e*c,i=a[4],s=a[5],c=a[6],h=a[7],t[4]=r*h+o*i+u*c-e*s,t[5]=u*h+o*s+e*i-r*c,t[6]=e*h+o*c+r*s-u*i,t[7]=o*h-r*i-u*s-e*c,t},rotateAroundAxis:function(t,a,r,u){if(Math.abs(u)0){a=Math.sqrt(a);var r=n[0]/a,u=n[1]/a,e=n[2]/a,o=n[3]/a,i=n[4],s=n[5],c=n[6],h=n[7],M=r*i+u*s+e*c+o*h;t[0]=r,t[1]=u,t[2]=e,t[3]=o,t[4]=(i-r*M)/a,t[5]=(s-u*M)/a,t[6]=(c-e*M)/a,t[7]=(h-o*M)/a}return t},str:function(t){return"quat2("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+")"},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]&&t[4]===n[4]&&t[5]===n[5]&&t[6]===n[6]&&t[7]===n[7]},equals:function(t,a){var r=t[0],u=t[1],e=t[2],o=t[3],i=t[4],s=t[5],c=t[6],h=t[7],M=a[0],f=a[1],l=a[2],v=a[3],b=a[4],m=a[5],d=a[6],x=a[7];return Math.abs(r-M)<=n*Math.max(1,Math.abs(r),Math.abs(M))&&Math.abs(u-f)<=n*Math.max(1,Math.abs(u),Math.abs(f))&&Math.abs(e-l)<=n*Math.max(1,Math.abs(e),Math.abs(l))&&Math.abs(o-v)<=n*Math.max(1,Math.abs(o),Math.abs(v))&&Math.abs(i-b)<=n*Math.max(1,Math.abs(i),Math.abs(b))&&Math.abs(s-m)<=n*Math.max(1,Math.abs(s),Math.abs(m))&&Math.abs(c-d)<=n*Math.max(1,Math.abs(c),Math.abs(d))&&Math.abs(h-x)<=n*Math.max(1,Math.abs(h),Math.abs(x))}});function Rn(){var t=new a(2);return a!=Float32Array&&(t[0]=0,t[1]=0),t}function On(t,n,a){return t[0]=n[0]-a[0],t[1]=n[1]-a[1],t}function jn(t,n,a){return t[0]=n[0]*a[0],t[1]=n[1]*a[1],t}function En(t,n,a){return t[0]=n[0]/a[0],t[1]=n[1]/a[1],t}function Pn(t,n){var a=n[0]-t[0],r=n[1]-t[1];return Math.sqrt(a*a+r*r)}function Tn(t,n){var a=n[0]-t[0],r=n[1]-t[1];return a*a+r*r}function Dn(t){var n=t[0],a=t[1];return Math.sqrt(n*n+a*a)}function Sn(t){var n=t[0],a=t[1];return n*n+a*a}var In=Dn,Fn=On,Ln=jn,Vn=En,kn=Pn,Qn=Tn,Yn=Sn,Zn=function(){var t=Rn();return function(n,a,r,u,e,o){var i,s;for(a||(a=2),r||(r=0),s=u?Math.min(u*a+r,n.length):n.length,i=r;i0&&(u=1/Math.sqrt(u)),t[0]=n[0]*u,t[1]=n[1]*u,t},dot:function(t,n){return t[0]*n[0]+t[1]*n[1]},cross:function(t,n,a){var r=n[0]*a[1]-n[1]*a[0];return t[0]=t[1]=0,t[2]=r,t},lerp:function(t,n,a,r){var u=n[0],e=n[1];return t[0]=u+r*(a[0]-u),t[1]=e+r*(a[1]-e),t},random:function(t,n){n=void 0===n?1:n;var a=2*r()*Math.PI;return t[0]=Math.cos(a)*n,t[1]=Math.sin(a)*n,t},transformMat2:function(t,n,a){var r=n[0],u=n[1];return t[0]=a[0]*r+a[2]*u,t[1]=a[1]*r+a[3]*u,t},transformMat2d:function(t,n,a){var r=n[0],u=n[1];return t[0]=a[0]*r+a[2]*u+a[4],t[1]=a[1]*r+a[3]*u+a[5],t},transformMat3:function(t,n,a){var r=n[0],u=n[1];return t[0]=a[0]*r+a[3]*u+a[6],t[1]=a[1]*r+a[4]*u+a[7],t},transformMat4:function(t,n,a){var r=n[0],u=n[1];return t[0]=a[0]*r+a[4]*u+a[12],t[1]=a[1]*r+a[5]*u+a[13],t},rotate:function(t,n,a,r){var u=n[0]-a[0],e=n[1]-a[1],o=Math.sin(r),i=Math.cos(r);return t[0]=u*i-e*o+a[0],t[1]=u*o+e*i+a[1],t},angle:function(t,n){var a=t[0],r=t[1],u=n[0],e=n[1];return Math.abs(Math.atan2(r*u-a*e,a*u+r*e))},signedAngle:function(t,n){var a=t[0],r=t[1],u=n[0],e=n[1];return Math.atan2(a*e-r*u,a*u+r*e)},zero:function(t){return t[0]=0,t[1]=0,t},str:function(t){return"vec2("+t[0]+", "+t[1]+")"},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]},equals:function(t,a){var r=t[0],u=t[1],e=a[0],o=a[1];return Math.abs(r-e)<=n*Math.max(1,Math.abs(r),Math.abs(e))&&Math.abs(u-o)<=n*Math.max(1,Math.abs(u),Math.abs(o))},len:In,sub:Fn,mul:Ln,div:Vn,dist:kn,sqrDist:Qn,sqrLen:Yn,forEach:Zn});t.glMatrix=i,t.mat2=f,t.mat2d=d,t.mat3=_,t.mat4=L,t.quat=vn,t.quat2=zn,t.vec2=Nn,t.vec3=et,t.vec4=Tt,Object.defineProperty(t,"__esModule",{value:!0})})); +!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((t="undefined"!=typeof globalThis?globalThis:t||self).glMatrix={})}(this,(function(t){"use strict";function n(t,n,r){return n=e(n),function(t,n){if(n&&("object"==typeof n||"function"==typeof n))return n;if(void 0!==n)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(t,a()?Reflect.construct(n,r||[],e(t).constructor):n.apply(t,r))}function r(t,n){for(var r=0;r2&&void 0!==arguments[2]?arguments[2]:i;return Math.abs(t-n)<=r*Math.max(1,Math.abs(t),Math.abs(n))}function m(t){return function(t){function e(){var t;!function(t,n){if(!(t instanceof n))throw new TypeError("Cannot call a class as a function")}(this,e);for(var r=arguments.length,a=new Array(r),u=0;u0?(p=2*Math.sqrt(d+1),t[3]=.25*p,t[0]=(l-v)/p,t[1]=(M-f)/p,t[2]=(i-s)/p):o>h&&o>m?(p=2*Math.sqrt(1+o-h-m),t[3]=(l-v)/p,t[0]=.25*p,t[1]=(i+s)/p,t[2]=(M+f)/p):h>m?(p=2*Math.sqrt(1+h-o-m),t[3]=(M-f)/p,t[0]=(i+s)/p,t[1]=.25*p,t[2]=(l+v)/p):(p=2*Math.sqrt(1+m-o-h),t[3]=(i-s)/p,t[0]=(M+f)/p,t[1]=(l+v)/p,t[2]=.25*p),t}function Y(t,n,r,e,a){var u=1/Math.tan(n/2);if(t[0]=u/r,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=u,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=-1,t[12]=0,t[13]=0,t[15]=0,null!=a&&a!==1/0){var o=1/(e-a);t[10]=(a+e)*o,t[14]=2*a*e*o}else t[10]=-1,t[14]=-2*e;return t}var Z=Y;function F(t,n,r,e,a,u,o){var i=1/(n-r),c=1/(e-a),f=1/(u-o);return t[0]=-2*i,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*c,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*f,t[11]=0,t[12]=(n+r)*i,t[13]=(a+e)*c,t[14]=(o+u)*f,t[15]=1,t}var N=F;function Q(t,n,r){return t[0]=n[0]-r[0],t[1]=n[1]-r[1],t[2]=n[2]-r[2],t[3]=n[3]-r[3],t[4]=n[4]-r[4],t[5]=n[5]-r[5],t[6]=n[6]-r[6],t[7]=n[7]-r[7],t[8]=n[8]-r[8],t[9]=n[9]-r[9],t[10]=n[10]-r[10],t[11]=n[11]-r[11],t[12]=n[12]-r[12],t[13]=n[13]-r[13],t[14]=n[14]-r[14],t[15]=n[15]-r[15],t}var X=D,B=Q,U=Object.freeze({__proto__:null,create:function(){var t=new f(16);return t[0]=1,t[5]=1,t[10]=1,t[15]=1,t},clone:function(t){var n=new c(16);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n[8]=t[8],n[9]=t[9],n[10]=t[10],n[11]=t[11],n[12]=t[12],n[13]=t[13],n[14]=t[14],n[15]=t[15],n},copy:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t[9]=n[9],t[10]=n[10],t[11]=n[11],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15],t},fromValues:function(t,n,r,e,a,u,o,i,f,s,h,l,M,v,m,d){var p=new c(16);return p[0]=t,p[1]=n,p[2]=r,p[3]=e,p[4]=a,p[5]=u,p[6]=o,p[7]=i,p[8]=f,p[9]=s,p[10]=h,p[11]=l,p[12]=M,p[13]=v,p[14]=m,p[15]=d,p},set:function(t,n,r,e,a,u,o,i,c,f,s,h,l,M,v,m,d){return t[0]=n,t[1]=r,t[2]=e,t[3]=a,t[4]=u,t[5]=o,t[6]=i,t[7]=c,t[8]=f,t[9]=s,t[10]=h,t[11]=l,t[12]=M,t[13]=v,t[14]=m,t[15]=d,t},identity:S,transpose:function(t,n){var r=n[1],e=n[2],a=n[3],u=n[6],o=n[7],i=n[11];return t[0]=n[0],t[1]=n[4],t[2]=n[8],t[3]=n[12],t[4]=r,t[5]=n[5],t[6]=n[9],t[7]=n[13],t[8]=e,t[9]=u,t[10]=n[10],t[11]=n[14],t[12]=a,t[13]=o,t[14]=i,t[15]=n[15],t},invert:function(t,n){var r=n[0],e=n[1],a=n[2],u=n[3],o=n[4],i=n[5],c=n[6],f=n[7],s=n[8],h=n[9],l=n[10],M=n[11],v=n[12],m=n[13],d=n[14],p=n[15],b=r*i-e*o,y=r*c-a*o,g=r*f-u*o,q=e*c-a*i,w=e*f-u*i,x=a*f-u*c,_=s*m-h*v,A=s*d-l*v,O=s*p-M*v,j=h*d-l*m,P=h*p-M*m,R=l*p-M*d,z=b*R-y*P+g*j+q*O-w*A+x*_;return z?(z=1/z,t[0]=(i*R-c*P+f*j)*z,t[1]=(a*P-e*R-u*j)*z,t[2]=(m*x-d*w+p*q)*z,t[3]=(l*w-h*x-M*q)*z,t[4]=(c*O-o*R-f*A)*z,t[5]=(r*R-a*O+u*A)*z,t[6]=(d*g-v*x-p*y)*z,t[7]=(s*x-l*g+M*y)*z,t[8]=(o*P-i*O+f*_)*z,t[9]=(e*O-r*P-u*_)*z,t[10]=(v*w-m*g+p*b)*z,t[11]=(h*g-s*w-M*b)*z,t[12]=(i*A-o*j-c*_)*z,t[13]=(r*j-e*A+a*_)*z,t[14]=(m*y-v*q-d*b)*z,t[15]=(s*q-h*y+l*b)*z,t):null},adjoint:function(t,n){var r=n[0],e=n[1],a=n[2],u=n[3],o=n[4],i=n[5],c=n[6],f=n[7],s=n[8],h=n[9],l=n[10],M=n[11],v=n[12],m=n[13],d=n[14],p=n[15],b=r*i-e*o,y=r*c-a*o,g=r*f-u*o,q=e*c-a*i,w=e*f-u*i,x=a*f-u*c,_=s*m-h*v,A=s*d-l*v,O=s*p-M*v,j=h*d-l*m,P=h*p-M*m,R=l*p-M*d;return t[0]=i*R-c*P+f*j,t[1]=a*P-e*R-u*j,t[2]=m*x-d*w+p*q,t[3]=l*w-h*x-M*q,t[4]=c*O-o*R-f*A,t[5]=r*R-a*O+u*A,t[6]=d*g-v*x-p*y,t[7]=s*x-l*g+M*y,t[8]=o*P-i*O+f*_,t[9]=e*O-r*P-u*_,t[10]=v*w-m*g+p*b,t[11]=h*g-s*w-M*b,t[12]=i*A-o*j-c*_,t[13]=r*j-e*A+a*_,t[14]=m*y-v*q-d*b,t[15]=s*q-h*y+l*b,t},determinant:function(t){var n=t[0],r=t[1],e=t[2],a=t[3],u=t[4],o=t[5],i=t[6],c=t[7],f=t[8],s=t[9],h=t[10],l=t[11],M=t[12],v=t[13],m=t[14],d=n*o-r*u,p=n*i-e*u,b=r*i-e*o,y=f*v-s*M,g=f*m-h*M,q=s*m-h*v;return c*(n*q-r*g+e*y)-a*(u*q-o*g+i*y)+t[15]*(f*b-s*p+h*d)-l*(M*b-v*p+m*d)},multiply:D,translate:function(t,n,r){var e,a,u,o,i,c,f,s,h,l,M,v,m=r[0],d=r[1],p=r[2];return n===t?(t[12]=n[0]*m+n[4]*d+n[8]*p+n[12],t[13]=n[1]*m+n[5]*d+n[9]*p+n[13],t[14]=n[2]*m+n[6]*d+n[10]*p+n[14],t[15]=n[3]*m+n[7]*d+n[11]*p+n[15]):(e=n[0],a=n[1],u=n[2],o=n[3],i=n[4],c=n[5],f=n[6],s=n[7],h=n[8],l=n[9],M=n[10],v=n[11],t[0]=e,t[1]=a,t[2]=u,t[3]=o,t[4]=i,t[5]=c,t[6]=f,t[7]=s,t[8]=h,t[9]=l,t[10]=M,t[11]=v,t[12]=e*m+i*d+h*p+n[12],t[13]=a*m+c*d+l*p+n[13],t[14]=u*m+f*d+M*p+n[14],t[15]=o*m+s*d+v*p+n[15]),t},scale:function(t,n,r){var e=r[0],a=r[1],u=r[2];return t[0]=n[0]*e,t[1]=n[1]*e,t[2]=n[2]*e,t[3]=n[3]*e,t[4]=n[4]*a,t[5]=n[5]*a,t[6]=n[6]*a,t[7]=n[7]*a,t[8]=n[8]*u,t[9]=n[9]*u,t[10]=n[10]*u,t[11]=n[11]*u,t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15],t},rotate:function(t,n,r,e){var a,u,o,c,f,s,h,l,M,v,m,d,p,b,y,g,q,w,x,_,A,O,j,P,R=e[0],z=e[1],E=e[2],T=Math.sqrt(R*R+z*z+E*E);return T0?(r[0]=2*(i*o+h*e+f*u-s*a)/l,r[1]=2*(f*o+h*a+s*e-i*u)/l,r[2]=2*(s*o+h*u+i*a-f*e)/l):(r[0]=2*(i*o+h*e+f*u-s*a),r[1]=2*(f*o+h*a+s*e-i*u),r[2]=2*(s*o+h*u+i*a-f*e)),I(t,n,r),t},getTranslation:L,getScaling:V,getRotation:k,decompose:function(t,n,r,e){n[0]=e[12],n[1]=e[13],n[2]=e[14];var a=e[0],u=e[1],o=e[2],i=e[4],c=e[5],f=e[6],s=e[8],h=e[9],l=e[10];r[0]=Math.sqrt(a*a+u*u+o*o),r[1]=Math.sqrt(i*i+c*c+f*f),r[2]=Math.sqrt(s*s+h*h+l*l);var M=1/r[0],v=1/r[1],m=1/r[2],d=a*M,p=u*v,b=o*m,y=i*M,g=c*v,q=f*m,w=s*M,x=h*v,_=l*m,A=d+g+_,O=0;return A>0?(O=2*Math.sqrt(A+1),t[3]=.25*O,t[0]=(q-x)/O,t[1]=(w-b)/O,t[2]=(p-y)/O):d>g&&d>_?(O=2*Math.sqrt(1+d-g-_),t[3]=(q-x)/O,t[0]=.25*O,t[1]=(p+y)/O,t[2]=(w+b)/O):g>_?(O=2*Math.sqrt(1+g-d-_),t[3]=(w-b)/O,t[0]=(p+y)/O,t[1]=.25*O,t[2]=(q+x)/O):(O=2*Math.sqrt(1+_-d-g),t[3]=(p-y)/O,t[0]=(w+b)/O,t[1]=(q+x)/O,t[2]=.25*O),t},fromRotationTranslationScale:function(t,n,r,e){var a=n[0],u=n[1],o=n[2],i=n[3],c=a+a,f=u+u,s=o+o,h=a*c,l=a*f,M=a*s,v=u*f,m=u*s,d=o*s,p=i*c,b=i*f,y=i*s,g=e[0],q=e[1],w=e[2];return t[0]=(1-(v+d))*g,t[1]=(l+y)*g,t[2]=(M-b)*g,t[3]=0,t[4]=(l-y)*q,t[5]=(1-(h+d))*q,t[6]=(m+p)*q,t[7]=0,t[8]=(M+b)*w,t[9]=(m-p)*w,t[10]=(1-(h+v))*w,t[11]=0,t[12]=r[0],t[13]=r[1],t[14]=r[2],t[15]=1,t},fromRotationTranslationScaleOrigin:function(t,n,r,e,a){var u=n[0],o=n[1],i=n[2],c=n[3],f=u+u,s=o+o,h=i+i,l=u*f,M=u*s,v=u*h,m=o*s,d=o*h,p=i*h,b=c*f,y=c*s,g=c*h,q=e[0],w=e[1],x=e[2],_=a[0],A=a[1],O=a[2],j=(1-(m+p))*q,P=(M+g)*q,R=(v-y)*q,z=(M-g)*w,E=(1-(l+p))*w,T=(d+b)*w,S=(v+y)*x,D=(d-b)*x,I=(1-(l+m))*x;return t[0]=j,t[1]=P,t[2]=R,t[3]=0,t[4]=z,t[5]=E,t[6]=T,t[7]=0,t[8]=S,t[9]=D,t[10]=I,t[11]=0,t[12]=r[0]+_-(j*_+z*A+S*O),t[13]=r[1]+A-(P*_+E*A+D*O),t[14]=r[2]+O-(R*_+T*A+I*O),t[15]=1,t},fromQuat:function(t,n){var r=n[0],e=n[1],a=n[2],u=n[3],o=r+r,i=e+e,c=a+a,f=r*o,s=e*o,h=e*i,l=a*o,M=a*i,v=a*c,m=u*o,d=u*i,p=u*c;return t[0]=1-h-v,t[1]=s+p,t[2]=l-d,t[3]=0,t[4]=s-p,t[5]=1-f-v,t[6]=M+m,t[7]=0,t[8]=l+d,t[9]=M-m,t[10]=1-f-h,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},frustum:function(t,n,r,e,a,u,o){var i=1/(r-n),c=1/(a-e),f=1/(u-o);return t[0]=2*u*i,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=2*u*c,t[6]=0,t[7]=0,t[8]=(r+n)*i,t[9]=(a+e)*c,t[10]=(o+u)*f,t[11]=-1,t[12]=0,t[13]=0,t[14]=o*u*2*f,t[15]=0,t},perspectiveNO:Y,perspective:Z,perspectiveZO:function(t,n,r,e,a){var u=1/Math.tan(n/2);if(t[0]=u/r,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=u,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=-1,t[12]=0,t[13]=0,t[15]=0,null!=a&&a!==1/0){var o=1/(e-a);t[10]=a*o,t[14]=a*e*o}else t[10]=-1,t[14]=-e;return t},perspectiveFromFieldOfView:function(t,n,r,e){var a=Math.tan(n.upDegrees*Math.PI/180),u=Math.tan(n.downDegrees*Math.PI/180),o=Math.tan(n.leftDegrees*Math.PI/180),i=Math.tan(n.rightDegrees*Math.PI/180),c=2/(o+i),f=2/(a+u);return t[0]=c,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=f,t[6]=0,t[7]=0,t[8]=-(o-i)*c*.5,t[9]=(a-u)*f*.5,t[10]=e/(r-e),t[11]=-1,t[12]=0,t[13]=0,t[14]=e*r/(r-e),t[15]=0,t},orthoNO:F,ortho:N,orthoZO:function(t,n,r,e,a,u,o){var i=1/(n-r),c=1/(e-a),f=1/(u-o);return t[0]=-2*i,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*c,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=f,t[11]=0,t[12]=(n+r)*i,t[13]=(a+e)*c,t[14]=u*f,t[15]=1,t},lookAt:function(t,n,r,e){var a,u,o,c,f,s,h,l,M,v,m=n[0],d=n[1],p=n[2],b=e[0],y=e[1],g=e[2],q=r[0],w=r[1],x=r[2];return Math.abs(m-q)0&&(s*=M=1/Math.sqrt(M),h*=M,l*=M);var v=c*l-f*h,m=f*s-i*l,d=i*h-c*s;return(M=v*v+m*m+d*d)>0&&(v*=M=1/Math.sqrt(M),m*=M,d*=M),t[0]=v,t[1]=m,t[2]=d,t[3]=0,t[4]=h*d-l*m,t[5]=l*v-s*d,t[6]=s*m-h*v,t[7]=0,t[8]=s,t[9]=h,t[10]=l,t[11]=0,t[12]=a,t[13]=u,t[14]=o,t[15]=1,t},str:function(t){return"mat4("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+", "+t[8]+", "+t[9]+", "+t[10]+", "+t[11]+", "+t[12]+", "+t[13]+", "+t[14]+", "+t[15]+")"},frob:function(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]+t[3]*t[3]+t[4]*t[4]+t[5]*t[5]+t[6]*t[6]+t[7]*t[7]+t[8]*t[8]+t[9]*t[9]+t[10]*t[10]+t[11]*t[11]+t[12]*t[12]+t[13]*t[13]+t[14]*t[14]+t[15]*t[15])},add:function(t,n,r){return t[0]=n[0]+r[0],t[1]=n[1]+r[1],t[2]=n[2]+r[2],t[3]=n[3]+r[3],t[4]=n[4]+r[4],t[5]=n[5]+r[5],t[6]=n[6]+r[6],t[7]=n[7]+r[7],t[8]=n[8]+r[8],t[9]=n[9]+r[9],t[10]=n[10]+r[10],t[11]=n[11]+r[11],t[12]=n[12]+r[12],t[13]=n[13]+r[13],t[14]=n[14]+r[14],t[15]=n[15]+r[15],t},subtract:Q,multiplyScalar:function(t,n,r){return t[0]=n[0]*r,t[1]=n[1]*r,t[2]=n[2]*r,t[3]=n[3]*r,t[4]=n[4]*r,t[5]=n[5]*r,t[6]=n[6]*r,t[7]=n[7]*r,t[8]=n[8]*r,t[9]=n[9]*r,t[10]=n[10]*r,t[11]=n[11]*r,t[12]=n[12]*r,t[13]=n[13]*r,t[14]=n[14]*r,t[15]=n[15]*r,t},multiplyScalarAndAdd:function(t,n,r,e){return t[0]=n[0]+r[0]*e,t[1]=n[1]+r[1]*e,t[2]=n[2]+r[2]*e,t[3]=n[3]+r[3]*e,t[4]=n[4]+r[4]*e,t[5]=n[5]+r[5]*e,t[6]=n[6]+r[6]*e,t[7]=n[7]+r[7]*e,t[8]=n[8]+r[8]*e,t[9]=n[9]+r[9]*e,t[10]=n[10]+r[10]*e,t[11]=n[11]+r[11]*e,t[12]=n[12]+r[12]*e,t[13]=n[13]+r[13]*e,t[14]=n[14]+r[14]*e,t[15]=n[15]+r[15]*e,t},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]&&t[4]===n[4]&&t[5]===n[5]&&t[6]===n[6]&&t[7]===n[7]&&t[8]===n[8]&&t[9]===n[9]&&t[10]===n[10]&&t[11]===n[11]&&t[12]===n[12]&&t[13]===n[13]&&t[14]===n[14]&&t[15]===n[15]},equals:function(t,n){return v(t[0],n[0])&&v(t[1],n[1])&&v(t[2],n[2])&&v(t[3],n[3])&&v(t[4],n[4])&&v(t[5],n[5])&&v(t[6],n[6])&&v(t[7],n[7])&&v(t[8],n[8])&&v(t[9],n[9])&&v(t[10],n[10])&&v(t[11],n[11])&&v(t[12],n[12])&&v(t[13],n[13])&&v(t[14],n[14])&&v(t[15],n[15])},mul:X,sub:B});function C(){return new f(3)}function G(t){return Math.hypot(t[0],t[1],t[2])}function W(t,n,r){var e=new c(3);return e[0]=t,e[1]=n,e[2]=r,e}function H(t,n,r){return t[0]=n[0]-r[0],t[1]=n[1]-r[1],t[2]=n[2]-r[2],t}function J(t,n,r){return t[0]=n[0]*r[0],t[1]=n[1]*r[1],t[2]=n[2]*r[2],t}function K(t,n,r){return t[0]=n[0]/r[0],t[1]=n[1]/r[1],t[2]=n[2]/r[2],t}function $(t,n){return Math.hypot(n[0]-t[0],n[1]-t[1],n[2]-t[2])}function tt(t,n){return Math.pow(Math.hypot(n[0]-t[0],n[1]-t[1],n[2]-t[2]),2)}function nt(t){return Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)}function rt(t,n){var r=Math.max(Math.hypot(n[0],n[1],n[2]),i);return t[0]=n[0]/r,t[1]=n[1]/r,t[2]=n[2]/r,t}function et(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]}function at(t,n,r){var e=n[0],a=n[1],u=n[2],o=r[0],i=r[1],c=r[2];return t[0]=a*c-u*i,t[1]=u*o-e*c,t[2]=e*i-a*o,t}var ut,ot=H,it=J,ct=K,ft=$,st=tt,ht=G,lt=nt,Mt=(ut=C(),function(t,n){var r,e,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,u=arguments.length>3?arguments[3]:void 0,o=arguments.length>4?arguments[4]:void 0,i=arguments.length>5?arguments[5]:void 0;for(n=n||3,e=u?Math.min(u*n+a,t.length):t.length,r=a;r1&&void 0!==arguments[1]?arguments[1]:1,r=2*s()*Math.PI,e=2*s()-1,a=Math.sqrt(1-e*e)*n;return t[0]=Math.cos(r)*a,t[1]=Math.sin(r)*a,t[2]=e*n,t},transformMat4:function(t,n,r){var e=n[0],a=n[1],u=n[2],o=r[3]*e+r[7]*a+r[11]*u+r[15];return o=o||1,t[0]=(r[0]*e+r[4]*a+r[8]*u+r[12])/o,t[1]=(r[1]*e+r[5]*a+r[9]*u+r[13])/o,t[2]=(r[2]*e+r[6]*a+r[10]*u+r[14])/o,t},transformMat3:function(t,n,r){var e=n[0],a=n[1],u=n[2];return t[0]=e*r[0]+a*r[3]+u*r[6],t[1]=e*r[1]+a*r[4]+u*r[7],t[2]=e*r[2]+a*r[5]+u*r[8],t},transformQuat:function(t,n,r){var e=r[0],a=r[1],u=r[2],o=r[3],i=n[0],c=n[1],f=n[2],s=a*f-u*c,h=u*i-e*f,l=e*c-a*i;return s+=s,h+=h,l+=l,t[0]=i+o*s+a*l-u*h,t[1]=c+o*h+u*s-e*l,t[2]=f+o*l+e*h-a*s,t},rotateX:function(t,n,r,e){var a=[],u=[];return a[0]=n[0]-r[0],a[1]=n[1]-r[1],a[2]=n[2]-r[2],u[0]=a[0],u[1]=a[1]*Math.cos(e)-a[2]*Math.sin(e),u[2]=a[1]*Math.sin(e)+a[2]*Math.cos(e),t[0]=u[0]+r[0],t[1]=u[1]+r[1],t[2]=u[2]+r[2],t},rotateY:function(t,n,r,e){var a=[],u=[];return a[0]=n[0]-r[0],a[1]=n[1]-r[1],a[2]=n[2]-r[2],u[0]=a[2]*Math.sin(e)+a[0]*Math.cos(e),u[1]=a[1],u[2]=a[2]*Math.cos(e)-a[0]*Math.sin(e),t[0]=u[0]+r[0],t[1]=u[1]+r[1],t[2]=u[2]+r[2],t},rotateZ:function(t,n,r,e){var a=[],u=[];return a[0]=n[0]-r[0],a[1]=n[1]-r[1],a[2]=n[2]-r[2],u[0]=a[0]*Math.cos(e)-a[1]*Math.sin(e),u[1]=a[0]*Math.sin(e)+a[1]*Math.cos(e),u[2]=a[2],t[0]=u[0]+r[0],t[1]=u[1]+r[1],t[2]=u[2]+r[2],t},angle:function(t,n){var r=t[0],e=t[1],a=t[2],u=n[0],o=n[1],i=n[2],c=Math.sqrt((r*r+e*e+a*a)*(u*u+o*o+i*i)),f=c&&et(t,n)/c;return Math.acos(Math.min(Math.max(f,-1),1))},zero:function(t){return t[0]=0,t[1]=0,t[2]=0,t},str:function(t){return"vec3("+t[0]+", "+t[1]+", "+t[2]+")"},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]},equals:function(t,n){return v(t[0],n[0])&&v(t[1],n[1])&&v(t[2],n[2])},sub:ot,mul:it,div:ct,dist:ft,sqrDist:st,len:ht,sqrLen:lt,forEach:Mt});function mt(){return new f(4)}function dt(t){var n=new c(4);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n}function pt(t,n,r,e){var a=new c(4);return a[0]=t,a[1]=n,a[2]=r,a[3]=e,a}function bt(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t}function yt(t,n,r,e,a){return t[0]=n,t[1]=r,t[2]=e,t[3]=a,t}function gt(t,n,r){return t[0]=n[0]+r[0],t[1]=n[1]+r[1],t[2]=n[2]+r[2],t[3]=n[3]+r[3],t}function qt(t,n,r){return t[0]=n[0]-r[0],t[1]=n[1]-r[1],t[2]=n[2]-r[2],t[3]=n[3]-r[3],t}function wt(t,n,r){return t[0]=n[0]*r[0],t[1]=n[1]*r[1],t[2]=n[2]*r[2],t[3]=n[3]*r[3],t}function xt(t,n,r){return t[0]=n[0]/r[0],t[1]=n[1]/r[1],t[2]=n[2]/r[2],t[3]=n[3]/r[3],t}function _t(t,n,r){return t[0]=n[0]*r,t[1]=n[1]*r,t[2]=n[2]*r,t[3]=n[3]*r,t}function At(t,n){return Math.hypot(n[0]-t[0],n[1]-t[1],n[2]-t[2],n[3]-t[3])}function Ot(t,n){return Math.pow(Math.hypot(n[0]-t[0],n[1]-t[1],n[2]-t[2],n[3]-t[3]),2)}function jt(t){return Math.hypot(t[0],t[1],t[2],t[3])}function Pt(t){return Math.pow(Math.hypot(t[0],t[1],t[2],t[3]),2)}function Rt(t,n){var r=n[0],e=n[1],a=n[2],u=n[3],o=Math.max(Math.hypot(r,e,a,u),i);return t[0]=r/o,t[1]=e/o,t[2]=a/o,t[3]=u/o,t}function zt(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]+t[3]*n[3]}function Et(t,n,r,e){var a=n[0],u=n[1],o=n[2],i=n[3];return t[0]=a+e*(r[0]-a),t[1]=u+e*(r[1]-u),t[2]=o+e*(r[2]-o),t[3]=i+e*(r[3]-i),t}function Tt(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]}var St=qt,Dt=wt,It=xt,Lt=At,Vt=Ot,kt=jt,Yt=Pt,Zt=function(){var t=mt();return function(n,r){var e,a,u=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,o=arguments.length>3?arguments[3]:void 0,i=arguments.length>4?arguments[4]:void 0,c=arguments.length>5?arguments[5]:void 0;for(r=r||4,a=o?Math.min(o*r+u,n.length):n.length,e=u;e0?i*Math.sin(o)/o:0;return t[0]=r*c,t[1]=e*c,t[2]=a*c,t[3]=i*Math.cos(o),t}function Wt(t,n){var r=n[0],e=n[1],a=n[2],u=n[3],o=Math.sqrt(r*r+e*e+a*a),i=o>0?Math.atan2(o,u)/o:0;return t[0]=r*i,t[1]=e*i,t[2]=a*i,t[3]=.5*Math.log(r*r+e*e+a*a+u*u),t}function Ht(t,n,r,e){var a,u,o,c,f,s=n[0],h=n[1],l=n[2],M=n[3],v=r[0],m=r[1],d=r[2],p=r[3];return(u=s*v+h*m+l*d+M*p)<0&&(u=-u,v=-v,m=-m,d=-d,p=-p),1-u>i?(a=Math.acos(u),o=Math.sin(a),c=Math.sin((1-e)*a)/o,f=Math.sin(e*a)/o):(c=1-e,f=e),t[0]=c*s+f*v,t[1]=c*h+f*m,t[2]=c*l+f*d,t[3]=c*M+f*p,t}function Jt(t,n){var r,e=n[0]+n[4]+n[8];if(e>0)r=Math.sqrt(e+1),t[3]=.5*r,r=.5/r,t[0]=(n[5]-n[7])*r,t[1]=(n[6]-n[2])*r,t[2]=(n[1]-n[3])*r;else{var a=0;n[4]>n[0]&&(a=1),n[8]>n[3*a+a]&&(a=2);var u=(a+1)%3,o=(a+2)%3;r=Math.sqrt(n[3*a+a]-n[3*u+u]-n[3*o+o]+1),t[a]=.5*r,r=.5/r,t[3]=(n[3*u+o]-n[3*o+u])*r,t[u]=(n[3*u+a]+n[3*a+u])*r,t[o]=(n[3*o+a]+n[3*a+o])*r}return t}var Kt=dt,$t=pt,tn=bt,nn=yt,rn=gt,en=Xt,an=_t,un=zt,on=Et,cn=jt,fn=cn,sn=Pt,hn=sn,ln=Rt,Mn=Tt;var vn,mn,dn,pn,bn,yn,gn=(vn=C(),mn=W(1,0,0),dn=W(0,1,0),function(t,n,r){var e=et(n,r);return e<-.999999?(at(vn,mn,n),ht(vn)<1e-6&&at(vn,dn,n),rt(vn,vn),Qt(t,vn,Math.PI),t):e>.999999?(t[0]=0,t[1]=0,t[2]=0,t[3]=1,t):(at(vn,n,r),t[0]=vn[0],t[1]=vn[1],t[2]=vn[2],t[3]=1+e,ln(t,t))}),qn=(pn=Nt(),bn=Nt(),function(t,n,r,e,a,u){return Ht(pn,n,a,u),Ht(bn,r,e,u),Ht(t,pn,bn,2*u*(1-u)),t}),wn=(yn=j(),function(t,n,r,e){return yn[0]=r[0],yn[3]=r[1],yn[6]=r[2],yn[1]=e[0],yn[4]=e[1],yn[7]=e[2],yn[2]=-n[0],yn[5]=-n[1],yn[8]=-n[2],ln(t,Jt(t,yn))}),xn=Object.freeze({__proto__:null,create:Nt,identity:function(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t},setAxisAngle:Qt,getAxisAngle:function(t,n){var r=2*Math.acos(n[3]),e=Math.sin(r/2);return e>i?(t[0]=n[0]/e,t[1]=n[1]/e,t[2]=n[2]/e):(t[0]=1,t[1]=0,t[2]=0),r},getAngle:function(t,n){var r=un(t,n);return Math.acos(2*r*r-1)},multiply:Xt,rotateX:Bt,rotateY:Ut,rotateZ:Ct,calculateW:function(t,n){var r=n[0],e=n[1],a=n[2];return t[0]=r,t[1]=e,t[2]=a,t[3]=Math.sqrt(Math.abs(1-r*r-e*e-a*a)),t},exp:Gt,ln:Wt,pow:function(t,n,r){return Wt(t,n),an(t,t,r),Gt(t,t),t},slerp:Ht,random:function(t){var n=s(),r=s(),e=s(),a=Math.sqrt(1-n),u=Math.sqrt(n);return t[0]=a*Math.sin(2*Math.PI*r),t[1]=a*Math.cos(2*Math.PI*r),t[2]=u*Math.sin(2*Math.PI*e),t[3]=u*Math.cos(2*Math.PI*e),t},invert:function(t,n){var r=n[0],e=n[1],a=n[2],u=n[3],o=r*r+e*e+a*a+u*u,i=o?1/o:0;return t[0]=-r*i,t[1]=-e*i,t[2]=-a*i,t[3]=u*i,t},conjugate:function(t,n){return t[0]=-n[0],t[1]=-n[1],t[2]=-n[2],t[3]=n[3],t},fromMat3:Jt,fromEuler:function(t,n,r,e){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"zyx",u=Math.PI/360;n*=u,e*=u,r*=u;var o=Math.sin(n),i=Math.cos(n),c=Math.sin(r),f=Math.cos(r),s=Math.sin(e),h=Math.cos(e);switch(a){case"xyz":t[0]=o*f*h+i*c*s,t[1]=i*c*h-o*f*s,t[2]=i*f*s+o*c*h,t[3]=i*f*h-o*c*s;break;case"xzy":t[0]=o*f*h-i*c*s,t[1]=i*c*h-o*f*s,t[2]=i*f*s+o*c*h,t[3]=i*f*h+o*c*s;break;case"yxz":t[0]=o*f*h+i*c*s,t[1]=i*c*h-o*f*s,t[2]=i*f*s-o*c*h,t[3]=i*f*h+o*c*s;break;case"yzx":t[0]=o*f*h+i*c*s,t[1]=i*c*h+o*f*s,t[2]=i*f*s-o*c*h,t[3]=i*f*h-o*c*s;break;case"zxy":t[0]=o*f*h-i*c*s,t[1]=i*c*h+o*f*s,t[2]=i*f*s+o*c*h,t[3]=i*f*h-o*c*s;break;case"zyx":t[0]=o*f*h-i*c*s,t[1]=i*c*h+o*f*s,t[2]=i*f*s-o*c*h,t[3]=i*f*h+o*c*s;break;default:throw new Error("Unknown angle order "+a)}return t},str:function(t){return"quat("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},clone:Kt,fromValues:$t,copy:tn,set:nn,add:rn,mul:en,scale:an,dot:un,lerp:on,length:cn,len:fn,squaredLength:sn,sqrLen:hn,normalize:ln,exactEquals:Mn,equals:function(t,n){return Math.abs(zt(t,n))>=.999999},rotationTo:gn,sqlerp:qn,setAxes:wn});function _n(t,n,r){var e=.5*r[0],a=.5*r[1],u=.5*r[2],o=n[0],i=n[1],c=n[2],f=n[3];return t[0]=o,t[1]=i,t[2]=c,t[3]=f,t[4]=e*f+a*c-u*i,t[5]=a*f+u*o-e*c,t[6]=u*f+e*i-a*o,t[7]=-e*o-a*i-u*c,t}function An(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t}var On=tn;var jn=tn;function Pn(t,n,r){var e=n[0],a=n[1],u=n[2],o=n[3],i=r[4],c=r[5],f=r[6],s=r[7],h=n[4],l=n[5],M=n[6],v=n[7],m=r[0],d=r[1],p=r[2],b=r[3];return t[0]=e*b+o*m+a*p-u*d,t[1]=a*b+o*d+u*m-e*p,t[2]=u*b+o*p+e*d-a*m,t[3]=o*b-e*m-a*d-u*p,t[4]=e*s+o*i+a*f-u*c+h*b+v*m+l*p-M*d,t[5]=a*s+o*c+u*i-e*f+l*b+v*d+M*m-h*p,t[6]=u*s+o*f+e*c-a*i+M*b+v*p+h*d-l*m,t[7]=o*s-e*i-a*c-u*f+v*b-h*m-l*d-M*p,t}var Rn=Pn;var zn=un;var En=cn,Tn=En,Sn=sn,Dn=Sn;var In=Object.freeze({__proto__:null,create:function(){var t=new c(8);return c!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0,t[4]=0,t[5]=0,t[6]=0,t[7]=0),t[3]=1,t},clone:function(t){var n=new c(8);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n},fromValues:function(t,n,r,e,a,u,o,i){var f=new c(8);return f[0]=t,f[1]=n,f[2]=r,f[3]=e,f[4]=a,f[5]=u,f[6]=o,f[7]=i,f},fromRotationTranslationValues:function(t,n,r,e,a,u,o){var i=new c(8);i[0]=t,i[1]=n,i[2]=r,i[3]=e;var f=.5*a,s=.5*u,h=.5*o;return i[4]=f*e+s*r-h*n,i[5]=s*e+h*t-f*r,i[6]=h*e+f*n-s*t,i[7]=-f*t-s*n-h*r,i},fromRotationTranslation:_n,fromTranslation:function(t,n){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t[4]=.5*n[0],t[5]=.5*n[1],t[6]=.5*n[2],t[7]=0,t},fromRotation:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=0,t[5]=0,t[6]=0,t[7]=0,t},fromMat4:function(t,n){var r=Nt();k(r,n);var e=new c(3);return L(e,n),_n(t,r,e),t},copy:An,identity:function(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t[6]=0,t[7]=0,t},set:function(t,n,r,e,a,u,o,i,c){return t[0]=n,t[1]=r,t[2]=e,t[3]=a,t[4]=u,t[5]=o,t[6]=i,t[7]=c,t},getReal:On,getDual:function(t,n){return t[0]=n[4],t[1]=n[5],t[2]=n[6],t[3]=n[7],t},setReal:jn,setDual:function(t,n){return t[4]=n[0],t[5]=n[1],t[6]=n[2],t[7]=n[3],t},getTranslation:function(t,n){var r=n[4],e=n[5],a=n[6],u=n[7],o=-n[0],i=-n[1],c=-n[2],f=n[3];return t[0]=2*(r*f+u*o+e*c-a*i),t[1]=2*(e*f+u*i+a*o-r*c),t[2]=2*(a*f+u*c+r*i-e*o),t},translate:function(t,n,r){var e=n[0],a=n[1],u=n[2],o=n[3],i=.5*r[0],c=.5*r[1],f=.5*r[2],s=n[4],h=n[5],l=n[6],M=n[7];return t[0]=e,t[1]=a,t[2]=u,t[3]=o,t[4]=o*i+a*f-u*c+s,t[5]=o*c+u*i-e*f+h,t[6]=o*f+e*c-a*i+l,t[7]=-e*i-a*c-u*f+M,t},rotateX:function(t,n,r){var e=-n[0],a=-n[1],u=-n[2],o=n[3],i=n[4],c=n[5],f=n[6],s=n[7],h=i*o+s*e+c*u-f*a,l=c*o+s*a+f*e-i*u,M=f*o+s*u+i*a-c*e,v=s*o-i*e-c*a-f*u;return Bt(t,n,r),e=t[0],a=t[1],u=t[2],o=t[3],t[4]=h*o+v*e+l*u-M*a,t[5]=l*o+v*a+M*e-h*u,t[6]=M*o+v*u+h*a-l*e,t[7]=v*o-h*e-l*a-M*u,t},rotateY:function(t,n,r){var e=-n[0],a=-n[1],u=-n[2],o=n[3],i=n[4],c=n[5],f=n[6],s=n[7],h=i*o+s*e+c*u-f*a,l=c*o+s*a+f*e-i*u,M=f*o+s*u+i*a-c*e,v=s*o-i*e-c*a-f*u;return Ut(t,n,r),e=t[0],a=t[1],u=t[2],o=t[3],t[4]=h*o+v*e+l*u-M*a,t[5]=l*o+v*a+M*e-h*u,t[6]=M*o+v*u+h*a-l*e,t[7]=v*o-h*e-l*a-M*u,t},rotateZ:function(t,n,r){var e=-n[0],a=-n[1],u=-n[2],o=n[3],i=n[4],c=n[5],f=n[6],s=n[7],h=i*o+s*e+c*u-f*a,l=c*o+s*a+f*e-i*u,M=f*o+s*u+i*a-c*e,v=s*o-i*e-c*a-f*u;return Ct(t,n,r),e=t[0],a=t[1],u=t[2],o=t[3],t[4]=h*o+v*e+l*u-M*a,t[5]=l*o+v*a+M*e-h*u,t[6]=M*o+v*u+h*a-l*e,t[7]=v*o-h*e-l*a-M*u,t},rotateByQuatAppend:function(t,n,r){var e=r[0],a=r[1],u=r[2],o=r[3],i=n[0],c=n[1],f=n[2],s=n[3];return t[0]=i*o+s*e+c*u-f*a,t[1]=c*o+s*a+f*e-i*u,t[2]=f*o+s*u+i*a-c*e,t[3]=s*o-i*e-c*a-f*u,i=n[4],c=n[5],f=n[6],s=n[7],t[4]=i*o+s*e+c*u-f*a,t[5]=c*o+s*a+f*e-i*u,t[6]=f*o+s*u+i*a-c*e,t[7]=s*o-i*e-c*a-f*u,t},rotateByQuatPrepend:function(t,n,r){var e=n[0],a=n[1],u=n[2],o=n[3],i=r[0],c=r[1],f=r[2],s=r[3];return t[0]=e*s+o*i+a*f-u*c,t[1]=a*s+o*c+u*i-e*f,t[2]=u*s+o*f+e*c-a*i,t[3]=o*s-e*i-a*c-u*f,i=r[4],c=r[5],f=r[6],s=r[7],t[4]=e*s+o*i+a*f-u*c,t[5]=a*s+o*c+u*i-e*f,t[6]=u*s+o*f+e*c-a*i,t[7]=o*s-e*i-a*c-u*f,t},rotateAroundAxis:function(t,n,r,e){if(Math.abs(e)0){r=Math.sqrt(r);var e=n[0]/r,a=n[1]/r,u=n[2]/r,o=n[3]/r,i=n[4],c=n[5],f=n[6],s=n[7],h=e*i+a*c+u*f+o*s;t[0]=e,t[1]=a,t[2]=u,t[3]=o,t[4]=(i-e*h)/r,t[5]=(c-a*h)/r,t[6]=(f-u*h)/r,t[7]=(s-o*h)/r}return t},str:function(t){return"quat2("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+")"},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]&&t[4]===n[4]&&t[5]===n[5]&&t[6]===n[6]&&t[7]===n[7]},equals:function(t,n){var r=t[0],e=t[1],a=t[2],u=t[3],o=t[4],c=t[5],f=t[6],s=t[7],h=n[0],l=n[1],M=n[2],v=n[3],m=n[4],d=n[5],p=n[6],b=n[7];return Math.abs(r-h)<=i*Math.max(1,Math.abs(r),Math.abs(h))&&Math.abs(e-l)<=i*Math.max(1,Math.abs(e),Math.abs(l))&&Math.abs(a-M)<=i*Math.max(1,Math.abs(a),Math.abs(M))&&Math.abs(u-v)<=i*Math.max(1,Math.abs(u),Math.abs(v))&&Math.abs(o-m)<=i*Math.max(1,Math.abs(o),Math.abs(m))&&Math.abs(c-d)<=i*Math.max(1,Math.abs(c),Math.abs(d))&&Math.abs(f-p)<=i*Math.max(1,Math.abs(f),Math.abs(p))&&Math.abs(s-b)<=i*Math.max(1,Math.abs(s),Math.abs(b))}});function Ln(){return new f(2)}function Vn(t,n,r){return t[0]=n[0]-r[0],t[1]=n[1]-r[1],t}function kn(t,n,r){return t[0]=n[0]*r[0],t[1]=n[1]*r[1],t}function Yn(t,n,r){return t[0]=n[0]/r[0],t[1]=n[1]/r[1],t}function Zn(t,n){return Math.hypot(n[0]-t[0],n[1]-t[1])}function Fn(t,n){var r=n[0]-t[0],e=n[1]-t[1];return r*r+e*e}function Nn(t){return Math.hypot(t[0],t[1])}function Qn(t){var n=t[0],r=t[1];return n*n+r*r}var Xn=Nn,Bn=Vn,Un=kn,Cn=Yn,Gn=Zn,Wn=Fn,Hn=Qn,Jn=function(){var t=Ln();return function(n,r){var e,a,u=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,o=arguments.length>3?arguments[3]:void 0,i=arguments.length>4?arguments[4]:void 0,c=arguments.length>5?arguments[5]:void 0;for(r=r||2,a=o?Math.min(o*r+u,n.length):n.length,e=u;e1&&void 0!==arguments[1]?arguments[1]:1,r=2*s()*Math.PI;return t[0]=Math.cos(r)*n,t[1]=Math.sin(r)*n,t},transformMat2:function(t,n,r){var e=n[0],a=n[1];return t[0]=r[0]*e+r[2]*a,t[1]=r[1]*e+r[3]*a,t},transformMat2d:function(t,n,r){var e=n[0],a=n[1];return t[0]=r[0]*e+r[2]*a+r[4],t[1]=r[1]*e+r[3]*a+r[5],t},transformMat3:function(t,n,r){var e=n[0],a=n[1];return t[0]=r[0]*e+r[3]*a+r[6],t[1]=r[1]*e+r[4]*a+r[7],t},transformMat4:function(t,n,r){var e=n[0],a=n[1];return t[0]=r[0]*e+r[4]*a+r[12],t[1]=r[1]*e+r[5]*a+r[13],t},rotate:function(t,n,r,e){var a=n[0]-r[0],u=n[1]-r[1],o=Math.sin(e),i=Math.cos(e);return t[0]=a*i-u*o+r[0],t[1]=a*o+u*i+r[1],t},angle:function(t,n){var r=t[0],e=t[1],a=n[0],u=n[1];return Math.abs(Math.atan2(e*a-r*u,r*a+e*u))},signedAngle:function(t,n){var r=t[0],e=t[1],a=n[0],u=n[1];return Math.atan2(r*u-e*a,r*a+e*u)},zero:function(t){return t[0]=0,t[1]=0,t},str:function(t){return"vec2("+t[0]+", "+t[1]+")"},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]},equals:function(t,n){return v(t[0],n[0])&&v(t[1],n[1])},len:Xn,sub:Bn,mul:Un,div:Cn,dist:Gn,sqrDist:Wn,sqrLen:Hn,forEach:Jn});t.glMatrix=d,t.mat2=q,t.mat2d=O,t.mat3=T,t.mat4=U,t.quat=xn,t.quat2=In,t.vec2=Kn,t.vec3=vt,t.vec4=Ft,Object.defineProperty(t,"__esModule",{value:!0})})); diff --git a/dist/gl-matrix.js b/dist/gl-matrix.js index 100b7b37..2a4f42a6 100644 --- a/dist/gl-matrix.js +++ b/dist/gl-matrix.js @@ -5,7 +5,7 @@ @author Colin MacKenzie IV @version 3.4.4 -Copyright (c) 2015-2025, Brandon Jones, Colin MacKenzie IV. +Copyright (c) 2015-2026, Brandon Jones, Colin MacKenzie IV. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -32,6 +32,77 @@ THE SOFTWARE. (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.glMatrix = {})); })(this, (function (exports) { 'use strict'; + function _assertThisInitialized(e) { + if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return e; + } + function _callSuper(t, o, e) { + return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); + } + function _classCallCheck(a, n) { + if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); + } + function _defineProperties(e, r) { + for (var t = 0; t < r.length; t++) { + var o = r[t]; + o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); + } + } + function _createClass(e, r, t) { + return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { + writable: !1 + }), e; + } + function _getPrototypeOf(t) { + return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { + return t.__proto__ || Object.getPrototypeOf(t); + }, _getPrototypeOf(t); + } + function _inherits(t, e) { + if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); + t.prototype = Object.create(e && e.prototype, { + constructor: { + value: t, + writable: !0, + configurable: !0 + } + }), Object.defineProperty(t, "prototype", { + writable: !1 + }), e && _setPrototypeOf(t, e); + } + function _isNativeReflectConstruct() { + try { + var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + } catch (t) {} + return (_isNativeReflectConstruct = function () { + return !!t; + })(); + } + function _possibleConstructorReturn(t, e) { + if (e && ("object" == typeof e || "function" == typeof e)) return e; + if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); + return _assertThisInitialized(t); + } + function _setPrototypeOf(t, e) { + return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { + return t.__proto__ = e, t; + }, _setPrototypeOf(t, e); + } + function _toPrimitive(t, r) { + if ("object" != typeof t || !t) return t; + var e = t[Symbol.toPrimitive]; + if (void 0 !== e) { + var i = e.call(t, r || "default"); + if ("object" != typeof i) return i; + throw new TypeError("@@toPrimitive must return a primitive value."); + } + return ("string" === r ? String : Number)(t); + } + function _toPropertyKey(t) { + var i = _toPrimitive(t, "string"); + return "symbol" == typeof i ? i : i + ""; + } + /** * Common utilities * @module glMatrix @@ -40,18 +111,18 @@ THE SOFTWARE. // Configuration Constants var EPSILON = 0.000001; var ARRAY_TYPE = typeof Float32Array !== "undefined" ? Float32Array : Array; + // If an array is required to initialize to zero. + var ARRAY_ZERO_INIT_TYPE = ARRAY_TYPE === Array ? _createFastZeroInit(ARRAY_TYPE) : ARRAY_TYPE; var RANDOM = Math.random; var ANGLE_ORDER = "zyx"; /** * Symmetric round - * see https://www.npmjs.com/package/round-half-up-symmetric#user-content-detailed-background * * @param {Number} a value to round */ function round$3(a) { - if (a >= 0) return Math.round(a); - return a % 0.5 === 0 ? Math.floor(a) : Math.round(a); + return Math.round(Math.abs(a)) * Math.sign(a); } /** @@ -61,6 +132,13 @@ THE SOFTWARE. */ function setMatrixArrayType(type) { ARRAY_TYPE = type; + + // If the Array is not a TypedArray, create a constructor that automatically fills it with zeroes. + if (Array.isArray(type)) { + ARRAY_ZERO_INIT_TYPE = _createFastZeroInit(type); + return; + } + ARRAY_ZERO_INIT_TYPE = type; } var degree = Math.PI / 180; var radian = 180 / Math.PI; @@ -98,10 +176,34 @@ THE SOFTWARE. return Math.abs(a - b) <= tolerance * Math.max(1, Math.abs(a), Math.abs(b)); } + /** + * Creates a subclass of an Array-like class that initializes all it's elements to zero. + * @private + * @param {ArrayConstructor} type The Array-like class. + * @returns {ArrayConstructor} The zero-initializer subclass. + */ + function _createFastZeroInit(type) { + return /*#__PURE__*/function (_type) { + function ArrayInitZero() { + var _this; + _classCallCheck(this, ArrayInitZero); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _callSuper(this, ArrayInitZero, [].concat(args)); + _this.fill(0); + return _this; + } + _inherits(ArrayInitZero, _type); + return _createClass(ArrayInitZero); + }(type); + } + var common = /*#__PURE__*/Object.freeze({ __proto__: null, EPSILON: EPSILON, get ARRAY_TYPE () { return ARRAY_TYPE; }, + get ARRAY_ZERO_INIT_TYPE () { return ARRAY_ZERO_INIT_TYPE; }, RANDOM: RANDOM, ANGLE_ORDER: ANGLE_ORDER, round: round$3, @@ -122,11 +224,7 @@ THE SOFTWARE. * @returns {mat2} a new 2x2 matrix */ function create$8() { - var out = new ARRAY_TYPE(4); - if (ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - } + var out = new ARRAY_ZERO_INIT_TYPE(4); out[0] = 1; out[3] = 1; return out; @@ -220,18 +318,11 @@ THE SOFTWARE. * @returns {mat2} out */ function transpose$2(out, a) { - // If we are transposing ourselves we can skip a few steps but have to cache - // some values - if (out === a) { - var a1 = a[1]; - out[1] = a[2]; - out[2] = a1; - } else { - out[0] = a[0]; - out[1] = a[2]; - out[2] = a[1]; - out[3] = a[3]; - } + out[0] = a[0]; + var o1 = a[1]; + out[1] = a[2]; + out[2] = o1; + out[3] = a[3]; return out; } @@ -343,16 +434,12 @@ THE SOFTWARE. * @returns {mat2} out **/ function scale$8(out, a, v) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; var v0 = v[0], v1 = v[1]; - out[0] = a0 * v0; - out[1] = a1 * v0; - out[2] = a2 * v1; - out[3] = a3 * v1; + out[0] = a[0] * v0; + out[1] = a[1] * v0; + out[2] = a[2] * v1; + out[3] = a[3] * v1; return out; } @@ -483,15 +570,7 @@ THE SOFTWARE. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function equals$8(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3]; - return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)); + return equals$9(a[0], b[0]) && equals$9(a[1], b[1]) && equals$9(a[2], b[2]) && equals$9(a[3], b[3]); } /** @@ -594,13 +673,7 @@ THE SOFTWARE. * @returns {mat2d} a new 2x3 matrix */ function create$7() { - var out = new ARRAY_TYPE(6); - if (ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - out[4] = 0; - out[5] = 0; - } + var out = new ARRAY_ZERO_INIT_TYPE(6); out[0] = 1; out[3] = 1; return out; @@ -780,17 +853,15 @@ THE SOFTWARE. var a0 = a[0], a1 = a[1], a2 = a[2], - a3 = a[3], - a4 = a[4], - a5 = a[5]; + a3 = a[3]; var s = Math.sin(rad); var c = Math.cos(rad); out[0] = a0 * c + a2 * s; out[1] = a1 * c + a3 * s; out[2] = a0 * -s + a2 * c; out[3] = a1 * -s + a3 * c; - out[4] = a4; - out[5] = a5; + out[4] = a[4]; + out[5] = a[5]; return out; } @@ -1023,19 +1094,7 @@ THE SOFTWARE. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function equals$7(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3], - a4 = a[4], - a5 = a[5]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3], - b4 = b[4], - b5 = b[5]; - return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)); + return equals$9(a[0], b[0]) && equals$9(a[1], b[1]) && equals$9(a[2], b[2]) && equals$9(a[3], b[3]) && equals$9(a[4], b[4]) && equals$9(a[5], b[5]); } /** @@ -1090,15 +1149,7 @@ THE SOFTWARE. * @returns {mat3} a new 3x3 matrix */ function create$6() { - var out = new ARRAY_TYPE(9); - if (ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[5] = 0; - out[6] = 0; - out[7] = 0; - } + var out = new ARRAY_ZERO_INIT_TYPE(9); out[0] = 1; out[4] = 1; out[8] = 1; @@ -1248,28 +1299,18 @@ THE SOFTWARE. * @returns {mat3} out */ function transpose$1(out, a) { - // If we are transposing ourselves we can skip a few steps but have to cache some values - if (out === a) { - var a01 = a[1], - a02 = a[2], - a12 = a[5]; - out[1] = a[3]; - out[2] = a[6]; - out[3] = a01; - out[5] = a[7]; - out[6] = a02; - out[7] = a12; - } else { - out[0] = a[0]; - out[1] = a[3]; - out[2] = a[6]; - out[3] = a[1]; - out[4] = a[4]; - out[5] = a[7]; - out[6] = a[2]; - out[7] = a[5]; - out[8] = a[8]; - } + var a01 = a[1], + a02 = a[2], + a12 = a[5]; + out[0] = a[0]; + out[1] = a[3]; + out[2] = a[6]; + out[3] = a01; + out[4] = a[4]; + out[5] = a[7]; + out[6] = a02; + out[7] = a12; + out[8] = a[8]; return out; } @@ -1818,25 +1859,7 @@ THE SOFTWARE. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function equals$6(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3], - a4 = a[4], - a5 = a[5], - a6 = a[6], - a7 = a[7], - a8 = a[8]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3], - b4 = b[4], - b5 = b[5], - b6 = b[6], - b7 = b[7], - b8 = b[8]; - return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)); + return equals$9(a[0], b[0]) && equals$9(a[1], b[1]) && equals$9(a[2], b[2]) && equals$9(a[3], b[3]) && equals$9(a[4], b[4]) && equals$9(a[5], b[5]) && equals$9(a[6], b[6]) && equals$9(a[7], b[7]) && equals$9(a[8], b[8]); } /** @@ -1898,21 +1921,7 @@ THE SOFTWARE. * @returns {mat4} a new 4x4 matrix */ function create$5() { - var out = new ARRAY_TYPE(16); - if (ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[6] = 0; - out[7] = 0; - out[8] = 0; - out[9] = 0; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - } + var out = new ARRAY_ZERO_INIT_TYPE(16); out[0] = 1; out[5] = 1; out[10] = 1; @@ -2092,44 +2101,28 @@ THE SOFTWARE. * @returns {mat4} out */ function transpose(out, a) { - // If we are transposing ourselves we can skip a few steps but have to cache some values - if (out === a) { - var a01 = a[1], - a02 = a[2], - a03 = a[3]; - var a12 = a[6], - a13 = a[7]; - var a23 = a[11]; - out[1] = a[4]; - out[2] = a[8]; - out[3] = a[12]; - out[4] = a01; - out[6] = a[9]; - out[7] = a[13]; - out[8] = a02; - out[9] = a12; - out[11] = a[14]; - out[12] = a03; - out[13] = a13; - out[14] = a23; - } else { - out[0] = a[0]; - out[1] = a[4]; - out[2] = a[8]; - out[3] = a[12]; - out[4] = a[1]; - out[5] = a[5]; - out[6] = a[9]; - out[7] = a[13]; - out[8] = a[2]; - out[9] = a[6]; - out[10] = a[10]; - out[11] = a[14]; - out[12] = a[3]; - out[13] = a[7]; - out[14] = a[11]; - out[15] = a[15]; - } + var a01 = a[1], + a02 = a[2], + a03 = a[3]; + var a12 = a[6], + a13 = a[7]; + var a23 = a[11]; + out[0] = a[0]; + out[1] = a[4]; + out[2] = a[8]; + out[3] = a[12]; + out[4] = a01; + out[5] = a[5]; + out[6] = a[9]; + out[7] = a[13]; + out[8] = a02; + out[9] = a12; + out[10] = a[10]; + out[11] = a[14]; + out[12] = a03; + out[13] = a13; + out[14] = a23; + out[15] = a[15]; return out; } @@ -3800,39 +3793,7 @@ THE SOFTWARE. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function equals$5(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; - var a4 = a[4], - a5 = a[5], - a6 = a[6], - a7 = a[7]; - var a8 = a[8], - a9 = a[9], - a10 = a[10], - a11 = a[11]; - var a12 = a[12], - a13 = a[13], - a14 = a[14], - a15 = a[15]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3]; - var b4 = b[4], - b5 = b[5], - b6 = b[6], - b7 = b[7]; - var b8 = b[8], - b9 = b[9], - b10 = b[10], - b11 = b[11]; - var b12 = b[12], - b13 = b[13], - b14 = b[14], - b15 = b[15]; - return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15)); + return equals$9(a[0], b[0]) && equals$9(a[1], b[1]) && equals$9(a[2], b[2]) && equals$9(a[3], b[3]) && equals$9(a[4], b[4]) && equals$9(a[5], b[5]) && equals$9(a[6], b[6]) && equals$9(a[7], b[7]) && equals$9(a[8], b[8]) && equals$9(a[9], b[9]) && equals$9(a[10], b[10]) && equals$9(a[11], b[11]) && equals$9(a[12], b[12]) && equals$9(a[13], b[13]) && equals$9(a[14], b[14]) && equals$9(a[15], b[15]); } /** @@ -3914,13 +3875,7 @@ THE SOFTWARE. * @returns {vec3} a new 3D vector */ function create$4() { - var out = new ARRAY_TYPE(3); - if (ARRAY_TYPE != Float32Array) { - out[0] = 0; - out[1] = 0; - out[2] = 0; - } - return out; + return new ARRAY_ZERO_INIT_TYPE(3); } /** @@ -3944,10 +3899,7 @@ THE SOFTWARE. * @returns {Number} length of a */ function length$4(a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - return Math.sqrt(x * x + y * y + z * z); + return Math.hypot(a[0], a[1], a[2]); } /** @@ -4167,10 +4119,7 @@ THE SOFTWARE. * @returns {Number} distance between a and b */ function distance$2(a, b) { - var x = b[0] - a[0]; - var y = b[1] - a[1]; - var z = b[2] - a[2]; - return Math.sqrt(x * x + y * y + z * z); + return Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2]); } /** @@ -4181,10 +4130,7 @@ THE SOFTWARE. * @returns {Number} squared distance between a and b */ function squaredDistance$2(a, b) { - var x = b[0] - a[0]; - var y = b[1] - a[1]; - var z = b[2] - a[2]; - return x * x + y * y + z * z; + return Math.pow(Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2]), 2); } /** @@ -4194,10 +4140,7 @@ THE SOFTWARE. * @returns {Number} squared length of a */ function squaredLength$4(a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - return x * x + y * y + z * z; + return Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2); } /** @@ -4236,17 +4179,10 @@ THE SOFTWARE. * @returns {vec3} out */ function normalize$4(out, a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - var len = x * x + y * y + z * z; - if (len > 0) { - //TODO: evaluate use of glm_invsqrt here? - len = 1 / Math.sqrt(len); - } - out[0] = a[0] * len; - out[1] = a[1] * len; - out[2] = a[2] * len; + var len = Math.max(Math.hypot(a[0], a[1], a[2]), EPSILON); + out[0] = a[0] / len; + out[1] = a[1] / len; + out[2] = a[2] / len; return out; } @@ -4376,8 +4312,8 @@ THE SOFTWARE. * @param {Number} [scale] Length of the resulting vector. If omitted, a unit vector will be returned * @returns {vec3} out */ - function random$3(out, scale) { - scale = scale === undefined ? 1.0 : scale; + function random$3(out) { + var scale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1.0; var r = RANDOM() * 2.0 * Math.PI; var z = RANDOM() * 2.0 - 1.0; var zScale = Math.sqrt(1.0 - z * z) * scale; @@ -4608,13 +4544,7 @@ THE SOFTWARE. * @returns {Boolean} True if the vectors are equal, false otherwise. */ function equals$4(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2]; - var b0 = b[0], - b1 = b[1], - b2 = b[2]; - return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)); + return equals$9(a[0], b[0]) && equals$9(a[1], b[1]) && equals$9(a[2], b[2]); } /** @@ -4673,14 +4603,13 @@ THE SOFTWARE. */ var forEach$2 = function () { var vec = create$4(); - return function (a, stride, offset, count, fn, arg) { + return function (a, stride) { + var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; + var count = arguments.length > 3 ? arguments[3] : undefined; + var fn = arguments.length > 4 ? arguments[4] : undefined; + var arg = arguments.length > 5 ? arguments[5] : undefined; var i, l; - if (!stride) { - stride = 3; - } - if (!offset) { - offset = 0; - } + stride = stride || 3; if (count) { l = Math.min(count * stride + offset, a.length); } else { @@ -4763,14 +4692,7 @@ THE SOFTWARE. * @returns {vec4} a new 4D vector */ function create$3() { - var out = new ARRAY_TYPE(4); - if (ARRAY_TYPE != Float32Array) { - out[0] = 0; - out[1] = 0; - out[2] = 0; - out[3] = 0; - } - return out; + return new ARRAY_ZERO_INIT_TYPE(4); } /** @@ -5021,11 +4943,7 @@ THE SOFTWARE. * @returns {Number} distance between a and b */ function distance$1(a, b) { - var x = b[0] - a[0]; - var y = b[1] - a[1]; - var z = b[2] - a[2]; - var w = b[3] - a[3]; - return Math.sqrt(x * x + y * y + z * z + w * w); + return Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2], b[3] - a[3]); } /** @@ -5036,11 +4954,7 @@ THE SOFTWARE. * @returns {Number} squared distance between a and b */ function squaredDistance$1(a, b) { - var x = b[0] - a[0]; - var y = b[1] - a[1]; - var z = b[2] - a[2]; - var w = b[3] - a[3]; - return x * x + y * y + z * z + w * w; + return Math.pow(Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2], b[3] - a[3]), 2); } /** @@ -5050,11 +4964,7 @@ THE SOFTWARE. * @returns {Number} length of a */ function length$3(a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - var w = a[3]; - return Math.sqrt(x * x + y * y + z * z + w * w); + return Math.hypot(a[0], a[1], a[2], a[3]); } /** @@ -5064,11 +4974,7 @@ THE SOFTWARE. * @returns {Number} squared length of a */ function squaredLength$3(a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - var w = a[3]; - return x * x + y * y + z * z + w * w; + return Math.pow(Math.hypot(a[0], a[1], a[2], a[3]), 2); } /** @@ -5109,18 +5015,15 @@ THE SOFTWARE. * @returns {vec4} out */ function normalize$3(out, a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - var w = a[3]; - var len = x * x + y * y + z * z + w * w; - if (len > 0) { - len = 1 / Math.sqrt(len); - } - out[0] = x * len; - out[1] = y * len; - out[2] = z * len; - out[3] = w * len; + var x = a[0], + y = a[1], + z = a[2], + w = a[3]; + var len = Math.max(Math.hypot(x, y, z, w), EPSILON); + out[0] = x / len; + out[1] = y / len; + out[2] = z / len; + out[3] = w / len; return out; } @@ -5316,15 +5219,7 @@ THE SOFTWARE. * @returns {Boolean} True if the vectors are equal, false otherwise. */ function equals$3(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3]; - return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)); + return equals$9(a[0], b[0]) && equals$9(a[1], b[1]) && equals$9(a[2], b[2]) && equals$9(a[3], b[3]); } /** @@ -5383,14 +5278,13 @@ THE SOFTWARE. */ var forEach$1 = function () { var vec = create$3(); - return function (a, stride, offset, count, fn, arg) { + return function (a, stride) { + var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; + var count = arguments.length > 3 ? arguments[3] : undefined; + var fn = arguments.length > 4 ? arguments[4] : undefined; + var arg = arguments.length > 5 ? arguments[5] : undefined; var i, l; - if (!stride) { - stride = 4; - } - if (!offset) { - offset = 0; - } + stride = stride || 4; if (count) { l = Math.min(count * stride + offset, a.length); } else { @@ -7120,12 +7014,7 @@ THE SOFTWARE. * @returns {vec2} a new 2D vector */ function create() { - var out = new ARRAY_TYPE(2); - if (ARRAY_TYPE != Float32Array) { - out[0] = 0; - out[1] = 0; - } - return out; + return new ARRAY_ZERO_INIT_TYPE(2); } /** @@ -7342,9 +7231,7 @@ THE SOFTWARE. * @returns {Number} distance between a and b */ function distance(a, b) { - var x = b[0] - a[0], - y = b[1] - a[1]; - return Math.sqrt(x * x + y * y); + return Math.hypot(b[0] - a[0], b[1] - a[1]); } /** @@ -7367,9 +7254,7 @@ THE SOFTWARE. * @returns {Number} length of a */ function length(a) { - var x = a[0], - y = a[1]; - return Math.sqrt(x * x + y * y); + return Math.hypot(a[0], a[1]); } /** @@ -7418,15 +7303,9 @@ THE SOFTWARE. * @returns {vec2} out */ function normalize(out, a) { - var x = a[0], - y = a[1]; - var len = x * x + y * y; - if (len > 0) { - //TODO: evaluate use of glm_invsqrt here? - len = 1 / Math.sqrt(len); - } - out[0] = a[0] * len; - out[1] = a[1] * len; + var len = Math.max(Math.hypot(a[0], a[1]), EPSILON); + out[0] = a[0] / len; + out[1] = a[1] / len; return out; } @@ -7481,8 +7360,8 @@ THE SOFTWARE. * @param {Number} [scale] Length of the resulting vector. If omitted, a unit vector will be returned * @returns {vec2} out */ - function random(out, scale) { - scale = scale === undefined ? 1.0 : scale; + function random(out) { + var scale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1.0; var r = RANDOM() * 2.0 * Math.PI; out[0] = Math.cos(r) * scale; out[1] = Math.sin(r) * scale; @@ -7593,7 +7472,7 @@ THE SOFTWARE. /** * Get the signed angle in the interval [-pi,pi] between two 2D vectors (positive if `a` is to the right of `b`) - * + * * @param {ReadonlyVec2} a The first vector * @param {ReadonlyVec2} b The second vector * @returns {number} The signed angle in radians @@ -7647,11 +7526,7 @@ THE SOFTWARE. * @returns {Boolean} True if the vectors are equal, false otherwise. */ function equals(a, b) { - var a0 = a[0], - a1 = a[1]; - var b0 = b[0], - b1 = b[1]; - return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)); + return equals$9(a[0], b[0]) && equals$9(a[1], b[1]); } /** @@ -7710,14 +7585,13 @@ THE SOFTWARE. */ var forEach = function () { var vec = create(); - return function (a, stride, offset, count, fn, arg) { + return function (a, stride) { + var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; + var count = arguments.length > 3 ? arguments[3] : undefined; + var fn = arguments.length > 4 ? arguments[4] : undefined; + var arg = arguments.length > 5 ? arguments[5] : undefined; var i, l; - if (!stride) { - stride = 2; - } - if (!offset) { - offset = 0; - } + stride = stride || 2; if (count) { l = Math.min(count * stride + offset, a.length); } else { diff --git a/src/common.js b/src/common.js index 37233c59..005bbf0d 100644 --- a/src/common.js +++ b/src/common.js @@ -7,20 +7,18 @@ export const EPSILON = 0.000001; export let ARRAY_TYPE = typeof Float32Array !== "undefined" ? Float32Array : Array; +// If an array is required to initialize to zero. +export let ARRAY_ZERO_INIT_TYPE = ARRAY_TYPE === Array ? _createFastZeroInit(ARRAY_TYPE) : ARRAY_TYPE; export let RANDOM = Math.random; export let ANGLE_ORDER = "zyx"; /** * Symmetric round - * see https://www.npmjs.com/package/round-half-up-symmetric#user-content-detailed-background * * @param {Number} a value to round */ export function round(a) { - if (a >= 0) - return Math.round(a); - - return (a % 0.5 === 0) ? Math.floor(a) : Math.round(a); + return Math.round(Math.abs(a)) * Math.sign(a); } /** @@ -29,7 +27,15 @@ export function round(a) { * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array */ export function setMatrixArrayType(type) { - ARRAY_TYPE = type; + + ARRAY_TYPE = type; + + // If the Array is not a TypedArray, create a constructor that automatically fills it with zeroes. + if (Array.isArray(type)) { + ARRAY_ZERO_INIT_TYPE = _createFastZeroInit(type); + return; + } + ARRAY_ZERO_INIT_TYPE = type; } const degree = Math.PI / 180; @@ -67,3 +73,20 @@ export function toDegree(a) { export function equals(a, b, tolerance = EPSILON) { return Math.abs(a - b) <= tolerance * Math.max(1, Math.abs(a), Math.abs(b)); } + + + +/** + * Creates a subclass of an Array-like class that initializes all it's elements to zero. + * @private + * @param {ArrayConstructor} type The Array-like class. + * @returns {ArrayConstructor} The zero-initializer subclass. + */ +function _createFastZeroInit(type) { + return class ArrayInitZero extends type { + constructor(...args) { + super(...args); + this.fill(0); + } + } +} diff --git a/src/mat2.js b/src/mat2.js index 2a8cd39f..e74883ae 100644 --- a/src/mat2.js +++ b/src/mat2.js @@ -11,11 +11,7 @@ import * as glMatrix from "./common.js"; * @returns {mat2} a new 2x2 matrix */ export function create() { - let out = new glMatrix.ARRAY_TYPE(4); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - } + let out = new glMatrix.ARRAY_ZERO_INIT_TYPE(4); out[0] = 1; out[3] = 1; return out; @@ -109,19 +105,11 @@ export function set(out, m00, m01, m10, m11) { * @returns {mat2} out */ export function transpose(out, a) { - // If we are transposing ourselves we can skip a few steps but have to cache - // some values - if (out === a) { - let a1 = a[1]; - out[1] = a[2]; - out[2] = a1; - } else { - out[0] = a[0]; - out[1] = a[2]; - out[2] = a[1]; - out[3] = a[3]; - } - + out[0] = a[0]; + let o1 = a[1]; + out[1] = a[2]; + out[2] = o1; + out[3] = a[3]; return out; } @@ -237,16 +225,12 @@ export function rotate(out, a, rad) { * @returns {mat2} out **/ export function scale(out, a, v) { - let a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; let v0 = v[0], v1 = v[1]; - out[0] = a0 * v0; - out[1] = a1 * v0; - out[2] = a2 * v1; - out[3] = a3 * v1; + out[0] = a[0] * v0; + out[1] = a[1] * v0; + out[2] = a[2] * v1; + out[3] = a[3] * v1; return out; } @@ -377,24 +361,12 @@ export function exactEquals(a, b) { * @returns {Boolean} True if the matrices are equal, false otherwise. */ export function equals(a, b) { - let a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; - let b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3]; return ( - Math.abs(a0 - b0) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && - Math.abs(a1 - b1) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && - Math.abs(a2 - b2) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && - Math.abs(a3 - b3) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) - ); + glMatrix.equals(a[0], b[0]) && + glMatrix.equals(a[1], b[1]) && + glMatrix.equals(a[2], b[2]) && + glMatrix.equals(a[3], b[3]) + ); } /** diff --git a/src/mat2d.js b/src/mat2d.js index fce8aabd..f630c29c 100644 --- a/src/mat2d.js +++ b/src/mat2d.js @@ -25,13 +25,7 @@ import * as glMatrix from "./common.js"; * @returns {mat2d} a new 2x3 matrix */ export function create() { - let out = new glMatrix.ARRAY_TYPE(6); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - out[4] = 0; - out[5] = 0; - } + let out = new glMatrix.ARRAY_ZERO_INIT_TYPE(6); out[0] = 1; out[3] = 1; return out; @@ -213,17 +207,15 @@ export function rotate(out, a, rad) { let a0 = a[0], a1 = a[1], a2 = a[2], - a3 = a[3], - a4 = a[4], - a5 = a[5]; + a3 = a[3]; let s = Math.sin(rad); let c = Math.cos(rad); out[0] = a0 * c + a2 * s; out[1] = a1 * c + a3 * s; out[2] = a0 * -s + a2 * c; out[3] = a1 * -s + a3 * c; - out[4] = a4; - out[5] = a5; + out[4] = a[4]; + out[5] = a[5]; return out; } @@ -477,31 +469,13 @@ export function exactEquals(a, b) { * @returns {Boolean} True if the matrices are equal, false otherwise. */ export function equals(a, b) { - let a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3], - a4 = a[4], - a5 = a[5]; - let b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3], - b4 = b[4], - b5 = b[5]; return ( - Math.abs(a0 - b0) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && - Math.abs(a1 - b1) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && - Math.abs(a2 - b2) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && - Math.abs(a3 - b3) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && - Math.abs(a4 - b4) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && - Math.abs(a5 - b5) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) + glMatrix.equals(a[0], b[0]) && + glMatrix.equals(a[1], b[1]) && + glMatrix.equals(a[2], b[2]) && + glMatrix.equals(a[3], b[3]) && + glMatrix.equals(a[4], b[4]) && + glMatrix.equals(a[5], b[5]) ); } diff --git a/src/mat3.js b/src/mat3.js index 2a966eaa..3e42a85d 100644 --- a/src/mat3.js +++ b/src/mat3.js @@ -11,15 +11,7 @@ import * as glMatrix from "./common.js"; * @returns {mat3} a new 3x3 matrix */ export function create() { - let out = new glMatrix.ARRAY_TYPE(9); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[5] = 0; - out[6] = 0; - out[7] = 0; - } + let out = new glMatrix.ARRAY_ZERO_INIT_TYPE(9); out[0] = 1; out[4] = 1; out[8] = 1; @@ -169,28 +161,18 @@ export function identity(out) { * @returns {mat3} out */ export function transpose(out, a) { - // If we are transposing ourselves we can skip a few steps but have to cache some values - if (out === a) { - let a01 = a[1], - a02 = a[2], - a12 = a[5]; - out[1] = a[3]; - out[2] = a[6]; - out[3] = a01; - out[5] = a[7]; - out[6] = a02; - out[7] = a12; - } else { - out[0] = a[0]; - out[1] = a[3]; - out[2] = a[6]; - out[3] = a[1]; - out[4] = a[4]; - out[5] = a[7]; - out[6] = a[2]; - out[7] = a[5]; - out[8] = a[8]; - } + let a01 = a[1], + a02 = a[2], + a12 = a[5]; + out[0] = a[0]; + out[1] = a[3]; + out[2] = a[6]; + out[3] = a01; + out[4] = a[4]; + out[5] = a[7]; + out[6] = a02; + out[7] = a12; + out[8] = a[8]; return out; } @@ -700,10 +682,10 @@ export function frob(a) { a[2] * a[2] + a[3] * a[3] + a[4] * a[4] + - a[5] * a[5] + - a[6] * a[6] + - a[7] * a[7] + - a[8] * a[8] + a[5] * a[5] + + a[6] * a[6] + + a[7] * a[7] + + a[8] * a[8] ); } @@ -821,43 +803,16 @@ export function exactEquals(a, b) { * @returns {Boolean} True if the matrices are equal, false otherwise. */ export function equals(a, b) { - let a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3], - a4 = a[4], - a5 = a[5], - a6 = a[6], - a7 = a[7], - a8 = a[8]; - let b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3], - b4 = b[4], - b5 = b[5], - b6 = b[6], - b7 = b[7], - b8 = b[8]; return ( - Math.abs(a0 - b0) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && - Math.abs(a1 - b1) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && - Math.abs(a2 - b2) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && - Math.abs(a3 - b3) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && - Math.abs(a4 - b4) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && - Math.abs(a5 - b5) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && - Math.abs(a6 - b6) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && - Math.abs(a7 - b7) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && - Math.abs(a8 - b8) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) + glMatrix.equals(a[0], b[0]) && + glMatrix.equals(a[1], b[1]) && + glMatrix.equals(a[2], b[2]) && + glMatrix.equals(a[3], b[3]) && + glMatrix.equals(a[4], b[4]) && + glMatrix.equals(a[5], b[5]) && + glMatrix.equals(a[6], b[6]) && + glMatrix.equals(a[7], b[7]) && + glMatrix.equals(a[8], b[8]) ); } diff --git a/src/mat4.js b/src/mat4.js index 206f7680..318b7905 100644 --- a/src/mat4.js +++ b/src/mat4.js @@ -11,21 +11,7 @@ import * as glMatrix from "./common.js"; * @returns {mat4} a new 4x4 matrix */ export function create() { - let out = new glMatrix.ARRAY_TYPE(16); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[6] = 0; - out[7] = 0; - out[8] = 0; - out[9] = 0; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - } + let out = new glMatrix.ARRAY_ZERO_INIT_TYPE(16); out[0] = 1; out[5] = 1; out[10] = 1; @@ -240,45 +226,29 @@ export function identity(out) { * @returns {mat4} out */ export function transpose(out, a) { - // If we are transposing ourselves we can skip a few steps but have to cache some values - if (out === a) { - let a01 = a[1], - a02 = a[2], - a03 = a[3]; - let a12 = a[6], - a13 = a[7]; - let a23 = a[11]; - - out[1] = a[4]; - out[2] = a[8]; - out[3] = a[12]; - out[4] = a01; - out[6] = a[9]; - out[7] = a[13]; - out[8] = a02; - out[9] = a12; - out[11] = a[14]; - out[12] = a03; - out[13] = a13; - out[14] = a23; - } else { - out[0] = a[0]; - out[1] = a[4]; - out[2] = a[8]; - out[3] = a[12]; - out[4] = a[1]; - out[5] = a[5]; - out[6] = a[9]; - out[7] = a[13]; - out[8] = a[2]; - out[9] = a[6]; - out[10] = a[10]; - out[11] = a[14]; - out[12] = a[3]; - out[13] = a[7]; - out[14] = a[11]; - out[15] = a[15]; - } + let a01 = a[1], + a02 = a[2], + a03 = a[3]; + let a12 = a[6], + a13 = a[7]; + let a23 = a[11]; + + out[0] = a[0]; + out[1] = a[4]; + out[2] = a[8]; + out[3] = a[12]; + out[4] = a01; + out[5] = a[5]; + out[6] = a[9]; + out[7] = a[13]; + out[8] = a02; + out[9] = a12; + out[10] = a[10]; + out[11] = a[14]; + out[12] = a03; + out[13] = a13; + out[14] = a23; + out[15] = a[15]; return out; } @@ -2097,73 +2067,23 @@ export function exactEquals(a, b) { * @returns {Boolean} True if the matrices are equal, false otherwise. */ export function equals(a, b) { - let a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; - let a4 = a[4], - a5 = a[5], - a6 = a[6], - a7 = a[7]; - let a8 = a[8], - a9 = a[9], - a10 = a[10], - a11 = a[11]; - let a12 = a[12], - a13 = a[13], - a14 = a[14], - a15 = a[15]; - - let b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3]; - let b4 = b[4], - b5 = b[5], - b6 = b[6], - b7 = b[7]; - let b8 = b[8], - b9 = b[9], - b10 = b[10], - b11 = b[11]; - let b12 = b[12], - b13 = b[13], - b14 = b[14], - b15 = b[15]; - return ( - Math.abs(a0 - b0) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && - Math.abs(a1 - b1) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && - Math.abs(a2 - b2) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && - Math.abs(a3 - b3) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && - Math.abs(a4 - b4) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && - Math.abs(a5 - b5) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && - Math.abs(a6 - b6) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && - Math.abs(a7 - b7) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && - Math.abs(a8 - b8) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && - Math.abs(a9 - b9) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && - Math.abs(a10 - b10) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && - Math.abs(a11 - b11) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && - Math.abs(a12 - b12) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && - Math.abs(a13 - b13) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && - Math.abs(a14 - b14) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && - Math.abs(a15 - b15) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15)) + glMatrix.equals(a[0], b[0]) && + glMatrix.equals(a[1], b[1]) && + glMatrix.equals(a[2], b[2]) && + glMatrix.equals(a[3], b[3]) && + glMatrix.equals(a[4], b[4]) && + glMatrix.equals(a[5], b[5]) && + glMatrix.equals(a[6], b[6]) && + glMatrix.equals(a[7], b[7]) && + glMatrix.equals(a[8], b[8]) && + glMatrix.equals(a[9], b[9]) && + glMatrix.equals(a[10], b[10]) && + glMatrix.equals(a[11], b[11]) && + glMatrix.equals(a[12], b[12]) && + glMatrix.equals(a[13], b[13]) && + glMatrix.equals(a[14], b[14]) && + glMatrix.equals(a[15], b[15]) ); } diff --git a/src/vec2.js b/src/vec2.js index 76b851a8..09f8dd1d 100644 --- a/src/vec2.js +++ b/src/vec2.js @@ -5,18 +5,15 @@ import * as glMatrix from "./common.js"; * @module vec2 */ + + /** * Creates a new, empty vec2 * * @returns {vec2} a new 2D vector */ export function create() { - let out = new glMatrix.ARRAY_TYPE(2); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[0] = 0; - out[1] = 0; - } - return out; + return new glMatrix.ARRAY_ZERO_INIT_TYPE(2); } /** @@ -233,9 +230,7 @@ export function scaleAndAdd(out, a, b, scale) { * @returns {Number} distance between a and b */ export function distance(a, b) { - var x = b[0] - a[0], - y = b[1] - a[1]; - return Math.sqrt(x * x + y * y); + return Math.hypot(b[0] - a[0], b[1] - a[1]); } /** @@ -258,9 +253,7 @@ export function squaredDistance(a, b) { * @returns {Number} length of a */ export function length(a) { - var x = a[0], - y = a[1]; - return Math.sqrt(x * x + y * y); + return Math.hypot(a[0], a[1]); } /** @@ -309,16 +302,11 @@ export function inverse(out, a) { * @returns {vec2} out */ export function normalize(out, a) { - var x = a[0], - y = a[1]; - var len = x * x + y * y; - if (len > 0) { - //TODO: evaluate use of glm_invsqrt here? - len = 1 / Math.sqrt(len); - } - out[0] = a[0] * len; - out[1] = a[1] * len; - return out; + const len = Math.max(Math.hypot(a[0], a[1]), glMatrix.EPSILON); + + out[0] = a[0] / len; + out[1] = a[1] / len; + return out; } /** @@ -372,8 +360,7 @@ export function lerp(out, a, b, t) { * @param {Number} [scale] Length of the resulting vector. If omitted, a unit vector will be returned * @returns {vec2} out */ -export function random(out, scale) { - scale = scale === undefined ? 1.0 : scale; +export function random(out, scale = 1.0) { var r = glMatrix.RANDOM() * 2.0 * Math.PI; out[0] = Math.cos(r) * scale; out[1] = Math.sin(r) * scale; @@ -483,7 +470,7 @@ export function angle(a, b) { /** * Get the signed angle in the interval [-pi,pi] between two 2D vectors (positive if `a` is to the right of `b`) - * + * * @param {ReadonlyVec2} a The first vector * @param {ReadonlyVec2} b The second vector * @returns {number} The signed angle in radians @@ -536,15 +523,9 @@ export function exactEquals(a, b) { * @returns {Boolean} True if the vectors are equal, false otherwise. */ export function equals(a, b) { - let a0 = a[0], - a1 = a[1]; - let b0 = b[0], - b1 = b[1]; return ( - Math.abs(a0 - b0) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && - Math.abs(a1 - b1) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) + glMatrix.equals(a[0], b[0]) && + glMatrix.equals(a[1], b[1]) ); } @@ -605,15 +586,9 @@ export const sqrLen = squaredLength; export const forEach = (function() { let vec = create(); - return function(a, stride, offset, count, fn, arg) { + return function(a, stride, offset = 0, count, fn, arg) { let i, l; - if (!stride) { - stride = 2; - } - - if (!offset) { - offset = 0; - } + stride = stride || 2; if (count) { l = Math.min(count * stride + offset, a.length); diff --git a/src/vec3.js b/src/vec3.js index c54c5fab..38a3a964 100644 --- a/src/vec3.js +++ b/src/vec3.js @@ -11,13 +11,7 @@ import * as glMatrix from "./common.js"; * @returns {vec3} a new 3D vector */ export function create() { - let out = new glMatrix.ARRAY_TYPE(3); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[0] = 0; - out[1] = 0; - out[2] = 0; - } - return out; + return new glMatrix.ARRAY_ZERO_INIT_TYPE(3); } /** @@ -41,10 +35,7 @@ export function clone(a) { * @returns {Number} length of a */ export function length(a) { - let x = a[0]; - let y = a[1]; - let z = a[2]; - return Math.sqrt(x * x + y * y + z * z); + return Math.hypot(a[0], a[1], a[2]); } /** @@ -264,10 +255,7 @@ export function scaleAndAdd(out, a, b, scale) { * @returns {Number} distance between a and b */ export function distance(a, b) { - let x = b[0] - a[0]; - let y = b[1] - a[1]; - let z = b[2] - a[2]; - return Math.sqrt(x * x + y * y + z * z); + return Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2]); } /** @@ -278,10 +266,7 @@ export function distance(a, b) { * @returns {Number} squared distance between a and b */ export function squaredDistance(a, b) { - let x = b[0] - a[0]; - let y = b[1] - a[1]; - let z = b[2] - a[2]; - return x * x + y * y + z * z; + return Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2]) ** 2; } /** @@ -291,10 +276,7 @@ export function squaredDistance(a, b) { * @returns {Number} squared length of a */ export function squaredLength(a) { - let x = a[0]; - let y = a[1]; - let z = a[2]; - return x * x + y * y + z * z; + return a[0] ** 2 + a[1] ** 2 + a[2] ** 2; } /** @@ -333,17 +315,10 @@ export function inverse(out, a) { * @returns {vec3} out */ export function normalize(out, a) { - let x = a[0]; - let y = a[1]; - let z = a[2]; - let len = x * x + y * y + z * z; - if (len > 0) { - //TODO: evaluate use of glm_invsqrt here? - len = 1 / Math.sqrt(len); - } - out[0] = a[0] * len; - out[1] = a[1] * len; - out[2] = a[2] * len; + let len = Math.max(Math.hypot(a[0], a[1], a[2]), glMatrix.EPSILON); + out[0] = a[0] / len; + out[1] = a[1] / len; + out[2] = a[2] / len; return out; } @@ -480,9 +455,7 @@ export function bezier(out, a, b, c, d, t) { * @param {Number} [scale] Length of the resulting vector. If omitted, a unit vector will be returned * @returns {vec3} out */ -export function random(out, scale) { - scale = scale === undefined ? 1.0 : scale; - +export function random(out, scale = 1.0) { let r = glMatrix.RANDOM() * 2.0 * Math.PI; let z = glMatrix.RANDOM() * 2.0 - 1.0; let zScale = Math.sqrt(1.0 - z * z) * scale; @@ -720,19 +693,10 @@ export function exactEquals(a, b) { * @returns {Boolean} True if the vectors are equal, false otherwise. */ export function equals(a, b) { - let a0 = a[0], - a1 = a[1], - a2 = a[2]; - let b0 = b[0], - b1 = b[1], - b2 = b[2]; return ( - Math.abs(a0 - b0) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && - Math.abs(a1 - b1) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && - Math.abs(a2 - b2) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) + glMatrix.equals(a[0], b[0]) && + glMatrix.equals(a[1], b[1]) && + glMatrix.equals(a[2], b[2]) ); } @@ -793,15 +757,9 @@ export const sqrLen = squaredLength; export const forEach = (function () { let vec = create(); - return function (a, stride, offset, count, fn, arg) { + return function (a, stride, offset = 0, count, fn, arg) { let i, l; - if (!stride) { - stride = 3; - } - - if (!offset) { - offset = 0; - } + stride = stride || 3; if (count) { l = Math.min(count * stride + offset, a.length); diff --git a/src/vec4.js b/src/vec4.js index 6044df0a..688a5ce7 100644 --- a/src/vec4.js +++ b/src/vec4.js @@ -11,14 +11,7 @@ import * as glMatrix from "./common.js"; * @returns {vec4} a new 4D vector */ export function create() { - let out = new glMatrix.ARRAY_TYPE(4); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[0] = 0; - out[1] = 0; - out[2] = 0; - out[3] = 0; - } - return out; + return new glMatrix.ARRAY_ZERO_INIT_TYPE(4); } /** @@ -269,11 +262,7 @@ export function scaleAndAdd(out, a, b, scale) { * @returns {Number} distance between a and b */ export function distance(a, b) { - let x = b[0] - a[0]; - let y = b[1] - a[1]; - let z = b[2] - a[2]; - let w = b[3] - a[3]; - return Math.sqrt(x * x + y * y + z * z + w * w); + return Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2], b[3] - a[3]); } /** @@ -284,11 +273,7 @@ export function distance(a, b) { * @returns {Number} squared distance between a and b */ export function squaredDistance(a, b) { - let x = b[0] - a[0]; - let y = b[1] - a[1]; - let z = b[2] - a[2]; - let w = b[3] - a[3]; - return x * x + y * y + z * z + w * w; + return Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2], b[3] - a[3]) ** 2; } /** @@ -298,11 +283,7 @@ export function squaredDistance(a, b) { * @returns {Number} length of a */ export function length(a) { - let x = a[0]; - let y = a[1]; - let z = a[2]; - let w = a[3]; - return Math.sqrt(x * x + y * y + z * z + w * w); + return Math.hypot(a[0], a[1], a[2], a[3]);; } /** @@ -312,11 +293,7 @@ export function length(a) { * @returns {Number} squared length of a */ export function squaredLength(a) { - let x = a[0]; - let y = a[1]; - let z = a[2]; - let w = a[3]; - return x * x + y * y + z * z + w * w; + return Math.hypot(a[0], a[1], a[2], a[3]) ** 2; } /** @@ -357,18 +334,15 @@ export function inverse(out, a) { * @returns {vec4} out */ export function normalize(out, a) { - let x = a[0]; - let y = a[1]; - let z = a[2]; - let w = a[3]; - let len = x * x + y * y + z * z + w * w; - if (len > 0) { - len = 1 / Math.sqrt(len); - } - out[0] = x * len; - out[1] = y * len; - out[2] = z * len; - out[3] = w * len; + let x = a[0], + y = a[1], + z = a[2], + w = a[3]; + let len = Math.max(Math.hypot(x, y, z, w), glMatrix.EPSILON); + out[0] = x / len; + out[1] = y / len; + out[2] = z / len; + out[3] = w / len; return out; } @@ -571,23 +545,11 @@ export function exactEquals(a, b) { * @returns {Boolean} True if the vectors are equal, false otherwise. */ export function equals(a, b) { - let a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; - let b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3]; return ( - Math.abs(a0 - b0) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && - Math.abs(a1 - b1) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && - Math.abs(a2 - b2) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && - Math.abs(a3 - b3) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) + glMatrix.equals(a[0], b[0]) && + glMatrix.equals(a[1], b[1]) && + glMatrix.equals(a[2], b[2]) && + glMatrix.equals(a[3], b[3]) ); } @@ -648,15 +610,9 @@ export const sqrLen = squaredLength; export const forEach = (function() { let vec = create(); - return function(a, stride, offset, count, fn, arg) { + return function(a, stride, offset = 0, count, fn, arg) { let i, l; - if (!stride) { - stride = 4; - } - - if (!offset) { - offset = 0; - } + stride = stride || 4; if (count) { l = Math.min(count * stride + offset, a.length); From 4e835d50a913bc61acb339d75f34f55ab32efb4f Mon Sep 17 00:00:00 2001 From: solarunes Date: Thu, 1 Jan 2026 20:41:41 +0100 Subject: [PATCH 2/4] various performance improvements --- .size-snapshot.json | 6 +- LICENSE.md | 2 +- dist/esm/common.js | 49 +++- dist/esm/mat2.js | 45 +--- dist/esm/mat2d.js | 30 +-- dist/esm/mat3.js | 64 ++--- dist/esm/mat4.js | 110 ++------- dist/esm/vec2.js | 52 ++-- dist/esm/vec3.js | 68 ++---- dist/esm/vec4.js | 78 ++---- dist/gl-matrix-min.js | 4 +- dist/gl-matrix.js | 556 ++++++++++++++++-------------------------- src/common.js | 35 ++- src/mat2.js | 58 ++--- src/mat2d.js | 46 +--- src/mat3.js | 97 ++------ src/mat4.js | 160 +++--------- src/vec2.js | 57 ++--- src/vec3.js | 72 ++---- src/vec4.js | 84 ++----- 20 files changed, 548 insertions(+), 1125 deletions(-) diff --git a/.size-snapshot.json b/.size-snapshot.json index dc939dfa..243c9eed 100644 --- a/.size-snapshot.json +++ b/.size-snapshot.json @@ -10,8 +10,8 @@ "gzipped": 12913 }, "gl-matrix-min.js": { - "bundled": 207220, - "minified": 52740, - "gzipped": 13405 + "bundled": 205177, + "minified": 52126, + "gzipped": 13856 } } diff --git a/LICENSE.md b/LICENSE.md index be8c473a..9d5e4a31 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,4 +1,4 @@ -Copyright (c) 2015-2025, Brandon Jones, Colin MacKenzie IV. +Copyright (c) 2015-2026, Brandon Jones, Colin MacKenzie IV. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/dist/esm/common.js b/dist/esm/common.js index 2b94e95f..b658cd72 100644 --- a/dist/esm/common.js +++ b/dist/esm/common.js @@ -1,3 +1,16 @@ +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } /** * Common utilities * @module glMatrix @@ -6,18 +19,18 @@ // Configuration Constants export var EPSILON = 0.000001; export var ARRAY_TYPE = typeof Float32Array !== "undefined" ? Float32Array : Array; +// If an array is required to initialize to zero. +export var ARRAY_ZERO_INIT_TYPE = ARRAY_TYPE === Array ? _createFastZeroInit(ARRAY_TYPE) : ARRAY_TYPE; export var RANDOM = Math.random; export var ANGLE_ORDER = "zyx"; /** * Symmetric round - * see https://www.npmjs.com/package/round-half-up-symmetric#user-content-detailed-background * * @param {Number} a value to round */ export function round(a) { - if (a >= 0) return Math.round(a); - return a % 0.5 === 0 ? Math.floor(a) : Math.round(a); + return Math.round(Math.abs(a)) * Math.sign(a); } /** @@ -27,6 +40,13 @@ export function round(a) { */ export function setMatrixArrayType(type) { ARRAY_TYPE = type; + + // If the Array is not a TypedArray, create a constructor that automatically fills it with zeroes. + if (Array.isArray(type)) { + ARRAY_ZERO_INIT_TYPE = _createFastZeroInit(type); + return; + } + ARRAY_ZERO_INIT_TYPE = type; } var degree = Math.PI / 180; var radian = 180 / Math.PI; @@ -62,4 +82,27 @@ export function toDegree(a) { export function equals(a, b) { var tolerance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : EPSILON; return Math.abs(a - b) <= tolerance * Math.max(1, Math.abs(a), Math.abs(b)); +} + +/** + * Creates a subclass of an Array-like class that initializes all it's elements to zero. + * @private + * @param {ArrayConstructor} type The Array-like class. + * @returns {ArrayConstructor} The zero-initializer subclass. + */ +function _createFastZeroInit(type) { + return /*#__PURE__*/function (_type) { + function ArrayInitZero() { + var _this; + _classCallCheck(this, ArrayInitZero); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _callSuper(this, ArrayInitZero, [].concat(args)); + _this.fill(0); + return _this; + } + _inherits(ArrayInitZero, _type); + return _createClass(ArrayInitZero); + }(type); } \ No newline at end of file diff --git a/dist/esm/mat2.js b/dist/esm/mat2.js index f51bfec0..b3e15f25 100644 --- a/dist/esm/mat2.js +++ b/dist/esm/mat2.js @@ -11,11 +11,7 @@ import * as glMatrix from "./common.js"; * @returns {mat2} a new 2x2 matrix */ export function create() { - var out = new glMatrix.ARRAY_TYPE(4); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - } + var out = new glMatrix.ARRAY_ZERO_INIT_TYPE(4); out[0] = 1; out[3] = 1; return out; @@ -109,18 +105,11 @@ export function set(out, m00, m01, m10, m11) { * @returns {mat2} out */ export function transpose(out, a) { - // If we are transposing ourselves we can skip a few steps but have to cache - // some values - if (out === a) { - var a1 = a[1]; - out[1] = a[2]; - out[2] = a1; - } else { - out[0] = a[0]; - out[1] = a[2]; - out[2] = a[1]; - out[3] = a[3]; - } + out[0] = a[0]; + var o1 = a[1]; + out[1] = a[2]; + out[2] = o1; + out[3] = a[3]; return out; } @@ -232,16 +221,12 @@ export function rotate(out, a, rad) { * @returns {mat2} out **/ export function scale(out, a, v) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; var v0 = v[0], v1 = v[1]; - out[0] = a0 * v0; - out[1] = a1 * v0; - out[2] = a2 * v1; - out[3] = a3 * v1; + out[0] = a[0] * v0; + out[1] = a[1] * v0; + out[2] = a[2] * v1; + out[3] = a[3] * v1; return out; } @@ -372,15 +357,7 @@ export function exactEquals(a, b) { * @returns {Boolean} True if the matrices are equal, false otherwise. */ export function equals(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3]; - return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)); + return glMatrix.equals(a[0], b[0]) && glMatrix.equals(a[1], b[1]) && glMatrix.equals(a[2], b[2]) && glMatrix.equals(a[3], b[3]); } /** diff --git a/dist/esm/mat2d.js b/dist/esm/mat2d.js index 16e60541..f8c117cc 100644 --- a/dist/esm/mat2d.js +++ b/dist/esm/mat2d.js @@ -25,13 +25,7 @@ import * as glMatrix from "./common.js"; * @returns {mat2d} a new 2x3 matrix */ export function create() { - var out = new glMatrix.ARRAY_TYPE(6); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - out[4] = 0; - out[5] = 0; - } + var out = new glMatrix.ARRAY_ZERO_INIT_TYPE(6); out[0] = 1; out[3] = 1; return out; @@ -211,17 +205,15 @@ export function rotate(out, a, rad) { var a0 = a[0], a1 = a[1], a2 = a[2], - a3 = a[3], - a4 = a[4], - a5 = a[5]; + a3 = a[3]; var s = Math.sin(rad); var c = Math.cos(rad); out[0] = a0 * c + a2 * s; out[1] = a1 * c + a3 * s; out[2] = a0 * -s + a2 * c; out[3] = a1 * -s + a3 * c; - out[4] = a4; - out[5] = a5; + out[4] = a[4]; + out[5] = a[5]; return out; } @@ -454,19 +446,7 @@ export function exactEquals(a, b) { * @returns {Boolean} True if the matrices are equal, false otherwise. */ export function equals(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3], - a4 = a[4], - a5 = a[5]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3], - b4 = b[4], - b5 = b[5]; - return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)); + return glMatrix.equals(a[0], b[0]) && glMatrix.equals(a[1], b[1]) && glMatrix.equals(a[2], b[2]) && glMatrix.equals(a[3], b[3]) && glMatrix.equals(a[4], b[4]) && glMatrix.equals(a[5], b[5]); } /** diff --git a/dist/esm/mat3.js b/dist/esm/mat3.js index 66df4510..753bca04 100644 --- a/dist/esm/mat3.js +++ b/dist/esm/mat3.js @@ -11,15 +11,7 @@ import * as glMatrix from "./common.js"; * @returns {mat3} a new 3x3 matrix */ export function create() { - var out = new glMatrix.ARRAY_TYPE(9); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[5] = 0; - out[6] = 0; - out[7] = 0; - } + var out = new glMatrix.ARRAY_ZERO_INIT_TYPE(9); out[0] = 1; out[4] = 1; out[8] = 1; @@ -169,28 +161,18 @@ export function identity(out) { * @returns {mat3} out */ export function transpose(out, a) { - // If we are transposing ourselves we can skip a few steps but have to cache some values - if (out === a) { - var a01 = a[1], - a02 = a[2], - a12 = a[5]; - out[1] = a[3]; - out[2] = a[6]; - out[3] = a01; - out[5] = a[7]; - out[6] = a02; - out[7] = a12; - } else { - out[0] = a[0]; - out[1] = a[3]; - out[2] = a[6]; - out[3] = a[1]; - out[4] = a[4]; - out[5] = a[7]; - out[6] = a[2]; - out[7] = a[5]; - out[8] = a[8]; - } + var a01 = a[1], + a02 = a[2], + a12 = a[5]; + out[0] = a[0]; + out[1] = a[3]; + out[2] = a[6]; + out[3] = a01; + out[4] = a[4]; + out[5] = a[7]; + out[6] = a02; + out[7] = a12; + out[8] = a[8]; return out; } @@ -739,25 +721,7 @@ export function exactEquals(a, b) { * @returns {Boolean} True if the matrices are equal, false otherwise. */ export function equals(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3], - a4 = a[4], - a5 = a[5], - a6 = a[6], - a7 = a[7], - a8 = a[8]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3], - b4 = b[4], - b5 = b[5], - b6 = b[6], - b7 = b[7], - b8 = b[8]; - return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)); + return glMatrix.equals(a[0], b[0]) && glMatrix.equals(a[1], b[1]) && glMatrix.equals(a[2], b[2]) && glMatrix.equals(a[3], b[3]) && glMatrix.equals(a[4], b[4]) && glMatrix.equals(a[5], b[5]) && glMatrix.equals(a[6], b[6]) && glMatrix.equals(a[7], b[7]) && glMatrix.equals(a[8], b[8]); } /** diff --git a/dist/esm/mat4.js b/dist/esm/mat4.js index 184b4d53..aee12476 100644 --- a/dist/esm/mat4.js +++ b/dist/esm/mat4.js @@ -11,21 +11,7 @@ import * as glMatrix from "./common.js"; * @returns {mat4} a new 4x4 matrix */ export function create() { - var out = new glMatrix.ARRAY_TYPE(16); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[6] = 0; - out[7] = 0; - out[8] = 0; - out[9] = 0; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - } + var out = new glMatrix.ARRAY_ZERO_INIT_TYPE(16); out[0] = 1; out[5] = 1; out[10] = 1; @@ -205,44 +191,28 @@ export function identity(out) { * @returns {mat4} out */ export function transpose(out, a) { - // If we are transposing ourselves we can skip a few steps but have to cache some values - if (out === a) { - var a01 = a[1], - a02 = a[2], - a03 = a[3]; - var a12 = a[6], - a13 = a[7]; - var a23 = a[11]; - out[1] = a[4]; - out[2] = a[8]; - out[3] = a[12]; - out[4] = a01; - out[6] = a[9]; - out[7] = a[13]; - out[8] = a02; - out[9] = a12; - out[11] = a[14]; - out[12] = a03; - out[13] = a13; - out[14] = a23; - } else { - out[0] = a[0]; - out[1] = a[4]; - out[2] = a[8]; - out[3] = a[12]; - out[4] = a[1]; - out[5] = a[5]; - out[6] = a[9]; - out[7] = a[13]; - out[8] = a[2]; - out[9] = a[6]; - out[10] = a[10]; - out[11] = a[14]; - out[12] = a[3]; - out[13] = a[7]; - out[14] = a[11]; - out[15] = a[15]; - } + var a01 = a[1], + a02 = a[2], + a03 = a[3]; + var a12 = a[6], + a13 = a[7]; + var a23 = a[11]; + out[0] = a[0]; + out[1] = a[4]; + out[2] = a[8]; + out[3] = a[12]; + out[4] = a01; + out[5] = a[5]; + out[6] = a[9]; + out[7] = a[13]; + out[8] = a02; + out[9] = a12; + out[10] = a[10]; + out[11] = a[14]; + out[12] = a03; + out[13] = a13; + out[14] = a23; + out[15] = a[15]; return out; } @@ -1913,39 +1883,7 @@ export function exactEquals(a, b) { * @returns {Boolean} True if the matrices are equal, false otherwise. */ export function equals(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; - var a4 = a[4], - a5 = a[5], - a6 = a[6], - a7 = a[7]; - var a8 = a[8], - a9 = a[9], - a10 = a[10], - a11 = a[11]; - var a12 = a[12], - a13 = a[13], - a14 = a[14], - a15 = a[15]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3]; - var b4 = b[4], - b5 = b[5], - b6 = b[6], - b7 = b[7]; - var b8 = b[8], - b9 = b[9], - b10 = b[10], - b11 = b[11]; - var b12 = b[12], - b13 = b[13], - b14 = b[14], - b15 = b[15]; - return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15)); + return glMatrix.equals(a[0], b[0]) && glMatrix.equals(a[1], b[1]) && glMatrix.equals(a[2], b[2]) && glMatrix.equals(a[3], b[3]) && glMatrix.equals(a[4], b[4]) && glMatrix.equals(a[5], b[5]) && glMatrix.equals(a[6], b[6]) && glMatrix.equals(a[7], b[7]) && glMatrix.equals(a[8], b[8]) && glMatrix.equals(a[9], b[9]) && glMatrix.equals(a[10], b[10]) && glMatrix.equals(a[11], b[11]) && glMatrix.equals(a[12], b[12]) && glMatrix.equals(a[13], b[13]) && glMatrix.equals(a[14], b[14]) && glMatrix.equals(a[15], b[15]); } /** diff --git a/dist/esm/vec2.js b/dist/esm/vec2.js index 263e14a8..a65bbf86 100644 --- a/dist/esm/vec2.js +++ b/dist/esm/vec2.js @@ -11,12 +11,7 @@ import * as glMatrix from "./common.js"; * @returns {vec2} a new 2D vector */ export function create() { - var out = new glMatrix.ARRAY_TYPE(2); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[0] = 0; - out[1] = 0; - } - return out; + return new glMatrix.ARRAY_ZERO_INIT_TYPE(2); } /** @@ -233,9 +228,7 @@ export function scaleAndAdd(out, a, b, scale) { * @returns {Number} distance between a and b */ export function distance(a, b) { - var x = b[0] - a[0], - y = b[1] - a[1]; - return Math.sqrt(x * x + y * y); + return Math.hypot(b[0] - a[0], b[1] - a[1]); } /** @@ -258,9 +251,7 @@ export function squaredDistance(a, b) { * @returns {Number} length of a */ export function length(a) { - var x = a[0], - y = a[1]; - return Math.sqrt(x * x + y * y); + return Math.hypot(a[0], a[1]); } /** @@ -309,15 +300,9 @@ export function inverse(out, a) { * @returns {vec2} out */ export function normalize(out, a) { - var x = a[0], - y = a[1]; - var len = x * x + y * y; - if (len > 0) { - //TODO: evaluate use of glm_invsqrt here? - len = 1 / Math.sqrt(len); - } - out[0] = a[0] * len; - out[1] = a[1] * len; + var len = Math.max(Math.hypot(a[0], a[1]), glMatrix.EPSILON); + out[0] = a[0] / len; + out[1] = a[1] / len; return out; } @@ -372,8 +357,8 @@ export function lerp(out, a, b, t) { * @param {Number} [scale] Length of the resulting vector. If omitted, a unit vector will be returned * @returns {vec2} out */ -export function random(out, scale) { - scale = scale === undefined ? 1.0 : scale; +export function random(out) { + var scale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1.0; var r = glMatrix.RANDOM() * 2.0 * Math.PI; out[0] = Math.cos(r) * scale; out[1] = Math.sin(r) * scale; @@ -484,7 +469,7 @@ export function angle(a, b) { /** * Get the signed angle in the interval [-pi,pi] between two 2D vectors (positive if `a` is to the right of `b`) - * + * * @param {ReadonlyVec2} a The first vector * @param {ReadonlyVec2} b The second vector * @returns {number} The signed angle in radians @@ -538,11 +523,7 @@ export function exactEquals(a, b) { * @returns {Boolean} True if the vectors are equal, false otherwise. */ export function equals(a, b) { - var a0 = a[0], - a1 = a[1]; - var b0 = b[0], - b1 = b[1]; - return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)); + return glMatrix.equals(a[0], b[0]) && glMatrix.equals(a[1], b[1]); } /** @@ -601,14 +582,13 @@ export var sqrLen = squaredLength; */ export var forEach = function () { var vec = create(); - return function (a, stride, offset, count, fn, arg) { + return function (a, stride) { + var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; + var count = arguments.length > 3 ? arguments[3] : undefined; + var fn = arguments.length > 4 ? arguments[4] : undefined; + var arg = arguments.length > 5 ? arguments[5] : undefined; var i, l; - if (!stride) { - stride = 2; - } - if (!offset) { - offset = 0; - } + stride = stride || 2; if (count) { l = Math.min(count * stride + offset, a.length); } else { diff --git a/dist/esm/vec3.js b/dist/esm/vec3.js index caf84a5f..d71453d7 100644 --- a/dist/esm/vec3.js +++ b/dist/esm/vec3.js @@ -11,13 +11,7 @@ import * as glMatrix from "./common.js"; * @returns {vec3} a new 3D vector */ export function create() { - var out = new glMatrix.ARRAY_TYPE(3); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[0] = 0; - out[1] = 0; - out[2] = 0; - } - return out; + return new glMatrix.ARRAY_ZERO_INIT_TYPE(3); } /** @@ -41,10 +35,7 @@ export function clone(a) { * @returns {Number} length of a */ export function length(a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - return Math.sqrt(x * x + y * y + z * z); + return Math.hypot(a[0], a[1], a[2]); } /** @@ -264,10 +255,7 @@ export function scaleAndAdd(out, a, b, scale) { * @returns {Number} distance between a and b */ export function distance(a, b) { - var x = b[0] - a[0]; - var y = b[1] - a[1]; - var z = b[2] - a[2]; - return Math.sqrt(x * x + y * y + z * z); + return Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2]); } /** @@ -278,10 +266,7 @@ export function distance(a, b) { * @returns {Number} squared distance between a and b */ export function squaredDistance(a, b) { - var x = b[0] - a[0]; - var y = b[1] - a[1]; - var z = b[2] - a[2]; - return x * x + y * y + z * z; + return Math.pow(Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2]), 2); } /** @@ -291,10 +276,7 @@ export function squaredDistance(a, b) { * @returns {Number} squared length of a */ export function squaredLength(a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - return x * x + y * y + z * z; + return Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2); } /** @@ -333,17 +315,10 @@ export function inverse(out, a) { * @returns {vec3} out */ export function normalize(out, a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - var len = x * x + y * y + z * z; - if (len > 0) { - //TODO: evaluate use of glm_invsqrt here? - len = 1 / Math.sqrt(len); - } - out[0] = a[0] * len; - out[1] = a[1] * len; - out[2] = a[2] * len; + var len = Math.max(Math.hypot(a[0], a[1], a[2]), glMatrix.EPSILON); + out[0] = a[0] / len; + out[1] = a[1] / len; + out[2] = a[2] / len; return out; } @@ -473,8 +448,8 @@ export function bezier(out, a, b, c, d, t) { * @param {Number} [scale] Length of the resulting vector. If omitted, a unit vector will be returned * @returns {vec3} out */ -export function random(out, scale) { - scale = scale === undefined ? 1.0 : scale; +export function random(out) { + var scale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1.0; var r = glMatrix.RANDOM() * 2.0 * Math.PI; var z = glMatrix.RANDOM() * 2.0 - 1.0; var zScale = Math.sqrt(1.0 - z * z) * scale; @@ -705,13 +680,7 @@ export function exactEquals(a, b) { * @returns {Boolean} True if the vectors are equal, false otherwise. */ export function equals(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2]; - var b0 = b[0], - b1 = b[1], - b2 = b[2]; - return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)); + return glMatrix.equals(a[0], b[0]) && glMatrix.equals(a[1], b[1]) && glMatrix.equals(a[2], b[2]); } /** @@ -770,14 +739,13 @@ export var sqrLen = squaredLength; */ export var forEach = function () { var vec = create(); - return function (a, stride, offset, count, fn, arg) { + return function (a, stride) { + var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; + var count = arguments.length > 3 ? arguments[3] : undefined; + var fn = arguments.length > 4 ? arguments[4] : undefined; + var arg = arguments.length > 5 ? arguments[5] : undefined; var i, l; - if (!stride) { - stride = 3; - } - if (!offset) { - offset = 0; - } + stride = stride || 3; if (count) { l = Math.min(count * stride + offset, a.length); } else { diff --git a/dist/esm/vec4.js b/dist/esm/vec4.js index a52b5bfc..91247a92 100644 --- a/dist/esm/vec4.js +++ b/dist/esm/vec4.js @@ -11,14 +11,7 @@ import * as glMatrix from "./common.js"; * @returns {vec4} a new 4D vector */ export function create() { - var out = new glMatrix.ARRAY_TYPE(4); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[0] = 0; - out[1] = 0; - out[2] = 0; - out[3] = 0; - } - return out; + return new glMatrix.ARRAY_ZERO_INIT_TYPE(4); } /** @@ -269,11 +262,7 @@ export function scaleAndAdd(out, a, b, scale) { * @returns {Number} distance between a and b */ export function distance(a, b) { - var x = b[0] - a[0]; - var y = b[1] - a[1]; - var z = b[2] - a[2]; - var w = b[3] - a[3]; - return Math.sqrt(x * x + y * y + z * z + w * w); + return Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2], b[3] - a[3]); } /** @@ -284,11 +273,7 @@ export function distance(a, b) { * @returns {Number} squared distance between a and b */ export function squaredDistance(a, b) { - var x = b[0] - a[0]; - var y = b[1] - a[1]; - var z = b[2] - a[2]; - var w = b[3] - a[3]; - return x * x + y * y + z * z + w * w; + return Math.pow(Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2], b[3] - a[3]), 2); } /** @@ -298,11 +283,8 @@ export function squaredDistance(a, b) { * @returns {Number} length of a */ export function length(a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - var w = a[3]; - return Math.sqrt(x * x + y * y + z * z + w * w); + return Math.hypot(a[0], a[1], a[2], a[3]); + ; } /** @@ -312,11 +294,7 @@ export function length(a) { * @returns {Number} squared length of a */ export function squaredLength(a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - var w = a[3]; - return x * x + y * y + z * z + w * w; + return Math.pow(Math.hypot(a[0], a[1], a[2], a[3]), 2); } /** @@ -357,18 +335,15 @@ export function inverse(out, a) { * @returns {vec4} out */ export function normalize(out, a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - var w = a[3]; - var len = x * x + y * y + z * z + w * w; - if (len > 0) { - len = 1 / Math.sqrt(len); - } - out[0] = x * len; - out[1] = y * len; - out[2] = z * len; - out[3] = w * len; + var x = a[0], + y = a[1], + z = a[2], + w = a[3]; + var len = Math.max(Math.hypot(x, y, z, w), glMatrix.EPSILON); + out[0] = x / len; + out[1] = y / len; + out[2] = z / len; + out[3] = w / len; return out; } @@ -564,15 +539,7 @@ export function exactEquals(a, b) { * @returns {Boolean} True if the vectors are equal, false otherwise. */ export function equals(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3]; - return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)); + return glMatrix.equals(a[0], b[0]) && glMatrix.equals(a[1], b[1]) && glMatrix.equals(a[2], b[2]) && glMatrix.equals(a[3], b[3]); } /** @@ -631,14 +598,13 @@ export var sqrLen = squaredLength; */ export var forEach = function () { var vec = create(); - return function (a, stride, offset, count, fn, arg) { + return function (a, stride) { + var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; + var count = arguments.length > 3 ? arguments[3] : undefined; + var fn = arguments.length > 4 ? arguments[4] : undefined; + var arg = arguments.length > 5 ? arguments[5] : undefined; var i, l; - if (!stride) { - stride = 4; - } - if (!offset) { - offset = 0; - } + stride = stride || 4; if (count) { l = Math.min(count * stride + offset, a.length); } else { diff --git a/dist/gl-matrix-min.js b/dist/gl-matrix-min.js index fffed8e8..dc647682 100644 --- a/dist/gl-matrix-min.js +++ b/dist/gl-matrix-min.js @@ -4,7 +4,7 @@ @author Colin MacKenzie IV @version 3.4.4 -Copyright (c) 2015-2025, Brandon Jones, Colin MacKenzie IV. +Copyright (c) 2015-2026, Brandon Jones, Colin MacKenzie IV. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -25,4 +25,4 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((t="undefined"!=typeof globalThis?globalThis:t||self).glMatrix={})}(this,(function(t){"use strict";var n=1e-6,a="undefined"!=typeof Float32Array?Float32Array:Array,r=Math.random;function u(t){return t>=0?Math.round(t):t%.5==0?Math.floor(t):Math.round(t)}var e=Math.PI/180,o=180/Math.PI;var i=Object.freeze({__proto__:null,EPSILON:n,get ARRAY_TYPE(){return a},RANDOM:r,ANGLE_ORDER:"zyx",round:u,setMatrixArrayType:function(t){a=t},toRadian:function(t){return t*e},toDegree:function(t){return t*o},equals:function(t,a){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:n;return Math.abs(t-a)<=r*Math.max(1,Math.abs(t),Math.abs(a))}});function s(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=a[0],s=a[1],c=a[2],h=a[3];return t[0]=r*i+e*s,t[1]=u*i+o*s,t[2]=r*c+e*h,t[3]=u*c+o*h,t}function c(t,n,a){return t[0]=n[0]-a[0],t[1]=n[1]-a[1],t[2]=n[2]-a[2],t[3]=n[3]-a[3],t}var h=s,M=c,f=Object.freeze({__proto__:null,create:function(){var t=new a(4);return a!=Float32Array&&(t[1]=0,t[2]=0),t[0]=1,t[3]=1,t},clone:function(t){var n=new a(4);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n},copy:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t},identity:function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t},fromValues:function(t,n,r,u){var e=new a(4);return e[0]=t,e[1]=n,e[2]=r,e[3]=u,e},set:function(t,n,a,r,u){return t[0]=n,t[1]=a,t[2]=r,t[3]=u,t},transpose:function(t,n){if(t===n){var a=n[1];t[1]=n[2],t[2]=a}else t[0]=n[0],t[1]=n[2],t[2]=n[1],t[3]=n[3];return t},invert:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=a*e-u*r;return o?(o=1/o,t[0]=e*o,t[1]=-r*o,t[2]=-u*o,t[3]=a*o,t):null},adjoint:function(t,n){var a=n[0];return t[0]=n[3],t[1]=-n[1],t[2]=-n[2],t[3]=a,t},determinant:function(t){return t[0]*t[3]-t[2]*t[1]},multiply:s,rotate:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=Math.sin(a),s=Math.cos(a);return t[0]=r*s+e*i,t[1]=u*s+o*i,t[2]=r*-i+e*s,t[3]=u*-i+o*s,t},scale:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=a[0],s=a[1];return t[0]=r*i,t[1]=u*i,t[2]=e*s,t[3]=o*s,t},fromRotation:function(t,n){var a=Math.sin(n),r=Math.cos(n);return t[0]=r,t[1]=a,t[2]=-a,t[3]=r,t},fromScaling:function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=n[1],t},str:function(t){return"mat2("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},frob:function(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]+t[3]*t[3])},LDU:function(t,n,a,r){return t[2]=r[2]/r[0],a[0]=r[0],a[1]=r[1],a[3]=r[3]-t[2]*a[1],[t,n,a]},add:function(t,n,a){return t[0]=n[0]+a[0],t[1]=n[1]+a[1],t[2]=n[2]+a[2],t[3]=n[3]+a[3],t},subtract:c,exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]},equals:function(t,a){var r=t[0],u=t[1],e=t[2],o=t[3],i=a[0],s=a[1],c=a[2],h=a[3];return Math.abs(r-i)<=n*Math.max(1,Math.abs(r),Math.abs(i))&&Math.abs(u-s)<=n*Math.max(1,Math.abs(u),Math.abs(s))&&Math.abs(e-c)<=n*Math.max(1,Math.abs(e),Math.abs(c))&&Math.abs(o-h)<=n*Math.max(1,Math.abs(o),Math.abs(h))},multiplyScalar:function(t,n,a){return t[0]=n[0]*a,t[1]=n[1]*a,t[2]=n[2]*a,t[3]=n[3]*a,t},multiplyScalarAndAdd:function(t,n,a,r){return t[0]=n[0]+a[0]*r,t[1]=n[1]+a[1]*r,t[2]=n[2]+a[2]*r,t[3]=n[3]+a[3]*r,t},mul:h,sub:M});function l(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],s=n[5],c=a[0],h=a[1],M=a[2],f=a[3],l=a[4],v=a[5];return t[0]=r*c+e*h,t[1]=u*c+o*h,t[2]=r*M+e*f,t[3]=u*M+o*f,t[4]=r*l+e*v+i,t[5]=u*l+o*v+s,t}function v(t,n,a){return t[0]=n[0]-a[0],t[1]=n[1]-a[1],t[2]=n[2]-a[2],t[3]=n[3]-a[3],t[4]=n[4]-a[4],t[5]=n[5]-a[5],t}var b=l,m=v,d=Object.freeze({__proto__:null,create:function(){var t=new a(6);return a!=Float32Array&&(t[1]=0,t[2]=0,t[4]=0,t[5]=0),t[0]=1,t[3]=1,t},clone:function(t){var n=new a(6);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n},copy:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t},identity:function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},fromValues:function(t,n,r,u,e,o){var i=new a(6);return i[0]=t,i[1]=n,i[2]=r,i[3]=u,i[4]=e,i[5]=o,i},set:function(t,n,a,r,u,e,o){return t[0]=n,t[1]=a,t[2]=r,t[3]=u,t[4]=e,t[5]=o,t},invert:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=n[4],i=n[5],s=a*e-r*u;return s?(s=1/s,t[0]=e*s,t[1]=-r*s,t[2]=-u*s,t[3]=a*s,t[4]=(u*i-e*o)*s,t[5]=(r*o-a*i)*s,t):null},determinant:function(t){return t[0]*t[3]-t[1]*t[2]},multiply:l,rotate:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],s=n[5],c=Math.sin(a),h=Math.cos(a);return t[0]=r*h+e*c,t[1]=u*h+o*c,t[2]=r*-c+e*h,t[3]=u*-c+o*h,t[4]=i,t[5]=s,t},scale:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],s=n[5],c=a[0],h=a[1];return t[0]=r*c,t[1]=u*c,t[2]=e*h,t[3]=o*h,t[4]=i,t[5]=s,t},translate:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],s=n[5],c=a[0],h=a[1];return t[0]=r,t[1]=u,t[2]=e,t[3]=o,t[4]=r*c+e*h+i,t[5]=u*c+o*h+s,t},fromRotation:function(t,n){var a=Math.sin(n),r=Math.cos(n);return t[0]=r,t[1]=a,t[2]=-a,t[3]=r,t[4]=0,t[5]=0,t},fromScaling:function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=n[1],t[4]=0,t[5]=0,t},fromTranslation:function(t,n){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=n[0],t[5]=n[1],t},str:function(t){return"mat2d("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+")"},frob:function(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]+t[3]*t[3]+t[4]*t[4]+t[5]*t[5]+1)},add:function(t,n,a){return t[0]=n[0]+a[0],t[1]=n[1]+a[1],t[2]=n[2]+a[2],t[3]=n[3]+a[3],t[4]=n[4]+a[4],t[5]=n[5]+a[5],t},subtract:v,multiplyScalar:function(t,n,a){return t[0]=n[0]*a,t[1]=n[1]*a,t[2]=n[2]*a,t[3]=n[3]*a,t[4]=n[4]*a,t[5]=n[5]*a,t},multiplyScalarAndAdd:function(t,n,a,r){return t[0]=n[0]+a[0]*r,t[1]=n[1]+a[1]*r,t[2]=n[2]+a[2]*r,t[3]=n[3]+a[3]*r,t[4]=n[4]+a[4]*r,t[5]=n[5]+a[5]*r,t},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]&&t[4]===n[4]&&t[5]===n[5]},equals:function(t,a){var r=t[0],u=t[1],e=t[2],o=t[3],i=t[4],s=t[5],c=a[0],h=a[1],M=a[2],f=a[3],l=a[4],v=a[5];return Math.abs(r-c)<=n*Math.max(1,Math.abs(r),Math.abs(c))&&Math.abs(u-h)<=n*Math.max(1,Math.abs(u),Math.abs(h))&&Math.abs(e-M)<=n*Math.max(1,Math.abs(e),Math.abs(M))&&Math.abs(o-f)<=n*Math.max(1,Math.abs(o),Math.abs(f))&&Math.abs(i-l)<=n*Math.max(1,Math.abs(i),Math.abs(l))&&Math.abs(s-v)<=n*Math.max(1,Math.abs(s),Math.abs(v))},mul:b,sub:m});function x(){var t=new a(9);return a!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[5]=0,t[6]=0,t[7]=0),t[0]=1,t[4]=1,t[8]=1,t}function q(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],s=n[5],c=n[6],h=n[7],M=n[8],f=a[0],l=a[1],v=a[2],b=a[3],m=a[4],d=a[5],x=a[6],q=a[7],p=a[8];return t[0]=f*r+l*o+v*c,t[1]=f*u+l*i+v*h,t[2]=f*e+l*s+v*M,t[3]=b*r+m*o+d*c,t[4]=b*u+m*i+d*h,t[5]=b*e+m*s+d*M,t[6]=x*r+q*o+p*c,t[7]=x*u+q*i+p*h,t[8]=x*e+q*s+p*M,t}function p(t,n,a){return t[0]=n[0]-a[0],t[1]=n[1]-a[1],t[2]=n[2]-a[2],t[3]=n[3]-a[3],t[4]=n[4]-a[4],t[5]=n[5]-a[5],t[6]=n[6]-a[6],t[7]=n[7]-a[7],t[8]=n[8]-a[8],t}var y=q,g=p,_=Object.freeze({__proto__:null,create:x,fromMat4:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[4],t[4]=n[5],t[5]=n[6],t[6]=n[8],t[7]=n[9],t[8]=n[10],t},clone:function(t){var n=new a(9);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n[8]=t[8],n},copy:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t},fromValues:function(t,n,r,u,e,o,i,s,c){var h=new a(9);return h[0]=t,h[1]=n,h[2]=r,h[3]=u,h[4]=e,h[5]=o,h[6]=i,h[7]=s,h[8]=c,h},set:function(t,n,a,r,u,e,o,i,s,c){return t[0]=n,t[1]=a,t[2]=r,t[3]=u,t[4]=e,t[5]=o,t[6]=i,t[7]=s,t[8]=c,t},identity:function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},transpose:function(t,n){if(t===n){var a=n[1],r=n[2],u=n[5];t[1]=n[3],t[2]=n[6],t[3]=a,t[5]=n[7],t[6]=r,t[7]=u}else t[0]=n[0],t[1]=n[3],t[2]=n[6],t[3]=n[1],t[4]=n[4],t[5]=n[7],t[6]=n[2],t[7]=n[5],t[8]=n[8];return t},invert:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=n[4],i=n[5],s=n[6],c=n[7],h=n[8],M=h*o-i*c,f=-h*e+i*s,l=c*e-o*s,v=a*M+r*f+u*l;return v?(v=1/v,t[0]=M*v,t[1]=(-h*r+u*c)*v,t[2]=(i*r-u*o)*v,t[3]=f*v,t[4]=(h*a-u*s)*v,t[5]=(-i*a+u*e)*v,t[6]=l*v,t[7]=(-c*a+r*s)*v,t[8]=(o*a-r*e)*v,t):null},adjoint:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=n[4],i=n[5],s=n[6],c=n[7],h=n[8];return t[0]=o*h-i*c,t[1]=u*c-r*h,t[2]=r*i-u*o,t[3]=i*s-e*h,t[4]=a*h-u*s,t[5]=u*e-a*i,t[6]=e*c-o*s,t[7]=r*s-a*c,t[8]=a*o-r*e,t},determinant:function(t){var n=t[0],a=t[1],r=t[2],u=t[3],e=t[4],o=t[5],i=t[6],s=t[7],c=t[8];return n*(c*e-o*s)+a*(-c*u+o*i)+r*(s*u-e*i)},multiply:q,translate:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],s=n[5],c=n[6],h=n[7],M=n[8],f=a[0],l=a[1];return t[0]=r,t[1]=u,t[2]=e,t[3]=o,t[4]=i,t[5]=s,t[6]=f*r+l*o+c,t[7]=f*u+l*i+h,t[8]=f*e+l*s+M,t},rotate:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],s=n[5],c=n[6],h=n[7],M=n[8],f=Math.sin(a),l=Math.cos(a);return t[0]=l*r+f*o,t[1]=l*u+f*i,t[2]=l*e+f*s,t[3]=l*o-f*r,t[4]=l*i-f*u,t[5]=l*s-f*e,t[6]=c,t[7]=h,t[8]=M,t},scale:function(t,n,a){var r=a[0],u=a[1];return t[0]=r*n[0],t[1]=r*n[1],t[2]=r*n[2],t[3]=u*n[3],t[4]=u*n[4],t[5]=u*n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t},fromTranslation:function(t,n){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=n[0],t[7]=n[1],t[8]=1,t},fromRotation:function(t,n){var a=Math.sin(n),r=Math.cos(n);return t[0]=r,t[1]=a,t[2]=0,t[3]=-a,t[4]=r,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},fromScaling:function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=0,t[4]=n[1],t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},fromMat2d:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=0,t[3]=n[2],t[4]=n[3],t[5]=0,t[6]=n[4],t[7]=n[5],t[8]=1,t},fromQuat:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=a+a,i=r+r,s=u+u,c=a*o,h=r*o,M=r*i,f=u*o,l=u*i,v=u*s,b=e*o,m=e*i,d=e*s;return t[0]=1-M-v,t[3]=h-d,t[6]=f+m,t[1]=h+d,t[4]=1-c-v,t[7]=l-b,t[2]=f-m,t[5]=l+b,t[8]=1-c-M,t},normalFromMat4:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=n[4],i=n[5],s=n[6],c=n[7],h=n[8],M=n[9],f=n[10],l=n[11],v=n[12],b=n[13],m=n[14],d=n[15],x=a*i-r*o,q=a*s-u*o,p=a*c-e*o,y=r*s-u*i,g=r*c-e*i,_=u*c-e*s,A=h*b-M*v,w=h*m-f*v,z=h*d-l*v,R=M*m-f*b,O=M*d-l*b,j=f*d-l*m,E=x*j-q*O+p*R+y*z-g*w+_*A;return E?(E=1/E,t[0]=(i*j-s*O+c*R)*E,t[1]=(s*z-o*j-c*w)*E,t[2]=(o*O-i*z+c*A)*E,t[3]=(u*O-r*j-e*R)*E,t[4]=(a*j-u*z+e*w)*E,t[5]=(r*z-a*O-e*A)*E,t[6]=(b*_-m*g+d*y)*E,t[7]=(m*p-v*_-d*q)*E,t[8]=(v*g-b*p+d*x)*E,t):null},projection:function(t,n,a){return t[0]=2/n,t[1]=0,t[2]=0,t[3]=0,t[4]=-2/a,t[5]=0,t[6]=-1,t[7]=1,t[8]=1,t},str:function(t){return"mat3("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+", "+t[8]+")"},frob:function(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]+t[3]*t[3]+t[4]*t[4]+t[5]*t[5]+t[6]*t[6]+t[7]*t[7]+t[8]*t[8])},add:function(t,n,a){return t[0]=n[0]+a[0],t[1]=n[1]+a[1],t[2]=n[2]+a[2],t[3]=n[3]+a[3],t[4]=n[4]+a[4],t[5]=n[5]+a[5],t[6]=n[6]+a[6],t[7]=n[7]+a[7],t[8]=n[8]+a[8],t},subtract:p,multiplyScalar:function(t,n,a){return t[0]=n[0]*a,t[1]=n[1]*a,t[2]=n[2]*a,t[3]=n[3]*a,t[4]=n[4]*a,t[5]=n[5]*a,t[6]=n[6]*a,t[7]=n[7]*a,t[8]=n[8]*a,t},multiplyScalarAndAdd:function(t,n,a,r){return t[0]=n[0]+a[0]*r,t[1]=n[1]+a[1]*r,t[2]=n[2]+a[2]*r,t[3]=n[3]+a[3]*r,t[4]=n[4]+a[4]*r,t[5]=n[5]+a[5]*r,t[6]=n[6]+a[6]*r,t[7]=n[7]+a[7]*r,t[8]=n[8]+a[8]*r,t},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]&&t[4]===n[4]&&t[5]===n[5]&&t[6]===n[6]&&t[7]===n[7]&&t[8]===n[8]},equals:function(t,a){var r=t[0],u=t[1],e=t[2],o=t[3],i=t[4],s=t[5],c=t[6],h=t[7],M=t[8],f=a[0],l=a[1],v=a[2],b=a[3],m=a[4],d=a[5],x=a[6],q=a[7],p=a[8];return Math.abs(r-f)<=n*Math.max(1,Math.abs(r),Math.abs(f))&&Math.abs(u-l)<=n*Math.max(1,Math.abs(u),Math.abs(l))&&Math.abs(e-v)<=n*Math.max(1,Math.abs(e),Math.abs(v))&&Math.abs(o-b)<=n*Math.max(1,Math.abs(o),Math.abs(b))&&Math.abs(i-m)<=n*Math.max(1,Math.abs(i),Math.abs(m))&&Math.abs(s-d)<=n*Math.max(1,Math.abs(s),Math.abs(d))&&Math.abs(c-x)<=n*Math.max(1,Math.abs(c),Math.abs(x))&&Math.abs(h-q)<=n*Math.max(1,Math.abs(h),Math.abs(q))&&Math.abs(M-p)<=n*Math.max(1,Math.abs(M),Math.abs(p))},mul:y,sub:g});function A(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}function w(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],s=n[5],c=n[6],h=n[7],M=n[8],f=n[9],l=n[10],v=n[11],b=n[12],m=n[13],d=n[14],x=n[15],q=a[0],p=a[1],y=a[2],g=a[3];return t[0]=q*r+p*i+y*M+g*b,t[1]=q*u+p*s+y*f+g*m,t[2]=q*e+p*c+y*l+g*d,t[3]=q*o+p*h+y*v+g*x,q=a[4],p=a[5],y=a[6],g=a[7],t[4]=q*r+p*i+y*M+g*b,t[5]=q*u+p*s+y*f+g*m,t[6]=q*e+p*c+y*l+g*d,t[7]=q*o+p*h+y*v+g*x,q=a[8],p=a[9],y=a[10],g=a[11],t[8]=q*r+p*i+y*M+g*b,t[9]=q*u+p*s+y*f+g*m,t[10]=q*e+p*c+y*l+g*d,t[11]=q*o+p*h+y*v+g*x,q=a[12],p=a[13],y=a[14],g=a[15],t[12]=q*r+p*i+y*M+g*b,t[13]=q*u+p*s+y*f+g*m,t[14]=q*e+p*c+y*l+g*d,t[15]=q*o+p*h+y*v+g*x,t}function z(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=r+r,s=u+u,c=e+e,h=r*i,M=r*s,f=r*c,l=u*s,v=u*c,b=e*c,m=o*i,d=o*s,x=o*c;return t[0]=1-(l+b),t[1]=M+x,t[2]=f-d,t[3]=0,t[4]=M-x,t[5]=1-(h+b),t[6]=v+m,t[7]=0,t[8]=f+d,t[9]=v-m,t[10]=1-(h+l),t[11]=0,t[12]=a[0],t[13]=a[1],t[14]=a[2],t[15]=1,t}function R(t,n){return t[0]=n[12],t[1]=n[13],t[2]=n[14],t}function O(t,n){var a=n[0],r=n[1],u=n[2],e=n[4],o=n[5],i=n[6],s=n[8],c=n[9],h=n[10];return t[0]=Math.sqrt(a*a+r*r+u*u),t[1]=Math.sqrt(e*e+o*o+i*i),t[2]=Math.sqrt(s*s+c*c+h*h),t}function j(t,n){var r=new a(3);O(r,n);var u=1/r[0],e=1/r[1],o=1/r[2],i=n[0]*u,s=n[1]*e,c=n[2]*o,h=n[4]*u,M=n[5]*e,f=n[6]*o,l=n[8]*u,v=n[9]*e,b=n[10]*o,m=i+M+b,d=0;return m>0?(d=2*Math.sqrt(m+1),t[3]=.25*d,t[0]=(f-v)/d,t[1]=(l-c)/d,t[2]=(s-h)/d):i>M&&i>b?(d=2*Math.sqrt(1+i-M-b),t[3]=(f-v)/d,t[0]=.25*d,t[1]=(s+h)/d,t[2]=(l+c)/d):M>b?(d=2*Math.sqrt(1+M-i-b),t[3]=(l-c)/d,t[0]=(s+h)/d,t[1]=.25*d,t[2]=(f+v)/d):(d=2*Math.sqrt(1+b-i-M),t[3]=(s-h)/d,t[0]=(l+c)/d,t[1]=(f+v)/d,t[2]=.25*d),t}function E(t,n,a,r,u){var e=1/Math.tan(n/2);if(t[0]=e/a,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=e,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=-1,t[12]=0,t[13]=0,t[15]=0,null!=u&&u!==1/0){var o=1/(r-u);t[10]=(u+r)*o,t[14]=2*u*r*o}else t[10]=-1,t[14]=-2*r;return t}var P=E;function T(t,n,a,r,u,e,o){var i=1/(n-a),s=1/(r-u),c=1/(e-o);return t[0]=-2*i,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*s,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*c,t[11]=0,t[12]=(n+a)*i,t[13]=(u+r)*s,t[14]=(o+e)*c,t[15]=1,t}var D=T;function S(t,n,a){return t[0]=n[0]-a[0],t[1]=n[1]-a[1],t[2]=n[2]-a[2],t[3]=n[3]-a[3],t[4]=n[4]-a[4],t[5]=n[5]-a[5],t[6]=n[6]-a[6],t[7]=n[7]-a[7],t[8]=n[8]-a[8],t[9]=n[9]-a[9],t[10]=n[10]-a[10],t[11]=n[11]-a[11],t[12]=n[12]-a[12],t[13]=n[13]-a[13],t[14]=n[14]-a[14],t[15]=n[15]-a[15],t}var I=w,F=S,L=Object.freeze({__proto__:null,create:function(){var t=new a(16);return a!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0),t[0]=1,t[5]=1,t[10]=1,t[15]=1,t},clone:function(t){var n=new a(16);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n[8]=t[8],n[9]=t[9],n[10]=t[10],n[11]=t[11],n[12]=t[12],n[13]=t[13],n[14]=t[14],n[15]=t[15],n},copy:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t[9]=n[9],t[10]=n[10],t[11]=n[11],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15],t},fromValues:function(t,n,r,u,e,o,i,s,c,h,M,f,l,v,b,m){var d=new a(16);return d[0]=t,d[1]=n,d[2]=r,d[3]=u,d[4]=e,d[5]=o,d[6]=i,d[7]=s,d[8]=c,d[9]=h,d[10]=M,d[11]=f,d[12]=l,d[13]=v,d[14]=b,d[15]=m,d},set:function(t,n,a,r,u,e,o,i,s,c,h,M,f,l,v,b,m){return t[0]=n,t[1]=a,t[2]=r,t[3]=u,t[4]=e,t[5]=o,t[6]=i,t[7]=s,t[8]=c,t[9]=h,t[10]=M,t[11]=f,t[12]=l,t[13]=v,t[14]=b,t[15]=m,t},identity:A,transpose:function(t,n){if(t===n){var a=n[1],r=n[2],u=n[3],e=n[6],o=n[7],i=n[11];t[1]=n[4],t[2]=n[8],t[3]=n[12],t[4]=a,t[6]=n[9],t[7]=n[13],t[8]=r,t[9]=e,t[11]=n[14],t[12]=u,t[13]=o,t[14]=i}else t[0]=n[0],t[1]=n[4],t[2]=n[8],t[3]=n[12],t[4]=n[1],t[5]=n[5],t[6]=n[9],t[7]=n[13],t[8]=n[2],t[9]=n[6],t[10]=n[10],t[11]=n[14],t[12]=n[3],t[13]=n[7],t[14]=n[11],t[15]=n[15];return t},invert:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=n[4],i=n[5],s=n[6],c=n[7],h=n[8],M=n[9],f=n[10],l=n[11],v=n[12],b=n[13],m=n[14],d=n[15],x=a*i-r*o,q=a*s-u*o,p=a*c-e*o,y=r*s-u*i,g=r*c-e*i,_=u*c-e*s,A=h*b-M*v,w=h*m-f*v,z=h*d-l*v,R=M*m-f*b,O=M*d-l*b,j=f*d-l*m,E=x*j-q*O+p*R+y*z-g*w+_*A;return E?(E=1/E,t[0]=(i*j-s*O+c*R)*E,t[1]=(u*O-r*j-e*R)*E,t[2]=(b*_-m*g+d*y)*E,t[3]=(f*g-M*_-l*y)*E,t[4]=(s*z-o*j-c*w)*E,t[5]=(a*j-u*z+e*w)*E,t[6]=(m*p-v*_-d*q)*E,t[7]=(h*_-f*p+l*q)*E,t[8]=(o*O-i*z+c*A)*E,t[9]=(r*z-a*O-e*A)*E,t[10]=(v*g-b*p+d*x)*E,t[11]=(M*p-h*g-l*x)*E,t[12]=(i*w-o*R-s*A)*E,t[13]=(a*R-r*w+u*A)*E,t[14]=(b*q-v*y-m*x)*E,t[15]=(h*y-M*q+f*x)*E,t):null},adjoint:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=n[4],i=n[5],s=n[6],c=n[7],h=n[8],M=n[9],f=n[10],l=n[11],v=n[12],b=n[13],m=n[14],d=n[15],x=a*i-r*o,q=a*s-u*o,p=a*c-e*o,y=r*s-u*i,g=r*c-e*i,_=u*c-e*s,A=h*b-M*v,w=h*m-f*v,z=h*d-l*v,R=M*m-f*b,O=M*d-l*b,j=f*d-l*m;return t[0]=i*j-s*O+c*R,t[1]=u*O-r*j-e*R,t[2]=b*_-m*g+d*y,t[3]=f*g-M*_-l*y,t[4]=s*z-o*j-c*w,t[5]=a*j-u*z+e*w,t[6]=m*p-v*_-d*q,t[7]=h*_-f*p+l*q,t[8]=o*O-i*z+c*A,t[9]=r*z-a*O-e*A,t[10]=v*g-b*p+d*x,t[11]=M*p-h*g-l*x,t[12]=i*w-o*R-s*A,t[13]=a*R-r*w+u*A,t[14]=b*q-v*y-m*x,t[15]=h*y-M*q+f*x,t},determinant:function(t){var n=t[0],a=t[1],r=t[2],u=t[3],e=t[4],o=t[5],i=t[6],s=t[7],c=t[8],h=t[9],M=t[10],f=t[11],l=t[12],v=t[13],b=t[14],m=n*o-a*e,d=n*i-r*e,x=a*i-r*o,q=c*v-h*l,p=c*b-M*l,y=h*b-M*v;return s*(n*y-a*p+r*q)-u*(e*y-o*p+i*q)+t[15]*(c*x-h*d+M*m)-f*(l*x-v*d+b*m)},multiply:w,translate:function(t,n,a){var r,u,e,o,i,s,c,h,M,f,l,v,b=a[0],m=a[1],d=a[2];return n===t?(t[12]=n[0]*b+n[4]*m+n[8]*d+n[12],t[13]=n[1]*b+n[5]*m+n[9]*d+n[13],t[14]=n[2]*b+n[6]*m+n[10]*d+n[14],t[15]=n[3]*b+n[7]*m+n[11]*d+n[15]):(r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],s=n[5],c=n[6],h=n[7],M=n[8],f=n[9],l=n[10],v=n[11],t[0]=r,t[1]=u,t[2]=e,t[3]=o,t[4]=i,t[5]=s,t[6]=c,t[7]=h,t[8]=M,t[9]=f,t[10]=l,t[11]=v,t[12]=r*b+i*m+M*d+n[12],t[13]=u*b+s*m+f*d+n[13],t[14]=e*b+c*m+l*d+n[14],t[15]=o*b+h*m+v*d+n[15]),t},scale:function(t,n,a){var r=a[0],u=a[1],e=a[2];return t[0]=n[0]*r,t[1]=n[1]*r,t[2]=n[2]*r,t[3]=n[3]*r,t[4]=n[4]*u,t[5]=n[5]*u,t[6]=n[6]*u,t[7]=n[7]*u,t[8]=n[8]*e,t[9]=n[9]*e,t[10]=n[10]*e,t[11]=n[11]*e,t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15],t},rotate:function(t,a,r,u){var e,o,i,s,c,h,M,f,l,v,b,m,d,x,q,p,y,g,_,A,w,z,R,O,j=u[0],E=u[1],P=u[2],T=Math.sqrt(j*j+E*E+P*P);return T0?(r[0]=2*(s*i+M*u+c*o-h*e)/f,r[1]=2*(c*i+M*e+h*u-s*o)/f,r[2]=2*(h*i+M*o+s*e-c*u)/f):(r[0]=2*(s*i+M*u+c*o-h*e),r[1]=2*(c*i+M*e+h*u-s*o),r[2]=2*(h*i+M*o+s*e-c*u)),z(t,n,r),t},getTranslation:R,getScaling:O,getRotation:j,decompose:function(t,n,a,r){n[0]=r[12],n[1]=r[13],n[2]=r[14];var u=r[0],e=r[1],o=r[2],i=r[4],s=r[5],c=r[6],h=r[8],M=r[9],f=r[10];a[0]=Math.sqrt(u*u+e*e+o*o),a[1]=Math.sqrt(i*i+s*s+c*c),a[2]=Math.sqrt(h*h+M*M+f*f);var l=1/a[0],v=1/a[1],b=1/a[2],m=u*l,d=e*v,x=o*b,q=i*l,p=s*v,y=c*b,g=h*l,_=M*v,A=f*b,w=m+p+A,z=0;return w>0?(z=2*Math.sqrt(w+1),t[3]=.25*z,t[0]=(y-_)/z,t[1]=(g-x)/z,t[2]=(d-q)/z):m>p&&m>A?(z=2*Math.sqrt(1+m-p-A),t[3]=(y-_)/z,t[0]=.25*z,t[1]=(d+q)/z,t[2]=(g+x)/z):p>A?(z=2*Math.sqrt(1+p-m-A),t[3]=(g-x)/z,t[0]=(d+q)/z,t[1]=.25*z,t[2]=(y+_)/z):(z=2*Math.sqrt(1+A-m-p),t[3]=(d-q)/z,t[0]=(g+x)/z,t[1]=(y+_)/z,t[2]=.25*z),t},fromRotationTranslationScale:function(t,n,a,r){var u=n[0],e=n[1],o=n[2],i=n[3],s=u+u,c=e+e,h=o+o,M=u*s,f=u*c,l=u*h,v=e*c,b=e*h,m=o*h,d=i*s,x=i*c,q=i*h,p=r[0],y=r[1],g=r[2];return t[0]=(1-(v+m))*p,t[1]=(f+q)*p,t[2]=(l-x)*p,t[3]=0,t[4]=(f-q)*y,t[5]=(1-(M+m))*y,t[6]=(b+d)*y,t[7]=0,t[8]=(l+x)*g,t[9]=(b-d)*g,t[10]=(1-(M+v))*g,t[11]=0,t[12]=a[0],t[13]=a[1],t[14]=a[2],t[15]=1,t},fromRotationTranslationScaleOrigin:function(t,n,a,r,u){var e=n[0],o=n[1],i=n[2],s=n[3],c=e+e,h=o+o,M=i+i,f=e*c,l=e*h,v=e*M,b=o*h,m=o*M,d=i*M,x=s*c,q=s*h,p=s*M,y=r[0],g=r[1],_=r[2],A=u[0],w=u[1],z=u[2],R=(1-(b+d))*y,O=(l+p)*y,j=(v-q)*y,E=(l-p)*g,P=(1-(f+d))*g,T=(m+x)*g,D=(v+q)*_,S=(m-x)*_,I=(1-(f+b))*_;return t[0]=R,t[1]=O,t[2]=j,t[3]=0,t[4]=E,t[5]=P,t[6]=T,t[7]=0,t[8]=D,t[9]=S,t[10]=I,t[11]=0,t[12]=a[0]+A-(R*A+E*w+D*z),t[13]=a[1]+w-(O*A+P*w+S*z),t[14]=a[2]+z-(j*A+T*w+I*z),t[15]=1,t},fromQuat:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=a+a,i=r+r,s=u+u,c=a*o,h=r*o,M=r*i,f=u*o,l=u*i,v=u*s,b=e*o,m=e*i,d=e*s;return t[0]=1-M-v,t[1]=h+d,t[2]=f-m,t[3]=0,t[4]=h-d,t[5]=1-c-v,t[6]=l+b,t[7]=0,t[8]=f+m,t[9]=l-b,t[10]=1-c-M,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},frustum:function(t,n,a,r,u,e,o){var i=1/(a-n),s=1/(u-r),c=1/(e-o);return t[0]=2*e*i,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=2*e*s,t[6]=0,t[7]=0,t[8]=(a+n)*i,t[9]=(u+r)*s,t[10]=(o+e)*c,t[11]=-1,t[12]=0,t[13]=0,t[14]=o*e*2*c,t[15]=0,t},perspectiveNO:E,perspective:P,perspectiveZO:function(t,n,a,r,u){var e=1/Math.tan(n/2);if(t[0]=e/a,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=e,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=-1,t[12]=0,t[13]=0,t[15]=0,null!=u&&u!==1/0){var o=1/(r-u);t[10]=u*o,t[14]=u*r*o}else t[10]=-1,t[14]=-r;return t},perspectiveFromFieldOfView:function(t,n,a,r){var u=Math.tan(n.upDegrees*Math.PI/180),e=Math.tan(n.downDegrees*Math.PI/180),o=Math.tan(n.leftDegrees*Math.PI/180),i=Math.tan(n.rightDegrees*Math.PI/180),s=2/(o+i),c=2/(u+e);return t[0]=s,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=c,t[6]=0,t[7]=0,t[8]=-(o-i)*s*.5,t[9]=(u-e)*c*.5,t[10]=r/(a-r),t[11]=-1,t[12]=0,t[13]=0,t[14]=r*a/(a-r),t[15]=0,t},orthoNO:T,ortho:D,orthoZO:function(t,n,a,r,u,e,o){var i=1/(n-a),s=1/(r-u),c=1/(e-o);return t[0]=-2*i,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*s,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=c,t[11]=0,t[12]=(n+a)*i,t[13]=(u+r)*s,t[14]=e*c,t[15]=1,t},lookAt:function(t,a,r,u){var e,o,i,s,c,h,M,f,l,v,b=a[0],m=a[1],d=a[2],x=u[0],q=u[1],p=u[2],y=r[0],g=r[1],_=r[2];return Math.abs(b-y)0&&(h*=l=1/Math.sqrt(l),M*=l,f*=l);var v=s*f-c*M,b=c*h-i*f,m=i*M-s*h;return(l=v*v+b*b+m*m)>0&&(v*=l=1/Math.sqrt(l),b*=l,m*=l),t[0]=v,t[1]=b,t[2]=m,t[3]=0,t[4]=M*m-f*b,t[5]=f*v-h*m,t[6]=h*b-M*v,t[7]=0,t[8]=h,t[9]=M,t[10]=f,t[11]=0,t[12]=u,t[13]=e,t[14]=o,t[15]=1,t},str:function(t){return"mat4("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+", "+t[8]+", "+t[9]+", "+t[10]+", "+t[11]+", "+t[12]+", "+t[13]+", "+t[14]+", "+t[15]+")"},frob:function(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]+t[3]*t[3]+t[4]*t[4]+t[5]*t[5]+t[6]*t[6]+t[7]*t[7]+t[8]*t[8]+t[9]*t[9]+t[10]*t[10]+t[11]*t[11]+t[12]*t[12]+t[13]*t[13]+t[14]*t[14]+t[15]*t[15])},add:function(t,n,a){return t[0]=n[0]+a[0],t[1]=n[1]+a[1],t[2]=n[2]+a[2],t[3]=n[3]+a[3],t[4]=n[4]+a[4],t[5]=n[5]+a[5],t[6]=n[6]+a[6],t[7]=n[7]+a[7],t[8]=n[8]+a[8],t[9]=n[9]+a[9],t[10]=n[10]+a[10],t[11]=n[11]+a[11],t[12]=n[12]+a[12],t[13]=n[13]+a[13],t[14]=n[14]+a[14],t[15]=n[15]+a[15],t},subtract:S,multiplyScalar:function(t,n,a){return t[0]=n[0]*a,t[1]=n[1]*a,t[2]=n[2]*a,t[3]=n[3]*a,t[4]=n[4]*a,t[5]=n[5]*a,t[6]=n[6]*a,t[7]=n[7]*a,t[8]=n[8]*a,t[9]=n[9]*a,t[10]=n[10]*a,t[11]=n[11]*a,t[12]=n[12]*a,t[13]=n[13]*a,t[14]=n[14]*a,t[15]=n[15]*a,t},multiplyScalarAndAdd:function(t,n,a,r){return t[0]=n[0]+a[0]*r,t[1]=n[1]+a[1]*r,t[2]=n[2]+a[2]*r,t[3]=n[3]+a[3]*r,t[4]=n[4]+a[4]*r,t[5]=n[5]+a[5]*r,t[6]=n[6]+a[6]*r,t[7]=n[7]+a[7]*r,t[8]=n[8]+a[8]*r,t[9]=n[9]+a[9]*r,t[10]=n[10]+a[10]*r,t[11]=n[11]+a[11]*r,t[12]=n[12]+a[12]*r,t[13]=n[13]+a[13]*r,t[14]=n[14]+a[14]*r,t[15]=n[15]+a[15]*r,t},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]&&t[4]===n[4]&&t[5]===n[5]&&t[6]===n[6]&&t[7]===n[7]&&t[8]===n[8]&&t[9]===n[9]&&t[10]===n[10]&&t[11]===n[11]&&t[12]===n[12]&&t[13]===n[13]&&t[14]===n[14]&&t[15]===n[15]},equals:function(t,a){var r=t[0],u=t[1],e=t[2],o=t[3],i=t[4],s=t[5],c=t[6],h=t[7],M=t[8],f=t[9],l=t[10],v=t[11],b=t[12],m=t[13],d=t[14],x=t[15],q=a[0],p=a[1],y=a[2],g=a[3],_=a[4],A=a[5],w=a[6],z=a[7],R=a[8],O=a[9],j=a[10],E=a[11],P=a[12],T=a[13],D=a[14],S=a[15];return Math.abs(r-q)<=n*Math.max(1,Math.abs(r),Math.abs(q))&&Math.abs(u-p)<=n*Math.max(1,Math.abs(u),Math.abs(p))&&Math.abs(e-y)<=n*Math.max(1,Math.abs(e),Math.abs(y))&&Math.abs(o-g)<=n*Math.max(1,Math.abs(o),Math.abs(g))&&Math.abs(i-_)<=n*Math.max(1,Math.abs(i),Math.abs(_))&&Math.abs(s-A)<=n*Math.max(1,Math.abs(s),Math.abs(A))&&Math.abs(c-w)<=n*Math.max(1,Math.abs(c),Math.abs(w))&&Math.abs(h-z)<=n*Math.max(1,Math.abs(h),Math.abs(z))&&Math.abs(M-R)<=n*Math.max(1,Math.abs(M),Math.abs(R))&&Math.abs(f-O)<=n*Math.max(1,Math.abs(f),Math.abs(O))&&Math.abs(l-j)<=n*Math.max(1,Math.abs(l),Math.abs(j))&&Math.abs(v-E)<=n*Math.max(1,Math.abs(v),Math.abs(E))&&Math.abs(b-P)<=n*Math.max(1,Math.abs(b),Math.abs(P))&&Math.abs(m-T)<=n*Math.max(1,Math.abs(m),Math.abs(T))&&Math.abs(d-D)<=n*Math.max(1,Math.abs(d),Math.abs(D))&&Math.abs(x-S)<=n*Math.max(1,Math.abs(x),Math.abs(S))},mul:I,sub:F});function V(){var t=new a(3);return a!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0),t}function k(t){var n=t[0],a=t[1],r=t[2];return Math.sqrt(n*n+a*a+r*r)}function Q(t,n,r){var u=new a(3);return u[0]=t,u[1]=n,u[2]=r,u}function Y(t,n,a){return t[0]=n[0]-a[0],t[1]=n[1]-a[1],t[2]=n[2]-a[2],t}function Z(t,n,a){return t[0]=n[0]*a[0],t[1]=n[1]*a[1],t[2]=n[2]*a[2],t}function N(t,n,a){return t[0]=n[0]/a[0],t[1]=n[1]/a[1],t[2]=n[2]/a[2],t}function X(t,n){var a=n[0]-t[0],r=n[1]-t[1],u=n[2]-t[2];return Math.sqrt(a*a+r*r+u*u)}function B(t,n){var a=n[0]-t[0],r=n[1]-t[1],u=n[2]-t[2];return a*a+r*r+u*u}function U(t){var n=t[0],a=t[1],r=t[2];return n*n+a*a+r*r}function G(t,n){var a=n[0],r=n[1],u=n[2],e=a*a+r*r+u*u;return e>0&&(e=1/Math.sqrt(e)),t[0]=n[0]*e,t[1]=n[1]*e,t[2]=n[2]*e,t}function W(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]}function C(t,n,a){var r=n[0],u=n[1],e=n[2],o=a[0],i=a[1],s=a[2];return t[0]=u*s-e*i,t[1]=e*o-r*s,t[2]=r*i-u*o,t}var H,J=Y,K=Z,$=N,tt=X,nt=B,at=k,rt=U,ut=(H=V(),function(t,n,a,r,u,e){var o,i;for(n||(n=3),a||(a=0),i=r?Math.min(r*n+a,t.length):t.length,o=a;o0&&(o=1/Math.sqrt(o)),t[0]=a*o,t[1]=r*o,t[2]=u*o,t[3]=e*o,t}function yt(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]+t[3]*n[3]}function gt(t,n,a,r){var u=n[0],e=n[1],o=n[2],i=n[3];return t[0]=u+r*(a[0]-u),t[1]=e+r*(a[1]-e),t[2]=o+r*(a[2]-o),t[3]=i+r*(a[3]-i),t}function _t(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]}var At=ft,wt=lt,zt=vt,Rt=mt,Ot=dt,jt=xt,Et=qt,Pt=function(){var t=ot();return function(n,a,r,u,e,o){var i,s;for(a||(a=4),r||(r=0),s=u?Math.min(u*a+r,n.length):n.length,i=r;i0?i*Math.sin(o)/o:0;return t[0]=a*s,t[1]=r*s,t[2]=u*s,t[3]=i*Math.cos(o),t}function Qt(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=Math.sqrt(a*a+r*r+u*u),i=o>0?Math.atan2(o,e)/o:0;return t[0]=a*i,t[1]=r*i,t[2]=u*i,t[3]=.5*Math.log(a*a+r*r+u*u+e*e),t}function Yt(t,a,r,u){var e,o,i,s,c,h=a[0],M=a[1],f=a[2],l=a[3],v=r[0],b=r[1],m=r[2],d=r[3];return(o=h*v+M*b+f*m+l*d)<0&&(o=-o,v=-v,b=-b,m=-m,d=-d),1-o>n?(e=Math.acos(o),i=Math.sin(e),s=Math.sin((1-u)*e)/i,c=Math.sin(u*e)/i):(s=1-u,c=u),t[0]=s*h+c*v,t[1]=s*M+c*b,t[2]=s*f+c*m,t[3]=s*l+c*d,t}function Zt(t,n){var a,r=n[0]+n[4]+n[8];if(r>0)a=Math.sqrt(r+1),t[3]=.5*a,a=.5/a,t[0]=(n[5]-n[7])*a,t[1]=(n[6]-n[2])*a,t[2]=(n[1]-n[3])*a;else{var u=0;n[4]>n[0]&&(u=1),n[8]>n[3*u+u]&&(u=2);var e=(u+1)%3,o=(u+2)%3;a=Math.sqrt(n[3*u+u]-n[3*e+e]-n[3*o+o]+1),t[u]=.5*a,a=.5/a,t[3]=(n[3*e+o]-n[3*o+e])*a,t[e]=(n[3*e+u]+n[3*u+e])*a,t[o]=(n[3*o+u]+n[3*u+o])*a}return t}var Nt=it,Xt=st,Bt=ct,Ut=ht,Gt=Mt,Wt=It,Ct=bt,Ht=yt,Jt=gt,Kt=xt,$t=Kt,tn=qt,nn=tn,an=pt,rn=_t;var un,en,on,sn,cn,hn,Mn=(un=V(),en=Q(1,0,0),on=Q(0,1,0),function(t,n,a){var r=W(n,a);return r<-.999999?(C(un,en,n),at(un)<1e-6&&C(un,on,n),G(un,un),St(t,un,Math.PI),t):r>.999999?(t[0]=0,t[1]=0,t[2]=0,t[3]=1,t):(C(un,n,a),t[0]=un[0],t[1]=un[1],t[2]=un[2],t[3]=1+r,an(t,t))}),fn=(sn=Dt(),cn=Dt(),function(t,n,a,r,u,e){return Yt(sn,n,u,e),Yt(cn,a,r,e),Yt(t,sn,cn,2*e*(1-e)),t}),ln=(hn=x(),function(t,n,a,r){return hn[0]=a[0],hn[3]=a[1],hn[6]=a[2],hn[1]=r[0],hn[4]=r[1],hn[7]=r[2],hn[2]=-n[0],hn[5]=-n[1],hn[8]=-n[2],an(t,Zt(t,hn))}),vn=Object.freeze({__proto__:null,create:Dt,identity:function(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t},setAxisAngle:St,getAxisAngle:function(t,a){var r=2*Math.acos(a[3]),u=Math.sin(r/2);return u>n?(t[0]=a[0]/u,t[1]=a[1]/u,t[2]=a[2]/u):(t[0]=1,t[1]=0,t[2]=0),r},getAngle:function(t,n){var a=Ht(t,n);return Math.acos(2*a*a-1)},multiply:It,rotateX:Ft,rotateY:Lt,rotateZ:Vt,calculateW:function(t,n){var a=n[0],r=n[1],u=n[2];return t[0]=a,t[1]=r,t[2]=u,t[3]=Math.sqrt(Math.abs(1-a*a-r*r-u*u)),t},exp:kt,ln:Qt,pow:function(t,n,a){return Qt(t,n),Ct(t,t,a),kt(t,t),t},slerp:Yt,random:function(t){var n=r(),a=r(),u=r(),e=Math.sqrt(1-n),o=Math.sqrt(n);return t[0]=e*Math.sin(2*Math.PI*a),t[1]=e*Math.cos(2*Math.PI*a),t[2]=o*Math.sin(2*Math.PI*u),t[3]=o*Math.cos(2*Math.PI*u),t},invert:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=a*a+r*r+u*u+e*e,i=o?1/o:0;return t[0]=-a*i,t[1]=-r*i,t[2]=-u*i,t[3]=e*i,t},conjugate:function(t,n){return t[0]=-n[0],t[1]=-n[1],t[2]=-n[2],t[3]=n[3],t},fromMat3:Zt,fromEuler:function(t,n,a,r){var u=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"zyx",e=Math.PI/360;n*=e,r*=e,a*=e;var o=Math.sin(n),i=Math.cos(n),s=Math.sin(a),c=Math.cos(a),h=Math.sin(r),M=Math.cos(r);switch(u){case"xyz":t[0]=o*c*M+i*s*h,t[1]=i*s*M-o*c*h,t[2]=i*c*h+o*s*M,t[3]=i*c*M-o*s*h;break;case"xzy":t[0]=o*c*M-i*s*h,t[1]=i*s*M-o*c*h,t[2]=i*c*h+o*s*M,t[3]=i*c*M+o*s*h;break;case"yxz":t[0]=o*c*M+i*s*h,t[1]=i*s*M-o*c*h,t[2]=i*c*h-o*s*M,t[3]=i*c*M+o*s*h;break;case"yzx":t[0]=o*c*M+i*s*h,t[1]=i*s*M+o*c*h,t[2]=i*c*h-o*s*M,t[3]=i*c*M-o*s*h;break;case"zxy":t[0]=o*c*M-i*s*h,t[1]=i*s*M+o*c*h,t[2]=i*c*h+o*s*M,t[3]=i*c*M-o*s*h;break;case"zyx":t[0]=o*c*M-i*s*h,t[1]=i*s*M+o*c*h,t[2]=i*c*h-o*s*M,t[3]=i*c*M+o*s*h;break;default:throw new Error("Unknown angle order "+u)}return t},str:function(t){return"quat("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},clone:Nt,fromValues:Xt,copy:Bt,set:Ut,add:Gt,mul:Wt,scale:Ct,dot:Ht,lerp:Jt,length:Kt,len:$t,squaredLength:tn,sqrLen:nn,normalize:an,exactEquals:rn,equals:function(t,n){return Math.abs(yt(t,n))>=.999999},rotationTo:Mn,sqlerp:fn,setAxes:ln});function bn(t,n,a){var r=.5*a[0],u=.5*a[1],e=.5*a[2],o=n[0],i=n[1],s=n[2],c=n[3];return t[0]=o,t[1]=i,t[2]=s,t[3]=c,t[4]=r*c+u*s-e*i,t[5]=u*c+e*o-r*s,t[6]=e*c+r*i-u*o,t[7]=-r*o-u*i-e*s,t}function mn(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t}var dn=Bt;var xn=Bt;function qn(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=a[4],s=a[5],c=a[6],h=a[7],M=n[4],f=n[5],l=n[6],v=n[7],b=a[0],m=a[1],d=a[2],x=a[3];return t[0]=r*x+o*b+u*d-e*m,t[1]=u*x+o*m+e*b-r*d,t[2]=e*x+o*d+r*m-u*b,t[3]=o*x-r*b-u*m-e*d,t[4]=r*h+o*i+u*c-e*s+M*x+v*b+f*d-l*m,t[5]=u*h+o*s+e*i-r*c+f*x+v*m+l*b-M*d,t[6]=e*h+o*c+r*s-u*i+l*x+v*d+M*m-f*b,t[7]=o*h-r*i-u*s-e*c+v*x-M*b-f*m-l*d,t}var pn=qn;var yn=Ht;var gn=Kt,_n=gn,An=tn,wn=An;var zn=Object.freeze({__proto__:null,create:function(){var t=new a(8);return a!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0,t[4]=0,t[5]=0,t[6]=0,t[7]=0),t[3]=1,t},clone:function(t){var n=new a(8);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n},fromValues:function(t,n,r,u,e,o,i,s){var c=new a(8);return c[0]=t,c[1]=n,c[2]=r,c[3]=u,c[4]=e,c[5]=o,c[6]=i,c[7]=s,c},fromRotationTranslationValues:function(t,n,r,u,e,o,i){var s=new a(8);s[0]=t,s[1]=n,s[2]=r,s[3]=u;var c=.5*e,h=.5*o,M=.5*i;return s[4]=c*u+h*r-M*n,s[5]=h*u+M*t-c*r,s[6]=M*u+c*n-h*t,s[7]=-c*t-h*n-M*r,s},fromRotationTranslation:bn,fromTranslation:function(t,n){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t[4]=.5*n[0],t[5]=.5*n[1],t[6]=.5*n[2],t[7]=0,t},fromRotation:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=0,t[5]=0,t[6]=0,t[7]=0,t},fromMat4:function(t,n){var r=Dt();j(r,n);var u=new a(3);return R(u,n),bn(t,r,u),t},copy:mn,identity:function(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t[6]=0,t[7]=0,t},set:function(t,n,a,r,u,e,o,i,s){return t[0]=n,t[1]=a,t[2]=r,t[3]=u,t[4]=e,t[5]=o,t[6]=i,t[7]=s,t},getReal:dn,getDual:function(t,n){return t[0]=n[4],t[1]=n[5],t[2]=n[6],t[3]=n[7],t},setReal:xn,setDual:function(t,n){return t[4]=n[0],t[5]=n[1],t[6]=n[2],t[7]=n[3],t},getTranslation:function(t,n){var a=n[4],r=n[5],u=n[6],e=n[7],o=-n[0],i=-n[1],s=-n[2],c=n[3];return t[0]=2*(a*c+e*o+r*s-u*i),t[1]=2*(r*c+e*i+u*o-a*s),t[2]=2*(u*c+e*s+a*i-r*o),t},translate:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=.5*a[0],s=.5*a[1],c=.5*a[2],h=n[4],M=n[5],f=n[6],l=n[7];return t[0]=r,t[1]=u,t[2]=e,t[3]=o,t[4]=o*i+u*c-e*s+h,t[5]=o*s+e*i-r*c+M,t[6]=o*c+r*s-u*i+f,t[7]=-r*i-u*s-e*c+l,t},rotateX:function(t,n,a){var r=-n[0],u=-n[1],e=-n[2],o=n[3],i=n[4],s=n[5],c=n[6],h=n[7],M=i*o+h*r+s*e-c*u,f=s*o+h*u+c*r-i*e,l=c*o+h*e+i*u-s*r,v=h*o-i*r-s*u-c*e;return Ft(t,n,a),r=t[0],u=t[1],e=t[2],o=t[3],t[4]=M*o+v*r+f*e-l*u,t[5]=f*o+v*u+l*r-M*e,t[6]=l*o+v*e+M*u-f*r,t[7]=v*o-M*r-f*u-l*e,t},rotateY:function(t,n,a){var r=-n[0],u=-n[1],e=-n[2],o=n[3],i=n[4],s=n[5],c=n[6],h=n[7],M=i*o+h*r+s*e-c*u,f=s*o+h*u+c*r-i*e,l=c*o+h*e+i*u-s*r,v=h*o-i*r-s*u-c*e;return Lt(t,n,a),r=t[0],u=t[1],e=t[2],o=t[3],t[4]=M*o+v*r+f*e-l*u,t[5]=f*o+v*u+l*r-M*e,t[6]=l*o+v*e+M*u-f*r,t[7]=v*o-M*r-f*u-l*e,t},rotateZ:function(t,n,a){var r=-n[0],u=-n[1],e=-n[2],o=n[3],i=n[4],s=n[5],c=n[6],h=n[7],M=i*o+h*r+s*e-c*u,f=s*o+h*u+c*r-i*e,l=c*o+h*e+i*u-s*r,v=h*o-i*r-s*u-c*e;return Vt(t,n,a),r=t[0],u=t[1],e=t[2],o=t[3],t[4]=M*o+v*r+f*e-l*u,t[5]=f*o+v*u+l*r-M*e,t[6]=l*o+v*e+M*u-f*r,t[7]=v*o-M*r-f*u-l*e,t},rotateByQuatAppend:function(t,n,a){var r=a[0],u=a[1],e=a[2],o=a[3],i=n[0],s=n[1],c=n[2],h=n[3];return t[0]=i*o+h*r+s*e-c*u,t[1]=s*o+h*u+c*r-i*e,t[2]=c*o+h*e+i*u-s*r,t[3]=h*o-i*r-s*u-c*e,i=n[4],s=n[5],c=n[6],h=n[7],t[4]=i*o+h*r+s*e-c*u,t[5]=s*o+h*u+c*r-i*e,t[6]=c*o+h*e+i*u-s*r,t[7]=h*o-i*r-s*u-c*e,t},rotateByQuatPrepend:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=a[0],s=a[1],c=a[2],h=a[3];return t[0]=r*h+o*i+u*c-e*s,t[1]=u*h+o*s+e*i-r*c,t[2]=e*h+o*c+r*s-u*i,t[3]=o*h-r*i-u*s-e*c,i=a[4],s=a[5],c=a[6],h=a[7],t[4]=r*h+o*i+u*c-e*s,t[5]=u*h+o*s+e*i-r*c,t[6]=e*h+o*c+r*s-u*i,t[7]=o*h-r*i-u*s-e*c,t},rotateAroundAxis:function(t,a,r,u){if(Math.abs(u)0){a=Math.sqrt(a);var r=n[0]/a,u=n[1]/a,e=n[2]/a,o=n[3]/a,i=n[4],s=n[5],c=n[6],h=n[7],M=r*i+u*s+e*c+o*h;t[0]=r,t[1]=u,t[2]=e,t[3]=o,t[4]=(i-r*M)/a,t[5]=(s-u*M)/a,t[6]=(c-e*M)/a,t[7]=(h-o*M)/a}return t},str:function(t){return"quat2("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+")"},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]&&t[4]===n[4]&&t[5]===n[5]&&t[6]===n[6]&&t[7]===n[7]},equals:function(t,a){var r=t[0],u=t[1],e=t[2],o=t[3],i=t[4],s=t[5],c=t[6],h=t[7],M=a[0],f=a[1],l=a[2],v=a[3],b=a[4],m=a[5],d=a[6],x=a[7];return Math.abs(r-M)<=n*Math.max(1,Math.abs(r),Math.abs(M))&&Math.abs(u-f)<=n*Math.max(1,Math.abs(u),Math.abs(f))&&Math.abs(e-l)<=n*Math.max(1,Math.abs(e),Math.abs(l))&&Math.abs(o-v)<=n*Math.max(1,Math.abs(o),Math.abs(v))&&Math.abs(i-b)<=n*Math.max(1,Math.abs(i),Math.abs(b))&&Math.abs(s-m)<=n*Math.max(1,Math.abs(s),Math.abs(m))&&Math.abs(c-d)<=n*Math.max(1,Math.abs(c),Math.abs(d))&&Math.abs(h-x)<=n*Math.max(1,Math.abs(h),Math.abs(x))}});function Rn(){var t=new a(2);return a!=Float32Array&&(t[0]=0,t[1]=0),t}function On(t,n,a){return t[0]=n[0]-a[0],t[1]=n[1]-a[1],t}function jn(t,n,a){return t[0]=n[0]*a[0],t[1]=n[1]*a[1],t}function En(t,n,a){return t[0]=n[0]/a[0],t[1]=n[1]/a[1],t}function Pn(t,n){var a=n[0]-t[0],r=n[1]-t[1];return Math.sqrt(a*a+r*r)}function Tn(t,n){var a=n[0]-t[0],r=n[1]-t[1];return a*a+r*r}function Dn(t){var n=t[0],a=t[1];return Math.sqrt(n*n+a*a)}function Sn(t){var n=t[0],a=t[1];return n*n+a*a}var In=Dn,Fn=On,Ln=jn,Vn=En,kn=Pn,Qn=Tn,Yn=Sn,Zn=function(){var t=Rn();return function(n,a,r,u,e,o){var i,s;for(a||(a=2),r||(r=0),s=u?Math.min(u*a+r,n.length):n.length,i=r;i0&&(u=1/Math.sqrt(u)),t[0]=n[0]*u,t[1]=n[1]*u,t},dot:function(t,n){return t[0]*n[0]+t[1]*n[1]},cross:function(t,n,a){var r=n[0]*a[1]-n[1]*a[0];return t[0]=t[1]=0,t[2]=r,t},lerp:function(t,n,a,r){var u=n[0],e=n[1];return t[0]=u+r*(a[0]-u),t[1]=e+r*(a[1]-e),t},random:function(t,n){n=void 0===n?1:n;var a=2*r()*Math.PI;return t[0]=Math.cos(a)*n,t[1]=Math.sin(a)*n,t},transformMat2:function(t,n,a){var r=n[0],u=n[1];return t[0]=a[0]*r+a[2]*u,t[1]=a[1]*r+a[3]*u,t},transformMat2d:function(t,n,a){var r=n[0],u=n[1];return t[0]=a[0]*r+a[2]*u+a[4],t[1]=a[1]*r+a[3]*u+a[5],t},transformMat3:function(t,n,a){var r=n[0],u=n[1];return t[0]=a[0]*r+a[3]*u+a[6],t[1]=a[1]*r+a[4]*u+a[7],t},transformMat4:function(t,n,a){var r=n[0],u=n[1];return t[0]=a[0]*r+a[4]*u+a[12],t[1]=a[1]*r+a[5]*u+a[13],t},rotate:function(t,n,a,r){var u=n[0]-a[0],e=n[1]-a[1],o=Math.sin(r),i=Math.cos(r);return t[0]=u*i-e*o+a[0],t[1]=u*o+e*i+a[1],t},angle:function(t,n){var a=t[0],r=t[1],u=n[0],e=n[1];return Math.abs(Math.atan2(r*u-a*e,a*u+r*e))},signedAngle:function(t,n){var a=t[0],r=t[1],u=n[0],e=n[1];return Math.atan2(a*e-r*u,a*u+r*e)},zero:function(t){return t[0]=0,t[1]=0,t},str:function(t){return"vec2("+t[0]+", "+t[1]+")"},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]},equals:function(t,a){var r=t[0],u=t[1],e=a[0],o=a[1];return Math.abs(r-e)<=n*Math.max(1,Math.abs(r),Math.abs(e))&&Math.abs(u-o)<=n*Math.max(1,Math.abs(u),Math.abs(o))},len:In,sub:Fn,mul:Ln,div:Vn,dist:kn,sqrDist:Qn,sqrLen:Yn,forEach:Zn});t.glMatrix=i,t.mat2=f,t.mat2d=d,t.mat3=_,t.mat4=L,t.quat=vn,t.quat2=zn,t.vec2=Nn,t.vec3=et,t.vec4=Tt,Object.defineProperty(t,"__esModule",{value:!0})})); +!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((t="undefined"!=typeof globalThis?globalThis:t||self).glMatrix={})}(this,(function(t){"use strict";function n(t,n,r){return n=e(n),function(t,n){if(n&&("object"==typeof n||"function"==typeof n))return n;if(void 0!==n)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(t,a()?Reflect.construct(n,r||[],e(t).constructor):n.apply(t,r))}function r(t,n){for(var r=0;r2&&void 0!==arguments[2]?arguments[2]:i;return Math.abs(t-n)<=r*Math.max(1,Math.abs(t),Math.abs(n))}function m(t){return function(t){function e(){var t;!function(t,n){if(!(t instanceof n))throw new TypeError("Cannot call a class as a function")}(this,e);for(var r=arguments.length,a=new Array(r),u=0;u0?(p=2*Math.sqrt(d+1),t[3]=.25*p,t[0]=(l-v)/p,t[1]=(M-f)/p,t[2]=(i-s)/p):o>h&&o>m?(p=2*Math.sqrt(1+o-h-m),t[3]=(l-v)/p,t[0]=.25*p,t[1]=(i+s)/p,t[2]=(M+f)/p):h>m?(p=2*Math.sqrt(1+h-o-m),t[3]=(M-f)/p,t[0]=(i+s)/p,t[1]=.25*p,t[2]=(l+v)/p):(p=2*Math.sqrt(1+m-o-h),t[3]=(i-s)/p,t[0]=(M+f)/p,t[1]=(l+v)/p,t[2]=.25*p),t}function Y(t,n,r,e,a){var u=1/Math.tan(n/2);if(t[0]=u/r,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=u,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=-1,t[12]=0,t[13]=0,t[15]=0,null!=a&&a!==1/0){var o=1/(e-a);t[10]=(a+e)*o,t[14]=2*a*e*o}else t[10]=-1,t[14]=-2*e;return t}var Z=Y;function F(t,n,r,e,a,u,o){var i=1/(n-r),c=1/(e-a),f=1/(u-o);return t[0]=-2*i,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*c,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*f,t[11]=0,t[12]=(n+r)*i,t[13]=(a+e)*c,t[14]=(o+u)*f,t[15]=1,t}var N=F;function Q(t,n,r){return t[0]=n[0]-r[0],t[1]=n[1]-r[1],t[2]=n[2]-r[2],t[3]=n[3]-r[3],t[4]=n[4]-r[4],t[5]=n[5]-r[5],t[6]=n[6]-r[6],t[7]=n[7]-r[7],t[8]=n[8]-r[8],t[9]=n[9]-r[9],t[10]=n[10]-r[10],t[11]=n[11]-r[11],t[12]=n[12]-r[12],t[13]=n[13]-r[13],t[14]=n[14]-r[14],t[15]=n[15]-r[15],t}var X=D,B=Q,U=Object.freeze({__proto__:null,create:function(){var t=new f(16);return t[0]=1,t[5]=1,t[10]=1,t[15]=1,t},clone:function(t){var n=new c(16);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n[8]=t[8],n[9]=t[9],n[10]=t[10],n[11]=t[11],n[12]=t[12],n[13]=t[13],n[14]=t[14],n[15]=t[15],n},copy:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t[9]=n[9],t[10]=n[10],t[11]=n[11],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15],t},fromValues:function(t,n,r,e,a,u,o,i,f,s,h,l,M,v,m,d){var p=new c(16);return p[0]=t,p[1]=n,p[2]=r,p[3]=e,p[4]=a,p[5]=u,p[6]=o,p[7]=i,p[8]=f,p[9]=s,p[10]=h,p[11]=l,p[12]=M,p[13]=v,p[14]=m,p[15]=d,p},set:function(t,n,r,e,a,u,o,i,c,f,s,h,l,M,v,m,d){return t[0]=n,t[1]=r,t[2]=e,t[3]=a,t[4]=u,t[5]=o,t[6]=i,t[7]=c,t[8]=f,t[9]=s,t[10]=h,t[11]=l,t[12]=M,t[13]=v,t[14]=m,t[15]=d,t},identity:S,transpose:function(t,n){var r=n[1],e=n[2],a=n[3],u=n[6],o=n[7],i=n[11];return t[0]=n[0],t[1]=n[4],t[2]=n[8],t[3]=n[12],t[4]=r,t[5]=n[5],t[6]=n[9],t[7]=n[13],t[8]=e,t[9]=u,t[10]=n[10],t[11]=n[14],t[12]=a,t[13]=o,t[14]=i,t[15]=n[15],t},invert:function(t,n){var r=n[0],e=n[1],a=n[2],u=n[3],o=n[4],i=n[5],c=n[6],f=n[7],s=n[8],h=n[9],l=n[10],M=n[11],v=n[12],m=n[13],d=n[14],p=n[15],b=r*i-e*o,y=r*c-a*o,g=r*f-u*o,q=e*c-a*i,w=e*f-u*i,x=a*f-u*c,_=s*m-h*v,A=s*d-l*v,O=s*p-M*v,j=h*d-l*m,P=h*p-M*m,R=l*p-M*d,z=b*R-y*P+g*j+q*O-w*A+x*_;return z?(z=1/z,t[0]=(i*R-c*P+f*j)*z,t[1]=(a*P-e*R-u*j)*z,t[2]=(m*x-d*w+p*q)*z,t[3]=(l*w-h*x-M*q)*z,t[4]=(c*O-o*R-f*A)*z,t[5]=(r*R-a*O+u*A)*z,t[6]=(d*g-v*x-p*y)*z,t[7]=(s*x-l*g+M*y)*z,t[8]=(o*P-i*O+f*_)*z,t[9]=(e*O-r*P-u*_)*z,t[10]=(v*w-m*g+p*b)*z,t[11]=(h*g-s*w-M*b)*z,t[12]=(i*A-o*j-c*_)*z,t[13]=(r*j-e*A+a*_)*z,t[14]=(m*y-v*q-d*b)*z,t[15]=(s*q-h*y+l*b)*z,t):null},adjoint:function(t,n){var r=n[0],e=n[1],a=n[2],u=n[3],o=n[4],i=n[5],c=n[6],f=n[7],s=n[8],h=n[9],l=n[10],M=n[11],v=n[12],m=n[13],d=n[14],p=n[15],b=r*i-e*o,y=r*c-a*o,g=r*f-u*o,q=e*c-a*i,w=e*f-u*i,x=a*f-u*c,_=s*m-h*v,A=s*d-l*v,O=s*p-M*v,j=h*d-l*m,P=h*p-M*m,R=l*p-M*d;return t[0]=i*R-c*P+f*j,t[1]=a*P-e*R-u*j,t[2]=m*x-d*w+p*q,t[3]=l*w-h*x-M*q,t[4]=c*O-o*R-f*A,t[5]=r*R-a*O+u*A,t[6]=d*g-v*x-p*y,t[7]=s*x-l*g+M*y,t[8]=o*P-i*O+f*_,t[9]=e*O-r*P-u*_,t[10]=v*w-m*g+p*b,t[11]=h*g-s*w-M*b,t[12]=i*A-o*j-c*_,t[13]=r*j-e*A+a*_,t[14]=m*y-v*q-d*b,t[15]=s*q-h*y+l*b,t},determinant:function(t){var n=t[0],r=t[1],e=t[2],a=t[3],u=t[4],o=t[5],i=t[6],c=t[7],f=t[8],s=t[9],h=t[10],l=t[11],M=t[12],v=t[13],m=t[14],d=n*o-r*u,p=n*i-e*u,b=r*i-e*o,y=f*v-s*M,g=f*m-h*M,q=s*m-h*v;return c*(n*q-r*g+e*y)-a*(u*q-o*g+i*y)+t[15]*(f*b-s*p+h*d)-l*(M*b-v*p+m*d)},multiply:D,translate:function(t,n,r){var e,a,u,o,i,c,f,s,h,l,M,v,m=r[0],d=r[1],p=r[2];return n===t?(t[12]=n[0]*m+n[4]*d+n[8]*p+n[12],t[13]=n[1]*m+n[5]*d+n[9]*p+n[13],t[14]=n[2]*m+n[6]*d+n[10]*p+n[14],t[15]=n[3]*m+n[7]*d+n[11]*p+n[15]):(e=n[0],a=n[1],u=n[2],o=n[3],i=n[4],c=n[5],f=n[6],s=n[7],h=n[8],l=n[9],M=n[10],v=n[11],t[0]=e,t[1]=a,t[2]=u,t[3]=o,t[4]=i,t[5]=c,t[6]=f,t[7]=s,t[8]=h,t[9]=l,t[10]=M,t[11]=v,t[12]=e*m+i*d+h*p+n[12],t[13]=a*m+c*d+l*p+n[13],t[14]=u*m+f*d+M*p+n[14],t[15]=o*m+s*d+v*p+n[15]),t},scale:function(t,n,r){var e=r[0],a=r[1],u=r[2];return t[0]=n[0]*e,t[1]=n[1]*e,t[2]=n[2]*e,t[3]=n[3]*e,t[4]=n[4]*a,t[5]=n[5]*a,t[6]=n[6]*a,t[7]=n[7]*a,t[8]=n[8]*u,t[9]=n[9]*u,t[10]=n[10]*u,t[11]=n[11]*u,t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15],t},rotate:function(t,n,r,e){var a,u,o,c,f,s,h,l,M,v,m,d,p,b,y,g,q,w,x,_,A,O,j,P,R=e[0],z=e[1],E=e[2],T=Math.sqrt(R*R+z*z+E*E);return T0?(r[0]=2*(i*o+h*e+f*u-s*a)/l,r[1]=2*(f*o+h*a+s*e-i*u)/l,r[2]=2*(s*o+h*u+i*a-f*e)/l):(r[0]=2*(i*o+h*e+f*u-s*a),r[1]=2*(f*o+h*a+s*e-i*u),r[2]=2*(s*o+h*u+i*a-f*e)),I(t,n,r),t},getTranslation:L,getScaling:V,getRotation:k,decompose:function(t,n,r,e){n[0]=e[12],n[1]=e[13],n[2]=e[14];var a=e[0],u=e[1],o=e[2],i=e[4],c=e[5],f=e[6],s=e[8],h=e[9],l=e[10];r[0]=Math.sqrt(a*a+u*u+o*o),r[1]=Math.sqrt(i*i+c*c+f*f),r[2]=Math.sqrt(s*s+h*h+l*l);var M=1/r[0],v=1/r[1],m=1/r[2],d=a*M,p=u*v,b=o*m,y=i*M,g=c*v,q=f*m,w=s*M,x=h*v,_=l*m,A=d+g+_,O=0;return A>0?(O=2*Math.sqrt(A+1),t[3]=.25*O,t[0]=(q-x)/O,t[1]=(w-b)/O,t[2]=(p-y)/O):d>g&&d>_?(O=2*Math.sqrt(1+d-g-_),t[3]=(q-x)/O,t[0]=.25*O,t[1]=(p+y)/O,t[2]=(w+b)/O):g>_?(O=2*Math.sqrt(1+g-d-_),t[3]=(w-b)/O,t[0]=(p+y)/O,t[1]=.25*O,t[2]=(q+x)/O):(O=2*Math.sqrt(1+_-d-g),t[3]=(p-y)/O,t[0]=(w+b)/O,t[1]=(q+x)/O,t[2]=.25*O),t},fromRotationTranslationScale:function(t,n,r,e){var a=n[0],u=n[1],o=n[2],i=n[3],c=a+a,f=u+u,s=o+o,h=a*c,l=a*f,M=a*s,v=u*f,m=u*s,d=o*s,p=i*c,b=i*f,y=i*s,g=e[0],q=e[1],w=e[2];return t[0]=(1-(v+d))*g,t[1]=(l+y)*g,t[2]=(M-b)*g,t[3]=0,t[4]=(l-y)*q,t[5]=(1-(h+d))*q,t[6]=(m+p)*q,t[7]=0,t[8]=(M+b)*w,t[9]=(m-p)*w,t[10]=(1-(h+v))*w,t[11]=0,t[12]=r[0],t[13]=r[1],t[14]=r[2],t[15]=1,t},fromRotationTranslationScaleOrigin:function(t,n,r,e,a){var u=n[0],o=n[1],i=n[2],c=n[3],f=u+u,s=o+o,h=i+i,l=u*f,M=u*s,v=u*h,m=o*s,d=o*h,p=i*h,b=c*f,y=c*s,g=c*h,q=e[0],w=e[1],x=e[2],_=a[0],A=a[1],O=a[2],j=(1-(m+p))*q,P=(M+g)*q,R=(v-y)*q,z=(M-g)*w,E=(1-(l+p))*w,T=(d+b)*w,S=(v+y)*x,D=(d-b)*x,I=(1-(l+m))*x;return t[0]=j,t[1]=P,t[2]=R,t[3]=0,t[4]=z,t[5]=E,t[6]=T,t[7]=0,t[8]=S,t[9]=D,t[10]=I,t[11]=0,t[12]=r[0]+_-(j*_+z*A+S*O),t[13]=r[1]+A-(P*_+E*A+D*O),t[14]=r[2]+O-(R*_+T*A+I*O),t[15]=1,t},fromQuat:function(t,n){var r=n[0],e=n[1],a=n[2],u=n[3],o=r+r,i=e+e,c=a+a,f=r*o,s=e*o,h=e*i,l=a*o,M=a*i,v=a*c,m=u*o,d=u*i,p=u*c;return t[0]=1-h-v,t[1]=s+p,t[2]=l-d,t[3]=0,t[4]=s-p,t[5]=1-f-v,t[6]=M+m,t[7]=0,t[8]=l+d,t[9]=M-m,t[10]=1-f-h,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},frustum:function(t,n,r,e,a,u,o){var i=1/(r-n),c=1/(a-e),f=1/(u-o);return t[0]=2*u*i,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=2*u*c,t[6]=0,t[7]=0,t[8]=(r+n)*i,t[9]=(a+e)*c,t[10]=(o+u)*f,t[11]=-1,t[12]=0,t[13]=0,t[14]=o*u*2*f,t[15]=0,t},perspectiveNO:Y,perspective:Z,perspectiveZO:function(t,n,r,e,a){var u=1/Math.tan(n/2);if(t[0]=u/r,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=u,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=-1,t[12]=0,t[13]=0,t[15]=0,null!=a&&a!==1/0){var o=1/(e-a);t[10]=a*o,t[14]=a*e*o}else t[10]=-1,t[14]=-e;return t},perspectiveFromFieldOfView:function(t,n,r,e){var a=Math.tan(n.upDegrees*Math.PI/180),u=Math.tan(n.downDegrees*Math.PI/180),o=Math.tan(n.leftDegrees*Math.PI/180),i=Math.tan(n.rightDegrees*Math.PI/180),c=2/(o+i),f=2/(a+u);return t[0]=c,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=f,t[6]=0,t[7]=0,t[8]=-(o-i)*c*.5,t[9]=(a-u)*f*.5,t[10]=e/(r-e),t[11]=-1,t[12]=0,t[13]=0,t[14]=e*r/(r-e),t[15]=0,t},orthoNO:F,ortho:N,orthoZO:function(t,n,r,e,a,u,o){var i=1/(n-r),c=1/(e-a),f=1/(u-o);return t[0]=-2*i,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*c,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=f,t[11]=0,t[12]=(n+r)*i,t[13]=(a+e)*c,t[14]=u*f,t[15]=1,t},lookAt:function(t,n,r,e){var a,u,o,c,f,s,h,l,M,v,m=n[0],d=n[1],p=n[2],b=e[0],y=e[1],g=e[2],q=r[0],w=r[1],x=r[2];return Math.abs(m-q)0&&(s*=M=1/Math.sqrt(M),h*=M,l*=M);var v=c*l-f*h,m=f*s-i*l,d=i*h-c*s;return(M=v*v+m*m+d*d)>0&&(v*=M=1/Math.sqrt(M),m*=M,d*=M),t[0]=v,t[1]=m,t[2]=d,t[3]=0,t[4]=h*d-l*m,t[5]=l*v-s*d,t[6]=s*m-h*v,t[7]=0,t[8]=s,t[9]=h,t[10]=l,t[11]=0,t[12]=a,t[13]=u,t[14]=o,t[15]=1,t},str:function(t){return"mat4("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+", "+t[8]+", "+t[9]+", "+t[10]+", "+t[11]+", "+t[12]+", "+t[13]+", "+t[14]+", "+t[15]+")"},frob:function(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]+t[3]*t[3]+t[4]*t[4]+t[5]*t[5]+t[6]*t[6]+t[7]*t[7]+t[8]*t[8]+t[9]*t[9]+t[10]*t[10]+t[11]*t[11]+t[12]*t[12]+t[13]*t[13]+t[14]*t[14]+t[15]*t[15])},add:function(t,n,r){return t[0]=n[0]+r[0],t[1]=n[1]+r[1],t[2]=n[2]+r[2],t[3]=n[3]+r[3],t[4]=n[4]+r[4],t[5]=n[5]+r[5],t[6]=n[6]+r[6],t[7]=n[7]+r[7],t[8]=n[8]+r[8],t[9]=n[9]+r[9],t[10]=n[10]+r[10],t[11]=n[11]+r[11],t[12]=n[12]+r[12],t[13]=n[13]+r[13],t[14]=n[14]+r[14],t[15]=n[15]+r[15],t},subtract:Q,multiplyScalar:function(t,n,r){return t[0]=n[0]*r,t[1]=n[1]*r,t[2]=n[2]*r,t[3]=n[3]*r,t[4]=n[4]*r,t[5]=n[5]*r,t[6]=n[6]*r,t[7]=n[7]*r,t[8]=n[8]*r,t[9]=n[9]*r,t[10]=n[10]*r,t[11]=n[11]*r,t[12]=n[12]*r,t[13]=n[13]*r,t[14]=n[14]*r,t[15]=n[15]*r,t},multiplyScalarAndAdd:function(t,n,r,e){return t[0]=n[0]+r[0]*e,t[1]=n[1]+r[1]*e,t[2]=n[2]+r[2]*e,t[3]=n[3]+r[3]*e,t[4]=n[4]+r[4]*e,t[5]=n[5]+r[5]*e,t[6]=n[6]+r[6]*e,t[7]=n[7]+r[7]*e,t[8]=n[8]+r[8]*e,t[9]=n[9]+r[9]*e,t[10]=n[10]+r[10]*e,t[11]=n[11]+r[11]*e,t[12]=n[12]+r[12]*e,t[13]=n[13]+r[13]*e,t[14]=n[14]+r[14]*e,t[15]=n[15]+r[15]*e,t},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]&&t[4]===n[4]&&t[5]===n[5]&&t[6]===n[6]&&t[7]===n[7]&&t[8]===n[8]&&t[9]===n[9]&&t[10]===n[10]&&t[11]===n[11]&&t[12]===n[12]&&t[13]===n[13]&&t[14]===n[14]&&t[15]===n[15]},equals:function(t,n){return v(t[0],n[0])&&v(t[1],n[1])&&v(t[2],n[2])&&v(t[3],n[3])&&v(t[4],n[4])&&v(t[5],n[5])&&v(t[6],n[6])&&v(t[7],n[7])&&v(t[8],n[8])&&v(t[9],n[9])&&v(t[10],n[10])&&v(t[11],n[11])&&v(t[12],n[12])&&v(t[13],n[13])&&v(t[14],n[14])&&v(t[15],n[15])},mul:X,sub:B});function C(){return new f(3)}function G(t){return Math.hypot(t[0],t[1],t[2])}function W(t,n,r){var e=new c(3);return e[0]=t,e[1]=n,e[2]=r,e}function H(t,n,r){return t[0]=n[0]-r[0],t[1]=n[1]-r[1],t[2]=n[2]-r[2],t}function J(t,n,r){return t[0]=n[0]*r[0],t[1]=n[1]*r[1],t[2]=n[2]*r[2],t}function K(t,n,r){return t[0]=n[0]/r[0],t[1]=n[1]/r[1],t[2]=n[2]/r[2],t}function $(t,n){return Math.hypot(n[0]-t[0],n[1]-t[1],n[2]-t[2])}function tt(t,n){return Math.pow(Math.hypot(n[0]-t[0],n[1]-t[1],n[2]-t[2]),2)}function nt(t){return Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)}function rt(t,n){var r=Math.max(Math.hypot(n[0],n[1],n[2]),i);return t[0]=n[0]/r,t[1]=n[1]/r,t[2]=n[2]/r,t}function et(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]}function at(t,n,r){var e=n[0],a=n[1],u=n[2],o=r[0],i=r[1],c=r[2];return t[0]=a*c-u*i,t[1]=u*o-e*c,t[2]=e*i-a*o,t}var ut,ot=H,it=J,ct=K,ft=$,st=tt,ht=G,lt=nt,Mt=(ut=C(),function(t,n){var r,e,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,u=arguments.length>3?arguments[3]:void 0,o=arguments.length>4?arguments[4]:void 0,i=arguments.length>5?arguments[5]:void 0;for(n=n||3,e=u?Math.min(u*n+a,t.length):t.length,r=a;r1&&void 0!==arguments[1]?arguments[1]:1,r=2*s()*Math.PI,e=2*s()-1,a=Math.sqrt(1-e*e)*n;return t[0]=Math.cos(r)*a,t[1]=Math.sin(r)*a,t[2]=e*n,t},transformMat4:function(t,n,r){var e=n[0],a=n[1],u=n[2],o=r[3]*e+r[7]*a+r[11]*u+r[15];return o=o||1,t[0]=(r[0]*e+r[4]*a+r[8]*u+r[12])/o,t[1]=(r[1]*e+r[5]*a+r[9]*u+r[13])/o,t[2]=(r[2]*e+r[6]*a+r[10]*u+r[14])/o,t},transformMat3:function(t,n,r){var e=n[0],a=n[1],u=n[2];return t[0]=e*r[0]+a*r[3]+u*r[6],t[1]=e*r[1]+a*r[4]+u*r[7],t[2]=e*r[2]+a*r[5]+u*r[8],t},transformQuat:function(t,n,r){var e=r[0],a=r[1],u=r[2],o=r[3],i=n[0],c=n[1],f=n[2],s=a*f-u*c,h=u*i-e*f,l=e*c-a*i;return s+=s,h+=h,l+=l,t[0]=i+o*s+a*l-u*h,t[1]=c+o*h+u*s-e*l,t[2]=f+o*l+e*h-a*s,t},rotateX:function(t,n,r,e){var a=[],u=[];return a[0]=n[0]-r[0],a[1]=n[1]-r[1],a[2]=n[2]-r[2],u[0]=a[0],u[1]=a[1]*Math.cos(e)-a[2]*Math.sin(e),u[2]=a[1]*Math.sin(e)+a[2]*Math.cos(e),t[0]=u[0]+r[0],t[1]=u[1]+r[1],t[2]=u[2]+r[2],t},rotateY:function(t,n,r,e){var a=[],u=[];return a[0]=n[0]-r[0],a[1]=n[1]-r[1],a[2]=n[2]-r[2],u[0]=a[2]*Math.sin(e)+a[0]*Math.cos(e),u[1]=a[1],u[2]=a[2]*Math.cos(e)-a[0]*Math.sin(e),t[0]=u[0]+r[0],t[1]=u[1]+r[1],t[2]=u[2]+r[2],t},rotateZ:function(t,n,r,e){var a=[],u=[];return a[0]=n[0]-r[0],a[1]=n[1]-r[1],a[2]=n[2]-r[2],u[0]=a[0]*Math.cos(e)-a[1]*Math.sin(e),u[1]=a[0]*Math.sin(e)+a[1]*Math.cos(e),u[2]=a[2],t[0]=u[0]+r[0],t[1]=u[1]+r[1],t[2]=u[2]+r[2],t},angle:function(t,n){var r=t[0],e=t[1],a=t[2],u=n[0],o=n[1],i=n[2],c=Math.sqrt((r*r+e*e+a*a)*(u*u+o*o+i*i)),f=c&&et(t,n)/c;return Math.acos(Math.min(Math.max(f,-1),1))},zero:function(t){return t[0]=0,t[1]=0,t[2]=0,t},str:function(t){return"vec3("+t[0]+", "+t[1]+", "+t[2]+")"},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]},equals:function(t,n){return v(t[0],n[0])&&v(t[1],n[1])&&v(t[2],n[2])},sub:ot,mul:it,div:ct,dist:ft,sqrDist:st,len:ht,sqrLen:lt,forEach:Mt});function mt(){return new f(4)}function dt(t){var n=new c(4);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n}function pt(t,n,r,e){var a=new c(4);return a[0]=t,a[1]=n,a[2]=r,a[3]=e,a}function bt(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t}function yt(t,n,r,e,a){return t[0]=n,t[1]=r,t[2]=e,t[3]=a,t}function gt(t,n,r){return t[0]=n[0]+r[0],t[1]=n[1]+r[1],t[2]=n[2]+r[2],t[3]=n[3]+r[3],t}function qt(t,n,r){return t[0]=n[0]-r[0],t[1]=n[1]-r[1],t[2]=n[2]-r[2],t[3]=n[3]-r[3],t}function wt(t,n,r){return t[0]=n[0]*r[0],t[1]=n[1]*r[1],t[2]=n[2]*r[2],t[3]=n[3]*r[3],t}function xt(t,n,r){return t[0]=n[0]/r[0],t[1]=n[1]/r[1],t[2]=n[2]/r[2],t[3]=n[3]/r[3],t}function _t(t,n,r){return t[0]=n[0]*r,t[1]=n[1]*r,t[2]=n[2]*r,t[3]=n[3]*r,t}function At(t,n){return Math.hypot(n[0]-t[0],n[1]-t[1],n[2]-t[2],n[3]-t[3])}function Ot(t,n){return Math.pow(Math.hypot(n[0]-t[0],n[1]-t[1],n[2]-t[2],n[3]-t[3]),2)}function jt(t){return Math.hypot(t[0],t[1],t[2],t[3])}function Pt(t){return Math.pow(Math.hypot(t[0],t[1],t[2],t[3]),2)}function Rt(t,n){var r=n[0],e=n[1],a=n[2],u=n[3],o=Math.max(Math.hypot(r,e,a,u),i);return t[0]=r/o,t[1]=e/o,t[2]=a/o,t[3]=u/o,t}function zt(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]+t[3]*n[3]}function Et(t,n,r,e){var a=n[0],u=n[1],o=n[2],i=n[3];return t[0]=a+e*(r[0]-a),t[1]=u+e*(r[1]-u),t[2]=o+e*(r[2]-o),t[3]=i+e*(r[3]-i),t}function Tt(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]}var St=qt,Dt=wt,It=xt,Lt=At,Vt=Ot,kt=jt,Yt=Pt,Zt=function(){var t=mt();return function(n,r){var e,a,u=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,o=arguments.length>3?arguments[3]:void 0,i=arguments.length>4?arguments[4]:void 0,c=arguments.length>5?arguments[5]:void 0;for(r=r||4,a=o?Math.min(o*r+u,n.length):n.length,e=u;e0?i*Math.sin(o)/o:0;return t[0]=r*c,t[1]=e*c,t[2]=a*c,t[3]=i*Math.cos(o),t}function Wt(t,n){var r=n[0],e=n[1],a=n[2],u=n[3],o=Math.sqrt(r*r+e*e+a*a),i=o>0?Math.atan2(o,u)/o:0;return t[0]=r*i,t[1]=e*i,t[2]=a*i,t[3]=.5*Math.log(r*r+e*e+a*a+u*u),t}function Ht(t,n,r,e){var a,u,o,c,f,s=n[0],h=n[1],l=n[2],M=n[3],v=r[0],m=r[1],d=r[2],p=r[3];return(u=s*v+h*m+l*d+M*p)<0&&(u=-u,v=-v,m=-m,d=-d,p=-p),1-u>i?(a=Math.acos(u),o=Math.sin(a),c=Math.sin((1-e)*a)/o,f=Math.sin(e*a)/o):(c=1-e,f=e),t[0]=c*s+f*v,t[1]=c*h+f*m,t[2]=c*l+f*d,t[3]=c*M+f*p,t}function Jt(t,n){var r,e=n[0]+n[4]+n[8];if(e>0)r=Math.sqrt(e+1),t[3]=.5*r,r=.5/r,t[0]=(n[5]-n[7])*r,t[1]=(n[6]-n[2])*r,t[2]=(n[1]-n[3])*r;else{var a=0;n[4]>n[0]&&(a=1),n[8]>n[3*a+a]&&(a=2);var u=(a+1)%3,o=(a+2)%3;r=Math.sqrt(n[3*a+a]-n[3*u+u]-n[3*o+o]+1),t[a]=.5*r,r=.5/r,t[3]=(n[3*u+o]-n[3*o+u])*r,t[u]=(n[3*u+a]+n[3*a+u])*r,t[o]=(n[3*o+a]+n[3*a+o])*r}return t}var Kt=dt,$t=pt,tn=bt,nn=yt,rn=gt,en=Xt,an=_t,un=zt,on=Et,cn=jt,fn=cn,sn=Pt,hn=sn,ln=Rt,Mn=Tt;var vn,mn,dn,pn,bn,yn,gn=(vn=C(),mn=W(1,0,0),dn=W(0,1,0),function(t,n,r){var e=et(n,r);return e<-.999999?(at(vn,mn,n),ht(vn)<1e-6&&at(vn,dn,n),rt(vn,vn),Qt(t,vn,Math.PI),t):e>.999999?(t[0]=0,t[1]=0,t[2]=0,t[3]=1,t):(at(vn,n,r),t[0]=vn[0],t[1]=vn[1],t[2]=vn[2],t[3]=1+e,ln(t,t))}),qn=(pn=Nt(),bn=Nt(),function(t,n,r,e,a,u){return Ht(pn,n,a,u),Ht(bn,r,e,u),Ht(t,pn,bn,2*u*(1-u)),t}),wn=(yn=j(),function(t,n,r,e){return yn[0]=r[0],yn[3]=r[1],yn[6]=r[2],yn[1]=e[0],yn[4]=e[1],yn[7]=e[2],yn[2]=-n[0],yn[5]=-n[1],yn[8]=-n[2],ln(t,Jt(t,yn))}),xn=Object.freeze({__proto__:null,create:Nt,identity:function(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t},setAxisAngle:Qt,getAxisAngle:function(t,n){var r=2*Math.acos(n[3]),e=Math.sin(r/2);return e>i?(t[0]=n[0]/e,t[1]=n[1]/e,t[2]=n[2]/e):(t[0]=1,t[1]=0,t[2]=0),r},getAngle:function(t,n){var r=un(t,n);return Math.acos(2*r*r-1)},multiply:Xt,rotateX:Bt,rotateY:Ut,rotateZ:Ct,calculateW:function(t,n){var r=n[0],e=n[1],a=n[2];return t[0]=r,t[1]=e,t[2]=a,t[3]=Math.sqrt(Math.abs(1-r*r-e*e-a*a)),t},exp:Gt,ln:Wt,pow:function(t,n,r){return Wt(t,n),an(t,t,r),Gt(t,t),t},slerp:Ht,random:function(t){var n=s(),r=s(),e=s(),a=Math.sqrt(1-n),u=Math.sqrt(n);return t[0]=a*Math.sin(2*Math.PI*r),t[1]=a*Math.cos(2*Math.PI*r),t[2]=u*Math.sin(2*Math.PI*e),t[3]=u*Math.cos(2*Math.PI*e),t},invert:function(t,n){var r=n[0],e=n[1],a=n[2],u=n[3],o=r*r+e*e+a*a+u*u,i=o?1/o:0;return t[0]=-r*i,t[1]=-e*i,t[2]=-a*i,t[3]=u*i,t},conjugate:function(t,n){return t[0]=-n[0],t[1]=-n[1],t[2]=-n[2],t[3]=n[3],t},fromMat3:Jt,fromEuler:function(t,n,r,e){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"zyx",u=Math.PI/360;n*=u,e*=u,r*=u;var o=Math.sin(n),i=Math.cos(n),c=Math.sin(r),f=Math.cos(r),s=Math.sin(e),h=Math.cos(e);switch(a){case"xyz":t[0]=o*f*h+i*c*s,t[1]=i*c*h-o*f*s,t[2]=i*f*s+o*c*h,t[3]=i*f*h-o*c*s;break;case"xzy":t[0]=o*f*h-i*c*s,t[1]=i*c*h-o*f*s,t[2]=i*f*s+o*c*h,t[3]=i*f*h+o*c*s;break;case"yxz":t[0]=o*f*h+i*c*s,t[1]=i*c*h-o*f*s,t[2]=i*f*s-o*c*h,t[3]=i*f*h+o*c*s;break;case"yzx":t[0]=o*f*h+i*c*s,t[1]=i*c*h+o*f*s,t[2]=i*f*s-o*c*h,t[3]=i*f*h-o*c*s;break;case"zxy":t[0]=o*f*h-i*c*s,t[1]=i*c*h+o*f*s,t[2]=i*f*s+o*c*h,t[3]=i*f*h-o*c*s;break;case"zyx":t[0]=o*f*h-i*c*s,t[1]=i*c*h+o*f*s,t[2]=i*f*s-o*c*h,t[3]=i*f*h+o*c*s;break;default:throw new Error("Unknown angle order "+a)}return t},str:function(t){return"quat("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},clone:Kt,fromValues:$t,copy:tn,set:nn,add:rn,mul:en,scale:an,dot:un,lerp:on,length:cn,len:fn,squaredLength:sn,sqrLen:hn,normalize:ln,exactEquals:Mn,equals:function(t,n){return Math.abs(zt(t,n))>=.999999},rotationTo:gn,sqlerp:qn,setAxes:wn});function _n(t,n,r){var e=.5*r[0],a=.5*r[1],u=.5*r[2],o=n[0],i=n[1],c=n[2],f=n[3];return t[0]=o,t[1]=i,t[2]=c,t[3]=f,t[4]=e*f+a*c-u*i,t[5]=a*f+u*o-e*c,t[6]=u*f+e*i-a*o,t[7]=-e*o-a*i-u*c,t}function An(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t}var On=tn;var jn=tn;function Pn(t,n,r){var e=n[0],a=n[1],u=n[2],o=n[3],i=r[4],c=r[5],f=r[6],s=r[7],h=n[4],l=n[5],M=n[6],v=n[7],m=r[0],d=r[1],p=r[2],b=r[3];return t[0]=e*b+o*m+a*p-u*d,t[1]=a*b+o*d+u*m-e*p,t[2]=u*b+o*p+e*d-a*m,t[3]=o*b-e*m-a*d-u*p,t[4]=e*s+o*i+a*f-u*c+h*b+v*m+l*p-M*d,t[5]=a*s+o*c+u*i-e*f+l*b+v*d+M*m-h*p,t[6]=u*s+o*f+e*c-a*i+M*b+v*p+h*d-l*m,t[7]=o*s-e*i-a*c-u*f+v*b-h*m-l*d-M*p,t}var Rn=Pn;var zn=un;var En=cn,Tn=En,Sn=sn,Dn=Sn;var In=Object.freeze({__proto__:null,create:function(){var t=new c(8);return c!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0,t[4]=0,t[5]=0,t[6]=0,t[7]=0),t[3]=1,t},clone:function(t){var n=new c(8);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n},fromValues:function(t,n,r,e,a,u,o,i){var f=new c(8);return f[0]=t,f[1]=n,f[2]=r,f[3]=e,f[4]=a,f[5]=u,f[6]=o,f[7]=i,f},fromRotationTranslationValues:function(t,n,r,e,a,u,o){var i=new c(8);i[0]=t,i[1]=n,i[2]=r,i[3]=e;var f=.5*a,s=.5*u,h=.5*o;return i[4]=f*e+s*r-h*n,i[5]=s*e+h*t-f*r,i[6]=h*e+f*n-s*t,i[7]=-f*t-s*n-h*r,i},fromRotationTranslation:_n,fromTranslation:function(t,n){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t[4]=.5*n[0],t[5]=.5*n[1],t[6]=.5*n[2],t[7]=0,t},fromRotation:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=0,t[5]=0,t[6]=0,t[7]=0,t},fromMat4:function(t,n){var r=Nt();k(r,n);var e=new c(3);return L(e,n),_n(t,r,e),t},copy:An,identity:function(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t[6]=0,t[7]=0,t},set:function(t,n,r,e,a,u,o,i,c){return t[0]=n,t[1]=r,t[2]=e,t[3]=a,t[4]=u,t[5]=o,t[6]=i,t[7]=c,t},getReal:On,getDual:function(t,n){return t[0]=n[4],t[1]=n[5],t[2]=n[6],t[3]=n[7],t},setReal:jn,setDual:function(t,n){return t[4]=n[0],t[5]=n[1],t[6]=n[2],t[7]=n[3],t},getTranslation:function(t,n){var r=n[4],e=n[5],a=n[6],u=n[7],o=-n[0],i=-n[1],c=-n[2],f=n[3];return t[0]=2*(r*f+u*o+e*c-a*i),t[1]=2*(e*f+u*i+a*o-r*c),t[2]=2*(a*f+u*c+r*i-e*o),t},translate:function(t,n,r){var e=n[0],a=n[1],u=n[2],o=n[3],i=.5*r[0],c=.5*r[1],f=.5*r[2],s=n[4],h=n[5],l=n[6],M=n[7];return t[0]=e,t[1]=a,t[2]=u,t[3]=o,t[4]=o*i+a*f-u*c+s,t[5]=o*c+u*i-e*f+h,t[6]=o*f+e*c-a*i+l,t[7]=-e*i-a*c-u*f+M,t},rotateX:function(t,n,r){var e=-n[0],a=-n[1],u=-n[2],o=n[3],i=n[4],c=n[5],f=n[6],s=n[7],h=i*o+s*e+c*u-f*a,l=c*o+s*a+f*e-i*u,M=f*o+s*u+i*a-c*e,v=s*o-i*e-c*a-f*u;return Bt(t,n,r),e=t[0],a=t[1],u=t[2],o=t[3],t[4]=h*o+v*e+l*u-M*a,t[5]=l*o+v*a+M*e-h*u,t[6]=M*o+v*u+h*a-l*e,t[7]=v*o-h*e-l*a-M*u,t},rotateY:function(t,n,r){var e=-n[0],a=-n[1],u=-n[2],o=n[3],i=n[4],c=n[5],f=n[6],s=n[7],h=i*o+s*e+c*u-f*a,l=c*o+s*a+f*e-i*u,M=f*o+s*u+i*a-c*e,v=s*o-i*e-c*a-f*u;return Ut(t,n,r),e=t[0],a=t[1],u=t[2],o=t[3],t[4]=h*o+v*e+l*u-M*a,t[5]=l*o+v*a+M*e-h*u,t[6]=M*o+v*u+h*a-l*e,t[7]=v*o-h*e-l*a-M*u,t},rotateZ:function(t,n,r){var e=-n[0],a=-n[1],u=-n[2],o=n[3],i=n[4],c=n[5],f=n[6],s=n[7],h=i*o+s*e+c*u-f*a,l=c*o+s*a+f*e-i*u,M=f*o+s*u+i*a-c*e,v=s*o-i*e-c*a-f*u;return Ct(t,n,r),e=t[0],a=t[1],u=t[2],o=t[3],t[4]=h*o+v*e+l*u-M*a,t[5]=l*o+v*a+M*e-h*u,t[6]=M*o+v*u+h*a-l*e,t[7]=v*o-h*e-l*a-M*u,t},rotateByQuatAppend:function(t,n,r){var e=r[0],a=r[1],u=r[2],o=r[3],i=n[0],c=n[1],f=n[2],s=n[3];return t[0]=i*o+s*e+c*u-f*a,t[1]=c*o+s*a+f*e-i*u,t[2]=f*o+s*u+i*a-c*e,t[3]=s*o-i*e-c*a-f*u,i=n[4],c=n[5],f=n[6],s=n[7],t[4]=i*o+s*e+c*u-f*a,t[5]=c*o+s*a+f*e-i*u,t[6]=f*o+s*u+i*a-c*e,t[7]=s*o-i*e-c*a-f*u,t},rotateByQuatPrepend:function(t,n,r){var e=n[0],a=n[1],u=n[2],o=n[3],i=r[0],c=r[1],f=r[2],s=r[3];return t[0]=e*s+o*i+a*f-u*c,t[1]=a*s+o*c+u*i-e*f,t[2]=u*s+o*f+e*c-a*i,t[3]=o*s-e*i-a*c-u*f,i=r[4],c=r[5],f=r[6],s=r[7],t[4]=e*s+o*i+a*f-u*c,t[5]=a*s+o*c+u*i-e*f,t[6]=u*s+o*f+e*c-a*i,t[7]=o*s-e*i-a*c-u*f,t},rotateAroundAxis:function(t,n,r,e){if(Math.abs(e)0){r=Math.sqrt(r);var e=n[0]/r,a=n[1]/r,u=n[2]/r,o=n[3]/r,i=n[4],c=n[5],f=n[6],s=n[7],h=e*i+a*c+u*f+o*s;t[0]=e,t[1]=a,t[2]=u,t[3]=o,t[4]=(i-e*h)/r,t[5]=(c-a*h)/r,t[6]=(f-u*h)/r,t[7]=(s-o*h)/r}return t},str:function(t){return"quat2("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+")"},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]&&t[4]===n[4]&&t[5]===n[5]&&t[6]===n[6]&&t[7]===n[7]},equals:function(t,n){var r=t[0],e=t[1],a=t[2],u=t[3],o=t[4],c=t[5],f=t[6],s=t[7],h=n[0],l=n[1],M=n[2],v=n[3],m=n[4],d=n[5],p=n[6],b=n[7];return Math.abs(r-h)<=i*Math.max(1,Math.abs(r),Math.abs(h))&&Math.abs(e-l)<=i*Math.max(1,Math.abs(e),Math.abs(l))&&Math.abs(a-M)<=i*Math.max(1,Math.abs(a),Math.abs(M))&&Math.abs(u-v)<=i*Math.max(1,Math.abs(u),Math.abs(v))&&Math.abs(o-m)<=i*Math.max(1,Math.abs(o),Math.abs(m))&&Math.abs(c-d)<=i*Math.max(1,Math.abs(c),Math.abs(d))&&Math.abs(f-p)<=i*Math.max(1,Math.abs(f),Math.abs(p))&&Math.abs(s-b)<=i*Math.max(1,Math.abs(s),Math.abs(b))}});function Ln(){return new f(2)}function Vn(t,n,r){return t[0]=n[0]-r[0],t[1]=n[1]-r[1],t}function kn(t,n,r){return t[0]=n[0]*r[0],t[1]=n[1]*r[1],t}function Yn(t,n,r){return t[0]=n[0]/r[0],t[1]=n[1]/r[1],t}function Zn(t,n){return Math.hypot(n[0]-t[0],n[1]-t[1])}function Fn(t,n){var r=n[0]-t[0],e=n[1]-t[1];return r*r+e*e}function Nn(t){return Math.hypot(t[0],t[1])}function Qn(t){var n=t[0],r=t[1];return n*n+r*r}var Xn=Nn,Bn=Vn,Un=kn,Cn=Yn,Gn=Zn,Wn=Fn,Hn=Qn,Jn=function(){var t=Ln();return function(n,r){var e,a,u=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,o=arguments.length>3?arguments[3]:void 0,i=arguments.length>4?arguments[4]:void 0,c=arguments.length>5?arguments[5]:void 0;for(r=r||2,a=o?Math.min(o*r+u,n.length):n.length,e=u;e1&&void 0!==arguments[1]?arguments[1]:1,r=2*s()*Math.PI;return t[0]=Math.cos(r)*n,t[1]=Math.sin(r)*n,t},transformMat2:function(t,n,r){var e=n[0],a=n[1];return t[0]=r[0]*e+r[2]*a,t[1]=r[1]*e+r[3]*a,t},transformMat2d:function(t,n,r){var e=n[0],a=n[1];return t[0]=r[0]*e+r[2]*a+r[4],t[1]=r[1]*e+r[3]*a+r[5],t},transformMat3:function(t,n,r){var e=n[0],a=n[1];return t[0]=r[0]*e+r[3]*a+r[6],t[1]=r[1]*e+r[4]*a+r[7],t},transformMat4:function(t,n,r){var e=n[0],a=n[1];return t[0]=r[0]*e+r[4]*a+r[12],t[1]=r[1]*e+r[5]*a+r[13],t},rotate:function(t,n,r,e){var a=n[0]-r[0],u=n[1]-r[1],o=Math.sin(e),i=Math.cos(e);return t[0]=a*i-u*o+r[0],t[1]=a*o+u*i+r[1],t},angle:function(t,n){var r=t[0],e=t[1],a=n[0],u=n[1];return Math.abs(Math.atan2(e*a-r*u,r*a+e*u))},signedAngle:function(t,n){var r=t[0],e=t[1],a=n[0],u=n[1];return Math.atan2(r*u-e*a,r*a+e*u)},zero:function(t){return t[0]=0,t[1]=0,t},str:function(t){return"vec2("+t[0]+", "+t[1]+")"},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]},equals:function(t,n){return v(t[0],n[0])&&v(t[1],n[1])},len:Xn,sub:Bn,mul:Un,div:Cn,dist:Gn,sqrDist:Wn,sqrLen:Hn,forEach:Jn});t.glMatrix=d,t.mat2=q,t.mat2d=O,t.mat3=T,t.mat4=U,t.quat=xn,t.quat2=In,t.vec2=Kn,t.vec3=vt,t.vec4=Ft,Object.defineProperty(t,"__esModule",{value:!0})})); diff --git a/dist/gl-matrix.js b/dist/gl-matrix.js index 100b7b37..2a4f42a6 100644 --- a/dist/gl-matrix.js +++ b/dist/gl-matrix.js @@ -5,7 +5,7 @@ @author Colin MacKenzie IV @version 3.4.4 -Copyright (c) 2015-2025, Brandon Jones, Colin MacKenzie IV. +Copyright (c) 2015-2026, Brandon Jones, Colin MacKenzie IV. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -32,6 +32,77 @@ THE SOFTWARE. (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.glMatrix = {})); })(this, (function (exports) { 'use strict'; + function _assertThisInitialized(e) { + if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return e; + } + function _callSuper(t, o, e) { + return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); + } + function _classCallCheck(a, n) { + if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); + } + function _defineProperties(e, r) { + for (var t = 0; t < r.length; t++) { + var o = r[t]; + o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); + } + } + function _createClass(e, r, t) { + return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { + writable: !1 + }), e; + } + function _getPrototypeOf(t) { + return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { + return t.__proto__ || Object.getPrototypeOf(t); + }, _getPrototypeOf(t); + } + function _inherits(t, e) { + if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); + t.prototype = Object.create(e && e.prototype, { + constructor: { + value: t, + writable: !0, + configurable: !0 + } + }), Object.defineProperty(t, "prototype", { + writable: !1 + }), e && _setPrototypeOf(t, e); + } + function _isNativeReflectConstruct() { + try { + var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + } catch (t) {} + return (_isNativeReflectConstruct = function () { + return !!t; + })(); + } + function _possibleConstructorReturn(t, e) { + if (e && ("object" == typeof e || "function" == typeof e)) return e; + if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); + return _assertThisInitialized(t); + } + function _setPrototypeOf(t, e) { + return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { + return t.__proto__ = e, t; + }, _setPrototypeOf(t, e); + } + function _toPrimitive(t, r) { + if ("object" != typeof t || !t) return t; + var e = t[Symbol.toPrimitive]; + if (void 0 !== e) { + var i = e.call(t, r || "default"); + if ("object" != typeof i) return i; + throw new TypeError("@@toPrimitive must return a primitive value."); + } + return ("string" === r ? String : Number)(t); + } + function _toPropertyKey(t) { + var i = _toPrimitive(t, "string"); + return "symbol" == typeof i ? i : i + ""; + } + /** * Common utilities * @module glMatrix @@ -40,18 +111,18 @@ THE SOFTWARE. // Configuration Constants var EPSILON = 0.000001; var ARRAY_TYPE = typeof Float32Array !== "undefined" ? Float32Array : Array; + // If an array is required to initialize to zero. + var ARRAY_ZERO_INIT_TYPE = ARRAY_TYPE === Array ? _createFastZeroInit(ARRAY_TYPE) : ARRAY_TYPE; var RANDOM = Math.random; var ANGLE_ORDER = "zyx"; /** * Symmetric round - * see https://www.npmjs.com/package/round-half-up-symmetric#user-content-detailed-background * * @param {Number} a value to round */ function round$3(a) { - if (a >= 0) return Math.round(a); - return a % 0.5 === 0 ? Math.floor(a) : Math.round(a); + return Math.round(Math.abs(a)) * Math.sign(a); } /** @@ -61,6 +132,13 @@ THE SOFTWARE. */ function setMatrixArrayType(type) { ARRAY_TYPE = type; + + // If the Array is not a TypedArray, create a constructor that automatically fills it with zeroes. + if (Array.isArray(type)) { + ARRAY_ZERO_INIT_TYPE = _createFastZeroInit(type); + return; + } + ARRAY_ZERO_INIT_TYPE = type; } var degree = Math.PI / 180; var radian = 180 / Math.PI; @@ -98,10 +176,34 @@ THE SOFTWARE. return Math.abs(a - b) <= tolerance * Math.max(1, Math.abs(a), Math.abs(b)); } + /** + * Creates a subclass of an Array-like class that initializes all it's elements to zero. + * @private + * @param {ArrayConstructor} type The Array-like class. + * @returns {ArrayConstructor} The zero-initializer subclass. + */ + function _createFastZeroInit(type) { + return /*#__PURE__*/function (_type) { + function ArrayInitZero() { + var _this; + _classCallCheck(this, ArrayInitZero); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _callSuper(this, ArrayInitZero, [].concat(args)); + _this.fill(0); + return _this; + } + _inherits(ArrayInitZero, _type); + return _createClass(ArrayInitZero); + }(type); + } + var common = /*#__PURE__*/Object.freeze({ __proto__: null, EPSILON: EPSILON, get ARRAY_TYPE () { return ARRAY_TYPE; }, + get ARRAY_ZERO_INIT_TYPE () { return ARRAY_ZERO_INIT_TYPE; }, RANDOM: RANDOM, ANGLE_ORDER: ANGLE_ORDER, round: round$3, @@ -122,11 +224,7 @@ THE SOFTWARE. * @returns {mat2} a new 2x2 matrix */ function create$8() { - var out = new ARRAY_TYPE(4); - if (ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - } + var out = new ARRAY_ZERO_INIT_TYPE(4); out[0] = 1; out[3] = 1; return out; @@ -220,18 +318,11 @@ THE SOFTWARE. * @returns {mat2} out */ function transpose$2(out, a) { - // If we are transposing ourselves we can skip a few steps but have to cache - // some values - if (out === a) { - var a1 = a[1]; - out[1] = a[2]; - out[2] = a1; - } else { - out[0] = a[0]; - out[1] = a[2]; - out[2] = a[1]; - out[3] = a[3]; - } + out[0] = a[0]; + var o1 = a[1]; + out[1] = a[2]; + out[2] = o1; + out[3] = a[3]; return out; } @@ -343,16 +434,12 @@ THE SOFTWARE. * @returns {mat2} out **/ function scale$8(out, a, v) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; var v0 = v[0], v1 = v[1]; - out[0] = a0 * v0; - out[1] = a1 * v0; - out[2] = a2 * v1; - out[3] = a3 * v1; + out[0] = a[0] * v0; + out[1] = a[1] * v0; + out[2] = a[2] * v1; + out[3] = a[3] * v1; return out; } @@ -483,15 +570,7 @@ THE SOFTWARE. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function equals$8(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3]; - return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)); + return equals$9(a[0], b[0]) && equals$9(a[1], b[1]) && equals$9(a[2], b[2]) && equals$9(a[3], b[3]); } /** @@ -594,13 +673,7 @@ THE SOFTWARE. * @returns {mat2d} a new 2x3 matrix */ function create$7() { - var out = new ARRAY_TYPE(6); - if (ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - out[4] = 0; - out[5] = 0; - } + var out = new ARRAY_ZERO_INIT_TYPE(6); out[0] = 1; out[3] = 1; return out; @@ -780,17 +853,15 @@ THE SOFTWARE. var a0 = a[0], a1 = a[1], a2 = a[2], - a3 = a[3], - a4 = a[4], - a5 = a[5]; + a3 = a[3]; var s = Math.sin(rad); var c = Math.cos(rad); out[0] = a0 * c + a2 * s; out[1] = a1 * c + a3 * s; out[2] = a0 * -s + a2 * c; out[3] = a1 * -s + a3 * c; - out[4] = a4; - out[5] = a5; + out[4] = a[4]; + out[5] = a[5]; return out; } @@ -1023,19 +1094,7 @@ THE SOFTWARE. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function equals$7(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3], - a4 = a[4], - a5 = a[5]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3], - b4 = b[4], - b5 = b[5]; - return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)); + return equals$9(a[0], b[0]) && equals$9(a[1], b[1]) && equals$9(a[2], b[2]) && equals$9(a[3], b[3]) && equals$9(a[4], b[4]) && equals$9(a[5], b[5]); } /** @@ -1090,15 +1149,7 @@ THE SOFTWARE. * @returns {mat3} a new 3x3 matrix */ function create$6() { - var out = new ARRAY_TYPE(9); - if (ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[5] = 0; - out[6] = 0; - out[7] = 0; - } + var out = new ARRAY_ZERO_INIT_TYPE(9); out[0] = 1; out[4] = 1; out[8] = 1; @@ -1248,28 +1299,18 @@ THE SOFTWARE. * @returns {mat3} out */ function transpose$1(out, a) { - // If we are transposing ourselves we can skip a few steps but have to cache some values - if (out === a) { - var a01 = a[1], - a02 = a[2], - a12 = a[5]; - out[1] = a[3]; - out[2] = a[6]; - out[3] = a01; - out[5] = a[7]; - out[6] = a02; - out[7] = a12; - } else { - out[0] = a[0]; - out[1] = a[3]; - out[2] = a[6]; - out[3] = a[1]; - out[4] = a[4]; - out[5] = a[7]; - out[6] = a[2]; - out[7] = a[5]; - out[8] = a[8]; - } + var a01 = a[1], + a02 = a[2], + a12 = a[5]; + out[0] = a[0]; + out[1] = a[3]; + out[2] = a[6]; + out[3] = a01; + out[4] = a[4]; + out[5] = a[7]; + out[6] = a02; + out[7] = a12; + out[8] = a[8]; return out; } @@ -1818,25 +1859,7 @@ THE SOFTWARE. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function equals$6(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3], - a4 = a[4], - a5 = a[5], - a6 = a[6], - a7 = a[7], - a8 = a[8]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3], - b4 = b[4], - b5 = b[5], - b6 = b[6], - b7 = b[7], - b8 = b[8]; - return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)); + return equals$9(a[0], b[0]) && equals$9(a[1], b[1]) && equals$9(a[2], b[2]) && equals$9(a[3], b[3]) && equals$9(a[4], b[4]) && equals$9(a[5], b[5]) && equals$9(a[6], b[6]) && equals$9(a[7], b[7]) && equals$9(a[8], b[8]); } /** @@ -1898,21 +1921,7 @@ THE SOFTWARE. * @returns {mat4} a new 4x4 matrix */ function create$5() { - var out = new ARRAY_TYPE(16); - if (ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[6] = 0; - out[7] = 0; - out[8] = 0; - out[9] = 0; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - } + var out = new ARRAY_ZERO_INIT_TYPE(16); out[0] = 1; out[5] = 1; out[10] = 1; @@ -2092,44 +2101,28 @@ THE SOFTWARE. * @returns {mat4} out */ function transpose(out, a) { - // If we are transposing ourselves we can skip a few steps but have to cache some values - if (out === a) { - var a01 = a[1], - a02 = a[2], - a03 = a[3]; - var a12 = a[6], - a13 = a[7]; - var a23 = a[11]; - out[1] = a[4]; - out[2] = a[8]; - out[3] = a[12]; - out[4] = a01; - out[6] = a[9]; - out[7] = a[13]; - out[8] = a02; - out[9] = a12; - out[11] = a[14]; - out[12] = a03; - out[13] = a13; - out[14] = a23; - } else { - out[0] = a[0]; - out[1] = a[4]; - out[2] = a[8]; - out[3] = a[12]; - out[4] = a[1]; - out[5] = a[5]; - out[6] = a[9]; - out[7] = a[13]; - out[8] = a[2]; - out[9] = a[6]; - out[10] = a[10]; - out[11] = a[14]; - out[12] = a[3]; - out[13] = a[7]; - out[14] = a[11]; - out[15] = a[15]; - } + var a01 = a[1], + a02 = a[2], + a03 = a[3]; + var a12 = a[6], + a13 = a[7]; + var a23 = a[11]; + out[0] = a[0]; + out[1] = a[4]; + out[2] = a[8]; + out[3] = a[12]; + out[4] = a01; + out[5] = a[5]; + out[6] = a[9]; + out[7] = a[13]; + out[8] = a02; + out[9] = a12; + out[10] = a[10]; + out[11] = a[14]; + out[12] = a03; + out[13] = a13; + out[14] = a23; + out[15] = a[15]; return out; } @@ -3800,39 +3793,7 @@ THE SOFTWARE. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function equals$5(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; - var a4 = a[4], - a5 = a[5], - a6 = a[6], - a7 = a[7]; - var a8 = a[8], - a9 = a[9], - a10 = a[10], - a11 = a[11]; - var a12 = a[12], - a13 = a[13], - a14 = a[14], - a15 = a[15]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3]; - var b4 = b[4], - b5 = b[5], - b6 = b[6], - b7 = b[7]; - var b8 = b[8], - b9 = b[9], - b10 = b[10], - b11 = b[11]; - var b12 = b[12], - b13 = b[13], - b14 = b[14], - b15 = b[15]; - return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15)); + return equals$9(a[0], b[0]) && equals$9(a[1], b[1]) && equals$9(a[2], b[2]) && equals$9(a[3], b[3]) && equals$9(a[4], b[4]) && equals$9(a[5], b[5]) && equals$9(a[6], b[6]) && equals$9(a[7], b[7]) && equals$9(a[8], b[8]) && equals$9(a[9], b[9]) && equals$9(a[10], b[10]) && equals$9(a[11], b[11]) && equals$9(a[12], b[12]) && equals$9(a[13], b[13]) && equals$9(a[14], b[14]) && equals$9(a[15], b[15]); } /** @@ -3914,13 +3875,7 @@ THE SOFTWARE. * @returns {vec3} a new 3D vector */ function create$4() { - var out = new ARRAY_TYPE(3); - if (ARRAY_TYPE != Float32Array) { - out[0] = 0; - out[1] = 0; - out[2] = 0; - } - return out; + return new ARRAY_ZERO_INIT_TYPE(3); } /** @@ -3944,10 +3899,7 @@ THE SOFTWARE. * @returns {Number} length of a */ function length$4(a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - return Math.sqrt(x * x + y * y + z * z); + return Math.hypot(a[0], a[1], a[2]); } /** @@ -4167,10 +4119,7 @@ THE SOFTWARE. * @returns {Number} distance between a and b */ function distance$2(a, b) { - var x = b[0] - a[0]; - var y = b[1] - a[1]; - var z = b[2] - a[2]; - return Math.sqrt(x * x + y * y + z * z); + return Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2]); } /** @@ -4181,10 +4130,7 @@ THE SOFTWARE. * @returns {Number} squared distance between a and b */ function squaredDistance$2(a, b) { - var x = b[0] - a[0]; - var y = b[1] - a[1]; - var z = b[2] - a[2]; - return x * x + y * y + z * z; + return Math.pow(Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2]), 2); } /** @@ -4194,10 +4140,7 @@ THE SOFTWARE. * @returns {Number} squared length of a */ function squaredLength$4(a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - return x * x + y * y + z * z; + return Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2); } /** @@ -4236,17 +4179,10 @@ THE SOFTWARE. * @returns {vec3} out */ function normalize$4(out, a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - var len = x * x + y * y + z * z; - if (len > 0) { - //TODO: evaluate use of glm_invsqrt here? - len = 1 / Math.sqrt(len); - } - out[0] = a[0] * len; - out[1] = a[1] * len; - out[2] = a[2] * len; + var len = Math.max(Math.hypot(a[0], a[1], a[2]), EPSILON); + out[0] = a[0] / len; + out[1] = a[1] / len; + out[2] = a[2] / len; return out; } @@ -4376,8 +4312,8 @@ THE SOFTWARE. * @param {Number} [scale] Length of the resulting vector. If omitted, a unit vector will be returned * @returns {vec3} out */ - function random$3(out, scale) { - scale = scale === undefined ? 1.0 : scale; + function random$3(out) { + var scale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1.0; var r = RANDOM() * 2.0 * Math.PI; var z = RANDOM() * 2.0 - 1.0; var zScale = Math.sqrt(1.0 - z * z) * scale; @@ -4608,13 +4544,7 @@ THE SOFTWARE. * @returns {Boolean} True if the vectors are equal, false otherwise. */ function equals$4(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2]; - var b0 = b[0], - b1 = b[1], - b2 = b[2]; - return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)); + return equals$9(a[0], b[0]) && equals$9(a[1], b[1]) && equals$9(a[2], b[2]); } /** @@ -4673,14 +4603,13 @@ THE SOFTWARE. */ var forEach$2 = function () { var vec = create$4(); - return function (a, stride, offset, count, fn, arg) { + return function (a, stride) { + var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; + var count = arguments.length > 3 ? arguments[3] : undefined; + var fn = arguments.length > 4 ? arguments[4] : undefined; + var arg = arguments.length > 5 ? arguments[5] : undefined; var i, l; - if (!stride) { - stride = 3; - } - if (!offset) { - offset = 0; - } + stride = stride || 3; if (count) { l = Math.min(count * stride + offset, a.length); } else { @@ -4763,14 +4692,7 @@ THE SOFTWARE. * @returns {vec4} a new 4D vector */ function create$3() { - var out = new ARRAY_TYPE(4); - if (ARRAY_TYPE != Float32Array) { - out[0] = 0; - out[1] = 0; - out[2] = 0; - out[3] = 0; - } - return out; + return new ARRAY_ZERO_INIT_TYPE(4); } /** @@ -5021,11 +4943,7 @@ THE SOFTWARE. * @returns {Number} distance between a and b */ function distance$1(a, b) { - var x = b[0] - a[0]; - var y = b[1] - a[1]; - var z = b[2] - a[2]; - var w = b[3] - a[3]; - return Math.sqrt(x * x + y * y + z * z + w * w); + return Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2], b[3] - a[3]); } /** @@ -5036,11 +4954,7 @@ THE SOFTWARE. * @returns {Number} squared distance between a and b */ function squaredDistance$1(a, b) { - var x = b[0] - a[0]; - var y = b[1] - a[1]; - var z = b[2] - a[2]; - var w = b[3] - a[3]; - return x * x + y * y + z * z + w * w; + return Math.pow(Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2], b[3] - a[3]), 2); } /** @@ -5050,11 +4964,7 @@ THE SOFTWARE. * @returns {Number} length of a */ function length$3(a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - var w = a[3]; - return Math.sqrt(x * x + y * y + z * z + w * w); + return Math.hypot(a[0], a[1], a[2], a[3]); } /** @@ -5064,11 +4974,7 @@ THE SOFTWARE. * @returns {Number} squared length of a */ function squaredLength$3(a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - var w = a[3]; - return x * x + y * y + z * z + w * w; + return Math.pow(Math.hypot(a[0], a[1], a[2], a[3]), 2); } /** @@ -5109,18 +5015,15 @@ THE SOFTWARE. * @returns {vec4} out */ function normalize$3(out, a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - var w = a[3]; - var len = x * x + y * y + z * z + w * w; - if (len > 0) { - len = 1 / Math.sqrt(len); - } - out[0] = x * len; - out[1] = y * len; - out[2] = z * len; - out[3] = w * len; + var x = a[0], + y = a[1], + z = a[2], + w = a[3]; + var len = Math.max(Math.hypot(x, y, z, w), EPSILON); + out[0] = x / len; + out[1] = y / len; + out[2] = z / len; + out[3] = w / len; return out; } @@ -5316,15 +5219,7 @@ THE SOFTWARE. * @returns {Boolean} True if the vectors are equal, false otherwise. */ function equals$3(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3]; - return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)); + return equals$9(a[0], b[0]) && equals$9(a[1], b[1]) && equals$9(a[2], b[2]) && equals$9(a[3], b[3]); } /** @@ -5383,14 +5278,13 @@ THE SOFTWARE. */ var forEach$1 = function () { var vec = create$3(); - return function (a, stride, offset, count, fn, arg) { + return function (a, stride) { + var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; + var count = arguments.length > 3 ? arguments[3] : undefined; + var fn = arguments.length > 4 ? arguments[4] : undefined; + var arg = arguments.length > 5 ? arguments[5] : undefined; var i, l; - if (!stride) { - stride = 4; - } - if (!offset) { - offset = 0; - } + stride = stride || 4; if (count) { l = Math.min(count * stride + offset, a.length); } else { @@ -7120,12 +7014,7 @@ THE SOFTWARE. * @returns {vec2} a new 2D vector */ function create() { - var out = new ARRAY_TYPE(2); - if (ARRAY_TYPE != Float32Array) { - out[0] = 0; - out[1] = 0; - } - return out; + return new ARRAY_ZERO_INIT_TYPE(2); } /** @@ -7342,9 +7231,7 @@ THE SOFTWARE. * @returns {Number} distance between a and b */ function distance(a, b) { - var x = b[0] - a[0], - y = b[1] - a[1]; - return Math.sqrt(x * x + y * y); + return Math.hypot(b[0] - a[0], b[1] - a[1]); } /** @@ -7367,9 +7254,7 @@ THE SOFTWARE. * @returns {Number} length of a */ function length(a) { - var x = a[0], - y = a[1]; - return Math.sqrt(x * x + y * y); + return Math.hypot(a[0], a[1]); } /** @@ -7418,15 +7303,9 @@ THE SOFTWARE. * @returns {vec2} out */ function normalize(out, a) { - var x = a[0], - y = a[1]; - var len = x * x + y * y; - if (len > 0) { - //TODO: evaluate use of glm_invsqrt here? - len = 1 / Math.sqrt(len); - } - out[0] = a[0] * len; - out[1] = a[1] * len; + var len = Math.max(Math.hypot(a[0], a[1]), EPSILON); + out[0] = a[0] / len; + out[1] = a[1] / len; return out; } @@ -7481,8 +7360,8 @@ THE SOFTWARE. * @param {Number} [scale] Length of the resulting vector. If omitted, a unit vector will be returned * @returns {vec2} out */ - function random(out, scale) { - scale = scale === undefined ? 1.0 : scale; + function random(out) { + var scale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1.0; var r = RANDOM() * 2.0 * Math.PI; out[0] = Math.cos(r) * scale; out[1] = Math.sin(r) * scale; @@ -7593,7 +7472,7 @@ THE SOFTWARE. /** * Get the signed angle in the interval [-pi,pi] between two 2D vectors (positive if `a` is to the right of `b`) - * + * * @param {ReadonlyVec2} a The first vector * @param {ReadonlyVec2} b The second vector * @returns {number} The signed angle in radians @@ -7647,11 +7526,7 @@ THE SOFTWARE. * @returns {Boolean} True if the vectors are equal, false otherwise. */ function equals(a, b) { - var a0 = a[0], - a1 = a[1]; - var b0 = b[0], - b1 = b[1]; - return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)); + return equals$9(a[0], b[0]) && equals$9(a[1], b[1]); } /** @@ -7710,14 +7585,13 @@ THE SOFTWARE. */ var forEach = function () { var vec = create(); - return function (a, stride, offset, count, fn, arg) { + return function (a, stride) { + var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; + var count = arguments.length > 3 ? arguments[3] : undefined; + var fn = arguments.length > 4 ? arguments[4] : undefined; + var arg = arguments.length > 5 ? arguments[5] : undefined; var i, l; - if (!stride) { - stride = 2; - } - if (!offset) { - offset = 0; - } + stride = stride || 2; if (count) { l = Math.min(count * stride + offset, a.length); } else { diff --git a/src/common.js b/src/common.js index 37233c59..005bbf0d 100644 --- a/src/common.js +++ b/src/common.js @@ -7,20 +7,18 @@ export const EPSILON = 0.000001; export let ARRAY_TYPE = typeof Float32Array !== "undefined" ? Float32Array : Array; +// If an array is required to initialize to zero. +export let ARRAY_ZERO_INIT_TYPE = ARRAY_TYPE === Array ? _createFastZeroInit(ARRAY_TYPE) : ARRAY_TYPE; export let RANDOM = Math.random; export let ANGLE_ORDER = "zyx"; /** * Symmetric round - * see https://www.npmjs.com/package/round-half-up-symmetric#user-content-detailed-background * * @param {Number} a value to round */ export function round(a) { - if (a >= 0) - return Math.round(a); - - return (a % 0.5 === 0) ? Math.floor(a) : Math.round(a); + return Math.round(Math.abs(a)) * Math.sign(a); } /** @@ -29,7 +27,15 @@ export function round(a) { * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array */ export function setMatrixArrayType(type) { - ARRAY_TYPE = type; + + ARRAY_TYPE = type; + + // If the Array is not a TypedArray, create a constructor that automatically fills it with zeroes. + if (Array.isArray(type)) { + ARRAY_ZERO_INIT_TYPE = _createFastZeroInit(type); + return; + } + ARRAY_ZERO_INIT_TYPE = type; } const degree = Math.PI / 180; @@ -67,3 +73,20 @@ export function toDegree(a) { export function equals(a, b, tolerance = EPSILON) { return Math.abs(a - b) <= tolerance * Math.max(1, Math.abs(a), Math.abs(b)); } + + + +/** + * Creates a subclass of an Array-like class that initializes all it's elements to zero. + * @private + * @param {ArrayConstructor} type The Array-like class. + * @returns {ArrayConstructor} The zero-initializer subclass. + */ +function _createFastZeroInit(type) { + return class ArrayInitZero extends type { + constructor(...args) { + super(...args); + this.fill(0); + } + } +} diff --git a/src/mat2.js b/src/mat2.js index 2a8cd39f..e74883ae 100644 --- a/src/mat2.js +++ b/src/mat2.js @@ -11,11 +11,7 @@ import * as glMatrix from "./common.js"; * @returns {mat2} a new 2x2 matrix */ export function create() { - let out = new glMatrix.ARRAY_TYPE(4); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - } + let out = new glMatrix.ARRAY_ZERO_INIT_TYPE(4); out[0] = 1; out[3] = 1; return out; @@ -109,19 +105,11 @@ export function set(out, m00, m01, m10, m11) { * @returns {mat2} out */ export function transpose(out, a) { - // If we are transposing ourselves we can skip a few steps but have to cache - // some values - if (out === a) { - let a1 = a[1]; - out[1] = a[2]; - out[2] = a1; - } else { - out[0] = a[0]; - out[1] = a[2]; - out[2] = a[1]; - out[3] = a[3]; - } - + out[0] = a[0]; + let o1 = a[1]; + out[1] = a[2]; + out[2] = o1; + out[3] = a[3]; return out; } @@ -237,16 +225,12 @@ export function rotate(out, a, rad) { * @returns {mat2} out **/ export function scale(out, a, v) { - let a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; let v0 = v[0], v1 = v[1]; - out[0] = a0 * v0; - out[1] = a1 * v0; - out[2] = a2 * v1; - out[3] = a3 * v1; + out[0] = a[0] * v0; + out[1] = a[1] * v0; + out[2] = a[2] * v1; + out[3] = a[3] * v1; return out; } @@ -377,24 +361,12 @@ export function exactEquals(a, b) { * @returns {Boolean} True if the matrices are equal, false otherwise. */ export function equals(a, b) { - let a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; - let b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3]; return ( - Math.abs(a0 - b0) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && - Math.abs(a1 - b1) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && - Math.abs(a2 - b2) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && - Math.abs(a3 - b3) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) - ); + glMatrix.equals(a[0], b[0]) && + glMatrix.equals(a[1], b[1]) && + glMatrix.equals(a[2], b[2]) && + glMatrix.equals(a[3], b[3]) + ); } /** diff --git a/src/mat2d.js b/src/mat2d.js index fce8aabd..f630c29c 100644 --- a/src/mat2d.js +++ b/src/mat2d.js @@ -25,13 +25,7 @@ import * as glMatrix from "./common.js"; * @returns {mat2d} a new 2x3 matrix */ export function create() { - let out = new glMatrix.ARRAY_TYPE(6); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - out[4] = 0; - out[5] = 0; - } + let out = new glMatrix.ARRAY_ZERO_INIT_TYPE(6); out[0] = 1; out[3] = 1; return out; @@ -213,17 +207,15 @@ export function rotate(out, a, rad) { let a0 = a[0], a1 = a[1], a2 = a[2], - a3 = a[3], - a4 = a[4], - a5 = a[5]; + a3 = a[3]; let s = Math.sin(rad); let c = Math.cos(rad); out[0] = a0 * c + a2 * s; out[1] = a1 * c + a3 * s; out[2] = a0 * -s + a2 * c; out[3] = a1 * -s + a3 * c; - out[4] = a4; - out[5] = a5; + out[4] = a[4]; + out[5] = a[5]; return out; } @@ -477,31 +469,13 @@ export function exactEquals(a, b) { * @returns {Boolean} True if the matrices are equal, false otherwise. */ export function equals(a, b) { - let a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3], - a4 = a[4], - a5 = a[5]; - let b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3], - b4 = b[4], - b5 = b[5]; return ( - Math.abs(a0 - b0) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && - Math.abs(a1 - b1) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && - Math.abs(a2 - b2) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && - Math.abs(a3 - b3) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && - Math.abs(a4 - b4) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && - Math.abs(a5 - b5) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) + glMatrix.equals(a[0], b[0]) && + glMatrix.equals(a[1], b[1]) && + glMatrix.equals(a[2], b[2]) && + glMatrix.equals(a[3], b[3]) && + glMatrix.equals(a[4], b[4]) && + glMatrix.equals(a[5], b[5]) ); } diff --git a/src/mat3.js b/src/mat3.js index 2a966eaa..3e42a85d 100644 --- a/src/mat3.js +++ b/src/mat3.js @@ -11,15 +11,7 @@ import * as glMatrix from "./common.js"; * @returns {mat3} a new 3x3 matrix */ export function create() { - let out = new glMatrix.ARRAY_TYPE(9); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[5] = 0; - out[6] = 0; - out[7] = 0; - } + let out = new glMatrix.ARRAY_ZERO_INIT_TYPE(9); out[0] = 1; out[4] = 1; out[8] = 1; @@ -169,28 +161,18 @@ export function identity(out) { * @returns {mat3} out */ export function transpose(out, a) { - // If we are transposing ourselves we can skip a few steps but have to cache some values - if (out === a) { - let a01 = a[1], - a02 = a[2], - a12 = a[5]; - out[1] = a[3]; - out[2] = a[6]; - out[3] = a01; - out[5] = a[7]; - out[6] = a02; - out[7] = a12; - } else { - out[0] = a[0]; - out[1] = a[3]; - out[2] = a[6]; - out[3] = a[1]; - out[4] = a[4]; - out[5] = a[7]; - out[6] = a[2]; - out[7] = a[5]; - out[8] = a[8]; - } + let a01 = a[1], + a02 = a[2], + a12 = a[5]; + out[0] = a[0]; + out[1] = a[3]; + out[2] = a[6]; + out[3] = a01; + out[4] = a[4]; + out[5] = a[7]; + out[6] = a02; + out[7] = a12; + out[8] = a[8]; return out; } @@ -700,10 +682,10 @@ export function frob(a) { a[2] * a[2] + a[3] * a[3] + a[4] * a[4] + - a[5] * a[5] + - a[6] * a[6] + - a[7] * a[7] + - a[8] * a[8] + a[5] * a[5] + + a[6] * a[6] + + a[7] * a[7] + + a[8] * a[8] ); } @@ -821,43 +803,16 @@ export function exactEquals(a, b) { * @returns {Boolean} True if the matrices are equal, false otherwise. */ export function equals(a, b) { - let a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3], - a4 = a[4], - a5 = a[5], - a6 = a[6], - a7 = a[7], - a8 = a[8]; - let b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3], - b4 = b[4], - b5 = b[5], - b6 = b[6], - b7 = b[7], - b8 = b[8]; return ( - Math.abs(a0 - b0) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && - Math.abs(a1 - b1) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && - Math.abs(a2 - b2) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && - Math.abs(a3 - b3) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && - Math.abs(a4 - b4) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && - Math.abs(a5 - b5) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && - Math.abs(a6 - b6) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && - Math.abs(a7 - b7) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && - Math.abs(a8 - b8) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) + glMatrix.equals(a[0], b[0]) && + glMatrix.equals(a[1], b[1]) && + glMatrix.equals(a[2], b[2]) && + glMatrix.equals(a[3], b[3]) && + glMatrix.equals(a[4], b[4]) && + glMatrix.equals(a[5], b[5]) && + glMatrix.equals(a[6], b[6]) && + glMatrix.equals(a[7], b[7]) && + glMatrix.equals(a[8], b[8]) ); } diff --git a/src/mat4.js b/src/mat4.js index 206f7680..318b7905 100644 --- a/src/mat4.js +++ b/src/mat4.js @@ -11,21 +11,7 @@ import * as glMatrix from "./common.js"; * @returns {mat4} a new 4x4 matrix */ export function create() { - let out = new glMatrix.ARRAY_TYPE(16); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[6] = 0; - out[7] = 0; - out[8] = 0; - out[9] = 0; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - } + let out = new glMatrix.ARRAY_ZERO_INIT_TYPE(16); out[0] = 1; out[5] = 1; out[10] = 1; @@ -240,45 +226,29 @@ export function identity(out) { * @returns {mat4} out */ export function transpose(out, a) { - // If we are transposing ourselves we can skip a few steps but have to cache some values - if (out === a) { - let a01 = a[1], - a02 = a[2], - a03 = a[3]; - let a12 = a[6], - a13 = a[7]; - let a23 = a[11]; - - out[1] = a[4]; - out[2] = a[8]; - out[3] = a[12]; - out[4] = a01; - out[6] = a[9]; - out[7] = a[13]; - out[8] = a02; - out[9] = a12; - out[11] = a[14]; - out[12] = a03; - out[13] = a13; - out[14] = a23; - } else { - out[0] = a[0]; - out[1] = a[4]; - out[2] = a[8]; - out[3] = a[12]; - out[4] = a[1]; - out[5] = a[5]; - out[6] = a[9]; - out[7] = a[13]; - out[8] = a[2]; - out[9] = a[6]; - out[10] = a[10]; - out[11] = a[14]; - out[12] = a[3]; - out[13] = a[7]; - out[14] = a[11]; - out[15] = a[15]; - } + let a01 = a[1], + a02 = a[2], + a03 = a[3]; + let a12 = a[6], + a13 = a[7]; + let a23 = a[11]; + + out[0] = a[0]; + out[1] = a[4]; + out[2] = a[8]; + out[3] = a[12]; + out[4] = a01; + out[5] = a[5]; + out[6] = a[9]; + out[7] = a[13]; + out[8] = a02; + out[9] = a12; + out[10] = a[10]; + out[11] = a[14]; + out[12] = a03; + out[13] = a13; + out[14] = a23; + out[15] = a[15]; return out; } @@ -2097,73 +2067,23 @@ export function exactEquals(a, b) { * @returns {Boolean} True if the matrices are equal, false otherwise. */ export function equals(a, b) { - let a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; - let a4 = a[4], - a5 = a[5], - a6 = a[6], - a7 = a[7]; - let a8 = a[8], - a9 = a[9], - a10 = a[10], - a11 = a[11]; - let a12 = a[12], - a13 = a[13], - a14 = a[14], - a15 = a[15]; - - let b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3]; - let b4 = b[4], - b5 = b[5], - b6 = b[6], - b7 = b[7]; - let b8 = b[8], - b9 = b[9], - b10 = b[10], - b11 = b[11]; - let b12 = b[12], - b13 = b[13], - b14 = b[14], - b15 = b[15]; - return ( - Math.abs(a0 - b0) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && - Math.abs(a1 - b1) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && - Math.abs(a2 - b2) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && - Math.abs(a3 - b3) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && - Math.abs(a4 - b4) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && - Math.abs(a5 - b5) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && - Math.abs(a6 - b6) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && - Math.abs(a7 - b7) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && - Math.abs(a8 - b8) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && - Math.abs(a9 - b9) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && - Math.abs(a10 - b10) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && - Math.abs(a11 - b11) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && - Math.abs(a12 - b12) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && - Math.abs(a13 - b13) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && - Math.abs(a14 - b14) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && - Math.abs(a15 - b15) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15)) + glMatrix.equals(a[0], b[0]) && + glMatrix.equals(a[1], b[1]) && + glMatrix.equals(a[2], b[2]) && + glMatrix.equals(a[3], b[3]) && + glMatrix.equals(a[4], b[4]) && + glMatrix.equals(a[5], b[5]) && + glMatrix.equals(a[6], b[6]) && + glMatrix.equals(a[7], b[7]) && + glMatrix.equals(a[8], b[8]) && + glMatrix.equals(a[9], b[9]) && + glMatrix.equals(a[10], b[10]) && + glMatrix.equals(a[11], b[11]) && + glMatrix.equals(a[12], b[12]) && + glMatrix.equals(a[13], b[13]) && + glMatrix.equals(a[14], b[14]) && + glMatrix.equals(a[15], b[15]) ); } diff --git a/src/vec2.js b/src/vec2.js index 76b851a8..09f8dd1d 100644 --- a/src/vec2.js +++ b/src/vec2.js @@ -5,18 +5,15 @@ import * as glMatrix from "./common.js"; * @module vec2 */ + + /** * Creates a new, empty vec2 * * @returns {vec2} a new 2D vector */ export function create() { - let out = new glMatrix.ARRAY_TYPE(2); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[0] = 0; - out[1] = 0; - } - return out; + return new glMatrix.ARRAY_ZERO_INIT_TYPE(2); } /** @@ -233,9 +230,7 @@ export function scaleAndAdd(out, a, b, scale) { * @returns {Number} distance between a and b */ export function distance(a, b) { - var x = b[0] - a[0], - y = b[1] - a[1]; - return Math.sqrt(x * x + y * y); + return Math.hypot(b[0] - a[0], b[1] - a[1]); } /** @@ -258,9 +253,7 @@ export function squaredDistance(a, b) { * @returns {Number} length of a */ export function length(a) { - var x = a[0], - y = a[1]; - return Math.sqrt(x * x + y * y); + return Math.hypot(a[0], a[1]); } /** @@ -309,16 +302,11 @@ export function inverse(out, a) { * @returns {vec2} out */ export function normalize(out, a) { - var x = a[0], - y = a[1]; - var len = x * x + y * y; - if (len > 0) { - //TODO: evaluate use of glm_invsqrt here? - len = 1 / Math.sqrt(len); - } - out[0] = a[0] * len; - out[1] = a[1] * len; - return out; + const len = Math.max(Math.hypot(a[0], a[1]), glMatrix.EPSILON); + + out[0] = a[0] / len; + out[1] = a[1] / len; + return out; } /** @@ -372,8 +360,7 @@ export function lerp(out, a, b, t) { * @param {Number} [scale] Length of the resulting vector. If omitted, a unit vector will be returned * @returns {vec2} out */ -export function random(out, scale) { - scale = scale === undefined ? 1.0 : scale; +export function random(out, scale = 1.0) { var r = glMatrix.RANDOM() * 2.0 * Math.PI; out[0] = Math.cos(r) * scale; out[1] = Math.sin(r) * scale; @@ -483,7 +470,7 @@ export function angle(a, b) { /** * Get the signed angle in the interval [-pi,pi] between two 2D vectors (positive if `a` is to the right of `b`) - * + * * @param {ReadonlyVec2} a The first vector * @param {ReadonlyVec2} b The second vector * @returns {number} The signed angle in radians @@ -536,15 +523,9 @@ export function exactEquals(a, b) { * @returns {Boolean} True if the vectors are equal, false otherwise. */ export function equals(a, b) { - let a0 = a[0], - a1 = a[1]; - let b0 = b[0], - b1 = b[1]; return ( - Math.abs(a0 - b0) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && - Math.abs(a1 - b1) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) + glMatrix.equals(a[0], b[0]) && + glMatrix.equals(a[1], b[1]) ); } @@ -605,15 +586,9 @@ export const sqrLen = squaredLength; export const forEach = (function() { let vec = create(); - return function(a, stride, offset, count, fn, arg) { + return function(a, stride, offset = 0, count, fn, arg) { let i, l; - if (!stride) { - stride = 2; - } - - if (!offset) { - offset = 0; - } + stride = stride || 2; if (count) { l = Math.min(count * stride + offset, a.length); diff --git a/src/vec3.js b/src/vec3.js index c54c5fab..38a3a964 100644 --- a/src/vec3.js +++ b/src/vec3.js @@ -11,13 +11,7 @@ import * as glMatrix from "./common.js"; * @returns {vec3} a new 3D vector */ export function create() { - let out = new glMatrix.ARRAY_TYPE(3); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[0] = 0; - out[1] = 0; - out[2] = 0; - } - return out; + return new glMatrix.ARRAY_ZERO_INIT_TYPE(3); } /** @@ -41,10 +35,7 @@ export function clone(a) { * @returns {Number} length of a */ export function length(a) { - let x = a[0]; - let y = a[1]; - let z = a[2]; - return Math.sqrt(x * x + y * y + z * z); + return Math.hypot(a[0], a[1], a[2]); } /** @@ -264,10 +255,7 @@ export function scaleAndAdd(out, a, b, scale) { * @returns {Number} distance between a and b */ export function distance(a, b) { - let x = b[0] - a[0]; - let y = b[1] - a[1]; - let z = b[2] - a[2]; - return Math.sqrt(x * x + y * y + z * z); + return Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2]); } /** @@ -278,10 +266,7 @@ export function distance(a, b) { * @returns {Number} squared distance between a and b */ export function squaredDistance(a, b) { - let x = b[0] - a[0]; - let y = b[1] - a[1]; - let z = b[2] - a[2]; - return x * x + y * y + z * z; + return Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2]) ** 2; } /** @@ -291,10 +276,7 @@ export function squaredDistance(a, b) { * @returns {Number} squared length of a */ export function squaredLength(a) { - let x = a[0]; - let y = a[1]; - let z = a[2]; - return x * x + y * y + z * z; + return a[0] ** 2 + a[1] ** 2 + a[2] ** 2; } /** @@ -333,17 +315,10 @@ export function inverse(out, a) { * @returns {vec3} out */ export function normalize(out, a) { - let x = a[0]; - let y = a[1]; - let z = a[2]; - let len = x * x + y * y + z * z; - if (len > 0) { - //TODO: evaluate use of glm_invsqrt here? - len = 1 / Math.sqrt(len); - } - out[0] = a[0] * len; - out[1] = a[1] * len; - out[2] = a[2] * len; + let len = Math.max(Math.hypot(a[0], a[1], a[2]), glMatrix.EPSILON); + out[0] = a[0] / len; + out[1] = a[1] / len; + out[2] = a[2] / len; return out; } @@ -480,9 +455,7 @@ export function bezier(out, a, b, c, d, t) { * @param {Number} [scale] Length of the resulting vector. If omitted, a unit vector will be returned * @returns {vec3} out */ -export function random(out, scale) { - scale = scale === undefined ? 1.0 : scale; - +export function random(out, scale = 1.0) { let r = glMatrix.RANDOM() * 2.0 * Math.PI; let z = glMatrix.RANDOM() * 2.0 - 1.0; let zScale = Math.sqrt(1.0 - z * z) * scale; @@ -720,19 +693,10 @@ export function exactEquals(a, b) { * @returns {Boolean} True if the vectors are equal, false otherwise. */ export function equals(a, b) { - let a0 = a[0], - a1 = a[1], - a2 = a[2]; - let b0 = b[0], - b1 = b[1], - b2 = b[2]; return ( - Math.abs(a0 - b0) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && - Math.abs(a1 - b1) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && - Math.abs(a2 - b2) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) + glMatrix.equals(a[0], b[0]) && + glMatrix.equals(a[1], b[1]) && + glMatrix.equals(a[2], b[2]) ); } @@ -793,15 +757,9 @@ export const sqrLen = squaredLength; export const forEach = (function () { let vec = create(); - return function (a, stride, offset, count, fn, arg) { + return function (a, stride, offset = 0, count, fn, arg) { let i, l; - if (!stride) { - stride = 3; - } - - if (!offset) { - offset = 0; - } + stride = stride || 3; if (count) { l = Math.min(count * stride + offset, a.length); diff --git a/src/vec4.js b/src/vec4.js index 6044df0a..688a5ce7 100644 --- a/src/vec4.js +++ b/src/vec4.js @@ -11,14 +11,7 @@ import * as glMatrix from "./common.js"; * @returns {vec4} a new 4D vector */ export function create() { - let out = new glMatrix.ARRAY_TYPE(4); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[0] = 0; - out[1] = 0; - out[2] = 0; - out[3] = 0; - } - return out; + return new glMatrix.ARRAY_ZERO_INIT_TYPE(4); } /** @@ -269,11 +262,7 @@ export function scaleAndAdd(out, a, b, scale) { * @returns {Number} distance between a and b */ export function distance(a, b) { - let x = b[0] - a[0]; - let y = b[1] - a[1]; - let z = b[2] - a[2]; - let w = b[3] - a[3]; - return Math.sqrt(x * x + y * y + z * z + w * w); + return Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2], b[3] - a[3]); } /** @@ -284,11 +273,7 @@ export function distance(a, b) { * @returns {Number} squared distance between a and b */ export function squaredDistance(a, b) { - let x = b[0] - a[0]; - let y = b[1] - a[1]; - let z = b[2] - a[2]; - let w = b[3] - a[3]; - return x * x + y * y + z * z + w * w; + return Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2], b[3] - a[3]) ** 2; } /** @@ -298,11 +283,7 @@ export function squaredDistance(a, b) { * @returns {Number} length of a */ export function length(a) { - let x = a[0]; - let y = a[1]; - let z = a[2]; - let w = a[3]; - return Math.sqrt(x * x + y * y + z * z + w * w); + return Math.hypot(a[0], a[1], a[2], a[3]);; } /** @@ -312,11 +293,7 @@ export function length(a) { * @returns {Number} squared length of a */ export function squaredLength(a) { - let x = a[0]; - let y = a[1]; - let z = a[2]; - let w = a[3]; - return x * x + y * y + z * z + w * w; + return Math.hypot(a[0], a[1], a[2], a[3]) ** 2; } /** @@ -357,18 +334,15 @@ export function inverse(out, a) { * @returns {vec4} out */ export function normalize(out, a) { - let x = a[0]; - let y = a[1]; - let z = a[2]; - let w = a[3]; - let len = x * x + y * y + z * z + w * w; - if (len > 0) { - len = 1 / Math.sqrt(len); - } - out[0] = x * len; - out[1] = y * len; - out[2] = z * len; - out[3] = w * len; + let x = a[0], + y = a[1], + z = a[2], + w = a[3]; + let len = Math.max(Math.hypot(x, y, z, w), glMatrix.EPSILON); + out[0] = x / len; + out[1] = y / len; + out[2] = z / len; + out[3] = w / len; return out; } @@ -571,23 +545,11 @@ export function exactEquals(a, b) { * @returns {Boolean} True if the vectors are equal, false otherwise. */ export function equals(a, b) { - let a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; - let b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3]; return ( - Math.abs(a0 - b0) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && - Math.abs(a1 - b1) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && - Math.abs(a2 - b2) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && - Math.abs(a3 - b3) <= - glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) + glMatrix.equals(a[0], b[0]) && + glMatrix.equals(a[1], b[1]) && + glMatrix.equals(a[2], b[2]) && + glMatrix.equals(a[3], b[3]) ); } @@ -648,15 +610,9 @@ export const sqrLen = squaredLength; export const forEach = (function() { let vec = create(); - return function(a, stride, offset, count, fn, arg) { + return function(a, stride, offset = 0, count, fn, arg) { let i, l; - if (!stride) { - stride = 4; - } - - if (!offset) { - offset = 0; - } + stride = stride || 4; if (count) { l = Math.min(count * stride + offset, a.length); From 4129a04e6649e5e1daac8dda8117b60c7184816f Mon Sep 17 00:00:00 2001 From: solarunes Date: Fri, 2 Jan 2026 02:05:05 +0100 Subject: [PATCH 3/4] faster array initialization, symmetric rounding, other minor enhancements --- src/common.js | 35 +++++++++++++++++++++++----- src/mat2.js | 20 +++++----------- src/mat2d.js | 16 ++++--------- src/mat3.js | 36 +++++++++++------------------ src/mat4.js | 54 ++++++++++++++++--------------------------- src/vec2.js | 45 ++++++++++-------------------------- src/vec3.js | 57 ++++++++++----------------------------------- src/vec4.js | 64 +++++++++++++-------------------------------------- 8 files changed, 113 insertions(+), 214 deletions(-) diff --git a/src/common.js b/src/common.js index 37233c59..005bbf0d 100644 --- a/src/common.js +++ b/src/common.js @@ -7,20 +7,18 @@ export const EPSILON = 0.000001; export let ARRAY_TYPE = typeof Float32Array !== "undefined" ? Float32Array : Array; +// If an array is required to initialize to zero. +export let ARRAY_ZERO_INIT_TYPE = ARRAY_TYPE === Array ? _createFastZeroInit(ARRAY_TYPE) : ARRAY_TYPE; export let RANDOM = Math.random; export let ANGLE_ORDER = "zyx"; /** * Symmetric round - * see https://www.npmjs.com/package/round-half-up-symmetric#user-content-detailed-background * * @param {Number} a value to round */ export function round(a) { - if (a >= 0) - return Math.round(a); - - return (a % 0.5 === 0) ? Math.floor(a) : Math.round(a); + return Math.round(Math.abs(a)) * Math.sign(a); } /** @@ -29,7 +27,15 @@ export function round(a) { * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array */ export function setMatrixArrayType(type) { - ARRAY_TYPE = type; + + ARRAY_TYPE = type; + + // If the Array is not a TypedArray, create a constructor that automatically fills it with zeroes. + if (Array.isArray(type)) { + ARRAY_ZERO_INIT_TYPE = _createFastZeroInit(type); + return; + } + ARRAY_ZERO_INIT_TYPE = type; } const degree = Math.PI / 180; @@ -67,3 +73,20 @@ export function toDegree(a) { export function equals(a, b, tolerance = EPSILON) { return Math.abs(a - b) <= tolerance * Math.max(1, Math.abs(a), Math.abs(b)); } + + + +/** + * Creates a subclass of an Array-like class that initializes all it's elements to zero. + * @private + * @param {ArrayConstructor} type The Array-like class. + * @returns {ArrayConstructor} The zero-initializer subclass. + */ +function _createFastZeroInit(type) { + return class ArrayInitZero extends type { + constructor(...args) { + super(...args); + this.fill(0); + } + } +} diff --git a/src/mat2.js b/src/mat2.js index 2a8cd39f..ddd6e166 100644 --- a/src/mat2.js +++ b/src/mat2.js @@ -11,11 +11,7 @@ import * as glMatrix from "./common.js"; * @returns {mat2} a new 2x2 matrix */ export function create() { - let out = new glMatrix.ARRAY_TYPE(4); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - } + let out = new glMatrix.ARRAY_ZERO_INIT_TYPE(4); out[0] = 1; out[3] = 1; return out; @@ -237,16 +233,12 @@ export function rotate(out, a, rad) { * @returns {mat2} out **/ export function scale(out, a, v) { - let a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; let v0 = v[0], v1 = v[1]; - out[0] = a0 * v0; - out[1] = a1 * v0; - out[2] = a2 * v1; - out[3] = a3 * v1; + out[0] = a[0] * v0; + out[1] = a[1] * v0; + out[2] = a[2] * v1; + out[3] = a[3] * v1; return out; } @@ -394,7 +386,7 @@ export function equals(a, b) { glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) - ); + ); } /** diff --git a/src/mat2d.js b/src/mat2d.js index fce8aabd..bfc137f7 100644 --- a/src/mat2d.js +++ b/src/mat2d.js @@ -25,13 +25,7 @@ import * as glMatrix from "./common.js"; * @returns {mat2d} a new 2x3 matrix */ export function create() { - let out = new glMatrix.ARRAY_TYPE(6); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - out[4] = 0; - out[5] = 0; - } + let out = new glMatrix.ARRAY_ZERO_INIT_TYPE(6); out[0] = 1; out[3] = 1; return out; @@ -213,17 +207,15 @@ export function rotate(out, a, rad) { let a0 = a[0], a1 = a[1], a2 = a[2], - a3 = a[3], - a4 = a[4], - a5 = a[5]; + a3 = a[3]; let s = Math.sin(rad); let c = Math.cos(rad); out[0] = a0 * c + a2 * s; out[1] = a1 * c + a3 * s; out[2] = a0 * -s + a2 * c; out[3] = a1 * -s + a3 * c; - out[4] = a4; - out[5] = a5; + out[4] = a[4]; + out[5] = a[5]; return out; } diff --git a/src/mat3.js b/src/mat3.js index 2a966eaa..961a3ed1 100644 --- a/src/mat3.js +++ b/src/mat3.js @@ -11,15 +11,7 @@ import * as glMatrix from "./common.js"; * @returns {mat3} a new 3x3 matrix */ export function create() { - let out = new glMatrix.ARRAY_TYPE(9); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[5] = 0; - out[6] = 0; - out[7] = 0; - } + let out = new glMatrix.ARRAY_ZERO_INIT_TYPE(9); out[0] = 1; out[4] = 1; out[8] = 1; @@ -171,15 +163,15 @@ export function identity(out) { export function transpose(out, a) { // If we are transposing ourselves we can skip a few steps but have to cache some values if (out === a) { - let a01 = a[1], - a02 = a[2], - a12 = a[5]; - out[1] = a[3]; - out[2] = a[6]; - out[3] = a01; + let a01 = a[1], + a02 = a[2], + a12 = a[5]; + out[1] = a[3]; + out[2] = a[6]; + out[3] = a01; out[5] = a[7]; - out[6] = a02; - out[7] = a12; + out[6] = a02; + out[7] = a12; } else { out[0] = a[0]; out[1] = a[3]; @@ -189,7 +181,7 @@ export function transpose(out, a) { out[5] = a[7]; out[6] = a[2]; out[7] = a[5]; - out[8] = a[8]; + out[8] = a[8]; } return out; @@ -700,10 +692,10 @@ export function frob(a) { a[2] * a[2] + a[3] * a[3] + a[4] * a[4] + - a[5] * a[5] + - a[6] * a[6] + - a[7] * a[7] + - a[8] * a[8] + a[5] * a[5] + + a[6] * a[6] + + a[7] * a[7] + + a[8] * a[8] ); } diff --git a/src/mat4.js b/src/mat4.js index 206f7680..f457b7ec 100644 --- a/src/mat4.js +++ b/src/mat4.js @@ -11,21 +11,7 @@ import * as glMatrix from "./common.js"; * @returns {mat4} a new 4x4 matrix */ export function create() { - let out = new glMatrix.ARRAY_TYPE(16); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[6] = 0; - out[7] = 0; - out[8] = 0; - out[9] = 0; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - } + let out = new glMatrix.ARRAY_ZERO_INIT_TYPE(16); out[0] = 1; out[5] = 1; out[10] = 1; @@ -242,25 +228,25 @@ export function identity(out) { export function transpose(out, a) { // If we are transposing ourselves we can skip a few steps but have to cache some values if (out === a) { - let a01 = a[1], - a02 = a[2], - a03 = a[3]; - let a12 = a[6], - a13 = a[7]; - let a23 = a[11]; + let a01 = a[1], + a02 = a[2], + a03 = a[3]; + let a12 = a[6], + a13 = a[7]; + let a23 = a[11]; - out[1] = a[4]; - out[2] = a[8]; - out[3] = a[12]; - out[4] = a01; - out[6] = a[9]; - out[7] = a[13]; - out[8] = a02; - out[9] = a12; - out[11] = a[14]; - out[12] = a03; - out[13] = a13; - out[14] = a23; + out[1] = a[4]; + out[2] = a[8]; + out[3] = a[12]; + out[4] = a01; + out[6] = a[9]; + out[7] = a[13]; + out[8] = a02; + out[9] = a12; + out[11] = a[14]; + out[12] = a03; + out[13] = a13; + out[14] = a23; } else { out[0] = a[0]; out[1] = a[4]; @@ -277,7 +263,7 @@ export function transpose(out, a) { out[12] = a[3]; out[13] = a[7]; out[14] = a[11]; - out[15] = a[15]; + out[15] = a[15]; } return out; diff --git a/src/vec2.js b/src/vec2.js index 76b851a8..e71a851b 100644 --- a/src/vec2.js +++ b/src/vec2.js @@ -11,12 +11,7 @@ import * as glMatrix from "./common.js"; * @returns {vec2} a new 2D vector */ export function create() { - let out = new glMatrix.ARRAY_TYPE(2); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[0] = 0; - out[1] = 0; - } - return out; + return new glMatrix.ARRAY_ZERO_INIT_TYPE(2); } /** @@ -233,9 +228,7 @@ export function scaleAndAdd(out, a, b, scale) { * @returns {Number} distance between a and b */ export function distance(a, b) { - var x = b[0] - a[0], - y = b[1] - a[1]; - return Math.sqrt(x * x + y * y); + return Math.hypot(b[0] - a[0], b[1] - a[1]); } /** @@ -258,9 +251,7 @@ export function squaredDistance(a, b) { * @returns {Number} length of a */ export function length(a) { - var x = a[0], - y = a[1]; - return Math.sqrt(x * x + y * y); + return Math.hypot(a[0], a[1]); } /** @@ -309,16 +300,11 @@ export function inverse(out, a) { * @returns {vec2} out */ export function normalize(out, a) { - var x = a[0], - y = a[1]; - var len = x * x + y * y; - if (len > 0) { - //TODO: evaluate use of glm_invsqrt here? - len = 1 / Math.sqrt(len); - } - out[0] = a[0] * len; - out[1] = a[1] * len; - return out; + const len = Math.max(Math.hypot(a[0], a[1]), glMatrix.EPSILON); + + out[0] = a[0] / len; + out[1] = a[1] / len; + return out; } /** @@ -372,8 +358,7 @@ export function lerp(out, a, b, t) { * @param {Number} [scale] Length of the resulting vector. If omitted, a unit vector will be returned * @returns {vec2} out */ -export function random(out, scale) { - scale = scale === undefined ? 1.0 : scale; +export function random(out, scale = 1.0) { var r = glMatrix.RANDOM() * 2.0 * Math.PI; out[0] = Math.cos(r) * scale; out[1] = Math.sin(r) * scale; @@ -483,7 +468,7 @@ export function angle(a, b) { /** * Get the signed angle in the interval [-pi,pi] between two 2D vectors (positive if `a` is to the right of `b`) - * + * * @param {ReadonlyVec2} a The first vector * @param {ReadonlyVec2} b The second vector * @returns {number} The signed angle in radians @@ -605,15 +590,9 @@ export const sqrLen = squaredLength; export const forEach = (function() { let vec = create(); - return function(a, stride, offset, count, fn, arg) { + return function(a, stride, offset = 0, count, fn, arg) { let i, l; - if (!stride) { - stride = 2; - } - - if (!offset) { - offset = 0; - } + stride = stride || 2; if (count) { l = Math.min(count * stride + offset, a.length); diff --git a/src/vec3.js b/src/vec3.js index c54c5fab..b02ab1d7 100644 --- a/src/vec3.js +++ b/src/vec3.js @@ -11,13 +11,7 @@ import * as glMatrix from "./common.js"; * @returns {vec3} a new 3D vector */ export function create() { - let out = new glMatrix.ARRAY_TYPE(3); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[0] = 0; - out[1] = 0; - out[2] = 0; - } - return out; + return new glMatrix.ARRAY_ZERO_INIT_TYPE(3); } /** @@ -41,10 +35,7 @@ export function clone(a) { * @returns {Number} length of a */ export function length(a) { - let x = a[0]; - let y = a[1]; - let z = a[2]; - return Math.sqrt(x * x + y * y + z * z); + return Math.hypot(a[0], a[1], a[2]); } /** @@ -264,10 +255,7 @@ export function scaleAndAdd(out, a, b, scale) { * @returns {Number} distance between a and b */ export function distance(a, b) { - let x = b[0] - a[0]; - let y = b[1] - a[1]; - let z = b[2] - a[2]; - return Math.sqrt(x * x + y * y + z * z); + return Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2]); } /** @@ -278,10 +266,7 @@ export function distance(a, b) { * @returns {Number} squared distance between a and b */ export function squaredDistance(a, b) { - let x = b[0] - a[0]; - let y = b[1] - a[1]; - let z = b[2] - a[2]; - return x * x + y * y + z * z; + return Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2]) ** 2; } /** @@ -291,10 +276,7 @@ export function squaredDistance(a, b) { * @returns {Number} squared length of a */ export function squaredLength(a) { - let x = a[0]; - let y = a[1]; - let z = a[2]; - return x * x + y * y + z * z; + return a[0] ** 2 + a[1] ** 2 + a[2] ** 2; } /** @@ -333,17 +315,10 @@ export function inverse(out, a) { * @returns {vec3} out */ export function normalize(out, a) { - let x = a[0]; - let y = a[1]; - let z = a[2]; - let len = x * x + y * y + z * z; - if (len > 0) { - //TODO: evaluate use of glm_invsqrt here? - len = 1 / Math.sqrt(len); - } - out[0] = a[0] * len; - out[1] = a[1] * len; - out[2] = a[2] * len; + let len = Math.max(Math.hypot(a[0], a[1], a[2]), glMatrix.EPSILON); + out[0] = a[0] / len; + out[1] = a[1] / len; + out[2] = a[2] / len; return out; } @@ -480,9 +455,7 @@ export function bezier(out, a, b, c, d, t) { * @param {Number} [scale] Length of the resulting vector. If omitted, a unit vector will be returned * @returns {vec3} out */ -export function random(out, scale) { - scale = scale === undefined ? 1.0 : scale; - +export function random(out, scale = 1.0) { let r = glMatrix.RANDOM() * 2.0 * Math.PI; let z = glMatrix.RANDOM() * 2.0 - 1.0; let zScale = Math.sqrt(1.0 - z * z) * scale; @@ -793,15 +766,9 @@ export const sqrLen = squaredLength; export const forEach = (function () { let vec = create(); - return function (a, stride, offset, count, fn, arg) { + return function (a, stride, offset = 0, count, fn, arg) { let i, l; - if (!stride) { - stride = 3; - } - - if (!offset) { - offset = 0; - } + stride = stride || 3; if (count) { l = Math.min(count * stride + offset, a.length); diff --git a/src/vec4.js b/src/vec4.js index 6044df0a..6c951ca1 100644 --- a/src/vec4.js +++ b/src/vec4.js @@ -11,14 +11,7 @@ import * as glMatrix from "./common.js"; * @returns {vec4} a new 4D vector */ export function create() { - let out = new glMatrix.ARRAY_TYPE(4); - if (glMatrix.ARRAY_TYPE != Float32Array) { - out[0] = 0; - out[1] = 0; - out[2] = 0; - out[3] = 0; - } - return out; + return new glMatrix.ARRAY_ZERO_INIT_TYPE(4); } /** @@ -269,11 +262,7 @@ export function scaleAndAdd(out, a, b, scale) { * @returns {Number} distance between a and b */ export function distance(a, b) { - let x = b[0] - a[0]; - let y = b[1] - a[1]; - let z = b[2] - a[2]; - let w = b[3] - a[3]; - return Math.sqrt(x * x + y * y + z * z + w * w); + return Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2], b[3] - a[3]); } /** @@ -284,11 +273,7 @@ export function distance(a, b) { * @returns {Number} squared distance between a and b */ export function squaredDistance(a, b) { - let x = b[0] - a[0]; - let y = b[1] - a[1]; - let z = b[2] - a[2]; - let w = b[3] - a[3]; - return x * x + y * y + z * z + w * w; + return Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2], b[3] - a[3]) ** 2; } /** @@ -298,11 +283,7 @@ export function squaredDistance(a, b) { * @returns {Number} length of a */ export function length(a) { - let x = a[0]; - let y = a[1]; - let z = a[2]; - let w = a[3]; - return Math.sqrt(x * x + y * y + z * z + w * w); + return Math.hypot(a[0], a[1], a[2], a[3]);; } /** @@ -312,11 +293,7 @@ export function length(a) { * @returns {Number} squared length of a */ export function squaredLength(a) { - let x = a[0]; - let y = a[1]; - let z = a[2]; - let w = a[3]; - return x * x + y * y + z * z + w * w; + return Math.hypot(a[0], a[1], a[2], a[3]) ** 2; } /** @@ -357,18 +334,15 @@ export function inverse(out, a) { * @returns {vec4} out */ export function normalize(out, a) { - let x = a[0]; - let y = a[1]; - let z = a[2]; - let w = a[3]; - let len = x * x + y * y + z * z + w * w; - if (len > 0) { - len = 1 / Math.sqrt(len); - } - out[0] = x * len; - out[1] = y * len; - out[2] = z * len; - out[3] = w * len; + let x = a[0], + y = a[1], + z = a[2], + w = a[3]; + let len = Math.max(Math.hypot(x, y, z, w), glMatrix.EPSILON); + out[0] = x / len; + out[1] = y / len; + out[2] = z / len; + out[3] = w / len; return out; } @@ -648,15 +622,9 @@ export const sqrLen = squaredLength; export const forEach = (function() { let vec = create(); - return function(a, stride, offset, count, fn, arg) { + return function(a, stride, offset = 0, count, fn, arg) { let i, l; - if (!stride) { - stride = 4; - } - - if (!offset) { - offset = 0; - } + stride = stride || 4; if (count) { l = Math.min(count * stride + offset, a.length); From fc1bbbba78acca2cfda66f4ebd1efc03272bf9b0 Mon Sep 17 00:00:00 2001 From: solarunes Date: Fri, 2 Jan 2026 02:27:36 +0100 Subject: [PATCH 4/4] fixed formatting --- src/mat4.js | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/mat4.js b/src/mat4.js index f457b7ec..48077c4f 100644 --- a/src/mat4.js +++ b/src/mat4.js @@ -228,25 +228,25 @@ export function identity(out) { export function transpose(out, a) { // If we are transposing ourselves we can skip a few steps but have to cache some values if (out === a) { - let a01 = a[1], + let a01 = a[1], a02 = a[2], a03 = a[3]; - let a12 = a[6], + let a12 = a[6], a13 = a[7]; - let a23 = a[11]; - - out[1] = a[4]; - out[2] = a[8]; - out[3] = a[12]; - out[4] = a01; - out[6] = a[9]; - out[7] = a[13]; - out[8] = a02; - out[9] = a12; - out[11] = a[14]; - out[12] = a03; - out[13] = a13; - out[14] = a23; + let a23 = a[11]; + + out[1] = a[4]; + out[2] = a[8]; + out[3] = a[12]; + out[4] = a01; + out[6] = a[9]; + out[7] = a[13]; + out[8] = a02; + out[9] = a12; + out[11] = a[14]; + out[12] = a03; + out[13] = a13; + out[14] = a23; } else { out[0] = a[0]; out[1] = a[4]; @@ -263,7 +263,7 @@ export function transpose(out, a) { out[12] = a[3]; out[13] = a[7]; out[14] = a[11]; - out[15] = a[15]; + out[15] = a[15]; } return out;