world.ts 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/common.ts","../node_modules/gl-matrix/esm/common.js","../node_modules/gl-matrix/esm/mat3.js","../node_modules/gl-matrix/esm/mat4.js","../node_modules/gl-matrix/esm/vec3.js","../node_modules/gl-matrix/esm/vec4.js","../node_modules/gl-matrix/esm/quat.js","../node_modules/gl-matrix/esm/vec2.js","../src/math.ts","../src/control.ts","../src/buffer.ts","../src/program.ts","../src/layers/common.ts","../src/layers/depth.glsl","../src/image-load.ts","../src/layers/terrain/texture.ts","../src/layers/terrain/image-texture.ts","../src/layers/billboard/fragment.glsl","../src/layers/billboard/vertex.glsl","../src/layers/billboard/index.ts","../src/layers/line/fragment.glsl","../src/layers/line/vertex.glsl","../src/layers/line/index.ts","../src/layers/mesh/fragment.glsl","../src/layers/mesh/vertex.glsl","../src/layers/mesh/index.ts","../node_modules/earclip/dist/earcut.js","../node_modules/earclip/dist/index.js","../src/layers/polygon/fragment.glsl","../src/layers/polygon/vertex.glsl","../src/layers/polygon/index.ts","../src/layers/terrain/tile-downsampler.ts","../node_modules/lru-cache/dist/esm/index.js","../src/layers/terrain/tile-index-cache.ts","../src/elevation.ts","../src/layers/terrain/fragment.glsl","../src/layers/terrain/tile-cache.ts","../src/layers/terrain/tile-shapes.ts","../src/layers/terrain/vertex.glsl","../src/layers/terrain/index.ts","../src/transition.ts","../src/view-transition.ts","../src/depth-buffer.ts","../src/viewport.ts","../src/world.ts"],"sourcesContent":["export const debounce = <F extends (...args: unknown[]) => void>(\n f: F,\n delay: number,\n) => {\n let timeout: number;\n return (...args: Parameters<F>) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => f(args), delay);\n };\n};\n\nexport const range = (start: number, end: number) =>\n Array.from({ length: end - start }, (_, k) => k + start);\n","/**\n * Common utilities\n * @module glMatrix\n */\n// Configuration Constants\nexport var EPSILON = 0.000001;\nexport var ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\nexport var RANDOM = Math.random;\n/**\n * Sets the type of array used when creating new vectors and matrices\n *\n * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\n */\n\nexport function setMatrixArrayType(type) {\n ARRAY_TYPE = type;\n}\nvar degree = Math.PI / 180;\n/**\n * Convert Degree To Radian\n *\n * @param {Number} a Angle in Degrees\n */\n\nexport function toRadian(a) {\n return a * degree;\n}\n/**\n * Tests whether or not the arguments have approximately the same value, within an absolute\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less\n * than or equal to 1.0, and a relative tolerance is used for larger values)\n *\n * @param {Number} a The first number to test.\n * @param {Number} b The second number to test.\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\n */\n\nexport function equals(a, b) {\n return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b));\n}\nif (!Math.hypot) Math.hypot = function () {\n var y = 0,\n i = arguments.length;\n\n while (i--) {\n y += arguments[i] * arguments[i];\n }\n\n return Math.sqrt(y);\n};","import * as glMatrix from \"./common.js\";\n/**\n * 3x3 Matrix\n * @module mat3\n */\n\n/**\n * Creates a new identity mat3\n *\n * @returns {mat3} a new 3x3 matrix\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(9);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n }\n\n out[0] = 1;\n out[4] = 1;\n out[8] = 1;\n return out;\n}\n/**\n * Copies the upper-left 3x3 values into the given mat3.\n *\n * @param {mat3} out the receiving 3x3 matrix\n * @param {ReadonlyMat4} a the source 4x4 matrix\n * @returns {mat3} out\n */\n\nexport function fromMat4(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[4];\n out[4] = a[5];\n out[5] = a[6];\n out[6] = a[8];\n out[7] = a[9];\n out[8] = a[10];\n return out;\n}\n/**\n * Creates a new mat3 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat3} a matrix to clone\n * @returns {mat3} a new 3x3 matrix\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(9);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Copy the values from one mat3 to another\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Create a new mat3 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} A new mat3\n */\n\nexport function fromValues(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n var out = new glMatrix.ARRAY_TYPE(9);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m10;\n out[4] = m11;\n out[5] = m12;\n out[6] = m20;\n out[7] = m21;\n out[8] = m22;\n return out;\n}\n/**\n * Set the components of a mat3 to the given values\n *\n * @param {mat3} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} out\n */\n\nexport function set(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m10;\n out[4] = m11;\n out[5] = m12;\n out[6] = m20;\n out[7] = m21;\n out[8] = m22;\n return out;\n}\n/**\n * Set a mat3 to the identity matrix\n *\n * @param {mat3} out the receiving matrix\n * @returns {mat3} out\n */\n\nexport function identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Transpose the values of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a12 = a[5];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a01;\n out[5] = a[7];\n out[6] = a02;\n out[7] = a12;\n } else {\n out[0] = a[0];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a[1];\n out[4] = a[4];\n out[5] = a[7];\n out[6] = a[2];\n out[7] = a[5];\n out[8] = a[8];\n }\n\n return out;\n}\n/**\n * Inverts a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n var b01 = a22 * a11 - a12 * a21;\n var b11 = -a22 * a10 + a12 * a20;\n var b21 = a21 * a10 - a11 * a20; // Calculate the determinant\n\n var det = a00 * b01 + a01 * b11 + a02 * b21;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = b01 * det;\n out[1] = (-a22 * a01 + a02 * a21) * det;\n out[2] = (a12 * a01 - a02 * a11) * det;\n out[3] = b11 * det;\n out[4] = (a22 * a00 - a02 * a20) * det;\n out[5] = (-a12 * a00 + a02 * a10) * det;\n out[6] = b21 * det;\n out[7] = (-a21 * a00 + a01 * a20) * det;\n out[8] = (a11 * a00 - a01 * a10) * det;\n return out;\n}\n/**\n * Calculates the adjugate of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n out[0] = a11 * a22 - a12 * a21;\n out[1] = a02 * a21 - a01 * a22;\n out[2] = a01 * a12 - a02 * a11;\n out[3] = a12 * a20 - a10 * a22;\n out[4] = a00 * a22 - a02 * a20;\n out[5] = a02 * a10 - a00 * a12;\n out[6] = a10 * a21 - a11 * a20;\n out[7] = a01 * a20 - a00 * a21;\n out[8] = a00 * a11 - a01 * a10;\n return out;\n}\n/**\n * Calculates the determinant of a mat3\n *\n * @param {ReadonlyMat3} a the source matrix\n * @returns {Number} determinant of a\n */\n\nexport function determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);\n}\n/**\n * Multiplies two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nexport function multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n var b00 = b[0],\n b01 = b[1],\n b02 = b[2];\n var b10 = b[3],\n b11 = b[4],\n b12 = b[5];\n var b20 = b[6],\n b21 = b[7],\n b22 = b[8];\n out[0] = b00 * a00 + b01 * a10 + b02 * a20;\n out[1] = b00 * a01 + b01 * a11 + b02 * a21;\n out[2] = b00 * a02 + b01 * a12 + b02 * a22;\n out[3] = b10 * a00 + b11 * a10 + b12 * a20;\n out[4] = b10 * a01 + b11 * a11 + b12 * a21;\n out[5] = b10 * a02 + b11 * a12 + b12 * a22;\n out[6] = b20 * a00 + b21 * a10 + b22 * a20;\n out[7] = b20 * a01 + b21 * a11 + b22 * a21;\n out[8] = b20 * a02 + b21 * a12 + b22 * a22;\n return out;\n}\n/**\n * Translate a mat3 by the given vector\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to translate\n * @param {ReadonlyVec2} v vector to translate by\n * @returns {mat3} out\n */\n\nexport function translate(out, a, v) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a10 = a[3],\n a11 = a[4],\n a12 = a[5],\n a20 = a[6],\n a21 = a[7],\n a22 = a[8],\n x = v[0],\n y = v[1];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a10;\n out[4] = a11;\n out[5] = a12;\n out[6] = x * a00 + y * a10 + a20;\n out[7] = x * a01 + y * a11 + a21;\n out[8] = x * a02 + y * a12 + a22;\n return out;\n}\n/**\n * Rotates a mat3 by the given angle\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\n\nexport function rotate(out, a, rad) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a10 = a[3],\n a11 = a[4],\n a12 = a[5],\n a20 = a[6],\n a21 = a[7],\n a22 = a[8],\n s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = c * a00 + s * a10;\n out[1] = c * a01 + s * a11;\n out[2] = c * a02 + s * a12;\n out[3] = c * a10 - s * a00;\n out[4] = c * a11 - s * a01;\n out[5] = c * a12 - s * a02;\n out[6] = a20;\n out[7] = a21;\n out[8] = a22;\n return out;\n}\n/**\n * Scales the mat3 by the dimensions in the given vec2\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {ReadonlyVec2} v the vec2 to scale the matrix by\n * @returns {mat3} out\n **/\n\nexport function scale(out, a, v) {\n var x = v[0],\n y = v[1];\n out[0] = x * a[0];\n out[1] = x * a[1];\n out[2] = x * a[2];\n out[3] = y * a[3];\n out[4] = y * a[4];\n out[5] = y * a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.translate(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyVec2} v Translation vector\n * @returns {mat3} out\n */\n\nexport function fromTranslation(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = v[0];\n out[7] = v[1];\n out[8] = 1;\n return out;\n}\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.rotate(dest, dest, rad);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\n\nexport function fromRotation(out, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = -s;\n out[4] = c;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.scale(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyVec2} v Scaling vector\n * @returns {mat3} out\n */\n\nexport function fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = v[1];\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Copies the values from a mat2d into a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat2d} a the matrix to copy\n * @returns {mat3} out\n **/\n\nexport function fromMat2d(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = 0;\n out[3] = a[2];\n out[4] = a[3];\n out[5] = 0;\n out[6] = a[4];\n out[7] = a[5];\n out[8] = 1;\n return out;\n}\n/**\n * Calculates a 3x3 matrix from the given quaternion\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat3} out\n */\n\nexport function fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[3] = yx - wz;\n out[6] = zx + wy;\n out[1] = yx + wz;\n out[4] = 1 - xx - zz;\n out[7] = zy - wx;\n out[2] = zx - wy;\n out[5] = zy + wx;\n out[8] = 1 - xx - yy;\n return out;\n}\n/**\n * Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyMat4} a Mat4 to derive the normal matrix from\n *\n * @returns {mat3} out\n */\n\nexport function normalFromMat4(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n return out;\n}\n/**\n * Generates a 2D projection matrix with the given bounds\n *\n * @param {mat3} out mat3 frustum matrix will be written into\n * @param {number} width Width of your gl context\n * @param {number} height Height of gl context\n * @returns {mat3} out\n */\n\nexport function projection(out, width, height) {\n out[0] = 2 / width;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = -2 / height;\n out[5] = 0;\n out[6] = -1;\n out[7] = 1;\n out[8] = 1;\n return out;\n}\n/**\n * Returns a string representation of a mat3\n *\n * @param {ReadonlyMat3} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\n\nexport function str(a) {\n return \"mat3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \")\";\n}\n/**\n * Returns Frobenius norm of a mat3\n *\n * @param {ReadonlyMat3} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\n\nexport function frob(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]);\n}\n/**\n * Adds two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n return out;\n}\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n return out;\n}\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat3} out\n */\n\nexport function multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n return out;\n}\n/**\n * Adds two mat3's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat3} out the receiving vector\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat3} out\n */\n\nexport function multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n return out;\n}\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat3} a The first matrix.\n * @param {ReadonlyMat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8];\n}\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat3} a The first matrix.\n * @param {ReadonlyMat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3],\n a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7],\n a8 = a[8];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3],\n b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7],\n b8 = b[8];\n 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));\n}\n/**\n * Alias for {@link mat3.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link mat3.subtract}\n * @function\n */\n\nexport var sub = subtract;","import * as glMatrix from \"./common.js\";\n/**\n * 4x4 Matrix<br>Format: column-major, when typed out it looks like row-major<br>The matrices are being post multiplied.\n * @module mat4\n */\n\n/**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(16);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n }\n\n out[0] = 1;\n out[5] = 1;\n out[10] = 1;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a new mat4 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat4} a matrix to clone\n * @returns {mat4} a new 4x4 matrix\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Copy the values from one mat4 to another\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Create a new mat4 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} A new mat4\n */\n\nexport function fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\n * Set the components of a mat4 to the given values\n *\n * @param {mat4} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} out\n */\n\nexport function set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\n * Set a mat4 to the identity matrix\n *\n * @param {mat4} out the receiving matrix\n * @returns {mat4} out\n */\n\nexport function identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Transpose the values of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a12 = a[6],\n a13 = a[7];\n var a23 = a[11];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a01;\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a02;\n out[9] = a12;\n out[11] = a[14];\n out[12] = a03;\n out[13] = a13;\n out[14] = a23;\n } else {\n out[0] = a[0];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a[1];\n out[5] = a[5];\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a[2];\n out[9] = a[6];\n out[10] = a[10];\n out[11] = a[14];\n out[12] = a[3];\n out[13] = a[7];\n out[14] = a[11];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\n * Inverts a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n return out;\n}\n/**\n * Calculates the adjugate of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);\n out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);\n out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);\n out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);\n out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);\n out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);\n out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);\n out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);\n return out;\n}\n/**\n * Calculates the determinant of a mat4\n *\n * @param {ReadonlyMat4} a the source matrix\n * @returns {Number} determinant of a\n */\n\nexport function determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\n/**\n * Multiplies two mat4s\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nexport function multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15]; // Cache only the current line of the second matrix\n\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[4];\n b1 = b[5];\n b2 = b[6];\n b3 = b[7];\n out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[8];\n b1 = b[9];\n b2 = b[10];\n b3 = b[11];\n out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[12];\n b1 = b[13];\n b2 = b[14];\n b3 = b[15];\n out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n return out;\n}\n/**\n * Translate a mat4 by the given vector\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to translate\n * @param {ReadonlyVec3} v vector to translate by\n * @returns {mat4} out\n */\n\nexport function translate(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n\n if (a === out) {\n out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n } else {\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a03;\n out[4] = a10;\n out[5] = a11;\n out[6] = a12;\n out[7] = a13;\n out[8] = a20;\n out[9] = a21;\n out[10] = a22;\n out[11] = a23;\n out[12] = a00 * x + a10 * y + a20 * z + a[12];\n out[13] = a01 * x + a11 * y + a21 * z + a[13];\n out[14] = a02 * x + a12 * y + a22 * z + a[14];\n out[15] = a03 * x + a13 * y + a23 * z + a[15];\n }\n\n return out;\n}\n/**\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {ReadonlyVec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n **/\n\nexport function scale(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n out[0] = a[0] * x;\n out[1] = a[1] * x;\n out[2] = a[2] * x;\n out[3] = a[3] * x;\n out[4] = a[4] * y;\n out[5] = a[5] * y;\n out[6] = a[6] * y;\n out[7] = a[7] * y;\n out[8] = a[8] * z;\n out[9] = a[9] * z;\n out[10] = a[10] * z;\n out[11] = a[11] * z;\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Rotates a mat4 by the given angle around the given axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */\n\nexport function rotate(out, a, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n var b00, b01, b02;\n var b10, b11, b12;\n var b20, b21, b22;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c;\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11]; // Construct the elements of the rotation matrix\n\n b00 = x * x * t + c;\n b01 = y * x * t + z * s;\n b02 = z * x * t - y * s;\n b10 = x * y * t - z * s;\n b11 = y * y * t + c;\n b12 = z * y * t + x * s;\n b20 = x * z * t + y * s;\n b21 = y * z * t - x * s;\n b22 = z * z * t + c; // Perform rotation-specific matrix multiplication\n\n out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the X axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function rotateX(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[4] = a10 * c + a20 * s;\n out[5] = a11 * c + a21 * s;\n out[6] = a12 * c + a22 * s;\n out[7] = a13 * c + a23 * s;\n out[8] = a20 * c - a10 * s;\n out[9] = a21 * c - a11 * s;\n out[10] = a22 * c - a12 * s;\n out[11] = a23 * c - a13 * s;\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the Y axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function rotateY(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c - a20 * s;\n out[1] = a01 * c - a21 * s;\n out[2] = a02 * c - a22 * s;\n out[3] = a03 * c - a23 * s;\n out[8] = a00 * s + a20 * c;\n out[9] = a01 * s + a21 * c;\n out[10] = a02 * s + a22 * c;\n out[11] = a03 * s + a23 * c;\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the Z axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function rotateZ(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c + a10 * s;\n out[1] = a01 * c + a11 * s;\n out[2] = a02 * c + a12 * s;\n out[3] = a03 * c + a13 * s;\n out[4] = a10 * c - a00 * s;\n out[5] = a11 * c - a01 * s;\n out[6] = a12 * c - a02 * s;\n out[7] = a13 * c - a03 * s;\n return out;\n}\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */\n\nexport function fromTranslation(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.scale(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Scaling vector\n * @returns {mat4} out\n */\n\nexport function fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = v[1];\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = v[2];\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a given angle around a given axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotate(dest, dest, rad, axis);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */\n\nexport function fromRotation(out, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c; // Perform rotation-specific matrix multiplication\n\n out[0] = x * x * t + c;\n out[1] = y * x * t + z * s;\n out[2] = z * x * t - y * s;\n out[3] = 0;\n out[4] = x * y * t - z * s;\n out[5] = y * y * t + c;\n out[6] = z * y * t + x * s;\n out[7] = 0;\n out[8] = x * z * t + y * s;\n out[9] = y * z * t - x * s;\n out[10] = z * z * t + c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the X axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateX(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function fromXRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = c;\n out[6] = s;\n out[7] = 0;\n out[8] = 0;\n out[9] = -s;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the Y axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateY(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function fromYRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = 0;\n out[2] = -s;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = s;\n out[9] = 0;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the Z axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateZ(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function fromZRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = 0;\n out[4] = -s;\n out[5] = c;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation and vector translation\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */\n\nexport function fromRotationTranslation(out, q, v) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - (yy + zz);\n out[1] = xy + wz;\n out[2] = xz - wy;\n out[3] = 0;\n out[4] = xy - wz;\n out[5] = 1 - (xx + zz);\n out[6] = yz + wx;\n out[7] = 0;\n out[8] = xz + wy;\n out[9] = yz - wx;\n out[10] = 1 - (xx + yy);\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a new mat4 from a dual quat.\n *\n * @param {mat4} out Matrix\n * @param {ReadonlyQuat2} a Dual Quaternion\n * @returns {mat4} mat4 receiving operation result\n */\n\nexport function fromQuat2(out, a) {\n var translation = new glMatrix.ARRAY_TYPE(3);\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7];\n var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense\n\n if (magnitude > 0) {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude;\n } else {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n }\n\n fromRotationTranslation(out, a, translation);\n return out;\n}\n/**\n * Returns the translation vector component of a transformation\n * matrix. If a matrix is built with fromRotationTranslation,\n * the returned vector will be the same as the translation vector\n * originally supplied.\n * @param {vec3} out Vector to receive translation component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\n\nexport function getTranslation(out, mat) {\n out[0] = mat[12];\n out[1] = mat[13];\n out[2] = mat[14];\n return out;\n}\n/**\n * Returns the scaling factor component of a transformation\n * matrix. If a matrix is built with fromRotationTranslationScale\n * with a normalized Quaternion paramter, the returned vector will be\n * the same as the scaling vector\n * originally supplied.\n * @param {vec3} out Vector to receive scaling factor component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\n\nexport function getScaling(out, mat) {\n var m11 = mat[0];\n var m12 = mat[1];\n var m13 = mat[2];\n var m21 = mat[4];\n var m22 = mat[5];\n var m23 = mat[6];\n var m31 = mat[8];\n var m32 = mat[9];\n var m33 = mat[10];\n out[0] = Math.hypot(m11, m12, m13);\n out[1] = Math.hypot(m21, m22, m23);\n out[2] = Math.hypot(m31, m32, m33);\n return out;\n}\n/**\n * Returns a quaternion representing the rotational component\n * of a transformation matrix. If a matrix is built with\n * fromRotationTranslation, the returned quaternion will be the\n * same as the quaternion originally supplied.\n * @param {quat} out Quaternion to receive the rotation component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {quat} out\n */\n\nexport function getRotation(out, mat) {\n var scaling = new glMatrix.ARRAY_TYPE(3);\n getScaling(scaling, mat);\n var is1 = 1 / scaling[0];\n var is2 = 1 / scaling[1];\n var is3 = 1 / scaling[2];\n var sm11 = mat[0] * is1;\n var sm12 = mat[1] * is2;\n var sm13 = mat[2] * is3;\n var sm21 = mat[4] * is1;\n var sm22 = mat[5] * is2;\n var sm23 = mat[6] * is3;\n var sm31 = mat[8] * is1;\n var sm32 = mat[9] * is2;\n var sm33 = mat[10] * is3;\n var trace = sm11 + sm22 + sm33;\n var S = 0;\n\n if (trace > 0) {\n S = Math.sqrt(trace + 1.0) * 2;\n out[3] = 0.25 * S;\n out[0] = (sm23 - sm32) / S;\n out[1] = (sm31 - sm13) / S;\n out[2] = (sm12 - sm21) / S;\n } else if (sm11 > sm22 && sm11 > sm33) {\n S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n out[3] = (sm23 - sm32) / S;\n out[0] = 0.25 * S;\n out[1] = (sm12 + sm21) / S;\n out[2] = (sm31 + sm13) / S;\n } else if (sm22 > sm33) {\n S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n out[3] = (sm31 - sm13) / S;\n out[0] = (sm12 + sm21) / S;\n out[1] = 0.25 * S;\n out[2] = (sm23 + sm32) / S;\n } else {\n S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n out[3] = (sm12 - sm21) / S;\n out[0] = (sm31 + sm13) / S;\n out[1] = (sm23 + sm32) / S;\n out[2] = 0.25 * S;\n }\n\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n * mat4.scale(dest, scale)\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @returns {mat4} out\n */\n\nexport function fromRotationTranslationScale(out, q, v, s) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n out[0] = (1 - (yy + zz)) * sx;\n out[1] = (xy + wz) * sx;\n out[2] = (xz - wy) * sx;\n out[3] = 0;\n out[4] = (xy - wz) * sy;\n out[5] = (1 - (xx + zz)) * sy;\n out[6] = (yz + wx) * sy;\n out[7] = 0;\n out[8] = (xz + wy) * sz;\n out[9] = (yz - wx) * sz;\n out[10] = (1 - (xx + yy)) * sz;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * mat4.translate(dest, origin);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n * mat4.scale(dest, scale)\n * mat4.translate(dest, negativeOrigin);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @param {ReadonlyVec3} o The origin vector around which to scale and rotate\n * @returns {mat4} out\n */\n\nexport function fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n var ox = o[0];\n var oy = o[1];\n var oz = o[2];\n var out0 = (1 - (yy + zz)) * sx;\n var out1 = (xy + wz) * sx;\n var out2 = (xz - wy) * sx;\n var out4 = (xy - wz) * sy;\n var out5 = (1 - (xx + zz)) * sy;\n var out6 = (yz + wx) * sy;\n var out8 = (xz + wy) * sz;\n var out9 = (yz - wx) * sz;\n var out10 = (1 - (xx + yy)) * sz;\n out[0] = out0;\n out[1] = out1;\n out[2] = out2;\n out[3] = 0;\n out[4] = out4;\n out[5] = out5;\n out[6] = out6;\n out[7] = 0;\n out[8] = out8;\n out[9] = out9;\n out[10] = out10;\n out[11] = 0;\n out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n out[15] = 1;\n return out;\n}\n/**\n * Calculates a 4x4 matrix from the given quaternion\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat4} out\n */\n\nexport function fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[1] = yx + wz;\n out[2] = zx - wy;\n out[3] = 0;\n out[4] = yx - wz;\n out[5] = 1 - xx - zz;\n out[6] = zy + wx;\n out[7] = 0;\n out[8] = zx + wy;\n out[9] = zy - wx;\n out[10] = 1 - xx - yy;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Generates a frustum matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Number} left Left bound of the frustum\n * @param {Number} right Right bound of the frustum\n * @param {Number} bottom Bottom bound of the frustum\n * @param {Number} top Top bound of the frustum\n * @param {Number} near Near bound of the frustum\n * @param {Number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function frustum(out, left, right, bottom, top, near, far) {\n var rl = 1 / (right - left);\n var tb = 1 / (top - bottom);\n var nf = 1 / (near - far);\n out[0] = near * 2 * rl;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = near * 2 * tb;\n out[6] = 0;\n out[7] = 0;\n out[8] = (right + left) * rl;\n out[9] = (top + bottom) * tb;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = far * near * 2 * nf;\n out[15] = 0;\n return out;\n}\n/**\n * Generates a perspective projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */\n\nexport function perspectiveNO(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = (far + near) * nf;\n out[14] = 2 * far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -2 * near;\n }\n\n return out;\n}\n/**\n * Alias for {@link mat4.perspectiveNO}\n * @function\n */\n\nexport var perspective = perspectiveNO;\n/**\n * Generates a perspective projection matrix suitable for WebGPU with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */\n\nexport function perspectiveZO(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = far * nf;\n out[14] = far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -near;\n }\n\n return out;\n}\n/**\n * Generates a perspective projection matrix with the given field of view.\n * This is primarily useful for generating projection matrices to be used\n * with the still experiemental WebVR API.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function perspectiveFromFieldOfView(out, fov, near, far) {\n var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);\n var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);\n var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);\n var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);\n var xScale = 2.0 / (leftTan + rightTan);\n var yScale = 2.0 / (upTan + downTan);\n out[0] = xScale;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n out[4] = 0.0;\n out[5] = yScale;\n out[6] = 0.0;\n out[7] = 0.0;\n out[8] = -((leftTan - rightTan) * xScale * 0.5);\n out[9] = (upTan - downTan) * yScale * 0.5;\n out[10] = far / (near - far);\n out[11] = -1.0;\n out[12] = 0.0;\n out[13] = 0.0;\n out[14] = far * near / (near - far);\n out[15] = 0.0;\n return out;\n}\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function orthoNO(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 2 * nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = (far + near) * nf;\n out[15] = 1;\n return out;\n}\n/**\n * Alias for {@link mat4.orthoNO}\n * @function\n */\n\nexport var ortho = orthoNO;\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function orthoZO(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = near * nf;\n out[15] = 1;\n return out;\n}\n/**\n * Generates a look-at matrix with the given eye position, focal point, and up axis.\n * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */\n\nexport function lookAt(out, eye, center, up) {\n var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;\n var eyex = eye[0];\n var eyey = eye[1];\n var eyez = eye[2];\n var upx = up[0];\n var upy = up[1];\n var upz = up[2];\n var centerx = center[0];\n var centery = center[1];\n var centerz = center[2];\n\n if (Math.abs(eyex - centerx) < glMatrix.EPSILON && Math.abs(eyey - centery) < glMatrix.EPSILON && Math.abs(eyez - centerz) < glMatrix.EPSILON) {\n return identity(out);\n }\n\n z0 = eyex - centerx;\n z1 = eyey - centery;\n z2 = eyez - centerz;\n len = 1 / Math.hypot(z0, z1, z2);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n x0 = upy * z2 - upz * z1;\n x1 = upz * z0 - upx * z2;\n x2 = upx * z1 - upy * z0;\n len = Math.hypot(x0, x1, x2);\n\n if (!len) {\n x0 = 0;\n x1 = 0;\n x2 = 0;\n } else {\n len = 1 / len;\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n y0 = z1 * x2 - z2 * x1;\n y1 = z2 * x0 - z0 * x2;\n y2 = z0 * x1 - z1 * x0;\n len = Math.hypot(y0, y1, y2);\n\n if (!len) {\n y0 = 0;\n y1 = 0;\n y2 = 0;\n } else {\n len = 1 / len;\n y0 *= len;\n y1 *= len;\n y2 *= len;\n }\n\n out[0] = x0;\n out[1] = y0;\n out[2] = z0;\n out[3] = 0;\n out[4] = x1;\n out[5] = y1;\n out[6] = z1;\n out[7] = 0;\n out[8] = x2;\n out[9] = y2;\n out[10] = z2;\n out[11] = 0;\n out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n out[15] = 1;\n return out;\n}\n/**\n * Generates a matrix that makes something look at something else.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */\n\nexport function targetTo(out, eye, target, up) {\n var eyex = eye[0],\n eyey = eye[1],\n eyez = eye[2],\n upx = up[0],\n upy = up[1],\n upz = up[2];\n var z0 = eyex - target[0],\n z1 = eyey - target[1],\n z2 = eyez - target[2];\n var len = z0 * z0 + z1 * z1 + z2 * z2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n }\n\n var x0 = upy * z2 - upz * z1,\n x1 = upz * z0 - upx * z2,\n x2 = upx * z1 - upy * z0;\n len = x0 * x0 + x1 * x1 + x2 * x2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n out[0] = x0;\n out[1] = x1;\n out[2] = x2;\n out[3] = 0;\n out[4] = z1 * x2 - z2 * x1;\n out[5] = z2 * x0 - z0 * x2;\n out[6] = z0 * x1 - z1 * x0;\n out[7] = 0;\n out[8] = z0;\n out[9] = z1;\n out[10] = z2;\n out[11] = 0;\n out[12] = eyex;\n out[13] = eyey;\n out[14] = eyez;\n out[15] = 1;\n return out;\n}\n/**\n * Returns a string representation of a mat4\n *\n * @param {ReadonlyMat4} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\n\nexport function str(a) {\n return \"mat4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \", \" + a[9] + \", \" + a[10] + \", \" + a[11] + \", \" + a[12] + \", \" + a[13] + \", \" + a[14] + \", \" + a[15] + \")\";\n}\n/**\n * Returns Frobenius norm of a mat4\n *\n * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\n\nexport function frob(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);\n}\n/**\n * Adds two mat4's\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n out[9] = a[9] + b[9];\n out[10] = a[10] + b[10];\n out[11] = a[11] + b[11];\n out[12] = a[12] + b[12];\n out[13] = a[13] + b[13];\n out[14] = a[14] + b[14];\n out[15] = a[15] + b[15];\n return out;\n}\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n out[9] = a[9] - b[9];\n out[10] = a[10] - b[10];\n out[11] = a[11] - b[11];\n out[12] = a[12] - b[12];\n out[13] = a[13] - b[13];\n out[14] = a[14] - b[14];\n out[15] = a[15] - b[15];\n return out;\n}\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat4} out\n */\n\nexport function multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n out[9] = a[9] * b;\n out[10] = a[10] * b;\n out[11] = a[11] * b;\n out[12] = a[12] * b;\n out[13] = a[13] * b;\n out[14] = a[14] * b;\n out[15] = a[15] * b;\n return out;\n}\n/**\n * Adds two mat4's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat4} out the receiving vector\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat4} out\n */\n\nexport function multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n out[9] = a[9] + b[9] * scale;\n out[10] = a[10] + b[10] * scale;\n out[11] = a[11] + b[11] * scale;\n out[12] = a[12] + b[12] * scale;\n out[13] = a[13] + b[13] * scale;\n out[14] = a[14] + b[14] * scale;\n out[15] = a[15] + b[15] * scale;\n return out;\n}\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];\n}\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7];\n var a8 = a[8],\n a9 = a[9],\n a10 = a[10],\n a11 = a[11];\n var a12 = a[12],\n a13 = a[13],\n a14 = a[14],\n a15 = a[15];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n var b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7];\n var b8 = b[8],\n b9 = b[9],\n b10 = b[10],\n b11 = b[11];\n var b12 = b[12],\n b13 = b[13],\n b14 = b[14],\n b15 = b[15];\n 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));\n}\n/**\n * Alias for {@link mat4.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link mat4.subtract}\n * @function\n */\n\nexport var sub = subtract;","import * as glMatrix from \"./common.js\";\n/**\n * 3 Dimensional Vector\n * @module vec3\n */\n\n/**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(3);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n return out;\n}\n/**\n * Creates a new vec3 initialized with values from an existing vector\n *\n * @param {ReadonlyVec3} a vector to clone\n * @returns {vec3} a new 3D vector\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\n * Calculates the length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return Math.hypot(x, y, z);\n}\n/**\n * Creates a new vec3 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} a new 3D vector\n */\n\nexport function fromValues(x, y, z) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\n * Copy the values from one vec3 to another\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the source vector\n * @returns {vec3} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\n * Set the components of a vec3 to the given values\n *\n * @param {vec3} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} out\n */\n\nexport function set(out, x, y, z) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\n * Adds two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\n/**\n * Multiplies two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n return out;\n}\n/**\n * Divides two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n return out;\n}\n/**\n * Math.ceil the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to ceil\n * @returns {vec3} out\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n return out;\n}\n/**\n * Math.floor the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to floor\n * @returns {vec3} out\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n return out;\n}\n/**\n * Returns the minimum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n return out;\n}\n/**\n * Returns the maximum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n return out;\n}\n/**\n * Math.round the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to round\n * @returns {vec3} out\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n return out;\n}\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n return out;\n}\n/**\n * Adds two vec3's after scaling the second operand by a scalar value\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec3} out\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n return out;\n}\n/**\n * Calculates the euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} distance between a and b\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return Math.hypot(x, y, z);\n}\n/**\n * Calculates the squared euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return x * x + y * y + z * z;\n}\n/**\n * Calculates the squared length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return x * x + y * y + z * z;\n}\n/**\n * Negates the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to negate\n * @returns {vec3} out\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n}\n/**\n * Returns the inverse of the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to invert\n * @returns {vec3} out\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n return out;\n}\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to normalize\n * @returns {vec3} out\n */\n\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var len = x * x + y * y + z * z;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n return out;\n}\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} dot product of a and b\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function cross(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2];\n var bx = b[0],\n by = b[1],\n bz = b[2];\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n}\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n return out;\n}\n/**\n * Performs a hermite interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nexport function hermite(out, a, b, c, d, t) {\n var factorTimes2 = t * t;\n var factor1 = factorTimes2 * (2 * t - 3) + 1;\n var factor2 = factorTimes2 * (t - 2) + t;\n var factor3 = factorTimes2 * (t - 1);\n var factor4 = factorTimes2 * (3 - 2 * t);\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\n * Performs a bezier interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nexport function bezier(out, a, b, c, d, t) {\n var inverseFactor = 1 - t;\n var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n var factorTimes2 = t * t;\n var factor1 = inverseFactorTimesTwo * inverseFactor;\n var factor2 = 3 * t * inverseFactorTimesTwo;\n var factor3 = 3 * factorTimes2 * inverseFactor;\n var factor4 = factorTimes2 * t;\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec3} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec3} out\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n var z = glMatrix.RANDOM() * 2.0 - 1.0;\n var zScale = Math.sqrt(1.0 - z * z) * scale;\n out[0] = Math.cos(r) * zScale;\n out[1] = Math.sin(r) * zScale;\n out[2] = z * scale;\n return out;\n}\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec3} out\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n w = w || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n}\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */\n\nexport function transformMat3(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x * m[0] + y * m[3] + z * m[6];\n out[1] = x * m[1] + y * m[4] + z * m[7];\n out[2] = x * m[2] + y * m[5] + z * m[8];\n return out;\n}\n/**\n * Transforms the vec3 with a quat\n * Can also be used for dual quaternions. (Multiply it with the real part)\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyQuat} q quaternion to transform with\n * @returns {vec3} out\n */\n\nexport function transformQuat(out, a, q) {\n // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3];\n var x = a[0],\n y = a[1],\n z = a[2]; // var qvec = [qx, qy, qz];\n // var uv = vec3.cross([], qvec, a);\n\n var uvx = qy * z - qz * y,\n uvy = qz * x - qx * z,\n uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv);\n\n var uuvx = qy * uvz - qz * uvy,\n uuvy = qz * uvx - qx * uvz,\n uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w);\n\n var w2 = qw * 2;\n uvx *= w2;\n uvy *= w2;\n uvz *= w2; // vec3.scale(uuv, uuv, 2);\n\n uuvx *= 2;\n uuvy *= 2;\n uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv));\n\n out[0] = x + uvx + uuvx;\n out[1] = y + uvy + uuvy;\n out[2] = z + uvz + uuvz;\n return out;\n}\n/**\n * Rotate a 3D vector around the x-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nexport function rotateX(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0];\n r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Rotate a 3D vector around the y-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nexport function rotateY(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n r[1] = p[1];\n r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Rotate a 3D vector around the z-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nexport function rotateZ(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n r[2] = p[2]; //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Get the angle between two 3D vectors\n * @param {ReadonlyVec3} a The first operand\n * @param {ReadonlyVec3} b The second operand\n * @returns {Number} The angle in radians\n */\n\nexport function angle(a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n bz = b[2],\n mag1 = Math.sqrt(ax * ax + ay * ay + az * az),\n mag2 = Math.sqrt(bx * bx + by * by + bz * bz),\n mag = mag1 * mag2,\n cosine = mag && dot(a, b) / mag;\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\n * Set the components of a vec3 to zero\n *\n * @param {vec3} out the receiving vector\n * @returns {vec3} out\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec3} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"vec3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \")\";\n}\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2];\n 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));\n}\n/**\n * Alias for {@link vec3.subtract}\n * @function\n */\n\nexport var sub = subtract;\n/**\n * Alias for {@link vec3.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link vec3.divide}\n * @function\n */\n\nexport var div = divide;\n/**\n * Alias for {@link vec3.distance}\n * @function\n */\n\nexport var dist = distance;\n/**\n * Alias for {@link vec3.squaredDistance}\n * @function\n */\n\nexport var sqrDist = squaredDistance;\n/**\n * Alias for {@link vec3.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Alias for {@link vec3.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec3s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 3;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n }\n\n return a;\n };\n}();","import * as glMatrix from \"./common.js\";\n/**\n * 4 Dimensional Vector\n * @module vec4\n */\n\n/**\n * Creates a new, empty vec4\n *\n * @returns {vec4} a new 4D vector\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(4);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n }\n\n return out;\n}\n/**\n * Creates a new vec4 initialized with values from an existing vector\n *\n * @param {ReadonlyVec4} a vector to clone\n * @returns {vec4} a new 4D vector\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Creates a new vec4 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} a new 4D vector\n */\n\nexport function fromValues(x, y, z, w) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\n * Copy the values from one vec4 to another\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the source vector\n * @returns {vec4} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Set the components of a vec4 to the given values\n *\n * @param {vec4} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} out\n */\n\nexport function set(out, x, y, z, w) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\n * Adds two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n return out;\n}\n/**\n * Multiplies two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n out[3] = a[3] * b[3];\n return out;\n}\n/**\n * Divides two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n out[3] = a[3] / b[3];\n return out;\n}\n/**\n * Math.ceil the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to ceil\n * @returns {vec4} out\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n out[3] = Math.ceil(a[3]);\n return out;\n}\n/**\n * Math.floor the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to floor\n * @returns {vec4} out\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n out[3] = Math.floor(a[3]);\n return out;\n}\n/**\n * Returns the minimum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n out[3] = Math.min(a[3], b[3]);\n return out;\n}\n/**\n * Returns the maximum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n out[3] = Math.max(a[3], b[3]);\n return out;\n}\n/**\n * Math.round the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to round\n * @returns {vec4} out\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n out[3] = Math.round(a[3]);\n return out;\n}\n/**\n * Scales a vec4 by a scalar number\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec4} out\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n return out;\n}\n/**\n * Adds two vec4's after scaling the second operand by a scalar value\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec4} out\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n return out;\n}\n/**\n * Calculates the euclidian distance between two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} distance between a and b\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\n * Calculates the squared euclidian distance between two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\n * Calculates the length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\n * Calculates the squared length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\n * Negates the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to negate\n * @returns {vec4} out\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = -a[3];\n return out;\n}\n/**\n * Returns the inverse of the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to invert\n * @returns {vec4} out\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n out[3] = 1.0 / a[3];\n return out;\n}\n/**\n * Normalize a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to normalize\n * @returns {vec4} out\n */\n\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n var len = x * x + y * y + z * z + w * w;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = x * len;\n out[1] = y * len;\n out[2] = z * len;\n out[3] = w * len;\n return out;\n}\n/**\n * Calculates the dot product of two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} dot product of a and b\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n}\n/**\n * Returns the cross-product of three vectors in a 4-dimensional space\n *\n * @param {ReadonlyVec4} result the receiving vector\n * @param {ReadonlyVec4} U the first vector\n * @param {ReadonlyVec4} V the second vector\n * @param {ReadonlyVec4} W the third vector\n * @returns {vec4} result\n */\n\nexport function cross(out, u, v, w) {\n var A = v[0] * w[1] - v[1] * w[0],\n B = v[0] * w[2] - v[2] * w[0],\n C = v[0] * w[3] - v[3] * w[0],\n D = v[1] * w[2] - v[2] * w[1],\n E = v[1] * w[3] - v[3] * w[1],\n F = v[2] * w[3] - v[3] * w[2];\n var G = u[0];\n var H = u[1];\n var I = u[2];\n var J = u[3];\n out[0] = H * F - I * E + J * D;\n out[1] = -(G * F) + I * C - J * B;\n out[2] = G * E - H * C + J * A;\n out[3] = -(G * D) + H * B - I * A;\n return out;\n}\n/**\n * Performs a linear interpolation between two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec4} out\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n var aw = a[3];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n out[3] = aw + t * (b[3] - aw);\n return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec4} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec4} out\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a\n // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646.\n // http://projecteuclid.org/euclid.aoms/1177692644;\n\n var v1, v2, v3, v4;\n var s1, s2;\n\n do {\n v1 = glMatrix.RANDOM() * 2 - 1;\n v2 = glMatrix.RANDOM() * 2 - 1;\n s1 = v1 * v1 + v2 * v2;\n } while (s1 >= 1);\n\n do {\n v3 = glMatrix.RANDOM() * 2 - 1;\n v4 = glMatrix.RANDOM() * 2 - 1;\n s2 = v3 * v3 + v4 * v4;\n } while (s2 >= 1);\n\n var d = Math.sqrt((1 - s1) / s2);\n out[0] = scale * v1;\n out[1] = scale * v2;\n out[2] = scale * v3 * d;\n out[3] = scale * v4 * d;\n return out;\n}\n/**\n * Transforms the vec4 with a mat4.\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec4} out\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n return out;\n}\n/**\n * Transforms the vec4 with a quat\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to transform\n * @param {ReadonlyQuat} q quaternion to transform with\n * @returns {vec4} out\n */\n\nexport function transformQuat(out, a, q) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3]; // calculate quat * vec\n\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat\n\n out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n out[3] = a[3];\n return out;\n}\n/**\n * Set the components of a vec4 to zero\n *\n * @param {vec4} out the receiving vector\n * @returns {vec4} out\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec4} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"vec4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec4} a The first vector.\n * @param {ReadonlyVec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec4} a The first vector.\n * @param {ReadonlyVec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n 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));\n}\n/**\n * Alias for {@link vec4.subtract}\n * @function\n */\n\nexport var sub = subtract;\n/**\n * Alias for {@link vec4.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link vec4.divide}\n * @function\n */\n\nexport var div = divide;\n/**\n * Alias for {@link vec4.distance}\n * @function\n */\n\nexport var dist = distance;\n/**\n * Alias for {@link vec4.squaredDistance}\n * @function\n */\n\nexport var sqrDist = squaredDistance;\n/**\n * Alias for {@link vec4.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Alias for {@link vec4.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec4s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 4;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n vec[3] = a[i + 3];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n a[i + 3] = vec[3];\n }\n\n return a;\n };\n}();","import * as glMatrix from \"./common.js\";\nimport * as mat3 from \"./mat3.js\";\nimport * as vec3 from \"./vec3.js\";\nimport * as vec4 from \"./vec4.js\";\n/**\n * Quaternion\n * @module quat\n */\n\n/**\n * Creates a new identity quat\n *\n * @returns {quat} a new quaternion\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(4);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n out[3] = 1;\n return out;\n}\n/**\n * Set a quat to the identity quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\n\nexport function identity(out) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n}\n/**\n * Sets a quat from the given angle and rotation axis,\n * then returns it.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyVec3} axis the axis around which to rotate\n * @param {Number} rad the angle in radians\n * @returns {quat} out\n **/\n\nexport function setAxisAngle(out, axis, rad) {\n rad = rad * 0.5;\n var s = Math.sin(rad);\n out[0] = s * axis[0];\n out[1] = s * axis[1];\n out[2] = s * axis[2];\n out[3] = Math.cos(rad);\n return out;\n}\n/**\n * Gets the rotation axis and angle for a given\n * quaternion. If a quaternion is created with\n * setAxisAngle, this method will return the same\n * values as providied in the original parameter list\n * OR functionally equivalent values.\n * Example: The quaternion formed by axis [0, 0, 1] and\n * angle -90 is the same as the quaternion formed by\n * [0, 0, 1] and 270. This method favors the latter.\n * @param {vec3} out_axis Vector receiving the axis of rotation\n * @param {ReadonlyQuat} q Quaternion to be decomposed\n * @return {Number} Angle, in radians, of the rotation\n */\n\nexport function getAxisAngle(out_axis, q) {\n var rad = Math.acos(q[3]) * 2.0;\n var s = Math.sin(rad / 2.0);\n\n if (s > glMatrix.EPSILON) {\n out_axis[0] = q[0] / s;\n out_axis[1] = q[1] / s;\n out_axis[2] = q[2] / s;\n } else {\n // If s is zero, return any axis (no rotation - axis does not matter)\n out_axis[0] = 1;\n out_axis[1] = 0;\n out_axis[2] = 0;\n }\n\n return rad;\n}\n/**\n * Gets the angular distance between two unit quaternions\n *\n * @param {ReadonlyQuat} a Origin unit quaternion\n * @param {ReadonlyQuat} b Destination unit quaternion\n * @return {Number} Angle, in radians, between the two quaternions\n */\n\nexport function getAngle(a, b) {\n var dotproduct = dot(a, b);\n return Math.acos(2 * dotproduct * dotproduct - 1);\n}\n/**\n * Multiplies two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {quat} out\n */\n\nexport function multiply(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = b[0],\n by = b[1],\n bz = b[2],\n bw = b[3];\n out[0] = ax * bw + aw * bx + ay * bz - az * by;\n out[1] = ay * bw + aw * by + az * bx - ax * bz;\n out[2] = az * bw + aw * bz + ax * by - ay * bx;\n out[3] = aw * bw - ax * bx - ay * by - az * bz;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the X axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nexport function rotateX(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw + aw * bx;\n out[1] = ay * bw + az * bx;\n out[2] = az * bw - ay * bx;\n out[3] = aw * bw - ax * bx;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the Y axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nexport function rotateY(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var by = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw - az * by;\n out[1] = ay * bw + aw * by;\n out[2] = az * bw + ax * by;\n out[3] = aw * bw - ay * by;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the Z axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nexport function rotateZ(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bz = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw + ay * bz;\n out[1] = ay * bw - ax * bz;\n out[2] = az * bw + aw * bz;\n out[3] = aw * bw - az * bz;\n return out;\n}\n/**\n * Calculates the W component of a quat from the X, Y, and Z components.\n * Assumes that quaternion is 1 unit in length.\n * Any existing W component will be ignored.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate W component of\n * @returns {quat} out\n */\n\nexport function calculateW(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));\n return out;\n}\n/**\n * Calculate the exponential of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} out\n */\n\nexport function exp(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n var r = Math.sqrt(x * x + y * y + z * z);\n var et = Math.exp(w);\n var s = r > 0 ? et * Math.sin(r) / r : 0;\n out[0] = x * s;\n out[1] = y * s;\n out[2] = z * s;\n out[3] = et * Math.cos(r);\n return out;\n}\n/**\n * Calculate the natural logarithm of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} out\n */\n\nexport function ln(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n var r = Math.sqrt(x * x + y * y + z * z);\n var t = r > 0 ? Math.atan2(r, w) / r : 0;\n out[0] = x * t;\n out[1] = y * t;\n out[2] = z * t;\n out[3] = 0.5 * Math.log(x * x + y * y + z * z + w * w);\n return out;\n}\n/**\n * Calculate the scalar power of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @param {Number} b amount to scale the quaternion by\n * @returns {quat} out\n */\n\nexport function pow(out, a, b) {\n ln(out, a);\n scale(out, out, b);\n exp(out, out);\n return out;\n}\n/**\n * Performs a spherical linear interpolation between two quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n */\n\nexport function slerp(out, a, b, t) {\n // benchmarks:\n // http://jsperf.com/quaternion-slerp-implementations\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = b[0],\n by = b[1],\n bz = b[2],\n bw = b[3];\n var omega, cosom, sinom, scale0, scale1; // calc cosine\n\n cosom = ax * bx + ay * by + az * bz + aw * bw; // adjust signs (if necessary)\n\n if (cosom < 0.0) {\n cosom = -cosom;\n bx = -bx;\n by = -by;\n bz = -bz;\n bw = -bw;\n } // calculate coefficients\n\n\n if (1.0 - cosom > glMatrix.EPSILON) {\n // standard case (slerp)\n omega = Math.acos(cosom);\n sinom = Math.sin(omega);\n scale0 = Math.sin((1.0 - t) * omega) / sinom;\n scale1 = Math.sin(t * omega) / sinom;\n } else {\n // \"from\" and \"to\" quaternions are very close\n // ... so we can do a linear interpolation\n scale0 = 1.0 - t;\n scale1 = t;\n } // calculate final values\n\n\n out[0] = scale0 * ax + scale1 * bx;\n out[1] = scale0 * ay + scale1 * by;\n out[2] = scale0 * az + scale1 * bz;\n out[3] = scale0 * aw + scale1 * bw;\n return out;\n}\n/**\n * Generates a random unit quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\n\nexport function random(out) {\n // Implementation of http://planning.cs.uiuc.edu/node198.html\n // TODO: Calling random 3 times is probably not the fastest solution\n var u1 = glMatrix.RANDOM();\n var u2 = glMatrix.RANDOM();\n var u3 = glMatrix.RANDOM();\n var sqrt1MinusU1 = Math.sqrt(1 - u1);\n var sqrtU1 = Math.sqrt(u1);\n out[0] = sqrt1MinusU1 * Math.sin(2.0 * Math.PI * u2);\n out[1] = sqrt1MinusU1 * Math.cos(2.0 * Math.PI * u2);\n out[2] = sqrtU1 * Math.sin(2.0 * Math.PI * u3);\n out[3] = sqrtU1 * Math.cos(2.0 * Math.PI * u3);\n return out;\n}\n/**\n * Calculates the inverse of a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate inverse of\n * @returns {quat} out\n */\n\nexport function invert(out, a) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3;\n var invDot = dot ? 1.0 / dot : 0; // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0\n\n out[0] = -a0 * invDot;\n out[1] = -a1 * invDot;\n out[2] = -a2 * invDot;\n out[3] = a3 * invDot;\n return out;\n}\n/**\n * Calculates the conjugate of a quat\n * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate conjugate of\n * @returns {quat} out\n */\n\nexport function conjugate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Creates a quaternion from the given 3x3 rotation matrix.\n *\n * NOTE: The resultant quaternion is not normalized, so you should be sure\n * to renormalize the quaternion yourself where necessary.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyMat3} m rotation matrix\n * @returns {quat} out\n * @function\n */\n\nexport function fromMat3(out, m) {\n // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes\n // article \"Quaternion Calculus and Fast Animation\".\n var fTrace = m[0] + m[4] + m[8];\n var fRoot;\n\n if (fTrace > 0.0) {\n // |w| > 1/2, may as well choose w > 1/2\n fRoot = Math.sqrt(fTrace + 1.0); // 2w\n\n out[3] = 0.5 * fRoot;\n fRoot = 0.5 / fRoot; // 1/(4w)\n\n out[0] = (m[5] - m[7]) * fRoot;\n out[1] = (m[6] - m[2]) * fRoot;\n out[2] = (m[1] - m[3]) * fRoot;\n } else {\n // |w| <= 1/2\n var i = 0;\n if (m[4] > m[0]) i = 1;\n if (m[8] > m[i * 3 + i]) i = 2;\n var j = (i + 1) % 3;\n var k = (i + 2) % 3;\n fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0);\n out[i] = 0.5 * fRoot;\n fRoot = 0.5 / fRoot;\n out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot;\n out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;\n out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot;\n }\n\n return out;\n}\n/**\n * Creates a quaternion from the given euler angle x, y, z.\n *\n * @param {quat} out the receiving quaternion\n * @param {x} Angle to rotate around X axis in degrees.\n * @param {y} Angle to rotate around Y axis in degrees.\n * @param {z} Angle to rotate around Z axis in degrees.\n * @returns {quat} out\n * @function\n */\n\nexport function fromEuler(out, x, y, z) {\n var halfToRad = 0.5 * Math.PI / 180.0;\n x *= halfToRad;\n y *= halfToRad;\n z *= halfToRad;\n var sx = Math.sin(x);\n var cx = Math.cos(x);\n var sy = Math.sin(y);\n var cy = Math.cos(y);\n var sz = Math.sin(z);\n var cz = Math.cos(z);\n out[0] = sx * cy * cz - cx * sy * sz;\n out[1] = cx * sy * cz + sx * cy * sz;\n out[2] = cx * cy * sz - sx * sy * cz;\n out[3] = cx * cy * cz + sx * sy * sz;\n return out;\n}\n/**\n * Returns a string representation of a quatenion\n *\n * @param {ReadonlyQuat} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"quat(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\n * Creates a new quat initialized with values from an existing quaternion\n *\n * @param {ReadonlyQuat} a quaternion to clone\n * @returns {quat} a new quaternion\n * @function\n */\n\nexport var clone = vec4.clone;\n/**\n * Creates a new quat initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} a new quaternion\n * @function\n */\n\nexport var fromValues = vec4.fromValues;\n/**\n * Copy the values from one quat to another\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the source quaternion\n * @returns {quat} out\n * @function\n */\n\nexport var copy = vec4.copy;\n/**\n * Set the components of a quat to the given values\n *\n * @param {quat} out the receiving quaternion\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} out\n * @function\n */\n\nexport var set = vec4.set;\n/**\n * Adds two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {quat} out\n * @function\n */\n\nexport var add = vec4.add;\n/**\n * Alias for {@link quat.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Scales a quat by a scalar number\n *\n * @param {quat} out the receiving vector\n * @param {ReadonlyQuat} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {quat} out\n * @function\n */\n\nexport var scale = vec4.scale;\n/**\n * Calculates the dot product of two quat's\n *\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {Number} dot product of a and b\n * @function\n */\n\nexport var dot = vec4.dot;\n/**\n * Performs a linear interpolation between two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n * @function\n */\n\nexport var lerp = vec4.lerp;\n/**\n * Calculates the length of a quat\n *\n * @param {ReadonlyQuat} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport var length = vec4.length;\n/**\n * Alias for {@link quat.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Calculates the squared length of a quat\n *\n * @param {ReadonlyQuat} a vector to calculate squared length of\n * @returns {Number} squared length of a\n * @function\n */\n\nexport var squaredLength = vec4.squaredLength;\n/**\n * Alias for {@link quat.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Normalize a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quaternion to normalize\n * @returns {quat} out\n * @function\n */\n\nexport var normalize = vec4.normalize;\n/**\n * Returns whether or not the quaternions have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyQuat} a The first quaternion.\n * @param {ReadonlyQuat} b The second quaternion.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport var exactEquals = vec4.exactEquals;\n/**\n * Returns whether or not the quaternions have approximately the same elements in the same position.\n *\n * @param {ReadonlyQuat} a The first vector.\n * @param {ReadonlyQuat} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport var equals = vec4.equals;\n/**\n * Sets a quaternion to represent the shortest rotation from one\n * vector to another.\n *\n * Both vectors are assumed to be unit length.\n *\n * @param {quat} out the receiving quaternion.\n * @param {ReadonlyVec3} a the initial vector\n * @param {ReadonlyVec3} b the destination vector\n * @returns {quat} out\n */\n\nexport var rotationTo = function () {\n var tmpvec3 = vec3.create();\n var xUnitVec3 = vec3.fromValues(1, 0, 0);\n var yUnitVec3 = vec3.fromValues(0, 1, 0);\n return function (out, a, b) {\n var dot = vec3.dot(a, b);\n\n if (dot < -0.999999) {\n vec3.cross(tmpvec3, xUnitVec3, a);\n if (vec3.len(tmpvec3) < 0.000001) vec3.cross(tmpvec3, yUnitVec3, a);\n vec3.normalize(tmpvec3, tmpvec3);\n setAxisAngle(out, tmpvec3, Math.PI);\n return out;\n } else if (dot > 0.999999) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n } else {\n vec3.cross(tmpvec3, a, b);\n out[0] = tmpvec3[0];\n out[1] = tmpvec3[1];\n out[2] = tmpvec3[2];\n out[3] = 1 + dot;\n return normalize(out, out);\n }\n };\n}();\n/**\n * Performs a spherical linear interpolation with two control points\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {ReadonlyQuat} c the third operand\n * @param {ReadonlyQuat} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n */\n\nexport var sqlerp = function () {\n var temp1 = create();\n var temp2 = create();\n return function (out, a, b, c, d, t) {\n slerp(temp1, a, d, t);\n slerp(temp2, b, c, t);\n slerp(out, temp1, temp2, 2 * t * (1 - t));\n return out;\n };\n}();\n/**\n * Sets the specified quaternion with values corresponding to the given\n * axes. Each axis is a vec3 and is expected to be unit length and\n * perpendicular to all other specified axes.\n *\n * @param {ReadonlyVec3} view the vector representing the viewing direction\n * @param {ReadonlyVec3} right the vector representing the local \"right\" direction\n * @param {ReadonlyVec3} up the vector representing the local \"up\" direction\n * @returns {quat} out\n */\n\nexport var setAxes = function () {\n var matr = mat3.create();\n return function (out, view, right, up) {\n matr[0] = right[0];\n matr[3] = right[1];\n matr[6] = right[2];\n matr[1] = up[0];\n matr[4] = up[1];\n matr[7] = up[2];\n matr[2] = -view[0];\n matr[5] = -view[1];\n matr[8] = -view[2];\n return normalize(out, fromMat3(out, matr));\n };\n}();","import * as glMatrix from \"./common.js\";\n/**\n * 2 Dimensional Vector\n * @module vec2\n */\n\n/**\n * Creates a new, empty vec2\n *\n * @returns {vec2} a new 2D vector\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(2);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n }\n\n return out;\n}\n/**\n * Creates a new vec2 initialized with values from an existing vector\n *\n * @param {ReadonlyVec2} a vector to clone\n * @returns {vec2} a new 2D vector\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(2);\n out[0] = a[0];\n out[1] = a[1];\n return out;\n}\n/**\n * Creates a new vec2 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} a new 2D vector\n */\n\nexport function fromValues(x, y) {\n var out = new glMatrix.ARRAY_TYPE(2);\n out[0] = x;\n out[1] = y;\n return out;\n}\n/**\n * Copy the values from one vec2 to another\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the source vector\n * @returns {vec2} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n return out;\n}\n/**\n * Set the components of a vec2 to the given values\n *\n * @param {vec2} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} out\n */\n\nexport function set(out, x, y) {\n out[0] = x;\n out[1] = y;\n return out;\n}\n/**\n * Adds two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n return out;\n}\n/**\n * Multiplies two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n return out;\n}\n/**\n * Divides two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n return out;\n}\n/**\n * Math.ceil the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to ceil\n * @returns {vec2} out\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n return out;\n}\n/**\n * Math.floor the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to floor\n * @returns {vec2} out\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n return out;\n}\n/**\n * Returns the minimum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n return out;\n}\n/**\n * Returns the maximum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n return out;\n}\n/**\n * Math.round the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to round\n * @returns {vec2} out\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n return out;\n}\n/**\n * Scales a vec2 by a scalar number\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec2} out\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n return out;\n}\n/**\n * Adds two vec2's after scaling the second operand by a scalar value\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec2} out\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n return out;\n}\n/**\n * Calculates the euclidian distance between two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} distance between a and b\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return Math.hypot(x, y);\n}\n/**\n * Calculates the squared euclidian distance between two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return x * x + y * y;\n}\n/**\n * Calculates the length of a vec2\n *\n * @param {ReadonlyVec2} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport function length(a) {\n var x = a[0],\n y = a[1];\n return Math.hypot(x, y);\n}\n/**\n * Calculates the squared length of a vec2\n *\n * @param {ReadonlyVec2} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\nexport function squaredLength(a) {\n var x = a[0],\n y = a[1];\n return x * x + y * y;\n}\n/**\n * Negates the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to negate\n * @returns {vec2} out\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n return out;\n}\n/**\n * Returns the inverse of the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to invert\n * @returns {vec2} out\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n return out;\n}\n/**\n * Normalize a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to normalize\n * @returns {vec2} out\n */\n\nexport function normalize(out, a) {\n var x = a[0],\n y = a[1];\n var len = x * x + y * y;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n return out;\n}\n/**\n * Calculates the dot product of two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} dot product of a and b\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1];\n}\n/**\n * Computes the cross product of two vec2's\n * Note that the cross product must by definition produce a 3D vector\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec3} out\n */\n\nexport function cross(out, a, b) {\n var z = a[0] * b[1] - a[1] * b[0];\n out[0] = out[1] = 0;\n out[2] = z;\n return out;\n}\n/**\n * Performs a linear interpolation between two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec2} out\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0],\n ay = a[1];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec2} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec2} out\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n out[0] = Math.cos(r) * scale;\n out[1] = Math.sin(r) * scale;\n return out;\n}\n/**\n * Transforms the vec2 with a mat2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat2} m matrix to transform with\n * @returns {vec2} out\n */\n\nexport function transformMat2(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y;\n out[1] = m[1] * x + m[3] * y;\n return out;\n}\n/**\n * Transforms the vec2 with a mat2d\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat2d} m matrix to transform with\n * @returns {vec2} out\n */\n\nexport function transformMat2d(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y + m[4];\n out[1] = m[1] * x + m[3] * y + m[5];\n return out;\n}\n/**\n * Transforms the vec2 with a mat3\n * 3rd vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat3} m matrix to transform with\n * @returns {vec2} out\n */\n\nexport function transformMat3(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[3] * y + m[6];\n out[1] = m[1] * x + m[4] * y + m[7];\n return out;\n}\n/**\n * Transforms the vec2 with a mat4\n * 3rd vector component is implicitly '0'\n * 4th vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec2} out\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0];\n var y = a[1];\n out[0] = m[0] * x + m[4] * y + m[12];\n out[1] = m[1] * x + m[5] * y + m[13];\n return out;\n}\n/**\n * Rotate a 2D vector\n * @param {vec2} out The receiving vec2\n * @param {ReadonlyVec2} a The vec2 point to rotate\n * @param {ReadonlyVec2} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec2} out\n */\n\nexport function rotate(out, a, b, rad) {\n //Translate point to the origin\n var p0 = a[0] - b[0],\n p1 = a[1] - b[1],\n sinC = Math.sin(rad),\n cosC = Math.cos(rad); //perform rotation and translate to correct position\n\n out[0] = p0 * cosC - p1 * sinC + b[0];\n out[1] = p0 * sinC + p1 * cosC + b[1];\n return out;\n}\n/**\n * Get the angle between two 2D vectors\n * @param {ReadonlyVec2} a The first operand\n * @param {ReadonlyVec2} b The second operand\n * @returns {Number} The angle in radians\n */\n\nexport function angle(a, b) {\n var x1 = a[0],\n y1 = a[1],\n x2 = b[0],\n y2 = b[1],\n // mag is the product of the magnitudes of a and b\n mag = Math.sqrt(x1 * x1 + y1 * y1) * Math.sqrt(x2 * x2 + y2 * y2),\n // mag &&.. short circuits if mag == 0\n cosine = mag && (x1 * x2 + y1 * y2) / mag; // Math.min(Math.max(cosine, -1), 1) clamps the cosine between -1 and 1\n\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\n * Set the components of a vec2 to zero\n *\n * @param {vec2} out the receiving vector\n * @returns {vec2} out\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec2} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"vec2(\" + a[0] + \", \" + a[1] + \")\";\n}\n/**\n * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec2} a The first vector.\n * @param {ReadonlyVec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec2} a The first vector.\n * @param {ReadonlyVec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1];\n var b0 = b[0],\n b1 = b[1];\n 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));\n}\n/**\n * Alias for {@link vec2.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Alias for {@link vec2.subtract}\n * @function\n */\n\nexport var sub = subtract;\n/**\n * Alias for {@link vec2.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link vec2.divide}\n * @function\n */\n\nexport var div = divide;\n/**\n * Alias for {@link vec2.distance}\n * @function\n */\n\nexport var dist = distance;\n/**\n * Alias for {@link vec2.squaredDistance}\n * @function\n */\n\nexport var sqrDist = squaredDistance;\n/**\n * Alias for {@link vec2.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec2s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 2;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n }\n\n return a;\n };\n}();","import type { quat } from \"gl-matrix\";\nimport { vec3 } from \"gl-matrix\";\n\nexport const circumference = 40075017;\n\nexport const radians = (_: number) => (_ / 180) * Math.PI;\n\nexport const degrees = (_: number) => (_ * 180) / Math.PI;\n\nexport const quadratic = (a: number, b: number, c: number) => {\n const q = Math.sqrt(b * b - 4 * a * c);\n return [(-b - q) / (2 * a), (-b + q) / (2 * a)];\n};\n\nexport const mercator = (\n [lng = 0, lat = 0, alt = 0]: vec3,\n out = vec3.create(),\n) =>\n vec3.set(\n out,\n lng / 360 + 0.5,\n -Math.asinh(Math.tan(radians(lat))) / (2 * Math.PI) + 0.5,\n alt / circumference,\n );\n\nexport const geodetic = ([x = 0, y = 0, z = 0]: vec3, out = vec3.create()) =>\n vec3.set(\n out,\n (x - 0.5) * 360,\n degrees(Math.atan(Math.sinh(-(y - 0.5) * (2 * Math.PI)))),\n z * circumference,\n );\n\nexport const tileToMercator = (\n [x = 0, y = 0, z = 0]: vec3,\n out = vec3.create(),\n) => {\n const k = 2 ** -z;\n return vec3.set(out, x * k, y * k, 0);\n};\n\nexport const toQuaternion = ([pitch = 0, yaw = 0, roll = 0]: vec3) => {\n const cy = Math.cos(yaw * 0.5);\n const sy = Math.sin(yaw * 0.5);\n const cp = Math.cos(pitch * 0.5);\n const sp = Math.sin(pitch * 0.5);\n const cr = Math.cos(roll * 0.5);\n const sr = Math.sin(roll * 0.5);\n\n const w = cr * cp * cy + sr * sp * sy;\n const x = sr * cp * cy - cr * sp * sy;\n const y = cr * sp * cy + sr * cp * sy;\n const z = cr * cp * sy - sr * sp * cy;\n\n return [x, y, z, w] satisfies quat;\n};\n\nexport const toOrientation = ([x = 0, y = 0, z = 0, w = 0]: quat) => {\n const roll = Math.atan2(2 * (w * x + y * z), 1 - 2 * (x * x + y * y));\n const pitch = Math.asin(2 * (w * y - z * x));\n const yaw = Math.atan2(2 * (w * z + x * y), 1 - 2 * (y * y + z * z));\n return [pitch, yaw, roll] satisfies vec3;\n};\n","import type { vec3 } from \"gl-matrix\";\n\nimport { debounce } from \"./common\";\nimport { circumference } from \"./math\";\nimport type { World } from \"./world\";\n\nconst minimumDistance = 100;\n\nexport type MouseControl = {\n enabled: boolean;\n draggable: boolean;\n rotatable: boolean;\n dispose: () => void;\n};\n\nexport const createMouseControl = (canvas: HTMLCanvasElement, world: World) => {\n let enabled = true;\n let draggable = true;\n let rotatable = true;\n let zooming = false;\n let recentered = false;\n\n const onMouseDown = () => {\n recentered = false;\n if (!enabled || !draggable) return;\n };\n\n const onMouseMove = ({ buttons, movementX, movementY, x, y }: MouseEvent) => {\n if (!enabled) return;\n if (draggable && !recentered) {\n world.recenter([x, y]);\n recentered = true;\n }\n if (buttons === 1 && draggable) {\n const [width = 0, height = 0] = world.view.screen;\n world.view = {\n ...world.view,\n offset: [x - width / 2, y - height / 2],\n };\n } else if (buttons === 2 && rotatable) {\n const {\n screen: [width = 0, height = 0],\n orientation: [pitch = 0, roll = 0, yaw = 0],\n } = world.view;\n const orientation = [\n Math.min(\n Math.PI / 2,\n Math.max(0, pitch - (movementY / height) * Math.PI),\n ),\n roll,\n yaw - (movementX / width) * Math.PI,\n ] satisfies vec3;\n world.view = {\n ...world.view,\n orientation,\n };\n }\n };\n\n const clearZooming = debounce(() => (zooming = false), 100);\n\n const onWheel = ({ x, y, deltaY }: WheelEvent) => {\n if (!enabled) return;\n if (!zooming) {\n if (draggable) world.recenter([x, y]);\n zooming = true;\n }\n const distance = Math.min(\n Math.max(world.view.distance * Math.exp(deltaY * 0.001), minimumDistance),\n circumference,\n );\n world.view = {\n ...world.view,\n distance,\n };\n clearZooming();\n };\n\n const onContextMenu = (event: MouseEvent) => event.preventDefault();\n\n canvas.addEventListener(\"mousedown\", onMouseDown);\n canvas.addEventListener(\"mousemove\", onMouseMove);\n canvas.addEventListener(\"wheel\", onWheel, { passive: true });\n canvas.addEventListener(\"contextmenu\", onContextMenu);\n\n const dispose = () => {\n canvas.removeEventListener(\"mousedown\", onMouseDown);\n canvas.removeEventListener(\"mousemove\", onMouseMove);\n canvas.removeEventListener(\"wheel\", onWheel);\n canvas.removeEventListener(\"contextmenu\", onContextMenu);\n };\n\n return {\n get enabled() {\n return enabled;\n },\n set enabled(_: boolean) {\n enabled = _;\n },\n get draggable() {\n return draggable;\n },\n set draggable(_: boolean) {\n draggable = _;\n },\n get rotatable() {\n return rotatable;\n },\n set rotatable(_: boolean) {\n rotatable = _;\n },\n dispose,\n } satisfies MouseControl;\n};\n","export type Buffer = {\n set: (value: number[]) => void;\n use: () => void;\n dispose: () => void;\n};\n\nexport const createBuffer = ({\n gl,\n type,\n target,\n}: {\n gl: WebGL2RenderingContext;\n type: \"f32\" | \"u16\" | \"i32\";\n target: \"array\" | \"element\";\n}) => {\n const buffer = gl.createBuffer();\n if (!buffer) throw new Error(\"Buffer creation failed\");\n\n const glTarget =\n target === \"array\" ? gl.ARRAY_BUFFER : gl.ELEMENT_ARRAY_BUFFER;\n\n const use = () => gl.bindBuffer(glTarget, buffer);\n\n return {\n set: value => {\n use();\n gl.bufferData(\n glTarget,\n type === \"u16\"\n ? new Uint16Array(value)\n : type === \"i32\"\n ? new Int32Array(value)\n : new Float32Array(value),\n gl.DYNAMIC_DRAW,\n );\n },\n use,\n dispose: () => gl.deleteBuffer(buffer),\n } satisfies Buffer;\n};\n","import type { mat4, vec2, vec3, vec4 } from \"gl-matrix\";\n\nimport type { Buffer } from \"./buffer\";\n\nexport type Program = {\n use: () => void;\n uniform1f: (name: string) => Uniform<number>;\n uniform1i: (name: string) => Uniform<number>;\n uniform2f: (name: string) => Uniform<vec2>;\n uniform2i: (name: string) => Uniform<vec2>;\n uniform3f: (name: string) => Uniform<vec3>;\n uniform3i: (name: string) => Uniform<vec3>;\n uniform4f: (name: string) => Uniform<vec4>;\n uniform4i: (name: string) => Uniform<vec4>;\n uniformMatrix4f: (name: string) => Uniform<mat4>;\n attribute2f: (\n name: string,\n buffer: Buffer,\n _?: { stride?: number; offset?: number },\n ) => Attribute;\n attribute3f: (\n name: string,\n buffer: Buffer,\n _?: { stride?: number; offset?: number },\n ) => Attribute;\n attribute3i: (\n name: string,\n buffer: Buffer,\n _?: { stride?: number; offset?: number },\n ) => Attribute;\n dispose: () => void;\n};\n\nexport type Uniform<T> = {\n set: (value: T) => void;\n};\n\nexport type Attribute = {\n use: () => void;\n};\n\nexport const createProgram = ({\n gl,\n vertexSource,\n fragmentSource,\n}: {\n gl: WebGL2RenderingContext;\n vertexSource: string;\n fragmentSource: string;\n}) => {\n const program = gl.createProgram();\n if (!program) throw new Error(\"Program creation failed\");\n\n const vertexShader = compileShader(\n gl,\n gl.createShader(gl.VERTEX_SHADER),\n vertexSource,\n );\n const fragmentShader = compileShader(\n gl,\n gl.createShader(gl.FRAGMENT_SHADER),\n fragmentSource,\n );\n\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n console.error(\"Link failure\", gl.getProgramInfoLog(program));\n throw new Error(\"Link failure\");\n }\n\n const use = () => gl.useProgram(program);\n\n const uniform = <T extends number | vec2 | vec3 | vec4 | mat4>(\n name: string,\n f: (location: WebGLUniformLocation, value: T) => void,\n ) => {\n const location = gl.getUniformLocation(program, name);\n let cached: T | undefined;\n const set = (value: T) => {\n if (value === cached) return;\n if (location) f(location, value);\n cached = value;\n };\n return { set };\n };\n\n const uniform1f = (name: string) =>\n uniform<number>(name, (location, x) => gl.uniform1f(location, x));\n const uniform1i = (name: string) =>\n uniform<number>(name, (location, x) => gl.uniform1i(location, x));\n const uniform2f = (name: string) =>\n uniform<vec2>(name, (location, [x = 0, y = 0]) =>\n gl.uniform2f(location, x, y),\n );\n const uniform2i = (name: string) =>\n uniform<vec2>(name, (location, [x = 0, y = 0]) =>\n gl.uniform2i(location, x, y),\n );\n const uniform3f = (name: string) =>\n uniform<vec3>(name, (location, [x = 0, y = 0, z = 0]) =>\n gl.uniform3f(location, x, y, z),\n );\n const uniform3i = (name: string) =>\n uniform<vec3>(name, (location, [x = 0, y = 0, z = 0]) =>\n gl.uniform3i(location, x, y, z),\n );\n const uniform4f = (name: string) =>\n uniform<vec4>(name, (location, [x = 0, y = 0, z = 0, w = 0]) =>\n gl.uniform4f(location, x, y, z, w),\n );\n const uniform4i = (name: string) =>\n uniform<vec4>(name, (location, [x = 0, y = 0, z = 0, w = 0]) =>\n gl.uniform4i(location, x, y, z, w),\n );\n const uniformMatrix4f = (name: string) =>\n uniform<mat4>(name, (location, value) =>\n gl.uniformMatrix4fv(location, false, value),\n );\n\n const attribute = ({\n name,\n buffer,\n size,\n type,\n stride,\n offset,\n }: {\n name: string;\n buffer: Buffer;\n size: number;\n type: \"f32\" | \"i32\" | \"u16\";\n stride?: number;\n offset?: number;\n }) => {\n const location = gl.getAttribLocation(program, name);\n if (location === -1) throw new Error(`Missing attribute: ${name}`);\n\n const use = () => {\n buffer.use();\n gl.enableVertexAttribArray(location);\n if ([\"u16\", \"i32\"].includes(type))\n gl.vertexAttribIPointer(\n location,\n size,\n type === \"u16\" ? gl.UNSIGNED_SHORT : gl.INT,\n stride || 0,\n offset || 0,\n );\n else\n gl.vertexAttribPointer(\n location,\n size,\n gl.FLOAT,\n false,\n stride || 0,\n offset || 0,\n );\n };\n\n return { use } satisfies Attribute;\n };\n\n const attribute2f = (\n name: string,\n buffer: Buffer,\n options: { stride?: number; offset?: number } = {},\n ) => attribute({ name, buffer, size: 2, type: \"f32\", ...options });\n\n const attribute3f = (\n name: string,\n buffer: Buffer,\n options: { stride?: number; offset?: number } = {},\n ) => attribute({ name, buffer, size: 3, type: \"f32\", ...options });\n\n const attribute3i = (\n name: string,\n buffer: Buffer,\n options: { stride?: number; offset?: number } = {},\n ) => attribute({ name, buffer, size: 3, type: \"i32\", ...options });\n\n const dispose = () => {\n gl.deleteProgram(program);\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n };\n\n return {\n use,\n uniform1f,\n uniform1i,\n uniform2f,\n uniform2i,\n uniform3f,\n uniform3i,\n uniform4f,\n uniform4i,\n uniformMatrix4f,\n attribute2f,\n attribute3f,\n attribute3i,\n dispose,\n } satisfies Program;\n};\n\nconst compileShader = (\n gl: WebGL2RenderingContext,\n shader: WebGLShader | null,\n source: string,\n) => {\n if (!shader) throw new Error(\"Shader creation failed\");\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n console.error(\"Compilation failed\", gl.getShaderInfoLog(shader));\n throw new Error(\"Compilation failure\");\n }\n return shader;\n};\n","import type { vec3 } from \"gl-matrix\";\n\nimport type { LayerOptions } from \".\";\n\nexport const one = 2 ** 30;\nexport const to = ([x = 0, y = 0, z = 0]: vec3) =>\n [Math.floor(x * one), Math.floor(y * one), Math.floor(z * one)] as vec3;\n\nexport const configure = (\n gl: WebGL2RenderingContext,\n _depth: boolean,\n options: Partial<LayerOptions>,\n) => {\n const { pickable, depth, polygonOffset } = {\n pickable: true,\n depth: true,\n polygonOffset: 0,\n ...options,\n };\n if (depth) gl.enable(gl.DEPTH_TEST);\n else gl.disable(gl.DEPTH_TEST);\n if (polygonOffset) {\n gl.enable(gl.POLYGON_OFFSET_FILL);\n gl.polygonOffset(0, polygonOffset);\n } else gl.disable(gl.POLYGON_OFFSET_FILL);\n if (_depth) {\n gl.disable(gl.BLEND);\n if (!pickable) return true;\n } else {\n gl.enable(gl.BLEND);\n gl.blendFuncSeparate(\n gl.SRC_ALPHA,\n gl.ONE_MINUS_SRC_ALPHA,\n gl.ONE,\n gl.ONE_MINUS_SRC_ALPHA,\n );\n }\n};\n","#version 300 es\n\nprecision highp float;\n\nuniform int index;\n\nout vec4 result;\n\nvec2 pack_depth(in float depth) {\n float value = depth * (256.f * 256.f - 1.f) / (256.f * 256.f);\n vec3 encode = fract(value * vec3(1.f, 256.f, 256.f * 256.f));\n return encode.xy - encode.yz / 256.f + 1.f / 512.f;\n}\n\nvec2 pack_index(in int index) {\n float value = float(index) / 256.f;\n return vec2(floor(value) / 255.f, fract(value) * 256.f / 255.f);\n}\n\nvoid main(void) {\n result = vec4(pack_depth(gl_FragCoord.z), pack_index(index));\n}\n","import createImageLoadWorker from \"./image-load-worker?worker&inline\";\n\nconst worker = createImageLoadWorker();\n\nexport type ImageLoad = {\n loaded: boolean;\n cancel: () => void;\n};\n\nexport const createImageLoad = ({\n url,\n onLoad,\n}: {\n url: string;\n onLoad: (image: ImageBitmap | undefined) => void;\n}) => {\n let loaded = false;\n\n const handler = ({ data }: MessageEvent) => {\n if (canceled || url !== data.url) return;\n worker.removeEventListener(\"message\", handler);\n loaded = true;\n onLoad(data.image);\n };\n worker.addEventListener(\"message\", handler);\n\n let canceled = false;\n const cancel = () => {\n canceled = true;\n worker.postMessage([\"cancel\", url]);\n };\n\n worker.postMessage([\"load\", url]);\n\n return {\n get loaded() {\n return loaded;\n },\n cancel,\n } satisfies ImageLoad;\n};\n","export type Texture = {\n use: () => void;\n attach: () => void;\n dispose: () => void;\n};\n\nexport const createTexture = (gl: WebGL2RenderingContext) => {\n const texture = gl.createTexture();\n if (!texture) throw new Error(\"Texture creation failed\");\n\n const use = () => gl.bindTexture(gl.TEXTURE_2D, texture);\n\n const attach = () => {\n use();\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n texture,\n 0,\n );\n };\n\n const dispose = () => gl.deleteTexture(texture);\n\n return { use, attach, dispose } satisfies Texture;\n};\n","import { createImageLoad } from \"../../image-load\";\nimport { createTexture } from \"./texture\";\n\nexport type ImageTexture = {\n loaded: boolean;\n use: () => void;\n attach: () => void;\n dispose: () => void;\n};\n\nexport const createImageTexture = ({\n gl,\n url,\n onLoad,\n}: {\n gl: WebGL2RenderingContext;\n url: string;\n onLoad?: (_: ImageBitmap) => void;\n}) => {\n const texture = createTexture(gl);\n\n const imageLoad = createImageLoad({\n url,\n onLoad: image => {\n if (!image) return;\n texture.use();\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n image,\n );\n onLoad?.(image);\n },\n });\n\n const { use, attach } = texture;\n\n const dispose = () => {\n imageLoad.cancel();\n texture.dispose();\n };\n\n return {\n get loaded() {\n return imageLoad.loaded;\n },\n use,\n attach,\n dispose,\n } satisfies ImageTexture;\n};\n","#version 300 es\n\nprecision highp float;\n\nuniform sampler2D image;\nin vec2 uv_out;\nin vec4 color_out;\nout vec4 result;\n\nvoid main() {\n result = texture(image, uv_out) * color_out;\n if (result.a == 0.f) discard;\n}","#version 300 es\n\nprecision highp float;\n\nuniform mat4 projection;\nuniform mat4 model_view;\nuniform ivec3 camera;\nuniform vec2 screen;\nuniform vec2 image_size;\nuniform ivec3 position;\nuniform vec4 color;\nuniform float size;\nuniform float min_size_pixels;\nuniform float max_size_pixels;\n\n\nin vec2 corner;\nin vec2 uv;\nout vec2 uv_out;\nout vec4 color_out;\n\nconst int ONE = 1073741824; // 2^30\nconst float INV_ONE = 1.f / float(ONE);\nconst float CIRCUMFERENCE = 40075017.;\n\nvoid main(void) {\n vec4 projected = projection * model_view * vec4(vec3(position - camera) * INV_ONE, 1.f);\n\n float pixel_size = projected.w / screen.y;\n float scale = clamp(size / CIRCUMFERENCE * -projection[1][1], min_size_pixels * pixel_size, max_size_pixels * pixel_size);\n\n gl_Position = projected + 0.5 * scale * screen.y / image_size.y * vec4(corner * image_size / screen, 0.f, 0.0f);\n\n uv_out = uv;\n color_out = color;\n}\n","import type { mat4, vec2, vec4 } from \"gl-matrix\";\nimport type { vec3 } from \"gl-matrix\";\n\nimport type { Buffer } from \"../../buffer\";\nimport { createBuffer } from \"../../buffer\";\nimport { mercator } from \"../../math\";\nimport { createProgram } from \"../../program\";\nimport type { Viewport } from \"../../viewport\";\nimport type { World } from \"../../world\";\nimport type { LayerOptions } from \"..\";\nimport { type BaseLayer, type Billboard } from \"..\";\nimport { configure, to } from \"../common\";\nimport depthSource from \"../depth.glsl\";\nimport { createImageTexture } from \"../terrain/image-texture\";\nimport type { Texture } from \"../terrain/texture\";\nimport fragmentSource from \"./fragment.glsl\";\nimport vertexSource from \"./vertex.glsl\";\n\nexport type BillboardLayer = BaseLayer & Billboard;\n\nexport const createBillboardLayer = (\n world: World,\n billboard: Partial<Billboard> = {},\n) => {\n const { gl } = world;\n let { options, url, position, color, size, minSizePixels, maxSizePixels } = {\n options: {},\n url: \"\",\n position: [0, 0, 0],\n color: [1, 1, 1, 1],\n size: 100,\n ...billboard,\n } satisfies Billboard;\n let imageSize: vec2 = [0, 0];\n\n const cornerBuffer = createBuffer({ gl, type: \"f32\", target: \"array\" });\n const uvBuffer = createBuffer({ gl, type: \"f32\", target: \"array\" });\n const indexBuffer = createBuffer({ gl, type: \"u16\", target: \"element\" });\n\n cornerBuffer.set(\n [\n [-1, -1],\n [-1, 1],\n [1, -1],\n [1, 1],\n ].flat(),\n );\n uvBuffer.set(\n [\n [0, 1],\n [0, 0],\n [1, 1],\n [1, 0],\n ].flat(),\n );\n indexBuffer.set(\n [\n [0, 1, 3],\n [0, 3, 2],\n ].flat(),\n );\n\n let image: Texture | undefined;\n\n const update = () => {\n image?.dispose();\n image = createImageTexture({\n gl,\n url,\n onLoad: ({ width, height }) => {\n imageSize = [width, height];\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n },\n });\n };\n\n update();\n\n const { renderProgram, depthProgram } = createPrograms(gl, {\n cornerBuffer,\n uvBuffer,\n indexBuffer,\n });\n\n const render = ({\n viewport: { projection, modelView, camera, screen },\n depth = false,\n index = 0,\n }: {\n viewport: Viewport;\n depth?: boolean;\n index?: number;\n }) => {\n if (configure(gl, depth, options)) return;\n if (!image) return;\n const program = depth ? depthProgram : renderProgram;\n program.execute({\n projection,\n modelView,\n camera: to(camera),\n screen,\n image,\n imageSize,\n position: to(mercator(position)),\n color,\n size,\n minSizePixels: minSizePixels || 0,\n maxSizePixels: maxSizePixels || Number.MAX_VALUE,\n index,\n });\n };\n\n const dispose = () => {\n cornerBuffer.dispose();\n uvBuffer.dispose();\n indexBuffer.dispose();\n renderProgram.dispose();\n depthProgram.dispose();\n image?.dispose();\n world.remove(layer);\n };\n\n const layer = {\n render,\n dispose,\n get options() {\n return options;\n },\n set options(_: Partial<LayerOptions>) {\n options = _;\n },\n get url() {\n return url;\n },\n set url(_: string) {\n url = _;\n update();\n },\n get position() {\n return position;\n },\n set position(_: vec3) {\n position = _;\n },\n get color() {\n return color;\n },\n set color(_: vec4) {\n color = _;\n },\n get size() {\n return size;\n },\n set size(_: number) {\n size = _;\n },\n get minSizePixels() {\n return minSizePixels;\n },\n set minSizePixels(_: number | undefined) {\n minSizePixels = _;\n },\n get maxSizePixels() {\n return maxSizePixels;\n },\n set maxSizePixels(_: number | undefined) {\n maxSizePixels = _;\n },\n } satisfies BillboardLayer;\n\n world.add(layer);\n\n return layer;\n};\n\nconst createPrograms = (\n gl: WebGL2RenderingContext,\n {\n cornerBuffer,\n uvBuffer,\n indexBuffer,\n }: {\n cornerBuffer: Buffer;\n uvBuffer: Buffer;\n indexBuffer: Buffer;\n },\n) => {\n const createRenderProgram = (depth = false) => {\n const program = createProgram({\n gl,\n vertexSource,\n fragmentSource: depth ? depthSource : fragmentSource,\n });\n\n const cornerAttribute = program.attribute2f(\"corner\", cornerBuffer, {\n stride: 2 * Float32Array.BYTES_PER_ELEMENT,\n });\n const uvAttribute = program.attribute2f(\"uv\", uvBuffer, {\n stride: 2 * Float32Array.BYTES_PER_ELEMENT,\n });\n\n const projectionUniform = program.uniformMatrix4f(\"projection\");\n const modelViewUniform = program.uniformMatrix4f(\"model_view\");\n const cameraUniform = program.uniform3i(\"camera\");\n const screenUniform = program.uniform2f(\"screen\");\n const imageUniform = program.uniform1i(\"image\");\n const imageSizeUniform = program.uniform2f(\"image_size\");\n const positionUniform = program.uniform3i(\"position\");\n const colorUniform = program.uniform4f(\"color\");\n const indexUniform = program.uniform1i(\"index\");\n const sizeUniform = program.uniform1f(\"size\");\n const minSizePixelsUniform = program.uniform1f(\"min_size_pixels\");\n const maxSizePixelsUniform = program.uniform1f(\"max_size_pixels\");\n\n const execute = ({\n projection,\n modelView,\n camera,\n screen,\n image,\n imageSize,\n position,\n color,\n size,\n minSizePixels,\n maxSizePixels,\n index,\n }: {\n projection: mat4;\n modelView: mat4;\n camera: vec3;\n screen: vec2;\n image: Texture;\n imageSize: vec2;\n position: vec3;\n color: vec4;\n size: number;\n minSizePixels: number;\n maxSizePixels: number;\n index: number;\n }) => {\n program.use();\n\n cornerAttribute.use();\n uvAttribute.use();\n\n projectionUniform.set(projection);\n modelViewUniform.set(modelView);\n cameraUniform.set(camera);\n screenUniform.set(screen);\n imageSizeUniform.set(imageSize);\n positionUniform.set(position);\n colorUniform.set(color);\n sizeUniform.set(size);\n minSizePixelsUniform.set(minSizePixels);\n maxSizePixelsUniform.set(maxSizePixels);\n indexUniform.set(index);\n\n gl.activeTexture(gl.TEXTURE0);\n imageUniform.set(0);\n image.use();\n\n indexBuffer.use();\n\n gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0);\n };\n\n const { dispose } = program;\n\n return { execute, dispose };\n };\n\n const renderProgram = createRenderProgram();\n const depthProgram = createRenderProgram(true);\n\n return { renderProgram, depthProgram };\n};\n","#version 300 es\n\nprecision highp float;\n\nin vec4 color_out;\nout vec4 result;\n\nvoid main() {\n if (color_out.a == 0.f) discard;\n result = color_out;\n}","#version 300 es\n\nprecision highp float;\n\nuniform mat4 projection;\nuniform mat4 model_view;\nuniform ivec3 camera;\nuniform vec2 screen;\nuniform vec4 color;\nuniform float width;\nuniform float min_width_pixels;\nuniform float max_width_pixels;\n\nin ivec3 previous;\nin ivec3 current;\nin ivec3 next;\nin vec2 corner;\nout vec4 color_out;\n\nconst int ONE = 1073741824; // 2^30\nconst float INV_ONE = 1.f / float(ONE);\nconst float CIRCUMFERENCE = 40075017.;\n\nvec4 transform(ivec3 v) {\n return projection * model_view * vec4(vec3(v - camera) * INV_ONE, 1.f);\n}\n\nvoid main(void) {\n vec4 projected_previous = transform(previous);\n vec4 projected_current = transform(current);\n vec4 projected_next = transform(next);\n\n vec2 screen_previous = projected_previous.xy / abs(projected_previous.w) * screen;\n vec2 screen_current = projected_current.xy / abs(projected_current.w) * screen;\n vec2 screen_next = projected_next.xy / abs(projected_next.w) * screen;\n\n vec2 a = normalize(screen_current - screen_previous);\n vec2 b = normalize(screen_next - screen_current);\n if(screen_current == screen_previous)\n a = b;\n if(screen_next == screen_current)\n b = a;\n vec2 direction = normalize(a + b);\n vec2 point = normalize(a - b);\n vec2 normal = vec2(-direction.y, direction.x);\n vec2 offset;\n\n if(sign(corner.y * dot(normal, point)) > 0.0f) {\n vec2 ap = vec2(-a.y, a.x);\n vec2 bp = vec2(-b.y, b.x);\n offset = 0.5f * corner.y * (corner.x * (bp - ap) + ap + bp);\n } else {\n float distance = clamp(1.f / cos(acos(clamp(dot(a, b), -1.f, 1.f))/ 2.f), 0.f, 1.f);\n offset = normal * distance * corner.y;\n }\n\n float pixel_size = abs(projected_current.w) / screen.y;\n float scale = clamp(width / CIRCUMFERENCE * -projection[1][1], min_width_pixels * pixel_size, max_width_pixels * pixel_size) ;\n\n gl_Position = projected_current + 0.5 * vec4(scale * offset, 0.f, 0.f);\n\n color_out = color;\n}\n","import type { mat4, vec2, vec4 } from \"gl-matrix\";\nimport type { vec3 } from \"gl-matrix\";\n\nimport type { Buffer } from \"../../buffer\";\nimport { createBuffer } from \"../../buffer\";\nimport { range } from \"../../common\";\nimport { mercator } from \"../../math\";\nimport { createProgram } from \"../../program\";\nimport type { Viewport } from \"../../viewport\";\nimport type { World } from \"../../world\";\nimport type { LayerOptions } from \"../\";\nimport { type BaseLayer, type Line } from \"../\";\nimport { configure, to } from \"../common\";\nimport depthSource from \"../depth.glsl\";\nimport fragmentSource from \"./fragment.glsl\";\nimport vertexSource from \"./vertex.glsl\";\n\nexport type LineLayer = BaseLayer & Line;\n\nexport const createLineLayer = (world: World, line: Partial<Line> = {}) => {\n const { gl } = world;\n let { options, points, color, width, minWidthPixels, maxWidthPixels } = {\n options: {},\n points: [],\n color: [1, 1, 1, 1],\n width: 1,\n ...line,\n } satisfies Line;\n\n let count = 0;\n\n const positionBuffer = createBuffer({ gl, type: \"i32\", target: \"array\" });\n const indexBuffer = createBuffer({ gl, type: \"u16\", target: \"element\" });\n const cornerBuffer = createBuffer({ gl, type: \"f32\", target: \"array\" });\n\n const { renderProgram, depthProgram } = createPrograms(gl, {\n positionBuffer,\n indexBuffer,\n cornerBuffer,\n });\n\n const render = ({\n viewport: { projection, modelView, camera, screen },\n depth = false,\n index = 0,\n }: {\n viewport: Viewport;\n depth?: boolean;\n index?: number;\n }) => {\n if (configure(gl, depth, options)) return;\n const program = depth ? depthProgram : renderProgram;\n program.execute({\n projection,\n modelView,\n camera: to(camera),\n screen,\n count,\n color,\n width,\n minWidthPixels: minWidthPixels || 0,\n maxWidthPixels: maxWidthPixels || Number.MAX_VALUE,\n index,\n });\n };\n\n const updatePoints = (_: vec3[][]) => {\n points = _;\n\n const positionData = _.flatMap(_ => {\n const [first] = _;\n const [last] = _.slice(-1);\n\n if (!first || !last) return [];\n\n return [first, ..._, last]\n .map(_ => to(mercator(_)))\n .flatMap(_ => [..._, ..._, ..._, ..._]);\n });\n\n const { indexData } = _.reduce<{\n indexData: number[];\n count: number;\n }>(\n ({ indexData, count }, _) => {\n if (_.length === 0) return { indexData, count };\n const indices = range(0, (_.length - 1) * 2).flatMap(i => {\n const [a = 0, b = 0, c = 0, d = 0] = range(0, 4).map(\n _ => _ + i * 2 + count,\n );\n return [\n [a, b, d],\n [a, d, c],\n ].flat();\n });\n count += (_.length + 2) * 4;\n indexData = indexData.concat(indices);\n return { indexData, count };\n },\n { indexData: [], count: 0 },\n );\n count = indexData.length;\n\n const cornerData = _.flatMap(_ =>\n _.length === 0\n ? []\n : range(0, (_.length + 1) * 2).flatMap(() =>\n [\n [-1, -1],\n [-1, 1],\n [1, -1],\n [1, 1],\n ].flat(),\n ),\n );\n\n positionBuffer.set(positionData);\n indexBuffer.set(indexData);\n cornerBuffer.set(cornerData);\n };\n\n updatePoints(points);\n\n const dispose = () => {\n positionBuffer.dispose();\n indexBuffer.dispose();\n cornerBuffer.dispose();\n renderProgram.dispose();\n depthProgram.dispose();\n world.remove(layer);\n };\n\n const layer = {\n render,\n dispose,\n get options() {\n return options;\n },\n set options(_: Partial<LayerOptions>) {\n options = _;\n },\n get points() {\n return points;\n },\n set points(_: vec3[][]) {\n updatePoints(_);\n },\n get color() {\n return color;\n },\n set color(_: vec4) {\n color = _;\n },\n get width() {\n return width;\n },\n set width(_: number) {\n width = _;\n },\n get minWidthPixels() {\n return minWidthPixels;\n },\n set minWidthPixels(_: number | undefined) {\n minWidthPixels = _;\n },\n get maxWidthPixels() {\n return maxWidthPixels;\n },\n set maxWidthPixels(_: number | undefined) {\n maxWidthPixels = _;\n },\n } satisfies LineLayer;\n\n world.add(layer);\n\n return layer;\n};\n\nconst createPrograms = (\n gl: WebGL2RenderingContext,\n {\n positionBuffer,\n indexBuffer,\n cornerBuffer,\n }: {\n positionBuffer: Buffer;\n indexBuffer: Buffer;\n cornerBuffer: Buffer;\n },\n) => {\n const createRenderProgram = (depth = false) => {\n const program = createProgram({\n gl,\n vertexSource,\n fragmentSource: depth ? depthSource : fragmentSource,\n });\n\n const FLOAT_BYTES = Float32Array.BYTES_PER_ELEMENT;\n const INT_BYTES = Int32Array.BYTES_PER_ELEMENT;\n\n const previousAttribute = program.attribute3i(\"previous\", positionBuffer, {\n stride: INT_BYTES * 3,\n });\n const currentAttribute = program.attribute3i(\"current\", positionBuffer, {\n stride: INT_BYTES * 3,\n offset: INT_BYTES * 3 * 4,\n });\n const nextAttribute = program.attribute3i(\"next\", positionBuffer, {\n stride: INT_BYTES * 3,\n offset: INT_BYTES * 3 * 4 * 2,\n });\n const cornerAttribute = program.attribute2f(\"corner\", cornerBuffer, {\n stride: FLOAT_BYTES * 2,\n });\n\n const projectionUniform = program.uniformMatrix4f(\"projection\");\n const modelViewUniform = program.uniformMatrix4f(\"model_view\");\n const cameraUniform = program.uniform3i(\"camera\");\n const screenUniform = program.uniform2f(\"screen\");\n const colorUniform = program.uniform4f(\"color\");\n const widthUniform = program.uniform1f(\"width\");\n const maxWidthPixelsUniform = program.uniform1f(\"max_width_pixels\");\n const minWidthPixelsUniform = program.uniform1f(\"min_width_pixels\");\n const indexUniform = program.uniform1i(\"index\");\n\n const execute = ({\n projection,\n modelView,\n camera,\n screen,\n count,\n color,\n width,\n minWidthPixels,\n maxWidthPixels,\n index,\n }: {\n projection: mat4;\n modelView: mat4;\n camera: vec3;\n screen: vec2;\n count: number;\n color: vec4;\n width: number;\n minWidthPixels: number;\n maxWidthPixels: number;\n index: number;\n }) => {\n if (count === 0) return;\n\n program.use();\n\n previousAttribute.use();\n currentAttribute.use();\n nextAttribute.use();\n cornerAttribute.use();\n\n projectionUniform.set(projection);\n modelViewUniform.set(modelView);\n cameraUniform.set(camera);\n screenUniform.set(screen);\n colorUniform.set(color);\n widthUniform.set(width);\n minWidthPixelsUniform.set(minWidthPixels);\n maxWidthPixelsUniform.set(maxWidthPixels);\n indexUniform.set(index);\n\n indexBuffer.use();\n\n gl.drawElements(gl.TRIANGLES, count, gl.UNSIGNED_SHORT, 0);\n };\n\n const { dispose } = program;\n\n return { execute, dispose };\n };\n\n const renderProgram = createRenderProgram();\n const depthProgram = createRenderProgram(true);\n\n return { renderProgram, depthProgram };\n};\n","#version 300 es\n\nprecision highp float;\n\nin vec4 color_out;\nout vec4 result;\n\nvoid main() {\n result = color_out;\n}","#version 300 es\n\nprecision highp float;\n\nuniform mat4 projection;\nuniform mat4 model_view;\nuniform ivec3 camera;\nuniform vec2 screen;\nuniform ivec3 position;\nuniform mat4 orientation;\nuniform vec4 color;\nuniform float size;\nuniform float min_size_pixels;\nuniform float max_size_pixels;\n\nin vec3 vertex;\nout vec4 color_out;\n\nconst int ONE = 1073741824; // 2^30\nconst float INV_ONE = 1.f / float(ONE);\nconst float CIRCUMFERENCE = 40075017.;\n\nvec4 transform(vec3 v) {\n return projection * model_view * vec4(vec3(position - camera) * INV_ONE + v, 1.f);\n}\n\nvoid main(void) {\n vec4 projected = transform(vec3(0.f, 0.f, 0.f));\n float pixel_size = projected.w / screen.y / -projection[1][1];\n float scale = clamp(size / CIRCUMFERENCE, min_size_pixels * pixel_size, max_size_pixels * pixel_size);\n\n vec4 q = orientation * vec4(vertex * scale, 1.f);\n gl_Position = transform(q.xyz / q.w);\n\n color_out = color;\n}\n","import type { quat, vec2, vec3, vec4 } from \"gl-matrix\";\nimport { mat4 } from \"gl-matrix\";\n\nimport type { Buffer } from \"../../buffer\";\nimport { createBuffer } from \"../../buffer\";\nimport { type Mesh } from \"../../layers\";\nimport { mercator } from \"../../math\";\nimport { createProgram } from \"../../program\";\nimport type { Viewport } from \"../../viewport\";\nimport type { World } from \"../../world\";\nimport type { BaseLayer, LayerOptions } from \"..\";\nimport { configure, to } from \"../common\";\nimport depthSource from \"../depth.glsl\";\nimport fragmentSource from \"./fragment.glsl\";\nimport vertexSource from \"./vertex.glsl\";\n\nexport type MeshLayer = BaseLayer & Mesh;\n\nexport const createMeshLayer = (world: World, mesh: Partial<Mesh> = {}) => {\n const { gl } = world;\n let {\n options,\n vertices,\n indices,\n position,\n orientation,\n color,\n size,\n minSizePixels,\n maxSizePixels,\n } = {\n options: {},\n vertices: [],\n indices: [],\n position: [0, 0, 0],\n orientation: [0, 0, 0, 1],\n color: [1, 1, 1, 1],\n size: 1,\n ...mesh,\n } satisfies Mesh;\n let count = 0;\n\n const vertexBuffer = createBuffer({ gl, type: \"f32\", target: \"array\" });\n const indexBuffer = createBuffer({ gl, type: \"u16\", target: \"element\" });\n\n const { renderProgram, depthProgram } = createPrograms(gl, {\n vertexBuffer,\n indexBuffer,\n });\n\n const render = ({\n viewport: { projection, modelView, camera, screen },\n depth = false,\n index = 0,\n }: {\n viewport: Viewport;\n depth?: boolean;\n index?: number;\n }) => {\n if (configure(gl, depth, options)) return;\n\n const program = depth ? depthProgram : renderProgram;\n program.execute({\n projection,\n modelView,\n camera: to(camera),\n screen,\n count,\n position: to(mercator(position)),\n orientation: mat4.fromQuat(mat4.create(), orientation),\n color,\n size,\n minSizePixels: minSizePixels || 0,\n maxSizePixels: maxSizePixels || Number.MAX_VALUE,\n index,\n });\n };\n\n const updateVertices = (_: vec3[]) => {\n vertices = _;\n vertexBuffer.set(_.flatMap(_ => [..._]));\n };\n\n const updateIndices = (_: vec3[]) => {\n indices = _;\n indexBuffer.set(_.flatMap(_ => [..._]));\n count = _.length * 3;\n };\n\n updateVertices(vertices);\n updateIndices(indices);\n\n const dispose = () => {\n vertexBuffer.dispose();\n indexBuffer.dispose();\n renderProgram.dispose();\n depthProgram.dispose();\n world.remove(layer);\n };\n\n const layer = {\n render,\n dispose,\n get options() {\n return options;\n },\n set options(_: Partial<LayerOptions>) {\n options = _;\n },\n get vertices() {\n return vertices;\n },\n set vertices(_: vec3[]) {\n updateVertices(_);\n },\n get indices() {\n return indices;\n },\n set indices(_: vec3[]) {\n updateIndices(_);\n },\n get position() {\n return position;\n },\n set position(_: vec3) {\n position = _;\n },\n get orientation() {\n return orientation;\n },\n set orientation(_: quat) {\n orientation = _;\n },\n get color() {\n return color;\n },\n set color(_: vec4) {\n color = _;\n },\n get size() {\n return size;\n },\n set size(_: number) {\n size = _;\n },\n get minSizePixels() {\n return minSizePixels;\n },\n set minSizePixels(_: number | undefined) {\n minSizePixels = _;\n },\n get maxSizePixels() {\n return maxSizePixels;\n },\n set maxSizePixels(_: number | undefined) {\n maxSizePixels = _;\n },\n } satisfies MeshLayer;\n\n world.add(layer);\n\n return layer;\n};\n\nconst createPrograms = (\n gl: WebGL2RenderingContext,\n {\n vertexBuffer,\n indexBuffer,\n }: {\n vertexBuffer: Buffer;\n indexBuffer: Buffer;\n },\n) => {\n const createRenderProgram = (depth = false) => {\n const program = createProgram({\n gl,\n vertexSource,\n fragmentSource: depth ? depthSource : fragmentSource,\n });\n\n const vertexAttribute = program.attribute3f(\"vertex\", vertexBuffer);\n\n const projectionUniform = program.uniformMatrix4f(\"projection\");\n const modelViewUniform = program.uniformMatrix4f(\"model_view\");\n const cameraUniform = program.uniform3i(\"camera\");\n const positionUniform = program.uniform3i(\"position\");\n const orientationUniform = program.uniformMatrix4f(\"orientation\");\n const screenUniform = program.uniform2f(\"screen\");\n const colorUniform = program.uniform4f(\"color\");\n const sizeUniform = program.uniform1f(\"size\");\n const minSizePixelsUniform = program.uniform1f(\"min_size_pixels\");\n const maxSizePixelsUniform = program.uniform1f(\"max_size_pixels\");\n const indexUniform = program.uniform1i(\"index\");\n\n const execute = ({\n projection,\n modelView,\n camera,\n screen,\n count,\n position,\n orientation,\n color,\n size,\n minSizePixels,\n maxSizePixels,\n index,\n }: {\n projection: mat4;\n modelView: mat4;\n camera: vec3;\n screen: vec2;\n count: number;\n position: vec3;\n orientation: mat4;\n color: vec4;\n size: number;\n minSizePixels: number;\n maxSizePixels: number;\n index: number;\n }) => {\n program.use();\n\n vertexAttribute.use();\n\n projectionUniform.set(projection);\n modelViewUniform.set(modelView);\n cameraUniform.set(camera);\n screenUniform.set(screen);\n positionUniform.set(position);\n orientationUniform.set(orientation);\n colorUniform.set(color);\n sizeUniform.set(size);\n minSizePixelsUniform.set(minSizePixels);\n maxSizePixelsUniform.set(maxSizePixels);\n indexUniform.set(index);\n\n indexBuffer.use();\n\n gl.drawElements(gl.TRIANGLES, count, gl.UNSIGNED_SHORT, 0);\n };\n\n const { dispose } = program;\n\n return { execute, dispose };\n };\n\n const renderProgram = createRenderProgram();\n const depthProgram = createRenderProgram(true);\n\n return { renderProgram, depthProgram };\n};\n","var L=function(F,J,G,U,K){let Q,W=null;if(K===m(F,J,G,U)>0)for(Q=J;Q<G;Q+=U)W=new O(Q,F[Q],F[Q+1],W);else for(Q=G-U;Q>=J;Q-=U)W=new O(Q,F[Q],F[Q+1],W);if(W!==null&&P(W,W.next))f(W),W=W.next;return W},R=function(F,J){if(J===void 0)J=F;let G=F,U;do if(U=!1,!G.steiner&&(P(G,G.next)||C(G.prev,G,G.next)===0)){if(f(G),G=J=G.prev,G===G.next)break;U=!0}else G=G.next;while(U||G!==J);return J},M=function(F,J,G,U,K,Q,W){if(F===null)return;if(W===0&&Q!==0)q(F,U,K,Q);let Z=F,j,A;while(F.prev!==F.next){if(j=F.prev,A=F.next,Q!==0?N(F,U,K,Q):h(F)){J.push(j.i/G),J.push(F.i/G),J.push(A.i/G),f(F),F=A.next,Z=A.next;continue}if(F=A,F===Z){if(W===0)M(R(F),J,G,U,K,Q,1);else if(W===1)F=v(R(F),J,G),M(F,J,G,U,K,Q,2);else if(W===2)z(F,J,G,U,K,Q);break}}},h=function(F){const J=F.prev,G=F,U=F.next;if(C(J,G,U)>=0)return!1;let K=F.next.next;while(K!==F.prev){if(E(J.x,J.y,G.x,G.y,U.x,U.y,K.x,K.y)&&C(K.prev,K,K.next)>=0)return!1;K=K.next}return!0},N=function(F,J,G,U){const K=F.prev,Q=F,W=F.next;if(C(K,Q,W)>=0)return!1;const Z=K.x<Q.x?K.x<W.x?K.x:W.x:Q.x<W.x?Q.x:W.x,j=K.y<Q.y?K.y<W.y?K.y:W.y:Q.y<W.y?Q.y:W.y,A=K.x>Q.x?K.x>W.x?K.x:W.x:Q.x>W.x?Q.x:W.x,w=K.y>Q.y?K.y>W.y?K.y:W.y:Q.y>W.y?Q.y:W.y,D=T(Z,j,J,G,U),V=T(A,w,J,G,U);let{prevZ:_,nextZ:$}=F;while(_!==null&&$!==null&&_.z>=D&&$.z<=V){if(_!==F.prev&&_!==F.next&&E(K.x,K.y,Q.x,Q.y,W.x,W.y,_.x,_.y)&&C(_.prev,_,_.next)>=0)return!1;if(_=_.prevZ,$!==F.prev&&$!==F.next&&E(K.x,K.y,Q.x,Q.y,W.x,W.y,$.x,$.y)&&C($.prev,$,$.next)>=0)return!1;$=$.nextZ}while(_!==null&&_.z>=D){if(_!==F.prev&&_!==F.next&&E(K.x,K.y,Q.x,Q.y,W.x,W.y,_.x,_.y)&&C(_.prev,_,_.next)>=0)return!1;_=_.prevZ}while($!==null&&$.z<=V){if($!==F.prev&&$!==F.next&&E(K.x,K.y,Q.x,Q.y,W.x,W.y,$.x,$.y)&&C($.prev,$,$.next)>=0)return!1;$=$.nextZ}return!0},v=function(F,J,G){let U=F;do{const K=U.prev,Q=U.next.next;if(!P(K,Q)&&I(K,U,U.next,Q)&&H(K,Q)&&H(Q,K))J.push(K.i/G),J.push(U.i/G),J.push(Q.i/G),f(U),f(U.next),U=F=Q;U=U.next}while(U!==F);return U},z=function(F,J,G,U,K,Q){let W=F;do{let Z=W.next.next;while(Z!==W.prev){if(W.i!==Z.i&&b(W,Z)){let j=Y(W,Z);W=R(W,W.next),j=R(j,j.next),M(W,J,G,U,K,Q,0),M(j,J,G,U,K,Q,0);return}Z=Z.next}W=W.next}while(W!==F)},S=function(F,J,G,U){const K=[];let Q,W,Z,j,A;for(Q=0,W=J.length;Q<W;Q++){if(Z=J[Q]*U,j=Q<W-1?J[Q+1]*U:F.length,A=L(F,Z,j,U,!1),A===A.next)A.steiner=!0;K.push(x(A))}K.sort(u);for(Q=0;Q<K.length;Q++)G=g(K[Q],G),G=R(G,G.next);return G},u=function(F,J){return F.x-J.x},g=function(F,J){const G=c(F,J);if(G===null)return J;else{const U=Y(G,F),K=R(G,G.next);return R(U,U.next),J===G?K:J}},c=function(F,J){let G=J;const{x:U,y:K}=F;let Q=(-Infinity),W;do{if(K<=G.y&&K>=G.next.y&&G.next.y!==G.y){const V=G.x+(K-G.y)*(G.next.x-G.x)/(G.next.y-G.y);if(V<=U&&V>Q){if(Q=V,V===U){if(K===G.y)return G;if(K===G.next.y)return G.next}W=G.x<G.next.x?G:G.next}}G=G.next}while(G!==J);if(W===void 0)return null;if(U===Q)return W;const Z=W,j=W.x,A=W.y;let w=Infinity,D;G=W;do{if(U>=G.x&&G.x>=j&&U!==G.x&&E(K<A?U:Q,K,j,A,K<A?Q:U,K,G.x,G.y)){if(D=Math.abs(K-G.y)/(U-G.x),H(G,F)&&(D<w||D===w&&(G.x>W.x||G.x===W.x&&C(W.prev,W,G.prev)<0&&C(G.next,W,W.next)<0)))W=G,w=D}G=G.next}while(G!==Z);return W},q=function(F,J,G,U){let K=F;do{if(K.z===void 0)K.z=T(K.x,K.y,J,G,U);K.prevZ=K.prev,K.nextZ=K.next,K=K.next}while(K!==F);if(K.prevZ!==null)K.prevZ.nextZ=null;K.prevZ=null,y(K)},y=function(F){let J,G,U,K,Q,W,Z,j,A=1;do{G=F,F=null,Q=null,W=0;while(G!==null){W++,U=G,Z=0;for(J=0;J<A;J++)if(Z++,U=U.nextZ,U===null)break;j=A;while(Z>0||j>0&&U!==null){if(Z!==0&&(j===0||U===null||G===null||G.z<=U.z))K=G,G=G?.nextZ??null,Z--;else K=U,U=U?.nextZ??null,j--;if(Q!==null)Q.nextZ=K;else F=K;if(K!==null)K.prevZ=Q;Q=K}G=U}if(Q!==null)Q.nextZ=null;A*=2}while(W>1);return F},T=function(F,J,G,U,K){return F=32767*(F-G)*K,J=32767*(J-U)*K,F=(F|F<<8)&16711935,F=(F|F<<4)&252645135,F=(F|F<<2)&858993459,F=(F|F<<1)&1431655765,J=(J|J<<8)&16711935,J=(J|J<<4)&252645135,J=(J|J<<2)&858993459,J=(J|J<<1)&1431655765,F|J<<1},x=function(F){let J=F,G=F;do{if(J.x<G.x||J.x===G.x&&J.y<G.y)G=J;J=J.next}while(J!==F);return G},E=function(F,J,G,U,K,Q,W,Z){return(K-W)*(J-Z)-(F-W)*(Q-Z)>=0&&(F-W)*(U-Z)-(G-W)*(J-Z)>=0&&(G-W)*(Q-Z)-(K-W)*(U-Z)>=0},b=function(F,J){return F.next.i!==J.i&&F.prev.i!==J.i&&!l(F,J)&&(H(F,J)&&H(J,F)&&o(F,J)&&(C(F.prev,F,J.prev)!==0||C(F,J.prev,J)!==0)||P(F,J)&&C(F.prev,F,F.next)>0&&C(J.prev,J,J.next)>0)},C=function(F,J,G){return(J.y-F.y)*(G.x-J.x)-(J.x-F.x)*(G.y-J.y)},P=function(F,J){return F.x===J.x&&F.y===J.y},I=function(F,J,G,U){const K=k(C(F,J,G)),Q=k(C(F,J,U)),W=k(C(G,U,F)),Z=k(C(G,U,J));if(K!==Q&&W!==Z)return!0;if(K===0&&B(F,G,J))return!0;if(Q===0&&B(F,U,J))return!0;if(W===0&&B(G,F,U))return!0;if(Z===0&&B(G,J,U))return!0;return!1},k=function(F){return F>0?1:F<0?-1:0},B=function(F,J,G){return J.x<=Math.max(F.x,G.x)&&J.x>=Math.min(F.x,G.x)&&J.y<=Math.max(F.y,G.y)&&J.y>=Math.min(F.y,G.y)},l=function(F,J){let G=F;do{if(G.i!==F.i&&G.next?.i!==F.i&&G.i!==J.i&&G.next?.i!==J.i&&I(G,G.next,F,J))return!0;G=G.next}while(G!==F);return!1},H=function(F,J){return C(F.prev,F,F.next)<0?C(F,J,F.next)>=0&&C(F,F.prev,J)>=0:C(F,J,F.prev)<0||C(F,F.next,J)<0},o=function(F,J){const G=(F.x+J.x)/2,U=(F.y+J.y)/2;let K=F,Q=!1;do{if(K.y>U!==K.next.y>U&&K.next.y!==K.y&&G<(K.next.x-K.x)*(U-K.y)/(K.next.y-K.y)+K.x)Q=!Q;K=K.next}while(K!==F);return Q},Y=function(F,J){const G=new O(F.i,F.x,F.y),U=new O(J.i,J.x,J.y),K=F.next,Q=J.prev;return F.next=J,J.prev=F,G.next=K,K.prev=G,U.next=G,G.prev=U,Q.next=U,U.prev=Q,U},f=function(F){if(F.next.prev=F.prev,F.prev.next=F.next,F.prevZ!==null)F.prevZ.nextZ=F.nextZ;if(F.nextZ!==null)F.nextZ.prevZ=F.prevZ},m=function(F,J,G,U){let K=0;for(let Q=J,W=G-U;Q<G;Q+=U)K+=(F[W]-F[Q])*(F[Q+1]+F[W+1]),W=Q;return K};class O{i;x;y;prev;next;z;prevZ=null;nextZ=null;steiner=!1;constructor(F,J,G,U=null){if(this.i=F,this.x=J,this.y=G,U===null)this.prev=this,this.next=this;else this.next=U.next,this.prev=U,U.next.prev=this,U.next=this}}function X(F,J=[],G=2){const U=J.length>0,K=U?J[0]*G:F.length;let Q=L(F,0,K,G,!0);const W=[];if(Q===null||Q.next===Q.prev)return W;let Z=Infinity,j=Infinity,A=(-Infinity),w=(-Infinity),D=0,V,_;if(U)Q=S(F,J,Q,G);if(F.length>80*G){Z=A=F[0],j=w=F[1];for(let $=G;$<K;$+=G){if(V=F[$],_=F[$+1],V<Z)Z=V;if(_<j)j=_;if(V>A)A=V;if(_>w)w=_}D=Math.max(A-Z,w-j),D=D!==0?1/D:0}return M(Q,W,G,Z,j,D,0),W}export{X as default};\nexport{X as a};\n\n//# debugId=F7DDCD3C6579060364756e2164756e21\n","import{a as Z} from\"./earcut.js\";function B(F,q=Infinity,O=0){const{vertices:K,holeIndices:Q,dim:E}=D(F),M=Z(K,Q,E);if(q!==Infinity)_(K,M,q,E);return{vertices:K,indices:M.map((G)=>G+O)}}function _(F,q,O,K){let Q,E,M;for(let G=0;G<K;G++)for(let b=0;b<q.length;b+=3){Q=q[b],E=q[b+1],M=q[b+2];const k=$(Q,E,M,F,q,K,G,O);if(k!==void 0)q[b]=k[0],q[b+1]=k[1],q[b+2]=k[2],b-=3}}var $=function(F,q,O,K,Q,E,M,G){const b=K[F*E+M],k=K[q*E+M],z=K[O*E+M];if(b<k&&b<z){const J=b+G-U(b,G);if(J>b&&J<=k&&J<=z&&(k!==J||k!==J))return W(J,F,q,O,b,k,z,K,Q,E,M,G)}else if(b>k&&b>z){let J=U(b,G);if(J===0)J=G;const w=b-J;if(w<b&&w>=k&&w>=z&&(k!==w||k!==w))return X(w,F,q,O,b,k,z,K,Q,E,M,G)}if(k<b&&k<z){const J=k+G-U(k,G);if(J>k&&J<=z&&J<=b&&(b!==J||z!==J))return W(J,q,O,F,k,z,b,K,Q,E,M,G)}else if(k>b&&k>z){let J=U(k,G);if(J===0)J=G;const w=k-J;if(w<k&&w>=z&&w>=b&&(b!==w||z!==w))return X(w,q,O,F,k,z,b,K,Q,E,M,G)}if(z<b&&z<k){const J=z+G-U(z,G);if(J>z&&J<=b&&J<=k&&(b!==J||k!==J))return W(J,O,F,q,z,b,k,K,Q,E,M,G)}else if(z>b&&z>k){let J=U(z,G);if(J===0)J=G;const w=z-J;if(w<z&&w>=b&&w>=k&&(b!==w||k!==w))return X(w,O,F,q,z,b,k,K,Q,E,M,G)}},T=function(F,q,O,K,Q,E,M,G){const b=E.length/M,k=(Q-K)/(F-K);let z,J;for(let w=0;w<M;w++)if(z=E[q*M+w],J=E[O*M+w],w!==G)E.push(z+(J-z)/k);else E.push(F);return b},W=function(F,q,O,K,Q,E,M,G,b,k,z,J){let w=T(F,q,O,Q,E,G,k,z),S=T(F,q,K,Q,M,G,k,z);if(b.push(q,w,S),F+=J,E<M){while(F<E)b.push(S,w),S=T(F,q,K,Q,M,G,k,z),b.push(S,S,w),w=T(F,q,O,Q,E,G,k,z),b.push(w),F+=J;return b.push(S,w,O),[S,O,K]}else{while(F<M)b.push(S,w),S=T(F,q,K,Q,M,G,k,z),b.push(S,S,w),w=T(F,q,O,Q,E,G,k,z),b.push(w),F+=J;return b.push(S,w,K),[K,w,O]}},X=function(F,q,O,K,Q,E,M,G,b,k,z,J){let w=T(F,q,O,Q,E,G,k,z),S=T(F,q,K,Q,M,G,k,z);if(b.push(q,w,S),F-=J,E>M){while(F>E)b.push(S,w),S=T(F,q,K,Q,M,G,k,z),b.push(S,S,w),w=T(F,q,O,Q,E,G,k,z),b.push(w),F-=J;return b.push(S,w,O),[S,O,K]}else{while(F>M)b.push(S,w),S=T(F,q,K,Q,M,G,k,z),b.push(S,S,w),w=T(F,q,O,Q,E,G,k,z),b.push(w),F-=J;return b.push(S,w,K),[K,w,O]}},U=function(F,q){return(F%q+q)%q};function D(F){let q=0;const O=F[0][0].length,K=[],Q=[];for(let E=0,M=F.length;E<M;E++){for(let G=0,b=F[E].length;G<b;G++)for(let k=0;k<O;k++)K.push(F[E][G][k]);if(E>0)q+=F[E-1].length,Q.push(q)}return{vertices:K,holeIndices:Q,dim:O}}function C(F,q=[],O=2,K=[]){const Q=q.length>0,E=Q?q[0]*O:F.length;let M=Math.abs(Y(F,0,E,O));if(Q)for(let b=0,k=q.length;b<k;b++){const z=q[b]*O,J=b<k-1?q[b+1]*O:F.length;M-=Math.abs(Y(F,z,J,O))}let G=0;for(let b=0;b<K.length;b+=3){const k=K[b]*O,z=K[b+1]*O,J=K[b+2]*O;G+=Math.abs((F[k]-F[J])*(F[z+1]-F[k+1])-(F[k]-F[z])*(F[J+1]-F[k+1]))}return M===0&&G===0?0:Math.abs((G-M)/M)}var Y=function(F,q,O,K){let Q=0;for(let E=q,M=O-K;E<O;E+=K)Q+=(F[M]-F[E])*(F[E+1]+F[M+1]),M=E;return Q};export{_ as tesselate,D as flatten,B as earclip,C as deviation};\n\n//# debugId=279130DA8E8F83BD64756e2164756e21\n","#version 300 es\n\nprecision highp float;\n\nin vec4 color_out;\nout vec4 result;\n\nvoid main() {\n result = color_out;\n}","#version 300 es\n\nprecision highp float;\n\nuniform mat4 projection;\nuniform mat4 model_view;\nuniform ivec3 camera;\nuniform vec2 screen;\nuniform vec4 color;\n\nin ivec3 position;\nout vec4 color_out;\n\nconst int ONE = 1073741824; // 2^30\nconst float INV_ONE = 1.f / float(ONE);\n\nvec4 transform(ivec3 v) {\n return projection * model_view * vec4(vec3(v - camera) * INV_ONE, 1.f);\n}\n\nvoid main(void) {\n gl_Position = transform(position);\n color_out = color;\n}\n","import { earclip } from \"earclip\";\nimport type { mat4, vec2, vec4 } from \"gl-matrix\";\nimport type { vec3 } from \"gl-matrix\";\n\nimport type { Buffer } from \"../../buffer\";\nimport { createBuffer } from \"../../buffer\";\nimport { mercator } from \"../../math\";\nimport { createProgram } from \"../../program\";\nimport type { Viewport } from \"../../viewport\";\nimport type { World } from \"../../world\";\nimport type { LayerOptions } from \"..\";\nimport { type BaseLayer, type Polygon } from \"..\";\nimport { configure, to } from \"../common\";\nimport depthSource from \"../depth.glsl\";\nimport fragmentSource from \"./fragment.glsl\";\nimport vertexSource from \"./vertex.glsl\";\n\nexport type PolygonLayer = BaseLayer & Polygon;\n\nexport const createPolygonLayer = (\n world: World,\n polygon: Partial<Polygon> = {},\n) => {\n const { gl } = world;\n let { options, points, color } = {\n options: {},\n points: [],\n color: [1, 1, 1, 1],\n ...polygon,\n } satisfies Polygon;\n\n let count = 0;\n\n const positionBuffer = createBuffer({ gl, type: \"i32\", target: \"array\" });\n const indexBuffer = createBuffer({ gl, type: \"u16\", target: \"element\" });\n\n const { renderProgram, depthProgram } = createPrograms(gl, {\n positionBuffer,\n indexBuffer,\n });\n\n const render = ({\n viewport: { projection, modelView, camera, screen },\n depth = false,\n index = 0,\n }: {\n viewport: Viewport;\n depth?: boolean;\n index?: number;\n }) => {\n if (configure(gl, depth, options)) return;\n const program = depth ? depthProgram : renderProgram;\n program.execute({\n projection,\n modelView,\n camera: to(camera),\n screen,\n count,\n color,\n index,\n });\n };\n\n const updatePoints = (_: vec3[][]) => {\n points = _;\n const { vertices, indices } = earclip(\n _.map(_ => _.map(_ => [...to(mercator(_))])),\n );\n positionBuffer.set(vertices);\n indexBuffer.set(indices);\n count = indices.length;\n };\n\n updatePoints(points);\n\n const dispose = () => {\n positionBuffer.dispose();\n indexBuffer.dispose();\n renderProgram.dispose();\n depthProgram.dispose();\n world.remove(layer);\n };\n\n const layer = {\n render,\n dispose,\n get options() {\n return options;\n },\n set options(_: Partial<LayerOptions>) {\n options = _;\n },\n get points() {\n return points;\n },\n set points(_: vec3[][]) {\n updatePoints(_);\n },\n get color() {\n return color;\n },\n set color(_: vec4) {\n color = _;\n },\n } satisfies PolygonLayer;\n\n world.add(layer);\n\n return layer;\n};\n\nconst createPrograms = (\n gl: WebGL2RenderingContext,\n {\n positionBuffer,\n indexBuffer,\n }: {\n positionBuffer: Buffer;\n indexBuffer: Buffer;\n },\n) => {\n const createRenderProgram = (depth = false) => {\n const program = createProgram({\n gl,\n vertexSource,\n fragmentSource: depth ? depthSource : fragmentSource,\n });\n\n const positionAttribute = program.attribute3i(\"position\", positionBuffer, {\n stride: 3 * Int32Array.BYTES_PER_ELEMENT,\n });\n\n const projectionUniform = program.uniformMatrix4f(\"projection\");\n const modelViewUniform = program.uniformMatrix4f(\"model_view\");\n const cameraUniform = program.uniform3i(\"camera\");\n const screenUniform = program.uniform2f(\"screen\");\n const colorUniform = program.uniform4f(\"color\");\n const indexUniform = program.uniform1i(\"index\");\n\n const execute = ({\n projection,\n modelView,\n camera,\n screen,\n count,\n color,\n index,\n }: {\n projection: mat4;\n modelView: mat4;\n camera: vec3;\n screen: vec2;\n count: number;\n color: vec4;\n index: number;\n }) => {\n if (count === 0) return;\n\n program.use();\n\n positionAttribute.use();\n\n projectionUniform.set(projection);\n modelViewUniform.set(modelView);\n cameraUniform.set(camera);\n screenUniform.set(screen);\n colorUniform.set(color);\n indexUniform.set(index);\n\n indexBuffer.use();\n\n gl.drawElements(gl.TRIANGLES, count, gl.UNSIGNED_SHORT, 0);\n };\n\n const { dispose } = program;\n\n return { execute, dispose };\n };\n\n const renderProgram = createRenderProgram();\n const depthProgram = createRenderProgram(true);\n\n return { renderProgram, depthProgram };\n};\n","import type { vec3 } from \"gl-matrix\";\n\nimport type { Texture } from \"./texture\";\nimport type { TileCache } from \"./tile-cache\";\n\nexport type DownsampledTile = {\n texture: Texture;\n downsample: number;\n};\n\nexport type TileDownsampler = {\n get: (xyz: vec3) => DownsampledTile | undefined;\n};\n\nexport const createTileDownsampler = (\n cache: TileCache,\n initialDownsample = 0,\n) =>\n ({\n get: ([x = 0, y = 0, z = 0]) => {\n for (\n let downsample = Math.min(z, initialDownsample);\n downsample <= z;\n downsample++\n ) {\n const k = 2 ** downsample;\n const xyz: vec3 = [\n Math.floor(x / k),\n Math.floor(y / k),\n z - downsample,\n ];\n const texture = cache.get(xyz);\n if (texture) return { texture, downsample };\n }\n },\n }) satisfies TileDownsampler;\n","/**\n * @module LRUCache\n */\nconst perf = typeof performance === 'object' &&\n performance &&\n typeof performance.now === 'function'\n ? performance\n : Date;\nconst warned = new Set();\n/* c8 ignore start */\nconst PROCESS = (typeof process === 'object' && !!process ? process : {});\n/* c8 ignore start */\nconst emitWarning = (msg, type, code, fn) => {\n typeof PROCESS.emitWarning === 'function'\n ? PROCESS.emitWarning(msg, type, code, fn)\n : console.error(`[${code}] ${type}: ${msg}`);\n};\nlet AC = globalThis.AbortController;\nlet AS = globalThis.AbortSignal;\n/* c8 ignore start */\nif (typeof AC === 'undefined') {\n //@ts-ignore\n AS = class AbortSignal {\n onabort;\n _onabort = [];\n reason;\n aborted = false;\n addEventListener(_, fn) {\n this._onabort.push(fn);\n }\n };\n //@ts-ignore\n AC = class AbortController {\n constructor() {\n warnACPolyfill();\n }\n signal = new AS();\n abort(reason) {\n if (this.signal.aborted)\n return;\n //@ts-ignore\n this.signal.reason = reason;\n //@ts-ignore\n this.signal.aborted = true;\n //@ts-ignore\n for (const fn of this.signal._onabort) {\n fn(reason);\n }\n this.signal.onabort?.(reason);\n }\n };\n let printACPolyfillWarning = PROCESS.env?.LRU_CACHE_IGNORE_AC_WARNING !== '1';\n const warnACPolyfill = () => {\n if (!printACPolyfillWarning)\n return;\n printACPolyfillWarning = false;\n emitWarning('AbortController is not defined. If using lru-cache in ' +\n 'node 14, load an AbortController polyfill from the ' +\n '`node-abort-controller` package. A minimal polyfill is ' +\n 'provided for use by LRUCache.fetch(), but it should not be ' +\n 'relied upon in other contexts (eg, passing it to other APIs that ' +\n 'use AbortController/AbortSignal might have undesirable effects). ' +\n 'You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.', 'NO_ABORT_CONTROLLER', 'ENOTSUP', warnACPolyfill);\n };\n}\n/* c8 ignore stop */\nconst shouldWarn = (code) => !warned.has(code);\nconst TYPE = Symbol('type');\nconst isPosInt = (n) => n && n === Math.floor(n) && n > 0 && isFinite(n);\n/* c8 ignore start */\n// This is a little bit ridiculous, tbh.\n// The maximum array length is 2^32-1 or thereabouts on most JS impls.\n// And well before that point, you're caching the entire world, I mean,\n// that's ~32GB of just integers for the next/prev links, plus whatever\n// else to hold that many keys and values. Just filling the memory with\n// zeroes at init time is brutal when you get that big.\n// But why not be complete?\n// Maybe in the future, these limits will have expanded.\nconst getUintArray = (max) => !isPosInt(max)\n ? null\n : max <= Math.pow(2, 8)\n ? Uint8Array\n : max <= Math.pow(2, 16)\n ? Uint16Array\n : max <= Math.pow(2, 32)\n ? Uint32Array\n : max <= Number.MAX_SAFE_INTEGER\n ? ZeroArray\n : null;\n/* c8 ignore stop */\nclass ZeroArray extends Array {\n constructor(size) {\n super(size);\n this.fill(0);\n }\n}\nclass Stack {\n heap;\n length;\n // private constructor\n static #constructing = false;\n static create(max) {\n const HeapCls = getUintArray(max);\n if (!HeapCls)\n return [];\n Stack.#constructing = true;\n const s = new Stack(max, HeapCls);\n Stack.#constructing = false;\n return s;\n }\n constructor(max, HeapCls) {\n /* c8 ignore start */\n if (!Stack.#constructing) {\n throw new TypeError('instantiate Stack using Stack.create(n)');\n }\n /* c8 ignore stop */\n this.heap = new HeapCls(max);\n this.length = 0;\n }\n push(n) {\n this.heap[this.length++] = n;\n }\n pop() {\n return this.heap[--this.length];\n }\n}\n/**\n * Default export, the thing you're using this module to get.\n *\n * All properties from the options object (with the exception of\n * {@link OptionsBase.max} and {@link OptionsBase.maxSize}) are added as\n * normal public members. (`max` and `maxBase` are read-only getters.)\n * Changing any of these will alter the defaults for subsequent method calls,\n * but is otherwise safe.\n */\nexport class LRUCache {\n // properties coming in from the options of these, only max and maxSize\n // really *need* to be protected. The rest can be modified, as they just\n // set defaults for various methods.\n #max;\n #maxSize;\n #dispose;\n #disposeAfter;\n #fetchMethod;\n /**\n * {@link LRUCache.OptionsBase.ttl}\n */\n ttl;\n /**\n * {@link LRUCache.OptionsBase.ttlResolution}\n */\n ttlResolution;\n /**\n * {@link LRUCache.OptionsBase.ttlAutopurge}\n */\n ttlAutopurge;\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnGet}\n */\n updateAgeOnGet;\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnHas}\n */\n updateAgeOnHas;\n /**\n * {@link LRUCache.OptionsBase.allowStale}\n */\n allowStale;\n /**\n * {@link LRUCache.OptionsBase.noDisposeOnSet}\n */\n noDisposeOnSet;\n /**\n * {@link LRUCache.OptionsBase.noUpdateTTL}\n */\n noUpdateTTL;\n /**\n * {@link LRUCache.OptionsBase.maxEntrySize}\n */\n maxEntrySize;\n /**\n * {@link LRUCache.OptionsBase.sizeCalculation}\n */\n sizeCalculation;\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection}\n */\n noDeleteOnFetchRejection;\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnStaleGet}\n */\n noDeleteOnStaleGet;\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}\n */\n allowStaleOnFetchAbort;\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection}\n */\n allowStaleOnFetchRejection;\n /**\n * {@link LRUCache.OptionsBase.ignoreFetchAbort}\n */\n ignoreFetchAbort;\n // computed properties\n #size;\n #calculatedSize;\n #keyMap;\n #keyList;\n #valList;\n #next;\n #prev;\n #head;\n #tail;\n #free;\n #disposed;\n #sizes;\n #starts;\n #ttls;\n #hasDispose;\n #hasFetchMethod;\n #hasDisposeAfter;\n /**\n * Do not call this method unless you need to inspect the\n * inner workings of the cache. If anything returned by this\n * object is modified in any way, strange breakage may occur.\n *\n * These fields are private for a reason!\n *\n * @internal\n */\n static unsafeExposeInternals(c) {\n return {\n // properties\n starts: c.#starts,\n ttls: c.#ttls,\n sizes: c.#sizes,\n keyMap: c.#keyMap,\n keyList: c.#keyList,\n valList: c.#valList,\n next: c.#next,\n prev: c.#prev,\n get head() {\n return c.#head;\n },\n get tail() {\n return c.#tail;\n },\n free: c.#free,\n // methods\n isBackgroundFetch: (p) => c.#isBackgroundFetch(p),\n backgroundFetch: (k, index, options, context) => c.#backgroundFetch(k, index, options, context),\n moveToTail: (index) => c.#moveToTail(index),\n indexes: (options) => c.#indexes(options),\n rindexes: (options) => c.#rindexes(options),\n isStale: (index) => c.#isStale(index),\n };\n }\n // Protected read-only members\n /**\n * {@link LRUCache.OptionsBase.max} (read-only)\n */\n get max() {\n return this.#max;\n }\n /**\n * {@link LRUCache.OptionsBase.maxSize} (read-only)\n */\n get maxSize() {\n return this.#maxSize;\n }\n /**\n * The total computed size of items in the cache (read-only)\n */\n get calculatedSize() {\n return this.#calculatedSize;\n }\n /**\n * The number of items stored in the cache (read-only)\n */\n get size() {\n return this.#size;\n }\n /**\n * {@link LRUCache.OptionsBase.fetchMethod} (read-only)\n */\n get fetchMethod() {\n return this.#fetchMethod;\n }\n /**\n * {@link LRUCache.OptionsBase.dispose} (read-only)\n */\n get dispose() {\n return this.#dispose;\n }\n /**\n * {@link LRUCache.OptionsBase.disposeAfter} (read-only)\n */\n get disposeAfter() {\n return this.#disposeAfter;\n }\n constructor(options) {\n const { max = 0, ttl, ttlResolution = 1, ttlAutopurge, updateAgeOnGet, updateAgeOnHas, allowStale, dispose, disposeAfter, noDisposeOnSet, noUpdateTTL, maxSize = 0, maxEntrySize = 0, sizeCalculation, fetchMethod, noDeleteOnFetchRejection, noDeleteOnStaleGet, allowStaleOnFetchRejection, allowStaleOnFetchAbort, ignoreFetchAbort, } = options;\n if (max !== 0 && !isPosInt(max)) {\n throw new TypeError('max option must be a nonnegative integer');\n }\n const UintArray = max ? getUintArray(max) : Array;\n if (!UintArray) {\n throw new Error('invalid max value: ' + max);\n }\n this.#max = max;\n this.#maxSize = maxSize;\n this.maxEntrySize = maxEntrySize || this.#maxSize;\n this.sizeCalculation = sizeCalculation;\n if (this.sizeCalculation) {\n if (!this.#maxSize && !this.maxEntrySize) {\n throw new TypeError('cannot set sizeCalculation without setting maxSize or maxEntrySize');\n }\n if (typeof this.sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation set to non-function');\n }\n }\n if (fetchMethod !== undefined &&\n typeof fetchMethod !== 'function') {\n throw new TypeError('fetchMethod must be a function if specified');\n }\n this.#fetchMethod = fetchMethod;\n this.#hasFetchMethod = !!fetchMethod;\n this.#keyMap = new Map();\n this.#keyList = new Array(max).fill(undefined);\n this.#valList = new Array(max).fill(undefined);\n this.#next = new UintArray(max);\n this.#prev = new UintArray(max);\n this.#head = 0;\n this.#tail = 0;\n this.#free = Stack.create(max);\n this.#size = 0;\n this.#calculatedSize = 0;\n if (typeof dispose === 'function') {\n this.#dispose = dispose;\n }\n if (typeof disposeAfter === 'function') {\n this.#disposeAfter = disposeAfter;\n this.#disposed = [];\n }\n else {\n this.#disposeAfter = undefined;\n this.#disposed = undefined;\n }\n this.#hasDispose = !!this.#dispose;\n this.#hasDisposeAfter = !!this.#disposeAfter;\n this.noDisposeOnSet = !!noDisposeOnSet;\n this.noUpdateTTL = !!noUpdateTTL;\n this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection;\n this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection;\n this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort;\n this.ignoreFetchAbort = !!ignoreFetchAbort;\n // NB: maxEntrySize is set to maxSize if it's set\n if (this.maxEntrySize !== 0) {\n if (this.#maxSize !== 0) {\n if (!isPosInt(this.#maxSize)) {\n throw new TypeError('maxSize must be a positive integer if specified');\n }\n }\n if (!isPosInt(this.maxEntrySize)) {\n throw new TypeError('maxEntrySize must be a positive integer if specified');\n }\n this.#initializeSizeTracking();\n }\n this.allowStale = !!allowStale;\n this.noDeleteOnStaleGet = !!noDeleteOnStaleGet;\n this.updateAgeOnGet = !!updateAgeOnGet;\n this.updateAgeOnHas = !!updateAgeOnHas;\n this.ttlResolution =\n isPosInt(ttlResolution) || ttlResolution === 0\n ? ttlResolution\n : 1;\n this.ttlAutopurge = !!ttlAutopurge;\n this.ttl = ttl || 0;\n if (this.ttl) {\n if (!isPosInt(this.ttl)) {\n throw new TypeError('ttl must be a positive integer if specified');\n }\n this.#initializeTTLTracking();\n }\n // do not allow completely unbounded caches\n if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) {\n throw new TypeError('At least one of max, maxSize, or ttl is required');\n }\n if (!this.ttlAutopurge && !this.#max && !this.#maxSize) {\n const code = 'LRU_CACHE_UNBOUNDED';\n if (shouldWarn(code)) {\n warned.add(code);\n const msg = 'TTL caching without ttlAutopurge, max, or maxSize can ' +\n 'result in unbounded memory consumption.';\n emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache);\n }\n }\n }\n /**\n * Return the remaining TTL time for a given entry key\n */\n getRemainingTTL(key) {\n return this.#keyMap.has(key) ? Infinity : 0;\n }\n #initializeTTLTracking() {\n const ttls = new ZeroArray(this.#max);\n const starts = new ZeroArray(this.#max);\n this.#ttls = ttls;\n this.#starts = starts;\n this.#setItemTTL = (index, ttl, start = perf.now()) => {\n starts[index] = ttl !== 0 ? start : 0;\n ttls[index] = ttl;\n if (ttl !== 0 && this.ttlAutopurge) {\n const t = setTimeout(() => {\n if (this.#isStale(index)) {\n this.delete(this.#keyList[index]);\n }\n }, ttl + 1);\n // unref() not supported on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref();\n }\n /* c8 ignore stop */\n }\n };\n this.#updateItemAge = index => {\n starts[index] = ttls[index] !== 0 ? perf.now() : 0;\n };\n this.#statusTTL = (status, index) => {\n if (ttls[index]) {\n const ttl = ttls[index];\n const start = starts[index];\n /* c8 ignore next */\n if (!ttl || !start)\n return;\n status.ttl = ttl;\n status.start = start;\n status.now = cachedNow || getNow();\n const age = status.now - start;\n status.remainingTTL = ttl - age;\n }\n };\n // debounce calls to perf.now() to 1s so we're not hitting\n // that costly call repeatedly.\n let cachedNow = 0;\n const getNow = () => {\n const n = perf.now();\n if (this.ttlResolution > 0) {\n cachedNow = n;\n const t = setTimeout(() => (cachedNow = 0), this.ttlResolution);\n // not available on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref();\n }\n /* c8 ignore stop */\n }\n return n;\n };\n this.getRemainingTTL = key => {\n const index = this.#keyMap.get(key);\n if (index === undefined) {\n return 0;\n }\n const ttl = ttls[index];\n const start = starts[index];\n if (!ttl || !start) {\n return Infinity;\n }\n const age = (cachedNow || getNow()) - start;\n return ttl - age;\n };\n this.#isStale = index => {\n const s = starts[index];\n const t = ttls[index];\n return !!t && !!s && (cachedNow || getNow()) - s > t;\n };\n }\n // conditionally set private methods related to TTL\n #updateItemAge = () => { };\n #statusTTL = () => { };\n #setItemTTL = () => { };\n /* c8 ignore stop */\n #isStale = () => false;\n #initializeSizeTracking() {\n const sizes = new ZeroArray(this.#max);\n this.#calculatedSize = 0;\n this.#sizes = sizes;\n this.#removeItemSize = index => {\n this.#calculatedSize -= sizes[index];\n sizes[index] = 0;\n };\n this.#requireSize = (k, v, size, sizeCalculation) => {\n // provisionally accept background fetches.\n // actual value size will be checked when they return.\n if (this.#isBackgroundFetch(v)) {\n return 0;\n }\n if (!isPosInt(size)) {\n if (sizeCalculation) {\n if (typeof sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation must be a function');\n }\n size = sizeCalculation(v, k);\n if (!isPosInt(size)) {\n throw new TypeError('sizeCalculation return invalid (expect positive integer)');\n }\n }\n else {\n throw new TypeError('invalid size value (must be positive integer). ' +\n 'When maxSize or maxEntrySize is used, sizeCalculation ' +\n 'or size must be set.');\n }\n }\n return size;\n };\n this.#addItemSize = (index, size, status) => {\n sizes[index] = size;\n if (this.#maxSize) {\n const maxSize = this.#maxSize - sizes[index];\n while (this.#calculatedSize > maxSize) {\n this.#evict(true);\n }\n }\n this.#calculatedSize += sizes[index];\n if (status) {\n status.entrySize = size;\n status.totalCalculatedSize = this.#calculatedSize;\n }\n };\n }\n #removeItemSize = _i => { };\n #addItemSize = (_i, _s, _st) => { };\n #requireSize = (_k, _v, size, sizeCalculation) => {\n if (size || sizeCalculation) {\n throw new TypeError('cannot set size without setting maxSize or maxEntrySize on cache');\n }\n return 0;\n };\n *#indexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#tail; true;) {\n if (!this.#isValidIndex(i)) {\n break;\n }\n if (allowStale || !this.#isStale(i)) {\n yield i;\n }\n if (i === this.#head) {\n break;\n }\n else {\n i = this.#prev[i];\n }\n }\n }\n }\n *#rindexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#head; true;) {\n if (!this.#isValidIndex(i)) {\n break;\n }\n if (allowStale || !this.#isStale(i)) {\n yield i;\n }\n if (i === this.#tail) {\n break;\n }\n else {\n i = this.#next[i];\n }\n }\n }\n }\n #isValidIndex(index) {\n return (index !== undefined &&\n this.#keyMap.get(this.#keyList[index]) === index);\n }\n /**\n * Return a generator yielding `[key, value]` pairs,\n * in order from most recently used to least recently used.\n */\n *entries() {\n for (const i of this.#indexes()) {\n if (this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield [this.#keyList[i], this.#valList[i]];\n }\n }\n }\n /**\n * Inverse order version of {@link LRUCache.entries}\n *\n * Return a generator yielding `[key, value]` pairs,\n * in order from least recently used to most recently used.\n */\n *rentries() {\n for (const i of this.#rindexes()) {\n if (this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield [this.#keyList[i], this.#valList[i]];\n }\n }\n }\n /**\n * Return a generator yielding the keys in the cache,\n * in order from most recently used to least recently used.\n */\n *keys() {\n for (const i of this.#indexes()) {\n const k = this.#keyList[i];\n if (k !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield k;\n }\n }\n }\n /**\n * Inverse order version of {@link LRUCache.keys}\n *\n * Return a generator yielding the keys in the cache,\n * in order from least recently used to most recently used.\n */\n *rkeys() {\n for (const i of this.#rindexes()) {\n const k = this.#keyList[i];\n if (k !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield k;\n }\n }\n }\n /**\n * Return a generator yielding the values in the cache,\n * in order from most recently used to least recently used.\n */\n *values() {\n for (const i of this.#indexes()) {\n const v = this.#valList[i];\n if (v !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i];\n }\n }\n }\n /**\n * Inverse order version of {@link LRUCache.values}\n *\n * Return a generator yielding the values in the cache,\n * in order from least recently used to most recently used.\n */\n *rvalues() {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i];\n if (v !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i];\n }\n }\n }\n /**\n * Iterating over the cache itself yields the same results as\n * {@link LRUCache.entries}\n */\n [Symbol.iterator]() {\n return this.entries();\n }\n /**\n * A String value that is used in the creation of the default string description of an object.\n * Called by the built-in method Object.prototype.toString.\n */\n [Symbol.toStringTag] = 'LRUCache';\n /**\n * Find a value for which the supplied fn method returns a truthy value,\n * similar to Array.find(). fn is called as fn(value, key, cache).\n */\n find(fn, getOptions = {}) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i];\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v;\n if (value === undefined)\n continue;\n if (fn(value, this.#keyList[i], this)) {\n return this.get(this.#keyList[i], getOptions);\n }\n }\n }\n /**\n * Call the supplied function on each item in the cache, in order from\n * most recently used to least recently used. fn is called as\n * fn(value, key, cache). Does not update age or recenty of use.\n * Does not iterate over stale values.\n */\n forEach(fn, thisp = this) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i];\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v;\n if (value === undefined)\n continue;\n fn.call(thisp, value, this.#keyList[i], this);\n }\n }\n /**\n * The same as {@link LRUCache.forEach} but items are iterated over in\n * reverse order. (ie, less recently used items are iterated over first.)\n */\n rforEach(fn, thisp = this) {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i];\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v;\n if (value === undefined)\n continue;\n fn.call(thisp, value, this.#keyList[i], this);\n }\n }\n /**\n * Delete any stale entries. Returns true if anything was removed,\n * false otherwise.\n */\n purgeStale() {\n let deleted = false;\n for (const i of this.#rindexes({ allowStale: true })) {\n if (this.#isStale(i)) {\n this.delete(this.#keyList[i]);\n deleted = true;\n }\n }\n return deleted;\n }\n /**\n * Get the extended info about a given entry, to get its value, size, and\n * TTL info simultaneously. Like {@link LRUCache#dump}, but just for a\n * single key. Always returns stale values, if their info is found in the\n * cache, so be sure to check for expired TTLs if relevant.\n */\n info(key) {\n const i = this.#keyMap.get(key);\n if (i === undefined)\n return undefined;\n const v = this.#valList[i];\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v;\n if (value === undefined)\n return undefined;\n const entry = { value };\n if (this.#ttls && this.#starts) {\n const ttl = this.#ttls[i];\n const start = this.#starts[i];\n if (ttl && start) {\n const remain = ttl - (perf.now() - start);\n entry.ttl = remain;\n entry.start = Date.now();\n }\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i];\n }\n return entry;\n }\n /**\n * Return an array of [key, {@link LRUCache.Entry}] tuples which can be\n * passed to cache.load()\n */\n dump() {\n const arr = [];\n for (const i of this.#indexes({ allowStale: true })) {\n const key = this.#keyList[i];\n const v = this.#valList[i];\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v;\n if (value === undefined || key === undefined)\n continue;\n const entry = { value };\n if (this.#ttls && this.#starts) {\n entry.ttl = this.#ttls[i];\n // always dump the start relative to a portable timestamp\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = perf.now() - this.#starts[i];\n entry.start = Math.floor(Date.now() - age);\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i];\n }\n arr.unshift([key, entry]);\n }\n return arr;\n }\n /**\n * Reset the cache and load in the items in entries in the order listed.\n * Note that the shape of the resulting cache may be different if the\n * same options are not used in both caches.\n */\n load(arr) {\n this.clear();\n for (const [key, entry] of arr) {\n if (entry.start) {\n // entry.start is a portable timestamp, but we may be using\n // node's performance.now(), so calculate the offset, so that\n // we get the intended remaining TTL, no matter how long it's\n // been on ice.\n //\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = Date.now() - entry.start;\n entry.start = perf.now() - age;\n }\n this.set(key, entry.value, entry);\n }\n }\n /**\n * Add a value to the cache.\n *\n * Note: if `undefined` is specified as a value, this is an alias for\n * {@link LRUCache#delete}\n */\n set(k, v, setOptions = {}) {\n if (v === undefined) {\n this.delete(k);\n return this;\n }\n const { ttl = this.ttl, start, noDisposeOnSet = this.noDisposeOnSet, sizeCalculation = this.sizeCalculation, status, } = setOptions;\n let { noUpdateTTL = this.noUpdateTTL } = setOptions;\n const size = this.#requireSize(k, v, setOptions.size || 0, sizeCalculation);\n // if the item doesn't fit, don't do anything\n // NB: maxEntrySize set to maxSize by default\n if (this.maxEntrySize && size > this.maxEntrySize) {\n if (status) {\n status.set = 'miss';\n status.maxEntrySizeExceeded = true;\n }\n // have to delete, in case something is there already.\n this.delete(k);\n return this;\n }\n let index = this.#size === 0 ? undefined : this.#keyMap.get(k);\n if (index === undefined) {\n // addition\n index = (this.#size === 0\n ? this.#tail\n : this.#free.length !== 0\n ? this.#free.pop()\n : this.#size === this.#max\n ? this.#evict(false)\n : this.#size);\n this.#keyList[index] = k;\n this.#valList[index] = v;\n this.#keyMap.set(k, index);\n this.#next[this.#tail] = index;\n this.#prev[index] = this.#tail;\n this.#tail = index;\n this.#size++;\n this.#addItemSize(index, size, status);\n if (status)\n status.set = 'add';\n noUpdateTTL = false;\n }\n else {\n // update\n this.#moveToTail(index);\n const oldVal = this.#valList[index];\n if (v !== oldVal) {\n if (this.#hasFetchMethod && this.#isBackgroundFetch(oldVal)) {\n oldVal.__abortController.abort(new Error('replaced'));\n const { __staleWhileFetching: s } = oldVal;\n if (s !== undefined && !noDisposeOnSet) {\n if (this.#hasDispose) {\n this.#dispose?.(s, k, 'set');\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([s, k, 'set']);\n }\n }\n }\n else if (!noDisposeOnSet) {\n if (this.#hasDispose) {\n this.#dispose?.(oldVal, k, 'set');\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldVal, k, 'set']);\n }\n }\n this.#removeItemSize(index);\n this.#addItemSize(index, size, status);\n this.#valList[index] = v;\n if (status) {\n status.set = 'replace';\n const oldValue = oldVal && this.#isBackgroundFetch(oldVal)\n ? oldVal.__staleWhileFetching\n : oldVal;\n if (oldValue !== undefined)\n status.oldValue = oldValue;\n }\n }\n else if (status) {\n status.set = 'update';\n }\n }\n if (ttl !== 0 && !this.#ttls) {\n this.#initializeTTLTracking();\n }\n if (this.#ttls) {\n if (!noUpdateTTL) {\n this.#setItemTTL(index, ttl, start);\n }\n if (status)\n this.#statusTTL(status, index);\n }\n if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed;\n let task;\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task);\n }\n }\n return this;\n }\n /**\n * Evict the least recently used item, returning its value or\n * `undefined` if cache is empty.\n */\n pop() {\n try {\n while (this.#size) {\n const val = this.#valList[this.#head];\n this.#evict(true);\n if (this.#isBackgroundFetch(val)) {\n if (val.__staleWhileFetching) {\n return val.__staleWhileFetching;\n }\n }\n else if (val !== undefined) {\n return val;\n }\n }\n }\n finally {\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed;\n let task;\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task);\n }\n }\n }\n }\n #evict(free) {\n const head = this.#head;\n const k = this.#keyList[head];\n const v = this.#valList[head];\n if (this.#hasFetchMethod && this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('evicted'));\n }\n else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v, k, 'evict');\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v, k, 'evict']);\n }\n }\n this.#removeItemSize(head);\n // if we aren't about to use the index, then null these out\n if (free) {\n this.#keyList[head] = undefined;\n this.#valList[head] = undefined;\n this.#free.push(head);\n }\n if (this.#size === 1) {\n this.#head = this.#tail = 0;\n this.#free.length = 0;\n }\n else {\n this.#head = this.#next[head];\n }\n this.#keyMap.delete(k);\n this.#size--;\n return head;\n }\n /**\n * Check if a key is in the cache, without updating the recency of use.\n * Will return false if the item is stale, even though it is technically\n * in the cache.\n *\n * Will not update item age unless\n * {@link LRUCache.OptionsBase.updateAgeOnHas} is set.\n */\n has(k, hasOptions = {}) {\n const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions;\n const index = this.#keyMap.get(k);\n if (index !== undefined) {\n const v = this.#valList[index];\n if (this.#isBackgroundFetch(v) &&\n v.__staleWhileFetching === undefined) {\n return false;\n }\n if (!this.#isStale(index)) {\n if (updateAgeOnHas) {\n this.#updateItemAge(index);\n }\n if (status) {\n status.has = 'hit';\n this.#statusTTL(status, index);\n }\n return true;\n }\n else if (status) {\n status.has = 'stale';\n this.#statusTTL(status, index);\n }\n }\n else if (status) {\n status.has = 'miss';\n }\n return false;\n }\n /**\n * Like {@link LRUCache#get} but doesn't update recency or delete stale\n * items.\n *\n * Returns `undefined` if the item is stale, unless\n * {@link LRUCache.OptionsBase.allowStale} is set.\n */\n peek(k, peekOptions = {}) {\n const { allowStale = this.allowStale } = peekOptions;\n const index = this.#keyMap.get(k);\n if (index === undefined ||\n (!allowStale && this.#isStale(index))) {\n return;\n }\n const v = this.#valList[index];\n // either stale and allowed, or forcing a refresh of non-stale value\n return this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v;\n }\n #backgroundFetch(k, index, options, context) {\n const v = index === undefined ? undefined : this.#valList[index];\n if (this.#isBackgroundFetch(v)) {\n return v;\n }\n const ac = new AC();\n const { signal } = options;\n // when/if our AC signals, then stop listening to theirs.\n signal?.addEventListener('abort', () => ac.abort(signal.reason), {\n signal: ac.signal,\n });\n const fetchOpts = {\n signal: ac.signal,\n options,\n context,\n };\n const cb = (v, updateCache = false) => {\n const { aborted } = ac.signal;\n const ignoreAbort = options.ignoreFetchAbort && v !== undefined;\n if (options.status) {\n if (aborted && !updateCache) {\n options.status.fetchAborted = true;\n options.status.fetchError = ac.signal.reason;\n if (ignoreAbort)\n options.status.fetchAbortIgnored = true;\n }\n else {\n options.status.fetchResolved = true;\n }\n }\n if (aborted && !ignoreAbort && !updateCache) {\n return fetchFail(ac.signal.reason);\n }\n // either we didn't abort, and are still here, or we did, and ignored\n const bf = p;\n if (this.#valList[index] === p) {\n if (v === undefined) {\n if (bf.__staleWhileFetching) {\n this.#valList[index] = bf.__staleWhileFetching;\n }\n else {\n this.delete(k);\n }\n }\n else {\n if (options.status)\n options.status.fetchUpdated = true;\n this.set(k, v, fetchOpts.options);\n }\n }\n return v;\n };\n const eb = (er) => {\n if (options.status) {\n options.status.fetchRejected = true;\n options.status.fetchError = er;\n }\n return fetchFail(er);\n };\n const fetchFail = (er) => {\n const { aborted } = ac.signal;\n const allowStaleAborted = aborted && options.allowStaleOnFetchAbort;\n const allowStale = allowStaleAborted || options.allowStaleOnFetchRejection;\n const noDelete = allowStale || options.noDeleteOnFetchRejection;\n const bf = p;\n if (this.#valList[index] === p) {\n // if we allow stale on fetch rejections, then we need to ensure that\n // the stale value is not removed from the cache when the fetch fails.\n const del = !noDelete || bf.__staleWhileFetching === undefined;\n if (del) {\n this.delete(k);\n }\n else if (!allowStaleAborted) {\n // still replace the *promise* with the stale value,\n // since we are done with the promise at this point.\n // leave it untouched if we're still waiting for an\n // aborted background fetch that hasn't yet returned.\n this.#valList[index] = bf.__staleWhileFetching;\n }\n }\n if (allowStale) {\n if (options.status && bf.__staleWhileFetching !== undefined) {\n options.status.returnedStale = true;\n }\n return bf.__staleWhileFetching;\n }\n else if (bf.__returned === bf) {\n throw er;\n }\n };\n const pcall = (res, rej) => {\n const fmp = this.#fetchMethod?.(k, v, fetchOpts);\n if (fmp && fmp instanceof Promise) {\n fmp.then(v => res(v === undefined ? undefined : v), rej);\n }\n // ignored, we go until we finish, regardless.\n // defer check until we are actually aborting,\n // so fetchMethod can override.\n ac.signal.addEventListener('abort', () => {\n if (!options.ignoreFetchAbort ||\n options.allowStaleOnFetchAbort) {\n res(undefined);\n // when it eventually resolves, update the cache.\n if (options.allowStaleOnFetchAbort) {\n res = v => cb(v, true);\n }\n }\n });\n };\n if (options.status)\n options.status.fetchDispatched = true;\n const p = new Promise(pcall).then(cb, eb);\n const bf = Object.assign(p, {\n __abortController: ac,\n __staleWhileFetching: v,\n __returned: undefined,\n });\n if (index === undefined) {\n // internal, don't expose status.\n this.set(k, bf, { ...fetchOpts.options, status: undefined });\n index = this.#keyMap.get(k);\n }\n else {\n this.#valList[index] = bf;\n }\n return bf;\n }\n #isBackgroundFetch(p) {\n if (!this.#hasFetchMethod)\n return false;\n const b = p;\n return (!!b &&\n b instanceof Promise &&\n b.hasOwnProperty('__staleWhileFetching') &&\n b.__abortController instanceof AC);\n }\n async fetch(k, fetchOptions = {}) {\n const { \n // get options\n allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, \n // set options\n ttl = this.ttl, noDisposeOnSet = this.noDisposeOnSet, size = 0, sizeCalculation = this.sizeCalculation, noUpdateTTL = this.noUpdateTTL, \n // fetch exclusive options\n noDeleteOnFetchRejection = this.noDeleteOnFetchRejection, allowStaleOnFetchRejection = this.allowStaleOnFetchRejection, ignoreFetchAbort = this.ignoreFetchAbort, allowStaleOnFetchAbort = this.allowStaleOnFetchAbort, context, forceRefresh = false, status, signal, } = fetchOptions;\n if (!this.#hasFetchMethod) {\n if (status)\n status.fetch = 'get';\n return this.get(k, {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n status,\n });\n }\n const options = {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n ttl,\n noDisposeOnSet,\n size,\n sizeCalculation,\n noUpdateTTL,\n noDeleteOnFetchRejection,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n status,\n signal,\n };\n let index = this.#keyMap.get(k);\n if (index === undefined) {\n if (status)\n status.fetch = 'miss';\n const p = this.#backgroundFetch(k, index, options, context);\n return (p.__returned = p);\n }\n else {\n // in cache, maybe already fetching\n const v = this.#valList[index];\n if (this.#isBackgroundFetch(v)) {\n const stale = allowStale && v.__staleWhileFetching !== undefined;\n if (status) {\n status.fetch = 'inflight';\n if (stale)\n status.returnedStale = true;\n }\n return stale ? v.__staleWhileFetching : (v.__returned = v);\n }\n // if we force a refresh, that means do NOT serve the cached value,\n // unless we are already in the process of refreshing the cache.\n const isStale = this.#isStale(index);\n if (!forceRefresh && !isStale) {\n if (status)\n status.fetch = 'hit';\n this.#moveToTail(index);\n if (updateAgeOnGet) {\n this.#updateItemAge(index);\n }\n if (status)\n this.#statusTTL(status, index);\n return v;\n }\n // ok, it is stale or a forced refresh, and not already fetching.\n // refresh the cache.\n const p = this.#backgroundFetch(k, index, options, context);\n const hasStale = p.__staleWhileFetching !== undefined;\n const staleVal = hasStale && allowStale;\n if (status) {\n status.fetch = isStale ? 'stale' : 'refresh';\n if (staleVal && isStale)\n status.returnedStale = true;\n }\n return staleVal ? p.__staleWhileFetching : (p.__returned = p);\n }\n }\n /**\n * Return a value from the cache. Will update the recency of the cache\n * entry found.\n *\n * If the key is not found, get() will return `undefined`.\n */\n get(k, getOptions = {}) {\n const { allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, status, } = getOptions;\n const index = this.#keyMap.get(k);\n if (index !== undefined) {\n const value = this.#valList[index];\n const fetching = this.#isBackgroundFetch(value);\n if (status)\n this.#statusTTL(status, index);\n if (this.#isStale(index)) {\n if (status)\n status.get = 'stale';\n // delete only if not an in-flight background fetch\n if (!fetching) {\n if (!noDeleteOnStaleGet) {\n this.delete(k);\n }\n if (status && allowStale)\n status.returnedStale = true;\n return allowStale ? value : undefined;\n }\n else {\n if (status &&\n allowStale &&\n value.__staleWhileFetching !== undefined) {\n status.returnedStale = true;\n }\n return allowStale ? value.__staleWhileFetching : undefined;\n }\n }\n else {\n if (status)\n status.get = 'hit';\n // if we're currently fetching it, we don't actually have it yet\n // it's not stale, which means this isn't a staleWhileRefetching.\n // If it's not stale, and fetching, AND has a __staleWhileFetching\n // value, then that means the user fetched with {forceRefresh:true},\n // so it's safe to return that value.\n if (fetching) {\n return value.__staleWhileFetching;\n }\n this.#moveToTail(index);\n if (updateAgeOnGet) {\n this.#updateItemAge(index);\n }\n return value;\n }\n }\n else if (status) {\n status.get = 'miss';\n }\n }\n #connect(p, n) {\n this.#prev[n] = p;\n this.#next[p] = n;\n }\n #moveToTail(index) {\n // if tail already, nothing to do\n // if head, move head to next[index]\n // else\n // move next[prev[index]] to next[index] (head has no prev)\n // move prev[next[index]] to prev[index]\n // prev[index] = tail\n // next[tail] = index\n // tail = index\n if (index !== this.#tail) {\n if (index === this.#head) {\n this.#head = this.#next[index];\n }\n else {\n this.#connect(this.#prev[index], this.#next[index]);\n }\n this.#connect(this.#tail, index);\n this.#tail = index;\n }\n }\n /**\n * Deletes a key out of the cache.\n * Returns true if the key was deleted, false otherwise.\n */\n delete(k) {\n let deleted = false;\n if (this.#size !== 0) {\n const index = this.#keyMap.get(k);\n if (index !== undefined) {\n deleted = true;\n if (this.#size === 1) {\n this.clear();\n }\n else {\n this.#removeItemSize(index);\n const v = this.#valList[index];\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'));\n }\n else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v, k, 'delete');\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v, k, 'delete']);\n }\n }\n this.#keyMap.delete(k);\n this.#keyList[index] = undefined;\n this.#valList[index] = undefined;\n if (index === this.#tail) {\n this.#tail = this.#prev[index];\n }\n else if (index === this.#head) {\n this.#head = this.#next[index];\n }\n else {\n const pi = this.#prev[index];\n this.#next[pi] = this.#next[index];\n const ni = this.#next[index];\n this.#prev[ni] = this.#prev[index];\n }\n this.#size--;\n this.#free.push(index);\n }\n }\n }\n if (this.#hasDisposeAfter && this.#disposed?.length) {\n const dt = this.#disposed;\n let task;\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task);\n }\n }\n return deleted;\n }\n /**\n * Clear the cache entirely, throwing away all values.\n */\n clear() {\n for (const index of this.#rindexes({ allowStale: true })) {\n const v = this.#valList[index];\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'));\n }\n else {\n const k = this.#keyList[index];\n if (this.#hasDispose) {\n this.#dispose?.(v, k, 'delete');\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v, k, 'delete']);\n }\n }\n }\n this.#keyMap.clear();\n this.#valList.fill(undefined);\n this.#keyList.fill(undefined);\n if (this.#ttls && this.#starts) {\n this.#ttls.fill(0);\n this.#starts.fill(0);\n }\n if (this.#sizes) {\n this.#sizes.fill(0);\n }\n this.#head = 0;\n this.#tail = 0;\n this.#free.length = 0;\n this.#calculatedSize = 0;\n this.#size = 0;\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed;\n let task;\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task);\n }\n }\n }\n}\n//# sourceMappingURL=index.js.map","import type { vec3 } from \"gl-matrix\";\nimport { LRUCache } from \"lru-cache\";\n\nexport type TileIndexCache<T> = {\n get: (xyz: vec3) => T | undefined;\n set: (xyz: vec3, value: T) => void;\n delete: (xyz: vec3) => void;\n clear: () => void;\n purgeStale: () => void;\n};\n\nexport type CreateTileIndexCacheOptions<T> = {\n max: number;\n ttl?: number;\n dispose?: (value: T, key: vec3) => void;\n};\n\nexport const createTileIndexCache = <T extends NonNullable<unknown>>(\n options: CreateTileIndexCacheOptions<T>,\n) => {\n const cache = new LRUCache<number, T>({\n ...options,\n ttlResolution: 0,\n dispose: (value, key) => options.dispose?.(value, fromKey(key)),\n });\n\n const toKey = ([x = 0, y = 0, z = 0]: vec3) =>\n y * 2 ** z + x + (4 ** (z + 1) - 1) / 3;\n const fromKey = (key: number) => {\n const z = Math.floor(Math.log(key * 3 + 1) / Math.log(4)) - 1;\n key -= (4 ** (z + 1) - 1) / 3;\n const y = Math.floor(key / 2 ** z);\n const x = key - y * 2 ** z;\n return [x, y, z] satisfies vec3;\n };\n\n return {\n get: xyz => cache.get(toKey(xyz)),\n set: (xyz, value) => cache.set(toKey(xyz), value as unknown as T),\n delete: xyz => cache.delete(toKey(xyz)),\n clear: () => cache.clear(),\n purgeStale: () => cache.purgeStale(),\n } satisfies TileIndexCache<T>;\n};\n","import type { vec2, vec3 } from \"gl-matrix\";\n\nimport type { TileCache } from \"./layers/terrain/tile-cache\";\nimport { createTileDownsampler } from \"./layers/terrain/tile-downsampler\";\nimport { createTileIndexCache } from \"./layers/terrain/tile-index-cache\";\nimport { mercator } from \"./math\";\n\nconst defaultZ = 15;\nconst size = 256;\n\nexport type Elevation = {\n get: ([lng, lat]: vec2, z?: number) => number;\n dispose: () => void;\n};\n\nexport const createElevation = ({\n gl,\n terrainCache,\n}: {\n gl: WebGL2RenderingContext;\n terrainCache: TileCache;\n}) => {\n const tileCache = createTileIndexCache<Uint8Array>({\n max: 1000,\n });\n\n const downsampler = createTileDownsampler(terrainCache);\n\n const framebuffer = gl.createFramebuffer();\n if (!framebuffer) throw new Error(\"Framebuffer creation failed\");\n\n const downsampleBuffer = ([x = 0, y = 0, z = 0]: vec3) => {\n const tile = downsampler.get([x, y, z]);\n if (!tile) return undefined;\n const { texture, downsample } = tile;\n const k = 2 ** downsample;\n const xyz: vec3 = [Math.floor(x / k), Math.floor(y / k), z - downsample];\n const cached = tileCache.get(xyz);\n if (cached) return { buffer: cached, downsample };\n\n const buffer = new Uint8Array(4 * size * size);\n gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n texture.attach();\n gl.readPixels(0, 0, size, size, gl.RGBA, gl.UNSIGNED_BYTE, buffer);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\n tileCache.set(xyz, buffer);\n return { buffer, downsample };\n };\n\n const get = ([lng = 0, lat = 0]: vec2, z = defaultZ) => {\n const k = 2 ** z;\n const p = mercator([lng, lat, 0]).map(_ => _ * k);\n const [x = 0, y = 0] = p.map(_ => Math.floor(_ % k));\n let [px = 0, py = 0] = p.map(_ => _ % 1);\n const downsampled = downsampleBuffer([x, y, z]);\n if (!downsampled) return 0;\n const { buffer, downsample } = downsampled;\n const k2 = 2 ** downsample;\n [px, py] = [((x % k2) + px) / k2, ((y % k2) + py) / k2];\n\n const q = 4 * size * Math.floor(py * size) + 4 * Math.floor(px * size);\n const [r = 0, g = 0, b = 0] = buffer.slice(q, q + 4);\n\n const value = (r * 65536 + g * 256 + b) / 10 - 10000;\n\n return value;\n };\n\n const dispose = () => {\n gl.deleteFramebuffer(framebuffer);\n };\n\n return { get, dispose } satisfies Elevation;\n};\n","#version 300 es\n\nprecision highp float;\n\nuniform sampler2D imagery;\nin vec2 uv;\nin vec4 color_out;\nout vec4 result;\n\nvoid main(void) {\n result = texture(imagery, uv) * color_out;\n}","import type { vec3 } from \"gl-matrix\";\n\nimport type { ImageTexture } from \"./image-texture\";\nimport { createImageTexture } from \"./image-texture\";\nimport type { Texture } from \"./texture\";\nimport { createTileIndexCache } from \"./tile-index-cache\";\n\nexport type TileCache = {\n get: (xyz: vec3) => Texture | undefined;\n dispose: () => void;\n};\n\nexport const createTileCache = ({\n gl,\n urlPattern,\n onLoad,\n}: {\n gl: WebGL2RenderingContext;\n urlPattern: string;\n onLoad?: () => void;\n}) => {\n const tiles = createTileIndexCache<ImageTexture>({\n max: 10000,\n dispose: tile => tile.dispose(),\n });\n const loading = createTileIndexCache<true>({\n max: 10000,\n ttl: 2000,\n dispose: (_, xyz) => {\n const cached = tiles.get(xyz);\n if (cached && !cached.loaded) {\n console.log(\"Cancel\", xyz);\n tiles.delete(xyz);\n }\n },\n });\n\n const get: (xyz: vec3) => Texture | undefined = xyz => {\n const cached = tiles.get(xyz);\n if (cached) {\n if (cached.loaded) {\n loading.delete(xyz);\n return cached;\n }\n loading.set(xyz, true);\n } else {\n const [x, y, z] = xyz;\n const url = urlPattern\n .replace(\"{x}\", `${x}`)\n .replace(\"{y}\", `${y}`)\n .replace(\"{z}\", `${z}`);\n const texture = createImageTexture({\n gl,\n url,\n onLoad: () => {\n loading.delete(xyz);\n onLoad?.();\n },\n });\n tiles.set(xyz, texture);\n loading.set(xyz, true);\n }\n };\n\n const interval = setInterval(() => loading.purgeStale(), 200);\n\n const dispose = () => {\n clearInterval(interval);\n tiles.clear();\n };\n\n return { get, dispose } satisfies TileCache;\n};\n","import { vec3 } from \"gl-matrix\";\n\nimport type { Elevation } from \"../../elevation\";\nimport { geodetic, mercator, tileToMercator } from \"../../math\";\nimport { createTileIndexCache } from \"./tile-index-cache\";\n\nexport type TileShapes = {\n get: (xyz: vec3) => vec3[];\n};\n\nexport const createTileShapes = (elevation: Elevation) => {\n const cache = createTileIndexCache<vec3[]>({\n max: 10000,\n ttl: 1000,\n });\n\n const corners = [\n [0, 0],\n [1, 0],\n [1, 1],\n [0, 1],\n ];\n const get = (xyz: vec3) => {\n const cached = cache.get(xyz);\n if (cached) return cached;\n\n const [x = 0, y = 0, z = 0] = xyz;\n const result = corners\n .map<vec3>(([u = 0, v = 0]) => [x + u, y + v, z])\n .map(_ => tileToMercator(_, _))\n .map(_ => geodetic(_, _))\n .map(_ => {\n const [lng = 0, lat = 0] = _;\n const elevationZ = Math.max(z - 5, 0);\n return mercator(\n vec3.set(_, lng, lat, elevation.get([lng, lat], elevationZ)),\n _,\n );\n });\n cache.set(xyz, result);\n return result;\n };\n\n return { get } satisfies TileShapes;\n};\n","#version 300 es\n\nprecision highp float;\n\nuniform mat4 projection;\nuniform mat4 model_view;\nuniform ivec3 xyz;\nuniform ivec3 camera;\nuniform sampler2D terrain;\nuniform int downsample_imagery;\nuniform int downsample_terrain;\nuniform vec4 color;\n\nin vec3 uvw;\nout vec2 uv;\nout vec4 color_out;\n\nconst int ONE = 1073741824; // 2^30\nconst float INV_ONE = 1. / float(ONE);\nconst float CIRCUMFERENCE = 40075017.;\n\nvec2 downsample(int downsample) {\n float k = pow(2., float(downsample));\n return (mod(vec2(xyz.xy), k) + uvw.xy) / k;\n}\n\nvoid main(void) {\n vec4 e = texture(terrain, downsample(downsample_terrain));\n float t = (((256. * 256. * 255. * e.r) + (256. * 255. * e.g) + (255. * e.b)) / 10. - 10000.) / CIRCUMFERENCE;\n\n int k = int(pow(2., float(xyz.z)));\n ivec3 q = ivec3(uvw * float(ONE / k)) + ivec3(xyz.xy * (ONE / k), int(t * float(ONE)));\n gl_Position = projection * model_view * vec4(vec3(q - camera) * INV_ONE, 1.);\n\n uv = downsample(downsample_imagery);\n color_out = color;\n}\n","import type { mat4 } from \"gl-matrix\";\nimport { vec2, vec3, vec4 } from \"gl-matrix\";\n\nimport { createBuffer } from \"../../buffer\";\nimport { range } from \"../../common\";\nimport { createElevation } from \"../../elevation\";\nimport { createProgram } from \"../../program\";\nimport type { Viewport } from \"../../viewport\";\nimport type { World } from \"../../world\";\nimport type { LayerOptions } from \"..\";\nimport { type BaseLayer, type Terrain } from \"..\";\nimport { configure, to } from \"../common\";\nimport depthSource from \"../depth.glsl\";\nimport fragmentSource from \"./fragment.glsl\";\nimport type { Texture } from \"./texture\";\nimport type { TileCache } from \"./tile-cache\";\nimport { createTileCache } from \"./tile-cache\";\nimport type { TileDownsampler } from \"./tile-downsampler\";\nimport { createTileDownsampler } from \"./tile-downsampler\";\nimport { createTileShapes } from \"./tile-shapes\";\nimport vertexSource from \"./vertex.glsl\";\n\nconst n = 34;\n\nconst maxZ = 22;\n\nconst indices = range(0, n).flatMap(y =>\n range(0, n).flatMap(x => [\n y * (n + 1) + x,\n y * (n + 1) + x + 1,\n (y + 1) * (n + 1) + x + 1,\n y * (n + 1) + x,\n (y + 1) * (n + 1) + x + 1,\n (y + 1) * (n + 1) + x,\n ]),\n);\n\nconst skirt = 0.1;\nconst uvw = range(0, n + 1).flatMap(y =>\n range(0, n + 1).map(x => {\n let u = (x - 1) / (n - 2);\n let v = (y - 1) / (n - 2);\n let w = 0;\n if (x === 0) {\n u = 0;\n w = -skirt;\n }\n if (x === n) {\n u = 1;\n w = -skirt;\n }\n if (y === 0) {\n v = 0;\n w = -skirt;\n }\n if (y === n) {\n v = 1;\n w = -skirt;\n }\n\n return [u, v, w] as vec3;\n }),\n);\n\nexport type TerrainLayer = BaseLayer & Terrain;\n\nexport const createTerrainLayer = (\n world: World,\n terrain: Partial<Terrain> = {},\n) => {\n const { gl } = world;\n let { options, terrainUrl, color } = {\n options: {},\n terrainUrl: \"\",\n imageryUrl: \"\",\n color: [1, 1, 1, 1],\n ...terrain,\n } satisfies Terrain;\n const { imageryUrl = \"\" } = terrain;\n\n let imageryCache: TileCache | undefined;\n let imageryDownsampler: TileDownsampler | undefined;\n\n const updateImageryUrl = (imageryUrl: string) => {\n imageryCache?.dispose();\n imageryCache = createTileCache({\n gl,\n urlPattern: imageryUrl,\n onLoad: () => {\n const extension = gl.getExtension(\"EXT_texture_filter_anisotropic\");\n if (extension) {\n const max = gl.getParameter(extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT);\n gl.texParameterf(\n gl.TEXTURE_2D,\n extension.TEXTURE_MAX_ANISOTROPY_EXT,\n max,\n );\n }\n gl.texParameteri(\n gl.TEXTURE_2D,\n gl.TEXTURE_MIN_FILTER,\n gl.LINEAR_MIPMAP_LINEAR,\n );\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.generateMipmap(gl.TEXTURE_2D);\n },\n });\n imageryDownsampler = createTileDownsampler(imageryCache);\n };\n updateImageryUrl(imageryUrl);\n\n const terrainCache = createTileCache({\n gl,\n urlPattern: terrainUrl,\n onLoad: () => {\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n },\n });\n\n const terrainDownsampler = createTileDownsampler(terrainCache, 3);\n const elevation = createElevation({ gl, terrainCache });\n const tileShapes = createTileShapes(elevation);\n\n const { renderProgram, depthProgram } = createPrograms(gl);\n\n const q = [0, 1, 2, 3];\n const vec3s = q.map(vec3.create);\n const vec4s = q.map(vec4.create);\n const vec2s = q.map(vec2.create);\n\n const calculateVisibleTiles = (viewport: Viewport) => {\n const { camera, worldToLocal, localToClip, clipToScreen } = viewport;\n\n const divide: (xyz: vec3) => vec3[] = xyz => {\n const [x = 0, y = 0, z = 0] = xyz;\n const shape = tileShapes.get(xyz);\n let split = insideTileShape(camera, shape);\n if (!split) {\n const clip = shape\n .map((_, i) => worldToLocal(_, vec3s[i]))\n .map((_, i) => localToClip(_, vec4s[i]));\n if (clipped(clip)) return [];\n const size = screenSize(clip.map((_, i) => clipToScreen(_, vec2s[i])));\n split = size > 512 / devicePixelRatio;\n }\n if (split && z < maxZ) {\n const divided: vec3[] = [\n [2 * x, 2 * y, z + 1],\n [2 * x + 1, 2 * y, z + 1],\n [2 * x, 2 * y + 1, z + 1],\n [2 * x + 1, 2 * y + 1, z + 1],\n ];\n return divided.flatMap(_ => divide(_));\n } else return [xyz];\n };\n\n return divide([0, 0, 0]);\n };\n\n const render = ({\n viewport,\n depth = false,\n index = 0,\n }: {\n viewport: Viewport;\n depth?: boolean;\n index?: number;\n }) => {\n if (configure(gl, depth, options)) return;\n const program = depth ? depthProgram : renderProgram;\n const { projection, modelView, camera } = viewport;\n const visible = calculateVisibleTiles(viewport);\n\n for (const xyz of visible) {\n const downsampledImagery = depth\n ? undefined\n : imageryDownsampler?.get(xyz);\n const downsampledTerrain = terrainDownsampler.get(xyz);\n if ((!depth && !downsampledImagery) || !downsampledTerrain) continue;\n const { texture: terrain, downsample: downsampleTerrain } =\n downsampledTerrain;\n const { texture: imagery = terrain, downsample: downsampleImagery = 0 } =\n downsampledImagery ?? {};\n\n program.execute({\n projection,\n modelView,\n camera: to(camera),\n xyz,\n imagery,\n terrain,\n downsampleImagery,\n downsampleTerrain,\n color,\n index,\n });\n }\n };\n\n const dispose = () => {\n depthProgram.dispose();\n renderProgram.dispose();\n imageryCache?.dispose();\n terrainCache.dispose();\n elevation.dispose();\n world.remove(layer);\n };\n\n const layer = {\n render,\n dispose,\n get options() {\n return options;\n },\n set options(_: Partial<LayerOptions>) {\n options = _;\n },\n get terrainUrl() {\n return terrainUrl;\n },\n set terrainUrl(_: string) {\n terrainUrl = _;\n },\n get imageryUrl() {\n return imageryUrl;\n },\n set imageryUrl(_: string) {\n updateImageryUrl(_);\n },\n get color() {\n return color;\n },\n set color(_: vec4) {\n color = _;\n },\n } satisfies TerrainLayer;\n\n world.add(layer);\n\n return layer;\n};\n\nconst createPrograms = (gl: WebGL2RenderingContext) => {\n const createRenderProgram = (depth = false) => {\n const program = createProgram({\n gl,\n vertexSource,\n fragmentSource: depth ? depthSource : fragmentSource,\n });\n\n const uvwBuffer = createBuffer({ gl, type: \"f32\", target: \"array\" });\n uvwBuffer.set(uvw.flatMap(([x = 0, y = 0, z = 0]) => [x, y, z]));\n\n const indexBuffer = createBuffer({ gl, type: \"u16\", target: \"element\" });\n indexBuffer.set(indices);\n\n const uvwAttribute = program.attribute3f(\"uvw\", uvwBuffer);\n\n const projectionUniform = program.uniformMatrix4f(\"projection\");\n const modelViewUniform = program.uniformMatrix4f(\"model_view\");\n const imageryUniform = program.uniform1i(\"imagery\");\n const terrainUniform = program.uniform1i(\"terrain\");\n const downsampleImageryUniform = program.uniform1i(\"downsample_imagery\");\n const downsampleTerrainUniform = program.uniform1i(\"downsample_terrain\");\n const colorUniform = program.uniform4f(\"color\");\n const xyzUniform = program.uniform3i(\"xyz\");\n const cameraUniform = program.uniform3i(\"camera\");\n const indexUniform = program.uniform1i(\"index\");\n\n const execute = ({\n projection,\n modelView,\n camera,\n xyz,\n imagery,\n terrain,\n downsampleImagery,\n downsampleTerrain,\n color,\n index,\n }: {\n projection: mat4;\n modelView: mat4;\n camera: vec3;\n xyz: vec3;\n imagery: Texture;\n terrain: Texture;\n downsampleImagery: number;\n downsampleTerrain: number;\n color: vec4;\n index: number;\n }) => {\n program.use();\n\n uvwAttribute.use();\n\n projectionUniform.set(projection);\n modelViewUniform.set(modelView);\n xyzUniform.set(xyz);\n cameraUniform.set(camera);\n downsampleImageryUniform.set(downsampleImagery);\n downsampleTerrainUniform.set(downsampleTerrain);\n colorUniform.set(color);\n indexUniform.set(index);\n\n gl.activeTexture(gl.TEXTURE0);\n imageryUniform.set(0);\n imagery.use();\n\n gl.activeTexture(gl.TEXTURE1);\n terrainUniform.set(1);\n terrain.use();\n\n indexBuffer.use();\n gl.drawElements(gl.TRIANGLES, n * n * 2 * 3, gl.UNSIGNED_SHORT, 0);\n };\n\n const dispose = () => {\n uvwBuffer.dispose();\n indexBuffer.dispose();\n program.dispose();\n };\n\n return { execute, dispose };\n };\n\n const renderProgram = createRenderProgram();\n const depthProgram = createRenderProgram(true);\n\n return { renderProgram, depthProgram };\n};\n\nconst insideTileShape = (position: vec3, shape: vec3[]) => {\n const [minX, maxX, minY, maxY] = shape.reduce(\n ([minX, maxX, minY, maxY], [x = 0, y = 0]) => [\n Math.min(x, minX),\n Math.max(x, maxX),\n Math.min(y, minY),\n Math.max(y, maxY),\n ],\n [1, 0, 1, 0],\n );\n const [x = 0, y = 0, z = 0] = position;\n return (\n x > minX && x < maxX && y > minY && y < maxY && z > 0 && z < maxX - minX\n );\n};\n\nconst clipped = (clip: vec4[]) =>\n clip.every(([x = 0, , , w = 0]) => x > w) ||\n clip.every(([x = 0, , , w = 0]) => x < -w) ||\n clip.every(([, y = 0, , w = 0]) => y > w) ||\n clip.every(([, y = 0, , w = 0]) => y < -w) ||\n clip.every(([, , z = 0, w = 0]) => z > w) ||\n clip.every(([, , z = 0, w = 0]) => z < -w) ||\n clip.every(([, , , w = 0]) => w < 0);\n\nconst screenSize = (screen: vec2[]) =>\n Math.sqrt(\n screen\n .map((_, i) =>\n vec2.squaredDistance(\n screen[i] ?? [0, 0],\n screen[(i + 1) % screen.length] ?? [0, 0],\n ),\n )\n .reduce((a, b) => a + b, 0) / screen.length,\n );\n","import { quat, vec3, vec4 } from \"gl-matrix\";\n\nimport { geodetic, mercator, toOrientation, toQuaternion } from \"./math\";\n\nconst k = 10;\n\nexport type Transition<T> = {\n value: T;\n dispose: () => void;\n};\n\nexport const createTransition = <T>(\n step: (_: { time: number; current: T; target: T }) => T,\n) => {\n let running = true;\n let target: T | undefined;\n let current: T | undefined;\n let last: number | undefined;\n\n const frame = () => {\n if (!running) return;\n requestAnimationFrame(frame);\n\n const now = performance.now();\n const time = (now - (last ?? now)) / 1000;\n last = now;\n\n if (time > 1) {\n current = target;\n target = undefined;\n }\n\n if (!current || !target) return;\n\n current = step({ time, current, target });\n };\n requestAnimationFrame(frame);\n\n const dispose = () => {\n running = false;\n };\n\n return {\n get value() {\n return current;\n },\n set value(_: T | undefined) {\n if (!current || !_) current = _;\n target = _;\n },\n dispose,\n };\n};\n\nexport const createNumberTransition = (\n update?: (_: number, target: number) => void,\n) =>\n createTransition<number>(({ time, current, target }) => {\n current = current + (target - current) * k * time;\n update?.(current, target);\n return current;\n });\n\nexport const createColorTransition = (\n update?: (_: vec4, target: vec4) => void,\n) =>\n createTransition<vec4>(({ time, current, target }) => {\n current = vec4.add(\n vec4.create(),\n current,\n vec4.scale(\n vec4.create(),\n vec4.sub(vec4.create(), target, current),\n k * time,\n ),\n );\n update?.(current, target);\n return current;\n });\n\nexport const createPositionTransition = (\n update?: (_: vec3, target: vec3) => void,\n) =>\n createTransition<vec3>(({ time, current, target }) => {\n if (time > 1) console.log(time);\n current = geodetic(\n vec3.add(\n vec3.create(),\n mercator(current),\n vec3.scale(\n vec3.create(),\n vec3.sub(vec3.create(), mercator(target), mercator(current)),\n k * time,\n ),\n ),\n );\n update?.(current, target);\n return current;\n });\n\nexport const createPositionVelocityTransition = (\n update?: (_: vec3, target: vec3) => void,\n) => {\n let velocity: vec3 = [0, 0, 0];\n let targetVelocity: vec3 = [0, 0, 0];\n let last: vec3 | undefined;\n let lastTime: number | undefined;\n\n return createTransition<vec3>(({ time, current, target }) => {\n if (target === current || time > 1) {\n last = undefined;\n velocity = [0, 0, 0];\n targetVelocity = [0, 0, 0];\n return current;\n }\n\n if (!last) {\n last = target;\n lastTime = time;\n } else if (target !== last && lastTime !== undefined) {\n targetVelocity = vec3.scale(\n vec3.create(),\n vec3.sub(vec3.create(), mercator(target), mercator(last)),\n 1000 / (performance.now() - lastTime),\n );\n last = target;\n lastTime = performance.now();\n }\n\n const nextVelocity = vec3.add(\n vec3.create(),\n velocity,\n vec3.scale(\n vec3.create(),\n vec3.sub(vec3.create(), targetVelocity, velocity),\n 2 * time,\n ),\n );\n\n current = geodetic(\n vec3.add(\n vec3.create(),\n mercator(current),\n vec3.add(\n vec3.create(),\n vec3.scale(\n vec3.create(),\n vec3.add(vec3.create(), velocity, nextVelocity),\n 0.5 * time,\n ),\n vec3.scale(\n vec3.create(),\n vec3.sub(vec3.create(), mercator(target), mercator(current)),\n time,\n ),\n ),\n ),\n );\n\n velocity = nextVelocity;\n\n update?.(current, target);\n\n return current;\n });\n};\n\nexport const createOrientationTransition = (\n update?: (_: vec3, target: vec3) => void,\n) =>\n createTransition<vec3>(({ time, current, target }) => {\n const value = toOrientation(\n quat.slerp(\n quat.create(),\n toQuaternion(current),\n toQuaternion(target),\n 2 * time,\n ),\n );\n update?.(value, target);\n return value;\n });\n","import { quat, vec2, vec3 } from \"gl-matrix\";\n\nimport { circumference, mercator, toOrientation, toQuaternion } from \"./math\";\nimport type { View } from \"./model\";\nimport type { World } from \"./world\";\n\nconst k = 10;\n\nexport type ViewTransition = {\n view: Partial<View>;\n dispose: () => void;\n};\n\nexport const createViewTransition = (world: World) => {\n let running = true;\n let target: Partial<View> = {};\n let last: number | undefined;\n\n const frame = () => {\n if (!running) return;\n requestAnimationFrame(frame);\n\n const now = performance.now();\n const time = (now - (last ?? now)) / 1000;\n last = now;\n\n const epsilon = 1e-3;\n\n const view = { ...world.view };\n\n if (target.target) {\n if (!target.distance) target.distance = view.distance;\n const delta = vec3.sub(vec3.create(), target.target, view.target);\n const finished = vec3.length(delta) * circumference < 1e-3;\n view.target = finished\n ? target.target\n : vec3.scaleAndAdd(vec3.create(), view.target, delta, k * time);\n if (finished) target.target = undefined;\n }\n\n if (target.offset) {\n const delta = vec2.sub(vec2.create(), target.offset, view.offset);\n const finished = vec2.length(delta) < epsilon;\n view.offset = finished\n ? target.offset\n : vec2.scaleAndAdd(vec2.create(), view.offset, delta, k * time);\n if (finished) target.offset = undefined;\n }\n\n const flyDistance =\n target.target !== undefined\n ? vec3.distance(mercator(target.target), mercator(view.target)) *\n circumference\n : undefined;\n\n const goalDistance = Math.max(\n ...[flyDistance, target.distance ?? view.distance, 0].filter(\n (_): _ is number => _ !== undefined,\n ),\n );\n\n if (goalDistance) {\n const delta = goalDistance - view.distance;\n const finished = Math.abs(delta) / 10000 < epsilon;\n view.distance = finished\n ? goalDistance\n : view.distance + delta * k * time;\n if (finished) target.distance = undefined;\n }\n\n if (target.orientation) {\n const goalOrientation = toQuaternion(target.orientation);\n const viewOrientation = toQuaternion(view.orientation);\n const finished =\n quat.getAngle(goalOrientation, viewOrientation) < epsilon;\n const orientation = toOrientation(\n finished\n ? goalOrientation\n : quat.slerp(\n quat.create(),\n viewOrientation,\n goalOrientation,\n k * time,\n ),\n );\n view.orientation = orientation;\n if (finished) target.orientation = undefined;\n }\n\n if (target.fieldOfView !== undefined) {\n const delta = target.fieldOfView - view.fieldOfView;\n const finished = Math.abs(delta) < epsilon;\n const fieldOfView = finished\n ? target.fieldOfView\n : view.fieldOfView + delta * k * time;\n view.fieldOfView = fieldOfView;\n if (finished) target.fieldOfView = fieldOfView;\n }\n\n world.view = view;\n };\n\n requestAnimationFrame(frame);\n\n const dispose = () => {\n running = false;\n };\n\n return {\n set view(_: Partial<View>) {\n target = _;\n },\n get view() {\n return target;\n },\n dispose,\n } satisfies ViewTransition;\n};\n","import type { vec2 } from \"gl-matrix\";\n\nexport type DepthBuffer = {\n use: () => void;\n resize: (size: vec2) => void;\n read: (pixel: vec2) => readonly [z: number, n: number];\n dispose: () => void;\n};\n\nexport const createDepthBuffer = (gl: WebGL2RenderingContext) => {\n const targetTexture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, targetTexture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\n const renderbuffer = gl.createRenderbuffer();\n gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer);\n\n const framebuffer = gl.createFramebuffer();\n\n const use = () => gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n\n use();\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n targetTexture,\n 0,\n );\n gl.framebufferRenderbuffer(\n gl.FRAMEBUFFER,\n gl.DEPTH_ATTACHMENT,\n gl.RENDERBUFFER,\n renderbuffer,\n );\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\n let height = 0;\n const resize = ([width = 0, _height = 0]: vec2) => {\n height = _height;\n gl.bindTexture(gl.TEXTURE_2D, targetTexture);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n width,\n height,\n 0,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n null,\n );\n\n gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer);\n gl.renderbufferStorage(\n gl.RENDERBUFFER,\n gl.DEPTH_COMPONENT16,\n width,\n height,\n );\n };\n\n const buffer = new Uint8Array(4);\n const read = ([x = 0, y = 0]: vec2) => {\n use();\n gl.readPixels(x, height - y, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, buffer);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\n const [r = 0, g = 0, b = 0, a = 0] = buffer;\n const zo = (r * 256 + g) / (256 * 256 - 1);\n const z = 2 * zo - 1;\n const n = b * 256 + a;\n\n return [z, n] as const;\n };\n\n const dispose = () => {\n gl.deleteTexture(targetTexture);\n gl.deleteFramebuffer(framebuffer);\n gl.deleteRenderbuffer(renderbuffer);\n };\n\n return {\n use,\n resize,\n read,\n dispose,\n } satisfies DepthBuffer;\n};\n","import { mat4, vec2, vec3, vec4 } from \"gl-matrix\";\n\nimport { circumference, mercator, quadratic, radians } from \"./math\";\nimport type { View } from \"./model\";\n\nexport type Viewport = {\n camera: vec3;\n screen: vec2;\n projection: mat4;\n modelView: mat4;\n fieldScale: number;\n scale: (_: number) => Viewport;\n screenToClip: (_: vec2, out?: vec4) => vec4;\n clipToScreen: (_: vec4, out?: vec2) => vec2;\n clipToLocal: (_: vec4, out?: vec3) => vec3;\n localToClip: (_: vec3, out?: vec4) => vec4;\n localToWorld: (_: vec3, out?: vec3) => vec3;\n worldToLocal: (_: vec3, out?: vec3) => vec3;\n};\n\nconst matrix = mat4.create();\nconst vector = vec4.create();\n\nexport const createViewport: (view: View) => Viewport = view => {\n const { target, offset, screen, orientation, fieldOfView } = view;\n const [width = 0, height = 0] = screen;\n const [ox = 0, oy = 0] = offset;\n const [pitch = 0, roll = 0, yaw = 0] = orientation;\n const fieldScale =\n Math.tan(radians(45) / 2) / Math.tan(radians(fieldOfView) / 2);\n const z = (view.distance / circumference) * fieldScale;\n const near = z / 100;\n const far = z * 1000000;\n\n const projection = mat4.create();\n mat4.identity(projection);\n mat4.perspective(projection, radians(fieldOfView), width / height, near, far);\n mat4.scale(projection, projection, [1, -1, 1]);\n\n const modelView = mat4.create();\n mat4.identity(modelView);\n mat4.rotateX(modelView, modelView, pitch);\n mat4.rotateY(modelView, modelView, roll);\n mat4.rotateZ(modelView, modelView, yaw);\n\n const transform = mat4.multiply(matrix, projection, modelView);\n const inverse = mat4.invert(mat4.create(), transform);\n\n const scale = (scale: number) => {\n const screen: vec2 = [width * scale, height * scale];\n const offset: vec2 = [ox * scale, oy * scale];\n return createViewport({ ...view, offset, screen });\n };\n\n const screenToClip = (\n [screenX = 0, screenY = 0]: vec2,\n out = vec4.create(),\n ) => {\n const x = (2 * screenX) / width - 1;\n const y = -((2 * screenY) / height - 1);\n return vec4.set(out, x, y, 0, 1);\n };\n\n const clipToScreen = ([x = 0, y = 0, , w = 0]: vec4, out = vec2.create()) =>\n vec2.set(out, (1 + x / w) * width * 0.5, (1 - y / w) * height * 0.5);\n\n const clipToLocal = (v: vec4, out = vec3.create()) => {\n const [x = 0, y = 0, z = 0, w = 0] = vec4.transformMat4(vector, v, inverse);\n return vec3.set(out, x / w, y / w, z / w);\n };\n\n const localToClip = ([x = 0, y = 0, z = 0]: vec3, out = vec4.create()) =>\n vec4.transformMat4(out, vec4.set(out, x, y, z, 1), transform);\n\n const [cx = 0, cy = 0] = screenToClip([ox + width / 2, oy + height / 2]);\n const [ax = 0, ay = 0, az = 0] = clipToLocal([cx, cy, -1, 1]);\n const [bx = 0, by = 0, bz = 0] = clipToLocal([cx, cy, 1.00001, 1]);\n\n const [t1 = 0] = quadratic(\n (bx - ax) * (bx - ax) + (by - ay) * (by - ay) + (bz - az) * (bz - az),\n ax * (bx - ax) + ay * (by - ay) + az * (bz - az),\n ax * ax +\n ay * ay +\n az * az -\n ((view.distance * view.distance) / circumference / circumference) *\n fieldScale *\n fieldScale,\n );\n\n if (isNaN(t1)) throw new Error(\"Unexpected\");\n\n const local: vec3 = [\n ax + t1 * (bx - ax),\n ay + t1 * (by - ay),\n az + t1 * (bz - az),\n ];\n\n const camera = vec3.sub(vec3.create(), mercator(target), local);\n\n const localToWorld = (v: vec3, out = vec3.create()) =>\n vec3.add(out, v, camera);\n\n const worldToLocal = (v: vec3, out = vec3.create()) =>\n vec3.sub(out, v, camera);\n\n return {\n camera,\n screen,\n projection,\n modelView,\n fieldScale,\n scale,\n screenToClip,\n clipToScreen,\n clipToLocal,\n localToClip,\n localToWorld,\n worldToLocal,\n };\n};\n","import type { vec2 } from \"gl-matrix\";\nimport { glMatrix, vec3 } from \"gl-matrix\";\n\nimport { createDepthBuffer } from \"./depth-buffer\";\nimport type { Layer } from \"./layers\";\nimport { circumference, geodetic, mercator } from \"./math\";\nimport type { View } from \"./model\";\nimport { createViewport } from \"./viewport\";\n\nglMatrix.setMatrixArrayType(Array); // Required for precision\n\ntype Pick = {\n screen: vec2;\n position: vec3;\n layer: Layer | undefined;\n};\n\nexport type World = {\n readonly canvas: HTMLCanvasElement;\n readonly gl: WebGL2RenderingContext;\n set view(_: View);\n get view(): View;\n add: (layer: Layer) => void;\n remove: (layer: Layer) => void;\n project: (_: vec3) => vec2;\n unproject: (_: vec2) => vec3;\n recenter: ([x, y]: [number, number]) => void;\n pick: ([x, y]: [number, number]) => Pick;\n dispose: () => void;\n};\n\nexport const createWorld = (canvas: HTMLCanvasElement) => {\n let running = true;\n let view: View = {\n target: [0, 0, 0],\n screen: [0, 0],\n offset: [0, 0],\n distance: circumference,\n orientation: [0, 0, 0],\n fieldOfView: 45,\n };\n\n const gl = canvas.getContext(\"webgl2\", {\n antialias: true,\n });\n if (!gl) throw new Error(\"No WebGL2\");\n\n gl.enable(gl.CULL_FACE);\n gl.cullFace(gl.FRONT);\n\n let layers: Layer[] = [];\n\n const depthBuffer = createDepthBuffer(gl);\n\n const resize = (screen: vec2) => {\n let [width = 0, height = 0] = screen;\n width = width || 1;\n height = height || 1;\n view.screen = [width, height];\n canvas.width = width * devicePixelRatio;\n canvas.height = height * devicePixelRatio;\n depthBuffer.resize([canvas.width, canvas.height]);\n };\n\n resize([canvas.clientWidth, canvas.clientHeight]);\n\n const resizer = new ResizeObserver(([entry]) => {\n if (!entry) return;\n const { contentRect } = entry;\n const { width, height } = contentRect;\n resize([width, height]);\n });\n resizer.observe(canvas);\n\n const clear = ([width = 0, height = 0]: vec2) => {\n gl.viewport(0, 0, width * devicePixelRatio, height * devicePixelRatio);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n };\n\n const render = () => {\n const viewport = createViewport(view);\n clear(viewport.screen);\n\n layers.forEach(_ => _.render({ viewport }));\n };\n\n const depth = () => {\n const viewport = createViewport(view);\n clear(viewport.screen);\n layers.forEach((_, i) => _.render({ viewport, depth: true, index: i + 1 }));\n };\n\n const frame = () => {\n if (!running) return;\n render();\n requestAnimationFrame(frame);\n };\n\n requestAnimationFrame(frame);\n\n const project = (_: vec3) => {\n const { worldToLocal, localToClip, clipToScreen } = createViewport(view);\n return clipToScreen(localToClip(worldToLocal(mercator(_))));\n };\n\n const unproject = (_: vec2) => {\n const { localToWorld, clipToLocal, screenToClip } = createViewport(view);\n return geodetic(localToWorld(clipToLocal(screenToClip(_))));\n };\n\n const pick = (screen: vec2) => {\n const [screenX = 0, screenY = 0] = screen;\n const { screenToClip, clipToLocal, localToWorld } = createViewport(view);\n\n depthBuffer.use();\n\n depth();\n\n const [z, index] = depthBuffer.read([\n screenX * devicePixelRatio,\n screenY * devicePixelRatio,\n ]);\n\n const [x = 0, y = 0] = screenToClip([screenX, screenY]);\n const position = geodetic(localToWorld(clipToLocal([x, y, z, 1])));\n\n const layer = index === 0 ? undefined : layers[index - 1];\n\n return { screen, position, layer };\n };\n\n const recenter = ([cx = 0, cy = 0]: vec2) => {\n const { camera, fieldScale } = createViewport(view);\n const { position: target, layer } = pick([cx, cy]);\n if (!layer) return;\n const distance =\n (vec3.distance(mercator(target), camera) * circumference) / fieldScale;\n const [width = 0, height = 0] = view.screen;\n const offset: vec2 = [cx - width / 2, cy - height / 2];\n view = {\n ...view,\n offset,\n target,\n distance,\n };\n };\n\n const add = (layer: Layer) => {\n layers = [...layers, layer];\n };\n\n const remove = (layer: Layer) => {\n layers = layers.filter(_ => _ !== layer);\n };\n\n const dispose = () => {\n running = false;\n resizer.unobserve(canvas);\n layers.forEach(_ => _.dispose());\n depthBuffer.dispose();\n };\n\n return {\n canvas,\n gl,\n get view() {\n return view;\n },\n set view(_: View) {\n view = _;\n },\n add,\n remove,\n project,\n unproject,\n recenter,\n pick,\n dispose,\n } satisfies World;\n};\n"],"names":["debounce","f","delay","timeout","args","range","start","end","_","k","EPSILON","ARRAY_TYPE","setMatrixArrayType","type","y","i","create","out","glMatrix.ARRAY_TYPE","identity","invert","a","a00","a01","a02","a03","a10","a11","a12","a13","a20","a21","a22","a23","a30","a31","a32","a33","b00","b01","b02","b03","b04","b05","b06","b07","b08","b09","b10","b11","det","multiply","b","b0","b1","b2","b3","scale","v","x","z","rotateX","rad","s","c","rotateY","rotateZ","fromQuat","q","w","x2","y2","z2","xx","yx","yy","zx","zy","zz","wx","wy","wz","perspectiveNO","fovy","aspect","near","far","nf","perspective","length","fromValues","set","add","subtract","scaleAndAdd","distance","normalize","len","dot","cross","ax","ay","az","bx","by","bz","sub","vec","stride","offset","count","fn","arg","l","transformMat4","m","setAxisAngle","axis","getAngle","dotproduct","slerp","t","aw","bw","omega","cosom","sinom","scale0","scale1","glMatrix.EPSILON","fromMat3","fTrace","fRoot","j","vec4.dot","vec4.normalize","tmpvec3","vec3.create","xUnitVec3","vec3.fromValues","yUnitVec3","vec3.dot","vec3.cross","vec3.len","vec3.normalize","temp1","temp2","d","matr","mat3.create","view","right","up","squaredDistance","circumference","radians","degrees","quadratic","mercator","lng","lat","alt","vec3.set","geodetic","tileToMercator","toQuaternion","pitch","yaw","roll","cy","sy","cp","sp","cr","sr","toOrientation","minimumDistance","createMouseControl","canvas","world","enabled","draggable","rotatable","zooming","recentered","onMouseDown","onMouseMove","buttons","movementX","movementY","width","height","orientation","clearZooming","onWheel","deltaY","onContextMenu","event","createBuffer","gl","target","buffer","glTarget","use","value","createProgram","vertexSource","fragmentSource","program","vertexShader","compileShader","fragmentShader","uniform","name","location","cached","uniform1f","uniform1i","uniform2f","uniform2i","uniform3f","uniform3i","uniform4f","uniform4i","uniformMatrix4f","attribute","size","options","shader","source","one","to","configure","_depth","pickable","depth","polygonOffset","depth_default","worker","createImageLoadWorker","createImageLoad","url","onLoad","loaded","handler","data","canceled","cancel","createTexture","texture","createImageTexture","imageLoad","image","attach","fragment_default","vertex_default","createBillboardLayer","billboard","position","color","minSizePixels","maxSizePixels","imageSize","cornerBuffer","uvBuffer","indexBuffer","update","renderProgram","depthProgram","createPrograms","layer","projection","modelView","camera","screen","index","createRenderProgram","depthSource","cornerAttribute","uvAttribute","projectionUniform","modelViewUniform","cameraUniform","screenUniform","imageUniform","imageSizeUniform","positionUniform","colorUniform","indexUniform","sizeUniform","minSizePixelsUniform","maxSizePixelsUniform","execute","dispose","createLineLayer","line","points","minWidthPixels","maxWidthPixels","positionBuffer","render","updatePoints","positionData","first","last","indexData","indices","cornerData","FLOAT_BYTES","INT_BYTES","previousAttribute","currentAttribute","nextAttribute","widthUniform","maxWidthPixelsUniform","minWidthPixelsUniform","createMeshLayer","mesh","vertices","vertexBuffer","mat4.fromQuat","mat4.create","updateVertices","updateIndices","vertexAttribute","orientationUniform","L","F","J","G","U","K","Q","W","O","P","R","C","M","Z","A","N","h","E","D","T","V","$","I","H","Y","S","u","g","o","B","X","createPolygonLayer","polygon","earclip","positionAttribute","createTileDownsampler","cache","initialDownsample","downsample","xyz","perf","warned","PROCESS","emitWarning","msg","code","AC","AS","warnACPolyfill","reason","printACPolyfillWarning","shouldWarn","isPosInt","n","getUintArray","max","ZeroArray","Stack","#constructing","HeapCls","LRUCache","#max","#maxSize","#dispose","#disposeAfter","#fetchMethod","#size","#calculatedSize","#keyMap","#keyList","#valList","#next","#prev","#head","#tail","#free","#disposed","#sizes","#starts","#ttls","#hasDispose","#hasFetchMethod","#hasDisposeAfter","p","#isBackgroundFetch","context","#backgroundFetch","#moveToTail","#indexes","#rindexes","#isStale","ttl","ttlResolution","ttlAutopurge","updateAgeOnGet","updateAgeOnHas","allowStale","disposeAfter","noDisposeOnSet","noUpdateTTL","maxSize","maxEntrySize","sizeCalculation","fetchMethod","noDeleteOnFetchRejection","noDeleteOnStaleGet","allowStaleOnFetchRejection","allowStaleOnFetchAbort","ignoreFetchAbort","UintArray","#initializeSizeTracking","#initializeTTLTracking","key","ttls","starts","#setItemTTL","#updateItemAge","#statusTTL","status","cachedNow","getNow","age","sizes","#removeItemSize","#requireSize","#addItemSize","#evict","_i","_s","_st","_k","_v","#isValidIndex","getOptions","thisp","deleted","entry","remain","arr","setOptions","oldVal","oldValue","dt","task","val","free","head","hasOptions","peekOptions","ac","signal","fetchOpts","cb","updateCache","aborted","ignoreAbort","fetchFail","bf","eb","er","allowStaleAborted","noDelete","pcall","res","rej","fmp","fetchOptions","forceRefresh","stale","isStale","staleVal","fetching","#connect","pi","ni","createTileIndexCache","fromKey","toKey","defaultZ","createElevation","terrainCache","tileCache","downsampler","framebuffer","downsampleBuffer","tile","px","py","downsampled","k2","r","createTileCache","urlPattern","tiles","loading","get","interval","createTileShapes","elevation","corners","result","elevationZ","maxZ","skirt","uvw","createTerrainLayer","terrain","terrainUrl","imageryUrl","imageryCache","imageryDownsampler","updateImageryUrl","extension","terrainDownsampler","tileShapes","vec3s","vec4s","vec4.create","vec2s","vec2.create","calculateVisibleTiles","viewport","worldToLocal","localToClip","clipToScreen","divide","shape","split","insideTileShape","clip","clipped","screenSize","visible","downsampledImagery","downsampledTerrain","downsampleTerrain","imagery","downsampleImagery","uvwBuffer","uvwAttribute","imageryUniform","terrainUniform","downsampleImageryUniform","downsampleTerrainUniform","xyzUniform","minX","maxX","minY","maxY","vec2.squaredDistance","createTransition","step","running","current","frame","now","time","createNumberTransition","createColorTransition","vec4.add","vec4.scale","vec4.sub","createPositionTransition","vec3.add","vec3.scale","vec3.sub","createPositionVelocityTransition","velocity","targetVelocity","lastTime","nextVelocity","createOrientationTransition","quat.slerp","quat.create","createViewTransition","epsilon","delta","finished","vec3.length","vec3.scaleAndAdd","vec2.sub","vec2.length","vec2.scaleAndAdd","flyDistance","vec3.distance","goalDistance","goalOrientation","viewOrientation","quat.getAngle","fieldOfView","createDepthBuffer","targetTexture","renderbuffer","resize","_height","matrix","vector","createViewport","ox","oy","fieldScale","mat4.identity","mat4.perspective","mat4.scale","mat4.rotateX","mat4.rotateY","mat4.rotateZ","transform","mat4.multiply","inverse","mat4.invert","screenToClip","screenX","screenY","vec4.set","vec2.set","clipToLocal","vec4.transformMat4","cx","t1","local","glMatrix.setMatrixArrayType","createWorld","layers","depthBuffer","resizer","contentRect","clear","project","unproject","localToWorld","pick"],"mappings":"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","x_google_ignoreList":[1,2,3,4,5,6,7,26,27,32]}
1
+ {"version":3,"file":"index.js","sources":["../src/common.ts","../node_modules/gl-matrix/esm/common.js","../node_modules/gl-matrix/esm/mat3.js","../node_modules/gl-matrix/esm/mat4.js","../node_modules/gl-matrix/esm/vec3.js","../node_modules/gl-matrix/esm/vec4.js","../node_modules/gl-matrix/esm/quat.js","../node_modules/gl-matrix/esm/vec2.js","../src/math.ts","../src/control.ts","../src/buffer.ts","../src/program.ts","../src/layers/common.ts","../src/layers/depth.glsl","../src/image-load.ts","../src/layers/terrain/texture.ts","../src/layers/terrain/image-texture.ts","../src/layers/billboard/fragment.glsl","../src/layers/billboard/vertex.glsl","../src/layers/billboard/index.ts","../src/layers/line/fragment.glsl","../src/layers/line/vertex.glsl","../src/layers/line/index.ts","../src/layers/mesh/fragment.glsl","../src/layers/mesh/vertex.glsl","../src/layers/mesh/index.ts","../node_modules/earclip/dist/earcut.js","../node_modules/earclip/dist/index.js","../src/layers/polygon/fragment.glsl","../src/layers/polygon/vertex.glsl","../src/layers/polygon/index.ts","../src/layers/terrain/tile-downsampler.ts","../node_modules/lru-cache/dist/esm/index.js","../src/layers/terrain/tile-index-cache.ts","../src/elevation.ts","../src/layers/terrain/fragment.glsl","../src/layers/terrain/tile-cache.ts","../src/layers/terrain/tile-shapes.ts","../src/layers/terrain/vertex.glsl","../src/layers/terrain/index.ts","../src/transition.ts","../src/view-transition.ts","../src/depth-buffer.ts","../src/viewport.ts","../src/world.ts"],"sourcesContent":["export const debounce = <F extends (...args: unknown[]) => void>(\n f: F,\n delay: number,\n) => {\n let timeout: number;\n return (...args: Parameters<F>) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => f(args), delay);\n };\n};\n\nexport const range = (start: number, end: number) =>\n Array.from({ length: end - start }, (_, k) => k + start);\n","/**\n * Common utilities\n * @module glMatrix\n */\n// Configuration Constants\nexport var EPSILON = 0.000001;\nexport var ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\nexport var RANDOM = Math.random;\n/**\n * Sets the type of array used when creating new vectors and matrices\n *\n * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\n */\n\nexport function setMatrixArrayType(type) {\n ARRAY_TYPE = type;\n}\nvar degree = Math.PI / 180;\n/**\n * Convert Degree To Radian\n *\n * @param {Number} a Angle in Degrees\n */\n\nexport function toRadian(a) {\n return a * degree;\n}\n/**\n * Tests whether or not the arguments have approximately the same value, within an absolute\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less\n * than or equal to 1.0, and a relative tolerance is used for larger values)\n *\n * @param {Number} a The first number to test.\n * @param {Number} b The second number to test.\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\n */\n\nexport function equals(a, b) {\n return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b));\n}\nif (!Math.hypot) Math.hypot = function () {\n var y = 0,\n i = arguments.length;\n\n while (i--) {\n y += arguments[i] * arguments[i];\n }\n\n return Math.sqrt(y);\n};","import * as glMatrix from \"./common.js\";\n/**\n * 3x3 Matrix\n * @module mat3\n */\n\n/**\n * Creates a new identity mat3\n *\n * @returns {mat3} a new 3x3 matrix\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(9);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n }\n\n out[0] = 1;\n out[4] = 1;\n out[8] = 1;\n return out;\n}\n/**\n * Copies the upper-left 3x3 values into the given mat3.\n *\n * @param {mat3} out the receiving 3x3 matrix\n * @param {ReadonlyMat4} a the source 4x4 matrix\n * @returns {mat3} out\n */\n\nexport function fromMat4(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[4];\n out[4] = a[5];\n out[5] = a[6];\n out[6] = a[8];\n out[7] = a[9];\n out[8] = a[10];\n return out;\n}\n/**\n * Creates a new mat3 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat3} a matrix to clone\n * @returns {mat3} a new 3x3 matrix\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(9);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Copy the values from one mat3 to another\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Create a new mat3 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} A new mat3\n */\n\nexport function fromValues(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n var out = new glMatrix.ARRAY_TYPE(9);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m10;\n out[4] = m11;\n out[5] = m12;\n out[6] = m20;\n out[7] = m21;\n out[8] = m22;\n return out;\n}\n/**\n * Set the components of a mat3 to the given values\n *\n * @param {mat3} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} out\n */\n\nexport function set(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m10;\n out[4] = m11;\n out[5] = m12;\n out[6] = m20;\n out[7] = m21;\n out[8] = m22;\n return out;\n}\n/**\n * Set a mat3 to the identity matrix\n *\n * @param {mat3} out the receiving matrix\n * @returns {mat3} out\n */\n\nexport function identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Transpose the values of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a12 = a[5];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a01;\n out[5] = a[7];\n out[6] = a02;\n out[7] = a12;\n } else {\n out[0] = a[0];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a[1];\n out[4] = a[4];\n out[5] = a[7];\n out[6] = a[2];\n out[7] = a[5];\n out[8] = a[8];\n }\n\n return out;\n}\n/**\n * Inverts a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n var b01 = a22 * a11 - a12 * a21;\n var b11 = -a22 * a10 + a12 * a20;\n var b21 = a21 * a10 - a11 * a20; // Calculate the determinant\n\n var det = a00 * b01 + a01 * b11 + a02 * b21;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = b01 * det;\n out[1] = (-a22 * a01 + a02 * a21) * det;\n out[2] = (a12 * a01 - a02 * a11) * det;\n out[3] = b11 * det;\n out[4] = (a22 * a00 - a02 * a20) * det;\n out[5] = (-a12 * a00 + a02 * a10) * det;\n out[6] = b21 * det;\n out[7] = (-a21 * a00 + a01 * a20) * det;\n out[8] = (a11 * a00 - a01 * a10) * det;\n return out;\n}\n/**\n * Calculates the adjugate of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n out[0] = a11 * a22 - a12 * a21;\n out[1] = a02 * a21 - a01 * a22;\n out[2] = a01 * a12 - a02 * a11;\n out[3] = a12 * a20 - a10 * a22;\n out[4] = a00 * a22 - a02 * a20;\n out[5] = a02 * a10 - a00 * a12;\n out[6] = a10 * a21 - a11 * a20;\n out[7] = a01 * a20 - a00 * a21;\n out[8] = a00 * a11 - a01 * a10;\n return out;\n}\n/**\n * Calculates the determinant of a mat3\n *\n * @param {ReadonlyMat3} a the source matrix\n * @returns {Number} determinant of a\n */\n\nexport function determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);\n}\n/**\n * Multiplies two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nexport function multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n var b00 = b[0],\n b01 = b[1],\n b02 = b[2];\n var b10 = b[3],\n b11 = b[4],\n b12 = b[5];\n var b20 = b[6],\n b21 = b[7],\n b22 = b[8];\n out[0] = b00 * a00 + b01 * a10 + b02 * a20;\n out[1] = b00 * a01 + b01 * a11 + b02 * a21;\n out[2] = b00 * a02 + b01 * a12 + b02 * a22;\n out[3] = b10 * a00 + b11 * a10 + b12 * a20;\n out[4] = b10 * a01 + b11 * a11 + b12 * a21;\n out[5] = b10 * a02 + b11 * a12 + b12 * a22;\n out[6] = b20 * a00 + b21 * a10 + b22 * a20;\n out[7] = b20 * a01 + b21 * a11 + b22 * a21;\n out[8] = b20 * a02 + b21 * a12 + b22 * a22;\n return out;\n}\n/**\n * Translate a mat3 by the given vector\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to translate\n * @param {ReadonlyVec2} v vector to translate by\n * @returns {mat3} out\n */\n\nexport function translate(out, a, v) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a10 = a[3],\n a11 = a[4],\n a12 = a[5],\n a20 = a[6],\n a21 = a[7],\n a22 = a[8],\n x = v[0],\n y = v[1];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a10;\n out[4] = a11;\n out[5] = a12;\n out[6] = x * a00 + y * a10 + a20;\n out[7] = x * a01 + y * a11 + a21;\n out[8] = x * a02 + y * a12 + a22;\n return out;\n}\n/**\n * Rotates a mat3 by the given angle\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\n\nexport function rotate(out, a, rad) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a10 = a[3],\n a11 = a[4],\n a12 = a[5],\n a20 = a[6],\n a21 = a[7],\n a22 = a[8],\n s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = c * a00 + s * a10;\n out[1] = c * a01 + s * a11;\n out[2] = c * a02 + s * a12;\n out[3] = c * a10 - s * a00;\n out[4] = c * a11 - s * a01;\n out[5] = c * a12 - s * a02;\n out[6] = a20;\n out[7] = a21;\n out[8] = a22;\n return out;\n}\n/**\n * Scales the mat3 by the dimensions in the given vec2\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {ReadonlyVec2} v the vec2 to scale the matrix by\n * @returns {mat3} out\n **/\n\nexport function scale(out, a, v) {\n var x = v[0],\n y = v[1];\n out[0] = x * a[0];\n out[1] = x * a[1];\n out[2] = x * a[2];\n out[3] = y * a[3];\n out[4] = y * a[4];\n out[5] = y * a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.translate(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyVec2} v Translation vector\n * @returns {mat3} out\n */\n\nexport function fromTranslation(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = v[0];\n out[7] = v[1];\n out[8] = 1;\n return out;\n}\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.rotate(dest, dest, rad);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\n\nexport function fromRotation(out, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = -s;\n out[4] = c;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.scale(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyVec2} v Scaling vector\n * @returns {mat3} out\n */\n\nexport function fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = v[1];\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Copies the values from a mat2d into a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat2d} a the matrix to copy\n * @returns {mat3} out\n **/\n\nexport function fromMat2d(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = 0;\n out[3] = a[2];\n out[4] = a[3];\n out[5] = 0;\n out[6] = a[4];\n out[7] = a[5];\n out[8] = 1;\n return out;\n}\n/**\n * Calculates a 3x3 matrix from the given quaternion\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat3} out\n */\n\nexport function fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[3] = yx - wz;\n out[6] = zx + wy;\n out[1] = yx + wz;\n out[4] = 1 - xx - zz;\n out[7] = zy - wx;\n out[2] = zx - wy;\n out[5] = zy + wx;\n out[8] = 1 - xx - yy;\n return out;\n}\n/**\n * Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyMat4} a Mat4 to derive the normal matrix from\n *\n * @returns {mat3} out\n */\n\nexport function normalFromMat4(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n return out;\n}\n/**\n * Generates a 2D projection matrix with the given bounds\n *\n * @param {mat3} out mat3 frustum matrix will be written into\n * @param {number} width Width of your gl context\n * @param {number} height Height of gl context\n * @returns {mat3} out\n */\n\nexport function projection(out, width, height) {\n out[0] = 2 / width;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = -2 / height;\n out[5] = 0;\n out[6] = -1;\n out[7] = 1;\n out[8] = 1;\n return out;\n}\n/**\n * Returns a string representation of a mat3\n *\n * @param {ReadonlyMat3} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\n\nexport function str(a) {\n return \"mat3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \")\";\n}\n/**\n * Returns Frobenius norm of a mat3\n *\n * @param {ReadonlyMat3} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\n\nexport function frob(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]);\n}\n/**\n * Adds two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n return out;\n}\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n return out;\n}\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat3} out\n */\n\nexport function multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n return out;\n}\n/**\n * Adds two mat3's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat3} out the receiving vector\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat3} out\n */\n\nexport function multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n return out;\n}\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat3} a The first matrix.\n * @param {ReadonlyMat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8];\n}\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat3} a The first matrix.\n * @param {ReadonlyMat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3],\n a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7],\n a8 = a[8];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3],\n b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7],\n b8 = b[8];\n 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));\n}\n/**\n * Alias for {@link mat3.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link mat3.subtract}\n * @function\n */\n\nexport var sub = subtract;","import * as glMatrix from \"./common.js\";\n/**\n * 4x4 Matrix<br>Format: column-major, when typed out it looks like row-major<br>The matrices are being post multiplied.\n * @module mat4\n */\n\n/**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(16);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n }\n\n out[0] = 1;\n out[5] = 1;\n out[10] = 1;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a new mat4 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat4} a matrix to clone\n * @returns {mat4} a new 4x4 matrix\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Copy the values from one mat4 to another\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Create a new mat4 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} A new mat4\n */\n\nexport function fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\n * Set the components of a mat4 to the given values\n *\n * @param {mat4} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} out\n */\n\nexport function set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\n * Set a mat4 to the identity matrix\n *\n * @param {mat4} out the receiving matrix\n * @returns {mat4} out\n */\n\nexport function identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Transpose the values of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a12 = a[6],\n a13 = a[7];\n var a23 = a[11];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a01;\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a02;\n out[9] = a12;\n out[11] = a[14];\n out[12] = a03;\n out[13] = a13;\n out[14] = a23;\n } else {\n out[0] = a[0];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a[1];\n out[5] = a[5];\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a[2];\n out[9] = a[6];\n out[10] = a[10];\n out[11] = a[14];\n out[12] = a[3];\n out[13] = a[7];\n out[14] = a[11];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\n * Inverts a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n return out;\n}\n/**\n * Calculates the adjugate of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);\n out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);\n out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);\n out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);\n out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);\n out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);\n out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);\n out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);\n return out;\n}\n/**\n * Calculates the determinant of a mat4\n *\n * @param {ReadonlyMat4} a the source matrix\n * @returns {Number} determinant of a\n */\n\nexport function determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\n/**\n * Multiplies two mat4s\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nexport function multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15]; // Cache only the current line of the second matrix\n\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[4];\n b1 = b[5];\n b2 = b[6];\n b3 = b[7];\n out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[8];\n b1 = b[9];\n b2 = b[10];\n b3 = b[11];\n out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[12];\n b1 = b[13];\n b2 = b[14];\n b3 = b[15];\n out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n return out;\n}\n/**\n * Translate a mat4 by the given vector\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to translate\n * @param {ReadonlyVec3} v vector to translate by\n * @returns {mat4} out\n */\n\nexport function translate(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n\n if (a === out) {\n out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n } else {\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a03;\n out[4] = a10;\n out[5] = a11;\n out[6] = a12;\n out[7] = a13;\n out[8] = a20;\n out[9] = a21;\n out[10] = a22;\n out[11] = a23;\n out[12] = a00 * x + a10 * y + a20 * z + a[12];\n out[13] = a01 * x + a11 * y + a21 * z + a[13];\n out[14] = a02 * x + a12 * y + a22 * z + a[14];\n out[15] = a03 * x + a13 * y + a23 * z + a[15];\n }\n\n return out;\n}\n/**\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {ReadonlyVec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n **/\n\nexport function scale(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n out[0] = a[0] * x;\n out[1] = a[1] * x;\n out[2] = a[2] * x;\n out[3] = a[3] * x;\n out[4] = a[4] * y;\n out[5] = a[5] * y;\n out[6] = a[6] * y;\n out[7] = a[7] * y;\n out[8] = a[8] * z;\n out[9] = a[9] * z;\n out[10] = a[10] * z;\n out[11] = a[11] * z;\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Rotates a mat4 by the given angle around the given axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */\n\nexport function rotate(out, a, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n var b00, b01, b02;\n var b10, b11, b12;\n var b20, b21, b22;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c;\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11]; // Construct the elements of the rotation matrix\n\n b00 = x * x * t + c;\n b01 = y * x * t + z * s;\n b02 = z * x * t - y * s;\n b10 = x * y * t - z * s;\n b11 = y * y * t + c;\n b12 = z * y * t + x * s;\n b20 = x * z * t + y * s;\n b21 = y * z * t - x * s;\n b22 = z * z * t + c; // Perform rotation-specific matrix multiplication\n\n out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the X axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function rotateX(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[4] = a10 * c + a20 * s;\n out[5] = a11 * c + a21 * s;\n out[6] = a12 * c + a22 * s;\n out[7] = a13 * c + a23 * s;\n out[8] = a20 * c - a10 * s;\n out[9] = a21 * c - a11 * s;\n out[10] = a22 * c - a12 * s;\n out[11] = a23 * c - a13 * s;\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the Y axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function rotateY(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c - a20 * s;\n out[1] = a01 * c - a21 * s;\n out[2] = a02 * c - a22 * s;\n out[3] = a03 * c - a23 * s;\n out[8] = a00 * s + a20 * c;\n out[9] = a01 * s + a21 * c;\n out[10] = a02 * s + a22 * c;\n out[11] = a03 * s + a23 * c;\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the Z axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function rotateZ(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c + a10 * s;\n out[1] = a01 * c + a11 * s;\n out[2] = a02 * c + a12 * s;\n out[3] = a03 * c + a13 * s;\n out[4] = a10 * c - a00 * s;\n out[5] = a11 * c - a01 * s;\n out[6] = a12 * c - a02 * s;\n out[7] = a13 * c - a03 * s;\n return out;\n}\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */\n\nexport function fromTranslation(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.scale(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Scaling vector\n * @returns {mat4} out\n */\n\nexport function fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = v[1];\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = v[2];\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a given angle around a given axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotate(dest, dest, rad, axis);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */\n\nexport function fromRotation(out, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c; // Perform rotation-specific matrix multiplication\n\n out[0] = x * x * t + c;\n out[1] = y * x * t + z * s;\n out[2] = z * x * t - y * s;\n out[3] = 0;\n out[4] = x * y * t - z * s;\n out[5] = y * y * t + c;\n out[6] = z * y * t + x * s;\n out[7] = 0;\n out[8] = x * z * t + y * s;\n out[9] = y * z * t - x * s;\n out[10] = z * z * t + c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the X axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateX(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function fromXRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = c;\n out[6] = s;\n out[7] = 0;\n out[8] = 0;\n out[9] = -s;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the Y axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateY(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function fromYRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = 0;\n out[2] = -s;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = s;\n out[9] = 0;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the Z axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateZ(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function fromZRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = 0;\n out[4] = -s;\n out[5] = c;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation and vector translation\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */\n\nexport function fromRotationTranslation(out, q, v) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - (yy + zz);\n out[1] = xy + wz;\n out[2] = xz - wy;\n out[3] = 0;\n out[4] = xy - wz;\n out[5] = 1 - (xx + zz);\n out[6] = yz + wx;\n out[7] = 0;\n out[8] = xz + wy;\n out[9] = yz - wx;\n out[10] = 1 - (xx + yy);\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a new mat4 from a dual quat.\n *\n * @param {mat4} out Matrix\n * @param {ReadonlyQuat2} a Dual Quaternion\n * @returns {mat4} mat4 receiving operation result\n */\n\nexport function fromQuat2(out, a) {\n var translation = new glMatrix.ARRAY_TYPE(3);\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7];\n var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense\n\n if (magnitude > 0) {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude;\n } else {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n }\n\n fromRotationTranslation(out, a, translation);\n return out;\n}\n/**\n * Returns the translation vector component of a transformation\n * matrix. If a matrix is built with fromRotationTranslation,\n * the returned vector will be the same as the translation vector\n * originally supplied.\n * @param {vec3} out Vector to receive translation component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\n\nexport function getTranslation(out, mat) {\n out[0] = mat[12];\n out[1] = mat[13];\n out[2] = mat[14];\n return out;\n}\n/**\n * Returns the scaling factor component of a transformation\n * matrix. If a matrix is built with fromRotationTranslationScale\n * with a normalized Quaternion paramter, the returned vector will be\n * the same as the scaling vector\n * originally supplied.\n * @param {vec3} out Vector to receive scaling factor component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\n\nexport function getScaling(out, mat) {\n var m11 = mat[0];\n var m12 = mat[1];\n var m13 = mat[2];\n var m21 = mat[4];\n var m22 = mat[5];\n var m23 = mat[6];\n var m31 = mat[8];\n var m32 = mat[9];\n var m33 = mat[10];\n out[0] = Math.hypot(m11, m12, m13);\n out[1] = Math.hypot(m21, m22, m23);\n out[2] = Math.hypot(m31, m32, m33);\n return out;\n}\n/**\n * Returns a quaternion representing the rotational component\n * of a transformation matrix. If a matrix is built with\n * fromRotationTranslation, the returned quaternion will be the\n * same as the quaternion originally supplied.\n * @param {quat} out Quaternion to receive the rotation component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {quat} out\n */\n\nexport function getRotation(out, mat) {\n var scaling = new glMatrix.ARRAY_TYPE(3);\n getScaling(scaling, mat);\n var is1 = 1 / scaling[0];\n var is2 = 1 / scaling[1];\n var is3 = 1 / scaling[2];\n var sm11 = mat[0] * is1;\n var sm12 = mat[1] * is2;\n var sm13 = mat[2] * is3;\n var sm21 = mat[4] * is1;\n var sm22 = mat[5] * is2;\n var sm23 = mat[6] * is3;\n var sm31 = mat[8] * is1;\n var sm32 = mat[9] * is2;\n var sm33 = mat[10] * is3;\n var trace = sm11 + sm22 + sm33;\n var S = 0;\n\n if (trace > 0) {\n S = Math.sqrt(trace + 1.0) * 2;\n out[3] = 0.25 * S;\n out[0] = (sm23 - sm32) / S;\n out[1] = (sm31 - sm13) / S;\n out[2] = (sm12 - sm21) / S;\n } else if (sm11 > sm22 && sm11 > sm33) {\n S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n out[3] = (sm23 - sm32) / S;\n out[0] = 0.25 * S;\n out[1] = (sm12 + sm21) / S;\n out[2] = (sm31 + sm13) / S;\n } else if (sm22 > sm33) {\n S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n out[3] = (sm31 - sm13) / S;\n out[0] = (sm12 + sm21) / S;\n out[1] = 0.25 * S;\n out[2] = (sm23 + sm32) / S;\n } else {\n S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n out[3] = (sm12 - sm21) / S;\n out[0] = (sm31 + sm13) / S;\n out[1] = (sm23 + sm32) / S;\n out[2] = 0.25 * S;\n }\n\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n * mat4.scale(dest, scale)\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @returns {mat4} out\n */\n\nexport function fromRotationTranslationScale(out, q, v, s) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n out[0] = (1 - (yy + zz)) * sx;\n out[1] = (xy + wz) * sx;\n out[2] = (xz - wy) * sx;\n out[3] = 0;\n out[4] = (xy - wz) * sy;\n out[5] = (1 - (xx + zz)) * sy;\n out[6] = (yz + wx) * sy;\n out[7] = 0;\n out[8] = (xz + wy) * sz;\n out[9] = (yz - wx) * sz;\n out[10] = (1 - (xx + yy)) * sz;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * mat4.translate(dest, origin);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n * mat4.scale(dest, scale)\n * mat4.translate(dest, negativeOrigin);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @param {ReadonlyVec3} o The origin vector around which to scale and rotate\n * @returns {mat4} out\n */\n\nexport function fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n var ox = o[0];\n var oy = o[1];\n var oz = o[2];\n var out0 = (1 - (yy + zz)) * sx;\n var out1 = (xy + wz) * sx;\n var out2 = (xz - wy) * sx;\n var out4 = (xy - wz) * sy;\n var out5 = (1 - (xx + zz)) * sy;\n var out6 = (yz + wx) * sy;\n var out8 = (xz + wy) * sz;\n var out9 = (yz - wx) * sz;\n var out10 = (1 - (xx + yy)) * sz;\n out[0] = out0;\n out[1] = out1;\n out[2] = out2;\n out[3] = 0;\n out[4] = out4;\n out[5] = out5;\n out[6] = out6;\n out[7] = 0;\n out[8] = out8;\n out[9] = out9;\n out[10] = out10;\n out[11] = 0;\n out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n out[15] = 1;\n return out;\n}\n/**\n * Calculates a 4x4 matrix from the given quaternion\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat4} out\n */\n\nexport function fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[1] = yx + wz;\n out[2] = zx - wy;\n out[3] = 0;\n out[4] = yx - wz;\n out[5] = 1 - xx - zz;\n out[6] = zy + wx;\n out[7] = 0;\n out[8] = zx + wy;\n out[9] = zy - wx;\n out[10] = 1 - xx - yy;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Generates a frustum matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Number} left Left bound of the frustum\n * @param {Number} right Right bound of the frustum\n * @param {Number} bottom Bottom bound of the frustum\n * @param {Number} top Top bound of the frustum\n * @param {Number} near Near bound of the frustum\n * @param {Number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function frustum(out, left, right, bottom, top, near, far) {\n var rl = 1 / (right - left);\n var tb = 1 / (top - bottom);\n var nf = 1 / (near - far);\n out[0] = near * 2 * rl;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = near * 2 * tb;\n out[6] = 0;\n out[7] = 0;\n out[8] = (right + left) * rl;\n out[9] = (top + bottom) * tb;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = far * near * 2 * nf;\n out[15] = 0;\n return out;\n}\n/**\n * Generates a perspective projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */\n\nexport function perspectiveNO(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = (far + near) * nf;\n out[14] = 2 * far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -2 * near;\n }\n\n return out;\n}\n/**\n * Alias for {@link mat4.perspectiveNO}\n * @function\n */\n\nexport var perspective = perspectiveNO;\n/**\n * Generates a perspective projection matrix suitable for WebGPU with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */\n\nexport function perspectiveZO(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = far * nf;\n out[14] = far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -near;\n }\n\n return out;\n}\n/**\n * Generates a perspective projection matrix with the given field of view.\n * This is primarily useful for generating projection matrices to be used\n * with the still experiemental WebVR API.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function perspectiveFromFieldOfView(out, fov, near, far) {\n var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);\n var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);\n var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);\n var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);\n var xScale = 2.0 / (leftTan + rightTan);\n var yScale = 2.0 / (upTan + downTan);\n out[0] = xScale;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n out[4] = 0.0;\n out[5] = yScale;\n out[6] = 0.0;\n out[7] = 0.0;\n out[8] = -((leftTan - rightTan) * xScale * 0.5);\n out[9] = (upTan - downTan) * yScale * 0.5;\n out[10] = far / (near - far);\n out[11] = -1.0;\n out[12] = 0.0;\n out[13] = 0.0;\n out[14] = far * near / (near - far);\n out[15] = 0.0;\n return out;\n}\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function orthoNO(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 2 * nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = (far + near) * nf;\n out[15] = 1;\n return out;\n}\n/**\n * Alias for {@link mat4.orthoNO}\n * @function\n */\n\nexport var ortho = orthoNO;\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function orthoZO(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = near * nf;\n out[15] = 1;\n return out;\n}\n/**\n * Generates a look-at matrix with the given eye position, focal point, and up axis.\n * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */\n\nexport function lookAt(out, eye, center, up) {\n var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;\n var eyex = eye[0];\n var eyey = eye[1];\n var eyez = eye[2];\n var upx = up[0];\n var upy = up[1];\n var upz = up[2];\n var centerx = center[0];\n var centery = center[1];\n var centerz = center[2];\n\n if (Math.abs(eyex - centerx) < glMatrix.EPSILON && Math.abs(eyey - centery) < glMatrix.EPSILON && Math.abs(eyez - centerz) < glMatrix.EPSILON) {\n return identity(out);\n }\n\n z0 = eyex - centerx;\n z1 = eyey - centery;\n z2 = eyez - centerz;\n len = 1 / Math.hypot(z0, z1, z2);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n x0 = upy * z2 - upz * z1;\n x1 = upz * z0 - upx * z2;\n x2 = upx * z1 - upy * z0;\n len = Math.hypot(x0, x1, x2);\n\n if (!len) {\n x0 = 0;\n x1 = 0;\n x2 = 0;\n } else {\n len = 1 / len;\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n y0 = z1 * x2 - z2 * x1;\n y1 = z2 * x0 - z0 * x2;\n y2 = z0 * x1 - z1 * x0;\n len = Math.hypot(y0, y1, y2);\n\n if (!len) {\n y0 = 0;\n y1 = 0;\n y2 = 0;\n } else {\n len = 1 / len;\n y0 *= len;\n y1 *= len;\n y2 *= len;\n }\n\n out[0] = x0;\n out[1] = y0;\n out[2] = z0;\n out[3] = 0;\n out[4] = x1;\n out[5] = y1;\n out[6] = z1;\n out[7] = 0;\n out[8] = x2;\n out[9] = y2;\n out[10] = z2;\n out[11] = 0;\n out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n out[15] = 1;\n return out;\n}\n/**\n * Generates a matrix that makes something look at something else.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */\n\nexport function targetTo(out, eye, target, up) {\n var eyex = eye[0],\n eyey = eye[1],\n eyez = eye[2],\n upx = up[0],\n upy = up[1],\n upz = up[2];\n var z0 = eyex - target[0],\n z1 = eyey - target[1],\n z2 = eyez - target[2];\n var len = z0 * z0 + z1 * z1 + z2 * z2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n }\n\n var x0 = upy * z2 - upz * z1,\n x1 = upz * z0 - upx * z2,\n x2 = upx * z1 - upy * z0;\n len = x0 * x0 + x1 * x1 + x2 * x2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n out[0] = x0;\n out[1] = x1;\n out[2] = x2;\n out[3] = 0;\n out[4] = z1 * x2 - z2 * x1;\n out[5] = z2 * x0 - z0 * x2;\n out[6] = z0 * x1 - z1 * x0;\n out[7] = 0;\n out[8] = z0;\n out[9] = z1;\n out[10] = z2;\n out[11] = 0;\n out[12] = eyex;\n out[13] = eyey;\n out[14] = eyez;\n out[15] = 1;\n return out;\n}\n/**\n * Returns a string representation of a mat4\n *\n * @param {ReadonlyMat4} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\n\nexport function str(a) {\n return \"mat4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \", \" + a[9] + \", \" + a[10] + \", \" + a[11] + \", \" + a[12] + \", \" + a[13] + \", \" + a[14] + \", \" + a[15] + \")\";\n}\n/**\n * Returns Frobenius norm of a mat4\n *\n * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\n\nexport function frob(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);\n}\n/**\n * Adds two mat4's\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n out[9] = a[9] + b[9];\n out[10] = a[10] + b[10];\n out[11] = a[11] + b[11];\n out[12] = a[12] + b[12];\n out[13] = a[13] + b[13];\n out[14] = a[14] + b[14];\n out[15] = a[15] + b[15];\n return out;\n}\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n out[9] = a[9] - b[9];\n out[10] = a[10] - b[10];\n out[11] = a[11] - b[11];\n out[12] = a[12] - b[12];\n out[13] = a[13] - b[13];\n out[14] = a[14] - b[14];\n out[15] = a[15] - b[15];\n return out;\n}\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat4} out\n */\n\nexport function multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n out[9] = a[9] * b;\n out[10] = a[10] * b;\n out[11] = a[11] * b;\n out[12] = a[12] * b;\n out[13] = a[13] * b;\n out[14] = a[14] * b;\n out[15] = a[15] * b;\n return out;\n}\n/**\n * Adds two mat4's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat4} out the receiving vector\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat4} out\n */\n\nexport function multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n out[9] = a[9] + b[9] * scale;\n out[10] = a[10] + b[10] * scale;\n out[11] = a[11] + b[11] * scale;\n out[12] = a[12] + b[12] * scale;\n out[13] = a[13] + b[13] * scale;\n out[14] = a[14] + b[14] * scale;\n out[15] = a[15] + b[15] * scale;\n return out;\n}\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];\n}\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7];\n var a8 = a[8],\n a9 = a[9],\n a10 = a[10],\n a11 = a[11];\n var a12 = a[12],\n a13 = a[13],\n a14 = a[14],\n a15 = a[15];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n var b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7];\n var b8 = b[8],\n b9 = b[9],\n b10 = b[10],\n b11 = b[11];\n var b12 = b[12],\n b13 = b[13],\n b14 = b[14],\n b15 = b[15];\n 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));\n}\n/**\n * Alias for {@link mat4.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link mat4.subtract}\n * @function\n */\n\nexport var sub = subtract;","import * as glMatrix from \"./common.js\";\n/**\n * 3 Dimensional Vector\n * @module vec3\n */\n\n/**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(3);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n return out;\n}\n/**\n * Creates a new vec3 initialized with values from an existing vector\n *\n * @param {ReadonlyVec3} a vector to clone\n * @returns {vec3} a new 3D vector\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\n * Calculates the length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return Math.hypot(x, y, z);\n}\n/**\n * Creates a new vec3 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} a new 3D vector\n */\n\nexport function fromValues(x, y, z) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\n * Copy the values from one vec3 to another\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the source vector\n * @returns {vec3} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\n * Set the components of a vec3 to the given values\n *\n * @param {vec3} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} out\n */\n\nexport function set(out, x, y, z) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\n * Adds two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\n/**\n * Multiplies two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n return out;\n}\n/**\n * Divides two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n return out;\n}\n/**\n * Math.ceil the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to ceil\n * @returns {vec3} out\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n return out;\n}\n/**\n * Math.floor the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to floor\n * @returns {vec3} out\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n return out;\n}\n/**\n * Returns the minimum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n return out;\n}\n/**\n * Returns the maximum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n return out;\n}\n/**\n * Math.round the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to round\n * @returns {vec3} out\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n return out;\n}\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n return out;\n}\n/**\n * Adds two vec3's after scaling the second operand by a scalar value\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec3} out\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n return out;\n}\n/**\n * Calculates the euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} distance between a and b\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return Math.hypot(x, y, z);\n}\n/**\n * Calculates the squared euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return x * x + y * y + z * z;\n}\n/**\n * Calculates the squared length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return x * x + y * y + z * z;\n}\n/**\n * Negates the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to negate\n * @returns {vec3} out\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n}\n/**\n * Returns the inverse of the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to invert\n * @returns {vec3} out\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n return out;\n}\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to normalize\n * @returns {vec3} out\n */\n\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var len = x * x + y * y + z * z;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n return out;\n}\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} dot product of a and b\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function cross(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2];\n var bx = b[0],\n by = b[1],\n bz = b[2];\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n}\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n return out;\n}\n/**\n * Performs a hermite interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nexport function hermite(out, a, b, c, d, t) {\n var factorTimes2 = t * t;\n var factor1 = factorTimes2 * (2 * t - 3) + 1;\n var factor2 = factorTimes2 * (t - 2) + t;\n var factor3 = factorTimes2 * (t - 1);\n var factor4 = factorTimes2 * (3 - 2 * t);\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\n * Performs a bezier interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nexport function bezier(out, a, b, c, d, t) {\n var inverseFactor = 1 - t;\n var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n var factorTimes2 = t * t;\n var factor1 = inverseFactorTimesTwo * inverseFactor;\n var factor2 = 3 * t * inverseFactorTimesTwo;\n var factor3 = 3 * factorTimes2 * inverseFactor;\n var factor4 = factorTimes2 * t;\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec3} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec3} out\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n var z = glMatrix.RANDOM() * 2.0 - 1.0;\n var zScale = Math.sqrt(1.0 - z * z) * scale;\n out[0] = Math.cos(r) * zScale;\n out[1] = Math.sin(r) * zScale;\n out[2] = z * scale;\n return out;\n}\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec3} out\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n w = w || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n}\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */\n\nexport function transformMat3(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x * m[0] + y * m[3] + z * m[6];\n out[1] = x * m[1] + y * m[4] + z * m[7];\n out[2] = x * m[2] + y * m[5] + z * m[8];\n return out;\n}\n/**\n * Transforms the vec3 with a quat\n * Can also be used for dual quaternions. (Multiply it with the real part)\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyQuat} q quaternion to transform with\n * @returns {vec3} out\n */\n\nexport function transformQuat(out, a, q) {\n // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3];\n var x = a[0],\n y = a[1],\n z = a[2]; // var qvec = [qx, qy, qz];\n // var uv = vec3.cross([], qvec, a);\n\n var uvx = qy * z - qz * y,\n uvy = qz * x - qx * z,\n uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv);\n\n var uuvx = qy * uvz - qz * uvy,\n uuvy = qz * uvx - qx * uvz,\n uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w);\n\n var w2 = qw * 2;\n uvx *= w2;\n uvy *= w2;\n uvz *= w2; // vec3.scale(uuv, uuv, 2);\n\n uuvx *= 2;\n uuvy *= 2;\n uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv));\n\n out[0] = x + uvx + uuvx;\n out[1] = y + uvy + uuvy;\n out[2] = z + uvz + uuvz;\n return out;\n}\n/**\n * Rotate a 3D vector around the x-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nexport function rotateX(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0];\n r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Rotate a 3D vector around the y-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nexport function rotateY(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n r[1] = p[1];\n r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Rotate a 3D vector around the z-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nexport function rotateZ(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n r[2] = p[2]; //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Get the angle between two 3D vectors\n * @param {ReadonlyVec3} a The first operand\n * @param {ReadonlyVec3} b The second operand\n * @returns {Number} The angle in radians\n */\n\nexport function angle(a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n bz = b[2],\n mag1 = Math.sqrt(ax * ax + ay * ay + az * az),\n mag2 = Math.sqrt(bx * bx + by * by + bz * bz),\n mag = mag1 * mag2,\n cosine = mag && dot(a, b) / mag;\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\n * Set the components of a vec3 to zero\n *\n * @param {vec3} out the receiving vector\n * @returns {vec3} out\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec3} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"vec3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \")\";\n}\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2];\n 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));\n}\n/**\n * Alias for {@link vec3.subtract}\n * @function\n */\n\nexport var sub = subtract;\n/**\n * Alias for {@link vec3.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link vec3.divide}\n * @function\n */\n\nexport var div = divide;\n/**\n * Alias for {@link vec3.distance}\n * @function\n */\n\nexport var dist = distance;\n/**\n * Alias for {@link vec3.squaredDistance}\n * @function\n */\n\nexport var sqrDist = squaredDistance;\n/**\n * Alias for {@link vec3.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Alias for {@link vec3.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec3s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 3;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n }\n\n return a;\n };\n}();","import * as glMatrix from \"./common.js\";\n/**\n * 4 Dimensional Vector\n * @module vec4\n */\n\n/**\n * Creates a new, empty vec4\n *\n * @returns {vec4} a new 4D vector\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(4);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n }\n\n return out;\n}\n/**\n * Creates a new vec4 initialized with values from an existing vector\n *\n * @param {ReadonlyVec4} a vector to clone\n * @returns {vec4} a new 4D vector\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Creates a new vec4 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} a new 4D vector\n */\n\nexport function fromValues(x, y, z, w) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\n * Copy the values from one vec4 to another\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the source vector\n * @returns {vec4} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Set the components of a vec4 to the given values\n *\n * @param {vec4} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} out\n */\n\nexport function set(out, x, y, z, w) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\n * Adds two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n return out;\n}\n/**\n * Multiplies two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n out[3] = a[3] * b[3];\n return out;\n}\n/**\n * Divides two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n out[3] = a[3] / b[3];\n return out;\n}\n/**\n * Math.ceil the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to ceil\n * @returns {vec4} out\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n out[3] = Math.ceil(a[3]);\n return out;\n}\n/**\n * Math.floor the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to floor\n * @returns {vec4} out\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n out[3] = Math.floor(a[3]);\n return out;\n}\n/**\n * Returns the minimum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n out[3] = Math.min(a[3], b[3]);\n return out;\n}\n/**\n * Returns the maximum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n out[3] = Math.max(a[3], b[3]);\n return out;\n}\n/**\n * Math.round the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to round\n * @returns {vec4} out\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n out[3] = Math.round(a[3]);\n return out;\n}\n/**\n * Scales a vec4 by a scalar number\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec4} out\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n return out;\n}\n/**\n * Adds two vec4's after scaling the second operand by a scalar value\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec4} out\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n return out;\n}\n/**\n * Calculates the euclidian distance between two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} distance between a and b\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\n * Calculates the squared euclidian distance between two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\n * Calculates the length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\n * Calculates the squared length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\n * Negates the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to negate\n * @returns {vec4} out\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = -a[3];\n return out;\n}\n/**\n * Returns the inverse of the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to invert\n * @returns {vec4} out\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n out[3] = 1.0 / a[3];\n return out;\n}\n/**\n * Normalize a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to normalize\n * @returns {vec4} out\n */\n\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n var len = x * x + y * y + z * z + w * w;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = x * len;\n out[1] = y * len;\n out[2] = z * len;\n out[3] = w * len;\n return out;\n}\n/**\n * Calculates the dot product of two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} dot product of a and b\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n}\n/**\n * Returns the cross-product of three vectors in a 4-dimensional space\n *\n * @param {ReadonlyVec4} result the receiving vector\n * @param {ReadonlyVec4} U the first vector\n * @param {ReadonlyVec4} V the second vector\n * @param {ReadonlyVec4} W the third vector\n * @returns {vec4} result\n */\n\nexport function cross(out, u, v, w) {\n var A = v[0] * w[1] - v[1] * w[0],\n B = v[0] * w[2] - v[2] * w[0],\n C = v[0] * w[3] - v[3] * w[0],\n D = v[1] * w[2] - v[2] * w[1],\n E = v[1] * w[3] - v[3] * w[1],\n F = v[2] * w[3] - v[3] * w[2];\n var G = u[0];\n var H = u[1];\n var I = u[2];\n var J = u[3];\n out[0] = H * F - I * E + J * D;\n out[1] = -(G * F) + I * C - J * B;\n out[2] = G * E - H * C + J * A;\n out[3] = -(G * D) + H * B - I * A;\n return out;\n}\n/**\n * Performs a linear interpolation between two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec4} out\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n var aw = a[3];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n out[3] = aw + t * (b[3] - aw);\n return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec4} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec4} out\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a\n // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646.\n // http://projecteuclid.org/euclid.aoms/1177692644;\n\n var v1, v2, v3, v4;\n var s1, s2;\n\n do {\n v1 = glMatrix.RANDOM() * 2 - 1;\n v2 = glMatrix.RANDOM() * 2 - 1;\n s1 = v1 * v1 + v2 * v2;\n } while (s1 >= 1);\n\n do {\n v3 = glMatrix.RANDOM() * 2 - 1;\n v4 = glMatrix.RANDOM() * 2 - 1;\n s2 = v3 * v3 + v4 * v4;\n } while (s2 >= 1);\n\n var d = Math.sqrt((1 - s1) / s2);\n out[0] = scale * v1;\n out[1] = scale * v2;\n out[2] = scale * v3 * d;\n out[3] = scale * v4 * d;\n return out;\n}\n/**\n * Transforms the vec4 with a mat4.\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec4} out\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n return out;\n}\n/**\n * Transforms the vec4 with a quat\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to transform\n * @param {ReadonlyQuat} q quaternion to transform with\n * @returns {vec4} out\n */\n\nexport function transformQuat(out, a, q) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3]; // calculate quat * vec\n\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat\n\n out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n out[3] = a[3];\n return out;\n}\n/**\n * Set the components of a vec4 to zero\n *\n * @param {vec4} out the receiving vector\n * @returns {vec4} out\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec4} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"vec4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec4} a The first vector.\n * @param {ReadonlyVec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec4} a The first vector.\n * @param {ReadonlyVec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n 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));\n}\n/**\n * Alias for {@link vec4.subtract}\n * @function\n */\n\nexport var sub = subtract;\n/**\n * Alias for {@link vec4.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link vec4.divide}\n * @function\n */\n\nexport var div = divide;\n/**\n * Alias for {@link vec4.distance}\n * @function\n */\n\nexport var dist = distance;\n/**\n * Alias for {@link vec4.squaredDistance}\n * @function\n */\n\nexport var sqrDist = squaredDistance;\n/**\n * Alias for {@link vec4.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Alias for {@link vec4.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec4s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 4;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n vec[3] = a[i + 3];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n a[i + 3] = vec[3];\n }\n\n return a;\n };\n}();","import * as glMatrix from \"./common.js\";\nimport * as mat3 from \"./mat3.js\";\nimport * as vec3 from \"./vec3.js\";\nimport * as vec4 from \"./vec4.js\";\n/**\n * Quaternion\n * @module quat\n */\n\n/**\n * Creates a new identity quat\n *\n * @returns {quat} a new quaternion\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(4);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n out[3] = 1;\n return out;\n}\n/**\n * Set a quat to the identity quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\n\nexport function identity(out) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n}\n/**\n * Sets a quat from the given angle and rotation axis,\n * then returns it.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyVec3} axis the axis around which to rotate\n * @param {Number} rad the angle in radians\n * @returns {quat} out\n **/\n\nexport function setAxisAngle(out, axis, rad) {\n rad = rad * 0.5;\n var s = Math.sin(rad);\n out[0] = s * axis[0];\n out[1] = s * axis[1];\n out[2] = s * axis[2];\n out[3] = Math.cos(rad);\n return out;\n}\n/**\n * Gets the rotation axis and angle for a given\n * quaternion. If a quaternion is created with\n * setAxisAngle, this method will return the same\n * values as providied in the original parameter list\n * OR functionally equivalent values.\n * Example: The quaternion formed by axis [0, 0, 1] and\n * angle -90 is the same as the quaternion formed by\n * [0, 0, 1] and 270. This method favors the latter.\n * @param {vec3} out_axis Vector receiving the axis of rotation\n * @param {ReadonlyQuat} q Quaternion to be decomposed\n * @return {Number} Angle, in radians, of the rotation\n */\n\nexport function getAxisAngle(out_axis, q) {\n var rad = Math.acos(q[3]) * 2.0;\n var s = Math.sin(rad / 2.0);\n\n if (s > glMatrix.EPSILON) {\n out_axis[0] = q[0] / s;\n out_axis[1] = q[1] / s;\n out_axis[2] = q[2] / s;\n } else {\n // If s is zero, return any axis (no rotation - axis does not matter)\n out_axis[0] = 1;\n out_axis[1] = 0;\n out_axis[2] = 0;\n }\n\n return rad;\n}\n/**\n * Gets the angular distance between two unit quaternions\n *\n * @param {ReadonlyQuat} a Origin unit quaternion\n * @param {ReadonlyQuat} b Destination unit quaternion\n * @return {Number} Angle, in radians, between the two quaternions\n */\n\nexport function getAngle(a, b) {\n var dotproduct = dot(a, b);\n return Math.acos(2 * dotproduct * dotproduct - 1);\n}\n/**\n * Multiplies two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {quat} out\n */\n\nexport function multiply(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = b[0],\n by = b[1],\n bz = b[2],\n bw = b[3];\n out[0] = ax * bw + aw * bx + ay * bz - az * by;\n out[1] = ay * bw + aw * by + az * bx - ax * bz;\n out[2] = az * bw + aw * bz + ax * by - ay * bx;\n out[3] = aw * bw - ax * bx - ay * by - az * bz;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the X axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nexport function rotateX(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw + aw * bx;\n out[1] = ay * bw + az * bx;\n out[2] = az * bw - ay * bx;\n out[3] = aw * bw - ax * bx;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the Y axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nexport function rotateY(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var by = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw - az * by;\n out[1] = ay * bw + aw * by;\n out[2] = az * bw + ax * by;\n out[3] = aw * bw - ay * by;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the Z axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nexport function rotateZ(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bz = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw + ay * bz;\n out[1] = ay * bw - ax * bz;\n out[2] = az * bw + aw * bz;\n out[3] = aw * bw - az * bz;\n return out;\n}\n/**\n * Calculates the W component of a quat from the X, Y, and Z components.\n * Assumes that quaternion is 1 unit in length.\n * Any existing W component will be ignored.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate W component of\n * @returns {quat} out\n */\n\nexport function calculateW(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));\n return out;\n}\n/**\n * Calculate the exponential of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} out\n */\n\nexport function exp(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n var r = Math.sqrt(x * x + y * y + z * z);\n var et = Math.exp(w);\n var s = r > 0 ? et * Math.sin(r) / r : 0;\n out[0] = x * s;\n out[1] = y * s;\n out[2] = z * s;\n out[3] = et * Math.cos(r);\n return out;\n}\n/**\n * Calculate the natural logarithm of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} out\n */\n\nexport function ln(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n var r = Math.sqrt(x * x + y * y + z * z);\n var t = r > 0 ? Math.atan2(r, w) / r : 0;\n out[0] = x * t;\n out[1] = y * t;\n out[2] = z * t;\n out[3] = 0.5 * Math.log(x * x + y * y + z * z + w * w);\n return out;\n}\n/**\n * Calculate the scalar power of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @param {Number} b amount to scale the quaternion by\n * @returns {quat} out\n */\n\nexport function pow(out, a, b) {\n ln(out, a);\n scale(out, out, b);\n exp(out, out);\n return out;\n}\n/**\n * Performs a spherical linear interpolation between two quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n */\n\nexport function slerp(out, a, b, t) {\n // benchmarks:\n // http://jsperf.com/quaternion-slerp-implementations\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = b[0],\n by = b[1],\n bz = b[2],\n bw = b[3];\n var omega, cosom, sinom, scale0, scale1; // calc cosine\n\n cosom = ax * bx + ay * by + az * bz + aw * bw; // adjust signs (if necessary)\n\n if (cosom < 0.0) {\n cosom = -cosom;\n bx = -bx;\n by = -by;\n bz = -bz;\n bw = -bw;\n } // calculate coefficients\n\n\n if (1.0 - cosom > glMatrix.EPSILON) {\n // standard case (slerp)\n omega = Math.acos(cosom);\n sinom = Math.sin(omega);\n scale0 = Math.sin((1.0 - t) * omega) / sinom;\n scale1 = Math.sin(t * omega) / sinom;\n } else {\n // \"from\" and \"to\" quaternions are very close\n // ... so we can do a linear interpolation\n scale0 = 1.0 - t;\n scale1 = t;\n } // calculate final values\n\n\n out[0] = scale0 * ax + scale1 * bx;\n out[1] = scale0 * ay + scale1 * by;\n out[2] = scale0 * az + scale1 * bz;\n out[3] = scale0 * aw + scale1 * bw;\n return out;\n}\n/**\n * Generates a random unit quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\n\nexport function random(out) {\n // Implementation of http://planning.cs.uiuc.edu/node198.html\n // TODO: Calling random 3 times is probably not the fastest solution\n var u1 = glMatrix.RANDOM();\n var u2 = glMatrix.RANDOM();\n var u3 = glMatrix.RANDOM();\n var sqrt1MinusU1 = Math.sqrt(1 - u1);\n var sqrtU1 = Math.sqrt(u1);\n out[0] = sqrt1MinusU1 * Math.sin(2.0 * Math.PI * u2);\n out[1] = sqrt1MinusU1 * Math.cos(2.0 * Math.PI * u2);\n out[2] = sqrtU1 * Math.sin(2.0 * Math.PI * u3);\n out[3] = sqrtU1 * Math.cos(2.0 * Math.PI * u3);\n return out;\n}\n/**\n * Calculates the inverse of a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate inverse of\n * @returns {quat} out\n */\n\nexport function invert(out, a) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3;\n var invDot = dot ? 1.0 / dot : 0; // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0\n\n out[0] = -a0 * invDot;\n out[1] = -a1 * invDot;\n out[2] = -a2 * invDot;\n out[3] = a3 * invDot;\n return out;\n}\n/**\n * Calculates the conjugate of a quat\n * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate conjugate of\n * @returns {quat} out\n */\n\nexport function conjugate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Creates a quaternion from the given 3x3 rotation matrix.\n *\n * NOTE: The resultant quaternion is not normalized, so you should be sure\n * to renormalize the quaternion yourself where necessary.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyMat3} m rotation matrix\n * @returns {quat} out\n * @function\n */\n\nexport function fromMat3(out, m) {\n // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes\n // article \"Quaternion Calculus and Fast Animation\".\n var fTrace = m[0] + m[4] + m[8];\n var fRoot;\n\n if (fTrace > 0.0) {\n // |w| > 1/2, may as well choose w > 1/2\n fRoot = Math.sqrt(fTrace + 1.0); // 2w\n\n out[3] = 0.5 * fRoot;\n fRoot = 0.5 / fRoot; // 1/(4w)\n\n out[0] = (m[5] - m[7]) * fRoot;\n out[1] = (m[6] - m[2]) * fRoot;\n out[2] = (m[1] - m[3]) * fRoot;\n } else {\n // |w| <= 1/2\n var i = 0;\n if (m[4] > m[0]) i = 1;\n if (m[8] > m[i * 3 + i]) i = 2;\n var j = (i + 1) % 3;\n var k = (i + 2) % 3;\n fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0);\n out[i] = 0.5 * fRoot;\n fRoot = 0.5 / fRoot;\n out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot;\n out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;\n out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot;\n }\n\n return out;\n}\n/**\n * Creates a quaternion from the given euler angle x, y, z.\n *\n * @param {quat} out the receiving quaternion\n * @param {x} Angle to rotate around X axis in degrees.\n * @param {y} Angle to rotate around Y axis in degrees.\n * @param {z} Angle to rotate around Z axis in degrees.\n * @returns {quat} out\n * @function\n */\n\nexport function fromEuler(out, x, y, z) {\n var halfToRad = 0.5 * Math.PI / 180.0;\n x *= halfToRad;\n y *= halfToRad;\n z *= halfToRad;\n var sx = Math.sin(x);\n var cx = Math.cos(x);\n var sy = Math.sin(y);\n var cy = Math.cos(y);\n var sz = Math.sin(z);\n var cz = Math.cos(z);\n out[0] = sx * cy * cz - cx * sy * sz;\n out[1] = cx * sy * cz + sx * cy * sz;\n out[2] = cx * cy * sz - sx * sy * cz;\n out[3] = cx * cy * cz + sx * sy * sz;\n return out;\n}\n/**\n * Returns a string representation of a quatenion\n *\n * @param {ReadonlyQuat} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"quat(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\n * Creates a new quat initialized with values from an existing quaternion\n *\n * @param {ReadonlyQuat} a quaternion to clone\n * @returns {quat} a new quaternion\n * @function\n */\n\nexport var clone = vec4.clone;\n/**\n * Creates a new quat initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} a new quaternion\n * @function\n */\n\nexport var fromValues = vec4.fromValues;\n/**\n * Copy the values from one quat to another\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the source quaternion\n * @returns {quat} out\n * @function\n */\n\nexport var copy = vec4.copy;\n/**\n * Set the components of a quat to the given values\n *\n * @param {quat} out the receiving quaternion\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} out\n * @function\n */\n\nexport var set = vec4.set;\n/**\n * Adds two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {quat} out\n * @function\n */\n\nexport var add = vec4.add;\n/**\n * Alias for {@link quat.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Scales a quat by a scalar number\n *\n * @param {quat} out the receiving vector\n * @param {ReadonlyQuat} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {quat} out\n * @function\n */\n\nexport var scale = vec4.scale;\n/**\n * Calculates the dot product of two quat's\n *\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {Number} dot product of a and b\n * @function\n */\n\nexport var dot = vec4.dot;\n/**\n * Performs a linear interpolation between two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n * @function\n */\n\nexport var lerp = vec4.lerp;\n/**\n * Calculates the length of a quat\n *\n * @param {ReadonlyQuat} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport var length = vec4.length;\n/**\n * Alias for {@link quat.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Calculates the squared length of a quat\n *\n * @param {ReadonlyQuat} a vector to calculate squared length of\n * @returns {Number} squared length of a\n * @function\n */\n\nexport var squaredLength = vec4.squaredLength;\n/**\n * Alias for {@link quat.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Normalize a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quaternion to normalize\n * @returns {quat} out\n * @function\n */\n\nexport var normalize = vec4.normalize;\n/**\n * Returns whether or not the quaternions have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyQuat} a The first quaternion.\n * @param {ReadonlyQuat} b The second quaternion.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport var exactEquals = vec4.exactEquals;\n/**\n * Returns whether or not the quaternions have approximately the same elements in the same position.\n *\n * @param {ReadonlyQuat} a The first vector.\n * @param {ReadonlyQuat} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport var equals = vec4.equals;\n/**\n * Sets a quaternion to represent the shortest rotation from one\n * vector to another.\n *\n * Both vectors are assumed to be unit length.\n *\n * @param {quat} out the receiving quaternion.\n * @param {ReadonlyVec3} a the initial vector\n * @param {ReadonlyVec3} b the destination vector\n * @returns {quat} out\n */\n\nexport var rotationTo = function () {\n var tmpvec3 = vec3.create();\n var xUnitVec3 = vec3.fromValues(1, 0, 0);\n var yUnitVec3 = vec3.fromValues(0, 1, 0);\n return function (out, a, b) {\n var dot = vec3.dot(a, b);\n\n if (dot < -0.999999) {\n vec3.cross(tmpvec3, xUnitVec3, a);\n if (vec3.len(tmpvec3) < 0.000001) vec3.cross(tmpvec3, yUnitVec3, a);\n vec3.normalize(tmpvec3, tmpvec3);\n setAxisAngle(out, tmpvec3, Math.PI);\n return out;\n } else if (dot > 0.999999) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n } else {\n vec3.cross(tmpvec3, a, b);\n out[0] = tmpvec3[0];\n out[1] = tmpvec3[1];\n out[2] = tmpvec3[2];\n out[3] = 1 + dot;\n return normalize(out, out);\n }\n };\n}();\n/**\n * Performs a spherical linear interpolation with two control points\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {ReadonlyQuat} c the third operand\n * @param {ReadonlyQuat} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n */\n\nexport var sqlerp = function () {\n var temp1 = create();\n var temp2 = create();\n return function (out, a, b, c, d, t) {\n slerp(temp1, a, d, t);\n slerp(temp2, b, c, t);\n slerp(out, temp1, temp2, 2 * t * (1 - t));\n return out;\n };\n}();\n/**\n * Sets the specified quaternion with values corresponding to the given\n * axes. Each axis is a vec3 and is expected to be unit length and\n * perpendicular to all other specified axes.\n *\n * @param {ReadonlyVec3} view the vector representing the viewing direction\n * @param {ReadonlyVec3} right the vector representing the local \"right\" direction\n * @param {ReadonlyVec3} up the vector representing the local \"up\" direction\n * @returns {quat} out\n */\n\nexport var setAxes = function () {\n var matr = mat3.create();\n return function (out, view, right, up) {\n matr[0] = right[0];\n matr[3] = right[1];\n matr[6] = right[2];\n matr[1] = up[0];\n matr[4] = up[1];\n matr[7] = up[2];\n matr[2] = -view[0];\n matr[5] = -view[1];\n matr[8] = -view[2];\n return normalize(out, fromMat3(out, matr));\n };\n}();","import * as glMatrix from \"./common.js\";\n/**\n * 2 Dimensional Vector\n * @module vec2\n */\n\n/**\n * Creates a new, empty vec2\n *\n * @returns {vec2} a new 2D vector\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(2);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n }\n\n return out;\n}\n/**\n * Creates a new vec2 initialized with values from an existing vector\n *\n * @param {ReadonlyVec2} a vector to clone\n * @returns {vec2} a new 2D vector\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(2);\n out[0] = a[0];\n out[1] = a[1];\n return out;\n}\n/**\n * Creates a new vec2 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} a new 2D vector\n */\n\nexport function fromValues(x, y) {\n var out = new glMatrix.ARRAY_TYPE(2);\n out[0] = x;\n out[1] = y;\n return out;\n}\n/**\n * Copy the values from one vec2 to another\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the source vector\n * @returns {vec2} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n return out;\n}\n/**\n * Set the components of a vec2 to the given values\n *\n * @param {vec2} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} out\n */\n\nexport function set(out, x, y) {\n out[0] = x;\n out[1] = y;\n return out;\n}\n/**\n * Adds two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n return out;\n}\n/**\n * Multiplies two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n return out;\n}\n/**\n * Divides two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n return out;\n}\n/**\n * Math.ceil the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to ceil\n * @returns {vec2} out\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n return out;\n}\n/**\n * Math.floor the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to floor\n * @returns {vec2} out\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n return out;\n}\n/**\n * Returns the minimum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n return out;\n}\n/**\n * Returns the maximum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n return out;\n}\n/**\n * Math.round the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to round\n * @returns {vec2} out\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n return out;\n}\n/**\n * Scales a vec2 by a scalar number\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec2} out\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n return out;\n}\n/**\n * Adds two vec2's after scaling the second operand by a scalar value\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec2} out\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n return out;\n}\n/**\n * Calculates the euclidian distance between two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} distance between a and b\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return Math.hypot(x, y);\n}\n/**\n * Calculates the squared euclidian distance between two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return x * x + y * y;\n}\n/**\n * Calculates the length of a vec2\n *\n * @param {ReadonlyVec2} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport function length(a) {\n var x = a[0],\n y = a[1];\n return Math.hypot(x, y);\n}\n/**\n * Calculates the squared length of a vec2\n *\n * @param {ReadonlyVec2} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\nexport function squaredLength(a) {\n var x = a[0],\n y = a[1];\n return x * x + y * y;\n}\n/**\n * Negates the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to negate\n * @returns {vec2} out\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n return out;\n}\n/**\n * Returns the inverse of the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to invert\n * @returns {vec2} out\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n return out;\n}\n/**\n * Normalize a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to normalize\n * @returns {vec2} out\n */\n\nexport function normalize(out, a) {\n var x = a[0],\n y = a[1];\n var len = x * x + y * y;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n return out;\n}\n/**\n * Calculates the dot product of two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} dot product of a and b\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1];\n}\n/**\n * Computes the cross product of two vec2's\n * Note that the cross product must by definition produce a 3D vector\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec3} out\n */\n\nexport function cross(out, a, b) {\n var z = a[0] * b[1] - a[1] * b[0];\n out[0] = out[1] = 0;\n out[2] = z;\n return out;\n}\n/**\n * Performs a linear interpolation between two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec2} out\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0],\n ay = a[1];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec2} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec2} out\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n out[0] = Math.cos(r) * scale;\n out[1] = Math.sin(r) * scale;\n return out;\n}\n/**\n * Transforms the vec2 with a mat2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat2} m matrix to transform with\n * @returns {vec2} out\n */\n\nexport function transformMat2(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y;\n out[1] = m[1] * x + m[3] * y;\n return out;\n}\n/**\n * Transforms the vec2 with a mat2d\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat2d} m matrix to transform with\n * @returns {vec2} out\n */\n\nexport function transformMat2d(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y + m[4];\n out[1] = m[1] * x + m[3] * y + m[5];\n return out;\n}\n/**\n * Transforms the vec2 with a mat3\n * 3rd vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat3} m matrix to transform with\n * @returns {vec2} out\n */\n\nexport function transformMat3(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[3] * y + m[6];\n out[1] = m[1] * x + m[4] * y + m[7];\n return out;\n}\n/**\n * Transforms the vec2 with a mat4\n * 3rd vector component is implicitly '0'\n * 4th vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec2} out\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0];\n var y = a[1];\n out[0] = m[0] * x + m[4] * y + m[12];\n out[1] = m[1] * x + m[5] * y + m[13];\n return out;\n}\n/**\n * Rotate a 2D vector\n * @param {vec2} out The receiving vec2\n * @param {ReadonlyVec2} a The vec2 point to rotate\n * @param {ReadonlyVec2} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec2} out\n */\n\nexport function rotate(out, a, b, rad) {\n //Translate point to the origin\n var p0 = a[0] - b[0],\n p1 = a[1] - b[1],\n sinC = Math.sin(rad),\n cosC = Math.cos(rad); //perform rotation and translate to correct position\n\n out[0] = p0 * cosC - p1 * sinC + b[0];\n out[1] = p0 * sinC + p1 * cosC + b[1];\n return out;\n}\n/**\n * Get the angle between two 2D vectors\n * @param {ReadonlyVec2} a The first operand\n * @param {ReadonlyVec2} b The second operand\n * @returns {Number} The angle in radians\n */\n\nexport function angle(a, b) {\n var x1 = a[0],\n y1 = a[1],\n x2 = b[0],\n y2 = b[1],\n // mag is the product of the magnitudes of a and b\n mag = Math.sqrt(x1 * x1 + y1 * y1) * Math.sqrt(x2 * x2 + y2 * y2),\n // mag &&.. short circuits if mag == 0\n cosine = mag && (x1 * x2 + y1 * y2) / mag; // Math.min(Math.max(cosine, -1), 1) clamps the cosine between -1 and 1\n\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\n * Set the components of a vec2 to zero\n *\n * @param {vec2} out the receiving vector\n * @returns {vec2} out\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec2} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"vec2(\" + a[0] + \", \" + a[1] + \")\";\n}\n/**\n * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec2} a The first vector.\n * @param {ReadonlyVec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec2} a The first vector.\n * @param {ReadonlyVec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1];\n var b0 = b[0],\n b1 = b[1];\n 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));\n}\n/**\n * Alias for {@link vec2.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Alias for {@link vec2.subtract}\n * @function\n */\n\nexport var sub = subtract;\n/**\n * Alias for {@link vec2.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link vec2.divide}\n * @function\n */\n\nexport var div = divide;\n/**\n * Alias for {@link vec2.distance}\n * @function\n */\n\nexport var dist = distance;\n/**\n * Alias for {@link vec2.squaredDistance}\n * @function\n */\n\nexport var sqrDist = squaredDistance;\n/**\n * Alias for {@link vec2.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec2s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 2;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n }\n\n return a;\n };\n}();","import type { quat } from \"gl-matrix\";\nimport { vec3 } from \"gl-matrix\";\n\nexport const circumference = 40075017;\n\nexport const radians = (_: number) => (_ / 180) * Math.PI;\n\nexport const degrees = (_: number) => (_ * 180) / Math.PI;\n\nexport const quadratic = (a: number, b: number, c: number) => {\n const q = Math.sqrt(b * b - 4 * a * c);\n return [(-b - q) / (2 * a), (-b + q) / (2 * a)];\n};\n\nexport const mercator = (\n [lng = 0, lat = 0, alt = 0]: vec3,\n out = vec3.create(),\n) =>\n vec3.set(\n out,\n lng / 360 + 0.5,\n -Math.asinh(Math.tan(radians(lat))) / (2 * Math.PI) + 0.5,\n alt / circumference,\n );\n\nexport const geodetic = ([x = 0, y = 0, z = 0]: vec3, out = vec3.create()) =>\n vec3.set(\n out,\n (x - 0.5) * 360,\n degrees(Math.atan(Math.sinh(-(y - 0.5) * (2 * Math.PI)))),\n z * circumference,\n );\n\nexport const tileToMercator = (\n [x = 0, y = 0, z = 0]: vec3,\n out = vec3.create(),\n) => {\n const k = 2 ** -z;\n return vec3.set(out, x * k, y * k, 0);\n};\n\nexport const toQuaternion = ([pitch = 0, yaw = 0, roll = 0]: vec3) => {\n const cy = Math.cos(yaw * 0.5);\n const sy = Math.sin(yaw * 0.5);\n const cp = Math.cos(pitch * 0.5);\n const sp = Math.sin(pitch * 0.5);\n const cr = Math.cos(roll * 0.5);\n const sr = Math.sin(roll * 0.5);\n\n const w = cr * cp * cy + sr * sp * sy;\n const x = sr * cp * cy - cr * sp * sy;\n const y = cr * sp * cy + sr * cp * sy;\n const z = cr * cp * sy - sr * sp * cy;\n\n return [x, y, z, w] satisfies quat;\n};\n\nexport const toOrientation = ([x = 0, y = 0, z = 0, w = 0]: quat) => {\n const roll = Math.atan2(2 * (w * x + y * z), 1 - 2 * (x * x + y * y));\n const pitch = Math.asin(2 * (w * y - z * x));\n const yaw = Math.atan2(2 * (w * z + x * y), 1 - 2 * (y * y + z * z));\n return [pitch, yaw, roll] satisfies vec3;\n};\n","import type { vec3 } from \"gl-matrix\";\n\nimport { debounce } from \"./common\";\nimport { circumference } from \"./math\";\nimport type { World } from \"./world\";\n\nconst minimumDistance = 100;\n\nexport type MouseControl = {\n enabled: boolean;\n draggable: boolean;\n rotatable: boolean;\n dispose: () => void;\n};\n\nexport const createMouseControl = (canvas: HTMLCanvasElement, world: World) => {\n let enabled = true;\n let draggable = true;\n let rotatable = true;\n let zooming = false;\n let recentered = false;\n\n const onMouseDown = () => {\n recentered = false;\n if (!enabled || !draggable) return;\n };\n\n const onMouseMove = ({ buttons, movementX, movementY, x, y }: MouseEvent) => {\n if (!enabled) return;\n if (draggable && !recentered) {\n world.recenter([x, y]);\n recentered = true;\n }\n if (buttons === 1 && draggable) {\n const [width = 0, height = 0] = world.view.screen;\n world.view = {\n ...world.view,\n offset: [x - width / 2, y - height / 2],\n };\n } else if (buttons === 2 && rotatable) {\n const {\n screen: [width = 0, height = 0],\n orientation: [pitch = 0, roll = 0, yaw = 0],\n } = world.view;\n const orientation = [\n Math.min(\n Math.PI / 2,\n Math.max(0, pitch - (movementY / height) * Math.PI),\n ),\n roll,\n yaw - (movementX / width) * Math.PI,\n ] satisfies vec3;\n world.view = {\n ...world.view,\n orientation,\n };\n }\n };\n\n const clearZooming = debounce(() => (zooming = false), 100);\n\n const onWheel = ({ x, y, deltaY }: WheelEvent) => {\n if (!enabled) return;\n if (!zooming) {\n if (draggable) world.recenter([x, y]);\n zooming = true;\n }\n const distance = Math.min(\n Math.max(world.view.distance * Math.exp(deltaY * 0.001), minimumDistance),\n circumference,\n );\n world.view = {\n ...world.view,\n distance,\n };\n clearZooming();\n };\n\n const onContextMenu = (event: MouseEvent) => event.preventDefault();\n\n canvas.addEventListener(\"mousedown\", onMouseDown);\n canvas.addEventListener(\"mousemove\", onMouseMove);\n canvas.addEventListener(\"wheel\", onWheel, { passive: true });\n canvas.addEventListener(\"contextmenu\", onContextMenu);\n\n const dispose = () => {\n canvas.removeEventListener(\"mousedown\", onMouseDown);\n canvas.removeEventListener(\"mousemove\", onMouseMove);\n canvas.removeEventListener(\"wheel\", onWheel);\n canvas.removeEventListener(\"contextmenu\", onContextMenu);\n };\n\n return {\n get enabled() {\n return enabled;\n },\n set enabled(_: boolean) {\n enabled = _;\n },\n get draggable() {\n return draggable;\n },\n set draggable(_: boolean) {\n draggable = _;\n },\n get rotatable() {\n return rotatable;\n },\n set rotatable(_: boolean) {\n rotatable = _;\n },\n dispose,\n } satisfies MouseControl;\n};\n","export type Buffer = {\n set: (value: number[]) => void;\n use: () => void;\n dispose: () => void;\n};\n\nexport const createBuffer = ({\n gl,\n type,\n target,\n}: {\n gl: WebGL2RenderingContext;\n type: \"f32\" | \"u16\" | \"i32\";\n target: \"array\" | \"element\";\n}) => {\n const buffer = gl.createBuffer();\n if (!buffer) throw new Error(\"Buffer creation failed\");\n\n const glTarget =\n target === \"array\" ? gl.ARRAY_BUFFER : gl.ELEMENT_ARRAY_BUFFER;\n\n const use = () => gl.bindBuffer(glTarget, buffer);\n\n return {\n set: value => {\n use();\n gl.bufferData(\n glTarget,\n type === \"u16\"\n ? new Uint16Array(value)\n : type === \"i32\"\n ? new Int32Array(value)\n : new Float32Array(value),\n gl.DYNAMIC_DRAW,\n );\n },\n use,\n dispose: () => gl.deleteBuffer(buffer),\n } satisfies Buffer;\n};\n","import type { mat4, vec2, vec3, vec4 } from \"gl-matrix\";\n\nimport type { Buffer } from \"./buffer\";\n\nexport type Program = {\n use: () => void;\n uniform1f: (name: string) => Uniform<number>;\n uniform1i: (name: string) => Uniform<number>;\n uniform2f: (name: string) => Uniform<vec2>;\n uniform2i: (name: string) => Uniform<vec2>;\n uniform3f: (name: string) => Uniform<vec3>;\n uniform3i: (name: string) => Uniform<vec3>;\n uniform4f: (name: string) => Uniform<vec4>;\n uniform4i: (name: string) => Uniform<vec4>;\n uniformMatrix4f: (name: string) => Uniform<mat4>;\n attribute2f: (\n name: string,\n buffer: Buffer,\n _?: { stride?: number; offset?: number },\n ) => Attribute;\n attribute3f: (\n name: string,\n buffer: Buffer,\n _?: { stride?: number; offset?: number },\n ) => Attribute;\n attribute3i: (\n name: string,\n buffer: Buffer,\n _?: { stride?: number; offset?: number },\n ) => Attribute;\n dispose: () => void;\n};\n\nexport type Uniform<T> = {\n set: (value: T) => void;\n};\n\nexport type Attribute = {\n use: () => void;\n};\n\nexport const createProgram = ({\n gl,\n vertexSource,\n fragmentSource,\n}: {\n gl: WebGL2RenderingContext;\n vertexSource: string;\n fragmentSource: string;\n}) => {\n const program = gl.createProgram();\n if (!program) throw new Error(\"Program creation failed\");\n\n const vertexShader = compileShader(\n gl,\n gl.createShader(gl.VERTEX_SHADER),\n vertexSource,\n );\n const fragmentShader = compileShader(\n gl,\n gl.createShader(gl.FRAGMENT_SHADER),\n fragmentSource,\n );\n\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n console.error(\"Link failure\", gl.getProgramInfoLog(program));\n throw new Error(\"Link failure\");\n }\n\n const use = () => gl.useProgram(program);\n\n const uniform = <T extends number | vec2 | vec3 | vec4 | mat4>(\n name: string,\n f: (location: WebGLUniformLocation, value: T) => void,\n ) => {\n const location = gl.getUniformLocation(program, name);\n let cached: T | undefined;\n const set = (value: T) => {\n if (value === cached) return;\n if (location) f(location, value);\n cached = value;\n };\n return { set };\n };\n\n const uniform1f = (name: string) =>\n uniform<number>(name, (location, x) => gl.uniform1f(location, x));\n const uniform1i = (name: string) =>\n uniform<number>(name, (location, x) => gl.uniform1i(location, x));\n const uniform2f = (name: string) =>\n uniform<vec2>(name, (location, [x = 0, y = 0]) =>\n gl.uniform2f(location, x, y),\n );\n const uniform2i = (name: string) =>\n uniform<vec2>(name, (location, [x = 0, y = 0]) =>\n gl.uniform2i(location, x, y),\n );\n const uniform3f = (name: string) =>\n uniform<vec3>(name, (location, [x = 0, y = 0, z = 0]) =>\n gl.uniform3f(location, x, y, z),\n );\n const uniform3i = (name: string) =>\n uniform<vec3>(name, (location, [x = 0, y = 0, z = 0]) =>\n gl.uniform3i(location, x, y, z),\n );\n const uniform4f = (name: string) =>\n uniform<vec4>(name, (location, [x = 0, y = 0, z = 0, w = 0]) =>\n gl.uniform4f(location, x, y, z, w),\n );\n const uniform4i = (name: string) =>\n uniform<vec4>(name, (location, [x = 0, y = 0, z = 0, w = 0]) =>\n gl.uniform4i(location, x, y, z, w),\n );\n const uniformMatrix4f = (name: string) =>\n uniform<mat4>(name, (location, value) =>\n gl.uniformMatrix4fv(location, false, value),\n );\n\n const attribute = ({\n name,\n buffer,\n size,\n type,\n stride,\n offset,\n }: {\n name: string;\n buffer: Buffer;\n size: number;\n type: \"f32\" | \"i32\" | \"u16\";\n stride?: number;\n offset?: number;\n }) => {\n const location = gl.getAttribLocation(program, name);\n if (location === -1) throw new Error(`Missing attribute: ${name}`);\n\n const use = () => {\n buffer.use();\n gl.enableVertexAttribArray(location);\n if ([\"u16\", \"i32\"].includes(type))\n gl.vertexAttribIPointer(\n location,\n size,\n type === \"u16\" ? gl.UNSIGNED_SHORT : gl.INT,\n stride || 0,\n offset || 0,\n );\n else\n gl.vertexAttribPointer(\n location,\n size,\n gl.FLOAT,\n false,\n stride || 0,\n offset || 0,\n );\n };\n\n return { use } satisfies Attribute;\n };\n\n const attribute2f = (\n name: string,\n buffer: Buffer,\n options: { stride?: number; offset?: number } = {},\n ) => attribute({ name, buffer, size: 2, type: \"f32\", ...options });\n\n const attribute3f = (\n name: string,\n buffer: Buffer,\n options: { stride?: number; offset?: number } = {},\n ) => attribute({ name, buffer, size: 3, type: \"f32\", ...options });\n\n const attribute3i = (\n name: string,\n buffer: Buffer,\n options: { stride?: number; offset?: number } = {},\n ) => attribute({ name, buffer, size: 3, type: \"i32\", ...options });\n\n const dispose = () => {\n gl.deleteProgram(program);\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n };\n\n return {\n use,\n uniform1f,\n uniform1i,\n uniform2f,\n uniform2i,\n uniform3f,\n uniform3i,\n uniform4f,\n uniform4i,\n uniformMatrix4f,\n attribute2f,\n attribute3f,\n attribute3i,\n dispose,\n } satisfies Program;\n};\n\nconst compileShader = (\n gl: WebGL2RenderingContext,\n shader: WebGLShader | null,\n source: string,\n) => {\n if (!shader) throw new Error(\"Shader creation failed\");\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n console.error(\"Compilation failed\", gl.getShaderInfoLog(shader));\n throw new Error(\"Compilation failure\");\n }\n return shader;\n};\n","import type { vec3 } from \"gl-matrix\";\n\nimport type { LayerOptions } from \".\";\n\nexport const one = 2 ** 30;\nexport const to = ([x = 0, y = 0, z = 0]: vec3) =>\n [Math.floor(x * one), Math.floor(y * one), Math.floor(z * one)] as vec3;\n\nexport const configure = (\n gl: WebGL2RenderingContext,\n _depth: boolean,\n options: Partial<LayerOptions>,\n) => {\n const { pickable, depth, polygonOffset } = {\n pickable: true,\n depth: true,\n polygonOffset: 0,\n ...options,\n };\n if (depth) gl.enable(gl.DEPTH_TEST);\n else gl.disable(gl.DEPTH_TEST);\n if (polygonOffset) {\n gl.enable(gl.POLYGON_OFFSET_FILL);\n gl.polygonOffset(0, polygonOffset);\n } else gl.disable(gl.POLYGON_OFFSET_FILL);\n if (_depth) {\n gl.disable(gl.BLEND);\n if (!pickable) return true;\n } else {\n gl.enable(gl.BLEND);\n gl.blendFuncSeparate(\n gl.SRC_ALPHA,\n gl.ONE_MINUS_SRC_ALPHA,\n gl.ONE,\n gl.ONE_MINUS_SRC_ALPHA,\n );\n }\n};\n","#version 300 es\n\nprecision highp float;\n\nuniform int index;\n\nout vec4 result;\n\nvec2 pack_depth(in float depth) {\n float value = depth * (256.f * 256.f - 1.f) / (256.f * 256.f);\n vec3 encode = fract(value * vec3(1.f, 256.f, 256.f * 256.f));\n return encode.xy - encode.yz / 256.f + 1.f / 512.f;\n}\n\nvec2 pack_index(in int index) {\n float value = float(index) / 256.f;\n return vec2(floor(value) / 255.f, fract(value) * 256.f / 255.f);\n}\n\nvoid main(void) {\n result = vec4(pack_depth(gl_FragCoord.z), pack_index(index));\n}\n","import createImageLoadWorker from \"./image-load-worker?worker&inline\";\n\nconst worker = createImageLoadWorker();\n\nexport type ImageLoad = {\n loaded: boolean;\n cancel: () => void;\n};\n\nexport const createImageLoad = ({\n url,\n onLoad,\n}: {\n url: string;\n onLoad: (image: ImageBitmap | undefined) => void;\n}) => {\n let loaded = false;\n\n const handler = ({ data }: MessageEvent) => {\n if (canceled || url !== data.url) return;\n worker.removeEventListener(\"message\", handler);\n loaded = true;\n onLoad(data.image);\n };\n worker.addEventListener(\"message\", handler);\n\n let canceled = false;\n const cancel = () => {\n canceled = true;\n worker.postMessage([\"cancel\", url]);\n };\n\n worker.postMessage([\"load\", url]);\n\n return {\n get loaded() {\n return loaded;\n },\n cancel,\n } satisfies ImageLoad;\n};\n","export type Texture = {\n use: () => void;\n attach: () => void;\n dispose: () => void;\n};\n\nexport const createTexture = (gl: WebGL2RenderingContext) => {\n const texture = gl.createTexture();\n if (!texture) throw new Error(\"Texture creation failed\");\n\n const use = () => gl.bindTexture(gl.TEXTURE_2D, texture);\n\n const attach = () => {\n use();\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n texture,\n 0,\n );\n };\n\n const dispose = () => gl.deleteTexture(texture);\n\n return { use, attach, dispose } satisfies Texture;\n};\n","import { createImageLoad } from \"../../image-load\";\nimport { createTexture } from \"./texture\";\n\nexport type ImageTexture = {\n loaded: boolean;\n use: () => void;\n attach: () => void;\n dispose: () => void;\n};\n\nexport const createImageTexture = ({\n gl,\n url,\n onLoad,\n}: {\n gl: WebGL2RenderingContext;\n url: string;\n onLoad?: (_: ImageBitmap) => void;\n}) => {\n const texture = createTexture(gl);\n\n const imageLoad = createImageLoad({\n url,\n onLoad: image => {\n if (!image) return;\n texture.use();\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n image,\n );\n onLoad?.(image);\n },\n });\n\n const { use, attach } = texture;\n\n const dispose = () => {\n imageLoad.cancel();\n texture.dispose();\n };\n\n return {\n get loaded() {\n return imageLoad.loaded;\n },\n use,\n attach,\n dispose,\n } satisfies ImageTexture;\n};\n","#version 300 es\n\nprecision highp float;\n\nuniform sampler2D image;\nin vec2 uv_out;\nin vec4 color_out;\nout vec4 result;\n\nvoid main() {\n result = texture(image, uv_out) * color_out;\n if (result.a == 0.f) discard;\n}","#version 300 es\n\nprecision highp float;\n\nuniform mat4 projection;\nuniform mat4 model_view;\nuniform ivec3 camera;\nuniform vec2 screen;\nuniform vec2 image_size;\nuniform ivec3 position;\nuniform vec4 color;\nuniform float size;\nuniform float min_size_pixels;\nuniform float max_size_pixels;\n\n\nin vec2 corner;\nin vec2 uv;\nout vec2 uv_out;\nout vec4 color_out;\n\nconst int ONE = 1073741824; // 2^30\nconst float INV_ONE = 1.f / float(ONE);\nconst float CIRCUMFERENCE = 40075017.;\n\nvoid main(void) {\n vec4 projected = projection * model_view * vec4(vec3(position - camera) * INV_ONE, 1.f);\n\n float pixel_size = projected.w / screen.y;\n float scale = clamp(size / CIRCUMFERENCE * -projection[1][1], min_size_pixels * pixel_size, max_size_pixels * pixel_size);\n\n gl_Position = projected + 0.5 * scale * screen.y / image_size.y * vec4(corner * image_size / screen, 0.f, 0.0f);\n\n uv_out = uv;\n color_out = color;\n}\n","import type { mat4, vec2, vec4 } from \"gl-matrix\";\nimport type { vec3 } from \"gl-matrix\";\n\nimport type { Buffer } from \"../../buffer\";\nimport { createBuffer } from \"../../buffer\";\nimport { mercator } from \"../../math\";\nimport { createProgram } from \"../../program\";\nimport type { Viewport } from \"../../viewport\";\nimport type { World } from \"../../world\";\nimport type { LayerOptions } from \"..\";\nimport { type BaseLayer, type Billboard } from \"..\";\nimport { configure, to } from \"../common\";\nimport depthSource from \"../depth.glsl\";\nimport { createImageTexture } from \"../terrain/image-texture\";\nimport type { Texture } from \"../terrain/texture\";\nimport fragmentSource from \"./fragment.glsl\";\nimport vertexSource from \"./vertex.glsl\";\n\nexport type BillboardLayer = BaseLayer & Billboard;\n\nexport const createBillboardLayer = (\n world: World,\n billboard: Partial<Billboard> = {},\n) => {\n const { gl } = world;\n let { options, url, position, color, size, minSizePixels, maxSizePixels } = {\n options: {},\n url: \"\",\n position: [0, 0, 0],\n color: [1, 1, 1, 1],\n size: 100,\n ...billboard,\n } satisfies Billboard;\n let imageSize: vec2 = [0, 0];\n\n const cornerBuffer = createBuffer({ gl, type: \"f32\", target: \"array\" });\n const uvBuffer = createBuffer({ gl, type: \"f32\", target: \"array\" });\n const indexBuffer = createBuffer({ gl, type: \"u16\", target: \"element\" });\n\n cornerBuffer.set(\n [\n [-1, -1],\n [-1, 1],\n [1, -1],\n [1, 1],\n ].flat(),\n );\n uvBuffer.set(\n [\n [0, 1],\n [0, 0],\n [1, 1],\n [1, 0],\n ].flat(),\n );\n indexBuffer.set(\n [\n [0, 1, 3],\n [0, 3, 2],\n ].flat(),\n );\n\n let image: Texture | undefined;\n\n const update = () => {\n image?.dispose();\n image = createImageTexture({\n gl,\n url,\n onLoad: ({ width, height }) => {\n imageSize = [width, height];\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n },\n });\n };\n\n update();\n\n const { renderProgram, depthProgram } = createPrograms(gl, {\n cornerBuffer,\n uvBuffer,\n indexBuffer,\n });\n\n const render = ({\n viewport: { projection, modelView, camera, screen },\n depth = false,\n index = 0,\n }: {\n viewport: Viewport;\n depth?: boolean;\n index?: number;\n }) => {\n if (configure(gl, depth, options)) return;\n if (!image) return;\n const program = depth ? depthProgram : renderProgram;\n program.execute({\n projection,\n modelView,\n camera: to(camera),\n screen,\n image,\n imageSize,\n position: to(mercator(position)),\n color,\n size,\n minSizePixels: minSizePixels || 0,\n maxSizePixels: maxSizePixels || Number.MAX_VALUE,\n index,\n });\n };\n\n const dispose = () => {\n cornerBuffer.dispose();\n uvBuffer.dispose();\n indexBuffer.dispose();\n renderProgram.dispose();\n depthProgram.dispose();\n image?.dispose();\n world.remove(layer);\n };\n\n const layer = {\n render,\n dispose,\n get options() {\n return options;\n },\n set options(_: Partial<LayerOptions>) {\n options = _;\n },\n get url() {\n return url;\n },\n set url(_: string) {\n url = _;\n update();\n },\n get position() {\n return position;\n },\n set position(_: vec3) {\n position = _;\n },\n get color() {\n return color;\n },\n set color(_: vec4) {\n color = _;\n },\n get size() {\n return size;\n },\n set size(_: number) {\n size = _;\n },\n get minSizePixels() {\n return minSizePixels;\n },\n set minSizePixels(_: number | undefined) {\n minSizePixels = _;\n },\n get maxSizePixels() {\n return maxSizePixels;\n },\n set maxSizePixels(_: number | undefined) {\n maxSizePixels = _;\n },\n } satisfies BillboardLayer;\n\n world.add(layer);\n\n return layer;\n};\n\nconst createPrograms = (\n gl: WebGL2RenderingContext,\n {\n cornerBuffer,\n uvBuffer,\n indexBuffer,\n }: {\n cornerBuffer: Buffer;\n uvBuffer: Buffer;\n indexBuffer: Buffer;\n },\n) => {\n const createRenderProgram = (depth = false) => {\n const program = createProgram({\n gl,\n vertexSource,\n fragmentSource: depth ? depthSource : fragmentSource,\n });\n\n const cornerAttribute = program.attribute2f(\"corner\", cornerBuffer, {\n stride: 2 * Float32Array.BYTES_PER_ELEMENT,\n });\n const uvAttribute = program.attribute2f(\"uv\", uvBuffer, {\n stride: 2 * Float32Array.BYTES_PER_ELEMENT,\n });\n\n const projectionUniform = program.uniformMatrix4f(\"projection\");\n const modelViewUniform = program.uniformMatrix4f(\"model_view\");\n const cameraUniform = program.uniform3i(\"camera\");\n const screenUniform = program.uniform2f(\"screen\");\n const imageUniform = program.uniform1i(\"image\");\n const imageSizeUniform = program.uniform2f(\"image_size\");\n const positionUniform = program.uniform3i(\"position\");\n const colorUniform = program.uniform4f(\"color\");\n const indexUniform = program.uniform1i(\"index\");\n const sizeUniform = program.uniform1f(\"size\");\n const minSizePixelsUniform = program.uniform1f(\"min_size_pixels\");\n const maxSizePixelsUniform = program.uniform1f(\"max_size_pixels\");\n\n const execute = ({\n projection,\n modelView,\n camera,\n screen,\n image,\n imageSize,\n position,\n color,\n size,\n minSizePixels,\n maxSizePixels,\n index,\n }: {\n projection: mat4;\n modelView: mat4;\n camera: vec3;\n screen: vec2;\n image: Texture;\n imageSize: vec2;\n position: vec3;\n color: vec4;\n size: number;\n minSizePixels: number;\n maxSizePixels: number;\n index: number;\n }) => {\n program.use();\n\n cornerAttribute.use();\n uvAttribute.use();\n\n projectionUniform.set(projection);\n modelViewUniform.set(modelView);\n cameraUniform.set(camera);\n screenUniform.set(screen);\n imageSizeUniform.set(imageSize);\n positionUniform.set(position);\n colorUniform.set(color);\n sizeUniform.set(size);\n minSizePixelsUniform.set(minSizePixels);\n maxSizePixelsUniform.set(maxSizePixels);\n indexUniform.set(index);\n\n gl.activeTexture(gl.TEXTURE0);\n imageUniform.set(0);\n image.use();\n\n indexBuffer.use();\n\n gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0);\n };\n\n const { dispose } = program;\n\n return { execute, dispose };\n };\n\n const renderProgram = createRenderProgram();\n const depthProgram = createRenderProgram(true);\n\n return { renderProgram, depthProgram };\n};\n","#version 300 es\n\nprecision highp float;\n\nin vec4 color_out;\nout vec4 result;\n\nvoid main() {\n if (color_out.a == 0.f) discard;\n result = color_out;\n}","#version 300 es\n\nprecision highp float;\n\nuniform mat4 projection;\nuniform mat4 model_view;\nuniform ivec3 camera;\nuniform vec2 screen;\nuniform vec4 color;\nuniform float width;\nuniform float min_width_pixels;\nuniform float max_width_pixels;\n\nin ivec3 previous;\nin ivec3 current;\nin ivec3 next;\nin vec2 corner;\nout vec4 color_out;\n\nconst int ONE = 1073741824; // 2^30\nconst float INV_ONE = 1.f / float(ONE);\nconst float CIRCUMFERENCE = 40075017.;\n\nvec4 transform(ivec3 v) {\n return projection * model_view * vec4(vec3(v - camera) * INV_ONE, 1.f);\n}\n\nvoid main(void) {\n vec4 projected_previous = transform(previous);\n vec4 projected_current = transform(current);\n vec4 projected_next = transform(next);\n\n vec2 screen_previous = projected_previous.xy / abs(projected_previous.w) * screen;\n vec2 screen_current = projected_current.xy / abs(projected_current.w) * screen;\n vec2 screen_next = projected_next.xy / abs(projected_next.w) * screen;\n\n vec2 a = normalize(screen_current - screen_previous);\n vec2 b = normalize(screen_next - screen_current);\n if(screen_current == screen_previous)\n a = b;\n if(screen_next == screen_current)\n b = a;\n vec2 direction = normalize(a + b);\n vec2 point = normalize(a - b);\n vec2 normal = vec2(-direction.y, direction.x);\n vec2 offset;\n\n if(sign(corner.y * dot(normal, point)) > 0.0f) {\n vec2 ap = vec2(-a.y, a.x);\n vec2 bp = vec2(-b.y, b.x);\n offset = 0.5f * corner.y * (corner.x * (bp - ap) + ap + bp);\n } else {\n float distance = clamp(1.f / cos(acos(clamp(dot(a, b), -1.f, 1.f))/ 2.f), 0.f, 1.f);\n offset = normal * distance * corner.y;\n }\n\n float pixel_size = abs(projected_current.w) / screen.y;\n float scale = clamp(width / CIRCUMFERENCE * -projection[1][1], min_width_pixels * pixel_size, max_width_pixels * pixel_size) ;\n\n gl_Position = projected_current + 0.5 * vec4(scale * offset, 0.f, 0.f);\n\n color_out = color;\n}\n","import type { mat4, vec2, vec4 } from \"gl-matrix\";\nimport type { vec3 } from \"gl-matrix\";\n\nimport type { Buffer } from \"../../buffer\";\nimport { createBuffer } from \"../../buffer\";\nimport { range } from \"../../common\";\nimport { mercator } from \"../../math\";\nimport { createProgram } from \"../../program\";\nimport type { Viewport } from \"../../viewport\";\nimport type { World } from \"../../world\";\nimport type { LayerOptions } from \"../\";\nimport { type BaseLayer, type Line } from \"../\";\nimport { configure, to } from \"../common\";\nimport depthSource from \"../depth.glsl\";\nimport fragmentSource from \"./fragment.glsl\";\nimport vertexSource from \"./vertex.glsl\";\n\nexport type LineLayer = BaseLayer & Line;\n\nexport const createLineLayer = (world: World, line: Partial<Line> = {}) => {\n const { gl } = world;\n let { options, points, color, width, minWidthPixels, maxWidthPixels } = {\n options: {},\n points: [],\n color: [1, 1, 1, 1],\n width: 1,\n ...line,\n } satisfies Line;\n\n let count = 0;\n\n const positionBuffer = createBuffer({ gl, type: \"i32\", target: \"array\" });\n const indexBuffer = createBuffer({ gl, type: \"u16\", target: \"element\" });\n const cornerBuffer = createBuffer({ gl, type: \"f32\", target: \"array\" });\n\n const { renderProgram, depthProgram } = createPrograms(gl, {\n positionBuffer,\n indexBuffer,\n cornerBuffer,\n });\n\n const render = ({\n viewport: { projection, modelView, camera, screen },\n depth = false,\n index = 0,\n }: {\n viewport: Viewport;\n depth?: boolean;\n index?: number;\n }) => {\n if (configure(gl, depth, options)) return;\n const program = depth ? depthProgram : renderProgram;\n program.execute({\n projection,\n modelView,\n camera: to(camera),\n screen,\n count,\n color,\n width,\n minWidthPixels: minWidthPixels || 0,\n maxWidthPixels: maxWidthPixels || Number.MAX_VALUE,\n index,\n });\n };\n\n const updatePoints = (_: vec3[][]) => {\n points = _;\n\n const positionData = _.flatMap(_ => {\n const [first] = _;\n const [last] = _.slice(-1);\n\n if (!first || !last) return [];\n\n return [first, ..._, last]\n .map(_ => to(mercator(_)))\n .flatMap(_ => [..._, ..._, ..._, ..._]);\n });\n\n const { indexData } = _.reduce<{\n indexData: number[];\n count: number;\n }>(\n ({ indexData, count }, _) => {\n if (_.length === 0) return { indexData, count };\n const indices = range(0, (_.length - 1) * 2).flatMap(i => {\n const [a = 0, b = 0, c = 0, d = 0] = range(0, 4).map(\n _ => _ + i * 2 + count,\n );\n return [\n [a, b, d],\n [a, d, c],\n ].flat();\n });\n count += (_.length + 2) * 4;\n indexData = indexData.concat(indices);\n return { indexData, count };\n },\n { indexData: [], count: 0 },\n );\n count = indexData.length;\n\n const cornerData = _.flatMap(_ =>\n _.length === 0\n ? []\n : range(0, (_.length + 1) * 2).flatMap(() =>\n [\n [-1, -1],\n [-1, 1],\n [1, -1],\n [1, 1],\n ].flat(),\n ),\n );\n\n positionBuffer.set(positionData);\n indexBuffer.set(indexData);\n cornerBuffer.set(cornerData);\n };\n\n updatePoints(points);\n\n const dispose = () => {\n positionBuffer.dispose();\n indexBuffer.dispose();\n cornerBuffer.dispose();\n renderProgram.dispose();\n depthProgram.dispose();\n world.remove(layer);\n };\n\n const layer = {\n render,\n dispose,\n get options() {\n return options;\n },\n set options(_: Partial<LayerOptions>) {\n options = _;\n },\n get points() {\n return points;\n },\n set points(_: vec3[][]) {\n updatePoints(_);\n },\n get color() {\n return color;\n },\n set color(_: vec4) {\n color = _;\n },\n get width() {\n return width;\n },\n set width(_: number) {\n width = _;\n },\n get minWidthPixels() {\n return minWidthPixels;\n },\n set minWidthPixels(_: number | undefined) {\n minWidthPixels = _;\n },\n get maxWidthPixels() {\n return maxWidthPixels;\n },\n set maxWidthPixels(_: number | undefined) {\n maxWidthPixels = _;\n },\n } satisfies LineLayer;\n\n world.add(layer);\n\n return layer;\n};\n\nconst createPrograms = (\n gl: WebGL2RenderingContext,\n {\n positionBuffer,\n indexBuffer,\n cornerBuffer,\n }: {\n positionBuffer: Buffer;\n indexBuffer: Buffer;\n cornerBuffer: Buffer;\n },\n) => {\n const createRenderProgram = (depth = false) => {\n const program = createProgram({\n gl,\n vertexSource,\n fragmentSource: depth ? depthSource : fragmentSource,\n });\n\n const FLOAT_BYTES = Float32Array.BYTES_PER_ELEMENT;\n const INT_BYTES = Int32Array.BYTES_PER_ELEMENT;\n\n const previousAttribute = program.attribute3i(\"previous\", positionBuffer, {\n stride: INT_BYTES * 3,\n });\n const currentAttribute = program.attribute3i(\"current\", positionBuffer, {\n stride: INT_BYTES * 3,\n offset: INT_BYTES * 3 * 4,\n });\n const nextAttribute = program.attribute3i(\"next\", positionBuffer, {\n stride: INT_BYTES * 3,\n offset: INT_BYTES * 3 * 4 * 2,\n });\n const cornerAttribute = program.attribute2f(\"corner\", cornerBuffer, {\n stride: FLOAT_BYTES * 2,\n });\n\n const projectionUniform = program.uniformMatrix4f(\"projection\");\n const modelViewUniform = program.uniformMatrix4f(\"model_view\");\n const cameraUniform = program.uniform3i(\"camera\");\n const screenUniform = program.uniform2f(\"screen\");\n const colorUniform = program.uniform4f(\"color\");\n const widthUniform = program.uniform1f(\"width\");\n const maxWidthPixelsUniform = program.uniform1f(\"max_width_pixels\");\n const minWidthPixelsUniform = program.uniform1f(\"min_width_pixels\");\n const indexUniform = program.uniform1i(\"index\");\n\n const execute = ({\n projection,\n modelView,\n camera,\n screen,\n count,\n color,\n width,\n minWidthPixels,\n maxWidthPixels,\n index,\n }: {\n projection: mat4;\n modelView: mat4;\n camera: vec3;\n screen: vec2;\n count: number;\n color: vec4;\n width: number;\n minWidthPixels: number;\n maxWidthPixels: number;\n index: number;\n }) => {\n if (count === 0) return;\n\n program.use();\n\n previousAttribute.use();\n currentAttribute.use();\n nextAttribute.use();\n cornerAttribute.use();\n\n projectionUniform.set(projection);\n modelViewUniform.set(modelView);\n cameraUniform.set(camera);\n screenUniform.set(screen);\n colorUniform.set(color);\n widthUniform.set(width);\n minWidthPixelsUniform.set(minWidthPixels);\n maxWidthPixelsUniform.set(maxWidthPixels);\n indexUniform.set(index);\n\n indexBuffer.use();\n\n gl.drawElements(gl.TRIANGLES, count, gl.UNSIGNED_SHORT, 0);\n };\n\n const { dispose } = program;\n\n return { execute, dispose };\n };\n\n const renderProgram = createRenderProgram();\n const depthProgram = createRenderProgram(true);\n\n return { renderProgram, depthProgram };\n};\n","#version 300 es\n\nprecision highp float;\n\nin vec4 color_out;\nout vec4 result;\n\nvoid main() {\n result = color_out;\n}","#version 300 es\n\nprecision highp float;\n\nuniform mat4 projection;\nuniform mat4 model_view;\nuniform ivec3 camera;\nuniform vec2 screen;\nuniform ivec3 position;\nuniform mat4 orientation;\nuniform vec4 color;\nuniform float size;\nuniform float min_size_pixels;\nuniform float max_size_pixels;\n\nin vec3 vertex;\nout vec4 color_out;\n\nconst int ONE = 1073741824; // 2^30\nconst float INV_ONE = 1.f / float(ONE);\nconst float CIRCUMFERENCE = 40075017.;\n\nvec4 transform(vec3 v) {\n return projection * model_view * vec4(vec3(position - camera) * INV_ONE + v, 1.f);\n}\n\nvoid main(void) {\n vec4 projected = transform(vec3(0.f, 0.f, 0.f));\n float pixel_size = projected.w / screen.y / -projection[1][1];\n float scale = clamp(size / CIRCUMFERENCE, min_size_pixels * pixel_size, max_size_pixels * pixel_size);\n\n vec4 q = orientation * vec4(vertex * scale, 1.f);\n gl_Position = transform(q.xyz / q.w);\n\n color_out = color;\n}\n","import type { quat, vec2, vec3, vec4 } from \"gl-matrix\";\nimport { mat4 } from \"gl-matrix\";\n\nimport type { Buffer } from \"../../buffer\";\nimport { createBuffer } from \"../../buffer\";\nimport { type Mesh } from \"../../layers\";\nimport { mercator } from \"../../math\";\nimport { createProgram } from \"../../program\";\nimport type { Viewport } from \"../../viewport\";\nimport type { World } from \"../../world\";\nimport type { BaseLayer, LayerOptions } from \"..\";\nimport { configure, to } from \"../common\";\nimport depthSource from \"../depth.glsl\";\nimport fragmentSource from \"./fragment.glsl\";\nimport vertexSource from \"./vertex.glsl\";\n\nexport type MeshLayer = BaseLayer & Mesh;\n\nexport const createMeshLayer = (world: World, mesh: Partial<Mesh> = {}) => {\n const { gl } = world;\n let {\n options,\n vertices,\n indices,\n position,\n orientation,\n color,\n size,\n minSizePixels,\n maxSizePixels,\n } = {\n options: {},\n vertices: [],\n indices: [],\n position: [0, 0, 0],\n orientation: [0, 0, 0, 1],\n color: [1, 1, 1, 1],\n size: 1,\n ...mesh,\n } satisfies Mesh;\n let count = 0;\n\n const vertexBuffer = createBuffer({ gl, type: \"f32\", target: \"array\" });\n const indexBuffer = createBuffer({ gl, type: \"u16\", target: \"element\" });\n\n const { renderProgram, depthProgram } = createPrograms(gl, {\n vertexBuffer,\n indexBuffer,\n });\n\n const render = ({\n viewport: { projection, modelView, camera, screen },\n depth = false,\n index = 0,\n }: {\n viewport: Viewport;\n depth?: boolean;\n index?: number;\n }) => {\n if (configure(gl, depth, options)) return;\n\n const program = depth ? depthProgram : renderProgram;\n program.execute({\n projection,\n modelView,\n camera: to(camera),\n screen,\n count,\n position: to(mercator(position)),\n orientation: mat4.fromQuat(mat4.create(), orientation),\n color,\n size,\n minSizePixels: minSizePixels || 0,\n maxSizePixels: maxSizePixels || Number.MAX_VALUE,\n index,\n });\n };\n\n const updateVertices = (_: vec3[]) => {\n vertices = _;\n vertexBuffer.set(_.flatMap(_ => [..._]));\n };\n\n const updateIndices = (_: vec3[]) => {\n indices = _;\n indexBuffer.set(_.flatMap(_ => [..._]));\n count = _.length * 3;\n };\n\n updateVertices(vertices);\n updateIndices(indices);\n\n const dispose = () => {\n vertexBuffer.dispose();\n indexBuffer.dispose();\n renderProgram.dispose();\n depthProgram.dispose();\n world.remove(layer);\n };\n\n const layer = {\n render,\n dispose,\n get options() {\n return options;\n },\n set options(_: Partial<LayerOptions>) {\n options = _;\n },\n get vertices() {\n return vertices;\n },\n set vertices(_: vec3[]) {\n updateVertices(_);\n },\n get indices() {\n return indices;\n },\n set indices(_: vec3[]) {\n updateIndices(_);\n },\n get position() {\n return position;\n },\n set position(_: vec3) {\n position = _;\n },\n get orientation() {\n return orientation;\n },\n set orientation(_: quat) {\n orientation = _;\n },\n get color() {\n return color;\n },\n set color(_: vec4) {\n color = _;\n },\n get size() {\n return size;\n },\n set size(_: number) {\n size = _;\n },\n get minSizePixels() {\n return minSizePixels;\n },\n set minSizePixels(_: number | undefined) {\n minSizePixels = _;\n },\n get maxSizePixels() {\n return maxSizePixels;\n },\n set maxSizePixels(_: number | undefined) {\n maxSizePixels = _;\n },\n } satisfies MeshLayer;\n\n world.add(layer);\n\n return layer;\n};\n\nconst createPrograms = (\n gl: WebGL2RenderingContext,\n {\n vertexBuffer,\n indexBuffer,\n }: {\n vertexBuffer: Buffer;\n indexBuffer: Buffer;\n },\n) => {\n const createRenderProgram = (depth = false) => {\n const program = createProgram({\n gl,\n vertexSource,\n fragmentSource: depth ? depthSource : fragmentSource,\n });\n\n const vertexAttribute = program.attribute3f(\"vertex\", vertexBuffer);\n\n const projectionUniform = program.uniformMatrix4f(\"projection\");\n const modelViewUniform = program.uniformMatrix4f(\"model_view\");\n const cameraUniform = program.uniform3i(\"camera\");\n const positionUniform = program.uniform3i(\"position\");\n const orientationUniform = program.uniformMatrix4f(\"orientation\");\n const screenUniform = program.uniform2f(\"screen\");\n const colorUniform = program.uniform4f(\"color\");\n const sizeUniform = program.uniform1f(\"size\");\n const minSizePixelsUniform = program.uniform1f(\"min_size_pixels\");\n const maxSizePixelsUniform = program.uniform1f(\"max_size_pixels\");\n const indexUniform = program.uniform1i(\"index\");\n\n const execute = ({\n projection,\n modelView,\n camera,\n screen,\n count,\n position,\n orientation,\n color,\n size,\n minSizePixels,\n maxSizePixels,\n index,\n }: {\n projection: mat4;\n modelView: mat4;\n camera: vec3;\n screen: vec2;\n count: number;\n position: vec3;\n orientation: mat4;\n color: vec4;\n size: number;\n minSizePixels: number;\n maxSizePixels: number;\n index: number;\n }) => {\n program.use();\n\n vertexAttribute.use();\n\n projectionUniform.set(projection);\n modelViewUniform.set(modelView);\n cameraUniform.set(camera);\n screenUniform.set(screen);\n positionUniform.set(position);\n orientationUniform.set(orientation);\n colorUniform.set(color);\n sizeUniform.set(size);\n minSizePixelsUniform.set(minSizePixels);\n maxSizePixelsUniform.set(maxSizePixels);\n indexUniform.set(index);\n\n indexBuffer.use();\n\n gl.drawElements(gl.TRIANGLES, count, gl.UNSIGNED_SHORT, 0);\n };\n\n const { dispose } = program;\n\n return { execute, dispose };\n };\n\n const renderProgram = createRenderProgram();\n const depthProgram = createRenderProgram(true);\n\n return { renderProgram, depthProgram };\n};\n","var L=function(F,J,G,U,K){let Q,W=null;if(K===m(F,J,G,U)>0)for(Q=J;Q<G;Q+=U)W=new O(Q,F[Q],F[Q+1],W);else for(Q=G-U;Q>=J;Q-=U)W=new O(Q,F[Q],F[Q+1],W);if(W!==null&&P(W,W.next))f(W),W=W.next;return W},R=function(F,J){if(J===void 0)J=F;let G=F,U;do if(U=!1,!G.steiner&&(P(G,G.next)||C(G.prev,G,G.next)===0)){if(f(G),G=J=G.prev,G===G.next)break;U=!0}else G=G.next;while(U||G!==J);return J},M=function(F,J,G,U,K,Q,W){if(F===null)return;if(W===0&&Q!==0)q(F,U,K,Q);let Z=F,j,A;while(F.prev!==F.next){if(j=F.prev,A=F.next,Q!==0?N(F,U,K,Q):h(F)){J.push(j.i/G),J.push(F.i/G),J.push(A.i/G),f(F),F=A.next,Z=A.next;continue}if(F=A,F===Z){if(W===0)M(R(F),J,G,U,K,Q,1);else if(W===1)F=v(R(F),J,G),M(F,J,G,U,K,Q,2);else if(W===2)z(F,J,G,U,K,Q);break}}},h=function(F){const J=F.prev,G=F,U=F.next;if(C(J,G,U)>=0)return!1;let K=F.next.next;while(K!==F.prev){if(E(J.x,J.y,G.x,G.y,U.x,U.y,K.x,K.y)&&C(K.prev,K,K.next)>=0)return!1;K=K.next}return!0},N=function(F,J,G,U){const K=F.prev,Q=F,W=F.next;if(C(K,Q,W)>=0)return!1;const Z=K.x<Q.x?K.x<W.x?K.x:W.x:Q.x<W.x?Q.x:W.x,j=K.y<Q.y?K.y<W.y?K.y:W.y:Q.y<W.y?Q.y:W.y,A=K.x>Q.x?K.x>W.x?K.x:W.x:Q.x>W.x?Q.x:W.x,w=K.y>Q.y?K.y>W.y?K.y:W.y:Q.y>W.y?Q.y:W.y,D=T(Z,j,J,G,U),V=T(A,w,J,G,U);let{prevZ:_,nextZ:$}=F;while(_!==null&&$!==null&&_.z>=D&&$.z<=V){if(_!==F.prev&&_!==F.next&&E(K.x,K.y,Q.x,Q.y,W.x,W.y,_.x,_.y)&&C(_.prev,_,_.next)>=0)return!1;if(_=_.prevZ,$!==F.prev&&$!==F.next&&E(K.x,K.y,Q.x,Q.y,W.x,W.y,$.x,$.y)&&C($.prev,$,$.next)>=0)return!1;$=$.nextZ}while(_!==null&&_.z>=D){if(_!==F.prev&&_!==F.next&&E(K.x,K.y,Q.x,Q.y,W.x,W.y,_.x,_.y)&&C(_.prev,_,_.next)>=0)return!1;_=_.prevZ}while($!==null&&$.z<=V){if($!==F.prev&&$!==F.next&&E(K.x,K.y,Q.x,Q.y,W.x,W.y,$.x,$.y)&&C($.prev,$,$.next)>=0)return!1;$=$.nextZ}return!0},v=function(F,J,G){let U=F;do{const K=U.prev,Q=U.next.next;if(!P(K,Q)&&I(K,U,U.next,Q)&&H(K,Q)&&H(Q,K))J.push(K.i/G),J.push(U.i/G),J.push(Q.i/G),f(U),f(U.next),U=F=Q;U=U.next}while(U!==F);return U},z=function(F,J,G,U,K,Q){let W=F;do{let Z=W.next.next;while(Z!==W.prev){if(W.i!==Z.i&&b(W,Z)){let j=Y(W,Z);W=R(W,W.next),j=R(j,j.next),M(W,J,G,U,K,Q,0),M(j,J,G,U,K,Q,0);return}Z=Z.next}W=W.next}while(W!==F)},S=function(F,J,G,U){const K=[];let Q,W,Z,j,A;for(Q=0,W=J.length;Q<W;Q++){if(Z=J[Q]*U,j=Q<W-1?J[Q+1]*U:F.length,A=L(F,Z,j,U,!1),A===A.next)A.steiner=!0;K.push(x(A))}K.sort(u);for(Q=0;Q<K.length;Q++)G=g(K[Q],G),G=R(G,G.next);return G},u=function(F,J){return F.x-J.x},g=function(F,J){const G=c(F,J);if(G===null)return J;else{const U=Y(G,F),K=R(G,G.next);return R(U,U.next),J===G?K:J}},c=function(F,J){let G=J;const{x:U,y:K}=F;let Q=(-Infinity),W;do{if(K<=G.y&&K>=G.next.y&&G.next.y!==G.y){const V=G.x+(K-G.y)*(G.next.x-G.x)/(G.next.y-G.y);if(V<=U&&V>Q){if(Q=V,V===U){if(K===G.y)return G;if(K===G.next.y)return G.next}W=G.x<G.next.x?G:G.next}}G=G.next}while(G!==J);if(W===void 0)return null;if(U===Q)return W;const Z=W,j=W.x,A=W.y;let w=Infinity,D;G=W;do{if(U>=G.x&&G.x>=j&&U!==G.x&&E(K<A?U:Q,K,j,A,K<A?Q:U,K,G.x,G.y)){if(D=Math.abs(K-G.y)/(U-G.x),H(G,F)&&(D<w||D===w&&(G.x>W.x||G.x===W.x&&C(W.prev,W,G.prev)<0&&C(G.next,W,W.next)<0)))W=G,w=D}G=G.next}while(G!==Z);return W},q=function(F,J,G,U){let K=F;do{if(K.z===void 0)K.z=T(K.x,K.y,J,G,U);K.prevZ=K.prev,K.nextZ=K.next,K=K.next}while(K!==F);if(K.prevZ!==null)K.prevZ.nextZ=null;K.prevZ=null,y(K)},y=function(F){let J,G,U,K,Q,W,Z,j,A=1;do{G=F,F=null,Q=null,W=0;while(G!==null){W++,U=G,Z=0;for(J=0;J<A;J++)if(Z++,U=U.nextZ,U===null)break;j=A;while(Z>0||j>0&&U!==null){if(Z!==0&&(j===0||U===null||G===null||G.z<=U.z))K=G,G=G?.nextZ??null,Z--;else K=U,U=U?.nextZ??null,j--;if(Q!==null)Q.nextZ=K;else F=K;if(K!==null)K.prevZ=Q;Q=K}G=U}if(Q!==null)Q.nextZ=null;A*=2}while(W>1);return F},T=function(F,J,G,U,K){return F=32767*(F-G)*K,J=32767*(J-U)*K,F=(F|F<<8)&16711935,F=(F|F<<4)&252645135,F=(F|F<<2)&858993459,F=(F|F<<1)&1431655765,J=(J|J<<8)&16711935,J=(J|J<<4)&252645135,J=(J|J<<2)&858993459,J=(J|J<<1)&1431655765,F|J<<1},x=function(F){let J=F,G=F;do{if(J.x<G.x||J.x===G.x&&J.y<G.y)G=J;J=J.next}while(J!==F);return G},E=function(F,J,G,U,K,Q,W,Z){return(K-W)*(J-Z)-(F-W)*(Q-Z)>=0&&(F-W)*(U-Z)-(G-W)*(J-Z)>=0&&(G-W)*(Q-Z)-(K-W)*(U-Z)>=0},b=function(F,J){return F.next.i!==J.i&&F.prev.i!==J.i&&!l(F,J)&&(H(F,J)&&H(J,F)&&o(F,J)&&(C(F.prev,F,J.prev)!==0||C(F,J.prev,J)!==0)||P(F,J)&&C(F.prev,F,F.next)>0&&C(J.prev,J,J.next)>0)},C=function(F,J,G){return(J.y-F.y)*(G.x-J.x)-(J.x-F.x)*(G.y-J.y)},P=function(F,J){return F.x===J.x&&F.y===J.y},I=function(F,J,G,U){const K=k(C(F,J,G)),Q=k(C(F,J,U)),W=k(C(G,U,F)),Z=k(C(G,U,J));if(K!==Q&&W!==Z)return!0;if(K===0&&B(F,G,J))return!0;if(Q===0&&B(F,U,J))return!0;if(W===0&&B(G,F,U))return!0;if(Z===0&&B(G,J,U))return!0;return!1},k=function(F){return F>0?1:F<0?-1:0},B=function(F,J,G){return J.x<=Math.max(F.x,G.x)&&J.x>=Math.min(F.x,G.x)&&J.y<=Math.max(F.y,G.y)&&J.y>=Math.min(F.y,G.y)},l=function(F,J){let G=F;do{if(G.i!==F.i&&G.next?.i!==F.i&&G.i!==J.i&&G.next?.i!==J.i&&I(G,G.next,F,J))return!0;G=G.next}while(G!==F);return!1},H=function(F,J){return C(F.prev,F,F.next)<0?C(F,J,F.next)>=0&&C(F,F.prev,J)>=0:C(F,J,F.prev)<0||C(F,F.next,J)<0},o=function(F,J){const G=(F.x+J.x)/2,U=(F.y+J.y)/2;let K=F,Q=!1;do{if(K.y>U!==K.next.y>U&&K.next.y!==K.y&&G<(K.next.x-K.x)*(U-K.y)/(K.next.y-K.y)+K.x)Q=!Q;K=K.next}while(K!==F);return Q},Y=function(F,J){const G=new O(F.i,F.x,F.y),U=new O(J.i,J.x,J.y),K=F.next,Q=J.prev;return F.next=J,J.prev=F,G.next=K,K.prev=G,U.next=G,G.prev=U,Q.next=U,U.prev=Q,U},f=function(F){if(F.next.prev=F.prev,F.prev.next=F.next,F.prevZ!==null)F.prevZ.nextZ=F.nextZ;if(F.nextZ!==null)F.nextZ.prevZ=F.prevZ},m=function(F,J,G,U){let K=0;for(let Q=J,W=G-U;Q<G;Q+=U)K+=(F[W]-F[Q])*(F[Q+1]+F[W+1]),W=Q;return K};class O{i;x;y;prev;next;z;prevZ=null;nextZ=null;steiner=!1;constructor(F,J,G,U=null){if(this.i=F,this.x=J,this.y=G,U===null)this.prev=this,this.next=this;else this.next=U.next,this.prev=U,U.next.prev=this,U.next=this}}function X(F,J=[],G=2){const U=J.length>0,K=U?J[0]*G:F.length;let Q=L(F,0,K,G,!0);const W=[];if(Q===null||Q.next===Q.prev)return W;let Z=Infinity,j=Infinity,A=(-Infinity),w=(-Infinity),D=0,V,_;if(U)Q=S(F,J,Q,G);if(F.length>80*G){Z=A=F[0],j=w=F[1];for(let $=G;$<K;$+=G){if(V=F[$],_=F[$+1],V<Z)Z=V;if(_<j)j=_;if(V>A)A=V;if(_>w)w=_}D=Math.max(A-Z,w-j),D=D!==0?1/D:0}return M(Q,W,G,Z,j,D,0),W}export{X as default};\nexport{X as a};\n\n//# debugId=F7DDCD3C6579060364756e2164756e21\n","import{a as Z} from\"./earcut.js\";function B(F,q=Infinity,O=0){const{vertices:K,holeIndices:Q,dim:E}=D(F),M=Z(K,Q,E);if(q!==Infinity)_(K,M,q,E);return{vertices:K,indices:M.map((G)=>G+O)}}function _(F,q,O,K){let Q,E,M;for(let G=0;G<K;G++)for(let b=0;b<q.length;b+=3){Q=q[b],E=q[b+1],M=q[b+2];const k=$(Q,E,M,F,q,K,G,O);if(k!==void 0)q[b]=k[0],q[b+1]=k[1],q[b+2]=k[2],b-=3}}var $=function(F,q,O,K,Q,E,M,G){const b=K[F*E+M],k=K[q*E+M],z=K[O*E+M];if(b<k&&b<z){const J=b+G-U(b,G);if(J>b&&J<=k&&J<=z&&(k!==J||k!==J))return W(J,F,q,O,b,k,z,K,Q,E,M,G)}else if(b>k&&b>z){let J=U(b,G);if(J===0)J=G;const w=b-J;if(w<b&&w>=k&&w>=z&&(k!==w||k!==w))return X(w,F,q,O,b,k,z,K,Q,E,M,G)}if(k<b&&k<z){const J=k+G-U(k,G);if(J>k&&J<=z&&J<=b&&(b!==J||z!==J))return W(J,q,O,F,k,z,b,K,Q,E,M,G)}else if(k>b&&k>z){let J=U(k,G);if(J===0)J=G;const w=k-J;if(w<k&&w>=z&&w>=b&&(b!==w||z!==w))return X(w,q,O,F,k,z,b,K,Q,E,M,G)}if(z<b&&z<k){const J=z+G-U(z,G);if(J>z&&J<=b&&J<=k&&(b!==J||k!==J))return W(J,O,F,q,z,b,k,K,Q,E,M,G)}else if(z>b&&z>k){let J=U(z,G);if(J===0)J=G;const w=z-J;if(w<z&&w>=b&&w>=k&&(b!==w||k!==w))return X(w,O,F,q,z,b,k,K,Q,E,M,G)}},T=function(F,q,O,K,Q,E,M,G){const b=E.length/M,k=(Q-K)/(F-K);let z,J;for(let w=0;w<M;w++)if(z=E[q*M+w],J=E[O*M+w],w!==G)E.push(z+(J-z)/k);else E.push(F);return b},W=function(F,q,O,K,Q,E,M,G,b,k,z,J){let w=T(F,q,O,Q,E,G,k,z),S=T(F,q,K,Q,M,G,k,z);if(b.push(q,w,S),F+=J,E<M){while(F<E)b.push(S,w),S=T(F,q,K,Q,M,G,k,z),b.push(S,S,w),w=T(F,q,O,Q,E,G,k,z),b.push(w),F+=J;return b.push(S,w,O),[S,O,K]}else{while(F<M)b.push(S,w),S=T(F,q,K,Q,M,G,k,z),b.push(S,S,w),w=T(F,q,O,Q,E,G,k,z),b.push(w),F+=J;return b.push(S,w,K),[K,w,O]}},X=function(F,q,O,K,Q,E,M,G,b,k,z,J){let w=T(F,q,O,Q,E,G,k,z),S=T(F,q,K,Q,M,G,k,z);if(b.push(q,w,S),F-=J,E>M){while(F>E)b.push(S,w),S=T(F,q,K,Q,M,G,k,z),b.push(S,S,w),w=T(F,q,O,Q,E,G,k,z),b.push(w),F-=J;return b.push(S,w,O),[S,O,K]}else{while(F>M)b.push(S,w),S=T(F,q,K,Q,M,G,k,z),b.push(S,S,w),w=T(F,q,O,Q,E,G,k,z),b.push(w),F-=J;return b.push(S,w,K),[K,w,O]}},U=function(F,q){return(F%q+q)%q};function D(F){let q=0;const O=F[0][0].length,K=[],Q=[];for(let E=0,M=F.length;E<M;E++){for(let G=0,b=F[E].length;G<b;G++)for(let k=0;k<O;k++)K.push(F[E][G][k]);if(E>0)q+=F[E-1].length,Q.push(q)}return{vertices:K,holeIndices:Q,dim:O}}function C(F,q=[],O=2,K=[]){const Q=q.length>0,E=Q?q[0]*O:F.length;let M=Math.abs(Y(F,0,E,O));if(Q)for(let b=0,k=q.length;b<k;b++){const z=q[b]*O,J=b<k-1?q[b+1]*O:F.length;M-=Math.abs(Y(F,z,J,O))}let G=0;for(let b=0;b<K.length;b+=3){const k=K[b]*O,z=K[b+1]*O,J=K[b+2]*O;G+=Math.abs((F[k]-F[J])*(F[z+1]-F[k+1])-(F[k]-F[z])*(F[J+1]-F[k+1]))}return M===0&&G===0?0:Math.abs((G-M)/M)}var Y=function(F,q,O,K){let Q=0;for(let E=q,M=O-K;E<O;E+=K)Q+=(F[M]-F[E])*(F[E+1]+F[M+1]),M=E;return Q};export{_ as tesselate,D as flatten,B as earclip,C as deviation};\n\n//# debugId=279130DA8E8F83BD64756e2164756e21\n","#version 300 es\n\nprecision highp float;\n\nin vec4 color_out;\nout vec4 result;\n\nvoid main() {\n result = color_out;\n}","#version 300 es\n\nprecision highp float;\n\nuniform mat4 projection;\nuniform mat4 model_view;\nuniform ivec3 camera;\nuniform vec2 screen;\nuniform vec4 color;\n\nin ivec3 position;\nout vec4 color_out;\n\nconst int ONE = 1073741824; // 2^30\nconst float INV_ONE = 1.f / float(ONE);\n\nvec4 transform(ivec3 v) {\n return projection * model_view * vec4(vec3(v - camera) * INV_ONE, 1.f);\n}\n\nvoid main(void) {\n gl_Position = transform(position);\n color_out = color;\n}\n","import { earclip } from \"earclip\";\nimport type { mat4, vec2, vec4 } from \"gl-matrix\";\nimport type { vec3 } from \"gl-matrix\";\n\nimport type { Buffer } from \"../../buffer\";\nimport { createBuffer } from \"../../buffer\";\nimport { mercator } from \"../../math\";\nimport { createProgram } from \"../../program\";\nimport type { Viewport } from \"../../viewport\";\nimport type { World } from \"../../world\";\nimport type { LayerOptions } from \"..\";\nimport { type BaseLayer, type Polygon } from \"..\";\nimport { configure, to } from \"../common\";\nimport depthSource from \"../depth.glsl\";\nimport fragmentSource from \"./fragment.glsl\";\nimport vertexSource from \"./vertex.glsl\";\n\nexport type PolygonLayer = BaseLayer & Polygon;\n\nexport const createPolygonLayer = (\n world: World,\n polygon: Partial<Polygon> = {},\n) => {\n const { gl } = world;\n let { options, points, color } = {\n options: {},\n points: [],\n color: [1, 1, 1, 1],\n ...polygon,\n } satisfies Polygon;\n\n let count = 0;\n\n const positionBuffer = createBuffer({ gl, type: \"i32\", target: \"array\" });\n const indexBuffer = createBuffer({ gl, type: \"u16\", target: \"element\" });\n\n const { renderProgram, depthProgram } = createPrograms(gl, {\n positionBuffer,\n indexBuffer,\n });\n\n const render = ({\n viewport: { projection, modelView, camera, screen },\n depth = false,\n index = 0,\n }: {\n viewport: Viewport;\n depth?: boolean;\n index?: number;\n }) => {\n if (configure(gl, depth, options)) return;\n const program = depth ? depthProgram : renderProgram;\n program.execute({\n projection,\n modelView,\n camera: to(camera),\n screen,\n count,\n color,\n index,\n });\n };\n\n const updatePoints = (_: vec3[][]) => {\n points = _;\n const { vertices, indices } = earclip(\n _.map(_ => _.map(_ => [...to(mercator(_))])),\n );\n positionBuffer.set(vertices);\n indexBuffer.set(indices);\n count = indices.length;\n };\n\n updatePoints(points);\n\n const dispose = () => {\n positionBuffer.dispose();\n indexBuffer.dispose();\n renderProgram.dispose();\n depthProgram.dispose();\n world.remove(layer);\n };\n\n const layer = {\n render,\n dispose,\n get options() {\n return options;\n },\n set options(_: Partial<LayerOptions>) {\n options = _;\n },\n get points() {\n return points;\n },\n set points(_: vec3[][]) {\n updatePoints(_);\n },\n get color() {\n return color;\n },\n set color(_: vec4) {\n color = _;\n },\n } satisfies PolygonLayer;\n\n world.add(layer);\n\n return layer;\n};\n\nconst createPrograms = (\n gl: WebGL2RenderingContext,\n {\n positionBuffer,\n indexBuffer,\n }: {\n positionBuffer: Buffer;\n indexBuffer: Buffer;\n },\n) => {\n const createRenderProgram = (depth = false) => {\n const program = createProgram({\n gl,\n vertexSource,\n fragmentSource: depth ? depthSource : fragmentSource,\n });\n\n const positionAttribute = program.attribute3i(\"position\", positionBuffer, {\n stride: 3 * Int32Array.BYTES_PER_ELEMENT,\n });\n\n const projectionUniform = program.uniformMatrix4f(\"projection\");\n const modelViewUniform = program.uniformMatrix4f(\"model_view\");\n const cameraUniform = program.uniform3i(\"camera\");\n const screenUniform = program.uniform2f(\"screen\");\n const colorUniform = program.uniform4f(\"color\");\n const indexUniform = program.uniform1i(\"index\");\n\n const execute = ({\n projection,\n modelView,\n camera,\n screen,\n count,\n color,\n index,\n }: {\n projection: mat4;\n modelView: mat4;\n camera: vec3;\n screen: vec2;\n count: number;\n color: vec4;\n index: number;\n }) => {\n if (count === 0) return;\n\n program.use();\n\n positionAttribute.use();\n\n projectionUniform.set(projection);\n modelViewUniform.set(modelView);\n cameraUniform.set(camera);\n screenUniform.set(screen);\n colorUniform.set(color);\n indexUniform.set(index);\n\n indexBuffer.use();\n\n gl.drawElements(gl.TRIANGLES, count, gl.UNSIGNED_SHORT, 0);\n };\n\n const { dispose } = program;\n\n return { execute, dispose };\n };\n\n const renderProgram = createRenderProgram();\n const depthProgram = createRenderProgram(true);\n\n return { renderProgram, depthProgram };\n};\n","import type { vec3 } from \"gl-matrix\";\n\nimport type { Texture } from \"./texture\";\nimport type { TileCache } from \"./tile-cache\";\n\nexport type DownsampledTile = {\n texture: Texture;\n downsample: number;\n};\n\nexport type TileDownsampler = {\n get: (xyz: vec3) => DownsampledTile | undefined;\n};\n\nexport const createTileDownsampler = (\n cache: TileCache,\n initialDownsample = 0,\n) =>\n ({\n get: ([x = 0, y = 0, z = 0]) => {\n for (\n let downsample = Math.min(z, initialDownsample);\n downsample <= z;\n downsample++\n ) {\n const k = 2 ** downsample;\n const xyz: vec3 = [\n Math.floor(x / k),\n Math.floor(y / k),\n z - downsample,\n ];\n const texture = cache.get(xyz);\n if (texture) return { texture, downsample };\n }\n },\n }) satisfies TileDownsampler;\n","/**\n * @module LRUCache\n */\nconst perf = typeof performance === 'object' &&\n performance &&\n typeof performance.now === 'function'\n ? performance\n : Date;\nconst warned = new Set();\n/* c8 ignore start */\nconst PROCESS = (typeof process === 'object' && !!process ? process : {});\n/* c8 ignore start */\nconst emitWarning = (msg, type, code, fn) => {\n typeof PROCESS.emitWarning === 'function'\n ? PROCESS.emitWarning(msg, type, code, fn)\n : console.error(`[${code}] ${type}: ${msg}`);\n};\nlet AC = globalThis.AbortController;\nlet AS = globalThis.AbortSignal;\n/* c8 ignore start */\nif (typeof AC === 'undefined') {\n //@ts-ignore\n AS = class AbortSignal {\n onabort;\n _onabort = [];\n reason;\n aborted = false;\n addEventListener(_, fn) {\n this._onabort.push(fn);\n }\n };\n //@ts-ignore\n AC = class AbortController {\n constructor() {\n warnACPolyfill();\n }\n signal = new AS();\n abort(reason) {\n if (this.signal.aborted)\n return;\n //@ts-ignore\n this.signal.reason = reason;\n //@ts-ignore\n this.signal.aborted = true;\n //@ts-ignore\n for (const fn of this.signal._onabort) {\n fn(reason);\n }\n this.signal.onabort?.(reason);\n }\n };\n let printACPolyfillWarning = PROCESS.env?.LRU_CACHE_IGNORE_AC_WARNING !== '1';\n const warnACPolyfill = () => {\n if (!printACPolyfillWarning)\n return;\n printACPolyfillWarning = false;\n emitWarning('AbortController is not defined. If using lru-cache in ' +\n 'node 14, load an AbortController polyfill from the ' +\n '`node-abort-controller` package. A minimal polyfill is ' +\n 'provided for use by LRUCache.fetch(), but it should not be ' +\n 'relied upon in other contexts (eg, passing it to other APIs that ' +\n 'use AbortController/AbortSignal might have undesirable effects). ' +\n 'You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.', 'NO_ABORT_CONTROLLER', 'ENOTSUP', warnACPolyfill);\n };\n}\n/* c8 ignore stop */\nconst shouldWarn = (code) => !warned.has(code);\nconst TYPE = Symbol('type');\nconst isPosInt = (n) => n && n === Math.floor(n) && n > 0 && isFinite(n);\n/* c8 ignore start */\n// This is a little bit ridiculous, tbh.\n// The maximum array length is 2^32-1 or thereabouts on most JS impls.\n// And well before that point, you're caching the entire world, I mean,\n// that's ~32GB of just integers for the next/prev links, plus whatever\n// else to hold that many keys and values. Just filling the memory with\n// zeroes at init time is brutal when you get that big.\n// But why not be complete?\n// Maybe in the future, these limits will have expanded.\nconst getUintArray = (max) => !isPosInt(max)\n ? null\n : max <= Math.pow(2, 8)\n ? Uint8Array\n : max <= Math.pow(2, 16)\n ? Uint16Array\n : max <= Math.pow(2, 32)\n ? Uint32Array\n : max <= Number.MAX_SAFE_INTEGER\n ? ZeroArray\n : null;\n/* c8 ignore stop */\nclass ZeroArray extends Array {\n constructor(size) {\n super(size);\n this.fill(0);\n }\n}\nclass Stack {\n heap;\n length;\n // private constructor\n static #constructing = false;\n static create(max) {\n const HeapCls = getUintArray(max);\n if (!HeapCls)\n return [];\n Stack.#constructing = true;\n const s = new Stack(max, HeapCls);\n Stack.#constructing = false;\n return s;\n }\n constructor(max, HeapCls) {\n /* c8 ignore start */\n if (!Stack.#constructing) {\n throw new TypeError('instantiate Stack using Stack.create(n)');\n }\n /* c8 ignore stop */\n this.heap = new HeapCls(max);\n this.length = 0;\n }\n push(n) {\n this.heap[this.length++] = n;\n }\n pop() {\n return this.heap[--this.length];\n }\n}\n/**\n * Default export, the thing you're using this module to get.\n *\n * All properties from the options object (with the exception of\n * {@link OptionsBase.max} and {@link OptionsBase.maxSize}) are added as\n * normal public members. (`max` and `maxBase` are read-only getters.)\n * Changing any of these will alter the defaults for subsequent method calls,\n * but is otherwise safe.\n */\nexport class LRUCache {\n // properties coming in from the options of these, only max and maxSize\n // really *need* to be protected. The rest can be modified, as they just\n // set defaults for various methods.\n #max;\n #maxSize;\n #dispose;\n #disposeAfter;\n #fetchMethod;\n /**\n * {@link LRUCache.OptionsBase.ttl}\n */\n ttl;\n /**\n * {@link LRUCache.OptionsBase.ttlResolution}\n */\n ttlResolution;\n /**\n * {@link LRUCache.OptionsBase.ttlAutopurge}\n */\n ttlAutopurge;\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnGet}\n */\n updateAgeOnGet;\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnHas}\n */\n updateAgeOnHas;\n /**\n * {@link LRUCache.OptionsBase.allowStale}\n */\n allowStale;\n /**\n * {@link LRUCache.OptionsBase.noDisposeOnSet}\n */\n noDisposeOnSet;\n /**\n * {@link LRUCache.OptionsBase.noUpdateTTL}\n */\n noUpdateTTL;\n /**\n * {@link LRUCache.OptionsBase.maxEntrySize}\n */\n maxEntrySize;\n /**\n * {@link LRUCache.OptionsBase.sizeCalculation}\n */\n sizeCalculation;\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection}\n */\n noDeleteOnFetchRejection;\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnStaleGet}\n */\n noDeleteOnStaleGet;\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}\n */\n allowStaleOnFetchAbort;\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection}\n */\n allowStaleOnFetchRejection;\n /**\n * {@link LRUCache.OptionsBase.ignoreFetchAbort}\n */\n ignoreFetchAbort;\n // computed properties\n #size;\n #calculatedSize;\n #keyMap;\n #keyList;\n #valList;\n #next;\n #prev;\n #head;\n #tail;\n #free;\n #disposed;\n #sizes;\n #starts;\n #ttls;\n #hasDispose;\n #hasFetchMethod;\n #hasDisposeAfter;\n /**\n * Do not call this method unless you need to inspect the\n * inner workings of the cache. If anything returned by this\n * object is modified in any way, strange breakage may occur.\n *\n * These fields are private for a reason!\n *\n * @internal\n */\n static unsafeExposeInternals(c) {\n return {\n // properties\n starts: c.#starts,\n ttls: c.#ttls,\n sizes: c.#sizes,\n keyMap: c.#keyMap,\n keyList: c.#keyList,\n valList: c.#valList,\n next: c.#next,\n prev: c.#prev,\n get head() {\n return c.#head;\n },\n get tail() {\n return c.#tail;\n },\n free: c.#free,\n // methods\n isBackgroundFetch: (p) => c.#isBackgroundFetch(p),\n backgroundFetch: (k, index, options, context) => c.#backgroundFetch(k, index, options, context),\n moveToTail: (index) => c.#moveToTail(index),\n indexes: (options) => c.#indexes(options),\n rindexes: (options) => c.#rindexes(options),\n isStale: (index) => c.#isStale(index),\n };\n }\n // Protected read-only members\n /**\n * {@link LRUCache.OptionsBase.max} (read-only)\n */\n get max() {\n return this.#max;\n }\n /**\n * {@link LRUCache.OptionsBase.maxSize} (read-only)\n */\n get maxSize() {\n return this.#maxSize;\n }\n /**\n * The total computed size of items in the cache (read-only)\n */\n get calculatedSize() {\n return this.#calculatedSize;\n }\n /**\n * The number of items stored in the cache (read-only)\n */\n get size() {\n return this.#size;\n }\n /**\n * {@link LRUCache.OptionsBase.fetchMethod} (read-only)\n */\n get fetchMethod() {\n return this.#fetchMethod;\n }\n /**\n * {@link LRUCache.OptionsBase.dispose} (read-only)\n */\n get dispose() {\n return this.#dispose;\n }\n /**\n * {@link LRUCache.OptionsBase.disposeAfter} (read-only)\n */\n get disposeAfter() {\n return this.#disposeAfter;\n }\n constructor(options) {\n const { max = 0, ttl, ttlResolution = 1, ttlAutopurge, updateAgeOnGet, updateAgeOnHas, allowStale, dispose, disposeAfter, noDisposeOnSet, noUpdateTTL, maxSize = 0, maxEntrySize = 0, sizeCalculation, fetchMethod, noDeleteOnFetchRejection, noDeleteOnStaleGet, allowStaleOnFetchRejection, allowStaleOnFetchAbort, ignoreFetchAbort, } = options;\n if (max !== 0 && !isPosInt(max)) {\n throw new TypeError('max option must be a nonnegative integer');\n }\n const UintArray = max ? getUintArray(max) : Array;\n if (!UintArray) {\n throw new Error('invalid max value: ' + max);\n }\n this.#max = max;\n this.#maxSize = maxSize;\n this.maxEntrySize = maxEntrySize || this.#maxSize;\n this.sizeCalculation = sizeCalculation;\n if (this.sizeCalculation) {\n if (!this.#maxSize && !this.maxEntrySize) {\n throw new TypeError('cannot set sizeCalculation without setting maxSize or maxEntrySize');\n }\n if (typeof this.sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation set to non-function');\n }\n }\n if (fetchMethod !== undefined &&\n typeof fetchMethod !== 'function') {\n throw new TypeError('fetchMethod must be a function if specified');\n }\n this.#fetchMethod = fetchMethod;\n this.#hasFetchMethod = !!fetchMethod;\n this.#keyMap = new Map();\n this.#keyList = new Array(max).fill(undefined);\n this.#valList = new Array(max).fill(undefined);\n this.#next = new UintArray(max);\n this.#prev = new UintArray(max);\n this.#head = 0;\n this.#tail = 0;\n this.#free = Stack.create(max);\n this.#size = 0;\n this.#calculatedSize = 0;\n if (typeof dispose === 'function') {\n this.#dispose = dispose;\n }\n if (typeof disposeAfter === 'function') {\n this.#disposeAfter = disposeAfter;\n this.#disposed = [];\n }\n else {\n this.#disposeAfter = undefined;\n this.#disposed = undefined;\n }\n this.#hasDispose = !!this.#dispose;\n this.#hasDisposeAfter = !!this.#disposeAfter;\n this.noDisposeOnSet = !!noDisposeOnSet;\n this.noUpdateTTL = !!noUpdateTTL;\n this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection;\n this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection;\n this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort;\n this.ignoreFetchAbort = !!ignoreFetchAbort;\n // NB: maxEntrySize is set to maxSize if it's set\n if (this.maxEntrySize !== 0) {\n if (this.#maxSize !== 0) {\n if (!isPosInt(this.#maxSize)) {\n throw new TypeError('maxSize must be a positive integer if specified');\n }\n }\n if (!isPosInt(this.maxEntrySize)) {\n throw new TypeError('maxEntrySize must be a positive integer if specified');\n }\n this.#initializeSizeTracking();\n }\n this.allowStale = !!allowStale;\n this.noDeleteOnStaleGet = !!noDeleteOnStaleGet;\n this.updateAgeOnGet = !!updateAgeOnGet;\n this.updateAgeOnHas = !!updateAgeOnHas;\n this.ttlResolution =\n isPosInt(ttlResolution) || ttlResolution === 0\n ? ttlResolution\n : 1;\n this.ttlAutopurge = !!ttlAutopurge;\n this.ttl = ttl || 0;\n if (this.ttl) {\n if (!isPosInt(this.ttl)) {\n throw new TypeError('ttl must be a positive integer if specified');\n }\n this.#initializeTTLTracking();\n }\n // do not allow completely unbounded caches\n if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) {\n throw new TypeError('At least one of max, maxSize, or ttl is required');\n }\n if (!this.ttlAutopurge && !this.#max && !this.#maxSize) {\n const code = 'LRU_CACHE_UNBOUNDED';\n if (shouldWarn(code)) {\n warned.add(code);\n const msg = 'TTL caching without ttlAutopurge, max, or maxSize can ' +\n 'result in unbounded memory consumption.';\n emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache);\n }\n }\n }\n /**\n * Return the remaining TTL time for a given entry key\n */\n getRemainingTTL(key) {\n return this.#keyMap.has(key) ? Infinity : 0;\n }\n #initializeTTLTracking() {\n const ttls = new ZeroArray(this.#max);\n const starts = new ZeroArray(this.#max);\n this.#ttls = ttls;\n this.#starts = starts;\n this.#setItemTTL = (index, ttl, start = perf.now()) => {\n starts[index] = ttl !== 0 ? start : 0;\n ttls[index] = ttl;\n if (ttl !== 0 && this.ttlAutopurge) {\n const t = setTimeout(() => {\n if (this.#isStale(index)) {\n this.delete(this.#keyList[index]);\n }\n }, ttl + 1);\n // unref() not supported on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref();\n }\n /* c8 ignore stop */\n }\n };\n this.#updateItemAge = index => {\n starts[index] = ttls[index] !== 0 ? perf.now() : 0;\n };\n this.#statusTTL = (status, index) => {\n if (ttls[index]) {\n const ttl = ttls[index];\n const start = starts[index];\n /* c8 ignore next */\n if (!ttl || !start)\n return;\n status.ttl = ttl;\n status.start = start;\n status.now = cachedNow || getNow();\n const age = status.now - start;\n status.remainingTTL = ttl - age;\n }\n };\n // debounce calls to perf.now() to 1s so we're not hitting\n // that costly call repeatedly.\n let cachedNow = 0;\n const getNow = () => {\n const n = perf.now();\n if (this.ttlResolution > 0) {\n cachedNow = n;\n const t = setTimeout(() => (cachedNow = 0), this.ttlResolution);\n // not available on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref();\n }\n /* c8 ignore stop */\n }\n return n;\n };\n this.getRemainingTTL = key => {\n const index = this.#keyMap.get(key);\n if (index === undefined) {\n return 0;\n }\n const ttl = ttls[index];\n const start = starts[index];\n if (!ttl || !start) {\n return Infinity;\n }\n const age = (cachedNow || getNow()) - start;\n return ttl - age;\n };\n this.#isStale = index => {\n const s = starts[index];\n const t = ttls[index];\n return !!t && !!s && (cachedNow || getNow()) - s > t;\n };\n }\n // conditionally set private methods related to TTL\n #updateItemAge = () => { };\n #statusTTL = () => { };\n #setItemTTL = () => { };\n /* c8 ignore stop */\n #isStale = () => false;\n #initializeSizeTracking() {\n const sizes = new ZeroArray(this.#max);\n this.#calculatedSize = 0;\n this.#sizes = sizes;\n this.#removeItemSize = index => {\n this.#calculatedSize -= sizes[index];\n sizes[index] = 0;\n };\n this.#requireSize = (k, v, size, sizeCalculation) => {\n // provisionally accept background fetches.\n // actual value size will be checked when they return.\n if (this.#isBackgroundFetch(v)) {\n return 0;\n }\n if (!isPosInt(size)) {\n if (sizeCalculation) {\n if (typeof sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation must be a function');\n }\n size = sizeCalculation(v, k);\n if (!isPosInt(size)) {\n throw new TypeError('sizeCalculation return invalid (expect positive integer)');\n }\n }\n else {\n throw new TypeError('invalid size value (must be positive integer). ' +\n 'When maxSize or maxEntrySize is used, sizeCalculation ' +\n 'or size must be set.');\n }\n }\n return size;\n };\n this.#addItemSize = (index, size, status) => {\n sizes[index] = size;\n if (this.#maxSize) {\n const maxSize = this.#maxSize - sizes[index];\n while (this.#calculatedSize > maxSize) {\n this.#evict(true);\n }\n }\n this.#calculatedSize += sizes[index];\n if (status) {\n status.entrySize = size;\n status.totalCalculatedSize = this.#calculatedSize;\n }\n };\n }\n #removeItemSize = _i => { };\n #addItemSize = (_i, _s, _st) => { };\n #requireSize = (_k, _v, size, sizeCalculation) => {\n if (size || sizeCalculation) {\n throw new TypeError('cannot set size without setting maxSize or maxEntrySize on cache');\n }\n return 0;\n };\n *#indexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#tail; true;) {\n if (!this.#isValidIndex(i)) {\n break;\n }\n if (allowStale || !this.#isStale(i)) {\n yield i;\n }\n if (i === this.#head) {\n break;\n }\n else {\n i = this.#prev[i];\n }\n }\n }\n }\n *#rindexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#head; true;) {\n if (!this.#isValidIndex(i)) {\n break;\n }\n if (allowStale || !this.#isStale(i)) {\n yield i;\n }\n if (i === this.#tail) {\n break;\n }\n else {\n i = this.#next[i];\n }\n }\n }\n }\n #isValidIndex(index) {\n return (index !== undefined &&\n this.#keyMap.get(this.#keyList[index]) === index);\n }\n /**\n * Return a generator yielding `[key, value]` pairs,\n * in order from most recently used to least recently used.\n */\n *entries() {\n for (const i of this.#indexes()) {\n if (this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield [this.#keyList[i], this.#valList[i]];\n }\n }\n }\n /**\n * Inverse order version of {@link LRUCache.entries}\n *\n * Return a generator yielding `[key, value]` pairs,\n * in order from least recently used to most recently used.\n */\n *rentries() {\n for (const i of this.#rindexes()) {\n if (this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield [this.#keyList[i], this.#valList[i]];\n }\n }\n }\n /**\n * Return a generator yielding the keys in the cache,\n * in order from most recently used to least recently used.\n */\n *keys() {\n for (const i of this.#indexes()) {\n const k = this.#keyList[i];\n if (k !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield k;\n }\n }\n }\n /**\n * Inverse order version of {@link LRUCache.keys}\n *\n * Return a generator yielding the keys in the cache,\n * in order from least recently used to most recently used.\n */\n *rkeys() {\n for (const i of this.#rindexes()) {\n const k = this.#keyList[i];\n if (k !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield k;\n }\n }\n }\n /**\n * Return a generator yielding the values in the cache,\n * in order from most recently used to least recently used.\n */\n *values() {\n for (const i of this.#indexes()) {\n const v = this.#valList[i];\n if (v !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i];\n }\n }\n }\n /**\n * Inverse order version of {@link LRUCache.values}\n *\n * Return a generator yielding the values in the cache,\n * in order from least recently used to most recently used.\n */\n *rvalues() {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i];\n if (v !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])) {\n yield this.#valList[i];\n }\n }\n }\n /**\n * Iterating over the cache itself yields the same results as\n * {@link LRUCache.entries}\n */\n [Symbol.iterator]() {\n return this.entries();\n }\n /**\n * A String value that is used in the creation of the default string description of an object.\n * Called by the built-in method Object.prototype.toString.\n */\n [Symbol.toStringTag] = 'LRUCache';\n /**\n * Find a value for which the supplied fn method returns a truthy value,\n * similar to Array.find(). fn is called as fn(value, key, cache).\n */\n find(fn, getOptions = {}) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i];\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v;\n if (value === undefined)\n continue;\n if (fn(value, this.#keyList[i], this)) {\n return this.get(this.#keyList[i], getOptions);\n }\n }\n }\n /**\n * Call the supplied function on each item in the cache, in order from\n * most recently used to least recently used. fn is called as\n * fn(value, key, cache). Does not update age or recenty of use.\n * Does not iterate over stale values.\n */\n forEach(fn, thisp = this) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i];\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v;\n if (value === undefined)\n continue;\n fn.call(thisp, value, this.#keyList[i], this);\n }\n }\n /**\n * The same as {@link LRUCache.forEach} but items are iterated over in\n * reverse order. (ie, less recently used items are iterated over first.)\n */\n rforEach(fn, thisp = this) {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i];\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v;\n if (value === undefined)\n continue;\n fn.call(thisp, value, this.#keyList[i], this);\n }\n }\n /**\n * Delete any stale entries. Returns true if anything was removed,\n * false otherwise.\n */\n purgeStale() {\n let deleted = false;\n for (const i of this.#rindexes({ allowStale: true })) {\n if (this.#isStale(i)) {\n this.delete(this.#keyList[i]);\n deleted = true;\n }\n }\n return deleted;\n }\n /**\n * Get the extended info about a given entry, to get its value, size, and\n * TTL info simultaneously. Like {@link LRUCache#dump}, but just for a\n * single key. Always returns stale values, if their info is found in the\n * cache, so be sure to check for expired TTLs if relevant.\n */\n info(key) {\n const i = this.#keyMap.get(key);\n if (i === undefined)\n return undefined;\n const v = this.#valList[i];\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v;\n if (value === undefined)\n return undefined;\n const entry = { value };\n if (this.#ttls && this.#starts) {\n const ttl = this.#ttls[i];\n const start = this.#starts[i];\n if (ttl && start) {\n const remain = ttl - (perf.now() - start);\n entry.ttl = remain;\n entry.start = Date.now();\n }\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i];\n }\n return entry;\n }\n /**\n * Return an array of [key, {@link LRUCache.Entry}] tuples which can be\n * passed to cache.load()\n */\n dump() {\n const arr = [];\n for (const i of this.#indexes({ allowStale: true })) {\n const key = this.#keyList[i];\n const v = this.#valList[i];\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v;\n if (value === undefined || key === undefined)\n continue;\n const entry = { value };\n if (this.#ttls && this.#starts) {\n entry.ttl = this.#ttls[i];\n // always dump the start relative to a portable timestamp\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = perf.now() - this.#starts[i];\n entry.start = Math.floor(Date.now() - age);\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i];\n }\n arr.unshift([key, entry]);\n }\n return arr;\n }\n /**\n * Reset the cache and load in the items in entries in the order listed.\n * Note that the shape of the resulting cache may be different if the\n * same options are not used in both caches.\n */\n load(arr) {\n this.clear();\n for (const [key, entry] of arr) {\n if (entry.start) {\n // entry.start is a portable timestamp, but we may be using\n // node's performance.now(), so calculate the offset, so that\n // we get the intended remaining TTL, no matter how long it's\n // been on ice.\n //\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = Date.now() - entry.start;\n entry.start = perf.now() - age;\n }\n this.set(key, entry.value, entry);\n }\n }\n /**\n * Add a value to the cache.\n *\n * Note: if `undefined` is specified as a value, this is an alias for\n * {@link LRUCache#delete}\n */\n set(k, v, setOptions = {}) {\n if (v === undefined) {\n this.delete(k);\n return this;\n }\n const { ttl = this.ttl, start, noDisposeOnSet = this.noDisposeOnSet, sizeCalculation = this.sizeCalculation, status, } = setOptions;\n let { noUpdateTTL = this.noUpdateTTL } = setOptions;\n const size = this.#requireSize(k, v, setOptions.size || 0, sizeCalculation);\n // if the item doesn't fit, don't do anything\n // NB: maxEntrySize set to maxSize by default\n if (this.maxEntrySize && size > this.maxEntrySize) {\n if (status) {\n status.set = 'miss';\n status.maxEntrySizeExceeded = true;\n }\n // have to delete, in case something is there already.\n this.delete(k);\n return this;\n }\n let index = this.#size === 0 ? undefined : this.#keyMap.get(k);\n if (index === undefined) {\n // addition\n index = (this.#size === 0\n ? this.#tail\n : this.#free.length !== 0\n ? this.#free.pop()\n : this.#size === this.#max\n ? this.#evict(false)\n : this.#size);\n this.#keyList[index] = k;\n this.#valList[index] = v;\n this.#keyMap.set(k, index);\n this.#next[this.#tail] = index;\n this.#prev[index] = this.#tail;\n this.#tail = index;\n this.#size++;\n this.#addItemSize(index, size, status);\n if (status)\n status.set = 'add';\n noUpdateTTL = false;\n }\n else {\n // update\n this.#moveToTail(index);\n const oldVal = this.#valList[index];\n if (v !== oldVal) {\n if (this.#hasFetchMethod && this.#isBackgroundFetch(oldVal)) {\n oldVal.__abortController.abort(new Error('replaced'));\n const { __staleWhileFetching: s } = oldVal;\n if (s !== undefined && !noDisposeOnSet) {\n if (this.#hasDispose) {\n this.#dispose?.(s, k, 'set');\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([s, k, 'set']);\n }\n }\n }\n else if (!noDisposeOnSet) {\n if (this.#hasDispose) {\n this.#dispose?.(oldVal, k, 'set');\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldVal, k, 'set']);\n }\n }\n this.#removeItemSize(index);\n this.#addItemSize(index, size, status);\n this.#valList[index] = v;\n if (status) {\n status.set = 'replace';\n const oldValue = oldVal && this.#isBackgroundFetch(oldVal)\n ? oldVal.__staleWhileFetching\n : oldVal;\n if (oldValue !== undefined)\n status.oldValue = oldValue;\n }\n }\n else if (status) {\n status.set = 'update';\n }\n }\n if (ttl !== 0 && !this.#ttls) {\n this.#initializeTTLTracking();\n }\n if (this.#ttls) {\n if (!noUpdateTTL) {\n this.#setItemTTL(index, ttl, start);\n }\n if (status)\n this.#statusTTL(status, index);\n }\n if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed;\n let task;\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task);\n }\n }\n return this;\n }\n /**\n * Evict the least recently used item, returning its value or\n * `undefined` if cache is empty.\n */\n pop() {\n try {\n while (this.#size) {\n const val = this.#valList[this.#head];\n this.#evict(true);\n if (this.#isBackgroundFetch(val)) {\n if (val.__staleWhileFetching) {\n return val.__staleWhileFetching;\n }\n }\n else if (val !== undefined) {\n return val;\n }\n }\n }\n finally {\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed;\n let task;\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task);\n }\n }\n }\n }\n #evict(free) {\n const head = this.#head;\n const k = this.#keyList[head];\n const v = this.#valList[head];\n if (this.#hasFetchMethod && this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('evicted'));\n }\n else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v, k, 'evict');\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v, k, 'evict']);\n }\n }\n this.#removeItemSize(head);\n // if we aren't about to use the index, then null these out\n if (free) {\n this.#keyList[head] = undefined;\n this.#valList[head] = undefined;\n this.#free.push(head);\n }\n if (this.#size === 1) {\n this.#head = this.#tail = 0;\n this.#free.length = 0;\n }\n else {\n this.#head = this.#next[head];\n }\n this.#keyMap.delete(k);\n this.#size--;\n return head;\n }\n /**\n * Check if a key is in the cache, without updating the recency of use.\n * Will return false if the item is stale, even though it is technically\n * in the cache.\n *\n * Will not update item age unless\n * {@link LRUCache.OptionsBase.updateAgeOnHas} is set.\n */\n has(k, hasOptions = {}) {\n const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions;\n const index = this.#keyMap.get(k);\n if (index !== undefined) {\n const v = this.#valList[index];\n if (this.#isBackgroundFetch(v) &&\n v.__staleWhileFetching === undefined) {\n return false;\n }\n if (!this.#isStale(index)) {\n if (updateAgeOnHas) {\n this.#updateItemAge(index);\n }\n if (status) {\n status.has = 'hit';\n this.#statusTTL(status, index);\n }\n return true;\n }\n else if (status) {\n status.has = 'stale';\n this.#statusTTL(status, index);\n }\n }\n else if (status) {\n status.has = 'miss';\n }\n return false;\n }\n /**\n * Like {@link LRUCache#get} but doesn't update recency or delete stale\n * items.\n *\n * Returns `undefined` if the item is stale, unless\n * {@link LRUCache.OptionsBase.allowStale} is set.\n */\n peek(k, peekOptions = {}) {\n const { allowStale = this.allowStale } = peekOptions;\n const index = this.#keyMap.get(k);\n if (index === undefined ||\n (!allowStale && this.#isStale(index))) {\n return;\n }\n const v = this.#valList[index];\n // either stale and allowed, or forcing a refresh of non-stale value\n return this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v;\n }\n #backgroundFetch(k, index, options, context) {\n const v = index === undefined ? undefined : this.#valList[index];\n if (this.#isBackgroundFetch(v)) {\n return v;\n }\n const ac = new AC();\n const { signal } = options;\n // when/if our AC signals, then stop listening to theirs.\n signal?.addEventListener('abort', () => ac.abort(signal.reason), {\n signal: ac.signal,\n });\n const fetchOpts = {\n signal: ac.signal,\n options,\n context,\n };\n const cb = (v, updateCache = false) => {\n const { aborted } = ac.signal;\n const ignoreAbort = options.ignoreFetchAbort && v !== undefined;\n if (options.status) {\n if (aborted && !updateCache) {\n options.status.fetchAborted = true;\n options.status.fetchError = ac.signal.reason;\n if (ignoreAbort)\n options.status.fetchAbortIgnored = true;\n }\n else {\n options.status.fetchResolved = true;\n }\n }\n if (aborted && !ignoreAbort && !updateCache) {\n return fetchFail(ac.signal.reason);\n }\n // either we didn't abort, and are still here, or we did, and ignored\n const bf = p;\n if (this.#valList[index] === p) {\n if (v === undefined) {\n if (bf.__staleWhileFetching) {\n this.#valList[index] = bf.__staleWhileFetching;\n }\n else {\n this.delete(k);\n }\n }\n else {\n if (options.status)\n options.status.fetchUpdated = true;\n this.set(k, v, fetchOpts.options);\n }\n }\n return v;\n };\n const eb = (er) => {\n if (options.status) {\n options.status.fetchRejected = true;\n options.status.fetchError = er;\n }\n return fetchFail(er);\n };\n const fetchFail = (er) => {\n const { aborted } = ac.signal;\n const allowStaleAborted = aborted && options.allowStaleOnFetchAbort;\n const allowStale = allowStaleAborted || options.allowStaleOnFetchRejection;\n const noDelete = allowStale || options.noDeleteOnFetchRejection;\n const bf = p;\n if (this.#valList[index] === p) {\n // if we allow stale on fetch rejections, then we need to ensure that\n // the stale value is not removed from the cache when the fetch fails.\n const del = !noDelete || bf.__staleWhileFetching === undefined;\n if (del) {\n this.delete(k);\n }\n else if (!allowStaleAborted) {\n // still replace the *promise* with the stale value,\n // since we are done with the promise at this point.\n // leave it untouched if we're still waiting for an\n // aborted background fetch that hasn't yet returned.\n this.#valList[index] = bf.__staleWhileFetching;\n }\n }\n if (allowStale) {\n if (options.status && bf.__staleWhileFetching !== undefined) {\n options.status.returnedStale = true;\n }\n return bf.__staleWhileFetching;\n }\n else if (bf.__returned === bf) {\n throw er;\n }\n };\n const pcall = (res, rej) => {\n const fmp = this.#fetchMethod?.(k, v, fetchOpts);\n if (fmp && fmp instanceof Promise) {\n fmp.then(v => res(v === undefined ? undefined : v), rej);\n }\n // ignored, we go until we finish, regardless.\n // defer check until we are actually aborting,\n // so fetchMethod can override.\n ac.signal.addEventListener('abort', () => {\n if (!options.ignoreFetchAbort ||\n options.allowStaleOnFetchAbort) {\n res(undefined);\n // when it eventually resolves, update the cache.\n if (options.allowStaleOnFetchAbort) {\n res = v => cb(v, true);\n }\n }\n });\n };\n if (options.status)\n options.status.fetchDispatched = true;\n const p = new Promise(pcall).then(cb, eb);\n const bf = Object.assign(p, {\n __abortController: ac,\n __staleWhileFetching: v,\n __returned: undefined,\n });\n if (index === undefined) {\n // internal, don't expose status.\n this.set(k, bf, { ...fetchOpts.options, status: undefined });\n index = this.#keyMap.get(k);\n }\n else {\n this.#valList[index] = bf;\n }\n return bf;\n }\n #isBackgroundFetch(p) {\n if (!this.#hasFetchMethod)\n return false;\n const b = p;\n return (!!b &&\n b instanceof Promise &&\n b.hasOwnProperty('__staleWhileFetching') &&\n b.__abortController instanceof AC);\n }\n async fetch(k, fetchOptions = {}) {\n const { \n // get options\n allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, \n // set options\n ttl = this.ttl, noDisposeOnSet = this.noDisposeOnSet, size = 0, sizeCalculation = this.sizeCalculation, noUpdateTTL = this.noUpdateTTL, \n // fetch exclusive options\n noDeleteOnFetchRejection = this.noDeleteOnFetchRejection, allowStaleOnFetchRejection = this.allowStaleOnFetchRejection, ignoreFetchAbort = this.ignoreFetchAbort, allowStaleOnFetchAbort = this.allowStaleOnFetchAbort, context, forceRefresh = false, status, signal, } = fetchOptions;\n if (!this.#hasFetchMethod) {\n if (status)\n status.fetch = 'get';\n return this.get(k, {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n status,\n });\n }\n const options = {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n ttl,\n noDisposeOnSet,\n size,\n sizeCalculation,\n noUpdateTTL,\n noDeleteOnFetchRejection,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n status,\n signal,\n };\n let index = this.#keyMap.get(k);\n if (index === undefined) {\n if (status)\n status.fetch = 'miss';\n const p = this.#backgroundFetch(k, index, options, context);\n return (p.__returned = p);\n }\n else {\n // in cache, maybe already fetching\n const v = this.#valList[index];\n if (this.#isBackgroundFetch(v)) {\n const stale = allowStale && v.__staleWhileFetching !== undefined;\n if (status) {\n status.fetch = 'inflight';\n if (stale)\n status.returnedStale = true;\n }\n return stale ? v.__staleWhileFetching : (v.__returned = v);\n }\n // if we force a refresh, that means do NOT serve the cached value,\n // unless we are already in the process of refreshing the cache.\n const isStale = this.#isStale(index);\n if (!forceRefresh && !isStale) {\n if (status)\n status.fetch = 'hit';\n this.#moveToTail(index);\n if (updateAgeOnGet) {\n this.#updateItemAge(index);\n }\n if (status)\n this.#statusTTL(status, index);\n return v;\n }\n // ok, it is stale or a forced refresh, and not already fetching.\n // refresh the cache.\n const p = this.#backgroundFetch(k, index, options, context);\n const hasStale = p.__staleWhileFetching !== undefined;\n const staleVal = hasStale && allowStale;\n if (status) {\n status.fetch = isStale ? 'stale' : 'refresh';\n if (staleVal && isStale)\n status.returnedStale = true;\n }\n return staleVal ? p.__staleWhileFetching : (p.__returned = p);\n }\n }\n /**\n * Return a value from the cache. Will update the recency of the cache\n * entry found.\n *\n * If the key is not found, get() will return `undefined`.\n */\n get(k, getOptions = {}) {\n const { allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, status, } = getOptions;\n const index = this.#keyMap.get(k);\n if (index !== undefined) {\n const value = this.#valList[index];\n const fetching = this.#isBackgroundFetch(value);\n if (status)\n this.#statusTTL(status, index);\n if (this.#isStale(index)) {\n if (status)\n status.get = 'stale';\n // delete only if not an in-flight background fetch\n if (!fetching) {\n if (!noDeleteOnStaleGet) {\n this.delete(k);\n }\n if (status && allowStale)\n status.returnedStale = true;\n return allowStale ? value : undefined;\n }\n else {\n if (status &&\n allowStale &&\n value.__staleWhileFetching !== undefined) {\n status.returnedStale = true;\n }\n return allowStale ? value.__staleWhileFetching : undefined;\n }\n }\n else {\n if (status)\n status.get = 'hit';\n // if we're currently fetching it, we don't actually have it yet\n // it's not stale, which means this isn't a staleWhileRefetching.\n // If it's not stale, and fetching, AND has a __staleWhileFetching\n // value, then that means the user fetched with {forceRefresh:true},\n // so it's safe to return that value.\n if (fetching) {\n return value.__staleWhileFetching;\n }\n this.#moveToTail(index);\n if (updateAgeOnGet) {\n this.#updateItemAge(index);\n }\n return value;\n }\n }\n else if (status) {\n status.get = 'miss';\n }\n }\n #connect(p, n) {\n this.#prev[n] = p;\n this.#next[p] = n;\n }\n #moveToTail(index) {\n // if tail already, nothing to do\n // if head, move head to next[index]\n // else\n // move next[prev[index]] to next[index] (head has no prev)\n // move prev[next[index]] to prev[index]\n // prev[index] = tail\n // next[tail] = index\n // tail = index\n if (index !== this.#tail) {\n if (index === this.#head) {\n this.#head = this.#next[index];\n }\n else {\n this.#connect(this.#prev[index], this.#next[index]);\n }\n this.#connect(this.#tail, index);\n this.#tail = index;\n }\n }\n /**\n * Deletes a key out of the cache.\n * Returns true if the key was deleted, false otherwise.\n */\n delete(k) {\n let deleted = false;\n if (this.#size !== 0) {\n const index = this.#keyMap.get(k);\n if (index !== undefined) {\n deleted = true;\n if (this.#size === 1) {\n this.clear();\n }\n else {\n this.#removeItemSize(index);\n const v = this.#valList[index];\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'));\n }\n else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v, k, 'delete');\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v, k, 'delete']);\n }\n }\n this.#keyMap.delete(k);\n this.#keyList[index] = undefined;\n this.#valList[index] = undefined;\n if (index === this.#tail) {\n this.#tail = this.#prev[index];\n }\n else if (index === this.#head) {\n this.#head = this.#next[index];\n }\n else {\n const pi = this.#prev[index];\n this.#next[pi] = this.#next[index];\n const ni = this.#next[index];\n this.#prev[ni] = this.#prev[index];\n }\n this.#size--;\n this.#free.push(index);\n }\n }\n }\n if (this.#hasDisposeAfter && this.#disposed?.length) {\n const dt = this.#disposed;\n let task;\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task);\n }\n }\n return deleted;\n }\n /**\n * Clear the cache entirely, throwing away all values.\n */\n clear() {\n for (const index of this.#rindexes({ allowStale: true })) {\n const v = this.#valList[index];\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'));\n }\n else {\n const k = this.#keyList[index];\n if (this.#hasDispose) {\n this.#dispose?.(v, k, 'delete');\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v, k, 'delete']);\n }\n }\n }\n this.#keyMap.clear();\n this.#valList.fill(undefined);\n this.#keyList.fill(undefined);\n if (this.#ttls && this.#starts) {\n this.#ttls.fill(0);\n this.#starts.fill(0);\n }\n if (this.#sizes) {\n this.#sizes.fill(0);\n }\n this.#head = 0;\n this.#tail = 0;\n this.#free.length = 0;\n this.#calculatedSize = 0;\n this.#size = 0;\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed;\n let task;\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task);\n }\n }\n }\n}\n//# sourceMappingURL=index.js.map","import type { vec3 } from \"gl-matrix\";\nimport { LRUCache } from \"lru-cache\";\n\nexport type TileIndexCache<T> = {\n get: (xyz: vec3) => T | undefined;\n set: (xyz: vec3, value: T) => void;\n delete: (xyz: vec3) => void;\n clear: () => void;\n purgeStale: () => void;\n};\n\nexport type CreateTileIndexCacheOptions<T> = {\n max: number;\n ttl?: number;\n dispose?: (value: T, key: vec3) => void;\n};\n\nexport const createTileIndexCache = <T extends NonNullable<unknown>>(\n options: CreateTileIndexCacheOptions<T>,\n) => {\n const cache = new LRUCache<number, T>({\n ...options,\n ttlResolution: 0,\n dispose: (value, key) => options.dispose?.(value, fromKey(key)),\n });\n\n const toKey = ([x = 0, y = 0, z = 0]: vec3) =>\n y * 2 ** z + x + (4 ** (z + 1) - 1) / 3;\n const fromKey = (key: number) => {\n const z = Math.floor(Math.log(key * 3 + 1) / Math.log(4)) - 1;\n key -= (4 ** (z + 1) - 1) / 3;\n const y = Math.floor(key / 2 ** z);\n const x = key - y * 2 ** z;\n return [x, y, z] satisfies vec3;\n };\n\n return {\n get: xyz => cache.get(toKey(xyz)),\n set: (xyz, value) => cache.set(toKey(xyz), value as unknown as T),\n delete: xyz => cache.delete(toKey(xyz)),\n clear: () => cache.clear(),\n purgeStale: () => cache.purgeStale(),\n } satisfies TileIndexCache<T>;\n};\n","import type { vec2, vec3 } from \"gl-matrix\";\n\nimport type { TileCache } from \"./layers/terrain/tile-cache\";\nimport { createTileDownsampler } from \"./layers/terrain/tile-downsampler\";\nimport { createTileIndexCache } from \"./layers/terrain/tile-index-cache\";\nimport { mercator } from \"./math\";\n\nconst defaultZ = 15;\nconst size = 256;\n\nexport type Elevation = {\n get: ([lng, lat]: vec2, z?: number) => number;\n dispose: () => void;\n};\n\nexport const createElevation = ({\n gl,\n terrainCache,\n}: {\n gl: WebGL2RenderingContext;\n terrainCache: TileCache;\n}) => {\n const tileCache = createTileIndexCache<Uint8Array>({\n max: 1000,\n });\n\n const downsampler = createTileDownsampler(terrainCache);\n\n const framebuffer = gl.createFramebuffer();\n if (!framebuffer) throw new Error(\"Framebuffer creation failed\");\n\n const downsampleBuffer = ([x = 0, y = 0, z = 0]: vec3) => {\n const tile = downsampler.get([x, y, z]);\n if (!tile) return undefined;\n const { texture, downsample } = tile;\n const k = 2 ** downsample;\n const xyz: vec3 = [Math.floor(x / k), Math.floor(y / k), z - downsample];\n const cached = tileCache.get(xyz);\n if (cached) return { buffer: cached, downsample };\n\n const buffer = new Uint8Array(4 * size * size);\n gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n texture.attach();\n gl.readPixels(0, 0, size, size, gl.RGBA, gl.UNSIGNED_BYTE, buffer);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\n tileCache.set(xyz, buffer);\n return { buffer, downsample };\n };\n\n const get = ([lng = 0, lat = 0]: vec2, z = defaultZ) => {\n const k = 2 ** z;\n const p = mercator([lng, lat, 0]).map(_ => _ * k);\n const [x = 0, y = 0] = p.map(_ => Math.floor(_ % k));\n let [px = 0, py = 0] = p.map(_ => _ % 1);\n const downsampled = downsampleBuffer([x, y, z]);\n if (!downsampled) return 0;\n const { buffer, downsample } = downsampled;\n const k2 = 2 ** downsample;\n [px, py] = [((x % k2) + px) / k2, ((y % k2) + py) / k2];\n\n const q = 4 * size * Math.floor(py * size) + 4 * Math.floor(px * size);\n const [r = 0, g = 0, b = 0] = buffer.slice(q, q + 4);\n\n const value = (r * 65536 + g * 256 + b) / 10 - 10000;\n\n return value;\n };\n\n const dispose = () => {\n gl.deleteFramebuffer(framebuffer);\n };\n\n return { get, dispose } satisfies Elevation;\n};\n","#version 300 es\n\nprecision highp float;\n\nuniform sampler2D imagery;\nin vec2 uv;\nin vec4 color_out;\nout vec4 result;\n\nvoid main(void) {\n result = texture(imagery, uv) * color_out;\n}","import type { vec3 } from \"gl-matrix\";\n\nimport type { ImageTexture } from \"./image-texture\";\nimport { createImageTexture } from \"./image-texture\";\nimport type { Texture } from \"./texture\";\nimport { createTileIndexCache } from \"./tile-index-cache\";\n\nexport type TileCache = {\n get: (xyz: vec3) => Texture | undefined;\n dispose: () => void;\n};\n\nexport const createTileCache = ({\n gl,\n urlPattern,\n onLoad,\n}: {\n gl: WebGL2RenderingContext;\n urlPattern: string;\n onLoad?: () => void;\n}) => {\n const tiles = createTileIndexCache<ImageTexture>({\n max: 10000,\n dispose: tile => tile.dispose(),\n });\n const loading = createTileIndexCache<true>({\n max: 10000,\n ttl: 2000,\n dispose: (_, xyz) => {\n const cached = tiles.get(xyz);\n if (cached && !cached.loaded) {\n console.log(\"Cancel\", xyz);\n tiles.delete(xyz);\n }\n },\n });\n\n const get: (xyz: vec3) => Texture | undefined = xyz => {\n const cached = tiles.get(xyz);\n if (cached) {\n if (cached.loaded) {\n loading.delete(xyz);\n return cached;\n }\n loading.set(xyz, true);\n } else {\n const [x, y, z] = xyz;\n const url = urlPattern\n .replace(\"{x}\", `${x}`)\n .replace(\"{y}\", `${y}`)\n .replace(\"{z}\", `${z}`);\n const texture = createImageTexture({\n gl,\n url,\n onLoad: () => {\n loading.delete(xyz);\n onLoad?.();\n },\n });\n tiles.set(xyz, texture);\n loading.set(xyz, true);\n }\n };\n\n const interval = setInterval(() => loading.purgeStale(), 200);\n\n const dispose = () => {\n clearInterval(interval);\n tiles.clear();\n };\n\n return { get, dispose } satisfies TileCache;\n};\n","import { vec3 } from \"gl-matrix\";\n\nimport type { Elevation } from \"../../elevation\";\nimport { geodetic, mercator, tileToMercator } from \"../../math\";\nimport { createTileIndexCache } from \"./tile-index-cache\";\n\nexport type TileShapes = {\n get: (xyz: vec3) => vec3[];\n};\n\nexport const createTileShapes = (elevation: Elevation) => {\n const cache = createTileIndexCache<vec3[]>({\n max: 10000,\n ttl: 1000,\n });\n\n const corners = [\n [0, 0],\n [1, 0],\n [1, 1],\n [0, 1],\n ];\n const get = (xyz: vec3) => {\n const cached = cache.get(xyz);\n if (cached) return cached;\n\n const [x = 0, y = 0, z = 0] = xyz;\n const result = corners\n .map<vec3>(([u = 0, v = 0]) => [x + u, y + v, z])\n .map(_ => tileToMercator(_, _))\n .map(_ => geodetic(_, _))\n .map(_ => {\n const [lng = 0, lat = 0] = _;\n const elevationZ = Math.max(z - 5, 0);\n return mercator(\n vec3.set(_, lng, lat, elevation.get([lng, lat], elevationZ)),\n _,\n );\n });\n cache.set(xyz, result);\n return result;\n };\n\n return { get } satisfies TileShapes;\n};\n","#version 300 es\n\nprecision highp float;\n\nuniform mat4 projection;\nuniform mat4 model_view;\nuniform ivec3 xyz;\nuniform ivec3 camera;\nuniform sampler2D terrain;\nuniform int downsample_imagery;\nuniform int downsample_terrain;\nuniform vec4 color;\n\nin vec3 uvw;\nout vec2 uv;\nout vec4 color_out;\n\nconst int ONE = 1073741824; // 2^30\nconst float INV_ONE = 1. / float(ONE);\nconst float CIRCUMFERENCE = 40075017.;\n\nvec2 downsample(int downsample) {\n float k = pow(2., float(downsample));\n return (mod(vec2(xyz.xy), k) + uvw.xy) / k;\n}\n\nvoid main(void) {\n vec4 e = texture(terrain, downsample(downsample_terrain));\n float t = (((256. * 256. * 255. * e.r) + (256. * 255. * e.g) + (255. * e.b)) / 10. - 10000.) / CIRCUMFERENCE;\n\n int k = int(pow(2., float(xyz.z)));\n ivec3 q = ivec3(uvw * float(ONE / k)) + ivec3(xyz.xy * (ONE / k), int(t * float(ONE)));\n gl_Position = projection * model_view * vec4(vec3(q - camera) * INV_ONE, 1.);\n\n uv = downsample(downsample_imagery);\n color_out = color;\n}\n","import type { mat4 } from \"gl-matrix\";\nimport { vec2, vec3, vec4 } from \"gl-matrix\";\n\nimport { createBuffer } from \"../../buffer\";\nimport { range } from \"../../common\";\nimport { createElevation } from \"../../elevation\";\nimport { createProgram } from \"../../program\";\nimport type { Viewport } from \"../../viewport\";\nimport type { World } from \"../../world\";\nimport type { LayerOptions } from \"..\";\nimport { type BaseLayer, type Terrain } from \"..\";\nimport { configure, to } from \"../common\";\nimport depthSource from \"../depth.glsl\";\nimport fragmentSource from \"./fragment.glsl\";\nimport type { Texture } from \"./texture\";\nimport type { TileCache } from \"./tile-cache\";\nimport { createTileCache } from \"./tile-cache\";\nimport type { TileDownsampler } from \"./tile-downsampler\";\nimport { createTileDownsampler } from \"./tile-downsampler\";\nimport { createTileShapes } from \"./tile-shapes\";\nimport vertexSource from \"./vertex.glsl\";\n\nconst n = 34;\n\nconst maxZ = 22;\n\nconst indices = range(0, n).flatMap(y =>\n range(0, n).flatMap(x => [\n y * (n + 1) + x,\n y * (n + 1) + x + 1,\n (y + 1) * (n + 1) + x + 1,\n y * (n + 1) + x,\n (y + 1) * (n + 1) + x + 1,\n (y + 1) * (n + 1) + x,\n ]),\n);\n\nconst skirt = 0.1;\nconst uvw = range(0, n + 1).flatMap(y =>\n range(0, n + 1).map(x => {\n let u = (x - 1) / (n - 2);\n let v = (y - 1) / (n - 2);\n let w = 0;\n if (x === 0) {\n u = 0;\n w = -skirt;\n }\n if (x === n) {\n u = 1;\n w = -skirt;\n }\n if (y === 0) {\n v = 0;\n w = -skirt;\n }\n if (y === n) {\n v = 1;\n w = -skirt;\n }\n\n return [u, v, w] as vec3;\n }),\n);\n\nexport type TerrainLayer = BaseLayer & Terrain;\n\nexport const createTerrainLayer = (\n world: World,\n terrain: Partial<Terrain> = {},\n) => {\n const { gl } = world;\n let { options, terrainUrl, color } = {\n options: {},\n terrainUrl: \"\",\n imageryUrl: \"\",\n color: [1, 1, 1, 1],\n ...terrain,\n } satisfies Terrain;\n const { imageryUrl = \"\" } = terrain;\n\n let imageryCache: TileCache | undefined;\n let imageryDownsampler: TileDownsampler | undefined;\n\n const updateImageryUrl = (imageryUrl: string) => {\n imageryCache?.dispose();\n imageryCache = createTileCache({\n gl,\n urlPattern: imageryUrl,\n onLoad: () => {\n const extension = gl.getExtension(\"EXT_texture_filter_anisotropic\");\n if (extension) {\n const max = gl.getParameter(extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT);\n gl.texParameterf(\n gl.TEXTURE_2D,\n extension.TEXTURE_MAX_ANISOTROPY_EXT,\n max,\n );\n }\n gl.texParameteri(\n gl.TEXTURE_2D,\n gl.TEXTURE_MIN_FILTER,\n gl.LINEAR_MIPMAP_LINEAR,\n );\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.generateMipmap(gl.TEXTURE_2D);\n },\n });\n imageryDownsampler = createTileDownsampler(imageryCache);\n };\n updateImageryUrl(imageryUrl);\n\n const terrainCache = createTileCache({\n gl,\n urlPattern: terrainUrl,\n onLoad: () => {\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n },\n });\n\n const terrainDownsampler = createTileDownsampler(terrainCache, 3);\n const elevation = createElevation({ gl, terrainCache });\n const tileShapes = createTileShapes(elevation);\n\n const { renderProgram, depthProgram } = createPrograms(gl);\n\n const q = [0, 1, 2, 3];\n const vec3s = q.map(vec3.create);\n const vec4s = q.map(vec4.create);\n const vec2s = q.map(vec2.create);\n\n const calculateVisibleTiles = (viewport: Viewport) => {\n const { camera, worldToLocal, localToClip, clipToScreen } = viewport;\n\n const divide: (xyz: vec3) => vec3[] = xyz => {\n const [x = 0, y = 0, z = 0] = xyz;\n const shape = tileShapes.get(xyz);\n let split = insideTileShape(camera, shape);\n if (!split) {\n const clip = shape\n .map((_, i) => worldToLocal(_, vec3s[i]))\n .map((_, i) => localToClip(_, vec4s[i]));\n if (clipped(clip)) return [];\n const size = screenSize(clip.map((_, i) => clipToScreen(_, vec2s[i])));\n split = size > 512 / devicePixelRatio;\n }\n if (split && z < maxZ) {\n const divided: vec3[] = [\n [2 * x, 2 * y, z + 1],\n [2 * x + 1, 2 * y, z + 1],\n [2 * x, 2 * y + 1, z + 1],\n [2 * x + 1, 2 * y + 1, z + 1],\n ];\n return divided.flatMap(_ => divide(_));\n } else return [xyz];\n };\n\n return divide([0, 0, 0]);\n };\n\n const render = ({\n viewport,\n depth = false,\n index = 0,\n }: {\n viewport: Viewport;\n depth?: boolean;\n index?: number;\n }) => {\n if (configure(gl, depth, options)) return;\n const program = depth ? depthProgram : renderProgram;\n const { projection, modelView, camera } = viewport;\n const visible = calculateVisibleTiles(viewport);\n\n for (const xyz of visible) {\n const downsampledImagery = depth\n ? undefined\n : imageryDownsampler?.get(xyz);\n const downsampledTerrain = terrainDownsampler.get(xyz);\n if ((!depth && !downsampledImagery) || !downsampledTerrain) continue;\n const { texture: terrain, downsample: downsampleTerrain } =\n downsampledTerrain;\n const { texture: imagery = terrain, downsample: downsampleImagery = 0 } =\n downsampledImagery ?? {};\n\n program.execute({\n projection,\n modelView,\n camera: to(camera),\n xyz,\n imagery,\n terrain,\n downsampleImagery,\n downsampleTerrain,\n color,\n index,\n });\n }\n };\n\n const dispose = () => {\n depthProgram.dispose();\n renderProgram.dispose();\n imageryCache?.dispose();\n terrainCache.dispose();\n elevation.dispose();\n world.remove(layer);\n };\n\n const layer = {\n render,\n dispose,\n get options() {\n return options;\n },\n set options(_: Partial<LayerOptions>) {\n options = _;\n },\n get terrainUrl() {\n return terrainUrl;\n },\n set terrainUrl(_: string) {\n terrainUrl = _;\n },\n get imageryUrl() {\n return imageryUrl;\n },\n set imageryUrl(_: string) {\n updateImageryUrl(_);\n },\n get color() {\n return color;\n },\n set color(_: vec4) {\n color = _;\n },\n } satisfies TerrainLayer;\n\n world.add(layer);\n\n return layer;\n};\n\nconst createPrograms = (gl: WebGL2RenderingContext) => {\n const createRenderProgram = (depth = false) => {\n const program = createProgram({\n gl,\n vertexSource,\n fragmentSource: depth ? depthSource : fragmentSource,\n });\n\n const uvwBuffer = createBuffer({ gl, type: \"f32\", target: \"array\" });\n uvwBuffer.set(uvw.flatMap(([x = 0, y = 0, z = 0]) => [x, y, z]));\n\n const indexBuffer = createBuffer({ gl, type: \"u16\", target: \"element\" });\n indexBuffer.set(indices);\n\n const uvwAttribute = program.attribute3f(\"uvw\", uvwBuffer);\n\n const projectionUniform = program.uniformMatrix4f(\"projection\");\n const modelViewUniform = program.uniformMatrix4f(\"model_view\");\n const imageryUniform = program.uniform1i(\"imagery\");\n const terrainUniform = program.uniform1i(\"terrain\");\n const downsampleImageryUniform = program.uniform1i(\"downsample_imagery\");\n const downsampleTerrainUniform = program.uniform1i(\"downsample_terrain\");\n const colorUniform = program.uniform4f(\"color\");\n const xyzUniform = program.uniform3i(\"xyz\");\n const cameraUniform = program.uniform3i(\"camera\");\n const indexUniform = program.uniform1i(\"index\");\n\n const execute = ({\n projection,\n modelView,\n camera,\n xyz,\n imagery,\n terrain,\n downsampleImagery,\n downsampleTerrain,\n color,\n index,\n }: {\n projection: mat4;\n modelView: mat4;\n camera: vec3;\n xyz: vec3;\n imagery: Texture;\n terrain: Texture;\n downsampleImagery: number;\n downsampleTerrain: number;\n color: vec4;\n index: number;\n }) => {\n program.use();\n\n uvwAttribute.use();\n\n projectionUniform.set(projection);\n modelViewUniform.set(modelView);\n xyzUniform.set(xyz);\n cameraUniform.set(camera);\n downsampleImageryUniform.set(downsampleImagery);\n downsampleTerrainUniform.set(downsampleTerrain);\n colorUniform.set(color);\n indexUniform.set(index);\n\n gl.activeTexture(gl.TEXTURE0);\n imageryUniform.set(0);\n imagery.use();\n\n gl.activeTexture(gl.TEXTURE1);\n terrainUniform.set(1);\n terrain.use();\n\n indexBuffer.use();\n gl.drawElements(gl.TRIANGLES, n * n * 2 * 3, gl.UNSIGNED_SHORT, 0);\n };\n\n const dispose = () => {\n uvwBuffer.dispose();\n indexBuffer.dispose();\n program.dispose();\n };\n\n return { execute, dispose };\n };\n\n const renderProgram = createRenderProgram();\n const depthProgram = createRenderProgram(true);\n\n return { renderProgram, depthProgram };\n};\n\nconst insideTileShape = (position: vec3, shape: vec3[]) => {\n const [minX, maxX, minY, maxY] = shape.reduce(\n ([minX, maxX, minY, maxY], [x = 0, y = 0]) => [\n Math.min(x, minX),\n Math.max(x, maxX),\n Math.min(y, minY),\n Math.max(y, maxY),\n ],\n [1, 0, 1, 0],\n );\n const [x = 0, y = 0, z = 0] = position;\n return (\n x > minX && x < maxX && y > minY && y < maxY && z > 0 && z < maxX - minX\n );\n};\n\nconst clipped = (clip: vec4[]) =>\n clip.every(([x = 0, , , w = 0]) => x > w) ||\n clip.every(([x = 0, , , w = 0]) => x < -w) ||\n clip.every(([, y = 0, , w = 0]) => y > w) ||\n clip.every(([, y = 0, , w = 0]) => y < -w) ||\n clip.every(([, , z = 0, w = 0]) => z > w) ||\n clip.every(([, , z = 0, w = 0]) => z < -w) ||\n clip.every(([, , , w = 0]) => w < 0);\n\nconst screenSize = (screen: vec2[]) =>\n Math.sqrt(\n screen\n .map((_, i) =>\n vec2.squaredDistance(\n screen[i] ?? [0, 0],\n screen[(i + 1) % screen.length] ?? [0, 0],\n ),\n )\n .reduce((a, b) => a + b, 0) / screen.length,\n );\n","import { quat, vec3, vec4 } from \"gl-matrix\";\n\nimport { geodetic, mercator, toOrientation, toQuaternion } from \"./math\";\n\nconst k = 10;\nconst epsilon = 1e-3;\n\nexport type Transition<T> = {\n value: T;\n dispose: () => void;\n};\n\nexport const createTransition = <T>(\n step: (_: { time: number; current: T; target: T }) => T,\n) => {\n let running = true;\n let target: T | undefined;\n let current: T | undefined;\n let last: number | undefined;\n\n const frame = () => {\n if (!running) return;\n requestAnimationFrame(frame);\n\n const now = performance.now();\n const time = (now - (last ?? now)) / 1000;\n last = now;\n\n if (time > 1) {\n current = target;\n target = undefined;\n }\n\n if (!current || !target) return;\n\n current = step({ time, current, target });\n };\n requestAnimationFrame(frame);\n\n const dispose = () => {\n running = false;\n };\n\n return {\n get value() {\n return current;\n },\n set value(_: T | undefined) {\n if (!current || !_) current = _;\n target = _;\n },\n dispose,\n };\n};\n\nexport const createNumberTransition = (\n update?: (_: number, target: number) => void,\n) =>\n createTransition<number>(({ time, current, target }) => {\n current = current + (target - current) * k * time;\n if (Math.abs(target - current) < epsilon) current = target;\n update?.(current, target);\n return current;\n });\n\nexport const createColorTransition = (\n update?: (_: vec4, target: vec4) => void,\n) =>\n createTransition<vec4>(({ time, current, target }) => {\n current = vec4.add(\n vec4.create(),\n current,\n vec4.scale(\n vec4.create(),\n vec4.sub(vec4.create(), target, current),\n k * time,\n ),\n );\n if (vec4.distance(current, target) < epsilon) current = target;\n update?.(current, target);\n return current;\n });\n\nexport const createPositionTransition = (\n update?: (_: vec3, target: vec3) => void,\n) =>\n createTransition<vec3>(({ time, current, target }) => {\n current = geodetic(\n vec3.add(\n vec3.create(),\n mercator(current),\n vec3.scale(\n vec3.create(),\n vec3.sub(vec3.create(), mercator(target), mercator(current)),\n k * time,\n ),\n ),\n );\n if (vec3.distance(current, target) < epsilon) current = target;\n update?.(current, target);\n return current;\n });\n\nexport const createPositionVelocityTransition = (\n update?: (_: vec3, target: vec3) => void,\n) => {\n let velocity: vec3 = [0, 0, 0];\n let targetVelocity: vec3 = [0, 0, 0];\n let last: vec3 | undefined;\n let lastTime: number | undefined;\n\n return createTransition<vec3>(({ time, current, target }) => {\n if (target === current || time > 1) {\n last = undefined;\n velocity = [0, 0, 0];\n targetVelocity = [0, 0, 0];\n return current;\n }\n\n if (!last) {\n last = target;\n lastTime = time;\n } else if (target !== last && lastTime !== undefined) {\n targetVelocity = vec3.scale(\n vec3.create(),\n vec3.sub(vec3.create(), mercator(target), mercator(last)),\n 1000 / (performance.now() - lastTime),\n );\n last = target;\n lastTime = performance.now();\n }\n\n const nextVelocity = vec3.add(\n vec3.create(),\n velocity,\n vec3.scale(\n vec3.create(),\n vec3.sub(vec3.create(), targetVelocity, velocity),\n 2 * time,\n ),\n );\n\n current = geodetic(\n vec3.add(\n vec3.create(),\n mercator(current),\n vec3.add(\n vec3.create(),\n vec3.scale(\n vec3.create(),\n vec3.add(vec3.create(), velocity, nextVelocity),\n 0.5 * time,\n ),\n vec3.scale(\n vec3.create(),\n vec3.sub(vec3.create(), mercator(target), mercator(current)),\n time,\n ),\n ),\n ),\n );\n\n velocity = nextVelocity;\n\n update?.(current, target);\n\n return current;\n });\n};\n\nexport const createOrientationTransition = (\n update?: (_: vec3, target: vec3) => void,\n) =>\n createTransition<vec3>(({ time, current, target }) => {\n current = toOrientation(\n quat.slerp(\n quat.create(),\n toQuaternion(current),\n toQuaternion(target),\n 2 * time,\n ),\n );\n if (quat.getAngle(toQuaternion(current), toQuaternion(target)) < epsilon)\n target = current;\n update?.(current, target);\n return current;\n });\n","import { quat, vec2, vec3 } from \"gl-matrix\";\n\nimport { circumference, mercator, toOrientation, toQuaternion } from \"./math\";\nimport type { View } from \"./model\";\nimport type { World } from \"./world\";\n\nconst k = 10;\n\nexport type ViewTransition = {\n view: Partial<View>;\n dispose: () => void;\n};\n\nexport const createViewTransition = (world: World) => {\n let running = true;\n let target: Partial<View> = {};\n let last: number | undefined;\n\n const frame = () => {\n if (!running) return;\n requestAnimationFrame(frame);\n\n const now = performance.now();\n const time = (now - (last ?? now)) / 1000;\n last = now;\n\n const epsilon = 1e-3;\n\n const view = { ...world.view };\n\n if (target.target) {\n if (!target.distance) target.distance = view.distance;\n const delta = vec3.sub(vec3.create(), target.target, view.target);\n const finished = vec3.length(delta) * circumference < 1e-3;\n view.target = finished\n ? target.target\n : vec3.scaleAndAdd(vec3.create(), view.target, delta, k * time);\n if (finished) target.target = undefined;\n }\n\n if (target.offset) {\n const delta = vec2.sub(vec2.create(), target.offset, view.offset);\n const finished = vec2.length(delta) < epsilon;\n view.offset = finished\n ? target.offset\n : vec2.scaleAndAdd(vec2.create(), view.offset, delta, k * time);\n if (finished) target.offset = undefined;\n }\n\n const flyDistance =\n target.target !== undefined\n ? vec3.distance(mercator(target.target), mercator(view.target)) *\n circumference\n : undefined;\n\n const goalDistance = Math.max(\n ...[flyDistance, target.distance ?? view.distance, 0].filter(\n (_): _ is number => _ !== undefined,\n ),\n );\n\n if (goalDistance) {\n const delta = goalDistance - view.distance;\n const finished = Math.abs(delta) / 10000 < epsilon;\n view.distance = finished\n ? goalDistance\n : view.distance + delta * k * time;\n if (finished) target.distance = undefined;\n }\n\n if (target.orientation) {\n const goalOrientation = toQuaternion(target.orientation);\n const viewOrientation = toQuaternion(view.orientation);\n const finished =\n quat.getAngle(goalOrientation, viewOrientation) < epsilon;\n const orientation = toOrientation(\n finished\n ? goalOrientation\n : quat.slerp(\n quat.create(),\n viewOrientation,\n goalOrientation,\n k * time,\n ),\n );\n view.orientation = orientation;\n if (finished) target.orientation = undefined;\n }\n\n if (target.fieldOfView !== undefined) {\n const delta = target.fieldOfView - view.fieldOfView;\n const finished = Math.abs(delta) < epsilon;\n const fieldOfView = finished\n ? target.fieldOfView\n : view.fieldOfView + delta * k * time;\n view.fieldOfView = fieldOfView;\n if (finished) target.fieldOfView = fieldOfView;\n }\n\n world.view = view;\n };\n\n requestAnimationFrame(frame);\n\n const dispose = () => {\n running = false;\n };\n\n return {\n set view(_: Partial<View>) {\n target = _;\n },\n get view() {\n return target;\n },\n dispose,\n } satisfies ViewTransition;\n};\n","import type { vec2 } from \"gl-matrix\";\n\nexport type DepthBuffer = {\n use: () => void;\n resize: (size: vec2) => void;\n read: (pixel: vec2) => readonly [z: number, n: number];\n dispose: () => void;\n};\n\nexport const createDepthBuffer = (gl: WebGL2RenderingContext) => {\n const targetTexture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, targetTexture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\n const renderbuffer = gl.createRenderbuffer();\n gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer);\n\n const framebuffer = gl.createFramebuffer();\n\n const use = () => gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n\n use();\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n targetTexture,\n 0,\n );\n gl.framebufferRenderbuffer(\n gl.FRAMEBUFFER,\n gl.DEPTH_ATTACHMENT,\n gl.RENDERBUFFER,\n renderbuffer,\n );\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\n let height = 0;\n const resize = ([width = 0, _height = 0]: vec2) => {\n height = _height;\n gl.bindTexture(gl.TEXTURE_2D, targetTexture);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n width,\n height,\n 0,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n null,\n );\n\n gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer);\n gl.renderbufferStorage(\n gl.RENDERBUFFER,\n gl.DEPTH_COMPONENT16,\n width,\n height,\n );\n };\n\n const buffer = new Uint8Array(4);\n const read = ([x = 0, y = 0]: vec2) => {\n use();\n gl.readPixels(x, height - y, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, buffer);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\n const [r = 0, g = 0, b = 0, a = 0] = buffer;\n const zo = (r * 256 + g) / (256 * 256 - 1);\n const z = 2 * zo - 1;\n const n = b * 256 + a;\n\n return [z, n] as const;\n };\n\n const dispose = () => {\n gl.deleteTexture(targetTexture);\n gl.deleteFramebuffer(framebuffer);\n gl.deleteRenderbuffer(renderbuffer);\n };\n\n return {\n use,\n resize,\n read,\n dispose,\n } satisfies DepthBuffer;\n};\n","import { mat4, vec2, vec3, vec4 } from \"gl-matrix\";\n\nimport { circumference, mercator, quadratic, radians } from \"./math\";\nimport type { View } from \"./model\";\n\nexport type Viewport = {\n camera: vec3;\n screen: vec2;\n projection: mat4;\n modelView: mat4;\n fieldScale: number;\n scale: (_: number) => Viewport;\n screenToClip: (_: vec2, out?: vec4) => vec4;\n clipToScreen: (_: vec4, out?: vec2) => vec2;\n clipToLocal: (_: vec4, out?: vec3) => vec3;\n localToClip: (_: vec3, out?: vec4) => vec4;\n localToWorld: (_: vec3, out?: vec3) => vec3;\n worldToLocal: (_: vec3, out?: vec3) => vec3;\n};\n\nconst matrix = mat4.create();\nconst vector = vec4.create();\n\nexport const createViewport: (view: View) => Viewport = view => {\n const { target, offset, screen, orientation, fieldOfView } = view;\n const [width = 0, height = 0] = screen;\n const [ox = 0, oy = 0] = offset;\n const [pitch = 0, roll = 0, yaw = 0] = orientation;\n const fieldScale =\n Math.tan(radians(45) / 2) / Math.tan(radians(fieldOfView) / 2);\n const z = (view.distance / circumference) * fieldScale;\n const near = z / 100;\n const far = z * 1000000;\n\n const projection = mat4.create();\n mat4.identity(projection);\n mat4.perspective(projection, radians(fieldOfView), width / height, near, far);\n mat4.scale(projection, projection, [1, -1, 1]);\n\n const modelView = mat4.create();\n mat4.identity(modelView);\n mat4.rotateX(modelView, modelView, pitch);\n mat4.rotateY(modelView, modelView, roll);\n mat4.rotateZ(modelView, modelView, yaw);\n\n const transform = mat4.multiply(matrix, projection, modelView);\n const inverse = mat4.invert(mat4.create(), transform);\n\n const scale = (scale: number) => {\n const screen: vec2 = [width * scale, height * scale];\n const offset: vec2 = [ox * scale, oy * scale];\n return createViewport({ ...view, offset, screen });\n };\n\n const screenToClip = (\n [screenX = 0, screenY = 0]: vec2,\n out = vec4.create(),\n ) => {\n const x = (2 * screenX) / width - 1;\n const y = -((2 * screenY) / height - 1);\n return vec4.set(out, x, y, 0, 1);\n };\n\n const clipToScreen = ([x = 0, y = 0, , w = 0]: vec4, out = vec2.create()) =>\n vec2.set(out, (1 + x / w) * width * 0.5, (1 - y / w) * height * 0.5);\n\n const clipToLocal = (v: vec4, out = vec3.create()) => {\n const [x = 0, y = 0, z = 0, w = 0] = vec4.transformMat4(vector, v, inverse);\n return vec3.set(out, x / w, y / w, z / w);\n };\n\n const localToClip = ([x = 0, y = 0, z = 0]: vec3, out = vec4.create()) =>\n vec4.transformMat4(out, vec4.set(out, x, y, z, 1), transform);\n\n const [cx = 0, cy = 0] = screenToClip([ox + width / 2, oy + height / 2]);\n const [ax = 0, ay = 0, az = 0] = clipToLocal([cx, cy, -1, 1]);\n const [bx = 0, by = 0, bz = 0] = clipToLocal([cx, cy, 1.00001, 1]);\n\n const [t1 = 0] = quadratic(\n (bx - ax) * (bx - ax) + (by - ay) * (by - ay) + (bz - az) * (bz - az),\n ax * (bx - ax) + ay * (by - ay) + az * (bz - az),\n ax * ax +\n ay * ay +\n az * az -\n ((view.distance * view.distance) / circumference / circumference) *\n fieldScale *\n fieldScale,\n );\n\n if (isNaN(t1)) throw new Error(\"Unexpected\");\n\n const local: vec3 = [\n ax + t1 * (bx - ax),\n ay + t1 * (by - ay),\n az + t1 * (bz - az),\n ];\n\n const camera = vec3.sub(vec3.create(), mercator(target), local);\n\n const localToWorld = (v: vec3, out = vec3.create()) =>\n vec3.add(out, v, camera);\n\n const worldToLocal = (v: vec3, out = vec3.create()) =>\n vec3.sub(out, v, camera);\n\n return {\n camera,\n screen,\n projection,\n modelView,\n fieldScale,\n scale,\n screenToClip,\n clipToScreen,\n clipToLocal,\n localToClip,\n localToWorld,\n worldToLocal,\n };\n};\n","import type { vec2 } from \"gl-matrix\";\nimport { glMatrix, vec3 } from \"gl-matrix\";\n\nimport { createDepthBuffer } from \"./depth-buffer\";\nimport type { Layer } from \"./layers\";\nimport { circumference, geodetic, mercator } from \"./math\";\nimport type { View } from \"./model\";\nimport { createViewport } from \"./viewport\";\n\nglMatrix.setMatrixArrayType(Array); // Required for precision\n\ntype Pick = {\n screen: vec2;\n position: vec3;\n layer: Layer | undefined;\n};\n\nexport type World = {\n readonly canvas: HTMLCanvasElement;\n readonly gl: WebGL2RenderingContext;\n set view(_: View);\n get view(): View;\n add: (layer: Layer) => void;\n remove: (layer: Layer) => void;\n project: (_: vec3) => vec2;\n unproject: (_: vec2) => vec3;\n recenter: ([x, y]: vec2) => void;\n pick: ([x, y]: vec2, layer?: Layer) => Pick;\n dispose: () => void;\n};\n\nexport const createWorld = (canvas: HTMLCanvasElement) => {\n let running = true;\n let view: View = {\n target: [0, 0, 0],\n screen: [0, 0],\n offset: [0, 0],\n distance: circumference,\n orientation: [0, 0, 0],\n fieldOfView: 45,\n };\n\n const gl = canvas.getContext(\"webgl2\", {\n antialias: true,\n });\n if (!gl) throw new Error(\"No WebGL2\");\n\n gl.enable(gl.CULL_FACE);\n gl.cullFace(gl.FRONT);\n\n let layers: Layer[] = [];\n\n const depthBuffer = createDepthBuffer(gl);\n\n const resize = (screen: vec2) => {\n let [width = 0, height = 0] = screen;\n width = width || 1;\n height = height || 1;\n view.screen = [width, height];\n canvas.width = width * devicePixelRatio;\n canvas.height = height * devicePixelRatio;\n depthBuffer.resize([canvas.width, canvas.height]);\n };\n\n resize([canvas.clientWidth, canvas.clientHeight]);\n\n const resizer = new ResizeObserver(([entry]) => {\n if (!entry) return;\n const { contentRect } = entry;\n const { width, height } = contentRect;\n resize([width, height]);\n });\n resizer.observe(canvas);\n\n const clear = ([width = 0, height = 0]: vec2) => {\n gl.viewport(0, 0, width * devicePixelRatio, height * devicePixelRatio);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n };\n\n const render = () => {\n const viewport = createViewport(view);\n clear(viewport.screen);\n\n layers.forEach(_ => _.render({ viewport }));\n };\n\n const depth = (layer?: Layer) => {\n const viewport = createViewport(view);\n clear(viewport.screen);\n (layer ? [layer] : layers).forEach((_, i) =>\n _.render({ viewport, depth: true, index: i + 1 }),\n );\n };\n\n const frame = () => {\n if (!running) return;\n render();\n requestAnimationFrame(frame);\n };\n\n requestAnimationFrame(frame);\n\n const project = (_: vec3) => {\n const { worldToLocal, localToClip, clipToScreen } = createViewport(view);\n return clipToScreen(localToClip(worldToLocal(mercator(_))));\n };\n\n const unproject = (_: vec2) => {\n const { localToWorld, clipToLocal, screenToClip } = createViewport(view);\n return geodetic(localToWorld(clipToLocal(screenToClip(_))));\n };\n\n const pick = (screen: vec2, pickLayer?: Layer) => {\n const [screenX = 0, screenY = 0] = screen;\n const { screenToClip, clipToLocal, localToWorld } = createViewport(view);\n\n depthBuffer.use();\n\n depth(pickLayer);\n\n const [z, index] = depthBuffer.read([\n screenX * devicePixelRatio,\n screenY * devicePixelRatio,\n ]);\n\n const [x = 0, y = 0] = screenToClip([screenX, screenY]);\n const position = geodetic(localToWorld(clipToLocal([x, y, z, 1])));\n\n const layer = index === 0 ? undefined : pickLayer ?? layers[index - 1];\n\n return { screen, position, layer };\n };\n\n const recenter = ([cx = 0, cy = 0]: vec2) => {\n const { camera, fieldScale } = createViewport(view);\n const { position: target, layer } = pick([cx, cy]);\n if (!layer) return;\n const distance =\n (vec3.distance(mercator(target), camera) * circumference) / fieldScale;\n const [width = 0, height = 0] = view.screen;\n const offset: vec2 = [cx - width / 2, cy - height / 2];\n view = {\n ...view,\n offset,\n target,\n distance,\n };\n };\n\n const add = (layer: Layer) => {\n layers = [...layers, layer];\n };\n\n const remove = (layer: Layer) => {\n layers = layers.filter(_ => _ !== layer);\n };\n\n const dispose = () => {\n running = false;\n resizer.unobserve(canvas);\n layers.forEach(_ => _.dispose());\n depthBuffer.dispose();\n };\n\n return {\n canvas,\n gl,\n get view() {\n return view;\n },\n set view(_: View) {\n view = _;\n },\n add,\n remove,\n project,\n unproject,\n recenter,\n pick,\n dispose,\n } satisfies World;\n};\n"],"names":["debounce","f","delay","timeout","args","range","start","end","_","k","EPSILON","ARRAY_TYPE","setMatrixArrayType","type","y","i","create","out","glMatrix.ARRAY_TYPE","identity","invert","a","a00","a01","a02","a03","a10","a11","a12","a13","a20","a21","a22","a23","a30","a31","a32","a33","b00","b01","b02","b03","b04","b05","b06","b07","b08","b09","b10","b11","det","multiply","b","b0","b1","b2","b3","scale","v","x","z","rotateX","rad","s","c","rotateY","rotateZ","fromQuat","q","w","x2","y2","z2","xx","yx","yy","zx","zy","zz","wx","wy","wz","perspectiveNO","fovy","aspect","near","far","nf","perspective","length","fromValues","set","add","subtract","scaleAndAdd","distance","normalize","len","dot","cross","ax","ay","az","bx","by","bz","sub","vec","stride","offset","count","fn","arg","l","transformMat4","m","setAxisAngle","axis","getAngle","dotproduct","slerp","t","aw","bw","omega","cosom","sinom","scale0","scale1","glMatrix.EPSILON","fromMat3","fTrace","fRoot","j","vec4.dot","vec4.normalize","tmpvec3","vec3.create","xUnitVec3","vec3.fromValues","yUnitVec3","vec3.dot","vec3.cross","vec3.len","vec3.normalize","temp1","temp2","d","matr","mat3.create","view","right","up","squaredDistance","circumference","radians","degrees","quadratic","mercator","lng","lat","alt","vec3.set","geodetic","tileToMercator","toQuaternion","pitch","yaw","roll","cy","sy","cp","sp","cr","sr","toOrientation","minimumDistance","createMouseControl","canvas","world","enabled","draggable","rotatable","zooming","recentered","onMouseDown","onMouseMove","buttons","movementX","movementY","width","height","orientation","clearZooming","onWheel","deltaY","onContextMenu","event","createBuffer","gl","target","buffer","glTarget","use","value","createProgram","vertexSource","fragmentSource","program","vertexShader","compileShader","fragmentShader","uniform","name","location","cached","uniform1f","uniform1i","uniform2f","uniform2i","uniform3f","uniform3i","uniform4f","uniform4i","uniformMatrix4f","attribute","size","options","shader","source","one","to","configure","_depth","pickable","depth","polygonOffset","depth_default","worker","createImageLoadWorker","createImageLoad","url","onLoad","loaded","handler","data","canceled","cancel","createTexture","texture","createImageTexture","imageLoad","image","attach","fragment_default","vertex_default","createBillboardLayer","billboard","position","color","minSizePixels","maxSizePixels","imageSize","cornerBuffer","uvBuffer","indexBuffer","update","renderProgram","depthProgram","createPrograms","layer","projection","modelView","camera","screen","index","createRenderProgram","depthSource","cornerAttribute","uvAttribute","projectionUniform","modelViewUniform","cameraUniform","screenUniform","imageUniform","imageSizeUniform","positionUniform","colorUniform","indexUniform","sizeUniform","minSizePixelsUniform","maxSizePixelsUniform","execute","dispose","createLineLayer","line","points","minWidthPixels","maxWidthPixels","positionBuffer","render","updatePoints","positionData","first","last","indexData","indices","cornerData","FLOAT_BYTES","INT_BYTES","previousAttribute","currentAttribute","nextAttribute","widthUniform","maxWidthPixelsUniform","minWidthPixelsUniform","createMeshLayer","mesh","vertices","vertexBuffer","mat4.fromQuat","mat4.create","updateVertices","updateIndices","vertexAttribute","orientationUniform","L","F","J","G","U","K","Q","W","O","P","R","C","M","Z","A","N","h","E","D","T","V","$","I","H","Y","S","u","g","o","B","X","createPolygonLayer","polygon","earclip","positionAttribute","createTileDownsampler","cache","initialDownsample","downsample","xyz","perf","warned","PROCESS","emitWarning","msg","code","AC","AS","warnACPolyfill","reason","printACPolyfillWarning","shouldWarn","isPosInt","n","getUintArray","max","ZeroArray","Stack","#constructing","HeapCls","LRUCache","#max","#maxSize","#dispose","#disposeAfter","#fetchMethod","#size","#calculatedSize","#keyMap","#keyList","#valList","#next","#prev","#head","#tail","#free","#disposed","#sizes","#starts","#ttls","#hasDispose","#hasFetchMethod","#hasDisposeAfter","p","#isBackgroundFetch","context","#backgroundFetch","#moveToTail","#indexes","#rindexes","#isStale","ttl","ttlResolution","ttlAutopurge","updateAgeOnGet","updateAgeOnHas","allowStale","disposeAfter","noDisposeOnSet","noUpdateTTL","maxSize","maxEntrySize","sizeCalculation","fetchMethod","noDeleteOnFetchRejection","noDeleteOnStaleGet","allowStaleOnFetchRejection","allowStaleOnFetchAbort","ignoreFetchAbort","UintArray","#initializeSizeTracking","#initializeTTLTracking","key","ttls","starts","#setItemTTL","#updateItemAge","#statusTTL","status","cachedNow","getNow","age","sizes","#removeItemSize","#requireSize","#addItemSize","#evict","_i","_s","_st","_k","_v","#isValidIndex","getOptions","thisp","deleted","entry","remain","arr","setOptions","oldVal","oldValue","dt","task","val","free","head","hasOptions","peekOptions","ac","signal","fetchOpts","cb","updateCache","aborted","ignoreAbort","fetchFail","bf","eb","er","allowStaleAborted","noDelete","pcall","res","rej","fmp","fetchOptions","forceRefresh","stale","isStale","staleVal","fetching","#connect","pi","ni","createTileIndexCache","fromKey","toKey","defaultZ","createElevation","terrainCache","tileCache","downsampler","framebuffer","downsampleBuffer","tile","px","py","downsampled","k2","r","createTileCache","urlPattern","tiles","loading","get","interval","createTileShapes","elevation","corners","result","elevationZ","maxZ","skirt","uvw","createTerrainLayer","terrain","terrainUrl","imageryUrl","imageryCache","imageryDownsampler","updateImageryUrl","extension","terrainDownsampler","tileShapes","vec3s","vec4s","vec4.create","vec2s","vec2.create","calculateVisibleTiles","viewport","worldToLocal","localToClip","clipToScreen","divide","shape","split","insideTileShape","clip","clipped","screenSize","visible","downsampledImagery","downsampledTerrain","downsampleTerrain","imagery","downsampleImagery","uvwBuffer","uvwAttribute","imageryUniform","terrainUniform","downsampleImageryUniform","downsampleTerrainUniform","xyzUniform","minX","maxX","minY","maxY","vec2.squaredDistance","epsilon","createTransition","step","running","current","frame","now","time","createNumberTransition","createColorTransition","vec4.add","vec4.scale","vec4.sub","vec4.distance","createPositionTransition","vec3.add","vec3.scale","vec3.sub","vec3.distance","createPositionVelocityTransition","velocity","targetVelocity","lastTime","nextVelocity","createOrientationTransition","quat.slerp","quat.create","quat.getAngle","createViewTransition","delta","finished","vec3.length","vec3.scaleAndAdd","vec2.sub","vec2.length","vec2.scaleAndAdd","flyDistance","goalDistance","goalOrientation","viewOrientation","fieldOfView","createDepthBuffer","targetTexture","renderbuffer","resize","_height","matrix","vector","createViewport","ox","oy","fieldScale","mat4.identity","mat4.perspective","mat4.scale","mat4.rotateX","mat4.rotateY","mat4.rotateZ","transform","mat4.multiply","inverse","mat4.invert","screenToClip","screenX","screenY","vec4.set","vec2.set","clipToLocal","vec4.transformMat4","cx","t1","local","glMatrix.setMatrixArrayType","createWorld","layers","depthBuffer","resizer","contentRect","clear","project","unproject","localToWorld","pick","pickLayer"],"mappings":"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","x_google_ignoreList":[1,2,3,4,5,6,7,26,27,32]}