gltf-parser-plugin 1.0.8 → 1.1.0

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.
@@ -2066,6 +2066,10 @@ class GLTFParserPlugin {
2066
2066
  _loader = null;
2067
2067
  _gltfRegex = /\.(gltf|glb)$/g;
2068
2068
  _options;
2069
+ // --- Structure data properties ---
2070
+ _structureData = null;
2071
+ _oidNodeMap = /* @__PURE__ */ new Map();
2072
+ _structurePromise = null;
2069
2073
  // --- Mesh helper properties ---
2070
2074
  oids = [];
2071
2075
  renderer = null;
@@ -2073,6 +2077,7 @@ class GLTFParserPlugin {
2073
2077
  maxUniformVectors = 1024;
2074
2078
  featureIdCount = 32;
2075
2079
  collectors = /* @__PURE__ */ new Set();
2080
+ collectorCache = /* @__PURE__ */ new Map();
2076
2081
  /**
2077
2082
  * Create a GLTFParserPlugin instance
2078
2083
  * @param options configuration options
@@ -2161,6 +2166,87 @@ class GLTFParserPlugin {
2161
2166
  return this.tiles.parseTile(buffer, tile, extension, uri, abortSignal);
2162
2167
  }
2163
2168
  // =============================================
2169
+ // Structure Data Methods
2170
+ // =============================================
2171
+ _getStructureUrl() {
2172
+ const rootURL = this.tiles?.rootURL;
2173
+ if (!rootURL) return null;
2174
+ return rootURL.replace(/[^/]+$/, "structure.json");
2175
+ }
2176
+ _buildOidNodeMap(node, map) {
2177
+ if (node.id !== void 0) {
2178
+ map.set(node.id, node);
2179
+ }
2180
+ if (node.children) {
2181
+ for (const child of node.children) {
2182
+ this._buildOidNodeMap(child, map);
2183
+ }
2184
+ }
2185
+ }
2186
+ async _fetchStructureData() {
2187
+ const url = this._getStructureUrl();
2188
+ if (!url) {
2189
+ console.warn("[GLTFParserPlugin] Cannot derive structure.json URL: tiles not initialized");
2190
+ return null;
2191
+ }
2192
+ try {
2193
+ const response = await fetch(url);
2194
+ if (!response.ok) {
2195
+ console.warn(`[GLTFParserPlugin] Failed to fetch structure.json: ${response.status}`);
2196
+ return null;
2197
+ }
2198
+ const data = await response.json();
2199
+ this._structureData = data;
2200
+ this._oidNodeMap.clear();
2201
+ if (data.trees) {
2202
+ for (const tree of data.trees) {
2203
+ this._buildOidNodeMap(tree, this._oidNodeMap);
2204
+ }
2205
+ }
2206
+ return data;
2207
+ } catch (error) {
2208
+ console.error("[GLTFParserPlugin] Error loading structure.json:", error);
2209
+ return null;
2210
+ }
2211
+ }
2212
+ async _ensureStructureLoaded() {
2213
+ if (this._structureData) return this._structureData;
2214
+ if (!this._structurePromise) {
2215
+ this._structurePromise = this._fetchStructureData();
2216
+ }
2217
+ return this._structurePromise;
2218
+ }
2219
+ /**
2220
+ * 根据 oid 获取 structure.json 中对应的节点树数据
2221
+ * 包含 bbox、children、name 等完整结构信息
2222
+ * 首次调用时会自动从 tileset URL 推导并请求 structure.json
2223
+ */
2224
+ async getNodeTreeByOid(oid) {
2225
+ await this._ensureStructureLoaded();
2226
+ return this._oidNodeMap.get(oid) ?? null;
2227
+ }
2228
+ /**
2229
+ * 根据 oid 数组批量获取 structure.json 中对应的节点树数据
2230
+ */
2231
+ async getNodeTreeByOids(oids) {
2232
+ await this._ensureStructureLoaded();
2233
+ const result = /* @__PURE__ */ new Map();
2234
+ for (const oid of oids) {
2235
+ const node = this._oidNodeMap.get(oid);
2236
+ if (node) {
2237
+ result.set(oid, node);
2238
+ }
2239
+ }
2240
+ return result;
2241
+ }
2242
+ /**
2243
+ * 获取完整的 structure.json 数据
2244
+ * 首次调用时会自动请求
2245
+ */
2246
+ async getStructureData() {
2247
+ return this._ensureStructureLoaded();
2248
+ }
2249
+ // =============================================
2164
2250
  // Mesh Helper Methods (from MaptalksTilerPlugin)
2165
2251
  // =============================================
2166
2252
  /**
@@ -2194,6 +2280,7 @@ class GLTFParserPlugin {
2194
2280
  }
2195
2281
  _unregisterCollector(collector) {
2196
2282
  this.collectors.delete(collector);
2283
+ this.collectorCache.delete(collector.getOid());
2197
2284
  }
2198
2285
  _updateWebGLLimits() {
2199
2286
  const gl = this.renderer.getContext();
@@ -2311,9 +2398,16 @@ class GLTFParserPlugin {
2311
2398
  /**
2312
2399
  * 根据 oid 获取 MeshCollector
2313
2400
  * MeshCollector 会监听瓦片变化,自动更新 meshes 并触发 mesh-change 事件
2401
+ * 内部缓存:相同 oid 多次调用会返回同一个 collector 实例
2314
2402
  */
2315
2403
  getMeshCollectorByOid(oid) {
2316
- return new MeshCollector(oid, this);
2404
+ const existing = this.collectorCache.get(oid);
2405
+ if (existing) {
2406
+ return existing;
2407
+ }
2408
+ const collector = new MeshCollector(oid, this);
2409
+ this.collectorCache.set(oid, collector);
2410
+ return collector;
2317
2411
  }
2318
2412
  /**
2319
2413
  * Hide the corresponding part of the original mesh according to the OID array
@@ -2360,7 +2454,11 @@ class GLTFParserPlugin {
2360
2454
  collector.dispose();
2361
2455
  }
2362
2456
  this.collectors.clear();
2457
+ this.collectorCache.clear();
2363
2458
  this.splitMeshCache.clear();
2459
+ this._structureData = null;
2460
+ this._oidNodeMap.clear();
2461
+ this._structurePromise = null;
2364
2462
  this._loader = null;
2365
2463
  this.tiles = null;
2366
2464
  }
@@ -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/3d-tiles-renderer@0.4.21_three@0.183.1/node_modules/3d-tiles-renderer/src/three/plugins/gltf/metadata/utilities/ClassPropertyHelpers.js","../node_modules/.pnpm/3d-tiles-renderer@0.4.21_three@0.183.1/node_modules/3d-tiles-renderer/src/three/plugins/gltf/metadata/classes/ClassProperty.js","../node_modules/.pnpm/3d-tiles-renderer@0.4.21_three@0.183.1/node_modules/3d-tiles-renderer/src/three/plugins/gltf/metadata/classes/PropertySetAccessor.js","../node_modules/.pnpm/3d-tiles-renderer@0.4.21_three@0.183.1/node_modules/3d-tiles-renderer/src/three/plugins/gltf/metadata/classes/PropertyAttributeAccessor.js","../node_modules/.pnpm/3d-tiles-renderer@0.4.21_three@0.183.1/node_modules/3d-tiles-renderer/src/three/plugins/gltf/metadata/classes/PropertyTableAccessor.js","../node_modules/.pnpm/three@0.183.1/node_modules/three/examples/jsm/postprocessing/Pass.js","../node_modules/.pnpm/3d-tiles-renderer@0.4.21_three@0.183.1/node_modules/3d-tiles-renderer/src/three/plugins/gltf/metadata/utilities/TextureReadUtility.js","../node_modules/.pnpm/3d-tiles-renderer@0.4.21_three@0.183.1/node_modules/3d-tiles-renderer/src/three/plugins/gltf/metadata/utilities/TexCoordUtilities.js","../node_modules/.pnpm/3d-tiles-renderer@0.4.21_three@0.183.1/node_modules/3d-tiles-renderer/src/three/plugins/gltf/metadata/classes/PropertyTextureAccessor.js","../node_modules/.pnpm/3d-tiles-renderer@0.4.21_three@0.183.1/node_modules/3d-tiles-renderer/src/three/plugins/gltf/metadata/classes/StructuralMetadata.js","../node_modules/.pnpm/3d-tiles-renderer@0.4.21_three@0.183.1/node_modules/3d-tiles-renderer/src/three/plugins/gltf/metadata/classes/MeshFeatures.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\tVector2,\n\tVector3,\n\tVector4,\n\tMatrix2,\n\tMatrix3,\n\tMatrix4,\n} from 'three';\n\n// returns the field in the object with a resolved default\nexport function getField( object, key, def ) {\n\n\treturn object && key in object ? object[ key ] : def;\n\n}\n\n// checks the structural metadata type\nexport function isNumericType( type ) {\n\n\treturn type !== 'BOOLEAN' && type !== 'STRING' && type !== 'ENUM';\n\n}\n\n// check if the class property type is a float component type value\nexport function isFloatComponentType( type ) {\n\n\treturn /^FLOAT/.test( type );\n\n}\n\n// check if the class property type is a vector type\nexport function isVectorType( type ) {\n\n\treturn /^VEC/.test( type );\n\n}\n\n// check if the class property type is a matrix type\nexport function isMatrixType( type ) {\n\n\treturn /^MAT/.test( type );\n\n}\n\n// returns a value from the given buffer of the given type\nexport function readDataFromBufferToType( buffer, offset, type, target = null ) {\n\n\tif ( isMatrixType( type ) ) {\n\n\t\treturn target.fromArray( buffer, offset );\n\n\t} else if ( isVectorType( type ) ) {\n\n\t\treturn target.fromArray( buffer, offset );\n\n\t} else {\n\n\t\treturn buffer[ offset ];\n\n\t}\n\n}\n\n// gets a new instance of the given structural metadata type\nexport function getTypeInstance( property ) {\n\n\tconst { type, componentType } = property;\n\tswitch ( type ) {\n\n\t\tcase 'SCALAR': return componentType === 'INT64' ? 0n : 0;\n\t\tcase 'VEC2': return new Vector2();\n\t\tcase 'VEC3': return new Vector3();\n\t\tcase 'VEC4': return new Vector4();\n\t\tcase 'MAT2': return new Matrix2();\n\t\tcase 'MAT3': return new Matrix3();\n\t\tcase 'MAT4': return new Matrix4();\n\t\tcase 'BOOLEAN': return false;\n\t\tcase 'STRING': return '';\n\n\t\t// the final value for enums is a string but are represented as integers\n\t\t// during intermediate steps\n\t\tcase 'ENUM': return 0;\n\n\t}\n\n}\n\n// returns false if the given value is not of \"type\"\nexport function isTypeInstance( type, value ) {\n\n\tif ( value === null || value === undefined ) {\n\n\t\treturn false;\n\n\t}\n\n\tswitch ( type ) {\n\n\t\tcase 'SCALAR': return typeof value === 'number' || typeof value === 'bigint';\n\t\tcase 'VEC2': return value.isVector2;\n\t\tcase 'VEC3': return value.isVector3;\n\t\tcase 'VEC4': return value.isVector4;\n\t\tcase 'MAT2': return value.isMatrix2;\n\t\tcase 'MAT3': return value.isMatrix3;\n\t\tcase 'MAT4': return value.isMatrix4;\n\t\tcase 'BOOLEAN': return typeof value === 'boolean';\n\t\tcase 'STRING': return typeof value === 'string';\n\t\tcase 'ENUM': return typeof value === 'number' || typeof value === 'bigint';\n\n\t}\n\n\tthrow new Error( 'ClassProperty: invalid type.' );\n\n}\n\n// gets a new numeric array constructor from the given structural metadata type\nexport function getArrayConstructorFromComponentType( componentType, type = null ) {\n\n\tswitch ( componentType ) {\n\n\t\tcase 'INT8': return Int8Array;\n\t\tcase 'INT16': return Int16Array;\n\t\tcase 'INT32': return Int32Array;\n\t\tcase 'INT64': return BigInt64Array;\n\n\t\tcase 'UINT8': return Uint8Array;\n\t\tcase 'UINT16': return Uint16Array;\n\t\tcase 'UINT32': return Uint32Array;\n\t\tcase 'UINT64': return BigUint64Array;\n\n\t\tcase 'FLOAT32': return Float32Array;\n\t\tcase 'FLOAT64': return Float64Array;\n\n\t}\n\n\tswitch ( type ) {\n\n\t\tcase 'BOOLEAN': return Uint8Array;\n\t\tcase 'STRING': return Uint8Array;\n\n\t}\n\n\tthrow new Error( 'ClassProperty: invalid type.' );\n\n}\n\n// resolve a full default value for the given property including arrays\nexport function resolveDefault( property, target = null ) {\n\n\tconst array = property.array;\n\tif ( array ) {\n\n\t\ttarget = target && Array.isArray( target ) ? target : [];\n\t\ttarget.length = property.count;\n\t\tfor ( let i = 0, l = target.length; i < l; i ++ ) {\n\n\t\t\ttarget[ i ] = resolveDefaultElement( property, target[ i ] );\n\n\t\t}\n\n\t} else {\n\n\t\ttarget = resolveDefaultElement( property, target );\n\n\t}\n\n\treturn target;\n\n}\n\n// gets the default value of the given type\nexport function resolveDefaultElement( property, target = null ) {\n\n\tconst defaultValue = property.default;\n\tconst type = property.type;\n\n\ttarget = target || getTypeInstance( property );\n\n\tif ( defaultValue === null ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 'SCALAR': return 0;\n\t\t\tcase 'VEC2': return target.set( 0, 0 );\n\t\t\tcase 'VEC3': return target.set( 0, 0, 0 );\n\t\t\tcase 'VEC4': return target.set( 0, 0, 0, 0 );\n\t\t\tcase 'MAT2': return target.identity();\n\t\t\tcase 'MAT3': return target.identity();\n\t\t\tcase 'MAT4': return target.identity();\n\t\t\tcase 'BOOLEAN': return false;\n\t\t\tcase 'STRING': return '';\n\t\t\tcase 'ENUM': return '';\n\n\t\t}\n\n\t\tthrow new Error( 'ClassProperty: invalid type.' );\n\n\t} else {\n\n\t\tif ( isMatrixType( type ) ) {\n\n\t\t\ttarget.fromArray( defaultValue );\n\n\t\t} else if ( isVectorType( type ) ) {\n\n\t\t\ttarget.fromArray( defaultValue );\n\n\t\t} else {\n\n\t\t\treturn defaultValue;\n\n\t\t}\n\n\t}\n\n}\n\n// check for of instances of \"no data\" in the given target value and adjust them to the\n// default value.\nexport function resolveNoData( property, target ) {\n\n\tif ( property.noData === null ) {\n\n\t\treturn target;\n\n\t}\n\n\tconst noData = property.noData;\n\tconst type = property.type;\n\tif ( Array.isArray( target ) ) {\n\n\t\tfor ( let i = 0, l = target.length; i < l; i ++ ) {\n\n\t\t\ttarget[ i ] = performResolution( target[ i ] );\n\n\t\t}\n\n\t} else {\n\n\t\ttarget = performResolution( target );\n\n\t}\n\n\treturn target;\n\n\t// replace the value with a default if no data is encountered\n\tfunction performResolution( target ) {\n\n\t\tif ( isNoDataEqual( target ) ) {\n\n\t\t\ttarget = resolveDefaultElement( property, target );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t// checks if the given value is equal to the no data value\n\tfunction isNoDataEqual( value ) {\n\n\t\tif ( isMatrixType( type ) ) {\n\n\t\t\tconst elements = value.elements;\n\t\t\tfor ( let i = 0, l = noData.length; i < l; i ++ ) {\n\n\t\t\t\tif ( noData[ i ] !== elements[ i ] ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t} else if ( isVectorType( type ) ) {\n\n\t\t\tfor ( let i = 0, l = noData.length; i < l; i ++ ) {\n\n\t\t\t\tif ( noData[ i ] !== value.getComponent( i ) ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t} else {\n\n\t\t\treturn noData === value;\n\n\t\t}\n\n\t}\n\n}\n\nexport function normalizeValue( componentType, v ) {\n\n\t// formulas defined here but normalizing 64 bit ints will result in precision loss:\n\t// https://github.com/CesiumGS/3d-tiles/tree/main/specification/Metadata/#normalized-values\n\tswitch ( componentType ) {\n\n\t\tcase 'INT8': return Math.max( v / 127.0, - 1.0 );\n\t\tcase 'INT16': return Math.max( v, 32767.0, - 1.0 );\n\t\tcase 'INT32': return Math.max( v / 2147483647.0, - 1.0 );\n\t\tcase 'INT64': return Math.max( Number( v ) / 9223372036854775807.0, - 1.0 ); // eslint-disable-line no-loss-of-precision\n\n\t\tcase 'UINT8': return v / 255.0;\n\t\tcase 'UINT16': return v / 65535.0;\n\t\tcase 'UINT32': return v / 4294967295.0;\n\t\tcase 'UINT64': return Number( v ) / 18446744073709551615.0; // eslint-disable-line no-loss-of-precision\n\n\t}\n\n}\n\n// scales the value based on property settings\n// the provided target value is normalized, scaled, and then offset if numeric\nexport function adjustValueScaleOffset( property, target ) {\n\n\tconst {\n\t\ttype,\n\t\tcomponentType,\n\t\tscale,\n\t\toffset,\n\t\tnormalized,\n\t} = property;\n\n\tif ( Array.isArray( target ) ) {\n\n\t\tfor ( let i = 0, l = target.length; i < l; i ++ ) {\n\n\t\t\ttarget[ i ] = adjustFromType( target[ i ] );\n\n\t\t}\n\n\t} else {\n\n\t\ttarget = adjustFromType( target );\n\n\t}\n\n\treturn target;\n\n\tfunction adjustFromType( value ) {\n\n\t\tif ( isMatrixType( type ) ) {\n\n\t\t\tvalue = adjustMatrix( value );\n\n\t\t} else if ( isVectorType( type ) ) {\n\n\t\t\tvalue = adjustVector( value );\n\n\t\t} else {\n\n\t\t\tvalue = adjustScalar( value );\n\n\t\t}\n\n\t\treturn value;\n\n\t}\n\n\tfunction adjustVector( value ) {\n\n\t\tvalue.x = adjustScalar( value.x );\n\t\tvalue.y = adjustScalar( value.y );\n\t\tif ( 'z' in value ) value.z = adjustScalar( value.z );\n\t\tif ( 'w' in value ) value.w = adjustScalar( value.w );\n\t\treturn value;\n\n\t}\n\n\tfunction adjustMatrix( value ) {\n\n\t\tconst elements = value.elements;\n\t\tfor ( let i = 0, l = elements.length; i < l; i ++ ) {\n\n\t\t\telements[ i ] = adjustScalar( elements[ i ] );\n\n\t\t}\n\n\t\treturn value;\n\n\t}\n\n\tfunction adjustScalar( value ) {\n\n\t\tif ( normalized ) {\n\n\t\t\tvalue = normalizeValue( componentType, value );\n\n\t\t}\n\n\t\tif ( normalized || isFloatComponentType( componentType ) ) {\n\n\t\t\tvalue = value * scale + offset;\n\n\t\t}\n\n\t\treturn value;\n\n\t}\n\n}\n\n// Shape the given target object based on the provided property. If overrideCount is\n// provided then it will be used to specify the array length.\nexport function initializeFromProperty( property, target, overrideCount = null ) {\n\n\tif ( property.array ) {\n\n\t\tif ( ! Array.isArray( target ) ) {\n\n\t\t\ttarget = new Array( property.count || 0 );\n\n\t\t}\n\n\t\ttarget.length = overrideCount !== null ? overrideCount : property.count;\n\n\t\tfor ( let i = 0, l = target.length; i < l; i ++ ) {\n\n\t\t\tif ( ! isTypeInstance( property.type, target[ i ] ) ) {\n\n\t\t\t\ttarget[ i ] = getTypeInstance( property );\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\tif ( ! isTypeInstance( property.type, target ) ) {\n\n\t\t\ttarget = getTypeInstance( property );\n\n\t\t}\n\n\t}\n\n\treturn target;\n\n}\n\n// Shape the \"target\" object based on the provided set of properties\nexport function initializeFromClass( properties, target ) {\n\n\t// remove unused fields\n\tfor ( const key in target ) {\n\n\t\tif ( ! ( key in properties ) ) {\n\n\t\t\tdelete target[ key ];\n\n\t\t}\n\n\t}\n\n\t// add and adjust any fields required by the set of properties\n\tfor ( const key in properties ) {\n\n\t\tconst prop = properties[ key ];\n\t\ttarget[ key ] = initializeFromProperty( prop, target[ key ] );\n\n\t}\n\n}\n\n// Returns the number of components required for the given type\nexport function typeToComponentCount( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 'ENUM': return 1;\n\t\tcase 'SCALAR': return 1;\n\t\tcase 'VEC2': return 2;\n\t\tcase 'VEC3': return 3;\n\t\tcase 'VEC4': return 4;\n\t\tcase 'MAT2': return 4;\n\t\tcase 'MAT3': return 9;\n\t\tcase 'MAT4': return 16;\n\n\t\t// unused\n\t\tcase 'BOOLEAN': return - 1;\n\t\tcase 'STRING': return - 1;\n\t\tdefault: return - 1;\n\n\t}\n\n}\n","import {\n\tinitializeFromProperty,\n\tadjustValueScaleOffset,\n\tgetField,\n\tisNumericType,\n\tresolveDefaultElement,\n\tresolveNoData,\n\tresolveDefault,\n} from '../utilities/ClassPropertyHelpers.js';\n\nexport class ClassProperty {\n\n\tconstructor( enums, property, accessorProperty = null ) {\n\n\t\t// initialize defaults for class property info\n\t\tthis.name = property.name || null;\n\t\tthis.description = property.description || null;\n\t\tthis.type = property.type;\n\t\tthis.componentType = property.componentType || null;\n\t\tthis.enumType = property.enumType || null;\n\t\tthis.array = property.array || false;\n\t\tthis.count = property.count || 0;\n\t\tthis.normalized = property.normalized || false;\n\t\tthis.offset = property.offset || 0;\n\t\tthis.scale = getField( property, 'scale', 1 );\n\t\tthis.max = getField( property, 'max', Infinity );\n\t\tthis.min = getField( property, 'min', - Infinity );\n\t\tthis.required = property.required || false;\n\t\tthis.noData = getField( property, 'noData', null );\n\t\tthis.default = getField( property, 'default', null );\n\t\tthis.semantic = getField( property, 'semantic', null );\n\t\tthis.enumSet = null;\n\t\tthis.accessorProperty = accessorProperty;\n\n\t\t// accessor properties can override min, max, offset, and scale values\n\t\tif ( accessorProperty ) {\n\n\t\t\tthis.offset = getField( accessorProperty, 'offset', this.offset );\n\t\t\tthis.scale = getField( accessorProperty, 'scale', this.scale );\n\t\t\tthis.max = getField( accessorProperty, 'max', this.max );\n\t\t\tthis.min = getField( accessorProperty, 'min', this.min );\n\n\t\t}\n\n\t\t// get the component type for the provided enum\n\t\tif ( property.type === 'ENUM' ) {\n\n\t\t\tthis.enumSet = enums[ this.enumType ];\n\t\t\tif ( this.componentType === null ) {\n\n\t\t\t\tthis.componentType = getField( this.enumSet, 'valueType', 'UINT16' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// shape the given target to match the data type of the property\n\t// enums are set to their integer value\n\tshapeToProperty( target, countOverride = null ) {\n\n\t\treturn initializeFromProperty( this, target, countOverride );\n\n\t}\n\n\t// resolve the given object to the default value for the property for a single element\n\t// enums are set to a default string\n\tresolveDefaultElement( target ) {\n\n\t\treturn resolveDefaultElement( this, target );\n\n\t}\n\n\t// resolve the target to the default value for the property for every element if it's an array\n\t// enums are set to a default string\n\tresolveDefault( target ) {\n\n\t\treturn resolveDefault( this, target );\n\n\t}\n\n\t// converts any instances of no data to the default value\n\tresolveNoData( target ) {\n\n\t\treturn resolveNoData( this, target );\n\n\t}\n\n\t// converts enums integers in the given target to strings\n\tresolveEnumsToStrings( target ) {\n\n\t\tconst enumSet = this.enumSet;\n\t\tif ( this.type === 'ENUM' ) {\n\n\t\t\tif ( Array.isArray( target ) ) {\n\n\t\t\t\tfor ( let i = 0, l = target.length; i < l; i ++ ) {\n\n\t\t\t\t\ttarget[ i ] = getEnumName( target[ i ] );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\ttarget = getEnumName( target );\n\n\t\t\t}\n\n\n\t\t}\n\n\t\treturn target;\n\n\t\tfunction getEnumName( index ) {\n\n\t\t\tconst match = enumSet.values.find( e => e.value === index );\n\t\t\tif ( match === null ) {\n\n\t\t\t\t// the default \"default enum\" value is an empty string when we can't find a match\n\t\t\t\t// in a case where enums are defined correctly we should never get here.\n\t\t\t\treturn '';\n\n\t\t\t} else {\n\n\t\t\t\treturn match.name;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// apply scales\n\tadjustValueScaleOffset( target ) {\n\n\t\tif ( isNumericType( this.type ) ) {\n\n\t\t\treturn adjustValueScaleOffset( this, target );\n\n\t\t} else {\n\n\t\t\treturn target;\n\n\t\t}\n\n\t}\n\n}\n","import { ClassProperty } from './ClassProperty.js';\n\nexport class PropertySetAccessor {\n\n\tconstructor( definition, classes = {}, enums = {}, data = null ) {\n\n\t\tthis.definition = definition;\n\t\tthis.class = classes[ definition.class ];\n\t\tthis.className = definition.class;\n\t\tthis.enums = enums;\n\t\tthis.data = data;\n\t\tthis.name = 'name' in definition ? definition.name : null;\n\n\t\tthis.properties = null;\n\n\t}\n\n\tgetPropertyNames() {\n\n\t\treturn Object.keys( this.class.properties );\n\n\t}\n\n\tincludesData( name ) {\n\n\t\treturn Boolean( this.definition.properties[ name ] );\n\n\t}\n\n\tdispose() {}\n\n\t_initProperties( propertyClass = ClassProperty ) {\n\n\t\tconst properties = {};\n\t\tfor ( const key in this.class.properties ) {\n\n\t\t\tproperties[ key ] = new propertyClass( this.enums, this.class.properties[ key ], this.definition.properties[ key ] );\n\n\t\t}\n\n\t\tthis.properties = properties;\n\n\t}\n\n}\n","import { initializeFromClass, isMatrixType, isVectorType } from '../utilities/ClassPropertyHelpers.js';\nimport { ClassProperty } from './ClassProperty.js';\nimport { PropertySetAccessor } from './PropertySetAccessor.js';\n\nclass PropertyAttributeClassProperty extends ClassProperty {\n\n\tconstructor( enums, classProperty, attributeProperty = null ) {\n\n\t\tsuper( enums, classProperty, attributeProperty );\n\n\t\tthis.attribute = attributeProperty?.attribute ?? null;\n\n\t}\n\n}\n\nexport class PropertyAttributeAccessor extends PropertySetAccessor {\n\n\tconstructor( ...args ) {\n\n\t\tsuper( ...args );\n\n\t\tthis.isPropertyAttributeAccessor = true;\n\t\tthis._initProperties( PropertyAttributeClassProperty );\n\n\t}\n\n\tgetData( id, geometry, target = {} ) {\n\n\t\tconst properties = this.properties;\n\t\tinitializeFromClass( properties, target );\n\n\t\tfor ( const name in properties ) {\n\n\t\t\ttarget[ name ] = this.getPropertyValue( name, id, geometry, target[ name ] );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\tgetPropertyValue( name, id, geometry, target = null ) {\n\n\t\t// NOTE: arrays are not supported via attribute accessors\n\t\tif ( id >= this.count ) {\n\n\t\t\tthrow new Error( 'PropertyAttributeAccessor: Requested index is outside the range of the buffer.' );\n\n\t\t}\n\n\t\t// use a default of the texture accessor definition does not include the value\n\t\tconst property = this.properties[ name ];\n\t\tconst type = property.type;\n\t\tif ( ! property ) {\n\n\t\t\tthrow new Error( 'PropertyAttributeAccessor: Requested class property does not exist.' );\n\n\t\t} else if ( ! this.definition.properties[ name ] ) {\n\n\t\t\treturn property.resolveDefault( target );\n\n\t\t}\n\n\t\t// initialize the array\n\t\ttarget = property.shapeToProperty( target );\n\n\t\t// Read the data values from the attribute\n\t\tconst attribute = geometry.getAttribute( property.attribute.toLowerCase() );\n\t\tif ( isMatrixType( type ) ) {\n\n\t\t\tconst elements = target.elements;\n\t\t\tfor ( let i = 0, l = elements.length; i < l; i < l ) {\n\n\t\t\t\telements[ i ] = attribute.getComponent( id, i );\n\n\t\t\t}\n\n\t\t} else if ( isVectorType( type ) ) {\n\n\t\t\ttarget.fromBufferAttribute( attribute, id );\n\n\t\t} else if ( type === 'SCALAR' || type === 'ENUM' ) {\n\n\t\t\ttarget = attribute.getX( id );\n\n\t\t} else {\n\n\t\t\t// BOOLEAN, STRING not supported\n\t\t\tthrow new Error( 'StructuredMetadata.PropertyAttributeAccessor: BOOLEAN and STRING types are not supported by property attributes.' );\n\n\t\t}\n\n\t\t// scale the numeric values\n\t\ttarget = property.adjustValueScaleOffset( target );\n\n\t\t// convert to enum strings - no data enum values are stored as strings\n\t\ttarget = property.resolveEnumsToStrings( target );\n\n\t\t// resolve to default values\n\t\ttarget = property.resolveNoData( target );\n\n\t\treturn target;\n\n\t}\n\n}\n","import { ClassProperty } from './ClassProperty.js';\nimport { PropertySetAccessor } from './PropertySetAccessor.js';\nimport {\n\tinitializeFromClass,\n\tgetArrayConstructorFromComponentType,\n\treadDataFromBufferToType,\n\tgetField,\n\tisNumericType,\n\ttypeToComponentCount,\n} from '../utilities/ClassPropertyHelpers.js';\n\nclass PropertyTableClassProperty extends ClassProperty {\n\n\tconstructor( enums, classProperty, tableProperty = null ) {\n\n\t\tsuper( enums, classProperty, tableProperty );\n\n\t\tthis.values = tableProperty?.values ?? null;\n\t\tthis.valueLength = typeToComponentCount( this.type );\n\t\tthis.arrayOffsets = getField( tableProperty, 'arrayOffsets', null );\n\t\tthis.stringOffsets = getField( tableProperty, 'stringOffsets', null );\n\t\tthis.arrayOffsetType = getField( tableProperty, 'arrayOffsetType', 'UINT32' );\n\t\tthis.stringOffsetType = getField( tableProperty, 'stringOffsetType', 'UINT32' );\n\n\t}\n\n\t// returns the necessary array length based on the array offsets if present\n\tgetArrayLengthFromId( buffers, id ) {\n\n\t\tlet count = this.count;\n\t\tif ( this.arrayOffsets !== null ) {\n\n\t\t\tconst { arrayOffsets, arrayOffsetType } = this;\n\t\t\tconst bufferCons = getArrayConstructorFromComponentType( arrayOffsetType );\n\t\t\tconst arr = new bufferCons( buffers[ arrayOffsets ] );\n\t\t\tcount = arr[ id + 1 ] - arr[ id ];\n\n\t\t}\n\n\t\treturn count;\n\n\t}\n\n\t// returns the index offset into the data buffer for the given id based on the\n\t// the array offsets if present\n\tgetIndexOffsetFromId( buffers, id ) {\n\n\t\tlet indexOffset = id;\n\t\tif ( this.arrayOffsets ) {\n\n\t\t\tconst { arrayOffsets, arrayOffsetType } = this;\n\t\t\tconst bufferCons = getArrayConstructorFromComponentType( arrayOffsetType );\n\t\t\tconst arr = new bufferCons( buffers[ arrayOffsets ] );\n\t\t\tindexOffset = arr[ indexOffset ];\n\n\t\t} else if ( this.array ) {\n\n\t\t\t// TODO: why do this? Revisit\n\t\t\tindexOffset *= this.count;\n\n\t\t}\n\n\t\treturn indexOffset;\n\n\t}\n\n}\n\nexport class PropertyTableAccessor extends PropertySetAccessor {\n\n\tconstructor( ...args ) {\n\n\t\tsuper( ...args );\n\n\t\tthis.isPropertyTableAccessor = true;\n\t\tthis.count = this.definition.count;\n\n\t\tthis._initProperties( PropertyTableClassProperty );\n\n\t}\n\n\tgetData( id, target = {} ) {\n\n\t\tconst properties = this.properties;\n\t\tinitializeFromClass( properties, target );\n\n\t\tfor ( const name in properties ) {\n\n\t\t\ttarget[ name ] = this.getPropertyValue( name, id, target[ name ] );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t// reads an individual element\n\t_readValueAtIndex( name, id, index, target = null ) {\n\n\t\tconst property = this.properties[ name ];\n\t\tconst { componentType, type } = property;\n\n\t\tconst buffers = this.data;\n\t\tconst bufferView = buffers[ property.values ];\n\t\tconst bufferCons = getArrayConstructorFromComponentType( componentType, type );\n\t\tconst dataArray = new bufferCons( bufferView );\n\n\t\t// array offsets contain element offsets, not byte offsets\n\t\tconst indexOffset = property.getIndexOffsetFromId( buffers, id );\n\n\t\tif ( isNumericType( type ) || type === 'ENUM' ) {\n\n\t\t\t// \"readDataFromBufferToType\" takes the start offset to read from so we multiply the\n\t\t\t// index by the final value length\n\t\t\treturn readDataFromBufferToType( dataArray, ( indexOffset + index ) * property.valueLength, type, target );\n\n\t\t} else if ( type === 'STRING' ) {\n\n\t\t\t// https://github.com/CesiumGS/3d-tiles/tree/main/specification/Metadata/#variable-length-arrays\n\n\t\t\tlet stringIndex = indexOffset + index;\n\t\t\tlet stringLength = 0;\n\t\t\tif ( property.stringOffsets !== null ) {\n\n\t\t\t\t// get the string lengths and beginning offsets if variable\n\t\t\t\tconst { stringOffsets, stringOffsetType } = property;\n\t\t\t\tconst bufferCons = getArrayConstructorFromComponentType( stringOffsetType );\n\t\t\t\tconst stringOffsetBuffer = new bufferCons( buffers[ stringOffsets ] );\n\t\t\t\tstringLength = stringOffsetBuffer[ stringIndex + 1 ] - stringOffsetBuffer[ stringIndex ];\n\t\t\t\tstringIndex = stringOffsetBuffer[ stringIndex ];\n\n\t\t\t}\n\n\t\t\tconst byteArray = new Uint8Array( dataArray.buffer, stringIndex, stringLength );\n\t\t\ttarget = new TextDecoder().decode( byteArray );\n\n\t\t} else if ( type === 'BOOLEAN' ) {\n\n\t\t\tconst offset = indexOffset + index;\n\t\t\tconst byteIndex = Math.floor( offset / 8 );\n\t\t\tconst bitIndex = offset % 8;\n\t\t\tconst bitValue = ( dataArray[ byteIndex ] >> bitIndex ) & 1;\n\t\t\ttarget = bitValue === 1;\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t// Reads the data for the given table index\n\tgetPropertyValue( name, id, target = null ) {\n\n\t\t// check if the requested id is outside of the size of the table\n\t\tif ( id >= this.count ) {\n\n\t\t\tthrow new Error( 'PropertyTableAccessor: Requested index is outside the range of the table.' );\n\n\t\t}\n\n\t\t// check to see if we skip this field since its not in the table\n\t\tconst property = this.properties[ name ];\n\t\tif ( ! property ) {\n\n\t\t\tthrow new Error( 'PropertyTableAccessor: Requested property does not exist.' );\n\n\t\t} else if ( ! this.definition.properties[ name ] ) {\n\n\t\t\treturn property.resolveDefault( target );\n\n\t\t}\n\n\t\t// get the dynamic array count from the property buffer\n\t\tconst array = property.array;\n\t\tconst buffers = this.data;\n\t\tconst count = property.getArrayLengthFromId( buffers, id );\n\n\t\t// initialize the array\n\t\ttarget = property.shapeToProperty( target, count );\n\n\t\t// read all data\n\t\tif ( array ) {\n\n\t\t\tfor ( let i = 0, l = target.length; i < l; i ++ ) {\n\n\t\t\t\ttarget[ i ] = this._readValueAtIndex( name, id, i, target[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\ttarget = this._readValueAtIndex( name, id, 0, target );\n\n\t\t}\n\n\t\t// scale the numeric values\n\t\ttarget = property.adjustValueScaleOffset( target );\n\n\t\t// convert to enum strings - no data enum values are stored as strings\n\t\ttarget = property.resolveEnumsToStrings( target );\n\n\t\t// resolve to default values\n\t\ttarget = property.resolveNoData( target );\n\n\t\treturn target;\n\n\t}\n\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 { WebGLRenderTarget, WebGLRenderer, Box2, Vector2, ShaderMaterial, CustomBlending, ZeroFactor, OneFactor } from 'three';\nimport { FullScreenQuad } from 'three/examples/jsm/postprocessing/Pass.js';\n\nconst _box = /* @__PURE__ */ new Box2();\n\n// Utility for reading sets of individual pixel values from textures\nclass _TextureReadUtility {\n\n\tconstructor() {\n\n\t\tthis._renderer = new WebGLRenderer();\n\t\tthis._target = new WebGLRenderTarget( 1, 1 );\n\t\tthis._texTarget = new WebGLRenderTarget();\n\n\t\t// quad to render just a single pixel from the provided texture\n\t\tthis._quad = new FullScreenQuad( new ShaderMaterial( {\n\n\t\t\tblending: CustomBlending,\n\t\t\tblendDst: ZeroFactor,\n\t\t\tblendSrc: OneFactor,\n\n\t\t\tuniforms: {\n\n\t\t\t\tmap: { value: null },\n\t\t\t\tpixel: { value: new Vector2() }\n\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\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\t\t\tfragmentShader: /* glsl */`\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\t\t} ) );\n\n\t}\n\n\t// increases the width of the target render target to support more data\n\tincreaseSizeTo( width ) {\n\n\t\tthis._target.setSize( Math.max( this._target.width, width ), 1 );\n\n\t}\n\n\t// read data from the rendered texture asynchronously\n\treadDataAsync( buffer ) {\n\n\t\tconst { _renderer, _target } = this;\n\t\treturn _renderer.readRenderTargetPixelsAsync( _target, 0, 0, buffer.length / 4, 1, buffer );\n\n\t}\n\n\t// read data from the rendered texture\n\treadData( buffer ) {\n\n\t\tconst { _renderer, _target } = this;\n\t\t_renderer.readRenderTargetPixels( _target, 0, 0, buffer.length / 4, 1, buffer );\n\n\t}\n\n\t// render a single pixel from the source at the destination point on the render target\n\t// takes the texture, pixel to read from, and pixel to render in to\n\trenderPixelToTarget( texture, pixel, dstPixel ) {\n\n\t\tconst { _renderer, _target } = this;\n\n\t\t// copies the pixel directly to the target buffer\n\t\t_box.min.copy( pixel );\n\t\t_box.max.copy( pixel );\n\t\t_box.max.x += 1;\n\t\t_box.max.y += 1;\n\t\t_renderer.initRenderTarget( _target );\n\t\t_renderer.copyTextureToTexture( texture, _target.texture, _box, dstPixel, 0 );\n\n\t}\n\n}\n\n// Create a wrapper class to defer instantiation of the WebGLRenderer until it's needed\n// See NASA-AMMOS/3DTilesRendererJS#905\nexport const TextureReadUtility = /* @__PURE__ */ new ( class {\n\n\tconstructor() {\n\n\t\tlet reader = null;\n\t\tObject\n\t\t\t.getOwnPropertyNames( _TextureReadUtility.prototype )\n\t\t\t.forEach( key => {\n\n\t\t\t\tif ( key !== 'constructor' ) {\n\n\t\t\t\t\tthis[ key ] = ( ...args ) => {\n\n\t\t\t\t\t\treader = reader || new _TextureReadUtility();\n\t\t\t\t\t\treturn reader[ key ]( ...args );\n\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t}\n\n} )();\n","import { Vector2 } from 'three';\n\nconst _uv0 = /* @__PURE__ */ new Vector2();\nconst _uv1 = /* @__PURE__ */ new Vector2();\nconst _uv2 = /* @__PURE__ */ new Vector2();\n\n// returns the uv attribute of the given index\nexport function getTextureCoordAttribute( geometry, index ) {\n\n\tif ( index === 0 ) {\n\n\t\treturn geometry.getAttribute( 'uv' );\n\n\t} else {\n\n\t\treturn geometry.getAttribute( `uv${ index }` );\n\n\t}\n\n}\n\n// returns the vertex indices associated with the triangle index\nexport function getTriangleVertexIndices( geometry, faceIndex, target = new Array( 3 ) ) {\n\n\t// get the attribute indices\n\tlet i0 = 3 * faceIndex;\n\tlet i1 = 3 * faceIndex + 1;\n\tlet i2 = 3 * faceIndex + 2;\n\tif ( geometry.index ) {\n\n\t\ti0 = geometry.index.getX( i0 );\n\t\ti1 = geometry.index.getX( i1 );\n\t\ti2 = geometry.index.getX( i2 );\n\n\t}\n\n\ttarget[ 0 ] = i0;\n\ttarget[ 1 ] = i1;\n\ttarget[ 2 ] = i2;\n\treturn target;\n\n}\n\n// takes a tex coord index, barycoord, vertex indices, and target to set\n// sets target to the interpolated uv value\nexport function getTexCoord( geometry, texCoord, barycoord, indices, target ) {\n\n\tconst [ i0, i1, i2 ] = indices;\n\tconst attr = getTextureCoordAttribute( geometry, texCoord );\n\t_uv0.fromBufferAttribute( attr, i0 );\n\t_uv1.fromBufferAttribute( attr, i1 );\n\t_uv2.fromBufferAttribute( attr, i2 );\n\n\ttarget\n\t\t.set( 0, 0, 0 )\n\t\t.addScaledVector( _uv0, barycoord.x )\n\t\t.addScaledVector( _uv1, barycoord.y )\n\t\t.addScaledVector( _uv2, barycoord.z );\n\n}\n\n// gets the x, y index of the pixel at the given uv coordinate\nexport function getTexelIndices( uv, width, height, target ) {\n\n\tconst fx = uv.x - Math.floor( uv.x );\n\tconst fy = uv.y - Math.floor( uv.y );\n\tconst px = Math.floor( ( fx * width ) % width );\n\tconst py = Math.floor( ( fy * height ) % height );\n\ttarget.set( px, py );\n\treturn target;\n\n}\n","import { Vector2 } from 'three';\nimport { PropertySetAccessor } from './PropertySetAccessor.js';\nimport { ClassProperty } from './ClassProperty.js';\nimport { TextureReadUtility } from '../utilities/TextureReadUtility.js';\nimport { getTexCoord, getTexelIndices, getTriangleVertexIndices } from '../utilities/TexCoordUtilities.js';\nimport {\n\tinitializeFromClass,\n\tinitializeFromProperty,\n\tgetArrayConstructorFromComponentType,\n\treadDataFromBufferToType,\n\tgetField\n} from '../utilities/ClassPropertyHelpers.js';\n\nconst _uv = /* @__PURE__ */ new Vector2();\nconst _srcPixel = /* @__PURE__ */ new Vector2();\nconst _dstPixel = /* @__PURE__ */ new Vector2();\n\nclass PropertyTextureClassProperty extends ClassProperty {\n\n\tconstructor( enums, classProperty, textureProperty = null ) {\n\n\t\tsuper( enums, classProperty, textureProperty );\n\n\t\tthis.channels = getField( textureProperty, 'channels', [ 0 ] );\n\t\tthis.index = getField( textureProperty, 'index', null );\n\t\tthis.texCoord = getField( textureProperty, 'texCoord', null );\n\t\tthis.valueLength = parseInt( this.type.replace( /[^0-9]/g, '' ) ) || 1;\n\n\t}\n\n\t// takes the buffer to read from and the value index to read\n\treadDataFromBuffer( buffer, index, target = null ) {\n\n\t\tconst type = this.type;\n\t\tif ( type === 'BOOLEAN' || type === 'STRING' ) {\n\n\t\t\tthrow new Error( 'PropertyTextureAccessor: BOOLEAN and STRING types not supported.' );\n\n\t\t}\n\n\t\t// \"readDataFromBufferToType\" takes the start offset to read from so we multiply the index by the\n\t\t// final value length\n\t\treturn readDataFromBufferToType( buffer, index * this.valueLength, type, target );\n\n\t}\n\n}\n\n// Reads and accesses data encoded to textures\nexport class PropertyTextureAccessor extends PropertySetAccessor {\n\n\tconstructor( ...args ) {\n\n\t\tsuper( ...args );\n\n\t\tthis.isPropertyTextureAccessor = true;\n\t\tthis._asyncRead = false;\n\n\t\tthis._initProperties( PropertyTextureClassProperty );\n\n\t}\n\n\t// Reads the full set of property data\n\tgetData( faceIndex, barycoord, geometry, target = {} ) {\n\n\t\tconst properties = this.properties;\n\t\tinitializeFromClass( properties, target );\n\n\t\tconst names = Object.keys( properties );\n\t\tconst results = names.map( n => target[ n ] );\n\t\tthis.getPropertyValuesAtTexel( names, faceIndex, barycoord, geometry, results );\n\n\t\tnames.forEach( ( n, i ) => target[ n ] = results[ i ] );\n\t\treturn target;\n\n\t}\n\n\t// Reads the full set of property data asynchronously\n\tasync getDataAsync( faceIndex, barycoord, geometry, target = {} ) {\n\n\t\tconst properties = this.properties;\n\t\tinitializeFromClass( properties, target );\n\n\t\tconst names = Object.keys( properties );\n\t\tconst results = names.map( n => target[ n ] );\n\t\tawait this.getPropertyValuesAtTexelAsync( names, faceIndex, barycoord, geometry, results );\n\n\t\tnames.forEach( ( n, i ) => target[ n ] = results[ i ] );\n\t\treturn target;\n\n\t}\n\n\t// Reads values asynchronously\n\tgetPropertyValuesAtTexelAsync( ...args ) {\n\n\t\tthis._asyncRead = true;\n\t\tconst result = this.getPropertyValuesAtTexel( ...args );\n\t\tthis._asyncRead = false;\n\t\treturn result;\n\n\t}\n\n\t// Reads values from the textures synchronously\n\tgetPropertyValuesAtTexel( names, faceIndex, barycoord, geometry, target = [] ) {\n\n\t\t// resize our targets appropriately\n\t\twhile ( target.length < names.length ) target.push( null );\n\t\ttarget.length = names.length;\n\t\tTextureReadUtility.increaseSizeTo( target.length );\n\n\t\t// get the attribute indices\n\t\tconst textures = this.data;\n\t\tconst accessorProperties = this.definition.properties;\n\t\tconst properties = this.properties;\n\t\tconst indices = getTriangleVertexIndices( geometry, faceIndex );\n\t\tfor ( let i = 0, l = names.length; i < l; i ++ ) {\n\n\t\t\t// skip any requested class schema properties that are not provided via the accessor\n\t\t\tconst name = names[ i ];\n\t\t\tif ( ! accessorProperties[ name ] ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// get the attribute of the target tex coord\n\t\t\tconst property = properties[ name ];\n\t\t\tconst texture = textures[ property.index ];\n\t\t\tgetTexCoord( geometry, property.texCoord, barycoord, indices, _uv );\n\t\t\tgetTexelIndices( _uv, texture.image.width, texture.image.height, _srcPixel );\n\t\t\t_dstPixel.set( i, 0 );\n\n\t\t\tTextureReadUtility.renderPixelToTarget( texture, _srcPixel, _dstPixel );\n\n\t\t}\n\n\t\t// read the data\n\t\tconst buffer = new Uint8Array( names.length * 4 );\n\t\tif ( this._asyncRead ) {\n\n\t\t\treturn TextureReadUtility\n\t\t\t\t.readDataAsync( buffer )\n\t\t\t\t.then( () => {\n\n\t\t\t\t\treadTextureSampleResults.call( this );\n\t\t\t\t\treturn target;\n\n\t\t\t\t} );\n\n\t\t} else {\n\n\t\t\tTextureReadUtility.readData( buffer );\n\t\t\treadTextureSampleResults.call( this );\n\n\t\t\treturn target;\n\n\t\t}\n\n\t\tfunction readTextureSampleResults() {\n\n\t\t\tfor ( let i = 0, l = names.length; i < l; i ++ ) {\n\n\t\t\t\tconst name = names[ i ];\n\t\t\t\tconst property = properties[ name ];\n\t\t\t\tconst type = property.type;\n\n\t\t\t\t// initialize the output value\n\t\t\t\ttarget[ i ] = initializeFromProperty( property, target[ i ] );\n\n\t\t\t\t// use a default of the texture accessor definition does not include the value\n\t\t\t\tif ( ! property ) {\n\n\t\t\t\t\tthrow new Error( 'PropertyTextureAccessor: Requested property does not exist.' );\n\n\t\t\t\t} else if ( ! accessorProperties[ name ] ) {\n\n\t\t\t\t\ttarget[ i ] = property.resolveDefault( target );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// get the final array length to read all data based on used buffer data\n\t\t\t\tconst length = property.valueLength * ( property.count || 1 );\n\n\t\t\t\t// set the data read back from the texture to the target type\n\t\t\t\tconst data = property.channels.map( c => buffer[ 4 * i + c ] );\n\t\t\t\tconst componentType = property.componentType;\n\t\t\t\tconst BufferCons = getArrayConstructorFromComponentType( componentType, type );\n\t\t\t\tconst readBuffer = new BufferCons( length );\n\t\t\t\tnew Uint8Array( readBuffer.buffer ).set( data );\n\n\t\t\t\t// read all the data\n\t\t\t\tif ( property.array ) {\n\n\t\t\t\t\tconst arr = target[ i ];\n\t\t\t\t\tfor ( let j = 0, lj = arr.length; j < lj; j ++ ) {\n\n\t\t\t\t\t\tarr[ j ] = property.readDataFromBuffer( readBuffer, j, arr[ j ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttarget[ i ] = property.readDataFromBuffer( readBuffer, 0, target[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\t// scale the numeric values\n\t\t\t\ttarget[ i ] = property.adjustValueScaleOffset( target[ i ] );\n\n\t\t\t\t// convert to enum strings - no data enum values are stored as strings\n\t\t\t\ttarget[ i ] = property.resolveEnumsToStrings( target[ i ] );\n\n\t\t\t\t// resolve to default values\n\t\t\t\ttarget[ i ] = property.resolveNoData( target[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// dispose all of the texture data used\n\tdispose() {\n\n\t\tthis.data.forEach( texture => {\n\n\t\t\tif ( texture ) {\n\n\t\t\t\ttexture.dispose();\n\n\t\t\t\tif ( texture.image instanceof ImageBitmap ) {\n\n\t\t\t\t\ttexture.image.close();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n}\n","import { PropertyAttributeAccessor } from './PropertyAttributeAccessor.js';\nimport { PropertyTableAccessor } from './PropertyTableAccessor.js';\nimport { PropertyTextureAccessor } from './PropertyTextureAccessor.js';\n\nexport class StructuralMetadata {\n\n\tconstructor( definition, textures, buffers, nodeMetadata = null, object = null ) {\n\n\t\tconst {\n\t\t\tschema,\n\t\t\tpropertyTables = [],\n\t\t\tpropertyTextures = [],\n\t\t\tpropertyAttributes = [],\n\t\t} = definition;\n\n\t\tconst { enums, classes } = schema;\n\t\tconst tableAccessors = propertyTables.map( t => new PropertyTableAccessor( t, classes, enums, buffers ) );\n\t\tlet textureAccessors = [];\n\t\tlet attributeAccessors = [];\n\n\t\tif ( nodeMetadata ) {\n\n\t\t\tif ( nodeMetadata.propertyTextures ) {\n\n\t\t\t\ttextureAccessors = nodeMetadata.propertyTextures.map( i => new PropertyTextureAccessor( propertyTextures[ i ], classes, enums, textures ) );\n\n\t\t\t}\n\n\t\t\tif ( nodeMetadata.propertyAttributes ) {\n\n\t\t\t\tattributeAccessors = nodeMetadata.propertyAttributes.map( i => new PropertyAttributeAccessor( propertyAttributes[ i ], classes, enums ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.schema = schema;\n\t\tthis.tableAccessors = tableAccessors;\n\t\tthis.textureAccessors = textureAccessors;\n\t\tthis.attributeAccessors = attributeAccessors;\n\t\tthis.object = object;\n\t\tthis.textures = textures;\n\t\tthis.nodeMetadata = nodeMetadata;\n\n\t}\n\n\t// Property Tables\n\tgetPropertyTableData( tableIndices, ids, target = null ) {\n\n\t\tif ( ! Array.isArray( tableIndices ) || ! Array.isArray( ids ) ) {\n\n\t\t\t// only return a single tables data\n\t\t\ttarget = target || {};\n\n\t\t\tconst table = this.tableAccessors[ tableIndices ];\n\t\t\ttarget = table.getData( ids, target );\n\n\t\t} else {\n\n\t\t\t// return data from an array of tables and ids\n\t\t\ttarget = target || [];\n\n\t\t\tconst length = Math.min( tableIndices.length, ids.length );\n\t\t\ttarget.length = length;\n\n\t\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\t\tconst table = this.tableAccessors[ tableIndices[ i ] ];\n\t\t\t\ttarget[ i ] = table.getData( ids[ i ], target[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\tgetPropertyTableInfo( tableIndices = null ) {\n\n\t\t// default to all table information\n\t\tif ( tableIndices === null ) {\n\n\t\t\ttableIndices = this.tableAccessors.map( ( t, i ) => i );\n\n\t\t}\n\n\t\tif ( Array.isArray( tableIndices ) ) {\n\n\t\t\t// return all table information from the requested list\n\t\t\treturn tableIndices.map( i => {\n\n\t\t\t\tconst table = this.tableAccessors[ i ];\n\t\t\t\treturn {\n\t\t\t\t\tname: table.name,\n\t\t\t\t\tclassName: table.definition.class,\n\t\t\t\t};\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\t// return the one piece of table information\n\t\t\tconst table = this.tableAccessors[ tableIndices ];\n\t\t\treturn {\n\t\t\t\tname: table.name,\n\t\t\t\tclassName: table.definition.class,\n\t\t\t};\n\n\t\t}\n\n\t}\n\n\t// Property Textures\n\tgetPropertyTextureData( triangle, barycoord, target = [] ) {\n\n\t\tconst textureAccessors = this.textureAccessors;\n\t\ttarget.length = textureAccessors.length;\n\n\t\tfor ( let i = 0; i < textureAccessors.length; i ++ ) {\n\n\t\t\tconst accessor = textureAccessors[ i ];\n\t\t\ttarget[ i ] = accessor.getData( triangle, barycoord, this.object.geometry, target[ i ] );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\tasync getPropertyTextureDataAsync( triangle, barycoord, target = [] ) {\n\n\t\tconst textureAccessors = this.textureAccessors;\n\t\ttarget.length = textureAccessors.length;\n\n\t\tconst promises = [];\n\t\tfor ( let i = 0; i < textureAccessors.length; i ++ ) {\n\n\t\t\tconst accessor = textureAccessors[ i ];\n\t\t\tconst promise = accessor\n\t\t\t\t.getDataAsync( triangle, barycoord, this.object.geometry, target[ i ] )\n\t\t\t\t.then( result => {\n\n\t\t\t\t\ttarget[ i ] = result;\n\n\t\t\t\t} );\n\n\t\t\tpromises.push( promise );\n\n\t\t}\n\n\t\tawait Promise.all( promises );\n\n\t\treturn target;\n\n\t}\n\n\tgetPropertyTextureInfo() {\n\n\t\treturn this.textureAccessors;\n\n\t}\n\n\t// Property Attributes\n\tgetPropertyAttributeData( attributeIndex, target = [] ) {\n\n\t\tconst attributeAccessors = this.attributeAccessors;\n\t\ttarget.length = attributeAccessors.length;\n\n\t\tfor ( let i = 0; i < attributeAccessors.length; i ++ ) {\n\n\t\t\tconst accessor = attributeAccessors[ i ];\n\t\t\ttarget[ i ] = accessor.getData( attributeIndex, this.object.geometry, target[ i ] );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\tgetPropertyAttributeInfo() {\n\n\t\treturn this.attributeAccessors.map( acc => {\n\n\t\t\treturn {\n\t\t\t\tname: acc.name,\n\t\t\t\tclassName: acc.definition.class,\n\t\t\t};\n\n\t\t} );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.textureAccessors.forEach( acc => acc.dispose() );\n\t\tthis.tableAccessors.forEach( acc => acc.dispose() );\n\t\tthis.attributeAccessors.forEach( acc => acc.dispose() );\n\n\t}\n\n}\n","import { Vector2 } from 'three';\nimport { TextureReadUtility } from '../utilities/TextureReadUtility.js';\nimport { getTexCoord, getTexelIndices, getTriangleVertexIndices } from '../utilities/TexCoordUtilities.js';\n\nconst _uv = /* @__PURE__ */ new Vector2();\nconst _pixel = /* @__PURE__ */ new Vector2();\nconst _dstPixel = /* @__PURE__ */ new Vector2();\n\n// retrieve the appropriate UV attribute based on the tex coord index\nfunction getMaxBarycoordIndex( barycoord ) {\n\n\tif ( barycoord.x > barycoord.y && barycoord.x > barycoord.z ) {\n\n\t\treturn 0;\n\n\t} else if ( barycoord.y > barycoord.z ) {\n\n\t\treturn 1;\n\n\t} else {\n\n\t\treturn 2;\n\n\t}\n\n}\n\nexport class MeshFeatures {\n\n\tconstructor( geometry, textures, data ) {\n\n\t\tthis.geometry = geometry;\n\t\tthis.textures = textures;\n\t\tthis.data = data;\n\t\tthis._asyncRead = false;\n\n\t\t// fill out feature id default values\n\t\tthis.featureIds = data.featureIds.map( info => {\n\n\t\t\tconst { texture, ...rest } = info;\n\t\t\tconst result = {\n\t\t\t\tlabel: null,\n\t\t\t\tpropertyTable: null,\n\t\t\t\tnullFeatureId: null,\n\t\t\t\t...rest,\n\t\t\t};\n\n\t\t\tif ( texture ) {\n\n\t\t\t\tresult.texture = {\n\t\t\t\t\ttexCoord: 0,\n\t\t\t\t\tchannels: [ 0 ],\n\t\t\t\t\t...texture,\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t} );\n\n\t}\n\n\t// returns list of textures\n\tgetTextures() {\n\n\t\treturn this.textures;\n\n\t}\n\n\t// returns a set of info for each feature\n\tgetFeatureInfo() {\n\n\t\treturn this.featureIds;\n\n\t}\n\n\t// performs texture data read back asynchronously\n\tgetFeaturesAsync( ...args ) {\n\n\t\tthis._asyncRead = true;\n\t\tconst result = this.getFeatures( ...args );\n\t\tthis._asyncRead = false;\n\t\treturn result;\n\n\t}\n\n\t// returns all features for the given point on the given triangle\n\tgetFeatures( triangle, barycoord ) {\n\n\t\tconst { geometry, textures, featureIds } = this;\n\t\tconst result = new Array( featureIds.length ).fill( null );\n\n\t\t// prep the canvas width\n\t\tconst width = featureIds.length;\n\t\tTextureReadUtility.increaseSizeTo( width );\n\n\t\t// get the attribute indices\n\t\tconst indices = getTriangleVertexIndices( geometry, triangle );\n\t\tconst closestIndex = indices[ getMaxBarycoordIndex( barycoord ) ];\n\t\tfor ( let i = 0, l = featureIds.length; i < l; i ++ ) {\n\n\t\t\t// the feature id from the closest point is returned\n\t\t\tconst featureId = featureIds[ i ];\n\t\t\tconst nullFeatureId = 'nullFeatureId' in featureId ? featureId.nullFeatureId : null;\n\t\t\tif ( 'texture' in featureId ) {\n\n\t\t\t\tconst texture = textures[ featureId.texture.index ];\n\n\t\t\t\t// get the attribute of the target tex coord and pixel\n\t\t\t\tgetTexCoord( geometry, featureId.texture.texCoord, barycoord, indices, _uv );\n\t\t\t\tgetTexelIndices( _uv, texture.image.width, texture.image.height, _pixel );\n\t\t\t\t_dstPixel.set( i, 0 );\n\n\t\t\t\t// draw the image\n\t\t\t\tTextureReadUtility.renderPixelToTarget( textures[ featureId.texture.index ], _pixel, _dstPixel );\n\n\t\t\t} else if ( 'attribute' in featureId ) {\n\n\t\t\t\tconst attr = geometry.getAttribute( `_feature_id_${ featureId.attribute }` );\n\t\t\t\tconst value = attr.getX( closestIndex );\n\t\t\t\tif ( value !== nullFeatureId ) {\n\n\t\t\t\t\tresult[ i ] = value;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// implicit id is based on vertex attributes, see 3d-tiles#763\n\t\t\t\tconst value = closestIndex;\n\t\t\t\tif ( value !== nullFeatureId ) {\n\n\t\t\t\t\tresult[ i ] = value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// read the buffer data\n\t\tconst buffer = new Uint8Array( width * 4 );\n\t\tif ( this._asyncRead ) {\n\n\t\t\treturn TextureReadUtility\n\t\t\t\t.readDataAsync( buffer )\n\t\t\t\t.then( () => {\n\n\t\t\t\t\treadTextureSampleResults();\n\t\t\t\t\treturn result;\n\n\t\t\t\t} );\n\n\t\t} else {\n\n\t\t\tTextureReadUtility.readData( buffer );\n\t\t\treadTextureSampleResults();\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\tfunction readTextureSampleResults() {\n\n\t\t\t// get data based on the texture information\n\t\t\tconst readBuffer = new Uint32Array( 1 );\n\t\t\tfor ( let i = 0, l = featureIds.length; i < l; i ++ ) {\n\n\t\t\t\tconst featureId = featureIds[ i ];\n\t\t\t\tconst nullFeatureId = 'nullFeatureId' in featureId ? featureId.nullFeatureId : null;\n\t\t\t\tif ( 'texture' in featureId ) {\n\n\t\t\t\t\t// TODO: do we need to handle big-endian here?\n\t\t\t\t\tconst { channels } = featureId.texture;\n\t\t\t\t\tconst data = channels.map( c => buffer[ 4 * i + c ] );\n\t\t\t\t\tnew Uint8Array( readBuffer.buffer ).set( data );\n\n\t\t\t\t\tconst value = readBuffer[ 0 ];\n\t\t\t\t\tif ( value !== nullFeatureId ) {\n\n\t\t\t\t\t\tresult[ i ] = value;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// dispose all of the texture data used\n\tdispose() {\n\n\t\tthis.textures.forEach( texture => {\n\n\t\t\tif ( texture ) {\n\n\t\t\t\ttexture.dispose();\n\n\t\t\t\tif ( texture.image instanceof ImageBitmap ) {\n\n\t\t\t\t\ttexture.image.close();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n}\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 } from \"3d-tiles-renderer/src/three/plugins/gltf/metadata/classes/StructuralMetadata.js\";\r\nimport { MeshFeatures } from \"3d-tiles-renderer/src/three/plugins/gltf/metadata/classes/MeshFeatures.js\";\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 } =\r\n 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(\r\n geometry,\r\n material,\r\n count,\r\n );\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(\r\n SCALE[i * 3],\r\n SCALE[i * 3 + 1],\r\n SCALE[i * 3 + 2],\r\n );\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 DoubleSide,\r\n Intersection,\r\n Material,\r\n Mesh,\r\n Object3D,\r\n WebGLRenderer,\r\n} 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 * 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 // --- 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\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 // 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 this.collectors.delete(collector);\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 */\r\n queryFeatureFromIntersection(hit: Intersection): FeatureInfo {\r\n return queryFeatureFromIntersection(hit);\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 */\r\n getMeshCollectorByOid(oid: number): MeshCollector {\r\n return new MeshCollector(oid, this);\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\r\n this.splitMeshCache.clear();\r\n\r\n this._loader = null;\r\n this.tiles = null;\r\n }\r\n}\r\n"],"names":["GLTFWorkerClass","target","bufferCons","_uv","_dstPixel"],"mappings":"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","x_google_ignoreList":[9,10,11,12,13,14,15,16,17,18,19]}
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/3d-tiles-renderer@0.4.21_three@0.183.2/node_modules/3d-tiles-renderer/src/three/plugins/gltf/metadata/utilities/ClassPropertyHelpers.js","../node_modules/.pnpm/3d-tiles-renderer@0.4.21_three@0.183.2/node_modules/3d-tiles-renderer/src/three/plugins/gltf/metadata/classes/ClassProperty.js","../node_modules/.pnpm/3d-tiles-renderer@0.4.21_three@0.183.2/node_modules/3d-tiles-renderer/src/three/plugins/gltf/metadata/classes/PropertySetAccessor.js","../node_modules/.pnpm/3d-tiles-renderer@0.4.21_three@0.183.2/node_modules/3d-tiles-renderer/src/three/plugins/gltf/metadata/classes/PropertyAttributeAccessor.js","../node_modules/.pnpm/3d-tiles-renderer@0.4.21_three@0.183.2/node_modules/3d-tiles-renderer/src/three/plugins/gltf/metadata/classes/PropertyTableAccessor.js","../node_modules/.pnpm/three@0.183.2/node_modules/three/examples/jsm/postprocessing/Pass.js","../node_modules/.pnpm/3d-tiles-renderer@0.4.21_three@0.183.2/node_modules/3d-tiles-renderer/src/three/plugins/gltf/metadata/utilities/TextureReadUtility.js","../node_modules/.pnpm/3d-tiles-renderer@0.4.21_three@0.183.2/node_modules/3d-tiles-renderer/src/three/plugins/gltf/metadata/utilities/TexCoordUtilities.js","../node_modules/.pnpm/3d-tiles-renderer@0.4.21_three@0.183.2/node_modules/3d-tiles-renderer/src/three/plugins/gltf/metadata/classes/PropertyTextureAccessor.js","../node_modules/.pnpm/3d-tiles-renderer@0.4.21_three@0.183.2/node_modules/3d-tiles-renderer/src/three/plugins/gltf/metadata/classes/StructuralMetadata.js","../node_modules/.pnpm/3d-tiles-renderer@0.4.21_three@0.183.2/node_modules/3d-tiles-renderer/src/three/plugins/gltf/metadata/classes/MeshFeatures.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\tVector2,\n\tVector3,\n\tVector4,\n\tMatrix2,\n\tMatrix3,\n\tMatrix4,\n} from 'three';\n\n// returns the field in the object with a resolved default\nexport function getField( object, key, def ) {\n\n\treturn object && key in object ? object[ key ] : def;\n\n}\n\n// checks the structural metadata type\nexport function isNumericType( type ) {\n\n\treturn type !== 'BOOLEAN' && type !== 'STRING' && type !== 'ENUM';\n\n}\n\n// check if the class property type is a float component type value\nexport function isFloatComponentType( type ) {\n\n\treturn /^FLOAT/.test( type );\n\n}\n\n// check if the class property type is a vector type\nexport function isVectorType( type ) {\n\n\treturn /^VEC/.test( type );\n\n}\n\n// check if the class property type is a matrix type\nexport function isMatrixType( type ) {\n\n\treturn /^MAT/.test( type );\n\n}\n\n// returns a value from the given buffer of the given type\nexport function readDataFromBufferToType( buffer, offset, type, target = null ) {\n\n\tif ( isMatrixType( type ) ) {\n\n\t\treturn target.fromArray( buffer, offset );\n\n\t} else if ( isVectorType( type ) ) {\n\n\t\treturn target.fromArray( buffer, offset );\n\n\t} else {\n\n\t\treturn buffer[ offset ];\n\n\t}\n\n}\n\n// gets a new instance of the given structural metadata type\nexport function getTypeInstance( property ) {\n\n\tconst { type, componentType } = property;\n\tswitch ( type ) {\n\n\t\tcase 'SCALAR': return componentType === 'INT64' ? 0n : 0;\n\t\tcase 'VEC2': return new Vector2();\n\t\tcase 'VEC3': return new Vector3();\n\t\tcase 'VEC4': return new Vector4();\n\t\tcase 'MAT2': return new Matrix2();\n\t\tcase 'MAT3': return new Matrix3();\n\t\tcase 'MAT4': return new Matrix4();\n\t\tcase 'BOOLEAN': return false;\n\t\tcase 'STRING': return '';\n\n\t\t// the final value for enums is a string but are represented as integers\n\t\t// during intermediate steps\n\t\tcase 'ENUM': return 0;\n\n\t}\n\n}\n\n// returns false if the given value is not of \"type\"\nexport function isTypeInstance( type, value ) {\n\n\tif ( value === null || value === undefined ) {\n\n\t\treturn false;\n\n\t}\n\n\tswitch ( type ) {\n\n\t\tcase 'SCALAR': return typeof value === 'number' || typeof value === 'bigint';\n\t\tcase 'VEC2': return value.isVector2;\n\t\tcase 'VEC3': return value.isVector3;\n\t\tcase 'VEC4': return value.isVector4;\n\t\tcase 'MAT2': return value.isMatrix2;\n\t\tcase 'MAT3': return value.isMatrix3;\n\t\tcase 'MAT4': return value.isMatrix4;\n\t\tcase 'BOOLEAN': return typeof value === 'boolean';\n\t\tcase 'STRING': return typeof value === 'string';\n\t\tcase 'ENUM': return typeof value === 'number' || typeof value === 'bigint';\n\n\t}\n\n\tthrow new Error( 'ClassProperty: invalid type.' );\n\n}\n\n// gets a new numeric array constructor from the given structural metadata type\nexport function getArrayConstructorFromComponentType( componentType, type = null ) {\n\n\tswitch ( componentType ) {\n\n\t\tcase 'INT8': return Int8Array;\n\t\tcase 'INT16': return Int16Array;\n\t\tcase 'INT32': return Int32Array;\n\t\tcase 'INT64': return BigInt64Array;\n\n\t\tcase 'UINT8': return Uint8Array;\n\t\tcase 'UINT16': return Uint16Array;\n\t\tcase 'UINT32': return Uint32Array;\n\t\tcase 'UINT64': return BigUint64Array;\n\n\t\tcase 'FLOAT32': return Float32Array;\n\t\tcase 'FLOAT64': return Float64Array;\n\n\t}\n\n\tswitch ( type ) {\n\n\t\tcase 'BOOLEAN': return Uint8Array;\n\t\tcase 'STRING': return Uint8Array;\n\n\t}\n\n\tthrow new Error( 'ClassProperty: invalid type.' );\n\n}\n\n// resolve a full default value for the given property including arrays\nexport function resolveDefault( property, target = null ) {\n\n\tconst array = property.array;\n\tif ( array ) {\n\n\t\ttarget = target && Array.isArray( target ) ? target : [];\n\t\ttarget.length = property.count;\n\t\tfor ( let i = 0, l = target.length; i < l; i ++ ) {\n\n\t\t\ttarget[ i ] = resolveDefaultElement( property, target[ i ] );\n\n\t\t}\n\n\t} else {\n\n\t\ttarget = resolveDefaultElement( property, target );\n\n\t}\n\n\treturn target;\n\n}\n\n// gets the default value of the given type\nexport function resolveDefaultElement( property, target = null ) {\n\n\tconst defaultValue = property.default;\n\tconst type = property.type;\n\n\ttarget = target || getTypeInstance( property );\n\n\tif ( defaultValue === null ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 'SCALAR': return 0;\n\t\t\tcase 'VEC2': return target.set( 0, 0 );\n\t\t\tcase 'VEC3': return target.set( 0, 0, 0 );\n\t\t\tcase 'VEC4': return target.set( 0, 0, 0, 0 );\n\t\t\tcase 'MAT2': return target.identity();\n\t\t\tcase 'MAT3': return target.identity();\n\t\t\tcase 'MAT4': return target.identity();\n\t\t\tcase 'BOOLEAN': return false;\n\t\t\tcase 'STRING': return '';\n\t\t\tcase 'ENUM': return '';\n\n\t\t}\n\n\t\tthrow new Error( 'ClassProperty: invalid type.' );\n\n\t} else {\n\n\t\tif ( isMatrixType( type ) ) {\n\n\t\t\ttarget.fromArray( defaultValue );\n\n\t\t} else if ( isVectorType( type ) ) {\n\n\t\t\ttarget.fromArray( defaultValue );\n\n\t\t} else {\n\n\t\t\treturn defaultValue;\n\n\t\t}\n\n\t}\n\n}\n\n// check for of instances of \"no data\" in the given target value and adjust them to the\n// default value.\nexport function resolveNoData( property, target ) {\n\n\tif ( property.noData === null ) {\n\n\t\treturn target;\n\n\t}\n\n\tconst noData = property.noData;\n\tconst type = property.type;\n\tif ( Array.isArray( target ) ) {\n\n\t\tfor ( let i = 0, l = target.length; i < l; i ++ ) {\n\n\t\t\ttarget[ i ] = performResolution( target[ i ] );\n\n\t\t}\n\n\t} else {\n\n\t\ttarget = performResolution( target );\n\n\t}\n\n\treturn target;\n\n\t// replace the value with a default if no data is encountered\n\tfunction performResolution( target ) {\n\n\t\tif ( isNoDataEqual( target ) ) {\n\n\t\t\ttarget = resolveDefaultElement( property, target );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t// checks if the given value is equal to the no data value\n\tfunction isNoDataEqual( value ) {\n\n\t\tif ( isMatrixType( type ) ) {\n\n\t\t\tconst elements = value.elements;\n\t\t\tfor ( let i = 0, l = noData.length; i < l; i ++ ) {\n\n\t\t\t\tif ( noData[ i ] !== elements[ i ] ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t} else if ( isVectorType( type ) ) {\n\n\t\t\tfor ( let i = 0, l = noData.length; i < l; i ++ ) {\n\n\t\t\t\tif ( noData[ i ] !== value.getComponent( i ) ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t} else {\n\n\t\t\treturn noData === value;\n\n\t\t}\n\n\t}\n\n}\n\nexport function normalizeValue( componentType, v ) {\n\n\t// formulas defined here but normalizing 64 bit ints will result in precision loss:\n\t// https://github.com/CesiumGS/3d-tiles/tree/main/specification/Metadata/#normalized-values\n\tswitch ( componentType ) {\n\n\t\tcase 'INT8': return Math.max( v / 127.0, - 1.0 );\n\t\tcase 'INT16': return Math.max( v, 32767.0, - 1.0 );\n\t\tcase 'INT32': return Math.max( v / 2147483647.0, - 1.0 );\n\t\tcase 'INT64': return Math.max( Number( v ) / 9223372036854775807.0, - 1.0 ); // eslint-disable-line no-loss-of-precision\n\n\t\tcase 'UINT8': return v / 255.0;\n\t\tcase 'UINT16': return v / 65535.0;\n\t\tcase 'UINT32': return v / 4294967295.0;\n\t\tcase 'UINT64': return Number( v ) / 18446744073709551615.0; // eslint-disable-line no-loss-of-precision\n\n\t}\n\n}\n\n// scales the value based on property settings\n// the provided target value is normalized, scaled, and then offset if numeric\nexport function adjustValueScaleOffset( property, target ) {\n\n\tconst {\n\t\ttype,\n\t\tcomponentType,\n\t\tscale,\n\t\toffset,\n\t\tnormalized,\n\t} = property;\n\n\tif ( Array.isArray( target ) ) {\n\n\t\tfor ( let i = 0, l = target.length; i < l; i ++ ) {\n\n\t\t\ttarget[ i ] = adjustFromType( target[ i ] );\n\n\t\t}\n\n\t} else {\n\n\t\ttarget = adjustFromType( target );\n\n\t}\n\n\treturn target;\n\n\tfunction adjustFromType( value ) {\n\n\t\tif ( isMatrixType( type ) ) {\n\n\t\t\tvalue = adjustMatrix( value );\n\n\t\t} else if ( isVectorType( type ) ) {\n\n\t\t\tvalue = adjustVector( value );\n\n\t\t} else {\n\n\t\t\tvalue = adjustScalar( value );\n\n\t\t}\n\n\t\treturn value;\n\n\t}\n\n\tfunction adjustVector( value ) {\n\n\t\tvalue.x = adjustScalar( value.x );\n\t\tvalue.y = adjustScalar( value.y );\n\t\tif ( 'z' in value ) value.z = adjustScalar( value.z );\n\t\tif ( 'w' in value ) value.w = adjustScalar( value.w );\n\t\treturn value;\n\n\t}\n\n\tfunction adjustMatrix( value ) {\n\n\t\tconst elements = value.elements;\n\t\tfor ( let i = 0, l = elements.length; i < l; i ++ ) {\n\n\t\t\telements[ i ] = adjustScalar( elements[ i ] );\n\n\t\t}\n\n\t\treturn value;\n\n\t}\n\n\tfunction adjustScalar( value ) {\n\n\t\tif ( normalized ) {\n\n\t\t\tvalue = normalizeValue( componentType, value );\n\n\t\t}\n\n\t\tif ( normalized || isFloatComponentType( componentType ) ) {\n\n\t\t\tvalue = value * scale + offset;\n\n\t\t}\n\n\t\treturn value;\n\n\t}\n\n}\n\n// Shape the given target object based on the provided property. If overrideCount is\n// provided then it will be used to specify the array length.\nexport function initializeFromProperty( property, target, overrideCount = null ) {\n\n\tif ( property.array ) {\n\n\t\tif ( ! Array.isArray( target ) ) {\n\n\t\t\ttarget = new Array( property.count || 0 );\n\n\t\t}\n\n\t\ttarget.length = overrideCount !== null ? overrideCount : property.count;\n\n\t\tfor ( let i = 0, l = target.length; i < l; i ++ ) {\n\n\t\t\tif ( ! isTypeInstance( property.type, target[ i ] ) ) {\n\n\t\t\t\ttarget[ i ] = getTypeInstance( property );\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\tif ( ! isTypeInstance( property.type, target ) ) {\n\n\t\t\ttarget = getTypeInstance( property );\n\n\t\t}\n\n\t}\n\n\treturn target;\n\n}\n\n// Shape the \"target\" object based on the provided set of properties\nexport function initializeFromClass( properties, target ) {\n\n\t// remove unused fields\n\tfor ( const key in target ) {\n\n\t\tif ( ! ( key in properties ) ) {\n\n\t\t\tdelete target[ key ];\n\n\t\t}\n\n\t}\n\n\t// add and adjust any fields required by the set of properties\n\tfor ( const key in properties ) {\n\n\t\tconst prop = properties[ key ];\n\t\ttarget[ key ] = initializeFromProperty( prop, target[ key ] );\n\n\t}\n\n}\n\n// Returns the number of components required for the given type\nexport function typeToComponentCount( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 'ENUM': return 1;\n\t\tcase 'SCALAR': return 1;\n\t\tcase 'VEC2': return 2;\n\t\tcase 'VEC3': return 3;\n\t\tcase 'VEC4': return 4;\n\t\tcase 'MAT2': return 4;\n\t\tcase 'MAT3': return 9;\n\t\tcase 'MAT4': return 16;\n\n\t\t// unused\n\t\tcase 'BOOLEAN': return - 1;\n\t\tcase 'STRING': return - 1;\n\t\tdefault: return - 1;\n\n\t}\n\n}\n","import {\n\tinitializeFromProperty,\n\tadjustValueScaleOffset,\n\tgetField,\n\tisNumericType,\n\tresolveDefaultElement,\n\tresolveNoData,\n\tresolveDefault,\n} from '../utilities/ClassPropertyHelpers.js';\n\nexport class ClassProperty {\n\n\tconstructor( enums, property, accessorProperty = null ) {\n\n\t\t// initialize defaults for class property info\n\t\tthis.name = property.name || null;\n\t\tthis.description = property.description || null;\n\t\tthis.type = property.type;\n\t\tthis.componentType = property.componentType || null;\n\t\tthis.enumType = property.enumType || null;\n\t\tthis.array = property.array || false;\n\t\tthis.count = property.count || 0;\n\t\tthis.normalized = property.normalized || false;\n\t\tthis.offset = property.offset || 0;\n\t\tthis.scale = getField( property, 'scale', 1 );\n\t\tthis.max = getField( property, 'max', Infinity );\n\t\tthis.min = getField( property, 'min', - Infinity );\n\t\tthis.required = property.required || false;\n\t\tthis.noData = getField( property, 'noData', null );\n\t\tthis.default = getField( property, 'default', null );\n\t\tthis.semantic = getField( property, 'semantic', null );\n\t\tthis.enumSet = null;\n\t\tthis.accessorProperty = accessorProperty;\n\n\t\t// accessor properties can override min, max, offset, and scale values\n\t\tif ( accessorProperty ) {\n\n\t\t\tthis.offset = getField( accessorProperty, 'offset', this.offset );\n\t\t\tthis.scale = getField( accessorProperty, 'scale', this.scale );\n\t\t\tthis.max = getField( accessorProperty, 'max', this.max );\n\t\t\tthis.min = getField( accessorProperty, 'min', this.min );\n\n\t\t}\n\n\t\t// get the component type for the provided enum\n\t\tif ( property.type === 'ENUM' ) {\n\n\t\t\tthis.enumSet = enums[ this.enumType ];\n\t\t\tif ( this.componentType === null ) {\n\n\t\t\t\tthis.componentType = getField( this.enumSet, 'valueType', 'UINT16' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// shape the given target to match the data type of the property\n\t// enums are set to their integer value\n\tshapeToProperty( target, countOverride = null ) {\n\n\t\treturn initializeFromProperty( this, target, countOverride );\n\n\t}\n\n\t// resolve the given object to the default value for the property for a single element\n\t// enums are set to a default string\n\tresolveDefaultElement( target ) {\n\n\t\treturn resolveDefaultElement( this, target );\n\n\t}\n\n\t// resolve the target to the default value for the property for every element if it's an array\n\t// enums are set to a default string\n\tresolveDefault( target ) {\n\n\t\treturn resolveDefault( this, target );\n\n\t}\n\n\t// converts any instances of no data to the default value\n\tresolveNoData( target ) {\n\n\t\treturn resolveNoData( this, target );\n\n\t}\n\n\t// converts enums integers in the given target to strings\n\tresolveEnumsToStrings( target ) {\n\n\t\tconst enumSet = this.enumSet;\n\t\tif ( this.type === 'ENUM' ) {\n\n\t\t\tif ( Array.isArray( target ) ) {\n\n\t\t\t\tfor ( let i = 0, l = target.length; i < l; i ++ ) {\n\n\t\t\t\t\ttarget[ i ] = getEnumName( target[ i ] );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\ttarget = getEnumName( target );\n\n\t\t\t}\n\n\n\t\t}\n\n\t\treturn target;\n\n\t\tfunction getEnumName( index ) {\n\n\t\t\tconst match = enumSet.values.find( e => e.value === index );\n\t\t\tif ( match === null ) {\n\n\t\t\t\t// the default \"default enum\" value is an empty string when we can't find a match\n\t\t\t\t// in a case where enums are defined correctly we should never get here.\n\t\t\t\treturn '';\n\n\t\t\t} else {\n\n\t\t\t\treturn match.name;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// apply scales\n\tadjustValueScaleOffset( target ) {\n\n\t\tif ( isNumericType( this.type ) ) {\n\n\t\t\treturn adjustValueScaleOffset( this, target );\n\n\t\t} else {\n\n\t\t\treturn target;\n\n\t\t}\n\n\t}\n\n}\n","import { ClassProperty } from './ClassProperty.js';\n\nexport class PropertySetAccessor {\n\n\tconstructor( definition, classes = {}, enums = {}, data = null ) {\n\n\t\tthis.definition = definition;\n\t\tthis.class = classes[ definition.class ];\n\t\tthis.className = definition.class;\n\t\tthis.enums = enums;\n\t\tthis.data = data;\n\t\tthis.name = 'name' in definition ? definition.name : null;\n\n\t\tthis.properties = null;\n\n\t}\n\n\tgetPropertyNames() {\n\n\t\treturn Object.keys( this.class.properties );\n\n\t}\n\n\tincludesData( name ) {\n\n\t\treturn Boolean( this.definition.properties[ name ] );\n\n\t}\n\n\tdispose() {}\n\n\t_initProperties( propertyClass = ClassProperty ) {\n\n\t\tconst properties = {};\n\t\tfor ( const key in this.class.properties ) {\n\n\t\t\tproperties[ key ] = new propertyClass( this.enums, this.class.properties[ key ], this.definition.properties[ key ] );\n\n\t\t}\n\n\t\tthis.properties = properties;\n\n\t}\n\n}\n","import { initializeFromClass, isMatrixType, isVectorType } from '../utilities/ClassPropertyHelpers.js';\nimport { ClassProperty } from './ClassProperty.js';\nimport { PropertySetAccessor } from './PropertySetAccessor.js';\n\nclass PropertyAttributeClassProperty extends ClassProperty {\n\n\tconstructor( enums, classProperty, attributeProperty = null ) {\n\n\t\tsuper( enums, classProperty, attributeProperty );\n\n\t\tthis.attribute = attributeProperty?.attribute ?? null;\n\n\t}\n\n}\n\nexport class PropertyAttributeAccessor extends PropertySetAccessor {\n\n\tconstructor( ...args ) {\n\n\t\tsuper( ...args );\n\n\t\tthis.isPropertyAttributeAccessor = true;\n\t\tthis._initProperties( PropertyAttributeClassProperty );\n\n\t}\n\n\tgetData( id, geometry, target = {} ) {\n\n\t\tconst properties = this.properties;\n\t\tinitializeFromClass( properties, target );\n\n\t\tfor ( const name in properties ) {\n\n\t\t\ttarget[ name ] = this.getPropertyValue( name, id, geometry, target[ name ] );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\tgetPropertyValue( name, id, geometry, target = null ) {\n\n\t\t// NOTE: arrays are not supported via attribute accessors\n\t\tif ( id >= this.count ) {\n\n\t\t\tthrow new Error( 'PropertyAttributeAccessor: Requested index is outside the range of the buffer.' );\n\n\t\t}\n\n\t\t// use a default of the texture accessor definition does not include the value\n\t\tconst property = this.properties[ name ];\n\t\tconst type = property.type;\n\t\tif ( ! property ) {\n\n\t\t\tthrow new Error( 'PropertyAttributeAccessor: Requested class property does not exist.' );\n\n\t\t} else if ( ! this.definition.properties[ name ] ) {\n\n\t\t\treturn property.resolveDefault( target );\n\n\t\t}\n\n\t\t// initialize the array\n\t\ttarget = property.shapeToProperty( target );\n\n\t\t// Read the data values from the attribute\n\t\tconst attribute = geometry.getAttribute( property.attribute.toLowerCase() );\n\t\tif ( isMatrixType( type ) ) {\n\n\t\t\tconst elements = target.elements;\n\t\t\tfor ( let i = 0, l = elements.length; i < l; i < l ) {\n\n\t\t\t\telements[ i ] = attribute.getComponent( id, i );\n\n\t\t\t}\n\n\t\t} else if ( isVectorType( type ) ) {\n\n\t\t\ttarget.fromBufferAttribute( attribute, id );\n\n\t\t} else if ( type === 'SCALAR' || type === 'ENUM' ) {\n\n\t\t\ttarget = attribute.getX( id );\n\n\t\t} else {\n\n\t\t\t// BOOLEAN, STRING not supported\n\t\t\tthrow new Error( 'StructuredMetadata.PropertyAttributeAccessor: BOOLEAN and STRING types are not supported by property attributes.' );\n\n\t\t}\n\n\t\t// scale the numeric values\n\t\ttarget = property.adjustValueScaleOffset( target );\n\n\t\t// convert to enum strings - no data enum values are stored as strings\n\t\ttarget = property.resolveEnumsToStrings( target );\n\n\t\t// resolve to default values\n\t\ttarget = property.resolveNoData( target );\n\n\t\treturn target;\n\n\t}\n\n}\n","import { ClassProperty } from './ClassProperty.js';\nimport { PropertySetAccessor } from './PropertySetAccessor.js';\nimport {\n\tinitializeFromClass,\n\tgetArrayConstructorFromComponentType,\n\treadDataFromBufferToType,\n\tgetField,\n\tisNumericType,\n\ttypeToComponentCount,\n} from '../utilities/ClassPropertyHelpers.js';\n\nclass PropertyTableClassProperty extends ClassProperty {\n\n\tconstructor( enums, classProperty, tableProperty = null ) {\n\n\t\tsuper( enums, classProperty, tableProperty );\n\n\t\tthis.values = tableProperty?.values ?? null;\n\t\tthis.valueLength = typeToComponentCount( this.type );\n\t\tthis.arrayOffsets = getField( tableProperty, 'arrayOffsets', null );\n\t\tthis.stringOffsets = getField( tableProperty, 'stringOffsets', null );\n\t\tthis.arrayOffsetType = getField( tableProperty, 'arrayOffsetType', 'UINT32' );\n\t\tthis.stringOffsetType = getField( tableProperty, 'stringOffsetType', 'UINT32' );\n\n\t}\n\n\t// returns the necessary array length based on the array offsets if present\n\tgetArrayLengthFromId( buffers, id ) {\n\n\t\tlet count = this.count;\n\t\tif ( this.arrayOffsets !== null ) {\n\n\t\t\tconst { arrayOffsets, arrayOffsetType } = this;\n\t\t\tconst bufferCons = getArrayConstructorFromComponentType( arrayOffsetType );\n\t\t\tconst arr = new bufferCons( buffers[ arrayOffsets ] );\n\t\t\tcount = arr[ id + 1 ] - arr[ id ];\n\n\t\t}\n\n\t\treturn count;\n\n\t}\n\n\t// returns the index offset into the data buffer for the given id based on the\n\t// the array offsets if present\n\tgetIndexOffsetFromId( buffers, id ) {\n\n\t\tlet indexOffset = id;\n\t\tif ( this.arrayOffsets ) {\n\n\t\t\tconst { arrayOffsets, arrayOffsetType } = this;\n\t\t\tconst bufferCons = getArrayConstructorFromComponentType( arrayOffsetType );\n\t\t\tconst arr = new bufferCons( buffers[ arrayOffsets ] );\n\t\t\tindexOffset = arr[ indexOffset ];\n\n\t\t} else if ( this.array ) {\n\n\t\t\t// TODO: why do this? Revisit\n\t\t\tindexOffset *= this.count;\n\n\t\t}\n\n\t\treturn indexOffset;\n\n\t}\n\n}\n\nexport class PropertyTableAccessor extends PropertySetAccessor {\n\n\tconstructor( ...args ) {\n\n\t\tsuper( ...args );\n\n\t\tthis.isPropertyTableAccessor = true;\n\t\tthis.count = this.definition.count;\n\n\t\tthis._initProperties( PropertyTableClassProperty );\n\n\t}\n\n\tgetData( id, target = {} ) {\n\n\t\tconst properties = this.properties;\n\t\tinitializeFromClass( properties, target );\n\n\t\tfor ( const name in properties ) {\n\n\t\t\ttarget[ name ] = this.getPropertyValue( name, id, target[ name ] );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t// reads an individual element\n\t_readValueAtIndex( name, id, index, target = null ) {\n\n\t\tconst property = this.properties[ name ];\n\t\tconst { componentType, type } = property;\n\n\t\tconst buffers = this.data;\n\t\tconst bufferView = buffers[ property.values ];\n\t\tconst bufferCons = getArrayConstructorFromComponentType( componentType, type );\n\t\tconst dataArray = new bufferCons( bufferView );\n\n\t\t// array offsets contain element offsets, not byte offsets\n\t\tconst indexOffset = property.getIndexOffsetFromId( buffers, id );\n\n\t\tif ( isNumericType( type ) || type === 'ENUM' ) {\n\n\t\t\t// \"readDataFromBufferToType\" takes the start offset to read from so we multiply the\n\t\t\t// index by the final value length\n\t\t\treturn readDataFromBufferToType( dataArray, ( indexOffset + index ) * property.valueLength, type, target );\n\n\t\t} else if ( type === 'STRING' ) {\n\n\t\t\t// https://github.com/CesiumGS/3d-tiles/tree/main/specification/Metadata/#variable-length-arrays\n\n\t\t\tlet stringIndex = indexOffset + index;\n\t\t\tlet stringLength = 0;\n\t\t\tif ( property.stringOffsets !== null ) {\n\n\t\t\t\t// get the string lengths and beginning offsets if variable\n\t\t\t\tconst { stringOffsets, stringOffsetType } = property;\n\t\t\t\tconst bufferCons = getArrayConstructorFromComponentType( stringOffsetType );\n\t\t\t\tconst stringOffsetBuffer = new bufferCons( buffers[ stringOffsets ] );\n\t\t\t\tstringLength = stringOffsetBuffer[ stringIndex + 1 ] - stringOffsetBuffer[ stringIndex ];\n\t\t\t\tstringIndex = stringOffsetBuffer[ stringIndex ];\n\n\t\t\t}\n\n\t\t\tconst byteArray = new Uint8Array( dataArray.buffer, stringIndex, stringLength );\n\t\t\ttarget = new TextDecoder().decode( byteArray );\n\n\t\t} else if ( type === 'BOOLEAN' ) {\n\n\t\t\tconst offset = indexOffset + index;\n\t\t\tconst byteIndex = Math.floor( offset / 8 );\n\t\t\tconst bitIndex = offset % 8;\n\t\t\tconst bitValue = ( dataArray[ byteIndex ] >> bitIndex ) & 1;\n\t\t\ttarget = bitValue === 1;\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t// Reads the data for the given table index\n\tgetPropertyValue( name, id, target = null ) {\n\n\t\t// check if the requested id is outside of the size of the table\n\t\tif ( id >= this.count ) {\n\n\t\t\tthrow new Error( 'PropertyTableAccessor: Requested index is outside the range of the table.' );\n\n\t\t}\n\n\t\t// check to see if we skip this field since its not in the table\n\t\tconst property = this.properties[ name ];\n\t\tif ( ! property ) {\n\n\t\t\tthrow new Error( 'PropertyTableAccessor: Requested property does not exist.' );\n\n\t\t} else if ( ! this.definition.properties[ name ] ) {\n\n\t\t\treturn property.resolveDefault( target );\n\n\t\t}\n\n\t\t// get the dynamic array count from the property buffer\n\t\tconst array = property.array;\n\t\tconst buffers = this.data;\n\t\tconst count = property.getArrayLengthFromId( buffers, id );\n\n\t\t// initialize the array\n\t\ttarget = property.shapeToProperty( target, count );\n\n\t\t// read all data\n\t\tif ( array ) {\n\n\t\t\tfor ( let i = 0, l = target.length; i < l; i ++ ) {\n\n\t\t\t\ttarget[ i ] = this._readValueAtIndex( name, id, i, target[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\ttarget = this._readValueAtIndex( name, id, 0, target );\n\n\t\t}\n\n\t\t// scale the numeric values\n\t\ttarget = property.adjustValueScaleOffset( target );\n\n\t\t// convert to enum strings - no data enum values are stored as strings\n\t\ttarget = property.resolveEnumsToStrings( target );\n\n\t\t// resolve to default values\n\t\ttarget = property.resolveNoData( target );\n\n\t\treturn target;\n\n\t}\n\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 { WebGLRenderTarget, WebGLRenderer, Box2, Vector2, ShaderMaterial, CustomBlending, ZeroFactor, OneFactor } from 'three';\nimport { FullScreenQuad } from 'three/examples/jsm/postprocessing/Pass.js';\n\nconst _box = /* @__PURE__ */ new Box2();\n\n// Utility for reading sets of individual pixel values from textures\nclass _TextureReadUtility {\n\n\tconstructor() {\n\n\t\tthis._renderer = new WebGLRenderer();\n\t\tthis._target = new WebGLRenderTarget( 1, 1 );\n\t\tthis._texTarget = new WebGLRenderTarget();\n\n\t\t// quad to render just a single pixel from the provided texture\n\t\tthis._quad = new FullScreenQuad( new ShaderMaterial( {\n\n\t\t\tblending: CustomBlending,\n\t\t\tblendDst: ZeroFactor,\n\t\t\tblendSrc: OneFactor,\n\n\t\t\tuniforms: {\n\n\t\t\t\tmap: { value: null },\n\t\t\t\tpixel: { value: new Vector2() }\n\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\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\t\t\tfragmentShader: /* glsl */`\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\t\t} ) );\n\n\t}\n\n\t// increases the width of the target render target to support more data\n\tincreaseSizeTo( width ) {\n\n\t\tthis._target.setSize( Math.max( this._target.width, width ), 1 );\n\n\t}\n\n\t// read data from the rendered texture asynchronously\n\treadDataAsync( buffer ) {\n\n\t\tconst { _renderer, _target } = this;\n\t\treturn _renderer.readRenderTargetPixelsAsync( _target, 0, 0, buffer.length / 4, 1, buffer );\n\n\t}\n\n\t// read data from the rendered texture\n\treadData( buffer ) {\n\n\t\tconst { _renderer, _target } = this;\n\t\t_renderer.readRenderTargetPixels( _target, 0, 0, buffer.length / 4, 1, buffer );\n\n\t}\n\n\t// render a single pixel from the source at the destination point on the render target\n\t// takes the texture, pixel to read from, and pixel to render in to\n\trenderPixelToTarget( texture, pixel, dstPixel ) {\n\n\t\tconst { _renderer, _target } = this;\n\n\t\t// copies the pixel directly to the target buffer\n\t\t_box.min.copy( pixel );\n\t\t_box.max.copy( pixel );\n\t\t_box.max.x += 1;\n\t\t_box.max.y += 1;\n\t\t_renderer.initRenderTarget( _target );\n\t\t_renderer.copyTextureToTexture( texture, _target.texture, _box, dstPixel, 0 );\n\n\t}\n\n}\n\n// Create a wrapper class to defer instantiation of the WebGLRenderer until it's needed\n// See NASA-AMMOS/3DTilesRendererJS#905\nexport const TextureReadUtility = /* @__PURE__ */ new ( class {\n\n\tconstructor() {\n\n\t\tlet reader = null;\n\t\tObject\n\t\t\t.getOwnPropertyNames( _TextureReadUtility.prototype )\n\t\t\t.forEach( key => {\n\n\t\t\t\tif ( key !== 'constructor' ) {\n\n\t\t\t\t\tthis[ key ] = ( ...args ) => {\n\n\t\t\t\t\t\treader = reader || new _TextureReadUtility();\n\t\t\t\t\t\treturn reader[ key ]( ...args );\n\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t}\n\n} )();\n","import { Vector2 } from 'three';\n\nconst _uv0 = /* @__PURE__ */ new Vector2();\nconst _uv1 = /* @__PURE__ */ new Vector2();\nconst _uv2 = /* @__PURE__ */ new Vector2();\n\n// returns the uv attribute of the given index\nexport function getTextureCoordAttribute( geometry, index ) {\n\n\tif ( index === 0 ) {\n\n\t\treturn geometry.getAttribute( 'uv' );\n\n\t} else {\n\n\t\treturn geometry.getAttribute( `uv${ index }` );\n\n\t}\n\n}\n\n// returns the vertex indices associated with the triangle index\nexport function getTriangleVertexIndices( geometry, faceIndex, target = new Array( 3 ) ) {\n\n\t// get the attribute indices\n\tlet i0 = 3 * faceIndex;\n\tlet i1 = 3 * faceIndex + 1;\n\tlet i2 = 3 * faceIndex + 2;\n\tif ( geometry.index ) {\n\n\t\ti0 = geometry.index.getX( i0 );\n\t\ti1 = geometry.index.getX( i1 );\n\t\ti2 = geometry.index.getX( i2 );\n\n\t}\n\n\ttarget[ 0 ] = i0;\n\ttarget[ 1 ] = i1;\n\ttarget[ 2 ] = i2;\n\treturn target;\n\n}\n\n// takes a tex coord index, barycoord, vertex indices, and target to set\n// sets target to the interpolated uv value\nexport function getTexCoord( geometry, texCoord, barycoord, indices, target ) {\n\n\tconst [ i0, i1, i2 ] = indices;\n\tconst attr = getTextureCoordAttribute( geometry, texCoord );\n\t_uv0.fromBufferAttribute( attr, i0 );\n\t_uv1.fromBufferAttribute( attr, i1 );\n\t_uv2.fromBufferAttribute( attr, i2 );\n\n\ttarget\n\t\t.set( 0, 0, 0 )\n\t\t.addScaledVector( _uv0, barycoord.x )\n\t\t.addScaledVector( _uv1, barycoord.y )\n\t\t.addScaledVector( _uv2, barycoord.z );\n\n}\n\n// gets the x, y index of the pixel at the given uv coordinate\nexport function getTexelIndices( uv, width, height, target ) {\n\n\tconst fx = uv.x - Math.floor( uv.x );\n\tconst fy = uv.y - Math.floor( uv.y );\n\tconst px = Math.floor( ( fx * width ) % width );\n\tconst py = Math.floor( ( fy * height ) % height );\n\ttarget.set( px, py );\n\treturn target;\n\n}\n","import { Vector2 } from 'three';\nimport { PropertySetAccessor } from './PropertySetAccessor.js';\nimport { ClassProperty } from './ClassProperty.js';\nimport { TextureReadUtility } from '../utilities/TextureReadUtility.js';\nimport { getTexCoord, getTexelIndices, getTriangleVertexIndices } from '../utilities/TexCoordUtilities.js';\nimport {\n\tinitializeFromClass,\n\tinitializeFromProperty,\n\tgetArrayConstructorFromComponentType,\n\treadDataFromBufferToType,\n\tgetField\n} from '../utilities/ClassPropertyHelpers.js';\n\nconst _uv = /* @__PURE__ */ new Vector2();\nconst _srcPixel = /* @__PURE__ */ new Vector2();\nconst _dstPixel = /* @__PURE__ */ new Vector2();\n\nclass PropertyTextureClassProperty extends ClassProperty {\n\n\tconstructor( enums, classProperty, textureProperty = null ) {\n\n\t\tsuper( enums, classProperty, textureProperty );\n\n\t\tthis.channels = getField( textureProperty, 'channels', [ 0 ] );\n\t\tthis.index = getField( textureProperty, 'index', null );\n\t\tthis.texCoord = getField( textureProperty, 'texCoord', null );\n\t\tthis.valueLength = parseInt( this.type.replace( /[^0-9]/g, '' ) ) || 1;\n\n\t}\n\n\t// takes the buffer to read from and the value index to read\n\treadDataFromBuffer( buffer, index, target = null ) {\n\n\t\tconst type = this.type;\n\t\tif ( type === 'BOOLEAN' || type === 'STRING' ) {\n\n\t\t\tthrow new Error( 'PropertyTextureAccessor: BOOLEAN and STRING types not supported.' );\n\n\t\t}\n\n\t\t// \"readDataFromBufferToType\" takes the start offset to read from so we multiply the index by the\n\t\t// final value length\n\t\treturn readDataFromBufferToType( buffer, index * this.valueLength, type, target );\n\n\t}\n\n}\n\n// Reads and accesses data encoded to textures\nexport class PropertyTextureAccessor extends PropertySetAccessor {\n\n\tconstructor( ...args ) {\n\n\t\tsuper( ...args );\n\n\t\tthis.isPropertyTextureAccessor = true;\n\t\tthis._asyncRead = false;\n\n\t\tthis._initProperties( PropertyTextureClassProperty );\n\n\t}\n\n\t// Reads the full set of property data\n\tgetData( faceIndex, barycoord, geometry, target = {} ) {\n\n\t\tconst properties = this.properties;\n\t\tinitializeFromClass( properties, target );\n\n\t\tconst names = Object.keys( properties );\n\t\tconst results = names.map( n => target[ n ] );\n\t\tthis.getPropertyValuesAtTexel( names, faceIndex, barycoord, geometry, results );\n\n\t\tnames.forEach( ( n, i ) => target[ n ] = results[ i ] );\n\t\treturn target;\n\n\t}\n\n\t// Reads the full set of property data asynchronously\n\tasync getDataAsync( faceIndex, barycoord, geometry, target = {} ) {\n\n\t\tconst properties = this.properties;\n\t\tinitializeFromClass( properties, target );\n\n\t\tconst names = Object.keys( properties );\n\t\tconst results = names.map( n => target[ n ] );\n\t\tawait this.getPropertyValuesAtTexelAsync( names, faceIndex, barycoord, geometry, results );\n\n\t\tnames.forEach( ( n, i ) => target[ n ] = results[ i ] );\n\t\treturn target;\n\n\t}\n\n\t// Reads values asynchronously\n\tgetPropertyValuesAtTexelAsync( ...args ) {\n\n\t\tthis._asyncRead = true;\n\t\tconst result = this.getPropertyValuesAtTexel( ...args );\n\t\tthis._asyncRead = false;\n\t\treturn result;\n\n\t}\n\n\t// Reads values from the textures synchronously\n\tgetPropertyValuesAtTexel( names, faceIndex, barycoord, geometry, target = [] ) {\n\n\t\t// resize our targets appropriately\n\t\twhile ( target.length < names.length ) target.push( null );\n\t\ttarget.length = names.length;\n\t\tTextureReadUtility.increaseSizeTo( target.length );\n\n\t\t// get the attribute indices\n\t\tconst textures = this.data;\n\t\tconst accessorProperties = this.definition.properties;\n\t\tconst properties = this.properties;\n\t\tconst indices = getTriangleVertexIndices( geometry, faceIndex );\n\t\tfor ( let i = 0, l = names.length; i < l; i ++ ) {\n\n\t\t\t// skip any requested class schema properties that are not provided via the accessor\n\t\t\tconst name = names[ i ];\n\t\t\tif ( ! accessorProperties[ name ] ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// get the attribute of the target tex coord\n\t\t\tconst property = properties[ name ];\n\t\t\tconst texture = textures[ property.index ];\n\t\t\tgetTexCoord( geometry, property.texCoord, barycoord, indices, _uv );\n\t\t\tgetTexelIndices( _uv, texture.image.width, texture.image.height, _srcPixel );\n\t\t\t_dstPixel.set( i, 0 );\n\n\t\t\tTextureReadUtility.renderPixelToTarget( texture, _srcPixel, _dstPixel );\n\n\t\t}\n\n\t\t// read the data\n\t\tconst buffer = new Uint8Array( names.length * 4 );\n\t\tif ( this._asyncRead ) {\n\n\t\t\treturn TextureReadUtility\n\t\t\t\t.readDataAsync( buffer )\n\t\t\t\t.then( () => {\n\n\t\t\t\t\treadTextureSampleResults.call( this );\n\t\t\t\t\treturn target;\n\n\t\t\t\t} );\n\n\t\t} else {\n\n\t\t\tTextureReadUtility.readData( buffer );\n\t\t\treadTextureSampleResults.call( this );\n\n\t\t\treturn target;\n\n\t\t}\n\n\t\tfunction readTextureSampleResults() {\n\n\t\t\tfor ( let i = 0, l = names.length; i < l; i ++ ) {\n\n\t\t\t\tconst name = names[ i ];\n\t\t\t\tconst property = properties[ name ];\n\t\t\t\tconst type = property.type;\n\n\t\t\t\t// initialize the output value\n\t\t\t\ttarget[ i ] = initializeFromProperty( property, target[ i ] );\n\n\t\t\t\t// use a default of the texture accessor definition does not include the value\n\t\t\t\tif ( ! property ) {\n\n\t\t\t\t\tthrow new Error( 'PropertyTextureAccessor: Requested property does not exist.' );\n\n\t\t\t\t} else if ( ! accessorProperties[ name ] ) {\n\n\t\t\t\t\ttarget[ i ] = property.resolveDefault( target );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// get the final array length to read all data based on used buffer data\n\t\t\t\tconst length = property.valueLength * ( property.count || 1 );\n\n\t\t\t\t// set the data read back from the texture to the target type\n\t\t\t\tconst data = property.channels.map( c => buffer[ 4 * i + c ] );\n\t\t\t\tconst componentType = property.componentType;\n\t\t\t\tconst BufferCons = getArrayConstructorFromComponentType( componentType, type );\n\t\t\t\tconst readBuffer = new BufferCons( length );\n\t\t\t\tnew Uint8Array( readBuffer.buffer ).set( data );\n\n\t\t\t\t// read all the data\n\t\t\t\tif ( property.array ) {\n\n\t\t\t\t\tconst arr = target[ i ];\n\t\t\t\t\tfor ( let j = 0, lj = arr.length; j < lj; j ++ ) {\n\n\t\t\t\t\t\tarr[ j ] = property.readDataFromBuffer( readBuffer, j, arr[ j ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttarget[ i ] = property.readDataFromBuffer( readBuffer, 0, target[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\t// scale the numeric values\n\t\t\t\ttarget[ i ] = property.adjustValueScaleOffset( target[ i ] );\n\n\t\t\t\t// convert to enum strings - no data enum values are stored as strings\n\t\t\t\ttarget[ i ] = property.resolveEnumsToStrings( target[ i ] );\n\n\t\t\t\t// resolve to default values\n\t\t\t\ttarget[ i ] = property.resolveNoData( target[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// dispose all of the texture data used\n\tdispose() {\n\n\t\tthis.data.forEach( texture => {\n\n\t\t\tif ( texture ) {\n\n\t\t\t\ttexture.dispose();\n\n\t\t\t\tif ( texture.image instanceof ImageBitmap ) {\n\n\t\t\t\t\ttexture.image.close();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n}\n","import { PropertyAttributeAccessor } from './PropertyAttributeAccessor.js';\nimport { PropertyTableAccessor } from './PropertyTableAccessor.js';\nimport { PropertyTextureAccessor } from './PropertyTextureAccessor.js';\n\nexport class StructuralMetadata {\n\n\tconstructor( definition, textures, buffers, nodeMetadata = null, object = null ) {\n\n\t\tconst {\n\t\t\tschema,\n\t\t\tpropertyTables = [],\n\t\t\tpropertyTextures = [],\n\t\t\tpropertyAttributes = [],\n\t\t} = definition;\n\n\t\tconst { enums, classes } = schema;\n\t\tconst tableAccessors = propertyTables.map( t => new PropertyTableAccessor( t, classes, enums, buffers ) );\n\t\tlet textureAccessors = [];\n\t\tlet attributeAccessors = [];\n\n\t\tif ( nodeMetadata ) {\n\n\t\t\tif ( nodeMetadata.propertyTextures ) {\n\n\t\t\t\ttextureAccessors = nodeMetadata.propertyTextures.map( i => new PropertyTextureAccessor( propertyTextures[ i ], classes, enums, textures ) );\n\n\t\t\t}\n\n\t\t\tif ( nodeMetadata.propertyAttributes ) {\n\n\t\t\t\tattributeAccessors = nodeMetadata.propertyAttributes.map( i => new PropertyAttributeAccessor( propertyAttributes[ i ], classes, enums ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.schema = schema;\n\t\tthis.tableAccessors = tableAccessors;\n\t\tthis.textureAccessors = textureAccessors;\n\t\tthis.attributeAccessors = attributeAccessors;\n\t\tthis.object = object;\n\t\tthis.textures = textures;\n\t\tthis.nodeMetadata = nodeMetadata;\n\n\t}\n\n\t// Property Tables\n\tgetPropertyTableData( tableIndices, ids, target = null ) {\n\n\t\tif ( ! Array.isArray( tableIndices ) || ! Array.isArray( ids ) ) {\n\n\t\t\t// only return a single tables data\n\t\t\ttarget = target || {};\n\n\t\t\tconst table = this.tableAccessors[ tableIndices ];\n\t\t\ttarget = table.getData( ids, target );\n\n\t\t} else {\n\n\t\t\t// return data from an array of tables and ids\n\t\t\ttarget = target || [];\n\n\t\t\tconst length = Math.min( tableIndices.length, ids.length );\n\t\t\ttarget.length = length;\n\n\t\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\t\tconst table = this.tableAccessors[ tableIndices[ i ] ];\n\t\t\t\ttarget[ i ] = table.getData( ids[ i ], target[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\tgetPropertyTableInfo( tableIndices = null ) {\n\n\t\t// default to all table information\n\t\tif ( tableIndices === null ) {\n\n\t\t\ttableIndices = this.tableAccessors.map( ( t, i ) => i );\n\n\t\t}\n\n\t\tif ( Array.isArray( tableIndices ) ) {\n\n\t\t\t// return all table information from the requested list\n\t\t\treturn tableIndices.map( i => {\n\n\t\t\t\tconst table = this.tableAccessors[ i ];\n\t\t\t\treturn {\n\t\t\t\t\tname: table.name,\n\t\t\t\t\tclassName: table.definition.class,\n\t\t\t\t};\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\t// return the one piece of table information\n\t\t\tconst table = this.tableAccessors[ tableIndices ];\n\t\t\treturn {\n\t\t\t\tname: table.name,\n\t\t\t\tclassName: table.definition.class,\n\t\t\t};\n\n\t\t}\n\n\t}\n\n\t// Property Textures\n\tgetPropertyTextureData( triangle, barycoord, target = [] ) {\n\n\t\tconst textureAccessors = this.textureAccessors;\n\t\ttarget.length = textureAccessors.length;\n\n\t\tfor ( let i = 0; i < textureAccessors.length; i ++ ) {\n\n\t\t\tconst accessor = textureAccessors[ i ];\n\t\t\ttarget[ i ] = accessor.getData( triangle, barycoord, this.object.geometry, target[ i ] );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\tasync getPropertyTextureDataAsync( triangle, barycoord, target = [] ) {\n\n\t\tconst textureAccessors = this.textureAccessors;\n\t\ttarget.length = textureAccessors.length;\n\n\t\tconst promises = [];\n\t\tfor ( let i = 0; i < textureAccessors.length; i ++ ) {\n\n\t\t\tconst accessor = textureAccessors[ i ];\n\t\t\tconst promise = accessor\n\t\t\t\t.getDataAsync( triangle, barycoord, this.object.geometry, target[ i ] )\n\t\t\t\t.then( result => {\n\n\t\t\t\t\ttarget[ i ] = result;\n\n\t\t\t\t} );\n\n\t\t\tpromises.push( promise );\n\n\t\t}\n\n\t\tawait Promise.all( promises );\n\n\t\treturn target;\n\n\t}\n\n\tgetPropertyTextureInfo() {\n\n\t\treturn this.textureAccessors;\n\n\t}\n\n\t// Property Attributes\n\tgetPropertyAttributeData( attributeIndex, target = [] ) {\n\n\t\tconst attributeAccessors = this.attributeAccessors;\n\t\ttarget.length = attributeAccessors.length;\n\n\t\tfor ( let i = 0; i < attributeAccessors.length; i ++ ) {\n\n\t\t\tconst accessor = attributeAccessors[ i ];\n\t\t\ttarget[ i ] = accessor.getData( attributeIndex, this.object.geometry, target[ i ] );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\tgetPropertyAttributeInfo() {\n\n\t\treturn this.attributeAccessors.map( acc => {\n\n\t\t\treturn {\n\t\t\t\tname: acc.name,\n\t\t\t\tclassName: acc.definition.class,\n\t\t\t};\n\n\t\t} );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.textureAccessors.forEach( acc => acc.dispose() );\n\t\tthis.tableAccessors.forEach( acc => acc.dispose() );\n\t\tthis.attributeAccessors.forEach( acc => acc.dispose() );\n\n\t}\n\n}\n","import { Vector2 } from 'three';\nimport { TextureReadUtility } from '../utilities/TextureReadUtility.js';\nimport { getTexCoord, getTexelIndices, getTriangleVertexIndices } from '../utilities/TexCoordUtilities.js';\n\nconst _uv = /* @__PURE__ */ new Vector2();\nconst _pixel = /* @__PURE__ */ new Vector2();\nconst _dstPixel = /* @__PURE__ */ new Vector2();\n\n// retrieve the appropriate UV attribute based on the tex coord index\nfunction getMaxBarycoordIndex( barycoord ) {\n\n\tif ( barycoord.x > barycoord.y && barycoord.x > barycoord.z ) {\n\n\t\treturn 0;\n\n\t} else if ( barycoord.y > barycoord.z ) {\n\n\t\treturn 1;\n\n\t} else {\n\n\t\treturn 2;\n\n\t}\n\n}\n\nexport class MeshFeatures {\n\n\tconstructor( geometry, textures, data ) {\n\n\t\tthis.geometry = geometry;\n\t\tthis.textures = textures;\n\t\tthis.data = data;\n\t\tthis._asyncRead = false;\n\n\t\t// fill out feature id default values\n\t\tthis.featureIds = data.featureIds.map( info => {\n\n\t\t\tconst { texture, ...rest } = info;\n\t\t\tconst result = {\n\t\t\t\tlabel: null,\n\t\t\t\tpropertyTable: null,\n\t\t\t\tnullFeatureId: null,\n\t\t\t\t...rest,\n\t\t\t};\n\n\t\t\tif ( texture ) {\n\n\t\t\t\tresult.texture = {\n\t\t\t\t\ttexCoord: 0,\n\t\t\t\t\tchannels: [ 0 ],\n\t\t\t\t\t...texture,\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t} );\n\n\t}\n\n\t// returns list of textures\n\tgetTextures() {\n\n\t\treturn this.textures;\n\n\t}\n\n\t// returns a set of info for each feature\n\tgetFeatureInfo() {\n\n\t\treturn this.featureIds;\n\n\t}\n\n\t// performs texture data read back asynchronously\n\tgetFeaturesAsync( ...args ) {\n\n\t\tthis._asyncRead = true;\n\t\tconst result = this.getFeatures( ...args );\n\t\tthis._asyncRead = false;\n\t\treturn result;\n\n\t}\n\n\t// returns all features for the given point on the given triangle\n\tgetFeatures( triangle, barycoord ) {\n\n\t\tconst { geometry, textures, featureIds } = this;\n\t\tconst result = new Array( featureIds.length ).fill( null );\n\n\t\t// prep the canvas width\n\t\tconst width = featureIds.length;\n\t\tTextureReadUtility.increaseSizeTo( width );\n\n\t\t// get the attribute indices\n\t\tconst indices = getTriangleVertexIndices( geometry, triangle );\n\t\tconst closestIndex = indices[ getMaxBarycoordIndex( barycoord ) ];\n\t\tfor ( let i = 0, l = featureIds.length; i < l; i ++ ) {\n\n\t\t\t// the feature id from the closest point is returned\n\t\t\tconst featureId = featureIds[ i ];\n\t\t\tconst nullFeatureId = 'nullFeatureId' in featureId ? featureId.nullFeatureId : null;\n\t\t\tif ( 'texture' in featureId ) {\n\n\t\t\t\tconst texture = textures[ featureId.texture.index ];\n\n\t\t\t\t// get the attribute of the target tex coord and pixel\n\t\t\t\tgetTexCoord( geometry, featureId.texture.texCoord, barycoord, indices, _uv );\n\t\t\t\tgetTexelIndices( _uv, texture.image.width, texture.image.height, _pixel );\n\t\t\t\t_dstPixel.set( i, 0 );\n\n\t\t\t\t// draw the image\n\t\t\t\tTextureReadUtility.renderPixelToTarget( textures[ featureId.texture.index ], _pixel, _dstPixel );\n\n\t\t\t} else if ( 'attribute' in featureId ) {\n\n\t\t\t\tconst attr = geometry.getAttribute( `_feature_id_${ featureId.attribute }` );\n\t\t\t\tconst value = attr.getX( closestIndex );\n\t\t\t\tif ( value !== nullFeatureId ) {\n\n\t\t\t\t\tresult[ i ] = value;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// implicit id is based on vertex attributes, see 3d-tiles#763\n\t\t\t\tconst value = closestIndex;\n\t\t\t\tif ( value !== nullFeatureId ) {\n\n\t\t\t\t\tresult[ i ] = value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// read the buffer data\n\t\tconst buffer = new Uint8Array( width * 4 );\n\t\tif ( this._asyncRead ) {\n\n\t\t\treturn TextureReadUtility\n\t\t\t\t.readDataAsync( buffer )\n\t\t\t\t.then( () => {\n\n\t\t\t\t\treadTextureSampleResults();\n\t\t\t\t\treturn result;\n\n\t\t\t\t} );\n\n\t\t} else {\n\n\t\t\tTextureReadUtility.readData( buffer );\n\t\t\treadTextureSampleResults();\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\tfunction readTextureSampleResults() {\n\n\t\t\t// get data based on the texture information\n\t\t\tconst readBuffer = new Uint32Array( 1 );\n\t\t\tfor ( let i = 0, l = featureIds.length; i < l; i ++ ) {\n\n\t\t\t\tconst featureId = featureIds[ i ];\n\t\t\t\tconst nullFeatureId = 'nullFeatureId' in featureId ? featureId.nullFeatureId : null;\n\t\t\t\tif ( 'texture' in featureId ) {\n\n\t\t\t\t\t// TODO: do we need to handle big-endian here?\n\t\t\t\t\tconst { channels } = featureId.texture;\n\t\t\t\t\tconst data = channels.map( c => buffer[ 4 * i + c ] );\n\t\t\t\t\tnew Uint8Array( readBuffer.buffer ).set( data );\n\n\t\t\t\t\tconst value = readBuffer[ 0 ];\n\t\t\t\t\tif ( value !== nullFeatureId ) {\n\n\t\t\t\t\t\tresult[ i ] = value;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// dispose all of the texture data used\n\tdispose() {\n\n\t\tthis.textures.forEach( texture => {\n\n\t\t\tif ( texture ) {\n\n\t\t\t\ttexture.dispose();\n\n\t\t\t\tif ( texture.image instanceof ImageBitmap ) {\n\n\t\t\t\t\ttexture.image.close();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n}\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 } from \"3d-tiles-renderer/src/three/plugins/gltf/metadata/classes/StructuralMetadata.js\";\r\nimport { MeshFeatures } from \"3d-tiles-renderer/src/three/plugins/gltf/metadata/classes/MeshFeatures.js\";\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 } =\r\n 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(\r\n geometry,\r\n material,\r\n count,\r\n );\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(\r\n SCALE[i * 3],\r\n SCALE[i * 3 + 1],\r\n SCALE[i * 3 + 2],\r\n );\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 DoubleSide,\r\n Intersection,\r\n Material,\r\n Mesh,\r\n Object3D,\r\n WebGLRenderer,\r\n} 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 * 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 // --- 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(\"[GLTFParserPlugin] Cannot derive structure.json URL: tiles not initialized\");\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(`[GLTFParserPlugin] Failed to fetch structure.json: ${response.status}`);\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(\r\n oids: number[],\r\n ): 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 // 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 this.collectors.delete(collector);\r\n this.collectorCache.delete(collector.getOid());\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 */\r\n queryFeatureFromIntersection(hit: Intersection): FeatureInfo {\r\n return queryFeatureFromIntersection(hit);\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 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 this._loader = null;\r\n this.tiles = null;\r\n }\r\n}\r\n"],"names":["GLTFWorkerClass","target","bufferCons","_uv","_dstPixel"],"mappings":";AAGO,MAAM,kBAAkB;AAAA,EAC7B;AAAA,EACA;AAAA,EAEA,YAAY,MAAY,QAA0B;AAChD,SAAK,OAAO;AACZ,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,IAAI,QAAQ;AACV,UAAM,QAAQ,KAAK,KAAK,SAAS;AAEjC,QAAI,CAAC,OAAO;AACV,aAAO,IAAI,MAAM,KAAK,OAAO,mBAAmB,EAAE,KAAK,EAAE;AAAA,IAC3D;AAEA,UAAM,SAAS,IAAI,MAAM,KAAK,OAAO,kBAAA,CAAmB,EAAE,KAAK,EAAE;AACjE,aAAS,IAAI,GAAG,IAAI,KAAK,OAAO,KAAK,QAAQ,KAAK;AAChD,YAAM,MAAM,KAAK,OAAO,KAAK,CAAC;AAC9B,YAAM,YAAY,MAAM,GAAG;AAC3B,aAAO,CAAC,IAAI,cAAc,SAAY,YAAY;AAAA,IACpD;AAEA,WAAO;AAAA,EACT;AACF;AC1BA,MAAM,gBAAgB;AAMtB,SAAS,uBAAuB,OAAuB;AACrD,QAAM,SAAS,CAAC,eAAyB;AACvC,UAAM,EAAE,cAAc,mBAAA,IAAuB,WAAW;AAExD,QAAI,gBAAgB,oBAAoB;AACtC,YAAM,EAAE,UAAU,WAAA,IAAe;AACjC,YAAM,kBAAkB,WAAW,aAAa;AAChD,YAAM,mBAAmB,SAAS;AAAA,QAChC,eAAe,gBAAgB,SAAS;AAAA,MAAA;AAG1C,YAAM,0CAA0B,IAAA;AAChC,YAAM,oBAA4C,CAAA;AAElD,eACM,cAAc,GAClB,cAAc,iBAAiB,OAC/B,eACA;AACA,cAAM,mBAAmB,iBAAiB,KAAK,WAAW;AAE1D,YAAI,oBAAoB,IAAI,gBAAgB,GAAG;AAC7C;AAAA,QACF;AAEA,cAAM,cAAc,mBAAmB;AAAA,UACrC,gBAAgB;AAAA,UAChB;AAAA,QAAA;AAGF,0BAAkB,YAAY,IAAI,IAAI;AACtC,4BAAoB,IAAI,gBAAgB;AAAA,MAC1C;AAEA,0BAAoB,MAAA;AACpB,iBAAW,SAAS,QAAQ;AAAA,IAC9B;AAAA,EACF,CAAC;AACH;AC3BO,SAAS,6BAA6B,KAAgC;AAC3E,QAAM,SAAsB;AAAA,IAC1B,SAAS;AAAA,EAAA;AAGX,MAAI;AACF,QAAI,CAAC,OAAO,CAAC,IAAI,QAAQ;AACvB,aAAO,QAAQ;AACf,aAAO;AAAA,IACT;AAEA,UAAM,EAAE,QAAQ,MAAM,OAAO,cAAc;AAC3C,UAAM,EAAE,cAAc,mBAAA,IAAuB,OAAO;AAEpD,QAAI,EAAE,kBAAkB,OAAO;AAC7B,aAAO,QAAQ;AACf,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,gBAAgB,CAAC,oBAAoB;AACxC,aAAO,QAAQ;AACf,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,IAAI,QAAA;AACtB,QAAI,QAAQ,OAAO;AACjB,YAAM,WAAW,IAAI,SAAA;AACrB,eAAS;AAAA,QACP,OAAO,SAAS,WAAW;AAAA,QAC3B,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,MAAA;AAEP,eAAS,EAAE,aAAa,OAAO,WAAW;AAC1C,eAAS,EAAE,aAAa,OAAO,WAAW;AAC1C,eAAS,EAAE,aAAa,OAAO,WAAW;AAC1C,eAAS,aAAa,OAAO,SAAS;AAAA,IACxC,OAAO;AACL,gBAAU,IAAI,GAAG,GAAG,CAAC;AAAA,IACvB;AAEA,UAAM,WAAW,aAAa,YAAY,WAAW,SAAS;AAC9D,QAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACtC,aAAO,QAAQ;AACf,aAAO;AAAA,IACT;AAEA,WAAO,WAAW;AAElB,UAAM,EAAE,eAAe;AACvB,QAAI,CAAC,cAAc,WAAW,WAAW,GAAG;AAC1C,aAAO,QAAQ;AACf,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,WAAW,CAAC;AAC9B,UAAM,MAAM,SAAS,CAAC;AACtB,WAAO,YAAY;AAEnB,UAAM,eAAe,mBAAmB;AAAA,MACtC,UAAU;AAAA,MACV;AAAA,IAAA;AAGF,WAAO,eAAe;AAEtB,QAAI,gBAAgB,aAAa,SAAS,QAAW;AACnD,aAAO,MAAM,aAAa;AAC1B,aAAO,UAAU;AAAA,IACnB,OAAO;AACL,aAAO,QAAQ;AAAA,IACjB;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,QAAQ,yBACb,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AACA,WAAO;AAAA,EACT;AACF;AC5FA,SAAS,uBACP,eAC0B;AAC1B,QAAM,mCAAmB,IAAA;AAEzB,WAAS,IAAI,GAAG,IAAI,cAAc,OAAO,KAAK;AAC5C,UAAM,YAAY,cAAc,KAAK,CAAC;AAEtC,QAAI,CAAC,aAAa,IAAI,SAAS,GAAG;AAChC,mBAAa,IAAI,WAAW,oBAAI,IAAA,CAAa;AAAA,IAC/C;AACA,iBAAa,IAAI,SAAS,EAAG,IAAI,CAAC;AAAA,EACpC;AAEA,SAAO;AACT;AAKA,SAAS,2BACP,kBACA,cACA,iBACuB;AACvB,QAAM,cAAc,IAAI,eAAA;AAExB,QAAM,sBAAsB,aAAa,IAAI,eAAe;AAE5D,MAAI,CAAC,uBAAuB,oBAAoB,SAAS,GAAG;AAC1D,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,iBAAiB;AACpC,aAAW,iBAAiB,YAAY;AACtC,gBAAY,aAAa,eAAe,WAAW,aAAa,CAAC;AAAA,EACnE;AAEA,MAAI,iBAAiB,OAAO;AAC1B,UAAM,gBAAgB,iBAAiB,MAAM;AAC7C,UAAM,aAAuB,CAAA;AAE7B,aAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK,GAAG;AAChD,YAAM,IAAI,cAAc,CAAC;AACzB,YAAM,IAAI,cAAc,IAAI,CAAC;AAC7B,YAAM,IAAI,cAAc,IAAI,CAAC;AAE7B,UACE,oBAAoB,IAAI,CAAC,KACzB,oBAAoB,IAAI,CAAC,KACzB,oBAAoB,IAAI,CAAC,GACzB;AACA,mBAAW,KAAK,GAAG,GAAG,CAAC;AAAA,MACzB;AAAA,IACF;AAEA,QAAI,WAAW,SAAS,GAAG;AACzB,kBAAY,SAAS,UAAU;AAAA,IACjC;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,eAAe,cAAoB,KAAqB;AAC/D,QAAM,EAAE,cAAc,mBAAA,IAAuB,aAAa;AAC1D,QAAM,EAAE,UAAU,WAAA,IAAe;AAEjC,QAAM,YAAY,WAAW,CAAC;AAC9B,QAAM,gBAAgB,SAAS;AAAA,IAC7B,eAAe,UAAU,SAAS;AAAA,EAAA;AAGpC,MAAI,CAAC,eAAe;AAClB,YAAQ,KAAK,+BAA+B;AAC5C,WAAO,CAAA;AAAA,EACT;AAEA,QAAM,eAAe,uBAAuB,aAAa;AAEzD,QAAM,qBAA6B,CAAA;AAEnC,aAAW,CAAC,GAAG,KAAK,cAAc;AAChC,QAAI;AACF,UAAI,OAAO;AACX,UAAI,eAAe;AAEnB,UAAI,oBAAoB;AACtB,YAAI;AACF,yBAAe,mBAAmB;AAAA,YAChC,UAAU;AAAA,YACV;AAAA,UAAA;AAEF,iBAAQ,cAAsB;AAE9B,cAAI,SAAS,KAAK;AAChB,kBAAM,cAAc;AAAA,cAClB;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAGF,gBAAI,eAAe,YAAY,WAAW,SAAS,QAAQ,GAAG;AAC5D,oBAAM,cAAe,aAAa,SAAiB,MAAA;AAEnD,oBAAM,UAAU,IAAI,KAAK,aAAa,WAAW;AACjD,sBAAQ,SAAS,aAAa;AAC9B,sBAAQ,SAAS,KAAK,aAAa,QAAQ;AAC3C,sBAAQ,SAAS,KAAK,aAAa,QAAQ;AAC3C,sBAAQ,MAAM,KAAK,aAAa,KAAK;AACrC,sBAAQ,YAAY,KAAK,aAAa,WAAW;AAEjD,sBAAQ,WAAW;AAAA,gBACjB,GAAG,aAAa;AAAA,gBAChB,WAAW;AAAA,gBACX;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,SAAS;AAAA,cAAA;AAGX,sBAAQ,OAAO,WAAW,GAAG,IAAI,OAAO,EAAE;AAC1C,iCAAmB,KAAK,OAAO;AAAA,YACjC;AAAA,UACF;AAAA,QACF,SAAS,GAAG;AACV,kBAAQ,KAAK,2CAA2C,GAAG,KAAK,CAAC;AAAA,QACnE;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,KAAK,mCAAmC,GAAG,KAAK,KAAK;AAAA,IAC/D;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,mBAAmB,OAAsB,KAAqB;AAC5E,QAAM,aAAqB,CAAA;AAE3B,QAAM,MAAM,SAAS,CAAC,UAAoB;AACxC,UAAM,OAAO;AAEb,QACE,KAAK,SAAS,gBACd,KAAK,SAAS,sBACd,CAAC,KAAK,SAAS,SACf;AACA,UAAI,qBAAqB,MAAM,GAAG,GAAG;AACnC,mBAAW,KAAK,IAAI;AAAA,MACtB;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,SAAS,qBAAqB,MAAY,KAAsB;AAC9D,QAAM,QAAQ,KAAK,SAAS;AAE5B,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,GAAG,MAAM;AACxB;AAKO,SAAS,uBAAuB,UAAgB,KAAqB;AAC1E,MAAI,SAAiB,CAAA;AAErB,MAAI;AACF,UAAM,cAAc,eAAe,UAAU,GAAG;AAChD,aAAS,CAAC,GAAG,QAAQ,GAAG,WAAW;AAAA,EACrC,SAAS,OAAO;AACd,YAAQ,KAAK,aAAa,KAAK;AAAA,EACjC;AAEA,SAAO;AACT;AC7KO,MAAM,sBAAsB,gBAAuC;AAAA,EAChE;AAAA,EACA;AAAA,EACA,UAAkB,CAAA;AAAA,EAClB,YAAqB;AAAA,EAE7B,YAAY,KAAa,QAAwB;AAC/C,UAAA;AACA,SAAK,MAAM;AACX,SAAK,SAAS;AAEd,WAAO,mBAAmB,IAAI;AAE9B,SAAK,cAAA;AAAA,EACP;AAAA,EAEA,IAAI,SAAiB;AACnB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,gBAAsB;AACpB,QAAI,KAAK,UAAW;AAEpB,UAAM,YAAY,KAAK,OAAO,wBAAwB,KAAK,GAAG;AAE9D,UAAM,aACJ,UAAU,WAAW,KAAK,QAAQ,UAClC,UAAU,KAAK,CAAC,MAAY,MAAc,SAAS,KAAK,QAAQ,CAAC,CAAC;AAEpE,QAAI,YAAY;AACd,WAAK,UAAU;AACf,WAAK,cAAc,EAAE,MAAM,eAAe,QAAQ,KAAK,SAAS;AAAA,IAClE;AAAA,EACF;AAAA,EAEA,SAAiB;AACf,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,UAAgB;AACd,QAAI,KAAK,UAAW;AACpB,SAAK,YAAY;AACjB,SAAK,OAAO,qBAAqB,IAAI;AACrC,SAAK,UAAU,CAAA;AAAA,EACjB;AACF;ACjDO,SAAS,cAAc,MAA0C;AACtE,QAAM,iCAAiB,IAAA;AACvB,QAAM,eAAmC,CAAA;AAEzC,MAAI,CAAC,KAAK,UAAU;AAClB,WAAO,EAAE,YAAY,aAAA;AAAA,EACvB;AAEA,aAAW,CAAC,OAAO,WAAW,KAAK,KAAK,SAAS,WAAW;AAC1D,QAAI,YAAY,SAAS,YAAY,MAAM,OAAO;AAChD,YAAM,YAAY,YAAY;AAC9B,YAAM,MAAM,IAAI;AAAA,QACd,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV;AAAA,QACA;AAAA,MAAA;AAEF,UAAI,QAAQ;AACZ,UAAI,aAAa;AACjB,UAAI,cAAc;AAClB,iBAAW,IAAI,OAAO,GAAG;AACzB,mBAAa,KAAK,IAAI;AACtB;AAAA,IACF;AAGA,UAAM,UAAU,IAAI,QAAA;AACpB,YAAQ,QAAQ;AAChB,eAAW,IAAI,OAAO,OAAO;AAC7B,iBAAa,KAAK,IAAI;AAAA,EACxB;AAEA,SAAO,EAAE,YAAY,aAAA;AACvB;ACvCO,SAAS,eACd,MACA,YACA,uBACuB;AACvB,QAAM,kCAAkB,IAAA;AAExB,MAAI,CAAC,KAAK,WAAW;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,yBAAyB;AAEjD,aAAW,CAAC,OAAO,OAAO,KAAK,KAAK,UAAU,WAAW;AACvD,UAAM,WAAW,gBAAgB,SAAS,UAAU;AAEpD,gBAAY,IAAI,OAAO,QAAQ;AAAA,EACjC;AAEA,SAAO;AACT;AAEA,SAAS,uBACP,SACA,YACU;AACV,QAAM,WAAW,IAAI,qBAAA;AAGrB,MAAI,QAAQ,sBAAsB;AAChC,UAAM,MAAM,QAAQ;AAGpB,QAAI,IAAI,iBAAiB;AACvB,eAAS,MAAM;AAAA,QACb,IAAI,gBAAgB,CAAC;AAAA,QACrB,IAAI,gBAAgB,CAAC;AAAA,QACrB,IAAI,gBAAgB,CAAC;AAAA,MAAA;AAEvB,UAAI,IAAI,gBAAgB,CAAC,MAAM,QAAW;AACxC,iBAAS,UAAU,IAAI,gBAAgB,CAAC;AACxC,YAAI,SAAS,UAAU,EAAG,UAAS,cAAc;AAAA,MACnD;AAAA,IACF;AAGA,QAAI,IAAI,oBAAoB,IAAI,iBAAiB,UAAU,QAAW;AACpE,YAAM,MAAM,WAAW,IAAI,IAAI,iBAAiB,KAAK;AACrD,UAAI,KAAK;AACP,iBAAS,MAAM;AAAA,MACjB;AAAA,IACF;AAGA,aAAS,YACP,IAAI,mBAAmB,SAAY,IAAI,iBAAiB;AAC1D,aAAS,YACP,IAAI,oBAAoB,SAAY,IAAI,kBAAkB;AAG5D,QACE,IAAI,4BACJ,IAAI,yBAAyB,UAAU,QACvC;AACA,YAAM,MAAM,WAAW,IAAI,IAAI,yBAAyB,KAAK;AAC7D,UAAI,KAAK;AACP,iBAAS,eAAe,SAAS,eAAe;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAGA,MAAI,QAAQ,iBAAiB,QAAQ,cAAc,UAAU,QAAW;AACtE,UAAM,MAAM,WAAW,IAAI,QAAQ,cAAc,KAAK;AACtD,QAAI,KAAK;AACP,eAAS,YAAY;AACrB,UAAI,QAAQ,cAAc,UAAU,QAAW;AAC7C,iBAAS,YAAY;AAAA,UACnB,QAAQ,cAAc;AAAA,UACtB,QAAQ,cAAc;AAAA,QAAA;AAAA,MAE1B;AAAA,IACF;AAAA,EACF;AAGA,MACE,QAAQ,oBACR,QAAQ,iBAAiB,UAAU,QACnC;AACA,UAAM,MAAM,WAAW,IAAI,QAAQ,iBAAiB,KAAK;AACzD,QAAI,KAAK;AACP,eAAS,QAAQ;AAAA,IACnB;AAAA,EACF;AAGA,MAAI,QAAQ,mBAAmB,QAAQ,gBAAgB,UAAU,QAAW;AAC1E,UAAM,MAAM,WAAW,IAAI,QAAQ,gBAAgB,KAAK;AACxD,QAAI,KAAK;AACP,eAAS,cAAc;AAAA,IACzB;AAAA,EACF;AACA,MAAI,QAAQ,gBAAgB;AAC1B,aAAS,SAAS;AAAA,MAChB,QAAQ,eAAe,CAAC;AAAA,MACxB,QAAQ,eAAe,CAAC;AAAA,MACxB,QAAQ,eAAe,CAAC;AAAA,IAAA;AAAA,EAE5B;AAGA,WAAS,OAAO,QAAQ,cAAc,aAAa;AAGnD,MAAI,QAAQ,cAAc,SAAS;AACjC,aAAS,cAAc;AAAA,EACzB,WAAW,QAAQ,cAAc,QAAQ;AACvC,aAAS,YACP,QAAQ,gBAAgB,SAAY,QAAQ,cAAc;AAAA,EAC9D;AAEA,SAAO;AACT;AC1HO,SAAS,oBACd,MACA,aACA,iBAC8B;AAC9B,QAAM,8BAAc,IAAA;AAEpB,MAAI,CAAC,KAAK,QAAQ;AAChB,WAAO;AAAA,EACT;AAEA,aAAW,aAAa,KAAK,QAAQ;AACnC,UAAM,WAAW,KAAK,OAAO,SAAS;AACtC,UAAM,oBAAqC,CAAA;AAC3C,UAAM,aAAa,SAAS;AAE5B,aACM,iBAAiB,GACrB,iBAAiB,WAAW,QAC5B,kBACA;AACA,YAAM,YAAY,WAAW,cAAc;AAC3C,YAAM,WAAW,IAAI,eAAA;AAGrB,UAAI,UAAU,YAAY;AAExB,cAAM,UAAU,UAAU,WAAW;AACrC,YAAI,WAAW,QAAQ,OAAO;AAC5B,mBAAS;AAAA,YACP;AAAA,YACA,IAAI,gBAAgB,QAAQ,OAAO,QAAQ,YAAY,CAAC;AAAA,UAAA;AAAA,QAE5D;AAGA,cAAM,aAAa,UAAU,WAAW;AACxC,YAAI,cAAc,WAAW,OAAO;AAClC,mBAAS;AAAA,YACP;AAAA,YACA,IAAI,gBAAgB,WAAW,OAAO,WAAW,YAAY,CAAC;AAAA,UAAA;AAAA,QAElE;AAGA,cAAM,SAAS,UAAU,WAAW;AACpC,YAAI,UAAU,OAAO,OAAO;AAC1B,mBAAS;AAAA,YACP;AAAA,YACA,IAAI,gBAAgB,OAAO,OAAO,OAAO,YAAY,CAAC;AAAA,UAAA;AAAA,QAE1D;AAGA,cAAM,YAAY,UAAU,WAAW;AACvC,YAAI,aAAa,UAAU,OAAO;AAChC,mBAAS;AAAA,YACP;AAAA,YACA,IAAI,gBAAgB,UAAU,OAAO,UAAU,YAAY,CAAC;AAAA,UAAA;AAAA,QAEhE;AAGA,cAAM,cAAc,UAAU,WAAW;AACzC,YAAI,eAAe,YAAY,OAAO;AACpC,mBAAS;AAAA,YACP;AAAA,YACA,IAAI,gBAAgB,YAAY,OAAO,YAAY,YAAY,CAAC;AAAA,UAAA;AAAA,QAEpE;AAGA,mBAAW,YAAY,UAAU,YAAY;AAC3C,cAAI,SAAS,WAAW,cAAc,GAAG;AACvC,kBAAM,gBAAgB,UAAU,WAAW,QAAQ;AACnD,gBAAI,iBAAiB,cAAc,OAAO;AACxC,oBAAM,iBAAiB,SACpB,YAAA,EACA,QAAQ,gBAAgB,cAAc;AACzC,uBAAS;AAAA,gBACP;AAAA,gBACA,IAAI;AAAA,kBACF,cAAc;AAAA,kBACd,cAAc,YAAY;AAAA,gBAAA;AAAA,cAC5B;AAAA,YAEJ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,YAAM,YAAY,UAAU;AAC5B,UAAI,aAAa,UAAU,OAAO;AAChC,iBAAS,SAAS,IAAI,gBAAgB,UAAU,OAAO,CAAC,CAAC;AAAA,MAC3D;AAGA,YAAM,WACJ,UAAU,aAAa,SACnB,YAAY,IAAI,UAAU,QAAQ,KAAK,kBACvC;AAEN,UAAI,CAAC,SAAS,aAAa,QAAQ,KAAK,oBAAoB,sBAAsB;AAChF,iBAAS,cAAc;AAAA,MACzB;AAEA,wBAAkB,KAAK;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY,UAAU;AAAA,MAAA,CACvB;AAAA,IACH;AAEA,YAAQ,IAAI,OAAO,SAAS,GAAG,iBAAiB;AAAA,EAClD;AAEA,SAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;AChIA,IAAI,aAAuB,CAAA;AAC3B,IAAI,aAAa;AACjB,IAAI,qBAAqB;AAIzB,MAAM,kCAAkB,IAAA;AAcxB,SAAS,mBAAmB,QAAsB;AAChD,SAAO,iBAAiB,WAAW,CAAC,UAAwB;AAC1D,UAAM,EAAE,MAAM,iBAAiB,IAAA,IAAQ,MAAM;AAC7C,QAAI,SAAS,cAAe;AAE5B,QAAI,UAAU,YAAY,IAAI,GAAG;AACjC,QAAI,CAAC,SAAS;AACZ,gBAAU,MAAM,GAAG,EAChB,KAAK,CAAC,QAAQ;AACb,YAAI,CAAC,IAAI,IAAI;AACX,gBAAM,IAAI;AAAA,YACR,2BAA2B,IAAI,MAAM,IAAI,IAAI,UAAU;AAAA,UAAA;AAAA,QAE3D;AACA,eAAO,IAAI,KAAA;AAAA,MACb,CAAC,EACA,MAAM,CAAC,QAAQ;AAEd,oBAAY,OAAO,GAAG;AACtB,cAAM;AAAA,MACR,CAAC;AACH,kBAAY,IAAI,KAAK,OAAO;AAAA,IAC9B;AAEA,YACG,KAAK,CAAC,SAAS;AACd,aAAO,YAAY,EAAE,MAAM,kBAAkB,iBAAiB,MAAM;AAAA,IACtE,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,aAAO,YAAY;AAAA,QACjB,MAAM;AAAA,QACN;AAAA,QACA,OAAO,IAAI,WAAW,OAAO,GAAG;AAAA,MAAA,CACjC;AAAA,IACH,CAAC;AAAA,EACL,CAAC;AACH;AAKO,SAAS,cAAc,OAAqB;AACjD,eAAa,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,UAAU,uBAAuB,CAAC,CAAC;AAC9E;AAKA,SAAS,eAAuB;AAC9B,QAAM,SAAS,IAAIA,cAAA;AACnB,qBAAmB,MAAM;AACzB,SAAO;AACT;AAKA,SAAS,iBAAiB;AACxB,MAAI,WAAW,WAAW,GAAG;AAE3B,aAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACnC,iBAAW,KAAK,cAAc;AAAA,IAChC;AAAA,EACF;AACF;AAEO,SAAS,aAAuB;AACrC,iBAAA;AACA,SAAO;AACT;AAKO,SAAS,gBAAgB;AAC9B,iBAAA;AAEA,QAAM,SAAS,WAAW,kBAAkB;AAC5C,wBAAsB,qBAAqB,KAAK,WAAW;AAC3D,SAAO;AACT;AC9FO,SAAS,SAAU,QAAQ,KAAK,KAAM;AAE5C,SAAO,UAAU,OAAO,SAAS,OAAQ,GAAG,IAAK;AAElD;AAGO,SAAS,cAAe,MAAO;AAErC,SAAO,SAAS,aAAa,SAAS,YAAY,SAAS;AAE5D;AAGO,SAAS,qBAAsB,MAAO;AAE5C,SAAO,SAAS,KAAM,IAAI;AAE3B;AAGO,SAAS,aAAc,MAAO;AAEpC,SAAO,OAAO,KAAM,IAAI;AAEzB;AAGO,SAAS,aAAc,MAAO;AAEpC,SAAO,OAAO,KAAM,IAAI;AAEzB;AAGO,SAAS,yBAA0B,QAAQ,QAAQ,MAAM,SAAS,MAAO;AAE/E,MAAK,aAAc,OAAS;AAE3B,WAAO,OAAO,UAAW,QAAQ,MAAM;AAAA,EAExC,WAAY,aAAc,OAAS;AAElC,WAAO,OAAO,UAAW,QAAQ,MAAM;AAAA,EAExC,OAAO;AAEN,WAAO,OAAQ,MAAM;AAAA,EAEtB;AAED;AAGO,SAAS,gBAAiB,UAAW;AAE3C,QAAM,EAAE,MAAM,cAAa,IAAK;AAChC,UAAS,MAAI;AAAA,IAEZ,KAAK;AAAU,aAAO,kBAAkB,UAAU,KAAK;AAAA,IACvD,KAAK;AAAQ,aAAO,IAAI,QAAO;AAAA,IAC/B,KAAK;AAAQ,aAAO,IAAI,QAAO;AAAA,IAC/B,KAAK;AAAQ,aAAO,IAAI,QAAO;AAAA,IAC/B,KAAK;AAAQ,aAAO,IAAI,QAAO;AAAA,IAC/B,KAAK;AAAQ,aAAO,IAAI,QAAO;AAAA,IAC/B,KAAK;AAAQ,aAAO,IAAI,QAAO;AAAA,IAC/B,KAAK;AAAW,aAAO;AAAA,IACvB,KAAK;AAAU,aAAO;AAAA;AAAA;AAAA,IAItB,KAAK;AAAQ,aAAO;AAAA,EAEtB;AAEA;AAGO,SAAS,eAAgB,MAAM,OAAQ;AAE7C,MAAK,UAAU,QAAQ,UAAU,QAAY;AAE5C,WAAO;AAAA,EAER;AAEA,UAAS,MAAI;AAAA,IAEZ,KAAK;AAAU,aAAO,OAAO,UAAU,YAAY,OAAO,UAAU;AAAA,IACpE,KAAK;AAAQ,aAAO,MAAM;AAAA,IAC1B,KAAK;AAAQ,aAAO,MAAM;AAAA,IAC1B,KAAK;AAAQ,aAAO,MAAM;AAAA,IAC1B,KAAK;AAAQ,aAAO,MAAM;AAAA,IAC1B,KAAK;AAAQ,aAAO,MAAM;AAAA,IAC1B,KAAK;AAAQ,aAAO,MAAM;AAAA,IAC1B,KAAK;AAAW,aAAO,OAAO,UAAU;AAAA,IACxC,KAAK;AAAU,aAAO,OAAO,UAAU;AAAA,IACvC,KAAK;AAAQ,aAAO,OAAO,UAAU,YAAY,OAAO,UAAU;AAAA,EAEpE;AAEC,QAAM,IAAI,MAAO,8BAA8B;AAEhD;AAGO,SAAS,qCAAsC,eAAe,OAAO,MAAO;AAElF,UAAS,eAAa;AAAA,IAErB,KAAK;AAAQ,aAAO;AAAA,IACpB,KAAK;AAAS,aAAO;AAAA,IACrB,KAAK;AAAS,aAAO;AAAA,IACrB,KAAK;AAAS,aAAO;AAAA,IAErB,KAAK;AAAS,aAAO;AAAA,IACrB,KAAK;AAAU,aAAO;AAAA,IACtB,KAAK;AAAU,aAAO;AAAA,IACtB,KAAK;AAAU,aAAO;AAAA,IAEtB,KAAK;AAAW,aAAO;AAAA,IACvB,KAAK;AAAW,aAAO;AAAA,EAEzB;AAEC,UAAS,MAAI;AAAA,IAEZ,KAAK;AAAW,aAAO;AAAA,IACvB,KAAK;AAAU,aAAO;AAAA,EAExB;AAEC,QAAM,IAAI,MAAO,8BAA8B;AAEhD;AAGO,SAAS,eAAgB,UAAU,SAAS,MAAO;AAEzD,QAAM,QAAQ,SAAS;AACvB,MAAK,OAAQ;AAEZ,aAAS,UAAU,MAAM,QAAS,MAAM,IAAK,SAAS,CAAA;AACtD,WAAO,SAAS,SAAS;AACzB,aAAU,IAAI,GAAG,IAAI,OAAO,QAAQ,IAAI,GAAG,KAAO;AAEjD,aAAQ,CAAC,IAAK,sBAAuB,UAAU,OAAQ,EAAG;AAAA,IAE3D;AAAA,EAED,OAAO;AAEN,aAAS,sBAAuB,UAAU,MAAM;AAAA,EAEjD;AAEA,SAAO;AAER;AAGO,SAAS,sBAAuB,UAAU,SAAS,MAAO;AAEhE,QAAM,eAAe,SAAS;AAC9B,QAAM,OAAO,SAAS;AAEtB,WAAS,UAAU,gBAAiB,QAAQ;AAE5C,MAAK,iBAAiB,MAAO;AAE5B,YAAS,MAAI;AAAA,MAEZ,KAAK;AAAU,eAAO;AAAA,MACtB,KAAK;AAAQ,eAAO,OAAO,IAAK,GAAG,CAAC;AAAA,MACpC,KAAK;AAAQ,eAAO,OAAO,IAAK,GAAG,GAAG,CAAC;AAAA,MACvC,KAAK;AAAQ,eAAO,OAAO,IAAK,GAAG,GAAG,GAAG,CAAC;AAAA,MAC1C,KAAK;AAAQ,eAAO,OAAO,SAAQ;AAAA,MACnC,KAAK;AAAQ,eAAO,OAAO,SAAQ;AAAA,MACnC,KAAK;AAAQ,eAAO,OAAO,SAAQ;AAAA,MACnC,KAAK;AAAW,eAAO;AAAA,MACvB,KAAK;AAAU,eAAO;AAAA,MACtB,KAAK;AAAQ,eAAO;AAAA,IAEvB;AAEE,UAAM,IAAI,MAAO,8BAA8B;AAAA,EAEhD,OAAO;AAEN,QAAK,aAAc,OAAS;AAE3B,aAAO,UAAW,YAAY;AAAA,IAE/B,WAAY,aAAc,OAAS;AAElC,aAAO,UAAW,YAAY;AAAA,IAE/B,OAAO;AAEN,aAAO;AAAA,IAER;AAAA,EAED;AAED;AAIO,SAAS,cAAe,UAAU,QAAS;AAEjD,MAAK,SAAS,WAAW,MAAO;AAE/B,WAAO;AAAA,EAER;AAEA,QAAM,SAAS,SAAS;AACxB,QAAM,OAAO,SAAS;AACtB,MAAK,MAAM,QAAS,SAAW;AAE9B,aAAU,IAAI,GAAG,IAAI,OAAO,QAAQ,IAAI,GAAG,KAAO;AAEjD,aAAQ,CAAC,IAAK,kBAAmB,OAAQ,CAAC,CAAE;AAAA,IAE7C;AAAA,EAED,OAAO;AAEN,aAAS,kBAAmB,MAAM;AAAA,EAEnC;AAEA,SAAO;AAGP,WAAS,kBAAmBC,SAAS;AAEpC,QAAK,cAAeA,UAAW;AAE9B,MAAAA,UAAS,sBAAuB,UAAUA,OAAM;AAAA,IAEjD;AAEA,WAAOA;AAAA,EAER;AAGA,WAAS,cAAe,OAAQ;AAE/B,QAAK,aAAc,OAAS;AAE3B,YAAM,WAAW,MAAM;AACvB,eAAU,IAAI,GAAG,IAAI,OAAO,QAAQ,IAAI,GAAG,KAAO;AAEjD,YAAK,OAAQ,CAAC,MAAO,SAAU,CAAC,GAAK;AAEpC,iBAAO;AAAA,QAER;AAAA,MAED;AAEA,aAAO;AAAA,IAER,WAAY,aAAc,OAAS;AAElC,eAAU,IAAI,GAAG,IAAI,OAAO,QAAQ,IAAI,GAAG,KAAO;AAEjD,YAAK,OAAQ,CAAC,MAAO,MAAM,aAAc,CAAC,GAAK;AAE9C,iBAAO;AAAA,QAER;AAAA,MAED;AAEA,aAAO;AAAA,IAER,OAAO;AAEN,aAAO,WAAW;AAAA,IAEnB;AAAA,EAED;AAED;AAEO,SAAS,eAAgB,eAAe,GAAI;AAIlD,UAAS,eAAa;AAAA,IAErB,KAAK;AAAQ,aAAO,KAAK,IAAK,IAAI,KAAO,EAAK;AAAA,IAC9C,KAAK;AAAS,aAAO,KAAK,IAAK,GAAG,OAAS,EAAK;AAAA,IAChD,KAAK;AAAS,aAAO,KAAK,IAAK,IAAI,YAAc,EAAK;AAAA,IACtD,KAAK;AAAS,aAAO,KAAK,IAAK,OAAQ,CAAC,IAAK,oBAAuB;;IAEpE,KAAK;AAAS,aAAO,IAAI;AAAA,IACzB,KAAK;AAAU,aAAO,IAAI;AAAA,IAC1B,KAAK;AAAU,aAAO,IAAI;AAAA,IAC1B,KAAK;AAAU,aAAO,OAAQ,CAAC,IAAK;AAAA,EAEtC;AAEA;AAIO,SAAS,uBAAwB,UAAU,QAAS;AAE1D,QAAM;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAK;AAEJ,MAAK,MAAM,QAAS,SAAW;AAE9B,aAAU,IAAI,GAAG,IAAI,OAAO,QAAQ,IAAI,GAAG,KAAO;AAEjD,aAAQ,CAAC,IAAK,eAAgB,OAAQ,CAAC,CAAE;AAAA,IAE1C;AAAA,EAED,OAAO;AAEN,aAAS,eAAgB,MAAM;AAAA,EAEhC;AAEA,SAAO;AAEP,WAAS,eAAgB,OAAQ;AAEhC,QAAK,aAAc,OAAS;AAE3B,cAAQ,aAAc,KAAK;AAAA,IAE5B,WAAY,aAAc,OAAS;AAElC,cAAQ,aAAc,KAAK;AAAA,IAE5B,OAAO;AAEN,cAAQ,aAAc,KAAK;AAAA,IAE5B;AAEA,WAAO;AAAA,EAER;AAEA,WAAS,aAAc,OAAQ;AAE9B,UAAM,IAAI,aAAc,MAAM,CAAC;AAC/B,UAAM,IAAI,aAAc,MAAM,CAAC;AAC/B,QAAK,OAAO,MAAQ,OAAM,IAAI,aAAc,MAAM,CAAC;AACnD,QAAK,OAAO,MAAQ,OAAM,IAAI,aAAc,MAAM,CAAC;AACnD,WAAO;AAAA,EAER;AAEA,WAAS,aAAc,OAAQ;AAE9B,UAAM,WAAW,MAAM;AACvB,aAAU,IAAI,GAAG,IAAI,SAAS,QAAQ,IAAI,GAAG,KAAO;AAEnD,eAAU,CAAC,IAAK,aAAc,SAAU,CAAC,CAAE;AAAA,IAE5C;AAEA,WAAO;AAAA,EAER;AAEA,WAAS,aAAc,OAAQ;AAE9B,QAAK,YAAa;AAEjB,cAAQ,eAAgB,eAAe,KAAK;AAAA,IAE7C;AAEA,QAAK,cAAc,qBAAsB,gBAAkB;AAE1D,cAAQ,QAAQ,QAAQ;AAAA,IAEzB;AAEA,WAAO;AAAA,EAER;AAED;AAIO,SAAS,uBAAwB,UAAU,QAAQ,gBAAgB,MAAO;AAEhF,MAAK,SAAS,OAAQ;AAErB,QAAK,CAAE,MAAM,QAAS,SAAW;AAEhC,eAAS,IAAI,MAAO,SAAS,SAAS,CAAC;AAAA,IAExC;AAEA,WAAO,SAAS,kBAAkB,OAAO,gBAAgB,SAAS;AAElE,aAAU,IAAI,GAAG,IAAI,OAAO,QAAQ,IAAI,GAAG,KAAO;AAEjD,UAAK,CAAE,eAAgB,SAAS,MAAM,OAAQ,CAAC,IAAO;AAErD,eAAQ,CAAC,IAAK,gBAAiB,QAAQ;AAAA,MAExC;AAAA,IAED;AAAA,EAED,OAAO;AAEN,QAAK,CAAE,eAAgB,SAAS,MAAM,MAAM,GAAK;AAEhD,eAAS,gBAAiB,QAAQ;AAAA,IAEnC;AAAA,EAED;AAEA,SAAO;AAER;AAGO,SAAS,oBAAqB,YAAY,QAAS;AAGzD,aAAY,OAAO,QAAS;AAE3B,QAAK,EAAI,OAAO,aAAe;AAE9B,aAAO,OAAQ,GAAG;AAAA,IAEnB;AAAA,EAED;AAGA,aAAY,OAAO,YAAa;AAE/B,UAAM,OAAO,WAAY,GAAG;AAC5B,WAAQ,GAAG,IAAK,uBAAwB,MAAM,OAAQ,IAAK;AAAA,EAE5D;AAED;AAGO,SAAS,qBAAsB,MAAO;AAE5C,UAAS,MAAI;AAAA,IAEZ,KAAK;AAAQ,aAAO;AAAA,IACpB,KAAK;AAAU,aAAO;AAAA,IACtB,KAAK;AAAQ,aAAO;AAAA,IACpB,KAAK;AAAQ,aAAO;AAAA,IACpB,KAAK;AAAQ,aAAO;AAAA,IACpB,KAAK;AAAQ,aAAO;AAAA,IACpB,KAAK;AAAQ,aAAO;AAAA,IACpB,KAAK;AAAQ,aAAO;AAAA;AAAA,IAGpB,KAAK;AAAW,aAAO;AAAA,IACvB,KAAK;AAAU,aAAO;AAAA,IACtB;AAAS,aAAO;AAAA,EAElB;AAEA;ACpeO,MAAM,cAAc;AAAA,EAE1B,YAAa,OAAO,UAAU,mBAAmB,MAAO;AAGvD,SAAK,OAAO,SAAS,QAAQ;AAC7B,SAAK,cAAc,SAAS,eAAe;AAC3C,SAAK,OAAO,SAAS;AACrB,SAAK,gBAAgB,SAAS,iBAAiB;AAC/C,SAAK,WAAW,SAAS,YAAY;AACrC,SAAK,QAAQ,SAAS,SAAS;AAC/B,SAAK,QAAQ,SAAS,SAAS;AAC/B,SAAK,aAAa,SAAS,cAAc;AACzC,SAAK,SAAS,SAAS,UAAU;AACjC,SAAK,QAAQ,SAAU,UAAU,SAAS,CAAC;AAC3C,SAAK,MAAM,SAAU,UAAU,OAAO,QAAQ;AAC9C,SAAK,MAAM,SAAU,UAAU,OAAO,SAAU;AAChD,SAAK,WAAW,SAAS,YAAY;AACrC,SAAK,SAAS,SAAU,UAAU,UAAU,IAAI;AAChD,SAAK,UAAU,SAAU,UAAU,WAAW,IAAI;AAClD,SAAK,WAAW,SAAU,UAAU,YAAY,IAAI;AACpD,SAAK,UAAU;AACf,SAAK,mBAAmB;AAGxB,QAAK,kBAAmB;AAEvB,WAAK,SAAS,SAAU,kBAAkB,UAAU,KAAK,MAAM;AAC/D,WAAK,QAAQ,SAAU,kBAAkB,SAAS,KAAK,KAAK;AAC5D,WAAK,MAAM,SAAU,kBAAkB,OAAO,KAAK,GAAG;AACtD,WAAK,MAAM,SAAU,kBAAkB,OAAO,KAAK,GAAG;AAAA,IAEvD;AAGA,QAAK,SAAS,SAAS,QAAS;AAE/B,WAAK,UAAU,MAAO,KAAK,QAAQ;AACnC,UAAK,KAAK,kBAAkB,MAAO;AAElC,aAAK,gBAAgB,SAAU,KAAK,SAAS,aAAa,QAAQ;AAAA,MAEnE;AAAA,IAED;AAAA,EAED;AAAA;AAAA;AAAA,EAIA,gBAAiB,QAAQ,gBAAgB,MAAO;AAE/C,WAAO,uBAAwB,MAAM,QAAQ,aAAa;AAAA,EAE3D;AAAA;AAAA;AAAA,EAIA,sBAAuB,QAAS;AAE/B,WAAO,sBAAuB,MAAM,MAAM;AAAA,EAE3C;AAAA;AAAA;AAAA,EAIA,eAAgB,QAAS;AAExB,WAAO,eAAgB,MAAM,MAAM;AAAA,EAEpC;AAAA;AAAA,EAGA,cAAe,QAAS;AAEvB,WAAO,cAAe,MAAM,MAAM;AAAA,EAEnC;AAAA;AAAA,EAGA,sBAAuB,QAAS;AAE/B,UAAM,UAAU,KAAK;AACrB,QAAK,KAAK,SAAS,QAAS;AAE3B,UAAK,MAAM,QAAS,SAAW;AAE9B,iBAAU,IAAI,GAAG,IAAI,OAAO,QAAQ,IAAI,GAAG,KAAO;AAEjD,iBAAQ,CAAC,IAAK,YAAa,OAAQ,CAAC,CAAE;AAAA,QAEvC;AAAA,MAED,OAAO;AAEN,iBAAS,YAAa,MAAM;AAAA,MAE7B;AAAA,IAGD;AAEA,WAAO;AAEP,aAAS,YAAa,OAAQ;AAE7B,YAAM,QAAQ,QAAQ,OAAO,KAAM,OAAK,EAAE,UAAU,KAAK;AACzD,UAAK,UAAU,MAAO;AAIrB,eAAO;AAAA,MAER,OAAO;AAEN,eAAO,MAAM;AAAA,MAEd;AAAA,IAED;AAAA,EAED;AAAA;AAAA,EAGA,uBAAwB,QAAS;AAEhC,QAAK,cAAe,KAAK,OAAS;AAEjC,aAAO,uBAAwB,MAAM,MAAM;AAAA,IAE5C,OAAO;AAEN,aAAO;AAAA,IAER;AAAA,EAED;AAED;AClJO,MAAM,oBAAoB;AAAA,EAEhC,YAAa,YAAY,UAAU,CAAA,GAAI,QAAQ,CAAA,GAAI,OAAO,MAAO;AAEhE,SAAK,aAAa;AAClB,SAAK,QAAQ,QAAS,WAAW,KAAK;AACtC,SAAK,YAAY,WAAW;AAC5B,SAAK,QAAQ;AACb,SAAK,OAAO;AACZ,SAAK,OAAO,UAAU,aAAa,WAAW,OAAO;AAErD,SAAK,aAAa;AAAA,EAEnB;AAAA,EAEA,mBAAmB;AAElB,WAAO,OAAO,KAAM,KAAK,MAAM,UAAU;AAAA,EAE1C;AAAA,EAEA,aAAc,MAAO;AAEpB,WAAO,QAAS,KAAK,WAAW,WAAY,IAAI,CAAE;AAAA,EAEnD;AAAA,EAEA,UAAU;AAAA,EAAC;AAAA,EAEX,gBAAiB,gBAAgB,eAAgB;AAEhD,UAAM,aAAa,CAAA;AACnB,eAAY,OAAO,KAAK,MAAM,YAAa;AAE1C,iBAAY,GAAG,IAAK,IAAI,cAAe,KAAK,OAAO,KAAK,MAAM,WAAY,GAAG,GAAI,KAAK,WAAW,WAAY,IAAK;AAAA,IAEnH;AAEA,SAAK,aAAa;AAAA,EAEnB;AAED;ACxCA,MAAM,uCAAuC,cAAc;AAAA,EAE1D,YAAa,OAAO,eAAe,oBAAoB,MAAO;AAE7D,UAAO,OAAO,eAAe,iBAAiB;AAE9C,SAAK,YAAY,mBAAmB,aAAa;AAAA,EAElD;AAED;AAEO,MAAM,kCAAkC,oBAAoB;AAAA,EAElE,eAAgB,MAAO;AAEtB,UAAO,GAAG,IAAI;AAEd,SAAK,8BAA8B;AACnC,SAAK,gBAAiB,8BAA8B;AAAA,EAErD;AAAA,EAEA,QAAS,IAAI,UAAU,SAAS,CAAA,GAAK;AAEpC,UAAM,aAAa,KAAK;AACxB,wBAAqB,YAAY,MAAM;AAEvC,eAAY,QAAQ,YAAa;AAEhC,aAAQ,QAAS,KAAK,iBAAkB,MAAM,IAAI,UAAU,OAAQ,KAAM;AAAA,IAE3E;AAEA,WAAO;AAAA,EAER;AAAA,EAEA,iBAAkB,MAAM,IAAI,UAAU,SAAS,MAAO;AAGrD,QAAK,MAAM,KAAK,OAAQ;AAEvB,YAAM,IAAI,MAAO,gFAAgF;AAAA,IAElG;AAGA,UAAM,WAAW,KAAK,WAAY,IAAI;AACtC,UAAM,OAAO,SAAS;AACtB,QAAK,CAAE,UAAW;AAEjB,YAAM,IAAI,MAAO,qEAAqE;AAAA,IAEvF,WAAY,CAAE,KAAK,WAAW,WAAY,IAAI,GAAK;AAElD,aAAO,SAAS,eAAgB,MAAM;AAAA,IAEvC;AAGA,aAAS,SAAS,gBAAiB,MAAM;AAGzC,UAAM,YAAY,SAAS,aAAc,SAAS,UAAU,aAAa;AACzE,QAAK,aAAc,OAAS;AAE3B,YAAM,WAAW,OAAO;AACxB,eAAU,IAAI,GAAG,IAAI,SAAS,QAAQ,IAAI,GAAG,IAAI,GAAI;AAEpD,iBAAU,CAAC,IAAK,UAAU,aAAc,IAAI,CAAC;AAAA,MAE9C;AAAA,IAED,WAAY,aAAc,OAAS;AAElC,aAAO,oBAAqB,WAAW,EAAE;AAAA,IAE1C,WAAY,SAAS,YAAY,SAAS,QAAS;AAElD,eAAS,UAAU,KAAM,EAAE;AAAA,IAE5B,OAAO;AAGN,YAAM,IAAI,MAAO,kHAAkH;AAAA,IAEpI;AAGA,aAAS,SAAS,uBAAwB,MAAM;AAGhD,aAAS,SAAS,sBAAuB,MAAM;AAG/C,aAAS,SAAS,cAAe,MAAM;AAEvC,WAAO;AAAA,EAER;AAED;AC/FA,MAAM,mCAAmC,cAAc;AAAA,EAEtD,YAAa,OAAO,eAAe,gBAAgB,MAAO;AAEzD,UAAO,OAAO,eAAe,aAAa;AAE1C,SAAK,SAAS,eAAe,UAAU;AACvC,SAAK,cAAc,qBAAsB,KAAK,IAAI;AAClD,SAAK,eAAe,SAAU,eAAe,gBAAgB,IAAI;AACjE,SAAK,gBAAgB,SAAU,eAAe,iBAAiB,IAAI;AACnE,SAAK,kBAAkB,SAAU,eAAe,mBAAmB,QAAQ;AAC3E,SAAK,mBAAmB,SAAU,eAAe,oBAAoB,QAAQ;AAAA,EAE9E;AAAA;AAAA,EAGA,qBAAsB,SAAS,IAAK;AAEnC,QAAI,QAAQ,KAAK;AACjB,QAAK,KAAK,iBAAiB,MAAO;AAEjC,YAAM,EAAE,cAAc,gBAAe,IAAK;AAC1C,YAAM,aAAa,qCAAsC,eAAe;AACxE,YAAM,MAAM,IAAI,WAAY,QAAS,YAAY,CAAE;AACnD,cAAQ,IAAK,KAAK,CAAC,IAAK,IAAK,EAAE;AAAA,IAEhC;AAEA,WAAO;AAAA,EAER;AAAA;AAAA;AAAA,EAIA,qBAAsB,SAAS,IAAK;AAEnC,QAAI,cAAc;AAClB,QAAK,KAAK,cAAe;AAExB,YAAM,EAAE,cAAc,gBAAe,IAAK;AAC1C,YAAM,aAAa,qCAAsC,eAAe;AACxE,YAAM,MAAM,IAAI,WAAY,QAAS,YAAY,CAAE;AACnD,oBAAc,IAAK,WAAW;AAAA,IAE/B,WAAY,KAAK,OAAQ;AAGxB,qBAAe,KAAK;AAAA,IAErB;AAEA,WAAO;AAAA,EAER;AAED;AAEO,MAAM,8BAA8B,oBAAoB;AAAA,EAE9D,eAAgB,MAAO;AAEtB,UAAO,GAAG,IAAI;AAEd,SAAK,0BAA0B;AAC/B,SAAK,QAAQ,KAAK,WAAW;AAE7B,SAAK,gBAAiB,0BAA0B;AAAA,EAEjD;AAAA,EAEA,QAAS,IAAI,SAAS,IAAK;AAE1B,UAAM,aAAa,KAAK;AACxB,wBAAqB,YAAY,MAAM;AAEvC,eAAY,QAAQ,YAAa;AAEhC,aAAQ,IAAI,IAAK,KAAK,iBAAkB,MAAM,IAAI,OAAQ,KAAM;AAAA,IAEjE;AAEA,WAAO;AAAA,EAER;AAAA;AAAA,EAGA,kBAAmB,MAAM,IAAI,OAAO,SAAS,MAAO;AAEnD,UAAM,WAAW,KAAK,WAAY,IAAI;AACtC,UAAM,EAAE,eAAe,KAAI,IAAK;AAEhC,UAAM,UAAU,KAAK;AACrB,UAAM,aAAa,QAAS,SAAS,MAAM;AAC3C,UAAM,aAAa,qCAAsC,eAAe,IAAI;AAC5E,UAAM,YAAY,IAAI,WAAY,UAAU;AAG5C,UAAM,cAAc,SAAS,qBAAsB,SAAS,EAAE;AAE9D,QAAK,cAAe,SAAU,SAAS,QAAS;AAI/C,aAAO,yBAA0B,YAAa,cAAc,SAAU,SAAS,aAAa,MAAM,MAAM;AAAA,IAEzG,WAAY,SAAS,UAAW;AAI/B,UAAI,cAAc,cAAc;AAChC,UAAI,eAAe;AACnB,UAAK,SAAS,kBAAkB,MAAO;AAGtC,cAAM,EAAE,eAAe,iBAAgB,IAAK;AAC5C,cAAMC,cAAa,qCAAsC,gBAAgB;AACzE,cAAM,qBAAqB,IAAIA,YAAY,QAAS,aAAa,CAAE;AACnE,uBAAe,mBAAoB,cAAc,CAAC,IAAK,mBAAoB,WAAW;AACtF,sBAAc,mBAAoB,WAAW;AAAA,MAE9C;AAEA,YAAM,YAAY,IAAI,WAAY,UAAU,QAAQ,aAAa,YAAY;AAC7E,eAAS,IAAI,cAAc,OAAQ,SAAS;AAAA,IAE7C,WAAY,SAAS,WAAY;AAEhC,YAAM,SAAS,cAAc;AAC7B,YAAM,YAAY,KAAK,MAAO,SAAS,CAAC;AACxC,YAAM,WAAW,SAAS;AAC1B,YAAM,WAAa,UAAW,SAAS,KAAM,WAAa;AAC1D,eAAS,aAAa;AAAA,IAEvB;AAEA,WAAO;AAAA,EAER;AAAA;AAAA,EAGA,iBAAkB,MAAM,IAAI,SAAS,MAAO;AAG3C,QAAK,MAAM,KAAK,OAAQ;AAEvB,YAAM,IAAI,MAAO,2EAA2E;AAAA,IAE7F;AAGA,UAAM,WAAW,KAAK,WAAY,IAAI;AACtC,QAAK,CAAE,UAAW;AAEjB,YAAM,IAAI,MAAO,2DAA2D;AAAA,IAE7E,WAAY,CAAE,KAAK,WAAW,WAAY,IAAI,GAAK;AAElD,aAAO,SAAS,eAAgB,MAAM;AAAA,IAEvC;AAGA,UAAM,QAAQ,SAAS;AACvB,UAAM,UAAU,KAAK;AACrB,UAAM,QAAQ,SAAS,qBAAsB,SAAS,EAAE;AAGxD,aAAS,SAAS,gBAAiB,QAAQ,KAAK;AAGhD,QAAK,OAAQ;AAEZ,eAAU,IAAI,GAAG,IAAI,OAAO,QAAQ,IAAI,GAAG,KAAO;AAEjD,eAAQ,KAAM,KAAK,kBAAmB,MAAM,IAAI,GAAG,OAAQ,EAAG;AAAA,MAE/D;AAAA,IAED,OAAO;AAEN,eAAS,KAAK,kBAAmB,MAAM,IAAI,GAAG,MAAM;AAAA,IAErD;AAGA,aAAS,SAAS,uBAAwB,MAAM;AAGhD,aAAS,SAAS,sBAAuB,MAAM;AAG/C,aAAS,SAAS,cAAe,MAAM;AAEvC,WAAO;AAAA,EAER;AAED;ACvGA,MAAM,UAAU,IAAI,mBAAoB,IAAK,GAAG,GAAG,IAAK,GAAG,CAAC;AAI5D,MAAM,mCAAmC,eAAe;AAAA,EAEvD,cAAc;AAEb,UAAK;AAEL,SAAK,aAAc,YAAY,IAAI,uBAAwB,CAAE,IAAK,GAAG,GAAG,IAAK,IAAK,GAAG,GAAG,IAAK,CAAC,GAAI,EAAG;AACrG,SAAK,aAAc,MAAM,IAAI,uBAAwB,CAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GAAI,CAAC,CAAE;AAAA,EAE/E;AAED;AAEA,MAAM,YAAY,IAAI,2BAA0B;AAehD,MAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOpB,YAAa,UAAW;AAEvB,SAAK,QAAQ,IAAI,KAAM,WAAW,QAAQ;AAAA,EAE3C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AAET,SAAK,MAAM,SAAS,QAAO;AAAA,EAE5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAQ,UAAW;AAElB,aAAS,OAAQ,KAAK,OAAO,OAAO;AAAA,EAErC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,WAAW;AAEd,WAAO,KAAK,MAAM;AAAA,EAEnB;AAAA,EAEA,IAAI,SAAU,OAAQ;AAErB,SAAK,MAAM,WAAW;AAAA,EAEvB;AAED;ACzLA,MAAM,OAAuB,oBAAI,KAAI;AAGrC,MAAM,oBAAoB;AAAA,EAEzB,cAAc;AAEb,SAAK,YAAY,IAAI,cAAa;AAClC,SAAK,UAAU,IAAI,kBAAmB,GAAG,CAAC;AAC1C,SAAK,aAAa,IAAI,kBAAiB;AAGvC,SAAK,QAAQ,IAAI,eAAgB,IAAI,eAAgB;AAAA,MAEpD,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MAEV,UAAU;AAAA,QAET,KAAK,EAAE,OAAO,KAAI;AAAA,QAClB,OAAO,EAAE,OAAO,IAAI,QAAO,EAAE;AAAA,MAEjC;AAAA,MAEG;AAAA;AAAA,QAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQxB;AAAA;AAAA,QAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAW7B,EAAK;AAAA,EAEJ;AAAA;AAAA,EAGA,eAAgB,OAAQ;AAEvB,SAAK,QAAQ,QAAS,KAAK,IAAK,KAAK,QAAQ,OAAO,KAAK,GAAI,CAAC;AAAA,EAE/D;AAAA;AAAA,EAGA,cAAe,QAAS;AAEvB,UAAM,EAAE,WAAW,QAAO,IAAK;AAC/B,WAAO,UAAU,4BAA6B,SAAS,GAAG,GAAG,OAAO,SAAS,GAAG,GAAG,MAAM;AAAA,EAE1F;AAAA;AAAA,EAGA,SAAU,QAAS;AAElB,UAAM,EAAE,WAAW,QAAO,IAAK;AAC/B,cAAU,uBAAwB,SAAS,GAAG,GAAG,OAAO,SAAS,GAAG,GAAG,MAAM;AAAA,EAE9E;AAAA;AAAA;AAAA,EAIA,oBAAqB,SAAS,OAAO,UAAW;AAE/C,UAAM,EAAE,WAAW,QAAO,IAAK;AAG/B,SAAK,IAAI,KAAM,KAAK;AACpB,SAAK,IAAI,KAAM,KAAK;AACpB,SAAK,IAAI,KAAK;AACd,SAAK,IAAI,KAAK;AACd,cAAU,iBAAkB,OAAO;AACnC,cAAU,qBAAsB,SAAS,QAAQ,SAAS,MAAM,UAAU,CAAC;AAAA,EAE5E;AAED;AAIO,MAAM,qBAAqC,oBAAM,MAAM;AAAA,EAE7D,cAAc;AAEb,QAAI,SAAS;AACb,WACE,oBAAqB,oBAAoB,SAAS,EAClD,QAAS,SAAO;AAEhB,UAAK,QAAQ,eAAgB;AAE5B,aAAM,GAAG,IAAK,IAAK,SAAU;AAE5B,mBAAS,UAAU,IAAI,oBAAmB;AAC1C,iBAAO,OAAQ,KAAO,GAAG,IAAI;AAAA,QAE9B;AAAA,MAED;AAAA,IAED,CAAC;AAAA,EAEH;AAED,EAAC;ACpHD,MAAM,OAAuB,oBAAI,QAAO;AACxC,MAAM,OAAuB,oBAAI,QAAO;AACxC,MAAM,OAAuB,oBAAI,QAAO;AAGjC,SAAS,yBAA0B,UAAU,OAAQ;AAE3D,MAAK,UAAU,GAAI;AAElB,WAAO,SAAS,aAAc,IAAI;AAAA,EAEnC,OAAO;AAEN,WAAO,SAAS,aAAc,KAAM,KAAK,EAAG;AAAA,EAE7C;AAED;AAGO,SAAS,yBAA0B,UAAU,WAAW,SAAS,IAAI,MAAO,IAAM;AAGxF,MAAI,KAAK,IAAI;AACb,MAAI,KAAK,IAAI,YAAY;AACzB,MAAI,KAAK,IAAI,YAAY;AACzB,MAAK,SAAS,OAAQ;AAErB,SAAK,SAAS,MAAM,KAAM,EAAE;AAC5B,SAAK,SAAS,MAAM,KAAM,EAAE;AAC5B,SAAK,SAAS,MAAM,KAAM,EAAE;AAAA,EAE7B;AAEA,SAAQ,CAAC,IAAK;AACd,SAAQ,CAAC,IAAK;AACd,SAAQ,CAAC,IAAK;AACd,SAAO;AAER;AAIO,SAAS,YAAa,UAAU,UAAU,WAAW,SAAS,QAAS;AAE7E,QAAM,CAAE,IAAI,IAAI,EAAE,IAAK;AACvB,QAAM,OAAO,yBAA0B,UAAU,QAAQ;AACzD,OAAK,oBAAqB,MAAM,EAAE;AAClC,OAAK,oBAAqB,MAAM,EAAE;AAClC,OAAK,oBAAqB,MAAM,EAAE;AAElC,SACE,IAAK,GAAG,GAAG,CAAC,EACZ,gBAAiB,MAAM,UAAU,CAAC,EAClC,gBAAiB,MAAM,UAAU,CAAC,EAClC,gBAAiB,MAAM,UAAU,CAAC;AAErC;AAGO,SAAS,gBAAiB,IAAI,OAAO,QAAQ,QAAS;AAE5D,QAAM,KAAK,GAAG,IAAI,KAAK,MAAO,GAAG,CAAC;AAClC,QAAM,KAAK,GAAG,IAAI,KAAK,MAAO,GAAG,CAAC;AAClC,QAAM,KAAK,KAAK,MAAS,KAAK,QAAU,KAAK;AAC7C,QAAM,KAAK,KAAK,MAAS,KAAK,SAAW,MAAM;AAC/C,SAAO,IAAK,IAAI,EAAE;AAClB,SAAO;AAER;AC1DA,MAAMC,QAAsB,oBAAI,QAAO;AACvC,MAAM,YAA4B,oBAAI,QAAO;AAC7C,MAAMC,cAA4B,oBAAI,QAAO;AAE7C,MAAM,qCAAqC,cAAc;AAAA,EAExD,YAAa,OAAO,eAAe,kBAAkB,MAAO;AAE3D,UAAO,OAAO,eAAe,eAAe;AAE5C,SAAK,WAAW,SAAU,iBAAiB,YAAY,CAAE,EAAG;AAC5D,SAAK,QAAQ,SAAU,iBAAiB,SAAS,IAAI;AACrD,SAAK,WAAW,SAAU,iBAAiB,YAAY,IAAI;AAC3D,SAAK,cAAc,SAAU,KAAK,KAAK,QAAS,WAAW,EAAE,CAAE,KAAM;AAAA,EAEtE;AAAA;AAAA,EAGA,mBAAoB,QAAQ,OAAO,SAAS,MAAO;AAElD,UAAM,OAAO,KAAK;AAClB,QAAK,SAAS,aAAa,SAAS,UAAW;AAE9C,YAAM,IAAI,MAAO,kEAAkE;AAAA,IAEpF;AAIA,WAAO,yBAA0B,QAAQ,QAAQ,KAAK,aAAa,MAAM,MAAM;AAAA,EAEhF;AAED;AAGO,MAAM,gCAAgC,oBAAoB;AAAA,EAEhE,eAAgB,MAAO;AAEtB,UAAO,GAAG,IAAI;AAEd,SAAK,4BAA4B;AACjC,SAAK,aAAa;AAElB,SAAK,gBAAiB,4BAA4B;AAAA,EAEnD;AAAA;AAAA,EAGA,QAAS,WAAW,WAAW,UAAU,SAAS,CAAA,GAAK;AAEtD,UAAM,aAAa,KAAK;AACxB,wBAAqB,YAAY,MAAM;AAEvC,UAAM,QAAQ,OAAO,KAAM,UAAU;AACrC,UAAM,UAAU,MAAM,IAAK,OAAK,OAAQ,EAAG;AAC3C,SAAK,yBAA0B,OAAO,WAAW,WAAW,UAAU,OAAO;AAE7E,UAAM,QAAS,CAAE,GAAG,MAAO,OAAQ,CAAC,IAAK,QAAS,EAAG;AACrD,WAAO;AAAA,EAER;AAAA;AAAA,EAGA,MAAM,aAAc,WAAW,WAAW,UAAU,SAAS,CAAA,GAAK;AAEjE,UAAM,aAAa,KAAK;AACxB,wBAAqB,YAAY,MAAM;AAEvC,UAAM,QAAQ,OAAO,KAAM,UAAU;AACrC,UAAM,UAAU,MAAM,IAAK,OAAK,OAAQ,EAAG;AAC3C,UAAM,KAAK,8BAA+B,OAAO,WAAW,WAAW,UAAU,OAAO;AAExF,UAAM,QAAS,CAAE,GAAG,MAAO,OAAQ,CAAC,IAAK,QAAS,EAAG;AACrD,WAAO;AAAA,EAER;AAAA;AAAA,EAGA,iCAAkC,MAAO;AAExC,SAAK,aAAa;AAClB,UAAM,SAAS,KAAK,yBAA0B,GAAG,IAAI;AACrD,SAAK,aAAa;AAClB,WAAO;AAAA,EAER;AAAA;AAAA,EAGA,yBAA0B,OAAO,WAAW,WAAW,UAAU,SAAS,IAAK;AAG9E,WAAQ,OAAO,SAAS,MAAM,OAAS,QAAO,KAAM,IAAI;AACxD,WAAO,SAAS,MAAM;AACtB,uBAAmB,eAAgB,OAAO,MAAM;AAGhD,UAAM,WAAW,KAAK;AACtB,UAAM,qBAAqB,KAAK,WAAW;AAC3C,UAAM,aAAa,KAAK;AACxB,UAAM,UAAU,yBAA0B,UAAU,SAAS;AAC7D,aAAU,IAAI,GAAG,IAAI,MAAM,QAAQ,IAAI,GAAG,KAAO;AAGhD,YAAM,OAAO,MAAO,CAAC;AACrB,UAAK,CAAE,mBAAoB,OAAS;AAEnC;AAAA,MAED;AAGA,YAAM,WAAW,WAAY,IAAI;AACjC,YAAM,UAAU,SAAU,SAAS,KAAK;AACxC,kBAAa,UAAU,SAAS,UAAU,WAAW,SAASD,KAAG;AACjE,sBAAiBA,OAAK,QAAQ,MAAM,OAAO,QAAQ,MAAM,QAAQ,SAAS;AAC1EC,kBAAU,IAAK,GAAG,CAAC;AAEnB,yBAAmB,oBAAqB,SAAS,WAAWA,WAAS;AAAA,IAEtE;AAGA,UAAM,SAAS,IAAI,WAAY,MAAM,SAAS,CAAC;AAC/C,QAAK,KAAK,YAAa;AAEtB,aAAO,mBACL,cAAe,MAAM,EACrB,KAAM,MAAM;AAEZ,iCAAyB,KAAM,IAAI;AACnC,eAAO;AAAA,MAER,CAAC;AAAA,IAEH,OAAO;AAEN,yBAAmB,SAAU,MAAM;AACnC,+BAAyB,KAAM,IAAI;AAEnC,aAAO;AAAA,IAER;AAEA,aAAS,2BAA2B;AAEnC,eAAU,IAAI,GAAG,IAAI,MAAM,QAAQ,IAAI,GAAG,KAAO;AAEhD,cAAM,OAAO,MAAO,CAAC;AACrB,cAAM,WAAW,WAAY,IAAI;AACjC,cAAM,OAAO,SAAS;AAGtB,eAAQ,CAAC,IAAK,uBAAwB,UAAU,OAAQ,EAAG;AAG3D,YAAK,CAAE,UAAW;AAEjB,gBAAM,IAAI,MAAO,6DAA6D;AAAA,QAE/E,WAAY,CAAE,mBAAoB,OAAS;AAE1C,iBAAQ,CAAC,IAAK,SAAS,eAAgB,MAAM;AAC7C;AAAA,QAED;AAGA,cAAM,SAAS,SAAS,eAAgB,SAAS,SAAS;AAG1D,cAAM,OAAO,SAAS,SAAS,IAAK,OAAK,OAAQ,IAAI,IAAI,EAAG;AAC5D,cAAM,gBAAgB,SAAS;AAC/B,cAAM,aAAa,qCAAsC,eAAe,IAAI;AAC5E,cAAM,aAAa,IAAI,WAAY,MAAM;AACzC,YAAI,WAAY,WAAW,MAAM,EAAG,IAAK,IAAI;AAG7C,YAAK,SAAS,OAAQ;AAErB,gBAAM,MAAM,OAAQ,CAAC;AACrB,mBAAU,IAAI,GAAG,KAAK,IAAI,QAAQ,IAAI,IAAI,KAAO;AAEhD,gBAAK,CAAC,IAAK,SAAS,mBAAoB,YAAY,GAAG,IAAK,EAAG;AAAA,UAEhE;AAAA,QAED,OAAO;AAEN,iBAAQ,CAAC,IAAK,SAAS,mBAAoB,YAAY,GAAG,OAAQ,EAAG;AAAA,QAEtE;AAGA,eAAQ,CAAC,IAAK,SAAS,uBAAwB,OAAQ,EAAG;AAG1D,eAAQ,CAAC,IAAK,SAAS,sBAAuB,OAAQ,EAAG;AAGzD,eAAQ,CAAC,IAAK,SAAS,cAAe,OAAQ,EAAG;AAAA,MAElD;AAAA,IAED;AAAA,EAED;AAAA;AAAA,EAGA,UAAU;AAET,SAAK,KAAK,QAAS,aAAW;AAE7B,UAAK,SAAU;AAEd,gBAAQ,QAAO;AAEf,YAAK,QAAQ,iBAAiB,aAAc;AAE3C,kBAAQ,MAAM,MAAK;AAAA,QAEpB;AAAA,MAED;AAAA,IAED,CAAC;AAAA,EAEF;AAED;AC/OO,MAAM,mBAAmB;AAAA,EAE/B,YAAa,YAAY,UAAU,SAAS,eAAe,MAAM,SAAS,MAAO;AAEhF,UAAM;AAAA,MACL;AAAA,MACA,iBAAiB,CAAA;AAAA,MACjB,mBAAmB,CAAA;AAAA,MACnB,qBAAqB,CAAA;AAAA,IACxB,IAAM;AAEJ,UAAM,EAAE,OAAO,QAAO,IAAK;AAC3B,UAAM,iBAAiB,eAAe,IAAK,OAAK,IAAI,sBAAuB,GAAG,SAAS,OAAO,QAAS;AACvG,QAAI,mBAAmB,CAAA;AACvB,QAAI,qBAAqB,CAAA;AAEzB,QAAK,cAAe;AAEnB,UAAK,aAAa,kBAAmB;AAEpC,2BAAmB,aAAa,iBAAiB,IAAK,OAAK,IAAI,wBAAyB,iBAAkB,CAAC,GAAI,SAAS,OAAO,QAAQ,CAAE;AAAA,MAE1I;AAEA,UAAK,aAAa,oBAAqB;AAEtC,6BAAqB,aAAa,mBAAmB,IAAK,OAAK,IAAI,0BAA2B,mBAAoB,CAAC,GAAI,SAAS,KAAK,CAAE;AAAA,MAExI;AAAA,IAED;AAEA,SAAK,SAAS;AACd,SAAK,iBAAiB;AACtB,SAAK,mBAAmB;AACxB,SAAK,qBAAqB;AAC1B,SAAK,SAAS;AACd,SAAK,WAAW;AAChB,SAAK,eAAe;AAAA,EAErB;AAAA;AAAA,EAGA,qBAAsB,cAAc,KAAK,SAAS,MAAO;AAExD,QAAK,CAAE,MAAM,QAAS,YAAY,KAAM,CAAE,MAAM,QAAS,MAAQ;AAGhE,eAAS,UAAU,CAAA;AAEnB,YAAM,QAAQ,KAAK,eAAgB,YAAY;AAC/C,eAAS,MAAM,QAAS,KAAK,MAAM;AAAA,IAEpC,OAAO;AAGN,eAAS,UAAU,CAAA;AAEnB,YAAM,SAAS,KAAK,IAAK,aAAa,QAAQ,IAAI,MAAM;AACxD,aAAO,SAAS;AAEhB,eAAU,IAAI,GAAG,IAAI,QAAQ,KAAO;AAEnC,cAAM,QAAQ,KAAK,eAAgB,aAAc,CAAC,CAAE;AACpD,eAAQ,KAAM,MAAM,QAAS,IAAK,CAAC,GAAI,OAAQ,EAAG;AAAA,MAEnD;AAAA,IAED;AAEA,WAAO;AAAA,EAER;AAAA,EAEA,qBAAsB,eAAe,MAAO;AAG3C,QAAK,iBAAiB,MAAO;AAE5B,qBAAe,KAAK,eAAe,IAAK,CAAE,GAAG,MAAO,CAAC;AAAA,IAEtD;AAEA,QAAK,MAAM,QAAS,eAAiB;AAGpC,aAAO,aAAa,IAAK,OAAK;AAE7B,cAAM,QAAQ,KAAK,eAAgB,CAAC;AACpC,eAAO;AAAA,UACN,MAAM,MAAM;AAAA,UACZ,WAAW,MAAM,WAAW;AAAA,QACjC;AAAA,MAEG,CAAC;AAAA,IAEF,OAAO;AAGN,YAAM,QAAQ,KAAK,eAAgB,YAAY;AAC/C,aAAO;AAAA,QACN,MAAM,MAAM;AAAA,QACZ,WAAW,MAAM,WAAW;AAAA,MAChC;AAAA,IAEE;AAAA,EAED;AAAA;AAAA,EAGA,uBAAwB,UAAU,WAAW,SAAS,CAAA,GAAK;AAE1D,UAAM,mBAAmB,KAAK;AAC9B,WAAO,SAAS,iBAAiB;AAEjC,aAAU,IAAI,GAAG,IAAI,iBAAiB,QAAQ,KAAO;AAEpD,YAAM,WAAW,iBAAkB,CAAC;AACpC,aAAQ,CAAC,IAAK,SAAS,QAAS,UAAU,WAAW,KAAK,OAAO,UAAU,OAAQ,CAAC,CAAE;AAAA,IAEvF;AAEA,WAAO;AAAA,EAER;AAAA,EAEA,MAAM,4BAA6B,UAAU,WAAW,SAAS,CAAA,GAAK;AAErE,UAAM,mBAAmB,KAAK;AAC9B,WAAO,SAAS,iBAAiB;AAEjC,UAAM,WAAW,CAAA;AACjB,aAAU,IAAI,GAAG,IAAI,iBAAiB,QAAQ,KAAO;AAEpD,YAAM,WAAW,iBAAkB,CAAC;AACpC,YAAM,UAAU,SACd,aAAc,UAAU,WAAW,KAAK,OAAO,UAAU,OAAQ,CAAC,CAAE,EACpE,KAAM,YAAU;AAEhB,eAAQ,CAAC,IAAK;AAAA,MAEf,CAAC;AAEF,eAAS,KAAM,OAAO;AAAA,IAEvB;AAEA,UAAM,QAAQ,IAAK,QAAQ;AAE3B,WAAO;AAAA,EAER;AAAA,EAEA,yBAAyB;AAExB,WAAO,KAAK;AAAA,EAEb;AAAA;AAAA,EAGA,yBAA0B,gBAAgB,SAAS,IAAK;AAEvD,UAAM,qBAAqB,KAAK;AAChC,WAAO,SAAS,mBAAmB;AAEnC,aAAU,IAAI,GAAG,IAAI,mBAAmB,QAAQ,KAAO;AAEtD,YAAM,WAAW,mBAAoB,CAAC;AACtC,aAAQ,CAAC,IAAK,SAAS,QAAS,gBAAgB,KAAK,OAAO,UAAU,OAAQ,CAAC,CAAE;AAAA,IAElF;AAEA,WAAO;AAAA,EAER;AAAA,EAEA,2BAA2B;AAE1B,WAAO,KAAK,mBAAmB,IAAK,SAAO;AAE1C,aAAO;AAAA,QACN,MAAM,IAAI;AAAA,QACV,WAAW,IAAI,WAAW;AAAA,MAC9B;AAAA,IAEE,CAAC;AAAA,EAEF;AAAA,EAEA,UAAU;AAET,SAAK,iBAAiB,QAAS,SAAO,IAAI,QAAO,CAAE;AACnD,SAAK,eAAe,QAAS,SAAO,IAAI,QAAO,CAAE;AACjD,SAAK,mBAAmB,QAAS,SAAO,IAAI,QAAO,CAAE;AAAA,EAEtD;AAED;ACrMA,MAAM,MAAsB,oBAAI,QAAO;AACvC,MAAM,SAAyB,oBAAI,QAAO;AAC1C,MAAM,YAA4B,oBAAI,QAAO;AAG7C,SAAS,qBAAsB,WAAY;AAE1C,MAAK,UAAU,IAAI,UAAU,KAAK,UAAU,IAAI,UAAU,GAAI;AAE7D,WAAO;AAAA,EAER,WAAY,UAAU,IAAI,UAAU,GAAI;AAEvC,WAAO;AAAA,EAER,OAAO;AAEN,WAAO;AAAA,EAER;AAED;AAEO,MAAM,aAAa;AAAA,EAEzB,YAAa,UAAU,UAAU,MAAO;AAEvC,SAAK,WAAW;AAChB,SAAK,WAAW;AAChB,SAAK,OAAO;AACZ,SAAK,aAAa;AAGlB,SAAK,aAAa,KAAK,WAAW,IAAK,UAAQ;AAE9C,YAAM,EAAE,SAAS,GAAG,KAAI,IAAK;AAC7B,YAAM,SAAS;AAAA,QACd,OAAO;AAAA,QACP,eAAe;AAAA,QACf,eAAe;AAAA,QACf,GAAG;AAAA,MACP;AAEG,UAAK,SAAU;AAEd,eAAO,UAAU;AAAA,UAChB,UAAU;AAAA,UACV,UAAU,CAAE,CAAC;AAAA,UACb,GAAG;AAAA,QACR;AAAA,MAEG;AAEA,aAAO;AAAA,IAER,CAAC;AAAA,EAEF;AAAA;AAAA,EAGA,cAAc;AAEb,WAAO,KAAK;AAAA,EAEb;AAAA;AAAA,EAGA,iBAAiB;AAEhB,WAAO,KAAK;AAAA,EAEb;AAAA;AAAA,EAGA,oBAAqB,MAAO;AAE3B,SAAK,aAAa;AAClB,UAAM,SAAS,KAAK,YAAa,GAAG,IAAI;AACxC,SAAK,aAAa;AAClB,WAAO;AAAA,EAER;AAAA;AAAA,EAGA,YAAa,UAAU,WAAY;AAElC,UAAM,EAAE,UAAU,UAAU,WAAU,IAAK;AAC3C,UAAM,SAAS,IAAI,MAAO,WAAW,MAAM,EAAG,KAAM,IAAI;AAGxD,UAAM,QAAQ,WAAW;AACzB,uBAAmB,eAAgB,KAAK;AAGxC,UAAM,UAAU,yBAA0B,UAAU,QAAQ;AAC5D,UAAM,eAAe,QAAS,qBAAsB,SAAS,CAAE;AAC/D,aAAU,IAAI,GAAG,IAAI,WAAW,QAAQ,IAAI,GAAG,KAAO;AAGrD,YAAM,YAAY,WAAY,CAAC;AAC/B,YAAM,gBAAgB,mBAAmB,YAAY,UAAU,gBAAgB;AAC/E,UAAK,aAAa,WAAY;AAE7B,cAAM,UAAU,SAAU,UAAU,QAAQ,KAAK;AAGjD,oBAAa,UAAU,UAAU,QAAQ,UAAU,WAAW,SAAS,GAAG;AAC1E,wBAAiB,KAAK,QAAQ,MAAM,OAAO,QAAQ,MAAM,QAAQ,MAAM;AACvE,kBAAU,IAAK,GAAG,CAAC;AAGnB,2BAAmB,oBAAqB,SAAU,UAAU,QAAQ,KAAK,GAAI,QAAQ,SAAS;AAAA,MAE/F,WAAY,eAAe,WAAY;AAEtC,cAAM,OAAO,SAAS,aAAc,eAAgB,UAAU,SAAS,EAAG;AAC1E,cAAM,QAAQ,KAAK,KAAM,YAAY;AACrC,YAAK,UAAU,eAAgB;AAE9B,iBAAQ,CAAC,IAAK;AAAA,QAEf;AAAA,MAED,OAAO;AAGN,cAAM,QAAQ;AACd,YAAK,UAAU,eAAgB;AAE9B,iBAAQ,CAAC,IAAK;AAAA,QAEf;AAAA,MAED;AAAA,IAED;AAGA,UAAM,SAAS,IAAI,WAAY,QAAQ,CAAC;AACxC,QAAK,KAAK,YAAa;AAEtB,aAAO,mBACL,cAAe,MAAM,EACrB,KAAM,MAAM;AAEZ,iCAAwB;AACxB,eAAO;AAAA,MAER,CAAC;AAAA,IAEH,OAAO;AAEN,yBAAmB,SAAU,MAAM;AACnC,+BAAwB;AAExB,aAAO;AAAA,IAER;AAEA,aAAS,2BAA2B;AAGnC,YAAM,aAAa,IAAI,YAAa,CAAC;AACrC,eAAU,IAAI,GAAG,IAAI,WAAW,QAAQ,IAAI,GAAG,KAAO;AAErD,cAAM,YAAY,WAAY,CAAC;AAC/B,cAAM,gBAAgB,mBAAmB,YAAY,UAAU,gBAAgB;AAC/E,YAAK,aAAa,WAAY;AAG7B,gBAAM,EAAE,aAAa,UAAU;AAC/B,gBAAM,OAAO,SAAS,IAAK,OAAK,OAAQ,IAAI,IAAI,EAAG;AACnD,cAAI,WAAY,WAAW,MAAM,EAAG,IAAK,IAAI;AAE7C,gBAAM,QAAQ,WAAY,CAAC;AAC3B,cAAK,UAAU,eAAgB;AAE9B,mBAAQ,CAAC,IAAK;AAAA,UAEf;AAAA,QAED;AAAA,MAED;AAAA,IAED;AAAA,EAED;AAAA;AAAA,EAGA,UAAU;AAET,SAAK,SAAS,QAAS,aAAW;AAEjC,UAAK,SAAU;AAEd,gBAAQ,QAAO;AAEf,YAAK,QAAQ,iBAAiB,aAAc;AAE3C,kBAAQ,MAAM,MAAK;AAAA,QAEpB;AAAA,MAED;AAAA,IAED,CAAC;AAAA,EAEF;AAED;AC5LA,MAAM,0BAA0B;AAChC,MAAM,oBAAoB;AAY1B,IAAI,OAAO;AAKJ,MAAM,yBAAyB,OAAO;AAAA,EACnC,YAAqB;AAAA,EACrB;AAAA,EACA,YAAY;AAAA,EACZ,iCAAiB,IAAA;AAAA,EAIjB,iBAAiB;AAAA,EAEzB,YAAY,SAA0B,SAAmC;AACvE,UAAM,OAAO;AACb,SAAK,YAAY,SAAS,YAAY;AACtC,SAAK,mBAAmB,SAAS;AAEjC,SAAK,aAAA;AAAA,EACP;AAAA,EAEA,eAAe;AACb,UAAM,UAAU,WAAA;AAChB,YAAQ,QAAQ,CAAC,WAAW;AAC1B,aAAO,iBAAiB,WAAW,KAAK,UAAU;AAAA,IACpD,CAAC;AAAA,EACH;AAAA,EAEA,kBAAkB;AAChB,UAAM,UAAU,WAAA;AAChB,YAAQ,QAAQ,CAAC,WAAW;AAC1B,aAAO,oBAAoB,WAAW,KAAK,UAAU;AAAA,IACvD,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,QAAqB,MAA4B;AAEhE,UAAM,SAAS,cAAA;AAGf,UAAM,OAAO,MAAM,KAAK,gBAAgB,QAAQ,QAAQ,IAAI;AAG5D,UAAM,QAAQ,KAAK,uBAAuB,IAAI;AAG9C,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,CAAC,KAAK;AAAA,MACd,YAAY,CAAA;AAAA,MACZ,SAAS,CAAA;AAAA,MACT,OAAO;AAAA,QACL,WAAW;AAAA,QACX,SAAS;AAAA,MAAA;AAAA,MAEX,QAAQ;AAAA,MACR,UAAU,CAAA;AAAA,IAAC;AAAA,EAEf;AAAA;AAAA;AAAA;AAAA,EAKQ,gBACN,QACA,QACA,aACyB;AACzB,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,YAAY,KAAK;AACvB,WAAK,WAAW,IAAI,WAAW,EAAE,SAAS,QAAQ;AAGlD,aAAO;AAAA,QACL;AAAA,UACE,QAAQ;AAAA,UACR;AAAA,UACA,MAAM;AAAA,UACN,UAAU,KAAK;AAAA,UACf;AAAA,UACA,cAAc;AAAA,YACZ,UAAU,OAAO,SAAS;AAAA,YAC1B,gBAAgB;AAAA,UAAA;AAAA,QAClB;AAAA,QAEF,CAAC,MAAM;AAAA,MAAA;AAAA,IAEX,CAAC;AAAA,EACH;AAAA,EAEQ,aAAa,CAAC,UAAwB;AAC5C,UAAM,EAAE,MAAM,MAAM,OAAO,UAAU,UAAA,IAAc,MAAM;AAGzD,QAAI,aAAa,KAAK,UAAW;AACjC,UAAM,WAAW,KAAK,WAAW,IAAI,SAAS;AAC9C,QAAI,CAAC,SAAU;AAEf,SAAK,WAAW,OAAO,SAAS;AAEhC,QAAI,SAAS,WAAW;AACtB,eAAS,QAAQ,IAAI;AAAA,IACvB,WAAW,SAAS,SAAS;AAC3B,eAAS,OAAO,IAAI,MAAM,KAAK,CAAC;AAAA,IAClC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,MAA6B;AAC1D,UAAM,QAAQ,IAAI,MAAA;AAGlB,UAAM,EAAE,YAAY,iBAAiB,cAAc,IAAI;AAGvD,UAAM,cAAc,eAAe,MAAM,YAAY,KAAK,gBAAgB;AAG1E,UAAM,kBAAkB,IAAI,qBAAqB,EAAE,OAAO,UAAU;AAGpE,UAAM,UAAU,oBAAoB,MAAM,aAAa,eAAe;AAGtE,UAAM,gBAAgB,CAAC,aAAkC;AACvD,YAAM,OAAO,IAAI,MAAA;AAEjB,YAAM,oBAAoB,QAAQ,IAAI,SAAS,IAAI;AACnD,UAAI,mBAAmB;AACrB,YAAI,SAAS,cAAc;AAEzB,gBAAM,EAAE,OAAO,aAAa,UAAU,MAAA,IACpC,SAAS;AAEX,qBAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,UAAA,KACG,mBAAmB;AACtB,kBAAM,gBAAgB,IAAI;AAAA,cACxB;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAGF,kBAAM,YAAY,IAAI,QAAA;AACtB,kBAAM,SAAS,IAAI,QAAA;AACnB,kBAAM,UAAU,IAAI,WAAA;AACpB,kBAAM,WAAW,IAAI,QAAQ,GAAG,GAAG,CAAC;AAEpC,qBAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,kBAAI,aAAa;AACf,uBAAO;AAAA,kBACL,YAAY,IAAI,CAAC;AAAA,kBACjB,YAAY,IAAI,IAAI,CAAC;AAAA,kBACrB,YAAY,IAAI,IAAI,CAAC;AAAA,gBAAA;AAAA,cAEzB,OAAO;AACL,uBAAO,IAAI,GAAG,GAAG,CAAC;AAAA,cACpB;AAEA,kBAAI,UAAU;AACZ,wBAAQ;AAAA,kBACN,SAAS,IAAI,CAAC;AAAA,kBACd,SAAS,IAAI,IAAI,CAAC;AAAA,kBAClB,SAAS,IAAI,IAAI,CAAC;AAAA,kBAClB,SAAS,IAAI,IAAI,CAAC;AAAA,gBAAA;AAAA,cAEtB,OAAO;AACL,wBAAQ,SAAA;AAAA,cACV;AAEA,kBAAI,OAAO;AACT,yBAAS;AAAA,kBACP,MAAM,IAAI,CAAC;AAAA,kBACX,MAAM,IAAI,IAAI,CAAC;AAAA,kBACf,MAAM,IAAI,IAAI,CAAC;AAAA,gBAAA;AAAA,cAEnB,OAAO;AACL,yBAAS,IAAI,GAAG,GAAG,CAAC;AAAA,cACtB;AAEA,wBAAU,QAAQ,QAAQ,SAAS,QAAQ;AAC3C,4BAAc,YAAY,GAAG,SAAS;AAAA,YACxC;AAEA,0BAAc,eAAe,cAAc;AAC3C,0BAAc,SAAS,iBAAiB,SAAS;AACjD,0BAAc,SAAS,sBAAsB;AAC7C,iBAAK,IAAI,aAAa;AAAA,UACxB;AAAA,QACF,OAAO;AACL,qBAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,UAAA,KACG,mBAAmB;AACtB,kBAAM,OAAO,IAAI,KAAK,UAAU,QAAQ;AACxC,iBAAK,SAAS,iBAAiB,SAAS;AACxC,iBAAK,SAAS,sBAAsB;AACpC,iBAAK,IAAI,IAAI;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAGA,UAAI,SAAS,MAAM;AACjB,aAAK,OAAO,SAAS;AAAA,MACvB;AAGA,UAAI,SAAS,QAAQ;AACnB,cAAM,IAAI,IAAI,QAAA;AACd,UAAE,UAAU,SAAS,MAAM;AAC3B,aAAK,aAAa,CAAC;AAAA,MACrB,OAAO;AACL,YAAI,SAAS,aAAa;AACxB,eAAK,SAAS;AAAA,YACZ,SAAS,YAAY,CAAC;AAAA,YACtB,SAAS,YAAY,CAAC;AAAA,YACtB,SAAS,YAAY,CAAC;AAAA,UAAA;AAAA,QAE1B;AACA,YAAI,SAAS,UAAU;AACrB,eAAK,WAAW;AAAA,YACd,SAAS,SAAS,CAAC;AAAA,YACnB,SAAS,SAAS,CAAC;AAAA,YACnB,SAAS,SAAS,CAAC;AAAA,YACnB,SAAS,SAAS,CAAC;AAAA,UAAA;AAAA,QAEvB;AACA,YAAI,SAAS,OAAO;AAClB,eAAK,MAAM;AAAA,YACT,SAAS,MAAM,CAAC;AAAA,YAChB,SAAS,MAAM,CAAC;AAAA,YAChB,SAAS,MAAM,CAAC;AAAA,UAAA;AAAA,QAEpB;AAAA,MACF;AAGA,UAAI,SAAS,YAAY,MAAM,QAAQ,SAAS,QAAQ,GAAG;AACzD,mBAAW,SAAS,SAAS,UAAU;AACrC,gBAAM,YAAY,cAAc,KAAK;AACrC,eAAK,IAAI,SAAS;AAAA,QACpB;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAGA,UAAM,YAAY,KAAK,OAAO,CAAC;AAC/B,eAAW,YAAY,UAAU,OAAO;AACtC,YAAM,OAAO,cAAc,QAAQ;AACnC,YAAM,IAAI,IAAI;AAAA,IAChB;AAGA,QAAI,KAAK,WAAW;AAClB,WAAK,gBAAgB,OAAO,MAAM,cAAc,OAAO;AAAA,IACzD;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,gBACN,OACA,MACA,UACA,SACM;AACN,UAAM,iBAAiB,KAAK,MAAM,kBAAkB,CAAA;AACpD,UAAM,wBAAwB,eAAe;AAAA,MAC3C;AAAA,IAAA;AAEF,UAAM,kBAAkB,eAAe,SAAS,iBAAiB;AAEjE,QAAI,CAAC,yBAAyB,CAAC,iBAAiB;AAC9C;AAAA,IACF;AAGA,QAAI,eAAoB;AACxB,QAAI,yBAAyB,KAAK,oBAAoB;AACpD,YAAM,gBAAgB,KAAK,MAAM,aAAa,uBAAuB;AACrE,UAAI,eAAe;AACjB,cAAM,aAAa;AAAA,UACjB,QAAQ,KAAK,mBAAmB;AAAA,UAChC,gBAAgB,KAAK,mBAAmB,kBAAkB,CAAA;AAAA,UAC1D,kBAAkB,cAAc,oBAAoB,CAAA;AAAA,UACpD,oBAAoB,cAAc,sBAAsB,CAAA;AAAA,QAAC;AAG3D,cAAM,UAAU,KAAK,mBAAmB,WAAW,CAAA;AACnD,uBAAe,IAAI,mBAAmB,YAAY,UAAU,OAAO;AACnE,cAAM,SAAS,qBAAqB;AAAA,MACtC;AAAA,IACF;AAGA,UAAM,SAAS,CAAC,UAAU;AACxB,UAAI,EAAE,iBAAiB,MAAO;AAE9B,YAAM,YAAY,MAAM,SAAS;AACjC,YAAM,iBAAiB,MAAM,SAAS;AAGtC,UAAI,cAAc,UAAa,mBAAmB,OAAW;AAE7D,YAAM,oBAAoB,QAAQ,IAAI,SAAS;AAC/C,UAAI,CAAC,kBAAmB;AAExB,YAAM,gBAAgB,kBAAkB;AAAA,QACtC,CAAC,MAAM,EAAE,mBAAmB;AAAA,MAAA;AAE9B,UAAI,CAAC,cAAe;AAEpB,YAAM,aAAa,cAAc;AAGjC,UAAI,yBAAyB,cAAc;AACzC,cAAM,kBAAkB,aAAa,uBAAuB;AAC5D,YAAI,iBAAiB;AACnB,gBAAM,gBACJ,KAAK,MAAM,aAAa,uBAAuB;AACjD,cAAI,eAAe;AACjB,kBAAM,aAAa;AAAA,cACjB,QAAQ,KAAK,mBAAoB;AAAA,cACjC,gBAAgB,KAAK,mBAAoB,kBAAkB,CAAA;AAAA,cAC3D,kBAAkB,cAAc,oBAAoB,CAAA;AAAA,cACpD,oBAAoB,cAAc,sBAAsB,CAAA;AAAA,YAAC;AAE3D,kBAAM,UAAU,KAAK,mBAAoB,WAAW,CAAA;AAEpD,kBAAM,SAAS,qBAAqB,IAAI;AAAA,cACtC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAAA,UAEJ;AAAA,QACF,OAAO;AACL,gBAAM,SAAS,qBAAqB;AAAA,QACtC;AAAA,MACF;AAGA,UAAI,iBAAiB;AACnB,cAAM,kBAAkB,aAAa,iBAAiB;AACtD,YAAI,iBAAiB;AACnB,gBAAM,SAAS,eAAe,IAAI;AAAA,YAChC,MAAM;AAAA,YACN;AAAA,YACA;AAAA,UAAA;AAAA,QAEJ;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;ACzZA,MAAM,UAAU;AAChB,MAAM,aAAa;AACnB,MAAM,aAAa;AAKZ,MAAM,YAAY;AAAA,EACf,YAAyC;AAAA;AAAA;AAAA;AAAA,EAKzC,SAA+B;AACrC,QAAI,KAAK,WAAW;AAClB,aAAO,KAAK;AAAA,IACd;AAEA,SAAK,YAAY,IAAI,QAAQ,CAAC,SAAS,WAAW;AAChD,YAAM,UAAU,UAAU,KAAK,SAAS,UAAU;AAElD,cAAQ,UAAU,MAAM;AACtB,eAAO,QAAQ,KAAK;AAAA,MACtB;AAEA,cAAQ,YAAY,MAAM;AACxB,gBAAQ,QAAQ,MAAM;AAAA,MACxB;AAEA,cAAQ,kBAAkB,CAAC,UAAU;AACnC,cAAM,KAAM,MAAM,OAA4B;AAC9C,YAAI,CAAC,GAAG,iBAAiB,SAAS,UAAU,GAAG;AAC7C,aAAG,kBAAkB,YAAY,EAAE,SAAS,OAAO;AAAA,QACrD;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,IAAI,KAA0C;AAClD,QAAI;AACF,YAAM,KAAK,MAAM,KAAK,OAAA;AACtB,aAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,cAAM,cAAc,GAAG,YAAY,YAAY,UAAU;AACzD,cAAM,QAAQ,YAAY,YAAY,UAAU;AAChD,cAAM,UAAU,MAAM,IAAI,GAAG;AAE7B,gBAAQ,UAAU,MAAM;AACtB,iBAAO,QAAQ,KAAK;AAAA,QACtB;AAEA,gBAAQ,YAAY,MAAM;AACxB,gBAAM,SAAS,QAAQ;AACvB,kBAAQ,SAAS,OAAO,OAAO,IAAI;AAAA,QACrC;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,IAAI,KAAa,MAAkC;AACvD,UAAM,KAAK,MAAM,KAAK,OAAA;AACtB,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,cAAc,GAAG,YAAY,YAAY,WAAW;AAC1D,YAAM,QAAQ,YAAY,YAAY,UAAU;AAChD,YAAM,UAAU,MAAM,IAAI;AAAA,QACxB;AAAA,QACA;AAAA,QACA,WAAW,KAAK,IAAA;AAAA,MAAI,CACrB;AAED,cAAQ,UAAU,MAAM;AACtB,eAAO,QAAQ,KAAK;AAAA,MACtB;AAEA,cAAQ,YAAY,MAAM;AACxB,gBAAA;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuB;AAC3B,UAAM,KAAK,MAAM,KAAK,OAAA;AACtB,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,cAAc,GAAG,YAAY,YAAY,WAAW;AAC1D,YAAM,QAAQ,YAAY,YAAY,UAAU;AAChD,YAAM,UAAU,MAAM,MAAA;AAEtB,cAAQ,UAAU,MAAM,OAAO,QAAQ,KAAK;AAC5C,cAAQ,YAAY,MAAM,QAAA;AAAA,IAC5B,CAAC;AAAA,EACH;AACF;AAGO,MAAM,YAAY,IAAI,YAAA;ACdtB,MAAM,iBAA2C;AAAA,EACtD,OAAO;AAAA,EAEC,QAAsD;AAAA,EACtD,UAAmC;AAAA,EAC1B,aAAa;AAAA,EACb;AAAA;AAAA,EAGT,iBAAuC;AAAA,EACvC,kCAA8C,IAAA;AAAA,EAC9C,oBAA0D;AAAA;AAAA,EAGlE,OAAiB,CAAA;AAAA,EACT,WAAiC;AAAA,EACjC,qCAA0C,IAAA;AAAA,EAC1C,oBAA4B;AAAA,EAC5B,iBAAyB;AAAA,EACzB,iCAAqC,IAAA;AAAA,EACrC,qCAAiD,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMzD,YAAY,SAAmC;AAC7C,SAAK,WAAW;AAAA,MACd,UAAU;AAAA,MACV,YAAY,UAAU,uBAAuB;AAAA,MAC7C,cAAc;AAAA,MACd,GAAG;AAAA,IAAA;AAGL,QAAI,SAAS,UAAU;AACrB,WAAK,WAAW,QAAQ;AAAA,IAC1B;AAEA,kBAAc,KAAK,SAAS,UAAW;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,OAAsB;AACzB,SAAK,QAAQ;AAGb,SAAK,UAAU,IAAI,iBAAiB,MAAM,SAAS;AAAA,MACjD,UAAU,KAAK,SAAS;AAAA,MACxB,iBAAiB,KAAK,SAAS;AAAA,IAAA,CAChC;AACD,UAAM,QAAQ,WAAW,KAAK,YAAY,KAAK,OAAO;AAGtD,QAAI,KAAK,UAAU;AACjB,WAAK,mBAAA;AAAA,IACP;AAEA,UAAM,iBAAiB,cAAc,KAAK,cAAc;AACxD,UAAM,iBAAiB,kBAAkB,KAAK,iBAAiB;AAE/D,UAAM,SAAS,CAAC,SAAc;AAC5B,YAAM,gBAAgB;AACtB,UAAI,cAAc,QAAQ,OAAO;AAC/B,aAAK,aAAa,cAAc,OAAO,KAAK;AAAA,MAC9C;AACA,aAAO;AAAA,IACT,GAAG,IAAI;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,UACJ,KACA,SAC0C;AAC1C,UAAM,SAAS,IAAI,YAAA,EAAc,SAAS,OAAO;AACjD,QAAI,CAAC,KAAK,SAAS,gBAAgB,QAAQ;AACzC,aAAO,KAAK,MAAO,UAAU,KAAK,OAAO;AAAA,IAC3C;AAEA,QAAI;AACF,YAAM,aAAa,MAAM,UAAU,IAAI,GAAG;AAE1C,UAAI,YAAY;AACd,eAAO;AAAA,MACT;AAEA,YAAM,WAAW,MAAM,KAAK,MAAO,UAAU,KAAK,OAAO;AAEzD,UAAI,CAAC,SAAS,IAAI;AAChB,eAAO;AAAA,MACT;AAEA,YAAM,cAAc,MAAM,SAAS,YAAA;AAEnC,gBAAU,IAAI,KAAK,WAAW,EAAE,MAAM,CAAC,QAAiB;AACtD,gBAAQ,KAAK,4CAA4C,GAAG;AAAA,MAC9D,CAAC;AAED,aAAO;AAAA,IACT,SAAS,OAAO;AACd,aAAO,KAAK,MAAO,UAAU,KAAK,OAAO;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA4B;AAChC,UAAM,UAAU,MAAA;AAChB,YAAQ,KAAK,kCAAkC;AAAA,EACjD;AAAA,EAEA,MAAM,UACJ,QACA,MACA,WACA,KACA,aACA;AACA,QAAI,KAAK,SAAS,iBAAiB;AACjC,eAAS,MAAM,KAAK,SAAS;AAAA,QAC3B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AACA,WAAO,KAAK,MAAO,UAAU,QAAQ,MAAM,WAAW,KAAK,WAAW;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAMQ,mBAAkC;AACxC,UAAM,UAAU,KAAK,OAAO;AAC5B,QAAI,CAAC,QAAS,QAAO;AACrB,WAAO,QAAQ,QAAQ,UAAU,gBAAgB;AAAA,EACnD;AAAA,EAEQ,iBACN,MACA,KACM;AACN,QAAI,KAAK,OAAO,QAAW;AACzB,UAAI,IAAI,KAAK,IAAI,IAAI;AAAA,IACvB;AACA,QAAI,KAAK,UAAU;AACjB,iBAAW,SAAS,KAAK,UAAU;AACjC,aAAK,iBAAiB,OAAO,GAAG;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,sBAAqD;AACjE,UAAM,MAAM,KAAK,iBAAA;AACjB,QAAI,CAAC,KAAK;AACR,cAAQ,KAAK,4EAA4E;AACzF,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG;AAChC,UAAI,CAAC,SAAS,IAAI;AAChB,gBAAQ,KAAK,sDAAsD,SAAS,MAAM,EAAE;AACpF,eAAO;AAAA,MACT;AACA,YAAM,OAAsB,MAAM,SAAS,KAAA;AAC3C,WAAK,iBAAiB;AAEtB,WAAK,YAAY,MAAA;AACjB,UAAI,KAAK,OAAO;AACd,mBAAW,QAAQ,KAAK,OAAO;AAC7B,eAAK,iBAAiB,MAAM,KAAK,WAAW;AAAA,QAC9C;AAAA,MACF;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,MAAM,oDAAoD,KAAK;AACvE,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,yBAAwD;AACpE,QAAI,KAAK,eAAgB,QAAO,KAAK;AACrC,QAAI,CAAC,KAAK,mBAAmB;AAC3B,WAAK,oBAAoB,KAAK,oBAAA;AAAA,IAChC;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,iBAAiB,KAA4C;AACjE,UAAM,KAAK,uBAAA;AACX,WAAO,KAAK,YAAY,IAAI,GAAG,KAAK;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBACJ,MACqC;AACrC,UAAM,KAAK,uBAAA;AACX,UAAM,6BAAa,IAAA;AACnB,eAAW,OAAO,MAAM;AACtB,YAAM,OAAO,KAAK,YAAY,IAAI,GAAG;AACrC,UAAI,MAAM;AACR,eAAO,IAAI,KAAK,IAAI;AAAA,MACtB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,mBAAkD;AACtD,WAAO,KAAK,uBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,iBAAiB,CAAC,EAAE,YAAiC;AAC3D,SAAK,aAAa,KAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,MAAM;AAChC,SAAK,kBAAA;AAAA,EACP;AAAA,EAEQ,aAAa,OAAiB;AACpC,SAAK,eAAe,MAAA;AAEpB,2BAAuB,KAAK;AAC5B,UAAM,SAAS,CAAC,MAAM;AACpB,UAAK,EAAW,UAAU;AACxB,aAAK,eAAe,CAAS;AAAA,MAC/B;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,oBAA0B;AAChC,eAAW,aAAa,KAAK,YAAY;AACvC,gBAAU,cAAA;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,mBAAmB,WAAgC;AACjD,SAAK,WAAW,IAAI,SAAS;AAAA,EAC/B;AAAA,EAEA,qBAAqB,WAAgC;AACnD,SAAK,WAAW,OAAO,SAAS;AAChC,SAAK,eAAe,OAAO,UAAU,OAAA,CAAQ;AAAA,EAC/C;AAAA,EAEQ,qBAAqB;AAC3B,UAAM,KAAK,KAAK,SAAU,WAAA;AAC1B,UAAM,aAAa,GAAG,aAAa,GAAG,4BAA4B;AAClE,SAAK,oBAAoB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKQ,2BAAmC;AACzC,UAAM,oBAAoB,KAAK;AAC/B,UAAM,kBAAkB,KAAK,KAAK;AAElC,QAAI,kBAAkB,mBAAmB;AACvC,YAAM,IAAI;AAAA,QACR,+BAA+B,eAAe,2DAA2D,iBAAiB;AAAA,MAAA;AAAA,IAE9H;AAEA,UAAM,oBAAoB;AAE1B,QAAI,mBAAmB,mBAAmB;AACxC,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,KAAK,KAAK,KAAK,KAAK,eAAe,CAAC;AACrD,WAAO,KAAK,IAAI,GAAG,QAAQ;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,MAAY;AACjC,UAAM,WAAW,KAAK;AAEtB,QAAI,SAAS,SAAS,kBAAkB;AACtC;AAAA,IACF;AACA,aAAS,SAAS,mBAAmB;AAErC,aAAS,OAAO;AAEhB,UAAM,0BAA0B,SAAS;AAEzC,QAAI,CAAC,SAAS,SAAS;AACrB,eAAS,UAAU,CAAA;AAAA,IACrB;AAEA,aAAS,SAAS,0BAA0B,KAAK;AAEjD,WAAO,eAAe,SAAS,SAAS,oBAAoB;AAAA,MAC1D,KAAK,MAAM;AACT,YAAI,SAAS,SAAS,4BAA4B,KAAK,gBAAgB;AACrE,mBAAS,SAAS,0BAA0B,KAAK;AACjD,mBAAS,cAAc;AAAA,QACzB;AACA,eAAO,SAAS,SAAS;AAAA,MAC3B;AAAA,MACA,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AAED,aAAS,kBAAkB,CAAC,QAAQ,aAAa;AAC/C,+BAAyB,KAAK,UAAU,QAAQ,QAAQ;AAExD,UAAI,OAAO,aAAa,SAAS,2BAA2B,GAAG;AAC7D;AAAA,MACF;AAEA,aAAO,SAAS,mBAAmB,IAAI,kBAAkB,MAAM,IAAI;AAEnE,aAAO,eAAe,OAAO,aAAa;AAAA,QACxC;AAAA,QACA;AAAA;AAAA;AAAA,MAAA;AAKF,aAAO,eAAe,OAAO,aAAa;AAAA,QACxC;AAAA,QACA;AAAA;AAAA,MAAA;AAIF,aAAO,iBAAiB,OAAO,eAAe;AAAA,QAC5C;AAAA,QACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA;AAcF,aAAO,iBAAiB,OAAO,eAAe;AAAA,QAC5C;AAAA,QACA;AAAA;AAAA;AAAA;AAAA,MAAA;AAAA,IAKJ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,6BAA6B,KAAgC;AAC3D,WAAO,6BAA6B,GAAG;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAwB,KAAqB;AAC3C,UAAM,aAAa,mBAAmB,KAAK,OAAQ,GAAG;AAEtD,UAAM,iBAAyB,CAAA;AAE/B,eAAW,YAAY,YAAY;AACjC,YAAM,WAAW,GAAG,GAAG,IAAI,SAAS,IAAI;AAExC,UAAI,cAAc,KAAK,eAAe,IAAI,QAAQ;AAElD,UAAI,CAAC,aAAa;AAChB,sBAAc,uBAAuB,UAAU,GAAG;AAClD,aAAK,eAAe,IAAI,UAAU,WAAW;AAAA,MAC/C;AACA,qBAAe,KAAK,GAAG,WAAW;AAAA,IACpC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,sBAAsB,KAA4B;AAChD,UAAM,WAAW,KAAK,eAAe,IAAI,GAAG;AAC5C,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AACA,UAAM,YAAY,IAAI,cAAc,KAAK,IAAI;AAC7C,SAAK,eAAe,IAAI,KAAK,SAAS;AACtC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAsB;AAC/B,SAAK,OAAO;AACZ,SAAK,iBAAiB,KAAK,yBAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,MAAsB;AACjC,UAAM,SAAS,IAAI,IAAI,IAAI;AAC3B,UAAM,UAAU,KAAK,KAAK,OAAO,CAAC,gBAAgB,CAAC,OAAO,IAAI,WAAW,CAAC;AAC1E,SAAK,OAAO;AACZ,SAAK,iBAAiB,KAAK,yBAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,SAAe;AACb,SAAK,OAAO,CAAA;AACZ,SAAK,iBAAiB,KAAK,yBAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,oBAA4B;AAC1B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACR,QAAI,KAAK,OAAO;AACd,WAAK,MAAM,QAAQ,cAAc,KAAK,UAAU;AAChD,WAAK,MAAM,oBAAoB,cAAc,KAAK,cAAc;AAChE,WAAK,MAAM,oBAAoB,kBAAkB,KAAK,iBAAiB;AAAA,IACzE;AAEA,QAAI,KAAK,SAAS;AAChB,WAAK,QAAQ,gBAAA;AAAA,IACf;AAEA,eAAW,aAAa,KAAK,YAAY;AACvC,gBAAU,QAAA;AAAA,IACZ;AACA,SAAK,WAAW,MAAA;AAChB,SAAK,eAAe,MAAA;AAEpB,SAAK,eAAe,MAAA;AAEpB,SAAK,iBAAiB;AACtB,SAAK,YAAY,MAAA;AACjB,SAAK,oBAAoB;AAEzB,SAAK,UAAU;AACf,SAAK,QAAQ;AAAA,EACf;AACF;","x_google_ignoreList":[9,10,11,12,13,14,15,16,17,18,19]}
package/build/index.d.ts CHANGED
@@ -24,12 +24,16 @@ export declare class GLTFParserPlugin implements MeshHelperHost {
24
24
  private _loader;
25
25
  private readonly _gltfRegex;
26
26
  private readonly _options;
27
+ private _structureData;
28
+ private _oidNodeMap;
29
+ private _structurePromise;
27
30
  oids: number[];
28
31
  private renderer;
29
32
  private splitMeshCache;
30
33
  private maxUniformVectors;
31
34
  private featureIdCount;
32
35
  private collectors;
36
+ private collectorCache;
33
37
  /**
34
38
  * Create a GLTFParserPlugin instance
35
39
  * @param options configuration options
@@ -48,6 +52,25 @@ export declare class GLTFParserPlugin implements MeshHelperHost {
48
52
  */
49
53
  clearCache(): Promise<void>;
50
54
  parseTile(buffer: ArrayBuffer, tile: any, extension: any, uri: string, abortSignal: AbortSignal): Promise<any>;
55
+ private _getStructureUrl;
56
+ private _buildOidNodeMap;
57
+ private _fetchStructureData;
58
+ private _ensureStructureLoaded;
59
+ /**
60
+ * 根据 oid 获取 structure.json 中对应的节点树数据
61
+ * 包含 bbox、children、name 等完整结构信息
62
+ * 首次调用时会自动从 tileset URL 推导并请求 structure.json
63
+ */
64
+ getNodeTreeByOid(oid: number): Promise<StructureNode | null>;
65
+ /**
66
+ * 根据 oid 数组批量获取 structure.json 中对应的节点树数据
67
+ */
68
+ getNodeTreeByOids(oids: number[]): Promise<Map<number, StructureNode>>;
69
+ /**
70
+ * 获取完整的 structure.json 数据
71
+ * 首次调用时会自动请求
72
+ */
73
+ getStructureData(): Promise<StructureData | null>;
51
74
  /**
52
75
  * Load model callback
53
76
  */
@@ -80,6 +103,7 @@ export declare class GLTFParserPlugin implements MeshHelperHost {
80
103
  /**
81
104
  * 根据 oid 获取 MeshCollector
82
105
  * MeshCollector 会监听瓦片变化,自动更新 meshes 并触发 mesh-change 事件
106
+ * 内部缓存:相同 oid 多次调用会返回同一个 collector 实例
83
107
  */
84
108
  getMeshCollectorByOid(oid: number): MeshCollector;
85
109
  /**
@@ -174,4 +198,24 @@ declare interface MeshHelperHost {
174
198
  _getMeshesByOidInternal(oid: number): Mesh[];
175
199
  }
176
200
 
201
+ /**
202
+ * structure.json 的完整数据结构
203
+ */
204
+ export declare interface StructureData {
205
+ defaultTree?: number;
206
+ idField?: string;
207
+ trees: StructureNode[];
208
+ }
209
+
210
+ /**
211
+ * structure.json 中的树节点结构
212
+ */
213
+ export declare interface StructureNode {
214
+ id?: number;
215
+ name?: string;
216
+ bbox?: number[];
217
+ children?: StructureNode[];
218
+ [key: string]: unknown;
219
+ }
220
+
177
221
  export { }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gltf-parser-plugin",
3
- "version": "1.0.8",
3
+ "version": "1.1.0",
4
4
  "description": "A plugin for parsing GLTF files",
5
5
  "type": "module",
6
6
  "main": "./build/gltf-parser-plugin.module.js",
@@ -28,7 +28,7 @@
28
28
  "author": "maptalks",
29
29
  "license": "MIT",
30
30
  "devDependencies": {
31
- "@types/node": "^25.3.0",
31
+ "@types/node": "^25.3.3",
32
32
  "@types/three": "^0.183.1",
33
33
  "@typescript-eslint/eslint-plugin": "^8.56.1",
34
34
  "@typescript-eslint/parser": "^8.56.1",
@@ -42,6 +42,6 @@
42
42
  "3d-tiles-renderer": "^0.4.21",
43
43
  "@maptalks/gltf-loader": "^0.124.3",
44
44
  "@maptalks/transcoders.draco": "^0.124.3",
45
- "three": "^0.183.1"
45
+ "three": "^0.183.2"
46
46
  }
47
47
  }