gltf-parser-plugin 1.1.3 → 1.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/gltf-parser-plugin.module.js +540 -292
- package/build/gltf-parser-plugin.module.js.map +1 -1
- package/build/index.d.ts +29 -49
- package/package.json +47 -47
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gltf-parser-plugin.module.js","sources":["../src/mesh-helper/FeatureIdUniforms.ts","../src/mesh-helper/idmap.ts","../src/mesh-helper/intersection.ts","../src/mesh-helper/mesh.ts","../src/MeshCollector.ts","../src/utils/build-textures.ts","../src/utils/build-materials.ts","../src/utils/build-mesh-primitives.ts","../src/utils/worker-pool.ts","../node_modules/.pnpm/three@0.183.2/node_modules/three/examples/jsm/postprocessing/Pass.js","../node_modules/.pnpm/3d-tiles-renderer@0.4.22_three@0.183.2/node_modules/3d-tiles-renderer/build/WMSCapabilitiesLoader-DngSzqI4.js","../src/GLTFWorkerLoader.ts","../src/db/tile-cache.ts","../src/GLTFParserPlugin.ts"],"sourcesContent":["import type { GLTFParserPlugin } from \"../GLTFParserPlugin\";\r\nimport { Mesh } from \"three\";\r\n\r\nexport class FeatureIdUniforms {\r\n mesh: Mesh;\r\n plugin: GLTFParserPlugin;\r\n\r\n constructor(mesh: Mesh, plugin: GLTFParserPlugin) {\r\n this.mesh = mesh;\r\n this.plugin = plugin;\r\n }\r\n\r\n get value() {\r\n const idMap = this.mesh.userData.idMap;\r\n\r\n if (!idMap) {\r\n return new Array(this.plugin.getFeatureIdCount()).fill(-1);\r\n }\r\n\r\n const result = new Array(this.plugin.getFeatureIdCount()).fill(-1);\r\n for (let i = 0; i < this.plugin.oids.length; i++) {\r\n const oid = this.plugin.oids[i];\r\n const featureId = idMap[oid];\r\n result[i] = featureId !== undefined ? featureId : -1;\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n","import { Object3D } from \"three\";\r\n\r\nconst FEATURE_INDEX = 0;\r\n\r\n/**\r\n * Build mapping relationship from OID to FeatureId\r\n * @param scene Scene object\r\n */\r\nfunction buildOidToFeatureIdMap(scene: Object3D): void {\r\n scene.traverse((meshObject: Object3D) => {\r\n const { meshFeatures, structuralMetadata } = meshObject.userData;\r\n\r\n if (meshFeatures && structuralMetadata) {\r\n const { geometry, featureIds } = meshFeatures;\r\n const featureIdConfig = featureIds[FEATURE_INDEX];\r\n const featureAttribute = geometry.getAttribute(\r\n `_feature_id_${featureIdConfig.attribute}`\r\n );\r\n\r\n const processedFeatureIds = new Set<number>();\r\n const oidToFeatureIdMap: Record<number, number> = {};\r\n\r\n for (\r\n let vertexIndex = 0;\r\n vertexIndex < featureAttribute.count;\r\n vertexIndex++\r\n ) {\r\n const currentFeatureId = featureAttribute.getX(vertexIndex);\r\n\r\n if (processedFeatureIds.has(currentFeatureId)) {\r\n continue;\r\n }\r\n\r\n const featureData = structuralMetadata.getPropertyTableData(\r\n featureIdConfig.propertyTable,\r\n currentFeatureId\r\n );\r\n\r\n oidToFeatureIdMap[featureData._oid] = currentFeatureId;\r\n processedFeatureIds.add(currentFeatureId);\r\n }\r\n\r\n processedFeatureIds.clear();\r\n meshObject.userData.idMap = oidToFeatureIdMap;\r\n }\r\n });\r\n}\r\n\r\nexport { buildOidToFeatureIdMap };\r\n","import { Intersection, Mesh, Triangle, Vector3 } from \"three\";\r\n\r\n/**\r\n * Hit object feature information interface\r\n */\r\nexport interface FeatureInfo {\r\n oid?: number;\r\n featureId?: number;\r\n features?: number[];\r\n propertyData?: object;\r\n isValid: boolean;\r\n error?: string;\r\n}\r\n\r\n/**\r\n * General function for extracting OID and feature information from raycaster hit objects\r\n * @param hit - hit object returned by raycaster.intersectObject\r\n * @returns FeatureInfo object containing OID and other feature information\r\n */\r\nexport function queryFeatureFromIntersection(hit: Intersection): FeatureInfo {\r\n const result: FeatureInfo = {\r\n isValid: false,\r\n };\r\n\r\n try {\r\n if (!hit || !hit.object) {\r\n result.error = \"Invalid hit object\";\r\n return result;\r\n }\r\n\r\n const { object, face, point, faceIndex } = hit;\r\n const { meshFeatures, structuralMetadata } = object.userData;\r\n\r\n if (!(object instanceof Mesh)) {\r\n result.error = \"Hit object is not a Mesh\";\r\n return result;\r\n }\r\n\r\n if (!meshFeatures || !structuralMetadata) {\r\n result.error = \"No mesh features or structural metadata found\";\r\n return result;\r\n }\r\n\r\n const barycoord = new Vector3();\r\n if (face && point) {\r\n const triangle = new Triangle();\r\n triangle.setFromAttributeAndIndices(\r\n object.geometry.attributes.position,\r\n face.a,\r\n face.b,\r\n face.c\r\n );\r\n triangle.a.applyMatrix4(object.matrixWorld);\r\n triangle.b.applyMatrix4(object.matrixWorld);\r\n triangle.c.applyMatrix4(object.matrixWorld);\r\n triangle.getBarycoord(point, barycoord);\r\n } else {\r\n barycoord.set(0, 0, 0);\r\n }\r\n\r\n const features = meshFeatures.getFeatures(faceIndex, barycoord);\r\n if (!features || features.length === 0) {\r\n result.error = \"No features found at hit location\";\r\n return result;\r\n }\r\n\r\n result.features = features;\r\n\r\n const { featureIds } = meshFeatures;\r\n if (!featureIds || featureIds.length === 0) {\r\n result.error = \"Feature IDs not available\";\r\n return result;\r\n }\r\n\r\n const featureId = featureIds[0];\r\n const fid = features[0];\r\n result.featureId = fid;\r\n\r\n const propertyData = structuralMetadata.getPropertyTableData(\r\n featureId.propertyTable,\r\n fid\r\n );\r\n\r\n result.propertyData = propertyData;\r\n\r\n if (propertyData && propertyData._oid !== undefined) {\r\n result.oid = propertyData._oid;\r\n result.isValid = true;\r\n } else {\r\n result.error = \"OID not found in property data\";\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n result.error = `Error extracting OID: ${\r\n error instanceof Error ? error.message : String(error)\r\n }`;\r\n return result;\r\n }\r\n}\r\n","import { BufferAttribute, BufferGeometry, Mesh, Object3D } from \"three\";\r\n\r\nimport { TilesRenderer } from \"3d-tiles-renderer\";\r\n\r\n/**\r\n * 预建featureId到顶点索引的映射表,提高查询性能\r\n */\r\nfunction buildFeatureIdIndexMap(\r\n featureIdAttr: BufferAttribute\r\n): Map<number, Set<number>> {\r\n const featureIdMap = new Map<number, Set<number>>();\r\n\r\n for (let i = 0; i < featureIdAttr.count; i++) {\r\n const featureId = featureIdAttr.getX(i);\r\n\r\n if (!featureIdMap.has(featureId)) {\r\n featureIdMap.set(featureId, new Set<number>());\r\n }\r\n featureIdMap.get(featureId)!.add(i);\r\n }\r\n\r\n return featureIdMap;\r\n}\r\n\r\n/**\r\n * Create a geometry for a specified feature ID\r\n */\r\nfunction createGeometryForFeatureId(\r\n originalGeometry: BufferGeometry,\r\n featureIdMap: Map<number, Set<number>>,\r\n targetFeatureId: number\r\n): BufferGeometry | null {\r\n const newGeometry = new BufferGeometry();\r\n\r\n const targetVertexIndices = featureIdMap.get(targetFeatureId);\r\n\r\n if (!targetVertexIndices || targetVertexIndices.size === 0) {\r\n return null;\r\n }\r\n\r\n const attributes = originalGeometry.attributes;\r\n for (const attributeName in attributes) {\r\n newGeometry.setAttribute(attributeName, attributes[attributeName]);\r\n }\r\n\r\n if (originalGeometry.index) {\r\n const originalIndex = originalGeometry.index.array;\r\n const newIndices: number[] = [];\r\n\r\n for (let i = 0; i < originalIndex.length; i += 3) {\r\n const a = originalIndex[i];\r\n const b = originalIndex[i + 1];\r\n const c = originalIndex[i + 2];\r\n\r\n if (\r\n targetVertexIndices.has(a) &&\r\n targetVertexIndices.has(b) &&\r\n targetVertexIndices.has(c)\r\n ) {\r\n newIndices.push(a, b, c);\r\n }\r\n }\r\n\r\n if (newIndices.length > 0) {\r\n newGeometry.setIndex(newIndices);\r\n }\r\n }\r\n\r\n return newGeometry;\r\n}\r\n\r\n/**\r\n * Function to split mesh by feature ID\r\n */\r\nfunction splitMeshByOid(originalMesh: Mesh, oid: number): Mesh[] {\r\n const { meshFeatures, structuralMetadata } = originalMesh.userData;\r\n const { geometry, featureIds } = meshFeatures;\r\n\r\n const featureId = featureIds[0];\r\n const featureIdAttr = geometry.getAttribute(\r\n `_feature_id_${featureId.attribute}`\r\n );\r\n\r\n if (!featureIdAttr) {\r\n console.warn(\"No feature ID attribute found\");\r\n return [];\r\n }\r\n\r\n const featureIdMap = buildFeatureIdIndexMap(featureIdAttr);\r\n\r\n const currentBatchMeshes: Mesh[] = [];\r\n\r\n for (const [fid] of featureIdMap) {\r\n try {\r\n let _oid = null;\r\n let propertyData = null;\r\n\r\n if (structuralMetadata) {\r\n try {\r\n propertyData = structuralMetadata.getPropertyTableData(\r\n featureId.propertyTable,\r\n fid\r\n );\r\n _oid = (propertyData as any)?._oid;\r\n\r\n if (_oid === oid) {\r\n const newGeometry = createGeometryForFeatureId(\r\n geometry,\r\n featureIdMap,\r\n fid\r\n );\r\n\r\n if (newGeometry && newGeometry.attributes.position.count > 0) {\r\n const newMaterial = (originalMesh.material as any).clone();\r\n\r\n const newMesh = new Mesh(newGeometry, newMaterial);\r\n newMesh.parent = originalMesh.parent;\r\n newMesh.position.copy(originalMesh.position);\r\n newMesh.rotation.copy(originalMesh.rotation);\r\n newMesh.scale.copy(originalMesh.scale);\r\n newMesh.matrixWorld.copy(originalMesh.matrixWorld);\r\n\r\n newMesh.userData = {\r\n ...originalMesh.userData,\r\n featureId: fid,\r\n oid: oid,\r\n originalMesh: originalMesh,\r\n propertyData: propertyData,\r\n isSplit: true,\r\n };\r\n\r\n newMesh.name = `feature_${fid}_${oid || \"\"}`;\r\n currentBatchMeshes.push(newMesh);\r\n }\r\n }\r\n } catch (e) {\r\n console.warn(`Failed to get property data for feature ${fid}:`, e);\r\n }\r\n }\r\n } catch (error) {\r\n console.warn(`Error creating mesh for feature ${fid}:`, error);\r\n }\r\n }\r\n\r\n return currentBatchMeshes;\r\n}\r\n\r\n/**\r\n * 根据OID获取包含该OID的瓦片mesh\r\n */\r\nexport function getTileMeshesByOid(tiles: TilesRenderer, oid: number): Mesh[] {\r\n const tileMeshes: Mesh[] = [];\r\n\r\n tiles.group.traverse((child: Object3D) => {\r\n const mesh = child as Mesh;\r\n\r\n if (\r\n mesh.userData.meshFeatures &&\r\n mesh.userData.structuralMetadata &&\r\n !mesh.userData.isSplit\r\n ) {\r\n if (checkMeshContainsOid(mesh, oid)) {\r\n tileMeshes.push(mesh);\r\n }\r\n }\r\n });\r\n\r\n return tileMeshes;\r\n}\r\n\r\nfunction checkMeshContainsOid(mesh: Mesh, oid: number): boolean {\r\n const idMap = mesh.userData.idMap;\r\n\r\n if (!idMap) {\r\n return false;\r\n }\r\n\r\n return idMap[oid] !== undefined;\r\n}\r\n\r\n/**\r\n * 获取分割后的mesh\r\n */\r\nexport function getSplitMeshesFromTile(tileMesh: Mesh, oid: number): Mesh[] {\r\n let meshes: Mesh[] = [];\r\n\r\n try {\r\n const splitMeshes = splitMeshByOid(tileMesh, oid);\r\n meshes = [...meshes, ...splitMeshes];\r\n } catch (error) {\r\n console.warn(`拆分mesh失败:`, error);\r\n }\r\n\r\n return meshes;\r\n}\r\n","import { EventDispatcher, Mesh } from \"three\";\r\n\r\nexport interface MeshHelperHost {\r\n _registerCollector(collector: MeshCollector): void;\r\n _unregisterCollector(collector: MeshCollector): void;\r\n _getMeshesByOidInternal(oid: number): Mesh[];\r\n}\r\n\r\nexport interface MeshChangeEvent {\r\n type: \"mesh-change\";\r\n meshes: Mesh[];\r\n}\r\n\r\nexport type MeshCollectorEventMap = {\r\n \"mesh-change\": MeshChangeEvent;\r\n};\r\n\r\n/**\r\n * MeshCollector - 用于监听和收集特定 oid 对应的 mesh\r\n * 随着瓦片变化,会自动更新 meshes 并触发 mesh-change 事件\r\n */\r\nexport class MeshCollector extends EventDispatcher<MeshCollectorEventMap> {\r\n private oid: number;\r\n private plugin: MeshHelperHost;\r\n private _meshes: Mesh[] = [];\r\n private _disposed: boolean = false;\r\n\r\n constructor(oid: number, plugin: MeshHelperHost) {\r\n super();\r\n this.oid = oid;\r\n this.plugin = plugin;\r\n\r\n plugin._registerCollector(this);\r\n\r\n this._updateMeshes();\r\n }\r\n\r\n get meshes(): Mesh[] {\r\n return this._meshes;\r\n }\r\n\r\n _updateMeshes(): void {\r\n if (this._disposed) return;\r\n\r\n const newMeshes = this.plugin._getMeshesByOidInternal(this.oid);\r\n\r\n const hasChanged =\r\n newMeshes.length !== this._meshes.length ||\r\n newMeshes.some((mesh: Mesh, i: number) => mesh !== this._meshes[i]);\r\n\r\n if (hasChanged) {\r\n this._meshes = newMeshes;\r\n this.dispatchEvent({ type: \"mesh-change\", meshes: this._meshes });\r\n }\r\n }\r\n\r\n getOid(): number {\r\n return this.oid;\r\n }\r\n\r\n dispose(): void {\r\n if (this._disposed) return;\r\n this._disposed = true;\r\n this.plugin._unregisterCollector(this);\r\n this._meshes = [];\r\n }\r\n}\r\n","import {\n DataTexture,\n RGBAFormat,\n SRGBColorSpace,\n Texture,\n UnsignedByteType,\n} from \"three\";\nimport type { GLTFWorkerData } from \"../types\";\n\nexport interface TextureBuildResult {\n textureMap: Map<number, Texture>;\n textureArray: (Texture | null)[];\n}\n\n/**\n * Build textures from GLTF data\n */\nexport function buildTextures(data: GLTFWorkerData): TextureBuildResult {\n const textureMap = new Map<number, Texture>();\n const textureArray: (Texture | null)[] = [];\n\n if (!data.textures) {\n return { textureMap, textureArray };\n }\n\n for (const [index, textureData] of data.textures.entries()) {\n if (textureData.image && textureData.image.array) {\n const imageData = textureData.image;\n const tex = new DataTexture(\n imageData.array,\n imageData.width,\n imageData.height,\n RGBAFormat,\n UnsignedByteType,\n );\n tex.flipY = false;\n tex.colorSpace = SRGBColorSpace;\n tex.needsUpdate = true;\n textureMap.set(index, tex);\n textureArray[index] = tex;\n continue;\n }\n\n // Default empty texture\n const texture = new Texture();\n texture.flipY = false;\n textureMap.set(index, texture);\n textureArray[index] = texture;\n }\n\n return { textureMap, textureArray };\n}\n","import {\r\n DoubleSide,\r\n FrontSide,\r\n Material,\r\n MeshStandardMaterial,\r\n Texture,\r\n} from \"three\";\r\nimport type { GLTFWorkerData, MaterialBuilder } from \"../types\";\r\n\r\n/**\r\n * Build materials from GLTF data\r\n */\r\nexport function buildMaterials(\r\n data: GLTFWorkerData,\r\n textureMap: Map<number, Texture>,\r\n customMaterialBuilder?: MaterialBuilder,\r\n): Map<number, Material> {\r\n const materialMap = new Map<number, Material>();\r\n\r\n if (!data.materials) {\r\n return materialMap;\r\n }\r\n\r\n const materialBuilder = customMaterialBuilder || defaultMaterialBuilder;\r\n\r\n for (const [index, matData] of data.materials.entries()) {\r\n const material = materialBuilder(matData, textureMap);\r\n\r\n materialMap.set(index, material);\r\n }\r\n\r\n return materialMap;\r\n}\r\n\r\nfunction defaultMaterialBuilder(\r\n matData: any,\r\n textureMap: Map<number, Texture>,\r\n): Material {\r\n const material = new MeshStandardMaterial();\r\n\r\n // PBR material properties\r\n if (matData.pbrMetallicRoughness) {\r\n const pbr = matData.pbrMetallicRoughness;\r\n\r\n // Base color\r\n if (pbr.baseColorFactor) {\r\n material.color.setRGB(\r\n pbr.baseColorFactor[0],\r\n pbr.baseColorFactor[1],\r\n pbr.baseColorFactor[2],\r\n );\r\n if (pbr.baseColorFactor[3] !== undefined) {\r\n material.opacity = pbr.baseColorFactor[3];\r\n if (material.opacity < 1) material.transparent = true;\r\n }\r\n }\r\n\r\n // Base color texture\r\n if (pbr.baseColorTexture && pbr.baseColorTexture.index !== undefined) {\r\n const tex = textureMap.get(pbr.baseColorTexture.index);\r\n if (tex) {\r\n material.map = tex;\r\n }\r\n }\r\n\r\n // Metalness and roughness\r\n material.metalness =\r\n pbr.metallicFactor !== undefined ? pbr.metallicFactor : 1.0;\r\n material.roughness =\r\n pbr.roughnessFactor !== undefined ? pbr.roughnessFactor : 1.0;\r\n\r\n // Metallic roughness texture\r\n if (\r\n pbr.metallicRoughnessTexture &&\r\n pbr.metallicRoughnessTexture.index !== undefined\r\n ) {\r\n const tex = textureMap.get(pbr.metallicRoughnessTexture.index);\r\n if (tex) {\r\n material.metalnessMap = material.roughnessMap = tex;\r\n }\r\n }\r\n }\r\n\r\n // Normal map\r\n if (matData.normalTexture && matData.normalTexture.index !== undefined) {\r\n const tex = textureMap.get(matData.normalTexture.index);\r\n if (tex) {\r\n material.normalMap = tex;\r\n if (matData.normalTexture.scale !== undefined) {\r\n material.normalScale.set(\r\n matData.normalTexture.scale,\r\n matData.normalTexture.scale,\r\n );\r\n }\r\n }\r\n }\r\n\r\n // Occlusion map\r\n if (\r\n matData.occlusionTexture &&\r\n matData.occlusionTexture.index !== undefined\r\n ) {\r\n const tex = textureMap.get(matData.occlusionTexture.index);\r\n if (tex) {\r\n material.aoMap = tex;\r\n }\r\n }\r\n\r\n // Emissive\r\n if (matData.emissiveTexture && matData.emissiveTexture.index !== undefined) {\r\n const tex = textureMap.get(matData.emissiveTexture.index);\r\n if (tex) {\r\n material.emissiveMap = tex;\r\n }\r\n }\r\n if (matData.emissiveFactor) {\r\n material.emissive.setRGB(\r\n matData.emissiveFactor[0],\r\n matData.emissiveFactor[1],\r\n matData.emissiveFactor[2],\r\n );\r\n }\r\n\r\n // Double sided rendering\r\n material.side = matData.doubleSided ? DoubleSide : FrontSide;\r\n\r\n // Alpha mode\r\n if (matData.alphaMode === \"BLEND\") {\r\n material.transparent = true;\r\n } else if (matData.alphaMode === \"MASK\") {\r\n material.alphaTest =\r\n matData.alphaCutoff !== undefined ? matData.alphaCutoff : 0.5;\r\n }\r\n\r\n return material;\r\n}\r\n","import { BufferAttribute, BufferGeometry, Material, MeshStandardMaterial } from \"three\";\r\nimport type { GLTFWorkerData, PrimitiveExtensions } from \"../types\";\r\n\r\nexport interface PrimitiveData {\r\n geometry: BufferGeometry;\r\n material: Material;\r\n primitiveIndex: number;\r\n extensions?: PrimitiveExtensions;\r\n}\r\n\r\n/**\r\n * Build Mesh Primitives from GLTF data\r\n */\r\nexport function buildMeshPrimitives(\r\n data: GLTFWorkerData,\r\n materialMap: Map<number, Material>,\r\n defaultMaterial: Material,\r\n): Map<number, PrimitiveData[]> {\r\n const meshMap = new Map<number, PrimitiveData[]>();\r\n\r\n if (!data.meshes) {\r\n return meshMap;\r\n }\r\n\r\n for (const meshIndex in data.meshes) {\r\n const meshData = data.meshes[meshIndex];\r\n const primitiveDataList: PrimitiveData[] = [];\r\n const primitives = meshData.primitives;\r\n\r\n for (\r\n let primitiveIndex = 0;\r\n primitiveIndex < primitives.length;\r\n primitiveIndex++\r\n ) {\r\n const primitive = primitives[primitiveIndex];\r\n const geometry = new BufferGeometry();\r\n\r\n // Handle vertex attributes\r\n if (primitive.attributes) {\r\n // Position\r\n const posData = primitive.attributes.POSITION;\r\n if (posData && posData.array) {\r\n geometry.setAttribute(\r\n \"position\",\r\n new BufferAttribute(posData.array, posData.itemSize || 3),\r\n );\r\n }\r\n\r\n // Normal\r\n const normalData = primitive.attributes.NORMAL;\r\n if (normalData && normalData.array) {\r\n geometry.setAttribute(\r\n \"normal\",\r\n new BufferAttribute(normalData.array, normalData.itemSize || 3),\r\n );\r\n }\r\n\r\n // UV coordinates\r\n const uvData = primitive.attributes.TEXCOORD_0;\r\n if (uvData && uvData.array) {\r\n geometry.setAttribute(\r\n \"uv\",\r\n new BufferAttribute(uvData.array, uvData.itemSize || 2),\r\n );\r\n }\r\n\r\n // Vertex color\r\n const colorData = primitive.attributes.COLOR_0;\r\n if (colorData && colorData.array) {\r\n geometry.setAttribute(\r\n \"color\",\r\n new BufferAttribute(colorData.array, colorData.itemSize || 3),\r\n );\r\n }\r\n\r\n // Tangent\r\n const tangentData = primitive.attributes.TANGENT;\r\n if (tangentData && tangentData.array) {\r\n geometry.setAttribute(\r\n \"tangent\",\r\n new BufferAttribute(tangentData.array, tangentData.itemSize || 4),\r\n );\r\n }\r\n\r\n // Feature ID attribute (for EXT_mesh_features)\r\n for (const attrName in primitive.attributes) {\r\n if (attrName.startsWith(\"_FEATURE_ID_\")) {\r\n const featureIdData = primitive.attributes[attrName];\r\n if (featureIdData && featureIdData.array) {\r\n const normalizedName = attrName\r\n .toLowerCase()\r\n .replace(\"_feature_id_\", \"_feature_id_\");\r\n geometry.setAttribute(\r\n normalizedName,\r\n new BufferAttribute(\r\n featureIdData.array,\r\n featureIdData.itemSize || 1,\r\n ),\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Indices\r\n const indexData = primitive.indices;\r\n if (indexData && indexData.array) {\r\n geometry.setIndex(new BufferAttribute(indexData.array, 1));\r\n }\r\n\r\n // Get material\r\n const material =\r\n primitive.material !== undefined\r\n ? materialMap.get(primitive.material) || defaultMaterial\r\n : defaultMaterial;\r\n\r\n if (!geometry.hasAttribute(\"normal\") && material instanceof MeshStandardMaterial) {\r\n material.flatShading = true;\r\n }\r\n\r\n primitiveDataList.push({\r\n geometry,\r\n material,\r\n primitiveIndex,\r\n extensions: primitive.extensions,\r\n });\r\n }\r\n\r\n meshMap.set(Number(meshIndex), primitiveDataList);\r\n }\r\n\r\n return meshMap;\r\n}\r\n","// Import inline Worker (Vite will compile and bundle the worker code into a base64 data URL)\r\nimport GLTFWorkerClass from \"../worker/index?worker&inline\";\r\n\r\n// Worker pool management\r\nlet workerPool: Worker[] = [];\r\nlet maxWorkers = 1;\r\nlet currentWorkerIndex = 0;\r\n\r\n// ---- Global schema cache (shared across all workers) ----\r\n\r\nconst schemaCache = new Map<string, Promise<any>>();\r\n\r\n/**\r\n * Clear the global schema cache.\r\n */\r\nexport function clearSchemaCache(): void {\r\n schemaCache.clear();\r\n}\r\n\r\n/**\r\n * Attach a schema request handler to a Worker.\r\n * When the worker sends a { type: \"fetchSchema\" } message,\r\n * the main thread fetches (with deduplication via cache) and replies with the result.\r\n */\r\nfunction setupSchemaHandler(worker: Worker): void {\r\n worker.addEventListener(\"message\", (event: MessageEvent) => {\r\n const { type, schemaRequestId, url } = event.data;\r\n if (type !== \"fetchSchema\") return;\r\n\r\n let promise = schemaCache.get(url);\r\n if (!promise) {\r\n promise = fetch(url)\r\n .then((res) => {\r\n if (!res.ok) {\r\n throw new Error(\r\n `Failed to fetch schema: ${res.status} ${res.statusText}`,\r\n );\r\n }\r\n return res.json();\r\n })\r\n .catch((err) => {\r\n // Remove from cache on failure so it can be retried next time\r\n schemaCache.delete(url);\r\n throw err;\r\n });\r\n schemaCache.set(url, promise);\r\n }\r\n\r\n promise\r\n .then((data) => {\r\n worker.postMessage({ type: \"schemaResponse\", schemaRequestId, data });\r\n })\r\n .catch((err) => {\r\n worker.postMessage({\r\n type: \"schemaResponse\",\r\n schemaRequestId,\r\n error: err.message || String(err),\r\n });\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Set the maximum number of Workers (must be called before initialization)\r\n */\r\nexport function setMaxWorkers(count: number): void {\r\n maxWorkers = Math.max(1, Math.min(count, navigator.hardwareConcurrency || 4));\r\n}\r\n\r\n/**\r\n * Create a single Worker and wait for it to be ready\r\n */\r\nfunction createWorker(): Worker {\r\n const worker = new GLTFWorkerClass();\r\n setupSchemaHandler(worker);\r\n return worker;\r\n}\r\n\r\n/**\r\n * Initialize the Worker pool\r\n */\r\nfunction initWorkerPool() {\r\n if (workerPool.length === 0) {\r\n // Create all Workers\r\n for (let i = 0; i < maxWorkers; i++) {\r\n workerPool.push(createWorker());\r\n }\r\n }\r\n}\r\n\r\nexport function getWorkers(): Worker[] {\r\n initWorkerPool();\r\n return workerPool;\r\n}\r\n\r\n/**\r\n * Acquire a Worker (wait if none are available)\r\n */\r\nexport function acquireWorker() {\r\n initWorkerPool();\r\n\r\n const worker = workerPool[currentWorkerIndex];\r\n currentWorkerIndex = (currentWorkerIndex + 1) % workerPool.length;\r\n return worker;\r\n}\r\n","import {\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tOrthographicCamera,\n\tMesh\n} from 'three';\n\n/**\n * Abstract base class for all post processing passes.\n *\n * This module is only relevant for post processing with {@link WebGLRenderer}.\n *\n * @abstract\n * @three_import import { Pass } from 'three/addons/postprocessing/Pass.js';\n */\nclass Pass {\n\n\t/**\n\t * Constructs a new pass.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPass = true;\n\n\t\t/**\n\t\t * If set to `true`, the pass is processed by the composer.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enabled = true;\n\n\t\t/**\n\t\t * If set to `true`, the pass indicates to swap read and write buffer after rendering.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.needsSwap = true;\n\n\t\t/**\n\t\t * If set to `true`, the pass clears its buffer before rendering\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clear = false;\n\n\t\t/**\n\t\t * If set to `true`, the result of the pass is rendered to screen. The last pass in the composers\n\t\t * pass chain gets automatically rendered to screen, no matter how this property is configured.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.renderToScreen = false;\n\n\t}\n\n\t/**\n\t * Sets the size of the pass.\n\t *\n\t * @abstract\n\t * @param {number} width - The width to set.\n\t * @param {number} height - The height to set.\n\t */\n\tsetSize( /* width, height */ ) {}\n\n\t/**\n\t * This method holds the render logic of a pass. It must be implemented in all derived classes.\n\t *\n\t * @abstract\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( /* renderer, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\tconsole.error( 'THREE.Pass: .render() must be implemented in derived pass.' );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the pass is no longer used in your app.\n\t *\n\t * @abstract\n\t */\n\tdispose() {}\n\n}\n\n// Helper for passes that need to fill the viewport with a single quad.\n\nconst _camera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n// https://github.com/mrdoob/three.js/pull/21358\n\nclass FullscreenTriangleGeometry extends BufferGeometry {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( [ - 1, 3, 0, - 1, - 1, 0, 3, - 1, 0 ], 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( [ 0, 2, 0, 0, 2, 0 ], 2 ) );\n\n\t}\n\n}\n\nconst _geometry = new FullscreenTriangleGeometry();\n\n\n/**\n * This module is a helper for passes which need to render a full\n * screen effect which is quite common in context of post processing.\n *\n * The intended usage is to reuse a single full screen quad for rendering\n * subsequent passes by just reassigning the `material` reference.\n *\n * This module can only be used with {@link WebGLRenderer}.\n *\n * @augments Mesh\n * @three_import import { FullScreenQuad } from 'three/addons/postprocessing/Pass.js';\n */\nclass FullScreenQuad {\n\n\t/**\n\t * Constructs a new full screen quad.\n\t *\n\t * @param {?Material} material - The material to render te full screen quad with.\n\t */\n\tconstructor( material ) {\n\n\t\tthis._mesh = new Mesh( _geometry, material );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis._mesh.geometry.dispose();\n\n\t}\n\n\t/**\n\t * Renders the full screen quad.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t */\n\trender( renderer ) {\n\n\t\trenderer.render( this._mesh, _camera );\n\n\t}\n\n\t/**\n\t * The quad's material.\n\t *\n\t * @type {?Material}\n\t */\n\tget material() {\n\n\t\treturn this._mesh.material;\n\n\t}\n\n\tset material( value ) {\n\n\t\tthis._mesh.material = value;\n\n\t}\n\n}\n\nexport { Pass, FullScreenQuad };\n","import { Q as Fn, b as kn, C as Gn, G as zn } from \"./QuantizedMeshLoaderBase-Bbby1xf8.js\";\nimport { PlaneGeometry as Js, Mesh as Be, MeshBasicMaterial as Se, Vector2 as Y, MathUtils as b, Vector3 as E, Sphere as de, Texture as Hn, SRGBColorSpace as qt, TextureUtils as qn, DefaultLoadingManager as Wn, BufferGeometry as st, MeshStandardMaterial as Ks, BufferAttribute as J, DataTexture as Wt, RGFormat as en, UnsignedByteType as tn, LinearMipMapLinearFilter as jn, LinearFilter as sn, Triangle as jt, Vector4 as Oe, Matrix4 as K, Matrix3 as Yn, Matrix2 as Xn, WebGLRenderer as $n, WebGLRenderTarget as ts, ShaderMaterial as Qn, OneFactor as Zn, ZeroFactor as Jn, CustomBlending as Kn, Box2 as ei, FileLoader as ti, Quaternion as nn, BatchedMesh as si, Source as ni, Box3 as ct, REVISION as ii, WebGLArrayRenderTarget as ss, Raycaster as ri, DoubleSide as rn, CanvasTexture as Yt, Color as on, Ray as oi, LineSegments as an, LineBasicMaterial as ai, EdgesGeometry as li, BoxGeometry as ln, Group as ke, Box3Helper as ci, PointsMaterial as ui } from \"three\";\nimport { a as cn, c as hi, W as di, g as pi, O as fi, b as mi } from \"./MemoryUtils-BD0AS93P.js\";\nimport { GLTFLoader as gi } from \"three/examples/jsm/loaders/GLTFLoader.js\";\nimport { FullScreenQuad as un } from \"three/examples/jsm/postprocessing/Pass.js\";\nimport { b as yi, c as xi, d as Ti, f as hn } from \"./constants-Cj07Qhs1.js\";\nimport { c as bi, L as dn } from \"./LoaderBase-2yhE3Jur.js\";\nconst fe = /* @__PURE__ */ new Y(), ye = Symbol(\"TILE_X\"), xe = Symbol(\"TILE_Y\"), ae = Symbol(\"TILE_LEVEL\");\nclass pn {\n get tiling() {\n return this.imageSource.tiling;\n }\n constructor(e = {}) {\n const {\n pixelSize: t = null,\n center: s = !1,\n useRecommendedSettings: n = !0,\n imageSource: i = null\n } = e;\n this.priority = -10, this.tiles = null, this.imageSource = i, this.pixelSize = t, this.center = s, this.useRecommendedSettings = n, t !== null && console.warn('ImageFormatPlugin: \"pixelSize\" has been deprecated in favor of scaling the tiles root.');\n }\n // Plugin functions\n init(e) {\n this.useRecommendedSettings && (e.errorTarget = 1), this.tiles = e, this.imageSource.fetchOptions = e.fetchOptions, this.imageSource.fetchData = (t, s) => (e.invokeAllPlugins((n) => t = n.preprocessURL ? n.preprocessURL(t, null) : t), e.invokeOnePlugin((n) => n !== this && n.fetchData && n.fetchData(t, s)));\n }\n async loadRootTileset() {\n const { tiles: e, imageSource: t } = this;\n return t.url = t.url || e.rootURL, e.invokeAllPlugins((s) => t.url = s.preprocessURL ? s.preprocessURL(t.url, null) : t.url), await t.init(), e.rootURL = t.url, this.getTileset(t.url);\n }\n async parseToMesh(e, t, s, n, i) {\n if (i.aborted)\n return null;\n const { imageSource: r } = this, o = t[ye], l = t[xe], c = t[ae], u = await r.processBufferToTexture(e);\n if (i.aborted)\n return u.dispose(), u.image.close(), null;\n r.setData(o, l, c, u);\n let h = 1, d = 1, m = 0, f = 0, p = 0;\n const g = t.boundingVolume.box;\n g && ([m, f, p] = g, h = g[3], d = g[7]);\n const y = new Js(2 * h, 2 * d), x = new Be(y, new Se({ map: u, transparent: !0 }));\n x.position.set(m, f, p);\n const T = r.tiling.getTileContentUVBounds(o, l, c), { uv: M } = y.attributes;\n for (let _ = 0; _ < M.count; _++)\n fe.fromBufferAttribute(M, _), fe.x = b.mapLinear(fe.x, 0, 1, T[0], T[2]), fe.y = b.mapLinear(fe.y, 0, 1, T[1], T[3]), M.setXY(_, fe.x, fe.y);\n return x;\n }\n preprocessNode(e) {\n const { tiling: t } = this, s = t.maxLevel;\n e[ae] < s && e.parent !== null && this.expandChildren(e);\n }\n disposeTile(e) {\n const t = e[ye], s = e[xe], n = e[ae], { imageSource: i } = this;\n i.has(t, s, n) && i.release(t, s, n);\n }\n // Local functions\n getTileset(e) {\n const { tiling: t, tiles: s } = this, n = t.minLevel, { tileCountX: i, tileCountY: r } = t.getLevel(n), o = [];\n for (let c = 0; c < i; c++)\n for (let u = 0; u < r; u++) {\n const h = this.createChild(c, u, n);\n h !== null && o.push(h);\n }\n const l = {\n asset: {\n version: \"1.1\"\n },\n geometricError: 1e5,\n root: {\n refine: \"REPLACE\",\n geometricError: 1e5,\n boundingVolume: this.createBoundingVolume(0, 0, -1),\n children: o,\n [ae]: -1,\n [ye]: 0,\n [xe]: 0\n }\n };\n return s.preprocessTileset(l, e), l;\n }\n getUrl(e, t, s) {\n return this.imageSource.getUrl(e, t, s);\n }\n createBoundingVolume(e, t, s) {\n const { center: n, pixelSize: i, tiling: r } = this, { pixelWidth: o, pixelHeight: l } = r.getLevel(r.maxLevel), [c, u, h, d] = s === -1 ? r.getContentBounds(!0) : r.getTileBounds(e, t, s, !0);\n let m = (h - c) / 2, f = (d - u) / 2, p = c + m, g = u + f;\n return n && (p -= 0.5, g -= 0.5), i ? (p *= o * i, m *= o * i, g *= l * i, f *= l * i) : (p *= r.aspectRatio, m *= r.aspectRatio), {\n box: [\n // center\n p,\n g,\n 0,\n // x, y, z half vectors\n m,\n 0,\n 0,\n 0,\n f,\n 0,\n 0,\n 0,\n 0\n ]\n };\n }\n createChild(e, t, s) {\n const { pixelSize: n, tiling: i } = this;\n if (!i.getTileExists(e, t, s))\n return null;\n const { pixelWidth: r, pixelHeight: o } = i.getLevel(s);\n let l = Math.max(i.aspectRatio / r, 1 / o);\n if (n) {\n const c = i.getLevel(i.maxLevel);\n l *= n * Math.max(c.pixelWidth, c.pixelHeight);\n }\n return {\n refine: \"REPLACE\",\n geometricError: l,\n boundingVolume: this.createBoundingVolume(e, t, s),\n content: {\n uri: this.getUrl(e, t, s)\n },\n children: [],\n // save the tile params so we can expand later\n [ye]: e,\n [xe]: t,\n [ae]: s\n };\n }\n expandChildren(e) {\n const t = e[ae], s = e[ye], n = e[xe], { tileSplitX: i, tileSplitY: r } = this.tiling.getLevel(t);\n for (let o = 0; o < i; o++)\n for (let l = 0; l < r; l++) {\n const c = this.createChild(i * s + o, r * n + l, t + 1);\n c && e.children.push(c);\n }\n }\n}\nconst ft = /* @__PURE__ */ new E(), Ge = /* @__PURE__ */ new E();\nfunction _i(a, e, t) {\n const n = t + 1e-5;\n let i = e + 1e-5;\n Math.abs(i) > Math.PI / 2 && (i = i - 1e-5), a.getCartographicToPosition(e, t, 0, ft), a.getCartographicToPosition(i, t, 0, Ge);\n const r = ft.distanceTo(Ge) / 1e-5;\n return a.getCartographicToPosition(e, n, 0, Ge), [ft.distanceTo(Ge) / 1e-5, r];\n}\nconst Si = 30, Mi = 15, mt = /* @__PURE__ */ new E(), ns = /* @__PURE__ */ new E(), ie = /* @__PURE__ */ new Y(), gt = /* @__PURE__ */ new de();\nclass ut extends pn {\n get projection() {\n return this.tiling.projection;\n }\n constructor(e = {}) {\n const {\n shape: t = \"planar\",\n endCaps: s = !0,\n ...n\n } = e;\n super(n), this.shape = t, this.endCaps = s;\n }\n // override the parse to mesh logic to support a region mesh\n async parseToMesh(e, t, ...s) {\n const n = await super.parseToMesh(e, t, ...s), { shape: i, projection: r, tiles: o, tiling: l } = this;\n if (i === \"ellipsoid\") {\n const c = o.ellipsoid, u = t[ae], h = t[ye], d = t[xe], [m, f, p, g] = t.boundingVolume.region, y = Math.ceil((g - f) * b.RAD2DEG * 0.25), x = Math.ceil((p - m) * b.RAD2DEG * 0.25), S = Math.max(Mi, y), T = Math.max(Si, x), M = new Js(1, 1, T, S), [_, C, v, P] = l.getTileBounds(h, d, u, !0, !0), R = l.getTileContentUVBounds(h, d, u), { position: V, normal: k, uv: W } = M.attributes, $ = V.count;\n t.engineData.boundingVolume.getSphere(gt);\n for (let H = 0; H < $; H++) {\n mt.fromBufferAttribute(V, H), ie.fromBufferAttribute(W, H);\n const I = r.convertNormalizedToLongitude(b.mapLinear(ie.x, 0, 1, _, v));\n let A = r.convertNormalizedToLatitude(b.mapLinear(ie.y, 0, 1, C, P));\n if (r.isMercator && this.endCaps && (P === 1 && ie.y === 1 && (A = Math.PI / 2), C === 0 && ie.y === 0 && (A = -Math.PI / 2)), r.isMercator && ie.y !== 0 && ie.y !== 1) {\n const L = r.convertNormalizedToLatitude(1), N = 1 / S, Q = b.mapLinear(ie.y - N, 0, 1, f, g), F = b.mapLinear(ie.y + N, 0, 1, f, g);\n A > L && Q < L && (A = L), A < -L && F > -L && (A = -L);\n }\n c.getCartographicToPosition(A, I, 0, mt).sub(gt.center), c.getCartographicToNormal(A, I, ns);\n const D = b.mapLinear(r.convertLongitudeToNormalized(I), _, v, R[0], R[2]), O = b.mapLinear(r.convertLatitudeToNormalized(A), C, P, R[1], R[3]);\n W.setXY(H, D, O), V.setXYZ(H, ...mt), k.setXYZ(H, ...ns);\n }\n n.geometry = M, n.position.copy(gt.center);\n }\n return n;\n }\n createBoundingVolume(e, t, s) {\n if (this.shape === \"ellipsoid\") {\n const { tiling: n, endCaps: i } = this, r = s === -1, o = r ? n.getContentBounds(!0) : n.getTileBounds(e, t, s, !0, !0), l = r ? n.getContentBounds() : n.getTileBounds(e, t, s, !1, !0);\n return i && (o[3] === 1 && (l[3] = Math.PI / 2), o[1] === 0 && (l[1] = -Math.PI / 2)), {\n region: [...l, -1, 1]\n };\n } else\n return super.createBoundingVolume(e, t, s);\n }\n createChild(...e) {\n const t = super.createChild(...e), { shape: s, projection: n, tiling: i } = this;\n if (t && s === \"ellipsoid\") {\n const r = t[ae], o = t[ye], l = t[xe];\n if (r === -1)\n return t.geometricError = 1e50, parent;\n const [c, u, h, d] = i.getTileBounds(o, l, r, !0), { tilePixelWidth: m, tilePixelHeight: f } = i.getLevel(r), p = (h - c) / m, g = (d - u) / f, [\n /* west */\n ,\n y,\n x,\n S\n ] = i.getTileBounds(o, l, r), T = y > 0 != S > 0 ? 0 : Math.min(Math.abs(y), Math.abs(S)), M = n.convertLatitudeToNormalized(T), _ = n.getLongitudeDerivativeAtNormalized(c), C = n.getLatitudeDerivativeAtNormalized(M), [v, P] = _i(this.tiles.ellipsoid, T, x), R = Math.max(p * _ * v, g * C * P);\n t.geometricError = R;\n }\n return t;\n }\n}\nclass re {\n get isMercator() {\n return this.scheme === \"EPSG:3857\";\n }\n constructor(e = \"EPSG:4326\") {\n this.scheme = e, this.tileCountX = 1, this.tileCountY = 1, this.setScheme(e);\n }\n setScheme(e) {\n switch (this.scheme = e, e) {\n // equirect\n case \"CRS:84\":\n case \"EPSG:4326\":\n this.tileCountX = 2, this.tileCountY = 1;\n break;\n // mercator\n case \"EPSG:3857\":\n this.tileCountX = 1, this.tileCountY = 1;\n break;\n case \"none\":\n this.tileCountX = 1, this.tileCountY = 1;\n break;\n default:\n throw new Error(`ProjectionScheme: Unknown projection scheme \"${e}\"`);\n }\n }\n convertNormalizedToLatitude(e) {\n if (this.scheme === \"none\")\n return e;\n if (this.isMercator) {\n const t = b.mapLinear(e, 0, 1, -1, 1);\n return 2 * Math.atan(Math.exp(t * Math.PI)) - Math.PI / 2;\n } else\n return b.mapLinear(e, 0, 1, -Math.PI / 2, Math.PI / 2);\n }\n convertNormalizedToLongitude(e) {\n return this.scheme === \"none\" ? e : b.mapLinear(e, 0, 1, -Math.PI, Math.PI);\n }\n convertLatitudeToNormalized(e) {\n if (this.scheme === \"none\")\n return e;\n if (this.isMercator) {\n const t = Math.log(Math.tan(Math.PI / 4 + e / 2));\n return 1 / 2 + 1 * t / (2 * Math.PI);\n } else\n return b.mapLinear(e, -Math.PI / 2, Math.PI / 2, 0, 1);\n }\n convertLongitudeToNormalized(e) {\n return this.scheme === \"none\" ? e : (e + Math.PI) / (2 * Math.PI);\n }\n getLongitudeDerivativeAtNormalized(e) {\n return this.scheme === \"none\" ? 1 : 2 * Math.PI;\n }\n getLatitudeDerivativeAtNormalized(e) {\n if (this.scheme === \"none\")\n return 1;\n {\n let s = e - 1e-5;\n return s < 0 && (s = e + 1e-5), this.isMercator ? Math.abs(this.convertNormalizedToLatitude(e) - this.convertNormalizedToLatitude(s)) / 1e-5 : Math.PI;\n }\n }\n getBounds() {\n return this.scheme === \"none\" ? [0, 0, 1, 1] : [\n this.convertNormalizedToLongitude(0),\n this.convertNormalizedToLatitude(0),\n this.convertNormalizedToLongitude(1),\n this.convertNormalizedToLatitude(1)\n ];\n }\n toNormalizedPoint(e, t) {\n const s = [e, t];\n return s[0] = this.convertLongitudeToNormalized(s[0]), s[1] = this.convertLatitudeToNormalized(s[1]), s;\n }\n toNormalizedRange(e) {\n return [\n ...this.toNormalizedPoint(e[0], e[1]),\n ...this.toNormalizedPoint(e[2], e[3])\n ];\n }\n toCartographicPoint(e, t) {\n const s = [e, t];\n return s[0] = this.convertNormalizedToLongitude(s[0]), s[1] = this.convertNormalizedToLatitude(s[1]), s;\n }\n toCartographicRange(e) {\n return [\n ...this.toCartographicPoint(e[0], e[1]),\n ...this.toCartographicPoint(e[2], e[3])\n ];\n }\n clampToBounds(e, t = !1) {\n const s = [...e];\n let n;\n t ? n = [0, 0, 1, 1] : n = this.getBounds();\n const [i, r, o, l] = n;\n return s[0] = b.clamp(s[0], i, o), s[1] = b.clamp(s[1], r, l), s[2] = b.clamp(s[2], i, o), s[3] = b.clamp(s[3], r, l), s;\n }\n}\nfunction Ae(...a) {\n return a.join(\"_\");\n}\nclass fn {\n constructor() {\n this.cache = {}, this.count = 0, this.cachedBytes = 0, this.active = 0;\n }\n // overridable\n fetchItem() {\n }\n disposeItem() {\n }\n getMemoryUsage(e) {\n return 0;\n }\n // sets the data in the cache explicitly without need to load\n setData(...e) {\n const { cache: t } = this, s = e.pop(), n = Ae(...e);\n if (n in t)\n throw new Error(`DataCache: \"${n}\" is already present.`);\n return this.cache[n] = {\n abortController: new AbortController(),\n result: s,\n count: 1,\n bytes: this.getMemoryUsage(s)\n }, this.count++, this.cachedBytes += this.cache[n].bytes, s;\n }\n // fetches the associated data if it doesn't exist and increments the lock counter\n lock(...e) {\n const { cache: t } = this, s = Ae(...e);\n if (s in t)\n t[s].count++;\n else {\n const n = new AbortController(), i = {\n abortController: n,\n result: null,\n count: 1,\n bytes: 0,\n args: e\n };\n this.active++, i.result = this.fetchItem(e, n.signal), i.result instanceof Promise ? i.result.then((r) => (i.result = r, i.bytes = this.getMemoryUsage(r), this.cachedBytes += i.bytes, r)).finally(() => {\n this.active--;\n }).catch((r) => {\n }) : (this.active--, i.bytes = this.getMemoryUsage(i.result), this.cachedBytes += i.bytes), this.cache[s] = i, this.count++;\n }\n return t[s].result;\n }\n // decrements the lock counter for the item and deletes the item if it has reached zero\n release(...e) {\n const t = Ae(...e);\n this.releaseViaFullKey(t);\n }\n // get the loaded item\n get(...e) {\n const { cache: t } = this, s = Ae(...e);\n return s in t && t[s].count > 0 ? t[s].result : null;\n }\n has(...e) {\n const { cache: t } = this;\n return Ae(...e) in t;\n }\n forEachItem(e) {\n const { cache: t } = this;\n for (const s in t) {\n const n = t[s];\n n.result instanceof Promise || e(n.result, n.args);\n }\n }\n // dispose all items\n dispose() {\n const { cache: e } = this;\n for (const t in e) {\n const { abortController: s } = e[t];\n s.abort(), this.releaseViaFullKey(t, !0);\n }\n this.cache = {};\n }\n // releases an item with an optional force flag\n releaseViaFullKey(e, t = !1) {\n const { cache: s } = this;\n if (e in s && s[e].count > 0) {\n const n = s[e];\n if (n.count--, n.count === 0 || t) {\n const i = () => {\n if (s[e] !== n)\n return;\n const { result: r, abortController: o } = n;\n o.abort(), r instanceof Promise ? r.then((l) => {\n this.disposeItem(l), this.count--, this.cachedBytes -= n.bytes;\n }).catch(() => {\n }) : (this.disposeItem(r), this.count--, this.cachedBytes -= n.bytes), delete s[e];\n };\n t ? i() : queueMicrotask(() => {\n n.count === 0 && i();\n });\n }\n return !0;\n }\n throw new Error(\"DataCache: Attempting to release key that does not exist\");\n }\n}\nfunction is(a, e) {\n const [t, s, n, i] = a, [r, o, l, c] = e;\n return !(t >= l || n <= r || s >= c || i <= o);\n}\nclass mn {\n get levelCount() {\n return this._levels.length;\n }\n get maxLevel() {\n return this.levelCount - 1;\n }\n get minLevel() {\n const e = this._levels;\n for (let t = 0; t < e.length; t++)\n if (e[t] !== null)\n return t;\n return -1;\n }\n // prioritize user-set bounds over projection bounds if present\n get contentBounds() {\n return this._contentBounds ?? this.projection.getBounds();\n }\n get aspectRatio() {\n const { pixelWidth: e, pixelHeight: t } = this.getLevel(this.maxLevel);\n return e / t;\n }\n constructor() {\n this.flipY = !1, this.pixelOverlap = 0, this._contentBounds = null, this.projection = new re(\"none\"), this._levels = [];\n }\n // build the zoom levels\n setLevel(e, t = {}) {\n const s = this._levels;\n for (; s.length < e; )\n s.push(null);\n const {\n tileSplitX: n = 2,\n tileSplitY: i = 2\n } = t, {\n tilePixelWidth: r = 256,\n tilePixelHeight: o = 256,\n tileCountX: l = n ** e,\n tileCountY: c = i ** e,\n tileBounds: u = null\n } = t, {\n pixelWidth: h = r * l,\n pixelHeight: d = o * c\n } = t;\n s[e] = {\n // The pixel resolution of each tile.\n tilePixelWidth: r,\n tilePixelHeight: o,\n // The total pixel resolution of the final image at this level. These numbers\n // may not be a round multiple of the tile width.\n pixelWidth: h,\n pixelHeight: d,\n // Or the total number of tiles that can be loaded at this level.\n tileCountX: l,\n tileCountY: c,\n // The number of tiles that the tiles at this layer split in to\n tileSplitX: n,\n tileSplitY: i,\n // The bounds covered by the extent of the tiles at this loaded. The actual content covered by the overall tileset\n // may be a subset of this range (eg there may be unused space).\n tileBounds: u\n };\n }\n generateLevels(e, t, s, n = {}) {\n const {\n minLevel: i = 0,\n tilePixelWidth: r = 256,\n tilePixelHeight: o = 256\n } = n, l = e - 1, {\n pixelWidth: c = r * t * 2 ** l,\n pixelHeight: u = o * s * 2 ** l\n } = n;\n for (let h = i; h < e; h++) {\n const d = e - h - 1, m = Math.ceil(c * 2 ** -d), f = Math.ceil(u * 2 ** -d), p = Math.ceil(m / r), g = Math.ceil(f / o);\n this.setLevel(h, {\n tilePixelWidth: r,\n tilePixelHeight: o,\n pixelWidth: m,\n pixelHeight: f,\n tileCountX: p,\n tileCountY: g\n });\n }\n }\n getLevel(e) {\n return this._levels[e];\n }\n // bounds representing the contentful region of the image\n setContentBounds(e, t, s, n) {\n this._contentBounds = [e, t, s, n];\n }\n setProjection(e) {\n this.projection = e;\n }\n // query functions\n getTileAtPoint(e, t, s, n = !1) {\n const { flipY: i } = this, { tileCountX: r, tileCountY: o, tileBounds: l } = this.getLevel(s), c = 1 / r, u = 1 / o;\n if (n || ([e, t] = this.toNormalizedPoint(e, t)), l) {\n const m = this.toNormalizedRange(l);\n e = b.mapLinear(e, m[0], m[2], 0, 1), t = b.mapLinear(t, m[1], m[3], 0, 1);\n }\n const h = Math.floor(e / c);\n let d = Math.floor(t / u);\n return i && (d = o - 1 - d), [h, d];\n }\n getTilesInRange(e, t, s, n, i, r = !1) {\n const o = [e, t, s, n], l = this.getContentBounds(r);\n let c = this.getLevel(i).tileBounds;\n if (!is(o, l))\n return [0, 0, -1, -1];\n if (c && (r && (c = this.toNormalizedRange(c)), !is(o, l)))\n return [0, 0, -1, -1];\n const [u, h, d, m] = this.clampToContentBounds(o, r), f = this.getTileAtPoint(u, h, i, r), p = this.getTileAtPoint(d, m, i, r);\n this.flipY && ([f[1], p[1]] = [p[1], f[1]]);\n const { tileCountX: g, tileCountY: y } = this.getLevel(i), [x, S] = f, [T, M] = p;\n return T < 0 || M < 0 || x >= g || S >= y ? [0, 0, -1, -1] : [\n b.clamp(x, 0, g - 1),\n b.clamp(S, 0, y - 1),\n b.clamp(T, 0, g - 1),\n b.clamp(M, 0, y - 1)\n ];\n }\n getTileExists(e, t, s) {\n const [n, i, r, o] = this.contentBounds, [l, c, u, h] = this.getTileBounds(e, t, s);\n return !(l >= u || c >= h) && l <= r && c <= o && u >= n && h >= i;\n }\n getContentBounds(e = !1) {\n const { projection: t } = this, s = [...this.contentBounds];\n return e && (s[0] = t.convertLongitudeToNormalized(s[0]), s[1] = t.convertLatitudeToNormalized(s[1]), s[2] = t.convertLongitudeToNormalized(s[2]), s[3] = t.convertLatitudeToNormalized(s[3])), s;\n }\n // returns the UV range associated with the content in the given tile\n getTileContentUVBounds(e, t, s) {\n const [n, i, r, o] = this.getTileBounds(e, t, s, !0, !0), [l, c, u, h] = this.getTileBounds(e, t, s, !0, !1);\n return [\n b.mapLinear(n, l, u, 0, 1),\n b.mapLinear(i, c, h, 0, 1),\n b.mapLinear(r, l, u, 0, 1),\n b.mapLinear(o, c, h, 0, 1)\n ];\n }\n getTileBounds(e, t, s, n = !1, i = !0) {\n const { flipY: r, pixelOverlap: o, projection: l } = this, { tilePixelWidth: c, tilePixelHeight: u, pixelWidth: h, pixelHeight: d, tileBounds: m } = this.getLevel(s);\n let f = c * e - o, p = u * t - o, g = f + c + o * 2, y = p + u + o * 2;\n if (f = Math.max(f, 0), p = Math.max(p, 0), g = Math.min(g, h), y = Math.min(y, d), f = f / h, g = g / h, p = p / d, y = y / d, r) {\n const S = (y - p) / 2, M = 1 - (p + y) / 2;\n p = M - S, y = M + S;\n }\n let x = [f, p, g, y];\n if (m) {\n const S = this.toNormalizedRange(m);\n x[0] = b.mapLinear(x[0], 0, 1, S[0], S[2]), x[2] = b.mapLinear(x[2], 0, 1, S[0], S[2]), x[1] = b.mapLinear(x[1], 0, 1, S[1], S[3]), x[3] = b.mapLinear(x[3], 0, 1, S[1], S[3]);\n }\n return i && (x = this.clampToBounds(x, !0)), n || (x[0] = l.convertNormalizedToLongitude(x[0]), x[1] = l.convertNormalizedToLatitude(x[1]), x[2] = l.convertNormalizedToLongitude(x[2]), x[3] = l.convertNormalizedToLatitude(x[3])), x;\n }\n toNormalizedPoint(e, t) {\n return this.projection.toNormalizedPoint(e, t);\n }\n toNormalizedRange(e) {\n return this.projection.toNormalizedRange(e);\n }\n toCartographicPoint(e, t) {\n return this.projection.toCartographicPoint(e, t);\n }\n toCartographicRange(e) {\n return this.projection.toCartographicRange(e);\n }\n clampToContentBounds(e, t = !1) {\n const s = [...e], [n, i, r, o] = this.getContentBounds(t);\n return s[0] = b.clamp(s[0], n, r), s[1] = b.clamp(s[1], i, o), s[2] = b.clamp(s[2], n, r), s[3] = b.clamp(s[3], i, o), s;\n }\n clampToBounds(e, t = !1) {\n return this.projection.clampToBounds(e, t);\n }\n}\nclass Ue extends fn {\n constructor(e = {}) {\n super();\n const {\n fetchOptions: t = {}\n } = e;\n this.tiling = new mn(), this.fetchOptions = t, this.fetchData = (...s) => fetch(...s);\n }\n // async function for initializing the tiled image set\n init() {\n }\n // helper for processing the buffer into a texture\n async processBufferToTexture(e) {\n const t = new Blob([e]), s = await createImageBitmap(t, {\n premultiplyAlpha: \"none\",\n colorSpaceConversion: \"none\",\n imageOrientation: \"flipY\"\n }), n = new Hn(s);\n return n.generateMipmaps = !1, n.colorSpace = qt, n.needsUpdate = !0, n;\n }\n getMemoryUsage(e) {\n const { format: t, type: s, image: n, generateMipmaps: i } = e, { width: r, height: o } = n, l = qn.getByteLength(r, o, t, s);\n return i ? l * 4 / 3 : l;\n }\n // fetch the item with the given key fields\n fetchItem(e, t) {\n const s = {\n ...this.fetchOptions,\n signal: t\n }, n = this.getUrl(...e);\n return this.fetchData(n, s).then((i) => i.arrayBuffer()).then((i) => this.processBufferToTexture(i));\n }\n // dispose of the item that was fetched\n disposeItem(e) {\n e.dispose(), e.image instanceof ImageBitmap && e.image.close();\n }\n getUrl(...e) {\n }\n}\nclass Ne extends Ue {\n constructor(e = {}) {\n const {\n levels: t = 20,\n tileDimension: s = 256,\n projection: n = \"EPSG:3857\",\n url: i = null,\n ...r\n } = e;\n super(r), this.tileDimension = s, this.levels = t, this.projection = n, this.url = i;\n }\n getUrl(e, t, s) {\n return this.url.replace(/{\\s*z\\s*}/gi, s).replace(/{\\s*x\\s*}/gi, e).replace(/{\\s*(y|reverseY|-\\s*y)\\s*}/gi, t);\n }\n init() {\n const { tiling: e, tileDimension: t, levels: s, url: n, projection: i } = this;\n return e.flipY = !/{\\s*reverseY|-\\s*y\\s*}/g.test(n), e.setProjection(new re(i)), e.setContentBounds(...e.projection.getBounds()), Array.isArray(s) ? s.forEach((r, o) => {\n r !== null && e.setLevel(o, {\n tilePixelWidth: t,\n tilePixelHeight: t,\n ...r\n });\n }) : e.generateLevels(s, e.projection.tileCountX, e.projection.tileCountY, {\n tilePixelWidth: t,\n tilePixelHeight: t\n }), this.url = n, Promise.resolve();\n }\n}\nclass Xt extends Ue {\n constructor(e = {}) {\n const {\n url: t = null,\n ...s\n } = e;\n super(s), this.tileSets = null, this.extension = null, this.url = t;\n }\n getUrl(e, t, s) {\n const { url: n, extension: i, tileSets: r, tiling: o } = this;\n return new URL(`${parseInt(r[s - o.minLevel].href)}/${e}/${t}.${i}`, n).toString();\n }\n init() {\n const { url: e } = this;\n return this.fetchData(new URL(\"tilemapresource.xml\", e), this.fetchOptions).then((t) => t.text()).then((t) => {\n const { tiling: s } = this, n = new DOMParser().parseFromString(t, \"text/xml\"), i = n.querySelector(\"BoundingBox\"), r = n.querySelector(\"TileFormat\"), l = [...n.querySelector(\"TileSets\").querySelectorAll(\"TileSet\")].map((y) => ({\n href: parseInt(y.getAttribute(\"href\")),\n unitsPerPixel: parseFloat(y.getAttribute(\"units-per-pixel\")),\n order: parseInt(y.getAttribute(\"order\"))\n })).sort((y, x) => y.order - x.order), c = parseFloat(i.getAttribute(\"minx\")) * b.DEG2RAD, u = parseFloat(i.getAttribute(\"maxx\")) * b.DEG2RAD, h = parseFloat(i.getAttribute(\"miny\")) * b.DEG2RAD, d = parseFloat(i.getAttribute(\"maxy\")) * b.DEG2RAD, m = parseInt(r.getAttribute(\"width\")), f = parseInt(r.getAttribute(\"height\")), p = r.getAttribute(\"extension\"), g = n.querySelector(\"SRS\").textContent;\n this.extension = p, this.url = e, this.tileSets = l, s.setProjection(new re(g)), s.setContentBounds(c, h, u, d), l.forEach(({ order: y }) => {\n s.setLevel(y, {\n tileCountX: s.projection.tileCountX * 2 ** y,\n tilePixelWidth: m,\n tilePixelHeight: f\n });\n });\n });\n }\n}\nfunction Ci(a) {\n return /(:84|:crs84)$/i.test(a);\n}\nclass gn extends Ue {\n constructor(e = {}) {\n const {\n capabilities: t = null,\n layer: s = null,\n tileMatrixSet: n = null,\n style: i = null,\n url: r = null,\n dimensions: o = {},\n ...l\n } = e;\n super(l), this.capabilities = t, this.layer = s, this.tileMatrixSet = n, this.style = i, this.dimensions = o, this.url = r;\n }\n getUrl(e, t, s) {\n return this.url.replace(/{\\s*TileMatrix\\s*}/gi, s).replace(/{\\s*TileCol\\s*}/gi, e).replace(/{\\s*TileRow\\s*}/gi, t);\n }\n init() {\n const { tiling: e, dimensions: t, capabilities: s } = this;\n let { layer: n, tileMatrixSet: i, style: r, url: o } = this;\n n ? typeof n == \"string\" && (n = s.layers.find((u) => u.identifier === n)) : n = s.layers[0], i ? typeof i == \"string\" && (i = n.tileMatrixSets.find((u) => u.identifier === i)) : i = n.tileMatrixSets[0], r || (r = n.styles.find((u) => u.isDefault).identifier), o || (o = n.resourceUrls[0].template);\n const l = i.supportedCRS, c = l.includes(\"4326\") || Ci(l) ? \"EPSG:4326\" : \"EPSG:3857\";\n e.flipY = !0, e.setProjection(new re(c)), n.boundingBox !== null ? e.setContentBounds(...n.boundingBox.bounds) : e.setContentBounds(...e.projection.getBounds()), i.tileMatrices.forEach((u, h) => {\n const { tileWidth: d, tileHeight: m, matrixWidth: f, matrixHeight: p } = u;\n e.setLevel(h, {\n tilePixelWidth: d,\n tilePixelHeight: m,\n tileCountX: f || e.projection.tileCountX * 2 ** h,\n tileCountY: p || e.projection.tileCountY * 2 ** h,\n tileBounds: u.bounds\n });\n }), o = o.replace(/{\\s*TileMatrixSet\\s*}/g, i.identifier).replace(/{\\s*Style\\s*}/g, r);\n for (const u in t)\n o = o.replace(new RegExp(`{\\\\s*${u}\\\\s*}`), t[u]);\n return n.dimensions.forEach((u) => {\n o = o.replace(new RegExp(`{\\\\s*${u.identifier}\\\\s*}`), u.defaultValue);\n }), this.url = o, Promise.resolve();\n }\n}\nclass yn extends Ue {\n // TODO: layer and styles can be arrays, comma separated lists\n constructor(e = {}) {\n const {\n url: t = null,\n layer: s = null,\n styles: n = null,\n contentBoundingBox: i = null,\n version: r = \"1.3.0\",\n crs: o = \"EPSG:4326\",\n format: l = \"image/png\",\n transparent: c = !1,\n levels: u = 18,\n tileDimension: h = 256,\n ...d\n } = e;\n super(d), this.url = t, this.layer = s, this.crs = o, this.format = l, this.tileDimension = h, this.styles = n, this.version = r, this.levels = u, this.transparent = c, this.contentBoundingBox = i;\n }\n init() {\n const { tiling: e, levels: t, tileDimension: s, contentBoundingBox: n } = this;\n return e.setProjection(new re(this.crs)), e.flipY = !0, e.generateLevels(t, e.projection.tileCountX, e.projection.tileCountY, {\n tilePixelWidth: s,\n tilePixelHeight: s\n }), n !== null ? e.setContentBounds(...n) : e.setContentBounds(...e.projection.getBounds()), Promise.resolve();\n }\n // TODO: handle this in ProjectionScheme or TilingScheme? Or Loader?\n normalizedToMercatorX(e) {\n return b.mapLinear(e, 0, 1, -20037508342789244e-9, 20037508342789244e-9);\n }\n normalizedToMercatorY(e) {\n return b.mapLinear(e, 0, 1, -20037508342789244e-9, 20037508342789244e-9);\n }\n getUrl(e, t, s) {\n const {\n tiling: n,\n layer: i,\n crs: r,\n format: o,\n tileDimension: l,\n styles: c,\n version: u,\n transparent: h\n } = this, d = u === \"1.1.1\" ? \"SRS\" : \"CRS\";\n let m;\n if (r === \"EPSG:3857\") {\n const p = n.getTileBounds(e, t, s, !0, !1), g = this.normalizedToMercatorX(p[0]), y = this.normalizedToMercatorY(p[1]), x = this.normalizedToMercatorX(p[2]), S = this.normalizedToMercatorY(p[3]);\n m = [g, y, x, S];\n } else {\n const [p, g, y, x] = n.getTileBounds(e, t, s, !1, !1).map((S) => S * b.RAD2DEG);\n r === \"EPSG:4326\" ? u === \"1.1.1\" ? m = [p, g, y, x] : m = [g, p, x, y] : m = [p, g, y, x];\n }\n const f = new URLSearchParams({\n SERVICE: \"WMS\",\n REQUEST: \"GetMap\",\n VERSION: u,\n LAYERS: i,\n [d]: r,\n BBOX: m.join(\",\"),\n WIDTH: l,\n HEIGHT: l,\n FORMAT: o,\n TRANSPARENT: h ? \"TRUE\" : \"FALSE\"\n });\n return c != null && f.set(\"STYLES\", c), new URL(\"?\" + f.toString(), this.url).toString();\n }\n}\nclass to extends ut {\n constructor(e = {}) {\n const {\n levels: t,\n tileDimension: s,\n projection: n,\n url: i,\n ...r\n } = e;\n super(r), this.name = \"XYZ_TILES_PLUGIN\", this.imageSource = new Ne({ url: i, levels: t, tileDimension: s, projection: n });\n }\n}\nclass Ai extends ut {\n constructor(e = {}) {\n const { url: t, ...s } = e;\n super(s), this.name = \"TMS_TILES_PLUGIN\", this.imageSource = new Xt({ url: t });\n }\n}\nclass so extends ut {\n constructor(e = {}) {\n const {\n capabilities: t,\n layer: s,\n tileMatrixSet: n,\n style: i,\n dimensions: r,\n ...o\n } = e;\n super(o), this.name = \"WTMS_TILES_PLUGIN\", this.imageSource = new gn({\n capabilities: t,\n layer: s,\n tileMatrixSet: n,\n style: i,\n dimensions: r\n });\n }\n}\nclass no extends ut {\n constructor(e = {}) {\n const {\n url: t,\n layer: s,\n crs: n,\n format: i,\n tileDimension: r,\n styles: o,\n version: l,\n ...c\n } = e;\n super(c), this.name = \"WMS_TILES_PLUGIN\", this.imageSource = new yn({\n url: t,\n layer: s,\n crs: n,\n format: i,\n tileDimension: r,\n styles: o,\n version: l\n });\n }\n}\nconst rs = /* @__PURE__ */ new E(), ze = /* @__PURE__ */ new jt(), U = /* @__PURE__ */ new E(), oe = /* @__PURE__ */ new E();\nclass Ii extends Fn {\n constructor(e = Wn) {\n super(), this.manager = e, this.ellipsoid = new cn(), this.skirtLength = 1e3, this.smoothSkirtNormals = !0, this.generateNormals = !0, this.solid = !1, this.minLat = -Math.PI / 2, this.maxLat = Math.PI / 2, this.minLon = -Math.PI, this.maxLon = Math.PI;\n }\n parse(e) {\n const {\n ellipsoid: t,\n solid: s,\n skirtLength: n,\n smoothSkirtNormals: i,\n generateNormals: r,\n minLat: o,\n maxLat: l,\n minLon: c,\n maxLon: u\n } = this, {\n header: h,\n indices: d,\n vertexData: m,\n edgeIndices: f,\n extensions: p\n } = super.parse(e), g = new st(), y = new Ks(), x = new Be(g, y);\n x.position.set(...h.center);\n const S = \"octvertexnormals\" in p, T = S || r, M = m.u.length, _ = [], C = [], v = [], P = [];\n let R = 0, V = 0;\n for (let I = 0; I < M; I++)\n W(I, U), $(U.x, U.y, U.z, oe), C.push(U.x, U.y), _.push(...oe);\n for (let I = 0, A = d.length; I < A; I++)\n v.push(d[I]);\n if (T)\n if (S) {\n const I = p.octvertexnormals.normals;\n for (let A = 0, D = I.length; A < D; A++)\n P.push(I[A]);\n } else {\n const I = new st(), A = d.length > 21845 ? new Uint32Array(d) : new Uint16Array(d);\n I.setIndex(new J(A, 1, !1)), I.setAttribute(\"position\", new J(new Float32Array(_), 3, !1)), I.computeVertexNormals();\n const O = I.getAttribute(\"normal\").array;\n p.octvertexnormals = { normals: O };\n for (let L = 0, N = O.length; L < N; L++)\n P.push(O[L]);\n }\n if (g.addGroup(R, d.length, V), R += d.length, V++, s) {\n const I = _.length / 3;\n for (let A = 0; A < M; A++)\n W(A, U), $(U.x, U.y, U.z, oe, -n), C.push(U.x, U.y), _.push(...oe);\n for (let A = d.length - 1; A >= 0; A--)\n v.push(d[A] + I);\n if (T) {\n const A = p.octvertexnormals.normals;\n for (let D = 0, O = A.length; D < O; D++)\n P.push(-A[D]);\n }\n g.addGroup(R, d.length, V), R += d.length, V++;\n }\n if (n > 0) {\n const {\n westIndices: I,\n eastIndices: A,\n southIndices: D,\n northIndices: O\n } = f;\n let L;\n const N = H(I);\n L = _.length / 3, C.push(...N.uv), _.push(...N.positions);\n for (let B = 0, Z = N.indices.length; B < Z; B++)\n v.push(N.indices[B] + L);\n const Q = H(A);\n L = _.length / 3, C.push(...Q.uv), _.push(...Q.positions);\n for (let B = 0, Z = Q.indices.length; B < Z; B++)\n v.push(Q.indices[B] + L);\n const F = H(D);\n L = _.length / 3, C.push(...F.uv), _.push(...F.positions);\n for (let B = 0, Z = F.indices.length; B < Z; B++)\n v.push(F.indices[B] + L);\n const G = H(O);\n L = _.length / 3, C.push(...G.uv), _.push(...G.positions);\n for (let B = 0, Z = G.indices.length; B < Z; B++)\n v.push(G.indices[B] + L);\n T && (P.push(...N.normals), P.push(...Q.normals), P.push(...F.normals), P.push(...G.normals)), g.addGroup(R, d.length, V), R += d.length, V++;\n }\n for (let I = 0, A = _.length; I < A; I += 3)\n _[I + 0] -= h.center[0], _[I + 1] -= h.center[1], _[I + 2] -= h.center[2];\n const k = _.length / 3 > 65535 ? new Uint32Array(v) : new Uint16Array(v);\n if (g.setIndex(new J(k, 1, !1)), g.setAttribute(\"position\", new J(new Float32Array(_), 3, !1)), g.setAttribute(\"uv\", new J(new Float32Array(C), 2, !1)), T && g.setAttribute(\"normal\", new J(new Float32Array(P), 3, !1)), \"watermask\" in p) {\n const { mask: I, size: A } = p.watermask, D = new Uint8Array(2 * A * A);\n for (let L = 0, N = I.length; L < N; L++) {\n const Q = I[L] === 255 ? 0 : 255;\n D[2 * L + 0] = Q, D[2 * L + 1] = Q;\n }\n const O = new Wt(D, A, A, en, tn);\n O.flipY = !0, O.minFilter = jn, O.magFilter = sn, O.needsUpdate = !0, y.roughnessMap = O;\n }\n return x.userData.minHeight = h.minHeight, x.userData.maxHeight = h.maxHeight, \"metadata\" in p && (x.userData.metadata = p.metadata.json), x;\n function W(I, A) {\n return A.x = m.u[I], A.y = m.v[I], A.z = m.height[I], A;\n }\n function $(I, A, D, O, L = 0) {\n const N = b.lerp(h.minHeight, h.maxHeight, D), Q = b.lerp(c, u, I), F = b.lerp(o, l, A);\n return t.getCartographicToPosition(F, Q, N + L, O), O;\n }\n function H(I) {\n const A = [], D = [], O = [], L = [], N = [];\n for (let G = 0, B = I.length; G < B; G++)\n W(I[G], U), A.push(U.x, U.y), O.push(U.x, U.y), $(U.x, U.y, U.z, oe), D.push(...oe), $(U.x, U.y, U.z, oe, -n), L.push(...oe);\n const Q = I.length - 1;\n for (let G = 0; G < Q; G++) {\n const B = G, Z = G + 1, pe = G + I.length, dt = G + I.length + 1;\n N.push(B, pe, Z), N.push(Z, pe, dt);\n }\n let F = null;\n if (T) {\n const G = (D.length + L.length) / 3;\n if (i) {\n F = new Array(G * 3);\n const B = p.octvertexnormals.normals, Z = F.length / 2;\n for (let pe = 0, dt = G / 2; pe < dt; pe++) {\n const pt = I[pe], Te = 3 * pe, Jt = B[3 * pt + 0], Kt = B[3 * pt + 1], es = B[3 * pt + 2];\n F[Te + 0] = Jt, F[Te + 1] = Kt, F[Te + 2] = es, F[Z + Te + 0] = Jt, F[Z + Te + 1] = Kt, F[Z + Te + 2] = es;\n }\n } else {\n F = [], ze.a.fromArray(D, 0), ze.b.fromArray(L, 0), ze.c.fromArray(D, 3), ze.getNormal(rs);\n for (let B = 0; B < G; B++)\n F.push(...rs);\n }\n }\n return {\n uv: [...A, ...O],\n positions: [...D, ...L],\n indices: N,\n normals: F\n };\n }\n }\n}\nconst z = 0, ce = [\"a\", \"b\", \"c\"], w = /* @__PURE__ */ new Oe(), os = /* @__PURE__ */ new Oe(), as = /* @__PURE__ */ new Oe(), ls = /* @__PURE__ */ new Oe();\nclass xn {\n constructor() {\n this.attributeList = null, this.splitOperations = [], this.trianglePool = new vi();\n }\n forEachSplitPermutation(e) {\n const { splitOperations: t } = this, s = (n = 0) => {\n if (n >= t.length) {\n e();\n return;\n }\n t[n].keepPositive = !0, s(n + 1), t[n].keepPositive = !1, s(n + 1);\n };\n s();\n }\n // Takes an operation that returns a value for the given vertex passed to the callback. Triangles\n // are clipped along edges where the interpolated value is equal to 0. The polygons on the positive\n // side of the operation are kept if \"keepPositive\" is true.\n // callback( geometry, i0, i1, i2, barycoord );\n addSplitOperation(e, t = !0) {\n this.splitOperations.push({\n callback: e,\n keepPositive: t\n });\n }\n // Removes all split operations\n clearSplitOperations() {\n this.splitOperations.length = 0;\n }\n // clips an object hierarchy\n clipObject(e) {\n const t = e.clone(), s = [];\n return t.traverse((n) => {\n n.isMesh && (n.geometry = this.clip(n).geometry, (n.geometry.index ? n.geometry.index.count / 3 : n.attributes.position.count / 3) === 0 && s.push(n));\n }), s.forEach((n) => {\n n.removeFromParent();\n }), t;\n }\n // Returns a new mesh that has been clipped by the split operations. Range indicates the range of\n // elements to include when clipping.\n clip(e, t = null) {\n const s = this.getClippedData(e, t);\n return this.constructMesh(s.attributes, s.index, e);\n }\n // Appends the clip operation data to the given \"target\" object so multiple ranges can be appended.\n // The \"target\" object is returned with an \"index\" field, \"vertexIsClipped\" field, and series of arrays\n // in \"attributes\".\n // attributes - set of attribute arrays\n // index - triangle indices referencing vertices in attributes\n // vertexIsClipped - array indicating whether a vertex is on a clipped edge\n getClippedData(e, t = null, s = {}) {\n const { trianglePool: n, splitOperations: i, attributeList: r } = this, o = e.geometry, l = o.attributes.position, c = o.index;\n let u = 0;\n const h = {};\n s.index = s.index || [], s.vertexIsClipped = s.vertexIsClipped || [], s.attributes = s.attributes || {};\n for (const p in o.attributes) {\n if (r !== null) {\n if (r instanceof Function && !r(p))\n continue;\n if (Array.isArray(r) && !r.includes(p))\n continue;\n }\n s.attributes[p] = [];\n }\n let d = 0, m = c ? c.count : l.count;\n t !== null && (d = t.start, m = t.count);\n for (let p = d, g = d + m; p < g; p += 3) {\n let y = p + 0, x = p + 1, S = p + 2;\n c && (y = c.getX(y), x = c.getX(x), S = c.getX(S));\n const T = n.get();\n T.initFromIndices(y, x, S);\n let M = [T];\n for (let _ = 0; _ < i.length; _++) {\n const { keepPositive: C, callback: v } = i[_], P = [];\n for (let R = 0; R < M.length; R++) {\n const V = M[R], { indices: k, barycoord: W } = V;\n V.clipValues.a = v(o, k.a, k.b, k.c, W.a, e.matrixWorld), V.clipValues.b = v(o, k.a, k.b, k.c, W.b, e.matrixWorld), V.clipValues.c = v(o, k.a, k.b, k.c, W.c, e.matrixWorld), this.splitTriangle(V, !C, P);\n }\n M = P;\n }\n for (let _ = 0, C = M.length; _ < C; _++) {\n const v = M[_];\n f(v, o);\n }\n n.reset();\n }\n return s;\n function f(p, g) {\n for (let y = 0; y < 3; y++) {\n const x = p.getVertexHash(y, g);\n x in h || (h[x] = u, u++, p.getVertexData(y, g, s.attributes), s.vertexIsClipped.push(p.clipValues[ce[y]] === z));\n const S = h[x];\n s.index.push(S);\n }\n }\n }\n // Takes the set of resultant data and constructs a mesh\n constructMesh(e, t, s) {\n const n = s.geometry, i = new st(), r = e.position.length / 3 > 65535 ? new Uint32Array(t) : new Uint16Array(t);\n i.setIndex(new J(r, 1, !1));\n for (const l in e) {\n const c = n.getAttribute(l), u = new c.array.constructor(e[l]), h = new J(u, c.itemSize, c.normalized);\n h.gpuType = c.gpuType, i.setAttribute(l, h);\n }\n const o = new Be(i, s.material.clone());\n return o.position.copy(s.position), o.quaternion.copy(s.quaternion), o.scale.copy(s.scale), o;\n }\n // Splits the given triangle\n splitTriangle(e, t, s) {\n const { trianglePool: n } = this, i = [], r = [], o = [];\n for (let l = 0; l < 3; l++) {\n const c = ce[l], u = ce[(l + 1) % 3], h = e.clipValues[c], d = e.clipValues[u];\n (h < z != d < z || h === z) && (i.push(l), r.push([c, u]), h === d ? o.push(0) : o.push(b.mapLinear(z, h, d, 0, 1)));\n }\n if (i.length !== 2)\n Math.min(\n e.clipValues.a,\n e.clipValues.b,\n e.clipValues.c\n ) < z === t && s.push(e);\n else if (i.length === 2) {\n const l = n.get().initFromTriangle(e), c = n.get().initFromTriangle(e), u = n.get().initFromTriangle(e);\n (i[0] + 1) % 3 === i[1] ? (l.lerpVertexFromEdge(e, r[0][0], r[0][1], o[0], \"a\"), l.copyVertex(e, r[0][1], \"b\"), l.lerpVertexFromEdge(e, r[1][0], r[1][1], o[1], \"c\"), l.clipValues.a = z, l.clipValues.c = z, c.lerpVertexFromEdge(e, r[0][0], r[0][1], o[0], \"a\"), c.copyVertex(e, r[1][1], \"b\"), c.copyVertex(e, r[0][0], \"c\"), c.clipValues.a = z, u.lerpVertexFromEdge(e, r[0][0], r[0][1], o[0], \"a\"), u.lerpVertexFromEdge(e, r[1][0], r[1][1], o[1], \"b\"), u.copyVertex(e, r[1][1], \"c\"), u.clipValues.a = z, u.clipValues.b = z) : (l.lerpVertexFromEdge(e, r[0][0], r[0][1], o[0], \"a\"), l.lerpVertexFromEdge(e, r[1][0], r[1][1], o[1], \"b\"), l.copyVertex(e, r[0][0], \"c\"), l.clipValues.a = z, l.clipValues.b = z, c.lerpVertexFromEdge(e, r[0][0], r[0][1], o[0], \"a\"), c.copyVertex(e, r[0][1], \"b\"), c.lerpVertexFromEdge(e, r[1][0], r[1][1], o[1], \"c\"), c.clipValues.a = z, c.clipValues.c = z, u.copyVertex(e, r[0][1], \"a\"), u.copyVertex(e, r[1][0], \"b\"), u.lerpVertexFromEdge(e, r[1][0], r[1][1], o[1], \"c\"), u.clipValues.c = z);\n let d, m;\n d = Math.min(l.clipValues.a, l.clipValues.b, l.clipValues.c), m = d < z, m === t && s.push(l), d = Math.min(c.clipValues.a, c.clipValues.b, c.clipValues.c), m = d < z, m === t && s.push(c), d = Math.min(u.clipValues.a, u.clipValues.b, u.clipValues.c), m = d < z, m === t && s.push(u);\n }\n }\n}\nclass vi {\n constructor() {\n this.pool = [], this.index = 0;\n }\n get() {\n if (this.index >= this.pool.length) {\n const t = new Li();\n this.pool.push(t);\n }\n const e = this.pool[this.index];\n return this.index++, e;\n }\n reset() {\n this.index = 0;\n }\n}\nclass Li {\n constructor() {\n this.indices = {\n a: -1,\n b: -1,\n c: -1\n }, this.clipValues = {\n a: -1,\n b: -1,\n c: -1\n }, this.barycoord = new jt();\n }\n // returns a hash for the given [0, 2] index based on attributes of the referenced geometry\n getVertexHash(e, t) {\n const { barycoord: s, indices: n } = this, i = ce[e], r = s[i];\n if (r.x === 1)\n return n[ce[0]];\n if (r.y === 1)\n return n[ce[1]];\n if (r.z === 1)\n return n[ce[2]];\n {\n const { attributes: o } = t;\n let l = \"\";\n for (const c in o) {\n const u = o[c];\n switch (cs(u, n.a, n.b, n.c, r, w), (c === \"normal\" || c === \"tangent\" || c === \"bitangent\") && w.normalize(), u.itemSize) {\n case 4:\n l += we(w.x, w.y, w.z, w.w);\n break;\n case 3:\n l += we(w.x, w.y, w.z);\n break;\n case 2:\n l += we(w.x, w.y);\n break;\n case 1:\n l += we(w.x);\n break;\n }\n l += \"|\";\n }\n return l;\n }\n }\n // Accumulate the vertex data in the given attribute arrays\n getVertexData(e, t, s) {\n const { barycoord: n, indices: i } = this, r = ce[e], o = n[r], { attributes: l } = t;\n for (const c in l) {\n if (!s[c])\n continue;\n const u = l[c], h = s[c];\n switch (cs(u, i.a, i.b, i.c, o, w), (c === \"normal\" || c === \"tangent\" || c === \"bitangent\") && w.normalize(), u.itemSize) {\n case 4:\n h.push(w.x, w.y, w.z, w.w);\n break;\n case 3:\n h.push(w.x, w.y, w.z);\n break;\n case 2:\n h.push(w.x, w.y);\n break;\n case 1:\n h.push(w.x);\n break;\n }\n }\n }\n // Copy the indices from a target triangle\n initFromTriangle(e) {\n return this.initFromIndices(\n e.indices.a,\n e.indices.b,\n e.indices.c\n );\n }\n // Set the indices for the given\n initFromIndices(e, t, s) {\n return this.indices.a = e, this.indices.b = t, this.indices.c = s, this.clipValues.a = -1, this.clipValues.b = -1, this.clipValues.c = -1, this.barycoord.a.set(1, 0, 0), this.barycoord.b.set(0, 1, 0), this.barycoord.c.set(0, 0, 1), this;\n }\n // Lerp the given vertex along to the provided edge of the provided triangle\n lerpVertexFromEdge(e, t, s, n, i) {\n this.clipValues[i] = b.lerp(e.clipValues[t], e.clipValues[s], n), this.barycoord[i].lerpVectors(e.barycoord[t], e.barycoord[s], n);\n }\n // Copy a vertex from the provided triangle\n copyVertex(e, t, s) {\n this.clipValues[s] = e.clipValues[t], this.barycoord[s].copy(e.barycoord[t]);\n }\n}\nfunction cs(a, e, t, s, n, i) {\n switch (os.fromBufferAttribute(a, e), as.fromBufferAttribute(a, t), ls.fromBufferAttribute(a, s), i.set(0, 0, 0, 0).addScaledVector(os, n.x).addScaledVector(as, n.y).addScaledVector(ls, n.z), a.itemSize) {\n case 3:\n w.w = 0;\n break;\n case 2:\n w.w = 0, w.z = 0;\n break;\n case 1:\n w.w = 0, w.z = 0, w.y = 0;\n break;\n }\n return i;\n}\nfunction we(...a) {\n let s = \"\";\n for (let n = 0, i = a.length; n < i; n++)\n s += ~~(a[n] * 1e5 + 0.5), n !== i - 1 && (s += \"_\");\n return s;\n}\nconst us = {}, Ei = /* @__PURE__ */ new E(), yt = /* @__PURE__ */ new E(), xt = /* @__PURE__ */ new E(), wi = /* @__PURE__ */ new E(), Pi = /* @__PURE__ */ new E(), X = /* @__PURE__ */ new E(), be = /* @__PURE__ */ new E(), j = /* @__PURE__ */ new Y(), le = /* @__PURE__ */ new Y(), hs = /* @__PURE__ */ new Y();\nclass Ri extends xn {\n constructor() {\n super(), this.ellipsoid = new cn(), this.skirtLength = 1e3, this.smoothSkirtNormals = !0, this.solid = !1, this.minLat = -Math.PI / 2, this.maxLat = Math.PI / 2, this.minLon = -Math.PI, this.maxLon = Math.PI, this.attributeList = [\"position\", \"normal\", \"uv\"];\n }\n clipToQuadrant(e, t, s) {\n const { solid: n, skirtLength: i, ellipsoid: r, smoothSkirtNormals: o } = this;\n this.clearSplitOperations(), this.addSplitOperation(ds(\"x\"), !t), this.addSplitOperation(ds(\"y\"), !s);\n let l, c;\n const u = e.geometry.groups[0], h = this.getClippedData(e, u);\n if (this.adjustVertices(h, e.position, 0), n) {\n l = {\n index: h.index.slice().reverse(),\n attributes: {}\n };\n for (const M in h.attributes)\n l.attributes[M] = h.attributes[M].slice();\n const T = l.attributes.normal;\n if (T)\n for (let M = 0; M < T.length; M += 3)\n T[M + 0] *= -1, T[M + 1] *= -1, T[M + 2] *= -1;\n this.adjustVertices(l, e.position, -i);\n }\n if (i > 0) {\n c = {\n index: [],\n attributes: {\n position: [],\n normal: [],\n uv: []\n }\n };\n let T = 0;\n const M = {}, _ = (k, W, $) => {\n const H = we(...k, ...$, ...W);\n H in M || (M[H] = T, T++, c.attributes.position.push(...k), c.attributes.normal.push(...$), c.attributes.uv.push(...W)), c.index.push(M[H]);\n }, C = h.index, v = h.attributes.uv, P = h.attributes.position, R = h.attributes.normal, V = h.index.length / 3;\n for (let k = 0; k < V; k++) {\n const W = 3 * k;\n for (let $ = 0; $ < 3; $++) {\n const H = ($ + 1) % 3, I = C[W + $], A = C[W + H];\n if (j.fromArray(v, I * 2), le.fromArray(v, A * 2), j.x === le.x && (j.x === 0 || j.x === 0.5 || j.x === 1) || j.y === le.y && (j.y === 0 || j.y === 0.5 || j.y === 1)) {\n yt.fromArray(P, I * 3), xt.fromArray(P, A * 3);\n const D = yt, O = xt, L = wi.copy(yt), N = Pi.copy(xt);\n X.copy(L).add(e.position), r.getPositionToNormal(X, X), L.addScaledVector(X, -i), X.copy(N).add(e.position), r.getPositionToNormal(X, X), N.addScaledVector(X, -i), o && R ? (X.fromArray(R, I * 3), be.fromArray(R, A * 3)) : (X.subVectors(D, O), be.subVectors(D, L).cross(X).normalize(), X.copy(be)), _(O, le, be), _(D, j, X), _(L, j, X), _(O, le, be), _(L, j, X), _(N, le, be);\n }\n }\n }\n }\n const d = h.index.length, m = h;\n if (l) {\n const { index: T, attributes: M } = l, _ = m.attributes.position.length / 3;\n for (let C = 0, v = T.length; C < v; C++)\n m.index.push(T[C] + _);\n for (const C in h.attributes)\n m.attributes[C].push(...M[C]);\n }\n if (c) {\n const { index: T, attributes: M } = c, _ = m.attributes.position.length / 3;\n for (let C = 0, v = T.length; C < v; C++)\n m.index.push(T[C] + _);\n for (const C in h.attributes)\n m.attributes[C].push(...M[C]);\n }\n const f = t ? 0 : -0.5, p = s ? 0 : -0.5, g = m.attributes.uv;\n for (let T = 0, M = g.length; T < M; T += 2)\n g[T] = (g[T] + f) * 2, g[T + 1] = (g[T + 1] + p) * 2;\n const y = this.constructMesh(m.attributes, m.index, e);\n y.userData.minHeight = e.userData.minHeight, y.userData.maxHeight = e.userData.maxHeight;\n let x = 0, S = 0;\n return y.geometry.addGroup(S, d, x), S += d, x++, l && (y.geometry.addGroup(S, l.index.length, x), S += l.index.length, x++), c && (y.geometry.addGroup(S, c.index.length, x), S += c.index.length, x++), y;\n }\n adjustVertices(e, t, s) {\n const { ellipsoid: n, minLat: i, maxLat: r, minLon: o, maxLon: l } = this, { attributes: c, vertexIsClipped: u } = e, h = c.position, d = c.uv, m = h.length / 3;\n for (let f = 0; f < m; f++) {\n const p = j.fromArray(d, f * 2);\n u && u[f] && (Math.abs(p.x - 0.5) < 1e-10 && (p.x = 0.5), Math.abs(p.y - 0.5) < 1e-10 && (p.y = 0.5), j.toArray(d, f * 2));\n const g = b.lerp(i, r, p.y), y = b.lerp(o, l, p.x), x = Ei.fromArray(h, f * 3).add(t);\n n.getPositionToCartographic(x, us), n.getCartographicToPosition(g, y, us.height + s, x), x.sub(t), x.toArray(h, f * 3);\n }\n }\n}\nfunction ds(a) {\n return (e, t, s, n, i) => {\n const r = e.attributes.uv;\n return j.fromBufferAttribute(r, t), le.fromBufferAttribute(r, s), hs.fromBufferAttribute(r, n), j[a] * i.x + le[a] * i.y + hs[a] * i.z - 0.5;\n };\n}\nconst ps = Symbol(\"TILE_X\"), fs = Symbol(\"TILE_Y\"), Pe = Symbol(\"TILE_LEVEL\"), me = Symbol(\"TILE_AVAILABLE\"), He = 1e4, ms = /* @__PURE__ */ new E();\nfunction Di(a, e, t, s) {\n if (a && e < a.length) {\n const n = a[e];\n for (let i = 0, r = n.length; i < r; i++) {\n const { startX: o, startY: l, endX: c, endY: u } = n[i];\n if (t >= o && t <= c && s >= l && s <= u)\n return !0;\n }\n }\n return !1;\n}\nfunction Tn(a) {\n const { available: e = null, maxzoom: t = null } = a;\n return t === null ? e.length - 1 : t;\n}\nfunction Bi(a) {\n const { metadataAvailability: e = -1 } = a;\n return e;\n}\nfunction Tt(a, e) {\n const t = a[Pe], s = Bi(e), n = Tn(e);\n return t < n && s !== -1 && t % s === 0;\n}\nfunction Oi(a, e, t, s, n) {\n return n.tiles[0].replace(/{\\s*z\\s*}/g, t).replace(/{\\s*x\\s*}/g, a).replace(/{\\s*y\\s*}/g, e).replace(/{\\s*version\\s*}/g, s);\n}\nclass Ui {\n constructor(e = {}) {\n const {\n useRecommendedSettings: t = !0,\n skirtLength: s = null,\n smoothSkirtNormals: n = !0,\n generateNormals: i = !0,\n solid: r = !1\n } = e;\n this.name = \"QUANTIZED_MESH_PLUGIN\", this.priority = -1e3, this.tiles = null, this.layer = null, this.useRecommendedSettings = t, this.skirtLength = s, this.smoothSkirtNormals = n, this.solid = r, this.generateNormals = i, this.attribution = null, this.tiling = new mn(), this.projection = new re();\n }\n // Plugin function\n init(e) {\n e.fetchOptions.headers = e.fetchOptions.headers || {}, e.fetchOptions.headers.Accept = \"application/vnd.quantized-mesh,application/octet-stream;q=0.9\", this.useRecommendedSettings && (e.errorTarget = 2), this.tiles = e;\n }\n loadRootTileset() {\n const { tiles: e } = this;\n let t = new URL(\"layer.json\", new URL(e.rootURL, location.href));\n return e.invokeAllPlugins((s) => t = s.preprocessURL ? s.preprocessURL(t, null) : t), e.invokeOnePlugin((s) => s.fetchData && s.fetchData(t, this.tiles.fetchOptions)).then((s) => s.json()).then((s) => {\n this.layer = s;\n const {\n projection: n = \"EPSG:4326\",\n extensions: i = [],\n attribution: r = \"\",\n available: o = null\n } = s, {\n tiling: l,\n tiles: c,\n projection: u\n } = this;\n r && (this.attribution = {\n value: r,\n type: \"string\",\n collapsible: !0\n }), i.length > 0 && (c.fetchOptions.headers.Accept += `;extensions=${i.join(\"-\")}`), u.setScheme(n);\n const { tileCountX: h, tileCountY: d } = u;\n l.setProjection(u), l.generateLevels(Tn(s) + 1, h, d);\n const m = [];\n for (let g = 0; g < h; g++) {\n const y = this.createChild(0, g, 0, o);\n y && m.push(y);\n }\n const f = {\n asset: {\n version: \"1.1\"\n },\n geometricError: 1 / 0,\n root: {\n refine: \"REPLACE\",\n geometricError: 1 / 0,\n boundingVolume: {\n region: [...this.tiling.getContentBounds(), -He, He]\n },\n children: m,\n [me]: o,\n [Pe]: -1\n }\n };\n let p = c.rootURL;\n return c.invokeAllPlugins((g) => p = g.preprocessURL ? g.preprocessURL(p, null) : p), c.preprocessTileset(f, p), f;\n });\n }\n parseToMesh(e, t, s, n) {\n const {\n skirtLength: i,\n solid: r,\n smoothSkirtNormals: o,\n generateNormals: l,\n tiles: c\n } = this, u = c.ellipsoid;\n let h;\n if (s === \"quantized_tile_split\") {\n const p = new URL(n).searchParams, g = p.get(\"left\") === \"true\", y = p.get(\"bottom\") === \"true\", x = new Ri();\n x.ellipsoid.copy(u), x.solid = r, x.smoothSkirtNormals = o, x.skirtLength = i === null ? t.geometricError : i;\n const [S, T, M, _] = t.parent.boundingVolume.region;\n x.minLat = T, x.maxLat = _, x.minLon = S, x.maxLon = M, h = x.clipToQuadrant(t.parent.engineData.scene, g, y);\n } else if (s === \"terrain\") {\n const p = new Ii(c.manager);\n p.ellipsoid.copy(u), p.solid = r, p.smoothSkirtNormals = o, p.generateNormals = l, p.skirtLength = i === null ? t.geometricError : i;\n const [g, y, x, S] = t.boundingVolume.region;\n p.minLat = y, p.maxLat = S, p.minLon = g, p.maxLon = x, h = p.parse(e);\n } else\n return;\n const { minHeight: d, maxHeight: m, metadata: f } = h.userData;\n return t.boundingVolume.region[4] = d, t.boundingVolume.region[5] = m, t.engineData.boundingVolume.setRegionData(u, ...t.boundingVolume.region), f && (\"geometricerror\" in f && (t.geometricError = f.geometricerror), Tt(t, this.layer) && \"available\" in f && t.children.length === 0 && (t[me] = [\n ...new Array(t[Pe] + 1).fill(null),\n ...f.available\n ])), t.engineData.scene = h, this.expandChildren(t), h;\n }\n getAttributions(e) {\n this.attribution && e.push(this.attribution);\n }\n // Local functions\n createChild(e, t, s, n) {\n const { tiles: i, layer: r, tiling: o, projection: l } = this, c = i.ellipsoid, u = n === null && e === 0 || Di(n, e, t, s), h = Oi(t, s, e, 1, r), d = [...o.getTileBounds(t, s, e), -He, He], [\n /* west */\n ,\n m,\n /* east */\n ,\n f,\n /* minHeight */\n ,\n p\n ] = d, g = m > 0 != f > 0 ? 0 : Math.min(Math.abs(m), Math.abs(f));\n c.getCartographicToPosition(g, 0, p, ms), ms.z = 0;\n const y = l.tileCountX, T = Math.max(...c.radius) * 2 * Math.PI * 0.25 / (65 * y) / 2 ** e, M = {\n [me]: null,\n [Pe]: e,\n [ps]: t,\n [fs]: s,\n refine: \"REPLACE\",\n geometricError: T,\n boundingVolume: { region: d },\n content: u ? { uri: h } : null,\n children: []\n };\n return Tt(M, r) || (M[me] = n), M;\n }\n expandChildren(e) {\n const t = e[Pe], s = e[ps], n = e[fs], i = e[me];\n if (t >= this.tiling.maxLevel)\n return;\n let r = !1;\n for (let o = 0; o < 2; o++)\n for (let l = 0; l < 2; l++) {\n const c = this.createChild(t + 1, 2 * s + o, 2 * n + l, i);\n c.content !== null ? (e.children.push(c), r = !0) : (c.content = { uri: `tile.quantized_tile_split?bottom=${l === 0}&left=${o === 0}` }, c.internal = { isVirtual: !0 }, e.internal.virtualChildCount++, e.children.push(c));\n }\n r || (e.children.length -= e.internal.virtualChildCount, e.internal.virtualChildCount = 0);\n }\n fetchData(e, t) {\n if (/quantized_tile_split/.test(e))\n return new ArrayBuffer();\n }\n disposeTile(e) {\n const { tiles: t, layer: s } = this;\n if (Tt(e, s) && (e[me] = null), me in e) {\n const { virtualChildCount: n } = e.internal, i = e.children.length, r = i - n;\n for (let o = r; o < i; o++)\n t.processNodeQueue.remove(e.children[o]);\n e.children.length -= n, e.internal.virtualChildCount = 0;\n }\n }\n}\nlet io = class extends kn {\n constructor(e = {}) {\n super({\n assetTypeHandler: (t, s, n) => {\n t === \"TERRAIN\" && s.getPluginByName(\"QUANTIZED_MESH_PLUGIN\") === null ? (console.warn(\n 'CesiumIonAuthPlugin: CesiumIonAuthPlugin plugin auto-registration has been deprecated. Please implement a custom \"assetTypeHandler\" for \"TERRAIN\" using \"QuantizedMeshPlugin\", instead.'\n ), s.registerPlugin(new Ui({\n useRecommendedSettings: this.useRecommendedSettings\n }))) : t === \"IMAGERY\" && s.getPluginByName(\"TMS_TILES_PLUGIN\") === null ? (console.warn(\n 'CesiumIonAuthPlugin: CesiumIonAuthPlugin plugin auto-registration has been deprecated. Please implement a custom \"assetTypeHandler\" for \"IMAGERY\" using \"TMSTilesPlugin\", instead.'\n ), s.registerPlugin(new Ai({\n useRecommendedSettings: this.useRecommendedSettings,\n shape: \"ellipsoid\"\n }))) : console.warn(`CesiumIonAuthPlugin: Cesium Ion asset type \"${t}\" unhandled.`);\n },\n ...e\n }), e.__suppress_warning__ && console.warn(\n 'CesiumIonAuthPlugin: Plugin has been moved to \"3d-tiles-renderer/core/plugins\".'\n );\n }\n};\nconst bt = /* @__PURE__ */ new K();\nclass oo {\n constructor() {\n this.name = \"UPDATE_ON_CHANGE_PLUGIN\", this.tiles = null, this.needsUpdate = !1, this.cameraMatrices = /* @__PURE__ */ new Map();\n }\n init(e) {\n this.tiles = e, this._needsUpdateCallback = () => {\n this.needsUpdate = !0;\n }, this._onCameraAdd = ({ camera: t }) => {\n this.needsUpdate = !0, this.cameraMatrices.set(t, new K());\n }, this._onCameraDelete = ({ camera: t }) => {\n this.needsUpdate = !0, this.cameraMatrices.delete(t);\n }, e.addEventListener(\"needs-update\", this._needsUpdateCallback), e.addEventListener(\"add-camera\", this._onCameraAdd), e.addEventListener(\"delete-camera\", this._onCameraDelete), e.addEventListener(\"camera-resolution-change\", this._needsUpdateCallback), e.cameras.forEach((t) => {\n this._onCameraAdd({ camera: t });\n });\n }\n doTilesNeedUpdate() {\n const e = this.tiles;\n let t = !1;\n this.cameraMatrices.forEach((n, i) => {\n bt.copy(e.group.matrixWorld).premultiply(i.matrixWorldInverse).premultiply(i.projectionMatrixInverse), t = t || !bt.equals(n), n.copy(bt);\n });\n const s = this.needsUpdate;\n return this.needsUpdate = !1, s || t;\n }\n preprocessNode() {\n this.needsUpdate = !0;\n }\n dispose() {\n const e = this.tiles;\n e.removeEventListener(\"camera-resolution-change\", this._needsUpdateCallback), e.removeEventListener(\"needs-update\", this._needsUpdateCallback), e.removeEventListener(\"add-camera\", this._onCameraAdd), e.removeEventListener(\"delete-camera\", this._onCameraDelete);\n }\n}\nconst gs = /* @__PURE__ */ new E();\nfunction Ie(a, e) {\n if (a.isInterleavedBufferAttribute || a.array instanceof e)\n return a;\n const s = e === Int8Array || e === Int16Array || e === Int32Array ? -1 : 0, n = new e(a.count * a.itemSize), i = new J(n, a.itemSize, !0), r = a.itemSize, o = a.count;\n for (let l = 0; l < o; l++)\n for (let c = 0; c < r; c++) {\n const u = b.clamp(a.getComponent(l, c), s, 1);\n i.setComponent(l, c, u);\n }\n return i;\n}\nfunction Ni(a, e = Int16Array) {\n const t = a.geometry, s = t.attributes, n = s.position;\n if (n.isInterleavedBufferAttribute || n.array instanceof e)\n return n;\n const i = new e(n.count * n.itemSize), r = new J(i, n.itemSize, !1), o = n.itemSize, l = n.count;\n t.computeBoundingBox();\n const c = t.boundingBox, { min: u, max: h } = c, d = 2 ** (8 * e.BYTES_PER_ELEMENT - 1) - 1, m = -d;\n for (let f = 0; f < l; f++)\n for (let p = 0; p < o; p++) {\n const g = p === 0 ? \"x\" : p === 1 ? \"y\" : \"z\", y = u[g], x = h[g], S = b.mapLinear(\n n.getComponent(f, p),\n y,\n x,\n m,\n d\n );\n r.setComponent(f, p, S);\n }\n c.getCenter(gs).multiply(a.scale).applyQuaternion(a.quaternion), a.position.add(gs), a.scale.x *= 0.5 * (h.x - u.x) / d, a.scale.y *= 0.5 * (h.y - u.y) / d, a.scale.z *= 0.5 * (h.z - u.z) / d, s.position = r, a.geometry.boundingBox = null, a.geometry.boundingSphere = null, a.updateMatrixWorld();\n}\nclass ao {\n constructor(e) {\n this._options = {\n // whether to generate normals if they don't already exist.\n generateNormals: !1,\n // whether to disable use of mipmaps since they are typically not necessary\n // with something like 3d tiles.\n disableMipmaps: !0,\n // whether to compress certain attributes\n compressIndex: !0,\n compressNormals: !1,\n compressUvs: !1,\n compressPosition: !1,\n // the TypedArray type to use when compressing the attributes\n uvType: Int8Array,\n normalType: Int8Array,\n positionType: Int16Array,\n ...e\n }, this.name = \"TILES_COMPRESSION_PLUGIN\", this.priority = -100;\n }\n processTileModel(e, t) {\n const {\n generateNormals: s,\n disableMipmaps: n,\n compressIndex: i,\n compressUvs: r,\n compressNormals: o,\n compressPosition: l,\n uvType: c,\n normalType: u,\n positionType: h\n } = this._options;\n e.traverse((d) => {\n if (d.material && n) {\n const m = d.material;\n for (const f in m) {\n const p = m[f];\n p && p.isTexture && p.generateMipmaps && (p.generateMipmaps = !1, p.minFilter = sn);\n }\n }\n if (d.geometry) {\n const m = d.geometry, f = m.attributes;\n if (r) {\n const { uv: p, uv1: g, uv2: y, uv3: x } = f;\n p && (f.uv = Ie(p, c)), g && (f.uv1 = Ie(g, c)), y && (f.uv2 = Ie(y, c)), x && (f.uv3 = Ie(x, c));\n }\n if (s && !f.normals && m.computeVertexNormals(), o && f.normals && (f.normals = Ie(f.normals, u)), l && Ni(d, h), i && m.index) {\n const p = f.position.count, g = m.index, y = p > 65535 ? Uint32Array : p > 255 ? Uint16Array : Uint8Array;\n if (!(g.array instanceof y)) {\n const x = new y(m.index.count);\n x.set(g.array);\n const S = new J(x, 1);\n m.setIndex(S);\n }\n }\n }\n });\n }\n}\nfunction q(a, e, t) {\n return a && e in a ? a[e] : t;\n}\nfunction bn(a) {\n return a !== \"BOOLEAN\" && a !== \"STRING\" && a !== \"ENUM\";\n}\nfunction Vi(a) {\n return /^FLOAT/.test(a);\n}\nfunction Ve(a) {\n return /^VEC/.test(a);\n}\nfunction Fe(a) {\n return /^MAT/.test(a);\n}\nfunction _n(a, e, t, s = null) {\n return Fe(t) || Ve(t) ? s.fromArray(a, e) : a[e];\n}\nfunction Vt(a) {\n const { type: e, componentType: t } = a;\n switch (e) {\n case \"SCALAR\":\n return t === \"INT64\" ? 0n : 0;\n case \"VEC2\":\n return new Y();\n case \"VEC3\":\n return new E();\n case \"VEC4\":\n return new Oe();\n case \"MAT2\":\n return new Xn();\n case \"MAT3\":\n return new Yn();\n case \"MAT4\":\n return new K();\n case \"BOOLEAN\":\n return !1;\n case \"STRING\":\n return \"\";\n // the final value for enums is a string but are represented as integers\n // during intermediate steps\n case \"ENUM\":\n return 0;\n }\n}\nfunction ys(a, e) {\n if (e == null)\n return !1;\n switch (a) {\n case \"SCALAR\":\n return typeof e == \"number\" || typeof e == \"bigint\";\n case \"VEC2\":\n return e.isVector2;\n case \"VEC3\":\n return e.isVector3;\n case \"VEC4\":\n return e.isVector4;\n case \"MAT2\":\n return e.isMatrix2;\n case \"MAT3\":\n return e.isMatrix3;\n case \"MAT4\":\n return e.isMatrix4;\n case \"BOOLEAN\":\n return typeof e == \"boolean\";\n case \"STRING\":\n return typeof e == \"string\";\n case \"ENUM\":\n return typeof e == \"number\" || typeof e == \"bigint\";\n }\n throw new Error(\"ClassProperty: invalid type.\");\n}\nfunction De(a, e = null) {\n switch (a) {\n case \"INT8\":\n return Int8Array;\n case \"INT16\":\n return Int16Array;\n case \"INT32\":\n return Int32Array;\n case \"INT64\":\n return BigInt64Array;\n case \"UINT8\":\n return Uint8Array;\n case \"UINT16\":\n return Uint16Array;\n case \"UINT32\":\n return Uint32Array;\n case \"UINT64\":\n return BigUint64Array;\n case \"FLOAT32\":\n return Float32Array;\n case \"FLOAT64\":\n return Float64Array;\n }\n switch (e) {\n case \"BOOLEAN\":\n return Uint8Array;\n case \"STRING\":\n return Uint8Array;\n }\n throw new Error(\"ClassProperty: invalid type.\");\n}\nfunction Fi(a, e = null) {\n if (a.array) {\n e = e && Array.isArray(e) ? e : [], e.length = a.count;\n for (let s = 0, n = e.length; s < n; s++)\n e[s] = nt(a, e[s]);\n } else\n e = nt(a, e);\n return e;\n}\nfunction nt(a, e = null) {\n const t = a.default, s = a.type;\n if (e = e || Vt(a), t === null) {\n switch (s) {\n case \"SCALAR\":\n return 0;\n case \"VEC2\":\n return e.set(0, 0);\n case \"VEC3\":\n return e.set(0, 0, 0);\n case \"VEC4\":\n return e.set(0, 0, 0, 0);\n case \"MAT2\":\n return e.identity();\n case \"MAT3\":\n return e.identity();\n case \"MAT4\":\n return e.identity();\n case \"BOOLEAN\":\n return !1;\n case \"STRING\":\n return \"\";\n case \"ENUM\":\n return \"\";\n }\n throw new Error(\"ClassProperty: invalid type.\");\n } else if (Fe(s))\n e.fromArray(t);\n else if (Ve(s))\n e.fromArray(t);\n else\n return t;\n}\nfunction ki(a, e) {\n if (a.noData === null)\n return e;\n const t = a.noData, s = a.type;\n if (Array.isArray(e))\n for (let r = 0, o = e.length; r < o; r++)\n e[r] = n(e[r]);\n else\n e = n(e);\n return e;\n function n(r) {\n return i(r) && (r = nt(a, r)), r;\n }\n function i(r) {\n if (Fe(s)) {\n const o = r.elements;\n for (let l = 0, c = t.length; l < c; l++)\n if (t[l] !== o[l])\n return !1;\n return !0;\n } else if (Ve(s)) {\n for (let o = 0, l = t.length; o < l; o++)\n if (t[o] !== r.getComponent(o))\n return !1;\n return !0;\n } else\n return t === r;\n }\n}\nfunction Gi(a, e) {\n switch (a) {\n case \"INT8\":\n return Math.max(e / 127, -1);\n case \"INT16\":\n return Math.max(e, 32767, -1);\n case \"INT32\":\n return Math.max(e / 2147483647, -1);\n case \"INT64\":\n return Math.max(Number(e) / 9223372036854776e3, -1);\n // eslint-disable-line no-loss-of-precision\n case \"UINT8\":\n return e / 255;\n case \"UINT16\":\n return e / 65535;\n case \"UINT32\":\n return e / 4294967295;\n case \"UINT64\":\n return Number(e) / 18446744073709552e3;\n }\n}\nfunction zi(a, e) {\n const {\n type: t,\n componentType: s,\n scale: n,\n offset: i,\n normalized: r\n } = a;\n if (Array.isArray(e))\n for (let h = 0, d = e.length; h < d; h++)\n e[h] = o(e[h]);\n else\n e = o(e);\n return e;\n function o(h) {\n return Fe(t) ? h = c(h) : Ve(t) ? h = l(h) : h = u(h), h;\n }\n function l(h) {\n return h.x = u(h.x), h.y = u(h.y), \"z\" in h && (h.z = u(h.z)), \"w\" in h && (h.w = u(h.w)), h;\n }\n function c(h) {\n const d = h.elements;\n for (let m = 0, f = d.length; m < f; m++)\n d[m] = u(d[m]);\n return h;\n }\n function u(h) {\n return r && (h = Gi(s, h)), (r || Vi(s)) && (h = h * n + i), h;\n }\n}\nfunction $t(a, e, t = null) {\n if (a.array) {\n Array.isArray(e) || (e = new Array(a.count || 0)), e.length = t !== null ? t : a.count;\n for (let s = 0, n = e.length; s < n; s++)\n ys(a.type, e[s]) || (e[s] = Vt(a));\n } else\n ys(a.type, e) || (e = Vt(a));\n return e;\n}\nfunction it(a, e) {\n for (const t in e)\n t in a || delete e[t];\n for (const t in a) {\n const s = a[t];\n e[t] = $t(s, e[t]);\n }\n}\nfunction Hi(a) {\n switch (a) {\n case \"ENUM\":\n return 1;\n case \"SCALAR\":\n return 1;\n case \"VEC2\":\n return 2;\n case \"VEC3\":\n return 3;\n case \"VEC4\":\n return 4;\n case \"MAT2\":\n return 4;\n case \"MAT3\":\n return 9;\n case \"MAT4\":\n return 16;\n // unused\n case \"BOOLEAN\":\n return -1;\n case \"STRING\":\n return -1;\n default:\n return -1;\n }\n}\nclass ht {\n constructor(e, t, s = null) {\n this.name = t.name || null, this.description = t.description || null, this.type = t.type, this.componentType = t.componentType || null, this.enumType = t.enumType || null, this.array = t.array || !1, this.count = t.count || 0, this.normalized = t.normalized || !1, this.offset = t.offset || 0, this.scale = q(t, \"scale\", 1), this.max = q(t, \"max\", 1 / 0), this.min = q(t, \"min\", -1 / 0), this.required = t.required || !1, this.noData = q(t, \"noData\", null), this.default = q(t, \"default\", null), this.semantic = q(t, \"semantic\", null), this.enumSet = null, this.accessorProperty = s, s && (this.offset = q(s, \"offset\", this.offset), this.scale = q(s, \"scale\", this.scale), this.max = q(s, \"max\", this.max), this.min = q(s, \"min\", this.min)), t.type === \"ENUM\" && (this.enumSet = e[this.enumType], this.componentType === null && (this.componentType = q(this.enumSet, \"valueType\", \"UINT16\")));\n }\n // shape the given target to match the data type of the property\n // enums are set to their integer value\n shapeToProperty(e, t = null) {\n return $t(this, e, t);\n }\n // resolve the given object to the default value for the property for a single element\n // enums are set to a default string\n resolveDefaultElement(e) {\n return nt(this, e);\n }\n // resolve the target to the default value for the property for every element if it's an array\n // enums are set to a default string\n resolveDefault(e) {\n return Fi(this, e);\n }\n // converts any instances of no data to the default value\n resolveNoData(e) {\n return ki(this, e);\n }\n // converts enums integers in the given target to strings\n resolveEnumsToStrings(e) {\n const t = this.enumSet;\n if (this.type === \"ENUM\")\n if (Array.isArray(e))\n for (let n = 0, i = e.length; n < i; n++)\n e[n] = s(e[n]);\n else\n e = s(e);\n return e;\n function s(n) {\n const i = t.values.find((r) => r.value === n);\n return i === null ? \"\" : i.name;\n }\n }\n // apply scales\n adjustValueScaleOffset(e) {\n return bn(this.type) ? zi(this, e) : e;\n }\n}\nclass Qt {\n constructor(e, t = {}, s = {}, n = null) {\n this.definition = e, this.class = t[e.class], this.className = e.class, this.enums = s, this.data = n, this.name = \"name\" in e ? e.name : null, this.properties = null;\n }\n getPropertyNames() {\n return Object.keys(this.class.properties);\n }\n includesData(e) {\n return !!this.definition.properties[e];\n }\n dispose() {\n }\n _initProperties(e = ht) {\n const t = {};\n for (const s in this.class.properties)\n t[s] = new e(this.enums, this.class.properties[s], this.definition.properties[s]);\n this.properties = t;\n }\n}\nclass qi extends ht {\n constructor(e, t, s = null) {\n super(e, t, s), this.attribute = (s == null ? void 0 : s.attribute) ?? null;\n }\n}\nclass Wi extends Qt {\n constructor(...e) {\n super(...e), this.isPropertyAttributeAccessor = !0, this._initProperties(qi);\n }\n getData(e, t, s = {}) {\n const n = this.properties;\n it(n, s);\n for (const i in n)\n s[i] = this.getPropertyValue(i, e, t, s[i]);\n return s;\n }\n getPropertyValue(e, t, s, n = null) {\n if (t >= this.count)\n throw new Error(\"PropertyAttributeAccessor: Requested index is outside the range of the buffer.\");\n const i = this.properties[e], r = i.type;\n if (i) {\n if (!this.definition.properties[e])\n return i.resolveDefault(n);\n } else throw new Error(\"PropertyAttributeAccessor: Requested class property does not exist.\");\n n = i.shapeToProperty(n);\n const o = s.getAttribute(i.attribute.toLowerCase());\n if (Fe(r)) {\n const l = n.elements;\n for (let c = 0, u = l.length; c < u; c < u)\n l[c] = o.getComponent(t, c);\n } else if (Ve(r))\n n.fromBufferAttribute(o, t);\n else if (r === \"SCALAR\" || r === \"ENUM\")\n n = o.getX(t);\n else\n throw new Error(\"StructuredMetadata.PropertyAttributeAccessor: BOOLEAN and STRING types are not supported by property attributes.\");\n return n = i.adjustValueScaleOffset(n), n = i.resolveEnumsToStrings(n), n = i.resolveNoData(n), n;\n }\n}\nclass ji extends ht {\n constructor(e, t, s = null) {\n super(e, t, s), this.values = (s == null ? void 0 : s.values) ?? null, this.valueLength = Hi(this.type), this.arrayOffsets = q(s, \"arrayOffsets\", null), this.stringOffsets = q(s, \"stringOffsets\", null), this.arrayOffsetType = q(s, \"arrayOffsetType\", \"UINT32\"), this.stringOffsetType = q(s, \"stringOffsetType\", \"UINT32\");\n }\n // returns the necessary array length based on the array offsets if present\n getArrayLengthFromId(e, t) {\n let s = this.count;\n if (this.arrayOffsets !== null) {\n const { arrayOffsets: n, arrayOffsetType: i } = this, r = De(i), o = new r(e[n]);\n s = o[t + 1] - o[t];\n }\n return s;\n }\n // returns the index offset into the data buffer for the given id based on the\n // the array offsets if present\n getIndexOffsetFromId(e, t) {\n let s = t;\n if (this.arrayOffsets) {\n const { arrayOffsets: n, arrayOffsetType: i } = this, r = De(i);\n s = new r(e[n])[s];\n } else this.array && (s *= this.count);\n return s;\n }\n}\nclass Yi extends Qt {\n constructor(...e) {\n super(...e), this.isPropertyTableAccessor = !0, this.count = this.definition.count, this._initProperties(ji);\n }\n getData(e, t = {}) {\n const s = this.properties;\n it(s, t);\n for (const n in s)\n t[n] = this.getPropertyValue(n, e, t[n]);\n return t;\n }\n // reads an individual element\n _readValueAtIndex(e, t, s, n = null) {\n const i = this.properties[e], { componentType: r, type: o } = i, l = this.data, c = l[i.values], u = De(r, o), h = new u(c), d = i.getIndexOffsetFromId(l, t);\n if (bn(o) || o === \"ENUM\")\n return _n(h, (d + s) * i.valueLength, o, n);\n if (o === \"STRING\") {\n let m = d + s, f = 0;\n if (i.stringOffsets !== null) {\n const { stringOffsets: g, stringOffsetType: y } = i, x = De(y), S = new x(l[g]);\n f = S[m + 1] - S[m], m = S[m];\n }\n const p = new Uint8Array(h.buffer, m, f);\n n = new TextDecoder().decode(p);\n } else if (o === \"BOOLEAN\") {\n const m = d + s, f = Math.floor(m / 8), p = m % 8;\n n = (h[f] >> p & 1) === 1;\n }\n return n;\n }\n // Reads the data for the given table index\n getPropertyValue(e, t, s = null) {\n if (t >= this.count)\n throw new Error(\"PropertyTableAccessor: Requested index is outside the range of the table.\");\n const n = this.properties[e];\n if (n) {\n if (!this.definition.properties[e])\n return n.resolveDefault(s);\n } else throw new Error(\"PropertyTableAccessor: Requested property does not exist.\");\n const i = n.array, r = this.data, o = n.getArrayLengthFromId(r, t);\n if (s = n.shapeToProperty(s, o), i)\n for (let l = 0, c = s.length; l < c; l++)\n s[l] = this._readValueAtIndex(e, t, l, s[l]);\n else\n s = this._readValueAtIndex(e, t, 0, s);\n return s = n.adjustValueScaleOffset(s), s = n.resolveEnumsToStrings(s), s = n.resolveNoData(s), s;\n }\n}\nconst ve = /* @__PURE__ */ new ei();\nclass xs {\n constructor() {\n this._renderer = new $n(), this._target = new ts(1, 1), this._texTarget = new ts(), this._quad = new un(new Qn({\n blending: Kn,\n blendDst: Jn,\n blendSrc: Zn,\n uniforms: {\n map: { value: null },\n pixel: { value: new Y() }\n },\n vertexShader: (\n /* glsl */\n `\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t\t\t}\n\t\t\t`\n ),\n fragmentShader: (\n /* glsl */\n `\n\t\t\t\tuniform sampler2D map;\n\t\t\t\tuniform ivec2 pixel;\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tgl_FragColor = texelFetch( map, pixel, 0 );\n\n\t\t\t\t}\n\t\t\t`\n )\n }));\n }\n // increases the width of the target render target to support more data\n increaseSizeTo(e) {\n this._target.setSize(Math.max(this._target.width, e), 1);\n }\n // read data from the rendered texture asynchronously\n readDataAsync(e) {\n const { _renderer: t, _target: s } = this;\n return t.readRenderTargetPixelsAsync(s, 0, 0, e.length / 4, 1, e);\n }\n // read data from the rendered texture\n readData(e) {\n const { _renderer: t, _target: s } = this;\n t.readRenderTargetPixels(s, 0, 0, e.length / 4, 1, e);\n }\n // render a single pixel from the source at the destination point on the render target\n // takes the texture, pixel to read from, and pixel to render in to\n renderPixelToTarget(e, t, s) {\n const { _renderer: n, _target: i } = this;\n ve.min.copy(t), ve.max.copy(t), ve.max.x += 1, ve.max.y += 1, n.initRenderTarget(i), n.copyTextureToTexture(e, i.texture, ve, s, 0);\n }\n}\nconst he = /* @__PURE__ */ new class {\n constructor() {\n let a = null;\n Object.getOwnPropertyNames(xs.prototype).forEach((e) => {\n e !== \"constructor\" && (this[e] = (...t) => (a = a || new xs(), a[e](...t)));\n });\n }\n}(), Ts = /* @__PURE__ */ new Y(), bs = /* @__PURE__ */ new Y(), _s = /* @__PURE__ */ new Y();\nfunction Xi(a, e) {\n return e === 0 ? a.getAttribute(\"uv\") : a.getAttribute(`uv${e}`);\n}\nfunction Sn(a, e, t = new Array(3)) {\n let s = 3 * e, n = 3 * e + 1, i = 3 * e + 2;\n return a.index && (s = a.index.getX(s), n = a.index.getX(n), i = a.index.getX(i)), t[0] = s, t[1] = n, t[2] = i, t;\n}\nfunction Mn(a, e, t, s, n) {\n const [i, r, o] = s, l = Xi(a, e);\n Ts.fromBufferAttribute(l, i), bs.fromBufferAttribute(l, r), _s.fromBufferAttribute(l, o), n.set(0, 0, 0).addScaledVector(Ts, t.x).addScaledVector(bs, t.y).addScaledVector(_s, t.z);\n}\nfunction Cn(a, e, t, s) {\n const n = a.x - Math.floor(a.x), i = a.y - Math.floor(a.y), r = Math.floor(n * e % e), o = Math.floor(i * t % t);\n return s.set(r, o), s;\n}\nconst Ss = /* @__PURE__ */ new Y(), Ms = /* @__PURE__ */ new Y(), Cs = /* @__PURE__ */ new Y();\nclass $i extends ht {\n constructor(e, t, s = null) {\n super(e, t, s), this.channels = q(s, \"channels\", [0]), this.index = q(s, \"index\", null), this.texCoord = q(s, \"texCoord\", null), this.valueLength = parseInt(this.type.replace(/[^0-9]/g, \"\")) || 1;\n }\n // takes the buffer to read from and the value index to read\n readDataFromBuffer(e, t, s = null) {\n const n = this.type;\n if (n === \"BOOLEAN\" || n === \"STRING\")\n throw new Error(\"PropertyTextureAccessor: BOOLEAN and STRING types not supported.\");\n return _n(e, t * this.valueLength, n, s);\n }\n}\nclass Qi extends Qt {\n constructor(...e) {\n super(...e), this.isPropertyTextureAccessor = !0, this._asyncRead = !1, this._initProperties($i);\n }\n // Reads the full set of property data\n getData(e, t, s, n = {}) {\n const i = this.properties;\n it(i, n);\n const r = Object.keys(i), o = r.map((l) => n[l]);\n return this.getPropertyValuesAtTexel(r, e, t, s, o), r.forEach((l, c) => n[l] = o[c]), n;\n }\n // Reads the full set of property data asynchronously\n async getDataAsync(e, t, s, n = {}) {\n const i = this.properties;\n it(i, n);\n const r = Object.keys(i), o = r.map((l) => n[l]);\n return await this.getPropertyValuesAtTexelAsync(r, e, t, s, o), r.forEach((l, c) => n[l] = o[c]), n;\n }\n // Reads values asynchronously\n getPropertyValuesAtTexelAsync(...e) {\n this._asyncRead = !0;\n const t = this.getPropertyValuesAtTexel(...e);\n return this._asyncRead = !1, t;\n }\n // Reads values from the textures synchronously\n getPropertyValuesAtTexel(e, t, s, n, i = []) {\n for (; i.length < e.length; ) i.push(null);\n i.length = e.length, he.increaseSizeTo(i.length);\n const r = this.data, o = this.definition.properties, l = this.properties, c = Sn(n, t);\n for (let d = 0, m = e.length; d < m; d++) {\n const f = e[d];\n if (!o[f])\n continue;\n const p = l[f], g = r[p.index];\n Mn(n, p.texCoord, s, c, Ss), Cn(Ss, g.image.width, g.image.height, Ms), Cs.set(d, 0), he.renderPixelToTarget(g, Ms, Cs);\n }\n const u = new Uint8Array(e.length * 4);\n if (this._asyncRead)\n return he.readDataAsync(u).then(() => (h.call(this), i));\n return he.readData(u), h.call(this), i;\n function h() {\n for (let d = 0, m = e.length; d < m; d++) {\n const f = e[d], p = l[f], g = p.type;\n if (i[d] = $t(p, i[d]), p) {\n if (!o[f]) {\n i[d] = p.resolveDefault(i);\n continue;\n }\n } else throw new Error(\"PropertyTextureAccessor: Requested property does not exist.\");\n const y = p.valueLength * (p.count || 1), x = p.channels.map((_) => u[4 * d + _]), S = p.componentType, T = De(S, g), M = new T(y);\n if (new Uint8Array(M.buffer).set(x), p.array) {\n const _ = i[d];\n for (let C = 0, v = _.length; C < v; C++)\n _[C] = p.readDataFromBuffer(M, C, _[C]);\n } else\n i[d] = p.readDataFromBuffer(M, 0, i[d]);\n i[d] = p.adjustValueScaleOffset(i[d]), i[d] = p.resolveEnumsToStrings(i[d]), i[d] = p.resolveNoData(i[d]);\n }\n }\n }\n // dispose all of the texture data used\n dispose() {\n this.data.forEach((e) => {\n e && (e.dispose(), e.image instanceof ImageBitmap && e.image.close());\n });\n }\n}\nclass As {\n constructor(e, t, s, n = null, i = null) {\n const {\n schema: r,\n propertyTables: o = [],\n propertyTextures: l = [],\n propertyAttributes: c = []\n } = e, { enums: u, classes: h } = r, d = o.map((p) => new Yi(p, h, u, s));\n let m = [], f = [];\n n && (n.propertyTextures && (m = n.propertyTextures.map((p) => new Qi(l[p], h, u, t))), n.propertyAttributes && (f = n.propertyAttributes.map((p) => new Wi(c[p], h, u)))), this.schema = r, this.tableAccessors = d, this.textureAccessors = m, this.attributeAccessors = f, this.object = i, this.textures = t, this.nodeMetadata = n;\n }\n // Property Tables\n getPropertyTableData(e, t, s = null) {\n if (!Array.isArray(e) || !Array.isArray(t))\n s = s || {}, s = this.tableAccessors[e].getData(t, s);\n else {\n s = s || [];\n const n = Math.min(e.length, t.length);\n s.length = n;\n for (let i = 0; i < n; i++) {\n const r = this.tableAccessors[e[i]];\n s[i] = r.getData(t[i], s[i]);\n }\n }\n return s;\n }\n getPropertyTableInfo(e = null) {\n if (e === null && (e = this.tableAccessors.map((t, s) => s)), Array.isArray(e))\n return e.map((t) => {\n const s = this.tableAccessors[t];\n return {\n name: s.name,\n className: s.definition.class\n };\n });\n {\n const t = this.tableAccessors[e];\n return {\n name: t.name,\n className: t.definition.class\n };\n }\n }\n // Property Textures\n getPropertyTextureData(e, t, s = []) {\n const n = this.textureAccessors;\n s.length = n.length;\n for (let i = 0; i < n.length; i++) {\n const r = n[i];\n s[i] = r.getData(e, t, this.object.geometry, s[i]);\n }\n return s;\n }\n async getPropertyTextureDataAsync(e, t, s = []) {\n const n = this.textureAccessors;\n s.length = n.length;\n const i = [];\n for (let r = 0; r < n.length; r++) {\n const l = n[r].getDataAsync(e, t, this.object.geometry, s[r]).then((c) => {\n s[r] = c;\n });\n i.push(l);\n }\n return await Promise.all(i), s;\n }\n getPropertyTextureInfo() {\n return this.textureAccessors;\n }\n // Property Attributes\n getPropertyAttributeData(e, t = []) {\n const s = this.attributeAccessors;\n t.length = s.length;\n for (let n = 0; n < s.length; n++) {\n const i = s[n];\n t[n] = i.getData(e, this.object.geometry, t[n]);\n }\n return t;\n }\n getPropertyAttributeInfo() {\n return this.attributeAccessors.map((e) => ({\n name: e.name,\n className: e.definition.class\n }));\n }\n dispose() {\n this.textureAccessors.forEach((e) => e.dispose()), this.tableAccessors.forEach((e) => e.dispose()), this.attributeAccessors.forEach((e) => e.dispose());\n }\n}\nconst Le = \"EXT_structural_metadata\";\nfunction Zi(a, e = []) {\n var n;\n const t = ((n = a.json.textures) == null ? void 0 : n.length) || 0, s = new Array(t).fill(null);\n return e.forEach(({ properties: i }) => {\n for (const r in i) {\n const { index: o } = i[r];\n s[o] === null && (s[o] = a.loadTexture(o));\n }\n }), Promise.all(s);\n}\nfunction Ji(a, e = []) {\n var n;\n const t = ((n = a.json.bufferViews) == null ? void 0 : n.length) || 0, s = new Array(t).fill(null);\n return e.forEach(({ properties: i }) => {\n for (const r in i) {\n const { values: o, arrayOffsets: l, stringOffsets: c } = i[r];\n s[o] === null && (s[o] = a.loadBufferView(o)), s[l] === null && (s[l] = a.loadBufferView(l)), s[c] === null && (s[c] = a.loadBufferView(c));\n }\n }), Promise.all(s);\n}\nclass Ki {\n constructor(e) {\n this.parser = e, this.name = Le;\n }\n async afterRoot({ scene: e, parser: t }) {\n const s = t.json.extensionsUsed;\n if (!s || !s.includes(Le))\n return;\n let n = null, i = t.json.extensions[Le];\n if (i.schemaUri) {\n const { manager: c, path: u, requestHeader: h, crossOrigin: d } = t.options, m = new URL(i.schemaUri, u).toString(), f = new ti(c);\n f.setCrossOrigin(d), f.setResponseType(\"json\"), f.setRequestHeader(h), n = f.loadAsync(m).then((p) => {\n i = { ...i, schema: p };\n });\n }\n const [r, o] = await Promise.all([\n Zi(t, i.propertyTextures),\n Ji(t, i.propertyTables),\n n\n ]), l = new As(i, r, o);\n e.userData.structuralMetadata = l, e.traverse((c) => {\n var u;\n if (t.associations.has(c)) {\n const { meshes: h, primitives: d } = t.associations.get(c), m = (u = t.json.meshes[h]) == null ? void 0 : u.primitives[d];\n if (m && m.extensions && m.extensions[Le]) {\n const f = m.extensions[Le];\n c.userData.structuralMetadata = new As(i, r, o, f, c);\n } else\n c.userData.structuralMetadata = l;\n }\n });\n }\n}\nconst Is = /* @__PURE__ */ new Y(), vs = /* @__PURE__ */ new Y(), Ls = /* @__PURE__ */ new Y();\nfunction er(a) {\n return a.x > a.y && a.x > a.z ? 0 : a.y > a.z ? 1 : 2;\n}\nclass tr {\n constructor(e, t, s) {\n this.geometry = e, this.textures = t, this.data = s, this._asyncRead = !1, this.featureIds = s.featureIds.map((n) => {\n const { texture: i, ...r } = n, o = {\n label: null,\n propertyTable: null,\n nullFeatureId: null,\n ...r\n };\n return i && (o.texture = {\n texCoord: 0,\n channels: [0],\n ...i\n }), o;\n });\n }\n // returns list of textures\n getTextures() {\n return this.textures;\n }\n // returns a set of info for each feature\n getFeatureInfo() {\n return this.featureIds;\n }\n // performs texture data read back asynchronously\n getFeaturesAsync(...e) {\n this._asyncRead = !0;\n const t = this.getFeatures(...e);\n return this._asyncRead = !1, t;\n }\n // returns all features for the given point on the given triangle\n getFeatures(e, t) {\n const { geometry: s, textures: n, featureIds: i } = this, r = new Array(i.length).fill(null), o = i.length;\n he.increaseSizeTo(o);\n const l = Sn(s, e), c = l[er(t)];\n for (let d = 0, m = i.length; d < m; d++) {\n const f = i[d], p = \"nullFeatureId\" in f ? f.nullFeatureId : null;\n if (\"texture\" in f) {\n const g = n[f.texture.index];\n Mn(s, f.texture.texCoord, t, l, Is), Cn(Is, g.image.width, g.image.height, vs), Ls.set(d, 0), he.renderPixelToTarget(n[f.texture.index], vs, Ls);\n } else if (\"attribute\" in f) {\n const y = s.getAttribute(`_feature_id_${f.attribute}`).getX(c);\n y !== p && (r[d] = y);\n } else {\n const g = c;\n g !== p && (r[d] = g);\n }\n }\n const u = new Uint8Array(o * 4);\n if (this._asyncRead)\n return he.readDataAsync(u).then(() => (h(), r));\n return he.readData(u), h(), r;\n function h() {\n const d = new Uint32Array(1);\n for (let m = 0, f = i.length; m < f; m++) {\n const p = i[m], g = \"nullFeatureId\" in p ? p.nullFeatureId : null;\n if (\"texture\" in p) {\n const { channels: y } = p.texture, x = y.map((T) => u[4 * m + T]);\n new Uint8Array(d.buffer).set(x);\n const S = d[0];\n S !== g && (r[m] = S);\n }\n }\n }\n }\n // dispose all of the texture data used\n dispose() {\n this.textures.forEach((e) => {\n e && (e.dispose(), e.image instanceof ImageBitmap && e.image.close());\n });\n }\n}\nconst rt = \"EXT_mesh_features\";\nfunction Es(a, e, t) {\n a.traverse((s) => {\n var n;\n if (e.associations.has(s)) {\n const { meshes: i, primitives: r } = e.associations.get(s), o = (n = e.json.meshes[i]) == null ? void 0 : n.primitives[r];\n o && o.extensions && o.extensions[rt] && t(s, o.extensions[rt]);\n }\n });\n}\nclass sr {\n constructor(e) {\n this.parser = e, this.name = rt;\n }\n async afterRoot({ scene: e, parser: t }) {\n var o;\n const s = t.json.extensionsUsed;\n if (!s || !s.includes(rt))\n return;\n const n = ((o = t.json.textures) == null ? void 0 : o.length) || 0, i = new Array(n).fill(null);\n Es(e, t, (l, { featureIds: c }) => {\n c.forEach((u) => {\n if (u.texture && i[u.texture.index] === null) {\n const h = u.texture.index;\n i[h] = t.loadTexture(h);\n }\n });\n });\n const r = await Promise.all(i);\n Es(e, t, (l, c) => {\n l.userData.meshFeatures = new tr(l.geometry, r, c);\n });\n }\n}\nclass nr {\n constructor() {\n this.name = \"CESIUM_RTC\";\n }\n afterRoot(e) {\n if (e.parser.json.extensions && e.parser.json.extensions.CESIUM_RTC) {\n const { center: t } = e.parser.json.extensions.CESIUM_RTC;\n t && (e.scene.position.x += t[0], e.scene.position.y += t[1], e.scene.position.z += t[2]);\n }\n }\n}\nclass lo {\n constructor(e) {\n e = {\n metadata: !0,\n rtc: !0,\n plugins: [],\n dracoLoader: null,\n ktxLoader: null,\n meshoptDecoder: null,\n autoDispose: !0,\n ...e\n }, this.tiles = null, this.metadata = e.metadata, this.rtc = e.rtc, this.plugins = e.plugins, this.dracoLoader = e.dracoLoader, this.ktxLoader = e.ktxLoader, this.meshoptDecoder = e.meshoptDecoder, this._gltfRegex = /\\.(gltf|glb)$/g, this._dracoRegex = /\\.drc$/g, this._loader = null;\n }\n init(e) {\n const t = new gi(e.manager);\n this.dracoLoader && (t.setDRACOLoader(this.dracoLoader), e.manager.addHandler(this._dracoRegex, this.dracoLoader)), this.ktxLoader && t.setKTX2Loader(this.ktxLoader), this.meshoptDecoder && t.setMeshoptDecoder(this.meshoptDecoder), this.rtc && t.register(() => new nr()), this.metadata && (t.register(() => new Ki()), t.register(() => new sr())), this.plugins.forEach((s) => t.register(s)), e.manager.addHandler(this._gltfRegex, t), this.tiles = e, this._loader = t;\n }\n dispose() {\n this.tiles.manager.removeHandler(this._gltfRegex), this.tiles.manager.removeHandler(this._dracoRegex), this.autoDispose && (this.ktxLoader.dispose(), this.dracoLoader.dispose());\n }\n}\nconst qe = /* @__PURE__ */ new de();\nclass co {\n constructor(e) {\n e = {\n up: \"+z\",\n recenter: !0,\n lat: null,\n lon: null,\n height: 0,\n azimuth: 0,\n elevation: 0,\n roll: 0,\n ...e\n }, this.tiles = null, this.up = e.up.toLowerCase().replace(/\\s+/, \"\"), this.lat = e.lat, this.lon = e.lon, this.height = e.height, this.azimuth = e.azimuth, this.elevation = e.elevation, this.roll = e.roll, this.recenter = e.recenter, this._callback = null;\n }\n init(e) {\n this.tiles = e, this._callback = () => {\n const { up: t, lat: s, lon: n, height: i, azimuth: r, elevation: o, roll: l, recenter: c } = this;\n if (s !== null && n !== null)\n this.transformLatLonHeightToOrigin(s, n, i, r, o, l);\n else {\n const { ellipsoid: u } = e, h = Math.min(...u.radius);\n if (e.getBoundingSphere(qe), qe.center.length() > h * 0.5) {\n const d = {};\n u.getPositionToCartographic(qe.center, d), this.transformLatLonHeightToOrigin(d.lat, d.lon, d.height);\n } else {\n const d = e.group;\n switch (d.rotation.set(0, 0, 0), t) {\n case \"x\":\n case \"+x\":\n d.rotation.z = Math.PI / 2;\n break;\n case \"-x\":\n d.rotation.z = -Math.PI / 2;\n break;\n case \"y\":\n case \"+y\":\n break;\n case \"-y\":\n d.rotation.z = Math.PI;\n break;\n case \"z\":\n case \"+z\":\n d.rotation.x = -Math.PI / 2;\n break;\n case \"-z\":\n d.rotation.x = Math.PI / 2;\n break;\n }\n e.group.position.copy(qe.center).applyEuler(d.rotation).multiplyScalar(-1);\n }\n }\n c || e.group.position.setScalar(0), e.removeEventListener(\"load-root-tileset\", this._callback);\n }, e.addEventListener(\"load-root-tileset\", this._callback), e.root && this._callback();\n }\n transformLatLonHeightToOrigin(e, t, s = 0, n = 0, i = 0, r = 0) {\n const { group: o, ellipsoid: l } = this.tiles;\n l.getObjectFrame(e, t, s, n, i, r, o.matrix, hi), o.matrix.invert().decompose(o.position, o.quaternion, o.scale), o.updateMatrixWorld();\n }\n dispose() {\n const { group: e } = this.tiles;\n e.position.setScalar(0), e.quaternion.identity(), e.scale.set(1, 1, 1), this.tiles.removeEventListener(\"load-root-tileset\", this._callback);\n }\n}\nclass uo {\n set delay(e) {\n this.deferCallbacks.delay = e;\n }\n get delay() {\n return this.deferCallbacks.delay;\n }\n set bytesTarget(e) {\n this.lruCache.minBytesSize = e;\n }\n get bytesTarget() {\n return this.lruCache.minBytesSize;\n }\n get estimatedGpuBytes() {\n return this.lruCache.cachedBytes;\n }\n constructor(e = {}) {\n const {\n delay: t = 0,\n bytesTarget: s = 0\n } = e;\n this.name = \"UNLOAD_TILES_PLUGIN\", this.tiles = null, this.lruCache = new yi(), this.deferCallbacks = new ir(), this.delay = t, this.bytesTarget = s;\n }\n init(e) {\n this.tiles = e;\n const { lruCache: t, deferCallbacks: s } = this, n = (i) => {\n const r = i.engineData.scene;\n e.visibleTiles.has(i) || e.invokeOnePlugin((l) => l.unloadTileFromGPU && l.unloadTileFromGPU(r, i));\n };\n this._onUpdateBefore = () => {\n t.unloadPriorityCallback = e.lruCache.unloadPriorityCallback, t.minSize = 1 / 0, t.maxSize = 1 / 0, t.maxBytesSize = 1 / 0, t.unloadPercent = 1, t.autoMarkUnused = !1;\n }, this._onVisibilityChangeCallback = ({ tile: i, scene: r, visible: o }) => {\n o ? (t.add(i, n), t.setMemoryUsage(i, e.calculateBytesUsed(i, r) || 1), e.markTileUsed(i), s.cancel(i)) : s.run(i);\n }, this._onDisposeModel = ({ tile: i }) => {\n t.remove(i), s.cancel(i);\n }, s.callback = (i) => {\n t.markUnused(i), t.scheduleUnload();\n }, e.forEachLoadedModel((i, r) => {\n const o = e.visibleTiles.has(r);\n this._onVisibilityChangeCallback({ tile: r, visible: o });\n }), e.addEventListener(\"tile-visibility-change\", this._onVisibilityChangeCallback), e.addEventListener(\"update-before\", this._onUpdateBefore), e.addEventListener(\"dispose-model\", this._onDisposeModel);\n }\n unloadTileFromGPU(e, t) {\n e && e.traverse((s) => {\n if (s.material) {\n const n = s.material;\n n.dispose();\n for (const i in n) {\n const r = n[i];\n r && r.isTexture && r.dispose();\n }\n }\n s.geometry && s.geometry.dispose();\n });\n }\n dispose() {\n const { lruCache: e, tiles: t, deferCallbacks: s } = this;\n t.removeEventListener(\"tile-visibility-change\", this._onVisibilityChangeCallback), t.removeEventListener(\"update-before\", this._onUpdateBefore), t.removeEventListener(\"dispose-model\", this._onDisposeModel), s.cancelAll(), e.minBytesSize = 0, e.minSize = 0, e.maxSize = 0, e.markAllUnused(), e.scheduleUnload();\n }\n}\nclass ir {\n constructor(e = () => {\n }) {\n this.map = /* @__PURE__ */ new Map(), this.callback = e, this.delay = 0;\n }\n run(e) {\n const { map: t, delay: s } = this;\n if (t.has(e))\n throw new Error(\"DeferCallbackManager: Callback already initialized.\");\n s === 0 ? this.callback(e) : t.set(e, setTimeout(() => {\n this.callback(e), t.delete(e);\n }, s));\n }\n cancel(e) {\n const { map: t } = this;\n t.has(e) && (clearTimeout(t.get(e)), t.delete(e));\n }\n cancelAll() {\n this.map.forEach((e, t) => {\n this.cancel(t);\n });\n }\n}\nconst { clamp: _t } = b;\nclass rr {\n constructor() {\n this.duration = 250, this.fadeCount = 0, this._lastTick = -1, this._fadeState = /* @__PURE__ */ new Map(), this.onFadeComplete = null, this.onFadeStart = null, this.onFadeSetComplete = null, this.onFadeSetStart = null;\n }\n // delete the object from the fade, reset the material data\n deleteObject(e) {\n e && this.completeFade(e);\n }\n // Ensure we're storing a fade timer for the provided object\n // Returns whether a new state had to be added\n guaranteeState(e) {\n const t = this._fadeState;\n if (t.has(e))\n return !1;\n const s = {\n fadeInTarget: 0,\n fadeOutTarget: 0,\n fadeIn: 0,\n fadeOut: 0\n };\n return t.set(e, s), !0;\n }\n // Force the fade to complete in the direction it is already trending\n completeFade(e) {\n const t = this._fadeState;\n if (!t.has(e))\n return;\n const s = t.get(e).fadeOutTarget === 0;\n t.delete(e), this.fadeCount--, this.onFadeComplete && this.onFadeComplete(e, s), this.fadeCount === 0 && this.onFadeSetComplete && this.onFadeSetComplete();\n }\n completeAllFades() {\n this._fadeState.forEach((e, t) => {\n this.completeFade(t);\n });\n }\n forEachObject(e) {\n this._fadeState.forEach((t, s) => {\n e(s, t);\n });\n }\n // Fade the object in\n fadeIn(e) {\n const t = this.guaranteeState(e), s = this._fadeState.get(e);\n s.fadeInTarget = 1, s.fadeOutTarget = 0, s.fadeOut = 0, t && (this.fadeCount++, this.fadeCount === 1 && this.onFadeSetStart && this.onFadeSetStart(), this.onFadeStart && this.onFadeStart(e));\n }\n // Fade the object out\n fadeOut(e) {\n const t = this.guaranteeState(e), s = this._fadeState.get(e);\n s.fadeOutTarget = 1, t && (s.fadeInTarget = 1, s.fadeIn = 1, this.fadeCount++, this.fadeCount === 1 && this.onFadeSetStart && this.onFadeSetStart(), this.onFadeStart && this.onFadeStart(e));\n }\n isFading(e) {\n return this._fadeState.has(e);\n }\n isFadingOut(e) {\n const t = this._fadeState.get(e);\n return t && t.fadeOutTarget === 1;\n }\n // Tick the fade timer for each actively fading object\n update() {\n const e = window.performance.now();\n this._lastTick === -1 && (this._lastTick = e);\n const t = _t((e - this._lastTick) / this.duration, 0, 1);\n this._lastTick = e, this._fadeState.forEach((n, i) => {\n const {\n fadeOutTarget: r,\n fadeInTarget: o\n } = n;\n let {\n fadeOut: l,\n fadeIn: c\n } = n;\n const u = Math.sign(o - c);\n c = _t(c + u * t, 0, 1);\n const h = Math.sign(r - l);\n l = _t(l + h * t, 0, 1), n.fadeIn = c, n.fadeOut = l, ((l === 1 || l === 0) && (c === 1 || c === 0) || l >= c) && this.completeFade(i);\n });\n }\n}\nconst St = Symbol(\"FADE_PARAMS\");\nfunction An(a, e) {\n if (a[St])\n return a[St];\n const t = {\n fadeIn: { value: 0 },\n fadeOut: { value: 0 },\n fadeTexture: { value: null }\n };\n return a[St] = t, a.defines = {\n ...a.defines || {},\n FEATURE_FADE: 0\n }, a.onBeforeCompile = (s) => {\n e && e(s), s.uniforms = {\n ...s.uniforms,\n ...t\n }, s.vertexShader = s.vertexShader.replace(\n /void\\s+main\\(\\)\\s+{/,\n (n) => (\n /* glsl */\n `\n\t\t\t\t\t#ifdef USE_BATCHING_FRAG\n\n\t\t\t\t\tvarying float vBatchId;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\t${n}\n\n\t\t\t\t\t\t#ifdef USE_BATCHING_FRAG\n\n\t\t\t\t\t\t// add 0.5 to the value to avoid floating error that may cause flickering\n\t\t\t\t\t\tvBatchId = getIndirectIndex( gl_DrawID ) + 0.5;\n\n\t\t\t\t\t\t#endif\n\t\t\t\t`\n )\n ), s.fragmentShader = s.fragmentShader.replace(/void main\\(/, (n) => (\n /* glsl */\n `\n\t\t\t\t#if FEATURE_FADE\n\n\t\t\t\t// adapted from https://www.shadertoy.com/view/Mlt3z8\n\t\t\t\tfloat bayerDither2x2( vec2 v ) {\n\n\t\t\t\t\treturn mod( 3.0 * v.y + 2.0 * v.x, 4.0 );\n\n\t\t\t\t}\n\n\t\t\t\tfloat bayerDither4x4( vec2 v ) {\n\n\t\t\t\t\tvec2 P1 = mod( v, 2.0 );\n\t\t\t\t\tvec2 P2 = floor( 0.5 * mod( v, 4.0 ) );\n\t\t\t\t\treturn 4.0 * bayerDither2x2( P1 ) + bayerDither2x2( P2 );\n\n\t\t\t\t}\n\n\t\t\t\t// the USE_BATCHING define is not available in fragment shaders\n\t\t\t\t#ifdef USE_BATCHING_FRAG\n\n\t\t\t\t// functions for reading the fade state of a given batch id\n\t\t\t\tuniform sampler2D fadeTexture;\n\t\t\t\tvarying float vBatchId;\n\t\t\t\tvec2 getFadeValues( const in float i ) {\n\n\t\t\t\t\tint size = textureSize( fadeTexture, 0 ).x;\n\t\t\t\t\tint j = int( i );\n\t\t\t\t\tint x = j % size;\n\t\t\t\t\tint y = j / size;\n\t\t\t\t\treturn texelFetch( fadeTexture, ivec2( x, y ), 0 ).rg;\n\n\t\t\t\t}\n\n\t\t\t\t#else\n\n\t\t\t\tuniform float fadeIn;\n\t\t\t\tuniform float fadeOut;\n\n\t\t\t\t#endif\n\n\t\t\t\t#endif\n\n\t\t\t\t${n}\n\t\t\t`\n )).replace(/#include <dithering_fragment>/, (n) => (\n /* glsl */\n `\n\n\t\t\t\t${n}\n\n\t\t\t\t#if FEATURE_FADE\n\n\t\t\t\t#ifdef USE_BATCHING_FRAG\n\n\t\t\t\tvec2 fadeValues = getFadeValues( vBatchId );\n\t\t\t\tfloat fadeIn = fadeValues.r;\n\t\t\t\tfloat fadeOut = fadeValues.g;\n\n\t\t\t\t#endif\n\n\t\t\t\tfloat bayerValue = bayerDither4x4( floor( mod( gl_FragCoord.xy, 4.0 ) ) );\n\t\t\t\tfloat bayerBins = 16.0;\n\t\t\t\tfloat dither = ( 0.5 + bayerValue ) / bayerBins;\n\t\t\t\tif ( dither >= fadeIn ) {\n\n\t\t\t\t\tdiscard;\n\n\t\t\t\t}\n\n\t\t\t\tif ( dither < fadeOut ) {\n\n\t\t\t\t\tdiscard;\n\n\t\t\t\t}\n\n\t\t\t\t#endif\n\n\t\t\t`\n ));\n }, t;\n}\nclass or {\n constructor() {\n this._fadeParams = /* @__PURE__ */ new WeakMap(), this.fading = 0;\n }\n // Set the fade parameters for the given scene\n setFade(e, t, s) {\n if (!e)\n return;\n const n = this._fadeParams;\n e.traverse((i) => {\n const r = i.material;\n if (r && n.has(r)) {\n const o = n.get(r);\n o.fadeIn.value = t, o.fadeOut.value = s;\n const u = +(!(t === 0 || t === 1) || !(s === 0 || s === 1));\n r.defines.FEATURE_FADE !== u && (this.fading += u === 1 ? 1 : -1, r.defines.FEATURE_FADE = u, r.needsUpdate = !0);\n }\n });\n }\n // initialize materials in the object\n prepareScene(e) {\n e.traverse((t) => {\n t.material && this.prepareMaterial(t.material);\n });\n }\n // delete the object from the fade, reset the material data\n deleteScene(e) {\n if (!e)\n return;\n this.setFade(e, 1, 0);\n const t = this._fadeParams;\n e.traverse((s) => {\n const n = s.material;\n n && t.delete(n);\n });\n }\n // initialize the material\n prepareMaterial(e) {\n const t = this._fadeParams;\n t.has(e) || t.set(e, An(e, e.onBeforeCompile));\n }\n}\nclass ar {\n constructor(e, t = new Se()) {\n this.other = e, this.material = t, this.visible = !0, this.parent = null, this._instanceInfo = [], this._visibilityChanged = !0;\n const s = new Proxy(this, {\n get(n, i) {\n if (i in n)\n return n[i];\n {\n const r = e[i];\n return r instanceof Function ? (...o) => (n.syncInstances(), r.call(s, ...o)) : e[i];\n }\n },\n set(n, i, r) {\n return i in n ? n[i] = r : e[i] = r, !0;\n },\n deleteProperty(n, i) {\n return i in n ? delete n[i] : delete e[i];\n }\n // ownKeys() {},\n // has(target, key) {},\n // defineProperty(target, key, descriptor) {},\n // getOwnPropertyDescriptor(target, key) {},\n });\n return s;\n }\n syncInstances() {\n const e = this._instanceInfo, t = this.other._instanceInfo;\n for (; t.length > e.length; ) {\n const s = e.length;\n e.push(new Proxy({ visible: !1 }, {\n get(n, i) {\n return i in n ? n[i] : t[s][i];\n },\n set(n, i, r) {\n return i in n ? n[i] = r : t[s][i] = r, !0;\n }\n }));\n }\n }\n}\nclass lr extends ar {\n constructor(...e) {\n super(...e);\n const t = this.material, s = An(t, t.onBeforeCompile);\n t.defines.FEATURE_FADE = 1, t.defines.USE_BATCHING_FRAG = 1, t.needsUpdate = !0, this.fadeTexture = null, this._fadeParams = s;\n }\n // Set the fade state\n setFadeAt(e, t, s) {\n this._initFadeTexture(), this.fadeTexture.setValueAt(e, t * 255, s * 255);\n }\n // initialize the texture and resize it if needed\n _initFadeTexture() {\n let e = Math.sqrt(this._maxInstanceCount);\n e = Math.ceil(e);\n const t = e * e * 2, s = this.fadeTexture;\n if (!s || s.image.data.length !== t) {\n const n = new Uint8Array(t), i = new cr(n, e, e, en, tn);\n if (s) {\n s.dispose();\n const r = s.image.data, o = this.fadeTexture.image.data, l = Math.min(r.length, o.length);\n o.set(new r.constructor(r.buffer, 0, l));\n }\n this.fadeTexture = i, this._fadeParams.fadeTexture.value = i, i.needsUpdate = !0;\n }\n }\n // dispose the fade texture. Super cannot be used here due to proxy\n dispose() {\n this.fadeTexture && this.fadeTexture.dispose();\n }\n}\nclass cr extends Wt {\n setValueAt(e, ...t) {\n const { data: s, width: n, height: i } = this.image, r = Math.floor(s.length / (n * i));\n let o = !1;\n for (let l = 0; l < r; l++) {\n const c = e * r + l, u = s[c], h = t[l] || 0;\n u !== h && (s[c] = h, o = !0);\n }\n o && (this.needsUpdate = !0);\n }\n}\nconst ws = Symbol(\"HAS_POPPED_IN\"), Ps = /* @__PURE__ */ new E(), Rs = /* @__PURE__ */ new E(), Ds = /* @__PURE__ */ new nn(), Bs = /* @__PURE__ */ new nn(), Os = /* @__PURE__ */ new E();\nfunction ur() {\n const a = this._fadeManager, e = this.tiles;\n this._fadingBefore = a.fadeCount, this._displayActiveTiles = e.displayActiveTiles, e.displayActiveTiles = !0;\n}\nfunction hr() {\n const a = this._fadeManager, e = this._fadeMaterialManager, t = this._displayActiveTiles, s = this._fadingBefore, n = this._prevCameraTransforms, { tiles: i, maximumFadeOutTiles: r, batchedMesh: o } = this, { cameras: l } = i;\n i.displayActiveTiles = t, a.update();\n const c = a.fadeCount;\n if (s !== 0 && c !== 0 && (i.dispatchEvent({ type: \"fade-change\" }), i.dispatchEvent({ type: \"needs-render\" })), t || i.visibleTiles.forEach((u) => {\n const h = u.engineData.scene;\n h && (h.visible = u.traversal.inFrustum), this.forEachBatchIds(u, (d, m, f) => {\n m.setVisibleAt(d, u.traversal.inFrustum), f.batchedMesh.setVisibleAt(d, u.traversal.inFrustum);\n });\n }), r < this._fadingOutCount) {\n let u = !0;\n l.forEach((h) => {\n if (!n.has(h))\n return;\n const d = h.matrixWorld, m = n.get(h);\n d.decompose(Rs, Bs, Os), m.decompose(Ps, Ds, Os);\n const f = Bs.angleTo(Ds), p = Rs.distanceTo(Ps);\n u = u && (f > 0.25 || p > 0.1);\n }), u && a.completeAllFades();\n }\n if (l.forEach((u) => {\n n.get(u).copy(u.matrixWorld);\n }), a.forEachObject((u, { fadeIn: h, fadeOut: d }) => {\n const m = u.engineData.scene, f = a.isFadingOut(u);\n i.markTileUsed(u), m && (e.setFade(m, h, d), f && (m.visible = !0)), this.forEachBatchIds(u, (p, g, y) => {\n g.setFadeAt(p, h, d), g.setVisibleAt(p, !0), y.batchedMesh.setVisibleAt(p, !1);\n });\n }), o) {\n const u = i.getPluginByName(\"BATCHED_TILES_PLUGIN\").batchedMesh.material;\n o.material.map = u.map;\n }\n}\nclass ho {\n get fadeDuration() {\n return this._fadeManager.duration;\n }\n set fadeDuration(e) {\n this._fadeManager.duration = Number(e);\n }\n get fadingTiles() {\n return this._fadeManager.fadeCount;\n }\n constructor(e) {\n e = {\n maximumFadeOutTiles: 50,\n fadeRootTiles: !1,\n fadeDuration: 250,\n ...e\n }, this.name = \"FADE_TILES_PLUGIN\", this.priority = -2, this.tiles = null, this.batchedMesh = null, this._quickFadeTiles = /* @__PURE__ */ new Set(), this._fadeManager = new rr(), this._fadeMaterialManager = new or(), this._prevCameraTransforms = null, this._fadingOutCount = 0, this.maximumFadeOutTiles = e.maximumFadeOutTiles, this.fadeRootTiles = e.fadeRootTiles, this.fadeDuration = e.fadeDuration;\n }\n init(e) {\n this._onLoadModel = ({ scene: n }) => {\n this._fadeMaterialManager.prepareScene(n);\n }, this._onDisposeModel = ({ tile: n, scene: i }) => {\n this.tiles.visibleTiles.has(n) && this._quickFadeTiles.add(n.parent), this._fadeManager.deleteObject(n), this._fadeMaterialManager.deleteScene(i);\n }, this._onAddCamera = ({ camera: n }) => {\n this._prevCameraTransforms.set(n, new K());\n }, this._onDeleteCamera = ({ camera: n }) => {\n this._prevCameraTransforms.delete(n);\n }, this._onTileVisibilityChange = ({ tile: n, visible: i }) => {\n const r = n.engineData.scene;\n r && (r.visible = !0), this.forEachBatchIds(n, (o, l, c) => {\n l.setFadeAt(o, 0, 0), l.setVisibleAt(o, !1), c.batchedMesh.setVisibleAt(o, !1);\n });\n }, this._onUpdateBefore = () => {\n ur.call(this);\n }, this._onUpdateAfter = () => {\n hr.call(this);\n }, e.addEventListener(\"load-model\", this._onLoadModel), e.addEventListener(\"dispose-model\", this._onDisposeModel), e.addEventListener(\"add-camera\", this._onAddCamera), e.addEventListener(\"delete-camera\", this._onDeleteCamera), e.addEventListener(\"update-before\", this._onUpdateBefore), e.addEventListener(\"update-after\", this._onUpdateAfter), e.addEventListener(\"tile-visibility-change\", this._onTileVisibilityChange);\n const t = this._fadeManager;\n t.onFadeSetStart = () => {\n e.dispatchEvent({ type: \"fade-start\" }), e.dispatchEvent({ type: \"needs-render\" });\n }, t.onFadeSetComplete = () => {\n e.dispatchEvent({ type: \"fade-end\" }), e.dispatchEvent({ type: \"needs-render\" });\n }, t.onFadeComplete = (n, i) => {\n this._fadeMaterialManager.setFade(n.engineData.scene, 0, 0), this.forEachBatchIds(n, (r, o, l) => {\n o.setFadeAt(r, 0, 0), o.setVisibleAt(r, !1), l.batchedMesh.setVisibleAt(r, i);\n }), i || (e.invokeOnePlugin((r) => r !== this && r.setTileVisible && r.setTileVisible(n, !1)), this._fadingOutCount--);\n };\n const s = /* @__PURE__ */ new Map();\n e.cameras.forEach((n) => {\n s.set(n, new K());\n }), e.forEachLoadedModel((n, i) => {\n this._onLoadModel({ scene: n });\n }), this.tiles = e, this._fadeManager = t, this._prevCameraTransforms = s;\n }\n // initializes the batched mesh if it needs to be, dispose if it it's no longer needed\n initBatchedMesh() {\n var t;\n const e = (t = this.tiles.getPluginByName(\"BATCHED_TILES_PLUGIN\")) == null ? void 0 : t.batchedMesh;\n if (e) {\n if (this.batchedMesh === null) {\n this._onBatchedMeshDispose = () => {\n this.batchedMesh.dispose(), this.batchedMesh.removeFromParent(), this.batchedMesh = null, e.removeEventListener(\"dispose\", this._onBatchedMeshDispose);\n };\n const s = e.material.clone();\n s.onBeforeCompile = e.material.onBeforeCompile, this.batchedMesh = new lr(e, s), this.tiles.group.add(this.batchedMesh);\n }\n } else\n this.batchedMesh !== null && (this._onBatchedMeshDispose(), this._onBatchedMeshDispose = null);\n }\n // callback for fading to prevent tiles from being removed until the fade effect has completed\n setTileVisible(e, t) {\n const s = this._fadeManager, n = s.isFading(e);\n if (s.isFadingOut(e) && this._fadingOutCount--, t ? e.internal.depthFromRenderedParent === 1 ? ((e[ws] || this.fadeRootTiles) && this._fadeManager.fadeIn(e), e[ws] = !0) : this._fadeManager.fadeIn(e) : (this._fadingOutCount++, s.fadeOut(e)), this._quickFadeTiles.has(e) && (this._fadeManager.completeFade(e), this._quickFadeTiles.delete(e)), n)\n return !0;\n const i = this._fadeManager.isFading(e);\n return !!(!t && i);\n }\n dispose() {\n const e = this.tiles;\n this._fadeManager.completeAllFades(), this.batchedMesh !== null && this._onBatchedMeshDispose(), e.removeEventListener(\"load-model\", this._onLoadModel), e.removeEventListener(\"dispose-model\", this._onDisposeModel), e.removeEventListener(\"add-camera\", this._onAddCamera), e.removeEventListener(\"delete-camera\", this._onDeleteCamera), e.removeEventListener(\"update-before\", this._onUpdateBefore), e.removeEventListener(\"update-after\", this._onUpdateAfter), e.removeEventListener(\"tile-visibility-change\", this._onTileVisibilityChange), e.forEachLoadedModel((t, s) => {\n this._fadeManager.deleteObject(s), t && (t.visible = !0);\n });\n }\n // helper for iterating over the batch ids for a given tile\n forEachBatchIds(e, t) {\n if (this.initBatchedMesh(), this.batchedMesh) {\n const s = this.tiles.getPluginByName(\"BATCHED_TILES_PLUGIN\"), n = s.getTileBatchIds(e);\n n && n.forEach((i) => {\n t(i, this.batchedMesh, s);\n });\n }\n }\n}\nconst Mt = /* @__PURE__ */ new K(), Us = /* @__PURE__ */ new E(), Ns = /* @__PURE__ */ new E();\nclass dr extends si {\n constructor(...e) {\n super(...e), this.resetDistance = 1e4, this._matricesTextureHandle = null, this._lastCameraPos = new K(), this._forceUpdate = !0, this._matrices = [];\n }\n setMatrixAt(e, t) {\n super.setMatrixAt(e, t), this._forceUpdate = !0;\n const s = this._matrices;\n for (; s.length <= e; )\n s.push(new K());\n s[e].copy(t);\n }\n setInstanceCount(...e) {\n super.setInstanceCount(...e);\n const t = this._matrices;\n for (; t.length > this.instanceCount; )\n t.pop();\n }\n onBeforeRender(e, t, s, n, i, r) {\n super.onBeforeRender(e, t, s, n, i, r), Us.setFromMatrixPosition(s.matrixWorld), Ns.setFromMatrixPosition(this._lastCameraPos);\n const o = this._matricesTexture;\n let l = this._modelViewMatricesTexture;\n if ((!l || l.image.width !== o.image.width || l.image.height !== o.image.height) && (l && l.dispose(), l = o.clone(), l.source = new ni({\n ...l.image,\n data: l.image.data.slice()\n }), this._modelViewMatricesTexture = l), this._forceUpdate || Us.distanceTo(Ns) > this.resetDistance) {\n const c = this._matrices, u = l.image.data;\n for (let h = 0; h < this.maxInstanceCount; h++) {\n const d = c[h];\n d ? Mt.copy(d) : Mt.identity(), Mt.premultiply(this.matrixWorld).premultiply(s.matrixWorldInverse).toArray(u, h * 16);\n }\n l.needsUpdate = !0, this._lastCameraPos.copy(s.matrixWorld), this._forceUpdate = !1;\n }\n this._matricesTextureHandle = this._matricesTexture, this._matricesTexture = this._modelViewMatricesTexture, this.matrixWorld.copy(this._lastCameraPos);\n }\n onAfterRender() {\n this.updateMatrixWorld(), this._matricesTexture = this._matricesTextureHandle, this._matricesTextureHandle = null;\n }\n onAfterShadow(e, t, s, n, i, r) {\n this.onAfterRender(e, null, n, i, r);\n }\n dispose() {\n super.dispose(), this._modelViewMatricesTexture && this._modelViewMatricesTexture.dispose();\n }\n}\nconst ee = /* @__PURE__ */ new Be(), We = [];\nclass pr extends dr {\n constructor(...e) {\n super(...e), this.expandPercent = 0.25, this.maxInstanceExpansionSize = 1 / 0, this._freeGeometryIds = [];\n }\n // Finds a free id that can fit the geometry with the requested ranges. Returns -1 if it could not be found.\n findFreeId(e, t, s) {\n const n = !!this.geometry.index, i = Math.max(n ? e.index.count : -1, s), r = Math.max(e.attributes.position.count, t);\n let o = -1, l = 1 / 0;\n const c = this._freeGeometryIds;\n if (c.forEach((u, h) => {\n const d = this.getGeometryRangeAt(u), { reservedIndexCount: m, reservedVertexCount: f } = d;\n if (m >= i && f >= r) {\n const p = i - m + (r - f);\n p < l && (o = h, l = p);\n }\n }), o !== -1) {\n const u = c[o];\n return c.splice(o, 1), u;\n } else\n return -1;\n }\n // Overrides addGeometry to find an option geometry slot, expand, or optimized if needed\n addGeometry(e, t, s) {\n const n = !!this.geometry.index;\n s = Math.max(n ? e.index.count : -1, s), t = Math.max(e.attributes.position.count, t);\n const { expandPercent: i, _freeGeometryIds: r } = this;\n let o = this.findFreeId(e, t, s);\n if (o !== -1)\n this.setGeometryAt(o, e);\n else {\n const l = () => {\n const h = this.unusedVertexCount < t, d = this.unusedIndexCount < s;\n return h || d;\n }, c = e.index, u = e.attributes.position;\n if (t = Math.max(t, u.count), s = Math.max(s, c ? c.count : 0), l() && (r.forEach((h) => this.deleteGeometry(h)), r.length = 0, this.optimize(), l())) {\n const h = this.geometry.index, d = this.geometry.attributes.position;\n let m, f;\n if (h) {\n const p = Math.ceil(i * h.count);\n m = Math.max(p, s, c.count) + h.count;\n } else\n m = Math.max(this.unusedIndexCount, s);\n if (d) {\n const p = Math.ceil(i * d.count);\n f = Math.max(p, t, u.count) + d.count;\n } else\n f = Math.max(this.unusedVertexCount, t);\n this.setGeometrySize(f, m);\n }\n o = super.addGeometry(e, t, s);\n }\n return o;\n }\n // add an instance and automatically expand the number of instances if necessary\n addInstance(e) {\n if (this.maxInstanceCount === this.instanceCount) {\n const t = Math.ceil(this.maxInstanceCount * (1 + this.expandPercent));\n this.setInstanceCount(Math.min(t, this.maxInstanceExpansionSize));\n }\n return super.addInstance(e);\n }\n // delete an instance, keeping note that the geometry id is now unused\n deleteInstance(e) {\n const t = this.getGeometryIdAt(e);\n return t !== -1 && this._freeGeometryIds.push(t), super.deleteInstance(e);\n }\n // add a function for raycasting per tile\n raycastInstance(e, t, s) {\n const n = this.geometry, i = this.getGeometryIdAt(e);\n ee.material = this.material, ee.geometry.index = n.index, ee.geometry.attributes = n.attributes;\n const r = this.getGeometryRangeAt(i);\n ee.geometry.setDrawRange(r.start, r.count), ee.geometry.boundingBox === null && (ee.geometry.boundingBox = new ct()), ee.geometry.boundingSphere === null && (ee.geometry.boundingSphere = new de()), this.getMatrixAt(e, ee.matrixWorld).premultiply(this.matrixWorld), this.getBoundingBoxAt(i, ee.geometry.boundingBox), this.getBoundingSphereAt(i, ee.geometry.boundingSphere), ee.raycast(t, We);\n for (let o = 0, l = We.length; o < l; o++) {\n const c = We[o];\n c.object = this, c.batchId = e, s.push(c);\n }\n We.length = 0;\n }\n}\nfunction fr(a) {\n return a.r === 1 && a.g === 1 && a.b === 1;\n}\nfunction mr(a) {\n a.needsUpdate = !0, a.onBeforeCompile = (e) => {\n e.vertexShader = e.vertexShader.replace(\n \"#include <common>\",\n /* glsl */\n `\n\t\t\t\t#include <common>\n\t\t\t\tvarying float texture_index;\n\t\t\t\t`\n ).replace(\n \"#include <uv_vertex>\",\n /* glsl */\n `\n\t\t\t\t#include <uv_vertex>\n\t\t\t\ttexture_index = getIndirectIndex( gl_DrawID );\n\t\t\t\t`\n ), e.fragmentShader = e.fragmentShader.replace(\n \"#include <map_pars_fragment>\",\n /* glsl */\n `\n\t\t\t\t#ifdef USE_MAP\n\t\t\t\tprecision highp sampler2DArray;\n\t\t\t\tuniform sampler2DArray map;\n\t\t\t\tvarying float texture_index;\n\t\t\t\t#endif\n\t\t\t\t`\n ).replace(\n \"#include <map_fragment>\",\n /* glsl */\n `\n\t\t\t\t#ifdef USE_MAP\n\t\t\t\t\tdiffuseColor *= texture( map, vec3( vMapUv, texture_index ) );\n\t\t\t\t#endif\n\t\t\t\t`\n );\n };\n}\nconst Ct = new un(new Se()), Ft = new Wt(new Uint8Array([255, 255, 255, 255]), 1, 1);\nFt.needsUpdate = !0;\nclass po {\n constructor(e = {}) {\n if (parseInt(ii) < 170)\n throw new Error(\"BatchedTilesPlugin: Three.js revision 170 or higher required.\");\n e = {\n instanceCount: 500,\n vertexCount: 750,\n indexCount: 2e3,\n expandPercent: 0.25,\n maxInstanceCount: 1 / 0,\n discardOriginalContent: !0,\n textureSize: null,\n material: null,\n renderer: null,\n ...e\n }, this.name = \"BATCHED_TILES_PLUGIN\", this.priority = -1;\n const t = e.renderer.getContext();\n this.instanceCount = e.instanceCount, this.vertexCount = e.vertexCount, this.indexCount = e.indexCount, this.material = e.material ? e.material.clone() : null, this.expandPercent = e.expandPercent, this.maxInstanceCount = Math.min(e.maxInstanceCount, t.getParameter(t.MAX_3D_TEXTURE_SIZE)), this.renderer = e.renderer, this.discardOriginalContent = e.discardOriginalContent, this.textureSize = e.textureSize, this.batchedMesh = null, this.arrayTarget = null, this.tiles = null, this._onLoadModel = null, this._onDisposeModel = null, this._onVisibilityChange = null, this._tileToInstanceId = /* @__PURE__ */ new Map();\n }\n init(e) {\n this._onDisposeModel = ({ scene: t, tile: s }) => {\n this.removeSceneFromBatchedMesh(t, s);\n }, e.addEventListener(\"dispose-model\", this._onDisposeModel), this.tiles = e;\n }\n initTextureArray(e) {\n if (this.arrayTarget !== null || e.material.map === null)\n return;\n const { instanceCount: t, renderer: s, textureSize: n, batchedMesh: i } = this, r = e.material.map, o = {\n colorSpace: r.colorSpace,\n wrapS: r.wrapS,\n wrapT: r.wrapT,\n wrapR: r.wrapS,\n // TODO: Generating mipmaps for the volume every time a new texture is added is extremely slow\n // generateMipmaps: map.generateMipmaps,\n // minFilter: map.minFilter,\n magFilter: r.magFilter\n }, l = new ss(n || r.image.width, n || r.image.height, t);\n Object.assign(l.texture, o), s.initRenderTarget(l), i.material.map = l.texture, this.arrayTarget = l, this._tileToInstanceId.forEach((c) => {\n c.forEach((u) => {\n this.assignTextureToLayer(Ft, u);\n });\n });\n }\n // init the batched mesh if it's not ready\n initBatchedMesh(e) {\n if (this.batchedMesh !== null)\n return;\n const { instanceCount: t, vertexCount: s, indexCount: n, tiles: i } = this, r = this.material ? this.material : new e.material.constructor(), o = new pr(t, t * s, t * n, r);\n o.name = \"BatchTilesPlugin\", o.frustumCulled = !1, i.group.add(o), o.updateMatrixWorld(), mr(o.material), this.batchedMesh = o;\n }\n setTileVisible(e, t) {\n const s = e.engineData.scene;\n if (t && this.addSceneToBatchedMesh(s, e), this._tileToInstanceId.has(e)) {\n this._tileToInstanceId.get(e).forEach((r) => {\n this.batchedMesh.setVisibleAt(r, t);\n });\n const i = this.tiles;\n return t ? i.visibleTiles.add(e) : i.visibleTiles.delete(e), i.dispatchEvent({\n type: \"tile-visibility-change\",\n scene: s,\n tile: e,\n visible: t\n }), !0;\n }\n return !1;\n }\n unloadTileFromGPU(e, t) {\n return !this.discardOriginalContent && this._tileToInstanceId.has(t) ? (this.removeSceneFromBatchedMesh(e, t), !0) : !1;\n }\n // render the given into the given layer\n assignTextureToLayer(e, t) {\n if (!this.arrayTarget)\n return;\n this.expandArrayTargetIfNeeded();\n const { renderer: s } = this, n = s.getRenderTarget();\n s.setRenderTarget(this.arrayTarget, t), Ct.material.map = e, Ct.render(s), s.setRenderTarget(n), Ct.material.map = null, e.dispose();\n }\n // check if the array texture target needs to be expanded\n expandArrayTargetIfNeeded() {\n const { batchedMesh: e, arrayTarget: t, renderer: s } = this, n = Math.min(e.maxInstanceCount, this.maxInstanceCount);\n if (n > t.depth) {\n const i = {\n colorSpace: t.texture.colorSpace,\n wrapS: t.texture.wrapS,\n wrapT: t.texture.wrapT,\n generateMipmaps: t.texture.generateMipmaps,\n minFilter: t.texture.minFilter,\n magFilter: t.texture.magFilter\n }, r = new ss(t.width, t.height, n);\n Object.assign(r.texture, i), s.initRenderTarget(r), s.copyTextureToTexture(t.texture, r.texture), t.dispose(), e.material.map = r.texture, this.arrayTarget = r;\n }\n }\n removeSceneFromBatchedMesh(e, t) {\n if (this._tileToInstanceId.has(t)) {\n const s = this._tileToInstanceId.get(t);\n this._tileToInstanceId.delete(t), s.forEach((n) => {\n this.batchedMesh.deleteInstance(n);\n });\n }\n }\n addSceneToBatchedMesh(e, t) {\n if (this._tileToInstanceId.has(t))\n return;\n const s = [];\n e.traverse((r) => {\n r.isMesh && s.push(r);\n });\n let n = !0;\n s.forEach((r) => {\n if (this.batchedMesh && n) {\n const o = r.geometry.attributes, l = this.batchedMesh.geometry.attributes;\n for (const c in l)\n if (!(c in o)) {\n n = !1;\n return;\n }\n }\n });\n const i = !this.batchedMesh || this.batchedMesh.instanceCount + s.length <= this.maxInstanceCount;\n if (n && i) {\n e.updateMatrixWorld();\n const r = [];\n this._tileToInstanceId.set(t, r), s.forEach((o) => {\n this.initBatchedMesh(o), this.initTextureArray(o);\n const { geometry: l, material: c } = o, { batchedMesh: u, expandPercent: h } = this;\n u.expandPercent = h;\n const d = u.addGeometry(l, this.vertexCount, this.indexCount), m = u.addInstance(d);\n r.push(m), u.setMatrixAt(m, o.matrixWorld), u.setVisibleAt(m, !1), fr(c.color) || (c.color.setHSL(Math.random(), 0.5, 0.5), u.setColorAt(m, c.color));\n const f = c.map;\n f ? this.assignTextureToLayer(f, m) : this.assignTextureToLayer(Ft, m);\n }), this.discardOriginalContent && (t.engineData.textures.forEach((o) => {\n o.image instanceof ImageBitmap && o.image.close();\n }), t.engineData.scene = null, t.engineData.materials = [], t.engineData.geometries = [], t.engineData.textures = []);\n }\n }\n // Override raycasting per tile to defer to the batched mesh\n raycastTile(e, t, s, n) {\n return this._tileToInstanceId.has(e) ? (this._tileToInstanceId.get(e).forEach((r) => {\n this.batchedMesh.raycastInstance(r, s, n);\n }), !0) : !1;\n }\n dispose() {\n const { arrayTarget: e, tiles: t, batchedMesh: s } = this;\n e && e.dispose(), s && (s.material.dispose(), s.geometry.dispose(), s.dispose(), s.removeFromParent()), t.removeEventListener(\"dispose-model\", this._onDisposeModel);\n }\n getTileBatchIds(e) {\n return this._tileToInstanceId.get(e);\n }\n}\nconst At = /* @__PURE__ */ new de(), je = /* @__PURE__ */ new E(), Ee = /* @__PURE__ */ new K(), Vs = /* @__PURE__ */ new K(), It = /* @__PURE__ */ new ri(), gr = /* @__PURE__ */ new Se({ side: rn }), Fs = /* @__PURE__ */ new ct(), vt = 1e5;\nfunction ks(a, e) {\n return a.isBufferGeometry ? (a.boundingSphere === null && a.computeBoundingSphere(), e.copy(a.boundingSphere)) : (Fs.setFromObject(a), Fs.getBoundingSphere(e), e);\n}\nclass fo {\n constructor() {\n this.name = \"TILE_FLATTENING_PLUGIN\", this.priority = -100, this.tiles = null, this.shapes = /* @__PURE__ */ new Map(), this.positionsMap = /* @__PURE__ */ new Map(), this.positionsUpdated = /* @__PURE__ */ new Set(), this.needsUpdate = !1;\n }\n init(e) {\n this.tiles = e, this.needsUpdate = !0, this._updateBeforeCallback = () => {\n this.needsUpdate && (this._updateTiles(), this.needsUpdate = !1);\n }, this._disposeModelCallback = ({ tile: t }) => {\n this.positionsMap.delete(t), this.positionsUpdated.delete(t);\n }, e.addEventListener(\"update-before\", this._updateBeforeCallback), e.addEventListener(\"dispose-model\", this._disposeModelCallback);\n }\n // update tile flattening state if it has not been made visible, yet\n setTileActive(e, t) {\n t && !this.positionsUpdated.has(e) && this._updateTile(e);\n }\n _updateTile(e) {\n const { positionsUpdated: t, positionsMap: s, shapes: n, tiles: i } = this;\n t.add(e);\n const r = e.engineData.scene;\n if (s.has(e)) {\n const o = s.get(e);\n r.traverse((l) => {\n if (l.geometry) {\n const c = o.get(l.geometry);\n c && (l.geometry.attributes.position.array.set(c), l.geometry.attributes.position.needsUpdate = !0);\n }\n });\n } else {\n const o = /* @__PURE__ */ new Map();\n s.set(e, o), r.traverse((l) => {\n l.geometry && o.set(l.geometry, l.geometry.attributes.position.array.slice());\n });\n }\n r.updateMatrixWorld(!0), r.traverse((o) => {\n const { geometry: l } = o;\n l && (Ee.copy(o.matrixWorld), r.parent !== null && Ee.premultiply(i.group.matrixWorldInverse), Vs.copy(Ee).invert(), ks(l, At).applyMatrix4(Ee), n.forEach(({\n shape: c,\n direction: u,\n sphere: h,\n thresholdMode: d,\n threshold: m,\n flattenRange: f\n }) => {\n je.subVectors(At.center, h.center), je.addScaledVector(u, -u.dot(je));\n const p = (At.radius + h.radius) ** 2;\n if (je.lengthSq() > p)\n return;\n const { position: g } = l.attributes, { ray: y } = It;\n y.direction.copy(u).multiplyScalar(-1);\n for (let x = 0, S = g.count; x < S; x++) {\n y.origin.fromBufferAttribute(g, x).applyMatrix4(Ee).addScaledVector(u, vt), It.far = vt;\n const T = It.intersectObject(c)[0];\n if (T) {\n let M = (vt - T.distance) / m;\n const _ = M >= 1;\n (!_ || _ && d === \"flatten\") && (M = Math.min(M, 1), T.point.addScaledVector(y.direction, b.mapLinear(M, 0, 1, -f, 0)), T.point.applyMatrix4(Vs), g.setXYZ(x, ...T.point));\n }\n }\n }));\n }), this.tiles.dispatchEvent({ type: \"needs-render\" });\n }\n _updateTiles() {\n this.positionsUpdated.clear(), this.tiles.activeTiles.forEach((e) => this._updateTile(e));\n }\n // API for updating and shapes to flatten the vertices\n hasShape(e) {\n return this.shapes.has(e);\n }\n addShape(e, t = new E(0, 0, -1), s = {}) {\n if (this.hasShape(e))\n throw new Error(\"TileFlatteningPlugin: Shape is already used.\");\n typeof s == \"number\" && (console.warn('TileFlatteningPlugin: \"addShape\" function signature has changed. Please use an options object, instead.'), s = {\n threshold: s\n }), this.needsUpdate = !0;\n const n = e.clone();\n n.updateMatrixWorld(!0), n.traverse((r) => {\n r.material && (r.material = gr);\n });\n const i = ks(n, new de());\n this.shapes.set(e, {\n shape: n,\n direction: t.clone(),\n sphere: i,\n // \"flatten\": Flattens the vertices above the shape\n // \"none\": leaves the vertices above the shape as they are\n thresholdMode: \"none\",\n // only flatten within this range above the object\n threshold: 1 / 0,\n // the range to flatten vertices in to. 0 is completely flat\n // while 0.1 means a 10cm range.\n flattenRange: 0,\n ...s\n });\n }\n updateShape(e) {\n if (!this.hasShape(e))\n throw new Error(\"TileFlatteningPlugin: Shape is not present.\");\n const { direction: t, threshold: s, thresholdMode: n, flattenRange: i } = this.shapes.get(e);\n this.deleteShape(e), this.addShape(e, t, {\n threshold: s,\n thresholdMode: n,\n flattenRange: i\n });\n }\n deleteShape(e) {\n return this.needsUpdate = !0, this.shapes.delete(e);\n }\n clearShapes() {\n this.shapes.size !== 0 && (this.needsUpdate = !0, this.shapes.clear());\n }\n // reset the vertex positions and remove the update callback\n dispose() {\n this.tiles.removeEventListener(\"before-update\", this._updateBeforeCallback), this.tiles.removeEventListener(\"dispose-model\", this._disposeModelCallback), this.positionsMap.forEach((e) => {\n e.forEach((t, s) => {\n const { position: n } = s.attributes;\n n.array.set(t), n.needsUpdate = !0;\n });\n });\n }\n}\nclass yr extends Ne {\n constructor(e = {}) {\n const {\n subdomains: t = [\"t0\"],\n ...s\n } = e;\n super(s), this.subdomains = t, this.subDomainIndex = 0;\n }\n getUrl(e, t, s) {\n return this.url.replace(/{\\s*subdomain\\s*}/gi, this._getSubdomain()).replace(/{\\s*quadkey\\s*}/gi, this._tileToQuadKey(e, t, s));\n }\n _tileToQuadKey(e, t, s) {\n let n = \"\";\n for (let i = s; i > 0; i--) {\n let r = 0;\n const o = 1 << i - 1;\n (e & o) !== 0 && (r += 1), (t & o) !== 0 && (r += 2), n += r.toString();\n }\n return n;\n }\n _getSubdomain() {\n return this.subDomainIndex = (this.subDomainIndex + 1) % this.subdomains.length, this.subdomains[this.subDomainIndex];\n }\n}\nfunction Lt(a, e, t, s) {\n let [n, i, r, o] = a;\n i += 1e-8, n += 1e-8, o -= 1e-8, r -= 1e-8;\n const l = Math.max(Math.min(e, t.maxLevel), t.minLevel), [c, u, h, d] = t.getTilesInRange(n, i, r, o, l, !0);\n for (let m = c; m <= h; m++)\n for (let f = u; f <= d; f++)\n s(m, f, l);\n}\nfunction xr(a, e, t) {\n const s = new E(), n = {}, i = [], r = a.getAttribute(\"position\");\n a.computeBoundingBox(), a.boundingBox.getCenter(s).applyMatrix4(e), t.getPositionToCartographic(s, n);\n const o = n.lat, l = n.lon;\n let c = 1 / 0, u = 1 / 0, h = 1 / 0, d = -1 / 0, m = -1 / 0, f = -1 / 0;\n for (let y = 0; y < r.count; y++)\n s.fromBufferAttribute(r, y).applyMatrix4(e), t.getPositionToCartographic(s, n), Math.abs(Math.abs(n.lat) - Math.PI / 2) < 1e-5 && (n.lon = l), Math.abs(l - n.lon) > Math.PI && (n.lon += Math.sign(l - n.lon) * Math.PI * 2), Math.abs(o - n.lat) > Math.PI && (n.lat += Math.sign(o - n.lat) * Math.PI * 2), i.push(n.lon, n.lat, n.height), c = Math.min(c, n.lat), d = Math.max(d, n.lat), u = Math.min(u, n.lon), m = Math.max(m, n.lon), h = Math.min(h, n.height), f = Math.max(f, n.height);\n const p = [u, c, m, d], g = [...p, h, f];\n return {\n uv: i,\n range: p,\n region: g\n };\n}\nfunction Gs(a, e, t = null, s = null) {\n let n = 1 / 0, i = 1 / 0, r = 1 / 0, o = -1 / 0, l = -1 / 0, c = -1 / 0;\n const u = [], h = new K();\n a.forEach((m) => {\n h.copy(m.matrixWorld), t && h.premultiply(t);\n const { uv: f, region: p } = xr(m.geometry, h, e);\n u.push(f), n = Math.min(n, p[1]), o = Math.max(o, p[3]), i = Math.min(i, p[0]), l = Math.max(l, p[2]), r = Math.min(r, p[4]), c = Math.max(c, p[5]);\n });\n let d = [i, n, l, o];\n if (s !== null) {\n d = s.clampToBounds([i, n, l, o]);\n const [m, f, p, g] = s.toNormalizedRange(d);\n u.forEach((y) => {\n for (let x = 0, S = y.length; x < S; x += 3) {\n const T = y[x + 0], M = y[x + 1], _ = y[x + 2], [C, v] = s.toNormalizedPoint(T, M);\n y[x + 0] = b.mapLinear(C, m, p, 0, 1), y[x + 1] = b.mapLinear(v, f, g, 0, 1), y[x + 2] = b.mapLinear(_, r, c, 0, 1);\n }\n });\n }\n return {\n uvs: u,\n range: d,\n region: [i, n, l, o, r, c]\n };\n}\nfunction Tr(a, e) {\n const t = new E(), s = [], n = a.getAttribute(\"position\");\n let i = 1 / 0, r = 1 / 0, o = 1 / 0, l = -1 / 0, c = -1 / 0, u = -1 / 0;\n for (let d = 0; d < n.count; d++)\n t.fromBufferAttribute(n, d).applyMatrix4(e), s.push(t.x, t.y, t.z), i = Math.min(i, t.x), l = Math.max(l, t.x), r = Math.min(r, t.y), c = Math.max(c, t.y), o = Math.min(o, t.z), u = Math.max(u, t.z);\n return {\n uv: s,\n range: [i, r, l, c],\n heightRange: [o, u]\n };\n}\nfunction br(a, e) {\n let t = 1 / 0, s = 1 / 0, n = 1 / 0, i = -1 / 0, r = -1 / 0, o = -1 / 0;\n const l = [], c = new K();\n return a.forEach((u) => {\n c.copy(u.matrixWorld), e && c.premultiply(e);\n const { uv: h, range: d, heightRange: m } = Tr(u.geometry, c);\n l.push(h), t = Math.min(t, d[0]), i = Math.max(i, d[2]), s = Math.min(s, d[1]), r = Math.max(r, d[3]), n = Math.min(n, m[0]), o = Math.max(o, m[1]);\n }), l.forEach((u) => {\n for (let h = 0, d = u.length; h < d; h += 3) {\n const m = u[h + 0], f = u[h + 1];\n u[h + 0] = b.mapLinear(m, t, i, 0, 1), u[h + 1] = b.mapLinear(f, s, r, 0, 1);\n }\n }), {\n uvs: l,\n range: [t, s, i, r],\n heightRange: [n, o]\n };\n}\nconst Et = Symbol(\"OVERLAY_PARAMS\");\nfunction _r(a, e) {\n if (a[Et])\n return a[Et];\n const t = {\n layerMaps: { value: [] },\n layerInfo: { value: [] }\n };\n return a[Et] = t, a.defines = {\n ...a.defines || {},\n LAYER_COUNT: 0\n }, a.onBeforeCompile = (s) => {\n e && e(s), s.uniforms = {\n ...s.uniforms,\n ...t\n }, s.vertexShader = s.vertexShader.replace(/void main\\(\\s*\\)\\s*{/, (n) => (\n /* glsl */\n `\n\n\t\t\t\t#pragma unroll_loop_start\n\t\t\t\t\tfor ( int i = 0; i < 10; i ++ ) {\n\n\t\t\t\t\t\t#if UNROLLED_LOOP_INDEX < LAYER_COUNT\n\n\t\t\t\t\t\t\tattribute vec3 layer_uv_UNROLLED_LOOP_INDEX;\n\t\t\t\t\t\t\tvarying vec3 v_layer_uv_UNROLLED_LOOP_INDEX;\n\n\t\t\t\t\t\t#endif\n\n\n\t\t\t\t\t}\n\t\t\t\t#pragma unroll_loop_end\n\n\t\t\t\t${n}\n\n\t\t\t\t#pragma unroll_loop_start\n\t\t\t\t\tfor ( int i = 0; i < 10; i ++ ) {\n\n\t\t\t\t\t\t#if UNROLLED_LOOP_INDEX < LAYER_COUNT\n\n\t\t\t\t\t\t\tv_layer_uv_UNROLLED_LOOP_INDEX = layer_uv_UNROLLED_LOOP_INDEX;\n\n\t\t\t\t\t\t#endif\n\n\t\t\t\t\t}\n\t\t\t\t#pragma unroll_loop_end\n\n\t\t\t`\n )), s.fragmentShader = s.fragmentShader.replace(/void main\\(/, (n) => (\n /* glsl */\n `\n\n\t\t\t\t#if LAYER_COUNT != 0\n\t\t\t\t\tstruct LayerInfo {\n\t\t\t\t\t\tvec3 color;\n\t\t\t\t\t\tfloat opacity;\n\n\t\t\t\t\t\tint alphaMask;\n\t\t\t\t\t\tint alphaInvert;\n\t\t\t\t\t};\n\n\t\t\t\t\tuniform sampler2D layerMaps[ LAYER_COUNT ];\n\t\t\t\t\tuniform LayerInfo layerInfo[ LAYER_COUNT ];\n\t\t\t\t#endif\n\n\t\t\t\t#pragma unroll_loop_start\n\t\t\t\t\tfor ( int i = 0; i < 10; i ++ ) {\n\n\t\t\t\t\t\t#if UNROLLED_LOOP_INDEX < LAYER_COUNT\n\n\t\t\t\t\t\t\tvarying vec3 v_layer_uv_UNROLLED_LOOP_INDEX;\n\n\t\t\t\t\t\t#endif\n\n\t\t\t\t\t}\n\t\t\t\t#pragma unroll_loop_end\n\n\t\t\t\t${n}\n\n\t\t\t`\n )).replace(/#include <color_fragment>/, (n) => (\n /* glsl */\n `\n\n\t\t\t\t${n}\n\n\t\t\t\t#if LAYER_COUNT != 0\n\t\t\t\t{\n\t\t\t\t\tvec4 tint;\n\t\t\t\t\tvec3 layerUV;\n\t\t\t\t\tfloat layerOpacity;\n\t\t\t\t\tfloat wOpacity;\n\t\t\t\t\tfloat wDelta;\n\t\t\t\t\t#pragma unroll_loop_start\n\t\t\t\t\t\tfor ( int i = 0; i < 10; i ++ ) {\n\n\t\t\t\t\t\t\t#if UNROLLED_LOOP_INDEX < LAYER_COUNT\n\n\t\t\t\t\t\t\t\tlayerUV = v_layer_uv_UNROLLED_LOOP_INDEX;\n\t\t\t\t\t\t\t\ttint = texture( layerMaps[ i ], layerUV.xy );\n\n\t\t\t\t\t\t\t\t// discard texture outside 0, 1 on w - offset the stepped value by an epsilon to avoid cases\n\t\t\t\t\t\t\t\t// where wDelta is near 0 (eg a flat surface) at the w boundary, resulting in artifacts on some\n\t\t\t\t\t\t\t\t// hardware.\n\t\t\t\t\t\t\t\twDelta = max( fwidth( layerUV.z ), 1e-7 );\n\t\t\t\t\t\t\t\twOpacity =\n\t\t\t\t\t\t\t\t\tsmoothstep( - wDelta, 0.0, layerUV.z ) *\n\t\t\t\t\t\t\t\t\tsmoothstep( 1.0 + wDelta, 1.0, layerUV.z );\n\n\t\t\t\t\t\t\t\t// apply tint & opacity\n\t\t\t\t\t\t\t\ttint.rgb *= layerInfo[ i ].color;\n\t\t\t\t\t\t\t\ttint.rgba *= layerInfo[ i ].opacity * wOpacity;\n\n\t\t\t\t\t\t\t\t// invert the alpha\n\t\t\t\t\t\t\t\tif ( layerInfo[ i ].alphaInvert > 0 ) {\n\n\t\t\t\t\t\t\t\t\ttint.a = 1.0 - tint.a;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// apply the alpha across all existing layers if alpha mask is true\n\t\t\t\t\t\t\t\tif ( layerInfo[ i ].alphaMask > 0 ) {\n\n\t\t\t\t\t\t\t\t\tdiffuseColor.a *= tint.a;\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\ttint.rgb *= tint.a;\n\t\t\t\t\t\t\t\t\tdiffuseColor = tint + diffuseColor * ( 1.0 - tint.a );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t#endif\n\n\t\t\t\t\t\t}\n\t\t\t\t\t#pragma unroll_loop_end\n\t\t\t\t}\n\t\t\t\t#endif\n\t\t\t`\n ));\n }, t;\n}\nclass In {\n constructor() {\n this.canvas = null, this.context = null, this.range = [0, 0, 1, 1];\n }\n // set the target render texture and the range that represents the full span\n setTarget(e, t) {\n this.canvas = e.image, this.context = e.image.getContext(\"2d\"), this.range = [...t];\n }\n // draw the given texture at the given span with the provided projection\n draw(e, t) {\n const { canvas: s, range: n, context: i } = this, { width: r, height: o } = s, { image: l } = e, c = Math.round(b.mapLinear(t[0], n[0], n[2], 0, r)), u = Math.round(b.mapLinear(t[1], n[1], n[3], 0, o)), h = Math.round(b.mapLinear(t[2], n[0], n[2], 0, r)), d = Math.round(b.mapLinear(t[3], n[1], n[3], 0, o)), m = h - c, f = d - u;\n l instanceof ImageBitmap ? (i.save(), i.translate(c, o - u), i.scale(1, -1), i.drawImage(l, 0, 0, m, f), i.restore()) : i.drawImage(l, c, o - u, m, -f);\n }\n // clear the set target\n clear() {\n const { context: e, canvas: t } = this;\n e.clearRect(0, 0, t.width, t.height);\n }\n}\nclass vn extends fn {\n hasContent(...e) {\n return !0;\n }\n}\nclass Sr extends vn {\n constructor(e) {\n super(), this.tiledImageSource = e, this.tileComposer = new In(), this.resolution = 256;\n }\n hasContent(e, t, s, n, i) {\n const r = this.tiledImageSource.tiling;\n let o = 0;\n return Lt([e, t, s, n], i, r, () => {\n o++;\n }), o !== 0;\n }\n async fetchItem([e, t, s, n, i], r) {\n const o = [e, t, s, n], l = this.tiledImageSource, c = this.tileComposer, u = l.tiling, h = document.createElement(\"canvas\");\n h.width = this.resolution, h.height = this.resolution;\n const d = new Yt(h);\n return d.colorSpace = qt, d.generateMipmaps = !1, d.tokens = [...o, i], await this._markImages(o, i, !1), c.setTarget(d, o), c.clear(16777215, 0), Lt(o, i, u, (m, f, p) => {\n const g = u.getTileBounds(m, f, p, !0, !1), y = l.get(m, f, p);\n c.draw(y, g);\n }), d;\n }\n disposeItem(e) {\n e.dispose();\n const [t, s, n, i, r] = e.tokens;\n this._markImages([t, s, n, i], r, !0);\n }\n dispose() {\n super.dispose(), this.tiledImageSource.dispose();\n }\n _markImages(e, t, s = !1) {\n const n = this.tiledImageSource, i = n.tiling, r = [];\n Lt(e, t, i, (l, c, u) => {\n s ? n.release(l, c, u) : r.push(n.lock(l, c, u));\n });\n const o = r.filter((l) => l instanceof Promise);\n return o.length !== 0 ? Promise.all(o) : null;\n }\n}\nconst wt = /* @__PURE__ */ new E(), Ye = /* @__PURE__ */ new E();\nfunction Mr(a, e, t) {\n a.getCartographicToPosition(e, t, 0, wt), a.getCartographicToPosition(e + 0.01, t, 0, Ye);\n const n = wt.distanceTo(Ye);\n return a.getCartographicToPosition(e, t + 0.01, 0, Ye), wt.distanceTo(Ye) / n;\n}\nclass Cr extends vn {\n constructor({\n geojson: e = null,\n url: t = null,\n // URL or GeoJson object can be provided\n resolution: s = 256,\n pointRadius: n = 6,\n strokeStyle: i = \"white\",\n strokeWidth: r = 2,\n fillStyle: o = \"rgba( 255, 255, 255, 0.5 )\",\n ...l\n } = {}) {\n super(l), this.geojson = e, this.url = t, this.resolution = s, this.pointRadius = n, this.strokeStyle = i, this.strokeWidth = r, this.fillStyle = o, this.features = null, this.featureBounds = /* @__PURE__ */ new Map(), this.contentBounds = null, this.projection = new re(), this.fetchData = (...c) => fetch(...c);\n }\n async init() {\n const { geojson: e, url: t } = this;\n if (!e && t) {\n const s = await this.fetchData(t);\n this.geojson = await s.json();\n }\n this._updateCache(!0);\n }\n hasContent(e, t, s, n) {\n const i = [e, t, s, n].map((r) => r * Math.RAD2DEG);\n return this._boundsIntersectBounds(i, this.contentBounds);\n }\n // main fetch per region -> returns CanvasTexture\n async fetchItem(e, t) {\n const s = document.createElement(\"canvas\"), n = new Yt(s);\n return n.colorSpace = qt, n.generateMipmaps = !1, this._drawToCanvas(s, e), n.needsUpdate = !0, n;\n }\n disposeItem(e) {\n e.dispose();\n }\n redraw() {\n this._updateCache(!0), this.forEachItem((e, t) => {\n this._drawToCanvas(e.image, t), e.needsUpdate = !0;\n });\n }\n _updateCache(e = !1) {\n const { geojson: t, featureBounds: s } = this;\n if (!t || this.features && !e)\n return;\n s.clear();\n let n = 1 / 0, i = 1 / 0, r = -1 / 0, o = -1 / 0;\n this.features = this._featuresFromGeoJSON(t), this.features.forEach((l) => {\n const c = this._getFeatureBounds(l);\n s.set(l, c);\n const [u, h, d, m] = c;\n n = Math.min(n, u), i = Math.min(i, h), r = Math.max(r, d), o = Math.max(o, m);\n }), this.contentBounds = [n, i, r, o];\n }\n _drawToCanvas(e, t) {\n this._updateCache();\n const [s, n, i, r] = t, { projection: o, resolution: l, features: c } = this;\n e.width = l, e.height = l;\n const u = o.convertNormalizedToLongitude(s), h = o.convertNormalizedToLatitude(n), d = o.convertNormalizedToLongitude(i), m = o.convertNormalizedToLatitude(r), f = [\n u * b.RAD2DEG,\n h * b.RAD2DEG,\n d * b.RAD2DEG,\n m * b.RAD2DEG\n ], p = e.getContext(\"2d\");\n for (let g = 0; g < c.length; g++) {\n const y = c[g];\n this._featureIntersectsTile(y, f) && this._drawFeatureOnCanvas(p, y, f, e.width, e.height);\n }\n }\n // bounding box quick test in projected units\n _featureIntersectsTile(e, t) {\n const s = this.featureBounds.get(e);\n return s ? this._boundsIntersectBounds(s, t) : !1;\n }\n _boundsIntersectBounds(e, t) {\n const [s, n, i, r] = e, [o, l, c, u] = t;\n return !(i < o || s > c || r < l || n > u);\n }\n _getFeatureBounds(e) {\n const { geometry: t } = e;\n if (!t)\n return null;\n const { type: s, coordinates: n } = t;\n let i = 1 / 0, r = 1 / 0, o = -1 / 0, l = -1 / 0;\n const c = (u, h) => {\n i = Math.min(i, u), o = Math.max(o, u), r = Math.min(r, h), l = Math.max(l, h);\n };\n return s === \"Point\" ? c(n[0], n[1]) : s === \"MultiPoint\" || s === \"LineString\" ? n.forEach((u) => c(u[0], u[1])) : s === \"MultiLineString\" || s === \"Polygon\" ? n.forEach((u) => u.forEach((h) => c(h[0], h[1]))) : s === \"MultiPolygon\" && n.forEach(\n (u) => u.forEach((h) => h.forEach((d) => c(d[0], d[1])))\n ), [i, r, o, l];\n }\n // Normalize top-level geojson into an array of Feature objects\n _featuresFromGeoJSON(e) {\n const t = e.type, s = /* @__PURE__ */ new Set([\"Point\", \"MultiPoint\", \"LineString\", \"MultiLineString\", \"Polygon\", \"MultiPolygon\"]);\n return t === \"FeatureCollection\" ? e.features : t === \"Feature\" ? [e] : t === \"GeometryCollection\" ? e.geometries.map((n) => ({ type: \"Feature\", geometry: n, properties: {} })) : s.has(t) ? [{ type: \"Feature\", geometry: e, properties: {} }] : [];\n }\n // draw feature on canvas ( assumes intersects already )\n _drawFeatureOnCanvas(e, t, s, n, i) {\n const { geometry: r = null, properties: o = {} } = t;\n if (!r)\n return;\n const [l, c, u, h] = s, d = o.strokeStyle || this.strokeStyle, m = o.fillStyle || this.fillStyle, f = o.pointRadius || this.pointRadius, p = o.strokeWidth || this.strokeWidth;\n e.save(), e.strokeStyle = d, e.fillStyle = m, e.lineWidth = p;\n const g = new Array(2), y = (T, M, _ = g) => {\n const C = b.mapLinear(T, l, u, 0, n), v = i - b.mapLinear(M, c, h, 0, i);\n return _[0] = Math.round(C), _[1] = Math.round(v), _;\n }, x = (T, M) => {\n const _ = M * b.DEG2RAD, C = T * b.DEG2RAD, v = (h - c) / i;\n return (u - l) / n / v * Mr(di, _, C);\n }, S = r.type;\n if (S === \"Point\") {\n const [T, M] = r.coordinates, [_, C] = y(T, M), v = x(T, M);\n e.beginPath(), e.ellipse(_, C, f / v, f, 0, 0, Math.PI * 2), e.fill(), e.stroke();\n } else S === \"MultiPoint\" ? r.coordinates.forEach(([T, M]) => {\n const [_, C] = y(T, M), v = x(T, M);\n e.beginPath(), e.ellipse(_, C, f / v, f, 0, 0, Math.PI * 2), e.fill(), e.stroke();\n }) : S === \"LineString\" ? (e.beginPath(), r.coordinates.forEach(([T, M], _) => {\n const [C, v] = y(T, M);\n _ === 0 ? e.moveTo(C, v) : e.lineTo(C, v);\n }), e.stroke()) : S === \"MultiLineString\" ? (e.beginPath(), r.coordinates.forEach((T) => {\n T.forEach(([M, _], C) => {\n const [v, P] = y(M, _);\n C === 0 ? e.moveTo(v, P) : e.lineTo(v, P);\n });\n }), e.stroke()) : S === \"Polygon\" ? (e.beginPath(), r.coordinates.forEach((T, M) => {\n T.forEach(([_, C], v) => {\n const [P, R] = y(_, C);\n v === 0 ? e.moveTo(P, R) : e.lineTo(P, R);\n }), e.closePath();\n }), e.fill(\"evenodd\"), e.stroke()) : S === \"MultiPolygon\" && r.coordinates.forEach((T) => {\n e.beginPath(), T.forEach((M, _) => {\n M.forEach(([C, v], P) => {\n const [R, V] = y(C, v);\n P === 0 ? e.moveTo(R, V) : e.lineTo(R, V);\n }), e.closePath();\n }), e.fill(\"evenodd\"), e.stroke();\n });\n e.restore();\n }\n}\nconst _e = /* @__PURE__ */ new K(), Xe = /* @__PURE__ */ new E(), Pt = /* @__PURE__ */ new E(), Rt = /* @__PURE__ */ new E(), se = /* @__PURE__ */ new E(), Ar = /* @__PURE__ */ new ct(), zs = Symbol(\"SPLIT_TILE_DATA\"), $e = Symbol(\"SPLIT_HASH\"), Qe = Symbol(\"ORIGINAL_REFINE\");\nclass mo {\n get enableTileSplitting() {\n return this._enableTileSplitting;\n }\n set enableTileSplitting(e) {\n this._enableTileSplitting !== e && (this._enableTileSplitting = e, this._markNeedsUpdate());\n }\n constructor(e = {}) {\n const {\n overlays: t = [],\n resolution: s = 256,\n enableTileSplitting: n = !0\n } = e;\n this.name = \"IMAGE_OVERLAY_PLUGIN\", this.priority = -15, this.resolution = s, this._enableTileSplitting = n, this.overlays = [], this.needsUpdate = !1, this.tiles = null, this.tileComposer = null, this.tileControllers = /* @__PURE__ */ new Map(), this.overlayInfo = /* @__PURE__ */ new Map(), this.meshParams = /* @__PURE__ */ new WeakMap(), this.pendingTiles = /* @__PURE__ */ new Map(), this.processedTiles = /* @__PURE__ */ new Set(), this.processQueue = null, this._onUpdateAfter = null, this._onTileDownloadStart = null, this._virtualChildResetId = 0, this._bytesUsed = /* @__PURE__ */ new WeakMap(), t.forEach((i) => {\n this.addOverlay(i);\n });\n }\n // plugin functions\n init(e) {\n const t = new In(), s = new xi();\n s.maxJobs = 10, s.priorityCallback = (n, i) => {\n const r = n.tile, o = i.tile, l = e.visibleTiles.has(r), c = e.visibleTiles.has(o);\n return l !== c ? l ? 1 : -1 : e.downloadQueue.priorityCallback(r, o);\n }, this.tiles = e, this.tileComposer = t, this.processQueue = s, e.forEachLoadedModel((n, i) => {\n this._processTileModel(n, i, !0);\n }), this._onUpdateAfter = async () => {\n let n = !1;\n if (this.overlayInfo.forEach((i, r) => {\n if (!!r.frame != !!i.frame || r.frame && i.frame && !i.frame.equals(r.frame)) {\n const o = i.order;\n this.deleteOverlay(r), this.addOverlay(r, o), n = !0;\n }\n }), n) {\n const i = s.maxJobs;\n let r = 0;\n s.items.forEach((o) => {\n e.visibleTiles.has(o.tile) && r++;\n }), s.maxJobs = r + s.currJobs, s.tryRunJobs(), s.maxJobs = i, this.needsUpdate = !0;\n }\n if (this.needsUpdate) {\n this.needsUpdate = !1;\n const { overlays: i, overlayInfo: r } = this;\n i.sort((o, l) => r.get(o).order - r.get(l).order), this.processedTiles.forEach((o) => {\n this._updateLayers(o);\n }), this.resetVirtualChildren(!this.enableTileSplitting), e.recalculateBytesUsed(), e.dispatchEvent({ type: \"needs-rerender\" });\n }\n }, this._onTileDownloadStart = ({ tile: n, url: i }) => {\n !/\\.json$/i.test(i) && !/\\.subtree/i.test(i) && (this.processedTiles.add(n), this._initTileOverlayInfo(n));\n }, e.addEventListener(\"update-after\", this._onUpdateAfter), e.addEventListener(\"tile-download-start\", this._onTileDownloadStart), this.overlays.forEach((n) => {\n this._initOverlay(n);\n });\n }\n _removeVirtualChildren(e) {\n if (!(Qe in e))\n return;\n const { tiles: t } = this, { virtualChildCount: s } = e.internal, n = e.children.length, i = n - s;\n for (let r = i; r < n; r++) {\n const o = e.children[r];\n t.processNodeQueue.remove(o), t.lruCache.remove(o), o.parent = null;\n }\n e.children.length -= s, e.internal.virtualChildCount = 0, e.refine = e[Qe], delete e[Qe], delete e[$e];\n }\n disposeTile(e) {\n const { overlayInfo: t, tileControllers: s, processQueue: n, pendingTiles: i, processedTiles: r } = this;\n r.delete(e), this._removeVirtualChildren(e), s.has(e) && (s.get(e).abort(), s.delete(e), i.delete(e)), t.forEach((({ tileInfo: o }, l) => {\n if (o.has(e)) {\n const { meshInfo: c, range: u } = o.get(e);\n u !== null && l.releaseTexture(u, e), o.delete(e), c.clear();\n }\n })), n.removeByFilter((o) => o.tile === e);\n }\n calculateBytesUsed(e) {\n const { overlayInfo: t } = this, s = this._bytesUsed;\n let n = null;\n return t.forEach(({ tileInfo: i }, r) => {\n if (i.has(e)) {\n const { target: o } = i.get(e);\n n = n || 0, n += pi(o);\n }\n }), n !== null ? (s.set(e, n), n) : s.has(e) ? s.get(e) : 0;\n }\n processTileModel(e, t) {\n return this._processTileModel(e, t);\n }\n async _processTileModel(e, t, s = !1) {\n const { tileControllers: n, processedTiles: i, pendingTiles: r } = this;\n n.set(t, new AbortController()), s || r.set(t, e), i.add(t), this._wrapMaterials(e), this._initTileOverlayInfo(t), await this._initTileSceneOverlayInfo(e, t), this.expandVirtualChildren(e, t), this._updateLayers(t), r.delete(t);\n }\n dispose() {\n const { tiles: e } = this;\n [...this.overlays].forEach((s) => {\n this.deleteOverlay(s);\n }), this.processedTiles.forEach((s) => {\n this._updateLayers(s), this.disposeTile(s);\n }), e.removeEventListener(\"update-after\", this._onUpdateAfter), this.resetVirtualChildren(!0);\n }\n getAttributions(e) {\n this.overlays.forEach((t) => {\n t.opacity > 0 && t.getAttributions(e);\n });\n }\n parseToMesh(e, t, s, n) {\n if (s === \"image_overlay_tile_split\")\n return t[zs];\n }\n async resetVirtualChildren(e = !1) {\n this._virtualChildResetId++;\n const t = this._virtualChildResetId;\n if (await Promise.all(this.overlays.map((i) => i.whenReady())), t !== this._virtualChildResetId)\n return;\n const { tiles: s } = this, n = [];\n this.processedTiles.forEach((i) => {\n $e in i && n.push(i);\n }), n.sort((i, r) => r.internal.depth - i.internal.depth), n.forEach((i) => {\n const r = i.engineData.scene.clone();\n r.updateMatrixWorld(), (e || i[$e] !== this._getSplitVectors(r, i).hash) && this._removeVirtualChildren(i);\n }), e || s.forEachLoadedModel((i, r) => {\n this.expandVirtualChildren(i, r);\n });\n }\n _getSplitVectors(e, t, s = Pt) {\n const { tiles: n, overlayInfo: i } = this, r = new ct();\n r.setFromObject(e), r.getCenter(s);\n const o = [], l = [];\n i.forEach(({ tileInfo: u }, h) => {\n const d = u.get(t);\n if (d && d.target && h.shouldSplit(d.range, t)) {\n h.frame ? se.set(0, 0, 1).transformDirection(h.frame) : (n.ellipsoid.getPositionToNormal(s, se), se.length() < 1e-6 && se.set(1, 0, 0));\n const m = `${se.x.toFixed(3)},${se.y.toFixed(3)},${se.z.toFixed(3)}_`;\n l.includes(m) || l.push(m);\n const f = Xe.set(0, 0, 1);\n Math.abs(se.dot(f)) > 1 - 1e-4 && f.set(1, 0, 0);\n const p = new E().crossVectors(se, f).normalize(), g = new E().crossVectors(se, p).normalize();\n o.push(p, g);\n }\n });\n const c = [];\n for (; o.length !== 0; ) {\n const u = o.pop().clone(), h = u.clone();\n for (let d = 0; d < o.length; d++) {\n const m = o[d], f = u.dot(m);\n Math.abs(f) > Math.cos(Math.PI / 8) && (h.addScaledVector(m, Math.sign(f)), u.copy(h).normalize(), o.splice(d, 1), d--);\n }\n c.push(h.normalize());\n }\n return { directions: c, hash: l.join(\"\") };\n }\n async expandVirtualChildren(e, t) {\n const { refine: s } = t, n = s === \"REPLACE\" && t.children.length === 0 || s === \"ADD\", i = t.internal.virtualChildCount !== 0;\n if (this.enableTileSplitting === !1 || !n || i)\n return;\n const r = e.clone();\n r.updateMatrixWorld();\n const { directions: o, hash: l } = this._getSplitVectors(r, t, Pt);\n if (o.length === 0)\n return;\n t[$e] = l;\n const c = new xn();\n c.attributeList = (h) => !/^layer_uv_\\d+/.test(h), o.map((h) => {\n c.addSplitOperation((d, m, f, p, g, y) => (jt.getInterpolatedAttribute(d.attributes.position, m, f, p, g, Xe), Xe.applyMatrix4(y).sub(Pt).dot(h)));\n });\n const u = [];\n c.forEachSplitPermutation(() => {\n const h = c.clipObject(r);\n h.matrix.premultiply(t.engineData.transformInverse).decompose(h.position, h.quaternion, h.scale);\n const d = [];\n if (h.traverse((f) => {\n if (f.isMesh) {\n const p = f.material.clone();\n f.material = p;\n for (const g in p) {\n const y = p[g];\n if (y && y.isTexture && y.source.data instanceof ImageBitmap) {\n const x = document.createElement(\"canvas\");\n x.width = y.image.width, x.height = y.image.height;\n const S = x.getContext(\"2d\");\n S.scale(1, -1), S.drawImage(y.source.data, 0, 0, x.width, -x.height);\n const T = new Yt(x);\n T.mapping = y.mapping, T.wrapS = y.wrapS, T.wrapT = y.wrapT, T.minFilter = y.minFilter, T.magFilter = y.magFilter, T.format = y.format, T.type = y.type, T.anisotropy = y.anisotropy, T.colorSpace = y.colorSpace, T.generateMipmaps = y.generateMipmaps, p[g] = T;\n }\n }\n d.push(f);\n }\n }), d.length === 0)\n return;\n const m = {};\n if (t.boundingVolume.region && (m.region = Gs(d, this.tiles.ellipsoid).region), t.boundingVolume.box || t.boundingVolume.sphere) {\n Ar.setFromObject(h, !0).getCenter(Rt);\n let f = 0;\n h.traverse((p) => {\n const g = p.geometry;\n if (g) {\n const y = g.attributes.position;\n for (let x = 0, S = y.count; x < S; x++) {\n const T = Xe.fromBufferAttribute(y, x).applyMatrix4(p.matrixWorld).distanceToSquared(Rt);\n f = Math.max(f, T);\n }\n }\n }), m.sphere = [...Rt, Math.sqrt(f)];\n }\n u.push({\n internal: { isVirtual: !0 },\n refine: \"REPLACE\",\n geometricError: t.geometricError * 0.5,\n boundingVolume: m,\n content: { uri: \"./child.image_overlay_tile_split\" },\n children: [],\n [zs]: h\n });\n }), t[Qe] = t.refine, t.refine = \"REPLACE\", t.children.push(...u), t.internal.virtualChildCount += u.length;\n }\n fetchData(e, t) {\n if (/image_overlay_tile_split/.test(e))\n return new ArrayBuffer();\n }\n // public\n addOverlay(e, t = null) {\n const { tiles: s, overlays: n, overlayInfo: i } = this;\n t === null && (t = n.reduce((o, l) => Math.max(o, l.order + 1), 0));\n const r = new AbortController();\n n.push(e), i.set(e, {\n order: t,\n uniforms: {},\n tileInfo: /* @__PURE__ */ new Map(),\n controller: r,\n frame: e.frame ? e.frame.clone() : null\n }), s !== null && this._initOverlay(e);\n }\n setOverlayOrder(e, t) {\n this.overlays.indexOf(e) !== -1 && (this.overlayInfo.get(e).order = t, this._markNeedsUpdate());\n }\n deleteOverlay(e) {\n const { overlays: t, overlayInfo: s, processQueue: n, processedTiles: i } = this, r = t.indexOf(e);\n if (r !== -1) {\n const { tileInfo: o, controller: l } = s.get(e);\n i.forEach((c) => {\n if (!o.has(c))\n return;\n const {\n meshInfo: u,\n range: h\n } = o.get(c);\n h !== null && e.releaseTexture(h, c), o.delete(c), u.clear();\n }), o.clear(), s.delete(e), l.abort(), n.removeByFilter((c) => c.overlay === e), t.splice(r, 1), i.forEach((c) => {\n this._updateLayers(c);\n }), this._markNeedsUpdate();\n }\n }\n // initialize the overlay to use the right fetch options, load all data for existing tiles\n _initOverlay(e) {\n const { tiles: t } = this;\n e.isInitialized || (e.init(), e.whenReady().then(() => {\n e.setResolution(this.resolution);\n const i = e.fetch.bind(e);\n e.fetch = (...r) => t.downloadQueue.add({ priority: -performance.now() }, () => i(...r));\n }));\n const s = [], n = async (i, r) => {\n this._initTileOverlayInfo(r, e);\n const o = this._initTileSceneOverlayInfo(i, r, e);\n s.push(o), await o, this._updateLayers(r);\n };\n t.forEachLoadedModel((i, r) => {\n n(i, r);\n }), this.pendingTiles.forEach((i, r) => {\n n(i, r);\n }), Promise.all(s).then(() => {\n this._markNeedsUpdate();\n });\n }\n // wrap all materials in the given scene wit the overlay material shader\n _wrapMaterials(e) {\n e.traverse((t) => {\n if (t.material) {\n const s = _r(t.material, t.material.onBeforeCompile);\n this.meshParams.set(t, s);\n }\n });\n }\n // Initialize per-tile overlay information. This function triggers an async function but\n // does not need to be awaited for use since it's just locking textures which are awaited later.\n _initTileOverlayInfo(e, t = this.overlays) {\n if (Array.isArray(t)) {\n t.forEach((i) => this._initTileOverlayInfo(e, i));\n return;\n }\n const { overlayInfo: s } = this;\n if (s.get(t).tileInfo.has(e))\n return;\n const n = {\n range: null,\n target: null,\n meshInfo: /* @__PURE__ */ new Map()\n };\n if (s.get(t).tileInfo.set(e, n), t.isReady && !t.isPlanarProjection) {\n if (e.boundingVolume.region) {\n const [i, r, o, l] = e.boundingVolume.region, c = t.projection.toNormalizedRange([i, r, o, l]);\n n.range = c, t.lockTexture(c, e);\n }\n }\n }\n // initialize the scene meshes\n async _initTileSceneOverlayInfo(e, t, s = this.overlays) {\n if (Array.isArray(s))\n return Promise.all(s.map((T) => this._initTileSceneOverlayInfo(e, t, T)));\n const { tiles: n, overlayInfo: i, tileControllers: r, processQueue: o } = this, { ellipsoid: l } = n, { controller: c, tileInfo: u } = i.get(s), h = r.get(t);\n if (s.isReady || await s.whenReady(), c.signal.aborted || h.signal.aborted)\n return;\n const d = [];\n e.updateMatrixWorld(), e.traverse((T) => {\n T.isMesh && d.push(T);\n });\n const { aspectRatio: m, projection: f } = s, p = u.get(t);\n let g, y, x;\n if (s.isPlanarProjection) {\n _e.makeScale(1 / m, 1, 1).multiply(s.frame), e.parent !== null && _e.multiply(n.group.matrixWorldInverse);\n let T;\n ({ range: g, uvs: y, heightRange: T } = br(d, _e)), x = !(T[0] > 1 || T[1] < 0);\n } else\n _e.identity(), e.parent !== null && _e.copy(n.group.matrixWorldInverse), { range: g, uvs: y } = Gs(d, l, _e, f), g = f.toNormalizedRange(g), x = !0;\n p.range === null ? (p.range = g, s.lockTexture(g, t)) : g = p.range;\n let S = null;\n x && s.hasContent(g, t) && (S = await o.add({ tile: t, overlay: s }, async () => {\n if (c.signal.aborted || h.signal.aborted)\n return null;\n const T = await s.getTexture(g, t);\n return c.signal.aborted || h.signal.aborted ? null : T;\n }).catch((T) => {\n if (!(T instanceof Ti))\n throw T;\n })), p.target = S, d.forEach((T, M) => {\n const _ = new Float32Array(y[M]), C = new J(_, 3);\n p.meshInfo.set(T, { attribute: C });\n });\n }\n _updateLayers(e) {\n const { overlayInfo: t, overlays: s, tileControllers: n, meshParams: i } = this, r = n.get(e);\n if (this.tiles.recalculateBytesUsed(e), !(!r || r.signal.aborted)) {\n if (s.length === 0) {\n const o = e.engineData && e.engineData.scene;\n o && o.traverse((l) => {\n if (l.material && i.has(l)) {\n const c = i.get(l);\n c.layerMaps.length = 0, c.layerInfo.length = 0, l.material.defines.LAYER_COUNT = 0, l.material.needsUpdate = !0;\n }\n });\n return;\n }\n s.forEach((o, l) => {\n const { tileInfo: c } = t.get(o), { meshInfo: u, target: h } = c.get(e);\n u.forEach(({ attribute: d }, m) => {\n const { geometry: f, material: p } = m, g = i.get(m), y = `layer_uv_${l}`;\n f.getAttribute(y) !== d && (f.setAttribute(y, d), f.dispose()), g.layerMaps.length = s.length, g.layerInfo.length = s.length, g.layerMaps.value[l] = h !== null ? h : null, g.layerInfo.value[l] = o, p.defines[`LAYER_${l}_EXISTS`] = +(h !== null), p.defines[`LAYER_${l}_ALPHA_INVERT`] = Number(o.alphaInvert), p.defines[`LAYER_${l}_ALPHA_MASK`] = Number(o.alphaMask), p.defines.LAYER_COUNT = s.length, p.needsUpdate = !0;\n });\n });\n }\n }\n _markNeedsUpdate() {\n this.needsUpdate === !1 && (this.needsUpdate = !0, this.tiles !== null && this.tiles.dispatchEvent({ type: \"needs-update\" }));\n }\n}\nclass Ln {\n get isPlanarProjection() {\n return !!this.frame;\n }\n constructor(e = {}) {\n const {\n opacity: t = 1,\n color: s = 16777215,\n frame: n = null,\n preprocessURL: i = null,\n alphaMask: r = !1,\n alphaInvert: o = !1\n } = e;\n this.preprocessURL = i, this.opacity = t, this.color = new on(s), this.frame = n !== null ? n.clone() : null, this.alphaMask = r, this.alphaInvert = o, this._whenReady = null, this.isReady = !1, this.isInitialized = !1;\n }\n init() {\n this.isInitialized = !0, this._whenReady = this._init().then(() => this.isReady = !0);\n }\n whenReady() {\n return this._whenReady;\n }\n // overrideable\n _init() {\n }\n fetch(e, t = {}) {\n return this.preprocessURL && (e = this.preprocessURL(e)), fetch(e, t);\n }\n getAttributions(e) {\n }\n hasContent(e, t) {\n return !1;\n }\n async getTexture(e, t) {\n return null;\n }\n async lockTexture(e, t) {\n return null;\n }\n releaseTexture(e, t) {\n }\n setResolution(e) {\n }\n shouldSplit(e, t) {\n return !1;\n }\n}\nclass Ce extends Ln {\n get tiling() {\n return this.imageSource.tiling;\n }\n get projection() {\n return this.tiling.projection;\n }\n get aspectRatio() {\n return this.tiling && this.isReady ? this.tiling.aspectRatio : 1;\n }\n get fetchOptions() {\n return this.imageSource.fetchOptions;\n }\n set fetchOptions(e) {\n this.imageSource.fetchOptions = e;\n }\n constructor(e = {}) {\n const { imageSource: t = null, ...s } = e;\n super(s), this.imageSource = t, this.regionImageSource = null;\n }\n _init() {\n return this._initImageSource().then(() => {\n this.imageSource.fetchData = (...e) => this.fetch(...e), this.regionImageSource = new Sr(this.imageSource);\n });\n }\n _initImageSource() {\n return this.imageSource.init();\n }\n // Texture acquisition API implementations\n calculateLevel(e, t) {\n if (this.isPlanarProjection) {\n const [s, n, i, r] = e, o = i - s, l = r - n;\n let c = 0;\n const u = this.regionImageSource.resolution, h = this.tiling.maxLevel;\n for (; c < h; c++) {\n const d = u / o, m = u / l, { pixelWidth: f, pixelHeight: p } = this.tiling.getLevel(c);\n if (f >= d || p >= m)\n break;\n }\n return c;\n } else\n return t.internal.depthFromRenderedParent - 1;\n }\n hasContent(e, t) {\n return this.regionImageSource.hasContent(...e, this.calculateLevel(e, t));\n }\n getTexture(e, t) {\n return this.regionImageSource.get(...e, this.calculateLevel(e, t));\n }\n lockTexture(e, t) {\n return this.regionImageSource.lock(...e, this.calculateLevel(e, t));\n }\n releaseTexture(e, t) {\n this.regionImageSource.release(...e, this.calculateLevel(e, t));\n }\n setResolution(e) {\n this.regionImageSource.resolution = e;\n }\n shouldSplit(e, t) {\n return this.tiling.maxLevel > this.calculateLevel(e, t);\n }\n}\nclass go extends Ce {\n constructor(e = {}) {\n super(e), this.imageSource = new Ne(e);\n }\n}\nclass yo extends Ln {\n get projection() {\n return this.imageSource.projection;\n }\n get aspectRatio() {\n return 2;\n }\n get pointRadius() {\n return this.imageSource.pointRadius;\n }\n set pointRadius(e) {\n this.imageSource.pointRadius = e;\n }\n get strokeStyle() {\n return this.imageSource.strokeStyle;\n }\n set strokeStyle(e) {\n this.imageSource.strokeStyle = e;\n }\n get strokeWidth() {\n return this.imageSource.strokeWidth;\n }\n set strokeWidth(e) {\n this.imageSource.strokeWidth = e;\n }\n get fillStyle() {\n return this.imageSource.fillStyle;\n }\n set fillStyle(e) {\n this.imageSource.fillStyle = e;\n }\n get geojson() {\n return this.imageSource.geojson;\n }\n set geojson(e) {\n this.imageSource.geojson = e;\n }\n constructor(e = {}) {\n super(e), this.imageSource = new Cr(e);\n }\n _init() {\n return this.imageSource.init();\n }\n hasContent(e) {\n return this.imageSource.hasContent(...e);\n }\n getTexture(e) {\n return this.imageSource.get(...e);\n }\n lockTexture(e) {\n return this.imageSource.lock(...e);\n }\n releaseTexture(e) {\n this.imageSource.release(...e);\n }\n setResolution(e) {\n this.imageSource.resolution = e;\n }\n shouldSplit(e, t) {\n return !0;\n }\n redraw() {\n this.imageSource.redraw();\n }\n}\nclass xo extends Ce {\n constructor(e = {}) {\n super(e), this.imageSource = new yn(e);\n }\n}\nclass To extends Ce {\n constructor(e = {}) {\n super(e), this.imageSource = new gn(e);\n }\n}\nclass bo extends Ce {\n constructor(e = {}) {\n super(e), this.imageSource = new Xt(e);\n }\n}\nclass _o extends Ce {\n constructor(e = {}) {\n super(e);\n const { apiToken: t, autoRefreshToken: s, assetId: n } = e;\n this.options = e, this.assetId = n, this.auth = new Gn({ apiToken: t, autoRefreshToken: s }), this.auth.authURL = `https://api.cesium.com/v1/assets/${n}/endpoint`, this._attributions = [], this.externalType = !1;\n }\n _initImageSource() {\n return this.auth.refreshToken().then(async (e) => {\n if (this._attributions = e.attributions.map((t) => ({\n value: t.html,\n type: \"html\",\n collapsible: t.collapsible\n })), e.type !== \"IMAGERY\")\n throw new Error(\"CesiumIonOverlay: Only IMAGERY is supported as overlay type.\");\n switch (this.externalType = !!e.externalType, e.externalType) {\n case \"GOOGLE_2D_MAPS\": {\n const { url: t, session: s, key: n, tileWidth: i } = e.options, r = `${t}/v1/2dtiles/{z}/{x}/{y}?session=${s}&key=${n}`;\n this.imageSource = new Ne({\n ...this.options,\n url: r,\n tileDimension: i,\n // Google maps tiles have a fixed depth of 22\n // https://developers.google.com/maps/documentation/tile/2d-tiles-overview\n levels: 22\n });\n break;\n }\n case \"BING\": {\n const { url: t, mapStyle: s, key: n } = e.options, i = `${t}/REST/v1/Imagery/Metadata/${s}?incl=ImageryProviders&key=${n}&uriScheme=https`, o = (await fetch(i).then((l) => l.json())).resourceSets[0].resources[0];\n this.imageSource = new yr({\n ...this.options,\n url: o.imageUrl,\n subdomains: o.imageUrlSubdomains,\n tileDimension: o.tileWidth,\n levels: o.zoomMax\n });\n break;\n }\n default:\n this.imageSource = new Xt({\n ...this.options,\n url: e.url\n });\n }\n return this.imageSource.fetchData = (...t) => this.fetch(...t), this.imageSource.init();\n });\n }\n fetch(...e) {\n return this.externalType ? super.fetch(...e) : this.auth.fetch(...e);\n }\n getAttributions(e) {\n e.push(...this._attributions);\n }\n}\nclass So extends Ce {\n constructor(e = {}) {\n super(e);\n const { apiToken: t, sessionOptions: s, autoRefreshToken: n, logoUrl: i } = e;\n this.logoUrl = i, this.auth = new zn({ apiToken: t, sessionOptions: s, autoRefreshToken: n }), this.imageSource = new Ne(), this.imageSource.fetchData = (...r) => this.fetch(...r), this._logoAttribution = {\n value: \"\",\n type: \"image\",\n collapsible: !1\n };\n }\n _initImageSource() {\n return this.auth.refreshToken().then((e) => (this.imageSource.tileDimension = e.tileWidth, this.imageSource.url = \"https://tile.googleapis.com/v1/2dtiles/{z}/{x}/{y}\", this.imageSource.init()));\n }\n fetch(...e) {\n return this.auth.fetch(...e);\n }\n getAttributions(e) {\n this.logoUrl && (this._logoAttribution.value = this.logoUrl, e.push(this._logoAttribution));\n }\n}\nclass Mo {\n constructor() {\n this.name = \"LOAD_REGION_PLUGIN\", this.regions = [], this.tiles = null;\n }\n init(e) {\n this.tiles = e;\n }\n addRegion(e) {\n this.regions.indexOf(e) === -1 && this.regions.push(e);\n }\n removeRegion(e) {\n const t = this.regions.indexOf(e);\n t !== -1 && this.regions.splice(t, 1);\n }\n hasRegion(e) {\n return this.regions.indexOf(e) !== -1;\n }\n clearRegions() {\n this.regions = [];\n }\n // Calculates shape intersections and associated error values to use. If \"mask\" shapes are present then\n // tiles are only loaded if they are within those shapes.\n calculateTileViewError(e, t) {\n const s = e.engineData.boundingVolume, { regions: n, tiles: i } = this;\n let r = !1, o = null, l = 0, c = 1 / 0;\n for (const u of n) {\n const h = u.intersectsTile(s, e, i);\n r = r || h, h && (l = Math.max(u.calculateError(e, i), l), c = Math.min(u.calculateDistance(s, e, i), c)), u.mask && (o = o || h);\n }\n return t.inView = r && o !== !1, t.error = l, t.distance = c, t.inView || o !== null;\n }\n dispose() {\n this.regions = [];\n }\n}\nclass Zt {\n constructor(e = {}) {\n typeof e == \"number\" && (console.warn(\"LoadRegionPlugin: Region constructor has been changed to take options as an object.\"), e = { errorTarget: e });\n const {\n errorTarget: t = 10,\n mask: s = !1\n } = e;\n this.errorTarget = t, this.mask = s;\n }\n intersectsTile(e, t, s) {\n return !1;\n }\n calculateDistance(e, t, s) {\n return 1 / 0;\n }\n calculateError(e, t) {\n return e.geometricError - this.errorTarget + t.errorTarget;\n }\n}\nclass Co extends Zt {\n constructor(e = {}) {\n typeof e == \"number\" && (console.warn(\"SphereRegion: Region constructor has been changed to take options as an object.\"), e = {\n errorTarget: arguments[0],\n sphere: arguments[1]\n });\n const { sphere: t = new de() } = e;\n super(e), this.sphere = t.clone();\n }\n intersectsTile(e) {\n return e.intersectsSphere(this.sphere);\n }\n}\nclass Ao extends Zt {\n constructor(e = {}) {\n typeof e == \"number\" && (console.warn(\"RayRegion: Region constructor has been changed to take options as an object.\"), e = {\n errorTarget: arguments[0],\n ray: arguments[1]\n });\n const { ray: t = new oi() } = e;\n super(e), this.ray = t.clone();\n }\n intersectsTile(e) {\n return e.intersectsRay(this.ray);\n }\n}\nclass Io extends Zt {\n constructor(e = {}) {\n typeof e == \"number\" && (console.warn(\"RayRegion: Region constructor has been changed to take options as an object.\"), e = {\n errorTarget: arguments[0],\n obb: arguments[1]\n });\n const { obb: t = new fi() } = e;\n super(e), this.obb = t.clone(), this.obb.update();\n }\n intersectsTile(e) {\n return e.intersectsOBB(this.obb);\n }\n}\nconst te = /* @__PURE__ */ new E(), Hs = [\"x\", \"y\", \"z\"];\nclass Ir extends an {\n constructor(e, t = 16776960, s = 40) {\n const n = new st(), i = [];\n for (let r = 0; r < 3; r++) {\n const o = Hs[r], l = Hs[(r + 1) % 3];\n te.set(0, 0, 0);\n for (let c = 0; c < s; c++) {\n let u;\n u = 2 * Math.PI * c / (s - 1), te[o] = Math.sin(u), te[l] = Math.cos(u), i.push(te.x, te.y, te.z), u = 2 * Math.PI * (c + 1) / (s - 1), te[o] = Math.sin(u), te[l] = Math.cos(u), i.push(te.x, te.y, te.z);\n }\n }\n n.setAttribute(\"position\", new J(new Float32Array(i), 3)), n.computeBoundingSphere(), super(n, new ai({ color: t, toneMapped: !1 })), this.sphere = e, this.type = \"SphereHelper\";\n }\n updateMatrixWorld(e) {\n const t = this.sphere;\n this.position.copy(t.center), this.scale.setScalar(t.radius), super.updateMatrixWorld(e);\n }\n}\nconst Dt = /* @__PURE__ */ new E(), Ze = /* @__PURE__ */ new E(), ne = /* @__PURE__ */ new E();\nfunction vr(a, { computeNormals: e = !1 } = {}) {\n const {\n latStart: t = -Math.PI / 2,\n latEnd: s = Math.PI / 2,\n lonStart: n = 0,\n lonEnd: i = 2 * Math.PI,\n heightStart: r = 0,\n heightEnd: o = 0\n } = a, l = new ln(1, 1, 1, 32, 32), { normal: c, position: u } = l.attributes, h = u.clone();\n for (let d = 0, m = u.count; d < m; d++) {\n ne.fromBufferAttribute(u, d);\n const f = b.mapLinear(ne.x, -0.5, 0.5, t, s), p = b.mapLinear(ne.y, -0.5, 0.5, n, i);\n let g = r;\n a.getCartographicToNormal(f, p, Dt), ne.z < 0 && (g = o), a.getCartographicToPosition(f, p, g, ne), u.setXYZ(d, ...ne);\n }\n e && l.computeVertexNormals();\n for (let d = 0, m = h.count; d < m; d++) {\n ne.fromBufferAttribute(h, d);\n const f = b.mapLinear(ne.x, -0.5, 0.5, t, s), p = b.mapLinear(ne.y, -0.5, 0.5, n, i);\n Dt.fromBufferAttribute(c, d), a.getCartographicToNormal(f, p, Ze), Math.abs(Dt.dot(Ze)) > 0.1 && (ne.z > 0 && Ze.multiplyScalar(-1), c.setXYZ(d, ...Ze));\n }\n return l;\n}\nclass Lr extends an {\n constructor(e = new mi(), t = 16776960) {\n super(), this.ellipsoidRegion = e, this.material.color.set(t), this.update();\n }\n update() {\n const e = vr(this.ellipsoidRegion);\n this.geometry.dispose(), this.geometry = new li(e, 80);\n }\n dispose() {\n this.geometry.dispose(), this.material.dispose();\n }\n}\nconst qs = Symbol(\"ORIGINAL_MATERIAL\"), Bt = Symbol(\"HAS_RANDOM_COLOR\"), Ot = Symbol(\"HAS_RANDOM_NODE_COLOR\"), Ut = Symbol(\"LOAD_TIME\"), ge = Symbol(\"PARENT_BOUND_REF_COUNT\"), Ws = /* @__PURE__ */ new de(), Je = () => {\n}, Nt = {};\nfunction Ke(a) {\n if (!Nt[a]) {\n const e = Math.random(), t = 0.5 + Math.random() * 0.5, s = 0.375 + Math.random() * 0.25;\n Nt[a] = new on().setHSL(e, t, s);\n }\n return Nt[a];\n}\nconst Re = 0, En = 1, wn = 2, Pn = 3, Rn = 4, Dn = 5, Bn = 6, et = 7, tt = 8, On = 9, kt = 10, Er = Object.freeze({\n NONE: Re,\n SCREEN_ERROR: En,\n GEOMETRIC_ERROR: wn,\n DISTANCE: Pn,\n DEPTH: Rn,\n RELATIVE_DEPTH: Dn,\n IS_LEAF: Bn,\n RANDOM_COLOR: et,\n RANDOM_NODE_COLOR: tt,\n CUSTOM_COLOR: On,\n LOAD_ORDER: kt\n});\nclass vo {\n static get ColorModes() {\n return Er;\n }\n get unlit() {\n return this._unlit;\n }\n set unlit(e) {\n e !== this._unlit && (this._unlit = e, this.materialsNeedUpdate = !0);\n }\n get colorMode() {\n return this._colorMode;\n }\n set colorMode(e) {\n e !== this._colorMode && (this._colorMode = e, this.materialsNeedUpdate = !0);\n }\n get enabled() {\n return this._enabled;\n }\n set enabled(e) {\n e !== this._enabled && this.tiles !== null && (this._enabled = e, e ? this.init(this.tiles) : this.dispose());\n }\n get displayParentBounds() {\n return this._displayParentBounds;\n }\n set displayParentBounds(e) {\n this._displayParentBounds !== e && (this._displayParentBounds = e, e ? this.tiles.traverse((t) => {\n t.traversal.visible && this._onTileVisibilityChange(t, !0);\n }) : this.tiles.traverse((t) => {\n t[ge] = null, this._onTileVisibilityChange(t, t.traversal.visible);\n }));\n }\n constructor(e) {\n e = {\n displayParentBounds: !1,\n displayBoxBounds: !1,\n displaySphereBounds: !1,\n displayRegionBounds: !1,\n colorMode: Re,\n maxDebugDepth: -1,\n maxDebugDistance: -1,\n maxDebugError: -1,\n customColorCallback: null,\n unlit: !1,\n enabled: !0,\n ...e\n }, this.name = \"DEBUG_TILES_PLUGIN\", this.tiles = null, this._colorMode = null, this._unlit = null, this.materialsNeedUpdate = !1, this.extremeDebugDepth = -1, this.extremeDebugError = -1, this.boxGroup = null, this.sphereGroup = null, this.regionGroup = null, this._enabled = e.enabled, this._displayParentBounds = e.displayParentBounds, this.displayBoxBounds = e.displayBoxBounds, this.displaySphereBounds = e.displaySphereBounds, this.displayRegionBounds = e.displayRegionBounds, this.colorMode = e.colorMode, this.maxDebugDepth = e.maxDebugDepth, this.maxDebugDistance = e.maxDebugDistance, this.maxDebugError = e.maxDebugError, this.customColorCallback = e.customColorCallback, this.unlit = e.unlit, this.getDebugColor = (t, s) => {\n s.setRGB(t, t, t);\n };\n }\n // initialize the groups for displaying helpers, register events, and initialize existing tiles\n init(e) {\n if (this.tiles = e, !this.enabled)\n return;\n const t = e.group;\n this.boxGroup = new ke(), this.boxGroup.name = \"DebugTilesRenderer.boxGroup\", t.add(this.boxGroup), this.boxGroup.updateMatrixWorld(), this.sphereGroup = new ke(), this.sphereGroup.name = \"DebugTilesRenderer.sphereGroup\", t.add(this.sphereGroup), this.sphereGroup.updateMatrixWorld(), this.regionGroup = new ke(), this.regionGroup.name = \"DebugTilesRenderer.regionGroup\", t.add(this.regionGroup), this.regionGroup.updateMatrixWorld(), this._onLoadTilesetCB = () => {\n this._initExtremes();\n }, this._onLoadModelCB = ({ scene: s, tile: n }) => {\n this._onLoadModel(s, n);\n }, this._onDisposeModelCB = ({ tile: s }) => {\n this._onDisposeModel(s);\n }, this._onUpdateAfterCB = () => {\n this.update();\n }, this._onTileVisibilityChangeCB = ({ scene: s, tile: n, visible: i }) => {\n this._onTileVisibilityChange(n, i);\n }, e.addEventListener(\"load-tileset\", this._onLoadTilesetCB), e.addEventListener(\"load-model\", this._onLoadModelCB), e.addEventListener(\"dispose-model\", this._onDisposeModelCB), e.addEventListener(\"update-after\", this._onUpdateAfterCB), e.addEventListener(\"tile-visibility-change\", this._onTileVisibilityChangeCB), this._initExtremes(), e.traverse((s) => {\n s.engineData.scene && this._onLoadModel(s.engineData.scene, s);\n }), e.visibleTiles.forEach((s) => {\n this._onTileVisibilityChange(s, !0);\n });\n }\n getTileFromObject3D(e) {\n let t = null;\n return this.tiles.activeTiles.forEach((n) => {\n if (t)\n return !0;\n const i = n.engineData.scene;\n i && i.traverse((r) => {\n r === e && (t = n);\n });\n }), t;\n }\n _initExtremes() {\n if (!(this.tiles && this.tiles.root))\n return;\n let e = -1, t = -1;\n this.tiles.traverse(null, (s, n, i) => {\n e = Math.max(e, i), t = Math.max(t, s.geometricError);\n }, !1), this.extremeDebugDepth = e, this.extremeDebugError = t;\n }\n update() {\n const { tiles: e, colorMode: t } = this;\n if (!e.root)\n return;\n this.materialsNeedUpdate && (e.forEachLoadedModel((c) => {\n this._updateMaterial(c);\n }), this.materialsNeedUpdate = !1), this.boxGroup.visible = this.displayBoxBounds, this.sphereGroup.visible = this.displaySphereBounds, this.regionGroup.visible = this.displayRegionBounds;\n let s = -1;\n this.maxDebugDepth === -1 ? s = this.extremeDebugDepth : s = this.maxDebugDepth;\n let n = -1;\n this.maxDebugError === -1 ? n = this.extremeDebugError : n = this.maxDebugError;\n let i = -1;\n this.maxDebugDistance === -1 ? (e.getBoundingSphere(Ws), i = Ws.radius) : i = this.maxDebugDistance;\n const { errorTarget: r, visibleTiles: o } = e;\n let l;\n t === kt && (l = Array.from(o).sort((c, u) => c[Ut] - u[Ut])), o.forEach((c) => {\n const u = c.engineData.scene;\n let h, d, m;\n t === et && (h = Math.random(), d = 0.5 + Math.random() * 0.5, m = 0.375 + Math.random() * 0.25), u.traverse((f) => {\n if (t === tt && (h = Math.random(), d = 0.5 + Math.random() * 0.5, m = 0.375 + Math.random() * 0.25), f.material)\n switch (t !== et && delete f.material[Bt], t !== tt && delete f.material[Ot], t) {\n case Rn: {\n const p = c.internal.depth / s;\n this.getDebugColor(p, f.material.color);\n break;\n }\n case Dn: {\n const p = c.internal.depthFromRenderedParent / s;\n this.getDebugColor(p, f.material.color);\n break;\n }\n case En: {\n const p = c.traversal.error / r;\n p > 1 ? f.material.color.setRGB(1, 0, 0) : this.getDebugColor(p, f.material.color);\n break;\n }\n case wn: {\n const p = Math.min(c.geometricError / n, 1);\n this.getDebugColor(p, f.material.color);\n break;\n }\n case Pn: {\n const p = Math.min(c.traversal.distanceFromCamera / i, 1);\n this.getDebugColor(p, f.material.color);\n break;\n }\n case Bn: {\n !c.children || c.children.length === 0 ? this.getDebugColor(1, f.material.color) : this.getDebugColor(0, f.material.color);\n break;\n }\n case tt: {\n f.material[Ot] || (f.material.color.setHSL(h, d, m), f.material[Ot] = !0);\n break;\n }\n case et: {\n f.material[Bt] || (f.material.color.setHSL(h, d, m), f.material[Bt] = !0);\n break;\n }\n case On: {\n this.customColorCallback ? this.customColorCallback(c, f) : console.warn(\"DebugTilesRenderer: customColorCallback not defined\");\n break;\n }\n case kt: {\n const p = l.indexOf(c);\n this.getDebugColor(p / (l.length - 1), f.material.color);\n break;\n }\n }\n });\n });\n }\n _onTileVisibilityChange(e, t) {\n this.displayParentBounds ? bi(e, (s) => {\n s[ge] == null && (s[ge] = 0), t ? s[ge]++ : s[ge] > 0 && s[ge]--;\n const n = s === e && t || this.displayParentBounds && s[ge] > 0;\n this._updateBoundHelper(s, n);\n }) : this._updateBoundHelper(e, t);\n }\n _createBoundHelper(e) {\n const t = this.tiles, s = e.engineData, { sphere: n, obb: i, region: r } = s.boundingVolume;\n if (i) {\n const o = new ke();\n o.name = \"DebugTilesRenderer.boxHelperGroup\", o.matrix.copy(i.transform), o.matrixAutoUpdate = !1, s.boxHelperGroup = o;\n const l = new ci(i.box, Ke(e.internal.depth));\n l.raycast = Je, o.add(l);\n const c = new Be(new ln(), new Se({\n color: Ke(e.internal.depth),\n transparent: !0,\n depthWrite: !1,\n opacity: 0.05,\n side: rn\n }));\n i.box.getSize(c.scale), c.raycast = Je, o.add(c), t.visibleTiles.has(e) && this.displayBoxBounds && (this.boxGroup.add(o), o.updateMatrixWorld(!0));\n }\n if (n) {\n const o = new Ir(n, Ke(e.internal.depth));\n o.raycast = Je, s.sphereHelper = o, t.visibleTiles.has(e) && this.displaySphereBounds && (this.sphereGroup.add(o), o.updateMatrixWorld(!0));\n }\n if (r) {\n const o = new Lr(r, Ke(e.internal.depth));\n o.raycast = Je;\n const l = new de();\n r.getBoundingSphere(l), o.position.copy(l.center), l.center.multiplyScalar(-1), o.geometry.translate(...l.center), s.regionHelper = o, t.visibleTiles.has(e) && this.displayRegionBounds && (this.regionGroup.add(o), o.updateMatrixWorld(!0));\n }\n }\n _updateHelperMaterials(e, t) {\n t.traverse((s) => {\n const { material: n } = s;\n if (!n)\n return;\n e.traversal.visible || !this.displayParentBounds ? n.opacity = s.isMesh ? 0.05 : 1 : n.opacity = s.isMesh ? 0.01 : 0.2;\n const i = n.transparent;\n n.transparent = n.opacity < 1, n.transparent !== i && (n.needsUpdate = !0);\n });\n }\n _updateBoundHelper(e, t) {\n const s = e.engineData;\n if (!s)\n return;\n const n = this.sphereGroup, i = this.boxGroup, r = this.regionGroup;\n t && s.boxHelperGroup == null && s.sphereHelper == null && s.regionHelper == null && this._createBoundHelper(e);\n const o = s.boxHelperGroup, l = s.sphereHelper, c = s.regionHelper;\n t ? (o && (i.add(o), o.updateMatrixWorld(!0), this._updateHelperMaterials(e, o)), l && (n.add(l), l.updateMatrixWorld(!0), this._updateHelperMaterials(e, l)), c && (r.add(c), c.updateMatrixWorld(!0), this._updateHelperMaterials(e, c))) : (o && i.remove(o), l && n.remove(l), c && r.remove(c));\n }\n _updateMaterial(e) {\n const { colorMode: t, unlit: s } = this;\n e.traverse((n) => {\n if (!n.material)\n return;\n const i = n.material, r = n[qs];\n if (i !== r && i.dispose(), t !== Re || s) {\n if (n.isPoints) {\n const o = new ui();\n o.size = r.size, o.sizeAttenuation = r.sizeAttenuation, n.material = o;\n } else s ? n.material = new Se() : (n.material = new Ks(), n.material.flatShading = !0);\n t === Re && (n.material.map = r.map, n.material.color.set(r.color));\n } else\n n.material = r;\n });\n }\n _onLoadModel(e, t) {\n t[Ut] = performance.now(), e.traverse((s) => {\n const n = s.material;\n n && (s[qs] = n);\n }), this._updateMaterial(e);\n }\n _onDisposeModel(e) {\n const t = e.engineData;\n t != null && t.boxHelperGroup && (t.boxHelperGroup.children[0].geometry.dispose(), delete t.boxHelperGroup), t != null && t.sphereHelper && (t.sphereHelper.geometry.dispose(), delete t.sphereHelper), t != null && t.regionHelper && (t.regionHelper.geometry.dispose(), delete t.regionHelper);\n }\n dispose() {\n var t, s, n;\n const e = this.tiles;\n e.removeEventListener(\"load-tileset\", this._onLoadTilesetCB), e.removeEventListener(\"load-model\", this._onLoadModelCB), e.removeEventListener(\"dispose-model\", this._onDisposeModelCB), e.removeEventListener(\"update-after\", this._onUpdateAfterCB), e.removeEventListener(\"tile-visibility-change\", this._onTileVisibilityChangeCB), this.colorMode = Re, this.unlit = !1, e.forEachLoadedModel((i) => {\n this._updateMaterial(i);\n }), e.traverse((i) => {\n this._onDisposeModel(i);\n }, null, !1), (t = this.boxGroup) == null || t.removeFromParent(), (s = this.sphereGroup) == null || s.removeFromParent(), (n = this.regionGroup) == null || n.removeFromParent();\n }\n}\nclass wr extends Ue {\n constructor(e = {}) {\n const { url: t = null, ...s } = e;\n super(s), this.url = t, this.format = null, this.stem = null;\n }\n getUrl(e, t, s) {\n return `${this.stem}_files/${s}/${e}_${t}.${this.format}`;\n }\n init() {\n const { url: e } = this;\n return this.fetchData(e, this.fetchOptions).then((t) => t.text()).then((t) => {\n const s = new DOMParser().parseFromString(t, \"text/xml\");\n if (s.querySelector(\"DisplayRects\") || s.querySelector(\"Collection\"))\n throw new Error(\"DeepZoomImagesPlugin: DisplayRect and Collection DZI files not supported.\");\n const n = s.querySelector(\"Image\"), i = n.querySelector(\"Size\"), r = parseInt(i.getAttribute(\"Width\")), o = parseInt(i.getAttribute(\"Height\")), l = parseInt(n.getAttribute(\"TileSize\")), c = parseInt(n.getAttribute(\"Overlap\")), u = n.getAttribute(\"Format\");\n this.format = u, this.stem = e.split(/\\.[^.]+$/g)[0];\n const { tiling: h } = this, d = Math.ceil(Math.log2(Math.max(r, o))) + 1;\n h.flipY = !0, h.pixelOverlap = c, h.generateLevels(d, 1, 1, {\n tilePixelWidth: l,\n tilePixelHeight: l,\n pixelWidth: r,\n pixelHeight: o\n });\n });\n }\n}\nclass Lo extends pn {\n constructor(e = {}) {\n const { url: t, ...s } = e;\n super(s), this.name = \"DZI_TILES_PLUGIN\", this.imageSource = new wr({ url: t });\n }\n}\nconst ot = hn * Math.PI * 2, js = /* @__PURE__ */ new re(\"EPSG:3857\");\nfunction Pr(a) {\n return /:4326$/i.test(a);\n}\nfunction Un(a) {\n return /:3857$/i.test(a);\n}\nfunction Gt(a) {\n return a.trim().split(/\\s+/).map((e) => parseFloat(e));\n}\nfunction zt(a, e) {\n Pr(e) && ([a[1], a[0]] = [a[0], a[1]]);\n}\nfunction at(a, e) {\n if (Un(e))\n return a[0] = js.convertNormalizedToLongitude(0.5 + a[0] / ot), a[1] = js.convertNormalizedToLatitude(0.5 + a[1] / ot), a[0] *= b.RAD2DEG, a[1] *= b.RAD2DEG, a;\n}\nfunction lt(a) {\n a[0] *= b.DEG2RAD, a[1] *= b.DEG2RAD;\n}\nclass Eo extends dn {\n parse(e) {\n const t = new TextDecoder(\"utf-8\").decode(new Uint8Array(e)), s = new DOMParser().parseFromString(t, \"text/xml\"), n = s.querySelector(\"Contents\"), i = ue(n, \"TileMatrixSet\").map((l) => Nr(l)), r = ue(n, \"Layer\").map((l) => Dr(l)), o = Rr(s.querySelector(\"ServiceIdentification\"));\n return r.forEach((l) => {\n l.tileMatrixSets = l.tileMatrixSetLinks.map((c) => i.find((u) => u.identifier === c));\n }), {\n serviceIdentification: o,\n tileMatrixSets: i,\n layers: r\n };\n }\n}\nfunction Rr(a) {\n var i;\n const e = a.querySelector(\"Title\").textContent, t = ((i = a.querySelector(\"Abstract\")) == null ? void 0 : i.textContent) || \"\", s = a.querySelector(\"ServiceType\").textContent, n = a.querySelector(\"ServiceTypeVersion\").textContent;\n return {\n title: e,\n abstract: t,\n serviceType: s,\n serviceTypeVersion: n\n };\n}\nfunction Dr(a) {\n const e = a.querySelector(\"Title\").textContent, t = a.querySelector(\"Identifier\").textContent, s = a.querySelector(\"Format\").textContent, n = ue(a, \"ResourceURL\").map((c) => Br(c)), i = ue(a, \"TileMatrixSetLink\").map((c) => ue(c, \"TileMatrixSet\")[0].textContent), r = ue(a, \"Style\").map((c) => Ur(c)), o = ue(a, \"Dimension\").map((c) => Or(c));\n let l = Ys(a.querySelector(\"WGS84BoundingBox\"));\n return l || (l = Ys(a.querySelector(\"BoundingBox\"))), {\n title: e,\n identifier: t,\n format: s,\n dimensions: o,\n tileMatrixSetLinks: i,\n styles: r,\n boundingBox: l,\n resourceUrls: n\n };\n}\nfunction Br(a) {\n const e = a.getAttribute(\"template\"), t = a.getAttribute(\"format\"), s = a.getAttribute(\"resourceType\");\n return {\n template: e,\n format: t,\n resourceType: s\n };\n}\nfunction Or(a) {\n var r, o;\n const e = a.querySelector(\"Identifier\").textContent, t = ((r = a.querySelector(\"UOM\")) == null ? void 0 : r.textContent) || \"\", s = a.querySelector(\"Default\").textContent, n = ((o = a.querySelector(\"Current\")) == null ? void 0 : o.textContent) === \"true\", i = ue(a, \"Value\").map((l) => l.textContent);\n return {\n identifier: e,\n uom: t,\n defaultValue: s,\n current: n,\n values: i\n };\n}\nfunction Ys(a) {\n if (!a)\n return null;\n const e = a.nodeName.endsWith(\"WGS84BoundingBox\") ? \"urn:ogc:def:crs:CRS::84\" : a.getAttribute(\"crs\"), t = Gt(a.querySelector(\"LowerCorner\").textContent), s = Gt(a.querySelector(\"UpperCorner\").textContent);\n return zt(t, e), zt(s, e), at(t, e), at(s, e), lt(t), lt(s), {\n crs: e,\n lowerCorner: t,\n upperCorner: s,\n bounds: [...t, ...s]\n };\n}\nfunction Ur(a) {\n var n;\n const e = ((n = a.querySelector(\"Title\")) == null ? void 0 : n.textContent) || null, t = a.querySelector(\"Identifier\").textContent, s = a.getAttribute(\"isDefault\") === \"true\";\n return {\n title: e,\n identifier: t,\n isDefault: s\n };\n}\nfunction Nr(a) {\n var r, o;\n const e = a.querySelector(\"SupportedCRS\").textContent, t = ((r = a.querySelector(\"Title\")) == null ? void 0 : r.textContent) || \"\", s = a.querySelector(\"Identifier\").textContent, n = ((o = a.querySelector(\"Abstract\")) == null ? void 0 : o.textContent) || \"\", i = [];\n return a.querySelectorAll(\"TileMatrix\").forEach((l, c) => {\n const u = Vr(l), h = 28e-5 * u.scaleDenominator, d = u.tileWidth * u.matrixWidth * h, m = u.tileHeight * u.matrixHeight * h;\n let f;\n zt(u.topLeftCorner, e), Un(e) ? f = [\n u.topLeftCorner[0] + d,\n u.topLeftCorner[1] - m\n ] : f = [\n u.topLeftCorner[0] + 360 * d / ot,\n u.topLeftCorner[1] - 360 * m / ot\n ], at(f, e), at(u.topLeftCorner, e), lt(f), lt(u.topLeftCorner), u.bounds = [...u.topLeftCorner, ...f], [u.bounds[1], u.bounds[3]] = [u.bounds[3], u.bounds[1]], i.push(u);\n }), {\n title: t,\n identifier: s,\n abstract: n,\n supportedCRS: e,\n tileMatrices: i\n };\n}\nfunction Vr(a) {\n const e = a.querySelector(\"Identifier\").textContent, t = parseFloat(a.querySelector(\"TileWidth\").textContent), s = parseFloat(a.querySelector(\"TileHeight\").textContent), n = parseFloat(a.querySelector(\"MatrixWidth\").textContent), i = parseFloat(a.querySelector(\"MatrixHeight\").textContent), r = parseFloat(a.querySelector(\"ScaleDenominator\").textContent), o = Gt(a.querySelector(\"TopLeftCorner\").textContent);\n return {\n identifier: e,\n tileWidth: t,\n tileHeight: s,\n matrixWidth: n,\n matrixHeight: i,\n scaleDenominator: r,\n topLeftCorner: o,\n bounds: null\n };\n}\nfunction ue(a, e) {\n return [...a.children].filter((t) => t.tagName === e);\n}\nconst Xs = hn * Math.PI * 2, $s = /* @__PURE__ */ new re(\"EPSG:3857\");\nfunction Fr(a) {\n return /:4326$/i.test(a);\n}\nfunction kr(a) {\n return /:3857$/i.test(a);\n}\nfunction Qs(a, e) {\n return kr(e) && (a[0] = $s.convertNormalizedToLongitude(0.5 + a[0] / (Math.PI * 2 * Xs)), a[1] = $s.convertNormalizedToLatitude(0.5 + a[1] / (Math.PI * 2 * Xs)), a[0] *= b.RAD2DEG, a[1] *= b.RAD2DEG), a;\n}\nfunction Zs(a, e, t) {\n const [s, n] = t.split(\".\").map((r) => parseInt(r)), i = s === 1 && n < 3 || s < 1;\n Fr(e) && i && ([a[0], a[1]] = [a[1], a[0]]);\n}\nfunction Me(a) {\n a[0] *= b.DEG2RAD, a[1] *= b.DEG2RAD;\n}\nfunction Gr(a, e) {\n if (!a)\n return null;\n const t = a.getAttribute(\"CRS\") || a.getAttribute(\"crs\") || a.getAttribute(\"SRS\") || \"\", s = parseFloat(a.getAttribute(\"minx\")), n = parseFloat(a.getAttribute(\"miny\")), i = parseFloat(a.getAttribute(\"maxx\")), r = parseFloat(a.getAttribute(\"maxy\")), o = [s, n], l = [i, r];\n return Zs(o, t, e), Zs(l, t, e), Qs(o, t), Qs(l, t), Me(o), Me(l), { crs: t, bounds: [...o, ...l] };\n}\nfunction zr(a) {\n const e = parseFloat(a.querySelector(\"westBoundLongitude\").textContent), t = parseFloat(a.querySelector(\"eastBoundLongitude\").textContent), s = parseFloat(a.querySelector(\"southBoundLatitude\").textContent), n = parseFloat(a.querySelector(\"northBoundLatitude\").textContent), i = [e, s], r = [t, n];\n return Me(i), Me(r), [...i, ...r];\n}\nfunction Hr(a) {\n const e = parseFloat(a.getAttribute(\"minx\").textContent), t = parseFloat(a.getAttribute(\"maxx\").textContent), s = parseFloat(a.getAttribute(\"miny\").textContent), n = parseFloat(a.getAttribute(\"maxy\").textContent), i = [e, s], r = [t, n];\n return Me(i), Me(r), [...i, ...r];\n}\nfunction qr(a) {\n const e = a.querySelector(\"Name\").textContent, t = a.querySelector(\"Title\").textContent, s = [...a.querySelectorAll(\"LegendURL\")].map((n) => {\n const i = parseInt(n.getAttribute(\"width\")), r = parseInt(n.getAttribute(\"height\")), o = n.querySelector(\"Format\").textContent, l = n.querySelector(\"OnlineResource\"), c = Ht(l);\n return {\n width: i,\n height: r,\n format: o,\n url: c\n };\n });\n return {\n name: e,\n title: t,\n legends: s\n };\n}\nfunction Nn(a, e, t = {}) {\n var p, g, y;\n let {\n styles: s = [],\n crs: n = [],\n contentBoundingBox: i = null,\n queryable: r = !1,\n opaque: o = !1\n } = t;\n const l = ((p = a.querySelector(\":scope > Name\")) == null ? void 0 : p.textContent) || null, c = ((g = a.querySelector(\":scope > Title\")) == null ? void 0 : g.textContent) || \"\", u = ((y = a.querySelector(\":scope > Abstract\")) == null ? void 0 : y.textContent) || \"\", h = [...a.querySelectorAll(\":scope > Keyword\")].map((x) => x.textContent), m = [...a.querySelectorAll(\":scope > BoundingBox\")].map((x) => Gr(x, e));\n n = [\n ...n,\n ...Array.from(a.querySelectorAll(\"CRS\")).map((x) => x.textContent)\n ], s = [\n ...s,\n ...Array.from(a.querySelectorAll(\":scope > Style\")).map((x) => qr(x))\n ], a.hasAttribute(\"queryable\") && (r = a.getAttribute(\"queryable\") === \"1\"), a.hasAttribute(\"opaque\") && (o = a.getAttribute(\"opaque\") === \"1\"), a.querySelector(\"EX_GeographicBoundingBox\") ? i = zr(a.querySelector(\"EX_GeographicBoundingBox\")) : a.querySelector(\"LatLonBoundingBox\") && (i = Hr(a.querySelector(\"LatLonBoundingBox\")));\n const f = Array.from(a.querySelectorAll(\":scope > Layer\")).map((x) => Nn(x, e, {\n // add\n styles: s,\n crs: n,\n // replace\n contentBoundingBox: i,\n queryable: r,\n opaque: o\n }));\n return {\n name: l,\n title: c,\n abstract: u,\n queryable: r,\n opaque: o,\n keywords: h,\n crs: n,\n boundingBoxes: m,\n contentBoundingBox: i,\n styles: s,\n subLayers: f\n };\n}\nfunction Wr(a) {\n var e, t, s;\n return {\n name: ((e = a.querySelector(\"Name\")) == null ? void 0 : e.textContent) || \"\",\n title: ((t = a.querySelector(\"Title\")) == null ? void 0 : t.textContent) || \"\",\n abstract: ((s = a.querySelector(\"Abstract\")) == null ? void 0 : s.textContent) || \"\",\n keywords: Array.from(a.querySelectorAll(\"Keyword\")).map((n) => n.textContent),\n maxWidth: parseFloat(a.querySelector(\"MaxWidth\")) || null,\n maxHeight: parseFloat(a.querySelector(\"MaxHeight\")) || null,\n layerLimit: parseFloat(a.querySelector(\"LayerLimit\")) || null\n };\n}\nfunction Ht(a) {\n return a ? (a.getAttribute(\"xlink:href\") || a.getAttributeNS(\"http://www.w3.org/1999/xlink\", \"href\") || \"\").trim() : \"\";\n}\nfunction jr(a) {\n const e = Array.from(a.querySelectorAll(\"Format\")).map((s) => s.textContent.trim()), t = Array.from(a.querySelectorAll(\"DCPType\")).map((s) => {\n const n = s.querySelector(\"HTTP\"), i = n.querySelector(\"Get OnlineResource\") || n.querySelector(\"Get > OnlineResource\") || n.querySelector(\"Get\"), r = n.querySelector(\"Post OnlineResource\") || n.querySelector(\"Post > OnlineResource\") || n.querySelector(\"Post\"), o = Ht(i), l = Ht(r);\n return { type: \"HTTP\", get: o, post: l };\n });\n return { formats: e, dcp: t, href: t[0].get };\n}\nfunction Yr(a) {\n const e = {};\n return Array.from(a.querySelectorAll(\":scope > *\")).forEach((t) => {\n const s = t.localName;\n e[s] = jr(t);\n }), e;\n}\nfunction Vn(a, e = []) {\n return a.forEach((t) => {\n t.name !== null && e.push(t), Vn(t.subLayers, e);\n }), e;\n}\nclass wo extends dn {\n parse(e) {\n const t = new TextDecoder(\"utf-8\").decode(new Uint8Array(e)), s = new DOMParser().parseFromString(t, \"text/xml\"), i = (s.querySelector(\"WMS_Capabilities\") || s.querySelector(\"WMT_MS_Capabilities\")).getAttribute(\"version\"), r = s.querySelector(\"Capability\"), o = Wr(s.querySelector(\":scope > Service\")), l = Yr(r.querySelector(\":scope > Request\")), c = Array.from(r.querySelectorAll(\":scope > Layer\")).map((h) => Nn(h, i)), u = Vn(c);\n return { version: i, service: o, layers: u, request: l };\n }\n}\nexport {\n Zt as B,\n io as C,\n vo as D,\n nr as G,\n mo as I,\n Mo as L,\n tr as M,\n Io as O,\n Ui as Q,\n Ao as R,\n Co as S,\n bo as T,\n uo as U,\n wo as W,\n go as X,\n po as a,\n _o as b,\n Lo as c,\n lo as d,\n sr as e,\n Ki as f,\n yo as g,\n So as h,\n co as i,\n As as j,\n Ai as k,\n ao as l,\n fo as m,\n ho as n,\n oo as o,\n xo as p,\n no as q,\n Eo as r,\n To as s,\n so as t,\n to as u\n};\n//# sourceMappingURL=WMSCapabilitiesLoader-DngSzqI4.js.map\n","import {\r\n Group,\r\n InstancedMesh,\r\n LoadingManager,\r\n Matrix4,\r\n Mesh,\r\n MeshStandardMaterial,\r\n Quaternion,\r\n Scene,\r\n Texture,\r\n Vector3,\r\n Loader,\r\n} from \"three\";\r\nimport {\r\n acquireWorker,\r\n buildTextures,\r\n buildMaterials,\r\n buildMeshPrimitives,\r\n type PrimitiveData,\r\n getWorkers,\r\n} from \"./utils\";\r\nimport type { GLTFNodeData, GLTFWorkerData, MaterialBuilder } from \"./types\";\r\nimport { StructuralMetadata, MeshFeatures } from \"3d-tiles-renderer/plugins\";\r\n\r\n// 隔离接收oid数组\r\n\r\n// Extension names\r\nconst EXT_STRUCTURAL_METADATA = \"EXT_structural_metadata\";\r\nconst EXT_MESH_FEATURES = \"EXT_mesh_features\";\r\n\r\n/**\r\n * GLTFWorkerLoader configuration options\r\n */\r\nexport interface GLTFWorkerLoaderOptions {\r\n /** Whether to enable metadata support (EXT_mesh_features, EXT_structural_metadata) */\r\n metadata?: boolean;\r\n /** Custom material builder function */\r\n materialBuilder?: MaterialBuilder;\r\n}\r\n\r\nlet uuid = 0;\r\n\r\n/**\r\n * Custom Loader using Worker for GLTF parsing\r\n */\r\nexport class GLTFWorkerLoader extends Loader {\r\n private _metadata: boolean = true;\r\n private _materialBuilder?: MaterialBuilder;\r\n private _loaderId = uuid++;\r\n private _callbacks = new Map<\r\n number,\r\n { resolve: (data: any) => void; reject: (err: Error) => void }\r\n >();\r\n private _nextRequestId = 1;\r\n\r\n constructor(manager?: LoadingManager, options?: GLTFWorkerLoaderOptions) {\r\n super(manager);\r\n this._metadata = options?.metadata ?? true;\r\n this._materialBuilder = options?.materialBuilder;\r\n\r\n this.addListeners();\r\n }\r\n\r\n addListeners() {\r\n const workers = getWorkers();\r\n workers.forEach((worker) => {\r\n worker.addEventListener(\"message\", this._onMessage);\r\n });\r\n }\r\n\r\n removeListeners() {\r\n const workers = getWorkers();\r\n workers.forEach((worker) => {\r\n worker.removeEventListener(\"message\", this._onMessage);\r\n });\r\n }\r\n\r\n /**\r\n * Asynchronously parse GLTF buffer\r\n */\r\n async parseAsync(buffer: ArrayBuffer, path: string): Promise<any> {\r\n // Acquire available Worker\r\n const worker = acquireWorker();\r\n\r\n // Parse using worker\r\n const data = await this.parseWithWorker(worker, buffer, path);\r\n\r\n // Build Three.js scene\r\n const scene = this.buildSceneFromGLTFData(data);\r\n\r\n // Return format identical to GLTFLoader\r\n return {\r\n scene: scene,\r\n scenes: [scene],\r\n animations: [],\r\n cameras: [],\r\n asset: {\r\n generator: \"GLTFWorkerLoader\",\r\n version: \"2.0\",\r\n },\r\n parser: null as any,\r\n userData: {},\r\n };\r\n }\r\n\r\n /**\r\n * Parse GLTF data using Worker\r\n */\r\n private parseWithWorker(\r\n worker: Worker,\r\n buffer: ArrayBuffer,\r\n workingPath: string,\r\n ): Promise<GLTFWorkerData> {\r\n return new Promise((resolve, reject) => {\r\n const requestId = this._nextRequestId++;\r\n this._callbacks.set(requestId, { resolve, reject });\r\n\r\n // Send buffer and working path to worker\r\n worker.postMessage(\r\n {\r\n method: \"parseTile\",\r\n buffer: buffer,\r\n root: workingPath,\r\n loaderId: this._loaderId,\r\n requestId,\r\n fetchOptions: {\r\n referrer: window.location.href,\r\n referrerPolicy: \"origin\",\r\n },\r\n },\r\n [buffer],\r\n );\r\n });\r\n }\r\n\r\n private _onMessage = (event: MessageEvent) => {\r\n const { type, data, error, loaderId, requestId } = event.data;\r\n\r\n // loaderId here is our requestId\r\n if (loaderId !== this._loaderId) return;\r\n const callback = this._callbacks.get(requestId);\r\n if (!callback) return;\r\n\r\n this._callbacks.delete(requestId);\r\n\r\n if (type === \"success\") {\r\n callback.resolve(data);\r\n } else if (type === \"error\") {\r\n callback.reject(new Error(error));\r\n }\r\n };\r\n\r\n /**\r\n * Convert GLTF data returned by Worker to Three.js Scene\r\n */\r\n private buildSceneFromGLTFData(data: GLTFWorkerData): Scene {\r\n const scene = new Scene();\r\n\r\n // Build textures\r\n const { textureMap, textureArray } = buildTextures(data);\r\n\r\n // Build materials\r\n const materialMap = buildMaterials(data, textureMap, this._materialBuilder);\r\n\r\n // Create default material\r\n const defaultMaterial = new MeshStandardMaterial({ color: 0xcccccc });\r\n\r\n // Build mesh primitives\r\n const meshMap = buildMeshPrimitives(data, materialMap, defaultMaterial);\r\n\r\n // Parse node\r\n const parseNodeData = (nodeData: GLTFNodeData): Group => {\r\n const node = new Group();\r\n\r\n const primitiveDataList = meshMap.get(nodeData.mesh);\r\n if (primitiveDataList) {\r\n if (nodeData.instanceData) {\r\n // EXT_mesh_gpu_instancing: create InstancedMesh per primitive\r\n const { count, TRANSLATION, ROTATION, SCALE } = nodeData.instanceData;\r\n\r\n for (const {\r\n geometry,\r\n material,\r\n primitiveIndex,\r\n } of primitiveDataList) {\r\n const instancedMesh = new InstancedMesh(geometry, material, count);\r\n\r\n const tmpMatrix = new Matrix4();\r\n const tmpPos = new Vector3();\r\n const tmpQuat = new Quaternion();\r\n const tmpScale = new Vector3(1, 1, 1);\r\n\r\n for (let i = 0; i < count; i++) {\r\n if (TRANSLATION) {\r\n tmpPos.set(\r\n TRANSLATION[i * 3],\r\n TRANSLATION[i * 3 + 1],\r\n TRANSLATION[i * 3 + 2],\r\n );\r\n } else {\r\n tmpPos.set(0, 0, 0);\r\n }\r\n\r\n if (ROTATION) {\r\n tmpQuat.set(\r\n ROTATION[i * 4],\r\n ROTATION[i * 4 + 1],\r\n ROTATION[i * 4 + 2],\r\n ROTATION[i * 4 + 3],\r\n );\r\n } else {\r\n tmpQuat.identity();\r\n }\r\n\r\n if (SCALE) {\r\n tmpScale.set(SCALE[i * 3], SCALE[i * 3 + 1], SCALE[i * 3 + 2]);\r\n } else {\r\n tmpScale.set(1, 1, 1);\r\n }\r\n\r\n tmpMatrix.compose(tmpPos, tmpQuat, tmpScale);\r\n instancedMesh.setMatrixAt(i, tmpMatrix);\r\n }\r\n\r\n instancedMesh.instanceMatrix.needsUpdate = true;\r\n instancedMesh.userData._gltfMeshIndex = nodeData.mesh;\r\n instancedMesh.userData._gltfPrimitiveIndex = primitiveIndex;\r\n node.add(instancedMesh);\r\n }\r\n } else {\r\n for (const {\r\n geometry,\r\n material,\r\n primitiveIndex,\r\n } of primitiveDataList) {\r\n const mesh = new Mesh(geometry, material);\r\n mesh.userData._gltfMeshIndex = nodeData.mesh;\r\n mesh.userData._gltfPrimitiveIndex = primitiveIndex;\r\n node.add(mesh);\r\n }\r\n }\r\n }\r\n\r\n // Set node name\r\n if (nodeData.name) {\r\n node.name = nodeData.name;\r\n }\r\n\r\n // Apply transformation\r\n if (nodeData.matrix) {\r\n const m = new Matrix4();\r\n m.fromArray(nodeData.matrix);\r\n node.applyMatrix4(m);\r\n } else {\r\n if (nodeData.translation) {\r\n node.position.set(\r\n nodeData.translation[0],\r\n nodeData.translation[1],\r\n nodeData.translation[2],\r\n );\r\n }\r\n if (nodeData.rotation) {\r\n node.quaternion.set(\r\n nodeData.rotation[0],\r\n nodeData.rotation[1],\r\n nodeData.rotation[2],\r\n nodeData.rotation[3],\r\n );\r\n }\r\n if (nodeData.scale) {\r\n node.scale.set(\r\n nodeData.scale[0],\r\n nodeData.scale[1],\r\n nodeData.scale[2],\r\n );\r\n }\r\n }\r\n\r\n // Recursively process child nodes\r\n if (nodeData.children && Array.isArray(nodeData.children)) {\r\n for (const child of nodeData.children) {\r\n const childNode = parseNodeData(child);\r\n node.add(childNode);\r\n }\r\n }\r\n\r\n return node;\r\n };\r\n\r\n // Add scene nodes\r\n const sceneData = data.scenes[0];\r\n for (const nodeData of sceneData.nodes) {\r\n const node = parseNodeData(nodeData);\r\n scene.add(node);\r\n }\r\n\r\n // Process metadata (if enabled)\r\n if (this._metadata) {\r\n this.processMetadata(scene, data, textureArray, meshMap);\r\n }\r\n\r\n return scene;\r\n }\r\n\r\n /**\r\n * Process and attach metadata to scene and mesh objects\r\n */\r\n private processMetadata(\r\n scene: Scene,\r\n data: GLTFWorkerData,\r\n textures: (Texture | null)[],\r\n meshMap: Map<number, PrimitiveData[]>,\r\n ): void {\r\n const extensionsUsed = data.json?.extensionsUsed || [];\r\n const hasStructuralMetadata = extensionsUsed.includes(\r\n EXT_STRUCTURAL_METADATA,\r\n );\r\n const hasMeshFeatures = extensionsUsed.includes(EXT_MESH_FEATURES);\r\n\r\n if (!hasStructuralMetadata && !hasMeshFeatures) {\r\n return;\r\n }\r\n\r\n // Process EXT_structural_metadata\r\n let rootMetadata: any = null;\r\n if (hasStructuralMetadata && data.structuralMetadata) {\r\n const rootExtension = data.json?.extensions?.[EXT_STRUCTURAL_METADATA];\r\n if (rootExtension) {\r\n const definition = {\r\n schema: data.structuralMetadata.schema,\r\n propertyTables: data.structuralMetadata.propertyTables || [],\r\n propertyTextures: rootExtension.propertyTextures || [],\r\n propertyAttributes: rootExtension.propertyAttributes || [],\r\n };\r\n\r\n const buffers = data.structuralMetadata.buffers || [];\r\n rootMetadata = new StructuralMetadata(definition, textures, buffers);\r\n scene.userData.structuralMetadata = rootMetadata;\r\n }\r\n }\r\n\r\n // Traverse all meshes in the scene, process mesh-level metadata\r\n scene.traverse((child) => {\r\n if (!(child instanceof Mesh)) return;\r\n\r\n const meshIndex = child.userData._gltfMeshIndex as number | undefined;\r\n const primitiveIndex = child.userData._gltfPrimitiveIndex as\r\n | number\r\n | undefined;\r\n if (meshIndex === undefined || primitiveIndex === undefined) return;\r\n\r\n const primitiveDataList = meshMap.get(meshIndex);\r\n if (!primitiveDataList) return;\r\n\r\n const primitiveData = primitiveDataList.find(\r\n (p) => p.primitiveIndex === primitiveIndex,\r\n );\r\n if (!primitiveData) return;\r\n\r\n const extensions = primitiveData.extensions;\r\n\r\n // Process EXT_structural_metadata (primitive level)\r\n if (hasStructuralMetadata && rootMetadata) {\r\n const primMetadataExt = extensions?.[EXT_STRUCTURAL_METADATA];\r\n if (primMetadataExt) {\r\n const rootExtension =\r\n data.json?.extensions?.[EXT_STRUCTURAL_METADATA];\r\n if (rootExtension) {\r\n const definition = {\r\n schema: data.structuralMetadata!.schema,\r\n propertyTables: data.structuralMetadata!.propertyTables || [],\r\n propertyTextures: rootExtension.propertyTextures || [],\r\n propertyAttributes: rootExtension.propertyAttributes || [],\r\n };\r\n const buffers = data.structuralMetadata!.buffers || [];\r\n\r\n child.userData.structuralMetadata = new StructuralMetadata(\r\n definition,\r\n textures,\r\n buffers,\r\n primMetadataExt,\r\n child,\r\n );\r\n }\r\n } else {\r\n child.userData.structuralMetadata = rootMetadata;\r\n }\r\n }\r\n\r\n // Process EXT_mesh_features\r\n if (hasMeshFeatures) {\r\n const meshFeaturesExt = extensions?.[EXT_MESH_FEATURES];\r\n if (meshFeaturesExt) {\r\n child.userData.meshFeatures = new MeshFeatures(\r\n child.geometry,\r\n textures,\r\n meshFeaturesExt,\r\n );\r\n }\r\n }\r\n });\r\n }\r\n}\r\n","// IndexedDB constants\nconst DB_NAME = \"GLTFParserPluginTilesCache\";\nconst DB_VERSION = 1;\nconst STORE_NAME = \"tiles\";\n\n/**\n * IndexedDB Cache Manager Class\n */\nexport class TileCacheDB {\n private dbPromise: Promise<IDBDatabase> | null = null;\n\n /**\n * Open/Get database connection\n */\n private openDB(): Promise<IDBDatabase> {\n if (this.dbPromise) {\n return this.dbPromise;\n }\n\n this.dbPromise = new Promise((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n\n request.onerror = () => {\n reject(request.error);\n };\n\n request.onsuccess = () => {\n resolve(request.result);\n };\n\n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result;\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n db.createObjectStore(STORE_NAME, { keyPath: \"url\" });\n }\n };\n });\n\n return this.dbPromise;\n }\n\n /**\n * Get data from cache\n * @param url Cache key (processedUrl)\n */\n async get(url: string): Promise<ArrayBuffer | null> {\n try {\n const db = await this.openDB();\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(STORE_NAME, \"readonly\");\n const store = transaction.objectStore(STORE_NAME);\n const request = store.get(url);\n\n request.onerror = () => {\n reject(request.error);\n };\n\n request.onsuccess = () => {\n const result = request.result;\n resolve(result ? result.data : null);\n };\n });\n } catch (error) {\n return null;\n }\n }\n\n /**\n * Store data to cache\n * @param url Cache key (processedUrl)\n * @param data Data to cache\n */\n async set(url: string, data: ArrayBuffer): Promise<void> {\n const db = await this.openDB();\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(STORE_NAME, \"readwrite\");\n const store = transaction.objectStore(STORE_NAME);\n const request = store.put({\n url,\n data,\n timestamp: Date.now(),\n });\n\n request.onerror = () => {\n reject(request.error);\n };\n\n request.onsuccess = () => {\n resolve();\n };\n });\n }\n\n /**\n * Clear cache\n */\n async clear(): Promise<void> {\n const db = await this.openDB();\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(STORE_NAME, \"readwrite\");\n const store = transaction.objectStore(STORE_NAME);\n const request = store.clear();\n\n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve();\n });\n }\n}\n\n// Global cache instance\nexport const tileCache = new TileCacheDB();\n","import {\r\n Box3,\r\n DoubleSide,\r\n Intersection,\r\n Material,\r\n Mesh,\r\n Object3D,\r\n Vector2,\r\n WebGLRenderer,\r\n} from \"three\";\r\nimport type { Vector3 } from \"three\";\r\nimport {\r\n FeatureIdUniforms,\r\n FeatureInfo,\r\n buildOidToFeatureIdMap,\r\n getSplitMeshesFromTile,\r\n getTileMeshesByOid,\r\n queryFeatureFromIntersection,\r\n} from \"./mesh-helper\";\r\n\r\nimport { MeshCollector, type MeshHelperHost } from \"./MeshCollector\";\r\nimport { GLTFWorkerLoader } from \"./GLTFWorkerLoader\";\r\nimport type { MaterialBuilder } from \"./types\";\r\nimport { setMaxWorkers } from \"./utils\";\r\nimport { tileCache } from \"./db\";\r\nimport { TilesRenderer } from \"3d-tiles-renderer\";\r\n\r\ninterface TileWithCache {\r\n cached?: {\r\n scene: Object3D;\r\n };\r\n}\r\n\r\n/**\r\n * structure.json 中的树节点结构\r\n */\r\nexport interface StructureNode {\r\n id?: number;\r\n name?: string;\r\n bbox?: number[];\r\n children?: StructureNode[];\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * structure.json 的完整数据结构\r\n */\r\nexport interface StructureData {\r\n defaultTree?: number;\r\n idField?: string;\r\n trees: StructureNode[];\r\n}\r\n\r\n/**\r\n * modelInfo.json 的数据结构\r\n */\r\nexport interface ModelInfo {\r\n animatable: boolean;\r\n images: number;\r\n materials: number;\r\n pbr: boolean;\r\n textures: number;\r\n triangles: number;\r\n vertices: number;\r\n}\r\n\r\n/**\r\n * GLTFParserPlugin configuration options\r\n */\r\nexport interface GLTFParserPluginOptions {\r\n /**\r\n * WebGLRenderer instance, required for mesh helper features (hideByOids, etc.)\r\n */\r\n renderer?: WebGLRenderer;\r\n /**\r\n * Whether to enable metadata support\r\n * Includes EXT_mesh_features and EXT_structural_metadata extensions\r\n * @default true\r\n */\r\n metadata?: boolean;\r\n /**\r\n * Maximum number of workers in the worker pool\r\n * Maximum value is navigator.hardwareConcurrency\r\n * @default navigator.hardwareConcurrency\r\n */\r\n maxWorkers?: number;\r\n\r\n /**\r\n * Custom material builder function\r\n * Used to handle GLTF material extensions or custom material logic\r\n */\r\n materialBuilder?: MaterialBuilder;\r\n\r\n /**\r\n * Callback function before parsing\r\n * Used to preprocess the buffer before parsing GLTF\r\n */\r\n beforeParseTile?: (\r\n buffer: ArrayBuffer,\r\n tile: any,\r\n extension: any,\r\n uri: string,\r\n abortSignal: AbortSignal,\r\n ) => Promise<ArrayBuffer>;\r\n\r\n /**\r\n * Whether to enable IndexedDB caching for tile data\r\n * @default false\r\n */\r\n useIndexedDB?: boolean;\r\n}\r\n\r\nexport class GLTFParserPlugin implements MeshHelperHost {\r\n name = \"GLTFParserPlugin\";\r\n\r\n private tiles: (TilesRenderer & Record<string, any>) | null = null;\r\n private _loader: GLTFWorkerLoader | null = null;\r\n private readonly _gltfRegex = /\\.(gltf|glb)$/g;\r\n private readonly _options: GLTFParserPluginOptions;\r\n\r\n // --- Structure data properties ---\r\n private _structureData: StructureData | null = null;\r\n private _oidNodeMap: Map<number, StructureNode> = new Map();\r\n private _structurePromise: Promise<StructureData | null> | null = null;\r\n\r\n // --- Model info properties ---\r\n private _modelInfo: ModelInfo | null = null;\r\n private _modelInfoPromise: Promise<ModelInfo | null> | null = null;\r\n\r\n // --- Interaction filter properties ---\r\n private _frozenOids: Set<number> = new Set();\r\n private _isolatedOids: Set<number> = new Set();\r\n private _trackedMeshes: Map<number, Set<Mesh>> = new Map();\r\n private _meshListeners: Map<\r\n Mesh,\r\n { onAdded: () => void; onRemoved: () => void }\r\n > = new Map();\r\n private _isPluginRemoving = false;\r\n\r\n // --- Mesh helper properties ---\r\n oids: number[] = [];\r\n private renderer: WebGLRenderer | null = null;\r\n private splitMeshCache: Map<string, Mesh[]> = new Map();\r\n private maxUniformVectors: number = 1024;\r\n private featureIdCount: number = 32;\r\n private collectors: Set<MeshCollector> = new Set();\r\n private collectorCache: Map<number, MeshCollector> = new Map();\r\n\r\n /**\r\n * Create a GLTFParserPlugin instance\r\n * @param options configuration options\r\n */\r\n constructor(options?: GLTFParserPluginOptions) {\r\n this._options = {\r\n metadata: true,\r\n maxWorkers: navigator.hardwareConcurrency || 4,\r\n useIndexedDB: false,\r\n ...options,\r\n };\r\n\r\n if (options?.renderer) {\r\n this.renderer = options.renderer;\r\n }\r\n\r\n setMaxWorkers(this._options.maxWorkers!);\r\n }\r\n\r\n /**\r\n * Plugin initialization, called by TilesRenderer\r\n */\r\n init(tiles: TilesRenderer) {\r\n this.tiles = tiles;\r\n\r\n // --- GLTF loader setup ---\r\n this._loader = new GLTFWorkerLoader(tiles.manager, {\r\n metadata: this._options.metadata,\r\n materialBuilder: this._options.materialBuilder,\r\n });\r\n tiles.manager.addHandler(this._gltfRegex, this._loader);\r\n\r\n // --- Mesh helper setup ---\r\n if (this.renderer) {\r\n this._updateWebGLLimits();\r\n }\r\n\r\n tiles.addEventListener(\"load-model\", this._onLoadModelCB);\r\n tiles.addEventListener(\"tiles-load-end\", this._onTilesLoadEndCB);\r\n\r\n tiles.traverse((tile: any) => {\r\n const tileWithCache = tile as TileWithCache;\r\n if (tileWithCache.cached?.scene) {\r\n this._onLoadModel(tileWithCache.cached.scene);\r\n }\r\n return true;\r\n }, null);\r\n }\r\n\r\n // =============================================\r\n // GLTF Parser Methods\r\n // =============================================\r\n\r\n /**\r\n * Fetch tile data with IndexedDB caching support\r\n */\r\n async fetchData(\r\n url: string,\r\n options?: RequestInit,\r\n ): Promise<Response | ArrayBuffer | object> {\r\n const isJson = url.toLowerCase().endsWith(\".json\");\r\n if (!this._options.useIndexedDB || isJson) {\r\n return this.tiles!.fetchData(url, options);\r\n }\r\n\r\n try {\r\n const cachedData = await tileCache.get(url);\r\n\r\n if (cachedData) {\r\n return cachedData;\r\n }\r\n\r\n const response = await this.tiles!.fetchData(url, options);\r\n\r\n if (!response.ok) {\r\n return response;\r\n }\r\n\r\n const arrayBuffer = await response.arrayBuffer();\r\n\r\n tileCache.set(url, arrayBuffer).catch((err: unknown) => {\r\n console.warn(\"[GLTFParserPlugin] Failed to cache data:\", err);\r\n });\r\n\r\n return arrayBuffer;\r\n } catch (error) {\r\n return this.tiles!.fetchData(url, options);\r\n }\r\n }\r\n\r\n /**\r\n * Clear all cached tile data from IndexedDB\r\n */\r\n async clearCache(): Promise<void> {\r\n await tileCache.clear();\r\n console.info(\"[GLTFParserPlugin] Cache cleared\");\r\n }\r\n\r\n async parseTile(\r\n buffer: ArrayBuffer,\r\n tile: any,\r\n extension: any,\r\n uri: string,\r\n abortSignal: AbortSignal,\r\n ) {\r\n if (this._options.beforeParseTile) {\r\n buffer = await this._options.beforeParseTile(\r\n buffer,\r\n tile,\r\n extension,\r\n uri,\r\n abortSignal,\r\n );\r\n }\r\n return this.tiles!.parseTile(buffer, tile, extension, uri, abortSignal);\r\n }\r\n\r\n // =============================================\r\n // Structure Data Methods\r\n // =============================================\r\n\r\n private _getStructureUrl(): string | null {\r\n const rootURL = this.tiles?.rootURL as string | undefined;\r\n if (!rootURL) return null;\r\n return rootURL.replace(/[^/]+$/, \"structure.json\");\r\n }\r\n\r\n private _buildOidNodeMap(\r\n node: StructureNode,\r\n map: Map<number, StructureNode>,\r\n ): void {\r\n if (node.id !== undefined) {\r\n map.set(node.id, node);\r\n }\r\n if (node.children) {\r\n for (const child of node.children) {\r\n this._buildOidNodeMap(child, map);\r\n }\r\n }\r\n }\r\n\r\n private async _fetchStructureData(): Promise<StructureData | null> {\r\n const url = this._getStructureUrl();\r\n if (!url) {\r\n console.warn(\r\n \"[GLTFParserPlugin] Cannot derive structure.json URL: tiles not initialized\",\r\n );\r\n return null;\r\n }\r\n\r\n try {\r\n const response = await fetch(url);\r\n if (!response.ok) {\r\n console.warn(\r\n `[GLTFParserPlugin] Failed to fetch structure.json: ${response.status}`,\r\n );\r\n return null;\r\n }\r\n const data: StructureData = await response.json();\r\n this._structureData = data;\r\n\r\n this._oidNodeMap.clear();\r\n if (data.trees) {\r\n for (const tree of data.trees) {\r\n this._buildOidNodeMap(tree, this._oidNodeMap);\r\n }\r\n }\r\n\r\n return data;\r\n } catch (error) {\r\n console.error(\"[GLTFParserPlugin] Error loading structure.json:\", error);\r\n return null;\r\n }\r\n }\r\n\r\n private async _ensureStructureLoaded(): Promise<StructureData | null> {\r\n if (this._structureData) return this._structureData;\r\n if (!this._structurePromise) {\r\n this._structurePromise = this._fetchStructureData();\r\n }\r\n return this._structurePromise;\r\n }\r\n\r\n /**\r\n * 根据 oid 获取 structure.json 中对应的节点树数据\r\n * 包含 bbox、children、name 等完整结构信息\r\n * 首次调用时会自动从 tileset URL 推导并请求 structure.json\r\n */\r\n async getNodeTreeByOid(oid: number): Promise<StructureNode | null> {\r\n await this._ensureStructureLoaded();\r\n return this._oidNodeMap.get(oid) ?? null;\r\n }\r\n\r\n /**\r\n * 根据 oid 数组批量获取 structure.json 中对应的节点树数据\r\n */\r\n async getNodeTreeByOids(oids: number[]): Promise<Map<number, StructureNode>> {\r\n await this._ensureStructureLoaded();\r\n const result = new Map<number, StructureNode>();\r\n for (const oid of oids) {\r\n const node = this._oidNodeMap.get(oid);\r\n if (node) {\r\n result.set(oid, node);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * 获取完整的 structure.json 数据\r\n * 首次调用时会自动请求\r\n */\r\n async getStructureData(): Promise<StructureData | null> {\r\n return this._ensureStructureLoaded();\r\n }\r\n\r\n // =============================================\r\n // Spatial Query Methods\r\n // =============================================\r\n\r\n private _pointInPolygon(px: number, py: number, polygon: Vector2[]): boolean {\r\n let inside = false;\r\n const n = polygon.length;\r\n for (let i = 0, j = n - 1; i < n; j = i++) {\r\n const xi = polygon[i].x,\r\n yi = polygon[i].y;\r\n const xj = polygon[j].x,\r\n yj = polygon[j].y;\r\n if (\r\n yi > py !== yj > py &&\r\n px < ((xj - xi) * (py - yi)) / (yj - yi) + xi\r\n ) {\r\n inside = !inside;\r\n }\r\n }\r\n return inside;\r\n }\r\n\r\n private _segmentsIntersect(\r\n ax1: number,\r\n ay1: number,\r\n ax2: number,\r\n ay2: number,\r\n bx1: number,\r\n by1: number,\r\n bx2: number,\r\n by2: number,\r\n ): boolean {\r\n const cross = (\r\n ox: number,\r\n oy: number,\r\n ax: number,\r\n ay: number,\r\n bx: number,\r\n by: number,\r\n ) => (ax - ox) * (by - oy) - (ay - oy) * (bx - ox);\r\n\r\n const d1 = cross(bx1, by1, bx2, by2, ax1, ay1);\r\n const d2 = cross(bx1, by1, bx2, by2, ax2, ay2);\r\n const d3 = cross(ax1, ay1, ax2, ay2, bx1, by1);\r\n const d4 = cross(ax1, ay1, ax2, ay2, bx2, by2);\r\n\r\n if (\r\n ((d1 > 0 && d2 < 0) || (d1 < 0 && d2 > 0)) &&\r\n ((d3 > 0 && d4 < 0) || (d3 < 0 && d4 > 0))\r\n ) {\r\n return true;\r\n }\r\n\r\n const onSeg = (\r\n px: number,\r\n py: number,\r\n qx: number,\r\n qy: number,\r\n rx: number,\r\n ry: number,\r\n ) =>\r\n Math.min(px, qx) <= rx &&\r\n rx <= Math.max(px, qx) &&\r\n Math.min(py, qy) <= ry &&\r\n ry <= Math.max(py, qy);\r\n\r\n if (d1 === 0 && onSeg(bx1, by1, bx2, by2, ax1, ay1)) return true;\r\n if (d2 === 0 && onSeg(bx1, by1, bx2, by2, ax2, ay2)) return true;\r\n if (d3 === 0 && onSeg(ax1, ay1, ax2, ay2, bx1, by1)) return true;\r\n if (d4 === 0 && onSeg(ax1, ay1, ax2, ay2, bx2, by2)) return true;\r\n\r\n return false;\r\n }\r\n\r\n private _polygonIntersectsRect(\r\n polygon: Vector2[],\r\n minX: number,\r\n minY: number,\r\n maxX: number,\r\n maxY: number,\r\n ): boolean {\r\n const n = polygon.length;\r\n\r\n for (let i = 0; i < n; i++) {\r\n const p = polygon[i];\r\n if (p.x >= minX && p.x <= maxX && p.y >= minY && p.y <= maxY) {\r\n return true;\r\n }\r\n }\r\n\r\n if (\r\n this._pointInPolygon(minX, minY, polygon) ||\r\n this._pointInPolygon(maxX, minY, polygon) ||\r\n this._pointInPolygon(maxX, maxY, polygon) ||\r\n this._pointInPolygon(minX, maxY, polygon)\r\n ) {\r\n return true;\r\n }\r\n\r\n const rx = [minX, maxX, maxX, minX];\r\n const ry = [minY, minY, maxY, maxY];\r\n\r\n for (let i = 0; i < n; i++) {\r\n const a = polygon[i];\r\n const b = polygon[(i + 1) % n];\r\n for (let j = 0; j < 4; j++) {\r\n const k = (j + 1) % 4;\r\n if (\r\n this._segmentsIntersect(\r\n a.x,\r\n a.y,\r\n b.x,\r\n b.y,\r\n rx[j],\r\n ry[j],\r\n rx[k],\r\n ry[k],\r\n )\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * 选择包围盒范围内的构件(包含相交和包含两种情况)\r\n * @param box 查询用的 Box3 范围,坐标系与 structure.json 中 bbox 一致\r\n * @returns 范围内所有构件的 oid 数组\r\n */\r\n async selectByBox(box: Box3): Promise<number[]> {\r\n await this._ensureStructureLoaded();\r\n const result: number[] = [];\r\n const nodeBox = new Box3();\r\n\r\n for (const [oid, node] of this._oidNodeMap) {\r\n if (!node.bbox || node.bbox.length < 6) continue;\r\n nodeBox.min.set(node.bbox[0], node.bbox[1], node.bbox[2]);\r\n nodeBox.max.set(node.bbox[3], node.bbox[4], node.bbox[5]);\r\n if (box.intersectsBox(nodeBox)) {\r\n result.push(oid);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * 选择多边形(平面投影)范围内的构件(包含相交和包含两种情况)\r\n * @param polygon 多边形顶点数组(Vector3),按顺序连接构成闭合多边形\r\n * @param axis 投影平面,决定使用 bbox 的哪两个轴做 2D 判定\r\n * - 'xz'(默认):俯视图,取 bbox 的 x/z 坐标\r\n * - 'xy':正视图,取 bbox 的 x/y 坐标\r\n * - 'yz':侧视图,取 bbox 的 y/z 坐标\r\n * @returns 范围内所有构件的 oid 数组\r\n */\r\n async selectByPolygon(\r\n polygon: Vector3[],\r\n axis: \"xy\" | \"xz\" | \"yz\" = \"xz\",\r\n ): Promise<number[]> {\r\n await this._ensureStructureLoaded();\r\n const result: number[] = [];\r\n const polygon2D: Vector2[] = polygon.map((p) => {\r\n switch (axis) {\r\n case \"xy\":\r\n return new Vector2(p.x, p.y);\r\n case \"yz\":\r\n return new Vector2(p.y, p.z);\r\n case \"xz\":\r\n default:\r\n return new Vector2(p.x, p.z);\r\n }\r\n });\r\n\r\n for (const [oid, node] of this._oidNodeMap) {\r\n if (!node.bbox || node.bbox.length < 6) continue;\r\n\r\n let minU: number, minV: number, maxU: number, maxV: number;\r\n switch (axis) {\r\n case \"xy\":\r\n minU = node.bbox[0];\r\n minV = node.bbox[1];\r\n maxU = node.bbox[3];\r\n maxV = node.bbox[4];\r\n break;\r\n case \"xz\":\r\n minU = node.bbox[0];\r\n minV = node.bbox[2];\r\n maxU = node.bbox[3];\r\n maxV = node.bbox[5];\r\n break;\r\n case \"yz\":\r\n minU = node.bbox[1];\r\n minV = node.bbox[2];\r\n maxU = node.bbox[4];\r\n maxV = node.bbox[5];\r\n break;\r\n }\r\n\r\n if (this._polygonIntersectsRect(polygon2D, minU, minV, maxU, maxV)) {\r\n result.push(oid);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // =============================================\r\n // Model Info Methods\r\n // =============================================\r\n\r\n private _getModelInfoUrl(): string | null {\r\n const rootURL = this.tiles?.rootURL as string | undefined;\r\n if (!rootURL) return null;\r\n return rootURL.replace(/[^/]+$/, \"modelInfo.json\");\r\n }\r\n\r\n private async _fetchModelInfo(): Promise<ModelInfo | null> {\r\n const url = this._getModelInfoUrl();\r\n if (!url) {\r\n console.warn(\r\n \"[GLTFParserPlugin] Cannot derive modelInfo.json URL: tiles not initialized\",\r\n );\r\n return null;\r\n }\r\n\r\n try {\r\n const response = await fetch(url);\r\n if (!response.ok) {\r\n console.warn(\r\n `[GLTFParserPlugin] Failed to fetch modelInfo.json: ${response.status}`,\r\n );\r\n return null;\r\n }\r\n const data: ModelInfo = await response.json();\r\n this._modelInfo = data;\r\n return data;\r\n } catch (error) {\r\n console.error(\"[GLTFParserPlugin] Error loading modelInfo.json:\", error);\r\n return null;\r\n }\r\n }\r\n\r\n private async _ensureModelInfoLoaded(): Promise<ModelInfo | null> {\r\n if (this._modelInfo) return this._modelInfo;\r\n if (!this._modelInfoPromise) {\r\n this._modelInfoPromise = this._fetchModelInfo();\r\n }\r\n return this._modelInfoPromise;\r\n }\r\n\r\n /**\r\n * 获取 modelInfo.json 数据\r\n * 包含模型的基本信息:动画支持、材质数量、顶点数、三角形数等\r\n * 首次调用时会自动从 tileset URL 推导并请求 modelInfo.json\r\n */\r\n async getModelInfo(): Promise<ModelInfo | null> {\r\n return this._ensureModelInfoLoaded();\r\n }\r\n\r\n // =============================================\r\n // Mesh Helper Methods (from MaptalksTilerPlugin)\r\n // =============================================\r\n\r\n /**\r\n * Load model callback\r\n */\r\n private _onLoadModelCB = ({ scene }: { scene: Object3D }) => {\r\n this._onLoadModel(scene);\r\n };\r\n\r\n /**\r\n * Tiles load end callback\r\n */\r\n private _onTilesLoadEndCB = () => {\r\n this._notifyCollectors();\r\n };\r\n\r\n private _onLoadModel(scene: Object3D) {\r\n this.splitMeshCache.clear();\r\n\r\n buildOidToFeatureIdMap(scene);\r\n scene.traverse((c) => {\r\n if ((c as Mesh).material) {\r\n this._setupMaterial(c as Mesh);\r\n }\r\n });\r\n }\r\n\r\n private _notifyCollectors(): void {\r\n for (const collector of this.collectors) {\r\n collector._updateMeshes();\r\n }\r\n }\r\n\r\n _registerCollector(collector: MeshCollector): void {\r\n this.collectors.add(collector);\r\n }\r\n\r\n _unregisterCollector(collector: MeshCollector): void {\r\n const oid = collector.getOid();\r\n this.collectors.delete(collector);\r\n this.collectorCache.delete(oid);\r\n\r\n const tracked = this._trackedMeshes.get(oid);\r\n if (tracked) {\r\n for (const mesh of tracked) {\r\n this._untrackMesh(mesh);\r\n }\r\n this._trackedMeshes.delete(oid);\r\n }\r\n }\r\n\r\n private _updateWebGLLimits() {\r\n const gl = this.renderer!.getContext();\r\n const maxVectors = gl.getParameter(gl.MAX_FRAGMENT_UNIFORM_VECTORS);\r\n this.maxUniformVectors = maxVectors;\r\n }\r\n\r\n /**\r\n * Dynamically calculate FEATURE_ID_COUNT based on WebGL limits and current oid count\r\n */\r\n private _calculateFeatureIdCount(): number {\r\n const maxUniformVectors = this.maxUniformVectors;\r\n const currentOidCount = this.oids.length;\r\n\r\n if (currentOidCount > maxUniformVectors) {\r\n throw new Error(\r\n `The number of OIDs to hide (${currentOidCount}) exceeds the WebGL MAX_FRAGMENT_UNIFORM_VECTORS limit (${maxUniformVectors}).`,\r\n );\r\n }\r\n\r\n const minFeatureIdCount = 32;\r\n\r\n if (currentOidCount <= minFeatureIdCount) {\r\n return minFeatureIdCount;\r\n }\r\n\r\n const powerOf2 = Math.ceil(Math.log2(currentOidCount));\r\n return Math.pow(2, powerOf2);\r\n }\r\n\r\n /**\r\n * Set up shader modification for hiding specific features\r\n */\r\n private _setupMaterial(mesh: Mesh) {\r\n const material = mesh.material as Material;\r\n\r\n if (material.userData._meshHelperSetup) {\r\n return;\r\n }\r\n material.userData._meshHelperSetup = true;\r\n\r\n material.side = DoubleSide;\r\n\r\n const previousOnBeforeCompile = material.onBeforeCompile;\r\n\r\n if (!material.defines) {\r\n material.defines = {};\r\n }\r\n\r\n material.userData._materialFeatureIdCount = this.featureIdCount;\r\n\r\n Object.defineProperty(material.defines, \"FEATURE_ID_COUNT\", {\r\n get: () => {\r\n if (material.userData._materialFeatureIdCount !== this.featureIdCount) {\r\n material.userData._materialFeatureIdCount = this.featureIdCount;\r\n material.needsUpdate = true;\r\n }\r\n return material.userData._materialFeatureIdCount;\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n\r\n material.onBeforeCompile = (shader, renderer) => {\r\n previousOnBeforeCompile?.call(material, shader, renderer);\r\n\r\n if (shader.vertexShader.includes(\"varying float vFeatureId;\")) {\r\n return;\r\n }\r\n\r\n shader.uniforms.hiddenFeatureIds = new FeatureIdUniforms(mesh, this);\r\n\r\n shader.vertexShader = shader.vertexShader.replace(\r\n \"#include <common>\",\r\n `#include <common>\r\n attribute float _feature_id_0;\r\n varying float vFeatureId;`,\r\n );\r\n\r\n shader.vertexShader = shader.vertexShader.replace(\r\n \"#include <begin_vertex>\",\r\n `#include <begin_vertex>\r\n vFeatureId = _feature_id_0;`,\r\n );\r\n\r\n shader.fragmentShader = shader.fragmentShader.replace(\r\n \"#include <common>\",\r\n `#include <common>\r\n uniform float hiddenFeatureIds[FEATURE_ID_COUNT];\r\n varying float vFeatureId;\r\n \r\n bool shouldHideFeature(float featureId) {\r\n for(int i = 0; i < FEATURE_ID_COUNT; i++) {\r\n if(abs(hiddenFeatureIds[i] - featureId) < 0.001) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }`,\r\n );\r\n\r\n shader.fragmentShader = shader.fragmentShader.replace(\r\n \"void main() {\",\r\n `void main() {\r\n if(shouldHideFeature(vFeatureId)) {\r\n discard;\r\n }`,\r\n );\r\n };\r\n }\r\n\r\n /**\r\n * Query feature information from intersection\r\n * Respects freeze and isolate filters\r\n */\r\n queryFeatureFromIntersection(hit: Intersection): FeatureInfo {\r\n const result = queryFeatureFromIntersection(hit);\r\n\r\n if (result.isValid && result.oid !== undefined) {\r\n if (this._frozenOids.has(result.oid)) {\r\n return { isValid: false, error: \"Component is frozen\" };\r\n }\r\n if (this._isolatedOids.size > 0 && !this._isolatedOids.has(result.oid)) {\r\n return { isValid: false, error: \"Component is not in isolated set\" };\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // =============================================\r\n // Interaction Filter Methods\r\n // =============================================\r\n\r\n private _isOidBlocked(oid: number): boolean {\r\n if (this._frozenOids.has(oid)) return true;\r\n if (this._isolatedOids.size > 0 && !this._isolatedOids.has(oid))\r\n return true;\r\n return false;\r\n }\r\n\r\n private _trackMesh(mesh: Mesh, oid: number): void {\r\n if (this._meshListeners.has(mesh)) return;\r\n\r\n const onAdded = () => {\r\n if (this._isPluginRemoving) return;\r\n mesh.userData._detachedParent = null;\r\n if (this._isOidBlocked(oid) && mesh.parent) {\r\n const parent = mesh.parent;\r\n this._isPluginRemoving = true;\r\n mesh.userData._detachedParent = parent;\r\n parent.remove(mesh);\r\n this._isPluginRemoving = false;\r\n }\r\n };\r\n\r\n const onRemoved = () => {\r\n if (this._isPluginRemoving) return;\r\n mesh.userData._detachedParent = null;\r\n };\r\n\r\n mesh.addEventListener(\"added\", onAdded);\r\n mesh.addEventListener(\"removed\", onRemoved);\r\n this._meshListeners.set(mesh, { onAdded, onRemoved });\r\n }\r\n\r\n private _untrackMesh(mesh: Mesh): void {\r\n const listeners = this._meshListeners.get(mesh);\r\n if (listeners) {\r\n mesh.removeEventListener(\"added\", listeners.onAdded);\r\n mesh.removeEventListener(\"removed\", listeners.onRemoved);\r\n this._meshListeners.delete(mesh);\r\n }\r\n mesh.userData._detachedParent = null;\r\n }\r\n\r\n private _onCollectorMeshChange(oid: number, newMeshes: Mesh[]): void {\r\n const tracked = this._trackedMeshes.get(oid);\r\n const newSet = new Set(newMeshes);\r\n\r\n if (tracked) {\r\n for (const mesh of tracked) {\r\n if (!newSet.has(mesh)) {\r\n this._untrackMesh(mesh);\r\n tracked.delete(mesh);\r\n }\r\n }\r\n }\r\n\r\n const trackSet = tracked || new Set<Mesh>();\r\n for (const mesh of newMeshes) {\r\n if (!trackSet.has(mesh)) {\r\n this._trackMesh(mesh, oid);\r\n trackSet.add(mesh);\r\n }\r\n }\r\n this._trackedMeshes.set(oid, trackSet);\r\n }\r\n\r\n private _syncCollectorMeshes(): void {\r\n this._isPluginRemoving = true;\r\n\r\n for (const [oid, collector] of this.collectorCache) {\r\n const blocked = this._isOidBlocked(oid);\r\n\r\n for (const mesh of collector.meshes) {\r\n if (!this._meshListeners.has(mesh)) continue;\r\n\r\n if (blocked) {\r\n if (mesh.parent && !mesh.userData._detachedParent) {\r\n const parent = mesh.parent;\r\n mesh.userData._detachedParent = parent;\r\n // parent.remove(mesh);\r\n this.unhideByOids([oid]);\r\n }\r\n } else {\r\n const storedParent = mesh.userData._detachedParent;\r\n if (storedParent && !mesh.parent) {\r\n storedParent.add(mesh);\r\n mesh.userData._detachedParent = null;\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._isPluginRemoving = false;\r\n }\r\n\r\n /**\r\n * 冻结指定构件,被冻结的构件不再响应任何交互和事件\r\n */\r\n freezeByOids(oids: number[]): void {\r\n for (const oid of oids) {\r\n this._frozenOids.add(oid);\r\n }\r\n this._syncCollectorMeshes();\r\n }\r\n\r\n /**\r\n * 冻结单个构件\r\n */\r\n freezeByOid(oid: number): void {\r\n this._frozenOids.add(oid);\r\n this._syncCollectorMeshes();\r\n }\r\n\r\n /**\r\n * 解冻指定构件\r\n */\r\n unfreezeByOids(oids: number[]): void {\r\n for (const oid of oids) {\r\n this._frozenOids.delete(oid);\r\n }\r\n this._syncCollectorMeshes();\r\n }\r\n\r\n /**\r\n * 解冻单个构件\r\n */\r\n unfreezeByOid(oid: number): void {\r\n this._frozenOids.delete(oid);\r\n this._syncCollectorMeshes();\r\n }\r\n\r\n /**\r\n * 解冻全部构件\r\n */\r\n unfreeze(): void {\r\n this._frozenOids.clear();\r\n this._syncCollectorMeshes();\r\n }\r\n\r\n /**\r\n * 获取当前被冻结的 OID 数组\r\n */\r\n getFrozenOids(): number[] {\r\n return Array.from(this._frozenOids);\r\n }\r\n\r\n /**\r\n * 隔离指定构件,隔离模式下只有被隔离的构件才能响应交互和事件\r\n */\r\n isolateByOids(oids: number[]): void {\r\n for (const oid of oids) {\r\n this._isolatedOids.add(oid);\r\n }\r\n this._syncCollectorMeshes();\r\n }\r\n\r\n /**\r\n * 往隔离集合中添加单个构件\r\n */\r\n isolateByOid(oid: number): void {\r\n this._isolatedOids.add(oid);\r\n this._syncCollectorMeshes();\r\n }\r\n\r\n /**\r\n * 取消隔离指定构件\r\n */\r\n unisolateByOids(oids: number[]): void {\r\n for (const oid of oids) {\r\n this._isolatedOids.delete(oid);\r\n }\r\n this._syncCollectorMeshes();\r\n }\r\n\r\n /**\r\n * 从隔离集合中移除单个构件\r\n */\r\n unisolateByOid(oid: number): void {\r\n this._isolatedOids.delete(oid);\r\n this._syncCollectorMeshes();\r\n }\r\n\r\n /**\r\n * 取消全部隔离,恢复所有构件的交互能力\r\n */\r\n unisolate(): void {\r\n this._isolatedOids.clear();\r\n this._syncCollectorMeshes();\r\n }\r\n\r\n /**\r\n * 获取当前被隔离的 OID 数组\r\n */\r\n getIsolatedOids(): number[] {\r\n return Array.from(this._isolatedOids);\r\n }\r\n\r\n /**\r\n * 内部方法:根据 oid 获取 mesh 数组\r\n */\r\n _getMeshesByOidInternal(oid: number): Mesh[] {\r\n const tileMeshes = getTileMeshesByOid(this.tiles!, oid);\r\n\r\n const allSplitMeshes: Mesh[] = [];\r\n\r\n for (const tileMesh of tileMeshes) {\r\n const cacheKey = `${oid}_${tileMesh.uuid}`;\r\n\r\n let splitMeshes = this.splitMeshCache.get(cacheKey);\r\n\r\n if (!splitMeshes) {\r\n splitMeshes = getSplitMeshesFromTile(tileMesh, oid);\r\n this.splitMeshCache.set(cacheKey, splitMeshes);\r\n }\r\n allSplitMeshes.push(...splitMeshes);\r\n }\r\n\r\n return allSplitMeshes;\r\n }\r\n\r\n /**\r\n * 根据 oid 获取 MeshCollector\r\n * MeshCollector 会监听瓦片变化,自动更新 meshes 并触发 mesh-change 事件\r\n * 内部缓存:相同 oid 多次调用会返回同一个 collector 实例\r\n */\r\n getMeshCollectorByOid(oid: number): MeshCollector {\r\n const existing = this.collectorCache.get(oid);\r\n if (existing) {\r\n return existing;\r\n }\r\n const collector = new MeshCollector(oid, this);\r\n this.collectorCache.set(oid, collector);\r\n\r\n this._onCollectorMeshChange(oid, collector.meshes);\r\n\r\n collector.addEventListener(\"mesh-change\", (event) => {\r\n this._onCollectorMeshChange(oid, event.meshes);\r\n });\r\n\r\n return collector;\r\n }\r\n\r\n /**\r\n * Hide the corresponding part of the original mesh according to the OID array\r\n */\r\n hideByOids(oids: number[]): void {\r\n this.oids = oids;\r\n this.featureIdCount = this._calculateFeatureIdCount();\r\n }\r\n\r\n /**\r\n * Restore the display of the corresponding mesh according to the OID array\r\n */\r\n unhideByOids(oids: number[]): void {\r\n const oidSet = new Set(oids);\r\n const newOids = this.oids.filter((existingOid) => !oidSet.has(existingOid));\r\n this.oids = newOids;\r\n this.featureIdCount = this._calculateFeatureIdCount();\r\n }\r\n\r\n /**\r\n * Restore the original materials of the mesh\r\n */\r\n unhide(): void {\r\n this.oids = [];\r\n this.featureIdCount = this._calculateFeatureIdCount();\r\n }\r\n\r\n /**\r\n * Get the current feature ID count\r\n */\r\n getFeatureIdCount(): number {\r\n return this.featureIdCount;\r\n }\r\n\r\n /**\r\n * Plugin disposal\r\n */\r\n dispose() {\r\n if (this.tiles) {\r\n this.tiles.manager.removeHandler(this._gltfRegex);\r\n this.tiles.removeEventListener(\"load-model\", this._onLoadModelCB);\r\n this.tiles.removeEventListener(\"tiles-load-end\", this._onTilesLoadEndCB);\r\n }\r\n\r\n if (this._loader) {\r\n this._loader.removeListeners();\r\n }\r\n\r\n for (const collector of this.collectors) {\r\n collector.dispose();\r\n }\r\n this.collectors.clear();\r\n this.collectorCache.clear();\r\n\r\n this.splitMeshCache.clear();\r\n\r\n this._structureData = null;\r\n this._oidNodeMap.clear();\r\n this._structurePromise = null;\r\n\r\n // Clear model info data\r\n this._modelInfo = null;\r\n this._modelInfoPromise = null;\r\n\r\n for (const [, meshSet] of this._trackedMeshes) {\r\n for (const mesh of meshSet) {\r\n this._untrackMesh(mesh);\r\n }\r\n }\r\n this._trackedMeshes.clear();\r\n this._meshListeners.clear();\r\n this._frozenOids.clear();\r\n this._isolatedOids.clear();\r\n\r\n this._loader = null;\r\n this.tiles = null;\r\n }\r\n}\r\n"],"names":["GLTFWorkerClass","Y","E","Oe","Xn","Yn","K","ei","$n","ts","un","Qn","Kn","Jn","Zn","Se","Wt","StructuralMetadata","MeshFeatures"],"mappings":"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","x_google_ignoreList":[9,10]}
|
|
1
|
+
{"version":3,"file":"gltf-parser-plugin.module.js","sources":["../src/mesh-helper/FeatureIdUniforms.ts","../src/mesh-helper/idmap.ts","../src/mesh-helper/intersection.ts","../src/mesh-helper/mesh.ts","../src/MeshCollector.ts","../src/utils/build-textures.ts","../src/utils/build-materials.ts","../src/utils/build-mesh-primitives.ts","../src/utils/worker-pool.ts","../src/utils/spatial-query.ts","../node_modules/.pnpm/three@0.183.2/node_modules/three/examples/jsm/postprocessing/Pass.js","../node_modules/.pnpm/3d-tiles-renderer@0.4.22_three@0.183.2/node_modules/3d-tiles-renderer/build/WMSCapabilitiesLoader-DngSzqI4.js","../src/GLTFWorkerLoader.ts","../src/plugin/ComponentColorHelper.ts","../src/plugin/InteractionFilter.ts","../src/db/tile-cache.ts","../src/GLTFParserPlugin.ts"],"sourcesContent":["import type { GLTFParserPlugin } from \"../GLTFParserPlugin\";\r\nimport { Mesh } from \"three\";\r\n\r\nexport class FeatureIdUniforms {\r\n mesh: Mesh;\r\n plugin: GLTFParserPlugin;\r\n\r\n constructor(mesh: Mesh, plugin: GLTFParserPlugin) {\r\n this.mesh = mesh;\r\n this.plugin = plugin;\r\n }\r\n\r\n get value() {\r\n const idMap = this.mesh.userData.idMap;\r\n\r\n if (!idMap) {\r\n return new Array(this.plugin.getFeatureIdCount()).fill(-1);\r\n }\r\n\r\n const result = new Array(this.plugin.getFeatureIdCount()).fill(-1);\r\n for (let i = 0; i < this.plugin.oids.length; i++) {\r\n const oid = this.plugin.oids[i];\r\n const featureId = idMap[oid];\r\n result[i] = featureId !== undefined ? featureId : -1;\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n","import { Object3D } from \"three\";\r\n\r\nconst FEATURE_INDEX = 0;\r\n\r\n/**\r\n * Build mapping relationship from OID to FeatureId\r\n * @param scene Scene object\r\n */\r\nfunction buildOidToFeatureIdMap(scene: Object3D): void {\r\n scene.traverse((meshObject: Object3D) => {\r\n const { meshFeatures, structuralMetadata } = meshObject.userData;\r\n\r\n if (meshFeatures && structuralMetadata) {\r\n const { geometry, featureIds } = meshFeatures;\r\n const featureIdConfig = featureIds[FEATURE_INDEX];\r\n const featureAttribute = geometry.getAttribute(\r\n `_feature_id_${featureIdConfig.attribute}`\r\n );\r\n\r\n const processedFeatureIds = new Set<number>();\r\n const oidToFeatureIdMap: Record<number, number> = {};\r\n\r\n for (\r\n let vertexIndex = 0;\r\n vertexIndex < featureAttribute.count;\r\n vertexIndex++\r\n ) {\r\n const currentFeatureId = featureAttribute.getX(vertexIndex);\r\n\r\n if (processedFeatureIds.has(currentFeatureId)) {\r\n continue;\r\n }\r\n\r\n const featureData = structuralMetadata.getPropertyTableData(\r\n featureIdConfig.propertyTable,\r\n currentFeatureId\r\n );\r\n\r\n oidToFeatureIdMap[featureData._oid] = currentFeatureId;\r\n processedFeatureIds.add(currentFeatureId);\r\n }\r\n\r\n processedFeatureIds.clear();\r\n meshObject.userData.idMap = oidToFeatureIdMap;\r\n }\r\n });\r\n}\r\n\r\nexport { buildOidToFeatureIdMap };\r\n","import { Intersection, Mesh, Triangle, Vector3 } from \"three\";\r\n\r\n/**\r\n * Hit object feature information interface\r\n */\r\nexport interface FeatureInfo {\r\n oid?: number;\r\n featureId?: number;\r\n features?: number[];\r\n propertyData?: object;\r\n isValid: boolean;\r\n error?: string;\r\n}\r\n\r\n/**\r\n * General function for extracting OID and feature information from raycaster hit objects\r\n * @param hit - hit object returned by raycaster.intersectObject\r\n * @returns FeatureInfo object containing OID and other feature information\r\n */\r\nexport function queryFeatureFromIntersection(hit: Intersection): FeatureInfo {\r\n const result: FeatureInfo = {\r\n isValid: false,\r\n };\r\n\r\n try {\r\n if (!hit || !hit.object) {\r\n result.error = \"Invalid hit object\";\r\n return result;\r\n }\r\n\r\n const { object, face, point, faceIndex } = hit;\r\n const { meshFeatures, structuralMetadata } = object.userData;\r\n\r\n if (!(object instanceof Mesh)) {\r\n result.error = \"Hit object is not a Mesh\";\r\n return result;\r\n }\r\n\r\n if (!meshFeatures || !structuralMetadata) {\r\n result.error = \"No mesh features or structural metadata found\";\r\n return result;\r\n }\r\n\r\n const barycoord = new Vector3();\r\n if (face && point) {\r\n const triangle = new Triangle();\r\n triangle.setFromAttributeAndIndices(\r\n object.geometry.attributes.position,\r\n face.a,\r\n face.b,\r\n face.c\r\n );\r\n triangle.a.applyMatrix4(object.matrixWorld);\r\n triangle.b.applyMatrix4(object.matrixWorld);\r\n triangle.c.applyMatrix4(object.matrixWorld);\r\n triangle.getBarycoord(point, barycoord);\r\n } else {\r\n barycoord.set(0, 0, 0);\r\n }\r\n\r\n const features = meshFeatures.getFeatures(faceIndex, barycoord);\r\n if (!features || features.length === 0) {\r\n result.error = \"No features found at hit location\";\r\n return result;\r\n }\r\n\r\n result.features = features;\r\n\r\n const { featureIds } = meshFeatures;\r\n if (!featureIds || featureIds.length === 0) {\r\n result.error = \"Feature IDs not available\";\r\n return result;\r\n }\r\n\r\n const featureId = featureIds[0];\r\n const fid = features[0];\r\n result.featureId = fid;\r\n\r\n const propertyData = structuralMetadata.getPropertyTableData(\r\n featureId.propertyTable,\r\n fid\r\n );\r\n\r\n result.propertyData = propertyData;\r\n\r\n if (propertyData && propertyData._oid !== undefined) {\r\n result.oid = propertyData._oid;\r\n result.isValid = true;\r\n } else {\r\n result.error = \"OID not found in property data\";\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n result.error = `Error extracting OID: ${\r\n error instanceof Error ? error.message : String(error)\r\n }`;\r\n return result;\r\n }\r\n}\r\n","import { BufferAttribute, BufferGeometry, Mesh, Object3D } from \"three\";\r\n\r\nimport { TilesRenderer } from \"3d-tiles-renderer\";\r\n\r\n/**\r\n * 预建featureId到顶点索引的映射表,提高查询性能\r\n */\r\nfunction buildFeatureIdIndexMap(\r\n featureIdAttr: BufferAttribute\r\n): Map<number, Set<number>> {\r\n const featureIdMap = new Map<number, Set<number>>();\r\n\r\n for (let i = 0; i < featureIdAttr.count; i++) {\r\n const featureId = featureIdAttr.getX(i);\r\n\r\n if (!featureIdMap.has(featureId)) {\r\n featureIdMap.set(featureId, new Set<number>());\r\n }\r\n featureIdMap.get(featureId)!.add(i);\r\n }\r\n\r\n return featureIdMap;\r\n}\r\n\r\n/**\r\n * Create a geometry for a specified feature ID\r\n */\r\nfunction createGeometryForFeatureId(\r\n originalGeometry: BufferGeometry,\r\n featureIdMap: Map<number, Set<number>>,\r\n targetFeatureId: number\r\n): BufferGeometry | null {\r\n const newGeometry = new BufferGeometry();\r\n\r\n const targetVertexIndices = featureIdMap.get(targetFeatureId);\r\n\r\n if (!targetVertexIndices || targetVertexIndices.size === 0) {\r\n return null;\r\n }\r\n\r\n const attributes = originalGeometry.attributes;\r\n for (const attributeName in attributes) {\r\n newGeometry.setAttribute(attributeName, attributes[attributeName]);\r\n }\r\n\r\n if (originalGeometry.index) {\r\n const originalIndex = originalGeometry.index.array;\r\n const newIndices: number[] = [];\r\n\r\n for (let i = 0; i < originalIndex.length; i += 3) {\r\n const a = originalIndex[i];\r\n const b = originalIndex[i + 1];\r\n const c = originalIndex[i + 2];\r\n\r\n if (\r\n targetVertexIndices.has(a) &&\r\n targetVertexIndices.has(b) &&\r\n targetVertexIndices.has(c)\r\n ) {\r\n newIndices.push(a, b, c);\r\n }\r\n }\r\n\r\n if (newIndices.length > 0) {\r\n newGeometry.setIndex(newIndices);\r\n }\r\n }\r\n\r\n return newGeometry;\r\n}\r\n\r\n/**\r\n * Function to split mesh by feature ID\r\n */\r\nfunction splitMeshByOid(originalMesh: Mesh, oid: number): Mesh[] {\r\n const { meshFeatures, structuralMetadata } = originalMesh.userData;\r\n const { geometry, featureIds } = meshFeatures;\r\n\r\n const featureId = featureIds[0];\r\n const featureIdAttr = geometry.getAttribute(\r\n `_feature_id_${featureId.attribute}`\r\n );\r\n\r\n if (!featureIdAttr) {\r\n console.warn(\"No feature ID attribute found\");\r\n return [];\r\n }\r\n\r\n const featureIdMap = buildFeatureIdIndexMap(featureIdAttr);\r\n\r\n const currentBatchMeshes: Mesh[] = [];\r\n\r\n for (const [fid] of featureIdMap) {\r\n try {\r\n let _oid = null;\r\n let propertyData = null;\r\n\r\n if (structuralMetadata) {\r\n try {\r\n propertyData = structuralMetadata.getPropertyTableData(\r\n featureId.propertyTable,\r\n fid\r\n );\r\n _oid = (propertyData as any)?._oid;\r\n\r\n if (_oid === oid) {\r\n const newGeometry = createGeometryForFeatureId(\r\n geometry,\r\n featureIdMap,\r\n fid\r\n );\r\n\r\n if (newGeometry && newGeometry.attributes.position.count > 0) {\r\n const newMaterial = (originalMesh.material as any).clone();\r\n\r\n const newMesh = new Mesh(newGeometry, newMaterial);\r\n newMesh.parent = originalMesh.parent;\r\n newMesh.position.copy(originalMesh.position);\r\n newMesh.rotation.copy(originalMesh.rotation);\r\n newMesh.scale.copy(originalMesh.scale);\r\n newMesh.matrixWorld.copy(originalMesh.matrixWorld);\r\n\r\n newMesh.userData = {\r\n ...originalMesh.userData,\r\n featureId: fid,\r\n oid: oid,\r\n originalMesh: originalMesh,\r\n propertyData: propertyData,\r\n isSplit: true,\r\n };\r\n\r\n newMesh.name = `feature_${fid}_${oid || \"\"}`;\r\n currentBatchMeshes.push(newMesh);\r\n }\r\n }\r\n } catch (e) {\r\n console.warn(`Failed to get property data for feature ${fid}:`, e);\r\n }\r\n }\r\n } catch (error) {\r\n console.warn(`Error creating mesh for feature ${fid}:`, error);\r\n }\r\n }\r\n\r\n return currentBatchMeshes;\r\n}\r\n\r\n/**\r\n * 根据OID获取包含该OID的瓦片mesh\r\n */\r\nexport function getTileMeshesByOid(tiles: TilesRenderer, oid: number): Mesh[] {\r\n const tileMeshes: Mesh[] = [];\r\n\r\n tiles.group.traverse((child: Object3D) => {\r\n const mesh = child as Mesh;\r\n\r\n if (\r\n mesh.userData.meshFeatures &&\r\n mesh.userData.structuralMetadata &&\r\n !mesh.userData.isSplit\r\n ) {\r\n if (checkMeshContainsOid(mesh, oid)) {\r\n tileMeshes.push(mesh);\r\n }\r\n }\r\n });\r\n\r\n return tileMeshes;\r\n}\r\n\r\nfunction checkMeshContainsOid(mesh: Mesh, oid: number): boolean {\r\n const idMap = mesh.userData.idMap;\r\n\r\n if (!idMap) {\r\n return false;\r\n }\r\n\r\n return idMap[oid] !== undefined;\r\n}\r\n\r\n/**\r\n * 获取分割后的mesh\r\n */\r\nexport function getSplitMeshesFromTile(tileMesh: Mesh, oid: number): Mesh[] {\r\n let meshes: Mesh[] = [];\r\n\r\n try {\r\n const splitMeshes = splitMeshByOid(tileMesh, oid);\r\n meshes = [...meshes, ...splitMeshes];\r\n } catch (error) {\r\n console.warn(`拆分mesh失败:`, error);\r\n }\r\n\r\n return meshes;\r\n}\r\n","import { EventDispatcher, Mesh } from \"three\";\r\n\r\nexport interface MeshHelperHost {\r\n _registerCollector(collector: MeshCollector): void;\r\n _unregisterCollector(collector: MeshCollector): void;\r\n _getMeshesByOidInternal(oid: number): Mesh[];\r\n}\r\n\r\nexport interface MeshChangeEvent {\r\n type: \"mesh-change\";\r\n meshes: Mesh[];\r\n}\r\n\r\nexport type MeshCollectorEventMap = {\r\n \"mesh-change\": MeshChangeEvent;\r\n};\r\n\r\n/**\r\n * MeshCollector - 用于监听和收集特定 oid 对应的 mesh\r\n * 随着瓦片变化,会自动更新 meshes 并触发 mesh-change 事件\r\n */\r\nexport class MeshCollector extends EventDispatcher<MeshCollectorEventMap> {\r\n private oid: number;\r\n private plugin: MeshHelperHost;\r\n private _meshes: Mesh[] = [];\r\n private _disposed: boolean = false;\r\n\r\n constructor(oid: number, plugin: MeshHelperHost) {\r\n super();\r\n this.oid = oid;\r\n this.plugin = plugin;\r\n\r\n plugin._registerCollector(this);\r\n\r\n this._updateMeshes();\r\n }\r\n\r\n get meshes(): Mesh[] {\r\n return this._meshes;\r\n }\r\n\r\n _updateMeshes(): void {\r\n if (this._disposed) return;\r\n\r\n const newMeshes = this.plugin._getMeshesByOidInternal(this.oid);\r\n\r\n const hasChanged =\r\n newMeshes.length !== this._meshes.length ||\r\n newMeshes.some((mesh: Mesh, i: number) => mesh !== this._meshes[i]);\r\n\r\n if (hasChanged) {\r\n this._meshes = newMeshes;\r\n this.dispatchEvent({ type: \"mesh-change\", meshes: this._meshes });\r\n }\r\n }\r\n\r\n getOid(): number {\r\n return this.oid;\r\n }\r\n\r\n dispose(): void {\r\n if (this._disposed) return;\r\n this._disposed = true;\r\n this.plugin._unregisterCollector(this);\r\n this._meshes = [];\r\n }\r\n}\r\n","import {\n DataTexture,\n RGBAFormat,\n SRGBColorSpace,\n Texture,\n UnsignedByteType,\n} from \"three\";\nimport type { GLTFWorkerData } from \"../types\";\n\nexport interface TextureBuildResult {\n textureMap: Map<number, Texture>;\n textureArray: (Texture | null)[];\n}\n\n/**\n * Build textures from GLTF data\n */\nexport function buildTextures(data: GLTFWorkerData): TextureBuildResult {\n const textureMap = new Map<number, Texture>();\n const textureArray: (Texture | null)[] = [];\n\n if (!data.textures) {\n return { textureMap, textureArray };\n }\n\n for (const [index, textureData] of data.textures.entries()) {\n if (textureData.image && textureData.image.array) {\n const imageData = textureData.image;\n const tex = new DataTexture(\n imageData.array,\n imageData.width,\n imageData.height,\n RGBAFormat,\n UnsignedByteType,\n );\n tex.flipY = false;\n tex.colorSpace = SRGBColorSpace;\n tex.needsUpdate = true;\n textureMap.set(index, tex);\n textureArray[index] = tex;\n continue;\n }\n\n // Default empty texture\n const texture = new Texture();\n texture.flipY = false;\n textureMap.set(index, texture);\n textureArray[index] = texture;\n }\n\n return { textureMap, textureArray };\n}\n","import {\r\n DoubleSide,\r\n FrontSide,\r\n Material,\r\n MeshStandardMaterial,\r\n Texture,\r\n} from \"three\";\r\nimport type { GLTFWorkerData, MaterialBuilder } from \"../types\";\r\n\r\n/**\r\n * Build materials from GLTF data\r\n */\r\nexport function buildMaterials(\r\n data: GLTFWorkerData,\r\n textureMap: Map<number, Texture>,\r\n customMaterialBuilder?: MaterialBuilder,\r\n): Map<number, Material> {\r\n const materialMap = new Map<number, Material>();\r\n\r\n if (!data.materials) {\r\n return materialMap;\r\n }\r\n\r\n const materialBuilder = customMaterialBuilder || defaultMaterialBuilder;\r\n\r\n for (const [index, matData] of data.materials.entries()) {\r\n const material = materialBuilder(matData, textureMap);\r\n\r\n materialMap.set(index, material);\r\n }\r\n\r\n return materialMap;\r\n}\r\n\r\nfunction defaultMaterialBuilder(\r\n matData: any,\r\n textureMap: Map<number, Texture>,\r\n): Material {\r\n const material = new MeshStandardMaterial();\r\n\r\n // PBR material properties\r\n if (matData.pbrMetallicRoughness) {\r\n const pbr = matData.pbrMetallicRoughness;\r\n\r\n // Base color\r\n if (pbr.baseColorFactor) {\r\n material.color.setRGB(\r\n pbr.baseColorFactor[0],\r\n pbr.baseColorFactor[1],\r\n pbr.baseColorFactor[2],\r\n );\r\n if (pbr.baseColorFactor[3] !== undefined) {\r\n material.opacity = pbr.baseColorFactor[3];\r\n if (material.opacity < 1) material.transparent = true;\r\n }\r\n }\r\n\r\n // Base color texture\r\n if (pbr.baseColorTexture && pbr.baseColorTexture.index !== undefined) {\r\n const tex = textureMap.get(pbr.baseColorTexture.index);\r\n if (tex) {\r\n material.map = tex;\r\n }\r\n }\r\n\r\n // Metalness and roughness\r\n material.metalness =\r\n pbr.metallicFactor !== undefined ? pbr.metallicFactor : 1.0;\r\n material.roughness =\r\n pbr.roughnessFactor !== undefined ? pbr.roughnessFactor : 1.0;\r\n\r\n // Metallic roughness texture\r\n if (\r\n pbr.metallicRoughnessTexture &&\r\n pbr.metallicRoughnessTexture.index !== undefined\r\n ) {\r\n const tex = textureMap.get(pbr.metallicRoughnessTexture.index);\r\n if (tex) {\r\n material.metalnessMap = material.roughnessMap = tex;\r\n }\r\n }\r\n }\r\n\r\n // Normal map\r\n if (matData.normalTexture && matData.normalTexture.index !== undefined) {\r\n const tex = textureMap.get(matData.normalTexture.index);\r\n if (tex) {\r\n material.normalMap = tex;\r\n if (matData.normalTexture.scale !== undefined) {\r\n material.normalScale.set(\r\n matData.normalTexture.scale,\r\n matData.normalTexture.scale,\r\n );\r\n }\r\n }\r\n }\r\n\r\n // Occlusion map\r\n if (\r\n matData.occlusionTexture &&\r\n matData.occlusionTexture.index !== undefined\r\n ) {\r\n const tex = textureMap.get(matData.occlusionTexture.index);\r\n if (tex) {\r\n material.aoMap = tex;\r\n }\r\n }\r\n\r\n // Emissive\r\n if (matData.emissiveTexture && matData.emissiveTexture.index !== undefined) {\r\n const tex = textureMap.get(matData.emissiveTexture.index);\r\n if (tex) {\r\n material.emissiveMap = tex;\r\n }\r\n }\r\n if (matData.emissiveFactor) {\r\n material.emissive.setRGB(\r\n matData.emissiveFactor[0],\r\n matData.emissiveFactor[1],\r\n matData.emissiveFactor[2],\r\n );\r\n }\r\n\r\n // Double sided rendering\r\n material.side = matData.doubleSided ? DoubleSide : FrontSide;\r\n\r\n // Alpha mode\r\n if (matData.alphaMode === \"BLEND\") {\r\n material.transparent = true;\r\n } else if (matData.alphaMode === \"MASK\") {\r\n material.alphaTest =\r\n matData.alphaCutoff !== undefined ? matData.alphaCutoff : 0.5;\r\n }\r\n\r\n return material;\r\n}\r\n","import { BufferAttribute, BufferGeometry, Material, MeshStandardMaterial } from \"three\";\r\nimport type { GLTFWorkerData, PrimitiveExtensions } from \"../types\";\r\n\r\nexport interface PrimitiveData {\r\n geometry: BufferGeometry;\r\n material: Material;\r\n primitiveIndex: number;\r\n extensions?: PrimitiveExtensions;\r\n}\r\n\r\n/**\r\n * Build Mesh Primitives from GLTF data\r\n */\r\nexport function buildMeshPrimitives(\r\n data: GLTFWorkerData,\r\n materialMap: Map<number, Material>,\r\n defaultMaterial: Material,\r\n): Map<number, PrimitiveData[]> {\r\n const meshMap = new Map<number, PrimitiveData[]>();\r\n\r\n if (!data.meshes) {\r\n return meshMap;\r\n }\r\n\r\n for (const meshIndex in data.meshes) {\r\n const meshData = data.meshes[meshIndex];\r\n const primitiveDataList: PrimitiveData[] = [];\r\n const primitives = meshData.primitives;\r\n\r\n for (\r\n let primitiveIndex = 0;\r\n primitiveIndex < primitives.length;\r\n primitiveIndex++\r\n ) {\r\n const primitive = primitives[primitiveIndex];\r\n const geometry = new BufferGeometry();\r\n\r\n // Handle vertex attributes\r\n if (primitive.attributes) {\r\n // Position\r\n const posData = primitive.attributes.POSITION;\r\n if (posData && posData.array) {\r\n geometry.setAttribute(\r\n \"position\",\r\n new BufferAttribute(posData.array, posData.itemSize || 3),\r\n );\r\n }\r\n\r\n // Normal\r\n const normalData = primitive.attributes.NORMAL;\r\n if (normalData && normalData.array) {\r\n geometry.setAttribute(\r\n \"normal\",\r\n new BufferAttribute(normalData.array, normalData.itemSize || 3),\r\n );\r\n }\r\n\r\n // UV coordinates\r\n const uvData = primitive.attributes.TEXCOORD_0;\r\n if (uvData && uvData.array) {\r\n geometry.setAttribute(\r\n \"uv\",\r\n new BufferAttribute(uvData.array, uvData.itemSize || 2),\r\n );\r\n }\r\n\r\n // Vertex color\r\n const colorData = primitive.attributes.COLOR_0;\r\n if (colorData && colorData.array) {\r\n geometry.setAttribute(\r\n \"color\",\r\n new BufferAttribute(colorData.array, colorData.itemSize || 3),\r\n );\r\n }\r\n\r\n // Tangent\r\n const tangentData = primitive.attributes.TANGENT;\r\n if (tangentData && tangentData.array) {\r\n geometry.setAttribute(\r\n \"tangent\",\r\n new BufferAttribute(tangentData.array, tangentData.itemSize || 4),\r\n );\r\n }\r\n\r\n // Feature ID attribute (for EXT_mesh_features)\r\n for (const attrName in primitive.attributes) {\r\n if (attrName.startsWith(\"_FEATURE_ID_\")) {\r\n const featureIdData = primitive.attributes[attrName];\r\n if (featureIdData && featureIdData.array) {\r\n const normalizedName = attrName\r\n .toLowerCase()\r\n .replace(\"_feature_id_\", \"_feature_id_\");\r\n geometry.setAttribute(\r\n normalizedName,\r\n new BufferAttribute(\r\n featureIdData.array,\r\n featureIdData.itemSize || 1,\r\n ),\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Indices\r\n const indexData = primitive.indices;\r\n if (indexData && indexData.array) {\r\n geometry.setIndex(new BufferAttribute(indexData.array, 1));\r\n }\r\n\r\n // Get material\r\n const material =\r\n primitive.material !== undefined\r\n ? materialMap.get(primitive.material) || defaultMaterial\r\n : defaultMaterial;\r\n\r\n if (!geometry.hasAttribute(\"normal\") && material instanceof MeshStandardMaterial) {\r\n material.flatShading = true;\r\n }\r\n\r\n primitiveDataList.push({\r\n geometry,\r\n material,\r\n primitiveIndex,\r\n extensions: primitive.extensions,\r\n });\r\n }\r\n\r\n meshMap.set(Number(meshIndex), primitiveDataList);\r\n }\r\n\r\n return meshMap;\r\n}\r\n","// Import inline Worker (Vite will compile and bundle the worker code into a base64 data URL)\r\nimport GLTFWorkerClass from \"../worker/index?worker&inline\";\r\n\r\n// Worker pool management\r\nlet workerPool: Worker[] = [];\r\nlet maxWorkers = 1;\r\nlet currentWorkerIndex = 0;\r\n\r\n// ---- Global schema cache (shared across all workers) ----\r\n\r\nconst schemaCache = new Map<string, Promise<any>>();\r\n\r\n/**\r\n * Clear the global schema cache.\r\n */\r\nexport function clearSchemaCache(): void {\r\n schemaCache.clear();\r\n}\r\n\r\n/**\r\n * Attach a schema request handler to a Worker.\r\n * When the worker sends a { type: \"fetchSchema\" } message,\r\n * the main thread fetches (with deduplication via cache) and replies with the result.\r\n */\r\nfunction setupSchemaHandler(worker: Worker): void {\r\n worker.addEventListener(\"message\", (event: MessageEvent) => {\r\n const { type, schemaRequestId, url } = event.data;\r\n if (type !== \"fetchSchema\") return;\r\n\r\n let promise = schemaCache.get(url);\r\n if (!promise) {\r\n promise = fetch(url)\r\n .then((res) => {\r\n if (!res.ok) {\r\n throw new Error(\r\n `Failed to fetch schema: ${res.status} ${res.statusText}`,\r\n );\r\n }\r\n return res.json();\r\n })\r\n .catch((err) => {\r\n // Remove from cache on failure so it can be retried next time\r\n schemaCache.delete(url);\r\n throw err;\r\n });\r\n schemaCache.set(url, promise);\r\n }\r\n\r\n promise\r\n .then((data) => {\r\n worker.postMessage({ type: \"schemaResponse\", schemaRequestId, data });\r\n })\r\n .catch((err) => {\r\n worker.postMessage({\r\n type: \"schemaResponse\",\r\n schemaRequestId,\r\n error: err.message || String(err),\r\n });\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Set the maximum number of Workers (must be called before initialization)\r\n */\r\nexport function setMaxWorkers(count: number): void {\r\n maxWorkers = Math.max(1, Math.min(count, navigator.hardwareConcurrency || 4));\r\n}\r\n\r\n/**\r\n * Create a single Worker and wait for it to be ready\r\n */\r\nfunction createWorker(): Worker {\r\n const worker = new GLTFWorkerClass();\r\n setupSchemaHandler(worker);\r\n return worker;\r\n}\r\n\r\n/**\r\n * Initialize the Worker pool\r\n */\r\nfunction initWorkerPool() {\r\n if (workerPool.length === 0) {\r\n // Create all Workers\r\n for (let i = 0; i < maxWorkers; i++) {\r\n workerPool.push(createWorker());\r\n }\r\n }\r\n}\r\n\r\nexport function getWorkers(): Worker[] {\r\n initWorkerPool();\r\n return workerPool;\r\n}\r\n\r\n/**\r\n * Acquire a Worker (wait if none are available)\r\n */\r\nexport function acquireWorker() {\r\n initWorkerPool();\r\n\r\n const worker = workerPool[currentWorkerIndex];\r\n currentWorkerIndex = (currentWorkerIndex + 1) % workerPool.length;\r\n return worker;\r\n}\r\n","import { Box3, Vector2 } from \"three\";\nimport type { Vector3 } from \"three\";\nimport type { StructureNode } from \"../plugin-types\";\n\n/**\n * 射线法判断点是否在多边形内\n */\nexport function pointInPolygon(\n px: number,\n py: number,\n polygon: Vector2[],\n): boolean {\n let inside = false;\n const n = polygon.length;\n for (let i = 0, j = n - 1; i < n; j = i++) {\n const xi = polygon[i].x,\n yi = polygon[i].y;\n const xj = polygon[j].x,\n yj = polygon[j].y;\n if (yi > py !== yj > py && px < ((xj - xi) * (py - yi)) / (yj - yi) + xi) {\n inside = !inside;\n }\n }\n return inside;\n}\n\n/**\n * 判断两线段是否相交\n */\nexport function segmentsIntersect(\n ax1: number,\n ay1: number,\n ax2: number,\n ay2: number,\n bx1: number,\n by1: number,\n bx2: number,\n by2: number,\n): boolean {\n const cross = (\n ox: number,\n oy: number,\n ax: number,\n ay: number,\n bx: number,\n by: number,\n ) => (ax - ox) * (by - oy) - (ay - oy) * (bx - ox);\n\n const d1 = cross(bx1, by1, bx2, by2, ax1, ay1);\n const d2 = cross(bx1, by1, bx2, by2, ax2, ay2);\n const d3 = cross(ax1, ay1, ax2, ay2, bx1, by1);\n const d4 = cross(ax1, ay1, ax2, ay2, bx2, by2);\n\n if (\n ((d1 > 0 && d2 < 0) || (d1 < 0 && d2 > 0)) &&\n ((d3 > 0 && d4 < 0) || (d3 < 0 && d4 > 0))\n ) {\n return true;\n }\n\n const onSeg = (\n px: number,\n py: number,\n qx: number,\n qy: number,\n rx: number,\n ry: number,\n ) =>\n Math.min(px, qx) <= rx &&\n rx <= Math.max(px, qx) &&\n Math.min(py, qy) <= ry &&\n ry <= Math.max(py, qy);\n\n if (d1 === 0 && onSeg(bx1, by1, bx2, by2, ax1, ay1)) return true;\n if (d2 === 0 && onSeg(bx1, by1, bx2, by2, ax2, ay2)) return true;\n if (d3 === 0 && onSeg(ax1, ay1, ax2, ay2, bx1, by1)) return true;\n if (d4 === 0 && onSeg(ax1, ay1, ax2, ay2, bx2, by2)) return true;\n\n return false;\n}\n\n/**\n * 判断多边形与矩形是否相交或包含\n */\nexport function polygonIntersectsRect(\n polygon: Vector2[],\n minX: number,\n minY: number,\n maxX: number,\n maxY: number,\n): boolean {\n const n = polygon.length;\n\n for (let i = 0; i < n; i++) {\n const p = polygon[i];\n if (p.x >= minX && p.x <= maxX && p.y >= minY && p.y <= maxY) {\n return true;\n }\n }\n\n if (\n pointInPolygon(minX, minY, polygon) ||\n pointInPolygon(maxX, minY, polygon) ||\n pointInPolygon(maxX, maxY, polygon) ||\n pointInPolygon(minX, maxY, polygon)\n ) {\n return true;\n }\n\n const rx = [minX, maxX, maxX, minX];\n const ry = [minY, minY, maxY, maxY];\n\n for (let i = 0; i < n; i++) {\n const a = polygon[i];\n const b = polygon[(i + 1) % n];\n for (let j = 0; j < 4; j++) {\n const k = (j + 1) % 4;\n if (segmentsIntersect(a.x, a.y, b.x, b.y, rx[j], ry[j], rx[k], ry[k])) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * 从 OID 节点映射中按 Box3 范围筛选构件\n */\nexport function selectByBoxFromOidMap(\n oidNodeMap: Map<number, StructureNode>,\n box: Box3,\n): number[] {\n const result: number[] = [];\n const nodeBox = new Box3();\n\n for (const [oid, node] of oidNodeMap) {\n if (!node.bbox || node.bbox.length < 6) continue;\n nodeBox.min.set(node.bbox[0], node.bbox[1], node.bbox[2]);\n nodeBox.max.set(node.bbox[3], node.bbox[4], node.bbox[5]);\n if (box.intersectsBox(nodeBox)) {\n result.push(oid);\n }\n }\n\n return result;\n}\n\n/**\n * 从 OID 节点映射中按多边形(平面投影)范围筛选构件\n */\nexport function selectByPolygonFromOidMap(\n oidNodeMap: Map<number, StructureNode>,\n polygon: Vector3[],\n axis: \"xy\" | \"xz\" | \"yz\" = \"xz\",\n): number[] {\n const result: number[] = [];\n const polygon2D: Vector2[] = polygon.map((p) => {\n switch (axis) {\n case \"xy\":\n return new Vector2(p.x, p.y);\n case \"yz\":\n return new Vector2(p.y, p.z);\n case \"xz\":\n default:\n return new Vector2(p.x, p.z);\n }\n });\n\n for (const [oid, node] of oidNodeMap) {\n if (!node.bbox || node.bbox.length < 6) continue;\n\n let minU: number, minV: number, maxU: number, maxV: number;\n switch (axis) {\n case \"xy\":\n minU = node.bbox[0];\n minV = node.bbox[1];\n maxU = node.bbox[3];\n maxV = node.bbox[4];\n break;\n case \"xz\":\n minU = node.bbox[0];\n minV = node.bbox[2];\n maxU = node.bbox[3];\n maxV = node.bbox[5];\n break;\n case \"yz\":\n minU = node.bbox[1];\n minV = node.bbox[2];\n maxU = node.bbox[4];\n maxV = node.bbox[5];\n break;\n }\n\n if (polygonIntersectsRect(polygon2D, minU, minV, maxU, maxV)) {\n result.push(oid);\n }\n }\n\n return result;\n}\n","import {\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tOrthographicCamera,\n\tMesh\n} from 'three';\n\n/**\n * Abstract base class for all post processing passes.\n *\n * This module is only relevant for post processing with {@link WebGLRenderer}.\n *\n * @abstract\n * @three_import import { Pass } from 'three/addons/postprocessing/Pass.js';\n */\nclass Pass {\n\n\t/**\n\t * Constructs a new pass.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPass = true;\n\n\t\t/**\n\t\t * If set to `true`, the pass is processed by the composer.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enabled = true;\n\n\t\t/**\n\t\t * If set to `true`, the pass indicates to swap read and write buffer after rendering.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.needsSwap = true;\n\n\t\t/**\n\t\t * If set to `true`, the pass clears its buffer before rendering\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clear = false;\n\n\t\t/**\n\t\t * If set to `true`, the result of the pass is rendered to screen. The last pass in the composers\n\t\t * pass chain gets automatically rendered to screen, no matter how this property is configured.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.renderToScreen = false;\n\n\t}\n\n\t/**\n\t * Sets the size of the pass.\n\t *\n\t * @abstract\n\t * @param {number} width - The width to set.\n\t * @param {number} height - The height to set.\n\t */\n\tsetSize( /* width, height */ ) {}\n\n\t/**\n\t * This method holds the render logic of a pass. It must be implemented in all derived classes.\n\t *\n\t * @abstract\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( /* renderer, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\tconsole.error( 'THREE.Pass: .render() must be implemented in derived pass.' );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the pass is no longer used in your app.\n\t *\n\t * @abstract\n\t */\n\tdispose() {}\n\n}\n\n// Helper for passes that need to fill the viewport with a single quad.\n\nconst _camera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n// https://github.com/mrdoob/three.js/pull/21358\n\nclass FullscreenTriangleGeometry extends BufferGeometry {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( [ - 1, 3, 0, - 1, - 1, 0, 3, - 1, 0 ], 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( [ 0, 2, 0, 0, 2, 0 ], 2 ) );\n\n\t}\n\n}\n\nconst _geometry = new FullscreenTriangleGeometry();\n\n\n/**\n * This module is a helper for passes which need to render a full\n * screen effect which is quite common in context of post processing.\n *\n * The intended usage is to reuse a single full screen quad for rendering\n * subsequent passes by just reassigning the `material` reference.\n *\n * This module can only be used with {@link WebGLRenderer}.\n *\n * @augments Mesh\n * @three_import import { FullScreenQuad } from 'three/addons/postprocessing/Pass.js';\n */\nclass FullScreenQuad {\n\n\t/**\n\t * Constructs a new full screen quad.\n\t *\n\t * @param {?Material} material - The material to render te full screen quad with.\n\t */\n\tconstructor( material ) {\n\n\t\tthis._mesh = new Mesh( _geometry, material );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis._mesh.geometry.dispose();\n\n\t}\n\n\t/**\n\t * Renders the full screen quad.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t */\n\trender( renderer ) {\n\n\t\trenderer.render( this._mesh, _camera );\n\n\t}\n\n\t/**\n\t * The quad's material.\n\t *\n\t * @type {?Material}\n\t */\n\tget material() {\n\n\t\treturn this._mesh.material;\n\n\t}\n\n\tset material( value ) {\n\n\t\tthis._mesh.material = value;\n\n\t}\n\n}\n\nexport { Pass, FullScreenQuad };\n","import { Q as Fn, b as kn, C as Gn, G as zn } from \"./QuantizedMeshLoaderBase-Bbby1xf8.js\";\nimport { PlaneGeometry as Js, Mesh as Be, MeshBasicMaterial as Se, Vector2 as Y, MathUtils as b, Vector3 as E, Sphere as de, Texture as Hn, SRGBColorSpace as qt, TextureUtils as qn, DefaultLoadingManager as Wn, BufferGeometry as st, MeshStandardMaterial as Ks, BufferAttribute as J, DataTexture as Wt, RGFormat as en, UnsignedByteType as tn, LinearMipMapLinearFilter as jn, LinearFilter as sn, Triangle as jt, Vector4 as Oe, Matrix4 as K, Matrix3 as Yn, Matrix2 as Xn, WebGLRenderer as $n, WebGLRenderTarget as ts, ShaderMaterial as Qn, OneFactor as Zn, ZeroFactor as Jn, CustomBlending as Kn, Box2 as ei, FileLoader as ti, Quaternion as nn, BatchedMesh as si, Source as ni, Box3 as ct, REVISION as ii, WebGLArrayRenderTarget as ss, Raycaster as ri, DoubleSide as rn, CanvasTexture as Yt, Color as on, Ray as oi, LineSegments as an, LineBasicMaterial as ai, EdgesGeometry as li, BoxGeometry as ln, Group as ke, Box3Helper as ci, PointsMaterial as ui } from \"three\";\nimport { a as cn, c as hi, W as di, g as pi, O as fi, b as mi } from \"./MemoryUtils-BD0AS93P.js\";\nimport { GLTFLoader as gi } from \"three/examples/jsm/loaders/GLTFLoader.js\";\nimport { FullScreenQuad as un } from \"three/examples/jsm/postprocessing/Pass.js\";\nimport { b as yi, c as xi, d as Ti, f as hn } from \"./constants-Cj07Qhs1.js\";\nimport { c as bi, L as dn } from \"./LoaderBase-2yhE3Jur.js\";\nconst fe = /* @__PURE__ */ new Y(), ye = Symbol(\"TILE_X\"), xe = Symbol(\"TILE_Y\"), ae = Symbol(\"TILE_LEVEL\");\nclass pn {\n get tiling() {\n return this.imageSource.tiling;\n }\n constructor(e = {}) {\n const {\n pixelSize: t = null,\n center: s = !1,\n useRecommendedSettings: n = !0,\n imageSource: i = null\n } = e;\n this.priority = -10, this.tiles = null, this.imageSource = i, this.pixelSize = t, this.center = s, this.useRecommendedSettings = n, t !== null && console.warn('ImageFormatPlugin: \"pixelSize\" has been deprecated in favor of scaling the tiles root.');\n }\n // Plugin functions\n init(e) {\n this.useRecommendedSettings && (e.errorTarget = 1), this.tiles = e, this.imageSource.fetchOptions = e.fetchOptions, this.imageSource.fetchData = (t, s) => (e.invokeAllPlugins((n) => t = n.preprocessURL ? n.preprocessURL(t, null) : t), e.invokeOnePlugin((n) => n !== this && n.fetchData && n.fetchData(t, s)));\n }\n async loadRootTileset() {\n const { tiles: e, imageSource: t } = this;\n return t.url = t.url || e.rootURL, e.invokeAllPlugins((s) => t.url = s.preprocessURL ? s.preprocessURL(t.url, null) : t.url), await t.init(), e.rootURL = t.url, this.getTileset(t.url);\n }\n async parseToMesh(e, t, s, n, i) {\n if (i.aborted)\n return null;\n const { imageSource: r } = this, o = t[ye], l = t[xe], c = t[ae], u = await r.processBufferToTexture(e);\n if (i.aborted)\n return u.dispose(), u.image.close(), null;\n r.setData(o, l, c, u);\n let h = 1, d = 1, m = 0, f = 0, p = 0;\n const g = t.boundingVolume.box;\n g && ([m, f, p] = g, h = g[3], d = g[7]);\n const y = new Js(2 * h, 2 * d), x = new Be(y, new Se({ map: u, transparent: !0 }));\n x.position.set(m, f, p);\n const T = r.tiling.getTileContentUVBounds(o, l, c), { uv: M } = y.attributes;\n for (let _ = 0; _ < M.count; _++)\n fe.fromBufferAttribute(M, _), fe.x = b.mapLinear(fe.x, 0, 1, T[0], T[2]), fe.y = b.mapLinear(fe.y, 0, 1, T[1], T[3]), M.setXY(_, fe.x, fe.y);\n return x;\n }\n preprocessNode(e) {\n const { tiling: t } = this, s = t.maxLevel;\n e[ae] < s && e.parent !== null && this.expandChildren(e);\n }\n disposeTile(e) {\n const t = e[ye], s = e[xe], n = e[ae], { imageSource: i } = this;\n i.has(t, s, n) && i.release(t, s, n);\n }\n // Local functions\n getTileset(e) {\n const { tiling: t, tiles: s } = this, n = t.minLevel, { tileCountX: i, tileCountY: r } = t.getLevel(n), o = [];\n for (let c = 0; c < i; c++)\n for (let u = 0; u < r; u++) {\n const h = this.createChild(c, u, n);\n h !== null && o.push(h);\n }\n const l = {\n asset: {\n version: \"1.1\"\n },\n geometricError: 1e5,\n root: {\n refine: \"REPLACE\",\n geometricError: 1e5,\n boundingVolume: this.createBoundingVolume(0, 0, -1),\n children: o,\n [ae]: -1,\n [ye]: 0,\n [xe]: 0\n }\n };\n return s.preprocessTileset(l, e), l;\n }\n getUrl(e, t, s) {\n return this.imageSource.getUrl(e, t, s);\n }\n createBoundingVolume(e, t, s) {\n const { center: n, pixelSize: i, tiling: r } = this, { pixelWidth: o, pixelHeight: l } = r.getLevel(r.maxLevel), [c, u, h, d] = s === -1 ? r.getContentBounds(!0) : r.getTileBounds(e, t, s, !0);\n let m = (h - c) / 2, f = (d - u) / 2, p = c + m, g = u + f;\n return n && (p -= 0.5, g -= 0.5), i ? (p *= o * i, m *= o * i, g *= l * i, f *= l * i) : (p *= r.aspectRatio, m *= r.aspectRatio), {\n box: [\n // center\n p,\n g,\n 0,\n // x, y, z half vectors\n m,\n 0,\n 0,\n 0,\n f,\n 0,\n 0,\n 0,\n 0\n ]\n };\n }\n createChild(e, t, s) {\n const { pixelSize: n, tiling: i } = this;\n if (!i.getTileExists(e, t, s))\n return null;\n const { pixelWidth: r, pixelHeight: o } = i.getLevel(s);\n let l = Math.max(i.aspectRatio / r, 1 / o);\n if (n) {\n const c = i.getLevel(i.maxLevel);\n l *= n * Math.max(c.pixelWidth, c.pixelHeight);\n }\n return {\n refine: \"REPLACE\",\n geometricError: l,\n boundingVolume: this.createBoundingVolume(e, t, s),\n content: {\n uri: this.getUrl(e, t, s)\n },\n children: [],\n // save the tile params so we can expand later\n [ye]: e,\n [xe]: t,\n [ae]: s\n };\n }\n expandChildren(e) {\n const t = e[ae], s = e[ye], n = e[xe], { tileSplitX: i, tileSplitY: r } = this.tiling.getLevel(t);\n for (let o = 0; o < i; o++)\n for (let l = 0; l < r; l++) {\n const c = this.createChild(i * s + o, r * n + l, t + 1);\n c && e.children.push(c);\n }\n }\n}\nconst ft = /* @__PURE__ */ new E(), Ge = /* @__PURE__ */ new E();\nfunction _i(a, e, t) {\n const n = t + 1e-5;\n let i = e + 1e-5;\n Math.abs(i) > Math.PI / 2 && (i = i - 1e-5), a.getCartographicToPosition(e, t, 0, ft), a.getCartographicToPosition(i, t, 0, Ge);\n const r = ft.distanceTo(Ge) / 1e-5;\n return a.getCartographicToPosition(e, n, 0, Ge), [ft.distanceTo(Ge) / 1e-5, r];\n}\nconst Si = 30, Mi = 15, mt = /* @__PURE__ */ new E(), ns = /* @__PURE__ */ new E(), ie = /* @__PURE__ */ new Y(), gt = /* @__PURE__ */ new de();\nclass ut extends pn {\n get projection() {\n return this.tiling.projection;\n }\n constructor(e = {}) {\n const {\n shape: t = \"planar\",\n endCaps: s = !0,\n ...n\n } = e;\n super(n), this.shape = t, this.endCaps = s;\n }\n // override the parse to mesh logic to support a region mesh\n async parseToMesh(e, t, ...s) {\n const n = await super.parseToMesh(e, t, ...s), { shape: i, projection: r, tiles: o, tiling: l } = this;\n if (i === \"ellipsoid\") {\n const c = o.ellipsoid, u = t[ae], h = t[ye], d = t[xe], [m, f, p, g] = t.boundingVolume.region, y = Math.ceil((g - f) * b.RAD2DEG * 0.25), x = Math.ceil((p - m) * b.RAD2DEG * 0.25), S = Math.max(Mi, y), T = Math.max(Si, x), M = new Js(1, 1, T, S), [_, C, v, P] = l.getTileBounds(h, d, u, !0, !0), R = l.getTileContentUVBounds(h, d, u), { position: V, normal: k, uv: W } = M.attributes, $ = V.count;\n t.engineData.boundingVolume.getSphere(gt);\n for (let H = 0; H < $; H++) {\n mt.fromBufferAttribute(V, H), ie.fromBufferAttribute(W, H);\n const I = r.convertNormalizedToLongitude(b.mapLinear(ie.x, 0, 1, _, v));\n let A = r.convertNormalizedToLatitude(b.mapLinear(ie.y, 0, 1, C, P));\n if (r.isMercator && this.endCaps && (P === 1 && ie.y === 1 && (A = Math.PI / 2), C === 0 && ie.y === 0 && (A = -Math.PI / 2)), r.isMercator && ie.y !== 0 && ie.y !== 1) {\n const L = r.convertNormalizedToLatitude(1), N = 1 / S, Q = b.mapLinear(ie.y - N, 0, 1, f, g), F = b.mapLinear(ie.y + N, 0, 1, f, g);\n A > L && Q < L && (A = L), A < -L && F > -L && (A = -L);\n }\n c.getCartographicToPosition(A, I, 0, mt).sub(gt.center), c.getCartographicToNormal(A, I, ns);\n const D = b.mapLinear(r.convertLongitudeToNormalized(I), _, v, R[0], R[2]), O = b.mapLinear(r.convertLatitudeToNormalized(A), C, P, R[1], R[3]);\n W.setXY(H, D, O), V.setXYZ(H, ...mt), k.setXYZ(H, ...ns);\n }\n n.geometry = M, n.position.copy(gt.center);\n }\n return n;\n }\n createBoundingVolume(e, t, s) {\n if (this.shape === \"ellipsoid\") {\n const { tiling: n, endCaps: i } = this, r = s === -1, o = r ? n.getContentBounds(!0) : n.getTileBounds(e, t, s, !0, !0), l = r ? n.getContentBounds() : n.getTileBounds(e, t, s, !1, !0);\n return i && (o[3] === 1 && (l[3] = Math.PI / 2), o[1] === 0 && (l[1] = -Math.PI / 2)), {\n region: [...l, -1, 1]\n };\n } else\n return super.createBoundingVolume(e, t, s);\n }\n createChild(...e) {\n const t = super.createChild(...e), { shape: s, projection: n, tiling: i } = this;\n if (t && s === \"ellipsoid\") {\n const r = t[ae], o = t[ye], l = t[xe];\n if (r === -1)\n return t.geometricError = 1e50, parent;\n const [c, u, h, d] = i.getTileBounds(o, l, r, !0), { tilePixelWidth: m, tilePixelHeight: f } = i.getLevel(r), p = (h - c) / m, g = (d - u) / f, [\n /* west */\n ,\n y,\n x,\n S\n ] = i.getTileBounds(o, l, r), T = y > 0 != S > 0 ? 0 : Math.min(Math.abs(y), Math.abs(S)), M = n.convertLatitudeToNormalized(T), _ = n.getLongitudeDerivativeAtNormalized(c), C = n.getLatitudeDerivativeAtNormalized(M), [v, P] = _i(this.tiles.ellipsoid, T, x), R = Math.max(p * _ * v, g * C * P);\n t.geometricError = R;\n }\n return t;\n }\n}\nclass re {\n get isMercator() {\n return this.scheme === \"EPSG:3857\";\n }\n constructor(e = \"EPSG:4326\") {\n this.scheme = e, this.tileCountX = 1, this.tileCountY = 1, this.setScheme(e);\n }\n setScheme(e) {\n switch (this.scheme = e, e) {\n // equirect\n case \"CRS:84\":\n case \"EPSG:4326\":\n this.tileCountX = 2, this.tileCountY = 1;\n break;\n // mercator\n case \"EPSG:3857\":\n this.tileCountX = 1, this.tileCountY = 1;\n break;\n case \"none\":\n this.tileCountX = 1, this.tileCountY = 1;\n break;\n default:\n throw new Error(`ProjectionScheme: Unknown projection scheme \"${e}\"`);\n }\n }\n convertNormalizedToLatitude(e) {\n if (this.scheme === \"none\")\n return e;\n if (this.isMercator) {\n const t = b.mapLinear(e, 0, 1, -1, 1);\n return 2 * Math.atan(Math.exp(t * Math.PI)) - Math.PI / 2;\n } else\n return b.mapLinear(e, 0, 1, -Math.PI / 2, Math.PI / 2);\n }\n convertNormalizedToLongitude(e) {\n return this.scheme === \"none\" ? e : b.mapLinear(e, 0, 1, -Math.PI, Math.PI);\n }\n convertLatitudeToNormalized(e) {\n if (this.scheme === \"none\")\n return e;\n if (this.isMercator) {\n const t = Math.log(Math.tan(Math.PI / 4 + e / 2));\n return 1 / 2 + 1 * t / (2 * Math.PI);\n } else\n return b.mapLinear(e, -Math.PI / 2, Math.PI / 2, 0, 1);\n }\n convertLongitudeToNormalized(e) {\n return this.scheme === \"none\" ? e : (e + Math.PI) / (2 * Math.PI);\n }\n getLongitudeDerivativeAtNormalized(e) {\n return this.scheme === \"none\" ? 1 : 2 * Math.PI;\n }\n getLatitudeDerivativeAtNormalized(e) {\n if (this.scheme === \"none\")\n return 1;\n {\n let s = e - 1e-5;\n return s < 0 && (s = e + 1e-5), this.isMercator ? Math.abs(this.convertNormalizedToLatitude(e) - this.convertNormalizedToLatitude(s)) / 1e-5 : Math.PI;\n }\n }\n getBounds() {\n return this.scheme === \"none\" ? [0, 0, 1, 1] : [\n this.convertNormalizedToLongitude(0),\n this.convertNormalizedToLatitude(0),\n this.convertNormalizedToLongitude(1),\n this.convertNormalizedToLatitude(1)\n ];\n }\n toNormalizedPoint(e, t) {\n const s = [e, t];\n return s[0] = this.convertLongitudeToNormalized(s[0]), s[1] = this.convertLatitudeToNormalized(s[1]), s;\n }\n toNormalizedRange(e) {\n return [\n ...this.toNormalizedPoint(e[0], e[1]),\n ...this.toNormalizedPoint(e[2], e[3])\n ];\n }\n toCartographicPoint(e, t) {\n const s = [e, t];\n return s[0] = this.convertNormalizedToLongitude(s[0]), s[1] = this.convertNormalizedToLatitude(s[1]), s;\n }\n toCartographicRange(e) {\n return [\n ...this.toCartographicPoint(e[0], e[1]),\n ...this.toCartographicPoint(e[2], e[3])\n ];\n }\n clampToBounds(e, t = !1) {\n const s = [...e];\n let n;\n t ? n = [0, 0, 1, 1] : n = this.getBounds();\n const [i, r, o, l] = n;\n return s[0] = b.clamp(s[0], i, o), s[1] = b.clamp(s[1], r, l), s[2] = b.clamp(s[2], i, o), s[3] = b.clamp(s[3], r, l), s;\n }\n}\nfunction Ae(...a) {\n return a.join(\"_\");\n}\nclass fn {\n constructor() {\n this.cache = {}, this.count = 0, this.cachedBytes = 0, this.active = 0;\n }\n // overridable\n fetchItem() {\n }\n disposeItem() {\n }\n getMemoryUsage(e) {\n return 0;\n }\n // sets the data in the cache explicitly without need to load\n setData(...e) {\n const { cache: t } = this, s = e.pop(), n = Ae(...e);\n if (n in t)\n throw new Error(`DataCache: \"${n}\" is already present.`);\n return this.cache[n] = {\n abortController: new AbortController(),\n result: s,\n count: 1,\n bytes: this.getMemoryUsage(s)\n }, this.count++, this.cachedBytes += this.cache[n].bytes, s;\n }\n // fetches the associated data if it doesn't exist and increments the lock counter\n lock(...e) {\n const { cache: t } = this, s = Ae(...e);\n if (s in t)\n t[s].count++;\n else {\n const n = new AbortController(), i = {\n abortController: n,\n result: null,\n count: 1,\n bytes: 0,\n args: e\n };\n this.active++, i.result = this.fetchItem(e, n.signal), i.result instanceof Promise ? i.result.then((r) => (i.result = r, i.bytes = this.getMemoryUsage(r), this.cachedBytes += i.bytes, r)).finally(() => {\n this.active--;\n }).catch((r) => {\n }) : (this.active--, i.bytes = this.getMemoryUsage(i.result), this.cachedBytes += i.bytes), this.cache[s] = i, this.count++;\n }\n return t[s].result;\n }\n // decrements the lock counter for the item and deletes the item if it has reached zero\n release(...e) {\n const t = Ae(...e);\n this.releaseViaFullKey(t);\n }\n // get the loaded item\n get(...e) {\n const { cache: t } = this, s = Ae(...e);\n return s in t && t[s].count > 0 ? t[s].result : null;\n }\n has(...e) {\n const { cache: t } = this;\n return Ae(...e) in t;\n }\n forEachItem(e) {\n const { cache: t } = this;\n for (const s in t) {\n const n = t[s];\n n.result instanceof Promise || e(n.result, n.args);\n }\n }\n // dispose all items\n dispose() {\n const { cache: e } = this;\n for (const t in e) {\n const { abortController: s } = e[t];\n s.abort(), this.releaseViaFullKey(t, !0);\n }\n this.cache = {};\n }\n // releases an item with an optional force flag\n releaseViaFullKey(e, t = !1) {\n const { cache: s } = this;\n if (e in s && s[e].count > 0) {\n const n = s[e];\n if (n.count--, n.count === 0 || t) {\n const i = () => {\n if (s[e] !== n)\n return;\n const { result: r, abortController: o } = n;\n o.abort(), r instanceof Promise ? r.then((l) => {\n this.disposeItem(l), this.count--, this.cachedBytes -= n.bytes;\n }).catch(() => {\n }) : (this.disposeItem(r), this.count--, this.cachedBytes -= n.bytes), delete s[e];\n };\n t ? i() : queueMicrotask(() => {\n n.count === 0 && i();\n });\n }\n return !0;\n }\n throw new Error(\"DataCache: Attempting to release key that does not exist\");\n }\n}\nfunction is(a, e) {\n const [t, s, n, i] = a, [r, o, l, c] = e;\n return !(t >= l || n <= r || s >= c || i <= o);\n}\nclass mn {\n get levelCount() {\n return this._levels.length;\n }\n get maxLevel() {\n return this.levelCount - 1;\n }\n get minLevel() {\n const e = this._levels;\n for (let t = 0; t < e.length; t++)\n if (e[t] !== null)\n return t;\n return -1;\n }\n // prioritize user-set bounds over projection bounds if present\n get contentBounds() {\n return this._contentBounds ?? this.projection.getBounds();\n }\n get aspectRatio() {\n const { pixelWidth: e, pixelHeight: t } = this.getLevel(this.maxLevel);\n return e / t;\n }\n constructor() {\n this.flipY = !1, this.pixelOverlap = 0, this._contentBounds = null, this.projection = new re(\"none\"), this._levels = [];\n }\n // build the zoom levels\n setLevel(e, t = {}) {\n const s = this._levels;\n for (; s.length < e; )\n s.push(null);\n const {\n tileSplitX: n = 2,\n tileSplitY: i = 2\n } = t, {\n tilePixelWidth: r = 256,\n tilePixelHeight: o = 256,\n tileCountX: l = n ** e,\n tileCountY: c = i ** e,\n tileBounds: u = null\n } = t, {\n pixelWidth: h = r * l,\n pixelHeight: d = o * c\n } = t;\n s[e] = {\n // The pixel resolution of each tile.\n tilePixelWidth: r,\n tilePixelHeight: o,\n // The total pixel resolution of the final image at this level. These numbers\n // may not be a round multiple of the tile width.\n pixelWidth: h,\n pixelHeight: d,\n // Or the total number of tiles that can be loaded at this level.\n tileCountX: l,\n tileCountY: c,\n // The number of tiles that the tiles at this layer split in to\n tileSplitX: n,\n tileSplitY: i,\n // The bounds covered by the extent of the tiles at this loaded. The actual content covered by the overall tileset\n // may be a subset of this range (eg there may be unused space).\n tileBounds: u\n };\n }\n generateLevels(e, t, s, n = {}) {\n const {\n minLevel: i = 0,\n tilePixelWidth: r = 256,\n tilePixelHeight: o = 256\n } = n, l = e - 1, {\n pixelWidth: c = r * t * 2 ** l,\n pixelHeight: u = o * s * 2 ** l\n } = n;\n for (let h = i; h < e; h++) {\n const d = e - h - 1, m = Math.ceil(c * 2 ** -d), f = Math.ceil(u * 2 ** -d), p = Math.ceil(m / r), g = Math.ceil(f / o);\n this.setLevel(h, {\n tilePixelWidth: r,\n tilePixelHeight: o,\n pixelWidth: m,\n pixelHeight: f,\n tileCountX: p,\n tileCountY: g\n });\n }\n }\n getLevel(e) {\n return this._levels[e];\n }\n // bounds representing the contentful region of the image\n setContentBounds(e, t, s, n) {\n this._contentBounds = [e, t, s, n];\n }\n setProjection(e) {\n this.projection = e;\n }\n // query functions\n getTileAtPoint(e, t, s, n = !1) {\n const { flipY: i } = this, { tileCountX: r, tileCountY: o, tileBounds: l } = this.getLevel(s), c = 1 / r, u = 1 / o;\n if (n || ([e, t] = this.toNormalizedPoint(e, t)), l) {\n const m = this.toNormalizedRange(l);\n e = b.mapLinear(e, m[0], m[2], 0, 1), t = b.mapLinear(t, m[1], m[3], 0, 1);\n }\n const h = Math.floor(e / c);\n let d = Math.floor(t / u);\n return i && (d = o - 1 - d), [h, d];\n }\n getTilesInRange(e, t, s, n, i, r = !1) {\n const o = [e, t, s, n], l = this.getContentBounds(r);\n let c = this.getLevel(i).tileBounds;\n if (!is(o, l))\n return [0, 0, -1, -1];\n if (c && (r && (c = this.toNormalizedRange(c)), !is(o, l)))\n return [0, 0, -1, -1];\n const [u, h, d, m] = this.clampToContentBounds(o, r), f = this.getTileAtPoint(u, h, i, r), p = this.getTileAtPoint(d, m, i, r);\n this.flipY && ([f[1], p[1]] = [p[1], f[1]]);\n const { tileCountX: g, tileCountY: y } = this.getLevel(i), [x, S] = f, [T, M] = p;\n return T < 0 || M < 0 || x >= g || S >= y ? [0, 0, -1, -1] : [\n b.clamp(x, 0, g - 1),\n b.clamp(S, 0, y - 1),\n b.clamp(T, 0, g - 1),\n b.clamp(M, 0, y - 1)\n ];\n }\n getTileExists(e, t, s) {\n const [n, i, r, o] = this.contentBounds, [l, c, u, h] = this.getTileBounds(e, t, s);\n return !(l >= u || c >= h) && l <= r && c <= o && u >= n && h >= i;\n }\n getContentBounds(e = !1) {\n const { projection: t } = this, s = [...this.contentBounds];\n return e && (s[0] = t.convertLongitudeToNormalized(s[0]), s[1] = t.convertLatitudeToNormalized(s[1]), s[2] = t.convertLongitudeToNormalized(s[2]), s[3] = t.convertLatitudeToNormalized(s[3])), s;\n }\n // returns the UV range associated with the content in the given tile\n getTileContentUVBounds(e, t, s) {\n const [n, i, r, o] = this.getTileBounds(e, t, s, !0, !0), [l, c, u, h] = this.getTileBounds(e, t, s, !0, !1);\n return [\n b.mapLinear(n, l, u, 0, 1),\n b.mapLinear(i, c, h, 0, 1),\n b.mapLinear(r, l, u, 0, 1),\n b.mapLinear(o, c, h, 0, 1)\n ];\n }\n getTileBounds(e, t, s, n = !1, i = !0) {\n const { flipY: r, pixelOverlap: o, projection: l } = this, { tilePixelWidth: c, tilePixelHeight: u, pixelWidth: h, pixelHeight: d, tileBounds: m } = this.getLevel(s);\n let f = c * e - o, p = u * t - o, g = f + c + o * 2, y = p + u + o * 2;\n if (f = Math.max(f, 0), p = Math.max(p, 0), g = Math.min(g, h), y = Math.min(y, d), f = f / h, g = g / h, p = p / d, y = y / d, r) {\n const S = (y - p) / 2, M = 1 - (p + y) / 2;\n p = M - S, y = M + S;\n }\n let x = [f, p, g, y];\n if (m) {\n const S = this.toNormalizedRange(m);\n x[0] = b.mapLinear(x[0], 0, 1, S[0], S[2]), x[2] = b.mapLinear(x[2], 0, 1, S[0], S[2]), x[1] = b.mapLinear(x[1], 0, 1, S[1], S[3]), x[3] = b.mapLinear(x[3], 0, 1, S[1], S[3]);\n }\n return i && (x = this.clampToBounds(x, !0)), n || (x[0] = l.convertNormalizedToLongitude(x[0]), x[1] = l.convertNormalizedToLatitude(x[1]), x[2] = l.convertNormalizedToLongitude(x[2]), x[3] = l.convertNormalizedToLatitude(x[3])), x;\n }\n toNormalizedPoint(e, t) {\n return this.projection.toNormalizedPoint(e, t);\n }\n toNormalizedRange(e) {\n return this.projection.toNormalizedRange(e);\n }\n toCartographicPoint(e, t) {\n return this.projection.toCartographicPoint(e, t);\n }\n toCartographicRange(e) {\n return this.projection.toCartographicRange(e);\n }\n clampToContentBounds(e, t = !1) {\n const s = [...e], [n, i, r, o] = this.getContentBounds(t);\n return s[0] = b.clamp(s[0], n, r), s[1] = b.clamp(s[1], i, o), s[2] = b.clamp(s[2], n, r), s[3] = b.clamp(s[3], i, o), s;\n }\n clampToBounds(e, t = !1) {\n return this.projection.clampToBounds(e, t);\n }\n}\nclass Ue extends fn {\n constructor(e = {}) {\n super();\n const {\n fetchOptions: t = {}\n } = e;\n this.tiling = new mn(), this.fetchOptions = t, this.fetchData = (...s) => fetch(...s);\n }\n // async function for initializing the tiled image set\n init() {\n }\n // helper for processing the buffer into a texture\n async processBufferToTexture(e) {\n const t = new Blob([e]), s = await createImageBitmap(t, {\n premultiplyAlpha: \"none\",\n colorSpaceConversion: \"none\",\n imageOrientation: \"flipY\"\n }), n = new Hn(s);\n return n.generateMipmaps = !1, n.colorSpace = qt, n.needsUpdate = !0, n;\n }\n getMemoryUsage(e) {\n const { format: t, type: s, image: n, generateMipmaps: i } = e, { width: r, height: o } = n, l = qn.getByteLength(r, o, t, s);\n return i ? l * 4 / 3 : l;\n }\n // fetch the item with the given key fields\n fetchItem(e, t) {\n const s = {\n ...this.fetchOptions,\n signal: t\n }, n = this.getUrl(...e);\n return this.fetchData(n, s).then((i) => i.arrayBuffer()).then((i) => this.processBufferToTexture(i));\n }\n // dispose of the item that was fetched\n disposeItem(e) {\n e.dispose(), e.image instanceof ImageBitmap && e.image.close();\n }\n getUrl(...e) {\n }\n}\nclass Ne extends Ue {\n constructor(e = {}) {\n const {\n levels: t = 20,\n tileDimension: s = 256,\n projection: n = \"EPSG:3857\",\n url: i = null,\n ...r\n } = e;\n super(r), this.tileDimension = s, this.levels = t, this.projection = n, this.url = i;\n }\n getUrl(e, t, s) {\n return this.url.replace(/{\\s*z\\s*}/gi, s).replace(/{\\s*x\\s*}/gi, e).replace(/{\\s*(y|reverseY|-\\s*y)\\s*}/gi, t);\n }\n init() {\n const { tiling: e, tileDimension: t, levels: s, url: n, projection: i } = this;\n return e.flipY = !/{\\s*reverseY|-\\s*y\\s*}/g.test(n), e.setProjection(new re(i)), e.setContentBounds(...e.projection.getBounds()), Array.isArray(s) ? s.forEach((r, o) => {\n r !== null && e.setLevel(o, {\n tilePixelWidth: t,\n tilePixelHeight: t,\n ...r\n });\n }) : e.generateLevels(s, e.projection.tileCountX, e.projection.tileCountY, {\n tilePixelWidth: t,\n tilePixelHeight: t\n }), this.url = n, Promise.resolve();\n }\n}\nclass Xt extends Ue {\n constructor(e = {}) {\n const {\n url: t = null,\n ...s\n } = e;\n super(s), this.tileSets = null, this.extension = null, this.url = t;\n }\n getUrl(e, t, s) {\n const { url: n, extension: i, tileSets: r, tiling: o } = this;\n return new URL(`${parseInt(r[s - o.minLevel].href)}/${e}/${t}.${i}`, n).toString();\n }\n init() {\n const { url: e } = this;\n return this.fetchData(new URL(\"tilemapresource.xml\", e), this.fetchOptions).then((t) => t.text()).then((t) => {\n const { tiling: s } = this, n = new DOMParser().parseFromString(t, \"text/xml\"), i = n.querySelector(\"BoundingBox\"), r = n.querySelector(\"TileFormat\"), l = [...n.querySelector(\"TileSets\").querySelectorAll(\"TileSet\")].map((y) => ({\n href: parseInt(y.getAttribute(\"href\")),\n unitsPerPixel: parseFloat(y.getAttribute(\"units-per-pixel\")),\n order: parseInt(y.getAttribute(\"order\"))\n })).sort((y, x) => y.order - x.order), c = parseFloat(i.getAttribute(\"minx\")) * b.DEG2RAD, u = parseFloat(i.getAttribute(\"maxx\")) * b.DEG2RAD, h = parseFloat(i.getAttribute(\"miny\")) * b.DEG2RAD, d = parseFloat(i.getAttribute(\"maxy\")) * b.DEG2RAD, m = parseInt(r.getAttribute(\"width\")), f = parseInt(r.getAttribute(\"height\")), p = r.getAttribute(\"extension\"), g = n.querySelector(\"SRS\").textContent;\n this.extension = p, this.url = e, this.tileSets = l, s.setProjection(new re(g)), s.setContentBounds(c, h, u, d), l.forEach(({ order: y }) => {\n s.setLevel(y, {\n tileCountX: s.projection.tileCountX * 2 ** y,\n tilePixelWidth: m,\n tilePixelHeight: f\n });\n });\n });\n }\n}\nfunction Ci(a) {\n return /(:84|:crs84)$/i.test(a);\n}\nclass gn extends Ue {\n constructor(e = {}) {\n const {\n capabilities: t = null,\n layer: s = null,\n tileMatrixSet: n = null,\n style: i = null,\n url: r = null,\n dimensions: o = {},\n ...l\n } = e;\n super(l), this.capabilities = t, this.layer = s, this.tileMatrixSet = n, this.style = i, this.dimensions = o, this.url = r;\n }\n getUrl(e, t, s) {\n return this.url.replace(/{\\s*TileMatrix\\s*}/gi, s).replace(/{\\s*TileCol\\s*}/gi, e).replace(/{\\s*TileRow\\s*}/gi, t);\n }\n init() {\n const { tiling: e, dimensions: t, capabilities: s } = this;\n let { layer: n, tileMatrixSet: i, style: r, url: o } = this;\n n ? typeof n == \"string\" && (n = s.layers.find((u) => u.identifier === n)) : n = s.layers[0], i ? typeof i == \"string\" && (i = n.tileMatrixSets.find((u) => u.identifier === i)) : i = n.tileMatrixSets[0], r || (r = n.styles.find((u) => u.isDefault).identifier), o || (o = n.resourceUrls[0].template);\n const l = i.supportedCRS, c = l.includes(\"4326\") || Ci(l) ? \"EPSG:4326\" : \"EPSG:3857\";\n e.flipY = !0, e.setProjection(new re(c)), n.boundingBox !== null ? e.setContentBounds(...n.boundingBox.bounds) : e.setContentBounds(...e.projection.getBounds()), i.tileMatrices.forEach((u, h) => {\n const { tileWidth: d, tileHeight: m, matrixWidth: f, matrixHeight: p } = u;\n e.setLevel(h, {\n tilePixelWidth: d,\n tilePixelHeight: m,\n tileCountX: f || e.projection.tileCountX * 2 ** h,\n tileCountY: p || e.projection.tileCountY * 2 ** h,\n tileBounds: u.bounds\n });\n }), o = o.replace(/{\\s*TileMatrixSet\\s*}/g, i.identifier).replace(/{\\s*Style\\s*}/g, r);\n for (const u in t)\n o = o.replace(new RegExp(`{\\\\s*${u}\\\\s*}`), t[u]);\n return n.dimensions.forEach((u) => {\n o = o.replace(new RegExp(`{\\\\s*${u.identifier}\\\\s*}`), u.defaultValue);\n }), this.url = o, Promise.resolve();\n }\n}\nclass yn extends Ue {\n // TODO: layer and styles can be arrays, comma separated lists\n constructor(e = {}) {\n const {\n url: t = null,\n layer: s = null,\n styles: n = null,\n contentBoundingBox: i = null,\n version: r = \"1.3.0\",\n crs: o = \"EPSG:4326\",\n format: l = \"image/png\",\n transparent: c = !1,\n levels: u = 18,\n tileDimension: h = 256,\n ...d\n } = e;\n super(d), this.url = t, this.layer = s, this.crs = o, this.format = l, this.tileDimension = h, this.styles = n, this.version = r, this.levels = u, this.transparent = c, this.contentBoundingBox = i;\n }\n init() {\n const { tiling: e, levels: t, tileDimension: s, contentBoundingBox: n } = this;\n return e.setProjection(new re(this.crs)), e.flipY = !0, e.generateLevels(t, e.projection.tileCountX, e.projection.tileCountY, {\n tilePixelWidth: s,\n tilePixelHeight: s\n }), n !== null ? e.setContentBounds(...n) : e.setContentBounds(...e.projection.getBounds()), Promise.resolve();\n }\n // TODO: handle this in ProjectionScheme or TilingScheme? Or Loader?\n normalizedToMercatorX(e) {\n return b.mapLinear(e, 0, 1, -20037508342789244e-9, 20037508342789244e-9);\n }\n normalizedToMercatorY(e) {\n return b.mapLinear(e, 0, 1, -20037508342789244e-9, 20037508342789244e-9);\n }\n getUrl(e, t, s) {\n const {\n tiling: n,\n layer: i,\n crs: r,\n format: o,\n tileDimension: l,\n styles: c,\n version: u,\n transparent: h\n } = this, d = u === \"1.1.1\" ? \"SRS\" : \"CRS\";\n let m;\n if (r === \"EPSG:3857\") {\n const p = n.getTileBounds(e, t, s, !0, !1), g = this.normalizedToMercatorX(p[0]), y = this.normalizedToMercatorY(p[1]), x = this.normalizedToMercatorX(p[2]), S = this.normalizedToMercatorY(p[3]);\n m = [g, y, x, S];\n } else {\n const [p, g, y, x] = n.getTileBounds(e, t, s, !1, !1).map((S) => S * b.RAD2DEG);\n r === \"EPSG:4326\" ? u === \"1.1.1\" ? m = [p, g, y, x] : m = [g, p, x, y] : m = [p, g, y, x];\n }\n const f = new URLSearchParams({\n SERVICE: \"WMS\",\n REQUEST: \"GetMap\",\n VERSION: u,\n LAYERS: i,\n [d]: r,\n BBOX: m.join(\",\"),\n WIDTH: l,\n HEIGHT: l,\n FORMAT: o,\n TRANSPARENT: h ? \"TRUE\" : \"FALSE\"\n });\n return c != null && f.set(\"STYLES\", c), new URL(\"?\" + f.toString(), this.url).toString();\n }\n}\nclass to extends ut {\n constructor(e = {}) {\n const {\n levels: t,\n tileDimension: s,\n projection: n,\n url: i,\n ...r\n } = e;\n super(r), this.name = \"XYZ_TILES_PLUGIN\", this.imageSource = new Ne({ url: i, levels: t, tileDimension: s, projection: n });\n }\n}\nclass Ai extends ut {\n constructor(e = {}) {\n const { url: t, ...s } = e;\n super(s), this.name = \"TMS_TILES_PLUGIN\", this.imageSource = new Xt({ url: t });\n }\n}\nclass so extends ut {\n constructor(e = {}) {\n const {\n capabilities: t,\n layer: s,\n tileMatrixSet: n,\n style: i,\n dimensions: r,\n ...o\n } = e;\n super(o), this.name = \"WTMS_TILES_PLUGIN\", this.imageSource = new gn({\n capabilities: t,\n layer: s,\n tileMatrixSet: n,\n style: i,\n dimensions: r\n });\n }\n}\nclass no extends ut {\n constructor(e = {}) {\n const {\n url: t,\n layer: s,\n crs: n,\n format: i,\n tileDimension: r,\n styles: o,\n version: l,\n ...c\n } = e;\n super(c), this.name = \"WMS_TILES_PLUGIN\", this.imageSource = new yn({\n url: t,\n layer: s,\n crs: n,\n format: i,\n tileDimension: r,\n styles: o,\n version: l\n });\n }\n}\nconst rs = /* @__PURE__ */ new E(), ze = /* @__PURE__ */ new jt(), U = /* @__PURE__ */ new E(), oe = /* @__PURE__ */ new E();\nclass Ii extends Fn {\n constructor(e = Wn) {\n super(), this.manager = e, this.ellipsoid = new cn(), this.skirtLength = 1e3, this.smoothSkirtNormals = !0, this.generateNormals = !0, this.solid = !1, this.minLat = -Math.PI / 2, this.maxLat = Math.PI / 2, this.minLon = -Math.PI, this.maxLon = Math.PI;\n }\n parse(e) {\n const {\n ellipsoid: t,\n solid: s,\n skirtLength: n,\n smoothSkirtNormals: i,\n generateNormals: r,\n minLat: o,\n maxLat: l,\n minLon: c,\n maxLon: u\n } = this, {\n header: h,\n indices: d,\n vertexData: m,\n edgeIndices: f,\n extensions: p\n } = super.parse(e), g = new st(), y = new Ks(), x = new Be(g, y);\n x.position.set(...h.center);\n const S = \"octvertexnormals\" in p, T = S || r, M = m.u.length, _ = [], C = [], v = [], P = [];\n let R = 0, V = 0;\n for (let I = 0; I < M; I++)\n W(I, U), $(U.x, U.y, U.z, oe), C.push(U.x, U.y), _.push(...oe);\n for (let I = 0, A = d.length; I < A; I++)\n v.push(d[I]);\n if (T)\n if (S) {\n const I = p.octvertexnormals.normals;\n for (let A = 0, D = I.length; A < D; A++)\n P.push(I[A]);\n } else {\n const I = new st(), A = d.length > 21845 ? new Uint32Array(d) : new Uint16Array(d);\n I.setIndex(new J(A, 1, !1)), I.setAttribute(\"position\", new J(new Float32Array(_), 3, !1)), I.computeVertexNormals();\n const O = I.getAttribute(\"normal\").array;\n p.octvertexnormals = { normals: O };\n for (let L = 0, N = O.length; L < N; L++)\n P.push(O[L]);\n }\n if (g.addGroup(R, d.length, V), R += d.length, V++, s) {\n const I = _.length / 3;\n for (let A = 0; A < M; A++)\n W(A, U), $(U.x, U.y, U.z, oe, -n), C.push(U.x, U.y), _.push(...oe);\n for (let A = d.length - 1; A >= 0; A--)\n v.push(d[A] + I);\n if (T) {\n const A = p.octvertexnormals.normals;\n for (let D = 0, O = A.length; D < O; D++)\n P.push(-A[D]);\n }\n g.addGroup(R, d.length, V), R += d.length, V++;\n }\n if (n > 0) {\n const {\n westIndices: I,\n eastIndices: A,\n southIndices: D,\n northIndices: O\n } = f;\n let L;\n const N = H(I);\n L = _.length / 3, C.push(...N.uv), _.push(...N.positions);\n for (let B = 0, Z = N.indices.length; B < Z; B++)\n v.push(N.indices[B] + L);\n const Q = H(A);\n L = _.length / 3, C.push(...Q.uv), _.push(...Q.positions);\n for (let B = 0, Z = Q.indices.length; B < Z; B++)\n v.push(Q.indices[B] + L);\n const F = H(D);\n L = _.length / 3, C.push(...F.uv), _.push(...F.positions);\n for (let B = 0, Z = F.indices.length; B < Z; B++)\n v.push(F.indices[B] + L);\n const G = H(O);\n L = _.length / 3, C.push(...G.uv), _.push(...G.positions);\n for (let B = 0, Z = G.indices.length; B < Z; B++)\n v.push(G.indices[B] + L);\n T && (P.push(...N.normals), P.push(...Q.normals), P.push(...F.normals), P.push(...G.normals)), g.addGroup(R, d.length, V), R += d.length, V++;\n }\n for (let I = 0, A = _.length; I < A; I += 3)\n _[I + 0] -= h.center[0], _[I + 1] -= h.center[1], _[I + 2] -= h.center[2];\n const k = _.length / 3 > 65535 ? new Uint32Array(v) : new Uint16Array(v);\n if (g.setIndex(new J(k, 1, !1)), g.setAttribute(\"position\", new J(new Float32Array(_), 3, !1)), g.setAttribute(\"uv\", new J(new Float32Array(C), 2, !1)), T && g.setAttribute(\"normal\", new J(new Float32Array(P), 3, !1)), \"watermask\" in p) {\n const { mask: I, size: A } = p.watermask, D = new Uint8Array(2 * A * A);\n for (let L = 0, N = I.length; L < N; L++) {\n const Q = I[L] === 255 ? 0 : 255;\n D[2 * L + 0] = Q, D[2 * L + 1] = Q;\n }\n const O = new Wt(D, A, A, en, tn);\n O.flipY = !0, O.minFilter = jn, O.magFilter = sn, O.needsUpdate = !0, y.roughnessMap = O;\n }\n return x.userData.minHeight = h.minHeight, x.userData.maxHeight = h.maxHeight, \"metadata\" in p && (x.userData.metadata = p.metadata.json), x;\n function W(I, A) {\n return A.x = m.u[I], A.y = m.v[I], A.z = m.height[I], A;\n }\n function $(I, A, D, O, L = 0) {\n const N = b.lerp(h.minHeight, h.maxHeight, D), Q = b.lerp(c, u, I), F = b.lerp(o, l, A);\n return t.getCartographicToPosition(F, Q, N + L, O), O;\n }\n function H(I) {\n const A = [], D = [], O = [], L = [], N = [];\n for (let G = 0, B = I.length; G < B; G++)\n W(I[G], U), A.push(U.x, U.y), O.push(U.x, U.y), $(U.x, U.y, U.z, oe), D.push(...oe), $(U.x, U.y, U.z, oe, -n), L.push(...oe);\n const Q = I.length - 1;\n for (let G = 0; G < Q; G++) {\n const B = G, Z = G + 1, pe = G + I.length, dt = G + I.length + 1;\n N.push(B, pe, Z), N.push(Z, pe, dt);\n }\n let F = null;\n if (T) {\n const G = (D.length + L.length) / 3;\n if (i) {\n F = new Array(G * 3);\n const B = p.octvertexnormals.normals, Z = F.length / 2;\n for (let pe = 0, dt = G / 2; pe < dt; pe++) {\n const pt = I[pe], Te = 3 * pe, Jt = B[3 * pt + 0], Kt = B[3 * pt + 1], es = B[3 * pt + 2];\n F[Te + 0] = Jt, F[Te + 1] = Kt, F[Te + 2] = es, F[Z + Te + 0] = Jt, F[Z + Te + 1] = Kt, F[Z + Te + 2] = es;\n }\n } else {\n F = [], ze.a.fromArray(D, 0), ze.b.fromArray(L, 0), ze.c.fromArray(D, 3), ze.getNormal(rs);\n for (let B = 0; B < G; B++)\n F.push(...rs);\n }\n }\n return {\n uv: [...A, ...O],\n positions: [...D, ...L],\n indices: N,\n normals: F\n };\n }\n }\n}\nconst z = 0, ce = [\"a\", \"b\", \"c\"], w = /* @__PURE__ */ new Oe(), os = /* @__PURE__ */ new Oe(), as = /* @__PURE__ */ new Oe(), ls = /* @__PURE__ */ new Oe();\nclass xn {\n constructor() {\n this.attributeList = null, this.splitOperations = [], this.trianglePool = new vi();\n }\n forEachSplitPermutation(e) {\n const { splitOperations: t } = this, s = (n = 0) => {\n if (n >= t.length) {\n e();\n return;\n }\n t[n].keepPositive = !0, s(n + 1), t[n].keepPositive = !1, s(n + 1);\n };\n s();\n }\n // Takes an operation that returns a value for the given vertex passed to the callback. Triangles\n // are clipped along edges where the interpolated value is equal to 0. The polygons on the positive\n // side of the operation are kept if \"keepPositive\" is true.\n // callback( geometry, i0, i1, i2, barycoord );\n addSplitOperation(e, t = !0) {\n this.splitOperations.push({\n callback: e,\n keepPositive: t\n });\n }\n // Removes all split operations\n clearSplitOperations() {\n this.splitOperations.length = 0;\n }\n // clips an object hierarchy\n clipObject(e) {\n const t = e.clone(), s = [];\n return t.traverse((n) => {\n n.isMesh && (n.geometry = this.clip(n).geometry, (n.geometry.index ? n.geometry.index.count / 3 : n.attributes.position.count / 3) === 0 && s.push(n));\n }), s.forEach((n) => {\n n.removeFromParent();\n }), t;\n }\n // Returns a new mesh that has been clipped by the split operations. Range indicates the range of\n // elements to include when clipping.\n clip(e, t = null) {\n const s = this.getClippedData(e, t);\n return this.constructMesh(s.attributes, s.index, e);\n }\n // Appends the clip operation data to the given \"target\" object so multiple ranges can be appended.\n // The \"target\" object is returned with an \"index\" field, \"vertexIsClipped\" field, and series of arrays\n // in \"attributes\".\n // attributes - set of attribute arrays\n // index - triangle indices referencing vertices in attributes\n // vertexIsClipped - array indicating whether a vertex is on a clipped edge\n getClippedData(e, t = null, s = {}) {\n const { trianglePool: n, splitOperations: i, attributeList: r } = this, o = e.geometry, l = o.attributes.position, c = o.index;\n let u = 0;\n const h = {};\n s.index = s.index || [], s.vertexIsClipped = s.vertexIsClipped || [], s.attributes = s.attributes || {};\n for (const p in o.attributes) {\n if (r !== null) {\n if (r instanceof Function && !r(p))\n continue;\n if (Array.isArray(r) && !r.includes(p))\n continue;\n }\n s.attributes[p] = [];\n }\n let d = 0, m = c ? c.count : l.count;\n t !== null && (d = t.start, m = t.count);\n for (let p = d, g = d + m; p < g; p += 3) {\n let y = p + 0, x = p + 1, S = p + 2;\n c && (y = c.getX(y), x = c.getX(x), S = c.getX(S));\n const T = n.get();\n T.initFromIndices(y, x, S);\n let M = [T];\n for (let _ = 0; _ < i.length; _++) {\n const { keepPositive: C, callback: v } = i[_], P = [];\n for (let R = 0; R < M.length; R++) {\n const V = M[R], { indices: k, barycoord: W } = V;\n V.clipValues.a = v(o, k.a, k.b, k.c, W.a, e.matrixWorld), V.clipValues.b = v(o, k.a, k.b, k.c, W.b, e.matrixWorld), V.clipValues.c = v(o, k.a, k.b, k.c, W.c, e.matrixWorld), this.splitTriangle(V, !C, P);\n }\n M = P;\n }\n for (let _ = 0, C = M.length; _ < C; _++) {\n const v = M[_];\n f(v, o);\n }\n n.reset();\n }\n return s;\n function f(p, g) {\n for (let y = 0; y < 3; y++) {\n const x = p.getVertexHash(y, g);\n x in h || (h[x] = u, u++, p.getVertexData(y, g, s.attributes), s.vertexIsClipped.push(p.clipValues[ce[y]] === z));\n const S = h[x];\n s.index.push(S);\n }\n }\n }\n // Takes the set of resultant data and constructs a mesh\n constructMesh(e, t, s) {\n const n = s.geometry, i = new st(), r = e.position.length / 3 > 65535 ? new Uint32Array(t) : new Uint16Array(t);\n i.setIndex(new J(r, 1, !1));\n for (const l in e) {\n const c = n.getAttribute(l), u = new c.array.constructor(e[l]), h = new J(u, c.itemSize, c.normalized);\n h.gpuType = c.gpuType, i.setAttribute(l, h);\n }\n const o = new Be(i, s.material.clone());\n return o.position.copy(s.position), o.quaternion.copy(s.quaternion), o.scale.copy(s.scale), o;\n }\n // Splits the given triangle\n splitTriangle(e, t, s) {\n const { trianglePool: n } = this, i = [], r = [], o = [];\n for (let l = 0; l < 3; l++) {\n const c = ce[l], u = ce[(l + 1) % 3], h = e.clipValues[c], d = e.clipValues[u];\n (h < z != d < z || h === z) && (i.push(l), r.push([c, u]), h === d ? o.push(0) : o.push(b.mapLinear(z, h, d, 0, 1)));\n }\n if (i.length !== 2)\n Math.min(\n e.clipValues.a,\n e.clipValues.b,\n e.clipValues.c\n ) < z === t && s.push(e);\n else if (i.length === 2) {\n const l = n.get().initFromTriangle(e), c = n.get().initFromTriangle(e), u = n.get().initFromTriangle(e);\n (i[0] + 1) % 3 === i[1] ? (l.lerpVertexFromEdge(e, r[0][0], r[0][1], o[0], \"a\"), l.copyVertex(e, r[0][1], \"b\"), l.lerpVertexFromEdge(e, r[1][0], r[1][1], o[1], \"c\"), l.clipValues.a = z, l.clipValues.c = z, c.lerpVertexFromEdge(e, r[0][0], r[0][1], o[0], \"a\"), c.copyVertex(e, r[1][1], \"b\"), c.copyVertex(e, r[0][0], \"c\"), c.clipValues.a = z, u.lerpVertexFromEdge(e, r[0][0], r[0][1], o[0], \"a\"), u.lerpVertexFromEdge(e, r[1][0], r[1][1], o[1], \"b\"), u.copyVertex(e, r[1][1], \"c\"), u.clipValues.a = z, u.clipValues.b = z) : (l.lerpVertexFromEdge(e, r[0][0], r[0][1], o[0], \"a\"), l.lerpVertexFromEdge(e, r[1][0], r[1][1], o[1], \"b\"), l.copyVertex(e, r[0][0], \"c\"), l.clipValues.a = z, l.clipValues.b = z, c.lerpVertexFromEdge(e, r[0][0], r[0][1], o[0], \"a\"), c.copyVertex(e, r[0][1], \"b\"), c.lerpVertexFromEdge(e, r[1][0], r[1][1], o[1], \"c\"), c.clipValues.a = z, c.clipValues.c = z, u.copyVertex(e, r[0][1], \"a\"), u.copyVertex(e, r[1][0], \"b\"), u.lerpVertexFromEdge(e, r[1][0], r[1][1], o[1], \"c\"), u.clipValues.c = z);\n let d, m;\n d = Math.min(l.clipValues.a, l.clipValues.b, l.clipValues.c), m = d < z, m === t && s.push(l), d = Math.min(c.clipValues.a, c.clipValues.b, c.clipValues.c), m = d < z, m === t && s.push(c), d = Math.min(u.clipValues.a, u.clipValues.b, u.clipValues.c), m = d < z, m === t && s.push(u);\n }\n }\n}\nclass vi {\n constructor() {\n this.pool = [], this.index = 0;\n }\n get() {\n if (this.index >= this.pool.length) {\n const t = new Li();\n this.pool.push(t);\n }\n const e = this.pool[this.index];\n return this.index++, e;\n }\n reset() {\n this.index = 0;\n }\n}\nclass Li {\n constructor() {\n this.indices = {\n a: -1,\n b: -1,\n c: -1\n }, this.clipValues = {\n a: -1,\n b: -1,\n c: -1\n }, this.barycoord = new jt();\n }\n // returns a hash for the given [0, 2] index based on attributes of the referenced geometry\n getVertexHash(e, t) {\n const { barycoord: s, indices: n } = this, i = ce[e], r = s[i];\n if (r.x === 1)\n return n[ce[0]];\n if (r.y === 1)\n return n[ce[1]];\n if (r.z === 1)\n return n[ce[2]];\n {\n const { attributes: o } = t;\n let l = \"\";\n for (const c in o) {\n const u = o[c];\n switch (cs(u, n.a, n.b, n.c, r, w), (c === \"normal\" || c === \"tangent\" || c === \"bitangent\") && w.normalize(), u.itemSize) {\n case 4:\n l += we(w.x, w.y, w.z, w.w);\n break;\n case 3:\n l += we(w.x, w.y, w.z);\n break;\n case 2:\n l += we(w.x, w.y);\n break;\n case 1:\n l += we(w.x);\n break;\n }\n l += \"|\";\n }\n return l;\n }\n }\n // Accumulate the vertex data in the given attribute arrays\n getVertexData(e, t, s) {\n const { barycoord: n, indices: i } = this, r = ce[e], o = n[r], { attributes: l } = t;\n for (const c in l) {\n if (!s[c])\n continue;\n const u = l[c], h = s[c];\n switch (cs(u, i.a, i.b, i.c, o, w), (c === \"normal\" || c === \"tangent\" || c === \"bitangent\") && w.normalize(), u.itemSize) {\n case 4:\n h.push(w.x, w.y, w.z, w.w);\n break;\n case 3:\n h.push(w.x, w.y, w.z);\n break;\n case 2:\n h.push(w.x, w.y);\n break;\n case 1:\n h.push(w.x);\n break;\n }\n }\n }\n // Copy the indices from a target triangle\n initFromTriangle(e) {\n return this.initFromIndices(\n e.indices.a,\n e.indices.b,\n e.indices.c\n );\n }\n // Set the indices for the given\n initFromIndices(e, t, s) {\n return this.indices.a = e, this.indices.b = t, this.indices.c = s, this.clipValues.a = -1, this.clipValues.b = -1, this.clipValues.c = -1, this.barycoord.a.set(1, 0, 0), this.barycoord.b.set(0, 1, 0), this.barycoord.c.set(0, 0, 1), this;\n }\n // Lerp the given vertex along to the provided edge of the provided triangle\n lerpVertexFromEdge(e, t, s, n, i) {\n this.clipValues[i] = b.lerp(e.clipValues[t], e.clipValues[s], n), this.barycoord[i].lerpVectors(e.barycoord[t], e.barycoord[s], n);\n }\n // Copy a vertex from the provided triangle\n copyVertex(e, t, s) {\n this.clipValues[s] = e.clipValues[t], this.barycoord[s].copy(e.barycoord[t]);\n }\n}\nfunction cs(a, e, t, s, n, i) {\n switch (os.fromBufferAttribute(a, e), as.fromBufferAttribute(a, t), ls.fromBufferAttribute(a, s), i.set(0, 0, 0, 0).addScaledVector(os, n.x).addScaledVector(as, n.y).addScaledVector(ls, n.z), a.itemSize) {\n case 3:\n w.w = 0;\n break;\n case 2:\n w.w = 0, w.z = 0;\n break;\n case 1:\n w.w = 0, w.z = 0, w.y = 0;\n break;\n }\n return i;\n}\nfunction we(...a) {\n let s = \"\";\n for (let n = 0, i = a.length; n < i; n++)\n s += ~~(a[n] * 1e5 + 0.5), n !== i - 1 && (s += \"_\");\n return s;\n}\nconst us = {}, Ei = /* @__PURE__ */ new E(), yt = /* @__PURE__ */ new E(), xt = /* @__PURE__ */ new E(), wi = /* @__PURE__ */ new E(), Pi = /* @__PURE__ */ new E(), X = /* @__PURE__ */ new E(), be = /* @__PURE__ */ new E(), j = /* @__PURE__ */ new Y(), le = /* @__PURE__ */ new Y(), hs = /* @__PURE__ */ new Y();\nclass Ri extends xn {\n constructor() {\n super(), this.ellipsoid = new cn(), this.skirtLength = 1e3, this.smoothSkirtNormals = !0, this.solid = !1, this.minLat = -Math.PI / 2, this.maxLat = Math.PI / 2, this.minLon = -Math.PI, this.maxLon = Math.PI, this.attributeList = [\"position\", \"normal\", \"uv\"];\n }\n clipToQuadrant(e, t, s) {\n const { solid: n, skirtLength: i, ellipsoid: r, smoothSkirtNormals: o } = this;\n this.clearSplitOperations(), this.addSplitOperation(ds(\"x\"), !t), this.addSplitOperation(ds(\"y\"), !s);\n let l, c;\n const u = e.geometry.groups[0], h = this.getClippedData(e, u);\n if (this.adjustVertices(h, e.position, 0), n) {\n l = {\n index: h.index.slice().reverse(),\n attributes: {}\n };\n for (const M in h.attributes)\n l.attributes[M] = h.attributes[M].slice();\n const T = l.attributes.normal;\n if (T)\n for (let M = 0; M < T.length; M += 3)\n T[M + 0] *= -1, T[M + 1] *= -1, T[M + 2] *= -1;\n this.adjustVertices(l, e.position, -i);\n }\n if (i > 0) {\n c = {\n index: [],\n attributes: {\n position: [],\n normal: [],\n uv: []\n }\n };\n let T = 0;\n const M = {}, _ = (k, W, $) => {\n const H = we(...k, ...$, ...W);\n H in M || (M[H] = T, T++, c.attributes.position.push(...k), c.attributes.normal.push(...$), c.attributes.uv.push(...W)), c.index.push(M[H]);\n }, C = h.index, v = h.attributes.uv, P = h.attributes.position, R = h.attributes.normal, V = h.index.length / 3;\n for (let k = 0; k < V; k++) {\n const W = 3 * k;\n for (let $ = 0; $ < 3; $++) {\n const H = ($ + 1) % 3, I = C[W + $], A = C[W + H];\n if (j.fromArray(v, I * 2), le.fromArray(v, A * 2), j.x === le.x && (j.x === 0 || j.x === 0.5 || j.x === 1) || j.y === le.y && (j.y === 0 || j.y === 0.5 || j.y === 1)) {\n yt.fromArray(P, I * 3), xt.fromArray(P, A * 3);\n const D = yt, O = xt, L = wi.copy(yt), N = Pi.copy(xt);\n X.copy(L).add(e.position), r.getPositionToNormal(X, X), L.addScaledVector(X, -i), X.copy(N).add(e.position), r.getPositionToNormal(X, X), N.addScaledVector(X, -i), o && R ? (X.fromArray(R, I * 3), be.fromArray(R, A * 3)) : (X.subVectors(D, O), be.subVectors(D, L).cross(X).normalize(), X.copy(be)), _(O, le, be), _(D, j, X), _(L, j, X), _(O, le, be), _(L, j, X), _(N, le, be);\n }\n }\n }\n }\n const d = h.index.length, m = h;\n if (l) {\n const { index: T, attributes: M } = l, _ = m.attributes.position.length / 3;\n for (let C = 0, v = T.length; C < v; C++)\n m.index.push(T[C] + _);\n for (const C in h.attributes)\n m.attributes[C].push(...M[C]);\n }\n if (c) {\n const { index: T, attributes: M } = c, _ = m.attributes.position.length / 3;\n for (let C = 0, v = T.length; C < v; C++)\n m.index.push(T[C] + _);\n for (const C in h.attributes)\n m.attributes[C].push(...M[C]);\n }\n const f = t ? 0 : -0.5, p = s ? 0 : -0.5, g = m.attributes.uv;\n for (let T = 0, M = g.length; T < M; T += 2)\n g[T] = (g[T] + f) * 2, g[T + 1] = (g[T + 1] + p) * 2;\n const y = this.constructMesh(m.attributes, m.index, e);\n y.userData.minHeight = e.userData.minHeight, y.userData.maxHeight = e.userData.maxHeight;\n let x = 0, S = 0;\n return y.geometry.addGroup(S, d, x), S += d, x++, l && (y.geometry.addGroup(S, l.index.length, x), S += l.index.length, x++), c && (y.geometry.addGroup(S, c.index.length, x), S += c.index.length, x++), y;\n }\n adjustVertices(e, t, s) {\n const { ellipsoid: n, minLat: i, maxLat: r, minLon: o, maxLon: l } = this, { attributes: c, vertexIsClipped: u } = e, h = c.position, d = c.uv, m = h.length / 3;\n for (let f = 0; f < m; f++) {\n const p = j.fromArray(d, f * 2);\n u && u[f] && (Math.abs(p.x - 0.5) < 1e-10 && (p.x = 0.5), Math.abs(p.y - 0.5) < 1e-10 && (p.y = 0.5), j.toArray(d, f * 2));\n const g = b.lerp(i, r, p.y), y = b.lerp(o, l, p.x), x = Ei.fromArray(h, f * 3).add(t);\n n.getPositionToCartographic(x, us), n.getCartographicToPosition(g, y, us.height + s, x), x.sub(t), x.toArray(h, f * 3);\n }\n }\n}\nfunction ds(a) {\n return (e, t, s, n, i) => {\n const r = e.attributes.uv;\n return j.fromBufferAttribute(r, t), le.fromBufferAttribute(r, s), hs.fromBufferAttribute(r, n), j[a] * i.x + le[a] * i.y + hs[a] * i.z - 0.5;\n };\n}\nconst ps = Symbol(\"TILE_X\"), fs = Symbol(\"TILE_Y\"), Pe = Symbol(\"TILE_LEVEL\"), me = Symbol(\"TILE_AVAILABLE\"), He = 1e4, ms = /* @__PURE__ */ new E();\nfunction Di(a, e, t, s) {\n if (a && e < a.length) {\n const n = a[e];\n for (let i = 0, r = n.length; i < r; i++) {\n const { startX: o, startY: l, endX: c, endY: u } = n[i];\n if (t >= o && t <= c && s >= l && s <= u)\n return !0;\n }\n }\n return !1;\n}\nfunction Tn(a) {\n const { available: e = null, maxzoom: t = null } = a;\n return t === null ? e.length - 1 : t;\n}\nfunction Bi(a) {\n const { metadataAvailability: e = -1 } = a;\n return e;\n}\nfunction Tt(a, e) {\n const t = a[Pe], s = Bi(e), n = Tn(e);\n return t < n && s !== -1 && t % s === 0;\n}\nfunction Oi(a, e, t, s, n) {\n return n.tiles[0].replace(/{\\s*z\\s*}/g, t).replace(/{\\s*x\\s*}/g, a).replace(/{\\s*y\\s*}/g, e).replace(/{\\s*version\\s*}/g, s);\n}\nclass Ui {\n constructor(e = {}) {\n const {\n useRecommendedSettings: t = !0,\n skirtLength: s = null,\n smoothSkirtNormals: n = !0,\n generateNormals: i = !0,\n solid: r = !1\n } = e;\n this.name = \"QUANTIZED_MESH_PLUGIN\", this.priority = -1e3, this.tiles = null, this.layer = null, this.useRecommendedSettings = t, this.skirtLength = s, this.smoothSkirtNormals = n, this.solid = r, this.generateNormals = i, this.attribution = null, this.tiling = new mn(), this.projection = new re();\n }\n // Plugin function\n init(e) {\n e.fetchOptions.headers = e.fetchOptions.headers || {}, e.fetchOptions.headers.Accept = \"application/vnd.quantized-mesh,application/octet-stream;q=0.9\", this.useRecommendedSettings && (e.errorTarget = 2), this.tiles = e;\n }\n loadRootTileset() {\n const { tiles: e } = this;\n let t = new URL(\"layer.json\", new URL(e.rootURL, location.href));\n return e.invokeAllPlugins((s) => t = s.preprocessURL ? s.preprocessURL(t, null) : t), e.invokeOnePlugin((s) => s.fetchData && s.fetchData(t, this.tiles.fetchOptions)).then((s) => s.json()).then((s) => {\n this.layer = s;\n const {\n projection: n = \"EPSG:4326\",\n extensions: i = [],\n attribution: r = \"\",\n available: o = null\n } = s, {\n tiling: l,\n tiles: c,\n projection: u\n } = this;\n r && (this.attribution = {\n value: r,\n type: \"string\",\n collapsible: !0\n }), i.length > 0 && (c.fetchOptions.headers.Accept += `;extensions=${i.join(\"-\")}`), u.setScheme(n);\n const { tileCountX: h, tileCountY: d } = u;\n l.setProjection(u), l.generateLevels(Tn(s) + 1, h, d);\n const m = [];\n for (let g = 0; g < h; g++) {\n const y = this.createChild(0, g, 0, o);\n y && m.push(y);\n }\n const f = {\n asset: {\n version: \"1.1\"\n },\n geometricError: 1 / 0,\n root: {\n refine: \"REPLACE\",\n geometricError: 1 / 0,\n boundingVolume: {\n region: [...this.tiling.getContentBounds(), -He, He]\n },\n children: m,\n [me]: o,\n [Pe]: -1\n }\n };\n let p = c.rootURL;\n return c.invokeAllPlugins((g) => p = g.preprocessURL ? g.preprocessURL(p, null) : p), c.preprocessTileset(f, p), f;\n });\n }\n parseToMesh(e, t, s, n) {\n const {\n skirtLength: i,\n solid: r,\n smoothSkirtNormals: o,\n generateNormals: l,\n tiles: c\n } = this, u = c.ellipsoid;\n let h;\n if (s === \"quantized_tile_split\") {\n const p = new URL(n).searchParams, g = p.get(\"left\") === \"true\", y = p.get(\"bottom\") === \"true\", x = new Ri();\n x.ellipsoid.copy(u), x.solid = r, x.smoothSkirtNormals = o, x.skirtLength = i === null ? t.geometricError : i;\n const [S, T, M, _] = t.parent.boundingVolume.region;\n x.minLat = T, x.maxLat = _, x.minLon = S, x.maxLon = M, h = x.clipToQuadrant(t.parent.engineData.scene, g, y);\n } else if (s === \"terrain\") {\n const p = new Ii(c.manager);\n p.ellipsoid.copy(u), p.solid = r, p.smoothSkirtNormals = o, p.generateNormals = l, p.skirtLength = i === null ? t.geometricError : i;\n const [g, y, x, S] = t.boundingVolume.region;\n p.minLat = y, p.maxLat = S, p.minLon = g, p.maxLon = x, h = p.parse(e);\n } else\n return;\n const { minHeight: d, maxHeight: m, metadata: f } = h.userData;\n return t.boundingVolume.region[4] = d, t.boundingVolume.region[5] = m, t.engineData.boundingVolume.setRegionData(u, ...t.boundingVolume.region), f && (\"geometricerror\" in f && (t.geometricError = f.geometricerror), Tt(t, this.layer) && \"available\" in f && t.children.length === 0 && (t[me] = [\n ...new Array(t[Pe] + 1).fill(null),\n ...f.available\n ])), t.engineData.scene = h, this.expandChildren(t), h;\n }\n getAttributions(e) {\n this.attribution && e.push(this.attribution);\n }\n // Local functions\n createChild(e, t, s, n) {\n const { tiles: i, layer: r, tiling: o, projection: l } = this, c = i.ellipsoid, u = n === null && e === 0 || Di(n, e, t, s), h = Oi(t, s, e, 1, r), d = [...o.getTileBounds(t, s, e), -He, He], [\n /* west */\n ,\n m,\n /* east */\n ,\n f,\n /* minHeight */\n ,\n p\n ] = d, g = m > 0 != f > 0 ? 0 : Math.min(Math.abs(m), Math.abs(f));\n c.getCartographicToPosition(g, 0, p, ms), ms.z = 0;\n const y = l.tileCountX, T = Math.max(...c.radius) * 2 * Math.PI * 0.25 / (65 * y) / 2 ** e, M = {\n [me]: null,\n [Pe]: e,\n [ps]: t,\n [fs]: s,\n refine: \"REPLACE\",\n geometricError: T,\n boundingVolume: { region: d },\n content: u ? { uri: h } : null,\n children: []\n };\n return Tt(M, r) || (M[me] = n), M;\n }\n expandChildren(e) {\n const t = e[Pe], s = e[ps], n = e[fs], i = e[me];\n if (t >= this.tiling.maxLevel)\n return;\n let r = !1;\n for (let o = 0; o < 2; o++)\n for (let l = 0; l < 2; l++) {\n const c = this.createChild(t + 1, 2 * s + o, 2 * n + l, i);\n c.content !== null ? (e.children.push(c), r = !0) : (c.content = { uri: `tile.quantized_tile_split?bottom=${l === 0}&left=${o === 0}` }, c.internal = { isVirtual: !0 }, e.internal.virtualChildCount++, e.children.push(c));\n }\n r || (e.children.length -= e.internal.virtualChildCount, e.internal.virtualChildCount = 0);\n }\n fetchData(e, t) {\n if (/quantized_tile_split/.test(e))\n return new ArrayBuffer();\n }\n disposeTile(e) {\n const { tiles: t, layer: s } = this;\n if (Tt(e, s) && (e[me] = null), me in e) {\n const { virtualChildCount: n } = e.internal, i = e.children.length, r = i - n;\n for (let o = r; o < i; o++)\n t.processNodeQueue.remove(e.children[o]);\n e.children.length -= n, e.internal.virtualChildCount = 0;\n }\n }\n}\nlet io = class extends kn {\n constructor(e = {}) {\n super({\n assetTypeHandler: (t, s, n) => {\n t === \"TERRAIN\" && s.getPluginByName(\"QUANTIZED_MESH_PLUGIN\") === null ? (console.warn(\n 'CesiumIonAuthPlugin: CesiumIonAuthPlugin plugin auto-registration has been deprecated. Please implement a custom \"assetTypeHandler\" for \"TERRAIN\" using \"QuantizedMeshPlugin\", instead.'\n ), s.registerPlugin(new Ui({\n useRecommendedSettings: this.useRecommendedSettings\n }))) : t === \"IMAGERY\" && s.getPluginByName(\"TMS_TILES_PLUGIN\") === null ? (console.warn(\n 'CesiumIonAuthPlugin: CesiumIonAuthPlugin plugin auto-registration has been deprecated. Please implement a custom \"assetTypeHandler\" for \"IMAGERY\" using \"TMSTilesPlugin\", instead.'\n ), s.registerPlugin(new Ai({\n useRecommendedSettings: this.useRecommendedSettings,\n shape: \"ellipsoid\"\n }))) : console.warn(`CesiumIonAuthPlugin: Cesium Ion asset type \"${t}\" unhandled.`);\n },\n ...e\n }), e.__suppress_warning__ && console.warn(\n 'CesiumIonAuthPlugin: Plugin has been moved to \"3d-tiles-renderer/core/plugins\".'\n );\n }\n};\nconst bt = /* @__PURE__ */ new K();\nclass oo {\n constructor() {\n this.name = \"UPDATE_ON_CHANGE_PLUGIN\", this.tiles = null, this.needsUpdate = !1, this.cameraMatrices = /* @__PURE__ */ new Map();\n }\n init(e) {\n this.tiles = e, this._needsUpdateCallback = () => {\n this.needsUpdate = !0;\n }, this._onCameraAdd = ({ camera: t }) => {\n this.needsUpdate = !0, this.cameraMatrices.set(t, new K());\n }, this._onCameraDelete = ({ camera: t }) => {\n this.needsUpdate = !0, this.cameraMatrices.delete(t);\n }, e.addEventListener(\"needs-update\", this._needsUpdateCallback), e.addEventListener(\"add-camera\", this._onCameraAdd), e.addEventListener(\"delete-camera\", this._onCameraDelete), e.addEventListener(\"camera-resolution-change\", this._needsUpdateCallback), e.cameras.forEach((t) => {\n this._onCameraAdd({ camera: t });\n });\n }\n doTilesNeedUpdate() {\n const e = this.tiles;\n let t = !1;\n this.cameraMatrices.forEach((n, i) => {\n bt.copy(e.group.matrixWorld).premultiply(i.matrixWorldInverse).premultiply(i.projectionMatrixInverse), t = t || !bt.equals(n), n.copy(bt);\n });\n const s = this.needsUpdate;\n return this.needsUpdate = !1, s || t;\n }\n preprocessNode() {\n this.needsUpdate = !0;\n }\n dispose() {\n const e = this.tiles;\n e.removeEventListener(\"camera-resolution-change\", this._needsUpdateCallback), e.removeEventListener(\"needs-update\", this._needsUpdateCallback), e.removeEventListener(\"add-camera\", this._onCameraAdd), e.removeEventListener(\"delete-camera\", this._onCameraDelete);\n }\n}\nconst gs = /* @__PURE__ */ new E();\nfunction Ie(a, e) {\n if (a.isInterleavedBufferAttribute || a.array instanceof e)\n return a;\n const s = e === Int8Array || e === Int16Array || e === Int32Array ? -1 : 0, n = new e(a.count * a.itemSize), i = new J(n, a.itemSize, !0), r = a.itemSize, o = a.count;\n for (let l = 0; l < o; l++)\n for (let c = 0; c < r; c++) {\n const u = b.clamp(a.getComponent(l, c), s, 1);\n i.setComponent(l, c, u);\n }\n return i;\n}\nfunction Ni(a, e = Int16Array) {\n const t = a.geometry, s = t.attributes, n = s.position;\n if (n.isInterleavedBufferAttribute || n.array instanceof e)\n return n;\n const i = new e(n.count * n.itemSize), r = new J(i, n.itemSize, !1), o = n.itemSize, l = n.count;\n t.computeBoundingBox();\n const c = t.boundingBox, { min: u, max: h } = c, d = 2 ** (8 * e.BYTES_PER_ELEMENT - 1) - 1, m = -d;\n for (let f = 0; f < l; f++)\n for (let p = 0; p < o; p++) {\n const g = p === 0 ? \"x\" : p === 1 ? \"y\" : \"z\", y = u[g], x = h[g], S = b.mapLinear(\n n.getComponent(f, p),\n y,\n x,\n m,\n d\n );\n r.setComponent(f, p, S);\n }\n c.getCenter(gs).multiply(a.scale).applyQuaternion(a.quaternion), a.position.add(gs), a.scale.x *= 0.5 * (h.x - u.x) / d, a.scale.y *= 0.5 * (h.y - u.y) / d, a.scale.z *= 0.5 * (h.z - u.z) / d, s.position = r, a.geometry.boundingBox = null, a.geometry.boundingSphere = null, a.updateMatrixWorld();\n}\nclass ao {\n constructor(e) {\n this._options = {\n // whether to generate normals if they don't already exist.\n generateNormals: !1,\n // whether to disable use of mipmaps since they are typically not necessary\n // with something like 3d tiles.\n disableMipmaps: !0,\n // whether to compress certain attributes\n compressIndex: !0,\n compressNormals: !1,\n compressUvs: !1,\n compressPosition: !1,\n // the TypedArray type to use when compressing the attributes\n uvType: Int8Array,\n normalType: Int8Array,\n positionType: Int16Array,\n ...e\n }, this.name = \"TILES_COMPRESSION_PLUGIN\", this.priority = -100;\n }\n processTileModel(e, t) {\n const {\n generateNormals: s,\n disableMipmaps: n,\n compressIndex: i,\n compressUvs: r,\n compressNormals: o,\n compressPosition: l,\n uvType: c,\n normalType: u,\n positionType: h\n } = this._options;\n e.traverse((d) => {\n if (d.material && n) {\n const m = d.material;\n for (const f in m) {\n const p = m[f];\n p && p.isTexture && p.generateMipmaps && (p.generateMipmaps = !1, p.minFilter = sn);\n }\n }\n if (d.geometry) {\n const m = d.geometry, f = m.attributes;\n if (r) {\n const { uv: p, uv1: g, uv2: y, uv3: x } = f;\n p && (f.uv = Ie(p, c)), g && (f.uv1 = Ie(g, c)), y && (f.uv2 = Ie(y, c)), x && (f.uv3 = Ie(x, c));\n }\n if (s && !f.normals && m.computeVertexNormals(), o && f.normals && (f.normals = Ie(f.normals, u)), l && Ni(d, h), i && m.index) {\n const p = f.position.count, g = m.index, y = p > 65535 ? Uint32Array : p > 255 ? Uint16Array : Uint8Array;\n if (!(g.array instanceof y)) {\n const x = new y(m.index.count);\n x.set(g.array);\n const S = new J(x, 1);\n m.setIndex(S);\n }\n }\n }\n });\n }\n}\nfunction q(a, e, t) {\n return a && e in a ? a[e] : t;\n}\nfunction bn(a) {\n return a !== \"BOOLEAN\" && a !== \"STRING\" && a !== \"ENUM\";\n}\nfunction Vi(a) {\n return /^FLOAT/.test(a);\n}\nfunction Ve(a) {\n return /^VEC/.test(a);\n}\nfunction Fe(a) {\n return /^MAT/.test(a);\n}\nfunction _n(a, e, t, s = null) {\n return Fe(t) || Ve(t) ? s.fromArray(a, e) : a[e];\n}\nfunction Vt(a) {\n const { type: e, componentType: t } = a;\n switch (e) {\n case \"SCALAR\":\n return t === \"INT64\" ? 0n : 0;\n case \"VEC2\":\n return new Y();\n case \"VEC3\":\n return new E();\n case \"VEC4\":\n return new Oe();\n case \"MAT2\":\n return new Xn();\n case \"MAT3\":\n return new Yn();\n case \"MAT4\":\n return new K();\n case \"BOOLEAN\":\n return !1;\n case \"STRING\":\n return \"\";\n // the final value for enums is a string but are represented as integers\n // during intermediate steps\n case \"ENUM\":\n return 0;\n }\n}\nfunction ys(a, e) {\n if (e == null)\n return !1;\n switch (a) {\n case \"SCALAR\":\n return typeof e == \"number\" || typeof e == \"bigint\";\n case \"VEC2\":\n return e.isVector2;\n case \"VEC3\":\n return e.isVector3;\n case \"VEC4\":\n return e.isVector4;\n case \"MAT2\":\n return e.isMatrix2;\n case \"MAT3\":\n return e.isMatrix3;\n case \"MAT4\":\n return e.isMatrix4;\n case \"BOOLEAN\":\n return typeof e == \"boolean\";\n case \"STRING\":\n return typeof e == \"string\";\n case \"ENUM\":\n return typeof e == \"number\" || typeof e == \"bigint\";\n }\n throw new Error(\"ClassProperty: invalid type.\");\n}\nfunction De(a, e = null) {\n switch (a) {\n case \"INT8\":\n return Int8Array;\n case \"INT16\":\n return Int16Array;\n case \"INT32\":\n return Int32Array;\n case \"INT64\":\n return BigInt64Array;\n case \"UINT8\":\n return Uint8Array;\n case \"UINT16\":\n return Uint16Array;\n case \"UINT32\":\n return Uint32Array;\n case \"UINT64\":\n return BigUint64Array;\n case \"FLOAT32\":\n return Float32Array;\n case \"FLOAT64\":\n return Float64Array;\n }\n switch (e) {\n case \"BOOLEAN\":\n return Uint8Array;\n case \"STRING\":\n return Uint8Array;\n }\n throw new Error(\"ClassProperty: invalid type.\");\n}\nfunction Fi(a, e = null) {\n if (a.array) {\n e = e && Array.isArray(e) ? e : [], e.length = a.count;\n for (let s = 0, n = e.length; s < n; s++)\n e[s] = nt(a, e[s]);\n } else\n e = nt(a, e);\n return e;\n}\nfunction nt(a, e = null) {\n const t = a.default, s = a.type;\n if (e = e || Vt(a), t === null) {\n switch (s) {\n case \"SCALAR\":\n return 0;\n case \"VEC2\":\n return e.set(0, 0);\n case \"VEC3\":\n return e.set(0, 0, 0);\n case \"VEC4\":\n return e.set(0, 0, 0, 0);\n case \"MAT2\":\n return e.identity();\n case \"MAT3\":\n return e.identity();\n case \"MAT4\":\n return e.identity();\n case \"BOOLEAN\":\n return !1;\n case \"STRING\":\n return \"\";\n case \"ENUM\":\n return \"\";\n }\n throw new Error(\"ClassProperty: invalid type.\");\n } else if (Fe(s))\n e.fromArray(t);\n else if (Ve(s))\n e.fromArray(t);\n else\n return t;\n}\nfunction ki(a, e) {\n if (a.noData === null)\n return e;\n const t = a.noData, s = a.type;\n if (Array.isArray(e))\n for (let r = 0, o = e.length; r < o; r++)\n e[r] = n(e[r]);\n else\n e = n(e);\n return e;\n function n(r) {\n return i(r) && (r = nt(a, r)), r;\n }\n function i(r) {\n if (Fe(s)) {\n const o = r.elements;\n for (let l = 0, c = t.length; l < c; l++)\n if (t[l] !== o[l])\n return !1;\n return !0;\n } else if (Ve(s)) {\n for (let o = 0, l = t.length; o < l; o++)\n if (t[o] !== r.getComponent(o))\n return !1;\n return !0;\n } else\n return t === r;\n }\n}\nfunction Gi(a, e) {\n switch (a) {\n case \"INT8\":\n return Math.max(e / 127, -1);\n case \"INT16\":\n return Math.max(e, 32767, -1);\n case \"INT32\":\n return Math.max(e / 2147483647, -1);\n case \"INT64\":\n return Math.max(Number(e) / 9223372036854776e3, -1);\n // eslint-disable-line no-loss-of-precision\n case \"UINT8\":\n return e / 255;\n case \"UINT16\":\n return e / 65535;\n case \"UINT32\":\n return e / 4294967295;\n case \"UINT64\":\n return Number(e) / 18446744073709552e3;\n }\n}\nfunction zi(a, e) {\n const {\n type: t,\n componentType: s,\n scale: n,\n offset: i,\n normalized: r\n } = a;\n if (Array.isArray(e))\n for (let h = 0, d = e.length; h < d; h++)\n e[h] = o(e[h]);\n else\n e = o(e);\n return e;\n function o(h) {\n return Fe(t) ? h = c(h) : Ve(t) ? h = l(h) : h = u(h), h;\n }\n function l(h) {\n return h.x = u(h.x), h.y = u(h.y), \"z\" in h && (h.z = u(h.z)), \"w\" in h && (h.w = u(h.w)), h;\n }\n function c(h) {\n const d = h.elements;\n for (let m = 0, f = d.length; m < f; m++)\n d[m] = u(d[m]);\n return h;\n }\n function u(h) {\n return r && (h = Gi(s, h)), (r || Vi(s)) && (h = h * n + i), h;\n }\n}\nfunction $t(a, e, t = null) {\n if (a.array) {\n Array.isArray(e) || (e = new Array(a.count || 0)), e.length = t !== null ? t : a.count;\n for (let s = 0, n = e.length; s < n; s++)\n ys(a.type, e[s]) || (e[s] = Vt(a));\n } else\n ys(a.type, e) || (e = Vt(a));\n return e;\n}\nfunction it(a, e) {\n for (const t in e)\n t in a || delete e[t];\n for (const t in a) {\n const s = a[t];\n e[t] = $t(s, e[t]);\n }\n}\nfunction Hi(a) {\n switch (a) {\n case \"ENUM\":\n return 1;\n case \"SCALAR\":\n return 1;\n case \"VEC2\":\n return 2;\n case \"VEC3\":\n return 3;\n case \"VEC4\":\n return 4;\n case \"MAT2\":\n return 4;\n case \"MAT3\":\n return 9;\n case \"MAT4\":\n return 16;\n // unused\n case \"BOOLEAN\":\n return -1;\n case \"STRING\":\n return -1;\n default:\n return -1;\n }\n}\nclass ht {\n constructor(e, t, s = null) {\n this.name = t.name || null, this.description = t.description || null, this.type = t.type, this.componentType = t.componentType || null, this.enumType = t.enumType || null, this.array = t.array || !1, this.count = t.count || 0, this.normalized = t.normalized || !1, this.offset = t.offset || 0, this.scale = q(t, \"scale\", 1), this.max = q(t, \"max\", 1 / 0), this.min = q(t, \"min\", -1 / 0), this.required = t.required || !1, this.noData = q(t, \"noData\", null), this.default = q(t, \"default\", null), this.semantic = q(t, \"semantic\", null), this.enumSet = null, this.accessorProperty = s, s && (this.offset = q(s, \"offset\", this.offset), this.scale = q(s, \"scale\", this.scale), this.max = q(s, \"max\", this.max), this.min = q(s, \"min\", this.min)), t.type === \"ENUM\" && (this.enumSet = e[this.enumType], this.componentType === null && (this.componentType = q(this.enumSet, \"valueType\", \"UINT16\")));\n }\n // shape the given target to match the data type of the property\n // enums are set to their integer value\n shapeToProperty(e, t = null) {\n return $t(this, e, t);\n }\n // resolve the given object to the default value for the property for a single element\n // enums are set to a default string\n resolveDefaultElement(e) {\n return nt(this, e);\n }\n // resolve the target to the default value for the property for every element if it's an array\n // enums are set to a default string\n resolveDefault(e) {\n return Fi(this, e);\n }\n // converts any instances of no data to the default value\n resolveNoData(e) {\n return ki(this, e);\n }\n // converts enums integers in the given target to strings\n resolveEnumsToStrings(e) {\n const t = this.enumSet;\n if (this.type === \"ENUM\")\n if (Array.isArray(e))\n for (let n = 0, i = e.length; n < i; n++)\n e[n] = s(e[n]);\n else\n e = s(e);\n return e;\n function s(n) {\n const i = t.values.find((r) => r.value === n);\n return i === null ? \"\" : i.name;\n }\n }\n // apply scales\n adjustValueScaleOffset(e) {\n return bn(this.type) ? zi(this, e) : e;\n }\n}\nclass Qt {\n constructor(e, t = {}, s = {}, n = null) {\n this.definition = e, this.class = t[e.class], this.className = e.class, this.enums = s, this.data = n, this.name = \"name\" in e ? e.name : null, this.properties = null;\n }\n getPropertyNames() {\n return Object.keys(this.class.properties);\n }\n includesData(e) {\n return !!this.definition.properties[e];\n }\n dispose() {\n }\n _initProperties(e = ht) {\n const t = {};\n for (const s in this.class.properties)\n t[s] = new e(this.enums, this.class.properties[s], this.definition.properties[s]);\n this.properties = t;\n }\n}\nclass qi extends ht {\n constructor(e, t, s = null) {\n super(e, t, s), this.attribute = (s == null ? void 0 : s.attribute) ?? null;\n }\n}\nclass Wi extends Qt {\n constructor(...e) {\n super(...e), this.isPropertyAttributeAccessor = !0, this._initProperties(qi);\n }\n getData(e, t, s = {}) {\n const n = this.properties;\n it(n, s);\n for (const i in n)\n s[i] = this.getPropertyValue(i, e, t, s[i]);\n return s;\n }\n getPropertyValue(e, t, s, n = null) {\n if (t >= this.count)\n throw new Error(\"PropertyAttributeAccessor: Requested index is outside the range of the buffer.\");\n const i = this.properties[e], r = i.type;\n if (i) {\n if (!this.definition.properties[e])\n return i.resolveDefault(n);\n } else throw new Error(\"PropertyAttributeAccessor: Requested class property does not exist.\");\n n = i.shapeToProperty(n);\n const o = s.getAttribute(i.attribute.toLowerCase());\n if (Fe(r)) {\n const l = n.elements;\n for (let c = 0, u = l.length; c < u; c < u)\n l[c] = o.getComponent(t, c);\n } else if (Ve(r))\n n.fromBufferAttribute(o, t);\n else if (r === \"SCALAR\" || r === \"ENUM\")\n n = o.getX(t);\n else\n throw new Error(\"StructuredMetadata.PropertyAttributeAccessor: BOOLEAN and STRING types are not supported by property attributes.\");\n return n = i.adjustValueScaleOffset(n), n = i.resolveEnumsToStrings(n), n = i.resolveNoData(n), n;\n }\n}\nclass ji extends ht {\n constructor(e, t, s = null) {\n super(e, t, s), this.values = (s == null ? void 0 : s.values) ?? null, this.valueLength = Hi(this.type), this.arrayOffsets = q(s, \"arrayOffsets\", null), this.stringOffsets = q(s, \"stringOffsets\", null), this.arrayOffsetType = q(s, \"arrayOffsetType\", \"UINT32\"), this.stringOffsetType = q(s, \"stringOffsetType\", \"UINT32\");\n }\n // returns the necessary array length based on the array offsets if present\n getArrayLengthFromId(e, t) {\n let s = this.count;\n if (this.arrayOffsets !== null) {\n const { arrayOffsets: n, arrayOffsetType: i } = this, r = De(i), o = new r(e[n]);\n s = o[t + 1] - o[t];\n }\n return s;\n }\n // returns the index offset into the data buffer for the given id based on the\n // the array offsets if present\n getIndexOffsetFromId(e, t) {\n let s = t;\n if (this.arrayOffsets) {\n const { arrayOffsets: n, arrayOffsetType: i } = this, r = De(i);\n s = new r(e[n])[s];\n } else this.array && (s *= this.count);\n return s;\n }\n}\nclass Yi extends Qt {\n constructor(...e) {\n super(...e), this.isPropertyTableAccessor = !0, this.count = this.definition.count, this._initProperties(ji);\n }\n getData(e, t = {}) {\n const s = this.properties;\n it(s, t);\n for (const n in s)\n t[n] = this.getPropertyValue(n, e, t[n]);\n return t;\n }\n // reads an individual element\n _readValueAtIndex(e, t, s, n = null) {\n const i = this.properties[e], { componentType: r, type: o } = i, l = this.data, c = l[i.values], u = De(r, o), h = new u(c), d = i.getIndexOffsetFromId(l, t);\n if (bn(o) || o === \"ENUM\")\n return _n(h, (d + s) * i.valueLength, o, n);\n if (o === \"STRING\") {\n let m = d + s, f = 0;\n if (i.stringOffsets !== null) {\n const { stringOffsets: g, stringOffsetType: y } = i, x = De(y), S = new x(l[g]);\n f = S[m + 1] - S[m], m = S[m];\n }\n const p = new Uint8Array(h.buffer, m, f);\n n = new TextDecoder().decode(p);\n } else if (o === \"BOOLEAN\") {\n const m = d + s, f = Math.floor(m / 8), p = m % 8;\n n = (h[f] >> p & 1) === 1;\n }\n return n;\n }\n // Reads the data for the given table index\n getPropertyValue(e, t, s = null) {\n if (t >= this.count)\n throw new Error(\"PropertyTableAccessor: Requested index is outside the range of the table.\");\n const n = this.properties[e];\n if (n) {\n if (!this.definition.properties[e])\n return n.resolveDefault(s);\n } else throw new Error(\"PropertyTableAccessor: Requested property does not exist.\");\n const i = n.array, r = this.data, o = n.getArrayLengthFromId(r, t);\n if (s = n.shapeToProperty(s, o), i)\n for (let l = 0, c = s.length; l < c; l++)\n s[l] = this._readValueAtIndex(e, t, l, s[l]);\n else\n s = this._readValueAtIndex(e, t, 0, s);\n return s = n.adjustValueScaleOffset(s), s = n.resolveEnumsToStrings(s), s = n.resolveNoData(s), s;\n }\n}\nconst ve = /* @__PURE__ */ new ei();\nclass xs {\n constructor() {\n this._renderer = new $n(), this._target = new ts(1, 1), this._texTarget = new ts(), this._quad = new un(new Qn({\n blending: Kn,\n blendDst: Jn,\n blendSrc: Zn,\n uniforms: {\n map: { value: null },\n pixel: { value: new Y() }\n },\n vertexShader: (\n /* glsl */\n `\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t\t\t}\n\t\t\t`\n ),\n fragmentShader: (\n /* glsl */\n `\n\t\t\t\tuniform sampler2D map;\n\t\t\t\tuniform ivec2 pixel;\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tgl_FragColor = texelFetch( map, pixel, 0 );\n\n\t\t\t\t}\n\t\t\t`\n )\n }));\n }\n // increases the width of the target render target to support more data\n increaseSizeTo(e) {\n this._target.setSize(Math.max(this._target.width, e), 1);\n }\n // read data from the rendered texture asynchronously\n readDataAsync(e) {\n const { _renderer: t, _target: s } = this;\n return t.readRenderTargetPixelsAsync(s, 0, 0, e.length / 4, 1, e);\n }\n // read data from the rendered texture\n readData(e) {\n const { _renderer: t, _target: s } = this;\n t.readRenderTargetPixels(s, 0, 0, e.length / 4, 1, e);\n }\n // render a single pixel from the source at the destination point on the render target\n // takes the texture, pixel to read from, and pixel to render in to\n renderPixelToTarget(e, t, s) {\n const { _renderer: n, _target: i } = this;\n ve.min.copy(t), ve.max.copy(t), ve.max.x += 1, ve.max.y += 1, n.initRenderTarget(i), n.copyTextureToTexture(e, i.texture, ve, s, 0);\n }\n}\nconst he = /* @__PURE__ */ new class {\n constructor() {\n let a = null;\n Object.getOwnPropertyNames(xs.prototype).forEach((e) => {\n e !== \"constructor\" && (this[e] = (...t) => (a = a || new xs(), a[e](...t)));\n });\n }\n}(), Ts = /* @__PURE__ */ new Y(), bs = /* @__PURE__ */ new Y(), _s = /* @__PURE__ */ new Y();\nfunction Xi(a, e) {\n return e === 0 ? a.getAttribute(\"uv\") : a.getAttribute(`uv${e}`);\n}\nfunction Sn(a, e, t = new Array(3)) {\n let s = 3 * e, n = 3 * e + 1, i = 3 * e + 2;\n return a.index && (s = a.index.getX(s), n = a.index.getX(n), i = a.index.getX(i)), t[0] = s, t[1] = n, t[2] = i, t;\n}\nfunction Mn(a, e, t, s, n) {\n const [i, r, o] = s, l = Xi(a, e);\n Ts.fromBufferAttribute(l, i), bs.fromBufferAttribute(l, r), _s.fromBufferAttribute(l, o), n.set(0, 0, 0).addScaledVector(Ts, t.x).addScaledVector(bs, t.y).addScaledVector(_s, t.z);\n}\nfunction Cn(a, e, t, s) {\n const n = a.x - Math.floor(a.x), i = a.y - Math.floor(a.y), r = Math.floor(n * e % e), o = Math.floor(i * t % t);\n return s.set(r, o), s;\n}\nconst Ss = /* @__PURE__ */ new Y(), Ms = /* @__PURE__ */ new Y(), Cs = /* @__PURE__ */ new Y();\nclass $i extends ht {\n constructor(e, t, s = null) {\n super(e, t, s), this.channels = q(s, \"channels\", [0]), this.index = q(s, \"index\", null), this.texCoord = q(s, \"texCoord\", null), this.valueLength = parseInt(this.type.replace(/[^0-9]/g, \"\")) || 1;\n }\n // takes the buffer to read from and the value index to read\n readDataFromBuffer(e, t, s = null) {\n const n = this.type;\n if (n === \"BOOLEAN\" || n === \"STRING\")\n throw new Error(\"PropertyTextureAccessor: BOOLEAN and STRING types not supported.\");\n return _n(e, t * this.valueLength, n, s);\n }\n}\nclass Qi extends Qt {\n constructor(...e) {\n super(...e), this.isPropertyTextureAccessor = !0, this._asyncRead = !1, this._initProperties($i);\n }\n // Reads the full set of property data\n getData(e, t, s, n = {}) {\n const i = this.properties;\n it(i, n);\n const r = Object.keys(i), o = r.map((l) => n[l]);\n return this.getPropertyValuesAtTexel(r, e, t, s, o), r.forEach((l, c) => n[l] = o[c]), n;\n }\n // Reads the full set of property data asynchronously\n async getDataAsync(e, t, s, n = {}) {\n const i = this.properties;\n it(i, n);\n const r = Object.keys(i), o = r.map((l) => n[l]);\n return await this.getPropertyValuesAtTexelAsync(r, e, t, s, o), r.forEach((l, c) => n[l] = o[c]), n;\n }\n // Reads values asynchronously\n getPropertyValuesAtTexelAsync(...e) {\n this._asyncRead = !0;\n const t = this.getPropertyValuesAtTexel(...e);\n return this._asyncRead = !1, t;\n }\n // Reads values from the textures synchronously\n getPropertyValuesAtTexel(e, t, s, n, i = []) {\n for (; i.length < e.length; ) i.push(null);\n i.length = e.length, he.increaseSizeTo(i.length);\n const r = this.data, o = this.definition.properties, l = this.properties, c = Sn(n, t);\n for (let d = 0, m = e.length; d < m; d++) {\n const f = e[d];\n if (!o[f])\n continue;\n const p = l[f], g = r[p.index];\n Mn(n, p.texCoord, s, c, Ss), Cn(Ss, g.image.width, g.image.height, Ms), Cs.set(d, 0), he.renderPixelToTarget(g, Ms, Cs);\n }\n const u = new Uint8Array(e.length * 4);\n if (this._asyncRead)\n return he.readDataAsync(u).then(() => (h.call(this), i));\n return he.readData(u), h.call(this), i;\n function h() {\n for (let d = 0, m = e.length; d < m; d++) {\n const f = e[d], p = l[f], g = p.type;\n if (i[d] = $t(p, i[d]), p) {\n if (!o[f]) {\n i[d] = p.resolveDefault(i);\n continue;\n }\n } else throw new Error(\"PropertyTextureAccessor: Requested property does not exist.\");\n const y = p.valueLength * (p.count || 1), x = p.channels.map((_) => u[4 * d + _]), S = p.componentType, T = De(S, g), M = new T(y);\n if (new Uint8Array(M.buffer).set(x), p.array) {\n const _ = i[d];\n for (let C = 0, v = _.length; C < v; C++)\n _[C] = p.readDataFromBuffer(M, C, _[C]);\n } else\n i[d] = p.readDataFromBuffer(M, 0, i[d]);\n i[d] = p.adjustValueScaleOffset(i[d]), i[d] = p.resolveEnumsToStrings(i[d]), i[d] = p.resolveNoData(i[d]);\n }\n }\n }\n // dispose all of the texture data used\n dispose() {\n this.data.forEach((e) => {\n e && (e.dispose(), e.image instanceof ImageBitmap && e.image.close());\n });\n }\n}\nclass As {\n constructor(e, t, s, n = null, i = null) {\n const {\n schema: r,\n propertyTables: o = [],\n propertyTextures: l = [],\n propertyAttributes: c = []\n } = e, { enums: u, classes: h } = r, d = o.map((p) => new Yi(p, h, u, s));\n let m = [], f = [];\n n && (n.propertyTextures && (m = n.propertyTextures.map((p) => new Qi(l[p], h, u, t))), n.propertyAttributes && (f = n.propertyAttributes.map((p) => new Wi(c[p], h, u)))), this.schema = r, this.tableAccessors = d, this.textureAccessors = m, this.attributeAccessors = f, this.object = i, this.textures = t, this.nodeMetadata = n;\n }\n // Property Tables\n getPropertyTableData(e, t, s = null) {\n if (!Array.isArray(e) || !Array.isArray(t))\n s = s || {}, s = this.tableAccessors[e].getData(t, s);\n else {\n s = s || [];\n const n = Math.min(e.length, t.length);\n s.length = n;\n for (let i = 0; i < n; i++) {\n const r = this.tableAccessors[e[i]];\n s[i] = r.getData(t[i], s[i]);\n }\n }\n return s;\n }\n getPropertyTableInfo(e = null) {\n if (e === null && (e = this.tableAccessors.map((t, s) => s)), Array.isArray(e))\n return e.map((t) => {\n const s = this.tableAccessors[t];\n return {\n name: s.name,\n className: s.definition.class\n };\n });\n {\n const t = this.tableAccessors[e];\n return {\n name: t.name,\n className: t.definition.class\n };\n }\n }\n // Property Textures\n getPropertyTextureData(e, t, s = []) {\n const n = this.textureAccessors;\n s.length = n.length;\n for (let i = 0; i < n.length; i++) {\n const r = n[i];\n s[i] = r.getData(e, t, this.object.geometry, s[i]);\n }\n return s;\n }\n async getPropertyTextureDataAsync(e, t, s = []) {\n const n = this.textureAccessors;\n s.length = n.length;\n const i = [];\n for (let r = 0; r < n.length; r++) {\n const l = n[r].getDataAsync(e, t, this.object.geometry, s[r]).then((c) => {\n s[r] = c;\n });\n i.push(l);\n }\n return await Promise.all(i), s;\n }\n getPropertyTextureInfo() {\n return this.textureAccessors;\n }\n // Property Attributes\n getPropertyAttributeData(e, t = []) {\n const s = this.attributeAccessors;\n t.length = s.length;\n for (let n = 0; n < s.length; n++) {\n const i = s[n];\n t[n] = i.getData(e, this.object.geometry, t[n]);\n }\n return t;\n }\n getPropertyAttributeInfo() {\n return this.attributeAccessors.map((e) => ({\n name: e.name,\n className: e.definition.class\n }));\n }\n dispose() {\n this.textureAccessors.forEach((e) => e.dispose()), this.tableAccessors.forEach((e) => e.dispose()), this.attributeAccessors.forEach((e) => e.dispose());\n }\n}\nconst Le = \"EXT_structural_metadata\";\nfunction Zi(a, e = []) {\n var n;\n const t = ((n = a.json.textures) == null ? void 0 : n.length) || 0, s = new Array(t).fill(null);\n return e.forEach(({ properties: i }) => {\n for (const r in i) {\n const { index: o } = i[r];\n s[o] === null && (s[o] = a.loadTexture(o));\n }\n }), Promise.all(s);\n}\nfunction Ji(a, e = []) {\n var n;\n const t = ((n = a.json.bufferViews) == null ? void 0 : n.length) || 0, s = new Array(t).fill(null);\n return e.forEach(({ properties: i }) => {\n for (const r in i) {\n const { values: o, arrayOffsets: l, stringOffsets: c } = i[r];\n s[o] === null && (s[o] = a.loadBufferView(o)), s[l] === null && (s[l] = a.loadBufferView(l)), s[c] === null && (s[c] = a.loadBufferView(c));\n }\n }), Promise.all(s);\n}\nclass Ki {\n constructor(e) {\n this.parser = e, this.name = Le;\n }\n async afterRoot({ scene: e, parser: t }) {\n const s = t.json.extensionsUsed;\n if (!s || !s.includes(Le))\n return;\n let n = null, i = t.json.extensions[Le];\n if (i.schemaUri) {\n const { manager: c, path: u, requestHeader: h, crossOrigin: d } = t.options, m = new URL(i.schemaUri, u).toString(), f = new ti(c);\n f.setCrossOrigin(d), f.setResponseType(\"json\"), f.setRequestHeader(h), n = f.loadAsync(m).then((p) => {\n i = { ...i, schema: p };\n });\n }\n const [r, o] = await Promise.all([\n Zi(t, i.propertyTextures),\n Ji(t, i.propertyTables),\n n\n ]), l = new As(i, r, o);\n e.userData.structuralMetadata = l, e.traverse((c) => {\n var u;\n if (t.associations.has(c)) {\n const { meshes: h, primitives: d } = t.associations.get(c), m = (u = t.json.meshes[h]) == null ? void 0 : u.primitives[d];\n if (m && m.extensions && m.extensions[Le]) {\n const f = m.extensions[Le];\n c.userData.structuralMetadata = new As(i, r, o, f, c);\n } else\n c.userData.structuralMetadata = l;\n }\n });\n }\n}\nconst Is = /* @__PURE__ */ new Y(), vs = /* @__PURE__ */ new Y(), Ls = /* @__PURE__ */ new Y();\nfunction er(a) {\n return a.x > a.y && a.x > a.z ? 0 : a.y > a.z ? 1 : 2;\n}\nclass tr {\n constructor(e, t, s) {\n this.geometry = e, this.textures = t, this.data = s, this._asyncRead = !1, this.featureIds = s.featureIds.map((n) => {\n const { texture: i, ...r } = n, o = {\n label: null,\n propertyTable: null,\n nullFeatureId: null,\n ...r\n };\n return i && (o.texture = {\n texCoord: 0,\n channels: [0],\n ...i\n }), o;\n });\n }\n // returns list of textures\n getTextures() {\n return this.textures;\n }\n // returns a set of info for each feature\n getFeatureInfo() {\n return this.featureIds;\n }\n // performs texture data read back asynchronously\n getFeaturesAsync(...e) {\n this._asyncRead = !0;\n const t = this.getFeatures(...e);\n return this._asyncRead = !1, t;\n }\n // returns all features for the given point on the given triangle\n getFeatures(e, t) {\n const { geometry: s, textures: n, featureIds: i } = this, r = new Array(i.length).fill(null), o = i.length;\n he.increaseSizeTo(o);\n const l = Sn(s, e), c = l[er(t)];\n for (let d = 0, m = i.length; d < m; d++) {\n const f = i[d], p = \"nullFeatureId\" in f ? f.nullFeatureId : null;\n if (\"texture\" in f) {\n const g = n[f.texture.index];\n Mn(s, f.texture.texCoord, t, l, Is), Cn(Is, g.image.width, g.image.height, vs), Ls.set(d, 0), he.renderPixelToTarget(n[f.texture.index], vs, Ls);\n } else if (\"attribute\" in f) {\n const y = s.getAttribute(`_feature_id_${f.attribute}`).getX(c);\n y !== p && (r[d] = y);\n } else {\n const g = c;\n g !== p && (r[d] = g);\n }\n }\n const u = new Uint8Array(o * 4);\n if (this._asyncRead)\n return he.readDataAsync(u).then(() => (h(), r));\n return he.readData(u), h(), r;\n function h() {\n const d = new Uint32Array(1);\n for (let m = 0, f = i.length; m < f; m++) {\n const p = i[m], g = \"nullFeatureId\" in p ? p.nullFeatureId : null;\n if (\"texture\" in p) {\n const { channels: y } = p.texture, x = y.map((T) => u[4 * m + T]);\n new Uint8Array(d.buffer).set(x);\n const S = d[0];\n S !== g && (r[m] = S);\n }\n }\n }\n }\n // dispose all of the texture data used\n dispose() {\n this.textures.forEach((e) => {\n e && (e.dispose(), e.image instanceof ImageBitmap && e.image.close());\n });\n }\n}\nconst rt = \"EXT_mesh_features\";\nfunction Es(a, e, t) {\n a.traverse((s) => {\n var n;\n if (e.associations.has(s)) {\n const { meshes: i, primitives: r } = e.associations.get(s), o = (n = e.json.meshes[i]) == null ? void 0 : n.primitives[r];\n o && o.extensions && o.extensions[rt] && t(s, o.extensions[rt]);\n }\n });\n}\nclass sr {\n constructor(e) {\n this.parser = e, this.name = rt;\n }\n async afterRoot({ scene: e, parser: t }) {\n var o;\n const s = t.json.extensionsUsed;\n if (!s || !s.includes(rt))\n return;\n const n = ((o = t.json.textures) == null ? void 0 : o.length) || 0, i = new Array(n).fill(null);\n Es(e, t, (l, { featureIds: c }) => {\n c.forEach((u) => {\n if (u.texture && i[u.texture.index] === null) {\n const h = u.texture.index;\n i[h] = t.loadTexture(h);\n }\n });\n });\n const r = await Promise.all(i);\n Es(e, t, (l, c) => {\n l.userData.meshFeatures = new tr(l.geometry, r, c);\n });\n }\n}\nclass nr {\n constructor() {\n this.name = \"CESIUM_RTC\";\n }\n afterRoot(e) {\n if (e.parser.json.extensions && e.parser.json.extensions.CESIUM_RTC) {\n const { center: t } = e.parser.json.extensions.CESIUM_RTC;\n t && (e.scene.position.x += t[0], e.scene.position.y += t[1], e.scene.position.z += t[2]);\n }\n }\n}\nclass lo {\n constructor(e) {\n e = {\n metadata: !0,\n rtc: !0,\n plugins: [],\n dracoLoader: null,\n ktxLoader: null,\n meshoptDecoder: null,\n autoDispose: !0,\n ...e\n }, this.tiles = null, this.metadata = e.metadata, this.rtc = e.rtc, this.plugins = e.plugins, this.dracoLoader = e.dracoLoader, this.ktxLoader = e.ktxLoader, this.meshoptDecoder = e.meshoptDecoder, this._gltfRegex = /\\.(gltf|glb)$/g, this._dracoRegex = /\\.drc$/g, this._loader = null;\n }\n init(e) {\n const t = new gi(e.manager);\n this.dracoLoader && (t.setDRACOLoader(this.dracoLoader), e.manager.addHandler(this._dracoRegex, this.dracoLoader)), this.ktxLoader && t.setKTX2Loader(this.ktxLoader), this.meshoptDecoder && t.setMeshoptDecoder(this.meshoptDecoder), this.rtc && t.register(() => new nr()), this.metadata && (t.register(() => new Ki()), t.register(() => new sr())), this.plugins.forEach((s) => t.register(s)), e.manager.addHandler(this._gltfRegex, t), this.tiles = e, this._loader = t;\n }\n dispose() {\n this.tiles.manager.removeHandler(this._gltfRegex), this.tiles.manager.removeHandler(this._dracoRegex), this.autoDispose && (this.ktxLoader.dispose(), this.dracoLoader.dispose());\n }\n}\nconst qe = /* @__PURE__ */ new de();\nclass co {\n constructor(e) {\n e = {\n up: \"+z\",\n recenter: !0,\n lat: null,\n lon: null,\n height: 0,\n azimuth: 0,\n elevation: 0,\n roll: 0,\n ...e\n }, this.tiles = null, this.up = e.up.toLowerCase().replace(/\\s+/, \"\"), this.lat = e.lat, this.lon = e.lon, this.height = e.height, this.azimuth = e.azimuth, this.elevation = e.elevation, this.roll = e.roll, this.recenter = e.recenter, this._callback = null;\n }\n init(e) {\n this.tiles = e, this._callback = () => {\n const { up: t, lat: s, lon: n, height: i, azimuth: r, elevation: o, roll: l, recenter: c } = this;\n if (s !== null && n !== null)\n this.transformLatLonHeightToOrigin(s, n, i, r, o, l);\n else {\n const { ellipsoid: u } = e, h = Math.min(...u.radius);\n if (e.getBoundingSphere(qe), qe.center.length() > h * 0.5) {\n const d = {};\n u.getPositionToCartographic(qe.center, d), this.transformLatLonHeightToOrigin(d.lat, d.lon, d.height);\n } else {\n const d = e.group;\n switch (d.rotation.set(0, 0, 0), t) {\n case \"x\":\n case \"+x\":\n d.rotation.z = Math.PI / 2;\n break;\n case \"-x\":\n d.rotation.z = -Math.PI / 2;\n break;\n case \"y\":\n case \"+y\":\n break;\n case \"-y\":\n d.rotation.z = Math.PI;\n break;\n case \"z\":\n case \"+z\":\n d.rotation.x = -Math.PI / 2;\n break;\n case \"-z\":\n d.rotation.x = Math.PI / 2;\n break;\n }\n e.group.position.copy(qe.center).applyEuler(d.rotation).multiplyScalar(-1);\n }\n }\n c || e.group.position.setScalar(0), e.removeEventListener(\"load-root-tileset\", this._callback);\n }, e.addEventListener(\"load-root-tileset\", this._callback), e.root && this._callback();\n }\n transformLatLonHeightToOrigin(e, t, s = 0, n = 0, i = 0, r = 0) {\n const { group: o, ellipsoid: l } = this.tiles;\n l.getObjectFrame(e, t, s, n, i, r, o.matrix, hi), o.matrix.invert().decompose(o.position, o.quaternion, o.scale), o.updateMatrixWorld();\n }\n dispose() {\n const { group: e } = this.tiles;\n e.position.setScalar(0), e.quaternion.identity(), e.scale.set(1, 1, 1), this.tiles.removeEventListener(\"load-root-tileset\", this._callback);\n }\n}\nclass uo {\n set delay(e) {\n this.deferCallbacks.delay = e;\n }\n get delay() {\n return this.deferCallbacks.delay;\n }\n set bytesTarget(e) {\n this.lruCache.minBytesSize = e;\n }\n get bytesTarget() {\n return this.lruCache.minBytesSize;\n }\n get estimatedGpuBytes() {\n return this.lruCache.cachedBytes;\n }\n constructor(e = {}) {\n const {\n delay: t = 0,\n bytesTarget: s = 0\n } = e;\n this.name = \"UNLOAD_TILES_PLUGIN\", this.tiles = null, this.lruCache = new yi(), this.deferCallbacks = new ir(), this.delay = t, this.bytesTarget = s;\n }\n init(e) {\n this.tiles = e;\n const { lruCache: t, deferCallbacks: s } = this, n = (i) => {\n const r = i.engineData.scene;\n e.visibleTiles.has(i) || e.invokeOnePlugin((l) => l.unloadTileFromGPU && l.unloadTileFromGPU(r, i));\n };\n this._onUpdateBefore = () => {\n t.unloadPriorityCallback = e.lruCache.unloadPriorityCallback, t.minSize = 1 / 0, t.maxSize = 1 / 0, t.maxBytesSize = 1 / 0, t.unloadPercent = 1, t.autoMarkUnused = !1;\n }, this._onVisibilityChangeCallback = ({ tile: i, scene: r, visible: o }) => {\n o ? (t.add(i, n), t.setMemoryUsage(i, e.calculateBytesUsed(i, r) || 1), e.markTileUsed(i), s.cancel(i)) : s.run(i);\n }, this._onDisposeModel = ({ tile: i }) => {\n t.remove(i), s.cancel(i);\n }, s.callback = (i) => {\n t.markUnused(i), t.scheduleUnload();\n }, e.forEachLoadedModel((i, r) => {\n const o = e.visibleTiles.has(r);\n this._onVisibilityChangeCallback({ tile: r, visible: o });\n }), e.addEventListener(\"tile-visibility-change\", this._onVisibilityChangeCallback), e.addEventListener(\"update-before\", this._onUpdateBefore), e.addEventListener(\"dispose-model\", this._onDisposeModel);\n }\n unloadTileFromGPU(e, t) {\n e && e.traverse((s) => {\n if (s.material) {\n const n = s.material;\n n.dispose();\n for (const i in n) {\n const r = n[i];\n r && r.isTexture && r.dispose();\n }\n }\n s.geometry && s.geometry.dispose();\n });\n }\n dispose() {\n const { lruCache: e, tiles: t, deferCallbacks: s } = this;\n t.removeEventListener(\"tile-visibility-change\", this._onVisibilityChangeCallback), t.removeEventListener(\"update-before\", this._onUpdateBefore), t.removeEventListener(\"dispose-model\", this._onDisposeModel), s.cancelAll(), e.minBytesSize = 0, e.minSize = 0, e.maxSize = 0, e.markAllUnused(), e.scheduleUnload();\n }\n}\nclass ir {\n constructor(e = () => {\n }) {\n this.map = /* @__PURE__ */ new Map(), this.callback = e, this.delay = 0;\n }\n run(e) {\n const { map: t, delay: s } = this;\n if (t.has(e))\n throw new Error(\"DeferCallbackManager: Callback already initialized.\");\n s === 0 ? this.callback(e) : t.set(e, setTimeout(() => {\n this.callback(e), t.delete(e);\n }, s));\n }\n cancel(e) {\n const { map: t } = this;\n t.has(e) && (clearTimeout(t.get(e)), t.delete(e));\n }\n cancelAll() {\n this.map.forEach((e, t) => {\n this.cancel(t);\n });\n }\n}\nconst { clamp: _t } = b;\nclass rr {\n constructor() {\n this.duration = 250, this.fadeCount = 0, this._lastTick = -1, this._fadeState = /* @__PURE__ */ new Map(), this.onFadeComplete = null, this.onFadeStart = null, this.onFadeSetComplete = null, this.onFadeSetStart = null;\n }\n // delete the object from the fade, reset the material data\n deleteObject(e) {\n e && this.completeFade(e);\n }\n // Ensure we're storing a fade timer for the provided object\n // Returns whether a new state had to be added\n guaranteeState(e) {\n const t = this._fadeState;\n if (t.has(e))\n return !1;\n const s = {\n fadeInTarget: 0,\n fadeOutTarget: 0,\n fadeIn: 0,\n fadeOut: 0\n };\n return t.set(e, s), !0;\n }\n // Force the fade to complete in the direction it is already trending\n completeFade(e) {\n const t = this._fadeState;\n if (!t.has(e))\n return;\n const s = t.get(e).fadeOutTarget === 0;\n t.delete(e), this.fadeCount--, this.onFadeComplete && this.onFadeComplete(e, s), this.fadeCount === 0 && this.onFadeSetComplete && this.onFadeSetComplete();\n }\n completeAllFades() {\n this._fadeState.forEach((e, t) => {\n this.completeFade(t);\n });\n }\n forEachObject(e) {\n this._fadeState.forEach((t, s) => {\n e(s, t);\n });\n }\n // Fade the object in\n fadeIn(e) {\n const t = this.guaranteeState(e), s = this._fadeState.get(e);\n s.fadeInTarget = 1, s.fadeOutTarget = 0, s.fadeOut = 0, t && (this.fadeCount++, this.fadeCount === 1 && this.onFadeSetStart && this.onFadeSetStart(), this.onFadeStart && this.onFadeStart(e));\n }\n // Fade the object out\n fadeOut(e) {\n const t = this.guaranteeState(e), s = this._fadeState.get(e);\n s.fadeOutTarget = 1, t && (s.fadeInTarget = 1, s.fadeIn = 1, this.fadeCount++, this.fadeCount === 1 && this.onFadeSetStart && this.onFadeSetStart(), this.onFadeStart && this.onFadeStart(e));\n }\n isFading(e) {\n return this._fadeState.has(e);\n }\n isFadingOut(e) {\n const t = this._fadeState.get(e);\n return t && t.fadeOutTarget === 1;\n }\n // Tick the fade timer for each actively fading object\n update() {\n const e = window.performance.now();\n this._lastTick === -1 && (this._lastTick = e);\n const t = _t((e - this._lastTick) / this.duration, 0, 1);\n this._lastTick = e, this._fadeState.forEach((n, i) => {\n const {\n fadeOutTarget: r,\n fadeInTarget: o\n } = n;\n let {\n fadeOut: l,\n fadeIn: c\n } = n;\n const u = Math.sign(o - c);\n c = _t(c + u * t, 0, 1);\n const h = Math.sign(r - l);\n l = _t(l + h * t, 0, 1), n.fadeIn = c, n.fadeOut = l, ((l === 1 || l === 0) && (c === 1 || c === 0) || l >= c) && this.completeFade(i);\n });\n }\n}\nconst St = Symbol(\"FADE_PARAMS\");\nfunction An(a, e) {\n if (a[St])\n return a[St];\n const t = {\n fadeIn: { value: 0 },\n fadeOut: { value: 0 },\n fadeTexture: { value: null }\n };\n return a[St] = t, a.defines = {\n ...a.defines || {},\n FEATURE_FADE: 0\n }, a.onBeforeCompile = (s) => {\n e && e(s), s.uniforms = {\n ...s.uniforms,\n ...t\n }, s.vertexShader = s.vertexShader.replace(\n /void\\s+main\\(\\)\\s+{/,\n (n) => (\n /* glsl */\n `\n\t\t\t\t\t#ifdef USE_BATCHING_FRAG\n\n\t\t\t\t\tvarying float vBatchId;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\t${n}\n\n\t\t\t\t\t\t#ifdef USE_BATCHING_FRAG\n\n\t\t\t\t\t\t// add 0.5 to the value to avoid floating error that may cause flickering\n\t\t\t\t\t\tvBatchId = getIndirectIndex( gl_DrawID ) + 0.5;\n\n\t\t\t\t\t\t#endif\n\t\t\t\t`\n )\n ), s.fragmentShader = s.fragmentShader.replace(/void main\\(/, (n) => (\n /* glsl */\n `\n\t\t\t\t#if FEATURE_FADE\n\n\t\t\t\t// adapted from https://www.shadertoy.com/view/Mlt3z8\n\t\t\t\tfloat bayerDither2x2( vec2 v ) {\n\n\t\t\t\t\treturn mod( 3.0 * v.y + 2.0 * v.x, 4.0 );\n\n\t\t\t\t}\n\n\t\t\t\tfloat bayerDither4x4( vec2 v ) {\n\n\t\t\t\t\tvec2 P1 = mod( v, 2.0 );\n\t\t\t\t\tvec2 P2 = floor( 0.5 * mod( v, 4.0 ) );\n\t\t\t\t\treturn 4.0 * bayerDither2x2( P1 ) + bayerDither2x2( P2 );\n\n\t\t\t\t}\n\n\t\t\t\t// the USE_BATCHING define is not available in fragment shaders\n\t\t\t\t#ifdef USE_BATCHING_FRAG\n\n\t\t\t\t// functions for reading the fade state of a given batch id\n\t\t\t\tuniform sampler2D fadeTexture;\n\t\t\t\tvarying float vBatchId;\n\t\t\t\tvec2 getFadeValues( const in float i ) {\n\n\t\t\t\t\tint size = textureSize( fadeTexture, 0 ).x;\n\t\t\t\t\tint j = int( i );\n\t\t\t\t\tint x = j % size;\n\t\t\t\t\tint y = j / size;\n\t\t\t\t\treturn texelFetch( fadeTexture, ivec2( x, y ), 0 ).rg;\n\n\t\t\t\t}\n\n\t\t\t\t#else\n\n\t\t\t\tuniform float fadeIn;\n\t\t\t\tuniform float fadeOut;\n\n\t\t\t\t#endif\n\n\t\t\t\t#endif\n\n\t\t\t\t${n}\n\t\t\t`\n )).replace(/#include <dithering_fragment>/, (n) => (\n /* glsl */\n `\n\n\t\t\t\t${n}\n\n\t\t\t\t#if FEATURE_FADE\n\n\t\t\t\t#ifdef USE_BATCHING_FRAG\n\n\t\t\t\tvec2 fadeValues = getFadeValues( vBatchId );\n\t\t\t\tfloat fadeIn = fadeValues.r;\n\t\t\t\tfloat fadeOut = fadeValues.g;\n\n\t\t\t\t#endif\n\n\t\t\t\tfloat bayerValue = bayerDither4x4( floor( mod( gl_FragCoord.xy, 4.0 ) ) );\n\t\t\t\tfloat bayerBins = 16.0;\n\t\t\t\tfloat dither = ( 0.5 + bayerValue ) / bayerBins;\n\t\t\t\tif ( dither >= fadeIn ) {\n\n\t\t\t\t\tdiscard;\n\n\t\t\t\t}\n\n\t\t\t\tif ( dither < fadeOut ) {\n\n\t\t\t\t\tdiscard;\n\n\t\t\t\t}\n\n\t\t\t\t#endif\n\n\t\t\t`\n ));\n }, t;\n}\nclass or {\n constructor() {\n this._fadeParams = /* @__PURE__ */ new WeakMap(), this.fading = 0;\n }\n // Set the fade parameters for the given scene\n setFade(e, t, s) {\n if (!e)\n return;\n const n = this._fadeParams;\n e.traverse((i) => {\n const r = i.material;\n if (r && n.has(r)) {\n const o = n.get(r);\n o.fadeIn.value = t, o.fadeOut.value = s;\n const u = +(!(t === 0 || t === 1) || !(s === 0 || s === 1));\n r.defines.FEATURE_FADE !== u && (this.fading += u === 1 ? 1 : -1, r.defines.FEATURE_FADE = u, r.needsUpdate = !0);\n }\n });\n }\n // initialize materials in the object\n prepareScene(e) {\n e.traverse((t) => {\n t.material && this.prepareMaterial(t.material);\n });\n }\n // delete the object from the fade, reset the material data\n deleteScene(e) {\n if (!e)\n return;\n this.setFade(e, 1, 0);\n const t = this._fadeParams;\n e.traverse((s) => {\n const n = s.material;\n n && t.delete(n);\n });\n }\n // initialize the material\n prepareMaterial(e) {\n const t = this._fadeParams;\n t.has(e) || t.set(e, An(e, e.onBeforeCompile));\n }\n}\nclass ar {\n constructor(e, t = new Se()) {\n this.other = e, this.material = t, this.visible = !0, this.parent = null, this._instanceInfo = [], this._visibilityChanged = !0;\n const s = new Proxy(this, {\n get(n, i) {\n if (i in n)\n return n[i];\n {\n const r = e[i];\n return r instanceof Function ? (...o) => (n.syncInstances(), r.call(s, ...o)) : e[i];\n }\n },\n set(n, i, r) {\n return i in n ? n[i] = r : e[i] = r, !0;\n },\n deleteProperty(n, i) {\n return i in n ? delete n[i] : delete e[i];\n }\n // ownKeys() {},\n // has(target, key) {},\n // defineProperty(target, key, descriptor) {},\n // getOwnPropertyDescriptor(target, key) {},\n });\n return s;\n }\n syncInstances() {\n const e = this._instanceInfo, t = this.other._instanceInfo;\n for (; t.length > e.length; ) {\n const s = e.length;\n e.push(new Proxy({ visible: !1 }, {\n get(n, i) {\n return i in n ? n[i] : t[s][i];\n },\n set(n, i, r) {\n return i in n ? n[i] = r : t[s][i] = r, !0;\n }\n }));\n }\n }\n}\nclass lr extends ar {\n constructor(...e) {\n super(...e);\n const t = this.material, s = An(t, t.onBeforeCompile);\n t.defines.FEATURE_FADE = 1, t.defines.USE_BATCHING_FRAG = 1, t.needsUpdate = !0, this.fadeTexture = null, this._fadeParams = s;\n }\n // Set the fade state\n setFadeAt(e, t, s) {\n this._initFadeTexture(), this.fadeTexture.setValueAt(e, t * 255, s * 255);\n }\n // initialize the texture and resize it if needed\n _initFadeTexture() {\n let e = Math.sqrt(this._maxInstanceCount);\n e = Math.ceil(e);\n const t = e * e * 2, s = this.fadeTexture;\n if (!s || s.image.data.length !== t) {\n const n = new Uint8Array(t), i = new cr(n, e, e, en, tn);\n if (s) {\n s.dispose();\n const r = s.image.data, o = this.fadeTexture.image.data, l = Math.min(r.length, o.length);\n o.set(new r.constructor(r.buffer, 0, l));\n }\n this.fadeTexture = i, this._fadeParams.fadeTexture.value = i, i.needsUpdate = !0;\n }\n }\n // dispose the fade texture. Super cannot be used here due to proxy\n dispose() {\n this.fadeTexture && this.fadeTexture.dispose();\n }\n}\nclass cr extends Wt {\n setValueAt(e, ...t) {\n const { data: s, width: n, height: i } = this.image, r = Math.floor(s.length / (n * i));\n let o = !1;\n for (let l = 0; l < r; l++) {\n const c = e * r + l, u = s[c], h = t[l] || 0;\n u !== h && (s[c] = h, o = !0);\n }\n o && (this.needsUpdate = !0);\n }\n}\nconst ws = Symbol(\"HAS_POPPED_IN\"), Ps = /* @__PURE__ */ new E(), Rs = /* @__PURE__ */ new E(), Ds = /* @__PURE__ */ new nn(), Bs = /* @__PURE__ */ new nn(), Os = /* @__PURE__ */ new E();\nfunction ur() {\n const a = this._fadeManager, e = this.tiles;\n this._fadingBefore = a.fadeCount, this._displayActiveTiles = e.displayActiveTiles, e.displayActiveTiles = !0;\n}\nfunction hr() {\n const a = this._fadeManager, e = this._fadeMaterialManager, t = this._displayActiveTiles, s = this._fadingBefore, n = this._prevCameraTransforms, { tiles: i, maximumFadeOutTiles: r, batchedMesh: o } = this, { cameras: l } = i;\n i.displayActiveTiles = t, a.update();\n const c = a.fadeCount;\n if (s !== 0 && c !== 0 && (i.dispatchEvent({ type: \"fade-change\" }), i.dispatchEvent({ type: \"needs-render\" })), t || i.visibleTiles.forEach((u) => {\n const h = u.engineData.scene;\n h && (h.visible = u.traversal.inFrustum), this.forEachBatchIds(u, (d, m, f) => {\n m.setVisibleAt(d, u.traversal.inFrustum), f.batchedMesh.setVisibleAt(d, u.traversal.inFrustum);\n });\n }), r < this._fadingOutCount) {\n let u = !0;\n l.forEach((h) => {\n if (!n.has(h))\n return;\n const d = h.matrixWorld, m = n.get(h);\n d.decompose(Rs, Bs, Os), m.decompose(Ps, Ds, Os);\n const f = Bs.angleTo(Ds), p = Rs.distanceTo(Ps);\n u = u && (f > 0.25 || p > 0.1);\n }), u && a.completeAllFades();\n }\n if (l.forEach((u) => {\n n.get(u).copy(u.matrixWorld);\n }), a.forEachObject((u, { fadeIn: h, fadeOut: d }) => {\n const m = u.engineData.scene, f = a.isFadingOut(u);\n i.markTileUsed(u), m && (e.setFade(m, h, d), f && (m.visible = !0)), this.forEachBatchIds(u, (p, g, y) => {\n g.setFadeAt(p, h, d), g.setVisibleAt(p, !0), y.batchedMesh.setVisibleAt(p, !1);\n });\n }), o) {\n const u = i.getPluginByName(\"BATCHED_TILES_PLUGIN\").batchedMesh.material;\n o.material.map = u.map;\n }\n}\nclass ho {\n get fadeDuration() {\n return this._fadeManager.duration;\n }\n set fadeDuration(e) {\n this._fadeManager.duration = Number(e);\n }\n get fadingTiles() {\n return this._fadeManager.fadeCount;\n }\n constructor(e) {\n e = {\n maximumFadeOutTiles: 50,\n fadeRootTiles: !1,\n fadeDuration: 250,\n ...e\n }, this.name = \"FADE_TILES_PLUGIN\", this.priority = -2, this.tiles = null, this.batchedMesh = null, this._quickFadeTiles = /* @__PURE__ */ new Set(), this._fadeManager = new rr(), this._fadeMaterialManager = new or(), this._prevCameraTransforms = null, this._fadingOutCount = 0, this.maximumFadeOutTiles = e.maximumFadeOutTiles, this.fadeRootTiles = e.fadeRootTiles, this.fadeDuration = e.fadeDuration;\n }\n init(e) {\n this._onLoadModel = ({ scene: n }) => {\n this._fadeMaterialManager.prepareScene(n);\n }, this._onDisposeModel = ({ tile: n, scene: i }) => {\n this.tiles.visibleTiles.has(n) && this._quickFadeTiles.add(n.parent), this._fadeManager.deleteObject(n), this._fadeMaterialManager.deleteScene(i);\n }, this._onAddCamera = ({ camera: n }) => {\n this._prevCameraTransforms.set(n, new K());\n }, this._onDeleteCamera = ({ camera: n }) => {\n this._prevCameraTransforms.delete(n);\n }, this._onTileVisibilityChange = ({ tile: n, visible: i }) => {\n const r = n.engineData.scene;\n r && (r.visible = !0), this.forEachBatchIds(n, (o, l, c) => {\n l.setFadeAt(o, 0, 0), l.setVisibleAt(o, !1), c.batchedMesh.setVisibleAt(o, !1);\n });\n }, this._onUpdateBefore = () => {\n ur.call(this);\n }, this._onUpdateAfter = () => {\n hr.call(this);\n }, e.addEventListener(\"load-model\", this._onLoadModel), e.addEventListener(\"dispose-model\", this._onDisposeModel), e.addEventListener(\"add-camera\", this._onAddCamera), e.addEventListener(\"delete-camera\", this._onDeleteCamera), e.addEventListener(\"update-before\", this._onUpdateBefore), e.addEventListener(\"update-after\", this._onUpdateAfter), e.addEventListener(\"tile-visibility-change\", this._onTileVisibilityChange);\n const t = this._fadeManager;\n t.onFadeSetStart = () => {\n e.dispatchEvent({ type: \"fade-start\" }), e.dispatchEvent({ type: \"needs-render\" });\n }, t.onFadeSetComplete = () => {\n e.dispatchEvent({ type: \"fade-end\" }), e.dispatchEvent({ type: \"needs-render\" });\n }, t.onFadeComplete = (n, i) => {\n this._fadeMaterialManager.setFade(n.engineData.scene, 0, 0), this.forEachBatchIds(n, (r, o, l) => {\n o.setFadeAt(r, 0, 0), o.setVisibleAt(r, !1), l.batchedMesh.setVisibleAt(r, i);\n }), i || (e.invokeOnePlugin((r) => r !== this && r.setTileVisible && r.setTileVisible(n, !1)), this._fadingOutCount--);\n };\n const s = /* @__PURE__ */ new Map();\n e.cameras.forEach((n) => {\n s.set(n, new K());\n }), e.forEachLoadedModel((n, i) => {\n this._onLoadModel({ scene: n });\n }), this.tiles = e, this._fadeManager = t, this._prevCameraTransforms = s;\n }\n // initializes the batched mesh if it needs to be, dispose if it it's no longer needed\n initBatchedMesh() {\n var t;\n const e = (t = this.tiles.getPluginByName(\"BATCHED_TILES_PLUGIN\")) == null ? void 0 : t.batchedMesh;\n if (e) {\n if (this.batchedMesh === null) {\n this._onBatchedMeshDispose = () => {\n this.batchedMesh.dispose(), this.batchedMesh.removeFromParent(), this.batchedMesh = null, e.removeEventListener(\"dispose\", this._onBatchedMeshDispose);\n };\n const s = e.material.clone();\n s.onBeforeCompile = e.material.onBeforeCompile, this.batchedMesh = new lr(e, s), this.tiles.group.add(this.batchedMesh);\n }\n } else\n this.batchedMesh !== null && (this._onBatchedMeshDispose(), this._onBatchedMeshDispose = null);\n }\n // callback for fading to prevent tiles from being removed until the fade effect has completed\n setTileVisible(e, t) {\n const s = this._fadeManager, n = s.isFading(e);\n if (s.isFadingOut(e) && this._fadingOutCount--, t ? e.internal.depthFromRenderedParent === 1 ? ((e[ws] || this.fadeRootTiles) && this._fadeManager.fadeIn(e), e[ws] = !0) : this._fadeManager.fadeIn(e) : (this._fadingOutCount++, s.fadeOut(e)), this._quickFadeTiles.has(e) && (this._fadeManager.completeFade(e), this._quickFadeTiles.delete(e)), n)\n return !0;\n const i = this._fadeManager.isFading(e);\n return !!(!t && i);\n }\n dispose() {\n const e = this.tiles;\n this._fadeManager.completeAllFades(), this.batchedMesh !== null && this._onBatchedMeshDispose(), e.removeEventListener(\"load-model\", this._onLoadModel), e.removeEventListener(\"dispose-model\", this._onDisposeModel), e.removeEventListener(\"add-camera\", this._onAddCamera), e.removeEventListener(\"delete-camera\", this._onDeleteCamera), e.removeEventListener(\"update-before\", this._onUpdateBefore), e.removeEventListener(\"update-after\", this._onUpdateAfter), e.removeEventListener(\"tile-visibility-change\", this._onTileVisibilityChange), e.forEachLoadedModel((t, s) => {\n this._fadeManager.deleteObject(s), t && (t.visible = !0);\n });\n }\n // helper for iterating over the batch ids for a given tile\n forEachBatchIds(e, t) {\n if (this.initBatchedMesh(), this.batchedMesh) {\n const s = this.tiles.getPluginByName(\"BATCHED_TILES_PLUGIN\"), n = s.getTileBatchIds(e);\n n && n.forEach((i) => {\n t(i, this.batchedMesh, s);\n });\n }\n }\n}\nconst Mt = /* @__PURE__ */ new K(), Us = /* @__PURE__ */ new E(), Ns = /* @__PURE__ */ new E();\nclass dr extends si {\n constructor(...e) {\n super(...e), this.resetDistance = 1e4, this._matricesTextureHandle = null, this._lastCameraPos = new K(), this._forceUpdate = !0, this._matrices = [];\n }\n setMatrixAt(e, t) {\n super.setMatrixAt(e, t), this._forceUpdate = !0;\n const s = this._matrices;\n for (; s.length <= e; )\n s.push(new K());\n s[e].copy(t);\n }\n setInstanceCount(...e) {\n super.setInstanceCount(...e);\n const t = this._matrices;\n for (; t.length > this.instanceCount; )\n t.pop();\n }\n onBeforeRender(e, t, s, n, i, r) {\n super.onBeforeRender(e, t, s, n, i, r), Us.setFromMatrixPosition(s.matrixWorld), Ns.setFromMatrixPosition(this._lastCameraPos);\n const o = this._matricesTexture;\n let l = this._modelViewMatricesTexture;\n if ((!l || l.image.width !== o.image.width || l.image.height !== o.image.height) && (l && l.dispose(), l = o.clone(), l.source = new ni({\n ...l.image,\n data: l.image.data.slice()\n }), this._modelViewMatricesTexture = l), this._forceUpdate || Us.distanceTo(Ns) > this.resetDistance) {\n const c = this._matrices, u = l.image.data;\n for (let h = 0; h < this.maxInstanceCount; h++) {\n const d = c[h];\n d ? Mt.copy(d) : Mt.identity(), Mt.premultiply(this.matrixWorld).premultiply(s.matrixWorldInverse).toArray(u, h * 16);\n }\n l.needsUpdate = !0, this._lastCameraPos.copy(s.matrixWorld), this._forceUpdate = !1;\n }\n this._matricesTextureHandle = this._matricesTexture, this._matricesTexture = this._modelViewMatricesTexture, this.matrixWorld.copy(this._lastCameraPos);\n }\n onAfterRender() {\n this.updateMatrixWorld(), this._matricesTexture = this._matricesTextureHandle, this._matricesTextureHandle = null;\n }\n onAfterShadow(e, t, s, n, i, r) {\n this.onAfterRender(e, null, n, i, r);\n }\n dispose() {\n super.dispose(), this._modelViewMatricesTexture && this._modelViewMatricesTexture.dispose();\n }\n}\nconst ee = /* @__PURE__ */ new Be(), We = [];\nclass pr extends dr {\n constructor(...e) {\n super(...e), this.expandPercent = 0.25, this.maxInstanceExpansionSize = 1 / 0, this._freeGeometryIds = [];\n }\n // Finds a free id that can fit the geometry with the requested ranges. Returns -1 if it could not be found.\n findFreeId(e, t, s) {\n const n = !!this.geometry.index, i = Math.max(n ? e.index.count : -1, s), r = Math.max(e.attributes.position.count, t);\n let o = -1, l = 1 / 0;\n const c = this._freeGeometryIds;\n if (c.forEach((u, h) => {\n const d = this.getGeometryRangeAt(u), { reservedIndexCount: m, reservedVertexCount: f } = d;\n if (m >= i && f >= r) {\n const p = i - m + (r - f);\n p < l && (o = h, l = p);\n }\n }), o !== -1) {\n const u = c[o];\n return c.splice(o, 1), u;\n } else\n return -1;\n }\n // Overrides addGeometry to find an option geometry slot, expand, or optimized if needed\n addGeometry(e, t, s) {\n const n = !!this.geometry.index;\n s = Math.max(n ? e.index.count : -1, s), t = Math.max(e.attributes.position.count, t);\n const { expandPercent: i, _freeGeometryIds: r } = this;\n let o = this.findFreeId(e, t, s);\n if (o !== -1)\n this.setGeometryAt(o, e);\n else {\n const l = () => {\n const h = this.unusedVertexCount < t, d = this.unusedIndexCount < s;\n return h || d;\n }, c = e.index, u = e.attributes.position;\n if (t = Math.max(t, u.count), s = Math.max(s, c ? c.count : 0), l() && (r.forEach((h) => this.deleteGeometry(h)), r.length = 0, this.optimize(), l())) {\n const h = this.geometry.index, d = this.geometry.attributes.position;\n let m, f;\n if (h) {\n const p = Math.ceil(i * h.count);\n m = Math.max(p, s, c.count) + h.count;\n } else\n m = Math.max(this.unusedIndexCount, s);\n if (d) {\n const p = Math.ceil(i * d.count);\n f = Math.max(p, t, u.count) + d.count;\n } else\n f = Math.max(this.unusedVertexCount, t);\n this.setGeometrySize(f, m);\n }\n o = super.addGeometry(e, t, s);\n }\n return o;\n }\n // add an instance and automatically expand the number of instances if necessary\n addInstance(e) {\n if (this.maxInstanceCount === this.instanceCount) {\n const t = Math.ceil(this.maxInstanceCount * (1 + this.expandPercent));\n this.setInstanceCount(Math.min(t, this.maxInstanceExpansionSize));\n }\n return super.addInstance(e);\n }\n // delete an instance, keeping note that the geometry id is now unused\n deleteInstance(e) {\n const t = this.getGeometryIdAt(e);\n return t !== -1 && this._freeGeometryIds.push(t), super.deleteInstance(e);\n }\n // add a function for raycasting per tile\n raycastInstance(e, t, s) {\n const n = this.geometry, i = this.getGeometryIdAt(e);\n ee.material = this.material, ee.geometry.index = n.index, ee.geometry.attributes = n.attributes;\n const r = this.getGeometryRangeAt(i);\n ee.geometry.setDrawRange(r.start, r.count), ee.geometry.boundingBox === null && (ee.geometry.boundingBox = new ct()), ee.geometry.boundingSphere === null && (ee.geometry.boundingSphere = new de()), this.getMatrixAt(e, ee.matrixWorld).premultiply(this.matrixWorld), this.getBoundingBoxAt(i, ee.geometry.boundingBox), this.getBoundingSphereAt(i, ee.geometry.boundingSphere), ee.raycast(t, We);\n for (let o = 0, l = We.length; o < l; o++) {\n const c = We[o];\n c.object = this, c.batchId = e, s.push(c);\n }\n We.length = 0;\n }\n}\nfunction fr(a) {\n return a.r === 1 && a.g === 1 && a.b === 1;\n}\nfunction mr(a) {\n a.needsUpdate = !0, a.onBeforeCompile = (e) => {\n e.vertexShader = e.vertexShader.replace(\n \"#include <common>\",\n /* glsl */\n `\n\t\t\t\t#include <common>\n\t\t\t\tvarying float texture_index;\n\t\t\t\t`\n ).replace(\n \"#include <uv_vertex>\",\n /* glsl */\n `\n\t\t\t\t#include <uv_vertex>\n\t\t\t\ttexture_index = getIndirectIndex( gl_DrawID );\n\t\t\t\t`\n ), e.fragmentShader = e.fragmentShader.replace(\n \"#include <map_pars_fragment>\",\n /* glsl */\n `\n\t\t\t\t#ifdef USE_MAP\n\t\t\t\tprecision highp sampler2DArray;\n\t\t\t\tuniform sampler2DArray map;\n\t\t\t\tvarying float texture_index;\n\t\t\t\t#endif\n\t\t\t\t`\n ).replace(\n \"#include <map_fragment>\",\n /* glsl */\n `\n\t\t\t\t#ifdef USE_MAP\n\t\t\t\t\tdiffuseColor *= texture( map, vec3( vMapUv, texture_index ) );\n\t\t\t\t#endif\n\t\t\t\t`\n );\n };\n}\nconst Ct = new un(new Se()), Ft = new Wt(new Uint8Array([255, 255, 255, 255]), 1, 1);\nFt.needsUpdate = !0;\nclass po {\n constructor(e = {}) {\n if (parseInt(ii) < 170)\n throw new Error(\"BatchedTilesPlugin: Three.js revision 170 or higher required.\");\n e = {\n instanceCount: 500,\n vertexCount: 750,\n indexCount: 2e3,\n expandPercent: 0.25,\n maxInstanceCount: 1 / 0,\n discardOriginalContent: !0,\n textureSize: null,\n material: null,\n renderer: null,\n ...e\n }, this.name = \"BATCHED_TILES_PLUGIN\", this.priority = -1;\n const t = e.renderer.getContext();\n this.instanceCount = e.instanceCount, this.vertexCount = e.vertexCount, this.indexCount = e.indexCount, this.material = e.material ? e.material.clone() : null, this.expandPercent = e.expandPercent, this.maxInstanceCount = Math.min(e.maxInstanceCount, t.getParameter(t.MAX_3D_TEXTURE_SIZE)), this.renderer = e.renderer, this.discardOriginalContent = e.discardOriginalContent, this.textureSize = e.textureSize, this.batchedMesh = null, this.arrayTarget = null, this.tiles = null, this._onLoadModel = null, this._onDisposeModel = null, this._onVisibilityChange = null, this._tileToInstanceId = /* @__PURE__ */ new Map();\n }\n init(e) {\n this._onDisposeModel = ({ scene: t, tile: s }) => {\n this.removeSceneFromBatchedMesh(t, s);\n }, e.addEventListener(\"dispose-model\", this._onDisposeModel), this.tiles = e;\n }\n initTextureArray(e) {\n if (this.arrayTarget !== null || e.material.map === null)\n return;\n const { instanceCount: t, renderer: s, textureSize: n, batchedMesh: i } = this, r = e.material.map, o = {\n colorSpace: r.colorSpace,\n wrapS: r.wrapS,\n wrapT: r.wrapT,\n wrapR: r.wrapS,\n // TODO: Generating mipmaps for the volume every time a new texture is added is extremely slow\n // generateMipmaps: map.generateMipmaps,\n // minFilter: map.minFilter,\n magFilter: r.magFilter\n }, l = new ss(n || r.image.width, n || r.image.height, t);\n Object.assign(l.texture, o), s.initRenderTarget(l), i.material.map = l.texture, this.arrayTarget = l, this._tileToInstanceId.forEach((c) => {\n c.forEach((u) => {\n this.assignTextureToLayer(Ft, u);\n });\n });\n }\n // init the batched mesh if it's not ready\n initBatchedMesh(e) {\n if (this.batchedMesh !== null)\n return;\n const { instanceCount: t, vertexCount: s, indexCount: n, tiles: i } = this, r = this.material ? this.material : new e.material.constructor(), o = new pr(t, t * s, t * n, r);\n o.name = \"BatchTilesPlugin\", o.frustumCulled = !1, i.group.add(o), o.updateMatrixWorld(), mr(o.material), this.batchedMesh = o;\n }\n setTileVisible(e, t) {\n const s = e.engineData.scene;\n if (t && this.addSceneToBatchedMesh(s, e), this._tileToInstanceId.has(e)) {\n this._tileToInstanceId.get(e).forEach((r) => {\n this.batchedMesh.setVisibleAt(r, t);\n });\n const i = this.tiles;\n return t ? i.visibleTiles.add(e) : i.visibleTiles.delete(e), i.dispatchEvent({\n type: \"tile-visibility-change\",\n scene: s,\n tile: e,\n visible: t\n }), !0;\n }\n return !1;\n }\n unloadTileFromGPU(e, t) {\n return !this.discardOriginalContent && this._tileToInstanceId.has(t) ? (this.removeSceneFromBatchedMesh(e, t), !0) : !1;\n }\n // render the given into the given layer\n assignTextureToLayer(e, t) {\n if (!this.arrayTarget)\n return;\n this.expandArrayTargetIfNeeded();\n const { renderer: s } = this, n = s.getRenderTarget();\n s.setRenderTarget(this.arrayTarget, t), Ct.material.map = e, Ct.render(s), s.setRenderTarget(n), Ct.material.map = null, e.dispose();\n }\n // check if the array texture target needs to be expanded\n expandArrayTargetIfNeeded() {\n const { batchedMesh: e, arrayTarget: t, renderer: s } = this, n = Math.min(e.maxInstanceCount, this.maxInstanceCount);\n if (n > t.depth) {\n const i = {\n colorSpace: t.texture.colorSpace,\n wrapS: t.texture.wrapS,\n wrapT: t.texture.wrapT,\n generateMipmaps: t.texture.generateMipmaps,\n minFilter: t.texture.minFilter,\n magFilter: t.texture.magFilter\n }, r = new ss(t.width, t.height, n);\n Object.assign(r.texture, i), s.initRenderTarget(r), s.copyTextureToTexture(t.texture, r.texture), t.dispose(), e.material.map = r.texture, this.arrayTarget = r;\n }\n }\n removeSceneFromBatchedMesh(e, t) {\n if (this._tileToInstanceId.has(t)) {\n const s = this._tileToInstanceId.get(t);\n this._tileToInstanceId.delete(t), s.forEach((n) => {\n this.batchedMesh.deleteInstance(n);\n });\n }\n }\n addSceneToBatchedMesh(e, t) {\n if (this._tileToInstanceId.has(t))\n return;\n const s = [];\n e.traverse((r) => {\n r.isMesh && s.push(r);\n });\n let n = !0;\n s.forEach((r) => {\n if (this.batchedMesh && n) {\n const o = r.geometry.attributes, l = this.batchedMesh.geometry.attributes;\n for (const c in l)\n if (!(c in o)) {\n n = !1;\n return;\n }\n }\n });\n const i = !this.batchedMesh || this.batchedMesh.instanceCount + s.length <= this.maxInstanceCount;\n if (n && i) {\n e.updateMatrixWorld();\n const r = [];\n this._tileToInstanceId.set(t, r), s.forEach((o) => {\n this.initBatchedMesh(o), this.initTextureArray(o);\n const { geometry: l, material: c } = o, { batchedMesh: u, expandPercent: h } = this;\n u.expandPercent = h;\n const d = u.addGeometry(l, this.vertexCount, this.indexCount), m = u.addInstance(d);\n r.push(m), u.setMatrixAt(m, o.matrixWorld), u.setVisibleAt(m, !1), fr(c.color) || (c.color.setHSL(Math.random(), 0.5, 0.5), u.setColorAt(m, c.color));\n const f = c.map;\n f ? this.assignTextureToLayer(f, m) : this.assignTextureToLayer(Ft, m);\n }), this.discardOriginalContent && (t.engineData.textures.forEach((o) => {\n o.image instanceof ImageBitmap && o.image.close();\n }), t.engineData.scene = null, t.engineData.materials = [], t.engineData.geometries = [], t.engineData.textures = []);\n }\n }\n // Override raycasting per tile to defer to the batched mesh\n raycastTile(e, t, s, n) {\n return this._tileToInstanceId.has(e) ? (this._tileToInstanceId.get(e).forEach((r) => {\n this.batchedMesh.raycastInstance(r, s, n);\n }), !0) : !1;\n }\n dispose() {\n const { arrayTarget: e, tiles: t, batchedMesh: s } = this;\n e && e.dispose(), s && (s.material.dispose(), s.geometry.dispose(), s.dispose(), s.removeFromParent()), t.removeEventListener(\"dispose-model\", this._onDisposeModel);\n }\n getTileBatchIds(e) {\n return this._tileToInstanceId.get(e);\n }\n}\nconst At = /* @__PURE__ */ new de(), je = /* @__PURE__ */ new E(), Ee = /* @__PURE__ */ new K(), Vs = /* @__PURE__ */ new K(), It = /* @__PURE__ */ new ri(), gr = /* @__PURE__ */ new Se({ side: rn }), Fs = /* @__PURE__ */ new ct(), vt = 1e5;\nfunction ks(a, e) {\n return a.isBufferGeometry ? (a.boundingSphere === null && a.computeBoundingSphere(), e.copy(a.boundingSphere)) : (Fs.setFromObject(a), Fs.getBoundingSphere(e), e);\n}\nclass fo {\n constructor() {\n this.name = \"TILE_FLATTENING_PLUGIN\", this.priority = -100, this.tiles = null, this.shapes = /* @__PURE__ */ new Map(), this.positionsMap = /* @__PURE__ */ new Map(), this.positionsUpdated = /* @__PURE__ */ new Set(), this.needsUpdate = !1;\n }\n init(e) {\n this.tiles = e, this.needsUpdate = !0, this._updateBeforeCallback = () => {\n this.needsUpdate && (this._updateTiles(), this.needsUpdate = !1);\n }, this._disposeModelCallback = ({ tile: t }) => {\n this.positionsMap.delete(t), this.positionsUpdated.delete(t);\n }, e.addEventListener(\"update-before\", this._updateBeforeCallback), e.addEventListener(\"dispose-model\", this._disposeModelCallback);\n }\n // update tile flattening state if it has not been made visible, yet\n setTileActive(e, t) {\n t && !this.positionsUpdated.has(e) && this._updateTile(e);\n }\n _updateTile(e) {\n const { positionsUpdated: t, positionsMap: s, shapes: n, tiles: i } = this;\n t.add(e);\n const r = e.engineData.scene;\n if (s.has(e)) {\n const o = s.get(e);\n r.traverse((l) => {\n if (l.geometry) {\n const c = o.get(l.geometry);\n c && (l.geometry.attributes.position.array.set(c), l.geometry.attributes.position.needsUpdate = !0);\n }\n });\n } else {\n const o = /* @__PURE__ */ new Map();\n s.set(e, o), r.traverse((l) => {\n l.geometry && o.set(l.geometry, l.geometry.attributes.position.array.slice());\n });\n }\n r.updateMatrixWorld(!0), r.traverse((o) => {\n const { geometry: l } = o;\n l && (Ee.copy(o.matrixWorld), r.parent !== null && Ee.premultiply(i.group.matrixWorldInverse), Vs.copy(Ee).invert(), ks(l, At).applyMatrix4(Ee), n.forEach(({\n shape: c,\n direction: u,\n sphere: h,\n thresholdMode: d,\n threshold: m,\n flattenRange: f\n }) => {\n je.subVectors(At.center, h.center), je.addScaledVector(u, -u.dot(je));\n const p = (At.radius + h.radius) ** 2;\n if (je.lengthSq() > p)\n return;\n const { position: g } = l.attributes, { ray: y } = It;\n y.direction.copy(u).multiplyScalar(-1);\n for (let x = 0, S = g.count; x < S; x++) {\n y.origin.fromBufferAttribute(g, x).applyMatrix4(Ee).addScaledVector(u, vt), It.far = vt;\n const T = It.intersectObject(c)[0];\n if (T) {\n let M = (vt - T.distance) / m;\n const _ = M >= 1;\n (!_ || _ && d === \"flatten\") && (M = Math.min(M, 1), T.point.addScaledVector(y.direction, b.mapLinear(M, 0, 1, -f, 0)), T.point.applyMatrix4(Vs), g.setXYZ(x, ...T.point));\n }\n }\n }));\n }), this.tiles.dispatchEvent({ type: \"needs-render\" });\n }\n _updateTiles() {\n this.positionsUpdated.clear(), this.tiles.activeTiles.forEach((e) => this._updateTile(e));\n }\n // API for updating and shapes to flatten the vertices\n hasShape(e) {\n return this.shapes.has(e);\n }\n addShape(e, t = new E(0, 0, -1), s = {}) {\n if (this.hasShape(e))\n throw new Error(\"TileFlatteningPlugin: Shape is already used.\");\n typeof s == \"number\" && (console.warn('TileFlatteningPlugin: \"addShape\" function signature has changed. Please use an options object, instead.'), s = {\n threshold: s\n }), this.needsUpdate = !0;\n const n = e.clone();\n n.updateMatrixWorld(!0), n.traverse((r) => {\n r.material && (r.material = gr);\n });\n const i = ks(n, new de());\n this.shapes.set(e, {\n shape: n,\n direction: t.clone(),\n sphere: i,\n // \"flatten\": Flattens the vertices above the shape\n // \"none\": leaves the vertices above the shape as they are\n thresholdMode: \"none\",\n // only flatten within this range above the object\n threshold: 1 / 0,\n // the range to flatten vertices in to. 0 is completely flat\n // while 0.1 means a 10cm range.\n flattenRange: 0,\n ...s\n });\n }\n updateShape(e) {\n if (!this.hasShape(e))\n throw new Error(\"TileFlatteningPlugin: Shape is not present.\");\n const { direction: t, threshold: s, thresholdMode: n, flattenRange: i } = this.shapes.get(e);\n this.deleteShape(e), this.addShape(e, t, {\n threshold: s,\n thresholdMode: n,\n flattenRange: i\n });\n }\n deleteShape(e) {\n return this.needsUpdate = !0, this.shapes.delete(e);\n }\n clearShapes() {\n this.shapes.size !== 0 && (this.needsUpdate = !0, this.shapes.clear());\n }\n // reset the vertex positions and remove the update callback\n dispose() {\n this.tiles.removeEventListener(\"before-update\", this._updateBeforeCallback), this.tiles.removeEventListener(\"dispose-model\", this._disposeModelCallback), this.positionsMap.forEach((e) => {\n e.forEach((t, s) => {\n const { position: n } = s.attributes;\n n.array.set(t), n.needsUpdate = !0;\n });\n });\n }\n}\nclass yr extends Ne {\n constructor(e = {}) {\n const {\n subdomains: t = [\"t0\"],\n ...s\n } = e;\n super(s), this.subdomains = t, this.subDomainIndex = 0;\n }\n getUrl(e, t, s) {\n return this.url.replace(/{\\s*subdomain\\s*}/gi, this._getSubdomain()).replace(/{\\s*quadkey\\s*}/gi, this._tileToQuadKey(e, t, s));\n }\n _tileToQuadKey(e, t, s) {\n let n = \"\";\n for (let i = s; i > 0; i--) {\n let r = 0;\n const o = 1 << i - 1;\n (e & o) !== 0 && (r += 1), (t & o) !== 0 && (r += 2), n += r.toString();\n }\n return n;\n }\n _getSubdomain() {\n return this.subDomainIndex = (this.subDomainIndex + 1) % this.subdomains.length, this.subdomains[this.subDomainIndex];\n }\n}\nfunction Lt(a, e, t, s) {\n let [n, i, r, o] = a;\n i += 1e-8, n += 1e-8, o -= 1e-8, r -= 1e-8;\n const l = Math.max(Math.min(e, t.maxLevel), t.minLevel), [c, u, h, d] = t.getTilesInRange(n, i, r, o, l, !0);\n for (let m = c; m <= h; m++)\n for (let f = u; f <= d; f++)\n s(m, f, l);\n}\nfunction xr(a, e, t) {\n const s = new E(), n = {}, i = [], r = a.getAttribute(\"position\");\n a.computeBoundingBox(), a.boundingBox.getCenter(s).applyMatrix4(e), t.getPositionToCartographic(s, n);\n const o = n.lat, l = n.lon;\n let c = 1 / 0, u = 1 / 0, h = 1 / 0, d = -1 / 0, m = -1 / 0, f = -1 / 0;\n for (let y = 0; y < r.count; y++)\n s.fromBufferAttribute(r, y).applyMatrix4(e), t.getPositionToCartographic(s, n), Math.abs(Math.abs(n.lat) - Math.PI / 2) < 1e-5 && (n.lon = l), Math.abs(l - n.lon) > Math.PI && (n.lon += Math.sign(l - n.lon) * Math.PI * 2), Math.abs(o - n.lat) > Math.PI && (n.lat += Math.sign(o - n.lat) * Math.PI * 2), i.push(n.lon, n.lat, n.height), c = Math.min(c, n.lat), d = Math.max(d, n.lat), u = Math.min(u, n.lon), m = Math.max(m, n.lon), h = Math.min(h, n.height), f = Math.max(f, n.height);\n const p = [u, c, m, d], g = [...p, h, f];\n return {\n uv: i,\n range: p,\n region: g\n };\n}\nfunction Gs(a, e, t = null, s = null) {\n let n = 1 / 0, i = 1 / 0, r = 1 / 0, o = -1 / 0, l = -1 / 0, c = -1 / 0;\n const u = [], h = new K();\n a.forEach((m) => {\n h.copy(m.matrixWorld), t && h.premultiply(t);\n const { uv: f, region: p } = xr(m.geometry, h, e);\n u.push(f), n = Math.min(n, p[1]), o = Math.max(o, p[3]), i = Math.min(i, p[0]), l = Math.max(l, p[2]), r = Math.min(r, p[4]), c = Math.max(c, p[5]);\n });\n let d = [i, n, l, o];\n if (s !== null) {\n d = s.clampToBounds([i, n, l, o]);\n const [m, f, p, g] = s.toNormalizedRange(d);\n u.forEach((y) => {\n for (let x = 0, S = y.length; x < S; x += 3) {\n const T = y[x + 0], M = y[x + 1], _ = y[x + 2], [C, v] = s.toNormalizedPoint(T, M);\n y[x + 0] = b.mapLinear(C, m, p, 0, 1), y[x + 1] = b.mapLinear(v, f, g, 0, 1), y[x + 2] = b.mapLinear(_, r, c, 0, 1);\n }\n });\n }\n return {\n uvs: u,\n range: d,\n region: [i, n, l, o, r, c]\n };\n}\nfunction Tr(a, e) {\n const t = new E(), s = [], n = a.getAttribute(\"position\");\n let i = 1 / 0, r = 1 / 0, o = 1 / 0, l = -1 / 0, c = -1 / 0, u = -1 / 0;\n for (let d = 0; d < n.count; d++)\n t.fromBufferAttribute(n, d).applyMatrix4(e), s.push(t.x, t.y, t.z), i = Math.min(i, t.x), l = Math.max(l, t.x), r = Math.min(r, t.y), c = Math.max(c, t.y), o = Math.min(o, t.z), u = Math.max(u, t.z);\n return {\n uv: s,\n range: [i, r, l, c],\n heightRange: [o, u]\n };\n}\nfunction br(a, e) {\n let t = 1 / 0, s = 1 / 0, n = 1 / 0, i = -1 / 0, r = -1 / 0, o = -1 / 0;\n const l = [], c = new K();\n return a.forEach((u) => {\n c.copy(u.matrixWorld), e && c.premultiply(e);\n const { uv: h, range: d, heightRange: m } = Tr(u.geometry, c);\n l.push(h), t = Math.min(t, d[0]), i = Math.max(i, d[2]), s = Math.min(s, d[1]), r = Math.max(r, d[3]), n = Math.min(n, m[0]), o = Math.max(o, m[1]);\n }), l.forEach((u) => {\n for (let h = 0, d = u.length; h < d; h += 3) {\n const m = u[h + 0], f = u[h + 1];\n u[h + 0] = b.mapLinear(m, t, i, 0, 1), u[h + 1] = b.mapLinear(f, s, r, 0, 1);\n }\n }), {\n uvs: l,\n range: [t, s, i, r],\n heightRange: [n, o]\n };\n}\nconst Et = Symbol(\"OVERLAY_PARAMS\");\nfunction _r(a, e) {\n if (a[Et])\n return a[Et];\n const t = {\n layerMaps: { value: [] },\n layerInfo: { value: [] }\n };\n return a[Et] = t, a.defines = {\n ...a.defines || {},\n LAYER_COUNT: 0\n }, a.onBeforeCompile = (s) => {\n e && e(s), s.uniforms = {\n ...s.uniforms,\n ...t\n }, s.vertexShader = s.vertexShader.replace(/void main\\(\\s*\\)\\s*{/, (n) => (\n /* glsl */\n `\n\n\t\t\t\t#pragma unroll_loop_start\n\t\t\t\t\tfor ( int i = 0; i < 10; i ++ ) {\n\n\t\t\t\t\t\t#if UNROLLED_LOOP_INDEX < LAYER_COUNT\n\n\t\t\t\t\t\t\tattribute vec3 layer_uv_UNROLLED_LOOP_INDEX;\n\t\t\t\t\t\t\tvarying vec3 v_layer_uv_UNROLLED_LOOP_INDEX;\n\n\t\t\t\t\t\t#endif\n\n\n\t\t\t\t\t}\n\t\t\t\t#pragma unroll_loop_end\n\n\t\t\t\t${n}\n\n\t\t\t\t#pragma unroll_loop_start\n\t\t\t\t\tfor ( int i = 0; i < 10; i ++ ) {\n\n\t\t\t\t\t\t#if UNROLLED_LOOP_INDEX < LAYER_COUNT\n\n\t\t\t\t\t\t\tv_layer_uv_UNROLLED_LOOP_INDEX = layer_uv_UNROLLED_LOOP_INDEX;\n\n\t\t\t\t\t\t#endif\n\n\t\t\t\t\t}\n\t\t\t\t#pragma unroll_loop_end\n\n\t\t\t`\n )), s.fragmentShader = s.fragmentShader.replace(/void main\\(/, (n) => (\n /* glsl */\n `\n\n\t\t\t\t#if LAYER_COUNT != 0\n\t\t\t\t\tstruct LayerInfo {\n\t\t\t\t\t\tvec3 color;\n\t\t\t\t\t\tfloat opacity;\n\n\t\t\t\t\t\tint alphaMask;\n\t\t\t\t\t\tint alphaInvert;\n\t\t\t\t\t};\n\n\t\t\t\t\tuniform sampler2D layerMaps[ LAYER_COUNT ];\n\t\t\t\t\tuniform LayerInfo layerInfo[ LAYER_COUNT ];\n\t\t\t\t#endif\n\n\t\t\t\t#pragma unroll_loop_start\n\t\t\t\t\tfor ( int i = 0; i < 10; i ++ ) {\n\n\t\t\t\t\t\t#if UNROLLED_LOOP_INDEX < LAYER_COUNT\n\n\t\t\t\t\t\t\tvarying vec3 v_layer_uv_UNROLLED_LOOP_INDEX;\n\n\t\t\t\t\t\t#endif\n\n\t\t\t\t\t}\n\t\t\t\t#pragma unroll_loop_end\n\n\t\t\t\t${n}\n\n\t\t\t`\n )).replace(/#include <color_fragment>/, (n) => (\n /* glsl */\n `\n\n\t\t\t\t${n}\n\n\t\t\t\t#if LAYER_COUNT != 0\n\t\t\t\t{\n\t\t\t\t\tvec4 tint;\n\t\t\t\t\tvec3 layerUV;\n\t\t\t\t\tfloat layerOpacity;\n\t\t\t\t\tfloat wOpacity;\n\t\t\t\t\tfloat wDelta;\n\t\t\t\t\t#pragma unroll_loop_start\n\t\t\t\t\t\tfor ( int i = 0; i < 10; i ++ ) {\n\n\t\t\t\t\t\t\t#if UNROLLED_LOOP_INDEX < LAYER_COUNT\n\n\t\t\t\t\t\t\t\tlayerUV = v_layer_uv_UNROLLED_LOOP_INDEX;\n\t\t\t\t\t\t\t\ttint = texture( layerMaps[ i ], layerUV.xy );\n\n\t\t\t\t\t\t\t\t// discard texture outside 0, 1 on w - offset the stepped value by an epsilon to avoid cases\n\t\t\t\t\t\t\t\t// where wDelta is near 0 (eg a flat surface) at the w boundary, resulting in artifacts on some\n\t\t\t\t\t\t\t\t// hardware.\n\t\t\t\t\t\t\t\twDelta = max( fwidth( layerUV.z ), 1e-7 );\n\t\t\t\t\t\t\t\twOpacity =\n\t\t\t\t\t\t\t\t\tsmoothstep( - wDelta, 0.0, layerUV.z ) *\n\t\t\t\t\t\t\t\t\tsmoothstep( 1.0 + wDelta, 1.0, layerUV.z );\n\n\t\t\t\t\t\t\t\t// apply tint & opacity\n\t\t\t\t\t\t\t\ttint.rgb *= layerInfo[ i ].color;\n\t\t\t\t\t\t\t\ttint.rgba *= layerInfo[ i ].opacity * wOpacity;\n\n\t\t\t\t\t\t\t\t// invert the alpha\n\t\t\t\t\t\t\t\tif ( layerInfo[ i ].alphaInvert > 0 ) {\n\n\t\t\t\t\t\t\t\t\ttint.a = 1.0 - tint.a;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// apply the alpha across all existing layers if alpha mask is true\n\t\t\t\t\t\t\t\tif ( layerInfo[ i ].alphaMask > 0 ) {\n\n\t\t\t\t\t\t\t\t\tdiffuseColor.a *= tint.a;\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\ttint.rgb *= tint.a;\n\t\t\t\t\t\t\t\t\tdiffuseColor = tint + diffuseColor * ( 1.0 - tint.a );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t#endif\n\n\t\t\t\t\t\t}\n\t\t\t\t\t#pragma unroll_loop_end\n\t\t\t\t}\n\t\t\t\t#endif\n\t\t\t`\n ));\n }, t;\n}\nclass In {\n constructor() {\n this.canvas = null, this.context = null, this.range = [0, 0, 1, 1];\n }\n // set the target render texture and the range that represents the full span\n setTarget(e, t) {\n this.canvas = e.image, this.context = e.image.getContext(\"2d\"), this.range = [...t];\n }\n // draw the given texture at the given span with the provided projection\n draw(e, t) {\n const { canvas: s, range: n, context: i } = this, { width: r, height: o } = s, { image: l } = e, c = Math.round(b.mapLinear(t[0], n[0], n[2], 0, r)), u = Math.round(b.mapLinear(t[1], n[1], n[3], 0, o)), h = Math.round(b.mapLinear(t[2], n[0], n[2], 0, r)), d = Math.round(b.mapLinear(t[3], n[1], n[3], 0, o)), m = h - c, f = d - u;\n l instanceof ImageBitmap ? (i.save(), i.translate(c, o - u), i.scale(1, -1), i.drawImage(l, 0, 0, m, f), i.restore()) : i.drawImage(l, c, o - u, m, -f);\n }\n // clear the set target\n clear() {\n const { context: e, canvas: t } = this;\n e.clearRect(0, 0, t.width, t.height);\n }\n}\nclass vn extends fn {\n hasContent(...e) {\n return !0;\n }\n}\nclass Sr extends vn {\n constructor(e) {\n super(), this.tiledImageSource = e, this.tileComposer = new In(), this.resolution = 256;\n }\n hasContent(e, t, s, n, i) {\n const r = this.tiledImageSource.tiling;\n let o = 0;\n return Lt([e, t, s, n], i, r, () => {\n o++;\n }), o !== 0;\n }\n async fetchItem([e, t, s, n, i], r) {\n const o = [e, t, s, n], l = this.tiledImageSource, c = this.tileComposer, u = l.tiling, h = document.createElement(\"canvas\");\n h.width = this.resolution, h.height = this.resolution;\n const d = new Yt(h);\n return d.colorSpace = qt, d.generateMipmaps = !1, d.tokens = [...o, i], await this._markImages(o, i, !1), c.setTarget(d, o), c.clear(16777215, 0), Lt(o, i, u, (m, f, p) => {\n const g = u.getTileBounds(m, f, p, !0, !1), y = l.get(m, f, p);\n c.draw(y, g);\n }), d;\n }\n disposeItem(e) {\n e.dispose();\n const [t, s, n, i, r] = e.tokens;\n this._markImages([t, s, n, i], r, !0);\n }\n dispose() {\n super.dispose(), this.tiledImageSource.dispose();\n }\n _markImages(e, t, s = !1) {\n const n = this.tiledImageSource, i = n.tiling, r = [];\n Lt(e, t, i, (l, c, u) => {\n s ? n.release(l, c, u) : r.push(n.lock(l, c, u));\n });\n const o = r.filter((l) => l instanceof Promise);\n return o.length !== 0 ? Promise.all(o) : null;\n }\n}\nconst wt = /* @__PURE__ */ new E(), Ye = /* @__PURE__ */ new E();\nfunction Mr(a, e, t) {\n a.getCartographicToPosition(e, t, 0, wt), a.getCartographicToPosition(e + 0.01, t, 0, Ye);\n const n = wt.distanceTo(Ye);\n return a.getCartographicToPosition(e, t + 0.01, 0, Ye), wt.distanceTo(Ye) / n;\n}\nclass Cr extends vn {\n constructor({\n geojson: e = null,\n url: t = null,\n // URL or GeoJson object can be provided\n resolution: s = 256,\n pointRadius: n = 6,\n strokeStyle: i = \"white\",\n strokeWidth: r = 2,\n fillStyle: o = \"rgba( 255, 255, 255, 0.5 )\",\n ...l\n } = {}) {\n super(l), this.geojson = e, this.url = t, this.resolution = s, this.pointRadius = n, this.strokeStyle = i, this.strokeWidth = r, this.fillStyle = o, this.features = null, this.featureBounds = /* @__PURE__ */ new Map(), this.contentBounds = null, this.projection = new re(), this.fetchData = (...c) => fetch(...c);\n }\n async init() {\n const { geojson: e, url: t } = this;\n if (!e && t) {\n const s = await this.fetchData(t);\n this.geojson = await s.json();\n }\n this._updateCache(!0);\n }\n hasContent(e, t, s, n) {\n const i = [e, t, s, n].map((r) => r * Math.RAD2DEG);\n return this._boundsIntersectBounds(i, this.contentBounds);\n }\n // main fetch per region -> returns CanvasTexture\n async fetchItem(e, t) {\n const s = document.createElement(\"canvas\"), n = new Yt(s);\n return n.colorSpace = qt, n.generateMipmaps = !1, this._drawToCanvas(s, e), n.needsUpdate = !0, n;\n }\n disposeItem(e) {\n e.dispose();\n }\n redraw() {\n this._updateCache(!0), this.forEachItem((e, t) => {\n this._drawToCanvas(e.image, t), e.needsUpdate = !0;\n });\n }\n _updateCache(e = !1) {\n const { geojson: t, featureBounds: s } = this;\n if (!t || this.features && !e)\n return;\n s.clear();\n let n = 1 / 0, i = 1 / 0, r = -1 / 0, o = -1 / 0;\n this.features = this._featuresFromGeoJSON(t), this.features.forEach((l) => {\n const c = this._getFeatureBounds(l);\n s.set(l, c);\n const [u, h, d, m] = c;\n n = Math.min(n, u), i = Math.min(i, h), r = Math.max(r, d), o = Math.max(o, m);\n }), this.contentBounds = [n, i, r, o];\n }\n _drawToCanvas(e, t) {\n this._updateCache();\n const [s, n, i, r] = t, { projection: o, resolution: l, features: c } = this;\n e.width = l, e.height = l;\n const u = o.convertNormalizedToLongitude(s), h = o.convertNormalizedToLatitude(n), d = o.convertNormalizedToLongitude(i), m = o.convertNormalizedToLatitude(r), f = [\n u * b.RAD2DEG,\n h * b.RAD2DEG,\n d * b.RAD2DEG,\n m * b.RAD2DEG\n ], p = e.getContext(\"2d\");\n for (let g = 0; g < c.length; g++) {\n const y = c[g];\n this._featureIntersectsTile(y, f) && this._drawFeatureOnCanvas(p, y, f, e.width, e.height);\n }\n }\n // bounding box quick test in projected units\n _featureIntersectsTile(e, t) {\n const s = this.featureBounds.get(e);\n return s ? this._boundsIntersectBounds(s, t) : !1;\n }\n _boundsIntersectBounds(e, t) {\n const [s, n, i, r] = e, [o, l, c, u] = t;\n return !(i < o || s > c || r < l || n > u);\n }\n _getFeatureBounds(e) {\n const { geometry: t } = e;\n if (!t)\n return null;\n const { type: s, coordinates: n } = t;\n let i = 1 / 0, r = 1 / 0, o = -1 / 0, l = -1 / 0;\n const c = (u, h) => {\n i = Math.min(i, u), o = Math.max(o, u), r = Math.min(r, h), l = Math.max(l, h);\n };\n return s === \"Point\" ? c(n[0], n[1]) : s === \"MultiPoint\" || s === \"LineString\" ? n.forEach((u) => c(u[0], u[1])) : s === \"MultiLineString\" || s === \"Polygon\" ? n.forEach((u) => u.forEach((h) => c(h[0], h[1]))) : s === \"MultiPolygon\" && n.forEach(\n (u) => u.forEach((h) => h.forEach((d) => c(d[0], d[1])))\n ), [i, r, o, l];\n }\n // Normalize top-level geojson into an array of Feature objects\n _featuresFromGeoJSON(e) {\n const t = e.type, s = /* @__PURE__ */ new Set([\"Point\", \"MultiPoint\", \"LineString\", \"MultiLineString\", \"Polygon\", \"MultiPolygon\"]);\n return t === \"FeatureCollection\" ? e.features : t === \"Feature\" ? [e] : t === \"GeometryCollection\" ? e.geometries.map((n) => ({ type: \"Feature\", geometry: n, properties: {} })) : s.has(t) ? [{ type: \"Feature\", geometry: e, properties: {} }] : [];\n }\n // draw feature on canvas ( assumes intersects already )\n _drawFeatureOnCanvas(e, t, s, n, i) {\n const { geometry: r = null, properties: o = {} } = t;\n if (!r)\n return;\n const [l, c, u, h] = s, d = o.strokeStyle || this.strokeStyle, m = o.fillStyle || this.fillStyle, f = o.pointRadius || this.pointRadius, p = o.strokeWidth || this.strokeWidth;\n e.save(), e.strokeStyle = d, e.fillStyle = m, e.lineWidth = p;\n const g = new Array(2), y = (T, M, _ = g) => {\n const C = b.mapLinear(T, l, u, 0, n), v = i - b.mapLinear(M, c, h, 0, i);\n return _[0] = Math.round(C), _[1] = Math.round(v), _;\n }, x = (T, M) => {\n const _ = M * b.DEG2RAD, C = T * b.DEG2RAD, v = (h - c) / i;\n return (u - l) / n / v * Mr(di, _, C);\n }, S = r.type;\n if (S === \"Point\") {\n const [T, M] = r.coordinates, [_, C] = y(T, M), v = x(T, M);\n e.beginPath(), e.ellipse(_, C, f / v, f, 0, 0, Math.PI * 2), e.fill(), e.stroke();\n } else S === \"MultiPoint\" ? r.coordinates.forEach(([T, M]) => {\n const [_, C] = y(T, M), v = x(T, M);\n e.beginPath(), e.ellipse(_, C, f / v, f, 0, 0, Math.PI * 2), e.fill(), e.stroke();\n }) : S === \"LineString\" ? (e.beginPath(), r.coordinates.forEach(([T, M], _) => {\n const [C, v] = y(T, M);\n _ === 0 ? e.moveTo(C, v) : e.lineTo(C, v);\n }), e.stroke()) : S === \"MultiLineString\" ? (e.beginPath(), r.coordinates.forEach((T) => {\n T.forEach(([M, _], C) => {\n const [v, P] = y(M, _);\n C === 0 ? e.moveTo(v, P) : e.lineTo(v, P);\n });\n }), e.stroke()) : S === \"Polygon\" ? (e.beginPath(), r.coordinates.forEach((T, M) => {\n T.forEach(([_, C], v) => {\n const [P, R] = y(_, C);\n v === 0 ? e.moveTo(P, R) : e.lineTo(P, R);\n }), e.closePath();\n }), e.fill(\"evenodd\"), e.stroke()) : S === \"MultiPolygon\" && r.coordinates.forEach((T) => {\n e.beginPath(), T.forEach((M, _) => {\n M.forEach(([C, v], P) => {\n const [R, V] = y(C, v);\n P === 0 ? e.moveTo(R, V) : e.lineTo(R, V);\n }), e.closePath();\n }), e.fill(\"evenodd\"), e.stroke();\n });\n e.restore();\n }\n}\nconst _e = /* @__PURE__ */ new K(), Xe = /* @__PURE__ */ new E(), Pt = /* @__PURE__ */ new E(), Rt = /* @__PURE__ */ new E(), se = /* @__PURE__ */ new E(), Ar = /* @__PURE__ */ new ct(), zs = Symbol(\"SPLIT_TILE_DATA\"), $e = Symbol(\"SPLIT_HASH\"), Qe = Symbol(\"ORIGINAL_REFINE\");\nclass mo {\n get enableTileSplitting() {\n return this._enableTileSplitting;\n }\n set enableTileSplitting(e) {\n this._enableTileSplitting !== e && (this._enableTileSplitting = e, this._markNeedsUpdate());\n }\n constructor(e = {}) {\n const {\n overlays: t = [],\n resolution: s = 256,\n enableTileSplitting: n = !0\n } = e;\n this.name = \"IMAGE_OVERLAY_PLUGIN\", this.priority = -15, this.resolution = s, this._enableTileSplitting = n, this.overlays = [], this.needsUpdate = !1, this.tiles = null, this.tileComposer = null, this.tileControllers = /* @__PURE__ */ new Map(), this.overlayInfo = /* @__PURE__ */ new Map(), this.meshParams = /* @__PURE__ */ new WeakMap(), this.pendingTiles = /* @__PURE__ */ new Map(), this.processedTiles = /* @__PURE__ */ new Set(), this.processQueue = null, this._onUpdateAfter = null, this._onTileDownloadStart = null, this._virtualChildResetId = 0, this._bytesUsed = /* @__PURE__ */ new WeakMap(), t.forEach((i) => {\n this.addOverlay(i);\n });\n }\n // plugin functions\n init(e) {\n const t = new In(), s = new xi();\n s.maxJobs = 10, s.priorityCallback = (n, i) => {\n const r = n.tile, o = i.tile, l = e.visibleTiles.has(r), c = e.visibleTiles.has(o);\n return l !== c ? l ? 1 : -1 : e.downloadQueue.priorityCallback(r, o);\n }, this.tiles = e, this.tileComposer = t, this.processQueue = s, e.forEachLoadedModel((n, i) => {\n this._processTileModel(n, i, !0);\n }), this._onUpdateAfter = async () => {\n let n = !1;\n if (this.overlayInfo.forEach((i, r) => {\n if (!!r.frame != !!i.frame || r.frame && i.frame && !i.frame.equals(r.frame)) {\n const o = i.order;\n this.deleteOverlay(r), this.addOverlay(r, o), n = !0;\n }\n }), n) {\n const i = s.maxJobs;\n let r = 0;\n s.items.forEach((o) => {\n e.visibleTiles.has(o.tile) && r++;\n }), s.maxJobs = r + s.currJobs, s.tryRunJobs(), s.maxJobs = i, this.needsUpdate = !0;\n }\n if (this.needsUpdate) {\n this.needsUpdate = !1;\n const { overlays: i, overlayInfo: r } = this;\n i.sort((o, l) => r.get(o).order - r.get(l).order), this.processedTiles.forEach((o) => {\n this._updateLayers(o);\n }), this.resetVirtualChildren(!this.enableTileSplitting), e.recalculateBytesUsed(), e.dispatchEvent({ type: \"needs-rerender\" });\n }\n }, this._onTileDownloadStart = ({ tile: n, url: i }) => {\n !/\\.json$/i.test(i) && !/\\.subtree/i.test(i) && (this.processedTiles.add(n), this._initTileOverlayInfo(n));\n }, e.addEventListener(\"update-after\", this._onUpdateAfter), e.addEventListener(\"tile-download-start\", this._onTileDownloadStart), this.overlays.forEach((n) => {\n this._initOverlay(n);\n });\n }\n _removeVirtualChildren(e) {\n if (!(Qe in e))\n return;\n const { tiles: t } = this, { virtualChildCount: s } = e.internal, n = e.children.length, i = n - s;\n for (let r = i; r < n; r++) {\n const o = e.children[r];\n t.processNodeQueue.remove(o), t.lruCache.remove(o), o.parent = null;\n }\n e.children.length -= s, e.internal.virtualChildCount = 0, e.refine = e[Qe], delete e[Qe], delete e[$e];\n }\n disposeTile(e) {\n const { overlayInfo: t, tileControllers: s, processQueue: n, pendingTiles: i, processedTiles: r } = this;\n r.delete(e), this._removeVirtualChildren(e), s.has(e) && (s.get(e).abort(), s.delete(e), i.delete(e)), t.forEach((({ tileInfo: o }, l) => {\n if (o.has(e)) {\n const { meshInfo: c, range: u } = o.get(e);\n u !== null && l.releaseTexture(u, e), o.delete(e), c.clear();\n }\n })), n.removeByFilter((o) => o.tile === e);\n }\n calculateBytesUsed(e) {\n const { overlayInfo: t } = this, s = this._bytesUsed;\n let n = null;\n return t.forEach(({ tileInfo: i }, r) => {\n if (i.has(e)) {\n const { target: o } = i.get(e);\n n = n || 0, n += pi(o);\n }\n }), n !== null ? (s.set(e, n), n) : s.has(e) ? s.get(e) : 0;\n }\n processTileModel(e, t) {\n return this._processTileModel(e, t);\n }\n async _processTileModel(e, t, s = !1) {\n const { tileControllers: n, processedTiles: i, pendingTiles: r } = this;\n n.set(t, new AbortController()), s || r.set(t, e), i.add(t), this._wrapMaterials(e), this._initTileOverlayInfo(t), await this._initTileSceneOverlayInfo(e, t), this.expandVirtualChildren(e, t), this._updateLayers(t), r.delete(t);\n }\n dispose() {\n const { tiles: e } = this;\n [...this.overlays].forEach((s) => {\n this.deleteOverlay(s);\n }), this.processedTiles.forEach((s) => {\n this._updateLayers(s), this.disposeTile(s);\n }), e.removeEventListener(\"update-after\", this._onUpdateAfter), this.resetVirtualChildren(!0);\n }\n getAttributions(e) {\n this.overlays.forEach((t) => {\n t.opacity > 0 && t.getAttributions(e);\n });\n }\n parseToMesh(e, t, s, n) {\n if (s === \"image_overlay_tile_split\")\n return t[zs];\n }\n async resetVirtualChildren(e = !1) {\n this._virtualChildResetId++;\n const t = this._virtualChildResetId;\n if (await Promise.all(this.overlays.map((i) => i.whenReady())), t !== this._virtualChildResetId)\n return;\n const { tiles: s } = this, n = [];\n this.processedTiles.forEach((i) => {\n $e in i && n.push(i);\n }), n.sort((i, r) => r.internal.depth - i.internal.depth), n.forEach((i) => {\n const r = i.engineData.scene.clone();\n r.updateMatrixWorld(), (e || i[$e] !== this._getSplitVectors(r, i).hash) && this._removeVirtualChildren(i);\n }), e || s.forEachLoadedModel((i, r) => {\n this.expandVirtualChildren(i, r);\n });\n }\n _getSplitVectors(e, t, s = Pt) {\n const { tiles: n, overlayInfo: i } = this, r = new ct();\n r.setFromObject(e), r.getCenter(s);\n const o = [], l = [];\n i.forEach(({ tileInfo: u }, h) => {\n const d = u.get(t);\n if (d && d.target && h.shouldSplit(d.range, t)) {\n h.frame ? se.set(0, 0, 1).transformDirection(h.frame) : (n.ellipsoid.getPositionToNormal(s, se), se.length() < 1e-6 && se.set(1, 0, 0));\n const m = `${se.x.toFixed(3)},${se.y.toFixed(3)},${se.z.toFixed(3)}_`;\n l.includes(m) || l.push(m);\n const f = Xe.set(0, 0, 1);\n Math.abs(se.dot(f)) > 1 - 1e-4 && f.set(1, 0, 0);\n const p = new E().crossVectors(se, f).normalize(), g = new E().crossVectors(se, p).normalize();\n o.push(p, g);\n }\n });\n const c = [];\n for (; o.length !== 0; ) {\n const u = o.pop().clone(), h = u.clone();\n for (let d = 0; d < o.length; d++) {\n const m = o[d], f = u.dot(m);\n Math.abs(f) > Math.cos(Math.PI / 8) && (h.addScaledVector(m, Math.sign(f)), u.copy(h).normalize(), o.splice(d, 1), d--);\n }\n c.push(h.normalize());\n }\n return { directions: c, hash: l.join(\"\") };\n }\n async expandVirtualChildren(e, t) {\n const { refine: s } = t, n = s === \"REPLACE\" && t.children.length === 0 || s === \"ADD\", i = t.internal.virtualChildCount !== 0;\n if (this.enableTileSplitting === !1 || !n || i)\n return;\n const r = e.clone();\n r.updateMatrixWorld();\n const { directions: o, hash: l } = this._getSplitVectors(r, t, Pt);\n if (o.length === 0)\n return;\n t[$e] = l;\n const c = new xn();\n c.attributeList = (h) => !/^layer_uv_\\d+/.test(h), o.map((h) => {\n c.addSplitOperation((d, m, f, p, g, y) => (jt.getInterpolatedAttribute(d.attributes.position, m, f, p, g, Xe), Xe.applyMatrix4(y).sub(Pt).dot(h)));\n });\n const u = [];\n c.forEachSplitPermutation(() => {\n const h = c.clipObject(r);\n h.matrix.premultiply(t.engineData.transformInverse).decompose(h.position, h.quaternion, h.scale);\n const d = [];\n if (h.traverse((f) => {\n if (f.isMesh) {\n const p = f.material.clone();\n f.material = p;\n for (const g in p) {\n const y = p[g];\n if (y && y.isTexture && y.source.data instanceof ImageBitmap) {\n const x = document.createElement(\"canvas\");\n x.width = y.image.width, x.height = y.image.height;\n const S = x.getContext(\"2d\");\n S.scale(1, -1), S.drawImage(y.source.data, 0, 0, x.width, -x.height);\n const T = new Yt(x);\n T.mapping = y.mapping, T.wrapS = y.wrapS, T.wrapT = y.wrapT, T.minFilter = y.minFilter, T.magFilter = y.magFilter, T.format = y.format, T.type = y.type, T.anisotropy = y.anisotropy, T.colorSpace = y.colorSpace, T.generateMipmaps = y.generateMipmaps, p[g] = T;\n }\n }\n d.push(f);\n }\n }), d.length === 0)\n return;\n const m = {};\n if (t.boundingVolume.region && (m.region = Gs(d, this.tiles.ellipsoid).region), t.boundingVolume.box || t.boundingVolume.sphere) {\n Ar.setFromObject(h, !0).getCenter(Rt);\n let f = 0;\n h.traverse((p) => {\n const g = p.geometry;\n if (g) {\n const y = g.attributes.position;\n for (let x = 0, S = y.count; x < S; x++) {\n const T = Xe.fromBufferAttribute(y, x).applyMatrix4(p.matrixWorld).distanceToSquared(Rt);\n f = Math.max(f, T);\n }\n }\n }), m.sphere = [...Rt, Math.sqrt(f)];\n }\n u.push({\n internal: { isVirtual: !0 },\n refine: \"REPLACE\",\n geometricError: t.geometricError * 0.5,\n boundingVolume: m,\n content: { uri: \"./child.image_overlay_tile_split\" },\n children: [],\n [zs]: h\n });\n }), t[Qe] = t.refine, t.refine = \"REPLACE\", t.children.push(...u), t.internal.virtualChildCount += u.length;\n }\n fetchData(e, t) {\n if (/image_overlay_tile_split/.test(e))\n return new ArrayBuffer();\n }\n // public\n addOverlay(e, t = null) {\n const { tiles: s, overlays: n, overlayInfo: i } = this;\n t === null && (t = n.reduce((o, l) => Math.max(o, l.order + 1), 0));\n const r = new AbortController();\n n.push(e), i.set(e, {\n order: t,\n uniforms: {},\n tileInfo: /* @__PURE__ */ new Map(),\n controller: r,\n frame: e.frame ? e.frame.clone() : null\n }), s !== null && this._initOverlay(e);\n }\n setOverlayOrder(e, t) {\n this.overlays.indexOf(e) !== -1 && (this.overlayInfo.get(e).order = t, this._markNeedsUpdate());\n }\n deleteOverlay(e) {\n const { overlays: t, overlayInfo: s, processQueue: n, processedTiles: i } = this, r = t.indexOf(e);\n if (r !== -1) {\n const { tileInfo: o, controller: l } = s.get(e);\n i.forEach((c) => {\n if (!o.has(c))\n return;\n const {\n meshInfo: u,\n range: h\n } = o.get(c);\n h !== null && e.releaseTexture(h, c), o.delete(c), u.clear();\n }), o.clear(), s.delete(e), l.abort(), n.removeByFilter((c) => c.overlay === e), t.splice(r, 1), i.forEach((c) => {\n this._updateLayers(c);\n }), this._markNeedsUpdate();\n }\n }\n // initialize the overlay to use the right fetch options, load all data for existing tiles\n _initOverlay(e) {\n const { tiles: t } = this;\n e.isInitialized || (e.init(), e.whenReady().then(() => {\n e.setResolution(this.resolution);\n const i = e.fetch.bind(e);\n e.fetch = (...r) => t.downloadQueue.add({ priority: -performance.now() }, () => i(...r));\n }));\n const s = [], n = async (i, r) => {\n this._initTileOverlayInfo(r, e);\n const o = this._initTileSceneOverlayInfo(i, r, e);\n s.push(o), await o, this._updateLayers(r);\n };\n t.forEachLoadedModel((i, r) => {\n n(i, r);\n }), this.pendingTiles.forEach((i, r) => {\n n(i, r);\n }), Promise.all(s).then(() => {\n this._markNeedsUpdate();\n });\n }\n // wrap all materials in the given scene wit the overlay material shader\n _wrapMaterials(e) {\n e.traverse((t) => {\n if (t.material) {\n const s = _r(t.material, t.material.onBeforeCompile);\n this.meshParams.set(t, s);\n }\n });\n }\n // Initialize per-tile overlay information. This function triggers an async function but\n // does not need to be awaited for use since it's just locking textures which are awaited later.\n _initTileOverlayInfo(e, t = this.overlays) {\n if (Array.isArray(t)) {\n t.forEach((i) => this._initTileOverlayInfo(e, i));\n return;\n }\n const { overlayInfo: s } = this;\n if (s.get(t).tileInfo.has(e))\n return;\n const n = {\n range: null,\n target: null,\n meshInfo: /* @__PURE__ */ new Map()\n };\n if (s.get(t).tileInfo.set(e, n), t.isReady && !t.isPlanarProjection) {\n if (e.boundingVolume.region) {\n const [i, r, o, l] = e.boundingVolume.region, c = t.projection.toNormalizedRange([i, r, o, l]);\n n.range = c, t.lockTexture(c, e);\n }\n }\n }\n // initialize the scene meshes\n async _initTileSceneOverlayInfo(e, t, s = this.overlays) {\n if (Array.isArray(s))\n return Promise.all(s.map((T) => this._initTileSceneOverlayInfo(e, t, T)));\n const { tiles: n, overlayInfo: i, tileControllers: r, processQueue: o } = this, { ellipsoid: l } = n, { controller: c, tileInfo: u } = i.get(s), h = r.get(t);\n if (s.isReady || await s.whenReady(), c.signal.aborted || h.signal.aborted)\n return;\n const d = [];\n e.updateMatrixWorld(), e.traverse((T) => {\n T.isMesh && d.push(T);\n });\n const { aspectRatio: m, projection: f } = s, p = u.get(t);\n let g, y, x;\n if (s.isPlanarProjection) {\n _e.makeScale(1 / m, 1, 1).multiply(s.frame), e.parent !== null && _e.multiply(n.group.matrixWorldInverse);\n let T;\n ({ range: g, uvs: y, heightRange: T } = br(d, _e)), x = !(T[0] > 1 || T[1] < 0);\n } else\n _e.identity(), e.parent !== null && _e.copy(n.group.matrixWorldInverse), { range: g, uvs: y } = Gs(d, l, _e, f), g = f.toNormalizedRange(g), x = !0;\n p.range === null ? (p.range = g, s.lockTexture(g, t)) : g = p.range;\n let S = null;\n x && s.hasContent(g, t) && (S = await o.add({ tile: t, overlay: s }, async () => {\n if (c.signal.aborted || h.signal.aborted)\n return null;\n const T = await s.getTexture(g, t);\n return c.signal.aborted || h.signal.aborted ? null : T;\n }).catch((T) => {\n if (!(T instanceof Ti))\n throw T;\n })), p.target = S, d.forEach((T, M) => {\n const _ = new Float32Array(y[M]), C = new J(_, 3);\n p.meshInfo.set(T, { attribute: C });\n });\n }\n _updateLayers(e) {\n const { overlayInfo: t, overlays: s, tileControllers: n, meshParams: i } = this, r = n.get(e);\n if (this.tiles.recalculateBytesUsed(e), !(!r || r.signal.aborted)) {\n if (s.length === 0) {\n const o = e.engineData && e.engineData.scene;\n o && o.traverse((l) => {\n if (l.material && i.has(l)) {\n const c = i.get(l);\n c.layerMaps.length = 0, c.layerInfo.length = 0, l.material.defines.LAYER_COUNT = 0, l.material.needsUpdate = !0;\n }\n });\n return;\n }\n s.forEach((o, l) => {\n const { tileInfo: c } = t.get(o), { meshInfo: u, target: h } = c.get(e);\n u.forEach(({ attribute: d }, m) => {\n const { geometry: f, material: p } = m, g = i.get(m), y = `layer_uv_${l}`;\n f.getAttribute(y) !== d && (f.setAttribute(y, d), f.dispose()), g.layerMaps.length = s.length, g.layerInfo.length = s.length, g.layerMaps.value[l] = h !== null ? h : null, g.layerInfo.value[l] = o, p.defines[`LAYER_${l}_EXISTS`] = +(h !== null), p.defines[`LAYER_${l}_ALPHA_INVERT`] = Number(o.alphaInvert), p.defines[`LAYER_${l}_ALPHA_MASK`] = Number(o.alphaMask), p.defines.LAYER_COUNT = s.length, p.needsUpdate = !0;\n });\n });\n }\n }\n _markNeedsUpdate() {\n this.needsUpdate === !1 && (this.needsUpdate = !0, this.tiles !== null && this.tiles.dispatchEvent({ type: \"needs-update\" }));\n }\n}\nclass Ln {\n get isPlanarProjection() {\n return !!this.frame;\n }\n constructor(e = {}) {\n const {\n opacity: t = 1,\n color: s = 16777215,\n frame: n = null,\n preprocessURL: i = null,\n alphaMask: r = !1,\n alphaInvert: o = !1\n } = e;\n this.preprocessURL = i, this.opacity = t, this.color = new on(s), this.frame = n !== null ? n.clone() : null, this.alphaMask = r, this.alphaInvert = o, this._whenReady = null, this.isReady = !1, this.isInitialized = !1;\n }\n init() {\n this.isInitialized = !0, this._whenReady = this._init().then(() => this.isReady = !0);\n }\n whenReady() {\n return this._whenReady;\n }\n // overrideable\n _init() {\n }\n fetch(e, t = {}) {\n return this.preprocessURL && (e = this.preprocessURL(e)), fetch(e, t);\n }\n getAttributions(e) {\n }\n hasContent(e, t) {\n return !1;\n }\n async getTexture(e, t) {\n return null;\n }\n async lockTexture(e, t) {\n return null;\n }\n releaseTexture(e, t) {\n }\n setResolution(e) {\n }\n shouldSplit(e, t) {\n return !1;\n }\n}\nclass Ce extends Ln {\n get tiling() {\n return this.imageSource.tiling;\n }\n get projection() {\n return this.tiling.projection;\n }\n get aspectRatio() {\n return this.tiling && this.isReady ? this.tiling.aspectRatio : 1;\n }\n get fetchOptions() {\n return this.imageSource.fetchOptions;\n }\n set fetchOptions(e) {\n this.imageSource.fetchOptions = e;\n }\n constructor(e = {}) {\n const { imageSource: t = null, ...s } = e;\n super(s), this.imageSource = t, this.regionImageSource = null;\n }\n _init() {\n return this._initImageSource().then(() => {\n this.imageSource.fetchData = (...e) => this.fetch(...e), this.regionImageSource = new Sr(this.imageSource);\n });\n }\n _initImageSource() {\n return this.imageSource.init();\n }\n // Texture acquisition API implementations\n calculateLevel(e, t) {\n if (this.isPlanarProjection) {\n const [s, n, i, r] = e, o = i - s, l = r - n;\n let c = 0;\n const u = this.regionImageSource.resolution, h = this.tiling.maxLevel;\n for (; c < h; c++) {\n const d = u / o, m = u / l, { pixelWidth: f, pixelHeight: p } = this.tiling.getLevel(c);\n if (f >= d || p >= m)\n break;\n }\n return c;\n } else\n return t.internal.depthFromRenderedParent - 1;\n }\n hasContent(e, t) {\n return this.regionImageSource.hasContent(...e, this.calculateLevel(e, t));\n }\n getTexture(e, t) {\n return this.regionImageSource.get(...e, this.calculateLevel(e, t));\n }\n lockTexture(e, t) {\n return this.regionImageSource.lock(...e, this.calculateLevel(e, t));\n }\n releaseTexture(e, t) {\n this.regionImageSource.release(...e, this.calculateLevel(e, t));\n }\n setResolution(e) {\n this.regionImageSource.resolution = e;\n }\n shouldSplit(e, t) {\n return this.tiling.maxLevel > this.calculateLevel(e, t);\n }\n}\nclass go extends Ce {\n constructor(e = {}) {\n super(e), this.imageSource = new Ne(e);\n }\n}\nclass yo extends Ln {\n get projection() {\n return this.imageSource.projection;\n }\n get aspectRatio() {\n return 2;\n }\n get pointRadius() {\n return this.imageSource.pointRadius;\n }\n set pointRadius(e) {\n this.imageSource.pointRadius = e;\n }\n get strokeStyle() {\n return this.imageSource.strokeStyle;\n }\n set strokeStyle(e) {\n this.imageSource.strokeStyle = e;\n }\n get strokeWidth() {\n return this.imageSource.strokeWidth;\n }\n set strokeWidth(e) {\n this.imageSource.strokeWidth = e;\n }\n get fillStyle() {\n return this.imageSource.fillStyle;\n }\n set fillStyle(e) {\n this.imageSource.fillStyle = e;\n }\n get geojson() {\n return this.imageSource.geojson;\n }\n set geojson(e) {\n this.imageSource.geojson = e;\n }\n constructor(e = {}) {\n super(e), this.imageSource = new Cr(e);\n }\n _init() {\n return this.imageSource.init();\n }\n hasContent(e) {\n return this.imageSource.hasContent(...e);\n }\n getTexture(e) {\n return this.imageSource.get(...e);\n }\n lockTexture(e) {\n return this.imageSource.lock(...e);\n }\n releaseTexture(e) {\n this.imageSource.release(...e);\n }\n setResolution(e) {\n this.imageSource.resolution = e;\n }\n shouldSplit(e, t) {\n return !0;\n }\n redraw() {\n this.imageSource.redraw();\n }\n}\nclass xo extends Ce {\n constructor(e = {}) {\n super(e), this.imageSource = new yn(e);\n }\n}\nclass To extends Ce {\n constructor(e = {}) {\n super(e), this.imageSource = new gn(e);\n }\n}\nclass bo extends Ce {\n constructor(e = {}) {\n super(e), this.imageSource = new Xt(e);\n }\n}\nclass _o extends Ce {\n constructor(e = {}) {\n super(e);\n const { apiToken: t, autoRefreshToken: s, assetId: n } = e;\n this.options = e, this.assetId = n, this.auth = new Gn({ apiToken: t, autoRefreshToken: s }), this.auth.authURL = `https://api.cesium.com/v1/assets/${n}/endpoint`, this._attributions = [], this.externalType = !1;\n }\n _initImageSource() {\n return this.auth.refreshToken().then(async (e) => {\n if (this._attributions = e.attributions.map((t) => ({\n value: t.html,\n type: \"html\",\n collapsible: t.collapsible\n })), e.type !== \"IMAGERY\")\n throw new Error(\"CesiumIonOverlay: Only IMAGERY is supported as overlay type.\");\n switch (this.externalType = !!e.externalType, e.externalType) {\n case \"GOOGLE_2D_MAPS\": {\n const { url: t, session: s, key: n, tileWidth: i } = e.options, r = `${t}/v1/2dtiles/{z}/{x}/{y}?session=${s}&key=${n}`;\n this.imageSource = new Ne({\n ...this.options,\n url: r,\n tileDimension: i,\n // Google maps tiles have a fixed depth of 22\n // https://developers.google.com/maps/documentation/tile/2d-tiles-overview\n levels: 22\n });\n break;\n }\n case \"BING\": {\n const { url: t, mapStyle: s, key: n } = e.options, i = `${t}/REST/v1/Imagery/Metadata/${s}?incl=ImageryProviders&key=${n}&uriScheme=https`, o = (await fetch(i).then((l) => l.json())).resourceSets[0].resources[0];\n this.imageSource = new yr({\n ...this.options,\n url: o.imageUrl,\n subdomains: o.imageUrlSubdomains,\n tileDimension: o.tileWidth,\n levels: o.zoomMax\n });\n break;\n }\n default:\n this.imageSource = new Xt({\n ...this.options,\n url: e.url\n });\n }\n return this.imageSource.fetchData = (...t) => this.fetch(...t), this.imageSource.init();\n });\n }\n fetch(...e) {\n return this.externalType ? super.fetch(...e) : this.auth.fetch(...e);\n }\n getAttributions(e) {\n e.push(...this._attributions);\n }\n}\nclass So extends Ce {\n constructor(e = {}) {\n super(e);\n const { apiToken: t, sessionOptions: s, autoRefreshToken: n, logoUrl: i } = e;\n this.logoUrl = i, this.auth = new zn({ apiToken: t, sessionOptions: s, autoRefreshToken: n }), this.imageSource = new Ne(), this.imageSource.fetchData = (...r) => this.fetch(...r), this._logoAttribution = {\n value: \"\",\n type: \"image\",\n collapsible: !1\n };\n }\n _initImageSource() {\n return this.auth.refreshToken().then((e) => (this.imageSource.tileDimension = e.tileWidth, this.imageSource.url = \"https://tile.googleapis.com/v1/2dtiles/{z}/{x}/{y}\", this.imageSource.init()));\n }\n fetch(...e) {\n return this.auth.fetch(...e);\n }\n getAttributions(e) {\n this.logoUrl && (this._logoAttribution.value = this.logoUrl, e.push(this._logoAttribution));\n }\n}\nclass Mo {\n constructor() {\n this.name = \"LOAD_REGION_PLUGIN\", this.regions = [], this.tiles = null;\n }\n init(e) {\n this.tiles = e;\n }\n addRegion(e) {\n this.regions.indexOf(e) === -1 && this.regions.push(e);\n }\n removeRegion(e) {\n const t = this.regions.indexOf(e);\n t !== -1 && this.regions.splice(t, 1);\n }\n hasRegion(e) {\n return this.regions.indexOf(e) !== -1;\n }\n clearRegions() {\n this.regions = [];\n }\n // Calculates shape intersections and associated error values to use. If \"mask\" shapes are present then\n // tiles are only loaded if they are within those shapes.\n calculateTileViewError(e, t) {\n const s = e.engineData.boundingVolume, { regions: n, tiles: i } = this;\n let r = !1, o = null, l = 0, c = 1 / 0;\n for (const u of n) {\n const h = u.intersectsTile(s, e, i);\n r = r || h, h && (l = Math.max(u.calculateError(e, i), l), c = Math.min(u.calculateDistance(s, e, i), c)), u.mask && (o = o || h);\n }\n return t.inView = r && o !== !1, t.error = l, t.distance = c, t.inView || o !== null;\n }\n dispose() {\n this.regions = [];\n }\n}\nclass Zt {\n constructor(e = {}) {\n typeof e == \"number\" && (console.warn(\"LoadRegionPlugin: Region constructor has been changed to take options as an object.\"), e = { errorTarget: e });\n const {\n errorTarget: t = 10,\n mask: s = !1\n } = e;\n this.errorTarget = t, this.mask = s;\n }\n intersectsTile(e, t, s) {\n return !1;\n }\n calculateDistance(e, t, s) {\n return 1 / 0;\n }\n calculateError(e, t) {\n return e.geometricError - this.errorTarget + t.errorTarget;\n }\n}\nclass Co extends Zt {\n constructor(e = {}) {\n typeof e == \"number\" && (console.warn(\"SphereRegion: Region constructor has been changed to take options as an object.\"), e = {\n errorTarget: arguments[0],\n sphere: arguments[1]\n });\n const { sphere: t = new de() } = e;\n super(e), this.sphere = t.clone();\n }\n intersectsTile(e) {\n return e.intersectsSphere(this.sphere);\n }\n}\nclass Ao extends Zt {\n constructor(e = {}) {\n typeof e == \"number\" && (console.warn(\"RayRegion: Region constructor has been changed to take options as an object.\"), e = {\n errorTarget: arguments[0],\n ray: arguments[1]\n });\n const { ray: t = new oi() } = e;\n super(e), this.ray = t.clone();\n }\n intersectsTile(e) {\n return e.intersectsRay(this.ray);\n }\n}\nclass Io extends Zt {\n constructor(e = {}) {\n typeof e == \"number\" && (console.warn(\"RayRegion: Region constructor has been changed to take options as an object.\"), e = {\n errorTarget: arguments[0],\n obb: arguments[1]\n });\n const { obb: t = new fi() } = e;\n super(e), this.obb = t.clone(), this.obb.update();\n }\n intersectsTile(e) {\n return e.intersectsOBB(this.obb);\n }\n}\nconst te = /* @__PURE__ */ new E(), Hs = [\"x\", \"y\", \"z\"];\nclass Ir extends an {\n constructor(e, t = 16776960, s = 40) {\n const n = new st(), i = [];\n for (let r = 0; r < 3; r++) {\n const o = Hs[r], l = Hs[(r + 1) % 3];\n te.set(0, 0, 0);\n for (let c = 0; c < s; c++) {\n let u;\n u = 2 * Math.PI * c / (s - 1), te[o] = Math.sin(u), te[l] = Math.cos(u), i.push(te.x, te.y, te.z), u = 2 * Math.PI * (c + 1) / (s - 1), te[o] = Math.sin(u), te[l] = Math.cos(u), i.push(te.x, te.y, te.z);\n }\n }\n n.setAttribute(\"position\", new J(new Float32Array(i), 3)), n.computeBoundingSphere(), super(n, new ai({ color: t, toneMapped: !1 })), this.sphere = e, this.type = \"SphereHelper\";\n }\n updateMatrixWorld(e) {\n const t = this.sphere;\n this.position.copy(t.center), this.scale.setScalar(t.radius), super.updateMatrixWorld(e);\n }\n}\nconst Dt = /* @__PURE__ */ new E(), Ze = /* @__PURE__ */ new E(), ne = /* @__PURE__ */ new E();\nfunction vr(a, { computeNormals: e = !1 } = {}) {\n const {\n latStart: t = -Math.PI / 2,\n latEnd: s = Math.PI / 2,\n lonStart: n = 0,\n lonEnd: i = 2 * Math.PI,\n heightStart: r = 0,\n heightEnd: o = 0\n } = a, l = new ln(1, 1, 1, 32, 32), { normal: c, position: u } = l.attributes, h = u.clone();\n for (let d = 0, m = u.count; d < m; d++) {\n ne.fromBufferAttribute(u, d);\n const f = b.mapLinear(ne.x, -0.5, 0.5, t, s), p = b.mapLinear(ne.y, -0.5, 0.5, n, i);\n let g = r;\n a.getCartographicToNormal(f, p, Dt), ne.z < 0 && (g = o), a.getCartographicToPosition(f, p, g, ne), u.setXYZ(d, ...ne);\n }\n e && l.computeVertexNormals();\n for (let d = 0, m = h.count; d < m; d++) {\n ne.fromBufferAttribute(h, d);\n const f = b.mapLinear(ne.x, -0.5, 0.5, t, s), p = b.mapLinear(ne.y, -0.5, 0.5, n, i);\n Dt.fromBufferAttribute(c, d), a.getCartographicToNormal(f, p, Ze), Math.abs(Dt.dot(Ze)) > 0.1 && (ne.z > 0 && Ze.multiplyScalar(-1), c.setXYZ(d, ...Ze));\n }\n return l;\n}\nclass Lr extends an {\n constructor(e = new mi(), t = 16776960) {\n super(), this.ellipsoidRegion = e, this.material.color.set(t), this.update();\n }\n update() {\n const e = vr(this.ellipsoidRegion);\n this.geometry.dispose(), this.geometry = new li(e, 80);\n }\n dispose() {\n this.geometry.dispose(), this.material.dispose();\n }\n}\nconst qs = Symbol(\"ORIGINAL_MATERIAL\"), Bt = Symbol(\"HAS_RANDOM_COLOR\"), Ot = Symbol(\"HAS_RANDOM_NODE_COLOR\"), Ut = Symbol(\"LOAD_TIME\"), ge = Symbol(\"PARENT_BOUND_REF_COUNT\"), Ws = /* @__PURE__ */ new de(), Je = () => {\n}, Nt = {};\nfunction Ke(a) {\n if (!Nt[a]) {\n const e = Math.random(), t = 0.5 + Math.random() * 0.5, s = 0.375 + Math.random() * 0.25;\n Nt[a] = new on().setHSL(e, t, s);\n }\n return Nt[a];\n}\nconst Re = 0, En = 1, wn = 2, Pn = 3, Rn = 4, Dn = 5, Bn = 6, et = 7, tt = 8, On = 9, kt = 10, Er = Object.freeze({\n NONE: Re,\n SCREEN_ERROR: En,\n GEOMETRIC_ERROR: wn,\n DISTANCE: Pn,\n DEPTH: Rn,\n RELATIVE_DEPTH: Dn,\n IS_LEAF: Bn,\n RANDOM_COLOR: et,\n RANDOM_NODE_COLOR: tt,\n CUSTOM_COLOR: On,\n LOAD_ORDER: kt\n});\nclass vo {\n static get ColorModes() {\n return Er;\n }\n get unlit() {\n return this._unlit;\n }\n set unlit(e) {\n e !== this._unlit && (this._unlit = e, this.materialsNeedUpdate = !0);\n }\n get colorMode() {\n return this._colorMode;\n }\n set colorMode(e) {\n e !== this._colorMode && (this._colorMode = e, this.materialsNeedUpdate = !0);\n }\n get enabled() {\n return this._enabled;\n }\n set enabled(e) {\n e !== this._enabled && this.tiles !== null && (this._enabled = e, e ? this.init(this.tiles) : this.dispose());\n }\n get displayParentBounds() {\n return this._displayParentBounds;\n }\n set displayParentBounds(e) {\n this._displayParentBounds !== e && (this._displayParentBounds = e, e ? this.tiles.traverse((t) => {\n t.traversal.visible && this._onTileVisibilityChange(t, !0);\n }) : this.tiles.traverse((t) => {\n t[ge] = null, this._onTileVisibilityChange(t, t.traversal.visible);\n }));\n }\n constructor(e) {\n e = {\n displayParentBounds: !1,\n displayBoxBounds: !1,\n displaySphereBounds: !1,\n displayRegionBounds: !1,\n colorMode: Re,\n maxDebugDepth: -1,\n maxDebugDistance: -1,\n maxDebugError: -1,\n customColorCallback: null,\n unlit: !1,\n enabled: !0,\n ...e\n }, this.name = \"DEBUG_TILES_PLUGIN\", this.tiles = null, this._colorMode = null, this._unlit = null, this.materialsNeedUpdate = !1, this.extremeDebugDepth = -1, this.extremeDebugError = -1, this.boxGroup = null, this.sphereGroup = null, this.regionGroup = null, this._enabled = e.enabled, this._displayParentBounds = e.displayParentBounds, this.displayBoxBounds = e.displayBoxBounds, this.displaySphereBounds = e.displaySphereBounds, this.displayRegionBounds = e.displayRegionBounds, this.colorMode = e.colorMode, this.maxDebugDepth = e.maxDebugDepth, this.maxDebugDistance = e.maxDebugDistance, this.maxDebugError = e.maxDebugError, this.customColorCallback = e.customColorCallback, this.unlit = e.unlit, this.getDebugColor = (t, s) => {\n s.setRGB(t, t, t);\n };\n }\n // initialize the groups for displaying helpers, register events, and initialize existing tiles\n init(e) {\n if (this.tiles = e, !this.enabled)\n return;\n const t = e.group;\n this.boxGroup = new ke(), this.boxGroup.name = \"DebugTilesRenderer.boxGroup\", t.add(this.boxGroup), this.boxGroup.updateMatrixWorld(), this.sphereGroup = new ke(), this.sphereGroup.name = \"DebugTilesRenderer.sphereGroup\", t.add(this.sphereGroup), this.sphereGroup.updateMatrixWorld(), this.regionGroup = new ke(), this.regionGroup.name = \"DebugTilesRenderer.regionGroup\", t.add(this.regionGroup), this.regionGroup.updateMatrixWorld(), this._onLoadTilesetCB = () => {\n this._initExtremes();\n }, this._onLoadModelCB = ({ scene: s, tile: n }) => {\n this._onLoadModel(s, n);\n }, this._onDisposeModelCB = ({ tile: s }) => {\n this._onDisposeModel(s);\n }, this._onUpdateAfterCB = () => {\n this.update();\n }, this._onTileVisibilityChangeCB = ({ scene: s, tile: n, visible: i }) => {\n this._onTileVisibilityChange(n, i);\n }, e.addEventListener(\"load-tileset\", this._onLoadTilesetCB), e.addEventListener(\"load-model\", this._onLoadModelCB), e.addEventListener(\"dispose-model\", this._onDisposeModelCB), e.addEventListener(\"update-after\", this._onUpdateAfterCB), e.addEventListener(\"tile-visibility-change\", this._onTileVisibilityChangeCB), this._initExtremes(), e.traverse((s) => {\n s.engineData.scene && this._onLoadModel(s.engineData.scene, s);\n }), e.visibleTiles.forEach((s) => {\n this._onTileVisibilityChange(s, !0);\n });\n }\n getTileFromObject3D(e) {\n let t = null;\n return this.tiles.activeTiles.forEach((n) => {\n if (t)\n return !0;\n const i = n.engineData.scene;\n i && i.traverse((r) => {\n r === e && (t = n);\n });\n }), t;\n }\n _initExtremes() {\n if (!(this.tiles && this.tiles.root))\n return;\n let e = -1, t = -1;\n this.tiles.traverse(null, (s, n, i) => {\n e = Math.max(e, i), t = Math.max(t, s.geometricError);\n }, !1), this.extremeDebugDepth = e, this.extremeDebugError = t;\n }\n update() {\n const { tiles: e, colorMode: t } = this;\n if (!e.root)\n return;\n this.materialsNeedUpdate && (e.forEachLoadedModel((c) => {\n this._updateMaterial(c);\n }), this.materialsNeedUpdate = !1), this.boxGroup.visible = this.displayBoxBounds, this.sphereGroup.visible = this.displaySphereBounds, this.regionGroup.visible = this.displayRegionBounds;\n let s = -1;\n this.maxDebugDepth === -1 ? s = this.extremeDebugDepth : s = this.maxDebugDepth;\n let n = -1;\n this.maxDebugError === -1 ? n = this.extremeDebugError : n = this.maxDebugError;\n let i = -1;\n this.maxDebugDistance === -1 ? (e.getBoundingSphere(Ws), i = Ws.radius) : i = this.maxDebugDistance;\n const { errorTarget: r, visibleTiles: o } = e;\n let l;\n t === kt && (l = Array.from(o).sort((c, u) => c[Ut] - u[Ut])), o.forEach((c) => {\n const u = c.engineData.scene;\n let h, d, m;\n t === et && (h = Math.random(), d = 0.5 + Math.random() * 0.5, m = 0.375 + Math.random() * 0.25), u.traverse((f) => {\n if (t === tt && (h = Math.random(), d = 0.5 + Math.random() * 0.5, m = 0.375 + Math.random() * 0.25), f.material)\n switch (t !== et && delete f.material[Bt], t !== tt && delete f.material[Ot], t) {\n case Rn: {\n const p = c.internal.depth / s;\n this.getDebugColor(p, f.material.color);\n break;\n }\n case Dn: {\n const p = c.internal.depthFromRenderedParent / s;\n this.getDebugColor(p, f.material.color);\n break;\n }\n case En: {\n const p = c.traversal.error / r;\n p > 1 ? f.material.color.setRGB(1, 0, 0) : this.getDebugColor(p, f.material.color);\n break;\n }\n case wn: {\n const p = Math.min(c.geometricError / n, 1);\n this.getDebugColor(p, f.material.color);\n break;\n }\n case Pn: {\n const p = Math.min(c.traversal.distanceFromCamera / i, 1);\n this.getDebugColor(p, f.material.color);\n break;\n }\n case Bn: {\n !c.children || c.children.length === 0 ? this.getDebugColor(1, f.material.color) : this.getDebugColor(0, f.material.color);\n break;\n }\n case tt: {\n f.material[Ot] || (f.material.color.setHSL(h, d, m), f.material[Ot] = !0);\n break;\n }\n case et: {\n f.material[Bt] || (f.material.color.setHSL(h, d, m), f.material[Bt] = !0);\n break;\n }\n case On: {\n this.customColorCallback ? this.customColorCallback(c, f) : console.warn(\"DebugTilesRenderer: customColorCallback not defined\");\n break;\n }\n case kt: {\n const p = l.indexOf(c);\n this.getDebugColor(p / (l.length - 1), f.material.color);\n break;\n }\n }\n });\n });\n }\n _onTileVisibilityChange(e, t) {\n this.displayParentBounds ? bi(e, (s) => {\n s[ge] == null && (s[ge] = 0), t ? s[ge]++ : s[ge] > 0 && s[ge]--;\n const n = s === e && t || this.displayParentBounds && s[ge] > 0;\n this._updateBoundHelper(s, n);\n }) : this._updateBoundHelper(e, t);\n }\n _createBoundHelper(e) {\n const t = this.tiles, s = e.engineData, { sphere: n, obb: i, region: r } = s.boundingVolume;\n if (i) {\n const o = new ke();\n o.name = \"DebugTilesRenderer.boxHelperGroup\", o.matrix.copy(i.transform), o.matrixAutoUpdate = !1, s.boxHelperGroup = o;\n const l = new ci(i.box, Ke(e.internal.depth));\n l.raycast = Je, o.add(l);\n const c = new Be(new ln(), new Se({\n color: Ke(e.internal.depth),\n transparent: !0,\n depthWrite: !1,\n opacity: 0.05,\n side: rn\n }));\n i.box.getSize(c.scale), c.raycast = Je, o.add(c), t.visibleTiles.has(e) && this.displayBoxBounds && (this.boxGroup.add(o), o.updateMatrixWorld(!0));\n }\n if (n) {\n const o = new Ir(n, Ke(e.internal.depth));\n o.raycast = Je, s.sphereHelper = o, t.visibleTiles.has(e) && this.displaySphereBounds && (this.sphereGroup.add(o), o.updateMatrixWorld(!0));\n }\n if (r) {\n const o = new Lr(r, Ke(e.internal.depth));\n o.raycast = Je;\n const l = new de();\n r.getBoundingSphere(l), o.position.copy(l.center), l.center.multiplyScalar(-1), o.geometry.translate(...l.center), s.regionHelper = o, t.visibleTiles.has(e) && this.displayRegionBounds && (this.regionGroup.add(o), o.updateMatrixWorld(!0));\n }\n }\n _updateHelperMaterials(e, t) {\n t.traverse((s) => {\n const { material: n } = s;\n if (!n)\n return;\n e.traversal.visible || !this.displayParentBounds ? n.opacity = s.isMesh ? 0.05 : 1 : n.opacity = s.isMesh ? 0.01 : 0.2;\n const i = n.transparent;\n n.transparent = n.opacity < 1, n.transparent !== i && (n.needsUpdate = !0);\n });\n }\n _updateBoundHelper(e, t) {\n const s = e.engineData;\n if (!s)\n return;\n const n = this.sphereGroup, i = this.boxGroup, r = this.regionGroup;\n t && s.boxHelperGroup == null && s.sphereHelper == null && s.regionHelper == null && this._createBoundHelper(e);\n const o = s.boxHelperGroup, l = s.sphereHelper, c = s.regionHelper;\n t ? (o && (i.add(o), o.updateMatrixWorld(!0), this._updateHelperMaterials(e, o)), l && (n.add(l), l.updateMatrixWorld(!0), this._updateHelperMaterials(e, l)), c && (r.add(c), c.updateMatrixWorld(!0), this._updateHelperMaterials(e, c))) : (o && i.remove(o), l && n.remove(l), c && r.remove(c));\n }\n _updateMaterial(e) {\n const { colorMode: t, unlit: s } = this;\n e.traverse((n) => {\n if (!n.material)\n return;\n const i = n.material, r = n[qs];\n if (i !== r && i.dispose(), t !== Re || s) {\n if (n.isPoints) {\n const o = new ui();\n o.size = r.size, o.sizeAttenuation = r.sizeAttenuation, n.material = o;\n } else s ? n.material = new Se() : (n.material = new Ks(), n.material.flatShading = !0);\n t === Re && (n.material.map = r.map, n.material.color.set(r.color));\n } else\n n.material = r;\n });\n }\n _onLoadModel(e, t) {\n t[Ut] = performance.now(), e.traverse((s) => {\n const n = s.material;\n n && (s[qs] = n);\n }), this._updateMaterial(e);\n }\n _onDisposeModel(e) {\n const t = e.engineData;\n t != null && t.boxHelperGroup && (t.boxHelperGroup.children[0].geometry.dispose(), delete t.boxHelperGroup), t != null && t.sphereHelper && (t.sphereHelper.geometry.dispose(), delete t.sphereHelper), t != null && t.regionHelper && (t.regionHelper.geometry.dispose(), delete t.regionHelper);\n }\n dispose() {\n var t, s, n;\n const e = this.tiles;\n e.removeEventListener(\"load-tileset\", this._onLoadTilesetCB), e.removeEventListener(\"load-model\", this._onLoadModelCB), e.removeEventListener(\"dispose-model\", this._onDisposeModelCB), e.removeEventListener(\"update-after\", this._onUpdateAfterCB), e.removeEventListener(\"tile-visibility-change\", this._onTileVisibilityChangeCB), this.colorMode = Re, this.unlit = !1, e.forEachLoadedModel((i) => {\n this._updateMaterial(i);\n }), e.traverse((i) => {\n this._onDisposeModel(i);\n }, null, !1), (t = this.boxGroup) == null || t.removeFromParent(), (s = this.sphereGroup) == null || s.removeFromParent(), (n = this.regionGroup) == null || n.removeFromParent();\n }\n}\nclass wr extends Ue {\n constructor(e = {}) {\n const { url: t = null, ...s } = e;\n super(s), this.url = t, this.format = null, this.stem = null;\n }\n getUrl(e, t, s) {\n return `${this.stem}_files/${s}/${e}_${t}.${this.format}`;\n }\n init() {\n const { url: e } = this;\n return this.fetchData(e, this.fetchOptions).then((t) => t.text()).then((t) => {\n const s = new DOMParser().parseFromString(t, \"text/xml\");\n if (s.querySelector(\"DisplayRects\") || s.querySelector(\"Collection\"))\n throw new Error(\"DeepZoomImagesPlugin: DisplayRect and Collection DZI files not supported.\");\n const n = s.querySelector(\"Image\"), i = n.querySelector(\"Size\"), r = parseInt(i.getAttribute(\"Width\")), o = parseInt(i.getAttribute(\"Height\")), l = parseInt(n.getAttribute(\"TileSize\")), c = parseInt(n.getAttribute(\"Overlap\")), u = n.getAttribute(\"Format\");\n this.format = u, this.stem = e.split(/\\.[^.]+$/g)[0];\n const { tiling: h } = this, d = Math.ceil(Math.log2(Math.max(r, o))) + 1;\n h.flipY = !0, h.pixelOverlap = c, h.generateLevels(d, 1, 1, {\n tilePixelWidth: l,\n tilePixelHeight: l,\n pixelWidth: r,\n pixelHeight: o\n });\n });\n }\n}\nclass Lo extends pn {\n constructor(e = {}) {\n const { url: t, ...s } = e;\n super(s), this.name = \"DZI_TILES_PLUGIN\", this.imageSource = new wr({ url: t });\n }\n}\nconst ot = hn * Math.PI * 2, js = /* @__PURE__ */ new re(\"EPSG:3857\");\nfunction Pr(a) {\n return /:4326$/i.test(a);\n}\nfunction Un(a) {\n return /:3857$/i.test(a);\n}\nfunction Gt(a) {\n return a.trim().split(/\\s+/).map((e) => parseFloat(e));\n}\nfunction zt(a, e) {\n Pr(e) && ([a[1], a[0]] = [a[0], a[1]]);\n}\nfunction at(a, e) {\n if (Un(e))\n return a[0] = js.convertNormalizedToLongitude(0.5 + a[0] / ot), a[1] = js.convertNormalizedToLatitude(0.5 + a[1] / ot), a[0] *= b.RAD2DEG, a[1] *= b.RAD2DEG, a;\n}\nfunction lt(a) {\n a[0] *= b.DEG2RAD, a[1] *= b.DEG2RAD;\n}\nclass Eo extends dn {\n parse(e) {\n const t = new TextDecoder(\"utf-8\").decode(new Uint8Array(e)), s = new DOMParser().parseFromString(t, \"text/xml\"), n = s.querySelector(\"Contents\"), i = ue(n, \"TileMatrixSet\").map((l) => Nr(l)), r = ue(n, \"Layer\").map((l) => Dr(l)), o = Rr(s.querySelector(\"ServiceIdentification\"));\n return r.forEach((l) => {\n l.tileMatrixSets = l.tileMatrixSetLinks.map((c) => i.find((u) => u.identifier === c));\n }), {\n serviceIdentification: o,\n tileMatrixSets: i,\n layers: r\n };\n }\n}\nfunction Rr(a) {\n var i;\n const e = a.querySelector(\"Title\").textContent, t = ((i = a.querySelector(\"Abstract\")) == null ? void 0 : i.textContent) || \"\", s = a.querySelector(\"ServiceType\").textContent, n = a.querySelector(\"ServiceTypeVersion\").textContent;\n return {\n title: e,\n abstract: t,\n serviceType: s,\n serviceTypeVersion: n\n };\n}\nfunction Dr(a) {\n const e = a.querySelector(\"Title\").textContent, t = a.querySelector(\"Identifier\").textContent, s = a.querySelector(\"Format\").textContent, n = ue(a, \"ResourceURL\").map((c) => Br(c)), i = ue(a, \"TileMatrixSetLink\").map((c) => ue(c, \"TileMatrixSet\")[0].textContent), r = ue(a, \"Style\").map((c) => Ur(c)), o = ue(a, \"Dimension\").map((c) => Or(c));\n let l = Ys(a.querySelector(\"WGS84BoundingBox\"));\n return l || (l = Ys(a.querySelector(\"BoundingBox\"))), {\n title: e,\n identifier: t,\n format: s,\n dimensions: o,\n tileMatrixSetLinks: i,\n styles: r,\n boundingBox: l,\n resourceUrls: n\n };\n}\nfunction Br(a) {\n const e = a.getAttribute(\"template\"), t = a.getAttribute(\"format\"), s = a.getAttribute(\"resourceType\");\n return {\n template: e,\n format: t,\n resourceType: s\n };\n}\nfunction Or(a) {\n var r, o;\n const e = a.querySelector(\"Identifier\").textContent, t = ((r = a.querySelector(\"UOM\")) == null ? void 0 : r.textContent) || \"\", s = a.querySelector(\"Default\").textContent, n = ((o = a.querySelector(\"Current\")) == null ? void 0 : o.textContent) === \"true\", i = ue(a, \"Value\").map((l) => l.textContent);\n return {\n identifier: e,\n uom: t,\n defaultValue: s,\n current: n,\n values: i\n };\n}\nfunction Ys(a) {\n if (!a)\n return null;\n const e = a.nodeName.endsWith(\"WGS84BoundingBox\") ? \"urn:ogc:def:crs:CRS::84\" : a.getAttribute(\"crs\"), t = Gt(a.querySelector(\"LowerCorner\").textContent), s = Gt(a.querySelector(\"UpperCorner\").textContent);\n return zt(t, e), zt(s, e), at(t, e), at(s, e), lt(t), lt(s), {\n crs: e,\n lowerCorner: t,\n upperCorner: s,\n bounds: [...t, ...s]\n };\n}\nfunction Ur(a) {\n var n;\n const e = ((n = a.querySelector(\"Title\")) == null ? void 0 : n.textContent) || null, t = a.querySelector(\"Identifier\").textContent, s = a.getAttribute(\"isDefault\") === \"true\";\n return {\n title: e,\n identifier: t,\n isDefault: s\n };\n}\nfunction Nr(a) {\n var r, o;\n const e = a.querySelector(\"SupportedCRS\").textContent, t = ((r = a.querySelector(\"Title\")) == null ? void 0 : r.textContent) || \"\", s = a.querySelector(\"Identifier\").textContent, n = ((o = a.querySelector(\"Abstract\")) == null ? void 0 : o.textContent) || \"\", i = [];\n return a.querySelectorAll(\"TileMatrix\").forEach((l, c) => {\n const u = Vr(l), h = 28e-5 * u.scaleDenominator, d = u.tileWidth * u.matrixWidth * h, m = u.tileHeight * u.matrixHeight * h;\n let f;\n zt(u.topLeftCorner, e), Un(e) ? f = [\n u.topLeftCorner[0] + d,\n u.topLeftCorner[1] - m\n ] : f = [\n u.topLeftCorner[0] + 360 * d / ot,\n u.topLeftCorner[1] - 360 * m / ot\n ], at(f, e), at(u.topLeftCorner, e), lt(f), lt(u.topLeftCorner), u.bounds = [...u.topLeftCorner, ...f], [u.bounds[1], u.bounds[3]] = [u.bounds[3], u.bounds[1]], i.push(u);\n }), {\n title: t,\n identifier: s,\n abstract: n,\n supportedCRS: e,\n tileMatrices: i\n };\n}\nfunction Vr(a) {\n const e = a.querySelector(\"Identifier\").textContent, t = parseFloat(a.querySelector(\"TileWidth\").textContent), s = parseFloat(a.querySelector(\"TileHeight\").textContent), n = parseFloat(a.querySelector(\"MatrixWidth\").textContent), i = parseFloat(a.querySelector(\"MatrixHeight\").textContent), r = parseFloat(a.querySelector(\"ScaleDenominator\").textContent), o = Gt(a.querySelector(\"TopLeftCorner\").textContent);\n return {\n identifier: e,\n tileWidth: t,\n tileHeight: s,\n matrixWidth: n,\n matrixHeight: i,\n scaleDenominator: r,\n topLeftCorner: o,\n bounds: null\n };\n}\nfunction ue(a, e) {\n return [...a.children].filter((t) => t.tagName === e);\n}\nconst Xs = hn * Math.PI * 2, $s = /* @__PURE__ */ new re(\"EPSG:3857\");\nfunction Fr(a) {\n return /:4326$/i.test(a);\n}\nfunction kr(a) {\n return /:3857$/i.test(a);\n}\nfunction Qs(a, e) {\n return kr(e) && (a[0] = $s.convertNormalizedToLongitude(0.5 + a[0] / (Math.PI * 2 * Xs)), a[1] = $s.convertNormalizedToLatitude(0.5 + a[1] / (Math.PI * 2 * Xs)), a[0] *= b.RAD2DEG, a[1] *= b.RAD2DEG), a;\n}\nfunction Zs(a, e, t) {\n const [s, n] = t.split(\".\").map((r) => parseInt(r)), i = s === 1 && n < 3 || s < 1;\n Fr(e) && i && ([a[0], a[1]] = [a[1], a[0]]);\n}\nfunction Me(a) {\n a[0] *= b.DEG2RAD, a[1] *= b.DEG2RAD;\n}\nfunction Gr(a, e) {\n if (!a)\n return null;\n const t = a.getAttribute(\"CRS\") || a.getAttribute(\"crs\") || a.getAttribute(\"SRS\") || \"\", s = parseFloat(a.getAttribute(\"minx\")), n = parseFloat(a.getAttribute(\"miny\")), i = parseFloat(a.getAttribute(\"maxx\")), r = parseFloat(a.getAttribute(\"maxy\")), o = [s, n], l = [i, r];\n return Zs(o, t, e), Zs(l, t, e), Qs(o, t), Qs(l, t), Me(o), Me(l), { crs: t, bounds: [...o, ...l] };\n}\nfunction zr(a) {\n const e = parseFloat(a.querySelector(\"westBoundLongitude\").textContent), t = parseFloat(a.querySelector(\"eastBoundLongitude\").textContent), s = parseFloat(a.querySelector(\"southBoundLatitude\").textContent), n = parseFloat(a.querySelector(\"northBoundLatitude\").textContent), i = [e, s], r = [t, n];\n return Me(i), Me(r), [...i, ...r];\n}\nfunction Hr(a) {\n const e = parseFloat(a.getAttribute(\"minx\").textContent), t = parseFloat(a.getAttribute(\"maxx\").textContent), s = parseFloat(a.getAttribute(\"miny\").textContent), n = parseFloat(a.getAttribute(\"maxy\").textContent), i = [e, s], r = [t, n];\n return Me(i), Me(r), [...i, ...r];\n}\nfunction qr(a) {\n const e = a.querySelector(\"Name\").textContent, t = a.querySelector(\"Title\").textContent, s = [...a.querySelectorAll(\"LegendURL\")].map((n) => {\n const i = parseInt(n.getAttribute(\"width\")), r = parseInt(n.getAttribute(\"height\")), o = n.querySelector(\"Format\").textContent, l = n.querySelector(\"OnlineResource\"), c = Ht(l);\n return {\n width: i,\n height: r,\n format: o,\n url: c\n };\n });\n return {\n name: e,\n title: t,\n legends: s\n };\n}\nfunction Nn(a, e, t = {}) {\n var p, g, y;\n let {\n styles: s = [],\n crs: n = [],\n contentBoundingBox: i = null,\n queryable: r = !1,\n opaque: o = !1\n } = t;\n const l = ((p = a.querySelector(\":scope > Name\")) == null ? void 0 : p.textContent) || null, c = ((g = a.querySelector(\":scope > Title\")) == null ? void 0 : g.textContent) || \"\", u = ((y = a.querySelector(\":scope > Abstract\")) == null ? void 0 : y.textContent) || \"\", h = [...a.querySelectorAll(\":scope > Keyword\")].map((x) => x.textContent), m = [...a.querySelectorAll(\":scope > BoundingBox\")].map((x) => Gr(x, e));\n n = [\n ...n,\n ...Array.from(a.querySelectorAll(\"CRS\")).map((x) => x.textContent)\n ], s = [\n ...s,\n ...Array.from(a.querySelectorAll(\":scope > Style\")).map((x) => qr(x))\n ], a.hasAttribute(\"queryable\") && (r = a.getAttribute(\"queryable\") === \"1\"), a.hasAttribute(\"opaque\") && (o = a.getAttribute(\"opaque\") === \"1\"), a.querySelector(\"EX_GeographicBoundingBox\") ? i = zr(a.querySelector(\"EX_GeographicBoundingBox\")) : a.querySelector(\"LatLonBoundingBox\") && (i = Hr(a.querySelector(\"LatLonBoundingBox\")));\n const f = Array.from(a.querySelectorAll(\":scope > Layer\")).map((x) => Nn(x, e, {\n // add\n styles: s,\n crs: n,\n // replace\n contentBoundingBox: i,\n queryable: r,\n opaque: o\n }));\n return {\n name: l,\n title: c,\n abstract: u,\n queryable: r,\n opaque: o,\n keywords: h,\n crs: n,\n boundingBoxes: m,\n contentBoundingBox: i,\n styles: s,\n subLayers: f\n };\n}\nfunction Wr(a) {\n var e, t, s;\n return {\n name: ((e = a.querySelector(\"Name\")) == null ? void 0 : e.textContent) || \"\",\n title: ((t = a.querySelector(\"Title\")) == null ? void 0 : t.textContent) || \"\",\n abstract: ((s = a.querySelector(\"Abstract\")) == null ? void 0 : s.textContent) || \"\",\n keywords: Array.from(a.querySelectorAll(\"Keyword\")).map((n) => n.textContent),\n maxWidth: parseFloat(a.querySelector(\"MaxWidth\")) || null,\n maxHeight: parseFloat(a.querySelector(\"MaxHeight\")) || null,\n layerLimit: parseFloat(a.querySelector(\"LayerLimit\")) || null\n };\n}\nfunction Ht(a) {\n return a ? (a.getAttribute(\"xlink:href\") || a.getAttributeNS(\"http://www.w3.org/1999/xlink\", \"href\") || \"\").trim() : \"\";\n}\nfunction jr(a) {\n const e = Array.from(a.querySelectorAll(\"Format\")).map((s) => s.textContent.trim()), t = Array.from(a.querySelectorAll(\"DCPType\")).map((s) => {\n const n = s.querySelector(\"HTTP\"), i = n.querySelector(\"Get OnlineResource\") || n.querySelector(\"Get > OnlineResource\") || n.querySelector(\"Get\"), r = n.querySelector(\"Post OnlineResource\") || n.querySelector(\"Post > OnlineResource\") || n.querySelector(\"Post\"), o = Ht(i), l = Ht(r);\n return { type: \"HTTP\", get: o, post: l };\n });\n return { formats: e, dcp: t, href: t[0].get };\n}\nfunction Yr(a) {\n const e = {};\n return Array.from(a.querySelectorAll(\":scope > *\")).forEach((t) => {\n const s = t.localName;\n e[s] = jr(t);\n }), e;\n}\nfunction Vn(a, e = []) {\n return a.forEach((t) => {\n t.name !== null && e.push(t), Vn(t.subLayers, e);\n }), e;\n}\nclass wo extends dn {\n parse(e) {\n const t = new TextDecoder(\"utf-8\").decode(new Uint8Array(e)), s = new DOMParser().parseFromString(t, \"text/xml\"), i = (s.querySelector(\"WMS_Capabilities\") || s.querySelector(\"WMT_MS_Capabilities\")).getAttribute(\"version\"), r = s.querySelector(\"Capability\"), o = Wr(s.querySelector(\":scope > Service\")), l = Yr(r.querySelector(\":scope > Request\")), c = Array.from(r.querySelectorAll(\":scope > Layer\")).map((h) => Nn(h, i)), u = Vn(c);\n return { version: i, service: o, layers: u, request: l };\n }\n}\nexport {\n Zt as B,\n io as C,\n vo as D,\n nr as G,\n mo as I,\n Mo as L,\n tr as M,\n Io as O,\n Ui as Q,\n Ao as R,\n Co as S,\n bo as T,\n uo as U,\n wo as W,\n go as X,\n po as a,\n _o as b,\n Lo as c,\n lo as d,\n sr as e,\n Ki as f,\n yo as g,\n So as h,\n co as i,\n As as j,\n Ai as k,\n ao as l,\n fo as m,\n ho as n,\n oo as o,\n xo as p,\n no as q,\n Eo as r,\n To as s,\n so as t,\n to as u\n};\n//# sourceMappingURL=WMSCapabilitiesLoader-DngSzqI4.js.map\n","import {\r\n Group,\r\n InstancedMesh,\r\n LoadingManager,\r\n Matrix4,\r\n Mesh,\r\n MeshStandardMaterial,\r\n Quaternion,\r\n Scene,\r\n Texture,\r\n Vector3,\r\n Loader,\r\n} from \"three\";\r\nimport {\r\n acquireWorker,\r\n buildTextures,\r\n buildMaterials,\r\n buildMeshPrimitives,\r\n type PrimitiveData,\r\n getWorkers,\r\n} from \"./utils\";\r\nimport type { GLTFNodeData, GLTFWorkerData, MaterialBuilder } from \"./types\";\r\nimport { StructuralMetadata, MeshFeatures } from \"3d-tiles-renderer/plugins\";\r\n\r\n// 隔离接收oid数组\r\n\r\n// Extension names\r\nconst EXT_STRUCTURAL_METADATA = \"EXT_structural_metadata\";\r\nconst EXT_MESH_FEATURES = \"EXT_mesh_features\";\r\n\r\n/**\r\n * GLTFWorkerLoader configuration options\r\n */\r\nexport interface GLTFWorkerLoaderOptions {\r\n /** Whether to enable metadata support (EXT_mesh_features, EXT_structural_metadata) */\r\n metadata?: boolean;\r\n /** Custom material builder function */\r\n materialBuilder?: MaterialBuilder;\r\n}\r\n\r\nlet uuid = 0;\r\n\r\n/**\r\n * Custom Loader using Worker for GLTF parsing\r\n */\r\nexport class GLTFWorkerLoader extends Loader {\r\n private _metadata: boolean = true;\r\n private _materialBuilder?: MaterialBuilder;\r\n private _loaderId = uuid++;\r\n private _callbacks = new Map<\r\n number,\r\n { resolve: (data: any) => void; reject: (err: Error) => void }\r\n >();\r\n private _nextRequestId = 1;\r\n\r\n constructor(manager?: LoadingManager, options?: GLTFWorkerLoaderOptions) {\r\n super(manager);\r\n this._metadata = options?.metadata ?? true;\r\n this._materialBuilder = options?.materialBuilder;\r\n\r\n this.addListeners();\r\n }\r\n\r\n addListeners() {\r\n const workers = getWorkers();\r\n workers.forEach((worker) => {\r\n worker.addEventListener(\"message\", this._onMessage);\r\n });\r\n }\r\n\r\n removeListeners() {\r\n const workers = getWorkers();\r\n workers.forEach((worker) => {\r\n worker.removeEventListener(\"message\", this._onMessage);\r\n });\r\n }\r\n\r\n /**\r\n * Asynchronously parse GLTF buffer\r\n */\r\n async parseAsync(buffer: ArrayBuffer, path: string): Promise<any> {\r\n // Acquire available Worker\r\n const worker = acquireWorker();\r\n\r\n // Parse using worker\r\n const data = await this.parseWithWorker(worker, buffer, path);\r\n\r\n // Build Three.js scene\r\n const scene = this.buildSceneFromGLTFData(data);\r\n\r\n // Return format identical to GLTFLoader\r\n return {\r\n scene: scene,\r\n scenes: [scene],\r\n animations: [],\r\n cameras: [],\r\n asset: {\r\n generator: \"GLTFWorkerLoader\",\r\n version: \"2.0\",\r\n },\r\n parser: null as any,\r\n userData: {},\r\n };\r\n }\r\n\r\n /**\r\n * Parse GLTF data using Worker\r\n */\r\n private parseWithWorker(\r\n worker: Worker,\r\n buffer: ArrayBuffer,\r\n workingPath: string,\r\n ): Promise<GLTFWorkerData> {\r\n return new Promise((resolve, reject) => {\r\n const requestId = this._nextRequestId++;\r\n this._callbacks.set(requestId, { resolve, reject });\r\n\r\n // Send buffer and working path to worker\r\n worker.postMessage(\r\n {\r\n method: \"parseTile\",\r\n buffer: buffer,\r\n root: workingPath,\r\n loaderId: this._loaderId,\r\n requestId,\r\n fetchOptions: {\r\n referrer: window.location.href,\r\n referrerPolicy: \"origin\",\r\n },\r\n },\r\n [buffer],\r\n );\r\n });\r\n }\r\n\r\n private _onMessage = (event: MessageEvent) => {\r\n const { type, data, error, loaderId, requestId } = event.data;\r\n\r\n // loaderId here is our requestId\r\n if (loaderId !== this._loaderId) return;\r\n const callback = this._callbacks.get(requestId);\r\n if (!callback) return;\r\n\r\n this._callbacks.delete(requestId);\r\n\r\n if (type === \"success\") {\r\n callback.resolve(data);\r\n } else if (type === \"error\") {\r\n callback.reject(new Error(error));\r\n }\r\n };\r\n\r\n /**\r\n * Convert GLTF data returned by Worker to Three.js Scene\r\n */\r\n private buildSceneFromGLTFData(data: GLTFWorkerData): Scene {\r\n const scene = new Scene();\r\n\r\n // Build textures\r\n const { textureMap, textureArray } = buildTextures(data);\r\n\r\n // Build materials\r\n const materialMap = buildMaterials(data, textureMap, this._materialBuilder);\r\n\r\n // Create default material\r\n const defaultMaterial = new MeshStandardMaterial({ color: 0xcccccc });\r\n\r\n // Build mesh primitives\r\n const meshMap = buildMeshPrimitives(data, materialMap, defaultMaterial);\r\n\r\n // Parse node\r\n const parseNodeData = (nodeData: GLTFNodeData): Group => {\r\n const node = new Group();\r\n\r\n const primitiveDataList = meshMap.get(nodeData.mesh);\r\n if (primitiveDataList) {\r\n if (nodeData.instanceData) {\r\n // EXT_mesh_gpu_instancing: create InstancedMesh per primitive\r\n const { count, TRANSLATION, ROTATION, SCALE } = nodeData.instanceData;\r\n\r\n for (const {\r\n geometry,\r\n material,\r\n primitiveIndex,\r\n } of primitiveDataList) {\r\n const instancedMesh = new InstancedMesh(geometry, material, count);\r\n\r\n const tmpMatrix = new Matrix4();\r\n const tmpPos = new Vector3();\r\n const tmpQuat = new Quaternion();\r\n const tmpScale = new Vector3(1, 1, 1);\r\n\r\n for (let i = 0; i < count; i++) {\r\n if (TRANSLATION) {\r\n tmpPos.set(\r\n TRANSLATION[i * 3],\r\n TRANSLATION[i * 3 + 1],\r\n TRANSLATION[i * 3 + 2],\r\n );\r\n } else {\r\n tmpPos.set(0, 0, 0);\r\n }\r\n\r\n if (ROTATION) {\r\n tmpQuat.set(\r\n ROTATION[i * 4],\r\n ROTATION[i * 4 + 1],\r\n ROTATION[i * 4 + 2],\r\n ROTATION[i * 4 + 3],\r\n );\r\n } else {\r\n tmpQuat.identity();\r\n }\r\n\r\n if (SCALE) {\r\n tmpScale.set(SCALE[i * 3], SCALE[i * 3 + 1], SCALE[i * 3 + 2]);\r\n } else {\r\n tmpScale.set(1, 1, 1);\r\n }\r\n\r\n tmpMatrix.compose(tmpPos, tmpQuat, tmpScale);\r\n instancedMesh.setMatrixAt(i, tmpMatrix);\r\n }\r\n\r\n instancedMesh.instanceMatrix.needsUpdate = true;\r\n instancedMesh.userData._gltfMeshIndex = nodeData.mesh;\r\n instancedMesh.userData._gltfPrimitiveIndex = primitiveIndex;\r\n node.add(instancedMesh);\r\n }\r\n } else {\r\n for (const {\r\n geometry,\r\n material,\r\n primitiveIndex,\r\n } of primitiveDataList) {\r\n const mesh = new Mesh(geometry, material);\r\n mesh.userData._gltfMeshIndex = nodeData.mesh;\r\n mesh.userData._gltfPrimitiveIndex = primitiveIndex;\r\n node.add(mesh);\r\n }\r\n }\r\n }\r\n\r\n // Set node name\r\n if (nodeData.name) {\r\n node.name = nodeData.name;\r\n }\r\n\r\n // Apply transformation\r\n if (nodeData.matrix) {\r\n const m = new Matrix4();\r\n m.fromArray(nodeData.matrix);\r\n node.applyMatrix4(m);\r\n } else {\r\n if (nodeData.translation) {\r\n node.position.set(\r\n nodeData.translation[0],\r\n nodeData.translation[1],\r\n nodeData.translation[2],\r\n );\r\n }\r\n if (nodeData.rotation) {\r\n node.quaternion.set(\r\n nodeData.rotation[0],\r\n nodeData.rotation[1],\r\n nodeData.rotation[2],\r\n nodeData.rotation[3],\r\n );\r\n }\r\n if (nodeData.scale) {\r\n node.scale.set(\r\n nodeData.scale[0],\r\n nodeData.scale[1],\r\n nodeData.scale[2],\r\n );\r\n }\r\n }\r\n\r\n // Recursively process child nodes\r\n if (nodeData.children && Array.isArray(nodeData.children)) {\r\n for (const child of nodeData.children) {\r\n const childNode = parseNodeData(child);\r\n node.add(childNode);\r\n }\r\n }\r\n\r\n return node;\r\n };\r\n\r\n // Add scene nodes\r\n const sceneData = data.scenes[0];\r\n for (const nodeData of sceneData.nodes) {\r\n const node = parseNodeData(nodeData);\r\n scene.add(node);\r\n }\r\n\r\n // Process metadata (if enabled)\r\n if (this._metadata) {\r\n this.processMetadata(scene, data, textureArray, meshMap);\r\n }\r\n\r\n return scene;\r\n }\r\n\r\n /**\r\n * Process and attach metadata to scene and mesh objects\r\n */\r\n private processMetadata(\r\n scene: Scene,\r\n data: GLTFWorkerData,\r\n textures: (Texture | null)[],\r\n meshMap: Map<number, PrimitiveData[]>,\r\n ): void {\r\n const extensionsUsed = data.json?.extensionsUsed || [];\r\n const hasStructuralMetadata = extensionsUsed.includes(\r\n EXT_STRUCTURAL_METADATA,\r\n );\r\n const hasMeshFeatures = extensionsUsed.includes(EXT_MESH_FEATURES);\r\n\r\n if (!hasStructuralMetadata && !hasMeshFeatures) {\r\n return;\r\n }\r\n\r\n // Process EXT_structural_metadata\r\n let rootMetadata: any = null;\r\n if (hasStructuralMetadata && data.structuralMetadata) {\r\n const rootExtension = data.json?.extensions?.[EXT_STRUCTURAL_METADATA];\r\n if (rootExtension) {\r\n const definition = {\r\n schema: data.structuralMetadata.schema,\r\n propertyTables: data.structuralMetadata.propertyTables || [],\r\n propertyTextures: rootExtension.propertyTextures || [],\r\n propertyAttributes: rootExtension.propertyAttributes || [],\r\n };\r\n\r\n const buffers = data.structuralMetadata.buffers || [];\r\n rootMetadata = new StructuralMetadata(definition, textures, buffers);\r\n scene.userData.structuralMetadata = rootMetadata;\r\n }\r\n }\r\n\r\n // Traverse all meshes in the scene, process mesh-level metadata\r\n scene.traverse((child) => {\r\n if (!(child instanceof Mesh)) return;\r\n\r\n const meshIndex = child.userData._gltfMeshIndex as number | undefined;\r\n const primitiveIndex = child.userData._gltfPrimitiveIndex as\r\n | number\r\n | undefined;\r\n if (meshIndex === undefined || primitiveIndex === undefined) return;\r\n\r\n const primitiveDataList = meshMap.get(meshIndex);\r\n if (!primitiveDataList) return;\r\n\r\n const primitiveData = primitiveDataList.find(\r\n (p) => p.primitiveIndex === primitiveIndex,\r\n );\r\n if (!primitiveData) return;\r\n\r\n const extensions = primitiveData.extensions;\r\n\r\n // Process EXT_structural_metadata (primitive level)\r\n if (hasStructuralMetadata && rootMetadata) {\r\n const primMetadataExt = extensions?.[EXT_STRUCTURAL_METADATA];\r\n if (primMetadataExt) {\r\n const rootExtension =\r\n data.json?.extensions?.[EXT_STRUCTURAL_METADATA];\r\n if (rootExtension) {\r\n const definition = {\r\n schema: data.structuralMetadata!.schema,\r\n propertyTables: data.structuralMetadata!.propertyTables || [],\r\n propertyTextures: rootExtension.propertyTextures || [],\r\n propertyAttributes: rootExtension.propertyAttributes || [],\r\n };\r\n const buffers = data.structuralMetadata!.buffers || [];\r\n\r\n child.userData.structuralMetadata = new StructuralMetadata(\r\n definition,\r\n textures,\r\n buffers,\r\n primMetadataExt,\r\n child,\r\n );\r\n }\r\n } else {\r\n child.userData.structuralMetadata = rootMetadata;\r\n }\r\n }\r\n\r\n // Process EXT_mesh_features\r\n if (hasMeshFeatures) {\r\n const meshFeaturesExt = extensions?.[EXT_MESH_FEATURES];\r\n if (meshFeaturesExt) {\r\n child.userData.meshFeatures = new MeshFeatures(\r\n child.geometry,\r\n textures,\r\n meshFeaturesExt,\r\n );\r\n }\r\n }\r\n });\r\n }\r\n}\r\n","import type { MeshCollector } from \"../MeshCollector\";\nimport {\n Color,\n Material,\n Mesh,\n MeshStandardMaterial,\n Object3D,\n} from \"three\";\n\nexport type ColorInput = number | string | Color;\n\n/** 内部使用:插件需提供的接口 */\ninterface ComponentColorHelperContext {\n hideByOids(oids: number[]): void;\n unhideByOids(oids: number[]): void;\n getMeshCollectorByOid(oid: number): MeshCollector;\n getScene(): Object3D | null;\n}\n\nfunction ensureColor(color: ColorInput): Color {\n if (color instanceof Color) return color;\n return new Color(color);\n}\n\nfunction getMaterials(mesh: Mesh): Material[] {\n const mat = mesh.material;\n if (!mat) return [];\n return Array.isArray(mat) ? mat : [mat];\n}\n\n/** 根据颜色创建材质,相同颜色复用同一材质 */\nfunction getMaterialForColor(color: Color): MeshStandardMaterial {\n const key = color.getHex();\n if (!materialCache.has(key)) {\n materialCache.set(key, new MeshStandardMaterial({\n color: color.clone(),\n roughness: 0.5,\n metalness: 0.1,\n }));\n }\n return materialCache.get(key)!;\n}\n\nconst materialCache = new Map<number, MeshStandardMaterial>();\n\n/**\n * 构件着色/透明度辅助器,参考 example 逻辑:hideByOids -> 修改材质 -> scene.add -> mesh-change 监听\n * 由 GLTFParserPlugin 内部使用,scene 通过 tiles.group 获取\n */\nexport class ComponentColorHelper {\n private coloredOids = new Set<number>();\n private materialByOid = new Map<number, MeshStandardMaterial>();\n private originalMaterialByMesh = new Map<string, Material>();\n private opacityModifiedOids = new Set<number>();\n private opacityByOid = new Map<number, number>();\n private originalOpacityByMaterial = new Map<Material, number>();\n private meshChangeHandlers = new Map<number, () => void>();\n\n constructor(private context: ComponentColorHelperContext) {}\n\n private getAllModifiedOids(): number[] {\n return Array.from(new Set([...this.coloredOids, ...this.opacityModifiedOids]));\n }\n\n private applyToMeshes(oid: number): void {\n const scene = this.context.getScene();\n if (!scene) return;\n\n const collector = this.context.getMeshCollectorByOid(oid);\n\n const colorMaterial = this.materialByOid.get(oid);\n const opacity = this.opacityByOid.get(oid);\n\n collector.meshes.forEach((mesh) => {\n if (!mesh.parent) scene.add(mesh);\n\n if (colorMaterial) {\n mesh.material = colorMaterial;\n }\n\n if (opacity !== undefined) {\n for (const mat of getMaterials(mesh)) {\n if (!this.originalOpacityByMaterial.has(mat)) {\n this.originalOpacityByMaterial.set(mat, mat.opacity);\n }\n mat.opacity = opacity;\n mat.transparent = opacity < 1;\n }\n }\n });\n }\n\n /**\n * 根据 oid 数组设置构件颜色\n * 隐藏原 mesh,将 split mesh 替换材质后加入场景\n */\n setComponentColorByOids(oids: number[], color: ColorInput): void {\n const scene = this.context.getScene();\n if (!scene) return;\n\n const threeColor = ensureColor(color);\n const material = getMaterialForColor(threeColor);\n\n for (const oid of oids) {\n this.coloredOids.add(oid);\n this.materialByOid.set(oid, material);\n\n const collector = this.context.getMeshCollectorByOid(oid);\n collector.meshes.forEach((mesh) => {\n if (!this.originalMaterialByMesh.has(mesh.uuid)) {\n this.originalMaterialByMesh.set(mesh.uuid, mesh.material as Material);\n }\n mesh.material = material;\n scene.add(mesh);\n });\n\n if (!this.meshChangeHandlers.has(oid)) {\n const handler = () => this.applyToMeshes(oid);\n this.meshChangeHandlers.set(oid, handler);\n collector.addEventListener(\"mesh-change\", handler);\n }\n }\n\n this.context.hideByOids(this.getAllModifiedOids());\n }\n\n /**\n * 恢复指定构件的颜色\n * 若该 oid 已无颜色且无透明度修改,则从场景移除 split mesh 并 unhide 原 mesh\n */\n restoreComponentColorByOids(oids: number[]): void {\n const scene = this.context.getScene();\n if (!scene) return;\n\n for (const oid of oids) {\n this.coloredOids.delete(oid);\n this.materialByOid.delete(oid);\n\n const collector = this.context.getMeshCollectorByOid(oid);\n const opacity = this.opacityByOid.get(oid);\n\n collector.meshes.forEach((mesh) => {\n const originalMat = this.originalMaterialByMesh.get(mesh.uuid);\n if (originalMat) {\n mesh.material = originalMat;\n this.originalMaterialByMesh.delete(mesh.uuid);\n if (opacity !== undefined) {\n for (const mat of getMaterials(mesh)) {\n if (!this.originalOpacityByMaterial.has(mat)) {\n this.originalOpacityByMaterial.set(mat, mat.opacity);\n }\n mat.opacity = opacity;\n mat.transparent = opacity < 1;\n }\n }\n }\n if (\n !this.coloredOids.has(oid) &&\n !this.opacityModifiedOids.has(oid) &&\n mesh.parent === scene\n ) {\n scene.remove(mesh);\n }\n });\n\n if (!this.coloredOids.has(oid) && !this.opacityModifiedOids.has(oid)) {\n const handler = this.meshChangeHandlers.get(oid);\n if (handler) {\n this.meshChangeHandlers.delete(oid);\n collector.removeEventListener(\"mesh-change\", handler);\n }\n }\n }\n\n this.context.unhideByOids(oids);\n }\n\n /**\n * 根据 oid 数组设置构件透明度\n * 隐藏原 mesh,将 split mesh 修改材质透明度后加入场景\n * @param oids 构件 OID 数组\n * @param opacity 透明度,0-1,0 完全透明,1 完全不透明\n */\n setComponentOpacityByOids(oids: number[], opacity: number): void {\n const scene = this.context.getScene();\n if (!scene) return;\n\n const clampedOpacity = Math.max(0, Math.min(1, opacity));\n\n for (const oid of oids) {\n this.opacityModifiedOids.add(oid);\n this.opacityByOid.set(oid, clampedOpacity);\n\n const colorMat = this.materialByOid.get(oid);\n if (colorMat && colorMat.opacity !== clampedOpacity) {\n const clone = colorMat.clone();\n clone.opacity = clampedOpacity;\n clone.transparent = clampedOpacity < 1;\n this.materialByOid.set(oid, clone);\n this.originalOpacityByMaterial.set(clone, 1);\n }\n\n const collector = this.context.getMeshCollectorByOid(oid);\n collector.meshes.forEach((mesh) => {\n scene.add(mesh);\n const mat = colorMat\n ? (this.materialByOid.get(oid) as Material)\n : (mesh.material as Material);\n if (!this.originalOpacityByMaterial.has(mat)) {\n this.originalOpacityByMaterial.set(mat, mat.opacity);\n }\n mat.opacity = clampedOpacity;\n mat.transparent = clampedOpacity < 1;\n if (colorMat) mesh.material = mat;\n });\n\n if (!this.meshChangeHandlers.has(oid)) {\n const handler = () => this.applyToMeshes(oid);\n this.meshChangeHandlers.set(oid, handler);\n collector.addEventListener(\"mesh-change\", handler);\n }\n }\n\n this.context.hideByOids(this.getAllModifiedOids());\n }\n\n /**\n * 恢复指定构件的透明度\n * 若该 oid 已无颜色且无透明度修改,则从场景移除 split mesh 并 unhide 原 mesh\n */\n restoreComponentOpacityByOids(oids: number[]): void {\n const scene = this.context.getScene();\n if (!scene) return;\n\n for (const oid of oids) {\n this.opacityModifiedOids.delete(oid);\n this.opacityByOid.delete(oid);\n\n const collector = this.context.getMeshCollectorByOid(oid);\n collector.meshes.forEach((mesh) => {\n for (const mat of getMaterials(mesh)) {\n const original = this.originalOpacityByMaterial.get(mat);\n if (original !== undefined) {\n mat.opacity = original;\n mat.transparent = original < 1;\n this.originalOpacityByMaterial.delete(mat);\n }\n }\n if (\n !this.coloredOids.has(oid) &&\n !this.opacityModifiedOids.has(oid) &&\n mesh.parent === scene\n ) {\n scene.remove(mesh);\n }\n });\n\n if (!this.coloredOids.has(oid) && !this.opacityModifiedOids.has(oid)) {\n const handler = this.meshChangeHandlers.get(oid);\n if (handler) {\n this.meshChangeHandlers.delete(oid);\n collector.removeEventListener(\"mesh-change\", handler);\n }\n }\n }\n\n this.context.unhideByOids(oids);\n }\n}\n","import { Mesh } from \"three\";\nimport type { MeshCollector } from \"../MeshCollector\";\n\nexport interface InteractionFilterContext {\n getCollectorCache(): Map<number, MeshCollector>;\n}\n\n/**\n * 冻结与隔离逻辑:管理构件的交互过滤及 getMeshCollectorByOid 获取的 mesh 在场景中的显隐\n */\nexport class InteractionFilter {\n private frozenOids = new Set<number>();\n private isolatedOids = new Set<number>();\n private trackedMeshes = new Map<number, Set<Mesh>>();\n private meshListeners = new Map<\n Mesh,\n { onAdded: () => void; onRemoved: () => void }\n >();\n private isPluginRemoving = false;\n\n constructor(private context: InteractionFilterContext) {}\n\n isOidBlocked(oid: number): boolean {\n if (this.frozenOids.has(oid)) return true;\n if (this.isolatedOids.size > 0 && !this.isolatedOids.has(oid)) return true;\n return false;\n }\n\n private trackMesh(mesh: Mesh, oid: number): void {\n if (this.meshListeners.has(mesh)) return;\n\n const onAdded = () => {\n if (this.isPluginRemoving) return;\n mesh.userData._detachedParent = null;\n if (this.isOidBlocked(oid) && mesh.parent) {\n const parent = mesh.parent;\n this.isPluginRemoving = true;\n mesh.userData._detachedParent = parent;\n parent.remove(mesh);\n this.isPluginRemoving = false;\n }\n };\n\n const onRemoved = () => {\n if (this.isPluginRemoving) return;\n mesh.userData._detachedParent = null;\n };\n\n mesh.addEventListener(\"added\", onAdded);\n mesh.addEventListener(\"removed\", onRemoved);\n this.meshListeners.set(mesh, { onAdded, onRemoved });\n }\n\n private untrackMesh(mesh: Mesh): void {\n const listeners = this.meshListeners.get(mesh);\n if (listeners) {\n mesh.removeEventListener(\"added\", listeners.onAdded);\n mesh.removeEventListener(\"removed\", listeners.onRemoved);\n this.meshListeners.delete(mesh);\n }\n mesh.userData._detachedParent = null;\n }\n\n onCollectorMeshChange(oid: number, newMeshes: Mesh[]): void {\n const tracked = this.trackedMeshes.get(oid);\n const newSet = new Set(newMeshes);\n\n if (tracked) {\n for (const mesh of tracked) {\n if (!newSet.has(mesh)) {\n this.untrackMesh(mesh);\n tracked.delete(mesh);\n }\n }\n }\n\n const trackSet = tracked || new Set<Mesh>();\n for (const mesh of newMeshes) {\n if (!trackSet.has(mesh)) {\n this.trackMesh(mesh, oid);\n trackSet.add(mesh);\n }\n }\n this.trackedMeshes.set(oid, trackSet);\n }\n\n private syncCollectorMeshes(): void {\n this.isPluginRemoving = true;\n\n for (const [oid, collector] of this.context.getCollectorCache()) {\n const blocked = this.isOidBlocked(oid);\n\n for (const mesh of collector.meshes) {\n if (!this.meshListeners.has(mesh)) continue;\n\n if (blocked) {\n if (mesh.parent && !mesh.userData._detachedParent) {\n const parent = mesh.parent;\n mesh.userData._detachedParent = parent;\n parent.remove(mesh);\n }\n } else {\n const storedParent = mesh.userData._detachedParent;\n if (storedParent && !mesh.parent) {\n storedParent.add(mesh);\n mesh.userData._detachedParent = null;\n }\n }\n }\n }\n\n this.isPluginRemoving = false;\n }\n\n onUnregisterCollector(oid: number): void {\n const tracked = this.trackedMeshes.get(oid);\n if (tracked) {\n for (const mesh of tracked) {\n this.untrackMesh(mesh);\n }\n this.trackedMeshes.delete(oid);\n }\n }\n\n freezeByOids(oids: number[]): void {\n for (const oid of oids) {\n this.frozenOids.add(oid);\n }\n this.syncCollectorMeshes();\n }\n\n freezeByOid(oid: number): void {\n this.frozenOids.add(oid);\n this.syncCollectorMeshes();\n }\n\n unfreezeByOids(oids: number[]): void {\n for (const oid of oids) {\n this.frozenOids.delete(oid);\n }\n this.syncCollectorMeshes();\n }\n\n unfreezeByOid(oid: number): void {\n this.frozenOids.delete(oid);\n this.syncCollectorMeshes();\n }\n\n unfreeze(): void {\n this.frozenOids.clear();\n this.syncCollectorMeshes();\n }\n\n getFrozenOids(): number[] {\n return Array.from(this.frozenOids);\n }\n\n isolateByOids(oids: number[]): void {\n for (const oid of oids) {\n this.isolatedOids.add(oid);\n }\n this.syncCollectorMeshes();\n }\n\n isolateByOid(oid: number): void {\n this.isolatedOids.add(oid);\n this.syncCollectorMeshes();\n }\n\n unisolateByOids(oids: number[]): void {\n for (const oid of oids) {\n this.isolatedOids.delete(oid);\n }\n this.syncCollectorMeshes();\n }\n\n unisolateByOid(oid: number): void {\n this.isolatedOids.delete(oid);\n this.syncCollectorMeshes();\n }\n\n unisolate(): void {\n this.isolatedOids.clear();\n this.syncCollectorMeshes();\n }\n\n getIsolatedOids(): number[] {\n return Array.from(this.isolatedOids);\n }\n\n dispose(): void {\n for (const [, meshSet] of this.trackedMeshes) {\n for (const mesh of meshSet) {\n this.untrackMesh(mesh);\n }\n }\n this.trackedMeshes.clear();\n this.meshListeners.clear();\n this.frozenOids.clear();\n this.isolatedOids.clear();\n }\n}\n","// IndexedDB constants\nconst DB_NAME = \"GLTFParserPluginTilesCache\";\nconst DB_VERSION = 1;\nconst STORE_NAME = \"tiles\";\n\n/**\n * IndexedDB Cache Manager Class\n */\nexport class TileCacheDB {\n private dbPromise: Promise<IDBDatabase> | null = null;\n\n /**\n * Open/Get database connection\n */\n private openDB(): Promise<IDBDatabase> {\n if (this.dbPromise) {\n return this.dbPromise;\n }\n\n this.dbPromise = new Promise((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n\n request.onerror = () => {\n reject(request.error);\n };\n\n request.onsuccess = () => {\n resolve(request.result);\n };\n\n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result;\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n db.createObjectStore(STORE_NAME, { keyPath: \"url\" });\n }\n };\n });\n\n return this.dbPromise;\n }\n\n /**\n * Get data from cache\n * @param url Cache key (processedUrl)\n */\n async get(url: string): Promise<ArrayBuffer | null> {\n try {\n const db = await this.openDB();\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(STORE_NAME, \"readonly\");\n const store = transaction.objectStore(STORE_NAME);\n const request = store.get(url);\n\n request.onerror = () => {\n reject(request.error);\n };\n\n request.onsuccess = () => {\n const result = request.result;\n resolve(result ? result.data : null);\n };\n });\n } catch (error) {\n return null;\n }\n }\n\n /**\n * Store data to cache\n * @param url Cache key (processedUrl)\n * @param data Data to cache\n */\n async set(url: string, data: ArrayBuffer): Promise<void> {\n const db = await this.openDB();\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(STORE_NAME, \"readwrite\");\n const store = transaction.objectStore(STORE_NAME);\n const request = store.put({\n url,\n data,\n timestamp: Date.now(),\n });\n\n request.onerror = () => {\n reject(request.error);\n };\n\n request.onsuccess = () => {\n resolve();\n };\n });\n }\n\n /**\n * Clear cache\n */\n async clear(): Promise<void> {\n const db = await this.openDB();\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(STORE_NAME, \"readwrite\");\n const store = transaction.objectStore(STORE_NAME);\n const request = store.clear();\n\n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve();\n });\n }\n}\n\n// Global cache instance\nexport const tileCache = new TileCacheDB();\n","import {\r\n Box3,\r\n DoubleSide,\r\n Intersection,\r\n Material,\r\n Mesh,\r\n Object3D,\r\n WebGLRenderer,\r\n} from \"three\";\r\nimport type { Vector3 } from \"three\";\r\nimport {\r\n FeatureIdUniforms,\r\n FeatureInfo,\r\n buildOidToFeatureIdMap,\r\n getSplitMeshesFromTile,\r\n getTileMeshesByOid,\r\n queryFeatureFromIntersection,\r\n} from \"./mesh-helper\";\r\n\r\nimport { MeshCollector, type MeshHelperHost } from \"./MeshCollector\";\r\nimport { GLTFWorkerLoader } from \"./GLTFWorkerLoader\";\r\nimport {\r\n ComponentColorHelper,\r\n type ColorInput,\r\n} from \"./plugin/ComponentColorHelper\";\r\nimport { InteractionFilter } from \"./plugin/InteractionFilter\";\r\nimport { setMaxWorkers } from \"./utils\";\r\nimport {\r\n selectByBoxFromOidMap,\r\n selectByPolygonFromOidMap,\r\n} from \"./utils/spatial-query\";\r\nimport { tileCache } from \"./db\";\r\nimport { TilesRenderer } from \"3d-tiles-renderer\";\r\n\r\nimport type {\r\n GLTFParserPluginOptions,\r\n ModelInfo,\r\n StructureData,\r\n StructureNode,\r\n} from \"./plugin-types\";\r\n\r\nexport type {\r\n GLTFParserPluginOptions,\r\n ModelInfo,\r\n StructureData,\r\n StructureNode,\r\n};\r\n\r\ninterface TileWithCache {\r\n cached?: {\r\n scene: Object3D;\r\n };\r\n}\r\n\r\nexport class GLTFParserPlugin implements MeshHelperHost {\r\n name = \"GLTFParserPlugin\";\r\n\r\n private tiles: (TilesRenderer & Record<string, any>) | null = null;\r\n private _loader: GLTFWorkerLoader | null = null;\r\n private readonly _gltfRegex = /\\.(gltf|glb)$/g;\r\n private readonly _options: GLTFParserPluginOptions;\r\n\r\n // --- Structure data properties ---\r\n private _structureData: StructureData | null = null;\r\n private _oidNodeMap: Map<number, StructureNode> = new Map();\r\n private _structurePromise: Promise<StructureData | null> | null = null;\r\n\r\n // --- Model info properties ---\r\n private _modelInfo: ModelInfo | null = null;\r\n private _modelInfoPromise: Promise<ModelInfo | null> | null = null;\r\n\r\n private _interactionFilter: InteractionFilter;\r\n private _componentColorHelper: ComponentColorHelper | null = null;\r\n\r\n // --- Mesh helper properties ---\r\n oids: number[] = [];\r\n private renderer: WebGLRenderer | null = null;\r\n private splitMeshCache: Map<string, Mesh[]> = new Map();\r\n private maxUniformVectors: number = 1024;\r\n private featureIdCount: number = 32;\r\n private collectors: Set<MeshCollector> = new Set();\r\n private collectorCache: Map<number, MeshCollector> = new Map();\r\n\r\n /**\r\n * Create a GLTFParserPlugin instance\r\n * @param options configuration options\r\n */\r\n constructor(options?: GLTFParserPluginOptions) {\r\n this._options = {\r\n metadata: true,\r\n maxWorkers: navigator.hardwareConcurrency || 4,\r\n useIndexedDB: false,\r\n ...options,\r\n };\r\n\r\n if (options?.renderer) {\r\n this.renderer = options.renderer;\r\n }\r\n\r\n this._interactionFilter = new InteractionFilter({\r\n getCollectorCache: () => this.collectorCache,\r\n });\r\n\r\n setMaxWorkers(this._options.maxWorkers!);\r\n }\r\n\r\n /**\r\n * Plugin initialization, called by TilesRenderer\r\n */\r\n init(tiles: TilesRenderer) {\r\n this.tiles = tiles;\r\n\r\n this._componentColorHelper = new ComponentColorHelper({\r\n hideByOids: (oids) => this.hideByOids(oids),\r\n unhideByOids: (oids) => this.unhideByOids(oids),\r\n getMeshCollectorByOid: (oid) => this.getMeshCollectorByOid(oid),\r\n getScene: () => this.tiles?.group ?? null,\r\n });\r\n\r\n // --- GLTF loader setup ---\r\n this._loader = new GLTFWorkerLoader(tiles.manager, {\r\n metadata: this._options.metadata,\r\n materialBuilder: this._options.materialBuilder,\r\n });\r\n tiles.manager.addHandler(this._gltfRegex, this._loader);\r\n\r\n // --- Mesh helper setup ---\r\n if (this.renderer) {\r\n this._updateWebGLLimits();\r\n }\r\n\r\n tiles.addEventListener(\"load-model\", this._onLoadModelCB);\r\n tiles.addEventListener(\"tiles-load-end\", this._onTilesLoadEndCB);\r\n\r\n tiles.traverse((tile: any) => {\r\n const tileWithCache = tile as TileWithCache;\r\n if (tileWithCache.cached?.scene) {\r\n this._onLoadModel(tileWithCache.cached.scene);\r\n }\r\n return true;\r\n }, null);\r\n }\r\n\r\n // =============================================\r\n // GLTF Parser Methods\r\n // =============================================\r\n\r\n /**\r\n * Fetch tile data with IndexedDB caching support\r\n */\r\n async fetchData(\r\n url: string,\r\n options?: RequestInit,\r\n ): Promise<Response | ArrayBuffer | object> {\r\n const isJson = url.toLowerCase().endsWith(\".json\");\r\n if (!this._options.useIndexedDB || isJson) {\r\n return this.tiles!.fetchData(url, options);\r\n }\r\n\r\n try {\r\n const cachedData = await tileCache.get(url);\r\n\r\n if (cachedData) {\r\n return cachedData;\r\n }\r\n\r\n const response = await this.tiles!.fetchData(url, options);\r\n\r\n if (!response.ok) {\r\n return response;\r\n }\r\n\r\n const arrayBuffer = await response.arrayBuffer();\r\n\r\n tileCache.set(url, arrayBuffer).catch((err: unknown) => {\r\n console.warn(\"[GLTFParserPlugin] Failed to cache data:\", err);\r\n });\r\n\r\n return arrayBuffer;\r\n } catch (error) {\r\n return this.tiles!.fetchData(url, options);\r\n }\r\n }\r\n\r\n /**\r\n * Clear all cached tile data from IndexedDB\r\n */\r\n async clearCache(): Promise<void> {\r\n await tileCache.clear();\r\n console.info(\"[GLTFParserPlugin] Cache cleared\");\r\n }\r\n\r\n async parseTile(\r\n buffer: ArrayBuffer,\r\n tile: any,\r\n extension: any,\r\n uri: string,\r\n abortSignal: AbortSignal,\r\n ) {\r\n if (this._options.beforeParseTile) {\r\n buffer = await this._options.beforeParseTile(\r\n buffer,\r\n tile,\r\n extension,\r\n uri,\r\n abortSignal,\r\n );\r\n }\r\n return this.tiles!.parseTile(buffer, tile, extension, uri, abortSignal);\r\n }\r\n\r\n // =============================================\r\n // Structure Data Methods\r\n // =============================================\r\n\r\n private _getStructureUrl(): string | null {\r\n const rootURL = this.tiles?.rootURL as string | undefined;\r\n if (!rootURL) return null;\r\n return rootURL.replace(/[^/]+$/, \"structure.json\");\r\n }\r\n\r\n private _buildOidNodeMap(\r\n node: StructureNode,\r\n map: Map<number, StructureNode>,\r\n ): void {\r\n if (node.id !== undefined) {\r\n map.set(node.id, node);\r\n }\r\n if (node.children) {\r\n for (const child of node.children) {\r\n this._buildOidNodeMap(child, map);\r\n }\r\n }\r\n }\r\n\r\n private async _fetchStructureData(): Promise<StructureData | null> {\r\n const url = this._getStructureUrl();\r\n if (!url) {\r\n console.warn(\r\n \"[GLTFParserPlugin] Cannot derive structure.json URL: tiles not initialized\",\r\n );\r\n return null;\r\n }\r\n\r\n try {\r\n const response = await fetch(url);\r\n if (!response.ok) {\r\n console.warn(\r\n `[GLTFParserPlugin] Failed to fetch structure.json: ${response.status}`,\r\n );\r\n return null;\r\n }\r\n const data: StructureData = await response.json();\r\n this._structureData = data;\r\n\r\n this._oidNodeMap.clear();\r\n if (data.trees) {\r\n for (const tree of data.trees) {\r\n this._buildOidNodeMap(tree, this._oidNodeMap);\r\n }\r\n }\r\n\r\n return data;\r\n } catch (error) {\r\n console.error(\"[GLTFParserPlugin] Error loading structure.json:\", error);\r\n return null;\r\n }\r\n }\r\n\r\n private async _ensureStructureLoaded(): Promise<StructureData | null> {\r\n if (this._structureData) return this._structureData;\r\n if (!this._structurePromise) {\r\n this._structurePromise = this._fetchStructureData();\r\n }\r\n return this._structurePromise;\r\n }\r\n\r\n /**\r\n * 根据 oid 获取 structure.json 中对应的节点树数据\r\n * 包含 bbox、children、name 等完整结构信息\r\n * 首次调用时会自动从 tileset URL 推导并请求 structure.json\r\n */\r\n async getNodeTreeByOid(oid: number): Promise<StructureNode | null> {\r\n await this._ensureStructureLoaded();\r\n return this._oidNodeMap.get(oid) ?? null;\r\n }\r\n\r\n /**\r\n * 根据 oid 数组批量获取 structure.json 中对应的节点树数据\r\n */\r\n async getNodeTreeByOids(oids: number[]): Promise<Map<number, StructureNode>> {\r\n await this._ensureStructureLoaded();\r\n const result = new Map<number, StructureNode>();\r\n for (const oid of oids) {\r\n const node = this._oidNodeMap.get(oid);\r\n if (node) {\r\n result.set(oid, node);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * 获取完整的 structure.json 数据\r\n * 首次调用时会自动请求\r\n */\r\n async getStructureData(): Promise<StructureData | null> {\r\n return this._ensureStructureLoaded();\r\n }\r\n\r\n /**\r\n * 选择包围盒范围内的构件(包含相交和包含两种情况)\r\n * @param box 查询用的 Box3 范围,坐标系与 structure.json 中 bbox 一致\r\n * @returns 范围内所有构件的 oid 数组\r\n */\r\n async selectByBox(box: Box3): Promise<number[]> {\r\n await this._ensureStructureLoaded();\r\n return selectByBoxFromOidMap(this._oidNodeMap, box);\r\n }\r\n\r\n /**\r\n * 选择多边形(平面投影)范围内的构件(包含相交和包含两种情况)\r\n * @param polygon 多边形顶点数组(Vector3),按顺序连接构成闭合多边形\r\n * @param axis 投影平面,决定使用 bbox 的哪两个轴做 2D 判定\r\n * - 'xz'(默认):俯视图,取 bbox 的 x/z 坐标\r\n * - 'xy':正视图,取 bbox 的 x/y 坐标\r\n * - 'yz':侧视图,取 bbox 的 y/z 坐标\r\n * @returns 范围内所有构件的 oid 数组\r\n */\r\n async selectByPolygon(\r\n polygon: Vector3[],\r\n axis: \"xy\" | \"xz\" | \"yz\" = \"xz\",\r\n ): Promise<number[]> {\r\n await this._ensureStructureLoaded();\r\n return selectByPolygonFromOidMap(this._oidNodeMap, polygon, axis);\r\n }\r\n\r\n // =============================================\r\n // Model Info Methods\r\n // =============================================\r\n\r\n private _getModelInfoUrl(): string | null {\r\n const rootURL = this.tiles?.rootURL as string | undefined;\r\n if (!rootURL) return null;\r\n return rootURL.replace(/[^/]+$/, \"modelInfo.json\");\r\n }\r\n\r\n private async _fetchModelInfo(): Promise<ModelInfo | null> {\r\n const url = this._getModelInfoUrl();\r\n if (!url) {\r\n console.warn(\r\n \"[GLTFParserPlugin] Cannot derive modelInfo.json URL: tiles not initialized\",\r\n );\r\n return null;\r\n }\r\n\r\n try {\r\n const response = await fetch(url);\r\n if (!response.ok) {\r\n console.warn(\r\n `[GLTFParserPlugin] Failed to fetch modelInfo.json: ${response.status}`,\r\n );\r\n return null;\r\n }\r\n const data: ModelInfo = await response.json();\r\n this._modelInfo = data;\r\n return data;\r\n } catch (error) {\r\n console.error(\"[GLTFParserPlugin] Error loading modelInfo.json:\", error);\r\n return null;\r\n }\r\n }\r\n\r\n private async _ensureModelInfoLoaded(): Promise<ModelInfo | null> {\r\n if (this._modelInfo) return this._modelInfo;\r\n if (!this._modelInfoPromise) {\r\n this._modelInfoPromise = this._fetchModelInfo();\r\n }\r\n return this._modelInfoPromise;\r\n }\r\n\r\n /**\r\n * 获取 modelInfo.json 数据\r\n * 包含模型的基本信息:动画支持、材质数量、顶点数、三角形数等\r\n * 首次调用时会自动从 tileset URL 推导并请求 modelInfo.json\r\n */\r\n async getModelInfo(): Promise<ModelInfo | null> {\r\n return this._ensureModelInfoLoaded();\r\n }\r\n\r\n // =============================================\r\n // Mesh Helper Methods (from MaptalksTilerPlugin)\r\n // =============================================\r\n\r\n /**\r\n * Load model callback\r\n */\r\n private _onLoadModelCB = ({ scene }: { scene: Object3D }) => {\r\n this._onLoadModel(scene);\r\n };\r\n\r\n /**\r\n * Tiles load end callback\r\n */\r\n private _onTilesLoadEndCB = () => {\r\n this._notifyCollectors();\r\n };\r\n\r\n private _onLoadModel(scene: Object3D) {\r\n this.splitMeshCache.clear();\r\n\r\n buildOidToFeatureIdMap(scene);\r\n scene.traverse((c) => {\r\n if ((c as Mesh).material) {\r\n this._setupMaterial(c as Mesh);\r\n }\r\n });\r\n }\r\n\r\n private _notifyCollectors(): void {\r\n for (const collector of this.collectors) {\r\n collector._updateMeshes();\r\n }\r\n }\r\n\r\n _registerCollector(collector: MeshCollector): void {\r\n this.collectors.add(collector);\r\n }\r\n\r\n _unregisterCollector(collector: MeshCollector): void {\r\n const oid = collector.getOid();\r\n this.collectors.delete(collector);\r\n this.collectorCache.delete(oid);\r\n this._interactionFilter.onUnregisterCollector(oid);\r\n }\r\n\r\n private _updateWebGLLimits() {\r\n const gl = this.renderer!.getContext();\r\n const maxVectors = gl.getParameter(gl.MAX_FRAGMENT_UNIFORM_VECTORS);\r\n this.maxUniformVectors = maxVectors;\r\n }\r\n\r\n /**\r\n * Dynamically calculate FEATURE_ID_COUNT based on WebGL limits and current oid count\r\n */\r\n private _calculateFeatureIdCount(): number {\r\n const maxUniformVectors = this.maxUniformVectors;\r\n const currentOidCount = this.oids.length;\r\n\r\n if (currentOidCount > maxUniformVectors) {\r\n throw new Error(\r\n `The number of OIDs to hide (${currentOidCount}) exceeds the WebGL MAX_FRAGMENT_UNIFORM_VECTORS limit (${maxUniformVectors}).`,\r\n );\r\n }\r\n\r\n const minFeatureIdCount = 32;\r\n\r\n if (currentOidCount <= minFeatureIdCount) {\r\n return minFeatureIdCount;\r\n }\r\n\r\n const powerOf2 = Math.ceil(Math.log2(currentOidCount));\r\n return Math.pow(2, powerOf2);\r\n }\r\n\r\n /**\r\n * Set up shader modification for hiding specific features\r\n */\r\n private _setupMaterial(mesh: Mesh) {\r\n const material = mesh.material as Material;\r\n\r\n if (material.userData._meshHelperSetup) {\r\n return;\r\n }\r\n material.userData._meshHelperSetup = true;\r\n\r\n material.side = DoubleSide;\r\n\r\n const previousOnBeforeCompile = material.onBeforeCompile;\r\n\r\n if (!material.defines) {\r\n material.defines = {};\r\n }\r\n\r\n material.userData._materialFeatureIdCount = this.featureIdCount;\r\n\r\n Object.defineProperty(material.defines, \"FEATURE_ID_COUNT\", {\r\n get: () => {\r\n if (material.userData._materialFeatureIdCount !== this.featureIdCount) {\r\n material.userData._materialFeatureIdCount = this.featureIdCount;\r\n material.needsUpdate = true;\r\n }\r\n return material.userData._materialFeatureIdCount;\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n\r\n material.onBeforeCompile = (shader, renderer) => {\r\n previousOnBeforeCompile?.call(material, shader, renderer);\r\n\r\n if (shader.vertexShader.includes(\"varying float vFeatureId;\")) {\r\n return;\r\n }\r\n\r\n shader.uniforms.hiddenFeatureIds = new FeatureIdUniforms(mesh, this);\r\n\r\n shader.vertexShader = shader.vertexShader.replace(\r\n \"#include <common>\",\r\n `#include <common>\r\n attribute float _feature_id_0;\r\n varying float vFeatureId;`,\r\n );\r\n\r\n shader.vertexShader = shader.vertexShader.replace(\r\n \"#include <begin_vertex>\",\r\n `#include <begin_vertex>\r\n vFeatureId = _feature_id_0;`,\r\n );\r\n\r\n shader.fragmentShader = shader.fragmentShader.replace(\r\n \"#include <common>\",\r\n `#include <common>\r\n uniform float hiddenFeatureIds[FEATURE_ID_COUNT];\r\n varying float vFeatureId;\r\n \r\n bool shouldHideFeature(float featureId) {\r\n for(int i = 0; i < FEATURE_ID_COUNT; i++) {\r\n if(abs(hiddenFeatureIds[i] - featureId) < 0.001) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }`,\r\n );\r\n\r\n shader.fragmentShader = shader.fragmentShader.replace(\r\n \"void main() {\",\r\n `void main() {\r\n if(shouldHideFeature(vFeatureId)) {\r\n discard;\r\n }`,\r\n );\r\n };\r\n }\r\n\r\n /**\r\n * Query feature information from intersection\r\n * Respects freeze and isolate filters\r\n */\r\n queryFeatureFromIntersection(hit: Intersection): FeatureInfo {\r\n const result = queryFeatureFromIntersection(hit);\r\n\r\n if (result.isValid && result.oid !== undefined) {\r\n if (this._interactionFilter.isOidBlocked(result.oid)) {\r\n return {\r\n isValid: false,\r\n error: this._interactionFilter.getFrozenOids().includes(result.oid)\r\n ? \"Component is frozen\"\r\n : \"Component is not in isolated set\",\r\n };\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // =============================================\r\n // Interaction Filter Methods (delegated)\r\n // =============================================\r\n\r\n freezeByOids(oids: number[]): void {\r\n this._interactionFilter.freezeByOids(oids);\r\n }\r\n\r\n freezeByOid(oid: number): void {\r\n this._interactionFilter.freezeByOid(oid);\r\n }\r\n\r\n unfreezeByOids(oids: number[]): void {\r\n this._interactionFilter.unfreezeByOids(oids);\r\n }\r\n\r\n unfreezeByOid(oid: number): void {\r\n this._interactionFilter.unfreezeByOid(oid);\r\n }\r\n\r\n unfreeze(): void {\r\n this._interactionFilter.unfreeze();\r\n }\r\n\r\n getFrozenOids(): number[] {\r\n return this._interactionFilter.getFrozenOids();\r\n }\r\n\r\n isolateByOids(oids: number[]): void {\r\n this._interactionFilter.isolateByOids(oids);\r\n }\r\n\r\n isolateByOid(oid: number): void {\r\n this._interactionFilter.isolateByOid(oid);\r\n }\r\n\r\n unisolateByOids(oids: number[]): void {\r\n this._interactionFilter.unisolateByOids(oids);\r\n }\r\n\r\n unisolateByOid(oid: number): void {\r\n this._interactionFilter.unisolateByOid(oid);\r\n }\r\n\r\n unisolate(): void {\r\n this._interactionFilter.unisolate();\r\n }\r\n\r\n getIsolatedOids(): number[] {\r\n return this._interactionFilter.getIsolatedOids();\r\n }\r\n\r\n /**\r\n * 内部方法:根据 oid 获取 mesh 数组\r\n */\r\n _getMeshesByOidInternal(oid: number): Mesh[] {\r\n const tileMeshes = getTileMeshesByOid(this.tiles!, oid);\r\n\r\n const allSplitMeshes: Mesh[] = [];\r\n\r\n for (const tileMesh of tileMeshes) {\r\n const cacheKey = `${oid}_${tileMesh.uuid}`;\r\n\r\n let splitMeshes = this.splitMeshCache.get(cacheKey);\r\n\r\n if (!splitMeshes) {\r\n splitMeshes = getSplitMeshesFromTile(tileMesh, oid);\r\n this.splitMeshCache.set(cacheKey, splitMeshes);\r\n }\r\n allSplitMeshes.push(...splitMeshes);\r\n }\r\n\r\n return allSplitMeshes;\r\n }\r\n\r\n /**\r\n * 根据 oid 获取 MeshCollector\r\n * MeshCollector 会监听瓦片变化,自动更新 meshes 并触发 mesh-change 事件\r\n * 内部缓存:相同 oid 多次调用会返回同一个 collector 实例\r\n */\r\n getMeshCollectorByOid(oid: number): MeshCollector {\r\n const existing = this.collectorCache.get(oid);\r\n if (existing) {\r\n return existing;\r\n }\r\n const collector = new MeshCollector(oid, this);\r\n this.collectorCache.set(oid, collector);\r\n\r\n this._interactionFilter.onCollectorMeshChange(oid, collector.meshes);\r\n\r\n collector.addEventListener(\"mesh-change\", (event) => {\r\n this._interactionFilter.onCollectorMeshChange(oid, event.meshes);\r\n });\r\n\r\n return collector;\r\n }\r\n\r\n /**\r\n * Hide the corresponding part of the original mesh according to the OID array\r\n */\r\n hideByOids(oids: number[]): void {\r\n this.oids = oids;\r\n this.featureIdCount = this._calculateFeatureIdCount();\r\n }\r\n\r\n /**\r\n * Restore the display of the corresponding mesh according to the OID array\r\n */\r\n unhideByOids(oids: number[]): void {\r\n const oidSet = new Set(oids);\r\n const newOids = this.oids.filter((existingOid) => !oidSet.has(existingOid));\r\n this.oids = newOids;\r\n this.featureIdCount = this._calculateFeatureIdCount();\r\n }\r\n\r\n /**\r\n * 根据 oid 数组设置构件颜色\r\n * 隐藏原 mesh,将 split mesh 替换材质后加入场景(使用 tiles.group)\r\n * @param oids 构件 OID 数组\r\n * @param color 颜色值,支持 hex 数字、颜色字符串(如 \"#ff0000\")、THREE.Color 对象\r\n */\r\n setComponentColorByOids(oids: number[], color: ColorInput): void {\r\n this._componentColorHelper?.setComponentColorByOids(oids, color);\r\n }\r\n\r\n /**\r\n * 恢复指定构件的颜色\r\n * 从场景移除 split mesh,unhide 原 mesh\r\n * @param oids 构件 OID 数组\r\n */\r\n restoreComponentColorByOids(oids: number[]): void {\r\n this._componentColorHelper?.restoreComponentColorByOids(oids);\r\n }\r\n\r\n /**\r\n * 根据 oid 数组设置构件透明度\r\n * @param oids 构件 OID 数组\r\n * @param opacity 透明度,0-1,0 完全透明,1 完全不透明\r\n */\r\n setComponentOpacityByOids(oids: number[], opacity: number): void {\r\n this._componentColorHelper?.setComponentOpacityByOids(oids, opacity);\r\n }\r\n\r\n /**\r\n * 恢复指定构件的透明度\r\n * @param oids 构件 OID 数组\r\n */\r\n restoreComponentOpacityByOids(oids: number[]): void {\r\n this._componentColorHelper?.restoreComponentOpacityByOids(oids);\r\n }\r\n\r\n /**\r\n * Restore the original materials of the mesh\r\n */\r\n unhide(): void {\r\n this.oids = [];\r\n this.featureIdCount = this._calculateFeatureIdCount();\r\n }\r\n\r\n /**\r\n * Get the current feature ID count\r\n */\r\n getFeatureIdCount(): number {\r\n return this.featureIdCount;\r\n }\r\n\r\n /**\r\n * Plugin disposal\r\n */\r\n dispose() {\r\n if (this.tiles) {\r\n this.tiles.manager.removeHandler(this._gltfRegex);\r\n this.tiles.removeEventListener(\"load-model\", this._onLoadModelCB);\r\n this.tiles.removeEventListener(\"tiles-load-end\", this._onTilesLoadEndCB);\r\n }\r\n\r\n if (this._loader) {\r\n this._loader.removeListeners();\r\n }\r\n\r\n for (const collector of this.collectors) {\r\n collector.dispose();\r\n }\r\n this.collectors.clear();\r\n this.collectorCache.clear();\r\n\r\n this.splitMeshCache.clear();\r\n\r\n this._structureData = null;\r\n this._oidNodeMap.clear();\r\n this._structurePromise = null;\r\n\r\n // Clear model info data\r\n this._modelInfo = null;\r\n this._modelInfoPromise = null;\r\n\r\n this._interactionFilter.dispose();\r\n this._componentColorHelper = null;\r\n\r\n this._loader = null;\r\n this.tiles = null;\r\n }\r\n}\r\n"],"names":["GLTFWorkerClass","Y","E","Oe","Xn","Yn","K","ei","$n","ts","un","Qn","Kn","Jn","Zn","Se","Wt","StructuralMetadata","MeshFeatures"],"mappings":"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","x_google_ignoreList":[10,11]}
|