{"version":3,"file":"index.mjs","sources":["../node_modules/3d-tiles-renderer/src/utilities/urlExtension.js","../node_modules/3d-tiles-renderer/src/utilities/LRUCache.js","../node_modules/3d-tiles-renderer/src/utilities/PriorityQueue.js","../node_modules/3d-tiles-renderer/src/base/constants.js","../node_modules/3d-tiles-renderer/src/base/traverseFunctions.js","../node_modules/3d-tiles-renderer/src/utilities/throttle.js","../node_modules/3d-tiles-renderer/src/base/TilesRendererBase.js","../node_modules/3d-tiles-renderer/src/utilities/arrayToString.js","../node_modules/3d-tiles-renderer/src/utilities/FeatureTable.js","../node_modules/3d-tiles-renderer/src/utilities/BatchTableHierarchyExtension.js","../node_modules/3d-tiles-renderer/src/utilities/BatchTable.js","../node_modules/3d-tiles-renderer/src/base/loaders/LoaderBase.js","../node_modules/3d-tiles-renderer/src/utilities/readMagicBytes.js","../node_modules/3d-tiles-renderer/src/base/loaders/B3DMLoaderBase.js","../node_modules/3d-tiles-renderer/src/three/loaders/B3DMLoader.js","../node_modules/3d-tiles-renderer/src/base/loaders/PNTSLoaderBase.js","../node_modules/3d-tiles-renderer/src/utilities/rgb565torgb.js","../node_modules/3d-tiles-renderer/src/utilities/decodeOctNormal.js","../node_modules/3d-tiles-renderer/src/three/loaders/PNTSLoader.js","../node_modules/3d-tiles-renderer/src/base/loaders/I3DMLoaderBase.js","../node_modules/3d-tiles-renderer/src/three/math/GeoUtils.js","../node_modules/3d-tiles-renderer/src/three/math/Ellipsoid.js","../node_modules/3d-tiles-renderer/src/three/math/GeoConstants.js","../node_modules/3d-tiles-renderer/src/three/loaders/I3DMLoader.js","../node_modules/3d-tiles-renderer/src/base/loaders/CMPTLoaderBase.js","../node_modules/3d-tiles-renderer/src/three/loaders/CMPTLoader.js","../node_modules/3d-tiles-renderer/src/three/TilesGroup.js","../node_modules/3d-tiles-renderer/src/three/raycastTraverse.js","../node_modules/3d-tiles-renderer/src/three/math/OBB.js","../node_modules/3d-tiles-renderer/src/three/math/EllipsoidRegion.js","../node_modules/3d-tiles-renderer/src/three/math/TileBoundingVolume.js","../node_modules/3d-tiles-renderer/src/three/math/ExtendedFrustum.js","../node_modules/3d-tiles-renderer/src/three/utilities.js","../node_modules/3d-tiles-renderer/src/three/TilesRenderer.js","../node_modules/3d-tiles-renderer/src/three/controls/PivotPointMesh.js","../node_modules/3d-tiles-renderer/src/three/controls/PointerTracker.js","../node_modules/3d-tiles-renderer/src/three/controls/utils.js","../node_modules/3d-tiles-renderer/src/three/controls/EnvironmentControls.js","../node_modules/3d-tiles-renderer/src/three/controls/GlobeControls.js","../node_modules/3d-tiles-renderer/src/plugins/three/GoogleAttributionsManager.js","../node_modules/3d-tiles-renderer/src/plugins/three/GoogleCloudAuthPlugin.js","../node_modules/3d-tiles-renderer/src/plugins/three/images/ImageFormatPlugin.js","../node_modules/3d-tiles-renderer/src/plugins/three/images/EllipsoidProjectionTilesPlugin.js","../node_modules/3d-tiles-renderer/src/plugins/three/images/EPSGTilesPlugin.js","../node_modules/3d-tiles-renderer/src/plugins/base/loaders/QuantizedMeshLoaderBase.js","../node_modules/3d-tiles-renderer/src/plugins/three/loaders/QuantizedMeshLoader.js","../node_modules/3d-tiles-renderer/src/plugins/three/QuantizedMeshPlugin.js","../node_modules/3d-tiles-renderer/src/plugins/three/CesiumIonAuthPlugin.js","../node_modules/3d-tiles-renderer/src/plugins/three/UpdateOnChangePlugin.js","../node_modules/3d-tiles-renderer/src/plugins/three/TileCompressionPlugin.js","../node_modules/3d-tiles-renderer/src/plugins/three/gltf/metadata/utilities/ClassPropertyHelpers.js","../node_modules/3d-tiles-renderer/src/plugins/three/gltf/metadata/classes/ClassProperty.js","../node_modules/3d-tiles-renderer/src/plugins/three/gltf/metadata/classes/PropertySetAccessor.js","../node_modules/3d-tiles-renderer/src/plugins/three/gltf/metadata/classes/PropertyAttributeAccessor.js","../node_modules/3d-tiles-renderer/src/plugins/three/gltf/metadata/classes/PropertyTableAccessor.js","../node_modules/3d-tiles-renderer/src/plugins/three/gltf/metadata/utilities/TextureReadUtility.js","../node_modules/3d-tiles-renderer/src/plugins/three/gltf/metadata/utilities/TexCoordUtilities.js","../node_modules/3d-tiles-renderer/src/plugins/three/gltf/metadata/classes/PropertyTextureAccessor.js","../node_modules/3d-tiles-renderer/src/plugins/three/gltf/metadata/classes/StructuralMetadata.js","../node_modules/3d-tiles-renderer/src/plugins/three/gltf/GLTFStructuralMetadataExtension.js","../node_modules/3d-tiles-renderer/src/plugins/three/gltf/metadata/classes/MeshFeatures.js","../node_modules/3d-tiles-renderer/src/plugins/three/gltf/GLTFMeshFeaturesExtension.js","../node_modules/3d-tiles-renderer/src/plugins/three/gltf/GLTFCesiumRTCExtension.js","../node_modules/3d-tiles-renderer/src/plugins/three/ReorientationPlugin.js","../node_modules/3d-tiles-renderer/src/plugins/three/UnloadTilesPlugin.js","../node_modules/3d-tiles-renderer/src/plugins/three/fade/FadeManager.js","../node_modules/3d-tiles-renderer/src/plugins/three/fade/wrapFadeMaterial.js","../node_modules/3d-tiles-renderer/src/plugins/three/fade/FadeMaterialManager.js","../node_modules/3d-tiles-renderer/src/plugins/three/fade/PassThroughBatchedMesh.js","../node_modules/3d-tiles-renderer/src/plugins/three/fade/FadeBatchedMesh.js","../node_modules/3d-tiles-renderer/src/plugins/three/fade/TilesFadePlugin.js","../node_modules/3d-tiles-renderer/src/plugins/three/LoadRegionPlugin.js","../node_modules/3d-tiles-renderer/src/plugins/three/objects/SphereHelper.js","../node_modules/3d-tiles-renderer/src/plugins/three/objects/EllipsoidRegionHelper.js","../node_modules/3d-tiles-renderer/src/plugins/three/DebugTilesPlugin.js","../node_modules/3d-tiles-renderer/src/plugins/three/images/DeepZoomImagePlugin.js","../node_modules/3d-tiles-renderer/src/plugins/base/SUBTREELoader.js","../node_modules/3d-tiles-renderer/src/plugins/base/ImplicitTilingPlugin.js","../src/gltf.ts","../src/TilesRendererPlugin.ts","../src/B3DMLoadPlugin.ts","../src/I3DMLoadPlugin.ts","../src/PNTSLoadPlugin.ts","../src/CMPTLoadPlugin.ts","../src/DeepZoomImageLoadPlugin.ts","../src/SlippyMapTilesLoadPlugin.ts","../src/EnvironmentControlsPlugin.ts","../src/GlobeControlsPlugin.ts"],"sourcesContent":["/**\n * Returns the file extension of the path component of a URL\n * @param {string} url\n * @returns {string} null if no extension found\n */\nexport function getUrlExtension( url ) {\n\n\tif ( ! url ) {\n\n\t\treturn null;\n\n\t}\n\n\tconst filename = url\n\t\t.replace( /[a-z]+:\\/\\/[^/]+/i, '' ) \t// remove origin\n\t\t.replace( /\\?.*$/i, '' ) \t\t\t\t// remove query\n\t\t.replace( /.*\\//g, '' ); \t\t\t\t// remove path\n\n\tconst lastPeriod = filename.lastIndexOf( '.' );\n\tif ( lastPeriod === - 1 ) {\n\n\t\treturn null;\n\n\t}\n\n\treturn filename.substring( lastPeriod + 1 ) || null;\n\n}\n","const GIGABYTE_BYTES = 2 ** 30;\n\nclass LRUCache {\n\n\tget unloadPriorityCallback() {\n\n\t\treturn this._unloadPriorityCallback;\n\n\t}\n\n\tset unloadPriorityCallback( cb ) {\n\n\t\tif ( cb.length === 1 ) {\n\n\t\t\tconsole.warn( 'LRUCache: \"unloadPriorityCallback\" function has been changed to take two arguments.' );\n\t\t\tthis._unloadPriorityCallback = ( a, b ) => {\n\n\t\t\t\tconst valA = cb( a );\n\t\t\t\tconst valB = cb( b );\n\n\t\t\t\tif ( valA < valB ) return - 1;\n\t\t\t\tif ( valA > valB ) return 1;\n\t\t\t\treturn 0;\n\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tthis._unloadPriorityCallback = cb;\n\n\t\t}\n\n\t}\n\n\tconstructor() {\n\n\t\t// options\n\t\tthis.minSize = 6000;\n\t\tthis.maxSize = 8000;\n\t\tthis.minBytesSize = 0.3 * GIGABYTE_BYTES;\n\t\tthis.maxBytesSize = 0.4 * GIGABYTE_BYTES;\n\t\tthis.unloadPercent = 0.05;\n\t\tthis.autoMarkUnused = true;\n\n\t\t// \"itemSet\" doubles as both the list of the full set of items currently\n\t\t// stored in the cache (keys) as well as a map to the time the item was last\n\t\t// used so it can be sorted appropriately.\n\t\tthis.itemSet = new Map();\n\t\tthis.itemList = [];\n\t\tthis.usedSet = new Set();\n\t\tthis.callbacks = new Map();\n\t\tthis.unloadingHandle = - 1;\n\t\tthis.cachedBytes = 0;\n\t\tthis.bytesMap = new Map();\n\t\tthis.loadedSet = new Set();\n\n\t\tthis._unloadPriorityCallback = null;\n\t\tthis.computeMemoryUsageCallback = () => null;\n\n\t\tconst itemSet = this.itemSet;\n\t\tthis.defaultPriorityCallback = item => itemSet.get( item );\n\n\t}\n\n\t// Returns whether or not the cache has reached the maximum size\n\tisFull() {\n\n\t\treturn this.itemSet.size >= this.maxSize || this.cachedBytes >= this.maxBytesSize;\n\n\t}\n\n\tgetMemoryUsage( item ) {\n\n\t\treturn this.bytesMap.get( item ) ?? null;\n\n\t}\n\n\tadd( item, removeCb ) {\n\n\t\tconst itemSet = this.itemSet;\n\t\tif ( itemSet.has( item ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tif ( this.isFull() ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tconst usedSet = this.usedSet;\n\t\tconst itemList = this.itemList;\n\t\tconst callbacks = this.callbacks;\n\t\tconst bytesMap = this.bytesMap;\n\t\titemList.push( item );\n\t\tusedSet.add( item );\n\t\titemSet.set( item, Date.now() );\n\t\tcallbacks.set( item, removeCb );\n\n\t\t// computeMemoryUsageCallback can return \"null\" if memory usage is not known, yet\n\t\tconst bytes = this.computeMemoryUsageCallback( item );\n\t\tthis.cachedBytes += bytes || 0;\n\t\tbytesMap.set( item, bytes );\n\n\t\treturn true;\n\n\t}\n\n\thas( item ) {\n\n\t\treturn this.itemSet.has( item );\n\n\t}\n\n\tremove( item ) {\n\n\t\tconst usedSet = this.usedSet;\n\t\tconst itemSet = this.itemSet;\n\t\tconst itemList = this.itemList;\n\t\tconst bytesMap = this.bytesMap;\n\t\tconst callbacks = this.callbacks;\n\t\tconst loadedSet = this.loadedSet;\n\n\t\tif ( itemSet.has( item ) ) {\n\n\t\t\tthis.cachedBytes -= bytesMap.get( item ) || 0;\n\t\t\tbytesMap.delete( item );\n\n\t\t\tcallbacks.get( item )( item );\n\n\t\t\tconst index = itemList.indexOf( item );\n\t\t\titemList.splice( index, 1 );\n\t\t\tusedSet.delete( item );\n\t\t\titemSet.delete( item );\n\t\t\tcallbacks.delete( item );\n\t\t\tloadedSet.delete( item );\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t// Marks whether tiles in the cache have been completely loaded or not. Tiles that have not been completely\n\t// loaded are subject to being disposed early if the cache is full above its max size limits, even if they\n\t// are marked as used.\n\tsetLoaded( item, value ) {\n\n\t\tconst { itemSet, loadedSet } = this;\n\t\tif ( itemSet.has( item ) ) {\n\n\t\t\tif ( value === true ) {\n\n\t\t\t\tloadedSet.add( item );\n\n\t\t\t} else {\n\n\t\t\t\tloadedSet.delete( item );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tupdateMemoryUsage( item ) {\n\n\t\tconst itemSet = this.itemSet;\n\t\tconst bytesMap = this.bytesMap;\n\t\tif ( ! itemSet.has( item ) ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.cachedBytes -= bytesMap.get( item ) || 0;\n\n\t\tconst bytes = this.computeMemoryUsageCallback( item );\n\t\tbytesMap.set( item, bytes );\n\t\tthis.cachedBytes += bytes;\n\n\t}\n\n\tmarkUsed( item ) {\n\n\t\tconst itemSet = this.itemSet;\n\t\tconst usedSet = this.usedSet;\n\t\tif ( itemSet.has( item ) && ! usedSet.has( item ) ) {\n\n\t\t\titemSet.set( item, Date.now() );\n\t\t\tusedSet.add( item );\n\n\t\t}\n\n\t}\n\n\tmarkUnused( item ) {\n\n\t\tthis.usedSet.delete( item );\n\n\t}\n\n\tmarkAllUnused() {\n\n\t\tthis.usedSet.clear();\n\n\t}\n\n\t// TODO: this should be renamed because it's not necessarily unloading all unused content\n\t// Maybe call it \"cleanup\" or \"unloadToMinSize\"\n\tunloadUnusedContent() {\n\n\t\tconst {\n\t\t\tunloadPercent,\n\t\t\tminSize,\n\t\t\tmaxSize,\n\t\t\titemList,\n\t\t\titemSet,\n\t\t\tusedSet,\n\t\t\tloadedSet,\n\t\t\tcallbacks,\n\t\t\tbytesMap,\n\t\t\tminBytesSize,\n\t\t\tmaxBytesSize,\n\t\t} = this;\n\n\t\tconst unused = itemList.length - usedSet.size;\n\t\tconst unloaded = itemList.length - loadedSet.size;\n\t\tconst excessNodes = Math.max( Math.min( itemList.length - minSize, unused ), 0 );\n\t\tconst excessBytes = this.cachedBytes - minBytesSize;\n\t\tconst unloadPriorityCallback = this.unloadPriorityCallback || this.defaultPriorityCallback;\n\t\tlet needsRerun = false;\n\n\t\tconst hasNodesToUnload = excessNodes > 0 && unused > 0 || unloaded && itemList.length > maxSize;\n\t\tconst hasBytesToUnload = unused && this.cachedBytes > minBytesSize || unloaded && this.cachedBytes > maxBytesSize;\n\t\tif ( hasBytesToUnload || hasNodesToUnload ) {\n\n\t\t\t// used items should be at the end of the array, \"unloaded\" items in the middle of the array\n\t\t\titemList.sort( ( a, b ) => {\n\n\t\t\t\tconst usedA = usedSet.has( a );\n\t\t\t\tconst usedB = usedSet.has( b );\n\t\t\t\tif ( usedA === usedB ) {\n\n\t\t\t\t\tconst loadedA = loadedSet.has( a );\n\t\t\t\t\tconst loadedB = loadedSet.has( b );\n\t\t\t\t\tif ( loadedA === loadedB ) {\n\n\t\t\t\t\t\t// Use the sort function otherwise\n\t\t\t\t\t\t// higher priority should be further to the left\n\t\t\t\t\t\treturn - unloadPriorityCallback( a, b );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn loadedA ? 1 : - 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// If one is used and the other is not move the used one towards the end of the array\n\t\t\t\t\treturn usedA ? 1 : - 1;\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\t// address corner cases where the minSize might be zero or smaller than maxSize - minSize,\n\t\t\t// which would result in a very small or no items being unloaded.\n\t\t\tconst maxUnload = Math.max( minSize * unloadPercent, excessNodes * unloadPercent );\n\t\t\tconst nodesToUnload = Math.ceil( Math.min( maxUnload, unused, excessNodes ) );\n\t\t\tconst maxBytesUnload = Math.max( unloadPercent * excessBytes, unloadPercent * minBytesSize );\n\t\t\tconst bytesToUnload = Math.min( maxBytesUnload, excessBytes );\n\n\t\t\tlet removedNodes = 0;\n\t\t\tlet removedBytes = 0;\n\n\t\t\t// evict up to the max node or bytes size, keeping one more item over the max bytes limit\n\t\t\t// so the \"full\" function behaves correctly.\n\t\t\twhile (\n\t\t\t\tthis.cachedBytes - removedBytes > maxBytesSize ||\n\t\t\t\titemList.length - removedNodes > maxSize\n\t\t\t) {\n\n\t\t\t\tconst item = itemList[ removedNodes ];\n\t\t\t\tconst bytes = bytesMap.get( item ) || 0;\n\t\t\t\tif (\n\t\t\t\t\tusedSet.has( item ) && loadedSet.has( item ) ||\n\t\t\t\t\tthis.cachedBytes - removedBytes - bytes < maxBytesSize &&\n\t\t\t\t\titemList.length - removedNodes <= maxSize\n\t\t\t\t) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tremovedBytes += bytes;\n\t\t\t\tremovedNodes ++;\n\n\t\t\t}\n\n\t\t\t// evict up to the min node or bytes size, keeping one more item over the min bytes limit\n\t\t\t// so we're meeting it\n\t\t\twhile (\n\t\t\t\tremovedBytes < bytesToUnload ||\n\t\t\t\tremovedNodes < nodesToUnload\n\t\t\t) {\n\n\t\t\t\tconst item = itemList[ removedNodes ];\n\t\t\t\tconst bytes = bytesMap.get( item ) || 0;\n\t\t\t\tif (\n\t\t\t\t\tusedSet.has( item ) ||\n\t\t\t\t\tthis.cachedBytes - removedBytes - bytes < minBytesSize &&\n\t\t\t\t\tremovedNodes >= nodesToUnload\n\t\t\t\t) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tremovedBytes += bytes;\n\t\t\t\tremovedNodes ++;\n\n\t\t\t}\n\n\t\t\t// remove the nodes\n\t\t\titemList.splice( 0, removedNodes ).forEach( item => {\n\n\t\t\t\tthis.cachedBytes -= bytesMap.get( item ) || 0;\n\n\t\t\t\tcallbacks.get( item )( item );\n\t\t\t\tbytesMap.delete( item );\n\t\t\t\titemSet.delete( item );\n\t\t\t\tcallbacks.delete( item );\n\t\t\t\tloadedSet.delete( item );\n\t\t\t\tusedSet.delete( item );\n\n\t\t\t} );\n\n\t\t\t// if we didn't remove enough nodes or we still have excess bytes and there are nodes to removed\n\t\t\t// then we want to fire another round of unloading\n\t\t\tneedsRerun = removedNodes < excessNodes || removedBytes < excessBytes && removedNodes < unused;\n\t\t\tneedsRerun = needsRerun && removedNodes > 0;\n\n\t\t}\n\n\t\tif ( needsRerun ) {\n\n\t\t\tthis.unloadingHandle = requestAnimationFrame( () => this.scheduleUnload() );\n\n\t\t}\n\n\t}\n\n\tscheduleUnload() {\n\n\t\tcancelAnimationFrame( this.unloadingHandle );\n\n\t\tif ( ! this.scheduled ) {\n\n\t\t\tthis.scheduled = true;\n\t\t\tqueueMicrotask( () => {\n\n\t\t\t\tthis.scheduled = false;\n\t\t\t\tthis.unloadUnusedContent();\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n}\n\nexport { LRUCache };\n","class PriorityQueue {\n\n\t// returns whether tasks are queued or actively running\n\tget running() {\n\n\t\treturn this.items.length !== 0 || this.currJobs !== 0;\n\n\t}\n\n\tconstructor() {\n\n\t\t// options\n\t\tthis.maxJobs = 6;\n\n\t\tthis.items = [];\n\t\tthis.callbacks = new Map();\n\t\tthis.currJobs = 0;\n\t\tthis.scheduled = false;\n\t\tthis.autoUpdate = true;\n\n\t\tthis.priorityCallback = () => {\n\n\t\t\tthrow new Error( 'PriorityQueue: PriorityCallback function not defined.' );\n\n\t\t};\n\n\t\t// Customizable scheduling callback. Default using requestAnimationFrame()\n\t\tthis.schedulingCallback = func => {\n\n\t\t\trequestAnimationFrame( func );\n\n\t\t};\n\n\t\tthis._runjobs = () => {\n\n\t\t\tthis.scheduled = false;\n\t\t\tthis.tryRunJobs();\n\n\t\t};\n\n\t}\n\n\tsort() {\n\n\t\tconst priorityCallback = this.priorityCallback;\n\t\tconst items = this.items;\n\t\titems.sort( priorityCallback );\n\n\t}\n\n\thas( item ) {\n\n\t\treturn this.callbacks.has( item );\n\n\t}\n\n\tadd( item, callback ) {\n\n\t\treturn new Promise( ( resolve, reject ) => {\n\n\t\t\tconst items = this.items;\n\t\t\tconst callbacks = this.callbacks;\n\n\t\t\titems.push( item );\n\t\t\tcallbacks.set( item, {\n\t\t\t\tcallback,\n\t\t\t\tresolve,\n\t\t\t\treject,\n\t\t\t} );\n\n\t\t\tif ( this.autoUpdate ) {\n\n\t\t\t\tthis.scheduleJobRun();\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tremove( item ) {\n\n\t\tconst items = this.items;\n\t\tconst callbacks = this.callbacks;\n\n\t\tconst index = items.indexOf( item );\n\t\tif ( index !== - 1 ) {\n\n\t\t\titems.splice( index, 1 );\n\t\t\tcallbacks.delete( item );\n\n\t\t}\n\n\t}\n\n\ttryRunJobs() {\n\n\t\tthis.sort();\n\n\t\tconst items = this.items;\n\t\tconst callbacks = this.callbacks;\n\t\tconst maxJobs = this.maxJobs;\n\t\tlet iterated = 0;\n\n\t\tconst completedCallback = () => {\n\n\t\t\tthis.currJobs --;\n\n\t\t\tif ( this.autoUpdate ) {\n\n\t\t\t\tthis.scheduleJobRun();\n\n\t\t\t}\n\n\t\t};\n\n\t\twhile ( maxJobs > this.currJobs && items.length > 0 && iterated < maxJobs ) {\n\n\t\t\tthis.currJobs ++;\n\t\t\titerated ++;\n\t\t\tconst item = items.pop();\n\t\t\tconst { callback, resolve, reject } = callbacks.get( item );\n\t\t\tcallbacks.delete( item );\n\n\t\t\tlet result;\n\t\t\ttry {\n\n\t\t\t\tresult = callback( item );\n\n\t\t\t} catch ( err ) {\n\n\t\t\t\treject( err );\n\t\t\t\tcompletedCallback();\n\n\t\t\t}\n\n\t\t\tif ( result instanceof Promise ) {\n\n\t\t\t\tresult\n\t\t\t\t\t.then( resolve )\n\t\t\t\t\t.catch( reject )\n\t\t\t\t\t.finally( completedCallback );\n\n\t\t\t} else {\n\n\t\t\t\tresolve( result );\n\t\t\t\tcompletedCallback();\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tscheduleJobRun() {\n\n\t\tif ( ! this.scheduled ) {\n\n\t\t\tthis.schedulingCallback( this._runjobs );\n\n\t\t\tthis.scheduled = true;\n\n\t\t}\n\n\t}\n\n}\n\nexport { PriorityQueue };\n","// FAILED is negative so lru cache priority sorting will unload it first\nexport const FAILED = - 1;\nexport const UNLOADED = 0;\nexport const LOADING = 1;\nexport const PARSING = 2;\nexport const LOADED = 3;\n\n// https://en.wikipedia.org/wiki/World_Geodetic_System\n// https://en.wikipedia.org/wiki/Flattening\nexport const WGS84_RADIUS = 6378137;\nexport const WGS84_FLATTENING = 1 / 298.257223563;\nexport const WGS84_HEIGHT = - ( WGS84_FLATTENING * WGS84_RADIUS - WGS84_RADIUS );\n","import { LOADED, FAILED, UNLOADED } from './constants.js';\n\nconst viewErrorTarget = {\n\tinView: false,\n\terror: Infinity,\n\tdistance: Infinity,\n};\n\nfunction isDownloadFinished( value ) {\n\n\treturn value === LOADED || value === FAILED;\n\n}\n\n// Checks whether this tile was last used on the given frame.\nfunction isUsedThisFrame( tile, frameCount ) {\n\n\treturn tile.__lastFrameVisited === frameCount && tile.__used;\n\n}\n\nfunction areChildrenProcessed( tile ) {\n\n\treturn tile.__childrenProcessed === tile.children.length;\n\n}\n\n// Resets the frame frame information for the given tile\nfunction resetFrameState( tile, renderer ) {\n\n\tif ( tile.__lastFrameVisited !== renderer.frameCount ) {\n\n\t\ttile.__lastFrameVisited = renderer.frameCount;\n\t\ttile.__used = false;\n\t\ttile.__inFrustum = false;\n\t\ttile.__isLeaf = false;\n\t\ttile.__visible = false;\n\t\ttile.__active = false;\n\t\ttile.__error = Infinity;\n\t\ttile.__distanceFromCamera = Infinity;\n\t\ttile.__childrenWereVisible = false;\n\t\ttile.__allChildrenLoaded = false;\n\n\t\t// update tile frustum and error state\n\t\trenderer.calculateTileViewError( tile, viewErrorTarget );\n\t\ttile.__inFrustum = viewErrorTarget.inView;\n\t\ttile.__error = viewErrorTarget.error;\n\t\ttile.__distanceFromCamera = viewErrorTarget.distance;\n\n\t}\n\n}\n\n// Recursively mark tiles used down to the next tile with content\nfunction recursivelyMarkUsed( tile, renderer ) {\n\n\trenderer.ensureChildrenArePreprocessed( tile );\n\n\tresetFrameState( tile, renderer );\n\tmarkUsed( tile, renderer );\n\n\t// don't traverse if the children have not been processed, yet\n\tif ( ! tile.__hasRenderableContent && areChildrenProcessed( tile ) ) {\n\n\t\tconst children = tile.children;\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\trecursivelyMarkUsed( children[ i ], renderer );\n\n\t\t}\n\n\t}\n\n}\n\n// Recursively traverses to the next tiles with unloaded renderable content to load them\nfunction recursivelyLoadNextRenderableTiles( tile, renderer ) {\n\n\trenderer.ensureChildrenArePreprocessed( tile );\n\n\t// exit the recursion if the tile hasn't been used this frame\n\tif ( isUsedThisFrame( tile, renderer.frameCount ) ) {\n\n\t\t// queue this tile to download content\n\t\tif ( tile.__hasContent && tile.__loadingState === UNLOADED && ! renderer.lruCache.isFull() ) {\n\n\t\t\trenderer.queueTileForDownload( tile );\n\n\t\t}\n\n\t\tif ( areChildrenProcessed( tile ) ) {\n\n\t\t\t// queue any used child tiles\n\t\t\tconst children = tile.children;\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\trecursivelyLoadNextRenderableTiles( children[ i ], renderer );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\n// Mark a tile as being used by current view\nfunction markUsed( tile, renderer ) {\n\n\tif ( tile.__used ) {\n\n\t\treturn;\n\n\t}\n\n\ttile.__used = true;\n\trenderer.markTileUsed( tile );\n\trenderer.stats.used ++;\n\n\tif ( tile.__inFrustum === true ) {\n\n\t\trenderer.stats.inFrustum ++;\n\n\t}\n\n}\n\n// Returns whether the tile can be traversed to the next layer of children by checking the tile metrics\nfunction canTraverse( tile, renderer ) {\n\n\t// If we've met the error requirements then don't load further\n\tif ( tile.__error <= renderer.errorTarget ) {\n\n\t\treturn false;\n\n\t}\n\n\t// Early out if we've reached the maximum allowed depth.\n\tif ( renderer.maxDepth > 0 && tile.__depth + 1 >= renderer.maxDepth ) {\n\n\t\treturn false;\n\n\t}\n\n\t// Early out if the children haven't been processed, yet\n\tif ( ! areChildrenProcessed( tile ) ) {\n\n\t\treturn false;\n\n\t}\n\n\treturn true;\n\n}\n\n// Helper function for traversing a tile set. If `beforeCb` returns `true` then the\n// traversal will end early.\nexport function traverseSet( tile, beforeCb = null, afterCb = null ) {\n\n\tconst stack = [];\n\n\t// A stack-based, depth-first traversal, storing\n\t// triplets (tile, parent, depth) in the stack array.\n\n\tstack.push( tile );\n\tstack.push( null );\n\tstack.push( 0 );\n\n\twhile ( stack.length > 0 ) {\n\n\t\tconst depth = stack.pop();\n\t\tconst parent = stack.pop();\n\t\tconst tile = stack.pop();\n\n\t\tif ( beforeCb && beforeCb( tile, parent, depth ) ) {\n\n\t\t\tif ( afterCb ) {\n\n\t\t\t\tafterCb( tile, parent, depth );\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst children = tile.children;\n\n\t\t// Children might be undefined if the tile has not been preprocessed yet\n\t\tif ( children ) {\n\n\t\t\tfor ( let i = children.length - 1; i >= 0; i -- ) {\n\n\t\t\t\tstack.push( children[ i ] );\n\t\t\t\tstack.push( tile );\n\t\t\t\tstack.push( depth + 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( afterCb ) {\n\n\t\t\tafterCb( tile, parent, depth );\n\n\t\t}\n\n\t}\n\n}\n\n// Determine which tiles are used by the renderer given the current camera configuration\nexport function markUsedTiles( tile, renderer ) {\n\n\t// determine frustum set is run first so we can ensure the preprocessing of all the necessary\n\t// child tiles has happened here.\n\trenderer.ensureChildrenArePreprocessed( tile );\n\n\tresetFrameState( tile, renderer );\n\n\tif ( ! tile.__inFrustum ) {\n\n\t\treturn;\n\n\t}\n\n\tif ( ! canTraverse( tile, renderer ) ) {\n\n\t\tmarkUsed( tile, renderer );\n\t\treturn;\n\n\t}\n\n\t// Traverse children and see if any children are in view.\n\tlet anyChildrenUsed = false;\n\tlet anyChildrenInFrustum = false;\n\tconst children = tile.children;\n\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\tconst c = children[ i ];\n\t\tmarkUsedTiles( c, renderer );\n\t\tanyChildrenUsed = anyChildrenUsed || isUsedThisFrame( c, renderer.frameCount );\n\t\tanyChildrenInFrustum = anyChildrenInFrustum || c.__inFrustum;\n\n\t}\n\n\t// Disabled for now because this will cause otherwise unused children to be added to the lru cache\n\t// if none of the children are in the frustum then this tile shouldn't be displayed\n\tif ( tile.refine === 'REPLACE' && ! anyChildrenInFrustum && children.length !== 0 && ! tile.__hasUnrenderableContent ) {\n\n\t\t// TODO: we're not checking tiles with unrenderable content here since external tile sets might look like they're in the frustum,\n\t\t// load the children, then the children indicate that it's not visible, causing it to be unloaded. Then it will be loaded again.\n\t\t// The impact when including external tile set roots in the check is more significant but can't be used unless we keep external tile\n\t\t// sets around even when they're not needed. See issue #741.\n\n\t\t// TODO: what if we mark the tile as not in the frustum but we _do_ mark it as used? Then we can stop frustum traversal and at least\n\t\t// prevent tiles from rendering unless they're needed.\n\t\ttile.__inFrustum = false;\n\t\treturn;\n\n\t}\n\n\t// wait until after the above condition to mark the traversed tile as used or not\n\tmarkUsed( tile, renderer );\n\n\t// If this is a tile that needs children loaded to refine then recursively load child\n\t// tiles until error is met\n\tif ( anyChildrenUsed && tile.refine === 'REPLACE' ) {\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tconst c = children[ i ];\n\t\t\trecursivelyMarkUsed( c, renderer );\n\n\t\t}\n\n\t}\n\n}\n\n// Traverse and mark the tiles that are at the leaf nodes of the \"used\" tree.\nexport function markUsedSetLeaves( tile, renderer ) {\n\n\tconst frameCount = renderer.frameCount;\n\tif ( ! isUsedThisFrame( tile, frameCount ) ) {\n\n\t\treturn;\n\n\t}\n\n\t// This tile is a leaf if none of the children had been used.\n\tconst children = tile.children;\n\tlet anyChildrenUsed = false;\n\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\tconst c = children[ i ];\n\t\tanyChildrenUsed = anyChildrenUsed || isUsedThisFrame( c, frameCount );\n\n\t}\n\n\tif ( ! anyChildrenUsed ) {\n\n\t\ttile.__isLeaf = true;\n\n\t} else {\n\n\t\tlet childrenWereVisible = false;\n\t\tlet allChildrenLoaded = true;\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tconst c = children[ i ];\n\t\t\tmarkUsedSetLeaves( c, renderer );\n\t\t\tchildrenWereVisible = childrenWereVisible || c.__wasSetVisible || c.__childrenWereVisible;\n\n\t\t\tif ( isUsedThisFrame( c, frameCount ) ) {\n\n\t\t\t\t// consider a child to be loaded if\n\t\t\t\t// - the children's children have been loaded\n\t\t\t\t// - the tile content has loaded\n\t\t\t\t// - the tile is completely empty - ie has no children and no content\n\t\t\t\t// - the child tile set has tried to load but failed\n\t\t\t\tconst childLoaded =\n\t\t\t\t\tc.__allChildrenLoaded ||\n\t\t\t\t\t( c.__hasRenderableContent && isDownloadFinished( c.__loadingState ) ) ||\n\t\t\t\t\t( ! c.__hasContent && c.children.length === 0 ) ||\n\t\t\t\t\t( c.__hasUnrenderableContent && c.__loadingState === FAILED );\n\t\t\t\tallChildrenLoaded = allChildrenLoaded && childLoaded;\n\n\t\t\t}\n\n\t\t}\n\n\t\ttile.__childrenWereVisible = childrenWereVisible;\n\t\ttile.__allChildrenLoaded = allChildrenLoaded;\n\n\t}\n\n}\n\n// TODO: revisit implementation\n// Skip past tiles we consider unrenderable because they are outside the error threshold.\nexport function markVisibleTiles( tile, renderer ) {\n\n\tconst stats = renderer.stats;\n\tif ( ! isUsedThisFrame( tile, renderer.frameCount ) ) {\n\n\t\treturn;\n\n\t}\n\n\t// Request the tile contents or mark it as visible if we've found a leaf.\n\tconst lruCache = renderer.lruCache;\n\tif ( tile.__isLeaf ) {\n\n\t\tif ( tile.__loadingState === LOADED ) {\n\n\t\t\tif ( tile.__inFrustum ) {\n\n\t\t\t\ttile.__visible = true;\n\t\t\t\tstats.visible ++;\n\n\t\t\t}\n\t\t\ttile.__active = true;\n\t\t\tstats.active ++;\n\n\t\t} else if ( ! lruCache.isFull() && tile.__hasContent ) {\n\n\t\t\trenderer.queueTileForDownload( tile );\n\n\t\t}\n\n\t\treturn;\n\n\t}\n\n\tconst children = tile.children;\n\tconst hasContent = tile.__hasContent;\n\tconst loadedContent = isDownloadFinished( tile.__loadingState ) && hasContent;\n\tconst errorRequirement = ( renderer.errorTarget + 1 ) * renderer.errorThreshold;\n\tconst meetsSSE = tile.__error <= errorRequirement;\n\tconst childrenWereVisible = tile.__childrenWereVisible;\n\n\t// NOTE: We can \"trickle\" root tiles in by enabling these lines.\n\t// Don't wait for all children tiles to load if this tile set has empty tiles at the root\n\t// const emptyRootTile = tile.__depthFromRenderedParent === 0;\n\t// const allChildrenLoaded = tile.__allChildrenLoaded || emptyRootTile;\n\n\t// If we've met the SSE requirements and we can load content then fire a fetch.\n\tconst allChildrenLoaded = tile.__allChildrenLoaded;\n\tconst includeTile = meetsSSE || tile.refine === 'ADD';\n\tif ( includeTile && ! loadedContent && ! lruCache.isFull() && hasContent ) {\n\n\t\trenderer.queueTileForDownload( tile );\n\n\t}\n\n\t// Only mark this tile as visible if it meets the screen space error requirements, has loaded content, not\n\t// all children have loaded yet, and if no children were visible last frame. We want to keep children visible\n\t// that _were_ visible to avoid a pop in level of detail as the camera moves around and parent / sibling tiles\n\t// load in.\n\n\t// Skip the tile entirely if there's no content to load\n\tif (\n\t\t( meetsSSE && ! allChildrenLoaded && ! childrenWereVisible && loadedContent )\n\t\t\t|| ( tile.refine === 'ADD' && loadedContent )\n\t) {\n\n\t\tif ( tile.__inFrustum ) {\n\n\t\t\ttile.__visible = true;\n\t\t\tstats.visible ++;\n\n\t\t}\n\t\ttile.__active = true;\n\t\tstats.active ++;\n\n\t}\n\n\t// If we're additive then don't stop the traversal here because it doesn't matter whether the children load in\n\t// at the same rate.\n\tif ( tile.refine === 'REPLACE' && meetsSSE && ! allChildrenLoaded ) {\n\n\t\t// load the child content if we've found that we've been loaded so we can move down to the next tile\n\t\t// layer when the data has loaded.\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tconst c = children[ i ];\n\t\t\tif ( isUsedThisFrame( c, renderer.frameCount ) ) {\n\n\t\t\t\trecursivelyLoadNextRenderableTiles( c, renderer );\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tmarkVisibleTiles( children[ i ], renderer );\n\n\t\t}\n\n\t}\n\n}\n\n// Final traverse to toggle tile visibility.\nexport function toggleTiles( tile, renderer ) {\n\n\tconst isUsed = isUsedThisFrame( tile, renderer.frameCount );\n\tif ( isUsed || tile.__usedLastFrame ) {\n\n\t\tlet setActive = false;\n\t\tlet setVisible = false;\n\t\tif ( isUsed ) {\n\n\t\t\t// enable visibility if active due to shadows\n\t\t\tsetActive = tile.__active;\n\t\t\tif ( renderer.displayActiveTiles ) {\n\n\t\t\t\tsetVisible = tile.__active || tile.__visible;\n\n\t\t\t} else {\n\n\t\t\t\tsetVisible = tile.__visible;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// if the tile was used last frame but not this one then there's potential for the tile\n\t\t\t// to not have been visited during the traversal, meaning it hasn't been reset and has\n\t\t\t// stale values. This ensures the values are not stale.\n\t\t\tresetFrameState( tile, renderer );\n\n\t\t}\n\n\t\t// If the active or visible state changed then call the functions.\n\t\tif ( tile.__hasRenderableContent && tile.__loadingState === LOADED ) {\n\n\t\t\tif ( tile.__wasSetActive !== setActive ) {\n\n\t\t\t\trenderer.invokeOnePlugin( plugin => plugin.setTileActive && plugin.setTileActive( tile, setActive ) );\n\n\t\t\t}\n\n\t\t\tif ( tile.__wasSetVisible !== setVisible ) {\n\n\t\t\t\trenderer.invokeOnePlugin( plugin => plugin.setTileVisible && plugin.setTileVisible( tile, setVisible ) );\n\n\t\t\t}\n\n\t\t}\n\t\ttile.__wasSetActive = setActive;\n\t\ttile.__wasSetVisible = setVisible;\n\t\ttile.__usedLastFrame = isUsed;\n\n\t\tconst children = tile.children;\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tconst c = children[ i ];\n\t\t\ttoggleTiles( c, renderer );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Traverses the ancestry of the tile up to the root tile.\n */\nexport function traverseAncestors( tile, callback = null ) {\n\n\tlet current = tile;\n\n\twhile ( current ) {\n\n\t\tconst depth = current.__depth;\n\t\tconst parent = current.parent;\n\n\t\tif ( callback ) {\n\n\t\t\tcallback( current, parent, depth );\n\n\t\t}\n\n\t\tcurrent = parent;\n\n\t}\n\n\n}\n","// function that rate limits the amount of time a function can be called to once\n// per frame, initially queuing a new call for the next frame.\nexport function throttle( callback ) {\n\n\tlet handle = null;\n\treturn () => {\n\n\t\tif ( handle === null ) {\n\n\t\t\thandle = requestAnimationFrame( () => {\n\n\t\t\t\thandle = null;\n\t\t\t\tcallback();\n\n\t\t\t} );\n\n\t\t}\n\n\t};\n\n}\n","import { getUrlExtension } from '../utilities/urlExtension.js';\nimport { LRUCache } from '../utilities/LRUCache.js';\nimport { PriorityQueue } from '../utilities/PriorityQueue.js';\nimport { markUsedTiles, toggleTiles, markVisibleTiles, markUsedSetLeaves, traverseSet } from './traverseFunctions.js';\nimport { UNLOADED, LOADING, PARSING, LOADED, FAILED } from './constants.js';\nimport { throttle } from '../utilities/throttle.js';\n\nconst PLUGIN_REGISTERED = Symbol( 'PLUGIN_REGISTERED' );\n\n// priority queue sort function that takes two tiles to compare. Returning 1 means\n// \"tile a\" is loaded first.\nconst priorityCallback = ( a, b ) => {\n\n\tif ( a.__depthFromRenderedParent !== b.__depthFromRenderedParent ) {\n\n\t\t// load shallower tiles first using \"depth from rendered parent\" to help\n\t\t// even out depth disparities caused by non-content parent tiles\n\t\treturn a.__depthFromRenderedParent > b.__depthFromRenderedParent ? - 1 : 1;\n\n\t} else if ( a.__inFrustum !== b.__inFrustum ) {\n\n\t\t// load tiles that are in the frustum at the current depth\n\t\treturn a.__inFrustum ? 1 : - 1;\n\n\t} else if ( a.__used !== b.__used ) {\n\n\t\t// load tiles that have been used\n\t\treturn a.__used ? 1 : - 1;\n\n\t} else if ( a.__error !== b.__error ) {\n\n\t\t// load the tile with the higher error\n\t\treturn a.__error > b.__error ? 1 : - 1;\n\n\t} else if ( a.__distanceFromCamera !== b.__distanceFromCamera ) {\n\n\t\t// and finally visible tiles which have equal error (ex: if geometricError === 0)\n\t\t// should prioritize based on distance.\n\t\treturn a.__distanceFromCamera > b.__distanceFromCamera ? - 1 : 1;\n\n\t}\n\n\treturn 0;\n\n};\n\n// lru cache unload callback that takes two tiles to compare. Returning 1 means \"tile a\"\n// is unloaded first.\nconst lruPriorityCallback = ( a, b ) => {\n\n\tif ( a.__depthFromRenderedParent !== b.__depthFromRenderedParent ) {\n\n\t\t// dispose of deeper tiles first\n\t\treturn a.__depthFromRenderedParent > b.__depthFromRenderedParent ? 1 : - 1;\n\n\t} else if ( a.__loadingState !== b.__loadingState ) {\n\n\t\t// dispose of tiles that are earlier along in the loading process first\n\t\treturn a.__loadingState > b.__loadingState ? - 1 : 1;\n\n\t} else if ( a.__lastFrameVisited !== b.__lastFrameVisited ) {\n\n\t\t// dispose of least recent tiles first\n\t\treturn a.__lastFrameVisited > b.__lastFrameVisited ? - 1 : 1;\n\n\t} else if ( a.__hasUnrenderableContent !== b.__hasUnrenderableContent ) {\n\n\t\t// dispose of external tile sets last\n\t\treturn a.__hasUnrenderableContent ? - 1 : 1;\n\n\t} else if ( a.__error !== b.__error ) {\n\n\t\t// unload the tile with lower error\n\t\treturn a.__error > b.__error ? - 1 : 1;\n\n\t}\n\n\treturn 0;\n\n};\n\nexport class TilesRendererBase {\n\n\tget root() {\n\n\t\tconst tileSet = this.rootTileSet;\n\t\treturn tileSet ? tileSet.root : null;\n\n\t}\n\n\tget loadProgress() {\n\n\t\tconst { stats, isLoading } = this;\n\t\tconst loading = stats.downloading + stats.parsing;\n\t\tconst total = stats.inCacheSinceLoad + ( isLoading ? 1 : 0 );\n\t\treturn total === 0 ? 1.0 : 1.0 - loading / total;\n\n\t}\n\n\tget errorThreshold() {\n\n\t\treturn this._errorThreshold;\n\n\t}\n\n\tset errorThreshold( v ) {\n\n\t\tconsole.warn( 'TilesRenderer: The \"errorThreshold\" option has been deprecated.' );\n\t\tthis._errorThreshold = v;\n\n\t}\n\n\tconstructor( url = null ) {\n\n\t\t// state\n\t\tthis.rootLoadingState = UNLOADED;\n\t\tthis.rootTileSet = null;\n\t\tthis.rootURL = url;\n\t\tthis.fetchOptions = {};\n\t\tthis.plugins = [];\n\t\tthis.queuedTiles = [];\n\t\tthis.cachedSinceLoadComplete = new Set();\n\t\tthis.isLoading = false;\n\n\t\tconst lruCache = new LRUCache();\n\t\tlruCache.unloadPriorityCallback = lruPriorityCallback;\n\n\t\tconst downloadQueue = new PriorityQueue();\n\t\tdownloadQueue.maxJobs = 10;\n\t\tdownloadQueue.priorityCallback = priorityCallback;\n\n\t\tconst parseQueue = new PriorityQueue();\n\t\tparseQueue.maxJobs = 1;\n\t\tparseQueue.priorityCallback = priorityCallback;\n\n\t\tconst processNodeQueue = new PriorityQueue();\n\t\tprocessNodeQueue.maxJobs = 25;\n\t\tprocessNodeQueue.priorityCallback = priorityCallback;\n\t\tprocessNodeQueue.log = true;\n\n\t\tthis.visibleTiles = new Set();\n\t\tthis.activeTiles = new Set();\n\t\tthis.usedSet = new Set();\n\t\tthis.lruCache = lruCache;\n\t\tthis.downloadQueue = downloadQueue;\n\t\tthis.parseQueue = parseQueue;\n\t\tthis.processNodeQueue = processNodeQueue;\n\t\tthis.stats = {\n\t\t\tinCacheSinceLoad: 0,\n\t\t\tinCache: 0,\n\t\t\tparsing: 0,\n\t\t\tdownloading: 0,\n\t\t\tfailed: 0,\n\t\t\tinFrustum: 0,\n\t\t\tused: 0,\n\t\t\tactive: 0,\n\t\t\tvisible: 0,\n\t\t};\n\t\tthis.frameCount = 0;\n\n\t\t// callbacks\n\t\tthis._dispatchNeedsUpdateEvent = throttle( () => {\n\n\t\t\tthis.dispatchEvent( { type: 'needs-update' } );\n\n\t\t} );\n\n\t\t// options\n\t\tthis.errorTarget = 16.0;\n\t\tthis._errorThreshold = Infinity;\n\t\tthis.displayActiveTiles = false;\n\t\tthis.maxDepth = Infinity;\n\n\t}\n\n\t// Plugins\n\tregisterPlugin( plugin ) {\n\n\t\tif ( plugin[ PLUGIN_REGISTERED ] === true ) {\n\n\t\t\tthrow new Error( 'TilesRendererBase: A plugin can only be registered to a single tile set' );\n\n\t\t}\n\n\t\t// insert the plugin based on the priority registered on the plugin\n\t\tconst plugins = this.plugins;\n\t\tconst priority = plugin.priority || 0;\n\t\tlet insertionPoint = plugins.length;\n\t\tfor ( let i = 0; i < plugins.length; i ++ ) {\n\n\t\t\tconst otherPriority = plugins[ i ].priority || 0;\n\t\t\tif ( otherPriority > priority ) {\n\n\t\t\t\tinsertionPoint = i;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tplugins.splice( insertionPoint, 0, plugin );\n\t\tplugin[ PLUGIN_REGISTERED ] = true;\n\t\tif ( plugin.init ) {\n\n\t\t\tplugin.init( this );\n\n\t\t}\n\n\t}\n\n\tunregisterPlugin( plugin ) {\n\n\t\tconst plugins = this.plugins;\n\t\tif ( typeof plugin === 'string' ) {\n\n\t\t\tplugin = this.getPluginByName( name );\n\n\t\t}\n\n\t\tif ( plugins.includes( plugin ) ) {\n\n\t\t\tconst index = plugins.indexOf( plugin );\n\t\t\tplugins.splice( index, 1 );\n\t\t\tif ( plugin.dispose ) {\n\n\t\t\t\tplugin.dispose();\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tgetPluginByName( name ) {\n\n\t\treturn this.plugins.find( p => p.name === name ) || null;\n\n\t}\n\n\ttraverse( beforecb, aftercb, ensureFullyProcessed = true ) {\n\n\t\tif ( ! this.root ) return;\n\n\t\ttraverseSet( this.root, ( tile, ...args ) => {\n\n\t\t\tif ( ensureFullyProcessed ) {\n\n\t\t\t\tthis.ensureChildrenArePreprocessed( tile, true );\n\n\t\t\t}\n\n\t\t\treturn beforecb ? beforecb( tile, ...args ) : false;\n\n\t\t}, aftercb );\n\n\t}\n\n\tqueueTileForDownload( tile ) {\n\n\t\tif ( tile.__loadingState !== UNLOADED ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.queuedTiles.push( tile );\n\n\t}\n\n\tmarkTileUsed( tile ) {\n\n\t\t// save the tile in a separate \"used set\" so we can mark it as unused\n\t\t// before the next tile set traversal\n\t\tthis.usedSet.add( tile );\n\t\tthis.lruCache.markUsed( tile );\n\n\t}\n\n\t// Public API\n\tupdate() {\n\n\t\tconst { lruCache, usedSet, stats, root, downloadQueue, parseQueue, processNodeQueue } = this;\n\t\tif ( this.rootLoadingState === UNLOADED ) {\n\n\t\t\tthis.rootLoadingState = LOADING;\n\t\t\tthis.invokeOnePlugin( plugin => plugin.loadRootTileSet && plugin.loadRootTileSet() )\n\t\t\t\t.then( root => {\n\n\t\t\t\t\tthis.rootLoadingState = LOADED;\n\t\t\t\t\tthis.rootTileSet = root;\n\t\t\t\t\tthis.dispatchEvent( { type: 'needs-update' } );\n\t\t\t\t\tthis.dispatchEvent( { type: 'load-content' } );\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'load-tile-set',\n\t\t\t\t\t\ttileSet: root,\n\t\t\t\t\t} );\n\n\t\t\t\t} )\n\t\t\t\t.catch( error => {\n\n\t\t\t\t\tthis.rootLoadingState = FAILED;\n\t\t\t\t\tconsole.error( error );\n\n\t\t\t\t\tthis.rootTileSet = null;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'load-error',\n\t\t\t\t\t\ttile: null,\n\t\t\t\t\t\terror,\n\t\t\t\t\t} );\n\n\t\t\t\t} );\n\n\t\t}\n\n\t\tif ( ! root ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tstats.inFrustum = 0;\n\t\tstats.used = 0;\n\t\tstats.active = 0;\n\t\tstats.visible = 0;\n\t\tthis.frameCount ++;\n\n\t\tusedSet.forEach( tile => lruCache.markUnused( tile ) );\n\t\tusedSet.clear();\n\n\t\tmarkUsedTiles( root, this );\n\t\tmarkUsedSetLeaves( root, this );\n\t\tmarkVisibleTiles( root, this );\n\t\ttoggleTiles( root, this );\n\n\t\t// TODO: This will only sort for one tile set. We may want to store this queue on the\n\t\t// LRUCache so multiple tile sets can use it at once\n\t\t// start the downloads of the tiles as needed\n\t\tconst queuedTiles = this.queuedTiles;\n\t\tqueuedTiles.sort( lruCache.unloadPriorityCallback );\n\t\tfor ( let i = 0, l = queuedTiles.length; i < l && ! lruCache.isFull(); i ++ ) {\n\n\t\t\tthis.requestTileContents( queuedTiles[ i ] );\n\n\t\t}\n\n\t\tqueuedTiles.length = 0;\n\n\t\t// start the downloads\n\t\tlruCache.scheduleUnload();\n\n\t\t// if all tasks have finished and we've been marked as actively loading then fire the completion event\n\t\tconst runningTasks = downloadQueue.running || parseQueue.running || processNodeQueue.running;\n\t\tif ( runningTasks === false && this.isLoading === true ) {\n\n\t\t\tthis.cachedSinceLoadComplete.clear();\n\t\t\tstats.inCacheSinceLoad = 0;\n\n\t\t\tthis.dispatchEvent( { type: 'tiles-load-end' } );\n\t\t\tthis.isLoading = false;\n\n\t\t}\n\n\t}\n\n\tresetFailedTiles() {\n\n\t\t// reset the root tile if it's finished but never loaded\n\t\tif ( this.rootLoadingState === FAILED ) {\n\n\t\t\tthis.rootLoadingState = UNLOADED;\n\n\t\t}\n\n\t\tconst stats = this.stats;\n\t\tif ( stats.failed === 0 ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.traverse( tile => {\n\n\t\t\tif ( tile.__loadingState === FAILED ) {\n\n\t\t\t\ttile.__loadingState = UNLOADED;\n\n\t\t\t}\n\n\t\t}, null, false );\n\n\t\tstats.failed = 0;\n\n\t}\n\n\tdispose() {\n\n\t\t// dispose of all the plugins\n\t\tthis.plugins.forEach( plugin => {\n\n\t\t\tthis.unregisterPlugin( plugin );\n\n\t\t} );\n\n\t\tconst lruCache = this.lruCache;\n\n\t\t// Make sure we've collected all children before disposing of the internal tilesets to avoid\n\t\t// dangling children that we inadvertantly skip when deleting the nested tileset.\n\t\tconst toRemove = [];\n\t\tthis.traverse( t => {\n\n\t\t\ttoRemove.push( t );\n\t\t\treturn false;\n\n\t\t}, null, false );\n\t\tfor ( let i = 0, l = toRemove.length; i < l; i ++ ) {\n\n\t\t\tlruCache.remove( toRemove[ i ] );\n\n\t\t}\n\n\t\tthis.stats = {\n\t\t\tparsing: 0,\n\t\t\tdownloading: 0,\n\t\t\tfailed: 0,\n\t\t\tinFrustum: 0,\n\t\t\tused: 0,\n\t\t\tactive: 0,\n\t\t\tvisible: 0,\n\t\t};\n\t\tthis.frameCount = 0;\n\n\t}\n\n\t// Overrideable\n\tdispatchEvent( e ) {\n\n\t\t// event to be overriden for dispatching via an event system\n\n\t}\n\n\tfetchData( url, options ) {\n\n\t\treturn fetch( url, options );\n\n\t}\n\n\tparseTile( buffer, tile, extension ) {\n\n\t\treturn null;\n\n\t}\n\n\tdisposeTile( tile ) {\n\n\t\t// TODO: are these necessary? Are we disposing tiles when they are currently visible?\n\t\tif ( tile.__visible ) {\n\n\t\t\tthis.invokeOnePlugin( plugin => plugin.setTileVisible && plugin.setTileVisible( tile, false ) );\n\t\t\ttile.__visible = false;\n\n\t\t}\n\n\t\tif ( tile.__active ) {\n\n\t\t\tthis.invokeOnePlugin( plugin => plugin.setTileActive && plugin.setTileActive( tile, false ) );\n\t\t\ttile.__active = false;\n\n\t\t}\n\n\t}\n\n\tpreprocessNode( tile, tileSetDir, parentTile = null ) {\n\n\t\tif ( tile.content ) {\n\n\t\t\t// Fix old file formats\n\t\t\tif ( ! ( 'uri' in tile.content ) && 'url' in tile.content ) {\n\n\t\t\t\ttile.content.uri = tile.content.url;\n\t\t\t\tdelete tile.content.url;\n\n\t\t\t}\n\n\t\t\t// NOTE: fix for some cases where tilesets provide the bounding volume\n\t\t\t// but volumes are not present.\n\t\t\tif (\n\t\t\t\ttile.content.boundingVolume &&\n\t\t\t\t! (\n\t\t\t\t\t'box' in tile.content.boundingVolume ||\n\t\t\t\t\t'sphere' in tile.content.boundingVolume ||\n\t\t\t\t\t'region' in tile.content.boundingVolume\n\t\t\t\t)\n\t\t\t) {\n\n\t\t\t\tdelete tile.content.boundingVolume;\n\n\t\t\t}\n\n\t\t}\n\n\t\ttile.parent = parentTile;\n\t\ttile.children = tile.children || [];\n\n\t\tif ( tile.content?.uri ) {\n\n\t\t\t// \"content\" should only indicate loadable meshes, not external tile sets\n\t\t\tconst extension = getUrlExtension( tile.content.uri );\n\n\t\t\ttile.__hasContent = true;\n\t\t\ttile.__hasUnrenderableContent = Boolean( extension && /json$/.test( extension ) );\n\t\t\ttile.__hasRenderableContent = ! tile.__hasUnrenderableContent;\n\n\t\t} else {\n\n\t\t\ttile.__hasContent = false;\n\t\t\ttile.__hasUnrenderableContent = false;\n\t\t\ttile.__hasRenderableContent = false;\n\n\t\t}\n\n\t\t// tracker for determining if all the children have been asynchronously\n\t\t// processed and are ready to be traversed\n\t\ttile.__childrenProcessed = 0;\n\t\tif ( parentTile ) {\n\n\t\t\tparentTile.__childrenProcessed ++;\n\n\t\t}\n\n\t\ttile.__distanceFromCamera = Infinity;\n\t\ttile.__error = Infinity;\n\n\t\ttile.__inFrustum = false;\n\t\ttile.__isLeaf = false;\n\n\t\ttile.__usedLastFrame = false;\n\t\ttile.__used = false;\n\n\t\ttile.__wasSetVisible = false;\n\t\ttile.__visible = false;\n\t\ttile.__childrenWereVisible = false;\n\t\ttile.__allChildrenLoaded = false;\n\n\t\ttile.__wasSetActive = false;\n\t\ttile.__active = false;\n\n\t\ttile.__loadingState = UNLOADED;\n\n\t\tif ( parentTile === null ) {\n\n\t\t\ttile.__depth = 0;\n\t\t\ttile.__depthFromRenderedParent = ( tile.__hasRenderableContent ? 1 : 0 );\n\t\t\ttile.refine = tile.refine || 'REPLACE';\n\n\t\t} else {\n\n\t\t\t// increment the \"depth from parent\" when we encounter a new tile with content\n\t\t\ttile.__depth = parentTile.__depth + 1;\n\t\t\ttile.__depthFromRenderedParent = parentTile.__depthFromRenderedParent + ( tile.__hasRenderableContent ? 1 : 0 );\n\n\t\t\ttile.refine = tile.refine || parentTile.refine;\n\n\t\t}\n\n\t\ttile.__basePath = tileSetDir;\n\n\t\ttile.__lastFrameVisited = - 1;\n\n\t\tthis.invokeAllPlugins( plugin => {\n\n\t\t\tplugin !== this && plugin.preprocessNode && plugin.preprocessNode( tile, tileSetDir, parentTile );\n\n\t\t} );\n\n\t}\n\n\tsetTileActive( tile, active ) {\n\n\t\tactive ? this.activeTiles.add( tile ) : this.activeTiles.delete( tile );\n\n\t}\n\n\tsetTileVisible( tile, visible ) {\n\n\t\tvisible ? this.visibleTiles.add( tile ) : this.visibleTiles.delete( tile );\n\n\t}\n\n\tcalculateTileViewError( tile, target ) {\n\n\t\t// retrieve whether the tile is visible, screen space error, and distance to camera\n\t\t// set \"inView\", \"error\", \"distance\"\n\n\t}\n\n\tensureChildrenArePreprocessed( tile, immediate = false ) {\n\n\t\tconst children = tile.children;\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tconst child = children[ i ];\n\t\t\tif ( '__depth' in child ) {\n\n\t\t\t\t// the child has already been processed\n\t\t\t\tbreak;\n\n\t\t\t} else if ( immediate ) {\n\n\t\t\t\t// process the node immediately and make sure we don't double process it\n\t\t\t\tthis.processNodeQueue.remove( child );\n\t\t\t\tthis.preprocessNode( child, tile.__basePath, tile );\n\n\t\t\t} else {\n\n\t\t\t\t// queue the node for processing if it hasn't been already\n\t\t\t\tif ( ! this.processNodeQueue.has( child ) ) {\n\n\t\t\t\t\tthis.processNodeQueue.add( child, child => {\n\n\t\t\t\t\t\tthis.preprocessNode( child, tile.__basePath, tile );\n\t\t\t\t\t\tthis._dispatchNeedsUpdateEvent();\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// Private Functions\n\tpreprocessTileSet( json, url, parent = null ) {\n\n\t\tconst version = json.asset.version;\n\t\tconst [ major, minor ] = version.split( '.' ).map( v => parseInt( v ) );\n\t\tconsole.assert(\n\t\t\tmajor <= 1,\n\t\t\t'TilesRenderer: asset.version is expected to be a 1.x or a compatible version.',\n\t\t);\n\n\t\tif ( major === 1 && minor > 0 ) {\n\n\t\t\tconsole.warn( 'TilesRenderer: tiles versions at 1.1 or higher have limited support. Some new extensions and features may not be supported.' );\n\n\t\t}\n\n\t\t// remove the last file path path-segment from the URL including the trailing slash\n\t\tlet basePath = url.replace( /\\/[^/]*$/, '' );\n\t\tbasePath = new URL( basePath, window.location.href ).toString();\n\t\tthis.preprocessNode( json.root, basePath, parent );\n\n\t}\n\n\tloadRootTileSet() {\n\n\t\t// transform the url\n\t\tlet processedUrl = this.rootURL;\n\t\tthis.invokeAllPlugins( plugin => processedUrl = plugin.preprocessURL ? plugin.preprocessURL( processedUrl, null ) : processedUrl );\n\n\t\t// load the tile set root\n\t\tconst pr = this\n\t\t\t.invokeOnePlugin( plugin => plugin.fetchData && plugin.fetchData( processedUrl, this.fetchOptions ) )\n\t\t\t.then( res => {\n\n\t\t\t\tif ( res.ok ) {\n\n\t\t\t\t\treturn res.json();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( `TilesRenderer: Failed to load tileset \"${ processedUrl }\" with status ${ res.status } : ${ res.statusText }` );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( root => {\n\n\t\t\t\tthis.preprocessTileSet( root, processedUrl );\n\t\t\t\treturn root;\n\n\t\t\t} );\n\n\t\treturn pr;\n\n\t}\n\n\trequestTileContents( tile ) {\n\n\t\t// If the tile is already being loaded then don't\n\t\t// start it again.\n\t\tif ( tile.__loadingState !== UNLOADED ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tlet isExternalTileSet = false;\n\t\tlet uri = new URL( tile.content.uri, tile.__basePath + '/' ).toString();\n\t\tthis.invokeAllPlugins( plugin => uri = plugin.preprocessURL ? plugin.preprocessURL( uri, tile ) : uri );\n\n\t\tconst stats = this.stats;\n\t\tconst lruCache = this.lruCache;\n\t\tconst downloadQueue = this.downloadQueue;\n\t\tconst parseQueue = this.parseQueue;\n\t\tconst extension = getUrlExtension( uri );\n\n\t\t// track an abort controller and pass-through the below conditions if aborted\n\t\tconst controller = new AbortController();\n\t\tconst signal = controller.signal;\n\t\tconst addedSuccessfully = lruCache.add( tile, t => {\n\n\t\t\t// Stop the load if it's started\n\t\t\tcontroller.abort();\n\n\t\t\t// Clear out all tile content\n\t\t\tif ( isExternalTileSet ) {\n\n\t\t\t\tt.children.length = 0;\n\t\t\t\tt.__childrenProcessed = 0;\n\n\t\t\t} else {\n\n\t\t\t\tthis.invokeAllPlugins( plugin => {\n\n\t\t\t\t\tplugin.disposeTile && plugin.disposeTile( t );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\t// Decrement stats\n\t\t\tstats.inCache --;\n\t\t\tif ( this.cachedSinceLoadComplete.has( tile ) ) {\n\n\t\t\t\tthis.cachedSinceLoadComplete.delete( tile );\n\t\t\t\tstats.inCacheSinceLoad --;\n\n\t\t\t}\n\n\t\t\tif ( t.__loadingState === LOADING ) {\n\n\t\t\t\tstats.downloading --;\n\n\t\t\t} else if ( t.__loadingState === PARSING ) {\n\n\t\t\t\tstats.parsing --;\n\n\t\t\t}\n\n\t\t\tt.__loadingState = UNLOADED;\n\n\t\t\tparseQueue.remove( t );\n\t\t\tdownloadQueue.remove( t );\n\n\t\t} );\n\n\t\t// if we couldn't add the tile to the lru cache because it's full then skip\n\t\tif ( ! addedSuccessfully ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// check if this is the beginning of a new set of tiles to load and dispatch and event\n\t\tif ( ! this.isLoading ) {\n\n\t\t\tthis.isLoading = true;\n\t\t\tthis.dispatchEvent( { type: 'tiles-load-start' } );\n\n\t\t}\n\n\t\tthis.cachedSinceLoadComplete.add( tile );\n\t\tstats.inCacheSinceLoad ++;\n\t\tstats.inCache ++;\n\t\tstats.downloading ++;\n\t\ttile.__loadingState = LOADING;\n\n\t\t// queue the download and parse\n\t\treturn downloadQueue.add( tile, downloadTile => {\n\n\t\t\tif ( signal.aborted ) {\n\n\t\t\t\treturn Promise.resolve();\n\n\t\t\t}\n\n\t\t\treturn this.invokeOnePlugin( plugin => plugin.fetchData && plugin.fetchData( uri, { ...this.fetchOptions, signal } ) );\n\n\t\t} )\n\t\t\t.then( res => {\n\n\t\t\t\tif ( signal.aborted ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( res.ok ) {\n\n\t\t\t\t\treturn extension === 'json' ? res.json() : res.arrayBuffer();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( `Failed to load model with error code ${res.status}` );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( content => {\n\n\t\t\t\t// if it has been unloaded then the tile has been disposed\n\t\t\t\tif ( signal.aborted ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tstats.downloading --;\n\t\t\t\tstats.parsing ++;\n\t\t\t\ttile.__loadingState = PARSING;\n\n\t\t\t\treturn parseQueue.add( tile, parseTile => {\n\n\t\t\t\t\t// if it has been unloaded then the tile has been disposed\n\t\t\t\t\tif ( signal.aborted ) {\n\n\t\t\t\t\t\treturn Promise.resolve();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( extension === 'json' && content.root ) {\n\n\t\t\t\t\t\tthis.preprocessTileSet( content, uri, tile );\n\t\t\t\t\t\ttile.children.push( content.root );\n\t\t\t\t\t\tisExternalTileSet = true;\n\t\t\t\t\t\treturn Promise.resolve();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn this.invokeOnePlugin( plugin => plugin.parseTile && plugin.parseTile( content, parseTile, extension, uri, signal ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t} )\n\t\t\t.then( () => {\n\n\t\t\t\t// if it has been unloaded then the tile has been disposed\n\t\t\t\tif ( signal.aborted ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tstats.parsing --;\n\t\t\t\ttile.__loadingState = LOADED;\n\t\t\t\tlruCache.setLoaded( tile, true );\n\n\t\t\t\t// If the memory of the item hasn't been registered yet then that means the memory usage hasn't\n\t\t\t\t// been accounted for by the cache yet so we need to check if it fits or if we should remove it.\n\t\t\t\tif ( lruCache.getMemoryUsage( tile ) === null ) {\n\n\t\t\t\t\tif ( lruCache.isFull() && lruCache.computeMemoryUsageCallback( tile ) > 0 ) {\n\n\t\t\t\t\t\t// And if the cache is full due to newly loaded memory then lets discard this tile - it will\n\t\t\t\t\t\t// be loaded again later from the disk cache if needed.\n\t\t\t\t\t\tlruCache.remove( tile );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Otherwise update the item to the latest known value\n\t\t\t\t\t\tlruCache.updateMemoryUsage( tile );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// dispatch an event indicating that this model has completed and that a new\n\t\t\t\t// call to \"update\" is needed.\n\t\t\t\tthis.dispatchEvent( { type: 'needs-update' } );\n\t\t\t\tthis.dispatchEvent( { type: 'load-content' } );\n\t\t\t\tif ( tile.cached.scene ) {\n\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'load-model',\n\t\t\t\t\t\tscene: tile.cached.scene,\n\t\t\t\t\t\ttile,\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.catch( error => {\n\n\t\t\t\t// if it has been unloaded then the tile has been disposed\n\t\t\t\tif ( signal.aborted ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( error.name !== 'AbortError' ) {\n\n\t\t\t\t\tparseQueue.remove( tile );\n\t\t\t\t\tdownloadQueue.remove( tile );\n\n\t\t\t\t\tif ( tile.__loadingState === PARSING ) {\n\n\t\t\t\t\t\tstats.parsing --;\n\n\t\t\t\t\t} else if ( tile.__loadingState === LOADING ) {\n\n\t\t\t\t\t\tstats.downloading --;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstats.failed ++;\n\n\t\t\t\t\tconsole.error( `TilesRenderer : Failed to load tile at url \"${ tile.content.uri }\".` );\n\t\t\t\t\tconsole.error( error );\n\t\t\t\t\ttile.__loadingState = FAILED;\n\t\t\t\t\tlruCache.setLoaded( tile, true );\n\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'load-error',\n\t\t\t\t\t\ttile,\n\t\t\t\t\t\terror,\n\t\t\t\t\t\turi,\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlruCache.remove( tile );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t}\n\n\tgetAttributions( target = [] ) {\n\n\t\tthis.invokeAllPlugins( plugin => plugin !== this && plugin.getAttributions && plugin.getAttributions( target ) );\n\t\treturn target;\n\n\t}\n\n\tinvokeOnePlugin( func ) {\n\n\t\tconst plugins = [ ...this.plugins, this ];\n\t\tfor ( let i = 0; i < plugins.length; i ++ ) {\n\n\t\t\tconst result = func( plugins[ i ] );\n\t\t\tif ( result ) {\n\n\t\t\t\treturn result;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\tinvokeAllPlugins( func ) {\n\n\t\tconst plugins = [ ...this.plugins, this ];\n\t\tconst pending = [];\n\t\tfor ( let i = 0; i < plugins.length; i ++ ) {\n\n\t\t\tconst result = func( plugins[ i ] );\n\t\t\tif ( result ) {\n\n\t\t\t\tpending.push( result );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn pending.length === 0 ? null : Promise.all( pending );\n\n\t}\n\n}\n","const utf8decoder = new TextDecoder();\n\nexport function arrayToString( array ) {\n\n\treturn utf8decoder.decode( array );\n\n}\n","import { arrayToString } from './arrayToString.js';\n\nexport function parseBinArray( buffer, arrayStart, count, type, componentType, propertyName ) {\n\n\tlet stride;\n\tswitch ( type ) {\n\n\t\tcase 'SCALAR':\n\t\t\tstride = 1;\n\t\t\tbreak;\n\n\t\tcase 'VEC2':\n\t\t\tstride = 2;\n\t\t\tbreak;\n\n\t\tcase 'VEC3':\n\t\t\tstride = 3;\n\t\t\tbreak;\n\n\t\tcase 'VEC4':\n\t\t\tstride = 4;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tthrow new Error( `FeatureTable : Feature type not provided for \"${ propertyName }\".` );\n\n\t}\n\n\tlet data;\n\tconst arrayLength = count * stride;\n\n\tswitch ( componentType ) {\n\n\t\tcase 'BYTE':\n\t\t\tdata = new Int8Array( buffer, arrayStart, arrayLength );\n\t\t\tbreak;\n\n\t\tcase 'UNSIGNED_BYTE':\n\t\t\tdata = new Uint8Array( buffer, arrayStart, arrayLength );\n\t\t\tbreak;\n\n\t\tcase 'SHORT':\n\t\t\tdata = new Int16Array( buffer, arrayStart, arrayLength );\n\t\t\tbreak;\n\n\t\tcase 'UNSIGNED_SHORT':\n\t\t\tdata = new Uint16Array( buffer, arrayStart, arrayLength );\n\t\t\tbreak;\n\n\t\tcase 'INT':\n\t\t\tdata = new Int32Array( buffer, arrayStart, arrayLength );\n\t\t\tbreak;\n\n\t\tcase 'UNSIGNED_INT':\n\t\t\tdata = new Uint32Array( buffer, arrayStart, arrayLength );\n\t\t\tbreak;\n\n\t\tcase 'FLOAT':\n\t\t\tdata = new Float32Array( buffer, arrayStart, arrayLength );\n\t\t\tbreak;\n\n\t\tcase 'DOUBLE':\n\t\t\tdata = new Float64Array( buffer, arrayStart, arrayLength );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tthrow new Error( `FeatureTable : Feature component type not provided for \"${ propertyName }\".` );\n\n\t}\n\n\treturn data;\n\n}\n\nexport class FeatureTable {\n\n\tconstructor( buffer, start, headerLength, binLength ) {\n\n\t\tthis.buffer = buffer;\n\t\tthis.binOffset = start + headerLength;\n\t\tthis.binLength = binLength;\n\n\t\tlet header = null;\n\t\tif ( headerLength !== 0 ) {\n\n\t\t\tconst headerData = new Uint8Array( buffer, start, headerLength );\n\t\t\theader = JSON.parse( arrayToString( headerData ) );\n\n\t\t} else {\n\n\t\t\theader = {};\n\n\t\t}\n\t\tthis.header = header;\n\n\t}\n\n\tgetKeys() {\n\n\t\treturn Object.keys( this.header );\n\n\t}\n\n\tgetData( key, count, defaultComponentType = null, defaultType = null ) {\n\n\t\tconst header = this.header;\n\n\t\tif ( ! ( key in header ) ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst feature = header[ key ];\n\t\tif ( ! ( feature instanceof Object ) ) {\n\n\t\t\treturn feature;\n\n\t\t} else if ( Array.isArray( feature ) ) {\n\n\t\t\treturn feature;\n\n\t\t} else {\n\n\t\t\tconst { buffer, binOffset, binLength } = this;\n\t\t\tconst byteOffset = feature.byteOffset || 0;\n\t\t\tconst featureType = feature.type || defaultType;\n\t\t\tconst featureComponentType = feature.componentType || defaultComponentType;\n\n\t\t\tif ( 'type' in feature && defaultType && feature.type !== defaultType ) {\n\n\t\t\t\tthrow new Error( 'FeatureTable: Specified type does not match expected type.' );\n\n\t\t\t}\n\n\t\t\tconst arrayStart = binOffset + byteOffset;\n\t\t\tconst data = parseBinArray( buffer, arrayStart, count, featureType, featureComponentType, key );\n\n\t\t\tconst dataEnd = arrayStart + data.byteLength;\n\t\t\tif ( dataEnd > binOffset + binLength ) {\n\n\t\t\t\tthrow new Error( 'FeatureTable: Feature data read outside binary body length.' );\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t}\n\n\tgetBuffer( byteOffset, byteLength ) {\n\n\t\tconst { buffer, binOffset } = this;\n\t\treturn buffer.slice( binOffset + byteOffset, binOffset + byteOffset + byteLength );\n\n\t}\n\n}\n","import { parseBinArray } from './FeatureTable.js';\n\nexport class BatchTableHierarchyExtension {\n\n\tconstructor( batchTable ) {\n\n\t\tthis.batchTable = batchTable;\n\n\t\tconst extensionHeader = batchTable.header.extensions[ '3DTILES_batch_table_hierarchy' ];\n\n\t\tthis.classes = extensionHeader.classes;\n\t\tfor ( const classDef of this.classes ) {\n\n\t\t\tconst instances = classDef.instances;\n\t\t\tfor ( const property in instances ) {\n\n\t\t\t\tclassDef.instances[ property ] = this._parseProperty( instances[ property ], classDef.length, property );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.instancesLength = extensionHeader.instancesLength;\n\n\t\tthis.classIds = this._parseProperty( extensionHeader.classIds, this.instancesLength, 'classIds' );\n\n\t\tif ( extensionHeader.parentCounts ) {\n\n\t\t\tthis.parentCounts = this._parseProperty( extensionHeader.parentCounts, this.instancesLength, 'parentCounts' );\n\n\t\t} else {\n\n\t\t\tthis.parentCounts = new Array( this.instancesLength ).fill( 1 );\n\n\t\t}\n\n\t\tif ( extensionHeader.parentIds ) {\n\n\t\t\tconst parentIdsLength = this.parentCounts.reduce( ( a, b ) => a + b, 0 );\n\t\t\tthis.parentIds = this._parseProperty( extensionHeader.parentIds, parentIdsLength, 'parentIds' );\n\n\t\t} else {\n\n\t\t\tthis.parentIds = null;\n\n\t\t}\n\n\t\tthis.instancesIds = [];\n\t\tconst classCounter = {};\n\t\tfor ( const classId of this.classIds ) {\n\n\t\t\tclassCounter[ classId ] = classCounter[ classId ] ?? 0;\n\t\t\tthis.instancesIds.push( classCounter[ classId ] );\n\t\t\tclassCounter[ classId ] ++;\n\n\t\t}\n\n\t}\n\n\t_parseProperty( property, propertyLength, propertyName ) {\n\n\t\tif ( Array.isArray( property ) ) {\n\n\t\t\treturn property;\n\n\t\t} else {\n\n\t\t\tconst { buffer, binOffset } = this.batchTable;\n\n\t\t\tconst byteOffset = property.byteOffset;\n\t\t\tconst componentType = property.componentType || 'UNSIGNED_SHORT';\n\n\t\t\tconst arrayStart = binOffset + byteOffset;\n\n\t\t\treturn parseBinArray( buffer, arrayStart, propertyLength, 'SCALAR', componentType, propertyName );\n\n\t\t}\n\n\t}\n\n\tgetDataFromId( id, target = {} ) {\n\n\t\t// Get properties inherited from parents\n\n\t\tconst parentCount = this.parentCounts[ id ];\n\n\t\tif ( this.parentIds && parentCount > 0 ) {\n\n\t\t\tlet parentIdsOffset = 0;\n\t\t\tfor ( let i = 0; i < id; i ++ ) {\n\n\t\t\t\tparentIdsOffset += this.parentCounts[ i ];\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < parentCount; i ++ ) {\n\n\t\t\t\tconst parentId = this.parentIds[ parentIdsOffset + i ];\n\t\t\t\tif ( parentId !== id ) {\n\n\t\t\t\t\tthis.getDataFromId( parentId, target );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Get properties proper to this instance\n\n\t\tconst classId = this.classIds[ id ];\n\t\tconst instances = this.classes[ classId ].instances;\n\t\tconst className = this.classes[ classId ].name;\n\t\tconst instanceId = this.instancesIds[ id ];\n\n\t\tfor ( const key in instances ) {\n\n\t\t\ttarget[ className ] = target[ className ] || {};\n\t\t\ttarget[ className ][ key ] = instances[ key ][ instanceId ];\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n}\n","import { BatchTableHierarchyExtension } from './BatchTableHierarchyExtension.js';\nimport { FeatureTable } from './FeatureTable.js';\n\nexport class BatchTable extends FeatureTable {\n\n\tget batchSize() {\n\n\t\tconsole.warn( 'BatchTable.batchSize has been deprecated and replaced with BatchTable.count.' );\n\t\treturn this.count;\n\n\t}\n\n\tconstructor( buffer, count, start, headerLength, binLength ) {\n\n\t\tsuper( buffer, start, headerLength, binLength );\n\t\tthis.count = count;\n\n\t\tthis.extensions = {};\n\t\tconst extensions = this.header.extensions;\n\t\tif ( extensions ) {\n\n\t\t\tif ( extensions[ '3DTILES_batch_table_hierarchy' ] ) {\n\n\t\t\t\tthis.extensions[ '3DTILES_batch_table_hierarchy' ] = new BatchTableHierarchyExtension( this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tgetData( key, componentType = null, type = null ) {\n\n\t\tconsole.warn( 'BatchTable: BatchTable.getData is deprecated. Use BatchTable.getDataFromId to get all' +\n\t\t\t'properties for an id or BatchTable.getPropertyArray for getting an array of value for a property.' );\n\t\treturn super.getData( key, this.count, componentType, type );\n\n\t}\n\n\tgetDataFromId( id, target = {} ) {\n\n\t\tif ( id < 0 || id >= this.count ) {\n\n\t\t\tthrow new Error( `BatchTable: id value \"${ id }\" out of bounds for \"${ this.count }\" features number.` );\n\n\t\t}\n\n\t\tfor ( const key of this.getKeys() ) {\n\n\t\t\tif ( key !== 'extensions' ) {\n\n\t\t\t\ttarget[ key ] = super.getData( key, this.count )[ id ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( const extensionName in this.extensions ) {\n\n\t\t\tconst extension = this.extensions[ extensionName ];\n\n\t\t\tif ( extension.getDataFromId instanceof Function ) {\n\n\t\t\t\ttarget[ extensionName ] = target[ extensionName ] || {};\n\t\t\t\textension.getDataFromId( id, target[ extensionName ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\tgetPropertyArray( key ) {\n\n\t\treturn super.getData( key, this.count );\n\n\t}\n\n\n}\n","export class LoaderBase {\n\n\tconstructor() {\n\n\t\tthis.fetchOptions = {};\n\t\tthis.workingPath = '';\n\n\t}\n\n\tload( ...args ) {\n\n\t\tconsole.warn( 'Loader: \"load\" function has been deprecated in favor of \"loadAsync\".' );\n\t\treturn this.loadAsync( ...args );\n\n\t}\n\n\tloadAsync( url ) {\n\n\t\treturn fetch( url, this.fetchOptions )\n\t\t\t.then( res => {\n\n\t\t\t\tif ( ! res.ok ) {\n\n\t\t\t\t\tthrow new Error( `Failed to load file \"${ url }\" with status ${ res.status } : ${ res.statusText }` );\n\n\t\t\t\t}\n\t\t\t\treturn res.arrayBuffer();\n\n\t\t\t} )\n\t\t\t.then( buffer => {\n\n\t\t\t\tif ( this.workingPath === '' ) {\n\n\t\t\t\t\tthis.workingPath = this.workingPathForURL( url );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.parse( buffer );\n\n\t\t\t} );\n\n\t}\n\n\tresolveExternalURL( url ) {\n\n\t\tif ( /^[^\\\\/]/.test( url ) && ! /^http/.test( url ) ) {\n\n\t\t\treturn this.workingPath + '/' + url;\n\n\t\t} else {\n\n\t\t\treturn url;\n\n\t\t}\n\n\t}\n\n\tworkingPathForURL( url ) {\n\n\t\tconst splits = url.split( /[\\\\/]/g );\n\t\tsplits.pop();\n\t\tconst workingPath = splits.join( '/' );\n\t\treturn workingPath + '/';\n\n\t}\n\n\tparse( buffer ) {\n\n\t\tthrow new Error( 'LoaderBase: Parse not implemented.' );\n\n\t}\n\n}\n","export function readMagicBytes( bufferOrDataView ) {\n\n\tlet view;\n\tif ( bufferOrDataView instanceof DataView ) {\n\n\t\tview = bufferOrDataView;\n\n\t} else {\n\n\t\tview = new DataView( bufferOrDataView );\n\n\t}\n\n\tif ( String.fromCharCode( view.getUint8( 0 ) ) === '{' ) {\n\n\t\treturn null;\n\n\t}\n\n\tlet magicBytes = '';\n\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\tmagicBytes += String.fromCharCode( view.getUint8( i ) );\n\n\t}\n\n\treturn magicBytes;\n\n}\n","// B3DM File Format\n// https://github.com/CesiumGS/3d-tiles/blob/master/specification/TileFormats/Batched3DModel/README.md\n\nimport { BatchTable } from '../../utilities/BatchTable.js';\nimport { FeatureTable } from '../../utilities/FeatureTable.js';\nimport { LoaderBase } from './LoaderBase.js';\nimport { readMagicBytes } from '../../utilities/readMagicBytes.js';\n\nexport class B3DMLoaderBase extends LoaderBase {\n\n\tparse( buffer ) {\n\n\t\t// TODO: this should be able to take a uint8array with an offset and length\n\t\tconst dataView = new DataView( buffer );\n\n\t\t// 28-byte header\n\n\t\t// 4 bytes\n\t\tconst magic = readMagicBytes( dataView );\n\n\t\tconsole.assert( magic === 'b3dm' );\n\n\t\t// 4 bytes\n\t\tconst version = dataView.getUint32( 4, true );\n\n\t\tconsole.assert( version === 1 );\n\n\t\t// 4 bytes\n\t\tconst byteLength = dataView.getUint32( 8, true );\n\n\t\tconsole.assert( byteLength === buffer.byteLength );\n\n\t\t// 4 bytes\n\t\tconst featureTableJSONByteLength = dataView.getUint32( 12, true );\n\n\t\t// 4 bytes\n\t\tconst featureTableBinaryByteLength = dataView.getUint32( 16, true );\n\n\t\t// 4 bytes\n\t\tconst batchTableJSONByteLength = dataView.getUint32( 20, true );\n\n\t\t// 4 bytes\n\t\tconst batchTableBinaryByteLength = dataView.getUint32( 24, true );\n\n\t\t// Feature Table\n\t\tconst featureTableStart = 28;\n\t\tconst featureTableBuffer = buffer.slice(\n\t\t\tfeatureTableStart,\n\t\t\tfeatureTableStart + featureTableJSONByteLength + featureTableBinaryByteLength,\n\t\t);\n\t\tconst featureTable = new FeatureTable(\n\t\t\tfeatureTableBuffer,\n\t\t\t0,\n\t\t\tfeatureTableJSONByteLength,\n\t\t\tfeatureTableBinaryByteLength,\n\t\t);\n\n\t\t// Batch Table\n\t\tconst batchTableStart = featureTableStart + featureTableJSONByteLength + featureTableBinaryByteLength;\n\t\tconst batchTableBuffer = buffer.slice(\n\t\t\tbatchTableStart,\n\t\t\tbatchTableStart + batchTableJSONByteLength + batchTableBinaryByteLength,\n\t\t);\n\t\tconst batchTable = new BatchTable(\n\t\t\tbatchTableBuffer,\n\t\t\tfeatureTable.getData( 'BATCH_LENGTH' ),\n\t\t\t0,\n\t\t\tbatchTableJSONByteLength,\n\t\t\tbatchTableBinaryByteLength,\n\t\t);\n\n\t\tconst glbStart = batchTableStart + batchTableJSONByteLength + batchTableBinaryByteLength;\n\t\tconst glbBytes = new Uint8Array( buffer, glbStart, byteLength - glbStart );\n\n\t\treturn {\n\t\t\tversion,\n\t\t\tfeatureTable,\n\t\t\tbatchTable,\n\t\t\tglbBytes,\n\t\t};\n\n\t}\n\n}\n\n","import { B3DMLoaderBase } from '../../base/loaders/B3DMLoaderBase.js';\nimport { DefaultLoadingManager, Matrix4 } from 'three';\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\n\nexport class B3DMLoader extends B3DMLoaderBase {\n\n\tconstructor( manager = DefaultLoadingManager ) {\n\n\t\tsuper();\n\t\tthis.manager = manager;\n\t\tthis.adjustmentTransform = new Matrix4();\n\n\t}\n\n\tparse( buffer ) {\n\n\t\tconst b3dm = super.parse( buffer );\n\t\tconst gltfBuffer = b3dm.glbBytes.slice().buffer;\n\t\treturn new Promise( ( resolve, reject ) => {\n\n\t\t\tconst manager = this.manager;\n\t\t\tconst fetchOptions = this.fetchOptions;\n\t\t\tconst loader = manager.getHandler( 'path.gltf' ) || new GLTFLoader( manager );\n\n\t\t\tif ( fetchOptions.credentials === 'include' && fetchOptions.mode === 'cors' ) {\n\n\t\t\t\tloader.setCrossOrigin( 'use-credentials' );\n\n\t\t\t}\n\n\t\t\tif ( 'credentials' in fetchOptions ) {\n\n\t\t\t\tloader.setWithCredentials( fetchOptions.credentials === 'include' );\n\n\t\t\t}\n\n\t\t\tif ( fetchOptions.headers ) {\n\n\t\t\t\tloader.setRequestHeader( fetchOptions.headers );\n\n\t\t\t}\n\n\t\t\t// GLTFLoader assumes the working path ends in a slash\n\t\t\tlet workingPath = this.workingPath;\n\t\t\tif ( ! /[\\\\/]$/.test( workingPath ) && workingPath.length ) {\n\n\t\t\t\tworkingPath += '/';\n\n\t\t\t}\n\n\t\t\tconst adjustmentTransform = this.adjustmentTransform;\n\n\t\t\tloader.parse( gltfBuffer, workingPath, model => {\n\n\t\t\t\tconst { batchTable, featureTable } = b3dm;\n\t\t\t\tconst { scene } = model;\n\n\t\t\t\tconst rtcCenter = featureTable.getData( 'RTC_CENTER' );\n\t\t\t\tif ( rtcCenter ) {\n\n\t\t\t\t\tscene.position.x += rtcCenter[ 0 ];\n\t\t\t\t\tscene.position.y += rtcCenter[ 1 ];\n\t\t\t\t\tscene.position.z += rtcCenter[ 2 ];\n\n\t\t\t\t}\n\n\t\t\t\tmodel.scene.updateMatrix();\n\t\t\t\tmodel.scene.matrix.multiply( adjustmentTransform );\n\t\t\t\tmodel.scene.matrix.decompose( model.scene.position, model.scene.quaternion, model.scene.scale );\n\n\t\t\t\tmodel.batchTable = batchTable;\n\t\t\t\tmodel.featureTable = featureTable;\n\n\t\t\t\tscene.batchTable = batchTable;\n\t\t\t\tscene.featureTable = featureTable;\n\n\t\t\t\tresolve( model );\n\n\t\t\t}, reject );\n\n\t\t} );\n\n\t}\n\n}\n","// PNTS File Format\n// https://github.com/CesiumGS/3d-tiles/blob/master/specification/TileFormats/PointCloud/README.md\n\nimport { BatchTable } from '../../utilities/BatchTable.js';\nimport { FeatureTable } from '../../utilities/FeatureTable.js';\nimport { readMagicBytes } from '../../utilities/readMagicBytes.js';\nimport { LoaderBase } from './LoaderBase.js';\n\nexport class PNTSLoaderBase extends LoaderBase {\n\n\tparse( buffer ) {\n\n\t\tconst dataView = new DataView( buffer );\n\n\t\t// 28-byte header\n\n\t\t// 4 bytes\n\t\tconst magic = readMagicBytes( dataView );\n\n\t\tconsole.assert( magic === 'pnts' );\n\n\t\t// 4 bytes\n\t\tconst version = dataView.getUint32( 4, true );\n\n\t\tconsole.assert( version === 1 );\n\n\t\t// 4 bytes\n\t\tconst byteLength = dataView.getUint32( 8, true );\n\n\t\tconsole.assert( byteLength === buffer.byteLength );\n\n\t\t// 4 bytes\n\t\tconst featureTableJSONByteLength = dataView.getUint32( 12, true );\n\n\t\t// 4 bytes\n\t\tconst featureTableBinaryByteLength = dataView.getUint32( 16, true );\n\n\t\t// 4 bytes\n\t\tconst batchTableJSONByteLength = dataView.getUint32( 20, true );\n\n\t\t// 4 bytes\n\t\tconst batchTableBinaryByteLength = dataView.getUint32( 24, true );\n\n\t\t// Feature Table\n\t\tconst featureTableStart = 28;\n\t\tconst featureTableBuffer = buffer.slice(\n\t\t\tfeatureTableStart,\n\t\t\tfeatureTableStart + featureTableJSONByteLength + featureTableBinaryByteLength,\n\t\t);\n\t\tconst featureTable = new FeatureTable(\n\t\t\tfeatureTableBuffer,\n\t\t\t0,\n\t\t\tfeatureTableJSONByteLength,\n\t\t\tfeatureTableBinaryByteLength,\n\t\t);\n\n\t\t// Batch Table\n\t\tconst batchTableStart = featureTableStart + featureTableJSONByteLength + featureTableBinaryByteLength;\n\t\tconst batchTableBuffer = buffer.slice(\n\t\t\tbatchTableStart,\n\t\t\tbatchTableStart + batchTableJSONByteLength + batchTableBinaryByteLength,\n\t\t);\n\t\tconst batchTable = new BatchTable(\n\t\t\tbatchTableBuffer,\n\t\t\tfeatureTable.getData( 'BATCH_LENGTH' ) || featureTable.getData( 'POINTS_LENGTH' ),\n\t\t\t0,\n\t\t\tbatchTableJSONByteLength,\n\t\t\tbatchTableBinaryByteLength,\n\t\t);\n\n\t\treturn Promise.resolve( {\n\n\t\t\tversion,\n\t\t\tfeatureTable,\n\t\t\tbatchTable,\n\n\t\t} );\n\n\t}\n\n}\n\n","// The implementation of rgb565 to rgb888 is from\n// https://rgbcolorpicker.com/565\n\nexport function rgb565torgb( rgb565 ) {\n\n\t// Shift the red value to the right by 11 bits.\n\tconst red5 = rgb565 >> 11;\n\t// Shift the green value to the right by 5 bits and extract the lower 6 bits.\n\tconst green6 = ( rgb565 >> 5 ) & 0b111111;\n\t// Extract the lower 5 bits.\n\tconst blue5 = rgb565 & 0b11111;\n\n\t// Convert 5-bit red to 8-bit red.\n\tconst red8 = Math.round( ( red5 / 31 ) * 255 );\n\t// Convert 6-bit green to 8-bit green.\n\tconst green8 = Math.round( ( green6 / 63 ) * 255 );\n\t// Convert 5-bit blue to 8-bit blue.\n\tconst blue8 = Math.round( ( blue5 / 31 ) * 255 );\n\n\treturn [ red8, green8, blue8 ];\n\n}\n","import { Vector2, MathUtils, Vector3 } from 'three';\n\nconst f = new Vector2();\n\n/**\n * Decode an octahedron-encoded normal (as a pair of 8-bit unsigned numbers) into a Vector3.\n *\n * Resources:\n * - https://stackoverflow.com/a/74745666/2704779\n * - https://knarkowicz.wordpress.com/2014/04/16/octahedron-normal-vector-encoding/\n * @param {number} x The unsigned 8-bit X coordinate on the projected octahedron.\n * @param {number} y The unsigned 8-bit Y coordinate on the projected octahedron.\n * @param {Vector3} [target] The target vector.\n */\nexport function decodeOctNormal( x, y, target = new Vector3() ) {\n\n\tf.set( x, y ).divideScalar( 256 ).multiplyScalar( 2 ).subScalar( 1 );\n\n\ttarget.set( f.x, f.y, 1 - Math.abs( f.x ) - Math.abs( f.y ) );\n\n\tconst t = MathUtils.clamp( - target.z, 0, 1 );\n\n\tif ( target.x >= 0 ) {\n\n\t\ttarget.setX( target.x - t );\n\n\t} else {\n\n\t\ttarget.setX( target.x + t );\n\n\t}\n\n\tif ( target.y >= 0 ) {\n\n\t\ttarget.setY( target.y - t );\n\n\t} else {\n\n\t\ttarget.setY( target.y + t );\n\n\t}\n\n\ttarget.normalize();\n\n\treturn target;\n\n}\n","import { PNTSLoaderBase } from '../../base/loaders/PNTSLoaderBase.js';\nimport {\n\tPoints,\n\tPointsMaterial,\n\tBufferGeometry,\n\tBufferAttribute,\n\tDefaultLoadingManager,\n\tVector3,\n\tColor,\n} from 'three';\nimport { rgb565torgb } from '../../utilities/rgb565torgb.js';\nimport { decodeOctNormal } from '../../utilities/decodeOctNormal.js';\n\nconst DRACO_ATTRIBUTE_MAP = {\n\tRGB: 'color',\n\tPOSITION: 'position',\n};\n\nexport class PNTSLoader extends PNTSLoaderBase {\n\n\tconstructor( manager = DefaultLoadingManager ) {\n\n\t\tsuper();\n\t\tthis.manager = manager;\n\n\t}\n\n\tparse( buffer ) {\n\n\t\treturn super.parse( buffer ).then( async ( result ) => {\n\n\t\t\tconst { featureTable, batchTable } = result;\n\n\t\t\tconst material = new PointsMaterial();\n\t\t\tconst extensions = featureTable.header.extensions;\n\t\t\tconst translationOffset = new Vector3();\n\t\t\tlet geometry;\n\n\t\t\t// handle loading the draco data\n\t\t\tif ( extensions && extensions[ '3DTILES_draco_point_compression' ] ) {\n\n\t\t\t\tconst { byteOffset, byteLength, properties } = extensions[ '3DTILES_draco_point_compression' ];\n\t\t\t\tconst dracoLoader = this.manager.getHandler( 'draco.drc' );\n\t\t\t\tif ( dracoLoader == null ) {\n\n\t\t\t\t\tthrow new Error( 'PNTSLoader: dracoLoader not available.' );\n\n\t\t\t\t}\n\n\t\t\t\t// map PNTS keys to draco types\n\t\t\t\tconst attributeIDs = {};\n\t\t\t\tfor ( const key in properties ) {\n\n\t\t\t\t\tif ( key in DRACO_ATTRIBUTE_MAP && key in properties ) {\n\n\t\t\t\t\t\tconst mappedKey = DRACO_ATTRIBUTE_MAP[ key ];\n\t\t\t\t\t\tattributeIDs[ mappedKey ] = properties[ key ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// decode the geometry\n\t\t\t\tconst taskConfig = {\n\t\t\t\t\tattributeIDs,\n\t\t\t\t\tattributeTypes: {\n\t\t\t\t\t\tposition: 'Float32Array',\n\t\t\t\t\t\tcolor: 'Uint8Array',\n\t\t\t\t\t},\n\t\t\t\t\tuseUniqueIDs: true,\n\t\t\t\t};\n\n\t\t\t\tconst buffer = featureTable.getBuffer( byteOffset, byteLength );\n\t\t\t\tgeometry = await dracoLoader.decodeGeometry( buffer, taskConfig );\n\t\t\t\tif ( geometry.attributes.color ) {\n\n\t\t\t\t\tmaterial.vertexColors = true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// handle non compressed case\n\t\t\t\tconst POINTS_LENGTH = featureTable.getData( 'POINTS_LENGTH' );\n\t\t\t\tconst POSITION = featureTable.getData( 'POSITION', POINTS_LENGTH, 'FLOAT', 'VEC3' );\n\t\t\t\tconst NORMAL = featureTable.getData( 'NORMAL', POINTS_LENGTH, 'FLOAT', 'VEC3' );\n\t\t\t\tconst NORMAL_OCT16P = featureTable.getData( 'NORMAL', POINTS_LENGTH, 'UNSIGNED_BYTE', 'VEC2' );\n\t\t\t\tconst RGB = featureTable.getData( 'RGB', POINTS_LENGTH, 'UNSIGNED_BYTE', 'VEC3' );\n\t\t\t\tconst RGBA = featureTable.getData( 'RGBA', POINTS_LENGTH, 'UNSIGNED_BYTE', 'VEC4' );\n\t\t\t\tconst RGB565 = featureTable.getData( 'RGB565', POINTS_LENGTH, 'UNSIGNED_SHORT', 'SCALAR' );\n\t\t\t\tconst CONSTANT_RGBA = featureTable.getData( 'CONSTANT_RGBA', POINTS_LENGTH, 'UNSIGNED_BYTE', 'VEC4' );\n\t\t\t\tconst POSITION_QUANTIZED = featureTable.getData( 'POSITION_QUANTIZED', POINTS_LENGTH, 'UNSIGNED_SHORT', 'VEC3' );\n\t\t\t\tconst QUANTIZED_VOLUME_SCALE = featureTable.getData( 'QUANTIZED_VOLUME_SCALE', POINTS_LENGTH, 'FLOAT', 'VEC3' );\n\t\t\t\tconst QUANTIZED_VOLUME_OFFSET = featureTable.getData( 'QUANTIZED_VOLUME_OFFSET', POINTS_LENGTH, 'FLOAT', 'VEC3' );\n\n\t\t\t\tgeometry = new BufferGeometry();\n\n\t\t\t\tif ( POSITION_QUANTIZED ) {\n\n\t\t\t\t\tconst decodedPositions = new Float32Array( POINTS_LENGTH * 3 );\n\t\t\t\t\tfor ( let i = 0; i < POINTS_LENGTH; i ++ ) {\n\n\t\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tconst index = 3 * i + j;\n\t\t\t\t\t\t\tdecodedPositions[ index ] = ( POSITION_QUANTIZED[ index ] / 65535.0 ) * QUANTIZED_VOLUME_SCALE[ j ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\ttranslationOffset.x = QUANTIZED_VOLUME_OFFSET[ 0 ];\n\t\t\t\t\ttranslationOffset.y = QUANTIZED_VOLUME_OFFSET[ 1 ];\n\t\t\t\t\ttranslationOffset.z = QUANTIZED_VOLUME_OFFSET[ 2 ];\n\t\t\t\t\tgeometry.setAttribute( 'position', new BufferAttribute( decodedPositions, 3, false ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgeometry.setAttribute( 'position', new BufferAttribute( POSITION, 3, false ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( NORMAL !== null ) {\n\n\t\t\t\t\tgeometry.setAttribute( 'normal', new BufferAttribute( NORMAL, 3, false ) );\n\n\t\t\t\t} else if ( NORMAL_OCT16P !== null ) {\n\n\t\t\t\t\tconst decodedNormals = new Float32Array( POINTS_LENGTH * 3 );\n\n\t\t\t\t\tconst n = new Vector3();\n\n\t\t\t\t\tfor ( let i = 0; i < POINTS_LENGTH; i ++ ) {\n\n\t\t\t\t\t\tconst x = NORMAL_OCT16P[ i * 2 ];\n\t\t\t\t\t\tconst y = NORMAL_OCT16P[ i * 2 + 1 ];\n\n\t\t\t\t\t\tconst normal = decodeOctNormal( x, y, n );\n\n\t\t\t\t\t\tdecodedNormals[ i * 3 ] = normal.x;\n\t\t\t\t\t\tdecodedNormals[ i * 3 + 1 ] = normal.y;\n\t\t\t\t\t\tdecodedNormals[ i * 3 + 2 ] = normal.z;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.setAttribute( 'normal', new BufferAttribute( decodedNormals, 3, false ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( RGBA !== null ) {\n\n\t\t\t\t\tgeometry.setAttribute( 'color', new BufferAttribute( RGBA, 4, true ) );\n\t\t\t\t\tmaterial.vertexColors = true;\n\t\t\t\t\tmaterial.transparent = true;\n\t\t\t\t\tmaterial.depthWrite = false;\n\n\t\t\t\t} else if ( RGB !== null ) {\n\n\t\t\t\t\tgeometry.setAttribute( 'color', new BufferAttribute( RGB, 3, true ) );\n\t\t\t\t\tmaterial.vertexColors = true;\n\n\t\t\t\t} else if ( RGB565 !== null ) {\n\n\t\t\t\t\tconst color = new Uint8Array( POINTS_LENGTH * 3 );\n\t\t\t\t\tfor ( let i = 0; i < POINTS_LENGTH; i ++ ) {\n\n\t\t\t\t\t\tconst rgbColor = rgb565torgb( RGB565[ i ] );\n\t\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tconst index = 3 * i + j;\n\t\t\t\t\t\t\tcolor[ index ] = rgbColor[ j ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\tgeometry.setAttribute( 'color', new BufferAttribute( color, 3, true ) );\n\t\t\t\t\tmaterial.vertexColors = true;\n\n\t\t\t\t} else if ( CONSTANT_RGBA !== null ) {\n\n\t\t\t\t\tconst color = new Color( CONSTANT_RGBA[ 0 ], CONSTANT_RGBA[ 1 ], CONSTANT_RGBA[ 2 ] );\n\t\t\t\t\tmaterial.color = color;\n\t\t\t\t\tconst opacity = CONSTANT_RGBA[ 3 ] / 255;\n\t\t\t\t\tif ( opacity < 1 ) {\n\n\t\t\t\t\t\tmaterial.opacity = opacity;\n\t\t\t\t\t\tmaterial.transparent = true;\n\t\t\t\t\t\tmaterial.depthWrite = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst object = new Points( geometry, material );\n\t\t\tobject.position.copy( translationOffset );\n\t\t\tresult.scene = object;\n\t\t\tresult.scene.featureTable = featureTable;\n\t\t\tresult.scene.batchTable = batchTable;\n\n\t\t\tconst rtcCenter = featureTable.getData( 'RTC_CENTER' );\n\t\t\tif ( rtcCenter ) {\n\n\t\t\t\tresult.scene.position.x += rtcCenter[ 0 ];\n\t\t\t\tresult.scene.position.y += rtcCenter[ 1 ];\n\t\t\t\tresult.scene.position.z += rtcCenter[ 2 ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t} );\n\n\t}\n\n}\n","// I3DM File Format\n// https://github.com/CesiumGS/3d-tiles/blob/master/specification/TileFormats/Instanced3DModel/README.md\n\nimport { BatchTable } from '../../utilities/BatchTable.js';\nimport { FeatureTable } from '../../utilities/FeatureTable.js';\nimport { arrayToString } from '../../utilities/arrayToString.js';\nimport { LoaderBase } from './LoaderBase.js';\nimport { readMagicBytes } from '../../utilities/readMagicBytes.js';\n\nexport class I3DMLoaderBase extends LoaderBase {\n\n\tparse( buffer ) {\n\n\t\tconst dataView = new DataView( buffer );\n\n\t\t// 32-byte header\n\n\t\t// 4 bytes\n\t\tconst magic = readMagicBytes( dataView );\n\n\t\tconsole.assert( magic === 'i3dm' );\n\n\t\t// 4 bytes\n\t\tconst version = dataView.getUint32( 4, true );\n\n\t\tconsole.assert( version === 1 );\n\n\t\t// 4 bytes\n\t\tconst byteLength = dataView.getUint32( 8, true );\n\n\t\tconsole.assert( byteLength === buffer.byteLength );\n\n\t\t// 4 bytes\n\t\tconst featureTableJSONByteLength = dataView.getUint32( 12, true );\n\n\t\t// 4 bytes\n\t\tconst featureTableBinaryByteLength = dataView.getUint32( 16, true );\n\n\t\t// 4 bytes\n\t\tconst batchTableJSONByteLength = dataView.getUint32( 20, true );\n\n\t\t// 4 bytes\n\t\tconst batchTableBinaryByteLength = dataView.getUint32( 24, true );\n\n\t\t// 4 bytes\n\t\tconst gltfFormat = dataView.getUint32( 28, true );\n\n\t\t// Feature Table\n\t\tconst featureTableStart = 32;\n\t\tconst featureTableBuffer = buffer.slice(\n\t\t\tfeatureTableStart,\n\t\t\tfeatureTableStart + featureTableJSONByteLength + featureTableBinaryByteLength,\n\t\t);\n\t\tconst featureTable = new FeatureTable(\n\t\t\tfeatureTableBuffer,\n\t\t\t0,\n\t\t\tfeatureTableJSONByteLength,\n\t\t\tfeatureTableBinaryByteLength,\n\t\t);\n\n\t\t// Batch Table\n\t\tconst batchTableStart = featureTableStart + featureTableJSONByteLength + featureTableBinaryByteLength;\n\t\tconst batchTableBuffer = buffer.slice(\n\t\t\tbatchTableStart,\n\t\t\tbatchTableStart + batchTableJSONByteLength + batchTableBinaryByteLength,\n\t\t);\n\t\tconst batchTable = new BatchTable(\n\t\t\tbatchTableBuffer,\n\t\t\tfeatureTable.getData( 'INSTANCES_LENGTH' ),\n\t\t\t0,\n\t\t\tbatchTableJSONByteLength,\n\t\t\tbatchTableBinaryByteLength,\n\t\t);\n\n\t\tconst glbStart = batchTableStart + batchTableJSONByteLength + batchTableBinaryByteLength;\n\t\tconst bodyBytes = new Uint8Array( buffer, glbStart, byteLength - glbStart );\n\n\t\tlet glbBytes = null;\n\t\tlet promise = null;\n\t\tlet gltfWorkingPath = null;\n\t\tif ( gltfFormat ) {\n\n\t\t\tglbBytes = bodyBytes;\n\t\t\tpromise = Promise.resolve();\n\n\t\t} else {\n\n\t\t\tconst externalUri = this.resolveExternalURL( arrayToString( bodyBytes ) );\n\n\t\t\t//Store the gltf working path\n\t\t\tconst uriSplits = externalUri.split( /[\\\\/]/g );\n\t\t\turiSplits.pop();\n\t\t\tgltfWorkingPath = uriSplits.join( '/' );\n\n\t\t\tpromise = fetch( externalUri, this.fetchOptions )\n\t\t\t\t.then( res => {\n\n\t\t\t\t\tif ( ! res.ok ) {\n\n\t\t\t\t\t\tthrow new Error( `I3DMLoaderBase : Failed to load file \"${ externalUri }\" with status ${ res.status } : ${ res.statusText }` );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn res.arrayBuffer();\n\n\t\t\t\t} )\n\t\t\t\t.then( buffer => {\n\n\t\t\t\t\tglbBytes = new Uint8Array( buffer );\n\n\t\t\t\t} );\n\n\t\t}\n\n\t\treturn promise.then( () => {\n\n\t\t\treturn {\n\t\t\t\tversion,\n\t\t\t\tfeatureTable,\n\t\t\t\tbatchTable,\n\t\t\t\tglbBytes,\n\t\t\t\tgltfWorkingPath\n\t\t\t};\n\n\t\t} );\n\n\t}\n\n}\n\n","import { Spherical, Vector3, MathUtils } from 'three';\n\nconst _spherical = new Spherical();\nconst _vec = new Vector3();\nconst _geoResults = {};\n\n// Cesium / 3D tiles Spheroid:\n// - Up is Z at 90 degrees latitude\n// - 0, 0 latitude, longitude is X axis\n//      Z\n//      |\n//      |\n//      .----- Y\n//     /\n//   X\n\n\n// Three.js Spherical Coordinates\n// - Up is Y at 90 degrees latitude\n// - 0, 0 latitude, longitude is Z\n//       Y\n//      |\n//      |\n//      .----- X\n//     /\n//   Z\n\nexport function swapToGeoFrame( target ) {\n\n\tconst { x, y, z } = target;\n\ttarget.x = z;\n\ttarget.y = x;\n\ttarget.z = y;\n\n}\n\nexport function swapToThreeFrame( target ) {\n\n\tconst { x, y, z } = target;\n\ttarget.z = x;\n\ttarget.x = y;\n\ttarget.y = z;\n\n}\n\nexport function sphericalPhiToLatitude( phi ) {\n\n\treturn - ( phi - Math.PI / 2 );\n\n}\n\nexport function latitudeToSphericalPhi( latitude ) {\n\n\treturn - latitude + Math.PI / 2;\n\n}\n\nfunction correctGeoCoordWrap( lat, lon, target = {} ) {\n\n\t_spherical.theta = lon;\n\t_spherical.phi = latitudeToSphericalPhi( lat );\n\t_vec.setFromSpherical( _spherical );\n\n\t_spherical.setFromVector3( _vec );\n\ttarget.lat = sphericalPhiToLatitude( _spherical.phi );\n\ttarget.lon = _spherical.theta;\n\treturn target;\n\n}\n\nfunction toHoursMinutesSecondsString( value, pos = 'E', neg = 'W' ) {\n\n\tconst direction = value < 0 ? neg : pos;\n\tvalue = Math.abs( value );\n\n\tconst hours = ~ ~ value;\n\n\tconst minDec = ( value - hours ) * 60;\n\tconst minutes = ~ ~ minDec;\n\n\tconst secDec = ( minDec - minutes ) * 60;\n\tconst seconds = ~ ~ secDec;\n\n\treturn `${ hours }° ${ minutes }' ${ seconds }\" ${ direction }`;\n\n}\n\nexport function toLatLonString( lat, lon, decimalFormat = false ) {\n\n\tconst result = correctGeoCoordWrap( lat, lon, _geoResults );\n\tlet latString, lonString;\n\tif ( decimalFormat ) {\n\n\t\tlatString = `${ ( MathUtils.RAD2DEG * result.lat ).toFixed( 4 ) }°`;\n\t\tlonString = `${ ( MathUtils.RAD2DEG * result.lon ).toFixed( 4 ) }°`;\n\n\t} else {\n\n\t\tlatString = toHoursMinutesSecondsString( MathUtils.RAD2DEG * result.lat, 'N', 'S' );\n\t\tlonString = toHoursMinutesSecondsString( MathUtils.RAD2DEG * result.lon, 'E', 'W' );\n\n\t}\n\n\treturn `${ latString } ${ lonString }`;\n\n}\n","import { Vector3, Spherical, MathUtils, Ray, Matrix4, Sphere, Euler } from 'three';\nimport { swapToGeoFrame, latitudeToSphericalPhi } from './GeoUtils.js';\n\nconst _spherical = new Spherical();\nconst _norm = new Vector3();\nconst _vec = new Vector3();\nconst _vec2 = new Vector3();\nconst _matrix = new Matrix4();\nconst _matrix2 = new Matrix4();\nconst _sphere = new Sphere();\nconst _euler = new Euler();\n\nconst _vecX = new Vector3();\nconst _vecY = new Vector3();\nconst _vecZ = new Vector3();\nconst _pos = new Vector3();\n\nconst _ray = new Ray();\n\nconst EPSILON12 = 1e-12;\nconst CENTER_EPS = 0.1;\n\nexport const ENU_FRAME = 0;\nexport const CAMERA_FRAME = 1;\nexport const OBJECT_FRAME = 2;\n\nexport class Ellipsoid {\n\n\tconstructor( x = 1, y = 1, z = 1 ) {\n\n\t\tthis.name = '';\n\t\tthis.radius = new Vector3( x, y, z );\n\n\t}\n\n\tintersectRay( ray, target ) {\n\n\t\t_matrix.makeScale( ...this.radius ).invert();\n\t\t_sphere.center.set( 0, 0, 0 );\n\t\t_sphere.radius = 1;\n\n\t\t_ray.copy( ray ).applyMatrix4( _matrix );\n\t\tif ( _ray.intersectSphere( _sphere, target ) ) {\n\n\t\t\t_matrix.makeScale( ...this.radius );\n\t\t\ttarget.applyMatrix4( _matrix );\n\t\t\treturn target;\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t}\n\n\t// returns a frame with Z indicating altitude\n\t// Y pointing north\n\t// X pointing east\n\tgetEastNorthUpFrame( lat, lon, target ) {\n\n\t\tthis.getEastNorthUpAxes( lat, lon, _vecX, _vecY, _vecZ, _pos );\n\t\treturn target.makeBasis( _vecX, _vecY, _vecZ ).setPosition( _pos );\n\n\t}\n\n\tgetEastNorthUpAxes( lat, lon, vecEast, vecNorth, vecUp, point = _pos ) {\n\n\t\tthis.getCartographicToPosition( lat, lon, 0, point );\n\t\tthis.getCartographicToNormal( lat, lon, vecUp );\t\t// up\n\t\tvecEast.set( - point.y, point.x, 0 ).normalize();\t\t// east\n\t\tvecNorth.crossVectors( vecUp, vecEast ).normalize();\t// north\n\n\t}\n\n\t// azimuth: measured off of true north, increasing towards \"east\"\n\t// elevation: measured off of the horizon, increasing towards sky\n\t// roll: rotation around northern axis\n\tgetAzElRollFromRotationMatrix( lat, lon, rotationMatrix, target, frame = ENU_FRAME ) {\n\n\t\t// if working with a frame that is not the ENU_FRAME then multiply in the\n\t\t// offset for a camera or object so \"forward\" and \"up\" are oriented correct\n\t\tif ( frame === CAMERA_FRAME ) {\n\n\t\t\t_euler.set( - Math.PI / 2, 0, 0, 'XYZ' );\n\t\t\t_matrix2.makeRotationFromEuler( _euler ).premultiply( rotationMatrix );\n\n\t\t} else if ( frame === OBJECT_FRAME ) {\n\n\t\t\t_euler.set( - Math.PI / 2, 0, Math.PI, 'XYZ' );\n\t\t\t_matrix2.makeRotationFromEuler( _euler ).premultiply( rotationMatrix );\n\n\t\t} else {\n\n\t\t\t_matrix2.copy( rotationMatrix );\n\n\t\t}\n\n\t\tthis.getEastNorthUpFrame( lat, lon, _matrix ).invert();\n\t\t_matrix2.premultiply( _matrix );\n\t\t_euler.setFromRotationMatrix( _matrix2, 'ZXY' );\n\n\t\ttarget.azimuth = - _euler.z;\n\t\ttarget.elevation = _euler.x;\n\t\ttarget.roll = _euler.y;\n\t\treturn target;\n\n\t}\n\n\tgetRotationMatrixFromAzElRoll( lat, lon, az, el, roll, target, frame = ENU_FRAME ) {\n\n\t\tthis.getEastNorthUpFrame( lat, lon, _matrix );\n\t\t_euler.set( el, roll, - az, 'ZXY' );\n\n\t\ttarget\n\t\t\t.makeRotationFromEuler( _euler )\n\t\t\t.premultiply( _matrix )\n\t\t\t.setPosition( 0, 0, 0 );\n\n\t\t// Add in the orientation adjustment for objects and cameras so \"forward\" and \"up\" are oriented\n\t\t// correctly\n\t\tif ( frame === CAMERA_FRAME ) {\n\n\t\t\t_euler.set( Math.PI / 2, 0, 0, 'XYZ' );\n\t\t\t_matrix2.makeRotationFromEuler( _euler );\n\t\t\ttarget.multiply( _matrix2 );\n\n\t\t} else if ( frame === OBJECT_FRAME ) {\n\n\t\t\t_euler.set( - Math.PI / 2, 0, Math.PI, 'XYZ' );\n\t\t\t_matrix2.makeRotationFromEuler( _euler );\n\t\t\ttarget.multiply( _matrix2 );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\tgetFrame( lat, lon, az, el, roll, height, target, frame = ENU_FRAME ) {\n\n\t\tthis.getRotationMatrixFromAzElRoll( lat, lon, az, el, roll, target, frame );\n\t\tthis.getCartographicToPosition( lat, lon, height, _pos );\n\t\ttarget.setPosition( _pos );\n\t\treturn target;\n\n\t}\n\n\tgetCartographicToPosition( lat, lon, height, target ) {\n\n\t\t// From Cesium function Ellipsoid.cartographicToCartesian\n\t\t// https://github.com/CesiumGS/cesium/blob/665ec32e813d5d6fe906ec3e87187f6c38ed5e49/packages/engine/Source/Core/Ellipsoid.js#L396\n\t\tthis.getCartographicToNormal( lat, lon, _norm );\n\n\t\tconst radius = this.radius;\n\t\t_vec.copy( _norm );\n\t\t_vec.x *= radius.x ** 2;\n\t\t_vec.y *= radius.y ** 2;\n\t\t_vec.z *= radius.z ** 2;\n\n\t\tconst gamma = Math.sqrt( _norm.dot( _vec ) );\n\t\t_vec.divideScalar( gamma );\n\n\t\treturn target.copy( _vec ).addScaledVector( _norm, height );\n\n\t}\n\n\tgetPositionToCartographic( pos, target ) {\n\n\t\t// From Cesium function Ellipsoid.cartesianToCartographic\n\t\t// https://github.com/CesiumGS/cesium/blob/665ec32e813d5d6fe906ec3e87187f6c38ed5e49/packages/engine/Source/Core/Ellipsoid.js#L463\n\t\tthis.getPositionToSurfacePoint( pos, _vec );\n\t\tthis.getPositionToNormal( pos, _norm );\n\n\t\tconst heightDelta = _vec2.subVectors( pos, _vec );\n\n\t\ttarget.lon = Math.atan2( _norm.y, _norm.x );\n\t\ttarget.lat = Math.asin( _norm.z );\n\t\ttarget.height = Math.sign( heightDelta.dot( pos ) ) * heightDelta.length();\n\t\treturn target;\n\n\t}\n\n\tgetCartographicToNormal( lat, lon, target ) {\n\n\t\t_spherical.set( 1, latitudeToSphericalPhi( lat ), lon );\n\t\ttarget.setFromSpherical( _spherical ).normalize();\n\n\t\t// swap frame from the three.js frame to the geo coord frame\n\t\tswapToGeoFrame( target );\n\t\treturn target;\n\n\t}\n\n\tgetPositionToNormal( pos, target ) {\n\n\t\tconst radius = this.radius;\n\t\ttarget.copy( pos );\n\t\ttarget.x /= radius.x ** 2;\n\t\ttarget.y /= radius.y ** 2;\n\t\ttarget.z /= radius.z ** 2;\n\t\ttarget.normalize();\n\n\t\treturn target;\n\n\t}\n\n\tgetPositionToSurfacePoint( pos, target ) {\n\n\t\t// From Cesium function Ellipsoid.scaleToGeodeticSurface\n\t\t// https://github.com/CesiumGS/cesium/blob/d11b746e5809ac115fcff65b7b0c6bdfe81dcf1c/packages/engine/Source/Core/scaleToGeodeticSurface.js#L25\n\t\tconst radius = this.radius;\n\t\tconst invRadiusSqX = 1 / ( radius.x ** 2 );\n\t\tconst invRadiusSqY = 1 / ( radius.y ** 2 );\n\t\tconst invRadiusSqZ = 1 / ( radius.z ** 2 );\n\n\t\tconst x2 = pos.x * pos.x * invRadiusSqX;\n\t\tconst y2 = pos.y * pos.y * invRadiusSqY;\n\t\tconst z2 = pos.z * pos.z * invRadiusSqZ;\n\n\t\t// Compute the squared ellipsoid norm.\n\t\tconst squaredNorm = x2 + y2 + z2;\n\t\tconst ratio = Math.sqrt( 1.0 / squaredNorm );\n\n\t\t// As an initial approximation, assume that the radial intersection is the projection point.\n\t\tconst intersection = _vec.copy( pos ).multiplyScalar( ratio );\n\t\tif ( squaredNorm < CENTER_EPS ) {\n\n\t\t\treturn ! isFinite( ratio ) ? null : target.copy( intersection );\n\n\t\t}\n\n\t\t// Use the gradient at the intersection point in place of the true unit normal.\n\t\t// The difference in magnitude will be absorbed in the multiplier.\n\t\tconst gradient = _vec2.set(\n\t\t\tintersection.x * invRadiusSqX * 2.0,\n\t\t\tintersection.y * invRadiusSqY * 2.0,\n\t\t\tintersection.z * invRadiusSqZ * 2.0\n\t\t);\n\n\t\t// Compute the initial guess at the normal vector multiplier, lambda.\n\t\tlet lambda = ( 1.0 - ratio ) * pos.length() / ( 0.5 * gradient.length() );\n\t\tlet correction = 0.0;\n\n\t\tlet func, denominator;\n\t\tlet xMultiplier, yMultiplier, zMultiplier;\n\t\tlet xMultiplier2, yMultiplier2, zMultiplier2;\n\t\tlet xMultiplier3, yMultiplier3, zMultiplier3;\n\n\t\tdo {\n\n\t\t\tlambda -= correction;\n\n\t\t\txMultiplier = 1.0 / ( 1.0 + lambda * invRadiusSqX );\n\t\t\tyMultiplier = 1.0 / ( 1.0 + lambda * invRadiusSqY );\n\t\t\tzMultiplier = 1.0 / ( 1.0 + lambda * invRadiusSqZ );\n\n\t\t\txMultiplier2 = xMultiplier * xMultiplier;\n\t\t\tyMultiplier2 = yMultiplier * yMultiplier;\n\t\t\tzMultiplier2 = zMultiplier * zMultiplier;\n\n\t\t\txMultiplier3 = xMultiplier2 * xMultiplier;\n\t\t\tyMultiplier3 = yMultiplier2 * yMultiplier;\n\t\t\tzMultiplier3 = zMultiplier2 * zMultiplier;\n\n\t\t\tfunc = x2 * xMultiplier2 + y2 * yMultiplier2 + z2 * zMultiplier2 - 1.0;\n\n\t\t\t// \"denominator\" here refers to the use of this expression in the velocity and acceleration\n\t\t\t// computations in the sections to follow.\n\t\t\tdenominator =\n\t\t\t\tx2 * xMultiplier3 * invRadiusSqX +\n\t\t\t\ty2 * yMultiplier3 * invRadiusSqY +\n\t\t\t\tz2 * zMultiplier3 * invRadiusSqZ;\n\n\t\t\tconst derivative = - 2.0 * denominator;\n\t\t\tcorrection = func / derivative;\n\n\t\t} while ( Math.abs( func ) > EPSILON12 );\n\n\t\treturn target.set(\n\t\t\tpos.x * xMultiplier,\n\t\t\tpos.y * yMultiplier,\n\t\t\tpos.z * zMultiplier\n\t\t);\n\n\t}\n\n\tcalculateHorizonDistance( latitude, elevation ) {\n\n\t\t// from https://aty.sdsu.edu/explain/atmos_refr/horizon.html\n\t\t// OG = sqrt ( 2 R h + h2 ) .\n\t\tconst effectiveRadius = this.calculateEffectiveRadius( latitude );\n\t\treturn Math.sqrt( 2 * effectiveRadius * elevation + elevation ** 2 );\n\n\t}\n\n\tcalculateEffectiveRadius( latitude ) {\n\n\t\t// This radius represents the distance from the center of the ellipsoid to the surface along the normal at the given latitude.\n\t\t// from https://en.wikipedia.org/wiki/Earth_radius#Prime_vertical\n\t\t// N = a / sqrt(1 - e^2 * sin^2(phi))\n\t\tconst semiMajorAxis = this.radius.x;\n\t\tconst semiMinorAxis = this.radius.z;\n\t\tconst eSquared = 1 - ( semiMinorAxis ** 2 / semiMajorAxis ** 2 );\n\t\tconst phi = latitude * MathUtils.DEG2RAD;\n\n\t\tconst sinPhiSquared = Math.sin( phi ) ** 2;\n\t\tconst N = semiMajorAxis / Math.sqrt( 1 - eSquared * sinPhiSquared );\n\t\treturn N;\n\n\t}\n\n\tgetPositionElevation( pos ) {\n\n\t\t// logic from \"getPositionToCartographic\"\n\t\tthis.getPositionToSurfacePoint( pos, _vec );\n\n\t\tconst heightDelta = _vec2.subVectors( pos, _vec );\n\t\treturn Math.sign( heightDelta.dot( pos ) ) * heightDelta.length();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.radius.copy( source.radius );\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n","import { WGS84_RADIUS, WGS84_HEIGHT } from '../../base/constants.js';\nimport { Ellipsoid } from './Ellipsoid.js';\n\nexport const WGS84_ELLIPSOID = new Ellipsoid( WGS84_RADIUS, WGS84_RADIUS, WGS84_HEIGHT );\nWGS84_ELLIPSOID.name = 'WGS84 Earth';\n","import { I3DMLoaderBase } from '../../base/loaders/I3DMLoaderBase.js';\nimport { DefaultLoadingManager, Matrix4, InstancedMesh, Vector3, Quaternion } from 'three';\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\nimport { WGS84_ELLIPSOID } from '../math/GeoConstants.js';\n\nconst tempFwd = /* @__PURE__ */ new Vector3();\nconst tempUp = /* @__PURE__ */ new Vector3();\nconst tempRight = /* @__PURE__ */ new Vector3();\nconst tempPos = /* @__PURE__ */ new Vector3();\nconst tempQuat = /* @__PURE__ */ new Quaternion();\nconst tempSca = /* @__PURE__ */ new Vector3();\nconst tempMat = /* @__PURE__ */ new Matrix4();\nconst tempMat2 = /* @__PURE__ */ new Matrix4();\n\nconst tempGlobePos = /* @__PURE__ */ new Vector3();\nconst tempEnuFrame = /* @__PURE__ */ new Matrix4();\nconst tempLocalQuat = /* @__PURE__ */ new Quaternion();\nconst tempLatLon = {};\n\nexport class I3DMLoader extends I3DMLoaderBase {\n\n\tconstructor( manager = DefaultLoadingManager ) {\n\n\t\tsuper();\n\t\tthis.manager = manager;\n\t\tthis.adjustmentTransform = new Matrix4();\n\t\tthis.ellipsoid = WGS84_ELLIPSOID.clone();\n\n\t}\n\n\tresolveExternalURL( url ) {\n\n\t\treturn this.manager.resolveURL( super.resolveExternalURL( url ) );\n\n\t}\n\n\tparse( buffer ) {\n\n\t\treturn super\n\t\t\t.parse( buffer )\n\t\t\t.then( i3dm => {\n\n\t\t\t\tconst { featureTable, batchTable } = i3dm;\n\t\t\t\tconst gltfBuffer = i3dm.glbBytes.slice().buffer;\n\t\t\t\treturn new Promise( ( resolve, reject ) => {\n\n\t\t\t\t\tconst fetchOptions = this.fetchOptions;\n\t\t\t\t\tconst manager = this.manager;\n\t\t\t\t\tconst loader = manager.getHandler( 'path.gltf' ) || new GLTFLoader( manager );\n\n\t\t\t\t\tif ( fetchOptions.credentials === 'include' && fetchOptions.mode === 'cors' ) {\n\n\t\t\t\t\t\tloader.setCrossOrigin( 'use-credentials' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( 'credentials' in fetchOptions ) {\n\n\t\t\t\t\t\tloader.setWithCredentials( fetchOptions.credentials === 'include' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( fetchOptions.headers ) {\n\n\t\t\t\t\t\tloader.setRequestHeader( fetchOptions.headers );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// GLTFLoader assumes the working path ends in a slash\n\t\t\t\t\tlet workingPath = i3dm.gltfWorkingPath ?? this.workingPath;\n\t\t\t\t\tif ( ! /[\\\\/]$/.test( workingPath ) ) {\n\n\t\t\t\t\t\tworkingPath += '/';\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst adjustmentTransform = this.adjustmentTransform;\n\n\t\t\t\t\tloader.parse( gltfBuffer, workingPath, model => {\n\n\t\t\t\t\t\tconst INSTANCES_LENGTH = featureTable.getData( 'INSTANCES_LENGTH' );\n\t\t\t\t\t\tconst POSITION = featureTable.getData( 'POSITION', INSTANCES_LENGTH, 'FLOAT', 'VEC3' );\n\t\t\t\t\t\tconst NORMAL_UP = featureTable.getData( 'NORMAL_UP', INSTANCES_LENGTH, 'FLOAT', 'VEC3' );\n\t\t\t\t\t\tconst NORMAL_RIGHT = featureTable.getData( 'NORMAL_RIGHT', INSTANCES_LENGTH, 'FLOAT', 'VEC3' );\n\t\t\t\t\t\tconst SCALE_NON_UNIFORM = featureTable.getData( 'SCALE_NON_UNIFORM', INSTANCES_LENGTH, 'FLOAT', 'VEC3' );\n\t\t\t\t\t\tconst SCALE = featureTable.getData( 'SCALE', INSTANCES_LENGTH, 'FLOAT', 'SCALAR' );\n\t\t\t\t\t\tconst RTC_CENTER = featureTable.getData( 'RTC_CENTER' );\n\t\t\t\t\t\tconst EAST_NORTH_UP = featureTable.getData( 'EAST_NORTH_UP' );\n\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t'QUANTIZED_VOLUME_OFFSET',\n\t\t\t\t\t\t\t'QUANTIZED_VOLUME_SCALE',\n\t\t\t\t\t\t\t'POSITION_QUANTIZED',\n\t\t\t\t\t\t\t'NORMAL_UP_OCT32P',\n\t\t\t\t\t\t\t'NORMAL_RIGHT_OCT32P',\n\t\t\t\t\t\t].forEach( feature => {\n\n\t\t\t\t\t\t\tif ( feature in featureTable.header ) {\n\n\t\t\t\t\t\t\t\tconsole.warn( `I3DMLoader: Unsupported FeatureTable feature \"${ feature }\" detected.` );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t// get the average vector center so we can avoid floating point error due to lower\n\t\t\t\t\t\t// precision transformation calculations on the GPU\n\t\t\t\t\t\tconst averageVector = new Vector3();\n\t\t\t\t\t\tfor ( let i = 0; i < INSTANCES_LENGTH; i ++ ) {\n\n\t\t\t\t\t\t\taverageVector.x += POSITION[ i * 3 + 0 ] / INSTANCES_LENGTH;\n\t\t\t\t\t\t\taverageVector.y += POSITION[ i * 3 + 1 ] / INSTANCES_LENGTH;\n\t\t\t\t\t\t\taverageVector.z += POSITION[ i * 3 + 2 ] / INSTANCES_LENGTH;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// find all the children and create associated instance meshes\n\t\t\t\t\t\tconst instances = [];\n\t\t\t\t\t\tconst meshes = [];\n\t\t\t\t\t\tmodel.scene.updateMatrixWorld();\n\n\t\t\t\t\t\tmodel.scene.traverse( child => {\n\n\t\t\t\t\t\t\tif ( child.isMesh ) {\n\n\t\t\t\t\t\t\t\tmeshes.push( child );\n\n\t\t\t\t\t\t\t\tconst { geometry, material } = child;\n\t\t\t\t\t\t\t\tconst instancedMesh = new InstancedMesh( geometry, material, INSTANCES_LENGTH );\n\t\t\t\t\t\t\t\tinstancedMesh.position.copy( averageVector );\n\n\t\t\t\t\t\t\t\tif ( RTC_CENTER ) {\n\n\t\t\t\t\t\t\t\t\tinstancedMesh.position.x += RTC_CENTER[ 0 ];\n\t\t\t\t\t\t\t\t\tinstancedMesh.position.y += RTC_CENTER[ 1 ];\n\t\t\t\t\t\t\t\t\tinstancedMesh.position.z += RTC_CENTER[ 2 ];\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tinstances.push( instancedMesh );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t// generate positions for all instances\n\t\t\t\t\t\tfor ( let i = 0; i < INSTANCES_LENGTH; i ++ ) {\n\n\t\t\t\t\t\t\t// position\n\t\t\t\t\t\t\ttempPos.set(\n\t\t\t\t\t\t\t\tPOSITION[ i * 3 + 0 ] - averageVector.x,\n\t\t\t\t\t\t\t\tPOSITION[ i * 3 + 1 ] - averageVector.y,\n\t\t\t\t\t\t\t\tPOSITION[ i * 3 + 2 ] - averageVector.z,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t// rotation\n\t\t\t\t\t\t\ttempQuat.identity();\n\n\t\t\t\t\t\t\t// account for EAST_NORTH_UP per-instance below\n\n\t\t\t\t\t\t\tif ( NORMAL_UP ) {\n\n\t\t\t\t\t\t\t\ttempUp.set(\n\t\t\t\t\t\t\t\t\tNORMAL_UP[ i * 3 + 0 ],\n\t\t\t\t\t\t\t\t\tNORMAL_UP[ i * 3 + 1 ],\n\t\t\t\t\t\t\t\t\tNORMAL_UP[ i * 3 + 2 ],\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\ttempRight.set(\n\t\t\t\t\t\t\t\t\tNORMAL_RIGHT[ i * 3 + 0 ],\n\t\t\t\t\t\t\t\t\tNORMAL_RIGHT[ i * 3 + 1 ],\n\t\t\t\t\t\t\t\t\tNORMAL_RIGHT[ i * 3 + 2 ],\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\ttempFwd.crossVectors( tempRight, tempUp )\n\t\t\t\t\t\t\t\t\t.normalize();\n\n\t\t\t\t\t\t\t\ttempMat.makeBasis(\n\t\t\t\t\t\t\t\t\ttempRight,\n\t\t\t\t\t\t\t\t\ttempUp,\n\t\t\t\t\t\t\t\t\ttempFwd,\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\ttempQuat.setFromRotationMatrix( tempMat );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// scale\n\t\t\t\t\t\t\ttempSca.set( 1, 1, 1 );\n\n\t\t\t\t\t\t\tif ( SCALE_NON_UNIFORM ) {\n\n\t\t\t\t\t\t\t\ttempSca.set(\n\t\t\t\t\t\t\t\t\tSCALE_NON_UNIFORM[ i * 3 + 0 ],\n\t\t\t\t\t\t\t\t\tSCALE_NON_UNIFORM[ i * 3 + 1 ],\n\t\t\t\t\t\t\t\t\tSCALE_NON_UNIFORM[ i * 3 + 2 ],\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( SCALE ) {\n\n\t\t\t\t\t\t\t\ttempSca.multiplyScalar( SCALE[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// multiple in the original meshes world transform\n\t\t\t\t\t\t\tfor ( let j = 0, l = instances.length; j < l; j ++ ) {\n\n\t\t\t\t\t\t\t\tconst instance = instances[ j ];\n\t\t\t\t\t\t\t\ttempLocalQuat.copy( tempQuat );\n\n\t\t\t\t\t\t\t\t// Handle east-north-up frame generation\n\t\t\t\t\t\t\t\tif ( EAST_NORTH_UP ) {\n\n\t\t\t\t\t\t\t\t\tinstance.updateMatrixWorld();\n\n\t\t\t\t\t\t\t\t\t// transform the instance position to global frame and get the rotation from the associated ENU frame.\n\t\t\t\t\t\t\t\t\ttempGlobePos.copy( tempPos ).applyMatrix4( instance.matrixWorld );\n\t\t\t\t\t\t\t\t\tthis.ellipsoid.getPositionToCartographic( tempGlobePos, tempLatLon );\n\t\t\t\t\t\t\t\t\tthis.ellipsoid.getEastNorthUpFrame( tempLatLon.lat, tempLatLon.lon, tempEnuFrame );\n\t\t\t\t\t\t\t\t\ttempLocalQuat.setFromRotationMatrix( tempEnuFrame );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\ttempMat.compose( tempPos, tempLocalQuat, tempSca ).multiply( adjustmentTransform );\n\n\t\t\t\t\t\t\t\tconst mesh = meshes[ j ];\n\t\t\t\t\t\t\t\ttempMat2.multiplyMatrices( tempMat, mesh.matrixWorld );\n\t\t\t\t\t\t\t\tinstance.setMatrixAt( i, tempMat2 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// replace all geometry with the instances\n\t\t\t\t\t\tmodel.scene.clear();\n\t\t\t\t\t\tmodel.scene.add( ...instances );\n\n\t\t\t\t\t\tmodel.batchTable = batchTable;\n\t\t\t\t\t\tmodel.featureTable = featureTable;\n\n\t\t\t\t\t\tmodel.scene.batchTable = batchTable;\n\t\t\t\t\t\tmodel.scene.featureTable = featureTable;\n\n\t\t\t\t\t\tresolve( model );\n\n\t\t\t\t\t}, reject );\n\n\t\t\t\t} );\n\n\t\t\t} );\n\n\t}\n\n}\n","// CMPT File Format\n// https://github.com/CesiumGS/3d-tiles/blob/master/specification/TileFormats/Composite/README.md\nimport { LoaderBase } from './LoaderBase.js';\nimport { readMagicBytes } from '../../utilities/readMagicBytes.js';\n\nexport class CMPTLoaderBase extends LoaderBase {\n\n\tparse( buffer ) {\n\n\t\tconst dataView = new DataView( buffer );\n\n\t\t// 16-byte header\n\n\t\t// 4 bytes\n\t\tconst magic = readMagicBytes( dataView );\n\n\t\tconsole.assert( magic === 'cmpt', 'CMPTLoader: The magic bytes equal \"cmpt\".' );\n\n\t\t// 4 bytes\n\t\tconst version = dataView.getUint32( 4, true );\n\n\t\tconsole.assert( version === 1, 'CMPTLoader: The version listed in the header is \"1\".' );\n\n\t\t// 4 bytes\n\t\tconst byteLength = dataView.getUint32( 8, true );\n\n\t\tconsole.assert( byteLength === buffer.byteLength, 'CMPTLoader: The contents buffer length listed in the header matches the file.' );\n\n\t\t// 4 bytes\n\t\tconst tilesLength = dataView.getUint32( 12, true );\n\n\t\tconst tiles = [];\n\t\tlet offset = 16;\n\t\tfor ( let i = 0; i < tilesLength; i ++ ) {\n\n\t\t\tconst tileView = new DataView( buffer, offset, 12 );\n\t\t\tconst tileMagic = readMagicBytes( tileView );\n\t\t\tconst tileVersion = tileView.getUint32( 4, true );\n\t\t\tconst byteLength = tileView.getUint32( 8, true );\n\n\t\t\tconst tileBuffer = new Uint8Array( buffer, offset, byteLength );\n\t\t\ttiles.push( {\n\n\t\t\t\ttype: tileMagic,\n\t\t\t\tbuffer: tileBuffer,\n\t\t\t\tversion: tileVersion,\n\n\t\t\t} );\n\t\t\toffset += byteLength;\n\n\t\t}\n\n\t\treturn {\n\t\t\tversion,\n\t\t\ttiles,\n\t\t};\n\n\t}\n\n}\n\n","import { Group, DefaultLoadingManager, Matrix4 } from 'three';\nimport { CMPTLoaderBase } from '../../base/loaders/CMPTLoaderBase.js';\nimport { B3DMLoader } from './B3DMLoader.js';\nimport { PNTSLoader } from './PNTSLoader.js';\nimport { I3DMLoader } from './I3DMLoader.js';\nimport { WGS84_ELLIPSOID } from '../math/GeoConstants.js';\n\nexport class CMPTLoader extends CMPTLoaderBase {\n\n\tconstructor( manager = DefaultLoadingManager ) {\n\n\t\tsuper();\n\t\tthis.manager = manager;\n\t\tthis.adjustmentTransform = new Matrix4();\n\t\tthis.ellipsoid = WGS84_ELLIPSOID.clone();\n\n\t}\n\n\tparse( buffer ) {\n\n\t\tconst result = super.parse( buffer );\n\t\tconst { manager, ellipsoid, adjustmentTransform } = this;\n\t\tconst promises = [];\n\n\t\tfor ( const i in result.tiles ) {\n\n\t\t\tconst { type, buffer } = result.tiles[ i ];\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 'b3dm': {\n\n\t\t\t\t\tconst slicedBuffer = buffer.slice();\n\t\t\t\t\tconst loader = new B3DMLoader( manager );\n\t\t\t\t\tloader.workingPath = this.workingPath;\n\t\t\t\t\tloader.fetchOptions = this.fetchOptions;\n\t\t\t\t\tloader.adjustmentTransform.copy( adjustmentTransform );\n\n\t\t\t\t\tconst promise = loader.parse( slicedBuffer.buffer );\n\t\t\t\t\tpromises.push( promise );\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tcase 'pnts': {\n\n\t\t\t\t\tconst slicedBuffer = buffer.slice();\n\t\t\t\t\tconst loader = new PNTSLoader( manager );\n\t\t\t\t\tloader.workingPath = this.workingPath;\n\t\t\t\t\tloader.fetchOptions = this.fetchOptions;\n\n\t\t\t\t\tconst promise = loader.parse( slicedBuffer.buffer );\n\t\t\t\t\tpromises.push( promise );\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tcase 'i3dm': {\n\n\t\t\t\t\tconst slicedBuffer = buffer.slice();\n\t\t\t\t\tconst loader = new I3DMLoader( manager );\n\t\t\t\t\tloader.workingPath = this.workingPath;\n\t\t\t\t\tloader.fetchOptions = this.fetchOptions;\n\n\t\t\t\t\tloader.ellipsoid.copy( ellipsoid );\n\t\t\t\t\tloader.adjustmentTransform.copy( adjustmentTransform );\n\n\t\t\t\t\tconst promise = loader.parse( slicedBuffer.buffer );\n\t\t\t\t\tpromises.push( promise );\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( promises ).then( results => {\n\n\t\t\tconst group = new Group();\n\t\t\tresults.forEach( result => {\n\n\t\t\t\tgroup.add( result.scene );\n\n\t\t\t} );\n\n\t\t\treturn {\n\n\t\t\t\ttiles: results,\n\t\t\t\tscene: group,\n\n\t\t\t};\n\n\t\t} );\n\n\t}\n\n}\n","import { Group, Matrix4 } from 'three';\n\n// Specialization of \"Group\" that only updates world matrices of children if\n// the transform has changed since the last update and ignores the \"force\"\n// parameter under the assumption that the children tiles will not move.\nconst tempMat = new Matrix4();\nexport class TilesGroup extends Group {\n\n\tconstructor( tilesRenderer ) {\n\n\t\tsuper();\n\t\tthis.isTilesGroup = true;\n\t\tthis.name = 'TilesRenderer.TilesGroup';\n\t\tthis.tilesRenderer = tilesRenderer;\n\t\tthis.matrixWorldInverse = new Matrix4();\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\t// returning \"false\" ends raycast traversal\n\t\tif ( this.tilesRenderer.optimizeRaycast ) {\n\n\t\t\tthis.tilesRenderer.raycast( raycaster, intersects );\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tif ( this.matrixAutoUpdate ) {\n\n\t\t\tthis.updateMatrix();\n\n\t\t}\n\n\t\tif ( this.matrixWorldNeedsUpdate || force ) {\n\n\t\t\tif ( this.parent === null ) {\n\n\t\t\t\ttempMat.copy( this.matrix );\n\n\t\t\t} else {\n\n\t\t\t\ttempMat.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\t// check if the matrix changed relative to what it was.\n\t\t\tconst elA = tempMat.elements;\n\t\t\tconst elB = this.matrixWorld.elements;\n\t\t\tlet isDifferent = false;\n\t\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\t\tconst itemA = elA[ i ];\n\t\t\t\tconst itemB = elB[ i ];\n\t\t\t\tconst diff = Math.abs( itemA - itemB );\n\n\t\t\t\tif ( diff > Number.EPSILON ) {\n\n\t\t\t\t\tisDifferent = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( isDifferent ) {\n\n\t\t\t\tthis.matrixWorld.copy( tempMat );\n\t\t\t\tthis.matrixWorldInverse.copy( tempMat ).invert();\n\n\t\t\t\t// update children\n\t\t\t\t// the children will not have to change unless the parent group has updated\n\t\t\t\tconst children = this.children;\n\t\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\t\tchildren[ i ].updateMatrixWorld();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n","import { Ray, Vector3 } from 'three';\n\n// In three.js r165 and higher raycast traversal can be ended early\nconst _localRay = new Ray();\nconst _vec = new Vector3();\nconst _hitArray = [];\n\nfunction distanceSort( a, b ) {\n\n\treturn a.distance - b.distance;\n\n}\n\nfunction intersectTileScene( tile, raycaster, renderer, intersects ) {\n\n\tconst { scene } = tile.cached;\n\tconst didRaycast = renderer.invokeOnePlugin( plugin => plugin.raycastTile && plugin.raycastTile( tile, scene, raycaster, intersects ) );\n\tif ( ! didRaycast ) {\n\n\t\traycaster.intersectObject( scene, true, intersects );\n\n\t}\n\n}\n\nfunction intersectTileSceneFirstHist( tile, raycaster, renderer ) {\n\n\tintersectTileScene( tile, raycaster, renderer, _hitArray );\n\t_hitArray.sort( distanceSort );\n\n\tconst hit = _hitArray[ 0 ] || null;\n\t_hitArray.length = 0;\n\treturn hit;\n\n}\n\nfunction isTileInitialized( tile ) {\n\n\treturn '__used' in tile;\n\n}\n\n// Returns the closest hit when traversing the tree\nexport function raycastTraverseFirstHit( renderer, tile, raycaster, localRay = null ) {\n\n\tconst { group, activeTiles } = renderer;\n\n\t// get the ray in the local group frame\n\tif ( localRay === null ) {\n\n\t\tlocalRay = _localRay;\n\t\tlocalRay.copy( raycaster.ray ).applyMatrix4( group.matrixWorldInverse );\n\n\t}\n\n\t// get a set of intersections so we intersect the nearest one first\n\tconst array = [];\n\tconst children = tile.children;\n\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\tconst child = children[ i ];\n\t\tif ( ! isTileInitialized( child ) || ! child.__used ) {\n\n\t\t\tcontinue;\n\n\t\t}\n\n\t\t// track the tile and hit distance for sorting\n\t\tconst boundingVolume = child.cached.boundingVolume;\n\t\tif ( boundingVolume.intersectRay( localRay, _vec ) !== null ) {\n\n\t\t\t_vec.applyMatrix4( group.matrixWorld );\n\t\t\tarray.push( {\n\t\t\t\tdistance: _vec.distanceToSquared( raycaster.ray.origin ),\n\t\t\t\ttile: child,\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\t// sort them by ascending distance\n\tarray.sort( distanceSort );\n\n\t// If the root is active make sure we've checked it\n\tlet bestHit = null;\n\tlet bestHitDistSq = Infinity;\n\tif ( activeTiles.has( tile ) ) {\n\n\t\tconst hit = intersectTileSceneFirstHist( tile, raycaster, renderer );\n\t\tif ( hit ) {\n\n\t\t\tbestHit = hit;\n\t\t\tbestHitDistSq = hit.distance * hit.distance;\n\n\t\t}\n\n\t}\n\n\t// traverse until we find the best hit and early out if a tile bounds\n\t// couldn't possible include a best hit\n\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\tconst data = array[ i ];\n\t\tconst boundingVolumeDistSq = data.distance;\n\t\tconst tile = data.tile;\n\t\tif ( boundingVolumeDistSq > bestHitDistSq ) {\n\n\t\t\tbreak;\n\n\t\t}\n\n\t\tconst hit = raycastTraverseFirstHit( renderer, tile, raycaster, localRay );\n\t\tif ( hit ) {\n\n\t\t\tconst hitDistSq = hit.distance * hit.distance;\n\t\t\tif ( hitDistSq < bestHitDistSq ) {\n\n\t\t\t\tbestHit = hit;\n\t\t\t\tbestHitDistSq = hitDistSq;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn bestHit;\n\n}\n\nexport function raycastTraverse( renderer, tile, raycaster, intersects, localRay = null ) {\n\n\t// if the tile has not been asynchronously initialized then there's no point in\n\t// traversing the tiles to check intersections.\n\tif ( ! isTileInitialized( tile ) ) {\n\n\t\treturn;\n\n\t}\n\n\tconst { group, activeTiles } = renderer;\n\tconst { boundingVolume } = tile.cached;\n\n\t// get the ray in the local group frame\n\tif ( localRay === null ) {\n\n\t\tlocalRay = _localRay;\n\t\tlocalRay.copy( raycaster.ray ).applyMatrix4( group.matrixWorldInverse );\n\n\t}\n\n\t// exit early if the tile isn't used or the bounding volume is not intersected\n\tif ( ! tile.__used || ! boundingVolume.intersectsRay( localRay ) ) {\n\n\t\treturn;\n\n\t}\n\n\t// only intersect the tile geometry if it's active\n\tif ( activeTiles.has( tile ) ) {\n\n\t\tintersectTileScene( tile, raycaster, renderer, intersects );\n\n\t}\n\n\tconst children = tile.children;\n\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\traycastTraverse( renderer, children[ i ], raycaster, intersects, localRay );\n\n\t}\n\n}\n","import { Matrix4, Box3, Vector3, Plane, Ray } from 'three';\n\nconst _worldMin = new Vector3();\nconst _worldMax = new Vector3();\nconst _norm = new Vector3();\nconst _ray = new Ray();\n\nexport class OBB {\n\n\tconstructor( box = new Box3(), transform = new Matrix4() ) {\n\n\t\tthis.box = box.clone();\n\t\tthis.transform = transform.clone();\n\t\tthis.inverseTransform = new Matrix4();\n\t\tthis.points = new Array( 8 ).fill().map( () => new Vector3() );\n\t\tthis.planes = new Array( 6 ).fill().map( () => new Plane() );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.box.copy( source.box );\n\t\tthis.transform.copy( source.transform );\n\t\tthis.update();\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Clamps the given point within the bounds of this OBB\n\t * @param {Vector3} point\n\t * @param {Vector3} result\n\t * @returns {Vector3}\n\t */\n\tclampPoint( point, result ) {\n\n\t\treturn result.copy( point )\n\t\t\t.applyMatrix4( this.inverseTransform )\n\t\t\t.clamp( this.box.min, this.box.max )\n\t\t\t.applyMatrix4( this.transform );\n\n\t}\n\n\t/**\n\t * Returns the distance from any edge of this OBB to the specified point.\n\t * If the point lies inside of this box, the distance will be 0.\n\t * @param {Vector3} point\n\t * @returns {number}\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.clampPoint( point, _norm ).distanceTo( point );\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\t_norm.copy( point ).applyMatrix4( this.inverseTransform );\n\t\treturn this.box.containsPoint( _norm );\n\n\t}\n\n\t// returns boolean indicating whether the ray has intersected the obb\n\tintersectsRay( ray ) {\n\n\t\t_ray.copy( ray ).applyMatrix4( this.inverseTransform );\n\t\treturn _ray.intersectsBox( this.box );\n\n\t}\n\n\t// Sets \"target\" equal to the intersection point.\n\t// Returns \"null\" if no intersection found.\n\tintersectRay( ray, target ) {\n\n\t\t_ray.copy( ray ).applyMatrix4( this.inverseTransform );\n\t\tif ( _ray.intersectBox( this.box, target ) ) {\n\n\t\t\ttarget.applyMatrix4( this.transform );\n\t\t\treturn target;\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t}\n\n\tupdate() {\n\n\t\tconst { points, inverseTransform, transform, box } = this;\n\t\tinverseTransform.copy( transform ).invert();\n\n\t\tconst { min, max } = box;\n\t\tlet index = 0;\n\t\tfor ( let x = - 1; x <= 1; x += 2 ) {\n\n\t\t\tfor ( let y = - 1; y <= 1; y += 2 ) {\n\n\t\t\t\tfor ( let z = - 1; z <= 1; z += 2 ) {\n\n\t\t\t\t\tpoints[ index ].set(\n\t\t\t\t\t\tx < 0 ? min.x : max.x,\n\t\t\t\t\t\ty < 0 ? min.y : max.y,\n\t\t\t\t\t\tz < 0 ? min.z : max.z,\n\t\t\t\t\t).applyMatrix4( transform );\n\t\t\t\t\tindex ++;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.updatePlanes();\n\n\t}\n\n\tupdatePlanes() {\n\n\t\t_worldMin.copy( this.box.min ).applyMatrix4( this.transform );\n\t\t_worldMax.copy( this.box.max ).applyMatrix4( this.transform );\n\n\t\t_norm.set( 0, 0, 1 ).transformDirection( this.transform );\n\t\tthis.planes[ 0 ].setFromNormalAndCoplanarPoint( _norm, _worldMin );\n\t\tthis.planes[ 1 ].setFromNormalAndCoplanarPoint( _norm, _worldMax ).negate();\n\n\t\t_norm.set( 0, 1, 0 ).transformDirection( this.transform );\n\t\tthis.planes[ 2 ].setFromNormalAndCoplanarPoint( _norm, _worldMin );\n\t\tthis.planes[ 3 ].setFromNormalAndCoplanarPoint( _norm, _worldMax ).negate();\n\n\t\t_norm.set( 1, 0, 0 ).transformDirection( this.transform );\n\t\tthis.planes[ 4 ].setFromNormalAndCoplanarPoint( _norm, _worldMin );\n\t\tthis.planes[ 5 ].setFromNormalAndCoplanarPoint( _norm, _worldMax ).negate();\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\tthis.clampPoint( sphere.center, _norm );\n\t\treturn _norm.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\tintersectsFrustum( frustum ) {\n\n\t\treturn this._intersectsPlaneShape( frustum.planes, frustum.points );\n\n\t}\n\n\tintersectsOBB( obb ) {\n\n\t\treturn this._intersectsPlaneShape( obb.planes, obb.points );\n\n\t}\n\n\t// takes a series of 6 planes that define and enclosed shape and the 8 points that lie at the corners\n\t// of that shape to determine whether the OBB is intersected with.\n\t_intersectsPlaneShape( otherPlanes, otherPoints ) {\n\n\t\tconst thisPoints = this.points;\n\t\tconst thisPlanes = this.planes;\n\n\t\t// based on three.js' Box3 \"intersects frustum\" function\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst plane = otherPlanes[ i ];\n\t\t\tlet maxDistance = - Infinity;\n\t\t\tfor ( let j = 0; j < 8; j ++ ) {\n\n\t\t\t\tconst v = thisPoints[ j ];\n\t\t\t\tconst dist = plane.distanceToPoint( v );\n\t\t\t\tmaxDistance = maxDistance < dist ? dist : maxDistance;\n\n\t\t\t}\n\n\t\t\tif ( maxDistance < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// do the opposite check using the obb planes to avoid false positives\n\t\t// this check is not performed by three.js' AABB logic but helps prevent a lot incorrect intersection reports\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst plane = thisPlanes[ i ];\n\t\t\tlet maxDistance = - Infinity;\n\t\t\tfor ( let j = 0; j < 8; j ++ ) {\n\n\t\t\t\tconst v = otherPoints[ j ];\n\t\t\t\tconst dist = plane.distanceToPoint( v );\n\t\t\t\tmaxDistance = maxDistance < dist ? dist : maxDistance;\n\n\t\t\t}\n\n\t\t\tif ( maxDistance < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n}\n","import { MathUtils, Matrix4 } from 'three';\nimport { Vector3 } from 'three';\nimport { Ellipsoid } from './Ellipsoid.js';\n\nconst PI = Math.PI;\nconst HALF_PI = PI / 2;\n\nconst _orthoX = new Vector3();\nconst _orthoY = new Vector3();\nconst _orthoZ = new Vector3();\nconst _invMatrix = new Matrix4();\n\nlet _poolIndex = 0;\nconst _pointsPool = [];\nfunction getVector( usePool = false ) {\n\n\tif ( ! usePool ) {\n\n\t\treturn new Vector3();\n\n\t}\n\n\tif ( ! _pointsPool[ _poolIndex ] ) {\n\n\t\t_pointsPool[ _poolIndex ] = new Vector3();\n\n\t}\n\n\t_poolIndex ++;\n\treturn _pointsPool[ _poolIndex - 1 ];\n\n}\n\nfunction resetPool() {\n\n\t_poolIndex = 0;\n\n}\n\nexport class EllipsoidRegion extends Ellipsoid {\n\n\tconstructor(\n\t\tx, y, z,\n\t\tlatStart = - HALF_PI, latEnd = HALF_PI,\n\t\tlonStart = 0, lonEnd = 2 * PI,\n\t\theightStart = 0, heightEnd = 0\n\t) {\n\n\t\tsuper( x, y, z );\n\t\tthis.latStart = latStart;\n\t\tthis.latEnd = latEnd;\n\t\tthis.lonStart = lonStart;\n\t\tthis.lonEnd = lonEnd;\n\t\tthis.heightStart = heightStart;\n\t\tthis.heightEnd = heightEnd;\n\n\t}\n\n\t_getPoints( usePool = false ) {\n\n\t\tconst {\n\t\t\tlatStart, latEnd,\n\t\t\tlonStart, lonEnd,\n\t\t\theightStart, heightEnd,\n\t\t} = this;\n\n\t\tconst midLat = MathUtils.mapLinear( 0.5, 0, 1, latStart, latEnd );\n\t\tconst midLon = MathUtils.mapLinear( 0.5, 0, 1, lonStart, lonEnd );\n\n\t\tconst lonOffset = Math.floor( lonStart / HALF_PI ) * HALF_PI;\n\t\tconst latlon = [\n\t\t\t[ - PI / 2, 0 ],\n\t\t\t[ PI / 2, 0 ],\n\t\t\t[ 0, lonOffset ],\n\t\t\t[ 0, lonOffset + PI / 2 ],\n\t\t\t[ 0, lonOffset + PI ],\n\t\t\t[ 0, lonOffset + 3 * PI / 2 ],\n\n\t\t\t[ latStart, lonEnd ],\n\t\t\t[ latEnd, lonEnd ],\n\t\t\t[ latStart, lonStart ],\n\t\t\t[ latEnd, lonStart ],\n\n\t\t\t[ 0, lonStart ],\n\t\t\t[ 0, lonEnd ],\n\n\t\t\t[ midLat, midLon ],\n\t\t\t[ latStart, midLon ],\n\t\t\t[ latEnd, midLon ],\n\t\t\t[ midLat, lonStart ],\n\t\t\t[ midLat, lonEnd ],\n\n\t\t];\n\n\t\tconst target = [];\n\t\tconst total = latlon.length;\n\n\t\tfor ( let z = 0; z <= 1; z ++ ) {\n\n\t\t\tconst height = MathUtils.mapLinear( z, 0, 1, heightStart, heightEnd );\n\t\t\tfor ( let i = 0, l = total; i < l; i ++ ) {\n\n\t\t\t\tconst [ lat, lon ] = latlon[ i ];\n\t\t\t\tif ( lat >= latStart && lat <= latEnd && lon >= lonStart && lon <= lonEnd ) {\n\n\t\t\t\t\tconst v = getVector( usePool );\n\t\t\t\t\ttarget.push( v );\n\t\t\t\t\tthis.getCartographicToPosition( lat, lon, height, v );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\tgetBoundingBox( box, matrix ) {\n\n\t\tresetPool();\n\n\t\tconst {\n\t\t\tlatStart, latEnd,\n\t\t\tlonStart, lonEnd,\n\t\t} = this;\n\n\t\tconst latRange = latEnd - latStart;\n\t\tif ( latRange < PI / 2 ) {\n\n\t\t\t// get the midway point for the region\n\t\t\tconst midLat = MathUtils.mapLinear( 0.5, 0, 1, latStart, latEnd );\n\t\t\tconst midLon = MathUtils.mapLinear( 0.5, 0, 1, lonStart, lonEnd );\n\n\t\t\t// get the frame matrix for the box - works well for smaller regions\n\t\t\tthis.getCartographicToNormal( midLat, midLon, _orthoZ );\n\t\t\t_orthoY.set( 0, 0, 1 );\n\t\t\t_orthoX.crossVectors( _orthoY, _orthoZ );\n\t\t\t_orthoY.crossVectors( _orthoX, _orthoZ );\n\t\t\tmatrix.makeBasis( _orthoX, _orthoY, _orthoZ );\n\n\t\t} else {\n\n\t\t\t_orthoX.set( 1, 0, 0 );\n\t\t\t_orthoY.set( 0, 1, 0 );\n\t\t\t_orthoZ.set( 0, 0, 1 );\n\t\t\tmatrix.makeBasis( _orthoX, _orthoY, _orthoZ );\n\n\t\t}\n\n\t\t// transform the points into the local frame\n\t\t_invMatrix.copy( matrix ).invert();\n\n\t\tconst points = this._getPoints( true );\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tpoints[ i ].applyMatrix4( _invMatrix );\n\n\t\t}\n\n\t\t// init the box\n\t\tbox.makeEmpty();\n\t\tbox.setFromPoints( points );\n\n\t}\n\n\tgetBoundingSphere( sphere, center ) {\n\n\t\tresetPool();\n\n\t\tconst points = this._getPoints( true );\n\t\tsphere.makeEmpty();\n\t\tsphere.setFromPoints( points, center );\n\n\t}\n\n}\n","import { Vector3, Sphere } from 'three';\nimport { OBB } from './OBB.js';\nimport { EllipsoidRegion } from './EllipsoidRegion.js';\n\nconst _vecX = new Vector3();\nconst _vecY = new Vector3();\nconst _vecZ = new Vector3();\nconst _sphereVec = new Vector3();\nconst _obbVec = new Vector3();\n\n// TODO: check region more precisely in all functions\nexport class TileBoundingVolume {\n\n\tconstructor() {\n\n\t\tthis.sphere = null;\n\t\tthis.obb = null;\n\t\tthis.region = null;\n\n\t\tthis.regionObb = null;\n\n\t}\n\n\tintersectsRay( ray ) {\n\n\t\tconst sphere = this.sphere;\n\t\tconst obb = this.obb || this.regionObb;\n\n\t\t// Early out if we don't hit this tile sphere\n\t\tif ( sphere && ! ray.intersectsSphere( sphere ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// Early out if we don't this this tile box\n\t\tif ( obb && ! obb.intersectsRay( ray ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tintersectRay( ray, target = null ) {\n\n\t\tconst sphere = this.sphere;\n\t\tconst obb = this.obb || this.regionObb;\n\n\t\tlet sphereDistSq = - Infinity;\n\t\tlet obbDistSq = - Infinity;\n\n\t\tif ( sphere ) {\n\n\t\t\tif ( ray.intersectSphere( sphere, _sphereVec ) ) {\n\n\t\t\t\tsphereDistSq = sphere.containsPoint( ray.origin ) ? 0 : ray.origin.distanceToSquared( _sphereVec );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( obb ) {\n\n\t\t\tif ( obb.intersectRay( ray, _obbVec ) ) {\n\n\t\t\t\tobbDistSq = obb.containsPoint( ray.origin ) ? 0 : ray.origin.distanceToSquared( _obbVec );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// if we didn't hit anything then exit\n\t\tconst furthestDist = Math.max( sphereDistSq, obbDistSq );\n\t\tif ( furthestDist === - Infinity ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// get the furthest hit point if needed\n\t\tray.at( Math.sqrt( furthestDist ), target );\n\t\treturn target;\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\tconst sphere = this.sphere;\n\t\tconst obb = this.obb || this.regionObb;\n\n\t\tlet sphereDistance = - Infinity;\n\t\tlet obbDistance = - Infinity;\n\n\t\tif ( sphere ) {\n\n\t\t\t// Sphere#distanceToPoint is negative inside the sphere, whereas Box3#distanceToPoint is\n\t\t\t// zero inside the box. Clipping the distance to a minimum of zero ensures that both\n\t\t\t// types of bounding volume behave the same way.\n\t\t\tsphereDistance = Math.max( sphere.distanceToPoint( point ), 0 );\n\n\t\t}\n\n\t\tif ( obb ) {\n\n\t\t\tobbDistance = obb.distanceToPoint( point );\n\n\t\t}\n\n\t\t// return the further distance of the two volumes\n\t\treturn sphereDistance > obbDistance ? sphereDistance : obbDistance;\n\n\t}\n\n\tintersectsFrustum( frustum ) {\n\n\t\tconst obb = this.obb || this.regionObb;\n\t\tconst sphere = this.sphere;\n\t\tif ( sphere && ! frustum.intersectsSphere( sphere ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tif ( obb && ! obb.intersectsFrustum( frustum ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// if we don't have a sphere or obb then just say we did intersect\n\t\treturn Boolean( sphere || obb );\n\n\t}\n\n\tintersectsSphere( otherSphere ) {\n\n\t\tconst obb = this.obb || this.regionObb;\n\t\tconst sphere = this.sphere;\n\t\tif ( sphere && ! sphere.intersectsSphere( otherSphere ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tif ( obb && ! obb.intersectsSphere( otherSphere ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn Boolean( sphere || obb );\n\n\t}\n\n\tintersectsOBB( otherObb ) {\n\n\t\tconst obb = this.obb || this.regionObb;\n\t\tconst sphere = this.sphere;\n\t\tif ( sphere && ! otherObb.intersectsSphere( sphere ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tif ( obb && ! obb.intersectsOBB( otherObb ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn Boolean( sphere || obb );\n\n\t}\n\n\tgetOBB( targetBox, targetMatrix ) {\n\n\t\tconst obb = this.obb || this.regionObb;\n\t\tif ( obb ) {\n\n\t\t\ttargetBox.copy( obb.box );\n\t\t\ttargetMatrix.copy( obb.transform );\n\n\t\t} else {\n\n\t\t\tthis.getAABB( targetBox );\n\t\t\ttargetMatrix.identity();\n\n\t\t}\n\n\t}\n\n\tgetAABB( target ) {\n\n\t\tif ( this.sphere ) {\n\n\t\t\tthis.sphere.getBoundingBox( target );\n\n\t\t} else {\n\n\t\t\tconst obb = this.obb || this.regionObb;\n\t\t\ttarget.copy( obb.box ).applyMatrix4( obb.transform );\n\n\t\t}\n\n\t}\n\n\tgetSphere( target ) {\n\n\t\tif ( this.sphere ) {\n\n\t\t\ttarget.copy( this.sphere );\n\n\t\t} else if ( this.region ) {\n\n\t\t\tthis.region.getBoundingSphere( target );\n\n\t\t} else {\n\n\t\t\tconst obb = this.obb || this.regionObb;\n\t\t\tobb.box.getBoundingSphere( target );\n\t\t\ttarget.applyMatrix4( obb.transform );\n\n\t\t}\n\n\t}\n\n\tsetObbData( data, transform ) {\n\n\t\tconst obb = new OBB();\n\n\t\t// get the extents of the bounds in each axis\n\t\t_vecX.set( data[ 3 ], data[ 4 ], data[ 5 ] );\n\t\t_vecY.set( data[ 6 ], data[ 7 ], data[ 8 ] );\n\t\t_vecZ.set( data[ 9 ], data[ 10 ], data[ 11 ] );\n\n\t\tconst scaleX = _vecX.length();\n\t\tconst scaleY = _vecY.length();\n\t\tconst scaleZ = _vecZ.length();\n\n\t\t_vecX.normalize();\n\t\t_vecY.normalize();\n\t\t_vecZ.normalize();\n\n\t\t// handle the case where the box has a dimension of 0 in one axis\n\t\tif ( scaleX === 0 ) {\n\n\t\t\t_vecX.crossVectors( _vecY, _vecZ );\n\n\t\t}\n\n\t\tif ( scaleY === 0 ) {\n\n\t\t\t_vecY.crossVectors( _vecX, _vecZ );\n\n\t\t}\n\n\t\tif ( scaleZ === 0 ) {\n\n\t\t\t_vecZ.crossVectors( _vecX, _vecY );\n\n\t\t}\n\n\t\t// create the oriented frame that the box exists in\n\t\tobb.transform\n\t\t\t.set(\n\t\t\t\t_vecX.x, _vecY.x, _vecZ.x, data[ 0 ],\n\t\t\t\t_vecX.y, _vecY.y, _vecZ.y, data[ 1 ],\n\t\t\t\t_vecX.z, _vecY.z, _vecZ.z, data[ 2 ],\n\t\t\t\t0, 0, 0, 1\n\t\t\t)\n\t\t\t.premultiply( transform );\n\n\t\t// scale the box by the extents\n\t\tobb.box.min.set( - scaleX, - scaleY, - scaleZ );\n\t\tobb.box.max.set( scaleX, scaleY, scaleZ );\n\t\tobb.update();\n\t\tthis.obb = obb;\n\n\t}\n\n\tsetSphereData( x, y, z, radius, transform ) {\n\n\t\tconst sphere = new Sphere();\n\t\tsphere.center.set( x, y, z );\n\t\tsphere.radius = radius;\n\t\tsphere.applyMatrix4( transform );\n\t\tthis.sphere = sphere;\n\n\t}\n\n\tsetRegionData( ellipsoid, west, south, east, north, minHeight, maxHeight ) {\n\n\t\tconst region = new EllipsoidRegion(\n\t\t\t...ellipsoid.radius,\n\t\t\tsouth, north,\n\t\t\twest, east,\n\t\t\tminHeight, maxHeight,\n\t\t);\n\n\t\tconst obb = new OBB();\n\t\tregion.getBoundingBox( obb.box, obb.transform );\n\t\tobb.update();\n\n\t\tthis.region = region;\n\t\tthis.regionObb = obb;\n\n\t}\n\n}\n","import { Frustum, Matrix3, Vector3 } from 'three';\n\nconst _mat3 = new Matrix3();\n\n// Solve a system of equations to find the point where the three planes intersect\nfunction findIntersectionPoint( plane1, plane2, plane3, target ) {\n\n\t// Create the matrix A using the normals of the planes as rows\n\tconst A = _mat3.set(\n\t\tplane1.normal.x, plane1.normal.y, plane1.normal.z,\n\t\tplane2.normal.x, plane2.normal.y, plane2.normal.z,\n\t\tplane3.normal.x, plane3.normal.y, plane3.normal.z\n\t);\n\n\t// Create the vector B using the constants of the planes\n\ttarget.set( - plane1.constant, - plane2.constant, - plane3.constant );\n\n\t// Solve for X by applying the inverse matrix to B\n\ttarget.applyMatrix3( A.invert() );\n\n\treturn target;\n\n}\n\nclass ExtendedFrustum extends Frustum {\n\n\tconstructor() {\n\n\t\tsuper();\n\t\tthis.points = Array( 8 ).fill().map( () => new Vector3() );\n\n\t}\n\n\tsetFromProjectionMatrix( m, coordinateSystem ) {\n\n\t\tsuper.setFromProjectionMatrix( m, coordinateSystem );\n\t\tthis.calculateFrustumPoints();\n\t\treturn this;\n\n\t}\n\n\tcalculateFrustumPoints() {\n\n\t\tconst { planes, points } = this;\n\t\tconst planeIntersections = [\n\t\t\t[ planes[ 0 ], planes[ 3 ], planes[ 4 ] ], // Near top left\n\t\t\t[ planes[ 1 ], planes[ 3 ], planes[ 4 ] ], // Near top right\n\t\t\t[ planes[ 0 ], planes[ 2 ], planes[ 4 ] ], // Near bottom left\n\t\t\t[ planes[ 1 ], planes[ 2 ], planes[ 4 ] ], // Near bottom right\n\t\t\t[ planes[ 0 ], planes[ 3 ], planes[ 5 ] ], // Far top left\n\t\t\t[ planes[ 1 ], planes[ 3 ], planes[ 5 ] ], // Far top right\n\t\t\t[ planes[ 0 ], planes[ 2 ], planes[ 5 ] ], // Far bottom left\n\t\t\t[ planes[ 1 ], planes[ 2 ], planes[ 5 ] ], // Far bottom right\n\t\t];\n\n\t\tplaneIntersections.forEach( ( planes, index ) => {\n\n\t\t\tfindIntersectionPoint( planes[ 0 ], planes[ 1 ], planes[ 2 ], points[ index ] );\n\n\t\t} );\n\n\t}\n\n}\n\nexport { ExtendedFrustum };\n","import { estimateBytesUsed as _estimateBytesUsed } from 'three/examples/jsm/utils/BufferGeometryUtils.js';\nimport * as THREE from 'three';\n\n// Returns the estimated number of bytes used by the object\nexport function estimateBytesUsed( object ) {\n\n\t// NOTE: This is for backwards compatibility and should be removed later\n\tconst { TextureUtils } = THREE;\n\tif ( ! TextureUtils ) {\n\n\t\treturn 0;\n\n\t}\n\n\tconst dedupeSet = new Set();\n\n\tlet totalBytes = 0;\n\tobject.traverse( c => {\n\n\t\t// get geometry bytes\n\t\tif ( c.geometry && ! dedupeSet.has( c.geometry ) ) {\n\n\t\t\ttotalBytes += _estimateBytesUsed( c.geometry );\n\t\t\tdedupeSet.add( c.geometry );\n\n\t\t}\n\n\t\t// get material bytes\n\t\tif ( c.material ) {\n\n\t\t\tconst material = c.material;\n\t\t\tfor ( const key in material ) {\n\n\t\t\t\tconst value = material[ key ];\n\t\t\t\tif ( value && value.isTexture && ! dedupeSet.has( value ) ) {\n\n\t\t\t\t\tconst { format, type, image } = value;\n\t\t\t\t\tconst { width, height } = image;\n\t\t\t\t\tconst bytes = TextureUtils.getByteLength( width, height, format, type );\n\t\t\t\t\ttotalBytes += value.generateMipmaps ? bytes * 4 / 3 : bytes;\n\n\t\t\t\t\tdedupeSet.add( value );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\treturn totalBytes;\n\n}\n","import { TilesRendererBase } from '../base/TilesRendererBase.js';\nimport { B3DMLoader } from './loaders/B3DMLoader.js';\nimport { PNTSLoader } from './loaders/PNTSLoader.js';\nimport { I3DMLoader } from './loaders/I3DMLoader.js';\nimport { CMPTLoader } from './loaders/CMPTLoader.js';\nimport { TilesGroup } from './TilesGroup.js';\nimport {\n\tMatrix4,\n\tVector3,\n\tVector2,\n\tEuler,\n\tLoadingManager,\n\tEventDispatcher,\n\tGroup,\n} from 'three';\nimport { raycastTraverse, raycastTraverseFirstHit } from './raycastTraverse.js';\nimport { readMagicBytes } from '../utilities/readMagicBytes.js';\nimport { TileBoundingVolume } from './math/TileBoundingVolume.js';\nimport { ExtendedFrustum } from './math/ExtendedFrustum.js';\nimport { estimateBytesUsed } from './utilities.js';\nimport { WGS84_ELLIPSOID } from './math/GeoConstants.js';\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\n\nconst _mat = new Matrix4();\nconst _euler = new Euler();\n\n// In three.js r165 and higher raycast traversal can be ended early\nconst INITIAL_FRUSTUM_CULLED = Symbol( 'INITIAL_FRUSTUM_CULLED' );\nconst tempMat = new Matrix4();\nconst tempVector = new Vector3();\nconst tempVector2 = new Vector2();\nconst viewErrorTarget = {\n\tinView: false,\n\terror: Infinity,\n};\n\nconst X_AXIS = new Vector3( 1, 0, 0 );\nconst Y_AXIS = new Vector3( 0, 1, 0 );\n\nfunction updateFrustumCulled( object, toInitialValue ) {\n\n\tobject.traverse( c => {\n\n\t\tc.frustumCulled = c[ INITIAL_FRUSTUM_CULLED ] && toInitialValue;\n\n\t} );\n\n}\n\nexport class TilesRenderer extends TilesRendererBase {\n\n\tget autoDisableRendererCulling() {\n\n\t\treturn this._autoDisableRendererCulling;\n\n\t}\n\n\tset autoDisableRendererCulling( value ) {\n\n\t\tif ( this._autoDisableRendererCulling !== value ) {\n\n\t\t\tsuper._autoDisableRendererCulling = value;\n\t\t\tthis.forEachLoadedModel( ( scene ) => {\n\n\t\t\t\tupdateFrustumCulled( scene, ! value );\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\tget optimizeRaycast() {\n\n\t\treturn this._optimizeRaycast;\n\n\t}\n\n\tset optimizeRaycast( v ) {\n\n\t\tconsole.warn( 'TilesRenderer: The \"optimizeRaycast\" option has been deprecated.' );\n\t\tthis._optimizeRaycast = v;\n\n\t}\n\n\tconstructor( ...args ) {\n\n\t\tsuper( ...args );\n\t\tthis.group = new TilesGroup( this );\n\t\tthis.ellipsoid = WGS84_ELLIPSOID.clone();\n\t\tthis.cameras = [];\n\t\tthis.cameraMap = new Map();\n\t\tthis.cameraInfo = [];\n\t\tthis._optimizeRaycast = true;\n\t\tthis._upRotationMatrix = new Matrix4();\n\n\t\tthis.lruCache.computeMemoryUsageCallback = tile => tile.cached.bytesUsed ?? null;\n\n\t\t// flag indicating whether frustum culling should be disabled\n\t\tthis._autoDisableRendererCulling = true;\n\n\t\tconst manager = new LoadingManager();\n\t\tmanager.setURLModifier( url => {\n\n\t\t\tif ( this.preprocessURL ) {\n\n\t\t\t\treturn this.preprocessURL( url );\n\n\t\t\t} else {\n\n\t\t\t\treturn url;\n\n\t\t\t}\n\n\t\t} );\n\t\tthis.manager = manager;\n\n\t\t// saved for event dispatcher functions\n\t\tthis._listeners = {};\n\n\t}\n\n\taddEventListener( ...args ) {\n\n\t\tEventDispatcher.prototype.addEventListener.call( this, ...args );\n\n\t}\n\n\thasEventListener( ...args ) {\n\n\t\tEventDispatcher.prototype.hasEventListener.call( this, ...args );\n\n\t}\n\n\tremoveEventListener( ...args ) {\n\n\t\tEventDispatcher.prototype.removeEventListener.call( this, ...args );\n\n\t}\n\n\tdispatchEvent( ...args ) {\n\n\t\tEventDispatcher.prototype.dispatchEvent.call( this, ...args );\n\n\t}\n\n\t/* Public API */\n\tgetBoundingBox( target ) {\n\n\t\tif ( ! this.root ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tconst boundingVolume = this.root.cached.boundingVolume;\n\t\tif ( boundingVolume ) {\n\n\t\t\tboundingVolume.getAABB( target );\n\t\t\treturn true;\n\n\t\t} else {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\tgetOrientedBoundingBox( targetBox, targetMatrix ) {\n\n\t\tif ( ! this.root ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tconst boundingVolume = this.root.cached.boundingVolume;\n\t\tif ( boundingVolume ) {\n\n\t\t\tboundingVolume.getOBB( targetBox, targetMatrix );\n\t\t\treturn true;\n\n\t\t} else {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\tgetBoundingSphere( target ) {\n\n\t\tif ( ! this.root ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tconst boundingVolume = this.root.cached.boundingVolume;\n\t\tif ( boundingVolume ) {\n\n\t\t\tboundingVolume.getSphere( target );\n\t\t\treturn true;\n\n\t\t} else {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\tforEachLoadedModel( callback ) {\n\n\t\tthis.traverse( tile => {\n\n\t\t\tconst scene = tile.cached && tile.cached.scene;\n\t\t\tif ( scene ) {\n\n\t\t\t\tcallback( scene, tile );\n\n\t\t\t}\n\n\t\t}, null, false );\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tif ( ! this.root ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( raycaster.firstHitOnly ) {\n\n\t\t\tconst hit = raycastTraverseFirstHit( this, this.root, raycaster );\n\t\t\tif ( hit ) {\n\n\t\t\t\tintersects.push( hit );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\traycastTraverse( this, this.root, raycaster, intersects );\n\n\t\t}\n\n\t}\n\n\thasCamera( camera ) {\n\n\t\treturn this.cameraMap.has( camera );\n\n\t}\n\n\tsetCamera( camera ) {\n\n\t\tconst cameras = this.cameras;\n\t\tconst cameraMap = this.cameraMap;\n\t\tif ( ! cameraMap.has( camera ) ) {\n\n\t\t\tcameraMap.set( camera, new Vector2() );\n\t\t\tcameras.push( camera );\n\t\t\tthis.dispatchEvent( { type: 'add-camera', camera } );\n\n\t\t\treturn true;\n\n\t\t}\n\t\treturn false;\n\n\t}\n\n\tsetResolution( camera, xOrVec, y ) {\n\n\t\tconst cameraMap = this.cameraMap;\n\t\tif ( ! cameraMap.has( camera ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tconst width = xOrVec.isVector2 ? xOrVec.x : xOrVec;\n\t\tconst height = xOrVec.isVector2 ? xOrVec.y : y;\n\t\tconst cameraVec = cameraMap.get( camera );\n\n\t\tif ( cameraVec.width !== width || cameraVec.height !== height ) {\n\n\t\t\tcameraVec.set( width, height );\n\t\t\tthis.dispatchEvent( { type: 'camera-resolution-change' } );\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tsetResolutionFromRenderer( camera, renderer ) {\n\n\t\trenderer.getSize( tempVector2 );\n\n\t\treturn this.setResolution( camera, tempVector2.x, tempVector2.y );\n\n\t}\n\n\tdeleteCamera( camera ) {\n\n\t\tconst cameras = this.cameras;\n\t\tconst cameraMap = this.cameraMap;\n\t\tif ( cameraMap.has( camera ) ) {\n\n\t\t\tconst index = cameras.indexOf( camera );\n\t\t\tcameras.splice( index, 1 );\n\t\t\tcameraMap.delete( camera );\n\t\t\tthis.dispatchEvent( { type: 'delete-camera', camera } );\n\n\t\t\treturn true;\n\n\t\t}\n\t\treturn false;\n\n\t}\n\n\t/* Overriden */\n\tloadRootTileSet( ...args ) {\n\n\t\treturn super.loadRootTileSet( ...args )\n\t\t\t.then( root => {\n\n\t\t\t\t// cache the gltf tile set rotation matrix\n\t\t\t\tconst { asset, extensions = {} } = root;\n\t\t\t\tconst upAxis = asset && asset.gltfUpAxis || 'y';\n\t\t\t\tswitch ( upAxis.toLowerCase() ) {\n\n\t\t\t\t\tcase 'x':\n\t\t\t\t\t\tthis._upRotationMatrix.makeRotationAxis( Y_AXIS, - Math.PI / 2 );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'y':\n\t\t\t\t\t\tthis._upRotationMatrix.makeRotationAxis( X_AXIS, Math.PI / 2 );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\t// update the ellipsoid based on the extension\n\t\t\t\tif ( '3DTILES_ellipsoid' in extensions ) {\n\n\t\t\t\t\tconst ext = extensions[ '3DTILES_ellipsoid' ];\n\t\t\t\t\tconst { ellipsoid } = this;\n\t\t\t\t\tellipsoid.name = ext.body;\n\t\t\t\t\tif ( ext.radii ) {\n\n\t\t\t\t\t\tellipsoid.radius.set( ...ext.radii );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tellipsoid.radius.set( 1, 1, 1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn root;\n\n\t\t\t} );\n\n\t}\n\n\tupdate() {\n\n\t\t// check if the plugins that can block the tile updates require it\n\t\tlet needsUpdate = null;\n\t\tthis.invokeAllPlugins( plugin => {\n\n\t\t\tif ( plugin.doTilesNeedUpdate ) {\n\n\t\t\t\tconst res = plugin.doTilesNeedUpdate();\n\t\t\t\tif ( needsUpdate === null ) {\n\n\t\t\t\t\tneedsUpdate = res;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tneedsUpdate = Boolean( needsUpdate || res );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\tif ( needsUpdate === false ) {\n\n\t\t\tthis.dispatchEvent( { type: 'update-before' } );\n\t\t\tthis.dispatchEvent( { type: 'update-after' } );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// follow through with the update\n\t\tthis.dispatchEvent( { type: 'update-before' } );\n\n\t\tconst group = this.group;\n\t\tconst cameras = this.cameras;\n\t\tconst cameraMap = this.cameraMap;\n\t\tconst cameraInfo = this.cameraInfo;\n\n\t\t// automatically scale the array of cameraInfo to match the cameras\n\t\twhile ( cameraInfo.length > cameras.length ) {\n\n\t\t\tcameraInfo.pop();\n\n\t\t}\n\n\t\twhile ( cameraInfo.length < cameras.length ) {\n\n\t\t\tcameraInfo.push( {\n\n\t\t\t\tfrustum: new ExtendedFrustum(),\n\t\t\t\tisOrthographic: false,\n\t\t\t\tsseDenominator: - 1, // used if isOrthographic:false\n\t\t\t\tposition: new Vector3(),\n\t\t\t\tinvScale: - 1,\n\t\t\t\tpixelSize: 0, // used if isOrthographic:true\n\n\t\t\t} );\n\n\t\t}\n\n\t\t// extract scale of group container\n\t\ttempVector.setFromMatrixScale( group.matrixWorldInverse );\n\t\tif ( Math.abs( Math.max( tempVector.x - tempVector.y, tempVector.x - tempVector.z ) ) > 1e-6 ) {\n\n\t\t\tconsole.warn( 'ThreeTilesRenderer : Non uniform scale used for tile which may cause issues when calculating screen space error.' );\n\n\t\t}\n\n\t\t// store the camera cameraInfo in the 3d tiles root frame\n\t\tfor ( let i = 0, l = cameraInfo.length; i < l; i ++ ) {\n\n\t\t\tconst camera = cameras[ i ];\n\t\t\tconst info = cameraInfo[ i ];\n\t\t\tconst frustum = info.frustum;\n\t\t\tconst position = info.position;\n\t\t\tconst resolution = cameraMap.get( camera );\n\n\t\t\tif ( resolution.width === 0 || resolution.height === 0 ) {\n\n\t\t\t\tconsole.warn( 'TilesRenderer: resolution for camera error calculation is not set.' );\n\n\t\t\t}\n\n\t\t\t// Read the calculated projection matrix directly to support custom Camera implementations\n\t\t\tconst projection = camera.projectionMatrix.elements;\n\n\t\t\t// The last element of the projection matrix is 1 for orthographic, 0 for perspective\n\t\t\tinfo.isOrthographic = projection[ 15 ] === 1;\n\n\t\t\tif ( info.isOrthographic ) {\n\n\t\t\t\t// See OrthographicCamera.updateProjectionMatrix and Matrix4.makeOrthographic:\n\t\t\t\t// the view width and height are used to populate matrix elements 0 and 5.\n\t\t\t\tconst w = 2 / projection[ 0 ];\n\t\t\t\tconst h = 2 / projection[ 5 ];\n\t\t\t\tinfo.pixelSize = Math.max( h / resolution.height, w / resolution.width );\n\n\t\t\t} else {\n\n\t\t\t\t// See PerspectiveCamera.updateProjectionMatrix and Matrix4.makePerspective:\n\t\t\t\t// the vertical FOV is used to populate matrix element 5.\n\t\t\t\tinfo.sseDenominator = ( 2 / projection[ 5 ] ) / resolution.height;\n\n\t\t\t}\n\n\t\t\t// get frustum in group root frame\n\t\t\ttempMat.copy( group.matrixWorld );\n\t\t\ttempMat.premultiply( camera.matrixWorldInverse );\n\t\t\ttempMat.premultiply( camera.projectionMatrix );\n\n\t\t\tfrustum.setFromProjectionMatrix( tempMat );\n\n\t\t\t// get transform position in group root frame\n\t\t\tposition.set( 0, 0, 0 );\n\t\t\tposition.applyMatrix4( camera.matrixWorld );\n\t\t\tposition.applyMatrix4( group.matrixWorldInverse );\n\n\t\t}\n\n\t\tsuper.update();\n\n\t\tthis.dispatchEvent( { type: 'update-after' } );\n\n\t\t// check for cameras _after_ base update so we can enable pre-loading the root tile set\n\t\tif ( cameras.length === 0 && this.root ) {\n\n\t\t\tlet found = false;\n\t\t\tthis.invokeAllPlugins( plugin => found = found || Boolean( plugin !== this && plugin.calculateTileViewError ) );\n\t\t\tif ( found === false ) {\n\n\t\t\t\tconsole.warn( 'TilesRenderer: no cameras defined. Cannot update 3d tiles.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tpreprocessNode( tile, tileSetDir, parentTile = null ) {\n\n\t\tsuper.preprocessNode( tile, tileSetDir, parentTile );\n\n\t\tconst transform = new Matrix4();\n\t\tif ( tile.transform ) {\n\n\t\t\tconst transformArr = tile.transform;\n\t\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\t\ttransform.elements[ i ] = transformArr[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( parentTile ) {\n\n\t\t\ttransform.premultiply( parentTile.cached.transform );\n\n\t\t}\n\n\t\tconst transformInverse = new Matrix4().copy( transform ).invert();\n\t\tconst boundingVolume = new TileBoundingVolume();\n\t\tif ( 'sphere' in tile.boundingVolume ) {\n\n\t\t\tboundingVolume.setSphereData( ...tile.boundingVolume.sphere, transform );\n\n\t\t}\n\n\t\tif ( 'box' in tile.boundingVolume ) {\n\n\t\t\tboundingVolume.setObbData( tile.boundingVolume.box, transform );\n\n\t\t}\n\n\t\tif ( 'region' in tile.boundingVolume ) {\n\n\t\t\tboundingVolume.setRegionData( this.ellipsoid, ...tile.boundingVolume.region );\n\n\t\t}\n\n\t\ttile.cached = {\n\n\t\t\ttransform,\n\t\t\ttransformInverse,\n\n\t\t\tactive: false,\n\n\t\t\tboundingVolume,\n\n\t\t\tmetadata: null,\n\t\t\tscene: null,\n\t\t\tgeometry: null,\n\t\t\tmaterials: null,\n\t\t\ttextures: null,\n\n\t\t};\n\n\t}\n\n\tasync parseTile( buffer, tile, extension, uri, abortSignal ) {\n\n\t\tconst cached = tile.cached;\n\t\tconst uriSplits = uri.split( /[\\\\/]/g );\n\t\turiSplits.pop();\n\t\tconst workingPath = uriSplits.join( '/' );\n\t\tconst fetchOptions = this.fetchOptions;\n\n\t\tconst manager = this.manager;\n\t\tlet promise = null;\n\n\t\tconst cachedTransform = cached.transform;\n\t\tconst upRotationMatrix = this._upRotationMatrix;\n\t\tconst fileType = ( readMagicBytes( buffer ) || extension ).toLowerCase();\n\t\tswitch ( fileType ) {\n\n\t\t\tcase 'b3dm': {\n\n\t\t\t\tconst loader = new B3DMLoader( manager );\n\t\t\t\tloader.workingPath = workingPath;\n\t\t\t\tloader.fetchOptions = fetchOptions;\n\n\t\t\t\tloader.adjustmentTransform.copy( upRotationMatrix );\n\n\t\t\t\tpromise = loader.parse( buffer );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tcase 'pnts': {\n\n\t\t\t\tconst loader = new PNTSLoader( manager );\n\t\t\t\tloader.workingPath = workingPath;\n\t\t\t\tloader.fetchOptions = fetchOptions;\n\t\t\t\tpromise = loader.parse( buffer );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tcase 'i3dm': {\n\n\t\t\t\tconst loader = new I3DMLoader( manager );\n\t\t\t\tloader.workingPath = workingPath;\n\t\t\t\tloader.fetchOptions = fetchOptions;\n\n\t\t\t\tloader.adjustmentTransform.copy( upRotationMatrix );\n\t\t\t\tloader.ellipsoid.copy( this.ellipsoid );\n\n\t\t\t\tpromise = loader.parse( buffer );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tcase 'cmpt': {\n\n\t\t\t\tconst loader = new CMPTLoader( manager );\n\t\t\t\tloader.workingPath = workingPath;\n\t\t\t\tloader.fetchOptions = fetchOptions;\n\n\t\t\t\tloader.adjustmentTransform.copy( upRotationMatrix );\n\t\t\t\tloader.ellipsoid.copy( this.ellipsoid );\n\n\t\t\t\tpromise = loader\n\t\t\t\t\t.parse( buffer )\n\t\t\t\t\t.then( res => res.scene\t);\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\t// 3DTILES_content_gltf\n\t\t\tcase 'gltf':\n\t\t\tcase 'glb': {\n\n\t\t\t\tconst loader = manager.getHandler( 'path.gltf' ) || manager.getHandler( 'path.glb' ) || new GLTFLoader( manager );\n\t\t\t\tloader.setWithCredentials( fetchOptions.credentials === 'include' );\n\t\t\t\tloader.setRequestHeader( fetchOptions.headers || {} );\n\t\t\t\tif ( fetchOptions.credentials === 'include' && fetchOptions.mode === 'cors' ) {\n\n\t\t\t\t\tloader.setCrossOrigin( 'use-credentials' );\n\n\t\t\t\t}\n\n\t\t\t\t// assume any pre-registered loader has paths configured as the user desires, but if we're making\n\t\t\t\t// a new loader, use the working path during parse to support relative uris on other hosts\n\t\t\t\tlet resourcePath = loader.resourcePath || loader.path || workingPath;\n\t\t\t\tif ( ! /[\\\\/]$/.test( resourcePath ) && resourcePath.length ) {\n\n\t\t\t\t\tresourcePath += '/';\n\n\t\t\t\t}\n\n\t\t\t\tpromise = loader.parseAsync( buffer, resourcePath ).then( result => {\n\n\t\t\t\t\t// glTF files are not guaranteed to include a scene object\n\t\t\t\t\tresult.scene = result.scene || new Group();\n\n\t\t\t\t\t// apply the local up-axis correction rotation\n\t\t\t\t\t// GLTFLoader seems to never set a transformation on the root scene object so\n\t\t\t\t\t// any transformations applied to it can be assumed to be applied after load\n\t\t\t\t\t// (such as applying RTC_CENTER) meaning they should happen _after_ the z-up\n\t\t\t\t\t// rotation fix which is why \"multiply\" happens here.\n\t\t\t\t\tconst { scene } = result;\n\t\t\t\t\tscene.updateMatrix();\n\t\t\t\t\tscene.matrix\n\t\t\t\t\t\t.multiply( upRotationMatrix )\n\t\t\t\t\t\t.decompose( scene.position, scene.quaternion, scene.scale );\n\n\t\t\t\t\treturn result;\n\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tdefault: {\n\n\t\t\t\tpromise = this.invokeOnePlugin( plugin => plugin.parseToMesh && plugin.parseToMesh( buffer, tile, extension, uri, abortSignal ) );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// wait for the tile to load\n\t\tconst result = await promise;\n\t\tif ( result === null ) {\n\n\t\t\tthrow new Error( `TilesRenderer: Content type \"${ fileType }\" not supported.` );\n\n\t\t}\n\n\t\t// get the scene data\n\t\tlet scene;\n\t\tlet metadata;\n\t\tif ( result.isObject3D ) {\n\n\t\t\tscene = result;\n\t\t\tmetadata = null;\n\n\t\t} else {\n\n\t\t\tscene = result.scene;\n\t\t\tmetadata = result;\n\n\t\t}\n\n\t\t// wait for extra processing by plugins if needed\n\t\tawait this.invokeAllPlugins( plugin => {\n\n\t\t\treturn plugin.processTileModel && plugin.processTileModel( scene, tile );\n\n\t\t} );\n\n\t\t// ensure the matrix is up to date in case the scene has a transform applied\n\t\tscene.updateMatrix();\n\t\tscene.matrix.premultiply( cachedTransform );\n\t\tscene.matrix.decompose( scene.position, scene.quaternion, scene.scale );\n\t\tscene.traverse( c => {\n\n\t\t\tc[ INITIAL_FRUSTUM_CULLED ] = c.frustumCulled;\n\n\t\t} );\n\t\tupdateFrustumCulled( scene, ! this.autoDisableRendererCulling );\n\n\t\t// collect all original geometries, materials, etc to be disposed of later\n\t\tconst materials = [];\n\t\tconst geometry = [];\n\t\tconst textures = [];\n\t\tscene.traverse( c => {\n\n\t\t\tif ( c.geometry ) {\n\n\t\t\t\tgeometry.push( c.geometry );\n\n\t\t\t}\n\n\t\t\tif ( c.material ) {\n\n\t\t\t\tconst material = c.material;\n\t\t\t\tmaterials.push( c.material );\n\n\t\t\t\tfor ( const key in material ) {\n\n\t\t\t\t\tconst value = material[ key ];\n\t\t\t\t\tif ( value && value.isTexture ) {\n\n\t\t\t\t\t\ttextures.push( 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\t// exit early if a new request has already started\n\t\tif ( abortSignal.aborted ) {\n\n\t\t\t// dispose of any image bitmaps that have been opened.\n\t\t\t// TODO: share this code with the \"disposeTile\" code below, possibly allow for the tiles\n\t\t\t// renderer base to trigger a disposal of unneeded data\n\t\t\tfor ( let i = 0, l = textures.length; i < l; i ++ ) {\n\n\t\t\t\tconst texture = textures[ i ];\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\ttexture.dispose();\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tcached.materials = materials;\n\t\tcached.geometry = geometry;\n\t\tcached.textures = textures;\n\t\tcached.scene = scene;\n\t\tcached.metadata = metadata;\n\t\tcached.bytesUsed = estimateBytesUsed( scene );\n\n\t}\n\n\tdisposeTile( tile ) {\n\n\t\tsuper.disposeTile( tile );\n\n\t\t// This could get called before the tile has finished downloading\n\t\tconst cached = tile.cached;\n\t\tif ( cached.scene ) {\n\n\t\t\tconst materials = cached.materials;\n\t\t\tconst geometry = cached.geometry;\n\t\t\tconst textures = cached.textures;\n\t\t\tconst parent = cached.scene.parent;\n\n\t\t\t// dispose of any textures required by the mesh features extension\n\t\t\t// TODO: these are being discarded here to remove the image bitmaps -\n\t\t\t// can this be handled in another way? Or more generically?\n\t\t\tcached.scene.traverse( child => {\n\n\t\t\t\tif ( child.userData.meshFeatures ) {\n\n\t\t\t\t\tchild.userData.meshFeatures.dispose();\n\n\t\t\t\t}\n\n\t\t\t\tif ( child.userData.structuralMetadata ) {\n\n\t\t\t\t\tchild.userData.structuralMetadata.dispose();\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tfor ( let i = 0, l = geometry.length; i < l; i ++ ) {\n\n\t\t\t\tgeometry[ i ].dispose();\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\tmaterials[ i ].dispose();\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = textures.length; i < l; i ++ ) {\n\n\t\t\t\tconst texture = textures[ i ];\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\ttexture.dispose();\n\n\t\t\t}\n\n\t\t\tif ( parent ) {\n\n\t\t\t\tparent.remove( cached.scene );\n\n\t\t\t}\n\n\t\t\tthis.dispatchEvent( {\n\t\t\t\ttype: 'dispose-model',\n\t\t\t\tscene: cached.scene,\n\t\t\t\ttile,\n\t\t\t} );\n\n\t\t\tcached.scene = null;\n\t\t\tcached.materials = null;\n\t\t\tcached.textures = null;\n\t\t\tcached.geometry = null;\n\t\t\tcached.metadata = null;\n\n\t\t}\n\n\t}\n\n\tsetTileVisible( tile, visible ) {\n\n\t\tconst scene = tile.cached.scene;\n\t\tconst group = this.group;\n\n\t\tif ( visible ) {\n\n\t\t\tif ( scene ) {\n\n\t\t\t\tgroup.add( scene );\n\t\t\t\tscene.updateMatrixWorld( true );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( scene ) {\n\n\t\t\t\tgroup.remove( scene );\n\n\t\t\t}\n\n\t\t}\n\n\t\tsuper.setTileVisible( tile, visible );\n\n\t\tthis.dispatchEvent( {\n\t\t\ttype: 'tile-visibility-change',\n\t\t\tscene,\n\t\t\ttile,\n\t\t\tvisible,\n\t\t} );\n\n\t}\n\n\tcalculateTileViewError( tile, target ) {\n\n\t\tconst cached = tile.cached;\n\t\tconst cameras = this.cameras;\n\t\tconst cameraInfo = this.cameraInfo;\n\t\tconst boundingVolume = cached.boundingVolume;\n\n\t\tlet inView = false;\n\t\tlet inViewError = - Infinity;\n\t\tlet inViewDistance = Infinity;\n\t\tlet maxError = - Infinity;\n\t\tlet minDistance = Infinity;\n\n\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t// calculate the camera error\n\t\t\tconst info = cameraInfo[ i ];\n\t\t\tlet error;\n\t\t\tlet distance;\n\t\t\tif ( info.isOrthographic ) {\n\n\t\t\t\tconst pixelSize = info.pixelSize;\n\t\t\t\terror = tile.geometricError / pixelSize;\n\t\t\t\tdistance = Infinity;\n\n\t\t\t} else {\n\n\t\t\t\tconst sseDenominator = info.sseDenominator;\n\t\t\t\tdistance = boundingVolume.distanceToPoint( info.position );\n\t\t\t\terror = tile.geometricError / ( distance * sseDenominator );\n\n\t\t\t}\n\n\t\t\t// Track which camera frustums this tile is in so we can use it\n\t\t\t// to ignore the error calculations for cameras that can't see it\n\t\t\tconst frustum = cameraInfo[ i ].frustum;\n\t\t\tif ( boundingVolume.intersectsFrustum( frustum ) ) {\n\n\t\t\t\tinView = true;\n\t\t\t\tinViewError = Math.max( inViewError, error );\n\t\t\t\tinViewDistance = Math.min( inViewDistance, distance );\n\n\t\t\t}\n\n\t\t\tmaxError = Math.max( maxError, error );\n\t\t\tminDistance = Math.min( minDistance, distance );\n\n\t\t}\n\n\t\t// check the plugin visibility\n\t\tthis.invokeAllPlugins( plugin => {\n\n\t\t\tif ( plugin !== this && plugin.calculateTileViewError ) {\n\n\t\t\t\tplugin.calculateTileViewError( tile, viewErrorTarget );\n\t\t\t\tif ( viewErrorTarget.inView ) {\n\n\t\t\t\t\tinView = true;\n\t\t\t\t\tinViewError = Math.max( inViewError, viewErrorTarget.error );\n\n\t\t\t\t}\n\n\t\t\t\tmaxError = Math.max( maxError, viewErrorTarget.error );\n\n\t\t\t}\n\n\t\t} );\n\n\t\t// If the tiles are out of view then use the global distance and error calculated\n\t\tif ( inView ) {\n\n\t\t\ttarget.inView = true;\n\t\t\ttarget.error = inViewError;\n\t\t\ttarget.distanceToCamera = inViewDistance;\n\n\t\t} else {\n\n\t\t\ttarget.inView = false;\n\t\t\ttarget.error = maxError;\n\t\t\ttarget.distanceToCamera = minDistance;\n\n\t\t}\n\n\t}\n\n\t// TODO: deprecate this function and provide a plugin to help with this\n\t// adjust the rotation of the group such that Y is altitude, X is North, and Z is East\n\tsetLatLonToYUp( lat, lon ) {\n\n\t\tconsole.warn( 'TilesRenderer: setLatLonToYUp is deprecated. Use the ReorientationPlugin, instead.' );\n\n\t\tconst { ellipsoid, group } = this;\n\n\t\t_euler.set( Math.PI / 2, Math.PI / 2, 0 );\n\t\t_mat.makeRotationFromEuler( _euler );\n\n\t\tellipsoid.getEastNorthUpFrame( lat, lon, group.matrix )\n\t\t\t.multiply( _mat )\n\t\t\t.invert()\n\t\t\t.decompose(\n\t\t\t\tgroup.position,\n\t\t\t\tgroup.quaternion,\n\t\t\t\tgroup.scale,\n\t\t\t);\n\n\t\tgroup.updateMatrixWorld( true );\n\n\t}\n\n\tdispose() {\n\n\t\tsuper.dispose();\n\t\tthis.group.removeFromParent();\n\n\t}\n\n}\n","import { Mesh, PlaneGeometry, ShaderMaterial, Vector2 } from 'three';\nexport class PivotPointMesh extends Mesh {\n\n\tconstructor() {\n\n\t\tsuper( new PlaneGeometry( 0, 0 ), new PivotMaterial() );\n\t\tthis.renderOrder = Infinity;\n\n\t}\n\n\tonBeforeRender( renderer ) {\n\n\t\tconst uniforms = this.material.uniforms;\n\t\trenderer.getSize( uniforms.resolution.value );\n\n\t}\n\n\tupdateMatrixWorld() {\n\n\t\tthis.matrixWorld.makeTranslation( this.position );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nclass PivotMaterial extends ShaderMaterial {\n\n\tconstructor() {\n\n\t\tsuper( {\n\n\t\t\tdepthWrite: false,\n\t\t\tdepthTest: false,\n\t\t\ttransparent: true,\n\n\t\t\tuniforms: {\n\n\t\t\t\tresolution: { value: new Vector2() },\n\t\t\t\tsize: { value: 15 },\n\t\t\t\tthickness: { value: 2 },\n\t\t\t\topacity: { value: 1 },\n\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tuniform float pixelRatio;\n\t\t\t\tuniform float size;\n\t\t\t\tuniform float thickness;\n\t\t\t\tuniform vec2 resolution;\n\t\t\t\tvarying vec2 vUv;\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvUv = uv;\n\n\t\t\t\t\tfloat aspect = resolution.x / resolution.y;\n\t\t\t\t\tvec2 offset = uv * 2.0 - vec2( 1.0 );\n\t\t\t\t\toffset.y *= aspect;\n\n\t\t\t\t\tvec4 screenPoint = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t\tscreenPoint.xy += offset * ( size + thickness ) * screenPoint.w / resolution.x;\n\n\t\t\t\t\tgl_Position = screenPoint;\n\n\t\t\t\t}\n\t\t\t`,\n\n\t\t\tfragmentShader: /* glsl */`\n\n\t\t\t\tuniform float size;\n\t\t\t\tuniform float thickness;\n\t\t\t\tuniform float opacity;\n\n\t\t\t\tvarying vec2 vUv;\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tfloat ht = 0.5 * thickness;\n\t\t\t\t\tfloat planeDim = size + thickness;\n\t\t\t\t\tfloat offset = ( planeDim - ht - 2.0 ) / planeDim;\n\t\t\t\t\tfloat texelThickness = ht / planeDim;\n\n\t\t\t\t\tvec2 vec = vUv * 2.0 - vec2( 1.0 );\n\t\t\t\t\tfloat dist = abs( length( vec ) - offset );\n\t\t\t\t\tfloat fw = fwidth( dist ) * 0.5;\n\t\t\t\t\tfloat a = smoothstep( texelThickness - fw, texelThickness + fw, dist );\n\n\t\t\t\t\tgl_FragColor = vec4( 1, 1, 1, opacity * ( 1.0 - a ) );\n\n\t\t\t\t}\n\t\t\t`,\n\n\t\t} );\n\n\t}\n\n}\n","import { Vector2 } from 'three';\n\nconst _vec = new Vector2();\nconst _vec2 = new Vector2();\nexport class PointerTracker {\n\n\tconstructor() {\n\n\t\tthis.domElement = null;\n\t\tthis.buttons = 0;\n\t\tthis.pointerType = null;\n\t\tthis.pointerOrder = [];\n\t\tthis.previousPositions = {};\n\t\tthis.pointerPositions = {};\n\t\tthis.startPositions = {};\n\t\tthis.pointerSetThisFrame = {};\n\t\tthis.hoverPosition = new Vector2();\n\t\tthis.hoverSet = false;\n\n\t}\n\n\treset() {\n\n\t\tthis.buttons = 0;\n\t\tthis.pointerType = null;\n\t\tthis.pointerOrder = [];\n\t\tthis.previousPositions = {};\n\t\tthis.pointerPositions = {};\n\t\tthis.startPositions = {};\n\t\tthis.pointerSetThisFrame = {};\n\t\tthis.hoverPosition = new Vector2();\n\t\tthis.hoverSet = false;\n\n\t}\n\n\t// The pointers can be set multiple times per frame so track whether the pointer has\n\t// been set this frame or not so we don't overwrite the previous position and lose information\n\t// about pointer movement\n\tupdateFrame() {\n\n\t\tconst { previousPositions, pointerPositions } = this;\n\t\tfor ( const id in pointerPositions ) {\n\n\t\t\tpreviousPositions[ id ].copy( pointerPositions[ id ] );\n\n\t\t}\n\n\t}\n\n\tsetHoverEvent( e ) {\n\n\t\tif ( e.pointerType === 'mouse' || e.type === 'wheel' ) {\n\n\t\t\tthis.getAdjustedPointer( e, this.hoverPosition );\n\t\t\tthis.hoverSet = true;\n\n\t\t}\n\n\t}\n\n\tgetLatestPoint( target ) {\n\n\t\tif ( this.pointerType !== null ) {\n\n\t\t\tthis.getCenterPoint( target );\n\t\t\treturn target;\n\n\t\t} else if ( this.hoverSet ) {\n\n\t\t\ttarget.copy( this.hoverPosition );\n\t\t\treturn target;\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t}\n\n\t// get the pointer position in the coordinate system of the target element\n\tgetAdjustedPointer( e, target ) {\n\n\t\tconst domRef = this.domElement ? this.domElement : e.target;\n\t\tconst rect = domRef.getBoundingClientRect();\n\t\tconst x = e.clientX - rect.left;\n\t\tconst y = e.clientY - rect.top;\n\t\ttarget.set( x, y );\n\n\t}\n\n\taddPointer( e ) {\n\n\t\tconst id = e.pointerId;\n\t\tconst position = new Vector2();\n\t\tthis.getAdjustedPointer( e, position );\n\t\tthis.pointerOrder.push( id );\n\t\tthis.pointerPositions[ id ] = position;\n\t\tthis.previousPositions[ id ] = position.clone();\n\t\tthis.startPositions[ id ] = position.clone();\n\n\t\tif ( this.getPointerCount() === 1 ) {\n\n\t\t\tthis.pointerType = e.pointerType;\n\t\t\tthis.buttons = e.buttons;\n\n\t\t}\n\n\t}\n\n\tupdatePointer( e ) {\n\n\t\tconst id = e.pointerId;\n\t\tif ( ! ( id in this.pointerPositions ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tthis.getAdjustedPointer( e, this.pointerPositions[ id ] );\n\t\treturn true;\n\n\t}\n\n\tdeletePointer( e ) {\n\n\t\tconst id = e.pointerId;\n\t\tconst pointerOrder = this.pointerOrder;\n\t\tpointerOrder.splice( pointerOrder.indexOf( id ), 1 );\n\t\tdelete this.pointerPositions[ id ];\n\t\tdelete this.previousPositions[ id ];\n\t\tdelete this.startPositions[ id ];\n\n\t\tif ( this.getPointerCount.length === 0 ) {\n\n\t\t\tthis.buttons = 0;\n\t\t\tthis.pointerType = null;\n\n\t\t}\n\n\t}\n\n\tgetPointerCount() {\n\n\t\treturn this.pointerOrder.length;\n\n\t}\n\n\tgetCenterPoint( target, pointerPositions = this.pointerPositions ) {\n\n\t\tconst pointerOrder = this.pointerOrder;\n\t\tif ( this.getPointerCount() === 1 || this.getPointerType() === 'mouse' ) {\n\n\t\t\tconst id = pointerOrder[ 0 ];\n\t\t\ttarget.copy( pointerPositions[ id ] );\n\t\t\treturn target;\n\n\t\t} else if ( this.getPointerCount() === 2 ) {\n\n\t\t\tconst id0 = this.pointerOrder[ 0 ];\n\t\t\tconst id1 = this.pointerOrder[ 1 ];\n\n\t\t\tconst p0 = pointerPositions[ id0 ];\n\t\t\tconst p1 = pointerPositions[ id1 ];\n\n\t\t\ttarget.addVectors( p0, p1 ).multiplyScalar( 0.5 );\n\t\t\treturn target;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\tgetPreviousCenterPoint( target ) {\n\n\t\treturn this.getCenterPoint( target, this.previousPositions );\n\n\t}\n\n\tgetStartCenterPoint( target ) {\n\n\t\treturn this.getCenterPoint( target, this.startPositions );\n\n\t}\n\n\tgetMoveDistance() {\n\n\t\tthis.getCenterPoint( _vec );\n\t\tthis.getPreviousCenterPoint( _vec2 );\n\n\t\treturn _vec.sub( _vec2 ).length();\n\n\t}\n\n\tgetTouchPointerDistance( pointerPositions = this.pointerPositions ) {\n\n\t\tif ( this.getPointerCount() <= 1 || this.getPointerType() === 'mouse' ) {\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t\tconst { pointerOrder } = this;\n\t\tconst id0 = pointerOrder[ 0 ];\n\t\tconst id1 = pointerOrder[ 1 ];\n\n\t\tconst p0 = pointerPositions[ id0 ];\n\t\tconst p1 = pointerPositions[ id1 ];\n\n\t\treturn p0.distanceTo( p1 );\n\n\t}\n\n\tgetPreviousTouchPointerDistance() {\n\n\t\treturn this.getTouchPointerDistance( this.previousPositions );\n\n\t}\n\n\tgetStartTouchPointerDistance() {\n\n\t\treturn this.getTouchPointerDistance( this.startPositions );\n\n\t}\n\n\tgetPointerType() {\n\n\t\treturn this.pointerType;\n\n\t}\n\n\tisPointerTouch() {\n\n\t\treturn this.getPointerType() === 'touch';\n\n\t}\n\n\tgetPointerButtons() {\n\n\t\treturn this.buttons;\n\n\t}\n\n\tisLeftClicked() {\n\n\t\treturn Boolean( this.buttons & 1 );\n\n\t}\n\n\tisRightClicked() {\n\n\t\treturn Boolean( this.buttons & 2 );\n\n\t}\n\n}\n","import { Matrix4, Ray, Vector3 } from 'three';\n\nconst _matrix = new Matrix4();\nconst _ray = new Ray();\nconst _vec = new Vector3();\n\n// helper function for constructing a matrix for rotating around a point\nexport function makeRotateAroundPoint( point, quat, target ) {\n\n\ttarget.makeTranslation( - point.x, - point.y, - point.z );\n\n\t_matrix.makeRotationFromQuaternion( quat );\n\ttarget.premultiply( _matrix );\n\n\t_matrix.makeTranslation( point.x, point.y, point.z );\n\ttarget.premultiply( _matrix );\n\n\treturn target;\n\n}\n\n// get the three.js pointer coords from an event\nexport function mouseToCoords( clientX, clientY, element, target ) {\n\n\ttarget.x = ( ( clientX - element.offsetLeft ) / element.clientWidth ) * 2 - 1;\n\ttarget.y = - ( ( clientY - element.offsetTop ) / element.clientHeight ) * 2 + 1;\n\n\tif ( target.isVector3 ) {\n\n\t\ttarget.z = 0;\n\n\t}\n\n}\n\n// Returns an estimate of the closest point on the ellipsoid to the ray. Returns\n// the surface intersection if they collide.\nexport function closestRayEllipsoidSurfacePointEstimate( ray, ellipsoid, target ) {\n\n\tif ( ellipsoid.intersectRay( ray, target ) ) {\n\n\t\treturn target;\n\n\t} else {\n\n\t\t_matrix.makeScale( ...ellipsoid.radius ).invert();\n\t\t_ray.copy( ray ).applyMatrix4( _matrix );\n\n\t\t_vec.set( 0, 0, 0 );\n\t\t_ray.closestPointToPoint( _vec, target ).normalize();\n\n\t\t_matrix.makeScale( ...ellipsoid.radius );\n\t\treturn target.applyMatrix4( _matrix );\n\n\t}\n\n}\n\n// find the closest ray on the horizon when the ray passes above the sphere\nexport function closestRaySpherePointFromRotation( ray, radius, target ) {\n\n\tconst hypotenuse = ray.origin.length();\n\n\t// angle inside the sphere\n\tconst theta = Math.acos( radius / hypotenuse );\n\n\t// the direction to the camera\n\ttarget\n\t\t.copy( ray.origin )\n\t\t.multiplyScalar( - 1 )\n\t\t.normalize();\n\n\t// get the normal of the plane the ray and origin lie in\n\tconst rotationVec = _vec\n\t\t.crossVectors( target, ray.direction )\n\t\t.normalize();\n\n\t// rotate the camera direction by angle and scale it to the surface\n\ttarget\n\t\t.multiplyScalar( - 1 )\n\t\t.applyAxisAngle( rotationVec, - theta )\n\t\t.normalize()\n\t\t.multiplyScalar( radius );\n\n}\n\n\n// custom version of set raycaster from camera that relies on the underlying matrices\n// so the ray origin is position at the camera near clip.\nexport function setRaycasterFromCamera( raycaster, coords, camera ) {\n\n\tconst ray = raycaster instanceof Ray ? raycaster : raycaster.ray;\n\tconst { origin, direction } = ray;\n\n\t// get the origin and direction of the frustum ray\n\torigin\n\t\t.set( coords.x, coords.y, - 1 )\n\t\t.unproject( camera );\n\n\tdirection\n\t\t.set( coords.x, coords.y, 1 )\n\t\t.unproject( camera )\n\t\t.sub( origin );\n\n\tif ( ! raycaster.isRay ) {\n\n\t\t// compute the far value based on the distance from point on the near\n\t\t// plane and point on the far plane. Then normalize the direction.\n\t\traycaster.near = 0;\n\t\traycaster.far = direction.length();\n\t\traycaster.camera = camera;\n\n\t}\n\n\t// normalize the ray direction\n\tdirection.normalize();\n\n}\n","import {\n\tMatrix4,\n\tQuaternion,\n\tVector2,\n\tVector3,\n\tRaycaster,\n\tPlane,\n\tEventDispatcher,\n\tMathUtils,\n\tClock,\n\tRay,\n} from 'three';\nimport { PivotPointMesh } from './PivotPointMesh.js';\nimport { PointerTracker } from './PointerTracker.js';\nimport { mouseToCoords, makeRotateAroundPoint, setRaycasterFromCamera } from './utils.js';\n\nexport const NONE = 0;\nexport const DRAG = 1;\nexport const ROTATE = 2;\nexport const ZOOM = 3;\nexport const WAITING = 4;\n\nconst DRAG_PLANE_THRESHOLD = 0.05;\nconst DRAG_UP_THRESHOLD = 0.025;\n\nconst _rotMatrix = /* @__PURE__ */ new Matrix4();\nconst _delta = /* @__PURE__ */ new Vector3();\nconst _vec = /* @__PURE__ */ new Vector3();\nconst _forward = /* @__PURE__ */ new Vector3();\nconst _right = /* @__PURE__ */ new Vector3();\nconst _rotationAxis = /* @__PURE__ */ new Vector3();\nconst _quaternion = /* @__PURE__ */ new Quaternion();\nconst _plane = /* @__PURE__ */ new Plane();\nconst _localUp = /* @__PURE__ */ new Vector3();\nconst _mouseBefore = /* @__PURE__ */ new Vector3();\nconst _mouseAfter = /* @__PURE__ */ new Vector3();\nconst _identityQuat = /* @__PURE__ */ new Quaternion();\nconst _ray = /* @__PURE__ */ new Ray();\n\nconst _zoomPointPointer = /* @__PURE__ */ new Vector2();\nconst _pointer = /* @__PURE__ */ new Vector2();\nconst _prevPointer = /* @__PURE__ */ new Vector2();\nconst _deltaPointer = /* @__PURE__ */ new Vector2();\nconst _centerPoint = /* @__PURE__ */ new Vector2();\nconst _startCenterPoint = /* @__PURE__ */ new Vector2();\n\nconst _changeEvent = { type: 'change' };\nconst _startEvent = { type: 'start' };\nconst _endEvent = { type: 'end' };\n\nexport class EnvironmentControls extends EventDispatcher {\n\n\tget enabled() {\n\n\t\treturn this._enabled;\n\n\t}\n\n\tset enabled( v ) {\n\n\t\tif ( v !== this.enabled ) {\n\n\t\t\tthis._enabled = v;\n\t\t\tthis.resetState();\n\t\t\tthis.pointerTracker.reset();\n\n\t\t\tif ( ! this.enabled ) {\n\n\t\t\t\tthis.dragInertia.set( 0, 0, 0 );\n\t\t\t\tthis.rotationInertia.set( 0, 0 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconstructor( scene = null, camera = null, domElement = null, tilesRenderer = null ) {\n\n\t\tsuper();\n\n\t\tthis.isEnvironmentControls = true;\n\n\t\tthis.domElement = null;\n\t\tthis.camera = null;\n\t\tthis.scene = null;\n\t\tthis.tilesRenderer = null;\n\n\t\t// settings\n\t\tthis._enabled = true;\n\t\tthis.cameraRadius = 5;\n\t\tthis.rotationSpeed = 1;\n\t\tthis.minAltitude = 0;\n\t\tthis.maxAltitude = 0.45 * Math.PI;\n\t\tthis.minDistance = 10;\n\t\tthis.maxDistance = Infinity;\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = Infinity;\n\t\tthis.zoomSpeed = 1;\n\t\tthis.adjustHeight = true;\n\t\tthis.enableDamping = false;\n\t\tthis.dampingFactor = 0.15;\n\n\t\tthis.fallbackPlane = new Plane( new Vector3( 0, 1, 0 ), 0 );\n\t\tthis.useFallbackPlane = true;\n\n\t\t// settings for GlobeControls\n\t\tthis.reorientOnDrag = true;\n\t\tthis.scaleZoomOrientationAtEdges = false;\n\n\t\t// internal state\n\t\tthis.state = NONE;\n\t\tthis.pointerTracker = new PointerTracker();\n\t\tthis.needsUpdate = false;\n\t\tthis.actionHeightOffset = 0;\n\n\t\tthis.pivotPoint = new Vector3();\n\n\t\t// used for zoom\n\t\tthis.zoomDirectionSet = false;\n\t\tthis.zoomPointSet = false;\n\t\tthis.zoomDirection = new Vector3();\n\t\tthis.zoomPoint = new Vector3();\n\t\tthis.zoomDelta = 0;\n\n\t\t// fields used for inertia\n\t\tthis.rotationInertiaPivot = new Vector3();\n\t\tthis.rotationInertia = new Vector2();\n\t\tthis.dragInertia = new Vector3();\n\t\tthis.inertiaTargetDistance = Infinity; \t\t// track the distance from the camera that we want to use to calculate the inertia end threshold\n\t\tthis.inertiaStableFrames = 0; \t\t\t\t// the number of frames that the camera has not moved while the user is interacting\n\n\t\t// circular pivot mesh\n\t\tthis.pivotMesh = new PivotPointMesh();\n\t\tthis.pivotMesh.raycast = () => {};\n\t\tthis.pivotMesh.scale.setScalar( 0.25 );\n\n\t\t// raycaster\n\t\tthis.raycaster = new Raycaster();\n\t\tthis.raycaster.firstHitOnly = true;\n\n\t\tthis.up = new Vector3( 0, 1, 0 );\n\t\tthis.clock = new Clock();\n\n\t\tthis._detachCallback = null;\n\t\tthis._upInitialized = false;\n\t\tthis._lastUsedState = NONE;\n\t\tthis._zoomPointWasSet = false;\n\n\t\t// always update the zoom target point in case the tiles are changing\n\t\tthis._tilesOnChangeCallback = () => this.zoomPointSet = false;\n\n\t\t// init\n\t\tif ( domElement ) this.attach( domElement );\n\t\tif ( camera ) this.setCamera( camera );\n\t\tif ( scene ) this.setScene( scene );\n\t\tif ( tilesRenderer ) this.setTilesRenderer( tilesRenderer );\n\n\t}\n\n\tsetScene( scene ) {\n\n\t\tthis.scene = scene;\n\n\t}\n\n\tsetCamera( camera ) {\n\n\t\tthis.camera = camera;\n\t\tthis._upInitialized = false;\n\t\tthis.zoomDirectionSet = false;\n\t\tthis.zoomPointSet = false;\n\t\tthis.needsUpdate = true;\n\t\tthis.raycaster.camera = camera;\n\t\tthis.resetState();\n\n\t}\n\n\tsetTilesRenderer( tilesRenderer ) {\n\n\t\t// TODO: what if a scene has multiple tile sets?\n\t\tif ( this.tilesRenderer ) {\n\n\t\t\tthis.tilesRenderer.removeEventListener( 'tile-visibility-change', this._tilesOnChangeCallback );\n\n\t\t}\n\n\t\tthis.tilesRenderer = tilesRenderer;\n\t\tif ( this.tilesRenderer !== null ) {\n\n\t\t\tthis.tilesRenderer.addEventListener( 'tile-visibility-change', this._tilesOnChangeCallback );\n\n\t\t\tif ( this.scene === null ) {\n\n\t\t\t\tthis.setScene( this.tilesRenderer.group );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tattach( domElement ) {\n\n\t\tif ( this.domElement ) {\n\n\t\t\tthrow new Error( 'EnvironmentControls: Controls already attached to element' );\n\n\t\t}\n\n\t\t// set the touch action to none so the browser does not\n\t\t// drag the page to refresh or scroll\n\t\tthis.domElement = domElement;\n\t\tthis.pointerTracker.domElement = domElement;\n\t\tdomElement.style.touchAction = 'none';\n\n\t\tconst contextMenuCallback = e => {\n\n\t\t\t// exit early if the controls are disabled\n\t\t\tif ( ! this.enabled ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\te.preventDefault();\n\n\t\t};\n\n\t\tconst pointerdownCallback = e => {\n\n\t\t\t// exit early if the controls are disabled\n\t\t\tif ( ! this.enabled ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\te.preventDefault();\n\n\t\t\tconst {\n\t\t\t\tcamera,\n\t\t\t\traycaster,\n\t\t\t\tdomElement,\n\t\t\t\tup,\n\t\t\t\tpivotMesh,\n\t\t\t\tpointerTracker,\n\t\t\t\tscene,\n\t\t\t\tpivotPoint,\n\t\t\t\tenabled,\n\t\t\t} = this;\n\n\t\t\t// init the pointer\n\t\t\tpointerTracker.addPointer( e );\n\t\t\tthis.needsUpdate = true;\n\n\t\t\t// handle cases where we need to capture the pointer or\n\t\t\t// reset state when we have too many pointers\n\t\t\tif ( pointerTracker.isPointerTouch() ) {\n\n\t\t\t\tpivotMesh.visible = false;\n\n\t\t\t\tif ( pointerTracker.getPointerCount() === 0 ) {\n\n\t\t\t\t\tdomElement.setPointerCapture( e.pointerId );\n\n\t\t\t\t} else if ( pointerTracker.getPointerCount() > 2 ) {\n\n\t\t\t\t\tthis.resetState();\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// the \"pointer\" for zooming and rotating should be based on the center point\n\t\t\tpointerTracker.getCenterPoint( _pointer );\n\t\t\tmouseToCoords( _pointer.x, _pointer.y, domElement, _pointer );\n\t\t\tsetRaycasterFromCamera( raycaster, _pointer, camera );\n\n\t\t\t// prevent the drag distance from getting too severe by limiting the drag point\n\t\t\t// to a reasonable angle and reasonable distance with the drag plane\n\t\t\tconst dot = Math.abs( raycaster.ray.direction.dot( up ) );\n\t\t\tif ( dot < DRAG_PLANE_THRESHOLD || dot < DRAG_UP_THRESHOLD ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// find the hit point\n\t\t\tconst hit = this._raycast( raycaster );\n\t\t\tif ( hit ) {\n\n\t\t\t\t// if two fingers, right click, or shift click are being used then we trigger\n\t\t\t\t// a rotation action to begin\n\t\t\t\tif (\n\t\t\t\t\tpointerTracker.getPointerCount() === 2 ||\n\t\t\t\t\tpointerTracker.isRightClicked() ||\n\t\t\t\t\tpointerTracker.isLeftClicked() && e.shiftKey\n\t\t\t\t) {\n\n\t\t\t\t\tthis.setState( pointerTracker.isPointerTouch() ? WAITING : ROTATE );\n\n\t\t\t\t\tpivotPoint.copy( hit.point );\n\t\t\t\t\tpivotMesh.position.copy( hit.point );\n\t\t\t\t\tpivotMesh.visible = pointerTracker.isPointerTouch() ? false : enabled;\n\t\t\t\t\tpivotMesh.updateMatrixWorld();\n\t\t\t\t\tscene.add( pivotMesh );\n\n\t\t\t\t} else if ( pointerTracker.isLeftClicked() ) {\n\n\t\t\t\t\t// if the clicked point is coming from below the plane then don't perform the drag\n\t\t\t\t\tthis.setState( DRAG );\n\t\t\t\t\tpivotPoint.copy( hit.point );\n\n\t\t\t\t\tpivotMesh.position.copy( hit.point );\n\t\t\t\t\tpivotMesh.updateMatrixWorld();\n\t\t\t\t\tscene.add( pivotMesh );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tlet _pointerMoveQueued = false;\n\t\tconst pointermoveCallback = e => {\n\n\t\t\t// exit early if the controls are disabled\n\t\t\tif ( ! this.enabled ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\te.preventDefault();\n\n\t\t\tconst {\n\t\t\t\tpivotMesh,\n\t\t\t\tenabled,\n\t\t\t} = this;\n\n\t\t\t// whenever the pointer moves we need to re-derive the zoom direction and point\n\t\t\tthis.zoomDirectionSet = false;\n\t\t\tthis.zoomPointSet = false;\n\n\t\t\tif ( this.state !== NONE ) {\n\n\t\t\t\tthis.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tconst { pointerTracker } = this;\n\t\t\tpointerTracker.setHoverEvent( e );\n\t\t\tif ( ! pointerTracker.updatePointer( e ) ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( pointerTracker.isPointerTouch() && pointerTracker.getPointerCount() === 2 ) {\n\n\t\t\t\t// We queue this event to ensure that all pointers have been updated\n\t\t\t\tif ( ! _pointerMoveQueued ) {\n\n\t\t\t\t\t_pointerMoveQueued = true;\n\t\t\t\t\tqueueMicrotask( () => {\n\n\t\t\t\t\t\t_pointerMoveQueued = false;\n\n\t\t\t\t\t\t// adjust the pointer position to be the center point\n\t\t\t\t\t\tpointerTracker.getCenterPoint( _centerPoint );\n\n\t\t\t\t\t\t// detect zoom transition\n\t\t\t\t\t\tconst startDist = pointerTracker.getStartTouchPointerDistance();\n\t\t\t\t\t\tconst pointerDist = pointerTracker.getTouchPointerDistance();\n\t\t\t\t\t\tconst separateDelta = pointerDist - startDist;\n\t\t\t\t\t\tif ( this.state === NONE || this.state === WAITING ) {\n\n\t\t\t\t\t\t\t// check which direction was moved in first - if the pointers are pinching then\n\t\t\t\t\t\t\t// it's a zoom. But if they move in parallel it's a rotation\n\t\t\t\t\t\t\tpointerTracker.getCenterPoint( _centerPoint );\n\t\t\t\t\t\t\tpointerTracker.getStartCenterPoint( _startCenterPoint );\n\n\t\t\t\t\t\t\t// adjust the drag requirement by the dpr\n\t\t\t\t\t\t\tconst dragThreshold = 2.0 * window.devicePixelRatio;\n\t\t\t\t\t\t\tconst parallelDelta = _centerPoint.distanceTo( _startCenterPoint );\n\t\t\t\t\t\t\tif ( Math.abs( separateDelta ) > dragThreshold || parallelDelta > dragThreshold ) {\n\n\t\t\t\t\t\t\t\tif ( Math.abs( separateDelta ) > parallelDelta ) {\n\n\t\t\t\t\t\t\t\t\tthis.setState( ZOOM );\n\t\t\t\t\t\t\t\t\tthis.zoomDirectionSet = false;\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tthis.setState( ROTATE );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( this.state === ZOOM ) {\n\n\t\t\t\t\t\t\tconst previousDist = pointerTracker.getPreviousTouchPointerDistance();\n\t\t\t\t\t\t\tthis.zoomDelta += pointerDist - previousDist;\n\t\t\t\t\t\t\tpivotMesh.visible = false;\n\n\t\t\t\t\t\t} else if ( this.state === ROTATE ) {\n\n\t\t\t\t\t\t\tpivotMesh.visible = enabled;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// TODO: we have the potential to fire change multiple times per frame - should we debounce?\n\t\t\tthis.dispatchEvent( _changeEvent );\n\n\t\t};\n\n\t\tconst pointerupCallback = e => {\n\n\t\t\t// exit early if the controls are disabled\n\t\t\tif ( ! this.enabled ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst { pointerTracker } = this;\n\t\t\tpointerTracker.deletePointer( e );\n\n\t\t\tif (\n\t\t\t\tpointerTracker.getPointerType() === 'touch' &&\n\t\t\t\tpointerTracker.getPointerCount() === 0\n\t\t\t) {\n\n\t\t\t\tdomElement.releasePointerCapture( e.pointerId );\n\n\t\t\t}\n\n\t\t\tthis.resetState();\n\t\t\tthis.needsUpdate = true;\n\n\t\t};\n\n\t\tconst wheelCallback = e => {\n\n\t\t\t// exit early if the controls are disabled\n\t\t\tif ( ! this.enabled ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\te.preventDefault();\n\n\t\t\tconst { pointerTracker } = this;\n\t\t\tpointerTracker.setHoverEvent( e );\n\t\t\tpointerTracker.updatePointer( e );\n\n\t\t\t// TODO: do we need events here?\n\t\t\tthis.dispatchEvent( _startEvent );\n\n\t\t\tlet delta;\n\t\t\tswitch ( e.deltaMode ) {\n\n\t\t\t\tcase 2: // Pages\n\t\t\t\t\tdelta = e.deltaY * 800;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1: // Lines\n\t\t\t\t\tdelta = e.deltaY * 40;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0: // Pixels\n\t\t\t\t\tdelta = e.deltaY;\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\t// use LOG to scale the scroll delta and hopefully normalize them across platforms\n\t\t\tconst deltaSign = Math.sign( delta );\n\t\t\tconst normalizedDelta = Math.abs( delta );\n\t\t\tthis.zoomDelta -= 0.25 * deltaSign * normalizedDelta;\n\t\t\tthis.needsUpdate = true;\n\n\t\t\tthis._lastUsedState = ZOOM;\n\t\t\tthis.dispatchEvent( _endEvent );\n\n\t\t};\n\n\t\tconst pointerenterCallback = e => {\n\n\t\t\t// exit early if the controls are disabled\n\t\t\tif ( ! this.enabled ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst { pointerTracker } = this;\n\t\t\tif ( e.buttons !== pointerTracker.getPointerButtons() ) {\n\n\t\t\t\tpointerTracker.deletePointer( e );\n\t\t\t\tthis.resetState();\n\n\t\t\t}\n\n\t\t};\n\n\t\tdomElement.addEventListener( 'contextmenu', contextMenuCallback );\n\t\tdomElement.addEventListener( 'pointerdown', pointerdownCallback );\n\t\tdomElement.addEventListener( 'pointermove', pointermoveCallback );\n\t\tdomElement.addEventListener( 'pointerup', pointerupCallback );\n\t\tdomElement.addEventListener( 'wheel', wheelCallback, { passive: false } );\n\t\tdomElement.addEventListener( 'pointerenter', pointerenterCallback );\n\n\t\tthis._detachCallback = () => {\n\n\t\t\tdomElement.removeEventListener( 'contextmenu', contextMenuCallback );\n\t\t\tdomElement.removeEventListener( 'pointerdown', pointerdownCallback );\n\t\t\tdomElement.removeEventListener( 'pointermove', pointermoveCallback );\n\t\t\tdomElement.removeEventListener( 'pointerup', pointerupCallback );\n\t\t\tdomElement.removeEventListener( 'wheel', wheelCallback );\n\t\t\tdomElement.removeEventListener( 'pointerenter', pointerenterCallback );\n\n\t\t};\n\n\t}\n\n\t// override-able functions for retrieving the up direction at a point\n\tgetUpDirection( point, target ) {\n\n\t\ttarget.copy( this.up );\n\n\t}\n\n\tgetCameraUpDirection( target ) {\n\n\t\tthis.getUpDirection( this.camera.position, target );\n\n\t}\n\n\t// returns the active / last used pivot point for the scene\n\tgetPivotPoint( target ) {\n\n\t\tlet result = null;\n\n\t\t// get the last interacted point as the focus\n\t\tif ( this._lastUsedState === ZOOM ) {\n\n\t\t\tif ( this._zoomPointWasSet ) {\n\n\t\t\t\tresult = target.copy( this.zoomPoint );\n\n\t\t\t}\n\n\t\t} else if ( this._lastUsedState === ROTATE || this._lastUsedState === DRAG ) {\n\n\t\t\tresult = target.copy( this.pivotPoint );\n\n\t\t}\n\n\t\t// If the last used point is outside the camera view then skip it\n\t\tconst { camera, raycaster } = this;\n\t\tif ( result !== null ) {\n\n\t\t\t_vec.copy( result ).project( camera );\n\t\t\tif ( _vec.x < - 1 || _vec.x > 1 || _vec.y < - 1 || _vec.y > 1 ) {\n\n\t\t\t\tresult = null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// default to the raycast hit if we have not result or the hit is closer to the camera\n\t\t// set a ray in the local ellipsoid frame\n\t\tsetRaycasterFromCamera( raycaster, { x: 0, y: 0 }, camera );\n\n\t\tconst hit = this._raycast( raycaster );\n\t\tif ( hit ) {\n\n\t\t\tif ( result === null || hit.distance < result.distanceTo( raycaster.ray.origin ) ) {\n\n\t\t\t\tresult = target.copy( hit.point );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tdetach() {\n\n\t\tthis.domElement = null;\n\n\t\tif ( this._detachCallback ) {\n\n\t\t\tthis._detachCallback();\n\t\t\tthis._detachCallback = null;\n\t\t\tthis.pointerTracker.reset();\n\n\t\t}\n\n\t}\n\n\tresetState() {\n\n\t\tif ( this.state !== NONE ) {\n\n\t\t\tthis.dispatchEvent( _endEvent );\n\n\t\t}\n\n\t\tthis.state = NONE;\n\t\tthis.pivotMesh.removeFromParent();\n\t\tthis.pivotMesh.visible = this.enabled;\n\t\tthis.actionHeightOffset = 0;\n\n\t}\n\n\tsetState( state = this.state, fireEvent = true ) {\n\n\t\tif ( this.state === state ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.state === NONE && fireEvent ) {\n\n\t\t\tthis.dispatchEvent( _startEvent );\n\n\t\t}\n\n\t\tthis.pivotMesh.visible = this.enabled;\n\t\tthis.dragInertia.set( 0, 0, 0 );\n\t\tthis.rotationInertia.set( 0, 0 );\n\t\tthis.inertiaStableFrames = 0;\n\t\tthis.state = state;\n\n\t\tif ( state !== NONE && state !== WAITING ) {\n\n\t\t\tthis._lastUsedState = state;\n\n\t\t}\n\n\t}\n\n\tupdate( deltaTime = Math.min( this.clock.getDelta(), 64 / 1000 ) ) {\n\n\t\tif ( ! this.enabled || ! this.camera || deltaTime === 0 ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst {\n\t\t\tcamera,\n\t\t\tcameraRadius,\n\t\t\tpivotPoint,\n\t\t\tup,\n\t\t\tstate,\n\t\t\tadjustHeight,\n\t\t} = this;\n\n\t\tcamera.updateMatrixWorld();\n\n\t\t// set the \"up\" vector immediately so it's available in the following functions\n\t\tthis.getCameraUpDirection( _localUp );\n\t\tif ( ! this._upInitialized ) {\n\n\t\t\tthis._upInitialized = true;\n\t\t\tthis.up.copy( _localUp );\n\n\t\t}\n\n\t\t// update the actions\n\t\tconst inertiaNeedsUpdate = this._inertiaNeedsUpdate();\n\t\tif ( this.needsUpdate || inertiaNeedsUpdate ) {\n\n\t\t\tconst zoomDelta = this.zoomDelta;\n\n\t\t\tthis._updateZoom();\n\t\t\tthis._updatePosition( deltaTime );\n\t\t\tthis._updateRotation( deltaTime );\n\n\t\t\tif ( state === DRAG || state === ROTATE ) {\n\n\t\t\t\t_forward.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\t\t\t\tthis.inertiaTargetDistance = _vec.copy( this.pivotPoint ).sub( camera.position ).dot( _forward );\n\n\t\t\t} else if ( state === NONE ) {\n\n\t\t\t\tthis._updateInertia( deltaTime );\n\n\t\t\t}\n\n\t\t\tif ( state !== NONE || zoomDelta !== 0 || inertiaNeedsUpdate ) {\n\n\t\t\t\tthis.dispatchEvent( _changeEvent );\n\n\t\t\t}\n\n\t\t\tthis.needsUpdate = false;\n\n\t\t}\n\n\t\t// update the up direction based on where the camera moved to\n\t\t// if using an orthographic camera then rotate around drag pivot\n\t\t// reuse the \"hit\" information since it can be slow to perform multiple hits\n\t\tconst hit = camera.isOrthographicCamera ? null : adjustHeight && this._getPointBelowCamera() || null;\n\t\tconst rotationPoint = camera.isOrthographicCamera ? pivotPoint : hit && hit.point || null;\n\t\tthis.getCameraUpDirection( _localUp );\n\t\tthis._setFrame( _localUp, rotationPoint );\n\n\t\t// when dragging the camera and drag point may be moved\n\t\t// to accommodate terrain so we try to move it back down\n\t\t// to the original point.\n\t\tif ( ( this.state === DRAG || this.state === ROTATE ) && this.actionHeightOffset !== 0 ) {\n\n\t\t\tconst { actionHeightOffset } = this;\n\t\t\tcamera.position.addScaledVector( up, - actionHeightOffset );\n\t\t\tpivotPoint.addScaledVector( up, - actionHeightOffset );\n\n\t\t\t// adjust the height\n\t\t\tif ( hit ) {\n\n\t\t\t\thit.distance -= actionHeightOffset;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.actionHeightOffset = 0;\n\n\t\tif ( hit ) {\n\n\t\t\tconst dist = hit.distance;\n\t\t\tif ( dist < cameraRadius ) {\n\n\t\t\t\tconst delta = cameraRadius - dist;\n\t\t\t\tcamera.position.addScaledVector( up, delta );\n\t\t\t\tpivotPoint.addScaledVector( up, delta );\n\t\t\t\tthis.actionHeightOffset = delta;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.pointerTracker.updateFrame();\n\n\t}\n\n\t// updates the camera to position it based on the constraints of the controls\n\tadjustCamera( camera ) {\n\n\t\tconst { adjustHeight, cameraRadius } = this;\n\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\t// adjust the camera height\n\t\t\tthis.getUpDirection( camera.position, _localUp );\n\t\t\tconst hit = adjustHeight && this._getPointBelowCamera( camera.position, _localUp ) || null;\n\t\t\tif ( hit ) {\n\n\t\t\t\tconst dist = hit.distance;\n\t\t\t\tif ( dist < cameraRadius ) {\n\n\t\t\t\t\tcamera.position.addScaledVector( _localUp, cameraRadius - dist );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tdispose() {\n\n\t\tthis.detach();\n\n\t}\n\n\t// private\n\t_updateInertia( deltaTime ) {\n\n\t\t// update the damping of momentum variables\n\t\tconst {\n\t\t\trotationInertia,\n\t\t\tpivotPoint,\n\t\t\tdragInertia,\n\t\t\tenableDamping,\n\t\t\tdampingFactor,\n\t\t\tcamera,\n\t\t\tcameraRadius,\n\t\t\tminDistance,\n\t\t\tinertiaTargetDistance,\n\t\t} = this;\n\n\t\tif ( ! this.enableDamping || this.inertiaStableFrames > 1 ) {\n\n\t\t\tdragInertia.set( 0, 0, 0 );\n\t\t\trotationInertia.set( 0, 0, 0 );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Based on Freya Holmer's frame-rate independent lerp function\n\t\tconst factor = Math.pow( 2, - deltaTime / dampingFactor );\n\t\tconst stableDistance = Math.max( camera.near, cameraRadius, minDistance, inertiaTargetDistance );\n\t\tconst resolution = 2 * 1e3;\n\t\tconst pixelWidth = 2 / resolution;\n\t\tconst pixelThreshold = 0.25 * pixelWidth;\n\n\t\t// scale the residual rotation motion\n\t\tif ( rotationInertia.lengthSq() > 0 ) {\n\n\t\t\t// calculate two screen points at 1 pixel apart in our notional resolution so we can stop when the delta is ~ 1 pixel\n\t\t\t// projected into world space\n\t\t\tsetRaycasterFromCamera( _ray, _vec.set( 0, 0, - 1 ), camera );\n\t\t\t_ray.applyMatrix4( camera.matrixWorldInverse );\n\t\t\t_ray.direction.normalize();\n\t\t\t_ray.recast( - _ray.direction.dot( _ray.origin ) ).at( stableDistance / _ray.direction.z, _vec );\n\t\t\t_vec.applyMatrix4( camera.matrixWorld );\n\n\t\t\tsetRaycasterFromCamera( _ray, _delta.set( pixelThreshold, pixelThreshold, - 1 ), camera );\n\t\t\t_ray.applyMatrix4( camera.matrixWorldInverse );\n\t\t\t_ray.direction.normalize();\n\t\t\t_ray.recast( - _ray.direction.dot( _ray.origin ) ).at( stableDistance / _ray.direction.z, _delta );\n\t\t\t_delta.applyMatrix4( camera.matrixWorld );\n\n\t\t\t// get implied angle\n\t\t\t_vec.sub( pivotPoint ).normalize();\n\t\t\t_delta.sub( pivotPoint ).normalize();\n\n\t\t\t// calculate the rotation threshold\n\t\t\tconst threshold = _vec.angleTo( _delta ) / deltaTime;\n\t\t\trotationInertia.multiplyScalar( factor );\n\t\t\tif ( rotationInertia.lengthSq() < threshold ** 2 || ! enableDamping ) {\n\n\t\t\t\trotationInertia.set( 0, 0 );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// scale the residual translation motion\n\t\tif ( dragInertia.lengthSq() > 0 ) {\n\n\t\t\t// calculate two screen points at 1 pixel apart in our notional resolution so we can stop when the delta is ~ 1 pixel\n\t\t\t// projected into world space\n\t\t\tsetRaycasterFromCamera( _ray, _vec.set( 0, 0, - 1 ), camera );\n\t\t\t_ray.applyMatrix4( camera.matrixWorldInverse );\n\t\t\t_ray.direction.normalize();\n\t\t\t_ray.recast( - _ray.direction.dot( _ray.origin ) ).at( stableDistance / _ray.direction.z, _vec );\n\t\t\t_vec.applyMatrix4( camera.matrixWorld );\n\n\t\t\tsetRaycasterFromCamera( _ray, _delta.set( pixelThreshold, pixelThreshold, - 1 ), camera );\n\t\t\t_ray.applyMatrix4( camera.matrixWorldInverse );\n\t\t\t_ray.direction.normalize();\n\t\t\t_ray.recast( - _ray.direction.dot( _ray.origin ) ).at( stableDistance / _ray.direction.z, _delta );\n\t\t\t_delta.applyMatrix4( camera.matrixWorld );\n\n\t\t\t// calculate movement threshold\n\t\t\tconst threshold = _vec.distanceTo( _delta ) / deltaTime;\n\t\t\tdragInertia.multiplyScalar( factor );\n\t\t\tif ( dragInertia.lengthSq() < threshold ** 2 || ! enableDamping ) {\n\n\t\t\t\tdragInertia.set( 0, 0, 0 );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// apply the inertia changes\n\t\tif ( rotationInertia.lengthSq() > 0 ) {\n\n\t\t\tthis._applyRotation( rotationInertia.x * deltaTime, rotationInertia.y * deltaTime, pivotPoint );\n\n\t\t}\n\n\t\tif ( dragInertia.lengthSq() > 0 ) {\n\n\t\t\tcamera.position.addScaledVector( dragInertia, deltaTime );\n\t\t\tcamera.updateMatrixWorld();\n\n\t\t}\n\n\t}\n\n\t_inertiaNeedsUpdate() {\n\n\t\tconst { rotationInertia, dragInertia } = this;\n\t\treturn rotationInertia.lengthSq() !== 0 || dragInertia.lengthSq() !== 0;\n\n\t}\n\n\t_updateZoom() {\n\n\t\tconst {\n\t\t\tzoomPoint,\n\t\t\tzoomDirection,\n\t\t\tcamera,\n\t\t\tminDistance,\n\t\t\tmaxDistance,\n\t\t\tpointerTracker,\n\t\t\tdomElement,\n\t\t\tminZoom,\n\t\t\tmaxZoom,\n\t\t\tzoomSpeed,\n\t\t\tstate,\n\t\t} = this;\n\n\t\tlet scale = this.zoomDelta;\n\t\tthis.zoomDelta = 0;\n\n\t\t// get the latest hover / touch point\n\t\tif ( ! pointerTracker.getLatestPoint( _pointer ) || ( scale === 0 && state !== ZOOM ) ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// reset momentum\n\t\tthis.rotationInertia.set( 0, 0 );\n\t\tthis.dragInertia.set( 0, 0, 0 );\n\n\t\tif ( camera.isOrthographicCamera ) {\n\n\t\t\t// update the zoom direction\n\t\t\tthis._updateZoomDirection();\n\n\t\t\t// zoom straight into the globe if we haven't hit anything\n\t\t\tconst zoomIntoPoint = this.zoomPointSet || this._updateZoomPoint();\n\n\t\t\t// get the mouse position before zoom\n\t\t\t_mouseBefore.unproject( camera );\n\n\t\t\t// zoom the camera\n\t\t\tconst normalizedDelta = Math.pow( 0.95, Math.abs( scale * 0.05 ) );\n\t\t\tlet scaleFactor = scale > 0 ? 1 / Math.abs( normalizedDelta ) : normalizedDelta;\n\t\t\tscaleFactor *= zoomSpeed;\n\n\t\t\tif ( scaleFactor > 1 ) {\n\n\t\t\t\tif ( maxZoom < camera.zoom * scaleFactor ) {\n\n\t\t\t\t\tscaleFactor = 1;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( minZoom > camera.zoom * scaleFactor ) {\n\n\t\t\t\t\tscaleFactor = 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tcamera.zoom *= scaleFactor;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\t// adjust the surface point to be in the same position if the globe is hovered over\n\t\t\tif ( zoomIntoPoint ) {\n\n\t\t\t\t// get the mouse position after zoom\n\t\t\t\tmouseToCoords( _pointer.x, _pointer.y, domElement, _mouseAfter );\n\t\t\t\t_mouseAfter.unproject( camera );\n\n\t\t\t\t// shift the camera on the near plane so the mouse is in the same spot\n\t\t\t\tcamera.position.sub( _mouseAfter ).add( _mouseBefore );\n\t\t\t\tcamera.updateMatrixWorld();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// initialize the zoom direction\n\t\t\tthis._updateZoomDirection();\n\n\t\t\t// track the zoom direction we're going to use\n\t\t\tconst finalZoomDirection = _vec.copy( zoomDirection );\n\n\t\t\tif ( this.zoomPointSet || this._updateZoomPoint() ) {\n\n\t\t\t\tconst dist = zoomPoint.distanceTo( camera.position );\n\n\t\t\t\t// scale the distance based on how far there is to move\n\t\t\t\tif ( scale < 0 ) {\n\n\t\t\t\t\tconst remainingDistance = Math.min( 0, dist - maxDistance );\n\t\t\t\t\tscale = scale * dist * zoomSpeed * 0.0025;\n\t\t\t\t\tscale = Math.max( scale, remainingDistance );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst remainingDistance = Math.max( 0, dist - minDistance );\n\t\t\t\t\tscale = scale * Math.max( dist - minDistance, 0 ) * zoomSpeed * 0.0025;\n\t\t\t\t\tscale = Math.min( scale, remainingDistance );\n\n\t\t\t\t}\n\n\t\t\t\tcamera.position.addScaledVector( zoomDirection, scale );\n\t\t\t\tcamera.updateMatrixWorld();\n\n\t\t\t} else {\n\n\t\t\t\t// if we're zooming into nothing then use the distance from the ground to scale movement\n\t\t\t\tconst hit = this._getPointBelowCamera();\n\t\t\t\tif ( hit ) {\n\n\t\t\t\t\tconst dist = hit.distance;\n\t\t\t\t\tfinalZoomDirection.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\t\t\t\t\tcamera.position.addScaledVector( finalZoomDirection, scale * dist * 0.01 );\n\t\t\t\t\tcamera.updateMatrixWorld();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_updateZoomDirection() {\n\n\t\tif ( this.zoomDirectionSet ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst { domElement, raycaster, camera, zoomDirection, pointerTracker } = this;\n\t\tpointerTracker.getLatestPoint( _pointer );\n\t\tmouseToCoords( _pointer.x, _pointer.y, domElement, _mouseBefore );\n\t\tsetRaycasterFromCamera( raycaster, _mouseBefore, camera );\n\t\tzoomDirection.copy( raycaster.ray.direction ).normalize();\n\t\tthis.zoomDirectionSet = true;\n\n\t}\n\n\t// update the point being zoomed in to based on the zoom direction\n\t_updateZoomPoint() {\n\n\t\tconst {\n\t\t\tcamera,\n\t\t\tzoomDirectionSet,\n\t\t\tzoomDirection,\n\t\t\traycaster,\n\t\t\tzoomPoint,\n\t\t\tpointerTracker,\n\t\t\tdomElement,\n\t\t} = this;\n\n\t\tthis._zoomPointWasSet = false;\n\n\t\tif ( ! zoomDirectionSet ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// If using an orthographic camera we have to account for the mouse position when picking the point\n\t\tif ( camera.isOrthographicCamera && pointerTracker.getLatestPoint( _zoomPointPointer ) ) {\n\n\t\t\tmouseToCoords( _zoomPointPointer.x, _zoomPointPointer.y, domElement, _zoomPointPointer );\n\t\t\tsetRaycasterFromCamera( raycaster, _zoomPointPointer, camera );\n\n\t\t} else {\n\n\t\t\traycaster.ray.origin.copy( camera.position );\n\t\t\traycaster.ray.direction.copy( zoomDirection );\n\t\t\traycaster.near = 0;\n\t\t\traycaster.far = Infinity;\n\n\t\t}\n\n\t\t// get the hit point\n\t\tconst hit = this._raycast( raycaster );\n\t\tif ( hit ) {\n\n\t\t\tzoomPoint.copy( hit.point );\n\t\t\tthis.zoomPointSet = true;\n\t\t\tthis._zoomPointWasSet = true;\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t// returns the point below the camera\n\t_getPointBelowCamera( point = this.camera.position, up = this.up ) {\n\n\t\tconst { raycaster } = this;\n\t\traycaster.ray.direction.copy( up ).multiplyScalar( - 1 );\n\t\traycaster.ray.origin.copy( point ).addScaledVector( up, 1e5 );\n\t\traycaster.near = 0;\n\t\traycaster.far = Infinity;\n\n\t\tconst hit = this._raycast( raycaster );\n\t\tif ( hit ) {\n\n\t\t\thit.distance -= 1e5;\n\n\t\t}\n\n\t\treturn hit;\n\n\t}\n\n\t// update the drag action\n\t_updatePosition( deltaTime ) {\n\n\t\tconst {\n\t\t\traycaster,\n\t\t\tcamera,\n\t\t\tpivotPoint,\n\t\t\tup,\n\t\t\tpointerTracker,\n\t\t\tdomElement,\n\t\t\tstate,\n\t\t\tdragInertia,\n\t\t} = this;\n\n\t\tif ( state === DRAG ) {\n\n\t\t\t// get the pointer and plane\n\t\t\tpointerTracker.getCenterPoint( _pointer );\n\t\t\tmouseToCoords( _pointer.x, _pointer.y, domElement, _pointer );\n\n\t\t\t_plane.setFromNormalAndCoplanarPoint( up, pivotPoint );\n\t\t\tsetRaycasterFromCamera( raycaster, _pointer, camera );\n\n\t\t\t// prevent the drag distance from getting too severe by limiting the drag point\n\t\t\t// to a reasonable angle with the drag plane\n\t\t\tif ( Math.abs( raycaster.ray.direction.dot( up ) ) < DRAG_PLANE_THRESHOLD ) {\n\n\t\t\t\t// rotate the pointer direction down to the correct angle for horizontal dragging\n\t\t\t\tconst angle = Math.acos( DRAG_PLANE_THRESHOLD );\n\n\t\t\t\t_rotationAxis\n\t\t\t\t\t.crossVectors( raycaster.ray.direction, up )\n\t\t\t\t\t.normalize();\n\n\t\t\t\traycaster.ray.direction\n\t\t\t\t\t.copy( up )\n\t\t\t\t\t.applyAxisAngle( _rotationAxis, angle )\n\t\t\t\t\t.multiplyScalar( - 1 );\n\n\t\t\t}\n\n\t\t\t// TODO: dragging causes the camera to rise because we're getting \"pushed\" up by lower resolution tiles and\n\t\t\t// don't lower back down. We should maintain a target height above tiles where possible\n\t\t\t// prevent the drag from inverting\n\n\t\t\t// if we drag to a point that's near the edge of the earth then we want to prevent it\n\t\t\t// from wrapping around and causing unexpected rotations\n\t\t\tthis.getUpDirection( pivotPoint, _localUp );\n\t\t\tif ( Math.abs( raycaster.ray.direction.dot( _localUp ) ) < DRAG_UP_THRESHOLD ) {\n\n\t\t\t\tconst angle = Math.acos( DRAG_UP_THRESHOLD );\n\n\t\t\t\t_rotationAxis\n\t\t\t\t\t.crossVectors( raycaster.ray.direction, _localUp )\n\t\t\t\t\t.normalize();\n\n\t\t\t\traycaster.ray.direction\n\t\t\t\t\t.copy( _localUp )\n\t\t\t\t\t.applyAxisAngle( _rotationAxis, angle )\n\t\t\t\t\t.multiplyScalar( - 1 );\n\n\t\t\t}\n\n\t\t\t// find the point on the plane that we should drag to\n\t\t\tif ( raycaster.ray.intersectPlane( _plane, _vec ) ) {\n\n\t\t\t\t_delta.subVectors( pivotPoint, _vec );\n\t\t\t\tcamera.position.add( _delta );\n\t\t\t\tcamera.updateMatrixWorld();\n\n\t\t\t\t// update the drag inertia\n\t\t\t\t_delta.multiplyScalar( 1 / deltaTime );\n\t\t\t\tif ( pointerTracker.getMoveDistance() / deltaTime < 2 * window.devicePixelRatio ) {\n\n\t\t\t\t\tthis.inertiaStableFrames ++;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdragInertia.copy( _delta );\n\t\t\t\t\tthis.inertiaStableFrames = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_updateRotation( deltaTime ) {\n\n\t\tconst {\n\t\t\tpivotPoint,\n\t\t\tpointerTracker,\n\t\t\tdomElement,\n\t\t\tstate,\n\t\t\trotationInertia,\n\t\t} = this;\n\n\t\tif ( state === ROTATE ) {\n\n\t\t\t// get the rotation motion and divide out the container height to normalize for element size\n\t\t\tpointerTracker.getCenterPoint( _pointer );\n\t\t\tpointerTracker.getPreviousCenterPoint( _prevPointer );\n\t\t\t_deltaPointer.subVectors( _pointer, _prevPointer ).multiplyScalar( 2 * Math.PI / domElement.clientHeight );\n\n\t\t\tthis._applyRotation( _deltaPointer.x, _deltaPointer.y, pivotPoint );\n\n\t\t\t// update rotation inertia\n\t\t\t_deltaPointer.multiplyScalar( 1 / deltaTime );\n\t\t\tif ( pointerTracker.getMoveDistance() / deltaTime < 2 * window.devicePixelRatio ) {\n\n\t\t\t\tthis.inertiaStableFrames ++;\n\n\t\t\t} else {\n\n\t\t\t\trotationInertia.copy( _deltaPointer );\n\t\t\t\tthis.inertiaStableFrames = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_applyRotation( x, y, pivotPoint ) {\n\n\t\tif ( x === 0 && y === 0 ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst {\n\t\t\tcamera,\n\t\t\tminAltitude,\n\t\t\tmaxAltitude,\n\t\t\trotationSpeed,\n\t\t} = this;\n\n\t\tconst azimuth = - x * rotationSpeed;\n\t\tlet altitude = y * rotationSpeed;\n\n\t\t// calculate current angles and clamp\n\t\t_forward.set( 0, 0, 1 ).transformDirection( camera.matrixWorld );\n\n\t\tthis.getUpDirection( pivotPoint, _localUp );\n\n\t\t// get the signed angle relative to the top down view\n\t\t_vec.crossVectors( _localUp, _forward ).normalize();\n\t\t_right.set( 1, 0, 0 ).transformDirection( camera.matrixWorld ).normalize();\n\t\tconst sign = Math.sign( _vec.dot( _right ) );\n\t\tconst angle = sign * _localUp.angleTo( _forward );\n\n\t\t// clamp the rotation to be within the provided limits\n\t\t// clamp to 0 here, as well, so we don't \"pop\" to the the value range\n\t\tif ( altitude > 0 ) {\n\n\t\t\taltitude = Math.min( angle - minAltitude - 1e-2, altitude );\n\t\t\taltitude = Math.max( 0, altitude );\n\n\t\t} else {\n\n\t\t\taltitude = Math.max( angle - maxAltitude, altitude );\n\t\t\taltitude = Math.min( 0, altitude );\n\n\t\t}\n\n\t\t// rotate around the up axis\n\t\t_quaternion.setFromAxisAngle( _localUp, azimuth );\n\t\tmakeRotateAroundPoint( pivotPoint, _quaternion, _rotMatrix );\n\t\tcamera.matrixWorld.premultiply( _rotMatrix );\n\n\t\t// get a rotation axis for altitude and rotate\n\t\t_rotationAxis.set( - 1, 0, 0 ).transformDirection( camera.matrixWorld );\n\n\t\t_quaternion.setFromAxisAngle( _rotationAxis, altitude );\n\t\tmakeRotateAroundPoint( pivotPoint, _quaternion, _rotMatrix );\n\t\tcamera.matrixWorld.premultiply( _rotMatrix );\n\n\t\t// update the transform members\n\t\tcamera.matrixWorld.decompose( camera.position, camera.quaternion, _vec );\n\n\t}\n\n\t// sets the \"up\" axis for the current surface of the tile set\n\t_setFrame( newUp, pivot ) {\n\n\t\tconst {\n\t\t\tup,\n\t\t\tcamera,\n\t\t\tstate,\n\t\t\tzoomPoint,\n\t\t\tzoomDirectionSet,\n\t\t\tzoomPointSet,\n\t\t\treorientOnDrag,\n\t\t\tscaleZoomOrientationAtEdges,\n\t\t} = this;\n\n\t\tcamera.updateMatrixWorld();\n\n\t\t// get the amount needed to rotate\n\t\t_quaternion.setFromUnitVectors( up, newUp );\n\n\t\t// If we're zooming then reorient around the zoom point\n\t\tconst action = state;\n\t\tif ( zoomDirectionSet && ( zoomPointSet || this._updateZoomPoint() ) ) {\n\n\t\t\tthis.getUpDirection( zoomPoint, _vec );\n\n\t\t\tif ( scaleZoomOrientationAtEdges ) {\n\n\t\t\t\tlet amt = Math.max( _vec.dot( up ) - 0.6, 0 ) / 0.4;\n\t\t\t\tamt = MathUtils.mapLinear( amt, 0, 0.5, 0, 1 );\n\t\t\t\tamt = Math.min( amt, 1 );\n\n\t\t\t\t// scale the value if we're using an orthographic camera so\n\t\t\t\t// GlobeControls works correctly\n\t\t\t\tif ( camera.isOrthographicCamera ) {\n\n\t\t\t\t\tamt *= 0.1;\n\n\t\t\t\t}\n\n\t\t\t\t_quaternion.slerp( _identityQuat, 1.0 - amt );\n\n\t\t\t}\n\n\t\t\t// rotates the camera position around the point being zoomed in to\n\t\t\tmakeRotateAroundPoint( zoomPoint, _quaternion, _rotMatrix );\n\t\t\tcamera.matrixWorld.premultiply( _rotMatrix );\n\t\t\tcamera.matrixWorld.decompose( camera.position, camera.quaternion, _vec );\n\n\t\t\t// recompute the zoom direction after updating rotation to align with frame\n\t\t\tthis.zoomDirectionSet = false;\n\t\t\tthis._updateZoomDirection();\n\n\t\t} else if ( action === DRAG && reorientOnDrag ) {\n\n\t\t\t// If we're dragging then reorient around the drag point\n\n\t\t\t// NOTE: We used to derive the pivot point here by getting the point below the camera\n\t\t\t// but decided to pass it in via \"update\" to avoid multiple ray casts\n\n\t\t\tif ( pivot ) {\n\n\t\t\t\t// perform a simple realignment by rotating the camera around the pivot\n\t\t\t\tmakeRotateAroundPoint( pivot, _quaternion, _rotMatrix );\n\t\t\t\tcamera.matrixWorld.premultiply( _rotMatrix );\n\t\t\t\tcamera.matrixWorld.decompose( camera.position, camera.quaternion, _vec );\n\n\t\t\t}\n\n\t\t}\n\n\t\tup.copy( newUp );\n\t\tcamera.updateMatrixWorld();\n\n\t}\n\n\t_raycast( raycaster ) {\n\n\t\tconst { scene, useFallbackPlane, fallbackPlane } = this;\n\t\tconst result = raycaster.intersectObject( scene )[ 0 ] || null;\n\t\tif ( result ) {\n\n\t\t\treturn result;\n\n\t\t} else if ( useFallbackPlane ) {\n\n\t\t\t// if we don't hit any geometry then try to intersect the fallback\n\t\t\t// plane so the camera can still be manipulated\n\t\t\tconst plane = fallbackPlane;\n\t\t\tif ( raycaster.ray.intersectPlane( plane, _vec ) ) {\n\n\t\t\t\tconst planeHit = {\n\t\t\t\t\tpoint: _vec.clone(),\n\t\t\t\t\tdistance: raycaster.ray.origin.distanceTo( _vec ),\n\t\t\t\t};\n\n\t\t\t\treturn planeHit;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n}\n","import {\n\tMatrix4,\n\tQuaternion,\n\tVector2,\n\tVector3,\n\tMathUtils,\n\tRay,\n} from 'three';\nimport { DRAG, ZOOM, EnvironmentControls, NONE } from './EnvironmentControls.js';\nimport { closestRayEllipsoidSurfacePointEstimate, closestRaySpherePointFromRotation, makeRotateAroundPoint, mouseToCoords, setRaycasterFromCamera } from './utils.js';\nimport { Ellipsoid } from '../math/Ellipsoid.js';\n\nconst _invMatrix = /* @__PURE__ */ new Matrix4();\nconst _rotMatrix = /* @__PURE__ */ new Matrix4();\nconst _pos = /* @__PURE__ */ new Vector3();\nconst _vec = /* @__PURE__ */ new Vector3();\nconst _center = /* @__PURE__ */ new Vector3();\nconst _forward = /* @__PURE__ */ new Vector3();\nconst _right = /* @__PURE__ */ new Vector3();\nconst _targetRight = /* @__PURE__ */ new Vector3();\nconst _globalUp = /* @__PURE__ */ new Vector3();\nconst _quaternion = /* @__PURE__ */ new Quaternion();\nconst _zoomPointUp = /* @__PURE__ */ new Vector3();\nconst _toCenter = /* @__PURE__ */ new Vector3();\nconst _ray = /* @__PURE__ */ new Ray();\nconst _ellipsoid = /* @__PURE__ */ new Ellipsoid();\nconst _latLon = {};\n\nconst _pointer = new Vector2();\nconst MIN_ELEVATION = 400;\n\nexport class GlobeControls extends EnvironmentControls {\n\n\tget ellipsoid() {\n\n\t\treturn this.tilesRenderer ? this.tilesRenderer.ellipsoid : null;\n\n\t}\n\n\tget tilesGroup() {\n\n\t\treturn this.tilesRenderer ? this.tilesRenderer.group : null;\n\n\t}\n\n\tconstructor( scene = null, camera = null, domElement = null, tilesRenderer = null ) {\n\n\t\t// store which mode the drag stats are in\n\t\tsuper( scene, camera, domElement );\n\n\t\tthis.isGlobeControls = true;\n\n\t\tthis._dragMode = 0;\n\t\tthis._rotationMode = 0;\n\t\tthis.maxZoom = 0.01;\n\t\tthis.nearMargin = 0.25;\n\t\tthis.farMargin = 0;\n\t\tthis.useFallbackPlane = false;\n\t\tthis.reorientOnDrag = false;\n\n\t\tthis.globeInertia = new Quaternion();\n\t\tthis.globeInertiaFactor = 0;\n\n\t\tthis.setTilesRenderer( tilesRenderer );\n\n\t}\n\n\tsetScene( scene ) {\n\n\t\tif ( scene === null && this.tilesRenderer !== null ) {\n\n\t\t\tsuper.setScene( this.tilesRenderer.group );\n\n\t\t} else {\n\n\t\t\tsuper.setScene( scene );\n\n\t\t}\n\n\t}\n\n\tgetPivotPoint( target ) {\n\n\t\tconst { camera, tilesGroup, ellipsoid } = this;\n\n\t\t// get camera values\n\t\t_forward.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\n\t\t// set a ray in the local ellipsoid frame\n\t\t_ray.origin.copy( camera.position );\n\t\t_ray.direction.copy( _forward );\n\t\t_ray.applyMatrix4( tilesGroup.matrixWorldInverse );\n\n\t\t// get the estimated closest point\n\t\tclosestRayEllipsoidSurfacePointEstimate( _ray, ellipsoid, _vec );\n\t\t_vec.applyMatrix4( tilesGroup.matrixWorld );\n\n\t\t// use the closest point if no pivot was provided or it's closer\n\t\tif (\n\t\t\tsuper.getPivotPoint( target ) === null ||\n\t\t\ttarget.distanceTo( _ray.origin ) > _vec.distanceTo( _ray.origin )\n\t\t) {\n\n\t\t\ttarget.copy( _vec );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t// get the vector to the center of the provided globe\n\tgetVectorToCenter( target ) {\n\n\t\tconst { tilesGroup, camera } = this;\n\t\treturn target\n\t\t\t.setFromMatrixPosition( tilesGroup.matrixWorld )\n\t\t\t.sub( camera.position );\n\n\t}\n\n\t// get the distance to the center of the globe\n\tgetDistanceToCenter() {\n\n\t\treturn this\n\t\t\t.getVectorToCenter( _vec )\n\t\t\t.length();\n\n\t}\n\n\tgetUpDirection( point, target ) {\n\n\t\t// get the \"up\" direction based on the wgs84 ellipsoid\n\t\tconst { tilesGroup, ellipsoid } = this;\n\t\t_vec.copy( point ).applyMatrix4( tilesGroup.matrixWorldInverse );\n\n\t\tellipsoid.getPositionToNormal( _vec, target );\n\t\ttarget.transformDirection( tilesGroup.matrixWorld );\n\n\t}\n\n\tgetCameraUpDirection( target ) {\n\n\t\tconst { tilesGroup, ellipsoid, camera } = this;\n\t\tif ( camera.isOrthographicCamera ) {\n\n\t\t\tthis._getVirtualOrthoCameraPosition( _vec );\n\n\t\t\t_vec.applyMatrix4( tilesGroup.matrixWorldInverse );\n\n\t\t\tellipsoid.getPositionToNormal( _vec, target );\n\t\t\ttarget.transformDirection( tilesGroup.matrixWorld );\n\n\t\t} else {\n\n\t\t\tthis.getUpDirection( camera.position, target );\n\n\t\t}\n\n\t}\n\n\tupdate( deltaTime = Math.min( this.clock.getDelta(), 64 / 1000 ) ) {\n\n\t\tif ( ! this.enabled || ! this.tilesGroup || ! this.camera || deltaTime === 0 ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst { camera, pivotMesh } = this;\n\n\t\t// if we're outside the transition threshold then we toggle some reorientation behavior\n\t\t// when adjusting the up frame while moving the camera\n\t\tif ( this._isNearControls() ) {\n\n\t\t\tthis.scaleZoomOrientationAtEdges = this.zoomDelta < 0;\n\n\t\t} else {\n\n\t\t\tif ( this.state !== NONE && this._dragMode !== 1 && this._rotationMode !== 1 ) {\n\n\t\t\t\tpivotMesh.visible = false;\n\n\t\t\t}\n\t\t\tthis.scaleZoomOrientationAtEdges = false;\n\n\t\t}\n\n\t\t// fire basic controls update\n\t\tsuper.update( deltaTime );\n\n\t\t// update the camera planes and the ortho camera position\n\t\tthis.adjustCamera( camera );\n\n\t}\n\n\t// Updates the passed camera near and far clip planes to encapsulate the ellipsoid from the\n\t// current position in addition to adjusting the height.\n\tadjustCamera( camera ) {\n\n\t\tsuper.adjustCamera( camera );\n\n\t\tconst { tilesGroup, ellipsoid, nearMargin, farMargin } = this;\n\t\tconst maxRadius = Math.max( ...ellipsoid.radius );\n\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\t// adjust the clip planes\n\t\t\tconst distanceToCenter = _vec\n\t\t\t\t.setFromMatrixPosition( tilesGroup.matrixWorld )\n\t\t\t\t.sub( camera.position ).length();\n\n\t\t\t// update the projection matrix\n\t\t\t// interpolate from the 25% radius margin around the globe down to the surface\n\t\t\t// so we can avoid z fighting when near value is too far at a high altitude\n\t\t\tconst margin = nearMargin * maxRadius;\n\t\t\tconst alpha = MathUtils.clamp( ( distanceToCenter - maxRadius ) / margin, 0, 1 );\n\t\t\tconst minNear = MathUtils.lerp( 1, 1000, alpha );\n\t\t\tcamera.near = Math.max( minNear, distanceToCenter - maxRadius - margin );\n\n\t\t\t// update the far plane to the horizon distance\n\t\t\t_pos.copy( camera.position ).applyMatrix4( tilesGroup.matrixWorldInverse );\n\t\t\tellipsoid.getPositionToCartographic( _pos, _latLon );\n\n\t\t\t// use a minimum elevation for computing the horizon distance to avoid the far clip\n\t\t\t// plane approaching zero as the camera goes to or below sea level.\n\t\t\tconst elevation = Math.max( ellipsoid.getPositionElevation( _pos ), MIN_ELEVATION );\n\t\t\tconst horizonDistance = ellipsoid.calculateHorizonDistance( _latLon.lat, elevation );\n\n\t\t\t// extend the horizon distance by 2.5 to handle cases where geometry extends above the horizon\n\t\t\tcamera.far = horizonDistance * 2.5 + 0.1 + maxRadius * farMargin;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t} else {\n\n\t\t\tthis._getVirtualOrthoCameraPosition( camera.position, camera );\n\t\t\tcamera.updateMatrixWorld();\n\n\t\t\t_invMatrix.copy( camera.matrixWorld ).invert();\n\t\t\t_vec.setFromMatrixPosition( tilesGroup.matrixWorld ).applyMatrix4( _invMatrix );\n\n\t\t\tconst distanceToCenter = - _vec.z;\n\t\t\tcamera.near = distanceToCenter - maxRadius * ( 1 + nearMargin );\n\t\t\tcamera.far = distanceToCenter + 0.1 + maxRadius * farMargin;\n\n\t\t\t// adjust the position of the ortho camera such that the near value is 0\n\t\t\tcamera.position.addScaledVector( _forward, camera.near );\n\t\t\tcamera.far -= camera.near;\n\t\t\tcamera.near = 0;\n\n\t\t\tcamera.updateProjectionMatrix();\n\t\t\tcamera.updateMatrixWorld();\n\n\t\t}\n\n\t}\n\n\t// resets the \"stuck\" drag modes\n\tresetState() {\n\n\t\tsuper.resetState();\n\t\tthis._dragMode = 0;\n\t\tthis._rotationMode = 0;\n\n\t}\n\n\t_updateInertia( deltaTime ) {\n\n\t\tsuper._updateInertia( deltaTime );\n\n\t\tconst {\n\t\t\tglobeInertia,\n\t\t\tenableDamping,\n\t\t\tdampingFactor,\n\t\t\tcamera,\n\t\t\tcameraRadius,\n\t\t\tminDistance,\n\t\t\tinertiaTargetDistance,\n\t\t\ttilesGroup,\n\t\t} = this;\n\n\t\tif ( ! this.enableDamping || this.inertiaStableFrames > 1 ) {\n\n\t\t\tthis.globeInertiaFactor = 0;\n\t\t\tthis.globeInertia.identity();\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst factor = Math.pow( 2, - deltaTime / dampingFactor );\n\t\tconst stableDistance = Math.max( camera.near, cameraRadius, minDistance, inertiaTargetDistance );\n\t\tconst resolution = 2 * 1e3;\n\t\tconst pixelWidth = 2 / resolution;\n\t\tconst pixelThreshold = 0.25 * pixelWidth;\n\n\t\t_center.setFromMatrixPosition( tilesGroup.matrixWorld );\n\n\t\tif ( this.globeInertiaFactor !== 0 ) {\n\n\t\t\t// calculate two screen points at 1 pixel apart in our notional resolution so we can stop when the delta is ~ 1 pixel\n\t\t\t// projected into world space\n\t\t\tsetRaycasterFromCamera( _ray, _vec.set( 0, 0, - 1 ), camera );\n\t\t\t_ray.applyMatrix4( camera.matrixWorldInverse );\n\t\t\t_ray.direction.normalize();\n\t\t\t_ray.recast( - _ray.direction.dot( _ray.origin ) ).at( stableDistance / _ray.direction.z, _vec );\n\t\t\t_vec.applyMatrix4( camera.matrixWorld );\n\n\t\t\tsetRaycasterFromCamera( _ray, _pos.set( pixelThreshold, pixelThreshold, - 1 ), camera );\n\t\t\t_ray.applyMatrix4( camera.matrixWorldInverse );\n\t\t\t_ray.direction.normalize();\n\t\t\t_ray.recast( - _ray.direction.dot( _ray.origin ) ).at( stableDistance / _ray.direction.z, _pos );\n\t\t\t_pos.applyMatrix4( camera.matrixWorld );\n\n\t\t\t// get implied angle\n\t\t\t_vec.sub( _center ).normalize();\n\t\t\t_pos.sub( _center ).normalize();\n\n\t\t\tthis.globeInertiaFactor *= factor;\n\t\t\tconst threshold = _vec.angleTo( _pos ) / deltaTime;\n\t\t\tconst globeAngle = 2 * Math.acos( globeInertia.w ) * this.globeInertiaFactor;\n\t\t\tif ( globeAngle < threshold || ! enableDamping ) {\n\n\t\t\t\tthis.globeInertiaFactor = 0;\n\t\t\t\tglobeInertia.identity();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.globeInertiaFactor !== 0 ) {\n\n\t\t\t// ensure our w component is non-one if the xyz values are\n\t\t\t// non zero to ensure we can animate\n\t\t\tif (\n\t\t\t\tglobeInertia.w === 1 && (\n\t\t\t\t\tglobeInertia.x !== 0 ||\n\t\t\t\t\tglobeInertia.y !== 0 ||\n\t\t\t\t\tglobeInertia.z !== 0\n\t\t\t\t)\n\t\t\t) {\n\n\t\t\t\tglobeInertia.w = Math.min( globeInertia.w, 1 - 1e-9 );\n\n\t\t\t}\n\n\t\t\t// construct the rotation matrix\n\t\t\t_center.setFromMatrixPosition( tilesGroup.matrixWorld );\n\t\t\t_quaternion.identity().slerp( globeInertia, this.globeInertiaFactor * deltaTime );\n\t\t\tmakeRotateAroundPoint( _center, _quaternion, _rotMatrix );\n\n\t\t\t// apply the rotation\n\t\t\tcamera.matrixWorld.premultiply( _rotMatrix );\n\t\t\tcamera.matrixWorld.decompose( camera.position, camera.quaternion, _vec );\n\n\t\t}\n\n\t}\n\n\t_inertiaNeedsUpdate() {\n\n\t\treturn super._inertiaNeedsUpdate() || this.globeInertiaFactor !== 0;\n\n\t}\n\n\t_updatePosition( deltaTime ) {\n\n\t\tif ( this.state === DRAG ) {\n\n\t\t\t// save the drag mode state so we can update the pivot mesh visuals in \"update\"\n\t\t\tif ( this._dragMode === 0 ) {\n\n\t\t\t\tthis._dragMode = this._isNearControls() ? 1 : - 1;\n\n\t\t\t}\n\n\t\t\tconst {\n\t\t\t\traycaster,\n\t\t\t\tcamera,\n\t\t\t\tpivotPoint,\n\t\t\t\tpointerTracker,\n\t\t\t\tdomElement,\n\t\t\t\ttilesGroup,\n\t\t\t} = this;\n\n\t\t\t// reuse cache variables\n\t\t\tconst pivotDir = _pos;\n\t\t\tconst newPivotDir = _targetRight;\n\n\t\t\t// get the pointer and ray\n\t\t\tpointerTracker.getCenterPoint( _pointer );\n\t\t\tmouseToCoords( _pointer.x, _pointer.y, domElement, _pointer );\n\t\t\tsetRaycasterFromCamera( raycaster, _pointer, camera );\n\n\t\t\t// transform to ellipsoid frame\n\t\t\traycaster.ray.applyMatrix4( tilesGroup.matrixWorldInverse );\n\n\t\t\t// construct an ellipsoid that matches a sphere with the radius of the globe so\n\t\t\t// the drag position matches where the initial click was\n\t\t\tconst pivotRadius = _vec.copy( pivotPoint ).applyMatrix4( tilesGroup.matrixWorldInverse ).length();\n\t\t\t_ellipsoid.radius.setScalar( pivotRadius );\n\n\t\t\t// find the hit point and use the closest point on the horizon if we miss\n\t\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\t\tif ( ! _ellipsoid.intersectRay( raycaster.ray, _vec ) ) {\n\n\t\t\t\t\tclosestRaySpherePointFromRotation( raycaster.ray, pivotRadius, _vec );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tclosestRayEllipsoidSurfacePointEstimate( raycaster.ray, _ellipsoid, _vec );\n\n\t\t\t}\n\t\t\t_vec.applyMatrix4( tilesGroup.matrixWorld );\n\n\t\t\t// get the point directions\n\t\t\t_center.setFromMatrixPosition( tilesGroup.matrixWorld );\n\t\t\tpivotDir.subVectors( pivotPoint, _center ).normalize();\n\t\t\tnewPivotDir.subVectors( _vec, _center ).normalize();\n\n\t\t\t// construct the rotation\n\t\t\t_quaternion.setFromUnitVectors( newPivotDir, pivotDir );\n\t\t\tmakeRotateAroundPoint( _center, _quaternion, _rotMatrix );\n\n\t\t\t// apply the rotation\n\t\t\tcamera.matrixWorld.premultiply( _rotMatrix );\n\t\t\tcamera.matrixWorld.decompose( camera.position, camera.quaternion, _vec );\n\n\t\t\tif ( pointerTracker.getMoveDistance() / deltaTime < 2 * window.devicePixelRatio ) {\n\n\t\t\t\tthis.inertiaStableFrames ++;\n\n\t\t\t} else {\n\n\t\t\t\tthis.globeInertia.copy( _quaternion );\n\t\t\t\tthis.globeInertiaFactor = 1 / deltaTime;\n\t\t\t\tthis.inertiaStableFrames = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._alignCameraUp( this.up );\n\n\t}\n\n\t// disable rotation once we're outside the control transition\n\t_updateRotation( ...args ) {\n\n\t\tif ( this._rotationMode === 1 || this._isNearControls() ) {\n\n\t\t\tthis._rotationMode = 1;\n\t\t\tsuper._updateRotation( ...args );\n\n\t\t} else {\n\n\t\t\tthis.pivotMesh.visible = false;\n\t\t\tthis._rotationMode = - 1;\n\n\t\t}\n\n\t\tthis._alignCameraUp( this.up );\n\n\t}\n\n\t_updateZoom() {\n\n\t\tconst { zoomDelta, ellipsoid, zoomSpeed, zoomPoint, camera, maxZoom, state } = this;\n\n\t\tif ( state !== ZOOM && zoomDelta === 0 ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// reset momentum\n\t\tthis.rotationInertia.set( 0, 0 );\n\t\tthis.dragInertia.set( 0, 0, 0 );\n\t\tthis.globeInertia.identity();\n\t\tthis.globeInertiaFactor = 0;\n\n\t\t// used to scale the tilt transitions based on zoom intensity\n\t\tconst deltaAlpha = MathUtils.clamp( MathUtils.mapLinear( Math.abs( zoomDelta ), 0, 20, 0, 1 ), 0, 1 );\n\t\tif ( this._isNearControls() || zoomDelta > 0 ) {\n\n\t\t\tthis._updateZoomDirection();\n\n\t\t\t// When zooming try to tilt the camera towards the center of the planet to avoid the globe\n\t\t\t// spinning as you zoom out from the horizon\n\t\t\tif ( zoomDelta < 0 && ( this.zoomPointSet || this._updateZoomPoint() ) ) {\n\n\t\t\t\t// get the forward vector and vector toward the center of the ellipsoid\n\t\t\t\t_forward.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ).normalize();\n\t\t\t\t_toCenter.copy( this.up ).multiplyScalar( - 1 );\n\n\t\t\t\t// Calculate alpha values to use to scale the amount of tilt that occurs as the camera moves.\n\t\t\t\t// Scales based on mouse position near the horizon and current tilt.\n\t\t\t\tthis.getUpDirection( zoomPoint, _zoomPointUp );\n\t\t\t\tconst upAlpha = MathUtils.clamp( MathUtils.mapLinear( - _zoomPointUp.dot( _toCenter ), 1, 0.95, 0, 1 ), 0, 1 );\n\t\t\t\tconst forwardAlpha = 1 - _forward.dot( _toCenter );\n\t\t\t\tconst cameraAlpha = camera.isOrthographicCamera ? 0.05 : 1;\n\t\t\t\tconst adjustedDeltaAlpha = MathUtils.clamp( deltaAlpha * 3, 0, 1 );\n\n\t\t\t\t// apply scale\n\t\t\t\tconst alpha = Math.min( upAlpha * forwardAlpha * cameraAlpha * adjustedDeltaAlpha, 0.1 );\n\t\t\t\t_toCenter.lerpVectors( _forward, _toCenter, alpha ).normalize();\n\n\t\t\t\t// perform rotation\n\t\t\t\t_quaternion.setFromUnitVectors( _forward, _toCenter );\n\t\t\t\tmakeRotateAroundPoint( zoomPoint, _quaternion, _rotMatrix );\n\t\t\t\tcamera.matrixWorld.premultiply( _rotMatrix );\n\t\t\t\tcamera.matrixWorld.decompose( camera.position, camera.quaternion, _toCenter );\n\n\t\t\t\t// update zoom direction\n\t\t\t\tthis.zoomDirection.subVectors( zoomPoint, camera.position ).normalize();\n\n\t\t\t}\n\n\t\t\tsuper._updateZoom();\n\n\t\t} else if ( camera.isPerspectiveCamera ) {\n\n\t\t\t// orient the camera to focus on the earth during the zoom\n\t\t\tconst transitionDistance = this._getPerspectiveTransitionDistance();\n\t\t\tconst maxDistance = this._getMaxPerspectiveDistance();\n\t\t\tconst distanceAlpha = MathUtils.mapLinear( this.getDistanceToCenter(), transitionDistance, maxDistance, 0, 1 );\n\t\t\tthis._tiltTowardsCenter( MathUtils.lerp( 0, 0.4, distanceAlpha * deltaAlpha ) );\n\t\t\tthis._alignCameraUpToNorth( MathUtils.lerp( 0, 0.2, distanceAlpha * deltaAlpha ) );\n\n\t\t\t// calculate zoom in a similar way to environment controls so\n\t\t\t// the zoom speeds are comparable\n\t\t\tconst dist = this.getDistanceToCenter() - ellipsoid.radius.x;\n\t\t\tconst scale = zoomDelta * dist * zoomSpeed * 0.0025;\n\t\t\tconst clampedScale = Math.max( scale, Math.min( this.getDistanceToCenter() - maxDistance, 0 ) );\n\n\t\t\t// zoom out directly from the globe center\n\t\t\tthis.getVectorToCenter( _vec ).normalize();\n\t\t\tthis.camera.position.addScaledVector( _vec, clampedScale );\n\t\t\tthis.camera.updateMatrixWorld();\n\n\t\t\tthis.zoomDelta = 0;\n\n\t\t} else {\n\n\t\t\tconst transitionZoom = this._getOrthographicTransitionZoom();\n\t\t\tconst minZoom = this._getMinOrthographicZoom();\n\t\t\tconst distanceAlpha = MathUtils.mapLinear( camera.zoom, transitionZoom, minZoom, 0, 1 );\n\t\t\tthis._tiltTowardsCenter( MathUtils.lerp( 0, 0.4, distanceAlpha * deltaAlpha ) );\n\t\t\tthis._alignCameraUpToNorth( MathUtils.lerp( 0, 0.2, distanceAlpha * deltaAlpha ) );\n\n\t\t\tconst scale = this.zoomDelta;\n\t\t\tconst normalizedDelta = Math.pow( 0.95, Math.abs( scale * 0.05 ) );\n\t\t\tconst scaleFactor = scale > 0 ? 1 / Math.abs( normalizedDelta ) : normalizedDelta;\n\n\t\t\tconst maxScaleFactor = minZoom / camera.zoom;\n\t\t\tconst clampedScaleFactor = Math.max( scaleFactor * zoomSpeed, Math.min( maxScaleFactor, 1 ) );\n\n\t\t\tcamera.zoom = Math.min( maxZoom, camera.zoom * clampedScaleFactor );\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\tthis.zoomDelta = 0;\n\t\t\tthis.zoomDirectionSet = false;\n\n\t\t}\n\n\t}\n\n\t// tilt the camera to align with north\n\t_alignCameraUpToNorth( alpha ) {\n\n\t\tconst { tilesGroup } = this;\n\t\t_globalUp.set( 0, 0, 1 ).transformDirection( tilesGroup.matrixWorld );\n\t\tthis._alignCameraUp( _globalUp, alpha );\n\n\t}\n\n\t// tilt the camera to align with the provided \"up\" value\n\t_alignCameraUp( up, alpha = null ) {\n\n\t\tconst { camera } = this;\n\t\t_forward.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\t\t_right.set( - 1, 0, 0 ).transformDirection( camera.matrixWorld );\n\t\t_targetRight.crossVectors( up, _forward );\n\n\t\t// compute the alpha based on how far away from boresight the up vector is\n\t\t// so we can ease into the correct orientation\n\t\tif ( alpha === null ) {\n\n\t\t\talpha = 1 - Math.abs( _forward.dot( up ) );\n\t\t\talpha = MathUtils.mapLinear( alpha, 0, 1, - 0.01, 1 );\n\t\t\talpha = MathUtils.clamp( alpha, 0, 1 ) ** 2;\n\n\t\t}\n\n\t\t_targetRight.lerp( _right, 1 - alpha ).normalize();\n\n\t\t_quaternion.setFromUnitVectors( _right, _targetRight );\n\t\tcamera.quaternion.premultiply( _quaternion );\n\t\tcamera.updateMatrixWorld();\n\n\t}\n\n\t// tilt the camera to look at the center of the globe\n\t_tiltTowardsCenter( alpha ) {\n\n\t\tconst {\n\t\t\tcamera,\n\t\t\ttilesGroup,\n\t\t} = this;\n\n\t\t_forward.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ).normalize();\n\t\t_vec.setFromMatrixPosition( tilesGroup.matrixWorld ).sub( camera.position ).normalize();\n\t\t_vec.lerp( _forward, 1 - alpha ).normalize();\n\n\t\t_quaternion.setFromUnitVectors( _forward, _vec );\n\t\tcamera.quaternion.premultiply( _quaternion );\n\t\tcamera.updateMatrixWorld();\n\n\t}\n\n\t// returns the perspective camera transition distance can move to based on globe size and fov\n\t_getPerspectiveTransitionDistance() {\n\n\t\tconst { camera, ellipsoid } = this;\n\t\tif ( ! camera.isPerspectiveCamera ) {\n\n\t\t\tthrow new Error();\n\n\t\t}\n\n\t\t// When the smallest fov spans 65% of the ellipsoid then we use the near controls\n\t\tconst ellipsoidRadius = Math.max( ...ellipsoid.radius );\n\t\tconst fovHoriz = 2 * Math.atan( Math.tan( MathUtils.DEG2RAD * camera.fov * 0.5 ) * camera.aspect );\n\t\tconst distVert = ellipsoidRadius / Math.tan( MathUtils.DEG2RAD * camera.fov * 0.5 );\n\t\tconst distHoriz = ellipsoidRadius / Math.tan( fovHoriz * 0.5 );\n\t\tconst dist = Math.max( distVert, distHoriz );\n\n\t\treturn dist;\n\n\t}\n\n\t// returns the max distance the perspective camera can move to based on globe size and fov\n\t_getMaxPerspectiveDistance() {\n\n\t\tconst { camera, ellipsoid } = this;\n\t\tif ( ! camera.isPerspectiveCamera ) {\n\n\t\t\tthrow new Error();\n\n\t\t}\n\n\t\t// allow for zooming out such that the ellipsoid is half the size of the largest fov\n\t\tconst ellipsoidRadius = Math.max( ...ellipsoid.radius );\n\t\tconst fovHoriz = 2 * Math.atan( Math.tan( MathUtils.DEG2RAD * camera.fov * 0.5 ) * camera.aspect );\n\t\tconst distVert = ellipsoidRadius / Math.tan( MathUtils.DEG2RAD * camera.fov * 0.5 );\n\t\tconst distHoriz = ellipsoidRadius / Math.tan( fovHoriz * 0.5 );\n\t\tconst dist = 2 * Math.max( distVert, distHoriz );\n\n\t\treturn dist;\n\n\t}\n\n\t// returns the transition threshold for orthographic zoom based on the globe size and camera settings\n\t_getOrthographicTransitionZoom() {\n\n\t\tconst { camera, ellipsoid } = this;\n\t\tif ( ! camera.isOrthographicCamera ) {\n\n\t\t\tthrow new Error();\n\n\t\t}\n\n\t\tconst orthoHeight = ( camera.top - camera.bottom );\n\t\tconst orthoWidth = ( camera.right - camera.left );\n\t\tconst orthoSize = Math.max( orthoHeight, orthoWidth );\n\t\tconst ellipsoidRadius = Math.max( ...ellipsoid.radius );\n\t\tconst ellipsoidDiameter = 2 * ellipsoidRadius;\n\t\treturn 2 * orthoSize / ellipsoidDiameter;\n\n\t}\n\n\t// returns the minimum allowed orthographic zoom based on the globe size and camera settings\n\t_getMinOrthographicZoom() {\n\n\t\tconst { camera, ellipsoid } = this;\n\t\tif ( ! camera.isOrthographicCamera ) {\n\n\t\t\tthrow new Error();\n\n\t\t}\n\n\t\tconst orthoHeight = ( camera.top - camera.bottom );\n\t\tconst orthoWidth = ( camera.right - camera.left );\n\t\tconst orthoSize = Math.min( orthoHeight, orthoWidth );\n\t\tconst ellipsoidRadius = Math.max( ...ellipsoid.radius );\n\t\tconst ellipsoidDiameter = 2 * ellipsoidRadius;\n\t\treturn 0.7 * orthoSize / ellipsoidDiameter;\n\n\t}\n\n\t// returns the \"virtual position\" of the orthographic based on where it is and\n\t// where it's looking primarily so we can reasonably position the camera object\n\t// in space and derive a reasonable \"up\" value.\n\t_getVirtualOrthoCameraPosition( target, camera = this.camera ) {\n\n\t\tconst { tilesGroup, ellipsoid } = this;\n\t\tif ( ! camera.isOrthographicCamera ) {\n\n\t\t\tthrow new Error();\n\n\t\t}\n\n\t\t// get ray in globe coordinate frame\n\t\t_ray.origin.copy( camera.position );\n\t\t_ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\t\t_ray.applyMatrix4( tilesGroup.matrixWorldInverse );\n\n\t\t// get the closest point to the ray on the globe in the global coordinate frame\n\t\tclosestRayEllipsoidSurfacePointEstimate( _ray, ellipsoid, _pos );\n\t\t_pos.applyMatrix4( tilesGroup.matrixWorld );\n\n\t\t// get ortho camera info\n\t\tconst orthoHeight = ( camera.top - camera.bottom );\n\t\tconst orthoWidth = ( camera.right - camera.left );\n\t\tconst orthoSize = Math.max( orthoHeight, orthoWidth ) / camera.zoom;\n\t\t_forward.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\n\t\t// ensure we move the camera exactly along the forward vector to avoid shifting\n\t\t// the camera in other directions due to floating point error\n\t\tconst dist = _pos.sub( camera.position ).dot( _forward );\n\t\ttarget.copy( camera.position ).addScaledVector( _forward, dist - orthoSize * 4 );\n\n\t}\n\n\t_isNearControls() {\n\n\t\tconst { camera } = this;\n\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\treturn this.getDistanceToCenter() < this._getPerspectiveTransitionDistance();\n\n\t\t} else {\n\n\t\t\treturn camera.zoom > this._getOrthographicTransitionZoom();\n\n\t\t}\n\n\t}\n\n\t_raycast( raycaster ) {\n\n\t\tconst result = super._raycast( raycaster );\n\t\tif ( result === null ) {\n\n\t\t\t// if there was no hit then fallback to intersecting the ellipsoid.\n\t\t\tconst { ellipsoid, tilesGroup } = this;\n\t\t\t_ray.copy( raycaster.ray ).applyMatrix4( tilesGroup.matrixWorldInverse );\n\n\t\t\tconst point = ellipsoid.intersectRay( _ray, _vec );\n\t\t\tif ( point !== null ) {\n\n\t\t\t\treturn {\n\t\t\t\t\tpoint: point.clone().applyMatrix4( tilesGroup.matrixWorld ),\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\n\t\t} else {\n\n\t\t\treturn result;\n\n\t\t}\n\n\t}\n\n}\n","export class GoogleAttributionsManager {\n\n\tconstructor() {\n\n\t\tthis.creditsCount = {};\n\n\t}\n\n\t_adjustAttributions( line, add ) {\n\n\t\tconst creditsCount = this.creditsCount;\n\t\tconst tokens = line.split( /;/g );\n\t\tfor ( let i = 0, l = tokens.length; i < l; i ++ ) {\n\n\t\t\tconst t = tokens[ i ];\n\t\t\tif ( ! ( t in creditsCount ) ) {\n\n\t\t\t\tcreditsCount[ t ] = 0;\n\n\t\t\t}\n\n\t\t\tcreditsCount[ t ] += add ? 1 : - 1;\n\n\t\t\tif ( creditsCount[ t ] <= 0 ) {\n\n\t\t\t\tdelete creditsCount[ t ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\taddAttributions( line ) {\n\n\t\tthis._adjustAttributions( line, true );\n\n\t}\n\n\tremoveAttributions( line ) {\n\n\t\tthis._adjustAttributions( line, false );\n\n\t}\n\n\ttoString() {\n\n\t\t// attribution guidelines: https://developers.google.com/maps/documentation/tile/create-renderer#display-attributions\n\n\t\tconst sortedByCount = Object.entries( this.creditsCount ).sort( ( a, b ) => {\n\n\t\t\tconst countA = a[ 1 ];\n\t\t\tconst countB = b[ 1 ];\n\t\t\treturn countB - countA; // Descending order\n\n\t\t} );\n\n\t\treturn sortedByCount.map( pair => pair[ 0 ] ).join( '; ' );\n\n\t}\n\n}\n","import { traverseSet } from '../../base/traverseFunctions.js';\nimport { GoogleAttributionsManager } from './GoogleAttributionsManager.js';\n\nfunction getSessionToken( root ) {\n\n\tlet sessionToken = null;\n\ttraverseSet( root, tile => {\n\n\t\tif ( tile.content && tile.content.uri ) {\n\n\t\t\tconst [ , params ] = tile.content.uri.split( '?' );\n\t\t\tsessionToken = new URLSearchParams( params ).get( 'session' );\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t} );\n\n\treturn sessionToken;\n\n}\n\nexport class GoogleCloudAuthPlugin {\n\n\tconstructor( { apiToken, autoRefreshToken = false, logoUrl = null, useRecommendedSettings = true } ) {\n\n\t\tthis.name = 'GOOGLE_CLOUD_AUTH_PLUGIN';\n\t\tthis.priority = - Infinity;\n\n\t\tthis.apiToken = apiToken;\n\t\tthis.autoRefreshToken = autoRefreshToken;\n\t\tthis.useRecommendedSettings = useRecommendedSettings;\n\t\tthis.logoUrl = logoUrl;\n\t\tthis.sessionToken = null;\n\t\tthis.tiles = null;\n\n\t\tthis._onLoadCallback = null;\n\t\tthis._visibilityChangeCallback = null;\n\t\tthis._tokenRefreshPromise = null;\n\t\tthis._attributionsManager = new GoogleAttributionsManager();\n\t\tthis._logoAttribution = {\n\t\t\tvalue: '',\n\t\t\ttype: 'image',\n\t\t\tcollapsible: false,\n\t\t};\n\t\tthis._attribution = {\n\t\t\tvalue: '',\n\t\t\ttype: 'string',\n\t\t\tcollapsible: true,\n\t\t};\n\n\t}\n\n\tinit( tiles ) {\n\n\t\tif ( tiles == null ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// reset the tiles in case this plugin was removed and re-added\n\t\ttiles.resetFailedTiles();\n\n\t\tif ( tiles.rootURL == null ) {\n\n\t\t\ttiles.rootURL = 'https://tile.googleapis.com/v1/3dtiles/root.json';\n\n\t\t}\n\n\t\tif ( this.useRecommendedSettings ) {\n\n\t\t\t// This plugin changes below values to be more efficient for the photorealistic tiles\n\t\t\ttiles.parseQueue.maxJobs = 10;\n\t\t\ttiles.downloadQueue.maxJobs = 30;\n\t\t\ttiles.errorTarget = 20;\n\n\t\t}\n\n\t\tthis.tiles = tiles;\n\t\tthis._onLoadCallback = ( { tileSet } ) => {\n\n\t\t\t// the first tile set loaded will be the root\n\t\t\tthis.sessionToken = getSessionToken( tileSet.root );\n\n\t\t\t// clear the callback once the root is loaded\n\t\t\ttiles.removeEventListener( 'load-tile-set', this._onLoadCallback );\n\n\t\t};\n\n\t\tthis._visibilityChangeCallback = ( { tile, visible } ) => {\n\n\t\t\tconst copyright = tile.cached.metadata.asset.copyright || '';\n\t\t\tif ( visible ) {\n\n\t\t\t\tthis._attributionsManager.addAttributions( copyright );\n\n\t\t\t} else {\n\n\t\t\t\tthis._attributionsManager.removeAttributions( copyright );\n\n\t\t\t}\n\n\t\t};\n\n\t\ttiles.addEventListener( 'load-tile-set', this._onLoadCallback );\n\t\ttiles.addEventListener( 'tile-visibility-change', this._visibilityChangeCallback );\n\n\t}\n\n\tgetAttributions( target ) {\n\n\t\tif ( this.tiles.visibleTiles.size > 0 ) {\n\n\t\t\tif ( this.logoUrl ) {\n\n\t\t\t\tthis._logoAttribution.value = this.logoUrl;\n\t\t\t\ttarget.push( this._logoAttribution );\n\n\t\t\t}\n\n\t\t\tthis._attribution.value = this._attributionsManager.toString();\n\t\t\ttarget.push( this._attribution );\n\n\t\t}\n\n\t}\n\n\tpreprocessURL( uri ) {\n\n\t\turi = new URL( uri );\n\t\tif ( /^http/.test( uri.protocol ) ) {\n\n\t\t\turi.searchParams.append( 'key', this.apiToken );\n\t\t\tif ( this.sessionToken !== null ) {\n\n\t\t\t\turi.searchParams.append( 'session', this.sessionToken );\n\n\t\t\t}\n\n\t\t}\n\t\treturn uri.toString();\n\n\t}\n\n\tdispose() {\n\n\t\tconst { tiles } = this;\n\t\ttiles.removeEventListener( 'load-tile-set', this._onLoadCallback );\n\t\ttiles.removeEventListener( 'tile-visibility-change', this._visibilityChangeCallback );\n\n\t}\n\n\tasync fetchData( uri, options ) {\n\n\t\t// wait for the token to refresh if loading\n\t\tif ( this._tokenRefreshPromise !== null ) {\n\n\t\t\tawait this._tokenRefreshPromise;\n\t\t\turi = this.preprocessURL( uri );\n\n\t\t}\n\n\t\tconst res = await fetch( uri, options );\n\t\tif ( res.status >= 400 && res.status <= 499 && this.autoRefreshToken ) {\n\n\t\t\tawait this._refreshToken( options );\n\t\t\treturn fetch( this.preprocessURL( uri ), options );\n\n\t\t} else {\n\n\t\t\treturn res;\n\n\t\t}\n\n\t}\n\n\t_refreshToken( options ) {\n\n\t\tif ( this._tokenRefreshPromise === null ) {\n\n\t\t\t// refetch the root if the token has expired\n\t\t\tconst rootURL = new URL( this.tiles.rootURL );\n\t\t\trootURL.searchParams.append( 'key', this.apiToken );\n\t\t\tthis._tokenRefreshPromise = fetch( rootURL, options )\n\t\t\t\t.then( res => res.json() )\n\t\t\t\t.then( res => {\n\n\t\t\t\t\tthis.sessionToken = getSessionToken( res.root );\n\t\t\t\t\tthis._tokenRefreshPromise = null;\n\n\t\t\t\t} );\n\n\t\t\t// dispatch an error if we fail to refresh the token\n\t\t\tthis._tokenRefreshPromise\n\t\t\t\t.catch( error => {\n\n\t\t\t\t\tthis.tiles.dispatchEvent( {\n\t\t\t\t\t\ttype: 'load-error',\n\t\t\t\t\t\ttile: null,\n\t\t\t\t\t\terror,\n\t\t\t\t\t\trootURL,\n\t\t\t\t\t} );\n\n\t\t\t\t} );\n\n\n\t\t}\n\n\t\treturn this._tokenRefreshPromise;\n\n\t}\n\n}\n","import { MathUtils, Mesh, MeshBasicMaterial, PlaneGeometry, SRGBColorSpace, Texture } from 'three';\nimport { PriorityQueue } from '../../../utilities/PriorityQueue.js';\n\nexport const TILE_X = Symbol( 'TILE_X' );\nexport const TILE_Y = Symbol( 'TILE_Y' );\nexport const TILE_LEVEL = Symbol( 'TILE_LEVEL' );\nexport const UV_BOUNDS = Symbol( 'UV_BOUNDS' );\n\n// Base class for supporting tiled images with a consistent size / resolution per tile\nexport class ImageFormatPlugin {\n\n\tget maxLevel() {\n\n\t\treturn this.levels - 1;\n\n\t}\n\n\tconstructor( options = {} ) {\n\n\t\tconst {\n\t\t\tpixelSize = 0.01,\n\t\t\tcenter = false,\n\t\t\tuseRecommendedSettings = true,\n\t\t} = options;\n\n\t\tthis.priority = - 10;\n\t\tthis.tiles = null;\n\t\tthis.processQueue = null;\n\t\tthis.processCallback = null;\n\n\t\t// tile dimensions in pixels\n\t\tthis.tileWidth = null;\n\t\tthis.tileHeight = null;\n\n\t\t// full image dimensions in pixels\n\t\tthis.width = null;\n\t\tthis.height = null;\n\t\tthis.levels = null;\n\n\t\t// amount of pixel overlap between tiles\n\t\tthis.overlap = 0;\n\t\tthis.pixelSize = pixelSize;\n\t\tthis.center = center;\n\t\tthis.useRecommendedSettings = useRecommendedSettings;\n\t\tthis.flipY = false;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n\tinit( tiles ) {\n\n\t\tconst processQueue = new PriorityQueue();\n\t\tprocessQueue.priorityCallback = tiles.downloadQueue.priorityCallback;\n\t\tprocessQueue.maxJobs = 20;\n\n\t\tif ( this.useRecommendedSettings ) {\n\n\t\t\ttiles.errorTarget = 1;\n\t\t\t// TODO: apply skip traversal settings here once supported, as well, for faster loading\n\n\t\t}\n\n\t\tthis.processCallback = tile => {\n\n\t\t\tconst level = tile[ TILE_LEVEL ];\n\t\t\tconst x = tile[ TILE_X ];\n\t\t\tconst y = tile[ TILE_Y ];\n\t\t\tfor ( let cx = 0; cx < 2; cx ++ ) {\n\n\t\t\t\tfor ( let cy = 0; cy < 2; cy ++ ) {\n\n\t\t\t\t\tconst child = this.expand( level + 1, 2 * x + cx, 2 * y + cy );\n\t\t\t\t\tif ( child ) {\n\n\t\t\t\t\t\ttile.children.push( child );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t\treturn Promise.resolve();\n\n\t\t};\n\n\t\tthis.processQueue = processQueue;\n\t\tthis.tiles = tiles;\n\n\t}\n\n\tasync parseToMesh( buffer, tile, extension, uri, abortSignal ) {\n\n\t\t// Construct texture\n\t\tconst blob = new Blob( [ buffer ] );\n\t\tconst imageBitmap = await createImageBitmap( blob, {\n\t\t\tpremultiplyAlpha: 'none',\n\t\t\tcolorSpaceConversion: 'none',\n\t\t\timageOrientation: 'flipY',\n\t\t} );\n\t\tconst texture = new Texture( imageBitmap );\n\t\ttexture.generateMipmaps = false;\n\t\ttexture.colorSpace = SRGBColorSpace;\n\t\ttexture.needsUpdate = true;\n\n\t\t// Construct mesh\n\t\tlet sx = 1, sy = 1;\n\t\tlet x = 0, y = 0, z = 0;\n\n\t\tconst boundingBox = tile.boundingVolume.box;\n\t\tif ( boundingBox ) {\n\n\t\t\t[ x, y, z ] = boundingBox;\n\t\t\tsx = boundingBox[ 3 ];\n\t\t\tsy = boundingBox[ 7 ];\n\n\t\t}\n\n\t\t// adjust the geometry transform itself rather than the mesh because it reduces the artifact errors\n\t\t// when using batched mesh rendering.\n\t\tconst mesh = new Mesh( new PlaneGeometry( 2 * sx, 2 * sy ), new MeshBasicMaterial( { map: texture } ) );\n\t\tmesh.position.set( x, y, z );\n\n\t\treturn mesh;\n\n\t}\n\n\tpreprocessNode( tile, dir, parentTile ) {\n\n\t\t// generate children\n\t\tconst { maxLevel } = this;\n\t\tconst level = tile[ TILE_LEVEL ];\n\t\tif ( level < maxLevel ) {\n\n\t\t\t// marking the tiles as needing an update here prevents cases where we need to process children but there's a frame delay\n\t\t\t// meaning we may miss our chance on the next loop to perform an update if the \"UpdateOnChange\" plugin is being used.\n\t\t\tthis.processQueue.add( tile, this.processCallback );\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tgetTileset( baseUrl ) {\n\n\t\tconst tileset = {\n\t\t\tasset: {\n\t\t\t\tversion: '1.1'\n\t\t\t},\n\t\t\tgeometricError: 1e5,\n\t\t\troot: {\n\t\t\t\trefine: 'REPLACE',\n\t\t\t\tgeometricError: 1e5,\n\t\t\t\tboundingVolume: {},\n\t\t\t\tchildren: [],\n\t\t\t}\n\t\t};\n\n\t\tconst { maxLevel, width, height, tileWidth, tileHeight, center, pixelSize } = this;\n\t\tconst levelFactor = 2 ** - maxLevel;\n\t\tconst tilesX = Math.ceil( levelFactor * width / tileWidth );\n\t\tconst tilesY = Math.ceil( levelFactor * height / tileHeight );\n\n\t\t// generate all children for the root\n\t\tfor ( let x = 0; x < tilesX; x ++ ) {\n\n\t\t\tfor ( let y = 0; y < tilesY; y ++ ) {\n\n\t\t\t\ttileset.root.children.push( this.expand( 0, x, y ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// construct the full bounding box\n\t\tconst minX = center ? - width / 2 : 0;\n\t\tconst minY = center ? - height / 2 : 0;\n\t\ttileset.root.boundingVolume.box = [\n\t\t\tpixelSize * ( minX + width / 2 ), pixelSize * ( minY + height / 2 ), 0,\n\t\t\tpixelSize * width / 2, 0, 0,\n\t\t\t0, pixelSize * height / 2, 0,\n\t\t\t0, 0, 0,\n\t\t];\n\n\t\ttileset.root[ UV_BOUNDS ] = [ 0, 0, 1, 1 ];\n\n\t\tthis.tiles.preprocessTileSet( tileset, baseUrl );\n\t\treturn tileset;\n\n\t}\n\n\tgetUrl( level, x, y ) {\n\n\t\t// override\n\n\t}\n\n\texpand( level, x, y ) {\n\n\t\tconst { maxLevel, width, height, overlap, pixelSize, center, tileWidth, tileHeight, flipY } = this;\n\n\t\t// offset for the image so it's center\n\t\tconst offsetX = center ? pixelSize * - width / 2 : 0;\n\t\tconst offsetY = center ? pixelSize * - height / 2 : 0;\n\n\t\tconst levelFactor = 2 ** - ( maxLevel - level );\n\t\tconst levelWidth = Math.ceil( width * levelFactor );\n\t\tconst levelHeight = Math.ceil( height * levelFactor );\n\n\t\tlet tileX = tileWidth * x - overlap;\n\t\tlet tileY = tileHeight * y - overlap;\n\t\tlet tileWidthOverlap = tileWidth + overlap * 2;\n\t\tlet tileHeightOverlap = tileHeight + overlap * 2;\n\n\t\t// adjust the starting position of the tile to the edge of the image\n\t\tif ( tileX < 0 ) {\n\n\t\t\ttileWidthOverlap += tileX;\n\t\t\ttileX = 0;\n\n\t\t}\n\n\t\tif ( tileY < 0 ) {\n\n\t\t\ttileHeightOverlap += tileY;\n\t\t\ttileY = 0;\n\n\t\t}\n\n\t\t// clamp the dimensions to the edge of the image\n\t\tif ( tileX + tileWidthOverlap > levelWidth ) {\n\n\t\t\ttileWidthOverlap -= tileX + tileWidthOverlap - levelWidth;\n\n\t\t}\n\n\t\tif ( tileY + tileHeightOverlap > levelHeight ) {\n\n\t\t\ttileHeightOverlap -= tileY + tileHeightOverlap - levelHeight;\n\n\t\t}\n\n\t\t// If this section doesn't cover an image then discard it\n\t\tif ( tileHeightOverlap <= 0 || tileWidthOverlap <= 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// the center of the tile\n\t\tconst centerX = tileX + tileWidthOverlap / 2;\n\t\tlet centerY = tileY + tileHeightOverlap / 2;\n\t\tif ( flipY ) {\n\n\t\t\tcenterY = levelHeight - centerY;\n\n\t\t}\n\n\t\t// the pixel ratio of the image\n\t\tconst ratioX = width / levelWidth;\n\t\tconst ratioY = height / levelHeight;\n\n\t\tconst boxX = ratioX * pixelSize * centerX;\n\t\tconst boxY = ratioY * pixelSize * centerY;\n\t\tconst extentsX = ratioX * pixelSize * tileWidthOverlap / 2;\n\t\tconst extentsY = ratioY * pixelSize * tileHeightOverlap / 2;\n\n\t\t// Generate the node\n\t\treturn {\n\t\t\trefine: 'REPLACE',\n\t\t\tgeometricError: pixelSize * ( Math.max( width / levelWidth, height / levelHeight ) - 1 ),\n\t\t\tboundingVolume: {\n\t\t\t\t// DZI operates in a left handed coordinate system so we have to flip y to orient it correctly. FlipY\n\t\t\t\t// is also enabled on the image bitmap texture generation above.\n\t\t\t\tbox: [\n\t\t\t\t\t// center\n\t\t\t\t\tboxX + offsetX, boxY + offsetY, 0,\n\n\t\t\t\t\t// x, y, z half vectors\n\t\t\t\t\textentsX, 0.0, 0.0,\n\t\t\t\t\t0.0, extentsY, 0.0,\n\t\t\t\t\t0.0, 0.0, 0.0,\n\t\t\t\t],\n\t\t\t},\n\t\t\tcontent: {\n\t\t\t\turi: this.getUrl( level, x, y ),\n\t\t\t},\n\t\t\tchildren: [],\n\n\t\t\t// save the tile params so we can expand later\n\t\t\t[ TILE_X ]: x,\n\t\t\t[ TILE_Y ]: y,\n\t\t\t[ TILE_LEVEL ]: level,\n\t\t\t[ UV_BOUNDS ]: [\n\t\t\t\tMathUtils.mapLinear( boxX - extentsX, 0, pixelSize * width, 0, 1 ),\n\t\t\t\tMathUtils.mapLinear( boxY - extentsY, 0, pixelSize * height, 0, 1 ),\n\t\t\t\tMathUtils.mapLinear( boxX + extentsX, 0, pixelSize * width, 0, 1 ),\n\t\t\t\tMathUtils.mapLinear( boxY + extentsY, 0, pixelSize * height, 0, 1 ),\n\t\t\t],\n\t\t};\n\n\t}\n\n\tdoTilesNeedUpdate() {\n\n\t\tif ( this.needsUpdate ) {\n\n\t\t\tthis.needsUpdate = false;\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n}\n","import { ImageFormatPlugin, UV_BOUNDS } from './ImageFormatPlugin.js';\nimport { MathUtils, PlaneGeometry, Sphere, Vector2, Vector3 } from 'three';\n\nconst _pos = /* @__PURE__ */ new Vector3();\nconst _norm = /* @__PURE__ */ new Vector3();\nconst _uv = /* @__PURE__ */ new Vector2();\nconst _sphere = /* @__PURE__ */ new Sphere();\nconst _v0 = /* @__PURE__ */ new Vector3();\nconst _v1 = /* @__PURE__ */ new Vector3();\n\nexport class EllipsoidProjectionTilesPlugin extends ImageFormatPlugin {\n\n\tconstructor( options = {} ) {\n\n\t\tconst {\n\t\t\tshape = 'planar',\n\t\t\tendCaps = true,\n\t\t\t...rest\n\t\t} = options;\n\n\t\tsuper( rest );\n\n\t\tthis.shape = shape;\n\t\tthis.projection = 'geodetic';\n\t\tthis.endCaps = endCaps;\n\n\t\t// TODO: are these necessary?\n\t\tthis.minLat = - Math.PI / 2;\n\t\tthis.maxLat = Math.PI / 2;\n\t\tthis.minLon = - Math.PI;\n\t\tthis.maxLon = Math.PI;\n\n\t}\n\n\t// override the parse to mesh logic to support a region mesh\n\tasync parseToMesh( buffer, tile, ...args ) {\n\n\t\tconst { shape, projection, tiles } = this;\n\t\tconst mesh = await super.parseToMesh( buffer, tile, ...args );\n\n\t\t// if displaying the tiles as an ellipsoid\n\t\tif ( shape === 'ellipsoid' ) {\n\n\t\t\tconst ellipsoid = tiles.ellipsoid;\n\t\t\tconst [ minU, minV, maxU, maxV ] = tile[ UV_BOUNDS ];\n\t\t\tconst [ west, south, east, north ] = tile.boundingVolume.region;\n\n\t\t\t// new geometry\n\t\t\t// default to a minimum number of vertices per degree on each axis\n\t\t\tconst MAX_LON_VERTS = 30;\n\t\t\tconst MAX_LAT_VERTS = 15;\n\t\t\tconst latVerts = Math.ceil( ( north - south ) * MathUtils.RAD2DEG * 0.25 );\n\t\t\tconst lonVerts = Math.ceil( ( east - west ) * MathUtils.RAD2DEG * 0.25 );\n\t\t\tconst yVerts = Math.max( MAX_LAT_VERTS, latVerts );\n\t\t\tconst xVerts = Math.max( MAX_LON_VERTS, lonVerts );\n\t\t\tconst geometry = new PlaneGeometry(\n\t\t\t\t1, 1,\n\t\t\t\txVerts,\n\t\t\t\tyVerts,\n\t\t\t);\n\n\t\t\t// adjust the geometry to position it at the region\n\t\t\tconst { position, normal, uv } = geometry.attributes;\n\t\t\tconst vertCount = position.count;\n\t\t\ttile.cached.boundingVolume.getSphere( _sphere );\n\t\t\tfor ( let i = 0; i < vertCount; i ++ ) {\n\n\t\t\t\t// TODO: If we're at a mercator north / south boundary we should position an edge so that\n\t\t\t\t// it sits exactly at the right point.\n\t\t\t\t_pos.fromBufferAttribute( position, i );\n\t\t\t\t_norm.fromBufferAttribute( normal, i );\n\t\t\t\t_uv.fromBufferAttribute( uv, i );\n\n\t\t\t\tconst lon = MathUtils.mapLinear( _uv.x, 0, 1, west, east );\n\t\t\t\tlet lat = MathUtils.mapLinear( _uv.y, 0, 1, south, north );\n\t\t\t\tif ( projection === 'mercator' && _uv.y !== 0 && _uv.y !== 1 ) {\n\n\t\t\t\t\t// ensure we have an edge loop positioned at the mercator limit\n\t\t\t\t\t// to avoid UV distortion as much as possible at low LoDs\n\t\t\t\t\tconst latLimit = this.mercatorToLatitude( 1 );\n\t\t\t\t\tconst vStep = 1 / yVerts;\n\n\t\t\t\t\tconst prevLat = MathUtils.mapLinear( _uv.y - vStep, 0, 1, south, north );\n\t\t\t\t\tconst nextLat = MathUtils.mapLinear( _uv.y + vStep, 0, 1, south, north );\n\n\t\t\t\t\tif ( lat > latLimit && prevLat < latLimit ) {\n\n\t\t\t\t\t\tlat = latLimit;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( lat < - latLimit && nextLat > - latLimit ) {\n\n\t\t\t\t\t\tlat = - latLimit;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tellipsoid.getCartographicToPosition( lat, lon, 0, _pos ).sub( _sphere.center );\n\t\t\t\tellipsoid.getCartographicToNormal( lat, lon, _norm );\n\n\t\t\t\tposition.setXYZ( i, ..._pos );\n\t\t\t\tnormal.setXYZ( i, ..._norm );\n\n\t\t\t\tif ( projection === 'mercator' ) {\n\n\t\t\t\t\tconst u = MathUtils.mapLinear( this.longitudeToMercator( lon ), minU, maxU, 0, 1 );\n\t\t\t\t\tconst v = MathUtils.mapLinear( this.latitudeToMercator( lat ), minV, maxV, 0, 1 );\n\t\t\t\t\tuv.setXY( i, u, v );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tmesh.geometry = geometry;\n\t\t\tmesh.position.copy( _sphere.center );\n\n\t\t}\n\n\t\treturn mesh;\n\n\t}\n\n\tpreprocessNode( tile, ...rest ) {\n\n\t\tsuper.preprocessNode( tile, rest );\n\n\t\tconst { shape, projection, tileWidth, tileHeight, width, height, endCaps } = this;\n\t\tif ( shape === 'ellipsoid' ) {\n\n\t\t\tconst [ minU, minV, maxU, maxV ] = tile[ UV_BOUNDS ];\n\n\t\t\t// one pixel width in uv space\n\t\t\tconst tileUWidth = ( maxU - minU ) / tileWidth;\n\t\t\tconst tileVWidth = ( maxV - minV ) / tileHeight;\n\t\t\tconst rootUWidth = 1 / width;\n\t\t\tconst rootVWidth = 1 / height;\n\n\t\t\t// calculate the region ranges\n\t\t\tlet south, north, west, east;\n\t\t\tif ( projection === 'mercator' ) {\n\n\t\t\t\tsouth = this.mercatorToLatitude( minV );\n\t\t\t\tnorth = this.mercatorToLatitude( maxV );\n\t\t\t\twest = this.mercatorToLongitude( minU );\n\t\t\t\teast = this.mercatorToLongitude( maxU );\n\n\t\t\t\t// TODO: need to make sure this is actually at the edge of the full mercator\n\t\t\t\t// extent rather than a sub view.\n\t\t\t\tif ( endCaps ) {\n\n\t\t\t\t\tif ( maxV === 1 ) {\n\n\t\t\t\t\t\tnorth = Math.PI / 2;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( minV === 0 ) {\n\n\t\t\t\t\t\tsouth = - Math.PI / 2;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst { minLat, maxLat, minLon, maxLon } = this;\n\t\t\t\tsouth = MathUtils.lerp( minLat, maxLat, minV );\n\t\t\t\tnorth = MathUtils.lerp( minLat, maxLat, maxV );\n\t\t\t\twest = MathUtils.lerp( minLon, maxLon, minU );\n\t\t\t\teast = MathUtils.lerp( minLon, maxLon, maxU );\n\n\t\t\t}\n\n\t\t\ttile.boundingVolume.region = [\n\t\t\t\twest, south, east, north,\n\t\t\t\t- 1, 1 // min / max height\n\t\t\t];\n\n\t\t\t// calculate the changes in lat / lon at the given point\n\t\t\tconst midLat = ( south > 0 ) !== ( north > 0 ) ? 0 : Math.min( Math.abs( south ), Math.abs( north ) );\n\t\t\tlet latFactor, lonFactor;\n\t\t\tif ( projection === 'mercator' ) {\n\n\t\t\t\tconst mercatorY = this.latitudeToMercator( midLat );\n\t\t\t\t[ latFactor, lonFactor ] = this.getMercatorToCartographicDerivative( minU, mercatorY );\n\n\t\t\t} else {\n\n\t\t\t\tlatFactor = Math.PI;\n\t\t\t\tlonFactor = 2 * Math.PI;\n\n\t\t\t}\n\n\t\t\t// TODO: is this correct?\n\n\t\t\t// calculate the size of a pixel on the surface\n\t\t\tconst [ xDeriv, yDeriv ] = this.getCartographicToMeterDerivative( midLat, east );\n\t\t\tconst tilePixelWidth = Math.max( tileUWidth * lonFactor * xDeriv, tileVWidth * latFactor * yDeriv );\n\t\t\tconst rootPixelWidth = Math.max( rootUWidth * lonFactor * xDeriv, rootVWidth * latFactor * yDeriv );\n\t\t\ttile.geometricError = tilePixelWidth - rootPixelWidth;\n\n\t\t\tdelete tile.boundingVolume.box;\n\n\t\t\t// if this is the root then keep the geometric error high\n\t\t\tif ( tile.parent === null ) {\n\n\t\t\t\ttile.geometricError = 1e50;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn tile;\n\n\t}\n\n\tlatitudeToMercator( lat ) {\n\n\t\t// https://stackoverflow.com/questions/14329691/convert-latitude-longitude-point-to-a-pixels-x-y-on-mercator-projection\n\t\tconst mercatorN = Math.log( Math.tan( ( Math.PI / 4 ) + ( lat / 2 ) ) );\n\t\treturn ( 1 / 2 ) + ( 1 * mercatorN / ( 2 * Math.PI ) );\n\n\t}\n\n\tlongitudeToMercator( lon ) {\n\n\t\treturn ( lon + Math.PI ) / ( 2 * Math.PI );\n\n\t}\n\n\tmercatorToLatitude( value ) {\n\n\t\t// https://gis.stackexchange.com/questions/447421/convert-a-point-on-a-flat-2d-web-mercator-map-image-to-a-coordinate\n\t\t// TODO: support partial lat ranges here\n\t\t// const { minLat, maxLat } = this;\n\t\tconst ratio = MathUtils.mapLinear( value, 0, 1, - 1, 1 );\n\t\treturn 2 * Math.atan( Math.exp( ratio * Math.PI ) ) - Math.PI / 2;\n\n\t}\n\n\tmercatorToLongitude( value ) {\n\n\t\tconst { minLon, maxLon } = this;\n\t\treturn MathUtils.mapLinear( value, 0, 1, minLon, maxLon );\n\n\t}\n\n\tgetMercatorToCartographicDerivative( x, y ) {\n\n\t\tconst EPS = 1e-5;\n\t\tlet xp = x - EPS;\n\t\tlet yp = y - EPS;\n\t\tif ( xp < 0 ) {\n\n\t\t\txp = x + EPS;\n\n\t\t}\n\n\t\tif ( yp < 0 ) {\n\n\t\t\typ = y + EPS;\n\n\t\t}\n\n\t\treturn [\n\t\t\tMath.abs( this.mercatorToLatitude( y ) - this.mercatorToLatitude( yp ) ) / EPS,\n\t\t\tMath.abs( this.mercatorToLongitude( x ) - this.mercatorToLongitude( xp ) ) / EPS,\n\t\t];\n\n\t}\n\n\tgetCartographicToMeterDerivative( lat, lon ) {\n\n\t\tconst { tiles } = this;\n\t\tconst { ellipsoid } = tiles;\n\n\t\tconst EPS = 1e-5;\n\t\tconst lonp = lon + EPS;\n\t\tlet latp = lat + EPS;\n\t\tif ( Math.abs( latp ) > Math.PI / 2 ) {\n\n\t\t\tlatp = latp - EPS;\n\n\t\t}\n\n\t\tellipsoid.getCartographicToPosition( lat, lon, 0, _v0 );\n\n\t\tellipsoid.getCartographicToPosition( latp, lon, 0, _v1 );\n\t\tconst dy = _v0.distanceTo( _v1 ) / EPS;\n\n\t\tellipsoid.getCartographicToPosition( lat, lonp, 0, _v1 );\n\t\tconst dx = _v0.distanceTo( _v1 ) / EPS;\n\n\t\treturn [ dx, dy ];\n\n\t}\n\n}\n\n","\n// Support for XYZ / Slippy tile systems\n\nimport { EllipsoidProjectionTilesPlugin } from './EllipsoidProjectionTilesPlugin.js';\n\n// https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames\nexport class XYZTilesPlugin extends EllipsoidProjectionTilesPlugin {\n\n\tconstructor( options = {} ) {\n\n\t\tconst {\n\t\t\tlevels = 20,\n\t\t\ttileDimension = 256,\n\t\t\tpixelSize = 1e-5,\n\t\t\t...rest\n\t\t} = options;\n\n\t\tsuper( { pixelSize, ...rest } );\n\n\t\tthis.name = 'XYZ_TILES_PLUGIN';\n\t\tthis.tileWidth = tileDimension;\n\t\tthis.tileHeight = tileDimension;\n\t\tthis.levels = levels;\n\t\tthis.url = null;\n\t\tthis.flipY = true;\n\n\t}\n\n\tasync loadRootTileSet() {\n\n\t\t// transform the url\n\t\tconst { tiles, tileWidth, tileHeight, maxLevel } = this;\n\t\tlet url = tiles.rootURL;\n\t\ttiles.invokeAllPlugins( plugin => url = plugin.preprocessURL ? plugin.preprocessURL( url, null ) : url );\n\n\t\tthis.width = tileWidth * ( 2 ** maxLevel );\n\t\tthis.height = tileHeight * ( 2 ** maxLevel );\n\t\tthis.url = url;\n\t\tthis.projection = 'mercator';\n\n\t\treturn this.getTileset( url );\n\n\t}\n\n\tgetUrl( level, x, y ) {\n\n\t\treturn this.url.replace( '{z}', level ).replace( '{x}', x ).replace( '{y}', y );\n\n\t}\n\n}\n\n// Support for TMS tiles\n// https://wiki.osgeo.org/wiki/Tile_Map_Service_Specification\nexport class TMSTilesPlugin extends EllipsoidProjectionTilesPlugin {\n\n\tconstructor( ...args ) {\n\n\t\tsuper( ...args );\n\n\t\tthis.name = 'TMS_TILES_PLUGIN';\n\t\tthis.flipY = false;\n\t\tthis.url = null;\n\t\tthis.extension = null;\n\n\t}\n\n\tloadRootTileSet() {\n\n\t\tconst url = new URL( 'tilemapresource.xml', this.tiles.rootURL ).toString();\n\t\treturn this.tiles\n\t\t\t.invokeOnePlugin( plugin => plugin.fetchData && plugin.fetchData( url, this.tiles.fetchOptions ) )\n\t\t\t.then( res => res.text() )\n\t\t\t.then( text => {\n\n\t\t\t\tconst xml = new DOMParser().parseFromString( text, 'text/xml' );\n\t\t\t\t// const boundingBox = xml.querySelector( 'BoundingBox' );\n\t\t\t\t// const origin = xml.querySelector( 'Origin' );\n\t\t\t\tconst tileFormat = xml.querySelector( 'TileFormat' );\n\t\t\t\tconst tileSets = xml.querySelector( 'TileSets' );\n\t\t\t\tconst tileSetList = [ ...tileSets.querySelectorAll( 'TileSet' ) ]\n\t\t\t\t\t.map( ts => ( {\n\t\t\t\t\t\thref: parseInt( ts.getAttribute( 'href' ) ),\n\t\t\t\t\t\tunitsPerPixel: parseFloat( ts.getAttribute( 'units-per-pixel' ) ),\n\t\t\t\t\t\torder: parseInt( ts.getAttribute( 'order' ) ),\n\t\t\t\t\t} ) )\n\t\t\t\t\t.sort( ( a, b ) => {\n\n\t\t\t\t\t\treturn a.order - b.order;\n\n\t\t\t\t\t} );\n\n\t\t\t\t// TODO: need to account for these values (origin and min values) when generating ellipsoid\n\t\t\t\t// TODO: might want to account for this offset when positioning the tiles? Or expose it? Could be\n\t\t\t\t// used for overlays.\n\t\t\t\t// TODO: the origin can be outside the box bounds and result in negative values for tiles. The tile coordinates\n\t\t\t\t// may need to account for this origin positioning - ie they may not start at 0, 0?\n\t\t\t\t// the extents of the tile set in lat / lon\n\t\t\t\t// const minX = parseFloat( boundingBox.getAttribute( 'minx' ) );\n\t\t\t\t// const maxX = parseFloat( boundingBox.getAttribute( 'maxx' ) );\n\t\t\t\t// const minY = parseFloat( boundingBox.getAttribute( 'miny' ) );\n\t\t\t\t// const maxY = parseFloat( boundingBox.getAttribute( 'maxy' ) );\n\n\t\t\t\t// origin in lat / lon\n\t\t\t\t// const x = parseFloat( origin.getAttribute( 'x' ) );\n\t\t\t\t// const y = parseFloat( origin.getAttribute( 'y' ) );\n\n\t\t\t\t// image dimensions in pixels\n\t\t\t\tconst tileWidth = parseInt( tileFormat.getAttribute( 'width' ) );\n\t\t\t\tconst tileHeight = parseInt( tileFormat.getAttribute( 'height' ) );\n\t\t\t\tconst extension = tileFormat.getAttribute( 'extension' );\n\n\t\t\t\tconst profile = tileSets.getAttribute( 'profile' );\n\t\t\t\tconst srs = xml.querySelector( 'SRS' ).textContent;\n\n\t\t\t\tswitch ( srs ) {\n\n\t\t\t\t\tcase 'EPSG:3857': // web-mercator spherical projection\n\t\t\t\t\tcase 'EPSG:4326': // equirect projection\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new Error( `TMSTilesPlugin: ${ srs } SRS not supported.` );\n\n\t\t\t\t}\n\n\t\t\t\t// TODO: global-geodetic seems to require two horizontal root tiles. Is hardcoding the right way?\n\t\t\t\tlet widthMultiplier = 1;\n\t\t\t\tlet heightMultiplier = 1;\n\t\t\t\tswitch ( profile ) {\n\n\t\t\t\t\tcase 'geodetic':\n\t\t\t\t\tcase 'global-geodetic':\n\t\t\t\t\t\twidthMultiplier = 2;\n\t\t\t\t\t\theightMultiplier = 1;\n\t\t\t\t\t\tthis.projection = 'geodetic';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mercator':\n\t\t\t\t\tcase 'global-mercator':\n\t\t\t\t\t\tthis.projection = 'mercator';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'local':\n\t\t\t\t\tcase 'none':\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new Error( `TMSTilesPlugin: Profile ${ profile } not supported.` );\n\n\t\t\t\t}\n\n\t\t\t\tconst levels = tileSetList.length;\n\t\t\t\tconst maxLevel = levels - 1;\n\t\t\t\tthis.extension = extension;\n\t\t\t\tthis.width = widthMultiplier * tileWidth * ( 2 ** maxLevel );\n\t\t\t\tthis.height = heightMultiplier * tileHeight * ( 2 ** maxLevel );\n\t\t\t\tthis.tileWidth = tileWidth;\n\t\t\t\tthis.tileHeight = tileHeight;\n\t\t\t\tthis.levels = levels;\n\t\t\t\tthis.url = this.tiles.rootURL;\n\t\t\t\tthis.tileSets = tileSetList;\n\n\t\t\t\t// ellipsoid projection data\n\t\t\t\t// this.minLat = minY;\n\t\t\t\t// this.maxLat = maxY;\n\t\t\t\t// this.minLon = minX;\n\t\t\t\t// this.maxLon = maxX;\n\n\t\t\t\treturn this.getTileset( url );\n\n\t\t\t} );\n\n\t}\n\n\tgetUrl( level, x, y ) {\n\n\t\tconst { url, extension, tileSets } = this;\n\t\treturn new URL( `${ parseInt( tileSets[ level ].href ) }/${ x }/${ y }.${ extension }`, url ).toString();\n\n\t}\n\n}\n","import { LoaderBase } from '../../../base/loaders/LoaderBase.js';\n\nexport function zigZagDecode( value ) {\n\n\treturn ( value >> 1 ) ^ ( - ( value & 1 ) );\n\n}\n\nexport class QuantizedMeshLoaderBase extends LoaderBase {\n\n\tconstructor( ...args ) {\n\n\t\tsuper( ...args );\n\n\t\tthis.fetchOptions.header = {\n\t\t\tAccept: 'application/vnd.quantized-mesh,application/octet-stream;q=0.9',\n\t\t};\n\n\t}\n\n\tloadAsync( ...args ) {\n\n\t\tconst { fetchOptions } = this;\n\t\tfetchOptions.header = fetchOptions.header || {};\n\t\tfetchOptions.header[ 'Accept' ] = 'application/vnd.quantized-mesh,application/octet-stream;q=0.9';\n\t\tfetchOptions.header[ 'Accept' ] += ';extensions=octvertexnormals-watermask-metadata';\n\n\t\treturn super.loadAsync( ...args );\n\n\t}\n\n\tparse( buffer ) {\n\n\t\tlet pointer = 0;\n\t\tconst view = new DataView( buffer );\n\t\tconst readFloat64 = () => {\n\n\t\t\tconst result = view.getFloat64( pointer, true );\n\t\t\tpointer += 8;\n\t\t\treturn result;\n\n\t\t};\n\n\t\tconst readFloat32 = () => {\n\n\t\t\tconst result = view.getFloat32( pointer, true );\n\t\t\tpointer += 4;\n\t\t\treturn result;\n\n\t\t};\n\n\t\tconst readInt = () => {\n\n\t\t\tconst result = view.getUint32( pointer, true );\n\t\t\tpointer += 4;\n\t\t\treturn result;\n\n\t\t};\n\n\t\tconst readByte = () => {\n\n\t\t\tconst result = view.getUint8( pointer );\n\t\t\tpointer += 1;\n\t\t\treturn result;\n\n\t\t};\n\n\t\tconst readBuffer = ( count, type ) => {\n\n\t\t\tconst result = new type( buffer, pointer, count );\n\t\t\tpointer += count * type.BYTES_PER_ELEMENT;\n\t\t\treturn result;\n\n\t\t};\n\n\t\t// extract header\n\t\tconst header = {\n\t\t\tcenter: [ readFloat64(), readFloat64(), readFloat64() ],\n\t\t\tminHeight: readFloat32(),\n\t\t\tmaxHeight: readFloat32(),\n\t\t\tsphereCenter: [ readFloat64(), readFloat64(), readFloat64() ],\n\t\t\tsphereRadius: readFloat64(),\n\t\t\thorizonOcclusionPoint: [ readFloat64(), readFloat64(), readFloat64() ],\n\t\t};\n\n\t\t// extract vertex data\n\t\tconst vertexCount = readInt();\n\t\tconst uBuffer = readBuffer( vertexCount, Uint16Array );\n\t\tconst vBuffer = readBuffer( vertexCount, Uint16Array );\n\t\tconst hBuffer = readBuffer( vertexCount, Uint16Array );\n\n\t\tconst uResult = new Float32Array( vertexCount );\n\t\tconst vResult = new Float32Array( vertexCount );\n\t\tconst hResult = new Float32Array( vertexCount );\n\n\t\t// decode vertex data\n\t\tlet u = 0;\n\t\tlet v = 0;\n\t\tlet h = 0;\n\t\tconst MAX_VALUE = 32767;\n\t\tfor ( let i = 0; i < vertexCount; ++ i ) {\n\n\t\t\tu += zigZagDecode( uBuffer[ i ] );\n\t\t\tv += zigZagDecode( vBuffer[ i ] );\n\t\t\th += zigZagDecode( hBuffer[ i ] );\n\n\t\t\tuResult[ i ] = u / MAX_VALUE;\n\t\t\tvResult[ i ] = v / MAX_VALUE;\n\t\t\thResult[ i ] = h / MAX_VALUE;\n\n\t\t}\n\n\t\t// align pointer for index data\n\t\tconst is32 = vertexCount > 65536;\n\t\tconst bufferType = is32 ? Uint32Array : Uint16Array;\n\t\tif ( is32 ) {\n\n\t\t\tpointer = Math.ceil( pointer / 4 ) * 4;\n\n\t\t} else {\n\n\t\t\tpointer = Math.ceil( pointer / 2 ) * 2;\n\n\t\t}\n\n\t\t// extract index data\n\t\tconst triangleCount = readInt();\n\t\tconst indices = readBuffer( triangleCount * 3, bufferType );\n\n\t\t// decode the index data\n\t\tlet highest = 0;\n\t\tfor ( var i = 0; i < indices.length; ++ i ) {\n\n\t\t\tconst code = indices[ i ];\n\t\t\tindices[ i ] = highest - code;\n\t\t\tif ( code === 0 ) {\n\n\t\t\t\t++ highest;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// sort functions for the edges since they are not pre-sorted\n\t\tconst vSort = ( a, b ) => vResult[ b ] - vResult[ a ];\n\t\tconst vSortReverse = ( a, b ) => - vSort( a, b );\n\n\t\tconst uSort = ( a, b ) => uResult[ a ] - uResult[ b ];\n\t\tconst uSortReverse = ( a, b ) => - uSort( a, b );\n\n\t\t// get edge indices\n\t\tconst westVertexCount = readInt();\n\t\tconst westIndices = readBuffer( westVertexCount, bufferType );\n\t\twestIndices.sort( vSort );\n\n\t\tconst southVertexCount = readInt();\n\t\tconst southIndices = readBuffer( southVertexCount, bufferType );\n\t\tsouthIndices.sort( uSort );\n\n\t\tconst eastVertexCount = readInt();\n\t\tconst eastIndices = readBuffer( eastVertexCount, bufferType );\n\t\teastIndices.sort( vSortReverse );\n\n\t\tconst northVertexCount = readInt();\n\t\tconst northIndices = readBuffer( northVertexCount, bufferType );\n\t\tnorthIndices.sort( uSortReverse );\n\n\t\tconst edgeIndices = {\n\t\t\twestIndices,\n\t\t\tsouthIndices,\n\t\t\teastIndices,\n\t\t\tnorthIndices,\n\t\t};\n\n\t\t// parse extensions\n\t\tconst extensions = {};\n\t\twhile ( pointer < view.byteLength ) {\n\n\t\t\tconst extensionId = readByte();\n\t\t\tconst extensionLength = readInt();\n\n\t\t\tif ( extensionId === 1 ) {\n\n\t\t\t\t// oct encoded normals\n\t\t\t\tconst xy = readBuffer( vertexCount * 2, Uint8Array );\n\t\t\t\tconst normals = new Float32Array( vertexCount * 3 );\n\n\t\t\t\t// https://github.com/CesiumGS/cesium/blob/baaabaa49058067c855ad050be73a9cdfe9b6ac7/packages/engine/Source/Core/AttributeCompression.js#L119-L140\n\t\t\t\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\t\t\t\tlet x = ( xy[ 2 * i + 0 ] / 255 ) * 2 - 1;\n\t\t\t\t\tlet y = ( xy[ 2 * i + 1 ] / 255 ) * 2 - 1;\n\t\t\t\t\tconst z = 1.0 - ( Math.abs( x ) + Math.abs( y ) );\n\n\t\t\t\t\tif ( z < 0.0 ) {\n\n\t\t\t\t\t\tconst oldVX = x;\n\t\t\t\t\t\tx = ( 1.0 - Math.abs( y ) ) * signNotZero( oldVX );\n\t\t\t\t\t\ty = ( 1.0 - Math.abs( oldVX ) ) * signNotZero( y );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst len = Math.sqrt( x * x + y * y + z * z );\n\t\t\t\t\tnormals[ 3 * i + 0 ] = x / len;\n\t\t\t\t\tnormals[ 3 * i + 1 ] = y / len;\n\t\t\t\t\tnormals[ 3 * i + 2 ] = z / len;\n\n\t\t\t\t}\n\n\t\t\t\textensions[ 'octvertexnormals' ] = {\n\t\t\t\t\textensionId,\n\t\t\t\t\tnormals,\n\t\t\t\t};\n\n\t\t\t} else if ( extensionId === 2 ) {\n\n\t\t\t\t// water mask\n\t\t\t\tconst size = extensionLength === 1 ? 1 : 256;\n\t\t\t\tconst mask = readBuffer( size * size, Uint8Array );\n\t\t\t\textensions[ 'watermask' ] = {\n\t\t\t\t\textensionId,\n\t\t\t\t\tmask,\n\t\t\t\t\tsize,\n\t\t\t\t};\n\n\t\t\t} else if ( extensionId === 4 ) {\n\n\t\t\t\t// metadata\n\t\t\t\tconst jsonLength = readInt();\n\t\t\t\tconst jsonBuffer = readBuffer( jsonLength, Uint8Array );\n\t\t\t\tconst json = new TextDecoder().decode( jsonBuffer );\n\t\t\t\textensions[ 'metadata' ] = {\n\t\t\t\t\textensionId,\n\t\t\t\t\tjson: JSON.parse( json ),\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\theader,\n\t\t\tindices,\n\t\t\tvertexData: {\n\t\t\t\tu: uResult,\n\t\t\t\tv: vResult,\n\t\t\t\theight: hResult,\n\t\t\t},\n\t\t\tedgeIndices,\n\t\t\textensions,\n\t\t};\n\n\t}\n\n}\n\nfunction signNotZero( v ) {\n\n\treturn v < 0.0 ? - 1.0 : 1.0;\n\n}\n","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tDataTexture,\n\tDefaultLoadingManager,\n\tLinearFilter,\n\tLinearMipMapLinearFilter,\n\tMathUtils,\n\tMesh,\n\tMeshStandardMaterial,\n\tRGFormat,\n\tTriangle,\n\tUnsignedByteType,\n\tVector3,\n} from 'three';\nimport { QuantizedMeshLoaderBase } from '../../base/loaders/QuantizedMeshLoaderBase.js';\nimport { Ellipsoid } from '../../../three/math/Ellipsoid.js';\n\nconst _norm = /* @__PURE__ */ new Vector3();\nconst _tri = /* @__PURE__ */ new Triangle();\nconst _uvh = /* @__PURE__ */ new Vector3();\nconst _pos = /* @__PURE__ */ new Vector3();\nexport class QuantizedMeshLoader extends QuantizedMeshLoaderBase {\n\n\tconstructor( manager = DefaultLoadingManager ) {\n\n\t\tsuper();\n\t\tthis.manager = manager;\n\t\tthis.ellipsoid = new Ellipsoid();\n\t\tthis.skirtLength = 1000;\n\t\tthis.smoothSkirtNormals = true;\n\t\tthis.solid = false;\n\n\t\t// set the range of the tile\n\t\tthis.minLat = - Math.PI / 2;\n\t\tthis.maxLat = Math.PI / 2;\n\t\tthis.minLon = - Math.PI;\n\t\tthis.maxLon = Math.PI;\n\n\t}\n\n\tparse( buffer ) {\n\n\t\tconst {\n\t\t\tellipsoid,\n\t\t\tsolid,\n\t\t\tskirtLength,\n\t\t\tsmoothSkirtNormals,\n\n\t\t\tminLat,\n\t\t\tmaxLat,\n\t\t\tminLon,\n\t\t\tmaxLon,\n\t\t} = this;\n\n\t\tconst {\n\t\t\theader,\n\t\t\tindices,\n\t\t\tvertexData,\n\t\t\tedgeIndices,\n\t\t\textensions,\n\t\t} = super.parse( buffer );\n\n\t\tconst geometry = new BufferGeometry();\n\t\tconst material = new MeshStandardMaterial();\n\t\tconst mesh = new Mesh( geometry, material );\n\t\tmesh.position.set( ...header.center );\n\n\t\tconst includeNormals = 'octvertexnormals' in extensions;\n\t\tconst vertexCount = vertexData.u.length;\n\t\tconst positions = [];\n\t\tconst uvs = [];\n\t\tconst indexArr = [];\n\t\tconst normals = [];\n\n\t\t// construct terrain\n\t\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\t\treadUVHeight( i, _uvh );\n\t\t\treadPosition( _uvh.x, _uvh.y, _uvh.z, _pos );\n\n\t\t\tuvs.push( _uvh.x, _uvh.y );\n\t\t\tpositions.push( ..._pos );\n\n\t\t}\n\n\t\tfor ( let i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\tindexArr.push( indices[ i ] );\n\n\t\t}\n\n\t\tif ( includeNormals ) {\n\n\t\t\tconst extNormals = extensions[ 'octvertexnormals' ].normals;\n\t\t\tfor ( let i = 0, l = extNormals.length; i < l; i ++ ) {\n\n\t\t\t\tnormals.push( extNormals[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// create a lower cap\n\t\tif ( solid ) {\n\n\t\t\tconst indexOffset = positions.length / 3;\n\t\t\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\t\t\treadUVHeight( i, _uvh );\n\t\t\t\treadPosition( _uvh.x, _uvh.y, _uvh.z, _pos, - skirtLength );\n\n\t\t\t\tuvs.push( _uvh.x, _uvh.y );\n\t\t\t\tpositions.push( ..._pos );\n\n\t\t\t}\n\n\t\t\tfor ( let i = indices.length - 1; i >= 0; i -- ) {\n\n\t\t\t\tindexArr.push( indices[ i ] + indexOffset );\n\n\t\t\t}\n\n\t\t\tif ( includeNormals ) {\n\n\t\t\t\tconst extNormals = extensions[ 'octvertexnormals' ].normals;\n\t\t\t\tfor ( let i = 0, l = extNormals.length; i < l; i ++ ) {\n\n\t\t\t\t\tnormals.push( - extNormals[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// construct skirts\n\t\tif ( skirtLength > 0 ) {\n\n\t\t\tconst {\n\t\t\t\twestIndices,\n\t\t\t\teastIndices,\n\t\t\t\tsouthIndices,\n\t\t\t\tnorthIndices,\n\t\t\t} = edgeIndices;\n\n\t\t\t// construct the indices\n\t\t\tlet offset;\n\n\t\t\t// west\n\t\t\tconst westStrip = constructEdgeStrip( westIndices );\n\t\t\toffset = positions.length / 3;\n\t\t\tuvs.push( ...westStrip.uv );\n\t\t\tpositions.push( ...westStrip.positions );\n\t\t\tfor ( let i = 0, l = westStrip.indices.length; i < l; i ++ ) {\n\n\t\t\t\tindexArr.push( westStrip.indices[ i ] + offset );\n\n\t\t\t}\n\n\t\t\t// east\n\t\t\tconst eastStrip = constructEdgeStrip( eastIndices );\n\t\t\toffset = positions.length / 3;\n\t\t\tuvs.push( ...eastStrip.uv );\n\t\t\tpositions.push( ...eastStrip.positions );\n\t\t\tfor ( let i = 0, l = eastStrip.indices.length; i < l; i ++ ) {\n\n\t\t\t\tindexArr.push( eastStrip.indices[ i ] + offset );\n\n\t\t\t}\n\n\t\t\t// south\n\t\t\tconst southStrip = constructEdgeStrip( southIndices );\n\t\t\toffset = positions.length / 3;\n\t\t\tuvs.push( ...southStrip.uv );\n\t\t\tpositions.push( ...southStrip.positions );\n\t\t\tfor ( let i = 0, l = southStrip.indices.length; i < l; i ++ ) {\n\n\t\t\t\tindexArr.push( southStrip.indices[ i ] + offset );\n\n\t\t\t}\n\n\t\t\t// north\n\t\t\tconst northStrip = constructEdgeStrip( northIndices );\n\t\t\toffset = positions.length / 3;\n\t\t\tuvs.push( ...northStrip.uv );\n\t\t\tpositions.push( ...northStrip.positions );\n\t\t\tfor ( let i = 0, l = northStrip.indices.length; i < l; i ++ ) {\n\n\t\t\t\tindexArr.push( northStrip.indices[ i ] + offset );\n\n\t\t\t}\n\n\t\t\t// add the normals\n\t\t\tif ( includeNormals ) {\n\n\t\t\t\tnormals.push( ...westStrip.normals );\n\t\t\t\tnormals.push( ...eastStrip.normals );\n\t\t\t\tnormals.push( ...southStrip.normals );\n\t\t\t\tnormals.push( ...northStrip.normals );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// shift the positions by the center of the tile\n\t\tfor ( let i = 0, l = positions.length; i < l; i += 3 ) {\n\n\t\t\tpositions[ i + 0 ] -= header.center[ 0 ];\n\t\t\tpositions[ i + 1 ] -= header.center[ 1 ];\n\t\t\tpositions[ i + 2 ] -= header.center[ 2 ];\n\n\t\t}\n\n\t\t// generate geometry and mesh\n\t\tconst indexBuffer = positions.length / 3 > 65535 ? new Uint32Array( indexArr ) : new Uint16Array( indexArr );\n\t\tgeometry.setIndex( new BufferAttribute( indexBuffer, 1, false ) );\n\t\tgeometry.setAttribute( 'position', new BufferAttribute( new Float32Array( positions ), 3, false ) );\n\t\tgeometry.setAttribute( 'uv', new BufferAttribute( new Float32Array( uvs ), 2, false ) );\n\t\tif ( includeNormals ) {\n\n\t\t\tgeometry.setAttribute( 'normal', new BufferAttribute( new Float32Array( normals ), 3, false ) );\n\n\t\t}\n\n\t\t// generate the water texture\n\t\tif ( 'watermask' in extensions ) {\n\n\t\t\t// invert the mask data\n\t\t\t// TODO: this inversion step can be a bit slow\n\t\t\tconst { mask, size } = extensions[ 'watermask' ];\n\t\t\tconst maskBuffer = new Uint8Array( 2 * size * size );\n\t\t\tfor ( let i = 0, l = mask.length; i < l; i ++ ) {\n\n\t\t\t\tconst v = mask[ i ] === 255 ? 0 : 255;\n\t\t\t\tmaskBuffer[ 2 * i + 0 ] = v;\n\t\t\t\tmaskBuffer[ 2 * i + 1 ] = v;\n\n\t\t\t}\n\n\t\t\t// TODO: Luminance format is not supported - eventually node materials will\n\t\t\t// make it possible to map the texture to the appropriate buffer input.\n\t\t\tconst map = new DataTexture( maskBuffer, size, size, RGFormat, UnsignedByteType );\n\t\t\tmap.flipY = true;\n\t\t\tmap.minFilter = LinearMipMapLinearFilter;\n\t\t\tmap.magFilter = LinearFilter;\n\t\t\tmap.needsUpdate = true;\n\n\t\t\tmaterial.roughnessMap = map;\n\n\t\t}\n\n\t\t// set metadata\n\t\tmesh.userData.minHeight = header.minHeight;\n\t\tmesh.userData.maxHeight = header.maxHeight;\n\n\t\tif ( 'metadata' in extensions ) {\n\n\t\t\tmesh.userData.metadata = extensions[ 'metadata' ].json;\n\n\t\t}\n\n\t\treturn mesh;\n\n\t\tfunction readUVHeight( index, target ) {\n\n\t\t\ttarget.x = vertexData.u[ index ];\n\t\t\ttarget.y = vertexData.v[ index ];\n\t\t\ttarget.z = vertexData.height[ index ];\n\t\t\treturn target;\n\n\t\t}\n\n\t\tfunction readPosition( u, v, h, target, heightOffset = 0 ) {\n\n\t\t\tconst height = MathUtils.lerp( header.minHeight, header.maxHeight, h );\n\t\t\tconst lon = MathUtils.lerp( minLon, maxLon, u );\n\t\t\tconst lat = MathUtils.lerp( minLat, maxLat, v );\n\n\t\t\tellipsoid.getCartographicToPosition( lat, lon, height + heightOffset, target );\n\n\t\t\treturn target;\n\n\t\t}\n\n\t\tfunction constructEdgeStrip( indices ) {\n\n\t\t\tconst topUvs = [];\n\t\t\tconst topPos = [];\n\t\t\tconst botUvs = [];\n\t\t\tconst botPos = [];\n\t\t\tconst sideIndices = [];\n\t\t\tfor ( let i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\treadUVHeight( indices[ i ], _uvh );\n\t\t\t\ttopUvs.push( _uvh.x, _uvh.y );\n\t\t\t\tbotUvs.push( _uvh.x, _uvh.y );\n\n\t\t\t\treadPosition( _uvh.x, _uvh.y, _uvh.z, _pos );\n\t\t\t\ttopPos.push( ..._pos );\n\n\t\t\t\treadPosition( _uvh.x, _uvh.y, _uvh.z, _pos, - skirtLength );\n\t\t\t\tbotPos.push( ..._pos );\n\n\t\t\t}\n\n\t\t\tconst triCount = ( indices.length - 1 );\n\t\t\tfor ( let i = 0; i < triCount; i ++ ) {\n\n\t\t\t\tconst t0 = i;\n\t\t\t\tconst t1 = i + 1;\n\t\t\t\tconst b0 = i + indices.length;\n\t\t\t\tconst b1 = i + indices.length + 1;\n\n\t\t\t\tsideIndices.push( t0, b0, t1 );\n\t\t\t\tsideIndices.push( t1, b0, b1 );\n\n\t\t\t}\n\n\t\t\tlet normals = null;\n\t\t\tif ( includeNormals ) {\n\n\t\t\t\tconst total = ( topPos.length + botPos.length ) / 3;\n\n\t\t\t\tif ( smoothSkirtNormals ) {\n\n\t\t\t\t\tnormals = new Array( total * 3 );\n\n\t\t\t\t\tconst extNormals = extensions[ 'octvertexnormals' ].normals;\n\t\t\t\t\tconst botOffset = normals.length / 2;\n\t\t\t\t\tfor ( let i = 0, l = total / 2; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst index = indices[ i ];\n\t\t\t\t\t\tconst i3 = 3 * i;\n\t\t\t\t\t\tconst nx = extNormals[ 3 * index + 0 ];\n\t\t\t\t\t\tconst ny = extNormals[ 3 * index + 1 ];\n\t\t\t\t\t\tconst nz = extNormals[ 3 * index + 2 ];\n\n\t\t\t\t\t\tnormals[ i3 + 0 ] = nx;\n\t\t\t\t\t\tnormals[ i3 + 1 ] = ny;\n\t\t\t\t\t\tnormals[ i3 + 2 ] = nz;\n\n\t\t\t\t\t\tnormals[ botOffset + i3 + 0 ] = nx;\n\t\t\t\t\t\tnormals[ botOffset + i3 + 1 ] = ny;\n\t\t\t\t\t\tnormals[ botOffset + i3 + 2 ] = nz;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnormals = [];\n\t\t\t\t\t_tri.a.fromArray( topPos, 0 );\n\t\t\t\t\t_tri.b.fromArray( botPos, 0 );\n\t\t\t\t\t_tri.c.fromArray( topPos, 3 );\n\t\t\t\t\t_tri.getNormal( _norm );\n\n\t\t\t\t\tfor ( let i = 0; i < total; i ++ ) {\n\n\t\t\t\t\t\tnormals.push( ..._norm );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tuv: [ ...topUvs, ...botUvs ],\n\t\t\t\tpositions: [ ...topPos, ...botPos ],\n\t\t\t\tindices: sideIndices,\n\t\t\t\tnormals,\n\t\t\t};\n\n\t\t}\n\n\t}\n\n}\n","import { MathUtils, Vector3 } from 'three';\nimport { QuantizedMeshLoader } from './loaders/QuantizedMeshLoader.js';\nimport { PriorityQueue } from '../../utilities/PriorityQueue.js';\n\nconst TILE_X = Symbol( 'TILE_X' );\nconst TILE_Y = Symbol( 'TILE_Y' );\nconst TILE_LEVEL = Symbol( 'TILE_LEVEL' );\n\n// We don't know the height ranges for the tile set on load so assume a large range and\n// adjust it once the tiles have actually loaded based on the min and max height\nconst INITIAL_HEIGHT_RANGE = 1e5;\nconst _vec = /* @__PURE__ */ new Vector3();\n\n// Checks if the given tile is available\nfunction isAvailable( layer, level, x, y ) {\n\n\tconst {\n\t\tminzoom,\n\t\tmaxzoom,\n\t\tavailable,\n\t} = layer;\n\n\tif ( level >= minzoom && level <= maxzoom && level < available.length ) {\n\n\t\t// TODO: consider a binary search\n\t\tconst availableSet = available[ level ];\n\t\tfor ( let i = 0, l = availableSet.length; i < l; i ++ ) {\n\n\t\t\tconst { startX, startY, endX, endY } = availableSet[ i ];\n\t\t\tif ( x >= startX && x <= endX && y >= startY && y <= endY ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn false;\n\n}\n\nexport class QuantizedMeshPlugin {\n\n\tget maxLevel() {\n\n\t\treturn this.layer.available.length;\n\n\t}\n\n\tconstructor( {\n\t\tuseRecommendedSettings = true,\n\t\tskirtLength = 1000,\n\t\tsmoothSkirtNormals = true,\n\t\tsolid = false,\n\t} ) {\n\n\t\tthis.name = 'QUANTIZED_MESH_PLUGIN';\n\n\t\tthis.tiles = null;\n\t\tthis.layer = null;\n\t\tthis.processQueue = null;\n\t\tthis.useRecommendedSettings = useRecommendedSettings;\n\t\tthis.skirtLength = skirtLength;\n\t\tthis.smoothSkirtNormals = smoothSkirtNormals;\n\t\tthis.solid = solid;\n\t\tthis.needsUpdate = true;\n\n\t}\n\n\tinit( tiles ) {\n\n\t\tconst processQueue = new PriorityQueue();\n\t\tprocessQueue.priorityCallback = tiles.downloadQueue.priorityCallback;\n\t\tprocessQueue.maxJobs = 20;\n\n\t\ttiles.fetchOptions.header = tiles.fetchOptions.header || {};\n\t\ttiles.fetchOptions.header.Accept = 'application/vnd.quantized-mesh,application/octet-stream;q=0.9';\n\n\t\tif ( this.useRecommendedSettings ) {\n\n\t\t\ttiles.errorTarget = 2;\n\n\t\t}\n\n\t\tthis.tiles = tiles;\n\t\tthis.processQueue = processQueue;\n\t\tthis.processCallback = tile => {\n\n\t\t\tconst level = tile[ TILE_LEVEL ];\n\t\t\tconst x = tile[ TILE_X ];\n\t\t\tconst y = tile[ TILE_Y ];\n\n\t\t\tconst [ west, south, east, north, minHeight, maxHeight ] = tile.boundingVolume.region;\n\t\t\tconst xStep = ( east - west ) / 2;\n\t\t\tconst yStep = ( north - south ) / 2;\n\t\t\tfor ( let cx = 0; cx < 2; cx ++ ) {\n\n\t\t\t\tfor ( let cy = 0; cy < 2; cy ++ ) {\n\n\t\t\t\t\tconst region = [\n\t\t\t\t\t\twest + xStep * cx,\n\t\t\t\t\t\tsouth + yStep * cy,\n\t\t\t\t\t\twest + xStep * cx + xStep,\n\t\t\t\t\t\tsouth + yStep * cy + yStep,\n\t\t\t\t\t\tminHeight, maxHeight,\n\t\t\t\t\t];\n\t\t\t\t\tconst child = this.expand( level + 1, 2 * x + cx, 2 * y + cy, region );\n\t\t\t\t\tif ( child ) {\n\n\t\t\t\t\t\ttile.children.push( child );\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\tpreprocessNode( tile, dir, parentTile ) {\n\n\t\t// generate children\n\t\tconst { maxLevel } = this;\n\t\tconst level = tile[ TILE_LEVEL ];\n\t\tif ( level < maxLevel ) {\n\n\t\t\t// marking the tiles as needing an update here prevents cases where we need to process children but there's a frame delay\n\t\t\t// meaning we may miss our chance on the next loop to perform an update if the \"UpdateOnChange\" plugin is being used.\n\t\t\tthis.processQueue.add( tile, this.processCallback );\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tloadRootTileSet() {\n\n\t\tconst { tiles } = this;\n\t\tlet url = new URL( 'layer.json', tiles.rootURL );\n\t\ttiles.invokeAllPlugins( plugin => url = plugin.preprocessURL ? plugin.preprocessURL( url, null ) : url );\n\n\t\treturn tiles\n\t\t\t.invokeOnePlugin( plugin => plugin.fetchData && plugin.fetchData( url, this.tiles.fetchOptions ) )\n\t\t\t.then( res => res.json() )\n\t\t\t.then( json => {\n\n\t\t\t\tthis.layer = json;\n\n\t\t\t\tif ( json.extensions.length > 0 ) {\n\n\t\t\t\t\ttiles.fetchOptions.header[ 'Accept' ] += `;extensions=${ json.extensions.join( '-' ) }`;\n\n\t\t\t\t}\n\n\t\t\t\tconst { bounds } = json;\n\t\t\t\tconst west = MathUtils.DEG2RAD * bounds[ 0 ];\n\t\t\t\tconst south = MathUtils.DEG2RAD * bounds[ 1 ];\n\t\t\t\tconst east = MathUtils.DEG2RAD * bounds[ 2 ];\n\t\t\t\tconst north = MathUtils.DEG2RAD * bounds[ 3 ];\n\n\t\t\t\tconst tileset = {\n\t\t\t\t\tasset: {\n\t\t\t\t\t\tversion: '1.1'\n\t\t\t\t\t},\n\t\t\t\t\tgeometricError: Infinity,\n\t\t\t\t\troot: {\n\t\t\t\t\t\trefine: 'REPLACE',\n\t\t\t\t\t\tgeometricError: Infinity,\n\t\t\t\t\t\tboundingVolume: {\n\t\t\t\t\t\t\tregion: [\n\t\t\t\t\t\t\t\twest, south, east, north,\n\t\t\t\t\t\t\t\t- INITIAL_HEIGHT_RANGE, INITIAL_HEIGHT_RANGE,\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\tconst xTiles = json.projection === 'EPSG:4326' ? 2 : 1;\n\t\t\t\tfor ( let x = 0; x < xTiles; x ++ ) {\n\n\t\t\t\t\tconst step = ( east - west ) / xTiles;\n\t\t\t\t\tconst region = [\n\t\t\t\t\t\twest + step * x, south, west + step * x + step, north,\n\t\t\t\t\t\t- INITIAL_HEIGHT_RANGE, INITIAL_HEIGHT_RANGE,\n\t\t\t\t\t];\n\t\t\t\t\tconst child = this.expand( 0, x, 0, region );\n\t\t\t\t\tif ( child ) {\n\n\t\t\t\t\t\ttileset.root.children.push( child );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tlet baseUrl = tiles.rootURL;\n\t\t\t\ttiles.invokeAllPlugins( plugin => baseUrl = plugin.preprocessURL ? plugin.preprocessURL( baseUrl, null ) : baseUrl );\n\t\t\t\tthis.tiles.preprocessTileSet( tileset, baseUrl );\n\n\t\t\t\treturn tileset;\n\n\t\t\t} );\n\n\t}\n\n\texpand( level, x, y, region ) {\n\n\t\tif ( ! isAvailable( this.layer, level, x, y ) ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst url = this.layer.tiles[ 0 ]\n\t\t\t.replace( /{\\s*z\\s*}/g, level )\n\t\t\t.replace( /{\\s*x\\s*}/g, x )\n\t\t\t.replace( /{\\s*y\\s*}/g, y )\n\t\t\t.replace( /{\\s*version\\s*}/g, 1 );\n\n\t\tconst { tiles } = this;\n\t\tconst ellipsoid = tiles.ellipsoid;\n\t\tconst [ , south, , north, , maxHeight ] = region;\n\t\tconst midLat = ( south > 0 ) !== ( north > 0 ) ? 0 : Math.min( Math.abs( south ), Math.abs( north ) );\n\n\t\tellipsoid.getCartographicToPosition( midLat, 0, maxHeight, _vec );\n\t\t_vec.z = 0;\n\n\t\t// https://github.com/CesiumGS/cesium/blob/53889cbed2a91d38e0fae4b6f2dcf6783632fc92/packages/engine/Source/Scene/QuadtreeTileProvider.js#L24-L31\n\t\t// Implicit quantized mesh tile error halves with every layer\n\t\tconst xTiles = this.layer.projection === 'EPSG:4326' ? 2 : 1;\n\t\tconst maxRadius = Math.max( ...ellipsoid.radius );\n\t\tconst rootGeometricError = maxRadius * 2 * Math.PI * 0.25 / ( 65 * xTiles );\n\t\tconst geometricError = rootGeometricError / ( 2 ** level );\n\n\t\treturn {\n\t\t\t[ TILE_LEVEL ]: level,\n\t\t\t[ TILE_X ]: x,\n\t\t\t[ TILE_Y ]: y,\n\t\t\trefine: 'REPLACE',\n\t\t\tgeometricError: geometricError,\n\t\t\tboundingVolume: {\n\t\t\t\tregion: region,\n\t\t\t},\n\t\t\tcontent: {\n\t\t\t\turi: url,\n\t\t\t},\n\t\t\tchildren: []\n\t\t};\n\n\t}\n\n\tdoTilesNeedUpdate() {\n\n\t\tif ( this.needsUpdate ) {\n\n\t\t\tthis.needsUpdate = false;\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\tparseToMesh( buffer, tile ) {\n\n\t\tconst ellipsoid = this.tiles.ellipsoid;\n\t\tconst [ west, south, east, north ] = tile.boundingVolume.region;\n\t\tconst loader = new QuantizedMeshLoader( this.tiles.manager );\n\t\tloader.minLat = south;\n\t\tloader.maxLat = north;\n\t\tloader.minLon = west;\n\t\tloader.maxLon = east;\n\t\tloader.ellipsoid.copy( ellipsoid );\n\n\t\tloader.solid = this.solid;\n\t\tloader.smoothSkirtNormals = this.smoothSkirtNormals;\n\t\tloader.skirtLength = this.skirtLength;\n\n\t\t// parse the tile data\n\t\tconst result = loader.parse( buffer );\n\n\t\t// adjust the bounding region to be more accurate based on the contents of the terrain file\n\t\t// NOTE: The debug region bounds are only created after the tile is first shown so the debug\n\t\t// region bounding volume will have the correct dimensions.\n\t\tconst { minHeight, maxHeight, metadata } = result.userData;\n\t\ttile.boundingVolume.region[ 4 ] = minHeight;\n\t\ttile.boundingVolume.region[ 5 ] = maxHeight;\n\t\ttile.cached.boundingVolume.setRegionData( ellipsoid, ...tile.boundingVolume.region );\n\n\t\t// use the geometric error value if it's present\n\t\tif ( metadata && 'geometricerror' in metadata ) {\n\n\t\t\ttile.geometricError = metadata.geometricerror;\n\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n","import { GoogleCloudAuthPlugin } from './GoogleCloudAuthPlugin.js';\nimport { TMSTilesPlugin } from './images/EPSGTilesPlugin.js';\nimport { QuantizedMeshPlugin } from './QuantizedMeshPlugin.js';\n\nexport class CesiumIonAuthPlugin {\n\n\tconstructor( { apiToken, assetId = null, autoRefreshToken = false, useRecommendedSettings = true } ) {\n\n\t\tthis.name = 'CESIUM_ION_AUTH_PLUGIN';\n\t\tthis.priority = - Infinity;\n\n\t\tthis.apiToken = apiToken;\n\t\tthis.assetId = assetId;\n\t\tthis.autoRefreshToken = autoRefreshToken;\n\t\tthis.useRecommendedSettings = useRecommendedSettings;\n\t\tthis.tiles = null;\n\t\tthis.endpointURL = null;\n\n\t\tthis._bearerToken = null;\n\t\tthis._tileSetVersion = - 1;\n\t\tthis._tokenRefreshPromise = null;\n\t\tthis._attributions = [];\n\t\tthis._disposed = false;\n\n\t}\n\n\tinit( tiles ) {\n\n\t\tif ( this.assetId !== null ) {\n\n\t\t\ttiles.rootURL = `https://api.cesium.com/v1/assets/${ this.assetId }/endpoint`;\n\n\t\t}\n\n\t\tthis.tiles = tiles;\n\t\tthis.endpointURL = tiles.rootURL;\n\n\t\t// reset the tiles in case this plugin was removed and re-added\n\t\ttiles.resetFailedTiles();\n\n\t}\n\n\tloadRootTileSet() {\n\n\t\t// ensure we have an up-to-date token and root url, then trigger the internal\n\t\t// root tile set load function\n\t\treturn this._refreshToken()\n\t\t\t.then( () => {\n\n\t\t\t\treturn this.tiles.invokeOnePlugin( plugin => plugin !== this && plugin.loadRootTileSet && plugin.loadRootTileSet() );\n\n\t\t\t} );\n\n\t}\n\n\tpreprocessURL( uri ) {\n\n\t\turi = new URL( uri );\n\t\tif ( /^http/.test( uri.protocol ) && this._tileSetVersion != - 1 ) {\n\n\t\t\turi.searchParams.append( 'v', this._tileSetVersion );\n\n\t\t}\n\t\treturn uri.toString();\n\n\t}\n\n\tfetchData( uri, options ) {\n\n\t\tconst tiles = this.tiles;\n\t\tif ( tiles.getPluginByName( 'GOOGLE_CLOUD_AUTH_PLUGIN' ) !== null ) {\n\n\t\t\treturn null;\n\n\t\t} else {\n\n\t\t\treturn Promise.resolve().then( async () => {\n\n\t\t\t\t// wait for the token to refresh if loading\n\t\t\t\tif ( this._tokenRefreshPromise !== null ) {\n\n\t\t\t\t\tawait this._tokenRefreshPromise;\n\t\t\t\t\turi = this.preprocessURL( uri );\n\n\t\t\t\t}\n\n\t\t\t\tconst res = await fetch( uri, options );\n\t\t\t\tif ( res.status >= 400 && res.status <= 499 && this.autoRefreshToken ) {\n\n\t\t\t\t\tawait this._refreshToken( options );\n\t\t\t\t\treturn fetch( this.preprocessURL( uri ), options );\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn res;\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\tgetAttributions( target ) {\n\n\t\tif ( this.tiles.visibleTiles.size > 0 ) {\n\n\t\t\ttarget.push( ...this._attributions );\n\n\t\t}\n\n\t}\n\n\t_refreshToken( options ) {\n\n\t\tif ( this._tokenRefreshPromise === null ) {\n\n\t\t\t// construct the url to fetch the endpoint\n\t\t\tconst url = new URL( this.endpointURL );\n\t\t\turl.searchParams.append( 'access_token', this.apiToken );\n\n\t\t\tthis._tokenRefreshPromise = fetch( url, options )\n\t\t\t\t.then( res => {\n\n\t\t\t\t\tif ( this._disposed ) {\n\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! res.ok ) {\n\n\t\t\t\t\t\tthrow new Error( `CesiumIonAuthPlugin: Failed to load data with error code ${ res.status }` );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn res.json();\n\n\t\t\t\t} )\n\t\t\t\t.then( json => {\n\n\t\t\t\t\tif ( this._disposed ) {\n\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst tiles = this.tiles;\n\t\t\t\t\tif ( 'externalType' in json ) {\n\n\t\t\t\t\t\tconst url = new URL( json.options.url );\n\t\t\t\t\t\ttiles.rootURL = json.options.url;\n\n\t\t\t\t\t\t// if the tile set is \"external\" then assume it's a google API tile set\n\t\t\t\t\t\ttiles.registerPlugin( new GoogleCloudAuthPlugin( {\n\t\t\t\t\t\t\tapiToken: url.searchParams.get( 'key' ),\n\t\t\t\t\t\t\tautoRefreshToken: this.autoRefreshToken,\n\t\t\t\t\t\t\tuseRecommendedSettings: this.useRecommendedSettings,\n\t\t\t\t\t\t} ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// GLTF\n\t\t\t\t\t\t// CZML\n\t\t\t\t\t\t// KML\n\t\t\t\t\t\t// GEOJSON\n\t\t\t\t\t\tif ( json.type === 'TERRAIN' && tiles.getPluginByName( 'QUANTIZED_MESH_PLUGIN' ) === null ) {\n\n\t\t\t\t\t\t\ttiles.registerPlugin( new QuantizedMeshPlugin( {\n\t\t\t\t\t\t\t\tuseRecommendedSettings: this.useRecommendedSettings,\n\t\t\t\t\t\t\t} ) );\n\n\t\t\t\t\t\t} else if ( json.type === 'IMAGERY' && tiles.getPluginByName( 'TMS_TILES_PLUGIN' ) === null ) {\n\n\t\t\t\t\t\t\ttiles.registerPlugin( new TMSTilesPlugin( {\n\t\t\t\t\t\t\t\tuseRecommendedSettings: this.useRecommendedSettings,\n\t\t\t\t\t\t\t\tshape: 'ellipsoid',\n\t\t\t\t\t\t\t} ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttiles.rootURL = json.url;\n\t\t\t\t\t\ttiles.fetchOptions.headers = tiles.fetchOptions.headers || {};\n\t\t\t\t\t\ttiles.fetchOptions.headers.Authorization = `Bearer ${ json.accessToken }`;\n\n\t\t\t\t\t\t// save the version key if present\n\t\t\t\t\t\tif ( url.searchParams.has( 'v' ) && this._tileSetVersion === - 1 ) {\n\n\t\t\t\t\t\t\tconst url = new URL( json.url );\n\t\t\t\t\t\t\tthis._tileSetVersion = url.searchParams.get( 'v' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._bearerToken = json.accessToken;\n\t\t\t\t\t\tif ( json.attributions ) {\n\n\t\t\t\t\t\t\tthis._attributions = json.attributions.map( att => ( {\n\t\t\t\t\t\t\t\tvalue: att.html,\n\t\t\t\t\t\t\t\ttype: 'html',\n\t\t\t\t\t\t\t\tcollapsible: att.collapsible,\n\t\t\t\t\t\t\t} ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._tokenRefreshPromise = null;\n\n\t\t\t\t\treturn json;\n\n\t\t\t\t} );\n\n\t\t\t// dispatch an error if we fail to refresh the token\n\t\t\tthis._tokenRefreshPromise\n\t\t\t\t.catch( error => {\n\n\t\t\t\t\tthis.tiles.dispatchEvent( {\n\t\t\t\t\t\ttype: 'load-error',\n\t\t\t\t\t\ttile: null,\n\t\t\t\t\t\terror,\n\t\t\t\t\t\turl,\n\t\t\t\t\t} );\n\n\t\t\t\t} );\n\n\t\t}\n\n\t\treturn this._tokenRefreshPromise;\n\n\t}\n\n\tdispose() {\n\n\t\tthis._disposed = true;\n\n\t}\n\n}\n","import { Matrix4 } from 'three';\n\nconst _matrix = new Matrix4();\nexport class UpdateOnChangePlugin {\n\n\tconstructor() {\n\n\t\tthis.name = 'UPDATE_ON_CHANGE_PLUGIN';\n\t\tthis.tiles = null;\n\t\tthis.needsUpdate = false;\n\t\tthis.cameraMatrices = new Map();\n\n\t}\n\n\tinit( tiles ) {\n\n\t\tthis.tiles = tiles;\n\n\t\t// register callbacks to add cameras and force a new update\n\t\tthis._needsUpdateCallback = () => {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t};\n\t\tthis._onCameraAdd = ( { camera } ) => {\n\n\t\t\tthis.needsUpdate = true;\n\t\t\tthis.cameraMatrices.set( camera, new Matrix4() );\n\n\t\t};\n\t\tthis._onCameraDelete = ( { camera } ) => {\n\n\t\t\tthis.needsUpdate = true;\n\t\t\tthis.cameraMatrices.delete( camera );\n\n\t\t};\n\n\t\ttiles.addEventListener( 'needs-update', this._needsUpdateCallback );\n\t\ttiles.addEventListener( 'add-camera', this._onCameraAdd );\n\t\ttiles.addEventListener( 'delete-camera', this._onCameraDelete );\n\t\ttiles.addEventListener( 'camera-resolution-change', this._needsUpdateCallback );\n\n\t\t// register any already-present cameras\n\t\ttiles.cameras.forEach( camera => {\n\n\t\t\tthis._onCameraAdd( { camera } );\n\n\t\t} );\n\n\t}\n\n\tdoTilesNeedUpdate() {\n\n\t\tconst tiles = this.tiles;\n\t\tlet didCamerasChange = false;\n\t\tthis.cameraMatrices.forEach( ( matrix, camera ) => {\n\n\t\t\t// check if the camera position or frustum changed by comparing the MVP\n\t\t\t// matrix between frames\n\t\t\t_matrix\n\t\t\t\t.copy( tiles.group.matrixWorld )\n\t\t\t\t.premultiply( camera.matrixWorldInverse )\n\t\t\t\t.premultiply( camera.projectionMatrixInverse );\n\n\t\t\tdidCamerasChange = didCamerasChange || ! _matrix.equals( matrix );\n\t\t\tmatrix.copy( _matrix );\n\n\t\t} );\n\n\t\tconst needsUpdate = this.needsUpdate;\n\t\tthis.needsUpdate = false;\n\n\t\treturn needsUpdate || didCamerasChange;\n\n\t}\n\n\tpreprocessNode() {\n\n\t\t// trigger a new update when nodes are processed because hte process happens asynchronously\n\t\tthis.needsUpdate = true;\n\n\t}\n\n\tdispose() {\n\n\t\tconst tiles = this.tiles;\n\t\ttiles.removeEventListener( 'camera-resolution-change', this._needsUpdateCallback );\n\t\ttiles.removeEventListener( 'load-content', this._needsUpdateCallback );\n\t\ttiles.removeEventListener( 'camera-add', this._onCameraAdd );\n\t\ttiles.removeEventListener( 'camera-delete', this._onCameraDelete );\n\n\t}\n\n}\n","import { Vector3, LinearFilter, BufferAttribute, MathUtils } from 'three';\n\nconst _vec = new Vector3();\nfunction compressAttribute( attribute, arrayType ) {\n\n\tif ( attribute.isInterleavedBufferAttribute || attribute.array instanceof arrayType ) {\n\n\t\treturn attribute;\n\n\t}\n\n\tconst signed = arrayType === Int8Array || arrayType === Int16Array || arrayType === Int32Array;\n\tconst minValue = signed ? - 1 : 0;\n\n\tconst array = new arrayType( attribute.count * attribute.itemSize );\n\tconst newAttribute = new BufferAttribute( array, attribute.itemSize, true );\n\tconst itemSize = attribute.itemSize;\n\tconst count = attribute.count;\n\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\tfor ( let j = 0; j < itemSize; j ++ ) {\n\n\t\t\tconst v = MathUtils.clamp( attribute.getComponent( i, j ), minValue, 1 );\n\t\t\tnewAttribute.setComponent( i, j, v );\n\n\t\t}\n\n\t}\n\n\treturn newAttribute;\n\n}\n\nfunction compressPositionAttribute( mesh, arrayType = Int16Array ) {\n\n\tconst geometry = mesh.geometry;\n\tconst attributes = geometry.attributes;\n\tconst attribute = attributes.position;\n\n\t// skip if it's already compressed to the provided level\n\tif ( attribute.isInterleavedBufferAttribute || attribute.array instanceof arrayType ) {\n\n\t\treturn attribute;\n\n\t}\n\n\t// new attribute data\n\tconst array = new arrayType( attribute.count * attribute.itemSize );\n\tconst newAttribute = new BufferAttribute( array, attribute.itemSize, false );\n\tconst itemSize = attribute.itemSize;\n\tconst count = attribute.count;\n\n\t// bounding box stride\n\t// TODO: the bounding box is computed every time even if it already exists because\n\t// it's possible that the encoded value is incorrect causing artifacts\n\tgeometry.computeBoundingBox();\n\n\tconst boundingBox = geometry.boundingBox;\n\tconst { min, max } = boundingBox;\n\n\t// array range\n\tconst maxValue = 2 ** ( 8 * arrayType.BYTES_PER_ELEMENT - 1 ) - 1;\n\tconst minValue = - maxValue;\n\n\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\tfor ( let j = 0; j < itemSize; j ++ ) {\n\n\t\t\tconst key = j === 0 ? 'x' : j === 1 ? 'y' : 'z';\n\t\t\tconst bbMinValue = min[ key ];\n\t\t\tconst bbMaxValue = max[ key ];\n\n\t\t\t// scale the geometry values to the integer range\n\t\t\tconst v = MathUtils.mapLinear(\n\t\t\t\tattribute.getComponent( i, j ),\n\t\t\t\tbbMinValue, bbMaxValue,\n\t\t\t\tminValue, maxValue,\n\t\t\t);\n\n\t\t\tnewAttribute.setComponent( i, j, v );\n\n\t\t}\n\n\t}\n\n\t// shift the mesh to the center of the bounds\n\tboundingBox.getCenter( _vec );\n\tmesh.position.add( _vec );\n\n\t// adjust the scale to accommodate the new geometry data range\n\tmesh.scale.x *= 0.5 * ( max.x - min.x ) / maxValue;\n\tmesh.scale.y *= 0.5 * ( max.y - min.y ) / maxValue;\n\tmesh.scale.z *= 0.5 * ( max.z - min.z ) / maxValue;\n\n\tattributes.position = newAttribute;\n\tmesh.geometry.boundingBox = null;\n\tmesh.geometry.boundingSphere = null;\n\n\tmesh.updateMatrixWorld();\n\n}\n\nexport class TileCompressionPlugin {\n\n\tconstructor( options ) {\n\n\t\tthis._options = {\n\t\t\t// whether to generate normals if they don't already exist.\n\t\t\tgenerateNormals: false,\n\n\t\t\t// whether to disable use of mipmaps since they are typically not necessary\n\t\t\t// with something like 3d tiles.\n\t\t\tdisableMipmaps: true,\n\n\t\t\t// whether to compress certain attributes\n\t\t\tcompressIndex: true,\n\t\t\tcompressNormals: false,\n\t\t\tcompressUvs: false,\n\t\t\tcompressPosition: false,\n\n\t\t\t// the TypedArray type to use when compressing the attributes\n\t\t\tuvType: Int8Array,\n\t\t\tnormalType: Int8Array,\n\t\t\tpositionType: Int16Array,\n\n\t\t\t...options,\n\t\t};\n\n\t\tthis.name = 'TILES_COMPRESSION_PLUGIN';\n\t\tthis.priority = - 100;\n\n\t}\n\n\tprocessTileModel( scene, tile ) {\n\n\t\tconst {\n\t\t\tgenerateNormals,\n\n\t\t\tdisableMipmaps,\n\t\t\tcompressIndex,\n\t\t\tcompressUvs,\n\t\t\tcompressNormals,\n\t\t\tcompressPosition,\n\n\t\t\tuvType,\n\t\t\tnormalType,\n\t\t\tpositionType,\n\t\t} = this._options;\n\n\t\tscene.traverse( c => {\n\n\t\t\t// handle materials\n\t\t\tif ( c.material && disableMipmaps ) {\n\n\t\t\t\tconst material = c.material;\n\t\t\t\tfor ( const key in material ) {\n\n\t\t\t\t\tconst value = material[ key ];\n\t\t\t\t\tif ( value && value.isTexture && value.generateMipmaps ) {\n\n\t\t\t\t\t\tvalue.generateMipmaps = false;\n\t\t\t\t\t\tvalue.minFilter = LinearFilter;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// handle geometry attribute compression\n\t\t\tif ( c.geometry ) {\n\n\t\t\t\tconst geometry = c.geometry;\n\t\t\t\tconst attributes = geometry.attributes;\n\t\t\t\tif ( compressUvs ) {\n\n\t\t\t\t\tconst { uv, uv1, uv2, uv3 } = attributes;\n\t\t\t\t\tif ( uv ) attributes.uv = compressAttribute( uv, uvType );\n\t\t\t\t\tif ( uv1 ) attributes.uv1 = compressAttribute( uv1, uvType );\n\t\t\t\t\tif ( uv2 ) attributes.uv2 = compressAttribute( uv2, uvType );\n\t\t\t\t\tif ( uv3 ) attributes.uv3 = compressAttribute( uv3, uvType );\n\n\t\t\t\t}\n\n\t\t\t\tif ( generateNormals && ! attributes.normals ) {\n\n\t\t\t\t\tgeometry.computeVertexNormals();\n\n\t\t\t\t}\n\n\t\t\t\tif ( compressNormals && attributes.normals ) {\n\n\t\t\t\t\tattributes.normals = compressAttribute( attributes.normals, normalType );\n\n\t\t\t\t}\n\n\t\t\t\tif ( compressPosition ) {\n\n\t\t\t\t\tcompressPositionAttribute( c, positionType );\n\n\t\t\t\t}\n\n\t\t\t\tif ( compressIndex && geometry.index ) {\n\n\t\t\t\t\tconst vertCount = attributes.position.count;\n\t\t\t\t\tconst index = geometry.index;\n\t\t\t\t\tconst type = vertCount > 65535 ? Uint32Array : vertCount > 255 ? Uint16Array : Uint8Array;\n\t\t\t\t\tif ( ! ( index.array instanceof type ) ) {\n\n\t\t\t\t\t\tconst array = new type( geometry.index.count );\n\t\t\t\t\t\tarray.set( index.array );\n\n\t\t\t\t\t\tconst attribute = new BufferAttribute( array, 1 );\n\t\t\t\t\t\tgeometry.setIndex( attribute );\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}\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 { 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","// https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_structural_metadata\n\nimport { FileLoader } from 'three';\nimport { StructuralMetadata } from './metadata/classes/StructuralMetadata.js';\n\nconst EXT_NAME = 'EXT_structural_metadata';\n\n// returns the set of textures required by the property texture definitions\nfunction getRelevantTextures( parser, propertyTextures = [] ) {\n\n\tconst textureCount = parser.json.textures?.length || 0;\n\tconst result = new Array( textureCount ).fill( null );\n\n\tpropertyTextures.forEach( ( { properties } ) => {\n\n\t\tfor ( const key in properties ) {\n\n\t\t\tconst { index } = properties[ key ];\n\t\t\tif ( result[ index ] === null ) {\n\n\t\t\t\tresult[ index ] = parser.loadTexture( index );\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\treturn Promise.all( result );\n\n}\n\n// returns the set of buffers required by the property table definitions\nfunction getRelevantBuffers( parser, propertyTables = [] ) {\n\n\tconst textureCount = parser.json.bufferViews?.length || 0;\n\tconst result = new Array( textureCount ).fill( null );\n\n\tpropertyTables.forEach( ( { properties } ) => {\n\n\t\tfor ( const key in properties ) {\n\n\t\t\tconst { values, arrayOffsets, stringOffsets } = properties[ key ];\n\t\t\tif ( result[ values ] === null ) {\n\n\t\t\t\tresult[ values ] = parser.loadBufferView( values );\n\n\t\t\t}\n\n\t\t\tif ( result[ arrayOffsets ] === null ) {\n\n\t\t\t\tresult[ arrayOffsets ] = parser.loadBufferView( arrayOffsets );\n\n\t\t\t}\n\n\t\t\tif ( result[ stringOffsets ] === null ) {\n\n\t\t\t\tresult[ stringOffsets ] = parser.loadBufferView( stringOffsets );\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\treturn Promise.all( result );\n\n}\n\nexport class GLTFStructuralMetadataExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXT_NAME;\n\n\t}\n\n\tasync afterRoot( { scene, parser } ) {\n\n\t\t// skip if the extension is not present\n\t\tconst extensionsUsed = parser.json.extensionsUsed;\n\t\tif ( ! extensionsUsed || ! extensionsUsed.includes( EXT_NAME ) ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// load the remote schema definition if present\n\t\tlet schemaPromise = null;\n\t\tlet rootExtension = parser.json.extensions[ EXT_NAME ];\n\t\tif ( rootExtension.schemaUri ) {\n\n\t\t\t// TODO: cache the loaded schema so we can share it and dispose of it when the\n\t\t\t// extension is no longer available\n\t\t\tconst { manager, path, requestHeader, crossOrigin } = parser.options;\n\t\t\tconst finalUri = new URL( rootExtension.schemaUri, path ).toString();\n\t\t\tconst fileLoader = new FileLoader( manager );\n\t\t\tfileLoader.setCrossOrigin( crossOrigin );\n\t\t\tfileLoader.setResponseType( 'json' );\n\t\t\tfileLoader.setRequestHeader( requestHeader );\n\n\t\t\tschemaPromise = fileLoader.loadAsync( finalUri )\n\t\t\t\t.then( schema => {\n\n\t\t\t\t\trootExtension = { ...rootExtension, schema };\n\n\t\t\t\t} );\n\n\t\t}\n\n\t\t// prep the textures and buffers\n\t\tconst [ textures, buffers ] = await Promise.all( [\n\t\t\tgetRelevantTextures( parser, rootExtension.propertyTextures ),\n\t\t\tgetRelevantBuffers( parser, rootExtension.propertyTables ),\n\t\t\tschemaPromise,\n\t\t] );\n\n\t\t// initialize the extension\n\t\tconst rootMetadata = new StructuralMetadata( rootExtension, textures, buffers );\n\t\tscene.userData.structuralMetadata = rootMetadata;\n\n\t\tscene.traverse( child => {\n\n\t\t\tif ( parser.associations.has( child ) ) {\n\n\t\t\t\t// check if this object has extension references and use a child-specific version of the extension\n\t\t\t\tconst { meshes, primitives } = parser.associations.get( child );\n\t\t\t\tconst primitive = parser.json.meshes[ meshes ]?.primitives[ primitives ];\n\t\t\t\tif ( primitive && primitive.extensions && primitive.extensions[ EXT_NAME ] ) {\n\n\t\t\t\t\tconst extension = primitive.extensions[ EXT_NAME ];\n\t\t\t\t\tchild.userData.structuralMetadata = new StructuralMetadata( rootExtension, textures, buffers, extension, child );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.userData.structuralMetadata = rootMetadata;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\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 { MeshFeatures } from './metadata/classes/MeshFeatures.js';\n\n// https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_mesh_features\n\nconst EXT_NAME = 'EXT_mesh_features';\n\nfunction forEachPrimitiveExtension( scene, parser, callback ) {\n\n\tscene.traverse( c => {\n\n\t\tif ( parser.associations.has( c ) ) {\n\n\t\t\t// check if this object has extension references\n\t\t\tconst { meshes, primitives } = parser.associations.get( c );\n\n\t\t\tconst primitive = parser.json.meshes[ meshes ]?.primitives[ primitives ];\n\n\t\t\tif ( primitive && primitive.extensions && primitive.extensions[ EXT_NAME ] ) {\n\n\t\t\t\tcallback( c, primitive.extensions[ EXT_NAME ] );\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n}\n\nexport class GLTFMeshFeaturesExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXT_NAME;\n\n\t}\n\n\tasync afterRoot( { scene, parser } ) {\n\n\t\t// skip if the extension is not present\n\t\tconst extensionsUsed = parser.json.extensionsUsed;\n\t\tif ( ! extensionsUsed || ! extensionsUsed.includes( EXT_NAME ) ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// get fetch the relevant textures are loaded\n\t\tconst textureCount = parser.json.textures?.length || 0;\n\t\tconst promises = new Array( textureCount ).fill( null );\n\t\tforEachPrimitiveExtension( scene, parser, ( child, { featureIds } ) => {\n\n\t\t\tfeatureIds.forEach( info => {\n\n\t\t\t\tif ( info.texture && promises[ info.texture.index ] === null ) {\n\n\t\t\t\t\tconst index = info.texture.index;\n\t\t\t\t\tpromises[ index ] = parser.loadTexture( index );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} );\n\n\t\t// initialize mesh features on each primitive\n\t\tconst textures = await Promise.all( promises );\n\t\tforEachPrimitiveExtension( scene, parser, ( child, extension ) => {\n\n\t\t\tchild.userData.meshFeatures = new MeshFeatures( child.geometry, textures, extension );\n\n\t\t} );\n\n\t}\n\n}\n","export class GLTFCesiumRTCExtension {\n\n\tconstructor() {\n\n\t\tthis.name = 'CESIUM_RTC';\n\n\t}\n\n\tafterRoot( res ) {\n\n\t\tif ( res.parser.json.extensions && res.parser.json.extensions.CESIUM_RTC ) {\n\n\t\t\tconst { center } = res.parser.json.extensions.CESIUM_RTC;\n\n\t\t\tif ( center ) {\n\n\t\t\t\tres.scene.position.x += center[ 0 ];\n\t\t\t\tres.scene.position.y += center[ 1 ];\n\t\t\t\tres.scene.position.z += center[ 2 ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n","import { Sphere, Vector3 } from 'three';\nimport { OBJECT_FRAME } from '../../three/math/Ellipsoid.js';\n\nconst sphere = /* @__PURE__ */ new Sphere();\nconst vec = /* @__PURE__ */ new Vector3();\nexport class ReorientationPlugin {\n\n\tconstructor( options ) {\n\n\t\toptions = {\n\t\t\tup: '+z',\n\t\t\trecenter: true,\n\n\t\t\tlat: null,\n\t\t\tlon: null,\n\t\t\theight: 0,\n\t\t\t...options,\n\t\t};\n\n\t\tthis.tiles = null;\n\n\t\tthis.up = options.up.toLowerCase().replace( /\\s+/, '' );\n\t\tthis.lat = options.lat;\n\t\tthis.lon = options.lon;\n\t\tthis.height = options.height;\n\t\tthis.recenter = options.recenter;\n\t\tthis._callback = null;\n\n\t}\n\n\tinit( tiles ) {\n\n\t\tthis.tiles = tiles;\n\n\t\tthis._callback = () => {\n\n\t\t\tconst { up, lat, lon, height, recenter } = this;\n\n\t\t\tif ( lat !== null && lon !== null ) {\n\n\t\t\t\t// if the latitude and longitude are provided then remove the position offset\n\t\t\t\tthis.transformLatLonHeightToOrigin( lat, lon, height );\n\n\t\t\t} else {\n\n\t\t\t\tconst { ellipsoid } = tiles;\n\t\t\t\tconst minRadii = Math.min( ...ellipsoid.radius );\n\t\t\t\ttiles.getBoundingSphere( sphere );\n\t\t\t\tif ( sphere.center.length() > minRadii * 0.5 ) {\n\n\t\t\t\t\t// otherwise see if this is possibly a tile set on the surface of the globe based on the positioning\n\t\t\t\t\tconst cart = {};\n\t\t\t\t\tellipsoid.getPositionToCartographic( sphere.center, cart );\n\t\t\t\t\tthis.transformLatLonHeightToOrigin( cart.lat, cart.lon, cart.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// lastly fall back to orienting the up direction to +Y\n\t\t\t\t\tconst group = tiles.group;\n\t\t\t\t\tgroup.rotation.set( 0, 0, 0 );\n\t\t\t\t\tswitch ( up ) {\n\n\t\t\t\t\t\tcase 'x': case '+x':\n\t\t\t\t\t\t\tgroup.rotation.z = Math.PI / 2;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase '-x':\n\t\t\t\t\t\t\tgroup.rotation.z = - Math.PI / 2;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'y': case '+y':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase '-y':\n\t\t\t\t\t\t\tgroup.rotation.z = Math.PI;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'z': case '+z':\n\t\t\t\t\t\t\tgroup.rotation.x = - Math.PI / 2;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase '-z':\n\t\t\t\t\t\t\tgroup.rotation.x = Math.PI / 2;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttiles.group.position\n\t\t\t\t\t\t.copy( sphere.center )\n\t\t\t\t\t\t.applyEuler( group.rotation )\n\t\t\t\t\t\t.multiplyScalar( - 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! recenter ) {\n\n\t\t\t\ttiles.group.position.setScalar( 0 );\n\n\t\t\t}\n\n\t\t\ttiles.removeEventListener( 'load-tile-set', this._callback );\n\n\t\t};\n\n\t\ttiles.addEventListener( 'load-tile-set', this._callback );\n\n\t}\n\n\ttransformLatLonHeightToOrigin( lat, lon, height = 0 ) {\n\n\t\tconst { group, ellipsoid } = this.tiles;\n\n\t\t// get ENU orientation (Z facing north and X facing west) and position\n\t\tellipsoid.getRotationMatrixFromAzElRoll( lat, lon, 0, 0, 0, group.matrix, OBJECT_FRAME );\n\t\tellipsoid.getCartographicToPosition( lat, lon, height, vec );\n\n\t\t// adjust the group matrix\n\t\tgroup.matrix\n\t\t\t.setPosition( vec )\n\t\t\t.invert()\n\t\t\t.decompose( group.position, group.quaternion, group.scale );\n\t\tgroup.updateMatrixWorld();\n\n\t}\n\n\tdispose() {\n\n\t\tconst { group } = this.tiles;\n\t\tgroup.position.setScalar( 0 );\n\t\tgroup.quaternion.identity();\n\t\tgroup.scale.set( 1, 1, 1 );\n\n\t\tthis.tiles.addEventListener( 'load-tile-set', this._callback );\n\n\t}\n\n}\n","import { LRUCache } from '../../utilities/LRUCache.js';\n\n// Plugin that disposes tiles on unload to remove them from the GPU, saving memory\n\n// TODO:\n// - abstract the \"tile visible\" callback so fade tiles can call it when tiles are _actually_ marked as non-visible\nexport class UnloadTilesPlugin {\n\n\tset delay( v ) {\n\n\t\tthis.deferCallbacks.delay = v;\n\n\t}\n\n\tget delay() {\n\n\t\treturn this.deferCallbacks.delay;\n\n\t}\n\n\tset bytesTarget( v ) {\n\n\t\tthis.lruCache.minBytesSize = v;\n\n\t}\n\n\tget bytesTarget() {\n\n\t\treturn this.lruCache.minBytesSize;\n\n\t}\n\n\tget estimatedGpuBytes() {\n\n\t\treturn this.lruCache.cachedBytes;\n\n\t}\n\n\tconstructor( options = {} ) {\n\n\t\tconst {\n\t\t\tdelay = 0,\n\t\t\tbytesTarget = 0,\n\t\t} = options;\n\n\t\tthis.name = 'UNLOAD_TILES_PLUGIN';\n\n\t\tthis.tiles = null;\n\t\tthis.lruCache = new LRUCache();\n\t\tthis.deferCallbacks = new DeferCallbackManager();\n\n\t\tthis.delay = delay;\n\t\tthis.bytesTarget = bytesTarget;\n\n\t}\n\n\tinit( tiles ) {\n\n\t\tthis.tiles = tiles;\n\n\t\tconst { lruCache, deferCallbacks } = this;\n\t\tdeferCallbacks.callback = tile => {\n\n\t\t\tlruCache.markUnused( tile );\n\t\t\tlruCache.scheduleUnload( false );\n\n\t\t};\n\n\t\tconst unloadCallback = tile => {\n\n\t\t\tconst scene = tile.cached.scene;\n\t\t\tconst visible = tiles.visibleTiles.has( tile );\n\n\t\t\tif ( ! visible ) {\n\n\t\t\t\ttiles.invokeOnePlugin( plugin => plugin.unloadTileFromGPU && plugin.unloadTileFromGPU( scene, tile ) );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis._onUpdateBefore = () => {\n\n\t\t\t// update lruCache in \"update\" in case the callback values change\n\t\t\tlruCache.unloadPriorityCallback = tiles.lruCache.unloadPriorityCallback;\n\t\t\tlruCache.computeMemoryUsageCallback = tiles.lruCache.computeMemoryUsageCallback;\n\t\t\tlruCache.minSize = Infinity;\n\t\t\tlruCache.maxSize = Infinity;\n\t\t\tlruCache.maxBytesSize = Infinity;\n\t\t\tlruCache.unloadPercent = 1;\n\t\t\tlruCache.autoMarkUnused = false;\n\n\t\t};\n\n\t\tthis._onVisibilityChangeCallback = ( { tile, visible } ) => {\n\n\t\t\tif ( visible ) {\n\n\t\t\t\tlruCache.add( tile, unloadCallback );\n\t\t\t\ttiles.markTileUsed( tile );\n\t\t\t\tdeferCallbacks.cancel( tile );\n\n\t\t\t} else {\n\n\t\t\t\tdeferCallbacks.run( tile );\n\n\t\t\t}\n\n\t\t};\n\n\t\ttiles.forEachLoadedModel( ( scene, tile ) => {\n\n\t\t\tconst visible = tiles.visibleTiles.has( tile );\n\t\t\tthis._onVisibilityChangeCallback( { scene, visible } );\n\n\t\t} );\n\n\t\ttiles.addEventListener( 'tile-visibility-change', this._onVisibilityChangeCallback );\n\t\ttiles.addEventListener( 'update-before', this._onUpdateBefore );\n\n\t}\n\n\tunloadTileFromGPU( scene, tile ) {\n\n\t\tif ( scene ) {\n\n\t\t\tscene.traverse( c => {\n\n\t\t\t\tif ( c.material ) {\n\n\t\t\t\t\tconst material = c.material;\n\t\t\t\t\tmaterial.dispose();\n\n\t\t\t\t\tfor ( const key in material ) {\n\n\t\t\t\t\t\tconst value = material[ key ];\n\t\t\t\t\t\tif ( value && value.isTexture ) {\n\n\t\t\t\t\t\t\tvalue.dispose();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( c.geometry ) {\n\n\t\t\t\t\tc.geometry.dispose();\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\tdispose() {\n\n\t\tthis.tiles.removeEventListener( 'tile-visibility-change', this._onVisibilityChangeCallback );\n\t\tthis.tiles.removeEventListener( 'update-before', this._onUpdateBefore );\n\t\tthis.deferCallbacks.cancelAll();\n\n\t}\n\n}\n\n// Manager for running callbacks after a certain amount of time\nclass DeferCallbackManager {\n\n\tconstructor( callback = () => {} ) {\n\n\t\tthis.map = new Map();\n\t\tthis.callback = callback;\n\t\tthis.delay = 0;\n\n\t}\n\n\trun( tile ) {\n\n\t\tconst { map, delay } = this;\n\t\tif ( map.has( tile ) ) {\n\n\t\t\tthrow new Error( 'DeferCallbackManager: Callback already initialized.' );\n\n\t\t}\n\n\t\tif ( delay === 0 ) {\n\n\t\t\tthis.callback( tile );\n\n\t\t} else {\n\n\t\t\tmap.set( tile, setTimeout( () => this.callback( tile ), delay ) );\n\n\t\t}\n\n\t}\n\n\tcancel( tile ) {\n\n\t\tconst { map } = this;\n\t\tif ( map.has( tile ) ) {\n\n\t\t\tclearTimeout( map.get( tile ) );\n\t\t\tmap.delete( tile );\n\n\t\t}\n\n\t}\n\n\tcancelAll() {\n\n\t\tthis.map.forEach( ( value, tile ) => {\n\n\t\t\tthis.cancel( tile );\n\n\t\t} );\n\n\t}\n\n}\n","import { MathUtils } from 'three';\n\nconst { clamp } = MathUtils;\nexport class FadeManager {\n\n\tconstructor() {\n\n\t\tthis.duration = 250;\n\t\tthis.fadeCount = 0;\n\t\tthis._lastTick = - 1;\n\t\tthis._fadeState = new Map();\n\t\tthis.onFadeComplete = null;\n\t\tthis.onFadeStart = null;\n\t\tthis.onFadeSetComplete = null;\n\t\tthis.onFadeSetStart = null;\n\n\t}\n\n\t// delete the object from the fade, reset the material data\n\tdeleteObject( object ) {\n\n\t\tif ( ! object ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.completeFade( object );\n\n\t}\n\n\t// Ensure we're storing a fade timer for the provided object\n\t// Returns whether a new state had to be added\n\tguaranteeState( object ) {\n\n\t\tconst fadeState = this._fadeState;\n\t\tif ( fadeState.has( object ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tconst state = {\n\t\t\tfadeInTarget: 0,\n\t\t\tfadeOutTarget: 0,\n\t\t\tfadeIn: 0,\n\t\t\tfadeOut: 0,\n\t\t};\n\n\t\tfadeState.set( object, state );\n\n\t\treturn true;\n\n\t}\n\n\t// Force the fade to complete in the direction it is already trending\n\tcompleteFade( object ) {\n\n\t\tconst fadeState = this._fadeState;\n\t\tif ( ! fadeState.has( object ) ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst visible = fadeState.get( object ).fadeOutTarget === 0;\n\n\t\tfadeState.delete( object );\n\n\t\t// fire events\n\t\tthis.fadeCount --;\n\n\t\tif ( this.onFadeComplete ) {\n\n\t\t\tthis.onFadeComplete( object, visible );\n\n\t\t}\n\n\t\tif ( this.fadeCount === 0 && this.onFadeSetComplete ) {\n\n\t\t\tthis.onFadeSetComplete();\n\n\t\t}\n\n\t}\n\n\tcompleteAllFades() {\n\n\t\tthis._fadeState.forEach( ( value, key ) => {\n\n\t\t\tthis.completeFade( key );\n\n\t\t} );\n\n\t}\n\n\tforEachObject( cb ) {\n\n\t\tthis._fadeState.forEach( ( info, object ) => {\n\n\t\t\tcb( object, info );\n\n\t\t} );\n\n\t}\n\n\t// Fade the object in\n\tfadeIn( object ) {\n\n\t\tconst noState = this.guaranteeState( object );\n\t\tconst state = this._fadeState.get( object );\n\t\tstate.fadeInTarget = 1;\n\t\tstate.fadeOutTarget = 0;\n\t\tstate.fadeOut = 0;\n\n\t\t// Fire events\n\t\tif ( noState ) {\n\n\t\t\tthis.fadeCount ++;\n\t\t\tif ( this.fadeCount === 1 && this.onFadeSetStart ) {\n\n\t\t\t\tthis.onFadeSetStart();\n\n\t\t\t}\n\n\t\t\tif ( this.onFadeStart ) {\n\n\t\t\t\tthis.onFadeStart( object );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// Fade the object out\n\tfadeOut( object ) {\n\n\t\tconst noState = this.guaranteeState( object );\n\t\tconst state = this._fadeState.get( object );\n\t\tstate.fadeOutTarget = 1;\n\n\t\t// Fire events and initialize state\n\t\tif ( noState ) {\n\n\t\t\tstate.fadeInTarget = 1;\n\t\t\tstate.fadeIn = 1;\n\n\t\t\tthis.fadeCount ++;\n\t\t\tif ( this.fadeCount === 1 && this.onFadeSetStart ) {\n\n\t\t\t\tthis.onFadeSetStart();\n\n\t\t\t}\n\n\t\t\tif ( this.onFadeStart ) {\n\n\t\t\t\tthis.onFadeStart( object );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tisFading( object ) {\n\n\t\treturn this._fadeState.has( object );\n\n\t}\n\n\tisFadingOut( object ) {\n\n\t\tconst state = this._fadeState.get( object );\n\t\treturn state && state.fadeOutTarget === 1;\n\n\t}\n\n\t// Tick the fade timer for each actively fading object\n\tupdate() {\n\n\t\t// clamp delta in case duration is really small or 0\n\t\tconst time = window.performance.now();\n\t\tif ( this._lastTick === - 1 ) {\n\n\t\t\tthis._lastTick = time;\n\n\t\t}\n\n\t\tconst delta = clamp( ( time - this._lastTick ) / this.duration, 0, 1 );\n\t\tthis._lastTick = time;\n\n\t\tconst fadeState = this._fadeState;\n\t\tfadeState.forEach( ( state, object ) => {\n\n\t\t\t// tick the fade values\n\t\t\tconst {\n\t\t\t\tfadeOutTarget,\n\t\t\t\tfadeInTarget,\n\t\t\t} = state;\n\n\t\t\tlet {\n\t\t\t\tfadeOut,\n\t\t\t\tfadeIn,\n\t\t\t} = state;\n\n\t\t\tconst fadeInSign = Math.sign( fadeInTarget - fadeIn );\n\t\t\tfadeIn = clamp( fadeIn + fadeInSign * delta, 0, 1 );\n\n\t\t\tconst fadeOutSign = Math.sign( fadeOutTarget - fadeOut );\n\t\t\tfadeOut = clamp( fadeOut + fadeOutSign * delta, 0, 1 );\n\n\t\t\tstate.fadeIn = fadeIn;\n\t\t\tstate.fadeOut = fadeOut;\n\n\t\t\t// Check if the fade in and fade out animations are complete\n\t\t\tconst fadeOutComplete = fadeOut === 1 || fadeOut === 0;\n\t\t\tconst fadeInComplete = fadeIn === 1 || fadeIn === 0;\n\n\t\t\t// If they are or the fade out animation is further along than the\n\t\t\t// fade in animation then mark the fade as completed for this tile\n\t\t\tif ( ( fadeOutComplete && fadeInComplete ) || fadeOut >= fadeIn ) {\n\n\t\t\t\tthis.completeFade( object );\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n}\n","// Adjusts the provided material to support fading in and out using a bayer pattern. Providing a \"previous\"\n// before compile can be used to chain shader adjustments. Returns the added uniforms used for fading.\nexport function wrapFadeMaterial( material, previousOnBeforeCompile ) {\n\n\tconst params = {\n\t\tfadeIn: { value: 0 },\n\t\tfadeOut: { value: 0 },\n\t\tfadeTexture: { value: null },\n\t};\n\n\tmaterial.defines = {\n\t\t...( material.defines || {} ),\n\t\tFEATURE_FADE: 0,\n\t};\n\n\tmaterial.onBeforeCompile = shader => {\n\n\t\tif ( previousOnBeforeCompile ) {\n\n\t\t\tpreviousOnBeforeCompile( shader );\n\n\t\t}\n\n\t\tshader.uniforms = {\n\t\t\t...shader.uniforms,\n\t\t\t...params,\n\t\t};\n\n\t\tshader.vertexShader = shader.vertexShader\n\t\t\t.replace(\n\t\t\t\t/void\\s+main\\(\\)\\s+{/,\n\t\t\t\tvalue => /* glsl */`\n\t\t\t\t\t#ifdef USE_BATCHING_FRAG\n\n\t\t\t\t\tvarying float vBatchId;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\t${ value }\n\n\t\t\t\t\t\t#ifdef USE_BATCHING_FRAG\n\n\t\t\t\t\t\t// add 0.5 to the value to avoid floating error that may cause flickering\n\t\t\t\t\t\tvBatchId = getIndirectIndex( gl_DrawID ) + 0.5;\n\n\t\t\t\t\t\t#endif\n\t\t\t\t`\n\t\t\t);\n\n\t\tshader.fragmentShader = shader.fragmentShader\n\t\t\t.replace( /void main\\(/, value => /* glsl */`\n\t\t\t\t#if FEATURE_FADE\n\n\t\t\t\t// adapted from https://www.shadertoy.com/view/Mlt3z8\n\t\t\t\tfloat bayerDither2x2( vec2 v ) {\n\n\t\t\t\t\treturn mod( 3.0 * v.y + 2.0 * v.x, 4.0 );\n\n\t\t\t\t}\n\n\t\t\t\tfloat bayerDither4x4( vec2 v ) {\n\n\t\t\t\t\tvec2 P1 = mod( v, 2.0 );\n\t\t\t\t\tvec2 P2 = floor( 0.5 * mod( v, 4.0 ) );\n\t\t\t\t\treturn 4.0 * bayerDither2x2( P1 ) + bayerDither2x2( P2 );\n\n\t\t\t\t}\n\n\t\t\t\t// the USE_BATCHING define is not available in fragment shaders\n\t\t\t\t#ifdef USE_BATCHING_FRAG\n\n\t\t\t\t// functions for reading the fade state of a given batch id\n\t\t\t\tuniform sampler2D fadeTexture;\n\t\t\t\tvarying float vBatchId;\n\t\t\t\tvec2 getFadeValues( const in float i ) {\n\n\t\t\t\t\tint size = textureSize( fadeTexture, 0 ).x;\n\t\t\t\t\tint j = int( i );\n\t\t\t\t\tint x = j % size;\n\t\t\t\t\tint y = j / size;\n\t\t\t\t\treturn texelFetch( fadeTexture, ivec2( x, y ), 0 ).rg;\n\n\t\t\t\t}\n\n\t\t\t\t#else\n\n\t\t\t\tuniform float fadeIn;\n\t\t\t\tuniform float fadeOut;\n\n\t\t\t\t#endif\n\n\t\t\t\t#endif\n\n\t\t\t\t${ value }\n\t\t\t` )\n\t\t\t.replace( /#include <dithering_fragment>/, value => /* glsl */`\n\n\t\t\t\t${ value }\n\n\t\t\t\t#if FEATURE_FADE\n\n\t\t\t\t#ifdef USE_BATCHING_FRAG\n\n\t\t\t\tvec2 fadeValues = getFadeValues( vBatchId );\n\t\t\t\tfloat fadeIn = fadeValues.r;\n\t\t\t\tfloat fadeOut = fadeValues.g;\n\n\t\t\t\t#endif\n\n\t\t\t\tfloat bayerValue = bayerDither4x4( floor( mod( gl_FragCoord.xy, 4.0 ) ) );\n\t\t\t\tfloat bayerBins = 16.0;\n\t\t\t\tfloat dither = ( 0.5 + bayerValue ) / bayerBins;\n\t\t\t\tif ( dither >= fadeIn ) {\n\n\t\t\t\t\tdiscard;\n\n\t\t\t\t}\n\n\t\t\t\tif ( dither < fadeOut ) {\n\n\t\t\t\t\tdiscard;\n\n\t\t\t\t}\n\n\t\t\t\t#endif\n\n\t\t\t` );\n\n\t};\n\n\treturn params;\n\n}\n","import { wrapFadeMaterial } from './wrapFadeMaterial.js';\n\n// Class for managing and updating extended fade parameters\nexport class FadeMaterialManager {\n\n\tconstructor() {\n\n\t\tthis._fadeParams = new WeakMap();\n\t\tthis.fading = 0;\n\n\t}\n\n\t// Set the fade parameters for the given scene\n\tsetFade( scene, fadeIn, fadeOut ) {\n\n\t\tif ( ! scene ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// traverse the scene and update the fade parameters of all materials\n\t\tconst fadeParams = this._fadeParams;\n\t\tscene.traverse( child => {\n\n\t\t\tconst material = child.material;\n\t\t\tif ( material ) {\n\n\t\t\t\tconst params = fadeParams.get( material );\n\t\t\t\tparams.fadeIn.value = fadeIn;\n\t\t\t\tparams.fadeOut.value = fadeOut;\n\n\t\t\t\tconst fadeInComplete = fadeIn === 0 || fadeIn === 1;\n\t\t\t\tconst fadeOutComplete = fadeOut === 0 || fadeOut === 1;\n\t\t\t\tconst value = Number( ! fadeInComplete || ! fadeOutComplete );\n\t\t\t\tif ( material.defines.FEATURE_FADE !== value ) {\n\n\t\t\t\t\tthis.fading += value === 1 ? 1 : - 1;\n\t\t\t\t\tmaterial.defines.FEATURE_FADE = value;\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t// initialize materials in the object\n\tprepareScene( scene ) {\n\n\t\tscene.traverse( child => {\n\n\t\t\tif ( child.material ) {\n\n\t\t\t\tthis.prepareMaterial( child.material );\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t// delete the object from the fade, reset the material data\n\tdeleteScene( scene ) {\n\n\t\tif ( ! scene ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// revert the materials\n\t\tconst fadeParams = this._fadeParams;\n\t\tscene.traverse( child => {\n\n\t\t\tconst material = child.material;\n\t\t\tif ( material ) {\n\n\t\t\t\tfadeParams.delete( material );\n\t\t\t\tmaterial.onBeforeCompile = () => {};\n\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t// initialize the material\n\tprepareMaterial( material ) {\n\n\t\tconst fadeParams = this._fadeParams;\n\t\tif ( fadeParams.has( material ) ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tfadeParams.set( material, wrapFadeMaterial( material ) );\n\n\t}\n\n}\n","import { MeshBasicMaterial } from 'three';\n\n// A hacky version of BatchedMesh that passes through functions and geometry and other fields from the underlying\n// BatchedMesh. Calls to \"this\" or \"super\" will not work in subfunctions.\nexport class PassThroughBatchedMesh {\n\n\tconstructor( other, material = new MeshBasicMaterial() ) {\n\n\t\t// the other batched mesh\n\t\tthis.other = other;\n\n\t\t// guarded fields\n\t\tthis.material = material;\n\t\tthis.visible = true;\n\t\tthis.parent = null;\n\t\tthis._instanceInfo = [];\n\t\tthis._visibilityChanged = true;\n\n\t\t// the proxy instance tht pass through arguments to the underlying mesh\n\t\tconst proxyTarget = new Proxy( this, {\n\n\t\t\tget( target, key ) {\n\n\t\t\t\tif ( key in target ) {\n\n\t\t\t\t\treturn target[ key ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// sync instances on function call and call functions on \"this\" instance\n\t\t\t\t\tconst value = other[ key ];\n\t\t\t\t\tif ( value instanceof Function ) {\n\n\t\t\t\t\t\treturn ( ...args ) => {\n\n\t\t\t\t\t\t\ttarget.syncInstances();\n\t\t\t\t\t\t\treturn value.call( proxyTarget, ...args );\n\n\t\t\t\t\t\t};\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn other[ key ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tset( target, key, value ) {\n\n\t\t\t\tif ( key in target ) {\n\n\t\t\t\t\ttarget[ key ] = value;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tother[ key ] = value;\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t},\n\n\t\t\tdeleteProperty( target, key ) {\n\n\t\t\t\tif ( key in target ) {\n\n\t\t\t\t\treturn delete target[ key ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn delete other[ key ];\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\t// ownKeys() {},\n\t\t\t// has(target, key) {},\n\t\t\t// defineProperty(target, key, descriptor) {},\n\t\t\t// getOwnPropertyDescriptor(target, key) {},\n\n\t\t} );\n\n\t\treturn proxyTarget;\n\n\t}\n\n\tsyncInstances() {\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tconst otherInstanceInfo = this.other._instanceInfo;\n\t\twhile ( otherInstanceInfo.length > instanceInfo.length ) {\n\n\t\t\tconst index = instanceInfo.length;\n\t\t\tinstanceInfo.push( new Proxy( { visible: false }, {\n\n\t\t\t\tget( target, key ) {\n\n\t\t\t\t\tif ( key in target ) {\n\n\t\t\t\t\t\treturn target[ key ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn otherInstanceInfo[ index ][ key ];\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tset( target, key, value ) {\n\n\t\t\t\t\tif ( key in target ) {\n\n\t\t\t\t\t\ttarget[ key ] = value;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\totherInstanceInfo[ index ][ key ] = value;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t} ) );\n\n\t\t}\n\n\t}\n\n}\n","import { PassThroughBatchedMesh } from './PassThroughBatchedMesh.js';\nimport { RGFormat, UnsignedByteType, DataTexture } from 'three';\nimport { wrapFadeMaterial } from './wrapFadeMaterial.js';\n\n// BatchedMesh instance that can fade materials\nexport class FadeBatchedMesh extends PassThroughBatchedMesh {\n\n\tconstructor( ...args ) {\n\n\t\tsuper( ...args );\n\n\t\t// construct a version of the material that supports fading\n\t\tconst material = this.material;\n\t\tconst params = wrapFadeMaterial( material, material.onBeforeCompile );\n\t\tmaterial.defines.FEATURE_FADE = 1;\n\t\tmaterial.defines.USE_BATCHING_FRAG = 1;\n\t\tmaterial.needsUpdate = true;\n\n\t\t// fade parameters\n\t\tthis.fadeTexture = null;\n\t\tthis._fadeParams = params;\n\n\t}\n\n\t// Set the fade state\n\tsetFadeAt( index, fadeIn, fadeOut ) {\n\n\t\tthis._initFadeTexture();\n\t\tthis.fadeTexture.setValueAt( index, fadeIn * 255, fadeOut * 255 );\n\n\t}\n\n\t// initialize the texture and resize it if needed\n\t_initFadeTexture() {\n\n\t\t// calculate the new size\n\t\tlet size = Math.sqrt( this._maxInstanceCount );\n\t\tsize = Math.ceil( size );\n\n\t\tconst length = size * size * 2;\n\t\tconst oldFadeTexture = this.fadeTexture;\n\t\tif ( ! oldFadeTexture || oldFadeTexture.image.data.length !== length ) {\n\n\t\t\t// 2 bytes per RG pixel\n\t\t\tconst fadeArray = new Uint8Array( length );\n\t\t\tconst fadeTexture = new InstanceDataTexture( fadeArray, size, size, RGFormat, UnsignedByteType );\n\n\t\t\t// copy the data from the old fade texture if it exists\n\t\t\tif ( oldFadeTexture ) {\n\n\t\t\t\toldFadeTexture.dispose();\n\n\t\t\t\tconst src = oldFadeTexture.image.data;\n\t\t\t\tconst dst = this.fadeTexture.image.data;\n\t\t\t\tconst len = Math.min( src.length, dst.length );\n\t\t\t\tdst.set( new src.constructor( src.buffer, 0, len ) );\n\n\t\t\t}\n\n\t\t\t// assign the new fade texture to the uniform, member variable\n\t\t\tthis.fadeTexture = fadeTexture;\n\t\t\tthis._fadeParams.fadeTexture.value = fadeTexture;\n\t\t\tfadeTexture.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t// dispose the fade texture. Super cannot be used here due to proxy\n\tdispose() {\n\n\t\tif ( this.fadeTexture ) {\n\n\t\t\tthis.fadeTexture.dispose();\n\n\t\t}\n\n\t}\n\n}\n\n// Version of data texture that can assign pixel values\nclass InstanceDataTexture extends DataTexture {\n\n\tsetValueAt( instance, ...values ) {\n\n\t\tconst { data, width, height } = this.image;\n\t\tconst itemSize = Math.floor( data.length / ( width * height ) );\n\t\tlet needsUpdate = false;\n\t\tfor ( let i = 0; i < itemSize; i ++ ) {\n\n\t\t\tconst index = instance * itemSize + i;\n\t\t\tconst prevValue = data[ index ];\n\t\t\tconst newValue = values[ i ] || 0;\n\t\t\tif ( prevValue !== newValue ) {\n\n\t\t\t\tdata[ index ] = newValue;\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n}\n","import { Matrix4, Vector3, Quaternion } from 'three';\nimport { FadeManager } from './FadeManager.js';\nimport { FadeMaterialManager } from './FadeMaterialManager.js';\nimport { FadeBatchedMesh } from './FadeBatchedMesh.js';\n\nconst HAS_POPPED_IN = Symbol( 'HAS_POPPED_IN' );\nconst _fromPos = new Vector3();\nconst _toPos = new Vector3();\nconst _fromQuat = new Quaternion();\nconst _toQuat = new Quaternion();\nconst _scale = new Vector3();\n\nfunction onUpdateBefore() {\n\n\tconst fadeManager = this._fadeManager;\n\tconst tiles = this.tiles;\n\n\t// store the tiles renderer state before the tiles update so we can check\n\t// whether fading started or stopped completely\n\tthis._fadingBefore = fadeManager.fadeCount;\n\tthis._displayActiveTiles = tiles.displayActiveTiles;\n\n\t// we need to display all active tiles in this case so we don't fade tiles in\n\t// when moving from off screen\n\ttiles.displayActiveTiles = true;\n\n}\n\nfunction onUpdateAfter() {\n\n\tconst fadeManager = this._fadeManager;\n\tconst fadeMaterialManager = this._fadeMaterialManager;\n\tconst displayActiveTiles = this._displayActiveTiles;\n\tconst fadingBefore = this._fadingBefore;\n\tconst prevCameraTransforms = this._prevCameraTransforms;\n\tconst { tiles, maximumFadeOutTiles, batchedMesh } = this;\n\tconst { cameras } = tiles;\n\n\t// reset the active tiles flag\n\ttiles.displayActiveTiles = displayActiveTiles;\n\n\t// update fade step\n\tfadeManager.update();\n\n\t// fire an event\n\tconst fadingAfter = fadeManager.fadeCount;\n\tif ( fadingBefore !== 0 && fadingAfter !== 0 ) {\n\n\t\ttiles.dispatchEvent( { type: 'fade-change' } );\n\t\ttiles.dispatchEvent( { type: 'needs-render' } );\n\n\t}\n\n\t// update the visibility of tiles based on visibility since we must use\n\t// the active tiles for rendering fade\n\tif ( ! displayActiveTiles ) {\n\n\t\ttiles.visibleTiles.forEach( t => {\n\n\t\t\t// if a tile is fading out then it may not be traversed and thus will not have\n\t\t\t// the frustum flag set correctly.\n\t\t\tconst scene = t.cached.scene;\n\t\t\tif ( scene ) {\n\n\t\t\t\tscene.visible = t.__inFrustum;\n\n\t\t\t}\n\n\t\t\tthis.forEachBatchIds( t, ( id, batchedMesh, plugin ) => {\n\n\t\t\t\tbatchedMesh.setVisibleAt( id, t.__inFrustum );\n\t\t\t\tplugin.batchedMesh.setVisibleAt( id, t.__inFrustum );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\tif ( maximumFadeOutTiles < this._fadingOutCount ) {\n\n\t\t// determine whether all the rendering cameras are moving\n\t\t// quickly so we can adjust how tiles fade accordingly\n\t\tlet isMovingFast = true;\n\t\tcameras.forEach( camera => {\n\n\t\t\tif ( ! prevCameraTransforms.has( camera ) ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst currMatrix = camera.matrixWorld;\n\t\t\tconst prevMatrix = prevCameraTransforms.get( camera );\n\n\t\t\tcurrMatrix.decompose( _toPos, _toQuat, _scale );\n\t\t\tprevMatrix.decompose( _fromPos, _fromQuat, _scale );\n\n\t\t\tconst angleTo = _toQuat.angleTo( _fromQuat );\n\t\t\tconst positionTo = _toPos.distanceTo( _fromPos );\n\n\t\t\t// if rotation is moving > 0.25 radians per frame or position is moving > 0.1 units\n\t\t\t// then we are considering the camera to be moving too fast to notice a faster / abrupt fade\n\t\t\tisMovingFast = isMovingFast && ( angleTo > 0.25 || positionTo > 0.1 );\n\n\t\t} );\n\n\t\tif ( isMovingFast ) {\n\n\t\t\tfadeManager.completeAllFades();\n\n\t\t}\n\n\t}\n\n\t// track the camera movement so we can use it for next frame\n\tcameras.forEach( camera => {\n\n\t\tprevCameraTransforms.get( camera ).copy( camera.matrixWorld );\n\n\t} );\n\n\t// update the fade state for each tile\n\tfadeManager.forEachObject( ( tile, { fadeIn, fadeOut } ) => {\n\n\t\t// prevent faded tiles from being unloaded\n\t\tconst scene = tile.cached.scene;\n\t\tconst isFadingOut = fadeManager.isFadingOut( tile );\n\t\ttiles.markTileUsed( tile );\n\t\tif ( scene ) {\n\n\t\t\tfadeMaterialManager.setFade( scene, fadeIn, fadeOut );\n\t\t\tif ( isFadingOut ) {\n\n\t\t\t\tscene.visible = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// fade the tiles and toggle the visibility appropriately\n\t\tthis.forEachBatchIds( tile, ( id, batchedMesh, plugin ) => {\n\n\t\t\tbatchedMesh.setFadeAt( id, fadeIn, fadeOut );\n\t\t\tbatchedMesh.setVisibleAt( id, true );\n\t\t\tplugin.batchedMesh.setVisibleAt( id, false );\n\n\t\t} );\n\n\t} );\n\n\t// update the batched mesh fields\n\tif ( batchedMesh ) {\n\n\t\tconst material = tiles.getPluginByName( 'BATCHED_TILES_PLUGIN' ).batchedMesh.material;\n\t\tbatchedMesh.material.map = material.map;\n\n\t}\n\n}\n\nexport class TilesFadePlugin {\n\n\tget fadeDuration() {\n\n\t\treturn this._fadeManager.duration;\n\n\t}\n\n\tset fadeDuration( value ) {\n\n\t\tthis._fadeManager.duration = Number( value );\n\n\t}\n\n\tget fadingTiles() {\n\n\t\treturn this._fadeManager.fadeCount;\n\n\t}\n\n\tconstructor( options ) {\n\n\t\toptions = {\n\n\t\t\tmaximumFadeOutTiles: 50,\n\t\t\tfadeRootTiles: false,\n\t\t\tfadeDuration: 250,\n\t\t\t...options,\n\n\t\t};\n\n\t\tthis.name = 'FADE_TILES_PLUGIN';\n\t\tthis.priority = - 2;\n\n\t\tthis.tiles = null;\n\t\tthis.batchedMesh = null;\n\t\tthis._fadeManager = new FadeManager();\n\t\tthis._fadeMaterialManager = new FadeMaterialManager();\n\t\tthis._prevCameraTransforms = null;\n\t\tthis._fadingOutCount = 0;\n\n\t\tthis.maximumFadeOutTiles = options.maximumFadeOutTiles;\n\t\tthis.fadeRootTiles = options.fadeRootTiles;\n\t\tthis.fadeDuration = options.fadeDuration;\n\n\t}\n\n\tinit( tiles ) {\n\n\t\t// event callback initialization\n\t\tthis._onLoadModel = ( { scene } )=> {\n\n\t\t\t// initialize all the scene materials to fade\n\t\t\tthis._fadeMaterialManager.prepareScene( scene );\n\n\t\t};\n\t\tthis._onDisposeModel = ( { tile, scene } ) => {\n\n\t\t\t// delete the fade info from the managers on disposal of model\n\t\t\tthis._fadeManager.deleteObject( tile );\n\t\t\tthis._fadeMaterialManager.deleteScene( scene );\n\n\t\t};\n\t\tthis._onAddCamera = ( { camera } ) => {\n\n\t\t\t// track the camera transform\n\t\t\tthis._prevCameraTransforms.set( camera, new Matrix4() );\n\n\t\t};\n\t\tthis._onDeleteCamera = ( { camera } )=> {\n\n\t\t\t// remove the camera transform\n\t\t\tthis._prevCameraTransforms.delete( camera );\n\n\t\t};\n\t\tthis._onTileVisibilityChange = ( { tile, visible } ) => {\n\n\t\t\t// this function gets fired _after_ all set visible callbacks including the batched meshes\n\n\t\t\t// revert the scene and fade to the initial state when toggling\n\t\t\tconst scene = tile.cached.scene;\n\t\t\tif ( scene ) {\n\n\t\t\t\tscene.visible = true;\n\n\t\t\t}\n\n\t\t\tthis.forEachBatchIds( tile, ( id, batchedMesh, plugin ) => {\n\n\t\t\t\tbatchedMesh.setFadeAt( id, 0, 0 );\n\t\t\t\tbatchedMesh.setVisibleAt( id, false );\n\t\t\t\tplugin.batchedMesh.setVisibleAt( id, false );\n\n\t\t\t} );\n\n\t\t};\n\t\tthis._onUpdateBefore = () => {\n\n\t\t\tonUpdateBefore.call( this );\n\n\t\t};\n\t\tthis._onUpdateAfter = () => {\n\n\t\t\tonUpdateAfter.call( this );\n\n\t\t};\n\n\t\ttiles.addEventListener( 'load-model', this._onLoadModel );\n\t\ttiles.addEventListener( 'dispose-model', this._onDisposeModel );\n\t\ttiles.addEventListener( 'add-camera', this._onAddCamera );\n\t\ttiles.addEventListener( 'delete-camera', this._onDeleteCamera );\n\t\ttiles.addEventListener( 'update-before', this._onUpdateBefore );\n\t\ttiles.addEventListener( 'update-after', this._onUpdateAfter );\n\t\ttiles.addEventListener( 'tile-visibility-change', this._onTileVisibilityChange );\n\n\t\t// initialize fade manager\n\t\tconst fadeManager = this._fadeManager;\n\t\tfadeManager.onFadeSetStart = () => {\n\n\t\t\ttiles.dispatchEvent( { type: 'fade-start' } );\n\t\t\ttiles.dispatchEvent( { type: 'needs-render' } );\n\n\t\t};\n\n\t\tfadeManager.onFadeSetComplete = () => {\n\n\t\t\ttiles.dispatchEvent( { type: 'fade-end' } );\n\t\t\ttiles.dispatchEvent( { type: 'needs-render' } );\n\n\t\t};\n\n\t\tfadeManager.onFadeComplete = ( tile, visible ) => {\n\n\t\t\t// mark the fade as finished and reset the fade parameters\n\t\t\tthis._fadeMaterialManager.setFade( tile.cached.scene, 0, 0 );\n\n\t\t\tthis.forEachBatchIds( tile, ( id, batchedMesh, plugin ) => {\n\n\t\t\t\tbatchedMesh.setFadeAt( id, 0, 0 );\n\t\t\t\tbatchedMesh.setVisibleAt( id, false );\n\t\t\t\tplugin.batchedMesh.setVisibleAt( id, visible );\n\n\t\t\t} );\n\n\t\t\tif ( ! visible ) {\n\n\t\t\t\t// now that the tile is hidden we can run the built-in setTileVisible function for the tile\n\t\t\t\ttiles.invokeOnePlugin( plugin => plugin !== this && plugin.setTileVisible && plugin.setTileVisible( tile, false ) );\n\t\t\t\tthis._fadingOutCount --;\n\n\t\t\t}\n\n\t\t};\n\n\t\t// initialize the state based on what's already present\n\t\tconst prevCameraTransforms = new Map();\n\t\ttiles.cameras.forEach( camera => {\n\n\t\t\tprevCameraTransforms.set( camera, new Matrix4() );\n\n\t\t} );\n\n\t\ttiles.forEachLoadedModel( ( scene, tile ) => {\n\n\t\t\tthis._onLoadModel( { scene } );\n\n\t\t} );\n\n\t\tthis.tiles = tiles;\n\t\tthis._fadeManager = fadeManager;\n\t\tthis._prevCameraTransforms = prevCameraTransforms;\n\n\t}\n\n\t// initializes the batched mesh if it needs to be, dispose if it it's no longer needed\n\tinitBatchedMesh() {\n\n\t\tconst otherBatchedMesh = this.tiles.getPluginByName( 'BATCHED_TILES_PLUGIN' )?.batchedMesh;\n\t\tif ( otherBatchedMesh ) {\n\n\t\t\tif ( this.batchedMesh === null ) {\n\n\t\t\t\tthis._onBatchedMeshDispose = () => {\n\n\t\t\t\t\tthis.batchedMesh.dispose();\n\t\t\t\t\tthis.batchedMesh.removeFromParent();\n\t\t\t\t\tthis.batchedMesh = null;\n\t\t\t\t\totherBatchedMesh.removeEventListener( 'dispose', this._onBatchedMeshDispose );\n\n\t\t\t\t};\n\n\t\t\t\tconst material = otherBatchedMesh.material.clone();\n\t\t\t\tmaterial.onBeforeCompile = otherBatchedMesh.material.onBeforeCompile;\n\n\t\t\t\tthis.batchedMesh = new FadeBatchedMesh( otherBatchedMesh, material );\n\t\t\t\tthis.tiles.group.add( this.batchedMesh );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( this.batchedMesh !== null ) {\n\n\t\t\t\tthis._onBatchedMeshDispose();\n\t\t\t\tthis._onBatchedMeshDispose = null;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// callback for fading to prevent tiles from being removed until the fade effect has completed\n\tsetTileVisible( tile, visible ) {\n\n\t\tconst fadeManager = this._fadeManager;\n\n\t\t// track the fade state\n\t\tconst wasFading = fadeManager.isFading( tile );\n\t\tif ( fadeManager.isFadingOut( tile ) ) {\n\n\t\t\tthis._fadingOutCount --;\n\n\t\t}\n\n\t\t// trigger any necessary fades\n\t\tif ( ! visible ) {\n\n\t\t\tthis._fadingOutCount ++;\n\t\t\tfadeManager.fadeOut( tile );\n\n\t\t} else {\n\n\t\t\t// if this is a root renderable tile and this is the first time rendering in\n\t\t\t// then pop it in\n\t\t\tconst isRootRenderableTile = tile.__depthFromRenderedParent === 1;\n\t\t\tif ( isRootRenderableTile ) {\n\n\t\t\t\tif ( tile[ HAS_POPPED_IN ] || this.fadeRootTiles ) {\n\n\t\t\t\t\tthis._fadeManager.fadeIn( tile );\n\n\t\t\t\t}\n\n\t\t\t\ttile[ HAS_POPPED_IN ] = true;\n\n\t\t\t} else {\n\n\t\t\t\tthis._fadeManager.fadeIn( tile );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// if a tile was already fading then it's already marked as visible and in the scene\n\t\tif ( wasFading ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\t// cancel the visibility change trigger because we're fading and will call this after\n\t\t// fade completes.\n\t\tconst isFading = this._fadeManager.isFading( tile );\n\t\tif ( ! visible && isFading ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tdispose() {\n\n\t\tconst tiles = this.tiles;\n\n\t\tthis._fadeManager.completeAllFades();\n\n\t\tif ( this.batchedMesh !== null ) {\n\n\t\t\tthis._onBatchedMeshDispose();\n\n\t\t}\n\n\t\ttiles.removeEventListener( 'load-model', this._onLoadModel );\n\t\ttiles.removeEventListener( 'dispose-model', this._onDisposeModel );\n\t\ttiles.removeEventListener( 'add-camera', this._onAddCamera );\n\t\ttiles.removeEventListener( 'delete-camera', this._onDeleteCamera );\n\t\ttiles.removeEventListener( 'update-before', this._onUpdateBefore );\n\t\ttiles.removeEventListener( 'update-after', this._onUpdateAfter );\n\t\ttiles.removeEventListener( 'tile-visibility-change', this._onTileVisibilityChange );\n\t\ttiles.forEachLoadedModel( ( scene, tile ) => {\n\n\t\t\tthis._fadeManager.deleteObject( tile );\n\t\t\tif ( scene ) {\n\n\t\t\t\tscene.visible = true; // TODO\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t// helper for iterating over the batch ids for a given tile\n\tforEachBatchIds( tile, cb ) {\n\n\t\tthis.initBatchedMesh();\n\n\t\tif ( this.batchedMesh ) {\n\n\t\t\tconst batchedPlugin = this.tiles.getPluginByName( 'BATCHED_TILES_PLUGIN' );\n\t\t\tconst instanceIds = batchedPlugin.getTileBatchIds( tile );\n\t\t\tif ( instanceIds ) {\n\n\t\t\t\tinstanceIds.forEach( id => {\n\n\t\t\t\t\tcb( id, this.batchedMesh, batchedPlugin );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n","import { Ray, Sphere } from 'three';\nimport { OBB } from '../../three/math/OBB.js';\n\nexport class LoadRegionPlugin {\n\n\tconstructor() {\n\n\t\tthis.name = 'LOAD_REGION_PLUGIN';\n\t\tthis.regions = [];\n\t\tthis.tiles = null;\n\n\t}\n\n\tinit( tiles ) {\n\n\t\tthis.tiles = tiles;\n\n\t}\n\n\taddRegion( region ) {\n\n\t\tif ( this.regions.indexOf( region ) === - 1 ) {\n\n\t\t\tthis.regions.push( region );\n\n\t\t}\n\n\t}\n\n\tremoveRegion( region ) {\n\n\t\tconst index = this.regions.indexOf( region );\n\t\tif ( index !== - 1 ) {\n\n\t\t\tthis.regions.splice( index, 1 );\n\n\t\t}\n\n\t}\n\n\thasRegion( region ) {\n\n\t\treturn this.regions.indexOf( region ) !== - 1;\n\n\t}\n\n\tclearRegions() {\n\n\t\tthis.regions = [];\n\n\t}\n\n\tcalculateTileViewError( tile, target ) {\n\n\t\tconst boundingVolume = tile.cached.boundingVolume;\n\t\tconst { regions, tiles } = this;\n\n\t\tlet visible = false;\n\t\tlet maxError = - Infinity;\n\t\tfor ( const region of regions ) {\n\n\t\t\tconst intersects = region.intersectsTile( boundingVolume, tile, tiles );\n\t\t\tif ( intersects ) {\n\n\t\t\t\tvisible = true;\n\t\t\t\tmaxError = Math.max( region.calculateError( tile, tiles ), maxError );\n\n\t\t\t}\n\n\t\t}\n\n\t\ttarget.inView = visible;\n\t\ttarget.error = maxError;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.regions = [];\n\n\t}\n\n}\n\n// Definitions of predefined regions\nclass BaseRegion {\n\n\tconstructor( errorTarget = 10 ) {\n\n\t\tthis.errorTarget = errorTarget;\n\n\t}\n\n\tintersectsTile() {}\n\n\tcalculateError( tile, tilesRenderer ) {\n\n\t\treturn tile.geometricError - this.errorTarget + tilesRenderer.errorTarget;\n\n\t}\n\n}\n\nexport class SphereRegion extends BaseRegion {\n\n\tconstructor( errorTarget = 10, sphere = new Sphere() ) {\n\n\t\tsuper( errorTarget );\n\t\tthis.sphere = sphere.clone();\n\n\t}\n\n\tintersectsTile( boundingVolume ) {\n\n\t\treturn boundingVolume.intersectsSphere( this.sphere );\n\n\t}\n\n}\n\nexport class RayRegion extends BaseRegion {\n\n\tconstructor( errorTarget = 10, ray = new Ray() ) {\n\n\t\tsuper( errorTarget );\n\t\tthis.ray = ray.clone();\n\n\t}\n\n\tintersectsTile( boundingVolume ) {\n\n\t\treturn boundingVolume.intersectsRay( this.ray );\n\n\t}\n\n}\n\nexport class OBBRegion extends BaseRegion {\n\n\tconstructor( errorTarget = 10, obb = new OBB() ) {\n\n\t\tsuper( errorTarget );\n\t\tthis.obb = obb.clone();\n\t\tthis.obb.update();\n\n\t}\n\n\tintersectsTile( boundingVolume ) {\n\n\t\treturn boundingVolume.intersectsOBB( this.obb );\n\n\t}\n\n}\n","import { LineSegments, BufferGeometry, Vector3, BufferAttribute, LineBasicMaterial } from 'three';\n\nconst _vector = new Vector3();\nconst axes = [ 'x', 'y', 'z' ];\nexport class SphereHelper extends LineSegments {\n\n\tconstructor( sphere, color = 0xffff00, angleSteps = 40 ) {\n\n\t\tconst geometry = new BufferGeometry();\n\t\tconst positions = [];\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst axis1 = axes[ i ];\n\t\t\tconst axis2 = axes[ ( i + 1 ) % 3 ];\n\t\t\t_vector.set( 0, 0, 0 );\n\n\t\t\tfor ( let a = 0; a < angleSteps; a ++ ) {\n\n\t\t\t\tlet angle;\n\t\t\t\tangle = 2 * Math.PI * a / ( angleSteps - 1 );\n\t\t\t\t_vector[ axis1 ] = Math.sin( angle );\n\t\t\t\t_vector[ axis2 ] = Math.cos( angle );\n\n\t\t\t\tpositions.push( _vector.x, _vector.y, _vector.z );\n\n\t\t\t\tangle = 2 * Math.PI * ( a + 1 ) / ( angleSteps - 1 );\n\t\t\t\t_vector[ axis1 ] = Math.sin( angle );\n\t\t\t\t_vector[ axis2 ] = Math.cos( angle );\n\n\t\t\t\tpositions.push( _vector.x, _vector.y, _vector.z );\n\n\t\t\t}\n\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new BufferAttribute( new Float32Array( positions ), 3 ) );\n\t\tgeometry.computeBoundingSphere();\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.sphere = sphere;\n\t\tthis.type = 'SphereHelper';\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst sphere = this.sphere;\n\t\tthis.position.copy( sphere.center );\n\t\tthis.scale.setScalar( sphere.radius );\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n}\n","import { EllipsoidRegion } from '../../../three/math/EllipsoidRegion.js';\nimport { Mesh, Vector3, MathUtils, BoxGeometry, BufferGeometry, EdgesGeometry, LineSegments, BufferAttribute } from 'three';\n\nconst _norm = new Vector3();\nconst _norm2 = new Vector3();\nconst _pos = new Vector3();\nconst _vec1 = new Vector3();\nconst _vec2 = new Vector3();\n\n// Converts a geometry with a given set of groups rendering a smaller set of\n// geometry into a new one with only the relevant triangles.\nfunction toGroupGeometry( geometry ) {\n\n\t// non indexed makes this process easier\n\tgeometry = geometry.toNonIndexed();\n\n\t// prep the arrays\n\tconst { groups } = geometry;\n\tconst { position, normal } = geometry.attributes;\n\tconst newNorm = [];\n\tconst newPos = [];\n\n\t// add the normals and the positions\n\tfor ( const group of groups ) {\n\n\t\tconst { start, count } = group;\n\t\tfor ( let i = start, l = ( start + count ); i < l; i ++ ) {\n\n\t\t\t_vec1.fromBufferAttribute( position, i );\n\t\t\t_vec2.fromBufferAttribute( normal, i );\n\n\t\t\tnewPos.push( ..._vec1 );\n\t\t\tnewNorm.push( ..._vec2 );\n\n\t\t}\n\n\t}\n\n\t// set the new geometry\n\tconst newGeometry = new BufferGeometry();\n\tnewGeometry.setAttribute( 'position', new BufferAttribute( new Float32Array( newPos ), 3 ) );\n\tnewGeometry.setAttribute( 'normal', new BufferAttribute( new Float32Array( newNorm ), 3 ) );\n\n\treturn newGeometry;\n\n}\n\nfunction getRegionGeometry( ellipsoidRegion, { computeNormals = false } = {} ) {\n\n\t// retrieve the relevant fields\n\tconst {\n\t\tlatStart = - Math.PI / 2, latEnd = Math.PI / 2,\n\t\tlonStart = 0, lonEnd = 2 * Math.PI,\n\t\theightStart = 0, heightEnd = 0,\n\t} = ellipsoidRegion;\n\n\t// get the attributes\n\tconst geometry = new BoxGeometry( 1, 1, 1, 32, 32 );\n\tconst { normal, position } = geometry.attributes;\n\n\t// clone the position buffer so we can reference it for normal calculations later\n\tconst refPosition = position.clone();\n\n\t// perturb the position buffer into an ellipsoid region\n\tfor ( let i = 0, l = position.count; i < l; i ++ ) {\n\n\t\t_pos.fromBufferAttribute( position, i );\n\n\t\tconst lat = MathUtils.mapLinear( _pos.x, - 0.5, 0.5, latStart, latEnd );\n\t\tconst lon = MathUtils.mapLinear( _pos.y, - 0.5, 0.5, lonStart, lonEnd );\n\n\t\tlet height = heightStart;\n\t\tellipsoidRegion.getCartographicToNormal( lat, lon, _norm );\n\t\tif ( _pos.z < 0 ) {\n\n\t\t\theight = heightEnd;\n\n\t\t}\n\t\tellipsoidRegion.getCartographicToPosition( lat, lon, height, _pos );\n\t\tposition.setXYZ( i, ..._pos );\n\n\t}\n\n\tif ( computeNormals ) {\n\n\t\t// compute the vertex normals so we can get the edge normals\n\t\tgeometry.computeVertexNormals();\n\n\t}\n\n\t// compute the top and bottom cap normals\n\tfor ( let i = 0, l = refPosition.count; i < l; i ++ ) {\n\n\t\t_pos.fromBufferAttribute( refPosition, i );\n\n\t\tconst lat = MathUtils.mapLinear( _pos.x, - 0.5, 0.5, latStart, latEnd );\n\t\tconst lon = MathUtils.mapLinear( _pos.y, - 0.5, 0.5, lonStart, lonEnd );\n\n\t\t_norm.fromBufferAttribute( normal, i );\n\t\tellipsoidRegion.getCartographicToNormal( lat, lon, _norm2 );\n\n\t\t// exclude the sides so we get sharp corners\n\t\tif ( Math.abs( _norm.dot( _norm2 ) ) > 0.1 ) {\n\n\t\t\tif ( _pos.z > 0 ) {\n\n\t\t\t\t_norm2.multiplyScalar( - 1 );\n\n\t\t\t}\n\n\t\t\tnormal.setXYZ( i, ..._norm2 );\n\n\t\t}\n\n\t}\n\n\treturn geometry;\n\n}\n\nexport class EllipsoidRegionLineHelper extends LineSegments {\n\n\tconstructor( ellipsoidRegion = new EllipsoidRegion(), color = 0xffff00 ) {\n\n\t\tsuper();\n\t\tthis.ellipsoidRegion = ellipsoidRegion;\n\t\tthis.material.color.set( color );\n\t\tthis.update();\n\n\t}\n\n\tupdate() {\n\n\t\tconst geometry = getRegionGeometry( this.ellipsoidRegion );\n\t\tthis.geometry.dispose();\n\t\tthis.geometry = new EdgesGeometry( geometry, 80 );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nexport class EllipsoidRegionHelper extends Mesh {\n\n\tconstructor( ellipsoidRegion = new EllipsoidRegion(), color = 0xffff00 ) {\n\n\t\tsuper();\n\t\tthis.ellipsoidRegion = ellipsoidRegion;\n\t\tthis.material.color.set( color );\n\t\tthis.update();\n\n\t}\n\n\tupdate() {\n\n\t\t// dispose of the existing geometry\n\t\tthis.geometry.dispose();\n\n\t\t// retrieve the relevant fields\n\t\tconst geometry = getRegionGeometry( this.ellipsoidRegion, { computeNormals: true } );\n\t\tconst { lonStart, lonEnd } = this;\n\n\t\t// exclude the side tris if the region wraps around\n\t\tif ( lonEnd - lonStart >= 2 * Math.PI ) {\n\n\t\t\tgeometry.groups.splice( 2, 2 );\n\t\t\tthis.geometry = toGroupGeometry( geometry );\n\n\t\t} else {\n\n\t\t\tthis.geometry = geometry;\n\n\t\t}\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n","import { Box3Helper, Group, MeshStandardMaterial, PointsMaterial, Sphere, Color } from 'three';\nimport { SphereHelper } from './objects/SphereHelper.js';\nimport { EllipsoidRegionLineHelper } from './objects/EllipsoidRegionHelper.js';\nimport { traverseAncestors, traverseSet } from '../../base/traverseFunctions.js';\n\nconst ORIGINAL_MATERIAL = Symbol( 'ORIGINAL_MATERIAL' );\nconst HAS_RANDOM_COLOR = Symbol( 'HAS_RANDOM_COLOR' );\nconst HAS_RANDOM_NODE_COLOR = Symbol( 'HAS_RANDOM_NODE_COLOR' );\nconst LOAD_TIME = Symbol( 'LOAD_TIME' );\nconst PARENT_BOUND_REF_COUNT = Symbol( 'PARENT_BOUND_REF_COUNT' );\n\nconst _sphere = /* @__PURE__ */ new Sphere();\nconst emptyRaycast = () => {};\nconst colors = {};\n\n// Return a consistant random color for an index\nexport function getIndexedRandomColor( index ) {\n\n\tif ( ! colors[ index ] ) {\n\n\t\tconst h = Math.random();\n\t\tconst s = 0.5 + Math.random() * 0.5;\n\t\tconst l = 0.375 + Math.random() * 0.25;\n\n\t\tcolors[ index ] = new Color().setHSL( h, s, l );\n\n\t}\n\treturn colors[ index ];\n\n}\n\n// color modes\nconst NONE = 0;\nconst SCREEN_ERROR = 1;\nconst GEOMETRIC_ERROR = 2;\nconst DISTANCE = 3;\nconst DEPTH = 4;\nconst RELATIVE_DEPTH = 5;\nconst IS_LEAF = 6;\nconst RANDOM_COLOR = 7;\nconst RANDOM_NODE_COLOR = 8;\nconst CUSTOM_COLOR = 9;\nconst LOAD_ORDER = 10;\n\nconst ColorModes = Object.freeze( {\n\tNONE,\n\tSCREEN_ERROR,\n\tGEOMETRIC_ERROR,\n\tDISTANCE,\n\tDEPTH,\n\tRELATIVE_DEPTH,\n\tIS_LEAF,\n\tRANDOM_COLOR,\n\tRANDOM_NODE_COLOR,\n\tCUSTOM_COLOR,\n\tLOAD_ORDER,\n} );\n\nexport class DebugTilesPlugin {\n\n\tstatic get ColorModes() {\n\n\t\treturn ColorModes;\n\n\t}\n\n\tconstructor( options ) {\n\n\t\toptions = {\n\t\t\tdisplayParentBounds: false,\n\t\t\tdisplayBoxBounds: false,\n\t\t\tdisplaySphereBounds: false,\n\t\t\tdisplayRegionBounds: false,\n\t\t\tcolorMode: NONE,\n\t\t\tmaxDebugDepth: - 1,\n\t\t\tmaxDebugDistance: - 1,\n\t\t\tmaxDebugError: - 1,\n\t\t\tcustomColorCallback: null,\n\t\t\t...options,\n\t\t};\n\n\t\tthis.name = 'DEBUG_TILES_PLUGIN';\n\t\tthis.tiles = null;\n\n\t\tthis._enabled = true;\n\n\t\tthis.extremeDebugDepth = - 1;\n\t\tthis.extremeDebugError = - 1;\n\t\tthis.boxGroup = null;\n\t\tthis.sphereGroup = null;\n\t\tthis.regionGroup = null;\n\n\t\t// options\n\t\tthis._displayParentBounds = options.displayParentBounds;\n\t\tthis.displayBoxBounds = options.displayBoxBounds;\n\t\tthis.displaySphereBounds = options.displaySphereBounds;\n\t\tthis.displayRegionBounds = options.displayRegionBounds;\n\t\tthis.colorMode = options.colorMode;\n\t\tthis.maxDebugDepth = options.maxDebugDepth;\n\t\tthis.maxDebugDistance = options.maxDebugDistance;\n\t\tthis.maxDebugError = options.maxDebugError;\n\t\tthis.customColorCallback = options.customColorCallback;\n\n\t\tthis.getDebugColor = ( value, target ) => {\n\n\t\t\ttarget.setRGB( value, value, value );\n\n\t\t};\n\n\t}\n\n\tget enabled() {\n\n\t\treturn this._enabled;\n\n\t}\n\n\tset enabled( v ) {\n\n\t\tif ( v !== this._enabled ) {\n\n\t\t\tthis._enabled = v;\n\n\t\t\tif ( this._enabled ) {\n\n\t\t\t\tif ( this.tiles ) {\n\n\t\t\t\t\tthis.init( this.tiles );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.dispose();\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tget displayParentBounds() {\n\n\t\treturn this._displayParentBounds;\n\n\t}\n\n\tset displayParentBounds( v ) {\n\n\t\tif ( this._displayParentBounds !== v ) {\n\n\t\t\tthis._displayParentBounds = v;\n\n\t\t\tif ( ! v ) {\n\n\t\t\t\t// Reset all ref counts\n\t\t\t\ttraverseSet( this.tiles.root, null, tile => {\n\n\t\t\t\t\ttile[ PARENT_BOUND_REF_COUNT ] = null;\n\t\t\t\t\tthis._onTileVisibilityChange( tile, tile.__visible );\n\n\t\t\t\t} );\n\n\t\t\t} else {\n\n\t\t\t\t// Initialize ref count for existing tiles\n\t\t\t\tthis.tiles.traverse( tile => {\n\n\t\t\t\t\tif ( tile.__visible ) {\n\n\t\t\t\t\t\tthis._onTileVisibilityChange( tile, true );\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// initialize the groups for displaying helpers, register events, and initialize existing tiles\n\tinit( tiles ) {\n\n\t\tthis.tiles = tiles;\n\n\t\t// initialize groups\n\t\tconst tilesGroup = tiles.group;\n\t\tthis.boxGroup = new Group();\n\t\tthis.boxGroup.name = 'DebugTilesRenderer.boxGroup';\n\t\ttilesGroup.add( this.boxGroup );\n\t\tthis.boxGroup.updateMatrixWorld();\n\n\t\tthis.sphereGroup = new Group();\n\t\tthis.sphereGroup.name = 'DebugTilesRenderer.sphereGroup';\n\t\ttilesGroup.add( this.sphereGroup );\n\t\tthis.sphereGroup.updateMatrixWorld();\n\n\t\tthis.regionGroup = new Group();\n\t\tthis.regionGroup.name = 'DebugTilesRenderer.regionGroup';\n\t\ttilesGroup.add( this.regionGroup );\n\t\tthis.regionGroup.updateMatrixWorld();\n\n\t\t// register events\n\t\tthis._onLoadTileSetCB = () => {\n\n\t\t\tthis._initExtremes();\n\n\t\t};\n\n\t\tthis._onLoadModelCB = ( { scene, tile } ) => {\n\n\t\t\tthis._onLoadModel( scene, tile );\n\n\t\t};\n\n\t\tthis._onDisposeModelCB = ( { tile } ) => {\n\n\t\t\tthis._onDisposeModel( tile );\n\n\t\t};\n\n\t\tthis._onUpdateAfterCB = () => {\n\n\t\t\tthis._onUpdateAfter();\n\n\t\t};\n\n\t\tthis._onTileVisibilityChangeCB = ( { scene, tile, visible } ) => {\n\n\t\t\tthis._onTileVisibilityChange( tile, visible );\n\n\t\t};\n\n\t\ttiles.addEventListener( 'load-tile-set', this._onLoadTileSetCB );\n\t\ttiles.addEventListener( 'load-model', this._onLoadModelCB );\n\t\ttiles.addEventListener( 'dispose-model', this._onDisposeModelCB );\n\t\ttiles.addEventListener( 'update-after', this._onUpdateAfterCB );\n\t\ttiles.addEventListener( 'tile-visibility-change', this._onTileVisibilityChangeCB );\n\n\t\tthis._initExtremes();\n\n\t\t// initialize an already-loaded tiles\n\t\ttiles.traverse( tile => {\n\n\t\t\tif ( tile.cached.scene ) {\n\n\t\t\t\tthis._onLoadModel( tile.cached.scene, tile );\n\n\t\t\t}\n\n\t\t} );\n\n\t\ttiles.visibleTiles.forEach( tile => {\n\n\t\t\tthis._onTileVisibilityChange( tile, true );\n\n\t\t} );\n\n\t}\n\n\tgetTileInformationFromActiveObject( object ) {\n\n\t\t// Find which tile this scene is associated with. This is slow and\n\t\t// intended for debug purposes only.\n\t\tlet targetTile = null;\n\t\tconst activeTiles = this.tiles.activeTiles;\n\t\tactiveTiles.forEach( tile => {\n\n\t\t\tif ( targetTile ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\tconst scene = tile.cached.scene;\n\t\t\tif ( scene ) {\n\n\t\t\t\tscene.traverse( c => {\n\n\t\t\t\t\tif ( c === object ) {\n\n\t\t\t\t\t\ttargetTile = tile;\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\tif ( targetTile ) {\n\n\t\t\treturn {\n\n\t\t\t\tdistanceToCamera: targetTile.__distanceFromCamera,\n\t\t\t\tgeometricError: targetTile.geometricError,\n\t\t\t\tscreenSpaceError: targetTile.__error,\n\t\t\t\tdepth: targetTile.__depth,\n\t\t\t\tisLeaf: targetTile.__isLeaf\n\n\t\t\t};\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t}\n\n\t_initExtremes() {\n\n\t\tif ( ! ( this.tiles && this.tiles.root ) ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// initialize the extreme values of the hierarchy\n\t\tlet maxDepth = - 1;\n\t\tlet maxError = - 1;\n\n\t\t// Note that we are not using this.tiles.traverse()\n\t\t// as we don't want to pay the cost of preprocessing tiles.\n\t\ttraverseSet( this.tiles.root, null, ( tile, _, depth ) => {\n\n\t\t\tmaxDepth = Math.max( maxDepth, depth );\n\t\t\tmaxError = Math.max( maxError, tile.geometricError );\n\n\t\t} );\n\n\t\tthis.extremeDebugDepth = maxDepth;\n\t\tthis.extremeDebugError = maxError;\n\n\t}\n\n\t_onUpdateAfter() {\n\n\t\tconst tiles = this.tiles;\n\n\t\tif ( ! tiles.root ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// set box or sphere visibility\n\t\tthis.boxGroup.visible = this.displayBoxBounds;\n\t\tthis.sphereGroup.visible = this.displaySphereBounds;\n\t\tthis.regionGroup.visible = this.displayRegionBounds;\n\n\t\t// get max values to use for materials\n\t\tlet maxDepth = - 1;\n\t\tif ( this.maxDebugDepth === - 1 ) {\n\n\t\t\tmaxDepth = this.extremeDebugDepth;\n\n\t\t} else {\n\n\t\t\tmaxDepth = this.maxDebugDepth;\n\n\t\t}\n\n\t\tlet maxError = - 1;\n\t\tif ( this.maxDebugError === - 1 ) {\n\n\t\t\tmaxError = this.extremeDebugError;\n\n\t\t} else {\n\n\t\t\tmaxError = this.maxDebugError;\n\n\t\t}\n\n\t\tlet maxDistance = - 1;\n\t\tif ( this.maxDebugDistance === - 1 ) {\n\n\t\t\ttiles.getBoundingSphere( _sphere );\n\t\t\tmaxDistance = _sphere.radius;\n\n\t\t} else {\n\n\t\t\tmaxDistance = this.maxDebugDistance;\n\n\t\t}\n\n\t\tconst errorTarget = this.errorTarget;\n\t\tconst colorMode = this.colorMode;\n\t\tconst visibleTiles = tiles.visibleTiles;\n\t\tlet sortedTiles;\n\t\tif ( colorMode === LOAD_ORDER ) {\n\n\t\t\tsortedTiles = Array.from( visibleTiles ).sort( ( a, b ) => {\n\n\t\t\t\treturn a[ LOAD_TIME ] - b[ LOAD_TIME ];\n\n\t\t\t} );\n\n\t\t}\n\n\t\t// update plugins\n\t\tvisibleTiles.forEach( tile => {\n\n\t\t\tconst scene = tile.cached.scene;\n\n\t\t\t// create a random color per-tile\n\t\t\tlet h, s, l;\n\t\t\tif ( colorMode === RANDOM_COLOR ) {\n\n\t\t\t\th = Math.random();\n\t\t\t\ts = 0.5 + Math.random() * 0.5;\n\t\t\t\tl = 0.375 + Math.random() * 0.25;\n\n\t\t\t}\n\n\t\t\tscene.traverse( c => {\n\n\t\t\t\tif ( colorMode === RANDOM_NODE_COLOR ) {\n\n\t\t\t\t\th = Math.random();\n\t\t\t\t\ts = 0.5 + Math.random() * 0.5;\n\t\t\t\t\tl = 0.375 + Math.random() * 0.25;\n\n\t\t\t\t}\n\n\t\t\t\tconst currMaterial = c.material;\n\t\t\t\tif ( currMaterial ) {\n\n\t\t\t\t\t// Reset the material if needed\n\t\t\t\t\tconst originalMaterial = c[ ORIGINAL_MATERIAL ];\n\t\t\t\t\tif ( colorMode === NONE && currMaterial !== originalMaterial ) {\n\n\t\t\t\t\t\tc.material.dispose();\n\t\t\t\t\t\tc.material = c[ ORIGINAL_MATERIAL ];\n\n\t\t\t\t\t} else if ( colorMode !== NONE && currMaterial === originalMaterial ) {\n\n\t\t\t\t\t\tif ( c.isPoints ) {\n\n\t\t\t\t\t\t\tconst pointsMaterial = new PointsMaterial();\n\t\t\t\t\t\t\tpointsMaterial.size = originalMaterial.size;\n\t\t\t\t\t\t\tpointsMaterial.sizeAttenuation = originalMaterial.sizeAttenuation;\n\t\t\t\t\t\t\tc.material = pointsMaterial;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tc.material = new MeshStandardMaterial();\n\t\t\t\t\t\t\tc.material.flatShading = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( colorMode !== RANDOM_COLOR ) {\n\n\t\t\t\t\t\tdelete c.material[ HAS_RANDOM_COLOR ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( colorMode !== RANDOM_NODE_COLOR ) {\n\n\t\t\t\t\t\tdelete c.material[ HAS_RANDOM_NODE_COLOR ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Set the color on the basic material\n\t\t\t\t\tswitch ( colorMode ) {\n\n\t\t\t\t\t\tcase DEPTH: {\n\n\t\t\t\t\t\t\tconst val = tile.__depth / maxDepth;\n\t\t\t\t\t\t\tthis.getDebugColor( val, c.material.color );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase RELATIVE_DEPTH: {\n\n\t\t\t\t\t\t\tconst val = tile.__depthFromRenderedParent / maxDepth;\n\t\t\t\t\t\t\tthis.getDebugColor( val, c.material.color );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase SCREEN_ERROR: {\n\n\t\t\t\t\t\t\tconst val = tile.__error / errorTarget;\n\t\t\t\t\t\t\tif ( val > 1.0 ) {\n\n\t\t\t\t\t\t\t\tc.material.color.setRGB( 1.0, 0.0, 0.0 );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tthis.getDebugColor( val, c.material.color );\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase GEOMETRIC_ERROR: {\n\n\t\t\t\t\t\t\tconst val = Math.min( tile.geometricError / maxError, 1 );\n\t\t\t\t\t\t\tthis.getDebugColor( val, c.material.color );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase DISTANCE: {\n\n\t\t\t\t\t\t\t// We don't update the distance if the geometric error is 0.0 so\n\t\t\t\t\t\t\t// it will always be black.\n\t\t\t\t\t\t\tconst val = Math.min( tile.__distanceFromCamera / maxDistance, 1 );\n\t\t\t\t\t\t\tthis.getDebugColor( val, c.material.color );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase IS_LEAF: {\n\n\t\t\t\t\t\t\tif ( ! tile.children || tile.children.length === 0 ) {\n\n\t\t\t\t\t\t\t\tthis.getDebugColor( 1.0, c.material.color );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tthis.getDebugColor( 0.0, c.material.color );\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase RANDOM_NODE_COLOR: {\n\n\t\t\t\t\t\t\tif ( ! c.material[ HAS_RANDOM_NODE_COLOR ] ) {\n\n\t\t\t\t\t\t\t\tc.material.color.setHSL( h, s, l );\n\t\t\t\t\t\t\t\tc.material[ HAS_RANDOM_NODE_COLOR ] = true;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase RANDOM_COLOR: {\n\n\t\t\t\t\t\t\tif ( ! c.material[ HAS_RANDOM_COLOR ] ) {\n\n\t\t\t\t\t\t\t\tc.material.color.setHSL( h, s, l );\n\t\t\t\t\t\t\t\tc.material[ HAS_RANDOM_COLOR ] = true;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase CUSTOM_COLOR: {\n\n\t\t\t\t\t\t\tif ( this.customColorCallback ) {\n\n\t\t\t\t\t\t\t\tthis.customColorCallback( tile, c );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tconsole.warn( 'DebugTilesRenderer: customColorCallback not defined' );\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase LOAD_ORDER: {\n\n\t\t\t\t\t\t\tconst value = sortedTiles.indexOf( tile );\n\t\t\t\t\t\t\tthis.getDebugColor( value / ( sortedTiles.length - 1 ), c.material.color );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\t_onTileVisibilityChange( tile, visible ) {\n\n\t\tif ( this.displayParentBounds ) {\n\n\t\t\ttraverseAncestors( tile, current => {\n\n\t\t\t\tif ( current[ PARENT_BOUND_REF_COUNT ] == null ) {\n\n\t\t\t\t\tcurrent[ PARENT_BOUND_REF_COUNT ] = 0;\n\n\t\t\t\t}\n\n\t\t\t\tif ( visible ) {\n\n\t\t\t\t\tcurrent[ PARENT_BOUND_REF_COUNT ] ++;\n\n\t\t\t\t} else if ( current[ PARENT_BOUND_REF_COUNT ] > 0 ) {\n\n\t\t\t\t\tcurrent[ PARENT_BOUND_REF_COUNT ] --;\n\n\t\t\t\t}\n\n\t\t\t\tconst tileVisible = ( current === tile && visible ) || ( this.displayParentBounds && current[ PARENT_BOUND_REF_COUNT ] > 0 );\n\n\t\t\t\tthis._updateBoundHelper( current, tileVisible );\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\tthis._updateBoundHelper( tile, visible );\n\n\t\t}\n\n\t}\n\n\t_createBoundHelper( tile ) {\n\n\t\tconst tiles = this.tiles;\n\t\tconst cached = tile.cached;\n\t\tconst { sphere, obb, region } = cached.boundingVolume;\n\t\tif ( obb ) {\n\n\t\t\t// Create debug bounding box\n\t\t\t// In some cases the bounding box may have a scale of 0 in one dimension resulting\n\t\t\t// in the NaNs in an extracted rotation so we disable matrix updates instead.\n\t\t\tconst boxHelperGroup = new Group();\n\t\t\tboxHelperGroup.name = 'DebugTilesRenderer.boxHelperGroup';\n\t\t\tboxHelperGroup.matrix.copy( obb.transform );\n\t\t\tboxHelperGroup.matrixAutoUpdate = false;\n\n\t\t\tconst boxHelper = new Box3Helper( obb.box, getIndexedRandomColor( tile.__depth ) );\n\t\t\tboxHelper.raycast = emptyRaycast;\n\t\t\tboxHelperGroup.add( boxHelper );\n\n\t\t\tcached.boxHelperGroup = boxHelperGroup;\n\n\t\t\tif ( tiles.visibleTiles.has( tile ) && this.displayBoxBounds ) {\n\n\t\t\t\tthis.boxGroup.add( boxHelperGroup );\n\t\t\t\tboxHelperGroup.updateMatrixWorld( true );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( sphere ) {\n\n\t\t\t// Create debug bounding sphere\n\t\t\tconst sphereHelper = new SphereHelper( sphere, getIndexedRandomColor( tile.__depth ) );\n\t\t\tsphereHelper.raycast = emptyRaycast;\n\t\t\tcached.sphereHelper = sphereHelper;\n\n\t\t\tif ( tiles.visibleTiles.has( tile ) && this.displaySphereBounds ) {\n\n\t\t\t\tthis.sphereGroup.add( sphereHelper );\n\t\t\t\tsphereHelper.updateMatrixWorld( true );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( region ) {\n\n\t\t\t// Create debug bounding region\n\t\t\tconst regionHelper = new EllipsoidRegionLineHelper( region, getIndexedRandomColor( tile.__depth ) );\n\t\t\tregionHelper.raycast = emptyRaycast;\n\n\t\t\t// recenter the geometry to avoid rendering artifacts\n\t\t\tconst sphere = new Sphere();\n\t\t\tregion.getBoundingSphere( sphere );\n\t\t\tregionHelper.position.copy( sphere.center );\n\n\t\t\tsphere.center.multiplyScalar( - 1 );\n\t\t\tregionHelper.geometry.translate( ...sphere.center );\n\n\t\t\tcached.regionHelper = regionHelper;\n\n\t\t\tif ( tiles.visibleTiles.has( tile ) && this.displayRegionBounds ) {\n\n\t\t\t\tthis.regionGroup.add( regionHelper );\n\t\t\t\tregionHelper.updateMatrixWorld( true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_updateHelperMaterial( tile, material ) {\n\n\t\tif ( tile.__visible || ! this.displayParentBounds ) {\n\n\t\t\tmaterial.opacity = 1;\n\n\t\t} else {\n\n\t\t\tmaterial.opacity = 0.2;\n\n\t\t}\n\n\t\tconst transparent = material.transparent;\n\t\tmaterial.transparent = material.opacity < 1;\n\t\tif ( material.transparent !== transparent ) {\n\n\t\t\tmaterial.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t_updateBoundHelper( tile, visible ) {\n\n\t\tconst cached = tile.cached;\n\n\t\tif ( ! cached ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst sphereGroup = this.sphereGroup;\n\t\tconst boxGroup = this.boxGroup;\n\t\tconst regionGroup = this.regionGroup;\n\n\t\tif ( visible && ( cached.boxHelperGroup == null && cached.sphereHelper == null && cached.regionHelper == null ) ) {\n\n\t\t\tthis._createBoundHelper( tile );\n\n\t\t}\n\n\t\tconst boxHelperGroup = cached.boxHelperGroup;\n\t\tconst sphereHelper = cached.sphereHelper;\n\t\tconst regionHelper = cached.regionHelper;\n\n\t\tif ( ! visible ) {\n\n\t\t\tif ( boxHelperGroup ) {\n\n\t\t\t\tboxGroup.remove( boxHelperGroup );\n\n\t\t\t}\n\n\t\t\tif ( sphereHelper ) {\n\n\t\t\t\tsphereGroup.remove( sphereHelper );\n\n\t\t\t}\n\n\t\t\tif ( regionHelper ) {\n\n\t\t\t\tregionGroup.remove( regionHelper );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// TODO: consider updating the volumes based on the bounding regions here in case they've been changed\n\t\t\tif ( boxHelperGroup ) {\n\n\t\t\t\tboxGroup.add( boxHelperGroup );\n\t\t\t\tboxHelperGroup.updateMatrixWorld( true );\n\n\t\t\t\tthis._updateHelperMaterial( tile, boxHelperGroup.children[ 0 ].material );\n\n\t\t\t}\n\n\t\t\tif ( sphereHelper ) {\n\n\t\t\t\tsphereGroup.add( sphereHelper );\n\t\t\t\tsphereHelper.updateMatrixWorld( true );\n\n\t\t\t\tthis._updateHelperMaterial( tile, sphereHelper.material );\n\n\t\t\t}\n\n\t\t\tif ( regionHelper ) {\n\n\t\t\t\tregionGroup.add( regionHelper );\n\t\t\t\tregionHelper.updateMatrixWorld( true );\n\n\t\t\t\tthis._updateHelperMaterial( tile, regionHelper.material );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_onLoadModel( scene, tile ) {\n\n\t\ttile[ LOAD_TIME ] = performance.now();\n\n\t\t// Cache the original materials\n\t\tscene.traverse( c => {\n\n\t\t\tconst material = c.material;\n\t\t\tif ( material ) {\n\n\t\t\t\tc[ ORIGINAL_MATERIAL ] = material;\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t_onDisposeModel( tile ) {\n\n\t\tconst cached = tile.cached;\n\t\tif ( cached.boxHelperGroup ) {\n\n\t\t\tcached.boxHelperGroup.children[ 0 ].geometry.dispose();\n\t\t\tdelete cached.boxHelperGroup;\n\n\t\t}\n\n\t\tif ( cached.sphereHelper ) {\n\n\t\t\tcached.sphereHelper.geometry.dispose();\n\t\t\tdelete cached.sphereHelper;\n\n\t\t}\n\n\t\tif ( cached.regionHelper ) {\n\n\t\t\tcached.regionHelper.geometry.dispose();\n\t\t\tdelete cached.regionHelper;\n\n\t\t}\n\n\t}\n\n\tdispose() {\n\n\t\tconst tiles = this.tiles;\n\n\t\tif ( tiles ) {\n\n\t\t\ttiles.removeEventListener( 'load-tile-set', this._onLoadTileSetCB );\n\t\t\ttiles.removeEventListener( 'load-model', this._onLoadModelCB );\n\t\t\ttiles.removeEventListener( 'dispose-model', this._onDisposeModelCB );\n\t\t\ttiles.removeEventListener( 'update-after', this._onUpdateAfterCB );\n\t\t\ttiles.removeEventListener( 'tile-visibility-change', this._onTileVisibilityChangeCB );\n\n\t\t\t// reset all materials\n\t\t\tthis.colorMode = NONE;\n\t\t\tthis._onUpdateAfter();\n\n\t\t\t// dispose of all helper objects\n\t\t\ttiles.traverse( tile => {\n\n\t\t\t\tthis._onDisposeModel( tile );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tthis.boxGroup?.removeFromParent();\n\t\tthis.sphereGroup?.removeFromParent();\n\t\tthis.regionGroup?.removeFromParent();\n\n\t}\n\n}\n","import { ImageFormatPlugin } from './ImageFormatPlugin.js';\n\n// Support for Deep Zoom Image format\n// https://openseadragon.github.io/\n\n// https://learn.microsoft.com/en-us/previous-versions/windows/silverlight/dotnet-windows-silverlight/cc645077(v=vs.95)\nexport class DeepZoomImagePlugin extends ImageFormatPlugin {\n\n\tconstructor( ...args ) {\n\n\t\tsuper( ...args );\n\n\t\tthis.name = 'DZI_TILES_PLUGIN';\n\t\tthis.stem = null;\n\t\tthis.format = null;\n\t\tthis.flipY = true;\n\n\t}\n\n\tgetUrl( level, x, y ) {\n\n\t\treturn `${ this.stem }_files/${ level }/${ x }_${ y }.${ this.format }`;\n\n\t}\n\n\tloadRootTileSet() {\n\n\t\tconst { tiles } = this;\n\n\t\t// transform the url\n\t\tlet url = tiles.rootURL;\n\t\ttiles.invokeAllPlugins( plugin => url = plugin.preprocessURL ? plugin.preprocessURL( url, null ) : url );\n\n\t\t// If implementing DeepZoom with limitations like a fixed orthographic camera perspective then\n\t\t// the target tile level can be immediately 'jumped' to for the entire image and in-view tiles\n\t\t// can be immediately queried without any hierarchy traversal. Due the flexibility of camera\n\t\t// type, rotation, and per-tile error calculation we generate a hierarchy.\n\t\treturn tiles\n\t\t\t.invokeOnePlugin( plugin => plugin.fetchData && plugin.fetchData( url, this.tiles.fetchOptions ) )\n\t\t\t.then( res => res.text() )\n\t\t\t.then( text => {\n\n\t\t\t\tconst xml = new DOMParser().parseFromString( text, 'text/xml' );\n\t\t\t\tif ( xml.querySelector( 'DisplayRects' ) || xml.querySelector( 'Collection' ) ) {\n\n\t\t\t\t\tthrow new Error( 'DeepZoomImagesPlugin: DisplayRect and Collection DZI files not supported.' );\n\n\t\t\t\t}\n\n\t\t\t\t// Elements\n\t\t\t\tconst image = xml.querySelector( 'Image' );\n\t\t\t\tconst size = image.querySelector( 'Size' );\n\n\t\t\t\t// Image properties\n\t\t\t\tconst tileSize = parseInt( image.getAttribute( 'TileSize' ) );\n\t\t\t\tthis.tileWidth = tileSize;\n\t\t\t\tthis.tileHeight = tileSize;\n\t\t\t\tthis.overlap = parseInt( image.getAttribute( 'Overlap' ) );\n\t\t\t\tthis.format = image.getAttribute( 'Format' );\n\t\t\t\tthis.width = parseInt( size.getAttribute( 'Width' ) );\n\t\t\t\tthis.height = parseInt( size.getAttribute( 'Height' ) );\n\t\t\t\tthis.levels = Math.ceil( Math.log2( Math.max( this.width, this.height ) ) ) + 1;\n\t\t\t\tthis.stem = url.split( /\\.[^.]+$/g )[ 0 ];\n\n\t\t\t\treturn this.getTileset( url );\n\n\t\t\t} );\n\n\t}\n\n}\n","/**\n * Structure almost identical to Cesium, also the comments and the names are kept\n * https://github.com/CesiumGS/cesium/blob/0a69f67b393ba194eefb7254600811c4b712ddc0/packages/engine/Source/Scene/Implicit3DTileContent.js\n */\nimport { LoaderBase } from '../../base/loaders/LoaderBase.js';\nimport { readMagicBytes } from '../../utilities/readMagicBytes.js';\nimport { arrayToString } from '../../utilities/arrayToString.js';\n\nfunction isOctreeSubdivision( tile ) {\n\n\treturn tile.__implicitRoot.implicitTiling.subdivisionScheme === 'OCTREE';\n\n}\n\nfunction getBoundsDivider( tile ) {\n\n\treturn isOctreeSubdivision( tile ) ? 8 : 4;\n\n}\n\nfunction getSubtreeCoordinates( tile, parentTile ) {\n\n\tif ( ! parentTile ) {\n\n\t\treturn [ 0, 0, 0 ];\n\n\t}\n\tconst x = 2 * parentTile.__x + ( tile.__subtreeIdx % 2 );\n\tconst y = 2 * parentTile.__y + ( Math.floor( tile.__subtreeIdx / 2 ) % 2 );\n\tconst z = isOctreeSubdivision( tile ) ?\n\t\t2 * parentTile.__z + ( Math.floor( tile.__subtreeIdx / 4 ) % 2 ) : 0;\n\treturn [ x, y, z ];\n\n}\n\nclass SubtreeTile {\n\n\tconstructor( parentTile, childMortonIndex ) {\n\n\t\tthis.parent = parentTile;\n\t\tthis.children = [];\n\t\tthis.__level = parentTile.__level + 1;\n\t\tthis.__implicitRoot = parentTile.__implicitRoot;\n\t\t// Index inside the tree\n\t\tthis.__subtreeIdx = childMortonIndex;\n\t\t[ this.__x, this.__y, this.__z ] = getSubtreeCoordinates( this, parentTile );\n\n\t}\n\n\tstatic copy( tile ) {\n\n\t\tconst copyTile = {};\n\t\tcopyTile.children = [];\n\t\tcopyTile.__level = tile.__level;\n\t\tcopyTile.__implicitRoot = tile.__implicitRoot;\n\t\t// Index inside the tree\n\t\tcopyTile.__subtreeIdx = tile.__subtreeIdx;\n\t\t[ copyTile.__x, copyTile.__y, copyTile.__z ] = [ tile.__x, tile.__y, tile.__z ];\n\t\tcopyTile.boundingVolume = tile.boundingVolume;\n\t\tcopyTile.geometricError = tile.geometricError;\n\t\treturn copyTile;\n\n\t}\n\n}\n\nexport class SUBTREELoader extends LoaderBase {\n\n\tconstructor( tile ) {\n\n\t\tsuper();\n\t\tthis.tile = tile;\n\t\tthis.rootTile = tile.__implicitRoot;\t// The implicit root tile\n\t\tthis.workingPath = null;\n\n\t}\n\n\t/**\n\t * A helper object for storing the two parts of the subtree binary\n\t *\n\t * @typedef {object} Subtree\n\t * @property {number} version\n\t * @property {JSON} subtreeJson\n\t * @property {ArrayBuffer} subtreeByte\n\t * @private\n\t */\n\n\t/**\n\t *\n\t * @param buffer\n\t * @return {Subtree}\n\t */\n\tparseBuffer( buffer ) {\n\n\t\tconst dataView = new DataView( buffer );\n\t\tlet offset = 0;\n\t\t// 16-byte header\n\t\t// 4 bytes\n\t\tconst magic = readMagicBytes( dataView );\n\t\tconsole.assert( magic === 'subt', 'SUBTREELoader: The magic bytes equal \"subt\".' );\n\t\toffset += 4;\n\t\t// 4 bytes\n\t\tconst version = dataView.getUint32( offset, true );\n\t\tconsole.assert( version === 1, 'SUBTREELoader: The version listed in the header is \"1\".' );\n\t\toffset += 4;\n\t\t// From Cesium\n\t\t// Read the bottom 32 bits of the 64-bit byte length.\n\t\t// This is ok for now because:\n\t\t// 1) not all browsers have native 64-bit operations\n\t\t// 2) the data is well under 4GB\n\t\t// 8 bytes\n\t\tconst jsonLength = dataView.getUint32( offset, true );\n\t\toffset += 8;\n\t\t// 8 bytes\n\t\tconst byteLength = dataView.getUint32( offset, true );\n\t\toffset += 8;\n\t\tconst subtreeJson = JSON.parse( arrayToString( new Uint8Array( buffer, offset, jsonLength ) ) );\n\t\toffset += jsonLength;\n\t\tconst subtreeByte = buffer.slice( offset, offset + byteLength );\n\t\treturn {\n\t\t\tversion,\n\t\t\tsubtreeJson,\n\t\t\tsubtreeByte\n\t\t};\n\n\t}\n\n\n\tasync parse( buffer ) {\n\n\t\t// todo here : handle json\n\t\tconst subtree = this.parseBuffer( buffer );\n\t\tconst subtreeJson = subtree.subtreeJson;\n\n\t\t// TODO Handle metadata\n\t\t/*\n\t\t const subtreeMetadata = subtreeJson.subtreeMetadata;\n\t\t subtree._metadata = subtreeMetadata;\n\t\t*/\n\n\t\t/*\n\t\t\tTile availability indicates which tiles exist within the subtree\n\t\t\tContent availability indicates which tiles have associated content resources\n\t\t\tChild subtree availability indicates what subtrees are reachable from this subtree\n\t\t*/\n\n\t\t// After identifying how availability is stored, put the results in this new array for consistent processing later\n\t\tsubtreeJson.contentAvailabilityHeaders = [].concat( subtreeJson.contentAvailability );\n\t\tconst bufferHeaders = this.preprocessBuffers( subtreeJson.buffers );\n\t\tconst bufferViewHeaders = this.preprocessBufferViews(\n\t\t\tsubtreeJson.bufferViews,\n\t\t\tbufferHeaders\n\t\t);\n\n\t\t// Buffers and buffer views are inactive until explicitly marked active.\n\t\t// This way we can avoid fetching buffers that will not be used.\n\t\tthis.markActiveBufferViews( subtreeJson, bufferViewHeaders );\n\n\t\t// Await the active buffers. If a buffer is external (isExternal === true),\n\t\t// fetch it from its URI.\n\t\tconst buffersU8 = await this.requestActiveBuffers(\n\t\t\tbufferHeaders,\n\t\t\tsubtree.subtreeByte\n\t\t);\n\t\tconst bufferViewsU8 = this.parseActiveBufferViews( bufferViewHeaders, buffersU8 );\n\t\tthis.parseAvailability( subtree, subtreeJson, bufferViewsU8 );\n\t\tthis.expandSubtree( this.tile, subtree );\n\n\t}\n\n\t/**\n\t * Determine which buffer views need to be loaded into memory. This includes:\n\t *\n\t * <ul>\n\t * <li>The tile availability bitstream (if a bitstream is defined)</li>\n\t * <li>The content availability bitstream(s) (if a bitstream is defined)</li>\n\t * <li>The child subtree availability bitstream (if a bitstream is defined)</li>\n\t * </ul>\n\t *\n\t * <p>\n\t * This function modifies the buffer view headers' isActive flags in place.\n\t * </p>\n\t *\n\t * @param {JSON} subtreeJson The JSON chunk from the subtree\n\t * @param {BufferViewHeader[]} bufferViewHeaders The preprocessed buffer view headers\n\t * @private\n\t */\n\tmarkActiveBufferViews( subtreeJson, bufferViewHeaders ) {\n\n\t\tlet header;\n\t\tconst tileAvailabilityHeader = subtreeJson.tileAvailability;\n\t\t// Check for bitstream first, which is part of the current schema.\n\t\t// bufferView is the name of the bitstream from an older schema.\n\t\tif ( ! isNaN( tileAvailabilityHeader.bitstream ) ) {\n\n\t\t\theader = bufferViewHeaders[ tileAvailabilityHeader.bitstream ];\n\n\t\t} else if ( ! isNaN( tileAvailabilityHeader.bufferView ) ) {\n\n\t\t\theader = bufferViewHeaders[ tileAvailabilityHeader.bufferView ];\n\n\t\t}\n\t\tif ( header ) {\n\n\t\t\theader.isActive = true;\n\t\t\theader.bufferHeader.isActive = true;\n\n\t\t}\n\t\tconst contentAvailabilityHeaders = subtreeJson.contentAvailabilityHeaders;\n\t\tfor ( let i = 0; i < contentAvailabilityHeaders.length; i ++ ) {\n\n\t\t\theader = undefined;\n\t\t\tif ( ! isNaN( contentAvailabilityHeaders[ i ].bitstream ) ) {\n\n\t\t\t\theader = bufferViewHeaders[ contentAvailabilityHeaders[ i ].bitstream ];\n\n\t\t\t} else if ( ! isNaN( contentAvailabilityHeaders[ i ].bufferView ) ) {\n\n\t\t\t\theader = bufferViewHeaders[ contentAvailabilityHeaders[ i ].bufferView ];\n\n\t\t\t}\n\t\t\tif ( header ) {\n\n\t\t\t\theader.isActive = true;\n\t\t\t\theader.bufferHeader.isActive = true;\n\n\t\t\t}\n\n\t\t}\n\t\theader = undefined;\n\t\tconst childSubtreeAvailabilityHeader = subtreeJson.childSubtreeAvailability;\n\t\tif ( ! isNaN( childSubtreeAvailabilityHeader.bitstream ) ) {\n\n\t\t\theader = bufferViewHeaders[ childSubtreeAvailabilityHeader.bitstream ];\n\n\t\t} else if ( ! isNaN( childSubtreeAvailabilityHeader.bufferView ) ) {\n\n\t\t\theader = bufferViewHeaders[ childSubtreeAvailabilityHeader.bufferView ];\n\n\t\t}\n\t\tif ( header ) {\n\n\t\t\theader.isActive = true;\n\t\t\theader.bufferHeader.isActive = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Go through the list of buffers and gather all the active ones into\n\t * a dictionary.\n\t * <p>\n\t * The results are put into a dictionary object. The keys are indices of\n\t * buffers, and the values are Uint8Arrays of the contents. Only buffers\n\t * marked with the isActive flag are fetched.\n\t * </p>\n\t * <p>\n\t * The internal buffer (the subtree's binary chunk) is also stored in this\n\t * dictionary if it is marked active.\n\t * </p>\n\t * @param {BufferHeader[]} bufferHeaders The preprocessed buffer headers\n\t * @param {ArrayBuffer} internalBuffer The binary chunk of the subtree file\n\t * @returns {object} buffersU8 A dictionary of buffer index to a Uint8Array of its contents.\n\t * @private\n\t */\n\tasync requestActiveBuffers( bufferHeaders, internalBuffer ) {\n\n\t\tconst promises = [];\n\t\tfor ( let i = 0; i < bufferHeaders.length; i ++ ) {\n\n\t\t\tconst bufferHeader = bufferHeaders[ i ];\n\t\t\t// If the buffer is not active, resolve with undefined.\n\t\t\tif ( ! bufferHeader.isActive ) {\n\n\t\t\t\tpromises.push( Promise.resolve( ) );\n\n\t\t\t} else if ( bufferHeader.isExternal ) {\n\n\t\t\t\t// Get the absolute URI of the external buffer.\n\t\t\t\tconst url = this.parseImplicitURIBuffer(\n\t\t\t\t\tthis.tile,\n\t\t\t\t\tthis.rootTile.implicitTiling.subtrees.uri,\n\t\t\t\t\tbufferHeader.uri\n\t\t\t\t);\n\n\t\t\t\tconst fetchPromise = fetch( url, this.fetchOptions )\n\t\t\t\t\t.then( response => {\n\n\t\t\t\t\t\tif ( ! response.ok ) {\n\n\t\t\t\t\t\t\tthrow new Error( `SUBTREELoader: Failed to load external buffer from ${ bufferHeader.uri } with error code ${ response.status }.` );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn response.arrayBuffer();\n\n\t\t\t\t\t} )\n\t\t\t\t\t.then( arrayBuffer => new Uint8Array( arrayBuffer ) );\n\n\t\t\t\tpromises.push( fetchPromise );\n\n\t\t\t} else {\n\n\t\t\t\tpromises.push( Promise.resolve( new Uint8Array( internalBuffer ) ) );\n\n\t\t\t}\n\n\t\t}\n\t\tconst bufferResults = await Promise.all( promises );\n\t\tconst buffersU8 = {};\n\t\tfor ( let i = 0; i < bufferResults.length; i ++ ) {\n\n\t\t\tconst result = bufferResults[ i ];\n\t\t\tif ( result ) {\n\n\t\t\t\tbuffersU8[ i ] = result;\n\n\t\t\t}\n\n\t\t}\n\t\treturn buffersU8;\n\n\t}\n\n\t/**\n\t * Go through the list of buffer views, and if they are marked as active,\n\t * extract a subarray from one of the active buffers.\n\t *\n\t * @param {BufferViewHeader[]} bufferViewHeaders\n\t * @param {object} buffersU8 A dictionary of buffer index to a Uint8Array of its contents.\n\t * @returns {object} A dictionary of buffer view index to a Uint8Array of its contents.\n\t * @private\n\t */\n\tparseActiveBufferViews( bufferViewHeaders, buffersU8 ) {\n\n\t\tconst bufferViewsU8 = {};\n\t\tfor ( let i = 0; i < bufferViewHeaders.length; i ++ ) {\n\n\t\t\tconst bufferViewHeader = bufferViewHeaders[ i ];\n\t\t\tif ( ! bufferViewHeader.isActive ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\t\t\tconst start = bufferViewHeader.byteOffset;\n\t\t\tconst end = start + bufferViewHeader.byteLength;\n\t\t\tconst buffer = buffersU8[ bufferViewHeader.buffer ];\n\t\t\tbufferViewsU8[ i ] = buffer.slice( start, end );\n\n\t\t}\n\t\treturn bufferViewsU8;\n\n\t}\n\n\t/**\n\t * A buffer header is the JSON header from the subtree JSON chunk plus\n\t * a couple extra boolean flags for easy reference.\n\t *\n\t * Buffers are assumed inactive until explicitly marked active. This is used\n\t * to avoid fetching unneeded buffers.\n\t *\n\t * @typedef {object} BufferHeader\n\t * @property {boolean} isActive Whether this buffer is currently used.\n\t * @property {string} [uri] The URI of the buffer (external buffers only)\n\t * @property {number} byteLength The byte length of the buffer, including any padding contained within.\n\t * @private\n\t */\n\n\t/**\n\t * Iterate over the list of buffers from the subtree JSON and add the isActive field for easier parsing later.\n\t * This modifies the objects in place.\n\t * @param {Object[]} [bufferHeaders=[]] The JSON from subtreeJson.buffers.\n\t * @returns {BufferHeader[]} The same array of headers with additional fields.\n\t * @private\n\t */\n\tpreprocessBuffers( bufferHeaders = [] ) {\n\n\t\tfor ( let i = 0; i < bufferHeaders.length; i ++ ) {\n\n\t\t\tconst bufferHeader = bufferHeaders[ i ];\n\t\t\tbufferHeader.isActive = false;\n\t\t\tbufferHeader.isExternal = !! bufferHeader.uri;\n\n\t\t}\n\t\treturn bufferHeaders;\n\n\t}\n\n\t/**\n\t * A buffer view header is the JSON header from the subtree JSON chunk plus\n\t * the isActive flag and a reference to the header for the underlying buffer.\n\t *\n\t * @typedef {object} BufferViewHeader\n\t * @property {BufferHeader} bufferHeader A reference to the header for the underlying buffer\n\t * @property {boolean} isActive Whether this bufferView is currently used.\n\t * @property {number} buffer The index of the underlying buffer.\n\t * @property {number} byteOffset The start byte of the bufferView within the buffer.\n\t * @property {number} byteLength The length of the bufferView. No padding is included in this length.\n\t * @private\n\t */\n\n\t/**\n\t * Iterate the list of buffer views from the subtree JSON and add the\n\t * isActive flag. Also save a reference to the bufferHeader.\n\t *\n\t * @param {Object[]} [bufferViewHeaders=[]] The JSON from subtree.bufferViews.\n\t * @param {BufferHeader[]} bufferHeaders The preprocessed buffer headers.\n\t * @returns {BufferViewHeader[]} The same array of bufferView headers with additional fields.\n\t * @private\n\t */\n\tpreprocessBufferViews( bufferViewHeaders = [], bufferHeaders ) {\n\n\t\tfor ( let i = 0; i < bufferViewHeaders.length; i ++ ) {\n\n\t\t\tconst bufferViewHeader = bufferViewHeaders[ i ];\n\t\t\tbufferViewHeader.bufferHeader = bufferHeaders[ bufferViewHeader.buffer ];\n\t\t\tbufferViewHeader.isActive = false;\n\t\t\t// Keep the external flag for potential use in requestActiveBuffers\n\t\t\tbufferViewHeader.isExternal = bufferViewHeader.bufferHeader.isExternal;\n\n\t\t}\n\t\treturn bufferViewHeaders;\n\n\t}\n\n\t/**\n\t * Parse the three availability bitstreams and store them in the subtree.\n\t *\n\t * @param {Subtree} subtree The subtree to modify.\n\t * @param {Object} subtreeJson The subtree JSON.\n\t * @param {Object} bufferViewsU8 A dictionary of buffer view index to a Uint8Array of its contents.\n\t * @private\n\t */\n\tparseAvailability( subtree, subtreeJson, bufferViewsU8 ) {\n\n\t\tconst branchingFactor = getBoundsDivider( this.rootTile );\n\t\tconst subtreeLevels = this.rootTile.implicitTiling.subtreeLevels;\n\t\tconst tileAvailabilityBits =\n\t\t\t( Math.pow( branchingFactor, subtreeLevels ) - 1 ) / ( branchingFactor - 1 );\n\t\tconst childSubtreeBits = Math.pow( branchingFactor, subtreeLevels );\n\t\tsubtree._tileAvailability = this.parseAvailabilityBitstream(\n\t\t\tsubtreeJson.tileAvailability,\n\t\t\tbufferViewsU8,\n\t\t\ttileAvailabilityBits\n\t\t);\n\t\tsubtree._contentAvailabilityBitstreams = [];\n\t\tfor ( let i = 0; i < subtreeJson.contentAvailabilityHeaders.length; i ++ ) {\n\n\t\t\tconst bitstream = this.parseAvailabilityBitstream(\n\t\t\t\tsubtreeJson.contentAvailabilityHeaders[ i ],\n\t\t\t\tbufferViewsU8,\n\t\t\t\t// content availability has the same length as tile availability.\n\t\t\t\ttileAvailabilityBits\n\t\t\t);\n\t\t\tsubtree._contentAvailabilityBitstreams.push( bitstream );\n\n\t\t}\n\t\tsubtree._childSubtreeAvailability = this.parseAvailabilityBitstream(\n\t\t\tsubtreeJson.childSubtreeAvailability,\n\t\t\tbufferViewsU8,\n\t\t\tchildSubtreeBits\n\t\t);\n\n\t}\n\n\t/**\n\t * Given the JSON describing an availability bitstream, turn it into an\n\t * in-memory representation using an object. This handles bitstreams from a bufferView.\n\t *\n\t * @param {Object} availabilityJson A JSON object representing the availability.\n\t * @param {Object} bufferViewsU8 A dictionary of buffer view index to its Uint8Array contents.\n\t * @param {number} lengthBits The length of the availability bitstream in bits.\n\t * @returns {object}\n\t * @private\n\t */\n\tparseAvailabilityBitstream(\n\t\tavailabilityJson,\n\t\tbufferViewsU8,\n\t\tlengthBits,\n\t) {\n\n\t\tif ( ! isNaN( availabilityJson.constant ) ) {\n\n\t\t\treturn {\n\t\t\t\tconstant: Boolean( availabilityJson.constant ),\n\t\t\t\tlengthBits: lengthBits,\n\t\t\t};\n\n\t\t}\n\t\tlet bufferView;\n\t\t// Check for bitstream first, which is part of the current schema.\n\t\t// bufferView is the name of the bitstream from an older schema.\n\t\tif ( ! isNaN( availabilityJson.bitstream ) ) {\n\n\t\t\tbufferView = bufferViewsU8[ availabilityJson.bitstream ];\n\n\t\t} else if ( ! isNaN( availabilityJson.bufferView ) ) {\n\n\t\t\tbufferView = bufferViewsU8[ availabilityJson.bufferView ];\n\n\t\t}\n\t\treturn {\n\t\t\tbitstream: bufferView,\n\t\t\tlengthBits: lengthBits\n\t\t};\n\n\t}\n\n\t/**\n\t * Expand a single subtree tile. This transcodes the subtree into\n\t * a tree of {@link SubtreeTile}. The root of this tree is stored in\n\t * the placeholder tile's children array. This method also creates\n\t * tiles for the child subtrees to be lazily expanded as needed.\n\t *\n\t * @param {Object | SubtreeTile} subtreeRoot The first node of the subtree.\n\t * @param {Subtree} subtree The parsed subtree.\n\t * @private\n\t */\n\texpandSubtree( subtreeRoot, subtree ) {\n\n\t\t// TODO If multiple contents were supported then this tile could contain both renderable and un renderable content.\n\t\tconst contentTile = SubtreeTile.copy( subtreeRoot );\n\t\t// If the subtree root tile has content, then create a placeholder child with cloned parameters\n\t\t// Todo Multiple contents not handled, keep the first content found\n\t\tfor ( let i = 0; subtree && i < subtree._contentAvailabilityBitstreams.length; i ++ ) {\n\n\t\t\tif ( subtree && this.getBit( subtree._contentAvailabilityBitstreams[ i ], 0 ) ) {\n\n\t\t\t\t// Create a child holding the content uri, this child is similar to its parent and doesn't have any children.\n\t\t\t\tcontentTile.content = { uri: this.parseImplicitURI( subtreeRoot, this.rootTile.content.uri ) };\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\t\tsubtreeRoot.children.push( contentTile );\n\t\t// Creating each leaf inside the current subtree.\n\t\tconst bottomRow = this.transcodeSubtreeTiles(\n\t\t\tcontentTile,\n\t\t\tsubtree\n\t\t);\n\t\t// For each child subtree, create a tile containing the uri of the next subtree to fetch.\n\t\tconst childSubtrees = this.listChildSubtrees( subtree, bottomRow );\n\t\tfor ( let i = 0; i < childSubtrees.length; i ++ ) {\n\n\t\t\tconst subtreeLocator = childSubtrees[ i ];\n\t\t\tconst leafTile = subtreeLocator.tile;\n\t\t\tconst subtreeTile = this.deriveChildTile(\n\t\t\t\tnull,\n\t\t\t\tleafTile,\n\t\t\t\tnull,\n\t\t\t\tsubtreeLocator.childMortonIndex\n\t\t\t);\n\t\t\t// Assign subtree uri as content.\n\t\t\tsubtreeTile.content = { uri: this.parseImplicitURI( subtreeTile, this.rootTile.implicitTiling.subtrees.uri ) };\n\t\t\tleafTile.children.push( subtreeTile );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Transcode the implicitly defined tiles within this subtree and generate\n\t * explicit {@link SubtreeTile} objects. This function only transcodes tiles,\n\t * child subtrees are handled separately.\n\t *\n\t * @param {Object | SubtreeTile} subtreeRoot The root of the current subtree.\n\t * @param {Subtree} subtree The subtree to get availability information.\n\t * @returns {Array} The bottom row of transcoded tiles. This is helpful for processing child subtrees.\n\t * @private\n\t */\n\ttranscodeSubtreeTiles( subtreeRoot, subtree ) {\n\n\t\t// Sliding window over the levels of the tree.\n\t\t// Each row is branchingFactor * length of previous row.\n\t\t// Tiles within a row are ordered by Morton index.\n\t\tlet parentRow = [ subtreeRoot ];\n\t\tlet currentRow = [];\n\t\tfor ( let level = 1; level < this.rootTile.implicitTiling.subtreeLevels; level ++ ) {\n\n\t\t\tconst branchingFactor = getBoundsDivider( this.rootTile );\n\t\t\tconst levelOffset = ( Math.pow( branchingFactor, level ) - 1 ) / ( branchingFactor - 1 );\n\t\t\tconst numberOfChildren = branchingFactor * parentRow.length;\n\t\t\tfor ( let childMortonIndex = 0; childMortonIndex < numberOfChildren; childMortonIndex ++ ) {\n\n\t\t\t\tconst childBitIndex = levelOffset + childMortonIndex;\n\t\t\t\tconst parentMortonIndex = childMortonIndex >> Math.log2( branchingFactor );\n\t\t\t\tconst parentTile = parentRow[ parentMortonIndex ];\n\t\t\t\t// Check if tile is available.\n\t\t\t\tif ( ! this.getBit( subtree._tileAvailability, childBitIndex ) ) {\n\n\t\t\t\t\tcurrentRow.push( undefined );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\t\t\t\t// Create a tile and add it as a child.\n\t\t\t\tconst childTile = this.deriveChildTile(\n\t\t\t\t\tsubtree,\n\t\t\t\t\tparentTile,\n\t\t\t\t\tchildBitIndex,\n\t\t\t\t\tchildMortonIndex\n\t\t\t\t);\n\t\t\t\tparentTile.children.push( childTile );\n\t\t\t\tcurrentRow.push( childTile );\n\n\t\t\t}\n\t\t\tparentRow = currentRow;\n\t\t\tcurrentRow = [];\n\n\t\t}\n\t\treturn parentRow;\n\n\t}\n\n\t/**\n\t * Given a parent tile and information about which child to create, derive\n\t * the properties of the child tile implicitly.\n\t * <p>\n\t * This creates a real tile for rendering.\n\t * </p>\n\t *\n\t * @param {Subtree} subtree The subtree the child tile belongs to.\n\t * @param {Object | SubtreeTile} parentTile The parent of the new child tile.\n\t * @param {number} childBitIndex The index of the child tile within the tile's availability information.\n\t * @param {number} childMortonIndex The morton index of the child tile relative to its parent.\n\t * @returns {SubtreeTile} The new child tile.\n\t * @private\n\t */\n\tderiveChildTile(\n\t\tsubtree,\n\t\tparentTile,\n\t\tchildBitIndex,\n\t\tchildMortonIndex\n\t) {\n\n\t\tconst subtreeTile = new SubtreeTile( parentTile, childMortonIndex );\n\t\tsubtreeTile.boundingVolume = this.getTileBoundingVolume( subtreeTile );\n\t\tsubtreeTile.geometricError = this.getGeometricError( subtreeTile );\n\t\t// Todo Multiple contents not handled, keep the first found content.\n\t\tfor ( let i = 0; subtree && i < subtree._contentAvailabilityBitstreams.length; i ++ ) {\n\n\t\t\tif ( subtree && this.getBit( subtree._contentAvailabilityBitstreams[ i ], childBitIndex ) ) {\n\n\t\t\t\tsubtreeTile.content = { uri: this.parseImplicitURI( subtreeTile, this.rootTile.content.uri ) };\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\t\treturn subtreeTile;\n\n\t}\n\n\t/**\n\t * Get a bit from the bitstream as a Boolean. If the bitstream\n\t * is a constant, the constant value is returned instead.\n\t *\n\t * @param {ParsedBitstream} object\n\t * @param {number} index The integer index of the bit.\n\t * @returns {boolean} The value of the bit.\n\t * @private\n\t */\n\tgetBit( object, index ) {\n\n\t\tif ( index < 0 || index >= object.lengthBits ) {\n\n\t\t\tthrow new Error( 'Bit index out of bounds.' );\n\n\t\t}\n\t\tif ( object.constant !== undefined ) {\n\n\t\t\treturn object.constant;\n\n\t\t}\n\t\t// byteIndex is floor(index / 8)\n\t\tconst byteIndex = index >> 3;\n\t\tconst bitIndex = index % 8;\n\t\treturn ( ( new Uint8Array( object.bitstream )[ byteIndex ] >> bitIndex ) & 1 ) === 1;\n\n\t}\n\n\t/**\n\t * //TODO Adapt for Sphere\n\t * To maintain numerical stability during this subdivision process,\n\t * the actual bounding volumes should not be computed progressively by subdividing a non-root tile volume.\n\t * Instead, the exact bounding volumes are computed directly for a given level.\n\t * @param {Object | SubtreeTile} tile\n\t * @return {Object} object containing the bounding volume.\n\t */\n\tgetTileBoundingVolume( tile ) {\n\n\t\tconst boundingVolume = {};\n\t\tif ( this.rootTile.boundingVolume.region ) {\n\n\t\t\tconst region = [ ...this.rootTile.boundingVolume.region ];\n\t\t\tconst minX = region[ 0 ];\n\t\t\tconst maxX = region[ 2 ];\n\t\t\tconst minY = region[ 1 ];\n\t\t\tconst maxY = region[ 3 ];\n\t\t\tconst sizeX = ( maxX - minX ) / Math.pow( 2, tile.__level );\n\t\t\tconst sizeY = ( maxY - minY ) / Math.pow( 2, tile.__level );\n\t\t\tregion[ 0 ] = minX + sizeX * tile.__x;\t//west\n\t\t\tregion[ 2 ] = minX + sizeX * ( tile.__x + 1 );\t//east\n\t\t\tregion[ 1 ] = minY + sizeY * tile.__y;\t//south\n\t\t\tregion[ 3 ] = minY + sizeY * ( tile.__y + 1 );\t//north\n\t\t\tfor ( let k = 0; k < 4; k ++ ) {\n\n\t\t\t\tconst coord = region[ k ];\n\t\t\t\tif ( coord < - Math.PI ) {\n\n\t\t\t\t\tregion[ k ] += 2 * Math.PI;\n\n\t\t\t\t} else if ( coord > Math.PI ) {\n\n\t\t\t\t\tregion[ k ] -= 2 * Math.PI;\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t\t//Also divide the height in the case of octree.\n\t\t\tif ( isOctreeSubdivision( tile ) ) {\n\n\t\t\t\tconst minZ = region[ 4 ];\n\t\t\t\tconst maxZ = region[ 5 ];\n\t\t\t\tconst sizeZ = ( maxZ - minZ ) / Math.pow( 2, tile.__level );\n\t\t\t\tregion[ 4 ] = minZ + sizeZ * tile.__z;\t//minimum height\n\t\t\t\tregion[ 5 ] = minZ + sizeZ * ( tile.__z + 1 );\t//maximum height\n\n\t\t\t}\n\t\t\tboundingVolume.region = region;\n\n\t\t}\n\t\tif ( this.rootTile.boundingVolume.box ) {\n\n\t\t\t// 0-2: center of the box\n\t\t\t// 3-5: x axis direction and half length\n\t\t\t// 6-8: y axis direction and half length\n\t\t\t// 9-11: z axis direction and half length\n\t\t\tconst box = [ ...this.rootTile.boundingVolume.box ];\n\t\t\tconst cellSteps = 2 ** tile.__level - 1;\n\t\t\tconst scale = Math.pow( 2, - tile.__level );\n\t\t\tconst axisNumber = isOctreeSubdivision( tile ) ? 3 : 2;\n\t\t\tfor ( let i = 0; i < axisNumber; i ++ ) {\n\n\t\t\t\t// scale the bounds axes\n\t\t\t\tbox[ 3 + i * 3 + 0 ] *= scale;\n\t\t\t\tbox[ 3 + i * 3 + 1 ] *= scale;\n\t\t\t\tbox[ 3 + i * 3 + 2 ] *= scale;\n\t\t\t\t// axis vector\n\t\t\t\tconst x = box[ 3 + i * 3 + 0 ];\n\t\t\t\tconst y = box[ 3 + i * 3 + 1 ];\n\t\t\t\tconst z = box[ 3 + i * 3 + 2 ];\n\t\t\t\t// adjust the center by the x, y and z axes\n\t\t\t\tconst axisOffset = i === 0 ? tile.__x : ( i === 1 ? tile.__y : tile.__z );\n\t\t\t\tbox[ 0 ] += 2 * x * ( - 0.5 * cellSteps + axisOffset );\n\t\t\t\tbox[ 1 ] += 2 * y * ( - 0.5 * cellSteps + axisOffset );\n\t\t\t\tbox[ 2 ] += 2 * z * ( - 0.5 * cellSteps + axisOffset );\n\n\t\t\t}\n\t\t\tboundingVolume.box = box;\n\n\t\t}\n\t\treturn boundingVolume;\n\n\t}\n\n\t/**\n\t * Each child’s geometricError is half of its parent’s geometricError.\n\t * @param {Object | SubtreeTile} tile\n\t * @return {number}\n\t */\n\tgetGeometricError( tile ) {\n\n\t\treturn this.rootTile.geometricError / Math.pow( 2, tile.__level );\n\n\t}\n\n\t/**\n\t * Determine what child subtrees exist and return a list of information.\n\t *\n\t * @param {Object} subtree The subtree for looking up availability.\n\t * @param {Array} bottomRow The bottom row of tiles in a transcoded subtree.\n\t * @returns {[]} A list of identifiers for the child subtrees.\n\t * @private\n\t */\n\tlistChildSubtrees( subtree, bottomRow ) {\n\n\t\tconst results = [];\n\t\tconst branchingFactor = getBoundsDivider( this.rootTile );\n\t\tfor ( let i = 0; i < bottomRow.length; i ++ ) {\n\n\t\t\tconst leafTile = bottomRow[ i ];\n\t\t\tif ( leafTile === undefined ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\t\t\tfor ( let j = 0; j < branchingFactor; j ++ ) {\n\n\t\t\t\tconst index = i * branchingFactor + j;\n\t\t\t\tif ( this.getBit( subtree._childSubtreeAvailability, index ) ) {\n\n\t\t\t\t\tresults.push( {\n\t\t\t\t\t\ttile: leafTile,\n\t\t\t\t\t\tchildMortonIndex: index\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\t\treturn results;\n\n\t}\n\t/**\n\t * Replaces placeholder tokens in a URI template with the corresponding tile properties.\n\t *\n\t * The URI template should contain the tokens:\n\t * - `{level}` for the tile's subdivision level.\n\t * - `{x}` for the tile's x-coordinate.\n\t * - `{y}` for the tile's y-coordinate.\n\t * - `{z}` for the tile's z-coordinate.\n\t *\n\t * @param {Object} tile - The tile object containing properties __level, __x, __y, and __z.\n\t * @param {string} uri - The URI template string with placeholders.\n\t * @returns {string} The URI with placeholders replaced by the tile's properties.\n\t */\n\tparseImplicitURI( tile, uri ) {\n\n\t\turi = uri.replace( '{level}', tile.__level );\n\t\turi = uri.replace( '{x}', tile.__x );\n\t\turi = uri.replace( '{y}', tile.__y );\n\t\turi = uri.replace( '{z}', tile.__z );\n\t\treturn uri;\n\n\t}\n\n\t/**\n\t * Generates the full external buffer URI for a tile by combining an implicit URI with a buffer URI.\n\t *\n\t * First, it parses the implicit URI using the tile properties and the provided template. Then, it creates a new URL\n\t * relative to the tile's base path, removes the last path segment, and appends the buffer URI.\n\t *\n\t * @param {Object} tile - The tile object that contains properties:\n\t *   - __level: the subdivision level,\n\t *   - __x, __y, __z: the tile coordinates,\n\t * @param {string} uri - The URI template string with placeholders for the tile (e.g., `{level}`, `{x}`, `{y}`, `{z}`).\n\t * @param {string} bufUri - The buffer file name to append (e.g., \"0_1.bin\").\n\t * @returns {string} The full external buffer URI.\n\t */\n\tparseImplicitURIBuffer( tile, uri, bufUri ) {\n\n\t\t// Generate the base tile URI by replacing placeholders\n\t\tconst subUri = this.parseImplicitURI( tile, uri );\n\n\t\t// Create a URL object relative to the tile's base path\n\t\tconst url = new URL( subUri, this.workingPath + '/' );\n\n\t\t// Remove the last path segment\n\t\turl.pathname = url.pathname.substring( 0, url.pathname.lastIndexOf( '/' ) );\n\n\t\t// Construct the final URL with the buffer URI appended\n\t\treturn new URL( url.pathname + '/' + bufUri, this.workingPath + '/' ).toString();\n\n\n\t}\n\n}\n","import { SUBTREELoader } from './SUBTREELoader.js';\n\nexport class ImplicitTilingPlugin {\n\n\tconstructor() {\n\n\t\tthis.name = 'IMPLICIT_TILING_PLUGIN';\n\n\t}\n\n\tinit( tiles ) {\n\n\t\tthis.tiles = tiles;\n\n\t}\n\n\tpreprocessNode( tile, tileSetDir, parentTile ) {\n\n\t\tif ( tile.implicitTiling ) {\n\n\t\t\ttile.__hasUnrenderableContent = true;\n\t\t\ttile.__hasRenderableContent = false;\n\n\t\t\t// Declare some properties\n\t\t\ttile.__subtreeIdx = 0;\t// Idx of the tile in its subtree\n\t\t\ttile.__implicitRoot = tile;\t// Keep this tile as an Implicit Root Tile\n\n\t\t\t// Coords of the tile\n\t\t\ttile.__x = 0;\n\t\t\ttile.__y = 0;\n\t\t\ttile.__z = 0;\n\t\t\ttile.__level = 0;\n\n\t\t} else if ( /.subtree$/i.test( tile.content?.uri ) ) {\n\n\t\t\t// Handling content uri pointing to a subtree file\n\t\t\ttile.__hasUnrenderableContent = true;\n\t\t\ttile.__hasRenderableContent = false;\n\n\t\t}\n\n\t}\n\n\tparseTile( buffer, tile, extension ) {\n\n\t\tif ( /^subtree$/i.test( extension ) ) {\n\n\t\t\tconst loader = new SUBTREELoader( tile );\n\t\t\tloader.workingPath = tile.__basePath;\n\t\t\tloader.fetchOptions = this.tiles.fetchOptions;\n\t\t\treturn loader.parse( buffer );\n\n\t\t}\n\n\t}\n\n\tpreprocessURL( url, tile ) {\n\n\t\tif ( tile && tile.implicitTiling ) {\n\n\t\t\tconst implicitUri = tile.implicitTiling.subtrees.uri\n\t\t\t\t.replace( '{level}', tile.__level )\n\t\t\t\t.replace( '{x}', tile.__x )\n\t\t\t\t.replace( '{y}', tile.__y )\n\t\t\t\t.replace( '{z}', tile.__z );\n\n\t\t\treturn new URL( implicitUri, tile.__basePath + '/' ).toString();\n\n\t\t}\n\n\t\treturn url;\n\n\t}\n\n\tdisposeTile( tile ) {\n\n\t\tif ( /.subtree$/i.test( tile.content?.uri ) ) {\n\n\t\t\t// TODO: ideally the plugin doesn't need to know about children being processed\n\t\t\ttile.children.length = 0;\n\t\t\ttile.__childrenProcessed = 0;\n\n\t\t}\n\n\t}\n\n}\n","import {\n    GLTFCesiumRTCExtension,\n    GLTFMeshFeaturesExtension,\n    GLTFStructuralMetadataExtension,\n// @ts-expect-error moduleResolution issue\n} from '3d-tiles-renderer/plugins'\nimport {AssetManager} from 'threepipe'\n\nexport const gltfCesiumRTCExtension = {\n    name: 'CESIUM_RTC' satisfies GLTFCesiumRTCExtension['name'],\n    import: (_p)=>new GLTFCesiumRTCExtension(),\n    export: (_w)=>({\n        // todo - save center in userData and access to write back as extension value\n    }),\n    textures: undefined,\n} satisfies AssetManager['gltfExtensions'][number]\n\nexport const gltfStructuralMetadataExtension = {\n    name: 'EXT_structural_metadata' satisfies GLTFStructuralMetadataExtension['name'],\n    import: (_p)=>new GLTFStructuralMetadataExtension(),\n    export: (_w)=>({\n        // todo\n        // beforeParse: ()=>{\n        //     throw new Error('not implemented')\n        // },\n    }),\n    textures: undefined,\n} satisfies AssetManager['gltfExtensions'][number]\n\nexport const gltfMeshFeaturesExtension = {\n    name: 'EXT_mesh_features' satisfies GLTFMeshFeaturesExtension['name'],\n    import: (_p)=>new GLTFMeshFeaturesExtension(),\n    export: (_w)=>({\n        // todo\n        // beforeParse: ()=>{\n        //     throw new Error('not implemented')\n        // },\n    }),\n    // textures: undefined, // todo\n} satisfies AssetManager['gltfExtensions'][number]\n","import {\n    AViewerPluginEventMap,\n    AViewerPluginSync,\n    Box3B,\n    DropzonePlugin,\n    EventListener2,\n    generateUUID,\n    IAssetImporter,\n    ILoader,\n    ImportAddOptions,\n    Importer,\n    IObject3D,\n    iObjectCommons,\n    IRenderManager,\n    IRenderManagerEventMap,\n    Loader,\n    LoadingManager,\n    Object3D,\n    Sphere,\n    ThreeViewer,\n    uiButton,\n    uiFolderContainer,\n    IObjectExtension,\n} from 'threepipe'\nimport {TilesGroup, TilesRenderer} from '3d-tiles-renderer'\nimport {gltfCesiumRTCExtension, gltfMeshFeaturesExtension, gltfStructuralMetadataExtension} from './gltf'\nimport {\n    CesiumIonAuthPlugin,\n    ImplicitTilingPlugin,\n    TilesFadePlugin,\n    UpdateOnChangePlugin,\n// @ts-expect-error moduleResolution issue\n} from '3d-tiles-renderer/plugins'\n\nexport type TilesRendererGroup = TilesGroup & IObject3D\n\nexport interface TilesRendererPluginEventMap extends AViewerPluginEventMap {\n    addTile: {group: TilesRendererGroup}\n    removeTile: {group: TilesRendererGroup}\n}\n\n/**\n * TilesRendererPlugin is a plugin for loading and rendering OGC 3D Tiles using [3d-tiles-renderer](https://github.com/NASA-AMMOS/3DTilesRendererJS) package.\n *\n * Specification - https://www.ogc.org/standards/3dtiles/\n */\n@uiFolderContainer('3D Tiles')\nexport class TilesRendererPlugin extends AViewerPluginSync<TilesRendererPluginEventMap> {\n    public static readonly PluginType: string = 'TilesRendererPlugin'\n    enabled = true\n    dependencies = []\n\n    static readonly DUMMY_EXT = 'tileset'\n\n    objects: TilesRendererGroup[] = []\n\n    protected _importer = new Importer(TilesRendererLoader, [TilesRendererPlugin.DUMMY_EXT, TilesRendererPlugin.DUMMY_EXT + '.json'], [], false)\n\n    constructor() {\n        super()\n    }\n\n    async load(url: string, options?: ImportAddOptions) {\n        if (!this._viewer) {\n            console.warn('TilesRendererPlugin: viewer not set')\n            return\n        }\n        const temp = generateUUID() + '.' + TilesRendererPlugin.DUMMY_EXT\n        const importer = this._viewer.assetManager.importer.registerFile(temp) as TilesRendererLoader\n        if (!importer.isTilesRendererLoader) {\n            console.warn('TilesRendererPlugin: TilesRendererLoader not registered')\n            return\n        }\n        return await this._viewer.load<TilesRendererGroup>(url, {\n            ...options,\n            fileExtension: TilesRendererPlugin.DUMMY_EXT,\n            fileHandler: importer,\n        }).finally(() => {\n            this._viewer?.assetManager.importer.unregisterFile(temp)\n        })\n    }\n\n    async loadCesiumIon(info: TilesImportOptions['CesiumIonAuthPlugin'], options?: ImportAddOptions) {\n        const file = generateUUID() + '.' + TilesRendererPlugin.DUMMY_EXT\n        return this.load(file, {\n            ...options,\n            tiles: {\n                CesiumIonAuthPlugin: info,\n                ...options?.tiles,\n            },\n        })\n    }\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n        this._importer.onCtor = (l, ai) => {\n            if (l) l.ai = ai\n            return l\n        }\n        viewer.assetManager.registerGltfExtension(gltfCesiumRTCExtension)\n        viewer.assetManager.registerGltfExtension(gltfStructuralMetadataExtension)\n        viewer.assetManager.registerGltfExtension(gltfMeshFeaturesExtension)\n        viewer.assetManager.importer.addImporter(this._importer)\n        viewer.object3dManager.registerObjectExtension(this._objectExt)\n        // viewer.scene.addEventListener('addSceneObject', this._addSceneObject)\n        // viewer.scene.addEventListener('mainCameraChange', this._mainCameraChange)\n        // viewer.scene.addEventListener('mainCameraUpdate', this._mainCameraUpdate)\n        viewer.renderManager.addEventListener('preRender', this._preRender) // note - adding to renderManager preRender, not viewer. So its fired for each camera render\n        viewer.renderManager.addEventListener('resize', this._resize)\n    }\n\n    onRemove(viewer: ThreeViewer) {\n        viewer.assetManager.importer.removeImporter(this._importer)\n        viewer.assetManager.unregisterGltfExtension(gltfCesiumRTCExtension.name)\n        viewer.assetManager.unregisterGltfExtension(gltfStructuralMetadataExtension.name)\n        viewer.assetManager.unregisterGltfExtension(gltfMeshFeaturesExtension.name)\n        viewer.object3dManager.unregisterObjectExtension(this._objectExt)\n        // viewer.scene.removeEventListener('addSceneObject', this._addSceneObject)\n        // viewer.scene.removeEventListener('mainCameraChange', this._mainCameraChange)\n        // viewer.scene.removeEventListener('mainCameraUpdate', this._mainCameraUpdate)\n        viewer.renderManager.removeEventListener('preRender', this._preRender)\n        viewer.renderManager.removeEventListener('resize', this._resize)\n        // todo dispose all tiles renderers?\n        super.onRemove(viewer)\n    }\n\n    private _preRender/* : EventListener2<'preRender', ThreeViewerEventMap, ThreeViewer>*/ = () => {\n        const camera = this._viewer?.scene.renderCamera\n        if (!this._viewer || !camera) return\n        if (this._viewer.renderManager.frameCount > 0) return // from ProgressivePlugin\n        camera.updateProjectionMatrix()\n        camera.updateMatrixWorld()\n        for (const group of this.objects) {\n            // todo do we need to do this every frame for every camera?\n            group.tilesRenderer.setCamera(camera)\n            group.tilesRenderer.setResolutionFromRenderer(camera, this._viewer.renderManager.webglRenderer)\n            // group.tilesRenderer.frameCount = 0\n            // console.log('update tiles renderer')\n            group.tilesRenderer.update()\n        }\n    }\n\n    // private _mainCameraUpdate: EventListener2<'mainCameraUpdate', ISceneEventMap, IScene> = (e) => {\n    //     const camera = e.camera ?? this._viewer?.scene.mainCamera\n    //     if (!this._viewer || !camera) return\n    //     camera.updateProjectionMatrix()\n    //     camera.updateMatrixWorld()\n    //     for (const group of this.objects) {\n    //         group.tilesRenderer.update()\n    //     }\n    // }\n    //\n    // private _mainCameraChange: EventListener2<'mainCameraChange', ISceneEventMap, IScene> = (e) => {\n    //     const camera = e.camera\n    //     if (!this._viewer) return\n    //     for (const group of this.objects) {\n    //         // todo deleteCamera?\n    //         group.tilesRenderer.setCamera(camera)\n    //         group.tilesRenderer.setResolutionFromRenderer(camera, this._viewer.renderManager.webglRenderer)\n    //     }\n    // }\n\n    private _resize: EventListener2<'resize', IRenderManagerEventMap, IRenderManager> = () => {\n        if (!this._viewer) return\n        for (const group of this.objects) {\n            group.tilesRenderer.setResolutionFromRenderer(this._viewer.scene.mainCamera, this._viewer.renderManager.webglRenderer)\n        }\n    }\n\n    private _cachedRefs?: Pick<TilesRenderer, 'lruCache' | 'downloadQueue' | 'parseQueue'/* | 'processNodeQueue'*/>\n\n    private _objectExt: IObjectExtension = {\n        uuid: 'TilesRendererPluginObjectExt',\n        isCompatible: (o)=>!!(o as TilesRendererGroup).tilesRenderer,\n        onRegister: (group: TilesRendererGroup)=>{\n            if (!group || !group.tilesRenderer || !this._viewer) return\n\n            // set the second renderer to share the cache and queues from the first\n            if (!this._cachedRefs) {\n                this._cachedRefs = {\n                    lruCache: group.tilesRenderer.lruCache,\n                    downloadQueue: group.tilesRenderer.downloadQueue,\n                    parseQueue: group.tilesRenderer.parseQueue,\n                    // @ts-expect-error not in ts\n                    processNodeQueue: group.tilesRenderer.processNodeQueue,\n                }\n            } else {\n                group.tilesRenderer.lruCache = this._cachedRefs.lruCache\n                group.tilesRenderer.downloadQueue = this._cachedRefs.downloadQueue\n                group.tilesRenderer.parseQueue = this._cachedRefs.parseQueue\n                // @ts-expect-error not in ts\n                group.tilesRenderer.processNodeQueue = this._cachedRefs.processNodeQueue\n            }\n\n            this.objects.push(group)\n\n            group.tilesRenderer.registerPlugin({\n                dispose: () => {\n                    const index = this.objects.indexOf(group)\n                    if (index !== -1) this.objects.splice(index, 1)\n                    this.dispatchEvent({type: 'removeTile', group})\n                },\n            })\n            group.tilesRenderer.setCamera(this._viewer.scene.mainCamera)\n            group.tilesRenderer.setResolutionFromRenderer(this._viewer.scene.mainCamera, this._viewer.renderManager.webglRenderer)\n            group.tilesRenderer.update()\n            group.addEventListener('dispose', ()=>{\n                group.tilesRenderer.dispose()\n            })\n\n            this.dispatchEvent({type: 'addTile', group})\n        },\n    }\n\n    @uiButton()\n    async promptForURL() {\n        const url = await this._viewer?.dialog.prompt('TilesRendererPlugin: Enter URL for the root tileset', '', true)\n        if (!url) return\n        const loader = this._viewer?.getPlugin(DropzonePlugin) ?? this._viewer ?? this\n        return await loader.load(url, {fileExtension: TilesRendererPlugin.DUMMY_EXT})\n    }\n}\n\nexport class TilesRendererLoader extends Loader implements ILoader<TilesRendererGroup> {\n    isTilesRendererLoader = true\n    ai?: IAssetImporter\n    importOptions?: ImportAddOptions\n\n    plugins: ((o: TilesImportOptions, group: TilesRendererGroup)=>object|undefined)[] = [\n        ()=>new UpdateOnChangePlugin(),\n        (opts)=>opts?.ImplicitTilingPlugin !== false ? new ImplicitTilingPlugin() : undefined,\n        (opts)=>opts?.TilesFadePlugin !== false ? new TilesFadePlugin(typeof opts?.TilesFadePlugin === 'object' ? opts.TilesFadePlugin : undefined) : undefined,\n        (opts)=>opts?.CesiumIonAuthPlugin ? new CesiumIonAuthPlugin(typeof opts?.CesiumIonAuthPlugin === 'object' ? opts.CesiumIonAuthPlugin : undefined) : undefined,\n    ]\n\n    constructor(manager: LoadingManager) {\n        super(manager)\n    }\n\n    protected _createTilesRenderer(url: string) {\n\n        const tiles = new TilesRenderer(url)\n        tiles.manager = this.manager\n        tiles.fetchOptions.headers = new Headers(this.requestHeader)\n        tiles.fetchOptions.credentials = this.withCredentials ? 'include' : 'same-origin'\n        tiles.fetchOptions.mode = 'cors'\n\n        return tiles\n    }\n\n    load(url: string, onLoad: (data: unknown) => void, _onProgress?: (event: ProgressEvent) => void, _onError?: (err: unknown) => void) {\n        // todo\n        // let resourcePath = this.resourcePath || this.path || LoaderUtils.extractUrlBase(url)\n\n        const tiles = this._createTilesRenderer(url)\n        const group = iObjectCommons.upgradeObject3D.call(tiles.group) as TilesRendererGroup\n        group.autoUpgradeChildren = false\n\n        const opts = this.importOptions?.tiles ?? {}\n        tiles.errorTarget = opts.errorTarget ?? 1\n        const plugins = [...this.plugins, ...opts.plugins ?? []]\n        for (const plugin of plugins) {\n            const p = plugin(opts, group)\n            if (p) tiles.registerPlugin(p)\n        }\n\n        // bounds, similar to InstancedMesh\n        group.boundingBox = null\n        group.boundingSphere = null\n        group.computeBoundingBox = ()=>{\n            if (!group.boundingBox) group.boundingBox = new Box3B()\n            tiles.getBoundingBox(group.boundingBox)\n        }\n        group.computeBoundingSphere = ()=>{\n            if (!group.boundingSphere) group.boundingSphere = new Sphere()\n            tiles.getBoundingSphere(group.boundingSphere)\n        }\n        tiles.addEventListener('load-tile-set', (_e) => {\n            group.computeBoundingBox!()\n            group.computeBoundingSphere!()\n        })\n\n        // const sup = group.updateWorldMatrix\n        // todo remove in next version\n        group.updateWorldMatrix = (updateParents) => {\n            if (group.parent && updateParents) {\n                group.parent.updateWorldMatrix(updateParents, false)\n            }\n            // run the normal update function to ensure children and inverse matrices are in sync\n            group.updateMatrixWorld(true)\n        }\n\n        // Save promise to tell the viewer/scene when the load is finished, it can then autoScale, autoCenter etc\n        let resolve: any\n        // let reject: any\n        group._loadingPromise = new Promise<void>((res, _rej) => {\n            resolve = res\n            // reject = _rej\n        })\n        tiles.addEventListener('load-tile-set', (e) => {\n            const isRoot = e.tileSet === tiles.rootTileSet\n            if (isRoot && resolve) {\n                resolve()\n            }\n        })\n\n        group.userData.rootPathRefresh = true // when next loaded from gltf, the object will be refreshed based on rootPath\n        group._rootPathRefreshed = true // so that it doesn't do it this time\n        group._sChildren = [] // so that it's children are not saved in the gltf exporter.\n        tiles.registerPlugin({\n            processTileModel: (model: Object3D, tile: any) => {\n                if (tile === (tiles.rootTileSet as any)?.root) {\n                    group._sChildren = [model] // the root tileset will be saved inside the gltf on export\n                }\n            },\n        })\n\n        const ai = this.ai\n        if (ai) {\n            const tmpFile = generateUUID()\n            ai.registerFile(tmpFile + '.gltf') // to set the gltf loader in manager\n            ai.registerFile(tmpFile + '.drc') // to set the draco loader in manager\n\n            const preprocessUrl = (url1: string) => {\n                if (tiles.preprocessURL) return tiles.preprocessURL(url1)\n                return url1\n            }\n            ai.addURLModifier(preprocessUrl)\n            tiles.registerPlugin({\n                dispose: () => {\n                    if (ai) {\n                        ai.unregisterFile(tmpFile + '.gltf')\n                        ai.unregisterFile(tmpFile + '.drc')\n                        ai.removeURLModifier(preprocessUrl)\n                    }\n                },\n            })\n\n        }\n\n        tiles.addEventListener('tile-visibility-change', (_e) => {\n            // console.log(e)\n        })\n\n        const setDirty = (_e: any)=>{\n            // console.log(e)\n            group.setDirty({frameFade: false})\n        }\n        tiles.addEventListener('load-content', setDirty)\n        tiles.addEventListener('load-tile-set', setDirty)\n        tiles.addEventListener('needs-update', setDirty)\n\n        tiles.update()\n        onLoad(group)\n\n    }\n\n}\n\nexport interface TilesImportOptions{\n    /**\n     * @default 1\n     */\n    errorTarget?: number\n    ImplicitTilingPlugin?: boolean\n    TilesFadePlugin?: boolean | {\n        maximumFadeOutTiles?: number,\n        fadeRootTiles?: boolean,\n        fadeDuration?: number,\n    }\n    CesiumIonAuthPlugin?: boolean | {\n        apiToken: string,\n        assetId?: string | null,\n        autoRefreshToken?: boolean\n    }\n    plugins?: ((opts: TilesImportOptions, group: TilesRendererGroup)=>object|undefined)[]\n}\n\ndeclare module 'threepipe'{\n    interface ImportAddOptions {\n        tiles?: TilesImportOptions\n    }\n}\n","import {\n    BaseImporterPlugin,\n    generateUUID,\n    GLTFLoader2,\n    IAssetImporter,\n    ILoader, ImportAddOptions,\n    Importer,\n    LoadingManager,\n    ThreeViewer,\n} from 'threepipe'\nimport type {B3DMResult} from '3d-tiles-renderer/src/three/loaders/B3DMLoader'\nimport {B3DMLoader, B3DMScene, LoaderBase} from '3d-tiles-renderer'\nimport {GLTF} from 'three/examples/jsm/loaders/GLTFLoader'\n\n/**\n * Adds support for loading .b3dm files and data uris.\n * Batched 3D Model (b3dm) file format is part of OGC 3D Tiles.\n * Specification - https://www.ogc.org/standards/3dtiles/\n */\nexport class B3DMLoadPlugin extends BaseImporterPlugin {\n    public static readonly PluginType = 'B3DMLoadPlugin'\n    protected _importer = new Importer(B3DMLoader2, ['b3dm'], ['model/b3dm'], false)\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n        this._importer.onCtor = (l, ai) => {\n            if (l) l.ai = ai\n            return l\n        }\n    }\n}\n\n// todo no need to extend GLTFLoader2 for just transform function, it can be called manually or rewritten\nexport class B3DMLoader2 extends GLTFLoader2 implements ILoader<B3DMResult, B3DMScene> {\n    loader\n    ai?: IAssetImporter\n\n    constructor(manager: LoadingManager) {\n        super(manager)\n        this.loader = new B3DMLoader(manager)\n    }\n\n    transform(res: B3DMResult, options: ImportAddOptions): B3DMScene {\n        return super.transform(res, options) as any\n    }\n\n    parse(data: ArrayBuffer, _path: string, onLoad: (gltf: GLTF) => void, onError?: (event: ErrorEvent) => void, _url?: string) {\n        if (!this.ai) {\n            console.error('[B3DMLoader] load failed, IAssetImporter not set')\n        }\n        const tmpFile = generateUUID() + '.gltf'\n        this.ai?.registerFile(tmpFile) // to set the gltf loader in manager\n\n        ;(this.loader as LoaderBase).workingPath = _path\n\n        this.loader.parse(data)\n            .then(onLoad)\n            .catch(onError)\n            .finally(() => {\n                if (tmpFile) this.ai?.unregisterFile(tmpFile)\n            })\n        // super.parse(data, path, onLoad, onError, url)\n    }\n}\n","import {\n    BaseImporterPlugin,\n    generateUUID,\n    GLTF,\n    GLTFLoader2,\n    IAssetImporter,\n    ILoader,\n    ImportAddOptions,\n    Importer,\n    LoadingManager,\n    ThreeViewer,\n} from 'threepipe'\nimport type {I3DMResult} from '3d-tiles-renderer/src/three/loaders/I3DMLoader'\nimport {I3DMLoader, I3DMScene, LoaderBase} from '3d-tiles-renderer'\n\n/**\n * Adds support for loading .i3dm files and data uris.\n * Instanced 3D Model (i3dm) file format is part of OGC 3D Tiles.\n * Specification - https://www.ogc.org/standards/3dtiles/\n */\nexport class I3DMLoadPlugin extends BaseImporterPlugin {\n    public static readonly PluginType = 'I3DMLoadPlugin'\n    protected _importer = new Importer(I3DMLoader2, ['i3dm'], ['model/i3dm'], false)\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n        this._importer.onCtor = (l, ai) => {\n            if (l) l.ai = ai\n            return l\n        }\n    }\n}\n\n// todo no need to extend GLTFLoader2 for just transform function, it can be called manually or rewritten\nexport class I3DMLoader2 extends GLTFLoader2 implements ILoader<I3DMResult, I3DMScene> {\n    loader\n    ai?: IAssetImporter\n\n    constructor(manager: LoadingManager) {\n        super(manager)\n        this.loader = new I3DMLoader(manager)\n    }\n\n    transform(res: I3DMResult, options: ImportAddOptions): I3DMScene {\n        return super.transform(res, options) as any\n    }\n\n    parse(data: ArrayBuffer, _path: string, onLoad: (gltf: GLTF) => void, onError?: (event: ErrorEvent) => void, _url?: string) {\n        if (!this.ai) {\n            console.error('[I3DMLoader] load failed, IAssetImporter not set')\n        }\n        const tmpFile = generateUUID() + '.gltf'\n        this.ai?.registerFile(tmpFile) // to set the gltf loader in manager\n\n        ;(this.loader as LoaderBase).workingPath = _path\n\n        this.loader.parse(data)\n            .then(onLoad)\n            .catch(onError)\n            .finally(() => {\n                if (tmpFile) this.ai?.unregisterFile(tmpFile)\n            })\n        // super.parse(data, path, onLoad, onError, url)\n    }\n}\n","import {\n    AnyOptions,\n    BaseImporterPlugin,\n    FileLoader, generateUUID,\n    IAssetImporter,\n    ILoader,\n    Importer,\n    Loader,\n    LoaderUtils,\n    LoadingManager,\n    ThreeViewer,\n} from 'threepipe'\nimport type {PNTSResult} from '3d-tiles-renderer/src/three/loaders/PNTSLoader'\nimport {LoaderBase, PNTSLoader, PNTSScene} from '3d-tiles-renderer'\n\n/**\n * Adds support for loading .pnts files and data uris.\n * Point Cloud (pnts) file format is part of OGC 3D Tiles.\n * Specification - https://www.ogc.org/standards/3dtiles/\n */\nexport class PNTSLoadPlugin extends BaseImporterPlugin {\n    public static readonly PluginType = 'PNTSLoadPlugin'\n    protected _importer = new Importer(PNTSLoader2, ['pnts'], ['model/pnts'], false)\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n        this._importer.onCtor = (l, ai) => {\n            if (l) l.ai = ai\n            return l\n        }\n    }\n}\n\nexport class PNTSLoader2 extends Loader implements ILoader<PNTSResult, PNTSScene> {\n    loader\n    ai?: IAssetImporter\n\n    constructor(manager: LoadingManager) {\n        super(manager)\n        this.loader = new PNTSLoader(manager)\n    }\n\n    load(url: string, onLoad: (data: unknown) => void, onProgress?: (event: ProgressEvent) => void, onError?: (err: unknown) => void) {\n        // eslint-disable-next-line @typescript-eslint/no-this-alias\n        const scope = this\n\n        let resourcePath\n\n        if (this.resourcePath !== '') {\n\n            resourcePath = this.resourcePath\n\n        } else if (this.path !== '') {\n\n            resourcePath = this.path\n\n        } else {\n\n            resourcePath = LoaderUtils.extractUrlBase(url)\n\n        }\n\n        // Tells the LoadingManager to track an extra item, which resolves after\n        // the model is fully loaded. This means the count of items loaded will\n        // be incorrect, but ensures manager.onLoad() does not fire early.\n        this.manager.itemStart(url)\n\n        // eslint-disable-next-line @typescript-eslint/naming-convention\n        const _onError = function(e: any) {\n\n            if (onError) {\n\n                onError(e)\n\n            } else {\n\n                console.error(e)\n\n            }\n\n            scope.manager.itemError(url)\n            scope.manager.itemEnd(url)\n\n        }\n\n        const loader = new FileLoader(this.manager)\n\n        loader.setPath(this.path)\n        loader.setResponseType('arraybuffer')\n        loader.setRequestHeader(this.requestHeader)\n        loader.setWithCredentials(this.withCredentials)\n\n        loader.load(url, function(data) {\n\n            try {\n\n                scope.parse(data as any, resourcePath, function(gltf) {\n\n                    onLoad(gltf)\n\n                    scope.manager.itemEnd(url)\n\n                }, _onError, url)\n\n            } catch (e) {\n\n                _onError(e)\n\n            }\n\n        }, onProgress, _onError)\n\n    }\n\n    transform(res: PNTSResult, _options: AnyOptions): PNTSScene {\n        return res.scene\n    }\n\n    parse(data: ArrayBuffer, _path: string, onLoad: (res: PNTSResult) => void, onError?: (event: ErrorEvent) => void, _url?: string) {\n        if (!this.ai) {\n            console.error('[PNTSLoader] load failed, IAssetImporter not set')\n        }\n\n        const tmpFile = generateUUID() + '.drc'\n        this.ai?.registerFile(tmpFile) // to set the draco loader in manager\n\n        ;(this.loader as LoaderBase).workingPath = _path\n\n        this.loader.parse(data)\n            .then(onLoad)\n            .catch(onError)\n            .finally(() => {\n                if (tmpFile) this.ai?.unregisterFile(tmpFile)\n            })\n        // super.parse(data, path, onLoad, onError, url)\n    }\n}\n","import {\n    AnyOptions,\n    BaseImporterPlugin,\n    FileLoader, generateUUID,\n    Group,\n    IAssetImporter,\n    ILoader,\n    Importer,\n    Loader,\n    LoaderUtils,\n    LoadingManager,\n    ThreeViewer,\n} from 'threepipe'\nimport type {CMPTResult} from '3d-tiles-renderer/src/three/loaders/CMPTLoader'\nimport {CMPTLoader, LoaderBase} from '3d-tiles-renderer'\n\n/**\n * Adds support for loading .cmpt files and data uris.\n * Composite (cmpt) file format is part of OGC 3D Tiles.\n * Specification - https://www.ogc.org/standards/3dtiles/\n */\nexport class CMPTLoadPlugin extends BaseImporterPlugin {\n    public static readonly PluginType = 'CMPTLoadPlugin'\n    protected _importer = new Importer(CMPTLoader2, ['cmpt'], ['model/cmpt'], false)\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n        this._importer.onCtor = (l, ai) => {\n            if (l) l.ai = ai\n            return l\n        }\n    }\n}\n\nexport class CMPTLoader2 extends Loader implements ILoader<CMPTResult, Group> {\n    loader\n    ai?: IAssetImporter\n\n    constructor(manager: LoadingManager) {\n        super(manager)\n        this.loader = new CMPTLoader(manager)\n    }\n\n\n    load(url: string, onLoad: (data: unknown) => void, onProgress?: (event: ProgressEvent) => void, onError?: (err: unknown) => void) {\n        // eslint-disable-next-line @typescript-eslint/no-this-alias\n        const scope = this\n\n        let resourcePath\n\n        if (this.resourcePath !== '') {\n\n            resourcePath = this.resourcePath\n\n        } else if (this.path !== '') {\n\n            resourcePath = this.path\n\n        } else {\n\n            resourcePath = LoaderUtils.extractUrlBase(url)\n\n        }\n\n        // Tells the LoadingManager to track an extra item, which resolves after\n        // the model is fully loaded. This means the count of items loaded will\n        // be incorrect, but ensures manager.onLoad() does not fire early.\n        this.manager.itemStart(url)\n\n        // eslint-disable-next-line @typescript-eslint/naming-convention\n        const _onError = function(e: any) {\n\n            if (onError) {\n\n                onError(e)\n\n            } else {\n\n                console.error(e)\n\n            }\n\n            scope.manager.itemError(url)\n            scope.manager.itemEnd(url)\n\n        }\n\n        const loader = new FileLoader(this.manager)\n\n        loader.setPath(this.path)\n        loader.setResponseType('arraybuffer')\n        loader.setRequestHeader(this.requestHeader)\n        loader.setWithCredentials(this.withCredentials)\n\n        loader.load(url, function(data) {\n\n            try {\n\n                scope.parse(data as any, resourcePath, function(gltf) {\n\n                    onLoad(gltf)\n\n                    scope.manager.itemEnd(url)\n\n                }, _onError, url)\n\n            } catch (e) {\n\n                _onError(e)\n\n            }\n\n        }, onProgress, _onError)\n\n    }\n\n    transform(res: CMPTResult, _options: AnyOptions): Group {\n        return res.scene\n    }\n\n    parse(data: ArrayBuffer, _path: string, onLoad: (res: CMPTResult) => void, onError?: (event: ErrorEvent) => void, _url?: string) {\n        if (!this.ai) {\n            console.error('[CMPTLoader] load failed, IAssetImporter not set')\n        }\n        // todo register draco for inside pnts files\n\n        const tmpFile = generateUUID()\n        this.ai?.registerFile(tmpFile + '.gltf') // to set the gltf loader in manager\n        this.ai?.registerFile(tmpFile + '.drc') // to set the draco loader in manager\n\n        ;(this.loader as LoaderBase).workingPath = _path\n\n        this.loader.parse(data)\n            .then(onLoad)\n            .catch(onError)\n            .finally(() => {\n                if (tmpFile && this.ai) {\n                    this.ai.unregisterFile(tmpFile + '.gltf')\n                    this.ai.unregisterFile(tmpFile + '.drc')\n                }\n            })\n        // super.parse(data, path, onLoad, onError, url)\n    }\n}\n","import {BaseImporterPlugin, Importer, LoadingManager, ThreeViewer} from 'threepipe'\n// @ts-expect-error moduleResolution issue\nimport {DeepZoomImagePlugin} from '3d-tiles-renderer/plugins'\nimport {TilesRendererLoader, TilesRendererPlugin} from './TilesRendererPlugin'\n\n/**\n * Adds support for loading .dzi files and data uris.\n * Deep Zoom Image (dzi) file format - https://openseadragon.github.io/\n */\nexport class DeepZoomImageLoadPlugin extends BaseImporterPlugin {\n    public static readonly PluginType = 'DeepZoomImageLoadPlugin'\n    protected _importer = new Importer(DeepZoomImageLoader, ['dzi'], ['image/dzi'], false)\n\n    dependencies = [TilesRendererPlugin]\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n        this._importer.onCtor = (l, ai) => {\n            if (l) l.ai = ai\n            return l\n        }\n    }\n}\n\nexport class DeepZoomImageLoader extends TilesRendererLoader {\n    constructor(manager: LoadingManager) {\n        super(manager)\n        this.plugins.push(\n            (opts)=>{\n                if (opts?.DeepZoomImagePlugin === false) return undefined\n                const op = typeof opts?.DeepZoomImagePlugin === 'object' ? opts.DeepZoomImagePlugin : {}\n                return new DeepZoomImagePlugin({\n                    // center: true,\n                    ...op,\n                })\n            },\n        )\n    }\n}\n\ndeclare module 'TilesRendererPlugin'{\n    interface TilesImportOptions {\n        DeepZoomImagePlugin?: boolean | {\n            center?: boolean,\n            pixelSize?: number,\n            useRecommendedSettings?: boolean,\n        }\n    }\n}\n","import {BaseImporterPlugin, Importer, LoadingManager, ThreeViewer} from 'threepipe'\n// @ts-expect-error moduleResolution issue\nimport {XYZTilesPlugin} from '3d-tiles-renderer/plugins'\nimport {TilesRendererLoader, TilesRendererPlugin} from './TilesRendererPlugin'\n\n/**\n * Adds support for loading slippy map tiles(OpenStreetMap) in png format\n * https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames\n */\nexport class SlippyMapTilesLoadPlugin extends BaseImporterPlugin {\n    public static readonly PluginType = 'SlippyMapTilesLoadPlugin'\n    static readonly DUMMY_EXT = 'xyztiles'\n    protected _importer = new Importer(SlippyMapTilesLoader, [SlippyMapTilesLoadPlugin.DUMMY_EXT], [], false)\n\n    dependencies = [TilesRendererPlugin]\n\n    onAdded(viewer: ThreeViewer) {\n        super.onAdded(viewer)\n        this._importer.onCtor = (l, ai) => {\n            if (l) l.ai = ai\n            return l\n        }\n    }\n}\n\nexport class SlippyMapTilesLoader extends TilesRendererLoader {\n    constructor(manager: LoadingManager) {\n        super(manager)\n        this.plugins.push(\n            (opts)=>{\n                if (opts?.XYZTilesPlugin === false) return undefined\n                const op = typeof opts?.XYZTilesPlugin === 'object' ? opts.XYZTilesPlugin : {}\n                return new XYZTilesPlugin(op)\n            },\n        )\n    }\n}\n\ndeclare module 'TilesRendererPlugin'{\n    interface TilesImportOptions {\n        XYZTilesPlugin?: boolean | {\n            levels: number // default = 20,\n            tileDimension: number // default = 256,\n            pixelSize: number // default = 1e-5,\n            center?: boolean,\n            projection?: 'ellipsoid' | 'planar',\n            useRecommendedSettings?: boolean,\n        }\n    }\n}\n","import {\n    ACameraControlsPlugin,\n    Camera,\n    serialize,\n    TControlsCtor,\n    uiFolderContainer,\n    uiInput,\n    uiToggle,\n    uiVector,\n    Vector3,\n} from 'threepipe'\nimport {EnvironmentControls} from '3d-tiles-renderer'\nimport {UiObjectConfig} from 'uiconfig.js'\n\nexport class EnvironmentControlsPlugin extends ACameraControlsPlugin {\n    public static readonly PluginType = 'EnvironmentControlsPlugin'\n    readonly controlsKey = 'environment'\n\n    protected _controlsCtor: TControlsCtor = (object, domElement) => {\n        return new EnvironmentControls2(object.parent ?? undefined, object, !domElement?.ownerDocument ? (domElement || document).documentElement : domElement)\n    }\n}\n\n@uiFolderContainer('Environment Controls')\nexport class EnvironmentControls2 extends EnvironmentControls {\n    @uiToggle() @serialize() declare enabled: boolean\n    @uiInput() @serialize() declare cameraRadius: number\n    @uiInput() @serialize() declare rotationSpeed: number\n    @uiInput() @serialize() declare minAltitude: number\n    @uiInput() @serialize() declare maxAltitude: number\n    @uiInput() @serialize() declare minDistance: number\n    @uiInput() @serialize() maxDistance = 1e9 // should be Infinity but this breaks the UI\n    @uiInput() @serialize() declare minZoom: number\n    @uiInput() @serialize() maxZoom = 1e9 // should be Infinity but this breaks the UI\n    @uiInput() @serialize() declare zoomSpeed: number\n    @uiToggle() @serialize() declare adjustHeight: boolean\n    @uiToggle() @serialize() declare enableDamping: boolean\n    @uiInput() @serialize() declare dampingFactor: number\n    @uiToggle() @serialize() declare useFallbackPlane: boolean\n\n    @uiVector() @serialize() declare pivotPoint: Vector3\n\n    // does nothing right now, required so autoLookAtTarget is not used\n    target = new Vector3()\n\n    get object() {\n        // @ts-expect-error not in ts\n        return this.camera as Camera/* |null*/\n    }\n\n    declare uiConfig: UiObjectConfig<void, 'folder'>\n}\n","import {\n    ACameraControlsPlugin, ICamera,\n    OrthographicCamera2,\n    PerspectiveCamera2,\n    serialize,\n    TControlsCtor,\n    uiFolderContainer,\n    uiInput,\n    uiToggle,\n    uiVector,\n    Vector3,\n} from 'threepipe'\nimport {GlobeControls} from '3d-tiles-renderer'\nimport {UiObjectConfig} from 'uiconfig.js'\n\nexport class GlobeControlsPlugin extends ACameraControlsPlugin {\n    public static readonly PluginType = 'GlobeControlsPlugin'\n    readonly controlsKey = 'globe'\n\n    protected _controlsCtor: TControlsCtor = (object, domElement) => {\n        if ((object as ICamera).userData.autoNearFar) {\n            console.warn('GlobeControlsPlugin: autoNearFar is not supported with GlobeControlsPlugin, it will be disabled, use EnvironmentControlsPlugin instead to keep default behaviour')\n            ;(object as ICamera).userData.autoNearFar = false\n        }\n        return new GlobeControls2(object.parent ?? undefined, object, !domElement?.ownerDocument ? (domElement || document).documentElement : domElement)\n    }\n}\n\n@uiFolderContainer('Globe Controls')\nexport class GlobeControls2 extends GlobeControls {\n    @uiToggle() @serialize() declare enabled: boolean\n    @uiInput() @serialize() declare cameraRadius: number\n    @uiInput() @serialize() declare rotationSpeed: number\n    @uiInput() @serialize() declare minAltitude: number\n    @uiInput() @serialize() declare maxAltitude: number\n    @uiInput() @serialize() declare minDistance: number\n    @uiInput() @serialize() maxDistance = 1e9 // should be Infinity but this breaks the UI\n    @uiInput() @serialize() declare minZoom: number\n    @uiInput() @serialize() maxZoom = 1e9 // should be Infinity but this breaks the UI\n    @uiInput() @serialize() declare zoomSpeed: number\n    @uiToggle() @serialize() declare adjustHeight: boolean\n    @uiToggle() @serialize() declare enableDamping: boolean\n    @uiInput() @serialize() declare dampingFactor: number\n    @uiToggle() @serialize() declare useFallbackPlane: boolean\n\n    @uiToggle() @serialize() declare nearMargin: number\n    @uiToggle() @serialize() declare farMargin: number\n\n    @uiVector() @serialize() declare pivotPoint: Vector3\n\n    declare camera: PerspectiveCamera2 | OrthographicCamera2\n    // does nothing right now, required so autoLookAtTarget is not used\n    target = new Vector3()\n\n    get object() {\n        return this.camera\n    }\n\n    declare uiConfig: UiObjectConfig<void, 'folder'>\n\n    // this is a workaround required because GlobeControls changes the near, far and we need it in minNear and minFar\n    update(deltaTime?: number) {\n        const {near, far} = this.camera\n        super.update(deltaTime)\n        if (this.camera.userData.autoNearFar || this.camera.userData.autoNearFar === undefined) return\n        if (this.camera.near !== near || this.camera.far !== far) {\n            this.camera.userData.minNearPlane = this.camera.near // dont set without userData, as that will trigger setDirty\n            this.camera.userData.maxFarPlane = this.camera.far\n            this.camera.near = near\n            this.camera.far = far\n            this.camera.updateProjectionMatrix()\n        }\n    }\n\n}\n"],"names":["priorityCallback","viewErrorTarget","tile","name","root","child","buffer","_norm","_vec","_vec2","_matrix","_sphere","_euler","_vecX","_vecY","_vecZ","_pos","_ray","tempMat","byteLength","result","sphere","_invMatrix","planes","_estimateBytesUsed","scene","NONE","_rotMatrix","_forward","_right","_quaternion","_pointer","domElement","TILE_X","TILE_Y","TILE_LEVEL","_uv","i","indices","normals","url","target","bufferCons","_dstPixel","EXT_NAME","batchedMesh","__decorateClass","_a"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77]}