@jdultra/threedtiles 13.0.20 → 13.0.21

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.
@@ -1 +1 @@
1
- {"version":3,"file":"threedtiles.cjs.js","sources":["../src/geometry/obb.js","../src/utils/LinkedHashMap.js","../src/decoder/FeatureTable.js","../node_modules/three/examples/jsm/utils/BufferGeometryUtils.js","../src/decoder/B3DMDecoder.js","../node_modules/uuid/dist/esm-browser/rng.js","../node_modules/uuid/dist/esm-browser/regex.js","../node_modules/uuid/dist/esm-browser/stringify.js","../node_modules/uuid/dist/esm-browser/validate.js","../node_modules/uuid/dist/esm-browser/v4.js","../src/decoder/SplatsDecoder.js","../node_modules/three/examples/jsm/loaders/GLTFLoader.js","../node_modules/three/examples/jsm/loaders/DRACOLoader.js","../node_modules/three/examples/jsm/utils/WorkerPool.js","../node_modules/three/examples/jsm/libs/ktx-parse.module.js","../node_modules/three/examples/jsm/libs/zstddec.module.js","../node_modules/three/examples/jsm/loaders/KTX2Loader.js","../node_modules/three/examples/jsm/math/ColorSpaces.js","../src/tileset/implicit/SubtreeDecoder.js","../src/tileset/implicit/ImplicitTileResolver.js","../node_modules/meshoptimizer/meshopt_encoder.module.js","../node_modules/meshoptimizer/meshopt_decoder.module.js","../node_modules/meshoptimizer/meshopt_simplifier.module.js","../src/tileset/TileLoader.js","../node_modules/path-browserify/index.js","../node_modules/data-structure-typed/dist/mjs/constants/index.js","../node_modules/data-structure-typed/dist/mjs/data-structures/base/iterable-element-base.js","../node_modules/data-structure-typed/dist/mjs/data-structures/heap/heap.js","../node_modules/data-structure-typed/dist/mjs/data-structures/priority-queue/priority-queue.js","../node_modules/data-structure-typed/dist/mjs/data-structures/priority-queue/min-priority-queue.js","../src/splats/SplatsColider.js","../src/splats/SplatsMesh.js","../src/tileset/OGC3DTile.js","../src/tileset/instanced/InstancedTile.js","../src/tileset/instanced/InstancedOGC3DTile.js","../src/tileset/instanced/MeshTile.js","../src/tileset/instanced/JsonTile.js","../src/tileset/instanced/InstancedTileLoader.js","../src/tileset/OcclusionCullingService.js"],"sourcesContent":["\r\n\r\nimport { Matrix3, Matrix4, Ray, Sphere, Vector3, Box3, BufferGeometry, LineSegments, LineBasicMaterial } from \"three\";\r\nimport { OBB as threeOBB } from 'three/addons/math/OBB.js';\r\n\r\nconst tempMatrix = new Matrix3();\r\nconst tempVector3 = new Vector3();\r\nconst size = new Vector3();\r\nconst aabb = new Box3();\r\nconst matrix = new Matrix4();\r\nconst inverse = new Matrix4();\r\nconst localRay = new Ray();\r\n\r\nclass OBB {\r\n constructor(values) {\r\n this.center = new Vector3(values[0], values[1], values[2]);\r\n this.e1 = new Vector3(values[3], values[4], values[5]);\r\n this.e2 = new Vector3(values[6], values[7], values[8]);\r\n this.e3 = new Vector3(values[9], values[10], values[11]);\r\n\r\n this.halfSize = new Vector3(this.e1.length(), this.e2.length(), this.e3.length());\r\n\r\n\r\n this.e1.normalize();\r\n this.e2.normalize();\r\n this.e3.normalize();\r\n\r\n this.rotationMatrix = new Matrix3();\r\n this.rotationMatrix.set(\r\n this.e1.x, this.e2.x, this.e3.x,\r\n this.e1.y, this.e2.y, this.e3.y,\r\n this.e1.z, this.e2.z, this.e3.z);\r\n }\r\n\r\n copy(aObb) {\r\n this.center.copy(aObb.center);\r\n this.rotationMatrix.copy(aObb.rotationMatrix);\r\n this.halfSize.copy(aObb.halfSize);\r\n this.e1.copy(aObb.e1);\r\n this.e2.copy(aObb.e2);\r\n this.e3.copy(aObb.e3);\r\n }\r\n\r\n getSize(result) {\r\n\r\n return result.copy(this.halfSize).multiplyScalar(2);\r\n\r\n }\r\n\r\n applyMatrix4(matrix) {\r\n const e = matrix.elements;\r\n\r\n let sx = tempVector3.set(e[0], e[1], e[2]).length();\r\n const sy = tempVector3.set(e[4], e[5], e[6]).length();\r\n const sz = tempVector3.set(e[8], e[9], e[10]).length();\r\n\r\n const det = matrix.determinant();\r\n if (det < 0) sx = - sx;\r\n\r\n tempMatrix.setFromMatrix4(matrix);\r\n\r\n const invSX = 1 / sx;\r\n const invSY = 1 / sy;\r\n const invSZ = 1 / sz;\r\n\r\n tempMatrix.elements[0] *= invSX;\r\n tempMatrix.elements[1] *= invSX;\r\n tempMatrix.elements[2] *= invSX;\r\n\r\n tempMatrix.elements[3] *= invSY;\r\n tempMatrix.elements[4] *= invSY;\r\n tempMatrix.elements[5] *= invSY;\r\n\r\n tempMatrix.elements[6] *= invSZ;\r\n tempMatrix.elements[7] *= invSZ;\r\n tempMatrix.elements[8] *= invSZ;\r\n\r\n this.rotationMatrix.multiply(tempMatrix);\r\n\r\n this.halfSize.x *= sx;\r\n this.halfSize.y *= sy;\r\n this.halfSize.z *= sz;\r\n\r\n tempVector3.setFromMatrixPosition(matrix);\r\n this.center.applyMatrix4(matrix);\r\n //console.log(this.e1);\r\n this.rotationMatrix.extractBasis(this.e1, this.e2, this.e3);\r\n //console.log(this.e1)\r\n return this;\r\n\r\n }\r\n\r\n intersectRay(ray, result) {\r\n\r\n // the idea is to perform the intersection test in the local space\r\n // of the OBB.\r\n\r\n this.getSize(size);\r\n aabb.setFromCenterAndSize(tempVector3.set(0, 0, 0), size);\r\n\r\n // create a 4x4 transformation matrix\r\n\r\n matrix.setFromMatrix3(this.rotationMatrix);\r\n matrix.setPosition(this.center);\r\n\r\n // transform ray to the local space of the OBB\r\n\r\n inverse.copy(matrix).invert();\r\n localRay.copy(ray).applyMatrix4(inverse);\r\n\r\n // perform ray <-> AABB intersection test\r\n\r\n if (localRay.intersectBox(aabb, result)) {\r\n\r\n // transform the intersection point back to world space\r\n\r\n return result.applyMatrix4(matrix);\r\n\r\n } else {\r\n\r\n return null;\r\n\r\n }\r\n\r\n }\r\n\r\n intersectsRay(ray) {\r\n\r\n return this.intersectRay(ray, tempVector3) !== null;\r\n\r\n }\r\n\r\n insidePlane(plane) {\r\n // compute the projection interval radius of this OBB onto L(t) = this->center + t * p.normal;\r\n\r\n plane.normal.normalize();\r\n const r = this.halfSize.x * Math.abs(plane.normal.dot(this.e1)) +\r\n this.halfSize.y * Math.abs(plane.normal.dot(this.e2)) +\r\n this.halfSize.z * Math.abs(plane.normal.dot(this.e3));\r\n\r\n // compute distance of the OBB's center from the plane\r\n\r\n const d = plane.distanceToPoint(this.center);\r\n\r\n // Intersection occurs when distance d falls within [-r,+r] interval\r\n\r\n return d > -r;\r\n\r\n }\r\n\r\n inFrustum(frustum) {\r\n\r\n //this.rotationMatrix.extractBasis(this.e1, this.e2, this.e3);\r\n\r\n for (let i = 0; i < 6; i++) {\r\n const plane = frustum.planes[i];\r\n const planeIntersection = this.insidePlane(plane);\r\n\r\n if (!planeIntersection) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n distanceToPoint(point) {\r\n\r\n tempVector3.copy(point);\r\n tempVector3.sub(this.center);\r\n tempVector3.applyMatrix3(this.rotationMatrix);\r\n\r\n //// point to bounds \r\n let dx = Math.max(0, Math.max(-this.halfSize.x - tempVector3.x, tempVector3.x - this.halfSize.x));\r\n let dy = Math.max(0, Math.max(-this.halfSize.y - tempVector3.y, tempVector3.y - this.halfSize.y));\r\n let dz = Math.max(0, Math.max(-this.halfSize.z - tempVector3.z, tempVector3.z - this.halfSize.z));\r\n return Math.sqrt(dx * dx + dy * dy + dz * dz);\r\n }\r\n\r\n helper() {\r\n const hs = this.halfSize;\r\n const c = this.center;\r\n const e1 = this.e1;\r\n const e2 = this.e2;\r\n const e3 = this.e3;\r\n \r\n // Calculate all 8 corners\r\n const corners = [\r\n new Vector3().copy(c)\r\n .add(e1.clone().multiplyScalar(hs.x))\r\n .add(e2.clone().multiplyScalar(hs.y))\r\n .add(e3.clone().multiplyScalar(hs.z)),\r\n new Vector3().copy(c)\r\n .add(e1.clone().multiplyScalar(-hs.x))\r\n .add(e2.clone().multiplyScalar(hs.y))\r\n .add(e3.clone().multiplyScalar(hs.z)),\r\n new Vector3().copy(c)\r\n .add(e1.clone().multiplyScalar(-hs.x))\r\n .add(e2.clone().multiplyScalar(-hs.y))\r\n .add(e3.clone().multiplyScalar(hs.z)),\r\n new Vector3().copy(c)\r\n .add(e1.clone().multiplyScalar(hs.x))\r\n .add(e2.clone().multiplyScalar(-hs.y))\r\n .add(e3.clone().multiplyScalar(hs.z)),\r\n new Vector3().copy(c)\r\n .add(e1.clone().multiplyScalar(hs.x))\r\n .add(e2.clone().multiplyScalar(hs.y))\r\n .add(e3.clone().multiplyScalar(-hs.z)),\r\n new Vector3().copy(c)\r\n .add(e1.clone().multiplyScalar(-hs.x))\r\n .add(e2.clone().multiplyScalar(hs.y))\r\n .add(e3.clone().multiplyScalar(-hs.z)),\r\n new Vector3().copy(c)\r\n .add(e1.clone().multiplyScalar(-hs.x))\r\n .add(e2.clone().multiplyScalar(-hs.y))\r\n .add(e3.clone().multiplyScalar(-hs.z)),\r\n new Vector3().copy(c)\r\n .add(e1.clone().multiplyScalar(hs.x))\r\n .add(e2.clone().multiplyScalar(-hs.y))\r\n .add(e3.clone().multiplyScalar(-hs.z)),\r\n ];\r\n \r\n // Define the edges by connecting the corners\r\n const edges = [\r\n 0, 1, 1, 2, 2, 3, 3, 0, // Top face\r\n 4, 5, 5, 6, 6, 7, 7, 4, // Bottom face\r\n 0, 4, 1, 5, 2, 6, 3, 7 // Side edges\r\n ];\r\n \r\n // Create geometry and add line segments\r\n const geometry = new BufferGeometry().setFromPoints(corners);\r\n geometry.setIndex(edges);\r\n geometry.computeBoundingSphere();\r\n \r\n // Create line material\r\n const material = new LineBasicMaterial({ color: 0xff0000 });\r\n \r\n // Create the wireframe mesh\r\n const wireframe = new LineSegments(geometry, material);\r\n \r\n wireframe.dispose = ()=>{\r\n material.dispose();\r\n geometry.dispose();\r\n }\r\n return wireframe;\r\n }\r\n\r\n}\r\n\r\nexport { OBB };","/**\r\n * @copyright 2021 Aaron Zhao <yujianzhao2013@gmail.com>\r\n * @license MIT\r\n * Linked hash map data structure\r\n * @class LinkedHashMap\r\n */\r\nclass LinkedHashMap {\r\n /**\r\n * Creates a linked hash map instance\r\n * @public\r\n */\r\n constructor() {\r\n this._data = new Map();\r\n this._link = new Map();\r\n this._head = undefined;\r\n this._tail = undefined;\r\n }\r\n\r\n /**\r\n * Add or update an item to the list\r\n * @public\r\n * @param {any} key\r\n * @param {any} item\r\n * @param {boolean} head add to the head if true; tail otherwise\r\n */\r\n put(key, item, head = false) {\r\n if (this.has(key)) {\r\n this._data.set(key, item);\r\n return;\r\n }\r\n this._data.set(key, item);\r\n this._link.set(key, {\r\n previous: undefined,\r\n next: undefined\r\n });\r\n if (this._head == null) {\r\n this._head = key;\r\n this._tail = key;\r\n } else if (head) {\r\n this._link.get(this._head).previous = key;\r\n this._link.get(key).next = this._head;\r\n this._head = key;\r\n } else {\r\n this._link.get(this._tail).next = key;\r\n this._link.get(key).previous = this._tail;\r\n this._tail = key;\r\n }\r\n }\r\n\r\n /**\r\n * Returns the head key and item\r\n * @public\r\n * @returns {any} key, item, next(), previous()\r\n */\r\n head() {\r\n return ({\r\n key: this._head, value: this.get(this._head), next: () => this.next(this._head), previous: () => null\r\n });\r\n }\r\n\r\n /**\r\n * Returns the tail key and item\r\n * @public\r\n * @returns {any} key, item, next(), previous()\r\n */\r\n tail() {\r\n return ({\r\n key: this._tail, value: this.get(this._tail), next: () => null, previous: () => this.previous(this._tail)\r\n });\r\n }\r\n\r\n /**\r\n * Returns an item from the map by key\r\n * @public\r\n * @param {any} key\r\n * @returns {any} item\r\n */\r\n get(key) {\r\n return this._data.get(key);\r\n }\r\n\r\n /**\r\n * Returns previous key item of the key\r\n * @public\r\n * @param {any} key\r\n * @returns {any} key\r\n */\r\n previousKey(key) {\r\n const link = this._link.get(key);\r\n return link != null ? link.previous : undefined;\r\n }\r\n\r\n /**\r\n * Returns previous item of the key\r\n * @public\r\n * @param {any} key\r\n * @returns {any} item\r\n */\r\n previousValue(key) {\r\n return this.get(this.previousKey(key));\r\n }\r\n\r\n /**\r\n * Returns previous key, item of the key\r\n * @public\r\n * @param {any} key\r\n * @returns {any} key, item, next(), previous()\r\n */\r\n previous(key) {\r\n const prevKey = this.previousKey(key);\r\n return ({\r\n key: prevKey,\r\n value: this.get(prevKey),\r\n next: () => this.next(prevKey),\r\n previous: () => this.previous(prevKey)\r\n });\r\n }\r\n\r\n /**\r\n * Returns next key of the key\r\n * @public\r\n * @param {any} key\r\n * @returns {any} key\r\n */\r\n nextKey(key) {\r\n const link = this._link.get(key);\r\n return link != null ? link.next : undefined;\r\n }\r\n\r\n /**\r\n * Returns next item of the key\r\n * @public\r\n * @param {any} key\r\n * @returns {any} item\r\n */\r\n nextValue(key) {\r\n return this.get(this.nextKey(key));\r\n }\r\n\r\n /**\r\n * Returns next key, item of the key\r\n * @public\r\n * @param {any} key\r\n * @returns {any} key, item, next(), previous()\r\n */\r\n next(key) {\r\n const nextKey = this.nextKey(key);\r\n return ({\r\n key: nextKey,\r\n value: this.get(nextKey),\r\n next: () => this.next(nextKey),\r\n previous: () => this.previous(nextKey)\r\n });\r\n }\r\n\r\n /**\r\n * Removes and returns an item from the map\r\n * @public\r\n * @param {any} key\r\n * @returns {any} item\r\n */\r\n remove(key) {\r\n const item = this._data.get(key);\r\n if (item != null) {\r\n if (this.size() === 1) {\r\n this.reset();\r\n } else {\r\n if (key === this._head) {\r\n const headLink = this._link.get(this._head);\r\n this._link.get(headLink.next).previous = null;\r\n this._head = headLink.next;\r\n } else if (key === this._tail) {\r\n const tailLink = this._link.get(this._tail);\r\n this._link.get(tailLink.previous).next = null;\r\n this._tail = tailLink.previous;\r\n } else {\r\n const cur = this._link.get(key);\r\n const prev = this._link.get(cur.previous);\r\n const nex = this._link.get(cur.next);\r\n prev.next = cur.next;\r\n nex.previous = cur.previous;\r\n }\r\n this._link.delete(key);\r\n this._data.delete(key);\r\n }\r\n }\r\n return item;\r\n }\r\n\r\n /**\r\n * Return if the key exists in the map\r\n * @public\r\n * @param {any} key;\r\n * @returns {boolean}\r\n */\r\n has(key) {\r\n return this._data.has(key);\r\n }\r\n\r\n /**\r\n * Returns the size of the map\r\n * @public\r\n * @returns {number}\r\n */\r\n size() {\r\n return this._data.size;\r\n }\r\n\r\n /**\r\n * Empties the map\r\n * @public\r\n */\r\n reset() {\r\n this._data.clear();\r\n this._link.clear();\r\n this._head = undefined;\r\n this._tail = undefined;\r\n }\r\n\r\n /**\r\n * Returns an iterator of keys\r\n * @public\r\n * @returns {Iterator[key]}\r\n */\r\n keys() {\r\n return this._data.keys();\r\n }\r\n\r\n /**\r\n * Returns an iterator of values\r\n * @public\r\n * @returns {Iterator[value]}\r\n */\r\n values() {\r\n return this._data.values();\r\n }\r\n\r\n /**\r\n * Returns an iterator of keys and values\r\n * @public\r\n * @returns {Iterator[key, value]}\r\n */\r\n entries() {\r\n return this._data.entries();\r\n }\r\n\r\n /**\r\n * Returns array representation of the map values\r\n * @public\r\n * @param {'orderByInsert' | 'orderByLink'} order return by inserting order (default) or link order\r\n * @returns {Array<{key: any, value: any}>}\r\n */\r\n toArray(order = 'orderByInsert') {\r\n if (order !== 'orderByInsert') {\r\n const linkOrderArr = [];\r\n let next = this._head;\r\n while (next != null) {\r\n linkOrderArr.push({ key: next, value: this.get(next) });\r\n next = this.nextKey(next);\r\n }\r\n return linkOrderArr;\r\n }\r\n return Array.from(this.keys()).map((k) => ({ key: k, value: this.get(k) }));\r\n }\r\n}\r\n\r\nexport { LinkedHashMap };\r\n","//\r\n// This class is taken straight from NASA-AMMOS library.\r\n// https://github.com/NASA-AMMOS/3DTilesRendererJS/blob/master/src/utilities/FeatureTable.js\r\n//\r\n\r\nconst utf8decoder = new TextDecoder();\r\nexport class FeatureTable {\r\n\r\n constructor(buffer, start, headerLength, binLength) {\r\n\r\n this.buffer = buffer;\r\n this.binOffset = start + headerLength;\r\n this.binLength = binLength;\r\n\r\n let header = null;\r\n if (headerLength !== 0) {\r\n\r\n try {\r\n const headerData = new Uint8Array(buffer, start, headerLength);\r\n header = JSON.parse(utf8decoder.decode(headerData));\r\n } catch (e) {\r\n header = {};\r\n }\r\n\r\n } else {\r\n\r\n header = {};\r\n\r\n }\r\n this.header = header;\r\n\r\n }\r\n\r\n getKeys() {\r\n\r\n return Object.keys(this.header);\r\n\r\n }\r\n\r\n getData(key, count, defaultComponentType = null, defaultType = null) {\r\n\r\n const header = this.header;\r\n\r\n if (!(key in header)) {\r\n\r\n return null;\r\n\r\n }\r\n\r\n const feature = header[key];\r\n if (!(feature instanceof Object)) {\r\n\r\n return feature;\r\n\r\n } else if (Array.isArray(feature)) {\r\n\r\n return feature;\r\n\r\n } else {\r\n\r\n const { buffer, binOffset, binLength } = this;\r\n const byteOffset = feature.byteOffset || 0;\r\n const featureType = feature.type || defaultType;\r\n const featureComponentType = feature.componentType || defaultComponentType;\r\n\r\n if ('type' in feature && defaultType && feature.type !== defaultType) {\r\n\r\n throw new Error('FeatureTable: Specified type does not match expected type.');\r\n\r\n }\r\n\r\n let stride;\r\n switch (featureType) {\r\n\r\n case 'SCALAR':\r\n stride = 1;\r\n break;\r\n\r\n case 'VEC2':\r\n stride = 2;\r\n break;\r\n\r\n case 'VEC3':\r\n stride = 3;\r\n break;\r\n\r\n case 'VEC4':\r\n stride = 4;\r\n break;\r\n\r\n default:\r\n throw new Error(`FeatureTable : Feature type not provided for \"${key}\".`);\r\n\r\n }\r\n\r\n let data;\r\n const arrayStart = binOffset + byteOffset;\r\n const arrayLength = count * stride;\r\n\r\n switch (featureComponentType) {\r\n\r\n case 'BYTE':\r\n data = new Int8Array(buffer, arrayStart, arrayLength);\r\n break;\r\n\r\n case 'UNSIGNED_BYTE':\r\n data = new Uint8Array(buffer, arrayStart, arrayLength);\r\n break;\r\n\r\n case 'SHORT':\r\n data = new Int16Array(buffer, arrayStart, arrayLength);\r\n break;\r\n\r\n case 'UNSIGNED_SHORT':\r\n data = new Uint16Array(buffer, arrayStart, arrayLength);\r\n break;\r\n\r\n case 'INT':\r\n data = new Int32Array(buffer, arrayStart, arrayLength);\r\n break;\r\n\r\n case 'UNSIGNED_INT':\r\n data = new Uint32Array(buffer, arrayStart, arrayLength);\r\n break;\r\n\r\n case 'FLOAT':\r\n data = new Float32Array(buffer, arrayStart, arrayLength);\r\n break;\r\n\r\n case 'DOUBLE':\r\n data = new Float64Array(buffer, arrayStart, arrayLength);\r\n break;\r\n\r\n default:\r\n throw new Error(`FeatureTable : Feature component type not provided for \"${key}\".`);\r\n\r\n }\r\n\r\n const dataEnd = arrayStart + arrayLength * data.BYTES_PER_ELEMENT;\r\n if (dataEnd > binOffset + binLength) {\r\n\r\n throw new Error('FeatureTable: Feature data read outside binary body length.');\r\n\r\n }\r\n\r\n return data;\r\n\r\n }\r\n\r\n }\r\n\r\n}\r\n\r\nexport class BatchTable extends FeatureTable {\r\n\r\n constructor(buffer, batchSize, start, headerLength, binLength) {\r\n\r\n super(buffer, start, headerLength, binLength);\r\n this.batchSize = batchSize;\r\n\r\n }\r\n\r\n getData(key, componentType = null, type = null) {\r\n\r\n return super.getData(key, this.batchSize, componentType, type);\r\n\r\n }\r\n\r\n}\r\n","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tInstancedBufferAttribute,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tTrianglesDrawMode,\n\tVector3,\n} from 'three';\n\nfunction computeMikkTSpaceTangents( geometry, MikkTSpace, negateSign = true ) {\n\n\tif ( ! MikkTSpace || ! MikkTSpace.isReady ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Initialized MikkTSpace library required.' );\n\n\t}\n\n\tif ( ! geometry.hasAttribute( 'position' ) || ! geometry.hasAttribute( 'normal' ) || ! geometry.hasAttribute( 'uv' ) ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Tangents require \"position\", \"normal\", and \"uv\" attributes.' );\n\n\t}\n\n\tfunction getAttributeArray( attribute ) {\n\n\t\tif ( attribute.normalized || attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst dstArray = new Float32Array( attribute.count * attribute.itemSize );\n\n\t\t\tfor ( let i = 0, j = 0; i < attribute.count; i ++ ) {\n\n\t\t\t\tdstArray[ j ++ ] = attribute.getX( i );\n\t\t\t\tdstArray[ j ++ ] = attribute.getY( i );\n\n\t\t\t\tif ( attribute.itemSize > 2 ) {\n\n\t\t\t\t\tdstArray[ j ++ ] = attribute.getZ( i );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t\tif ( attribute.array instanceof Float32Array ) {\n\n\t\t\treturn attribute.array;\n\n\t\t}\n\n\t\treturn new Float32Array( attribute.array );\n\n\t}\n\n\t// MikkTSpace algorithm requires non-indexed input.\n\n\tconst _geometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\n\t// Compute vertex tangents.\n\n\tconst tangents = MikkTSpace.generateTangents(\n\n\t\tgetAttributeArray( _geometry.attributes.position ),\n\t\tgetAttributeArray( _geometry.attributes.normal ),\n\t\tgetAttributeArray( _geometry.attributes.uv )\n\n\t);\n\n\t// Texture coordinate convention of glTF differs from the apparent\n\t// default of the MikkTSpace library; .w component must be flipped.\n\n\tif ( negateSign ) {\n\n\t\tfor ( let i = 3; i < tangents.length; i += 4 ) {\n\n\t\t\ttangents[ i ] *= - 1;\n\n\t\t}\n\n\t}\n\n\t//\n\n\t_geometry.setAttribute( 'tangent', new BufferAttribute( tangents, 4 ) );\n\n\tif ( geometry !== _geometry ) {\n\n\t\tgeometry.copy( _geometry );\n\n\t}\n\n\treturn geometry;\n\n}\n\n/**\n * @param {Array<BufferGeometry>} geometries\n * @param {Boolean} useGroups\n * @return {BufferGeometry}\n */\nfunction mergeGeometries( geometries, useGroups = false ) {\n\n\tconst isIndexed = geometries[ 0 ].index !== null;\n\n\tconst attributesUsed = new Set( Object.keys( geometries[ 0 ].attributes ) );\n\tconst morphAttributesUsed = new Set( Object.keys( geometries[ 0 ].morphAttributes ) );\n\n\tconst attributes = {};\n\tconst morphAttributes = {};\n\n\tconst morphTargetsRelative = geometries[ 0 ].morphTargetsRelative;\n\n\tconst mergedGeometry = new BufferGeometry();\n\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\tconst geometry = geometries[ i ];\n\t\tlet attributesCount = 0;\n\n\t\t// ensure that all geometries are indexed, or none\n\n\t\tif ( isIndexed !== ( geometry.index !== null ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather attributes, exit early if they're different\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tif ( ! attributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( attributes[ name ] === undefined ) attributes[ name ] = [];\n\n\t\t\tattributes[ name ].push( geometry.attributes[ name ] );\n\n\t\t\tattributesCount ++;\n\n\t\t}\n\n\t\t// ensure geometries have the same number of attributes\n\n\t\tif ( attributesCount !== attributesUsed.size ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. Make sure all geometries have the same number of attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather morph attributes, exit early if they're different\n\n\t\tif ( morphTargetsRelative !== geometry.morphTargetsRelative ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphTargetsRelative must be consistent throughout all geometries.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tfor ( const name in geometry.morphAttributes ) {\n\n\t\t\tif ( ! morphAttributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphAttributes must be consistent throughout all geometries.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( morphAttributes[ name ] === undefined ) morphAttributes[ name ] = [];\n\n\t\t\tmorphAttributes[ name ].push( geometry.morphAttributes[ name ] );\n\n\t\t}\n\n\t\tif ( useGroups ) {\n\n\t\t\tlet count;\n\n\t\t\tif ( isIndexed ) {\n\n\t\t\t\tcount = geometry.index.count;\n\n\t\t\t} else if ( geometry.attributes.position !== undefined ) {\n\n\t\t\t\tcount = geometry.attributes.position.count;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. The geometry must have either an index or a position attribute' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.addGroup( offset, count, i );\n\n\t\t\toffset += count;\n\n\t\t}\n\n\t}\n\n\t// merge indices\n\n\tif ( isIndexed ) {\n\n\t\tlet indexOffset = 0;\n\t\tconst mergedIndex = [];\n\n\t\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\t\tconst index = geometries[ i ].index;\n\n\t\t\tfor ( let j = 0; j < index.count; ++ j ) {\n\n\t\t\t\tmergedIndex.push( index.getX( j ) + indexOffset );\n\n\t\t\t}\n\n\t\t\tindexOffset += geometries[ i ].attributes.position.count;\n\n\t\t}\n\n\t\tmergedGeometry.setIndex( mergedIndex );\n\n\t}\n\n\t// merge attributes\n\n\tfor ( const name in attributes ) {\n\n\t\tconst mergedAttribute = mergeAttributes( attributes[ name ] );\n\n\t\tif ( ! mergedAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' attribute.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tmergedGeometry.setAttribute( name, mergedAttribute );\n\n\t}\n\n\t// merge morph attributes\n\n\tfor ( const name in morphAttributes ) {\n\n\t\tconst numMorphTargets = morphAttributes[ name ][ 0 ].length;\n\n\t\tif ( numMorphTargets === 0 ) break;\n\n\t\tmergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n\t\tmergedGeometry.morphAttributes[ name ] = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; ++ i ) {\n\n\t\t\tconst morphAttributesToMerge = [];\n\n\t\t\tfor ( let j = 0; j < morphAttributes[ name ].length; ++ j ) {\n\n\t\t\t\tmorphAttributesToMerge.push( morphAttributes[ name ][ j ][ i ] );\n\n\t\t\t}\n\n\t\t\tconst mergedMorphAttribute = mergeAttributes( morphAttributesToMerge );\n\n\t\t\tif ( ! mergedMorphAttribute ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' morphAttribute.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.morphAttributes[ name ].push( mergedMorphAttribute );\n\n\t\t}\n\n\t}\n\n\treturn mergedGeometry;\n\n}\n\n/**\n * @param {Array<BufferAttribute>} attributes\n * @return {BufferAttribute}\n */\nfunction mergeAttributes( attributes ) {\n\n\tlet TypedArray;\n\tlet itemSize;\n\tlet normalized;\n\tlet gpuType = - 1;\n\tlet arrayLength = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( itemSize === undefined ) itemSize = attribute.itemSize;\n\t\tif ( itemSize !== attribute.itemSize ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( normalized === undefined ) normalized = attribute.normalized;\n\t\tif ( normalized !== attribute.normalized ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( gpuType === - 1 ) gpuType = attribute.gpuType;\n\t\tif ( gpuType !== attribute.gpuType ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.count * itemSize;\n\n\t}\n\n\tconst array = new TypedArray( arrayLength );\n\tconst result = new BufferAttribute( array, itemSize, normalized );\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst tupleOffset = offset / itemSize;\n\t\t\tfor ( let j = 0, l = attribute.count; j < l; j ++ ) {\n\n\t\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\t\tconst value = attribute.getComponent( j, c );\n\t\t\t\t\tresult.setComponent( j + tupleOffset, c, value );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tarray.set( attribute.array, offset );\n\n\t\t}\n\n\t\toffset += attribute.count * itemSize;\n\n\t}\n\n\tif ( gpuType !== undefined ) {\n\n\t\tresult.gpuType = gpuType;\n\n\t}\n\n\treturn result;\n\n}\n\n/**\n * @param {BufferAttribute}\n * @return {BufferAttribute}\n */\nexport function deepCloneAttribute( attribute ) {\n\n\tif ( attribute.isInstancedInterleavedBufferAttribute || attribute.isInterleavedBufferAttribute ) {\n\n\t\treturn deinterleaveAttribute( attribute );\n\n\t}\n\n\tif ( attribute.isInstancedBufferAttribute ) {\n\n\t\treturn new InstancedBufferAttribute().copy( attribute );\n\n\t}\n\n\treturn new BufferAttribute().copy( attribute );\n\n}\n\n/**\n * @param {Array<BufferAttribute>} attributes\n * @return {Array<InterleavedBufferAttribute>}\n */\nfunction interleaveAttributes( attributes ) {\n\n\t// Interleaves the provided attributes into an InterleavedBuffer and returns\n\t// a set of InterleavedBufferAttributes for each attribute\n\tlet TypedArray;\n\tlet arrayLength = 0;\n\tlet stride = 0;\n\n\t// calculate the length and type of the interleavedBuffer\n\tfor ( let i = 0, l = attributes.length; i < l; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'AttributeBuffers of different types cannot be interleaved' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.array.length;\n\t\tstride += attribute.itemSize;\n\n\t}\n\n\t// Create the set of buffer attributes\n\tconst interleavedBuffer = new InterleavedBuffer( new TypedArray( arrayLength ), stride );\n\tlet offset = 0;\n\tconst res = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\tfor ( let j = 0, l = attributes.length; j < l; j ++ ) {\n\n\t\tconst attribute = attributes[ j ];\n\t\tconst itemSize = attribute.itemSize;\n\t\tconst count = attribute.count;\n\t\tconst iba = new InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, attribute.normalized );\n\t\tres.push( iba );\n\n\t\toffset += itemSize;\n\n\t\t// Move the data for each attribute into the new interleavedBuffer\n\t\t// at the appropriate offset\n\t\tfor ( let c = 0; c < count; c ++ ) {\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\tiba[ setters[ k ] ]( c, attribute[ getters[ k ] ]( c ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn res;\n\n}\n\n// returns a new, non-interleaved version of the provided attribute\nexport function deinterleaveAttribute( attribute ) {\n\n\tconst cons = attribute.data.array.constructor;\n\tconst count = attribute.count;\n\tconst itemSize = attribute.itemSize;\n\tconst normalized = attribute.normalized;\n\n\tconst array = new cons( count * itemSize );\n\tlet newAttribute;\n\tif ( attribute.isInstancedInterleavedBufferAttribute ) {\n\n\t\tnewAttribute = new InstancedBufferAttribute( array, itemSize, normalized, attribute.meshPerAttribute );\n\n\t} else {\n\n\t\tnewAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t}\n\n\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\tnewAttribute.setX( i, attribute.getX( i ) );\n\n\t\tif ( itemSize >= 2 ) {\n\n\t\t\tnewAttribute.setY( i, attribute.getY( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 3 ) {\n\n\t\t\tnewAttribute.setZ( i, attribute.getZ( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 4 ) {\n\n\t\t\tnewAttribute.setW( i, attribute.getW( i ) );\n\n\t\t}\n\n\t}\n\n\treturn newAttribute;\n\n}\n\n// deinterleaves all attributes on the geometry\nexport function deinterleaveGeometry( geometry ) {\n\n\tconst attributes = geometry.attributes;\n\tconst morphTargets = geometry.morphTargets;\n\tconst attrMap = new Map();\n\n\tfor ( const key in attributes ) {\n\n\t\tconst attr = attributes[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tattributes[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n\tfor ( const key in morphTargets ) {\n\n\t\tconst attr = morphTargets[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tmorphTargets[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @return {number}\n */\nfunction estimateBytesUsed( geometry ) {\n\n\t// Return the estimated memory used by this geometry in bytes\n\t// Calculate using itemSize, count, and BYTES_PER_ELEMENT to account\n\t// for InterleavedBufferAttributes.\n\tlet mem = 0;\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst attr = geometry.getAttribute( name );\n\t\tmem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n\n\t}\n\n\tconst indices = geometry.getIndex();\n\tmem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n\treturn mem;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {number} tolerance\n * @return {BufferGeometry}\n */\nfunction mergeVertices( geometry, tolerance = 1e-4 ) {\n\n\ttolerance = Math.max( tolerance, Number.EPSILON );\n\n\t// Generate an index buffer if the geometry doesn't have one, or optimize it\n\t// if it's already available.\n\tconst hashToIndex = {};\n\tconst indices = geometry.getIndex();\n\tconst positions = geometry.getAttribute( 'position' );\n\tconst vertexCount = indices ? indices.count : positions.count;\n\n\t// next value for triangle indices\n\tlet nextIndex = 0;\n\n\t// attributes and new attribute arrays\n\tconst attributeNames = Object.keys( geometry.attributes );\n\tconst tmpAttributes = {};\n\tconst tmpMorphAttributes = {};\n\tconst newIndices = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\t// Initialize the arrays, allocating space conservatively. Extra\n\t// space will be trimmed in the last step.\n\tfor ( let i = 0, l = attributeNames.length; i < l; i ++ ) {\n\n\t\tconst name = attributeNames[ i ];\n\t\tconst attr = geometry.attributes[ name ];\n\n\t\ttmpAttributes[ name ] = new attr.constructor(\n\t\t\tnew attr.array.constructor( attr.count * attr.itemSize ),\n\t\t\tattr.itemSize,\n\t\t\tattr.normalized\n\t\t);\n\n\t\tconst morphAttributes = geometry.morphAttributes[ name ];\n\t\tif ( morphAttributes ) {\n\n\t\t\tif ( ! tmpMorphAttributes[ name ] ) tmpMorphAttributes[ name ] = [];\n\t\t\tmorphAttributes.forEach( ( morphAttr, i ) => {\n\n\t\t\t\tconst array = new morphAttr.array.constructor( morphAttr.count * morphAttr.itemSize );\n\t\t\t\ttmpMorphAttributes[ name ][ i ] = new morphAttr.constructor( array, morphAttr.itemSize, morphAttr.normalized );\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\t// convert the error tolerance to an amount of decimal places to truncate to\n\tconst halfTolerance = tolerance * 0.5;\n\tconst exponent = Math.log10( 1 / tolerance );\n\tconst hashMultiplier = Math.pow( 10, exponent );\n\tconst hashAdditive = halfTolerance * hashMultiplier;\n\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\tconst index = indices ? indices.getX( i ) : i;\n\n\t\t// Generate a hash for the vertex attributes at the current index 'i'\n\t\tlet hash = '';\n\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\tconst name = attributeNames[ j ];\n\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\tconst itemSize = attribute.itemSize;\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t// double tilde truncates the decimal value\n\t\t\t\thash += `${ ~ ~ ( attribute[ getters[ k ] ]( index ) * hashMultiplier + hashAdditive ) },`;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add another reference to the vertex if it's already\n\t\t// used by another index\n\t\tif ( hash in hashToIndex ) {\n\n\t\t\tnewIndices.push( hashToIndex[ hash ] );\n\n\t\t} else {\n\n\t\t\t// copy data to the new index in the temporary attributes\n\t\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\t\tconst name = attributeNames[ j ];\n\t\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\t\tconst morphAttributes = geometry.morphAttributes[ name ];\n\t\t\t\tconst itemSize = attribute.itemSize;\n\t\t\t\tconst newArray = tmpAttributes[ name ];\n\t\t\t\tconst newMorphArrays = tmpMorphAttributes[ name ];\n\n\t\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t\tconst getterFunc = getters[ k ];\n\t\t\t\t\tconst setterFunc = setters[ k ];\n\t\t\t\t\tnewArray[ setterFunc ]( nextIndex, attribute[ getterFunc ]( index ) );\n\n\t\t\t\t\tif ( morphAttributes ) {\n\n\t\t\t\t\t\tfor ( let m = 0, ml = morphAttributes.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\t\tnewMorphArrays[ m ][ setterFunc ]( nextIndex, morphAttributes[ m ][ getterFunc ]( index ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\thashToIndex[ hash ] = nextIndex;\n\t\t\tnewIndices.push( nextIndex );\n\t\t\tnextIndex ++;\n\n\t\t}\n\n\t}\n\n\t// generate result BufferGeometry\n\tconst result = geometry.clone();\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst tmpAttribute = tmpAttributes[ name ];\n\n\t\tresult.setAttribute( name, new tmpAttribute.constructor(\n\t\t\ttmpAttribute.array.slice( 0, nextIndex * tmpAttribute.itemSize ),\n\t\t\ttmpAttribute.itemSize,\n\t\t\ttmpAttribute.normalized,\n\t\t) );\n\n\t\tif ( ! ( name in tmpMorphAttributes ) ) continue;\n\n\t\tfor ( let j = 0; j < tmpMorphAttributes[ name ].length; j ++ ) {\n\n\t\t\tconst tmpMorphAttribute = tmpMorphAttributes[ name ][ j ];\n\n\t\t\tresult.morphAttributes[ name ][ j ] = new tmpMorphAttribute.constructor(\n\t\t\t\ttmpMorphAttribute.array.slice( 0, nextIndex * tmpMorphAttribute.itemSize ),\n\t\t\t\ttmpMorphAttribute.itemSize,\n\t\t\t\ttmpMorphAttribute.normalized,\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\t// indices\n\n\tresult.setIndex( newIndices );\n\n\treturn result;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {number} drawMode\n * @return {BufferGeometry}\n */\nfunction toTrianglesDrawMode( geometry, drawMode ) {\n\n\tif ( drawMode === TrianglesDrawMode ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.' );\n\t\treturn geometry;\n\n\t}\n\n\tif ( drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode ) {\n\n\t\tlet index = geometry.getIndex();\n\n\t\t// generate index if not present\n\n\t\tif ( index === null ) {\n\n\t\t\tconst indices = [];\n\n\t\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tfor ( let i = 0; i < position.count; i ++ ) {\n\n\t\t\t\t\tindices.push( i );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setIndex( indices );\n\t\t\t\tindex = geometry.getIndex();\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst numberOfTriangles = index.count - 2;\n\t\tconst newIndices = [];\n\n\t\tif ( drawMode === TriangleFanDrawMode ) {\n\n\t\t\t// gl.TRIANGLE_FAN\n\n\t\t\tfor ( let i = 1; i <= numberOfTriangles; i ++ ) {\n\n\t\t\t\tnewIndices.push( index.getX( 0 ) );\n\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// gl.TRIANGLE_STRIP\n\n\t\t\tfor ( let i = 0; i < numberOfTriangles; i ++ ) {\n\n\t\t\t\tif ( i % 2 === 0 ) {\n\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( ( newIndices.length / 3 ) !== numberOfTriangles ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' );\n\n\t\t}\n\n\t\t// build final geometry\n\n\t\tconst newGeometry = geometry.clone();\n\t\tnewGeometry.setIndex( newIndices );\n\t\tnewGeometry.clearGroups();\n\n\t\treturn newGeometry;\n\n\t} else {\n\n\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:', drawMode );\n\t\treturn geometry;\n\n\t}\n\n}\n\n/**\n * Calculates the morphed attributes of a morphed/skinned BufferGeometry.\n * Helpful for Raytracing or Decals.\n * @param {Mesh | Line | Points} object An instance of Mesh, Line or Points.\n * @return {Object} An Object with original position/normal attributes and morphed ones.\n */\nfunction computeMorphedAttributes( object ) {\n\n\tconst _vA = new Vector3();\n\tconst _vB = new Vector3();\n\tconst _vC = new Vector3();\n\n\tconst _tempA = new Vector3();\n\tconst _tempB = new Vector3();\n\tconst _tempC = new Vector3();\n\n\tconst _morphA = new Vector3();\n\tconst _morphB = new Vector3();\n\tconst _morphC = new Vector3();\n\n\tfunction _calculateMorphedAttributeData(\n\t\tobject,\n\t\tattribute,\n\t\tmorphAttribute,\n\t\tmorphTargetsRelative,\n\t\ta,\n\t\tb,\n\t\tc,\n\t\tmodifiedAttributeArray\n\t) {\n\n\t\t_vA.fromBufferAttribute( attribute, a );\n\t\t_vB.fromBufferAttribute( attribute, b );\n\t\t_vC.fromBufferAttribute( attribute, c );\n\n\t\tconst morphInfluences = object.morphTargetInfluences;\n\n\t\tif ( morphAttribute && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\t\t\t_morphB.set( 0, 0, 0 );\n\t\t\t_morphC.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morph = morphAttribute[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morph, a );\n\t\t\t\t_tempB.fromBufferAttribute( morph, b );\n\t\t\t\t_tempC.fromBufferAttribute( morph, c );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB, influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( _vA ), influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB.sub( _vB ), influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC.sub( _vC ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_vA.add( _morphA );\n\t\t\t_vB.add( _morphB );\n\t\t\t_vC.add( _morphC );\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tobject.applyBoneTransform( a, _vA );\n\t\t\tobject.applyBoneTransform( b, _vB );\n\t\t\tobject.applyBoneTransform( c, _vC );\n\n\t\t}\n\n\t\tmodifiedAttributeArray[ a * 3 + 0 ] = _vA.x;\n\t\tmodifiedAttributeArray[ a * 3 + 1 ] = _vA.y;\n\t\tmodifiedAttributeArray[ a * 3 + 2 ] = _vA.z;\n\t\tmodifiedAttributeArray[ b * 3 + 0 ] = _vB.x;\n\t\tmodifiedAttributeArray[ b * 3 + 1 ] = _vB.y;\n\t\tmodifiedAttributeArray[ b * 3 + 2 ] = _vB.z;\n\t\tmodifiedAttributeArray[ c * 3 + 0 ] = _vC.x;\n\t\tmodifiedAttributeArray[ c * 3 + 1 ] = _vC.y;\n\t\tmodifiedAttributeArray[ c * 3 + 2 ] = _vC.z;\n\n\t}\n\n\tconst geometry = object.geometry;\n\tconst material = object.material;\n\n\tlet a, b, c;\n\tconst index = geometry.index;\n\tconst positionAttribute = geometry.attributes.position;\n\tconst morphPosition = geometry.morphAttributes.position;\n\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\tconst normalAttribute = geometry.attributes.normal;\n\tconst morphNormal = geometry.morphAttributes.position;\n\n\tconst groups = geometry.groups;\n\tconst drawRange = geometry.drawRange;\n\tlet i, j, il, jl;\n\tlet group;\n\tlet start, end;\n\n\tconst modifiedPosition = new Float32Array( positionAttribute.count * positionAttribute.itemSize );\n\tconst modifiedNormal = new Float32Array( normalAttribute.count * normalAttribute.itemSize );\n\n\tif ( index !== null ) {\n\n\t\t// indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = index.getX( j );\n\t\t\t\t\tb = index.getX( j + 1 );\n\t\t\t\t\tc = index.getX( j + 2 );\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = index.getX( i );\n\t\t\t\tb = index.getX( i + 1 );\n\t\t\t\tc = index.getX( i + 2 );\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// non-indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = j;\n\t\t\t\t\tb = j + 1;\n\t\t\t\t\tc = j + 2;\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = i;\n\t\t\t\tb = i + 1;\n\t\t\t\tc = i + 2;\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst morphedPositionAttribute = new Float32BufferAttribute( modifiedPosition, 3 );\n\tconst morphedNormalAttribute = new Float32BufferAttribute( modifiedNormal, 3 );\n\n\treturn {\n\n\t\tpositionAttribute: positionAttribute,\n\t\tnormalAttribute: normalAttribute,\n\t\tmorphedPositionAttribute: morphedPositionAttribute,\n\t\tmorphedNormalAttribute: morphedNormalAttribute\n\n\t};\n\n}\n\nfunction mergeGroups( geometry ) {\n\n\tif ( geometry.groups.length === 0 ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.mergeGroups(): No groups are defined. Nothing to merge.' );\n\t\treturn geometry;\n\n\t}\n\n\tlet groups = geometry.groups;\n\n\t// sort groups by material index\n\n\tgroups = groups.sort( ( a, b ) => {\n\n\t\tif ( a.materialIndex !== b.materialIndex ) return a.materialIndex - b.materialIndex;\n\n\t\treturn a.start - b.start;\n\n\t} );\n\n\t// create index for non-indexed geometries\n\n\tif ( geometry.getIndex() === null ) {\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\t\tconst indices = [];\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i += 3 ) {\n\n\t\t\tindices.push( i, i + 1, i + 2 );\n\n\t\t}\n\n\t\tgeometry.setIndex( indices );\n\n\t}\n\n\t// sort index\n\n\tconst index = geometry.getIndex();\n\n\tconst newIndices = [];\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tconst groupStart = group.start;\n\t\tconst groupLength = groupStart + group.count;\n\n\t\tfor ( let j = groupStart; j < groupLength; j ++ ) {\n\n\t\t\tnewIndices.push( index.getX( j ) );\n\n\t\t}\n\n\t}\n\n\tgeometry.dispose(); // Required to force buffer recreation\n\tgeometry.setIndex( newIndices );\n\n\t// update groups indices\n\n\tlet start = 0;\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tgroup.start = start;\n\t\tstart += group.count;\n\n\t}\n\n\t// merge groups\n\n\tlet currentGroup = groups[ 0 ];\n\n\tgeometry.groups = [ currentGroup ];\n\n\tfor ( let i = 1; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tif ( currentGroup.materialIndex === group.materialIndex ) {\n\n\t\t\tcurrentGroup.count += group.count;\n\n\t\t} else {\n\n\t\t\tcurrentGroup = group;\n\t\t\tgeometry.groups.push( currentGroup );\n\n\t\t}\n\n\t}\n\n\treturn geometry;\n\n}\n\n\n/**\n * Modifies the supplied geometry if it is non-indexed, otherwise creates a new,\n * non-indexed geometry. Returns the geometry with smooth normals everywhere except\n * faces that meet at an angle greater than the crease angle.\n *\n * @param {BufferGeometry} geometry\n * @param {number} [creaseAngle]\n * @return {BufferGeometry}\n */\nfunction toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */ ) {\n\n\tconst creaseDot = Math.cos( creaseAngle );\n\tconst hashMultiplier = ( 1 + 1e-10 ) * 1e2;\n\n\t// reusable vectors\n\tconst verts = [ new Vector3(), new Vector3(), new Vector3() ];\n\tconst tempVec1 = new Vector3();\n\tconst tempVec2 = new Vector3();\n\tconst tempNorm = new Vector3();\n\tconst tempNorm2 = new Vector3();\n\n\t// hashes a vector\n\tfunction hashVertex( v ) {\n\n\t\tconst x = ~ ~ ( v.x * hashMultiplier );\n\t\tconst y = ~ ~ ( v.y * hashMultiplier );\n\t\tconst z = ~ ~ ( v.z * hashMultiplier );\n\t\treturn `${x},${y},${z}`;\n\n\t}\n\n\t// BufferGeometry.toNonIndexed() warns if the geometry is non-indexed\n\t// and returns the original geometry\n\tconst resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\tconst posAttr = resultGeometry.attributes.position;\n\tconst vertexMap = {};\n\n\t// find all the normals shared by commonly located vertices\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\t// add the normal to the map for all vertices\n\t\tconst normal = new Vector3().crossVectors( tempVec1, tempVec2 ).normalize();\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tif ( ! ( hash in vertexMap ) ) {\n\n\t\t\t\tvertexMap[ hash ] = [];\n\n\t\t\t}\n\n\t\t\tvertexMap[ hash ].push( normal );\n\n\t\t}\n\n\t}\n\n\t// average normals from all vertices that share a common location if they are within the\n\t// provided crease threshold\n\tconst normalArray = new Float32Array( posAttr.count * 3 );\n\tconst normAttr = new BufferAttribute( normalArray, 3, false );\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\t// get the face normal for this vertex\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\ttempNorm.crossVectors( tempVec1, tempVec2 ).normalize();\n\n\t\t// average all normals that meet the threshold and set the normal value\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tconst otherNormals = vertexMap[ hash ];\n\t\t\ttempNorm2.set( 0, 0, 0 );\n\n\t\t\tfor ( let k = 0, lk = otherNormals.length; k < lk; k ++ ) {\n\n\t\t\t\tconst otherNorm = otherNormals[ k ];\n\t\t\t\tif ( tempNorm.dot( otherNorm ) > creaseDot ) {\n\n\t\t\t\t\ttempNorm2.add( otherNorm );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttempNorm2.normalize();\n\t\t\tnormAttr.setXYZ( i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z );\n\n\t\t}\n\n\t}\n\n\tresultGeometry.setAttribute( 'normal', normAttr );\n\treturn resultGeometry;\n\n}\n\nexport {\n\tcomputeMikkTSpaceTangents,\n\tmergeGeometries,\n\tmergeAttributes,\n\tinterleaveAttributes,\n\testimateBytesUsed,\n\tmergeVertices,\n\ttoTrianglesDrawMode,\n\tcomputeMorphedAttributes,\n\tmergeGroups,\n\ttoCreasedNormals\n};\n","import * as THREE from 'three';\r\nimport { FeatureTable, BatchTable } from './FeatureTable';\r\nimport * as BufferGeometryUtils from 'three/addons/utils/BufferGeometryUtils.js';\r\n\r\n\r\n\r\n\r\nclass B3DMDecoder {\r\n\tconstructor(aGltfLoader) {\r\n\t\tthis.gltfLoader = aGltfLoader;\r\n\t\tthis.tempMatrix = new THREE.Matrix4();\r\n\r\n\t\tthis.zUpToYUpMatrix = new THREE.Matrix4();\r\n\t\tthis.zUpToYUpMatrix.set(\r\n\t\t\t1, 0, 0, 0,\r\n\t\t\t0, 0, -1, 0,\r\n\t\t\t0, 1, 0, 0,\r\n\t\t\t0, 0, 0, 1);\r\n\r\n\t}\r\n\r\n\tparseB3DM(arrayBuffer, meshCallback, sceneZupToYUp, meshZUpToYUp) {\r\n\t\tconst self = this;\r\n\t\tconst dataView = new DataView(arrayBuffer);\r\n\r\n\t\tconst magic =\r\n\t\t\tString.fromCharCode(dataView.getUint8(0)) +\r\n\t\t\tString.fromCharCode(dataView.getUint8(1)) +\r\n\t\t\tString.fromCharCode(dataView.getUint8(2)) +\r\n\t\t\tString.fromCharCode(dataView.getUint8(3));\r\n\t\tconsole.assert(magic === 'b3dm');\r\n\r\n\t\tconst byteLength = dataView.getUint32(8, true);\r\n\t\tconsole.assert(byteLength === arrayBuffer.byteLength);\r\n\r\n\t\tconst featureTableJSONByteLength = dataView.getUint32(12, true);\r\n\t\tconst featureTableBinaryByteLength = dataView.getUint32(16, true);\r\n\t\tconst batchTableJSONByteLength = dataView.getUint32(20, true);\r\n\t\tconst batchTableBinaryByteLength = dataView.getUint32(24, true);\r\n\r\n\t\tconst featureTableStart = 28;\r\n\t\tconst featureTable = new FeatureTable(arrayBuffer, featureTableStart, featureTableJSONByteLength, featureTableBinaryByteLength);\r\n\r\n\t\tconst batchTableStart = featureTableStart + featureTableJSONByteLength + featureTableBinaryByteLength;\r\n\t\tconst batchTable = new BatchTable(arrayBuffer, featureTable.getData('BATCH_LENGTH'), batchTableStart, batchTableJSONByteLength, batchTableBinaryByteLength);\r\n\r\n\t\tconst glbStart = batchTableStart + batchTableJSONByteLength + batchTableBinaryByteLength;\r\n\t\tconst glbBytes = new Uint8Array(arrayBuffer, glbStart, byteLength - glbStart);\r\n\r\n\r\n\t\tconst gltfBuffer = glbBytes.slice().buffer;\r\n\r\n\r\n\t\treturn new Promise(async (resolve, reject) => {\r\n\t\t\tawait this.checkLoaderInitialized();\r\n\t\t\tthis.gltfLoader.parse(gltfBuffer, null, model => {\r\n\t\t\t\tconst rtcCenter = featureTable.getData('RTC_CENTER');\r\n\t\t\t\tif (rtcCenter) {\r\n\t\t\t\t\tthis.tempMatrix.makeTranslation(rtcCenter[0], rtcCenter[1], rtcCenter[2])\r\n\t\t\t\t\tmodel.scene.applyMatrix4(this.tempMatrix);\r\n\t\t\t\t} else if (!!model.userData.gltfExtensions && !!model.userData.gltfExtensions.CESIUM_RTC) {\r\n\t\t\t\t\tthis.tempMatrix.makeTranslation(model.userData.gltfExtensions.CESIUM_RTC.center[0], model.userData.gltfExtensions.CESIUM_RTC.center[1], model.userData.gltfExtensions.CESIUM_RTC.center[2])\r\n\t\t\t\t\tmodel.scene.applyMatrix4(this.tempMatrix);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (sceneZupToYUp) {\r\n\t\t\t\t\tmodel.scene.applyMatrix4(self.zUpToYUpMatrix);\r\n\t\t\t\t}\r\n\t\t\t\tmodel.scene.asset = model.asset;\r\n\t\t\t\tmodel.scene.traverse((o) => {\r\n\r\n\t\t\t\t\tif (o.isMesh) {\r\n\t\t\t\t\t\tif (meshZUpToYUp) {\r\n\t\t\t\t\t\t\to.applyMatrix4(self.zUpToYUpMatrix);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (!!meshCallback) {\r\n\t\t\t\t\t\t\tmeshCallback(o);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t\tresolve(model.scene);\r\n\t\t\t}, error => {\r\n\t\t\t\tconsole.error(error);\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\tcheckLoaderInitialized = async () => {\r\n\t\treturn new Promise((resolve) => {\r\n\t\t\tconst interval = setInterval(() => {\r\n\t\t\t\tif ((!this.gltfLoader.hasDracoLoader || this.gltfLoader.dracoLoader) && (!this.gltfLoader.hasKTX2Loader || this.gltfLoader.ktx2Loader)) {\r\n\t\t\t\t\tclearInterval(interval);\r\n\t\t\t\t\tresolve();\r\n\t\t\t\t}\r\n\t\t\t}, 10); // check every 100ms\r\n\t\t});\r\n\t};\r\n\tparseB3DMInstanced(arrayBuffer, meshCallback, maxCount, sceneZupToYUp, meshZupToYup) { // expects GLTF with one node level\r\n\r\n\t\treturn this.parseB3DM(arrayBuffer, meshCallback, sceneZupToYUp, meshZupToYup).then(mesh => {\r\n\t\t\t// todo several meshes in a single gltf\r\n\t\t\tlet instancedMesh;\r\n\t\t\tlet geometries = [];\r\n\t\t\tlet materials = [];\r\n\t\t\tmesh.updateWorldMatrix(false, true)\r\n\t\t\tmesh.traverse(child => {\r\n\t\t\t\tif (child.isMesh) {\r\n\t\t\t\t\tchild.geometry.applyMatrix4(child.matrixWorld);\r\n\t\t\t\t\tgeometries.push(child.geometry);\r\n\t\t\t\t\tmaterials.push(child.material);\r\n\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tlet mergedGeometry = normalizeAndMergeGeometries(geometries);\r\n\t\t\tinstancedMesh = new THREE.InstancedMesh(mergedGeometry, materials, maxCount);\r\n\t\t\tinstancedMesh.baseMatrix = new THREE.Matrix4().identity();\r\n\t\t\treturn instancedMesh;\r\n\t\t});\r\n\r\n\t}\r\n}\r\nexport { B3DMDecoder }\r\n\r\nfunction normalizeAndMergeGeometries(geometries) {\r\n\t// Identify all unique attributes across all geometries.\r\n\tlet allAttributes = new Set();\r\n\tgeometries.forEach(geometry => {\r\n\t\tfor (let attribute in geometry.attributes) {\r\n\t\t\tallAttributes.add(attribute);\r\n\t\t}\r\n\t});\r\n\r\n\t// Ensure every geometry has every attribute, adding default filled ones if necessary.\r\n\tgeometries.forEach(geometry => {\r\n\t\tallAttributes.forEach(attribute => {\r\n\t\t\tif (!geometry.attributes[attribute]) {\r\n\t\t\t\tconst attributeSize = getAttributeSize(attribute);\r\n\t\t\t\tconst buffer = new Float32Array(attributeSize * geometry.getAttribute('position').count).fill(0);\r\n\t\t\t\tgeometry.setAttribute(attribute, new THREE.BufferAttribute(buffer, attributeSize));\r\n\t\t\t}\r\n\t\t});\r\n\t});\r\n\r\n\t// Now merge the geometries.\r\n\tlet mergedGeometry = BufferGeometryUtils.mergeGeometries(geometries, true);\r\n\treturn mergedGeometry;\r\n}\r\n\r\nfunction getAttributeSize(attribute) {\r\n\tswitch (attribute) {\r\n\t\tcase 'position':\r\n\t\tcase 'normal':\r\n\t\tcase 'color':\r\n\t\t\treturn 3;\r\n\t\tcase 'uv':\r\n\t\tcase 'uv2':\r\n\t\t\treturn 2;\r\n\t\t// Add other attribute cases as needed.\r\n\t\tdefault:\r\n\t\t\tthrow new Error(`Unknown attribute ${attribute}`);\r\n\t}\r\n}\r\n\r\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation. Also,\n // find the complete implementation of crypto (msCrypto) on IE11.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(rnds);\n}\n\nexport default v4;","import * as THREE from 'three';\r\nimport { v4 as uuidv4 } from \"uuid\";\r\n\r\nconst workers = [];\r\nlet workerCounter = 0;\r\nclass SplatsDecoder {\r\n\r\n\tconstructor(gltfLoader, renderer) {\r\n\t\tconst self = this;\r\n\t\tself.renderer = renderer;\r\n\t\tself.gltfLoader = gltfLoader;\r\n\t}\r\n\r\n\tparseSplats(arrayBuffer, sceneZupToYUp, meshZUpToYUp, splatsMesh) {\r\n\t\tconst self = this;\r\n\t\treturn new Promise(async (resolve, reject) => {\r\n\t\t\tawait self.checkLoaderInitialized();\r\n\t\t\tself.gltfLoader.parse(arrayBuffer, null, model => {\r\n\t\t\t\tconst scene = model.scene;\r\n\t\t\t\tconst decoded = model.scene.children[0];\r\n\t\t\t\tconst positions = decoded.geometry.attributes.position;\r\n\t\t\t\tconst colors = decoded.geometry.attributes.color;\r\n\t\t\t\tconst cov0 = decoded.geometry.attributes.cov_0;\r\n\t\t\t\tconst cov1 = decoded.geometry.attributes.cov_1;\r\n\t\t\t\tconst splatTile = splatsMesh.addSplatsTile(positions, colors, cov0, cov1);\r\n\t\t\t\tmodel.scene.traverse(o=>{\r\n\t\t\t\t\tif(o.dispose) o.dispose();\r\n\t\t\t\t})\r\n\t\t\t\tresolve(splatTile);\r\n\t\t\t\t\r\n\t\t\t}, error => {\r\n\t\t\t\tconsole.error(error);\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\tcheckLoaderInitialized = async () => {\r\n\t\tconst self = this;\r\n\t\treturn new Promise((resolve) => {\r\n\t\t\tconst interval = setInterval(() => {\r\n\t\t\t\tif ((!self.gltfLoader.hasDracoLoader || self.gltfLoader.dracoLoader) && (!self.gltfLoader.hasKTX2Loader || self.gltfLoader.ktx2Loader)) {\r\n\t\t\t\t\tclearInterval(interval);\r\n\t\t\t\t\tresolve();\r\n\t\t\t\t}\r\n\t\t\t}, 10); \r\n\t\t});\r\n\t};\r\n} export { SplatsDecoder };\r\n\r\n","import {\n\tAnimationClip,\n\tBone,\n\tBox3,\n\tBufferAttribute,\n\tBufferGeometry,\n\tClampToEdgeWrapping,\n\tColor,\n\tColorManagement,\n\tDirectionalLight,\n\tDoubleSide,\n\tFileLoader,\n\tFrontSide,\n\tGroup,\n\tImageBitmapLoader,\n\tInstancedMesh,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tInterpolant,\n\tInterpolateDiscrete,\n\tInterpolateLinear,\n\tLine,\n\tLineBasicMaterial,\n\tLineLoop,\n\tLineSegments,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearMipmapNearestFilter,\n\tLinearSRGBColorSpace,\n\tLoader,\n\tLoaderUtils,\n\tMaterial,\n\tMathUtils,\n\tMatrix4,\n\tMesh,\n\tMeshBasicMaterial,\n\tMeshPhysicalMaterial,\n\tMeshStandardMaterial,\n\tMirroredRepeatWrapping,\n\tNearestFilter,\n\tNearestMipmapLinearFilter,\n\tNearestMipmapNearestFilter,\n\tNumberKeyframeTrack,\n\tObject3D,\n\tOrthographicCamera,\n\tPerspectiveCamera,\n\tPointLight,\n\tPoints,\n\tPointsMaterial,\n\tPropertyBinding,\n\tQuaternion,\n\tQuaternionKeyframeTrack,\n\tRepeatWrapping,\n\tSkeleton,\n\tSkinnedMesh,\n\tSphere,\n\tSpotLight,\n\tTexture,\n\tTextureLoader,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tVector2,\n\tVector3,\n\tVectorKeyframeTrack,\n\tSRGBColorSpace,\n\tInstancedBufferAttribute\n} from 'three';\nimport { toTrianglesDrawMode } from '../utils/BufferGeometryUtils.js';\n\nclass GLTFLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.dracoLoader = null;\n\t\tthis.ktx2Loader = null;\n\t\tthis.meshoptDecoder = null;\n\n\t\tthis.pluginCallbacks = [];\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsClearcoatExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsDispersionExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureBasisUExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureWebPExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureAVIFExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsSheenExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsTransmissionExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsVolumeExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsIorExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsEmissiveStrengthExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsSpecularExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsIridescenceExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsAnisotropyExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsBumpExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFLightsExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMeshoptCompression( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMeshGpuInstancing( parser );\n\n\t\t} );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet resourcePath;\n\n\t\tif ( this.resourcePath !== '' ) {\n\n\t\t\tresourcePath = this.resourcePath;\n\n\t\t} else if ( this.path !== '' ) {\n\n\t\t\t// If a base path is set, resources will be relative paths from that plus the relative path of the gltf file\n\t\t\t// Example path = 'https://my-cnd-server.com/', url = 'assets/models/model.gltf'\n\t\t\t// resourcePath = 'https://my-cnd-server.com/assets/models/'\n\t\t\t// referenced resource 'model.bin' will be loaded from 'https://my-cnd-server.com/assets/models/model.bin'\n\t\t\t// referenced resource '../textures/texture.png' will be loaded from 'https://my-cnd-server.com/assets/textures/texture.png'\n\t\t\tconst relativeUrl = LoaderUtils.extractUrlBase( url );\n\t\t\tresourcePath = LoaderUtils.resolveURL( relativeUrl, this.path );\n\n\t\t} else {\n\n\t\t\tresourcePath = LoaderUtils.extractUrlBase( url );\n\n\t\t}\n\n\t\t// Tells the LoadingManager to track an extra item, which resolves after\n\t\t// the model is fully loaded. This means the count of items loaded will\n\t\t// be incorrect, but ensures manager.onLoad() does not fire early.\n\t\tthis.manager.itemStart( url );\n\n\t\tconst _onError = function ( e ) {\n\n\t\t\tif ( onError ) {\n\n\t\t\t\tonError( e );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( e );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t};\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, function ( data ) {\n\n\t\t\ttry {\n\n\t\t\t\tscope.parse( data, resourcePath, function ( gltf ) {\n\n\t\t\t\t\tonLoad( gltf );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, _onError );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\t_onError( e );\n\n\t\t\t}\n\n\t\t}, onProgress, _onError );\n\n\t}\n\n\tsetDRACOLoader( dracoLoader ) {\n\n\t\tthis.dracoLoader = dracoLoader;\n\t\treturn this;\n\n\t}\n\n\tsetKTX2Loader( ktx2Loader ) {\n\n\t\tthis.ktx2Loader = ktx2Loader;\n\t\treturn this;\n\n\t}\n\n\tsetMeshoptDecoder( meshoptDecoder ) {\n\n\t\tthis.meshoptDecoder = meshoptDecoder;\n\t\treturn this;\n\n\t}\n\n\tregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {\n\n\t\t\tthis.pluginCallbacks.push( callback );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) {\n\n\t\t\tthis.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tparse( data, path, onLoad, onError ) {\n\n\t\tlet json;\n\t\tconst extensions = {};\n\t\tconst plugins = {};\n\t\tconst textDecoder = new TextDecoder();\n\n\t\tif ( typeof data === 'string' ) {\n\n\t\t\tjson = JSON.parse( data );\n\n\t\t} else if ( data instanceof ArrayBuffer ) {\n\n\t\t\tconst magic = textDecoder.decode( new Uint8Array( data, 0, 4 ) );\n\n\t\t\tif ( magic === BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\t\ttry {\n\n\t\t\t\t\textensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\tif ( onError ) onError( error );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tjson = JSON.parse( extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content );\n\n\t\t\t} else {\n\n\t\t\t\tjson = JSON.parse( textDecoder.decode( data ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tjson = data;\n\n\t\t}\n\n\t\tif ( json.asset === undefined || json.asset.version[ 0 ] < 2 ) {\n\n\t\t\tif ( onError ) onError( new Error( 'THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.' ) );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst parser = new GLTFParser( json, {\n\n\t\t\tpath: path || this.resourcePath || '',\n\t\t\tcrossOrigin: this.crossOrigin,\n\t\t\trequestHeader: this.requestHeader,\n\t\t\tmanager: this.manager,\n\t\t\tktx2Loader: this.ktx2Loader,\n\t\t\tmeshoptDecoder: this.meshoptDecoder\n\n\t\t} );\n\n\t\tparser.fileLoader.setRequestHeader( this.requestHeader );\n\n\t\tfor ( let i = 0; i < this.pluginCallbacks.length; i ++ ) {\n\n\t\t\tconst plugin = this.pluginCallbacks[ i ]( parser );\n\n\t\t\tif ( ! plugin.name ) console.error( 'THREE.GLTFLoader: Invalid plugin found: missing name' );\n\n\t\t\tplugins[ plugin.name ] = plugin;\n\n\t\t\t// Workaround to avoid determining as unknown extension\n\t\t\t// in addUnknownExtensionsToUserData().\n\t\t\t// Remove this workaround if we move all the existing\n\t\t\t// extension handlers to plugin system\n\t\t\textensions[ plugin.name ] = true;\n\n\t\t}\n\n\t\tif ( json.extensionsUsed ) {\n\n\t\t\tfor ( let i = 0; i < json.extensionsUsed.length; ++ i ) {\n\n\t\t\t\tconst extensionName = json.extensionsUsed[ i ];\n\t\t\t\tconst extensionsRequired = json.extensionsRequired || [];\n\n\t\t\t\tswitch ( extensionName ) {\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MATERIALS_UNLIT:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMaterialsUnlitExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_DRACO_MESH_COMPRESSION:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_TEXTURE_TRANSFORM:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFTextureTransformExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MESH_QUANTIZATION:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMeshQuantizationExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( extensionsRequired.indexOf( extensionName ) >= 0 && plugins[ extensionName ] === undefined ) {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Unknown extension \"' + extensionName + '\".' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tparser.setExtensions( extensions );\n\t\tparser.setPlugins( plugins );\n\t\tparser.parse( onLoad, onError );\n\n\t}\n\n\tparseAsync( data, path ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.parse( data, path, resolve, reject );\n\n\t\t} );\n\n\t}\n\n}\n\n/* GLTFREGISTRY */\n\nfunction GLTFRegistry() {\n\n\tlet objects = {};\n\n\treturn\t{\n\n\t\tget: function ( key ) {\n\n\t\t\treturn objects[ key ];\n\n\t\t},\n\n\t\tadd: function ( key, object ) {\n\n\t\t\tobjects[ key ] = object;\n\n\t\t},\n\n\t\tremove: function ( key ) {\n\n\t\t\tdelete objects[ key ];\n\n\t\t},\n\n\t\tremoveAll: function () {\n\n\t\t\tobjects = {};\n\n\t\t}\n\n\t};\n\n}\n\n/*********************************/\n/********** EXTENSIONS ***********/\n/*********************************/\n\nconst EXTENSIONS = {\n\tKHR_BINARY_GLTF: 'KHR_binary_glTF',\n\tKHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression',\n\tKHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual',\n\tKHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat',\n\tKHR_MATERIALS_DISPERSION: 'KHR_materials_dispersion',\n\tKHR_MATERIALS_IOR: 'KHR_materials_ior',\n\tKHR_MATERIALS_SHEEN: 'KHR_materials_sheen',\n\tKHR_MATERIALS_SPECULAR: 'KHR_materials_specular',\n\tKHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission',\n\tKHR_MATERIALS_IRIDESCENCE: 'KHR_materials_iridescence',\n\tKHR_MATERIALS_ANISOTROPY: 'KHR_materials_anisotropy',\n\tKHR_MATERIALS_UNLIT: 'KHR_materials_unlit',\n\tKHR_MATERIALS_VOLUME: 'KHR_materials_volume',\n\tKHR_TEXTURE_BASISU: 'KHR_texture_basisu',\n\tKHR_TEXTURE_TRANSFORM: 'KHR_texture_transform',\n\tKHR_MESH_QUANTIZATION: 'KHR_mesh_quantization',\n\tKHR_MATERIALS_EMISSIVE_STRENGTH: 'KHR_materials_emissive_strength',\n\tEXT_MATERIALS_BUMP: 'EXT_materials_bump',\n\tEXT_TEXTURE_WEBP: 'EXT_texture_webp',\n\tEXT_TEXTURE_AVIF: 'EXT_texture_avif',\n\tEXT_MESHOPT_COMPRESSION: 'EXT_meshopt_compression',\n\tEXT_MESH_GPU_INSTANCING: 'EXT_mesh_gpu_instancing'\n};\n\n/**\n * Punctual Lights Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n */\nclass GLTFLightsExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL;\n\n\t\t// Object3D instance caches\n\t\tthis.cache = { refs: {}, uses: {} };\n\n\t}\n\n\t_markDefs() {\n\n\t\tconst parser = this.parser;\n\t\tconst nodeDefs = this.parser.json.nodes || [];\n\n\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.extensions\n\t\t\t\t\t&& nodeDef.extensions[ this.name ]\n\t\t\t\t\t&& nodeDef.extensions[ this.name ].light !== undefined ) {\n\n\t\t\t\tparser._addNodeRef( this.cache, nodeDef.extensions[ this.name ].light );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_loadLight( lightIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst cacheKey = 'light:' + lightIndex;\n\t\tlet dependency = parser.cache.get( cacheKey );\n\n\t\tif ( dependency ) return dependency;\n\n\t\tconst json = parser.json;\n\t\tconst extensions = ( json.extensions && json.extensions[ this.name ] ) || {};\n\t\tconst lightDefs = extensions.lights || [];\n\t\tconst lightDef = lightDefs[ lightIndex ];\n\t\tlet lightNode;\n\n\t\tconst color = new Color( 0xffffff );\n\n\t\tif ( lightDef.color !== undefined ) color.setRGB( lightDef.color[ 0 ], lightDef.color[ 1 ], lightDef.color[ 2 ], LinearSRGBColorSpace );\n\n\t\tconst range = lightDef.range !== undefined ? lightDef.range : 0;\n\n\t\tswitch ( lightDef.type ) {\n\n\t\t\tcase 'directional':\n\t\t\t\tlightNode = new DirectionalLight( color );\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tcase 'point':\n\t\t\t\tlightNode = new PointLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\tbreak;\n\n\t\t\tcase 'spot':\n\t\t\t\tlightNode = new SpotLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\t// Handle spotlight properties.\n\t\t\t\tlightDef.spot = lightDef.spot || {};\n\t\t\t\tlightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0;\n\t\t\t\tlightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0;\n\t\t\t\tlightNode.angle = lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unexpected light type: ' + lightDef.type );\n\n\t\t}\n\n\t\t// Some lights (e.g. spot) default to a position other than the origin. Reset the position\n\t\t// here, because node-level parsing will only override position if explicitly specified.\n\t\tlightNode.position.set( 0, 0, 0 );\n\n\t\tlightNode.decay = 2;\n\n\t\tassignExtrasToUserData( lightNode, lightDef );\n\n\t\tif ( lightDef.intensity !== undefined ) lightNode.intensity = lightDef.intensity;\n\n\t\tlightNode.name = parser.createUniqueName( lightDef.name || ( 'light_' + lightIndex ) );\n\n\t\tdependency = Promise.resolve( lightNode );\n\n\t\tparser.cache.add( cacheKey, dependency );\n\n\t\treturn dependency;\n\n\t}\n\n\tgetDependency( type, index ) {\n\n\t\tif ( type !== 'light' ) return;\n\n\t\treturn this._loadLight( index );\n\n\t}\n\n\tcreateNodeAttachment( nodeIndex ) {\n\n\t\tconst self = this;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\t\tconst lightDef = ( nodeDef.extensions && nodeDef.extensions[ this.name ] ) || {};\n\t\tconst lightIndex = lightDef.light;\n\n\t\tif ( lightIndex === undefined ) return null;\n\n\t\treturn this._loadLight( lightIndex ).then( function ( light ) {\n\n\t\t\treturn parser._getNodeRef( self.cache, lightIndex, light );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Unlit Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n */\nclass GLTFMaterialsUnlitExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_UNLIT;\n\n\t}\n\n\tgetMaterialType() {\n\n\t\treturn MeshBasicMaterial;\n\n\t}\n\n\textendParams( materialParams, materialDef, parser ) {\n\n\t\tconst pending = [];\n\n\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\tmaterialParams.opacity = 1.0;\n\n\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness;\n\n\t\tif ( metallicRoughness ) {\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.setRGB( array[ 0 ], array[ 1 ], array[ 2 ], LinearSRGBColorSpace );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, SRGBColorSpace ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials Emissive Strength Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/blob/5768b3ce0ef32bc39cdf1bef10b948586635ead3/extensions/2.0/Khronos/KHR_materials_emissive_strength/README.md\n */\nclass GLTFMaterialsEmissiveStrengthExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_EMISSIVE_STRENGTH;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst emissiveStrength = materialDef.extensions[ this.name ].emissiveStrength;\n\n\t\tif ( emissiveStrength !== undefined ) {\n\n\t\t\tmaterialParams.emissiveIntensity = emissiveStrength;\n\n\t\t}\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Clearcoat Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat\n */\nclass GLTFMaterialsClearcoatExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.clearcoatFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoat = extension.clearcoatFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatMap', extension.clearcoatTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatRoughnessMap', extension.clearcoatRoughnessTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatNormalTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatNormalMap', extension.clearcoatNormalTexture ) );\n\n\t\t\tif ( extension.clearcoatNormalTexture.scale !== undefined ) {\n\n\t\t\t\tconst scale = extension.clearcoatNormalTexture.scale;\n\n\t\t\t\tmaterialParams.clearcoatNormalScale = new Vector2( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials dispersion Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_dispersion\n */\nclass GLTFMaterialsDispersionExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_DISPERSION;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.dispersion = extension.dispersion !== undefined ? extension.dispersion : 0;\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Iridescence Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_iridescence\n */\nclass GLTFMaterialsIridescenceExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IRIDESCENCE;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.iridescenceFactor !== undefined ) {\n\n\t\t\tmaterialParams.iridescence = extension.iridescenceFactor;\n\n\t\t}\n\n\t\tif ( extension.iridescenceTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'iridescenceMap', extension.iridescenceTexture ) );\n\n\t\t}\n\n\t\tif ( extension.iridescenceIor !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceIOR = extension.iridescenceIor;\n\n\t\t}\n\n\t\tif ( materialParams.iridescenceThicknessRange === undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange = [ 100, 400 ];\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessMinimum !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange[ 0 ] = extension.iridescenceThicknessMinimum;\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessMaximum !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange[ 1 ] = extension.iridescenceThicknessMaximum;\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'iridescenceThicknessMap', extension.iridescenceThicknessTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Sheen Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen\n */\nclass GLTFMaterialsSheenExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SHEEN;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tmaterialParams.sheenColor = new Color( 0, 0, 0 );\n\t\tmaterialParams.sheenRoughness = 0;\n\t\tmaterialParams.sheen = 1;\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.sheenColorFactor !== undefined ) {\n\n\t\t\tconst colorFactor = extension.sheenColorFactor;\n\t\t\tmaterialParams.sheenColor.setRGB( colorFactor[ 0 ], colorFactor[ 1 ], colorFactor[ 2 ], LinearSRGBColorSpace );\n\n\t\t}\n\n\t\tif ( extension.sheenRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.sheenRoughness = extension.sheenRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.sheenColorTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenColorMap', extension.sheenColorTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\tif ( extension.sheenRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenRoughnessMap', extension.sheenRoughnessTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Transmission Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission\n * Draft: https://github.com/KhronosGroup/glTF/pull/1698\n */\nclass GLTFMaterialsTransmissionExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.transmissionFactor !== undefined ) {\n\n\t\t\tmaterialParams.transmission = extension.transmissionFactor;\n\n\t\t}\n\n\t\tif ( extension.transmissionTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'transmissionMap', extension.transmissionTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials Volume Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume\n */\nclass GLTFMaterialsVolumeExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_VOLUME;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.thickness = extension.thicknessFactor !== undefined ? extension.thicknessFactor : 0;\n\n\t\tif ( extension.thicknessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'thicknessMap', extension.thicknessTexture ) );\n\n\t\t}\n\n\t\tmaterialParams.attenuationDistance = extension.attenuationDistance || Infinity;\n\n\t\tconst colorArray = extension.attenuationColor || [ 1, 1, 1 ];\n\t\tmaterialParams.attenuationColor = new Color().setRGB( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ], LinearSRGBColorSpace );\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials ior Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior\n */\nclass GLTFMaterialsIorExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IOR;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.ior = extension.ior !== undefined ? extension.ior : 1.5;\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Materials specular Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular\n */\nclass GLTFMaterialsSpecularExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SPECULAR;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.specularIntensity = extension.specularFactor !== undefined ? extension.specularFactor : 1.0;\n\n\t\tif ( extension.specularTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularIntensityMap', extension.specularTexture ) );\n\n\t\t}\n\n\t\tconst colorArray = extension.specularColorFactor || [ 1, 1, 1 ];\n\t\tmaterialParams.specularColor = new Color().setRGB( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ], LinearSRGBColorSpace );\n\n\t\tif ( extension.specularColorTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularColorMap', extension.specularColorTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n\n/**\n * Materials bump Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/EXT_materials_bump\n */\nclass GLTFMaterialsBumpExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_MATERIALS_BUMP;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.bumpScale = extension.bumpFactor !== undefined ? extension.bumpFactor : 1.0;\n\n\t\tif ( extension.bumpTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'bumpMap', extension.bumpTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials anisotropy Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_anisotropy\n */\nclass GLTFMaterialsAnisotropyExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_ANISOTROPY;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.anisotropyStrength !== undefined ) {\n\n\t\t\tmaterialParams.anisotropy = extension.anisotropyStrength;\n\n\t\t}\n\n\t\tif ( extension.anisotropyRotation !== undefined ) {\n\n\t\t\tmaterialParams.anisotropyRotation = extension.anisotropyRotation;\n\n\t\t}\n\n\t\tif ( extension.anisotropyTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'anisotropyMap', extension.anisotropyTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * BasisU Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu\n */\nclass GLTFTextureBasisUExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_BASISU;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ this.name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ this.name ];\n\t\tconst loader = parser.options.ktx2Loader;\n\n\t\tif ( ! loader ) {\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures' );\n\n\t\t\t} else {\n\n\t\t\t\t// Assumes that the extension is optional and that a fallback texture is present\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t}\n\n}\n\n/**\n * WebP Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_webp\n */\nclass GLTFTextureWebPExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_TEXTURE_WEBP;\n\t\tthis.isSupported = null;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst name = this.name;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ name ];\n\t\tconst source = json.images[ extension.source ];\n\n\t\tlet loader = parser.textureLoader;\n\t\tif ( source.uri ) {\n\n\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.detectSupport().then( function ( isSupported ) {\n\n\t\t\tif ( isSupported ) return parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: WebP required by asset but unsupported.' );\n\n\t\t\t}\n\n\t\t\t// Fall back to PNG or JPEG.\n\t\t\treturn parser.loadTexture( textureIndex );\n\n\t\t} );\n\n\t}\n\n\tdetectSupport() {\n\n\t\tif ( ! this.isSupported ) {\n\n\t\t\tthis.isSupported = new Promise( function ( resolve ) {\n\n\t\t\t\tconst image = new Image();\n\n\t\t\t\t// Lossy test image. Support for lossy images doesn't guarantee support for all\n\t\t\t\t// WebP images, unfortunately.\n\t\t\t\timage.src = 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA';\n\n\t\t\t\timage.onload = image.onerror = function () {\n\n\t\t\t\t\tresolve( image.height === 1 );\n\n\t\t\t\t};\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn this.isSupported;\n\n\t}\n\n}\n\n/**\n * AVIF Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_avif\n */\nclass GLTFTextureAVIFExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_TEXTURE_AVIF;\n\t\tthis.isSupported = null;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst name = this.name;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ name ];\n\t\tconst source = json.images[ extension.source ];\n\n\t\tlet loader = parser.textureLoader;\n\t\tif ( source.uri ) {\n\n\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.detectSupport().then( function ( isSupported ) {\n\n\t\t\tif ( isSupported ) return parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: AVIF required by asset but unsupported.' );\n\n\t\t\t}\n\n\t\t\t// Fall back to PNG or JPEG.\n\t\t\treturn parser.loadTexture( textureIndex );\n\n\t\t} );\n\n\t}\n\n\tdetectSupport() {\n\n\t\tif ( ! this.isSupported ) {\n\n\t\t\tthis.isSupported = new Promise( function ( resolve ) {\n\n\t\t\t\tconst image = new Image();\n\n\t\t\t\t// Lossy test image.\n\t\t\t\timage.src = 'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAABcAAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAEAAAABAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQAMAAAAABNjb2xybmNseAACAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAAB9tZGF0EgAKCBgABogQEDQgMgkQAAAAB8dSLfI=';\n\t\t\t\timage.onload = image.onerror = function () {\n\n\t\t\t\t\tresolve( image.height === 1 );\n\n\t\t\t\t};\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn this.isSupported;\n\n\t}\n\n}\n\n/**\n * meshopt BufferView Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_meshopt_compression\n */\nclass GLTFMeshoptCompression {\n\n\tconstructor( parser ) {\n\n\t\tthis.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION;\n\t\tthis.parser = parser;\n\n\t}\n\n\tloadBufferView( index ) {\n\n\t\tconst json = this.parser.json;\n\t\tconst bufferView = json.bufferViews[ index ];\n\n\t\tif ( bufferView.extensions && bufferView.extensions[ this.name ] ) {\n\n\t\t\tconst extensionDef = bufferView.extensions[ this.name ];\n\n\t\t\tconst buffer = this.parser.getDependency( 'buffer', extensionDef.buffer );\n\t\t\tconst decoder = this.parser.options.meshoptDecoder;\n\n\t\t\tif ( ! decoder || ! decoder.supported ) {\n\n\t\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Assumes that the extension is optional and that fallback buffer data is present\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn buffer.then( function ( res ) {\n\n\t\t\t\tconst byteOffset = extensionDef.byteOffset || 0;\n\t\t\t\tconst byteLength = extensionDef.byteLength || 0;\n\n\t\t\t\tconst count = extensionDef.count;\n\t\t\t\tconst stride = extensionDef.byteStride;\n\n\t\t\t\tconst source = new Uint8Array( res, byteOffset, byteLength );\n\n\t\t\t\tif ( decoder.decodeGltfBufferAsync ) {\n\n\t\t\t\t\treturn decoder.decodeGltfBufferAsync( count, stride, source, extensionDef.mode, extensionDef.filter ).then( function ( res ) {\n\n\t\t\t\t\t\treturn res.buffer;\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Support for MeshoptDecoder 0.18 or earlier, without decodeGltfBufferAsync\n\t\t\t\t\treturn decoder.ready.then( function () {\n\n\t\t\t\t\t\tconst result = new ArrayBuffer( count * stride );\n\t\t\t\t\t\tdecoder.decodeGltfBuffer( new Uint8Array( result ), count, stride, source, extensionDef.mode, extensionDef.filter );\n\t\t\t\t\t\treturn result;\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * GPU Instancing Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_mesh_gpu_instancing\n *\n */\nclass GLTFMeshGpuInstancing {\n\n\tconstructor( parser ) {\n\n\t\tthis.name = EXTENSIONS.EXT_MESH_GPU_INSTANCING;\n\t\tthis.parser = parser;\n\n\t}\n\n\tcreateNodeMesh( nodeIndex ) {\n\n\t\tconst json = this.parser.json;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tif ( ! nodeDef.extensions || ! nodeDef.extensions[ this.name ] ||\n\t\t\tnodeDef.mesh === undefined ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst meshDef = json.meshes[ nodeDef.mesh ];\n\n\t\t// No Points or Lines + Instancing support yet\n\n\t\tfor ( const primitive of meshDef.primitives ) {\n\n\t\t\tif ( primitive.mode !== WEBGL_CONSTANTS.TRIANGLES &&\n\t\t\t\t primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_STRIP &&\n\t\t\t\t primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_FAN &&\n\t\t\t\t primitive.mode !== undefined ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst extensionDef = nodeDef.extensions[ this.name ];\n\t\tconst attributesDef = extensionDef.attributes;\n\n\t\t// @TODO: Can we support InstancedMesh + SkinnedMesh?\n\n\t\tconst pending = [];\n\t\tconst attributes = {};\n\n\t\tfor ( const key in attributesDef ) {\n\n\t\t\tpending.push( this.parser.getDependency( 'accessor', attributesDef[ key ] ).then( accessor => {\n\n\t\t\t\tattributes[ key ] = accessor;\n\t\t\t\treturn attributes[ key ];\n\n\t\t\t} ) );\n\n\t\t}\n\n\t\tif ( pending.length < 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tpending.push( this.parser.createNodeMesh( nodeIndex ) );\n\n\t\treturn Promise.all( pending ).then( results => {\n\n\t\t\tconst nodeObject = results.pop();\n\t\t\tconst meshes = nodeObject.isGroup ? nodeObject.children : [ nodeObject ];\n\t\t\tconst count = results[ 0 ].count; // All attribute counts should be same\n\t\t\tconst instancedMeshes = [];\n\n\t\t\tfor ( const mesh of meshes ) {\n\n\t\t\t\t// Temporal variables\n\t\t\t\tconst m = new Matrix4();\n\t\t\t\tconst p = new Vector3();\n\t\t\t\tconst q = new Quaternion();\n\t\t\t\tconst s = new Vector3( 1, 1, 1 );\n\n\t\t\t\tconst instancedMesh = new InstancedMesh( mesh.geometry, mesh.material, count );\n\n\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\tif ( attributes.TRANSLATION ) {\n\n\t\t\t\t\t\tp.fromBufferAttribute( attributes.TRANSLATION, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.ROTATION ) {\n\n\t\t\t\t\t\tq.fromBufferAttribute( attributes.ROTATION, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.SCALE ) {\n\n\t\t\t\t\t\ts.fromBufferAttribute( attributes.SCALE, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tinstancedMesh.setMatrixAt( i, m.compose( p, q, s ) );\n\n\t\t\t\t}\n\n\t\t\t\t// Add instance attributes to the geometry, excluding TRS.\n\t\t\t\tfor ( const attributeName in attributes ) {\n\n\t\t\t\t\tif ( attributeName === '_COLOR_0' ) {\n\n\t\t\t\t\t\tconst attr = attributes[ attributeName ];\n\t\t\t\t\t\tinstancedMesh.instanceColor = new InstancedBufferAttribute( attr.array, attr.itemSize, attr.normalized );\n\n\t\t\t\t\t} else if ( attributeName !== 'TRANSLATION' &&\n\t\t\t\t\t\t attributeName !== 'ROTATION' &&\n\t\t\t\t\t\t attributeName !== 'SCALE' ) {\n\n\t\t\t\t\t\tmesh.geometry.setAttribute( attributeName, attributes[ attributeName ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Just in case\n\t\t\t\tObject3D.prototype.copy.call( instancedMesh, mesh );\n\n\t\t\t\tthis.parser.assignFinalMaterial( instancedMesh );\n\n\t\t\t\tinstancedMeshes.push( instancedMesh );\n\n\t\t\t}\n\n\t\t\tif ( nodeObject.isGroup ) {\n\n\t\t\t\tnodeObject.clear();\n\n\t\t\t\tnodeObject.add( ... instancedMeshes );\n\n\t\t\t\treturn nodeObject;\n\n\t\t\t}\n\n\t\t\treturn instancedMeshes[ 0 ];\n\n\t\t} );\n\n\t}\n\n}\n\n/* BINARY EXTENSION */\nconst BINARY_EXTENSION_HEADER_MAGIC = 'glTF';\nconst BINARY_EXTENSION_HEADER_LENGTH = 12;\nconst BINARY_EXTENSION_CHUNK_TYPES = { JSON: 0x4E4F534A, BIN: 0x004E4942 };\n\nclass GLTFBinaryExtension {\n\n\tconstructor( data ) {\n\n\t\tthis.name = EXTENSIONS.KHR_BINARY_GLTF;\n\t\tthis.content = null;\n\t\tthis.body = null;\n\n\t\tconst headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tconst textDecoder = new TextDecoder();\n\n\t\tthis.header = {\n\t\t\tmagic: textDecoder.decode( new Uint8Array( data.slice( 0, 4 ) ) ),\n\t\t\tversion: headerView.getUint32( 4, true ),\n\t\t\tlength: headerView.getUint32( 8, true )\n\t\t};\n\n\t\tif ( this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported glTF-Binary header.' );\n\n\t\t} else if ( this.header.version < 2.0 ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Legacy binary file detected.' );\n\n\t\t}\n\n\t\tconst chunkContentsLength = this.header.length - BINARY_EXTENSION_HEADER_LENGTH;\n\t\tconst chunkView = new DataView( data, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tlet chunkIndex = 0;\n\n\t\twhile ( chunkIndex < chunkContentsLength ) {\n\n\t\t\tconst chunkLength = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tconst chunkType = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tif ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON ) {\n\n\t\t\t\tconst contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength );\n\t\t\t\tthis.content = textDecoder.decode( contentArray );\n\n\t\t\t} else if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN ) {\n\n\t\t\t\tconst byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex;\n\t\t\t\tthis.body = data.slice( byteOffset, byteOffset + chunkLength );\n\n\t\t\t}\n\n\t\t\t// Clients must ignore chunks with unknown types.\n\n\t\t\tchunkIndex += chunkLength;\n\n\t\t}\n\n\t\tif ( this.content === null ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: JSON content not found.' );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * DRACO Mesh Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression\n */\nclass GLTFDracoMeshCompressionExtension {\n\n\tconstructor( json, dracoLoader ) {\n\n\t\tif ( ! dracoLoader ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: No DRACOLoader instance provided.' );\n\n\t\t}\n\n\t\tthis.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION;\n\t\tthis.json = json;\n\t\tthis.dracoLoader = dracoLoader;\n\t\tthis.dracoLoader.preload();\n\n\t}\n\n\tdecodePrimitive( primitive, parser ) {\n\n\t\tconst json = this.json;\n\t\tconst dracoLoader = this.dracoLoader;\n\t\tconst bufferViewIndex = primitive.extensions[ this.name ].bufferView;\n\t\tconst gltfAttributeMap = primitive.extensions[ this.name ].attributes;\n\t\tconst threeAttributeMap = {};\n\t\tconst attributeNormalizedMap = {};\n\t\tconst attributeTypeMap = {};\n\n\t\tfor ( const attributeName in gltfAttributeMap ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tthreeAttributeMap[ threeAttributeName ] = gltfAttributeMap[ attributeName ];\n\n\t\t}\n\n\t\tfor ( const attributeName in primitive.attributes ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tif ( gltfAttributeMap[ attributeName ] !== undefined ) {\n\n\t\t\t\tconst accessorDef = json.accessors[ primitive.attributes[ attributeName ] ];\n\t\t\t\tconst componentType = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t\tattributeTypeMap[ threeAttributeName ] = componentType.name;\n\t\t\t\tattributeNormalizedMap[ threeAttributeName ] = accessorDef.normalized === true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) {\n\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tdracoLoader.decodeDracoFile( bufferView, function ( geometry ) {\n\n\t\t\t\t\tfor ( const attributeName in geometry.attributes ) {\n\n\t\t\t\t\t\tconst attribute = geometry.attributes[ attributeName ];\n\t\t\t\t\t\tconst normalized = attributeNormalizedMap[ attributeName ];\n\n\t\t\t\t\t\tif ( normalized !== undefined ) attribute.normalized = normalized;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve( geometry );\n\n\t\t\t\t}, threeAttributeMap, attributeTypeMap, LinearSRGBColorSpace, reject );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Texture Transform Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform\n */\nclass GLTFTextureTransformExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM;\n\n\t}\n\n\textendTexture( texture, transform ) {\n\n\t\tif ( ( transform.texCoord === undefined || transform.texCoord === texture.channel )\n\t\t\t&& transform.offset === undefined\n\t\t\t&& transform.rotation === undefined\n\t\t\t&& transform.scale === undefined ) {\n\n\t\t\t// See https://github.com/mrdoob/three.js/issues/21819.\n\t\t\treturn texture;\n\n\t\t}\n\n\t\ttexture = texture.clone();\n\n\t\tif ( transform.texCoord !== undefined ) {\n\n\t\t\ttexture.channel = transform.texCoord;\n\n\t\t}\n\n\t\tif ( transform.offset !== undefined ) {\n\n\t\t\ttexture.offset.fromArray( transform.offset );\n\n\t\t}\n\n\t\tif ( transform.rotation !== undefined ) {\n\n\t\t\ttexture.rotation = transform.rotation;\n\n\t\t}\n\n\t\tif ( transform.scale !== undefined ) {\n\n\t\t\ttexture.repeat.fromArray( transform.scale );\n\n\t\t}\n\n\t\ttexture.needsUpdate = true;\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Mesh Quantization Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization\n */\nclass GLTFMeshQuantizationExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MESH_QUANTIZATION;\n\n\t}\n\n}\n\n/*********************************/\n/********** INTERPOLATION ********/\n/*********************************/\n\n// Spline Interpolation\n// Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation\nclass GLTFCubicSplineInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tcopySampleValue_( index ) {\n\n\t\t// Copies a sample value to the result buffer. See description of glTF\n\t\t// CUBICSPLINE values layout in interpolate_() function below.\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tvalueSize = this.valueSize,\n\t\t\toffset = index * valueSize * 3 + valueSize;\n\n\t\tfor ( let i = 0; i !== valueSize; i ++ ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer;\n\t\tconst values = this.sampleValues;\n\t\tconst stride = this.valueSize;\n\n\t\tconst stride2 = stride * 2;\n\t\tconst stride3 = stride * 3;\n\n\t\tconst td = t1 - t0;\n\n\t\tconst p = ( t - t0 ) / td;\n\t\tconst pp = p * p;\n\t\tconst ppp = pp * p;\n\n\t\tconst offset1 = i1 * stride3;\n\t\tconst offset0 = offset1 - stride3;\n\n\t\tconst s2 = - 2 * ppp + 3 * pp;\n\t\tconst s3 = ppp - pp;\n\t\tconst s0 = 1 - s2;\n\t\tconst s1 = s3 - pp + p;\n\n\t\t// Layout of keyframe output values for CUBICSPLINE animations:\n\t\t// [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ]\n\t\tfor ( let i = 0; i !== stride; i ++ ) {\n\n\t\t\tconst p0 = values[ offset0 + i + stride ]; // splineVertex_k\n\t\t\tconst m0 = values[ offset0 + i + stride2 ] * td; // outTangent_k * (t_k+1 - t_k)\n\t\t\tconst p1 = values[ offset1 + i + stride ]; // splineVertex_k+1\n\t\t\tconst m1 = values[ offset1 + i ] * td; // inTangent_k+1 * (t_k+1 - t_k)\n\n\t\t\tresult[ i ] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\nconst _q = new Quaternion();\n\nclass GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant {\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = super.interpolate_( i1, t0, t, t1 );\n\n\t\t_q.fromArray( result ).normalize().toArray( result );\n\n\t\treturn result;\n\n\t}\n\n}\n\n\n/*********************************/\n/********** INTERNALS ************/\n/*********************************/\n\n/* CONSTANTS */\n\nconst WEBGL_CONSTANTS = {\n\tFLOAT: 5126,\n\t//FLOAT_MAT2: 35674,\n\tFLOAT_MAT3: 35675,\n\tFLOAT_MAT4: 35676,\n\tFLOAT_VEC2: 35664,\n\tFLOAT_VEC3: 35665,\n\tFLOAT_VEC4: 35666,\n\tLINEAR: 9729,\n\tREPEAT: 10497,\n\tSAMPLER_2D: 35678,\n\tPOINTS: 0,\n\tLINES: 1,\n\tLINE_LOOP: 2,\n\tLINE_STRIP: 3,\n\tTRIANGLES: 4,\n\tTRIANGLE_STRIP: 5,\n\tTRIANGLE_FAN: 6,\n\tUNSIGNED_BYTE: 5121,\n\tUNSIGNED_SHORT: 5123\n};\n\nconst WEBGL_COMPONENT_TYPES = {\n\t5120: Int8Array,\n\t5121: Uint8Array,\n\t5122: Int16Array,\n\t5123: Uint16Array,\n\t5125: Uint32Array,\n\t5126: Float32Array\n};\n\nconst WEBGL_FILTERS = {\n\t9728: NearestFilter,\n\t9729: LinearFilter,\n\t9984: NearestMipmapNearestFilter,\n\t9985: LinearMipmapNearestFilter,\n\t9986: NearestMipmapLinearFilter,\n\t9987: LinearMipmapLinearFilter\n};\n\nconst WEBGL_WRAPPINGS = {\n\t33071: ClampToEdgeWrapping,\n\t33648: MirroredRepeatWrapping,\n\t10497: RepeatWrapping\n};\n\nconst WEBGL_TYPE_SIZES = {\n\t'SCALAR': 1,\n\t'VEC2': 2,\n\t'VEC3': 3,\n\t'VEC4': 4,\n\t'MAT2': 4,\n\t'MAT3': 9,\n\t'MAT4': 16\n};\n\nconst ATTRIBUTES = {\n\tPOSITION: 'position',\n\tNORMAL: 'normal',\n\tTANGENT: 'tangent',\n\tTEXCOORD_0: 'uv',\n\tTEXCOORD_1: 'uv1',\n\tTEXCOORD_2: 'uv2',\n\tTEXCOORD_3: 'uv3',\n\tCOLOR_0: 'color',\n\tWEIGHTS_0: 'skinWeight',\n\tJOINTS_0: 'skinIndex',\n};\n\nconst PATH_PROPERTIES = {\n\tscale: 'scale',\n\ttranslation: 'position',\n\trotation: 'quaternion',\n\tweights: 'morphTargetInfluences'\n};\n\nconst INTERPOLATION = {\n\tCUBICSPLINE: undefined, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each\n\t\t // keyframe track will be initialized with a default interpolation type, then modified.\n\tLINEAR: InterpolateLinear,\n\tSTEP: InterpolateDiscrete\n};\n\nconst ALPHA_MODES = {\n\tOPAQUE: 'OPAQUE',\n\tMASK: 'MASK',\n\tBLEND: 'BLEND'\n};\n\n/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material\n */\nfunction createDefaultMaterial( cache ) {\n\n\tif ( cache[ 'DefaultMaterial' ] === undefined ) {\n\n\t\tcache[ 'DefaultMaterial' ] = new MeshStandardMaterial( {\n\t\t\tcolor: 0xFFFFFF,\n\t\t\temissive: 0x000000,\n\t\t\tmetalness: 1,\n\t\t\troughness: 1,\n\t\t\ttransparent: false,\n\t\t\tdepthTest: true,\n\t\t\tside: FrontSide\n\t\t} );\n\n\t}\n\n\treturn cache[ 'DefaultMaterial' ];\n\n}\n\nfunction addUnknownExtensionsToUserData( knownExtensions, object, objectDef ) {\n\n\t// Add unknown glTF extensions to an object's userData.\n\n\tfor ( const name in objectDef.extensions ) {\n\n\t\tif ( knownExtensions[ name ] === undefined ) {\n\n\t\t\tobject.userData.gltfExtensions = object.userData.gltfExtensions || {};\n\t\t\tobject.userData.gltfExtensions[ name ] = objectDef.extensions[ name ];\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @param {Object3D|Material|BufferGeometry} object\n * @param {GLTF.definition} gltfDef\n */\nfunction assignExtrasToUserData( object, gltfDef ) {\n\n\tif ( gltfDef.extras !== undefined ) {\n\n\t\tif ( typeof gltfDef.extras === 'object' ) {\n\n\t\t\tObject.assign( object.userData, gltfDef.extras );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets\n *\n * @param {BufferGeometry} geometry\n * @param {Array<GLTF.Target>} targets\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\nfunction addMorphTargets( geometry, targets, parser ) {\n\n\tlet hasMorphPosition = false;\n\tlet hasMorphNormal = false;\n\tlet hasMorphColor = false;\n\n\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\tconst target = targets[ i ];\n\n\t\tif ( target.POSITION !== undefined ) hasMorphPosition = true;\n\t\tif ( target.NORMAL !== undefined ) hasMorphNormal = true;\n\t\tif ( target.COLOR_0 !== undefined ) hasMorphColor = true;\n\n\t\tif ( hasMorphPosition && hasMorphNormal && hasMorphColor ) break;\n\n\t}\n\n\tif ( ! hasMorphPosition && ! hasMorphNormal && ! hasMorphColor ) return Promise.resolve( geometry );\n\n\tconst pendingPositionAccessors = [];\n\tconst pendingNormalAccessors = [];\n\tconst pendingColorAccessors = [];\n\n\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\tconst target = targets[ i ];\n\n\t\tif ( hasMorphPosition ) {\n\n\t\t\tconst pendingAccessor = target.POSITION !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.POSITION )\n\t\t\t\t: geometry.attributes.position;\n\n\t\t\tpendingPositionAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t\tif ( hasMorphNormal ) {\n\n\t\t\tconst pendingAccessor = target.NORMAL !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.NORMAL )\n\t\t\t\t: geometry.attributes.normal;\n\n\t\t\tpendingNormalAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t\tif ( hasMorphColor ) {\n\n\t\t\tconst pendingAccessor = target.COLOR_0 !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.COLOR_0 )\n\t\t\t\t: geometry.attributes.color;\n\n\t\t\tpendingColorAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t}\n\n\treturn Promise.all( [\n\t\tPromise.all( pendingPositionAccessors ),\n\t\tPromise.all( pendingNormalAccessors ),\n\t\tPromise.all( pendingColorAccessors )\n\t] ).then( function ( accessors ) {\n\n\t\tconst morphPositions = accessors[ 0 ];\n\t\tconst morphNormals = accessors[ 1 ];\n\t\tconst morphColors = accessors[ 2 ];\n\n\t\tif ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions;\n\t\tif ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals;\n\t\tif ( hasMorphColor ) geometry.morphAttributes.color = morphColors;\n\t\tgeometry.morphTargetsRelative = true;\n\n\t\treturn geometry;\n\n\t} );\n\n}\n\n/**\n * @param {Mesh} mesh\n * @param {GLTF.Mesh} meshDef\n */\nfunction updateMorphTargets( mesh, meshDef ) {\n\n\tmesh.updateMorphTargets();\n\n\tif ( meshDef.weights !== undefined ) {\n\n\t\tfor ( let i = 0, il = meshDef.weights.length; i < il; i ++ ) {\n\n\t\t\tmesh.morphTargetInfluences[ i ] = meshDef.weights[ i ];\n\n\t\t}\n\n\t}\n\n\t// .extras has user-defined data, so check that .extras.targetNames is an array.\n\tif ( meshDef.extras && Array.isArray( meshDef.extras.targetNames ) ) {\n\n\t\tconst targetNames = meshDef.extras.targetNames;\n\n\t\tif ( mesh.morphTargetInfluences.length === targetNames.length ) {\n\n\t\t\tmesh.morphTargetDictionary = {};\n\n\t\t\tfor ( let i = 0, il = targetNames.length; i < il; i ++ ) {\n\n\t\t\t\tmesh.morphTargetDictionary[ targetNames[ i ] ] = i;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.' );\n\n\t\t}\n\n\t}\n\n}\n\nfunction createPrimitiveKey( primitiveDef ) {\n\n\tlet geometryKey;\n\n\tconst dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ];\n\n\tif ( dracoExtension ) {\n\n\t\tgeometryKey = 'draco:' + dracoExtension.bufferView\n\t\t\t\t+ ':' + dracoExtension.indices\n\t\t\t\t+ ':' + createAttributesKey( dracoExtension.attributes );\n\n\t} else {\n\n\t\tgeometryKey = primitiveDef.indices + ':' + createAttributesKey( primitiveDef.attributes ) + ':' + primitiveDef.mode;\n\n\t}\n\n\tif ( primitiveDef.targets !== undefined ) {\n\n\t\tfor ( let i = 0, il = primitiveDef.targets.length; i < il; i ++ ) {\n\n\t\t\tgeometryKey += ':' + createAttributesKey( primitiveDef.targets[ i ] );\n\n\t\t}\n\n\t}\n\n\treturn geometryKey;\n\n}\n\nfunction createAttributesKey( attributes ) {\n\n\tlet attributesKey = '';\n\n\tconst keys = Object.keys( attributes ).sort();\n\n\tfor ( let i = 0, il = keys.length; i < il; i ++ ) {\n\n\t\tattributesKey += keys[ i ] + ':' + attributes[ keys[ i ] ] + ';';\n\n\t}\n\n\treturn attributesKey;\n\n}\n\nfunction getNormalizedComponentScale( constructor ) {\n\n\t// Reference:\n\t// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization#encoding-quantized-data\n\n\tswitch ( constructor ) {\n\n\t\tcase Int8Array:\n\t\t\treturn 1 / 127;\n\n\t\tcase Uint8Array:\n\t\t\treturn 1 / 255;\n\n\t\tcase Int16Array:\n\t\t\treturn 1 / 32767;\n\n\t\tcase Uint16Array:\n\t\t\treturn 1 / 65535;\n\n\t\tdefault:\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported normalized accessor component type.' );\n\n\t}\n\n}\n\nfunction getImageURIMimeType( uri ) {\n\n\tif ( uri.search( /\\.jpe?g($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/jpeg/ ) === 0 ) return 'image/jpeg';\n\tif ( uri.search( /\\.webp($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/webp/ ) === 0 ) return 'image/webp';\n\tif ( uri.search( /\\.ktx2($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/ktx2/ ) === 0 ) return 'image/ktx2';\n\n\treturn 'image/png';\n\n}\n\nconst _identityMatrix = new Matrix4();\n\n/* GLTF PARSER */\n\nclass GLTFParser {\n\n\tconstructor( json = {}, options = {} ) {\n\n\t\tthis.json = json;\n\t\tthis.extensions = {};\n\t\tthis.plugins = {};\n\t\tthis.options = options;\n\n\t\t// loader object cache\n\t\tthis.cache = new GLTFRegistry();\n\n\t\t// associations between Three.js objects and glTF elements\n\t\tthis.associations = new Map();\n\n\t\t// BufferGeometry caching\n\t\tthis.primitiveCache = {};\n\n\t\t// Node cache\n\t\tthis.nodeCache = {};\n\n\t\t// Object3D instance caches\n\t\tthis.meshCache = { refs: {}, uses: {} };\n\t\tthis.cameraCache = { refs: {}, uses: {} };\n\t\tthis.lightCache = { refs: {}, uses: {} };\n\n\t\tthis.sourceCache = {};\n\t\tthis.textureCache = {};\n\n\t\t// Track node names, to ensure no duplicates\n\t\tthis.nodeNamesUsed = {};\n\n\t\t// Use an ImageBitmapLoader if imageBitmaps are supported. Moves much of the\n\t\t// expensive work of uploading a texture to the GPU off the main thread.\n\n\t\tlet isSafari = false;\n\t\tlet safariVersion = - 1;\n\t\tlet isFirefox = false;\n\t\tlet firefoxVersion = - 1;\n\n\t\tif ( typeof navigator !== 'undefined' ) {\n\n\t\t\tconst userAgent = navigator.userAgent;\n\n\t\t\tisSafari = /^((?!chrome|android).)*safari/i.test( userAgent ) === true;\n\t\t\tconst safariMatch = userAgent.match( /Version\\/(\\d+)/ );\n\t\t\tsafariVersion = isSafari && safariMatch ? parseInt( safariMatch[ 1 ], 10 ) : - 1;\n\n\t\t\tisFirefox = userAgent.indexOf( 'Firefox' ) > - 1;\n\t\t\tfirefoxVersion = isFirefox ? userAgent.match( /Firefox\\/([0-9]+)\\./ )[ 1 ] : - 1;\n\n\t\t}\n\n\t\tif ( typeof createImageBitmap === 'undefined' || ( isSafari && safariVersion < 17 ) || ( isFirefox && firefoxVersion < 98 ) ) {\n\n\t\t\tthis.textureLoader = new TextureLoader( this.options.manager );\n\n\t\t} else {\n\n\t\t\tthis.textureLoader = new ImageBitmapLoader( this.options.manager );\n\n\t\t}\n\n\t\tthis.textureLoader.setCrossOrigin( this.options.crossOrigin );\n\t\tthis.textureLoader.setRequestHeader( this.options.requestHeader );\n\n\t\tthis.fileLoader = new FileLoader( this.options.manager );\n\t\tthis.fileLoader.setResponseType( 'arraybuffer' );\n\n\t\tif ( this.options.crossOrigin === 'use-credentials' ) {\n\n\t\t\tthis.fileLoader.setWithCredentials( true );\n\n\t\t}\n\n\t}\n\n\tsetExtensions( extensions ) {\n\n\t\tthis.extensions = extensions;\n\n\t}\n\n\tsetPlugins( plugins ) {\n\n\t\tthis.plugins = plugins;\n\n\t}\n\n\tparse( onLoad, onError ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\n\t\t// Clear the loader cache\n\t\tthis.cache.removeAll();\n\t\tthis.nodeCache = {};\n\n\t\t// Mark the special nodes/meshes in json for efficient parse\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\treturn ext._markDefs && ext._markDefs();\n\n\t\t} );\n\n\t\tPromise.all( this._invokeAll( function ( ext ) {\n\n\t\t\treturn ext.beforeRoot && ext.beforeRoot();\n\n\t\t} ) ).then( function () {\n\n\t\t\treturn Promise.all( [\n\n\t\t\t\tparser.getDependencies( 'scene' ),\n\t\t\t\tparser.getDependencies( 'animation' ),\n\t\t\t\tparser.getDependencies( 'camera' ),\n\n\t\t\t] );\n\n\t\t} ).then( function ( dependencies ) {\n\n\t\t\tconst result = {\n\t\t\t\tscene: dependencies[ 0 ][ json.scene || 0 ],\n\t\t\t\tscenes: dependencies[ 0 ],\n\t\t\t\tanimations: dependencies[ 1 ],\n\t\t\t\tcameras: dependencies[ 2 ],\n\t\t\t\tasset: json.asset,\n\t\t\t\tparser: parser,\n\t\t\t\tuserData: {}\n\t\t\t};\n\n\t\t\taddUnknownExtensionsToUserData( extensions, result, json );\n\n\t\t\tassignExtrasToUserData( result, json );\n\n\t\t\treturn Promise.all( parser._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.afterRoot && ext.afterRoot( result );\n\n\t\t\t} ) ).then( function () {\n\n\t\t\t\tfor ( const scene of result.scenes ) {\n\n\t\t\t\t\tscene.updateMatrixWorld();\n\n\t\t\t\t}\n\n\t\t\t\tonLoad( result );\n\n\t\t\t} );\n\n\t\t} ).catch( onError );\n\n\t}\n\n\t/**\n\t * Marks the special nodes/meshes in json for efficient parse.\n\t */\n\t_markDefs() {\n\n\t\tconst nodeDefs = this.json.nodes || [];\n\t\tconst skinDefs = this.json.skins || [];\n\t\tconst meshDefs = this.json.meshes || [];\n\n\t\t// Nothing in the node definition indicates whether it is a Bone or an\n\t\t// Object3D. Use the skins' joint references to mark bones.\n\t\tfor ( let skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex ++ ) {\n\n\t\t\tconst joints = skinDefs[ skinIndex ].joints;\n\n\t\t\tfor ( let i = 0, il = joints.length; i < il; i ++ ) {\n\n\t\t\t\tnodeDefs[ joints[ i ] ].isBone = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Iterate over all nodes, marking references to shared resources,\n\t\t// as well as skeleton joints.\n\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.mesh !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.meshCache, nodeDef.mesh );\n\n\t\t\t\t// Nothing in the mesh definition indicates whether it is\n\t\t\t\t// a SkinnedMesh or Mesh. Use the node's mesh reference\n\t\t\t\t// to mark SkinnedMesh if node has skin.\n\t\t\t\tif ( nodeDef.skin !== undefined ) {\n\n\t\t\t\t\tmeshDefs[ nodeDef.mesh ].isSkinnedMesh = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.cameraCache, nodeDef.camera );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Counts references to shared node / Object3D resources. These resources\n\t * can be reused, or \"instantiated\", at multiple nodes in the scene\n\t * hierarchy. Mesh, Camera, and Light instances are instantiated and must\n\t * be marked. Non-scenegraph resources (like Materials, Geometries, and\n\t * Textures) can be reused directly and are not marked here.\n\t *\n\t * Example: CesiumMilkTruck sample model reuses \"Wheel\" meshes.\n\t */\n\t_addNodeRef( cache, index ) {\n\n\t\tif ( index === undefined ) return;\n\n\t\tif ( cache.refs[ index ] === undefined ) {\n\n\t\t\tcache.refs[ index ] = cache.uses[ index ] = 0;\n\n\t\t}\n\n\t\tcache.refs[ index ] ++;\n\n\t}\n\n\t/** Returns a reference to a shared resource, cloning it if necessary. */\n\t_getNodeRef( cache, index, object ) {\n\n\t\tif ( cache.refs[ index ] <= 1 ) return object;\n\n\t\tconst ref = object.clone();\n\n\t\t// Propagates mappings to the cloned object, prevents mappings on the\n\t\t// original object from being lost.\n\t\tconst updateMappings = ( original, clone ) => {\n\n\t\t\tconst mappings = this.associations.get( original );\n\t\t\tif ( mappings != null ) {\n\n\t\t\t\tthis.associations.set( clone, mappings );\n\n\t\t\t}\n\n\t\t\tfor ( const [ i, child ] of original.children.entries() ) {\n\n\t\t\t\tupdateMappings( child, clone.children[ i ] );\n\n\t\t\t}\n\n\t\t};\n\n\t\tupdateMappings( object, ref );\n\n\t\tref.name += '_instance_' + ( cache.uses[ index ] ++ );\n\n\t\treturn ref;\n\n\t}\n\n\t_invokeOne( func ) {\n\n\t\tconst extensions = Object.values( this.plugins );\n\t\textensions.push( this );\n\n\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tconst result = func( extensions[ i ] );\n\n\t\t\tif ( result ) return result;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t_invokeAll( func ) {\n\n\t\tconst extensions = Object.values( this.plugins );\n\t\textensions.unshift( this );\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tconst result = func( extensions[ i ] );\n\n\t\t\tif ( result ) pending.push( result );\n\n\t\t}\n\n\t\treturn pending;\n\n\t}\n\n\t/**\n\t * Requests the specified dependency asynchronously, with caching.\n\t * @param {string} type\n\t * @param {number} index\n\t * @return {Promise<Object3D|Material|THREE.Texture|AnimationClip|ArrayBuffer|Object>}\n\t */\n\tgetDependency( type, index ) {\n\n\t\tconst cacheKey = type + ':' + index;\n\t\tlet dependency = this.cache.get( cacheKey );\n\n\t\tif ( ! dependency ) {\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 'scene':\n\t\t\t\t\tdependency = this.loadScene( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'node':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadNode && ext.loadNode( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'mesh':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMesh && ext.loadMesh( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'accessor':\n\t\t\t\t\tdependency = this.loadAccessor( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bufferView':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadBufferView && ext.loadBufferView( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'buffer':\n\t\t\t\t\tdependency = this.loadBuffer( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'material':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMaterial && ext.loadMaterial( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'texture':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadTexture && ext.loadTexture( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'skin':\n\t\t\t\t\tdependency = this.loadSkin( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'animation':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadAnimation && ext.loadAnimation( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'camera':\n\t\t\t\t\tdependency = this.loadCamera( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext != this && ext.getDependency && ext.getDependency( type, index );\n\n\t\t\t\t\t} );\n\n\t\t\t\t\tif ( ! dependency ) {\n\n\t\t\t\t\t\tthrow new Error( 'Unknown type: ' + type );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tthis.cache.add( cacheKey, dependency );\n\n\t\t}\n\n\t\treturn dependency;\n\n\t}\n\n\t/**\n\t * Requests all dependencies of the specified type asynchronously, with caching.\n\t * @param {string} type\n\t * @return {Promise<Array<Object>>}\n\t */\n\tgetDependencies( type ) {\n\n\t\tlet dependencies = this.cache.get( type );\n\n\t\tif ( ! dependencies ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst defs = this.json[ type + ( type === 'mesh' ? 'es' : 's' ) ] || [];\n\n\t\t\tdependencies = Promise.all( defs.map( function ( def, index ) {\n\n\t\t\t\treturn parser.getDependency( type, index );\n\n\t\t\t} ) );\n\n\t\t\tthis.cache.add( type, dependencies );\n\n\t\t}\n\n\t\treturn dependencies;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferIndex\n\t * @return {Promise<ArrayBuffer>}\n\t */\n\tloadBuffer( bufferIndex ) {\n\n\t\tconst bufferDef = this.json.buffers[ bufferIndex ];\n\t\tconst loader = this.fileLoader;\n\n\t\tif ( bufferDef.type && bufferDef.type !== 'arraybuffer' ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.' );\n\n\t\t}\n\n\t\t// If present, GLB container is required to be the first buffer.\n\t\tif ( bufferDef.uri === undefined && bufferIndex === 0 ) {\n\n\t\t\treturn Promise.resolve( this.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body );\n\n\t\t}\n\n\t\tconst options = this.options;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tloader.load( LoaderUtils.resolveURL( bufferDef.uri, options.path ), resolve, undefined, function () {\n\n\t\t\t\treject( new Error( 'THREE.GLTFLoader: Failed to load buffer \"' + bufferDef.uri + '\".' ) );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferViewIndex\n\t * @return {Promise<ArrayBuffer>}\n\t */\n\tloadBufferView( bufferViewIndex ) {\n\n\t\tconst bufferViewDef = this.json.bufferViews[ bufferViewIndex ];\n\n\t\treturn this.getDependency( 'buffer', bufferViewDef.buffer ).then( function ( buffer ) {\n\n\t\t\tconst byteLength = bufferViewDef.byteLength || 0;\n\t\t\tconst byteOffset = bufferViewDef.byteOffset || 0;\n\t\t\treturn buffer.slice( byteOffset, byteOffset + byteLength );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors\n\t * @param {number} accessorIndex\n\t * @return {Promise<BufferAttribute|InterleavedBufferAttribute>}\n\t */\n\tloadAccessor( accessorIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\n\t\tconst accessorDef = this.json.accessors[ accessorIndex ];\n\n\t\tif ( accessorDef.bufferView === undefined && accessorDef.sparse === undefined ) {\n\n\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\t\t\tconst normalized = accessorDef.normalized === true;\n\n\t\t\tconst array = new TypedArray( accessorDef.count * itemSize );\n\t\t\treturn Promise.resolve( new BufferAttribute( array, itemSize, normalized ) );\n\n\t\t}\n\n\t\tconst pendingBufferViews = [];\n\n\t\tif ( accessorDef.bufferView !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.bufferView ) );\n\n\t\t} else {\n\n\t\t\tpendingBufferViews.push( null );\n\n\t\t}\n\n\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.indices.bufferView ) );\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.values.bufferView ) );\n\n\t\t}\n\n\t\treturn Promise.all( pendingBufferViews ).then( function ( bufferViews ) {\n\n\t\t\tconst bufferView = bufferViews[ 0 ];\n\n\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t// For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.\n\t\t\tconst elementBytes = TypedArray.BYTES_PER_ELEMENT;\n\t\t\tconst itemBytes = elementBytes * itemSize;\n\t\t\tconst byteOffset = accessorDef.byteOffset || 0;\n\t\t\tconst byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[ accessorDef.bufferView ].byteStride : undefined;\n\t\t\tconst normalized = accessorDef.normalized === true;\n\t\t\tlet array, bufferAttribute;\n\n\t\t\t// The buffer is not interleaved if the stride is the item size in bytes.\n\t\t\tif ( byteStride && byteStride !== itemBytes ) {\n\n\t\t\t\t// Each \"slice\" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own InterleavedBuffer\n\t\t\t\t// This makes sure that IBA.count reflects accessor.count properly\n\t\t\t\tconst ibSlice = Math.floor( byteOffset / byteStride );\n\t\t\t\tconst ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count;\n\t\t\t\tlet ib = parser.cache.get( ibCacheKey );\n\n\t\t\t\tif ( ! ib ) {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes );\n\n\t\t\t\t\t// Integer parameters to IB/IBA are in array elements, not bytes.\n\t\t\t\t\tib = new InterleavedBuffer( array, byteStride / elementBytes );\n\n\t\t\t\t\tparser.cache.add( ibCacheKey, ib );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( ib, itemSize, ( byteOffset % byteStride ) / elementBytes, normalized );\n\n\t\t\t} else {\n\n\t\t\t\tif ( bufferView === null ) {\n\n\t\t\t\t\tarray = new TypedArray( accessorDef.count * itemSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, byteOffset, accessorDef.count * itemSize );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t\t\t}\n\n\t\t\t// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors\n\t\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\t\tconst itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR;\n\t\t\t\tconst TypedArrayIndices = WEBGL_COMPONENT_TYPES[ accessorDef.sparse.indices.componentType ];\n\n\t\t\t\tconst byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0;\n\t\t\t\tconst byteOffsetValues = accessorDef.sparse.values.byteOffset || 0;\n\n\t\t\t\tconst sparseIndices = new TypedArrayIndices( bufferViews[ 1 ], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices );\n\t\t\t\tconst sparseValues = new TypedArray( bufferViews[ 2 ], byteOffsetValues, accessorDef.sparse.count * itemSize );\n\n\t\t\t\tif ( bufferView !== null ) {\n\n\t\t\t\t\t// Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes.\n\t\t\t\t\tbufferAttribute = new BufferAttribute( bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized );\n\n\t\t\t\t}\n\n\t\t\t\t// Ignore normalized since we copy from sparse\n\t\t\t\tbufferAttribute.normalized = false;\n\n\t\t\t\tfor ( let i = 0, il = sparseIndices.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst index = sparseIndices[ i ];\n\n\t\t\t\t\tbufferAttribute.setX( index, sparseValues[ i * itemSize ] );\n\t\t\t\t\tif ( itemSize >= 2 ) bufferAttribute.setY( index, sparseValues[ i * itemSize + 1 ] );\n\t\t\t\t\tif ( itemSize >= 3 ) bufferAttribute.setZ( index, sparseValues[ i * itemSize + 2 ] );\n\t\t\t\t\tif ( itemSize >= 4 ) bufferAttribute.setW( index, sparseValues[ i * itemSize + 3 ] );\n\t\t\t\t\tif ( itemSize >= 5 ) throw new Error( 'THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.' );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute.normalized = normalized;\n\n\t\t\t}\n\n\t\t\treturn bufferAttribute;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures\n\t * @param {number} textureIndex\n\t * @return {Promise<THREE.Texture|null>}\n\t */\n\tloadTexture( textureIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\t\tconst textureDef = json.textures[ textureIndex ];\n\t\tconst sourceIndex = textureDef.source;\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tlet loader = this.textureLoader;\n\n\t\tif ( sourceDef.uri ) {\n\n\t\t\tconst handler = options.manager.getHandler( sourceDef.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.loadTextureImage( textureIndex, sourceIndex, loader );\n\n\t}\n\n\tloadTextureImage( textureIndex, sourceIndex, loader ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tconst cacheKey = ( sourceDef.uri || sourceDef.bufferView ) + ':' + textureDef.sampler;\n\n\t\tif ( this.textureCache[ cacheKey ] ) {\n\n\t\t\t// See https://github.com/mrdoob/three.js/issues/21559.\n\t\t\treturn this.textureCache[ cacheKey ];\n\n\t\t}\n\n\t\tconst promise = this.loadImageSource( sourceIndex, loader ).then( function ( texture ) {\n\n\t\t\ttexture.flipY = false;\n\n\t\t\ttexture.name = textureDef.name || sourceDef.name || '';\n\n\t\t\tif ( texture.name === '' && typeof sourceDef.uri === 'string' && sourceDef.uri.startsWith( 'data:image/' ) === false ) {\n\n\t\t\t\ttexture.name = sourceDef.uri;\n\n\t\t\t}\n\n\t\t\tconst samplers = json.samplers || {};\n\t\t\tconst sampler = samplers[ textureDef.sampler ] || {};\n\n\t\t\ttexture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || LinearFilter;\n\t\t\ttexture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || LinearMipmapLinearFilter;\n\t\t\ttexture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || RepeatWrapping;\n\t\t\ttexture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || RepeatWrapping;\n\t\t\ttexture.generateMipmaps = ! texture.isCompressedTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter;\n\n\t\t\tparser.associations.set( texture, { textures: textureIndex } );\n\n\t\t\treturn texture;\n\n\t\t} ).catch( function () {\n\n\t\t\treturn null;\n\n\t\t} );\n\n\t\tthis.textureCache[ cacheKey ] = promise;\n\n\t\treturn promise;\n\n\t}\n\n\tloadImageSource( sourceIndex, loader ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\n\t\tif ( this.sourceCache[ sourceIndex ] !== undefined ) {\n\n\t\t\treturn this.sourceCache[ sourceIndex ].then( ( texture ) => texture.clone() );\n\n\t\t}\n\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tconst URL = self.URL || self.webkitURL;\n\n\t\tlet sourceURI = sourceDef.uri || '';\n\t\tlet isObjectURL = false;\n\n\t\tif ( sourceDef.bufferView !== undefined ) {\n\n\t\t\t// Load binary image data from bufferView, if provided.\n\n\t\t\tsourceURI = parser.getDependency( 'bufferView', sourceDef.bufferView ).then( function ( bufferView ) {\n\n\t\t\t\tisObjectURL = true;\n\t\t\t\tconst blob = new Blob( [ bufferView ], { type: sourceDef.mimeType } );\n\t\t\t\tsourceURI = URL.createObjectURL( blob );\n\t\t\t\treturn sourceURI;\n\n\t\t\t} );\n\n\t\t} else if ( sourceDef.uri === undefined ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Image ' + sourceIndex + ' is missing URI and bufferView' );\n\n\t\t}\n\n\t\tconst promise = Promise.resolve( sourceURI ).then( function ( sourceURI ) {\n\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tlet onLoad = resolve;\n\n\t\t\t\tif ( loader.isImageBitmapLoader === true ) {\n\n\t\t\t\t\tonLoad = function ( imageBitmap ) {\n\n\t\t\t\t\t\tconst texture = new Texture( imageBitmap );\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tresolve( texture );\n\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tloader.load( LoaderUtils.resolveURL( sourceURI, options.path ), onLoad, undefined, reject );\n\n\t\t\t} );\n\n\t\t} ).then( function ( texture ) {\n\n\t\t\t// Clean up resources and configure Texture.\n\n\t\t\tif ( isObjectURL === true ) {\n\n\t\t\t\tURL.revokeObjectURL( sourceURI );\n\n\t\t\t}\n\n\t\t\tassignExtrasToUserData( texture, sourceDef );\n\n\t\t\ttexture.userData.mimeType = sourceDef.mimeType || getImageURIMimeType( sourceDef.uri );\n\n\t\t\treturn texture;\n\n\t\t} ).catch( function ( error ) {\n\n\t\t\tconsole.error( 'THREE.GLTFLoader: Couldn\\'t load texture', sourceURI );\n\t\t\tthrow error;\n\n\t\t} );\n\n\t\tthis.sourceCache[ sourceIndex ] = promise;\n\t\treturn promise;\n\n\t}\n\n\t/**\n\t * Asynchronously assigns a texture to the given material parameters.\n\t * @param {Object} materialParams\n\t * @param {string} mapName\n\t * @param {Object} mapDef\n\t * @return {Promise<Texture>}\n\t */\n\tassignTexture( materialParams, mapName, mapDef, colorSpace ) {\n\n\t\tconst parser = this;\n\n\t\treturn this.getDependency( 'texture', mapDef.index ).then( function ( texture ) {\n\n\t\t\tif ( ! texture ) return null;\n\n\t\t\tif ( mapDef.texCoord !== undefined && mapDef.texCoord > 0 ) {\n\n\t\t\t\ttexture = texture.clone();\n\t\t\t\ttexture.channel = mapDef.texCoord;\n\n\t\t\t}\n\n\t\t\tif ( parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] ) {\n\n\t\t\t\tconst transform = mapDef.extensions !== undefined ? mapDef.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] : undefined;\n\n\t\t\t\tif ( transform ) {\n\n\t\t\t\t\tconst gltfReference = parser.associations.get( texture );\n\t\t\t\t\ttexture = parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ].extendTexture( texture, transform );\n\t\t\t\t\tparser.associations.set( texture, gltfReference );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( colorSpace !== undefined ) {\n\n\t\t\t\ttexture.colorSpace = colorSpace;\n\n\t\t\t}\n\n\t\t\tmaterialParams[ mapName ] = texture;\n\n\t\t\treturn texture;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Assigns final material to a Mesh, Line, or Points instance. The instance\n\t * already has a material (generated from the glTF material options alone)\n\t * but reuse of the same glTF material may require multiple threejs materials\n\t * to accommodate different primitive types, defines, etc. New materials will\n\t * be created if necessary, and reused from a cache.\n\t * @param {Object3D} mesh Mesh, Line, or Points instance.\n\t */\n\tassignFinalMaterial( mesh ) {\n\n\t\tconst geometry = mesh.geometry;\n\t\tlet material = mesh.material;\n\n\t\tconst useDerivativeTangents = geometry.attributes.tangent === undefined;\n\t\tconst useVertexColors = geometry.attributes.color !== undefined;\n\t\tconst useFlatShading = geometry.attributes.normal === undefined;\n\n\t\tif ( mesh.isPoints ) {\n\n\t\t\tconst cacheKey = 'PointsMaterial:' + material.uuid;\n\n\t\t\tlet pointsMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! pointsMaterial ) {\n\n\t\t\t\tpointsMaterial = new PointsMaterial();\n\t\t\t\tMaterial.prototype.copy.call( pointsMaterial, material );\n\t\t\t\tpointsMaterial.color.copy( material.color );\n\t\t\t\tpointsMaterial.map = material.map;\n\t\t\t\tpointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px\n\n\t\t\t\tthis.cache.add( cacheKey, pointsMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = pointsMaterial;\n\n\t\t} else if ( mesh.isLine ) {\n\n\t\t\tconst cacheKey = 'LineBasicMaterial:' + material.uuid;\n\n\t\t\tlet lineMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! lineMaterial ) {\n\n\t\t\t\tlineMaterial = new LineBasicMaterial();\n\t\t\t\tMaterial.prototype.copy.call( lineMaterial, material );\n\t\t\t\tlineMaterial.color.copy( material.color );\n\t\t\t\tlineMaterial.map = material.map;\n\n\t\t\t\tthis.cache.add( cacheKey, lineMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = lineMaterial;\n\n\t\t}\n\n\t\t// Clone the material if it will be modified\n\t\tif ( useDerivativeTangents || useVertexColors || useFlatShading ) {\n\n\t\t\tlet cacheKey = 'ClonedMaterial:' + material.uuid + ':';\n\n\t\t\tif ( useDerivativeTangents ) cacheKey += 'derivative-tangents:';\n\t\t\tif ( useVertexColors ) cacheKey += 'vertex-colors:';\n\t\t\tif ( useFlatShading ) cacheKey += 'flat-shading:';\n\n\t\t\tlet cachedMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! cachedMaterial ) {\n\n\t\t\t\tcachedMaterial = material.clone();\n\n\t\t\t\tif ( useVertexColors ) cachedMaterial.vertexColors = true;\n\t\t\t\tif ( useFlatShading ) cachedMaterial.flatShading = true;\n\n\t\t\t\tif ( useDerivativeTangents ) {\n\n\t\t\t\t\t// https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\t\t\t\t\tif ( cachedMaterial.normalScale ) cachedMaterial.normalScale.y *= - 1;\n\t\t\t\t\tif ( cachedMaterial.clearcoatNormalScale ) cachedMaterial.clearcoatNormalScale.y *= - 1;\n\n\t\t\t\t}\n\n\t\t\t\tthis.cache.add( cacheKey, cachedMaterial );\n\n\t\t\t\tthis.associations.set( cachedMaterial, this.associations.get( material ) );\n\n\t\t\t}\n\n\t\t\tmaterial = cachedMaterial;\n\n\t\t}\n\n\t\tmesh.material = material;\n\n\t}\n\n\tgetMaterialType( /* materialIndex */ ) {\n\n\t\treturn MeshStandardMaterial;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials\n\t * @param {number} materialIndex\n\t * @return {Promise<Material>}\n\t */\n\tloadMaterial( materialIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst materialDef = json.materials[ materialIndex ];\n\n\t\tlet materialType;\n\t\tconst materialParams = {};\n\t\tconst materialExtensions = materialDef.extensions || {};\n\n\t\tconst pending = [];\n\n\t\tif ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) {\n\n\t\t\tconst kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ];\n\t\t\tmaterialType = kmuExtension.getMaterialType();\n\t\t\tpending.push( kmuExtension.extendParams( materialParams, materialDef, parser ) );\n\n\t\t} else {\n\n\t\t\t// Specification:\n\t\t\t// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material\n\n\t\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness || {};\n\n\t\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\t\tmaterialParams.opacity = 1.0;\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.setRGB( array[ 0 ], array[ 1 ], array[ 2 ], LinearSRGBColorSpace );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, SRGBColorSpace ) );\n\n\t\t\t}\n\n\t\t\tmaterialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0;\n\t\t\tmaterialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0;\n\n\t\t\tif ( metallicRoughness.metallicRoughnessTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\n\t\t\t}\n\n\t\t\tmaterialType = this._invokeOne( function ( ext ) {\n\n\t\t\t\treturn ext.getMaterialType && ext.getMaterialType( materialIndex );\n\n\t\t\t} );\n\n\t\t\tpending.push( Promise.all( this._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.extendMaterialParams && ext.extendMaterialParams( materialIndex, materialParams );\n\n\t\t\t} ) ) );\n\n\t\t}\n\n\t\tif ( materialDef.doubleSided === true ) {\n\n\t\t\tmaterialParams.side = DoubleSide;\n\n\t\t}\n\n\t\tconst alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE;\n\n\t\tif ( alphaMode === ALPHA_MODES.BLEND ) {\n\n\t\t\tmaterialParams.transparent = true;\n\n\t\t\t// See: https://github.com/mrdoob/three.js/issues/17706\n\t\t\tmaterialParams.depthWrite = false;\n\n\t\t} else {\n\n\t\t\tmaterialParams.transparent = false;\n\n\t\t\tif ( alphaMode === ALPHA_MODES.MASK ) {\n\n\t\t\t\tmaterialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.normalTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'normalMap', materialDef.normalTexture ) );\n\n\t\t\tmaterialParams.normalScale = new Vector2( 1, 1 );\n\n\t\t\tif ( materialDef.normalTexture.scale !== undefined ) {\n\n\t\t\t\tconst scale = materialDef.normalTexture.scale;\n\n\t\t\t\tmaterialParams.normalScale.set( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.occlusionTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'aoMap', materialDef.occlusionTexture ) );\n\n\t\t\tif ( materialDef.occlusionTexture.strength !== undefined ) {\n\n\t\t\t\tmaterialParams.aoMapIntensity = materialDef.occlusionTexture.strength;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.emissiveFactor !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tconst emissiveFactor = materialDef.emissiveFactor;\n\t\t\tmaterialParams.emissive = new Color().setRGB( emissiveFactor[ 0 ], emissiveFactor[ 1 ], emissiveFactor[ 2 ], LinearSRGBColorSpace );\n\n\t\t}\n\n\t\tif ( materialDef.emissiveTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'emissiveMap', materialDef.emissiveTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\tconst material = new materialType( materialParams );\n\n\t\t\tif ( materialDef.name ) material.name = materialDef.name;\n\n\t\t\tassignExtrasToUserData( material, materialDef );\n\n\t\t\tparser.associations.set( material, { materials: materialIndex } );\n\n\t\t\tif ( materialDef.extensions ) addUnknownExtensionsToUserData( extensions, material, materialDef );\n\n\t\t\treturn material;\n\n\t\t} );\n\n\t}\n\n\t/** When Object3D instances are targeted by animation, they need unique names. */\n\tcreateUniqueName( originalName ) {\n\n\t\tconst sanitizedName = PropertyBinding.sanitizeNodeName( originalName || '' );\n\n\t\tif ( sanitizedName in this.nodeNamesUsed ) {\n\n\t\t\treturn sanitizedName + '_' + ( ++ this.nodeNamesUsed[ sanitizedName ] );\n\n\t\t} else {\n\n\t\t\tthis.nodeNamesUsed[ sanitizedName ] = 0;\n\n\t\t\treturn sanitizedName;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry\n\t *\n\t * Creates BufferGeometries from primitives.\n\t *\n\t * @param {Array<GLTF.Primitive>} primitives\n\t * @return {Promise<Array<BufferGeometry>>}\n\t */\n\tloadGeometries( primitives ) {\n\n\t\tconst parser = this;\n\t\tconst extensions = this.extensions;\n\t\tconst cache = this.primitiveCache;\n\n\t\tfunction createDracoPrimitive( primitive ) {\n\n\t\t\treturn extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ]\n\t\t\t\t.decodePrimitive( primitive, parser )\n\t\t\t\t.then( function ( geometry ) {\n\n\t\t\t\t\treturn addPrimitiveAttributes( geometry, primitive, parser );\n\n\t\t\t\t} );\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tconst primitive = primitives[ i ];\n\t\t\tconst cacheKey = createPrimitiveKey( primitive );\n\n\t\t\t// See if we've already created this geometry\n\t\t\tconst cached = cache[ cacheKey ];\n\n\t\t\tif ( cached ) {\n\n\t\t\t\t// Use the cached geometry if it exists\n\t\t\t\tpending.push( cached.promise );\n\n\t\t\t} else {\n\n\t\t\t\tlet geometryPromise;\n\n\t\t\t\tif ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) {\n\n\t\t\t\t\t// Use DRACO geometry if available\n\t\t\t\t\tgeometryPromise = createDracoPrimitive( primitive );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise create a new geometry\n\t\t\t\t\tgeometryPromise = addPrimitiveAttributes( new BufferGeometry(), primitive, parser );\n\n\t\t\t\t}\n\n\t\t\t\t// Cache this geometry\n\t\t\t\tcache[ cacheKey ] = { primitive: primitive, promise: geometryPromise };\n\n\t\t\t\tpending.push( geometryPromise );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes\n\t * @param {number} meshIndex\n\t * @return {Promise<Group|Mesh|SkinnedMesh>}\n\t */\n\tloadMesh( meshIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\n\t\tconst meshDef = json.meshes[ meshIndex ];\n\t\tconst primitives = meshDef.primitives;\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tconst material = primitives[ i ].material === undefined\n\t\t\t\t? createDefaultMaterial( this.cache )\n\t\t\t\t: this.getDependency( 'material', primitives[ i ].material );\n\n\t\t\tpending.push( material );\n\n\t\t}\n\n\t\tpending.push( parser.loadGeometries( primitives ) );\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tconst materials = results.slice( 0, results.length - 1 );\n\t\t\tconst geometries = results[ results.length - 1 ];\n\n\t\t\tconst meshes = [];\n\n\t\t\tfor ( let i = 0, il = geometries.length; i < il; i ++ ) {\n\n\t\t\t\tconst geometry = geometries[ i ];\n\t\t\t\tconst primitive = primitives[ i ];\n\n\t\t\t\t// 1. create Mesh\n\n\t\t\t\tlet mesh;\n\n\t\t\t\tconst material = materials[ i ];\n\n\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLES ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ||\n\t\t\t\t\t\tprimitive.mode === undefined ) {\n\n\t\t\t\t\t// .isSkinnedMesh isn't in glTF spec. See ._markDefs()\n\t\t\t\t\tmesh = meshDef.isSkinnedMesh === true\n\t\t\t\t\t\t? new SkinnedMesh( geometry, material )\n\t\t\t\t\t\t: new Mesh( geometry, material );\n\n\t\t\t\t\tif ( mesh.isSkinnedMesh === true ) {\n\n\t\t\t\t\t\t// normalize skin weights to fix malformed assets (see #15319)\n\t\t\t\t\t\tmesh.normalizeSkinWeights();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleStripDrawMode );\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleFanDrawMode );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) {\n\n\t\t\t\t\tmesh = new LineSegments( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_STRIP ) {\n\n\t\t\t\t\tmesh = new Line( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_LOOP ) {\n\n\t\t\t\t\tmesh = new LineLoop( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.POINTS ) {\n\n\t\t\t\t\tmesh = new Points( geometry, material );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode );\n\n\t\t\t\t}\n\n\t\t\t\tif ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) {\n\n\t\t\t\t\tupdateMorphTargets( mesh, meshDef );\n\n\t\t\t\t}\n\n\t\t\t\tmesh.name = parser.createUniqueName( meshDef.name || ( 'mesh_' + meshIndex ) );\n\n\t\t\t\tassignExtrasToUserData( mesh, meshDef );\n\n\t\t\t\tif ( primitive.extensions ) addUnknownExtensionsToUserData( extensions, mesh, primitive );\n\n\t\t\t\tparser.assignFinalMaterial( mesh );\n\n\t\t\t\tmeshes.push( mesh );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tparser.associations.set( meshes[ i ], {\n\t\t\t\t\tmeshes: meshIndex,\n\t\t\t\t\tprimitives: i\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( meshes.length === 1 ) {\n\n\t\t\t\tif ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, meshes[ 0 ], meshDef );\n\n\t\t\t\treturn meshes[ 0 ];\n\n\t\t\t}\n\n\t\t\tconst group = new Group();\n\n\t\t\tif ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, group, meshDef );\n\n\t\t\tparser.associations.set( group, { meshes: meshIndex } );\n\n\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tgroup.add( meshes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras\n\t * @param {number} cameraIndex\n\t * @return {Promise<THREE.Camera>}\n\t */\n\tloadCamera( cameraIndex ) {\n\n\t\tlet camera;\n\t\tconst cameraDef = this.json.cameras[ cameraIndex ];\n\t\tconst params = cameraDef[ cameraDef.type ];\n\n\t\tif ( ! params ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing camera parameters.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( cameraDef.type === 'perspective' ) {\n\n\t\t\tcamera = new PerspectiveCamera( MathUtils.radToDeg( params.yfov ), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6 );\n\n\t\t} else if ( cameraDef.type === 'orthographic' ) {\n\n\t\t\tcamera = new OrthographicCamera( - params.xmag, params.xmag, params.ymag, - params.ymag, params.znear, params.zfar );\n\n\t\t}\n\n\t\tif ( cameraDef.name ) camera.name = this.createUniqueName( cameraDef.name );\n\n\t\tassignExtrasToUserData( camera, cameraDef );\n\n\t\treturn Promise.resolve( camera );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins\n\t * @param {number} skinIndex\n\t * @return {Promise<Skeleton>}\n\t */\n\tloadSkin( skinIndex ) {\n\n\t\tconst skinDef = this.json.skins[ skinIndex ];\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = skinDef.joints.length; i < il; i ++ ) {\n\n\t\t\tpending.push( this._loadNodeShallow( skinDef.joints[ i ] ) );\n\n\t\t}\n\n\t\tif ( skinDef.inverseBindMatrices !== undefined ) {\n\n\t\t\tpending.push( this.getDependency( 'accessor', skinDef.inverseBindMatrices ) );\n\n\t\t} else {\n\n\t\t\tpending.push( null );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tconst inverseBindMatrices = results.pop();\n\t\t\tconst jointNodes = results;\n\n\t\t\t// Note that bones (joint nodes) may or may not be in the\n\t\t\t// scene graph at this time.\n\n\t\t\tconst bones = [];\n\t\t\tconst boneInverses = [];\n\n\t\t\tfor ( let i = 0, il = jointNodes.length; i < il; i ++ ) {\n\n\t\t\t\tconst jointNode = jointNodes[ i ];\n\n\t\t\t\tif ( jointNode ) {\n\n\t\t\t\t\tbones.push( jointNode );\n\n\t\t\t\t\tconst mat = new Matrix4();\n\n\t\t\t\t\tif ( inverseBindMatrices !== null ) {\n\n\t\t\t\t\t\tmat.fromArray( inverseBindMatrices.array, i * 16 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tboneInverses.push( mat );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Joint \"%s\" could not be found.', skinDef.joints[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new Skeleton( bones, boneInverses );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\n\t * @param {number} animationIndex\n\t * @return {Promise<AnimationClip>}\n\t */\n\tloadAnimation( animationIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\n\t\tconst animationDef = json.animations[ animationIndex ];\n\t\tconst animationName = animationDef.name ? animationDef.name : 'animation_' + animationIndex;\n\n\t\tconst pendingNodes = [];\n\t\tconst pendingInputAccessors = [];\n\t\tconst pendingOutputAccessors = [];\n\t\tconst pendingSamplers = [];\n\t\tconst pendingTargets = [];\n\n\t\tfor ( let i = 0, il = animationDef.channels.length; i < il; i ++ ) {\n\n\t\t\tconst channel = animationDef.channels[ i ];\n\t\t\tconst sampler = animationDef.samplers[ channel.sampler ];\n\t\t\tconst target = channel.target;\n\t\t\tconst name = target.node;\n\t\t\tconst input = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.input ] : sampler.input;\n\t\t\tconst output = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.output ] : sampler.output;\n\n\t\t\tif ( target.node === undefined ) continue;\n\n\t\t\tpendingNodes.push( this.getDependency( 'node', name ) );\n\t\t\tpendingInputAccessors.push( this.getDependency( 'accessor', input ) );\n\t\t\tpendingOutputAccessors.push( this.getDependency( 'accessor', output ) );\n\t\t\tpendingSamplers.push( sampler );\n\t\t\tpendingTargets.push( target );\n\n\t\t}\n\n\t\treturn Promise.all( [\n\n\t\t\tPromise.all( pendingNodes ),\n\t\t\tPromise.all( pendingInputAccessors ),\n\t\t\tPromise.all( pendingOutputAccessors ),\n\t\t\tPromise.all( pendingSamplers ),\n\t\t\tPromise.all( pendingTargets )\n\n\t\t] ).then( function ( dependencies ) {\n\n\t\t\tconst nodes = dependencies[ 0 ];\n\t\t\tconst inputAccessors = dependencies[ 1 ];\n\t\t\tconst outputAccessors = dependencies[ 2 ];\n\t\t\tconst samplers = dependencies[ 3 ];\n\t\t\tconst targets = dependencies[ 4 ];\n\n\t\t\tconst tracks = [];\n\n\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tconst node = nodes[ i ];\n\t\t\t\tconst inputAccessor = inputAccessors[ i ];\n\t\t\t\tconst outputAccessor = outputAccessors[ i ];\n\t\t\t\tconst sampler = samplers[ i ];\n\t\t\t\tconst target = targets[ i ];\n\n\t\t\t\tif ( node === undefined ) continue;\n\n\t\t\t\tif ( node.updateMatrix ) {\n\n\t\t\t\t\tnode.updateMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tconst createdTracks = parser._createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target );\n\n\t\t\t\tif ( createdTracks ) {\n\n\t\t\t\t\tfor ( let k = 0; k < createdTracks.length; k ++ ) {\n\n\t\t\t\t\t\ttracks.push( createdTracks[ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( animationName, undefined, tracks );\n\n\t\t} );\n\n\t}\n\n\tcreateNodeMesh( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tif ( nodeDef.mesh === undefined ) return null;\n\n\t\treturn parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) {\n\n\t\t\tconst node = parser._getNodeRef( parser.meshCache, nodeDef.mesh, mesh );\n\n\t\t\t// if weights are provided on the node, override weights on the mesh.\n\t\t\tif ( nodeDef.weights !== undefined ) {\n\n\t\t\t\tnode.traverse( function ( o ) {\n\n\t\t\t\t\tif ( ! o.isMesh ) return;\n\n\t\t\t\t\tfor ( let i = 0, il = nodeDef.weights.length; i < il; i ++ ) {\n\n\t\t\t\t\t\to.morphTargetInfluences[ i ] = nodeDef.weights[ i ];\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy\n\t * @param {number} nodeIndex\n\t * @return {Promise<Object3D>}\n\t */\n\tloadNode( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tconst nodePending = parser._loadNodeShallow( nodeIndex );\n\n\t\tconst childPending = [];\n\t\tconst childrenDef = nodeDef.children || [];\n\n\t\tfor ( let i = 0, il = childrenDef.length; i < il; i ++ ) {\n\n\t\t\tchildPending.push( parser.getDependency( 'node', childrenDef[ i ] ) );\n\n\t\t}\n\n\t\tconst skeletonPending = nodeDef.skin === undefined\n\t\t\t? Promise.resolve( null )\n\t\t\t: parser.getDependency( 'skin', nodeDef.skin );\n\n\t\treturn Promise.all( [\n\t\t\tnodePending,\n\t\t\tPromise.all( childPending ),\n\t\t\tskeletonPending\n\t\t] ).then( function ( results ) {\n\n\t\t\tconst node = results[ 0 ];\n\t\t\tconst children = results[ 1 ];\n\t\t\tconst skeleton = results[ 2 ];\n\n\t\t\tif ( skeleton !== null ) {\n\n\t\t\t\t// This full traverse should be fine because\n\t\t\t\t// child glTF nodes have not been added to this node yet.\n\t\t\t\tnode.traverse( function ( mesh ) {\n\n\t\t\t\t\tif ( ! mesh.isSkinnedMesh ) return;\n\n\t\t\t\t\tmesh.bind( skeleton, _identityMatrix );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = children.length; i < il; i ++ ) {\n\n\t\t\t\tnode.add( children[ i ] );\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t}\n\n\t// ._loadNodeShallow() parses a single node.\n\t// skin and child nodes are created and added in .loadNode() (no '_' prefix).\n\t_loadNodeShallow( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst parser = this;\n\n\t\t// This method is called from .loadNode() and .loadSkin().\n\t\t// Cache a node to avoid duplication.\n\n\t\tif ( this.nodeCache[ nodeIndex ] !== undefined ) {\n\n\t\t\treturn this.nodeCache[ nodeIndex ];\n\n\t\t}\n\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\t// reserve node's name before its dependencies, so the root has the intended name.\n\t\tconst nodeName = nodeDef.name ? parser.createUniqueName( nodeDef.name ) : '';\n\n\t\tconst pending = [];\n\n\t\tconst meshPromise = parser._invokeOne( function ( ext ) {\n\n\t\t\treturn ext.createNodeMesh && ext.createNodeMesh( nodeIndex );\n\n\t\t} );\n\n\t\tif ( meshPromise ) {\n\n\t\t\tpending.push( meshPromise );\n\n\t\t}\n\n\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\tpending.push( parser.getDependency( 'camera', nodeDef.camera ).then( function ( camera ) {\n\n\t\t\t\treturn parser._getNodeRef( parser.cameraCache, nodeDef.camera, camera );\n\n\t\t\t} ) );\n\n\t\t}\n\n\t\tparser._invokeAll( function ( ext ) {\n\n\t\t\treturn ext.createNodeAttachment && ext.createNodeAttachment( nodeIndex );\n\n\t\t} ).forEach( function ( promise ) {\n\n\t\t\tpending.push( promise );\n\n\t\t} );\n\n\t\tthis.nodeCache[ nodeIndex ] = Promise.all( pending ).then( function ( objects ) {\n\n\t\t\tlet node;\n\n\t\t\t// .isBone isn't in glTF spec. See ._markDefs\n\t\t\tif ( nodeDef.isBone === true ) {\n\n\t\t\t\tnode = new Bone();\n\n\t\t\t} else if ( objects.length > 1 ) {\n\n\t\t\t\tnode = new Group();\n\n\t\t\t} else if ( objects.length === 1 ) {\n\n\t\t\t\tnode = objects[ 0 ];\n\n\t\t\t} else {\n\n\t\t\t\tnode = new Object3D();\n\n\t\t\t}\n\n\t\t\tif ( node !== objects[ 0 ] ) {\n\n\t\t\t\tfor ( let i = 0, il = objects.length; i < il; i ++ ) {\n\n\t\t\t\t\tnode.add( objects[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.name ) {\n\n\t\t\t\tnode.userData.name = nodeDef.name;\n\t\t\t\tnode.name = nodeName;\n\n\t\t\t}\n\n\t\t\tassignExtrasToUserData( node, nodeDef );\n\n\t\t\tif ( nodeDef.extensions ) addUnknownExtensionsToUserData( extensions, node, nodeDef );\n\n\t\t\tif ( nodeDef.matrix !== undefined ) {\n\n\t\t\t\tconst matrix = new Matrix4();\n\t\t\t\tmatrix.fromArray( nodeDef.matrix );\n\t\t\t\tnode.applyMatrix4( matrix );\n\n\t\t\t} else {\n\n\t\t\t\tif ( nodeDef.translation !== undefined ) {\n\n\t\t\t\t\tnode.position.fromArray( nodeDef.translation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.rotation !== undefined ) {\n\n\t\t\t\t\tnode.quaternion.fromArray( nodeDef.rotation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.scale !== undefined ) {\n\n\t\t\t\t\tnode.scale.fromArray( nodeDef.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! parser.associations.has( node ) ) {\n\n\t\t\t\tparser.associations.set( node, {} );\n\n\t\t\t}\n\n\t\t\tparser.associations.get( node ).nodes = nodeIndex;\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t\treturn this.nodeCache[ nodeIndex ];\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes\n\t * @param {number} sceneIndex\n\t * @return {Promise<Group>}\n\t */\n\tloadScene( sceneIndex ) {\n\n\t\tconst extensions = this.extensions;\n\t\tconst sceneDef = this.json.scenes[ sceneIndex ];\n\t\tconst parser = this;\n\n\t\t// Loader returns Group, not Scene.\n\t\t// See: https://github.com/mrdoob/three.js/issues/18342#issuecomment-578981172\n\t\tconst scene = new Group();\n\t\tif ( sceneDef.name ) scene.name = parser.createUniqueName( sceneDef.name );\n\n\t\tassignExtrasToUserData( scene, sceneDef );\n\n\t\tif ( sceneDef.extensions ) addUnknownExtensionsToUserData( extensions, scene, sceneDef );\n\n\t\tconst nodeIds = sceneDef.nodes || [];\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = nodeIds.length; i < il; i ++ ) {\n\n\t\t\tpending.push( parser.getDependency( 'node', nodeIds[ i ] ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function ( nodes ) {\n\n\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tscene.add( nodes[ i ] );\n\n\t\t\t}\n\n\t\t\t// Removes dangling associations, associations that reference a node that\n\t\t\t// didn't make it into the scene.\n\t\t\tconst reduceAssociations = ( node ) => {\n\n\t\t\t\tconst reducedAssociations = new Map();\n\n\t\t\t\tfor ( const [ key, value ] of parser.associations ) {\n\n\t\t\t\t\tif ( key instanceof Material || key instanceof Texture ) {\n\n\t\t\t\t\t\treducedAssociations.set( key, value );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tnode.traverse( ( node ) => {\n\n\t\t\t\t\tconst mappings = parser.associations.get( node );\n\n\t\t\t\t\tif ( mappings != null ) {\n\n\t\t\t\t\t\treducedAssociations.set( node, mappings );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn reducedAssociations;\n\n\t\t\t};\n\n\t\t\tparser.associations = reduceAssociations( scene );\n\n\t\t\treturn scene;\n\n\t\t} );\n\n\t}\n\n\t_createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target ) {\n\n\t\tconst tracks = [];\n\n\t\tconst targetName = node.name ? node.name : node.uuid;\n\t\tconst targetNames = [];\n\n\t\tif ( PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.weights ) {\n\n\t\t\tnode.traverse( function ( object ) {\n\n\t\t\t\tif ( object.morphTargetInfluences ) {\n\n\t\t\t\t\ttargetNames.push( object.name ? object.name : object.uuid );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\ttargetNames.push( targetName );\n\n\t\t}\n\n\t\tlet TypedKeyframeTrack;\n\n\t\tswitch ( PATH_PROPERTIES[ target.path ] ) {\n\n\t\t\tcase PATH_PROPERTIES.weights:\n\n\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tcase PATH_PROPERTIES.rotation:\n\n\t\t\t\tTypedKeyframeTrack = QuaternionKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tcase PATH_PROPERTIES.position:\n\t\t\tcase PATH_PROPERTIES.scale:\n\n\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tswitch ( outputAccessor.itemSize ) {\n\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\tcase 3:\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tconst interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : InterpolateLinear;\n\n\n\t\tconst outputArray = this._getArrayFromAccessor( outputAccessor );\n\n\t\tfor ( let j = 0, jl = targetNames.length; j < jl; j ++ ) {\n\n\t\t\tconst track = new TypedKeyframeTrack(\n\t\t\t\ttargetNames[ j ] + '.' + PATH_PROPERTIES[ target.path ],\n\t\t\t\tinputAccessor.array,\n\t\t\t\toutputArray,\n\t\t\t\tinterpolation\n\t\t\t);\n\n\t\t\t// Override interpolation with custom factory method.\n\t\t\tif ( sampler.interpolation === 'CUBICSPLINE' ) {\n\n\t\t\t\tthis._createCubicSplineTrackInterpolant( track );\n\n\t\t\t}\n\n\t\t\ttracks.push( track );\n\n\t\t}\n\n\t\treturn tracks;\n\n\t}\n\n\t_getArrayFromAccessor( accessor ) {\n\n\t\tlet outputArray = accessor.array;\n\n\t\tif ( accessor.normalized ) {\n\n\t\t\tconst scale = getNormalizedComponentScale( outputArray.constructor );\n\t\t\tconst scaled = new Float32Array( outputArray.length );\n\n\t\t\tfor ( let j = 0, jl = outputArray.length; j < jl; j ++ ) {\n\n\t\t\t\tscaled[ j ] = outputArray[ j ] * scale;\n\n\t\t\t}\n\n\t\t\toutputArray = scaled;\n\n\t\t}\n\n\t\treturn outputArray;\n\n\t}\n\n\t_createCubicSplineTrackInterpolant( track ) {\n\n\t\ttrack.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) {\n\n\t\t\t// A CUBICSPLINE keyframe in glTF has three output values for each input value,\n\t\t\t// representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize()\n\t\t\t// must be divided by three to get the interpolant's sampleSize argument.\n\n\t\t\tconst interpolantType = ( this instanceof QuaternionKeyframeTrack ) ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant;\n\n\t\t\treturn new interpolantType( this.times, this.values, this.getValueSize() / 3, result );\n\n\t\t};\n\n\t\t// Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants.\n\t\ttrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true;\n\n\t}\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n */\nfunction computeBounds( geometry, primitiveDef, parser ) {\n\n\tconst attributes = primitiveDef.attributes;\n\n\tconst box = new Box3();\n\n\tif ( attributes.POSITION !== undefined ) {\n\n\t\tconst accessor = parser.json.accessors[ attributes.POSITION ];\n\n\t\tconst min = accessor.min;\n\t\tconst max = accessor.max;\n\n\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\tbox.set(\n\t\t\t\tnew Vector3( min[ 0 ], min[ 1 ], min[ 2 ] ),\n\t\t\t\tnew Vector3( max[ 0 ], max[ 1 ], max[ 2 ] )\n\t\t\t);\n\n\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\tbox.min.multiplyScalar( boxScale );\n\t\t\t\tbox.max.multiplyScalar( boxScale );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\treturn;\n\n\t\t}\n\n\t} else {\n\n\t\treturn;\n\n\t}\n\n\tconst targets = primitiveDef.targets;\n\n\tif ( targets !== undefined ) {\n\n\t\tconst maxDisplacement = new Vector3();\n\t\tconst vector = new Vector3();\n\n\t\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\tconst target = targets[ i ];\n\n\t\t\tif ( target.POSITION !== undefined ) {\n\n\t\t\t\tconst accessor = parser.json.accessors[ target.POSITION ];\n\t\t\t\tconst min = accessor.min;\n\t\t\t\tconst max = accessor.max;\n\n\t\t\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\t\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\t\t\t// we need to get max of absolute components because target weight is [-1,1]\n\t\t\t\t\tvector.setX( Math.max( Math.abs( min[ 0 ] ), Math.abs( max[ 0 ] ) ) );\n\t\t\t\t\tvector.setY( Math.max( Math.abs( min[ 1 ] ), Math.abs( max[ 1 ] ) ) );\n\t\t\t\t\tvector.setZ( Math.max( Math.abs( min[ 2 ] ), Math.abs( max[ 2 ] ) ) );\n\n\n\t\t\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\t\t\tvector.multiplyScalar( boxScale );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Note: this assumes that the sum of all weights is at most 1. This isn't quite correct - it's more conservative\n\t\t\t\t\t// to assume that each target can have a max weight of 1. However, for some use cases - notably, when morph targets\n\t\t\t\t\t// are used to implement key-frame animations and as such only two are active at a time - this results in very large\n\t\t\t\t\t// boxes. So for now we make a box that's sometimes a touch too small but is hopefully mostly of reasonable size.\n\t\t\t\t\tmaxDisplacement.max( vector );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// As per comment above this box isn't conservative, but has a reasonable size for a very large number of morph targets.\n\t\tbox.expandByVector( maxDisplacement );\n\n\t}\n\n\tgeometry.boundingBox = box;\n\n\tconst sphere = new Sphere();\n\n\tbox.getCenter( sphere.center );\n\tsphere.radius = box.min.distanceTo( box.max ) / 2;\n\n\tgeometry.boundingSphere = sphere;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\nfunction addPrimitiveAttributes( geometry, primitiveDef, parser ) {\n\n\tconst attributes = primitiveDef.attributes;\n\n\tconst pending = [];\n\n\tfunction assignAttributeAccessor( accessorIndex, attributeName ) {\n\n\t\treturn parser.getDependency( 'accessor', accessorIndex )\n\t\t\t.then( function ( accessor ) {\n\n\t\t\t\tgeometry.setAttribute( attributeName, accessor );\n\n\t\t\t} );\n\n\t}\n\n\tfor ( const gltfAttributeName in attributes ) {\n\n\t\tconst threeAttributeName = ATTRIBUTES[ gltfAttributeName ] || gltfAttributeName.toLowerCase();\n\n\t\t// Skip attributes already provided by e.g. Draco extension.\n\t\tif ( threeAttributeName in geometry.attributes ) continue;\n\n\t\tpending.push( assignAttributeAccessor( attributes[ gltfAttributeName ], threeAttributeName ) );\n\n\t}\n\n\tif ( primitiveDef.indices !== undefined && ! geometry.index ) {\n\n\t\tconst accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) {\n\n\t\t\tgeometry.setIndex( accessor );\n\n\t\t} );\n\n\t\tpending.push( accessor );\n\n\t}\n\n\tif ( ColorManagement.workingColorSpace !== LinearSRGBColorSpace && 'COLOR_0' in attributes ) {\n\n\t\tconsole.warn( `THREE.GLTFLoader: Converting vertex colors from \"srgb-linear\" to \"${ColorManagement.workingColorSpace}\" not supported.` );\n\n\t}\n\n\tassignExtrasToUserData( geometry, primitiveDef );\n\n\tcomputeBounds( geometry, primitiveDef, parser );\n\n\treturn Promise.all( pending ).then( function () {\n\n\t\treturn primitiveDef.targets !== undefined\n\t\t\t? addMorphTargets( geometry, primitiveDef.targets, parser )\n\t\t\t: geometry;\n\n\t} );\n\n}\n\nexport { GLTFLoader };\n","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tColor,\n\tColorManagement,\n\tFileLoader,\n\tLoader,\n\tLinearSRGBColorSpace,\n\tSRGBColorSpace\n} from 'three';\n\nconst _taskCache = new WeakMap();\n\nclass DRACOLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.decoderPath = '';\n\t\tthis.decoderConfig = {};\n\t\tthis.decoderBinary = null;\n\t\tthis.decoderPending = null;\n\n\t\tthis.workerLimit = 4;\n\t\tthis.workerPool = [];\n\t\tthis.workerNextTaskID = 1;\n\t\tthis.workerSourceURL = '';\n\n\t\tthis.defaultAttributeIDs = {\n\t\t\tposition: 'POSITION',\n\t\t\tnormal: 'NORMAL',\n\t\t\tcolor: 'COLOR',\n\t\t\tuv: 'TEX_COORD'\n\t\t};\n\t\tthis.defaultAttributeTypes = {\n\t\t\tposition: 'Float32Array',\n\t\t\tnormal: 'Float32Array',\n\t\t\tcolor: 'Float32Array',\n\t\t\tuv: 'Float32Array'\n\t\t};\n\n\t}\n\n\tsetDecoderPath( path ) {\n\n\t\tthis.decoderPath = path;\n\n\t\treturn this;\n\n\t}\n\n\tsetDecoderConfig( config ) {\n\n\t\tthis.decoderConfig = config;\n\n\t\treturn this;\n\n\t}\n\n\tsetWorkerLimit( workerLimit ) {\n\n\t\tthis.workerLimit = workerLimit;\n\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, ( buffer ) => {\n\n\t\t\tthis.parse( buffer, onLoad, onError );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\n\tparse( buffer, onLoad, onError = ()=>{} ) {\n\n\t\tthis.decodeDracoFile( buffer, onLoad, null, null, SRGBColorSpace, onError ).catch( onError );\n\n\t}\n\n\tdecodeDracoFile( buffer, callback, attributeIDs, attributeTypes, vertexColorSpace = LinearSRGBColorSpace, onError = () => {} ) {\n\n\t\tconst taskConfig = {\n\t\t\tattributeIDs: attributeIDs || this.defaultAttributeIDs,\n\t\t\tattributeTypes: attributeTypes || this.defaultAttributeTypes,\n\t\t\tuseUniqueIDs: !! attributeIDs,\n\t\t\tvertexColorSpace: vertexColorSpace,\n\t\t};\n\n\t\treturn this.decodeGeometry( buffer, taskConfig ).then( callback ).catch( onError );\n\n\t}\n\n\tdecodeGeometry( buffer, taskConfig ) {\n\n\t\tconst taskKey = JSON.stringify( taskConfig );\n\n\t\t// Check for an existing task using this buffer. A transferred buffer cannot be transferred\n\t\t// again from this thread.\n\t\tif ( _taskCache.has( buffer ) ) {\n\n\t\t\tconst cachedTask = _taskCache.get( buffer );\n\n\t\t\tif ( cachedTask.key === taskKey ) {\n\n\t\t\t\treturn cachedTask.promise;\n\n\t\t\t} else if ( buffer.byteLength === 0 ) {\n\n\t\t\t\t// Technically, it would be possible to wait for the previous task to complete,\n\t\t\t\t// transfer the buffer back, and decode again with the second configuration. That\n\t\t\t\t// is complex, and I don't know of any reason to decode a Draco buffer twice in\n\t\t\t\t// different ways, so this is left unimplemented.\n\t\t\t\tthrow new Error(\n\n\t\t\t\t\t'THREE.DRACOLoader: Unable to re-decode a buffer with different ' +\n\t\t\t\t\t'settings. Buffer has already been transferred.'\n\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tlet worker;\n\t\tconst taskID = this.workerNextTaskID ++;\n\t\tconst taskCost = buffer.byteLength;\n\n\t\t// Obtain a worker and assign a task, and construct a geometry instance\n\t\t// when the task completes.\n\t\tconst geometryPending = this._getWorker( taskID, taskCost )\n\t\t\t.then( ( _worker ) => {\n\n\t\t\t\tworker = _worker;\n\n\t\t\t\treturn new Promise( ( resolve, reject ) => {\n\n\t\t\t\t\tworker._callbacks[ taskID ] = { resolve, reject };\n\n\t\t\t\t\tworker.postMessage( { type: 'decode', id: taskID, taskConfig, buffer }, [ buffer ] );\n\n\t\t\t\t\t// this.debug();\n\n\t\t\t\t} );\n\n\t\t\t} )\n\t\t\t.then( ( message ) => this._createGeometry( message.geometry ) );\n\n\t\t// Remove task from the task list.\n\t\t// Note: replaced '.finally()' with '.catch().then()' block - iOS 11 support (#19416)\n\t\tgeometryPending\n\t\t\t.catch( () => true )\n\t\t\t.then( () => {\n\n\t\t\t\tif ( worker && taskID ) {\n\n\t\t\t\t\tthis._releaseTask( worker, taskID );\n\n\t\t\t\t\t// this.debug();\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t// Cache the task result.\n\t\t_taskCache.set( buffer, {\n\n\t\t\tkey: taskKey,\n\t\t\tpromise: geometryPending\n\n\t\t} );\n\n\t\treturn geometryPending;\n\n\t}\n\n\t_createGeometry( geometryData ) {\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tif ( geometryData.index ) {\n\n\t\t\tgeometry.setIndex( new BufferAttribute( geometryData.index.array, 1 ) );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < geometryData.attributes.length; i ++ ) {\n\n\t\t\tconst result = geometryData.attributes[ i ];\n\t\t\tconst name = result.name;\n\t\t\tconst array = result.array;\n\t\t\tconst itemSize = result.itemSize;\n\n\t\t\tconst attribute = new BufferAttribute( array, itemSize );\n\n\t\t\tif ( name === 'color' ) {\n\n\t\t\t\tthis._assignVertexColorSpace( attribute, result.vertexColorSpace );\n\n\t\t\t\tattribute.normalized = ( array instanceof Float32Array ) === false;\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( name, attribute );\n\n\t\t}\n\n\t\treturn geometry;\n\n\t}\n\n\t_assignVertexColorSpace( attribute, inputColorSpace ) {\n\n\t\t// While .drc files do not specify colorspace, the only 'official' tooling\n\t\t// is PLY and OBJ converters, which use sRGB. We'll assume sRGB when a .drc\n\t\t// file is passed into .load() or .parse(). GLTFLoader uses internal APIs\n\t\t// to decode geometry, and vertex colors are already Linear-sRGB in there.\n\n\t\tif ( inputColorSpace !== SRGBColorSpace ) return;\n\n\t\tconst _color = new Color();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\t_color.fromBufferAttribute( attribute, i );\n\t\t\tColorManagement.toWorkingColorSpace( _color, SRGBColorSpace );\n\t\t\tattribute.setXYZ( i, _color.r, _color.g, _color.b );\n\n\t\t}\n\n\t}\n\n\t_loadLibrary( url, responseType ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.decoderPath );\n\t\tloader.setResponseType( responseType );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\treturn new Promise( ( resolve, reject ) => {\n\n\t\t\tloader.load( url, resolve, undefined, reject );\n\n\t\t} );\n\n\t}\n\n\tpreload() {\n\n\t\tthis._initDecoder();\n\n\t\treturn this;\n\n\t}\n\n\t_initDecoder() {\n\n\t\tif ( this.decoderPending ) return this.decoderPending;\n\n\t\tconst useJS = typeof WebAssembly !== 'object' || this.decoderConfig.type === 'js';\n\t\tconst librariesPending = [];\n\n\t\tif ( useJS ) {\n\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_decoder.js', 'text' ) );\n\n\t\t} else {\n\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_wasm_wrapper.js', 'text' ) );\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_decoder.wasm', 'arraybuffer' ) );\n\n\t\t}\n\n\t\tthis.decoderPending = Promise.all( librariesPending )\n\t\t\t.then( ( libraries ) => {\n\n\t\t\t\tconst jsContent = libraries[ 0 ];\n\n\t\t\t\tif ( ! useJS ) {\n\n\t\t\t\t\tthis.decoderConfig.wasmBinary = libraries[ 1 ];\n\n\t\t\t\t}\n\n\t\t\t\tconst fn = DRACOWorker.toString();\n\n\t\t\t\tconst body = [\n\t\t\t\t\t'/* draco decoder */',\n\t\t\t\t\tjsContent,\n\t\t\t\t\t'',\n\t\t\t\t\t'/* worker */',\n\t\t\t\t\tfn.substring( fn.indexOf( '{' ) + 1, fn.lastIndexOf( '}' ) )\n\t\t\t\t].join( '\\n' );\n\n\t\t\t\tthis.workerSourceURL = URL.createObjectURL( new Blob( [ body ] ) );\n\n\t\t\t} );\n\n\t\treturn this.decoderPending;\n\n\t}\n\n\t_getWorker( taskID, taskCost ) {\n\n\t\treturn this._initDecoder().then( () => {\n\n\t\t\tif ( this.workerPool.length < this.workerLimit ) {\n\n\t\t\t\tconst worker = new Worker( this.workerSourceURL );\n\n\t\t\t\tworker._callbacks = {};\n\t\t\t\tworker._taskCosts = {};\n\t\t\t\tworker._taskLoad = 0;\n\n\t\t\t\tworker.postMessage( { type: 'init', decoderConfig: this.decoderConfig } );\n\n\t\t\t\tworker.onmessage = function ( e ) {\n\n\t\t\t\t\tconst message = e.data;\n\n\t\t\t\t\tswitch ( message.type ) {\n\n\t\t\t\t\t\tcase 'decode':\n\t\t\t\t\t\t\tworker._callbacks[ message.id ].resolve( message );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'error':\n\t\t\t\t\t\t\tworker._callbacks[ message.id ].reject( message );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.DRACOLoader: Unexpected message, \"' + message.type + '\"' );\n\n\t\t\t\t\t}\n\n\t\t\t\t};\n\n\t\t\t\tthis.workerPool.push( worker );\n\n\t\t\t} else {\n\n\t\t\t\tthis.workerPool.sort( function ( a, b ) {\n\n\t\t\t\t\treturn a._taskLoad > b._taskLoad ? - 1 : 1;\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tconst worker = this.workerPool[ this.workerPool.length - 1 ];\n\t\t\tworker._taskCosts[ taskID ] = taskCost;\n\t\t\tworker._taskLoad += taskCost;\n\t\t\treturn worker;\n\n\t\t} );\n\n\t}\n\n\t_releaseTask( worker, taskID ) {\n\n\t\tworker._taskLoad -= worker._taskCosts[ taskID ];\n\t\tdelete worker._callbacks[ taskID ];\n\t\tdelete worker._taskCosts[ taskID ];\n\n\t}\n\n\tdebug() {\n\n\t\tconsole.log( 'Task load: ', this.workerPool.map( ( worker ) => worker._taskLoad ) );\n\n\t}\n\n\tdispose() {\n\n\t\tfor ( let i = 0; i < this.workerPool.length; ++ i ) {\n\n\t\t\tthis.workerPool[ i ].terminate();\n\n\t\t}\n\n\t\tthis.workerPool.length = 0;\n\n\t\tif ( this.workerSourceURL !== '' ) {\n\n\t\t\tURL.revokeObjectURL( this.workerSourceURL );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/* WEB WORKER */\n\nfunction DRACOWorker() {\n\n\tlet decoderConfig;\n\tlet decoderPending;\n\n\tonmessage = function ( e ) {\n\n\t\tconst message = e.data;\n\n\t\tswitch ( message.type ) {\n\n\t\t\tcase 'init':\n\t\t\t\tdecoderConfig = message.decoderConfig;\n\t\t\t\tdecoderPending = new Promise( function ( resolve/*, reject*/ ) {\n\n\t\t\t\t\tdecoderConfig.onModuleLoaded = function ( draco ) {\n\n\t\t\t\t\t\t// Module is Promise-like. Wrap before resolving to avoid loop.\n\t\t\t\t\t\tresolve( { draco: draco } );\n\n\t\t\t\t\t};\n\n\t\t\t\t\tDracoDecoderModule( decoderConfig ); // eslint-disable-line no-undef\n\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t\tcase 'decode':\n\t\t\t\tconst buffer = message.buffer;\n\t\t\t\tconst taskConfig = message.taskConfig;\n\t\t\t\tdecoderPending.then( ( module ) => {\n\n\t\t\t\t\tconst draco = module.draco;\n\t\t\t\t\tconst decoder = new draco.Decoder();\n\n\t\t\t\t\ttry {\n\n\t\t\t\t\t\tconst geometry = decodeGeometry( draco, decoder, new Int8Array( buffer ), taskConfig );\n\n\t\t\t\t\t\tconst buffers = geometry.attributes.map( ( attr ) => attr.array.buffer );\n\n\t\t\t\t\t\tif ( geometry.index ) buffers.push( geometry.index.array.buffer );\n\n\t\t\t\t\t\tself.postMessage( { type: 'decode', id: message.id, geometry }, buffers );\n\n\t\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t\tconsole.error( error );\n\n\t\t\t\t\t\tself.postMessage( { type: 'error', id: message.id, error: error.message } );\n\n\t\t\t\t\t} finally {\n\n\t\t\t\t\t\tdraco.destroy( decoder );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t};\n\n\tfunction decodeGeometry( draco, decoder, array, taskConfig ) {\n\n\t\tconst attributeIDs = taskConfig.attributeIDs;\n\t\tconst attributeTypes = taskConfig.attributeTypes;\n\n\t\tlet dracoGeometry;\n\t\tlet decodingStatus;\n\n\t\tconst geometryType = decoder.GetEncodedGeometryType( array );\n\n\t\tif ( geometryType === draco.TRIANGULAR_MESH ) {\n\n\t\t\tdracoGeometry = new draco.Mesh();\n\t\t\tdecodingStatus = decoder.DecodeArrayToMesh( array, array.byteLength, dracoGeometry );\n\n\t\t} else if ( geometryType === draco.POINT_CLOUD ) {\n\n\t\t\tdracoGeometry = new draco.PointCloud();\n\t\t\tdecodingStatus = decoder.DecodeArrayToPointCloud( array, array.byteLength, dracoGeometry );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.DRACOLoader: Unexpected geometry type.' );\n\n\t\t}\n\n\t\tif ( ! decodingStatus.ok() || dracoGeometry.ptr === 0 ) {\n\n\t\t\tthrow new Error( 'THREE.DRACOLoader: Decoding failed: ' + decodingStatus.error_msg() );\n\n\t\t}\n\n\t\tconst geometry = { index: null, attributes: [] };\n\n\t\t// Gather all vertex attributes.\n\t\tfor ( const attributeName in attributeIDs ) {\n\n\t\t\tconst attributeType = self[ attributeTypes[ attributeName ] ];\n\n\t\t\tlet attribute;\n\t\t\tlet attributeID;\n\n\t\t\t// A Draco file may be created with default vertex attributes, whose attribute IDs\n\t\t\t// are mapped 1:1 from their semantic name (POSITION, NORMAL, ...). Alternatively,\n\t\t\t// a Draco file may contain a custom set of attributes, identified by known unique\n\t\t\t// IDs. glTF files always do the latter, and `.drc` files typically do the former.\n\t\t\tif ( taskConfig.useUniqueIDs ) {\n\n\t\t\t\tattributeID = attributeIDs[ attributeName ];\n\t\t\t\tattribute = decoder.GetAttributeByUniqueId( dracoGeometry, attributeID );\n\n\t\t\t} else {\n\n\t\t\t\tattributeID = decoder.GetAttributeId( dracoGeometry, draco[ attributeIDs[ attributeName ] ] );\n\n\t\t\t\tif ( attributeID === - 1 ) continue;\n\n\t\t\t\tattribute = decoder.GetAttribute( dracoGeometry, attributeID );\n\n\t\t\t}\n\n\t\t\tconst attributeResult = decodeAttribute( draco, decoder, dracoGeometry, attributeName, attributeType, attribute );\n\n\t\t\tif ( attributeName === 'color' ) {\n\n\t\t\t\tattributeResult.vertexColorSpace = taskConfig.vertexColorSpace;\n\n\t\t\t}\n\n\t\t\tgeometry.attributes.push( attributeResult );\n\n\t\t}\n\n\t\t// Add index.\n\t\tif ( geometryType === draco.TRIANGULAR_MESH ) {\n\n\t\t\tgeometry.index = decodeIndex( draco, decoder, dracoGeometry );\n\n\t\t}\n\n\t\tdraco.destroy( dracoGeometry );\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction decodeIndex( draco, decoder, dracoGeometry ) {\n\n\t\tconst numFaces = dracoGeometry.num_faces();\n\t\tconst numIndices = numFaces * 3;\n\t\tconst byteLength = numIndices * 4;\n\n\t\tconst ptr = draco._malloc( byteLength );\n\t\tdecoder.GetTrianglesUInt32Array( dracoGeometry, byteLength, ptr );\n\t\tconst index = new Uint32Array( draco.HEAPF32.buffer, ptr, numIndices ).slice();\n\t\tdraco._free( ptr );\n\n\t\treturn { array: index, itemSize: 1 };\n\n\t}\n\n\tfunction decodeAttribute( draco, decoder, dracoGeometry, attributeName, attributeType, attribute ) {\n\n\t\tconst numComponents = attribute.num_components();\n\t\tconst numPoints = dracoGeometry.num_points();\n\t\tconst numValues = numPoints * numComponents;\n\t\tconst byteLength = numValues * attributeType.BYTES_PER_ELEMENT;\n\t\tconst dataType = getDracoDataType( draco, attributeType );\n\n\t\tconst ptr = draco._malloc( byteLength );\n\t\tdecoder.GetAttributeDataArrayForAllPoints( dracoGeometry, attribute, dataType, byteLength, ptr );\n\t\tconst array = new attributeType( draco.HEAPF32.buffer, ptr, numValues ).slice();\n\t\tdraco._free( ptr );\n\n\t\treturn {\n\t\t\tname: attributeName,\n\t\t\tarray: array,\n\t\t\titemSize: numComponents\n\t\t};\n\n\t}\n\n\tfunction getDracoDataType( draco, attributeType ) {\n\n\t\tswitch ( attributeType ) {\n\n\t\t\tcase Float32Array: return draco.DT_FLOAT32;\n\t\t\tcase Int8Array: return draco.DT_INT8;\n\t\t\tcase Int16Array: return draco.DT_INT16;\n\t\t\tcase Int32Array: return draco.DT_INT32;\n\t\t\tcase Uint8Array: return draco.DT_UINT8;\n\t\t\tcase Uint16Array: return draco.DT_UINT16;\n\t\t\tcase Uint32Array: return draco.DT_UINT32;\n\n\t\t}\n\n\t}\n\n}\n\nexport { DRACOLoader };\n","/**\n * @author Deepkolos / https://github.com/deepkolos\n */\n\nexport class WorkerPool {\n\n\tconstructor( pool = 4 ) {\n\n\t\tthis.pool = pool;\n\t\tthis.queue = [];\n\t\tthis.workers = [];\n\t\tthis.workersResolve = [];\n\t\tthis.workerStatus = 0;\n\n\t}\n\n\t_initWorker( workerId ) {\n\n\t\tif ( ! this.workers[ workerId ] ) {\n\n\t\t\tconst worker = this.workerCreator();\n\t\t\tworker.addEventListener( 'message', this._onMessage.bind( this, workerId ) );\n\t\t\tthis.workers[ workerId ] = worker;\n\n\t\t}\n\n\t}\n\n\t_getIdleWorker() {\n\n\t\tfor ( let i = 0; i < this.pool; i ++ )\n\t\t\tif ( ! ( this.workerStatus & ( 1 << i ) ) ) return i;\n\n\t\treturn - 1;\n\n\t}\n\n\t_onMessage( workerId, msg ) {\n\n\t\tconst resolve = this.workersResolve[ workerId ];\n\t\tresolve && resolve( msg );\n\n\t\tif ( this.queue.length ) {\n\n\t\t\tconst { resolve, msg, transfer } = this.queue.shift();\n\t\t\tthis.workersResolve[ workerId ] = resolve;\n\t\t\tthis.workers[ workerId ].postMessage( msg, transfer );\n\n\t\t} else {\n\n\t\t\tthis.workerStatus ^= 1 << workerId;\n\n\t\t}\n\n\t}\n\n\tsetWorkerCreator( workerCreator ) {\n\n\t\tthis.workerCreator = workerCreator;\n\n\t}\n\n\tsetWorkerLimit( pool ) {\n\n\t\tthis.pool = pool;\n\n\t}\n\n\tpostMessage( msg, transfer ) {\n\n\t\treturn new Promise( ( resolve ) => {\n\n\t\t\tconst workerId = this._getIdleWorker();\n\n\t\t\tif ( workerId !== - 1 ) {\n\n\t\t\t\tthis._initWorker( workerId );\n\t\t\t\tthis.workerStatus |= 1 << workerId;\n\t\t\t\tthis.workersResolve[ workerId ] = resolve;\n\t\t\t\tthis.workers[ workerId ].postMessage( msg, transfer );\n\n\t\t\t} else {\n\n\t\t\t\tthis.queue.push( { resolve, msg, transfer } );\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.workers.forEach( ( worker ) => worker.terminate() );\n\t\tthis.workersResolve.length = 0;\n\t\tthis.workers.length = 0;\n\t\tthis.queue.length = 0;\n\t\tthis.workerStatus = 0;\n\n\t}\n\n}\n","const t=0,e=1,n=2,i=3,s=0,a=0,r=2,o=0,l=1,f=160,h=161,U=162,c=163,_=166,p=0,g=1,y=0,x=1,u=2,b=3,d=4,w=5,m=6,D=7,B=8,L=9,v=10,A=11,k=12,V=13,I=14,S=15,F=16,O=17,E=18,T=0,C=1,M=2,P=3,z=4,W=5,H=6,N=7,K=8,X=9,R=10,Y=11,j=0,q=1,G=2,J=13,Q=14,Z=15,$=128,tt=64,et=32,nt=16,it=0,st=1,at=2,rt=3,ot=4,lt=5,ft=6,ht=7,Ut=8,ct=9,_t=10,pt=13,gt=14,yt=15,xt=16,ut=17,bt=20,dt=21,wt=22,mt=23,Dt=24,Bt=27,Lt=28,vt=29,At=30,kt=31,Vt=34,It=35,St=36,Ft=37,Ot=38,Et=41,Tt=42,Ct=43,Mt=44,Pt=45,zt=48,Wt=49,Ht=50,Nt=58,Kt=59,Xt=62,Rt=63,Yt=64,jt=65,qt=68,Gt=69,Jt=70,Qt=71,Zt=74,$t=75,te=76,ee=77,ne=78,ie=81,se=82,ae=83,re=84,oe=85,le=88,fe=89,he=90,Ue=91,ce=92,_e=95,pe=96,ge=97,ye=98,xe=99,ue=100,be=101,de=102,we=103,me=104,De=105,Be=106,Le=107,ve=108,Ae=109,ke=110,Ve=111,Ie=112,Se=113,Fe=114,Oe=115,Ee=116,Te=117,Ce=118,Me=119,Pe=120,ze=121,We=122,He=123,Ne=124,Ke=125,Xe=126,Re=127,Ye=128,je=129,qe=130,Ge=131,Je=132,Qe=133,Ze=134,$e=135,tn=136,en=137,nn=138,sn=139,an=140,rn=141,on=142,ln=143,fn=144,hn=145,Un=146,cn=147,_n=148,pn=149,gn=150,yn=151,xn=152,un=153,bn=154,dn=155,wn=156,mn=157,Dn=158,Bn=159,Ln=160,vn=161,An=162,kn=163,Vn=164,In=165,Sn=166,Fn=167,On=168,En=169,Tn=170,Cn=171,Mn=172,Pn=173,zn=174,Wn=175,Hn=176,Nn=177,Kn=178,Xn=179,Rn=180,Yn=181,jn=182,qn=183,Gn=184,Jn=1000156007,Qn=1000156008,Zn=1000156009,$n=1000156010,ti=1000156011,ei=1000156017,ni=1000156018,ii=1000156019,si=1000156020,ai=1000156021,ri=1000054e3,oi=1000054001,li=1000054002,fi=1000054003,hi=1000054004,Ui=1000054005,ci=1000054006,_i=1000054007,pi=1000066e3,gi=1000066001,yi=1000066002,xi=1000066003,ui=1000066004,bi=1000066005,di=1000066006,wi=1000066007,mi=1000066008,Di=1000066009,Bi=1000066010,Li=1000066011,vi=1000066012,Ai=1000066013,ki=100034e4,Vi=1000340001;class Ii{constructor(){this.vkFormat=0,this.typeSize=1,this.pixelWidth=0,this.pixelHeight=0,this.pixelDepth=0,this.layerCount=0,this.faceCount=1,this.supercompressionScheme=0,this.levels=[],this.dataFormatDescriptor=[{vendorId:0,descriptorType:0,descriptorBlockSize:0,versionNumber:2,colorModel:0,colorPrimaries:1,transferFunction:2,flags:0,texelBlockDimension:[0,0,0,0],bytesPlane:[0,0,0,0,0,0,0,0],samples:[]}],this.keyValue={},this.globalData=null}}class Si{constructor(t,e,n,i){this._dataView=void 0,this._littleEndian=void 0,this._offset=void 0,this._dataView=new DataView(t.buffer,t.byteOffset+e,n),this._littleEndian=i,this._offset=0}_nextUint8(){const t=this._dataView.getUint8(this._offset);return this._offset+=1,t}_nextUint16(){const t=this._dataView.getUint16(this._offset,this._littleEndian);return this._offset+=2,t}_nextUint32(){const t=this._dataView.getUint32(this._offset,this._littleEndian);return this._offset+=4,t}_nextUint64(){const t=this._dataView.getUint32(this._offset,this._littleEndian)+2**32*this._dataView.getUint32(this._offset+4,this._littleEndian);return this._offset+=8,t}_nextInt32(){const t=this._dataView.getInt32(this._offset,this._littleEndian);return this._offset+=4,t}_nextUint8Array(t){const e=new Uint8Array(this._dataView.buffer,this._dataView.byteOffset+this._offset,t);return this._offset+=t,e}_skip(t){return this._offset+=t,this}_scan(t,e){void 0===e&&(e=0);const n=this._offset;let i=0;for(;this._dataView.getUint8(this._offset)!==e&&i<t;)i++,this._offset++;return i<t&&this._offset++,new Uint8Array(this._dataView.buffer,this._dataView.byteOffset+n,i)}}const Fi=new Uint8Array([0]),Oi=[171,75,84,88,32,50,48,187,13,10,26,10];function Ei(t){return(new TextEncoder).encode(t)}function Ti(t){return(new TextDecoder).decode(t)}function Ci(t){let e=0;for(const n of t)e+=n.byteLength;const n=new Uint8Array(e);let i=0;for(const e of t)n.set(new Uint8Array(e),i),i+=e.byteLength;return n}function Mi(t,e){return void 0===e&&(e=4),Math.ceil(t/e)*e-t}function Pi(t){const e=new Uint8Array(t.buffer,t.byteOffset,Oi.length);if(e[0]!==Oi[0]||e[1]!==Oi[1]||e[2]!==Oi[2]||e[3]!==Oi[3]||e[4]!==Oi[4]||e[5]!==Oi[5]||e[6]!==Oi[6]||e[7]!==Oi[7]||e[8]!==Oi[8]||e[9]!==Oi[9]||e[10]!==Oi[10]||e[11]!==Oi[11])throw new Error(\"Missing KTX 2.0 identifier.\");const n=new Ii,i=17*Uint32Array.BYTES_PER_ELEMENT,s=new Si(t,Oi.length,i,!0);n.vkFormat=s._nextUint32(),n.typeSize=s._nextUint32(),n.pixelWidth=s._nextUint32(),n.pixelHeight=s._nextUint32(),n.pixelDepth=s._nextUint32(),n.layerCount=s._nextUint32(),n.faceCount=s._nextUint32();const a=s._nextUint32();n.supercompressionScheme=s._nextUint32();const r=s._nextUint32(),o=s._nextUint32(),l=s._nextUint32(),f=s._nextUint32(),h=s._nextUint64(),U=s._nextUint64(),c=new Si(t,Oi.length+i,3*a*8,!0);for(let e=0;e<a;e++)n.levels.push({levelData:new Uint8Array(t.buffer,t.byteOffset+c._nextUint64(),c._nextUint64()),uncompressedByteLength:c._nextUint64()});const _=new Si(t,r,o,!0),p={vendorId:_._skip(4)._nextUint16(),descriptorType:_._nextUint16(),versionNumber:_._nextUint16(),descriptorBlockSize:_._nextUint16(),colorModel:_._nextUint8(),colorPrimaries:_._nextUint8(),transferFunction:_._nextUint8(),flags:_._nextUint8(),texelBlockDimension:[_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8()],bytesPlane:[_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8()],samples:[]},g=(p.descriptorBlockSize/4-6)/4;for(let t=0;t<g;t++){const e={bitOffset:_._nextUint16(),bitLength:_._nextUint8(),channelType:_._nextUint8(),samplePosition:[_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8()],sampleLower:-Infinity,sampleUpper:Infinity};64&e.channelType?(e.sampleLower=_._nextInt32(),e.sampleUpper=_._nextInt32()):(e.sampleLower=_._nextUint32(),e.sampleUpper=_._nextUint32()),p.samples[t]=e}n.dataFormatDescriptor.length=0,n.dataFormatDescriptor.push(p);const y=new Si(t,l,f,!0);for(;y._offset<f;){const t=y._nextUint32(),e=y._scan(t),i=Ti(e);if(n.keyValue[i]=y._nextUint8Array(t-e.byteLength-1),i.match(/^ktx/i)){const t=Ti(n.keyValue[i]);n.keyValue[i]=t.substring(0,t.lastIndexOf(\"\\0\"))}y._skip(t%4?4-t%4:0)}if(U<=0)return n;const x=new Si(t,h,U,!0),u=x._nextUint16(),b=x._nextUint16(),d=x._nextUint32(),w=x._nextUint32(),m=x._nextUint32(),D=x._nextUint32(),B=[];for(let t=0;t<a;t++)B.push({imageFlags:x._nextUint32(),rgbSliceByteOffset:x._nextUint32(),rgbSliceByteLength:x._nextUint32(),alphaSliceByteOffset:x._nextUint32(),alphaSliceByteLength:x._nextUint32()});const L=h+x._offset,v=L+d,A=v+w,k=A+m,V=new Uint8Array(t.buffer,t.byteOffset+L,d),I=new Uint8Array(t.buffer,t.byteOffset+v,w),S=new Uint8Array(t.buffer,t.byteOffset+A,m),F=new Uint8Array(t.buffer,t.byteOffset+k,D);return n.globalData={endpointCount:u,selectorCount:b,imageDescs:B,endpointsData:V,selectorsData:I,tablesData:S,extendedData:F},n}const zi={keepWriter:!1};function Wi(t,e){void 0===e&&(e={}),e={...zi,...e};let n=new ArrayBuffer(0);if(t.globalData){const e=new ArrayBuffer(20+5*t.globalData.imageDescs.length*4),i=new DataView(e);i.setUint16(0,t.globalData.endpointCount,!0),i.setUint16(2,t.globalData.selectorCount,!0),i.setUint32(4,t.globalData.endpointsData.byteLength,!0),i.setUint32(8,t.globalData.selectorsData.byteLength,!0),i.setUint32(12,t.globalData.tablesData.byteLength,!0),i.setUint32(16,t.globalData.extendedData.byteLength,!0);for(let e=0;e<t.globalData.imageDescs.length;e++){const n=t.globalData.imageDescs[e];i.setUint32(20+5*e*4+0,n.imageFlags,!0),i.setUint32(20+5*e*4+4,n.rgbSliceByteOffset,!0),i.setUint32(20+5*e*4+8,n.rgbSliceByteLength,!0),i.setUint32(20+5*e*4+12,n.alphaSliceByteOffset,!0),i.setUint32(20+5*e*4+16,n.alphaSliceByteLength,!0)}n=Ci([e,t.globalData.endpointsData,t.globalData.selectorsData,t.globalData.tablesData,t.globalData.extendedData])}const i=[];let s=t.keyValue;e.keepWriter||(s={...t.keyValue,KTXwriter:\"KTX-Parse v0.7.1\"});for(const t in s){const e=s[t],n=Ei(t),a=\"string\"==typeof e?Ci([Ei(e),Fi]):e,r=n.byteLength+1+a.byteLength,o=Mi(r,4);i.push(Ci([new Uint32Array([r]),n,Fi,a,new Uint8Array(o).fill(0)]))}const a=Ci(i);if(1!==t.dataFormatDescriptor.length||0!==t.dataFormatDescriptor[0].descriptorType)throw new Error(\"Only BASICFORMAT Data Format Descriptor output supported.\");const r=t.dataFormatDescriptor[0],o=new ArrayBuffer(28+16*r.samples.length),l=new DataView(o),f=24+16*r.samples.length;if(l.setUint32(0,o.byteLength,!0),l.setUint16(4,r.vendorId,!0),l.setUint16(6,r.descriptorType,!0),l.setUint16(8,r.versionNumber,!0),l.setUint16(10,f,!0),l.setUint8(12,r.colorModel),l.setUint8(13,r.colorPrimaries),l.setUint8(14,r.transferFunction),l.setUint8(15,r.flags),!Array.isArray(r.texelBlockDimension))throw new Error(\"texelBlockDimension is now an array. For dimensionality `d`, set `d - 1`.\");l.setUint8(16,r.texelBlockDimension[0]),l.setUint8(17,r.texelBlockDimension[1]),l.setUint8(18,r.texelBlockDimension[2]),l.setUint8(19,r.texelBlockDimension[3]);for(let t=0;t<8;t++)l.setUint8(20+t,r.bytesPlane[t]);for(let t=0;t<r.samples.length;t++){const e=r.samples[t],n=28+16*t;if(e.channelID)throw new Error(\"channelID has been renamed to channelType.\");l.setUint16(n+0,e.bitOffset,!0),l.setUint8(n+2,e.bitLength),l.setUint8(n+3,e.channelType),l.setUint8(n+4,e.samplePosition[0]),l.setUint8(n+5,e.samplePosition[1]),l.setUint8(n+6,e.samplePosition[2]),l.setUint8(n+7,e.samplePosition[3]),64&e.channelType?(l.setInt32(n+8,e.sampleLower,!0),l.setInt32(n+12,e.sampleUpper,!0)):(l.setUint32(n+8,e.sampleLower,!0),l.setUint32(n+12,e.sampleUpper,!0))}const h=Oi.length+68+3*t.levels.length*8,U=h+o.byteLength;let c=n.byteLength>0?U+a.byteLength:0;c%8&&(c+=8-c%8);const _=[],p=new DataView(new ArrayBuffer(3*t.levels.length*8)),g=new Uint32Array(t.levels.length);let y=0;0===t.supercompressionScheme&&(y=function(t,e){const n=Math.max(t,4),i=Math.min(t,4);let s=n;for(;s%i!=0;)s+=n;return s}(function(t){return t.levels[0].levelData.byteLength/function(t,e){let n=1;const i=[t.pixelWidth,t.pixelHeight,t.pixelDepth],s=function(t){const[e,n,i]=t.dataFormatDescriptor[0].texelBlockDimension;return[e+1,n+1,i+1]}(t);for(let t=0;t<3;t++)if(i[t]>0){const e=Math.ceil(Math.floor(i[t]*Math.pow(2,-0))/s[t]);n*=Math.max(1,e)}return t.layerCount>0&&(n*=t.layerCount),t.faceCount>0&&(n*=t.faceCount),n}(t)}(t)));let x=(c||U+a.byteLength)+n.byteLength;for(let e=t.levels.length-1;e>=0;e--){if(x%y){const t=Mi(x,y);_.push(new Uint8Array(t)),x+=t}const n=t.levels[e];_.push(n.levelData),g[e]=x,x+=n.levelData.byteLength}for(let e=0;e<t.levels.length;e++){const n=t.levels[e];p.setBigUint64(24*e+0,BigInt(g[e]),!0),p.setBigUint64(24*e+8,BigInt(n.levelData.byteLength),!0),p.setBigUint64(24*e+16,BigInt(n.uncompressedByteLength),!0)}const u=new ArrayBuffer(68),b=new DataView(u);return b.setUint32(0,t.vkFormat,!0),b.setUint32(4,t.typeSize,!0),b.setUint32(8,t.pixelWidth,!0),b.setUint32(12,t.pixelHeight,!0),b.setUint32(16,t.pixelDepth,!0),b.setUint32(20,t.layerCount,!0),b.setUint32(24,t.faceCount,!0),b.setUint32(28,t.levels.length,!0),b.setUint32(32,t.supercompressionScheme,!0),b.setUint32(36,h,!0),b.setUint32(40,o.byteLength,!0),b.setUint32(44,U,!0),b.setUint32(48,a.byteLength,!0),b.setBigUint64(52,BigInt(n.byteLength>0?c:0),!0),b.setBigUint64(60,BigInt(n.byteLength),!0),new Uint8Array(Ci([new Uint8Array(Oi).buffer,u,p.buffer,o,a,c>0?new ArrayBuffer(c-(U+a.byteLength)):new ArrayBuffer(0),n,..._]))}export{Z as KHR_DF_CHANNEL_RGBSDA_ALPHA,G as KHR_DF_CHANNEL_RGBSDA_BLUE,Q as KHR_DF_CHANNEL_RGBSDA_DEPTH,q as KHR_DF_CHANNEL_RGBSDA_GREEN,j as KHR_DF_CHANNEL_RGBSDA_RED,J as KHR_DF_CHANNEL_RGBSDA_STENCIL,g as KHR_DF_FLAG_ALPHA_PREMULTIPLIED,p as KHR_DF_FLAG_ALPHA_STRAIGHT,s as KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT,U as KHR_DF_MODEL_ASTC,f as KHR_DF_MODEL_ETC1,c as KHR_DF_MODEL_ETC1S,h as KHR_DF_MODEL_ETC2,l as KHR_DF_MODEL_RGBSDA,_ as KHR_DF_MODEL_UASTC,o as KHR_DF_MODEL_UNSPECIFIED,H as KHR_DF_PRIMARIES_ACES,N as KHR_DF_PRIMARIES_ACESCC,Y as KHR_DF_PRIMARIES_ADOBERGB,z as KHR_DF_PRIMARIES_BT2020,M as KHR_DF_PRIMARIES_BT601_EBU,P as KHR_DF_PRIMARIES_BT601_SMPTE,C as KHR_DF_PRIMARIES_BT709,W as KHR_DF_PRIMARIES_CIEXYZ,R as KHR_DF_PRIMARIES_DISPLAYP3,K as KHR_DF_PRIMARIES_NTSC1953,X as KHR_DF_PRIMARIES_PAL525,T as KHR_DF_PRIMARIES_UNSPECIFIED,et as KHR_DF_SAMPLE_DATATYPE_EXPONENT,$ as KHR_DF_SAMPLE_DATATYPE_FLOAT,nt as KHR_DF_SAMPLE_DATATYPE_LINEAR,tt as KHR_DF_SAMPLE_DATATYPE_SIGNED,F as KHR_DF_TRANSFER_ACESCC,O as KHR_DF_TRANSFER_ACESCCT,E as KHR_DF_TRANSFER_ADOBERGB,D as KHR_DF_TRANSFER_BT1886,k as KHR_DF_TRANSFER_DCIP3,L as KHR_DF_TRANSFER_HLG_EOTF,B as KHR_DF_TRANSFER_HLG_OETF,b as KHR_DF_TRANSFER_ITU,x as KHR_DF_TRANSFER_LINEAR,d as KHR_DF_TRANSFER_NTSC,I as KHR_DF_TRANSFER_PAL625_EOTF,V as KHR_DF_TRANSFER_PAL_OETF,v as KHR_DF_TRANSFER_PQ_EOTF,A as KHR_DF_TRANSFER_PQ_OETF,w as KHR_DF_TRANSFER_SLOG,m as KHR_DF_TRANSFER_SLOG2,u as KHR_DF_TRANSFER_SRGB,S as KHR_DF_TRANSFER_ST240,y as KHR_DF_TRANSFER_UNSPECIFIED,a as KHR_DF_VENDORID_KHRONOS,r as KHR_DF_VERSION,e as KHR_SUPERCOMPRESSION_BASISLZ,t as KHR_SUPERCOMPRESSION_NONE,i as KHR_SUPERCOMPRESSION_ZLIB,n as KHR_SUPERCOMPRESSION_ZSTD,Ii as KTX2Container,Ut as VK_FORMAT_A1R5G5B5_UNORM_PACK16,Gt as VK_FORMAT_A2B10G10R10_SINT_PACK32,jt as VK_FORMAT_A2B10G10R10_SNORM_PACK32,qt as VK_FORMAT_A2B10G10R10_UINT_PACK32,Yt as VK_FORMAT_A2B10G10R10_UNORM_PACK32,Rt as VK_FORMAT_A2R10G10B10_SINT_PACK32,Kt as VK_FORMAT_A2R10G10B10_SNORM_PACK32,Xt as VK_FORMAT_A2R10G10B10_UINT_PACK32,Nt as VK_FORMAT_A2R10G10B10_UNORM_PACK32,Vi as VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT,ki as VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT,Li as VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT,Rn as VK_FORMAT_ASTC_10x10_SRGB_BLOCK,Xn as VK_FORMAT_ASTC_10x10_UNORM_BLOCK,mi as VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT,zn as VK_FORMAT_ASTC_10x5_SRGB_BLOCK,Pn as VK_FORMAT_ASTC_10x5_UNORM_BLOCK,Di as VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT,Hn as VK_FORMAT_ASTC_10x6_SRGB_BLOCK,Wn as VK_FORMAT_ASTC_10x6_UNORM_BLOCK,Bi as VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT,Kn as VK_FORMAT_ASTC_10x8_SRGB_BLOCK,Nn as VK_FORMAT_ASTC_10x8_UNORM_BLOCK,vi as VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT,jn as VK_FORMAT_ASTC_12x10_SRGB_BLOCK,Yn as VK_FORMAT_ASTC_12x10_UNORM_BLOCK,Ai as VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT,Gn as VK_FORMAT_ASTC_12x12_SRGB_BLOCK,qn as VK_FORMAT_ASTC_12x12_UNORM_BLOCK,pi as VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT,Dn as VK_FORMAT_ASTC_4x4_SRGB_BLOCK,mn as VK_FORMAT_ASTC_4x4_UNORM_BLOCK,gi as VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT,Ln as VK_FORMAT_ASTC_5x4_SRGB_BLOCK,Bn as VK_FORMAT_ASTC_5x4_UNORM_BLOCK,yi as VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT,An as VK_FORMAT_ASTC_5x5_SRGB_BLOCK,vn as VK_FORMAT_ASTC_5x5_UNORM_BLOCK,xi as VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT,Vn as VK_FORMAT_ASTC_6x5_SRGB_BLOCK,kn as VK_FORMAT_ASTC_6x5_UNORM_BLOCK,ui as VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT,Sn as VK_FORMAT_ASTC_6x6_SRGB_BLOCK,In as VK_FORMAT_ASTC_6x6_UNORM_BLOCK,bi as VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT,On as VK_FORMAT_ASTC_8x5_SRGB_BLOCK,Fn as VK_FORMAT_ASTC_8x5_UNORM_BLOCK,di as VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT,Tn as VK_FORMAT_ASTC_8x6_SRGB_BLOCK,En as VK_FORMAT_ASTC_8x6_UNORM_BLOCK,wi as VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT,Mn as VK_FORMAT_ASTC_8x8_SRGB_BLOCK,Cn as VK_FORMAT_ASTC_8x8_UNORM_BLOCK,We as VK_FORMAT_B10G11R11_UFLOAT_PACK32,ti as VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16,ai as VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16,rt as VK_FORMAT_B4G4R4A4_UNORM_PACK16,ht as VK_FORMAT_B5G5R5A1_UNORM_PACK16,lt as VK_FORMAT_B5G6R5_UNORM_PACK16,Wt as VK_FORMAT_B8G8R8A8_SINT,Pt as VK_FORMAT_B8G8R8A8_SNORM,Ht as VK_FORMAT_B8G8R8A8_SRGB,zt as VK_FORMAT_B8G8R8A8_UINT,Mt as VK_FORMAT_B8G8R8A8_UNORM,It as VK_FORMAT_B8G8R8_SINT,kt as VK_FORMAT_B8G8R8_SNORM,St as VK_FORMAT_B8G8R8_SRGB,Vt as VK_FORMAT_B8G8R8_UINT,At as VK_FORMAT_B8G8R8_UNORM,Ze as VK_FORMAT_BC1_RGBA_SRGB_BLOCK,Qe as VK_FORMAT_BC1_RGBA_UNORM_BLOCK,Je as VK_FORMAT_BC1_RGB_SRGB_BLOCK,Ge as VK_FORMAT_BC1_RGB_UNORM_BLOCK,tn as VK_FORMAT_BC2_SRGB_BLOCK,$e as VK_FORMAT_BC2_UNORM_BLOCK,nn as VK_FORMAT_BC3_SRGB_BLOCK,en as VK_FORMAT_BC3_UNORM_BLOCK,an as VK_FORMAT_BC4_SNORM_BLOCK,sn as VK_FORMAT_BC4_UNORM_BLOCK,on as VK_FORMAT_BC5_SNORM_BLOCK,rn as VK_FORMAT_BC5_UNORM_BLOCK,fn as VK_FORMAT_BC6H_SFLOAT_BLOCK,ln as VK_FORMAT_BC6H_UFLOAT_BLOCK,Un as VK_FORMAT_BC7_SRGB_BLOCK,hn as VK_FORMAT_BC7_UNORM_BLOCK,Ne as VK_FORMAT_D16_UNORM,Ye as VK_FORMAT_D16_UNORM_S8_UINT,je as VK_FORMAT_D24_UNORM_S8_UINT,Xe as VK_FORMAT_D32_SFLOAT,qe as VK_FORMAT_D32_SFLOAT_S8_UINT,He as VK_FORMAT_E5B9G9R9_UFLOAT_PACK32,wn as VK_FORMAT_EAC_R11G11_SNORM_BLOCK,dn as VK_FORMAT_EAC_R11G11_UNORM_BLOCK,bn as VK_FORMAT_EAC_R11_SNORM_BLOCK,un as VK_FORMAT_EAC_R11_UNORM_BLOCK,gn as VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK,pn as VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK,xn as VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK,yn as VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK,_n as VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK,cn as VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK,$n as VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16,si as VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16,hi as VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG,ri as VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG,Ui as VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG,oi as VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG,ci as VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG,li as VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG,_i as VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG,fi as VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG,Zn as VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16,Qn as VK_FORMAT_R10X6G10X6_UNORM_2PACK16,Jn as VK_FORMAT_R10X6_UNORM_PACK16,ii as VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16,ni as VK_FORMAT_R12X4G12X4_UNORM_2PACK16,ei as VK_FORMAT_R12X4_UNORM_PACK16,ge as VK_FORMAT_R16G16B16A16_SFLOAT,pe as VK_FORMAT_R16G16B16A16_SINT,ce as VK_FORMAT_R16G16B16A16_SNORM,_e as VK_FORMAT_R16G16B16A16_UINT,Ue as VK_FORMAT_R16G16B16A16_UNORM,he as VK_FORMAT_R16G16B16_SFLOAT,fe as VK_FORMAT_R16G16B16_SINT,oe as VK_FORMAT_R16G16B16_SNORM,le as VK_FORMAT_R16G16B16_UINT,re as VK_FORMAT_R16G16B16_UNORM,ae as VK_FORMAT_R16G16_SFLOAT,se as VK_FORMAT_R16G16_SINT,ne as VK_FORMAT_R16G16_SNORM,ie as VK_FORMAT_R16G16_UINT,ee as VK_FORMAT_R16G16_UNORM,te as VK_FORMAT_R16_SFLOAT,$t as VK_FORMAT_R16_SINT,Qt as VK_FORMAT_R16_SNORM,Zt as VK_FORMAT_R16_UINT,Jt as VK_FORMAT_R16_UNORM,Ae as VK_FORMAT_R32G32B32A32_SFLOAT,ve as VK_FORMAT_R32G32B32A32_SINT,Le as VK_FORMAT_R32G32B32A32_UINT,Be as VK_FORMAT_R32G32B32_SFLOAT,De as VK_FORMAT_R32G32B32_SINT,me as VK_FORMAT_R32G32B32_UINT,we as VK_FORMAT_R32G32_SFLOAT,de as VK_FORMAT_R32G32_SINT,be as VK_FORMAT_R32G32_UINT,ue as VK_FORMAT_R32_SFLOAT,xe as VK_FORMAT_R32_SINT,ye as VK_FORMAT_R32_UINT,at as VK_FORMAT_R4G4B4A4_UNORM_PACK16,st as VK_FORMAT_R4G4_UNORM_PACK8,ft as VK_FORMAT_R5G5B5A1_UNORM_PACK16,ot as VK_FORMAT_R5G6B5_UNORM_PACK16,ze as VK_FORMAT_R64G64B64A64_SFLOAT,Pe as VK_FORMAT_R64G64B64A64_SINT,Me as VK_FORMAT_R64G64B64A64_UINT,Ce as VK_FORMAT_R64G64B64_SFLOAT,Te as VK_FORMAT_R64G64B64_SINT,Ee as VK_FORMAT_R64G64B64_UINT,Oe as VK_FORMAT_R64G64_SFLOAT,Fe as VK_FORMAT_R64G64_SINT,Se as VK_FORMAT_R64G64_UINT,Ie as VK_FORMAT_R64_SFLOAT,Ve as VK_FORMAT_R64_SINT,ke as VK_FORMAT_R64_UINT,Tt as VK_FORMAT_R8G8B8A8_SINT,Ot as VK_FORMAT_R8G8B8A8_SNORM,Ct as VK_FORMAT_R8G8B8A8_SRGB,Et as VK_FORMAT_R8G8B8A8_UINT,Ft as VK_FORMAT_R8G8B8A8_UNORM,Lt as VK_FORMAT_R8G8B8_SINT,Dt as VK_FORMAT_R8G8B8_SNORM,vt as VK_FORMAT_R8G8B8_SRGB,Bt as VK_FORMAT_R8G8B8_UINT,mt as VK_FORMAT_R8G8B8_UNORM,dt as VK_FORMAT_R8G8_SINT,ut as VK_FORMAT_R8G8_SNORM,wt as VK_FORMAT_R8G8_SRGB,bt as VK_FORMAT_R8G8_UINT,xt as VK_FORMAT_R8G8_UNORM,gt as VK_FORMAT_R8_SINT,_t as VK_FORMAT_R8_SNORM,yt as VK_FORMAT_R8_SRGB,pt as VK_FORMAT_R8_UINT,ct as VK_FORMAT_R8_UNORM,Re as VK_FORMAT_S8_UINT,it as VK_FORMAT_UNDEFINED,Ke as VK_FORMAT_X8_D24_UNORM_PACK32,Pi as read,Wi as write};\n","let A,I,B;const g={env:{emscripten_notify_memory_growth:function(A){B=new Uint8Array(I.exports.memory.buffer)}}};class Q{init(){return A||(A=\"undefined\"!=typeof fetch?fetch(\"data:application/wasm;base64,\"+C).then(A=>A.arrayBuffer()).then(A=>WebAssembly.instantiate(A,g)).then(this._init):WebAssembly.instantiate(Buffer.from(C,\"base64\"),g).then(this._init),A)}_init(A){I=A.instance,g.env.emscripten_notify_memory_growth(0)}decode(A,g=0){if(!I)throw new Error(\"ZSTDDecoder: Await .init() before decoding.\");const Q=A.byteLength,C=I.exports.malloc(Q);B.set(A,C),g=g||Number(I.exports.ZSTD_findDecompressedSize(C,Q));const E=I.exports.malloc(g),i=I.exports.ZSTD_decompress(E,g,C,Q),D=B.slice(E,E+i);return I.exports.free(C),I.exports.free(E),D}}const C=\"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IAMNACAEQQNxBEADQCACRQ0FIAAgAkF/aiICaiIDIAEgAmotAAA6AAAgA0EDcQ0ACwsgAkEDTQ0AA0AgACACQXxqIgJqIAEgAmooAgA2AgAgAkEDSw0ACwsgAkUNAgNAIAAgAkF/aiICaiABIAJqLQAAOgAAIAINAAsMAgsgAkEDTQ0AIAIhBANAIAMgASgCADYCACABQQRqIQEgA0EEaiEDIARBfGoiBEEDSw0ACyACQQNxIQILIAJFDQADQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQX9qIgINAAsLIAAL8wICAn8BfgJAIAJFDQAgACACaiIDQX9qIAE6AAAgACABOgAAIAJBA0kNACADQX5qIAE6AAAgACABOgABIANBfWogAToAACAAIAE6AAIgAkEHSQ0AIANBfGogAToAACAAIAE6AAMgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa0iBUIghiAFhCEFIAMgBGohAQNAIAEgBTcDGCABIAU3AxAgASAFNwMIIAEgBTcDACABQSBqIQEgAkFgaiICQR9LDQALCyAACy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAIajYCACADCy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAFajYCACADCx8AIAAgASACKAIEEAg2AgAgARAEGiAAIAJBCGo2AgQLCAAgAGdBH3MLugUBDX8jAEEQayIKJAACfyAEQQNNBEAgCkEANgIMIApBDGogAyAEEAsaIAAgASACIApBDGpBBBAVIgBBbCAAEAMbIAAgACAESxsMAQsgAEEAIAEoAgBBAXRBAmoQECENQVQgAygAACIGQQ9xIgBBCksNABogAiAAQQVqNgIAIAMgBGoiAkF8aiEMIAJBeWohDiACQXtqIRAgAEEGaiELQQQh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ASIDNgLE4AEgACgCvOABIQQgACABNgK84AEgACABIAJqNgK44AEgACABIAQgA2tqNgLA4AELpgEBAX8gACAAKALs4QEQFjYCyOABIABCADcD+OABIABCADcDuOABIABBwOABakIANwMAIABBqNAAaiIBQYyAgOAANgIAIABBADYCmOIBIABCADcDiOEBIABCAzcDgOEBIABBrNABakHgEikCADcCACAAQbTQAWpB6BIoAgA2AgAgACABNgIMIAAgAEGYIGo2AgggACAAQaAwajYCBCAAIABBEGo2AgALYQEBf0G4fyEDAkAgAUEDSQ0AIAIgABAhIgFBA3YiADYCCCACIAFBAXE2AgQgAiABQQF2QQNxIgM2AgACQCADQX9qIgFBAksNAAJAIAFBAWsOAgEAAgtBbA8LIAAhAwsgAwsMACAAIAEgAkEAEC4LiAQCA38CfiADEBYhBCAAQQBBKBAQIQAgBCACSwRAIAQPCyABRQRAQX8PCwJAAkAgA0EBRg0AIAEoAAAiBkGo6r5pRg0AQXYhAyAGQXBxQdDUtMIBRw0BQQghAyACQQhJDQEgAEEAQSgQECEAIAEoAAQhASAAQQE2AhQgACABrTcDAEEADwsgASACIAMQLyIDIAJLDQAgACADNgIYQXIhAyABIARqIgVBf2otAAAiAkEIcQ0AIAJBIHEiBkUEQEFwIQMgBS0AACIFQacBSw0BIAVBB3GtQgEgBUEDdkEKaq2GIgdCA4h+IAd8IQggBEEBaiEECyACQQZ2IQMgAkECdiEFAkAgAkEDcUF/aiICQQJLBEBBACECDAELAkACQAJAIAJBAWsOAgECAAsgASAEai0AACECIARBAWohBAwCCyABIARqLwAAIQIgBEECaiEEDAELIAEgBGooAAAhAiAEQQRqIQQLIAVBAXEhBQJ+AkACQAJAIANBf2oiA0ECTQRAIANBAWsOAgIDAQtCfyAGRQ0DGiABIARqMQAADAMLIAEgBGovAACtQoACfAwCCyABIARqKAAArQwBCyABIARqKQAACyEHIAAgBTYCICAAIAI2AhwgACAHNwMAQQAhAyAAQQA2AhQgACAHIAggBhsiBzcDCCAAIAdCgIAIIAdCgIAIVBs+AhALIAMLWwEBf0G4fyEDIAIQFiICIAFNBH8gACACakF/ai0AACIAQQNxQQJ0QaAeaigC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C0Egak8NAQsgByAHKQNoNwMQIAcgBykDYDcDCCAEIA0gB0EIaiAHQdwAaiAPIA4gESAQEB4hCwwBCyACIARqIQggBCAKEAcgAkERTwRAIARBEGohAgNAIAIgCkEQaiIKEAcgAkEQaiICIAhJDQALCyAIIAlrIQIgByATNgJcIAkgCCAOa0sEQCAJIAggEWtLBEBBbCELDAILIBAgAiAOayICaiIKIANqIBBNBEAgCCAKIAMQDxoMAgsgCCAKQQAgAmsQDyEIIAcgAiADaiIDNgJkIAggAmshCCAOIQILIAlBEE8EQCADIAhqIQMDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALDAELAkAgCUEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgCUECdCIDQcAeaigCAGoiAhAXIAIgA0HgHmooAgBrIQIgBygCZCEDDAELIAggAhAMCyADQQlJDQAgAyAIaiEDIAhBCGoiCCACQQhqIgJrQQ9MBEADQCAIIAIQDCACQQhqIQIgCEEIaiIIIANJDQAMAgALAAsDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALCyAHQRhqEAQaIAsgDCALEAMiAhshDCAEIAQgC2ogAhshBCAFQX9qIgUNAAsgDBADDQFBbCEMIAdBGGoQBEECSQ0BQQAhCANAIAhBA0cEQCAAIAhBAnQiAmpBrNABaiACIAdqKAJENgIAIAhBAWohCAwBCwsgBygCXCEIC0G6fyEMIA8gCGsiACANIARrSw0AIAQEfyAEIAggABALIABqBUEACyABayEMCyAHQfAAaiQAIAwLkRcCFn8FfiMAQdABayIHJAAgByAAKALw4QEiCDYCvAEgASACaiESIAggACgCgOIBaiETAkACQCAFRQRAIAEhAwwBCyAAKALE4AEhESAAKALA4AEhFSAAKAK84AEhDyAAQQE2AozhAUEAIQgDQCAIQQNHBEAgByAIQQJ0IgJqIAAgAmpBrNABaigCADYCVCAIQQFqIQgMAQsLIAcgETYCZCAHIA82AmAgByABIA9rNgJoQWwhECAHQShqIAMgBBAGEAMNASAFQQQgBUEESBshFyAHQTxqIAdBKGogACgCABATIAdBxABqIAdBKGogACgCCBATIAdBzABqIAdB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IAdB0AFqJAAgEAslACAAQgA3AgAgAEEAOwEIIABBADoACyAAIAE2AgwgACACOgAKC7QFAQN/IwBBMGsiBCQAIABB/wFqIgVBfWohBgJAIAMvAQIEQCAEQRhqIAEgAhAGIgIQAw0BIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahASOgAAIAMgBEEIaiAEQRhqEBI6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0FIAEgBEEQaiAEQRhqEBI6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBSABIARBCGogBEEYahASOgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEjoAACABIAJqIABrIQIMAwsgAyAEQRBqIARBGGoQEjoAAiADIARBCGogBEEYahASOgADIANBBGohAwwAAAsACyAEQRhqIAEgAhAGIgIQAw0AIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahAROgAAIAMgBEEIaiAEQRhqEBE6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0EIAEgBEEQaiAEQRhqEBE6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBCABIARBCGogBEEYahAROgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEToAACABIAJqIABrIQIMAgsgAyAEQRBqIARBGGoQEToAAiADIARBCGogBEEYahAROgADIANBBGohAwwAAAsACyAEQTBqJAAgAgtpAQF/An8CQAJAIAJBB00NACABKAAAQbfIwuF+Rw0AIAAgASgABDYCmOIBQWIgAEEQaiABIAIQPiIDEAMNAhogAEKBgICAEDcDiOEBIAAgASADaiACIANrECoMAQsgACABIAIQKgtBAAsLrQMBBn8jAEGAAWsiAyQAQWIhCAJAIAJBCUkNACAAQZjQAGogAUEIaiIEIAJBeGogAEGY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wOABCwutAgIEfwF+IwBBQGoiBCQAAkACQCACQQhJDQAgASgAAEFwcUHQ1LTCAUcNACABIAIQIiEBIABCADcDCCAAQQA2AgQgACABNgIADAELIARBGGogASACEC0iAxADBEAgACADEBoMAQsgAwRAIABBuH8QGgwBCyACIAQoAjAiA2shAiABIANqIQMDQAJAIAAgAyACIARBCGoQLCIFEAMEfyAFBSACIAVBA2oiBU8NAUG4fwsQGgwCCyAGQQFqIQYgAiAFayECIAMgBWohAyAEKAIMRQ0ACyAEKAI4BEAgAkEDTQRAIABBuH8QGgwCCyADQQRqIQMLIAQoAighAiAEKQMYIQcgAEEANgIEIAAgAyABazYCACAAIAIgBmytIAcgB0J/URs3AwgLIARBQGskAAslAQF/IwBBEGsiAiQAIAIgACABEFEgAigCACEAIAJBEGokACAAC30BBH8jAEGQBGsiBCQAIARB/wE2AggCQCAEQRBqIARBCGogBEEMaiABIAIQFSIGEAMEQCAGIQUMAQtBVCEFIAQoAgwiB0EGSw0AIAMgBEEQaiAEKAIIIAcQQSIFEAMNACAAIAEgBmogAiAGayADEDwhBQsgBEGQBGokACAFC4cBAgJ/An5BABAWIQMCQANAIAEgA08EQAJAIAAoAABBcHFB0NS0wgFGBEAgACABECIiAhADRQ0BQn4PCyAAIAEQVSIEQn1WDQMgBCAFfCIFIARUIQJCfiEEIAINAyAAIAEQUiICEAMNAwsgASACayEBIAAgAmohAAwBCwtCfiAFIAEbIQQLIAQLPwIBfwF+IwBBMGsiAiQAAn5CfiACQQhqIAAgARAtDQAaQgAgAigCHEEBRg0AGiACKQMICyEDIAJBMGokACADC40BAQJ/IwBBMGsiASQAAkAgAEUNACAAKAKI4gENACABIABB/OEBaigCADYCKCABIAApAvThATcDICAAEDAgACgCqOIBIQIgASABKAIoNgIYIAEgASkDIDcDECACIAFBEGoQGyAAQQA2AqjiASABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALKgECfyMAQRBrIgAkACAAQQA2AgggAEIANwMAIAAQWCEBIABBEGokACABC4cBAQN/IwBBEGsiAiQAAkAgACgCAEUgACgCBEVzDQAgAiAAKAIINgIIIAIgACkCADcDAAJ/IAIoAgAiAQRAIAIoAghBqOMJIAERBQAMAQtBqOMJECgLIgFFDQAgASAAKQIANwL04QEgAUH84QFqIAAoAgg2AgAgARBZIAEhAwsgAkEQaiQAIAMLywEBAn8jAEEgayIBJAAgAEGBgIDAADYCtOIBIABBADYCiOIBIABBADYC7OEBIABCADcDkOIBIABBADYCpOMJIABBADYC3OIBIABCADcCzOIBIABBADYCvOIBIABBADYCxOABIABCADcCnOIBIABBpOIBakIANwIAIABBrOIBakEANgIAIAFCADcCECABQgA3AhggASABKQMYNwMIIAEgASkDEDcDACABKAIIQQh2QQFxIQIgAEEANgLg4gEgACACNgKM4gEgAUEgaiQAC3YBA38jAEEwayIBJAAgAARAIAEgAEHE0AFqIgIoAgA2AiggASAAKQK80AE3AyAgACgCACEDIAEgAigCADYCGCABIAApArzQATcDECADIAFBEGoQGyABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALzAEBAX8gACABKAK00AE2ApjiASAAIAEoAgQiAjYCwOABIAAgAjYCvOABIAAgAiABKAIIaiICNgK44AEgACACNgLE4AEgASgCuNABBEAgAEKBgICAEDcDiOEBIAAgAUGk0ABqNgIMIAAgAUGUIGo2AgggACABQZwwajYCBCAAIAFBDGo2AgAgAEGs0AFqIAFBqNABaigCADYCACAAQbDQAWogAUGs0AFqKAIANgIAIABBtNABaiABQbDQAWooAgA2AgAPCyAAQgA3A4jhAQs7ACACRQRAQbp/DwsgBEUEQEFsDwsgAiAEEGAEQCAAIAEgAiADIAQgBRBhDwsgACABIAIgAyAEIAUQZQtGAQF/IwBBEGsiBSQAIAVBCGogBBAOAn8gBS0ACQRAIAAgASACIAMgBBAyDAELIAAgASACIAMgBBA0CyEAIAVBEGokACAACzQAIAAgAyAEIAUQNiIFEAMEQCAFDwsgBSAESQR/IAEgAiADIAVqIAQgBWsgABA1BUG4fwsLRgEBfyMAQRBrIgUkACAFQQhqIAQQDgJ/IAUtAAkEQCAAIAEgAiADIAQQYgwBCyAAIAEgAiADIAQQNQshACAFQRBqJAAgAAtZAQF/QQ8hAiABIABJBEAgAUEE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\";export{Q as ZSTDDecoder};\n","/**\n * Loader for KTX 2.0 GPU Texture containers.\n *\n * KTX 2.0 is a container format for various GPU texture formats. The loader\n * supports Basis Universal GPU textures, which can be quickly transcoded to\n * a wide variety of GPU texture compression formats, as well as some\n * uncompressed DataTexture and Data3DTexture formats.\n *\n * References:\n * - KTX: http://github.khronos.org/KTX-Specification/\n * - DFD: https://www.khronos.org/registry/DataFormat/specs/1.3/dataformat.1.3.html#basicdescriptor\n * - BasisU HDR: https://github.com/BinomialLLC/basis_universal/wiki/UASTC-HDR-Texture-Specification-v1.0\n */\n\nimport {\n\tCompressedTexture,\n\tCompressedArrayTexture,\n\tCompressedCubeTexture,\n\tData3DTexture,\n\tDataTexture,\n\tFileLoader,\n\tFloatType,\n\tHalfFloatType,\n\tNoColorSpace,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearSRGBColorSpace,\n\tLoader,\n\tRedFormat,\n\tRGB_BPTC_UNSIGNED_Format,\n\tRGB_ETC1_Format,\n\tRGB_ETC2_Format,\n\tRGB_PVRTC_4BPPV1_Format,\n\tRGBA_ASTC_4x4_Format,\n\tRGBA_ASTC_6x6_Format,\n\tRGBA_BPTC_Format,\n\tRGBA_ETC2_EAC_Format,\n\tRGBA_PVRTC_4BPPV1_Format,\n\tRGBA_S3TC_DXT5_Format,\n\tRGBA_S3TC_DXT1_Format,\n\tRGBAFormat,\n\tRGFormat,\n\tSRGBColorSpace,\n\tUnsignedByteType,\n} from 'three';\nimport { WorkerPool } from '../utils/WorkerPool.js';\nimport {\n\tread,\n\tKHR_DF_FLAG_ALPHA_PREMULTIPLIED,\n\tKHR_DF_TRANSFER_SRGB,\n\tKHR_SUPERCOMPRESSION_NONE,\n\tKHR_SUPERCOMPRESSION_ZSTD,\n\tVK_FORMAT_UNDEFINED,\n\tVK_FORMAT_R16_SFLOAT,\n\tVK_FORMAT_R16G16_SFLOAT,\n\tVK_FORMAT_R16G16B16A16_SFLOAT,\n\tVK_FORMAT_R32_SFLOAT,\n\tVK_FORMAT_R32G32_SFLOAT,\n\tVK_FORMAT_R32G32B32A32_SFLOAT,\n\tVK_FORMAT_R8_SRGB,\n\tVK_FORMAT_R8_UNORM,\n\tVK_FORMAT_R8G8_SRGB,\n\tVK_FORMAT_R8G8_UNORM,\n\tVK_FORMAT_R8G8B8A8_SRGB,\n\tVK_FORMAT_R8G8B8A8_UNORM,\n\tVK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT,\n\tVK_FORMAT_ASTC_6x6_SRGB_BLOCK,\n\tVK_FORMAT_ASTC_6x6_UNORM_BLOCK,\n\tKHR_DF_PRIMARIES_UNSPECIFIED,\n\tKHR_DF_PRIMARIES_BT709,\n\tKHR_DF_PRIMARIES_DISPLAYP3\n} from '../libs/ktx-parse.module.js';\nimport { ZSTDDecoder } from '../libs/zstddec.module.js';\nimport { DisplayP3ColorSpace, LinearDisplayP3ColorSpace } from '../math/ColorSpaces.js';\n\nconst _taskCache = new WeakMap();\n\nlet _activeLoaders = 0;\n\nlet _zstd;\n\nclass KTX2Loader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.transcoderPath = '';\n\t\tthis.transcoderBinary = null;\n\t\tthis.transcoderPending = null;\n\n\t\tthis.workerPool = new WorkerPool();\n\t\tthis.workerSourceURL = '';\n\t\tthis.workerConfig = null;\n\n\t\tif ( typeof MSC_TRANSCODER !== 'undefined' ) {\n\n\t\t\tconsole.warn(\n\n\t\t\t\t'THREE.KTX2Loader: Please update to latest \"basis_transcoder\".'\n\t\t\t\t+ ' \"msc_basis_transcoder\" is no longer supported in three.js r125+.'\n\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\tsetTranscoderPath( path ) {\n\n\t\tthis.transcoderPath = path;\n\n\t\treturn this;\n\n\t}\n\n\tsetWorkerLimit( num ) {\n\n\t\tthis.workerPool.setWorkerLimit( num );\n\n\t\treturn this;\n\n\t}\n\n\tasync detectSupportAsync( renderer ) {\n\n\t\tthis.workerConfig = {\n\t\t\tastcSupported: await renderer.hasFeatureAsync( 'texture-compression-astc' ),\n\t\t\tastcHDRSupported: false, // https://github.com/gpuweb/gpuweb/issues/3856\n\t\t\tetc1Supported: await renderer.hasFeatureAsync( 'texture-compression-etc1' ),\n\t\t\tetc2Supported: await renderer.hasFeatureAsync( 'texture-compression-etc2' ),\n\t\t\tdxtSupported: await renderer.hasFeatureAsync( 'texture-compression-bc' ),\n\t\t\tbptcSupported: await renderer.hasFeatureAsync( 'texture-compression-bptc' ),\n\t\t\tpvrtcSupported: await renderer.hasFeatureAsync( 'texture-compression-pvrtc' )\n\t\t};\n\n\t\treturn this;\n\n\t}\n\n\tdetectSupport( renderer ) {\n\n\t\tif ( renderer.isWebGPURenderer === true ) {\n\n\t\t\tthis.workerConfig = {\n\t\t\t\tastcSupported: renderer.hasFeature( 'texture-compression-astc' ),\n\t\t\t\tastcHDRSupported: false, // https://github.com/gpuweb/gpuweb/issues/3856\n\t\t\t\tetc1Supported: renderer.hasFeature( 'texture-compression-etc1' ),\n\t\t\t\tetc2Supported: renderer.hasFeature( 'texture-compression-etc2' ),\n\t\t\t\tdxtSupported: renderer.hasFeature( 'texture-compression-bc' ),\n\t\t\t\tbptcSupported: renderer.hasFeature( 'texture-compression-bptc' ),\n\t\t\t\tpvrtcSupported: renderer.hasFeature( 'texture-compression-pvrtc' )\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tthis.workerConfig = {\n\t\t\t\tastcSupported: renderer.extensions.has( 'WEBGL_compressed_texture_astc' ),\n\t\t\t\tastcHDRSupported: renderer.extensions.has( 'WEBGL_compressed_texture_astc' )\n\t\t\t\t\t&& renderer.extensions.get( 'WEBGL_compressed_texture_astc' ).getSupportedProfiles().includes( 'hdr' ),\n\t\t\t\tetc1Supported: renderer.extensions.has( 'WEBGL_compressed_texture_etc1' ),\n\t\t\t\tetc2Supported: renderer.extensions.has( 'WEBGL_compressed_texture_etc' ),\n\t\t\t\tdxtSupported: renderer.extensions.has( 'WEBGL_compressed_texture_s3tc' ),\n\t\t\t\tbptcSupported: renderer.extensions.has( 'EXT_texture_compression_bptc' ),\n\t\t\t\tpvrtcSupported: renderer.extensions.has( 'WEBGL_compressed_texture_pvrtc' )\n\t\t\t\t\t|| renderer.extensions.has( 'WEBKIT_WEBGL_compressed_texture_pvrtc' )\n\t\t\t};\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tinit() {\n\n\t\tif ( ! this.transcoderPending ) {\n\n\t\t\t// Load transcoder wrapper.\n\t\t\tconst jsLoader = new FileLoader( this.manager );\n\t\t\tjsLoader.setPath( this.transcoderPath );\n\t\t\tjsLoader.setWithCredentials( this.withCredentials );\n\t\t\tconst jsContent = jsLoader.loadAsync( 'basis_transcoder.js' );\n\n\t\t\t// Load transcoder WASM binary.\n\t\t\tconst binaryLoader = new FileLoader( this.manager );\n\t\t\tbinaryLoader.setPath( this.transcoderPath );\n\t\t\tbinaryLoader.setResponseType( 'arraybuffer' );\n\t\t\tbinaryLoader.setWithCredentials( this.withCredentials );\n\t\t\tconst binaryContent = binaryLoader.loadAsync( 'basis_transcoder.wasm' );\n\n\t\t\tthis.transcoderPending = Promise.all( [ jsContent, binaryContent ] )\n\t\t\t\t.then( ( [ jsContent, binaryContent ] ) => {\n\n\t\t\t\t\tconst fn = KTX2Loader.BasisWorker.toString();\n\n\t\t\t\t\tconst body = [\n\t\t\t\t\t\t'/* constants */',\n\t\t\t\t\t\t'let _EngineFormat = ' + JSON.stringify( KTX2Loader.EngineFormat ),\n\t\t\t\t\t\t'let _EngineType = ' + JSON.stringify( KTX2Loader.EngineType ),\n\t\t\t\t\t\t'let _TranscoderFormat = ' + JSON.stringify( KTX2Loader.TranscoderFormat ),\n\t\t\t\t\t\t'let _BasisFormat = ' + JSON.stringify( KTX2Loader.BasisFormat ),\n\t\t\t\t\t\t'/* basis_transcoder.js */',\n\t\t\t\t\t\tjsContent,\n\t\t\t\t\t\t'/* worker */',\n\t\t\t\t\t\tfn.substring( fn.indexOf( '{' ) + 1, fn.lastIndexOf( '}' ) )\n\t\t\t\t\t].join( '\\n' );\n\n\t\t\t\t\tthis.workerSourceURL = URL.createObjectURL( new Blob( [ body ] ) );\n\t\t\t\t\tthis.transcoderBinary = binaryContent;\n\n\t\t\t\t\tthis.workerPool.setWorkerCreator( () => {\n\n\t\t\t\t\t\tconst worker = new Worker( this.workerSourceURL );\n\t\t\t\t\t\tconst transcoderBinary = this.transcoderBinary.slice( 0 );\n\n\t\t\t\t\t\tworker.postMessage( { type: 'init', config: this.workerConfig, transcoderBinary }, [ transcoderBinary ] );\n\n\t\t\t\t\t\treturn worker;\n\n\t\t\t\t\t} );\n\n\t\t\t\t} );\n\n\t\t\tif ( _activeLoaders > 0 ) {\n\n\t\t\t\t// Each instance loads a transcoder and allocates workers, increasing network and memory cost.\n\n\t\t\t\tconsole.warn(\n\n\t\t\t\t\t'THREE.KTX2Loader: Multiple active KTX2 loaders may cause performance issues.'\n\t\t\t\t\t+ ' Use a single KTX2Loader instance, or call .dispose() on old instances.'\n\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t_activeLoaders ++;\n\n\t\t}\n\n\t\treturn this.transcoderPending;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( this.workerConfig === null ) {\n\n\t\t\tthrow new Error( 'THREE.KTX2Loader: Missing initialization with `.detectSupport( renderer )`.' );\n\n\t\t}\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, ( buffer ) => {\n\n\t\t\tthis.parse( buffer, onLoad, onError );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( buffer, onLoad, onError ) {\n\n\t\tif ( this.workerConfig === null ) {\n\n\t\t\tthrow new Error( 'THREE.KTX2Loader: Missing initialization with `.detectSupport( renderer )`.' );\n\n\t\t}\n\n\t\t// Check for an existing task using this buffer. A transferred buffer cannot be transferred\n\t\t// again from this thread.\n\t\tif ( _taskCache.has( buffer ) ) {\n\n\t\t\tconst cachedTask = _taskCache.get( buffer );\n\n\t\t\treturn cachedTask.promise.then( onLoad ).catch( onError );\n\n\t\t}\n\n\t\tthis._createTexture( buffer )\n\t\t\t.then( ( texture ) => onLoad ? onLoad( texture ) : null )\n\t\t\t.catch( onError );\n\n\t}\n\n\t_createTextureFrom( transcodeResult, container ) {\n\n\t\tconst { type: messageType, error, data: { faces, width, height, format, type, dfdFlags } } = transcodeResult;\n\n\t\tif ( messageType === 'error' ) return Promise.reject( error );\n\n\t\tlet texture;\n\n\t\tif ( container.faceCount === 6 ) {\n\n\t\t\ttexture = new CompressedCubeTexture( faces, format, type );\n\n\t\t} else {\n\n\t\t\tconst mipmaps = faces[ 0 ].mipmaps;\n\n\t\t\ttexture = container.layerCount > 1\n\t\t\t\t? new CompressedArrayTexture( mipmaps, width, height, container.layerCount, format, type )\n\t\t\t\t: new CompressedTexture( mipmaps, width, height, format, type );\n\n\t\t}\n\n\t\ttexture.minFilter = faces[ 0 ].mipmaps.length === 1 ? LinearFilter : LinearMipmapLinearFilter;\n\t\ttexture.magFilter = LinearFilter;\n\t\ttexture.generateMipmaps = false;\n\n\t\ttexture.needsUpdate = true;\n\t\ttexture.colorSpace = parseColorSpace( container );\n\t\ttexture.premultiplyAlpha = !! ( dfdFlags & KHR_DF_FLAG_ALPHA_PREMULTIPLIED );\n\n\t\treturn texture;\n\n\t}\n\n\t/**\n\t * @param {ArrayBuffer} buffer\n\t * @param {object?} config\n\t * @return {Promise<CompressedTexture|CompressedArrayTexture|DataTexture|Data3DTexture>}\n\t */\n\tasync _createTexture( buffer, config = {} ) {\n\n\t\tconst container = read( new Uint8Array( buffer ) );\n\n\t\t// Basis UASTC HDR is a subset of ASTC, which can be transcoded efficiently\n\t\t// to BC6H. To detect whether a KTX2 file uses Basis UASTC HDR, or default\n\t\t// ASTC, inspect the DFD color model.\n\t\t//\n\t\t// Source: https://github.com/BinomialLLC/basis_universal/issues/381\n\t\tconst isBasisHDR = container.vkFormat === VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT\n\t\t\t&& container.dataFormatDescriptor[ 0 ].colorModel === 0xA7;\n\n\t\t// If the device supports ASTC, Basis UASTC HDR requires no transcoder.\n\t\tconst needsTranscoder = container.vkFormat === VK_FORMAT_UNDEFINED\n\t\t\t|| isBasisHDR && ! this.workerConfig.astcHDRSupported;\n\n\t\tif ( ! needsTranscoder ) {\n\n\t\t\treturn createRawTexture( container );\n\n\t\t}\n\n\t\t//\n\t\tconst taskConfig = config;\n\t\tconst texturePending = this.init().then( () => {\n\n\t\t\treturn this.workerPool.postMessage( { type: 'transcode', buffer, taskConfig: taskConfig }, [ buffer ] );\n\n\t\t} ).then( ( e ) => this._createTextureFrom( e.data, container ) );\n\n\t\t// Cache the task result.\n\t\t_taskCache.set( buffer, { promise: texturePending } );\n\n\t\treturn texturePending;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.workerPool.dispose();\n\t\tif ( this.workerSourceURL ) URL.revokeObjectURL( this.workerSourceURL );\n\n\t\t_activeLoaders --;\n\n\t\treturn this;\n\n\t}\n\n}\n\n\n/* CONSTANTS */\n\nKTX2Loader.BasisFormat = {\n\tETC1S: 0,\n\tUASTC: 1,\n\tUASTC_HDR: 2,\n};\n\n// Source: https://github.com/BinomialLLC/basis_universal/blob/master/webgl/texture_test/index.html\nKTX2Loader.TranscoderFormat = {\n\tETC1: 0,\n\tETC2: 1,\n\tBC1: 2,\n\tBC3: 3,\n\tBC4: 4,\n\tBC5: 5,\n\tBC7_M6_OPAQUE_ONLY: 6,\n\tBC7_M5: 7,\n\tPVRTC1_4_RGB: 8,\n\tPVRTC1_4_RGBA: 9,\n\tASTC_4x4: 10,\n\tATC_RGB: 11,\n\tATC_RGBA_INTERPOLATED_ALPHA: 12,\n\tRGBA32: 13,\n\tRGB565: 14,\n\tBGR565: 15,\n\tRGBA4444: 16,\n\tBC6H: 22,\n\tRGB_HALF: 24,\n\tRGBA_HALF: 25,\n};\n\nKTX2Loader.EngineFormat = {\n\tRGBAFormat: RGBAFormat,\n\tRGBA_ASTC_4x4_Format: RGBA_ASTC_4x4_Format,\n\tRGB_BPTC_UNSIGNED_Format: RGB_BPTC_UNSIGNED_Format,\n\tRGBA_BPTC_Format: RGBA_BPTC_Format,\n\tRGBA_ETC2_EAC_Format: RGBA_ETC2_EAC_Format,\n\tRGBA_PVRTC_4BPPV1_Format: RGBA_PVRTC_4BPPV1_Format,\n\tRGBA_S3TC_DXT5_Format: RGBA_S3TC_DXT5_Format,\n\tRGB_ETC1_Format: RGB_ETC1_Format,\n\tRGB_ETC2_Format: RGB_ETC2_Format,\n\tRGB_PVRTC_4BPPV1_Format: RGB_PVRTC_4BPPV1_Format,\n\tRGBA_S3TC_DXT1_Format: RGBA_S3TC_DXT1_Format,\n};\n\nKTX2Loader.EngineType = {\n\tUnsignedByteType: UnsignedByteType,\n\tHalfFloatType: HalfFloatType,\n\tFloatType: FloatType,\n};\n\n/* WEB WORKER */\n\nKTX2Loader.BasisWorker = function () {\n\n\tlet config;\n\tlet transcoderPending;\n\tlet BasisModule;\n\n\tconst EngineFormat = _EngineFormat; // eslint-disable-line no-undef\n\tconst EngineType = _EngineType; // eslint-disable-line no-undef\n\tconst TranscoderFormat = _TranscoderFormat; // eslint-disable-line no-undef\n\tconst BasisFormat = _BasisFormat; // eslint-disable-line no-undef\n\n\tself.addEventListener( 'message', function ( e ) {\n\n\t\tconst message = e.data;\n\n\t\tswitch ( message.type ) {\n\n\t\t\tcase 'init':\n\t\t\t\tconfig = message.config;\n\t\t\t\tinit( message.transcoderBinary );\n\t\t\t\tbreak;\n\n\t\t\tcase 'transcode':\n\t\t\t\ttranscoderPending.then( () => {\n\n\t\t\t\t\ttry {\n\n\t\t\t\t\t\tconst { faces, buffers, width, height, hasAlpha, format, type, dfdFlags } = transcode( message.buffer );\n\n\t\t\t\t\t\tself.postMessage( { type: 'transcode', id: message.id, data: { faces, width, height, hasAlpha, format, type, dfdFlags } }, buffers );\n\n\t\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t\tconsole.error( error );\n\n\t\t\t\t\t\tself.postMessage( { type: 'error', id: message.id, error: error.message } );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t} );\n\n\tfunction init( wasmBinary ) {\n\n\t\ttranscoderPending = new Promise( ( resolve ) => {\n\n\t\t\tBasisModule = { wasmBinary, onRuntimeInitialized: resolve };\n\t\t\tBASIS( BasisModule ); // eslint-disable-line no-undef\n\n\t\t} ).then( () => {\n\n\t\t\tBasisModule.initializeBasis();\n\n\t\t\tif ( BasisModule.KTX2File === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.KTX2Loader: Please update Basis Universal transcoder.' );\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tfunction transcode( buffer ) {\n\n\t\tconst ktx2File = new BasisModule.KTX2File( new Uint8Array( buffer ) );\n\n\t\tfunction cleanup() {\n\n\t\t\tktx2File.close();\n\t\t\tktx2File.delete();\n\n\t\t}\n\n\t\tif ( ! ktx2File.isValid() ) {\n\n\t\t\tcleanup();\n\t\t\tthrow new Error( 'THREE.KTX2Loader:\tInvalid or unsupported .ktx2 file' );\n\n\t\t}\n\n\t\tlet basisFormat;\n\n\t\tif ( ktx2File.isUASTC() ) {\n\n\t\t\tbasisFormat = BasisFormat.UASTC;\n\n\t\t} else if ( ktx2File.isETC1S() ) {\n\n\t\t\tbasisFormat = BasisFormat.ETC1S;\n\n\t\t} else if ( ktx2File.isHDR() ) {\n\n\t\t\tbasisFormat = BasisFormat.UASTC_HDR;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.KTX2Loader: Unknown Basis encoding' );\n\n\t\t}\n\n\t\tconst width = ktx2File.getWidth();\n\t\tconst height = ktx2File.getHeight();\n\t\tconst layerCount = ktx2File.getLayers() || 1;\n\t\tconst levelCount = ktx2File.getLevels();\n\t\tconst faceCount = ktx2File.getFaces();\n\t\tconst hasAlpha = ktx2File.getHasAlpha();\n\t\tconst dfdFlags = ktx2File.getDFDFlags();\n\n\t\tconst { transcoderFormat, engineFormat, engineType } = getTranscoderFormat( basisFormat, width, height, hasAlpha );\n\n\t\tif ( ! width || ! height || ! levelCount ) {\n\n\t\t\tcleanup();\n\t\t\tthrow new Error( 'THREE.KTX2Loader:\tInvalid texture' );\n\n\t\t}\n\n\t\tif ( ! ktx2File.startTranscoding() ) {\n\n\t\t\tcleanup();\n\t\t\tthrow new Error( 'THREE.KTX2Loader: .startTranscoding failed' );\n\n\t\t}\n\n\t\tconst faces = [];\n\t\tconst buffers = [];\n\n\t\tfor ( let face = 0; face < faceCount; face ++ ) {\n\n\t\t\tconst mipmaps = [];\n\n\t\t\tfor ( let mip = 0; mip < levelCount; mip ++ ) {\n\n\t\t\t\tconst layerMips = [];\n\n\t\t\t\tlet mipWidth, mipHeight;\n\n\t\t\t\tfor ( let layer = 0; layer < layerCount; layer ++ ) {\n\n\t\t\t\t\tconst levelInfo = ktx2File.getImageLevelInfo( mip, layer, face );\n\n\t\t\t\t\tif ( face === 0 && mip === 0 && layer === 0 && ( levelInfo.origWidth % 4 !== 0 || levelInfo.origHeight % 4 !== 0 ) ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.KTX2Loader: ETC1S and UASTC textures should use multiple-of-four dimensions.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( levelCount > 1 ) {\n\n\t\t\t\t\t\tmipWidth = levelInfo.origWidth;\n\t\t\t\t\t\tmipHeight = levelInfo.origHeight;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Handles non-multiple-of-four dimensions in textures without mipmaps. Textures with\n\t\t\t\t\t\t// mipmaps must use multiple-of-four dimensions, for some texture formats and APIs.\n\t\t\t\t\t\t// See mrdoob/three.js#25908.\n\t\t\t\t\t\tmipWidth = levelInfo.width;\n\t\t\t\t\t\tmipHeight = levelInfo.height;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet dst = new Uint8Array( ktx2File.getImageTranscodedSizeInBytes( mip, layer, 0, transcoderFormat ) );\n\t\t\t\t\tconst status = ktx2File.transcodeImage( dst, mip, layer, face, transcoderFormat, 0, - 1, - 1 );\n\n\t\t\t\t\tif ( engineType === EngineType.HalfFloatType ) {\n\n\t\t\t\t\t\tdst = new Uint16Array( dst.buffer, dst.byteOffset, dst.byteLength / Uint16Array.BYTES_PER_ELEMENT );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! status ) {\n\n\t\t\t\t\t\tcleanup();\n\t\t\t\t\t\tthrow new Error( 'THREE.KTX2Loader: .transcodeImage failed.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlayerMips.push( dst );\n\n\t\t\t\t}\n\n\t\t\t\tconst mipData = concat( layerMips );\n\n\t\t\t\tmipmaps.push( { data: mipData, width: mipWidth, height: mipHeight } );\n\t\t\t\tbuffers.push( mipData.buffer );\n\n\t\t\t}\n\n\t\t\tfaces.push( { mipmaps, width, height, format: engineFormat, type: engineType } );\n\n\t\t}\n\n\t\tcleanup();\n\n\t\treturn { faces, buffers, width, height, hasAlpha, dfdFlags, format: engineFormat, type: engineType };\n\n\t}\n\n\t//\n\n\t// Optimal choice of a transcoder target format depends on the Basis format (ETC1S, UASTC, or\n\t// UASTC HDR), device capabilities, and texture dimensions. The list below ranks the formats\n\t// separately for each format. Currently, priority is assigned based on:\n\t//\n\t// high quality > low quality > uncompressed\n\t//\n\t// Prioritization may be revisited, or exposed for configuration, in the future.\n\t//\n\t// Reference: https://github.com/KhronosGroup/3D-Formats-Guidelines/blob/main/KTXDeveloperGuide.md\n\tconst FORMAT_OPTIONS = [\n\t\t{\n\t\t\tif: 'astcSupported',\n\t\t\tbasisFormat: [ BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.ASTC_4x4, TranscoderFormat.ASTC_4x4 ],\n\t\t\tengineFormat: [ EngineFormat.RGBA_ASTC_4x4_Format, EngineFormat.RGBA_ASTC_4x4_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: Infinity,\n\t\t\tpriorityUASTC: 1,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'bptcSupported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.BC7_M5, TranscoderFormat.BC7_M5 ],\n\t\t\tengineFormat: [ EngineFormat.RGBA_BPTC_Format, EngineFormat.RGBA_BPTC_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 3,\n\t\t\tpriorityUASTC: 2,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'dxtSupported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.BC1, TranscoderFormat.BC3 ],\n\t\t\tengineFormat: [ EngineFormat.RGBA_S3TC_DXT1_Format, EngineFormat.RGBA_S3TC_DXT5_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 4,\n\t\t\tpriorityUASTC: 5,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'etc2Supported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.ETC1, TranscoderFormat.ETC2 ],\n\t\t\tengineFormat: [ EngineFormat.RGB_ETC2_Format, EngineFormat.RGBA_ETC2_EAC_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 1,\n\t\t\tpriorityUASTC: 3,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'etc1Supported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.ETC1 ],\n\t\t\tengineFormat: [ EngineFormat.RGB_ETC1_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 2,\n\t\t\tpriorityUASTC: 4,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'pvrtcSupported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.PVRTC1_4_RGB, TranscoderFormat.PVRTC1_4_RGBA ],\n\t\t\tengineFormat: [ EngineFormat.RGB_PVRTC_4BPPV1_Format, EngineFormat.RGBA_PVRTC_4BPPV1_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 5,\n\t\t\tpriorityUASTC: 6,\n\t\t\tneedsPowerOfTwo: true,\n\t\t},\n\t\t{\n\t\t\tif: 'bptcSupported',\n\t\t\tbasisFormat: [ BasisFormat.UASTC_HDR ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.BC6H ],\n\t\t\tengineFormat: [ EngineFormat.RGB_BPTC_UNSIGNED_Format ],\n\t\t\tengineType: [ EngineType.HalfFloatType ],\n\t\t\tpriorityHDR: 1,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\n\t\t// Uncompressed fallbacks.\n\n\t\t{\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.RGBA32, TranscoderFormat.RGBA32 ],\n\t\t\tengineFormat: [ EngineFormat.RGBAFormat, EngineFormat.RGBAFormat ],\n\t\t\tengineType: [ EngineType.UnsignedByteType, EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 100,\n\t\t\tpriorityUASTC: 100,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tbasisFormat: [ BasisFormat.UASTC_HDR ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.RGBA_HALF ],\n\t\t\tengineFormat: [ EngineFormat.RGBAFormat ],\n\t\t\tengineType: [ EngineType.HalfFloatType ],\n\t\t\tpriorityHDR: 100,\n\t\t\tneedsPowerOfTwo: false,\n\t\t}\n\t];\n\n\tconst OPTIONS = {\n\t\t// TODO: For ETC1S we intentionally sort by _UASTC_ priority, preserving\n\t\t// a historical accident shown to avoid performance pitfalls for Linux with\n\t\t// Firefox & AMD GPU (RadeonSI). Further work needed.\n\t\t// See https://github.com/mrdoob/three.js/pull/29730.\n\t\t[ BasisFormat.ETC1S ]: FORMAT_OPTIONS\n\t\t\t.filter( ( opt ) => opt.basisFormat.includes( BasisFormat.ETC1S ) )\n\t\t\t.sort( ( a, b ) => a.priorityUASTC - b.priorityUASTC ),\n\n\t\t[ BasisFormat.UASTC ]: FORMAT_OPTIONS\n\t\t\t.filter( ( opt ) => opt.basisFormat.includes( BasisFormat.UASTC ) )\n\t\t\t.sort( ( a, b ) => a.priorityUASTC - b.priorityUASTC ),\n\n\t\t[ BasisFormat.UASTC_HDR ]: FORMAT_OPTIONS\n\t\t\t.filter( ( opt ) => opt.basisFormat.includes( BasisFormat.UASTC_HDR ) )\n\t\t\t.sort( ( a, b ) => a.priorityHDR - b.priorityHDR ),\n\t};\n\n\tfunction getTranscoderFormat( basisFormat, width, height, hasAlpha ) {\n\n\t\tconst options = OPTIONS[ basisFormat ];\n\n\t\tfor ( let i = 0; i < options.length; i ++ ) {\n\n\t\t\tconst opt = options[ i ];\n\n\t\t\tif ( opt.if && ! config[ opt.if ] ) continue;\n\t\t\tif ( ! opt.basisFormat.includes( basisFormat ) ) continue;\n\t\t\tif ( hasAlpha && opt.transcoderFormat.length < 2 ) continue;\n\t\t\tif ( opt.needsPowerOfTwo && ! ( isPowerOfTwo( width ) && isPowerOfTwo( height ) ) ) continue;\n\n\t\t\tconst transcoderFormat = opt.transcoderFormat[ hasAlpha ? 1 : 0 ];\n\t\t\tconst engineFormat = opt.engineFormat[ hasAlpha ? 1 : 0 ];\n\t\t\tconst engineType = opt.engineType[ 0 ];\n\n\t\t\treturn { transcoderFormat, engineFormat, engineType };\n\n\t\t}\n\n\t\tthrow new Error( 'THREE.KTX2Loader: Failed to identify transcoding target.' );\n\n\t}\n\n\tfunction isPowerOfTwo( value ) {\n\n\t\tif ( value <= 2 ) return true;\n\n\t\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n\t}\n\n\t/** Concatenates N byte arrays. */\n\tfunction concat( arrays ) {\n\n\t\tif ( arrays.length === 1 ) return arrays[ 0 ];\n\n\t\tlet totalByteLength = 0;\n\n\t\tfor ( let i = 0; i < arrays.length; i ++ ) {\n\n\t\t\tconst array = arrays[ i ];\n\t\t\ttotalByteLength += array.byteLength;\n\n\t\t}\n\n\t\tconst result = new Uint8Array( totalByteLength );\n\n\t\tlet byteOffset = 0;\n\n\t\tfor ( let i = 0; i < arrays.length; i ++ ) {\n\n\t\t\tconst array = arrays[ i ];\n\t\t\tresult.set( array, byteOffset );\n\n\t\t\tbyteOffset += array.byteLength;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n};\n\n// Parsing for non-Basis textures. These textures may have supercompression\n// like Zstd, but they do not require transcoding.\n\nconst UNCOMPRESSED_FORMATS = new Set( [ RGBAFormat, RGFormat, RedFormat ] );\n\nconst FORMAT_MAP = {\n\n\t[ VK_FORMAT_R32G32B32A32_SFLOAT ]: RGBAFormat,\n\t[ VK_FORMAT_R16G16B16A16_SFLOAT ]: RGBAFormat,\n\t[ VK_FORMAT_R8G8B8A8_UNORM ]: RGBAFormat,\n\t[ VK_FORMAT_R8G8B8A8_SRGB ]: RGBAFormat,\n\n\t[ VK_FORMAT_R32G32_SFLOAT ]: RGFormat,\n\t[ VK_FORMAT_R16G16_SFLOAT ]: RGFormat,\n\t[ VK_FORMAT_R8G8_UNORM ]: RGFormat,\n\t[ VK_FORMAT_R8G8_SRGB ]: RGFormat,\n\n\t[ VK_FORMAT_R32_SFLOAT ]: RedFormat,\n\t[ VK_FORMAT_R16_SFLOAT ]: RedFormat,\n\t[ VK_FORMAT_R8_SRGB ]: RedFormat,\n\t[ VK_FORMAT_R8_UNORM ]: RedFormat,\n\n\t[ VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT ]: RGBA_ASTC_4x4_Format,\n\t[ VK_FORMAT_ASTC_6x6_SRGB_BLOCK ]: RGBA_ASTC_6x6_Format,\n\t[ VK_FORMAT_ASTC_6x6_UNORM_BLOCK ]: RGBA_ASTC_6x6_Format,\n\n};\n\nconst TYPE_MAP = {\n\n\t[ VK_FORMAT_R32G32B32A32_SFLOAT ]: FloatType,\n\t[ VK_FORMAT_R16G16B16A16_SFLOAT ]: HalfFloatType,\n\t[ VK_FORMAT_R8G8B8A8_UNORM ]: UnsignedByteType,\n\t[ VK_FORMAT_R8G8B8A8_SRGB ]: UnsignedByteType,\n\n\t[ VK_FORMAT_R32G32_SFLOAT ]: FloatType,\n\t[ VK_FORMAT_R16G16_SFLOAT ]: HalfFloatType,\n\t[ VK_FORMAT_R8G8_UNORM ]: UnsignedByteType,\n\t[ VK_FORMAT_R8G8_SRGB ]: UnsignedByteType,\n\n\t[ VK_FORMAT_R32_SFLOAT ]: FloatType,\n\t[ VK_FORMAT_R16_SFLOAT ]: HalfFloatType,\n\t[ VK_FORMAT_R8_SRGB ]: UnsignedByteType,\n\t[ VK_FORMAT_R8_UNORM ]: UnsignedByteType,\n\n\t[ VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT ]: HalfFloatType,\n\t[ VK_FORMAT_ASTC_6x6_SRGB_BLOCK ]: UnsignedByteType,\n\t[ VK_FORMAT_ASTC_6x6_UNORM_BLOCK ]: UnsignedByteType,\n\n};\n\nasync function createRawTexture( container ) {\n\n\tconst { vkFormat } = container;\n\n\tif ( FORMAT_MAP[ vkFormat ] === undefined ) {\n\n\t\tthrow new Error( 'THREE.KTX2Loader: Unsupported vkFormat.' );\n\n\t}\n\n\t//\n\n\tlet zstd;\n\n\tif ( container.supercompressionScheme === KHR_SUPERCOMPRESSION_ZSTD ) {\n\n\t\tif ( ! _zstd ) {\n\n\t\t\t_zstd = new Promise( async ( resolve ) => {\n\n\t\t\t\tconst zstd = new ZSTDDecoder();\n\t\t\t\tawait zstd.init();\n\t\t\t\tresolve( zstd );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tzstd = await _zstd;\n\n\t}\n\n\t//\n\n\tconst mipmaps = [];\n\n\n\tfor ( let levelIndex = 0; levelIndex < container.levels.length; levelIndex ++ ) {\n\n\t\tconst levelWidth = Math.max( 1, container.pixelWidth >> levelIndex );\n\t\tconst levelHeight = Math.max( 1, container.pixelHeight >> levelIndex );\n\t\tconst levelDepth = container.pixelDepth ? Math.max( 1, container.pixelDepth >> levelIndex ) : 0;\n\n\t\tconst level = container.levels[ levelIndex ];\n\n\t\tlet levelData;\n\n\t\tif ( container.supercompressionScheme === KHR_SUPERCOMPRESSION_NONE ) {\n\n\t\t\tlevelData = level.levelData;\n\n\t\t} else if ( container.supercompressionScheme === KHR_SUPERCOMPRESSION_ZSTD ) {\n\n\t\t\tlevelData = zstd.decode( level.levelData, level.uncompressedByteLength );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.KTX2Loader: Unsupported supercompressionScheme.' );\n\n\t\t}\n\n\t\tlet data;\n\n\t\tif ( TYPE_MAP[ vkFormat ] === FloatType ) {\n\n\t\t\tdata = new Float32Array(\n\n\t\t\t\tlevelData.buffer,\n\t\t\t\tlevelData.byteOffset,\n\t\t\t\tlevelData.byteLength / Float32Array.BYTES_PER_ELEMENT\n\n\t\t\t);\n\n\t\t} else if ( TYPE_MAP[ vkFormat ] === HalfFloatType ) {\n\n\t\t\tdata = new Uint16Array(\n\n\t\t\t\tlevelData.buffer,\n\t\t\t\tlevelData.byteOffset,\n\t\t\t\tlevelData.byteLength / Uint16Array.BYTES_PER_ELEMENT\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tdata = levelData;\n\n\t\t}\n\n\t\tmipmaps.push( {\n\n\t\t\tdata: data,\n\t\t\twidth: levelWidth,\n\t\t\theight: levelHeight,\n\t\t\tdepth: levelDepth,\n\n\t\t} );\n\n\t}\n\n\tlet texture;\n\n\tif ( UNCOMPRESSED_FORMATS.has( FORMAT_MAP[ vkFormat ] ) ) {\n\n\t\ttexture = container.pixelDepth === 0\n\t\t\t? new DataTexture( mipmaps[ 0 ].data, container.pixelWidth, container.pixelHeight )\n\t\t\t: new Data3DTexture( mipmaps[ 0 ].data, container.pixelWidth, container.pixelHeight, container.pixelDepth );\n\n\t} else {\n\n\t\tif ( container.pixelDepth > 0 ) throw new Error( 'THREE.KTX2Loader: Unsupported pixelDepth.' );\n\n\t\ttexture = new CompressedTexture( mipmaps, container.pixelWidth, container.pixelHeight );\n\n\t\ttexture.minFilter = mipmaps.length === 1 ? LinearFilter : LinearMipmapLinearFilter;\n\t\ttexture.magFilter = LinearFilter;\n\n\t}\n\n\ttexture.mipmaps = mipmaps;\n\n\ttexture.type = TYPE_MAP[ vkFormat ];\n\ttexture.format = FORMAT_MAP[ vkFormat ];\n\ttexture.colorSpace = parseColorSpace( container );\n\ttexture.needsUpdate = true;\n\n\t//\n\n\treturn Promise.resolve( texture );\n\n}\n\nfunction parseColorSpace( container ) {\n\n\tconst dfd = container.dataFormatDescriptor[ 0 ];\n\n\tif ( dfd.colorPrimaries === KHR_DF_PRIMARIES_BT709 ) {\n\n\t\treturn dfd.transferFunction === KHR_DF_TRANSFER_SRGB ? SRGBColorSpace : LinearSRGBColorSpace;\n\n\t} else if ( dfd.colorPrimaries === KHR_DF_PRIMARIES_DISPLAYP3 ) {\n\n\t\treturn dfd.transferFunction === KHR_DF_TRANSFER_SRGB ? DisplayP3ColorSpace : LinearDisplayP3ColorSpace;\n\n\t} else if ( dfd.colorPrimaries === KHR_DF_PRIMARIES_UNSPECIFIED ) {\n\n\t\treturn NoColorSpace;\n\n\t} else {\n\n\t\tconsole.warn( `THREE.KTX2Loader: Unsupported color primaries, \"${ dfd.colorPrimaries }\"` );\n\t\treturn NoColorSpace;\n\n\t}\n\n}\n\nexport { KTX2Loader };\n","import { LinearTransfer, Matrix3, SRGBTransfer } from 'three';\n\n// Reference: http://www.russellcottrell.com/photo/matrixCalculator.htm\n\nconst P3_PRIMARIES = [ 0.680, 0.320, 0.265, 0.690, 0.150, 0.060 ];\nconst P3_LUMINANCE_COEFFICIENTS = [ 0.2289, 0.6917, 0.0793 ];\nconst REC2020_PRIMARIES = [ 0.708, 0.292, 0.170, 0.797, 0.131, 0.046 ];\nconst REC2020_LUMINANCE_COEFFICIENTS = [ 0.2627, 0.6780, 0.0593 ];\nconst D65 = [ 0.3127, 0.3290 ];\n\n/******************************************************************************\n * Display P3 definitions\n */\n\nconst LINEAR_DISPLAY_P3_TO_XYZ = /*@__PURE__*/ new Matrix3().set(\n\t0.4865709, 0.2656677, 0.1982173,\n\t0.2289746, 0.6917385, 0.0792869,\n\t0.0000000, 0.0451134, 1.0439444\n);\n\nconst XYZ_TO_LINEAR_DISPLAY_P3 = /*@__PURE__*/ new Matrix3().set(\n\t2.4934969, - 0.9313836, - 0.4027108,\n\t- 0.8294890, 1.7626641, 0.0236247,\n\t0.0358458, - 0.0761724, 0.9568845\n);\n\nexport const DisplayP3ColorSpace = 'display-p3';\nexport const LinearDisplayP3ColorSpace = 'display-p3-linear';\n\nexport const DisplayP3ColorSpaceImpl = {\n\tprimaries: P3_PRIMARIES,\n\twhitePoint: D65,\n\ttransfer: SRGBTransfer,\n\ttoXYZ: LINEAR_DISPLAY_P3_TO_XYZ,\n\tfromXYZ: XYZ_TO_LINEAR_DISPLAY_P3,\n\tluminanceCoefficients: P3_LUMINANCE_COEFFICIENTS,\n\toutputColorSpaceConfig: { drawingBufferColorSpace: DisplayP3ColorSpace }\n};\n\nexport const LinearDisplayP3ColorSpaceImpl = {\n\tprimaries: P3_PRIMARIES,\n\twhitePoint: D65,\n\ttransfer: LinearTransfer,\n\ttoXYZ: LINEAR_DISPLAY_P3_TO_XYZ,\n\tfromXYZ: XYZ_TO_LINEAR_DISPLAY_P3,\n\tluminanceCoefficients: P3_LUMINANCE_COEFFICIENTS,\n\tworkingColorSpaceConfig: { unpackColorSpace: DisplayP3ColorSpace },\n\toutputColorSpaceConfig: { drawingBufferColorSpace: DisplayP3ColorSpace }\n};\n\n/******************************************************************************\n * Rec. 2020 definitions\n */\n\nconst LINEAR_REC2020_TO_XYZ = /*@__PURE__*/ new Matrix3().set(\n\t0.6369580, 0.1446169, 0.1688810,\n\t0.2627002, 0.6779981, 0.0593017,\n\t0.0000000, 0.0280727, 1.0609851\n);\n\nconst XYZ_TO_LINEAR_REC2020 = /*@__PURE__*/ new Matrix3().set(\n\t1.7166512, - 0.3556708, - 0.2533663,\n\t- 0.6666844, 1.6164812, 0.0157685,\n\t0.0176399, - 0.0427706, 0.9421031\n);\n\nexport const LinearRec2020ColorSpace = 'rec2020-linear';\n\nexport const LinearRec2020ColorSpaceImpl = {\n\tprimaries: REC2020_PRIMARIES,\n\twhitePoint: D65,\n\ttransfer: LinearTransfer,\n\ttoXYZ: LINEAR_REC2020_TO_XYZ,\n\tfromXYZ: XYZ_TO_LINEAR_REC2020,\n\tluminanceCoefficients: REC2020_LUMINANCE_COEFFICIENTS,\n};\n","async function fetchAndDecodeSubtree(url) {\r\n const cleanUrl = url.split('?')[0]; // Remove URL parameters\r\n const extension = cleanUrl.split('.').pop(); // Get the file extension\r\n\r\n const response = await fetch(url);\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch ${url}: ${response.statusText}`);\r\n }\r\n\r\n if (extension === \"json\") {\r\n // Handle .json file\r\n const json = await response.json();\r\n return handleJSONSubtree(json, getDirectoryUrl(url));\r\n }\r\n if (extension === \"subtree\") {\r\n // Handle binary .subtree file\r\n const buffer = await response.arrayBuffer();\r\n return decodeSubtreeBinary(buffer, getDirectoryUrl(url));\r\n } else {\r\n throw new Error(`Unsupported file extension: ${extension}`);\r\n }\r\n}\r\nfunction getDirectoryUrl(url) {\r\n const cleanUrl = url.split('?')[0]; // Removes query parameters\r\n return cleanUrl.substring(0, cleanUrl.lastIndexOf('/') + 1);\r\n};\r\n\r\nasync function decodeSubtreeJSON(json, baseURL) {\r\n if (!json.buffers) {\r\n throw new Error(`subtree has no buffers`);\r\n }\r\n\r\n const bufferFetchPromises = json.buffers.map(async (buffer) => {\r\n if (!buffer.uri) {\r\n throw new Error(`bad subtree definition. subtrees in json format do not contain internal buffers`);\r\n }\r\n const binaryUrl = new URL(buffer.uri, baseURL).href; // Fixed to buffer.uri instead of externalBuffer.uri\r\n const response = await fetch(binaryUrl);\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch binary file ${binaryUrl}: ${response.statusText}`);\r\n }\r\n return response.arrayBuffer();\r\n });\r\n\r\n const buffers = await Promise.all(bufferFetchPromises);\r\n\r\n return decodeSubtree(json, buffers);\r\n}\r\n// Decode binary .subtree file\r\nasync function decodeSubtreeBinary(buffer, baseURL) {\r\n const dataView = new DataView(buffer);\r\n const jsonByteLength = dataView.getBigUint64(8, true); // JSON byte length\r\n const binaryByteLength = dataView.getBigUint64(16, true); // Binary byte length\r\n\r\n const jsonStart = 24;\r\n const jsonEnd = jsonStart + Number(jsonByteLength);\r\n const binaryStart = jsonEnd + (8 - (jsonEnd % 8)) % 8; // Align to 8-byte boundary\r\n const binaryEnd = binaryStart + Number(binaryByteLength);\r\n\r\n const jsonBuffer = buffer.slice(jsonStart, jsonEnd);\r\n const jsonString = new TextDecoder().decode(jsonBuffer).trim();\r\n const json = JSON.parse(jsonString);\r\n\r\n if (!json.buffers) {\r\n throw new Error(`subtree has no buffers`);\r\n }\r\n\r\n const bufferFetchPromises = json.buffers.map(async (b) => {\r\n if (b.uri) {\r\n const binaryUrl = new URL(b.uri, baseURL).href;\r\n const response = await fetch(binaryUrl);\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch binary file ${binaryUrl}: ${response.statusText}`);\r\n }\r\n return new Uint8Array(await response.arrayBuffer());\r\n } else {\r\n // Assuming you meant to directly use the buffer for non-URI cases,\r\n // which is already available in the function scope.\r\n return new Uint8Array(buffer.slice(binaryStart, binaryEnd));\r\n }\r\n });\r\n\r\n const buffers = await Promise.all(bufferFetchPromises);\r\n\r\n return decodeSubtree(json, buffers);\r\n}\r\n\r\nfunction decodeSubtree(json, buffers){\r\n function isAvailable(availability, index) {\r\n if (!availability) {\r\n throw new Error(`incomplete json subtree`);\r\n }\r\n if (!!availability.constant) {\r\n if (availability.constant == 0) {\r\n return false;\r\n }\r\n if (availability.constant == 1) {\r\n return true;\r\n }\r\n }\r\n if (availability.bitstream == undefined) {\r\n throw new Error(`json subtree \"tileAvailability\" does not specify a bitstream`);\r\n }\r\n if (!json.bufferViews || !json.bufferViews[availability.bitstream]) {\r\n throw new Error(`json subtree \"bufferViews\" does not specify a bitstream`);\r\n }\r\n const bufferView = json.bufferViews[availability.bitstream];\r\n\r\n return isAvailable2(buffers[bufferView.buffer], bufferView.byteOffset, index);\r\n }\r\n\r\n function isAvailable2(buffer, byteOffset, index) {\r\n const byteIndex = byteOffset + Math.floor(index / 8);\r\n const bitIndex = index % 8;\r\n return (buffer[byteIndex] >> bitIndex) & 1 == 1;\r\n }\r\n\r\n function isTileAvailable(address) {\r\n\r\n let index = 0;\r\n if (address.z==undefined) {\r\n index = computeQuadtreeIndex(address.x, address.y, address.level);\r\n } else {\r\n index = computeOctreeIndex(address.x, address.y, address.z, address.level);\r\n }\r\n return isAvailable(json.tileAvailability, index);\r\n }\r\n function isContentAvailable(address) {\r\n let index = 0;\r\n if (address.z==undefined) {\r\n index = computeQuadtreeIndex(address.x, address.y, address.level);\r\n } else {\r\n index = computeOctreeIndex(address.x, address.y, address.z, address.level);\r\n }\r\n const contentAvailability = [];\r\n json.contentAvailability.forEach(availability=>{\r\n contentAvailability.push(isAvailable(availability, index));\r\n })\r\n return contentAvailability;\r\n }\r\n function isChildSubtreeAvailable(address) {\r\n let index = 0;\r\n if (address.z==undefined) {\r\n index = computeQuadtreeIndex(address.x, address.y);\r\n } else {\r\n index = computeOctreeIndex(address.x, address.y, address.z);\r\n }\r\n return isAvailable(json.childSubtreeAvailability, index);\r\n }\r\n\r\n\r\n return { isTileAvailable: isTileAvailable, isContentAvailable: isContentAvailable, isChildSubtreeAvailable: isChildSubtreeAvailable };\r\n}\r\n\r\n// Handle JSON subtree, fetching external binary file if necessary\r\n\r\n\r\nfunction part1By1(n) {\r\n n &= 0x0000ffff; // n = ------------------------fedcba9876543210\r\n n = (n ^ (n << 8)) & 0x00ff00ff; // n = ----------------fedcba98--------76543210\r\n n = (n ^ (n << 4)) & 0x0f0f0f0f; // n = ------------fedc--------ba98--------7654--------3210\r\n n = (n ^ (n << 2)) & 0x33333333; // n = --------fedc----ba98----7654----3210\r\n n = (n ^ (n << 1)) & 0x55555555; // n = ----f--e--d--c----b--a--9--8----7--6--5--4----3--2--1--0\r\n return n;\r\n}\r\n\r\nfunction computeQuadtreeIndex(x, y, level) {\r\n let offset = 0;\r\n if (level) {\r\n offset = (Math.pow(4, level) - 1) / 3;\r\n }\r\n return offset + (part1By1(x) | (part1By1(y) << 1));\r\n}\r\n\r\nfunction part1By2(n) {\r\n n &= 0x000003ff; // n = ------------------9876543210\r\n n = (n ^ (n << 16)) & 0xff0000ff; // n = ----9876--------5432--------10--------------------\r\n n = (n ^ (n << 8)) & 0x0300f00f; // n = ----9--8--7--6--------5--4--3--2--------------------\r\n n = (n ^ (n << 4)) & 0x030c30c3; // n = ----9-----8--7-----6--------5-----4--3-----2--------\r\n n = (n ^ (n << 2)) & 0x09249249; // n = ----9--------8--------7--------6--------5--------4--------3--------2--------\r\n return n;\r\n}\r\n\r\nfunction computeOctreeIndex(x, y, z, level) {\r\n let offset = 0;\r\n if (level) {\r\n offset = (Math.pow(8, level) - 1) / 7;\r\n }\r\n return offset + (part1By2(x) | (part1By2(y) << 1) | (part1By2(z) << 2));\r\n}\r\nexport{\r\n fetchAndDecodeSubtree\r\n};","import { fetchAndDecodeSubtree } from './SubtreeDecoder.js';\r\nconst subtreeMap = new Map();\r\n\r\n\r\nasync function resolveImplicite(rootTile, url) {\r\n if (!rootTile.root || !rootTile.root.implicitTiling) {\r\n return rootTile;\r\n }\r\n\r\n if (!rootTile.root.content && !rootTile.root.contents) {\r\n throw new Error(\"implicit tiling requires a Template URI\");\r\n }\r\n\r\n let isQuad = true;\r\n if (rootTile.root.implicitTiling.subdivisionScheme) {\r\n isQuad = \"QUADTREE\" === rootTile.root.implicitTiling.subdivisionScheme.toUpperCase()\r\n }\r\n let subtreeUriTemplate = \"\";\r\n if (rootTile.root.implicitTiling.subtrees) {\r\n if (rootTile.root.implicitTiling.subtrees.uri) {\r\n subtreeUriTemplate = rootTile.root.implicitTiling.subtrees.uri;\r\n } else if (rootTile.root.implicitTiling.subtrees.url) {\r\n subtreeUriTemplate = rootTile.root.implicitTiling.subtrees.url;\r\n }\r\n }\r\n\r\n let contentURITemplates = [];\r\n if (rootTile.root.content) {\r\n if (rootTile.root.content.uri) {\r\n contentURITemplates.push(rootTile.root.content.uri);\r\n } else if (rootTile.root.content.url) {\r\n contentURITemplates.push(rootTile.root.content.url);\r\n }\r\n } else if (rootTile.root.contents) {\r\n rootTile.root.contents.forEach(content => {\r\n if (content.uri) {\r\n contentURITemplates.push(content.uri);\r\n } else if (content.url) {\r\n contentURITemplates.push(content.url);\r\n }\r\n })\r\n }\r\n\r\n const rootURL = getDirectoryUrl(url);\r\n\r\n let subtreeUri;\r\n if (isQuad) {\r\n subtreeUri = subtreeUriTemplate\r\n .replace(\"{level}\", 0)\r\n .replace(\"{x}\", 0)\r\n .replace(\"{y}\", 0);\r\n }\r\n if (!isQuad) {\r\n subtreeUri = subtreeUriTemplate\r\n .replace(\"{level}\", 0)\r\n .replace(\"{x}\", 0)\r\n .replace(\"{y}\", 0)\r\n .replace(\"{z}\", 0);\r\n }\r\n\r\n const globalAddress = { level: 0, x: 0, y: 0 };\r\n const localAddress = { level: 0, x: 0, y: 0 };\r\n if (!isQuad) {\r\n globalAddress.z = 0;\r\n localAddress.z = 0;\r\n }\r\n\r\n subtreeMap.set(subtreeUri, await fetchAndDecodeSubtree(rootURL + subtreeUri))\r\n const subtree = subtreeMap.get(subtreeUri);\r\n const contents = [];\r\n if (subtree.isContentAvailable(localAddress)) {\r\n contentURITemplates.forEach(contentURI => {\r\n let uri;\r\n if (isQuad) {\r\n uri = contentURI\r\n .replace(\"{level}\", globalAddress.level)\r\n .replace(\"{x}\", globalAddress.x)\r\n .replace(\"{y}\", globalAddress.y);\r\n }\r\n if (!isQuad) {\r\n uri = contentURI\r\n .replace(\"{level}\", globalAddress.level)\r\n .replace(\"{x}\", globalAddress.x)\r\n .replace(\"{y}\", globalAddress.y)\r\n .replace(\"{z}\", globalAddress.z);\r\n }\r\n contents.push({ uri: uri });\r\n });\r\n }\r\n const explicitTileset = {\r\n geometricError: rootTile.root.geometricError,\r\n boundingVolume: rootTile.root.boundingVolume,\r\n refine: rootTile.root.refine,\r\n globalAddress: globalAddress,\r\n localAddress: localAddress,\r\n subtree: subtree,\r\n contents: contents,\r\n getChildren: async () => {\r\n return buildChildren(explicitTileset)\r\n }\r\n }\r\n return {\r\n root: explicitTileset\r\n\r\n }\r\n\r\n\r\n async function buildChildren(parent) {\r\n const children = [];\r\n if (parent.localAddress.level == rootTile.root.implicitTiling.availableLevels - 1) return children;\r\n\r\n if ((parent.localAddress.level + 1) % rootTile.root.implicitTiling.subtreeLevels == 0) { // end of subtree \r\n\r\n const localAddresses = getChildrenAddresses(parent.localAddress);\r\n const globalAddresses = getChildrenAddresses(parent.globalAddress);\r\n const boundingVolumes = computeBoundingVolumes(isQuad, rootTile.root.boundingVolume, globalAddresses);\r\n\r\n for (let i = 0; i < localAddresses.length; i++) {\r\n const childLocalAddress = localAddresses[i];\r\n const childGlobalAddress = globalAddresses[i];\r\n if (parent.subtree.isChildSubtreeAvailable(childLocalAddress)) {\r\n let subtreeUri;\r\n if (isQuad) {\r\n subtreeUri = subtreeUriTemplate\r\n .replace(\"{level}\", childGlobalAddress.level)\r\n .replace(\"{x}\", childGlobalAddress.x)\r\n .replace(\"{y}\", childGlobalAddress.y);\r\n }\r\n if (!isQuad) {\r\n subtreeUri = subtreeUriTemplate\r\n .replace(\"{level}\", childGlobalAddress.level)\r\n .replace(\"{x}\", childGlobalAddress.x)\r\n .replace(\"{y}\", childGlobalAddress.y)\r\n .replace(\"{z}\", childGlobalAddress.z);\r\n }\r\n }\r\n if (!subtreeMap.has(subtreeUri)) {\r\n subtreeMap.set(subtreeUri, await fetchAndDecodeSubtree(rootURL + subtreeUri))\r\n }\r\n const newSubtree = subtreeMap.get(subtreeUri)\r\n const newLocalAddress = { level: 0, x: 0, y: 0 };\r\n if (!isQuad) newLocalAddress.z = 0;\r\n\r\n const contents = [];\r\n if (newSubtree.isContentAvailable(newLocalAddress)) {\r\n contentURITemplates.forEach(contentURI => {\r\n let uri;\r\n if (isQuad) {\r\n uri = contentURI\r\n .replace(\"{level}\", childGlobalAddress.level)\r\n .replace(\"{x}\", childGlobalAddress.x)\r\n .replace(\"{y}\", childGlobalAddress.y);\r\n }\r\n if (!isQuad) {\r\n //let rootZ = Math.floor(z / factor);\r\n uri = contentURI\r\n .replace(\"{level}\", childGlobalAddress.level)\r\n .replace(\"{x}\", childGlobalAddress.x)\r\n .replace(\"{y}\", childGlobalAddress.y)\r\n .replace(\"{z}\", childGlobalAddress.z);\r\n }\r\n contents.push({ uri: uri });\r\n });\r\n }\r\n const child = {\r\n geometricError: parent.geometricError / 2,\r\n boundingVolume: boundingVolumes[i],\r\n refine: rootTile.root.refine,\r\n globalAddress: childGlobalAddress,\r\n localAddress: newLocalAddress,\r\n subtree: newSubtree,\r\n contents: contents,\r\n getChildren: async () => {\r\n return buildChildren(child);\r\n }\r\n }\r\n children.push(child);\r\n }\r\n } else { // not the end of the subtree\r\n const localAddresses = getChildrenAddresses(parent.localAddress);\r\n const globalAddresses = getChildrenAddresses(parent.globalAddress);\r\n const boundingVolumes = computeBoundingVolumes(isQuad, rootTile.root.boundingVolume, globalAddresses);\r\n\r\n for (let i = 0; i < localAddresses.length; i++) {\r\n const childLocalAddress = localAddresses[i];\r\n const childGlobalAddress = globalAddresses[i];\r\n if (!parent.subtree.isTileAvailable(childLocalAddress)) {\r\n continue;\r\n }\r\n const contents = [];\r\n const contentAvailability = parent.subtree.isContentAvailable(childLocalAddress);\r\n for (let i = 0; i < contentURITemplates.length; i++) {\r\n if (!contentAvailability[i]) continue;\r\n const contentURITemplate = contentURITemplates[i];\r\n let uri;\r\n if (isQuad) {\r\n uri = contentURITemplate\r\n .replace(\"{level}\", childGlobalAddress.level)\r\n .replace(\"{x}\", childGlobalAddress.x)\r\n .replace(\"{y}\", childGlobalAddress.y);\r\n }\r\n if (!isQuad) {\r\n uri = contentURITemplate\r\n .replace(\"{level}\", childGlobalAddress.level)\r\n .replace(\"{x}\", childGlobalAddress.x)\r\n .replace(\"{y}\", childGlobalAddress.y)\r\n .replace(\"{z}\", childGlobalAddress.z);\r\n }\r\n contents.push({ uri: uri });\r\n }\r\n\r\n\r\n const child = {\r\n geometricError: parent.geometricError / 2,\r\n boundingVolume: boundingVolumes[i],\r\n refine: rootTile.root.refine,\r\n globalAddress: childGlobalAddress,\r\n localAddress: childLocalAddress,\r\n subtree: parent.subtree,\r\n contents: contents,\r\n getChildren: async () => {\r\n return buildChildren(child);\r\n }\r\n }\r\n children.push(child)\r\n }\r\n }\r\n\r\n return children.length>0?children:undefined;\r\n }\r\n\r\n}\r\n\r\nfunction getChildrenAddresses(tileAddress) {\r\n const { level, x, y, z } = tileAddress;\r\n const nextLevel = level + 1;\r\n let children = [];\r\n\r\n if (z === undefined) {\r\n // Quadtree\r\n children = [\r\n { level: nextLevel, x: x * 2, y: y * 2 }, // Bottom left\r\n { level: nextLevel, x: x * 2 + 1, y: y * 2 }, // Bottom right\r\n { level: nextLevel, x: x * 2, y: y * 2 + 1 }, // Top left\r\n { level: nextLevel, x: x * 2 + 1, y: y * 2 + 1 } // Top right\r\n ];\r\n } else {\r\n // Octree\r\n children = [\r\n { level: nextLevel, x: x * 2, y: y * 2, z: z * 2 }, // Bottom front left\r\n { level: nextLevel, x: x * 2 + 1, y: y * 2, z: z * 2 }, // Bottom front right\r\n { level: nextLevel, x: x * 2, y: y * 2 + 1, z: z * 2 }, // Bottom back left\r\n { level: nextLevel, x: x * 2 + 1, y: y * 2 + 1, z: z * 2 }, // Bottom back right\r\n { level: nextLevel, x: x * 2, y: y * 2, z: z * 2 + 1 }, // Top front left\r\n { level: nextLevel, x: x * 2 + 1, y: y * 2, z: z * 2 + 1 }, // Top front right\r\n { level: nextLevel, x: x * 2, y: y * 2 + 1, z: z * 2 + 1 }, // Top back left\r\n { level: nextLevel, x: x * 2 + 1, y: y * 2 + 1, z: z * 2 + 1 } // Top back right\r\n ];\r\n }\r\n\r\n return children;\r\n}\r\n\r\nfunction getDirectoryUrl(url) {\r\n const cleanUrl = url.split('?')[0]; // Removes query parameters\r\n return cleanUrl.substring(0, cleanUrl.lastIndexOf('/') + 1);\r\n};\r\n\r\nfunction computeBoundingVolumes(isQuad, rootBoundingVolume, addresses) {\r\n const boundingVolumes = [];\r\n for (let i = 0; i < addresses.length; i++) {\r\n boundingVolumes.push(computeBoundingVolume(isQuad, rootBoundingVolume, addresses[i]))\r\n }\r\n return boundingVolumes;\r\n}\r\n\r\nfunction computeBoundingVolume(isQuad, rootBoundingVolume, address) {\r\n if (rootBoundingVolume.region) {\r\n return splitRegion(isQuad, rootBoundingVolume.region, address);\r\n } else if (rootBoundingVolume.box) {\r\n return splitBox(isQuad, rootBoundingVolume.box, address);\r\n } else {\r\n throw new Error('Unsupported bounding volume type');\r\n }\r\n}\r\n\r\nfunction splitRegion(isQuad, rootRegion, address) {\r\n // Destructure the rootRegion for clarity\r\n const [west, south, east, north, minHeight, maxHeight] = rootRegion;\r\n \r\n // Calculate the size of each division step based on the tile's level\r\n const xStep = (east - west) / (2 ** address.level);\r\n const yStep = (north - south) / (2 ** address.level);\r\n const zStep = isQuad ? 0 : (maxHeight - minHeight) / (2 ** address.level);\r\n \r\n // Calculate the new bounds for the tile\r\n const newWest = west + (xStep * address.x);\r\n const newSouth = south + (yStep * address.y);\r\n const newEast = newWest + xStep;\r\n const newNorth = newSouth + yStep;\r\n \r\n // For quadtrees, the z dimension remains unchanged. For octrees, calculate new heights.\r\n const newMinHeight = isQuad ? minHeight : minHeight + (zStep * address.z);\r\n const newMaxHeight = isQuad ? maxHeight : newMinHeight + zStep;\r\n \r\n return {region:[newWest, newSouth, newEast, newNorth, newMinHeight, newMaxHeight]};\r\n }\r\n\r\n function splitBox(isQuad, box, address) {\r\n // Extract center and half-length vectors from the box\r\n const center = box.slice(0, 3);\r\n const vectors = [\r\n box.slice(3, 6), // First half-length vector\r\n box.slice(6, 9), // Second half-length vector\r\n box.slice(9, 12) // Third half-length vector\r\n ];\r\n \r\n // Determine scale factors for each axis\r\n const s = 1/Math.pow(2,address.level);\r\n const scaleFactors = [s, s, isQuad ? 1 : s];\r\n \r\n // Adjust the half-length vectors according to the scale factor\r\n const newVectors = vectors.map((vector, index) => vector.map(component => component * scaleFactors[index]));\r\n \r\n const origin = [center[0]-vectors[0][0]-vectors[1][0]-vectors[2][0], center[1]-vectors[0][1]-vectors[1][1]-vectors[2][1], center[2]-vectors[0][2]-vectors[1][2]-vectors[2][2]]\r\n // Calculate new center based on the child address\r\n const newCenter = [\r\n origin[0] + (address.x*2+1)*(newVectors[0][0]+newVectors[1][0]+newVectors[2][0]),\r\n origin[1] + (address.y*2+1)*(newVectors[0][1]+newVectors[1][1]+newVectors[2][1]),\r\n isQuad?center[2]:origin[2] + (address.z*2+1)*(newVectors[0][2]+newVectors[1][2]+newVectors[2][2]),\r\n ];\r\n \r\n // Construct the new box with the updated center and scaled half-length vectors\r\n const newBox = newCenter.concat(...newVectors);\r\n \r\n return {box:newBox};\r\n }\r\n \r\n\r\n\r\nexport {\r\n resolveImplicite\r\n}\r\n","// This file is part of meshoptimizer library and is distributed under the terms of MIT License.\n// Copyright (C) 2016-2023, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)\nvar MeshoptEncoder = (function() {\n\t// Built with clang version 16.0.0\n\t// Built from meshoptimizer 0.20\n\tvar wasm = \"b9H79TebbbeJq9Geueu9Geub9Gbb9Gvuuuuueu9Gduueu9Gluuuueu9Gvuuuuub9Gouuuuuub9Gluuuub9GiuuueuiKLdilevlevlooroowwvwbDDbelve9Weiiviebeoweuec:W;kekr;RiOo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9FW9U9J9V9KW9wWVtW949c919M9MWVbe8F9TW79O9V9Wt9FW9U9J9V9KW9wWVtW949c919M9MWV9c9V919U9KbdE9TW79O9V9Wt9FW9U9J9V9KW9wWVtW949wWV79P9V9UbiY9TW79O9V9Wt9FW9U9J9V9KW69U9KW949c919M9MWVbl8E9TW79O9V9Wt9FW9U9J9V9KW69U9KW949c919M9MWV9c9V919U9Kbv8A9TW79O9V9Wt9FW9U9J9V9KW69U9KW949wWV79P9V9UboE9TW79O9V9Wt9FW9U9J9V9KW69U9KW949tWG91W9U9JWbra9TW79O9V9Wt9FW9U9J9V9KW69U9KW949tWG91W9U9JW9c9V919U9KbwL9TW79O9V9Wt9FW9U9J9V9KWS9P2tWV9p9JtbDK9TW79O9V9Wt9FW9U9J9V9KWS9P2tWV9r919HtbqL9TW79O9V9Wt9FW9U9J9V9KWS9P2tWVT949WbkE9TW79O9V9Wt9F9V9Wt9P9T9P96W9wWVtW94J9H9J9OWbPa9TW79O9V9Wt9F9V9Wt9P9T9P96W9wWVtW94J9H9J9OW9ttV9P9Wbsa9TW79O9V9Wt9F9V9Wt9P9T9P96W9wWVtW94SWt9J9O9sW9T9H9WbzK9TW79O9V9Wt9F79W9Ht9P9H29t9VVt9sW9T9H9WbHl79IV9RbODwebcekdQXq:g9sLdbk;3keYu8Jjjjjbcjo9Rgv8Kjjjjbcbhodnalcefae0mbabcbRb:S:kjjbc:GeV86bbavcjdfcbcjdzNjjjb8AdnaiTmbavcjdfadalz:tjjjb8Akabaefhrabcefhwavalfcbcbcjdal9RalcFe0EzNjjjb8Aavavcjdfalz:tjjjbhDcj;abal9UhodndndndndnalTmbaoc;WFbGgecjdaecjd6Ehqcbhkdninakai9pmiaDcjlfcbcjdzNjjjb8Aaqaiak9Rakaqfai6Egxcsfgecl4cifcd4hmadakal2fhPdndndndndnaec9WGgsTmbcbhzcehHaPhOawhAxekdnaxTmbcbhAcehHaPhCinaDaAfRbbhXaDcjlfheaChoaxhQinaeaoRbbgLaX9RgXcetaX;acr4786bbaoalfhoaecefheaLhXaQcufgQmbkaraw9Ram6miawcbamzNjjjbgeTmiaCcefhCaeamfhwaAcefgAal6hHaAal9hmbxvkkaraw9Ram6mvawcbamzNjjjb8AceheinawgXamfhwalaegoSmldnaraw9Ram6mbaocefheawcbamzNjjjb8AaXmekkaoal6hHxekindnaxTmbaDazfRbbhXaDcjlfheaOhoaxhQinaeaoRbbgLaX9RgXcetaX;acr4786bbaoalfhoaecefheaLhXaQcufgQmbkkaraA9Ram6mearaAcbamzNjjjbgKamfgw9RcK6mdcbhYaDcjlfhAinaDcjlfaYfh8AcwhCczhLcehQindndnaQce9hmbcuhoa8ARbbmecbhodninaogecsSmeaecefhoaAaefcefRbbTmbkkcucbaecs6EhoxekaQcetc;:FFFeGhocuaQtcu7cFeGhXcbheinaoaXaAaefRbb9nfhoaecefgecz9hmbkkaoaLaoaL6geEhLaQaCaeEhCaQcetgQcw6mbkdndndndnaCcufPdiebkaKaYco4fgeaeRbbcdciaCclSEaYci4coGtV86bbaCcw9hmeawa8A8Pbb83bbawcwfa8Acwf8Pbb83bbawczfhwxdkaKaYco4fgeaeRbbceaYci4coGtV86bbkdncwaC9TgEmbinawcb86bbawcefhwxbkkcuaCtcu7h8Acbh3aAh5ina5heaEhQcbhoinaeRbbgLa8AcFeGgXaLaX6EaoaCtVhoaecefheaQcufgQmbkawao86bba5aEfh5awcefhwa3aEfg3cz6mbkcbheindnaAaefRbbgoaX6mbawao86bbawcefhwkaecefgecz9hmbkkdnaYczfgYas9pmbaAczfhAaraw9RcL0mekkaYas6meawTmeaOcefhOazcefgzal6hHawhAazalSmixbkkcbhwaHceGTmexikcbhwaHceGmdkaDaPaxcufal2falz:tjjjb8AaxakfhkawmbkcbhoxokcbhoxvkaiTmekcbhoaraw9Ralcaalca0E6mialc8F9nmexdkcbhoaecufca6mdkawcbcaal9RgezNjjjbaefhwkawaDcjdfalz:tjjjbalfab9Rhokavcjof8Kjjjjbaok9heeuaecaaeca0Eabcj;abae9Uc;WFbGgdcjdadcjd6Egdfcufad9Uae2adcl4cifcd4adV2fcefkmbcbabBd:S:kjjbk;rse3u8Jjjjjbc;ae9Rgl8Kjjjjbcbhvdnaici9UgocHfae0mbabcbyd:C:kjjbgrc;GeV86bbalc;abfcFecjezNjjjb8AalcUfgw9cu83ibalc8WfgD9cu83ibalcyfgq9cu83ibalcafgk9cu83ibalcKfgx9cu83ibalczfgm9cu83ibal9cu83iwal9cu83ibabaefc9WfhPabcefgsaofhednaiTmbcmcsarcb9kgzEhHcbhOcbhAcbhCcbhXcbhQindnaeaP9nmbcbhvxikaQcufhvadaCcdtfgoydbhLaocwfydbhKaoclfydbhYcbh8Adndninalc;abfavcsGcitfgoydlhEdndndnaoydbgoaL9hmbaEaYSmekdnaoaY9hmbaEaK9hmba8Acefh8AxekaoaK9hmeaEaL9hmea8Acdfh8Aka8Ac870mdaXcufhvada8AciGcx2goc:y1jjbfydbaCfcdtfydbhEadaocN1jjbfydbaCfcdtfydbhKadaoc:q1jjbfydbaCfcdtfydbhLcbhodnindnalavcsGcdtfydbaE9hmbaohYxdkcuhYavcufhvaocefgocz9hmbkkaEaOSgvaYce9iaYaH9oVgoGh3dndndndndncbcsavEaYaoEgvcs9hmbarce9imbaEaEaAaEcefaASgvEgAcefSmecmcsavEhvkasava8Acdtc;WeGV86bbavcs9hmeaEaA9Rgvcetavc8F917hvinaeavcFb0crtavcFbGV86bbaecefheavcje6hoavcr4hvaoTmbkaEhAxdkcPhvasa8AcdtcPV86bbaEhAkavTmbavaH9imekalaXcdtfaEBdbaXcefcsGhXkaOa3fhOalc;abfaQcitfgvaKBdlavaEBdbalc;abfaQcefcsGgvcitfgoaEBdlaoaLBdbavcefhoxikavcufhva8Aclfg8Ac;ab9hmbkkdnadceaKaOScetaYaOSEcx2gvc:q1jjbfydbaCfcdtfydbgLTadavcN1jjbfydbaCfcdtfydbg8AceSGadavc:y1jjbfydbaCfcdtfydbgYcdSGaOcb9hGazGg5ce9hmbaw9cu83ibaD9cu83ibaq9cu83ibak9cu83ibax9cu83ibam9cu83ibal9cu83iwal9cu83ibcbhOkcbhEaXcufgvhodnindnalaocsGcdtfydba8A9hmbaEhKxdkcuhKaocufhoaEcefgEcz9hmbkkcbhodnindnalavcsGcdtfydbaY9hmbaohExdkcuhEavcufhvaocefgocz9hmbkkaOaLaOSg8Efh3dndnaKcm0mbaKcefhKxekcbcsa8Aa3SgvEhKa3avfh3kdndnaEcm0mbaEcefhExekcbcsaYa3SgvEhEa3avfh3kc9:cua8EEh8FaEaKcltVhocbhvdndndninavcj1jjbfRbbaocFeGSmeavcefgvcz9hmbxdkka5aLaO9havcm0VVmbasavc;WeV86bbxekasa8F86bbaeao86bbaecefhekdna8EmbaLaA9Rgvcetavc8F917hvinaeavcFb0gocrtavcFbGV86bbavcr4hvaecefheaombkaLhAkdnaKcs9hmba8AaA9Rgvcetavc8F917hvinaeavcFb0gocrtavcFbGV86bbavcr4hvaecefheaombka8AhAkdnaEcs9hmbaYaA9Rgvcetavc8F917hvinaeavcFb0gocrtavcFbGV86bbavcr4hvaecefheaombkaYhAkalaXcdtfaLBdbaXcefcsGhvdndnaKPzbeeeeeeeeeeeeeebekalavcdtfa8ABdbaXcdfcsGhvkdndnaEPzbeeeeeeeeeeeeeebekalavcdtfaYBdbavcefcsGhvkalc;abfaQcitfgoaLBdlaoa8ABdbalc;abfaQcefcsGcitfgoa8ABdlaoaYBdbalc;abfaQcdfcsGcitfgoaYBdlaoaLBdbaQcifhoavhXa3hOkascefhsaocsGhQaCcifgCai6mbkkcbhvaeaP0mbcbhvinaeavfavcj1jjbfRbb86bbavcefgvcz9hmbkaeab9Ravfhvkalc;aef8KjjjjbavkZeeucbhddninadcefgdc8F0meceadtae6mbkkadcrfcFeGcr9Uci2cdfabci9U2cHfkmbcbabBd:C:kjjbk:ydewu8Jjjjjbcz9Rhlcbhvdnaicvfae0mbcbhvabcbRb:C:kjjbc;qeV86bbal9cb83iwabcefhoabaefc98fhrdnaiTmbcbhwcbhDindnaoar6mbcbskadaDcdtfydbgqalcwfawaqav9Rgvavc8F91gv7av9Rc507gwcdtfgkydb9Rgvc8E91c9:Gavcdt7awVhvinaoavcFb0gecrtavcFbGV86bbavcr4hvaocefhoaembkakaqBdbaqhvaDcefgDai9hmbkkcbhvaoar0mbaocbBbbaoab9RclfhvkavkBeeucbhddninadcefgdc8F0meceadtae6mbkkadcwfcFeGcr9Uab2cvfk:dvli99dui99ludnaeTmbcuadcetcuftcu7:Yhvdndncuaicuftcu7:YgoJbbbZMgr:lJbbb9p9DTmbar:Ohwxekcjjjj94hwkcbhicbhDinalclfIdbgrJbbbbJbbjZalIdbgq:lar:lMalcwfIdbgk:lMgr:varJbbbb9BEgrNhxaqarNhralcxfIdbhqdndnakJbbbb9GTmbaxhkxekJbbjZar:l:tgkak:maxJbbbb9GEhkJbbjZax:l:tgxax:marJbbbb9GEhrkdndnaqJbbj:;aqJbbj:;9GEgxJbbjZaxJbbjZ9FEavNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohmxekcjjjj94hmkdndnakJbbj:;akJbbj:;9GEgqJbbjZaqJbbjZ9FEaoNJbbbZJbbb:;akJbbbb9GEMgq:lJbbb9p9DTmbaq:OhPxekcjjjj94hPkdndnarJbbj:;arJbbj:;9GEgqJbbjZaqJbbjZ9FEaoNJbbbZJbbb:;arJbbbb9GEMgr:lJbbb9p9DTmbar:Ohsxekcjjjj94hskdndnadcl9hmbabaifgzas86bbazcifam86bbazcdfaw86bbazcefaP86bbxekabaDfgzas87ebazcofam87ebazclfaw87ebazcdfaP87ebkalczfhlaiclfhiaDcwfhDaecufgembkkk;klld99eud99eudnaeTmbdndncuaicuftcu7:YgvJbbbZMgo:lJbbb9p9DTmbao:Ohixekcjjjj94hikaic;8FiGhrinabcofcicdalclfIdb:lalIdb:l9EgialcwfIdb:lalaicdtfIdb:l9EEgialcxfIdb:lalaicdtfIdb:l9EEgiarV87ebdndnalaicefciGcdtfIdbJ;Zl:1ZNJbbj:;JbbjZalaicdtfIdbJbbbb9DEgoNgwJbbj:;awJbbj:;9GEgDJbbjZaDJbbjZ9FEavNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohqxekcjjjj94hqkabaq87ebdndnaoalaicdfciGcdtfIdbJ;Zl:1ZNNgwJbbj:;awJbbj:;9GEgDJbbjZaDJbbjZ9FEavNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohqxekcjjjj94hqkabcdfaq87ebdndnaoalaicufciGcdtfIdbJ;Zl:1ZNNgoJbbj:;aoJbbj:;9GEgwJbbjZawJbbjZ9FEavNJbbbZJbbb:;aoJbbbb9GEMgo:lJbbb9p9DTmbao:Ohixekcjjjj94hikabclfai87ebabcwfhbalczfhlaecufgembkkk:Hvdxue998Jjjjjbcjd9Rgo8Kjjjjbadcd4hrdndndndnavcd9hmbadcl6mearcearce0EhwaohDinaDc:CuBdbaDclfhDawcufgwmbkaeTmiadcl6mdarcearce0EhqarcdthkalhxcbhminaohDaxhwaqhPinaDaDydbgsawydbgzcL4cFeGc:cufcbazEgzasaz9kEBdbawclfhwaDclfhDaPcufgPmbkaxakfhxamcefgmae9hmbkkaeTmdxekaeTmekavcb9hadcl6gqVhHarcearce0Ehkarcdthrceai9Rhmcbhdindndndnavce9hmbaqmdc:CuhwalhDakhPinawaDydbgscL4cFeGc:cufcbasEgsawas9kEhwaDclfhDaPcufgPmbxdkkc:CuhwaHmbaohDalhPakhsinaDaPydbgzcL4cFeGgxc8Aaxc8A9kEc:cufcbazEBdbaPclfhPaDclfhDascufgsmbkkaqmbcbhDakhsinawhPdnavceSmbaoaDfydbhPkdndnalaDfIdbgOcjjj;8iamaPfgPcLt9R::NJbbbZJbbb:;aOJbbbb9GEMgO:lJbbb9p9DTmbaO:Ohzxekcjjjj94hzkabaDfazcFFFrGaPcKtVBdbaDclfhDascufgsmbkkabarfhbalarfhladcefgdae9hmbkkaocjdf8KjjjjbkFkdCui998Jjjjjbc:Gd9Rgv8Kjjjjbavc:4efcbc;KbzNjjjb8AcbhodnadTmbcbhoaiTmbdnabae9hmbavcuadcdtgoadcFFFFi0Ecbyd:K:kjjbHjjjjbbgeBd:4eavceBd:ydaeabaoz:tjjjb8Akavc:OefcwfcbBdbav9cb83i:Oeavc:Oefaeadaiavc:4efz:njjjbcuaicdtgraicFFFFi0Egwcbyd:K:kjjbHjjjjbbhoavc:4efavyd:ydgDcdtfaoBdbavaDcefgqBd:ydaoavyd:Oegkarz:tjjjbhxavc:4efaqcdtfadci9Ugmcbyd:K:kjjbHjjjjbbgoBdbavaDcdfgrBd:ydaocbamzNjjjbhPavc:4efarcdtfawcbyd:K:kjjbHjjjjbbgsBdbavaDcifgqBd:ydaxhoashrinaralIdbalaoydbgwcwawcw6Ecdtfc;ebfIdbMUdbaoclfhoarclfhraicufgimbkavc:4efaqcdtfcuamcdtadcFFFF970Ecbyd:K:kjjbHjjjjbbgqBdbavaDclfBd:yddnadci6mbamceamce0EhiaehoaqhrinarasaoydbcdtfIdbasaoclfydbcdtfIdbMasaocwfydbcdtfIdbMUdbaocxfhoarclfhraicufgimbkkavc;qbfhzavhoavyd:SehHavyd:WehOcbhwcbhrcbhAcehCinaohXcihQaearci2gLcdtfgocwfydbhdaoydbhDabaAcx2fgiclfaoclfydbgKBdbaiaDBdbaicwfadBdbaParfce86bbazadBdwazaKBdlazaDBdbaqarcdtfcbBdbdnawTmbcihQaXhiinazaQcdtfaiydbgoBdbaQaoaD9haoaK9hGaoad9hGfhQaiclfhiawcufgwmbkkaAcefhAaxaDcdtfgoaoydbcufBdbaxaKcdtfgoaoydbcufBdbaxadcdtfgoaoydbcufBdbcbhwinaOaHaeawaLfcdtfydbcdtgifydbcdtfgKhoakaifgDydbgdhidnadTmbdninaoydbarSmeaoclfhoaicufgiTmdxbkkaoadcdtaKfc98fydbBdbaDaDydbcufBdbkawcefgwci9hmbkdndndnaQTmbcuhrJbbbbhYcbhDavyd:SehKavyd:WehLindndnakazaDcdtfydbcdtgofydbgimbaDcefhDxekaDcs0hwasaofgdIdbh8AadalcbaDcefgDawEcdtfIdbalaxaofydbgwcwawcw6Ecdtfc;ebfIdbMgEUdbaEa8A:thEaicdthiaLaKaofydbcdtfhoinaqaoydbgwcdtfgdaEadIdbMg8AUdba8AaYaYa8A9DgdEhYawaradEhraoclfhoaic98fgimbkkaDaQ9hmbkarcu9hmekaCam9pmeindnaPaCfRbbmbaChrxdkamaCcefgC9hmbxdkkaQczaQcz6EhwazhoaXhzarcu9hmekkavyd:ydhokaocdtavc:4effc98fhrdninaoTmearydbcbyd:G:kjjbH:bjjjbbarc98fhraocufhoxbkkavc:Gdf8Kjjjjbk;UlevucuaicdtgvaicFFFFi0Egocbyd:K:kjjbHjjjjbbhralalyd9GgwcdtfarBdbalawcefBd9GabarBdbaocbyd:K:kjjbHjjjjbbhralalyd9GgocdtfarBdbalaocefBd9GabarBdlcuadcdtadcFFFFi0Ecbyd:K:kjjbHjjjjbbhralalyd9GgocdtfarBdbalaocefBd9GabarBdwabydbcbavzNjjjb8Aadci9UhwdnadTmbabydbhoaehladhrinaoalydbcdtfgvavydbcefBdbalclfhlarcufgrmbkkdnaiTmbabydbhlabydlhrcbhvaihoinaravBdbarclfhralydbavfhvalclfhlaocufgombkkdnadci6mbawceawce0EhDabydlhrabydwhvcbhlinaecwfydbhoaeclfydbhdaraeydbcdtfgwawydbgwcefBdbavawcdtfalBdbaradcdtfgdadydbgdcefBdbavadcdtfalBdbaraocdtfgoaoydbgocefBdbavaocdtfalBdbaecxfheaDalcefgl9hmbkkdnaiTmbabydlheabydbhlinaeaeydbalydb9RBdbalclfhlaeclfheaicufgimbkkkQbabaeadaic:01jjbz:mjjjbkQbabaeadaic:C:jjjbz:mjjjbk9DeeuabcFeaicdtzNjjjbhlcbhbdnadTmbindnalaeydbcdtfgiydbcu9hmbaiabBdbabcefhbkaeclfheadcufgdmbkkabk;:kivuo99lu8Jjjjjbcj;Hb9Rgl8Kjjjjbcbhvalc1;Gbfcbc;KbzNjjjb8AalcuadcdtadcFFFFi0Egocbyd:K:kjjbHjjjjbbgrBd19GalceBd;O9Galcwfcbyd:m:kjjbBdbalcb8Pd:e:kjjb83ibalc;W;Gbfcwfcbyd:y:kjjbBdbalcb8Pd:q:kjjb83i;W9Gaicd4hwdndnadmbJFFuFhDJFFuuhqJFFuuhkJFFuFhxJFFuuhmJFFuFhPxekawcdthsaehzincbhiinalaifgHazaifIdbgDaHIdbgxaxaD9EEUdbalc;W;GbfaifgHaDaHIdbgxaxaD9DEUdbaiclfgicx9hmbkazasfhzavcefgvad9hmbkalIdwhqalId;49GhDalIdlhkalId;09GhxalIdbhmalId;W9GhPkdndnadTmbJbbbbJbbjZaPam:tJbbbb:xgPaxak:tgxaxaP9DEgxaDaq:tgDaDax9DEgD:vaDJbbbb9BEhDawcdthsarhHadhzindndnaDaeIdbam:tNJb;au9eNJbbbZMgx:lJbbb9p9DTmbax:Ohixekcjjjj94hikaicztaicwtcj;GiGVaicsGVc:p;G:dKGcH2c;d;H:WKGcv2c;j:KM;jbGhvdndnaDaeclfIdbak:tNJb;au9eNJbbbZMgx:lJbbb9p9DTmbax:Ohixekcjjjj94hikaicztaicwtcj;GiGVaicsGVc:p;G:dKGcH2c;d;H:WKGcq2cM;j:KMeGavVhvdndnaDaecwfIdbaq:tNJb;au9eNJbbbZMgx:lJbbb9p9DTmbax:Ohixekcjjjj94hikaHavaicztaicwtcj;GiGVaicsGVc:p;G:dKGcH2c;d;H:WKGcC2c:KM;j:KdGVBdbaeasfheaHclfhHazcufgzmbkalcbcj;GbzNjjjbhiarhHadheinaiaHydbgzcFrGcx2fgvavydbcefBdbaiazcq4cFrGcx2fgvavydlcefBdlaiazcC4cFrGcx2fgzazydwcefBdwaHclfhHaecufgembxdkkalcbcj;GbzNjjjb8AkcbhHcbhzcbhecbhvinalaHfgiydbhsaiazBdbaicwfgwydbhOawavBdbaiclfgiydbhwaiaeBdbasazfhzaOavfhvawaefheaHcxfgHcj;Gb9hmbkcbhialaocbyd:K:kjjbHjjjjbbgzBd:m9GdnadTmbabhHinaHaiBdbaHclfhHadaicefgi9hmbkadTmbabhiadhHinalaraiydbgecdtfydbcFrGcx2fgvavydbgvcefBdbazavcdtfaeBdbaiclfhiaHcufgHmbkazhiadhHinalaraiydbgecdtfydbcq4cFrGcx2fgvavydlgvcefBdlabavcdtfaeBdbaiclfhiaHcufgHmbkabhiadhHinalaraiydbgecdtfydbcC4cFrGcx2fgvavydwgvcefBdwazavcdtfaeBdbaiclfhiaHcufgHmbkadTmbcbhiinabazydbcdtfaiBdbazclfhzadaicefgi9hmbkkclhidninaic98Smealc1;Gbfaifydbcbyd:G:kjjbH:bjjjbbaic98fhixbkkalcj;Hbf8Kjjjjbk9teiucbcbyd:O:kjjbgeabcifc98GfgbBd:O:kjjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;LeeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiclfaeclfydbBdbaicwfaecwfydbBdbaicxfaecxfydbBdbaeczfheaiczfhiadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk;aeedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdbaicxfalBdbaicwfalBdbaiclfalBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabk9teiucbcbyd:O:kjjbgeabcrfc94GfgbBd:O:kjjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik9:eiuZbhedndncbyd:O:kjjbgdaecztgi9nmbcuheadai9RcFFifcz4nbcuSmekadhekcbabae9Rcifc98Gcbyd:O:kjjbfgdBd:O:kjjbdnadZbcztge9nmbadae9RcFFifcz4nb8Akkk:6ddbcjwk:Cdb4:h9w9N94:P:gW:j9O:ye9Pbbbbbbebbbdbbbebbbdbbbbbbbdbbbbbbbebbbbbbb:l29hZ;69:9kZ;N;76Z;rg97Z;z;o9xZ8J;B85Z;:;u9yZ;b;k9HZ:2;Z9DZ9e:l9mZ59A8KZ:r;T3Z:A:zYZ79OHZ;j4::8::Y:D9V8:bbbb9s:49:Z8R:hBZ9M9M;M8:L;z;o8:;8:PG89q;x:J878R:hQ8::M:B;e87bbbbbbjZbbjZbbjZ:E;V;N8::Y:DsZ9i;H;68:xd;R8:;h0838:;W:NoZbbbb:WV9O8:uf888:9i;H;68:9c9G;L89;n;m9m89;D8Ko8:bbbbf:8tZ9m836ZS:2AZL;zPZZ818EZ9e:lxZ;U98F8:819E;68:FFuuFFuuFFuuFFuFFFuFFFuFbc:Cqkzebbbebbbdbbb8WWbb\";\n\n\tvar wasmpack = new Uint8Array([32,0,65,2,1,106,34,33,3,128,11,4,13,64,6,253,10,7,15,116,127,5,8,12,40,16,19,54,20,9,27,255,113,17,42,67,24,23,146,148,18,14,22,45,70,69,56,114,101,21,25,63,75,136,108,28,118,29,73,115]);\n\n\tif (typeof WebAssembly !== 'object') {\n\t\treturn {\n\t\t\tsupported: false,\n\t\t};\n\t}\n\n\tvar instance;\n\n\tvar ready =\n\t\tWebAssembly.instantiate(unpack(wasm), {})\n\t\t.then(function(result) {\n\t\t\tinstance = result.instance;\n\t\t\tinstance.exports.__wasm_call_ctors();\n\t\t\tinstance.exports.meshopt_encodeVertexVersion(0);\n\t\t\tinstance.exports.meshopt_encodeIndexVersion(1);\n\t\t});\n\n\tfunction unpack(data) {\n\t\tvar result = new Uint8Array(data.length);\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tvar ch = data.charCodeAt(i);\n\t\t\tresult[i] = ch > 96 ? ch - 97 : ch > 64 ? ch - 39 : ch + 4;\n\t\t}\n\t\tvar write = 0;\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tresult[write++] = (result[i] < 60) ? wasmpack[result[i]] : (result[i] - 60) * 64 + result[++i];\n\t\t}\n\t\treturn result.buffer.slice(0, write);\n\t}\n\n\tfunction assert(cond) {\n\t\tif (!cond) {\n\t\t\tthrow new Error(\"Assertion failed\");\n\t\t}\n\t}\n\n\tfunction bytes(view) {\n\t\treturn new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n\t}\n\n\tfunction reorder(fun, indices, vertices, optf) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar ip = sbrk(indices.length * 4);\n\t\tvar rp = sbrk(vertices * 4);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar indices8 = bytes(indices);\n\t\theap.set(indices8, ip);\n\t\tif (optf) {\n\t\t\toptf(ip, ip, indices.length, vertices);\n\t\t}\n\t\tvar unique = fun(rp, ip, indices.length, vertices);\n\t\t// heap may have grown\n\t\theap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar remap = new Uint32Array(vertices);\n\t\tnew Uint8Array(remap.buffer).set(heap.subarray(rp, rp + vertices * 4));\n\t\tindices8.set(heap.subarray(ip, ip + indices.length * 4));\n\t\tsbrk(ip - sbrk(0));\n\n\t\tfor (var i = 0; i < indices.length; ++i)\n\t\t\tindices[i] = remap[indices[i]];\n\n\t\treturn [remap, unique];\n\t}\n\n\tfunction spatialsort(fun, positions, count, stride) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar ip = sbrk(count * 4);\n\t\tvar sp = sbrk(count * stride);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(bytes(positions), sp);\n\t\tfun(ip, sp, count, stride);\n\t\t// heap may have grown\n\t\theap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar remap = new Uint32Array(count);\n\t\tnew Uint8Array(remap.buffer).set(heap.subarray(ip, ip + count * 4));\n\t\tsbrk(ip - sbrk(0));\n\t\treturn remap;\n\t}\n\n\tfunction encode(fun, bound, source, count, size) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar tp = sbrk(bound);\n\t\tvar sp = sbrk(count * size);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(bytes(source), sp);\n\t\tvar res = fun(tp, bound, sp, count, size);\n\t\tvar target = new Uint8Array(res);\n\t\ttarget.set(heap.subarray(tp, tp + res));\n\t\tsbrk(tp - sbrk(0));\n\t\treturn target;\n\t}\n\n\tfunction maxindex(source) {\n\t\tvar result = 0;\n\t\tfor (var i = 0; i < source.length; ++i) {\n\t\t\tvar index = source[i];\n\t\t\tresult = result < index ? index : result;\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction index32(source, size) {\n\t\tassert(size == 2 || size == 4);\n\t\tif (size == 4) {\n\t\t\treturn new Uint32Array(source.buffer, source.byteOffset, source.byteLength / 4);\n\t\t} else {\n\t\t\tvar view = new Uint16Array(source.buffer, source.byteOffset, source.byteLength / 2);\n\t\t\treturn new Uint32Array(view); // copies each element\n\t\t}\n\t}\n\n\tfunction filter(fun, source, count, stride, bits, insize, mode) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar tp = sbrk(count * stride);\n\t\tvar sp = sbrk(count * insize);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(bytes(source), sp);\n\t\tfun(tp, count, stride, bits, sp, mode);\n\t\tvar target = new Uint8Array(count * stride);\n\t\ttarget.set(heap.subarray(tp, tp + count * stride));\n\t\tsbrk(tp - sbrk(0));\n\t\treturn target;\n\t}\n\n\treturn {\n\t\tready: ready,\n\t\tsupported: true,\n\t\treorderMesh: function(indices, triangles, optsize) {\n\t\t\tvar optf = triangles ? (optsize ? instance.exports.meshopt_optimizeVertexCacheStrip : instance.exports.meshopt_optimizeVertexCache) : undefined;\n\t\t\treturn reorder(instance.exports.meshopt_optimizeVertexFetchRemap, indices, maxindex(indices) + 1, optf);\n\t\t},\n\t\treorderPoints: function(positions, positions_stride) {\n\t\t\tassert(positions instanceof Float32Array);\n\t\t\tassert(positions.length % positions_stride == 0);\n\t\t\tassert(positions_stride >= 3);\n\t\t\treturn spatialsort(instance.exports.meshopt_spatialSortRemap, positions, positions.length / positions_stride, positions_stride * 4);\n\t\t},\n\t\tencodeVertexBuffer: function(source, count, size) {\n\t\t\tassert(size > 0 && size <= 256);\n\t\t\tassert(size % 4 == 0);\n\t\t\tvar bound = instance.exports.meshopt_encodeVertexBufferBound(count, size);\n\t\t\treturn encode(instance.exports.meshopt_encodeVertexBuffer, bound, source, count, size);\n\t\t},\n\t\tencodeIndexBuffer: function(source, count, size) {\n\t\t\tassert(size == 2 || size == 4);\n\t\t\tassert(count % 3 == 0);\n\t\t\tvar indices = index32(source, size);\n\t\t\tvar bound = instance.exports.meshopt_encodeIndexBufferBound(count, maxindex(indices) + 1);\n\t\t\treturn encode(instance.exports.meshopt_encodeIndexBuffer, bound, indices, count, 4);\n\t\t},\n\t\tencodeIndexSequence: function(source, count, size) {\n\t\t\tassert(size == 2 || size == 4);\n\t\t\tvar indices = index32(source, size);\n\t\t\tvar bound = instance.exports.meshopt_encodeIndexSequenceBound(count, maxindex(indices) + 1);\n\t\t\treturn encode(instance.exports.meshopt_encodeIndexSequence, bound, indices, count, 4);\n\t\t},\n\t\tencodeGltfBuffer: function(source, count, size, mode) {\n\t\t\tvar table = {\n\t\t\t\tATTRIBUTES: this.encodeVertexBuffer,\n\t\t\t\tTRIANGLES: this.encodeIndexBuffer,\n\t\t\t\tINDICES: this.encodeIndexSequence,\n\t\t\t};\n\t\t\tassert(table[mode]);\n\t\t\treturn table[mode](source, count, size);\n\t\t},\n\t\tencodeFilterOct: function(source, count, stride, bits) {\n\t\t\tassert(stride == 4 || stride == 8);\n\t\t\tassert(bits >= 1 && bits <= 16);\n\t\t\treturn filter(instance.exports.meshopt_encodeFilterOct, source, count, stride, bits, 16);\n\t\t},\n\t\tencodeFilterQuat: function(source, count, stride, bits) {\n\t\t\tassert(stride == 8);\n\t\t\tassert(bits >= 4 && bits <= 16);\n\t\t\treturn filter(instance.exports.meshopt_encodeFilterQuat, source, count, stride, bits, 16);\n\t\t},\n\t\tencodeFilterExp: function(source, count, stride, bits, mode) {\n\t\t\tassert(stride > 0 && stride % 4 == 0);\n\t\t\tassert(bits >= 1 && bits <= 24);\n\t\t\tvar table = {\n\t\t\t\tSeparate: 0,\n\t\t\t\tSharedVector: 1,\n\t\t\t\tSharedComponent: 2,\n\t\t\t};\n\t\t\treturn filter(instance.exports.meshopt_encodeFilterExp, source, count, stride, bits, stride, mode ? table[mode] : 1);\n\t\t},\n\t};\n})();\n\nexport { MeshoptEncoder };\n","// This file is part of meshoptimizer library and is distributed under the terms of MIT License.\n// Copyright (C) 2016-2023, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)\nvar MeshoptDecoder = (function() {\n\t// Built with clang version 16.0.0\n\t// Built from meshoptimizer 0.20\n\tvar wasm_base = \"b9H79Tebbbe8Fv9Gbb9Gvuuuuueu9Giuuub9Geueu9Giuuueuikqbeeedddillviebeoweuec:q;iekr;leDo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbeY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVbdE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbiL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtblK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949Wbol79IV9Rbrq;d8Yqdbk:yzeHu8Jjjjjbcj;eb9Rgv8Kjjjjbc9:hodnadcefal0mbcuhoaiRbbc:Ge9hmbavaialfgrad9Radz1jjjbhwcj;abad9UhlaicefhodnadTmbalc;WFbGglcjdalcjd6EhDcbhqinaqae9pmeaDaeaq9RaqaDfae6Egkcsfglcl4cifcd4hxdndndndnalc9WGgmTmbcbhPcehsawcjdfhzaohHinaraH9Rax6midnaraHaxfgo9RcK6mbczhlcbhOinalgic9WfgAawcj;cbffhldndndndndnaHaAco4fRbbaOcoG4ciGPlbedibkal9cb83ibalcwf9cb83ibxikalaoRblaoRbbgAco4gCaCciSgCE86bbawcj;cbfaifglcGfaoclfaCfgCRbbaAcl4ciGgXaXciSgXE86bbalcVfaCaXfgCRbbaAcd4ciGgXaXciSgXE86bbalc7faCaXfgCRbbaAciGgAaAciSgAE86bbalctfaCaAfgCRbbaoRbegAco4gXaXciSgXE86bbalc91faCaXfgCRbbaAcl4ciGgXaXciSgXE86bbalc4faCaXfgCRbbaAcd4ciGgXaXciSgXE86bbalc93faCaXfgCRbbaAciGgAaAciSgAE86bbalc94faCaAfgCRbbaoRbdgAco4gXaXciSgXE86bbalc95faCaXfgCRbbaAcl4ciGgXaXciSgXE86bbalc96faCaXfgCRbbaAcd4ciGgXaXciSgXE86bbalc97faCaXfgCRbbaAciGgAaAciSgAE86bbalc98faCaAfgARbbaoRbigoco4gCaCciSgCE86bbalc99faAaCfgARbbaocl4ciGgCaCciSgCE86bbalc9:faAaCfgARbbaocd4ciGgCaCciSgCE86bbalcufaAaCfglRbbaociGgoaociSgoE86bbalaofhoxdkalaoRbwaoRbbgAcl4gCaCcsSgCE86bbawcj;cbfaifglcGfaocwfaCfgCRbbaAcsGgAaAcsSgAE86bbalcVfaCaAfgARbbaoRbegCcl4gXaXcsSgXE86bbalc7faAaXfgARbbaCcsGgCaCcsSgCE86bbalctfaAaCfgARbbaoRbdgCcl4gXaXcsSgXE86bbalc91faAaXfgARbbaCcsGgCaCcsSgCE86bbalc4faAaCfgARbbaoRbigCcl4gXaXcsSgXE86bbalc93faAaXfgARbbaCcsGgCaCcsSgCE86bbalc94faAaCfgARbbaoRblgCcl4gXaXcsSgXE86bbalc95faAaXfgARbbaCcsGgCaCcsSgCE86bbalc96faAaCfgARbbaoRbvgCcl4gXaXcsSgXE86bbalc97faAaXfgARbbaCcsGgCaCcsSgCE86bbalc98faAaCfgARbbaoRbogCcl4gXaXcsSgXE86bbalc99faAaXfgARbbaCcsGgCaCcsSgCE86bbalc9:faAaCfgARbbaoRbrgocl4gCaCcsSgCE86bbalcufaAaCfglRbbaocsGgoaocsSgoE86bbalaofhoxekalao8Pbb83bbalcwfaocwf8Pbb83bbaoczfhokdnaiam9pmbaOcdfhOaiczfhlarao9RcL0mekkaiam6miaoTmidnakTmbawaPfRbbhOawcj;cbfhlazhiakhAinaialRbbgHce4cbaHceG9R7aOfgO86bbaiadfhialcefhlaAcufgAmbkkazcefhzaPcefgPad6hsaohHaPad9hmexvkkcbhoasceGmdxikaoaxad2fhXdnakTmbcbhmcehsawcjdfhCinarao9Rax6miaoTmdaoaxfhoawamfRbbhOawcj;cbfhlaChiakhAinaialRbbgHce4cbaHceG9R7aOfgO86bbaiadfhialcefhlaAcufgAmbkaCcefhCamcefgmad6hsamad9hmbkaXhoxikcbhlcehsinarao9Rax6mdaoTmeaoaxfhoalcefglad6hsadal9hmbkaXhoxdkcbhoasceGTmekc9:hoxikabaqad2fawcjdfakad2z1jjjb8Aawawcjdfakcufad2fadz1jjjb8Aakaqfhqaombkc9:hoxekcbc99arao9Radcaadca0ESEhokavcj;ebf8Kjjjjbaok;xzeHu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnaeci9UgrcHfal0mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgDce0mbavc;abfcFecjez:jjjjb8AavcUf9cu83ibavc8Wf9cu83ibavcyf9cu83ibavcaf9cu83ibavcKf9cu83ibavczf9cu83ibav9cu83iwav9cu83ibaialfc9WfhqaicefgwarfhodnaeTmbcmcsaDceSEhkcbhxcbhmcbhrcbhicbhlindnaoaq9nmbc9:hoxikdndnawRbbgDc;Ve0mbavc;abfalaDcu7gPcl4fcsGcitfgsydlhzasydbhHdnaDcsGgDak9pmbavaiaPfcsGcdtfydbaxaDEhsaDThDdndnadcd9hmbabarcetfgPaH87ebaPcdfaz87ebaPclfas87ebxekabarcdtfgPaHBdbaPclfazBdbaPcwfasBdbkaxaDfhxavc;abfalcitfgPasBdbaPazBdlavaicdtfasBdbavc;abfalcefcsGglcitfgPaHBdbaPasBdlaiaDfhialcefhlxdkdndnaDcsSmbamaDfaDc987fcefhmxekaocefhDao8SbbgscFeGhPdndnascu9mmbaDhoxekaocvfhoaPcFbGhPcrhsdninaD8SbbgOcFbGastaPVhPaOcu9kmeaDcefhDascrfgsc8J9hmbxdkkaDcefhokaPce4cbaPceG9R7amfhmkdndnadcd9hmbabarcetfgDaH87ebaDcdfaz87ebaDclfam87ebxekabarcdtfgDaHBdbaDclfazBdbaDcwfamBdbkavc;abfalcitfgDamBdbaDazBdlavaicdtfamBdbavc;abfalcefcsGglcitfgDaHBdbaDamBdlaicefhialcefhlxekdnaDcpe0mbaxcefgOavaiaqaDcsGfRbbgscl49RcsGcdtfydbascz6gPEhDavaias9RcsGcdtfydbaOaPfgzascsGgOEhsaOThOdndnadcd9hmbabarcetfgHax87ebaHcdfaD87ebaHclfas87ebxekabarcdtfgHaxBdbaHclfaDBdbaHcwfasBdbkavaicdtfaxBdbavc;abfalcitfgHaDBdbaHaxBdlavaicefgicsGcdtfaDBdbavc;abfalcefcsGcitfgHasBdbaHaDBdlavaiaPfcsGgicdtfasBdbavc;abfalcdfcsGglcitfgDaxBdbaDasBdlalcefhlaiaOfhiazaOfhxxekaxcbaoRbbgHEgAaDc;:eSgDfhzaHcsGhCaHcl4hXdndnaHcs0mbazcefhOxekazhOavaiaX9RcsGcdtfydbhzkdndnaCmbaOcefhxxekaOhxavaiaH9RcsGcdtfydbhOkdndnaDTmbaocefhDxekaocdfhDao8SbegPcFeGhsdnaPcu9kmbaocofhAascFbGhscrhodninaD8SbbgPcFbGaotasVhsaPcu9kmeaDcefhDaocrfgoc8J9hmbkaAhDxekaDcefhDkasce4cbasceG9R7amfgmhAkdndnaXcsSmbaDhsxekaDcefhsaD8SbbgocFeGhPdnaocu9kmbaDcvfhzaPcFbGhPcrhodninas8SbbgDcFbGaotaPVhPaDcu9kmeascefhsaocrfgoc8J9hmbkazhsxekascefhskaPce4cbaPceG9R7amfgmhzkdndnaCcsSmbashoxekascefhoas8SbbgDcFeGhPdnaDcu9kmbascvfhOaPcFbGhPcrhDdninao8SbbgscFbGaDtaPVhPascu9kmeaocefhoaDcrfgDc8J9hmbkaOhoxekaocefhokaPce4cbaPceG9R7amfgmhOkdndnadcd9hmbabarcetfgDaA87ebaDcdfaz87ebaDclfaO87ebxekabarcdtfgDaABdbaDclfazBdbaDcwfaOBdbkavc;abfalcitfgDazBdbaDaABdlavaicdtfaABdbavc;abfalcefcsGcitfgDaOBdbaDazBdlavaicefgicsGcdtfazBdbavc;abfalcdfcsGcitfgDaABdbaDaOBdlavaiaHcz6aXcsSVfgicsGcdtfaOBdbaiaCTaCcsSVfhialcifhlkawcefhwalcsGhlaicsGhiarcifgrae6mbkkcbc99aoaqSEhokavc;aef8Kjjjjbaok:flevu8Jjjjjbcz9Rhvc9:hodnaecvfal0mbcuhoaiRbbc;:eGc;qe9hmbav9cb83iwaicefhraialfc98fhwdnaeTmbdnadcdSmbcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcdtfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfglBdbaoalBdbaDcefgDae9hmbxdkkcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcetfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfgl87ebaoalBdbaDcefgDae9hmbkkcbc99arawSEhokaok:Lvoeue99dud99eud99dndnadcl9hmbaeTmeindndnabcdfgd8Sbb:Yab8Sbbgi:Ygl:l:tabcefgv8Sbbgo:Ygr:l:tgwJbb;:9cawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai86bbdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad86bbdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad86bbabclfhbaecufgembxdkkaeTmbindndnabclfgd8Ueb:Yab8Uebgi:Ygl:l:tabcdfgv8Uebgo:Ygr:l:tgwJb;:FSawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai87ebdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad87ebdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad87ebabcwfhbaecufgembkkk;siliui99iue99dnaeTmbcbhiabhlindndnJ;Zl81Zalcof8UebgvciV:Y:vgoal8Ueb:YNgrJb;:FSNJbbbZJbbb:;arJbbbb9GEMgw:lJbbb9p9DTmbaw:OhDxekcjjjj94hDkalclf8Uebhqalcdf8UebhkabaiavcefciGfcetfaD87ebdndnaoak:YNgwJb;:FSNJbbbZJbbb:;awJbbbb9GEMgx:lJbbb9p9DTmbax:Ohkxekcjjjj94hkkabaiavcdfciGfcetfak87ebdndnaoaq:YNgoJb;:FSNJbbbZJbbb:;aoJbbbb9GEMgx:lJbbb9p9DTmbax:Ohqxekcjjjj94hqkabaiavcufciGfcetfaq87ebdndnJbbjZararN:tawawN:taoaoN:tgrJbbbbarJbbbb9GE:rJb;:FSNJbbbZMgr:lJbbb9p9DTmbar:Ohqxekcjjjj94hqkabaiavciGfcetfaq87ebalcwfhlaiclfhiaecufgembkkk9mbdnadcd4ae2gdTmbinababydbgecwtcw91:Yaece91cjjj98Gcjjj;8if::NUdbabclfhbadcufgdmbkkk9teiucbcbydj1jjbgeabcifc98GfgbBdj1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;LeeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiclfaeclfydbBdbaicwfaecwfydbBdbaicxfaecxfydbBdbaeczfheaiczfhiadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk;aeedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdbaicxfalBdbaicwfalBdbaiclfalBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabkkkebcjwklz9Kbb\";\n\tvar wasm_simd = \"b9H79TebbbeKl9Gbb9Gvuuuuueu9Giuuub9Geueuikqbbebeedddilve9Weeeviebeoweuec:q;Aekr;leDo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbdY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVblE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtboK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbrL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949Wbwl79IV9RbDq;b9tqlbzik9:evu8Jjjjjbcz9Rhbcbheincbhdcbhiinabcwfadfaicjuaead4ceGglE86bbaialfhiadcefgdcw9hmbkaec:q:yjjbfai86bbaecitc:q1jjbfab8Piw83ibaecefgecjd9hmbkk;e8JlHud97euo978Jjjjjbcj;kb9Rgv8Kjjjjbc9:hodnadcefal0mbcuhoaiRbbc:Ge9hmbavaialfgrad9Rad;8qbbcj;abad9UhoaicefhldnadTmbaoc;WFbGgocjdaocjd6EhwcbhDinaDae9pmeawaeaD9RaDawfae6Egqcsfgoc9WGgkci2hxakcethmaocl4cifcd4hPabaDad2fhscbhzdnincbhHalhOcbhAdninaraO9RaP6miavcj;cbfaAak2fhCaOaPfhlcbhidnakc;ab6mbaral9Rc;Gb6mbcbhoinaCaofhidndndndndnaOaoco4fRbbgXciGPlbedibkaipxbbbbbbbbbbbbbbbbpklbxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklbalczfhlkdndndndndnaXcd4ciGPlbedibkaipxbbbbbbbbbbbbbbbbpklzxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklzalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklzalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklzalczfhlkdndndndndnaXcl4ciGPlbedibkaipxbbbbbbbbbbbbbbbbpklaxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklaalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklaalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklaalczfhlkdndndndndnaXco4Plbedibkaipxbbbbbbbbbbbbbbbbpkl8WxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibaXc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkl8WalclfaYpQbfaXc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibaXc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkl8WalcwfaYpQbfaXc:q:yjjbfRbbfhlxekaialpbbbpkl8Walczfhlkaoc;abfhiaocjefak0meaihoaral9Rc;Fb0mbkkdndnaiak9pmbaici4hoinaral9RcK6mdaCaifhXdndndndndnaOaico4fRbbaocoG4ciGPlbedibkaXpxbbbbbbbbbbbbbbbbpklbxikaXalpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaXalpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaXalpbbbpklbalczfhlkaocdfhoaiczfgiak6mbkkalTmbaAcd0hHalhOaAcefgAclSmdxekkcbhlaHceGTmdkdnakTmbavcjdfazfhiavazfpbdbhYcbhXinaiavcj;cbfaXfgopblbgLcep9TaLpxeeeeeeeeeeeeeeeegQp9op9Hp9rgLaoakfpblbg8Acep9Ta8AaQp9op9Hp9rg8ApmbzeHdOiAlCvXoQrLgEaoamfpblbg3cep9Ta3aQp9op9Hp9rg3aoaxfpblbg5cep9Ta5aQp9op9Hp9rg5pmbzeHdOiAlCvXoQrLg8EpmbezHdiOAlvCXorQLgQaQpmbedibedibedibediaYp9UgYp9AdbbaiadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaEa8EpmwDKYqk8AExm35Ps8E8FgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaLa8ApmwKDYq8AkEx3m5P8Es8FgLa3a5pmwKDYq8AkEx3m5P8Es8Fg8ApmbezHdiOAlvCXorQLgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaLa8ApmwDKYqk8AExm35Ps8E8FgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfhiaXczfgXak6mbkkazclfgzad6mbkasavcjdfaqad2;8qbbavavcjdfaqcufad2fad;8qbbaqaDfhDc9:hoalmexikkc9:hoxekcbc99aral9Radcaadca0ESEhokavcj;kbf8Kjjjjbaokwbz:bjjjbk;tzeHu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnaeci9UgrcHfal0mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgDce0mbavc;abfcFecje;8kbavcUf9cu83ibavc8Wf9cu83ibavcyf9cu83ibavcaf9cu83ibavcKf9cu83ibavczf9cu83ibav9cu83iwav9cu83ibaialfc9WfhqaicefgwarfhodnaeTmbcmcsaDceSEhkcbhxcbhmcbhrcbhicbhlindnaoaq9nmbc9:hoxikdndnawRbbgDc;Ve0mbavc;abfalaDcu7gPcl4fcsGcitfgsydlhzasydbhHdnaDcsGgDak9pmbavaiaPfcsGcdtfydbaxaDEhsaDThDdndnadcd9hmbabarcetfgPaH87ebaPcdfaz87ebaPclfas87ebxekabarcdtfgPaHBdbaPclfazBdbaPcwfasBdbkaxaDfhxavc;abfalcitfgPasBdbaPazBdlavaicdtfasBdbavc;abfalcefcsGglcitfgPaHBdbaPasBdlaiaDfhialcefhlxdkdndnaDcsSmbamaDfaDc987fcefhmxekaocefhDao8SbbgscFeGhPdndnascu9mmbaDhoxekaocvfhoaPcFbGhPcrhsdninaD8SbbgOcFbGastaPVhPaOcu9kmeaDcefhDascrfgsc8J9hmbxdkkaDcefhokaPce4cbaPceG9R7amfhmkdndnadcd9hmbabarcetfgDaH87ebaDcdfaz87ebaDclfam87ebxekabarcdtfgDaHBdbaDclfazBdbaDcwfamBdbkavc;abfalcitfgDamBdbaDazBdlavaicdtfamBdbavc;abfalcefcsGglcitfgDaHBdbaDamBdlaicefhialcefhlxekdnaDcpe0mbaxcefgOavaiaqaDcsGfRbbgscl49RcsGcdtfydbascz6gPEhDavaias9RcsGcdtfydbaOaPfgzascsGgOEhsaOThOdndnadcd9hmbabarcetfgHax87ebaHcdfaD87ebaHclfas87ebxekabarcdtfgHaxBdbaHclfaDBdbaHcwfasBdbkavaicdtfaxBdbavc;abfalcitfgHaDBdbaHaxBdlavaicefgicsGcdtfaDBdbavc;abfalcefcsGcitfgHasBdbaHaDBdlavaiaPfcsGgicdtfasBdbavc;abfalcdfcsGglcitfgDaxBdbaDasBdlalcefhlaiaOfhiazaOfhxxekaxcbaoRbbgHEgAaDc;:eSgDfhzaHcsGhCaHcl4hXdndnaHcs0mbazcefhOxekazhOavaiaX9RcsGcdtfydbhzkdndnaCmbaOcefhxxekaOhxavaiaH9RcsGcdtfydbhOkdndnaDTmbaocefhDxekaocdfhDao8SbegPcFeGhsdnaPcu9kmbaocofhAascFbGhscrhodninaD8SbbgPcFbGaotasVhsaPcu9kmeaDcefhDaocrfgoc8J9hmbkaAhDxekaDcefhDkasce4cbasceG9R7amfgmhAkdndnaXcsSmbaDhsxekaDcefhsaD8SbbgocFeGhPdnaocu9kmbaDcvfhzaPcFbGhPcrhodninas8SbbgDcFbGaotaPVhPaDcu9kmeascefhsaocrfgoc8J9hmbkazhsxekascefhskaPce4cbaPceG9R7amfgmhzkdndnaCcsSmbashoxekascefhoas8SbbgDcFeGhPdnaDcu9kmbascvfhOaPcFbGhPcrhDdninao8SbbgscFbGaDtaPVhPascu9kmeaocefhoaDcrfgDc8J9hmbkaOhoxekaocefhokaPce4cbaPceG9R7amfgmhOkdndnadcd9hmbabarcetfgDaA87ebaDcdfaz87ebaDclfaO87ebxekabarcdtfgDaABdbaDclfazBdbaDcwfaOBdbkavc;abfalcitfgDazBdbaDaABdlavaicdtfaABdbavc;abfalcefcsGcitfgDaOBdbaDazBdlavaicefgicsGcdtfazBdbavc;abfalcdfcsGcitfgDaABdbaDaOBdlavaiaHcz6aXcsSVfgicsGcdtfaOBdbaiaCTaCcsSVfhialcifhlkawcefhwalcsGhlaicsGhiarcifgrae6mbkkcbc99aoaqSEhokavc;aef8Kjjjjbaok:flevu8Jjjjjbcz9Rhvc9:hodnaecvfal0mbcuhoaiRbbc;:eGc;qe9hmbav9cb83iwaicefhraialfc98fhwdnaeTmbdnadcdSmbcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcdtfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfglBdbaoalBdbaDcefgDae9hmbxdkkcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcetfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfgl87ebaoalBdbaDcefgDae9hmbkkcbc99arawSEhokaok:wPliuo97eue978Jjjjjbca9Rhiaec98Ghldndnadcl9hmbdnalTmbcbhvabhdinadadpbbbgocKp:RecKp:Sep;6egraocwp:RecKp:Sep;6earp;Geaoczp:RecKp:Sep;6egwp;Gep;Kep;LegDpxbbbbbbbbbbbbbbbbp:2egqarpxbbbjbbbjbbbjbbbjgkp9op9rp;Kegrpxbb;:9cbb;:9cbb;:9cbb;:9cararp;MeaDaDp;Meawaqawakp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFbbbFbbbFbbbFbbbp9oaopxbbbFbbbFbbbFbbbFp9op9qarawp;Meaqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaDawp;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpkbbadczfhdavclfgval6mbkkalae9pmeaipxbbbbbbbbbbbbbbbbgqpklbaiabalcdtfgdaeciGglcdtgv;8qbbdnalTmbaiaipblbgocKp:RecKp:Sep;6egraocwp:RecKp:Sep;6earp;Geaoczp:RecKp:Sep;6egwp;Gep;Kep;LegDaqp:2egqarpxbbbjbbbjbbbjbbbjgkp9op9rp;Kegrpxbb;:9cbb;:9cbb;:9cbb;:9cararp;MeaDaDp;Meawaqawakp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFbbbFbbbFbbbFbbbp9oaopxbbbFbbbFbbbFbbbFp9op9qarawp;Meaqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaDawp;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpklbkadaiav;8qbbskdnalTmbcbhvabhdinadczfgxaxpbbbgopxbbbbbbFFbbbbbbFFgkp9oadpbbbgDaopmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eaDaopmbediwDqkzHOAKY8AEgoczp:Sep;6egrp;Geaoczp:Reczp:Sep;6egwp;Gep;Kep;Legopxb;:FSb;:FSb;:FSb;:FSawaopxbbbbbbbbbbbbbbbbp:2egqawpxbbbjbbbjbbbjbbbjgmp9op9rp;Kegwawp;Meaoaop;Mearaqaramp9op9rp;Kegoaop;Mep;Kep;Kep;Jep;Negrp;Mepxbbn0bbn0bbn0bbn0gqp;Keczp:Reawarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9op9qgwaoarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9ogopmwDKYqk8AExm35Ps8E8Fp9qpkbbadaDakp9oawaopmbezHdiOAlvCXorQLp9qpkbbadcafhdavclfgval6mbkkalae9pmbaiaeciGgvcitgdfcbcaad9R;8kbaiabalcitfglad;8qbbdnavTmbaiaipblzgopxbbbbbbFFbbbbbbFFgkp9oaipblbgDaopmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eaDaopmbediwDqkzHOAKY8AEgoczp:Sep;6egrp;Geaoczp:Reczp:Sep;6egwp;Gep;Kep;Legopxb;:FSb;:FSb;:FSb;:FSawaopxbbbbbbbbbbbbbbbbp:2egqawpxbbbjbbbjbbbjbbbjgmp9op9rp;Kegwawp;Meaoaop;Mearaqaramp9op9rp;Kegoaop;Mep;Kep;Kep;Jep;Negrp;Mepxbbn0bbn0bbn0bbn0gqp;Keczp:Reawarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9op9qgwaoarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9ogopmwDKYqk8AExm35Ps8E8Fp9qpklzaiaDakp9oawaopmbezHdiOAlvCXorQLp9qpklbkalaiad;8qbbkk;4wllue97euv978Jjjjjbc8W9Rhidnaec98GglTmbcbhvabhoinaiaopbbbgraoczfgwpbbbgDpmlvorxmPsCXQL358E8Fgqczp:Segkclp:RepklbaopxbbjZbbjZbbjZbbjZpx;Zl81Z;Zl81Z;Zl81Z;Zl81Zakpxibbbibbbibbbibbbp9qp;6ep;NegkaraDpmbediwDqkzHOAKY8AEgrczp:Reczp:Sep;6ep;MegDaDp;Meakarczp:Sep;6ep;Megxaxp;Meakaqczp:Reczp:Sep;6ep;Megqaqp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jepxb;:FSb;:FSb;:FSb;:FSgkp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbgmp9oaxakp;Mearp;Keczp:Rep9qgxaqakp;Mearp;Keczp:ReaDakp;Mearp;Keamp9op9qgkpmbezHdiOAlvCXorQLgrp5baipblbpEb:T:j83ibaocwfarp5eaipblbpEe:T:j83ibawaxakpmwDKYqk8AExm35Ps8E8Fgkp5baipblbpEd:T:j83ibaocKfakp5eaipblbpEi:T:j83ibaocafhoavclfgval6mbkkdnalae9pmbaiaeciGgvcitgofcbcaao9R;8kbaiabalcitfgwao;8qbbdnavTmbaiaipblbgraipblzgDpmlvorxmPsCXQL358E8Fgqczp:Segkclp:RepklaaipxbbjZbbjZbbjZbbjZpx;Zl81Z;Zl81Z;Zl81Z;Zl81Zakpxibbbibbbibbbibbbp9qp;6ep;NegkaraDpmbediwDqkzHOAKY8AEgrczp:Reczp:Sep;6ep;MegDaDp;Meakarczp:Sep;6ep;Megxaxp;Meakaqczp:Reczp:Sep;6ep;Megqaqp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jepxb;:FSb;:FSb;:FSb;:FSgkp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbgmp9oaxakp;Mearp;Keczp:Rep9qgxaqakp;Mearp;Keczp:ReaDakp;Mearp;Keamp9op9qgkpmbezHdiOAlvCXorQLgrp5baipblapEb:T:j83ibaiarp5eaipblapEe:T:j83iwaiaxakpmwDKYqk8AExm35Ps8E8Fgkp5baipblapEd:T:j83izaiakp5eaipblapEi:T:j83iKkawaiao;8qbbkk:Pddiue978Jjjjjbc;ab9Rhidnadcd4ae2glc98GgvTmbcbheabhdinadadpbbbgocwp:Recwp:Sep;6eaocep:SepxbbjFbbjFbbjFbbjFp9opxbbjZbbjZbbjZbbjZp:Uep;Mepkbbadczfhdaeclfgeav6mbkkdnaval9pmbaialciGgecdtgdVcbc;abad9R;8kbaiabavcdtfgvad;8qbbdnaeTmbaiaipblbgocwp:Recwp:Sep;6eaocep:SepxbbjFbbjFbbjFbbjFp9opxbbjZbbjZbbjZbbjZp:Uep;Mepklbkavaiad;8qbbkk9teiucbcbydj1jjbgeabcifc98GfgbBdj1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaikkkebcjwklz9Tbb\";\n\n\tvar detector = new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,3,2,0,0,5,3,1,0,1,12,1,0,10,22,2,12,0,65,0,65,0,65,0,252,10,0,0,11,7,0,65,0,253,15,26,11]);\n\tvar wasmpack = new Uint8Array([32,0,65,2,1,106,34,33,3,128,11,4,13,64,6,253,10,7,15,116,127,5,8,12,40,16,19,54,20,9,27,255,113,17,42,67,24,23,146,148,18,14,22,45,70,69,56,114,101,21,25,63,75,136,108,28,118,29,73,115]);\n\n\tif (typeof WebAssembly !== 'object') {\n\t\treturn {\n\t\t\tsupported: false,\n\t\t};\n\t}\n\n\tvar wasm = WebAssembly.validate(detector) ? wasm_simd : wasm_base;\n\n\tvar instance;\n\n\tvar ready =\n\t\tWebAssembly.instantiate(unpack(wasm), {})\n\t\t.then(function(result) {\n\t\t\tinstance = result.instance;\n\t\t\tinstance.exports.__wasm_call_ctors();\n\t\t});\n\n\tfunction unpack(data) {\n\t\tvar result = new Uint8Array(data.length);\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tvar ch = data.charCodeAt(i);\n\t\t\tresult[i] = ch > 96 ? ch - 97 : ch > 64 ? ch - 39 : ch + 4;\n\t\t}\n\t\tvar write = 0;\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tresult[write++] = (result[i] < 60) ? wasmpack[result[i]] : (result[i] - 60) * 64 + result[++i];\n\t\t}\n\t\treturn result.buffer.slice(0, write);\n\t}\n\n\tfunction decode(instance, fun, target, count, size, source, filter) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar count4 = (count + 3) & ~3;\n\t\tvar tp = sbrk(count4 * size);\n\t\tvar sp = sbrk(source.length);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(source, sp);\n\t\tvar res = fun(tp, count, size, sp, source.length);\n\t\tif (res == 0 && filter) {\n\t\t\tfilter(tp, count4, size);\n\t\t}\n\t\ttarget.set(heap.subarray(tp, tp + count * size));\n\t\tsbrk(tp - sbrk(0));\n\t\tif (res != 0) {\n\t\t\tthrow new Error(\"Malformed buffer data: \" + res);\n\t\t}\n\t}\n\n\tvar filters = {\n\t\tNONE: \"\",\n\t\tOCTAHEDRAL: \"meshopt_decodeFilterOct\",\n\t\tQUATERNION: \"meshopt_decodeFilterQuat\",\n\t\tEXPONENTIAL: \"meshopt_decodeFilterExp\",\n\t};\n\n\tvar decoders = {\n\t\tATTRIBUTES: \"meshopt_decodeVertexBuffer\",\n\t\tTRIANGLES: \"meshopt_decodeIndexBuffer\",\n\t\tINDICES: \"meshopt_decodeIndexSequence\",\n\t};\n\n\tvar workers = [];\n\tvar requestId = 0;\n\n\tfunction createWorker(url) {\n\t\tvar worker = {\n\t\t\tobject: new Worker(url),\n\t\t\tpending: 0,\n\t\t\trequests: {}\n\t\t};\n\n\t\tworker.object.onmessage = function(event) {\n\t\t\tvar data = event.data;\n\n\t\t\tworker.pending -= data.count;\n\t\t\tworker.requests[data.id][data.action](data.value);\n\t\t\tdelete worker.requests[data.id];\n\t\t};\n\n\t\treturn worker;\n\t}\n\n\tfunction initWorkers(count) {\n\t\tvar source =\n\t\t\t\"self.ready = WebAssembly.instantiate(new Uint8Array([\" + new Uint8Array(unpack(wasm)) + \"]), {})\" +\n\t\t\t\".then(function(result) { result.instance.exports.__wasm_call_ctors(); return result.instance; });\" +\n\t\t\t\"self.onmessage = \" + workerProcess.name + \";\" + decode.toString() + workerProcess.toString();\n\n\t\tvar blob = new Blob([source], {type: 'text/javascript'});\n\t\tvar url = URL.createObjectURL(blob);\n\n\t\tfor (var i = workers.length; i < count; ++i) {\n\t\t\tworkers[i] = createWorker(url);\n\t\t}\n\n\t\tfor (var i = count; i < workers.length; ++i) {\n\t\t\tworkers[i].object.postMessage({});\n\t\t}\n\n\t\tworkers.length = count;\n\n\t\tURL.revokeObjectURL(url);\n\t}\n\n\tfunction decodeWorker(count, size, source, mode, filter) {\n\t\tvar worker = workers[0];\n\n\t\tfor (var i = 1; i < workers.length; ++i) {\n\t\t\tif (workers[i].pending < worker.pending) {\n\t\t\t\tworker = workers[i];\n\t\t\t}\n\t\t}\n\n\t\treturn new Promise(function (resolve, reject) {\n\t\t\tvar data = new Uint8Array(source);\n\t\t\tvar id = ++requestId;\n\n\t\t\tworker.pending += count;\n\t\t\tworker.requests[id] = { resolve: resolve, reject: reject };\n\t\t\tworker.object.postMessage({ id: id, count: count, size: size, source: data, mode: mode, filter: filter }, [ data.buffer ]);\n\t\t});\n\t}\n\n\tfunction workerProcess(event) {\n\t\tvar data = event.data;\n\t\tif (!data.id) {\n\t\t\treturn self.close();\n\t\t}\n\t\tself.ready.then(function(instance) {\n\t\t\ttry {\n\t\t\t\tvar target = new Uint8Array(data.count * data.size);\n\t\t\t\tdecode(instance, instance.exports[data.mode], target, data.count, data.size, data.source, instance.exports[data.filter]);\n\t\t\t\tself.postMessage({ id: data.id, count: data.count, action: \"resolve\", value: target }, [ target.buffer ]);\n\t\t\t} catch (error) {\n\t\t\t\tself.postMessage({ id: data.id, count: data.count, action: \"reject\", value: error });\n\t\t\t}\n\t\t});\n\t}\n\n\treturn {\n\t\tready: ready,\n\t\tsupported: true,\n\t\tuseWorkers: function(count) {\n\t\t\tinitWorkers(count);\n\t\t},\n\t\tdecodeVertexBuffer: function(target, count, size, source, filter) {\n\t\t\tdecode(instance, instance.exports.meshopt_decodeVertexBuffer, target, count, size, source, instance.exports[filters[filter]]);\n\t\t},\n\t\tdecodeIndexBuffer: function(target, count, size, source) {\n\t\t\tdecode(instance, instance.exports.meshopt_decodeIndexBuffer, target, count, size, source);\n\t\t},\n\t\tdecodeIndexSequence: function(target, count, size, source) {\n\t\t\tdecode(instance, instance.exports.meshopt_decodeIndexSequence, target, count, size, source);\n\t\t},\n\t\tdecodeGltfBuffer: function(target, count, size, source, mode, filter) {\n\t\t\tdecode(instance, instance.exports[decoders[mode]], target, count, size, source, instance.exports[filters[filter]]);\n\t\t},\n\t\tdecodeGltfBufferAsync: function(count, size, source, mode, filter) {\n\t\t\tif (workers.length > 0) {\n\t\t\t\treturn decodeWorker(count, size, source, decoders[mode], filters[filter]);\n\t\t\t}\n\n\t\t\treturn ready.then(function() {\n\t\t\t\tvar target = new Uint8Array(count * size);\n\t\t\t\tdecode(instance, instance.exports[decoders[mode]], target, count, size, source, instance.exports[filters[filter]]);\n\t\t\t\treturn target;\n\t\t\t});\n\t\t}\n\t};\n})();\n\nexport { MeshoptDecoder };\n","// This file is part of meshoptimizer library and is distributed under the terms of MIT License.\n// Copyright (C) 2016-2023, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)\nvar MeshoptSimplifier = (function() {\n\t// Built with clang version 16.0.0\n\t// Built from meshoptimizer 0.20\n\tvar wasm = \"b9H79Tebbbe9Ek9Geueu9Geub9Gbb9GPuuuuuuuuuuu99uueu9Gvuuuuub9Gluuuub9Gquuuuuuu99uueu9Gwuuuuuu99ueu9Giuuue999Gluuuueu9GiuuueuizsdilvoirwDbqqbeqlve9Weiiviebeoweuec:G;jekr:Tewo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bbz9TW79O9V9Wt9F79P9T9W29P9M95bl8E9TW79O9V9Wt9F79P9T9W29P9M959x9Pt9OcttV9P9I91tW7bvQ9TW79O9V9Wt9F79P9T9W29P9M959q9V9P9Ut7boX9TW79O9V9Wt9F79P9T9W29P9M959t9J9H2Wbra9TW79O9V9Wt9F9V9Wt9P9T9P96W9wWVtW94SWt9J9O9sW9T9H9Wbwl79IV9RbDDwebcekdxmq::9Usdbk;i6iKuY99Ou8Jjjjjbc;W;ab9RgP8KjjjjbaPcwfcbc;Kbz:ljjjb8AaPcualcefgscdtascFFFFi0Ecbyd1:jjjbHjjjjbbgzBdwaPceBd9OaPazBdbaPcuadcitadcFFFFe0Ecbyd1:jjjbHjjjjbbgHBdxaPcdBd9OaPaHBdlaPaeadalcbz:cjjjbaPcualcdtgOalcFFFFi0EgAcbyd1:jjjbHjjjjbbgCBdzaPciBd9OaPaAcbyd1:jjjbHjjjjbbgXBdCaPclBd9Oalcd4alfhQcehLinaLgscethLasaQ6mbkcbhKaPcuascdtgLascFFFFi0Ecbyd1:jjjbHjjjjbbgQBdKaPcvBd9OaQcFeaLz:ljjjbhYdnalTmbavcd4h8AascufhEinaiaKa8A2cdtfg3ydlgscH4as7c:F:b:DD2a3ydbgscH4as7c;D;O:B8J27a3ydwgscH4as7c:3F;N8N27hQcbhsdndninaYaQaEGgQcdtfg5ydbgLcuSmeaiaLa8A2cdtfa3cxz:ojjjbTmdascefgsaQfhQasaE9nmbxdkka5aKBdbaKhLkaCaKcdtfaLBdbaKcefgKal9hmbkcbhsaXhLinaLasBdbaLclfhLalascefgs9hmbkcbhsaChLaXhQindnasaLydbgESmbaQaXaEcdtfgEydbBdbaEasBdbkaLclfhLaQclfhQalascefgs9hmbkkcbh8EaYcbyd:m:jjjbH:bjjjbbaPclBd9OaPalcbyd1:jjjbHjjjjbbgEBdKaPcvBd9OaPaAcbyd1:jjjbHjjjjbbgsBd3aPcoBd9OaPaAcbyd1:jjjbHjjjjbbgLBdaaPcrBd9OascFeaOz:ljjjbh8FaLcFeaOz:ljjjbhadnalTmbaHcwfhhindnaza8EgQcefg8Ecdtfydbg3azaQcdtgsfydbgLSmba3aL9RhOaHaLcitfhgaaasfh8Ja8FasfhKcbh8Aindndnaga8Acitfydbg5aQ9hmbaKaQBdba8JaQBdbxekdnaza5cdtg8KfgsclfydbgLasydbgsSmbaHascitg3fydbaQSmeaLas9Rh8Lascu7aLfhYaha3fhLcbhsinaYasSmeascefhsaLydbh3aLcwfhLa3aQ9hmbkasa8L6mekaaa8KfgsaQa5asydbcuSEBdbaKa5aQaKydbcuSEBdbka8Acefg8AaO9hmbkka8Eal9hmbkaChLaXhQaah3a8Fh8AcbhsindndnasaLydbg59hmbdnasaQydbg59hmba8Aydbh5dna3ydbgYcu9hmba5cu9hmbaEasfcb86bbxikaEasfhKdnasaYSmbasa5SmbaKce86bbxikaKcl86bbxdkdnasaXa5cdtgYfydb9hmbdna3ydbgKcuSmbasaKSmba8AydbgOcuSmbasaOSmbaaaYfydbggcuSmbaga5Smba8FaYfydbgYcuSmbaYa5SmbdnaCaKcdtfydbaCaYcdtfydb9hmbaCaOcdtfydbaCagcdtfydb9hmbaEasfcd86bbxlkaEasfcl86bbxikaEasfcl86bbxdkaEasfcl86bbxekaEasfaEa5fRbb86bbkaLclfhLaQclfhQa3clfh3a8Aclfh8Aalascefgs9hmbkaxceGTmbaEhsalhLindnasRbbce9hmbascl86bbkascefhsaLcufgLmbkkcualcx2alc;v:Q;v:Qe0Ecbyd1:jjjbHjjjjbbh8JaPcwfaPyd9Ogscdtfa8JBdbaPascefgOBd9Oa8Jaialavz:djjjbdndnaDmbcbhvxekcbh5aPcwfaOcdtfcuaDal2gLcdtaLcFFFFi0Ecbyd1:jjjbHjjjjbbgvBdbaPascdfgOBd9OalTmbarcd4cdthYaDcdthKavh8AinaohsawhLa8AhQaDh3inaQasIdbaLIdbNUdbasclfhsaLclfhLaQclfhQa3cufg3mbkaoaYfhoa8AaKfh8Aa5cefg5al9hmbkkaPcwfaOcdtfcualc8S2gsalc;D;O;f8U0EgQcbyd1:jjjbHjjjjbbgLBdbaPaOcefg3Bd9OaLcbasz:ljjjbh8EdndndnaDTmbaPcwfa3cdtfaQcbyd1:jjjbHjjjjbbgoBdbaPaOcdfgLBd9Oaocbasz:ljjjb8AaPcwfaLcdtfcuaDal2gscltgLascFFFFb0Ecbyd1:jjjbHjjjjbbgwBdbaPaOcifBd9OawcbaLz:ljjjb8AadmexdkcbhocbhwadTmekcbh8AaehLindna8JaLclfydbg5cx2fgsIdba8JaLydbgYcx2fgQIdbg8M:tg8Na8JaLcwfydbgKcx2fg3IdlaQIdlgy:tg8PNa3Idba8M:tgIasIdlay:tg8RN:tg8Sa8SNa8Ra3IdwaQIdwgR:tg8UNa8PasIdwaR:tg8RN:tg8Pa8PNa8RaINa8Ua8NN:tg8Na8NNMM:rgIJbbbb9ETmba8SaI:vh8Sa8NaI:vh8Na8PaI:vh8Pka8EaCaYcdtfydbc8S2fgsa8PaI:rgIa8PNNg8RasIdbMUdbasa8NaIa8NNg8VNg8UasIdlMUdlasa8SaIa8SNg8WNg8XasIdwMUdwasa8Va8PNg8VasIdxMUdxasa8Wa8PNg8YasIdzMUdzasa8Wa8NNg8WasIdCMUdCasa8PaIa8SaRNa8Pa8MNaya8NNMM:mgyNg8MNg8PasIdKMUdKasa8Na8MNg8NasId3MUd3asa8Sa8MNg8SasIdaMUdaasa8MayNg8MasId8KMUd8KasaIasIdyMUdya8EaCa5cdtfydbc8S2fgsa8RasIdbMUdbasa8UasIdlMUdlasa8XasIdwMUdwasa8VasIdxMUdxasa8YasIdzMUdzasa8WasIdCMUdCasa8PasIdKMUdKasa8NasId3MUd3asa8SasIdaMUdaasa8MasId8KMUd8KasaIasIdyMUdya8EaCaKcdtfydbc8S2fgsa8RasIdbMUdbasa8UasIdlMUdlasa8XasIdwMUdwasa8VasIdxMUdxasa8YasIdzMUdzasa8WasIdCMUdCasa8PasIdKMUdKasa8NasId3MUd3asa8SasIdaMUdaasa8MasId8KMUd8KasaIasIdyMUdyaLcxfhLa8Acifg8Aad6mbkcbh5aehYincbhLinaEaeaLc:G1jjbfydba5fcdtfydbgQfRbbhsdndnaEaYaLfydbg3fRbbg8Ac99fcFeGcpe0mbasceSmbascd9hmekdna8AcufcFeGce0mba8Fa3cdtfydbaQ9hmekdnascufcFeGce0mbaaaQcdtfydba39hmekdna8Acv2asfc:W1jjbfRbbTmbaCaQcdtfydbaCa3cdtfydb0mekJbbacJbbjZasceSEhIa8AceShOa8JaeaLc:K1jjbfydba5fcdtfydbcx2fhsdna8JaQcx2fg8AIdwa8Ja3cx2fgKIdwgy:tg8Pa8PNa8AIdbaKIdbgR:tg8Na8NNa8AIdlaKIdlg8R:tg8Sa8SNMM:rg8MJbbbb9ETmba8Pa8M:vh8Pa8Sa8M:vh8Sa8Na8M:vh8NkJbbacaIaOEh8WdnasIdway:tgIa8PaIa8PNasIdbaR:tg8Xa8NNa8SasIdla8R:tg8VNMMg8UN:tgIaINa8Xa8Na8UN:tg8Pa8PNa8Va8Sa8UN:tg8Na8NNMM:rg8SJbbbb9ETmbaIa8S:vhIa8Na8S:vh8Na8Pa8S:vh8Pka8EaCa3cdtfydbc8S2fgsa8Pa8Wa8MNg8Sa8PNNg8UasIdbMUdbasa8Na8Sa8NNg8WNg8XasIdlMUdlasaIa8SaINg8MNg8VasIdwMUdwasa8Wa8PNg8WasIdxMUdxasa8Ma8PNg8YasIdzMUdzasa8Ma8NNg8ZasIdCMUdCasa8Pa8SaIayNa8PaRNa8Ra8NNMM:mgyNg8MNg8PasIdKMUdKasa8Na8MNg8NasId3MUd3asaIa8MNgIasIdaMUdaasa8MayNg8MasId8KMUd8Kasa8SasIdyMUdya8EaCaQcdtfydbc8S2fgsa8UasIdbMUdbasa8XasIdlMUdlasa8VasIdwMUdwasa8WasIdxMUdxasa8YasIdzMUdzasa8ZasIdCMUdCasa8PasIdKMUdKasa8NasId3MUd3asaIasIdaMUdaasa8MasId8KMUd8Kasa8SasIdyMUdykaLclfgLcx9hmbkaYcxfhYa5cifg5ad6mbkaDTmbcbhYinJbbbbhRa8JaeaYcdtfgsclfydbgKcx2fgLIdwa8JasydbgOcx2fgQIdwg8V:tg8Na8NNaLIdbaQIdbg8Y:tgIaINaLIdlaQIdlg8Z:tg8Sa8SNMMg8Wa8Jascwfydbggcx2fgsIdwa8V:tg8MNa8Na8Na8MNaIasIdba8Y:tgyNa8SasIdla8Z:tg8RNMMg8PN:tJbbbbJbbjZa8Wa8Ma8MNayayNa8Ra8RNMMg8XNa8Pa8PN:tg8U:va8UJbbbb9BEg8UNh80a8Xa8NNa8Ma8PN:ta8UNh81a8Wa8RNa8Sa8PN:ta8UNhBa8Xa8SNa8Ra8PN:ta8UNh83a8WayNaIa8PN:ta8UNhUa8XaINaya8PN:ta8UNh85aIa8RNaya8SN:tg8Pa8PNa8Sa8MNa8Ra8NN:tg8Pa8PNa8NayNa8MaIN:tg8Pa8PNMM:r:rh8PavaOaD2cdtfhLavagaD2cdtfhQavaKaD2cdtfh3a8V:mh86a8Z:mh87a8Y:mh88cbh8AaDh5Jbbbbh8RJbbbbh8UJbbbbh8WJbbbbh8XJbbbbh8VJbbbbh8YJbbbbh8ZJbbbbh89Jbbbbh8:inaPc;Wbfa8Afgscwfa8Pa81a3IdbaLIdbg8M:tg8SNa80aQIdba8M:tgyNMg8NNUdbasclfa8Pa83a8SNaBayNMgINUdbasa8Pa85a8SNaUayNMg8SNUdbascxfa8Pa86a8NNa87aINa8Ma88a8SNMMMg8MNUdba8Pa8NaINNa8XMh8Xa8Pa8Na8SNNa8VMh8Va8PaIa8SNNa8YMh8Ya8Pa8Ma8MNNaRMhRa8Pa8Na8MNNa8RMh8Ra8PaIa8MNNa8UMh8Ua8Pa8Sa8MNNa8WMh8Wa8Pa8Na8NNNa8ZMh8Za8PaIaINNa89Mh89a8Pa8Sa8SNNa8:Mh8:aLclfhLa3clfh3aQclfhQa8Aczfh8Aa5cufg5mbkaoaCaOcdtfydbgLc8S2fgsa8:asIdbMUdbasa89asIdlMUdlasa8ZasIdwMUdwasa8YasIdxMUdxasa8VasIdzMUdzasa8XasIdCMUdCasa8WasIdKMUdKasa8UasId3MUd3asa8RasIdaMUdaasaRasId8KMUd8Kasa8PasIdyMUdyaoaCaKcdtfydbgKc8S2fgsa8:asIdbMUdbasa89asIdlMUdlasa8ZasIdwMUdwasa8YasIdxMUdxasa8VasIdzMUdzasa8XasIdCMUdCasa8WasIdKMUdKasa8UasId3MUd3asa8RasIdaMUdaasaRasId8KMUd8Kasa8PasIdyMUdyaoaCagcdtfydbgOc8S2fgsa8:asIdbMUdbasa89asIdlMUdlasa8ZasIdwMUdwasa8YasIdxMUdxasa8VasIdzMUdzasa8XasIdCMUdCasa8WasIdKMUdKasa8UasId3MUd3asa8RasIdaMUdaasaRasId8KMUd8Kasa8PasIdyMUdyawaLaD2cltfh5cbhLaDh3ina5aLfgsaPc;WbfaLfgQIdbasIdbMUdbasclfg8AaQclfIdba8AIdbMUdbascwfg8AaQcwfIdba8AIdbMUdbascxfgsaQcxfIdbasIdbMUdbaLczfhLa3cufg3mbkawaKaD2cltfh5cbhLaDh3ina5aLfgsaPc;WbfaLfgQIdbasIdbMUdbasclfg8AaQclfIdba8AIdbMUdbascwfg8AaQcwfIdba8AIdbMUdbascxfgsaQcxfIdbasIdbMUdbaLczfhLa3cufg3mbkawaOaD2cltfh5cbhLaDh3ina5aLfgsaPc;WbfaLfgQIdbasIdbMUdbasclfg8AaQclfIdba8AIdbMUdbascwfg8AaQcwfIdba8AIdbMUdbascxfgsaQcxfIdbasIdbMUdbaLczfhLa3cufg3mbkaYcifgYad6mbkkdnabaeSmbabaeadcdtz:kjjjb8AkaPydbhZcbhsdnalTmbaZclfhsaZydbh3aEhLalh8AcbhQincbasydbg5a39RaLRbbcpeGEaQfhQaLcefhLasclfhsa5h3a8Acufg8AmbkaQce4hskcuadas9Rcifgrcx2arc;v:Q;v:Qe0Ecbyd1:jjjbHjjjjbbh8LaPcwfaPyd9Ogscdtfa8LBdbaPascefgLBd9OaPcwfaLcdtfcuarcdtarcFFFFi0Ecbyd1:jjjbHjjjjbbgxBdbaPascdfgLBd9OaPcwfaLcdtfaAcbyd1:jjjbHjjjjbbgHBdbaPascifgLBd9OaPcwfaLcdtfalcbyd1:jjjbHjjjjbbgnBdbaPasclfBd9OJbbbbh8Ydnadaq9nmbdnarci6mbakakNh8VaDclthca8Lcwfh9cJbbbbh8YinaPabadghalaCz:cjjjbabhOcbhzcbhKincbhsindnaCaOasfydbgQcdtgYfydbg8AaCabasc;m1jjbfydbaKfcdtfydbgLcdtfydbg5SmbaEaLfRbbgecv2aEaQfRbbg3fc;G1jjbfRbbg8Ka3cv2aefggc;G1jjbfRbbgiVcFeGTmbdnagc:W1jjbfRbbTmba5a8A0mekdna3ae9hmba3cufcFeGce0mba8FaYfydbaL9hmeka8Lazcx2fg3aLaQaicFeGg8AEBdla3aQaLa8AEBdba3a8Aa8KGcb9hBdwazcefhzkasclfgscx9hmbkdnaKcifgKah9pmbaOcxfhOazcifar9nmekkdnazmbahhdxikcbheinJbbbbJbbjZa8EaCa8Laecx2fg3ydlg8Aa3ydbg5a3ydwgLEgKcdtfydbg8Kc8S2gifgsIdyg8P:va8PJbbbb9BEasIdwa8Ja5a8AaLEgYcx2fgLIdwg8SNasIdzaLIdbg8MNasIdaMg8Pa8PMMa8SNasIdlaLIdlgyNasIdCa8SNasId3Mg8Pa8PMMayNasIdba8MNasIdxayNasIdKMg8Pa8PMMa8MNasId8KMMM:lNh8WJbbbbJbbjZa8EaCa5cdtfydbgdc8S2gQfgsIdyg8P:va8PJbbbb9BEasIdwa8Ja8Acx2fgLIdwgINasIdzaLIdbgRNasIdaMg8Pa8PMMaINasIdlaLIdlg8RNasIdCaINasId3Mg8Pa8PMMa8RNasIdbaRNasIdxa8RNasIdKMg8Pa8PMMaRNasId8KMMM:lNh8Xa3cwfhOa3clfhgdnaDTmbaoaQfgQIdwaINaQIdzaRNaQIdaMg8Pa8PMMaINaQIdla8RNaQIdCaINaQId3Mg8Pa8PMMa8RNaQIdbaRNaQIdxa8RNaQIdKMg8Pa8PMMaRNaQId8KMMMh8Nava8AaD2cdtfhLawadaD2cltfhsaQIdyh8UaDhQinaLIdbg8PJbbb;aNascxfIdbaIascwfIdbNaRasIdbNa8RasclfIdbNMMMNa8Pa8PNa8UNa8NMMh8NaLclfhLasczfhsaQcufgQmbkaoaifgQIdwa8SNaQIdza8MNaQIdaMg8Pa8PMMa8SNaQIdlayNaQIdCa8SNaQId3Mg8Pa8PMMayNaQIdba8MNaQIdxayNaQIdKMg8Pa8PMMa8MNaQId8KMMMhIavaYaD2cdtfhLawa8KaD2cltfhsaQIdyhRaDhQinaLIdbg8PJbbb;aNascxfIdba8SascwfIdbNa8MasIdbNayasclfIdbNMMMNa8Pa8PNaRNaIMMhIaLclfhLasczfhsaQcufgQmbka8WaI:lMh8Wa8Xa8N:lMh8Xkaga8AaYa8Xa8W9FgsEBdba3a5aKasEBdbaOa8Xa8WasEUdbaecefgeaz9hmbkaPc;Wbfcbcj;abz:ljjjb8Aa9chsazhLinaPc;WbfasydbcO4c;8ZGfgQaQydbcefBdbascxfhsaLcufgLmbkcbhscbhLinaPc;WbfasfgQydbh3aQaLBdba3aLfhLasclfgscj;ab9hmbkcbhsa9chLinaPc;WbfaLydbcO4c;8ZGfgQaQydbgQcefBdbaxaQcdtfasBdbaLcxfhLazascefgs9hmbkahaq9RgQci9UhJdnalTmbcbhsaHhLinaLasBdbaLclfhLalascefgs9hmbkkcbh9eancbalz:ljjjbhTaQcO9UhSaJce4h9haPydlh9icbhicbhgdnina8Laxagcdtfydbcx2fgOIdwg8Na8V9EmeaiaJ9pmeJFFuuh8Pdna9haz9pmba8Laxa9hcdtfydbcx2fIdwJbb;aZNh8Pkdna8Na8P9ETmbaiaS0mdkdnaTaCaOydlg6cdtg9kfydbg3fg0RbbaTaCaOydbgKcdtg9mfydbg9nfg9oRbbVmbdnaZa9ncdtfgsclfydbgLasydbgsSmbaLas9Rh5a9iascitfhsa8Ja3cx2fgYcwfhdaYclfhAa8Ja9ncx2fg8Kcwfh9pa8Kclfh9qcbhLcehednindnaHasydbcdtfydbgQa3SmbaHasclfydbcdtfydbg8Aa3SmbaQa8ASmba8Ja8Acx2fg8AIdba8JaQcx2fgQIdbgI:tg8Pa9qIdbaQIdlg8S:tg8MNa8KIdbaI:tgya8AIdla8S:tg8NN:ta8PaAIdba8S:tgRNaYIdbaI:tg8Ra8NN:tNa8Na9pIdbaQIdwg8S:tg8UNa8Ma8AIdwa8S:tgIN:ta8NadIdba8S:tg8SNaRaIN:tNaIayNa8Ua8PN:taIa8RNa8Sa8PN:tNMMJbbbb9FmdkascwfhsaLcefgLa56hea5aL9hmbkkaeceGTmba9hcefh9hxeka8Ea3c8S2gQfgsa8Ea9nc8S2g8AfgLIdbasIdbMUdbasaLIdlasIdlMUdlasaLIdwasIdwMUdwasaLIdxasIdxMUdxasaLIdzasIdzMUdzasaLIdCasIdCMUdCasaLIdKasIdKMUdKasaLId3asId3MUd3asaLIdaasIdaMUdaasaLId8KasId8KMUd8KasaLIdyasIdyMUdydnaDTmbaoaQfgsaoa8AfgLIdbasIdbMUdbasaLIdlasIdlMUdlasaLIdwasIdwMUdwasaLIdxasIdxMUdxasaLIdzasIdzMUdzasaLIdCasIdCMUdCasaLIdKasIdKMUdKasaLId3asId3MUd3asaLIdaasIdaMUdaasaLId8KasId8KMUd8KasaLIdyasIdyMUdyaca9n2heaca32hYawhLaDh8AinaLaYfgsaLaefgQIdbasIdbMUdbasclfg5aQclfIdba5IdbMUdbascwfg5aQcwfIdba5IdbMUdbascxfgsaQcxfIdbasIdbMUdbaLczfhLa8Acufg8AmbkkaOcwfhLdndndndnaEaKfgQRbbc9:fPdebdkaKhsinaHascdtgsfa3BdbaXasfydbgsaK9hmbxikkaXa9kfydbhsaXa9mfydbhKaHa9mfa6Bdbash6kaHaKcdtfa6Bdbka9oce86bba0ce86bbaLIdbg8Pa8Ya8Ya8P9DEh8Ya9ecefh9ececdaQRbbceSEaifhikagcefggaz9hmbkkdna9embahhdxikdnalTmbcbhLa8FhsindnasydbgQcuSmbdnaLaHaQcdtg3fydbgQ9hmba8Fa3fydbhQkasaQBdbkasclfhsalaLcefgL9hmbkcbhLaahsindnasydbgQcuSmbdnaLaHaQcdtg3fydbgQ9hmbaaa3fydbhQkasaQBdbkasclfhsalaLcefgL9hmbkkcbhdabhscbh8AindnaHasydbcdtfydbgLaHasclfydbcdtfydbgQSmbaLaHascwfydbcdtfydbg3SmbaQa3Smbabadcdtfg5aLBdba5clfaQBdba5cwfa3Bdbadcifhdkascxfhsa8Acifg8Aah6mbkadaq9nmdxbkkaPabadalaCz:cjjjbkdnamTmbama8Y:rUdbkaPyd9OgscdtaPcwffc98fhCdninasTmeaCydbcbyd:m:jjjbH:bjjjbbaCc98fhCascufhsxbkkaPc;W;abf8Kjjjjbadk;:ieouabydlhvabydbclfcbaicdtz:ljjjbhoadci9UhrdnadTmbdnalTmbaehwadhDinaoalawydbcdtfydbcdtfgqaqydbcefBdbawclfhwaDcufgDmbxdkkaehwadhDinaoawydbcdtfgqaqydbcefBdbawclfhwaDcufgDmbkkdnaiTmbcbhDaohwinawydbhqawaDBdbawclfhwaqaDfhDaicufgimbkkdnadci6mbarcearce0EhdinaecwfydbhwaeclfydbhDaeydbhidnalTmbalawcdtfydbhwalaDcdtfydbhDalaicdtfydbhikavaoaicdtfgqydbcitfaDBdbavaqydbcitfawBdlaqaqydbcefBdbavaoaDcdtfgqydbcitfawBdbavaqydbcitfaiBdlaqaqydbcefBdbavaoawcdtfgwydbcitfaiBdbavawydbcitfaDBdlawawydbcefBdbaecxfheadcufgdmbkkabydbcbBdbk:Zldouv998Jjjjjbca9Rglczfcwfcbyd11jjbBdbalcb8Pdj1jjb83izalcwfcbydN1jjbBdbalcb8Pd:m1jjb83ibdnadTmbaicd4hvdnabTmbavcdthocbhraehwinabarcx2fgiaearav2cdtfgDIdbUdbaiaDIdlUdlaiaDIdwUdwcbhiinalczfaifgDawaifIdbgqaDIdbgkakaq9EEUdbalaifgDaqaDIdbgkakaq9DEUdbaiclfgicx9hmbkawaofhwarcefgrad9hmbxdkkavcdthrcbhwincbhiinalczfaifgDaeaifIdbgqaDIdbgkakaq9EEUdbalaifgDaqaDIdbgkakaq9DEUdbaiclfgicx9hmbkaearfheawcefgwad9hmbkkdnabTmbadTmbJbbbbJbbjZalIdbalIdzgk:tJbbbb:xgqalIdlalIdCgx:tgmamaq9DEgqalIdwalIdKgm:tgPaPaq9DEgq:vaqJbbbb9BEhqinabaqabIdbak:tNUdbabclfgiaqaiIdbax:tNUdbabcwfgiaqaiIdbam:tNUdbabcxfhbadcufgdmbkkk8KbabaeadaialavcbcbcbcbaoarawaDz:bjjjbk8KbabaeadaialavaoarawaDaqakaxamz:bjjjbk;lOowud99wue99iul998Jjjjjbc;Wb9Rgw8KjjjjbdndnarmbcbhDxekawcwfcbc;Kbz:ljjjb8Aawcuadcx2adc;v:Q;v:Qe0Ecbyd1:jjjbHjjjjbbgqBdwawceBd9Oaqaeadaiz:djjjbawcuadcdtadcFFFFi0Egkcbyd1:jjjbHjjjjbbgxBdxawcdBd9Oadcd4adfhmceheinaegicetheaiam6mbkcbhmawcuaicdtgPaicFFFFi0Ecbyd1:jjjbHjjjjbbgsBdzawciBd9Odndnar:Zgz:rJbbbZMgH:lJbbb9p9DTmbaH:Ohexekcjjjj94hekaicufhOc:bwhAcbhCcbhXadhQinaChLaeaAgKcufaeaK9iEamgDcefaeaD9kEhYdndnadTmbaYcuf:YhHaqhiaxheadhmindndnaiIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhAxekcjjjj94hAkaAcCthAdndnaiclfIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhCxekcjjjj94hCkaCcqtaAVhAdndnaicwfIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhCxekcjjjj94hCkaeaAaCVBdbaicxfhiaeclfheamcufgmmbkascFeaPz:ljjjbhEcbh3cbh5indnaEaxa5cdtfydbgAcm4aA7c:v;t;h;Ev2gics4ai7aOGgmcdtfgCydbgecuSmbaeaASmbcehiinaEamaifaOGgmcdtfgCydbgecuSmeaicefhiaeaA9hmbkkaCaABdba3aecuSfh3a5cefg5ad9hmbxdkkascFeaPz:ljjjb8Acbh3kaDaYa3ar0giEhmaLa3aiEhCdna3arSmbaYaKaiEgAam9Rcd9imbdndnaXcl0mbdnaQ:ZgHaL:Zg8A:taY:Yg8EaD:Y:tg8Fa8EaK:Y:tgaa3:Zghaz:tNNNaHaz:taaNa8Aah:tNa8Aaz:ta8FNahaH:tNM:va8EMJbbbZMgH:lJbbb9p9DTmbaH:Ohexdkcjjjj94hexekamaAfcd9Theka3aQaiEhQaXcefgXcs9hmekkdndnaCmbcihicbhDxekcbhiawakcbyd1:jjjbHjjjjbbg5BdCawclBd9OdndnadTmbamcuf:YhHaqhiaxheadhmindndnaiIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhAxekcjjjj94hAkaAcCthAdndnaiclfIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhCxekcjjjj94hCkaCcqtaAVhAdndnaicwfIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhCxekcjjjj94hCkaeaAaCVBdbaicxfhiaeclfheamcufgmmbkascFeaPz:ljjjbhEcbhDcbh3inaxa3cdtgYfydbgAcm4aA7c:v;t;h;Ev2gics4ai7hecbhidndninaEaeaOGgmcdtfgCydbgecuSmednaxaecdtgCfydbaASmbaicefgiamfheaiaO9nmekka5aCfydbhixekaCa3BdbaDhiaDcefhDka5aYfaiBdba3cefg3ad9hmbkcuaDc32giaDc;j:KM;jb0EhexekascFeaPz:ljjjb8AcbhDcbhekawaecbyd1:jjjbHjjjjbbgeBdKawcvBd9Oaecbaiz:ljjjbhOavcd4hxdnadTmbaxcdth3a5hmalhAaqheadhEinaOamydbc32fgiaeIdbaiIdbMUdbaiaeclfIdbaiIdlMUdlaiaecwfIdbaiIdwMUdwaiaAc;81jjbalEgCIdbaiIdxMUdxaiaCIdlaiIdzMUdzaiaCIdwaiIdCMUdCaiaiIdKJbbjZMUdKamclfhmaAa3fhAaecxfheaEcufgEmbkkdnaDTmbaOcxfhiaDheinaictfgmamIdbJbbbbJbbjZaicxfIdbgH:vaHJbbbb9BEgHNUdbaic94fgmaHamIdbNUdbaic98fgmaHamIdbNUdbaiaHaiIdbNUdbaiclfgmaHamIdbNUdbaicwfgmaHamIdbNUdbaic3fhiaecufgembkkcbhAawcuaDcdtgYaDcFFFFi0Egicbyd1:jjjbHjjjjbbgeBd3awcoBd9Oawaicbyd1:jjjbHjjjjbbgEBdaaecFeaYz:ljjjbh3dnadTmbaoaoNh8Aaxcdthxalheina8Aaec;81jjbalEgmIdwaOa5ydbgCc32fgiIdC:tgHaHNamIdbaiIdx:tgHaHNamIdlaiIdz:tgHaHNMMNaqcwfIdbaiIdw:tgHaHNaqIdbaiIdb:tgHaHNaqclfIdbaiIdl:tgHaHNMMMhHdndna3aCcdtgifgmydbcuSmbaEaifIdbaH9ETmekamaABdbaEaifaHUdbka5clfh5aeaxfheaqcxfhqadaAcefgA9hmbkkaba3aYz:kjjjb8AcrhikaicdthiinaiTmeaic98fgiawcwffydbcbyd:m:jjjbH:bjjjbbxbkkawc;Wbf8KjjjjbaDk:Qdidui99ducbhi8Jjjjjbca9Rglczfcwfcbyd11jjbBdbalcb8Pdj1jjb83izalcwfcbydN1jjbBdbalcb8Pd:m1jjb83ibdndnaembJbbjFhvJbbjFhoJbbjFhrxekadcd4cdthwincbhdinalczfadfgDabadfIdbgoaDIdbgrarao9EEUdbaladfgDaoaDIdbgrarao9DEUdbadclfgdcx9hmbkabawfhbaicefgiae9hmbkalIdwalIdK:thralIdlalIdC:thoalIdbalIdz:thvkavJbbbb:xgvaoaoav9DEgoararao9DEk9DeeuabcFeaicdtz:ljjjbhlcbhbdnadTmbindnalaeydbcdtfgiydbcu9hmbaiabBdbabcefhbkaeclfheadcufgdmbkkabk9teiucbcbyd:q:jjjbgeabcifc98GfgbBd:q:jjjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;LeeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiclfaeclfydbBdbaicwfaecwfydbBdbaicxfaecxfydbBdbaeczfheaiczfhiadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk;aeedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdbaicxfalBdbaicwfalBdbaiclfalBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabk9teiucbcbyd:q:jjjbgeabcrfc94GfgbBd:q:jjjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik9:eiuZbhedndncbyd:q:jjjbgdaecztgi9nmbcuheadai9RcFFifcz4nbcuSmekadhekcbabae9Rcifc98Gcbyd:q:jjjbfgdBd:q:jjjbdnadZbcztge9nmbadae9RcFFifcz4nb8Akk6eiucbhidnadTmbdninabRbbglaeRbbgv9hmeaecefheabcefhbadcufgdmbxdkkalav9Rhikaikk:Iedbcjwk1eFFuuFFuuFFuuFFuFFFuFFFuFbbbbbbbbebbbdbbbbbbbebbbeeebeebebbeeebebbbbbebebbbbbebbbdbbbbbbbbbbbbbbbeeeeebebbbbbebbbbbeebbbbbbbbbbbbbbbbbbbbbc1Dkxebbbdbbb:G9Kbb\";\n\n\tvar wasmpack = new Uint8Array([32,0,65,2,1,106,34,33,3,128,11,4,13,64,6,253,10,7,15,116,127,5,8,12,40,16,19,54,20,9,27,255,113,17,42,67,24,23,146,148,18,14,22,45,70,69,56,114,101,21,25,63,75,136,108,28,118,29,73,115]);\n\n\tif (typeof WebAssembly !== 'object') {\n\t\treturn {\n\t\t\tsupported: false,\n\t\t};\n\t}\n\n\tvar instance;\n\n\tvar ready =\n\t\tWebAssembly.instantiate(unpack(wasm), {})\n\t\t.then(function(result) {\n\t\t\tinstance = result.instance;\n\t\t\tinstance.exports.__wasm_call_ctors();\n\t\t});\n\n\tfunction unpack(data) {\n\t\tvar result = new Uint8Array(data.length);\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tvar ch = data.charCodeAt(i);\n\t\t\tresult[i] = ch > 96 ? ch - 97 : ch > 64 ? ch - 39 : ch + 4;\n\t\t}\n\t\tvar write = 0;\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tresult[write++] = (result[i] < 60) ? wasmpack[result[i]] : (result[i] - 60) * 64 + result[++i];\n\t\t}\n\t\treturn result.buffer.slice(0, write);\n\t}\n\n\tfunction assert(cond) {\n\t\tif (!cond) {\n\t\t\tthrow new Error(\"Assertion failed\");\n\t\t}\n\t}\n\n\tfunction bytes(view) {\n\t\treturn new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n\t}\n\n\tfunction reorder(fun, indices, vertices) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar ip = sbrk(indices.length * 4);\n\t\tvar rp = sbrk(vertices * 4);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar indices8 = bytes(indices);\n\t\theap.set(indices8, ip);\n\t\tvar unique = fun(rp, ip, indices.length, vertices);\n\t\t// heap may have grown\n\t\theap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar remap = new Uint32Array(vertices);\n\t\tnew Uint8Array(remap.buffer).set(heap.subarray(rp, rp + vertices * 4));\n\t\tindices8.set(heap.subarray(ip, ip + indices.length * 4));\n\t\tsbrk(ip - sbrk(0));\n\n\t\tfor (var i = 0; i < indices.length; ++i)\n\t\t\tindices[i] = remap[indices[i]];\n\n\t\treturn [remap, unique];\n\t}\n\n\tfunction maxindex(source) {\n\t\tvar result = 0;\n\t\tfor (var i = 0; i < source.length; ++i) {\n\t\t\tvar index = source[i];\n\t\t\tresult = result < index ? index : result;\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction simplify(fun, indices, index_count, vertex_positions, vertex_count, vertex_positions_stride, target_index_count, target_error, options) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar te = sbrk(4);\n\t\tvar ti = sbrk(index_count * 4);\n\t\tvar sp = sbrk(vertex_count * vertex_positions_stride);\n\t\tvar si = sbrk(index_count * 4);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(bytes(vertex_positions), sp);\n\t\theap.set(bytes(indices), si);\n\t\tvar result = fun(ti, si, index_count, sp, vertex_count, vertex_positions_stride, target_index_count, target_error, options, te);\n\t\t// heap may have grown\n\t\theap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar target = new Uint32Array(result);\n\t\tbytes(target).set(heap.subarray(ti, ti + result * 4));\n\t\tvar error = new Float32Array(1);\n\t\tbytes(error).set(heap.subarray(te, te + 4));\n\t\tsbrk(te - sbrk(0));\n\t\treturn [target, error[0]];\n\t}\n\n\tfunction simplifyAttr(fun, indices, index_count, vertex_positions, vertex_count, vertex_positions_stride, vertex_attributes, vertex_attributes_stride, attribute_weights, target_index_count, target_error, options) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar te = sbrk(4);\n\t\tvar ti = sbrk(index_count * 4);\n\t\tvar sp = sbrk(vertex_count * vertex_positions_stride);\n\t\tvar sa = sbrk(vertex_count * vertex_attributes_stride);\n\t\tvar sw = sbrk(attribute_weights.length * 4);\n\t\tvar si = sbrk(index_count * 4);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(bytes(vertex_positions), sp);\n\t\theap.set(bytes(vertex_attributes), sa);\n\t\theap.set(bytes(attribute_weights), sw);\n\t\theap.set(bytes(indices), si);\n\t\tvar result = fun(ti, si, index_count, sp, vertex_count, vertex_positions_stride, sa, vertex_attributes_stride, sw, attribute_weights.length, target_index_count, target_error, options, te);\n\t\t// heap may have grown\n\t\theap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar target = new Uint32Array(result);\n\t\tbytes(target).set(heap.subarray(ti, ti + result * 4));\n\t\tvar error = new Float32Array(1);\n\t\tbytes(error).set(heap.subarray(te, te + 4));\n\t\tsbrk(te - sbrk(0));\n\t\treturn [target, error[0]];\n\t}\n\n\tfunction simplifyScale(fun, vertex_positions, vertex_count, vertex_positions_stride) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar sp = sbrk(vertex_count * vertex_positions_stride);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(bytes(vertex_positions), sp);\n\t\tvar result = fun(sp, vertex_count, vertex_positions_stride);\n\t\tsbrk(sp - sbrk(0));\n\t\treturn result;\n\t}\n\n\tfunction simplifyPoints(fun, vertex_positions, vertex_count, vertex_positions_stride, vertex_colors, vertex_colors_stride, color_weight, target_vertex_count) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar ti = sbrk(target_vertex_count * 4);\n\t\tvar sp = sbrk(vertex_count * vertex_positions_stride);\n\t\tvar sc = sbrk(vertex_count * vertex_colors_stride);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(bytes(vertex_positions), sp);\n\t\tif (vertex_colors) {\n\t\t\theap.set(bytes(vertex_colors), sc);\n\t\t}\n\t\tvar result = fun(ti, sp, vertex_count, vertex_positions_stride, sc, vertex_colors_stride, color_weight, target_vertex_count);\n\t\t// heap may have grown\n\t\theap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar target = new Uint32Array(result);\n\t\tbytes(target).set(heap.subarray(ti, ti + result * 4));\n\t\tsbrk(ti - sbrk(0));\n\t\treturn target;\n\t}\n\n\tvar simplifyOptions = {\n\t\tLockBorder: 1,\n\t};\n\n\treturn {\n\t\tready: ready,\n\t\tsupported: true,\n\n\t\t// set this to true to be able to use simplifyPoints and simplifyWithAttributes\n\t\t// note that these functions are experimental and may change interface/behavior in a way that will require revising calling code\n\t\tuseExperimentalFeatures: false,\n\n\t\tcompactMesh: function(indices) {\n\t\t\tassert(indices instanceof Uint32Array || indices instanceof Int32Array || indices instanceof Uint16Array || indices instanceof Int16Array);\n\t\t\tassert(indices.length % 3 == 0);\n\n\t\t\tvar indices32 = indices.BYTES_PER_ELEMENT == 4 ? indices : new Uint32Array(indices);\n\t\t\treturn reorder(instance.exports.meshopt_optimizeVertexFetchRemap, indices32, maxindex(indices) + 1);\n\t\t},\n\n\t\tsimplify: function(indices, vertex_positions, vertex_positions_stride, target_index_count, target_error, flags) {\n\t\t\tassert(indices instanceof Uint32Array || indices instanceof Int32Array || indices instanceof Uint16Array || indices instanceof Int16Array);\n\t\t\tassert(indices.length % 3 == 0);\n\t\t\tassert(vertex_positions instanceof Float32Array);\n\t\t\tassert(vertex_positions.length % vertex_positions_stride == 0);\n\t\t\tassert(vertex_positions_stride >= 3);\n\t\t\tassert(target_index_count >= 0 && target_index_count <= indices.length);\n\t\t\tassert(target_index_count % 3 == 0);\n\t\t\tassert(target_error >= 0 && target_error <= 1);\n\n\t\t\tvar options = 0;\n\t\t\tfor (var i = 0; i < (flags ? flags.length : 0); ++i) {\n\t\t\t\toptions |= simplifyOptions[flags[i]];\n\t\t\t}\n\n\t\t\tvar indices32 = indices.BYTES_PER_ELEMENT == 4 ? indices : new Uint32Array(indices);\n\t\t\tvar result = simplify(instance.exports.meshopt_simplify, indices32, indices.length, vertex_positions, vertex_positions.length / vertex_positions_stride, vertex_positions_stride * 4, target_index_count, target_error, options);\n\t\t\tresult[0] = (indices instanceof Uint32Array) ? result[0] : new indices.constructor(result[0]);\n\n\t\t\treturn result;\n\t\t},\n\n\t\tsimplifyWithAttributes: function(indices, vertex_positions, vertex_positions_stride, vertex_attributes, vertex_attributes_stride, attribute_weights, target_index_count, target_error, flags) {\n\t\t\tassert(this.useExperimentalFeatures); // set useExperimentalFeatures to use this; note that this function is experimental and may change interface in a way that will require revising calling code\n\t\t\tassert(indices instanceof Uint32Array || indices instanceof Int32Array || indices instanceof Uint16Array || indices instanceof Int16Array);\n\t\t\tassert(indices.length % 3 == 0);\n\t\t\tassert(vertex_positions instanceof Float32Array);\n\t\t\tassert(vertex_positions.length % vertex_positions_stride == 0);\n\t\t\tassert(vertex_positions_stride >= 3);\n\t\t\tassert(vertex_attributes instanceof Float32Array);\n\t\t\tassert(vertex_attributes.length % vertex_attributes_stride == 0);\n\t\t\tassert(vertex_attributes_stride >= 0);\n\t\t\tassert(target_index_count >= 0 && target_index_count <= indices.length);\n\t\t\tassert(target_index_count % 3 == 0);\n\t\t\tassert(target_error >= 0 && target_error <= 1);\n\t\t\tassert(Array.isArray(attribute_weights));\n\t\t\tassert(vertex_attributes_stride >= attribute_weights.length);\n\t\t\tassert(attribute_weights.length <= 16);\n\n\t\t\tvar options = 0;\n\t\t\tfor (var i = 0; i < (flags ? flags.length : 0); ++i) {\n\t\t\t\toptions |= simplifyOptions[flags[i]];\n\t\t\t}\n\n\t\t\tvar indices32 = indices.BYTES_PER_ELEMENT == 4 ? indices : new Uint32Array(indices);\n\t\t\tvar result = simplifyAttr(instance.exports.meshopt_simplifyWithAttributes, indices32, indices.length, vertex_positions, vertex_positions.length / vertex_positions_stride, vertex_positions_stride * 4, vertex_attributes, vertex_attributes_stride * 4, new Float32Array(attribute_weights), target_index_count, target_error, options);\n\t\t\tresult[0] = (indices instanceof Uint32Array) ? result[0] : new indices.constructor(result[0]);\n\n\t\t\treturn result;\n\t\t},\n\n\t\tgetScale: function(vertex_positions, vertex_positions_stride) {\n\t\t\tassert(vertex_positions instanceof Float32Array);\n\t\t\tassert(vertex_positions.length % vertex_positions_stride == 0);\n\t\t\tassert(vertex_positions_stride >= 3);\n\t\t\treturn simplifyScale(instance.exports.meshopt_simplifyScale, vertex_positions, vertex_positions.length / vertex_positions_stride, vertex_positions_stride * 4);\n\t\t},\n\n\t\tsimplifyPoints: function(vertex_positions, vertex_positions_stride, target_vertex_count, vertex_colors, vertex_colors_stride, color_weight) {\n\t\t\tassert(this.useExperimentalFeatures); // set useExperimentalFeatures to use this; note that this function is experimental and may change interface in a way that will require revising calling code\n\t\t\tassert(vertex_positions instanceof Float32Array);\n\t\t\tassert(vertex_positions.length % vertex_positions_stride == 0);\n\t\t\tassert(vertex_positions_stride >= 3);\n\t\t\tassert(target_vertex_count >= 0 && target_vertex_count <= vertex_positions.length / vertex_positions_stride);\n\t\t\tif (vertex_colors) {\n\t\t\t\tassert(vertex_colors instanceof Float32Array);\n\t\t\t\tassert(vertex_colors.length % vertex_colors_stride == 0);\n\t\t\t\tassert(vertex_colors_stride >= 3);\n\t\t\t\tassert(vertex_positions.length / vertex_positions_stride == vertex_colors.length / vertex_colors_stride);\n\t\t\t\treturn simplifyPoints(instance.exports.meshopt_simplifyPoints, vertex_positions, vertex_positions.length / vertex_positions_stride, vertex_positions_stride * 4, vertex_colors, vertex_colors_stride * 4, color_weight, target_vertex_count);\n\t\t\t} else {\n\t\t\t\treturn simplifyPoints(instance.exports.meshopt_simplifyPoints, vertex_positions, vertex_positions.length / vertex_positions_stride, vertex_positions_stride * 4, undefined, 0, 0, target_vertex_count);\n\t\t\t}\n\t\t},\n\t};\n})();\n\nexport { MeshoptSimplifier };\n","import * as THREE from 'three';\r\nimport { LinkedHashMap } from '../utils/LinkedHashMap';\r\nimport { B3DMDecoder } from \"../decoder/B3DMDecoder\";\r\nimport { SplatsDecoder } from \"../decoder/SplatsDecoder\";\r\nimport { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';\r\nimport { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js';\r\nimport { KTX2Loader } from \"three/addons/loaders/KTX2Loader\";\r\nimport { resolveImplicite } from './implicit/ImplicitTileResolver.js';\r\nimport { MeshoptDecoder } from 'meshoptimizer';\r\n\r\nlet concurrentDownloads = 0;\r\n\r\n\r\n/**\r\n * A Tile loader that manages caching and load order.\r\n * The cache is an LRU cache and is defined by the number of items it can hold.\r\n * The actual number of cached items might grow beyond max if all items are in use.\r\n * \r\n * The load order is designed for optimal perceived loading speed (nearby tiles are refined first).\r\n * @class\r\n */\r\nclass TileLoader {\r\n /**\r\n * Creates a tile loader with a maximum number of cached items and callbacks.\r\n * The only required property is a renderer that will be used to visualize the tiles.\r\n * The maxCachedItems property is the size of the cache in number of objects, mesh tile and tileset.json files.\r\n * The mesh and point callbacks will be called for every incoming mesh or points.\r\n * \r\n *\r\n * \r\n * @param {Object} [options] - Optional configuration object.\r\n * @param {renderer} [options.renderer] - the WebGL renderer\r\n * @param {number} [options.maxCachedItems=100] - the cache size.\r\n * @param {function} [options.meshCallback = undefined] - A callback to call on newly decoded meshes.\r\n * @param {function} [options.pointsCallback = undefined] - A callback to call on newly decoded points.\r\n * @param {sring} [options.proxy = undefined] - An optional proxy that tile requests will be directed too as POST requests with the actual tile url in the body of the request.\r\n * @param {KTX2Loader} [options.ktx2Loader = undefined] - A KTX2Loader (three/addons)\r\n * @param {DRACOLoader} [options.dracoLoader = undefined] - A DRACOLoader (three/addons)\r\n */\r\n constructor(options) {\r\n this.renderer = options.renderer;\r\n this.zUpToYUpMatrix = new THREE.Matrix4();\r\n this.zUpToYUpMatrix.set(1, 0, 0, 0,\r\n 0, 0, -1, 0,\r\n 0, 1, 0, 0,\r\n 0, 0, 0, 1);\r\n this.maxCachedItems = 100;\r\n this.proxy = options.proxy;\r\n if (!!options) {\r\n this.meshCallback = options.meshCallback;\r\n this.pointsCallback = options.pointsCallback;\r\n if (options.maxCachedItems!=undefined) this.maxCachedItems = options.maxCachedItems;\r\n }\r\n \r\n\r\n this.gltfLoader = new GLTFLoader();\r\n if (!!options && !!options.dracoLoader) {\r\n this.gltfLoader.setDRACOLoader(options.dracoLoader);\r\n this.hasDracoLoader = true;\r\n } else {\r\n const dracoLoader = new DRACOLoader();\r\n dracoLoader.setDecoderPath('https://storage.googleapis.com/ogc-3d-tiles/draco/');\r\n this.gltfLoader.setDRACOLoader(dracoLoader);\r\n this.gltfLoader.hasDracoLoader = true;\r\n }\r\n\r\n if (!!options && !!options.ktx2Loader) {\r\n this.gltfLoader.setKTX2Loader(options.ktx2Loader);\r\n this.hasKTX2Loader = true;\r\n } else if (!!options && !!options.renderer) {\r\n const ktx2Loader = new KTX2Loader();\r\n ktx2Loader.setTranscoderPath('https://storage.googleapis.com/ogc-3d-tiles/basis/').detectSupport(options.renderer);\r\n this.gltfLoader.setKTX2Loader(ktx2Loader);\r\n this.gltfLoader.hasKTX2Loader = true;\r\n }\r\n\r\n this.gltfLoader.setMeshoptDecoder(MeshoptDecoder);\r\n this.hasMeshOptDecoder = true;\r\n\r\n this.b3dmDecoder = new B3DMDecoder(this.gltfLoader);\r\n this.splatsDecoder = new SplatsDecoder(this.gltfLoader, this.renderer);\r\n\r\n this.cache = new LinkedHashMap();\r\n this.register = {};\r\n\r\n\r\n this.ready = [];\r\n this.downloads = [];\r\n this.nextReady = [];\r\n this.nextDownloads = [];\r\n\r\n }\r\n\r\n\r\n /**\r\n * To be called in the render loop or at regular intervals.\r\n * launches tile downloading and loading in an orderly fashion.\r\n */\r\n update() {\r\n \r\n const self = this;\r\n if (concurrentDownloads < 8) {\r\n self._download();\r\n }\r\n \r\n self._loadBatch();\r\n \r\n }\r\n\r\n\r\n _scheduleDownload(f) {\r\n this.downloads.unshift(f);\r\n }\r\n _download() {\r\n\r\n if (this.nextDownloads.length == 0) {\r\n this._getNextDownloads();\r\n if (this.nextDownloads.length == 0) return;\r\n }\r\n while (this.nextDownloads.length > 0) {\r\n const nextDownload = this.nextDownloads.shift();\r\n if (!!nextDownload && nextDownload.shouldDoDownload()) {\r\n nextDownload.doDownload();\r\n }\r\n }\r\n return;\r\n }\r\n _meshReceived(cache, register, key, distanceFunction, getSiblings, level, uuid) {\r\n this.ready.unshift([cache, register, key, distanceFunction, getSiblings, level, uuid]);\r\n }\r\n \r\n _loadBatch() {\r\n if (this.nextReady.length == 0) {\r\n this._getNextReady();\r\n }\r\n while(this.nextReady.length > 0){\r\n const data = this.nextReady.shift();\r\n if (!data) return;\r\n const cache = data[0];\r\n const register = data[1];\r\n const key = data[2];\r\n const mesh = cache.get(key);\r\n \r\n if (!!mesh && !!register[key]) {\r\n Object.keys(register[key]).forEach(tile => {\r\n const callback = register[key][tile];\r\n if (!!callback) {\r\n callback(mesh);\r\n register[key][tile] = null;\r\n }\r\n });\r\n }\r\n if (this.nextReady.length == 0) {\r\n this._getNextReady();\r\n }\r\n }\r\n \r\n return;\r\n\r\n /* while (this.ready.length > 0) {\r\n const data = this.ready.shift();\r\n if (!data) return 0;\r\n const cache = data[0];\r\n const register = data[1];\r\n const key = data[2];\r\n const mesh = cache.get(key);\r\n\r\n if (!!mesh && !!register[key]) {\r\n Object.keys(register[key]).forEach(tile => {\r\n const callback = register[key][tile];\r\n if (!!callback) {\r\n callback(mesh);\r\n register[key][tile] = null;\r\n }\r\n });\r\n }\r\n return;\r\n } */\r\n }\r\n\r\n _getNextDownloads() {\r\n let smallestDistance = Number.POSITIVE_INFINITY;\r\n let closest = -1;\r\n for (let i = this.downloads.length - 1; i >= 0; i--) {\r\n /* if (!this.downloads[i].shouldDoDownload()) {\r\n this.downloads.splice(i, 1);\r\n continue;\r\n } */\r\n if (!this.downloads[i].distanceFunction) { // if no distance function, must be a json, give absolute priority!\r\n this.nextDownloads.push(this.downloads.splice(i, 1)[0]);\r\n }\r\n }\r\n if (this.nextDownloads.length > 0) return;\r\n let highestLevel = 0;\r\n let lowestLevel = Number.MAX_SAFE_INTEGER;\r\n let lowestIndex = -1;\r\n for (let i = this.downloads.length - 1; i >= 0; i--) {\r\n \r\n const dist = this.downloads[i].distanceFunction();\r\n if (dist <= smallestDistance) {\r\n smallestDistance = dist;\r\n closest = i;\r\n }\r\n highestLevel = Math.max(this.downloads[i].level);\r\n if(this.downloads[i].loadingStrategy != \"IMMEDIATE\" && lowestLevel>this.downloads[i].level){\r\n lowestLevel = this.downloads[i].level;\r\n lowestIndex = i;\r\n }\r\n \r\n }\r\n let closestItem;\r\n if(highestLevel>lowestLevel+4){\r\n closestItem = this.downloads.splice(lowestIndex, 1).pop();\r\n }else if (closest >= 0){\r\n closestItem = this.downloads.splice(closest, 1).pop();\r\n }\r\n if (!!closestItem) {\r\n this.nextDownloads.push(closestItem);\r\n const siblings = closestItem.getSiblings();\r\n for (let i = this.downloads.length - 1; i >= 0; i--) {\r\n if (siblings.map(s => s.uuid).includes(this.downloads[i].uuid)) {\r\n this.nextDownloads.push(this.downloads.splice(i, 1).pop());\r\n }\r\n }\r\n }\r\n }\r\n\r\n _getNextReady() {\r\n let smallestDistance = Number.POSITIVE_INFINITY;\r\n let closest = -1;\r\n for (let i = this.ready.length - 1; i >= 0; i--) {\r\n\r\n if (!this.ready[i][3]) {// if no distance function, must be a json, give absolute priority!\r\n this.nextReady.push(this.ready.splice(i, 1)[0]);\r\n }\r\n }\r\n if (this.nextReady.length > 0) return;\r\n for (let i = this.ready.length - 1; i >= 0; i--) {\r\n const dist = this.ready[i][3]() * this.ready[i][5];\r\n if (dist <= smallestDistance) {\r\n smallestDistance = dist;\r\n closest = i\r\n }\r\n }\r\n if (closest >= 0) {\r\n const closestItem = this.ready.splice(closest, 1).pop();\r\n this.nextReady.push(closestItem);\r\n const siblings = closestItem[4]();\r\n for (let i = this.ready.length - 1; i >= 0; i--) {\r\n if (siblings.map(s=>s.uuid).includes(this.ready[i][6])) {\r\n this.nextReady.push(this.ready.splice(i, 1).pop());\r\n }\r\n }\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Schedules a tile content to be downloaded\r\n * \r\n * @param {AbortController} abortController \r\n * @param {string|Number} tileIdentifier \r\n * @param {string} path \r\n * @param {Function} callback \r\n * @param {Function} distanceFunction \r\n * @param {Function} getSiblings \r\n * @param {Number} level \r\n * @param {Boolean} sceneZupToYup \r\n * @param {Boolean} meshZupToYup \r\n * @param {Number} geometricError \r\n */\r\n get(abortController, tileIdentifier, path, callback, distanceFunction, getSiblings, level, loadingStrategy, sceneZupToYup, meshZupToYup, geometricError, splatsMesh) {\r\n const self = this;\r\n const key = _simplifyPath(path);\r\n\r\n const realAbortController = new AbortController();\r\n abortController.signal.addEventListener(\"abort\", () => {\r\n if (!self.register[key] || Object.keys(self.register[key]).length == 0) {\r\n realAbortController.abort(\"user abort\");\r\n }\r\n })\r\n\r\n if (!path.includes(\".b3dm\") && !path.includes(\".json\") && !path.includes(\".gltf\") && !path.includes(\".glb\")) {\r\n console.error(\"the 3DTiles cache can only be used to load B3DM, gltf and json data\");\r\n return;\r\n }\r\n if (!self.register[key]) {\r\n self.register[key] = {};\r\n }\r\n if (!!self.register[key][tileIdentifier]) {\r\n console.error(\" a tile should only be loaded once\");\r\n }\r\n self.register[key][tileIdentifier] = callback;\r\n\r\n const cachedObject = self.cache.get(key);\r\n if (!!cachedObject) {\r\n this._meshReceived(self.cache, self.register, key, distanceFunction, getSiblings, level, tileIdentifier);\r\n } else if (Object.keys(self.register[key]).length == 1) {\r\n let downloadFunction;\r\n if (path.includes(\".b3dm\")) {\r\n downloadFunction = () => {\r\n \r\n \r\n var fetchFunction;\r\n if (!self.proxy) {\r\n fetchFunction = () => {\r\n return fetch(path, { signal: realAbortController.signal });\r\n }\r\n } else {\r\n fetchFunction = () => {\r\n return fetch(self.proxy,\r\n {\r\n method: 'POST',\r\n body: path,\r\n signal: realAbortController.signal\r\n }\r\n );\r\n }\r\n }\r\n concurrentDownloads++;\r\n fetchFunction().then(result => {\r\n if (!result.ok) {\r\n console.error(\"could not load tile with path : \" + path)\r\n throw new Error(`couldn't load \"${path}\". Request failed with status ${result.status} : ${result.statusText}`);\r\n }\r\n return result.arrayBuffer();\r\n\r\n }).then(resultArrayBuffer => {\r\n\r\n return this.b3dmDecoder.parseB3DM(resultArrayBuffer, (mesh) => { self.meshCallback(mesh, geometricError) }, sceneZupToYup, meshZupToYup);\r\n }).then(mesh => {\r\n self.cache.put(key, mesh);\r\n self._checkSize();\r\n this._meshReceived(self.cache, self.register, key, distanceFunction, getSiblings, level, tileIdentifier);\r\n }).catch((e) => {\r\n //console.error(e)\r\n }).finally(() => {\r\n concurrentDownloads--;\r\n });\r\n\r\n }\r\n } else if (path.includes(\".glb\") || path.includes(\".gltf\")) {\r\n if(splatsMesh){\r\n \r\n downloadFunction = () => {\r\n \r\n \r\n var fetchFunction;\r\n if (!self.proxy) {\r\n fetchFunction = () => {\r\n return fetch(path, { signal: realAbortController.signal });\r\n }\r\n } else {\r\n fetchFunction = () => {\r\n return fetch(self.proxy,\r\n {\r\n method: 'POST',\r\n body: path,\r\n signal: realAbortController.signal\r\n }\r\n );\r\n }\r\n }\r\n concurrentDownloads++;\r\n fetchFunction().then(result => {\r\n if (!result.ok) {\r\n console.error(\"could not load tile with path : \" + path)\r\n throw new Error(`couldn't load \"${path}\". Request failed with status ${result.status} : ${result.statusText}`);\r\n }\r\n return result.arrayBuffer();\r\n \r\n }).then(resultArrayBuffer => {\r\n \r\n return this.splatsDecoder.parseSplats(resultArrayBuffer, sceneZupToYup, meshZupToYup, splatsMesh);\r\n }).then(mesh => {\r\n self.cache.put(key, mesh);\r\n self._checkSize();\r\n self._meshReceived(self.cache, self.register, key, distanceFunction, getSiblings, level, tileIdentifier);\r\n }).catch((e) => {\r\n //console.error(e)\r\n }).finally(() => {\r\n concurrentDownloads--;\r\n });\r\n \r\n }\r\n }\r\n else{\r\n downloadFunction = () => {\r\n var fetchFunction;\r\n if (!self.proxy) {\r\n fetchFunction = () => {\r\n return fetch(path, { signal: realAbortController.signal });\r\n }\r\n } else {\r\n fetchFunction = () => {\r\n return fetch(self.proxy,\r\n {\r\n method: 'POST',\r\n body: path,\r\n signal: realAbortController.signal\r\n }\r\n );\r\n }\r\n }\r\n concurrentDownloads++;\r\n fetchFunction().then(result => {\r\n if (!result.ok) {\r\n console.error(\"could not load tile with path : \" + path)\r\n throw new Error(`couldn't load \"${path}\". Request failed with status ${result.status} : ${result.statusText}`);\r\n }\r\n return result.arrayBuffer();\r\n }).then(async arrayBuffer => {\r\n await _checkLoaderInitialized(this.gltfLoader);\r\n this.gltfLoader.parse(arrayBuffer, null, gltf => {\r\n gltf.scene.asset = gltf.asset;\r\n if (sceneZupToYup) {\r\n gltf.scene.applyMatrix4(this.zUpToYUpMatrix);\r\n }\r\n gltf.scene.traverse((o) => {\r\n \r\n if (o.isMesh) {\r\n if (meshZupToYup) {\r\n o.applyMatrix4(this.zUpToYUpMatrix);\r\n }\r\n if (!!self.meshCallback) {\r\n self.meshCallback(o, geometricError);\r\n }\r\n }\r\n if (o.isPoints) {\r\n \r\n if (!!self.pointsCallback) {\r\n self.pointsCallback(o, geometricError);\r\n }\r\n }\r\n });\r\n \r\n self.cache.put(key, gltf.scene);\r\n self._checkSize();\r\n self._meshReceived(self.cache, self.register, key, distanceFunction, getSiblings, level, tileIdentifier);\r\n });\r\n }).catch((e) => {\r\n if(e!==\"user abort\" && e.code !== 20) {\r\n //console.error(e);\r\n }\r\n }).finally(() => {\r\n concurrentDownloads--;\r\n });\r\n \r\n \r\n }\r\n }\r\n \r\n } else if (path.includes(\".json\")) {\r\n downloadFunction = () => {\r\n var fetchFunction;\r\n if (!self.proxy) {\r\n fetchFunction = () => {\r\n return fetch(path, { signal: realAbortController.signal });\r\n }\r\n } else {\r\n fetchFunction = () => {\r\n return fetch(self.proxy,\r\n {\r\n method: 'POST',\r\n body: path,\r\n signal: realAbortController.signal\r\n }\r\n );\r\n }\r\n }\r\n concurrentDownloads++;\r\n fetchFunction().then(result => {\r\n if (!result.ok) {\r\n console.error(\"could not load tile with path : \" + path)\r\n throw new Error(`couldn't load \"${path}\". Request failed with status ${result.status} : ${result.statusText}`);\r\n }\r\n return result.json();\r\n\r\n }).then(json => {\r\n return resolveImplicite(json, path)\r\n }).then(json => {\r\n self.cache.put(key, json);\r\n self._checkSize();\r\n self._meshReceived(self.cache, self.register, key);\r\n }).catch((e) => {\r\n //console.error(e)\r\n }).finally(() => {\r\n concurrentDownloads--;\r\n });\r\n }\r\n }\r\n this._scheduleDownload({\r\n \"shouldDoDownload\": () => {\r\n return !abortController.signal.aborted && !!self.register[key] && Object.keys(self.register[key]).length > 0;\r\n },\r\n \"doDownload\": downloadFunction,\r\n \"distanceFunction\": distanceFunction,\r\n \"getSiblings\": getSiblings,\r\n \"level\": level,\r\n \"loadingStrategy\": loadingStrategy,\r\n \"uuid\": tileIdentifier\r\n })\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Invalidates all the unused cached tiles.\r\n */\r\n clear(){\r\n const temp = this.maxCachedItems;\r\n this.maxCachedItems = 0;\r\n this._checkSize();\r\n this.maxCachedItems = temp;\r\n }\r\n\r\n /**\r\n * unregisters a tile content for a specific tile, removing it from the cache if no other tile is using the same content.\r\n * @param {string} path the content path/url\r\n * @param {string|Number} tileIdentifier the tile ID\r\n */\r\n invalidate(path, tileIdentifier) {\r\n const key = _simplifyPath(path);\r\n if (!!this.register[key]) {\r\n delete this.register[key][tileIdentifier];\r\n\r\n //this.register[key][tileIdentifier] = undefined;\r\n this._checkSize();\r\n }\r\n }\r\n\r\n _checkSize() {\r\n const self = this;\r\n\r\n let i = 0;\r\n\r\n while (self.cache.size() > self.maxCachedItems && i < self.cache.size()) {\r\n i++;\r\n const entry = self.cache.head();\r\n const reg = self.register[entry.key];\r\n if (!!reg) {\r\n if (Object.keys(reg).length > 0) {\r\n self.cache.remove(entry.key);\r\n self.cache.put(entry.key, entry.value);\r\n } else {\r\n self.cache.remove(entry.key);\r\n delete self.register[entry.key];\r\n //self.register[entry.key] = undefined;\r\n if(entry.value.isSplatsBatch){\r\n entry.value.remove();\r\n }else{\r\n entry.value.traverse((o) => {\r\n\r\n if (o.material) {\r\n // dispose materials\r\n if (o.material.length) {\r\n for (let i = 0; i < o.material.length; ++i) {\r\n o.material[i].dispose();\r\n }\r\n }\r\n else {\r\n o.material.dispose()\r\n }\r\n }\r\n if (o.geometry) {\r\n // dispose geometry\r\n o.geometry.dispose();\r\n \r\n }\r\n });\r\n }\r\n \r\n }\r\n }\r\n\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\nasync function _checkLoaderInitialized(loader) {\r\n const self = this;\r\n return new Promise((resolve) => {\r\n const interval = setInterval(() => {\r\n if ((!loader.hasDracoLoader || loader.dracoLoader) && (!loader.hasKTX2Loader || loader.ktx2Loader)) {\r\n clearInterval(interval);\r\n resolve();\r\n }\r\n }, 10); // check every 100ms\r\n });\r\n};\r\n\r\nfunction _simplifyPath(main_path) {\r\n\r\n var parts = main_path.split('/'),\r\n new_path = [],\r\n length = 0;\r\n for (var i = 0; i < parts.length; i++) {\r\n var part = parts[i];\r\n if (part === '.' || part === '' || part === '..') {\r\n if (part === '..' && length > 0) {\r\n length--;\r\n }\r\n continue;\r\n }\r\n new_path[length++] = part;\r\n }\r\n\r\n if (length === 0) {\r\n return '/';\r\n }\r\n\r\n var result = '';\r\n for (var i = 0; i < length; i++) {\r\n result += '/' + new_path[i];\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport { TileLoader };","// 'path' module extracted from Node.js v8.11.1 (only the posix part)\n// transplited with Babel\n\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nfunction assertPath(path) {\n if (typeof path !== 'string') {\n throw new TypeError('Path must be a string. Received ' + JSON.stringify(path));\n }\n}\n\n// Resolves . and .. elements in a path with directory names\nfunction normalizeStringPosix(path, allowAboveRoot) {\n var res = '';\n var lastSegmentLength = 0;\n var lastSlash = -1;\n var dots = 0;\n var code;\n for (var i = 0; i <= path.length; ++i) {\n if (i < path.length)\n code = path.charCodeAt(i);\n else if (code === 47 /*/*/)\n break;\n else\n code = 47 /*/*/;\n if (code === 47 /*/*/) {\n if (lastSlash === i - 1 || dots === 1) {\n // NOOP\n } else if (lastSlash !== i - 1 && dots === 2) {\n if (res.length < 2 || lastSegmentLength !== 2 || res.charCodeAt(res.length - 1) !== 46 /*.*/ || res.charCodeAt(res.length - 2) !== 46 /*.*/) {\n if (res.length > 2) {\n var lastSlashIndex = res.lastIndexOf('/');\n if (lastSlashIndex !== res.length - 1) {\n if (lastSlashIndex === -1) {\n res = '';\n lastSegmentLength = 0;\n } else {\n res = res.slice(0, lastSlashIndex);\n lastSegmentLength = res.length - 1 - res.lastIndexOf('/');\n }\n lastSlash = i;\n dots = 0;\n continue;\n }\n } else if (res.length === 2 || res.length === 1) {\n res = '';\n lastSegmentLength = 0;\n lastSlash = i;\n dots = 0;\n continue;\n }\n }\n if (allowAboveRoot) {\n if (res.length > 0)\n res += '/..';\n else\n res = '..';\n lastSegmentLength = 2;\n }\n } else {\n if (res.length > 0)\n res += '/' + path.slice(lastSlash + 1, i);\n else\n res = path.slice(lastSlash + 1, i);\n lastSegmentLength = i - lastSlash - 1;\n }\n lastSlash = i;\n dots = 0;\n } else if (code === 46 /*.*/ && dots !== -1) {\n ++dots;\n } else {\n dots = -1;\n }\n }\n return res;\n}\n\nfunction _format(sep, pathObject) {\n var dir = pathObject.dir || pathObject.root;\n var base = pathObject.base || (pathObject.name || '') + (pathObject.ext || '');\n if (!dir) {\n return base;\n }\n if (dir === pathObject.root) {\n return dir + base;\n }\n return dir + sep + base;\n}\n\nvar posix = {\n // path.resolve([from ...], to)\n resolve: function resolve() {\n var resolvedPath = '';\n var resolvedAbsolute = false;\n var cwd;\n\n for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n var path;\n if (i >= 0)\n path = arguments[i];\n else {\n if (cwd === undefined)\n cwd = process.cwd();\n path = cwd;\n }\n\n assertPath(path);\n\n // Skip empty entries\n if (path.length === 0) {\n continue;\n }\n\n resolvedPath = path + '/' + resolvedPath;\n resolvedAbsolute = path.charCodeAt(0) === 47 /*/*/;\n }\n\n // At this point the path should be resolved to a full absolute path, but\n // handle relative paths to be safe (might happen when process.cwd() fails)\n\n // Normalize the path\n resolvedPath = normalizeStringPosix(resolvedPath, !resolvedAbsolute);\n\n if (resolvedAbsolute) {\n if (resolvedPath.length > 0)\n return '/' + resolvedPath;\n else\n return '/';\n } else if (resolvedPath.length > 0) {\n return resolvedPath;\n } else {\n return '.';\n }\n },\n\n normalize: function normalize(path) {\n assertPath(path);\n\n if (path.length === 0) return '.';\n\n var isAbsolute = path.charCodeAt(0) === 47 /*/*/;\n var trailingSeparator = path.charCodeAt(path.length - 1) === 47 /*/*/;\n\n // Normalize the path\n path = normalizeStringPosix(path, !isAbsolute);\n\n if (path.length === 0 && !isAbsolute) path = '.';\n if (path.length > 0 && trailingSeparator) path += '/';\n\n if (isAbsolute) return '/' + path;\n return path;\n },\n\n isAbsolute: function isAbsolute(path) {\n assertPath(path);\n return path.length > 0 && path.charCodeAt(0) === 47 /*/*/;\n },\n\n join: function join() {\n if (arguments.length === 0)\n return '.';\n var joined;\n for (var i = 0; i < arguments.length; ++i) {\n var arg = arguments[i];\n assertPath(arg);\n if (arg.length > 0) {\n if (joined === undefined)\n joined = arg;\n else\n joined += '/' + arg;\n }\n }\n if (joined === undefined)\n return '.';\n return posix.normalize(joined);\n },\n\n relative: function relative(from, to) {\n assertPath(from);\n assertPath(to);\n\n if (from === to) return '';\n\n from = posix.resolve(from);\n to = posix.resolve(to);\n\n if (from === to) return '';\n\n // Trim any leading backslashes\n var fromStart = 1;\n for (; fromStart < from.length; ++fromStart) {\n if (from.charCodeAt(fromStart) !== 47 /*/*/)\n break;\n }\n var fromEnd = from.length;\n var fromLen = fromEnd - fromStart;\n\n // Trim any leading backslashes\n var toStart = 1;\n for (; toStart < to.length; ++toStart) {\n if (to.charCodeAt(toStart) !== 47 /*/*/)\n break;\n }\n var toEnd = to.length;\n var toLen = toEnd - toStart;\n\n // Compare paths to find the longest common path from root\n var length = fromLen < toLen ? fromLen : toLen;\n var lastCommonSep = -1;\n var i = 0;\n for (; i <= length; ++i) {\n if (i === length) {\n if (toLen > length) {\n if (to.charCodeAt(toStart + i) === 47 /*/*/) {\n // We get here if `from` is the exact base path for `to`.\n // For example: from='/foo/bar'; to='/foo/bar/baz'\n return to.slice(toStart + i + 1);\n } else if (i === 0) {\n // We get here if `from` is the root\n // For example: from='/'; to='/foo'\n return to.slice(toStart + i);\n }\n } else if (fromLen > length) {\n if (from.charCodeAt(fromStart + i) === 47 /*/*/) {\n // We get here if `to` is the exact base path for `from`.\n // For example: from='/foo/bar/baz'; to='/foo/bar'\n lastCommonSep = i;\n } else if (i === 0) {\n // We get here if `to` is the root.\n // For example: from='/foo'; to='/'\n lastCommonSep = 0;\n }\n }\n break;\n }\n var fromCode = from.charCodeAt(fromStart + i);\n var toCode = to.charCodeAt(toStart + i);\n if (fromCode !== toCode)\n break;\n else if (fromCode === 47 /*/*/)\n lastCommonSep = i;\n }\n\n var out = '';\n // Generate the relative path based on the path difference between `to`\n // and `from`\n for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) {\n if (i === fromEnd || from.charCodeAt(i) === 47 /*/*/) {\n if (out.length === 0)\n out += '..';\n else\n out += '/..';\n }\n }\n\n // Lastly, append the rest of the destination (`to`) path that comes after\n // the common path parts\n if (out.length > 0)\n return out + to.slice(toStart + lastCommonSep);\n else {\n toStart += lastCommonSep;\n if (to.charCodeAt(toStart) === 47 /*/*/)\n ++toStart;\n return to.slice(toStart);\n }\n },\n\n _makeLong: function _makeLong(path) {\n return path;\n },\n\n dirname: function dirname(path) {\n assertPath(path);\n if (path.length === 0) return '.';\n var code = path.charCodeAt(0);\n var hasRoot = code === 47 /*/*/;\n var end = -1;\n var matchedSlash = true;\n for (var i = path.length - 1; i >= 1; --i) {\n code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n if (!matchedSlash) {\n end = i;\n break;\n }\n } else {\n // We saw the first non-path separator\n matchedSlash = false;\n }\n }\n\n if (end === -1) return hasRoot ? '/' : '.';\n if (hasRoot && end === 1) return '//';\n return path.slice(0, end);\n },\n\n basename: function basename(path, ext) {\n if (ext !== undefined && typeof ext !== 'string') throw new TypeError('\"ext\" argument must be a string');\n assertPath(path);\n\n var start = 0;\n var end = -1;\n var matchedSlash = true;\n var i;\n\n if (ext !== undefined && ext.length > 0 && ext.length <= path.length) {\n if (ext.length === path.length && ext === path) return '';\n var extIdx = ext.length - 1;\n var firstNonSlashEnd = -1;\n for (i = path.length - 1; i >= 0; --i) {\n var code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n } else {\n if (firstNonSlashEnd === -1) {\n // We saw the first non-path separator, remember this index in case\n // we need it if the extension ends up not matching\n matchedSlash = false;\n firstNonSlashEnd = i + 1;\n }\n if (extIdx >= 0) {\n // Try to match the explicit extension\n if (code === ext.charCodeAt(extIdx)) {\n if (--extIdx === -1) {\n // We matched the extension, so mark this as the end of our path\n // component\n end = i;\n }\n } else {\n // Extension does not match, so our result is the entire path\n // component\n extIdx = -1;\n end = firstNonSlashEnd;\n }\n }\n }\n }\n\n if (start === end) end = firstNonSlashEnd;else if (end === -1) end = path.length;\n return path.slice(start, end);\n } else {\n for (i = path.length - 1; i >= 0; --i) {\n if (path.charCodeAt(i) === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n } else if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // path component\n matchedSlash = false;\n end = i + 1;\n }\n }\n\n if (end === -1) return '';\n return path.slice(start, end);\n }\n },\n\n extname: function extname(path) {\n assertPath(path);\n var startDot = -1;\n var startPart = 0;\n var end = -1;\n var matchedSlash = true;\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n var preDotState = 0;\n for (var i = path.length - 1; i >= 0; --i) {\n var code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46 /*.*/) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1)\n startDot = i;\n else if (preDotState !== 1)\n preDotState = 1;\n } else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n\n if (startDot === -1 || end === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n return '';\n }\n return path.slice(startDot, end);\n },\n\n format: function format(pathObject) {\n if (pathObject === null || typeof pathObject !== 'object') {\n throw new TypeError('The \"pathObject\" argument must be of type Object. Received type ' + typeof pathObject);\n }\n return _format('/', pathObject);\n },\n\n parse: function parse(path) {\n assertPath(path);\n\n var ret = { root: '', dir: '', base: '', ext: '', name: '' };\n if (path.length === 0) return ret;\n var code = path.charCodeAt(0);\n var isAbsolute = code === 47 /*/*/;\n var start;\n if (isAbsolute) {\n ret.root = '/';\n start = 1;\n } else {\n start = 0;\n }\n var startDot = -1;\n var startPart = 0;\n var end = -1;\n var matchedSlash = true;\n var i = path.length - 1;\n\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n var preDotState = 0;\n\n // Get non-dir info\n for (; i >= start; --i) {\n code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46 /*.*/) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1) startDot = i;else if (preDotState !== 1) preDotState = 1;\n } else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n\n if (startDot === -1 || end === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n if (end !== -1) {\n if (startPart === 0 && isAbsolute) ret.base = ret.name = path.slice(1, end);else ret.base = ret.name = path.slice(startPart, end);\n }\n } else {\n if (startPart === 0 && isAbsolute) {\n ret.name = path.slice(1, startDot);\n ret.base = path.slice(1, end);\n } else {\n ret.name = path.slice(startPart, startDot);\n ret.base = path.slice(startPart, end);\n }\n ret.ext = path.slice(startDot, end);\n }\n\n if (startPart > 0) ret.dir = path.slice(0, startPart - 1);else if (isAbsolute) ret.dir = '/';\n\n return ret;\n },\n\n sep: '/',\n delimiter: ':',\n win32: null,\n posix: null\n};\n\nposix.posix = posix;\n\nmodule.exports = posix;\n","export var DFSOperation;\n(function (DFSOperation) {\n DFSOperation[DFSOperation[\"VISIT\"] = 0] = \"VISIT\";\n DFSOperation[DFSOperation[\"PROCESS\"] = 1] = \"PROCESS\";\n})(DFSOperation || (DFSOperation = {}));\n//# sourceMappingURL=index.js.map","export class IterableElementBase {\n /**\n * The protected constructor initializes the options for the IterableElementBase class, including the\n * toElementFn function.\n * @param [options] - An optional object that contains the following properties:\n */\n constructor(options) {\n if (options) {\n const { toElementFn } = options;\n if (typeof toElementFn === 'function')\n this._toElementFn = toElementFn;\n else if (toElementFn)\n throw new TypeError('toElementFn must be a function type');\n }\n }\n _toElementFn;\n /**\n * The function returns the _toElementFn property, which is a function that converts a raw element to\n * a specific type.\n * @returns The function `get toElementFn()` is returning either a function that takes a raw element\n * `rawElement` of type `R` and returns an element `E`, or `undefined` if no function is assigned to\n * `_toElementFn`.\n */\n get toElementFn() {\n return this._toElementFn;\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(1)\n *\n * The function is an implementation of the Symbol.iterator method that returns an IterableIterator.\n * @param {any[]} args - The `args` parameter in the code snippet represents a rest parameter. It\n * allows the function to accept any number of arguments as an array. In this case, the `args`\n * parameter is used to pass any number of arguments to the `_getIterator` method.\n */\n *[Symbol.iterator](...args) {\n yield* this._getIterator(...args);\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(n)\n *\n * The function returns an iterator that yields all the values in the object.\n */\n *values() {\n for (const item of this) {\n yield item;\n }\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(1)\n *\n * The `every` function checks if every element in the array satisfies a given predicate.\n * @param predicate - The `predicate` parameter is a callback function that takes three arguments:\n * the current element being processed, its index, and the array it belongs to. It should return a\n * boolean value indicating whether the element satisfies a certain condition or not.\n * @param {any} [thisArg] - The `thisArg` parameter is an optional argument that specifies the value\n * to be used as `this` when executing the `predicate` function. If `thisArg` is provided, it will be\n * passed as the `this` value to the `predicate` function. If `thisArg` is\n * @returns The `every` method is returning a boolean value. It returns `true` if every element in\n * the array satisfies the provided predicate function, and `false` otherwise.\n */\n every(predicate, thisArg) {\n let index = 0;\n for (const item of this) {\n if (!predicate.call(thisArg, item, index++, this)) {\n return false;\n }\n }\n return true;\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(1)\n *\n * The \"some\" function checks if at least one element in a collection satisfies a given predicate.\n * @param predicate - The `predicate` parameter is a callback function that takes three arguments:\n * `value`, `index`, and `array`. It should return a boolean value indicating whether the current\n * element satisfies the condition.\n * @param {any} [thisArg] - The `thisArg` parameter is an optional argument that specifies the value\n * to be used as the `this` value when executing the `predicate` function. If `thisArg` is provided,\n * it will be passed as the `this` value to the `predicate` function. If `thisArg\n * @returns a boolean value. It returns true if the predicate function returns true for any element\n * in the collection, and false otherwise.\n */\n some(predicate, thisArg) {\n let index = 0;\n for (const item of this) {\n if (predicate.call(thisArg, item, index++, this)) {\n return true;\n }\n }\n return false;\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(1)\n *\n * The `forEach` function iterates over each element in an array-like object and calls a callback\n * function for each element.\n * @param callbackfn - The callbackfn parameter is a function that will be called for each element in\n * the array. It takes three arguments: the current element being processed, the index of the current\n * element, and the array that forEach was called upon.\n * @param {any} [thisArg] - The `thisArg` parameter is an optional argument that specifies the value\n * to be used as `this` when executing the `callbackfn` function. If `thisArg` is provided, it will\n * be passed as the `this` value to the `callbackfn` function. If `thisArg\n */\n forEach(callbackfn, thisArg) {\n let index = 0;\n for (const item of this) {\n callbackfn.call(thisArg, item, index++, this);\n }\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(1)\n *\n * The `find` function iterates over the elements of an array-like object and returns the first\n * element that satisfies the provided callback function.\n * @param callbackfn - The callbackfn parameter is a function that will be called for each element in\n * the array. It takes three arguments: the current element being processed, the index of the current\n * element, and the array itself. The function should return a boolean value indicating whether the\n * current element matches the desired condition.\n * @param {any} [thisArg] - The `thisArg` parameter is an optional argument that specifies the value\n * to be used as `this` when executing the `callbackfn` function. If `thisArg` is provided, it will\n * be passed as the `this` value to the `callbackfn` function. If `thisArg\n * @returns The `find` method returns the first element in the array that satisfies the provided\n * callback function. If no element satisfies the callback function, `undefined` is returned.\n */\n find(callbackfn, thisArg) {\n let index = 0;\n for (const item of this) {\n if (callbackfn.call(thisArg, item, index++, this))\n return item;\n }\n return;\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(1)\n *\n * The function checks if a given element exists in a collection.\n * @param {E} element - The parameter \"element\" is of type E, which means it can be any type. It\n * represents the element that we want to check for existence in the collection.\n * @returns a boolean value. It returns true if the element is found in the collection, and false\n * otherwise.\n */\n has(element) {\n for (const ele of this) {\n if (ele === element)\n return true;\n }\n return false;\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(1)\n *\n * The `reduce` function iterates over the elements of an array-like object and applies a callback\n * function to reduce them into a single value.\n * @param callbackfn - The callbackfn parameter is a function that will be called for each element in\n * the array. It takes four arguments:\n * @param {U} initialValue - The initialValue parameter is the initial value of the accumulator. It\n * is the value that the accumulator starts with before the reduction operation begins.\n * @returns The `reduce` method is returning the final value of the accumulator after iterating over\n * all the elements in the array and applying the callback function to each element.\n */\n reduce(callbackfn, initialValue) {\n let accumulator = initialValue;\n let index = 0;\n for (const item of this) {\n accumulator = callbackfn(accumulator, item, index++, this);\n }\n return accumulator;\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(n)\n *\n * The print function logs the elements of an array to the console.\n */\n toVisual() {\n return [...this];\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(n)\n *\n * The print function logs the elements of an array to the console.\n */\n print() {\n console.log(this.toVisual());\n }\n}\n//# sourceMappingURL=iterable-element-base.js.map","/**\n * data-structure-typed\n * @author Kirk Qi\n * @copyright Copyright (c) 2022 Kirk Qi <qilinaus@gmail.com>\n * @license MIT License\n */\nimport { IterableElementBase } from '../base';\n/**\n * 1. Complete Binary Tree: Heaps are typically complete binary trees, meaning every level is fully filled except possibly for the last level, which has nodes as far left as possible.\n * 2. Heap Properties: Each node in a heap follows a specific order property, which varies depending on the type of heap:\n * Max Heap: The value of each parent node is greater than or equal to the value of its children.\n * Min Heap: The value of each parent node is less than or equal to the value of its children.\n * 3. Root Node Access: In a heap, the largest element (in a max heap) or the smallest element (in a min heap) is always at the root of the tree.\n * 4. Efficient Insertion and Deletion: Due to its structure, a heap allows for insertion and deletion operations in logarithmic time (O(log n)).\n * 5. Managing Dynamic Data Sets: Heaps effectively manage dynamic data sets, especially when frequent access to the largest or smallest elements is required.\n * 6. Non-linear Search: While a heap allows rapid access to its largest or smallest element, it is less efficient for other operations, such as searching for a specific element, as it is not designed for these tasks.\n * 7. Efficient Sorting Algorithms: For example, heap sort. Heap sort uses the properties of a heap to sort elements.\n * 8. Graph Algorithms: Such as Dijkstra's shortest path algorithm and Prime's minimum-spanning tree algorithm, which use heaps to improve performance.\n * @example\n * // Use Heap to sort an array\n * function heapSort(arr: number[]): number[] {\n * const heap = new Heap<number>(arr, { comparator: (a, b) => a - b });\n * const sorted: number[] = [];\n * while (!heap.isEmpty()) {\n * sorted.push(heap.poll()!); // Poll minimum element\n * }\n * return sorted;\n * }\n *\n * const array = [5, 3, 8, 4, 1, 2];\n * console.log(heapSort(array)); // [1, 2, 3, 4, 5, 8]\n * @example\n * // Use Heap to solve top k problems\n * function topKElements(arr: number[], k: number): number[] {\n * const heap = new Heap<number>([], { comparator: (a, b) => b - a }); // Max heap\n * arr.forEach(num => {\n * heap.add(num);\n * if (heap.size > k) heap.poll(); // Keep the heap size at K\n * });\n * return heap.toArray();\n * }\n *\n * const numbers = [10, 30, 20, 5, 15, 25];\n * console.log(topKElements(numbers, 3)); // [15, 10, 5]\n * @example\n * // Use Heap to merge sorted sequences\n * function mergeSortedSequences(sequences: number[][]): number[] {\n * const heap = new Heap<{ value: number; seqIndex: number; itemIndex: number }>([], {\n * comparator: (a, b) => a.value - b.value // Min heap\n * });\n *\n * // Initialize heap\n * sequences.forEach((seq, seqIndex) => {\n * if (seq.length) {\n * heap.add({ value: seq[0], seqIndex, itemIndex: 0 });\n * }\n * });\n *\n * const merged: number[] = [];\n * while (!heap.isEmpty()) {\n * const { value, seqIndex, itemIndex } = heap.poll()!;\n * merged.push(value);\n *\n * if (itemIndex + 1 < sequences[seqIndex].length) {\n * heap.add({\n * value: sequences[seqIndex][itemIndex + 1],\n * seqIndex,\n * itemIndex: itemIndex + 1\n * });\n * }\n * }\n *\n * return merged;\n * }\n *\n * const sequences = [\n * [1, 4, 7],\n * [2, 5, 8],\n * [3, 6, 9]\n * ];\n * console.log(mergeSortedSequences(sequences)); // [1, 2, 3, 4, 5, 6, 7, 8, 9]\n * @example\n * // Use Heap to dynamically maintain the median\n * class MedianFinder {\n * private low: MaxHeap<number>; // Max heap, stores the smaller half\n * private high: MinHeap<number>; // Min heap, stores the larger half\n *\n * constructor() {\n * this.low = new MaxHeap<number>([]);\n * this.high = new MinHeap<number>([]);\n * }\n *\n * addNum(num: number): void {\n * if (this.low.isEmpty() || num <= this.low.peek()!) this.low.add(num);\n * else this.high.add(num);\n *\n * // Balance heaps\n * if (this.low.size > this.high.size + 1) this.high.add(this.low.poll()!);\n * else if (this.high.size > this.low.size) this.low.add(this.high.poll()!);\n * }\n *\n * findMedian(): number {\n * if (this.low.size === this.high.size) return (this.low.peek()! + this.high.peek()!) / 2;\n * return this.low.peek()!;\n * }\n * }\n *\n * const medianFinder = new MedianFinder();\n * medianFinder.addNum(10);\n * console.log(medianFinder.findMedian()); // 10\n * medianFinder.addNum(20);\n * console.log(medianFinder.findMedian()); // 15\n * medianFinder.addNum(30);\n * console.log(medianFinder.findMedian()); // 20\n * medianFinder.addNum(40);\n * console.log(medianFinder.findMedian()); // 25\n * medianFinder.addNum(50);\n * console.log(medianFinder.findMedian()); // 30\n * @example\n * // Use Heap for load balancing\n * function loadBalance(requests: number[], servers: number): number[] {\n * const serverHeap = new Heap<{ id: number; load: number }>([], { comparator: (a, b) => a.load - b.load }); // min heap\n * const serverLoads = new Array(servers).fill(0);\n *\n * for (let i = 0; i < servers; i++) {\n * serverHeap.add({ id: i, load: 0 });\n * }\n *\n * requests.forEach(req => {\n * const server = serverHeap.poll()!;\n * serverLoads[server.id] += req;\n * server.load += req;\n * serverHeap.add(server); // The server after updating the load is re-entered into the heap\n * });\n *\n * return serverLoads;\n * }\n *\n * const requests = [5, 2, 8, 3, 7];\n * console.log(loadBalance(requests, 3)); // [12, 8, 5]\n * @example\n * // Use Heap to schedule tasks\n * type Task = [string, number];\n *\n * function scheduleTasks(tasks: Task[], machines: number): Map<number, Task[]> {\n * const machineHeap = new Heap<{ id: number; load: number }>([], { comparator: (a, b) => a.load - b.load }); // Min heap\n * const allocation = new Map<number, Task[]>();\n *\n * // Initialize the load on each machine\n * for (let i = 0; i < machines; i++) {\n * machineHeap.add({ id: i, load: 0 });\n * allocation.set(i, []);\n * }\n *\n * // Assign tasks\n * tasks.forEach(([task, load]) => {\n * const machine = machineHeap.poll()!;\n * allocation.get(machine.id)!.push([task, load]);\n * machine.load += load;\n * machineHeap.add(machine); // The machine after updating the load is re-entered into the heap\n * });\n *\n * return allocation;\n * }\n *\n * const tasks: Task[] = [\n * ['Task1', 3],\n * ['Task2', 1],\n * ['Task3', 2],\n * ['Task4', 5],\n * ['Task5', 4]\n * ];\n * const expectedMap = new Map<number, Task[]>();\n * expectedMap.set(0, [\n * ['Task1', 3],\n * ['Task4', 5]\n * ]);\n * expectedMap.set(1, [\n * ['Task2', 1],\n * ['Task3', 2],\n * ['Task5', 4]\n * ]);\n * console.log(scheduleTasks(tasks, 2)); // expectedMap\n */\nexport class Heap extends IterableElementBase {\n /**\n * The constructor initializes a heap data structure with optional elements and options.\n * @param elements - The `elements` parameter is an iterable object that contains the initial\n * elements to be added to the heap.\n * It is an optional parameter, and if not provided, the heap will\n * be initialized as empty.\n * @param [options] - The `options` parameter is an optional object that can contain additional\n * configuration options for the heap.\n * In this case, it is used to specify a custom comparator\n * function for comparing elements in the heap.\n * The comparator function is used to determine the\n * order of elements in the heap.\n */\n constructor(elements = [], options) {\n super(options);\n if (options) {\n const { comparator } = options;\n if (comparator)\n this._comparator = comparator;\n }\n if (elements) {\n for (const el of elements) {\n if (this.toElementFn)\n this.add(this.toElementFn(el));\n else\n this.add(el);\n }\n }\n }\n _elements = [];\n /**\n * The function returns an array of elements.\n * @returns The element array is being returned.\n */\n get elements() {\n return this._elements;\n }\n /**\n * Get the size (number of elements) of the heap.\n */\n get size() {\n return this.elements.length;\n }\n /**\n * Get the last element in the heap, which is not necessarily a leaf node.\n * @returns The last element or undefined if the heap is empty.\n */\n get leaf() {\n return this.elements[this.size - 1] ?? undefined;\n }\n /**\n * Static method that creates a binary heap from an array of elements and a comparison function.\n * @returns A new Heap instance.\n * @param elements\n * @param options\n */\n static heapify(elements, options) {\n return new Heap(elements, options);\n }\n /**\n * Time Complexity: O(log n)\n * Space Complexity: O(1)\n *\n * Insert an element into the heap and maintain the heap properties.\n * @param element - The element to be inserted.\n */\n add(element) {\n this._elements.push(element);\n return this._bubbleUp(this.elements.length - 1);\n }\n /**\n * Time Complexity: O(log n)\n * Space Complexity: O(1)\n *\n * Remove and return the top element (the smallest or largest element) from the heap.\n * @returns The top element or undefined if the heap is empty.\n */\n poll() {\n if (this.elements.length === 0)\n return;\n const value = this.elements[0];\n const last = this.elements.pop();\n if (this.elements.length) {\n this.elements[0] = last;\n this._sinkDown(0, this.elements.length >> 1);\n }\n return value;\n }\n /**\n * Time Complexity: O(1)\n * Space Complexity: O(1)\n *\n * Peek at the top element of the heap without removing it.\n * @returns The top element or undefined if the heap is empty.\n */\n peek() {\n return this.elements[0];\n }\n /**\n * Check if the heap is empty.\n * @returns True if the heap is empty, otherwise false.\n */\n isEmpty() {\n return this.size === 0;\n }\n /**\n * Reset the elements of the heap. Make the elements empty.\n */\n clear() {\n this._elements = [];\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(n)\n *\n * Clear and add elements of the heap\n * @param elements\n */\n refill(elements) {\n this._elements = elements;\n return this.fix();\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(1)\n *\n * Use a comparison function to check whether a binary heap contains a specific element.\n * @param element - the element to check.\n * @returns Returns true if the specified element is contained; otherwise, returns false.\n */\n has(element) {\n return this.elements.includes(element);\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(1)\n *\n * The `delete` function removes an element from an array-like data structure, maintaining the order\n * and structure of the remaining elements.\n * @param {E} element - The `element` parameter represents the element that you want to delete from\n * the array `this.elements`.\n * @returns The `delete` function is returning a boolean value. It returns `true` if the element was\n * successfully deleted from the array, and `false` if the element was not found in the array.\n */\n delete(element) {\n const index = this.elements.indexOf(element);\n if (index < 0)\n return false;\n if (index === 0) {\n this.poll();\n }\n else if (index === this.elements.length - 1) {\n this.elements.pop();\n }\n else {\n this.elements.splice(index, 1, this.elements.pop());\n this._bubbleUp(index);\n this._sinkDown(index, this.elements.length >> 1);\n }\n return true;\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(log n)\n *\n * Depth-first search (DFS) method, different traversal orders can be selected。\n * @param order - Traverse order parameter: 'IN' (in-order), 'PRE' (pre-order) or 'POST' (post-order).\n * @returns An array containing elements traversed in the specified order.\n */\n dfs(order = 'PRE') {\n const result = [];\n // Auxiliary recursive function, traverses the binary heap according to the traversal order\n const _dfs = (index) => {\n const left = 2 * index + 1, right = left + 1;\n if (index < this.size) {\n if (order === 'IN') {\n _dfs(left);\n result.push(this.elements[index]);\n _dfs(right);\n }\n else if (order === 'PRE') {\n result.push(this.elements[index]);\n _dfs(left);\n _dfs(right);\n }\n else if (order === 'POST') {\n _dfs(left);\n _dfs(right);\n result.push(this.elements[index]);\n }\n }\n };\n _dfs(0); // Traverse starting from the root node\n return result;\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(n)\n *\n * Convert the heap to an array.\n * @returns An array containing the elements of the heap.\n */\n toArray() {\n return [...this.elements];\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(n)\n *\n * Clone the heap, creating a new heap with the same elements.\n * @returns A new Heap instance containing the same elements.\n */\n clone() {\n return new Heap(this, { comparator: this.comparator, toElementFn: this.toElementFn });\n }\n /**\n * Time Complexity: O(n log n)\n * Space Complexity: O(n)\n *\n * Sort the elements in the heap and return them as an array.\n * @returns An array containing the elements sorted in ascending order.\n */\n sort() {\n const visitedNode = [];\n const cloned = new Heap(this, { comparator: this.comparator });\n while (cloned.size !== 0) {\n const top = cloned.poll();\n if (top !== undefined)\n visitedNode.push(top);\n }\n return visitedNode;\n }\n /**\n * Time Complexity: O(n log n)\n * Space Complexity: O(n)\n *\n * Fix the entire heap to maintain heap properties.\n */\n fix() {\n const results = [];\n for (let i = Math.floor(this.size / 2); i >= 0; i--)\n results.push(this._sinkDown(i, this.elements.length >> 1));\n return results;\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(n)\n *\n * The `filter` function creates a new Heap object containing elements that pass a given callback\n * function.\n * @param callback - The `callback` parameter is a function that will be called for each element in\n * the heap. It takes three arguments: the current element, the index of the current element, and the\n * heap itself. The callback function should return a boolean value indicating whether the current\n * element should be included in the filtered list\n * @param {any} [thisArg] - The `thisArg` parameter is an optional argument that specifies the value\n * to be used as `this` when executing the `callback` function. If `thisArg` is provided, it will be\n * passed as the `this` value to the `callback` function. If `thisArg` is\n * @returns The `filter` method is returning a new `Heap` object that contains the elements that pass\n * the filter condition specified by the `callback` function.\n */\n filter(callback, thisArg) {\n const filteredList = new Heap([], { toElementFn: this.toElementFn, comparator: this.comparator });\n let index = 0;\n for (const current of this) {\n if (callback.call(thisArg, current, index, this)) {\n filteredList.add(current);\n }\n index++;\n }\n return filteredList;\n }\n /**\n * Time Complexity: O(n log n)\n * Space Complexity: O(n)\n *\n * The `map` function creates a new heap by applying a callback function to each element of the\n * original heap.\n * @param callback - The `callback` parameter is a function that will be called for each element in\n * the heap. It takes three arguments: `el` (the current element), `index` (the index of the current\n * element), and `this` (the heap itself). The callback function should return a value of\n * @param comparator - The `comparator` parameter is a function that defines the order of the\n * elements in the heap. It takes two elements `a` and `b` as arguments and returns a negative number\n * if `a` should be placed before `b`, a positive number if `a` should be placed after\n * @param [toElementFn] - The `toElementFn` parameter is an optional function that converts the raw\n * element `RR` to the desired type `T`. It takes a single argument `rawElement` of type `RR` and\n * returns a value of type `T`. This function is used to transform the elements of the original\n * @param {any} [thisArg] - The `thisArg` parameter is an optional argument that allows you to\n * specify the value of `this` within the callback function. It is used to set the context or scope\n * in which the callback function will be executed. If `thisArg` is provided, it will be used as the\n * value of\n * @returns a new instance of the `Heap` class with the mapped elements.\n */\n map(callback, comparator, toElementFn, thisArg) {\n const mappedHeap = new Heap([], { comparator, toElementFn });\n let index = 0;\n for (const el of this) {\n mappedHeap.add(callback.call(thisArg, el, index, this));\n index++;\n }\n return mappedHeap;\n }\n _DEFAULT_COMPARATOR = (a, b) => {\n if (typeof a === 'object' || typeof b === 'object') {\n throw TypeError(`When comparing object types, a custom comparator must be defined in the constructor's options parameter.`);\n }\n if (a > b)\n return 1;\n if (a < b)\n return -1;\n return 0;\n };\n _comparator = this._DEFAULT_COMPARATOR;\n /**\n * The function returns the value of the _comparator property.\n * @returns The `_comparator` property is being returned.\n */\n get comparator() {\n return this._comparator;\n }\n /**\n * The function `_getIterator` returns an iterable iterator for the elements in the class.\n */\n *_getIterator() {\n for (const element of this.elements) {\n yield element;\n }\n }\n /**\n * Time Complexity: O(log n)\n * Space Complexity: O(1)\n *\n * Float operation to maintain heap properties after adding an element.\n * @param index - The index of the newly added element.\n */\n _bubbleUp(index) {\n const element = this.elements[index];\n while (index > 0) {\n const parent = (index - 1) >> 1;\n const parentItem = this.elements[parent];\n if (this.comparator(parentItem, element) <= 0)\n break;\n this.elements[index] = parentItem;\n index = parent;\n }\n this.elements[index] = element;\n return true;\n }\n /**\n * Time Complexity: O(log n)\n * Space Complexity: O(1)\n *\n * Sinking operation to maintain heap properties after removing the top element.\n * @param index - The index from which to start sinking.\n * @param halfLength\n */\n _sinkDown(index, halfLength) {\n const element = this.elements[index];\n while (index < halfLength) {\n let left = (index << 1) | 1;\n const right = left + 1;\n let minItem = this.elements[left];\n if (right < this.elements.length && this.comparator(minItem, this.elements[right]) > 0) {\n left = right;\n minItem = this.elements[right];\n }\n if (this.comparator(minItem, element) >= 0)\n break;\n this.elements[index] = minItem;\n index = left;\n }\n this.elements[index] = element;\n return true;\n }\n}\nexport class FibonacciHeapNode {\n element;\n degree;\n left;\n right;\n child;\n parent;\n marked;\n /**\n * The constructor function initializes an object with an element and a degree, and sets the marked\n * property to false.\n * @param {E} element - The \"element\" parameter represents the value or data that will be stored in\n * the node of a data structure. It can be any type of data, such as a number, string, object, or\n * even another data structure.\n * @param [degree=0] - The degree parameter represents the degree of the element in a data structure\n * called a Fibonacci heap. The degree of a node is the number of children it has. By default, the\n * degree is set to 0 when a new node is created.\n */\n constructor(element, degree = 0) {\n this.element = element;\n this.degree = degree;\n this.marked = false;\n }\n}\nexport class FibonacciHeap {\n /**\n * The constructor function initializes a FibonacciHeap object with an optional comparator function.\n * @param [comparator] - The `comparator` parameter is an optional argument that represents a\n * function used to compare elements in the FibonacciHeap. If a comparator function is provided, it\n * will be used to determine the order of elements in the heap. If no comparator function is\n * provided, a default comparator function will be used.\n */\n constructor(comparator) {\n this.clear();\n this._comparator = comparator || this._defaultComparator;\n if (typeof this.comparator !== 'function') {\n throw new Error('FibonacciHeap constructor: given comparator should be a function.');\n }\n }\n _root;\n /**\n * The function returns the root node of a Fibonacci heap.\n * @returns The method is returning either a FibonacciHeapNode object or undefined.\n */\n get root() {\n return this._root;\n }\n _size = 0;\n /**\n * The function returns the size of an object.\n * @returns The size of the object, which is a number.\n */\n get size() {\n return this._size;\n }\n _min;\n /**\n * The function returns the minimum node in a Fibonacci heap.\n * @returns The method is returning the minimum node of the Fibonacci heap, which is of type\n * `FibonacciHeapNode<E>`. If there is no minimum node, it will return `undefined`.\n */\n get min() {\n return this._min;\n }\n _comparator;\n /**\n * The function returns the comparator used for comparing elements.\n * @returns The `_comparator` property of the object.\n */\n get comparator() {\n return this._comparator;\n }\n /**\n * Get the size (number of elements) of the heap.\n * @returns {number} The size of the heap. Returns 0 if the heap is empty. Returns -1 if the heap is invalid.\n */\n clear() {\n this._root = undefined;\n this._min = undefined;\n this._size = 0;\n }\n /**\n * Time Complexity: O(1)\n * Space Complexity: O(1)\n *\n * Insert an element into the heap and maintain the heap properties.\n * @param element\n * @returns {FibonacciHeap<E>} FibonacciHeap<E> - The heap itself.\n */\n add(element) {\n return this.push(element);\n }\n /**\n * Time Complexity: O(1)\n * Space Complexity: O(1)\n *\n * Insert an element into the heap and maintain the heap properties.\n * @param element\n * @returns {FibonacciHeap<E>} FibonacciHeap<E> - The heap itself.\n */\n push(element) {\n const node = this.createNode(element);\n node.left = node;\n node.right = node;\n this.mergeWithRoot(node);\n if (!this.min || this.comparator(node.element, this.min.element) <= 0) {\n this._min = node;\n }\n this._size++;\n return this;\n }\n /**\n * Time Complexity: O(1)\n * Space Complexity: O(1)\n *\n * Peek at the top element of the heap without removing it.\n * @returns The top element or undefined if the heap is empty.\n * @protected\n */\n peek() {\n return this.min ? this.min.element : undefined;\n }\n /**\n * Time Complexity: O(n), where n is the number of elements in the linked list.\n * Space Complexity: O(1)\n *\n * Get the size (number of elements) of the heap.\n * @param {FibonacciHeapNode<E>} head - The head of the linked list.\n * @protected\n * @returns FibonacciHeapNode<E>[] - An array containing the elements of the linked list.\n */\n consumeLinkedList(head) {\n const elements = [];\n if (!head)\n return elements;\n let node = head;\n let flag = false;\n while (true) {\n if (node === head && flag)\n break;\n else if (node === head)\n flag = true;\n if (node) {\n elements.push(node);\n node = node.right;\n }\n }\n return elements;\n }\n /**\n * Time Complexity: O(1)\n * Space Complexity: O(1)\n *\n * @param parent\n * @param node\n */\n mergeWithChild(parent, node) {\n if (!parent.child) {\n parent.child = node;\n }\n else {\n node.right = parent.child.right;\n node.left = parent.child;\n parent.child.right.left = node;\n parent.child.right = node;\n }\n }\n /**\n * Time Complexity: O(log n)\n * Space Complexity: O(1)\n *\n * Remove and return the top element (the smallest or largest element) from the heap.\n * @returns The top element or undefined if the heap is empty.\n */\n poll() {\n return this.pop();\n }\n /**\n * Time Complexity: O(log n)\n * Space Complexity: O(1)\n *\n * Remove and return the top element (the smallest or largest element) from the heap.\n * @returns The top element or undefined if the heap is empty.\n */\n pop() {\n if (this._size === 0)\n return undefined;\n const z = this.min;\n if (z.child) {\n const elements = this.consumeLinkedList(z.child);\n for (const node of elements) {\n this.mergeWithRoot(node);\n node.parent = undefined;\n }\n }\n this.removeFromRoot(z);\n if (z === z.right) {\n this._min = undefined;\n this._root = undefined;\n }\n else {\n this._min = z.right;\n this._consolidate();\n }\n this._size--;\n return z.element;\n }\n /**\n * Time Complexity: O(1)\n * Space Complexity: O(1)\n *\n * merge two heaps. The heap that is merged will be cleared. The heap that is merged into will remain.\n * @param heapToMerge\n */\n merge(heapToMerge) {\n if (heapToMerge.size === 0) {\n return; // Nothing to merge\n }\n // Merge the root lists of the two heaps\n if (this.root && heapToMerge.root) {\n const thisRoot = this.root;\n const otherRoot = heapToMerge.root;\n const thisRootRight = thisRoot.right;\n const otherRootLeft = otherRoot.left;\n thisRoot.right = otherRoot;\n otherRoot.left = thisRoot;\n thisRootRight.left = otherRootLeft;\n otherRootLeft.right = thisRootRight;\n }\n // Update the minimum node\n if (!this.min || (heapToMerge.min && this.comparator(heapToMerge.min.element, this.min.element) < 0)) {\n this._min = heapToMerge.min;\n }\n // Update the size\n this._size += heapToMerge.size;\n // Clear the heap that was merged\n heapToMerge.clear();\n }\n /**\n * Create a new node.\n * @param element\n * @protected\n */\n createNode(element) {\n return new FibonacciHeapNode(element);\n }\n /**\n * Default comparator function used by the heap.\n * @param {E} a\n * @param {E} b\n * @protected\n */\n _defaultComparator(a, b) {\n if (a < b)\n return -1;\n if (a > b)\n return 1;\n return 0;\n }\n /**\n * Time Complexity: O(1)\n * Space Complexity: O(1)\n *\n * Merge the given node with the root list.\n * @param node - The node to be merged.\n */\n mergeWithRoot(node) {\n if (!this.root) {\n this._root = node;\n }\n else {\n node.right = this.root.right;\n node.left = this.root;\n this.root.right.left = node;\n this.root.right = node;\n }\n }\n /**\n * Time Complexity: O(1)\n * Space Complexity: O(1)\n *\n * Remove and return the top element (the smallest or largest element) from the heap.\n * @param node - The node to be removed.\n * @protected\n */\n removeFromRoot(node) {\n if (this.root === node)\n this._root = node.right;\n if (node.left)\n node.left.right = node.right;\n if (node.right)\n node.right.left = node.left;\n }\n /**\n * Time Complexity: O(1)\n * Space Complexity: O(1)\n *\n * Remove and return the top element (the smallest or largest element) from the heap.\n * @param y\n * @param x\n * @protected\n */\n _link(y, x) {\n this.removeFromRoot(y);\n y.left = y;\n y.right = y;\n this.mergeWithChild(x, y);\n x.degree++;\n y.parent = x;\n }\n /**\n * Time Complexity: O(n log n)\n * Space Complexity: O(n)\n *\n * Remove and return the top element (the smallest or largest element) from the heap.\n * @protected\n */\n _consolidate() {\n const A = new Array(this._size);\n const elements = this.consumeLinkedList(this.root);\n let x, y, d, t;\n for (const node of elements) {\n x = node;\n d = x.degree;\n while (A[d]) {\n y = A[d];\n if (this.comparator(x.element, y.element) > 0) {\n t = x;\n x = y;\n y = t;\n }\n this._link(y, x);\n A[d] = undefined;\n d++;\n }\n A[d] = x;\n }\n for (let i = 0; i < this._size; i++) {\n if (A[i] && this.comparator(A[i].element, this.min.element) <= 0) {\n this._min = A[i];\n }\n }\n }\n}\n//# sourceMappingURL=heap.js.map","import { Heap } from '../heap';\n/**\n * 1. Element Priority: In a PriorityQueue, elements are sorted according to their priority. Each dequeue (element removal) operation removes the element with the highest priority. The priority can be determined based on the natural ordering of the elements or through a provided comparator (Comparator).\n * 2. Heap-Based Implementation: PriorityQueue is typically implemented using a binary heap, allowing both insertion and removal operations to be completed in O(log n) time, where n is the number of elements in the queue.\n * 3. Task Scheduling: In systems where tasks need to be processed based on the urgency of tasks rather than the order of arrival.\n * 4. Dijkstra's Algorithm: In shortest path algorithms for graphs, used to select the next shortest edge to visit.\n * 5. Huffman Coding: Used to select the smallest node combination when constructing a Huffman tree.\n * 6. Kth Largest Element in a Data Stream: Used to maintain a min-heap of size K for quickly finding the Kth largest element in stream data\n */\nexport class PriorityQueue extends Heap {\n /**\n * The constructor initializes a priority queue with optional elements and options.\n * @param elements - The `elements` parameter is an iterable object that contains the initial\n * elements to be added to the priority queue. It is an optional parameter, and if not provided, the\n * priority queue will be initialized as empty.\n * @param [options] - The `options` parameter is an optional object that can be used to customize the\n * behavior of the priority queue. It can contain the following properties:\n */\n constructor(elements = [], options) {\n super(elements, options);\n }\n /**\n * The `clone` function returns a new instance of the `PriorityQueue` class with the same comparator\n * and toElementFn as the original instance.\n * @returns The method is returning a new instance of the `PriorityQueue` class with the same\n * elements and properties as the current instance.\n */\n clone() {\n return new PriorityQueue(this, { comparator: this.comparator, toElementFn: this.toElementFn });\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(n)\n *\n * The `filter` function creates a new PriorityQueue object containing elements that pass a given callback\n * function.\n * @param callback - The `callback` parameter is a function that will be called for each element in\n * the heap. It takes three arguments: the current element, the index of the current element, and the\n * heap itself. The callback function should return a boolean value indicating whether the current\n * element should be included in the filtered list\n * @param {any} [thisArg] - The `thisArg` parameter is an optional argument that specifies the value\n * to be used as `this` when executing the `callback` function. If `thisArg` is provided, it will be\n * passed as the `this` value to the `callback` function. If `thisArg` is\n * @returns The `filter` method is returning a new `PriorityQueue` object that contains the elements that pass\n * the filter condition specified by the `callback` function.\n */\n filter(callback, thisArg) {\n const filteredPriorityQueue = new PriorityQueue([], {\n toElementFn: this.toElementFn,\n comparator: this.comparator\n });\n let index = 0;\n for (const current of this) {\n if (callback.call(thisArg, current, index, this)) {\n filteredPriorityQueue.add(current);\n }\n index++;\n }\n return filteredPriorityQueue;\n }\n /**\n * Time Complexity: O(n log n)\n * Space Complexity: O(n)\n *\n * The `map` function creates a new heap by applying a callback function to each element of the\n * original heap.\n * @param callback - The `callback` parameter is a function that will be called for each element in\n * the heap. It takes three arguments: `el` (the current element), `index` (the index of the current\n * element), and `this` (the heap itself). The callback function should return a value of\n * @param comparator - The `comparator` parameter is a function that defines the order of the\n * elements in the heap. It takes two elements `a` and `b` as arguments and returns a negative number\n * if `a` should be placed before `b`, a positive number if `a` should be placed after\n * @param [toElementFn] - The `toElementFn` parameter is an optional function that converts the raw\n * element `RR` to the desired type `T`. It takes a single argument `rawElement` of type `RR` and\n * returns a value of type `T`. This function is used to transform the elements of the original\n * @param {any} [thisArg] - The `thisArg` parameter is an optional argument that allows you to\n * specify the value of `this` within the callback function. It is used to set the context or scope\n * in which the callback function will be executed. If `thisArg` is provided, it will be used as the\n * value of\n * @returns a new instance of the `PriorityQueue` class with the mapped elements.\n */\n map(callback, comparator, toElementFn, thisArg) {\n const mappedPriorityQueue = new PriorityQueue([], { comparator, toElementFn });\n let index = 0;\n for (const el of this) {\n mappedPriorityQueue.add(callback.call(thisArg, el, index, this));\n index++;\n }\n return mappedPriorityQueue;\n }\n}\n//# sourceMappingURL=priority-queue.js.map","import { PriorityQueue } from './priority-queue';\nexport class MinPriorityQueue extends PriorityQueue {\n /**\n * The constructor initializes a PriorityQueue with optional elements and options, including a\n * comparator function.\n * @param elements - The `elements` parameter is an iterable object that contains the initial\n * elements to be added to the priority queue. It is optional and defaults to an empty array if not\n * provided.\n * @param options - The `options` parameter is an object that contains additional configuration\n * options for the priority queue. In this case, it has a property called `comparator,` which is a\n * function used to compare elements in the priority queue. The `comparator` function takes two\n * parameters `a` and `b`\n */\n constructor(elements = [], options) {\n super(elements, options);\n }\n /**\n * The `clone` function returns a new instance of the `MinPriorityQueue` class with the same\n * comparator and toElementFn as the original instance.\n * @returns The method is returning a new instance of the `MinPriorityQueue` class with the same\n * properties as the current instance.\n */\n clone() {\n return new MinPriorityQueue(this, { comparator: this.comparator, toElementFn: this.toElementFn });\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(n)\n *\n * The `filter` function creates a new MinPriorityQueue object containing elements that pass a given callback\n * function.\n * @param callback - The `callback` parameter is a function that will be called for each element in\n * the heap. It takes three arguments: the current element, the index of the current element, and the\n * heap itself. The callback function should return a boolean value indicating whether the current\n * element should be included in the filtered list\n * @param {any} [thisArg] - The `thisArg` parameter is an optional argument that specifies the value\n * to be used as `this` when executing the `callback` function. If `thisArg` is provided, it will be\n * passed as the `this` value to the `callback` function. If `thisArg` is\n * @returns The `filter` method is returning a new `MinPriorityQueue` object that contains the elements that pass\n * the filter condition specified by the `callback` function.\n */\n filter(callback, thisArg) {\n const filteredPriorityQueue = new MinPriorityQueue([], {\n toElementFn: this.toElementFn,\n comparator: this.comparator\n });\n let index = 0;\n for (const current of this) {\n if (callback.call(thisArg, current, index, this)) {\n filteredPriorityQueue.add(current);\n }\n index++;\n }\n return filteredPriorityQueue;\n }\n /**\n * Time Complexity: O(n log n)\n * Space Complexity: O(n)\n *\n * The `map` function creates a new heap by applying a callback function to each element of the\n * original heap.\n * @param callback - The `callback` parameter is a function that will be called for each element in\n * the heap. It takes three arguments: `el` (the current element), `index` (the index of the current\n * element), and `this` (the heap itself). The callback function should return a value of\n * @param comparator - The `comparator` parameter is a function that defines the order of the\n * elements in the heap. It takes two elements `a` and `b` as arguments and returns a negative number\n * if `a` should be placed before `b`, a positive number if `a` should be placed after\n * @param [toElementFn] - The `toElementFn` parameter is an optional function that converts the raw\n * element `RR` to the desired type `T`. It takes a single argument `rawElement` of type `RR` and\n * returns a value of type `T`. This function is used to transform the elements of the original\n * @param {any} [thisArg] - The `thisArg` parameter is an optional argument that allows you to\n * specify the value of `this` within the callback function. It is used to set the context or scope\n * in which the callback function will be executed. If `thisArg` is provided, it will be used as the\n * value of\n * @returns a new instance of the `MinPriorityQueue` class with the mapped elements.\n */\n map(callback, comparator, toElementFn, thisArg) {\n const mappedPriorityQueue = new MinPriorityQueue([], { comparator, toElementFn });\n let index = 0;\n for (const el of this) {\n mappedPriorityQueue.add(callback.call(thisArg, el, index, this));\n index++;\n }\n return mappedPriorityQueue;\n }\n}\n//# sourceMappingURL=min-priority-queue.js.map","// Import necessary classes from three.js\r\nimport { Box3, Vector3, Ray } from 'three';\r\n\r\n\r\nconst tmpBox3 = new Box3();\r\nconst tmpVector1 = new Vector3();\r\nconst tmpVector2 = new Vector3();\r\nconst tmpVector3 = new Vector3();\r\nconst tmpVector4 = new Vector3();\r\n\r\n\r\n/**\r\n * Octree class for splats raycast.\r\n */\r\nclass SplatsCollider {\r\n /**\r\n * @param {Box3} bounds - The bounding box of the octree node.\r\n * @param {number} maxPoints - Maximum number of points per node before subdivision.\r\n * @param {number} [threshold] - Optional threshold. If not provided, it defaults to bounds diagonal / 100000.\r\n */\r\n constructor(bounds, maxPoints, threshold = undefined) {\r\n this.bounds = new Box3();\r\n this.bounds.copy(bounds);\r\n this.maxPointsPerNode = maxPoints;\r\n this.points = [];\r\n this.children = null;\r\n\r\n if (threshold !== undefined) {\r\n this.threshold = threshold;\r\n } else {\r\n tmpVector1.subVectors(bounds.max, bounds.min);\r\n this.threshold = tmpVector1.length() / 100000;\r\n }\r\n }\r\n\r\n /**\r\n * Inserts a splat object into the Octree.\r\n * @param {Object} splat - The splat object with a Vector3 'center' property.\r\n */\r\n insert(splat) {\r\n const center = splat.center;\r\n\r\n if (!this.bounds.containsPoint(center)) return;\r\n\r\n if (this.children === null) {\r\n if (this.points.length < this.maxPointsPerNode) {\r\n this.points.push(splat);\r\n } else {\r\n this.subdivide();\r\n this.insert(splat);\r\n }\r\n } else {\r\n const index = this.getChildIndex(center);\r\n this.children[index].insert(splat);\r\n }\r\n }\r\n\r\n /**\r\n * Queries the Octree with a Ray to find all splats within a threshold.\r\n * Returns the splats ordered front to back relative to the ray origin.\r\n * @param {Ray} ray - The three.js Ray object.\r\n * @param {number} [threshold=this.threshold] - The maximum allowed distance from the ray.\r\n * @returns {Array<{ t: number, splat: Object }>} - Array of splats within the threshold, sorted by t ascending.\r\n */\r\n query(ray, queryResults, threshold = this.threshold) {\r\n this.queryRecursive(ray, queryResults, threshold);\r\n }\r\n\r\n /**\r\n * Recursively queries the Octree to find all splats within a threshold.\r\n * @private\r\n * @param {Ray} ray - The three.js Ray object.\r\n * @param {number} threshold - The maximum allowed distance from the ray.\r\n */\r\n queryRecursive(ray, queryResults, threshold) {\r\n // Expand the bounds by the threshold\r\n tmpBox3.copy(this.bounds).expandByScalar(threshold);\r\n\r\n // Check if the ray intersects the expanded bounds\r\n if (!ray.intersectBox(tmpBox3, tmpVector1)) return;\r\n\r\n if (this.children === null) {\r\n for (let splat of this.points) {\r\n const center = splat.center;\r\n\r\n // Find the closest point on the ray to the splat center\r\n ray.closestPointToPoint(center, tmpVector1);\r\n\r\n // Vector from ray origin to the closest point\r\n tmpVector2.copy(tmpVector1).sub(ray.origin);\r\n\r\n // Calculate t parameter along the ray\r\n const t = tmpVector2.dot(ray.direction);\r\n\r\n // Ignore splats behind the ray origin\r\n if (t < 0) continue;\r\n\r\n // Calculate the distance from the splat center to the closest point on the ray\r\n const distance = center.distanceTo(tmpVector1);\r\n\r\n if (distance <= threshold) {\r\n // Add the splat and its t to the query results\r\n queryResults.push({ distance: t, point: center });\r\n }\r\n }\r\n } else {\r\n for (let child of this.children) {\r\n child.queryRecursive(ray, queryResults, threshold);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Determines which child Octree node the point belongs to.\r\n * @private\r\n * @param {Vector3} point - The point to determine the child index for.\r\n * @returns {number} - The index of the child node (0-7).\r\n */\r\n getChildIndex(point) {\r\n let index = 0;\r\n this.bounds.getCenter(tmpVector1);\r\n\r\n if (point.x >= tmpVector1.x) index |= 1;\r\n if (point.y >= tmpVector1.y) index |= 2;\r\n if (point.z >= tmpVector1.z) index |= 4;\r\n\r\n return index;\r\n }\r\n\r\n /**\r\n * Subdivides the current Octree node into eight children.\r\n * @private\r\n */\r\n subdivide() {\r\n this.children = new Array(8);\r\n\r\n // Calculate half the size of the current node's bounds\r\n tmpVector1.copy(this.bounds.max).sub(this.bounds.min).multiplyScalar(0.5); // size / 2\r\n\r\n // Copy the minimum bounds of the current node\r\n const parentMin = tmpVector2.copy(this.bounds.min);\r\n\r\n for (let i = 0; i < 8; i++) {\r\n // Start with the parent minimum bounds\r\n tmpVector3.copy(parentMin);\r\n\r\n // Adjust the child min based on the index bits\r\n if (i & 1) tmpVector3.x += tmpVector1.x;\r\n if (i & 2) tmpVector3.y += tmpVector1.y;\r\n if (i & 4) tmpVector3.z += tmpVector1.z;\r\n\r\n // Calculate child max by adding the half size to child min\r\n tmpVector4.copy(tmpVector3).add(tmpVector1); // childMax = childMin + halfSize\r\n\r\n // Set up child bounds using pre-defined temporary Box3\r\n tmpBox3.set(tmpVector3, tmpVector4);\r\n\r\n // Create a new child Octree node with the calculated bounds\r\n this.children[i] = new SplatsCollider(tmpBox3, this.maxPointsPerNode, this.threshold);\r\n }\r\n\r\n // Re-insert existing splats into the appropriate children\r\n for (let splat of this.points) {\r\n const index = this.getChildIndex(splat.center);\r\n this.children[index].insert(splat);\r\n }\r\n\r\n // Clear points from the current node\r\n this.points = null;\r\n }\r\n}\r\n\r\nexport { SplatsCollider };\r\n","import {\r\n Mesh, InstancedMesh, ShaderMaterial, Vector2, Vector3, Vector4, Box2, Box3, DataArrayTexture,\r\n FloatType, HalfFloatType, RGBFormat, RGBAFormat, FrontSide, AlwaysDepth, PlaneGeometry, Matrix3,\r\n NearestFilter, Data3DTexture, DataTexture, UnsignedByteType, BufferAttribute, InstancedBufferAttribute, DynamicDrawUsage,\r\n LinearSRGBColorSpace, InstancedBufferGeometry,\r\n WebGL3DRenderTarget, OrthographicCamera, Scene,\r\n NeverDepth\r\n} from \"three\";\r\nimport {\r\n MinPriorityQueue\r\n} from 'data-structure-typed';\r\nimport { SplatsCollider } from \"./SplatsColider\";\r\nimport WorkerConstructor from './PointsManager.worker.js?worker';\r\n\r\nconst tmpVector = new Vector3();\r\nconst tmpVector2 = new Vector3();\r\nconst zUpToYUpMatrix3x3 = new Matrix3();\r\nzUpToYUpMatrix3x3.set(\r\n 1, 0, 0,\r\n 0, 0, 1,\r\n 0, -1, 0);\r\n\r\nclass SplatsMesh extends Mesh {\r\n constructor(renderer, fragShader) {\r\n\r\n const textureSize = 512;\r\n\r\n const numTextures = 1;\r\n const batchSize = Math.min(Math.ceil(4096 / textureSize) * textureSize, Math.pow(textureSize, 2));\r\n let maxSplats = numTextures * Math.pow(textureSize, 2);\r\n maxSplats = Math.floor(maxSplats / batchSize) * batchSize;\r\n\r\n\r\n const colorRenderTarget = new WebGL3DRenderTarget(textureSize, textureSize, numTextures, {\r\n magFilter: NearestFilter,\r\n minFilter: NearestFilter,\r\n anisotropy: 0,\r\n depthBuffer: false,\r\n resolveDepthBuffer: false,\r\n })\r\n renderer.initRenderTarget(colorRenderTarget);\r\n\r\n const positionRenderTarget = new WebGL3DRenderTarget(textureSize, textureSize, numTextures, {\r\n magFilter: NearestFilter,\r\n minFilter: NearestFilter,\r\n anisotropy: 0,\r\n type: FloatType,\r\n depthBuffer: false,\r\n resolveDepthBuffer: false,\r\n })\r\n positionRenderTarget.texture.type = FloatType;\r\n renderer.initRenderTarget(positionRenderTarget);\r\n const cov1RenderTarget = new WebGL3DRenderTarget(textureSize, textureSize, numTextures, {\r\n magFilter: NearestFilter,\r\n minFilter: NearestFilter,\r\n anisotropy: 0,\r\n type: FloatType,\r\n depthBuffer: false,\r\n resolveDepthBuffer: false,\r\n })\r\n cov1RenderTarget.texture.type = FloatType;\r\n renderer.initRenderTarget(cov1RenderTarget);\r\n const cov2RenderTarget = new WebGL3DRenderTarget(textureSize, textureSize, numTextures, {\r\n magFilter: NearestFilter,\r\n minFilter: NearestFilter,\r\n anisotropy: 0,\r\n type: FloatType,\r\n depthBuffer: false,\r\n resolveDepthBuffer: false,\r\n })\r\n cov2RenderTarget.texture.type = FloatType;\r\n renderer.initRenderTarget(cov2RenderTarget);\r\n\r\n\r\n const material = new ShaderMaterial(\r\n {\r\n uniforms: {\r\n textureSize: { value: textureSize },\r\n numSlices: { value: numTextures },\r\n cov1Texture: { value: cov1RenderTarget.texture },\r\n cov2Texture: { value: cov2RenderTarget.texture },\r\n colorTexture: { value: colorRenderTarget.texture },\r\n positionTexture: { value: positionRenderTarget.texture },\r\n zUpToYUpMatrix3x3: { value: zUpToYUpMatrix3x3 },\r\n sizeMultiplier: { value: 1 },\r\n cropRadius: { value: Number.MAX_VALUE },\r\n cameraNear: {value: 0.01},\r\n cameraFar: {value: 10},\r\n computeLinearDepth:{value: true}\r\n },\r\n vertexShader: splatsVertexShader(),\r\n fragmentShader: fragShader?fragShader:splatsFragmentShader(),\r\n transparent: true,\r\n side: FrontSide,\r\n depthTest: false,\r\n depthWrite: false,\r\n //depthFunc: AlwaysDepth\r\n }\r\n );\r\n const geometry = new InstancedBufferGeometry();\r\n const vertices = new Float32Array([-0.5, 0.5, 0, 0.5, 0.5, 0, -0.5, -0.5, 0, 0.5, -0.5, 0]);\r\n const indices = [0, 2, 1, 2, 3, 1];\r\n\r\n geometry.setIndex(indices);\r\n geometry.setAttribute('position', new BufferAttribute(vertices, 3));\r\n const order = new Uint32Array(maxSplats);\r\n\r\n const orderAttribute = new InstancedBufferAttribute(order, 1, false);\r\n orderAttribute.needsUpdate = true\r\n orderAttribute.setUsage(DynamicDrawUsage);\r\n geometry.setAttribute('order', orderAttribute);\r\n geometry.instanceCount = 0;\r\n\r\n\r\n super(geometry, material);\r\n\r\n this.orderAttribute = orderAttribute;\r\n this.textureSize = textureSize;\r\n this.numTextures = numTextures;\r\n this.batchSize = batchSize;\r\n this.maxSplats = maxSplats;\r\n\r\n this.colorRenderTarget = colorRenderTarget;\r\n this.positionRenderTarget = positionRenderTarget;\r\n this.cov1RenderTarget = cov1RenderTarget;\r\n this.cov2RenderTarget = cov2RenderTarget;\r\n\r\n this.renderer = renderer;\r\n\r\n this.sortID = 0;\r\n\r\n this.freeAddresses = new MinPriorityQueue();\r\n for (let i = 0; i < this.maxSplats; i += batchSize) {\r\n this.freeAddresses.add(i);\r\n }\r\n\r\n this.worker = new WorkerConstructor({ type: 'module' });\r\n\r\n this.sortListeners = [];\r\n this.worker.onmessage = message => {\r\n const newOrder = new Uint32Array(message.data.order);\r\n if (newOrder.length > this.orderAttribute.count) {\r\n const geometry = new InstancedBufferGeometry();\r\n const vertices = new Float32Array([-0.5, 0.5, 0, 0.5, 0.5, 0, -0.5, -0.5, 0, 0.5, -0.5, 0]);\r\n const indices = [0, 2, 1, 2, 3, 1];\r\n\r\n geometry.setIndex(indices);\r\n geometry.setAttribute('position', new BufferAttribute(vertices, 3));\r\n const order = new Uint32Array(this.maxSplats);\r\n\r\n const orderAttribute = new InstancedBufferAttribute(order, 1, false);\r\n orderAttribute.needsUpdate = true\r\n orderAttribute.setUsage(DynamicDrawUsage);\r\n geometry.setAttribute('order', orderAttribute);\r\n geometry.instanceCount = 0;\r\n\r\n this.geometry.dispose();\r\n this.geometry = geometry;\r\n this.orderAttribute = orderAttribute;\r\n }\r\n this.orderAttribute.clearUpdateRanges();\r\n this.orderAttribute.set(newOrder);\r\n this.orderAttribute.addUpdateRange(0, newOrder.length);\r\n this.orderAttribute.needsUpdate = true;\r\n this.geometry.instanceCount = message.data.count;\r\n this.geometry.needsUpdate = true;\r\n for (let i = this.sortListeners.length - 1; i >= 0; i--) {\r\n const done = this.sortListeners[i](message.data.id);\r\n if (done) {\r\n this.sortListeners.splice(i, 1);\r\n }\r\n }\r\n }\r\n this.cameraPosition = new Vector3(0, 0, 0);\r\n this.rotateOnAxis(new Vector3(1, 0, 0), Math.PI * 0.5);\r\n this.frustumCulled = false;\r\n\r\n\r\n /// Copy setup ///\r\n this.copyMaterial2D = new ShaderMaterial(\r\n {\r\n uniforms: {\r\n sourceTexture: {},\r\n },\r\n vertexShader: vertexCopyShader(),\r\n fragmentShader: fragmentCopyShader2D(),\r\n transparent: false,\r\n side: FrontSide,\r\n depthTest: false,\r\n depthWrite: false\r\n }\r\n );\r\n this.copyMaterial3D = new ShaderMaterial(\r\n {\r\n uniforms: {\r\n sourceTexture: {},\r\n w: { value: 0.0 }\r\n },\r\n vertexShader: vertexCopyShader(),\r\n fragmentShader: fragmentCopyShader3D(),\r\n transparent: false,\r\n side: FrontSide,\r\n depthTest: false,\r\n depthWrite: false\r\n }\r\n );\r\n this.copyCamera = new OrthographicCamera(-0.5, 0.5, 0.5, -0.5, 0.1, 10);\r\n this.copyCamera.position.z = 1;\r\n this.copyScene = new Scene();\r\n const copyGeometry = new PlaneGeometry(1, 1);\r\n this.copyQuad = new Mesh(copyGeometry, this.copyMaterial2D);\r\n this.copyScene.add(this.copyQuad);\r\n this.copyScene.matrixAutoUpdate = false;\r\n this.copyQuad.matrixAutoUpdate = false;\r\n const self = this;\r\n document.addEventListener('keyup', function (event) {\r\n if (event.key === 'a') {\r\n self.growTextures()\r\n console.log(self.positionRenderTarget.depth)\r\n // Add your logic here\r\n }\r\n });\r\n }\r\n\r\n dispose() {\r\n this.material.dispose();\r\n this.copyMaterial2D.dispose();\r\n this.copyMaterial3D.dispose();\r\n this.cov1RenderTarget.dispose();\r\n this.cov2RenderTarget.dispose();\r\n this.positionRenderTarget.dispose();\r\n this.colorRenderTarget.dispose();\r\n this.worker.terminate();\r\n this.worker = null;\r\n this.geometry.dispose();\r\n }\r\n\r\n copyTex2D(src, dst, scissorBox, layer) {\r\n this.copyMaterial2D.uniforms.sourceTexture.value = src;\r\n const prevAutoClear = this.renderer.autoClear;\r\n const prevRenderTarget = this.renderer.getRenderTarget();\r\n this.renderer.autoClear = false;\r\n const scissorWidth = scissorBox[2] - scissorBox[0];\r\n const scissorHeight = scissorBox[3] - scissorBox[1];\r\n dst.viewport.set(scissorBox[0], scissorBox[1], scissorWidth, scissorHeight);\r\n\r\n this.renderer.setRenderTarget(dst, layer);\r\n this.renderer.render(this.copyScene, this.copyCamera);\r\n\r\n this.renderer.setRenderTarget(prevRenderTarget);\r\n\r\n this.renderer.autoClear = prevAutoClear;\r\n\r\n }\r\n\r\n copyTex3D(src, dst, numLayers) {\r\n this.copyMaterial3D.uniforms.sourceTexture.value = src;\r\n\r\n const prevAutoClear = this.renderer.autoClear;\r\n const prevRenderTarget = this.renderer.getRenderTarget();\r\n this.renderer.autoClear = false;\r\n\r\n this.copyQuad.material = this.copyMaterial3D;\r\n\r\n for (let layer = 0; layer < numLayers; layer++) {\r\n this.renderer.setRenderTarget(dst, layer);\r\n this.copyMaterial3D.uniforms.w.value = (layer + 0.5) / (numLayers);\r\n this.renderer.render(this.copyScene, this.copyCamera);\r\n }\r\n\r\n this.copyQuad.material = this.copyMaterial2D;\r\n\r\n this.renderer.setRenderTarget(prevRenderTarget);\r\n this.renderer.autoClear = prevAutoClear;\r\n\r\n }\r\n\r\n /**\r\n * Specify a size multiplier for splats\r\n * @param {number} sizeMultiplier \r\n */\r\n setSplatsSizeMultiplier(sizeMultiplier) {\r\n this.material.uniforms.sizeMultiplier.value = sizeMultiplier;\r\n }\r\n /**\r\n * specify a crop radius for splats\r\n * @param {number} cropRadius \r\n */\r\n setSplatsCropRadius(cropRadius) {\r\n this.material.uniforms.cropRadius.value = cropRadius;\r\n }\r\n\r\n sort(cameraPosition) {\r\n if (!cameraPosition && this.cameraPosition) {\r\n this.worker.postMessage({\r\n method: \"sort\",\r\n xyz: [this.cameraPosition.x, this.cameraPosition.z, -this.cameraPosition.y],\r\n id: this.sortID++\r\n })\r\n }\r\n else if (!this.cameraPosition || !cameraPosition.equals(this.cameraPosition)) {\r\n this.cameraPosition.copy(cameraPosition);\r\n this.worker.postMessage({\r\n method: \"sort\",\r\n xyz: [this.cameraPosition.x, this.cameraPosition.z, -this.cameraPosition.y],\r\n id: this.sortID++\r\n })\r\n }\r\n }\r\n raycast(raycaster, intersects) {\r\n // overrides the method because the SplatsMesh itself is not meant to be raycast onto, the tiles should be individualy raycast\r\n }\r\n\r\n addSplatsTile(positions, colors, cov1, cov2) {\r\n const self = this;\r\n const tileCount = positions.count;\r\n const positionArray = positions.data ? positions.data.array : positions.array;\r\n const stride = positions.data && positions.data.isInterleavedBuffer ? positions.data.stride : 3;\r\n const offset = positions.data && positions.data.isInterleavedBuffer ? positions.offset : 0;\r\n const numBatches = Math.ceil(positionArray.length / (this.batchSize * stride));\r\n const textureAddresses = [];\r\n const pointManagerAddresses = [];\r\n\r\n\r\n /// raycasting ///\r\n // const start = performance.now();\r\n let raycast = () => { }\r\n const positionsOnly = new Float32Array((positionArray.length / stride) * 3);\r\n\r\n\r\n for (let i = 0; i < positionArray.length / 3; i++) {\r\n positionsOnly[i * 3] = positionArray[i * stride + offset];\r\n positionsOnly[i * 3 + 1] = positionArray[i * stride + offset + 1];\r\n positionsOnly[i * 3 + 2] = positionArray[i * stride + offset + 2];\r\n }\r\n\r\n // console.log(performance.now()-start)\r\n raycast = (ray, intersects, threshold) => {\r\n const threshSquared = threshold * threshold;\r\n for (let i = 0; i < positionsOnly.length; i += 3) {\r\n tmpVector.set(positionsOnly[i], -positionsOnly[i + 2], positionsOnly[i + 1])\r\n const dot = tmpVector2.copy(tmpVector).sub(ray.origin).dot(ray.direction);\r\n if (dot > 0) {\r\n const d = ray.distanceSqToPoint(tmpVector);\r\n if (d < threshSquared) {\r\n intersects.push({ distance: dot, point: tmpVector.clone(), type: \"splat\" });\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (numBatches > this.freeAddresses.size) {\r\n this.growTextures();\r\n }\r\n\r\n for (let i = 0; i < numBatches; i++) {\r\n const address = this.freeAddresses.poll();\r\n if (isNaN(address)) {\r\n console.log(\"insuficient texture size to store splats info\")\r\n }\r\n if (address == 0) {\r\n }\r\n textureAddresses.push(address);\r\n pointManagerAddresses.push(address * 3);\r\n const startIndex = i * this.batchSize;\r\n this.addSplatsBatch(startIndex, address, positions, colors, cov1, cov2);\r\n }\r\n\r\n\r\n self.worker.postMessage({\r\n method: \"addBatches\",\r\n insertionIndexes: pointManagerAddresses,\r\n positions: positionArray.buffer,\r\n offset: offset,\r\n stride: stride,\r\n batchSize: self.batchSize,\r\n }, [positionArray.buffer]);\r\n\r\n let visible = false;\r\n const hide = () => {\r\n if (visible == true) {\r\n visible = false;\r\n self.worker.postMessage({\r\n method: \"hideBatches\",\r\n insertionIndexes: pointManagerAddresses,\r\n xyz: [self.cameraPosition.x, self.cameraPosition.z, -self.cameraPosition.y],\r\n id: self.sortID++\r\n });\r\n }\r\n\r\n }\r\n\r\n\r\n const show = (callback) => {\r\n if (visible == false) {\r\n visible = true;\r\n }\r\n const sortID = self.sortID;\r\n const listener = (id => {\r\n if (id >= sortID) {\r\n callback();\r\n return true;\r\n }\r\n return false;\r\n });\r\n self.sortListeners.push(listener)\r\n\r\n self.worker.postMessage({\r\n method: \"showBatches\",\r\n insertionIndexes: pointManagerAddresses,\r\n xyz: [self.cameraPosition.x, self.cameraPosition.z, -self.cameraPosition.y],\r\n id: self.sortID++\r\n });\r\n\r\n\r\n }\r\n const remove = () => {\r\n raycast = undefined;\r\n self.worker.postMessage({\r\n method: \"removeBatches\",\r\n insertionIndexes: pointManagerAddresses,\r\n xyz: [self.cameraPosition.x, self.cameraPosition.z, -self.cameraPosition.y],\r\n id: self.sortID++\r\n });\r\n textureAddresses.forEach(address => self.freeAddresses.add(address));\r\n }\r\n\r\n\r\n\r\n\r\n\r\n return {\r\n hide: hide,\r\n show: show,\r\n remove: remove,\r\n sort: this.sort,\r\n raycast: raycast,\r\n isSplatsBatch: true\r\n }\r\n\r\n }\r\n addSplatsBatch(positionsStartIndex, address, positions, colors, cov1, cov2) {\r\n\r\n\r\n const positionArray = new Float32Array(this.batchSize * 4);\r\n const colorsArray = new Uint8Array(this.batchSize * 4);\r\n const cov1Array = new Float32Array(this.batchSize * 4);\r\n const cov2Array = new Float32Array(this.batchSize * 4);\r\n\r\n\r\n for (let i = address; i < address + this.batchSize; i++) {\r\n const base = i - address;\r\n const arrayIndexBase4 = base * 4;\r\n\r\n const positionIndex = positionsStartIndex + base;\r\n if (positionIndex >= positions.count) break;\r\n\r\n positionArray[arrayIndexBase4] = positions.getX(positionIndex)\r\n positionArray[arrayIndexBase4 + 1] = positions.getY(positionIndex)\r\n positionArray[arrayIndexBase4 + 2] = positions.getZ(positionIndex)\r\n\r\n const r = Math.floor(colors.getX(positionIndex) * 255);\r\n const g = Math.floor(colors.getY(positionIndex) * 255);\r\n const b = Math.floor(colors.getZ(positionIndex) * 255);\r\n const a = Math.floor(colors.getW(positionIndex) * 255);\r\n\r\n colorsArray[arrayIndexBase4] = Math.floor(colors.getX(positionIndex) * 255);\r\n colorsArray[arrayIndexBase4 + 1] = Math.floor(colors.getY(positionIndex) * 255);\r\n colorsArray[arrayIndexBase4 + 2] = Math.floor(colors.getZ(positionIndex) * 255);\r\n colorsArray[arrayIndexBase4 + 3] = Math.floor(colors.getW(positionIndex) * 255);\r\n\r\n\r\n cov1Array[arrayIndexBase4] = cov1.getX(positionIndex)\r\n cov1Array[arrayIndexBase4 + 1] = cov1.getY(positionIndex)\r\n cov1Array[arrayIndexBase4 + 2] = cov1.getZ(positionIndex)\r\n cov2Array[arrayIndexBase4] = cov2.getX(positionIndex)\r\n cov2Array[arrayIndexBase4 + 1] = cov2.getY(positionIndex)\r\n cov2Array[arrayIndexBase4 + 2] = cov2.getZ(positionIndex)\r\n\r\n }\r\n\r\n const destTextureLayer = Math.floor(address / Math.pow(this.textureSize, 2));\r\n const srcHeight = Math.ceil(this.batchSize / this.textureSize);\r\n const scissor = [0, (address / this.textureSize) - (destTextureLayer * this.textureSize), this.textureSize];\r\n scissor.push(scissor[1] + srcHeight);\r\n const batchPositionTexture = new DataTexture(positionArray, this.textureSize, srcHeight, RGBAFormat, FloatType);\r\n batchPositionTexture.generateMipmaps = false;\r\n batchPositionTexture.magFilter = NearestFilter;\r\n batchPositionTexture.minFilter = NearestFilter;\r\n batchPositionTexture.anisotropy = 0;\r\n batchPositionTexture.needsUpdate = true;\r\n this.renderer.initTexture(batchPositionTexture)\r\n this.renderer.initRenderTarget(this.positionRenderTarget)\r\n this.copyTex2D(batchPositionTexture, this.positionRenderTarget, scissor, destTextureLayer)\r\n batchPositionTexture.dispose();\r\n\r\n\r\n const batchColorTexture = new DataTexture(colorsArray, this.textureSize, srcHeight, RGBAFormat, UnsignedByteType);\r\n batchColorTexture.generateMipmaps = false;\r\n batchColorTexture.magFilter = NearestFilter;\r\n batchColorTexture.minFilter = NearestFilter;\r\n batchColorTexture.anisotropy = 0;\r\n batchColorTexture.needsUpdate = true;\r\n this.renderer.initTexture(batchColorTexture)\r\n this.copyTex2D(batchColorTexture, this.colorRenderTarget, scissor, destTextureLayer);\r\n batchColorTexture.dispose();\r\n\r\n\r\n const batchCov1Texture = new DataTexture(cov1Array, this.textureSize, srcHeight, RGBAFormat, FloatType);\r\n batchCov1Texture.generateMipmaps = false;\r\n batchCov1Texture.magFilter = NearestFilter;\r\n batchCov1Texture.minFilter = NearestFilter;\r\n batchCov1Texture.anisotropy = 0;\r\n batchCov1Texture.needsUpdate = true;\r\n this.renderer.initTexture(batchCov1Texture)\r\n this.copyTex2D(batchCov1Texture, this.cov1RenderTarget, scissor, destTextureLayer)\r\n batchCov1Texture.dispose();\r\n\r\n const batchCov2Texture = new DataTexture(cov2Array, this.textureSize, srcHeight, RGBAFormat, FloatType);\r\n batchCov2Texture.generateMipmaps = false;\r\n batchCov2Texture.magFilter = NearestFilter;\r\n batchCov2Texture.minFilter = NearestFilter;\r\n batchCov2Texture.anisotropy = 0;\r\n batchCov2Texture.needsUpdate = true;\r\n this.renderer.initTexture(batchCov2Texture)\r\n this.copyTex2D(batchCov2Texture, this.cov2RenderTarget, scissor, destTextureLayer);\r\n batchCov2Texture.dispose();\r\n\r\n }\r\n\r\n growTextures() {\r\n\r\n //const start = performance.now();\r\n for (let i = this.maxSplats; i < this.maxSplats + (this.textureSize * this.textureSize); i += this.batchSize) {\r\n this.freeAddresses.add(i);\r\n }\r\n this.maxSplats += (this.textureSize * this.textureSize);\r\n\r\n\r\n\r\n const newNumTextures = this.numTextures + 1;\r\n const colorRenderTarget = new WebGL3DRenderTarget(this.textureSize, this.textureSize, newNumTextures, {\r\n magFilter: NearestFilter,\r\n minFilter: NearestFilter,\r\n anisotropy: 0,\r\n depthBuffer: false,\r\n resolveDepthBuffer: false,\r\n })\r\n\r\n\r\n this.renderer.initRenderTarget(colorRenderTarget);\r\n this.copyTex3D(this.colorRenderTarget.texture, colorRenderTarget, this.numTextures);\r\n this.colorRenderTarget.dispose();\r\n this.colorRenderTarget = colorRenderTarget;\r\n this.material.uniforms.colorTexture.value = this.colorRenderTarget.texture;\r\n\r\n\r\n const positionRenderTarget = new WebGL3DRenderTarget(this.textureSize, this.textureSize, newNumTextures, {\r\n magFilter: NearestFilter,\r\n minFilter: NearestFilter,\r\n anisotropy: 0,\r\n type: FloatType,\r\n depthBuffer: false,\r\n resolveDepthBuffer: false,\r\n })\r\n positionRenderTarget.texture.type = FloatType;\r\n this.renderer.initRenderTarget(positionRenderTarget);\r\n this.copyTex3D(this.positionRenderTarget.texture, positionRenderTarget, this.numTextures);\r\n this.positionRenderTarget.dispose();\r\n this.positionRenderTarget = positionRenderTarget;\r\n this.material.uniforms.positionTexture.value = this.positionRenderTarget.texture;\r\n\r\n\r\n const cov1RenderTarget = new WebGL3DRenderTarget(this.textureSize, this.textureSize, newNumTextures, {\r\n magFilter: NearestFilter,\r\n minFilter: NearestFilter,\r\n anisotropy: 0,\r\n type: FloatType,\r\n depthBuffer: false,\r\n resolveDepthBuffer: false,\r\n })\r\n cov1RenderTarget.texture.type = FloatType;\r\n this.renderer.initRenderTarget(cov1RenderTarget);\r\n this.copyTex3D(this.cov1RenderTarget.texture, cov1RenderTarget, this.numTextures);\r\n this.cov1RenderTarget.dispose();\r\n this.cov1RenderTarget = cov1RenderTarget;\r\n this.material.uniforms.cov1Texture.value = this.cov1RenderTarget.texture;\r\n\r\n const cov2RenderTarget = new WebGL3DRenderTarget(this.textureSize, this.textureSize, newNumTextures, {\r\n magFilter: NearestFilter,\r\n minFilter: NearestFilter,\r\n anisotropy: 0,\r\n type: FloatType,\r\n depthBuffer: false,\r\n resolveDepthBuffer: false,\r\n })\r\n cov2RenderTarget.texture.type = FloatType;\r\n this.renderer.initRenderTarget(cov2RenderTarget);\r\n this.copyTex3D(this.cov2RenderTarget.texture, cov2RenderTarget, this.numTextures);\r\n this.cov2RenderTarget.dispose();\r\n this.cov2RenderTarget = cov2RenderTarget;\r\n this.material.uniforms.cov2Texture.value = this.cov2RenderTarget.texture;\r\n\r\n\r\n this.numTextures = newNumTextures;\r\n this.material.uniforms.numSlices.value = this.numTextures;\r\n\r\n //console.log(\"grow \" + (performance.now() - start) + \" ms\")\r\n }\r\n\r\n} export { SplatsMesh }\r\n\r\nfunction saveBuffer(pixelBuffer) {\r\n const canvas = document.createElement('canvas');\r\n const width = 512;\r\n const height = 512;\r\n canvas.width = width;\r\n canvas.height = height;\r\n const context = canvas.getContext('2d');\r\n const imageData = context.createImageData(width, height);\r\n\r\n // WebGL's coordinate system is bottom-left, so we need to flip the image vertically\r\n for (let y = 0; y < height; y++) {\r\n for (let x = 0; x < width; x++) {\r\n const srcIndex = (y * width + x) * 4;\r\n const destIndex = ((height - y - 1) * width + x) * 4;\r\n imageData.data[destIndex] = pixelBuffer[srcIndex]; // R\r\n imageData.data[destIndex + 1] = pixelBuffer[srcIndex + 1]; // G\r\n imageData.data[destIndex + 2] = pixelBuffer[srcIndex + 2]; // B\r\n imageData.data[destIndex + 3] = pixelBuffer[srcIndex + 3]; // A\r\n }\r\n }\r\n context.putImageData(imageData, 0, 0);\r\n\r\n // 6. Convert the canvas to a PNG and trigger download\r\n canvas.toBlob((blob) => {\r\n const url = URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = `layer_.png`;\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n URL.revokeObjectURL(url);\r\n }, 'image/png');\r\n}\r\nexport function splatsVertexShader() {\r\n return `\r\nprecision highp float;\r\nprecision highp int;\r\n\r\n#include <common>\r\n#include <packing>\r\n\r\nuniform float textureSize;\r\nuniform float numSlices;\r\nuniform float sizeMultiplier;\r\nin uint order;\r\nout vec4 color;\r\nout vec2 vUv;\r\nout vec3 splatPositionWorld;\r\nout float splatDepth;\r\n//out float orthographicDepth;\r\nout float splatCrop;\r\nuniform sampler3D colorTexture;\r\nuniform sampler3D positionTexture;\r\nuniform sampler3D cov1Texture;\r\nuniform sampler3D cov2Texture;\r\nuniform mat3 zUpToYUpMatrix3x3;\r\nuniform float logDepthBufFC;\r\n//uniform float cameraNear;\r\n//uniform float cameraFar;\r\n//uniform bool computeLinearDepth;\r\n\r\n\r\nvoid getVertexData(out vec3 position, out mat3 covariance) {\r\n float index = float(order)+0.1; // add small offset to avoid floating point errors with modulo\r\n float pixelsPerSlice = textureSize * textureSize;\r\n float sliceIndex = floor(index / pixelsPerSlice);\r\n float slicePixelIndex = mod(index,pixelsPerSlice);\r\n\r\n float x = mod(slicePixelIndex,textureSize);\r\n float y = floor(slicePixelIndex / textureSize);\r\n\r\n vec3 uvw = vec3((x + 0.5) / textureSize, (y + 0.5) / textureSize, (sliceIndex + 0.5) / numSlices);\r\n\r\n // Position\r\n position = texture(positionTexture, uvw).xyz;\r\n \r\n \r\n \r\n \r\n vec4 cov1 = texture(cov1Texture, uvw);\r\n vec4 cov2 = texture(cov2Texture, uvw);\r\n\r\n covariance[0][0] = cov1.x;\r\n covariance[1][0] = cov1.y;\r\n covariance[0][1] = cov1.y;\r\n covariance[2][0] = cov1.z;\r\n covariance[0][2] = cov1.z;\r\n\r\n covariance[1][1] = cov2.x;\r\n covariance[2][1] = cov2.y;\r\n covariance[1][2] = cov2.y;\r\n covariance[2][2] = cov2.z;\r\n\r\n \r\n \r\n\r\n //covariance *= 4.0;\r\n mat3 modelRotation = zUpToYUpMatrix3x3*transpose(mat3(modelMatrix));\r\n covariance = transpose(zUpToYUpMatrix3x3) * covariance * zUpToYUpMatrix3x3;\r\n covariance = transpose(modelRotation) * covariance * (modelRotation);\r\n\r\n // Color\r\n color = texture(colorTexture, uvw);\r\n // color = vec4(uvw.z, 0.0,0.0,1.0);\r\n}\r\n\r\nvoid modelTransform(in vec3 splatPosition, in mat3 covariance, inout vec3 vertexPosition){\r\n vec3 upReference = vec3(0.0, 1.0, 0.0);\r\n vec3 look = normalize(cameraPosition - splatPosition);\r\n vec3 right = normalize(cross(upReference, look));\r\n\r\n float rightLength = length(cross(upReference, look));\r\n if (rightLength < 1e-6) { // Check if vectors are parallel\r\n upReference = vec3(1.0, 0.0, 0.0); // Choose an alternative up vector\r\n right = normalize(cross(upReference, look));\r\n }\r\n\r\n vec3 up = cross(look, right);\r\n\r\n // Construct the billboard rotation matrix\r\n mat3 billboardRot = mat3(\r\n right.x, right.y, right.z,\r\n up.x, up.y, up.z,\r\n look.x, look.y, look.z);\r\n\r\n mat3 cov2D = transpose(billboardRot) * covariance * billboardRot;\r\n \r\n float a = max(cov2D[0][0],1e-6);\r\n float b = cov2D[0][1];\r\n \r\n float c = max(cov2D[1][1],1e-6);\r\n\r\n \r\n float trace = a + c;\r\n float det = a * c - b * b;\r\n \r\n\r\n float traceOver2 = 0.5 * trace;\r\n float dist = sqrt(max(traceOver2*traceOver2 - det, 0.0));\r\n //float dist = sqrt(max(0.1, traceOver2 * traceOver2 - det));\r\n\r\n float lambda1 = max(0.0, traceOver2 + dist);\r\n float lambda2 = max(0.0, traceOver2 - dist);\r\n\r\n\r\n vec2 eigenvector1;\r\n if(abs(covariance[0][1]) < 1e-7 && abs(covariance[0][2]) < 1e-7 && abs(covariance[1][2]) < 1e-7){\r\n\t\t\t\t\teigenvector1 = vec2(0,1);\r\n\t}else{\r\n\t\teigenvector1 = normalize(vec2(b, lambda1 - a));\r\n\t}\r\n vec2 eigenvector2 = vec2(-eigenvector1.y, eigenvector1.x);\r\n float l1 = sqrt(lambda1);\r\n float l2 = sqrt(lambda2);\r\n\r\n eigenvector1 *= l1*2.0;\r\n eigenvector2 *= l2*2.0;\r\n vertexPosition.xy = vertexPosition.x * eigenvector1 + vertexPosition.y * eigenvector2;\r\n vertexPosition = billboardRot * vertexPosition + splatPosition;\r\n}\r\n\r\n\r\nvoid main() {\r\n vUv = vec2(position);\r\n\r\n splatPositionWorld = vec3(0.0);\r\n mat3 covariance = mat3(0.0);\r\n getVertexData(splatPositionWorld, covariance);\r\n splatCrop = 0.5*sqrt(color.w); // discard more pixels when opacity is low\r\n splatPositionWorld = (modelMatrix * vec4(splatPositionWorld, 1.0)).xyz;\r\n \r\n\r\n vec3 outPosition = vec3(position)*sizeMultiplier;\r\n modelTransform(splatPositionWorld, covariance, outPosition);\r\n \r\n gl_Position = projectionMatrix * viewMatrix * vec4(outPosition, 1.0);\r\n /* if(computeLinearDepth){\r\n orthographicDepth = viewZToOrthographicDepth( -gl_Position.w, cameraNear, cameraFar );\r\n } */\r\n \r\n vec4 centerP = projectionMatrix * viewMatrix * vec4(splatPositionWorld, 1.0);\r\n #if defined( USE_LOGDEPTHBUF )\r\n\t float isPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\r\n splatDepth = isPerspective == 0.0 ? centerP.z : log2( 1.0 + centerP.w ) * logDepthBufFC * 0.5;\r\n #else\r\n splatDepth = (centerP.z / centerP.w)* 0.5 + 0.5;\r\n #endif\r\n\r\n \r\n}\r\n`};\r\nexport function splatsFragmentShader() {\r\n return `\r\nprecision highp float;\r\n\r\nin vec4 color;\r\nin vec2 vUv;\r\nin vec3 splatPositionWorld;\r\nin float splatDepth;\r\n//in float orthographicDepth;\r\nin float splatCrop;\r\nuniform float textureSize;\r\nuniform float cropRadius;\r\n\r\nvoid main() {\r\n if(length(splatPositionWorld)>cropRadius) discard;\r\n float l = length(vUv);\r\n \r\n // Early discard for pixels outside the radius\r\n if (l > 0.5) {\r\n discard;\r\n };\r\n vec2 p = vUv * 4.0;\r\n float alpha = exp(-dot(p, p));\r\n\r\n gl_FragColor = vec4(pow(color.xyz,vec3(1.0/2.2)), color.w * pow(alpha, 1.8)); \r\n //gl_FragColor = vec4(splatDepth,0.0,0.0,1.0); \r\n //gl_FragDepth = splatDepth;\r\n \r\n}`\r\n};\r\n\r\nfunction vertexCopyShader() {\r\n return `\r\n\r\nout vec2 vUv;\r\n\r\nvoid main() {\r\n vUv = uv;\r\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n}`\r\n};\r\n\r\nfunction fragmentCopyShader2D() {\r\n return `\r\nprecision highp float;\r\n\r\nuniform sampler2D sourceTexture;\r\n\r\nin vec2 vUv;\r\n\r\nvoid main() {\r\n gl_FragColor = texture( sourceTexture, vUv );\r\n}`\r\n};\r\n\r\n\r\nfunction fragmentCopyShader3D() {\r\n return `\r\nprecision highp float;\r\n\r\nuniform sampler3D sourceTexture;\r\nuniform float w;\r\n\r\nin vec2 vUv;\r\n\r\nvoid main() {\r\n gl_FragColor = texture( sourceTexture, vec3(vUv, w) );\r\n}`\r\n};","import * as THREE from 'three';\r\nimport { OBB } from \"../geometry/obb\";\r\nimport { TileLoader } from \"./TileLoader\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport * as path from \"path-browserify\"\r\nimport { resolveImplicite } from './implicit/ImplicitTileResolver.js';\r\nimport { SplatsMesh } from '../splats/SplatsMesh';\r\nvar averageTime = 0;\r\n\r\n\r\nvar copyrightDiv;\r\nconst tempSphere = new THREE.Sphere(new THREE.Vector3(0, 0, 0), 1);\r\nconst tempOBB = new OBB([0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1]);\r\nconst tempBox3 = new THREE.Box3();\r\nconst tempVec1 = new THREE.Vector3(0, 0, 0);\r\nconst tempVec2 = new THREE.Vector3(0, 0, 0);\r\nconst upVector = new THREE.Vector3(0, 1, 0);\r\nconst tempRay = new THREE.Ray();\r\nconst inverseWorld = new THREE.Matrix4();\r\nconst transformedProjection = new THREE.Matrix4();\r\nconst frustum = new THREE.Frustum();\r\nconst transformedCameraPosition = new THREE.Vector3();\r\nconst tempIntersects = [];\r\n\r\nconst tempQuaternion = new THREE.Quaternion();\r\nconst copyright = {};\r\n\r\n/**\r\n * @returns a list of vendors that are required by copyright to be displayed in the app.\r\n */\r\nfunction getOGC3DTilesCopyrightInfo() {\r\n var list = [];\r\n for (let key in copyright) {\r\n if (copyright.hasOwnProperty(key) && copyright[key] > 0) { // This checks if the key is actually part of the object and not its prototype.\r\n list.push(key);\r\n }\r\n }\r\n return list;\r\n\r\n}\r\n\r\n\r\n/**\r\n * class representing a tiled and multileveled mesh or point-cloud according to the OGC3DTiles 1.1 spec\r\n * @class\r\n * @extends {THREE.Object3D}\r\n */\r\nclass OGC3DTile extends THREE.Object3D {\r\n\r\n /**\r\n * @param {Object} [properties] - the properties for this tileset\r\n * @param {String} [properties.url] - the url to the parent tileset.json\r\n * @param {Object} [properties.queryParams = undefined] - optional, path params to add to individual tile urls\r\n * @param {Number} [properties.geometricErrorMultiplier = 1] - the geometric error of the parent. 1.0 by default corresponds to a maxScreenSpaceError of 16\r\n * @param {Boolean} [properties.loadOutsideView = false] - if truthy, tiles otside the camera frustum will be loaded with the least possible amount of detail\r\n * @param {TileLoader} [properties.tileLoader = undefined] - A tile loader that can be shared among tilesets in order to share a common cache.\r\n * @param {Function} [properties.meshCallback = undefined] - A callback function that will be called on every mesh\r\n * @param {Function} [properties.pointsCallback = undefined] - A callback function that will be called on every points\r\n * @param {Function} [properties.onLoadCallback = undefined] - A callback function that will be called when the root tile has been loaded\r\n * @param {OcclusionCullingService} [properties.occlusionCullingService = undefined] - A service that handles occlusion culling\r\n * @param {Boolean} [properties.centerModel = false] - If true, the tileset will be centered on 0,0,0 and in the case of georeferenced tilesets that use the \"region\" bounding volume, it will also be rotated so that the up axis matched the world y axis.\r\n * @param {Boolean} [properties.static = false] - If true, the tileset is considered static which improves performance but the matrices aren't automatically updated\r\n * @param {String} [properties.rootPath = undefined] - optional the root path for fetching children\r\n * @param {String} [properties.json = undefined] - optional json object representing the tileset sub-tree\r\n * @param {Number} [properties.parentGeometricError = undefined] - optional geometric error of the parent\r\n * @param {Object} [properties.parentBoundingVolume = undefined] - optional bounding volume of the parent\r\n * @param {String} [properties.parentRefine = undefined] - optional refine strategy of the parent of the parent\r\n * @param {THREE.Camera} [properties.cameraOnLoad = undefined] - optional the camera used when loading this particular sub-tile\r\n * @param {OGC3DTile} [properties.parentTile = undefined] - optional the OGC3DTile object that loaded this tile as a child\r\n * @param {String} [properties.proxy = undefined] - optional the url to a proxy service. Instead of fetching tiles via a GET request, a POST will be sent to the proxy url with the real tile address in the body of the request.\r\n * @param {Boolean} [properties.displayErrors = false] - optional value indicating that errors should be shown on screen.\r\n * @param {THREE.Renderer} [properties.renderer = undefined] - optional the renderer used to display the tileset. Used to infer render resolution at runtime and to instantiate a ktx2loader on the fly if not provided. \r\n * @param {Number} [properties.domWidth = undefined] - optional the canvas width (used to calculate geometric error). If a renderer is provided, it'll be used instead, else a default value is used. \r\n * @param {Number} [properties.domHeight = undefined] - optional the canvas height (used to calculate geometric error). If a renderer is provided, it'll be used instead, else a default value is used. \r\n * @param {DracoLoader} [properties.dracoLoader = undefined] - optional a draco loader (three/addons).\r\n * @param {KTX2Loader} [properties.ktx2Loader = undefined] - optional a ktx2 loader (three/addons).\r\n * @param {Number} [properties.distanceBias = 1] - optional a bias that allows loading more or less detail closer to the camera relative to far away. The value should be a positive number. A value below 1 loads less detail near the camera and a value above 1 loads more detail near the camera. This needs to be compensated by the geometricErrorMultiplier in order to load a reasonable number of tiles.\r\n * @param {String} [properties.loadingStrategy = \"INCREMENTAL\"] - optional a strategy for loading tiles \"INCREMENTAL\" loads intermediate LODs while \"IMMEDIATE\" skips intermediate LODs.\r\n * @param {String} [properties.drawBoundingVolume = false] - optional draws the bounding volume (may cause flickering)\r\n * @param {String} [properties.splatsFragmentShader = undefined] - optional pass a custom fragment shader for rendering splats\r\n */\r\n constructor(properties) {\r\n super();\r\n const self = this;\r\n self.splatsMesh = properties.splatsMesh;\r\n this.contentURL = [];\r\n if (!!properties.domWidth && !!properties.domHeight) {\r\n this.rendererSize = new THREE.Vector2(properties.domWidth, properties.domHeight);\r\n } else {\r\n this.rendererSize = new THREE.Vector2(1000, 1000);\r\n }\r\n this.loadingStrategy = properties.loadingStrategy ? properties.loadingStrategy.toUpperCase() : \"INCREMENTAL\";\r\n this.distanceBias = Math.max(0.0001, properties.distanceBias ? properties.distanceBias : 1);\r\n this.proxy = properties.proxy;\r\n this.drawBoundingVolume = properties.drawBoundingVolume ? properties.drawBoundingVolume : false;\r\n this.displayErrors = properties.displayErrors;\r\n this.displayCopyright = properties.displayCopyright;\r\n if (properties.queryParams) {\r\n this.queryParams = { ...properties.queryParams };\r\n }\r\n this.uuid = uuidv4();\r\n if (!!properties.tileLoader) {\r\n this.tileLoader = properties.tileLoader;\r\n } else {\r\n const tileLoaderOptions = {};\r\n tileLoaderOptions.meshCallback = !properties.meshCallback ? (mesh, geometricError) => {\r\n mesh.material.wireframe = false;\r\n mesh.material.side = THREE.DoubleSide;\r\n } : properties.meshCallback;\r\n tileLoaderOptions.pointsCallback = !properties.pointsCallback ? (points, geometricError) => {\r\n points.material.size = Math.pow(geometricError, 0.33);\r\n points.material.sizeAttenuation = true;\r\n } : properties.pointsCallback;\r\n tileLoaderOptions.proxy = this.proxy;\r\n tileLoaderOptions.renderer = properties.renderer;\r\n tileLoaderOptions.dracoLoader = properties.dracoLoader;\r\n tileLoaderOptions.ktx2Loader = properties.ktx2Loader;\r\n this.tileLoader = new TileLoader(tileLoaderOptions);\r\n this.update = (camera) => {\r\n this.update(camera);\r\n this.tileLoader.update();\r\n }\r\n }\r\n this.displayCopyright = !!properties.displayCopyright;\r\n // set properties general to the entire tileset\r\n this.geometricErrorMultiplier = !!properties.geometricErrorMultiplier ? properties.geometricErrorMultiplier : 1.0;\r\n this.splatsCropRadius = Number.MAX_VALUE;\r\n this.splatsSizeMultiplier = 1;\r\n\r\n this.renderer = properties.renderer;\r\n this.meshCallback = properties.meshCallback;\r\n this.loadOutsideView = properties.loadOutsideView;\r\n this.cameraOnLoad = properties.cameraOnLoad;\r\n this.parentTile = properties.parentTile;\r\n this.occlusionCullingService = properties.occlusionCullingService;\r\n this.static = properties.static;\r\n if (this.occlusionCullingService) {\r\n this.color = new THREE.Color();\r\n this.color.setHex(Math.random() * 0xffffff);\r\n this.colorID = THREE.MathUtils.clamp(self.color.r * 255, 0, 255) << 16 ^ THREE.MathUtils.clamp(self.color.g * 255, 0, 255) << 8 ^ THREE.MathUtils.clamp(self.color.b * 255, 0, 255) << 0;\r\n }\r\n if (this.static) {\r\n this.matrixAutoUpdate = false;\r\n this.matrixWorldAutoUpdate = false;\r\n }\r\n\r\n // declare properties specific to the tile for clarity\r\n this.childrenTiles = [];\r\n this.meshContent = [];\r\n this.tileContent;\r\n this.refine; // defaults to \"REPLACE\"\r\n this.rootPath;\r\n this.geometricError;\r\n this.boundingVolume;\r\n this.json; // the json corresponding to this tile\r\n this.materialVisibility = false;\r\n this.level = properties.level ? properties.level : 0;\r\n this.hasMeshContent = 0; // true when the provided json has a content field pointing to a B3DM file\r\n this.hasUnloadedJSONContent = 0; // true when the provided json has a content field pointing to a JSON file that is not yet loaded\r\n this.centerModel = properties.centerModel;\r\n this.abortController = new AbortController();\r\n\r\n this.onLoadCallback = properties.onLoadCallback;\r\n //this.layers.disable(0);\r\n //this.octree = new Octree();\r\n\r\n if (!!properties.json) { // If this tile is created as a child of another tile, properties.json is not null\r\n\r\n self._setup(properties);\r\n\r\n\r\n } else if (properties.url) { // If only the url to the tileset.json is provided\r\n var url = properties.url;\r\n if (self.queryParams) {\r\n var props = \"\";\r\n for (let key in self.queryParams) {\r\n if (self.queryParams.hasOwnProperty(key)) {\r\n props += \"&\" + key + \"=\" + self.queryParams[key];\r\n }\r\n }\r\n if (url.includes(\"?\")) {\r\n url += props;\r\n } else {\r\n url += \"?\" + props.substring(1);\r\n }\r\n }\r\n\r\n\r\n var fetchFunction;\r\n if (self.proxy) {\r\n fetchFunction = () => {\r\n return fetch(self.proxy,\r\n {\r\n method: 'POST',\r\n body: url,\r\n signal: self.abortController.signal\r\n }\r\n );\r\n }\r\n } else {\r\n fetchFunction = () => {\r\n return fetch(url, { signal: self.abortController.signal });\r\n }\r\n }\r\n fetchFunction().then(result => {\r\n if (!result.ok) {\r\n throw new Error(`couldn't load \"${properties.url}\". Request failed with status ${result.status} : ${result.statusText}`);\r\n }\r\n result.json().then(json => { return resolveImplicite(json, url) }).then(json => {\r\n self._setup({ rootPath: path.dirname(properties.url), json: json });\r\n });\r\n }).catch(e => { if (self.displayErrors) _showError(e) });\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Specify a size multiplier for splats\r\n * @param {number} sizeMultiplier \r\n */\r\n setSplatsSizeMultiplier(sizeMultiplier) {\r\n this.splatsSizeMultiplier = sizeMultiplier;\r\n if (this.splatsMesh) {\r\n this.splatsMesh.setSplatsSizeMultiplier(this.splatsSizeMultiplier)\r\n }\r\n }\r\n /**\r\n * specify a crop radius for splats\r\n * @param {number} cropRadius \r\n */\r\n setSplatsCropRadius(cropRadius) {\r\n this.splatsCropRadius = cropRadius;\r\n if (this.splatsMesh) {\r\n this.splatsMesh.setSplatsCropRadius(this.splatsCropRadius)\r\n }\r\n }\r\n\r\n /**\r\n * Manually updates all the matrices of the tileset. \r\n * To be called after transforming a {@link OGC3DTile tileset} instantiated with the \"static\" option\r\n */\r\n updateMatrices() {\r\n this.updateMatrix();\r\n if (this.static) {\r\n this.traverse(o => {\r\n if (o.isObject3D) {\r\n o.matrixWorldAutoUpdate = true;\r\n }\r\n });\r\n }\r\n this.updateMatrixWorld(true);\r\n if (this.static) {\r\n this.traverse(o => {\r\n if (o.isObject3D) o.matrixWorldAutoUpdate = false;\r\n });\r\n }\r\n }\r\n /**\r\n * Call this to specify the canvas width/height when it changes (used to compute tiles geometric error that controls tile refinement).\r\n * It's unnecessary to call this when the {@link OGC3DTile} is instantiated with the renderer.\r\n * \r\n * @param {Number} width \r\n * @param {Number} height \r\n */\r\n setCanvasSize(width, height) {\r\n this.rendererSize.set(width, height);\r\n }\r\n\r\n async _setup(properties) {\r\n const self = this;\r\n\r\n if (properties.json.extensionsRequired) {\r\n if (properties.json.extensionsRequired.includes(\"JDULTRA_gaussian_splats\")) {\r\n self.splatsMesh = new SplatsMesh(self.tileLoader.renderer)\r\n this.splatsMesh.setSplatsCropRadius(this.splatsCropRadius)\r\n this.splatsMesh.setSplatsSizeMultiplier(this.splatsSizeMultiplier)\r\n self.add(self.splatsMesh);\r\n }\r\n }\r\n if (!!properties.json.root) {\r\n self.json = properties.json.root;\r\n if (!self.json.refine) self.json.refine = properties.json.refine;\r\n if (!self.json.geometricError) self.json.geometricError = properties.json.geometricError;\r\n if (!self.json.transform) self.json.transform = properties.json.transform;\r\n if (!self.json.boundingVolume) self.json.boundingVolume = properties.json.boundingVolume;\r\n } else {\r\n self.json = properties.json;\r\n }\r\n\r\n\r\n if (!self.json.children) {\r\n if (self.json.getChildren) {\r\n self.json.children = await self.json.getChildren();\r\n } else {\r\n self.json.children = [];\r\n }\r\n }\r\n self.rootPath = !!properties.json.rootPath ? properties.json.rootPath : properties.rootPath;\r\n\r\n // decode refine\r\n if (!!self.json.refine) {\r\n self.refine = self.json.refine;\r\n } else {\r\n self.refine = properties.parentRefine;\r\n }\r\n // decode geometric error\r\n if (!!self.json.geometricError) {\r\n self.geometricError = self.json.geometricError;\r\n } else {\r\n self.geometricError = properties.parentGeometricError;\r\n }\r\n\r\n\r\n // decode transform\r\n if (!!self.json.transform) {\r\n let mat = new THREE.Matrix4();\r\n mat.elements = self.json.transform;\r\n self.applyMatrix4(mat);\r\n\r\n }\r\n\r\n /* self.matrixWorldNeedsUpdate = true;\r\n //self.updateMatrix();\r\n if (self.parentTile) {\r\n self.parentTile.updateMatrixWorld(true);\r\n //self.parentTile.updateWorldMatrix(true, true);\r\n } */\r\n\r\n // decode volume\r\n if (!!self.json.boundingVolume) {\r\n if (!!self.json.boundingVolume.box) {\r\n self.boundingVolume = new OBB(self.json.boundingVolume.box);\r\n } else if (!!self.json.boundingVolume.region) {\r\n const region = self.json.boundingVolume.region;\r\n self._transformWGS84ToCartesian(region[0], region[1], region[4], tempVec1);\r\n self._transformWGS84ToCartesian(region[2], region[3], region[5], tempVec2);\r\n tempVec1.lerp(tempVec2, 0.5);\r\n self.boundingVolume = new THREE.Sphere(new THREE.Vector3(tempVec1.x, tempVec1.y, tempVec1.z), tempVec1.distanceTo(tempVec2));\r\n } else if (!!self.json.boundingVolume.sphere) {\r\n const sphere = self.json.boundingVolume.sphere;\r\n self.boundingVolume = new THREE.Sphere(new THREE.Vector3(sphere[0], sphere[1], sphere[2]), sphere[3]);\r\n } else {\r\n self.boundingVolume = properties.parentBoundingVolume;\r\n }\r\n } else {\r\n self.boundingVolume = properties.parentBoundingVolume;\r\n }\r\n\r\n\r\n\r\n\r\n\r\n function _checkContent(e) {\r\n if (!!e.uri && e.uri.includes(\"json\")) {\r\n self.hasUnloadedJSONContent++;\r\n } else if (!!e.url && e.url.includes(\"json\")) {\r\n self.hasUnloadedJSONContent++;\r\n } else {\r\n self.hasMeshContent++;\r\n }\r\n }\r\n\r\n if (!!self.json.content) { //if there is a content, json or otherwise, schedule it to be loaded \r\n _checkContent(self.json.content);\r\n if (self.hasMeshContent == 0) {\r\n self.level = Math.max(0, self.parentTile ? self.parentTile.level + 0.01 : 0.0);\r\n }\r\n switch (self.loadingStrategy) {\r\n case \"IMMEDIATE\": self._load(true, false); break;\r\n default: self._load();\r\n }\r\n\r\n } else if (!!self.json.contents) { //if there is a content, json or otherwise, schedule it to be loaded \r\n self.json.contents.forEach(e => _checkContent(e))\r\n if (self.hasMeshContent == 0) {\r\n self.level = Math.max(0, self.parentTile ? self.parentTile.level + 0.01 : 0.0);\r\n }\r\n switch (self.loadingStrategy) {\r\n case \"IMMEDIATE\": self._load(true, false); break;\r\n default: self._load();\r\n }\r\n //scheduleLoadTile(this);\r\n }\r\n\r\n\r\n if (!!self.centerModel) {\r\n tempVec2.copy(self.boundingVolume.center);\r\n\r\n //tempSphere.applyMatrix4(self.matrixWorld);\r\n if (!!this.json.boundingVolume.region) {\r\n this._transformWGS84ToCartesian(\r\n (this.json.boundingVolume.region[0] + this.json.boundingVolume.region[2]) * 0.5,\r\n (this.json.boundingVolume.region[1] + this.json.boundingVolume.region[3]) * 0.5,\r\n (this.json.boundingVolume.region[4] + this.json.boundingVolume.region[5]) * 0.5,\r\n tempVec1);\r\n\r\n tempQuaternion.setFromUnitVectors(tempVec1.normalize(), upVector.normalize());\r\n self.applyQuaternion(tempQuaternion);\r\n }\r\n tempVec2.applyMatrix4(self.matrix);\r\n self.position.sub(tempVec2);\r\n\r\n self.updateMatrices();\r\n //self.updateMatrixWorld(true);\r\n }\r\n if (properties.onLoadCallback) self.onLoadCallback(self);\r\n self.isSetup = true;\r\n\r\n\r\n if (self.level > 0 && self.drawBoundingVolume) {\r\n if (self.bbox) {\r\n console.log(\"double setup\")\r\n }\r\n if (this.boundingVolume.aabb) {\r\n let box = this.boundingVolume.aabb.clone();\r\n box.applyMatrix4(this.matrixWorld);\r\n self.bbox = new THREE.Box3Helper(box, new THREE.Color(Math.random(), Math.random(), Math.random()));\r\n //self.bbox.renderOrder = -1;\r\n self.add(self.bbox);\r\n self.bbox.material.visible = false;\r\n }else if(self.boundingVolume instanceof OBB){\r\n self.bbox = self.boundingVolume.helper();\r\n self.add(self.bbox);\r\n self.bbox.material.visible = false;\r\n }\r\n }\r\n\r\n }\r\n _assembleURL(root, relative) {\r\n // Append a slash to the root URL if it doesn't already have one\r\n if (!root.endsWith('/')) {\r\n root += '/';\r\n }\r\n\r\n const rootUrl = new URL(root);\r\n let rootParts = rootUrl.pathname.split('/').filter(p => p !== '');\r\n let relativeParts = relative.split('/').filter(p => p !== '');\r\n\r\n for (let i = 1; i <= rootParts.length; i++) {\r\n if (i >= relativeParts.length) break;\r\n const rootToken = rootParts.slice(rootParts.length - i, rootParts.length).join('/');\r\n const relativeToken = relativeParts.slice(0, i).join('/');\r\n if (rootToken === relativeToken) {\r\n for (let j = 0; j < i; j++) {\r\n rootParts.pop();\r\n }\r\n break;\r\n }\r\n }\r\n\r\n\r\n while (relativeParts.length > 0 && relativeParts[0] === '..') {\r\n rootParts.pop();\r\n relativeParts.shift();\r\n }\r\n\r\n return `${rootUrl.protocol}//${rootUrl.host}/${[...rootParts, ...relativeParts].join('/')}`;\r\n }\r\n\r\n _extractQueryParams(url, params) {\r\n const urlObj = new URL(url);\r\n\r\n // Iterate over all the search parameters\r\n for (let [key, value] of urlObj.searchParams) {\r\n params[key] = value;\r\n }\r\n\r\n // Remove the query string\r\n urlObj.search = '';\r\n return urlObj.toString();\r\n }\r\n async _load(loadJson = true, loadMesh = true) {\r\n var self = this;\r\n if (self.deleted) return;\r\n if (!!self.json.content) {\r\n await loadContent(self.json.content, null, loadJson, loadMesh);\r\n } else if (!!self.json.contents) {\r\n let promises = self.json.contents.map((content, index) => loadContent(content, index, loadJson, loadMesh));\r\n\r\n Promise.all(promises)\r\n //self.json.contents.forEach(content=> loadContent(content, i))\r\n }\r\n\r\n async function loadContent(content, contentIndex, loadJson, loadMesh) {\r\n let url;\r\n if (!!content.uri) {\r\n url = content.uri;\r\n } else if (!!content.url) {\r\n url = content.url;\r\n }\r\n const urlRegex = /^(?:http|https|ftp|tcp|udp):\\/\\/\\S+/;\r\n\r\n if (urlRegex.test(self.rootPath)) { // url\r\n\r\n if (!urlRegex.test(url)) {\r\n url = self._assembleURL(self.rootPath, url);\r\n }\r\n } else { //path\r\n if (path.isAbsolute(self.rootPath)) {\r\n url = self.rootPath + path.sep + url;\r\n }\r\n }\r\n url = self._extractQueryParams(url, self.queryParams);\r\n if (self.queryParams) {\r\n var props = \"\";\r\n for (let key in self.queryParams) {\r\n if (self.queryParams.hasOwnProperty(key)) { // This check is necessary to skip properties from the object's prototype chain\r\n props += \"&\" + key + \"=\" + self.queryParams[key];\r\n }\r\n }\r\n if (url.includes(\"?\")) {\r\n url += props;\r\n } else {\r\n url += \"?\" + props.substring(1);\r\n }\r\n }\r\n\r\n if (!!url) {\r\n if (loadMesh && (url.includes(\".b3dm\") || url.includes(\".glb\") || url.includes(\".gltf\"))) {\r\n self.contentURL.push(url);\r\n try {\r\n\r\n self.tileLoader.get(self.abortController, self.uuid, url, mesh => {\r\n\r\n if (!!self.deleted) {\r\n return;\r\n }\r\n if (mesh.asset && mesh.asset.copyright) {\r\n mesh.asset.copyright.split(';').forEach(s => {\r\n if (!!copyright[s]) {\r\n copyright[s]++;\r\n } else {\r\n copyright[s] = 1;\r\n }\r\n });\r\n if (self.displayCopyright) {\r\n _updateCopyrightLabel();\r\n }\r\n }\r\n\r\n self.meshContent.push(mesh);\r\n if (!self.splatsMesh) {\r\n mesh.traverse((o) => {\r\n if (o.isMesh || o.isPoints) {\r\n o.layers.disable(0);\r\n\r\n //if(o.material.transparent) o.layers.enable(31);\r\n }\r\n if (o.isMesh) {\r\n\r\n if (self.occlusionCullingService) {\r\n const position = o.geometry.attributes.position;\r\n const colors = [];\r\n for (let i = 0; i < position.count; i++) {\r\n colors.push(self.color.r, self.color.g, self.color.b);\r\n }\r\n o.geometry.setAttribute('color', new THREE.Float32BufferAttribute(colors, 3));\r\n }\r\n\r\n //o.material.visible = false;\r\n }\r\n });\r\n self.add(mesh);\r\n self.updateMatrices();\r\n }\r\n\r\n\r\n }, !self.cameraOnLoad ? () => 0 : () => {\r\n if(self.loadingStrategy == \"IMMEDIATE\"){\r\n return self._calculateDistanceToCamera(self.cameraOnLoad);\r\n }\r\n let multiplier = 1;\r\n if ((self.metric && self.metric < 0) || self.deleted) multiplier = 2;\r\n if (self.parentTile) {\r\n return self.parentTile._calculateDistanceToCamera(self.cameraOnLoad) * multiplier * self.level;\r\n } else {\r\n return self._calculateDistanceToCamera(self.cameraOnLoad) * multiplier * self.level;\r\n }\r\n }, () => self._getSiblings(),\r\n self.level,\r\n self.loadingStrategy,\r\n !!self.json.boundingVolume.region ? false : true,\r\n !!self.json.boundingVolume.region,\r\n self.geometricError,\r\n self.splatsMesh\r\n );\r\n } catch (e) {\r\n if (self.displayErrors) _showError(e)\r\n }\r\n\r\n\r\n } else if (loadJson && url.includes(\".json\")) {\r\n self.jsonRequested = url;\r\n self.tileLoader.get(self.abortController, self.uuid, url, async json => {\r\n if (!!self.deleted) return;\r\n\r\n json.rootPath = path.dirname(url);\r\n self.json.children.push(json);\r\n if (contentIndex == null) {\r\n delete self.json.content;\r\n } else {\r\n delete self.json.contents.splice(contentIndex, 1);\r\n }\r\n\r\n self.hasUnloadedJSONContent--;\r\n /* self.matrixWorldNeedsUpdate = true;\r\n self.updateMatrix();\r\n if (self.parentTile) {\r\n self.parentTile.updateMatrixWorld(true);\r\n //self.parentTile.updateWorldMatrix(true, true);\r\n } */\r\n });\r\n\r\n }\r\n\r\n\r\n /* self.matrixWorldNeedsUpdate = true;\r\n self.updateMatrix();\r\n if (self.parentTile) {\r\n self.parentTile.updateMatrixWorld(true);\r\n //self.parentTile.updateWorldMatrix(true, true);\r\n } */\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Disposes of all the resources used by the tileset.\r\n */\r\n dispose() {\r\n\r\n const self = this;\r\n\r\n\r\n self.meshContent.forEach(mc => {\r\n if (!!mc && !!mc.asset && mc.asset.copyright) {\r\n mc.asset.copyright.split(';').forEach(s => {\r\n if (!!copyright[s]) {\r\n copyright[s]--;\r\n }\r\n });\r\n if (self.displayCopyright) {\r\n _updateCopyrightLabel();\r\n }\r\n }\r\n })\r\n self.meshContent = [];\r\n if (self.bbox) self.bbox.dispose();\r\n\r\n\r\n self.childrenTiles.forEach(tile => tile.dispose());\r\n self.deleted = true;\r\n\r\n if (self.splatsMesh) {\r\n \r\n self.meshContent.forEach(splat => splat.hide());\r\n if (!self.parentTile) {\r\n self.splatsMesh.dispose();\r\n }\r\n }\r\n if (!!self.contentURL) {\r\n self.contentURL.forEach(url => {\r\n self.tileLoader.invalidate(url, self.uuid);\r\n })\r\n self.contentURL = [];\r\n }\r\n\r\n if (!!self.abortController) { // abort tile request\r\n self.abortController.abort(\"tile not needed\");\r\n }\r\n this.parent = null;\r\n //this.parentTile = null;\r\n this.dispatchEvent({ type: 'removed' });\r\n }\r\n _disposeMeshContent() {\r\n const self = this;\r\n if (!!self.deleted) return;\r\n self.deleted = true;\r\n if (!!self.abortController) { // abort tile request\r\n self.abortController.abort(\"tile not needed\");\r\n self.abortController = new AbortController();\r\n }\r\n for (let i = self.meshContent.length - 1; i >= 0; i--) {\r\n const mc = self.meshContent[i];\r\n if (!!mc && !!mc.asset && mc.asset.copyright) {\r\n mc.asset.copyright.split(';').forEach(s => {\r\n if (!!copyright[s]) {\r\n copyright[s]--;\r\n }\r\n });\r\n if (self.displayCopyright) {\r\n _updateCopyrightLabel();\r\n }\r\n }\r\n\r\n self.remove(mc);\r\n }\r\n if (self.splatsMesh) {\r\n self.meshContent.forEach(splat => splat.hide());\r\n }\r\n self.meshContent = [];\r\n self.contentURL.forEach(url => {\r\n //console.log(url)\r\n self.tileLoader.invalidate(url, self.uuid);\r\n })\r\n self.contentURL = [];\r\n\r\n }\r\n _disposeChildren() {\r\n var self = this;\r\n\r\n self.childrenTiles.forEach(tile => {\r\n tile.dispose();\r\n self.remove(tile)\r\n });\r\n self.childrenTiles = [];\r\n /* self.children = [];\r\n if (self.meshContent.length > 0) {\r\n self.meshContent.forEach(mc => {\r\n self.children.push(mc);\r\n });\r\n } */\r\n }\r\n\r\n raycast(raycaster, intersects) {\r\n //console.log(\"raycast\")\r\n if (!this.splatsMesh) {\r\n return super.raycast(raycaster, intersects);\r\n } else {\r\n tempRay.copy(raycaster.ray);\r\n inverseWorld.copy(this.matrixWorld).invert();\r\n tempRay.applyMatrix4(inverseWorld);\r\n let intersection = false;\r\n if (this.boundingVolume instanceof OBB) {\r\n intersection = this.boundingVolume.intersectsRay(tempRay);\r\n } else if (this.boundingVolume instanceof THREE.Sphere) {\r\n //sphere\r\n intersection = ray.intersectsSphere(this.boundingVolume);\r\n } else {\r\n return false;\r\n\r\n }\r\n if (intersection && this.materialVisibility && this.splatsReady) {\r\n tempIntersects.length = 0;\r\n this.meshContent.forEach(mc => {\r\n if (mc.isSplatsBatch) {\r\n mc.raycast(tempRay, tempIntersects, raycaster.params.Points.threshold);\r\n tempIntersects.forEach(t => {\r\n t.point.applyMatrix4(this.matrixWorld);\r\n }),\r\n intersects.push(...tempIntersects);\r\n }\r\n })\r\n }\r\n\r\n return intersection;\r\n }\r\n }\r\n\r\n /**\r\n * To be called in the render loop.\r\n * @param {THREE.Camera} camera a camera that the tileset will be rendered with.\r\n * @returns {{numTilesLoaded: number, numTilesRendered: number, maxLOD: number, percentageLoaded: number}} An object containing describing the current state of the loaded tileset.\r\n */\r\n update(camera) {\r\n const frustum = new THREE.Frustum();\r\n frustum.setFromProjectionMatrix(new THREE.Matrix4().multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse));\r\n\r\n\r\n\r\n let numTiles = [0];\r\n let numTilesRendered = [0];\r\n let maxLOD = [0];\r\n let percentageLoaded = [0];\r\n if (this.refine == \"REPLACE\") {\r\n switch (this.loadingStrategy) {\r\n case \"IMMEDIATE\": this._updateImmediate(camera, frustum); this._statsImmediate(maxLOD, numTiles, percentageLoaded, numTilesRendered); break;\r\n default: this._update(camera, frustum); this._stats(maxLOD, numTiles, percentageLoaded, numTilesRendered);\r\n }\r\n } else {\r\n this._update(camera, frustum);\r\n this._stats(maxLOD, numTiles, percentageLoaded, numTilesRendered);\r\n }\r\n\r\n if (numTiles > 0) {\r\n percentageLoaded[0] /= numTiles[0];\r\n }\r\n\r\n //// sort ////\r\n if (this.splatsMesh) {\r\n transformedCameraPosition.copy(camera.position);\r\n inverseWorld.copy(this.matrixWorld).invert();\r\n transformedCameraPosition.applyMatrix4(inverseWorld);\r\n\r\n this.splatsMesh.sort(transformedCameraPosition);\r\n }\r\n\r\n return { numTilesLoaded: numTiles[0], numTilesRendered: numTilesRendered[0], maxLOD: maxLOD[0], percentageLoaded: percentageLoaded[0] }\r\n }\r\n\r\n _updateImmediate(camera, frustum) {\r\n this._computeMetricRecursive(camera, frustum);\r\n this._updateNodeVisibilityImmediate();\r\n this._expandTreeImmediate(camera);\r\n this.shouldBeVisible = this.metric > 0 ? true : !!this.loadOutsideView;\r\n this._shouldBeVisibleUpdateImmediate();\r\n this._trimTreeImmediate();\r\n this._loadMeshImmediate();\r\n\r\n\r\n }\r\n\r\n\r\n _statsImmediate(maxLOD, numTiles, percentageLoaded, numTilesRendered) {\r\n maxLOD[0] = Math.max(maxLOD[0], this.level);\r\n if (this.shouldBeVisible || !!this.materialVisibility) {\r\n numTiles[0]++;\r\n if (!!this.materialVisibility) percentageLoaded[0]++;\r\n }\r\n if (!!this.materialVisibility) numTilesRendered[0]++;\r\n\r\n\r\n this.childrenTiles.forEach(child => {\r\n child._statsImmediate(maxLOD, numTiles, percentageLoaded, numTilesRendered);\r\n })\r\n }\r\n _stats(maxLOD, numTiles, percentageLoaded, numTilesRendered) {\r\n maxLOD[0] = Math.max(maxLOD[0], this.level);\r\n if (this.hasMeshContent) {\r\n numTiles[0]++;\r\n if (this.meshContent.length == this.hasMeshContent) percentageLoaded[0]++;\r\n if (!!this.materialVisibility) numTilesRendered[0]++;\r\n }\r\n\r\n\r\n this.childrenTiles.forEach(child => {\r\n child._stats(maxLOD, numTiles, percentageLoaded, numTilesRendered);\r\n })\r\n }\r\n\r\n\r\n\r\n _trimTreeImmediate() {\r\n if (this.metric == undefined) return;\r\n\r\n else if (this.hasMeshContent && ((this.shouldBeVisible && this.materialVisibility))) {\r\n if (self.splatsMesh && !self.splatsReady) {\r\n return;\r\n }\r\n this._disposeChildren();\r\n } else {\r\n this.childrenTiles.forEach(child => {\r\n child._trimTreeImmediate();\r\n })\r\n }\r\n\r\n }\r\n _updateNodeVisibilityImmediate(parentDisplaysMesh = false) {\r\n //updateNodeVisibilityCount++;\r\n\r\n const self = this;\r\n if (!self.hasMeshContent) {\r\n self.childrenTiles.forEach(child => {\r\n child._updateNodeVisibilityImmediate(parentDisplaysMesh);\r\n })\r\n return;\r\n }\r\n\r\n if (self.shouldBeVisible) {\r\n if (self.meshContent.length == self.hasMeshContent) {\r\n if (!self.materialVisibility) {\r\n self._changeContentVisibility(true);\r\n self.childrenTiles.forEach(child => {\r\n child._updateNodeVisibilityImmediate(parentDisplaysMesh);\r\n })\r\n } else {\r\n self.childrenTiles.forEach(child => {\r\n child._updateNodeVisibilityImmediate(true);\r\n })\r\n }\r\n\r\n } else {\r\n self.childrenTiles.forEach(child => {\r\n child._updateNodeVisibilityImmediate(parentDisplaysMesh);\r\n })\r\n }\r\n } else {\r\n if (!self.loadOutsideView && self.metric < 0) {\r\n self._changeContentVisibility(false);\r\n if (self.meshContent.length > 0) self._disposeMeshContent();\r\n self.childrenTiles.forEach(child => {\r\n child._updateNodeVisibilityImmediate(true);\r\n })\r\n return;\r\n }\r\n\r\n if (self.materialVisibility && (!self.splatsMesh || self.splatsReady)) {\r\n\r\n if (parentDisplaysMesh) {\r\n self._changeContentVisibility(false);\r\n if (self.meshContent.length > 0) self._disposeMeshContent();\r\n self.childrenTiles.forEach(child => {\r\n child._updateNodeVisibilityImmediate(parentDisplaysMesh);\r\n })\r\n } else {\r\n let allChildrenReady = true;\r\n self.childrenTiles.every(child => {\r\n\r\n if (!child._isReadyImmediate()) {\r\n allChildrenReady = false;\r\n return false;\r\n }\r\n return true;\r\n });\r\n if (allChildrenReady && self.childrenTiles.length > 0) {\r\n self._changeContentVisibility(false);\r\n if (self.meshContent.length > 0) self._disposeMeshContent();\r\n self.childrenTiles.forEach(child => {\r\n child._updateNodeVisibilityImmediate(parentDisplaysMesh);\r\n })\r\n } else {\r\n\r\n self.childrenTiles.forEach(child => {\r\n child._updateNodeVisibilityImmediate((!self.splatsMesh || self.splatsReady));\r\n })\r\n }\r\n }\r\n\r\n } else {\r\n\r\n self.childrenTiles.forEach(child => {\r\n child._updateNodeVisibilityImmediate(parentDisplaysMesh);\r\n })\r\n }\r\n }\r\n\r\n\r\n\r\n }\r\n _shouldBeVisibleUpdateImmediate() {\r\n const self = this;\r\n if (!self.hasMeshContent) {\r\n\r\n self.childrenTiles.forEach(child => {\r\n child.shouldBeVisible = true;\r\n child._shouldBeVisibleUpdateImmediate();\r\n })\r\n self.shouldBeVisible = false;\r\n\r\n }\r\n else if (self.metric == undefined) {\r\n self.shouldBeVisible = false;\r\n }\r\n else if (self.metric < 0) {\r\n self.shouldBeVisible = !!self.loadOutsideView;\r\n self.childrenTiles.forEach(child => {\r\n child._setShouldNotBeVisibleRecursive();\r\n });\r\n }\r\n else if (self.metric < self.geometricErrorMultiplier * self.geometricError) {\r\n if (self.hasUnloadedJSONContent) {\r\n //self.shouldBeVisible = true;\r\n\r\n } else {\r\n if (!!self.json && !!self.json.children && self.json.children.length > 0) {\r\n self.shouldBeVisible = false;\r\n self.childrenTiles.forEach(child => {\r\n child.shouldBeVisible = true;\r\n child._shouldBeVisibleUpdateImmediate();\r\n })\r\n\r\n } else {\r\n self.shouldBeVisible = true;\r\n\r\n }\r\n }\r\n\r\n } else {\r\n\r\n self.childrenTiles.forEach(child => {\r\n child._setShouldNotBeVisibleRecursive();\r\n });\r\n }\r\n }\r\n\r\n _setShouldNotBeVisibleRecursive() {\r\n const self = this;\r\n self.shouldBeVisible = false;\r\n self.childrenTiles.forEach(child => {\r\n child._setShouldNotBeVisibleRecursive();\r\n })\r\n }\r\n _loadMeshImmediate() {\r\n const self = this;\r\n if (!self.hasMeshContent) {\r\n self.childrenTiles.forEach(child => {\r\n child._loadMeshImmediate();\r\n });\r\n return;\r\n }\r\n if (self.shouldBeVisible) {\r\n if (self.meshContent.length < self.hasMeshContent &&\r\n self.contentURL.length == 0) {\r\n\r\n self.deleted = false;\r\n\r\n self._load(false, true);\r\n }\r\n } else {\r\n self.childrenTiles.forEach(child => {\r\n child._loadMeshImmediate();\r\n })\r\n }\r\n\r\n }\r\n\r\n _computeMetricRecursive(camera, frustum) {\r\n const self = this;\r\n self.metric = -1;\r\n if (!self.isSetup) return;\r\n\r\n if (!!self.boundingVolume && !!self.geometricError) {\r\n self.metric = self._calculateUpdateMetric(camera, frustum);\r\n }\r\n self.childrenTiles.forEach(child => child._computeMetricRecursive(camera, frustum));\r\n\r\n\r\n }\r\n\r\n\r\n _expandTreeImmediate(camera) {\r\n const self = this;\r\n\r\n if (!self.hasUnloadedJSONContent) {\r\n if (!self.hasMeshContent) {\r\n if (!!self.json && !!self.json.children && self.childrenTiles.length < self.json.children.length) {\r\n self._loadJsonChildren(camera);\r\n\r\n }\r\n } else {\r\n if (self.occlusionCullingService && self.hasMeshContent && !self.occlusionCullingService.hasID(self.colorID)) {\r\n // don't load children\r\n } else {\r\n if (self.metric >= 0 && self.metric < self.geometricErrorMultiplier * self.geometricError &&\r\n !!self.json && !!self.json.children && self.childrenTiles.length < self.json.children.length\r\n ) {\r\n self._loadJsonChildren(camera);\r\n }\r\n }\r\n }\r\n\r\n }\r\n\r\n self.childrenTiles.forEach(child => child._expandTreeImmediate(camera));\r\n }\r\n\r\n\r\n _update(camera, frustum) {\r\n const self = this;\r\n\r\n if (!self.isSetup) return;\r\n // let dist = self.boundingVolume.distanceToPoint(new THREE.Vector3(3980, 4980.416656099139, 3.2851604304346775));\r\n // if (dist< 1) {\r\n // self._changeContentVisibility(false);\r\n // console.log(dist+\" \"+self.level)\r\n // }\r\n const visibilityBeforeUpdate = self.materialVisibility;\r\n\r\n if (!!self.boundingVolume && !!self.geometricError) {\r\n self.metric = self._calculateUpdateMetric(camera, frustum);\r\n }\r\n self.childrenTiles.forEach(child => child._update(camera, frustum));\r\n\r\n _updateNodeVisibility(self.metric);\r\n _updateTree(self.metric);\r\n _trimTree(self.metric, visibilityBeforeUpdate);\r\n\r\n\r\n\r\n function _updateTree(metric) {\r\n // If this tile does not have mesh content but it has children\r\n if (metric < 0 && self.hasMeshContent) return;\r\n if (self.occlusionCullingService && self.hasMeshContent && !self.occlusionCullingService.hasID(self.colorID)) {\r\n return;\r\n }\r\n if (!self.hasMeshContent || (metric <= self.geometricErrorMultiplier * self.geometricError && self.meshContent.length > 0)) {\r\n if (!!self.json && !!self.json.children && self.childrenTiles.length != self.json.children.length) {\r\n self._loadJsonChildren(camera);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n\r\n function _updateNodeVisibility(metric) {\r\n\r\n //doesn't have a mesh content\r\n if (!self.hasMeshContent) return;\r\n\r\n // mesh content not yet loaded\r\n if (self.meshContent.length < self.hasMeshContent) {\r\n return;\r\n }\r\n\r\n\r\n // outside frustum\r\n if (metric < 0) {\r\n self.inFrustum = false;\r\n self._changeContentVisibility(!!self.loadOutsideView);\r\n return;\r\n } else {\r\n self.inFrustum = true;\r\n }\r\n\r\n // has no children\r\n if (self.childrenTiles.length == 0) {\r\n self._changeContentVisibility(true);\r\n return;\r\n }\r\n\r\n // has children\r\n if (metric >= self.geometricErrorMultiplier * self.geometricError) { // Ideal LOD or before this lod\r\n\r\n self._changeContentVisibility(true);\r\n } else if (metric < self.geometricErrorMultiplier * self.geometricError) { // Ideal LOD is past this one\r\n // if children are visible and have been displayed, can be hidden\r\n if (self.refine == \"REPLACE\") {\r\n let allChildrenReady = true;\r\n self.childrenTiles.every(child => {\r\n\r\n if (!child._isReady()) {\r\n allChildrenReady = false;\r\n return false;\r\n }\r\n return true;\r\n });\r\n if (allChildrenReady) {\r\n self._changeContentVisibility(false);\r\n }\r\n else {\r\n self._changeContentVisibility(true);\r\n }\r\n }\r\n\r\n\r\n }\r\n }\r\n\r\n\r\n\r\n function _trimTree(metric, visibilityBeforeUpdate) {\r\n if (!self.hasMeshContent) return;\r\n if (!self.inFrustum) { // outside frustum\r\n self._disposeChildren();\r\n //_updateNodeVisibility(metric);\r\n return;\r\n }\r\n if (self.occlusionCullingService &&\r\n !visibilityBeforeUpdate &&\r\n self.hasMeshContent &&\r\n self.meshContent.length > 0 &&\r\n self.materialVisibility &&\r\n self._areAllChildrenLoadedAndHidden()) {\r\n \r\n if (self.splatsMesh && this.materialVisibility && !self.splatsReady) {\r\n return;\r\n }\r\n self._disposeChildren();\r\n //_updateNodeVisibility(metric);\r\n return;\r\n }\r\n if (metric >= self.geometricErrorMultiplier * self.geometricError) {\r\n if (self.splatsMesh && self.materialVisibility && !self.splatsReady) {\r\n return;\r\n }\r\n self._disposeChildren();\r\n //_updateNodeVisibility(metric);\r\n return;\r\n }\r\n\r\n }\r\n\r\n\r\n\r\n }\r\n\r\n _loadJsonChildren(camera) {\r\n const self = this;\r\n for (let i = self.json.children.length - 1; i >= 0; i--) {\r\n if (!self.json.children[i].root && !self.json.children[i].children && !self.json.children[i].getChildren && !self.json.children[i].content && !self.json.children[i].contents) {\r\n self.json.children.splice(i, 1);\r\n }\r\n }\r\n self.json.children.forEach(childJSON => {\r\n\r\n let childTile = new OGC3DTile({\r\n parentTile: self,\r\n queryParams: self.queryParams,\r\n parentGeometricError: self.geometricError,\r\n parentBoundingVolume: self.boundingVolume,\r\n parentRefine: self.refine,\r\n json: childJSON,\r\n rootPath: self.rootPath,\r\n geometricErrorMultiplier: self.geometricErrorMultiplier,\r\n loadOutsideView: self.loadOutsideView,\r\n level: Math.floor(self.level) + 1,\r\n tileLoader: self.tileLoader,\r\n cameraOnLoad: camera,\r\n occlusionCullingService: self.occlusionCullingService,\r\n renderer: self.renderer,\r\n static: self.static,\r\n centerModel: false,\r\n displayErrors: self.displayErrors,\r\n displayCopyright: self.displayCopyright,\r\n distanceBias: self.distanceBias,\r\n loadingStrategy: self.loadingStrategy,\r\n drawBoundingVolume: self.drawBoundingVolume,\r\n splatsMesh: self.splatsMesh\r\n });\r\n self.childrenTiles.push(childTile);\r\n self.add(childTile);\r\n });\r\n\r\n self.updateMatrices(true);\r\n }\r\n\r\n _areAllChildrenLoadedAndHidden() {\r\n let allLoadedAndHidden = true;\r\n const self = this;\r\n this.childrenTiles.every(child => {\r\n if (child.hasMeshContent) {\r\n if (child.childrenTiles.length > 0) {\r\n allLoadedAndHidden = false;\r\n return false;\r\n }\r\n if (!child.metric < 0) {\r\n return true;\r\n };\r\n if (child.materialVisibility && (!self.splatsMesh || self.splatsReady)) {\r\n allLoadedAndHidden = false;\r\n return false;\r\n } else if (self.occlusionCullingService.hasID(child.colorID)) {\r\n allLoadedAndHidden = false;\r\n return false;\r\n }\r\n } else {\r\n if (!child._areAllChildrenLoadedAndHidden()) {\r\n allLoadedAndHidden = false;\r\n return false;\r\n }\r\n }\r\n return true;\r\n });\r\n return allLoadedAndHidden;\r\n }\r\n\r\n /**\r\n * Node is ready if it is outside frustum, if it was drawn at least once or if all it's children are ready\r\n * @returns true if ready\r\n */\r\n _isReady() {\r\n\r\n // if outside frustum\r\n if (this.metric == undefined) {\r\n return false;\r\n }\r\n if (this.metric < 0) {\r\n return true;\r\n }\r\n // if json is not done loading\r\n if (this.hasUnloadedJSONContent) {\r\n return false;\r\n }\r\n // if empty tile\r\n if (!this.hasMeshContent && this.json.children.length == 0 && !this.hasUnloadedJSONContent) {\r\n return true;\r\n }\r\n // if this tile has no mesh content or if it's marked as visible false, look at children\r\n if ((!this.hasMeshContent || this.meshContent.length == 0 || (!this.materialVisibility) || (self.splatsMesh && !self.splatsReady))) {\r\n if (this.children.length > 0) {\r\n var allChildrenReady = true;\r\n this.childrenTiles.every(child => {\r\n if (!child._isReady()) {\r\n allChildrenReady = false;\r\n //console.log(child.level)\r\n return false;\r\n }\r\n return true;\r\n });\r\n return allChildrenReady;\r\n } else {\r\n return false\r\n }\r\n\r\n }\r\n\r\n\r\n // if this tile has no mesh content\r\n if (!this.hasMeshContent) {\r\n return true;\r\n }\r\n // if mesh content not yet loaded\r\n if (this.meshContent.length < this.hasMeshContent) {\r\n return false;\r\n }\r\n\r\n\r\n if (this.materialVisibility && (!this.splatsMesh || this.splatsReady)) {\r\n return true;\r\n }\r\n\r\n\r\n\r\n return false;\r\n\r\n }\r\n\r\n _isReadyImmediate() {\r\n\r\n if (!!this.materialVisibility || (!this.loadOutsideView && this.metric < 0)) {\r\n return true;\r\n } else {\r\n /* if (this.splatsMesh) {\r\n if (this.splatsReady) {\r\n return true\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n return false;\r\n } */\r\n //return false;\r\n if (this.childrenTiles.length > 0) {\r\n var allChildrenReady = true;\r\n this.childrenTiles.every(child => {\r\n if (!child._isReadyImmediate()) {\r\n allChildrenReady = false;\r\n return false;\r\n }\r\n return true;\r\n });\r\n return allChildrenReady;\r\n } else {\r\n return false;\r\n /* if (this.splatsMesh) {\r\n if (this.splatsReady) {\r\n return true\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n return false;\r\n } */\r\n }\r\n }\r\n\r\n\r\n }\r\n\r\n\r\n _changeContentVisibility(visibility) {\r\n const self = this;\r\n if (self.bbox) {\r\n\r\n self.bbox.material.visible = visibility;\r\n }\r\n if (self.splatsMesh) {\r\n if (visibility != self.materialVisibility) {\r\n let splatsCount = 0;\r\n self.meshContent.forEach(mc => {\r\n if (visibility && mc.isSplatsBatch) {\r\n self.splatsReady = true;\r\n splatsCount++;\r\n \r\n mc.show(() => {\r\n if(self.materialVisibility){\r\n self.splatsReady = true;\r\n }\r\n \r\n });\r\n\r\n }\r\n else {\r\n mc.hide();\r\n //self.splatsReady = false;\r\n }\r\n });\r\n\r\n self.materialVisibility = visibility;\r\n }\r\n } else {\r\n if (self.hasMeshContent && self.meshContent.length > 0) {\r\n if (visibility) {\r\n self.meshContent.forEach(mc => {\r\n mc.traverse((o) => {\r\n if (o.isMesh || o.isPoints) {\r\n o.layers.enable(0);\r\n }\r\n });\r\n })\r\n\r\n } else {\r\n self.meshContent.forEach(mc => {\r\n mc.traverse((o) => {\r\n if (o.isMesh || o.isPoints) {\r\n o.layers.disable(0);\r\n }\r\n });\r\n })\r\n\r\n }\r\n }\r\n\r\n if (self.materialVisibility == visibility) {\r\n return;\r\n }\r\n self.materialVisibility = visibility\r\n }\r\n\r\n\r\n\r\n\r\n\r\n }\r\n _calculateUpdateMetric(camera, frustum) {\r\n ////// return -1 if not in frustum\r\n let distance = 0;\r\n if (this.boundingVolume instanceof OBB) {\r\n // box\r\n tempOBB.copy(this.boundingVolume);\r\n tempOBB.applyMatrix4(this.matrixWorld);\r\n if (!tempOBB.inFrustum(frustum)) return -1;\r\n distance = Math.max(0, tempOBB.distanceToPoint(camera.position) - camera.near);\r\n\r\n /* tempSphere.center.copy(this.boundingVolume.center);\r\n tempSphere.radius = Math.sqrt(this.boundingVolume.halfSize.x*this.boundingVolume.halfSize.x+ this.boundingVolume.halfSize.y*this.boundingVolume.halfSize.y+ this.boundingVolume.halfSize.z*this.boundingVolume.halfSize.z)\r\n tempSphere.applyMatrix4(this.matrixWorld);\r\n if (!frustum.intersectsSphere(tempSphere)) return -1;\r\n distance = Math.max(0, camera.position.distanceTo(tempSphere.center) - tempSphere.radius - camera.near); */\r\n } else if (this.boundingVolume instanceof THREE.Sphere) {\r\n //sphere\r\n tempSphere.copy(this.boundingVolume);\r\n tempSphere.applyMatrix4(this.matrixWorld);\r\n if (!frustum.intersectsSphere(tempSphere)) return -1;\r\n distance = Math.max(0, camera.position.distanceTo(tempSphere.center) - tempSphere.radius - camera.near);\r\n } else {\r\n console.error(\"unsupported shape\");\r\n return -1\r\n\r\n }\r\n\r\n /////// Apply the bias factor to the distance\r\n distance = Math.pow(distance, this.distanceBias);\r\n /////// return metric based on geometric error and distance\r\n\r\n\r\n if (distance == 0) {\r\n return 0;\r\n }\r\n const scale = this.matrixWorld.getMaxScaleOnAxis();\r\n if (!!this.renderer) {\r\n this.renderer.getDrawingBufferSize(this.rendererSize);\r\n }\r\n let s = this.rendererSize.y;\r\n let fov = camera.fov;\r\n if (camera.aspect < 1) {\r\n fov *= camera.aspect;\r\n s = this.rendererSize.x;\r\n }\r\n\r\n let lambda = 2.0 * Math.tan(0.5 * fov * 0.01745329251994329576923690768489) * distance;\r\n\r\n return (window.devicePixelRatio * 16 * lambda) / (s * scale);\r\n }\r\n\r\n _getSiblings() {\r\n const self = this;\r\n const tiles = [];\r\n if (!self.parentTile) return tiles;\r\n let p = self.parentTile;\r\n while (!p.hasMeshContent && !!p.parentTile) {\r\n p = p.parentTile;\r\n }\r\n p.childrenTiles.forEach(child => {\r\n if (!!child && child != self) {\r\n while (!child.hasMeshContent && !!child.childrenTiles[0]) {\r\n child = child.childrenTiles[0];\r\n }\r\n tiles.push(child);\r\n }\r\n });\r\n return tiles;\r\n }\r\n _calculateDistanceToCamera(camera) {\r\n if (this.boundingVolume instanceof OBB) {\r\n // box\r\n tempOBB.copy(this.boundingVolume);\r\n tempOBB.applyMatrix4(this.matrixWorld);\r\n return Math.max(0, tempOBB.distanceToPoint(camera.position));\r\n //if (!frustum.intersectsSphere(tempSphere)) return -1;\r\n } else if (this.boundingVolume instanceof THREE.Sphere) {\r\n //sphere\r\n tempSphere.copy(this.boundingVolume);\r\n tempSphere.applyMatrix4(this.matrixWorld);\r\n return Math.max(0, camera.position.distanceTo(tempSphere.center) - tempSphere.radius);\r\n }\r\n else {\r\n console.error(\"unsupported shape\");\r\n return -1;\r\n }\r\n\r\n }\r\n\r\n /**\r\n * Set the Geometric Error Multiplier for the tileset.\r\n * the {@param geometricErrorMultiplier} can be a number between 1 and infinity.\r\n * A {@param geometricErrorMultiplier} of 1 (default) corresponds to a max ScreenSpace error (MSE) of 16. \r\n * A lower {@param geometricErrorMultiplier} loads less detail (higher MSE) and a higher {@param geometricErrorMultiplier} loads more detail (lower MSE)\r\n * \r\n * @param {Number} geometricErrorMultiplier set the LOD multiplier for the entire tileset\r\n */\r\n setGeometricErrorMultiplier(geometricErrorMultiplier) {\r\n this.geometricErrorMultiplier = geometricErrorMultiplier;\r\n this.splatsReady = true;\r\n this.childrenTiles.forEach(child => child.setGeometricErrorMultiplier(geometricErrorMultiplier));\r\n }\r\n\r\n /**\r\n * Set the Distance Bias for the tileset.\r\n * the {@param distanceBias} can be a number between 0 and infinity.\r\n * A {@param distanceBias} is applied as an exponent to camera-to-tile distance. \r\n * the {@link geometricErrorMultiplier} should be used to balance out the amount of detail loaded\r\n * \r\n * @param {Number} distanceBias set the distance bias for the entire tileset\r\n */\r\n setDistanceBias(distanceBias) {\r\n this.distanceBias = distanceBias;\r\n this.childrenTiles.forEach(child => child.setDistanceBias(distanceBias));\r\n }\r\n\r\n _transformWGS84ToCartesian(lon, lat, h, sfct) {\r\n const a = 6378137.0;\r\n const e = 0.006694384442042;\r\n const N = a / (Math.sqrt(1.0 - (e * Math.pow(Math.sin(lat), 2))));\r\n const cosLat = Math.cos(lat);\r\n const cosLon = Math.cos(lon);\r\n const sinLat = Math.sin(lat);\r\n const sinLon = Math.sin(lon);\r\n const nPh = (N + h);\r\n const x = nPh * cosLat * cosLon;\r\n const y = nPh * cosLat * sinLon;\r\n const z = (0.993305615557957 * N + h) * sinLat;\r\n\r\n sfct.set(x, y, z);\r\n }\r\n}\r\nexport { OGC3DTile, getOGC3DTilesCopyrightInfo };\r\n\r\nfunction _showError(error) {\r\n // Create a new div element\r\n var errorDiv = document.createElement(\"div\");\r\n\r\n // Set its text content\r\n errorDiv.textContent = error;\r\n\r\n // Set styles\r\n errorDiv.style.position = 'fixed'; // Fix position to the viewport\r\n errorDiv.style.top = '10px'; // Set top position\r\n errorDiv.style.left = '50%'; // Center horizontally\r\n errorDiv.style.transform = 'translateX(-50%)'; // Make sure it's centered accurately\r\n errorDiv.style.padding = '10px'; // Add some padding\r\n errorDiv.style.backgroundColor = '#ff8800'; // Set a background color\r\n errorDiv.style.color = '#ffffff'; // Set a text color\r\n errorDiv.style.zIndex = '9999'; // Make sure it's on top of other elements\r\n\r\n // Append the new div to the body\r\n document.body.appendChild(errorDiv);\r\n\r\n // After 3 seconds, remove the error message\r\n setTimeout(function () {\r\n errorDiv.remove();\r\n }, 8000);\r\n}\r\n\r\nfunction _updateCopyrightLabel() {\r\n // Create a new div\r\n if (!copyrightDiv) {\r\n copyrightDiv = document.createElement('div');\r\n copyrightDiv.style.position = 'fixed';\r\n copyrightDiv.style.bottom = '20px';\r\n copyrightDiv.style.left = '20px';\r\n copyrightDiv.style.color = 'white';\r\n copyrightDiv.style.textShadow = '2px 2px 0 #000, -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000';\r\n copyrightDiv.style.padding = '10px';\r\n copyrightDiv.style.backgroundColor = 'rgba(0, 0, 0, 0.1)'; // semi-transparent black background\r\n\r\n // Append the div to the body of the document\r\n document.body.appendChild(copyrightDiv);\r\n }\r\n\r\n // Set the text content of the div\r\n const list = getOGC3DTilesCopyrightInfo();\r\n let listString = \"\";\r\n list.forEach(item => {\r\n listString += item + \", \";\r\n });\r\n listString = listString.slice(0, -2);\r\n\r\n copyrightDiv.textContent = listString\r\n // Style the div\r\n\r\n}\r\n\r\n","import * as THREE from 'three';\r\nimport { OBB } from \"../../geometry/obb\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport * as path from \"path-browserify\";\r\n\r\nconst tempSphere = new THREE.Sphere(new THREE.Vector3(0, 0, 0), 1);\r\nconst tempVec1 = new THREE.Vector3(0, 0, 0);\r\nconst tempVec2 = new THREE.Vector3(0, 0, 0);\r\nconst upVector = new THREE.Vector3(0, 1, 0);\r\nconst rendererSize = new THREE.Vector2();\r\nconst tempQuaternion = new THREE.Quaternion();\r\nconst tempMatrix = new THREE.Matrix4();\r\n\r\nclass InstancedTile extends THREE.Object3D {\r\n\r\n /**\r\n * \r\n * @param {\r\n * json: optional,\r\n * url: optional,\r\n * rootPath: optional,\r\n * parentGeometricError: optional,\r\n * parentBoundingVolume: optional,\r\n * parentRefinement: optional,\r\n * loadOutsideView: Boolean,\r\n * tileLoader : InstancedTileLoader,\r\n * cameraOnLoad: camera,\r\n * parentTile: OGC3DTile,\r\n * onLoadCallback: function,\r\n * centerModel: Boolean,\r\n * queryParams: String,\r\n * distanceBias: distanceBias\r\n * } properties \r\n */\r\n constructor(properties) {\r\n super();\r\n const self = this;\r\n if (properties.queryParams) {\r\n this.queryParams = { ...properties.queryParams };\r\n }\r\n this.uuid = uuidv4();\r\n if (!!properties.tileLoader) {\r\n this.tileLoader = properties.tileLoader;\r\n } else {\r\n console.error(\"an instanced tileset must be provided an InstancedTilesetLoader\");\r\n }\r\n // set properties general to the entire tileset\r\n this.master = properties.master;\r\n this.loadOutsideView = properties.loadOutsideView;\r\n this.cameraOnLoad = properties.cameraOnLoad;\r\n this.parentTile = properties.parentTile;\r\n this.distanceBias = Math.max(0.0001,properties.distanceBias? properties.distanceBias:1);\r\n\r\n // declare properties specific to the tile for clarity\r\n this.childrenTiles = [];\r\n this.jsonChildren = [];\r\n this.meshContent = new Set();\r\n\r\n this.static = properties.static;\r\n if (this.static) {\r\n this.matrixAutoUpdate = false;\r\n this.matrixWorldAutoUpdate = false;\r\n }\r\n this.tileContent;\r\n this.refinement; // defaults to \"REPLACE\"\r\n this.rootPath;\r\n this.geometricError;\r\n this.boundingVolume;\r\n this.json; // the json corresponding to this tile\r\n this.materialVisibility = false;\r\n this.inFrustum = true;\r\n this.level = properties.level ? properties.level : 0;\r\n this.hasMeshContent = 0; // true when the provided json has a content field pointing to a B3DM file\r\n this.hasUnloadedJSONContent = 0; // true when the provided json has a content field pointing to a JSON file that is not yet loaded\r\n this.centerModel = properties.centerModel;\r\n\r\n this.deleted = false;\r\n this.abortController = new AbortController();\r\n\r\n if (!!properties.json) { // If this tile is created as a child of another tile, properties.json is not null\r\n this.rootPath = !!properties.json.rootPath ? properties.json.rootPath : properties.rootPath;\r\n if (properties.json.children) this.jsonChildren = properties.json.children;\r\n self.setup(properties);\r\n } else if (properties.url) { // If only the url to the tileset.json is provided\r\n\r\n\r\n this.loadJson = (json, url) => {\r\n //json = JSON.parse(JSON.stringify(json))\r\n const p = path.dirname(url);\r\n self.setup({ rootPath: p, json: json, onLoadCallback: properties.onLoadCallback });\r\n\r\n\r\n\r\n }\r\n var url = properties.url;\r\n if (self.queryParams) {\r\n var props = \"\";\r\n for (let key in self.queryParams) {\r\n if (self.queryParams.hasOwnProperty(key)) { // This check is necessary to skip properties from the object's prototype chain\r\n props += \"&\" + key + \"=\" + self.queryParams[key];\r\n }\r\n }\r\n if (url.includes(\"?\")) {\r\n url += props;\r\n } else {\r\n url += \"?\" + props.substring(1);\r\n }\r\n }\r\n self.tileLoader.get(self.abortController, url, self.uuid, self);\r\n }\r\n }\r\n\r\n async setup(properties) {\r\n const self = this;\r\n\r\n if (!!properties.json.root) {\r\n self.json = properties.json.root;\r\n if (!self.json.children && self.json.getChildren) {\r\n self.json.children = await self.json.getChildren();\r\n }\r\n self.jsonChildren = self.json.children;\r\n if (!self.json.refinement) self.json.refinement = properties.json.refinement;\r\n if (!self.json.geometricError) self.json.geometricError = properties.json.geometricError;\r\n if (!self.json.transform) self.json.transform = properties.json.transform;\r\n if (!self.json.boundingVolume) self.json.boundingVolume = properties.json.boundingVolume;\r\n } else {\r\n self.json = properties.json;\r\n if (!self.json.children && self.json.getChildren) {\r\n self.json.children = await self.json.getChildren();\r\n self.jsonChildren = self.json.children;\r\n }\r\n }\r\n\r\n self.rootPath = !!properties.json.rootPath ? properties.json.rootPath : properties.rootPath;\r\n\r\n // decode refinement\r\n if (!!self.json.refinement) {\r\n self.refinement = self.json.refinement;\r\n } else {\r\n self.refinement = properties.parentRefinement;\r\n }\r\n // decode geometric error\r\n if (!!self.json.geometricError) {\r\n self.geometricError = self.json.geometricError;\r\n } else {\r\n self.geometricError = properties.parentGeometricError;\r\n }\r\n // decode transform\r\n let mat = new THREE.Matrix4();\r\n if (!!self.json.transform && !self.centerModel) {\r\n mat.elements = self.json.transform;\r\n }\r\n\r\n self.applyMatrix4(mat);\r\n\r\n if (!!self.parentTile && !!self.parentTile.matrix) {\r\n\r\n self.matrix.premultiply(self.parentTile.matrix);\r\n //self.matrix.premultiply(self.master.matrixWorld);\r\n self.matrix.decompose(self.position, self.quaternion, self.scale)\r\n }\r\n\r\n\r\n self.matrixWorldNeedsUpdate = true;\r\n self.updateWorldMatrix(true, true)\r\n \r\n\r\n // decode volume\r\n if (!!self.json.boundingVolume) {\r\n if (!!self.json.boundingVolume.box) {\r\n self.boundingVolume = new OBB(self.json.boundingVolume.box);\r\n } else if (!!self.json.boundingVolume.region) {\r\n const region = self.json.boundingVolume.region;\r\n self.transformWGS84ToCartesian(region[0], region[1], region[4], tempVec1);\r\n self.transformWGS84ToCartesian(region[2], region[3], region[5], tempVec2);\r\n tempVec1.lerp(tempVec2, 0.5);\r\n self.boundingVolume = new THREE.Sphere(new THREE.Vector3(tempVec1.x, tempVec1.y, tempVec1.z), tempVec1.distanceTo(tempVec2));\r\n } else if (!!self.json.boundingVolume.sphere) {\r\n const sphere = self.json.boundingVolume.sphere;\r\n self.boundingVolume = new THREE.Sphere(new THREE.Vector3(sphere[0], sphere[1], sphere[2]), sphere[3]);\r\n } else {\r\n self.boundingVolume = properties.parentBoundingVolume;\r\n }\r\n } else {\r\n self.boundingVolume = properties.parentBoundingVolume;\r\n }\r\n\r\n function checkContent(e) {\r\n if (!!e.uri && e.uri.includes(\"json\")) {\r\n self.hasUnloadedJSONContent++;\r\n } else if (!!e.url && e.url.includes(\"json\")) {\r\n self.hasUnloadedJSONContent++;\r\n } else {\r\n self.hasMeshContent++;\r\n }\r\n }\r\n if (!!self.json.content) { //if there is a content, json or otherwise, schedule it to be loaded \r\n checkContent(self.json.content);\r\n\r\n self.load();\r\n } else if (!!self.json.contents) { //if there is a content, json or otherwise, schedule it to be loaded \r\n self.json.contents.forEach(e => checkContent(e))\r\n\r\n self.load();\r\n //scheduleLoadTile(this);\r\n }\r\n\r\n if (!!self.centerModel) {\r\n const tempSphere = new THREE.Sphere();\r\n if (self.boundingVolume instanceof OBB) {\r\n // box\r\n tempSphere.copy(self.boundingVolume.sphere);\r\n } else if (self.boundingVolume instanceof THREE.Sphere) {\r\n //sphere\r\n tempSphere.copy(self.boundingVolume);\r\n }\r\n\r\n //tempSphere.applyMatrix4(self.matrixWorld);\r\n if (!!this.json.boundingVolume.region) {\r\n self.transformWGS84ToCartesian(\r\n (self.json.boundingVolume.region[0] + self.json.boundingVolume.region[2]) * 0.5,\r\n (self.json.boundingVolume.region[1] + self.json.boundingVolume.region[3]) * 0.5,\r\n (self.json.boundingVolume.region[4] + self.json.boundingVolume.region[5]) * 0.5,\r\n tempVec1);\r\n\r\n tempQuaternion.setFromUnitVectors(tempVec1.normalize(), upVector.normalize());\r\n self.master.applyQuaternion(tempQuaternion);\r\n self.master.updateWorldMatrix(false, false)\r\n }\r\n tempMatrix.makeTranslation(-tempSphere.center.x * self.scale.x, -tempSphere.center.y * self.scale.y, -tempSphere.center.z * self.scale.z);\r\n //self.master.applyMatrix4(tempMatrix);\r\n self.master.matrix.multiply(tempMatrix);\r\n self.master.matrix.decompose(self.master.position, self.master.quaternion, self.master.scale);\r\n }\r\n\r\n self.isSetup = true;\r\n if (properties.onLoadCallback) properties.onLoadCallback(self);\r\n }\r\n\r\n isAbsolutePathOrURL(input) {\r\n // Check if it's an absolute URL with various protocols\r\n const urlRegex = /^(?:http|https|ftp|tcp|udp):\\/\\/\\S+/;\r\n const absoluteURL = urlRegex.test(input);\r\n\r\n // Check if it's an absolute path\r\n const absolutePath = input.startsWith('/') && !input.startsWith('//');\r\n\r\n return absoluteURL || absolutePath;\r\n }\r\n\r\n assembleURL(root, relative) {\r\n // Append a slash to the root URL if it doesn't already have one\r\n if (!root.endsWith('/')) {\r\n root += '/';\r\n }\r\n\r\n const rootUrl = new URL(root);\r\n let rootParts = rootUrl.pathname.split('/').filter(p => p !== '');\r\n let relativeParts = relative.split('/').filter(p => p !== '');\r\n\r\n for (let i = 1; i <= rootParts.length; i++) {\r\n if (i >= relativeParts.length) break;\r\n const rootToken = rootParts.slice(rootParts.length - i, rootParts.length).join('/');\r\n const relativeToken = relativeParts.slice(0, i).join('/');\r\n if (rootToken === relativeToken) {\r\n for (let j = 0; j < i; j++) {\r\n rootParts.pop();\r\n }\r\n break;\r\n }\r\n }\r\n\r\n\r\n while (relativeParts.length > 0 && relativeParts[0] === '..') {\r\n rootParts.pop();\r\n relativeParts.shift();\r\n }\r\n\r\n return `${rootUrl.protocol}//${rootUrl.host}/${[...rootParts, ...relativeParts].join('/')}`;\r\n }\r\n extractQueryParams(url, params) {\r\n const urlObj = new URL(url);\r\n\r\n // Iterate over all the search parameters\r\n for (let [key, value] of urlObj.searchParams) {\r\n params[key] = value;\r\n }\r\n\r\n // Remove the query string\r\n urlObj.search = '';\r\n return urlObj.toString();\r\n }\r\n load() {\r\n var self = this;\r\n if (self.deleted) return;\r\n if (!!self.json.content) {\r\n\r\n loadContent(self.json.content);\r\n } else if (!!self.json.contents) {\r\n self.json.contents.forEach(content => loadContent(content))\r\n }\r\n function loadContent(content) {\r\n let url;\r\n if (!!content.uri) {\r\n url = content.uri;\r\n } else if (!!content.url) {\r\n url = content.url;\r\n }\r\n const urlRegex = /^(?:http|https|ftp|tcp|udp):\\/\\/\\S+/;\r\n\r\n if (urlRegex.test(self.rootPath)) { // url\r\n if (!urlRegex.test(url)) {\r\n url = self.assembleURL(self.rootPath, url)\r\n }\r\n } else { //path\r\n if (path.isAbsolute(self.rootPath)) {\r\n url = self.rootPath + path.sep + url;\r\n }\r\n }\r\n url = self.extractQueryParams(url, self.queryParams);\r\n if (self.queryParams) {\r\n var props = \"\";\r\n for (let key in self.queryParams) {\r\n if (self.queryParams.hasOwnProperty(key)) { // This check is necessary to skip properties from the object's prototype chain\r\n props += \"&\" + key + \"=\" + self.queryParams[key];\r\n }\r\n }\r\n if (url.includes(\"?\")) {\r\n url += props;\r\n } else {\r\n url += \"?\" + props.substring(1);\r\n }\r\n }\r\n\r\n if (!!url) {\r\n if (url.includes(\".b3dm\") || url.includes(\".glb\") || url.includes(\".gltf\")) {\r\n self.contentURL = url;\r\n\r\n\r\n self.tileLoader.get(self.abortController, url, self.uuid, self, !self.cameraOnLoad ? () => 0 : () => {\r\n return self.calculateDistanceToCamera(self.cameraOnLoad);\r\n }, () => self.getSiblings(),\r\n self.level,\r\n !!self.json.boundingVolume.region ? false : true,\r\n !!self.json.boundingVolume.region,\r\n self.geometricError);\r\n } else if (url.includes(\".json\")) {\r\n self.tileLoader.get(self.abortController, url, self.uuid, self);\r\n }\r\n }\r\n\r\n \r\n }\r\n\r\n }\r\n\r\n loadMesh(mesh) {\r\n const self = this;\r\n if (self.deleted) {\r\n return;\r\n }\r\n //self.updateWorldMatrix(false, true);\r\n self.meshContent.add(mesh);\r\n\r\n }\r\n\r\n loadJson(json, url) {\r\n if (this.deleted) {\r\n return;\r\n }\r\n if (!!this.json.children) {\r\n this.jsonChildren = this.json.children;\r\n }\r\n\r\n json.rootPath = path.dirname(url);\r\n this.jsonChildren.push(json);\r\n this.hasUnloadedJSONContent--;\r\n }\r\n\r\n dispose() {\r\n\r\n const self = this;\r\n self.childrenTiles.forEach(tile => tile.dispose());\r\n\r\n self.deleted = true;\r\n if (self.abortController) self.abortController.abort();\r\n this.parent = null;\r\n this.parentTile = null;\r\n this.dispatchEvent({ type: 'removed' });\r\n }\r\n disposeChildren() {\r\n\r\n var self = this;\r\n\r\n self.childrenTiles.forEach(tile => tile.dispose());\r\n self.childrenTiles = [];\r\n\r\n }\r\n\r\n\r\n _update(camera, frustum) {\r\n const self = this;\r\n if (!self.isSetup) return;\r\n\r\n const visibilityBeforeUpdate = self.materialVisibility;\r\n\r\n if (!!self.boundingVolume && !!self.geometricError) {\r\n self.metric = self.calculateUpdateMetric(camera, frustum);\r\n }\r\n self.childrenTiles.forEach(child => child._update(camera, frustum));\r\n\r\n updateNodeVisibility(self.metric);\r\n updateTree(self.metric);\r\n trimTree(self.metric, visibilityBeforeUpdate);\r\n\r\n function updateTree(metric) {\r\n // If this tile does not have mesh content but it has children\r\n if (metric < 0 && self.hasMeshContent) return;\r\n\r\n if ((!self.hasMeshContent && self.rootPath) || (metric < self.master.geometricErrorMultiplier * self.geometricError && self.meshContent.size > 0)) {\r\n if (!!self.json && !!self.jsonChildren && self.childrenTiles.length != self.jsonChildren.length) {\r\n loadJsonChildren();\r\n return;\r\n }\r\n }\r\n }\r\n\r\n function updateNodeVisibility(metric) {\r\n\r\n //doesn't have a mesh content\r\n if (!self.hasMeshContent) {\r\n return;\r\n }\r\n // mesh content not yet loaded\r\n if (self.meshContent.size < self.hasMeshContent) {\r\n return;\r\n }\r\n\r\n // outside frustum\r\n if (metric < 0) {\r\n self.inFrustum = false;\r\n self.changeContentVisibility(!!self.loadOutsideView);\r\n return;\r\n } else {\r\n self.inFrustum = true;\r\n }\r\n\r\n // has no children\r\n if (self.childrenTiles.length == 0) {\r\n self.changeContentVisibility(true);\r\n return;\r\n }\r\n\r\n // has children\r\n if (metric >= self.master.geometricErrorMultiplier * self.geometricError) { // Ideal LOD or before ideal lod\r\n\r\n self.changeContentVisibility(true);\r\n } else if (metric < self.master.geometricErrorMultiplier * self.geometricError) { // Ideal LOD is past this one\r\n // if children are visible and have been displayed, can be hidden\r\n let allChildrenReady = true;\r\n self.childrenTiles.every(child => {\r\n\r\n if (!child.isReady()) {\r\n allChildrenReady = false;\r\n return false;\r\n }\r\n return true;\r\n });\r\n if (allChildrenReady) {\r\n self.changeContentVisibility(false);\r\n }\r\n }\r\n }\r\n\r\n function trimTree(metric, visibilityBeforeUpdate) {\r\n if (!self.hasMeshContent) return;\r\n if (!self.inFrustum) { // outside frustum\r\n self.disposeChildren();\r\n updateNodeVisibility(metric);\r\n return;\r\n }\r\n if (metric >= self.master.geometricErrorMultiplier * self.geometricError) {\r\n self.disposeChildren();\r\n updateNodeVisibility(metric);\r\n return;\r\n }\r\n\r\n }\r\n\r\n\r\n function loadJsonChildren() {\r\n self.jsonChildren.forEach(childJSON => {\r\n if (!childJSON.root && !childJSON.children && !childJSON.getChildren && !childJSON.content && !childJSON.contents) {\r\n return;\r\n }\r\n let childTile = new InstancedTile({\r\n parentTile: self,\r\n queryParams: self.queryParams,\r\n parentGeometricError: self.geometricError,\r\n parentBoundingVolume: self.boundingVolume,\r\n parentRefinement: self.refinement,\r\n json: childJSON,\r\n rootPath: self.rootPath,\r\n loadOutsideView: self.loadOutsideView,\r\n level: self.level + 1,\r\n tileLoader: self.tileLoader,\r\n cameraOnLoad: camera,\r\n master: self.master,\r\n centerModel: false,\r\n });\r\n self.childrenTiles.push(childTile);\r\n //self.add(childTile);\r\n });\r\n }\r\n\r\n }\r\n\r\n areAllChildrenLoadedAndHidden() {\r\n let allLoadedAndHidden = true;\r\n const self = this;\r\n this.childrenTiles.every(child => {\r\n if (child.hasMeshContent) {\r\n if (child.childrenTiles.length > 0) {\r\n allLoadedAndHidden = false;\r\n return false;\r\n }\r\n if (!child.inFrustum) {\r\n return true;\r\n };\r\n if (!child.materialVisibility || child.meshesToDisplay != child.meshesDisplayed) {\r\n allLoadedAndHidden = false;\r\n return false;\r\n }\r\n } else {\r\n if (!child.areAllChildrenLoadedAndHidden()) {\r\n allLoadedAndHidden = false;\r\n return false;\r\n }\r\n }\r\n return true;\r\n });\r\n return allLoadedAndHidden;\r\n }\r\n\r\n /**\r\n * Node is ready if it is outside frustum, if it was drawn at least once or if all it's children are ready\r\n * @returns true if ready\r\n */\r\n isReady() {\r\n // if outside frustum\r\n if (!this.inFrustum) return true;\r\n\r\n // if json is not done loading\r\n if (this.hasUnloadedJSONContent) {\r\n return false;\r\n }\r\n if ((!this.hasMeshContent || this.meshContent.size == 0 || !this.materialVisibility)) {\r\n if (this.childrenTiles.length > 0) {\r\n var allChildrenReady = true;\r\n this.childrenTiles.every(child => {\r\n if (!child.isReady()) {\r\n allChildrenReady = false;\r\n return false;\r\n }\r\n return true;\r\n });\r\n return allChildrenReady;\r\n } else {\r\n return false;\r\n }\r\n\r\n }\r\n // if this tile has no mesh content\r\n if (!this.hasMeshContent) {\r\n return true;\r\n }\r\n // if mesh content not yet loaded\r\n if (this.meshContent.size < this.hasMeshContent) {\r\n return false;\r\n }\r\n\r\n // if this tile has been marked to hide it's content\r\n if (!this.materialVisibility) {\r\n return false;\r\n }\r\n\r\n\r\n return true;\r\n\r\n }\r\n\r\n\r\n changeContentVisibility(visibility) {\r\n const self = this;\r\n self.materialVisibility = visibility;\r\n\r\n\r\n\r\n }\r\n calculateUpdateMetric(camera, frustum) {\r\n ////// return -1 if not in frustum\r\n if (this.boundingVolume instanceof OBB) {\r\n // box\r\n tempSphere.copy(this.boundingVolume.sphere);\r\n tempSphere.applyMatrix4(this.matrixWorld);\r\n if (!frustum.intersectsSphere(tempSphere)) return -1;\r\n } else if (this.boundingVolume instanceof THREE.Sphere) {\r\n //sphere\r\n tempSphere.copy(this.boundingVolume);\r\n tempSphere.applyMatrix4(this.matrixWorld);\r\n if (!frustum.intersectsSphere(tempSphere)) return -1;\r\n } else {\r\n console.error(\"unsupported shape\");\r\n return -1\r\n }\r\n\r\n /////// return metric based on geometric error and distance\r\n\r\n let distance = Math.max(0, camera.position.distanceTo(tempSphere.center) - tempSphere.radius);\r\n\r\n /////// Apply the bias factor to the distance\r\n distance = Math.pow(distance,this.distanceBias);\r\n\r\n if (distance == 0) {\r\n return 0;\r\n }\r\n const scale = this.matrixWorld.getMaxScaleOnAxis();\r\n this.master._renderSize(rendererSize);\r\n let s = rendererSize.y;\r\n let fov = camera.fov;\r\n if (camera.aspect < 1) {\r\n fov *= camera.aspect;\r\n s = rendererSize.x;\r\n }\r\n\r\n let lambda = 2.0 * Math.tan(0.5 * fov * 0.01745329251994329576923690768489) * distance;\r\n\r\n return (window.devicePixelRatio * 16 * lambda) / (s * scale);\r\n\r\n }\r\n\r\n getSiblings() {\r\n const self = this;\r\n const tiles = [];\r\n if (!self.parentTile) return tiles;\r\n let p = self.parentTile;\r\n while (!p.hasMeshContent && !!p.parentTile) {\r\n p = p.parentTile;\r\n }\r\n p.childrenTiles.forEach(child => {\r\n if (!!child && child != self) {\r\n while (!child.hasMeshContent && !!child.childrenTiles[0]) {\r\n child = child.childrenTiles[0];\r\n }\r\n tiles.push(child);\r\n }\r\n });\r\n return tiles;\r\n }\r\n calculateDistanceToCamera(camera) {\r\n if (this.boundingVolume instanceof OBB) {\r\n // box\r\n tempSphere.copy(this.boundingVolume.sphere);\r\n tempSphere.applyMatrix4(this.matrixWorld);\r\n //if (!frustum.intersectsSphere(tempSphere)) return -1;\r\n } else if (this.boundingVolume instanceof THREE.Sphere) {\r\n //sphere\r\n tempSphere.copy(this.boundingVolume);\r\n tempSphere.applyMatrix4(this.matrixWorld);\r\n //if (!frustum.intersectsSphere(tempSphere)) return -1;\r\n }\r\n else {\r\n console.error(\"unsupported shape\")\r\n }\r\n return Math.max(0, camera.position.distanceTo(tempSphere.center) - tempSphere.radius);\r\n }\r\n\r\n getWorldMatrix() {\r\n const self = this;\r\n return self.matrixWorld;\r\n }\r\n\r\n transformWGS84ToCartesian(lon, lat, h, sfct) {\r\n const a = 6378137.0;\r\n const e = 0.006694384442042;\r\n const N = a / (Math.sqrt(1.0 - (e * Math.pow(Math.sin(lat), 2))));\r\n const cosLat = Math.cos(lat);\r\n const cosLon = Math.cos(lon);\r\n const sinLat = Math.sin(lat);\r\n const sinLon = Math.sin(lon);\r\n const nPh = (N + h);\r\n const x = nPh * cosLat * cosLon;\r\n const y = nPh * cosLat * sinLon;\r\n const z = (0.993305615557957 * N + h) * sinLat;\r\n\r\n sfct.set(x, y, z);\r\n }\r\n}\r\nexport { InstancedTile };","import * as THREE from 'three';\r\nimport {InstancedTile} from \"./InstancedTile.js\"\r\n\r\n/**\r\n * Similarly to {@link OGC3DTile}, this class that extends THREE.Object3D loads a tiled and multileveled OGC3DTiles 1.0 or 1.1 dataset.\r\n * The difference is that tiles are instanced. This is useful when one wants to load the same tileset hundreds or even thousands of times.\r\n * Imagine rendering hundreds of very high detail cars driving in a city.\r\n * Each tile content is instanced but each {@link InstancedOGC3DTile} object also has it's own LOD tree making this scenario very efficient.\r\n * @class\r\n */\r\nclass InstancedOGC3DTile extends THREE.Object3D {\r\n\r\n /**\r\n * \r\n * @param {Object} [properties] - the properties for this tileset\r\n * @param {Object} [properties.url] - the url to the parent tileset.json\r\n * @param {Object} [properties.pathParams] - optional, path params to add to individual tile urls (starts with \"?\").\r\n * @param {Object} [properties.geometricErrorMultiplier] - the geometric error of the parent. 1.0 by default corresponds to a maxScreenSpaceError of 16\r\n * @param {Object} [properties.loadOutsideView] - if truthy, tiles otside the camera frustum will be loaded with the least possible amount of detail\r\n * @param {Object} [properties.tileLoader] - A tile loader that can be shared among tilesets in order to share a common cache.\r\n * @param {Object} [properties.pointsCallback] - A callback function that will be called on every points\r\n * @param {Object} [properties.onLoadCallback] - A callback function that will be called when the root tile has been loaded\r\n * @param {Object} [properties.occlusionCullingService] - A service that handles occlusion culling\r\n * @param {Object} [properties.centerModel] - If true, the tileset will be centered on 0,0,0 and in the case of georeferenced tilesets that use the \"region\" bounding volume, it will also be rotated so that the up axis matched the world y axis.\r\n * @param {Object} [properties.static] - If true, the tileset is considered static which improves performance but the tileset cannot be moved\r\n * @param {Object} [properties.rootPath] - optional the root path for fetching children\r\n * @param {Object} [properties.json] - optional json object representing the tileset sub-tree\r\n * @param {Object} [properties.parentGeometricError] - optional geometric error of the parent\r\n * @param {Object} [properties.parentBoundingVolume] - optional bounding volume of the parent\r\n * @param {Object} [properties.parentRefinement] - optional refinement strategy of the parent of the parent\r\n * @param {Object} [properties.cameraOnLoad] - optional the camera used when loading this particular sub-tile\r\n * @param {Object} [properties.parentTile] - optional the OGC3DTile object that loaded this tile as a child\r\n * @param {Number} [properties.domWidth = 1000] - optional the canvas width (used to calculate geometric error). If a renderer is provided, it'll be used instead, else a default value is used. \r\n * @param {Number} [properties.domHeight = 1000] - optional the canvas height (used to calculate geometric error). If a renderer is provided, it'll be used instead, else a default value is used. \r\n * @param {Object} [properties.renderer = undefined] - optional the renderer is used to infer the canvas size and compute tiles geometric error.\r\n * @param {Number} [properties.distanceBias] - optional a bias that allows loading more or less detail closer to the camera relative to far away. The value should be a positive number. A value below 1 loads less detail near the camera and a value above 1 loads more detail near the camera. This needs to be compensated by the geometricErrorMultiplier in order to load a reasonable number of tiles.\r\n */\r\n constructor(properties) {\r\n super();\r\n properties.master = this;\r\n \r\n if(!!properties.domWidth && !!properties.domHeight){\r\n this.rendererSize = new THREE.Vector2(properties.domWidth, properties.domHeight);\r\n }else{\r\n this.rendererSize = new THREE.Vector2(1000, 1000);\r\n }\r\n this.renderer = properties.renderer;\r\n this.distanceBias = Math.max(0.0001,properties.distanceBias? properties.distanceBias:1);\r\n\r\n this.geometricErrorMultiplier = properties.geometricErrorMultiplier? properties.geometricErrorMultiplier:1.0;\r\n this.tileset = new InstancedTile(properties);\r\n if (properties.static) {\r\n this.matrixAutoUpdate = false;\r\n }\r\n this.tileLoader = properties.tileLoader;\r\n }\r\n\r\n _renderSize(size){\r\n if(!!this.renderer){\r\n this.renderer.getDrawingBufferSize(size);\r\n }else{\r\n size.copy(this.rendererSize);\r\n }\r\n \r\n }\r\n\r\n /**\r\n * Call this to specify the canvas width/height when it changes (used to compute tiles geometric error that controls tile refinement).\r\n * It's unnecessary to call this when the {@link OGC3DTile} is instantiated with the renderer.\r\n * \r\n * @param {Number} width \r\n * @param {Number} height \r\n */\r\n setCanvasSize(width, height){\r\n this.rendererSize.set(width, height);\r\n }\r\n /**\r\n * To be called in the render loop.\r\n * @param {Three.Camera} camera a camera that the tileset will be rendered with.\r\n */\r\n update(camera, frustum){\r\n if(!!frustum){\r\n this.tileset._update(camera, frustum);\r\n }else{\r\n const frustum = new THREE.Frustum();\r\n frustum.setFromProjectionMatrix(new THREE.Matrix4().multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse));\r\n this.tileset._update(camera, frustum);\r\n }\r\n \r\n }\r\n \r\n /** \r\n * Set the Geometric Error Multiplier for the tileset.\r\n * the {@param geometricErrorMultiplier} can be a number between 1 and infinity.\r\n * A {@param geometricErrorMultiplier} of 1 (default) corresponds to a max ScreenSpace error (MSE) of 16. \r\n * A lower {@param geometricErrorMultiplier} loads less detail (higher MSE) and a higher {@param geometricErrorMultiplier} loads more detail (lower MSE)\r\n * \r\n * @param {Number} geometricErrorMultiplier set the LOD multiplier for the entire tileset\r\n */\r\n setGeometricErrorMultiplier(geometricErrorMultiplier) {\r\n this.geometricErrorMultiplier = geometricErrorMultiplier?geometricErrorMultiplier:1.0;\r\n }\r\n}\r\nexport { InstancedOGC3DTile };","import * as THREE from 'three';\r\n\r\nclass MeshTile{\r\n constructor(scene){\r\n const self = this;\r\n self.scene = scene;\r\n self.instancedTiles = [];\r\n self.instancedMesh;\r\n \r\n\r\n self.reuseableMatrix = new THREE.Matrix4();\r\n }\r\n addInstance(instancedTile){\r\n const self = this;\r\n instancedTile.added = true;\r\n instancedTile.listOMesh = self.instancedTiles;\r\n self.instancedTiles.push(instancedTile);\r\n if(self.instancedMesh){\r\n instancedTile.loadMesh(self.instancedMesh)\r\n }\r\n }\r\n\r\n addToScene(){\r\n //this.instancedMesh.instanceMatrix.setUsage( THREE.DynamicDrawUsage );\r\n const self = this;\r\n self.instancedMesh.setMatrixAt(0,new THREE.Matrix4());\r\n self.instancedMesh.instanceMatrix.needsUpdate = true;\r\n self.instancedMesh.count = 1;\r\n \r\n self.scene.add(self.instancedMesh);\r\n self.instancedMesh.onAfterRender = () => {\r\n delete self.instancedMesh.onAfterRender;\r\n self.instancedMesh.displayedOnce = true;\r\n };\r\n }\r\n\r\n setObject(instancedMesh){\r\n const self = this;\r\n self.instancedMesh = instancedMesh;\r\n self.instancedMesh.matrixAutoUpdate = false;\r\n self.instancedMesh.matrixWorldAutoUpdate = false;\r\n if(!self.scene.children.includes(instancedMesh)){\r\n this.addToScene();\r\n }\r\n \r\n for(let i = 0; i<self.instancedTiles.length; i++){\r\n self.instancedTiles[i].loadMesh(self.instancedMesh)\r\n }\r\n }\r\n\r\n update(){\r\n const self = this;\r\n\r\n for(let i = self.instancedTiles.length-1; i>=0; i--){\r\n if(self.instancedTiles[i].deleted){\r\n self.instancedTiles.splice(i,1);\r\n }\r\n }\r\n \r\n if(!!self.instancedMesh){\r\n \r\n self.instancedMesh.count = 0;\r\n self.instancedMesh.instancedTiles = [];\r\n for(let i = 0; i<self.instancedTiles.length; i++){\r\n self.instancedTiles[i].meshContent.add(self.instancedMesh);\r\n if(self.instancedTiles[i].materialVisibility){\r\n self.instancedMesh.count++;\r\n self.reuseableMatrix.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);\r\n self.reuseableMatrix.multiply(self.instancedTiles[i].matrixWorld);\r\n self.reuseableMatrix.multiply(self.instancedMesh.baseMatrix);\r\n //self.reuseableMatrix.premultiply(self.instancedTiles[i].master.matrixWorld);\r\n self.instancedMesh.setMatrixAt(self.instancedMesh.count-1, self.reuseableMatrix );\r\n //self.instancedMesh.getMatrixAt(0, t);\r\n //console.log(self.instancedMesh.baseMatrix)\r\n self.instancedMesh.instancedTiles.push(self.instancedTiles[i])\r\n }\r\n }\r\n \r\n self.instancedMesh.instanceMatrix.needsUpdate = true;\r\n self.instancedMesh.needsUpdate = true;\r\n self.instancedMesh.computeBoundingSphere();\r\n }\r\n }\r\n\r\n getCount(){\r\n return this.instancedTiles.length;\r\n }\r\n\r\n dispose(){\r\n const self = this;\r\n if(self.instancedTiles.length>0){\r\n return false;\r\n }\r\n else{\r\n if(!!self.instancedMesh){\r\n //console.log(self.instancedMesh.parent)\r\n self.scene.remove(self.instancedMesh);\r\n self.instancedMesh.traverse((o) => {\r\n if(o.dispose) o.dispose();\r\n if (o.material) {\r\n // dispose materials\r\n if (o.material.length) {\r\n for (let i = 0; i < o.material.length; ++i) {\r\n o.material[i].dispose();\r\n }\r\n }\r\n else {\r\n o.material.dispose()\r\n }\r\n }\r\n if (o.geometry) o.geometry.dispose();\r\n });\r\n self.instancedMesh.dispose();\r\n return true;\r\n }\r\n return false;\r\n }\r\n }\r\n\r\n}export { MeshTile };","\r\n\r\nclass JsonTile{\r\n constructor(){\r\n const self = this;\r\n self.count = 0;\r\n self.json;\r\n self.instancedTiles = [];\r\n }\r\n\r\n addInstance(instanceTile){\r\n this.instancedTiles.push(instanceTile);\r\n if(this.json){\r\n instanceTile.loadJson(this.json, this.url)\r\n }\r\n }\r\n\r\n \r\n\r\n setObject(json, url){\r\n const self = this;\r\n self.json = json;\r\n self.url = url;\r\n for(let i = 0; i<self.instancedTiles.length; i++){\r\n self.instancedTiles[i].loadJson( self.json, self.url );\r\n }\r\n }\r\n\r\n getCount(){\r\n return this.instancedTiles.length;\r\n }\r\n update(){\r\n const self = this;\r\n for(let i = self.instancedTiles.length-1; i>=0; i--){\r\n if(self.instancedTiles[i].deleted){\r\n self.instancedTiles.splice(i,1);\r\n }\r\n }\r\n }\r\n dispose(){\r\n if(!!this.json && this.instancedTiles.length == 0){\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n}export { JsonTile };","import * as THREE from 'three';\r\nimport { LinkedHashMap } from '../../utils/LinkedHashMap';\r\nimport { B3DMDecoder } from \"../../decoder/B3DMDecoder\";\r\nimport { MeshTile } from './MeshTile';\r\nimport { JsonTile } from './JsonTile';\r\nimport { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';\r\nimport { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js';\r\nimport { KTX2Loader } from \"three/addons/loaders/KTX2Loader\";\r\nimport { resolveImplicite } from '../implicit/ImplicitTileResolver.js';\r\nimport { InstancedOGC3DTile } from './InstancedOGC3DTile';\r\nimport { MeshoptDecoder } from 'meshoptimizer';\r\n\r\nlet concurrentDownloads = 0;\r\n\r\n\r\n/**\r\n * A Tile loader that manages caching and load order for instanced tiles.\r\n * The cache is an LRU cache and is defined by the number of items it can hold.\r\n * The actual number of cached items might grow beyond max if all items are in use.\r\n * \r\n * The load order is designed for optimal perceived loading speed (nearby tiles are refined first).\r\n *\r\n */\r\nclass InstancedTileLoader {\r\n /**\r\n * Creates a tile loader with a maximum number of cached items and callbacks.\r\n * The only required property is a renderer that will be used to visualize the tiles.\r\n * The maxCachedItems property is the size of the cache in number of objects, mesh tile and tileset.json files.\r\n * The mesh and point callbacks will be called for every incoming mesh or points.\r\n *\r\n * @param {scene} [scene] - a threejs scene.\r\n * @param {Object} [options] - Optional configuration object.\r\n * @param {number} [options.maxCachedItems=100] - the cache size.\r\n * @param {number} [options.maxInstances=1] - the cache size.\r\n * @param {function} [options.meshCallback] - A callback to call on newly decoded meshes.\r\n * @param {function} [options.pointsCallback] - A callback to call on newly decoded points.\r\n * @param {sring} [options.proxy] - An optional proxy that tile requests will be directed too as POST requests with the actual tile url in the body of the request.\r\n * @param {KTX2Loader} [options.ktx2Loader = undefined] - A KTX2Loader (three/addons)\r\n * @param {DRACOLoader} [options.dracoLoader = undefined] - A DRACOLoader (three/addons)\r\n * @param {renderer} [options.renderer = undefined] - optional the renderer, this is required only for on the fly ktx2 support. not needed if you pass a ktx2Loader manually\r\n \r\n */\r\n constructor(scene, options) {\r\n this.zUpToYUpMatrix = new THREE.Matrix4();\r\n this.zUpToYUpMatrix.set(1, 0, 0, 0,\r\n 0, 0, -1, 0,\r\n 0, 1, 0, 0,\r\n 0, 0, 0, 1);\r\n this.maxCachedItems = 100;\r\n this.maxInstances = 1;\r\n this.proxy = options.proxy;\r\n if (!!options) {\r\n this.meshCallback = options.meshCallback;\r\n this.pointsCallback = options.pointsCallback;\r\n if (options.maxCachedItems) this.maxCachedItems = options.maxCachedItems;\r\n if (options.maxInstances) this.maxInstances = options.maxInstances;\r\n\r\n }\r\n\r\n\r\n this.gltfLoader = new GLTFLoader();\r\n if (!!options && !!options.dracoLoader) {\r\n this.gltfLoader.setDRACOLoader(options.dracoLoader);\r\n this.hasDracoLoader = true;\r\n } else {\r\n const dracoLoader = new DRACOLoader();\r\n dracoLoader.setDecoderPath('https://www.gstatic.com/draco/versioned/decoders/1.4.3/');\r\n this.gltfLoader.setDRACOLoader(dracoLoader);\r\n this.gltfLoader.hasDracoLoader = true;\r\n }\r\n\r\n if (!!options && !!options.ktx2Loader) {\r\n this.gltfLoader.setKTX2Loader(options.ktx2Loader);\r\n this.hasKTX2Loader = true;\r\n } else if (!!options && !!options.renderer) {\r\n const ktx2Loader = new KTX2Loader();\r\n ktx2Loader.setTranscoderPath('https://storage.googleapis.com/ogc-3d-tiles/basis/').detectSupport(options.renderer);\r\n this.gltfLoader.setKTX2Loader(ktx2Loader);\r\n this.gltfLoader.hasKTX2Loader = true;\r\n }\r\n\r\n this.gltfLoader.setMeshoptDecoder(MeshoptDecoder);\r\n this.hasMeshOptDecoder = true;\r\n\r\n this.b3dmDecoder = new B3DMDecoder(this.gltfLoader);\r\n\r\n\r\n this.cache = new LinkedHashMap();\r\n this.scene = scene;\r\n\r\n this.ready = [];\r\n this.downloads = [];\r\n this.nextReady = [];\r\n this.nextDownloads = [];\r\n\r\n }\r\n\r\n /**\r\n * To be called in the render loop or at regular intervals.\r\n * launches tile downloading and loading in an orderly fashion.\r\n */\r\n update() {\r\n const self = this;\r\n self._checkSize();\r\n self.cache._data.forEach(v => {\r\n v.update();\r\n })\r\n\r\n if (concurrentDownloads < 8) {\r\n self._download();\r\n }\r\n self._loadBatch();\r\n }\r\n\r\n\r\n _download() {\r\n const self = this;\r\n if (self.nextDownloads.length == 0) {\r\n self._getNextDownloads();\r\n if (self.nextDownloads.length == 0) return;\r\n }\r\n while (self.nextDownloads.length > 0) {\r\n const nextDownload = self.nextDownloads.shift();\r\n if (!!nextDownload) {//} && nextDownload.shouldDoDownload()) {\r\n //nextDownload.doDownload();\r\n if (nextDownload.path.includes(\".b3dm\")) {\r\n var fetchFunction;\r\n if (!self.proxy) {\r\n fetchFunction = () => {\r\n return fetch(nextDownload.path);\r\n }\r\n } else {\r\n fetchFunction = () => {\r\n return fetch(self.proxy,\r\n {\r\n method: 'POST',\r\n body: nextDownload.path\r\n }\r\n );\r\n }\r\n }\r\n concurrentDownloads++;\r\n fetchFunction().then(result => {\r\n if (!result.ok) {\r\n console.error(\"could not load tile with path : \" + nextDownload.path)\r\n throw new Error(`couldn't load \"${nextDownload.path}\". Request failed with status ${result.status} : ${result.statusText}`);\r\n }\r\n return result.arrayBuffer();\r\n\r\n }).then(resultArrayBuffer => {\r\n return this.b3dmDecoder.parseB3DMInstanced(resultArrayBuffer, (mesh) => { self.meshCallback(mesh, nextDownload.geometricError) }, self.maxInstances, nextDownload.sceneZupToYup, nextDownload.meshZupToYup);\r\n }).then(mesh => {\r\n mesh.frustumCulled = false;\r\n nextDownload.tile.setObject(mesh);\r\n self.ready.unshift(nextDownload);\r\n\r\n }).catch(e => console.error(e))\r\n .finally(() => {\r\n concurrentDownloads--;\r\n });\r\n } if (nextDownload.path.includes(\".glb\") || (nextDownload.path.includes(\".gltf\"))) {\r\n var fetchFunction;\r\n if (!self.proxy) {\r\n fetchFunction = () => {\r\n return fetch(nextDownload.path);\r\n }\r\n } else {\r\n fetchFunction = () => {\r\n return fetch(self.proxy,\r\n {\r\n method: 'POST',\r\n body: nextDownload.path\r\n }\r\n );\r\n }\r\n }\r\n concurrentDownloads++;\r\n fetchFunction().then(result => {\r\n if (!result.ok) {\r\n throw new Error(\"missing content\");\r\n }\r\n return result.arrayBuffer();\r\n }).then(async arrayBuffer => {\r\n await _checkLoaderInitialized(this.gltfLoader);\r\n this.gltfLoader.parse(arrayBuffer, null, gltf => {\r\n gltf.scene.asset = gltf.asset;\r\n\r\n if (nextDownload.sceneZupToYup) {\r\n gltf.scene.applyMatrix4(this.zUpToYUpMatrix);\r\n }\r\n gltf.scene.traverse((o) => {\r\n o.geometricError = nextDownload.geometricError;\r\n if (o.isMesh) {\r\n if (nextDownload.meshZupToYup) {\r\n o.applyMatrix4(this.zUpToYUpMatrix);\r\n }\r\n if (!!self.meshCallback) {\r\n self.meshCallback(o, o.geometricError);\r\n }\r\n }\r\n if (o.isPoints) {\r\n console.error(\"instanced point cloud is not supported\");\r\n }\r\n });\r\n let instancedMesh;\r\n gltf.scene.updateWorldMatrix(false, true)\r\n gltf.scene.traverse(child => {\r\n //TODO several meshes in a single gltf\r\n if (child.isMesh) {\r\n instancedMesh = new THREE.InstancedMesh(child.geometry, child.material, self.maxInstances);\r\n instancedMesh.baseMatrix = child.matrixWorld;\r\n }\r\n\r\n });\r\n self.ready.unshift(nextDownload);\r\n if (!instancedMesh) {\r\n gltf.scene.traverse(c => {\r\n if (c.dispose) c.dispose();\r\n if (c.material) c.material.dispose();\r\n });\r\n } else {\r\n instancedMesh.frustumCulled = false;\r\n nextDownload.tile.setObject(instancedMesh);\r\n }\r\n });\r\n }, e => {\r\n console.error(\"could not load tile : \" + nextDownload.path)\r\n }).finally(() => {\r\n concurrentDownloads--;\r\n });\r\n\r\n\r\n\r\n } else if (nextDownload.path.includes(\".json\")) {\r\n var fetchFunction;\r\n if (!self.proxy) {\r\n fetchFunction = () => {\r\n return fetch(nextDownload.path);\r\n }\r\n } else {\r\n fetchFunction = () => {\r\n return fetch(self.proxy,\r\n {\r\n method: 'POST',\r\n body: nextDownload.path\r\n }\r\n );\r\n }\r\n }\r\n concurrentDownloads++;\r\n fetchFunction().then(result => {\r\n if (!result.ok) {\r\n console.error(\"could not load tile with path : \" + nextDownload.path)\r\n throw new Error(`couldn't load \"${nextDownload.path}\". Request failed with status ${result.status} : ${result.statusText}`);\r\n }\r\n return result.json();\r\n\r\n }).then(json => {\r\n return resolveImplicite(json, nextDownload.path)\r\n }).then(json => {\r\n nextDownload.tile.setObject(json, nextDownload.path);\r\n self.ready.unshift(nextDownload);\r\n })\r\n .catch(e => console.error(e)).finally(() => {\r\n concurrentDownloads--;\r\n });\r\n }\r\n }\r\n }\r\n return;\r\n }\r\n\r\n _loadBatch() {\r\n if (this.nextReady.length == 0) {\r\n this._getNextReady();\r\n if (this.nextReady.length == 0) return 0;\r\n }\r\n const download = this.nextReady.shift();\r\n if (!download) return 0;\r\n\r\n //if (!!download.tile.addToScene) download.tile.addToScene();\r\n return 1;\r\n }\r\n\r\n _getNextReady() {\r\n let smallestDistance = Number.MAX_VALUE;\r\n let closest = -1;\r\n for (let i = this.ready.length - 1; i >= 0; i--) {\r\n\r\n if (!this.ready[i].distanceFunction) {// if no distance function, must be a json, give absolute priority!\r\n this.nextReady.push(this.ready.splice(i, 1)[0]);\r\n }\r\n }\r\n if (this.nextReady.length > 0) return;\r\n for (let i = this.ready.length - 1; i >= 0; i--) {\r\n const dist = this.ready[i].distanceFunction() * this.ready[i].level;\r\n if (dist < smallestDistance) {\r\n smallestDistance = dist;\r\n closest = i\r\n }\r\n }\r\n if (closest >= 0) {\r\n const closestItem = this.ready.splice(closest, 1).pop();\r\n this.nextReady.push(closestItem);\r\n const siblings = closestItem.getSiblings();\r\n for (let i = this.ready.length - 1; i >= 0; i--) {\r\n if (siblings.includes(this.ready[i].uuid)) {\r\n this.nextready.push(this.ready.splice(i, 1).pop());\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Schedules a tile content to be downloaded\r\n * \r\n * @param {AbortController} abortController \r\n * @param {string} path path or url to tile content \r\n * @param {string|Number} uuid tile id\r\n * @param {InstancedOGC3DTile} instancedOGC3DTile \r\n * @param {Function} distanceFunction \r\n * @param {Function} getSiblings \r\n * @param {Number} level \r\n * @param {Boolean} sceneZupToYup \r\n * @param {Boolean} meshZupToYup \r\n * @param {Number} geometricError \r\n */\r\n get(abortController, path, uuid, instancedOGC3DTile, distanceFunction, getSiblings, level, sceneZupToYup, meshZupToYup, geometricError) {\r\n const self = this;\r\n const key = _simplifyPath(path);\r\n\r\n if (!path.includes(\".b3dm\") && !path.includes(\".json\") && !path.includes(\".glb\") && !path.includes(\".gltf\")) {\r\n console.error(\"the 3DTiles cache can only be used to load B3DM, gltf and json data\");\r\n return;\r\n }\r\n\r\n const cachedTile = self.cache.get(key);\r\n if (!!cachedTile) {\r\n cachedTile.addInstance(instancedOGC3DTile);\r\n return;\r\n } else {\r\n\r\n if (path.includes(\".b3dm\") || path.includes(\".glb\") || path.includes(\".gltf\")) {\r\n const tile = new MeshTile(self.scene);\r\n tile.addInstance(instancedOGC3DTile);\r\n\r\n self.cache.put(key, tile);\r\n //self._checkSize();\r\n const realAbortController = new AbortController();\r\n abortController.signal.addEventListener(\"abort\", () => {\r\n if (tile.getCount() == 0) {\r\n realAbortController.abort();\r\n }\r\n })\r\n this.downloads.push({\r\n abortController: realAbortController,\r\n tile: tile,\r\n key: key,\r\n path: path,\r\n distanceFunction: distanceFunction,\r\n getSiblings: getSiblings,\r\n level: level,\r\n uuid: uuid,\r\n sceneZupToYup: sceneZupToYup,\r\n meshZupToYup: meshZupToYup,\r\n geometricError: geometricError,\r\n shouldDoDownload: () => {\r\n return true;\r\n },\r\n })\r\n } else if (path.includes(\".json\")) {\r\n const tile = new JsonTile();\r\n tile.addInstance(instancedOGC3DTile);\r\n self.cache.put(key, tile);\r\n //self._checkSize();\r\n const realAbortController = new AbortController();\r\n abortController.signal.addEventListener(\"abort\", () => {\r\n if (tile.getCount() == 0) {\r\n realAbortController.abort();\r\n }\r\n })\r\n this.downloads.push({\r\n abortController: realAbortController,\r\n tile: tile,\r\n key: key,\r\n path: path,\r\n distanceFunction: distanceFunction,\r\n getSiblings: getSiblings,\r\n level: level,\r\n shouldDoDownload: () => {\r\n return true;\r\n },\r\n })\r\n\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n _getNextDownloads() {\r\n let smallestDistance = Number.MAX_VALUE;\r\n let closest = -1;\r\n for (let i = this.downloads.length - 1; i >= 0; i--) {\r\n const download = this.downloads[i];\r\n if (!download.shouldDoDownload()) {\r\n this.downloads.splice(i, 1);\r\n continue;\r\n }\r\n if (!download.distanceFunction) { // if no distance function, must be a json, give absolute priority!\r\n this.nextDownloads.push(this.downloads.splice(i, 1)[0]);\r\n }\r\n }\r\n if (this.nextDownloads.length > 0) return;\r\n for (let i = this.downloads.length - 1; i >= 0; i--) {\r\n const download = this.downloads[i];\r\n const dist = download.distanceFunction() * download.level;\r\n if (dist < smallestDistance) {\r\n smallestDistance = dist;\r\n closest = i;\r\n }\r\n }\r\n if (closest >= 0) {\r\n const closestItem = this.downloads.splice(closest, 1).pop();\r\n this.nextDownloads.push(closestItem);\r\n const siblings = closestItem.getSiblings();\r\n for (let i = this.downloads.length - 1; i >= 0; i--) {\r\n if (siblings.includes(this.downloads[i].uuid)) {\r\n this.nextDownloads.push(this.downloads.splice(i, 1).pop());\r\n }\r\n }\r\n }\r\n }\r\n\r\n _checkSize() {\r\n const self = this;\r\n\r\n let i = 0;\r\n\r\n while (self.cache.size() > self.maxCachedItems && i < self.cache.size()) {\r\n i++;\r\n const entry = self.cache.head();\r\n self.cache.remove(entry.key);\r\n if (!entry.value.dispose()) {\r\n self.cache.put(entry.key, entry.value);\r\n } else {\r\n //console.log(\"disposed and removed\")\r\n }\r\n\r\n }\r\n }\r\n}\r\n\r\nasync function _checkLoaderInitialized(loader) {\r\n\r\n const self = this;\r\n return new Promise((resolve) => {\r\n const interval = setInterval(() => {\r\n if ((!loader.hasDracoLoader || loader.dracoLoader) && (!loader.hasKTX2Loader || loader.ktx2Loader)) {\r\n clearInterval(interval);\r\n resolve();\r\n }\r\n }, 10); // check every 100ms\r\n });\r\n};\r\n\r\nfunction _simplifyPath(main_path) {\r\n\r\n var parts = main_path.split('/'),\r\n new_path = [],\r\n length = 0;\r\n for (var i = 0; i < parts.length; i++) {\r\n var part = parts[i];\r\n if (part === '.' || part === '' || part === '..') {\r\n if (part === '..' && length > 0) {\r\n length--;\r\n }\r\n continue;\r\n }\r\n new_path[length++] = part;\r\n }\r\n\r\n if (length === 0) {\r\n return '/';\r\n }\r\n\r\n var result = '';\r\n for (var i = 0; i < length; i++) {\r\n result += '/' + new_path[i];\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport { InstancedTileLoader };","import * as THREE from 'three';\r\n\r\n\r\n/**\r\n * An occlusion culling service that helps to only refine tiles that are visible.\r\n * This occlusion culling has a cost but allows downloading much less data.\r\n * For models that have a lot of geometry that is often hidden from the camera by walls, this can improve the frame-rate.\r\n * @class\r\n */\r\nclass OcclusionCullingService {\r\n\r\n /**\r\n * Creates an Occlusion Culling service to be passed to {@link OGC3DTile} Tilesets\r\n */\r\n constructor() {\r\n this.cullMap = [];\r\n this.cullMaterial = new THREE.MeshBasicMaterial({ vertexColors: true });\r\n this.cullMaterial.side = THREE.FrontSide;\r\n this.cullTarget = this._createCullTarget();\r\n this.cullPixels = new Uint8Array(4 * this.cullTarget.width * this.cullTarget.height);\r\n }\r\n\r\n /**\r\n * \r\n * @param {Integer} side use THREE.FrontSide, THREE.BackSide or THREE.DoubleSide (FrontSide default)\r\n */\r\n setSide(side){\r\n this.cullMaterial.side = side;\r\n }\r\n\r\n _createCullTarget() {\r\n const target = new THREE.WebGLRenderTarget(Math.floor(window.innerWidth * 0.05), Math.floor(window.innerHeight * 0.05));\r\n target.texture.format = THREE.RGBAFormat;\r\n target.texture.colorSpace = THREE.LinearSRGBColorSpace;\r\n target.texture.minFilter = THREE.NearestFilter;\r\n target.texture.magFilter = THREE.NearestFilter;\r\n target.texture.generateMipmaps = false;\r\n target.stencilBuffer = false;\r\n target.depthBuffer = true;\r\n target.depthTexture = new THREE.DepthTexture();\r\n target.depthTexture.format = THREE.DepthFormat;\r\n target.depthTexture.type = THREE.UnsignedShortType;\r\n return target;\r\n }\r\n\r\n /**\r\n * Update function to be called on every frame in the render loop.\r\n * @param {THREE.scene} scene \r\n * @param {THREE.Renderer} renderer \r\n * @param {THREE.camera} camera \r\n */\r\n update(scene, renderer, camera) {\r\n let tempRenderTarget = renderer.getRenderTarget();\r\n let tempOverrideMaterial = scene.overrideMaterial;\r\n\r\n scene.overrideMaterial = this.cullMaterial;\r\n renderer.setRenderTarget(this.cullTarget);\r\n renderer.render(scene, camera);\r\n\r\n scene.overrideMaterial = tempOverrideMaterial;\r\n renderer.setRenderTarget(tempRenderTarget);\r\n\r\n renderer.readRenderTargetPixels(this.cullTarget, 0, 0, this.cullTarget.width, this.cullTarget.height, this.cullPixels);\r\n this.cullMap = [];\r\n \r\n for (let i = 0; i < this.cullPixels.length; i += 4) {\r\n const c = THREE.MathUtils.clamp(this.cullPixels[i], 0, 255) << 16 ^ THREE.MathUtils.clamp(this.cullPixels[i + 1], 0, 255) << 8 ^ THREE.MathUtils.clamp(this.cullPixels[i + 2], 0, 255) << 0;\r\n this.cullMap[c] = true;\r\n }\r\n\r\n }\r\n\r\n /**\r\n * check if the given tile ID was visible in the last rendered frame.\r\n * @param {string|Number} id \r\n * @returns true if tile is visible\r\n */\r\n hasID(id) {\r\n return this.cullMap[id];\r\n }\r\n}\r\nexport { OcclusionCullingService };"],"names":["tempMatrix","Matrix3","tempVector3","Vector3","size","aabb","Box3","matrix","Matrix4","inverse","localRay","Ray","OBB","values","this","center","e1","e2","e3","halfSize","length","normalize","rotationMatrix","set","x","y","z","aObb","copy","result","multiplyScalar","e","elements","sx","sy","sz","determinant","setFromMatrix4","invSX","invSY","invSZ","multiply","setFromMatrixPosition","applyMatrix4","extractBasis","ray","getSize","setFromCenterAndSize","setFromMatrix3","setPosition","invert","intersectBox","intersectRay","plane","normal","r","Math","abs","dot","distanceToPoint","frustum","i","planes","insidePlane","point","sub","applyMatrix3","dx","max","dy","dz","sqrt","hs","c","corners","add","clone","geometry","BufferGeometry","setFromPoints","setIndex","computeBoundingSphere","material","LineBasicMaterial","color","wireframe","LineSegments","dispose","LinkedHashMap","_data","Map","_link","_head","undefined","_tail","key","item","head","has","previous","next","get","value","link","previousKey","prevKey","nextKey","reset","headLink","tailLink","cur","prev","nex","delete","clear","keys","entries","order","linkOrderArr","push","Array","from","map","k","utf8decoder","TextDecoder","FeatureTable","buffer","start","headerLength","binLength","binOffset","header","headerData","Uint8Array","JSON","parse","decode","getKeys","Object","count","defaultComponentType","defaultType","feature","isArray","byteOffset","featureType","type","featureComponentType","componentType","Error","stride","data","arrayStart","arrayLength","Int8Array","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BYTES_PER_ELEMENT","BatchTable","batchSize","super","getData","mergeAttributes","attributes","TypedArray","itemSize","normalized","gpuType","attribute","array","constructor","console","error","BufferAttribute","offset","isInterleavedBufferAttribute","tupleOffset","j","l","getComponent","setComponent","toTrianglesDrawMode","drawMode","TrianglesDrawMode","warn","TriangleFanDrawMode","TriangleStripDrawMode","index","getIndex","indices","position","getAttribute","numberOfTriangles","newIndices","getX","newGeometry","clearGroups","B3DMDecoder","aGltfLoader","checkLoaderInitialized","async","Promise","resolve","interval","setInterval","gltfLoader","hasDracoLoader","dracoLoader","hasKTX2Loader","ktx2Loader","clearInterval","THREE","zUpToYUpMatrix","arrayBuffer","meshCallback","sceneZupToYUp","meshZUpToYUp","self","dataView","DataView","magic","String","fromCharCode","getUint8","assert","byteLength","getUint32","featureTableJSONByteLength","featureTableBinaryByteLength","batchTableJSONByteLength","batchTableBinaryByteLength","featureTable","batchTableStart","glbStart","gltfBuffer","slice","reject","model","rtcCenter","makeTranslation","scene","userData","gltfExtensions","CESIUM_RTC","asset","traverse","o","isMesh","maxCount","meshZupToYup","parseB3DM","then","mesh","instancedMesh","geometries","materials","updateWorldMatrix","child","matrixWorld","mergedGeometry","allAttributes","Set","forEach","attributeSize","fill","setAttribute","useGroups","isIndexed","attributesUsed","morphAttributesUsed","morphAttributes","morphTargetsRelative","attributesCount","name","addGroup","indexOffset","mergedIndex","mergedAttribute","numMorphTargets","morphAttributesToMerge","mergedMorphAttribute","InstancedMesh","baseMatrix","identity","getRandomValues","rnds8","rng","crypto","bind","msCrypto","REGEX","byteToHex","toString","substr","stringify","arr","arguments","uuid","toLowerCase","test","TypeError","v4","options","buf","rnds","random","SplatsDecoder","renderer","splatsMesh","decoded","children","positions","colors","cov0","cov_0","cov1","cov_1","splatTile","addSplatsTile","GLTFLoader","Loader","manager","meshoptDecoder","pluginCallbacks","register","parser","GLTFMaterialsClearcoatExtension","GLTFMaterialsDispersionExtension","GLTFTextureBasisUExtension","GLTFTextureWebPExtension","GLTFTextureAVIFExtension","GLTFMaterialsSheenExtension","GLTFMaterialsTransmissionExtension","GLTFMaterialsVolumeExtension","GLTFMaterialsIorExtension","GLTFMaterialsEmissiveStrengthExtension","GLTFMaterialsSpecularExtension","GLTFMaterialsIridescenceExtension","GLTFMaterialsAnisotropyExtension","GLTFMaterialsBumpExtension","GLTFLightsExtension","GLTFMeshoptCompression","GLTFMeshGpuInstancing","url","onLoad","onProgress","onError","scope","resourcePath","path","relativeUrl","LoaderUtils","extractUrlBase","resolveURL","itemStart","_onError","itemError","itemEnd","loader","FileLoader","setPath","setResponseType","setRequestHeader","requestHeader","setWithCredentials","withCredentials","load","gltf","callback","indexOf","splice","json","extensions","plugins","textDecoder","ArrayBuffer","BINARY_EXTENSION_HEADER_MAGIC","EXTENSIONS","KHR_BINARY_GLTF","GLTFBinaryExtension","content","version","GLTFParser","crossOrigin","fileLoader","plugin","extensionsUsed","extensionName","extensionsRequired","KHR_MATERIALS_UNLIT","GLTFMaterialsUnlitExtension","KHR_DRACO_MESH_COMPRESSION","GLTFDracoMeshCompressionExtension","KHR_TEXTURE_TRANSFORM","GLTFTextureTransformExtension","KHR_MESH_QUANTIZATION","GLTFMeshQuantizationExtension","setExtensions","setPlugins","GLTFRegistry","objects","object","remove","removeAll","KHR_LIGHTS_PUNCTUAL","KHR_MATERIALS_CLEARCOAT","KHR_MATERIALS_DISPERSION","KHR_MATERIALS_IOR","KHR_MATERIALS_SHEEN","KHR_MATERIALS_SPECULAR","KHR_MATERIALS_TRANSMISSION","KHR_MATERIALS_IRIDESCENCE","KHR_MATERIALS_ANISOTROPY","KHR_MATERIALS_VOLUME","KHR_TEXTURE_BASISU","KHR_MATERIALS_EMISSIVE_STRENGTH","EXT_MATERIALS_BUMP","EXT_TEXTURE_WEBP","EXT_TEXTURE_AVIF","EXT_MESHOPT_COMPRESSION","EXT_MESH_GPU_INSTANCING","cache","refs","uses","nodeDefs","nodes","nodeIndex","nodeLength","nodeDef","light","_addNodeRef","lightIndex","cacheKey","dependency","lightDef","lights","lightNode","Color","setRGB","LinearSRGBColorSpace","range","DirectionalLight","target","PointLight","distance","SpotLight","spot","innerConeAngle","outerConeAngle","PI","angle","penumbra","decay","assignExtrasToUserData","intensity","createUniqueName","_loadLight","_getNodeRef","getMaterialType","MeshBasicMaterial","materialParams","materialDef","pending","opacity","metallicRoughness","pbrMetallicRoughness","baseColorFactor","baseColorTexture","assignTexture","SRGBColorSpace","all","materialIndex","emissiveStrength","emissiveIntensity","MeshPhysicalMaterial","extension","clearcoatFactor","clearcoat","clearcoatTexture","clearcoatRoughnessFactor","clearcoatRoughness","clearcoatRoughnessTexture","clearcoatNormalTexture","scale","clearcoatNormalScale","Vector2","dispersion","iridescenceFactor","iridescence","iridescenceTexture","iridescenceIor","iridescenceIOR","iridescenceThicknessRange","iridescenceThicknessMinimum","iridescenceThicknessMaximum","iridescenceThicknessTexture","sheenColor","sheenRoughness","sheen","sheenColorFactor","colorFactor","sheenRoughnessFactor","sheenColorTexture","sheenRoughnessTexture","transmissionFactor","transmission","transmissionTexture","thickness","thicknessFactor","thicknessTexture","attenuationDistance","Infinity","colorArray","attenuationColor","ior","specularIntensity","specularFactor","specularTexture","specularColorFactor","specularColor","specularColorTexture","bumpScale","bumpFactor","bumpTexture","anisotropyStrength","anisotropy","anisotropyRotation","anisotropyTexture","textureIndex","textureDef","textures","loadTextureImage","source","isSupported","images","textureLoader","uri","handler","getHandler","detectSupport","loadTexture","image","Image","src","onload","onerror","height","bufferView","bufferViews","extensionDef","getDependency","decoder","supported","res","byteStride","decodeGltfBufferAsync","mode","filter","ready","decodeGltfBuffer","meshDef","meshes","primitive","primitives","WEBGL_CONSTANTS","TRIANGLES","TRIANGLE_STRIP","TRIANGLE_FAN","attributesDef","accessor","createNodeMesh","results","nodeObject","pop","isGroup","instancedMeshes","m","p","q","Quaternion","s","TRANSLATION","fromBufferAttribute","ROTATION","SCALE","setMatrixAt","compose","attributeName","attr","instanceColor","InstancedBufferAttribute","Object3D","prototype","call","assignFinalMaterial","BINARY_EXTENSION_CHUNK_TYPES","body","headerView","chunkContentsLength","chunkView","chunkIndex","chunkLength","chunkType","contentArray","preload","bufferViewIndex","gltfAttributeMap","threeAttributeMap","attributeNormalizedMap","attributeTypeMap","threeAttributeName","ATTRIBUTES","accessorDef","accessors","WEBGL_COMPONENT_TYPES","decodeDracoFile","texture","transform","texCoord","channel","rotation","fromArray","repeat","needsUpdate","GLTFCubicSplineInterpolant","Interpolant","parameterPositions","sampleValues","sampleSize","resultBuffer","valueSize","i1","t0","t","t1","stride2","stride3","td","pp","ppp","offset1","offset0","s2","s3","s0","s1","p0","m0","p1","m1","_q","GLTFCubicSplineQuaternionInterpolant","interpolate_","toArray","FLOAT","FLOAT_MAT3","FLOAT_MAT4","FLOAT_VEC2","FLOAT_VEC3","FLOAT_VEC4","LINEAR","REPEAT","SAMPLER_2D","POINTS","LINES","LINE_LOOP","LINE_STRIP","UNSIGNED_BYTE","UNSIGNED_SHORT","WEBGL_FILTERS","NearestFilter","LinearFilter","NearestMipmapNearestFilter","LinearMipmapNearestFilter","NearestMipmapLinearFilter","LinearMipmapLinearFilter","WEBGL_WRAPPINGS","ClampToEdgeWrapping","MirroredRepeatWrapping","RepeatWrapping","WEBGL_TYPE_SIZES","SCALAR","VEC2","VEC3","VEC4","MAT2","MAT3","MAT4","POSITION","NORMAL","TANGENT","TEXCOORD_0","TEXCOORD_1","TEXCOORD_2","TEXCOORD_3","COLOR_0","WEIGHTS_0","JOINTS_0","PATH_PROPERTIES","translation","weights","INTERPOLATION","CUBICSPLINE","InterpolateLinear","STEP","InterpolateDiscrete","ALPHA_MODES","addUnknownExtensionsToUserData","knownExtensions","objectDef","gltfDef","extras","assign","updateMorphTargets","il","morphTargetInfluences","targetNames","morphTargetDictionary","createPrimitiveKey","primitiveDef","geometryKey","dracoExtension","createAttributesKey","targets","attributesKey","sort","getNormalizedComponentScale","_identityMatrix","associations","primitiveCache","nodeCache","meshCache","cameraCache","lightCache","sourceCache","textureCache","nodeNamesUsed","isSafari","safariVersion","isFirefox","firefoxVersion","navigator","userAgent","safariMatch","match","parseInt","createImageBitmap","TextureLoader","ImageBitmapLoader","setCrossOrigin","_invokeAll","ext","_markDefs","beforeRoot","getDependencies","dependencies","scenes","animations","cameras","afterRoot","updateMatrixWorld","catch","skinDefs","skins","meshDefs","skinIndex","skinLength","joints","isBone","skin","isSkinnedMesh","camera","ref","updateMappings","original","mappings","func","unshift","loadScene","_invokeOne","loadNode","loadMesh","loadAccessor","loadBufferView","loadBuffer","loadMaterial","loadSkin","loadAnimation","loadCamera","defs","def","bufferIndex","bufferDef","buffers","bufferViewDef","accessorIndex","sparse","pendingBufferViews","elementBytes","itemBytes","bufferAttribute","ibSlice","floor","ibCacheKey","ib","InterleavedBuffer","InterleavedBufferAttribute","itemSizeIndices","TypedArrayIndices","byteOffsetIndices","byteOffsetValues","sparseIndices","sparseValues","setX","setY","setZ","setW","sourceIndex","sourceDef","sampler","promise","loadImageSource","flipY","startsWith","samplers","magFilter","minFilter","wrapS","wrapT","generateMipmaps","isCompressedTexture","URL","webkitURL","sourceURI","isObjectURL","blob","Blob","mimeType","createObjectURL","isImageBitmapLoader","imageBitmap","Texture","revokeObjectURL","search","mapName","mapDef","colorSpace","gltfReference","extendTexture","useDerivativeTangents","tangent","useVertexColors","useFlatShading","isPoints","pointsMaterial","PointsMaterial","Material","sizeAttenuation","isLine","lineMaterial","cachedMaterial","vertexColors","flatShading","normalScale","MeshStandardMaterial","materialType","kmuExtension","extendParams","metalness","metallicFactor","roughness","roughnessFactor","metallicRoughnessTexture","extendMaterialParams","doubleSided","side","DoubleSide","alphaMode","transparent","depthWrite","alphaTest","alphaCutoff","normalTexture","occlusionTexture","strength","aoMapIntensity","emissiveFactor","emissive","emissiveTexture","originalName","sanitizedName","PropertyBinding","sanitizeNodeName","createDracoPrimitive","decodePrimitive","addPrimitiveAttributes","cached","geometryPromise","meshIndex","depthTest","FrontSide","loadGeometries","SkinnedMesh","Mesh","normalizeSkinWeights","Line","LineLoop","Points","group","Group","cameraIndex","cameraDef","params","PerspectiveCamera","MathUtils","radToDeg","yfov","aspectRatio","znear","zfar","OrthographicCamera","xmag","ymag","skinDef","_loadNodeShallow","inverseBindMatrices","jointNodes","bones","boneInverses","jointNode","mat","Skeleton","animationIndex","animationDef","animationName","pendingNodes","pendingInputAccessors","pendingOutputAccessors","pendingSamplers","pendingTargets","channels","node","input","parameters","output","inputAccessors","outputAccessors","tracks","inputAccessor","outputAccessor","updateMatrix","createdTracks","_createAnimationTracks","AnimationClip","nodePending","childPending","childrenDef","skeletonPending","skeleton","nodeName","meshPromise","createNodeAttachment","Bone","quaternion","sceneIndex","sceneDef","nodeIds","reducedAssociations","targetName","TypedKeyframeTrack","NumberKeyframeTrack","QuaternionKeyframeTrack","VectorKeyframeTrack","interpolation","outputArray","_getArrayFromAccessor","jl","track","_createCubicSplineTrackInterpolant","scaled","createInterpolant","times","getValueSize","isInterpolantFactoryMethodGLTFCubicSpline","assignAttributeAccessor","gltfAttributeName","ColorManagement","workingColorSpace","box","min","boxScale","maxDisplacement","vector","expandByVector","boundingBox","sphere","Sphere","getCenter","radius","distanceTo","boundingSphere","hasMorphPosition","hasMorphNormal","hasMorphColor","pendingPositionAccessors","pendingNormalAccessors","pendingColorAccessors","pendingAccessor","morphPositions","morphNormals","morphColors","_taskCache","WeakMap","DRACOLoader","decoderPath","decoderConfig","decoderBinary","decoderPending","workerLimit","workerPool","workerNextTaskID","workerSourceURL","defaultAttributeIDs","uv","defaultAttributeTypes","config","attributeIDs","attributeTypes","vertexColorSpace","taskConfig","useUniqueIDs","decodeGeometry","taskKey","cachedTask","worker","taskID","taskCost","geometryPending","_getWorker","_worker","_callbacks","postMessage","id","message","_createGeometry","_releaseTask","geometryData","_assignVertexColorSpace","inputColorSpace","_color","toWorkingColorSpace","setXYZ","g","b","responseType","_initDecoder","useJS","WebAssembly","librariesPending","_loadLibrary","libraries","jsContent","wasmBinary","fn","DRACOWorker","substring","lastIndexOf","join","Worker","_taskCosts","_taskLoad","onmessage","a","log","terminate","decodeAttribute","draco","dracoGeometry","attributeType","numComponents","num_components","numValues","num_points","dataType","DT_FLOAT32","DT_INT8","DT_INT16","DT_INT32","DT_UINT8","DT_UINT16","DT_UINT32","ptr","_malloc","GetAttributeDataArrayForAllPoints","HEAPF32","_free","onModuleLoaded","DracoDecoderModule","module","Decoder","decodingStatus","geometryType","GetEncodedGeometryType","TRIANGULAR_MESH","DecodeArrayToMesh","POINT_CLOUD","PointCloud","DecodeArrayToPointCloud","ok","error_msg","attributeID","GetAttributeByUniqueId","GetAttributeId","GetAttribute","attributeResult","numFaces","num_faces","numIndices","GetTrianglesUInt32Array","destroy","WorkerPool","pool","queue","workers","workersResolve","workerStatus","workerId","workerCreator","addEventListener","_onMessage","msg","transfer","shift","_getIdleWorker","_initWorker","ct","yt","xt","wt","Ft","Ct","te","ae","ge","ue","we","Ae","In","Sn","pi","Ii","vkFormat","typeSize","pixelWidth","pixelHeight","pixelDepth","layerCount","faceCount","supercompressionScheme","levels","dataFormatDescriptor","vendorId","descriptorType","descriptorBlockSize","versionNumber","colorModel","colorPrimaries","transferFunction","flags","texelBlockDimension","bytesPlane","samples","keyValue","globalData","Si","n","_dataView","_littleEndian","_offset","getUint16","_nextUint64","getInt32","Oi","Ti","A","I","B","env","emscripten_notify_memory_growth","exports","memory","Q","fetch","C","instantiate","_init","Buffer","instance","malloc","Number","ZSTD_findDecompressedSize","E","ZSTD_decompress","D","free","_zstd","_activeLoaders","KTX2Loader","transcoderPath","transcoderBinary","transcoderPending","workerConfig","MSC_TRANSCODER","num","setWorkerLimit","astcSupported","hasFeatureAsync","astcHDRSupported","etc1Supported","etc2Supported","dxtSupported","bptcSupported","pvrtcSupported","isWebGPURenderer","hasFeature","getSupportedProfiles","includes","jsLoader","loadAsync","binaryLoader","binaryContent","BasisWorker","EngineFormat","EngineType","TranscoderFormat","BasisFormat","setWorkerCreator","_createTexture","transcodeResult","container","messageType","faces","width","format","dfdFlags","CompressedCubeTexture","mipmaps","CompressedArrayTexture","CompressedTexture","parseColorSpace","premultiplyAlpha","_nextUint32","f","h","U","levelData","uncompressedByteLength","_","_skip","_nextUint16","_nextUint8","bitOffset","bitLength","channelType","samplePosition","sampleLower","sampleUpper","_nextInt32","_scan","_nextUint8Array","u","d","w","imageFlags","rgbSliceByteOffset","rgbSliceByteLength","alphaSliceByteOffset","alphaSliceByteLength","L","v","V","S","F","endpointCount","selectorCount","imageDescs","endpointsData","selectorsData","tablesData","extendedData","isBasisHDR","VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT","FORMAT_MAP","zstd","ZSTDDecoder","init","levelIndex","levelWidth","levelHeight","levelDepth","level","TYPE_MAP","FloatType","HalfFloatType","depth","UNCOMPRESSED_FORMATS","DataTexture","Data3DTexture","texturePending","_createTextureFrom","ETC1S","UASTC","UASTC_HDR","ETC1","ETC2","BC1","BC3","BC4","BC5","BC7_M6_OPAQUE_ONLY","BC7_M5","PVRTC1_4_RGB","PVRTC1_4_RGBA","ASTC_4x4","ATC_RGB","ATC_RGBA_INTERPOLATED_ALPHA","RGBA32","RGB565","BGR565","RGBA4444","BC6H","RGB_HALF","RGBA_HALF","RGBAFormat","RGBA_ASTC_4x4_Format","RGB_BPTC_UNSIGNED_Format","RGBA_BPTC_Format","RGBA_ETC2_EAC_Format","RGBA_PVRTC_4BPPV1_Format","RGBA_S3TC_DXT5_Format","RGB_ETC1_Format","RGB_ETC2_Format","RGB_PVRTC_4BPPV1_Format","RGBA_S3TC_DXT1_Format","UnsignedByteType","BasisModule","_EngineFormat","_EngineType","_TranscoderFormat","_BasisFormat","onRuntimeInitialized","BASIS","initializeBasis","KTX2File","hasAlpha","ktx2File","cleanup","close","isValid","basisFormat","isUASTC","isETC1S","isHDR","getWidth","getHeight","getLayers","levelCount","getLevels","getFaces","getHasAlpha","getDFDFlags","transcoderFormat","engineFormat","engineType","OPTIONS","opt","if","needsPowerOfTwo","isPowerOfTwo","startTranscoding","face","mip","layerMips","mipWidth","mipHeight","layer","levelInfo","getImageLevelInfo","origWidth","origHeight","dst","getImageTranscodedSizeInBytes","status","transcodeImage","mipData","concat","FORMAT_OPTIONS","priorityETC1S","priorityUASTC","priorityHDR","arrays","totalByteLength","RGFormat","RedFormat","VK_FORMAT_R32G32B32A32_SFLOAT","VK_FORMAT_R16G16B16A16_SFLOAT","VK_FORMAT_R8G8B8A8_UNORM","VK_FORMAT_R8G8B8A8_SRGB","VK_FORMAT_R32G32_SFLOAT","VK_FORMAT_R16G16_SFLOAT","VK_FORMAT_R8G8_UNORM","VK_FORMAT_R8G8_SRGB","VK_FORMAT_R32_SFLOAT","VK_FORMAT_R16_SFLOAT","VK_FORMAT_R8_SRGB","VK_FORMAT_R8_UNORM","VK_FORMAT_ASTC_6x6_SRGB_BLOCK","RGBA_ASTC_6x6_Format","VK_FORMAT_ASTC_6x6_UNORM_BLOCK","dfd","NoColorSpace","fetchAndDecodeSubtree","split","response","statusText","handleJSONSubtree","getDirectoryUrl","baseURL","jsonByteLength","getBigUint64","binaryByteLength","jsonStart","jsonEnd","binaryStart","binaryEnd","jsonBuffer","jsonString","trim","bufferFetchPromises","binaryUrl","href","isAvailable","availability","constant","bitstream","isAvailable2","bitIndex","isTileAvailable","address","computeQuadtreeIndex","computeOctreeIndex","tileAvailability","isContentAvailable","contentAvailability","isChildSubtreeAvailable","childSubtreeAvailability","decodeSubtreeBinary","cleanUrl","part1By1","pow","part1By2","subtreeMap","resolveImplicite","rootTile","root","implicitTiling","contents","isQuad","subdivisionScheme","toUpperCase","subtreeUriTemplate","subtrees","contentURITemplates","rootURL","subtreeUri","replace","globalAddress","localAddress","subtree","contentURI","explicitTileset","geometricError","boundingVolume","refine","getChildren","buildChildren","parent","availableLevels","subtreeLevels","localAddresses","getChildrenAddresses","globalAddresses","boundingVolumes","computeBoundingVolumes","childLocalAddress","childGlobalAddress","newSubtree","newLocalAddress","contentURITemplate","tileAddress","nextLevel","rootBoundingVolume","addresses","computeBoundingVolume","region","rootRegion","west","south","east","north","minHeight","maxHeight","xStep","yStep","zStep","newWest","newSouth","newEast","newNorth","newMinHeight","newMaxHeight","vectors","scaleFactors","newVectors","component","origin","newCenter","wasmpack","ch","charCodeAt","write","__wasm_call_ctors","meshopt_encodeVertexVersion","meshopt_encodeIndexVersion","cond","bytes","view","encode","fun","bound","sbrk","tp","sp","heap","subarray","maxindex","index32","bits","insize","MeshoptDecoder","detector","wasm","validate","unpack","count4","filters","NONE","OCTAHEDRAL","QUATERNION","EXPONENTIAL","decoders","INDICES","requestId","createWorker","requests","event","action","workerProcess","useWorkers","decodeVertexBuffer","meshopt_decodeVertexBuffer","decodeIndexBuffer","meshopt_decodeIndexBuffer","decodeIndexSequence","meshopt_decodeIndexSequence","simplifyPoints","vertex_positions","vertex_count","vertex_positions_stride","vertex_colors","vertex_colors_stride","color_weight","target_vertex_count","ti","sc","simplifyOptions","LockBorder","concurrentDownloads","TileLoader","maxCachedItems","proxy","pointsCallback","setDRACOLoader","setDecoderPath","setKTX2Loader","setTranscoderPath","setMeshoptDecoder","hasMeshOptDecoder","b3dmDecoder","splatsDecoder","downloads","nextReady","nextDownloads","_download","_loadBatch","_getNextDownloads","nextDownload","shouldDoDownload","doDownload","distanceFunction","getSiblings","_getNextReady","tile","smallestDistance","POSITIVE_INFINITY","closest","closestItem","highestLevel","lowestLevel","MAX_SAFE_INTEGER","lowestIndex","dist","loadingStrategy","siblings","abortController","tileIdentifier","sceneZupToYup","_simplifyPath","realAbortController","AbortController","signal","abort","_meshReceived","downloadFunction","fetchFunction","method","resultArrayBuffer","put","_checkSize","finally","parseSplats","code","_scheduleDownload","aborted","temp","entry","reg","isSplatsBatch","main_path","parts","new_path","part","assertPath","normalizeStringPosix","allowAboveRoot","lastSegmentLength","lastSlash","dots","lastSlashIndex","posix","cwd","resolvedPath","resolvedAbsolute","process","isAbsolute","trailingSeparator","joined","arg","relative","to","fromStart","fromEnd","fromLen","toStart","toLen","lastCommonSep","fromCode","out","_makeLong","dirname","hasRoot","end","matchedSlash","basename","extIdx","firstNonSlashEnd","extname","startDot","startPart","preDotState","pathObject","sep","dir","base","ret","delimiter","win32","DFSOperation","pathBrowserify","IterableElementBase","_toElementFn","toElementFn","Symbol","iterator","args","_getIterator","predicate","thisArg","callbackfn","element","ele","initialValue","accumulator","print","toVisual","Heap","_elements","_DEFAULT_COMPARATOR","_comparator","comparator","el","leaf","heapify","_bubbleUp","last","_sinkDown","peek","fix","poll","_dfs","left","right","visitedNode","cloned","top","filteredList","current","mappedHeap","parentItem","halfLength","minItem","PriorityQueue","filteredPriorityQueue","mappedPriorityQueue","MinPriorityQueue","tmpVector","tmpVector2","zUpToYUpMatrix3x3","SplatsMesh","fragShader","ceil","textureSize","maxSplats","colorRenderTarget","WebGL3DRenderTarget","depthBuffer","resolveDepthBuffer","initRenderTarget","positionRenderTarget","cov1RenderTarget","cov2RenderTarget","ShaderMaterial","uniforms","numSlices","cov1Texture","cov2Texture","colorTexture","positionTexture","sizeMultiplier","cropRadius","MAX_VALUE","cameraNear","cameraFar","computeLinearDepth","vertexShader","splatsVertexShader","fragmentShader","splatsFragmentShader","InstancedBufferGeometry","vertices","orderAttribute","setUsage","DynamicDrawUsage","instanceCount","numTextures","sortID","freeAddresses","WorkerConstructor","sortListeners","newOrder","clearUpdateRanges","addUpdateRange","cameraPosition","rotateOnAxis","frustumCulled","copyMaterial2D","sourceTexture","vertexCopyShader","copyMaterial3D","copyCamera","copyScene","Scene","copyGeometry","PlaneGeometry","copyQuad","matrixAutoUpdate","document","growTextures","scissorBox","prevAutoClear","autoClear","prevRenderTarget","getRenderTarget","scissorWidth","scissorHeight","viewport","setRenderTarget","render","numLayers","xyz","equals","raycaster","intersects","cov2","positionArray","isInterleavedBuffer","numBatches","textureAddresses","pointManagerAddresses","raycast","positionsOnly","threshold","threshSquared","direction","distanceSqToPoint","isNaN","startIndex","addSplatsBatch","insertionIndexes","visible","hide","show","positionsStartIndex","colorsArray","cov1Array","cov2Array","arrayIndexBase4","positionIndex","getY","getZ","getW","destTextureLayer","srcHeight","scissor","batchPositionTexture","initTexture","copyTex2D","batchColorTexture","batchCov1Texture","batchCov2Texture","newNumTextures","copyTex3D","copyrightDiv","tempSphere","tempOBB","tempVec1","tempVec2","upVector","tempRay","inverseWorld","Frustum","transformedCameraPosition","tempIntersects","tempQuaternion","copyright","getOGC3DTilesCopyrightInfo","list","hasOwnProperty","OGC3DTile","properties","contentURL","domWidth","domHeight","rendererSize","distanceBias","drawBoundingVolume","displayErrors","displayCopyright","queryParams","uuidv4","tileLoader","tileLoaderOptions","points","update","geometricErrorMultiplier","splatsCropRadius","splatsSizeMultiplier","loadOutsideView","cameraOnLoad","parentTile","occlusionCullingService","static","setHex","colorID","clamp","matrixWorldAutoUpdate","childrenTiles","meshContent","tileContent","rootPath","materialVisibility","hasMeshContent","hasUnloadedJSONContent","centerModel","onLoadCallback","_setup","props","path.dirname","_showError","setSplatsSizeMultiplier","setSplatsCropRadius","updateMatrices","isObject3D","parentRefine","parentGeometricError","_transformWGS84ToCartesian","lerp","parentBoundingVolume","_checkContent","_load","setFromUnitVectors","applyQuaternion","isSetup","bbox","Box3Helper","helper","endsWith","rootUrl","rootParts","pathname","relativeParts","protocol","host","urlObj","searchParams","loadJson","deleted","loadContent","promises","contentIndex","urlRegex","_assembleURL","path.isAbsolute","path.sep","_extractQueryParams","_updateCopyrightLabel","layers","disable","Float32BufferAttribute","_calculateDistanceToCamera","multiplier","metric","_getSiblings","jsonRequested","mc","splat","invalidate","dispatchEvent","intersection","intersectsRay","intersectsSphere","splatsReady","setFromProjectionMatrix","multiplyMatrices","projectionMatrix","matrixWorldInverse","numTiles","numTilesRendered","maxLOD","percentageLoaded","_updateImmediate","_statsImmediate","_update","_stats","numTilesLoaded","_computeMetricRecursive","_updateNodeVisibilityImmediate","_expandTreeImmediate","shouldBeVisible","_shouldBeVisibleUpdateImmediate","_trimTreeImmediate","_loadMeshImmediate","_disposeChildren","parentDisplaysMesh","_changeContentVisibility","_disposeMeshContent","allChildrenReady","every","_isReadyImmediate","_setShouldNotBeVisibleRecursive","_calculateUpdateMetric","hasID","_loadJsonChildren","visibilityBeforeUpdate","inFrustum","_isReady","_areAllChildrenLoadedAndHidden","childJSON","childTile","allLoadedAndHidden","visibility","enable","near","getMaxScaleOnAxis","getDrawingBufferSize","fov","aspect","lambda","tan","window","devicePixelRatio","tiles","setGeometricErrorMultiplier","setDistanceBias","lon","lat","sfct","N","sin","cosLat","cos","cosLon","sinLat","nPh","errorDiv","createElement","textContent","style","padding","backgroundColor","zIndex","appendChild","setTimeout","bottom","textShadow","listString","InstancedTile","master","jsonChildren","refinement","setup","parentRefinement","premultiply","decompose","matrixWorldNeedsUpdate","transformWGS84ToCartesian","checkContent","absoluteURL","absolutePath","assembleURL","extractQueryParams","calculateDistanceToCamera","disposeChildren","updateNodeVisibility","changeContentVisibility","isReady","calculateUpdateMetric","meshesToDisplay","meshesDisplayed","areAllChildrenLoadedAndHidden","_renderSize","getWorldMatrix","InstancedOGC3DTile","tileset","MeshTile","instancedTiles","reuseableMatrix","instancedTile","added","listOMesh","addToScene","instanceMatrix","onAfterRender","displayedOnce","getCount","JsonTile","instanceTile","_checkLoaderInitialized","maxInstances","parseB3DMInstanced","setObject","nextready","instancedOGC3DTile","cachedTile","addInstance","download","cullMap","cullMaterial","cullTarget","_createCullTarget","cullPixels","WebGLRenderTarget","innerWidth","innerHeight","stencilBuffer","depthTexture","DepthTexture","DepthFormat","UnsignedShortType","tempRenderTarget","tempOverrideMaterial","overrideMaterial","readRenderTargetPixels"],"mappings":"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","x_google_ignoreList":[3,5,6,7,8,9,11,12,13,14,15,16,17,20,21,22,24,25,26,27,28,29]}
1
+ {"version":3,"file":"threedtiles.cjs.js","sources":["../src/geometry/obb.js","../src/utils/LinkedHashMap.js","../src/decoder/FeatureTable.js","../node_modules/three/examples/jsm/utils/BufferGeometryUtils.js","../src/decoder/B3DMDecoder.js","../node_modules/uuid/dist/esm-browser/rng.js","../node_modules/uuid/dist/esm-browser/regex.js","../node_modules/uuid/dist/esm-browser/stringify.js","../node_modules/uuid/dist/esm-browser/validate.js","../node_modules/uuid/dist/esm-browser/v4.js","../src/decoder/SplatsDecoder.js","../node_modules/three/examples/jsm/loaders/GLTFLoader.js","../node_modules/three/examples/jsm/loaders/DRACOLoader.js","../node_modules/three/examples/jsm/utils/WorkerPool.js","../node_modules/three/examples/jsm/libs/ktx-parse.module.js","../node_modules/three/examples/jsm/libs/zstddec.module.js","../node_modules/three/examples/jsm/loaders/KTX2Loader.js","../node_modules/three/examples/jsm/math/ColorSpaces.js","../src/tileset/implicit/SubtreeDecoder.js","../src/tileset/implicit/ImplicitTileResolver.js","../node_modules/meshoptimizer/meshopt_encoder.module.js","../node_modules/meshoptimizer/meshopt_decoder.module.js","../node_modules/meshoptimizer/meshopt_simplifier.module.js","../src/tileset/TileLoader.js","../node_modules/path-browserify/index.js","../node_modules/data-structure-typed/dist/mjs/constants/index.js","../node_modules/data-structure-typed/dist/mjs/data-structures/base/iterable-element-base.js","../node_modules/data-structure-typed/dist/mjs/data-structures/heap/heap.js","../node_modules/data-structure-typed/dist/mjs/data-structures/priority-queue/priority-queue.js","../node_modules/data-structure-typed/dist/mjs/data-structures/priority-queue/min-priority-queue.js","../src/splats/SplatsColider.js","../src/splats/SplatsMesh.js","../src/tileset/OGC3DTile.js","../src/tileset/instanced/InstancedTile.js","../src/tileset/instanced/InstancedOGC3DTile.js","../src/tileset/instanced/MeshTile.js","../src/tileset/instanced/JsonTile.js","../src/tileset/instanced/InstancedTileLoader.js","../src/tileset/OcclusionCullingService.js"],"sourcesContent":["\r\n\r\nimport { Matrix3, Matrix4, Ray, Sphere, Vector3, Box3, BufferGeometry, LineSegments, LineBasicMaterial } from \"three\";\r\nimport { OBB as threeOBB } from 'three/addons/math/OBB.js';\r\n\r\nconst tempMatrix = new Matrix3();\r\nconst tempVector3 = new Vector3();\r\nconst size = new Vector3();\r\nconst aabb = new Box3();\r\nconst matrix = new Matrix4();\r\nconst inverse = new Matrix4();\r\nconst localRay = new Ray();\r\n\r\nclass OBB {\r\n constructor(values) {\r\n this.center = new Vector3(values[0], values[1], values[2]);\r\n this.e1 = new Vector3(values[3], values[4], values[5]);\r\n this.e2 = new Vector3(values[6], values[7], values[8]);\r\n this.e3 = new Vector3(values[9], values[10], values[11]);\r\n\r\n this.halfSize = new Vector3(this.e1.length(), this.e2.length(), this.e3.length());\r\n\r\n\r\n this.e1.normalize();\r\n this.e2.normalize();\r\n this.e3.normalize();\r\n\r\n this.rotationMatrix = new Matrix3();\r\n this.rotationMatrix.set(\r\n this.e1.x, this.e2.x, this.e3.x,\r\n this.e1.y, this.e2.y, this.e3.y,\r\n this.e1.z, this.e2.z, this.e3.z);\r\n }\r\n\r\n copy(aObb) {\r\n this.center.copy(aObb.center);\r\n this.rotationMatrix.copy(aObb.rotationMatrix);\r\n this.halfSize.copy(aObb.halfSize);\r\n this.e1.copy(aObb.e1);\r\n this.e2.copy(aObb.e2);\r\n this.e3.copy(aObb.e3);\r\n }\r\n\r\n getSize(result) {\r\n\r\n return result.copy(this.halfSize).multiplyScalar(2);\r\n\r\n }\r\n\r\n applyMatrix4(matrix) {\r\n const e = matrix.elements;\r\n\r\n let sx = tempVector3.set(e[0], e[1], e[2]).length();\r\n const sy = tempVector3.set(e[4], e[5], e[6]).length();\r\n const sz = tempVector3.set(e[8], e[9], e[10]).length();\r\n\r\n const det = matrix.determinant();\r\n if (det < 0) sx = - sx;\r\n\r\n tempMatrix.setFromMatrix4(matrix);\r\n\r\n const invSX = 1 / sx;\r\n const invSY = 1 / sy;\r\n const invSZ = 1 / sz;\r\n\r\n tempMatrix.elements[0] *= invSX;\r\n tempMatrix.elements[1] *= invSX;\r\n tempMatrix.elements[2] *= invSX;\r\n\r\n tempMatrix.elements[3] *= invSY;\r\n tempMatrix.elements[4] *= invSY;\r\n tempMatrix.elements[5] *= invSY;\r\n\r\n tempMatrix.elements[6] *= invSZ;\r\n tempMatrix.elements[7] *= invSZ;\r\n tempMatrix.elements[8] *= invSZ;\r\n\r\n this.rotationMatrix.multiply(tempMatrix);\r\n\r\n this.halfSize.x *= sx;\r\n this.halfSize.y *= sy;\r\n this.halfSize.z *= sz;\r\n\r\n tempVector3.setFromMatrixPosition(matrix);\r\n this.center.applyMatrix4(matrix);\r\n //console.log(this.e1);\r\n this.rotationMatrix.extractBasis(this.e1, this.e2, this.e3);\r\n //console.log(this.e1)\r\n return this;\r\n\r\n }\r\n\r\n intersectRay(ray, result) {\r\n\r\n // the idea is to perform the intersection test in the local space\r\n // of the OBB.\r\n\r\n this.getSize(size);\r\n aabb.setFromCenterAndSize(tempVector3.set(0, 0, 0), size);\r\n\r\n // create a 4x4 transformation matrix\r\n\r\n matrix.setFromMatrix3(this.rotationMatrix);\r\n matrix.setPosition(this.center);\r\n\r\n // transform ray to the local space of the OBB\r\n\r\n inverse.copy(matrix).invert();\r\n localRay.copy(ray).applyMatrix4(inverse);\r\n\r\n // perform ray <-> AABB intersection test\r\n\r\n if (localRay.intersectBox(aabb, result)) {\r\n\r\n // transform the intersection point back to world space\r\n\r\n return result.applyMatrix4(matrix);\r\n\r\n } else {\r\n\r\n return null;\r\n\r\n }\r\n\r\n }\r\n\r\n intersectsRay(ray) {\r\n\r\n return this.intersectRay(ray, tempVector3) !== null;\r\n\r\n }\r\n\r\n insidePlane(plane) {\r\n // compute the projection interval radius of this OBB onto L(t) = this->center + t * p.normal;\r\n\r\n plane.normal.normalize();\r\n const r = this.halfSize.x * Math.abs(plane.normal.dot(this.e1)) +\r\n this.halfSize.y * Math.abs(plane.normal.dot(this.e2)) +\r\n this.halfSize.z * Math.abs(plane.normal.dot(this.e3));\r\n\r\n // compute distance of the OBB's center from the plane\r\n\r\n const d = plane.distanceToPoint(this.center);\r\n\r\n // Intersection occurs when distance d falls within [-r,+r] interval\r\n\r\n return d > -r;\r\n\r\n }\r\n\r\n inFrustum(frustum) {\r\n\r\n //this.rotationMatrix.extractBasis(this.e1, this.e2, this.e3);\r\n\r\n for (let i = 0; i < 6; i++) {\r\n const plane = frustum.planes[i];\r\n const planeIntersection = this.insidePlane(plane);\r\n\r\n if (!planeIntersection) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n distanceToPoint(point) {\r\n\r\n tempVector3.copy(point);\r\n tempVector3.sub(this.center);\r\n tempVector3.applyMatrix3(this.rotationMatrix);\r\n\r\n //// point to bounds \r\n let dx = Math.max(0, Math.max(-this.halfSize.x - tempVector3.x, tempVector3.x - this.halfSize.x));\r\n let dy = Math.max(0, Math.max(-this.halfSize.y - tempVector3.y, tempVector3.y - this.halfSize.y));\r\n let dz = Math.max(0, Math.max(-this.halfSize.z - tempVector3.z, tempVector3.z - this.halfSize.z));\r\n return Math.sqrt(dx * dx + dy * dy + dz * dz);\r\n }\r\n\r\n helper() {\r\n const hs = this.halfSize;\r\n const c = this.center;\r\n const e1 = this.e1;\r\n const e2 = this.e2;\r\n const e3 = this.e3;\r\n \r\n // Calculate all 8 corners\r\n const corners = [\r\n new Vector3().copy(c)\r\n .add(e1.clone().multiplyScalar(hs.x))\r\n .add(e2.clone().multiplyScalar(hs.y))\r\n .add(e3.clone().multiplyScalar(hs.z)),\r\n new Vector3().copy(c)\r\n .add(e1.clone().multiplyScalar(-hs.x))\r\n .add(e2.clone().multiplyScalar(hs.y))\r\n .add(e3.clone().multiplyScalar(hs.z)),\r\n new Vector3().copy(c)\r\n .add(e1.clone().multiplyScalar(-hs.x))\r\n .add(e2.clone().multiplyScalar(-hs.y))\r\n .add(e3.clone().multiplyScalar(hs.z)),\r\n new Vector3().copy(c)\r\n .add(e1.clone().multiplyScalar(hs.x))\r\n .add(e2.clone().multiplyScalar(-hs.y))\r\n .add(e3.clone().multiplyScalar(hs.z)),\r\n new Vector3().copy(c)\r\n .add(e1.clone().multiplyScalar(hs.x))\r\n .add(e2.clone().multiplyScalar(hs.y))\r\n .add(e3.clone().multiplyScalar(-hs.z)),\r\n new Vector3().copy(c)\r\n .add(e1.clone().multiplyScalar(-hs.x))\r\n .add(e2.clone().multiplyScalar(hs.y))\r\n .add(e3.clone().multiplyScalar(-hs.z)),\r\n new Vector3().copy(c)\r\n .add(e1.clone().multiplyScalar(-hs.x))\r\n .add(e2.clone().multiplyScalar(-hs.y))\r\n .add(e3.clone().multiplyScalar(-hs.z)),\r\n new Vector3().copy(c)\r\n .add(e1.clone().multiplyScalar(hs.x))\r\n .add(e2.clone().multiplyScalar(-hs.y))\r\n .add(e3.clone().multiplyScalar(-hs.z)),\r\n ];\r\n \r\n // Define the edges by connecting the corners\r\n const edges = [\r\n 0, 1, 1, 2, 2, 3, 3, 0, // Top face\r\n 4, 5, 5, 6, 6, 7, 7, 4, // Bottom face\r\n 0, 4, 1, 5, 2, 6, 3, 7 // Side edges\r\n ];\r\n \r\n // Create geometry and add line segments\r\n const geometry = new BufferGeometry().setFromPoints(corners);\r\n geometry.setIndex(edges);\r\n geometry.computeBoundingSphere();\r\n \r\n // Create line material\r\n const material = new LineBasicMaterial({ color: 0xff0000 });\r\n \r\n // Create the wireframe mesh\r\n const wireframe = new LineSegments(geometry, material);\r\n \r\n wireframe.dispose = ()=>{\r\n material.dispose();\r\n geometry.dispose();\r\n }\r\n return wireframe;\r\n }\r\n\r\n}\r\n\r\nexport { OBB };","/**\r\n * @copyright 2021 Aaron Zhao <yujianzhao2013@gmail.com>\r\n * @license MIT\r\n * Linked hash map data structure\r\n * @class LinkedHashMap\r\n */\r\nclass LinkedHashMap {\r\n /**\r\n * Creates a linked hash map instance\r\n * @public\r\n */\r\n constructor() {\r\n this._data = new Map();\r\n this._link = new Map();\r\n this._head = undefined;\r\n this._tail = undefined;\r\n }\r\n\r\n /**\r\n * Add or update an item to the list\r\n * @public\r\n * @param {any} key\r\n * @param {any} item\r\n * @param {boolean} head add to the head if true; tail otherwise\r\n */\r\n put(key, item, head = false) {\r\n if (this.has(key)) {\r\n this._data.set(key, item);\r\n return;\r\n }\r\n this._data.set(key, item);\r\n this._link.set(key, {\r\n previous: undefined,\r\n next: undefined\r\n });\r\n if (this._head == null) {\r\n this._head = key;\r\n this._tail = key;\r\n } else if (head) {\r\n this._link.get(this._head).previous = key;\r\n this._link.get(key).next = this._head;\r\n this._head = key;\r\n } else {\r\n this._link.get(this._tail).next = key;\r\n this._link.get(key).previous = this._tail;\r\n this._tail = key;\r\n }\r\n }\r\n\r\n /**\r\n * Returns the head key and item\r\n * @public\r\n * @returns {any} key, item, next(), previous()\r\n */\r\n head() {\r\n return ({\r\n key: this._head, value: this.get(this._head), next: () => this.next(this._head), previous: () => null\r\n });\r\n }\r\n\r\n /**\r\n * Returns the tail key and item\r\n * @public\r\n * @returns {any} key, item, next(), previous()\r\n */\r\n tail() {\r\n return ({\r\n key: this._tail, value: this.get(this._tail), next: () => null, previous: () => this.previous(this._tail)\r\n });\r\n }\r\n\r\n /**\r\n * Returns an item from the map by key\r\n * @public\r\n * @param {any} key\r\n * @returns {any} item\r\n */\r\n get(key) {\r\n return this._data.get(key);\r\n }\r\n\r\n /**\r\n * Returns previous key item of the key\r\n * @public\r\n * @param {any} key\r\n * @returns {any} key\r\n */\r\n previousKey(key) {\r\n const link = this._link.get(key);\r\n return link != null ? link.previous : undefined;\r\n }\r\n\r\n /**\r\n * Returns previous item of the key\r\n * @public\r\n * @param {any} key\r\n * @returns {any} item\r\n */\r\n previousValue(key) {\r\n return this.get(this.previousKey(key));\r\n }\r\n\r\n /**\r\n * Returns previous key, item of the key\r\n * @public\r\n * @param {any} key\r\n * @returns {any} key, item, next(), previous()\r\n */\r\n previous(key) {\r\n const prevKey = this.previousKey(key);\r\n return ({\r\n key: prevKey,\r\n value: this.get(prevKey),\r\n next: () => this.next(prevKey),\r\n previous: () => this.previous(prevKey)\r\n });\r\n }\r\n\r\n /**\r\n * Returns next key of the key\r\n * @public\r\n * @param {any} key\r\n * @returns {any} key\r\n */\r\n nextKey(key) {\r\n const link = this._link.get(key);\r\n return link != null ? link.next : undefined;\r\n }\r\n\r\n /**\r\n * Returns next item of the key\r\n * @public\r\n * @param {any} key\r\n * @returns {any} item\r\n */\r\n nextValue(key) {\r\n return this.get(this.nextKey(key));\r\n }\r\n\r\n /**\r\n * Returns next key, item of the key\r\n * @public\r\n * @param {any} key\r\n * @returns {any} key, item, next(), previous()\r\n */\r\n next(key) {\r\n const nextKey = this.nextKey(key);\r\n return ({\r\n key: nextKey,\r\n value: this.get(nextKey),\r\n next: () => this.next(nextKey),\r\n previous: () => this.previous(nextKey)\r\n });\r\n }\r\n\r\n /**\r\n * Removes and returns an item from the map\r\n * @public\r\n * @param {any} key\r\n * @returns {any} item\r\n */\r\n remove(key) {\r\n const item = this._data.get(key);\r\n if (item != null) {\r\n if (this.size() === 1) {\r\n this.reset();\r\n } else {\r\n if (key === this._head) {\r\n const headLink = this._link.get(this._head);\r\n this._link.get(headLink.next).previous = null;\r\n this._head = headLink.next;\r\n } else if (key === this._tail) {\r\n const tailLink = this._link.get(this._tail);\r\n this._link.get(tailLink.previous).next = null;\r\n this._tail = tailLink.previous;\r\n } else {\r\n const cur = this._link.get(key);\r\n const prev = this._link.get(cur.previous);\r\n const nex = this._link.get(cur.next);\r\n prev.next = cur.next;\r\n nex.previous = cur.previous;\r\n }\r\n this._link.delete(key);\r\n this._data.delete(key);\r\n }\r\n }\r\n return item;\r\n }\r\n\r\n /**\r\n * Return if the key exists in the map\r\n * @public\r\n * @param {any} key;\r\n * @returns {boolean}\r\n */\r\n has(key) {\r\n return this._data.has(key);\r\n }\r\n\r\n /**\r\n * Returns the size of the map\r\n * @public\r\n * @returns {number}\r\n */\r\n size() {\r\n return this._data.size;\r\n }\r\n\r\n /**\r\n * Empties the map\r\n * @public\r\n */\r\n reset() {\r\n this._data.clear();\r\n this._link.clear();\r\n this._head = undefined;\r\n this._tail = undefined;\r\n }\r\n\r\n /**\r\n * Returns an iterator of keys\r\n * @public\r\n * @returns {Iterator[key]}\r\n */\r\n keys() {\r\n return this._data.keys();\r\n }\r\n\r\n /**\r\n * Returns an iterator of values\r\n * @public\r\n * @returns {Iterator[value]}\r\n */\r\n values() {\r\n return this._data.values();\r\n }\r\n\r\n /**\r\n * Returns an iterator of keys and values\r\n * @public\r\n * @returns {Iterator[key, value]}\r\n */\r\n entries() {\r\n return this._data.entries();\r\n }\r\n\r\n /**\r\n * Returns array representation of the map values\r\n * @public\r\n * @param {'orderByInsert' | 'orderByLink'} order return by inserting order (default) or link order\r\n * @returns {Array<{key: any, value: any}>}\r\n */\r\n toArray(order = 'orderByInsert') {\r\n if (order !== 'orderByInsert') {\r\n const linkOrderArr = [];\r\n let next = this._head;\r\n while (next != null) {\r\n linkOrderArr.push({ key: next, value: this.get(next) });\r\n next = this.nextKey(next);\r\n }\r\n return linkOrderArr;\r\n }\r\n return Array.from(this.keys()).map((k) => ({ key: k, value: this.get(k) }));\r\n }\r\n}\r\n\r\nexport { LinkedHashMap };\r\n","//\r\n// This class is taken straight from NASA-AMMOS library.\r\n// https://github.com/NASA-AMMOS/3DTilesRendererJS/blob/master/src/utilities/FeatureTable.js\r\n//\r\n\r\nconst utf8decoder = new TextDecoder();\r\nexport class FeatureTable {\r\n\r\n constructor(buffer, start, headerLength, binLength) {\r\n\r\n this.buffer = buffer;\r\n this.binOffset = start + headerLength;\r\n this.binLength = binLength;\r\n\r\n let header = null;\r\n if (headerLength !== 0) {\r\n\r\n try {\r\n const headerData = new Uint8Array(buffer, start, headerLength);\r\n header = JSON.parse(utf8decoder.decode(headerData));\r\n } catch (e) {\r\n header = {};\r\n }\r\n\r\n } else {\r\n\r\n header = {};\r\n\r\n }\r\n this.header = header;\r\n\r\n }\r\n\r\n getKeys() {\r\n\r\n return Object.keys(this.header);\r\n\r\n }\r\n\r\n getData(key, count, defaultComponentType = null, defaultType = null) {\r\n\r\n const header = this.header;\r\n\r\n if (!(key in header)) {\r\n\r\n return null;\r\n\r\n }\r\n\r\n const feature = header[key];\r\n if (!(feature instanceof Object)) {\r\n\r\n return feature;\r\n\r\n } else if (Array.isArray(feature)) {\r\n\r\n return feature;\r\n\r\n } else {\r\n\r\n const { buffer, binOffset, binLength } = this;\r\n const byteOffset = feature.byteOffset || 0;\r\n const featureType = feature.type || defaultType;\r\n const featureComponentType = feature.componentType || defaultComponentType;\r\n\r\n if ('type' in feature && defaultType && feature.type !== defaultType) {\r\n\r\n throw new Error('FeatureTable: Specified type does not match expected type.');\r\n\r\n }\r\n\r\n let stride;\r\n switch (featureType) {\r\n\r\n case 'SCALAR':\r\n stride = 1;\r\n break;\r\n\r\n case 'VEC2':\r\n stride = 2;\r\n break;\r\n\r\n case 'VEC3':\r\n stride = 3;\r\n break;\r\n\r\n case 'VEC4':\r\n stride = 4;\r\n break;\r\n\r\n default:\r\n throw new Error(`FeatureTable : Feature type not provided for \"${key}\".`);\r\n\r\n }\r\n\r\n let data;\r\n const arrayStart = binOffset + byteOffset;\r\n const arrayLength = count * stride;\r\n\r\n switch (featureComponentType) {\r\n\r\n case 'BYTE':\r\n data = new Int8Array(buffer, arrayStart, arrayLength);\r\n break;\r\n\r\n case 'UNSIGNED_BYTE':\r\n data = new Uint8Array(buffer, arrayStart, arrayLength);\r\n break;\r\n\r\n case 'SHORT':\r\n data = new Int16Array(buffer, arrayStart, arrayLength);\r\n break;\r\n\r\n case 'UNSIGNED_SHORT':\r\n data = new Uint16Array(buffer, arrayStart, arrayLength);\r\n break;\r\n\r\n case 'INT':\r\n data = new Int32Array(buffer, arrayStart, arrayLength);\r\n break;\r\n\r\n case 'UNSIGNED_INT':\r\n data = new Uint32Array(buffer, arrayStart, arrayLength);\r\n break;\r\n\r\n case 'FLOAT':\r\n data = new Float32Array(buffer, arrayStart, arrayLength);\r\n break;\r\n\r\n case 'DOUBLE':\r\n data = new Float64Array(buffer, arrayStart, arrayLength);\r\n break;\r\n\r\n default:\r\n throw new Error(`FeatureTable : Feature component type not provided for \"${key}\".`);\r\n\r\n }\r\n\r\n const dataEnd = arrayStart + arrayLength * data.BYTES_PER_ELEMENT;\r\n if (dataEnd > binOffset + binLength) {\r\n\r\n throw new Error('FeatureTable: Feature data read outside binary body length.');\r\n\r\n }\r\n\r\n return data;\r\n\r\n }\r\n\r\n }\r\n\r\n}\r\n\r\nexport class BatchTable extends FeatureTable {\r\n\r\n constructor(buffer, batchSize, start, headerLength, binLength) {\r\n\r\n super(buffer, start, headerLength, binLength);\r\n this.batchSize = batchSize;\r\n\r\n }\r\n\r\n getData(key, componentType = null, type = null) {\r\n\r\n return super.getData(key, this.batchSize, componentType, type);\r\n\r\n }\r\n\r\n}\r\n","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tInstancedBufferAttribute,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tTrianglesDrawMode,\n\tVector3,\n} from 'three';\n\nfunction computeMikkTSpaceTangents( geometry, MikkTSpace, negateSign = true ) {\n\n\tif ( ! MikkTSpace || ! MikkTSpace.isReady ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Initialized MikkTSpace library required.' );\n\n\t}\n\n\tif ( ! geometry.hasAttribute( 'position' ) || ! geometry.hasAttribute( 'normal' ) || ! geometry.hasAttribute( 'uv' ) ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Tangents require \"position\", \"normal\", and \"uv\" attributes.' );\n\n\t}\n\n\tfunction getAttributeArray( attribute ) {\n\n\t\tif ( attribute.normalized || attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst dstArray = new Float32Array( attribute.count * attribute.itemSize );\n\n\t\t\tfor ( let i = 0, j = 0; i < attribute.count; i ++ ) {\n\n\t\t\t\tdstArray[ j ++ ] = attribute.getX( i );\n\t\t\t\tdstArray[ j ++ ] = attribute.getY( i );\n\n\t\t\t\tif ( attribute.itemSize > 2 ) {\n\n\t\t\t\t\tdstArray[ j ++ ] = attribute.getZ( i );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t\tif ( attribute.array instanceof Float32Array ) {\n\n\t\t\treturn attribute.array;\n\n\t\t}\n\n\t\treturn new Float32Array( attribute.array );\n\n\t}\n\n\t// MikkTSpace algorithm requires non-indexed input.\n\n\tconst _geometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\n\t// Compute vertex tangents.\n\n\tconst tangents = MikkTSpace.generateTangents(\n\n\t\tgetAttributeArray( _geometry.attributes.position ),\n\t\tgetAttributeArray( _geometry.attributes.normal ),\n\t\tgetAttributeArray( _geometry.attributes.uv )\n\n\t);\n\n\t// Texture coordinate convention of glTF differs from the apparent\n\t// default of the MikkTSpace library; .w component must be flipped.\n\n\tif ( negateSign ) {\n\n\t\tfor ( let i = 3; i < tangents.length; i += 4 ) {\n\n\t\t\ttangents[ i ] *= - 1;\n\n\t\t}\n\n\t}\n\n\t//\n\n\t_geometry.setAttribute( 'tangent', new BufferAttribute( tangents, 4 ) );\n\n\tif ( geometry !== _geometry ) {\n\n\t\tgeometry.copy( _geometry );\n\n\t}\n\n\treturn geometry;\n\n}\n\n/**\n * @param {Array<BufferGeometry>} geometries\n * @param {Boolean} useGroups\n * @return {BufferGeometry}\n */\nfunction mergeGeometries( geometries, useGroups = false ) {\n\n\tconst isIndexed = geometries[ 0 ].index !== null;\n\n\tconst attributesUsed = new Set( Object.keys( geometries[ 0 ].attributes ) );\n\tconst morphAttributesUsed = new Set( Object.keys( geometries[ 0 ].morphAttributes ) );\n\n\tconst attributes = {};\n\tconst morphAttributes = {};\n\n\tconst morphTargetsRelative = geometries[ 0 ].morphTargetsRelative;\n\n\tconst mergedGeometry = new BufferGeometry();\n\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\tconst geometry = geometries[ i ];\n\t\tlet attributesCount = 0;\n\n\t\t// ensure that all geometries are indexed, or none\n\n\t\tif ( isIndexed !== ( geometry.index !== null ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather attributes, exit early if they're different\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tif ( ! attributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( attributes[ name ] === undefined ) attributes[ name ] = [];\n\n\t\t\tattributes[ name ].push( geometry.attributes[ name ] );\n\n\t\t\tattributesCount ++;\n\n\t\t}\n\n\t\t// ensure geometries have the same number of attributes\n\n\t\tif ( attributesCount !== attributesUsed.size ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. Make sure all geometries have the same number of attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather morph attributes, exit early if they're different\n\n\t\tif ( morphTargetsRelative !== geometry.morphTargetsRelative ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphTargetsRelative must be consistent throughout all geometries.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tfor ( const name in geometry.morphAttributes ) {\n\n\t\t\tif ( ! morphAttributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphAttributes must be consistent throughout all geometries.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( morphAttributes[ name ] === undefined ) morphAttributes[ name ] = [];\n\n\t\t\tmorphAttributes[ name ].push( geometry.morphAttributes[ name ] );\n\n\t\t}\n\n\t\tif ( useGroups ) {\n\n\t\t\tlet count;\n\n\t\t\tif ( isIndexed ) {\n\n\t\t\t\tcount = geometry.index.count;\n\n\t\t\t} else if ( geometry.attributes.position !== undefined ) {\n\n\t\t\t\tcount = geometry.attributes.position.count;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. The geometry must have either an index or a position attribute' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.addGroup( offset, count, i );\n\n\t\t\toffset += count;\n\n\t\t}\n\n\t}\n\n\t// merge indices\n\n\tif ( isIndexed ) {\n\n\t\tlet indexOffset = 0;\n\t\tconst mergedIndex = [];\n\n\t\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\t\tconst index = geometries[ i ].index;\n\n\t\t\tfor ( let j = 0; j < index.count; ++ j ) {\n\n\t\t\t\tmergedIndex.push( index.getX( j ) + indexOffset );\n\n\t\t\t}\n\n\t\t\tindexOffset += geometries[ i ].attributes.position.count;\n\n\t\t}\n\n\t\tmergedGeometry.setIndex( mergedIndex );\n\n\t}\n\n\t// merge attributes\n\n\tfor ( const name in attributes ) {\n\n\t\tconst mergedAttribute = mergeAttributes( attributes[ name ] );\n\n\t\tif ( ! mergedAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' attribute.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tmergedGeometry.setAttribute( name, mergedAttribute );\n\n\t}\n\n\t// merge morph attributes\n\n\tfor ( const name in morphAttributes ) {\n\n\t\tconst numMorphTargets = morphAttributes[ name ][ 0 ].length;\n\n\t\tif ( numMorphTargets === 0 ) break;\n\n\t\tmergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n\t\tmergedGeometry.morphAttributes[ name ] = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; ++ i ) {\n\n\t\t\tconst morphAttributesToMerge = [];\n\n\t\t\tfor ( let j = 0; j < morphAttributes[ name ].length; ++ j ) {\n\n\t\t\t\tmorphAttributesToMerge.push( morphAttributes[ name ][ j ][ i ] );\n\n\t\t\t}\n\n\t\t\tconst mergedMorphAttribute = mergeAttributes( morphAttributesToMerge );\n\n\t\t\tif ( ! mergedMorphAttribute ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' morphAttribute.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.morphAttributes[ name ].push( mergedMorphAttribute );\n\n\t\t}\n\n\t}\n\n\treturn mergedGeometry;\n\n}\n\n/**\n * @param {Array<BufferAttribute>} attributes\n * @return {BufferAttribute}\n */\nfunction mergeAttributes( attributes ) {\n\n\tlet TypedArray;\n\tlet itemSize;\n\tlet normalized;\n\tlet gpuType = - 1;\n\tlet arrayLength = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( itemSize === undefined ) itemSize = attribute.itemSize;\n\t\tif ( itemSize !== attribute.itemSize ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( normalized === undefined ) normalized = attribute.normalized;\n\t\tif ( normalized !== attribute.normalized ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( gpuType === - 1 ) gpuType = attribute.gpuType;\n\t\tif ( gpuType !== attribute.gpuType ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.count * itemSize;\n\n\t}\n\n\tconst array = new TypedArray( arrayLength );\n\tconst result = new BufferAttribute( array, itemSize, normalized );\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst tupleOffset = offset / itemSize;\n\t\t\tfor ( let j = 0, l = attribute.count; j < l; j ++ ) {\n\n\t\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\t\tconst value = attribute.getComponent( j, c );\n\t\t\t\t\tresult.setComponent( j + tupleOffset, c, value );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tarray.set( attribute.array, offset );\n\n\t\t}\n\n\t\toffset += attribute.count * itemSize;\n\n\t}\n\n\tif ( gpuType !== undefined ) {\n\n\t\tresult.gpuType = gpuType;\n\n\t}\n\n\treturn result;\n\n}\n\n/**\n * @param {BufferAttribute}\n * @return {BufferAttribute}\n */\nexport function deepCloneAttribute( attribute ) {\n\n\tif ( attribute.isInstancedInterleavedBufferAttribute || attribute.isInterleavedBufferAttribute ) {\n\n\t\treturn deinterleaveAttribute( attribute );\n\n\t}\n\n\tif ( attribute.isInstancedBufferAttribute ) {\n\n\t\treturn new InstancedBufferAttribute().copy( attribute );\n\n\t}\n\n\treturn new BufferAttribute().copy( attribute );\n\n}\n\n/**\n * @param {Array<BufferAttribute>} attributes\n * @return {Array<InterleavedBufferAttribute>}\n */\nfunction interleaveAttributes( attributes ) {\n\n\t// Interleaves the provided attributes into an InterleavedBuffer and returns\n\t// a set of InterleavedBufferAttributes for each attribute\n\tlet TypedArray;\n\tlet arrayLength = 0;\n\tlet stride = 0;\n\n\t// calculate the length and type of the interleavedBuffer\n\tfor ( let i = 0, l = attributes.length; i < l; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'AttributeBuffers of different types cannot be interleaved' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.array.length;\n\t\tstride += attribute.itemSize;\n\n\t}\n\n\t// Create the set of buffer attributes\n\tconst interleavedBuffer = new InterleavedBuffer( new TypedArray( arrayLength ), stride );\n\tlet offset = 0;\n\tconst res = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\tfor ( let j = 0, l = attributes.length; j < l; j ++ ) {\n\n\t\tconst attribute = attributes[ j ];\n\t\tconst itemSize = attribute.itemSize;\n\t\tconst count = attribute.count;\n\t\tconst iba = new InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, attribute.normalized );\n\t\tres.push( iba );\n\n\t\toffset += itemSize;\n\n\t\t// Move the data for each attribute into the new interleavedBuffer\n\t\t// at the appropriate offset\n\t\tfor ( let c = 0; c < count; c ++ ) {\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\tiba[ setters[ k ] ]( c, attribute[ getters[ k ] ]( c ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn res;\n\n}\n\n// returns a new, non-interleaved version of the provided attribute\nexport function deinterleaveAttribute( attribute ) {\n\n\tconst cons = attribute.data.array.constructor;\n\tconst count = attribute.count;\n\tconst itemSize = attribute.itemSize;\n\tconst normalized = attribute.normalized;\n\n\tconst array = new cons( count * itemSize );\n\tlet newAttribute;\n\tif ( attribute.isInstancedInterleavedBufferAttribute ) {\n\n\t\tnewAttribute = new InstancedBufferAttribute( array, itemSize, normalized, attribute.meshPerAttribute );\n\n\t} else {\n\n\t\tnewAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t}\n\n\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\tnewAttribute.setX( i, attribute.getX( i ) );\n\n\t\tif ( itemSize >= 2 ) {\n\n\t\t\tnewAttribute.setY( i, attribute.getY( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 3 ) {\n\n\t\t\tnewAttribute.setZ( i, attribute.getZ( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 4 ) {\n\n\t\t\tnewAttribute.setW( i, attribute.getW( i ) );\n\n\t\t}\n\n\t}\n\n\treturn newAttribute;\n\n}\n\n// deinterleaves all attributes on the geometry\nexport function deinterleaveGeometry( geometry ) {\n\n\tconst attributes = geometry.attributes;\n\tconst morphTargets = geometry.morphTargets;\n\tconst attrMap = new Map();\n\n\tfor ( const key in attributes ) {\n\n\t\tconst attr = attributes[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tattributes[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n\tfor ( const key in morphTargets ) {\n\n\t\tconst attr = morphTargets[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tmorphTargets[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @return {number}\n */\nfunction estimateBytesUsed( geometry ) {\n\n\t// Return the estimated memory used by this geometry in bytes\n\t// Calculate using itemSize, count, and BYTES_PER_ELEMENT to account\n\t// for InterleavedBufferAttributes.\n\tlet mem = 0;\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst attr = geometry.getAttribute( name );\n\t\tmem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n\n\t}\n\n\tconst indices = geometry.getIndex();\n\tmem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n\treturn mem;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {number} tolerance\n * @return {BufferGeometry}\n */\nfunction mergeVertices( geometry, tolerance = 1e-4 ) {\n\n\ttolerance = Math.max( tolerance, Number.EPSILON );\n\n\t// Generate an index buffer if the geometry doesn't have one, or optimize it\n\t// if it's already available.\n\tconst hashToIndex = {};\n\tconst indices = geometry.getIndex();\n\tconst positions = geometry.getAttribute( 'position' );\n\tconst vertexCount = indices ? indices.count : positions.count;\n\n\t// next value for triangle indices\n\tlet nextIndex = 0;\n\n\t// attributes and new attribute arrays\n\tconst attributeNames = Object.keys( geometry.attributes );\n\tconst tmpAttributes = {};\n\tconst tmpMorphAttributes = {};\n\tconst newIndices = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\t// Initialize the arrays, allocating space conservatively. Extra\n\t// space will be trimmed in the last step.\n\tfor ( let i = 0, l = attributeNames.length; i < l; i ++ ) {\n\n\t\tconst name = attributeNames[ i ];\n\t\tconst attr = geometry.attributes[ name ];\n\n\t\ttmpAttributes[ name ] = new attr.constructor(\n\t\t\tnew attr.array.constructor( attr.count * attr.itemSize ),\n\t\t\tattr.itemSize,\n\t\t\tattr.normalized\n\t\t);\n\n\t\tconst morphAttributes = geometry.morphAttributes[ name ];\n\t\tif ( morphAttributes ) {\n\n\t\t\tif ( ! tmpMorphAttributes[ name ] ) tmpMorphAttributes[ name ] = [];\n\t\t\tmorphAttributes.forEach( ( morphAttr, i ) => {\n\n\t\t\t\tconst array = new morphAttr.array.constructor( morphAttr.count * morphAttr.itemSize );\n\t\t\t\ttmpMorphAttributes[ name ][ i ] = new morphAttr.constructor( array, morphAttr.itemSize, morphAttr.normalized );\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\t// convert the error tolerance to an amount of decimal places to truncate to\n\tconst halfTolerance = tolerance * 0.5;\n\tconst exponent = Math.log10( 1 / tolerance );\n\tconst hashMultiplier = Math.pow( 10, exponent );\n\tconst hashAdditive = halfTolerance * hashMultiplier;\n\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\tconst index = indices ? indices.getX( i ) : i;\n\n\t\t// Generate a hash for the vertex attributes at the current index 'i'\n\t\tlet hash = '';\n\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\tconst name = attributeNames[ j ];\n\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\tconst itemSize = attribute.itemSize;\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t// double tilde truncates the decimal value\n\t\t\t\thash += `${ ~ ~ ( attribute[ getters[ k ] ]( index ) * hashMultiplier + hashAdditive ) },`;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add another reference to the vertex if it's already\n\t\t// used by another index\n\t\tif ( hash in hashToIndex ) {\n\n\t\t\tnewIndices.push( hashToIndex[ hash ] );\n\n\t\t} else {\n\n\t\t\t// copy data to the new index in the temporary attributes\n\t\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\t\tconst name = attributeNames[ j ];\n\t\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\t\tconst morphAttributes = geometry.morphAttributes[ name ];\n\t\t\t\tconst itemSize = attribute.itemSize;\n\t\t\t\tconst newArray = tmpAttributes[ name ];\n\t\t\t\tconst newMorphArrays = tmpMorphAttributes[ name ];\n\n\t\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t\tconst getterFunc = getters[ k ];\n\t\t\t\t\tconst setterFunc = setters[ k ];\n\t\t\t\t\tnewArray[ setterFunc ]( nextIndex, attribute[ getterFunc ]( index ) );\n\n\t\t\t\t\tif ( morphAttributes ) {\n\n\t\t\t\t\t\tfor ( let m = 0, ml = morphAttributes.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\t\tnewMorphArrays[ m ][ setterFunc ]( nextIndex, morphAttributes[ m ][ getterFunc ]( index ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\thashToIndex[ hash ] = nextIndex;\n\t\t\tnewIndices.push( nextIndex );\n\t\t\tnextIndex ++;\n\n\t\t}\n\n\t}\n\n\t// generate result BufferGeometry\n\tconst result = geometry.clone();\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst tmpAttribute = tmpAttributes[ name ];\n\n\t\tresult.setAttribute( name, new tmpAttribute.constructor(\n\t\t\ttmpAttribute.array.slice( 0, nextIndex * tmpAttribute.itemSize ),\n\t\t\ttmpAttribute.itemSize,\n\t\t\ttmpAttribute.normalized,\n\t\t) );\n\n\t\tif ( ! ( name in tmpMorphAttributes ) ) continue;\n\n\t\tfor ( let j = 0; j < tmpMorphAttributes[ name ].length; j ++ ) {\n\n\t\t\tconst tmpMorphAttribute = tmpMorphAttributes[ name ][ j ];\n\n\t\t\tresult.morphAttributes[ name ][ j ] = new tmpMorphAttribute.constructor(\n\t\t\t\ttmpMorphAttribute.array.slice( 0, nextIndex * tmpMorphAttribute.itemSize ),\n\t\t\t\ttmpMorphAttribute.itemSize,\n\t\t\t\ttmpMorphAttribute.normalized,\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\t// indices\n\n\tresult.setIndex( newIndices );\n\n\treturn result;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {number} drawMode\n * @return {BufferGeometry}\n */\nfunction toTrianglesDrawMode( geometry, drawMode ) {\n\n\tif ( drawMode === TrianglesDrawMode ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.' );\n\t\treturn geometry;\n\n\t}\n\n\tif ( drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode ) {\n\n\t\tlet index = geometry.getIndex();\n\n\t\t// generate index if not present\n\n\t\tif ( index === null ) {\n\n\t\t\tconst indices = [];\n\n\t\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tfor ( let i = 0; i < position.count; i ++ ) {\n\n\t\t\t\t\tindices.push( i );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setIndex( indices );\n\t\t\t\tindex = geometry.getIndex();\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst numberOfTriangles = index.count - 2;\n\t\tconst newIndices = [];\n\n\t\tif ( drawMode === TriangleFanDrawMode ) {\n\n\t\t\t// gl.TRIANGLE_FAN\n\n\t\t\tfor ( let i = 1; i <= numberOfTriangles; i ++ ) {\n\n\t\t\t\tnewIndices.push( index.getX( 0 ) );\n\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// gl.TRIANGLE_STRIP\n\n\t\t\tfor ( let i = 0; i < numberOfTriangles; i ++ ) {\n\n\t\t\t\tif ( i % 2 === 0 ) {\n\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( ( newIndices.length / 3 ) !== numberOfTriangles ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' );\n\n\t\t}\n\n\t\t// build final geometry\n\n\t\tconst newGeometry = geometry.clone();\n\t\tnewGeometry.setIndex( newIndices );\n\t\tnewGeometry.clearGroups();\n\n\t\treturn newGeometry;\n\n\t} else {\n\n\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:', drawMode );\n\t\treturn geometry;\n\n\t}\n\n}\n\n/**\n * Calculates the morphed attributes of a morphed/skinned BufferGeometry.\n * Helpful for Raytracing or Decals.\n * @param {Mesh | Line | Points} object An instance of Mesh, Line or Points.\n * @return {Object} An Object with original position/normal attributes and morphed ones.\n */\nfunction computeMorphedAttributes( object ) {\n\n\tconst _vA = new Vector3();\n\tconst _vB = new Vector3();\n\tconst _vC = new Vector3();\n\n\tconst _tempA = new Vector3();\n\tconst _tempB = new Vector3();\n\tconst _tempC = new Vector3();\n\n\tconst _morphA = new Vector3();\n\tconst _morphB = new Vector3();\n\tconst _morphC = new Vector3();\n\n\tfunction _calculateMorphedAttributeData(\n\t\tobject,\n\t\tattribute,\n\t\tmorphAttribute,\n\t\tmorphTargetsRelative,\n\t\ta,\n\t\tb,\n\t\tc,\n\t\tmodifiedAttributeArray\n\t) {\n\n\t\t_vA.fromBufferAttribute( attribute, a );\n\t\t_vB.fromBufferAttribute( attribute, b );\n\t\t_vC.fromBufferAttribute( attribute, c );\n\n\t\tconst morphInfluences = object.morphTargetInfluences;\n\n\t\tif ( morphAttribute && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\t\t\t_morphB.set( 0, 0, 0 );\n\t\t\t_morphC.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morph = morphAttribute[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morph, a );\n\t\t\t\t_tempB.fromBufferAttribute( morph, b );\n\t\t\t\t_tempC.fromBufferAttribute( morph, c );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB, influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( _vA ), influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB.sub( _vB ), influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC.sub( _vC ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_vA.add( _morphA );\n\t\t\t_vB.add( _morphB );\n\t\t\t_vC.add( _morphC );\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tobject.applyBoneTransform( a, _vA );\n\t\t\tobject.applyBoneTransform( b, _vB );\n\t\t\tobject.applyBoneTransform( c, _vC );\n\n\t\t}\n\n\t\tmodifiedAttributeArray[ a * 3 + 0 ] = _vA.x;\n\t\tmodifiedAttributeArray[ a * 3 + 1 ] = _vA.y;\n\t\tmodifiedAttributeArray[ a * 3 + 2 ] = _vA.z;\n\t\tmodifiedAttributeArray[ b * 3 + 0 ] = _vB.x;\n\t\tmodifiedAttributeArray[ b * 3 + 1 ] = _vB.y;\n\t\tmodifiedAttributeArray[ b * 3 + 2 ] = _vB.z;\n\t\tmodifiedAttributeArray[ c * 3 + 0 ] = _vC.x;\n\t\tmodifiedAttributeArray[ c * 3 + 1 ] = _vC.y;\n\t\tmodifiedAttributeArray[ c * 3 + 2 ] = _vC.z;\n\n\t}\n\n\tconst geometry = object.geometry;\n\tconst material = object.material;\n\n\tlet a, b, c;\n\tconst index = geometry.index;\n\tconst positionAttribute = geometry.attributes.position;\n\tconst morphPosition = geometry.morphAttributes.position;\n\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\tconst normalAttribute = geometry.attributes.normal;\n\tconst morphNormal = geometry.morphAttributes.position;\n\n\tconst groups = geometry.groups;\n\tconst drawRange = geometry.drawRange;\n\tlet i, j, il, jl;\n\tlet group;\n\tlet start, end;\n\n\tconst modifiedPosition = new Float32Array( positionAttribute.count * positionAttribute.itemSize );\n\tconst modifiedNormal = new Float32Array( normalAttribute.count * normalAttribute.itemSize );\n\n\tif ( index !== null ) {\n\n\t\t// indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = index.getX( j );\n\t\t\t\t\tb = index.getX( j + 1 );\n\t\t\t\t\tc = index.getX( j + 2 );\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = index.getX( i );\n\t\t\t\tb = index.getX( i + 1 );\n\t\t\t\tc = index.getX( i + 2 );\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// non-indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = j;\n\t\t\t\t\tb = j + 1;\n\t\t\t\t\tc = j + 2;\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = i;\n\t\t\t\tb = i + 1;\n\t\t\t\tc = i + 2;\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst morphedPositionAttribute = new Float32BufferAttribute( modifiedPosition, 3 );\n\tconst morphedNormalAttribute = new Float32BufferAttribute( modifiedNormal, 3 );\n\n\treturn {\n\n\t\tpositionAttribute: positionAttribute,\n\t\tnormalAttribute: normalAttribute,\n\t\tmorphedPositionAttribute: morphedPositionAttribute,\n\t\tmorphedNormalAttribute: morphedNormalAttribute\n\n\t};\n\n}\n\nfunction mergeGroups( geometry ) {\n\n\tif ( geometry.groups.length === 0 ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.mergeGroups(): No groups are defined. Nothing to merge.' );\n\t\treturn geometry;\n\n\t}\n\n\tlet groups = geometry.groups;\n\n\t// sort groups by material index\n\n\tgroups = groups.sort( ( a, b ) => {\n\n\t\tif ( a.materialIndex !== b.materialIndex ) return a.materialIndex - b.materialIndex;\n\n\t\treturn a.start - b.start;\n\n\t} );\n\n\t// create index for non-indexed geometries\n\n\tif ( geometry.getIndex() === null ) {\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\t\tconst indices = [];\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i += 3 ) {\n\n\t\t\tindices.push( i, i + 1, i + 2 );\n\n\t\t}\n\n\t\tgeometry.setIndex( indices );\n\n\t}\n\n\t// sort index\n\n\tconst index = geometry.getIndex();\n\n\tconst newIndices = [];\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tconst groupStart = group.start;\n\t\tconst groupLength = groupStart + group.count;\n\n\t\tfor ( let j = groupStart; j < groupLength; j ++ ) {\n\n\t\t\tnewIndices.push( index.getX( j ) );\n\n\t\t}\n\n\t}\n\n\tgeometry.dispose(); // Required to force buffer recreation\n\tgeometry.setIndex( newIndices );\n\n\t// update groups indices\n\n\tlet start = 0;\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tgroup.start = start;\n\t\tstart += group.count;\n\n\t}\n\n\t// merge groups\n\n\tlet currentGroup = groups[ 0 ];\n\n\tgeometry.groups = [ currentGroup ];\n\n\tfor ( let i = 1; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tif ( currentGroup.materialIndex === group.materialIndex ) {\n\n\t\t\tcurrentGroup.count += group.count;\n\n\t\t} else {\n\n\t\t\tcurrentGroup = group;\n\t\t\tgeometry.groups.push( currentGroup );\n\n\t\t}\n\n\t}\n\n\treturn geometry;\n\n}\n\n\n/**\n * Modifies the supplied geometry if it is non-indexed, otherwise creates a new,\n * non-indexed geometry. Returns the geometry with smooth normals everywhere except\n * faces that meet at an angle greater than the crease angle.\n *\n * @param {BufferGeometry} geometry\n * @param {number} [creaseAngle]\n * @return {BufferGeometry}\n */\nfunction toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */ ) {\n\n\tconst creaseDot = Math.cos( creaseAngle );\n\tconst hashMultiplier = ( 1 + 1e-10 ) * 1e2;\n\n\t// reusable vectors\n\tconst verts = [ new Vector3(), new Vector3(), new Vector3() ];\n\tconst tempVec1 = new Vector3();\n\tconst tempVec2 = new Vector3();\n\tconst tempNorm = new Vector3();\n\tconst tempNorm2 = new Vector3();\n\n\t// hashes a vector\n\tfunction hashVertex( v ) {\n\n\t\tconst x = ~ ~ ( v.x * hashMultiplier );\n\t\tconst y = ~ ~ ( v.y * hashMultiplier );\n\t\tconst z = ~ ~ ( v.z * hashMultiplier );\n\t\treturn `${x},${y},${z}`;\n\n\t}\n\n\t// BufferGeometry.toNonIndexed() warns if the geometry is non-indexed\n\t// and returns the original geometry\n\tconst resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\tconst posAttr = resultGeometry.attributes.position;\n\tconst vertexMap = {};\n\n\t// find all the normals shared by commonly located vertices\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\t// add the normal to the map for all vertices\n\t\tconst normal = new Vector3().crossVectors( tempVec1, tempVec2 ).normalize();\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tif ( ! ( hash in vertexMap ) ) {\n\n\t\t\t\tvertexMap[ hash ] = [];\n\n\t\t\t}\n\n\t\t\tvertexMap[ hash ].push( normal );\n\n\t\t}\n\n\t}\n\n\t// average normals from all vertices that share a common location if they are within the\n\t// provided crease threshold\n\tconst normalArray = new Float32Array( posAttr.count * 3 );\n\tconst normAttr = new BufferAttribute( normalArray, 3, false );\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\t// get the face normal for this vertex\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\ttempNorm.crossVectors( tempVec1, tempVec2 ).normalize();\n\n\t\t// average all normals that meet the threshold and set the normal value\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tconst otherNormals = vertexMap[ hash ];\n\t\t\ttempNorm2.set( 0, 0, 0 );\n\n\t\t\tfor ( let k = 0, lk = otherNormals.length; k < lk; k ++ ) {\n\n\t\t\t\tconst otherNorm = otherNormals[ k ];\n\t\t\t\tif ( tempNorm.dot( otherNorm ) > creaseDot ) {\n\n\t\t\t\t\ttempNorm2.add( otherNorm );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttempNorm2.normalize();\n\t\t\tnormAttr.setXYZ( i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z );\n\n\t\t}\n\n\t}\n\n\tresultGeometry.setAttribute( 'normal', normAttr );\n\treturn resultGeometry;\n\n}\n\nexport {\n\tcomputeMikkTSpaceTangents,\n\tmergeGeometries,\n\tmergeAttributes,\n\tinterleaveAttributes,\n\testimateBytesUsed,\n\tmergeVertices,\n\ttoTrianglesDrawMode,\n\tcomputeMorphedAttributes,\n\tmergeGroups,\n\ttoCreasedNormals\n};\n","import * as THREE from 'three';\r\nimport { FeatureTable, BatchTable } from './FeatureTable';\r\nimport * as BufferGeometryUtils from 'three/addons/utils/BufferGeometryUtils.js';\r\n\r\n\r\n\r\n\r\nclass B3DMDecoder {\r\n\tconstructor(aGltfLoader) {\r\n\t\tthis.gltfLoader = aGltfLoader;\r\n\t\tthis.tempMatrix = new THREE.Matrix4();\r\n\r\n\t\tthis.zUpToYUpMatrix = new THREE.Matrix4();\r\n\t\tthis.zUpToYUpMatrix.set(\r\n\t\t\t1, 0, 0, 0,\r\n\t\t\t0, 0, -1, 0,\r\n\t\t\t0, 1, 0, 0,\r\n\t\t\t0, 0, 0, 1);\r\n\r\n\t}\r\n\r\n\tparseB3DM(arrayBuffer, meshCallback, sceneZupToYUp, meshZUpToYUp) {\r\n\t\tconst self = this;\r\n\t\tconst dataView = new DataView(arrayBuffer);\r\n\r\n\t\tconst magic =\r\n\t\t\tString.fromCharCode(dataView.getUint8(0)) +\r\n\t\t\tString.fromCharCode(dataView.getUint8(1)) +\r\n\t\t\tString.fromCharCode(dataView.getUint8(2)) +\r\n\t\t\tString.fromCharCode(dataView.getUint8(3));\r\n\t\tconsole.assert(magic === 'b3dm');\r\n\r\n\t\tconst byteLength = dataView.getUint32(8, true);\r\n\t\tconsole.assert(byteLength === arrayBuffer.byteLength);\r\n\r\n\t\tconst featureTableJSONByteLength = dataView.getUint32(12, true);\r\n\t\tconst featureTableBinaryByteLength = dataView.getUint32(16, true);\r\n\t\tconst batchTableJSONByteLength = dataView.getUint32(20, true);\r\n\t\tconst batchTableBinaryByteLength = dataView.getUint32(24, true);\r\n\r\n\t\tconst featureTableStart = 28;\r\n\t\tconst featureTable = new FeatureTable(arrayBuffer, featureTableStart, featureTableJSONByteLength, featureTableBinaryByteLength);\r\n\r\n\t\tconst batchTableStart = featureTableStart + featureTableJSONByteLength + featureTableBinaryByteLength;\r\n\t\tconst batchTable = new BatchTable(arrayBuffer, featureTable.getData('BATCH_LENGTH'), batchTableStart, batchTableJSONByteLength, batchTableBinaryByteLength);\r\n\r\n\t\tconst glbStart = batchTableStart + batchTableJSONByteLength + batchTableBinaryByteLength;\r\n\t\tconst glbBytes = new Uint8Array(arrayBuffer, glbStart, byteLength - glbStart);\r\n\r\n\r\n\t\tconst gltfBuffer = glbBytes.slice().buffer;\r\n\r\n\r\n\t\treturn new Promise(async (resolve, reject) => {\r\n\t\t\tawait this.checkLoaderInitialized();\r\n\t\t\tthis.gltfLoader.parse(gltfBuffer, null, model => {\r\n\t\t\t\tconst rtcCenter = featureTable.getData('RTC_CENTER');\r\n\t\t\t\tif (rtcCenter) {\r\n\t\t\t\t\tthis.tempMatrix.makeTranslation(rtcCenter[0], rtcCenter[1], rtcCenter[2])\r\n\t\t\t\t\tmodel.scene.applyMatrix4(this.tempMatrix);\r\n\t\t\t\t} else if (!!model.userData.gltfExtensions && !!model.userData.gltfExtensions.CESIUM_RTC) {\r\n\t\t\t\t\tthis.tempMatrix.makeTranslation(model.userData.gltfExtensions.CESIUM_RTC.center[0], model.userData.gltfExtensions.CESIUM_RTC.center[1], model.userData.gltfExtensions.CESIUM_RTC.center[2])\r\n\t\t\t\t\tmodel.scene.applyMatrix4(this.tempMatrix);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (sceneZupToYUp) {\r\n\t\t\t\t\tmodel.scene.applyMatrix4(self.zUpToYUpMatrix);\r\n\t\t\t\t}\r\n\t\t\t\tmodel.scene.asset = model.asset;\r\n\t\t\t\tmodel.scene.traverse((o) => {\r\n\r\n\t\t\t\t\tif (o.isMesh) {\r\n\t\t\t\t\t\tif (meshZUpToYUp) {\r\n\t\t\t\t\t\t\to.applyMatrix4(self.zUpToYUpMatrix);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (!!meshCallback) {\r\n\t\t\t\t\t\t\tmeshCallback(o);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t\tresolve(model.scene);\r\n\t\t\t}, error => {\r\n\t\t\t\tconsole.error(error);\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\tcheckLoaderInitialized = async () => {\r\n\t\treturn new Promise((resolve) => {\r\n\t\t\tconst interval = setInterval(() => {\r\n\t\t\t\tif ((!this.gltfLoader.hasDracoLoader || this.gltfLoader.dracoLoader) && (!this.gltfLoader.hasKTX2Loader || this.gltfLoader.ktx2Loader)) {\r\n\t\t\t\t\tclearInterval(interval);\r\n\t\t\t\t\tresolve();\r\n\t\t\t\t}\r\n\t\t\t}, 10); // check every 100ms\r\n\t\t});\r\n\t};\r\n\tparseB3DMInstanced(arrayBuffer, meshCallback, maxCount, sceneZupToYUp, meshZupToYup) { // expects GLTF with one node level\r\n\r\n\t\treturn this.parseB3DM(arrayBuffer, meshCallback, sceneZupToYUp, meshZupToYup).then(mesh => {\r\n\t\t\t// todo several meshes in a single gltf\r\n\t\t\tlet instancedMesh;\r\n\t\t\tlet geometries = [];\r\n\t\t\tlet materials = [];\r\n\t\t\tmesh.updateWorldMatrix(false, true)\r\n\t\t\tmesh.traverse(child => {\r\n\t\t\t\tif (child.isMesh) {\r\n\t\t\t\t\tchild.geometry.applyMatrix4(child.matrixWorld);\r\n\t\t\t\t\tgeometries.push(child.geometry);\r\n\t\t\t\t\tmaterials.push(child.material);\r\n\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tlet mergedGeometry = normalizeAndMergeGeometries(geometries);\r\n\t\t\tinstancedMesh = new THREE.InstancedMesh(mergedGeometry, materials, maxCount);\r\n\t\t\tinstancedMesh.baseMatrix = new THREE.Matrix4().identity();\r\n\t\t\treturn instancedMesh;\r\n\t\t});\r\n\r\n\t}\r\n}\r\nexport { B3DMDecoder }\r\n\r\nfunction normalizeAndMergeGeometries(geometries) {\r\n\t// Identify all unique attributes across all geometries.\r\n\tlet allAttributes = new Set();\r\n\tgeometries.forEach(geometry => {\r\n\t\tfor (let attribute in geometry.attributes) {\r\n\t\t\tallAttributes.add(attribute);\r\n\t\t}\r\n\t});\r\n\r\n\t// Ensure every geometry has every attribute, adding default filled ones if necessary.\r\n\tgeometries.forEach(geometry => {\r\n\t\tallAttributes.forEach(attribute => {\r\n\t\t\tif (!geometry.attributes[attribute]) {\r\n\t\t\t\tconst attributeSize = getAttributeSize(attribute);\r\n\t\t\t\tconst buffer = new Float32Array(attributeSize * geometry.getAttribute('position').count).fill(0);\r\n\t\t\t\tgeometry.setAttribute(attribute, new THREE.BufferAttribute(buffer, attributeSize));\r\n\t\t\t}\r\n\t\t});\r\n\t});\r\n\r\n\t// Now merge the geometries.\r\n\tlet mergedGeometry = BufferGeometryUtils.mergeGeometries(geometries, true);\r\n\treturn mergedGeometry;\r\n}\r\n\r\nfunction getAttributeSize(attribute) {\r\n\tswitch (attribute) {\r\n\t\tcase 'position':\r\n\t\tcase 'normal':\r\n\t\tcase 'color':\r\n\t\t\treturn 3;\r\n\t\tcase 'uv':\r\n\t\tcase 'uv2':\r\n\t\t\treturn 2;\r\n\t\t// Add other attribute cases as needed.\r\n\t\tdefault:\r\n\t\t\tthrow new Error(`Unknown attribute ${attribute}`);\r\n\t}\r\n}\r\n\r\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation. Also,\n // find the complete implementation of crypto (msCrypto) on IE11.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(rnds);\n}\n\nexport default v4;","import * as THREE from 'three';\r\nimport { v4 as uuidv4 } from \"uuid\";\r\n\r\nconst workers = [];\r\nlet workerCounter = 0;\r\nclass SplatsDecoder {\r\n\r\n\tconstructor(gltfLoader, renderer) {\r\n\t\tconst self = this;\r\n\t\tself.renderer = renderer;\r\n\t\tself.gltfLoader = gltfLoader;\r\n\t}\r\n\r\n\tparseSplats(arrayBuffer, sceneZupToYUp, meshZUpToYUp, splatsMesh) {\r\n\t\tconst self = this;\r\n\t\treturn new Promise(async (resolve, reject) => {\r\n\t\t\tawait self.checkLoaderInitialized();\r\n\t\t\tself.gltfLoader.parse(arrayBuffer, null, model => {\r\n\t\t\t\tconst scene = model.scene;\r\n\t\t\t\tconst decoded = model.scene.children[0];\r\n\t\t\t\tconst positions = decoded.geometry.attributes.position;\r\n\t\t\t\tconst colors = decoded.geometry.attributes.color;\r\n\t\t\t\tconst cov0 = decoded.geometry.attributes.cov_0;\r\n\t\t\t\tconst cov1 = decoded.geometry.attributes.cov_1;\r\n\t\t\t\tconst splatTile = splatsMesh.addSplatsTile(positions, colors, cov0, cov1);\r\n\t\t\t\tmodel.scene.traverse(o=>{\r\n\t\t\t\t\tif(o.dispose) o.dispose();\r\n\t\t\t\t})\r\n\t\t\t\tresolve(splatTile);\r\n\t\t\t\t\r\n\t\t\t}, error => {\r\n\t\t\t\tconsole.error(error);\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\tcheckLoaderInitialized = async () => {\r\n\t\tconst self = this;\r\n\t\treturn new Promise((resolve) => {\r\n\t\t\tconst interval = setInterval(() => {\r\n\t\t\t\tif ((!self.gltfLoader.hasDracoLoader || self.gltfLoader.dracoLoader) && (!self.gltfLoader.hasKTX2Loader || self.gltfLoader.ktx2Loader)) {\r\n\t\t\t\t\tclearInterval(interval);\r\n\t\t\t\t\tresolve();\r\n\t\t\t\t}\r\n\t\t\t}, 10); \r\n\t\t});\r\n\t};\r\n} export { SplatsDecoder };\r\n\r\n","import {\n\tAnimationClip,\n\tBone,\n\tBox3,\n\tBufferAttribute,\n\tBufferGeometry,\n\tClampToEdgeWrapping,\n\tColor,\n\tColorManagement,\n\tDirectionalLight,\n\tDoubleSide,\n\tFileLoader,\n\tFrontSide,\n\tGroup,\n\tImageBitmapLoader,\n\tInstancedMesh,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tInterpolant,\n\tInterpolateDiscrete,\n\tInterpolateLinear,\n\tLine,\n\tLineBasicMaterial,\n\tLineLoop,\n\tLineSegments,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearMipmapNearestFilter,\n\tLinearSRGBColorSpace,\n\tLoader,\n\tLoaderUtils,\n\tMaterial,\n\tMathUtils,\n\tMatrix4,\n\tMesh,\n\tMeshBasicMaterial,\n\tMeshPhysicalMaterial,\n\tMeshStandardMaterial,\n\tMirroredRepeatWrapping,\n\tNearestFilter,\n\tNearestMipmapLinearFilter,\n\tNearestMipmapNearestFilter,\n\tNumberKeyframeTrack,\n\tObject3D,\n\tOrthographicCamera,\n\tPerspectiveCamera,\n\tPointLight,\n\tPoints,\n\tPointsMaterial,\n\tPropertyBinding,\n\tQuaternion,\n\tQuaternionKeyframeTrack,\n\tRepeatWrapping,\n\tSkeleton,\n\tSkinnedMesh,\n\tSphere,\n\tSpotLight,\n\tTexture,\n\tTextureLoader,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tVector2,\n\tVector3,\n\tVectorKeyframeTrack,\n\tSRGBColorSpace,\n\tInstancedBufferAttribute\n} from 'three';\nimport { toTrianglesDrawMode } from '../utils/BufferGeometryUtils.js';\n\nclass GLTFLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.dracoLoader = null;\n\t\tthis.ktx2Loader = null;\n\t\tthis.meshoptDecoder = null;\n\n\t\tthis.pluginCallbacks = [];\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsClearcoatExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsDispersionExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureBasisUExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureWebPExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureAVIFExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsSheenExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsTransmissionExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsVolumeExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsIorExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsEmissiveStrengthExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsSpecularExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsIridescenceExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsAnisotropyExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsBumpExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFLightsExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMeshoptCompression( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMeshGpuInstancing( parser );\n\n\t\t} );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet resourcePath;\n\n\t\tif ( this.resourcePath !== '' ) {\n\n\t\t\tresourcePath = this.resourcePath;\n\n\t\t} else if ( this.path !== '' ) {\n\n\t\t\t// If a base path is set, resources will be relative paths from that plus the relative path of the gltf file\n\t\t\t// Example path = 'https://my-cnd-server.com/', url = 'assets/models/model.gltf'\n\t\t\t// resourcePath = 'https://my-cnd-server.com/assets/models/'\n\t\t\t// referenced resource 'model.bin' will be loaded from 'https://my-cnd-server.com/assets/models/model.bin'\n\t\t\t// referenced resource '../textures/texture.png' will be loaded from 'https://my-cnd-server.com/assets/textures/texture.png'\n\t\t\tconst relativeUrl = LoaderUtils.extractUrlBase( url );\n\t\t\tresourcePath = LoaderUtils.resolveURL( relativeUrl, this.path );\n\n\t\t} else {\n\n\t\t\tresourcePath = LoaderUtils.extractUrlBase( url );\n\n\t\t}\n\n\t\t// Tells the LoadingManager to track an extra item, which resolves after\n\t\t// the model is fully loaded. This means the count of items loaded will\n\t\t// be incorrect, but ensures manager.onLoad() does not fire early.\n\t\tthis.manager.itemStart( url );\n\n\t\tconst _onError = function ( e ) {\n\n\t\t\tif ( onError ) {\n\n\t\t\t\tonError( e );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( e );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t};\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, function ( data ) {\n\n\t\t\ttry {\n\n\t\t\t\tscope.parse( data, resourcePath, function ( gltf ) {\n\n\t\t\t\t\tonLoad( gltf );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, _onError );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\t_onError( e );\n\n\t\t\t}\n\n\t\t}, onProgress, _onError );\n\n\t}\n\n\tsetDRACOLoader( dracoLoader ) {\n\n\t\tthis.dracoLoader = dracoLoader;\n\t\treturn this;\n\n\t}\n\n\tsetKTX2Loader( ktx2Loader ) {\n\n\t\tthis.ktx2Loader = ktx2Loader;\n\t\treturn this;\n\n\t}\n\n\tsetMeshoptDecoder( meshoptDecoder ) {\n\n\t\tthis.meshoptDecoder = meshoptDecoder;\n\t\treturn this;\n\n\t}\n\n\tregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {\n\n\t\t\tthis.pluginCallbacks.push( callback );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) {\n\n\t\t\tthis.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tparse( data, path, onLoad, onError ) {\n\n\t\tlet json;\n\t\tconst extensions = {};\n\t\tconst plugins = {};\n\t\tconst textDecoder = new TextDecoder();\n\n\t\tif ( typeof data === 'string' ) {\n\n\t\t\tjson = JSON.parse( data );\n\n\t\t} else if ( data instanceof ArrayBuffer ) {\n\n\t\t\tconst magic = textDecoder.decode( new Uint8Array( data, 0, 4 ) );\n\n\t\t\tif ( magic === BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\t\ttry {\n\n\t\t\t\t\textensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\tif ( onError ) onError( error );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tjson = JSON.parse( extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content );\n\n\t\t\t} else {\n\n\t\t\t\tjson = JSON.parse( textDecoder.decode( data ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tjson = data;\n\n\t\t}\n\n\t\tif ( json.asset === undefined || json.asset.version[ 0 ] < 2 ) {\n\n\t\t\tif ( onError ) onError( new Error( 'THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.' ) );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst parser = new GLTFParser( json, {\n\n\t\t\tpath: path || this.resourcePath || '',\n\t\t\tcrossOrigin: this.crossOrigin,\n\t\t\trequestHeader: this.requestHeader,\n\t\t\tmanager: this.manager,\n\t\t\tktx2Loader: this.ktx2Loader,\n\t\t\tmeshoptDecoder: this.meshoptDecoder\n\n\t\t} );\n\n\t\tparser.fileLoader.setRequestHeader( this.requestHeader );\n\n\t\tfor ( let i = 0; i < this.pluginCallbacks.length; i ++ ) {\n\n\t\t\tconst plugin = this.pluginCallbacks[ i ]( parser );\n\n\t\t\tif ( ! plugin.name ) console.error( 'THREE.GLTFLoader: Invalid plugin found: missing name' );\n\n\t\t\tplugins[ plugin.name ] = plugin;\n\n\t\t\t// Workaround to avoid determining as unknown extension\n\t\t\t// in addUnknownExtensionsToUserData().\n\t\t\t// Remove this workaround if we move all the existing\n\t\t\t// extension handlers to plugin system\n\t\t\textensions[ plugin.name ] = true;\n\n\t\t}\n\n\t\tif ( json.extensionsUsed ) {\n\n\t\t\tfor ( let i = 0; i < json.extensionsUsed.length; ++ i ) {\n\n\t\t\t\tconst extensionName = json.extensionsUsed[ i ];\n\t\t\t\tconst extensionsRequired = json.extensionsRequired || [];\n\n\t\t\t\tswitch ( extensionName ) {\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MATERIALS_UNLIT:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMaterialsUnlitExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_DRACO_MESH_COMPRESSION:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_TEXTURE_TRANSFORM:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFTextureTransformExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MESH_QUANTIZATION:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMeshQuantizationExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( extensionsRequired.indexOf( extensionName ) >= 0 && plugins[ extensionName ] === undefined ) {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Unknown extension \"' + extensionName + '\".' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tparser.setExtensions( extensions );\n\t\tparser.setPlugins( plugins );\n\t\tparser.parse( onLoad, onError );\n\n\t}\n\n\tparseAsync( data, path ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.parse( data, path, resolve, reject );\n\n\t\t} );\n\n\t}\n\n}\n\n/* GLTFREGISTRY */\n\nfunction GLTFRegistry() {\n\n\tlet objects = {};\n\n\treturn\t{\n\n\t\tget: function ( key ) {\n\n\t\t\treturn objects[ key ];\n\n\t\t},\n\n\t\tadd: function ( key, object ) {\n\n\t\t\tobjects[ key ] = object;\n\n\t\t},\n\n\t\tremove: function ( key ) {\n\n\t\t\tdelete objects[ key ];\n\n\t\t},\n\n\t\tremoveAll: function () {\n\n\t\t\tobjects = {};\n\n\t\t}\n\n\t};\n\n}\n\n/*********************************/\n/********** EXTENSIONS ***********/\n/*********************************/\n\nconst EXTENSIONS = {\n\tKHR_BINARY_GLTF: 'KHR_binary_glTF',\n\tKHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression',\n\tKHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual',\n\tKHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat',\n\tKHR_MATERIALS_DISPERSION: 'KHR_materials_dispersion',\n\tKHR_MATERIALS_IOR: 'KHR_materials_ior',\n\tKHR_MATERIALS_SHEEN: 'KHR_materials_sheen',\n\tKHR_MATERIALS_SPECULAR: 'KHR_materials_specular',\n\tKHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission',\n\tKHR_MATERIALS_IRIDESCENCE: 'KHR_materials_iridescence',\n\tKHR_MATERIALS_ANISOTROPY: 'KHR_materials_anisotropy',\n\tKHR_MATERIALS_UNLIT: 'KHR_materials_unlit',\n\tKHR_MATERIALS_VOLUME: 'KHR_materials_volume',\n\tKHR_TEXTURE_BASISU: 'KHR_texture_basisu',\n\tKHR_TEXTURE_TRANSFORM: 'KHR_texture_transform',\n\tKHR_MESH_QUANTIZATION: 'KHR_mesh_quantization',\n\tKHR_MATERIALS_EMISSIVE_STRENGTH: 'KHR_materials_emissive_strength',\n\tEXT_MATERIALS_BUMP: 'EXT_materials_bump',\n\tEXT_TEXTURE_WEBP: 'EXT_texture_webp',\n\tEXT_TEXTURE_AVIF: 'EXT_texture_avif',\n\tEXT_MESHOPT_COMPRESSION: 'EXT_meshopt_compression',\n\tEXT_MESH_GPU_INSTANCING: 'EXT_mesh_gpu_instancing'\n};\n\n/**\n * Punctual Lights Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n */\nclass GLTFLightsExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL;\n\n\t\t// Object3D instance caches\n\t\tthis.cache = { refs: {}, uses: {} };\n\n\t}\n\n\t_markDefs() {\n\n\t\tconst parser = this.parser;\n\t\tconst nodeDefs = this.parser.json.nodes || [];\n\n\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.extensions\n\t\t\t\t\t&& nodeDef.extensions[ this.name ]\n\t\t\t\t\t&& nodeDef.extensions[ this.name ].light !== undefined ) {\n\n\t\t\t\tparser._addNodeRef( this.cache, nodeDef.extensions[ this.name ].light );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_loadLight( lightIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst cacheKey = 'light:' + lightIndex;\n\t\tlet dependency = parser.cache.get( cacheKey );\n\n\t\tif ( dependency ) return dependency;\n\n\t\tconst json = parser.json;\n\t\tconst extensions = ( json.extensions && json.extensions[ this.name ] ) || {};\n\t\tconst lightDefs = extensions.lights || [];\n\t\tconst lightDef = lightDefs[ lightIndex ];\n\t\tlet lightNode;\n\n\t\tconst color = new Color( 0xffffff );\n\n\t\tif ( lightDef.color !== undefined ) color.setRGB( lightDef.color[ 0 ], lightDef.color[ 1 ], lightDef.color[ 2 ], LinearSRGBColorSpace );\n\n\t\tconst range = lightDef.range !== undefined ? lightDef.range : 0;\n\n\t\tswitch ( lightDef.type ) {\n\n\t\t\tcase 'directional':\n\t\t\t\tlightNode = new DirectionalLight( color );\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tcase 'point':\n\t\t\t\tlightNode = new PointLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\tbreak;\n\n\t\t\tcase 'spot':\n\t\t\t\tlightNode = new SpotLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\t// Handle spotlight properties.\n\t\t\t\tlightDef.spot = lightDef.spot || {};\n\t\t\t\tlightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0;\n\t\t\t\tlightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0;\n\t\t\t\tlightNode.angle = lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unexpected light type: ' + lightDef.type );\n\n\t\t}\n\n\t\t// Some lights (e.g. spot) default to a position other than the origin. Reset the position\n\t\t// here, because node-level parsing will only override position if explicitly specified.\n\t\tlightNode.position.set( 0, 0, 0 );\n\n\t\tlightNode.decay = 2;\n\n\t\tassignExtrasToUserData( lightNode, lightDef );\n\n\t\tif ( lightDef.intensity !== undefined ) lightNode.intensity = lightDef.intensity;\n\n\t\tlightNode.name = parser.createUniqueName( lightDef.name || ( 'light_' + lightIndex ) );\n\n\t\tdependency = Promise.resolve( lightNode );\n\n\t\tparser.cache.add( cacheKey, dependency );\n\n\t\treturn dependency;\n\n\t}\n\n\tgetDependency( type, index ) {\n\n\t\tif ( type !== 'light' ) return;\n\n\t\treturn this._loadLight( index );\n\n\t}\n\n\tcreateNodeAttachment( nodeIndex ) {\n\n\t\tconst self = this;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\t\tconst lightDef = ( nodeDef.extensions && nodeDef.extensions[ this.name ] ) || {};\n\t\tconst lightIndex = lightDef.light;\n\n\t\tif ( lightIndex === undefined ) return null;\n\n\t\treturn this._loadLight( lightIndex ).then( function ( light ) {\n\n\t\t\treturn parser._getNodeRef( self.cache, lightIndex, light );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Unlit Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n */\nclass GLTFMaterialsUnlitExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_UNLIT;\n\n\t}\n\n\tgetMaterialType() {\n\n\t\treturn MeshBasicMaterial;\n\n\t}\n\n\textendParams( materialParams, materialDef, parser ) {\n\n\t\tconst pending = [];\n\n\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\tmaterialParams.opacity = 1.0;\n\n\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness;\n\n\t\tif ( metallicRoughness ) {\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.setRGB( array[ 0 ], array[ 1 ], array[ 2 ], LinearSRGBColorSpace );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, SRGBColorSpace ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials Emissive Strength Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/blob/5768b3ce0ef32bc39cdf1bef10b948586635ead3/extensions/2.0/Khronos/KHR_materials_emissive_strength/README.md\n */\nclass GLTFMaterialsEmissiveStrengthExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_EMISSIVE_STRENGTH;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst emissiveStrength = materialDef.extensions[ this.name ].emissiveStrength;\n\n\t\tif ( emissiveStrength !== undefined ) {\n\n\t\t\tmaterialParams.emissiveIntensity = emissiveStrength;\n\n\t\t}\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Clearcoat Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat\n */\nclass GLTFMaterialsClearcoatExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.clearcoatFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoat = extension.clearcoatFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatMap', extension.clearcoatTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatRoughnessMap', extension.clearcoatRoughnessTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatNormalTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatNormalMap', extension.clearcoatNormalTexture ) );\n\n\t\t\tif ( extension.clearcoatNormalTexture.scale !== undefined ) {\n\n\t\t\t\tconst scale = extension.clearcoatNormalTexture.scale;\n\n\t\t\t\tmaterialParams.clearcoatNormalScale = new Vector2( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials dispersion Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_dispersion\n */\nclass GLTFMaterialsDispersionExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_DISPERSION;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.dispersion = extension.dispersion !== undefined ? extension.dispersion : 0;\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Iridescence Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_iridescence\n */\nclass GLTFMaterialsIridescenceExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IRIDESCENCE;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.iridescenceFactor !== undefined ) {\n\n\t\t\tmaterialParams.iridescence = extension.iridescenceFactor;\n\n\t\t}\n\n\t\tif ( extension.iridescenceTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'iridescenceMap', extension.iridescenceTexture ) );\n\n\t\t}\n\n\t\tif ( extension.iridescenceIor !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceIOR = extension.iridescenceIor;\n\n\t\t}\n\n\t\tif ( materialParams.iridescenceThicknessRange === undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange = [ 100, 400 ];\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessMinimum !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange[ 0 ] = extension.iridescenceThicknessMinimum;\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessMaximum !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange[ 1 ] = extension.iridescenceThicknessMaximum;\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'iridescenceThicknessMap', extension.iridescenceThicknessTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Sheen Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen\n */\nclass GLTFMaterialsSheenExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SHEEN;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tmaterialParams.sheenColor = new Color( 0, 0, 0 );\n\t\tmaterialParams.sheenRoughness = 0;\n\t\tmaterialParams.sheen = 1;\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.sheenColorFactor !== undefined ) {\n\n\t\t\tconst colorFactor = extension.sheenColorFactor;\n\t\t\tmaterialParams.sheenColor.setRGB( colorFactor[ 0 ], colorFactor[ 1 ], colorFactor[ 2 ], LinearSRGBColorSpace );\n\n\t\t}\n\n\t\tif ( extension.sheenRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.sheenRoughness = extension.sheenRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.sheenColorTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenColorMap', extension.sheenColorTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\tif ( extension.sheenRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenRoughnessMap', extension.sheenRoughnessTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Transmission Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission\n * Draft: https://github.com/KhronosGroup/glTF/pull/1698\n */\nclass GLTFMaterialsTransmissionExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.transmissionFactor !== undefined ) {\n\n\t\t\tmaterialParams.transmission = extension.transmissionFactor;\n\n\t\t}\n\n\t\tif ( extension.transmissionTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'transmissionMap', extension.transmissionTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials Volume Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume\n */\nclass GLTFMaterialsVolumeExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_VOLUME;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.thickness = extension.thicknessFactor !== undefined ? extension.thicknessFactor : 0;\n\n\t\tif ( extension.thicknessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'thicknessMap', extension.thicknessTexture ) );\n\n\t\t}\n\n\t\tmaterialParams.attenuationDistance = extension.attenuationDistance || Infinity;\n\n\t\tconst colorArray = extension.attenuationColor || [ 1, 1, 1 ];\n\t\tmaterialParams.attenuationColor = new Color().setRGB( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ], LinearSRGBColorSpace );\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials ior Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior\n */\nclass GLTFMaterialsIorExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IOR;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.ior = extension.ior !== undefined ? extension.ior : 1.5;\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Materials specular Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular\n */\nclass GLTFMaterialsSpecularExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SPECULAR;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.specularIntensity = extension.specularFactor !== undefined ? extension.specularFactor : 1.0;\n\n\t\tif ( extension.specularTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularIntensityMap', extension.specularTexture ) );\n\n\t\t}\n\n\t\tconst colorArray = extension.specularColorFactor || [ 1, 1, 1 ];\n\t\tmaterialParams.specularColor = new Color().setRGB( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ], LinearSRGBColorSpace );\n\n\t\tif ( extension.specularColorTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularColorMap', extension.specularColorTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n\n/**\n * Materials bump Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/EXT_materials_bump\n */\nclass GLTFMaterialsBumpExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_MATERIALS_BUMP;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.bumpScale = extension.bumpFactor !== undefined ? extension.bumpFactor : 1.0;\n\n\t\tif ( extension.bumpTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'bumpMap', extension.bumpTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials anisotropy Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_anisotropy\n */\nclass GLTFMaterialsAnisotropyExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_ANISOTROPY;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.anisotropyStrength !== undefined ) {\n\n\t\t\tmaterialParams.anisotropy = extension.anisotropyStrength;\n\n\t\t}\n\n\t\tif ( extension.anisotropyRotation !== undefined ) {\n\n\t\t\tmaterialParams.anisotropyRotation = extension.anisotropyRotation;\n\n\t\t}\n\n\t\tif ( extension.anisotropyTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'anisotropyMap', extension.anisotropyTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * BasisU Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu\n */\nclass GLTFTextureBasisUExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_BASISU;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ this.name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ this.name ];\n\t\tconst loader = parser.options.ktx2Loader;\n\n\t\tif ( ! loader ) {\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures' );\n\n\t\t\t} else {\n\n\t\t\t\t// Assumes that the extension is optional and that a fallback texture is present\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t}\n\n}\n\n/**\n * WebP Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_webp\n */\nclass GLTFTextureWebPExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_TEXTURE_WEBP;\n\t\tthis.isSupported = null;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst name = this.name;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ name ];\n\t\tconst source = json.images[ extension.source ];\n\n\t\tlet loader = parser.textureLoader;\n\t\tif ( source.uri ) {\n\n\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.detectSupport().then( function ( isSupported ) {\n\n\t\t\tif ( isSupported ) return parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: WebP required by asset but unsupported.' );\n\n\t\t\t}\n\n\t\t\t// Fall back to PNG or JPEG.\n\t\t\treturn parser.loadTexture( textureIndex );\n\n\t\t} );\n\n\t}\n\n\tdetectSupport() {\n\n\t\tif ( ! this.isSupported ) {\n\n\t\t\tthis.isSupported = new Promise( function ( resolve ) {\n\n\t\t\t\tconst image = new Image();\n\n\t\t\t\t// Lossy test image. Support for lossy images doesn't guarantee support for all\n\t\t\t\t// WebP images, unfortunately.\n\t\t\t\timage.src = 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA';\n\n\t\t\t\timage.onload = image.onerror = function () {\n\n\t\t\t\t\tresolve( image.height === 1 );\n\n\t\t\t\t};\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn this.isSupported;\n\n\t}\n\n}\n\n/**\n * AVIF Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_avif\n */\nclass GLTFTextureAVIFExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_TEXTURE_AVIF;\n\t\tthis.isSupported = null;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst name = this.name;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ name ];\n\t\tconst source = json.images[ extension.source ];\n\n\t\tlet loader = parser.textureLoader;\n\t\tif ( source.uri ) {\n\n\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.detectSupport().then( function ( isSupported ) {\n\n\t\t\tif ( isSupported ) return parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: AVIF required by asset but unsupported.' );\n\n\t\t\t}\n\n\t\t\t// Fall back to PNG or JPEG.\n\t\t\treturn parser.loadTexture( textureIndex );\n\n\t\t} );\n\n\t}\n\n\tdetectSupport() {\n\n\t\tif ( ! this.isSupported ) {\n\n\t\t\tthis.isSupported = new Promise( function ( resolve ) {\n\n\t\t\t\tconst image = new Image();\n\n\t\t\t\t// Lossy test image.\n\t\t\t\timage.src = 'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAABcAAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAEAAAABAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQAMAAAAABNjb2xybmNseAACAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAAB9tZGF0EgAKCBgABogQEDQgMgkQAAAAB8dSLfI=';\n\t\t\t\timage.onload = image.onerror = function () {\n\n\t\t\t\t\tresolve( image.height === 1 );\n\n\t\t\t\t};\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn this.isSupported;\n\n\t}\n\n}\n\n/**\n * meshopt BufferView Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_meshopt_compression\n */\nclass GLTFMeshoptCompression {\n\n\tconstructor( parser ) {\n\n\t\tthis.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION;\n\t\tthis.parser = parser;\n\n\t}\n\n\tloadBufferView( index ) {\n\n\t\tconst json = this.parser.json;\n\t\tconst bufferView = json.bufferViews[ index ];\n\n\t\tif ( bufferView.extensions && bufferView.extensions[ this.name ] ) {\n\n\t\t\tconst extensionDef = bufferView.extensions[ this.name ];\n\n\t\t\tconst buffer = this.parser.getDependency( 'buffer', extensionDef.buffer );\n\t\t\tconst decoder = this.parser.options.meshoptDecoder;\n\n\t\t\tif ( ! decoder || ! decoder.supported ) {\n\n\t\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Assumes that the extension is optional and that fallback buffer data is present\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn buffer.then( function ( res ) {\n\n\t\t\t\tconst byteOffset = extensionDef.byteOffset || 0;\n\t\t\t\tconst byteLength = extensionDef.byteLength || 0;\n\n\t\t\t\tconst count = extensionDef.count;\n\t\t\t\tconst stride = extensionDef.byteStride;\n\n\t\t\t\tconst source = new Uint8Array( res, byteOffset, byteLength );\n\n\t\t\t\tif ( decoder.decodeGltfBufferAsync ) {\n\n\t\t\t\t\treturn decoder.decodeGltfBufferAsync( count, stride, source, extensionDef.mode, extensionDef.filter ).then( function ( res ) {\n\n\t\t\t\t\t\treturn res.buffer;\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Support for MeshoptDecoder 0.18 or earlier, without decodeGltfBufferAsync\n\t\t\t\t\treturn decoder.ready.then( function () {\n\n\t\t\t\t\t\tconst result = new ArrayBuffer( count * stride );\n\t\t\t\t\t\tdecoder.decodeGltfBuffer( new Uint8Array( result ), count, stride, source, extensionDef.mode, extensionDef.filter );\n\t\t\t\t\t\treturn result;\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * GPU Instancing Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_mesh_gpu_instancing\n *\n */\nclass GLTFMeshGpuInstancing {\n\n\tconstructor( parser ) {\n\n\t\tthis.name = EXTENSIONS.EXT_MESH_GPU_INSTANCING;\n\t\tthis.parser = parser;\n\n\t}\n\n\tcreateNodeMesh( nodeIndex ) {\n\n\t\tconst json = this.parser.json;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tif ( ! nodeDef.extensions || ! nodeDef.extensions[ this.name ] ||\n\t\t\tnodeDef.mesh === undefined ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst meshDef = json.meshes[ nodeDef.mesh ];\n\n\t\t// No Points or Lines + Instancing support yet\n\n\t\tfor ( const primitive of meshDef.primitives ) {\n\n\t\t\tif ( primitive.mode !== WEBGL_CONSTANTS.TRIANGLES &&\n\t\t\t\t primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_STRIP &&\n\t\t\t\t primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_FAN &&\n\t\t\t\t primitive.mode !== undefined ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst extensionDef = nodeDef.extensions[ this.name ];\n\t\tconst attributesDef = extensionDef.attributes;\n\n\t\t// @TODO: Can we support InstancedMesh + SkinnedMesh?\n\n\t\tconst pending = [];\n\t\tconst attributes = {};\n\n\t\tfor ( const key in attributesDef ) {\n\n\t\t\tpending.push( this.parser.getDependency( 'accessor', attributesDef[ key ] ).then( accessor => {\n\n\t\t\t\tattributes[ key ] = accessor;\n\t\t\t\treturn attributes[ key ];\n\n\t\t\t} ) );\n\n\t\t}\n\n\t\tif ( pending.length < 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tpending.push( this.parser.createNodeMesh( nodeIndex ) );\n\n\t\treturn Promise.all( pending ).then( results => {\n\n\t\t\tconst nodeObject = results.pop();\n\t\t\tconst meshes = nodeObject.isGroup ? nodeObject.children : [ nodeObject ];\n\t\t\tconst count = results[ 0 ].count; // All attribute counts should be same\n\t\t\tconst instancedMeshes = [];\n\n\t\t\tfor ( const mesh of meshes ) {\n\n\t\t\t\t// Temporal variables\n\t\t\t\tconst m = new Matrix4();\n\t\t\t\tconst p = new Vector3();\n\t\t\t\tconst q = new Quaternion();\n\t\t\t\tconst s = new Vector3( 1, 1, 1 );\n\n\t\t\t\tconst instancedMesh = new InstancedMesh( mesh.geometry, mesh.material, count );\n\n\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\tif ( attributes.TRANSLATION ) {\n\n\t\t\t\t\t\tp.fromBufferAttribute( attributes.TRANSLATION, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.ROTATION ) {\n\n\t\t\t\t\t\tq.fromBufferAttribute( attributes.ROTATION, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.SCALE ) {\n\n\t\t\t\t\t\ts.fromBufferAttribute( attributes.SCALE, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tinstancedMesh.setMatrixAt( i, m.compose( p, q, s ) );\n\n\t\t\t\t}\n\n\t\t\t\t// Add instance attributes to the geometry, excluding TRS.\n\t\t\t\tfor ( const attributeName in attributes ) {\n\n\t\t\t\t\tif ( attributeName === '_COLOR_0' ) {\n\n\t\t\t\t\t\tconst attr = attributes[ attributeName ];\n\t\t\t\t\t\tinstancedMesh.instanceColor = new InstancedBufferAttribute( attr.array, attr.itemSize, attr.normalized );\n\n\t\t\t\t\t} else if ( attributeName !== 'TRANSLATION' &&\n\t\t\t\t\t\t attributeName !== 'ROTATION' &&\n\t\t\t\t\t\t attributeName !== 'SCALE' ) {\n\n\t\t\t\t\t\tmesh.geometry.setAttribute( attributeName, attributes[ attributeName ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Just in case\n\t\t\t\tObject3D.prototype.copy.call( instancedMesh, mesh );\n\n\t\t\t\tthis.parser.assignFinalMaterial( instancedMesh );\n\n\t\t\t\tinstancedMeshes.push( instancedMesh );\n\n\t\t\t}\n\n\t\t\tif ( nodeObject.isGroup ) {\n\n\t\t\t\tnodeObject.clear();\n\n\t\t\t\tnodeObject.add( ... instancedMeshes );\n\n\t\t\t\treturn nodeObject;\n\n\t\t\t}\n\n\t\t\treturn instancedMeshes[ 0 ];\n\n\t\t} );\n\n\t}\n\n}\n\n/* BINARY EXTENSION */\nconst BINARY_EXTENSION_HEADER_MAGIC = 'glTF';\nconst BINARY_EXTENSION_HEADER_LENGTH = 12;\nconst BINARY_EXTENSION_CHUNK_TYPES = { JSON: 0x4E4F534A, BIN: 0x004E4942 };\n\nclass GLTFBinaryExtension {\n\n\tconstructor( data ) {\n\n\t\tthis.name = EXTENSIONS.KHR_BINARY_GLTF;\n\t\tthis.content = null;\n\t\tthis.body = null;\n\n\t\tconst headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tconst textDecoder = new TextDecoder();\n\n\t\tthis.header = {\n\t\t\tmagic: textDecoder.decode( new Uint8Array( data.slice( 0, 4 ) ) ),\n\t\t\tversion: headerView.getUint32( 4, true ),\n\t\t\tlength: headerView.getUint32( 8, true )\n\t\t};\n\n\t\tif ( this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported glTF-Binary header.' );\n\n\t\t} else if ( this.header.version < 2.0 ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Legacy binary file detected.' );\n\n\t\t}\n\n\t\tconst chunkContentsLength = this.header.length - BINARY_EXTENSION_HEADER_LENGTH;\n\t\tconst chunkView = new DataView( data, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tlet chunkIndex = 0;\n\n\t\twhile ( chunkIndex < chunkContentsLength ) {\n\n\t\t\tconst chunkLength = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tconst chunkType = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tif ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON ) {\n\n\t\t\t\tconst contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength );\n\t\t\t\tthis.content = textDecoder.decode( contentArray );\n\n\t\t\t} else if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN ) {\n\n\t\t\t\tconst byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex;\n\t\t\t\tthis.body = data.slice( byteOffset, byteOffset + chunkLength );\n\n\t\t\t}\n\n\t\t\t// Clients must ignore chunks with unknown types.\n\n\t\t\tchunkIndex += chunkLength;\n\n\t\t}\n\n\t\tif ( this.content === null ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: JSON content not found.' );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * DRACO Mesh Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression\n */\nclass GLTFDracoMeshCompressionExtension {\n\n\tconstructor( json, dracoLoader ) {\n\n\t\tif ( ! dracoLoader ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: No DRACOLoader instance provided.' );\n\n\t\t}\n\n\t\tthis.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION;\n\t\tthis.json = json;\n\t\tthis.dracoLoader = dracoLoader;\n\t\tthis.dracoLoader.preload();\n\n\t}\n\n\tdecodePrimitive( primitive, parser ) {\n\n\t\tconst json = this.json;\n\t\tconst dracoLoader = this.dracoLoader;\n\t\tconst bufferViewIndex = primitive.extensions[ this.name ].bufferView;\n\t\tconst gltfAttributeMap = primitive.extensions[ this.name ].attributes;\n\t\tconst threeAttributeMap = {};\n\t\tconst attributeNormalizedMap = {};\n\t\tconst attributeTypeMap = {};\n\n\t\tfor ( const attributeName in gltfAttributeMap ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tthreeAttributeMap[ threeAttributeName ] = gltfAttributeMap[ attributeName ];\n\n\t\t}\n\n\t\tfor ( const attributeName in primitive.attributes ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tif ( gltfAttributeMap[ attributeName ] !== undefined ) {\n\n\t\t\t\tconst accessorDef = json.accessors[ primitive.attributes[ attributeName ] ];\n\t\t\t\tconst componentType = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t\tattributeTypeMap[ threeAttributeName ] = componentType.name;\n\t\t\t\tattributeNormalizedMap[ threeAttributeName ] = accessorDef.normalized === true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) {\n\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tdracoLoader.decodeDracoFile( bufferView, function ( geometry ) {\n\n\t\t\t\t\tfor ( const attributeName in geometry.attributes ) {\n\n\t\t\t\t\t\tconst attribute = geometry.attributes[ attributeName ];\n\t\t\t\t\t\tconst normalized = attributeNormalizedMap[ attributeName ];\n\n\t\t\t\t\t\tif ( normalized !== undefined ) attribute.normalized = normalized;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve( geometry );\n\n\t\t\t\t}, threeAttributeMap, attributeTypeMap, LinearSRGBColorSpace, reject );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Texture Transform Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform\n */\nclass GLTFTextureTransformExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM;\n\n\t}\n\n\textendTexture( texture, transform ) {\n\n\t\tif ( ( transform.texCoord === undefined || transform.texCoord === texture.channel )\n\t\t\t&& transform.offset === undefined\n\t\t\t&& transform.rotation === undefined\n\t\t\t&& transform.scale === undefined ) {\n\n\t\t\t// See https://github.com/mrdoob/three.js/issues/21819.\n\t\t\treturn texture;\n\n\t\t}\n\n\t\ttexture = texture.clone();\n\n\t\tif ( transform.texCoord !== undefined ) {\n\n\t\t\ttexture.channel = transform.texCoord;\n\n\t\t}\n\n\t\tif ( transform.offset !== undefined ) {\n\n\t\t\ttexture.offset.fromArray( transform.offset );\n\n\t\t}\n\n\t\tif ( transform.rotation !== undefined ) {\n\n\t\t\ttexture.rotation = transform.rotation;\n\n\t\t}\n\n\t\tif ( transform.scale !== undefined ) {\n\n\t\t\ttexture.repeat.fromArray( transform.scale );\n\n\t\t}\n\n\t\ttexture.needsUpdate = true;\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Mesh Quantization Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization\n */\nclass GLTFMeshQuantizationExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MESH_QUANTIZATION;\n\n\t}\n\n}\n\n/*********************************/\n/********** INTERPOLATION ********/\n/*********************************/\n\n// Spline Interpolation\n// Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation\nclass GLTFCubicSplineInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tcopySampleValue_( index ) {\n\n\t\t// Copies a sample value to the result buffer. See description of glTF\n\t\t// CUBICSPLINE values layout in interpolate_() function below.\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tvalueSize = this.valueSize,\n\t\t\toffset = index * valueSize * 3 + valueSize;\n\n\t\tfor ( let i = 0; i !== valueSize; i ++ ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer;\n\t\tconst values = this.sampleValues;\n\t\tconst stride = this.valueSize;\n\n\t\tconst stride2 = stride * 2;\n\t\tconst stride3 = stride * 3;\n\n\t\tconst td = t1 - t0;\n\n\t\tconst p = ( t - t0 ) / td;\n\t\tconst pp = p * p;\n\t\tconst ppp = pp * p;\n\n\t\tconst offset1 = i1 * stride3;\n\t\tconst offset0 = offset1 - stride3;\n\n\t\tconst s2 = - 2 * ppp + 3 * pp;\n\t\tconst s3 = ppp - pp;\n\t\tconst s0 = 1 - s2;\n\t\tconst s1 = s3 - pp + p;\n\n\t\t// Layout of keyframe output values for CUBICSPLINE animations:\n\t\t// [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ]\n\t\tfor ( let i = 0; i !== stride; i ++ ) {\n\n\t\t\tconst p0 = values[ offset0 + i + stride ]; // splineVertex_k\n\t\t\tconst m0 = values[ offset0 + i + stride2 ] * td; // outTangent_k * (t_k+1 - t_k)\n\t\t\tconst p1 = values[ offset1 + i + stride ]; // splineVertex_k+1\n\t\t\tconst m1 = values[ offset1 + i ] * td; // inTangent_k+1 * (t_k+1 - t_k)\n\n\t\t\tresult[ i ] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\nconst _q = new Quaternion();\n\nclass GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant {\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = super.interpolate_( i1, t0, t, t1 );\n\n\t\t_q.fromArray( result ).normalize().toArray( result );\n\n\t\treturn result;\n\n\t}\n\n}\n\n\n/*********************************/\n/********** INTERNALS ************/\n/*********************************/\n\n/* CONSTANTS */\n\nconst WEBGL_CONSTANTS = {\n\tFLOAT: 5126,\n\t//FLOAT_MAT2: 35674,\n\tFLOAT_MAT3: 35675,\n\tFLOAT_MAT4: 35676,\n\tFLOAT_VEC2: 35664,\n\tFLOAT_VEC3: 35665,\n\tFLOAT_VEC4: 35666,\n\tLINEAR: 9729,\n\tREPEAT: 10497,\n\tSAMPLER_2D: 35678,\n\tPOINTS: 0,\n\tLINES: 1,\n\tLINE_LOOP: 2,\n\tLINE_STRIP: 3,\n\tTRIANGLES: 4,\n\tTRIANGLE_STRIP: 5,\n\tTRIANGLE_FAN: 6,\n\tUNSIGNED_BYTE: 5121,\n\tUNSIGNED_SHORT: 5123\n};\n\nconst WEBGL_COMPONENT_TYPES = {\n\t5120: Int8Array,\n\t5121: Uint8Array,\n\t5122: Int16Array,\n\t5123: Uint16Array,\n\t5125: Uint32Array,\n\t5126: Float32Array\n};\n\nconst WEBGL_FILTERS = {\n\t9728: NearestFilter,\n\t9729: LinearFilter,\n\t9984: NearestMipmapNearestFilter,\n\t9985: LinearMipmapNearestFilter,\n\t9986: NearestMipmapLinearFilter,\n\t9987: LinearMipmapLinearFilter\n};\n\nconst WEBGL_WRAPPINGS = {\n\t33071: ClampToEdgeWrapping,\n\t33648: MirroredRepeatWrapping,\n\t10497: RepeatWrapping\n};\n\nconst WEBGL_TYPE_SIZES = {\n\t'SCALAR': 1,\n\t'VEC2': 2,\n\t'VEC3': 3,\n\t'VEC4': 4,\n\t'MAT2': 4,\n\t'MAT3': 9,\n\t'MAT4': 16\n};\n\nconst ATTRIBUTES = {\n\tPOSITION: 'position',\n\tNORMAL: 'normal',\n\tTANGENT: 'tangent',\n\tTEXCOORD_0: 'uv',\n\tTEXCOORD_1: 'uv1',\n\tTEXCOORD_2: 'uv2',\n\tTEXCOORD_3: 'uv3',\n\tCOLOR_0: 'color',\n\tWEIGHTS_0: 'skinWeight',\n\tJOINTS_0: 'skinIndex',\n};\n\nconst PATH_PROPERTIES = {\n\tscale: 'scale',\n\ttranslation: 'position',\n\trotation: 'quaternion',\n\tweights: 'morphTargetInfluences'\n};\n\nconst INTERPOLATION = {\n\tCUBICSPLINE: undefined, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each\n\t\t // keyframe track will be initialized with a default interpolation type, then modified.\n\tLINEAR: InterpolateLinear,\n\tSTEP: InterpolateDiscrete\n};\n\nconst ALPHA_MODES = {\n\tOPAQUE: 'OPAQUE',\n\tMASK: 'MASK',\n\tBLEND: 'BLEND'\n};\n\n/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material\n */\nfunction createDefaultMaterial( cache ) {\n\n\tif ( cache[ 'DefaultMaterial' ] === undefined ) {\n\n\t\tcache[ 'DefaultMaterial' ] = new MeshStandardMaterial( {\n\t\t\tcolor: 0xFFFFFF,\n\t\t\temissive: 0x000000,\n\t\t\tmetalness: 1,\n\t\t\troughness: 1,\n\t\t\ttransparent: false,\n\t\t\tdepthTest: true,\n\t\t\tside: FrontSide\n\t\t} );\n\n\t}\n\n\treturn cache[ 'DefaultMaterial' ];\n\n}\n\nfunction addUnknownExtensionsToUserData( knownExtensions, object, objectDef ) {\n\n\t// Add unknown glTF extensions to an object's userData.\n\n\tfor ( const name in objectDef.extensions ) {\n\n\t\tif ( knownExtensions[ name ] === undefined ) {\n\n\t\t\tobject.userData.gltfExtensions = object.userData.gltfExtensions || {};\n\t\t\tobject.userData.gltfExtensions[ name ] = objectDef.extensions[ name ];\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @param {Object3D|Material|BufferGeometry} object\n * @param {GLTF.definition} gltfDef\n */\nfunction assignExtrasToUserData( object, gltfDef ) {\n\n\tif ( gltfDef.extras !== undefined ) {\n\n\t\tif ( typeof gltfDef.extras === 'object' ) {\n\n\t\t\tObject.assign( object.userData, gltfDef.extras );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets\n *\n * @param {BufferGeometry} geometry\n * @param {Array<GLTF.Target>} targets\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\nfunction addMorphTargets( geometry, targets, parser ) {\n\n\tlet hasMorphPosition = false;\n\tlet hasMorphNormal = false;\n\tlet hasMorphColor = false;\n\n\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\tconst target = targets[ i ];\n\n\t\tif ( target.POSITION !== undefined ) hasMorphPosition = true;\n\t\tif ( target.NORMAL !== undefined ) hasMorphNormal = true;\n\t\tif ( target.COLOR_0 !== undefined ) hasMorphColor = true;\n\n\t\tif ( hasMorphPosition && hasMorphNormal && hasMorphColor ) break;\n\n\t}\n\n\tif ( ! hasMorphPosition && ! hasMorphNormal && ! hasMorphColor ) return Promise.resolve( geometry );\n\n\tconst pendingPositionAccessors = [];\n\tconst pendingNormalAccessors = [];\n\tconst pendingColorAccessors = [];\n\n\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\tconst target = targets[ i ];\n\n\t\tif ( hasMorphPosition ) {\n\n\t\t\tconst pendingAccessor = target.POSITION !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.POSITION )\n\t\t\t\t: geometry.attributes.position;\n\n\t\t\tpendingPositionAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t\tif ( hasMorphNormal ) {\n\n\t\t\tconst pendingAccessor = target.NORMAL !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.NORMAL )\n\t\t\t\t: geometry.attributes.normal;\n\n\t\t\tpendingNormalAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t\tif ( hasMorphColor ) {\n\n\t\t\tconst pendingAccessor = target.COLOR_0 !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.COLOR_0 )\n\t\t\t\t: geometry.attributes.color;\n\n\t\t\tpendingColorAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t}\n\n\treturn Promise.all( [\n\t\tPromise.all( pendingPositionAccessors ),\n\t\tPromise.all( pendingNormalAccessors ),\n\t\tPromise.all( pendingColorAccessors )\n\t] ).then( function ( accessors ) {\n\n\t\tconst morphPositions = accessors[ 0 ];\n\t\tconst morphNormals = accessors[ 1 ];\n\t\tconst morphColors = accessors[ 2 ];\n\n\t\tif ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions;\n\t\tif ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals;\n\t\tif ( hasMorphColor ) geometry.morphAttributes.color = morphColors;\n\t\tgeometry.morphTargetsRelative = true;\n\n\t\treturn geometry;\n\n\t} );\n\n}\n\n/**\n * @param {Mesh} mesh\n * @param {GLTF.Mesh} meshDef\n */\nfunction updateMorphTargets( mesh, meshDef ) {\n\n\tmesh.updateMorphTargets();\n\n\tif ( meshDef.weights !== undefined ) {\n\n\t\tfor ( let i = 0, il = meshDef.weights.length; i < il; i ++ ) {\n\n\t\t\tmesh.morphTargetInfluences[ i ] = meshDef.weights[ i ];\n\n\t\t}\n\n\t}\n\n\t// .extras has user-defined data, so check that .extras.targetNames is an array.\n\tif ( meshDef.extras && Array.isArray( meshDef.extras.targetNames ) ) {\n\n\t\tconst targetNames = meshDef.extras.targetNames;\n\n\t\tif ( mesh.morphTargetInfluences.length === targetNames.length ) {\n\n\t\t\tmesh.morphTargetDictionary = {};\n\n\t\t\tfor ( let i = 0, il = targetNames.length; i < il; i ++ ) {\n\n\t\t\t\tmesh.morphTargetDictionary[ targetNames[ i ] ] = i;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.' );\n\n\t\t}\n\n\t}\n\n}\n\nfunction createPrimitiveKey( primitiveDef ) {\n\n\tlet geometryKey;\n\n\tconst dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ];\n\n\tif ( dracoExtension ) {\n\n\t\tgeometryKey = 'draco:' + dracoExtension.bufferView\n\t\t\t\t+ ':' + dracoExtension.indices\n\t\t\t\t+ ':' + createAttributesKey( dracoExtension.attributes );\n\n\t} else {\n\n\t\tgeometryKey = primitiveDef.indices + ':' + createAttributesKey( primitiveDef.attributes ) + ':' + primitiveDef.mode;\n\n\t}\n\n\tif ( primitiveDef.targets !== undefined ) {\n\n\t\tfor ( let i = 0, il = primitiveDef.targets.length; i < il; i ++ ) {\n\n\t\t\tgeometryKey += ':' + createAttributesKey( primitiveDef.targets[ i ] );\n\n\t\t}\n\n\t}\n\n\treturn geometryKey;\n\n}\n\nfunction createAttributesKey( attributes ) {\n\n\tlet attributesKey = '';\n\n\tconst keys = Object.keys( attributes ).sort();\n\n\tfor ( let i = 0, il = keys.length; i < il; i ++ ) {\n\n\t\tattributesKey += keys[ i ] + ':' + attributes[ keys[ i ] ] + ';';\n\n\t}\n\n\treturn attributesKey;\n\n}\n\nfunction getNormalizedComponentScale( constructor ) {\n\n\t// Reference:\n\t// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization#encoding-quantized-data\n\n\tswitch ( constructor ) {\n\n\t\tcase Int8Array:\n\t\t\treturn 1 / 127;\n\n\t\tcase Uint8Array:\n\t\t\treturn 1 / 255;\n\n\t\tcase Int16Array:\n\t\t\treturn 1 / 32767;\n\n\t\tcase Uint16Array:\n\t\t\treturn 1 / 65535;\n\n\t\tdefault:\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported normalized accessor component type.' );\n\n\t}\n\n}\n\nfunction getImageURIMimeType( uri ) {\n\n\tif ( uri.search( /\\.jpe?g($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/jpeg/ ) === 0 ) return 'image/jpeg';\n\tif ( uri.search( /\\.webp($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/webp/ ) === 0 ) return 'image/webp';\n\tif ( uri.search( /\\.ktx2($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/ktx2/ ) === 0 ) return 'image/ktx2';\n\n\treturn 'image/png';\n\n}\n\nconst _identityMatrix = new Matrix4();\n\n/* GLTF PARSER */\n\nclass GLTFParser {\n\n\tconstructor( json = {}, options = {} ) {\n\n\t\tthis.json = json;\n\t\tthis.extensions = {};\n\t\tthis.plugins = {};\n\t\tthis.options = options;\n\n\t\t// loader object cache\n\t\tthis.cache = new GLTFRegistry();\n\n\t\t// associations between Three.js objects and glTF elements\n\t\tthis.associations = new Map();\n\n\t\t// BufferGeometry caching\n\t\tthis.primitiveCache = {};\n\n\t\t// Node cache\n\t\tthis.nodeCache = {};\n\n\t\t// Object3D instance caches\n\t\tthis.meshCache = { refs: {}, uses: {} };\n\t\tthis.cameraCache = { refs: {}, uses: {} };\n\t\tthis.lightCache = { refs: {}, uses: {} };\n\n\t\tthis.sourceCache = {};\n\t\tthis.textureCache = {};\n\n\t\t// Track node names, to ensure no duplicates\n\t\tthis.nodeNamesUsed = {};\n\n\t\t// Use an ImageBitmapLoader if imageBitmaps are supported. Moves much of the\n\t\t// expensive work of uploading a texture to the GPU off the main thread.\n\n\t\tlet isSafari = false;\n\t\tlet safariVersion = - 1;\n\t\tlet isFirefox = false;\n\t\tlet firefoxVersion = - 1;\n\n\t\tif ( typeof navigator !== 'undefined' ) {\n\n\t\t\tconst userAgent = navigator.userAgent;\n\n\t\t\tisSafari = /^((?!chrome|android).)*safari/i.test( userAgent ) === true;\n\t\t\tconst safariMatch = userAgent.match( /Version\\/(\\d+)/ );\n\t\t\tsafariVersion = isSafari && safariMatch ? parseInt( safariMatch[ 1 ], 10 ) : - 1;\n\n\t\t\tisFirefox = userAgent.indexOf( 'Firefox' ) > - 1;\n\t\t\tfirefoxVersion = isFirefox ? userAgent.match( /Firefox\\/([0-9]+)\\./ )[ 1 ] : - 1;\n\n\t\t}\n\n\t\tif ( typeof createImageBitmap === 'undefined' || ( isSafari && safariVersion < 17 ) || ( isFirefox && firefoxVersion < 98 ) ) {\n\n\t\t\tthis.textureLoader = new TextureLoader( this.options.manager );\n\n\t\t} else {\n\n\t\t\tthis.textureLoader = new ImageBitmapLoader( this.options.manager );\n\n\t\t}\n\n\t\tthis.textureLoader.setCrossOrigin( this.options.crossOrigin );\n\t\tthis.textureLoader.setRequestHeader( this.options.requestHeader );\n\n\t\tthis.fileLoader = new FileLoader( this.options.manager );\n\t\tthis.fileLoader.setResponseType( 'arraybuffer' );\n\n\t\tif ( this.options.crossOrigin === 'use-credentials' ) {\n\n\t\t\tthis.fileLoader.setWithCredentials( true );\n\n\t\t}\n\n\t}\n\n\tsetExtensions( extensions ) {\n\n\t\tthis.extensions = extensions;\n\n\t}\n\n\tsetPlugins( plugins ) {\n\n\t\tthis.plugins = plugins;\n\n\t}\n\n\tparse( onLoad, onError ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\n\t\t// Clear the loader cache\n\t\tthis.cache.removeAll();\n\t\tthis.nodeCache = {};\n\n\t\t// Mark the special nodes/meshes in json for efficient parse\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\treturn ext._markDefs && ext._markDefs();\n\n\t\t} );\n\n\t\tPromise.all( this._invokeAll( function ( ext ) {\n\n\t\t\treturn ext.beforeRoot && ext.beforeRoot();\n\n\t\t} ) ).then( function () {\n\n\t\t\treturn Promise.all( [\n\n\t\t\t\tparser.getDependencies( 'scene' ),\n\t\t\t\tparser.getDependencies( 'animation' ),\n\t\t\t\tparser.getDependencies( 'camera' ),\n\n\t\t\t] );\n\n\t\t} ).then( function ( dependencies ) {\n\n\t\t\tconst result = {\n\t\t\t\tscene: dependencies[ 0 ][ json.scene || 0 ],\n\t\t\t\tscenes: dependencies[ 0 ],\n\t\t\t\tanimations: dependencies[ 1 ],\n\t\t\t\tcameras: dependencies[ 2 ],\n\t\t\t\tasset: json.asset,\n\t\t\t\tparser: parser,\n\t\t\t\tuserData: {}\n\t\t\t};\n\n\t\t\taddUnknownExtensionsToUserData( extensions, result, json );\n\n\t\t\tassignExtrasToUserData( result, json );\n\n\t\t\treturn Promise.all( parser._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.afterRoot && ext.afterRoot( result );\n\n\t\t\t} ) ).then( function () {\n\n\t\t\t\tfor ( const scene of result.scenes ) {\n\n\t\t\t\t\tscene.updateMatrixWorld();\n\n\t\t\t\t}\n\n\t\t\t\tonLoad( result );\n\n\t\t\t} );\n\n\t\t} ).catch( onError );\n\n\t}\n\n\t/**\n\t * Marks the special nodes/meshes in json for efficient parse.\n\t */\n\t_markDefs() {\n\n\t\tconst nodeDefs = this.json.nodes || [];\n\t\tconst skinDefs = this.json.skins || [];\n\t\tconst meshDefs = this.json.meshes || [];\n\n\t\t// Nothing in the node definition indicates whether it is a Bone or an\n\t\t// Object3D. Use the skins' joint references to mark bones.\n\t\tfor ( let skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex ++ ) {\n\n\t\t\tconst joints = skinDefs[ skinIndex ].joints;\n\n\t\t\tfor ( let i = 0, il = joints.length; i < il; i ++ ) {\n\n\t\t\t\tnodeDefs[ joints[ i ] ].isBone = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Iterate over all nodes, marking references to shared resources,\n\t\t// as well as skeleton joints.\n\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.mesh !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.meshCache, nodeDef.mesh );\n\n\t\t\t\t// Nothing in the mesh definition indicates whether it is\n\t\t\t\t// a SkinnedMesh or Mesh. Use the node's mesh reference\n\t\t\t\t// to mark SkinnedMesh if node has skin.\n\t\t\t\tif ( nodeDef.skin !== undefined ) {\n\n\t\t\t\t\tmeshDefs[ nodeDef.mesh ].isSkinnedMesh = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.cameraCache, nodeDef.camera );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Counts references to shared node / Object3D resources. These resources\n\t * can be reused, or \"instantiated\", at multiple nodes in the scene\n\t * hierarchy. Mesh, Camera, and Light instances are instantiated and must\n\t * be marked. Non-scenegraph resources (like Materials, Geometries, and\n\t * Textures) can be reused directly and are not marked here.\n\t *\n\t * Example: CesiumMilkTruck sample model reuses \"Wheel\" meshes.\n\t */\n\t_addNodeRef( cache, index ) {\n\n\t\tif ( index === undefined ) return;\n\n\t\tif ( cache.refs[ index ] === undefined ) {\n\n\t\t\tcache.refs[ index ] = cache.uses[ index ] = 0;\n\n\t\t}\n\n\t\tcache.refs[ index ] ++;\n\n\t}\n\n\t/** Returns a reference to a shared resource, cloning it if necessary. */\n\t_getNodeRef( cache, index, object ) {\n\n\t\tif ( cache.refs[ index ] <= 1 ) return object;\n\n\t\tconst ref = object.clone();\n\n\t\t// Propagates mappings to the cloned object, prevents mappings on the\n\t\t// original object from being lost.\n\t\tconst updateMappings = ( original, clone ) => {\n\n\t\t\tconst mappings = this.associations.get( original );\n\t\t\tif ( mappings != null ) {\n\n\t\t\t\tthis.associations.set( clone, mappings );\n\n\t\t\t}\n\n\t\t\tfor ( const [ i, child ] of original.children.entries() ) {\n\n\t\t\t\tupdateMappings( child, clone.children[ i ] );\n\n\t\t\t}\n\n\t\t};\n\n\t\tupdateMappings( object, ref );\n\n\t\tref.name += '_instance_' + ( cache.uses[ index ] ++ );\n\n\t\treturn ref;\n\n\t}\n\n\t_invokeOne( func ) {\n\n\t\tconst extensions = Object.values( this.plugins );\n\t\textensions.push( this );\n\n\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tconst result = func( extensions[ i ] );\n\n\t\t\tif ( result ) return result;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t_invokeAll( func ) {\n\n\t\tconst extensions = Object.values( this.plugins );\n\t\textensions.unshift( this );\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tconst result = func( extensions[ i ] );\n\n\t\t\tif ( result ) pending.push( result );\n\n\t\t}\n\n\t\treturn pending;\n\n\t}\n\n\t/**\n\t * Requests the specified dependency asynchronously, with caching.\n\t * @param {string} type\n\t * @param {number} index\n\t * @return {Promise<Object3D|Material|THREE.Texture|AnimationClip|ArrayBuffer|Object>}\n\t */\n\tgetDependency( type, index ) {\n\n\t\tconst cacheKey = type + ':' + index;\n\t\tlet dependency = this.cache.get( cacheKey );\n\n\t\tif ( ! dependency ) {\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 'scene':\n\t\t\t\t\tdependency = this.loadScene( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'node':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadNode && ext.loadNode( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'mesh':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMesh && ext.loadMesh( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'accessor':\n\t\t\t\t\tdependency = this.loadAccessor( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bufferView':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadBufferView && ext.loadBufferView( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'buffer':\n\t\t\t\t\tdependency = this.loadBuffer( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'material':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMaterial && ext.loadMaterial( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'texture':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadTexture && ext.loadTexture( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'skin':\n\t\t\t\t\tdependency = this.loadSkin( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'animation':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadAnimation && ext.loadAnimation( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'camera':\n\t\t\t\t\tdependency = this.loadCamera( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext != this && ext.getDependency && ext.getDependency( type, index );\n\n\t\t\t\t\t} );\n\n\t\t\t\t\tif ( ! dependency ) {\n\n\t\t\t\t\t\tthrow new Error( 'Unknown type: ' + type );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tthis.cache.add( cacheKey, dependency );\n\n\t\t}\n\n\t\treturn dependency;\n\n\t}\n\n\t/**\n\t * Requests all dependencies of the specified type asynchronously, with caching.\n\t * @param {string} type\n\t * @return {Promise<Array<Object>>}\n\t */\n\tgetDependencies( type ) {\n\n\t\tlet dependencies = this.cache.get( type );\n\n\t\tif ( ! dependencies ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst defs = this.json[ type + ( type === 'mesh' ? 'es' : 's' ) ] || [];\n\n\t\t\tdependencies = Promise.all( defs.map( function ( def, index ) {\n\n\t\t\t\treturn parser.getDependency( type, index );\n\n\t\t\t} ) );\n\n\t\t\tthis.cache.add( type, dependencies );\n\n\t\t}\n\n\t\treturn dependencies;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferIndex\n\t * @return {Promise<ArrayBuffer>}\n\t */\n\tloadBuffer( bufferIndex ) {\n\n\t\tconst bufferDef = this.json.buffers[ bufferIndex ];\n\t\tconst loader = this.fileLoader;\n\n\t\tif ( bufferDef.type && bufferDef.type !== 'arraybuffer' ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.' );\n\n\t\t}\n\n\t\t// If present, GLB container is required to be the first buffer.\n\t\tif ( bufferDef.uri === undefined && bufferIndex === 0 ) {\n\n\t\t\treturn Promise.resolve( this.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body );\n\n\t\t}\n\n\t\tconst options = this.options;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tloader.load( LoaderUtils.resolveURL( bufferDef.uri, options.path ), resolve, undefined, function () {\n\n\t\t\t\treject( new Error( 'THREE.GLTFLoader: Failed to load buffer \"' + bufferDef.uri + '\".' ) );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferViewIndex\n\t * @return {Promise<ArrayBuffer>}\n\t */\n\tloadBufferView( bufferViewIndex ) {\n\n\t\tconst bufferViewDef = this.json.bufferViews[ bufferViewIndex ];\n\n\t\treturn this.getDependency( 'buffer', bufferViewDef.buffer ).then( function ( buffer ) {\n\n\t\t\tconst byteLength = bufferViewDef.byteLength || 0;\n\t\t\tconst byteOffset = bufferViewDef.byteOffset || 0;\n\t\t\treturn buffer.slice( byteOffset, byteOffset + byteLength );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors\n\t * @param {number} accessorIndex\n\t * @return {Promise<BufferAttribute|InterleavedBufferAttribute>}\n\t */\n\tloadAccessor( accessorIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\n\t\tconst accessorDef = this.json.accessors[ accessorIndex ];\n\n\t\tif ( accessorDef.bufferView === undefined && accessorDef.sparse === undefined ) {\n\n\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\t\t\tconst normalized = accessorDef.normalized === true;\n\n\t\t\tconst array = new TypedArray( accessorDef.count * itemSize );\n\t\t\treturn Promise.resolve( new BufferAttribute( array, itemSize, normalized ) );\n\n\t\t}\n\n\t\tconst pendingBufferViews = [];\n\n\t\tif ( accessorDef.bufferView !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.bufferView ) );\n\n\t\t} else {\n\n\t\t\tpendingBufferViews.push( null );\n\n\t\t}\n\n\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.indices.bufferView ) );\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.values.bufferView ) );\n\n\t\t}\n\n\t\treturn Promise.all( pendingBufferViews ).then( function ( bufferViews ) {\n\n\t\t\tconst bufferView = bufferViews[ 0 ];\n\n\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t// For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.\n\t\t\tconst elementBytes = TypedArray.BYTES_PER_ELEMENT;\n\t\t\tconst itemBytes = elementBytes * itemSize;\n\t\t\tconst byteOffset = accessorDef.byteOffset || 0;\n\t\t\tconst byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[ accessorDef.bufferView ].byteStride : undefined;\n\t\t\tconst normalized = accessorDef.normalized === true;\n\t\t\tlet array, bufferAttribute;\n\n\t\t\t// The buffer is not interleaved if the stride is the item size in bytes.\n\t\t\tif ( byteStride && byteStride !== itemBytes ) {\n\n\t\t\t\t// Each \"slice\" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own InterleavedBuffer\n\t\t\t\t// This makes sure that IBA.count reflects accessor.count properly\n\t\t\t\tconst ibSlice = Math.floor( byteOffset / byteStride );\n\t\t\t\tconst ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count;\n\t\t\t\tlet ib = parser.cache.get( ibCacheKey );\n\n\t\t\t\tif ( ! ib ) {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes );\n\n\t\t\t\t\t// Integer parameters to IB/IBA are in array elements, not bytes.\n\t\t\t\t\tib = new InterleavedBuffer( array, byteStride / elementBytes );\n\n\t\t\t\t\tparser.cache.add( ibCacheKey, ib );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( ib, itemSize, ( byteOffset % byteStride ) / elementBytes, normalized );\n\n\t\t\t} else {\n\n\t\t\t\tif ( bufferView === null ) {\n\n\t\t\t\t\tarray = new TypedArray( accessorDef.count * itemSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, byteOffset, accessorDef.count * itemSize );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t\t\t}\n\n\t\t\t// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors\n\t\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\t\tconst itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR;\n\t\t\t\tconst TypedArrayIndices = WEBGL_COMPONENT_TYPES[ accessorDef.sparse.indices.componentType ];\n\n\t\t\t\tconst byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0;\n\t\t\t\tconst byteOffsetValues = accessorDef.sparse.values.byteOffset || 0;\n\n\t\t\t\tconst sparseIndices = new TypedArrayIndices( bufferViews[ 1 ], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices );\n\t\t\t\tconst sparseValues = new TypedArray( bufferViews[ 2 ], byteOffsetValues, accessorDef.sparse.count * itemSize );\n\n\t\t\t\tif ( bufferView !== null ) {\n\n\t\t\t\t\t// Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes.\n\t\t\t\t\tbufferAttribute = new BufferAttribute( bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized );\n\n\t\t\t\t}\n\n\t\t\t\t// Ignore normalized since we copy from sparse\n\t\t\t\tbufferAttribute.normalized = false;\n\n\t\t\t\tfor ( let i = 0, il = sparseIndices.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst index = sparseIndices[ i ];\n\n\t\t\t\t\tbufferAttribute.setX( index, sparseValues[ i * itemSize ] );\n\t\t\t\t\tif ( itemSize >= 2 ) bufferAttribute.setY( index, sparseValues[ i * itemSize + 1 ] );\n\t\t\t\t\tif ( itemSize >= 3 ) bufferAttribute.setZ( index, sparseValues[ i * itemSize + 2 ] );\n\t\t\t\t\tif ( itemSize >= 4 ) bufferAttribute.setW( index, sparseValues[ i * itemSize + 3 ] );\n\t\t\t\t\tif ( itemSize >= 5 ) throw new Error( 'THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.' );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute.normalized = normalized;\n\n\t\t\t}\n\n\t\t\treturn bufferAttribute;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures\n\t * @param {number} textureIndex\n\t * @return {Promise<THREE.Texture|null>}\n\t */\n\tloadTexture( textureIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\t\tconst textureDef = json.textures[ textureIndex ];\n\t\tconst sourceIndex = textureDef.source;\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tlet loader = this.textureLoader;\n\n\t\tif ( sourceDef.uri ) {\n\n\t\t\tconst handler = options.manager.getHandler( sourceDef.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.loadTextureImage( textureIndex, sourceIndex, loader );\n\n\t}\n\n\tloadTextureImage( textureIndex, sourceIndex, loader ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tconst cacheKey = ( sourceDef.uri || sourceDef.bufferView ) + ':' + textureDef.sampler;\n\n\t\tif ( this.textureCache[ cacheKey ] ) {\n\n\t\t\t// See https://github.com/mrdoob/three.js/issues/21559.\n\t\t\treturn this.textureCache[ cacheKey ];\n\n\t\t}\n\n\t\tconst promise = this.loadImageSource( sourceIndex, loader ).then( function ( texture ) {\n\n\t\t\ttexture.flipY = false;\n\n\t\t\ttexture.name = textureDef.name || sourceDef.name || '';\n\n\t\t\tif ( texture.name === '' && typeof sourceDef.uri === 'string' && sourceDef.uri.startsWith( 'data:image/' ) === false ) {\n\n\t\t\t\ttexture.name = sourceDef.uri;\n\n\t\t\t}\n\n\t\t\tconst samplers = json.samplers || {};\n\t\t\tconst sampler = samplers[ textureDef.sampler ] || {};\n\n\t\t\ttexture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || LinearFilter;\n\t\t\ttexture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || LinearMipmapLinearFilter;\n\t\t\ttexture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || RepeatWrapping;\n\t\t\ttexture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || RepeatWrapping;\n\t\t\ttexture.generateMipmaps = ! texture.isCompressedTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter;\n\n\t\t\tparser.associations.set( texture, { textures: textureIndex } );\n\n\t\t\treturn texture;\n\n\t\t} ).catch( function () {\n\n\t\t\treturn null;\n\n\t\t} );\n\n\t\tthis.textureCache[ cacheKey ] = promise;\n\n\t\treturn promise;\n\n\t}\n\n\tloadImageSource( sourceIndex, loader ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\n\t\tif ( this.sourceCache[ sourceIndex ] !== undefined ) {\n\n\t\t\treturn this.sourceCache[ sourceIndex ].then( ( texture ) => texture.clone() );\n\n\t\t}\n\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tconst URL = self.URL || self.webkitURL;\n\n\t\tlet sourceURI = sourceDef.uri || '';\n\t\tlet isObjectURL = false;\n\n\t\tif ( sourceDef.bufferView !== undefined ) {\n\n\t\t\t// Load binary image data from bufferView, if provided.\n\n\t\t\tsourceURI = parser.getDependency( 'bufferView', sourceDef.bufferView ).then( function ( bufferView ) {\n\n\t\t\t\tisObjectURL = true;\n\t\t\t\tconst blob = new Blob( [ bufferView ], { type: sourceDef.mimeType } );\n\t\t\t\tsourceURI = URL.createObjectURL( blob );\n\t\t\t\treturn sourceURI;\n\n\t\t\t} );\n\n\t\t} else if ( sourceDef.uri === undefined ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Image ' + sourceIndex + ' is missing URI and bufferView' );\n\n\t\t}\n\n\t\tconst promise = Promise.resolve( sourceURI ).then( function ( sourceURI ) {\n\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tlet onLoad = resolve;\n\n\t\t\t\tif ( loader.isImageBitmapLoader === true ) {\n\n\t\t\t\t\tonLoad = function ( imageBitmap ) {\n\n\t\t\t\t\t\tconst texture = new Texture( imageBitmap );\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tresolve( texture );\n\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tloader.load( LoaderUtils.resolveURL( sourceURI, options.path ), onLoad, undefined, reject );\n\n\t\t\t} );\n\n\t\t} ).then( function ( texture ) {\n\n\t\t\t// Clean up resources and configure Texture.\n\n\t\t\tif ( isObjectURL === true ) {\n\n\t\t\t\tURL.revokeObjectURL( sourceURI );\n\n\t\t\t}\n\n\t\t\tassignExtrasToUserData( texture, sourceDef );\n\n\t\t\ttexture.userData.mimeType = sourceDef.mimeType || getImageURIMimeType( sourceDef.uri );\n\n\t\t\treturn texture;\n\n\t\t} ).catch( function ( error ) {\n\n\t\t\tconsole.error( 'THREE.GLTFLoader: Couldn\\'t load texture', sourceURI );\n\t\t\tthrow error;\n\n\t\t} );\n\n\t\tthis.sourceCache[ sourceIndex ] = promise;\n\t\treturn promise;\n\n\t}\n\n\t/**\n\t * Asynchronously assigns a texture to the given material parameters.\n\t * @param {Object} materialParams\n\t * @param {string} mapName\n\t * @param {Object} mapDef\n\t * @return {Promise<Texture>}\n\t */\n\tassignTexture( materialParams, mapName, mapDef, colorSpace ) {\n\n\t\tconst parser = this;\n\n\t\treturn this.getDependency( 'texture', mapDef.index ).then( function ( texture ) {\n\n\t\t\tif ( ! texture ) return null;\n\n\t\t\tif ( mapDef.texCoord !== undefined && mapDef.texCoord > 0 ) {\n\n\t\t\t\ttexture = texture.clone();\n\t\t\t\ttexture.channel = mapDef.texCoord;\n\n\t\t\t}\n\n\t\t\tif ( parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] ) {\n\n\t\t\t\tconst transform = mapDef.extensions !== undefined ? mapDef.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] : undefined;\n\n\t\t\t\tif ( transform ) {\n\n\t\t\t\t\tconst gltfReference = parser.associations.get( texture );\n\t\t\t\t\ttexture = parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ].extendTexture( texture, transform );\n\t\t\t\t\tparser.associations.set( texture, gltfReference );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( colorSpace !== undefined ) {\n\n\t\t\t\ttexture.colorSpace = colorSpace;\n\n\t\t\t}\n\n\t\t\tmaterialParams[ mapName ] = texture;\n\n\t\t\treturn texture;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Assigns final material to a Mesh, Line, or Points instance. The instance\n\t * already has a material (generated from the glTF material options alone)\n\t * but reuse of the same glTF material may require multiple threejs materials\n\t * to accommodate different primitive types, defines, etc. New materials will\n\t * be created if necessary, and reused from a cache.\n\t * @param {Object3D} mesh Mesh, Line, or Points instance.\n\t */\n\tassignFinalMaterial( mesh ) {\n\n\t\tconst geometry = mesh.geometry;\n\t\tlet material = mesh.material;\n\n\t\tconst useDerivativeTangents = geometry.attributes.tangent === undefined;\n\t\tconst useVertexColors = geometry.attributes.color !== undefined;\n\t\tconst useFlatShading = geometry.attributes.normal === undefined;\n\n\t\tif ( mesh.isPoints ) {\n\n\t\t\tconst cacheKey = 'PointsMaterial:' + material.uuid;\n\n\t\t\tlet pointsMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! pointsMaterial ) {\n\n\t\t\t\tpointsMaterial = new PointsMaterial();\n\t\t\t\tMaterial.prototype.copy.call( pointsMaterial, material );\n\t\t\t\tpointsMaterial.color.copy( material.color );\n\t\t\t\tpointsMaterial.map = material.map;\n\t\t\t\tpointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px\n\n\t\t\t\tthis.cache.add( cacheKey, pointsMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = pointsMaterial;\n\n\t\t} else if ( mesh.isLine ) {\n\n\t\t\tconst cacheKey = 'LineBasicMaterial:' + material.uuid;\n\n\t\t\tlet lineMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! lineMaterial ) {\n\n\t\t\t\tlineMaterial = new LineBasicMaterial();\n\t\t\t\tMaterial.prototype.copy.call( lineMaterial, material );\n\t\t\t\tlineMaterial.color.copy( material.color );\n\t\t\t\tlineMaterial.map = material.map;\n\n\t\t\t\tthis.cache.add( cacheKey, lineMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = lineMaterial;\n\n\t\t}\n\n\t\t// Clone the material if it will be modified\n\t\tif ( useDerivativeTangents || useVertexColors || useFlatShading ) {\n\n\t\t\tlet cacheKey = 'ClonedMaterial:' + material.uuid + ':';\n\n\t\t\tif ( useDerivativeTangents ) cacheKey += 'derivative-tangents:';\n\t\t\tif ( useVertexColors ) cacheKey += 'vertex-colors:';\n\t\t\tif ( useFlatShading ) cacheKey += 'flat-shading:';\n\n\t\t\tlet cachedMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! cachedMaterial ) {\n\n\t\t\t\tcachedMaterial = material.clone();\n\n\t\t\t\tif ( useVertexColors ) cachedMaterial.vertexColors = true;\n\t\t\t\tif ( useFlatShading ) cachedMaterial.flatShading = true;\n\n\t\t\t\tif ( useDerivativeTangents ) {\n\n\t\t\t\t\t// https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\t\t\t\t\tif ( cachedMaterial.normalScale ) cachedMaterial.normalScale.y *= - 1;\n\t\t\t\t\tif ( cachedMaterial.clearcoatNormalScale ) cachedMaterial.clearcoatNormalScale.y *= - 1;\n\n\t\t\t\t}\n\n\t\t\t\tthis.cache.add( cacheKey, cachedMaterial );\n\n\t\t\t\tthis.associations.set( cachedMaterial, this.associations.get( material ) );\n\n\t\t\t}\n\n\t\t\tmaterial = cachedMaterial;\n\n\t\t}\n\n\t\tmesh.material = material;\n\n\t}\n\n\tgetMaterialType( /* materialIndex */ ) {\n\n\t\treturn MeshStandardMaterial;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials\n\t * @param {number} materialIndex\n\t * @return {Promise<Material>}\n\t */\n\tloadMaterial( materialIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst materialDef = json.materials[ materialIndex ];\n\n\t\tlet materialType;\n\t\tconst materialParams = {};\n\t\tconst materialExtensions = materialDef.extensions || {};\n\n\t\tconst pending = [];\n\n\t\tif ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) {\n\n\t\t\tconst kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ];\n\t\t\tmaterialType = kmuExtension.getMaterialType();\n\t\t\tpending.push( kmuExtension.extendParams( materialParams, materialDef, parser ) );\n\n\t\t} else {\n\n\t\t\t// Specification:\n\t\t\t// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material\n\n\t\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness || {};\n\n\t\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\t\tmaterialParams.opacity = 1.0;\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.setRGB( array[ 0 ], array[ 1 ], array[ 2 ], LinearSRGBColorSpace );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, SRGBColorSpace ) );\n\n\t\t\t}\n\n\t\t\tmaterialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0;\n\t\t\tmaterialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0;\n\n\t\t\tif ( metallicRoughness.metallicRoughnessTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\n\t\t\t}\n\n\t\t\tmaterialType = this._invokeOne( function ( ext ) {\n\n\t\t\t\treturn ext.getMaterialType && ext.getMaterialType( materialIndex );\n\n\t\t\t} );\n\n\t\t\tpending.push( Promise.all( this._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.extendMaterialParams && ext.extendMaterialParams( materialIndex, materialParams );\n\n\t\t\t} ) ) );\n\n\t\t}\n\n\t\tif ( materialDef.doubleSided === true ) {\n\n\t\t\tmaterialParams.side = DoubleSide;\n\n\t\t}\n\n\t\tconst alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE;\n\n\t\tif ( alphaMode === ALPHA_MODES.BLEND ) {\n\n\t\t\tmaterialParams.transparent = true;\n\n\t\t\t// See: https://github.com/mrdoob/three.js/issues/17706\n\t\t\tmaterialParams.depthWrite = false;\n\n\t\t} else {\n\n\t\t\tmaterialParams.transparent = false;\n\n\t\t\tif ( alphaMode === ALPHA_MODES.MASK ) {\n\n\t\t\t\tmaterialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.normalTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'normalMap', materialDef.normalTexture ) );\n\n\t\t\tmaterialParams.normalScale = new Vector2( 1, 1 );\n\n\t\t\tif ( materialDef.normalTexture.scale !== undefined ) {\n\n\t\t\t\tconst scale = materialDef.normalTexture.scale;\n\n\t\t\t\tmaterialParams.normalScale.set( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.occlusionTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'aoMap', materialDef.occlusionTexture ) );\n\n\t\t\tif ( materialDef.occlusionTexture.strength !== undefined ) {\n\n\t\t\t\tmaterialParams.aoMapIntensity = materialDef.occlusionTexture.strength;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.emissiveFactor !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tconst emissiveFactor = materialDef.emissiveFactor;\n\t\t\tmaterialParams.emissive = new Color().setRGB( emissiveFactor[ 0 ], emissiveFactor[ 1 ], emissiveFactor[ 2 ], LinearSRGBColorSpace );\n\n\t\t}\n\n\t\tif ( materialDef.emissiveTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'emissiveMap', materialDef.emissiveTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\tconst material = new materialType( materialParams );\n\n\t\t\tif ( materialDef.name ) material.name = materialDef.name;\n\n\t\t\tassignExtrasToUserData( material, materialDef );\n\n\t\t\tparser.associations.set( material, { materials: materialIndex } );\n\n\t\t\tif ( materialDef.extensions ) addUnknownExtensionsToUserData( extensions, material, materialDef );\n\n\t\t\treturn material;\n\n\t\t} );\n\n\t}\n\n\t/** When Object3D instances are targeted by animation, they need unique names. */\n\tcreateUniqueName( originalName ) {\n\n\t\tconst sanitizedName = PropertyBinding.sanitizeNodeName( originalName || '' );\n\n\t\tif ( sanitizedName in this.nodeNamesUsed ) {\n\n\t\t\treturn sanitizedName + '_' + ( ++ this.nodeNamesUsed[ sanitizedName ] );\n\n\t\t} else {\n\n\t\t\tthis.nodeNamesUsed[ sanitizedName ] = 0;\n\n\t\t\treturn sanitizedName;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry\n\t *\n\t * Creates BufferGeometries from primitives.\n\t *\n\t * @param {Array<GLTF.Primitive>} primitives\n\t * @return {Promise<Array<BufferGeometry>>}\n\t */\n\tloadGeometries( primitives ) {\n\n\t\tconst parser = this;\n\t\tconst extensions = this.extensions;\n\t\tconst cache = this.primitiveCache;\n\n\t\tfunction createDracoPrimitive( primitive ) {\n\n\t\t\treturn extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ]\n\t\t\t\t.decodePrimitive( primitive, parser )\n\t\t\t\t.then( function ( geometry ) {\n\n\t\t\t\t\treturn addPrimitiveAttributes( geometry, primitive, parser );\n\n\t\t\t\t} );\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tconst primitive = primitives[ i ];\n\t\t\tconst cacheKey = createPrimitiveKey( primitive );\n\n\t\t\t// See if we've already created this geometry\n\t\t\tconst cached = cache[ cacheKey ];\n\n\t\t\tif ( cached ) {\n\n\t\t\t\t// Use the cached geometry if it exists\n\t\t\t\tpending.push( cached.promise );\n\n\t\t\t} else {\n\n\t\t\t\tlet geometryPromise;\n\n\t\t\t\tif ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) {\n\n\t\t\t\t\t// Use DRACO geometry if available\n\t\t\t\t\tgeometryPromise = createDracoPrimitive( primitive );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise create a new geometry\n\t\t\t\t\tgeometryPromise = addPrimitiveAttributes( new BufferGeometry(), primitive, parser );\n\n\t\t\t\t}\n\n\t\t\t\t// Cache this geometry\n\t\t\t\tcache[ cacheKey ] = { primitive: primitive, promise: geometryPromise };\n\n\t\t\t\tpending.push( geometryPromise );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes\n\t * @param {number} meshIndex\n\t * @return {Promise<Group|Mesh|SkinnedMesh>}\n\t */\n\tloadMesh( meshIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\n\t\tconst meshDef = json.meshes[ meshIndex ];\n\t\tconst primitives = meshDef.primitives;\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tconst material = primitives[ i ].material === undefined\n\t\t\t\t? createDefaultMaterial( this.cache )\n\t\t\t\t: this.getDependency( 'material', primitives[ i ].material );\n\n\t\t\tpending.push( material );\n\n\t\t}\n\n\t\tpending.push( parser.loadGeometries( primitives ) );\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tconst materials = results.slice( 0, results.length - 1 );\n\t\t\tconst geometries = results[ results.length - 1 ];\n\n\t\t\tconst meshes = [];\n\n\t\t\tfor ( let i = 0, il = geometries.length; i < il; i ++ ) {\n\n\t\t\t\tconst geometry = geometries[ i ];\n\t\t\t\tconst primitive = primitives[ i ];\n\n\t\t\t\t// 1. create Mesh\n\n\t\t\t\tlet mesh;\n\n\t\t\t\tconst material = materials[ i ];\n\n\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLES ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ||\n\t\t\t\t\t\tprimitive.mode === undefined ) {\n\n\t\t\t\t\t// .isSkinnedMesh isn't in glTF spec. See ._markDefs()\n\t\t\t\t\tmesh = meshDef.isSkinnedMesh === true\n\t\t\t\t\t\t? new SkinnedMesh( geometry, material )\n\t\t\t\t\t\t: new Mesh( geometry, material );\n\n\t\t\t\t\tif ( mesh.isSkinnedMesh === true ) {\n\n\t\t\t\t\t\t// normalize skin weights to fix malformed assets (see #15319)\n\t\t\t\t\t\tmesh.normalizeSkinWeights();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleStripDrawMode );\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleFanDrawMode );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) {\n\n\t\t\t\t\tmesh = new LineSegments( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_STRIP ) {\n\n\t\t\t\t\tmesh = new Line( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_LOOP ) {\n\n\t\t\t\t\tmesh = new LineLoop( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.POINTS ) {\n\n\t\t\t\t\tmesh = new Points( geometry, material );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode );\n\n\t\t\t\t}\n\n\t\t\t\tif ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) {\n\n\t\t\t\t\tupdateMorphTargets( mesh, meshDef );\n\n\t\t\t\t}\n\n\t\t\t\tmesh.name = parser.createUniqueName( meshDef.name || ( 'mesh_' + meshIndex ) );\n\n\t\t\t\tassignExtrasToUserData( mesh, meshDef );\n\n\t\t\t\tif ( primitive.extensions ) addUnknownExtensionsToUserData( extensions, mesh, primitive );\n\n\t\t\t\tparser.assignFinalMaterial( mesh );\n\n\t\t\t\tmeshes.push( mesh );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tparser.associations.set( meshes[ i ], {\n\t\t\t\t\tmeshes: meshIndex,\n\t\t\t\t\tprimitives: i\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( meshes.length === 1 ) {\n\n\t\t\t\tif ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, meshes[ 0 ], meshDef );\n\n\t\t\t\treturn meshes[ 0 ];\n\n\t\t\t}\n\n\t\t\tconst group = new Group();\n\n\t\t\tif ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, group, meshDef );\n\n\t\t\tparser.associations.set( group, { meshes: meshIndex } );\n\n\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tgroup.add( meshes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras\n\t * @param {number} cameraIndex\n\t * @return {Promise<THREE.Camera>}\n\t */\n\tloadCamera( cameraIndex ) {\n\n\t\tlet camera;\n\t\tconst cameraDef = this.json.cameras[ cameraIndex ];\n\t\tconst params = cameraDef[ cameraDef.type ];\n\n\t\tif ( ! params ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing camera parameters.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( cameraDef.type === 'perspective' ) {\n\n\t\t\tcamera = new PerspectiveCamera( MathUtils.radToDeg( params.yfov ), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6 );\n\n\t\t} else if ( cameraDef.type === 'orthographic' ) {\n\n\t\t\tcamera = new OrthographicCamera( - params.xmag, params.xmag, params.ymag, - params.ymag, params.znear, params.zfar );\n\n\t\t}\n\n\t\tif ( cameraDef.name ) camera.name = this.createUniqueName( cameraDef.name );\n\n\t\tassignExtrasToUserData( camera, cameraDef );\n\n\t\treturn Promise.resolve( camera );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins\n\t * @param {number} skinIndex\n\t * @return {Promise<Skeleton>}\n\t */\n\tloadSkin( skinIndex ) {\n\n\t\tconst skinDef = this.json.skins[ skinIndex ];\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = skinDef.joints.length; i < il; i ++ ) {\n\n\t\t\tpending.push( this._loadNodeShallow( skinDef.joints[ i ] ) );\n\n\t\t}\n\n\t\tif ( skinDef.inverseBindMatrices !== undefined ) {\n\n\t\t\tpending.push( this.getDependency( 'accessor', skinDef.inverseBindMatrices ) );\n\n\t\t} else {\n\n\t\t\tpending.push( null );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tconst inverseBindMatrices = results.pop();\n\t\t\tconst jointNodes = results;\n\n\t\t\t// Note that bones (joint nodes) may or may not be in the\n\t\t\t// scene graph at this time.\n\n\t\t\tconst bones = [];\n\t\t\tconst boneInverses = [];\n\n\t\t\tfor ( let i = 0, il = jointNodes.length; i < il; i ++ ) {\n\n\t\t\t\tconst jointNode = jointNodes[ i ];\n\n\t\t\t\tif ( jointNode ) {\n\n\t\t\t\t\tbones.push( jointNode );\n\n\t\t\t\t\tconst mat = new Matrix4();\n\n\t\t\t\t\tif ( inverseBindMatrices !== null ) {\n\n\t\t\t\t\t\tmat.fromArray( inverseBindMatrices.array, i * 16 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tboneInverses.push( mat );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Joint \"%s\" could not be found.', skinDef.joints[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new Skeleton( bones, boneInverses );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\n\t * @param {number} animationIndex\n\t * @return {Promise<AnimationClip>}\n\t */\n\tloadAnimation( animationIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\n\t\tconst animationDef = json.animations[ animationIndex ];\n\t\tconst animationName = animationDef.name ? animationDef.name : 'animation_' + animationIndex;\n\n\t\tconst pendingNodes = [];\n\t\tconst pendingInputAccessors = [];\n\t\tconst pendingOutputAccessors = [];\n\t\tconst pendingSamplers = [];\n\t\tconst pendingTargets = [];\n\n\t\tfor ( let i = 0, il = animationDef.channels.length; i < il; i ++ ) {\n\n\t\t\tconst channel = animationDef.channels[ i ];\n\t\t\tconst sampler = animationDef.samplers[ channel.sampler ];\n\t\t\tconst target = channel.target;\n\t\t\tconst name = target.node;\n\t\t\tconst input = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.input ] : sampler.input;\n\t\t\tconst output = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.output ] : sampler.output;\n\n\t\t\tif ( target.node === undefined ) continue;\n\n\t\t\tpendingNodes.push( this.getDependency( 'node', name ) );\n\t\t\tpendingInputAccessors.push( this.getDependency( 'accessor', input ) );\n\t\t\tpendingOutputAccessors.push( this.getDependency( 'accessor', output ) );\n\t\t\tpendingSamplers.push( sampler );\n\t\t\tpendingTargets.push( target );\n\n\t\t}\n\n\t\treturn Promise.all( [\n\n\t\t\tPromise.all( pendingNodes ),\n\t\t\tPromise.all( pendingInputAccessors ),\n\t\t\tPromise.all( pendingOutputAccessors ),\n\t\t\tPromise.all( pendingSamplers ),\n\t\t\tPromise.all( pendingTargets )\n\n\t\t] ).then( function ( dependencies ) {\n\n\t\t\tconst nodes = dependencies[ 0 ];\n\t\t\tconst inputAccessors = dependencies[ 1 ];\n\t\t\tconst outputAccessors = dependencies[ 2 ];\n\t\t\tconst samplers = dependencies[ 3 ];\n\t\t\tconst targets = dependencies[ 4 ];\n\n\t\t\tconst tracks = [];\n\n\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tconst node = nodes[ i ];\n\t\t\t\tconst inputAccessor = inputAccessors[ i ];\n\t\t\t\tconst outputAccessor = outputAccessors[ i ];\n\t\t\t\tconst sampler = samplers[ i ];\n\t\t\t\tconst target = targets[ i ];\n\n\t\t\t\tif ( node === undefined ) continue;\n\n\t\t\t\tif ( node.updateMatrix ) {\n\n\t\t\t\t\tnode.updateMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tconst createdTracks = parser._createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target );\n\n\t\t\t\tif ( createdTracks ) {\n\n\t\t\t\t\tfor ( let k = 0; k < createdTracks.length; k ++ ) {\n\n\t\t\t\t\t\ttracks.push( createdTracks[ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( animationName, undefined, tracks );\n\n\t\t} );\n\n\t}\n\n\tcreateNodeMesh( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tif ( nodeDef.mesh === undefined ) return null;\n\n\t\treturn parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) {\n\n\t\t\tconst node = parser._getNodeRef( parser.meshCache, nodeDef.mesh, mesh );\n\n\t\t\t// if weights are provided on the node, override weights on the mesh.\n\t\t\tif ( nodeDef.weights !== undefined ) {\n\n\t\t\t\tnode.traverse( function ( o ) {\n\n\t\t\t\t\tif ( ! o.isMesh ) return;\n\n\t\t\t\t\tfor ( let i = 0, il = nodeDef.weights.length; i < il; i ++ ) {\n\n\t\t\t\t\t\to.morphTargetInfluences[ i ] = nodeDef.weights[ i ];\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy\n\t * @param {number} nodeIndex\n\t * @return {Promise<Object3D>}\n\t */\n\tloadNode( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tconst nodePending = parser._loadNodeShallow( nodeIndex );\n\n\t\tconst childPending = [];\n\t\tconst childrenDef = nodeDef.children || [];\n\n\t\tfor ( let i = 0, il = childrenDef.length; i < il; i ++ ) {\n\n\t\t\tchildPending.push( parser.getDependency( 'node', childrenDef[ i ] ) );\n\n\t\t}\n\n\t\tconst skeletonPending = nodeDef.skin === undefined\n\t\t\t? Promise.resolve( null )\n\t\t\t: parser.getDependency( 'skin', nodeDef.skin );\n\n\t\treturn Promise.all( [\n\t\t\tnodePending,\n\t\t\tPromise.all( childPending ),\n\t\t\tskeletonPending\n\t\t] ).then( function ( results ) {\n\n\t\t\tconst node = results[ 0 ];\n\t\t\tconst children = results[ 1 ];\n\t\t\tconst skeleton = results[ 2 ];\n\n\t\t\tif ( skeleton !== null ) {\n\n\t\t\t\t// This full traverse should be fine because\n\t\t\t\t// child glTF nodes have not been added to this node yet.\n\t\t\t\tnode.traverse( function ( mesh ) {\n\n\t\t\t\t\tif ( ! mesh.isSkinnedMesh ) return;\n\n\t\t\t\t\tmesh.bind( skeleton, _identityMatrix );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = children.length; i < il; i ++ ) {\n\n\t\t\t\tnode.add( children[ i ] );\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t}\n\n\t// ._loadNodeShallow() parses a single node.\n\t// skin and child nodes are created and added in .loadNode() (no '_' prefix).\n\t_loadNodeShallow( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst parser = this;\n\n\t\t// This method is called from .loadNode() and .loadSkin().\n\t\t// Cache a node to avoid duplication.\n\n\t\tif ( this.nodeCache[ nodeIndex ] !== undefined ) {\n\n\t\t\treturn this.nodeCache[ nodeIndex ];\n\n\t\t}\n\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\t// reserve node's name before its dependencies, so the root has the intended name.\n\t\tconst nodeName = nodeDef.name ? parser.createUniqueName( nodeDef.name ) : '';\n\n\t\tconst pending = [];\n\n\t\tconst meshPromise = parser._invokeOne( function ( ext ) {\n\n\t\t\treturn ext.createNodeMesh && ext.createNodeMesh( nodeIndex );\n\n\t\t} );\n\n\t\tif ( meshPromise ) {\n\n\t\t\tpending.push( meshPromise );\n\n\t\t}\n\n\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\tpending.push( parser.getDependency( 'camera', nodeDef.camera ).then( function ( camera ) {\n\n\t\t\t\treturn parser._getNodeRef( parser.cameraCache, nodeDef.camera, camera );\n\n\t\t\t} ) );\n\n\t\t}\n\n\t\tparser._invokeAll( function ( ext ) {\n\n\t\t\treturn ext.createNodeAttachment && ext.createNodeAttachment( nodeIndex );\n\n\t\t} ).forEach( function ( promise ) {\n\n\t\t\tpending.push( promise );\n\n\t\t} );\n\n\t\tthis.nodeCache[ nodeIndex ] = Promise.all( pending ).then( function ( objects ) {\n\n\t\t\tlet node;\n\n\t\t\t// .isBone isn't in glTF spec. See ._markDefs\n\t\t\tif ( nodeDef.isBone === true ) {\n\n\t\t\t\tnode = new Bone();\n\n\t\t\t} else if ( objects.length > 1 ) {\n\n\t\t\t\tnode = new Group();\n\n\t\t\t} else if ( objects.length === 1 ) {\n\n\t\t\t\tnode = objects[ 0 ];\n\n\t\t\t} else {\n\n\t\t\t\tnode = new Object3D();\n\n\t\t\t}\n\n\t\t\tif ( node !== objects[ 0 ] ) {\n\n\t\t\t\tfor ( let i = 0, il = objects.length; i < il; i ++ ) {\n\n\t\t\t\t\tnode.add( objects[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.name ) {\n\n\t\t\t\tnode.userData.name = nodeDef.name;\n\t\t\t\tnode.name = nodeName;\n\n\t\t\t}\n\n\t\t\tassignExtrasToUserData( node, nodeDef );\n\n\t\t\tif ( nodeDef.extensions ) addUnknownExtensionsToUserData( extensions, node, nodeDef );\n\n\t\t\tif ( nodeDef.matrix !== undefined ) {\n\n\t\t\t\tconst matrix = new Matrix4();\n\t\t\t\tmatrix.fromArray( nodeDef.matrix );\n\t\t\t\tnode.applyMatrix4( matrix );\n\n\t\t\t} else {\n\n\t\t\t\tif ( nodeDef.translation !== undefined ) {\n\n\t\t\t\t\tnode.position.fromArray( nodeDef.translation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.rotation !== undefined ) {\n\n\t\t\t\t\tnode.quaternion.fromArray( nodeDef.rotation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.scale !== undefined ) {\n\n\t\t\t\t\tnode.scale.fromArray( nodeDef.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! parser.associations.has( node ) ) {\n\n\t\t\t\tparser.associations.set( node, {} );\n\n\t\t\t}\n\n\t\t\tparser.associations.get( node ).nodes = nodeIndex;\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t\treturn this.nodeCache[ nodeIndex ];\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes\n\t * @param {number} sceneIndex\n\t * @return {Promise<Group>}\n\t */\n\tloadScene( sceneIndex ) {\n\n\t\tconst extensions = this.extensions;\n\t\tconst sceneDef = this.json.scenes[ sceneIndex ];\n\t\tconst parser = this;\n\n\t\t// Loader returns Group, not Scene.\n\t\t// See: https://github.com/mrdoob/three.js/issues/18342#issuecomment-578981172\n\t\tconst scene = new Group();\n\t\tif ( sceneDef.name ) scene.name = parser.createUniqueName( sceneDef.name );\n\n\t\tassignExtrasToUserData( scene, sceneDef );\n\n\t\tif ( sceneDef.extensions ) addUnknownExtensionsToUserData( extensions, scene, sceneDef );\n\n\t\tconst nodeIds = sceneDef.nodes || [];\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = nodeIds.length; i < il; i ++ ) {\n\n\t\t\tpending.push( parser.getDependency( 'node', nodeIds[ i ] ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function ( nodes ) {\n\n\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tscene.add( nodes[ i ] );\n\n\t\t\t}\n\n\t\t\t// Removes dangling associations, associations that reference a node that\n\t\t\t// didn't make it into the scene.\n\t\t\tconst reduceAssociations = ( node ) => {\n\n\t\t\t\tconst reducedAssociations = new Map();\n\n\t\t\t\tfor ( const [ key, value ] of parser.associations ) {\n\n\t\t\t\t\tif ( key instanceof Material || key instanceof Texture ) {\n\n\t\t\t\t\t\treducedAssociations.set( key, value );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tnode.traverse( ( node ) => {\n\n\t\t\t\t\tconst mappings = parser.associations.get( node );\n\n\t\t\t\t\tif ( mappings != null ) {\n\n\t\t\t\t\t\treducedAssociations.set( node, mappings );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn reducedAssociations;\n\n\t\t\t};\n\n\t\t\tparser.associations = reduceAssociations( scene );\n\n\t\t\treturn scene;\n\n\t\t} );\n\n\t}\n\n\t_createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target ) {\n\n\t\tconst tracks = [];\n\n\t\tconst targetName = node.name ? node.name : node.uuid;\n\t\tconst targetNames = [];\n\n\t\tif ( PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.weights ) {\n\n\t\t\tnode.traverse( function ( object ) {\n\n\t\t\t\tif ( object.morphTargetInfluences ) {\n\n\t\t\t\t\ttargetNames.push( object.name ? object.name : object.uuid );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\ttargetNames.push( targetName );\n\n\t\t}\n\n\t\tlet TypedKeyframeTrack;\n\n\t\tswitch ( PATH_PROPERTIES[ target.path ] ) {\n\n\t\t\tcase PATH_PROPERTIES.weights:\n\n\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tcase PATH_PROPERTIES.rotation:\n\n\t\t\t\tTypedKeyframeTrack = QuaternionKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tcase PATH_PROPERTIES.position:\n\t\t\tcase PATH_PROPERTIES.scale:\n\n\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tswitch ( outputAccessor.itemSize ) {\n\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\tcase 3:\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tconst interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : InterpolateLinear;\n\n\n\t\tconst outputArray = this._getArrayFromAccessor( outputAccessor );\n\n\t\tfor ( let j = 0, jl = targetNames.length; j < jl; j ++ ) {\n\n\t\t\tconst track = new TypedKeyframeTrack(\n\t\t\t\ttargetNames[ j ] + '.' + PATH_PROPERTIES[ target.path ],\n\t\t\t\tinputAccessor.array,\n\t\t\t\toutputArray,\n\t\t\t\tinterpolation\n\t\t\t);\n\n\t\t\t// Override interpolation with custom factory method.\n\t\t\tif ( sampler.interpolation === 'CUBICSPLINE' ) {\n\n\t\t\t\tthis._createCubicSplineTrackInterpolant( track );\n\n\t\t\t}\n\n\t\t\ttracks.push( track );\n\n\t\t}\n\n\t\treturn tracks;\n\n\t}\n\n\t_getArrayFromAccessor( accessor ) {\n\n\t\tlet outputArray = accessor.array;\n\n\t\tif ( accessor.normalized ) {\n\n\t\t\tconst scale = getNormalizedComponentScale( outputArray.constructor );\n\t\t\tconst scaled = new Float32Array( outputArray.length );\n\n\t\t\tfor ( let j = 0, jl = outputArray.length; j < jl; j ++ ) {\n\n\t\t\t\tscaled[ j ] = outputArray[ j ] * scale;\n\n\t\t\t}\n\n\t\t\toutputArray = scaled;\n\n\t\t}\n\n\t\treturn outputArray;\n\n\t}\n\n\t_createCubicSplineTrackInterpolant( track ) {\n\n\t\ttrack.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) {\n\n\t\t\t// A CUBICSPLINE keyframe in glTF has three output values for each input value,\n\t\t\t// representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize()\n\t\t\t// must be divided by three to get the interpolant's sampleSize argument.\n\n\t\t\tconst interpolantType = ( this instanceof QuaternionKeyframeTrack ) ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant;\n\n\t\t\treturn new interpolantType( this.times, this.values, this.getValueSize() / 3, result );\n\n\t\t};\n\n\t\t// Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants.\n\t\ttrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true;\n\n\t}\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n */\nfunction computeBounds( geometry, primitiveDef, parser ) {\n\n\tconst attributes = primitiveDef.attributes;\n\n\tconst box = new Box3();\n\n\tif ( attributes.POSITION !== undefined ) {\n\n\t\tconst accessor = parser.json.accessors[ attributes.POSITION ];\n\n\t\tconst min = accessor.min;\n\t\tconst max = accessor.max;\n\n\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\tbox.set(\n\t\t\t\tnew Vector3( min[ 0 ], min[ 1 ], min[ 2 ] ),\n\t\t\t\tnew Vector3( max[ 0 ], max[ 1 ], max[ 2 ] )\n\t\t\t);\n\n\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\tbox.min.multiplyScalar( boxScale );\n\t\t\t\tbox.max.multiplyScalar( boxScale );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\treturn;\n\n\t\t}\n\n\t} else {\n\n\t\treturn;\n\n\t}\n\n\tconst targets = primitiveDef.targets;\n\n\tif ( targets !== undefined ) {\n\n\t\tconst maxDisplacement = new Vector3();\n\t\tconst vector = new Vector3();\n\n\t\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\tconst target = targets[ i ];\n\n\t\t\tif ( target.POSITION !== undefined ) {\n\n\t\t\t\tconst accessor = parser.json.accessors[ target.POSITION ];\n\t\t\t\tconst min = accessor.min;\n\t\t\t\tconst max = accessor.max;\n\n\t\t\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\t\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\t\t\t// we need to get max of absolute components because target weight is [-1,1]\n\t\t\t\t\tvector.setX( Math.max( Math.abs( min[ 0 ] ), Math.abs( max[ 0 ] ) ) );\n\t\t\t\t\tvector.setY( Math.max( Math.abs( min[ 1 ] ), Math.abs( max[ 1 ] ) ) );\n\t\t\t\t\tvector.setZ( Math.max( Math.abs( min[ 2 ] ), Math.abs( max[ 2 ] ) ) );\n\n\n\t\t\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\t\t\tvector.multiplyScalar( boxScale );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Note: this assumes that the sum of all weights is at most 1. This isn't quite correct - it's more conservative\n\t\t\t\t\t// to assume that each target can have a max weight of 1. However, for some use cases - notably, when morph targets\n\t\t\t\t\t// are used to implement key-frame animations and as such only two are active at a time - this results in very large\n\t\t\t\t\t// boxes. So for now we make a box that's sometimes a touch too small but is hopefully mostly of reasonable size.\n\t\t\t\t\tmaxDisplacement.max( vector );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// As per comment above this box isn't conservative, but has a reasonable size for a very large number of morph targets.\n\t\tbox.expandByVector( maxDisplacement );\n\n\t}\n\n\tgeometry.boundingBox = box;\n\n\tconst sphere = new Sphere();\n\n\tbox.getCenter( sphere.center );\n\tsphere.radius = box.min.distanceTo( box.max ) / 2;\n\n\tgeometry.boundingSphere = sphere;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\nfunction addPrimitiveAttributes( geometry, primitiveDef, parser ) {\n\n\tconst attributes = primitiveDef.attributes;\n\n\tconst pending = [];\n\n\tfunction assignAttributeAccessor( accessorIndex, attributeName ) {\n\n\t\treturn parser.getDependency( 'accessor', accessorIndex )\n\t\t\t.then( function ( accessor ) {\n\n\t\t\t\tgeometry.setAttribute( attributeName, accessor );\n\n\t\t\t} );\n\n\t}\n\n\tfor ( const gltfAttributeName in attributes ) {\n\n\t\tconst threeAttributeName = ATTRIBUTES[ gltfAttributeName ] || gltfAttributeName.toLowerCase();\n\n\t\t// Skip attributes already provided by e.g. Draco extension.\n\t\tif ( threeAttributeName in geometry.attributes ) continue;\n\n\t\tpending.push( assignAttributeAccessor( attributes[ gltfAttributeName ], threeAttributeName ) );\n\n\t}\n\n\tif ( primitiveDef.indices !== undefined && ! geometry.index ) {\n\n\t\tconst accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) {\n\n\t\t\tgeometry.setIndex( accessor );\n\n\t\t} );\n\n\t\tpending.push( accessor );\n\n\t}\n\n\tif ( ColorManagement.workingColorSpace !== LinearSRGBColorSpace && 'COLOR_0' in attributes ) {\n\n\t\tconsole.warn( `THREE.GLTFLoader: Converting vertex colors from \"srgb-linear\" to \"${ColorManagement.workingColorSpace}\" not supported.` );\n\n\t}\n\n\tassignExtrasToUserData( geometry, primitiveDef );\n\n\tcomputeBounds( geometry, primitiveDef, parser );\n\n\treturn Promise.all( pending ).then( function () {\n\n\t\treturn primitiveDef.targets !== undefined\n\t\t\t? addMorphTargets( geometry, primitiveDef.targets, parser )\n\t\t\t: geometry;\n\n\t} );\n\n}\n\nexport { GLTFLoader };\n","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tColor,\n\tColorManagement,\n\tFileLoader,\n\tLoader,\n\tLinearSRGBColorSpace,\n\tSRGBColorSpace\n} from 'three';\n\nconst _taskCache = new WeakMap();\n\nclass DRACOLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.decoderPath = '';\n\t\tthis.decoderConfig = {};\n\t\tthis.decoderBinary = null;\n\t\tthis.decoderPending = null;\n\n\t\tthis.workerLimit = 4;\n\t\tthis.workerPool = [];\n\t\tthis.workerNextTaskID = 1;\n\t\tthis.workerSourceURL = '';\n\n\t\tthis.defaultAttributeIDs = {\n\t\t\tposition: 'POSITION',\n\t\t\tnormal: 'NORMAL',\n\t\t\tcolor: 'COLOR',\n\t\t\tuv: 'TEX_COORD'\n\t\t};\n\t\tthis.defaultAttributeTypes = {\n\t\t\tposition: 'Float32Array',\n\t\t\tnormal: 'Float32Array',\n\t\t\tcolor: 'Float32Array',\n\t\t\tuv: 'Float32Array'\n\t\t};\n\n\t}\n\n\tsetDecoderPath( path ) {\n\n\t\tthis.decoderPath = path;\n\n\t\treturn this;\n\n\t}\n\n\tsetDecoderConfig( config ) {\n\n\t\tthis.decoderConfig = config;\n\n\t\treturn this;\n\n\t}\n\n\tsetWorkerLimit( workerLimit ) {\n\n\t\tthis.workerLimit = workerLimit;\n\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, ( buffer ) => {\n\n\t\t\tthis.parse( buffer, onLoad, onError );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\n\tparse( buffer, onLoad, onError = ()=>{} ) {\n\n\t\tthis.decodeDracoFile( buffer, onLoad, null, null, SRGBColorSpace, onError ).catch( onError );\n\n\t}\n\n\tdecodeDracoFile( buffer, callback, attributeIDs, attributeTypes, vertexColorSpace = LinearSRGBColorSpace, onError = () => {} ) {\n\n\t\tconst taskConfig = {\n\t\t\tattributeIDs: attributeIDs || this.defaultAttributeIDs,\n\t\t\tattributeTypes: attributeTypes || this.defaultAttributeTypes,\n\t\t\tuseUniqueIDs: !! attributeIDs,\n\t\t\tvertexColorSpace: vertexColorSpace,\n\t\t};\n\n\t\treturn this.decodeGeometry( buffer, taskConfig ).then( callback ).catch( onError );\n\n\t}\n\n\tdecodeGeometry( buffer, taskConfig ) {\n\n\t\tconst taskKey = JSON.stringify( taskConfig );\n\n\t\t// Check for an existing task using this buffer. A transferred buffer cannot be transferred\n\t\t// again from this thread.\n\t\tif ( _taskCache.has( buffer ) ) {\n\n\t\t\tconst cachedTask = _taskCache.get( buffer );\n\n\t\t\tif ( cachedTask.key === taskKey ) {\n\n\t\t\t\treturn cachedTask.promise;\n\n\t\t\t} else if ( buffer.byteLength === 0 ) {\n\n\t\t\t\t// Technically, it would be possible to wait for the previous task to complete,\n\t\t\t\t// transfer the buffer back, and decode again with the second configuration. That\n\t\t\t\t// is complex, and I don't know of any reason to decode a Draco buffer twice in\n\t\t\t\t// different ways, so this is left unimplemented.\n\t\t\t\tthrow new Error(\n\n\t\t\t\t\t'THREE.DRACOLoader: Unable to re-decode a buffer with different ' +\n\t\t\t\t\t'settings. Buffer has already been transferred.'\n\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tlet worker;\n\t\tconst taskID = this.workerNextTaskID ++;\n\t\tconst taskCost = buffer.byteLength;\n\n\t\t// Obtain a worker and assign a task, and construct a geometry instance\n\t\t// when the task completes.\n\t\tconst geometryPending = this._getWorker( taskID, taskCost )\n\t\t\t.then( ( _worker ) => {\n\n\t\t\t\tworker = _worker;\n\n\t\t\t\treturn new Promise( ( resolve, reject ) => {\n\n\t\t\t\t\tworker._callbacks[ taskID ] = { resolve, reject };\n\n\t\t\t\t\tworker.postMessage( { type: 'decode', id: taskID, taskConfig, buffer }, [ buffer ] );\n\n\t\t\t\t\t// this.debug();\n\n\t\t\t\t} );\n\n\t\t\t} )\n\t\t\t.then( ( message ) => this._createGeometry( message.geometry ) );\n\n\t\t// Remove task from the task list.\n\t\t// Note: replaced '.finally()' with '.catch().then()' block - iOS 11 support (#19416)\n\t\tgeometryPending\n\t\t\t.catch( () => true )\n\t\t\t.then( () => {\n\n\t\t\t\tif ( worker && taskID ) {\n\n\t\t\t\t\tthis._releaseTask( worker, taskID );\n\n\t\t\t\t\t// this.debug();\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t// Cache the task result.\n\t\t_taskCache.set( buffer, {\n\n\t\t\tkey: taskKey,\n\t\t\tpromise: geometryPending\n\n\t\t} );\n\n\t\treturn geometryPending;\n\n\t}\n\n\t_createGeometry( geometryData ) {\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tif ( geometryData.index ) {\n\n\t\t\tgeometry.setIndex( new BufferAttribute( geometryData.index.array, 1 ) );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < geometryData.attributes.length; i ++ ) {\n\n\t\t\tconst result = geometryData.attributes[ i ];\n\t\t\tconst name = result.name;\n\t\t\tconst array = result.array;\n\t\t\tconst itemSize = result.itemSize;\n\n\t\t\tconst attribute = new BufferAttribute( array, itemSize );\n\n\t\t\tif ( name === 'color' ) {\n\n\t\t\t\tthis._assignVertexColorSpace( attribute, result.vertexColorSpace );\n\n\t\t\t\tattribute.normalized = ( array instanceof Float32Array ) === false;\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( name, attribute );\n\n\t\t}\n\n\t\treturn geometry;\n\n\t}\n\n\t_assignVertexColorSpace( attribute, inputColorSpace ) {\n\n\t\t// While .drc files do not specify colorspace, the only 'official' tooling\n\t\t// is PLY and OBJ converters, which use sRGB. We'll assume sRGB when a .drc\n\t\t// file is passed into .load() or .parse(). GLTFLoader uses internal APIs\n\t\t// to decode geometry, and vertex colors are already Linear-sRGB in there.\n\n\t\tif ( inputColorSpace !== SRGBColorSpace ) return;\n\n\t\tconst _color = new Color();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\t_color.fromBufferAttribute( attribute, i );\n\t\t\tColorManagement.toWorkingColorSpace( _color, SRGBColorSpace );\n\t\t\tattribute.setXYZ( i, _color.r, _color.g, _color.b );\n\n\t\t}\n\n\t}\n\n\t_loadLibrary( url, responseType ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.decoderPath );\n\t\tloader.setResponseType( responseType );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\treturn new Promise( ( resolve, reject ) => {\n\n\t\t\tloader.load( url, resolve, undefined, reject );\n\n\t\t} );\n\n\t}\n\n\tpreload() {\n\n\t\tthis._initDecoder();\n\n\t\treturn this;\n\n\t}\n\n\t_initDecoder() {\n\n\t\tif ( this.decoderPending ) return this.decoderPending;\n\n\t\tconst useJS = typeof WebAssembly !== 'object' || this.decoderConfig.type === 'js';\n\t\tconst librariesPending = [];\n\n\t\tif ( useJS ) {\n\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_decoder.js', 'text' ) );\n\n\t\t} else {\n\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_wasm_wrapper.js', 'text' ) );\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_decoder.wasm', 'arraybuffer' ) );\n\n\t\t}\n\n\t\tthis.decoderPending = Promise.all( librariesPending )\n\t\t\t.then( ( libraries ) => {\n\n\t\t\t\tconst jsContent = libraries[ 0 ];\n\n\t\t\t\tif ( ! useJS ) {\n\n\t\t\t\t\tthis.decoderConfig.wasmBinary = libraries[ 1 ];\n\n\t\t\t\t}\n\n\t\t\t\tconst fn = DRACOWorker.toString();\n\n\t\t\t\tconst body = [\n\t\t\t\t\t'/* draco decoder */',\n\t\t\t\t\tjsContent,\n\t\t\t\t\t'',\n\t\t\t\t\t'/* worker */',\n\t\t\t\t\tfn.substring( fn.indexOf( '{' ) + 1, fn.lastIndexOf( '}' ) )\n\t\t\t\t].join( '\\n' );\n\n\t\t\t\tthis.workerSourceURL = URL.createObjectURL( new Blob( [ body ] ) );\n\n\t\t\t} );\n\n\t\treturn this.decoderPending;\n\n\t}\n\n\t_getWorker( taskID, taskCost ) {\n\n\t\treturn this._initDecoder().then( () => {\n\n\t\t\tif ( this.workerPool.length < this.workerLimit ) {\n\n\t\t\t\tconst worker = new Worker( this.workerSourceURL );\n\n\t\t\t\tworker._callbacks = {};\n\t\t\t\tworker._taskCosts = {};\n\t\t\t\tworker._taskLoad = 0;\n\n\t\t\t\tworker.postMessage( { type: 'init', decoderConfig: this.decoderConfig } );\n\n\t\t\t\tworker.onmessage = function ( e ) {\n\n\t\t\t\t\tconst message = e.data;\n\n\t\t\t\t\tswitch ( message.type ) {\n\n\t\t\t\t\t\tcase 'decode':\n\t\t\t\t\t\t\tworker._callbacks[ message.id ].resolve( message );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'error':\n\t\t\t\t\t\t\tworker._callbacks[ message.id ].reject( message );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.DRACOLoader: Unexpected message, \"' + message.type + '\"' );\n\n\t\t\t\t\t}\n\n\t\t\t\t};\n\n\t\t\t\tthis.workerPool.push( worker );\n\n\t\t\t} else {\n\n\t\t\t\tthis.workerPool.sort( function ( a, b ) {\n\n\t\t\t\t\treturn a._taskLoad > b._taskLoad ? - 1 : 1;\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tconst worker = this.workerPool[ this.workerPool.length - 1 ];\n\t\t\tworker._taskCosts[ taskID ] = taskCost;\n\t\t\tworker._taskLoad += taskCost;\n\t\t\treturn worker;\n\n\t\t} );\n\n\t}\n\n\t_releaseTask( worker, taskID ) {\n\n\t\tworker._taskLoad -= worker._taskCosts[ taskID ];\n\t\tdelete worker._callbacks[ taskID ];\n\t\tdelete worker._taskCosts[ taskID ];\n\n\t}\n\n\tdebug() {\n\n\t\tconsole.log( 'Task load: ', this.workerPool.map( ( worker ) => worker._taskLoad ) );\n\n\t}\n\n\tdispose() {\n\n\t\tfor ( let i = 0; i < this.workerPool.length; ++ i ) {\n\n\t\t\tthis.workerPool[ i ].terminate();\n\n\t\t}\n\n\t\tthis.workerPool.length = 0;\n\n\t\tif ( this.workerSourceURL !== '' ) {\n\n\t\t\tURL.revokeObjectURL( this.workerSourceURL );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/* WEB WORKER */\n\nfunction DRACOWorker() {\n\n\tlet decoderConfig;\n\tlet decoderPending;\n\n\tonmessage = function ( e ) {\n\n\t\tconst message = e.data;\n\n\t\tswitch ( message.type ) {\n\n\t\t\tcase 'init':\n\t\t\t\tdecoderConfig = message.decoderConfig;\n\t\t\t\tdecoderPending = new Promise( function ( resolve/*, reject*/ ) {\n\n\t\t\t\t\tdecoderConfig.onModuleLoaded = function ( draco ) {\n\n\t\t\t\t\t\t// Module is Promise-like. Wrap before resolving to avoid loop.\n\t\t\t\t\t\tresolve( { draco: draco } );\n\n\t\t\t\t\t};\n\n\t\t\t\t\tDracoDecoderModule( decoderConfig ); // eslint-disable-line no-undef\n\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t\tcase 'decode':\n\t\t\t\tconst buffer = message.buffer;\n\t\t\t\tconst taskConfig = message.taskConfig;\n\t\t\t\tdecoderPending.then( ( module ) => {\n\n\t\t\t\t\tconst draco = module.draco;\n\t\t\t\t\tconst decoder = new draco.Decoder();\n\n\t\t\t\t\ttry {\n\n\t\t\t\t\t\tconst geometry = decodeGeometry( draco, decoder, new Int8Array( buffer ), taskConfig );\n\n\t\t\t\t\t\tconst buffers = geometry.attributes.map( ( attr ) => attr.array.buffer );\n\n\t\t\t\t\t\tif ( geometry.index ) buffers.push( geometry.index.array.buffer );\n\n\t\t\t\t\t\tself.postMessage( { type: 'decode', id: message.id, geometry }, buffers );\n\n\t\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t\tconsole.error( error );\n\n\t\t\t\t\t\tself.postMessage( { type: 'error', id: message.id, error: error.message } );\n\n\t\t\t\t\t} finally {\n\n\t\t\t\t\t\tdraco.destroy( decoder );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t};\n\n\tfunction decodeGeometry( draco, decoder, array, taskConfig ) {\n\n\t\tconst attributeIDs = taskConfig.attributeIDs;\n\t\tconst attributeTypes = taskConfig.attributeTypes;\n\n\t\tlet dracoGeometry;\n\t\tlet decodingStatus;\n\n\t\tconst geometryType = decoder.GetEncodedGeometryType( array );\n\n\t\tif ( geometryType === draco.TRIANGULAR_MESH ) {\n\n\t\t\tdracoGeometry = new draco.Mesh();\n\t\t\tdecodingStatus = decoder.DecodeArrayToMesh( array, array.byteLength, dracoGeometry );\n\n\t\t} else if ( geometryType === draco.POINT_CLOUD ) {\n\n\t\t\tdracoGeometry = new draco.PointCloud();\n\t\t\tdecodingStatus = decoder.DecodeArrayToPointCloud( array, array.byteLength, dracoGeometry );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.DRACOLoader: Unexpected geometry type.' );\n\n\t\t}\n\n\t\tif ( ! decodingStatus.ok() || dracoGeometry.ptr === 0 ) {\n\n\t\t\tthrow new Error( 'THREE.DRACOLoader: Decoding failed: ' + decodingStatus.error_msg() );\n\n\t\t}\n\n\t\tconst geometry = { index: null, attributes: [] };\n\n\t\t// Gather all vertex attributes.\n\t\tfor ( const attributeName in attributeIDs ) {\n\n\t\t\tconst attributeType = self[ attributeTypes[ attributeName ] ];\n\n\t\t\tlet attribute;\n\t\t\tlet attributeID;\n\n\t\t\t// A Draco file may be created with default vertex attributes, whose attribute IDs\n\t\t\t// are mapped 1:1 from their semantic name (POSITION, NORMAL, ...). Alternatively,\n\t\t\t// a Draco file may contain a custom set of attributes, identified by known unique\n\t\t\t// IDs. glTF files always do the latter, and `.drc` files typically do the former.\n\t\t\tif ( taskConfig.useUniqueIDs ) {\n\n\t\t\t\tattributeID = attributeIDs[ attributeName ];\n\t\t\t\tattribute = decoder.GetAttributeByUniqueId( dracoGeometry, attributeID );\n\n\t\t\t} else {\n\n\t\t\t\tattributeID = decoder.GetAttributeId( dracoGeometry, draco[ attributeIDs[ attributeName ] ] );\n\n\t\t\t\tif ( attributeID === - 1 ) continue;\n\n\t\t\t\tattribute = decoder.GetAttribute( dracoGeometry, attributeID );\n\n\t\t\t}\n\n\t\t\tconst attributeResult = decodeAttribute( draco, decoder, dracoGeometry, attributeName, attributeType, attribute );\n\n\t\t\tif ( attributeName === 'color' ) {\n\n\t\t\t\tattributeResult.vertexColorSpace = taskConfig.vertexColorSpace;\n\n\t\t\t}\n\n\t\t\tgeometry.attributes.push( attributeResult );\n\n\t\t}\n\n\t\t// Add index.\n\t\tif ( geometryType === draco.TRIANGULAR_MESH ) {\n\n\t\t\tgeometry.index = decodeIndex( draco, decoder, dracoGeometry );\n\n\t\t}\n\n\t\tdraco.destroy( dracoGeometry );\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction decodeIndex( draco, decoder, dracoGeometry ) {\n\n\t\tconst numFaces = dracoGeometry.num_faces();\n\t\tconst numIndices = numFaces * 3;\n\t\tconst byteLength = numIndices * 4;\n\n\t\tconst ptr = draco._malloc( byteLength );\n\t\tdecoder.GetTrianglesUInt32Array( dracoGeometry, byteLength, ptr );\n\t\tconst index = new Uint32Array( draco.HEAPF32.buffer, ptr, numIndices ).slice();\n\t\tdraco._free( ptr );\n\n\t\treturn { array: index, itemSize: 1 };\n\n\t}\n\n\tfunction decodeAttribute( draco, decoder, dracoGeometry, attributeName, attributeType, attribute ) {\n\n\t\tconst numComponents = attribute.num_components();\n\t\tconst numPoints = dracoGeometry.num_points();\n\t\tconst numValues = numPoints * numComponents;\n\t\tconst byteLength = numValues * attributeType.BYTES_PER_ELEMENT;\n\t\tconst dataType = getDracoDataType( draco, attributeType );\n\n\t\tconst ptr = draco._malloc( byteLength );\n\t\tdecoder.GetAttributeDataArrayForAllPoints( dracoGeometry, attribute, dataType, byteLength, ptr );\n\t\tconst array = new attributeType( draco.HEAPF32.buffer, ptr, numValues ).slice();\n\t\tdraco._free( ptr );\n\n\t\treturn {\n\t\t\tname: attributeName,\n\t\t\tarray: array,\n\t\t\titemSize: numComponents\n\t\t};\n\n\t}\n\n\tfunction getDracoDataType( draco, attributeType ) {\n\n\t\tswitch ( attributeType ) {\n\n\t\t\tcase Float32Array: return draco.DT_FLOAT32;\n\t\t\tcase Int8Array: return draco.DT_INT8;\n\t\t\tcase Int16Array: return draco.DT_INT16;\n\t\t\tcase Int32Array: return draco.DT_INT32;\n\t\t\tcase Uint8Array: return draco.DT_UINT8;\n\t\t\tcase Uint16Array: return draco.DT_UINT16;\n\t\t\tcase Uint32Array: return draco.DT_UINT32;\n\n\t\t}\n\n\t}\n\n}\n\nexport { DRACOLoader };\n","/**\n * @author Deepkolos / https://github.com/deepkolos\n */\n\nexport class WorkerPool {\n\n\tconstructor( pool = 4 ) {\n\n\t\tthis.pool = pool;\n\t\tthis.queue = [];\n\t\tthis.workers = [];\n\t\tthis.workersResolve = [];\n\t\tthis.workerStatus = 0;\n\n\t}\n\n\t_initWorker( workerId ) {\n\n\t\tif ( ! this.workers[ workerId ] ) {\n\n\t\t\tconst worker = this.workerCreator();\n\t\t\tworker.addEventListener( 'message', this._onMessage.bind( this, workerId ) );\n\t\t\tthis.workers[ workerId ] = worker;\n\n\t\t}\n\n\t}\n\n\t_getIdleWorker() {\n\n\t\tfor ( let i = 0; i < this.pool; i ++ )\n\t\t\tif ( ! ( this.workerStatus & ( 1 << i ) ) ) return i;\n\n\t\treturn - 1;\n\n\t}\n\n\t_onMessage( workerId, msg ) {\n\n\t\tconst resolve = this.workersResolve[ workerId ];\n\t\tresolve && resolve( msg );\n\n\t\tif ( this.queue.length ) {\n\n\t\t\tconst { resolve, msg, transfer } = this.queue.shift();\n\t\t\tthis.workersResolve[ workerId ] = resolve;\n\t\t\tthis.workers[ workerId ].postMessage( msg, transfer );\n\n\t\t} else {\n\n\t\t\tthis.workerStatus ^= 1 << workerId;\n\n\t\t}\n\n\t}\n\n\tsetWorkerCreator( workerCreator ) {\n\n\t\tthis.workerCreator = workerCreator;\n\n\t}\n\n\tsetWorkerLimit( pool ) {\n\n\t\tthis.pool = pool;\n\n\t}\n\n\tpostMessage( msg, transfer ) {\n\n\t\treturn new Promise( ( resolve ) => {\n\n\t\t\tconst workerId = this._getIdleWorker();\n\n\t\t\tif ( workerId !== - 1 ) {\n\n\t\t\t\tthis._initWorker( workerId );\n\t\t\t\tthis.workerStatus |= 1 << workerId;\n\t\t\t\tthis.workersResolve[ workerId ] = resolve;\n\t\t\t\tthis.workers[ workerId ].postMessage( msg, transfer );\n\n\t\t\t} else {\n\n\t\t\t\tthis.queue.push( { resolve, msg, transfer } );\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.workers.forEach( ( worker ) => worker.terminate() );\n\t\tthis.workersResolve.length = 0;\n\t\tthis.workers.length = 0;\n\t\tthis.queue.length = 0;\n\t\tthis.workerStatus = 0;\n\n\t}\n\n}\n","const t=0,e=1,n=2,i=3,s=0,a=0,r=2,o=0,l=1,f=160,h=161,U=162,c=163,_=166,p=0,g=1,y=0,x=1,u=2,b=3,d=4,w=5,m=6,D=7,B=8,L=9,v=10,A=11,k=12,V=13,I=14,S=15,F=16,O=17,E=18,T=0,C=1,M=2,P=3,z=4,W=5,H=6,N=7,K=8,X=9,R=10,Y=11,j=0,q=1,G=2,J=13,Q=14,Z=15,$=128,tt=64,et=32,nt=16,it=0,st=1,at=2,rt=3,ot=4,lt=5,ft=6,ht=7,Ut=8,ct=9,_t=10,pt=13,gt=14,yt=15,xt=16,ut=17,bt=20,dt=21,wt=22,mt=23,Dt=24,Bt=27,Lt=28,vt=29,At=30,kt=31,Vt=34,It=35,St=36,Ft=37,Ot=38,Et=41,Tt=42,Ct=43,Mt=44,Pt=45,zt=48,Wt=49,Ht=50,Nt=58,Kt=59,Xt=62,Rt=63,Yt=64,jt=65,qt=68,Gt=69,Jt=70,Qt=71,Zt=74,$t=75,te=76,ee=77,ne=78,ie=81,se=82,ae=83,re=84,oe=85,le=88,fe=89,he=90,Ue=91,ce=92,_e=95,pe=96,ge=97,ye=98,xe=99,ue=100,be=101,de=102,we=103,me=104,De=105,Be=106,Le=107,ve=108,Ae=109,ke=110,Ve=111,Ie=112,Se=113,Fe=114,Oe=115,Ee=116,Te=117,Ce=118,Me=119,Pe=120,ze=121,We=122,He=123,Ne=124,Ke=125,Xe=126,Re=127,Ye=128,je=129,qe=130,Ge=131,Je=132,Qe=133,Ze=134,$e=135,tn=136,en=137,nn=138,sn=139,an=140,rn=141,on=142,ln=143,fn=144,hn=145,Un=146,cn=147,_n=148,pn=149,gn=150,yn=151,xn=152,un=153,bn=154,dn=155,wn=156,mn=157,Dn=158,Bn=159,Ln=160,vn=161,An=162,kn=163,Vn=164,In=165,Sn=166,Fn=167,On=168,En=169,Tn=170,Cn=171,Mn=172,Pn=173,zn=174,Wn=175,Hn=176,Nn=177,Kn=178,Xn=179,Rn=180,Yn=181,jn=182,qn=183,Gn=184,Jn=1000156007,Qn=1000156008,Zn=1000156009,$n=1000156010,ti=1000156011,ei=1000156017,ni=1000156018,ii=1000156019,si=1000156020,ai=1000156021,ri=1000054e3,oi=1000054001,li=1000054002,fi=1000054003,hi=1000054004,Ui=1000054005,ci=1000054006,_i=1000054007,pi=1000066e3,gi=1000066001,yi=1000066002,xi=1000066003,ui=1000066004,bi=1000066005,di=1000066006,wi=1000066007,mi=1000066008,Di=1000066009,Bi=1000066010,Li=1000066011,vi=1000066012,Ai=1000066013,ki=100034e4,Vi=1000340001;class Ii{constructor(){this.vkFormat=0,this.typeSize=1,this.pixelWidth=0,this.pixelHeight=0,this.pixelDepth=0,this.layerCount=0,this.faceCount=1,this.supercompressionScheme=0,this.levels=[],this.dataFormatDescriptor=[{vendorId:0,descriptorType:0,descriptorBlockSize:0,versionNumber:2,colorModel:0,colorPrimaries:1,transferFunction:2,flags:0,texelBlockDimension:[0,0,0,0],bytesPlane:[0,0,0,0,0,0,0,0],samples:[]}],this.keyValue={},this.globalData=null}}class Si{constructor(t,e,n,i){this._dataView=void 0,this._littleEndian=void 0,this._offset=void 0,this._dataView=new DataView(t.buffer,t.byteOffset+e,n),this._littleEndian=i,this._offset=0}_nextUint8(){const t=this._dataView.getUint8(this._offset);return this._offset+=1,t}_nextUint16(){const t=this._dataView.getUint16(this._offset,this._littleEndian);return this._offset+=2,t}_nextUint32(){const t=this._dataView.getUint32(this._offset,this._littleEndian);return this._offset+=4,t}_nextUint64(){const t=this._dataView.getUint32(this._offset,this._littleEndian)+2**32*this._dataView.getUint32(this._offset+4,this._littleEndian);return this._offset+=8,t}_nextInt32(){const t=this._dataView.getInt32(this._offset,this._littleEndian);return this._offset+=4,t}_nextUint8Array(t){const e=new Uint8Array(this._dataView.buffer,this._dataView.byteOffset+this._offset,t);return this._offset+=t,e}_skip(t){return this._offset+=t,this}_scan(t,e){void 0===e&&(e=0);const n=this._offset;let i=0;for(;this._dataView.getUint8(this._offset)!==e&&i<t;)i++,this._offset++;return i<t&&this._offset++,new Uint8Array(this._dataView.buffer,this._dataView.byteOffset+n,i)}}const Fi=new Uint8Array([0]),Oi=[171,75,84,88,32,50,48,187,13,10,26,10];function Ei(t){return(new TextEncoder).encode(t)}function Ti(t){return(new TextDecoder).decode(t)}function Ci(t){let e=0;for(const n of t)e+=n.byteLength;const n=new Uint8Array(e);let i=0;for(const e of t)n.set(new Uint8Array(e),i),i+=e.byteLength;return n}function Mi(t,e){return void 0===e&&(e=4),Math.ceil(t/e)*e-t}function Pi(t){const e=new Uint8Array(t.buffer,t.byteOffset,Oi.length);if(e[0]!==Oi[0]||e[1]!==Oi[1]||e[2]!==Oi[2]||e[3]!==Oi[3]||e[4]!==Oi[4]||e[5]!==Oi[5]||e[6]!==Oi[6]||e[7]!==Oi[7]||e[8]!==Oi[8]||e[9]!==Oi[9]||e[10]!==Oi[10]||e[11]!==Oi[11])throw new Error(\"Missing KTX 2.0 identifier.\");const n=new Ii,i=17*Uint32Array.BYTES_PER_ELEMENT,s=new Si(t,Oi.length,i,!0);n.vkFormat=s._nextUint32(),n.typeSize=s._nextUint32(),n.pixelWidth=s._nextUint32(),n.pixelHeight=s._nextUint32(),n.pixelDepth=s._nextUint32(),n.layerCount=s._nextUint32(),n.faceCount=s._nextUint32();const a=s._nextUint32();n.supercompressionScheme=s._nextUint32();const r=s._nextUint32(),o=s._nextUint32(),l=s._nextUint32(),f=s._nextUint32(),h=s._nextUint64(),U=s._nextUint64(),c=new Si(t,Oi.length+i,3*a*8,!0);for(let e=0;e<a;e++)n.levels.push({levelData:new Uint8Array(t.buffer,t.byteOffset+c._nextUint64(),c._nextUint64()),uncompressedByteLength:c._nextUint64()});const _=new Si(t,r,o,!0),p={vendorId:_._skip(4)._nextUint16(),descriptorType:_._nextUint16(),versionNumber:_._nextUint16(),descriptorBlockSize:_._nextUint16(),colorModel:_._nextUint8(),colorPrimaries:_._nextUint8(),transferFunction:_._nextUint8(),flags:_._nextUint8(),texelBlockDimension:[_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8()],bytesPlane:[_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8()],samples:[]},g=(p.descriptorBlockSize/4-6)/4;for(let t=0;t<g;t++){const e={bitOffset:_._nextUint16(),bitLength:_._nextUint8(),channelType:_._nextUint8(),samplePosition:[_._nextUint8(),_._nextUint8(),_._nextUint8(),_._nextUint8()],sampleLower:-Infinity,sampleUpper:Infinity};64&e.channelType?(e.sampleLower=_._nextInt32(),e.sampleUpper=_._nextInt32()):(e.sampleLower=_._nextUint32(),e.sampleUpper=_._nextUint32()),p.samples[t]=e}n.dataFormatDescriptor.length=0,n.dataFormatDescriptor.push(p);const y=new Si(t,l,f,!0);for(;y._offset<f;){const t=y._nextUint32(),e=y._scan(t),i=Ti(e);if(n.keyValue[i]=y._nextUint8Array(t-e.byteLength-1),i.match(/^ktx/i)){const t=Ti(n.keyValue[i]);n.keyValue[i]=t.substring(0,t.lastIndexOf(\"\\0\"))}y._skip(t%4?4-t%4:0)}if(U<=0)return n;const x=new Si(t,h,U,!0),u=x._nextUint16(),b=x._nextUint16(),d=x._nextUint32(),w=x._nextUint32(),m=x._nextUint32(),D=x._nextUint32(),B=[];for(let t=0;t<a;t++)B.push({imageFlags:x._nextUint32(),rgbSliceByteOffset:x._nextUint32(),rgbSliceByteLength:x._nextUint32(),alphaSliceByteOffset:x._nextUint32(),alphaSliceByteLength:x._nextUint32()});const L=h+x._offset,v=L+d,A=v+w,k=A+m,V=new Uint8Array(t.buffer,t.byteOffset+L,d),I=new Uint8Array(t.buffer,t.byteOffset+v,w),S=new Uint8Array(t.buffer,t.byteOffset+A,m),F=new Uint8Array(t.buffer,t.byteOffset+k,D);return n.globalData={endpointCount:u,selectorCount:b,imageDescs:B,endpointsData:V,selectorsData:I,tablesData:S,extendedData:F},n}const zi={keepWriter:!1};function Wi(t,e){void 0===e&&(e={}),e={...zi,...e};let n=new ArrayBuffer(0);if(t.globalData){const e=new ArrayBuffer(20+5*t.globalData.imageDescs.length*4),i=new DataView(e);i.setUint16(0,t.globalData.endpointCount,!0),i.setUint16(2,t.globalData.selectorCount,!0),i.setUint32(4,t.globalData.endpointsData.byteLength,!0),i.setUint32(8,t.globalData.selectorsData.byteLength,!0),i.setUint32(12,t.globalData.tablesData.byteLength,!0),i.setUint32(16,t.globalData.extendedData.byteLength,!0);for(let e=0;e<t.globalData.imageDescs.length;e++){const n=t.globalData.imageDescs[e];i.setUint32(20+5*e*4+0,n.imageFlags,!0),i.setUint32(20+5*e*4+4,n.rgbSliceByteOffset,!0),i.setUint32(20+5*e*4+8,n.rgbSliceByteLength,!0),i.setUint32(20+5*e*4+12,n.alphaSliceByteOffset,!0),i.setUint32(20+5*e*4+16,n.alphaSliceByteLength,!0)}n=Ci([e,t.globalData.endpointsData,t.globalData.selectorsData,t.globalData.tablesData,t.globalData.extendedData])}const i=[];let s=t.keyValue;e.keepWriter||(s={...t.keyValue,KTXwriter:\"KTX-Parse v0.7.1\"});for(const t in s){const e=s[t],n=Ei(t),a=\"string\"==typeof e?Ci([Ei(e),Fi]):e,r=n.byteLength+1+a.byteLength,o=Mi(r,4);i.push(Ci([new Uint32Array([r]),n,Fi,a,new Uint8Array(o).fill(0)]))}const a=Ci(i);if(1!==t.dataFormatDescriptor.length||0!==t.dataFormatDescriptor[0].descriptorType)throw new Error(\"Only BASICFORMAT Data Format Descriptor output supported.\");const r=t.dataFormatDescriptor[0],o=new ArrayBuffer(28+16*r.samples.length),l=new DataView(o),f=24+16*r.samples.length;if(l.setUint32(0,o.byteLength,!0),l.setUint16(4,r.vendorId,!0),l.setUint16(6,r.descriptorType,!0),l.setUint16(8,r.versionNumber,!0),l.setUint16(10,f,!0),l.setUint8(12,r.colorModel),l.setUint8(13,r.colorPrimaries),l.setUint8(14,r.transferFunction),l.setUint8(15,r.flags),!Array.isArray(r.texelBlockDimension))throw new Error(\"texelBlockDimension is now an array. For dimensionality `d`, set `d - 1`.\");l.setUint8(16,r.texelBlockDimension[0]),l.setUint8(17,r.texelBlockDimension[1]),l.setUint8(18,r.texelBlockDimension[2]),l.setUint8(19,r.texelBlockDimension[3]);for(let t=0;t<8;t++)l.setUint8(20+t,r.bytesPlane[t]);for(let t=0;t<r.samples.length;t++){const e=r.samples[t],n=28+16*t;if(e.channelID)throw new Error(\"channelID has been renamed to channelType.\");l.setUint16(n+0,e.bitOffset,!0),l.setUint8(n+2,e.bitLength),l.setUint8(n+3,e.channelType),l.setUint8(n+4,e.samplePosition[0]),l.setUint8(n+5,e.samplePosition[1]),l.setUint8(n+6,e.samplePosition[2]),l.setUint8(n+7,e.samplePosition[3]),64&e.channelType?(l.setInt32(n+8,e.sampleLower,!0),l.setInt32(n+12,e.sampleUpper,!0)):(l.setUint32(n+8,e.sampleLower,!0),l.setUint32(n+12,e.sampleUpper,!0))}const h=Oi.length+68+3*t.levels.length*8,U=h+o.byteLength;let c=n.byteLength>0?U+a.byteLength:0;c%8&&(c+=8-c%8);const _=[],p=new DataView(new ArrayBuffer(3*t.levels.length*8)),g=new Uint32Array(t.levels.length);let y=0;0===t.supercompressionScheme&&(y=function(t,e){const n=Math.max(t,4),i=Math.min(t,4);let s=n;for(;s%i!=0;)s+=n;return s}(function(t){return t.levels[0].levelData.byteLength/function(t,e){let n=1;const i=[t.pixelWidth,t.pixelHeight,t.pixelDepth],s=function(t){const[e,n,i]=t.dataFormatDescriptor[0].texelBlockDimension;return[e+1,n+1,i+1]}(t);for(let t=0;t<3;t++)if(i[t]>0){const e=Math.ceil(Math.floor(i[t]*Math.pow(2,-0))/s[t]);n*=Math.max(1,e)}return t.layerCount>0&&(n*=t.layerCount),t.faceCount>0&&(n*=t.faceCount),n}(t)}(t)));let x=(c||U+a.byteLength)+n.byteLength;for(let e=t.levels.length-1;e>=0;e--){if(x%y){const t=Mi(x,y);_.push(new Uint8Array(t)),x+=t}const n=t.levels[e];_.push(n.levelData),g[e]=x,x+=n.levelData.byteLength}for(let e=0;e<t.levels.length;e++){const n=t.levels[e];p.setBigUint64(24*e+0,BigInt(g[e]),!0),p.setBigUint64(24*e+8,BigInt(n.levelData.byteLength),!0),p.setBigUint64(24*e+16,BigInt(n.uncompressedByteLength),!0)}const u=new ArrayBuffer(68),b=new DataView(u);return b.setUint32(0,t.vkFormat,!0),b.setUint32(4,t.typeSize,!0),b.setUint32(8,t.pixelWidth,!0),b.setUint32(12,t.pixelHeight,!0),b.setUint32(16,t.pixelDepth,!0),b.setUint32(20,t.layerCount,!0),b.setUint32(24,t.faceCount,!0),b.setUint32(28,t.levels.length,!0),b.setUint32(32,t.supercompressionScheme,!0),b.setUint32(36,h,!0),b.setUint32(40,o.byteLength,!0),b.setUint32(44,U,!0),b.setUint32(48,a.byteLength,!0),b.setBigUint64(52,BigInt(n.byteLength>0?c:0),!0),b.setBigUint64(60,BigInt(n.byteLength),!0),new Uint8Array(Ci([new Uint8Array(Oi).buffer,u,p.buffer,o,a,c>0?new ArrayBuffer(c-(U+a.byteLength)):new ArrayBuffer(0),n,..._]))}export{Z as KHR_DF_CHANNEL_RGBSDA_ALPHA,G as KHR_DF_CHANNEL_RGBSDA_BLUE,Q as KHR_DF_CHANNEL_RGBSDA_DEPTH,q as KHR_DF_CHANNEL_RGBSDA_GREEN,j as KHR_DF_CHANNEL_RGBSDA_RED,J as KHR_DF_CHANNEL_RGBSDA_STENCIL,g as KHR_DF_FLAG_ALPHA_PREMULTIPLIED,p as KHR_DF_FLAG_ALPHA_STRAIGHT,s as KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT,U as KHR_DF_MODEL_ASTC,f as KHR_DF_MODEL_ETC1,c as KHR_DF_MODEL_ETC1S,h as KHR_DF_MODEL_ETC2,l as KHR_DF_MODEL_RGBSDA,_ as KHR_DF_MODEL_UASTC,o as KHR_DF_MODEL_UNSPECIFIED,H as KHR_DF_PRIMARIES_ACES,N as KHR_DF_PRIMARIES_ACESCC,Y as KHR_DF_PRIMARIES_ADOBERGB,z as KHR_DF_PRIMARIES_BT2020,M as KHR_DF_PRIMARIES_BT601_EBU,P as KHR_DF_PRIMARIES_BT601_SMPTE,C as KHR_DF_PRIMARIES_BT709,W as KHR_DF_PRIMARIES_CIEXYZ,R as KHR_DF_PRIMARIES_DISPLAYP3,K as KHR_DF_PRIMARIES_NTSC1953,X as KHR_DF_PRIMARIES_PAL525,T as KHR_DF_PRIMARIES_UNSPECIFIED,et as KHR_DF_SAMPLE_DATATYPE_EXPONENT,$ as KHR_DF_SAMPLE_DATATYPE_FLOAT,nt as KHR_DF_SAMPLE_DATATYPE_LINEAR,tt as KHR_DF_SAMPLE_DATATYPE_SIGNED,F as KHR_DF_TRANSFER_ACESCC,O as KHR_DF_TRANSFER_ACESCCT,E as KHR_DF_TRANSFER_ADOBERGB,D as KHR_DF_TRANSFER_BT1886,k as KHR_DF_TRANSFER_DCIP3,L as KHR_DF_TRANSFER_HLG_EOTF,B as KHR_DF_TRANSFER_HLG_OETF,b as KHR_DF_TRANSFER_ITU,x as KHR_DF_TRANSFER_LINEAR,d as KHR_DF_TRANSFER_NTSC,I as KHR_DF_TRANSFER_PAL625_EOTF,V as KHR_DF_TRANSFER_PAL_OETF,v as KHR_DF_TRANSFER_PQ_EOTF,A as KHR_DF_TRANSFER_PQ_OETF,w as KHR_DF_TRANSFER_SLOG,m as KHR_DF_TRANSFER_SLOG2,u as KHR_DF_TRANSFER_SRGB,S as KHR_DF_TRANSFER_ST240,y as KHR_DF_TRANSFER_UNSPECIFIED,a as KHR_DF_VENDORID_KHRONOS,r as KHR_DF_VERSION,e as KHR_SUPERCOMPRESSION_BASISLZ,t as KHR_SUPERCOMPRESSION_NONE,i as KHR_SUPERCOMPRESSION_ZLIB,n as KHR_SUPERCOMPRESSION_ZSTD,Ii as KTX2Container,Ut as VK_FORMAT_A1R5G5B5_UNORM_PACK16,Gt as VK_FORMAT_A2B10G10R10_SINT_PACK32,jt as VK_FORMAT_A2B10G10R10_SNORM_PACK32,qt as VK_FORMAT_A2B10G10R10_UINT_PACK32,Yt as VK_FORMAT_A2B10G10R10_UNORM_PACK32,Rt as VK_FORMAT_A2R10G10B10_SINT_PACK32,Kt as VK_FORMAT_A2R10G10B10_SNORM_PACK32,Xt as VK_FORMAT_A2R10G10B10_UINT_PACK32,Nt as VK_FORMAT_A2R10G10B10_UNORM_PACK32,Vi as VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT,ki as VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT,Li as VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT,Rn as VK_FORMAT_ASTC_10x10_SRGB_BLOCK,Xn as VK_FORMAT_ASTC_10x10_UNORM_BLOCK,mi as VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT,zn as VK_FORMAT_ASTC_10x5_SRGB_BLOCK,Pn as VK_FORMAT_ASTC_10x5_UNORM_BLOCK,Di as VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT,Hn as VK_FORMAT_ASTC_10x6_SRGB_BLOCK,Wn as VK_FORMAT_ASTC_10x6_UNORM_BLOCK,Bi as VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT,Kn as VK_FORMAT_ASTC_10x8_SRGB_BLOCK,Nn as VK_FORMAT_ASTC_10x8_UNORM_BLOCK,vi as VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT,jn as VK_FORMAT_ASTC_12x10_SRGB_BLOCK,Yn as VK_FORMAT_ASTC_12x10_UNORM_BLOCK,Ai as VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT,Gn as VK_FORMAT_ASTC_12x12_SRGB_BLOCK,qn as VK_FORMAT_ASTC_12x12_UNORM_BLOCK,pi as VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT,Dn as VK_FORMAT_ASTC_4x4_SRGB_BLOCK,mn as VK_FORMAT_ASTC_4x4_UNORM_BLOCK,gi as VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT,Ln as VK_FORMAT_ASTC_5x4_SRGB_BLOCK,Bn as VK_FORMAT_ASTC_5x4_UNORM_BLOCK,yi as VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT,An as VK_FORMAT_ASTC_5x5_SRGB_BLOCK,vn as VK_FORMAT_ASTC_5x5_UNORM_BLOCK,xi as VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT,Vn as VK_FORMAT_ASTC_6x5_SRGB_BLOCK,kn as VK_FORMAT_ASTC_6x5_UNORM_BLOCK,ui as VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT,Sn as VK_FORMAT_ASTC_6x6_SRGB_BLOCK,In as VK_FORMAT_ASTC_6x6_UNORM_BLOCK,bi as VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT,On as VK_FORMAT_ASTC_8x5_SRGB_BLOCK,Fn as VK_FORMAT_ASTC_8x5_UNORM_BLOCK,di as VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT,Tn as VK_FORMAT_ASTC_8x6_SRGB_BLOCK,En as VK_FORMAT_ASTC_8x6_UNORM_BLOCK,wi as VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT,Mn as VK_FORMAT_ASTC_8x8_SRGB_BLOCK,Cn as VK_FORMAT_ASTC_8x8_UNORM_BLOCK,We as VK_FORMAT_B10G11R11_UFLOAT_PACK32,ti as VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16,ai as VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16,rt as VK_FORMAT_B4G4R4A4_UNORM_PACK16,ht as VK_FORMAT_B5G5R5A1_UNORM_PACK16,lt as VK_FORMAT_B5G6R5_UNORM_PACK16,Wt as VK_FORMAT_B8G8R8A8_SINT,Pt as VK_FORMAT_B8G8R8A8_SNORM,Ht as VK_FORMAT_B8G8R8A8_SRGB,zt as VK_FORMAT_B8G8R8A8_UINT,Mt as VK_FORMAT_B8G8R8A8_UNORM,It as VK_FORMAT_B8G8R8_SINT,kt as VK_FORMAT_B8G8R8_SNORM,St as VK_FORMAT_B8G8R8_SRGB,Vt as VK_FORMAT_B8G8R8_UINT,At as VK_FORMAT_B8G8R8_UNORM,Ze as VK_FORMAT_BC1_RGBA_SRGB_BLOCK,Qe as VK_FORMAT_BC1_RGBA_UNORM_BLOCK,Je as VK_FORMAT_BC1_RGB_SRGB_BLOCK,Ge as VK_FORMAT_BC1_RGB_UNORM_BLOCK,tn as VK_FORMAT_BC2_SRGB_BLOCK,$e as VK_FORMAT_BC2_UNORM_BLOCK,nn as VK_FORMAT_BC3_SRGB_BLOCK,en as VK_FORMAT_BC3_UNORM_BLOCK,an as VK_FORMAT_BC4_SNORM_BLOCK,sn as VK_FORMAT_BC4_UNORM_BLOCK,on as VK_FORMAT_BC5_SNORM_BLOCK,rn as VK_FORMAT_BC5_UNORM_BLOCK,fn as VK_FORMAT_BC6H_SFLOAT_BLOCK,ln as VK_FORMAT_BC6H_UFLOAT_BLOCK,Un as VK_FORMAT_BC7_SRGB_BLOCK,hn as VK_FORMAT_BC7_UNORM_BLOCK,Ne as VK_FORMAT_D16_UNORM,Ye as VK_FORMAT_D16_UNORM_S8_UINT,je as VK_FORMAT_D24_UNORM_S8_UINT,Xe as VK_FORMAT_D32_SFLOAT,qe as VK_FORMAT_D32_SFLOAT_S8_UINT,He as VK_FORMAT_E5B9G9R9_UFLOAT_PACK32,wn as VK_FORMAT_EAC_R11G11_SNORM_BLOCK,dn as VK_FORMAT_EAC_R11G11_UNORM_BLOCK,bn as VK_FORMAT_EAC_R11_SNORM_BLOCK,un as VK_FORMAT_EAC_R11_UNORM_BLOCK,gn as VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK,pn as VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK,xn as VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK,yn as VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK,_n as VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK,cn as VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK,$n as VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16,si as VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16,hi as VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG,ri as VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG,Ui as VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG,oi as VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG,ci as VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG,li as VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG,_i as VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG,fi as VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG,Zn as VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16,Qn as VK_FORMAT_R10X6G10X6_UNORM_2PACK16,Jn as VK_FORMAT_R10X6_UNORM_PACK16,ii as VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16,ni as VK_FORMAT_R12X4G12X4_UNORM_2PACK16,ei as VK_FORMAT_R12X4_UNORM_PACK16,ge as VK_FORMAT_R16G16B16A16_SFLOAT,pe as VK_FORMAT_R16G16B16A16_SINT,ce as VK_FORMAT_R16G16B16A16_SNORM,_e as VK_FORMAT_R16G16B16A16_UINT,Ue as VK_FORMAT_R16G16B16A16_UNORM,he as VK_FORMAT_R16G16B16_SFLOAT,fe as VK_FORMAT_R16G16B16_SINT,oe as VK_FORMAT_R16G16B16_SNORM,le as VK_FORMAT_R16G16B16_UINT,re as VK_FORMAT_R16G16B16_UNORM,ae as VK_FORMAT_R16G16_SFLOAT,se as VK_FORMAT_R16G16_SINT,ne as VK_FORMAT_R16G16_SNORM,ie as VK_FORMAT_R16G16_UINT,ee as VK_FORMAT_R16G16_UNORM,te as VK_FORMAT_R16_SFLOAT,$t as VK_FORMAT_R16_SINT,Qt as VK_FORMAT_R16_SNORM,Zt as VK_FORMAT_R16_UINT,Jt as VK_FORMAT_R16_UNORM,Ae as VK_FORMAT_R32G32B32A32_SFLOAT,ve as VK_FORMAT_R32G32B32A32_SINT,Le as VK_FORMAT_R32G32B32A32_UINT,Be as VK_FORMAT_R32G32B32_SFLOAT,De as VK_FORMAT_R32G32B32_SINT,me as VK_FORMAT_R32G32B32_UINT,we as VK_FORMAT_R32G32_SFLOAT,de as VK_FORMAT_R32G32_SINT,be as VK_FORMAT_R32G32_UINT,ue as VK_FORMAT_R32_SFLOAT,xe as VK_FORMAT_R32_SINT,ye as VK_FORMAT_R32_UINT,at as VK_FORMAT_R4G4B4A4_UNORM_PACK16,st as VK_FORMAT_R4G4_UNORM_PACK8,ft as VK_FORMAT_R5G5B5A1_UNORM_PACK16,ot as VK_FORMAT_R5G6B5_UNORM_PACK16,ze as VK_FORMAT_R64G64B64A64_SFLOAT,Pe as VK_FORMAT_R64G64B64A64_SINT,Me as VK_FORMAT_R64G64B64A64_UINT,Ce as VK_FORMAT_R64G64B64_SFLOAT,Te as VK_FORMAT_R64G64B64_SINT,Ee as VK_FORMAT_R64G64B64_UINT,Oe as VK_FORMAT_R64G64_SFLOAT,Fe as VK_FORMAT_R64G64_SINT,Se as VK_FORMAT_R64G64_UINT,Ie as VK_FORMAT_R64_SFLOAT,Ve as VK_FORMAT_R64_SINT,ke as VK_FORMAT_R64_UINT,Tt as VK_FORMAT_R8G8B8A8_SINT,Ot as VK_FORMAT_R8G8B8A8_SNORM,Ct as VK_FORMAT_R8G8B8A8_SRGB,Et as VK_FORMAT_R8G8B8A8_UINT,Ft as VK_FORMAT_R8G8B8A8_UNORM,Lt as VK_FORMAT_R8G8B8_SINT,Dt as VK_FORMAT_R8G8B8_SNORM,vt as VK_FORMAT_R8G8B8_SRGB,Bt as VK_FORMAT_R8G8B8_UINT,mt as VK_FORMAT_R8G8B8_UNORM,dt as VK_FORMAT_R8G8_SINT,ut as VK_FORMAT_R8G8_SNORM,wt as VK_FORMAT_R8G8_SRGB,bt as VK_FORMAT_R8G8_UINT,xt as VK_FORMAT_R8G8_UNORM,gt as VK_FORMAT_R8_SINT,_t as VK_FORMAT_R8_SNORM,yt as VK_FORMAT_R8_SRGB,pt as VK_FORMAT_R8_UINT,ct as VK_FORMAT_R8_UNORM,Re as VK_FORMAT_S8_UINT,it as VK_FORMAT_UNDEFINED,Ke as VK_FORMAT_X8_D24_UNORM_PACK32,Pi as read,Wi as write};\n","let A,I,B;const g={env:{emscripten_notify_memory_growth:function(A){B=new Uint8Array(I.exports.memory.buffer)}}};class Q{init(){return A||(A=\"undefined\"!=typeof fetch?fetch(\"data:application/wasm;base64,\"+C).then(A=>A.arrayBuffer()).then(A=>WebAssembly.instantiate(A,g)).then(this._init):WebAssembly.instantiate(Buffer.from(C,\"base64\"),g).then(this._init),A)}_init(A){I=A.instance,g.env.emscripten_notify_memory_growth(0)}decode(A,g=0){if(!I)throw new Error(\"ZSTDDecoder: Await .init() before decoding.\");const Q=A.byteLength,C=I.exports.malloc(Q);B.set(A,C),g=g||Number(I.exports.ZSTD_findDecompressedSize(C,Q));const E=I.exports.malloc(g),i=I.exports.ZSTD_decompress(E,g,C,Q),D=B.slice(E,E+i);return I.exports.free(C),I.exports.free(E),D}}const C=\"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IAMNACAEQQNxBEADQCACRQ0FIAAgAkF/aiICaiIDIAEgAmotAAA6AAAgA0EDcQ0ACwsgAkEDTQ0AA0AgACACQXxqIgJqIAEgAmooAgA2AgAgAkEDSw0ACwsgAkUNAgNAIAAgAkF/aiICaiABIAJqLQAAOgAAIAINAAsMAgsgAkEDTQ0AIAIhBANAIAMgASgCADYCACABQQRqIQEgA0EEaiEDIARBfGoiBEEDSw0ACyACQQNxIQILIAJFDQADQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQX9qIgINAAsLIAAL8wICAn8BfgJAIAJFDQAgACACaiIDQX9qIAE6AAAgACABOgAAIAJBA0kNACADQX5qIAE6AAAgACABOgABIANBfWogAToAACAAIAE6AAIgAkEHSQ0AIANBfGogAToAACAAIAE6AAMgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa0iBUIghiAFhCEFIAMgBGohAQNAIAEgBTcDGCABIAU3AxAgASAFNwMIIAEgBTcDACABQSBqIQEgAkFgaiICQR9LDQALCyAACy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAIajYCACADCy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAFajYCACADCx8AIAAgASACKAIEEAg2AgAgARAEGiAAIAJBCGo2AgQLCAAgAGdBH3MLugUBDX8jAEEQayIKJAACfyAEQQNNBEAgCkEANgIMIApBDGogAyAEEAsaIAAgASACIApBDGpBBBAVIgBBbCAAEAMbIAAgACAESxsMAQsgAEEAIAEoAgBBAXRBAmoQECENQVQgAygAACIGQQ9xIgBBCksNABogAiAAQQVqNgIAIAMgBGoiAkF8aiEMIAJBeWohDiACQXtqIRAgAEEGaiELQQQh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ASIDNgLE4AEgACgCvOABIQQgACABNgK84AEgACABIAJqNgK44AEgACABIAQgA2tqNgLA4AELpgEBAX8gACAAKALs4QEQFjYCyOABIABCADcD+OABIABCADcDuOABIABBwOABakIANwMAIABBqNAAaiIBQYyAgOAANgIAIABBADYCmOIBIABCADcDiOEBIABCAzcDgOEBIABBrNABakHgEikCADcCACAAQbTQAWpB6BIoAgA2AgAgACABNgIMIAAgAEGYIGo2AgggACAAQaAwajYCBCAAIABBEGo2AgALYQEBf0G4fyEDAkAgAUEDSQ0AIAIgABAhIgFBA3YiADYCCCACIAFBAXE2AgQgAiABQQF2QQNxIgM2AgACQCADQX9qIgFBAksNAAJAIAFBAWsOAgEAAgtBbA8LIAAhAwsgAwsMACAAIAEgAkEAEC4LiAQCA38CfiADEBYhBCAAQQBBKBAQIQAgBCACSwRAIAQPCyABRQRAQX8PCwJAAkAgA0EBRg0AIAEoAAAiBkGo6r5pRg0AQXYhAyAGQXBxQdDUtMIBRw0BQQghAyACQQhJDQEgAEEAQSgQECEAIAEoAAQhASAAQQE2AhQgACABrTcDAEEADwsgASACIAMQLyIDIAJLDQAgACADNgIYQXIhAyABIARqIgVBf2otAAAiAkEIcQ0AIAJBIHEiBkUEQEFwIQMgBS0AACIFQacBSw0BIAVBB3GtQgEgBUEDdkEKaq2GIgdCA4h+IAd8IQggBEEBaiEECyACQQZ2IQMgAkECdiEFAkAgAkEDcUF/aiICQQJLBEBBACECDAELAkACQAJAIAJBAWsOAgECAAsgASAEai0AACECIARBAWohBAwCCyABIARqLwAAIQIgBEECaiEEDAELIAEgBGooAAAhAiAEQQRqIQQLIAVBAXEhBQJ+AkACQAJAIANBf2oiA0ECTQRAIANBAWsOAgIDAQtCfyAGRQ0DGiABIARqMQAADAMLIAEgBGovAACtQoACfAwCCyABIARqKAAArQwBCyABIARqKQAACyEHIAAgBTYCICAAIAI2AhwgACAHNwMAQQAhAyAAQQA2AhQgACAHIAggBhsiBzcDCCAAIAdCgIAIIAdCgIAIVBs+AhALIAMLWwEBf0G4fyEDIAIQFiICIAFNBH8gACACakF/ai0AACIAQQNxQQJ0QaAeaigC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C0Egak8NAQsgByAHKQNoNwMQIAcgBykDYDcDCCAEIA0gB0EIaiAHQdwAaiAPIA4gESAQEB4hCwwBCyACIARqIQggBCAKEAcgAkERTwRAIARBEGohAgNAIAIgCkEQaiIKEAcgAkEQaiICIAhJDQALCyAIIAlrIQIgByATNgJcIAkgCCAOa0sEQCAJIAggEWtLBEBBbCELDAILIBAgAiAOayICaiIKIANqIBBNBEAgCCAKIAMQDxoMAgsgCCAKQQAgAmsQDyEIIAcgAiADaiIDNgJkIAggAmshCCAOIQILIAlBEE8EQCADIAhqIQMDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALDAELAkAgCUEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgCUECdCIDQcAeaigCAGoiAhAXIAIgA0HgHmooAgBrIQIgBygCZCEDDAELIAggAhAMCyADQQlJDQAgAyAIaiEDIAhBCGoiCCACQQhqIgJrQQ9MBEADQCAIIAIQDCACQQhqIQIgCEEIaiIIIANJDQAMAgALAAsDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALCyAHQRhqEAQaIAsgDCALEAMiAhshDCAEIAQgC2ogAhshBCAFQX9qIgUNAAsgDBADDQFBbCEMIAdBGGoQBEECSQ0BQQAhCANAIAhBA0cEQCAAIAhBAnQiAmpBrNABaiACIAdqKAJENgIAIAhBAWohCAwBCwsgBygCXCEIC0G6fyEMIA8gCGsiACANIARrSw0AIAQEfyAEIAggABALIABqBUEACyABayEMCyAHQfAAaiQAIAwLkRcCFn8FfiMAQdABayIHJAAgByAAKALw4QEiCDYCvAEgASACaiESIAggACgCgOIBaiETAkACQCAFRQRAIAEhAwwBCyAAKALE4AEhESAAKALA4AEhFSAAKAK84AEhDyAAQQE2AozhAUEAIQgDQCAIQQNHBEAgByAIQQJ0IgJqIAAgAmpBrNABaigCADYCVCAIQQFqIQgMAQsLIAcgETYCZCAHIA82AmAgByABIA9rNgJoQWwhECAHQShqIAMgBBAGEAMNASAFQQQgBUEESBshFyAHQTxqIAdBKGogACgCABATIAdBxABqIAdBKGogACgCCBATIAdBzABqIAdB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IAdB0AFqJAAgEAslACAAQgA3AgAgAEEAOwEIIABBADoACyAAIAE2AgwgACACOgAKC7QFAQN/IwBBMGsiBCQAIABB/wFqIgVBfWohBgJAIAMvAQIEQCAEQRhqIAEgAhAGIgIQAw0BIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahASOgAAIAMgBEEIaiAEQRhqEBI6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0FIAEgBEEQaiAEQRhqEBI6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBSABIARBCGogBEEYahASOgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEjoAACABIAJqIABrIQIMAwsgAyAEQRBqIARBGGoQEjoAAiADIARBCGogBEEYahASOgADIANBBGohAwwAAAsACyAEQRhqIAEgAhAGIgIQAw0AIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahAROgAAIAMgBEEIaiAEQRhqEBE6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0EIAEgBEEQaiAEQRhqEBE6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBCABIARBCGogBEEYahAROgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEToAACABIAJqIABrIQIMAgsgAyAEQRBqIARBGGoQEToAAiADIARBCGogBEEYahAROgADIANBBGohAwwAAAsACyAEQTBqJAAgAgtpAQF/An8CQAJAIAJBB00NACABKAAAQbfIwuF+Rw0AIAAgASgABDYCmOIBQWIgAEEQaiABIAIQPiIDEAMNAhogAEKBgICAEDcDiOEBIAAgASADaiACIANrECoMAQsgACABIAIQKgtBAAsLrQMBBn8jAEGAAWsiAyQAQWIhCAJAIAJBCUkNACAAQZjQAGogAUEIaiIEIAJBeGogAEGY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wOABCwutAgIEfwF+IwBBQGoiBCQAAkACQCACQQhJDQAgASgAAEFwcUHQ1LTCAUcNACABIAIQIiEBIABCADcDCCAAQQA2AgQgACABNgIADAELIARBGGogASACEC0iAxADBEAgACADEBoMAQsgAwRAIABBuH8QGgwBCyACIAQoAjAiA2shAiABIANqIQMDQAJAIAAgAyACIARBCGoQLCIFEAMEfyAFBSACIAVBA2oiBU8NAUG4fwsQGgwCCyAGQQFqIQYgAiAFayECIAMgBWohAyAEKAIMRQ0ACyAEKAI4BEAgAkEDTQRAIABBuH8QGgwCCyADQQRqIQMLIAQoAighAiAEKQMYIQcgAEEANgIEIAAgAyABazYCACAAIAIgBmytIAcgB0J/URs3AwgLIARBQGskAAslAQF/IwBBEGsiAiQAIAIgACABEFEgAigCACEAIAJBEGokACAAC30BBH8jAEGQBGsiBCQAIARB/wE2AggCQCAEQRBqIARBCGogBEEMaiABIAIQFSIGEAMEQCAGIQUMAQtBVCEFIAQoAgwiB0EGSw0AIAMgBEEQaiAEKAIIIAcQQSIFEAMNACAAIAEgBmogAiAGayADEDwhBQsgBEGQBGokACAFC4cBAgJ/An5BABAWIQMCQANAIAEgA08EQAJAIAAoAABBcHFB0NS0wgFGBEAgACABECIiAhADRQ0BQn4PCyAAIAEQVSIEQn1WDQMgBCAFfCIFIARUIQJCfiEEIAINAyAAIAEQUiICEAMNAwsgASACayEBIAAgAmohAAwBCwtCfiAFIAEbIQQLIAQLPwIBfwF+IwBBMGsiAiQAAn5CfiACQQhqIAAgARAtDQAaQgAgAigCHEEBRg0AGiACKQMICyEDIAJBMGokACADC40BAQJ/IwBBMGsiASQAAkAgAEUNACAAKAKI4gENACABIABB/OEBaigCADYCKCABIAApAvThATcDICAAEDAgACgCqOIBIQIgASABKAIoNgIYIAEgASkDIDcDECACIAFBEGoQGyAAQQA2AqjiASABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALKgECfyMAQRBrIgAkACAAQQA2AgggAEIANwMAIAAQWCEBIABBEGokACABC4cBAQN/IwBBEGsiAiQAAkAgACgCAEUgACgCBEVzDQAgAiAAKAIINgIIIAIgACkCADcDAAJ/IAIoAgAiAQRAIAIoAghBqOMJIAERBQAMAQtBqOMJECgLIgFFDQAgASAAKQIANwL04QEgAUH84QFqIAAoAgg2AgAgARBZIAEhAwsgAkEQaiQAIAMLywEBAn8jAEEgayIBJAAgAEGBgIDAADYCtOIBIABBADYCiOIBIABBADYC7OEBIABCADcDkOIBIABBADYCpOMJIABBADYC3OIBIABCADcCzOIBIABBADYCvOIBIABBADYCxOABIABCADcCnOIBIABBpOIBakIANwIAIABBrOIBakEANgIAIAFCADcCECABQgA3AhggASABKQMYNwMIIAEgASkDEDcDACABKAIIQQh2QQFxIQIgAEEANgLg4gEgACACNgKM4gEgAUEgaiQAC3YBA38jAEEwayIBJAAgAARAIAEgAEHE0AFqIgIoAgA2AiggASAAKQK80AE3AyAgACgCACEDIAEgAigCADYCGCABIAApArzQATcDECADIAFBEGoQGyABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALzAEBAX8gACABKAK00AE2ApjiASAAIAEoAgQiAjYCwOABIAAgAjYCvOABIAAgAiABKAIIaiICNgK44AEgACACNgLE4AEgASgCuNABBEAgAEKBgICAEDcDiOEBIAAgAUGk0ABqNgIMIAAgAUGUIGo2AgggACABQZwwajYCBCAAIAFBDGo2AgAgAEGs0AFqIAFBqNABaigCADYCACAAQbDQAWogAUGs0AFqKAIANgIAIABBtNABaiABQbDQAWooAgA2AgAPCyAAQgA3A4jhAQs7ACACRQRAQbp/DwsgBEUEQEFsDwsgAiAEEGAEQCAAIAEgAiADIAQgBRBhDwsgACABIAIgAyAEIAUQZQtGAQF/IwBBEGsiBSQAIAVBCGogBBAOAn8gBS0ACQRAIAAgASACIAMgBBAyDAELIAAgASACIAMgBBA0CyEAIAVBEGokACAACzQAIAAgAyAEIAUQNiIFEAMEQCAFDwsgBSAESQR/IAEgAiADIAVqIAQgBWsgABA1BUG4fwsLRgEBfyMAQRBrIgUkACAFQQhqIAQQDgJ/IAUtAAkEQCAAIAEgAiADIAQQYgwBCyAAIAEgAiADIAQQNQshACAFQRBqJAAgAAtZAQF/QQ8hAiABIABJBEAgAUEE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\";export{Q as ZSTDDecoder};\n","/**\n * Loader for KTX 2.0 GPU Texture containers.\n *\n * KTX 2.0 is a container format for various GPU texture formats. The loader\n * supports Basis Universal GPU textures, which can be quickly transcoded to\n * a wide variety of GPU texture compression formats, as well as some\n * uncompressed DataTexture and Data3DTexture formats.\n *\n * References:\n * - KTX: http://github.khronos.org/KTX-Specification/\n * - DFD: https://www.khronos.org/registry/DataFormat/specs/1.3/dataformat.1.3.html#basicdescriptor\n * - BasisU HDR: https://github.com/BinomialLLC/basis_universal/wiki/UASTC-HDR-Texture-Specification-v1.0\n */\n\nimport {\n\tCompressedTexture,\n\tCompressedArrayTexture,\n\tCompressedCubeTexture,\n\tData3DTexture,\n\tDataTexture,\n\tFileLoader,\n\tFloatType,\n\tHalfFloatType,\n\tNoColorSpace,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearSRGBColorSpace,\n\tLoader,\n\tRedFormat,\n\tRGB_BPTC_UNSIGNED_Format,\n\tRGB_ETC1_Format,\n\tRGB_ETC2_Format,\n\tRGB_PVRTC_4BPPV1_Format,\n\tRGBA_ASTC_4x4_Format,\n\tRGBA_ASTC_6x6_Format,\n\tRGBA_BPTC_Format,\n\tRGBA_ETC2_EAC_Format,\n\tRGBA_PVRTC_4BPPV1_Format,\n\tRGBA_S3TC_DXT5_Format,\n\tRGBA_S3TC_DXT1_Format,\n\tRGBAFormat,\n\tRGFormat,\n\tSRGBColorSpace,\n\tUnsignedByteType,\n} from 'three';\nimport { WorkerPool } from '../utils/WorkerPool.js';\nimport {\n\tread,\n\tKHR_DF_FLAG_ALPHA_PREMULTIPLIED,\n\tKHR_DF_TRANSFER_SRGB,\n\tKHR_SUPERCOMPRESSION_NONE,\n\tKHR_SUPERCOMPRESSION_ZSTD,\n\tVK_FORMAT_UNDEFINED,\n\tVK_FORMAT_R16_SFLOAT,\n\tVK_FORMAT_R16G16_SFLOAT,\n\tVK_FORMAT_R16G16B16A16_SFLOAT,\n\tVK_FORMAT_R32_SFLOAT,\n\tVK_FORMAT_R32G32_SFLOAT,\n\tVK_FORMAT_R32G32B32A32_SFLOAT,\n\tVK_FORMAT_R8_SRGB,\n\tVK_FORMAT_R8_UNORM,\n\tVK_FORMAT_R8G8_SRGB,\n\tVK_FORMAT_R8G8_UNORM,\n\tVK_FORMAT_R8G8B8A8_SRGB,\n\tVK_FORMAT_R8G8B8A8_UNORM,\n\tVK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT,\n\tVK_FORMAT_ASTC_6x6_SRGB_BLOCK,\n\tVK_FORMAT_ASTC_6x6_UNORM_BLOCK,\n\tKHR_DF_PRIMARIES_UNSPECIFIED,\n\tKHR_DF_PRIMARIES_BT709,\n\tKHR_DF_PRIMARIES_DISPLAYP3\n} from '../libs/ktx-parse.module.js';\nimport { ZSTDDecoder } from '../libs/zstddec.module.js';\nimport { DisplayP3ColorSpace, LinearDisplayP3ColorSpace } from '../math/ColorSpaces.js';\n\nconst _taskCache = new WeakMap();\n\nlet _activeLoaders = 0;\n\nlet _zstd;\n\nclass KTX2Loader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.transcoderPath = '';\n\t\tthis.transcoderBinary = null;\n\t\tthis.transcoderPending = null;\n\n\t\tthis.workerPool = new WorkerPool();\n\t\tthis.workerSourceURL = '';\n\t\tthis.workerConfig = null;\n\n\t\tif ( typeof MSC_TRANSCODER !== 'undefined' ) {\n\n\t\t\tconsole.warn(\n\n\t\t\t\t'THREE.KTX2Loader: Please update to latest \"basis_transcoder\".'\n\t\t\t\t+ ' \"msc_basis_transcoder\" is no longer supported in three.js r125+.'\n\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\tsetTranscoderPath( path ) {\n\n\t\tthis.transcoderPath = path;\n\n\t\treturn this;\n\n\t}\n\n\tsetWorkerLimit( num ) {\n\n\t\tthis.workerPool.setWorkerLimit( num );\n\n\t\treturn this;\n\n\t}\n\n\tasync detectSupportAsync( renderer ) {\n\n\t\tthis.workerConfig = {\n\t\t\tastcSupported: await renderer.hasFeatureAsync( 'texture-compression-astc' ),\n\t\t\tastcHDRSupported: false, // https://github.com/gpuweb/gpuweb/issues/3856\n\t\t\tetc1Supported: await renderer.hasFeatureAsync( 'texture-compression-etc1' ),\n\t\t\tetc2Supported: await renderer.hasFeatureAsync( 'texture-compression-etc2' ),\n\t\t\tdxtSupported: await renderer.hasFeatureAsync( 'texture-compression-bc' ),\n\t\t\tbptcSupported: await renderer.hasFeatureAsync( 'texture-compression-bptc' ),\n\t\t\tpvrtcSupported: await renderer.hasFeatureAsync( 'texture-compression-pvrtc' )\n\t\t};\n\n\t\treturn this;\n\n\t}\n\n\tdetectSupport( renderer ) {\n\n\t\tif ( renderer.isWebGPURenderer === true ) {\n\n\t\t\tthis.workerConfig = {\n\t\t\t\tastcSupported: renderer.hasFeature( 'texture-compression-astc' ),\n\t\t\t\tastcHDRSupported: false, // https://github.com/gpuweb/gpuweb/issues/3856\n\t\t\t\tetc1Supported: renderer.hasFeature( 'texture-compression-etc1' ),\n\t\t\t\tetc2Supported: renderer.hasFeature( 'texture-compression-etc2' ),\n\t\t\t\tdxtSupported: renderer.hasFeature( 'texture-compression-bc' ),\n\t\t\t\tbptcSupported: renderer.hasFeature( 'texture-compression-bptc' ),\n\t\t\t\tpvrtcSupported: renderer.hasFeature( 'texture-compression-pvrtc' )\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tthis.workerConfig = {\n\t\t\t\tastcSupported: renderer.extensions.has( 'WEBGL_compressed_texture_astc' ),\n\t\t\t\tastcHDRSupported: renderer.extensions.has( 'WEBGL_compressed_texture_astc' )\n\t\t\t\t\t&& renderer.extensions.get( 'WEBGL_compressed_texture_astc' ).getSupportedProfiles().includes( 'hdr' ),\n\t\t\t\tetc1Supported: renderer.extensions.has( 'WEBGL_compressed_texture_etc1' ),\n\t\t\t\tetc2Supported: renderer.extensions.has( 'WEBGL_compressed_texture_etc' ),\n\t\t\t\tdxtSupported: renderer.extensions.has( 'WEBGL_compressed_texture_s3tc' ),\n\t\t\t\tbptcSupported: renderer.extensions.has( 'EXT_texture_compression_bptc' ),\n\t\t\t\tpvrtcSupported: renderer.extensions.has( 'WEBGL_compressed_texture_pvrtc' )\n\t\t\t\t\t|| renderer.extensions.has( 'WEBKIT_WEBGL_compressed_texture_pvrtc' )\n\t\t\t};\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tinit() {\n\n\t\tif ( ! this.transcoderPending ) {\n\n\t\t\t// Load transcoder wrapper.\n\t\t\tconst jsLoader = new FileLoader( this.manager );\n\t\t\tjsLoader.setPath( this.transcoderPath );\n\t\t\tjsLoader.setWithCredentials( this.withCredentials );\n\t\t\tconst jsContent = jsLoader.loadAsync( 'basis_transcoder.js' );\n\n\t\t\t// Load transcoder WASM binary.\n\t\t\tconst binaryLoader = new FileLoader( this.manager );\n\t\t\tbinaryLoader.setPath( this.transcoderPath );\n\t\t\tbinaryLoader.setResponseType( 'arraybuffer' );\n\t\t\tbinaryLoader.setWithCredentials( this.withCredentials );\n\t\t\tconst binaryContent = binaryLoader.loadAsync( 'basis_transcoder.wasm' );\n\n\t\t\tthis.transcoderPending = Promise.all( [ jsContent, binaryContent ] )\n\t\t\t\t.then( ( [ jsContent, binaryContent ] ) => {\n\n\t\t\t\t\tconst fn = KTX2Loader.BasisWorker.toString();\n\n\t\t\t\t\tconst body = [\n\t\t\t\t\t\t'/* constants */',\n\t\t\t\t\t\t'let _EngineFormat = ' + JSON.stringify( KTX2Loader.EngineFormat ),\n\t\t\t\t\t\t'let _EngineType = ' + JSON.stringify( KTX2Loader.EngineType ),\n\t\t\t\t\t\t'let _TranscoderFormat = ' + JSON.stringify( KTX2Loader.TranscoderFormat ),\n\t\t\t\t\t\t'let _BasisFormat = ' + JSON.stringify( KTX2Loader.BasisFormat ),\n\t\t\t\t\t\t'/* basis_transcoder.js */',\n\t\t\t\t\t\tjsContent,\n\t\t\t\t\t\t'/* worker */',\n\t\t\t\t\t\tfn.substring( fn.indexOf( '{' ) + 1, fn.lastIndexOf( '}' ) )\n\t\t\t\t\t].join( '\\n' );\n\n\t\t\t\t\tthis.workerSourceURL = URL.createObjectURL( new Blob( [ body ] ) );\n\t\t\t\t\tthis.transcoderBinary = binaryContent;\n\n\t\t\t\t\tthis.workerPool.setWorkerCreator( () => {\n\n\t\t\t\t\t\tconst worker = new Worker( this.workerSourceURL );\n\t\t\t\t\t\tconst transcoderBinary = this.transcoderBinary.slice( 0 );\n\n\t\t\t\t\t\tworker.postMessage( { type: 'init', config: this.workerConfig, transcoderBinary }, [ transcoderBinary ] );\n\n\t\t\t\t\t\treturn worker;\n\n\t\t\t\t\t} );\n\n\t\t\t\t} );\n\n\t\t\tif ( _activeLoaders > 0 ) {\n\n\t\t\t\t// Each instance loads a transcoder and allocates workers, increasing network and memory cost.\n\n\t\t\t\tconsole.warn(\n\n\t\t\t\t\t'THREE.KTX2Loader: Multiple active KTX2 loaders may cause performance issues.'\n\t\t\t\t\t+ ' Use a single KTX2Loader instance, or call .dispose() on old instances.'\n\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t_activeLoaders ++;\n\n\t\t}\n\n\t\treturn this.transcoderPending;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( this.workerConfig === null ) {\n\n\t\t\tthrow new Error( 'THREE.KTX2Loader: Missing initialization with `.detectSupport( renderer )`.' );\n\n\t\t}\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, ( buffer ) => {\n\n\t\t\tthis.parse( buffer, onLoad, onError );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( buffer, onLoad, onError ) {\n\n\t\tif ( this.workerConfig === null ) {\n\n\t\t\tthrow new Error( 'THREE.KTX2Loader: Missing initialization with `.detectSupport( renderer )`.' );\n\n\t\t}\n\n\t\t// Check for an existing task using this buffer. A transferred buffer cannot be transferred\n\t\t// again from this thread.\n\t\tif ( _taskCache.has( buffer ) ) {\n\n\t\t\tconst cachedTask = _taskCache.get( buffer );\n\n\t\t\treturn cachedTask.promise.then( onLoad ).catch( onError );\n\n\t\t}\n\n\t\tthis._createTexture( buffer )\n\t\t\t.then( ( texture ) => onLoad ? onLoad( texture ) : null )\n\t\t\t.catch( onError );\n\n\t}\n\n\t_createTextureFrom( transcodeResult, container ) {\n\n\t\tconst { type: messageType, error, data: { faces, width, height, format, type, dfdFlags } } = transcodeResult;\n\n\t\tif ( messageType === 'error' ) return Promise.reject( error );\n\n\t\tlet texture;\n\n\t\tif ( container.faceCount === 6 ) {\n\n\t\t\ttexture = new CompressedCubeTexture( faces, format, type );\n\n\t\t} else {\n\n\t\t\tconst mipmaps = faces[ 0 ].mipmaps;\n\n\t\t\ttexture = container.layerCount > 1\n\t\t\t\t? new CompressedArrayTexture( mipmaps, width, height, container.layerCount, format, type )\n\t\t\t\t: new CompressedTexture( mipmaps, width, height, format, type );\n\n\t\t}\n\n\t\ttexture.minFilter = faces[ 0 ].mipmaps.length === 1 ? LinearFilter : LinearMipmapLinearFilter;\n\t\ttexture.magFilter = LinearFilter;\n\t\ttexture.generateMipmaps = false;\n\n\t\ttexture.needsUpdate = true;\n\t\ttexture.colorSpace = parseColorSpace( container );\n\t\ttexture.premultiplyAlpha = !! ( dfdFlags & KHR_DF_FLAG_ALPHA_PREMULTIPLIED );\n\n\t\treturn texture;\n\n\t}\n\n\t/**\n\t * @param {ArrayBuffer} buffer\n\t * @param {object?} config\n\t * @return {Promise<CompressedTexture|CompressedArrayTexture|DataTexture|Data3DTexture>}\n\t */\n\tasync _createTexture( buffer, config = {} ) {\n\n\t\tconst container = read( new Uint8Array( buffer ) );\n\n\t\t// Basis UASTC HDR is a subset of ASTC, which can be transcoded efficiently\n\t\t// to BC6H. To detect whether a KTX2 file uses Basis UASTC HDR, or default\n\t\t// ASTC, inspect the DFD color model.\n\t\t//\n\t\t// Source: https://github.com/BinomialLLC/basis_universal/issues/381\n\t\tconst isBasisHDR = container.vkFormat === VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT\n\t\t\t&& container.dataFormatDescriptor[ 0 ].colorModel === 0xA7;\n\n\t\t// If the device supports ASTC, Basis UASTC HDR requires no transcoder.\n\t\tconst needsTranscoder = container.vkFormat === VK_FORMAT_UNDEFINED\n\t\t\t|| isBasisHDR && ! this.workerConfig.astcHDRSupported;\n\n\t\tif ( ! needsTranscoder ) {\n\n\t\t\treturn createRawTexture( container );\n\n\t\t}\n\n\t\t//\n\t\tconst taskConfig = config;\n\t\tconst texturePending = this.init().then( () => {\n\n\t\t\treturn this.workerPool.postMessage( { type: 'transcode', buffer, taskConfig: taskConfig }, [ buffer ] );\n\n\t\t} ).then( ( e ) => this._createTextureFrom( e.data, container ) );\n\n\t\t// Cache the task result.\n\t\t_taskCache.set( buffer, { promise: texturePending } );\n\n\t\treturn texturePending;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.workerPool.dispose();\n\t\tif ( this.workerSourceURL ) URL.revokeObjectURL( this.workerSourceURL );\n\n\t\t_activeLoaders --;\n\n\t\treturn this;\n\n\t}\n\n}\n\n\n/* CONSTANTS */\n\nKTX2Loader.BasisFormat = {\n\tETC1S: 0,\n\tUASTC: 1,\n\tUASTC_HDR: 2,\n};\n\n// Source: https://github.com/BinomialLLC/basis_universal/blob/master/webgl/texture_test/index.html\nKTX2Loader.TranscoderFormat = {\n\tETC1: 0,\n\tETC2: 1,\n\tBC1: 2,\n\tBC3: 3,\n\tBC4: 4,\n\tBC5: 5,\n\tBC7_M6_OPAQUE_ONLY: 6,\n\tBC7_M5: 7,\n\tPVRTC1_4_RGB: 8,\n\tPVRTC1_4_RGBA: 9,\n\tASTC_4x4: 10,\n\tATC_RGB: 11,\n\tATC_RGBA_INTERPOLATED_ALPHA: 12,\n\tRGBA32: 13,\n\tRGB565: 14,\n\tBGR565: 15,\n\tRGBA4444: 16,\n\tBC6H: 22,\n\tRGB_HALF: 24,\n\tRGBA_HALF: 25,\n};\n\nKTX2Loader.EngineFormat = {\n\tRGBAFormat: RGBAFormat,\n\tRGBA_ASTC_4x4_Format: RGBA_ASTC_4x4_Format,\n\tRGB_BPTC_UNSIGNED_Format: RGB_BPTC_UNSIGNED_Format,\n\tRGBA_BPTC_Format: RGBA_BPTC_Format,\n\tRGBA_ETC2_EAC_Format: RGBA_ETC2_EAC_Format,\n\tRGBA_PVRTC_4BPPV1_Format: RGBA_PVRTC_4BPPV1_Format,\n\tRGBA_S3TC_DXT5_Format: RGBA_S3TC_DXT5_Format,\n\tRGB_ETC1_Format: RGB_ETC1_Format,\n\tRGB_ETC2_Format: RGB_ETC2_Format,\n\tRGB_PVRTC_4BPPV1_Format: RGB_PVRTC_4BPPV1_Format,\n\tRGBA_S3TC_DXT1_Format: RGBA_S3TC_DXT1_Format,\n};\n\nKTX2Loader.EngineType = {\n\tUnsignedByteType: UnsignedByteType,\n\tHalfFloatType: HalfFloatType,\n\tFloatType: FloatType,\n};\n\n/* WEB WORKER */\n\nKTX2Loader.BasisWorker = function () {\n\n\tlet config;\n\tlet transcoderPending;\n\tlet BasisModule;\n\n\tconst EngineFormat = _EngineFormat; // eslint-disable-line no-undef\n\tconst EngineType = _EngineType; // eslint-disable-line no-undef\n\tconst TranscoderFormat = _TranscoderFormat; // eslint-disable-line no-undef\n\tconst BasisFormat = _BasisFormat; // eslint-disable-line no-undef\n\n\tself.addEventListener( 'message', function ( e ) {\n\n\t\tconst message = e.data;\n\n\t\tswitch ( message.type ) {\n\n\t\t\tcase 'init':\n\t\t\t\tconfig = message.config;\n\t\t\t\tinit( message.transcoderBinary );\n\t\t\t\tbreak;\n\n\t\t\tcase 'transcode':\n\t\t\t\ttranscoderPending.then( () => {\n\n\t\t\t\t\ttry {\n\n\t\t\t\t\t\tconst { faces, buffers, width, height, hasAlpha, format, type, dfdFlags } = transcode( message.buffer );\n\n\t\t\t\t\t\tself.postMessage( { type: 'transcode', id: message.id, data: { faces, width, height, hasAlpha, format, type, dfdFlags } }, buffers );\n\n\t\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t\tconsole.error( error );\n\n\t\t\t\t\t\tself.postMessage( { type: 'error', id: message.id, error: error.message } );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t} );\n\n\tfunction init( wasmBinary ) {\n\n\t\ttranscoderPending = new Promise( ( resolve ) => {\n\n\t\t\tBasisModule = { wasmBinary, onRuntimeInitialized: resolve };\n\t\t\tBASIS( BasisModule ); // eslint-disable-line no-undef\n\n\t\t} ).then( () => {\n\n\t\t\tBasisModule.initializeBasis();\n\n\t\t\tif ( BasisModule.KTX2File === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.KTX2Loader: Please update Basis Universal transcoder.' );\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tfunction transcode( buffer ) {\n\n\t\tconst ktx2File = new BasisModule.KTX2File( new Uint8Array( buffer ) );\n\n\t\tfunction cleanup() {\n\n\t\t\tktx2File.close();\n\t\t\tktx2File.delete();\n\n\t\t}\n\n\t\tif ( ! ktx2File.isValid() ) {\n\n\t\t\tcleanup();\n\t\t\tthrow new Error( 'THREE.KTX2Loader:\tInvalid or unsupported .ktx2 file' );\n\n\t\t}\n\n\t\tlet basisFormat;\n\n\t\tif ( ktx2File.isUASTC() ) {\n\n\t\t\tbasisFormat = BasisFormat.UASTC;\n\n\t\t} else if ( ktx2File.isETC1S() ) {\n\n\t\t\tbasisFormat = BasisFormat.ETC1S;\n\n\t\t} else if ( ktx2File.isHDR() ) {\n\n\t\t\tbasisFormat = BasisFormat.UASTC_HDR;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.KTX2Loader: Unknown Basis encoding' );\n\n\t\t}\n\n\t\tconst width = ktx2File.getWidth();\n\t\tconst height = ktx2File.getHeight();\n\t\tconst layerCount = ktx2File.getLayers() || 1;\n\t\tconst levelCount = ktx2File.getLevels();\n\t\tconst faceCount = ktx2File.getFaces();\n\t\tconst hasAlpha = ktx2File.getHasAlpha();\n\t\tconst dfdFlags = ktx2File.getDFDFlags();\n\n\t\tconst { transcoderFormat, engineFormat, engineType } = getTranscoderFormat( basisFormat, width, height, hasAlpha );\n\n\t\tif ( ! width || ! height || ! levelCount ) {\n\n\t\t\tcleanup();\n\t\t\tthrow new Error( 'THREE.KTX2Loader:\tInvalid texture' );\n\n\t\t}\n\n\t\tif ( ! ktx2File.startTranscoding() ) {\n\n\t\t\tcleanup();\n\t\t\tthrow new Error( 'THREE.KTX2Loader: .startTranscoding failed' );\n\n\t\t}\n\n\t\tconst faces = [];\n\t\tconst buffers = [];\n\n\t\tfor ( let face = 0; face < faceCount; face ++ ) {\n\n\t\t\tconst mipmaps = [];\n\n\t\t\tfor ( let mip = 0; mip < levelCount; mip ++ ) {\n\n\t\t\t\tconst layerMips = [];\n\n\t\t\t\tlet mipWidth, mipHeight;\n\n\t\t\t\tfor ( let layer = 0; layer < layerCount; layer ++ ) {\n\n\t\t\t\t\tconst levelInfo = ktx2File.getImageLevelInfo( mip, layer, face );\n\n\t\t\t\t\tif ( face === 0 && mip === 0 && layer === 0 && ( levelInfo.origWidth % 4 !== 0 || levelInfo.origHeight % 4 !== 0 ) ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.KTX2Loader: ETC1S and UASTC textures should use multiple-of-four dimensions.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( levelCount > 1 ) {\n\n\t\t\t\t\t\tmipWidth = levelInfo.origWidth;\n\t\t\t\t\t\tmipHeight = levelInfo.origHeight;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Handles non-multiple-of-four dimensions in textures without mipmaps. Textures with\n\t\t\t\t\t\t// mipmaps must use multiple-of-four dimensions, for some texture formats and APIs.\n\t\t\t\t\t\t// See mrdoob/three.js#25908.\n\t\t\t\t\t\tmipWidth = levelInfo.width;\n\t\t\t\t\t\tmipHeight = levelInfo.height;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet dst = new Uint8Array( ktx2File.getImageTranscodedSizeInBytes( mip, layer, 0, transcoderFormat ) );\n\t\t\t\t\tconst status = ktx2File.transcodeImage( dst, mip, layer, face, transcoderFormat, 0, - 1, - 1 );\n\n\t\t\t\t\tif ( engineType === EngineType.HalfFloatType ) {\n\n\t\t\t\t\t\tdst = new Uint16Array( dst.buffer, dst.byteOffset, dst.byteLength / Uint16Array.BYTES_PER_ELEMENT );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! status ) {\n\n\t\t\t\t\t\tcleanup();\n\t\t\t\t\t\tthrow new Error( 'THREE.KTX2Loader: .transcodeImage failed.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlayerMips.push( dst );\n\n\t\t\t\t}\n\n\t\t\t\tconst mipData = concat( layerMips );\n\n\t\t\t\tmipmaps.push( { data: mipData, width: mipWidth, height: mipHeight } );\n\t\t\t\tbuffers.push( mipData.buffer );\n\n\t\t\t}\n\n\t\t\tfaces.push( { mipmaps, width, height, format: engineFormat, type: engineType } );\n\n\t\t}\n\n\t\tcleanup();\n\n\t\treturn { faces, buffers, width, height, hasAlpha, dfdFlags, format: engineFormat, type: engineType };\n\n\t}\n\n\t//\n\n\t// Optimal choice of a transcoder target format depends on the Basis format (ETC1S, UASTC, or\n\t// UASTC HDR), device capabilities, and texture dimensions. The list below ranks the formats\n\t// separately for each format. Currently, priority is assigned based on:\n\t//\n\t// high quality > low quality > uncompressed\n\t//\n\t// Prioritization may be revisited, or exposed for configuration, in the future.\n\t//\n\t// Reference: https://github.com/KhronosGroup/3D-Formats-Guidelines/blob/main/KTXDeveloperGuide.md\n\tconst FORMAT_OPTIONS = [\n\t\t{\n\t\t\tif: 'astcSupported',\n\t\t\tbasisFormat: [ BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.ASTC_4x4, TranscoderFormat.ASTC_4x4 ],\n\t\t\tengineFormat: [ EngineFormat.RGBA_ASTC_4x4_Format, EngineFormat.RGBA_ASTC_4x4_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: Infinity,\n\t\t\tpriorityUASTC: 1,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'bptcSupported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.BC7_M5, TranscoderFormat.BC7_M5 ],\n\t\t\tengineFormat: [ EngineFormat.RGBA_BPTC_Format, EngineFormat.RGBA_BPTC_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 3,\n\t\t\tpriorityUASTC: 2,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'dxtSupported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.BC1, TranscoderFormat.BC3 ],\n\t\t\tengineFormat: [ EngineFormat.RGBA_S3TC_DXT1_Format, EngineFormat.RGBA_S3TC_DXT5_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 4,\n\t\t\tpriorityUASTC: 5,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'etc2Supported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.ETC1, TranscoderFormat.ETC2 ],\n\t\t\tengineFormat: [ EngineFormat.RGB_ETC2_Format, EngineFormat.RGBA_ETC2_EAC_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 1,\n\t\t\tpriorityUASTC: 3,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'etc1Supported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.ETC1 ],\n\t\t\tengineFormat: [ EngineFormat.RGB_ETC1_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 2,\n\t\t\tpriorityUASTC: 4,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'pvrtcSupported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.PVRTC1_4_RGB, TranscoderFormat.PVRTC1_4_RGBA ],\n\t\t\tengineFormat: [ EngineFormat.RGB_PVRTC_4BPPV1_Format, EngineFormat.RGBA_PVRTC_4BPPV1_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 5,\n\t\t\tpriorityUASTC: 6,\n\t\t\tneedsPowerOfTwo: true,\n\t\t},\n\t\t{\n\t\t\tif: 'bptcSupported',\n\t\t\tbasisFormat: [ BasisFormat.UASTC_HDR ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.BC6H ],\n\t\t\tengineFormat: [ EngineFormat.RGB_BPTC_UNSIGNED_Format ],\n\t\t\tengineType: [ EngineType.HalfFloatType ],\n\t\t\tpriorityHDR: 1,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\n\t\t// Uncompressed fallbacks.\n\n\t\t{\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.RGBA32, TranscoderFormat.RGBA32 ],\n\t\t\tengineFormat: [ EngineFormat.RGBAFormat, EngineFormat.RGBAFormat ],\n\t\t\tengineType: [ EngineType.UnsignedByteType, EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 100,\n\t\t\tpriorityUASTC: 100,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tbasisFormat: [ BasisFormat.UASTC_HDR ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.RGBA_HALF ],\n\t\t\tengineFormat: [ EngineFormat.RGBAFormat ],\n\t\t\tengineType: [ EngineType.HalfFloatType ],\n\t\t\tpriorityHDR: 100,\n\t\t\tneedsPowerOfTwo: false,\n\t\t}\n\t];\n\n\tconst OPTIONS = {\n\t\t// TODO: For ETC1S we intentionally sort by _UASTC_ priority, preserving\n\t\t// a historical accident shown to avoid performance pitfalls for Linux with\n\t\t// Firefox & AMD GPU (RadeonSI). Further work needed.\n\t\t// See https://github.com/mrdoob/three.js/pull/29730.\n\t\t[ BasisFormat.ETC1S ]: FORMAT_OPTIONS\n\t\t\t.filter( ( opt ) => opt.basisFormat.includes( BasisFormat.ETC1S ) )\n\t\t\t.sort( ( a, b ) => a.priorityUASTC - b.priorityUASTC ),\n\n\t\t[ BasisFormat.UASTC ]: FORMAT_OPTIONS\n\t\t\t.filter( ( opt ) => opt.basisFormat.includes( BasisFormat.UASTC ) )\n\t\t\t.sort( ( a, b ) => a.priorityUASTC - b.priorityUASTC ),\n\n\t\t[ BasisFormat.UASTC_HDR ]: FORMAT_OPTIONS\n\t\t\t.filter( ( opt ) => opt.basisFormat.includes( BasisFormat.UASTC_HDR ) )\n\t\t\t.sort( ( a, b ) => a.priorityHDR - b.priorityHDR ),\n\t};\n\n\tfunction getTranscoderFormat( basisFormat, width, height, hasAlpha ) {\n\n\t\tconst options = OPTIONS[ basisFormat ];\n\n\t\tfor ( let i = 0; i < options.length; i ++ ) {\n\n\t\t\tconst opt = options[ i ];\n\n\t\t\tif ( opt.if && ! config[ opt.if ] ) continue;\n\t\t\tif ( ! opt.basisFormat.includes( basisFormat ) ) continue;\n\t\t\tif ( hasAlpha && opt.transcoderFormat.length < 2 ) continue;\n\t\t\tif ( opt.needsPowerOfTwo && ! ( isPowerOfTwo( width ) && isPowerOfTwo( height ) ) ) continue;\n\n\t\t\tconst transcoderFormat = opt.transcoderFormat[ hasAlpha ? 1 : 0 ];\n\t\t\tconst engineFormat = opt.engineFormat[ hasAlpha ? 1 : 0 ];\n\t\t\tconst engineType = opt.engineType[ 0 ];\n\n\t\t\treturn { transcoderFormat, engineFormat, engineType };\n\n\t\t}\n\n\t\tthrow new Error( 'THREE.KTX2Loader: Failed to identify transcoding target.' );\n\n\t}\n\n\tfunction isPowerOfTwo( value ) {\n\n\t\tif ( value <= 2 ) return true;\n\n\t\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n\t}\n\n\t/** Concatenates N byte arrays. */\n\tfunction concat( arrays ) {\n\n\t\tif ( arrays.length === 1 ) return arrays[ 0 ];\n\n\t\tlet totalByteLength = 0;\n\n\t\tfor ( let i = 0; i < arrays.length; i ++ ) {\n\n\t\t\tconst array = arrays[ i ];\n\t\t\ttotalByteLength += array.byteLength;\n\n\t\t}\n\n\t\tconst result = new Uint8Array( totalByteLength );\n\n\t\tlet byteOffset = 0;\n\n\t\tfor ( let i = 0; i < arrays.length; i ++ ) {\n\n\t\t\tconst array = arrays[ i ];\n\t\t\tresult.set( array, byteOffset );\n\n\t\t\tbyteOffset += array.byteLength;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n};\n\n// Parsing for non-Basis textures. These textures may have supercompression\n// like Zstd, but they do not require transcoding.\n\nconst UNCOMPRESSED_FORMATS = new Set( [ RGBAFormat, RGFormat, RedFormat ] );\n\nconst FORMAT_MAP = {\n\n\t[ VK_FORMAT_R32G32B32A32_SFLOAT ]: RGBAFormat,\n\t[ VK_FORMAT_R16G16B16A16_SFLOAT ]: RGBAFormat,\n\t[ VK_FORMAT_R8G8B8A8_UNORM ]: RGBAFormat,\n\t[ VK_FORMAT_R8G8B8A8_SRGB ]: RGBAFormat,\n\n\t[ VK_FORMAT_R32G32_SFLOAT ]: RGFormat,\n\t[ VK_FORMAT_R16G16_SFLOAT ]: RGFormat,\n\t[ VK_FORMAT_R8G8_UNORM ]: RGFormat,\n\t[ VK_FORMAT_R8G8_SRGB ]: RGFormat,\n\n\t[ VK_FORMAT_R32_SFLOAT ]: RedFormat,\n\t[ VK_FORMAT_R16_SFLOAT ]: RedFormat,\n\t[ VK_FORMAT_R8_SRGB ]: RedFormat,\n\t[ VK_FORMAT_R8_UNORM ]: RedFormat,\n\n\t[ VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT ]: RGBA_ASTC_4x4_Format,\n\t[ VK_FORMAT_ASTC_6x6_SRGB_BLOCK ]: RGBA_ASTC_6x6_Format,\n\t[ VK_FORMAT_ASTC_6x6_UNORM_BLOCK ]: RGBA_ASTC_6x6_Format,\n\n};\n\nconst TYPE_MAP = {\n\n\t[ VK_FORMAT_R32G32B32A32_SFLOAT ]: FloatType,\n\t[ VK_FORMAT_R16G16B16A16_SFLOAT ]: HalfFloatType,\n\t[ VK_FORMAT_R8G8B8A8_UNORM ]: UnsignedByteType,\n\t[ VK_FORMAT_R8G8B8A8_SRGB ]: UnsignedByteType,\n\n\t[ VK_FORMAT_R32G32_SFLOAT ]: FloatType,\n\t[ VK_FORMAT_R16G16_SFLOAT ]: HalfFloatType,\n\t[ VK_FORMAT_R8G8_UNORM ]: UnsignedByteType,\n\t[ VK_FORMAT_R8G8_SRGB ]: UnsignedByteType,\n\n\t[ VK_FORMAT_R32_SFLOAT ]: FloatType,\n\t[ VK_FORMAT_R16_SFLOAT ]: HalfFloatType,\n\t[ VK_FORMAT_R8_SRGB ]: UnsignedByteType,\n\t[ VK_FORMAT_R8_UNORM ]: UnsignedByteType,\n\n\t[ VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT ]: HalfFloatType,\n\t[ VK_FORMAT_ASTC_6x6_SRGB_BLOCK ]: UnsignedByteType,\n\t[ VK_FORMAT_ASTC_6x6_UNORM_BLOCK ]: UnsignedByteType,\n\n};\n\nasync function createRawTexture( container ) {\n\n\tconst { vkFormat } = container;\n\n\tif ( FORMAT_MAP[ vkFormat ] === undefined ) {\n\n\t\tthrow new Error( 'THREE.KTX2Loader: Unsupported vkFormat.' );\n\n\t}\n\n\t//\n\n\tlet zstd;\n\n\tif ( container.supercompressionScheme === KHR_SUPERCOMPRESSION_ZSTD ) {\n\n\t\tif ( ! _zstd ) {\n\n\t\t\t_zstd = new Promise( async ( resolve ) => {\n\n\t\t\t\tconst zstd = new ZSTDDecoder();\n\t\t\t\tawait zstd.init();\n\t\t\t\tresolve( zstd );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tzstd = await _zstd;\n\n\t}\n\n\t//\n\n\tconst mipmaps = [];\n\n\n\tfor ( let levelIndex = 0; levelIndex < container.levels.length; levelIndex ++ ) {\n\n\t\tconst levelWidth = Math.max( 1, container.pixelWidth >> levelIndex );\n\t\tconst levelHeight = Math.max( 1, container.pixelHeight >> levelIndex );\n\t\tconst levelDepth = container.pixelDepth ? Math.max( 1, container.pixelDepth >> levelIndex ) : 0;\n\n\t\tconst level = container.levels[ levelIndex ];\n\n\t\tlet levelData;\n\n\t\tif ( container.supercompressionScheme === KHR_SUPERCOMPRESSION_NONE ) {\n\n\t\t\tlevelData = level.levelData;\n\n\t\t} else if ( container.supercompressionScheme === KHR_SUPERCOMPRESSION_ZSTD ) {\n\n\t\t\tlevelData = zstd.decode( level.levelData, level.uncompressedByteLength );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.KTX2Loader: Unsupported supercompressionScheme.' );\n\n\t\t}\n\n\t\tlet data;\n\n\t\tif ( TYPE_MAP[ vkFormat ] === FloatType ) {\n\n\t\t\tdata = new Float32Array(\n\n\t\t\t\tlevelData.buffer,\n\t\t\t\tlevelData.byteOffset,\n\t\t\t\tlevelData.byteLength / Float32Array.BYTES_PER_ELEMENT\n\n\t\t\t);\n\n\t\t} else if ( TYPE_MAP[ vkFormat ] === HalfFloatType ) {\n\n\t\t\tdata = new Uint16Array(\n\n\t\t\t\tlevelData.buffer,\n\t\t\t\tlevelData.byteOffset,\n\t\t\t\tlevelData.byteLength / Uint16Array.BYTES_PER_ELEMENT\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tdata = levelData;\n\n\t\t}\n\n\t\tmipmaps.push( {\n\n\t\t\tdata: data,\n\t\t\twidth: levelWidth,\n\t\t\theight: levelHeight,\n\t\t\tdepth: levelDepth,\n\n\t\t} );\n\n\t}\n\n\tlet texture;\n\n\tif ( UNCOMPRESSED_FORMATS.has( FORMAT_MAP[ vkFormat ] ) ) {\n\n\t\ttexture = container.pixelDepth === 0\n\t\t\t? new DataTexture( mipmaps[ 0 ].data, container.pixelWidth, container.pixelHeight )\n\t\t\t: new Data3DTexture( mipmaps[ 0 ].data, container.pixelWidth, container.pixelHeight, container.pixelDepth );\n\n\t} else {\n\n\t\tif ( container.pixelDepth > 0 ) throw new Error( 'THREE.KTX2Loader: Unsupported pixelDepth.' );\n\n\t\ttexture = new CompressedTexture( mipmaps, container.pixelWidth, container.pixelHeight );\n\n\t\ttexture.minFilter = mipmaps.length === 1 ? LinearFilter : LinearMipmapLinearFilter;\n\t\ttexture.magFilter = LinearFilter;\n\n\t}\n\n\ttexture.mipmaps = mipmaps;\n\n\ttexture.type = TYPE_MAP[ vkFormat ];\n\ttexture.format = FORMAT_MAP[ vkFormat ];\n\ttexture.colorSpace = parseColorSpace( container );\n\ttexture.needsUpdate = true;\n\n\t//\n\n\treturn Promise.resolve( texture );\n\n}\n\nfunction parseColorSpace( container ) {\n\n\tconst dfd = container.dataFormatDescriptor[ 0 ];\n\n\tif ( dfd.colorPrimaries === KHR_DF_PRIMARIES_BT709 ) {\n\n\t\treturn dfd.transferFunction === KHR_DF_TRANSFER_SRGB ? SRGBColorSpace : LinearSRGBColorSpace;\n\n\t} else if ( dfd.colorPrimaries === KHR_DF_PRIMARIES_DISPLAYP3 ) {\n\n\t\treturn dfd.transferFunction === KHR_DF_TRANSFER_SRGB ? DisplayP3ColorSpace : LinearDisplayP3ColorSpace;\n\n\t} else if ( dfd.colorPrimaries === KHR_DF_PRIMARIES_UNSPECIFIED ) {\n\n\t\treturn NoColorSpace;\n\n\t} else {\n\n\t\tconsole.warn( `THREE.KTX2Loader: Unsupported color primaries, \"${ dfd.colorPrimaries }\"` );\n\t\treturn NoColorSpace;\n\n\t}\n\n}\n\nexport { KTX2Loader };\n","import { LinearTransfer, Matrix3, SRGBTransfer } from 'three';\n\n// Reference: http://www.russellcottrell.com/photo/matrixCalculator.htm\n\nconst P3_PRIMARIES = [ 0.680, 0.320, 0.265, 0.690, 0.150, 0.060 ];\nconst P3_LUMINANCE_COEFFICIENTS = [ 0.2289, 0.6917, 0.0793 ];\nconst REC2020_PRIMARIES = [ 0.708, 0.292, 0.170, 0.797, 0.131, 0.046 ];\nconst REC2020_LUMINANCE_COEFFICIENTS = [ 0.2627, 0.6780, 0.0593 ];\nconst D65 = [ 0.3127, 0.3290 ];\n\n/******************************************************************************\n * Display P3 definitions\n */\n\nconst LINEAR_DISPLAY_P3_TO_XYZ = /*@__PURE__*/ new Matrix3().set(\n\t0.4865709, 0.2656677, 0.1982173,\n\t0.2289746, 0.6917385, 0.0792869,\n\t0.0000000, 0.0451134, 1.0439444\n);\n\nconst XYZ_TO_LINEAR_DISPLAY_P3 = /*@__PURE__*/ new Matrix3().set(\n\t2.4934969, - 0.9313836, - 0.4027108,\n\t- 0.8294890, 1.7626641, 0.0236247,\n\t0.0358458, - 0.0761724, 0.9568845\n);\n\nexport const DisplayP3ColorSpace = 'display-p3';\nexport const LinearDisplayP3ColorSpace = 'display-p3-linear';\n\nexport const DisplayP3ColorSpaceImpl = {\n\tprimaries: P3_PRIMARIES,\n\twhitePoint: D65,\n\ttransfer: SRGBTransfer,\n\ttoXYZ: LINEAR_DISPLAY_P3_TO_XYZ,\n\tfromXYZ: XYZ_TO_LINEAR_DISPLAY_P3,\n\tluminanceCoefficients: P3_LUMINANCE_COEFFICIENTS,\n\toutputColorSpaceConfig: { drawingBufferColorSpace: DisplayP3ColorSpace }\n};\n\nexport const LinearDisplayP3ColorSpaceImpl = {\n\tprimaries: P3_PRIMARIES,\n\twhitePoint: D65,\n\ttransfer: LinearTransfer,\n\ttoXYZ: LINEAR_DISPLAY_P3_TO_XYZ,\n\tfromXYZ: XYZ_TO_LINEAR_DISPLAY_P3,\n\tluminanceCoefficients: P3_LUMINANCE_COEFFICIENTS,\n\tworkingColorSpaceConfig: { unpackColorSpace: DisplayP3ColorSpace },\n\toutputColorSpaceConfig: { drawingBufferColorSpace: DisplayP3ColorSpace }\n};\n\n/******************************************************************************\n * Rec. 2020 definitions\n */\n\nconst LINEAR_REC2020_TO_XYZ = /*@__PURE__*/ new Matrix3().set(\n\t0.6369580, 0.1446169, 0.1688810,\n\t0.2627002, 0.6779981, 0.0593017,\n\t0.0000000, 0.0280727, 1.0609851\n);\n\nconst XYZ_TO_LINEAR_REC2020 = /*@__PURE__*/ new Matrix3().set(\n\t1.7166512, - 0.3556708, - 0.2533663,\n\t- 0.6666844, 1.6164812, 0.0157685,\n\t0.0176399, - 0.0427706, 0.9421031\n);\n\nexport const LinearRec2020ColorSpace = 'rec2020-linear';\n\nexport const LinearRec2020ColorSpaceImpl = {\n\tprimaries: REC2020_PRIMARIES,\n\twhitePoint: D65,\n\ttransfer: LinearTransfer,\n\ttoXYZ: LINEAR_REC2020_TO_XYZ,\n\tfromXYZ: XYZ_TO_LINEAR_REC2020,\n\tluminanceCoefficients: REC2020_LUMINANCE_COEFFICIENTS,\n};\n","async function fetchAndDecodeSubtree(url) {\r\n const cleanUrl = url.split('?')[0]; // Remove URL parameters\r\n const extension = cleanUrl.split('.').pop(); // Get the file extension\r\n\r\n const response = await fetch(url);\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch ${url}: ${response.statusText}`);\r\n }\r\n\r\n if (extension === \"json\") {\r\n // Handle .json file\r\n const json = await response.json();\r\n return handleJSONSubtree(json, getDirectoryUrl(url));\r\n }\r\n if (extension === \"subtree\") {\r\n // Handle binary .subtree file\r\n const buffer = await response.arrayBuffer();\r\n return decodeSubtreeBinary(buffer, getDirectoryUrl(url));\r\n } else {\r\n throw new Error(`Unsupported file extension: ${extension}`);\r\n }\r\n}\r\nfunction getDirectoryUrl(url) {\r\n const cleanUrl = url.split('?')[0]; // Removes query parameters\r\n return cleanUrl.substring(0, cleanUrl.lastIndexOf('/') + 1);\r\n};\r\n\r\nasync function decodeSubtreeJSON(json, baseURL) {\r\n if (!json.buffers) {\r\n throw new Error(`subtree has no buffers`);\r\n }\r\n\r\n const bufferFetchPromises = json.buffers.map(async (buffer) => {\r\n if (!buffer.uri) {\r\n throw new Error(`bad subtree definition. subtrees in json format do not contain internal buffers`);\r\n }\r\n const binaryUrl = new URL(buffer.uri, baseURL).href; // Fixed to buffer.uri instead of externalBuffer.uri\r\n const response = await fetch(binaryUrl);\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch binary file ${binaryUrl}: ${response.statusText}`);\r\n }\r\n return response.arrayBuffer();\r\n });\r\n\r\n const buffers = await Promise.all(bufferFetchPromises);\r\n\r\n return decodeSubtree(json, buffers);\r\n}\r\n// Decode binary .subtree file\r\nasync function decodeSubtreeBinary(buffer, baseURL) {\r\n const dataView = new DataView(buffer);\r\n const jsonByteLength = dataView.getBigUint64(8, true); // JSON byte length\r\n const binaryByteLength = dataView.getBigUint64(16, true); // Binary byte length\r\n\r\n const jsonStart = 24;\r\n const jsonEnd = jsonStart + Number(jsonByteLength);\r\n const binaryStart = jsonEnd + (8 - (jsonEnd % 8)) % 8; // Align to 8-byte boundary\r\n const binaryEnd = binaryStart + Number(binaryByteLength);\r\n\r\n const jsonBuffer = buffer.slice(jsonStart, jsonEnd);\r\n const jsonString = new TextDecoder().decode(jsonBuffer).trim();\r\n const json = JSON.parse(jsonString);\r\n\r\n if (!json.buffers) {\r\n throw new Error(`subtree has no buffers`);\r\n }\r\n\r\n const bufferFetchPromises = json.buffers.map(async (b) => {\r\n if (b.uri) {\r\n const binaryUrl = new URL(b.uri, baseURL).href;\r\n const response = await fetch(binaryUrl);\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch binary file ${binaryUrl}: ${response.statusText}`);\r\n }\r\n return new Uint8Array(await response.arrayBuffer());\r\n } else {\r\n // Assuming you meant to directly use the buffer for non-URI cases,\r\n // which is already available in the function scope.\r\n return new Uint8Array(buffer.slice(binaryStart, binaryEnd));\r\n }\r\n });\r\n\r\n const buffers = await Promise.all(bufferFetchPromises);\r\n\r\n return decodeSubtree(json, buffers);\r\n}\r\n\r\nfunction decodeSubtree(json, buffers){\r\n function isAvailable(availability, index) {\r\n if (!availability) {\r\n throw new Error(`incomplete json subtree`);\r\n }\r\n if (!!availability.constant) {\r\n if (availability.constant == 0) {\r\n return false;\r\n }\r\n if (availability.constant == 1) {\r\n return true;\r\n }\r\n }\r\n if (availability.bitstream == undefined) {\r\n throw new Error(`json subtree \"tileAvailability\" does not specify a bitstream`);\r\n }\r\n if (!json.bufferViews || !json.bufferViews[availability.bitstream]) {\r\n throw new Error(`json subtree \"bufferViews\" does not specify a bitstream`);\r\n }\r\n const bufferView = json.bufferViews[availability.bitstream];\r\n\r\n return isAvailable2(buffers[bufferView.buffer], bufferView.byteOffset, index);\r\n }\r\n\r\n function isAvailable2(buffer, byteOffset, index) {\r\n const byteIndex = byteOffset + Math.floor(index / 8);\r\n const bitIndex = index % 8;\r\n return (buffer[byteIndex] >> bitIndex) & 1 == 1;\r\n }\r\n\r\n function isTileAvailable(address) {\r\n\r\n let index = 0;\r\n if (address.z==undefined) {\r\n index = computeQuadtreeIndex(address.x, address.y, address.level);\r\n } else {\r\n index = computeOctreeIndex(address.x, address.y, address.z, address.level);\r\n }\r\n return isAvailable(json.tileAvailability, index);\r\n }\r\n function isContentAvailable(address) {\r\n let index = 0;\r\n if (address.z==undefined) {\r\n index = computeQuadtreeIndex(address.x, address.y, address.level);\r\n } else {\r\n index = computeOctreeIndex(address.x, address.y, address.z, address.level);\r\n }\r\n const contentAvailability = [];\r\n json.contentAvailability.forEach(availability=>{\r\n contentAvailability.push(isAvailable(availability, index));\r\n })\r\n return contentAvailability;\r\n }\r\n function isChildSubtreeAvailable(address) {\r\n let index = 0;\r\n if (address.z==undefined) {\r\n index = computeQuadtreeIndex(address.x, address.y);\r\n } else {\r\n index = computeOctreeIndex(address.x, address.y, address.z);\r\n }\r\n return isAvailable(json.childSubtreeAvailability, index);\r\n }\r\n\r\n\r\n return { isTileAvailable: isTileAvailable, isContentAvailable: isContentAvailable, isChildSubtreeAvailable: isChildSubtreeAvailable };\r\n}\r\n\r\n// Handle JSON subtree, fetching external binary file if necessary\r\n\r\n\r\nfunction part1By1(n) {\r\n n &= 0x0000ffff; // n = ------------------------fedcba9876543210\r\n n = (n ^ (n << 8)) & 0x00ff00ff; // n = ----------------fedcba98--------76543210\r\n n = (n ^ (n << 4)) & 0x0f0f0f0f; // n = ------------fedc--------ba98--------7654--------3210\r\n n = (n ^ (n << 2)) & 0x33333333; // n = --------fedc----ba98----7654----3210\r\n n = (n ^ (n << 1)) & 0x55555555; // n = ----f--e--d--c----b--a--9--8----7--6--5--4----3--2--1--0\r\n return n;\r\n}\r\n\r\nfunction computeQuadtreeIndex(x, y, level) {\r\n let offset = 0;\r\n if (level) {\r\n offset = (Math.pow(4, level) - 1) / 3;\r\n }\r\n return offset + (part1By1(x) | (part1By1(y) << 1));\r\n}\r\n\r\nfunction part1By2(n) {\r\n n &= 0x000003ff; // n = ------------------9876543210\r\n n = (n ^ (n << 16)) & 0xff0000ff; // n = ----9876--------5432--------10--------------------\r\n n = (n ^ (n << 8)) & 0x0300f00f; // n = ----9--8--7--6--------5--4--3--2--------------------\r\n n = (n ^ (n << 4)) & 0x030c30c3; // n = ----9-----8--7-----6--------5-----4--3-----2--------\r\n n = (n ^ (n << 2)) & 0x09249249; // n = ----9--------8--------7--------6--------5--------4--------3--------2--------\r\n return n;\r\n}\r\n\r\nfunction computeOctreeIndex(x, y, z, level) {\r\n let offset = 0;\r\n if (level) {\r\n offset = (Math.pow(8, level) - 1) / 7;\r\n }\r\n return offset + (part1By2(x) | (part1By2(y) << 1) | (part1By2(z) << 2));\r\n}\r\nexport{\r\n fetchAndDecodeSubtree\r\n};","import { fetchAndDecodeSubtree } from './SubtreeDecoder.js';\r\nconst subtreeMap = new Map();\r\n\r\n\r\nasync function resolveImplicite(rootTile, url) {\r\n if (!rootTile.root || !rootTile.root.implicitTiling) {\r\n return rootTile;\r\n }\r\n\r\n if (!rootTile.root.content && !rootTile.root.contents) {\r\n throw new Error(\"implicit tiling requires a Template URI\");\r\n }\r\n\r\n let isQuad = true;\r\n if (rootTile.root.implicitTiling.subdivisionScheme) {\r\n isQuad = \"QUADTREE\" === rootTile.root.implicitTiling.subdivisionScheme.toUpperCase()\r\n }\r\n let subtreeUriTemplate = \"\";\r\n if (rootTile.root.implicitTiling.subtrees) {\r\n if (rootTile.root.implicitTiling.subtrees.uri) {\r\n subtreeUriTemplate = rootTile.root.implicitTiling.subtrees.uri;\r\n } else if (rootTile.root.implicitTiling.subtrees.url) {\r\n subtreeUriTemplate = rootTile.root.implicitTiling.subtrees.url;\r\n }\r\n }\r\n\r\n let contentURITemplates = [];\r\n if (rootTile.root.content) {\r\n if (rootTile.root.content.uri) {\r\n contentURITemplates.push(rootTile.root.content.uri);\r\n } else if (rootTile.root.content.url) {\r\n contentURITemplates.push(rootTile.root.content.url);\r\n }\r\n } else if (rootTile.root.contents) {\r\n rootTile.root.contents.forEach(content => {\r\n if (content.uri) {\r\n contentURITemplates.push(content.uri);\r\n } else if (content.url) {\r\n contentURITemplates.push(content.url);\r\n }\r\n })\r\n }\r\n\r\n const rootURL = getDirectoryUrl(url);\r\n\r\n let subtreeUri;\r\n if (isQuad) {\r\n subtreeUri = subtreeUriTemplate\r\n .replace(\"{level}\", 0)\r\n .replace(\"{x}\", 0)\r\n .replace(\"{y}\", 0);\r\n }\r\n if (!isQuad) {\r\n subtreeUri = subtreeUriTemplate\r\n .replace(\"{level}\", 0)\r\n .replace(\"{x}\", 0)\r\n .replace(\"{y}\", 0)\r\n .replace(\"{z}\", 0);\r\n }\r\n\r\n const globalAddress = { level: 0, x: 0, y: 0 };\r\n const localAddress = { level: 0, x: 0, y: 0 };\r\n if (!isQuad) {\r\n globalAddress.z = 0;\r\n localAddress.z = 0;\r\n }\r\n\r\n subtreeMap.set(subtreeUri, await fetchAndDecodeSubtree(rootURL + subtreeUri))\r\n const subtree = subtreeMap.get(subtreeUri);\r\n const contents = [];\r\n if (subtree.isContentAvailable(localAddress)) {\r\n contentURITemplates.forEach(contentURI => {\r\n let uri;\r\n if (isQuad) {\r\n uri = contentURI\r\n .replace(\"{level}\", globalAddress.level)\r\n .replace(\"{x}\", globalAddress.x)\r\n .replace(\"{y}\", globalAddress.y);\r\n }\r\n if (!isQuad) {\r\n uri = contentURI\r\n .replace(\"{level}\", globalAddress.level)\r\n .replace(\"{x}\", globalAddress.x)\r\n .replace(\"{y}\", globalAddress.y)\r\n .replace(\"{z}\", globalAddress.z);\r\n }\r\n contents.push({ uri: uri });\r\n });\r\n }\r\n const explicitTileset = {\r\n geometricError: rootTile.root.geometricError,\r\n boundingVolume: rootTile.root.boundingVolume,\r\n refine: rootTile.root.refine,\r\n globalAddress: globalAddress,\r\n localAddress: localAddress,\r\n subtree: subtree,\r\n contents: contents,\r\n getChildren: async () => {\r\n return buildChildren(explicitTileset)\r\n }\r\n }\r\n return {\r\n root: explicitTileset\r\n\r\n }\r\n\r\n\r\n async function buildChildren(parent) {\r\n const children = [];\r\n if (parent.localAddress.level == rootTile.root.implicitTiling.availableLevels - 1) return children;\r\n\r\n if ((parent.localAddress.level + 1) % rootTile.root.implicitTiling.subtreeLevels == 0) { // end of subtree \r\n\r\n const localAddresses = getChildrenAddresses(parent.localAddress);\r\n const globalAddresses = getChildrenAddresses(parent.globalAddress);\r\n const boundingVolumes = computeBoundingVolumes(isQuad, rootTile.root.boundingVolume, globalAddresses);\r\n\r\n for (let i = 0; i < localAddresses.length; i++) {\r\n const childLocalAddress = localAddresses[i];\r\n const childGlobalAddress = globalAddresses[i];\r\n if (parent.subtree.isChildSubtreeAvailable(childLocalAddress)) {\r\n let subtreeUri;\r\n if (isQuad) {\r\n subtreeUri = subtreeUriTemplate\r\n .replace(\"{level}\", childGlobalAddress.level)\r\n .replace(\"{x}\", childGlobalAddress.x)\r\n .replace(\"{y}\", childGlobalAddress.y);\r\n }\r\n if (!isQuad) {\r\n subtreeUri = subtreeUriTemplate\r\n .replace(\"{level}\", childGlobalAddress.level)\r\n .replace(\"{x}\", childGlobalAddress.x)\r\n .replace(\"{y}\", childGlobalAddress.y)\r\n .replace(\"{z}\", childGlobalAddress.z);\r\n }\r\n }\r\n if (!subtreeMap.has(subtreeUri)) {\r\n subtreeMap.set(subtreeUri, await fetchAndDecodeSubtree(rootURL + subtreeUri))\r\n }\r\n const newSubtree = subtreeMap.get(subtreeUri)\r\n const newLocalAddress = { level: 0, x: 0, y: 0 };\r\n if (!isQuad) newLocalAddress.z = 0;\r\n\r\n const contents = [];\r\n if (newSubtree.isContentAvailable(newLocalAddress)) {\r\n contentURITemplates.forEach(contentURI => {\r\n let uri;\r\n if (isQuad) {\r\n uri = contentURI\r\n .replace(\"{level}\", childGlobalAddress.level)\r\n .replace(\"{x}\", childGlobalAddress.x)\r\n .replace(\"{y}\", childGlobalAddress.y);\r\n }\r\n if (!isQuad) {\r\n //let rootZ = Math.floor(z / factor);\r\n uri = contentURI\r\n .replace(\"{level}\", childGlobalAddress.level)\r\n .replace(\"{x}\", childGlobalAddress.x)\r\n .replace(\"{y}\", childGlobalAddress.y)\r\n .replace(\"{z}\", childGlobalAddress.z);\r\n }\r\n contents.push({ uri: uri });\r\n });\r\n }\r\n const child = {\r\n geometricError: parent.geometricError / 2,\r\n boundingVolume: boundingVolumes[i],\r\n refine: rootTile.root.refine,\r\n globalAddress: childGlobalAddress,\r\n localAddress: newLocalAddress,\r\n subtree: newSubtree,\r\n contents: contents,\r\n getChildren: async () => {\r\n return buildChildren(child);\r\n }\r\n }\r\n children.push(child);\r\n }\r\n } else { // not the end of the subtree\r\n const localAddresses = getChildrenAddresses(parent.localAddress);\r\n const globalAddresses = getChildrenAddresses(parent.globalAddress);\r\n const boundingVolumes = computeBoundingVolumes(isQuad, rootTile.root.boundingVolume, globalAddresses);\r\n\r\n for (let i = 0; i < localAddresses.length; i++) {\r\n const childLocalAddress = localAddresses[i];\r\n const childGlobalAddress = globalAddresses[i];\r\n if (!parent.subtree.isTileAvailable(childLocalAddress)) {\r\n continue;\r\n }\r\n const contents = [];\r\n const contentAvailability = parent.subtree.isContentAvailable(childLocalAddress);\r\n for (let i = 0; i < contentURITemplates.length; i++) {\r\n if (!contentAvailability[i]) continue;\r\n const contentURITemplate = contentURITemplates[i];\r\n let uri;\r\n if (isQuad) {\r\n uri = contentURITemplate\r\n .replace(\"{level}\", childGlobalAddress.level)\r\n .replace(\"{x}\", childGlobalAddress.x)\r\n .replace(\"{y}\", childGlobalAddress.y);\r\n }\r\n if (!isQuad) {\r\n uri = contentURITemplate\r\n .replace(\"{level}\", childGlobalAddress.level)\r\n .replace(\"{x}\", childGlobalAddress.x)\r\n .replace(\"{y}\", childGlobalAddress.y)\r\n .replace(\"{z}\", childGlobalAddress.z);\r\n }\r\n contents.push({ uri: uri });\r\n }\r\n\r\n\r\n const child = {\r\n geometricError: parent.geometricError / 2,\r\n boundingVolume: boundingVolumes[i],\r\n refine: rootTile.root.refine,\r\n globalAddress: childGlobalAddress,\r\n localAddress: childLocalAddress,\r\n subtree: parent.subtree,\r\n contents: contents,\r\n getChildren: async () => {\r\n return buildChildren(child);\r\n }\r\n }\r\n children.push(child)\r\n }\r\n }\r\n\r\n return children.length>0?children:undefined;\r\n }\r\n\r\n}\r\n\r\nfunction getChildrenAddresses(tileAddress) {\r\n const { level, x, y, z } = tileAddress;\r\n const nextLevel = level + 1;\r\n let children = [];\r\n\r\n if (z === undefined) {\r\n // Quadtree\r\n children = [\r\n { level: nextLevel, x: x * 2, y: y * 2 }, // Bottom left\r\n { level: nextLevel, x: x * 2 + 1, y: y * 2 }, // Bottom right\r\n { level: nextLevel, x: x * 2, y: y * 2 + 1 }, // Top left\r\n { level: nextLevel, x: x * 2 + 1, y: y * 2 + 1 } // Top right\r\n ];\r\n } else {\r\n // Octree\r\n children = [\r\n { level: nextLevel, x: x * 2, y: y * 2, z: z * 2 }, // Bottom front left\r\n { level: nextLevel, x: x * 2 + 1, y: y * 2, z: z * 2 }, // Bottom front right\r\n { level: nextLevel, x: x * 2, y: y * 2 + 1, z: z * 2 }, // Bottom back left\r\n { level: nextLevel, x: x * 2 + 1, y: y * 2 + 1, z: z * 2 }, // Bottom back right\r\n { level: nextLevel, x: x * 2, y: y * 2, z: z * 2 + 1 }, // Top front left\r\n { level: nextLevel, x: x * 2 + 1, y: y * 2, z: z * 2 + 1 }, // Top front right\r\n { level: nextLevel, x: x * 2, y: y * 2 + 1, z: z * 2 + 1 }, // Top back left\r\n { level: nextLevel, x: x * 2 + 1, y: y * 2 + 1, z: z * 2 + 1 } // Top back right\r\n ];\r\n }\r\n\r\n return children;\r\n}\r\n\r\nfunction getDirectoryUrl(url) {\r\n const cleanUrl = url.split('?')[0]; // Removes query parameters\r\n return cleanUrl.substring(0, cleanUrl.lastIndexOf('/') + 1);\r\n};\r\n\r\nfunction computeBoundingVolumes(isQuad, rootBoundingVolume, addresses) {\r\n const boundingVolumes = [];\r\n for (let i = 0; i < addresses.length; i++) {\r\n boundingVolumes.push(computeBoundingVolume(isQuad, rootBoundingVolume, addresses[i]))\r\n }\r\n return boundingVolumes;\r\n}\r\n\r\nfunction computeBoundingVolume(isQuad, rootBoundingVolume, address) {\r\n if (rootBoundingVolume.region) {\r\n return splitRegion(isQuad, rootBoundingVolume.region, address);\r\n } else if (rootBoundingVolume.box) {\r\n return splitBox(isQuad, rootBoundingVolume.box, address);\r\n } else {\r\n throw new Error('Unsupported bounding volume type');\r\n }\r\n}\r\n\r\nfunction splitRegion(isQuad, rootRegion, address) {\r\n // Destructure the rootRegion for clarity\r\n const [west, south, east, north, minHeight, maxHeight] = rootRegion;\r\n \r\n // Calculate the size of each division step based on the tile's level\r\n const xStep = (east - west) / (2 ** address.level);\r\n const yStep = (north - south) / (2 ** address.level);\r\n const zStep = isQuad ? 0 : (maxHeight - minHeight) / (2 ** address.level);\r\n \r\n // Calculate the new bounds for the tile\r\n const newWest = west + (xStep * address.x);\r\n const newSouth = south + (yStep * address.y);\r\n const newEast = newWest + xStep;\r\n const newNorth = newSouth + yStep;\r\n \r\n // For quadtrees, the z dimension remains unchanged. For octrees, calculate new heights.\r\n const newMinHeight = isQuad ? minHeight : minHeight + (zStep * address.z);\r\n const newMaxHeight = isQuad ? maxHeight : newMinHeight + zStep;\r\n \r\n return {region:[newWest, newSouth, newEast, newNorth, newMinHeight, newMaxHeight]};\r\n }\r\n\r\n function splitBox(isQuad, box, address) {\r\n // Extract center and half-length vectors from the box\r\n const center = box.slice(0, 3);\r\n const vectors = [\r\n box.slice(3, 6), // First half-length vector\r\n box.slice(6, 9), // Second half-length vector\r\n box.slice(9, 12) // Third half-length vector\r\n ];\r\n \r\n // Determine scale factors for each axis\r\n const s = 1/Math.pow(2,address.level);\r\n const scaleFactors = [s, s, isQuad ? 1 : s];\r\n \r\n // Adjust the half-length vectors according to the scale factor\r\n const newVectors = vectors.map((vector, index) => vector.map(component => component * scaleFactors[index]));\r\n \r\n const origin = [center[0]-vectors[0][0]-vectors[1][0]-vectors[2][0], center[1]-vectors[0][1]-vectors[1][1]-vectors[2][1], center[2]-vectors[0][2]-vectors[1][2]-vectors[2][2]]\r\n // Calculate new center based on the child address\r\n const newCenter = [\r\n origin[0] + (address.x*2+1)*(newVectors[0][0]+newVectors[1][0]+newVectors[2][0]),\r\n origin[1] + (address.y*2+1)*(newVectors[0][1]+newVectors[1][1]+newVectors[2][1]),\r\n isQuad?center[2]:origin[2] + (address.z*2+1)*(newVectors[0][2]+newVectors[1][2]+newVectors[2][2]),\r\n ];\r\n \r\n // Construct the new box with the updated center and scaled half-length vectors\r\n const newBox = newCenter.concat(...newVectors);\r\n \r\n return {box:newBox};\r\n }\r\n \r\n\r\n\r\nexport {\r\n resolveImplicite\r\n}\r\n","// This file is part of meshoptimizer library and is distributed under the terms of MIT License.\n// Copyright (C) 2016-2023, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)\nvar MeshoptEncoder = (function() {\n\t// Built with clang version 16.0.0\n\t// Built from meshoptimizer 0.20\n\tvar wasm = \"b9H79TebbbeJq9Geueu9Geub9Gbb9Gvuuuuueu9Gduueu9Gluuuueu9Gvuuuuub9Gouuuuuub9Gluuuub9GiuuueuiKLdilevlevlooroowwvwbDDbelve9Weiiviebeoweuec:W;kekr;RiOo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9FW9U9J9V9KW9wWVtW949c919M9MWVbe8F9TW79O9V9Wt9FW9U9J9V9KW9wWVtW949c919M9MWV9c9V919U9KbdE9TW79O9V9Wt9FW9U9J9V9KW9wWVtW949wWV79P9V9UbiY9TW79O9V9Wt9FW9U9J9V9KW69U9KW949c919M9MWVbl8E9TW79O9V9Wt9FW9U9J9V9KW69U9KW949c919M9MWV9c9V919U9Kbv8A9TW79O9V9Wt9FW9U9J9V9KW69U9KW949wWV79P9V9UboE9TW79O9V9Wt9FW9U9J9V9KW69U9KW949tWG91W9U9JWbra9TW79O9V9Wt9FW9U9J9V9KW69U9KW949tWG91W9U9JW9c9V919U9KbwL9TW79O9V9Wt9FW9U9J9V9KWS9P2tWV9p9JtbDK9TW79O9V9Wt9FW9U9J9V9KWS9P2tWV9r919HtbqL9TW79O9V9Wt9FW9U9J9V9KWS9P2tWVT949WbkE9TW79O9V9Wt9F9V9Wt9P9T9P96W9wWVtW94J9H9J9OWbPa9TW79O9V9Wt9F9V9Wt9P9T9P96W9wWVtW94J9H9J9OW9ttV9P9Wbsa9TW79O9V9Wt9F9V9Wt9P9T9P96W9wWVtW94SWt9J9O9sW9T9H9WbzK9TW79O9V9Wt9F79W9Ht9P9H29t9VVt9sW9T9H9WbHl79IV9RbODwebcekdQXq:g9sLdbk;3keYu8Jjjjjbcjo9Rgv8Kjjjjbcbhodnalcefae0mbabcbRb:S:kjjbc:GeV86bbavcjdfcbcjdzNjjjb8AdnaiTmbavcjdfadalz:tjjjb8Akabaefhrabcefhwavalfcbcbcjdal9RalcFe0EzNjjjb8Aavavcjdfalz:tjjjbhDcj;abal9UhodndndndndnalTmbaoc;WFbGgecjdaecjd6Ehqcbhkdninakai9pmiaDcjlfcbcjdzNjjjb8Aaqaiak9Rakaqfai6Egxcsfgecl4cifcd4hmadakal2fhPdndndndndnaec9WGgsTmbcbhzcehHaPhOawhAxekdnaxTmbcbhAcehHaPhCinaDaAfRbbhXaDcjlfheaChoaxhQinaeaoRbbgLaX9RgXcetaX;acr4786bbaoalfhoaecefheaLhXaQcufgQmbkaraw9Ram6miawcbamzNjjjbgeTmiaCcefhCaeamfhwaAcefgAal6hHaAal9hmbxvkkaraw9Ram6mvawcbamzNjjjb8AceheinawgXamfhwalaegoSmldnaraw9Ram6mbaocefheawcbamzNjjjb8AaXmekkaoal6hHxekindnaxTmbaDazfRbbhXaDcjlfheaOhoaxhQinaeaoRbbgLaX9RgXcetaX;acr4786bbaoalfhoaecefheaLhXaQcufgQmbkkaraA9Ram6mearaAcbamzNjjjbgKamfgw9RcK6mdcbhYaDcjlfhAinaDcjlfaYfh8AcwhCczhLcehQindndnaQce9hmbcuhoa8ARbbmecbhodninaogecsSmeaecefhoaAaefcefRbbTmbkkcucbaecs6EhoxekaQcetc;:FFFeGhocuaQtcu7cFeGhXcbheinaoaXaAaefRbb9nfhoaecefgecz9hmbkkaoaLaoaL6geEhLaQaCaeEhCaQcetgQcw6mbkdndndndnaCcufPdiebkaKaYco4fgeaeRbbcdciaCclSEaYci4coGtV86bbaCcw9hmeawa8A8Pbb83bbawcwfa8Acwf8Pbb83bbawczfhwxdkaKaYco4fgeaeRbbceaYci4coGtV86bbkdncwaC9TgEmbinawcb86bbawcefhwxbkkcuaCtcu7h8Acbh3aAh5ina5heaEhQcbhoinaeRbbgLa8AcFeGgXaLaX6EaoaCtVhoaecefheaQcufgQmbkawao86bba5aEfh5awcefhwa3aEfg3cz6mbkcbheindnaAaefRbbgoaX6mbawao86bbawcefhwkaecefgecz9hmbkkdnaYczfgYas9pmbaAczfhAaraw9RcL0mekkaYas6meawTmeaOcefhOazcefgzal6hHawhAazalSmixbkkcbhwaHceGTmexikcbhwaHceGmdkaDaPaxcufal2falz:tjjjb8AaxakfhkawmbkcbhoxokcbhoxvkaiTmekcbhoaraw9Ralcaalca0E6mialc8F9nmexdkcbhoaecufca6mdkawcbcaal9RgezNjjjbaefhwkawaDcjdfalz:tjjjbalfab9Rhokavcjof8Kjjjjbaok9heeuaecaaeca0Eabcj;abae9Uc;WFbGgdcjdadcjd6Egdfcufad9Uae2adcl4cifcd4adV2fcefkmbcbabBd:S:kjjbk;rse3u8Jjjjjbc;ae9Rgl8Kjjjjbcbhvdnaici9UgocHfae0mbabcbyd:C:kjjbgrc;GeV86bbalc;abfcFecjezNjjjb8AalcUfgw9cu83ibalc8WfgD9cu83ibalcyfgq9cu83ibalcafgk9cu83ibalcKfgx9cu83ibalczfgm9cu83ibal9cu83iwal9cu83ibabaefc9WfhPabcefgsaofhednaiTmbcmcsarcb9kgzEhHcbhOcbhAcbhCcbhXcbhQindnaeaP9nmbcbhvxikaQcufhvadaCcdtfgoydbhLaocwfydbhKaoclfydbhYcbh8Adndninalc;abfavcsGcitfgoydlhEdndndnaoydbgoaL9hmbaEaYSmekdnaoaY9hmbaEaK9hmba8Acefh8AxekaoaK9hmeaEaL9hmea8Acdfh8Aka8Ac870mdaXcufhvada8AciGcx2goc:y1jjbfydbaCfcdtfydbhEadaocN1jjbfydbaCfcdtfydbhKadaoc:q1jjbfydbaCfcdtfydbhLcbhodnindnalavcsGcdtfydbaE9hmbaohYxdkcuhYavcufhvaocefgocz9hmbkkaEaOSgvaYce9iaYaH9oVgoGh3dndndndndncbcsavEaYaoEgvcs9hmbarce9imbaEaEaAaEcefaASgvEgAcefSmecmcsavEhvkasava8Acdtc;WeGV86bbavcs9hmeaEaA9Rgvcetavc8F917hvinaeavcFb0crtavcFbGV86bbaecefheavcje6hoavcr4hvaoTmbkaEhAxdkcPhvasa8AcdtcPV86bbaEhAkavTmbavaH9imekalaXcdtfaEBdbaXcefcsGhXkaOa3fhOalc;abfaQcitfgvaKBdlavaEBdbalc;abfaQcefcsGgvcitfgoaEBdlaoaLBdbavcefhoxikavcufhva8Aclfg8Ac;ab9hmbkkdnadceaKaOScetaYaOSEcx2gvc:q1jjbfydbaCfcdtfydbgLTadavcN1jjbfydbaCfcdtfydbg8AceSGadavc:y1jjbfydbaCfcdtfydbgYcdSGaOcb9hGazGg5ce9hmbaw9cu83ibaD9cu83ibaq9cu83ibak9cu83ibax9cu83ibam9cu83ibal9cu83iwal9cu83ibcbhOkcbhEaXcufgvhodnindnalaocsGcdtfydba8A9hmbaEhKxdkcuhKaocufhoaEcefgEcz9hmbkkcbhodnindnalavcsGcdtfydbaY9hmbaohExdkcuhEavcufhvaocefgocz9hmbkkaOaLaOSg8Efh3dndnaKcm0mbaKcefhKxekcbcsa8Aa3SgvEhKa3avfh3kdndnaEcm0mbaEcefhExekcbcsaYa3SgvEhEa3avfh3kc9:cua8EEh8FaEaKcltVhocbhvdndndninavcj1jjbfRbbaocFeGSmeavcefgvcz9hmbxdkka5aLaO9havcm0VVmbasavc;WeV86bbxekasa8F86bbaeao86bbaecefhekdna8EmbaLaA9Rgvcetavc8F917hvinaeavcFb0gocrtavcFbGV86bbavcr4hvaecefheaombkaLhAkdnaKcs9hmba8AaA9Rgvcetavc8F917hvinaeavcFb0gocrtavcFbGV86bbavcr4hvaecefheaombka8AhAkdnaEcs9hmbaYaA9Rgvcetavc8F917hvinaeavcFb0gocrtavcFbGV86bbavcr4hvaecefheaombkaYhAkalaXcdtfaLBdbaXcefcsGhvdndnaKPzbeeeeeeeeeeeeeebekalavcdtfa8ABdbaXcdfcsGhvkdndnaEPzbeeeeeeeeeeeeeebekalavcdtfaYBdbavcefcsGhvkalc;abfaQcitfgoaLBdlaoa8ABdbalc;abfaQcefcsGcitfgoa8ABdlaoaYBdbalc;abfaQcdfcsGcitfgoaYBdlaoaLBdbaQcifhoavhXa3hOkascefhsaocsGhQaCcifgCai6mbkkcbhvaeaP0mbcbhvinaeavfavcj1jjbfRbb86bbavcefgvcz9hmbkaeab9Ravfhvkalc;aef8KjjjjbavkZeeucbhddninadcefgdc8F0meceadtae6mbkkadcrfcFeGcr9Uci2cdfabci9U2cHfkmbcbabBd:C:kjjbk:ydewu8Jjjjjbcz9Rhlcbhvdnaicvfae0mbcbhvabcbRb:C:kjjbc;qeV86bbal9cb83iwabcefhoabaefc98fhrdnaiTmbcbhwcbhDindnaoar6mbcbskadaDcdtfydbgqalcwfawaqav9Rgvavc8F91gv7av9Rc507gwcdtfgkydb9Rgvc8E91c9:Gavcdt7awVhvinaoavcFb0gecrtavcFbGV86bbavcr4hvaocefhoaembkakaqBdbaqhvaDcefgDai9hmbkkcbhvaoar0mbaocbBbbaoab9RclfhvkavkBeeucbhddninadcefgdc8F0meceadtae6mbkkadcwfcFeGcr9Uab2cvfk:dvli99dui99ludnaeTmbcuadcetcuftcu7:Yhvdndncuaicuftcu7:YgoJbbbZMgr:lJbbb9p9DTmbar:Ohwxekcjjjj94hwkcbhicbhDinalclfIdbgrJbbbbJbbjZalIdbgq:lar:lMalcwfIdbgk:lMgr:varJbbbb9BEgrNhxaqarNhralcxfIdbhqdndnakJbbbb9GTmbaxhkxekJbbjZar:l:tgkak:maxJbbbb9GEhkJbbjZax:l:tgxax:marJbbbb9GEhrkdndnaqJbbj:;aqJbbj:;9GEgxJbbjZaxJbbjZ9FEavNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohmxekcjjjj94hmkdndnakJbbj:;akJbbj:;9GEgqJbbjZaqJbbjZ9FEaoNJbbbZJbbb:;akJbbbb9GEMgq:lJbbb9p9DTmbaq:OhPxekcjjjj94hPkdndnarJbbj:;arJbbj:;9GEgqJbbjZaqJbbjZ9FEaoNJbbbZJbbb:;arJbbbb9GEMgr:lJbbb9p9DTmbar:Ohsxekcjjjj94hskdndnadcl9hmbabaifgzas86bbazcifam86bbazcdfaw86bbazcefaP86bbxekabaDfgzas87ebazcofam87ebazclfaw87ebazcdfaP87ebkalczfhlaiclfhiaDcwfhDaecufgembkkk;klld99eud99eudnaeTmbdndncuaicuftcu7:YgvJbbbZMgo:lJbbb9p9DTmbao:Ohixekcjjjj94hikaic;8FiGhrinabcofcicdalclfIdb:lalIdb:l9EgialcwfIdb:lalaicdtfIdb:l9EEgialcxfIdb:lalaicdtfIdb:l9EEgiarV87ebdndnalaicefciGcdtfIdbJ;Zl:1ZNJbbj:;JbbjZalaicdtfIdbJbbbb9DEgoNgwJbbj:;awJbbj:;9GEgDJbbjZaDJbbjZ9FEavNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohqxekcjjjj94hqkabaq87ebdndnaoalaicdfciGcdtfIdbJ;Zl:1ZNNgwJbbj:;awJbbj:;9GEgDJbbjZaDJbbjZ9FEavNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohqxekcjjjj94hqkabcdfaq87ebdndnaoalaicufciGcdtfIdbJ;Zl:1ZNNgoJbbj:;aoJbbj:;9GEgwJbbjZawJbbjZ9FEavNJbbbZJbbb:;aoJbbbb9GEMgo:lJbbb9p9DTmbao:Ohixekcjjjj94hikabclfai87ebabcwfhbalczfhlaecufgembkkk:Hvdxue998Jjjjjbcjd9Rgo8Kjjjjbadcd4hrdndndndnavcd9hmbadcl6mearcearce0EhwaohDinaDc:CuBdbaDclfhDawcufgwmbkaeTmiadcl6mdarcearce0EhqarcdthkalhxcbhminaohDaxhwaqhPinaDaDydbgsawydbgzcL4cFeGc:cufcbazEgzasaz9kEBdbawclfhwaDclfhDaPcufgPmbkaxakfhxamcefgmae9hmbkkaeTmdxekaeTmekavcb9hadcl6gqVhHarcearce0Ehkarcdthrceai9Rhmcbhdindndndnavce9hmbaqmdc:CuhwalhDakhPinawaDydbgscL4cFeGc:cufcbasEgsawas9kEhwaDclfhDaPcufgPmbxdkkc:CuhwaHmbaohDalhPakhsinaDaPydbgzcL4cFeGgxc8Aaxc8A9kEc:cufcbazEBdbaPclfhPaDclfhDascufgsmbkkaqmbcbhDakhsinawhPdnavceSmbaoaDfydbhPkdndnalaDfIdbgOcjjj;8iamaPfgPcLt9R::NJbbbZJbbb:;aOJbbbb9GEMgO:lJbbb9p9DTmbaO:Ohzxekcjjjj94hzkabaDfazcFFFrGaPcKtVBdbaDclfhDascufgsmbkkabarfhbalarfhladcefgdae9hmbkkaocjdf8KjjjjbkFkdCui998Jjjjjbc:Gd9Rgv8Kjjjjbavc:4efcbc;KbzNjjjb8AcbhodnadTmbcbhoaiTmbdnabae9hmbavcuadcdtgoadcFFFFi0Ecbyd:K:kjjbHjjjjbbgeBd:4eavceBd:ydaeabaoz:tjjjb8Akavc:OefcwfcbBdbav9cb83i:Oeavc:Oefaeadaiavc:4efz:njjjbcuaicdtgraicFFFFi0Egwcbyd:K:kjjbHjjjjbbhoavc:4efavyd:ydgDcdtfaoBdbavaDcefgqBd:ydaoavyd:Oegkarz:tjjjbhxavc:4efaqcdtfadci9Ugmcbyd:K:kjjbHjjjjbbgoBdbavaDcdfgrBd:ydaocbamzNjjjbhPavc:4efarcdtfawcbyd:K:kjjbHjjjjbbgsBdbavaDcifgqBd:ydaxhoashrinaralIdbalaoydbgwcwawcw6Ecdtfc;ebfIdbMUdbaoclfhoarclfhraicufgimbkavc:4efaqcdtfcuamcdtadcFFFF970Ecbyd:K:kjjbHjjjjbbgqBdbavaDclfBd:yddnadci6mbamceamce0EhiaehoaqhrinarasaoydbcdtfIdbasaoclfydbcdtfIdbMasaocwfydbcdtfIdbMUdbaocxfhoarclfhraicufgimbkkavc;qbfhzavhoavyd:SehHavyd:WehOcbhwcbhrcbhAcehCinaohXcihQaearci2gLcdtfgocwfydbhdaoydbhDabaAcx2fgiclfaoclfydbgKBdbaiaDBdbaicwfadBdbaParfce86bbazadBdwazaKBdlazaDBdbaqarcdtfcbBdbdnawTmbcihQaXhiinazaQcdtfaiydbgoBdbaQaoaD9haoaK9hGaoad9hGfhQaiclfhiawcufgwmbkkaAcefhAaxaDcdtfgoaoydbcufBdbaxaKcdtfgoaoydbcufBdbaxadcdtfgoaoydbcufBdbcbhwinaOaHaeawaLfcdtfydbcdtgifydbcdtfgKhoakaifgDydbgdhidnadTmbdninaoydbarSmeaoclfhoaicufgiTmdxbkkaoadcdtaKfc98fydbBdbaDaDydbcufBdbkawcefgwci9hmbkdndndnaQTmbcuhrJbbbbhYcbhDavyd:SehKavyd:WehLindndnakazaDcdtfydbcdtgofydbgimbaDcefhDxekaDcs0hwasaofgdIdbh8AadalcbaDcefgDawEcdtfIdbalaxaofydbgwcwawcw6Ecdtfc;ebfIdbMgEUdbaEa8A:thEaicdthiaLaKaofydbcdtfhoinaqaoydbgwcdtfgdaEadIdbMg8AUdba8AaYaYa8A9DgdEhYawaradEhraoclfhoaic98fgimbkkaDaQ9hmbkarcu9hmekaCam9pmeindnaPaCfRbbmbaChrxdkamaCcefgC9hmbxdkkaQczaQcz6EhwazhoaXhzarcu9hmekkavyd:ydhokaocdtavc:4effc98fhrdninaoTmearydbcbyd:G:kjjbH:bjjjbbarc98fhraocufhoxbkkavc:Gdf8Kjjjjbk;UlevucuaicdtgvaicFFFFi0Egocbyd:K:kjjbHjjjjbbhralalyd9GgwcdtfarBdbalawcefBd9GabarBdbaocbyd:K:kjjbHjjjjbbhralalyd9GgocdtfarBdbalaocefBd9GabarBdlcuadcdtadcFFFFi0Ecbyd:K:kjjbHjjjjbbhralalyd9GgocdtfarBdbalaocefBd9GabarBdwabydbcbavzNjjjb8Aadci9UhwdnadTmbabydbhoaehladhrinaoalydbcdtfgvavydbcefBdbalclfhlarcufgrmbkkdnaiTmbabydbhlabydlhrcbhvaihoinaravBdbarclfhralydbavfhvalclfhlaocufgombkkdnadci6mbawceawce0EhDabydlhrabydwhvcbhlinaecwfydbhoaeclfydbhdaraeydbcdtfgwawydbgwcefBdbavawcdtfalBdbaradcdtfgdadydbgdcefBdbavadcdtfalBdbaraocdtfgoaoydbgocefBdbavaocdtfalBdbaecxfheaDalcefgl9hmbkkdnaiTmbabydlheabydbhlinaeaeydbalydb9RBdbalclfhlaeclfheaicufgimbkkkQbabaeadaic:01jjbz:mjjjbkQbabaeadaic:C:jjjbz:mjjjbk9DeeuabcFeaicdtzNjjjbhlcbhbdnadTmbindnalaeydbcdtfgiydbcu9hmbaiabBdbabcefhbkaeclfheadcufgdmbkkabk;:kivuo99lu8Jjjjjbcj;Hb9Rgl8Kjjjjbcbhvalc1;Gbfcbc;KbzNjjjb8AalcuadcdtadcFFFFi0Egocbyd:K:kjjbHjjjjbbgrBd19GalceBd;O9Galcwfcbyd:m:kjjbBdbalcb8Pd:e:kjjb83ibalc;W;Gbfcwfcbyd:y:kjjbBdbalcb8Pd:q:kjjb83i;W9Gaicd4hwdndnadmbJFFuFhDJFFuuhqJFFuuhkJFFuFhxJFFuuhmJFFuFhPxekawcdthsaehzincbhiinalaifgHazaifIdbgDaHIdbgxaxaD9EEUdbalc;W;GbfaifgHaDaHIdbgxaxaD9DEUdbaiclfgicx9hmbkazasfhzavcefgvad9hmbkalIdwhqalId;49GhDalIdlhkalId;09GhxalIdbhmalId;W9GhPkdndnadTmbJbbbbJbbjZaPam:tJbbbb:xgPaxak:tgxaxaP9DEgxaDaq:tgDaDax9DEgD:vaDJbbbb9BEhDawcdthsarhHadhzindndnaDaeIdbam:tNJb;au9eNJbbbZMgx:lJbbb9p9DTmbax:Ohixekcjjjj94hikaicztaicwtcj;GiGVaicsGVc:p;G:dKGcH2c;d;H:WKGcv2c;j:KM;jbGhvdndnaDaeclfIdbak:tNJb;au9eNJbbbZMgx:lJbbb9p9DTmbax:Ohixekcjjjj94hikaicztaicwtcj;GiGVaicsGVc:p;G:dKGcH2c;d;H:WKGcq2cM;j:KMeGavVhvdndnaDaecwfIdbaq:tNJb;au9eNJbbbZMgx:lJbbb9p9DTmbax:Ohixekcjjjj94hikaHavaicztaicwtcj;GiGVaicsGVc:p;G:dKGcH2c;d;H:WKGcC2c:KM;j:KdGVBdbaeasfheaHclfhHazcufgzmbkalcbcj;GbzNjjjbhiarhHadheinaiaHydbgzcFrGcx2fgvavydbcefBdbaiazcq4cFrGcx2fgvavydlcefBdlaiazcC4cFrGcx2fgzazydwcefBdwaHclfhHaecufgembxdkkalcbcj;GbzNjjjb8AkcbhHcbhzcbhecbhvinalaHfgiydbhsaiazBdbaicwfgwydbhOawavBdbaiclfgiydbhwaiaeBdbasazfhzaOavfhvawaefheaHcxfgHcj;Gb9hmbkcbhialaocbyd:K:kjjbHjjjjbbgzBd:m9GdnadTmbabhHinaHaiBdbaHclfhHadaicefgi9hmbkadTmbabhiadhHinalaraiydbgecdtfydbcFrGcx2fgvavydbgvcefBdbazavcdtfaeBdbaiclfhiaHcufgHmbkazhiadhHinalaraiydbgecdtfydbcq4cFrGcx2fgvavydlgvcefBdlabavcdtfaeBdbaiclfhiaHcufgHmbkabhiadhHinalaraiydbgecdtfydbcC4cFrGcx2fgvavydwgvcefBdwazavcdtfaeBdbaiclfhiaHcufgHmbkadTmbcbhiinabazydbcdtfaiBdbazclfhzadaicefgi9hmbkkclhidninaic98Smealc1;Gbfaifydbcbyd:G:kjjbH:bjjjbbaic98fhixbkkalcj;Hbf8Kjjjjbk9teiucbcbyd:O:kjjbgeabcifc98GfgbBd:O:kjjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;LeeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiclfaeclfydbBdbaicwfaecwfydbBdbaicxfaecxfydbBdbaeczfheaiczfhiadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk;aeedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdbaicxfalBdbaicwfalBdbaiclfalBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabk9teiucbcbyd:O:kjjbgeabcrfc94GfgbBd:O:kjjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik9:eiuZbhedndncbyd:O:kjjbgdaecztgi9nmbcuheadai9RcFFifcz4nbcuSmekadhekcbabae9Rcifc98Gcbyd:O:kjjbfgdBd:O:kjjbdnadZbcztge9nmbadae9RcFFifcz4nb8Akkk:6ddbcjwk:Cdb4:h9w9N94:P:gW:j9O:ye9Pbbbbbbebbbdbbbebbbdbbbbbbbdbbbbbbbebbbbbbb:l29hZ;69:9kZ;N;76Z;rg97Z;z;o9xZ8J;B85Z;:;u9yZ;b;k9HZ:2;Z9DZ9e:l9mZ59A8KZ:r;T3Z:A:zYZ79OHZ;j4::8::Y:D9V8:bbbb9s:49:Z8R:hBZ9M9M;M8:L;z;o8:;8:PG89q;x:J878R:hQ8::M:B;e87bbbbbbjZbbjZbbjZ:E;V;N8::Y:DsZ9i;H;68:xd;R8:;h0838:;W:NoZbbbb:WV9O8:uf888:9i;H;68:9c9G;L89;n;m9m89;D8Ko8:bbbbf:8tZ9m836ZS:2AZL;zPZZ818EZ9e:lxZ;U98F8:819E;68:FFuuFFuuFFuuFFuFFFuFFFuFbc:Cqkzebbbebbbdbbb8WWbb\";\n\n\tvar wasmpack = new Uint8Array([32,0,65,2,1,106,34,33,3,128,11,4,13,64,6,253,10,7,15,116,127,5,8,12,40,16,19,54,20,9,27,255,113,17,42,67,24,23,146,148,18,14,22,45,70,69,56,114,101,21,25,63,75,136,108,28,118,29,73,115]);\n\n\tif (typeof WebAssembly !== 'object') {\n\t\treturn {\n\t\t\tsupported: false,\n\t\t};\n\t}\n\n\tvar instance;\n\n\tvar ready =\n\t\tWebAssembly.instantiate(unpack(wasm), {})\n\t\t.then(function(result) {\n\t\t\tinstance = result.instance;\n\t\t\tinstance.exports.__wasm_call_ctors();\n\t\t\tinstance.exports.meshopt_encodeVertexVersion(0);\n\t\t\tinstance.exports.meshopt_encodeIndexVersion(1);\n\t\t});\n\n\tfunction unpack(data) {\n\t\tvar result = new Uint8Array(data.length);\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tvar ch = data.charCodeAt(i);\n\t\t\tresult[i] = ch > 96 ? ch - 97 : ch > 64 ? ch - 39 : ch + 4;\n\t\t}\n\t\tvar write = 0;\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tresult[write++] = (result[i] < 60) ? wasmpack[result[i]] : (result[i] - 60) * 64 + result[++i];\n\t\t}\n\t\treturn result.buffer.slice(0, write);\n\t}\n\n\tfunction assert(cond) {\n\t\tif (!cond) {\n\t\t\tthrow new Error(\"Assertion failed\");\n\t\t}\n\t}\n\n\tfunction bytes(view) {\n\t\treturn new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n\t}\n\n\tfunction reorder(fun, indices, vertices, optf) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar ip = sbrk(indices.length * 4);\n\t\tvar rp = sbrk(vertices * 4);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar indices8 = bytes(indices);\n\t\theap.set(indices8, ip);\n\t\tif (optf) {\n\t\t\toptf(ip, ip, indices.length, vertices);\n\t\t}\n\t\tvar unique = fun(rp, ip, indices.length, vertices);\n\t\t// heap may have grown\n\t\theap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar remap = new Uint32Array(vertices);\n\t\tnew Uint8Array(remap.buffer).set(heap.subarray(rp, rp + vertices * 4));\n\t\tindices8.set(heap.subarray(ip, ip + indices.length * 4));\n\t\tsbrk(ip - sbrk(0));\n\n\t\tfor (var i = 0; i < indices.length; ++i)\n\t\t\tindices[i] = remap[indices[i]];\n\n\t\treturn [remap, unique];\n\t}\n\n\tfunction spatialsort(fun, positions, count, stride) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar ip = sbrk(count * 4);\n\t\tvar sp = sbrk(count * stride);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(bytes(positions), sp);\n\t\tfun(ip, sp, count, stride);\n\t\t// heap may have grown\n\t\theap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar remap = new Uint32Array(count);\n\t\tnew Uint8Array(remap.buffer).set(heap.subarray(ip, ip + count * 4));\n\t\tsbrk(ip - sbrk(0));\n\t\treturn remap;\n\t}\n\n\tfunction encode(fun, bound, source, count, size) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar tp = sbrk(bound);\n\t\tvar sp = sbrk(count * size);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(bytes(source), sp);\n\t\tvar res = fun(tp, bound, sp, count, size);\n\t\tvar target = new Uint8Array(res);\n\t\ttarget.set(heap.subarray(tp, tp + res));\n\t\tsbrk(tp - sbrk(0));\n\t\treturn target;\n\t}\n\n\tfunction maxindex(source) {\n\t\tvar result = 0;\n\t\tfor (var i = 0; i < source.length; ++i) {\n\t\t\tvar index = source[i];\n\t\t\tresult = result < index ? index : result;\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction index32(source, size) {\n\t\tassert(size == 2 || size == 4);\n\t\tif (size == 4) {\n\t\t\treturn new Uint32Array(source.buffer, source.byteOffset, source.byteLength / 4);\n\t\t} else {\n\t\t\tvar view = new Uint16Array(source.buffer, source.byteOffset, source.byteLength / 2);\n\t\t\treturn new Uint32Array(view); // copies each element\n\t\t}\n\t}\n\n\tfunction filter(fun, source, count, stride, bits, insize, mode) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar tp = sbrk(count * stride);\n\t\tvar sp = sbrk(count * insize);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(bytes(source), sp);\n\t\tfun(tp, count, stride, bits, sp, mode);\n\t\tvar target = new Uint8Array(count * stride);\n\t\ttarget.set(heap.subarray(tp, tp + count * stride));\n\t\tsbrk(tp - sbrk(0));\n\t\treturn target;\n\t}\n\n\treturn {\n\t\tready: ready,\n\t\tsupported: true,\n\t\treorderMesh: function(indices, triangles, optsize) {\n\t\t\tvar optf = triangles ? (optsize ? instance.exports.meshopt_optimizeVertexCacheStrip : instance.exports.meshopt_optimizeVertexCache) : undefined;\n\t\t\treturn reorder(instance.exports.meshopt_optimizeVertexFetchRemap, indices, maxindex(indices) + 1, optf);\n\t\t},\n\t\treorderPoints: function(positions, positions_stride) {\n\t\t\tassert(positions instanceof Float32Array);\n\t\t\tassert(positions.length % positions_stride == 0);\n\t\t\tassert(positions_stride >= 3);\n\t\t\treturn spatialsort(instance.exports.meshopt_spatialSortRemap, positions, positions.length / positions_stride, positions_stride * 4);\n\t\t},\n\t\tencodeVertexBuffer: function(source, count, size) {\n\t\t\tassert(size > 0 && size <= 256);\n\t\t\tassert(size % 4 == 0);\n\t\t\tvar bound = instance.exports.meshopt_encodeVertexBufferBound(count, size);\n\t\t\treturn encode(instance.exports.meshopt_encodeVertexBuffer, bound, source, count, size);\n\t\t},\n\t\tencodeIndexBuffer: function(source, count, size) {\n\t\t\tassert(size == 2 || size == 4);\n\t\t\tassert(count % 3 == 0);\n\t\t\tvar indices = index32(source, size);\n\t\t\tvar bound = instance.exports.meshopt_encodeIndexBufferBound(count, maxindex(indices) + 1);\n\t\t\treturn encode(instance.exports.meshopt_encodeIndexBuffer, bound, indices, count, 4);\n\t\t},\n\t\tencodeIndexSequence: function(source, count, size) {\n\t\t\tassert(size == 2 || size == 4);\n\t\t\tvar indices = index32(source, size);\n\t\t\tvar bound = instance.exports.meshopt_encodeIndexSequenceBound(count, maxindex(indices) + 1);\n\t\t\treturn encode(instance.exports.meshopt_encodeIndexSequence, bound, indices, count, 4);\n\t\t},\n\t\tencodeGltfBuffer: function(source, count, size, mode) {\n\t\t\tvar table = {\n\t\t\t\tATTRIBUTES: this.encodeVertexBuffer,\n\t\t\t\tTRIANGLES: this.encodeIndexBuffer,\n\t\t\t\tINDICES: this.encodeIndexSequence,\n\t\t\t};\n\t\t\tassert(table[mode]);\n\t\t\treturn table[mode](source, count, size);\n\t\t},\n\t\tencodeFilterOct: function(source, count, stride, bits) {\n\t\t\tassert(stride == 4 || stride == 8);\n\t\t\tassert(bits >= 1 && bits <= 16);\n\t\t\treturn filter(instance.exports.meshopt_encodeFilterOct, source, count, stride, bits, 16);\n\t\t},\n\t\tencodeFilterQuat: function(source, count, stride, bits) {\n\t\t\tassert(stride == 8);\n\t\t\tassert(bits >= 4 && bits <= 16);\n\t\t\treturn filter(instance.exports.meshopt_encodeFilterQuat, source, count, stride, bits, 16);\n\t\t},\n\t\tencodeFilterExp: function(source, count, stride, bits, mode) {\n\t\t\tassert(stride > 0 && stride % 4 == 0);\n\t\t\tassert(bits >= 1 && bits <= 24);\n\t\t\tvar table = {\n\t\t\t\tSeparate: 0,\n\t\t\t\tSharedVector: 1,\n\t\t\t\tSharedComponent: 2,\n\t\t\t};\n\t\t\treturn filter(instance.exports.meshopt_encodeFilterExp, source, count, stride, bits, stride, mode ? table[mode] : 1);\n\t\t},\n\t};\n})();\n\nexport { MeshoptEncoder };\n","// This file is part of meshoptimizer library and is distributed under the terms of MIT License.\n// Copyright (C) 2016-2023, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)\nvar MeshoptDecoder = (function() {\n\t// Built with clang version 16.0.0\n\t// Built from meshoptimizer 0.20\n\tvar wasm_base = \"b9H79Tebbbe8Fv9Gbb9Gvuuuuueu9Giuuub9Geueu9Giuuueuikqbeeedddillviebeoweuec:q;iekr;leDo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbeY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVbdE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbiL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtblK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949Wbol79IV9Rbrq;d8Yqdbk:yzeHu8Jjjjjbcj;eb9Rgv8Kjjjjbc9:hodnadcefal0mbcuhoaiRbbc:Ge9hmbavaialfgrad9Radz1jjjbhwcj;abad9UhlaicefhodnadTmbalc;WFbGglcjdalcjd6EhDcbhqinaqae9pmeaDaeaq9RaqaDfae6Egkcsfglcl4cifcd4hxdndndndnalc9WGgmTmbcbhPcehsawcjdfhzaohHinaraH9Rax6midnaraHaxfgo9RcK6mbczhlcbhOinalgic9WfgAawcj;cbffhldndndndndnaHaAco4fRbbaOcoG4ciGPlbedibkal9cb83ibalcwf9cb83ibxikalaoRblaoRbbgAco4gCaCciSgCE86bbawcj;cbfaifglcGfaoclfaCfgCRbbaAcl4ciGgXaXciSgXE86bbalcVfaCaXfgCRbbaAcd4ciGgXaXciSgXE86bbalc7faCaXfgCRbbaAciGgAaAciSgAE86bbalctfaCaAfgCRbbaoRbegAco4gXaXciSgXE86bbalc91faCaXfgCRbbaAcl4ciGgXaXciSgXE86bbalc4faCaXfgCRbbaAcd4ciGgXaXciSgXE86bbalc93faCaXfgCRbbaAciGgAaAciSgAE86bbalc94faCaAfgCRbbaoRbdgAco4gXaXciSgXE86bbalc95faCaXfgCRbbaAcl4ciGgXaXciSgXE86bbalc96faCaXfgCRbbaAcd4ciGgXaXciSgXE86bbalc97faCaXfgCRbbaAciGgAaAciSgAE86bbalc98faCaAfgARbbaoRbigoco4gCaCciSgCE86bbalc99faAaCfgARbbaocl4ciGgCaCciSgCE86bbalc9:faAaCfgARbbaocd4ciGgCaCciSgCE86bbalcufaAaCfglRbbaociGgoaociSgoE86bbalaofhoxdkalaoRbwaoRbbgAcl4gCaCcsSgCE86bbawcj;cbfaifglcGfaocwfaCfgCRbbaAcsGgAaAcsSgAE86bbalcVfaCaAfgARbbaoRbegCcl4gXaXcsSgXE86bbalc7faAaXfgARbbaCcsGgCaCcsSgCE86bbalctfaAaCfgARbbaoRbdgCcl4gXaXcsSgXE86bbalc91faAaXfgARbbaCcsGgCaCcsSgCE86bbalc4faAaCfgARbbaoRbigCcl4gXaXcsSgXE86bbalc93faAaXfgARbbaCcsGgCaCcsSgCE86bbalc94faAaCfgARbbaoRblgCcl4gXaXcsSgXE86bbalc95faAaXfgARbbaCcsGgCaCcsSgCE86bbalc96faAaCfgARbbaoRbvgCcl4gXaXcsSgXE86bbalc97faAaXfgARbbaCcsGgCaCcsSgCE86bbalc98faAaCfgARbbaoRbogCcl4gXaXcsSgXE86bbalc99faAaXfgARbbaCcsGgCaCcsSgCE86bbalc9:faAaCfgARbbaoRbrgocl4gCaCcsSgCE86bbalcufaAaCfglRbbaocsGgoaocsSgoE86bbalaofhoxekalao8Pbb83bbalcwfaocwf8Pbb83bbaoczfhokdnaiam9pmbaOcdfhOaiczfhlarao9RcL0mekkaiam6miaoTmidnakTmbawaPfRbbhOawcj;cbfhlazhiakhAinaialRbbgHce4cbaHceG9R7aOfgO86bbaiadfhialcefhlaAcufgAmbkkazcefhzaPcefgPad6hsaohHaPad9hmexvkkcbhoasceGmdxikaoaxad2fhXdnakTmbcbhmcehsawcjdfhCinarao9Rax6miaoTmdaoaxfhoawamfRbbhOawcj;cbfhlaChiakhAinaialRbbgHce4cbaHceG9R7aOfgO86bbaiadfhialcefhlaAcufgAmbkaCcefhCamcefgmad6hsamad9hmbkaXhoxikcbhlcehsinarao9Rax6mdaoTmeaoaxfhoalcefglad6hsadal9hmbkaXhoxdkcbhoasceGTmekc9:hoxikabaqad2fawcjdfakad2z1jjjb8Aawawcjdfakcufad2fadz1jjjb8Aakaqfhqaombkc9:hoxekcbc99arao9Radcaadca0ESEhokavcj;ebf8Kjjjjbaok;xzeHu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnaeci9UgrcHfal0mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgDce0mbavc;abfcFecjez:jjjjb8AavcUf9cu83ibavc8Wf9cu83ibavcyf9cu83ibavcaf9cu83ibavcKf9cu83ibavczf9cu83ibav9cu83iwav9cu83ibaialfc9WfhqaicefgwarfhodnaeTmbcmcsaDceSEhkcbhxcbhmcbhrcbhicbhlindnaoaq9nmbc9:hoxikdndnawRbbgDc;Ve0mbavc;abfalaDcu7gPcl4fcsGcitfgsydlhzasydbhHdnaDcsGgDak9pmbavaiaPfcsGcdtfydbaxaDEhsaDThDdndnadcd9hmbabarcetfgPaH87ebaPcdfaz87ebaPclfas87ebxekabarcdtfgPaHBdbaPclfazBdbaPcwfasBdbkaxaDfhxavc;abfalcitfgPasBdbaPazBdlavaicdtfasBdbavc;abfalcefcsGglcitfgPaHBdbaPasBdlaiaDfhialcefhlxdkdndnaDcsSmbamaDfaDc987fcefhmxekaocefhDao8SbbgscFeGhPdndnascu9mmbaDhoxekaocvfhoaPcFbGhPcrhsdninaD8SbbgOcFbGastaPVhPaOcu9kmeaDcefhDascrfgsc8J9hmbxdkkaDcefhokaPce4cbaPceG9R7amfhmkdndnadcd9hmbabarcetfgDaH87ebaDcdfaz87ebaDclfam87ebxekabarcdtfgDaHBdbaDclfazBdbaDcwfamBdbkavc;abfalcitfgDamBdbaDazBdlavaicdtfamBdbavc;abfalcefcsGglcitfgDaHBdbaDamBdlaicefhialcefhlxekdnaDcpe0mbaxcefgOavaiaqaDcsGfRbbgscl49RcsGcdtfydbascz6gPEhDavaias9RcsGcdtfydbaOaPfgzascsGgOEhsaOThOdndnadcd9hmbabarcetfgHax87ebaHcdfaD87ebaHclfas87ebxekabarcdtfgHaxBdbaHclfaDBdbaHcwfasBdbkavaicdtfaxBdbavc;abfalcitfgHaDBdbaHaxBdlavaicefgicsGcdtfaDBdbavc;abfalcefcsGcitfgHasBdbaHaDBdlavaiaPfcsGgicdtfasBdbavc;abfalcdfcsGglcitfgDaxBdbaDasBdlalcefhlaiaOfhiazaOfhxxekaxcbaoRbbgHEgAaDc;:eSgDfhzaHcsGhCaHcl4hXdndnaHcs0mbazcefhOxekazhOavaiaX9RcsGcdtfydbhzkdndnaCmbaOcefhxxekaOhxavaiaH9RcsGcdtfydbhOkdndnaDTmbaocefhDxekaocdfhDao8SbegPcFeGhsdnaPcu9kmbaocofhAascFbGhscrhodninaD8SbbgPcFbGaotasVhsaPcu9kmeaDcefhDaocrfgoc8J9hmbkaAhDxekaDcefhDkasce4cbasceG9R7amfgmhAkdndnaXcsSmbaDhsxekaDcefhsaD8SbbgocFeGhPdnaocu9kmbaDcvfhzaPcFbGhPcrhodninas8SbbgDcFbGaotaPVhPaDcu9kmeascefhsaocrfgoc8J9hmbkazhsxekascefhskaPce4cbaPceG9R7amfgmhzkdndnaCcsSmbashoxekascefhoas8SbbgDcFeGhPdnaDcu9kmbascvfhOaPcFbGhPcrhDdninao8SbbgscFbGaDtaPVhPascu9kmeaocefhoaDcrfgDc8J9hmbkaOhoxekaocefhokaPce4cbaPceG9R7amfgmhOkdndnadcd9hmbabarcetfgDaA87ebaDcdfaz87ebaDclfaO87ebxekabarcdtfgDaABdbaDclfazBdbaDcwfaOBdbkavc;abfalcitfgDazBdbaDaABdlavaicdtfaABdbavc;abfalcefcsGcitfgDaOBdbaDazBdlavaicefgicsGcdtfazBdbavc;abfalcdfcsGcitfgDaABdbaDaOBdlavaiaHcz6aXcsSVfgicsGcdtfaOBdbaiaCTaCcsSVfhialcifhlkawcefhwalcsGhlaicsGhiarcifgrae6mbkkcbc99aoaqSEhokavc;aef8Kjjjjbaok:flevu8Jjjjjbcz9Rhvc9:hodnaecvfal0mbcuhoaiRbbc;:eGc;qe9hmbav9cb83iwaicefhraialfc98fhwdnaeTmbdnadcdSmbcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcdtfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfglBdbaoalBdbaDcefgDae9hmbxdkkcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcetfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfgl87ebaoalBdbaDcefgDae9hmbkkcbc99arawSEhokaok:Lvoeue99dud99eud99dndnadcl9hmbaeTmeindndnabcdfgd8Sbb:Yab8Sbbgi:Ygl:l:tabcefgv8Sbbgo:Ygr:l:tgwJbb;:9cawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai86bbdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad86bbdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad86bbabclfhbaecufgembxdkkaeTmbindndnabclfgd8Ueb:Yab8Uebgi:Ygl:l:tabcdfgv8Uebgo:Ygr:l:tgwJb;:FSawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai87ebdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad87ebdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad87ebabcwfhbaecufgembkkk;siliui99iue99dnaeTmbcbhiabhlindndnJ;Zl81Zalcof8UebgvciV:Y:vgoal8Ueb:YNgrJb;:FSNJbbbZJbbb:;arJbbbb9GEMgw:lJbbb9p9DTmbaw:OhDxekcjjjj94hDkalclf8Uebhqalcdf8UebhkabaiavcefciGfcetfaD87ebdndnaoak:YNgwJb;:FSNJbbbZJbbb:;awJbbbb9GEMgx:lJbbb9p9DTmbax:Ohkxekcjjjj94hkkabaiavcdfciGfcetfak87ebdndnaoaq:YNgoJb;:FSNJbbbZJbbb:;aoJbbbb9GEMgx:lJbbb9p9DTmbax:Ohqxekcjjjj94hqkabaiavcufciGfcetfaq87ebdndnJbbjZararN:tawawN:taoaoN:tgrJbbbbarJbbbb9GE:rJb;:FSNJbbbZMgr:lJbbb9p9DTmbar:Ohqxekcjjjj94hqkabaiavciGfcetfaq87ebalcwfhlaiclfhiaecufgembkkk9mbdnadcd4ae2gdTmbinababydbgecwtcw91:Yaece91cjjj98Gcjjj;8if::NUdbabclfhbadcufgdmbkkk9teiucbcbydj1jjbgeabcifc98GfgbBdj1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;LeeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiclfaeclfydbBdbaicwfaecwfydbBdbaicxfaecxfydbBdbaeczfheaiczfhiadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk;aeedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdbaicxfalBdbaicwfalBdbaiclfalBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabkkkebcjwklz9Kbb\";\n\tvar wasm_simd = \"b9H79TebbbeKl9Gbb9Gvuuuuueu9Giuuub9Geueuikqbbebeedddilve9Weeeviebeoweuec:q;Aekr;leDo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbdY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVblE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtboK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbrL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949Wbwl79IV9RbDq;b9tqlbzik9:evu8Jjjjjbcz9Rhbcbheincbhdcbhiinabcwfadfaicjuaead4ceGglE86bbaialfhiadcefgdcw9hmbkaec:q:yjjbfai86bbaecitc:q1jjbfab8Piw83ibaecefgecjd9hmbkk;e8JlHud97euo978Jjjjjbcj;kb9Rgv8Kjjjjbc9:hodnadcefal0mbcuhoaiRbbc:Ge9hmbavaialfgrad9Rad;8qbbcj;abad9UhoaicefhldnadTmbaoc;WFbGgocjdaocjd6EhwcbhDinaDae9pmeawaeaD9RaDawfae6Egqcsfgoc9WGgkci2hxakcethmaocl4cifcd4hPabaDad2fhscbhzdnincbhHalhOcbhAdninaraO9RaP6miavcj;cbfaAak2fhCaOaPfhlcbhidnakc;ab6mbaral9Rc;Gb6mbcbhoinaCaofhidndndndndnaOaoco4fRbbgXciGPlbedibkaipxbbbbbbbbbbbbbbbbpklbxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklbalczfhlkdndndndndnaXcd4ciGPlbedibkaipxbbbbbbbbbbbbbbbbpklzxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklzalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklzalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklzalczfhlkdndndndndnaXcl4ciGPlbedibkaipxbbbbbbbbbbbbbbbbpklaxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklaalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklaalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklaalczfhlkdndndndndnaXco4Plbedibkaipxbbbbbbbbbbbbbbbbpkl8WxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibaXc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkl8WalclfaYpQbfaXc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibaXc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkl8WalcwfaYpQbfaXc:q:yjjbfRbbfhlxekaialpbbbpkl8Walczfhlkaoc;abfhiaocjefak0meaihoaral9Rc;Fb0mbkkdndnaiak9pmbaici4hoinaral9RcK6mdaCaifhXdndndndndnaOaico4fRbbaocoG4ciGPlbedibkaXpxbbbbbbbbbbbbbbbbpklbxikaXalpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaXalpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaXalpbbbpklbalczfhlkaocdfhoaiczfgiak6mbkkalTmbaAcd0hHalhOaAcefgAclSmdxekkcbhlaHceGTmdkdnakTmbavcjdfazfhiavazfpbdbhYcbhXinaiavcj;cbfaXfgopblbgLcep9TaLpxeeeeeeeeeeeeeeeegQp9op9Hp9rgLaoakfpblbg8Acep9Ta8AaQp9op9Hp9rg8ApmbzeHdOiAlCvXoQrLgEaoamfpblbg3cep9Ta3aQp9op9Hp9rg3aoaxfpblbg5cep9Ta5aQp9op9Hp9rg5pmbzeHdOiAlCvXoQrLg8EpmbezHdiOAlvCXorQLgQaQpmbedibedibedibediaYp9UgYp9AdbbaiadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaEa8EpmwDKYqk8AExm35Ps8E8FgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaLa8ApmwKDYq8AkEx3m5P8Es8FgLa3a5pmwKDYq8AkEx3m5P8Es8Fg8ApmbezHdiOAlvCXorQLgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaLa8ApmwDKYqk8AExm35Ps8E8FgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfhiaXczfgXak6mbkkazclfgzad6mbkasavcjdfaqad2;8qbbavavcjdfaqcufad2fad;8qbbaqaDfhDc9:hoalmexikkc9:hoxekcbc99aral9Radcaadca0ESEhokavcj;kbf8Kjjjjbaokwbz:bjjjbk;tzeHu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnaeci9UgrcHfal0mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgDce0mbavc;abfcFecje;8kbavcUf9cu83ibavc8Wf9cu83ibavcyf9cu83ibavcaf9cu83ibavcKf9cu83ibavczf9cu83ibav9cu83iwav9cu83ibaialfc9WfhqaicefgwarfhodnaeTmbcmcsaDceSEhkcbhxcbhmcbhrcbhicbhlindnaoaq9nmbc9:hoxikdndnawRbbgDc;Ve0mbavc;abfalaDcu7gPcl4fcsGcitfgsydlhzasydbhHdnaDcsGgDak9pmbavaiaPfcsGcdtfydbaxaDEhsaDThDdndnadcd9hmbabarcetfgPaH87ebaPcdfaz87ebaPclfas87ebxekabarcdtfgPaHBdbaPclfazBdbaPcwfasBdbkaxaDfhxavc;abfalcitfgPasBdbaPazBdlavaicdtfasBdbavc;abfalcefcsGglcitfgPaHBdbaPasBdlaiaDfhialcefhlxdkdndnaDcsSmbamaDfaDc987fcefhmxekaocefhDao8SbbgscFeGhPdndnascu9mmbaDhoxekaocvfhoaPcFbGhPcrhsdninaD8SbbgOcFbGastaPVhPaOcu9kmeaDcefhDascrfgsc8J9hmbxdkkaDcefhokaPce4cbaPceG9R7amfhmkdndnadcd9hmbabarcetfgDaH87ebaDcdfaz87ebaDclfam87ebxekabarcdtfgDaHBdbaDclfazBdbaDcwfamBdbkavc;abfalcitfgDamBdbaDazBdlavaicdtfamBdbavc;abfalcefcsGglcitfgDaHBdbaDamBdlaicefhialcefhlxekdnaDcpe0mbaxcefgOavaiaqaDcsGfRbbgscl49RcsGcdtfydbascz6gPEhDavaias9RcsGcdtfydbaOaPfgzascsGgOEhsaOThOdndnadcd9hmbabarcetfgHax87ebaHcdfaD87ebaHclfas87ebxekabarcdtfgHaxBdbaHclfaDBdbaHcwfasBdbkavaicdtfaxBdbavc;abfalcitfgHaDBdbaHaxBdlavaicefgicsGcdtfaDBdbavc;abfalcefcsGcitfgHasBdbaHaDBdlavaiaPfcsGgicdtfasBdbavc;abfalcdfcsGglcitfgDaxBdbaDasBdlalcefhlaiaOfhiazaOfhxxekaxcbaoRbbgHEgAaDc;:eSgDfhzaHcsGhCaHcl4hXdndnaHcs0mbazcefhOxekazhOavaiaX9RcsGcdtfydbhzkdndnaCmbaOcefhxxekaOhxavaiaH9RcsGcdtfydbhOkdndnaDTmbaocefhDxekaocdfhDao8SbegPcFeGhsdnaPcu9kmbaocofhAascFbGhscrhodninaD8SbbgPcFbGaotasVhsaPcu9kmeaDcefhDaocrfgoc8J9hmbkaAhDxekaDcefhDkasce4cbasceG9R7amfgmhAkdndnaXcsSmbaDhsxekaDcefhsaD8SbbgocFeGhPdnaocu9kmbaDcvfhzaPcFbGhPcrhodninas8SbbgDcFbGaotaPVhPaDcu9kmeascefhsaocrfgoc8J9hmbkazhsxekascefhskaPce4cbaPceG9R7amfgmhzkdndnaCcsSmbashoxekascefhoas8SbbgDcFeGhPdnaDcu9kmbascvfhOaPcFbGhPcrhDdninao8SbbgscFbGaDtaPVhPascu9kmeaocefhoaDcrfgDc8J9hmbkaOhoxekaocefhokaPce4cbaPceG9R7amfgmhOkdndnadcd9hmbabarcetfgDaA87ebaDcdfaz87ebaDclfaO87ebxekabarcdtfgDaABdbaDclfazBdbaDcwfaOBdbkavc;abfalcitfgDazBdbaDaABdlavaicdtfaABdbavc;abfalcefcsGcitfgDaOBdbaDazBdlavaicefgicsGcdtfazBdbavc;abfalcdfcsGcitfgDaABdbaDaOBdlavaiaHcz6aXcsSVfgicsGcdtfaOBdbaiaCTaCcsSVfhialcifhlkawcefhwalcsGhlaicsGhiarcifgrae6mbkkcbc99aoaqSEhokavc;aef8Kjjjjbaok:flevu8Jjjjjbcz9Rhvc9:hodnaecvfal0mbcuhoaiRbbc;:eGc;qe9hmbav9cb83iwaicefhraialfc98fhwdnaeTmbdnadcdSmbcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcdtfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfglBdbaoalBdbaDcefgDae9hmbxdkkcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcetfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfgl87ebaoalBdbaDcefgDae9hmbkkcbc99arawSEhokaok:wPliuo97eue978Jjjjjbca9Rhiaec98Ghldndnadcl9hmbdnalTmbcbhvabhdinadadpbbbgocKp:RecKp:Sep;6egraocwp:RecKp:Sep;6earp;Geaoczp:RecKp:Sep;6egwp;Gep;Kep;LegDpxbbbbbbbbbbbbbbbbp:2egqarpxbbbjbbbjbbbjbbbjgkp9op9rp;Kegrpxbb;:9cbb;:9cbb;:9cbb;:9cararp;MeaDaDp;Meawaqawakp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFbbbFbbbFbbbFbbbp9oaopxbbbFbbbFbbbFbbbFp9op9qarawp;Meaqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaDawp;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpkbbadczfhdavclfgval6mbkkalae9pmeaipxbbbbbbbbbbbbbbbbgqpklbaiabalcdtfgdaeciGglcdtgv;8qbbdnalTmbaiaipblbgocKp:RecKp:Sep;6egraocwp:RecKp:Sep;6earp;Geaoczp:RecKp:Sep;6egwp;Gep;Kep;LegDaqp:2egqarpxbbbjbbbjbbbjbbbjgkp9op9rp;Kegrpxbb;:9cbb;:9cbb;:9cbb;:9cararp;MeaDaDp;Meawaqawakp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFbbbFbbbFbbbFbbbp9oaopxbbbFbbbFbbbFbbbFp9op9qarawp;Meaqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaDawp;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpklbkadaiav;8qbbskdnalTmbcbhvabhdinadczfgxaxpbbbgopxbbbbbbFFbbbbbbFFgkp9oadpbbbgDaopmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eaDaopmbediwDqkzHOAKY8AEgoczp:Sep;6egrp;Geaoczp:Reczp:Sep;6egwp;Gep;Kep;Legopxb;:FSb;:FSb;:FSb;:FSawaopxbbbbbbbbbbbbbbbbp:2egqawpxbbbjbbbjbbbjbbbjgmp9op9rp;Kegwawp;Meaoaop;Mearaqaramp9op9rp;Kegoaop;Mep;Kep;Kep;Jep;Negrp;Mepxbbn0bbn0bbn0bbn0gqp;Keczp:Reawarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9op9qgwaoarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9ogopmwDKYqk8AExm35Ps8E8Fp9qpkbbadaDakp9oawaopmbezHdiOAlvCXorQLp9qpkbbadcafhdavclfgval6mbkkalae9pmbaiaeciGgvcitgdfcbcaad9R;8kbaiabalcitfglad;8qbbdnavTmbaiaipblzgopxbbbbbbFFbbbbbbFFgkp9oaipblbgDaopmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eaDaopmbediwDqkzHOAKY8AEgoczp:Sep;6egrp;Geaoczp:Reczp:Sep;6egwp;Gep;Kep;Legopxb;:FSb;:FSb;:FSb;:FSawaopxbbbbbbbbbbbbbbbbp:2egqawpxbbbjbbbjbbbjbbbjgmp9op9rp;Kegwawp;Meaoaop;Mearaqaramp9op9rp;Kegoaop;Mep;Kep;Kep;Jep;Negrp;Mepxbbn0bbn0bbn0bbn0gqp;Keczp:Reawarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9op9qgwaoarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9ogopmwDKYqk8AExm35Ps8E8Fp9qpklzaiaDakp9oawaopmbezHdiOAlvCXorQLp9qpklbkalaiad;8qbbkk;4wllue97euv978Jjjjjbc8W9Rhidnaec98GglTmbcbhvabhoinaiaopbbbgraoczfgwpbbbgDpmlvorxmPsCXQL358E8Fgqczp:Segkclp:RepklbaopxbbjZbbjZbbjZbbjZpx;Zl81Z;Zl81Z;Zl81Z;Zl81Zakpxibbbibbbibbbibbbp9qp;6ep;NegkaraDpmbediwDqkzHOAKY8AEgrczp:Reczp:Sep;6ep;MegDaDp;Meakarczp:Sep;6ep;Megxaxp;Meakaqczp:Reczp:Sep;6ep;Megqaqp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jepxb;:FSb;:FSb;:FSb;:FSgkp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbgmp9oaxakp;Mearp;Keczp:Rep9qgxaqakp;Mearp;Keczp:ReaDakp;Mearp;Keamp9op9qgkpmbezHdiOAlvCXorQLgrp5baipblbpEb:T:j83ibaocwfarp5eaipblbpEe:T:j83ibawaxakpmwDKYqk8AExm35Ps8E8Fgkp5baipblbpEd:T:j83ibaocKfakp5eaipblbpEi:T:j83ibaocafhoavclfgval6mbkkdnalae9pmbaiaeciGgvcitgofcbcaao9R;8kbaiabalcitfgwao;8qbbdnavTmbaiaipblbgraipblzgDpmlvorxmPsCXQL358E8Fgqczp:Segkclp:RepklaaipxbbjZbbjZbbjZbbjZpx;Zl81Z;Zl81Z;Zl81Z;Zl81Zakpxibbbibbbibbbibbbp9qp;6ep;NegkaraDpmbediwDqkzHOAKY8AEgrczp:Reczp:Sep;6ep;MegDaDp;Meakarczp:Sep;6ep;Megxaxp;Meakaqczp:Reczp:Sep;6ep;Megqaqp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jepxb;:FSb;:FSb;:FSb;:FSgkp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbgmp9oaxakp;Mearp;Keczp:Rep9qgxaqakp;Mearp;Keczp:ReaDakp;Mearp;Keamp9op9qgkpmbezHdiOAlvCXorQLgrp5baipblapEb:T:j83ibaiarp5eaipblapEe:T:j83iwaiaxakpmwDKYqk8AExm35Ps8E8Fgkp5baipblapEd:T:j83izaiakp5eaipblapEi:T:j83iKkawaiao;8qbbkk:Pddiue978Jjjjjbc;ab9Rhidnadcd4ae2glc98GgvTmbcbheabhdinadadpbbbgocwp:Recwp:Sep;6eaocep:SepxbbjFbbjFbbjFbbjFp9opxbbjZbbjZbbjZbbjZp:Uep;Mepkbbadczfhdaeclfgeav6mbkkdnaval9pmbaialciGgecdtgdVcbc;abad9R;8kbaiabavcdtfgvad;8qbbdnaeTmbaiaipblbgocwp:Recwp:Sep;6eaocep:SepxbbjFbbjFbbjFbbjFp9opxbbjZbbjZbbjZbbjZp:Uep;Mepklbkavaiad;8qbbkk9teiucbcbydj1jjbgeabcifc98GfgbBdj1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaikkkebcjwklz9Tbb\";\n\n\tvar detector = new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,3,2,0,0,5,3,1,0,1,12,1,0,10,22,2,12,0,65,0,65,0,65,0,252,10,0,0,11,7,0,65,0,253,15,26,11]);\n\tvar wasmpack = new Uint8Array([32,0,65,2,1,106,34,33,3,128,11,4,13,64,6,253,10,7,15,116,127,5,8,12,40,16,19,54,20,9,27,255,113,17,42,67,24,23,146,148,18,14,22,45,70,69,56,114,101,21,25,63,75,136,108,28,118,29,73,115]);\n\n\tif (typeof WebAssembly !== 'object') {\n\t\treturn {\n\t\t\tsupported: false,\n\t\t};\n\t}\n\n\tvar wasm = WebAssembly.validate(detector) ? wasm_simd : wasm_base;\n\n\tvar instance;\n\n\tvar ready =\n\t\tWebAssembly.instantiate(unpack(wasm), {})\n\t\t.then(function(result) {\n\t\t\tinstance = result.instance;\n\t\t\tinstance.exports.__wasm_call_ctors();\n\t\t});\n\n\tfunction unpack(data) {\n\t\tvar result = new Uint8Array(data.length);\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tvar ch = data.charCodeAt(i);\n\t\t\tresult[i] = ch > 96 ? ch - 97 : ch > 64 ? ch - 39 : ch + 4;\n\t\t}\n\t\tvar write = 0;\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tresult[write++] = (result[i] < 60) ? wasmpack[result[i]] : (result[i] - 60) * 64 + result[++i];\n\t\t}\n\t\treturn result.buffer.slice(0, write);\n\t}\n\n\tfunction decode(instance, fun, target, count, size, source, filter) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar count4 = (count + 3) & ~3;\n\t\tvar tp = sbrk(count4 * size);\n\t\tvar sp = sbrk(source.length);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(source, sp);\n\t\tvar res = fun(tp, count, size, sp, source.length);\n\t\tif (res == 0 && filter) {\n\t\t\tfilter(tp, count4, size);\n\t\t}\n\t\ttarget.set(heap.subarray(tp, tp + count * size));\n\t\tsbrk(tp - sbrk(0));\n\t\tif (res != 0) {\n\t\t\tthrow new Error(\"Malformed buffer data: \" + res);\n\t\t}\n\t}\n\n\tvar filters = {\n\t\tNONE: \"\",\n\t\tOCTAHEDRAL: \"meshopt_decodeFilterOct\",\n\t\tQUATERNION: \"meshopt_decodeFilterQuat\",\n\t\tEXPONENTIAL: \"meshopt_decodeFilterExp\",\n\t};\n\n\tvar decoders = {\n\t\tATTRIBUTES: \"meshopt_decodeVertexBuffer\",\n\t\tTRIANGLES: \"meshopt_decodeIndexBuffer\",\n\t\tINDICES: \"meshopt_decodeIndexSequence\",\n\t};\n\n\tvar workers = [];\n\tvar requestId = 0;\n\n\tfunction createWorker(url) {\n\t\tvar worker = {\n\t\t\tobject: new Worker(url),\n\t\t\tpending: 0,\n\t\t\trequests: {}\n\t\t};\n\n\t\tworker.object.onmessage = function(event) {\n\t\t\tvar data = event.data;\n\n\t\t\tworker.pending -= data.count;\n\t\t\tworker.requests[data.id][data.action](data.value);\n\t\t\tdelete worker.requests[data.id];\n\t\t};\n\n\t\treturn worker;\n\t}\n\n\tfunction initWorkers(count) {\n\t\tvar source =\n\t\t\t\"self.ready = WebAssembly.instantiate(new Uint8Array([\" + new Uint8Array(unpack(wasm)) + \"]), {})\" +\n\t\t\t\".then(function(result) { result.instance.exports.__wasm_call_ctors(); return result.instance; });\" +\n\t\t\t\"self.onmessage = \" + workerProcess.name + \";\" + decode.toString() + workerProcess.toString();\n\n\t\tvar blob = new Blob([source], {type: 'text/javascript'});\n\t\tvar url = URL.createObjectURL(blob);\n\n\t\tfor (var i = workers.length; i < count; ++i) {\n\t\t\tworkers[i] = createWorker(url);\n\t\t}\n\n\t\tfor (var i = count; i < workers.length; ++i) {\n\t\t\tworkers[i].object.postMessage({});\n\t\t}\n\n\t\tworkers.length = count;\n\n\t\tURL.revokeObjectURL(url);\n\t}\n\n\tfunction decodeWorker(count, size, source, mode, filter) {\n\t\tvar worker = workers[0];\n\n\t\tfor (var i = 1; i < workers.length; ++i) {\n\t\t\tif (workers[i].pending < worker.pending) {\n\t\t\t\tworker = workers[i];\n\t\t\t}\n\t\t}\n\n\t\treturn new Promise(function (resolve, reject) {\n\t\t\tvar data = new Uint8Array(source);\n\t\t\tvar id = ++requestId;\n\n\t\t\tworker.pending += count;\n\t\t\tworker.requests[id] = { resolve: resolve, reject: reject };\n\t\t\tworker.object.postMessage({ id: id, count: count, size: size, source: data, mode: mode, filter: filter }, [ data.buffer ]);\n\t\t});\n\t}\n\n\tfunction workerProcess(event) {\n\t\tvar data = event.data;\n\t\tif (!data.id) {\n\t\t\treturn self.close();\n\t\t}\n\t\tself.ready.then(function(instance) {\n\t\t\ttry {\n\t\t\t\tvar target = new Uint8Array(data.count * data.size);\n\t\t\t\tdecode(instance, instance.exports[data.mode], target, data.count, data.size, data.source, instance.exports[data.filter]);\n\t\t\t\tself.postMessage({ id: data.id, count: data.count, action: \"resolve\", value: target }, [ target.buffer ]);\n\t\t\t} catch (error) {\n\t\t\t\tself.postMessage({ id: data.id, count: data.count, action: \"reject\", value: error });\n\t\t\t}\n\t\t});\n\t}\n\n\treturn {\n\t\tready: ready,\n\t\tsupported: true,\n\t\tuseWorkers: function(count) {\n\t\t\tinitWorkers(count);\n\t\t},\n\t\tdecodeVertexBuffer: function(target, count, size, source, filter) {\n\t\t\tdecode(instance, instance.exports.meshopt_decodeVertexBuffer, target, count, size, source, instance.exports[filters[filter]]);\n\t\t},\n\t\tdecodeIndexBuffer: function(target, count, size, source) {\n\t\t\tdecode(instance, instance.exports.meshopt_decodeIndexBuffer, target, count, size, source);\n\t\t},\n\t\tdecodeIndexSequence: function(target, count, size, source) {\n\t\t\tdecode(instance, instance.exports.meshopt_decodeIndexSequence, target, count, size, source);\n\t\t},\n\t\tdecodeGltfBuffer: function(target, count, size, source, mode, filter) {\n\t\t\tdecode(instance, instance.exports[decoders[mode]], target, count, size, source, instance.exports[filters[filter]]);\n\t\t},\n\t\tdecodeGltfBufferAsync: function(count, size, source, mode, filter) {\n\t\t\tif (workers.length > 0) {\n\t\t\t\treturn decodeWorker(count, size, source, decoders[mode], filters[filter]);\n\t\t\t}\n\n\t\t\treturn ready.then(function() {\n\t\t\t\tvar target = new Uint8Array(count * size);\n\t\t\t\tdecode(instance, instance.exports[decoders[mode]], target, count, size, source, instance.exports[filters[filter]]);\n\t\t\t\treturn target;\n\t\t\t});\n\t\t}\n\t};\n})();\n\nexport { MeshoptDecoder };\n","// This file is part of meshoptimizer library and is distributed under the terms of MIT License.\n// Copyright (C) 2016-2023, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)\nvar MeshoptSimplifier = (function() {\n\t// Built with clang version 16.0.0\n\t// Built from meshoptimizer 0.20\n\tvar wasm = \"b9H79Tebbbe9Ek9Geueu9Geub9Gbb9GPuuuuuuuuuuu99uueu9Gvuuuuub9Gluuuub9Gquuuuuuu99uueu9Gwuuuuuu99ueu9Giuuue999Gluuuueu9GiuuueuizsdilvoirwDbqqbeqlve9Weiiviebeoweuec:G;jekr:Tewo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bbz9TW79O9V9Wt9F79P9T9W29P9M95bl8E9TW79O9V9Wt9F79P9T9W29P9M959x9Pt9OcttV9P9I91tW7bvQ9TW79O9V9Wt9F79P9T9W29P9M959q9V9P9Ut7boX9TW79O9V9Wt9F79P9T9W29P9M959t9J9H2Wbra9TW79O9V9Wt9F9V9Wt9P9T9P96W9wWVtW94SWt9J9O9sW9T9H9Wbwl79IV9RbDDwebcekdxmq::9Usdbk;i6iKuY99Ou8Jjjjjbc;W;ab9RgP8KjjjjbaPcwfcbc;Kbz:ljjjb8AaPcualcefgscdtascFFFFi0Ecbyd1:jjjbHjjjjbbgzBdwaPceBd9OaPazBdbaPcuadcitadcFFFFe0Ecbyd1:jjjbHjjjjbbgHBdxaPcdBd9OaPaHBdlaPaeadalcbz:cjjjbaPcualcdtgOalcFFFFi0EgAcbyd1:jjjbHjjjjbbgCBdzaPciBd9OaPaAcbyd1:jjjbHjjjjbbgXBdCaPclBd9Oalcd4alfhQcehLinaLgscethLasaQ6mbkcbhKaPcuascdtgLascFFFFi0Ecbyd1:jjjbHjjjjbbgQBdKaPcvBd9OaQcFeaLz:ljjjbhYdnalTmbavcd4h8AascufhEinaiaKa8A2cdtfg3ydlgscH4as7c:F:b:DD2a3ydbgscH4as7c;D;O:B8J27a3ydwgscH4as7c:3F;N8N27hQcbhsdndninaYaQaEGgQcdtfg5ydbgLcuSmeaiaLa8A2cdtfa3cxz:ojjjbTmdascefgsaQfhQasaE9nmbxdkka5aKBdbaKhLkaCaKcdtfaLBdbaKcefgKal9hmbkcbhsaXhLinaLasBdbaLclfhLalascefgs9hmbkcbhsaChLaXhQindnasaLydbgESmbaQaXaEcdtfgEydbBdbaEasBdbkaLclfhLaQclfhQalascefgs9hmbkkcbh8EaYcbyd:m:jjjbH:bjjjbbaPclBd9OaPalcbyd1:jjjbHjjjjbbgEBdKaPcvBd9OaPaAcbyd1:jjjbHjjjjbbgsBd3aPcoBd9OaPaAcbyd1:jjjbHjjjjbbgLBdaaPcrBd9OascFeaOz:ljjjbh8FaLcFeaOz:ljjjbhadnalTmbaHcwfhhindnaza8EgQcefg8Ecdtfydbg3azaQcdtgsfydbgLSmba3aL9RhOaHaLcitfhgaaasfh8Ja8FasfhKcbh8Aindndnaga8Acitfydbg5aQ9hmbaKaQBdba8JaQBdbxekdnaza5cdtg8KfgsclfydbgLasydbgsSmbaHascitg3fydbaQSmeaLas9Rh8Lascu7aLfhYaha3fhLcbhsinaYasSmeascefhsaLydbh3aLcwfhLa3aQ9hmbkasa8L6mekaaa8KfgsaQa5asydbcuSEBdbaKa5aQaKydbcuSEBdbka8Acefg8AaO9hmbkka8Eal9hmbkaChLaXhQaah3a8Fh8AcbhsindndnasaLydbg59hmbdnasaQydbg59hmba8Aydbh5dna3ydbgYcu9hmba5cu9hmbaEasfcb86bbxikaEasfhKdnasaYSmbasa5SmbaKce86bbxikaKcl86bbxdkdnasaXa5cdtgYfydb9hmbdna3ydbgKcuSmbasaKSmba8AydbgOcuSmbasaOSmbaaaYfydbggcuSmbaga5Smba8FaYfydbgYcuSmbaYa5SmbdnaCaKcdtfydbaCaYcdtfydb9hmbaCaOcdtfydbaCagcdtfydb9hmbaEasfcd86bbxlkaEasfcl86bbxikaEasfcl86bbxdkaEasfcl86bbxekaEasfaEa5fRbb86bbkaLclfhLaQclfhQa3clfh3a8Aclfh8Aalascefgs9hmbkaxceGTmbaEhsalhLindnasRbbce9hmbascl86bbkascefhsaLcufgLmbkkcualcx2alc;v:Q;v:Qe0Ecbyd1:jjjbHjjjjbbh8JaPcwfaPyd9Ogscdtfa8JBdbaPascefgOBd9Oa8Jaialavz:djjjbdndnaDmbcbhvxekcbh5aPcwfaOcdtfcuaDal2gLcdtaLcFFFFi0Ecbyd1:jjjbHjjjjbbgvBdbaPascdfgOBd9OalTmbarcd4cdthYaDcdthKavh8AinaohsawhLa8AhQaDh3inaQasIdbaLIdbNUdbasclfhsaLclfhLaQclfhQa3cufg3mbkaoaYfhoa8AaKfh8Aa5cefg5al9hmbkkaPcwfaOcdtfcualc8S2gsalc;D;O;f8U0EgQcbyd1:jjjbHjjjjbbgLBdbaPaOcefg3Bd9OaLcbasz:ljjjbh8EdndndnaDTmbaPcwfa3cdtfaQcbyd1:jjjbHjjjjbbgoBdbaPaOcdfgLBd9Oaocbasz:ljjjb8AaPcwfaLcdtfcuaDal2gscltgLascFFFFb0Ecbyd1:jjjbHjjjjbbgwBdbaPaOcifBd9OawcbaLz:ljjjb8AadmexdkcbhocbhwadTmekcbh8AaehLindna8JaLclfydbg5cx2fgsIdba8JaLydbgYcx2fgQIdbg8M:tg8Na8JaLcwfydbgKcx2fg3IdlaQIdlgy:tg8PNa3Idba8M:tgIasIdlay:tg8RN:tg8Sa8SNa8Ra3IdwaQIdwgR:tg8UNa8PasIdwaR:tg8RN:tg8Pa8PNa8RaINa8Ua8NN:tg8Na8NNMM:rgIJbbbb9ETmba8SaI:vh8Sa8NaI:vh8Na8PaI:vh8Pka8EaCaYcdtfydbc8S2fgsa8PaI:rgIa8PNNg8RasIdbMUdbasa8NaIa8NNg8VNg8UasIdlMUdlasa8SaIa8SNg8WNg8XasIdwMUdwasa8Va8PNg8VasIdxMUdxasa8Wa8PNg8YasIdzMUdzasa8Wa8NNg8WasIdCMUdCasa8PaIa8SaRNa8Pa8MNaya8NNMM:mgyNg8MNg8PasIdKMUdKasa8Na8MNg8NasId3MUd3asa8Sa8MNg8SasIdaMUdaasa8MayNg8MasId8KMUd8KasaIasIdyMUdya8EaCa5cdtfydbc8S2fgsa8RasIdbMUdbasa8UasIdlMUdlasa8XasIdwMUdwasa8VasIdxMUdxasa8YasIdzMUdzasa8WasIdCMUdCasa8PasIdKMUdKasa8NasId3MUd3asa8SasIdaMUdaasa8MasId8KMUd8KasaIasIdyMUdya8EaCaKcdtfydbc8S2fgsa8RasIdbMUdbasa8UasIdlMUdlasa8XasIdwMUdwasa8VasIdxMUdxasa8YasIdzMUdzasa8WasIdCMUdCasa8PasIdKMUdKasa8NasId3MUd3asa8SasIdaMUdaasa8MasId8KMUd8KasaIasIdyMUdyaLcxfhLa8Acifg8Aad6mbkcbh5aehYincbhLinaEaeaLc:G1jjbfydba5fcdtfydbgQfRbbhsdndnaEaYaLfydbg3fRbbg8Ac99fcFeGcpe0mbasceSmbascd9hmekdna8AcufcFeGce0mba8Fa3cdtfydbaQ9hmekdnascufcFeGce0mbaaaQcdtfydba39hmekdna8Acv2asfc:W1jjbfRbbTmbaCaQcdtfydbaCa3cdtfydb0mekJbbacJbbjZasceSEhIa8AceShOa8JaeaLc:K1jjbfydba5fcdtfydbcx2fhsdna8JaQcx2fg8AIdwa8Ja3cx2fgKIdwgy:tg8Pa8PNa8AIdbaKIdbgR:tg8Na8NNa8AIdlaKIdlg8R:tg8Sa8SNMM:rg8MJbbbb9ETmba8Pa8M:vh8Pa8Sa8M:vh8Sa8Na8M:vh8NkJbbacaIaOEh8WdnasIdway:tgIa8PaIa8PNasIdbaR:tg8Xa8NNa8SasIdla8R:tg8VNMMg8UN:tgIaINa8Xa8Na8UN:tg8Pa8PNa8Va8Sa8UN:tg8Na8NNMM:rg8SJbbbb9ETmbaIa8S:vhIa8Na8S:vh8Na8Pa8S:vh8Pka8EaCa3cdtfydbc8S2fgsa8Pa8Wa8MNg8Sa8PNNg8UasIdbMUdbasa8Na8Sa8NNg8WNg8XasIdlMUdlasaIa8SaINg8MNg8VasIdwMUdwasa8Wa8PNg8WasIdxMUdxasa8Ma8PNg8YasIdzMUdzasa8Ma8NNg8ZasIdCMUdCasa8Pa8SaIayNa8PaRNa8Ra8NNMM:mgyNg8MNg8PasIdKMUdKasa8Na8MNg8NasId3MUd3asaIa8MNgIasIdaMUdaasa8MayNg8MasId8KMUd8Kasa8SasIdyMUdya8EaCaQcdtfydbc8S2fgsa8UasIdbMUdbasa8XasIdlMUdlasa8VasIdwMUdwasa8WasIdxMUdxasa8YasIdzMUdzasa8ZasIdCMUdCasa8PasIdKMUdKasa8NasId3MUd3asaIasIdaMUdaasa8MasId8KMUd8Kasa8SasIdyMUdykaLclfgLcx9hmbkaYcxfhYa5cifg5ad6mbkaDTmbcbhYinJbbbbhRa8JaeaYcdtfgsclfydbgKcx2fgLIdwa8JasydbgOcx2fgQIdwg8V:tg8Na8NNaLIdbaQIdbg8Y:tgIaINaLIdlaQIdlg8Z:tg8Sa8SNMMg8Wa8Jascwfydbggcx2fgsIdwa8V:tg8MNa8Na8Na8MNaIasIdba8Y:tgyNa8SasIdla8Z:tg8RNMMg8PN:tJbbbbJbbjZa8Wa8Ma8MNayayNa8Ra8RNMMg8XNa8Pa8PN:tg8U:va8UJbbbb9BEg8UNh80a8Xa8NNa8Ma8PN:ta8UNh81a8Wa8RNa8Sa8PN:ta8UNhBa8Xa8SNa8Ra8PN:ta8UNh83a8WayNaIa8PN:ta8UNhUa8XaINaya8PN:ta8UNh85aIa8RNaya8SN:tg8Pa8PNa8Sa8MNa8Ra8NN:tg8Pa8PNa8NayNa8MaIN:tg8Pa8PNMM:r:rh8PavaOaD2cdtfhLavagaD2cdtfhQavaKaD2cdtfh3a8V:mh86a8Z:mh87a8Y:mh88cbh8AaDh5Jbbbbh8RJbbbbh8UJbbbbh8WJbbbbh8XJbbbbh8VJbbbbh8YJbbbbh8ZJbbbbh89Jbbbbh8:inaPc;Wbfa8Afgscwfa8Pa81a3IdbaLIdbg8M:tg8SNa80aQIdba8M:tgyNMg8NNUdbasclfa8Pa83a8SNaBayNMgINUdbasa8Pa85a8SNaUayNMg8SNUdbascxfa8Pa86a8NNa87aINa8Ma88a8SNMMMg8MNUdba8Pa8NaINNa8XMh8Xa8Pa8Na8SNNa8VMh8Va8PaIa8SNNa8YMh8Ya8Pa8Ma8MNNaRMhRa8Pa8Na8MNNa8RMh8Ra8PaIa8MNNa8UMh8Ua8Pa8Sa8MNNa8WMh8Wa8Pa8Na8NNNa8ZMh8Za8PaIaINNa89Mh89a8Pa8Sa8SNNa8:Mh8:aLclfhLa3clfh3aQclfhQa8Aczfh8Aa5cufg5mbkaoaCaOcdtfydbgLc8S2fgsa8:asIdbMUdbasa89asIdlMUdlasa8ZasIdwMUdwasa8YasIdxMUdxasa8VasIdzMUdzasa8XasIdCMUdCasa8WasIdKMUdKasa8UasId3MUd3asa8RasIdaMUdaasaRasId8KMUd8Kasa8PasIdyMUdyaoaCaKcdtfydbgKc8S2fgsa8:asIdbMUdbasa89asIdlMUdlasa8ZasIdwMUdwasa8YasIdxMUdxasa8VasIdzMUdzasa8XasIdCMUdCasa8WasIdKMUdKasa8UasId3MUd3asa8RasIdaMUdaasaRasId8KMUd8Kasa8PasIdyMUdyaoaCagcdtfydbgOc8S2fgsa8:asIdbMUdbasa89asIdlMUdlasa8ZasIdwMUdwasa8YasIdxMUdxasa8VasIdzMUdzasa8XasIdCMUdCasa8WasIdKMUdKasa8UasId3MUd3asa8RasIdaMUdaasaRasId8KMUd8Kasa8PasIdyMUdyawaLaD2cltfh5cbhLaDh3ina5aLfgsaPc;WbfaLfgQIdbasIdbMUdbasclfg8AaQclfIdba8AIdbMUdbascwfg8AaQcwfIdba8AIdbMUdbascxfgsaQcxfIdbasIdbMUdbaLczfhLa3cufg3mbkawaKaD2cltfh5cbhLaDh3ina5aLfgsaPc;WbfaLfgQIdbasIdbMUdbasclfg8AaQclfIdba8AIdbMUdbascwfg8AaQcwfIdba8AIdbMUdbascxfgsaQcxfIdbasIdbMUdbaLczfhLa3cufg3mbkawaOaD2cltfh5cbhLaDh3ina5aLfgsaPc;WbfaLfgQIdbasIdbMUdbasclfg8AaQclfIdba8AIdbMUdbascwfg8AaQcwfIdba8AIdbMUdbascxfgsaQcxfIdbasIdbMUdbaLczfhLa3cufg3mbkaYcifgYad6mbkkdnabaeSmbabaeadcdtz:kjjjb8AkaPydbhZcbhsdnalTmbaZclfhsaZydbh3aEhLalh8AcbhQincbasydbg5a39RaLRbbcpeGEaQfhQaLcefhLasclfhsa5h3a8Acufg8AmbkaQce4hskcuadas9Rcifgrcx2arc;v:Q;v:Qe0Ecbyd1:jjjbHjjjjbbh8LaPcwfaPyd9Ogscdtfa8LBdbaPascefgLBd9OaPcwfaLcdtfcuarcdtarcFFFFi0Ecbyd1:jjjbHjjjjbbgxBdbaPascdfgLBd9OaPcwfaLcdtfaAcbyd1:jjjbHjjjjbbgHBdbaPascifgLBd9OaPcwfaLcdtfalcbyd1:jjjbHjjjjbbgnBdbaPasclfBd9OJbbbbh8Ydnadaq9nmbdnarci6mbakakNh8VaDclthca8Lcwfh9cJbbbbh8YinaPabadghalaCz:cjjjbabhOcbhzcbhKincbhsindnaCaOasfydbgQcdtgYfydbg8AaCabasc;m1jjbfydbaKfcdtfydbgLcdtfydbg5SmbaEaLfRbbgecv2aEaQfRbbg3fc;G1jjbfRbbg8Ka3cv2aefggc;G1jjbfRbbgiVcFeGTmbdnagc:W1jjbfRbbTmba5a8A0mekdna3ae9hmba3cufcFeGce0mba8FaYfydbaL9hmeka8Lazcx2fg3aLaQaicFeGg8AEBdla3aQaLa8AEBdba3a8Aa8KGcb9hBdwazcefhzkasclfgscx9hmbkdnaKcifgKah9pmbaOcxfhOazcifar9nmekkdnazmbahhdxikcbheinJbbbbJbbjZa8EaCa8Laecx2fg3ydlg8Aa3ydbg5a3ydwgLEgKcdtfydbg8Kc8S2gifgsIdyg8P:va8PJbbbb9BEasIdwa8Ja5a8AaLEgYcx2fgLIdwg8SNasIdzaLIdbg8MNasIdaMg8Pa8PMMa8SNasIdlaLIdlgyNasIdCa8SNasId3Mg8Pa8PMMayNasIdba8MNasIdxayNasIdKMg8Pa8PMMa8MNasId8KMMM:lNh8WJbbbbJbbjZa8EaCa5cdtfydbgdc8S2gQfgsIdyg8P:va8PJbbbb9BEasIdwa8Ja8Acx2fgLIdwgINasIdzaLIdbgRNasIdaMg8Pa8PMMaINasIdlaLIdlg8RNasIdCaINasId3Mg8Pa8PMMa8RNasIdbaRNasIdxa8RNasIdKMg8Pa8PMMaRNasId8KMMM:lNh8Xa3cwfhOa3clfhgdnaDTmbaoaQfgQIdwaINaQIdzaRNaQIdaMg8Pa8PMMaINaQIdla8RNaQIdCaINaQId3Mg8Pa8PMMa8RNaQIdbaRNaQIdxa8RNaQIdKMg8Pa8PMMaRNaQId8KMMMh8Nava8AaD2cdtfhLawadaD2cltfhsaQIdyh8UaDhQinaLIdbg8PJbbb;aNascxfIdbaIascwfIdbNaRasIdbNa8RasclfIdbNMMMNa8Pa8PNa8UNa8NMMh8NaLclfhLasczfhsaQcufgQmbkaoaifgQIdwa8SNaQIdza8MNaQIdaMg8Pa8PMMa8SNaQIdlayNaQIdCa8SNaQId3Mg8Pa8PMMayNaQIdba8MNaQIdxayNaQIdKMg8Pa8PMMa8MNaQId8KMMMhIavaYaD2cdtfhLawa8KaD2cltfhsaQIdyhRaDhQinaLIdbg8PJbbb;aNascxfIdba8SascwfIdbNa8MasIdbNayasclfIdbNMMMNa8Pa8PNaRNaIMMhIaLclfhLasczfhsaQcufgQmbka8WaI:lMh8Wa8Xa8N:lMh8Xkaga8AaYa8Xa8W9FgsEBdba3a5aKasEBdbaOa8Xa8WasEUdbaecefgeaz9hmbkaPc;Wbfcbcj;abz:ljjjb8Aa9chsazhLinaPc;WbfasydbcO4c;8ZGfgQaQydbcefBdbascxfhsaLcufgLmbkcbhscbhLinaPc;WbfasfgQydbh3aQaLBdba3aLfhLasclfgscj;ab9hmbkcbhsa9chLinaPc;WbfaLydbcO4c;8ZGfgQaQydbgQcefBdbaxaQcdtfasBdbaLcxfhLazascefgs9hmbkahaq9RgQci9UhJdnalTmbcbhsaHhLinaLasBdbaLclfhLalascefgs9hmbkkcbh9eancbalz:ljjjbhTaQcO9UhSaJce4h9haPydlh9icbhicbhgdnina8Laxagcdtfydbcx2fgOIdwg8Na8V9EmeaiaJ9pmeJFFuuh8Pdna9haz9pmba8Laxa9hcdtfydbcx2fIdwJbb;aZNh8Pkdna8Na8P9ETmbaiaS0mdkdnaTaCaOydlg6cdtg9kfydbg3fg0RbbaTaCaOydbgKcdtg9mfydbg9nfg9oRbbVmbdnaZa9ncdtfgsclfydbgLasydbgsSmbaLas9Rh5a9iascitfhsa8Ja3cx2fgYcwfhdaYclfhAa8Ja9ncx2fg8Kcwfh9pa8Kclfh9qcbhLcehednindnaHasydbcdtfydbgQa3SmbaHasclfydbcdtfydbg8Aa3SmbaQa8ASmba8Ja8Acx2fg8AIdba8JaQcx2fgQIdbgI:tg8Pa9qIdbaQIdlg8S:tg8MNa8KIdbaI:tgya8AIdla8S:tg8NN:ta8PaAIdba8S:tgRNaYIdbaI:tg8Ra8NN:tNa8Na9pIdbaQIdwg8S:tg8UNa8Ma8AIdwa8S:tgIN:ta8NadIdba8S:tg8SNaRaIN:tNaIayNa8Ua8PN:taIa8RNa8Sa8PN:tNMMJbbbb9FmdkascwfhsaLcefgLa56hea5aL9hmbkkaeceGTmba9hcefh9hxeka8Ea3c8S2gQfgsa8Ea9nc8S2g8AfgLIdbasIdbMUdbasaLIdlasIdlMUdlasaLIdwasIdwMUdwasaLIdxasIdxMUdxasaLIdzasIdzMUdzasaLIdCasIdCMUdCasaLIdKasIdKMUdKasaLId3asId3MUd3asaLIdaasIdaMUdaasaLId8KasId8KMUd8KasaLIdyasIdyMUdydnaDTmbaoaQfgsaoa8AfgLIdbasIdbMUdbasaLIdlasIdlMUdlasaLIdwasIdwMUdwasaLIdxasIdxMUdxasaLIdzasIdzMUdzasaLIdCasIdCMUdCasaLIdKasIdKMUdKasaLId3asId3MUd3asaLIdaasIdaMUdaasaLId8KasId8KMUd8KasaLIdyasIdyMUdyaca9n2heaca32hYawhLaDh8AinaLaYfgsaLaefgQIdbasIdbMUdbasclfg5aQclfIdba5IdbMUdbascwfg5aQcwfIdba5IdbMUdbascxfgsaQcxfIdbasIdbMUdbaLczfhLa8Acufg8AmbkkaOcwfhLdndndndnaEaKfgQRbbc9:fPdebdkaKhsinaHascdtgsfa3BdbaXasfydbgsaK9hmbxikkaXa9kfydbhsaXa9mfydbhKaHa9mfa6Bdbash6kaHaKcdtfa6Bdbka9oce86bba0ce86bbaLIdbg8Pa8Ya8Ya8P9DEh8Ya9ecefh9ececdaQRbbceSEaifhikagcefggaz9hmbkkdna9embahhdxikdnalTmbcbhLa8FhsindnasydbgQcuSmbdnaLaHaQcdtg3fydbgQ9hmba8Fa3fydbhQkasaQBdbkasclfhsalaLcefgL9hmbkcbhLaahsindnasydbgQcuSmbdnaLaHaQcdtg3fydbgQ9hmbaaa3fydbhQkasaQBdbkasclfhsalaLcefgL9hmbkkcbhdabhscbh8AindnaHasydbcdtfydbgLaHasclfydbcdtfydbgQSmbaLaHascwfydbcdtfydbg3SmbaQa3Smbabadcdtfg5aLBdba5clfaQBdba5cwfa3Bdbadcifhdkascxfhsa8Acifg8Aah6mbkadaq9nmdxbkkaPabadalaCz:cjjjbkdnamTmbama8Y:rUdbkaPyd9OgscdtaPcwffc98fhCdninasTmeaCydbcbyd:m:jjjbH:bjjjbbaCc98fhCascufhsxbkkaPc;W;abf8Kjjjjbadk;:ieouabydlhvabydbclfcbaicdtz:ljjjbhoadci9UhrdnadTmbdnalTmbaehwadhDinaoalawydbcdtfydbcdtfgqaqydbcefBdbawclfhwaDcufgDmbxdkkaehwadhDinaoawydbcdtfgqaqydbcefBdbawclfhwaDcufgDmbkkdnaiTmbcbhDaohwinawydbhqawaDBdbawclfhwaqaDfhDaicufgimbkkdnadci6mbarcearce0EhdinaecwfydbhwaeclfydbhDaeydbhidnalTmbalawcdtfydbhwalaDcdtfydbhDalaicdtfydbhikavaoaicdtfgqydbcitfaDBdbavaqydbcitfawBdlaqaqydbcefBdbavaoaDcdtfgqydbcitfawBdbavaqydbcitfaiBdlaqaqydbcefBdbavaoawcdtfgwydbcitfaiBdbavawydbcitfaDBdlawawydbcefBdbaecxfheadcufgdmbkkabydbcbBdbk:Zldouv998Jjjjjbca9Rglczfcwfcbyd11jjbBdbalcb8Pdj1jjb83izalcwfcbydN1jjbBdbalcb8Pd:m1jjb83ibdnadTmbaicd4hvdnabTmbavcdthocbhraehwinabarcx2fgiaearav2cdtfgDIdbUdbaiaDIdlUdlaiaDIdwUdwcbhiinalczfaifgDawaifIdbgqaDIdbgkakaq9EEUdbalaifgDaqaDIdbgkakaq9DEUdbaiclfgicx9hmbkawaofhwarcefgrad9hmbxdkkavcdthrcbhwincbhiinalczfaifgDaeaifIdbgqaDIdbgkakaq9EEUdbalaifgDaqaDIdbgkakaq9DEUdbaiclfgicx9hmbkaearfheawcefgwad9hmbkkdnabTmbadTmbJbbbbJbbjZalIdbalIdzgk:tJbbbb:xgqalIdlalIdCgx:tgmamaq9DEgqalIdwalIdKgm:tgPaPaq9DEgq:vaqJbbbb9BEhqinabaqabIdbak:tNUdbabclfgiaqaiIdbax:tNUdbabcwfgiaqaiIdbam:tNUdbabcxfhbadcufgdmbkkk8KbabaeadaialavcbcbcbcbaoarawaDz:bjjjbk8KbabaeadaialavaoarawaDaqakaxamz:bjjjbk;lOowud99wue99iul998Jjjjjbc;Wb9Rgw8KjjjjbdndnarmbcbhDxekawcwfcbc;Kbz:ljjjb8Aawcuadcx2adc;v:Q;v:Qe0Ecbyd1:jjjbHjjjjbbgqBdwawceBd9Oaqaeadaiz:djjjbawcuadcdtadcFFFFi0Egkcbyd1:jjjbHjjjjbbgxBdxawcdBd9Oadcd4adfhmceheinaegicetheaiam6mbkcbhmawcuaicdtgPaicFFFFi0Ecbyd1:jjjbHjjjjbbgsBdzawciBd9Odndnar:Zgz:rJbbbZMgH:lJbbb9p9DTmbaH:Ohexekcjjjj94hekaicufhOc:bwhAcbhCcbhXadhQinaChLaeaAgKcufaeaK9iEamgDcefaeaD9kEhYdndnadTmbaYcuf:YhHaqhiaxheadhmindndnaiIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhAxekcjjjj94hAkaAcCthAdndnaiclfIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhCxekcjjjj94hCkaCcqtaAVhAdndnaicwfIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhCxekcjjjj94hCkaeaAaCVBdbaicxfhiaeclfheamcufgmmbkascFeaPz:ljjjbhEcbh3cbh5indnaEaxa5cdtfydbgAcm4aA7c:v;t;h;Ev2gics4ai7aOGgmcdtfgCydbgecuSmbaeaASmbcehiinaEamaifaOGgmcdtfgCydbgecuSmeaicefhiaeaA9hmbkkaCaABdba3aecuSfh3a5cefg5ad9hmbxdkkascFeaPz:ljjjb8Acbh3kaDaYa3ar0giEhmaLa3aiEhCdna3arSmbaYaKaiEgAam9Rcd9imbdndnaXcl0mbdnaQ:ZgHaL:Zg8A:taY:Yg8EaD:Y:tg8Fa8EaK:Y:tgaa3:Zghaz:tNNNaHaz:taaNa8Aah:tNa8Aaz:ta8FNahaH:tNM:va8EMJbbbZMgH:lJbbb9p9DTmbaH:Ohexdkcjjjj94hexekamaAfcd9Theka3aQaiEhQaXcefgXcs9hmekkdndnaCmbcihicbhDxekcbhiawakcbyd1:jjjbHjjjjbbg5BdCawclBd9OdndnadTmbamcuf:YhHaqhiaxheadhmindndnaiIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhAxekcjjjj94hAkaAcCthAdndnaiclfIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhCxekcjjjj94hCkaCcqtaAVhAdndnaicwfIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhCxekcjjjj94hCkaeaAaCVBdbaicxfhiaeclfheamcufgmmbkascFeaPz:ljjjbhEcbhDcbh3inaxa3cdtgYfydbgAcm4aA7c:v;t;h;Ev2gics4ai7hecbhidndninaEaeaOGgmcdtfgCydbgecuSmednaxaecdtgCfydbaASmbaicefgiamfheaiaO9nmekka5aCfydbhixekaCa3BdbaDhiaDcefhDka5aYfaiBdba3cefg3ad9hmbkcuaDc32giaDc;j:KM;jb0EhexekascFeaPz:ljjjb8AcbhDcbhekawaecbyd1:jjjbHjjjjbbgeBdKawcvBd9Oaecbaiz:ljjjbhOavcd4hxdnadTmbaxcdth3a5hmalhAaqheadhEinaOamydbc32fgiaeIdbaiIdbMUdbaiaeclfIdbaiIdlMUdlaiaecwfIdbaiIdwMUdwaiaAc;81jjbalEgCIdbaiIdxMUdxaiaCIdlaiIdzMUdzaiaCIdwaiIdCMUdCaiaiIdKJbbjZMUdKamclfhmaAa3fhAaecxfheaEcufgEmbkkdnaDTmbaOcxfhiaDheinaictfgmamIdbJbbbbJbbjZaicxfIdbgH:vaHJbbbb9BEgHNUdbaic94fgmaHamIdbNUdbaic98fgmaHamIdbNUdbaiaHaiIdbNUdbaiclfgmaHamIdbNUdbaicwfgmaHamIdbNUdbaic3fhiaecufgembkkcbhAawcuaDcdtgYaDcFFFFi0Egicbyd1:jjjbHjjjjbbgeBd3awcoBd9Oawaicbyd1:jjjbHjjjjbbgEBdaaecFeaYz:ljjjbh3dnadTmbaoaoNh8Aaxcdthxalheina8Aaec;81jjbalEgmIdwaOa5ydbgCc32fgiIdC:tgHaHNamIdbaiIdx:tgHaHNamIdlaiIdz:tgHaHNMMNaqcwfIdbaiIdw:tgHaHNaqIdbaiIdb:tgHaHNaqclfIdbaiIdl:tgHaHNMMMhHdndna3aCcdtgifgmydbcuSmbaEaifIdbaH9ETmekamaABdbaEaifaHUdbka5clfh5aeaxfheaqcxfhqadaAcefgA9hmbkkaba3aYz:kjjjb8AcrhikaicdthiinaiTmeaic98fgiawcwffydbcbyd:m:jjjbH:bjjjbbxbkkawc;Wbf8KjjjjbaDk:Qdidui99ducbhi8Jjjjjbca9Rglczfcwfcbyd11jjbBdbalcb8Pdj1jjb83izalcwfcbydN1jjbBdbalcb8Pd:m1jjb83ibdndnaembJbbjFhvJbbjFhoJbbjFhrxekadcd4cdthwincbhdinalczfadfgDabadfIdbgoaDIdbgrarao9EEUdbaladfgDaoaDIdbgrarao9DEUdbadclfgdcx9hmbkabawfhbaicefgiae9hmbkalIdwalIdK:thralIdlalIdC:thoalIdbalIdz:thvkavJbbbb:xgvaoaoav9DEgoararao9DEk9DeeuabcFeaicdtz:ljjjbhlcbhbdnadTmbindnalaeydbcdtfgiydbcu9hmbaiabBdbabcefhbkaeclfheadcufgdmbkkabk9teiucbcbyd:q:jjjbgeabcifc98GfgbBd:q:jjjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;LeeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiclfaeclfydbBdbaicwfaecwfydbBdbaicxfaecxfydbBdbaeczfheaiczfhiadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk;aeedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdbaicxfalBdbaicwfalBdbaiclfalBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabk9teiucbcbyd:q:jjjbgeabcrfc94GfgbBd:q:jjjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik9:eiuZbhedndncbyd:q:jjjbgdaecztgi9nmbcuheadai9RcFFifcz4nbcuSmekadhekcbabae9Rcifc98Gcbyd:q:jjjbfgdBd:q:jjjbdnadZbcztge9nmbadae9RcFFifcz4nb8Akk6eiucbhidnadTmbdninabRbbglaeRbbgv9hmeaecefheabcefhbadcufgdmbxdkkalav9Rhikaikk:Iedbcjwk1eFFuuFFuuFFuuFFuFFFuFFFuFbbbbbbbbebbbdbbbbbbbebbbeeebeebebbeeebebbbbbebebbbbbebbbdbbbbbbbbbbbbbbbeeeeebebbbbbebbbbbeebbbbbbbbbbbbbbbbbbbbbc1Dkxebbbdbbb:G9Kbb\";\n\n\tvar wasmpack = new Uint8Array([32,0,65,2,1,106,34,33,3,128,11,4,13,64,6,253,10,7,15,116,127,5,8,12,40,16,19,54,20,9,27,255,113,17,42,67,24,23,146,148,18,14,22,45,70,69,56,114,101,21,25,63,75,136,108,28,118,29,73,115]);\n\n\tif (typeof WebAssembly !== 'object') {\n\t\treturn {\n\t\t\tsupported: false,\n\t\t};\n\t}\n\n\tvar instance;\n\n\tvar ready =\n\t\tWebAssembly.instantiate(unpack(wasm), {})\n\t\t.then(function(result) {\n\t\t\tinstance = result.instance;\n\t\t\tinstance.exports.__wasm_call_ctors();\n\t\t});\n\n\tfunction unpack(data) {\n\t\tvar result = new Uint8Array(data.length);\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tvar ch = data.charCodeAt(i);\n\t\t\tresult[i] = ch > 96 ? ch - 97 : ch > 64 ? ch - 39 : ch + 4;\n\t\t}\n\t\tvar write = 0;\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tresult[write++] = (result[i] < 60) ? wasmpack[result[i]] : (result[i] - 60) * 64 + result[++i];\n\t\t}\n\t\treturn result.buffer.slice(0, write);\n\t}\n\n\tfunction assert(cond) {\n\t\tif (!cond) {\n\t\t\tthrow new Error(\"Assertion failed\");\n\t\t}\n\t}\n\n\tfunction bytes(view) {\n\t\treturn new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n\t}\n\n\tfunction reorder(fun, indices, vertices) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar ip = sbrk(indices.length * 4);\n\t\tvar rp = sbrk(vertices * 4);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar indices8 = bytes(indices);\n\t\theap.set(indices8, ip);\n\t\tvar unique = fun(rp, ip, indices.length, vertices);\n\t\t// heap may have grown\n\t\theap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar remap = new Uint32Array(vertices);\n\t\tnew Uint8Array(remap.buffer).set(heap.subarray(rp, rp + vertices * 4));\n\t\tindices8.set(heap.subarray(ip, ip + indices.length * 4));\n\t\tsbrk(ip - sbrk(0));\n\n\t\tfor (var i = 0; i < indices.length; ++i)\n\t\t\tindices[i] = remap[indices[i]];\n\n\t\treturn [remap, unique];\n\t}\n\n\tfunction maxindex(source) {\n\t\tvar result = 0;\n\t\tfor (var i = 0; i < source.length; ++i) {\n\t\t\tvar index = source[i];\n\t\t\tresult = result < index ? index : result;\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction simplify(fun, indices, index_count, vertex_positions, vertex_count, vertex_positions_stride, target_index_count, target_error, options) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar te = sbrk(4);\n\t\tvar ti = sbrk(index_count * 4);\n\t\tvar sp = sbrk(vertex_count * vertex_positions_stride);\n\t\tvar si = sbrk(index_count * 4);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(bytes(vertex_positions), sp);\n\t\theap.set(bytes(indices), si);\n\t\tvar result = fun(ti, si, index_count, sp, vertex_count, vertex_positions_stride, target_index_count, target_error, options, te);\n\t\t// heap may have grown\n\t\theap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar target = new Uint32Array(result);\n\t\tbytes(target).set(heap.subarray(ti, ti + result * 4));\n\t\tvar error = new Float32Array(1);\n\t\tbytes(error).set(heap.subarray(te, te + 4));\n\t\tsbrk(te - sbrk(0));\n\t\treturn [target, error[0]];\n\t}\n\n\tfunction simplifyAttr(fun, indices, index_count, vertex_positions, vertex_count, vertex_positions_stride, vertex_attributes, vertex_attributes_stride, attribute_weights, target_index_count, target_error, options) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar te = sbrk(4);\n\t\tvar ti = sbrk(index_count * 4);\n\t\tvar sp = sbrk(vertex_count * vertex_positions_stride);\n\t\tvar sa = sbrk(vertex_count * vertex_attributes_stride);\n\t\tvar sw = sbrk(attribute_weights.length * 4);\n\t\tvar si = sbrk(index_count * 4);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(bytes(vertex_positions), sp);\n\t\theap.set(bytes(vertex_attributes), sa);\n\t\theap.set(bytes(attribute_weights), sw);\n\t\theap.set(bytes(indices), si);\n\t\tvar result = fun(ti, si, index_count, sp, vertex_count, vertex_positions_stride, sa, vertex_attributes_stride, sw, attribute_weights.length, target_index_count, target_error, options, te);\n\t\t// heap may have grown\n\t\theap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar target = new Uint32Array(result);\n\t\tbytes(target).set(heap.subarray(ti, ti + result * 4));\n\t\tvar error = new Float32Array(1);\n\t\tbytes(error).set(heap.subarray(te, te + 4));\n\t\tsbrk(te - sbrk(0));\n\t\treturn [target, error[0]];\n\t}\n\n\tfunction simplifyScale(fun, vertex_positions, vertex_count, vertex_positions_stride) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar sp = sbrk(vertex_count * vertex_positions_stride);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(bytes(vertex_positions), sp);\n\t\tvar result = fun(sp, vertex_count, vertex_positions_stride);\n\t\tsbrk(sp - sbrk(0));\n\t\treturn result;\n\t}\n\n\tfunction simplifyPoints(fun, vertex_positions, vertex_count, vertex_positions_stride, vertex_colors, vertex_colors_stride, color_weight, target_vertex_count) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar ti = sbrk(target_vertex_count * 4);\n\t\tvar sp = sbrk(vertex_count * vertex_positions_stride);\n\t\tvar sc = sbrk(vertex_count * vertex_colors_stride);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(bytes(vertex_positions), sp);\n\t\tif (vertex_colors) {\n\t\t\theap.set(bytes(vertex_colors), sc);\n\t\t}\n\t\tvar result = fun(ti, sp, vertex_count, vertex_positions_stride, sc, vertex_colors_stride, color_weight, target_vertex_count);\n\t\t// heap may have grown\n\t\theap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar target = new Uint32Array(result);\n\t\tbytes(target).set(heap.subarray(ti, ti + result * 4));\n\t\tsbrk(ti - sbrk(0));\n\t\treturn target;\n\t}\n\n\tvar simplifyOptions = {\n\t\tLockBorder: 1,\n\t};\n\n\treturn {\n\t\tready: ready,\n\t\tsupported: true,\n\n\t\t// set this to true to be able to use simplifyPoints and simplifyWithAttributes\n\t\t// note that these functions are experimental and may change interface/behavior in a way that will require revising calling code\n\t\tuseExperimentalFeatures: false,\n\n\t\tcompactMesh: function(indices) {\n\t\t\tassert(indices instanceof Uint32Array || indices instanceof Int32Array || indices instanceof Uint16Array || indices instanceof Int16Array);\n\t\t\tassert(indices.length % 3 == 0);\n\n\t\t\tvar indices32 = indices.BYTES_PER_ELEMENT == 4 ? indices : new Uint32Array(indices);\n\t\t\treturn reorder(instance.exports.meshopt_optimizeVertexFetchRemap, indices32, maxindex(indices) + 1);\n\t\t},\n\n\t\tsimplify: function(indices, vertex_positions, vertex_positions_stride, target_index_count, target_error, flags) {\n\t\t\tassert(indices instanceof Uint32Array || indices instanceof Int32Array || indices instanceof Uint16Array || indices instanceof Int16Array);\n\t\t\tassert(indices.length % 3 == 0);\n\t\t\tassert(vertex_positions instanceof Float32Array);\n\t\t\tassert(vertex_positions.length % vertex_positions_stride == 0);\n\t\t\tassert(vertex_positions_stride >= 3);\n\t\t\tassert(target_index_count >= 0 && target_index_count <= indices.length);\n\t\t\tassert(target_index_count % 3 == 0);\n\t\t\tassert(target_error >= 0 && target_error <= 1);\n\n\t\t\tvar options = 0;\n\t\t\tfor (var i = 0; i < (flags ? flags.length : 0); ++i) {\n\t\t\t\toptions |= simplifyOptions[flags[i]];\n\t\t\t}\n\n\t\t\tvar indices32 = indices.BYTES_PER_ELEMENT == 4 ? indices : new Uint32Array(indices);\n\t\t\tvar result = simplify(instance.exports.meshopt_simplify, indices32, indices.length, vertex_positions, vertex_positions.length / vertex_positions_stride, vertex_positions_stride * 4, target_index_count, target_error, options);\n\t\t\tresult[0] = (indices instanceof Uint32Array) ? result[0] : new indices.constructor(result[0]);\n\n\t\t\treturn result;\n\t\t},\n\n\t\tsimplifyWithAttributes: function(indices, vertex_positions, vertex_positions_stride, vertex_attributes, vertex_attributes_stride, attribute_weights, target_index_count, target_error, flags) {\n\t\t\tassert(this.useExperimentalFeatures); // set useExperimentalFeatures to use this; note that this function is experimental and may change interface in a way that will require revising calling code\n\t\t\tassert(indices instanceof Uint32Array || indices instanceof Int32Array || indices instanceof Uint16Array || indices instanceof Int16Array);\n\t\t\tassert(indices.length % 3 == 0);\n\t\t\tassert(vertex_positions instanceof Float32Array);\n\t\t\tassert(vertex_positions.length % vertex_positions_stride == 0);\n\t\t\tassert(vertex_positions_stride >= 3);\n\t\t\tassert(vertex_attributes instanceof Float32Array);\n\t\t\tassert(vertex_attributes.length % vertex_attributes_stride == 0);\n\t\t\tassert(vertex_attributes_stride >= 0);\n\t\t\tassert(target_index_count >= 0 && target_index_count <= indices.length);\n\t\t\tassert(target_index_count % 3 == 0);\n\t\t\tassert(target_error >= 0 && target_error <= 1);\n\t\t\tassert(Array.isArray(attribute_weights));\n\t\t\tassert(vertex_attributes_stride >= attribute_weights.length);\n\t\t\tassert(attribute_weights.length <= 16);\n\n\t\t\tvar options = 0;\n\t\t\tfor (var i = 0; i < (flags ? flags.length : 0); ++i) {\n\t\t\t\toptions |= simplifyOptions[flags[i]];\n\t\t\t}\n\n\t\t\tvar indices32 = indices.BYTES_PER_ELEMENT == 4 ? indices : new Uint32Array(indices);\n\t\t\tvar result = simplifyAttr(instance.exports.meshopt_simplifyWithAttributes, indices32, indices.length, vertex_positions, vertex_positions.length / vertex_positions_stride, vertex_positions_stride * 4, vertex_attributes, vertex_attributes_stride * 4, new Float32Array(attribute_weights), target_index_count, target_error, options);\n\t\t\tresult[0] = (indices instanceof Uint32Array) ? result[0] : new indices.constructor(result[0]);\n\n\t\t\treturn result;\n\t\t},\n\n\t\tgetScale: function(vertex_positions, vertex_positions_stride) {\n\t\t\tassert(vertex_positions instanceof Float32Array);\n\t\t\tassert(vertex_positions.length % vertex_positions_stride == 0);\n\t\t\tassert(vertex_positions_stride >= 3);\n\t\t\treturn simplifyScale(instance.exports.meshopt_simplifyScale, vertex_positions, vertex_positions.length / vertex_positions_stride, vertex_positions_stride * 4);\n\t\t},\n\n\t\tsimplifyPoints: function(vertex_positions, vertex_positions_stride, target_vertex_count, vertex_colors, vertex_colors_stride, color_weight) {\n\t\t\tassert(this.useExperimentalFeatures); // set useExperimentalFeatures to use this; note that this function is experimental and may change interface in a way that will require revising calling code\n\t\t\tassert(vertex_positions instanceof Float32Array);\n\t\t\tassert(vertex_positions.length % vertex_positions_stride == 0);\n\t\t\tassert(vertex_positions_stride >= 3);\n\t\t\tassert(target_vertex_count >= 0 && target_vertex_count <= vertex_positions.length / vertex_positions_stride);\n\t\t\tif (vertex_colors) {\n\t\t\t\tassert(vertex_colors instanceof Float32Array);\n\t\t\t\tassert(vertex_colors.length % vertex_colors_stride == 0);\n\t\t\t\tassert(vertex_colors_stride >= 3);\n\t\t\t\tassert(vertex_positions.length / vertex_positions_stride == vertex_colors.length / vertex_colors_stride);\n\t\t\t\treturn simplifyPoints(instance.exports.meshopt_simplifyPoints, vertex_positions, vertex_positions.length / vertex_positions_stride, vertex_positions_stride * 4, vertex_colors, vertex_colors_stride * 4, color_weight, target_vertex_count);\n\t\t\t} else {\n\t\t\t\treturn simplifyPoints(instance.exports.meshopt_simplifyPoints, vertex_positions, vertex_positions.length / vertex_positions_stride, vertex_positions_stride * 4, undefined, 0, 0, target_vertex_count);\n\t\t\t}\n\t\t},\n\t};\n})();\n\nexport { MeshoptSimplifier };\n","import * as THREE from 'three';\r\nimport { LinkedHashMap } from '../utils/LinkedHashMap';\r\nimport { B3DMDecoder } from \"../decoder/B3DMDecoder\";\r\nimport { SplatsDecoder } from \"../decoder/SplatsDecoder\";\r\nimport { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';\r\nimport { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js';\r\nimport { KTX2Loader } from \"three/addons/loaders/KTX2Loader\";\r\nimport { resolveImplicite } from './implicit/ImplicitTileResolver.js';\r\nimport { MeshoptDecoder } from 'meshoptimizer';\r\n\r\nlet concurrentDownloads = 0;\r\n\r\n\r\n/**\r\n * A Tile loader that manages caching and load order.\r\n * The cache is an LRU cache and is defined by the number of items it can hold.\r\n * The actual number of cached items might grow beyond max if all items are in use.\r\n * \r\n * The load order is designed for optimal perceived loading speed (nearby tiles are refined first).\r\n * @class\r\n */\r\nclass TileLoader {\r\n /**\r\n * Creates a tile loader with a maximum number of cached items and callbacks.\r\n * The only required property is a renderer that will be used to visualize the tiles.\r\n * The maxCachedItems property is the size of the cache in number of objects, mesh tile and tileset.json files.\r\n * The mesh and point callbacks will be called for every incoming mesh or points.\r\n * \r\n *\r\n * \r\n * @param {Object} [options] - Optional configuration object.\r\n * @param {renderer} [options.renderer] - the WebGL renderer\r\n * @param {number} [options.maxCachedItems=100] - the cache size.\r\n * @param {function} [options.meshCallback = undefined] - A callback to call on newly decoded meshes.\r\n * @param {function} [options.pointsCallback = undefined] - A callback to call on newly decoded points.\r\n * @param {sring} [options.proxy = undefined] - An optional proxy that tile requests will be directed too as POST requests with the actual tile url in the body of the request.\r\n * @param {KTX2Loader} [options.ktx2Loader = undefined] - A KTX2Loader (three/addons)\r\n * @param {DRACOLoader} [options.dracoLoader = undefined] - A DRACOLoader (three/addons)\r\n */\r\n constructor(options) {\r\n this.renderer = options.renderer;\r\n this.zUpToYUpMatrix = new THREE.Matrix4();\r\n this.zUpToYUpMatrix.set(1, 0, 0, 0,\r\n 0, 0, -1, 0,\r\n 0, 1, 0, 0,\r\n 0, 0, 0, 1);\r\n this.maxCachedItems = 100;\r\n this.proxy = options.proxy;\r\n if (!!options) {\r\n this.meshCallback = options.meshCallback;\r\n this.pointsCallback = options.pointsCallback;\r\n if (options.maxCachedItems!=undefined) this.maxCachedItems = options.maxCachedItems;\r\n }\r\n \r\n\r\n this.gltfLoader = new GLTFLoader();\r\n if (!!options && !!options.dracoLoader) {\r\n this.gltfLoader.setDRACOLoader(options.dracoLoader);\r\n this.hasDracoLoader = true;\r\n } else {\r\n const dracoLoader = new DRACOLoader();\r\n dracoLoader.setDecoderPath('https://storage.googleapis.com/ogc-3d-tiles/draco/');\r\n this.gltfLoader.setDRACOLoader(dracoLoader);\r\n this.gltfLoader.hasDracoLoader = true;\r\n }\r\n\r\n if (!!options && !!options.ktx2Loader) {\r\n this.gltfLoader.setKTX2Loader(options.ktx2Loader);\r\n this.hasKTX2Loader = true;\r\n } else if (!!options && !!options.renderer) {\r\n const ktx2Loader = new KTX2Loader();\r\n ktx2Loader.setTranscoderPath('https://storage.googleapis.com/ogc-3d-tiles/basis/').detectSupport(options.renderer);\r\n this.gltfLoader.setKTX2Loader(ktx2Loader);\r\n this.gltfLoader.hasKTX2Loader = true;\r\n }\r\n\r\n this.gltfLoader.setMeshoptDecoder(MeshoptDecoder);\r\n this.hasMeshOptDecoder = true;\r\n\r\n this.b3dmDecoder = new B3DMDecoder(this.gltfLoader);\r\n this.splatsDecoder = new SplatsDecoder(this.gltfLoader, this.renderer);\r\n\r\n this.cache = new LinkedHashMap();\r\n this.register = {};\r\n\r\n\r\n this.ready = [];\r\n this.downloads = [];\r\n this.nextReady = [];\r\n this.nextDownloads = [];\r\n\r\n }\r\n\r\n\r\n /**\r\n * To be called in the render loop or at regular intervals.\r\n * launches tile downloading and loading in an orderly fashion.\r\n */\r\n update() {\r\n \r\n const self = this;\r\n if (concurrentDownloads < 8) {\r\n self._download();\r\n }\r\n \r\n self._loadBatch();\r\n \r\n }\r\n\r\n\r\n _scheduleDownload(f) {\r\n this.downloads.unshift(f);\r\n }\r\n _download() {\r\n\r\n if (this.nextDownloads.length == 0) {\r\n this._getNextDownloads();\r\n if (this.nextDownloads.length == 0) return;\r\n }\r\n while (this.nextDownloads.length > 0) {\r\n const nextDownload = this.nextDownloads.shift();\r\n if (!!nextDownload && nextDownload.shouldDoDownload()) {\r\n nextDownload.doDownload();\r\n }\r\n }\r\n return;\r\n }\r\n _meshReceived(cache, register, key, distanceFunction, getSiblings, level, uuid) {\r\n this.ready.unshift([cache, register, key, distanceFunction, getSiblings, level, uuid]);\r\n }\r\n \r\n _loadBatch() {\r\n if (this.nextReady.length == 0) {\r\n this._getNextReady();\r\n }\r\n while(this.nextReady.length > 0){\r\n const data = this.nextReady.shift();\r\n if (!data) return;\r\n const cache = data[0];\r\n const register = data[1];\r\n const key = data[2];\r\n const mesh = cache.get(key);\r\n \r\n if (!!mesh && !!register[key]) {\r\n Object.keys(register[key]).forEach(tile => {\r\n const callback = register[key][tile];\r\n if (!!callback) {\r\n callback(mesh);\r\n register[key][tile] = null;\r\n }\r\n });\r\n }\r\n if (this.nextReady.length == 0) {\r\n this._getNextReady();\r\n }\r\n }\r\n \r\n return;\r\n\r\n /* while (this.ready.length > 0) {\r\n const data = this.ready.shift();\r\n if (!data) return 0;\r\n const cache = data[0];\r\n const register = data[1];\r\n const key = data[2];\r\n const mesh = cache.get(key);\r\n\r\n if (!!mesh && !!register[key]) {\r\n Object.keys(register[key]).forEach(tile => {\r\n const callback = register[key][tile];\r\n if (!!callback) {\r\n callback(mesh);\r\n register[key][tile] = null;\r\n }\r\n });\r\n }\r\n return;\r\n } */\r\n }\r\n\r\n _getNextDownloads() {\r\n let smallestDistance = Number.POSITIVE_INFINITY;\r\n let closest = -1;\r\n for (let i = this.downloads.length - 1; i >= 0; i--) {\r\n /* if (!this.downloads[i].shouldDoDownload()) {\r\n this.downloads.splice(i, 1);\r\n continue;\r\n } */\r\n if (!this.downloads[i].distanceFunction) { // if no distance function, must be a json, give absolute priority!\r\n this.nextDownloads.push(this.downloads.splice(i, 1)[0]);\r\n }\r\n }\r\n if (this.nextDownloads.length > 0) return;\r\n let highestLevel = 0;\r\n let lowestLevel = Number.MAX_SAFE_INTEGER;\r\n let lowestIndex = -1;\r\n for (let i = this.downloads.length - 1; i >= 0; i--) {\r\n \r\n const dist = this.downloads[i].distanceFunction();\r\n if (dist <= smallestDistance) {\r\n smallestDistance = dist;\r\n closest = i;\r\n }\r\n highestLevel = Math.max(this.downloads[i].level);\r\n if(this.downloads[i].loadingStrategy != \"IMMEDIATE\" && this.downloads[i].level<lowestLevel){\r\n lowestLevel = this.downloads[i].level;\r\n lowestIndex = i;\r\n }\r\n \r\n }\r\n let closestItem;\r\n if(highestLevel>lowestLevel+4){\r\n closestItem = this.downloads.splice(lowestIndex, 1).pop();\r\n }else if (closest >= 0){\r\n closestItem = this.downloads.splice(closest, 1).pop();\r\n }\r\n if (!!closestItem) {\r\n this.nextDownloads.push(closestItem);\r\n const siblings = closestItem.getSiblings();\r\n for (let i = this.downloads.length - 1; i >= 0; i--) {\r\n if (siblings.map(s => s.uuid).includes(this.downloads[i].uuid)) {\r\n this.nextDownloads.push(this.downloads.splice(i, 1).pop());\r\n }\r\n }\r\n }\r\n }\r\n\r\n _getNextReady() {\r\n let smallestDistance = Number.POSITIVE_INFINITY;\r\n let closest = -1;\r\n for (let i = this.ready.length - 1; i >= 0; i--) {\r\n\r\n if (!this.ready[i][3]) {// if no distance function, must be a json, give absolute priority!\r\n this.nextReady.push(this.ready.splice(i, 1)[0]);\r\n }\r\n }\r\n if (this.nextReady.length > 0) return;\r\n for (let i = this.ready.length - 1; i >= 0; i--) {\r\n const dist = this.ready[i][3]() * this.ready[i][5];\r\n if (dist <= smallestDistance) {\r\n smallestDistance = dist;\r\n closest = i\r\n }\r\n }\r\n if (closest >= 0) {\r\n const closestItem = this.ready.splice(closest, 1).pop();\r\n this.nextReady.push(closestItem);\r\n const siblings = closestItem[4]();\r\n for (let i = this.ready.length - 1; i >= 0; i--) {\r\n if (siblings.map(s=>s.uuid).includes(this.ready[i][6])) {\r\n this.nextReady.push(this.ready.splice(i, 1).pop());\r\n }\r\n }\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Schedules a tile content to be downloaded\r\n * \r\n * @param {AbortController} abortController \r\n * @param {string|Number} tileIdentifier \r\n * @param {string} path \r\n * @param {Function} callback \r\n * @param {Function} distanceFunction \r\n * @param {Function} getSiblings \r\n * @param {Number} level \r\n * @param {Boolean} sceneZupToYup \r\n * @param {Boolean} meshZupToYup \r\n * @param {Number} geometricError \r\n */\r\n get(abortController, tileIdentifier, path, callback, distanceFunction, getSiblings, level, loadingStrategy, sceneZupToYup, meshZupToYup, geometricError, splatsMesh) {\r\n const self = this;\r\n const key = _simplifyPath(path);\r\n\r\n const realAbortController = new AbortController();\r\n abortController.signal.addEventListener(\"abort\", () => {\r\n if (!self.register[key] || Object.keys(self.register[key]).length == 0) {\r\n realAbortController.abort(\"user abort\");\r\n }\r\n })\r\n\r\n if (!path.includes(\".b3dm\") && !path.includes(\".json\") && !path.includes(\".gltf\") && !path.includes(\".glb\")) {\r\n console.error(\"the 3DTiles cache can only be used to load B3DM, gltf and json data\");\r\n return;\r\n }\r\n if (!self.register[key]) {\r\n self.register[key] = {};\r\n }\r\n if (!!self.register[key][tileIdentifier]) {\r\n console.error(\" a tile should only be loaded once\");\r\n }\r\n self.register[key][tileIdentifier] = callback;\r\n\r\n const cachedObject = self.cache.get(key);\r\n if (!!cachedObject) {\r\n this._meshReceived(self.cache, self.register, key, distanceFunction, getSiblings, level, tileIdentifier);\r\n } else if (Object.keys(self.register[key]).length == 1) {\r\n let downloadFunction;\r\n if (path.includes(\".b3dm\")) {\r\n downloadFunction = () => {\r\n \r\n \r\n var fetchFunction;\r\n if (!self.proxy) {\r\n fetchFunction = () => {\r\n return fetch(path, { signal: realAbortController.signal });\r\n }\r\n } else {\r\n fetchFunction = () => {\r\n return fetch(self.proxy,\r\n {\r\n method: 'POST',\r\n body: path,\r\n signal: realAbortController.signal\r\n }\r\n );\r\n }\r\n }\r\n concurrentDownloads++;\r\n fetchFunction().then(result => {\r\n if (!result.ok) {\r\n console.error(\"could not load tile with path : \" + path)\r\n throw new Error(`couldn't load \"${path}\". Request failed with status ${result.status} : ${result.statusText}`);\r\n }\r\n return result.arrayBuffer();\r\n\r\n }).then(resultArrayBuffer => {\r\n\r\n return this.b3dmDecoder.parseB3DM(resultArrayBuffer, (mesh) => { self.meshCallback(mesh, geometricError) }, sceneZupToYup, meshZupToYup);\r\n }).then(mesh => {\r\n self.cache.put(key, mesh);\r\n self._checkSize();\r\n this._meshReceived(self.cache, self.register, key, distanceFunction, getSiblings, level, tileIdentifier);\r\n }).catch((e) => {\r\n //console.error(e)\r\n }).finally(() => {\r\n concurrentDownloads--;\r\n });\r\n\r\n }\r\n } else if (path.includes(\".glb\") || path.includes(\".gltf\")) {\r\n if(splatsMesh){\r\n \r\n downloadFunction = () => {\r\n \r\n \r\n var fetchFunction;\r\n if (!self.proxy) {\r\n fetchFunction = () => {\r\n return fetch(path, { signal: realAbortController.signal });\r\n }\r\n } else {\r\n fetchFunction = () => {\r\n return fetch(self.proxy,\r\n {\r\n method: 'POST',\r\n body: path,\r\n signal: realAbortController.signal\r\n }\r\n );\r\n }\r\n }\r\n concurrentDownloads++;\r\n fetchFunction().then(result => {\r\n if (!result.ok) {\r\n console.error(\"could not load tile with path : \" + path)\r\n throw new Error(`couldn't load \"${path}\". Request failed with status ${result.status} : ${result.statusText}`);\r\n }\r\n return result.arrayBuffer();\r\n \r\n }).then(resultArrayBuffer => {\r\n \r\n return this.splatsDecoder.parseSplats(resultArrayBuffer, sceneZupToYup, meshZupToYup, splatsMesh);\r\n }).then(mesh => {\r\n self.cache.put(key, mesh);\r\n self._checkSize();\r\n self._meshReceived(self.cache, self.register, key, distanceFunction, getSiblings, level, tileIdentifier);\r\n }).catch((e) => {\r\n //console.error(e)\r\n }).finally(() => {\r\n concurrentDownloads--;\r\n });\r\n \r\n }\r\n }\r\n else{\r\n downloadFunction = () => {\r\n var fetchFunction;\r\n if (!self.proxy) {\r\n fetchFunction = () => {\r\n return fetch(path, { signal: realAbortController.signal });\r\n }\r\n } else {\r\n fetchFunction = () => {\r\n return fetch(self.proxy,\r\n {\r\n method: 'POST',\r\n body: path,\r\n signal: realAbortController.signal\r\n }\r\n );\r\n }\r\n }\r\n concurrentDownloads++;\r\n fetchFunction().then(result => {\r\n if (!result.ok) {\r\n console.error(\"could not load tile with path : \" + path)\r\n throw new Error(`couldn't load \"${path}\". Request failed with status ${result.status} : ${result.statusText}`);\r\n }\r\n return result.arrayBuffer();\r\n }).then(async arrayBuffer => {\r\n await _checkLoaderInitialized(this.gltfLoader);\r\n this.gltfLoader.parse(arrayBuffer, null, gltf => {\r\n gltf.scene.asset = gltf.asset;\r\n if (sceneZupToYup) {\r\n gltf.scene.applyMatrix4(this.zUpToYUpMatrix);\r\n }\r\n gltf.scene.traverse((o) => {\r\n \r\n if (o.isMesh) {\r\n if (meshZupToYup) {\r\n o.applyMatrix4(this.zUpToYUpMatrix);\r\n }\r\n if (!!self.meshCallback) {\r\n self.meshCallback(o, geometricError);\r\n }\r\n }\r\n if (o.isPoints) {\r\n \r\n if (!!self.pointsCallback) {\r\n self.pointsCallback(o, geometricError);\r\n }\r\n }\r\n });\r\n \r\n self.cache.put(key, gltf.scene);\r\n self._checkSize();\r\n self._meshReceived(self.cache, self.register, key, distanceFunction, getSiblings, level, tileIdentifier);\r\n });\r\n }).catch((e) => {\r\n if(e!==\"user abort\" && e.code !== 20) {\r\n //console.error(e);\r\n }\r\n }).finally(() => {\r\n concurrentDownloads--;\r\n });\r\n \r\n \r\n }\r\n }\r\n \r\n } else if (path.includes(\".json\")) {\r\n downloadFunction = () => {\r\n var fetchFunction;\r\n if (!self.proxy) {\r\n fetchFunction = () => {\r\n return fetch(path, { signal: realAbortController.signal });\r\n }\r\n } else {\r\n fetchFunction = () => {\r\n return fetch(self.proxy,\r\n {\r\n method: 'POST',\r\n body: path,\r\n signal: realAbortController.signal\r\n }\r\n );\r\n }\r\n }\r\n concurrentDownloads++;\r\n fetchFunction().then(result => {\r\n if (!result.ok) {\r\n console.error(\"could not load tile with path : \" + path)\r\n throw new Error(`couldn't load \"${path}\". Request failed with status ${result.status} : ${result.statusText}`);\r\n }\r\n return result.json();\r\n\r\n }).then(json => {\r\n return resolveImplicite(json, path)\r\n }).then(json => {\r\n self.cache.put(key, json);\r\n self._checkSize();\r\n self._meshReceived(self.cache, self.register, key);\r\n }).catch((e) => {\r\n //console.error(e)\r\n }).finally(() => {\r\n concurrentDownloads--;\r\n });\r\n }\r\n }\r\n this._scheduleDownload({\r\n \"shouldDoDownload\": () => {\r\n return !abortController.signal.aborted && !!self.register[key] && Object.keys(self.register[key]).length > 0;\r\n },\r\n \"doDownload\": downloadFunction,\r\n \"distanceFunction\": distanceFunction,\r\n \"getSiblings\": getSiblings,\r\n \"level\": level,\r\n \"loadingStrategy\": loadingStrategy,\r\n \"uuid\": tileIdentifier\r\n })\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Invalidates all the unused cached tiles.\r\n */\r\n clear(){\r\n const temp = this.maxCachedItems;\r\n this.maxCachedItems = 0;\r\n this._checkSize();\r\n this.maxCachedItems = temp;\r\n }\r\n\r\n /**\r\n * unregisters a tile content for a specific tile, removing it from the cache if no other tile is using the same content.\r\n * @param {string} path the content path/url\r\n * @param {string|Number} tileIdentifier the tile ID\r\n */\r\n invalidate(path, tileIdentifier) {\r\n const key = _simplifyPath(path);\r\n if (!!this.register[key]) {\r\n delete this.register[key][tileIdentifier];\r\n\r\n //this.register[key][tileIdentifier] = undefined;\r\n this._checkSize();\r\n }\r\n }\r\n\r\n _checkSize() {\r\n const self = this;\r\n\r\n let i = 0;\r\n\r\n while (self.cache.size() > self.maxCachedItems && i < self.cache.size()) {\r\n i++;\r\n const entry = self.cache.head();\r\n const reg = self.register[entry.key];\r\n if (!!reg) {\r\n if (Object.keys(reg).length > 0) {\r\n self.cache.remove(entry.key);\r\n self.cache.put(entry.key, entry.value);\r\n } else {\r\n self.cache.remove(entry.key);\r\n delete self.register[entry.key];\r\n //self.register[entry.key] = undefined;\r\n if(entry.value.isSplatsBatch){\r\n entry.value.remove();\r\n }else{\r\n entry.value.traverse((o) => {\r\n\r\n if (o.material) {\r\n // dispose materials\r\n if (o.material.length) {\r\n for (let i = 0; i < o.material.length; ++i) {\r\n o.material[i].dispose();\r\n }\r\n }\r\n else {\r\n o.material.dispose()\r\n }\r\n }\r\n if (o.geometry) {\r\n // dispose geometry\r\n o.geometry.dispose();\r\n \r\n }\r\n });\r\n }\r\n \r\n }\r\n }\r\n\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\nasync function _checkLoaderInitialized(loader) {\r\n const self = this;\r\n return new Promise((resolve) => {\r\n const interval = setInterval(() => {\r\n if ((!loader.hasDracoLoader || loader.dracoLoader) && (!loader.hasKTX2Loader || loader.ktx2Loader)) {\r\n clearInterval(interval);\r\n resolve();\r\n }\r\n }, 10); // check every 100ms\r\n });\r\n};\r\n\r\nfunction _simplifyPath(main_path) {\r\n\r\n var parts = main_path.split('/'),\r\n new_path = [],\r\n length = 0;\r\n for (var i = 0; i < parts.length; i++) {\r\n var part = parts[i];\r\n if (part === '.' || part === '' || part === '..') {\r\n if (part === '..' && length > 0) {\r\n length--;\r\n }\r\n continue;\r\n }\r\n new_path[length++] = part;\r\n }\r\n\r\n if (length === 0) {\r\n return '/';\r\n }\r\n\r\n var result = '';\r\n for (var i = 0; i < length; i++) {\r\n result += '/' + new_path[i];\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport { TileLoader };","// 'path' module extracted from Node.js v8.11.1 (only the posix part)\n// transplited with Babel\n\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nfunction assertPath(path) {\n if (typeof path !== 'string') {\n throw new TypeError('Path must be a string. Received ' + JSON.stringify(path));\n }\n}\n\n// Resolves . and .. elements in a path with directory names\nfunction normalizeStringPosix(path, allowAboveRoot) {\n var res = '';\n var lastSegmentLength = 0;\n var lastSlash = -1;\n var dots = 0;\n var code;\n for (var i = 0; i <= path.length; ++i) {\n if (i < path.length)\n code = path.charCodeAt(i);\n else if (code === 47 /*/*/)\n break;\n else\n code = 47 /*/*/;\n if (code === 47 /*/*/) {\n if (lastSlash === i - 1 || dots === 1) {\n // NOOP\n } else if (lastSlash !== i - 1 && dots === 2) {\n if (res.length < 2 || lastSegmentLength !== 2 || res.charCodeAt(res.length - 1) !== 46 /*.*/ || res.charCodeAt(res.length - 2) !== 46 /*.*/) {\n if (res.length > 2) {\n var lastSlashIndex = res.lastIndexOf('/');\n if (lastSlashIndex !== res.length - 1) {\n if (lastSlashIndex === -1) {\n res = '';\n lastSegmentLength = 0;\n } else {\n res = res.slice(0, lastSlashIndex);\n lastSegmentLength = res.length - 1 - res.lastIndexOf('/');\n }\n lastSlash = i;\n dots = 0;\n continue;\n }\n } else if (res.length === 2 || res.length === 1) {\n res = '';\n lastSegmentLength = 0;\n lastSlash = i;\n dots = 0;\n continue;\n }\n }\n if (allowAboveRoot) {\n if (res.length > 0)\n res += '/..';\n else\n res = '..';\n lastSegmentLength = 2;\n }\n } else {\n if (res.length > 0)\n res += '/' + path.slice(lastSlash + 1, i);\n else\n res = path.slice(lastSlash + 1, i);\n lastSegmentLength = i - lastSlash - 1;\n }\n lastSlash = i;\n dots = 0;\n } else if (code === 46 /*.*/ && dots !== -1) {\n ++dots;\n } else {\n dots = -1;\n }\n }\n return res;\n}\n\nfunction _format(sep, pathObject) {\n var dir = pathObject.dir || pathObject.root;\n var base = pathObject.base || (pathObject.name || '') + (pathObject.ext || '');\n if (!dir) {\n return base;\n }\n if (dir === pathObject.root) {\n return dir + base;\n }\n return dir + sep + base;\n}\n\nvar posix = {\n // path.resolve([from ...], to)\n resolve: function resolve() {\n var resolvedPath = '';\n var resolvedAbsolute = false;\n var cwd;\n\n for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n var path;\n if (i >= 0)\n path = arguments[i];\n else {\n if (cwd === undefined)\n cwd = process.cwd();\n path = cwd;\n }\n\n assertPath(path);\n\n // Skip empty entries\n if (path.length === 0) {\n continue;\n }\n\n resolvedPath = path + '/' + resolvedPath;\n resolvedAbsolute = path.charCodeAt(0) === 47 /*/*/;\n }\n\n // At this point the path should be resolved to a full absolute path, but\n // handle relative paths to be safe (might happen when process.cwd() fails)\n\n // Normalize the path\n resolvedPath = normalizeStringPosix(resolvedPath, !resolvedAbsolute);\n\n if (resolvedAbsolute) {\n if (resolvedPath.length > 0)\n return '/' + resolvedPath;\n else\n return '/';\n } else if (resolvedPath.length > 0) {\n return resolvedPath;\n } else {\n return '.';\n }\n },\n\n normalize: function normalize(path) {\n assertPath(path);\n\n if (path.length === 0) return '.';\n\n var isAbsolute = path.charCodeAt(0) === 47 /*/*/;\n var trailingSeparator = path.charCodeAt(path.length - 1) === 47 /*/*/;\n\n // Normalize the path\n path = normalizeStringPosix(path, !isAbsolute);\n\n if (path.length === 0 && !isAbsolute) path = '.';\n if (path.length > 0 && trailingSeparator) path += '/';\n\n if (isAbsolute) return '/' + path;\n return path;\n },\n\n isAbsolute: function isAbsolute(path) {\n assertPath(path);\n return path.length > 0 && path.charCodeAt(0) === 47 /*/*/;\n },\n\n join: function join() {\n if (arguments.length === 0)\n return '.';\n var joined;\n for (var i = 0; i < arguments.length; ++i) {\n var arg = arguments[i];\n assertPath(arg);\n if (arg.length > 0) {\n if (joined === undefined)\n joined = arg;\n else\n joined += '/' + arg;\n }\n }\n if (joined === undefined)\n return '.';\n return posix.normalize(joined);\n },\n\n relative: function relative(from, to) {\n assertPath(from);\n assertPath(to);\n\n if (from === to) return '';\n\n from = posix.resolve(from);\n to = posix.resolve(to);\n\n if (from === to) return '';\n\n // Trim any leading backslashes\n var fromStart = 1;\n for (; fromStart < from.length; ++fromStart) {\n if (from.charCodeAt(fromStart) !== 47 /*/*/)\n break;\n }\n var fromEnd = from.length;\n var fromLen = fromEnd - fromStart;\n\n // Trim any leading backslashes\n var toStart = 1;\n for (; toStart < to.length; ++toStart) {\n if (to.charCodeAt(toStart) !== 47 /*/*/)\n break;\n }\n var toEnd = to.length;\n var toLen = toEnd - toStart;\n\n // Compare paths to find the longest common path from root\n var length = fromLen < toLen ? fromLen : toLen;\n var lastCommonSep = -1;\n var i = 0;\n for (; i <= length; ++i) {\n if (i === length) {\n if (toLen > length) {\n if (to.charCodeAt(toStart + i) === 47 /*/*/) {\n // We get here if `from` is the exact base path for `to`.\n // For example: from='/foo/bar'; to='/foo/bar/baz'\n return to.slice(toStart + i + 1);\n } else if (i === 0) {\n // We get here if `from` is the root\n // For example: from='/'; to='/foo'\n return to.slice(toStart + i);\n }\n } else if (fromLen > length) {\n if (from.charCodeAt(fromStart + i) === 47 /*/*/) {\n // We get here if `to` is the exact base path for `from`.\n // For example: from='/foo/bar/baz'; to='/foo/bar'\n lastCommonSep = i;\n } else if (i === 0) {\n // We get here if `to` is the root.\n // For example: from='/foo'; to='/'\n lastCommonSep = 0;\n }\n }\n break;\n }\n var fromCode = from.charCodeAt(fromStart + i);\n var toCode = to.charCodeAt(toStart + i);\n if (fromCode !== toCode)\n break;\n else if (fromCode === 47 /*/*/)\n lastCommonSep = i;\n }\n\n var out = '';\n // Generate the relative path based on the path difference between `to`\n // and `from`\n for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) {\n if (i === fromEnd || from.charCodeAt(i) === 47 /*/*/) {\n if (out.length === 0)\n out += '..';\n else\n out += '/..';\n }\n }\n\n // Lastly, append the rest of the destination (`to`) path that comes after\n // the common path parts\n if (out.length > 0)\n return out + to.slice(toStart + lastCommonSep);\n else {\n toStart += lastCommonSep;\n if (to.charCodeAt(toStart) === 47 /*/*/)\n ++toStart;\n return to.slice(toStart);\n }\n },\n\n _makeLong: function _makeLong(path) {\n return path;\n },\n\n dirname: function dirname(path) {\n assertPath(path);\n if (path.length === 0) return '.';\n var code = path.charCodeAt(0);\n var hasRoot = code === 47 /*/*/;\n var end = -1;\n var matchedSlash = true;\n for (var i = path.length - 1; i >= 1; --i) {\n code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n if (!matchedSlash) {\n end = i;\n break;\n }\n } else {\n // We saw the first non-path separator\n matchedSlash = false;\n }\n }\n\n if (end === -1) return hasRoot ? '/' : '.';\n if (hasRoot && end === 1) return '//';\n return path.slice(0, end);\n },\n\n basename: function basename(path, ext) {\n if (ext !== undefined && typeof ext !== 'string') throw new TypeError('\"ext\" argument must be a string');\n assertPath(path);\n\n var start = 0;\n var end = -1;\n var matchedSlash = true;\n var i;\n\n if (ext !== undefined && ext.length > 0 && ext.length <= path.length) {\n if (ext.length === path.length && ext === path) return '';\n var extIdx = ext.length - 1;\n var firstNonSlashEnd = -1;\n for (i = path.length - 1; i >= 0; --i) {\n var code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n } else {\n if (firstNonSlashEnd === -1) {\n // We saw the first non-path separator, remember this index in case\n // we need it if the extension ends up not matching\n matchedSlash = false;\n firstNonSlashEnd = i + 1;\n }\n if (extIdx >= 0) {\n // Try to match the explicit extension\n if (code === ext.charCodeAt(extIdx)) {\n if (--extIdx === -1) {\n // We matched the extension, so mark this as the end of our path\n // component\n end = i;\n }\n } else {\n // Extension does not match, so our result is the entire path\n // component\n extIdx = -1;\n end = firstNonSlashEnd;\n }\n }\n }\n }\n\n if (start === end) end = firstNonSlashEnd;else if (end === -1) end = path.length;\n return path.slice(start, end);\n } else {\n for (i = path.length - 1; i >= 0; --i) {\n if (path.charCodeAt(i) === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n } else if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // path component\n matchedSlash = false;\n end = i + 1;\n }\n }\n\n if (end === -1) return '';\n return path.slice(start, end);\n }\n },\n\n extname: function extname(path) {\n assertPath(path);\n var startDot = -1;\n var startPart = 0;\n var end = -1;\n var matchedSlash = true;\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n var preDotState = 0;\n for (var i = path.length - 1; i >= 0; --i) {\n var code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46 /*.*/) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1)\n startDot = i;\n else if (preDotState !== 1)\n preDotState = 1;\n } else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n\n if (startDot === -1 || end === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n return '';\n }\n return path.slice(startDot, end);\n },\n\n format: function format(pathObject) {\n if (pathObject === null || typeof pathObject !== 'object') {\n throw new TypeError('The \"pathObject\" argument must be of type Object. Received type ' + typeof pathObject);\n }\n return _format('/', pathObject);\n },\n\n parse: function parse(path) {\n assertPath(path);\n\n var ret = { root: '', dir: '', base: '', ext: '', name: '' };\n if (path.length === 0) return ret;\n var code = path.charCodeAt(0);\n var isAbsolute = code === 47 /*/*/;\n var start;\n if (isAbsolute) {\n ret.root = '/';\n start = 1;\n } else {\n start = 0;\n }\n var startDot = -1;\n var startPart = 0;\n var end = -1;\n var matchedSlash = true;\n var i = path.length - 1;\n\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n var preDotState = 0;\n\n // Get non-dir info\n for (; i >= start; --i) {\n code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46 /*.*/) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1) startDot = i;else if (preDotState !== 1) preDotState = 1;\n } else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n\n if (startDot === -1 || end === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n if (end !== -1) {\n if (startPart === 0 && isAbsolute) ret.base = ret.name = path.slice(1, end);else ret.base = ret.name = path.slice(startPart, end);\n }\n } else {\n if (startPart === 0 && isAbsolute) {\n ret.name = path.slice(1, startDot);\n ret.base = path.slice(1, end);\n } else {\n ret.name = path.slice(startPart, startDot);\n ret.base = path.slice(startPart, end);\n }\n ret.ext = path.slice(startDot, end);\n }\n\n if (startPart > 0) ret.dir = path.slice(0, startPart - 1);else if (isAbsolute) ret.dir = '/';\n\n return ret;\n },\n\n sep: '/',\n delimiter: ':',\n win32: null,\n posix: null\n};\n\nposix.posix = posix;\n\nmodule.exports = posix;\n","export var DFSOperation;\n(function (DFSOperation) {\n DFSOperation[DFSOperation[\"VISIT\"] = 0] = \"VISIT\";\n DFSOperation[DFSOperation[\"PROCESS\"] = 1] = \"PROCESS\";\n})(DFSOperation || (DFSOperation = {}));\n//# sourceMappingURL=index.js.map","export class IterableElementBase {\n /**\n * The protected constructor initializes the options for the IterableElementBase class, including the\n * toElementFn function.\n * @param [options] - An optional object that contains the following properties:\n */\n constructor(options) {\n if (options) {\n const { toElementFn } = options;\n if (typeof toElementFn === 'function')\n this._toElementFn = toElementFn;\n else if (toElementFn)\n throw new TypeError('toElementFn must be a function type');\n }\n }\n _toElementFn;\n /**\n * The function returns the _toElementFn property, which is a function that converts a raw element to\n * a specific type.\n * @returns The function `get toElementFn()` is returning either a function that takes a raw element\n * `rawElement` of type `R` and returns an element `E`, or `undefined` if no function is assigned to\n * `_toElementFn`.\n */\n get toElementFn() {\n return this._toElementFn;\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(1)\n *\n * The function is an implementation of the Symbol.iterator method that returns an IterableIterator.\n * @param {any[]} args - The `args` parameter in the code snippet represents a rest parameter. It\n * allows the function to accept any number of arguments as an array. In this case, the `args`\n * parameter is used to pass any number of arguments to the `_getIterator` method.\n */\n *[Symbol.iterator](...args) {\n yield* this._getIterator(...args);\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(n)\n *\n * The function returns an iterator that yields all the values in the object.\n */\n *values() {\n for (const item of this) {\n yield item;\n }\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(1)\n *\n * The `every` function checks if every element in the array satisfies a given predicate.\n * @param predicate - The `predicate` parameter is a callback function that takes three arguments:\n * the current element being processed, its index, and the array it belongs to. It should return a\n * boolean value indicating whether the element satisfies a certain condition or not.\n * @param {any} [thisArg] - The `thisArg` parameter is an optional argument that specifies the value\n * to be used as `this` when executing the `predicate` function. If `thisArg` is provided, it will be\n * passed as the `this` value to the `predicate` function. If `thisArg` is\n * @returns The `every` method is returning a boolean value. It returns `true` if every element in\n * the array satisfies the provided predicate function, and `false` otherwise.\n */\n every(predicate, thisArg) {\n let index = 0;\n for (const item of this) {\n if (!predicate.call(thisArg, item, index++, this)) {\n return false;\n }\n }\n return true;\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(1)\n *\n * The \"some\" function checks if at least one element in a collection satisfies a given predicate.\n * @param predicate - The `predicate` parameter is a callback function that takes three arguments:\n * `value`, `index`, and `array`. It should return a boolean value indicating whether the current\n * element satisfies the condition.\n * @param {any} [thisArg] - The `thisArg` parameter is an optional argument that specifies the value\n * to be used as the `this` value when executing the `predicate` function. If `thisArg` is provided,\n * it will be passed as the `this` value to the `predicate` function. If `thisArg\n * @returns a boolean value. It returns true if the predicate function returns true for any element\n * in the collection, and false otherwise.\n */\n some(predicate, thisArg) {\n let index = 0;\n for (const item of this) {\n if (predicate.call(thisArg, item, index++, this)) {\n return true;\n }\n }\n return false;\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(1)\n *\n * The `forEach` function iterates over each element in an array-like object and calls a callback\n * function for each element.\n * @param callbackfn - The callbackfn parameter is a function that will be called for each element in\n * the array. It takes three arguments: the current element being processed, the index of the current\n * element, and the array that forEach was called upon.\n * @param {any} [thisArg] - The `thisArg` parameter is an optional argument that specifies the value\n * to be used as `this` when executing the `callbackfn` function. If `thisArg` is provided, it will\n * be passed as the `this` value to the `callbackfn` function. If `thisArg\n */\n forEach(callbackfn, thisArg) {\n let index = 0;\n for (const item of this) {\n callbackfn.call(thisArg, item, index++, this);\n }\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(1)\n *\n * The `find` function iterates over the elements of an array-like object and returns the first\n * element that satisfies the provided callback function.\n * @param callbackfn - The callbackfn parameter is a function that will be called for each element in\n * the array. It takes three arguments: the current element being processed, the index of the current\n * element, and the array itself. The function should return a boolean value indicating whether the\n * current element matches the desired condition.\n * @param {any} [thisArg] - The `thisArg` parameter is an optional argument that specifies the value\n * to be used as `this` when executing the `callbackfn` function. If `thisArg` is provided, it will\n * be passed as the `this` value to the `callbackfn` function. If `thisArg\n * @returns The `find` method returns the first element in the array that satisfies the provided\n * callback function. If no element satisfies the callback function, `undefined` is returned.\n */\n find(callbackfn, thisArg) {\n let index = 0;\n for (const item of this) {\n if (callbackfn.call(thisArg, item, index++, this))\n return item;\n }\n return;\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(1)\n *\n * The function checks if a given element exists in a collection.\n * @param {E} element - The parameter \"element\" is of type E, which means it can be any type. It\n * represents the element that we want to check for existence in the collection.\n * @returns a boolean value. It returns true if the element is found in the collection, and false\n * otherwise.\n */\n has(element) {\n for (const ele of this) {\n if (ele === element)\n return true;\n }\n return false;\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(1)\n *\n * The `reduce` function iterates over the elements of an array-like object and applies a callback\n * function to reduce them into a single value.\n * @param callbackfn - The callbackfn parameter is a function that will be called for each element in\n * the array. It takes four arguments:\n * @param {U} initialValue - The initialValue parameter is the initial value of the accumulator. It\n * is the value that the accumulator starts with before the reduction operation begins.\n * @returns The `reduce` method is returning the final value of the accumulator after iterating over\n * all the elements in the array and applying the callback function to each element.\n */\n reduce(callbackfn, initialValue) {\n let accumulator = initialValue;\n let index = 0;\n for (const item of this) {\n accumulator = callbackfn(accumulator, item, index++, this);\n }\n return accumulator;\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(n)\n *\n * The print function logs the elements of an array to the console.\n */\n toVisual() {\n return [...this];\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(n)\n *\n * The print function logs the elements of an array to the console.\n */\n print() {\n console.log(this.toVisual());\n }\n}\n//# sourceMappingURL=iterable-element-base.js.map","/**\n * data-structure-typed\n * @author Kirk Qi\n * @copyright Copyright (c) 2022 Kirk Qi <qilinaus@gmail.com>\n * @license MIT License\n */\nimport { IterableElementBase } from '../base';\n/**\n * 1. Complete Binary Tree: Heaps are typically complete binary trees, meaning every level is fully filled except possibly for the last level, which has nodes as far left as possible.\n * 2. Heap Properties: Each node in a heap follows a specific order property, which varies depending on the type of heap:\n * Max Heap: The value of each parent node is greater than or equal to the value of its children.\n * Min Heap: The value of each parent node is less than or equal to the value of its children.\n * 3. Root Node Access: In a heap, the largest element (in a max heap) or the smallest element (in a min heap) is always at the root of the tree.\n * 4. Efficient Insertion and Deletion: Due to its structure, a heap allows for insertion and deletion operations in logarithmic time (O(log n)).\n * 5. Managing Dynamic Data Sets: Heaps effectively manage dynamic data sets, especially when frequent access to the largest or smallest elements is required.\n * 6. Non-linear Search: While a heap allows rapid access to its largest or smallest element, it is less efficient for other operations, such as searching for a specific element, as it is not designed for these tasks.\n * 7. Efficient Sorting Algorithms: For example, heap sort. Heap sort uses the properties of a heap to sort elements.\n * 8. Graph Algorithms: Such as Dijkstra's shortest path algorithm and Prime's minimum-spanning tree algorithm, which use heaps to improve performance.\n * @example\n * // Use Heap to sort an array\n * function heapSort(arr: number[]): number[] {\n * const heap = new Heap<number>(arr, { comparator: (a, b) => a - b });\n * const sorted: number[] = [];\n * while (!heap.isEmpty()) {\n * sorted.push(heap.poll()!); // Poll minimum element\n * }\n * return sorted;\n * }\n *\n * const array = [5, 3, 8, 4, 1, 2];\n * console.log(heapSort(array)); // [1, 2, 3, 4, 5, 8]\n * @example\n * // Use Heap to solve top k problems\n * function topKElements(arr: number[], k: number): number[] {\n * const heap = new Heap<number>([], { comparator: (a, b) => b - a }); // Max heap\n * arr.forEach(num => {\n * heap.add(num);\n * if (heap.size > k) heap.poll(); // Keep the heap size at K\n * });\n * return heap.toArray();\n * }\n *\n * const numbers = [10, 30, 20, 5, 15, 25];\n * console.log(topKElements(numbers, 3)); // [15, 10, 5]\n * @example\n * // Use Heap to merge sorted sequences\n * function mergeSortedSequences(sequences: number[][]): number[] {\n * const heap = new Heap<{ value: number; seqIndex: number; itemIndex: number }>([], {\n * comparator: (a, b) => a.value - b.value // Min heap\n * });\n *\n * // Initialize heap\n * sequences.forEach((seq, seqIndex) => {\n * if (seq.length) {\n * heap.add({ value: seq[0], seqIndex, itemIndex: 0 });\n * }\n * });\n *\n * const merged: number[] = [];\n * while (!heap.isEmpty()) {\n * const { value, seqIndex, itemIndex } = heap.poll()!;\n * merged.push(value);\n *\n * if (itemIndex + 1 < sequences[seqIndex].length) {\n * heap.add({\n * value: sequences[seqIndex][itemIndex + 1],\n * seqIndex,\n * itemIndex: itemIndex + 1\n * });\n * }\n * }\n *\n * return merged;\n * }\n *\n * const sequences = [\n * [1, 4, 7],\n * [2, 5, 8],\n * [3, 6, 9]\n * ];\n * console.log(mergeSortedSequences(sequences)); // [1, 2, 3, 4, 5, 6, 7, 8, 9]\n * @example\n * // Use Heap to dynamically maintain the median\n * class MedianFinder {\n * private low: MaxHeap<number>; // Max heap, stores the smaller half\n * private high: MinHeap<number>; // Min heap, stores the larger half\n *\n * constructor() {\n * this.low = new MaxHeap<number>([]);\n * this.high = new MinHeap<number>([]);\n * }\n *\n * addNum(num: number): void {\n * if (this.low.isEmpty() || num <= this.low.peek()!) this.low.add(num);\n * else this.high.add(num);\n *\n * // Balance heaps\n * if (this.low.size > this.high.size + 1) this.high.add(this.low.poll()!);\n * else if (this.high.size > this.low.size) this.low.add(this.high.poll()!);\n * }\n *\n * findMedian(): number {\n * if (this.low.size === this.high.size) return (this.low.peek()! + this.high.peek()!) / 2;\n * return this.low.peek()!;\n * }\n * }\n *\n * const medianFinder = new MedianFinder();\n * medianFinder.addNum(10);\n * console.log(medianFinder.findMedian()); // 10\n * medianFinder.addNum(20);\n * console.log(medianFinder.findMedian()); // 15\n * medianFinder.addNum(30);\n * console.log(medianFinder.findMedian()); // 20\n * medianFinder.addNum(40);\n * console.log(medianFinder.findMedian()); // 25\n * medianFinder.addNum(50);\n * console.log(medianFinder.findMedian()); // 30\n * @example\n * // Use Heap for load balancing\n * function loadBalance(requests: number[], servers: number): number[] {\n * const serverHeap = new Heap<{ id: number; load: number }>([], { comparator: (a, b) => a.load - b.load }); // min heap\n * const serverLoads = new Array(servers).fill(0);\n *\n * for (let i = 0; i < servers; i++) {\n * serverHeap.add({ id: i, load: 0 });\n * }\n *\n * requests.forEach(req => {\n * const server = serverHeap.poll()!;\n * serverLoads[server.id] += req;\n * server.load += req;\n * serverHeap.add(server); // The server after updating the load is re-entered into the heap\n * });\n *\n * return serverLoads;\n * }\n *\n * const requests = [5, 2, 8, 3, 7];\n * console.log(loadBalance(requests, 3)); // [12, 8, 5]\n * @example\n * // Use Heap to schedule tasks\n * type Task = [string, number];\n *\n * function scheduleTasks(tasks: Task[], machines: number): Map<number, Task[]> {\n * const machineHeap = new Heap<{ id: number; load: number }>([], { comparator: (a, b) => a.load - b.load }); // Min heap\n * const allocation = new Map<number, Task[]>();\n *\n * // Initialize the load on each machine\n * for (let i = 0; i < machines; i++) {\n * machineHeap.add({ id: i, load: 0 });\n * allocation.set(i, []);\n * }\n *\n * // Assign tasks\n * tasks.forEach(([task, load]) => {\n * const machine = machineHeap.poll()!;\n * allocation.get(machine.id)!.push([task, load]);\n * machine.load += load;\n * machineHeap.add(machine); // The machine after updating the load is re-entered into the heap\n * });\n *\n * return allocation;\n * }\n *\n * const tasks: Task[] = [\n * ['Task1', 3],\n * ['Task2', 1],\n * ['Task3', 2],\n * ['Task4', 5],\n * ['Task5', 4]\n * ];\n * const expectedMap = new Map<number, Task[]>();\n * expectedMap.set(0, [\n * ['Task1', 3],\n * ['Task4', 5]\n * ]);\n * expectedMap.set(1, [\n * ['Task2', 1],\n * ['Task3', 2],\n * ['Task5', 4]\n * ]);\n * console.log(scheduleTasks(tasks, 2)); // expectedMap\n */\nexport class Heap extends IterableElementBase {\n /**\n * The constructor initializes a heap data structure with optional elements and options.\n * @param elements - The `elements` parameter is an iterable object that contains the initial\n * elements to be added to the heap.\n * It is an optional parameter, and if not provided, the heap will\n * be initialized as empty.\n * @param [options] - The `options` parameter is an optional object that can contain additional\n * configuration options for the heap.\n * In this case, it is used to specify a custom comparator\n * function for comparing elements in the heap.\n * The comparator function is used to determine the\n * order of elements in the heap.\n */\n constructor(elements = [], options) {\n super(options);\n if (options) {\n const { comparator } = options;\n if (comparator)\n this._comparator = comparator;\n }\n if (elements) {\n for (const el of elements) {\n if (this.toElementFn)\n this.add(this.toElementFn(el));\n else\n this.add(el);\n }\n }\n }\n _elements = [];\n /**\n * The function returns an array of elements.\n * @returns The element array is being returned.\n */\n get elements() {\n return this._elements;\n }\n /**\n * Get the size (number of elements) of the heap.\n */\n get size() {\n return this.elements.length;\n }\n /**\n * Get the last element in the heap, which is not necessarily a leaf node.\n * @returns The last element or undefined if the heap is empty.\n */\n get leaf() {\n return this.elements[this.size - 1] ?? undefined;\n }\n /**\n * Static method that creates a binary heap from an array of elements and a comparison function.\n * @returns A new Heap instance.\n * @param elements\n * @param options\n */\n static heapify(elements, options) {\n return new Heap(elements, options);\n }\n /**\n * Time Complexity: O(log n)\n * Space Complexity: O(1)\n *\n * Insert an element into the heap and maintain the heap properties.\n * @param element - The element to be inserted.\n */\n add(element) {\n this._elements.push(element);\n return this._bubbleUp(this.elements.length - 1);\n }\n /**\n * Time Complexity: O(log n)\n * Space Complexity: O(1)\n *\n * Remove and return the top element (the smallest or largest element) from the heap.\n * @returns The top element or undefined if the heap is empty.\n */\n poll() {\n if (this.elements.length === 0)\n return;\n const value = this.elements[0];\n const last = this.elements.pop();\n if (this.elements.length) {\n this.elements[0] = last;\n this._sinkDown(0, this.elements.length >> 1);\n }\n return value;\n }\n /**\n * Time Complexity: O(1)\n * Space Complexity: O(1)\n *\n * Peek at the top element of the heap without removing it.\n * @returns The top element or undefined if the heap is empty.\n */\n peek() {\n return this.elements[0];\n }\n /**\n * Check if the heap is empty.\n * @returns True if the heap is empty, otherwise false.\n */\n isEmpty() {\n return this.size === 0;\n }\n /**\n * Reset the elements of the heap. Make the elements empty.\n */\n clear() {\n this._elements = [];\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(n)\n *\n * Clear and add elements of the heap\n * @param elements\n */\n refill(elements) {\n this._elements = elements;\n return this.fix();\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(1)\n *\n * Use a comparison function to check whether a binary heap contains a specific element.\n * @param element - the element to check.\n * @returns Returns true if the specified element is contained; otherwise, returns false.\n */\n has(element) {\n return this.elements.includes(element);\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(1)\n *\n * The `delete` function removes an element from an array-like data structure, maintaining the order\n * and structure of the remaining elements.\n * @param {E} element - The `element` parameter represents the element that you want to delete from\n * the array `this.elements`.\n * @returns The `delete` function is returning a boolean value. It returns `true` if the element was\n * successfully deleted from the array, and `false` if the element was not found in the array.\n */\n delete(element) {\n const index = this.elements.indexOf(element);\n if (index < 0)\n return false;\n if (index === 0) {\n this.poll();\n }\n else if (index === this.elements.length - 1) {\n this.elements.pop();\n }\n else {\n this.elements.splice(index, 1, this.elements.pop());\n this._bubbleUp(index);\n this._sinkDown(index, this.elements.length >> 1);\n }\n return true;\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(log n)\n *\n * Depth-first search (DFS) method, different traversal orders can be selected。\n * @param order - Traverse order parameter: 'IN' (in-order), 'PRE' (pre-order) or 'POST' (post-order).\n * @returns An array containing elements traversed in the specified order.\n */\n dfs(order = 'PRE') {\n const result = [];\n // Auxiliary recursive function, traverses the binary heap according to the traversal order\n const _dfs = (index) => {\n const left = 2 * index + 1, right = left + 1;\n if (index < this.size) {\n if (order === 'IN') {\n _dfs(left);\n result.push(this.elements[index]);\n _dfs(right);\n }\n else if (order === 'PRE') {\n result.push(this.elements[index]);\n _dfs(left);\n _dfs(right);\n }\n else if (order === 'POST') {\n _dfs(left);\n _dfs(right);\n result.push(this.elements[index]);\n }\n }\n };\n _dfs(0); // Traverse starting from the root node\n return result;\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(n)\n *\n * Convert the heap to an array.\n * @returns An array containing the elements of the heap.\n */\n toArray() {\n return [...this.elements];\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(n)\n *\n * Clone the heap, creating a new heap with the same elements.\n * @returns A new Heap instance containing the same elements.\n */\n clone() {\n return new Heap(this, { comparator: this.comparator, toElementFn: this.toElementFn });\n }\n /**\n * Time Complexity: O(n log n)\n * Space Complexity: O(n)\n *\n * Sort the elements in the heap and return them as an array.\n * @returns An array containing the elements sorted in ascending order.\n */\n sort() {\n const visitedNode = [];\n const cloned = new Heap(this, { comparator: this.comparator });\n while (cloned.size !== 0) {\n const top = cloned.poll();\n if (top !== undefined)\n visitedNode.push(top);\n }\n return visitedNode;\n }\n /**\n * Time Complexity: O(n log n)\n * Space Complexity: O(n)\n *\n * Fix the entire heap to maintain heap properties.\n */\n fix() {\n const results = [];\n for (let i = Math.floor(this.size / 2); i >= 0; i--)\n results.push(this._sinkDown(i, this.elements.length >> 1));\n return results;\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(n)\n *\n * The `filter` function creates a new Heap object containing elements that pass a given callback\n * function.\n * @param callback - The `callback` parameter is a function that will be called for each element in\n * the heap. It takes three arguments: the current element, the index of the current element, and the\n * heap itself. The callback function should return a boolean value indicating whether the current\n * element should be included in the filtered list\n * @param {any} [thisArg] - The `thisArg` parameter is an optional argument that specifies the value\n * to be used as `this` when executing the `callback` function. If `thisArg` is provided, it will be\n * passed as the `this` value to the `callback` function. If `thisArg` is\n * @returns The `filter` method is returning a new `Heap` object that contains the elements that pass\n * the filter condition specified by the `callback` function.\n */\n filter(callback, thisArg) {\n const filteredList = new Heap([], { toElementFn: this.toElementFn, comparator: this.comparator });\n let index = 0;\n for (const current of this) {\n if (callback.call(thisArg, current, index, this)) {\n filteredList.add(current);\n }\n index++;\n }\n return filteredList;\n }\n /**\n * Time Complexity: O(n log n)\n * Space Complexity: O(n)\n *\n * The `map` function creates a new heap by applying a callback function to each element of the\n * original heap.\n * @param callback - The `callback` parameter is a function that will be called for each element in\n * the heap. It takes three arguments: `el` (the current element), `index` (the index of the current\n * element), and `this` (the heap itself). The callback function should return a value of\n * @param comparator - The `comparator` parameter is a function that defines the order of the\n * elements in the heap. It takes two elements `a` and `b` as arguments and returns a negative number\n * if `a` should be placed before `b`, a positive number if `a` should be placed after\n * @param [toElementFn] - The `toElementFn` parameter is an optional function that converts the raw\n * element `RR` to the desired type `T`. It takes a single argument `rawElement` of type `RR` and\n * returns a value of type `T`. This function is used to transform the elements of the original\n * @param {any} [thisArg] - The `thisArg` parameter is an optional argument that allows you to\n * specify the value of `this` within the callback function. It is used to set the context or scope\n * in which the callback function will be executed. If `thisArg` is provided, it will be used as the\n * value of\n * @returns a new instance of the `Heap` class with the mapped elements.\n */\n map(callback, comparator, toElementFn, thisArg) {\n const mappedHeap = new Heap([], { comparator, toElementFn });\n let index = 0;\n for (const el of this) {\n mappedHeap.add(callback.call(thisArg, el, index, this));\n index++;\n }\n return mappedHeap;\n }\n _DEFAULT_COMPARATOR = (a, b) => {\n if (typeof a === 'object' || typeof b === 'object') {\n throw TypeError(`When comparing object types, a custom comparator must be defined in the constructor's options parameter.`);\n }\n if (a > b)\n return 1;\n if (a < b)\n return -1;\n return 0;\n };\n _comparator = this._DEFAULT_COMPARATOR;\n /**\n * The function returns the value of the _comparator property.\n * @returns The `_comparator` property is being returned.\n */\n get comparator() {\n return this._comparator;\n }\n /**\n * The function `_getIterator` returns an iterable iterator for the elements in the class.\n */\n *_getIterator() {\n for (const element of this.elements) {\n yield element;\n }\n }\n /**\n * Time Complexity: O(log n)\n * Space Complexity: O(1)\n *\n * Float operation to maintain heap properties after adding an element.\n * @param index - The index of the newly added element.\n */\n _bubbleUp(index) {\n const element = this.elements[index];\n while (index > 0) {\n const parent = (index - 1) >> 1;\n const parentItem = this.elements[parent];\n if (this.comparator(parentItem, element) <= 0)\n break;\n this.elements[index] = parentItem;\n index = parent;\n }\n this.elements[index] = element;\n return true;\n }\n /**\n * Time Complexity: O(log n)\n * Space Complexity: O(1)\n *\n * Sinking operation to maintain heap properties after removing the top element.\n * @param index - The index from which to start sinking.\n * @param halfLength\n */\n _sinkDown(index, halfLength) {\n const element = this.elements[index];\n while (index < halfLength) {\n let left = (index << 1) | 1;\n const right = left + 1;\n let minItem = this.elements[left];\n if (right < this.elements.length && this.comparator(minItem, this.elements[right]) > 0) {\n left = right;\n minItem = this.elements[right];\n }\n if (this.comparator(minItem, element) >= 0)\n break;\n this.elements[index] = minItem;\n index = left;\n }\n this.elements[index] = element;\n return true;\n }\n}\nexport class FibonacciHeapNode {\n element;\n degree;\n left;\n right;\n child;\n parent;\n marked;\n /**\n * The constructor function initializes an object with an element and a degree, and sets the marked\n * property to false.\n * @param {E} element - The \"element\" parameter represents the value or data that will be stored in\n * the node of a data structure. It can be any type of data, such as a number, string, object, or\n * even another data structure.\n * @param [degree=0] - The degree parameter represents the degree of the element in a data structure\n * called a Fibonacci heap. The degree of a node is the number of children it has. By default, the\n * degree is set to 0 when a new node is created.\n */\n constructor(element, degree = 0) {\n this.element = element;\n this.degree = degree;\n this.marked = false;\n }\n}\nexport class FibonacciHeap {\n /**\n * The constructor function initializes a FibonacciHeap object with an optional comparator function.\n * @param [comparator] - The `comparator` parameter is an optional argument that represents a\n * function used to compare elements in the FibonacciHeap. If a comparator function is provided, it\n * will be used to determine the order of elements in the heap. If no comparator function is\n * provided, a default comparator function will be used.\n */\n constructor(comparator) {\n this.clear();\n this._comparator = comparator || this._defaultComparator;\n if (typeof this.comparator !== 'function') {\n throw new Error('FibonacciHeap constructor: given comparator should be a function.');\n }\n }\n _root;\n /**\n * The function returns the root node of a Fibonacci heap.\n * @returns The method is returning either a FibonacciHeapNode object or undefined.\n */\n get root() {\n return this._root;\n }\n _size = 0;\n /**\n * The function returns the size of an object.\n * @returns The size of the object, which is a number.\n */\n get size() {\n return this._size;\n }\n _min;\n /**\n * The function returns the minimum node in a Fibonacci heap.\n * @returns The method is returning the minimum node of the Fibonacci heap, which is of type\n * `FibonacciHeapNode<E>`. If there is no minimum node, it will return `undefined`.\n */\n get min() {\n return this._min;\n }\n _comparator;\n /**\n * The function returns the comparator used for comparing elements.\n * @returns The `_comparator` property of the object.\n */\n get comparator() {\n return this._comparator;\n }\n /**\n * Get the size (number of elements) of the heap.\n * @returns {number} The size of the heap. Returns 0 if the heap is empty. Returns -1 if the heap is invalid.\n */\n clear() {\n this._root = undefined;\n this._min = undefined;\n this._size = 0;\n }\n /**\n * Time Complexity: O(1)\n * Space Complexity: O(1)\n *\n * Insert an element into the heap and maintain the heap properties.\n * @param element\n * @returns {FibonacciHeap<E>} FibonacciHeap<E> - The heap itself.\n */\n add(element) {\n return this.push(element);\n }\n /**\n * Time Complexity: O(1)\n * Space Complexity: O(1)\n *\n * Insert an element into the heap and maintain the heap properties.\n * @param element\n * @returns {FibonacciHeap<E>} FibonacciHeap<E> - The heap itself.\n */\n push(element) {\n const node = this.createNode(element);\n node.left = node;\n node.right = node;\n this.mergeWithRoot(node);\n if (!this.min || this.comparator(node.element, this.min.element) <= 0) {\n this._min = node;\n }\n this._size++;\n return this;\n }\n /**\n * Time Complexity: O(1)\n * Space Complexity: O(1)\n *\n * Peek at the top element of the heap without removing it.\n * @returns The top element or undefined if the heap is empty.\n * @protected\n */\n peek() {\n return this.min ? this.min.element : undefined;\n }\n /**\n * Time Complexity: O(n), where n is the number of elements in the linked list.\n * Space Complexity: O(1)\n *\n * Get the size (number of elements) of the heap.\n * @param {FibonacciHeapNode<E>} head - The head of the linked list.\n * @protected\n * @returns FibonacciHeapNode<E>[] - An array containing the elements of the linked list.\n */\n consumeLinkedList(head) {\n const elements = [];\n if (!head)\n return elements;\n let node = head;\n let flag = false;\n while (true) {\n if (node === head && flag)\n break;\n else if (node === head)\n flag = true;\n if (node) {\n elements.push(node);\n node = node.right;\n }\n }\n return elements;\n }\n /**\n * Time Complexity: O(1)\n * Space Complexity: O(1)\n *\n * @param parent\n * @param node\n */\n mergeWithChild(parent, node) {\n if (!parent.child) {\n parent.child = node;\n }\n else {\n node.right = parent.child.right;\n node.left = parent.child;\n parent.child.right.left = node;\n parent.child.right = node;\n }\n }\n /**\n * Time Complexity: O(log n)\n * Space Complexity: O(1)\n *\n * Remove and return the top element (the smallest or largest element) from the heap.\n * @returns The top element or undefined if the heap is empty.\n */\n poll() {\n return this.pop();\n }\n /**\n * Time Complexity: O(log n)\n * Space Complexity: O(1)\n *\n * Remove and return the top element (the smallest or largest element) from the heap.\n * @returns The top element or undefined if the heap is empty.\n */\n pop() {\n if (this._size === 0)\n return undefined;\n const z = this.min;\n if (z.child) {\n const elements = this.consumeLinkedList(z.child);\n for (const node of elements) {\n this.mergeWithRoot(node);\n node.parent = undefined;\n }\n }\n this.removeFromRoot(z);\n if (z === z.right) {\n this._min = undefined;\n this._root = undefined;\n }\n else {\n this._min = z.right;\n this._consolidate();\n }\n this._size--;\n return z.element;\n }\n /**\n * Time Complexity: O(1)\n * Space Complexity: O(1)\n *\n * merge two heaps. The heap that is merged will be cleared. The heap that is merged into will remain.\n * @param heapToMerge\n */\n merge(heapToMerge) {\n if (heapToMerge.size === 0) {\n return; // Nothing to merge\n }\n // Merge the root lists of the two heaps\n if (this.root && heapToMerge.root) {\n const thisRoot = this.root;\n const otherRoot = heapToMerge.root;\n const thisRootRight = thisRoot.right;\n const otherRootLeft = otherRoot.left;\n thisRoot.right = otherRoot;\n otherRoot.left = thisRoot;\n thisRootRight.left = otherRootLeft;\n otherRootLeft.right = thisRootRight;\n }\n // Update the minimum node\n if (!this.min || (heapToMerge.min && this.comparator(heapToMerge.min.element, this.min.element) < 0)) {\n this._min = heapToMerge.min;\n }\n // Update the size\n this._size += heapToMerge.size;\n // Clear the heap that was merged\n heapToMerge.clear();\n }\n /**\n * Create a new node.\n * @param element\n * @protected\n */\n createNode(element) {\n return new FibonacciHeapNode(element);\n }\n /**\n * Default comparator function used by the heap.\n * @param {E} a\n * @param {E} b\n * @protected\n */\n _defaultComparator(a, b) {\n if (a < b)\n return -1;\n if (a > b)\n return 1;\n return 0;\n }\n /**\n * Time Complexity: O(1)\n * Space Complexity: O(1)\n *\n * Merge the given node with the root list.\n * @param node - The node to be merged.\n */\n mergeWithRoot(node) {\n if (!this.root) {\n this._root = node;\n }\n else {\n node.right = this.root.right;\n node.left = this.root;\n this.root.right.left = node;\n this.root.right = node;\n }\n }\n /**\n * Time Complexity: O(1)\n * Space Complexity: O(1)\n *\n * Remove and return the top element (the smallest or largest element) from the heap.\n * @param node - The node to be removed.\n * @protected\n */\n removeFromRoot(node) {\n if (this.root === node)\n this._root = node.right;\n if (node.left)\n node.left.right = node.right;\n if (node.right)\n node.right.left = node.left;\n }\n /**\n * Time Complexity: O(1)\n * Space Complexity: O(1)\n *\n * Remove and return the top element (the smallest or largest element) from the heap.\n * @param y\n * @param x\n * @protected\n */\n _link(y, x) {\n this.removeFromRoot(y);\n y.left = y;\n y.right = y;\n this.mergeWithChild(x, y);\n x.degree++;\n y.parent = x;\n }\n /**\n * Time Complexity: O(n log n)\n * Space Complexity: O(n)\n *\n * Remove and return the top element (the smallest or largest element) from the heap.\n * @protected\n */\n _consolidate() {\n const A = new Array(this._size);\n const elements = this.consumeLinkedList(this.root);\n let x, y, d, t;\n for (const node of elements) {\n x = node;\n d = x.degree;\n while (A[d]) {\n y = A[d];\n if (this.comparator(x.element, y.element) > 0) {\n t = x;\n x = y;\n y = t;\n }\n this._link(y, x);\n A[d] = undefined;\n d++;\n }\n A[d] = x;\n }\n for (let i = 0; i < this._size; i++) {\n if (A[i] && this.comparator(A[i].element, this.min.element) <= 0) {\n this._min = A[i];\n }\n }\n }\n}\n//# sourceMappingURL=heap.js.map","import { Heap } from '../heap';\n/**\n * 1. Element Priority: In a PriorityQueue, elements are sorted according to their priority. Each dequeue (element removal) operation removes the element with the highest priority. The priority can be determined based on the natural ordering of the elements or through a provided comparator (Comparator).\n * 2. Heap-Based Implementation: PriorityQueue is typically implemented using a binary heap, allowing both insertion and removal operations to be completed in O(log n) time, where n is the number of elements in the queue.\n * 3. Task Scheduling: In systems where tasks need to be processed based on the urgency of tasks rather than the order of arrival.\n * 4. Dijkstra's Algorithm: In shortest path algorithms for graphs, used to select the next shortest edge to visit.\n * 5. Huffman Coding: Used to select the smallest node combination when constructing a Huffman tree.\n * 6. Kth Largest Element in a Data Stream: Used to maintain a min-heap of size K for quickly finding the Kth largest element in stream data\n */\nexport class PriorityQueue extends Heap {\n /**\n * The constructor initializes a priority queue with optional elements and options.\n * @param elements - The `elements` parameter is an iterable object that contains the initial\n * elements to be added to the priority queue. It is an optional parameter, and if not provided, the\n * priority queue will be initialized as empty.\n * @param [options] - The `options` parameter is an optional object that can be used to customize the\n * behavior of the priority queue. It can contain the following properties:\n */\n constructor(elements = [], options) {\n super(elements, options);\n }\n /**\n * The `clone` function returns a new instance of the `PriorityQueue` class with the same comparator\n * and toElementFn as the original instance.\n * @returns The method is returning a new instance of the `PriorityQueue` class with the same\n * elements and properties as the current instance.\n */\n clone() {\n return new PriorityQueue(this, { comparator: this.comparator, toElementFn: this.toElementFn });\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(n)\n *\n * The `filter` function creates a new PriorityQueue object containing elements that pass a given callback\n * function.\n * @param callback - The `callback` parameter is a function that will be called for each element in\n * the heap. It takes three arguments: the current element, the index of the current element, and the\n * heap itself. The callback function should return a boolean value indicating whether the current\n * element should be included in the filtered list\n * @param {any} [thisArg] - The `thisArg` parameter is an optional argument that specifies the value\n * to be used as `this` when executing the `callback` function. If `thisArg` is provided, it will be\n * passed as the `this` value to the `callback` function. If `thisArg` is\n * @returns The `filter` method is returning a new `PriorityQueue` object that contains the elements that pass\n * the filter condition specified by the `callback` function.\n */\n filter(callback, thisArg) {\n const filteredPriorityQueue = new PriorityQueue([], {\n toElementFn: this.toElementFn,\n comparator: this.comparator\n });\n let index = 0;\n for (const current of this) {\n if (callback.call(thisArg, current, index, this)) {\n filteredPriorityQueue.add(current);\n }\n index++;\n }\n return filteredPriorityQueue;\n }\n /**\n * Time Complexity: O(n log n)\n * Space Complexity: O(n)\n *\n * The `map` function creates a new heap by applying a callback function to each element of the\n * original heap.\n * @param callback - The `callback` parameter is a function that will be called for each element in\n * the heap. It takes three arguments: `el` (the current element), `index` (the index of the current\n * element), and `this` (the heap itself). The callback function should return a value of\n * @param comparator - The `comparator` parameter is a function that defines the order of the\n * elements in the heap. It takes two elements `a` and `b` as arguments and returns a negative number\n * if `a` should be placed before `b`, a positive number if `a` should be placed after\n * @param [toElementFn] - The `toElementFn` parameter is an optional function that converts the raw\n * element `RR` to the desired type `T`. It takes a single argument `rawElement` of type `RR` and\n * returns a value of type `T`. This function is used to transform the elements of the original\n * @param {any} [thisArg] - The `thisArg` parameter is an optional argument that allows you to\n * specify the value of `this` within the callback function. It is used to set the context or scope\n * in which the callback function will be executed. If `thisArg` is provided, it will be used as the\n * value of\n * @returns a new instance of the `PriorityQueue` class with the mapped elements.\n */\n map(callback, comparator, toElementFn, thisArg) {\n const mappedPriorityQueue = new PriorityQueue([], { comparator, toElementFn });\n let index = 0;\n for (const el of this) {\n mappedPriorityQueue.add(callback.call(thisArg, el, index, this));\n index++;\n }\n return mappedPriorityQueue;\n }\n}\n//# sourceMappingURL=priority-queue.js.map","import { PriorityQueue } from './priority-queue';\nexport class MinPriorityQueue extends PriorityQueue {\n /**\n * The constructor initializes a PriorityQueue with optional elements and options, including a\n * comparator function.\n * @param elements - The `elements` parameter is an iterable object that contains the initial\n * elements to be added to the priority queue. It is optional and defaults to an empty array if not\n * provided.\n * @param options - The `options` parameter is an object that contains additional configuration\n * options for the priority queue. In this case, it has a property called `comparator,` which is a\n * function used to compare elements in the priority queue. The `comparator` function takes two\n * parameters `a` and `b`\n */\n constructor(elements = [], options) {\n super(elements, options);\n }\n /**\n * The `clone` function returns a new instance of the `MinPriorityQueue` class with the same\n * comparator and toElementFn as the original instance.\n * @returns The method is returning a new instance of the `MinPriorityQueue` class with the same\n * properties as the current instance.\n */\n clone() {\n return new MinPriorityQueue(this, { comparator: this.comparator, toElementFn: this.toElementFn });\n }\n /**\n * Time Complexity: O(n)\n * Space Complexity: O(n)\n *\n * The `filter` function creates a new MinPriorityQueue object containing elements that pass a given callback\n * function.\n * @param callback - The `callback` parameter is a function that will be called for each element in\n * the heap. It takes three arguments: the current element, the index of the current element, and the\n * heap itself. The callback function should return a boolean value indicating whether the current\n * element should be included in the filtered list\n * @param {any} [thisArg] - The `thisArg` parameter is an optional argument that specifies the value\n * to be used as `this` when executing the `callback` function. If `thisArg` is provided, it will be\n * passed as the `this` value to the `callback` function. If `thisArg` is\n * @returns The `filter` method is returning a new `MinPriorityQueue` object that contains the elements that pass\n * the filter condition specified by the `callback` function.\n */\n filter(callback, thisArg) {\n const filteredPriorityQueue = new MinPriorityQueue([], {\n toElementFn: this.toElementFn,\n comparator: this.comparator\n });\n let index = 0;\n for (const current of this) {\n if (callback.call(thisArg, current, index, this)) {\n filteredPriorityQueue.add(current);\n }\n index++;\n }\n return filteredPriorityQueue;\n }\n /**\n * Time Complexity: O(n log n)\n * Space Complexity: O(n)\n *\n * The `map` function creates a new heap by applying a callback function to each element of the\n * original heap.\n * @param callback - The `callback` parameter is a function that will be called for each element in\n * the heap. It takes three arguments: `el` (the current element), `index` (the index of the current\n * element), and `this` (the heap itself). The callback function should return a value of\n * @param comparator - The `comparator` parameter is a function that defines the order of the\n * elements in the heap. It takes two elements `a` and `b` as arguments and returns a negative number\n * if `a` should be placed before `b`, a positive number if `a` should be placed after\n * @param [toElementFn] - The `toElementFn` parameter is an optional function that converts the raw\n * element `RR` to the desired type `T`. It takes a single argument `rawElement` of type `RR` and\n * returns a value of type `T`. This function is used to transform the elements of the original\n * @param {any} [thisArg] - The `thisArg` parameter is an optional argument that allows you to\n * specify the value of `this` within the callback function. It is used to set the context or scope\n * in which the callback function will be executed. If `thisArg` is provided, it will be used as the\n * value of\n * @returns a new instance of the `MinPriorityQueue` class with the mapped elements.\n */\n map(callback, comparator, toElementFn, thisArg) {\n const mappedPriorityQueue = new MinPriorityQueue([], { comparator, toElementFn });\n let index = 0;\n for (const el of this) {\n mappedPriorityQueue.add(callback.call(thisArg, el, index, this));\n index++;\n }\n return mappedPriorityQueue;\n }\n}\n//# sourceMappingURL=min-priority-queue.js.map","// Import necessary classes from three.js\r\nimport { Box3, Vector3, Ray } from 'three';\r\n\r\n\r\nconst tmpBox3 = new Box3();\r\nconst tmpVector1 = new Vector3();\r\nconst tmpVector2 = new Vector3();\r\nconst tmpVector3 = new Vector3();\r\nconst tmpVector4 = new Vector3();\r\n\r\n\r\n/**\r\n * Octree class for splats raycast.\r\n */\r\nclass SplatsCollider {\r\n /**\r\n * @param {Box3} bounds - The bounding box of the octree node.\r\n * @param {number} maxPoints - Maximum number of points per node before subdivision.\r\n * @param {number} [threshold] - Optional threshold. If not provided, it defaults to bounds diagonal / 100000.\r\n */\r\n constructor(bounds, maxPoints, threshold = undefined) {\r\n this.bounds = new Box3();\r\n this.bounds.copy(bounds);\r\n this.maxPointsPerNode = maxPoints;\r\n this.points = [];\r\n this.children = null;\r\n\r\n if (threshold !== undefined) {\r\n this.threshold = threshold;\r\n } else {\r\n tmpVector1.subVectors(bounds.max, bounds.min);\r\n this.threshold = tmpVector1.length() / 100000;\r\n }\r\n }\r\n\r\n /**\r\n * Inserts a splat object into the Octree.\r\n * @param {Object} splat - The splat object with a Vector3 'center' property.\r\n */\r\n insert(splat) {\r\n const center = splat.center;\r\n\r\n if (!this.bounds.containsPoint(center)) return;\r\n\r\n if (this.children === null) {\r\n if (this.points.length < this.maxPointsPerNode) {\r\n this.points.push(splat);\r\n } else {\r\n this.subdivide();\r\n this.insert(splat);\r\n }\r\n } else {\r\n const index = this.getChildIndex(center);\r\n this.children[index].insert(splat);\r\n }\r\n }\r\n\r\n /**\r\n * Queries the Octree with a Ray to find all splats within a threshold.\r\n * Returns the splats ordered front to back relative to the ray origin.\r\n * @param {Ray} ray - The three.js Ray object.\r\n * @param {number} [threshold=this.threshold] - The maximum allowed distance from the ray.\r\n * @returns {Array<{ t: number, splat: Object }>} - Array of splats within the threshold, sorted by t ascending.\r\n */\r\n query(ray, queryResults, threshold = this.threshold) {\r\n this.queryRecursive(ray, queryResults, threshold);\r\n }\r\n\r\n /**\r\n * Recursively queries the Octree to find all splats within a threshold.\r\n * @private\r\n * @param {Ray} ray - The three.js Ray object.\r\n * @param {number} threshold - The maximum allowed distance from the ray.\r\n */\r\n queryRecursive(ray, queryResults, threshold) {\r\n // Expand the bounds by the threshold\r\n tmpBox3.copy(this.bounds).expandByScalar(threshold);\r\n\r\n // Check if the ray intersects the expanded bounds\r\n if (!ray.intersectBox(tmpBox3, tmpVector1)) return;\r\n\r\n if (this.children === null) {\r\n for (let splat of this.points) {\r\n const center = splat.center;\r\n\r\n // Find the closest point on the ray to the splat center\r\n ray.closestPointToPoint(center, tmpVector1);\r\n\r\n // Vector from ray origin to the closest point\r\n tmpVector2.copy(tmpVector1).sub(ray.origin);\r\n\r\n // Calculate t parameter along the ray\r\n const t = tmpVector2.dot(ray.direction);\r\n\r\n // Ignore splats behind the ray origin\r\n if (t < 0) continue;\r\n\r\n // Calculate the distance from the splat center to the closest point on the ray\r\n const distance = center.distanceTo(tmpVector1);\r\n\r\n if (distance <= threshold) {\r\n // Add the splat and its t to the query results\r\n queryResults.push({ distance: t, point: center });\r\n }\r\n }\r\n } else {\r\n for (let child of this.children) {\r\n child.queryRecursive(ray, queryResults, threshold);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Determines which child Octree node the point belongs to.\r\n * @private\r\n * @param {Vector3} point - The point to determine the child index for.\r\n * @returns {number} - The index of the child node (0-7).\r\n */\r\n getChildIndex(point) {\r\n let index = 0;\r\n this.bounds.getCenter(tmpVector1);\r\n\r\n if (point.x >= tmpVector1.x) index |= 1;\r\n if (point.y >= tmpVector1.y) index |= 2;\r\n if (point.z >= tmpVector1.z) index |= 4;\r\n\r\n return index;\r\n }\r\n\r\n /**\r\n * Subdivides the current Octree node into eight children.\r\n * @private\r\n */\r\n subdivide() {\r\n this.children = new Array(8);\r\n\r\n // Calculate half the size of the current node's bounds\r\n tmpVector1.copy(this.bounds.max).sub(this.bounds.min).multiplyScalar(0.5); // size / 2\r\n\r\n // Copy the minimum bounds of the current node\r\n const parentMin = tmpVector2.copy(this.bounds.min);\r\n\r\n for (let i = 0; i < 8; i++) {\r\n // Start with the parent minimum bounds\r\n tmpVector3.copy(parentMin);\r\n\r\n // Adjust the child min based on the index bits\r\n if (i & 1) tmpVector3.x += tmpVector1.x;\r\n if (i & 2) tmpVector3.y += tmpVector1.y;\r\n if (i & 4) tmpVector3.z += tmpVector1.z;\r\n\r\n // Calculate child max by adding the half size to child min\r\n tmpVector4.copy(tmpVector3).add(tmpVector1); // childMax = childMin + halfSize\r\n\r\n // Set up child bounds using pre-defined temporary Box3\r\n tmpBox3.set(tmpVector3, tmpVector4);\r\n\r\n // Create a new child Octree node with the calculated bounds\r\n this.children[i] = new SplatsCollider(tmpBox3, this.maxPointsPerNode, this.threshold);\r\n }\r\n\r\n // Re-insert existing splats into the appropriate children\r\n for (let splat of this.points) {\r\n const index = this.getChildIndex(splat.center);\r\n this.children[index].insert(splat);\r\n }\r\n\r\n // Clear points from the current node\r\n this.points = null;\r\n }\r\n}\r\n\r\nexport { SplatsCollider };\r\n","import {\r\n Mesh, InstancedMesh, ShaderMaterial, Vector2, Vector3, Vector4, Box2, Box3, DataArrayTexture,\r\n FloatType, HalfFloatType, RGBFormat, RGBAFormat, FrontSide, AlwaysDepth, PlaneGeometry, Matrix3,\r\n NearestFilter, Data3DTexture, DataTexture, UnsignedByteType, BufferAttribute, InstancedBufferAttribute, DynamicDrawUsage,\r\n LinearSRGBColorSpace, InstancedBufferGeometry,\r\n WebGL3DRenderTarget, OrthographicCamera, Scene,\r\n NeverDepth\r\n} from \"three\";\r\nimport {\r\n MinPriorityQueue\r\n} from 'data-structure-typed';\r\nimport { SplatsCollider } from \"./SplatsColider\";\r\nimport WorkerConstructor from './PointsManager.worker.js?worker';\r\n\r\nconst tmpVector = new Vector3();\r\nconst tmpVector2 = new Vector3();\r\nconst zUpToYUpMatrix3x3 = new Matrix3();\r\nzUpToYUpMatrix3x3.set(\r\n 1, 0, 0,\r\n 0, 0, 1,\r\n 0, -1, 0);\r\n\r\nclass SplatsMesh extends Mesh {\r\n constructor(renderer, fragShader) {\r\n\r\n const textureSize = 512;\r\n\r\n const numTextures = 1;\r\n const batchSize = Math.min(Math.ceil(4096 / textureSize) * textureSize, Math.pow(textureSize, 2));\r\n let maxSplats = numTextures * Math.pow(textureSize, 2);\r\n maxSplats = Math.floor(maxSplats / batchSize) * batchSize;\r\n\r\n\r\n const colorRenderTarget = new WebGL3DRenderTarget(textureSize, textureSize, numTextures, {\r\n magFilter: NearestFilter,\r\n minFilter: NearestFilter,\r\n anisotropy: 0,\r\n depthBuffer: false,\r\n resolveDepthBuffer: false,\r\n })\r\n renderer.initRenderTarget(colorRenderTarget);\r\n\r\n const positionRenderTarget = new WebGL3DRenderTarget(textureSize, textureSize, numTextures, {\r\n magFilter: NearestFilter,\r\n minFilter: NearestFilter,\r\n anisotropy: 0,\r\n type: FloatType,\r\n depthBuffer: false,\r\n resolveDepthBuffer: false,\r\n })\r\n positionRenderTarget.texture.type = FloatType;\r\n renderer.initRenderTarget(positionRenderTarget);\r\n const cov1RenderTarget = new WebGL3DRenderTarget(textureSize, textureSize, numTextures, {\r\n magFilter: NearestFilter,\r\n minFilter: NearestFilter,\r\n anisotropy: 0,\r\n type: FloatType,\r\n depthBuffer: false,\r\n resolveDepthBuffer: false,\r\n })\r\n cov1RenderTarget.texture.type = FloatType;\r\n renderer.initRenderTarget(cov1RenderTarget);\r\n const cov2RenderTarget = new WebGL3DRenderTarget(textureSize, textureSize, numTextures, {\r\n magFilter: NearestFilter,\r\n minFilter: NearestFilter,\r\n anisotropy: 0,\r\n type: FloatType,\r\n depthBuffer: false,\r\n resolveDepthBuffer: false,\r\n })\r\n cov2RenderTarget.texture.type = FloatType;\r\n renderer.initRenderTarget(cov2RenderTarget);\r\n\r\n\r\n const material = new ShaderMaterial(\r\n {\r\n uniforms: {\r\n textureSize: { value: textureSize },\r\n numSlices: { value: numTextures },\r\n cov1Texture: { value: cov1RenderTarget.texture },\r\n cov2Texture: { value: cov2RenderTarget.texture },\r\n colorTexture: { value: colorRenderTarget.texture },\r\n positionTexture: { value: positionRenderTarget.texture },\r\n zUpToYUpMatrix3x3: { value: zUpToYUpMatrix3x3 },\r\n sizeMultiplier: { value: 1 },\r\n cropRadius: { value: Number.MAX_VALUE },\r\n cameraNear: {value: 0.01},\r\n cameraFar: {value: 10},\r\n computeLinearDepth:{value: true}\r\n },\r\n vertexShader: splatsVertexShader(),\r\n fragmentShader: fragShader?fragShader:splatsFragmentShader(),\r\n transparent: true,\r\n side: FrontSide,\r\n depthTest: false,\r\n depthWrite: false,\r\n //depthFunc: AlwaysDepth\r\n }\r\n );\r\n const geometry = new InstancedBufferGeometry();\r\n const vertices = new Float32Array([-0.5, 0.5, 0, 0.5, 0.5, 0, -0.5, -0.5, 0, 0.5, -0.5, 0]);\r\n const indices = [0, 2, 1, 2, 3, 1];\r\n\r\n geometry.setIndex(indices);\r\n geometry.setAttribute('position', new BufferAttribute(vertices, 3));\r\n const order = new Uint32Array(maxSplats);\r\n\r\n const orderAttribute = new InstancedBufferAttribute(order, 1, false);\r\n orderAttribute.needsUpdate = true\r\n orderAttribute.setUsage(DynamicDrawUsage);\r\n geometry.setAttribute('order', orderAttribute);\r\n geometry.instanceCount = 0;\r\n\r\n\r\n super(geometry, material);\r\n\r\n this.orderAttribute = orderAttribute;\r\n this.textureSize = textureSize;\r\n this.numTextures = numTextures;\r\n this.batchSize = batchSize;\r\n this.maxSplats = maxSplats;\r\n\r\n this.colorRenderTarget = colorRenderTarget;\r\n this.positionRenderTarget = positionRenderTarget;\r\n this.cov1RenderTarget = cov1RenderTarget;\r\n this.cov2RenderTarget = cov2RenderTarget;\r\n\r\n this.renderer = renderer;\r\n\r\n this.sortID = 0;\r\n\r\n this.freeAddresses = new MinPriorityQueue();\r\n for (let i = 0; i < this.maxSplats; i += batchSize) {\r\n this.freeAddresses.add(i);\r\n }\r\n\r\n this.worker = new WorkerConstructor({ type: 'module' });\r\n\r\n this.sortListeners = [];\r\n this.worker.onmessage = message => {\r\n const newOrder = new Uint32Array(message.data.order);\r\n if (newOrder.length > this.orderAttribute.count) {\r\n const geometry = new InstancedBufferGeometry();\r\n const vertices = new Float32Array([-0.5, 0.5, 0, 0.5, 0.5, 0, -0.5, -0.5, 0, 0.5, -0.5, 0]);\r\n const indices = [0, 2, 1, 2, 3, 1];\r\n\r\n geometry.setIndex(indices);\r\n geometry.setAttribute('position', new BufferAttribute(vertices, 3));\r\n const order = new Uint32Array(this.maxSplats);\r\n\r\n const orderAttribute = new InstancedBufferAttribute(order, 1, false);\r\n orderAttribute.needsUpdate = true\r\n orderAttribute.setUsage(DynamicDrawUsage);\r\n geometry.setAttribute('order', orderAttribute);\r\n geometry.instanceCount = 0;\r\n\r\n this.geometry.dispose();\r\n this.geometry = geometry;\r\n this.orderAttribute = orderAttribute;\r\n }\r\n this.orderAttribute.clearUpdateRanges();\r\n this.orderAttribute.set(newOrder);\r\n this.orderAttribute.addUpdateRange(0, newOrder.length);\r\n this.orderAttribute.needsUpdate = true;\r\n this.geometry.instanceCount = message.data.count;\r\n this.geometry.needsUpdate = true;\r\n for (let i = this.sortListeners.length - 1; i >= 0; i--) {\r\n const done = this.sortListeners[i](message.data.id);\r\n if (done) {\r\n this.sortListeners.splice(i, 1);\r\n }\r\n }\r\n }\r\n this.cameraPosition = new Vector3(0, 0, 0);\r\n this.rotateOnAxis(new Vector3(1, 0, 0), Math.PI * 0.5);\r\n this.frustumCulled = false;\r\n\r\n\r\n /// Copy setup ///\r\n this.copyMaterial2D = new ShaderMaterial(\r\n {\r\n uniforms: {\r\n sourceTexture: {},\r\n },\r\n vertexShader: vertexCopyShader(),\r\n fragmentShader: fragmentCopyShader2D(),\r\n transparent: false,\r\n side: FrontSide,\r\n depthTest: false,\r\n depthWrite: false\r\n }\r\n );\r\n this.copyMaterial3D = new ShaderMaterial(\r\n {\r\n uniforms: {\r\n sourceTexture: {},\r\n w: { value: 0.0 }\r\n },\r\n vertexShader: vertexCopyShader(),\r\n fragmentShader: fragmentCopyShader3D(),\r\n transparent: false,\r\n side: FrontSide,\r\n depthTest: false,\r\n depthWrite: false\r\n }\r\n );\r\n this.copyCamera = new OrthographicCamera(-0.5, 0.5, 0.5, -0.5, 0.1, 10);\r\n this.copyCamera.position.z = 1;\r\n this.copyScene = new Scene();\r\n const copyGeometry = new PlaneGeometry(1, 1);\r\n this.copyQuad = new Mesh(copyGeometry, this.copyMaterial2D);\r\n this.copyScene.add(this.copyQuad);\r\n this.copyScene.matrixAutoUpdate = false;\r\n this.copyQuad.matrixAutoUpdate = false;\r\n const self = this;\r\n document.addEventListener('keyup', function (event) {\r\n if (event.key === 'a') {\r\n self.growTextures()\r\n console.log(self.positionRenderTarget.depth)\r\n // Add your logic here\r\n }\r\n });\r\n }\r\n\r\n dispose() {\r\n this.material.dispose();\r\n this.copyMaterial2D.dispose();\r\n this.copyMaterial3D.dispose();\r\n this.cov1RenderTarget.dispose();\r\n this.cov2RenderTarget.dispose();\r\n this.positionRenderTarget.dispose();\r\n this.colorRenderTarget.dispose();\r\n this.worker.terminate();\r\n this.worker = null;\r\n this.geometry.dispose();\r\n }\r\n\r\n copyTex2D(src, dst, scissorBox, layer) {\r\n this.copyMaterial2D.uniforms.sourceTexture.value = src;\r\n const prevAutoClear = this.renderer.autoClear;\r\n const prevRenderTarget = this.renderer.getRenderTarget();\r\n this.renderer.autoClear = false;\r\n const scissorWidth = scissorBox[2] - scissorBox[0];\r\n const scissorHeight = scissorBox[3] - scissorBox[1];\r\n dst.viewport.set(scissorBox[0], scissorBox[1], scissorWidth, scissorHeight);\r\n\r\n this.renderer.setRenderTarget(dst, layer);\r\n this.renderer.render(this.copyScene, this.copyCamera);\r\n\r\n this.renderer.setRenderTarget(prevRenderTarget);\r\n\r\n this.renderer.autoClear = prevAutoClear;\r\n\r\n }\r\n\r\n copyTex3D(src, dst, numLayers) {\r\n this.copyMaterial3D.uniforms.sourceTexture.value = src;\r\n\r\n const prevAutoClear = this.renderer.autoClear;\r\n const prevRenderTarget = this.renderer.getRenderTarget();\r\n this.renderer.autoClear = false;\r\n\r\n this.copyQuad.material = this.copyMaterial3D;\r\n\r\n for (let layer = 0; layer < numLayers; layer++) {\r\n this.renderer.setRenderTarget(dst, layer);\r\n this.copyMaterial3D.uniforms.w.value = (layer + 0.5) / (numLayers);\r\n this.renderer.render(this.copyScene, this.copyCamera);\r\n }\r\n\r\n this.copyQuad.material = this.copyMaterial2D;\r\n\r\n this.renderer.setRenderTarget(prevRenderTarget);\r\n this.renderer.autoClear = prevAutoClear;\r\n\r\n }\r\n\r\n /**\r\n * Specify a size multiplier for splats\r\n * @param {number} sizeMultiplier \r\n */\r\n setSplatsSizeMultiplier(sizeMultiplier) {\r\n this.material.uniforms.sizeMultiplier.value = sizeMultiplier;\r\n }\r\n /**\r\n * specify a crop radius for splats\r\n * @param {number} cropRadius \r\n */\r\n setSplatsCropRadius(cropRadius) {\r\n this.material.uniforms.cropRadius.value = cropRadius;\r\n }\r\n\r\n sort(cameraPosition) {\r\n if (!cameraPosition && this.cameraPosition) {\r\n this.worker.postMessage({\r\n method: \"sort\",\r\n xyz: [this.cameraPosition.x, this.cameraPosition.z, -this.cameraPosition.y],\r\n id: this.sortID++\r\n })\r\n }\r\n else if (!this.cameraPosition || !cameraPosition.equals(this.cameraPosition)) {\r\n this.cameraPosition.copy(cameraPosition);\r\n this.worker.postMessage({\r\n method: \"sort\",\r\n xyz: [this.cameraPosition.x, this.cameraPosition.z, -this.cameraPosition.y],\r\n id: this.sortID++\r\n })\r\n }\r\n }\r\n raycast(raycaster, intersects) {\r\n // overrides the method because the SplatsMesh itself is not meant to be raycast onto, the tiles should be individualy raycast\r\n }\r\n\r\n addSplatsTile(positions, colors, cov1, cov2) {\r\n const self = this;\r\n const tileCount = positions.count;\r\n const positionArray = positions.data ? positions.data.array : positions.array;\r\n const stride = positions.data && positions.data.isInterleavedBuffer ? positions.data.stride : 3;\r\n const offset = positions.data && positions.data.isInterleavedBuffer ? positions.offset : 0;\r\n const numBatches = Math.ceil(positionArray.length / (this.batchSize * stride));\r\n const textureAddresses = [];\r\n const pointManagerAddresses = [];\r\n\r\n\r\n /// raycasting ///\r\n // const start = performance.now();\r\n let raycast = () => { }\r\n const positionsOnly = new Float32Array((positionArray.length / stride) * 3);\r\n\r\n\r\n for (let i = 0; i < positionArray.length / 3; i++) {\r\n positionsOnly[i * 3] = positionArray[i * stride + offset];\r\n positionsOnly[i * 3 + 1] = positionArray[i * stride + offset + 1];\r\n positionsOnly[i * 3 + 2] = positionArray[i * stride + offset + 2];\r\n }\r\n\r\n // console.log(performance.now()-start)\r\n raycast = (ray, intersects, threshold) => {\r\n const threshSquared = threshold * threshold;\r\n for (let i = 0; i < positionsOnly.length; i += 3) {\r\n tmpVector.set(positionsOnly[i], -positionsOnly[i + 2], positionsOnly[i + 1])\r\n const dot = tmpVector2.copy(tmpVector).sub(ray.origin).dot(ray.direction);\r\n if (dot > 0) {\r\n const d = ray.distanceSqToPoint(tmpVector);\r\n if (d < threshSquared) {\r\n intersects.push({ distance: dot, point: tmpVector.clone(), type: \"splat\" });\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (numBatches > this.freeAddresses.size) {\r\n this.growTextures();\r\n }\r\n\r\n for (let i = 0; i < numBatches; i++) {\r\n const address = this.freeAddresses.poll();\r\n if (isNaN(address)) {\r\n console.log(\"insuficient texture size to store splats info\")\r\n }\r\n if (address == 0) {\r\n }\r\n textureAddresses.push(address);\r\n pointManagerAddresses.push(address * 3);\r\n const startIndex = i * this.batchSize;\r\n this.addSplatsBatch(startIndex, address, positions, colors, cov1, cov2);\r\n }\r\n\r\n\r\n self.worker.postMessage({\r\n method: \"addBatches\",\r\n insertionIndexes: pointManagerAddresses,\r\n positions: positionArray.buffer,\r\n offset: offset,\r\n stride: stride,\r\n batchSize: self.batchSize,\r\n }, [positionArray.buffer]);\r\n\r\n let visible = false;\r\n const hide = () => {\r\n if (visible == true) {\r\n visible = false;\r\n self.worker.postMessage({\r\n method: \"hideBatches\",\r\n insertionIndexes: pointManagerAddresses,\r\n xyz: [self.cameraPosition.x, self.cameraPosition.z, -self.cameraPosition.y],\r\n id: self.sortID++\r\n });\r\n }\r\n\r\n }\r\n\r\n\r\n const show = (callback) => {\r\n if (visible == false) {\r\n visible = true;\r\n }\r\n const sortID = self.sortID;\r\n const listener = (id => {\r\n if (id >= sortID) {\r\n callback();\r\n return true;\r\n }\r\n return false;\r\n });\r\n self.sortListeners.push(listener)\r\n\r\n self.worker.postMessage({\r\n method: \"showBatches\",\r\n insertionIndexes: pointManagerAddresses,\r\n xyz: [self.cameraPosition.x, self.cameraPosition.z, -self.cameraPosition.y],\r\n id: self.sortID++\r\n });\r\n\r\n\r\n }\r\n const remove = () => {\r\n raycast = undefined;\r\n self.worker.postMessage({\r\n method: \"removeBatches\",\r\n insertionIndexes: pointManagerAddresses,\r\n xyz: [self.cameraPosition.x, self.cameraPosition.z, -self.cameraPosition.y],\r\n id: self.sortID++\r\n });\r\n textureAddresses.forEach(address => self.freeAddresses.add(address));\r\n }\r\n\r\n\r\n\r\n\r\n\r\n return {\r\n hide: hide,\r\n show: show,\r\n remove: remove,\r\n sort: this.sort,\r\n raycast: raycast,\r\n isSplatsBatch: true\r\n }\r\n\r\n }\r\n addSplatsBatch(positionsStartIndex, address, positions, colors, cov1, cov2) {\r\n\r\n\r\n const positionArray = new Float32Array(this.batchSize * 4);\r\n const colorsArray = new Uint8Array(this.batchSize * 4);\r\n const cov1Array = new Float32Array(this.batchSize * 4);\r\n const cov2Array = new Float32Array(this.batchSize * 4);\r\n\r\n\r\n for (let i = address; i < address + this.batchSize; i++) {\r\n const base = i - address;\r\n const arrayIndexBase4 = base * 4;\r\n\r\n const positionIndex = positionsStartIndex + base;\r\n if (positionIndex >= positions.count) break;\r\n\r\n positionArray[arrayIndexBase4] = positions.getX(positionIndex)\r\n positionArray[arrayIndexBase4 + 1] = positions.getY(positionIndex)\r\n positionArray[arrayIndexBase4 + 2] = positions.getZ(positionIndex)\r\n\r\n const r = Math.floor(colors.getX(positionIndex) * 255);\r\n const g = Math.floor(colors.getY(positionIndex) * 255);\r\n const b = Math.floor(colors.getZ(positionIndex) * 255);\r\n const a = Math.floor(colors.getW(positionIndex) * 255);\r\n\r\n colorsArray[arrayIndexBase4] = Math.floor(colors.getX(positionIndex) * 255);\r\n colorsArray[arrayIndexBase4 + 1] = Math.floor(colors.getY(positionIndex) * 255);\r\n colorsArray[arrayIndexBase4 + 2] = Math.floor(colors.getZ(positionIndex) * 255);\r\n colorsArray[arrayIndexBase4 + 3] = Math.floor(colors.getW(positionIndex) * 255);\r\n\r\n\r\n cov1Array[arrayIndexBase4] = cov1.getX(positionIndex)\r\n cov1Array[arrayIndexBase4 + 1] = cov1.getY(positionIndex)\r\n cov1Array[arrayIndexBase4 + 2] = cov1.getZ(positionIndex)\r\n cov2Array[arrayIndexBase4] = cov2.getX(positionIndex)\r\n cov2Array[arrayIndexBase4 + 1] = cov2.getY(positionIndex)\r\n cov2Array[arrayIndexBase4 + 2] = cov2.getZ(positionIndex)\r\n\r\n }\r\n\r\n const destTextureLayer = Math.floor(address / Math.pow(this.textureSize, 2));\r\n const srcHeight = Math.ceil(this.batchSize / this.textureSize);\r\n const scissor = [0, (address / this.textureSize) - (destTextureLayer * this.textureSize), this.textureSize];\r\n scissor.push(scissor[1] + srcHeight);\r\n const batchPositionTexture = new DataTexture(positionArray, this.textureSize, srcHeight, RGBAFormat, FloatType);\r\n batchPositionTexture.generateMipmaps = false;\r\n batchPositionTexture.magFilter = NearestFilter;\r\n batchPositionTexture.minFilter = NearestFilter;\r\n batchPositionTexture.anisotropy = 0;\r\n batchPositionTexture.needsUpdate = true;\r\n this.renderer.initTexture(batchPositionTexture)\r\n this.renderer.initRenderTarget(this.positionRenderTarget)\r\n this.copyTex2D(batchPositionTexture, this.positionRenderTarget, scissor, destTextureLayer)\r\n batchPositionTexture.dispose();\r\n\r\n\r\n const batchColorTexture = new DataTexture(colorsArray, this.textureSize, srcHeight, RGBAFormat, UnsignedByteType);\r\n batchColorTexture.generateMipmaps = false;\r\n batchColorTexture.magFilter = NearestFilter;\r\n batchColorTexture.minFilter = NearestFilter;\r\n batchColorTexture.anisotropy = 0;\r\n batchColorTexture.needsUpdate = true;\r\n this.renderer.initTexture(batchColorTexture)\r\n this.copyTex2D(batchColorTexture, this.colorRenderTarget, scissor, destTextureLayer);\r\n batchColorTexture.dispose();\r\n\r\n\r\n const batchCov1Texture = new DataTexture(cov1Array, this.textureSize, srcHeight, RGBAFormat, FloatType);\r\n batchCov1Texture.generateMipmaps = false;\r\n batchCov1Texture.magFilter = NearestFilter;\r\n batchCov1Texture.minFilter = NearestFilter;\r\n batchCov1Texture.anisotropy = 0;\r\n batchCov1Texture.needsUpdate = true;\r\n this.renderer.initTexture(batchCov1Texture)\r\n this.copyTex2D(batchCov1Texture, this.cov1RenderTarget, scissor, destTextureLayer)\r\n batchCov1Texture.dispose();\r\n\r\n const batchCov2Texture = new DataTexture(cov2Array, this.textureSize, srcHeight, RGBAFormat, FloatType);\r\n batchCov2Texture.generateMipmaps = false;\r\n batchCov2Texture.magFilter = NearestFilter;\r\n batchCov2Texture.minFilter = NearestFilter;\r\n batchCov2Texture.anisotropy = 0;\r\n batchCov2Texture.needsUpdate = true;\r\n this.renderer.initTexture(batchCov2Texture)\r\n this.copyTex2D(batchCov2Texture, this.cov2RenderTarget, scissor, destTextureLayer);\r\n batchCov2Texture.dispose();\r\n\r\n }\r\n\r\n growTextures() {\r\n\r\n //const start = performance.now();\r\n for (let i = this.maxSplats; i < this.maxSplats + (this.textureSize * this.textureSize); i += this.batchSize) {\r\n this.freeAddresses.add(i);\r\n }\r\n this.maxSplats += (this.textureSize * this.textureSize);\r\n\r\n\r\n\r\n const newNumTextures = this.numTextures + 1;\r\n const colorRenderTarget = new WebGL3DRenderTarget(this.textureSize, this.textureSize, newNumTextures, {\r\n magFilter: NearestFilter,\r\n minFilter: NearestFilter,\r\n anisotropy: 0,\r\n depthBuffer: false,\r\n resolveDepthBuffer: false,\r\n })\r\n\r\n\r\n this.renderer.initRenderTarget(colorRenderTarget);\r\n this.copyTex3D(this.colorRenderTarget.texture, colorRenderTarget, this.numTextures);\r\n this.colorRenderTarget.dispose();\r\n this.colorRenderTarget = colorRenderTarget;\r\n this.material.uniforms.colorTexture.value = this.colorRenderTarget.texture;\r\n\r\n\r\n const positionRenderTarget = new WebGL3DRenderTarget(this.textureSize, this.textureSize, newNumTextures, {\r\n magFilter: NearestFilter,\r\n minFilter: NearestFilter,\r\n anisotropy: 0,\r\n type: FloatType,\r\n depthBuffer: false,\r\n resolveDepthBuffer: false,\r\n })\r\n positionRenderTarget.texture.type = FloatType;\r\n this.renderer.initRenderTarget(positionRenderTarget);\r\n this.copyTex3D(this.positionRenderTarget.texture, positionRenderTarget, this.numTextures);\r\n this.positionRenderTarget.dispose();\r\n this.positionRenderTarget = positionRenderTarget;\r\n this.material.uniforms.positionTexture.value = this.positionRenderTarget.texture;\r\n\r\n\r\n const cov1RenderTarget = new WebGL3DRenderTarget(this.textureSize, this.textureSize, newNumTextures, {\r\n magFilter: NearestFilter,\r\n minFilter: NearestFilter,\r\n anisotropy: 0,\r\n type: FloatType,\r\n depthBuffer: false,\r\n resolveDepthBuffer: false,\r\n })\r\n cov1RenderTarget.texture.type = FloatType;\r\n this.renderer.initRenderTarget(cov1RenderTarget);\r\n this.copyTex3D(this.cov1RenderTarget.texture, cov1RenderTarget, this.numTextures);\r\n this.cov1RenderTarget.dispose();\r\n this.cov1RenderTarget = cov1RenderTarget;\r\n this.material.uniforms.cov1Texture.value = this.cov1RenderTarget.texture;\r\n\r\n const cov2RenderTarget = new WebGL3DRenderTarget(this.textureSize, this.textureSize, newNumTextures, {\r\n magFilter: NearestFilter,\r\n minFilter: NearestFilter,\r\n anisotropy: 0,\r\n type: FloatType,\r\n depthBuffer: false,\r\n resolveDepthBuffer: false,\r\n })\r\n cov2RenderTarget.texture.type = FloatType;\r\n this.renderer.initRenderTarget(cov2RenderTarget);\r\n this.copyTex3D(this.cov2RenderTarget.texture, cov2RenderTarget, this.numTextures);\r\n this.cov2RenderTarget.dispose();\r\n this.cov2RenderTarget = cov2RenderTarget;\r\n this.material.uniforms.cov2Texture.value = this.cov2RenderTarget.texture;\r\n\r\n\r\n this.numTextures = newNumTextures;\r\n this.material.uniforms.numSlices.value = this.numTextures;\r\n\r\n //console.log(\"grow \" + (performance.now() - start) + \" ms\")\r\n }\r\n\r\n} export { SplatsMesh }\r\n\r\nfunction saveBuffer(pixelBuffer) {\r\n const canvas = document.createElement('canvas');\r\n const width = 512;\r\n const height = 512;\r\n canvas.width = width;\r\n canvas.height = height;\r\n const context = canvas.getContext('2d');\r\n const imageData = context.createImageData(width, height);\r\n\r\n // WebGL's coordinate system is bottom-left, so we need to flip the image vertically\r\n for (let y = 0; y < height; y++) {\r\n for (let x = 0; x < width; x++) {\r\n const srcIndex = (y * width + x) * 4;\r\n const destIndex = ((height - y - 1) * width + x) * 4;\r\n imageData.data[destIndex] = pixelBuffer[srcIndex]; // R\r\n imageData.data[destIndex + 1] = pixelBuffer[srcIndex + 1]; // G\r\n imageData.data[destIndex + 2] = pixelBuffer[srcIndex + 2]; // B\r\n imageData.data[destIndex + 3] = pixelBuffer[srcIndex + 3]; // A\r\n }\r\n }\r\n context.putImageData(imageData, 0, 0);\r\n\r\n // 6. Convert the canvas to a PNG and trigger download\r\n canvas.toBlob((blob) => {\r\n const url = URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = `layer_.png`;\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n URL.revokeObjectURL(url);\r\n }, 'image/png');\r\n}\r\nexport function splatsVertexShader() {\r\n return `\r\nprecision highp float;\r\nprecision highp int;\r\n\r\n#include <common>\r\n#include <packing>\r\n\r\nuniform float textureSize;\r\nuniform float numSlices;\r\nuniform float sizeMultiplier;\r\nin uint order;\r\nout vec4 color;\r\nout vec2 vUv;\r\nout vec3 splatPositionWorld;\r\nout float splatDepth;\r\n//out float orthographicDepth;\r\nout float splatCrop;\r\nuniform sampler3D colorTexture;\r\nuniform sampler3D positionTexture;\r\nuniform sampler3D cov1Texture;\r\nuniform sampler3D cov2Texture;\r\nuniform mat3 zUpToYUpMatrix3x3;\r\nuniform float logDepthBufFC;\r\n//uniform float cameraNear;\r\n//uniform float cameraFar;\r\n//uniform bool computeLinearDepth;\r\n\r\n\r\nvoid getVertexData(out vec3 position, out mat3 covariance) {\r\n float index = float(order)+0.1; // add small offset to avoid floating point errors with modulo\r\n float pixelsPerSlice = textureSize * textureSize;\r\n float sliceIndex = floor(index / pixelsPerSlice);\r\n float slicePixelIndex = mod(index,pixelsPerSlice);\r\n\r\n float x = mod(slicePixelIndex,textureSize);\r\n float y = floor(slicePixelIndex / textureSize);\r\n\r\n vec3 uvw = vec3((x + 0.5) / textureSize, (y + 0.5) / textureSize, (sliceIndex + 0.5) / numSlices);\r\n\r\n // Position\r\n position = texture(positionTexture, uvw).xyz;\r\n \r\n \r\n \r\n \r\n vec4 cov1 = texture(cov1Texture, uvw);\r\n vec4 cov2 = texture(cov2Texture, uvw);\r\n\r\n covariance[0][0] = cov1.x;\r\n covariance[1][0] = cov1.y;\r\n covariance[0][1] = cov1.y;\r\n covariance[2][0] = cov1.z;\r\n covariance[0][2] = cov1.z;\r\n\r\n covariance[1][1] = cov2.x;\r\n covariance[2][1] = cov2.y;\r\n covariance[1][2] = cov2.y;\r\n covariance[2][2] = cov2.z;\r\n\r\n \r\n \r\n\r\n //covariance *= 4.0;\r\n mat3 modelRotation = zUpToYUpMatrix3x3*transpose(mat3(modelMatrix));\r\n covariance = transpose(zUpToYUpMatrix3x3) * covariance * zUpToYUpMatrix3x3;\r\n covariance = transpose(modelRotation) * covariance * (modelRotation);\r\n\r\n // Color\r\n color = texture(colorTexture, uvw);\r\n // color = vec4(uvw.z, 0.0,0.0,1.0);\r\n}\r\n\r\nvoid modelTransform(in vec3 splatPosition, in mat3 covariance, inout vec3 vertexPosition){\r\n vec3 upReference = vec3(0.0, 1.0, 0.0);\r\n vec3 look = normalize(cameraPosition - splatPosition);\r\n vec3 right = normalize(cross(upReference, look));\r\n\r\n float rightLength = length(cross(upReference, look));\r\n if (rightLength < 1e-6) { // Check if vectors are parallel\r\n upReference = vec3(1.0, 0.0, 0.0); // Choose an alternative up vector\r\n right = normalize(cross(upReference, look));\r\n }\r\n\r\n vec3 up = cross(look, right);\r\n\r\n // Construct the billboard rotation matrix\r\n mat3 billboardRot = mat3(\r\n right.x, right.y, right.z,\r\n up.x, up.y, up.z,\r\n look.x, look.y, look.z);\r\n\r\n mat3 cov2D = transpose(billboardRot) * covariance * billboardRot;\r\n \r\n float a = max(cov2D[0][0],1e-6);\r\n float b = cov2D[0][1];\r\n \r\n float c = max(cov2D[1][1],1e-6);\r\n\r\n \r\n float trace = a + c;\r\n float det = a * c - b * b;\r\n \r\n\r\n float traceOver2 = 0.5 * trace;\r\n float dist = sqrt(max(traceOver2*traceOver2 - det, 0.0));\r\n //float dist = sqrt(max(0.1, traceOver2 * traceOver2 - det));\r\n\r\n float lambda1 = max(0.0, traceOver2 + dist);\r\n float lambda2 = max(0.0, traceOver2 - dist);\r\n\r\n\r\n vec2 eigenvector1;\r\n if(abs(covariance[0][1]) < 1e-7 && abs(covariance[0][2]) < 1e-7 && abs(covariance[1][2]) < 1e-7){\r\n\t\t\t\t\teigenvector1 = vec2(0,1);\r\n\t}else{\r\n\t\teigenvector1 = normalize(vec2(b, lambda1 - a));\r\n\t}\r\n vec2 eigenvector2 = vec2(-eigenvector1.y, eigenvector1.x);\r\n float l1 = sqrt(lambda1);\r\n float l2 = sqrt(lambda2);\r\n\r\n eigenvector1 *= l1*2.0;\r\n eigenvector2 *= l2*2.0;\r\n vertexPosition.xy = vertexPosition.x * eigenvector1 + vertexPosition.y * eigenvector2;\r\n vertexPosition = billboardRot * vertexPosition + splatPosition;\r\n}\r\n\r\n\r\nvoid main() {\r\n vUv = vec2(position);\r\n\r\n splatPositionWorld = vec3(0.0);\r\n mat3 covariance = mat3(0.0);\r\n getVertexData(splatPositionWorld, covariance);\r\n splatCrop = 0.5*sqrt(color.w); // discard more pixels when opacity is low\r\n splatPositionWorld = (modelMatrix * vec4(splatPositionWorld, 1.0)).xyz;\r\n \r\n\r\n vec3 outPosition = vec3(position)*sizeMultiplier;\r\n modelTransform(splatPositionWorld, covariance, outPosition);\r\n \r\n gl_Position = projectionMatrix * viewMatrix * vec4(outPosition, 1.0);\r\n /* if(computeLinearDepth){\r\n orthographicDepth = viewZToOrthographicDepth( -gl_Position.w, cameraNear, cameraFar );\r\n } */\r\n \r\n vec4 centerP = projectionMatrix * viewMatrix * vec4(splatPositionWorld, 1.0);\r\n #if defined( USE_LOGDEPTHBUF )\r\n\t float isPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\r\n splatDepth = isPerspective == 0.0 ? centerP.z : log2( 1.0 + centerP.w ) * logDepthBufFC * 0.5;\r\n #else\r\n splatDepth = (centerP.z / centerP.w)* 0.5 + 0.5;\r\n #endif\r\n\r\n \r\n}\r\n`};\r\nexport function splatsFragmentShader() {\r\n return `\r\nprecision highp float;\r\n\r\nin vec4 color;\r\nin vec2 vUv;\r\nin vec3 splatPositionWorld;\r\nin float splatDepth;\r\n//in float orthographicDepth;\r\nin float splatCrop;\r\nuniform float textureSize;\r\nuniform float cropRadius;\r\n\r\nvoid main() {\r\n if(length(splatPositionWorld)>cropRadius) discard;\r\n float l = length(vUv);\r\n \r\n // Early discard for pixels outside the radius\r\n if (l > 0.5) {\r\n discard;\r\n };\r\n vec2 p = vUv * 4.0;\r\n float alpha = exp(-dot(p, p));\r\n\r\n gl_FragColor = vec4(pow(color.xyz,vec3(1.0/2.2)), color.w * pow(alpha, 1.8)); \r\n //gl_FragColor = vec4(splatDepth,0.0,0.0,1.0); \r\n //gl_FragDepth = splatDepth;\r\n \r\n}`\r\n};\r\n\r\nfunction vertexCopyShader() {\r\n return `\r\n\r\nout vec2 vUv;\r\n\r\nvoid main() {\r\n vUv = uv;\r\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n}`\r\n};\r\n\r\nfunction fragmentCopyShader2D() {\r\n return `\r\nprecision highp float;\r\n\r\nuniform sampler2D sourceTexture;\r\n\r\nin vec2 vUv;\r\n\r\nvoid main() {\r\n gl_FragColor = texture( sourceTexture, vUv );\r\n}`\r\n};\r\n\r\n\r\nfunction fragmentCopyShader3D() {\r\n return `\r\nprecision highp float;\r\n\r\nuniform sampler3D sourceTexture;\r\nuniform float w;\r\n\r\nin vec2 vUv;\r\n\r\nvoid main() {\r\n gl_FragColor = texture( sourceTexture, vec3(vUv, w) );\r\n}`\r\n};","import * as THREE from 'three';\r\nimport { OBB } from \"../geometry/obb\";\r\nimport { TileLoader } from \"./TileLoader\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport * as path from \"path-browserify\"\r\nimport { resolveImplicite } from './implicit/ImplicitTileResolver.js';\r\nimport { SplatsMesh } from '../splats/SplatsMesh';\r\nvar averageTime = 0;\r\n\r\n\r\nvar copyrightDiv;\r\nconst tempSphere = new THREE.Sphere(new THREE.Vector3(0, 0, 0), 1);\r\nconst tempOBB = new OBB([0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1]);\r\nconst tempBox3 = new THREE.Box3();\r\nconst tempVec1 = new THREE.Vector3(0, 0, 0);\r\nconst tempVec2 = new THREE.Vector3(0, 0, 0);\r\nconst upVector = new THREE.Vector3(0, 1, 0);\r\nconst tempRay = new THREE.Ray();\r\nconst inverseWorld = new THREE.Matrix4();\r\nconst transformedProjection = new THREE.Matrix4();\r\nconst frustum = new THREE.Frustum();\r\nconst transformedCameraPosition = new THREE.Vector3();\r\nconst tempIntersects = [];\r\n\r\nconst tempQuaternion = new THREE.Quaternion();\r\nconst copyright = {};\r\n\r\n/**\r\n * @returns a list of vendors that are required by copyright to be displayed in the app.\r\n */\r\nfunction getOGC3DTilesCopyrightInfo() {\r\n var list = [];\r\n for (let key in copyright) {\r\n if (copyright.hasOwnProperty(key) && copyright[key] > 0) { // This checks if the key is actually part of the object and not its prototype.\r\n list.push(key);\r\n }\r\n }\r\n return list;\r\n\r\n}\r\n\r\n\r\n/**\r\n * class representing a tiled and multileveled mesh or point-cloud according to the OGC3DTiles 1.1 spec\r\n * @class\r\n * @extends {THREE.Object3D}\r\n */\r\nclass OGC3DTile extends THREE.Object3D {\r\n\r\n /**\r\n * @param {Object} [properties] - the properties for this tileset\r\n * @param {String} [properties.url] - the url to the parent tileset.json\r\n * @param {Object} [properties.queryParams = undefined] - optional, path params to add to individual tile urls\r\n * @param {Number} [properties.geometricErrorMultiplier = 1] - the geometric error of the parent. 1.0 by default corresponds to a maxScreenSpaceError of 16\r\n * @param {Boolean} [properties.loadOutsideView = false] - if truthy, tiles otside the camera frustum will be loaded with the least possible amount of detail\r\n * @param {TileLoader} [properties.tileLoader = undefined] - A tile loader that can be shared among tilesets in order to share a common cache.\r\n * @param {Function} [properties.meshCallback = undefined] - A callback function that will be called on every mesh\r\n * @param {Function} [properties.pointsCallback = undefined] - A callback function that will be called on every points\r\n * @param {Function} [properties.onLoadCallback = undefined] - A callback function that will be called when the root tile has been loaded\r\n * @param {OcclusionCullingService} [properties.occlusionCullingService = undefined] - A service that handles occlusion culling\r\n * @param {Boolean} [properties.centerModel = false] - If true, the tileset will be centered on 0,0,0 and in the case of georeferenced tilesets that use the \"region\" bounding volume, it will also be rotated so that the up axis matched the world y axis.\r\n * @param {Boolean} [properties.static = false] - If true, the tileset is considered static which improves performance but the matrices aren't automatically updated\r\n * @param {String} [properties.rootPath = undefined] - optional the root path for fetching children\r\n * @param {String} [properties.json = undefined] - optional json object representing the tileset sub-tree\r\n * @param {Number} [properties.parentGeometricError = undefined] - optional geometric error of the parent\r\n * @param {Object} [properties.parentBoundingVolume = undefined] - optional bounding volume of the parent\r\n * @param {String} [properties.parentRefine = undefined] - optional refine strategy of the parent of the parent\r\n * @param {THREE.Camera} [properties.cameraOnLoad = undefined] - optional the camera used when loading this particular sub-tile\r\n * @param {OGC3DTile} [properties.parentTile = undefined] - optional the OGC3DTile object that loaded this tile as a child\r\n * @param {String} [properties.proxy = undefined] - optional the url to a proxy service. Instead of fetching tiles via a GET request, a POST will be sent to the proxy url with the real tile address in the body of the request.\r\n * @param {Boolean} [properties.displayErrors = false] - optional value indicating that errors should be shown on screen.\r\n * @param {THREE.Renderer} [properties.renderer = undefined] - optional the renderer used to display the tileset. Used to infer render resolution at runtime and to instantiate a ktx2loader on the fly if not provided. \r\n * @param {Number} [properties.domWidth = undefined] - optional the canvas width (used to calculate geometric error). If a renderer is provided, it'll be used instead, else a default value is used. \r\n * @param {Number} [properties.domHeight = undefined] - optional the canvas height (used to calculate geometric error). If a renderer is provided, it'll be used instead, else a default value is used. \r\n * @param {DracoLoader} [properties.dracoLoader = undefined] - optional a draco loader (three/addons).\r\n * @param {KTX2Loader} [properties.ktx2Loader = undefined] - optional a ktx2 loader (three/addons).\r\n * @param {Number} [properties.distanceBias = 1] - optional a bias that allows loading more or less detail closer to the camera relative to far away. The value should be a positive number. A value below 1 loads less detail near the camera and a value above 1 loads more detail near the camera. This needs to be compensated by the geometricErrorMultiplier in order to load a reasonable number of tiles.\r\n * @param {String} [properties.loadingStrategy = \"INCREMENTAL\"] - optional a strategy for loading tiles \r\n * - \"INCREMENTAL\" loads intermediate LODs and will load nearer tiles first\r\n * - \"PERLEVEL\" loads intermediate LODs and loads nearer tiles first but waits for all tiles of the lowest level to be loaded before loading higher detail tiles\r\n * - \"IMMEDIATE\" skips intermediate LODs. tiles are missing until loaded when moving to a new area\r\n * @param {String} [properties.drawBoundingVolume = false] - optional draws the bounding volume (may cause flickering)\r\n * @param {String} [properties.splatsFragmentShader = undefined] - optional pass a custom fragment shader for rendering splats\r\n */\r\n constructor(properties) {\r\n super();\r\n const self = this;\r\n self.splatsMesh = properties.splatsMesh;\r\n this.contentURL = [];\r\n if (!!properties.domWidth && !!properties.domHeight) {\r\n this.rendererSize = new THREE.Vector2(properties.domWidth, properties.domHeight);\r\n } else {\r\n this.rendererSize = new THREE.Vector2(1000, 1000);\r\n }\r\n this.loadingStrategy = properties.loadingStrategy ? properties.loadingStrategy.toUpperCase() : \"INCREMENTAL\";\r\n this.distanceBias = Math.max(0.0001, properties.distanceBias ? properties.distanceBias : 1);\r\n this.proxy = properties.proxy;\r\n this.drawBoundingVolume = properties.drawBoundingVolume ? properties.drawBoundingVolume : false;\r\n this.displayErrors = properties.displayErrors;\r\n this.displayCopyright = properties.displayCopyright;\r\n if (properties.queryParams) {\r\n this.queryParams = { ...properties.queryParams };\r\n }\r\n this.uuid = uuidv4();\r\n if (!!properties.tileLoader) {\r\n this.tileLoader = properties.tileLoader;\r\n } else {\r\n const tileLoaderOptions = {};\r\n tileLoaderOptions.meshCallback = !properties.meshCallback ? (mesh, geometricError) => {\r\n mesh.material.wireframe = false;\r\n mesh.material.side = THREE.DoubleSide;\r\n } : properties.meshCallback;\r\n tileLoaderOptions.pointsCallback = !properties.pointsCallback ? (points, geometricError) => {\r\n points.material.size = Math.pow(geometricError, 0.33);\r\n points.material.sizeAttenuation = true;\r\n } : properties.pointsCallback;\r\n tileLoaderOptions.proxy = this.proxy;\r\n tileLoaderOptions.renderer = properties.renderer;\r\n tileLoaderOptions.dracoLoader = properties.dracoLoader;\r\n tileLoaderOptions.ktx2Loader = properties.ktx2Loader;\r\n this.tileLoader = new TileLoader(tileLoaderOptions);\r\n this.update = (camera) => {\r\n this.update(camera);\r\n this.tileLoader.update();\r\n }\r\n }\r\n this.displayCopyright = !!properties.displayCopyright;\r\n // set properties general to the entire tileset\r\n this.geometricErrorMultiplier = !!properties.geometricErrorMultiplier ? properties.geometricErrorMultiplier : 1.0;\r\n this.splatsCropRadius = Number.MAX_VALUE;\r\n this.splatsSizeMultiplier = 1;\r\n\r\n this.renderer = properties.renderer;\r\n this.meshCallback = properties.meshCallback;\r\n this.loadOutsideView = properties.loadOutsideView;\r\n this.cameraOnLoad = properties.cameraOnLoad;\r\n this.parentTile = properties.parentTile;\r\n this.occlusionCullingService = properties.occlusionCullingService;\r\n this.static = properties.static;\r\n if (this.occlusionCullingService) {\r\n this.color = new THREE.Color();\r\n this.color.setHex(Math.random() * 0xffffff);\r\n this.colorID = THREE.MathUtils.clamp(self.color.r * 255, 0, 255) << 16 ^ THREE.MathUtils.clamp(self.color.g * 255, 0, 255) << 8 ^ THREE.MathUtils.clamp(self.color.b * 255, 0, 255) << 0;\r\n }\r\n if (this.static) {\r\n this.matrixAutoUpdate = false;\r\n this.matrixWorldAutoUpdate = false;\r\n }\r\n\r\n // declare properties specific to the tile for clarity\r\n this.childrenTiles = [];\r\n this.meshContent = [];\r\n this.tileContent;\r\n this.refine; // defaults to \"REPLACE\"\r\n this.rootPath;\r\n this.geometricError;\r\n this.boundingVolume;\r\n this.json; // the json corresponding to this tile\r\n this.materialVisibility = false;\r\n this.level = properties.level ? properties.level : 0;\r\n this.hasMeshContent = 0; // true when the provided json has a content field pointing to a B3DM file\r\n this.hasUnloadedJSONContent = 0; // true when the provided json has a content field pointing to a JSON file that is not yet loaded\r\n this.centerModel = properties.centerModel;\r\n this.abortController = new AbortController();\r\n\r\n this.onLoadCallback = properties.onLoadCallback;\r\n //this.layers.disable(0);\r\n //this.octree = new Octree();\r\n\r\n if (!!properties.json) { // If this tile is created as a child of another tile, properties.json is not null\r\n\r\n self._setup(properties);\r\n\r\n\r\n } else if (properties.url) { // If only the url to the tileset.json is provided\r\n var url = properties.url;\r\n if (self.queryParams) {\r\n var props = \"\";\r\n for (let key in self.queryParams) {\r\n if (self.queryParams.hasOwnProperty(key)) {\r\n props += \"&\" + key + \"=\" + self.queryParams[key];\r\n }\r\n }\r\n if (url.includes(\"?\")) {\r\n url += props;\r\n } else {\r\n url += \"?\" + props.substring(1);\r\n }\r\n }\r\n\r\n\r\n var fetchFunction;\r\n if (self.proxy) {\r\n fetchFunction = () => {\r\n return fetch(self.proxy,\r\n {\r\n method: 'POST',\r\n body: url,\r\n signal: self.abortController.signal\r\n }\r\n );\r\n }\r\n } else {\r\n fetchFunction = () => {\r\n return fetch(url, { signal: self.abortController.signal });\r\n }\r\n }\r\n fetchFunction().then(result => {\r\n if (!result.ok) {\r\n throw new Error(`couldn't load \"${properties.url}\". Request failed with status ${result.status} : ${result.statusText}`);\r\n }\r\n result.json().then(json => { return resolveImplicite(json, url) }).then(json => {\r\n self._setup({ rootPath: path.dirname(properties.url), json: json });\r\n });\r\n }).catch(e => { if (self.displayErrors) _showError(e) });\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Specify a size multiplier for splats\r\n * @param {number} sizeMultiplier \r\n */\r\n setSplatsSizeMultiplier(sizeMultiplier) {\r\n this.splatsSizeMultiplier = sizeMultiplier;\r\n if (this.splatsMesh) {\r\n this.splatsMesh.setSplatsSizeMultiplier(this.splatsSizeMultiplier)\r\n }\r\n }\r\n /**\r\n * specify a crop radius for splats\r\n * @param {number} cropRadius \r\n */\r\n setSplatsCropRadius(cropRadius) {\r\n this.splatsCropRadius = cropRadius;\r\n if (this.splatsMesh) {\r\n this.splatsMesh.setSplatsCropRadius(this.splatsCropRadius)\r\n }\r\n }\r\n\r\n /**\r\n * Manually updates all the matrices of the tileset. \r\n * To be called after transforming a {@link OGC3DTile tileset} instantiated with the \"static\" option\r\n */\r\n updateMatrices() {\r\n this.updateMatrix();\r\n if (this.static) {\r\n this.traverse(o => {\r\n if (o.isObject3D) {\r\n o.matrixWorldAutoUpdate = true;\r\n }\r\n });\r\n }\r\n this.updateMatrixWorld(true);\r\n if (this.static) {\r\n this.traverse(o => {\r\n if (o.isObject3D) o.matrixWorldAutoUpdate = false;\r\n });\r\n }\r\n }\r\n /**\r\n * Call this to specify the canvas width/height when it changes (used to compute tiles geometric error that controls tile refinement).\r\n * It's unnecessary to call this when the {@link OGC3DTile} is instantiated with the renderer.\r\n * \r\n * @param {Number} width \r\n * @param {Number} height \r\n */\r\n setCanvasSize(width, height) {\r\n this.rendererSize.set(width, height);\r\n }\r\n\r\n async _setup(properties) {\r\n const self = this;\r\n\r\n if (properties.json.extensionsRequired) {\r\n if (properties.json.extensionsRequired.includes(\"JDULTRA_gaussian_splats\")) {\r\n self.splatsMesh = new SplatsMesh(self.tileLoader.renderer)\r\n this.splatsMesh.setSplatsCropRadius(this.splatsCropRadius)\r\n this.splatsMesh.setSplatsSizeMultiplier(this.splatsSizeMultiplier)\r\n self.add(self.splatsMesh);\r\n }\r\n }\r\n if (!!properties.json.root) {\r\n self.json = properties.json.root;\r\n if (!self.json.refine) self.json.refine = properties.json.refine;\r\n if (!self.json.geometricError) self.json.geometricError = properties.json.geometricError;\r\n if (!self.json.transform) self.json.transform = properties.json.transform;\r\n if (!self.json.boundingVolume) self.json.boundingVolume = properties.json.boundingVolume;\r\n } else {\r\n self.json = properties.json;\r\n }\r\n\r\n\r\n if (!self.json.children) {\r\n if (self.json.getChildren) {\r\n self.json.children = await self.json.getChildren();\r\n } else {\r\n self.json.children = [];\r\n }\r\n }\r\n self.rootPath = !!properties.json.rootPath ? properties.json.rootPath : properties.rootPath;\r\n\r\n // decode refine\r\n if (!!self.json.refine) {\r\n self.refine = self.json.refine;\r\n } else {\r\n self.refine = properties.parentRefine;\r\n }\r\n // decode geometric error\r\n if (!!self.json.geometricError) {\r\n self.geometricError = self.json.geometricError;\r\n } else {\r\n self.geometricError = properties.parentGeometricError;\r\n }\r\n\r\n\r\n // decode transform\r\n if (!!self.json.transform) {\r\n let mat = new THREE.Matrix4();\r\n mat.elements = self.json.transform;\r\n self.applyMatrix4(mat);\r\n\r\n }\r\n\r\n /* self.matrixWorldNeedsUpdate = true;\r\n //self.updateMatrix();\r\n if (self.parentTile) {\r\n self.parentTile.updateMatrixWorld(true);\r\n //self.parentTile.updateWorldMatrix(true, true);\r\n } */\r\n\r\n // decode volume\r\n if (!!self.json.boundingVolume) {\r\n if (!!self.json.boundingVolume.box) {\r\n self.boundingVolume = new OBB(self.json.boundingVolume.box);\r\n } else if (!!self.json.boundingVolume.region) {\r\n const region = self.json.boundingVolume.region;\r\n self._transformWGS84ToCartesian(region[0], region[1], region[4], tempVec1);\r\n self._transformWGS84ToCartesian(region[2], region[3], region[5], tempVec2);\r\n tempVec1.lerp(tempVec2, 0.5);\r\n self.boundingVolume = new THREE.Sphere(new THREE.Vector3(tempVec1.x, tempVec1.y, tempVec1.z), tempVec1.distanceTo(tempVec2));\r\n } else if (!!self.json.boundingVolume.sphere) {\r\n const sphere = self.json.boundingVolume.sphere;\r\n self.boundingVolume = new THREE.Sphere(new THREE.Vector3(sphere[0], sphere[1], sphere[2]), sphere[3]);\r\n } else {\r\n self.boundingVolume = properties.parentBoundingVolume;\r\n }\r\n } else {\r\n self.boundingVolume = properties.parentBoundingVolume;\r\n }\r\n\r\n\r\n\r\n\r\n\r\n function _checkContent(e) {\r\n if (!!e.uri && e.uri.includes(\"json\")) {\r\n self.hasUnloadedJSONContent++;\r\n } else if (!!e.url && e.url.includes(\"json\")) {\r\n self.hasUnloadedJSONContent++;\r\n } else {\r\n self.hasMeshContent++;\r\n }\r\n }\r\n\r\n if (!!self.json.content) { //if there is a content, json or otherwise, schedule it to be loaded \r\n _checkContent(self.json.content);\r\n if (self.hasMeshContent == 0) {\r\n self.level = Math.max(0, self.parentTile ? self.parentTile.level + 0.01 : 0.0);\r\n }\r\n switch (self.loadingStrategy) {\r\n case \"IMMEDIATE\": self._load(true, false); break;\r\n default: self._load();\r\n }\r\n\r\n } else if (!!self.json.contents) { //if there is a content, json or otherwise, schedule it to be loaded \r\n self.json.contents.forEach(e => _checkContent(e))\r\n if (self.hasMeshContent == 0) {\r\n self.level = Math.max(0, self.parentTile ? self.parentTile.level + 0.01 : 0.0);\r\n }\r\n switch (self.loadingStrategy) {\r\n case \"IMMEDIATE\": self._load(true, false); break;\r\n default: self._load();\r\n }\r\n //scheduleLoadTile(this);\r\n }\r\n\r\n\r\n if (!!self.centerModel) {\r\n tempVec2.copy(self.boundingVolume.center);\r\n\r\n //tempSphere.applyMatrix4(self.matrixWorld);\r\n if (!!this.json.boundingVolume.region) {\r\n this._transformWGS84ToCartesian(\r\n (this.json.boundingVolume.region[0] + this.json.boundingVolume.region[2]) * 0.5,\r\n (this.json.boundingVolume.region[1] + this.json.boundingVolume.region[3]) * 0.5,\r\n (this.json.boundingVolume.region[4] + this.json.boundingVolume.region[5]) * 0.5,\r\n tempVec1);\r\n\r\n tempQuaternion.setFromUnitVectors(tempVec1.normalize(), upVector.normalize());\r\n self.applyQuaternion(tempQuaternion);\r\n }\r\n tempVec2.applyMatrix4(self.matrix);\r\n self.position.sub(tempVec2);\r\n\r\n self.updateMatrices();\r\n //self.updateMatrixWorld(true);\r\n }\r\n if (properties.onLoadCallback) self.onLoadCallback(self);\r\n self.isSetup = true;\r\n\r\n\r\n if (self.level > 0 && self.drawBoundingVolume) {\r\n if (self.bbox) {\r\n console.log(\"double setup\")\r\n }\r\n if (this.boundingVolume.aabb) {\r\n let box = this.boundingVolume.aabb.clone();\r\n box.applyMatrix4(this.matrixWorld);\r\n self.bbox = new THREE.Box3Helper(box, new THREE.Color(Math.random(), Math.random(), Math.random()));\r\n //self.bbox.renderOrder = -1;\r\n self.add(self.bbox);\r\n self.bbox.material.visible = false;\r\n }else if(self.boundingVolume instanceof OBB){\r\n self.bbox = self.boundingVolume.helper();\r\n self.add(self.bbox);\r\n self.bbox.material.visible = false;\r\n }\r\n }\r\n\r\n }\r\n _assembleURL(root, relative) {\r\n // Append a slash to the root URL if it doesn't already have one\r\n if (!root.endsWith('/')) {\r\n root += '/';\r\n }\r\n\r\n const rootUrl = new URL(root);\r\n let rootParts = rootUrl.pathname.split('/').filter(p => p !== '');\r\n let relativeParts = relative.split('/').filter(p => p !== '');\r\n\r\n for (let i = 1; i <= rootParts.length; i++) {\r\n if (i >= relativeParts.length) break;\r\n const rootToken = rootParts.slice(rootParts.length - i, rootParts.length).join('/');\r\n const relativeToken = relativeParts.slice(0, i).join('/');\r\n if (rootToken === relativeToken) {\r\n for (let j = 0; j < i; j++) {\r\n rootParts.pop();\r\n }\r\n break;\r\n }\r\n }\r\n\r\n\r\n while (relativeParts.length > 0 && relativeParts[0] === '..') {\r\n rootParts.pop();\r\n relativeParts.shift();\r\n }\r\n\r\n return `${rootUrl.protocol}//${rootUrl.host}/${[...rootParts, ...relativeParts].join('/')}`;\r\n }\r\n\r\n _extractQueryParams(url, params) {\r\n const urlObj = new URL(url);\r\n\r\n // Iterate over all the search parameters\r\n for (let [key, value] of urlObj.searchParams) {\r\n params[key] = value;\r\n }\r\n\r\n // Remove the query string\r\n urlObj.search = '';\r\n return urlObj.toString();\r\n }\r\n async _load(loadJson = true, loadMesh = true) {\r\n var self = this;\r\n if (self.deleted) return;\r\n if (!!self.json.content) {\r\n await loadContent(self.json.content, null, loadJson, loadMesh);\r\n } else if (!!self.json.contents) {\r\n let promises = self.json.contents.map((content, index) => loadContent(content, index, loadJson, loadMesh));\r\n\r\n Promise.all(promises)\r\n //self.json.contents.forEach(content=> loadContent(content, i))\r\n }\r\n\r\n async function loadContent(content, contentIndex, loadJson, loadMesh) {\r\n let url;\r\n if (!!content.uri) {\r\n url = content.uri;\r\n } else if (!!content.url) {\r\n url = content.url;\r\n }\r\n const urlRegex = /^(?:http|https|ftp|tcp|udp):\\/\\/\\S+/;\r\n\r\n if (urlRegex.test(self.rootPath)) { // url\r\n\r\n if (!urlRegex.test(url)) {\r\n url = self._assembleURL(self.rootPath, url);\r\n }\r\n } else { //path\r\n if (path.isAbsolute(self.rootPath)) {\r\n url = self.rootPath + path.sep + url;\r\n }\r\n }\r\n url = self._extractQueryParams(url, self.queryParams);\r\n if (self.queryParams) {\r\n var props = \"\";\r\n for (let key in self.queryParams) {\r\n if (self.queryParams.hasOwnProperty(key)) { // This check is necessary to skip properties from the object's prototype chain\r\n props += \"&\" + key + \"=\" + self.queryParams[key];\r\n }\r\n }\r\n if (url.includes(\"?\")) {\r\n url += props;\r\n } else {\r\n url += \"?\" + props.substring(1);\r\n }\r\n }\r\n\r\n if (!!url) {\r\n if (loadMesh && (url.includes(\".b3dm\") || url.includes(\".glb\") || url.includes(\".gltf\"))) {\r\n self.contentURL.push(url);\r\n try {\r\n\r\n self.tileLoader.get(self.abortController, self.uuid, url, mesh => {\r\n\r\n if (!!self.deleted) {\r\n return;\r\n }\r\n if (mesh.asset && mesh.asset.copyright) {\r\n mesh.asset.copyright.split(';').forEach(s => {\r\n if (!!copyright[s]) {\r\n copyright[s]++;\r\n } else {\r\n copyright[s] = 1;\r\n }\r\n });\r\n if (self.displayCopyright) {\r\n _updateCopyrightLabel();\r\n }\r\n }\r\n\r\n self.meshContent.push(mesh);\r\n if (!self.splatsMesh) {\r\n mesh.traverse((o) => {\r\n if (o.isMesh || o.isPoints) {\r\n o.layers.disable(0);\r\n\r\n //if(o.material.transparent) o.layers.enable(31);\r\n }\r\n if (o.isMesh) {\r\n\r\n if (self.occlusionCullingService) {\r\n const position = o.geometry.attributes.position;\r\n const colors = [];\r\n for (let i = 0; i < position.count; i++) {\r\n colors.push(self.color.r, self.color.g, self.color.b);\r\n }\r\n o.geometry.setAttribute('color', new THREE.Float32BufferAttribute(colors, 3));\r\n }\r\n\r\n //o.material.visible = false;\r\n }\r\n });\r\n self.add(mesh);\r\n self.updateMatrices();\r\n }\r\n\r\n\r\n }, !self.cameraOnLoad ? () => 0 : () => {\r\n if(self.loadingStrategy == \"IMMEDIATE\"){\r\n return self._calculateDistanceToCamera(self.cameraOnLoad);\r\n }\r\n if(self.loadingStrategy == \"INTERMEDIATE\"){\r\n if (self.parentTile) {\r\n return self.parentTile._calculateDistanceToCamera(self.cameraOnLoad)/self.level;\r\n } else {\r\n return self._calculateDistanceToCamera(self.cameraOnLoad)/self.level;\r\n }\r\n }\r\n if(self.loadingStrategy == \"PERLEVEL\"){\r\n if (self.parentTile) {\r\n return self.level +self.parentTile._calculateDistanceToCamera(self.cameraOnLoad);\r\n } else {\r\n return self.level +self._calculateDistanceToCamera(self.cameraOnLoad);\r\n }\r\n }\r\n \r\n /* let multiplier = 1;\r\n if ((self.metric && self.metric < 0) || self.deleted) multiplier = 2;\r\n if (self.parentTile) {\r\n return self.parentTile._calculateDistanceToCamera(self.cameraOnLoad) * multiplier * self.level;\r\n } else {\r\n return self._calculateDistanceToCamera(self.cameraOnLoad) * multiplier * self.level;\r\n } */\r\n }, () => self._getSiblings(),\r\n self.level,\r\n self.loadingStrategy,\r\n !!self.json.boundingVolume.region ? false : true,\r\n !!self.json.boundingVolume.region,\r\n self.geometricError,\r\n self.splatsMesh\r\n );\r\n } catch (e) {\r\n if (self.displayErrors) _showError(e)\r\n }\r\n\r\n\r\n } else if (loadJson && url.includes(\".json\")) {\r\n self.jsonRequested = url;\r\n self.tileLoader.get(self.abortController, self.uuid, url, async json => {\r\n if (!!self.deleted) return;\r\n\r\n json.rootPath = path.dirname(url);\r\n self.json.children.push(json);\r\n if (contentIndex == null) {\r\n delete self.json.content;\r\n } else {\r\n delete self.json.contents.splice(contentIndex, 1);\r\n }\r\n\r\n self.hasUnloadedJSONContent--;\r\n /* self.matrixWorldNeedsUpdate = true;\r\n self.updateMatrix();\r\n if (self.parentTile) {\r\n self.parentTile.updateMatrixWorld(true);\r\n //self.parentTile.updateWorldMatrix(true, true);\r\n } */\r\n });\r\n\r\n }\r\n\r\n\r\n /* self.matrixWorldNeedsUpdate = true;\r\n self.updateMatrix();\r\n if (self.parentTile) {\r\n self.parentTile.updateMatrixWorld(true);\r\n //self.parentTile.updateWorldMatrix(true, true);\r\n } */\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Disposes of all the resources used by the tileset.\r\n */\r\n dispose() {\r\n\r\n const self = this;\r\n\r\n\r\n self.meshContent.forEach(mc => {\r\n if (!!mc && !!mc.asset && mc.asset.copyright) {\r\n mc.asset.copyright.split(';').forEach(s => {\r\n if (!!copyright[s]) {\r\n copyright[s]--;\r\n }\r\n });\r\n if (self.displayCopyright) {\r\n _updateCopyrightLabel();\r\n }\r\n }\r\n })\r\n self.meshContent = [];\r\n if (self.bbox) self.bbox.dispose();\r\n\r\n\r\n self.childrenTiles.forEach(tile => tile.dispose());\r\n self.deleted = true;\r\n\r\n if (self.splatsMesh) {\r\n \r\n self.meshContent.forEach(splat => splat.hide());\r\n if (!self.parentTile) {\r\n self.splatsMesh.dispose();\r\n }\r\n }\r\n if (!!self.contentURL) {\r\n self.contentURL.forEach(url => {\r\n self.tileLoader.invalidate(url, self.uuid);\r\n })\r\n self.contentURL = [];\r\n }\r\n\r\n if (!!self.abortController) { // abort tile request\r\n self.abortController.abort(\"tile not needed\");\r\n }\r\n this.parent = null;\r\n //this.parentTile = null;\r\n this.dispatchEvent({ type: 'removed' });\r\n }\r\n _disposeMeshContent() {\r\n const self = this;\r\n if (!!self.deleted) return;\r\n self.deleted = true;\r\n if (!!self.abortController) { // abort tile request\r\n self.abortController.abort(\"tile not needed\");\r\n self.abortController = new AbortController();\r\n }\r\n for (let i = self.meshContent.length - 1; i >= 0; i--) {\r\n const mc = self.meshContent[i];\r\n if (!!mc && !!mc.asset && mc.asset.copyright) {\r\n mc.asset.copyright.split(';').forEach(s => {\r\n if (!!copyright[s]) {\r\n copyright[s]--;\r\n }\r\n });\r\n if (self.displayCopyright) {\r\n _updateCopyrightLabel();\r\n }\r\n }\r\n\r\n self.remove(mc);\r\n }\r\n if (self.splatsMesh) {\r\n self.meshContent.forEach(splat => splat.hide());\r\n }\r\n self.meshContent = [];\r\n self.contentURL.forEach(url => {\r\n //console.log(url)\r\n self.tileLoader.invalidate(url, self.uuid);\r\n })\r\n self.contentURL = [];\r\n\r\n }\r\n _disposeChildren() {\r\n var self = this;\r\n\r\n self.childrenTiles.forEach(tile => {\r\n tile.dispose();\r\n self.remove(tile)\r\n });\r\n self.childrenTiles = [];\r\n /* self.children = [];\r\n if (self.meshContent.length > 0) {\r\n self.meshContent.forEach(mc => {\r\n self.children.push(mc);\r\n });\r\n } */\r\n }\r\n\r\n raycast(raycaster, intersects) {\r\n //console.log(\"raycast\")\r\n if (!this.splatsMesh) {\r\n return super.raycast(raycaster, intersects);\r\n } else {\r\n tempRay.copy(raycaster.ray);\r\n inverseWorld.copy(this.matrixWorld).invert();\r\n tempRay.applyMatrix4(inverseWorld);\r\n let intersection = false;\r\n if (this.boundingVolume instanceof OBB) {\r\n intersection = this.boundingVolume.intersectsRay(tempRay);\r\n } else if (this.boundingVolume instanceof THREE.Sphere) {\r\n //sphere\r\n intersection = ray.intersectsSphere(this.boundingVolume);\r\n } else {\r\n return false;\r\n\r\n }\r\n if (intersection && this.materialVisibility && this.splatsReady) {\r\n tempIntersects.length = 0;\r\n this.meshContent.forEach(mc => {\r\n if (mc.isSplatsBatch) {\r\n mc.raycast(tempRay, tempIntersects, raycaster.params.Points.threshold);\r\n tempIntersects.forEach(t => {\r\n t.point.applyMatrix4(this.matrixWorld);\r\n }),\r\n intersects.push(...tempIntersects);\r\n }\r\n })\r\n }\r\n\r\n return intersection;\r\n }\r\n }\r\n\r\n /**\r\n * To be called in the render loop.\r\n * @param {THREE.Camera} camera a camera that the tileset will be rendered with.\r\n * @returns {{numTilesLoaded: number, numTilesRendered: number, maxLOD: number, percentageLoaded: number}} An object containing describing the current state of the loaded tileset.\r\n */\r\n update(camera) {\r\n const frustum = new THREE.Frustum();\r\n frustum.setFromProjectionMatrix(new THREE.Matrix4().multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse));\r\n\r\n\r\n\r\n let numTiles = [0];\r\n let numTilesRendered = [0];\r\n let maxLOD = [0];\r\n let percentageLoaded = [0];\r\n if (this.refine == \"REPLACE\") {\r\n switch (this.loadingStrategy) {\r\n case \"IMMEDIATE\": this._updateImmediate(camera, frustum); this._statsImmediate(maxLOD, numTiles, percentageLoaded, numTilesRendered); break;\r\n default: this._update(camera, frustum); this._stats(maxLOD, numTiles, percentageLoaded, numTilesRendered);\r\n }\r\n } else {\r\n this._update(camera, frustum);\r\n this._stats(maxLOD, numTiles, percentageLoaded, numTilesRendered);\r\n }\r\n\r\n if (numTiles > 0) {\r\n percentageLoaded[0] /= numTiles[0];\r\n }\r\n\r\n //// sort ////\r\n if (this.splatsMesh) {\r\n transformedCameraPosition.copy(camera.position);\r\n inverseWorld.copy(this.matrixWorld).invert();\r\n transformedCameraPosition.applyMatrix4(inverseWorld);\r\n\r\n this.splatsMesh.sort(transformedCameraPosition);\r\n }\r\n\r\n return { numTilesLoaded: numTiles[0], numTilesRendered: numTilesRendered[0], maxLOD: maxLOD[0], percentageLoaded: percentageLoaded[0] }\r\n }\r\n\r\n _updateImmediate(camera, frustum) {\r\n this._computeMetricRecursive(camera, frustum);\r\n this._updateNodeVisibilityImmediate();\r\n this._expandTreeImmediate(camera);\r\n this.shouldBeVisible = this.metric > 0 ? true : !!this.loadOutsideView;\r\n this._shouldBeVisibleUpdateImmediate();\r\n this._trimTreeImmediate();\r\n this._loadMeshImmediate();\r\n\r\n\r\n }\r\n\r\n\r\n _statsImmediate(maxLOD, numTiles, percentageLoaded, numTilesRendered) {\r\n maxLOD[0] = Math.max(maxLOD[0], this.level);\r\n if (this.shouldBeVisible || !!this.materialVisibility) {\r\n numTiles[0]++;\r\n if (!!this.materialVisibility) percentageLoaded[0]++;\r\n }\r\n if (!!this.materialVisibility) numTilesRendered[0]++;\r\n\r\n\r\n this.childrenTiles.forEach(child => {\r\n child._statsImmediate(maxLOD, numTiles, percentageLoaded, numTilesRendered);\r\n })\r\n }\r\n _stats(maxLOD, numTiles, percentageLoaded, numTilesRendered) {\r\n maxLOD[0] = Math.max(maxLOD[0], this.level);\r\n if (this.hasMeshContent) {\r\n numTiles[0]++;\r\n if (this.meshContent.length == this.hasMeshContent) percentageLoaded[0]++;\r\n if (!!this.materialVisibility) numTilesRendered[0]++;\r\n }\r\n\r\n\r\n this.childrenTiles.forEach(child => {\r\n child._stats(maxLOD, numTiles, percentageLoaded, numTilesRendered);\r\n })\r\n }\r\n\r\n\r\n\r\n _trimTreeImmediate() {\r\n if (this.metric == undefined) return;\r\n\r\n else if (this.hasMeshContent && ((this.shouldBeVisible && this.materialVisibility))) {\r\n if (self.splatsMesh && !self.splatsReady) {\r\n return;\r\n }\r\n this._disposeChildren();\r\n } else {\r\n this.childrenTiles.forEach(child => {\r\n child._trimTreeImmediate();\r\n })\r\n }\r\n\r\n }\r\n _updateNodeVisibilityImmediate(parentDisplaysMesh = false) {\r\n //updateNodeVisibilityCount++;\r\n\r\n const self = this;\r\n if (!self.hasMeshContent) {\r\n self.childrenTiles.forEach(child => {\r\n child._updateNodeVisibilityImmediate(parentDisplaysMesh);\r\n })\r\n return;\r\n }\r\n\r\n if (self.shouldBeVisible) {\r\n if (self.meshContent.length == self.hasMeshContent) {\r\n if (!self.materialVisibility) {\r\n self._changeContentVisibility(true);\r\n self.childrenTiles.forEach(child => {\r\n child._updateNodeVisibilityImmediate(parentDisplaysMesh);\r\n })\r\n } else {\r\n self.childrenTiles.forEach(child => {\r\n child._updateNodeVisibilityImmediate(true);\r\n })\r\n }\r\n\r\n } else {\r\n self.childrenTiles.forEach(child => {\r\n child._updateNodeVisibilityImmediate(parentDisplaysMesh);\r\n })\r\n }\r\n } else {\r\n if (!self.loadOutsideView && self.metric < 0) {\r\n self._changeContentVisibility(false);\r\n if (self.meshContent.length > 0) self._disposeMeshContent();\r\n self.childrenTiles.forEach(child => {\r\n child._updateNodeVisibilityImmediate(true);\r\n })\r\n return;\r\n }\r\n\r\n if (self.materialVisibility && (!self.splatsMesh || self.splatsReady)) {\r\n\r\n if (parentDisplaysMesh) {\r\n self._changeContentVisibility(false);\r\n if (self.meshContent.length > 0) self._disposeMeshContent();\r\n self.childrenTiles.forEach(child => {\r\n child._updateNodeVisibilityImmediate(parentDisplaysMesh);\r\n })\r\n } else {\r\n let allChildrenReady = true;\r\n self.childrenTiles.every(child => {\r\n\r\n if (!child._isReadyImmediate()) {\r\n allChildrenReady = false;\r\n return false;\r\n }\r\n return true;\r\n });\r\n if (allChildrenReady && self.childrenTiles.length > 0) {\r\n self._changeContentVisibility(false);\r\n if (self.meshContent.length > 0) self._disposeMeshContent();\r\n self.childrenTiles.forEach(child => {\r\n child._updateNodeVisibilityImmediate(parentDisplaysMesh);\r\n })\r\n } else {\r\n\r\n self.childrenTiles.forEach(child => {\r\n child._updateNodeVisibilityImmediate((!self.splatsMesh || self.splatsReady));\r\n })\r\n }\r\n }\r\n\r\n } else {\r\n\r\n self.childrenTiles.forEach(child => {\r\n child._updateNodeVisibilityImmediate(parentDisplaysMesh);\r\n })\r\n }\r\n }\r\n\r\n\r\n\r\n }\r\n _shouldBeVisibleUpdateImmediate() {\r\n const self = this;\r\n if (!self.hasMeshContent) {\r\n\r\n self.childrenTiles.forEach(child => {\r\n child.shouldBeVisible = true;\r\n child._shouldBeVisibleUpdateImmediate();\r\n })\r\n self.shouldBeVisible = false;\r\n\r\n }\r\n else if (self.metric == undefined) {\r\n self.shouldBeVisible = false;\r\n }\r\n else if (self.metric < 0) {\r\n self.shouldBeVisible = !!self.loadOutsideView;\r\n self.childrenTiles.forEach(child => {\r\n child._setShouldNotBeVisibleRecursive();\r\n });\r\n }\r\n else if (self.metric < self.geometricErrorMultiplier * self.geometricError) {\r\n if (self.hasUnloadedJSONContent) {\r\n //self.shouldBeVisible = true;\r\n\r\n } else {\r\n if (!!self.json && !!self.json.children && self.json.children.length > 0) {\r\n self.shouldBeVisible = false;\r\n self.childrenTiles.forEach(child => {\r\n child.shouldBeVisible = true;\r\n child._shouldBeVisibleUpdateImmediate();\r\n })\r\n\r\n } else {\r\n self.shouldBeVisible = true;\r\n\r\n }\r\n }\r\n\r\n } else {\r\n\r\n self.childrenTiles.forEach(child => {\r\n child._setShouldNotBeVisibleRecursive();\r\n });\r\n }\r\n }\r\n\r\n _setShouldNotBeVisibleRecursive() {\r\n const self = this;\r\n self.shouldBeVisible = false;\r\n self.childrenTiles.forEach(child => {\r\n child._setShouldNotBeVisibleRecursive();\r\n })\r\n }\r\n _loadMeshImmediate() {\r\n const self = this;\r\n if (!self.hasMeshContent) {\r\n self.childrenTiles.forEach(child => {\r\n child._loadMeshImmediate();\r\n });\r\n return;\r\n }\r\n if (self.shouldBeVisible) {\r\n if (self.meshContent.length < self.hasMeshContent &&\r\n self.contentURL.length == 0) {\r\n\r\n self.deleted = false;\r\n\r\n self._load(false, true);\r\n }\r\n } else {\r\n self.childrenTiles.forEach(child => {\r\n child._loadMeshImmediate();\r\n })\r\n }\r\n\r\n }\r\n\r\n _computeMetricRecursive(camera, frustum) {\r\n const self = this;\r\n self.metric = -1;\r\n if (!self.isSetup) return;\r\n\r\n if (!!self.boundingVolume && !!self.geometricError) {\r\n self.metric = self._calculateUpdateMetric(camera, frustum);\r\n }\r\n self.childrenTiles.forEach(child => child._computeMetricRecursive(camera, frustum));\r\n\r\n\r\n }\r\n\r\n\r\n _expandTreeImmediate(camera) {\r\n const self = this;\r\n\r\n if (!self.hasUnloadedJSONContent) {\r\n if (!self.hasMeshContent) {\r\n if (!!self.json && !!self.json.children && self.childrenTiles.length < self.json.children.length) {\r\n self._loadJsonChildren(camera);\r\n\r\n }\r\n } else {\r\n if (self.occlusionCullingService && self.hasMeshContent && !self.occlusionCullingService.hasID(self.colorID)) {\r\n // don't load children\r\n } else {\r\n if (self.metric >= 0 && self.metric < self.geometricErrorMultiplier * self.geometricError &&\r\n !!self.json && !!self.json.children && self.childrenTiles.length < self.json.children.length\r\n ) {\r\n self._loadJsonChildren(camera);\r\n }\r\n }\r\n }\r\n\r\n }\r\n\r\n self.childrenTiles.forEach(child => child._expandTreeImmediate(camera));\r\n }\r\n\r\n\r\n _update(camera, frustum) {\r\n const self = this;\r\n\r\n if (!self.isSetup) return;\r\n // let dist = self.boundingVolume.distanceToPoint(new THREE.Vector3(3980, 4980.416656099139, 3.2851604304346775));\r\n // if (dist< 1) {\r\n // self._changeContentVisibility(false);\r\n // console.log(dist+\" \"+self.level)\r\n // }\r\n const visibilityBeforeUpdate = self.materialVisibility;\r\n\r\n if (!!self.boundingVolume && !!self.geometricError) {\r\n self.metric = self._calculateUpdateMetric(camera, frustum);\r\n }\r\n self.childrenTiles.forEach(child => child._update(camera, frustum));\r\n\r\n _updateNodeVisibility(self.metric);\r\n _updateTree(self.metric);\r\n _trimTree(self.metric, visibilityBeforeUpdate);\r\n\r\n\r\n\r\n function _updateTree(metric) {\r\n // If this tile does not have mesh content but it has children\r\n if (metric < 0 && self.hasMeshContent) return;\r\n if (self.occlusionCullingService && self.hasMeshContent && !self.occlusionCullingService.hasID(self.colorID)) {\r\n return;\r\n }\r\n if (!self.hasMeshContent || (metric <= self.geometricErrorMultiplier * self.geometricError && self.meshContent.length > 0)) {\r\n if (!!self.json && !!self.json.children && self.childrenTiles.length != self.json.children.length) {\r\n self._loadJsonChildren(camera);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n\r\n function _updateNodeVisibility(metric) {\r\n\r\n //doesn't have a mesh content\r\n if (!self.hasMeshContent) return;\r\n\r\n // mesh content not yet loaded\r\n if (self.meshContent.length < self.hasMeshContent) {\r\n return;\r\n }\r\n\r\n\r\n // outside frustum\r\n if (metric < 0) {\r\n self.inFrustum = false;\r\n self._changeContentVisibility(!!self.loadOutsideView);\r\n return;\r\n } else {\r\n self.inFrustum = true;\r\n }\r\n\r\n // has no children\r\n if (self.childrenTiles.length == 0) {\r\n self._changeContentVisibility(true);\r\n return;\r\n }\r\n\r\n // has children\r\n if (metric >= self.geometricErrorMultiplier * self.geometricError) { // Ideal LOD or before this lod\r\n\r\n self._changeContentVisibility(true);\r\n } else if (metric < self.geometricErrorMultiplier * self.geometricError) { // Ideal LOD is past this one\r\n // if children are visible and have been displayed, can be hidden\r\n if (self.refine == \"REPLACE\") {\r\n let allChildrenReady = true;\r\n self.childrenTiles.every(child => {\r\n\r\n if (!child._isReady()) {\r\n allChildrenReady = false;\r\n return false;\r\n }\r\n return true;\r\n });\r\n if (allChildrenReady) {\r\n self._changeContentVisibility(false);\r\n }\r\n else {\r\n self._changeContentVisibility(true);\r\n }\r\n }\r\n\r\n\r\n }\r\n }\r\n\r\n\r\n\r\n function _trimTree(metric, visibilityBeforeUpdate) {\r\n if (!self.hasMeshContent) return;\r\n if (!self.inFrustum) { // outside frustum\r\n self._disposeChildren();\r\n //_updateNodeVisibility(metric);\r\n return;\r\n }\r\n if (self.occlusionCullingService &&\r\n !visibilityBeforeUpdate &&\r\n self.hasMeshContent &&\r\n self.meshContent.length > 0 &&\r\n self.materialVisibility &&\r\n self._areAllChildrenLoadedAndHidden()) {\r\n \r\n if (self.splatsMesh && this.materialVisibility && !self.splatsReady) {\r\n return;\r\n }\r\n self._disposeChildren();\r\n //_updateNodeVisibility(metric);\r\n return;\r\n }\r\n if (metric >= self.geometricErrorMultiplier * self.geometricError) {\r\n if (self.splatsMesh && self.materialVisibility && !self.splatsReady) {\r\n return;\r\n }\r\n self._disposeChildren();\r\n //_updateNodeVisibility(metric);\r\n return;\r\n }\r\n\r\n }\r\n\r\n\r\n\r\n }\r\n\r\n _loadJsonChildren(camera) {\r\n const self = this;\r\n for (let i = self.json.children.length - 1; i >= 0; i--) {\r\n if (!self.json.children[i].root && !self.json.children[i].children && !self.json.children[i].getChildren && !self.json.children[i].content && !self.json.children[i].contents) {\r\n self.json.children.splice(i, 1);\r\n }\r\n }\r\n self.json.children.forEach(childJSON => {\r\n\r\n let childTile = new OGC3DTile({\r\n parentTile: self,\r\n queryParams: self.queryParams,\r\n parentGeometricError: self.geometricError,\r\n parentBoundingVolume: self.boundingVolume,\r\n parentRefine: self.refine,\r\n json: childJSON,\r\n rootPath: self.rootPath,\r\n geometricErrorMultiplier: self.geometricErrorMultiplier,\r\n loadOutsideView: self.loadOutsideView,\r\n level: Math.floor(self.level) + 1,\r\n tileLoader: self.tileLoader,\r\n cameraOnLoad: camera,\r\n occlusionCullingService: self.occlusionCullingService,\r\n renderer: self.renderer,\r\n static: self.static,\r\n centerModel: false,\r\n displayErrors: self.displayErrors,\r\n displayCopyright: self.displayCopyright,\r\n distanceBias: self.distanceBias,\r\n loadingStrategy: self.loadingStrategy,\r\n drawBoundingVolume: self.drawBoundingVolume,\r\n splatsMesh: self.splatsMesh\r\n });\r\n self.childrenTiles.push(childTile);\r\n self.add(childTile);\r\n });\r\n\r\n self.updateMatrices(true);\r\n }\r\n\r\n _areAllChildrenLoadedAndHidden() {\r\n let allLoadedAndHidden = true;\r\n const self = this;\r\n this.childrenTiles.every(child => {\r\n if (child.hasMeshContent) {\r\n if (child.childrenTiles.length > 0) {\r\n allLoadedAndHidden = false;\r\n return false;\r\n }\r\n if (!child.metric < 0) {\r\n return true;\r\n };\r\n if (child.materialVisibility && (!self.splatsMesh || self.splatsReady)) {\r\n allLoadedAndHidden = false;\r\n return false;\r\n } else if (self.occlusionCullingService.hasID(child.colorID)) {\r\n allLoadedAndHidden = false;\r\n return false;\r\n }\r\n } else {\r\n if (!child._areAllChildrenLoadedAndHidden()) {\r\n allLoadedAndHidden = false;\r\n return false;\r\n }\r\n }\r\n return true;\r\n });\r\n return allLoadedAndHidden;\r\n }\r\n\r\n /**\r\n * Node is ready if it is outside frustum, if it was drawn at least once or if all it's children are ready\r\n * @returns true if ready\r\n */\r\n _isReady() {\r\n\r\n // if outside frustum\r\n if (this.metric == undefined) {\r\n return false;\r\n }\r\n if (this.metric < 0) {\r\n return true;\r\n }\r\n // if json is not done loading\r\n if (this.hasUnloadedJSONContent) {\r\n return false;\r\n }\r\n // if empty tile\r\n if (!this.hasMeshContent && this.json.children.length == 0 && !this.hasUnloadedJSONContent) {\r\n return true;\r\n }\r\n // if this tile has no mesh content or if it's marked as visible false, look at children\r\n if ((!this.hasMeshContent || this.meshContent.length == 0 || (!this.materialVisibility) || (self.splatsMesh && !self.splatsReady))) {\r\n if (this.children.length > 0) {\r\n var allChildrenReady = true;\r\n this.childrenTiles.every(child => {\r\n if (!child._isReady()) {\r\n allChildrenReady = false;\r\n //console.log(child.level)\r\n return false;\r\n }\r\n return true;\r\n });\r\n return allChildrenReady;\r\n } else {\r\n return false\r\n }\r\n\r\n }\r\n\r\n\r\n // if this tile has no mesh content\r\n if (!this.hasMeshContent) {\r\n return true;\r\n }\r\n // if mesh content not yet loaded\r\n if (this.meshContent.length < this.hasMeshContent) {\r\n return false;\r\n }\r\n\r\n\r\n if (this.materialVisibility && (!this.splatsMesh || this.splatsReady)) {\r\n return true;\r\n }\r\n\r\n\r\n\r\n return false;\r\n\r\n }\r\n\r\n _isReadyImmediate() {\r\n\r\n if (!!this.materialVisibility || (!this.loadOutsideView && this.metric < 0)) {\r\n return true;\r\n } else {\r\n /* if (this.splatsMesh) {\r\n if (this.splatsReady) {\r\n return true\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n return false;\r\n } */\r\n //return false;\r\n if (this.childrenTiles.length > 0) {\r\n var allChildrenReady = true;\r\n this.childrenTiles.every(child => {\r\n if (!child._isReadyImmediate()) {\r\n allChildrenReady = false;\r\n return false;\r\n }\r\n return true;\r\n });\r\n return allChildrenReady;\r\n } else {\r\n return false;\r\n /* if (this.splatsMesh) {\r\n if (this.splatsReady) {\r\n return true\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n return false;\r\n } */\r\n }\r\n }\r\n\r\n\r\n }\r\n\r\n\r\n _changeContentVisibility(visibility) {\r\n const self = this;\r\n if (self.bbox) {\r\n\r\n self.bbox.material.visible = visibility;\r\n }\r\n if (self.splatsMesh) {\r\n if (visibility != self.materialVisibility) {\r\n let splatsCount = 0;\r\n self.meshContent.forEach(mc => {\r\n if (visibility && mc.isSplatsBatch) {\r\n self.splatsReady = true;\r\n splatsCount++;\r\n \r\n mc.show(() => {\r\n if(self.materialVisibility){\r\n self.splatsReady = true;\r\n }\r\n \r\n });\r\n\r\n }\r\n else {\r\n mc.hide();\r\n //self.splatsReady = false;\r\n }\r\n });\r\n\r\n self.materialVisibility = visibility;\r\n }\r\n } else {\r\n if (self.hasMeshContent && self.meshContent.length > 0) {\r\n if (visibility) {\r\n self.meshContent.forEach(mc => {\r\n mc.traverse((o) => {\r\n if (o.isMesh || o.isPoints) {\r\n o.layers.enable(0);\r\n }\r\n });\r\n })\r\n\r\n } else {\r\n self.meshContent.forEach(mc => {\r\n mc.traverse((o) => {\r\n if (o.isMesh || o.isPoints) {\r\n o.layers.disable(0);\r\n }\r\n });\r\n })\r\n\r\n }\r\n }\r\n\r\n if (self.materialVisibility == visibility) {\r\n return;\r\n }\r\n self.materialVisibility = visibility\r\n }\r\n\r\n\r\n\r\n\r\n\r\n }\r\n _calculateUpdateMetric(camera, frustum) {\r\n ////// return -1 if not in frustum\r\n let distance = 0;\r\n if (this.boundingVolume instanceof OBB) {\r\n // box\r\n tempOBB.copy(this.boundingVolume);\r\n tempOBB.applyMatrix4(this.matrixWorld);\r\n if (!tempOBB.inFrustum(frustum)) return -1;\r\n distance = Math.max(0, tempOBB.distanceToPoint(camera.position) - camera.near);\r\n\r\n /* tempSphere.center.copy(this.boundingVolume.center);\r\n tempSphere.radius = Math.sqrt(this.boundingVolume.halfSize.x*this.boundingVolume.halfSize.x+ this.boundingVolume.halfSize.y*this.boundingVolume.halfSize.y+ this.boundingVolume.halfSize.z*this.boundingVolume.halfSize.z)\r\n tempSphere.applyMatrix4(this.matrixWorld);\r\n if (!frustum.intersectsSphere(tempSphere)) return -1;\r\n distance = Math.max(0, camera.position.distanceTo(tempSphere.center) - tempSphere.radius - camera.near); */\r\n } else if (this.boundingVolume instanceof THREE.Sphere) {\r\n //sphere\r\n tempSphere.copy(this.boundingVolume);\r\n tempSphere.applyMatrix4(this.matrixWorld);\r\n if (!frustum.intersectsSphere(tempSphere)) return -1;\r\n distance = Math.max(0, camera.position.distanceTo(tempSphere.center) - tempSphere.radius - camera.near);\r\n } else {\r\n console.error(\"unsupported shape\");\r\n return -1\r\n\r\n }\r\n\r\n /////// Apply the bias factor to the distance\r\n distance = Math.pow(distance, this.distanceBias);\r\n /////// return metric based on geometric error and distance\r\n\r\n\r\n if (distance == 0) {\r\n return 0;\r\n }\r\n const scale = this.matrixWorld.getMaxScaleOnAxis();\r\n if (!!this.renderer) {\r\n this.renderer.getDrawingBufferSize(this.rendererSize);\r\n }\r\n let s = this.rendererSize.y;\r\n let fov = camera.fov;\r\n if (camera.aspect < 1) {\r\n fov *= camera.aspect;\r\n s = this.rendererSize.x;\r\n }\r\n\r\n let lambda = 2.0 * Math.tan(0.5 * fov * 0.01745329251994329576923690768489) * distance;\r\n\r\n return (window.devicePixelRatio * 16 * lambda) / (s * scale);\r\n }\r\n\r\n _getSiblings() {\r\n const self = this;\r\n const tiles = [];\r\n if (!self.parentTile) return tiles;\r\n let p = self.parentTile;\r\n while (!p.hasMeshContent && !!p.parentTile) {\r\n p = p.parentTile;\r\n }\r\n p.childrenTiles.forEach(child => {\r\n if (!!child && child != self) {\r\n while (!child.hasMeshContent && !!child.childrenTiles[0]) {\r\n child = child.childrenTiles[0];\r\n }\r\n tiles.push(child);\r\n }\r\n });\r\n return tiles;\r\n }\r\n _calculateDistanceToCamera(camera) {\r\n if (this.boundingVolume instanceof OBB) {\r\n // box\r\n tempOBB.copy(this.boundingVolume);\r\n tempOBB.applyMatrix4(this.matrixWorld);\r\n return Math.max(0, tempOBB.distanceToPoint(camera.position));\r\n //if (!frustum.intersectsSphere(tempSphere)) return -1;\r\n } else if (this.boundingVolume instanceof THREE.Sphere) {\r\n //sphere\r\n tempSphere.copy(this.boundingVolume);\r\n tempSphere.applyMatrix4(this.matrixWorld);\r\n return Math.max(0, camera.position.distanceTo(tempSphere.center) - tempSphere.radius);\r\n }\r\n else {\r\n console.error(\"unsupported shape\");\r\n return -1;\r\n }\r\n\r\n }\r\n\r\n /**\r\n * Set the Geometric Error Multiplier for the tileset.\r\n * the {@param geometricErrorMultiplier} can be a number between 1 and infinity.\r\n * A {@param geometricErrorMultiplier} of 1 (default) corresponds to a max ScreenSpace error (MSE) of 16. \r\n * A lower {@param geometricErrorMultiplier} loads less detail (higher MSE) and a higher {@param geometricErrorMultiplier} loads more detail (lower MSE)\r\n * \r\n * @param {Number} geometricErrorMultiplier set the LOD multiplier for the entire tileset\r\n */\r\n setGeometricErrorMultiplier(geometricErrorMultiplier) {\r\n this.geometricErrorMultiplier = geometricErrorMultiplier;\r\n this.splatsReady = true;\r\n this.childrenTiles.forEach(child => child.setGeometricErrorMultiplier(geometricErrorMultiplier));\r\n }\r\n\r\n /**\r\n * Set the Distance Bias for the tileset.\r\n * the {@param distanceBias} can be a number between 0 and infinity.\r\n * A {@param distanceBias} is applied as an exponent to camera-to-tile distance. \r\n * the {@link geometricErrorMultiplier} should be used to balance out the amount of detail loaded\r\n * \r\n * @param {Number} distanceBias set the distance bias for the entire tileset\r\n */\r\n setDistanceBias(distanceBias) {\r\n this.distanceBias = distanceBias;\r\n this.childrenTiles.forEach(child => child.setDistanceBias(distanceBias));\r\n }\r\n\r\n _transformWGS84ToCartesian(lon, lat, h, sfct) {\r\n const a = 6378137.0;\r\n const e = 0.006694384442042;\r\n const N = a / (Math.sqrt(1.0 - (e * Math.pow(Math.sin(lat), 2))));\r\n const cosLat = Math.cos(lat);\r\n const cosLon = Math.cos(lon);\r\n const sinLat = Math.sin(lat);\r\n const sinLon = Math.sin(lon);\r\n const nPh = (N + h);\r\n const x = nPh * cosLat * cosLon;\r\n const y = nPh * cosLat * sinLon;\r\n const z = (0.993305615557957 * N + h) * sinLat;\r\n\r\n sfct.set(x, y, z);\r\n }\r\n}\r\nexport { OGC3DTile, getOGC3DTilesCopyrightInfo };\r\n\r\nfunction _showError(error) {\r\n // Create a new div element\r\n var errorDiv = document.createElement(\"div\");\r\n\r\n // Set its text content\r\n errorDiv.textContent = error;\r\n\r\n // Set styles\r\n errorDiv.style.position = 'fixed'; // Fix position to the viewport\r\n errorDiv.style.top = '10px'; // Set top position\r\n errorDiv.style.left = '50%'; // Center horizontally\r\n errorDiv.style.transform = 'translateX(-50%)'; // Make sure it's centered accurately\r\n errorDiv.style.padding = '10px'; // Add some padding\r\n errorDiv.style.backgroundColor = '#ff8800'; // Set a background color\r\n errorDiv.style.color = '#ffffff'; // Set a text color\r\n errorDiv.style.zIndex = '9999'; // Make sure it's on top of other elements\r\n\r\n // Append the new div to the body\r\n document.body.appendChild(errorDiv);\r\n\r\n // After 3 seconds, remove the error message\r\n setTimeout(function () {\r\n errorDiv.remove();\r\n }, 8000);\r\n}\r\n\r\nfunction _updateCopyrightLabel() {\r\n // Create a new div\r\n if (!copyrightDiv) {\r\n copyrightDiv = document.createElement('div');\r\n copyrightDiv.style.position = 'fixed';\r\n copyrightDiv.style.bottom = '20px';\r\n copyrightDiv.style.left = '20px';\r\n copyrightDiv.style.color = 'white';\r\n copyrightDiv.style.textShadow = '2px 2px 0 #000, -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000';\r\n copyrightDiv.style.padding = '10px';\r\n copyrightDiv.style.backgroundColor = 'rgba(0, 0, 0, 0.1)'; // semi-transparent black background\r\n\r\n // Append the div to the body of the document\r\n document.body.appendChild(copyrightDiv);\r\n }\r\n\r\n // Set the text content of the div\r\n const list = getOGC3DTilesCopyrightInfo();\r\n let listString = \"\";\r\n list.forEach(item => {\r\n listString += item + \", \";\r\n });\r\n listString = listString.slice(0, -2);\r\n\r\n copyrightDiv.textContent = listString\r\n // Style the div\r\n\r\n}\r\n\r\n","import * as THREE from 'three';\r\nimport { OBB } from \"../../geometry/obb\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport * as path from \"path-browserify\";\r\n\r\nconst tempSphere = new THREE.Sphere(new THREE.Vector3(0, 0, 0), 1);\r\nconst tempVec1 = new THREE.Vector3(0, 0, 0);\r\nconst tempVec2 = new THREE.Vector3(0, 0, 0);\r\nconst upVector = new THREE.Vector3(0, 1, 0);\r\nconst rendererSize = new THREE.Vector2();\r\nconst tempQuaternion = new THREE.Quaternion();\r\nconst tempMatrix = new THREE.Matrix4();\r\n\r\nclass InstancedTile extends THREE.Object3D {\r\n\r\n /**\r\n * \r\n * @param {\r\n * json: optional,\r\n * url: optional,\r\n * rootPath: optional,\r\n * parentGeometricError: optional,\r\n * parentBoundingVolume: optional,\r\n * parentRefinement: optional,\r\n * loadOutsideView: Boolean,\r\n * tileLoader : InstancedTileLoader,\r\n * cameraOnLoad: camera,\r\n * parentTile: OGC3DTile,\r\n * onLoadCallback: function,\r\n * centerModel: Boolean,\r\n * queryParams: String,\r\n * distanceBias: distanceBias\r\n * } properties \r\n */\r\n constructor(properties) {\r\n super();\r\n const self = this;\r\n if (properties.queryParams) {\r\n this.queryParams = { ...properties.queryParams };\r\n }\r\n this.uuid = uuidv4();\r\n if (!!properties.tileLoader) {\r\n this.tileLoader = properties.tileLoader;\r\n } else {\r\n console.error(\"an instanced tileset must be provided an InstancedTilesetLoader\");\r\n }\r\n // set properties general to the entire tileset\r\n this.master = properties.master;\r\n this.loadOutsideView = properties.loadOutsideView;\r\n this.cameraOnLoad = properties.cameraOnLoad;\r\n this.parentTile = properties.parentTile;\r\n this.distanceBias = Math.max(0.0001,properties.distanceBias? properties.distanceBias:1);\r\n\r\n // declare properties specific to the tile for clarity\r\n this.childrenTiles = [];\r\n this.jsonChildren = [];\r\n this.meshContent = new Set();\r\n\r\n this.static = properties.static;\r\n if (this.static) {\r\n this.matrixAutoUpdate = false;\r\n this.matrixWorldAutoUpdate = false;\r\n }\r\n this.tileContent;\r\n this.refinement; // defaults to \"REPLACE\"\r\n this.rootPath;\r\n this.geometricError;\r\n this.boundingVolume;\r\n this.json; // the json corresponding to this tile\r\n this.materialVisibility = false;\r\n this.inFrustum = true;\r\n this.level = properties.level ? properties.level : 0;\r\n this.hasMeshContent = 0; // true when the provided json has a content field pointing to a B3DM file\r\n this.hasUnloadedJSONContent = 0; // true when the provided json has a content field pointing to a JSON file that is not yet loaded\r\n this.centerModel = properties.centerModel;\r\n\r\n this.deleted = false;\r\n this.abortController = new AbortController();\r\n\r\n if (!!properties.json) { // If this tile is created as a child of another tile, properties.json is not null\r\n this.rootPath = !!properties.json.rootPath ? properties.json.rootPath : properties.rootPath;\r\n if (properties.json.children) this.jsonChildren = properties.json.children;\r\n self.setup(properties);\r\n } else if (properties.url) { // If only the url to the tileset.json is provided\r\n\r\n\r\n this.loadJson = (json, url) => {\r\n //json = JSON.parse(JSON.stringify(json))\r\n const p = path.dirname(url);\r\n self.setup({ rootPath: p, json: json, onLoadCallback: properties.onLoadCallback });\r\n\r\n\r\n\r\n }\r\n var url = properties.url;\r\n if (self.queryParams) {\r\n var props = \"\";\r\n for (let key in self.queryParams) {\r\n if (self.queryParams.hasOwnProperty(key)) { // This check is necessary to skip properties from the object's prototype chain\r\n props += \"&\" + key + \"=\" + self.queryParams[key];\r\n }\r\n }\r\n if (url.includes(\"?\")) {\r\n url += props;\r\n } else {\r\n url += \"?\" + props.substring(1);\r\n }\r\n }\r\n self.tileLoader.get(self.abortController, url, self.uuid, self);\r\n }\r\n }\r\n\r\n async setup(properties) {\r\n const self = this;\r\n\r\n if (!!properties.json.root) {\r\n self.json = properties.json.root;\r\n if (!self.json.children && self.json.getChildren) {\r\n self.json.children = await self.json.getChildren();\r\n }\r\n self.jsonChildren = self.json.children;\r\n if (!self.json.refinement) self.json.refinement = properties.json.refinement;\r\n if (!self.json.geometricError) self.json.geometricError = properties.json.geometricError;\r\n if (!self.json.transform) self.json.transform = properties.json.transform;\r\n if (!self.json.boundingVolume) self.json.boundingVolume = properties.json.boundingVolume;\r\n } else {\r\n self.json = properties.json;\r\n if (!self.json.children && self.json.getChildren) {\r\n self.json.children = await self.json.getChildren();\r\n self.jsonChildren = self.json.children;\r\n }\r\n }\r\n\r\n self.rootPath = !!properties.json.rootPath ? properties.json.rootPath : properties.rootPath;\r\n\r\n // decode refinement\r\n if (!!self.json.refinement) {\r\n self.refinement = self.json.refinement;\r\n } else {\r\n self.refinement = properties.parentRefinement;\r\n }\r\n // decode geometric error\r\n if (!!self.json.geometricError) {\r\n self.geometricError = self.json.geometricError;\r\n } else {\r\n self.geometricError = properties.parentGeometricError;\r\n }\r\n // decode transform\r\n let mat = new THREE.Matrix4();\r\n if (!!self.json.transform && !self.centerModel) {\r\n mat.elements = self.json.transform;\r\n }\r\n\r\n self.applyMatrix4(mat);\r\n\r\n if (!!self.parentTile && !!self.parentTile.matrix) {\r\n\r\n self.matrix.premultiply(self.parentTile.matrix);\r\n //self.matrix.premultiply(self.master.matrixWorld);\r\n self.matrix.decompose(self.position, self.quaternion, self.scale)\r\n }\r\n\r\n\r\n self.matrixWorldNeedsUpdate = true;\r\n self.updateWorldMatrix(true, true)\r\n \r\n\r\n // decode volume\r\n if (!!self.json.boundingVolume) {\r\n if (!!self.json.boundingVolume.box) {\r\n self.boundingVolume = new OBB(self.json.boundingVolume.box);\r\n } else if (!!self.json.boundingVolume.region) {\r\n const region = self.json.boundingVolume.region;\r\n self.transformWGS84ToCartesian(region[0], region[1], region[4], tempVec1);\r\n self.transformWGS84ToCartesian(region[2], region[3], region[5], tempVec2);\r\n tempVec1.lerp(tempVec2, 0.5);\r\n self.boundingVolume = new THREE.Sphere(new THREE.Vector3(tempVec1.x, tempVec1.y, tempVec1.z), tempVec1.distanceTo(tempVec2));\r\n } else if (!!self.json.boundingVolume.sphere) {\r\n const sphere = self.json.boundingVolume.sphere;\r\n self.boundingVolume = new THREE.Sphere(new THREE.Vector3(sphere[0], sphere[1], sphere[2]), sphere[3]);\r\n } else {\r\n self.boundingVolume = properties.parentBoundingVolume;\r\n }\r\n } else {\r\n self.boundingVolume = properties.parentBoundingVolume;\r\n }\r\n\r\n function checkContent(e) {\r\n if (!!e.uri && e.uri.includes(\"json\")) {\r\n self.hasUnloadedJSONContent++;\r\n } else if (!!e.url && e.url.includes(\"json\")) {\r\n self.hasUnloadedJSONContent++;\r\n } else {\r\n self.hasMeshContent++;\r\n }\r\n }\r\n if (!!self.json.content) { //if there is a content, json or otherwise, schedule it to be loaded \r\n checkContent(self.json.content);\r\n\r\n self.load();\r\n } else if (!!self.json.contents) { //if there is a content, json or otherwise, schedule it to be loaded \r\n self.json.contents.forEach(e => checkContent(e))\r\n\r\n self.load();\r\n //scheduleLoadTile(this);\r\n }\r\n\r\n if (!!self.centerModel) {\r\n const tempSphere = new THREE.Sphere();\r\n if (self.boundingVolume instanceof OBB) {\r\n // box\r\n tempSphere.copy(self.boundingVolume.sphere);\r\n } else if (self.boundingVolume instanceof THREE.Sphere) {\r\n //sphere\r\n tempSphere.copy(self.boundingVolume);\r\n }\r\n\r\n //tempSphere.applyMatrix4(self.matrixWorld);\r\n if (!!this.json.boundingVolume.region) {\r\n self.transformWGS84ToCartesian(\r\n (self.json.boundingVolume.region[0] + self.json.boundingVolume.region[2]) * 0.5,\r\n (self.json.boundingVolume.region[1] + self.json.boundingVolume.region[3]) * 0.5,\r\n (self.json.boundingVolume.region[4] + self.json.boundingVolume.region[5]) * 0.5,\r\n tempVec1);\r\n\r\n tempQuaternion.setFromUnitVectors(tempVec1.normalize(), upVector.normalize());\r\n self.master.applyQuaternion(tempQuaternion);\r\n self.master.updateWorldMatrix(false, false)\r\n }\r\n tempMatrix.makeTranslation(-tempSphere.center.x * self.scale.x, -tempSphere.center.y * self.scale.y, -tempSphere.center.z * self.scale.z);\r\n //self.master.applyMatrix4(tempMatrix);\r\n self.master.matrix.multiply(tempMatrix);\r\n self.master.matrix.decompose(self.master.position, self.master.quaternion, self.master.scale);\r\n }\r\n\r\n self.isSetup = true;\r\n if (properties.onLoadCallback) properties.onLoadCallback(self);\r\n }\r\n\r\n isAbsolutePathOrURL(input) {\r\n // Check if it's an absolute URL with various protocols\r\n const urlRegex = /^(?:http|https|ftp|tcp|udp):\\/\\/\\S+/;\r\n const absoluteURL = urlRegex.test(input);\r\n\r\n // Check if it's an absolute path\r\n const absolutePath = input.startsWith('/') && !input.startsWith('//');\r\n\r\n return absoluteURL || absolutePath;\r\n }\r\n\r\n assembleURL(root, relative) {\r\n // Append a slash to the root URL if it doesn't already have one\r\n if (!root.endsWith('/')) {\r\n root += '/';\r\n }\r\n\r\n const rootUrl = new URL(root);\r\n let rootParts = rootUrl.pathname.split('/').filter(p => p !== '');\r\n let relativeParts = relative.split('/').filter(p => p !== '');\r\n\r\n for (let i = 1; i <= rootParts.length; i++) {\r\n if (i >= relativeParts.length) break;\r\n const rootToken = rootParts.slice(rootParts.length - i, rootParts.length).join('/');\r\n const relativeToken = relativeParts.slice(0, i).join('/');\r\n if (rootToken === relativeToken) {\r\n for (let j = 0; j < i; j++) {\r\n rootParts.pop();\r\n }\r\n break;\r\n }\r\n }\r\n\r\n\r\n while (relativeParts.length > 0 && relativeParts[0] === '..') {\r\n rootParts.pop();\r\n relativeParts.shift();\r\n }\r\n\r\n return `${rootUrl.protocol}//${rootUrl.host}/${[...rootParts, ...relativeParts].join('/')}`;\r\n }\r\n extractQueryParams(url, params) {\r\n const urlObj = new URL(url);\r\n\r\n // Iterate over all the search parameters\r\n for (let [key, value] of urlObj.searchParams) {\r\n params[key] = value;\r\n }\r\n\r\n // Remove the query string\r\n urlObj.search = '';\r\n return urlObj.toString();\r\n }\r\n load() {\r\n var self = this;\r\n if (self.deleted) return;\r\n if (!!self.json.content) {\r\n\r\n loadContent(self.json.content);\r\n } else if (!!self.json.contents) {\r\n self.json.contents.forEach(content => loadContent(content))\r\n }\r\n function loadContent(content) {\r\n let url;\r\n if (!!content.uri) {\r\n url = content.uri;\r\n } else if (!!content.url) {\r\n url = content.url;\r\n }\r\n const urlRegex = /^(?:http|https|ftp|tcp|udp):\\/\\/\\S+/;\r\n\r\n if (urlRegex.test(self.rootPath)) { // url\r\n if (!urlRegex.test(url)) {\r\n url = self.assembleURL(self.rootPath, url)\r\n }\r\n } else { //path\r\n if (path.isAbsolute(self.rootPath)) {\r\n url = self.rootPath + path.sep + url;\r\n }\r\n }\r\n url = self.extractQueryParams(url, self.queryParams);\r\n if (self.queryParams) {\r\n var props = \"\";\r\n for (let key in self.queryParams) {\r\n if (self.queryParams.hasOwnProperty(key)) { // This check is necessary to skip properties from the object's prototype chain\r\n props += \"&\" + key + \"=\" + self.queryParams[key];\r\n }\r\n }\r\n if (url.includes(\"?\")) {\r\n url += props;\r\n } else {\r\n url += \"?\" + props.substring(1);\r\n }\r\n }\r\n\r\n if (!!url) {\r\n if (url.includes(\".b3dm\") || url.includes(\".glb\") || url.includes(\".gltf\")) {\r\n self.contentURL = url;\r\n\r\n\r\n self.tileLoader.get(self.abortController, url, self.uuid, self, !self.cameraOnLoad ? () => 0 : () => {\r\n return self.calculateDistanceToCamera(self.cameraOnLoad);\r\n }, () => self.getSiblings(),\r\n self.level,\r\n !!self.json.boundingVolume.region ? false : true,\r\n !!self.json.boundingVolume.region,\r\n self.geometricError);\r\n } else if (url.includes(\".json\")) {\r\n self.tileLoader.get(self.abortController, url, self.uuid, self);\r\n }\r\n }\r\n\r\n \r\n }\r\n\r\n }\r\n\r\n loadMesh(mesh) {\r\n const self = this;\r\n if (self.deleted) {\r\n return;\r\n }\r\n //self.updateWorldMatrix(false, true);\r\n self.meshContent.add(mesh);\r\n\r\n }\r\n\r\n loadJson(json, url) {\r\n if (this.deleted) {\r\n return;\r\n }\r\n if (!!this.json.children) {\r\n this.jsonChildren = this.json.children;\r\n }\r\n\r\n json.rootPath = path.dirname(url);\r\n this.jsonChildren.push(json);\r\n this.hasUnloadedJSONContent--;\r\n }\r\n\r\n dispose() {\r\n\r\n const self = this;\r\n self.childrenTiles.forEach(tile => tile.dispose());\r\n\r\n self.deleted = true;\r\n if (self.abortController) self.abortController.abort();\r\n this.parent = null;\r\n this.parentTile = null;\r\n this.dispatchEvent({ type: 'removed' });\r\n }\r\n disposeChildren() {\r\n\r\n var self = this;\r\n\r\n self.childrenTiles.forEach(tile => tile.dispose());\r\n self.childrenTiles = [];\r\n\r\n }\r\n\r\n\r\n _update(camera, frustum) {\r\n const self = this;\r\n if (!self.isSetup) return;\r\n\r\n const visibilityBeforeUpdate = self.materialVisibility;\r\n\r\n if (!!self.boundingVolume && !!self.geometricError) {\r\n self.metric = self.calculateUpdateMetric(camera, frustum);\r\n }\r\n self.childrenTiles.forEach(child => child._update(camera, frustum));\r\n\r\n updateNodeVisibility(self.metric);\r\n updateTree(self.metric);\r\n trimTree(self.metric, visibilityBeforeUpdate);\r\n\r\n function updateTree(metric) {\r\n // If this tile does not have mesh content but it has children\r\n if (metric < 0 && self.hasMeshContent) return;\r\n\r\n if ((!self.hasMeshContent && self.rootPath) || (metric < self.master.geometricErrorMultiplier * self.geometricError && self.meshContent.size > 0)) {\r\n if (!!self.json && !!self.jsonChildren && self.childrenTiles.length != self.jsonChildren.length) {\r\n loadJsonChildren();\r\n return;\r\n }\r\n }\r\n }\r\n\r\n function updateNodeVisibility(metric) {\r\n\r\n //doesn't have a mesh content\r\n if (!self.hasMeshContent) {\r\n return;\r\n }\r\n // mesh content not yet loaded\r\n if (self.meshContent.size < self.hasMeshContent) {\r\n return;\r\n }\r\n\r\n // outside frustum\r\n if (metric < 0) {\r\n self.inFrustum = false;\r\n self.changeContentVisibility(!!self.loadOutsideView);\r\n return;\r\n } else {\r\n self.inFrustum = true;\r\n }\r\n\r\n // has no children\r\n if (self.childrenTiles.length == 0) {\r\n self.changeContentVisibility(true);\r\n return;\r\n }\r\n\r\n // has children\r\n if (metric >= self.master.geometricErrorMultiplier * self.geometricError) { // Ideal LOD or before ideal lod\r\n\r\n self.changeContentVisibility(true);\r\n } else if (metric < self.master.geometricErrorMultiplier * self.geometricError) { // Ideal LOD is past this one\r\n // if children are visible and have been displayed, can be hidden\r\n let allChildrenReady = true;\r\n self.childrenTiles.every(child => {\r\n\r\n if (!child.isReady()) {\r\n allChildrenReady = false;\r\n return false;\r\n }\r\n return true;\r\n });\r\n if (allChildrenReady) {\r\n self.changeContentVisibility(false);\r\n }\r\n }\r\n }\r\n\r\n function trimTree(metric, visibilityBeforeUpdate) {\r\n if (!self.hasMeshContent) return;\r\n if (!self.inFrustum) { // outside frustum\r\n self.disposeChildren();\r\n updateNodeVisibility(metric);\r\n return;\r\n }\r\n if (metric >= self.master.geometricErrorMultiplier * self.geometricError) {\r\n self.disposeChildren();\r\n updateNodeVisibility(metric);\r\n return;\r\n }\r\n\r\n }\r\n\r\n\r\n function loadJsonChildren() {\r\n self.jsonChildren.forEach(childJSON => {\r\n if (!childJSON.root && !childJSON.children && !childJSON.getChildren && !childJSON.content && !childJSON.contents) {\r\n return;\r\n }\r\n let childTile = new InstancedTile({\r\n parentTile: self,\r\n queryParams: self.queryParams,\r\n parentGeometricError: self.geometricError,\r\n parentBoundingVolume: self.boundingVolume,\r\n parentRefinement: self.refinement,\r\n json: childJSON,\r\n rootPath: self.rootPath,\r\n loadOutsideView: self.loadOutsideView,\r\n level: self.level + 1,\r\n tileLoader: self.tileLoader,\r\n cameraOnLoad: camera,\r\n master: self.master,\r\n centerModel: false,\r\n });\r\n self.childrenTiles.push(childTile);\r\n //self.add(childTile);\r\n });\r\n }\r\n\r\n }\r\n\r\n areAllChildrenLoadedAndHidden() {\r\n let allLoadedAndHidden = true;\r\n const self = this;\r\n this.childrenTiles.every(child => {\r\n if (child.hasMeshContent) {\r\n if (child.childrenTiles.length > 0) {\r\n allLoadedAndHidden = false;\r\n return false;\r\n }\r\n if (!child.inFrustum) {\r\n return true;\r\n };\r\n if (!child.materialVisibility || child.meshesToDisplay != child.meshesDisplayed) {\r\n allLoadedAndHidden = false;\r\n return false;\r\n }\r\n } else {\r\n if (!child.areAllChildrenLoadedAndHidden()) {\r\n allLoadedAndHidden = false;\r\n return false;\r\n }\r\n }\r\n return true;\r\n });\r\n return allLoadedAndHidden;\r\n }\r\n\r\n /**\r\n * Node is ready if it is outside frustum, if it was drawn at least once or if all it's children are ready\r\n * @returns true if ready\r\n */\r\n isReady() {\r\n // if outside frustum\r\n if (!this.inFrustum) return true;\r\n\r\n // if json is not done loading\r\n if (this.hasUnloadedJSONContent) {\r\n return false;\r\n }\r\n if ((!this.hasMeshContent || this.meshContent.size == 0 || !this.materialVisibility)) {\r\n if (this.childrenTiles.length > 0) {\r\n var allChildrenReady = true;\r\n this.childrenTiles.every(child => {\r\n if (!child.isReady()) {\r\n allChildrenReady = false;\r\n return false;\r\n }\r\n return true;\r\n });\r\n return allChildrenReady;\r\n } else {\r\n return false;\r\n }\r\n\r\n }\r\n // if this tile has no mesh content\r\n if (!this.hasMeshContent) {\r\n return true;\r\n }\r\n // if mesh content not yet loaded\r\n if (this.meshContent.size < this.hasMeshContent) {\r\n return false;\r\n }\r\n\r\n // if this tile has been marked to hide it's content\r\n if (!this.materialVisibility) {\r\n return false;\r\n }\r\n\r\n\r\n return true;\r\n\r\n }\r\n\r\n\r\n changeContentVisibility(visibility) {\r\n const self = this;\r\n self.materialVisibility = visibility;\r\n\r\n\r\n\r\n }\r\n calculateUpdateMetric(camera, frustum) {\r\n ////// return -1 if not in frustum\r\n if (this.boundingVolume instanceof OBB) {\r\n // box\r\n tempSphere.copy(this.boundingVolume.sphere);\r\n tempSphere.applyMatrix4(this.matrixWorld);\r\n if (!frustum.intersectsSphere(tempSphere)) return -1;\r\n } else if (this.boundingVolume instanceof THREE.Sphere) {\r\n //sphere\r\n tempSphere.copy(this.boundingVolume);\r\n tempSphere.applyMatrix4(this.matrixWorld);\r\n if (!frustum.intersectsSphere(tempSphere)) return -1;\r\n } else {\r\n console.error(\"unsupported shape\");\r\n return -1\r\n }\r\n\r\n /////// return metric based on geometric error and distance\r\n\r\n let distance = Math.max(0, camera.position.distanceTo(tempSphere.center) - tempSphere.radius);\r\n\r\n /////// Apply the bias factor to the distance\r\n distance = Math.pow(distance,this.distanceBias);\r\n\r\n if (distance == 0) {\r\n return 0;\r\n }\r\n const scale = this.matrixWorld.getMaxScaleOnAxis();\r\n this.master._renderSize(rendererSize);\r\n let s = rendererSize.y;\r\n let fov = camera.fov;\r\n if (camera.aspect < 1) {\r\n fov *= camera.aspect;\r\n s = rendererSize.x;\r\n }\r\n\r\n let lambda = 2.0 * Math.tan(0.5 * fov * 0.01745329251994329576923690768489) * distance;\r\n\r\n return (window.devicePixelRatio * 16 * lambda) / (s * scale);\r\n\r\n }\r\n\r\n getSiblings() {\r\n const self = this;\r\n const tiles = [];\r\n if (!self.parentTile) return tiles;\r\n let p = self.parentTile;\r\n while (!p.hasMeshContent && !!p.parentTile) {\r\n p = p.parentTile;\r\n }\r\n p.childrenTiles.forEach(child => {\r\n if (!!child && child != self) {\r\n while (!child.hasMeshContent && !!child.childrenTiles[0]) {\r\n child = child.childrenTiles[0];\r\n }\r\n tiles.push(child);\r\n }\r\n });\r\n return tiles;\r\n }\r\n calculateDistanceToCamera(camera) {\r\n if (this.boundingVolume instanceof OBB) {\r\n // box\r\n tempSphere.copy(this.boundingVolume.sphere);\r\n tempSphere.applyMatrix4(this.matrixWorld);\r\n //if (!frustum.intersectsSphere(tempSphere)) return -1;\r\n } else if (this.boundingVolume instanceof THREE.Sphere) {\r\n //sphere\r\n tempSphere.copy(this.boundingVolume);\r\n tempSphere.applyMatrix4(this.matrixWorld);\r\n //if (!frustum.intersectsSphere(tempSphere)) return -1;\r\n }\r\n else {\r\n console.error(\"unsupported shape\")\r\n }\r\n return Math.max(0, camera.position.distanceTo(tempSphere.center) - tempSphere.radius);\r\n }\r\n\r\n getWorldMatrix() {\r\n const self = this;\r\n return self.matrixWorld;\r\n }\r\n\r\n transformWGS84ToCartesian(lon, lat, h, sfct) {\r\n const a = 6378137.0;\r\n const e = 0.006694384442042;\r\n const N = a / (Math.sqrt(1.0 - (e * Math.pow(Math.sin(lat), 2))));\r\n const cosLat = Math.cos(lat);\r\n const cosLon = Math.cos(lon);\r\n const sinLat = Math.sin(lat);\r\n const sinLon = Math.sin(lon);\r\n const nPh = (N + h);\r\n const x = nPh * cosLat * cosLon;\r\n const y = nPh * cosLat * sinLon;\r\n const z = (0.993305615557957 * N + h) * sinLat;\r\n\r\n sfct.set(x, y, z);\r\n }\r\n}\r\nexport { InstancedTile };","import * as THREE from 'three';\r\nimport {InstancedTile} from \"./InstancedTile.js\"\r\n\r\n/**\r\n * Similarly to {@link OGC3DTile}, this class that extends THREE.Object3D loads a tiled and multileveled OGC3DTiles 1.0 or 1.1 dataset.\r\n * The difference is that tiles are instanced. This is useful when one wants to load the same tileset hundreds or even thousands of times.\r\n * Imagine rendering hundreds of very high detail cars driving in a city.\r\n * Each tile content is instanced but each {@link InstancedOGC3DTile} object also has it's own LOD tree making this scenario very efficient.\r\n * @class\r\n */\r\nclass InstancedOGC3DTile extends THREE.Object3D {\r\n\r\n /**\r\n * \r\n * @param {Object} [properties] - the properties for this tileset\r\n * @param {Object} [properties.url] - the url to the parent tileset.json\r\n * @param {Object} [properties.pathParams] - optional, path params to add to individual tile urls (starts with \"?\").\r\n * @param {Object} [properties.geometricErrorMultiplier] - the geometric error of the parent. 1.0 by default corresponds to a maxScreenSpaceError of 16\r\n * @param {Object} [properties.loadOutsideView] - if truthy, tiles otside the camera frustum will be loaded with the least possible amount of detail\r\n * @param {Object} [properties.tileLoader] - A tile loader that can be shared among tilesets in order to share a common cache.\r\n * @param {Object} [properties.pointsCallback] - A callback function that will be called on every points\r\n * @param {Object} [properties.onLoadCallback] - A callback function that will be called when the root tile has been loaded\r\n * @param {Object} [properties.occlusionCullingService] - A service that handles occlusion culling\r\n * @param {Object} [properties.centerModel] - If true, the tileset will be centered on 0,0,0 and in the case of georeferenced tilesets that use the \"region\" bounding volume, it will also be rotated so that the up axis matched the world y axis.\r\n * @param {Object} [properties.static] - If true, the tileset is considered static which improves performance but the tileset cannot be moved\r\n * @param {Object} [properties.rootPath] - optional the root path for fetching children\r\n * @param {Object} [properties.json] - optional json object representing the tileset sub-tree\r\n * @param {Object} [properties.parentGeometricError] - optional geometric error of the parent\r\n * @param {Object} [properties.parentBoundingVolume] - optional bounding volume of the parent\r\n * @param {Object} [properties.parentRefinement] - optional refinement strategy of the parent of the parent\r\n * @param {Object} [properties.cameraOnLoad] - optional the camera used when loading this particular sub-tile\r\n * @param {Object} [properties.parentTile] - optional the OGC3DTile object that loaded this tile as a child\r\n * @param {Number} [properties.domWidth = 1000] - optional the canvas width (used to calculate geometric error). If a renderer is provided, it'll be used instead, else a default value is used. \r\n * @param {Number} [properties.domHeight = 1000] - optional the canvas height (used to calculate geometric error). If a renderer is provided, it'll be used instead, else a default value is used. \r\n * @param {Object} [properties.renderer = undefined] - optional the renderer is used to infer the canvas size and compute tiles geometric error.\r\n * @param {Number} [properties.distanceBias] - optional a bias that allows loading more or less detail closer to the camera relative to far away. The value should be a positive number. A value below 1 loads less detail near the camera and a value above 1 loads more detail near the camera. This needs to be compensated by the geometricErrorMultiplier in order to load a reasonable number of tiles.\r\n */\r\n constructor(properties) {\r\n super();\r\n properties.master = this;\r\n \r\n if(!!properties.domWidth && !!properties.domHeight){\r\n this.rendererSize = new THREE.Vector2(properties.domWidth, properties.domHeight);\r\n }else{\r\n this.rendererSize = new THREE.Vector2(1000, 1000);\r\n }\r\n this.renderer = properties.renderer;\r\n this.distanceBias = Math.max(0.0001,properties.distanceBias? properties.distanceBias:1);\r\n\r\n this.geometricErrorMultiplier = properties.geometricErrorMultiplier? properties.geometricErrorMultiplier:1.0;\r\n this.tileset = new InstancedTile(properties);\r\n if (properties.static) {\r\n this.matrixAutoUpdate = false;\r\n }\r\n this.tileLoader = properties.tileLoader;\r\n }\r\n\r\n _renderSize(size){\r\n if(!!this.renderer){\r\n this.renderer.getDrawingBufferSize(size);\r\n }else{\r\n size.copy(this.rendererSize);\r\n }\r\n \r\n }\r\n\r\n /**\r\n * Call this to specify the canvas width/height when it changes (used to compute tiles geometric error that controls tile refinement).\r\n * It's unnecessary to call this when the {@link OGC3DTile} is instantiated with the renderer.\r\n * \r\n * @param {Number} width \r\n * @param {Number} height \r\n */\r\n setCanvasSize(width, height){\r\n this.rendererSize.set(width, height);\r\n }\r\n /**\r\n * To be called in the render loop.\r\n * @param {Three.Camera} camera a camera that the tileset will be rendered with.\r\n */\r\n update(camera, frustum){\r\n if(!!frustum){\r\n this.tileset._update(camera, frustum);\r\n }else{\r\n const frustum = new THREE.Frustum();\r\n frustum.setFromProjectionMatrix(new THREE.Matrix4().multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse));\r\n this.tileset._update(camera, frustum);\r\n }\r\n \r\n }\r\n \r\n /** \r\n * Set the Geometric Error Multiplier for the tileset.\r\n * the {@param geometricErrorMultiplier} can be a number between 1 and infinity.\r\n * A {@param geometricErrorMultiplier} of 1 (default) corresponds to a max ScreenSpace error (MSE) of 16. \r\n * A lower {@param geometricErrorMultiplier} loads less detail (higher MSE) and a higher {@param geometricErrorMultiplier} loads more detail (lower MSE)\r\n * \r\n * @param {Number} geometricErrorMultiplier set the LOD multiplier for the entire tileset\r\n */\r\n setGeometricErrorMultiplier(geometricErrorMultiplier) {\r\n this.geometricErrorMultiplier = geometricErrorMultiplier?geometricErrorMultiplier:1.0;\r\n }\r\n}\r\nexport { InstancedOGC3DTile };","import * as THREE from 'three';\r\n\r\nclass MeshTile{\r\n constructor(scene){\r\n const self = this;\r\n self.scene = scene;\r\n self.instancedTiles = [];\r\n self.instancedMesh;\r\n \r\n\r\n self.reuseableMatrix = new THREE.Matrix4();\r\n }\r\n addInstance(instancedTile){\r\n const self = this;\r\n instancedTile.added = true;\r\n instancedTile.listOMesh = self.instancedTiles;\r\n self.instancedTiles.push(instancedTile);\r\n if(self.instancedMesh){\r\n instancedTile.loadMesh(self.instancedMesh)\r\n }\r\n }\r\n\r\n addToScene(){\r\n //this.instancedMesh.instanceMatrix.setUsage( THREE.DynamicDrawUsage );\r\n const self = this;\r\n self.instancedMesh.setMatrixAt(0,new THREE.Matrix4());\r\n self.instancedMesh.instanceMatrix.needsUpdate = true;\r\n self.instancedMesh.count = 1;\r\n \r\n self.scene.add(self.instancedMesh);\r\n self.instancedMesh.onAfterRender = () => {\r\n delete self.instancedMesh.onAfterRender;\r\n self.instancedMesh.displayedOnce = true;\r\n };\r\n }\r\n\r\n setObject(instancedMesh){\r\n const self = this;\r\n self.instancedMesh = instancedMesh;\r\n self.instancedMesh.matrixAutoUpdate = false;\r\n self.instancedMesh.matrixWorldAutoUpdate = false;\r\n if(!self.scene.children.includes(instancedMesh)){\r\n this.addToScene();\r\n }\r\n \r\n for(let i = 0; i<self.instancedTiles.length; i++){\r\n self.instancedTiles[i].loadMesh(self.instancedMesh)\r\n }\r\n }\r\n\r\n update(){\r\n const self = this;\r\n\r\n for(let i = self.instancedTiles.length-1; i>=0; i--){\r\n if(self.instancedTiles[i].deleted){\r\n self.instancedTiles.splice(i,1);\r\n }\r\n }\r\n \r\n if(!!self.instancedMesh){\r\n \r\n self.instancedMesh.count = 0;\r\n self.instancedMesh.instancedTiles = [];\r\n for(let i = 0; i<self.instancedTiles.length; i++){\r\n self.instancedTiles[i].meshContent.add(self.instancedMesh);\r\n if(self.instancedTiles[i].materialVisibility){\r\n self.instancedMesh.count++;\r\n self.reuseableMatrix.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);\r\n self.reuseableMatrix.multiply(self.instancedTiles[i].matrixWorld);\r\n self.reuseableMatrix.multiply(self.instancedMesh.baseMatrix);\r\n //self.reuseableMatrix.premultiply(self.instancedTiles[i].master.matrixWorld);\r\n self.instancedMesh.setMatrixAt(self.instancedMesh.count-1, self.reuseableMatrix );\r\n //self.instancedMesh.getMatrixAt(0, t);\r\n //console.log(self.instancedMesh.baseMatrix)\r\n self.instancedMesh.instancedTiles.push(self.instancedTiles[i])\r\n }\r\n }\r\n \r\n self.instancedMesh.instanceMatrix.needsUpdate = true;\r\n self.instancedMesh.needsUpdate = true;\r\n self.instancedMesh.computeBoundingSphere();\r\n }\r\n }\r\n\r\n getCount(){\r\n return this.instancedTiles.length;\r\n }\r\n\r\n dispose(){\r\n const self = this;\r\n if(self.instancedTiles.length>0){\r\n return false;\r\n }\r\n else{\r\n if(!!self.instancedMesh){\r\n //console.log(self.instancedMesh.parent)\r\n self.scene.remove(self.instancedMesh);\r\n self.instancedMesh.traverse((o) => {\r\n if(o.dispose) o.dispose();\r\n if (o.material) {\r\n // dispose materials\r\n if (o.material.length) {\r\n for (let i = 0; i < o.material.length; ++i) {\r\n o.material[i].dispose();\r\n }\r\n }\r\n else {\r\n o.material.dispose()\r\n }\r\n }\r\n if (o.geometry) o.geometry.dispose();\r\n });\r\n self.instancedMesh.dispose();\r\n return true;\r\n }\r\n return false;\r\n }\r\n }\r\n\r\n}export { MeshTile };","\r\n\r\nclass JsonTile{\r\n constructor(){\r\n const self = this;\r\n self.count = 0;\r\n self.json;\r\n self.instancedTiles = [];\r\n }\r\n\r\n addInstance(instanceTile){\r\n this.instancedTiles.push(instanceTile);\r\n if(this.json){\r\n instanceTile.loadJson(this.json, this.url)\r\n }\r\n }\r\n\r\n \r\n\r\n setObject(json, url){\r\n const self = this;\r\n self.json = json;\r\n self.url = url;\r\n for(let i = 0; i<self.instancedTiles.length; i++){\r\n self.instancedTiles[i].loadJson( self.json, self.url );\r\n }\r\n }\r\n\r\n getCount(){\r\n return this.instancedTiles.length;\r\n }\r\n update(){\r\n const self = this;\r\n for(let i = self.instancedTiles.length-1; i>=0; i--){\r\n if(self.instancedTiles[i].deleted){\r\n self.instancedTiles.splice(i,1);\r\n }\r\n }\r\n }\r\n dispose(){\r\n if(!!this.json && this.instancedTiles.length == 0){\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n}export { JsonTile };","import * as THREE from 'three';\r\nimport { LinkedHashMap } from '../../utils/LinkedHashMap';\r\nimport { B3DMDecoder } from \"../../decoder/B3DMDecoder\";\r\nimport { MeshTile } from './MeshTile';\r\nimport { JsonTile } from './JsonTile';\r\nimport { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';\r\nimport { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js';\r\nimport { KTX2Loader } from \"three/addons/loaders/KTX2Loader\";\r\nimport { resolveImplicite } from '../implicit/ImplicitTileResolver.js';\r\nimport { InstancedOGC3DTile } from './InstancedOGC3DTile';\r\nimport { MeshoptDecoder } from 'meshoptimizer';\r\n\r\nlet concurrentDownloads = 0;\r\n\r\n\r\n/**\r\n * A Tile loader that manages caching and load order for instanced tiles.\r\n * The cache is an LRU cache and is defined by the number of items it can hold.\r\n * The actual number of cached items might grow beyond max if all items are in use.\r\n * \r\n * The load order is designed for optimal perceived loading speed (nearby tiles are refined first).\r\n *\r\n */\r\nclass InstancedTileLoader {\r\n /**\r\n * Creates a tile loader with a maximum number of cached items and callbacks.\r\n * The only required property is a renderer that will be used to visualize the tiles.\r\n * The maxCachedItems property is the size of the cache in number of objects, mesh tile and tileset.json files.\r\n * The mesh and point callbacks will be called for every incoming mesh or points.\r\n *\r\n * @param {scene} [scene] - a threejs scene.\r\n * @param {Object} [options] - Optional configuration object.\r\n * @param {number} [options.maxCachedItems=100] - the cache size.\r\n * @param {number} [options.maxInstances=1] - the cache size.\r\n * @param {function} [options.meshCallback] - A callback to call on newly decoded meshes.\r\n * @param {function} [options.pointsCallback] - A callback to call on newly decoded points.\r\n * @param {sring} [options.proxy] - An optional proxy that tile requests will be directed too as POST requests with the actual tile url in the body of the request.\r\n * @param {KTX2Loader} [options.ktx2Loader = undefined] - A KTX2Loader (three/addons)\r\n * @param {DRACOLoader} [options.dracoLoader = undefined] - A DRACOLoader (three/addons)\r\n * @param {renderer} [options.renderer = undefined] - optional the renderer, this is required only for on the fly ktx2 support. not needed if you pass a ktx2Loader manually\r\n \r\n */\r\n constructor(scene, options) {\r\n this.zUpToYUpMatrix = new THREE.Matrix4();\r\n this.zUpToYUpMatrix.set(1, 0, 0, 0,\r\n 0, 0, -1, 0,\r\n 0, 1, 0, 0,\r\n 0, 0, 0, 1);\r\n this.maxCachedItems = 100;\r\n this.maxInstances = 1;\r\n this.proxy = options.proxy;\r\n if (!!options) {\r\n this.meshCallback = options.meshCallback;\r\n this.pointsCallback = options.pointsCallback;\r\n if (options.maxCachedItems) this.maxCachedItems = options.maxCachedItems;\r\n if (options.maxInstances) this.maxInstances = options.maxInstances;\r\n\r\n }\r\n\r\n\r\n this.gltfLoader = new GLTFLoader();\r\n if (!!options && !!options.dracoLoader) {\r\n this.gltfLoader.setDRACOLoader(options.dracoLoader);\r\n this.hasDracoLoader = true;\r\n } else {\r\n const dracoLoader = new DRACOLoader();\r\n dracoLoader.setDecoderPath('https://www.gstatic.com/draco/versioned/decoders/1.4.3/');\r\n this.gltfLoader.setDRACOLoader(dracoLoader);\r\n this.gltfLoader.hasDracoLoader = true;\r\n }\r\n\r\n if (!!options && !!options.ktx2Loader) {\r\n this.gltfLoader.setKTX2Loader(options.ktx2Loader);\r\n this.hasKTX2Loader = true;\r\n } else if (!!options && !!options.renderer) {\r\n const ktx2Loader = new KTX2Loader();\r\n ktx2Loader.setTranscoderPath('https://storage.googleapis.com/ogc-3d-tiles/basis/').detectSupport(options.renderer);\r\n this.gltfLoader.setKTX2Loader(ktx2Loader);\r\n this.gltfLoader.hasKTX2Loader = true;\r\n }\r\n\r\n this.gltfLoader.setMeshoptDecoder(MeshoptDecoder);\r\n this.hasMeshOptDecoder = true;\r\n\r\n this.b3dmDecoder = new B3DMDecoder(this.gltfLoader);\r\n\r\n\r\n this.cache = new LinkedHashMap();\r\n this.scene = scene;\r\n\r\n this.ready = [];\r\n this.downloads = [];\r\n this.nextReady = [];\r\n this.nextDownloads = [];\r\n\r\n }\r\n\r\n /**\r\n * To be called in the render loop or at regular intervals.\r\n * launches tile downloading and loading in an orderly fashion.\r\n */\r\n update() {\r\n const self = this;\r\n self._checkSize();\r\n self.cache._data.forEach(v => {\r\n v.update();\r\n })\r\n\r\n if (concurrentDownloads < 8) {\r\n self._download();\r\n }\r\n self._loadBatch();\r\n }\r\n\r\n\r\n _download() {\r\n const self = this;\r\n if (self.nextDownloads.length == 0) {\r\n self._getNextDownloads();\r\n if (self.nextDownloads.length == 0) return;\r\n }\r\n while (self.nextDownloads.length > 0) {\r\n const nextDownload = self.nextDownloads.shift();\r\n if (!!nextDownload) {//} && nextDownload.shouldDoDownload()) {\r\n //nextDownload.doDownload();\r\n if (nextDownload.path.includes(\".b3dm\")) {\r\n var fetchFunction;\r\n if (!self.proxy) {\r\n fetchFunction = () => {\r\n return fetch(nextDownload.path);\r\n }\r\n } else {\r\n fetchFunction = () => {\r\n return fetch(self.proxy,\r\n {\r\n method: 'POST',\r\n body: nextDownload.path\r\n }\r\n );\r\n }\r\n }\r\n concurrentDownloads++;\r\n fetchFunction().then(result => {\r\n if (!result.ok) {\r\n console.error(\"could not load tile with path : \" + nextDownload.path)\r\n throw new Error(`couldn't load \"${nextDownload.path}\". Request failed with status ${result.status} : ${result.statusText}`);\r\n }\r\n return result.arrayBuffer();\r\n\r\n }).then(resultArrayBuffer => {\r\n return this.b3dmDecoder.parseB3DMInstanced(resultArrayBuffer, (mesh) => { self.meshCallback(mesh, nextDownload.geometricError) }, self.maxInstances, nextDownload.sceneZupToYup, nextDownload.meshZupToYup);\r\n }).then(mesh => {\r\n mesh.frustumCulled = false;\r\n nextDownload.tile.setObject(mesh);\r\n self.ready.unshift(nextDownload);\r\n\r\n }).catch(e => console.error(e))\r\n .finally(() => {\r\n concurrentDownloads--;\r\n });\r\n } if (nextDownload.path.includes(\".glb\") || (nextDownload.path.includes(\".gltf\"))) {\r\n var fetchFunction;\r\n if (!self.proxy) {\r\n fetchFunction = () => {\r\n return fetch(nextDownload.path);\r\n }\r\n } else {\r\n fetchFunction = () => {\r\n return fetch(self.proxy,\r\n {\r\n method: 'POST',\r\n body: nextDownload.path\r\n }\r\n );\r\n }\r\n }\r\n concurrentDownloads++;\r\n fetchFunction().then(result => {\r\n if (!result.ok) {\r\n throw new Error(\"missing content\");\r\n }\r\n return result.arrayBuffer();\r\n }).then(async arrayBuffer => {\r\n await _checkLoaderInitialized(this.gltfLoader);\r\n this.gltfLoader.parse(arrayBuffer, null, gltf => {\r\n gltf.scene.asset = gltf.asset;\r\n\r\n if (nextDownload.sceneZupToYup) {\r\n gltf.scene.applyMatrix4(this.zUpToYUpMatrix);\r\n }\r\n gltf.scene.traverse((o) => {\r\n o.geometricError = nextDownload.geometricError;\r\n if (o.isMesh) {\r\n if (nextDownload.meshZupToYup) {\r\n o.applyMatrix4(this.zUpToYUpMatrix);\r\n }\r\n if (!!self.meshCallback) {\r\n self.meshCallback(o, o.geometricError);\r\n }\r\n }\r\n if (o.isPoints) {\r\n console.error(\"instanced point cloud is not supported\");\r\n }\r\n });\r\n let instancedMesh;\r\n gltf.scene.updateWorldMatrix(false, true)\r\n gltf.scene.traverse(child => {\r\n //TODO several meshes in a single gltf\r\n if (child.isMesh) {\r\n instancedMesh = new THREE.InstancedMesh(child.geometry, child.material, self.maxInstances);\r\n instancedMesh.baseMatrix = child.matrixWorld;\r\n }\r\n\r\n });\r\n self.ready.unshift(nextDownload);\r\n if (!instancedMesh) {\r\n gltf.scene.traverse(c => {\r\n if (c.dispose) c.dispose();\r\n if (c.material) c.material.dispose();\r\n });\r\n } else {\r\n instancedMesh.frustumCulled = false;\r\n nextDownload.tile.setObject(instancedMesh);\r\n }\r\n });\r\n }, e => {\r\n console.error(\"could not load tile : \" + nextDownload.path)\r\n }).finally(() => {\r\n concurrentDownloads--;\r\n });\r\n\r\n\r\n\r\n } else if (nextDownload.path.includes(\".json\")) {\r\n var fetchFunction;\r\n if (!self.proxy) {\r\n fetchFunction = () => {\r\n return fetch(nextDownload.path);\r\n }\r\n } else {\r\n fetchFunction = () => {\r\n return fetch(self.proxy,\r\n {\r\n method: 'POST',\r\n body: nextDownload.path\r\n }\r\n );\r\n }\r\n }\r\n concurrentDownloads++;\r\n fetchFunction().then(result => {\r\n if (!result.ok) {\r\n console.error(\"could not load tile with path : \" + nextDownload.path)\r\n throw new Error(`couldn't load \"${nextDownload.path}\". Request failed with status ${result.status} : ${result.statusText}`);\r\n }\r\n return result.json();\r\n\r\n }).then(json => {\r\n return resolveImplicite(json, nextDownload.path)\r\n }).then(json => {\r\n nextDownload.tile.setObject(json, nextDownload.path);\r\n self.ready.unshift(nextDownload);\r\n })\r\n .catch(e => console.error(e)).finally(() => {\r\n concurrentDownloads--;\r\n });\r\n }\r\n }\r\n }\r\n return;\r\n }\r\n\r\n _loadBatch() {\r\n if (this.nextReady.length == 0) {\r\n this._getNextReady();\r\n if (this.nextReady.length == 0) return 0;\r\n }\r\n const download = this.nextReady.shift();\r\n if (!download) return 0;\r\n\r\n //if (!!download.tile.addToScene) download.tile.addToScene();\r\n return 1;\r\n }\r\n\r\n _getNextReady() {\r\n let smallestDistance = Number.MAX_VALUE;\r\n let closest = -1;\r\n for (let i = this.ready.length - 1; i >= 0; i--) {\r\n\r\n if (!this.ready[i].distanceFunction) {// if no distance function, must be a json, give absolute priority!\r\n this.nextReady.push(this.ready.splice(i, 1)[0]);\r\n }\r\n }\r\n if (this.nextReady.length > 0) return;\r\n for (let i = this.ready.length - 1; i >= 0; i--) {\r\n const dist = this.ready[i].distanceFunction() * this.ready[i].level;\r\n if (dist < smallestDistance) {\r\n smallestDistance = dist;\r\n closest = i\r\n }\r\n }\r\n if (closest >= 0) {\r\n const closestItem = this.ready.splice(closest, 1).pop();\r\n this.nextReady.push(closestItem);\r\n const siblings = closestItem.getSiblings();\r\n for (let i = this.ready.length - 1; i >= 0; i--) {\r\n if (siblings.includes(this.ready[i].uuid)) {\r\n this.nextready.push(this.ready.splice(i, 1).pop());\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Schedules a tile content to be downloaded\r\n * \r\n * @param {AbortController} abortController \r\n * @param {string} path path or url to tile content \r\n * @param {string|Number} uuid tile id\r\n * @param {InstancedOGC3DTile} instancedOGC3DTile \r\n * @param {Function} distanceFunction \r\n * @param {Function} getSiblings \r\n * @param {Number} level \r\n * @param {Boolean} sceneZupToYup \r\n * @param {Boolean} meshZupToYup \r\n * @param {Number} geometricError \r\n */\r\n get(abortController, path, uuid, instancedOGC3DTile, distanceFunction, getSiblings, level, sceneZupToYup, meshZupToYup, geometricError) {\r\n const self = this;\r\n const key = _simplifyPath(path);\r\n\r\n if (!path.includes(\".b3dm\") && !path.includes(\".json\") && !path.includes(\".glb\") && !path.includes(\".gltf\")) {\r\n console.error(\"the 3DTiles cache can only be used to load B3DM, gltf and json data\");\r\n return;\r\n }\r\n\r\n const cachedTile = self.cache.get(key);\r\n if (!!cachedTile) {\r\n cachedTile.addInstance(instancedOGC3DTile);\r\n return;\r\n } else {\r\n\r\n if (path.includes(\".b3dm\") || path.includes(\".glb\") || path.includes(\".gltf\")) {\r\n const tile = new MeshTile(self.scene);\r\n tile.addInstance(instancedOGC3DTile);\r\n\r\n self.cache.put(key, tile);\r\n //self._checkSize();\r\n const realAbortController = new AbortController();\r\n abortController.signal.addEventListener(\"abort\", () => {\r\n if (tile.getCount() == 0) {\r\n realAbortController.abort();\r\n }\r\n })\r\n this.downloads.push({\r\n abortController: realAbortController,\r\n tile: tile,\r\n key: key,\r\n path: path,\r\n distanceFunction: distanceFunction,\r\n getSiblings: getSiblings,\r\n level: level,\r\n uuid: uuid,\r\n sceneZupToYup: sceneZupToYup,\r\n meshZupToYup: meshZupToYup,\r\n geometricError: geometricError,\r\n shouldDoDownload: () => {\r\n return true;\r\n },\r\n })\r\n } else if (path.includes(\".json\")) {\r\n const tile = new JsonTile();\r\n tile.addInstance(instancedOGC3DTile);\r\n self.cache.put(key, tile);\r\n //self._checkSize();\r\n const realAbortController = new AbortController();\r\n abortController.signal.addEventListener(\"abort\", () => {\r\n if (tile.getCount() == 0) {\r\n realAbortController.abort();\r\n }\r\n })\r\n this.downloads.push({\r\n abortController: realAbortController,\r\n tile: tile,\r\n key: key,\r\n path: path,\r\n distanceFunction: distanceFunction,\r\n getSiblings: getSiblings,\r\n level: level,\r\n shouldDoDownload: () => {\r\n return true;\r\n },\r\n })\r\n\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n _getNextDownloads() {\r\n let smallestDistance = Number.MAX_VALUE;\r\n let closest = -1;\r\n for (let i = this.downloads.length - 1; i >= 0; i--) {\r\n const download = this.downloads[i];\r\n if (!download.shouldDoDownload()) {\r\n this.downloads.splice(i, 1);\r\n continue;\r\n }\r\n if (!download.distanceFunction) { // if no distance function, must be a json, give absolute priority!\r\n this.nextDownloads.push(this.downloads.splice(i, 1)[0]);\r\n }\r\n }\r\n if (this.nextDownloads.length > 0) return;\r\n for (let i = this.downloads.length - 1; i >= 0; i--) {\r\n const download = this.downloads[i];\r\n const dist = download.distanceFunction() * download.level;\r\n if (dist < smallestDistance) {\r\n smallestDistance = dist;\r\n closest = i;\r\n }\r\n }\r\n if (closest >= 0) {\r\n const closestItem = this.downloads.splice(closest, 1).pop();\r\n this.nextDownloads.push(closestItem);\r\n const siblings = closestItem.getSiblings();\r\n for (let i = this.downloads.length - 1; i >= 0; i--) {\r\n if (siblings.includes(this.downloads[i].uuid)) {\r\n this.nextDownloads.push(this.downloads.splice(i, 1).pop());\r\n }\r\n }\r\n }\r\n }\r\n\r\n _checkSize() {\r\n const self = this;\r\n\r\n let i = 0;\r\n\r\n while (self.cache.size() > self.maxCachedItems && i < self.cache.size()) {\r\n i++;\r\n const entry = self.cache.head();\r\n self.cache.remove(entry.key);\r\n if (!entry.value.dispose()) {\r\n self.cache.put(entry.key, entry.value);\r\n } else {\r\n //console.log(\"disposed and removed\")\r\n }\r\n\r\n }\r\n }\r\n}\r\n\r\nasync function _checkLoaderInitialized(loader) {\r\n\r\n const self = this;\r\n return new Promise((resolve) => {\r\n const interval = setInterval(() => {\r\n if ((!loader.hasDracoLoader || loader.dracoLoader) && (!loader.hasKTX2Loader || loader.ktx2Loader)) {\r\n clearInterval(interval);\r\n resolve();\r\n }\r\n }, 10); // check every 100ms\r\n });\r\n};\r\n\r\nfunction _simplifyPath(main_path) {\r\n\r\n var parts = main_path.split('/'),\r\n new_path = [],\r\n length = 0;\r\n for (var i = 0; i < parts.length; i++) {\r\n var part = parts[i];\r\n if (part === '.' || part === '' || part === '..') {\r\n if (part === '..' && length > 0) {\r\n length--;\r\n }\r\n continue;\r\n }\r\n new_path[length++] = part;\r\n }\r\n\r\n if (length === 0) {\r\n return '/';\r\n }\r\n\r\n var result = '';\r\n for (var i = 0; i < length; i++) {\r\n result += '/' + new_path[i];\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport { InstancedTileLoader };","import * as THREE from 'three';\r\n\r\n\r\n/**\r\n * An occlusion culling service that helps to only refine tiles that are visible.\r\n * This occlusion culling has a cost but allows downloading much less data.\r\n * For models that have a lot of geometry that is often hidden from the camera by walls, this can improve the frame-rate.\r\n * @class\r\n */\r\nclass OcclusionCullingService {\r\n\r\n /**\r\n * Creates an Occlusion Culling service to be passed to {@link OGC3DTile} Tilesets\r\n */\r\n constructor() {\r\n this.cullMap = [];\r\n this.cullMaterial = new THREE.MeshBasicMaterial({ vertexColors: true });\r\n this.cullMaterial.side = THREE.FrontSide;\r\n this.cullTarget = this._createCullTarget();\r\n this.cullPixels = new Uint8Array(4 * this.cullTarget.width * this.cullTarget.height);\r\n }\r\n\r\n /**\r\n * \r\n * @param {Integer} side use THREE.FrontSide, THREE.BackSide or THREE.DoubleSide (FrontSide default)\r\n */\r\n setSide(side){\r\n this.cullMaterial.side = side;\r\n }\r\n\r\n _createCullTarget() {\r\n const target = new THREE.WebGLRenderTarget(Math.floor(window.innerWidth * 0.05), Math.floor(window.innerHeight * 0.05));\r\n target.texture.format = THREE.RGBAFormat;\r\n target.texture.colorSpace = THREE.LinearSRGBColorSpace;\r\n target.texture.minFilter = THREE.NearestFilter;\r\n target.texture.magFilter = THREE.NearestFilter;\r\n target.texture.generateMipmaps = false;\r\n target.stencilBuffer = false;\r\n target.depthBuffer = true;\r\n target.depthTexture = new THREE.DepthTexture();\r\n target.depthTexture.format = THREE.DepthFormat;\r\n target.depthTexture.type = THREE.UnsignedShortType;\r\n return target;\r\n }\r\n\r\n /**\r\n * Update function to be called on every frame in the render loop.\r\n * @param {THREE.scene} scene \r\n * @param {THREE.Renderer} renderer \r\n * @param {THREE.camera} camera \r\n */\r\n update(scene, renderer, camera) {\r\n let tempRenderTarget = renderer.getRenderTarget();\r\n let tempOverrideMaterial = scene.overrideMaterial;\r\n\r\n scene.overrideMaterial = this.cullMaterial;\r\n renderer.setRenderTarget(this.cullTarget);\r\n renderer.render(scene, camera);\r\n\r\n scene.overrideMaterial = tempOverrideMaterial;\r\n renderer.setRenderTarget(tempRenderTarget);\r\n\r\n renderer.readRenderTargetPixels(this.cullTarget, 0, 0, this.cullTarget.width, this.cullTarget.height, this.cullPixels);\r\n this.cullMap = [];\r\n \r\n for (let i = 0; i < this.cullPixels.length; i += 4) {\r\n const c = THREE.MathUtils.clamp(this.cullPixels[i], 0, 255) << 16 ^ THREE.MathUtils.clamp(this.cullPixels[i + 1], 0, 255) << 8 ^ THREE.MathUtils.clamp(this.cullPixels[i + 2], 0, 255) << 0;\r\n this.cullMap[c] = true;\r\n }\r\n\r\n }\r\n\r\n /**\r\n * check if the given tile ID was visible in the last rendered frame.\r\n * @param {string|Number} id \r\n * @returns true if tile is visible\r\n */\r\n hasID(id) {\r\n return this.cullMap[id];\r\n }\r\n}\r\nexport { OcclusionCullingService };"],"names":["tempMatrix","Matrix3","tempVector3","Vector3","size","aabb","Box3","matrix","Matrix4","inverse","localRay","Ray","OBB","values","this","center","e1","e2","e3","halfSize","length","normalize","rotationMatrix","set","x","y","z","aObb","copy","result","multiplyScalar","e","elements","sx","sy","sz","determinant","setFromMatrix4","invSX","invSY","invSZ","multiply","setFromMatrixPosition","applyMatrix4","extractBasis","ray","getSize","setFromCenterAndSize","setFromMatrix3","setPosition","invert","intersectBox","intersectRay","plane","normal","r","Math","abs","dot","distanceToPoint","frustum","i","planes","insidePlane","point","sub","applyMatrix3","dx","max","dy","dz","sqrt","hs","c","corners","add","clone","geometry","BufferGeometry","setFromPoints","setIndex","computeBoundingSphere","material","LineBasicMaterial","color","wireframe","LineSegments","dispose","LinkedHashMap","_data","Map","_link","_head","undefined","_tail","key","item","head","has","previous","next","get","value","link","previousKey","prevKey","nextKey","reset","headLink","tailLink","cur","prev","nex","delete","clear","keys","entries","order","linkOrderArr","push","Array","from","map","k","utf8decoder","TextDecoder","FeatureTable","buffer","start","headerLength","binLength","binOffset","header","headerData","Uint8Array","JSON","parse","decode","getKeys","Object","count","defaultComponentType","defaultType","feature","isArray","byteOffset","featureType","type","featureComponentType","componentType","Error","stride","data","arrayStart","arrayLength","Int8Array","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BYTES_PER_ELEMENT","BatchTable","batchSize","super","getData","mergeAttributes","attributes","TypedArray","itemSize","normalized","gpuType","attribute","array","constructor","console","error","BufferAttribute","offset","isInterleavedBufferAttribute","tupleOffset","j","l","getComponent","setComponent","toTrianglesDrawMode","drawMode","TrianglesDrawMode","warn","TriangleFanDrawMode","TriangleStripDrawMode","index","getIndex","indices","position","getAttribute","numberOfTriangles","newIndices","getX","newGeometry","clearGroups","B3DMDecoder","aGltfLoader","checkLoaderInitialized","async","Promise","resolve","interval","setInterval","gltfLoader","hasDracoLoader","dracoLoader","hasKTX2Loader","ktx2Loader","clearInterval","THREE","zUpToYUpMatrix","arrayBuffer","meshCallback","sceneZupToYUp","meshZUpToYUp","self","dataView","DataView","magic","String","fromCharCode","getUint8","assert","byteLength","getUint32","featureTableJSONByteLength","featureTableBinaryByteLength","batchTableJSONByteLength","batchTableBinaryByteLength","featureTable","batchTableStart","glbStart","gltfBuffer","slice","reject","model","rtcCenter","makeTranslation","scene","userData","gltfExtensions","CESIUM_RTC","asset","traverse","o","isMesh","maxCount","meshZupToYup","parseB3DM","then","mesh","instancedMesh","geometries","materials","updateWorldMatrix","child","matrixWorld","mergedGeometry","allAttributes","Set","forEach","attributeSize","fill","setAttribute","useGroups","isIndexed","attributesUsed","morphAttributesUsed","morphAttributes","morphTargetsRelative","attributesCount","name","addGroup","indexOffset","mergedIndex","mergedAttribute","numMorphTargets","morphAttributesToMerge","mergedMorphAttribute","InstancedMesh","baseMatrix","identity","getRandomValues","rnds8","rng","crypto","bind","msCrypto","REGEX","byteToHex","toString","substr","stringify","arr","arguments","uuid","toLowerCase","test","TypeError","v4","options","buf","rnds","random","SplatsDecoder","renderer","splatsMesh","decoded","children","positions","colors","cov0","cov_0","cov1","cov_1","splatTile","addSplatsTile","GLTFLoader","Loader","manager","meshoptDecoder","pluginCallbacks","register","parser","GLTFMaterialsClearcoatExtension","GLTFMaterialsDispersionExtension","GLTFTextureBasisUExtension","GLTFTextureWebPExtension","GLTFTextureAVIFExtension","GLTFMaterialsSheenExtension","GLTFMaterialsTransmissionExtension","GLTFMaterialsVolumeExtension","GLTFMaterialsIorExtension","GLTFMaterialsEmissiveStrengthExtension","GLTFMaterialsSpecularExtension","GLTFMaterialsIridescenceExtension","GLTFMaterialsAnisotropyExtension","GLTFMaterialsBumpExtension","GLTFLightsExtension","GLTFMeshoptCompression","GLTFMeshGpuInstancing","url","onLoad","onProgress","onError","scope","resourcePath","path","relativeUrl","LoaderUtils","extractUrlBase","resolveURL","itemStart","_onError","itemError","itemEnd","loader","FileLoader","setPath","setResponseType","setRequestHeader","requestHeader","setWithCredentials","withCredentials","load","gltf","callback","indexOf","splice","json","extensions","plugins","textDecoder","ArrayBuffer","BINARY_EXTENSION_HEADER_MAGIC","EXTENSIONS","KHR_BINARY_GLTF","GLTFBinaryExtension","content","version","GLTFParser","crossOrigin","fileLoader","plugin","extensionsUsed","extensionName","extensionsRequired","KHR_MATERIALS_UNLIT","GLTFMaterialsUnlitExtension","KHR_DRACO_MESH_COMPRESSION","GLTFDracoMeshCompressionExtension","KHR_TEXTURE_TRANSFORM","GLTFTextureTransformExtension","KHR_MESH_QUANTIZATION","GLTFMeshQuantizationExtension","setExtensions","setPlugins","GLTFRegistry","objects","object","remove","removeAll","KHR_LIGHTS_PUNCTUAL","KHR_MATERIALS_CLEARCOAT","KHR_MATERIALS_DISPERSION","KHR_MATERIALS_IOR","KHR_MATERIALS_SHEEN","KHR_MATERIALS_SPECULAR","KHR_MATERIALS_TRANSMISSION","KHR_MATERIALS_IRIDESCENCE","KHR_MATERIALS_ANISOTROPY","KHR_MATERIALS_VOLUME","KHR_TEXTURE_BASISU","KHR_MATERIALS_EMISSIVE_STRENGTH","EXT_MATERIALS_BUMP","EXT_TEXTURE_WEBP","EXT_TEXTURE_AVIF","EXT_MESHOPT_COMPRESSION","EXT_MESH_GPU_INSTANCING","cache","refs","uses","nodeDefs","nodes","nodeIndex","nodeLength","nodeDef","light","_addNodeRef","lightIndex","cacheKey","dependency","lightDef","lights","lightNode","Color","setRGB","LinearSRGBColorSpace","range","DirectionalLight","target","PointLight","distance","SpotLight","spot","innerConeAngle","outerConeAngle","PI","angle","penumbra","decay","assignExtrasToUserData","intensity","createUniqueName","_loadLight","_getNodeRef","getMaterialType","MeshBasicMaterial","materialParams","materialDef","pending","opacity","metallicRoughness","pbrMetallicRoughness","baseColorFactor","baseColorTexture","assignTexture","SRGBColorSpace","all","materialIndex","emissiveStrength","emissiveIntensity","MeshPhysicalMaterial","extension","clearcoatFactor","clearcoat","clearcoatTexture","clearcoatRoughnessFactor","clearcoatRoughness","clearcoatRoughnessTexture","clearcoatNormalTexture","scale","clearcoatNormalScale","Vector2","dispersion","iridescenceFactor","iridescence","iridescenceTexture","iridescenceIor","iridescenceIOR","iridescenceThicknessRange","iridescenceThicknessMinimum","iridescenceThicknessMaximum","iridescenceThicknessTexture","sheenColor","sheenRoughness","sheen","sheenColorFactor","colorFactor","sheenRoughnessFactor","sheenColorTexture","sheenRoughnessTexture","transmissionFactor","transmission","transmissionTexture","thickness","thicknessFactor","thicknessTexture","attenuationDistance","Infinity","colorArray","attenuationColor","ior","specularIntensity","specularFactor","specularTexture","specularColorFactor","specularColor","specularColorTexture","bumpScale","bumpFactor","bumpTexture","anisotropyStrength","anisotropy","anisotropyRotation","anisotropyTexture","textureIndex","textureDef","textures","loadTextureImage","source","isSupported","images","textureLoader","uri","handler","getHandler","detectSupport","loadTexture","image","Image","src","onload","onerror","height","bufferView","bufferViews","extensionDef","getDependency","decoder","supported","res","byteStride","decodeGltfBufferAsync","mode","filter","ready","decodeGltfBuffer","meshDef","meshes","primitive","primitives","WEBGL_CONSTANTS","TRIANGLES","TRIANGLE_STRIP","TRIANGLE_FAN","attributesDef","accessor","createNodeMesh","results","nodeObject","pop","isGroup","instancedMeshes","m","p","q","Quaternion","s","TRANSLATION","fromBufferAttribute","ROTATION","SCALE","setMatrixAt","compose","attributeName","attr","instanceColor","InstancedBufferAttribute","Object3D","prototype","call","assignFinalMaterial","BINARY_EXTENSION_CHUNK_TYPES","body","headerView","chunkContentsLength","chunkView","chunkIndex","chunkLength","chunkType","contentArray","preload","bufferViewIndex","gltfAttributeMap","threeAttributeMap","attributeNormalizedMap","attributeTypeMap","threeAttributeName","ATTRIBUTES","accessorDef","accessors","WEBGL_COMPONENT_TYPES","decodeDracoFile","texture","transform","texCoord","channel","rotation","fromArray","repeat","needsUpdate","GLTFCubicSplineInterpolant","Interpolant","parameterPositions","sampleValues","sampleSize","resultBuffer","valueSize","i1","t0","t","t1","stride2","stride3","td","pp","ppp","offset1","offset0","s2","s3","s0","s1","p0","m0","p1","m1","_q","GLTFCubicSplineQuaternionInterpolant","interpolate_","toArray","FLOAT","FLOAT_MAT3","FLOAT_MAT4","FLOAT_VEC2","FLOAT_VEC3","FLOAT_VEC4","LINEAR","REPEAT","SAMPLER_2D","POINTS","LINES","LINE_LOOP","LINE_STRIP","UNSIGNED_BYTE","UNSIGNED_SHORT","WEBGL_FILTERS","NearestFilter","LinearFilter","NearestMipmapNearestFilter","LinearMipmapNearestFilter","NearestMipmapLinearFilter","LinearMipmapLinearFilter","WEBGL_WRAPPINGS","ClampToEdgeWrapping","MirroredRepeatWrapping","RepeatWrapping","WEBGL_TYPE_SIZES","SCALAR","VEC2","VEC3","VEC4","MAT2","MAT3","MAT4","POSITION","NORMAL","TANGENT","TEXCOORD_0","TEXCOORD_1","TEXCOORD_2","TEXCOORD_3","COLOR_0","WEIGHTS_0","JOINTS_0","PATH_PROPERTIES","translation","weights","INTERPOLATION","CUBICSPLINE","InterpolateLinear","STEP","InterpolateDiscrete","ALPHA_MODES","addUnknownExtensionsToUserData","knownExtensions","objectDef","gltfDef","extras","assign","updateMorphTargets","il","morphTargetInfluences","targetNames","morphTargetDictionary","createPrimitiveKey","primitiveDef","geometryKey","dracoExtension","createAttributesKey","targets","attributesKey","sort","getNormalizedComponentScale","_identityMatrix","associations","primitiveCache","nodeCache","meshCache","cameraCache","lightCache","sourceCache","textureCache","nodeNamesUsed","isSafari","safariVersion","isFirefox","firefoxVersion","navigator","userAgent","safariMatch","match","parseInt","createImageBitmap","TextureLoader","ImageBitmapLoader","setCrossOrigin","_invokeAll","ext","_markDefs","beforeRoot","getDependencies","dependencies","scenes","animations","cameras","afterRoot","updateMatrixWorld","catch","skinDefs","skins","meshDefs","skinIndex","skinLength","joints","isBone","skin","isSkinnedMesh","camera","ref","updateMappings","original","mappings","func","unshift","loadScene","_invokeOne","loadNode","loadMesh","loadAccessor","loadBufferView","loadBuffer","loadMaterial","loadSkin","loadAnimation","loadCamera","defs","def","bufferIndex","bufferDef","buffers","bufferViewDef","accessorIndex","sparse","pendingBufferViews","elementBytes","itemBytes","bufferAttribute","ibSlice","floor","ibCacheKey","ib","InterleavedBuffer","InterleavedBufferAttribute","itemSizeIndices","TypedArrayIndices","byteOffsetIndices","byteOffsetValues","sparseIndices","sparseValues","setX","setY","setZ","setW","sourceIndex","sourceDef","sampler","promise","loadImageSource","flipY","startsWith","samplers","magFilter","minFilter","wrapS","wrapT","generateMipmaps","isCompressedTexture","URL","webkitURL","sourceURI","isObjectURL","blob","Blob","mimeType","createObjectURL","isImageBitmapLoader","imageBitmap","Texture","revokeObjectURL","search","mapName","mapDef","colorSpace","gltfReference","extendTexture","useDerivativeTangents","tangent","useVertexColors","useFlatShading","isPoints","pointsMaterial","PointsMaterial","Material","sizeAttenuation","isLine","lineMaterial","cachedMaterial","vertexColors","flatShading","normalScale","MeshStandardMaterial","materialType","kmuExtension","extendParams","metalness","metallicFactor","roughness","roughnessFactor","metallicRoughnessTexture","extendMaterialParams","doubleSided","side","DoubleSide","alphaMode","transparent","depthWrite","alphaTest","alphaCutoff","normalTexture","occlusionTexture","strength","aoMapIntensity","emissiveFactor","emissive","emissiveTexture","originalName","sanitizedName","PropertyBinding","sanitizeNodeName","createDracoPrimitive","decodePrimitive","addPrimitiveAttributes","cached","geometryPromise","meshIndex","depthTest","FrontSide","loadGeometries","SkinnedMesh","Mesh","normalizeSkinWeights","Line","LineLoop","Points","group","Group","cameraIndex","cameraDef","params","PerspectiveCamera","MathUtils","radToDeg","yfov","aspectRatio","znear","zfar","OrthographicCamera","xmag","ymag","skinDef","_loadNodeShallow","inverseBindMatrices","jointNodes","bones","boneInverses","jointNode","mat","Skeleton","animationIndex","animationDef","animationName","pendingNodes","pendingInputAccessors","pendingOutputAccessors","pendingSamplers","pendingTargets","channels","node","input","parameters","output","inputAccessors","outputAccessors","tracks","inputAccessor","outputAccessor","updateMatrix","createdTracks","_createAnimationTracks","AnimationClip","nodePending","childPending","childrenDef","skeletonPending","skeleton","nodeName","meshPromise","createNodeAttachment","Bone","quaternion","sceneIndex","sceneDef","nodeIds","reducedAssociations","targetName","TypedKeyframeTrack","NumberKeyframeTrack","QuaternionKeyframeTrack","VectorKeyframeTrack","interpolation","outputArray","_getArrayFromAccessor","jl","track","_createCubicSplineTrackInterpolant","scaled","createInterpolant","times","getValueSize","isInterpolantFactoryMethodGLTFCubicSpline","assignAttributeAccessor","gltfAttributeName","ColorManagement","workingColorSpace","box","min","boxScale","maxDisplacement","vector","expandByVector","boundingBox","sphere","Sphere","getCenter","radius","distanceTo","boundingSphere","hasMorphPosition","hasMorphNormal","hasMorphColor","pendingPositionAccessors","pendingNormalAccessors","pendingColorAccessors","pendingAccessor","morphPositions","morphNormals","morphColors","_taskCache","WeakMap","DRACOLoader","decoderPath","decoderConfig","decoderBinary","decoderPending","workerLimit","workerPool","workerNextTaskID","workerSourceURL","defaultAttributeIDs","uv","defaultAttributeTypes","config","attributeIDs","attributeTypes","vertexColorSpace","taskConfig","useUniqueIDs","decodeGeometry","taskKey","cachedTask","worker","taskID","taskCost","geometryPending","_getWorker","_worker","_callbacks","postMessage","id","message","_createGeometry","_releaseTask","geometryData","_assignVertexColorSpace","inputColorSpace","_color","toWorkingColorSpace","setXYZ","g","b","responseType","_initDecoder","useJS","WebAssembly","librariesPending","_loadLibrary","libraries","jsContent","wasmBinary","fn","DRACOWorker","substring","lastIndexOf","join","Worker","_taskCosts","_taskLoad","onmessage","a","log","terminate","decodeAttribute","draco","dracoGeometry","attributeType","numComponents","num_components","numValues","num_points","dataType","DT_FLOAT32","DT_INT8","DT_INT16","DT_INT32","DT_UINT8","DT_UINT16","DT_UINT32","ptr","_malloc","GetAttributeDataArrayForAllPoints","HEAPF32","_free","onModuleLoaded","DracoDecoderModule","module","Decoder","decodingStatus","geometryType","GetEncodedGeometryType","TRIANGULAR_MESH","DecodeArrayToMesh","POINT_CLOUD","PointCloud","DecodeArrayToPointCloud","ok","error_msg","attributeID","GetAttributeByUniqueId","GetAttributeId","GetAttribute","attributeResult","numFaces","num_faces","numIndices","GetTrianglesUInt32Array","destroy","WorkerPool","pool","queue","workers","workersResolve","workerStatus","workerId","workerCreator","addEventListener","_onMessage","msg","transfer","shift","_getIdleWorker","_initWorker","ct","yt","xt","wt","Ft","Ct","te","ae","ge","ue","we","Ae","In","Sn","pi","Ii","vkFormat","typeSize","pixelWidth","pixelHeight","pixelDepth","layerCount","faceCount","supercompressionScheme","levels","dataFormatDescriptor","vendorId","descriptorType","descriptorBlockSize","versionNumber","colorModel","colorPrimaries","transferFunction","flags","texelBlockDimension","bytesPlane","samples","keyValue","globalData","Si","n","_dataView","_littleEndian","_offset","getUint16","_nextUint64","getInt32","Oi","Ti","A","I","B","env","emscripten_notify_memory_growth","exports","memory","Q","fetch","C","instantiate","_init","Buffer","instance","malloc","Number","ZSTD_findDecompressedSize","E","ZSTD_decompress","D","free","_zstd","_activeLoaders","KTX2Loader","transcoderPath","transcoderBinary","transcoderPending","workerConfig","MSC_TRANSCODER","num","setWorkerLimit","astcSupported","hasFeatureAsync","astcHDRSupported","etc1Supported","etc2Supported","dxtSupported","bptcSupported","pvrtcSupported","isWebGPURenderer","hasFeature","getSupportedProfiles","includes","jsLoader","loadAsync","binaryLoader","binaryContent","BasisWorker","EngineFormat","EngineType","TranscoderFormat","BasisFormat","setWorkerCreator","_createTexture","transcodeResult","container","messageType","faces","width","format","dfdFlags","CompressedCubeTexture","mipmaps","CompressedArrayTexture","CompressedTexture","parseColorSpace","premultiplyAlpha","_nextUint32","f","h","U","levelData","uncompressedByteLength","_","_skip","_nextUint16","_nextUint8","bitOffset","bitLength","channelType","samplePosition","sampleLower","sampleUpper","_nextInt32","_scan","_nextUint8Array","u","d","w","imageFlags","rgbSliceByteOffset","rgbSliceByteLength","alphaSliceByteOffset","alphaSliceByteLength","L","v","V","S","F","endpointCount","selectorCount","imageDescs","endpointsData","selectorsData","tablesData","extendedData","isBasisHDR","VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT","FORMAT_MAP","zstd","ZSTDDecoder","init","levelIndex","levelWidth","levelHeight","levelDepth","level","TYPE_MAP","FloatType","HalfFloatType","depth","UNCOMPRESSED_FORMATS","DataTexture","Data3DTexture","texturePending","_createTextureFrom","ETC1S","UASTC","UASTC_HDR","ETC1","ETC2","BC1","BC3","BC4","BC5","BC7_M6_OPAQUE_ONLY","BC7_M5","PVRTC1_4_RGB","PVRTC1_4_RGBA","ASTC_4x4","ATC_RGB","ATC_RGBA_INTERPOLATED_ALPHA","RGBA32","RGB565","BGR565","RGBA4444","BC6H","RGB_HALF","RGBA_HALF","RGBAFormat","RGBA_ASTC_4x4_Format","RGB_BPTC_UNSIGNED_Format","RGBA_BPTC_Format","RGBA_ETC2_EAC_Format","RGBA_PVRTC_4BPPV1_Format","RGBA_S3TC_DXT5_Format","RGB_ETC1_Format","RGB_ETC2_Format","RGB_PVRTC_4BPPV1_Format","RGBA_S3TC_DXT1_Format","UnsignedByteType","BasisModule","_EngineFormat","_EngineType","_TranscoderFormat","_BasisFormat","onRuntimeInitialized","BASIS","initializeBasis","KTX2File","hasAlpha","ktx2File","cleanup","close","isValid","basisFormat","isUASTC","isETC1S","isHDR","getWidth","getHeight","getLayers","levelCount","getLevels","getFaces","getHasAlpha","getDFDFlags","transcoderFormat","engineFormat","engineType","OPTIONS","opt","if","needsPowerOfTwo","isPowerOfTwo","startTranscoding","face","mip","layerMips","mipWidth","mipHeight","layer","levelInfo","getImageLevelInfo","origWidth","origHeight","dst","getImageTranscodedSizeInBytes","status","transcodeImage","mipData","concat","FORMAT_OPTIONS","priorityETC1S","priorityUASTC","priorityHDR","arrays","totalByteLength","RGFormat","RedFormat","VK_FORMAT_R32G32B32A32_SFLOAT","VK_FORMAT_R16G16B16A16_SFLOAT","VK_FORMAT_R8G8B8A8_UNORM","VK_FORMAT_R8G8B8A8_SRGB","VK_FORMAT_R32G32_SFLOAT","VK_FORMAT_R16G16_SFLOAT","VK_FORMAT_R8G8_UNORM","VK_FORMAT_R8G8_SRGB","VK_FORMAT_R32_SFLOAT","VK_FORMAT_R16_SFLOAT","VK_FORMAT_R8_SRGB","VK_FORMAT_R8_UNORM","VK_FORMAT_ASTC_6x6_SRGB_BLOCK","RGBA_ASTC_6x6_Format","VK_FORMAT_ASTC_6x6_UNORM_BLOCK","dfd","NoColorSpace","fetchAndDecodeSubtree","split","response","statusText","handleJSONSubtree","getDirectoryUrl","baseURL","jsonByteLength","getBigUint64","binaryByteLength","jsonStart","jsonEnd","binaryStart","binaryEnd","jsonBuffer","jsonString","trim","bufferFetchPromises","binaryUrl","href","isAvailable","availability","constant","bitstream","isAvailable2","bitIndex","isTileAvailable","address","computeQuadtreeIndex","computeOctreeIndex","tileAvailability","isContentAvailable","contentAvailability","isChildSubtreeAvailable","childSubtreeAvailability","decodeSubtreeBinary","cleanUrl","part1By1","pow","part1By2","subtreeMap","resolveImplicite","rootTile","root","implicitTiling","contents","isQuad","subdivisionScheme","toUpperCase","subtreeUriTemplate","subtrees","contentURITemplates","rootURL","subtreeUri","replace","globalAddress","localAddress","subtree","contentURI","explicitTileset","geometricError","boundingVolume","refine","getChildren","buildChildren","parent","availableLevels","subtreeLevels","localAddresses","getChildrenAddresses","globalAddresses","boundingVolumes","computeBoundingVolumes","childLocalAddress","childGlobalAddress","newSubtree","newLocalAddress","contentURITemplate","tileAddress","nextLevel","rootBoundingVolume","addresses","computeBoundingVolume","region","rootRegion","west","south","east","north","minHeight","maxHeight","xStep","yStep","zStep","newWest","newSouth","newEast","newNorth","newMinHeight","newMaxHeight","vectors","scaleFactors","newVectors","component","origin","newCenter","wasmpack","ch","charCodeAt","write","__wasm_call_ctors","meshopt_encodeVertexVersion","meshopt_encodeIndexVersion","cond","bytes","view","encode","fun","bound","sbrk","tp","sp","heap","subarray","maxindex","index32","bits","insize","MeshoptDecoder","detector","wasm","validate","unpack","count4","filters","NONE","OCTAHEDRAL","QUATERNION","EXPONENTIAL","decoders","INDICES","requestId","createWorker","requests","event","action","workerProcess","useWorkers","decodeVertexBuffer","meshopt_decodeVertexBuffer","decodeIndexBuffer","meshopt_decodeIndexBuffer","decodeIndexSequence","meshopt_decodeIndexSequence","simplifyPoints","vertex_positions","vertex_count","vertex_positions_stride","vertex_colors","vertex_colors_stride","color_weight","target_vertex_count","ti","sc","simplifyOptions","LockBorder","concurrentDownloads","TileLoader","maxCachedItems","proxy","pointsCallback","setDRACOLoader","setDecoderPath","setKTX2Loader","setTranscoderPath","setMeshoptDecoder","hasMeshOptDecoder","b3dmDecoder","splatsDecoder","downloads","nextReady","nextDownloads","_download","_loadBatch","_getNextDownloads","nextDownload","shouldDoDownload","doDownload","distanceFunction","getSiblings","_getNextReady","tile","smallestDistance","POSITIVE_INFINITY","closest","closestItem","highestLevel","lowestLevel","MAX_SAFE_INTEGER","lowestIndex","dist","loadingStrategy","siblings","abortController","tileIdentifier","sceneZupToYup","_simplifyPath","realAbortController","AbortController","signal","abort","_meshReceived","downloadFunction","fetchFunction","method","resultArrayBuffer","put","_checkSize","finally","parseSplats","code","_scheduleDownload","aborted","temp","entry","reg","isSplatsBatch","main_path","parts","new_path","part","assertPath","normalizeStringPosix","allowAboveRoot","lastSegmentLength","lastSlash","dots","lastSlashIndex","posix","cwd","resolvedPath","resolvedAbsolute","process","isAbsolute","trailingSeparator","joined","arg","relative","to","fromStart","fromEnd","fromLen","toStart","toLen","lastCommonSep","fromCode","out","_makeLong","dirname","hasRoot","end","matchedSlash","basename","extIdx","firstNonSlashEnd","extname","startDot","startPart","preDotState","pathObject","sep","dir","base","ret","delimiter","win32","DFSOperation","pathBrowserify","IterableElementBase","_toElementFn","toElementFn","Symbol","iterator","args","_getIterator","predicate","thisArg","callbackfn","element","ele","initialValue","accumulator","print","toVisual","Heap","_elements","_DEFAULT_COMPARATOR","_comparator","comparator","el","leaf","heapify","_bubbleUp","last","_sinkDown","peek","fix","poll","_dfs","left","right","visitedNode","cloned","top","filteredList","current","mappedHeap","parentItem","halfLength","minItem","PriorityQueue","filteredPriorityQueue","mappedPriorityQueue","MinPriorityQueue","tmpVector","tmpVector2","zUpToYUpMatrix3x3","SplatsMesh","fragShader","ceil","textureSize","maxSplats","colorRenderTarget","WebGL3DRenderTarget","depthBuffer","resolveDepthBuffer","initRenderTarget","positionRenderTarget","cov1RenderTarget","cov2RenderTarget","ShaderMaterial","uniforms","numSlices","cov1Texture","cov2Texture","colorTexture","positionTexture","sizeMultiplier","cropRadius","MAX_VALUE","cameraNear","cameraFar","computeLinearDepth","vertexShader","splatsVertexShader","fragmentShader","splatsFragmentShader","InstancedBufferGeometry","vertices","orderAttribute","setUsage","DynamicDrawUsage","instanceCount","numTextures","sortID","freeAddresses","WorkerConstructor","sortListeners","newOrder","clearUpdateRanges","addUpdateRange","cameraPosition","rotateOnAxis","frustumCulled","copyMaterial2D","sourceTexture","vertexCopyShader","copyMaterial3D","copyCamera","copyScene","Scene","copyGeometry","PlaneGeometry","copyQuad","matrixAutoUpdate","document","growTextures","scissorBox","prevAutoClear","autoClear","prevRenderTarget","getRenderTarget","scissorWidth","scissorHeight","viewport","setRenderTarget","render","numLayers","xyz","equals","raycaster","intersects","cov2","positionArray","isInterleavedBuffer","numBatches","textureAddresses","pointManagerAddresses","raycast","positionsOnly","threshold","threshSquared","direction","distanceSqToPoint","isNaN","startIndex","addSplatsBatch","insertionIndexes","visible","hide","show","positionsStartIndex","colorsArray","cov1Array","cov2Array","arrayIndexBase4","positionIndex","getY","getZ","getW","destTextureLayer","srcHeight","scissor","batchPositionTexture","initTexture","copyTex2D","batchColorTexture","batchCov1Texture","batchCov2Texture","newNumTextures","copyTex3D","copyrightDiv","tempSphere","tempOBB","tempVec1","tempVec2","upVector","tempRay","inverseWorld","Frustum","transformedCameraPosition","tempIntersects","tempQuaternion","copyright","getOGC3DTilesCopyrightInfo","list","hasOwnProperty","OGC3DTile","properties","contentURL","domWidth","domHeight","rendererSize","distanceBias","drawBoundingVolume","displayErrors","displayCopyright","queryParams","uuidv4","tileLoader","tileLoaderOptions","points","update","geometricErrorMultiplier","splatsCropRadius","splatsSizeMultiplier","loadOutsideView","cameraOnLoad","parentTile","occlusionCullingService","static","setHex","colorID","clamp","matrixWorldAutoUpdate","childrenTiles","meshContent","tileContent","rootPath","materialVisibility","hasMeshContent","hasUnloadedJSONContent","centerModel","onLoadCallback","_setup","props","path.dirname","_showError","setSplatsSizeMultiplier","setSplatsCropRadius","updateMatrices","isObject3D","parentRefine","parentGeometricError","_transformWGS84ToCartesian","lerp","parentBoundingVolume","_checkContent","_load","setFromUnitVectors","applyQuaternion","isSetup","bbox","Box3Helper","helper","endsWith","rootUrl","rootParts","pathname","relativeParts","protocol","host","urlObj","searchParams","loadJson","deleted","loadContent","promises","contentIndex","urlRegex","_assembleURL","path.isAbsolute","path.sep","_extractQueryParams","_updateCopyrightLabel","layers","disable","Float32BufferAttribute","_calculateDistanceToCamera","_getSiblings","jsonRequested","mc","splat","invalidate","dispatchEvent","_disposeMeshContent","intersection","intersectsRay","intersectsSphere","splatsReady","setFromProjectionMatrix","multiplyMatrices","projectionMatrix","matrixWorldInverse","numTiles","numTilesRendered","maxLOD","percentageLoaded","_updateImmediate","_statsImmediate","_update","_stats","numTilesLoaded","_computeMetricRecursive","_updateNodeVisibilityImmediate","_expandTreeImmediate","shouldBeVisible","metric","_shouldBeVisibleUpdateImmediate","_trimTreeImmediate","_loadMeshImmediate","_disposeChildren","parentDisplaysMesh","_changeContentVisibility","allChildrenReady","every","_isReadyImmediate","_setShouldNotBeVisibleRecursive","_calculateUpdateMetric","hasID","_loadJsonChildren","visibilityBeforeUpdate","inFrustum","_isReady","_areAllChildrenLoadedAndHidden","childJSON","childTile","allLoadedAndHidden","visibility","enable","near","getMaxScaleOnAxis","getDrawingBufferSize","fov","aspect","lambda","tan","window","devicePixelRatio","tiles","setGeometricErrorMultiplier","setDistanceBias","lon","lat","sfct","N","sin","cosLat","cos","cosLon","sinLat","nPh","errorDiv","createElement","textContent","style","padding","backgroundColor","zIndex","appendChild","setTimeout","bottom","textShadow","listString","InstancedTile","master","jsonChildren","refinement","setup","parentRefinement","premultiply","decompose","matrixWorldNeedsUpdate","transformWGS84ToCartesian","checkContent","absoluteURL","absolutePath","assembleURL","extractQueryParams","calculateDistanceToCamera","updateNodeVisibility","changeContentVisibility","isReady","calculateUpdateMetric","disposeChildren","areAllChildrenLoadedAndHidden","meshesToDisplay","meshesDisplayed","_renderSize","InstancedOGC3DTile","tileset","MeshTile","instancedTiles","reuseableMatrix","instancedTile","added","listOMesh","addToScene","instanceMatrix","onAfterRender","displayedOnce","getCount","JsonTile","instanceTile","_checkLoaderInitialized","maxInstances","parseB3DMInstanced","setObject","nextready","instancedOGC3DTile","cachedTile","addInstance","download","cullMap","cullMaterial","cullTarget","_createCullTarget","cullPixels","WebGLRenderTarget","innerWidth","innerHeight","stencilBuffer","depthTexture","DepthTexture","DepthFormat","UnsignedShortType","tempRenderTarget","tempOverrideMaterial","overrideMaterial","readRenderTargetPixels"],"mappings":"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","x_google_ignoreList":[3,5,6,7,8,9,11,12,13,14,15,16,17,20,21,22,24,25,26,27,28,29]}