@threepipe/plugin-3d-tiles-renderer 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/B3DMLoadPlugin.d.ts +22 -0
  2. package/dist/B3DMLoadPlugin.d.ts.map +1 -0
  3. package/dist/CMPTLoadPlugin.d.ts +22 -0
  4. package/dist/CMPTLoadPlugin.d.ts.map +1 -0
  5. package/dist/DeepZoomImageLoadPlugin.d.ts +25 -0
  6. package/dist/DeepZoomImageLoadPlugin.d.ts.map +1 -0
  7. package/dist/EnvironmentControlsPlugin.d.ts +29 -0
  8. package/dist/EnvironmentControlsPlugin.d.ts.map +1 -0
  9. package/dist/GlobeControlsPlugin.d.ts +33 -0
  10. package/dist/GlobeControlsPlugin.d.ts.map +1 -0
  11. package/dist/I3DMLoadPlugin.d.ts +21 -0
  12. package/dist/I3DMLoadPlugin.d.ts.map +1 -0
  13. package/dist/PNTSLoadPlugin.d.ts +22 -0
  14. package/dist/PNTSLoadPlugin.d.ts.map +1 -0
  15. package/dist/SlippyMapTilesLoadPlugin.d.ts +29 -0
  16. package/dist/SlippyMapTilesLoadPlugin.d.ts.map +1 -0
  17. package/dist/TilesRendererPlugin.d.ts +67 -0
  18. package/dist/TilesRendererPlugin.d.ts.map +1 -0
  19. package/dist/dependencies.txt +212 -0
  20. package/dist/gltf.d.ts +18 -0
  21. package/dist/gltf.d.ts.map +1 -0
  22. package/dist/index.d.ts +11 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +10873 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/index.mjs +10856 -0
  27. package/dist/index.mjs.map +1 -0
  28. package/package.json +51 -0
  29. package/src/B3DMLoadPlugin.ts +64 -0
  30. package/src/CMPTLoadPlugin.ts +144 -0
  31. package/src/DeepZoomImageLoadPlugin.ts +49 -0
  32. package/src/EnvironmentControlsPlugin.ts +52 -0
  33. package/src/GlobeControlsPlugin.ts +75 -0
  34. package/src/I3DMLoadPlugin.ts +65 -0
  35. package/src/PNTSLoadPlugin.ts +137 -0
  36. package/src/SlippyMapTilesLoadPlugin.ts +50 -0
  37. package/src/TilesRendererPlugin.ts +354 -0
  38. package/src/global.d.ts +40 -0
  39. package/src/gltf.ts +40 -0
  40. package/src/index.ts +16 -0
@@ -0,0 +1 @@
1
+ {"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 EventListener2,\n generateUUID,\n IAssetImporter,\n ILoader,\n Importer,\n IObject3D,\n iObjectCommons,\n IRenderManager,\n IRenderManagerEventMap,\n IScene,\n ISceneEventMap,\n Loader,\n ImportAddOptions,\n LoadingManager,\n ThreeViewer, Sphere, uiButton,\n} from 'threepipe'\nimport {TilesGroup, TilesRenderer} from '3d-tiles-renderer'\nimport {gltfCesiumRTCExtension, gltfMeshFeaturesExtension, gltfStructuralMetadataExtension} from './gltf'\n// @ts-expect-error moduleResolution issue\nimport {ImplicitTilingPlugin, TilesFadePlugin, UpdateOnChangePlugin, CesiumIonAuthPlugin} 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 */\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 })\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.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.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 _addSceneObject: EventListener2<'addSceneObject', ISceneEventMap, IScene> = (e)=>{\n const object = e.object\n const group = object as TilesRendererGroup\n // console.log(e)\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 @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 return this.load(url)\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) resolve()\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","_a","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"],"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]}