@jdultra/threedtiles 13.2.2 → 13.2.3

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.
@@ -290,5 +290,5 @@ out vec2 vUv;
290
290
  void main() {
291
291
  vUv = uv;
292
292
  gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
293
- }`}var oe;const ut=new G.Sphere(new G.Vector3(0,0,0),1),xt=new it([0,0,0,1,0,0,0,1,0,0,0,1]);new G.Box3;const gt=new G.Vector3(0,0,0),Gt=new G.Vector3(0,0,0),zc=new G.Vector3(0,1,0),da=new G.Ray,ha=new G.Matrix4;new G.Matrix4,new G.Frustum;const ba=new G.Vector3,la=[],Ln=new G.Quaternion,rt={};function Vi(){var r=[];for(let e in rt)rt.hasOwnProperty(e)&&rt[e]>0&&r.push(e);return r}class jr extends G.Object3D{constructor(e){super();const t=this;if(t.splatsMesh=e.splatsMesh,t.splatsQuality=e.splatsQuality!=null?e.splatsQuality:.75,t.splatsCPUCulling=e.splatsCPUCulling!=null&&e.splatsQuality,this.contentURL=[],e.domWidth&&e.domHeight?this.rendererSize=new G.Vector2(e.domWidth,e.domHeight):this.rendererSize=new G.Vector2(1e3,1e3),this.loadingStrategy=e.loadingStrategy?e.loadingStrategy.toUpperCase():"INCREMENTAL",this.distanceBias=Math.max(1e-4,e.distanceBias?e.distanceBias:1),this.proxy=e.proxy,this.drawBoundingVolume=!!e.drawBoundingVolume&&e.drawBoundingVolume,this.displayErrors=e.displayErrors,this.displayCopyright=e.displayCopyright,e.queryParams&&(this.queryParams={...e.queryParams}),this.uuid=qn(),e.tileLoader)this.tileLoader=e.tileLoader;else{const i={};i.meshCallback=e.meshCallback?e.meshCallback:(s,A)=>{s.material.wireframe=!1,s.material.side=G.DoubleSide},i.pointsCallback=e.pointsCallback?e.pointsCallback:(s,A)=>{s.material.size=Math.pow(A,.33),s.material.sizeAttenuation=!0},i.proxy=this.proxy,i.renderer=e.renderer,i.dracoLoader=e.dracoLoader,i.ktx2Loader=e.ktx2Loader,t.tileLoader=new di(i);const o=this.update;this.update=s=>{o.call(t,s),t.tileLoader.update()}}if(this.displayCopyright=!!e.displayCopyright,this.geometricErrorMultiplier=e.geometricErrorMultiplier?e.geometricErrorMultiplier:1,this.splatsCropRadius=Number.MAX_VALUE,this.splatsSizeMultiplier=1,this.renderer=e.renderer,this.meshCallback=e.meshCallback,this.loadOutsideView=e.loadOutsideView,this.cameraOnLoad=e.cameraOnLoad,this.parentTile=e.parentTile,this.occlusionCullingService=e.occlusionCullingService,this.static=e.static,this.occlusionCullingService&&(this.color=new G.Color,this.color.setHex(16777215*Math.random()),this.colorID=G.MathUtils.clamp(255*t.color.r,0,255)<<16^G.MathUtils.clamp(255*t.color.g,0,255)<<8^G.MathUtils.clamp(255*t.color.b,0,255)),this.static&&(this.matrixAutoUpdate=!1,this.matrixWorldAutoUpdate=!1),this.childrenTiles=[],this.meshContent=[],this.tileContent,this.refine,this.rootPath,this.geometricError,this.boundingVolume,this.json,this.materialVisibility=!1,this.level=e.level?e.level:0,this.hasMeshContent=0,this.hasUnloadedJSONContent=0,this.centerModel=e.centerModel,this.abortController=new AbortController,this.onLoadCallback=e.onLoadCallback,e.json)t._setup(e);else if(e.url){var a=e.url;if(t.queryParams){var n="";for(let i in t.queryParams)t.queryParams.hasOwnProperty(i)&&(n+="&"+i+"="+t.queryParams[i]);a.includes("?")?a+=n:a+="?"+n.substring(1)}(t.proxy?()=>fetch(t.proxy,{method:"POST",body:a,signal:t.abortController.signal}):()=>fetch(a,{signal:t.abortController.signal}))().then(i=>{if(!i.ok)throw new Error(`couldn't load "${e.url}". Request failed with status ${i.status} : ${i.statusText}`);i.json().then(o=>Br(o,a)).then(o=>{t._setup({rootPath:It.dirname(e.url),json:o})})}).catch(i=>{t.displayErrors&&Gn(i)})}}setSplatsSizeMultiplier(e){this.splatsSizeMultiplier=e,this.splatsMesh&&this.splatsMesh.setSplatsSizeMultiplier(this.splatsSizeMultiplier)}setSplatsCropRadius(e){this.splatsCropRadius=e,this.splatsMesh&&this.splatsMesh.setSplatsCropRadius(this.splatsCropRadius)}setSplatsCPUCulling(e){this.splatsCPUCulling=e,this.splatsMesh&&this.splatsMesh.setSplatsCPUCulling(e)}setSplatsQuality(e){this.splatsMesh&&this.splatsMesh.setQuality(splatsCPUCulling)}updateMatrices(){this.updateMatrix(),this.splatsMesh&&this.splatsMesh.updateMatrix(),this.static&&(this.traverse(e=>{e.isObject3D&&(e.matrixWorldAutoUpdate=!0)}),this.splatsMesh&&(this.splatsMesh.matrixWorldAutoUpdate=!0)),this.updateMatrixWorld(!0),this.static&&(this.traverse(e=>{e.isObject3D&&(e.matrixWorldAutoUpdate=!1)}),this.splatsMesh&&(this.splatsMesh.matrixWorldAutoUpdate=!1))}setCanvasSize(e,t){this.rendererSize.set(e,t)}async _setup(e){const t=this;if(e.json.extensionsRequired&&(e.json.extensionsRequired.includes("JDULTRA_gaussian_splats")||e.json.extensionsRequired.includes("JDULTRA_gaussian_splats_V2"))&&(t.splatsMesh=new Oc(t.tileLoader.renderer),t.splatsMesh.setQuality(t.splatsQuality),t.splatsMesh.setSplatsCPUCulling(t.splatsCPUCulling),t.splatsMesh.setSplatsCropRadius(t.splatsCropRadius),t.splatsMesh.setSplatsSizeMultiplier(t.splatsSizeMultiplier),t.static&&(t.splatsMesh.matrixWorldAutoUpdate=!1),t.add(t.splatsMesh),t.updateMatrices()),e.json.root?(t.json=e.json.root,t.json.refine||(t.json.refine=e.json.refine),t.json.geometricError||(t.json.geometricError=e.json.geometricError),t.json.transform||(t.json.transform=e.json.transform),t.json.boundingVolume||(t.json.boundingVolume=e.json.boundingVolume)):t.json=e.json,t.json.children||(t.json.getChildren?t.json.children=await t.json.getChildren():t.json.children=[]),t.rootPath=e.json.rootPath?e.json.rootPath:e.rootPath,t.json.refine?t.refine=t.json.refine:t.refine=e.parentRefine,t.json.geometricError?t.geometricError=t.json.geometricError:t.geometricError=e.parentGeometricError,t.json.transform){let n=new G.Matrix4;n.elements=t.json.transform,t.applyMatrix4(n)}if(t.json.boundingVolume)if(t.json.boundingVolume.box)t.boundingVolume=new it(t.json.boundingVolume.box);else if(t.json.boundingVolume.region){const n=t.json.boundingVolume.region;t._transformWGS84ToCartesian(n[0],n[1],n[4],gt),t._transformWGS84ToCartesian(n[2],n[3],n[5],Gt),gt.lerp(Gt,.5),t.boundingVolume=new G.Sphere(new G.Vector3(gt.x,gt.y,gt.z),gt.distanceTo(Gt))}else if(t.json.boundingVolume.sphere){const n=t.json.boundingVolume.sphere;t.boundingVolume=new G.Sphere(new G.Vector3(n[0],n[1],n[2]),n[3])}else t.boundingVolume=e.parentBoundingVolume;else t.boundingVolume=e.parentBoundingVolume;function a(n){n.uri&&n.uri.includes("json")||n.url&&n.url.includes("json")?t.hasUnloadedJSONContent++:t.hasMeshContent++}if(t.json.content?(a(t.json.content),t.hasMeshContent==0&&(t.level=Math.max(0,t.parentTile?t.parentTile.level+.01:0)),t._load()):t.json.contents&&(t.json.contents.forEach(n=>a(n)),t.hasMeshContent==0&&(t.level=Math.max(0,t.parentTile?t.parentTile.level+.01:0))),t.centerModel&&(Gt.copy(t.boundingVolume.center),this.json.boundingVolume.region&&(this._transformWGS84ToCartesian(.5*(this.json.boundingVolume.region[0]+this.json.boundingVolume.region[2]),.5*(this.json.boundingVolume.region[1]+this.json.boundingVolume.region[3]),.5*(this.json.boundingVolume.region[4]+this.json.boundingVolume.region[5]),gt),Ln.setFromUnitVectors(gt.normalize(),zc.normalize()),t.applyQuaternion(Ln)),Gt.applyMatrix4(t.matrix),t.position.sub(Gt),t.updateMatrices()),t.onLoadCallback&&t.onLoadCallback(t),t.isSetup=!0,t.level>0&&t.drawBoundingVolume)if(t.bbox&&console.log("double setup"),this.boundingVolume.aabb){let n=this.boundingVolume.aabb.clone();n.applyMatrix4(this.matrixWorld),t.bbox=new G.Box3Helper(n,new G.Color(Math.random(),Math.random(),Math.random())),t.add(t.bbox),t.bbox.material.visible=!1}else t.boundingVolume instanceof it&&(t.bbox=t.boundingVolume.helper(),t.add(t.bbox),t.bbox.material.visible=!1)}_assembleURL(e,t){e.endsWith("/")||(e+="/");const a=new URL(e);let n=a.pathname.split("/").filter(o=>o!==""),i=t.split("/").filter(o=>o!=="");for(let o=1;o<=n.length&&!(o>=i.length);o++)if(n.slice(n.length-o,n.length).join("/")===i.slice(0,o).join("/")){for(let s=0;s<o;s++)n.pop();break}for(;i.length>0&&i[0]==="..";)n.pop(),i.shift();return`${a.protocol}//${a.host}/${[...n,...i].join("/")}`}_extractQueryParams(e,t){const a=new URL(e);for(let[n,i]of a.searchParams)t[n]=i;return a.search="",a.toString()}async _load(e=!0,t=!0){var a=this;if(!a.deleted){if(a.json.content)await n(a.json.content,null,e,t);else if(a.json.contents){let i=a.json.contents.map((o,s)=>n(o,s,e,t));Promise.all(i)}}async function n(i,o,s,A){let u;i.uri?u=i.uri:i.url&&(u=i.url);const c=/^(?:http|https|ftp|tcp|udp):\/\/\S+/;if(c.test(a.rootPath)?c.test(u)||(u=a._assembleURL(a.rootPath,u)):It.isAbsolute(a.rootPath)&&(u=a.rootPath+It.sep+u),u=a._extractQueryParams(u,a.queryParams),a.queryParams){var d="";for(let l in a.queryParams)a.queryParams.hasOwnProperty(l)&&(d+="&"+l+"="+a.queryParams[l]);u.includes("?")?u+=d:u+="?"+d.substring(1)}if(u)if(a.contentURL.push(u),A&&(u.includes(".b3dm")||u.includes(".glb")||u.includes(".gltf")))try{a.tileLoader.get(a.abortController,a.uuid,u,l=>{a.deleted||(l.asset&&l.asset.copyright&&(l.asset.copyright.split(";").forEach(h=>{rt[h]?rt[h]++:rt[h]=1}),a.displayCopyright&&rr()),a.meshContent.push(l),a.splatsMesh||(l.traverse(h=>{if((h.isMesh||h.isPoints)&&h.layers.disable(0),h.isMesh&&a.occlusionCullingService){const b=h.geometry.attributes.position,g=[];for(let f=0;f<b.count;f++)g.push(a.color.r,a.color.g,a.color.b);h.geometry.setAttribute("color",new G.Float32BufferAttribute(g,3))}}),a.add(l),a.updateMatrices()))},a.cameraOnLoad?()=>a.loadingStrategy=="IMMEDIATE"?a._calculateDistanceToCamera(a.cameraOnLoad):a.loadingStrategy=="INCREMENTAL"?a.parentTile?a.parentTile._calculateDistanceToCamera(a.cameraOnLoad)/Math.max(1,a.parentTile.level):a._calculateDistanceToCamera(a.cameraOnLoad)/Math.max(1,a.level):a.loadingStrategy=="PERLEVEL"?a.parentTile?a.level+a.parentTile._calculateDistanceToCamera(a.cameraOnLoad):a.level+a._calculateDistanceToCamera(a.cameraOnLoad):0:()=>0,()=>a._getSiblings(),a.level,a.loadingStrategy,!a.json.boundingVolume.region,!!a.json.boundingVolume.region,a.geometricError,a.splatsMesh)}catch(l){a.displayErrors&&Gn(l)}else s&&u.includes(".json")&&(a.jsonRequested=u,a.tileLoader.get(a.abortController,a.uuid,u,async l=>{a.jsonReceived=!0,a.deleted||(l.rootPath=It.dirname(u),a.json.children.push(l),o==null?delete a.json.content:a.json.contents.splice(o,1),a.hasUnloadedJSONContent--)}))}}dispose(){const e=this;e.meshContent.forEach(t=>{t&&t.asset&&t.asset.copyright&&(t.asset.copyright.split(";").forEach(a=>{rt[a]&&rt[a]--}),e.displayCopyright&&rr())}),e.childrenTiles.forEach(t=>t.dispose()),e.deleted=!0,e.splatsMesh&&(e.meshContent.forEach(t=>t.hide()),e.parentTile||(e.splatsMesh.dispose(),e.splatsMesh=void 0)),e.contentURL&&(e.contentURL.forEach(t=>{e.tileLoader.invalidate(t,e.uuid)}),e.contentURL=[]),e.abortController&&!e.jsonRequested&&e.abortController.abort("tile not needed"),this.parent=null,e.meshContent=[],e.bbox&&e.bbox.dispose(),this.dispatchEvent({type:"removed"})}_disposeMeshContent(){const e=this;if(!e.deleted){e.deleted=!0,e.abortController&&(e.abortController.abort("tile not needed"),e.abortController=new AbortController);for(let t=e.meshContent.length-1;t>=0;t--){const a=e.meshContent[t];a&&a.asset&&a.asset.copyright&&(a.asset.copyright.split(";").forEach(n=>{rt[n]&&rt[n]--}),e.displayCopyright&&rr()),e.remove(a)}e.splatsMesh&&e.meshContent.forEach(t=>t.hide()),e.meshContent=[],e.contentURL.forEach(t=>{e.tileLoader.invalidate(t,e.uuid)}),e.contentURL=[]}}_disposeChildren(){var e=this;e.childrenTiles.forEach(t=>{t.dispose(),e.remove(t)}),e.childrenTiles=[]}raycast(e,t){if(this.splatsMesh){da.copy(e.ray),ha.copy(this.matrixWorld).invert(),da.applyMatrix4(ha);let a=!1;if(this.boundingVolume instanceof it)a=this.boundingVolume.intersectsRay(da);else{if(!(this.boundingVolume instanceof G.Sphere))return!1;a=ray.intersectsSphere(this.boundingVolume)}return a&&this.materialVisibility&&this.splatsReady&&(la.length=0,this.meshContent.forEach(n=>{n.isSplatsBatch&&(n.raycast(da,la,e.params.Points.threshold),la.forEach(i=>{i.point.applyMatrix4(this.matrixWorld)}),t.push(...la))})),a}return super.raycast(e,t)}update(e){this.splatsMesh&&this.splatsMesh.updateShaderParams(e,this.renderer);const t=new G.Frustum;t.setFromProjectionMatrix(new G.Matrix4().multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse));let a=[0],n=[0],i=[0],o=[0];if(this.refine=="REPLACE"?this.loadingStrategy==="IMMEDIATE"?(this._updateImmediate(e,t),this._statsImmediate(i,a,o,n)):(this._update(e,t),this._stats(i,a,o,n)):(this._update(e,t),this._stats(i,a,o,n)),a>0&&(o[0]/=a[0]),this.splatsMesh)if(ba.copy(e.position),ha.copy(this.matrixWorld).invert(),ba.applyMatrix4(ha),this.splatsCPUCulling){const s=new G.Matrix4().multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse).multiply(this.matrixWorld);this.splatsMesh.sort(ba,s)}else this.splatsMesh.sort(ba);return{numTilesLoaded:a[0],numTilesRendered:n[0],maxLOD:i[0],percentageLoaded:o[0]}}_updateImmediate(e,t){this._computeMetricRecursive(e,t),this._updateNodeVisibilityImmediate(),this._expandTreeImmediate(e),this.shouldBeVisible=this.metric>0||!!this.loadOutsideView,this._shouldBeVisibleUpdateImmediate(),this._trimTreeImmediate(),this._loadMeshImmediate()}_statsImmediate(e,t,a,n){e[0]=Math.max(e[0],this.level),(this.shouldBeVisible||this.materialVisibility)&&(t[0]++,this.materialVisibility&&a[0]++),this.materialVisibility&&n[0]++,this.childrenTiles.forEach(i=>{i._statsImmediate(e,t,a,n)})}_stats(e,t,a,n){e[0]=Math.max(e[0],this.level),this.hasMeshContent&&(t[0]++,this.meshContent.length==this.hasMeshContent&&a[0]++,this.materialVisibility&&n[0]++),this.childrenTiles.forEach(i=>{i._stats(e,t,a,n)})}_trimTreeImmediate(){if(this.metric!=null)if(this.hasMeshContent&&this.shouldBeVisible&&this.materialVisibility){if(self.splatsMesh&&!self.splatsReady)return;this._disposeChildren()}else this.childrenTiles.forEach(e=>{e._trimTreeImmediate()})}_updateNodeVisibilityImmediate(e=!1){const t=this;if(t.hasMeshContent)if(t.shouldBeVisible)t.meshContent.length==t.hasMeshContent?t.materialVisibility?t.childrenTiles.forEach(a=>{a._updateNodeVisibilityImmediate(!0)}):(t._changeContentVisibility(!0),t.childrenTiles.forEach(a=>{a._updateNodeVisibilityImmediate(e)})):t.childrenTiles.forEach(a=>{a._updateNodeVisibilityImmediate(e)});else{if(!t.loadOutsideView&&t.metric<0)return t._changeContentVisibility(!1),t.meshContent.length>0&&t._disposeMeshContent(),void t.childrenTiles.forEach(a=>{a._updateNodeVisibilityImmediate(!0)});if(!t.materialVisibility||t.splatsMesh&&!t.splatsReady)t.childrenTiles.forEach(a=>{a._updateNodeVisibilityImmediate(e)});else if(e)t._changeContentVisibility(!1),t.meshContent.length>0&&t._disposeMeshContent(),t.childrenTiles.forEach(a=>{a._updateNodeVisibilityImmediate(e)});else{let a=!0;t.childrenTiles.every(n=>!!n._isReadyImmediate()||(a=!1,!1)),a&&t.childrenTiles.length>0?(t._changeContentVisibility(!1),t.meshContent.length>0&&t._disposeMeshContent(),t.childrenTiles.forEach(n=>{n._updateNodeVisibilityImmediate(e)})):t.childrenTiles.forEach(n=>{n._updateNodeVisibilityImmediate(!t.splatsMesh||!!t.splatsReady)})}}else t.childrenTiles.forEach(a=>{a._updateNodeVisibilityImmediate(e)})}_shouldBeVisibleUpdateImmediate(){const e=this;e.hasMeshContent?e.metric==null?e.shouldBeVisible=!1:e.metric<0?(e.shouldBeVisible=!!e.loadOutsideView,e.childrenTiles.forEach(t=>{t._setShouldNotBeVisibleRecursive()})):e.metric<e.geometricErrorMultiplier*e.geometricError?e.hasUnloadedJSONContent||(e.json&&e.json.children&&e.json.children.length>0?(e.shouldBeVisible=!1,e.childrenTiles.forEach(t=>{t.shouldBeVisible=!0,t._shouldBeVisibleUpdateImmediate()})):e.shouldBeVisible=!0):e.childrenTiles.forEach(t=>{t._setShouldNotBeVisibleRecursive()}):(e.childrenTiles.forEach(t=>{t.shouldBeVisible=!0,t._shouldBeVisibleUpdateImmediate()}),e.shouldBeVisible=!1)}_setShouldNotBeVisibleRecursive(){this.shouldBeVisible=!1,this.childrenTiles.forEach(e=>{e._setShouldNotBeVisibleRecursive()})}_loadMeshImmediate(){const e=this;e.hasMeshContent&&e.shouldBeVisible?e.meshContent.length<e.hasMeshContent&&e.contentURL.length==0&&(e.deleted=!1,e._load(!1,!0)):e.childrenTiles.forEach(t=>{t._loadMeshImmediate()})}_computeMetricRecursive(e,t){const a=this;a.metric=-1,a.isSetup&&(a.boundingVolume&&a.geometricError&&(a.metric=a._calculateUpdateMetric(e,t)),a.childrenTiles.forEach(n=>n._computeMetricRecursive(e,t)))}_expandTreeImmediate(e){const t=this;t.hasUnloadedJSONContent||(t.hasMeshContent?t.occlusionCullingService&&t.hasMeshContent&&!t.occlusionCullingService.hasID(t.colorID)||t.metric>=0&&t.metric<t.geometricErrorMultiplier*t.geometricError&&t.json&&t.json.children&&t.childrenTiles.length<t.json.children.length&&t._loadJsonChildren(e):t.json&&t.json.children&&t.childrenTiles.length<t.json.children.length&&t._loadJsonChildren(e)),t.childrenTiles.forEach(a=>a._expandTreeImmediate(e))}_update(e,t){const a=this;if(!a.isSetup)return;const n=a.materialVisibility;a.boundingVolume&&a.geometricError&&(a.metric=a._calculateUpdateMetric(e,t)),a.childrenTiles.forEach(i=>i._update(e,t)),function(i){if(i<0)return a.inFrustum=!1,void a._changeContentVisibility(!!a.loadOutsideView);if(a.inFrustum=!0,!!a.hasMeshContent&&!(a.meshContent.length<a.hasMeshContent)){if(a.childrenTiles.length==0)return void a._changeContentVisibility(!0);if(i>=a.geometricErrorMultiplier*a.geometricError)a._changeContentVisibility(!0);else if(i<a.geometricErrorMultiplier*a.geometricError&&a.refine=="REPLACE"){let o=!0;a.childrenTiles.every(s=>!!s._isReady()||(o=!1,!1)),o?a._changeContentVisibility(!1):a._changeContentVisibility(!0)}}}(a.metric),function(i){i<0&&a.hasMeshContent||a.occlusionCullingService&&a.hasMeshContent&&!a.occlusionCullingService.hasID(a.colorID)||(!a.hasMeshContent||i<=a.geometricErrorMultiplier*a.geometricError&&(a.meshContent.length>0||a.splatsMesh))&&a.json&&a.json.children&&a.childrenTiles.length!=a.json.children.length&&a._loadJsonChildren(e)}(a.metric),function(i,o){if(a.hasMeshContent){if(!a.inFrustum)return void a._disposeChildren();if(a.occlusionCullingService&&!o&&a.hasMeshContent&&a.meshContent.length>0&&a.materialVisibility&&a._areAllChildrenLoadedAndHidden())return a.splatsMesh&&this.materialVisibility&&!a.splatsReady?void 0:void a._disposeChildren();if(i>=a.geometricErrorMultiplier*a.geometricError){if(a.splatsMesh&&a.materialVisibility&&!a.splatsReady)return;a._disposeChildren()}}}(a.metric,n)}_loadJsonChildren(e){const t=this;for(let a=t.json.children.length-1;a>=0;a--)t.json.children[a].root||t.json.children[a].children||t.json.children[a].getChildren||t.json.children[a].content||t.json.children[a].contents||t.json.children.splice(a,1);t.json.children.forEach(a=>{let n=new jr({parentTile:t,queryParams:t.queryParams,parentGeometricError:t.geometricError,parentBoundingVolume:t.boundingVolume,parentRefine:t.refine,json:a,rootPath:t.rootPath,geometricErrorMultiplier:t.geometricErrorMultiplier,loadOutsideView:t.loadOutsideView,level:Math.floor(t.level)+1,tileLoader:t.tileLoader,cameraOnLoad:e,occlusionCullingService:t.occlusionCullingService,renderer:t.renderer,static:t.static,centerModel:!1,displayErrors:t.displayErrors,displayCopyright:t.displayCopyright,distanceBias:t.distanceBias,loadingStrategy:t.loadingStrategy,drawBoundingVolume:t.drawBoundingVolume,splatsMesh:t.splatsMesh});t.childrenTiles.push(n),t.add(n)}),t.updateMatrices(!0)}_areAllChildrenLoadedAndHidden(){let e=!0;const t=this;return this.childrenTiles.every(a=>{if(a.hasMeshContent){if(a.childrenTiles.length>0)return e=!1,!1;if(!a.metric<0)return!0;if(a.materialVisibility&&(!t.splatsMesh||t.splatsReady)||t.occlusionCullingService.hasID(a.colorID))return e=!1,!1}else if(!a._areAllChildrenLoadedAndHidden())return e=!1,!1;return!0}),e}_isReady(){if(this.metric==null)return!1;if(this.metric<0)return!0;if(this.hasUnloadedJSONContent)return!1;if(!this.hasMeshContent&&this.json.children.length==0&&!this.hasUnloadedJSONContent)return!0;if(!this.hasMeshContent||this.meshContent.length==0||!this.materialVisibility){if(this.children.length>0){var e=!0;return this.childrenTiles.every(t=>!!t._isReady()||(e=!1,!1)),e}return!1}return!this.hasMeshContent||!(this.meshContent.length<this.hasMeshContent)&&!!this.materialVisibility}_isReadyImmediate(){if(this.materialVisibility||!this.loadOutsideView&&this.metric<0)return!0;if(this.childrenTiles.length>0){var e=!0;return this.childrenTiles.every(t=>!!t._isReadyImmediate()||(e=!1,!1)),e}return!1}_changeContentVisibility(e){const t=this;if(t.bbox&&(t.bbox.material.visible=e),t.splatsMesh)e!=t.materialVisibility&&(t.meshContent.forEach(a=>{e&&a.isSplatsBatch?a.show(()=>{t.materialVisibility&&(t.splatsReady=!0)}):(a.hide(),t.splatsReady=!1)}),t.materialVisibility=e);else{if(t.hasMeshContent&&t.meshContent.length>0&&(e?t.meshContent.forEach(a=>{a.traverse(n=>{(n.isMesh||n.isPoints)&&n.layers.enable(0)})}):t.meshContent.forEach(a=>{a.traverse(n=>{(n.isMesh||n.isPoints)&&n.layers.disable(0)})})),t.materialVisibility==e)return;t.materialVisibility=e}}_calculateUpdateMetric(e,t){let a=0;if(this.boundingVolume instanceof it){if(xt.copy(this.boundingVolume),xt.applyMatrix4(this.matrixWorld),!xt.inFrustum(t))return-1;a=Math.max(0,xt.distanceToPoint(e.position)-e.near)}else{if(!(this.boundingVolume instanceof G.Sphere))return console.error("unsupported shape"),-1;if(ut.copy(this.boundingVolume),ut.applyMatrix4(this.matrixWorld),!t.intersectsSphere(ut))return-1;a=Math.max(0,e.position.distanceTo(ut.center)-ut.radius-e.near)}if(a=Math.pow(a,this.distanceBias),a==0)return 0;const n=this.matrixWorld.getMaxScaleOnAxis();this.renderer&&this.renderer.getDrawingBufferSize(this.rendererSize);let i=this.rendererSize.y,o=e.fov;return e.aspect<1&&(o*=e.aspect,i=this.rendererSize.x),16*(2*Math.tan(.5*o*.017453292519943295)*a)/(i*n)}_getSiblings(){const e=this,t=[];if(!e.parentTile)return t;let a=e.parentTile;for(;!a.hasMeshContent&&a.parentTile;)a=a.parentTile;return a.childrenTiles.forEach(n=>{if(n&&n!=e){for(;!n.hasMeshContent&&n.childrenTiles[0];)n=n.childrenTiles[0];t.push(n)}}),t}_calculateDistanceToCamera(e){return this.boundingVolume instanceof it?(xt.copy(this.boundingVolume),xt.applyMatrix4(this.matrixWorld),Math.max(0,xt.distanceToPoint(e.position))):this.boundingVolume instanceof G.Sphere?(ut.copy(this.boundingVolume),ut.applyMatrix4(this.matrixWorld),Math.max(0,e.position.distanceTo(ut.center)-ut.radius)):(console.error("unsupported shape"),-1)}setGeometricErrorMultiplier(e){this.geometricErrorMultiplier=e,this.childrenTiles.forEach(t=>t.setGeometricErrorMultiplier(e))}setDistanceBias(e){this.distanceBias=e,this.childrenTiles.forEach(t=>t.setDistanceBias(e))}_transformWGS84ToCartesian(e,t,a,n){const i=6378137/Math.sqrt(1-.006694384442042*Math.pow(Math.sin(t),2)),o=Math.cos(t),s=Math.cos(e),A=Math.sin(t),u=i+a,c=u*o*s,d=u*o*Math.sin(e),l=(.993305615557957*i+a)*A;n.set(c,d,l)}hideCopyright(){(function(){oe||((oe=document.createElement("div")).style.position="fixed",oe.style.bottom="20px",oe.style.left="20px",oe.style.color="white",oe.style.textShadow="2px 2px 0 #000, -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000",oe.style.padding="10px",oe.style.backgroundColor="rgba(0, 0, 0, 0.1)",document.body.appendChild(oe)),oe.style.opacity=0})()}showCopyright(){(function(){oe||((oe=document.createElement("div")).style.position="fixed",oe.style.bottom="20px",oe.style.left="20px",oe.style.color="white",oe.style.textShadow="2px 2px 0 #000, -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000",oe.style.padding="10px",oe.style.backgroundColor="rgba(0, 0, 0, 0.1)",document.body.appendChild(oe)),oe.style.opacity=1})()}}function Gn(r){var e=document.createElement("div");e.textContent=r,e.style.position="fixed",e.style.top="10px",e.style.left="50%",e.style.transform="translateX(-50%)",e.style.padding="10px",e.style.backgroundColor="#ff8800",e.style.color="#ffffff",e.style.zIndex="9999",document.body.appendChild(e),setTimeout(function(){e.remove()},8e3)}function rr(){oe||((oe=document.createElement("div")).style.position="fixed",oe.style.bottom="20px",oe.style.left="20px",oe.style.color="white",oe.style.textShadow="2px 2px 0 #000, -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000",oe.style.padding="10px",oe.style.backgroundColor="rgba(0, 0, 0, 0.1)",document.body.appendChild(oe));const r=Vi();let e="";r.forEach(t=>{e+=t+", "}),e=e.slice(0,-2),oe.textContent=e}const _e=new G.Sphere(new G.Vector3(0,0,0),1),ft=new G.Vector3(0,0,0),nr=new G.Vector3(0,0,0),Pc=new G.Vector3(0,1,0),ir=new G.Vector2,_n=new G.Quaternion,Hn=new G.Matrix4;class Mr extends G.Object3D{constructor(e){super();const t=this;if(e.queryParams&&(this.queryParams={...e.queryParams}),this.uuid=qn(),e.tileLoader?this.tileLoader=e.tileLoader:console.error("an instanced tileset must be provided an InstancedTilesetLoader"),this.master=e.master,this.loadOutsideView=e.loadOutsideView,this.cameraOnLoad=e.cameraOnLoad,this.parentTile=e.parentTile,this.distanceBias=Math.max(1e-4,e.distanceBias?e.distanceBias:1),this.childrenTiles=[],this.jsonChildren=[],this.meshContent=new Set,this.static=e.static,this.static&&(this.matrixAutoUpdate=!1,this.matrixWorldAutoUpdate=!1),this.tileContent,this.refinement,this.rootPath,this.geometricError,this.boundingVolume,this.json,this.materialVisibility=!1,this.inFrustum=!0,this.level=e.level?e.level:0,this.hasMeshContent=0,this.hasUnloadedJSONContent=0,this.centerModel=e.centerModel,this.deleted=!1,this.abortController=new AbortController,e.json)this.rootPath=e.json.rootPath?e.json.rootPath:e.rootPath,e.json.children&&(this.jsonChildren=e.json.children),t.setup(e);else if(e.url){this.loadJson=(i,o)=>{const s=It.dirname(o);t.setup({rootPath:s,json:i,onLoadCallback:e.onLoadCallback})};var a=e.url;if(t.queryParams){var n="";for(let i in t.queryParams)t.queryParams.hasOwnProperty(i)&&(n+="&"+i+"="+t.queryParams[i]);a.includes("?")?a+=n:a+="?"+n.substring(1)}t.tileLoader.get(t.abortController,a,t.uuid,t)}}async setup(e){const t=this;e.json.root?(t.json=e.json.root,!t.json.children&&t.json.getChildren&&(t.json.children=await t.json.getChildren()),t.jsonChildren=t.json.children,t.json.refinement||(t.json.refinement=e.json.refinement),t.json.geometricError||(t.json.geometricError=e.json.geometricError),t.json.transform||(t.json.transform=e.json.transform),t.json.boundingVolume||(t.json.boundingVolume=e.json.boundingVolume)):(t.json=e.json,!t.json.children&&t.json.getChildren&&(t.json.children=await t.json.getChildren(),t.jsonChildren=t.json.children)),t.rootPath=e.json.rootPath?e.json.rootPath:e.rootPath,t.json.refinement?t.refinement=t.json.refinement:t.refinement=e.parentRefinement,t.json.geometricError?t.geometricError=t.json.geometricError:t.geometricError=e.parentGeometricError;let a=new G.Matrix4;if(t.json.transform&&!t.centerModel&&(a.elements=t.json.transform),t.applyMatrix4(a),t.parentTile&&t.parentTile.matrix&&(t.matrix.premultiply(t.parentTile.matrix),t.matrix.decompose(t.position,t.quaternion,t.scale)),t.matrixWorldNeedsUpdate=!0,t.updateWorldMatrix(!0,!0),t.json.boundingVolume)if(t.json.boundingVolume.box)t.boundingVolume=new it(t.json.boundingVolume.box);else if(t.json.boundingVolume.region){const i=t.json.boundingVolume.region;t.transformWGS84ToCartesian(i[0],i[1],i[4],ft),t.transformWGS84ToCartesian(i[2],i[3],i[5],nr),ft.lerp(nr,.5),t.boundingVolume=new G.Sphere(new G.Vector3(ft.x,ft.y,ft.z),ft.distanceTo(nr))}else if(t.json.boundingVolume.sphere){const i=t.json.boundingVolume.sphere;t.boundingVolume=new G.Sphere(new G.Vector3(i[0],i[1],i[2]),i[3])}else t.boundingVolume=e.parentBoundingVolume;else t.boundingVolume=e.parentBoundingVolume;function n(i){i.uri&&i.uri.includes("json")||i.url&&i.url.includes("json")?t.hasUnloadedJSONContent++:t.hasMeshContent++}if(t.json.content?(n(t.json.content),t.load()):t.json.contents&&(t.json.contents.forEach(i=>n(i)),t.load()),t.centerModel){const i=new G.Sphere;t.boundingVolume instanceof it?i.copy(t.boundingVolume.sphere):t.boundingVolume instanceof G.Sphere&&i.copy(t.boundingVolume),this.json.boundingVolume.region&&(t.transformWGS84ToCartesian(.5*(t.json.boundingVolume.region[0]+t.json.boundingVolume.region[2]),.5*(t.json.boundingVolume.region[1]+t.json.boundingVolume.region[3]),.5*(t.json.boundingVolume.region[4]+t.json.boundingVolume.region[5]),ft),_n.setFromUnitVectors(ft.normalize(),Pc.normalize()),t.master.applyQuaternion(_n),t.master.updateWorldMatrix(!1,!1)),Hn.makeTranslation(-i.center.x*t.scale.x,-i.center.y*t.scale.y,-i.center.z*t.scale.z),t.master.matrix.multiply(Hn),t.master.matrix.decompose(t.master.position,t.master.quaternion,t.master.scale)}t.isSetup=!0,e.onLoadCallback&&e.onLoadCallback(t)}isAbsolutePathOrURL(e){const t=/^(?:http|https|ftp|tcp|udp):\/\/\S+/.test(e),a=e.startsWith("/")&&!e.startsWith("//");return t||a}assembleURL(e,t){e.endsWith("/")||(e+="/");const a=new URL(e);let n=a.pathname.split("/").filter(o=>o!==""),i=t.split("/").filter(o=>o!=="");for(let o=1;o<=n.length&&!(o>=i.length);o++)if(n.slice(n.length-o,n.length).join("/")===i.slice(0,o).join("/")){for(let s=0;s<o;s++)n.pop();break}for(;i.length>0&&i[0]==="..";)n.pop(),i.shift();return`${a.protocol}//${a.host}/${[...n,...i].join("/")}`}extractQueryParams(e,t){const a=new URL(e);for(let[n,i]of a.searchParams)t[n]=i;return a.search="",a.toString()}load(){var e=this;function t(a){let n;a.uri?n=a.uri:a.url&&(n=a.url);const i=/^(?:http|https|ftp|tcp|udp):\/\/\S+/;if(i.test(e.rootPath)?i.test(n)||(n=e.assembleURL(e.rootPath,n)):It.isAbsolute(e.rootPath)&&(n=e.rootPath+It.sep+n),n=e.extractQueryParams(n,e.queryParams),e.queryParams){var o="";for(let s in e.queryParams)e.queryParams.hasOwnProperty(s)&&(o+="&"+s+"="+e.queryParams[s]);n.includes("?")?n+=o:n+="?"+o.substring(1)}n&&(n.includes(".b3dm")||n.includes(".glb")||n.includes(".gltf")?(e.contentURL=n,e.tileLoader.get(e.abortController,n,e.uuid,e,e.cameraOnLoad?()=>e.calculateDistanceToCamera(e.cameraOnLoad):()=>0,()=>e.getSiblings(),e.level,!e.json.boundingVolume.region,!!e.json.boundingVolume.region,e.geometricError)):n.includes(".json")&&e.tileLoader.get(e.abortController,n,e.uuid,e))}e.deleted||(e.json.content?t(e.json.content):e.json.contents&&e.json.contents.forEach(a=>t(a)))}loadMesh(e){this.deleted||this.meshContent.add(e)}loadJson(e,t){this.deleted||(this.json.children&&(this.jsonChildren=this.json.children),e.rootPath=It.dirname(t),this.jsonChildren.push(e),this.hasUnloadedJSONContent--)}dispose(){const e=this;e.childrenTiles.forEach(t=>t.dispose()),e.deleted=!0,e.abortController&&e.abortController.abort(),this.parent=null,this.parentTile=null,this.dispatchEvent({type:"removed"})}disposeChildren(){this.childrenTiles.forEach(e=>e.dispose()),this.childrenTiles=[]}_update(e,t){const a=this;function n(i){if(a.hasMeshContent&&!(a.meshContent.size<a.hasMeshContent)){if(i<0)return a.inFrustum=!1,void a.changeContentVisibility(!!a.loadOutsideView);if(a.inFrustum=!0,a.childrenTiles.length!=0){if(i>=a.master.geometricErrorMultiplier*a.geometricError)a.changeContentVisibility(!0);else if(i<a.master.geometricErrorMultiplier*a.geometricError){let o=!0;a.childrenTiles.every(s=>!!s.isReady()||(o=!1,!1)),o&&a.changeContentVisibility(!1)}}else a.changeContentVisibility(!0)}}a.isSetup&&(a.materialVisibility,a.boundingVolume&&a.geometricError&&(a.metric=a.calculateUpdateMetric(e,t)),a.childrenTiles.forEach(i=>i._update(e,t)),n(a.metric),function(i){i<0&&a.hasMeshContent||(!a.hasMeshContent&&a.rootPath||i<a.master.geometricErrorMultiplier*a.geometricError&&a.meshContent.size>0)&&a.json&&a.jsonChildren&&a.childrenTiles.length!=a.jsonChildren.length&&a.jsonChildren.forEach(o=>{if(!(o.root||o.children||o.getChildren||o.content||o.contents))return;let s=new Mr({parentTile:a,queryParams:a.queryParams,parentGeometricError:a.geometricError,parentBoundingVolume:a.boundingVolume,parentRefinement:a.refinement,json:o,rootPath:a.rootPath,loadOutsideView:a.loadOutsideView,level:a.level+1,tileLoader:a.tileLoader,cameraOnLoad:e,master:a.master,centerModel:!1});a.childrenTiles.push(s)})}(a.metric),function(i){if(a.hasMeshContent){if(!a.inFrustum)return a.disposeChildren(),void n(i);i>=a.master.geometricErrorMultiplier*a.geometricError&&(a.disposeChildren(),n(i))}}(a.metric))}areAllChildrenLoadedAndHidden(){let e=!0;return this.childrenTiles.every(t=>{if(t.hasMeshContent){if(t.childrenTiles.length>0)return e=!1,!1;if(!t.inFrustum)return!0;if(!t.materialVisibility||t.meshesToDisplay!=t.meshesDisplayed)return e=!1,!1}else if(!t.areAllChildrenLoadedAndHidden())return e=!1,!1;return!0}),e}isReady(){if(!this.inFrustum)return!0;if(this.hasUnloadedJSONContent)return!1;if(!this.hasMeshContent||this.meshContent.size==0||!this.materialVisibility){if(this.childrenTiles.length>0){var e=!0;return this.childrenTiles.every(t=>!!t.isReady()||(e=!1,!1)),e}return!1}return!this.hasMeshContent||!(this.meshContent.size<this.hasMeshContent)&&!!this.materialVisibility}changeContentVisibility(e){this.materialVisibility=e}calculateUpdateMetric(e,t){if(this.boundingVolume instanceof it){if(_e.copy(this.boundingVolume.sphere),_e.applyMatrix4(this.matrixWorld),!t.intersectsSphere(_e))return-1}else{if(!(this.boundingVolume instanceof G.Sphere))return console.error("unsupported shape"),-1;if(_e.copy(this.boundingVolume),_e.applyMatrix4(this.matrixWorld),!t.intersectsSphere(_e))return-1}let a=Math.max(0,e.position.distanceTo(_e.center)-_e.radius);if(a=Math.pow(a,this.distanceBias),a==0)return 0;const n=this.matrixWorld.getMaxScaleOnAxis();this.master._renderSize(ir);let i=ir.y,o=e.fov;e.aspect<1&&(o*=e.aspect,i=ir.x);let s=2*Math.tan(.5*o*.017453292519943295)*a;return 16*window.devicePixelRatio*s/(i*n)}getSiblings(){const e=this,t=[];if(!e.parentTile)return t;let a=e.parentTile;for(;!a.hasMeshContent&&a.parentTile;)a=a.parentTile;return a.childrenTiles.forEach(n=>{if(n&&n!=e){for(;!n.hasMeshContent&&n.childrenTiles[0];)n=n.childrenTiles[0];t.push(n)}}),t}calculateDistanceToCamera(e){return this.boundingVolume instanceof it?(_e.copy(this.boundingVolume.sphere),_e.applyMatrix4(this.matrixWorld)):this.boundingVolume instanceof G.Sphere?(_e.copy(this.boundingVolume),_e.applyMatrix4(this.matrixWorld)):console.error("unsupported shape"),Math.max(0,e.position.distanceTo(_e.center)-_e.radius)}getWorldMatrix(){return this.matrixWorld}transformWGS84ToCartesian(e,t,a,n){const i=6378137/Math.sqrt(1-.006694384442042*Math.pow(Math.sin(t),2)),o=Math.cos(t),s=Math.cos(e),A=Math.sin(t),u=i+a,c=u*o*s,d=u*o*Math.sin(e),l=(.993305615557957*i+a)*A;n.set(c,d,l)}}class qc extends G.Object3D{constructor(e){super(),e.master=this,e.domWidth&&e.domHeight?this.rendererSize=new G.Vector2(e.domWidth,e.domHeight):this.rendererSize=new G.Vector2(1e3,1e3),this.renderer=e.renderer,this.distanceBias=Math.max(1e-4,e.distanceBias?e.distanceBias:1),this.geometricErrorMultiplier=e.geometricErrorMultiplier?e.geometricErrorMultiplier:1,this.tileset=new Mr(e),e.static&&(this.matrixAutoUpdate=!1),this.tileLoader=e.tileLoader}_renderSize(e){this.renderer?this.renderer.getDrawingBufferSize(e):e.copy(this.rendererSize)}setCanvasSize(e,t){this.rendererSize.set(e,t)}update(e,t){if(t)this.tileset._update(e,t);else{const a=new G.Frustum;a.setFromProjectionMatrix(new G.Matrix4().multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse)),this.tileset._update(e,a)}}setGeometricErrorMultiplier(e){this.geometricErrorMultiplier=e||1}}class Jc{constructor(e){const t=this;t.scene=e,t.instancedTiles=[],t.instancedMesh,t.reuseableMatrix=new G.Matrix4}addInstance(e){const t=this;e.added=!0,e.listOMesh=t.instancedTiles,t.instancedTiles.push(e),t.instancedMesh&&e.loadMesh(t.instancedMesh)}addToScene(){const e=this;e.instancedMesh.setMatrixAt(0,new G.Matrix4),e.instancedMesh.instanceMatrix.needsUpdate=!0,e.instancedMesh.count=1,e.scene.add(e.instancedMesh),e.instancedMesh.onAfterRender=()=>{delete e.instancedMesh.onAfterRender,e.instancedMesh.displayedOnce=!0}}setObject(e){const t=this;t.instancedMesh=e,t.instancedMesh.matrixAutoUpdate=!1,t.instancedMesh.matrixWorldAutoUpdate=!1,t.scene.children.includes(e)||this.addToScene();for(let a=0;a<t.instancedTiles.length;a++)t.instancedTiles[a].loadMesh(t.instancedMesh)}update(){const e=this;for(let t=e.instancedTiles.length-1;t>=0;t--)e.instancedTiles[t].deleted&&e.instancedTiles.splice(t,1);if(e.instancedMesh){e.instancedMesh.count=0,e.instancedMesh.instancedTiles=[];for(let t=0;t<e.instancedTiles.length;t++)e.instancedTiles[t].meshContent.add(e.instancedMesh),e.instancedTiles[t].materialVisibility&&(e.instancedMesh.count++,e.reuseableMatrix.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),e.reuseableMatrix.multiply(e.instancedTiles[t].matrixWorld),e.reuseableMatrix.multiply(e.instancedMesh.baseMatrix),e.instancedMesh.setMatrixAt(e.instancedMesh.count-1,e.reuseableMatrix),e.instancedMesh.instancedTiles.push(e.instancedTiles[t]));e.instancedMesh.instanceMatrix.needsUpdate=!0,e.instancedMesh.needsUpdate=!0,e.instancedMesh.computeBoundingSphere()}}getCount(){return this.instancedTiles.length}dispose(){const e=this;return!(e.instancedTiles.length>0)&&!!e.instancedMesh&&(e.scene.remove(e.instancedMesh),e.instancedMesh.traverse(t=>{if(t.dispose&&t.dispose(),t.material)if(t.material.length)for(let a=0;a<t.material.length;++a)t.material[a].dispose();else t.material.dispose();t.geometry&&t.geometry.dispose()}),e.instancedMesh.dispose(),!0)}}class Kc{constructor(){const e=this;e.count=0,e.json,e.instancedTiles=[]}addInstance(e){this.instancedTiles.push(e),this.json&&e.loadJson(this.json,this.url)}setObject(e,t){const a=this;a.json=e,a.url=t;for(let n=0;n<a.instancedTiles.length;n++)a.instancedTiles[n].loadJson(a.json,a.url)}getCount(){return this.instancedTiles.length}update(){const e=this;for(let t=e.instancedTiles.length-1;t>=0;t--)e.instancedTiles[t].deleted&&e.instancedTiles.splice(t,1)}dispose(){return!(!this.json||this.instancedTiles.length!=0)}}let Ft=0;async function Vc(r){return new Promise(e=>{const t=setInterval(()=>{r.hasDracoLoader&&!r.dracoLoader||r.hasKTX2Loader&&!r.ktx2Loader||(clearInterval(t),e())},10)})}exports.InstancedOGC3DTile=qc,exports.InstancedTileLoader=class{constructor(r,e){if(this.zUpToYUpMatrix=new G.Matrix4,this.zUpToYUpMatrix.set(1,0,0,0,0,0,-1,0,0,1,0,0,0,0,0,1),this.maxCachedItems=100,this.maxInstances=1,this.proxy=e.proxy,e&&(this.meshCallback=e.meshCallback,this.pointsCallback=e.pointsCallback,e.maxCachedItems&&(this.maxCachedItems=e.maxCachedItems),e.maxInstances&&(this.maxInstances=e.maxInstances)),this.gltfLoader=new Jn,e&&e.dracoLoader)this.gltfLoader.setDRACOLoader(e.dracoLoader),this.hasDracoLoader=!0;else{const t=new Wn;t.setDecoderPath("https://www.gstatic.com/draco/versioned/decoders/1.4.3/"),this.gltfLoader.setDRACOLoader(t),this.gltfLoader.hasDracoLoader=!0}if(e&&e.ktx2Loader)this.gltfLoader.setKTX2Loader(e.ktx2Loader),this.hasKTX2Loader=!0;else if(e&&e.renderer){const t=new qe;t.setTranscoderPath("https://storage.googleapis.com/ogc-3d-tiles/basis/").detectSupport(e.renderer),this.gltfLoader.setKTX2Loader(t),this.gltfLoader.hasKTX2Loader=!0}this.gltfLoader.setMeshoptDecoder(ui),this.hasMeshOptDecoder=!0,this.b3dmDecoder=new Pn(this.gltfLoader),this.cache=new On,this.scene=r,this.ready=[],this.downloads=[],this.nextReady=[],this.nextDownloads=[]}update(){const r=this;r._checkSize(),r.cache._data.forEach(e=>{e.update()}),Ft<8&&r._download(),r._loadBatch()}_download(){const r=this;if(r.nextDownloads.length!=0||(r._getNextDownloads(),r.nextDownloads.length!=0))for(;r.nextDownloads.length>0;){const t=r.nextDownloads.shift();if(t){if(t.path.includes(".b3dm")&&(e=r.proxy?()=>fetch(r.proxy,{method:"POST",body:t.path}):()=>fetch(t.path),Ft++,e().then(a=>{if(!a.ok)throw console.error("could not load tile with path : "+t.path),new Error(`couldn't load "${t.path}". Request failed with status ${a.status} : ${a.statusText}`);return a.arrayBuffer()}).then(a=>this.b3dmDecoder.parseB3DMInstanced(a,n=>{r.meshCallback(n,t.geometricError)},r.maxInstances,t.sceneZupToYup,t.meshZupToYup)).then(a=>{a.frustumCulled=!1,t.tile.setObject(a),r.ready.unshift(t)}).catch(a=>console.error(a)).finally(()=>{Ft--})),t.path.includes(".glb")||t.path.includes(".gltf"))e=r.proxy?()=>fetch(r.proxy,{method:"POST",body:t.path}):()=>fetch(t.path),Ft++,e().then(a=>{if(!a.ok)throw new Error("missing content");return a.arrayBuffer()}).then(async a=>{await Vc(this.gltfLoader),this.gltfLoader.parse(a,null,n=>{let i;n.scene.asset=n.asset,t.sceneZupToYup&&n.scene.applyMatrix4(this.zUpToYUpMatrix),n.scene.traverse(o=>{o.geometricError=t.geometricError,o.isMesh&&(t.meshZupToYup&&o.applyMatrix4(this.zUpToYUpMatrix),r.meshCallback&&r.meshCallback(o,o.geometricError)),o.isPoints&&console.error("instanced point cloud is not supported")}),n.scene.updateWorldMatrix(!1,!0),n.scene.traverse(o=>{o.isMesh&&(i=new G.InstancedMesh(o.geometry,o.material,r.maxInstances),i.baseMatrix=o.matrixWorld)}),r.ready.unshift(t),i?(i.frustumCulled=!1,t.tile.setObject(i)):n.scene.traverse(o=>{o.dispose&&o.dispose(),o.material&&o.material.dispose()})})},a=>{console.error("could not load tile : "+t.path)}).finally(()=>{Ft--});else if(t.path.includes(".json")){var e;e=r.proxy?()=>fetch(r.proxy,{method:"POST",body:t.path}):()=>fetch(t.path),Ft++,e().then(a=>{if(!a.ok)throw console.error("could not load tile with path : "+t.path),new Error(`couldn't load "${t.path}". Request failed with status ${a.status} : ${a.statusText}`);return a.json()}).then(a=>Br(a,t.path)).then(a=>{t.tile.setObject(a,t.path),r.ready.unshift(t)}).catch(a=>console.error(a)).finally(()=>{Ft--})}}}}_loadBatch(){return this.nextReady.length==0&&(this._getNextReady(),this.nextReady.length==0)?0:this.nextReady.shift()?1:0}_getNextReady(){let r=Number.MAX_VALUE,e=-1;for(let t=this.ready.length-1;t>=0;t--)this.ready[t].distanceFunction||this.nextReady.push(this.ready.splice(t,1)[0]);if(!(this.nextReady.length>0)){for(let t=this.ready.length-1;t>=0;t--){const a=this.ready[t].distanceFunction()*this.ready[t].level;a<r&&(r=a,e=t)}if(e>=0){const t=this.ready.splice(e,1).pop();this.nextReady.push(t);const a=t.getSiblings();for(let n=this.ready.length-1;n>=0;n--)a.includes(this.ready[n].uuid)&&this.nextready.push(this.ready.splice(n,1).pop())}}}get(r,e,t,a,n,i,o,s,A,u){const c=this,d=function(h){for(var b=h.split("/"),g=[],f=0,m=0;m<b.length;m++){var p=b[m];p!=="."&&p!==""&&p!==".."?g[f++]=p:p===".."&&f>0&&f--}if(f===0)return"/";var C="";for(m=0;m<f;m++)C+="/"+g[m];return C}(e);if(!(e.includes(".b3dm")||e.includes(".json")||e.includes(".glb")||e.includes(".gltf")))return void console.error("the 3DTiles cache can only be used to load B3DM, gltf and json data");const l=c.cache.get(d);if(l)l.addInstance(a);else if(e.includes(".b3dm")||e.includes(".glb")||e.includes(".gltf")){const h=new Jc(c.scene);h.addInstance(a),c.cache.put(d,h);const b=new AbortController;r.signal.addEventListener("abort",()=>{h.getCount()==0&&b.abort()}),this.downloads.push({abortController:b,tile:h,key:d,path:e,distanceFunction:n,getSiblings:i,level:o,uuid:t,sceneZupToYup:s,meshZupToYup:A,geometricError:u,shouldDoDownload:()=>!0})}else if(e.includes(".json")){const h=new Kc;h.addInstance(a),c.cache.put(d,h);const b=new AbortController;r.signal.addEventListener("abort",()=>{h.getCount()==0&&b.abort()}),this.downloads.push({abortController:b,tile:h,key:d,path:e,distanceFunction:n,getSiblings:i,level:o,shouldDoDownload:()=>!0})}}_getNextDownloads(){let r=Number.MAX_VALUE,e=-1;for(let t=this.downloads.length-1;t>=0;t--){const a=this.downloads[t];a.shouldDoDownload()?a.distanceFunction||this.nextDownloads.push(this.downloads.splice(t,1)[0]):this.downloads.splice(t,1)}if(!(this.nextDownloads.length>0)){for(let t=this.downloads.length-1;t>=0;t--){const a=this.downloads[t],n=a.distanceFunction()*a.level;n<r&&(r=n,e=t)}if(e>=0){const t=this.downloads.splice(e,1).pop();this.nextDownloads.push(t);const a=t.getSiblings();for(let n=this.downloads.length-1;n>=0;n--)a.includes(this.downloads[n].uuid)&&this.nextDownloads.push(this.downloads.splice(n,1).pop())}}}_checkSize(){const r=this;let e=0;for(;r.cache.size()>r.maxCachedItems&&e<r.cache.size();){e++;const t=r.cache.head();r.cache.remove(t.key),t.value.dispose()||r.cache.put(t.key,t.value)}}},exports.OGC3DTile=jr,exports.OcclusionCullingService=class{constructor(){this.cullMap=[],this.cullMaterial=new G.MeshBasicMaterial({vertexColors:!0}),this.cullMaterial.side=G.FrontSide,this.cullTarget=this._createCullTarget(),this.cullPixels=new Uint8Array(4*this.cullTarget.width*this.cullTarget.height)}setSide(r){this.cullMaterial.side=r}_createCullTarget(){const r=new G.WebGLRenderTarget(Math.floor(.05*window.innerWidth),Math.floor(.05*window.innerHeight));return r.texture.format=G.RGBAFormat,r.texture.colorSpace=G.LinearSRGBColorSpace,r.texture.minFilter=G.NearestFilter,r.texture.magFilter=G.NearestFilter,r.texture.generateMipmaps=!1,r.stencilBuffer=!1,r.depthBuffer=!0,r.depthTexture=new G.DepthTexture,r.depthTexture.format=G.DepthFormat,r.depthTexture.type=G.UnsignedShortType,r}update(r,e,t){let a=e.getRenderTarget(),n=r.overrideMaterial;r.overrideMaterial=this.cullMaterial,e.setRenderTarget(this.cullTarget),e.render(r,t),r.overrideMaterial=n,e.setRenderTarget(a),e.readRenderTargetPixels(this.cullTarget,0,0,this.cullTarget.width,this.cullTarget.height,this.cullPixels),this.cullMap=[];for(let i=0;i<this.cullPixels.length;i+=4){const o=G.MathUtils.clamp(this.cullPixels[i],0,255)<<16^G.MathUtils.clamp(this.cullPixels[i+1],0,255)<<8^G.MathUtils.clamp(this.cullPixels[i+2],0,255);this.cullMap[o]=!0}}hasID(r){return this.cullMap[r]}},exports.TileLoader=di,exports.getOGC3DTilesCopyrightInfo=Vi,exports.splatsFragmentShader=Ki,exports.splatsVertexShader=Ji;
293
+ }`}var oe;const ut=new G.Sphere(new G.Vector3(0,0,0),1),xt=new it([0,0,0,1,0,0,0,1,0,0,0,1]);new G.Box3;const gt=new G.Vector3(0,0,0),Gt=new G.Vector3(0,0,0),zc=new G.Vector3(0,1,0),da=new G.Ray,ha=new G.Matrix4;new G.Matrix4,new G.Frustum;const ba=new G.Vector3,la=[],Ln=new G.Quaternion,rt={};function Vi(){var r=[];for(let e in rt)rt.hasOwnProperty(e)&&rt[e]>0&&r.push(e);return r}class jr extends G.Object3D{constructor(e){super();const t=this;if(t.splatsMesh=e.splatsMesh,t.splatsQuality=e.splatsQuality!=null?e.splatsQuality:.75,t.splatsCPUCulling=e.splatsCPUCulling!=null&&e.splatsQuality,this.contentURL=[],e.domWidth&&e.domHeight?this.rendererSize=new G.Vector2(e.domWidth,e.domHeight):this.rendererSize=new G.Vector2(1e3,1e3),this.loadingStrategy=e.loadingStrategy?e.loadingStrategy.toUpperCase():"INCREMENTAL",this.distanceBias=Math.max(1e-4,e.distanceBias?e.distanceBias:1),this.proxy=e.proxy,this.drawBoundingVolume=!!e.drawBoundingVolume&&e.drawBoundingVolume,this.displayErrors=e.displayErrors,this.displayCopyright=e.displayCopyright,e.queryParams&&(this.queryParams={...e.queryParams}),this.uuid=qn(),e.tileLoader)this.tileLoader=e.tileLoader;else{const i={};i.meshCallback=e.meshCallback?e.meshCallback:(s,A)=>{s.material.wireframe=!1,s.material.side=G.DoubleSide},i.pointsCallback=e.pointsCallback?e.pointsCallback:(s,A)=>{s.material.size=Math.pow(A,.33),s.material.sizeAttenuation=!0},i.proxy=this.proxy,i.renderer=e.renderer,i.dracoLoader=e.dracoLoader,i.ktx2Loader=e.ktx2Loader,t.tileLoader=new di(i);const o=this.update;this.update=s=>{o.call(t,s),t.tileLoader.update()}}if(this.displayCopyright=!!e.displayCopyright,this.geometricErrorMultiplier=e.geometricErrorMultiplier?e.geometricErrorMultiplier:1,this.splatsCropRadius=Number.MAX_VALUE,this.splatsSizeMultiplier=1,this.renderer=e.renderer,this.meshCallback=e.meshCallback,this.loadOutsideView=e.loadOutsideView,this.cameraOnLoad=e.cameraOnLoad,this.parentTile=e.parentTile,this.occlusionCullingService=e.occlusionCullingService,this.static=e.static,this.occlusionCullingService&&(this.color=new G.Color,this.color.setHex(16777215*Math.random()),this.colorID=G.MathUtils.clamp(255*t.color.r,0,255)<<16^G.MathUtils.clamp(255*t.color.g,0,255)<<8^G.MathUtils.clamp(255*t.color.b,0,255)),this.static&&(this.matrixAutoUpdate=!1,this.matrixWorldAutoUpdate=!1),this.childrenTiles=[],this.meshContent=[],this.tileContent,this.refine,this.rootPath,this.geometricError,this.boundingVolume,this.json,this.materialVisibility=!1,this.level=e.level?e.level:0,this.hasMeshContent=0,this.hasUnloadedJSONContent=0,this.centerModel=e.centerModel,this.abortController=new AbortController,this.onLoadCallback=e.onLoadCallback,e.json)t._setup(e);else if(e.url){var a=e.url;if(t.queryParams){var n="";for(let i in t.queryParams)t.queryParams.hasOwnProperty(i)&&(n+="&"+i+"="+t.queryParams[i]);a.includes("?")?a+=n:a+="?"+n.substring(1)}(t.proxy?()=>fetch(t.proxy,{method:"POST",body:a,signal:t.abortController.signal}):()=>fetch(a,{signal:t.abortController.signal}))().then(i=>{if(!i.ok)throw new Error(`couldn't load "${e.url}". Request failed with status ${i.status} : ${i.statusText}`);i.json().then(o=>Br(o,a)).then(o=>{t._setup({rootPath:It.dirname(e.url),json:o})})}).catch(i=>{t.displayErrors&&Gn(i)})}}setSplatsSizeMultiplier(e){this.splatsSizeMultiplier=e,this.splatsMesh&&this.splatsMesh.setSplatsSizeMultiplier(this.splatsSizeMultiplier)}setSplatsCropRadius(e){this.splatsCropRadius=e,this.splatsMesh&&this.splatsMesh.setSplatsCropRadius(this.splatsCropRadius)}setSplatsCPUCulling(e){this.splatsCPUCulling=e,this.splatsMesh&&this.splatsMesh.setSplatsCPUCulling(e)}setSplatsQuality(e){this.splatsQuality=e,this.splatsMesh&&this.splatsMesh.setQuality(e)}updateMatrices(){this.updateMatrix(),this.splatsMesh&&this.splatsMesh.updateMatrix(),this.static&&(this.traverse(e=>{e.isObject3D&&(e.matrixWorldAutoUpdate=!0)}),this.splatsMesh&&(this.splatsMesh.matrixWorldAutoUpdate=!0)),this.updateMatrixWorld(!0),this.static&&(this.traverse(e=>{e.isObject3D&&(e.matrixWorldAutoUpdate=!1)}),this.splatsMesh&&(this.splatsMesh.matrixWorldAutoUpdate=!1))}setCanvasSize(e,t){this.rendererSize.set(e,t)}async _setup(e){const t=this;if(e.json.extensionsRequired&&(e.json.extensionsRequired.includes("JDULTRA_gaussian_splats")||e.json.extensionsRequired.includes("JDULTRA_gaussian_splats_V2"))&&(t.splatsMesh=new Oc(t.tileLoader.renderer),t.splatsMesh.setQuality(t.splatsQuality),t.splatsMesh.setSplatsCPUCulling(t.splatsCPUCulling),t.splatsMesh.setSplatsCropRadius(t.splatsCropRadius),t.splatsMesh.setSplatsSizeMultiplier(t.splatsSizeMultiplier),t.static&&(t.splatsMesh.matrixWorldAutoUpdate=!1),t.add(t.splatsMesh),t.updateMatrices()),e.json.root?(t.json=e.json.root,t.json.refine||(t.json.refine=e.json.refine),t.json.geometricError||(t.json.geometricError=e.json.geometricError),t.json.transform||(t.json.transform=e.json.transform),t.json.boundingVolume||(t.json.boundingVolume=e.json.boundingVolume)):t.json=e.json,t.json.children||(t.json.getChildren?t.json.children=await t.json.getChildren():t.json.children=[]),t.rootPath=e.json.rootPath?e.json.rootPath:e.rootPath,t.json.refine?t.refine=t.json.refine:t.refine=e.parentRefine,t.json.geometricError?t.geometricError=t.json.geometricError:t.geometricError=e.parentGeometricError,t.json.transform){let n=new G.Matrix4;n.elements=t.json.transform,t.applyMatrix4(n)}if(t.json.boundingVolume)if(t.json.boundingVolume.box)t.boundingVolume=new it(t.json.boundingVolume.box);else if(t.json.boundingVolume.region){const n=t.json.boundingVolume.region;t._transformWGS84ToCartesian(n[0],n[1],n[4],gt),t._transformWGS84ToCartesian(n[2],n[3],n[5],Gt),gt.lerp(Gt,.5),t.boundingVolume=new G.Sphere(new G.Vector3(gt.x,gt.y,gt.z),gt.distanceTo(Gt))}else if(t.json.boundingVolume.sphere){const n=t.json.boundingVolume.sphere;t.boundingVolume=new G.Sphere(new G.Vector3(n[0],n[1],n[2]),n[3])}else t.boundingVolume=e.parentBoundingVolume;else t.boundingVolume=e.parentBoundingVolume;function a(n){n.uri&&n.uri.includes("json")||n.url&&n.url.includes("json")?t.hasUnloadedJSONContent++:t.hasMeshContent++}if(t.json.content?(a(t.json.content),t.hasMeshContent==0&&(t.level=Math.max(0,t.parentTile?t.parentTile.level+.01:0)),t._load()):t.json.contents&&(t.json.contents.forEach(n=>a(n)),t.hasMeshContent==0&&(t.level=Math.max(0,t.parentTile?t.parentTile.level+.01:0))),t.centerModel&&(Gt.copy(t.boundingVolume.center),this.json.boundingVolume.region&&(this._transformWGS84ToCartesian(.5*(this.json.boundingVolume.region[0]+this.json.boundingVolume.region[2]),.5*(this.json.boundingVolume.region[1]+this.json.boundingVolume.region[3]),.5*(this.json.boundingVolume.region[4]+this.json.boundingVolume.region[5]),gt),Ln.setFromUnitVectors(gt.normalize(),zc.normalize()),t.applyQuaternion(Ln)),Gt.applyMatrix4(t.matrix),t.position.sub(Gt),t.updateMatrices()),t.onLoadCallback&&t.onLoadCallback(t),t.isSetup=!0,t.level>0&&t.drawBoundingVolume)if(t.bbox&&console.log("double setup"),this.boundingVolume.aabb){let n=this.boundingVolume.aabb.clone();n.applyMatrix4(this.matrixWorld),t.bbox=new G.Box3Helper(n,new G.Color(Math.random(),Math.random(),Math.random())),t.add(t.bbox),t.bbox.material.visible=!1}else t.boundingVolume instanceof it&&(t.bbox=t.boundingVolume.helper(),t.add(t.bbox),t.bbox.material.visible=!1)}_assembleURL(e,t){e.endsWith("/")||(e+="/");const a=new URL(e);let n=a.pathname.split("/").filter(o=>o!==""),i=t.split("/").filter(o=>o!=="");for(let o=1;o<=n.length&&!(o>=i.length);o++)if(n.slice(n.length-o,n.length).join("/")===i.slice(0,o).join("/")){for(let s=0;s<o;s++)n.pop();break}for(;i.length>0&&i[0]==="..";)n.pop(),i.shift();return`${a.protocol}//${a.host}/${[...n,...i].join("/")}`}_extractQueryParams(e,t){const a=new URL(e);for(let[n,i]of a.searchParams)t[n]=i;return a.search="",a.toString()}async _load(e=!0,t=!0){var a=this;if(!a.deleted){if(a.json.content)await n(a.json.content,null,e,t);else if(a.json.contents){let i=a.json.contents.map((o,s)=>n(o,s,e,t));Promise.all(i)}}async function n(i,o,s,A){let u;i.uri?u=i.uri:i.url&&(u=i.url);const c=/^(?:http|https|ftp|tcp|udp):\/\/\S+/;if(c.test(a.rootPath)?c.test(u)||(u=a._assembleURL(a.rootPath,u)):It.isAbsolute(a.rootPath)&&(u=a.rootPath+It.sep+u),u=a._extractQueryParams(u,a.queryParams),a.queryParams){var d="";for(let l in a.queryParams)a.queryParams.hasOwnProperty(l)&&(d+="&"+l+"="+a.queryParams[l]);u.includes("?")?u+=d:u+="?"+d.substring(1)}if(u)if(a.contentURL.push(u),A&&(u.includes(".b3dm")||u.includes(".glb")||u.includes(".gltf")))try{a.tileLoader.get(a.abortController,a.uuid,u,l=>{a.deleted||(l.asset&&l.asset.copyright&&(l.asset.copyright.split(";").forEach(h=>{rt[h]?rt[h]++:rt[h]=1}),a.displayCopyright&&rr()),a.meshContent.push(l),a.splatsMesh||(l.traverse(h=>{if((h.isMesh||h.isPoints)&&h.layers.disable(0),h.isMesh&&a.occlusionCullingService){const b=h.geometry.attributes.position,g=[];for(let f=0;f<b.count;f++)g.push(a.color.r,a.color.g,a.color.b);h.geometry.setAttribute("color",new G.Float32BufferAttribute(g,3))}}),a.add(l),a.updateMatrices()))},a.cameraOnLoad?()=>a.loadingStrategy=="IMMEDIATE"?a._calculateDistanceToCamera(a.cameraOnLoad):a.loadingStrategy=="INCREMENTAL"?a.parentTile?a.parentTile._calculateDistanceToCamera(a.cameraOnLoad)/Math.max(1,a.parentTile.level):a._calculateDistanceToCamera(a.cameraOnLoad)/Math.max(1,a.level):a.loadingStrategy=="PERLEVEL"?a.parentTile?a.level+a.parentTile._calculateDistanceToCamera(a.cameraOnLoad):a.level+a._calculateDistanceToCamera(a.cameraOnLoad):0:()=>0,()=>a._getSiblings(),a.level,a.loadingStrategy,!a.json.boundingVolume.region,!!a.json.boundingVolume.region,a.geometricError,a.splatsMesh)}catch(l){a.displayErrors&&Gn(l)}else s&&u.includes(".json")&&(a.jsonRequested=u,a.tileLoader.get(a.abortController,a.uuid,u,async l=>{a.jsonReceived=!0,a.deleted||(l.rootPath=It.dirname(u),a.json.children.push(l),o==null?delete a.json.content:a.json.contents.splice(o,1),a.hasUnloadedJSONContent--)}))}}dispose(){const e=this;e.meshContent.forEach(t=>{t&&t.asset&&t.asset.copyright&&(t.asset.copyright.split(";").forEach(a=>{rt[a]&&rt[a]--}),e.displayCopyright&&rr())}),e.childrenTiles.forEach(t=>t.dispose()),e.deleted=!0,e.splatsMesh&&(e.meshContent.forEach(t=>t.hide()),e.parentTile||(e.splatsMesh.dispose(),e.splatsMesh=void 0)),e.contentURL&&(e.contentURL.forEach(t=>{e.tileLoader.invalidate(t,e.uuid)}),e.contentURL=[]),e.abortController&&!e.jsonRequested&&e.abortController.abort("tile not needed"),this.parent=null,e.meshContent=[],e.bbox&&e.bbox.dispose(),this.dispatchEvent({type:"removed"})}_disposeMeshContent(){const e=this;if(!e.deleted){e.deleted=!0,e.abortController&&(e.abortController.abort("tile not needed"),e.abortController=new AbortController);for(let t=e.meshContent.length-1;t>=0;t--){const a=e.meshContent[t];a&&a.asset&&a.asset.copyright&&(a.asset.copyright.split(";").forEach(n=>{rt[n]&&rt[n]--}),e.displayCopyright&&rr()),e.remove(a)}e.splatsMesh&&e.meshContent.forEach(t=>t.hide()),e.meshContent=[],e.contentURL.forEach(t=>{e.tileLoader.invalidate(t,e.uuid)}),e.contentURL=[]}}_disposeChildren(){var e=this;e.childrenTiles.forEach(t=>{t.dispose(),e.remove(t)}),e.childrenTiles=[]}raycast(e,t){if(this.splatsMesh){da.copy(e.ray),ha.copy(this.matrixWorld).invert(),da.applyMatrix4(ha);let a=!1;if(this.boundingVolume instanceof it)a=this.boundingVolume.intersectsRay(da);else{if(!(this.boundingVolume instanceof G.Sphere))return!1;a=ray.intersectsSphere(this.boundingVolume)}return a&&this.materialVisibility&&this.splatsReady&&(la.length=0,this.meshContent.forEach(n=>{n.isSplatsBatch&&(n.raycast(da,la,e.params.Points.threshold),la.forEach(i=>{i.point.applyMatrix4(this.matrixWorld)}),t.push(...la))})),a}return super.raycast(e,t)}update(e){this.splatsMesh&&this.splatsMesh.updateShaderParams(e,this.renderer);const t=new G.Frustum;t.setFromProjectionMatrix(new G.Matrix4().multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse));let a=[0],n=[0],i=[0],o=[0];if(this.refine=="REPLACE"?this.loadingStrategy==="IMMEDIATE"?(this._updateImmediate(e,t),this._statsImmediate(i,a,o,n)):(this._update(e,t),this._stats(i,a,o,n)):(this._update(e,t),this._stats(i,a,o,n)),a>0&&(o[0]/=a[0]),this.splatsMesh)if(ba.copy(e.position),ha.copy(this.matrixWorld).invert(),ba.applyMatrix4(ha),this.splatsCPUCulling){const s=new G.Matrix4().multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse).multiply(this.matrixWorld);this.splatsMesh.sort(ba,s)}else this.splatsMesh.sort(ba);return{numTilesLoaded:a[0],numTilesRendered:n[0],maxLOD:i[0],percentageLoaded:o[0]}}_updateImmediate(e,t){this._computeMetricRecursive(e,t),this._updateNodeVisibilityImmediate(),this._expandTreeImmediate(e),this.shouldBeVisible=this.metric>0||!!this.loadOutsideView,this._shouldBeVisibleUpdateImmediate(),this._trimTreeImmediate(),this._loadMeshImmediate()}_statsImmediate(e,t,a,n){e[0]=Math.max(e[0],this.level),(this.shouldBeVisible||this.materialVisibility)&&(t[0]++,this.materialVisibility&&a[0]++),this.materialVisibility&&n[0]++,this.childrenTiles.forEach(i=>{i._statsImmediate(e,t,a,n)})}_stats(e,t,a,n){e[0]=Math.max(e[0],this.level),this.hasMeshContent&&(t[0]++,this.meshContent.length==this.hasMeshContent&&a[0]++,this.materialVisibility&&n[0]++),this.childrenTiles.forEach(i=>{i._stats(e,t,a,n)})}_trimTreeImmediate(){if(this.metric!=null)if(this.hasMeshContent&&this.shouldBeVisible&&this.materialVisibility){if(self.splatsMesh&&!self.splatsReady)return;this._disposeChildren()}else this.childrenTiles.forEach(e=>{e._trimTreeImmediate()})}_updateNodeVisibilityImmediate(e=!1){const t=this;if(t.hasMeshContent)if(t.shouldBeVisible)t.meshContent.length==t.hasMeshContent?t.materialVisibility?t.childrenTiles.forEach(a=>{a._updateNodeVisibilityImmediate(!0)}):(t._changeContentVisibility(!0),t.childrenTiles.forEach(a=>{a._updateNodeVisibilityImmediate(e)})):t.childrenTiles.forEach(a=>{a._updateNodeVisibilityImmediate(e)});else{if(!t.loadOutsideView&&t.metric<0)return t._changeContentVisibility(!1),t.meshContent.length>0&&t._disposeMeshContent(),void t.childrenTiles.forEach(a=>{a._updateNodeVisibilityImmediate(!0)});if(!t.materialVisibility||t.splatsMesh&&!t.splatsReady)t.childrenTiles.forEach(a=>{a._updateNodeVisibilityImmediate(e)});else if(e)t._changeContentVisibility(!1),t.meshContent.length>0&&t._disposeMeshContent(),t.childrenTiles.forEach(a=>{a._updateNodeVisibilityImmediate(e)});else{let a=!0;t.childrenTiles.every(n=>!!n._isReadyImmediate()||(a=!1,!1)),a&&t.childrenTiles.length>0?(t._changeContentVisibility(!1),t.meshContent.length>0&&t._disposeMeshContent(),t.childrenTiles.forEach(n=>{n._updateNodeVisibilityImmediate(e)})):t.childrenTiles.forEach(n=>{n._updateNodeVisibilityImmediate(!t.splatsMesh||!!t.splatsReady)})}}else t.childrenTiles.forEach(a=>{a._updateNodeVisibilityImmediate(e)})}_shouldBeVisibleUpdateImmediate(){const e=this;e.hasMeshContent?e.metric==null?e.shouldBeVisible=!1:e.metric<0?(e.shouldBeVisible=!!e.loadOutsideView,e.childrenTiles.forEach(t=>{t._setShouldNotBeVisibleRecursive()})):e.metric<e.geometricErrorMultiplier*e.geometricError?e.hasUnloadedJSONContent||(e.json&&e.json.children&&e.json.children.length>0?(e.shouldBeVisible=!1,e.childrenTiles.forEach(t=>{t.shouldBeVisible=!0,t._shouldBeVisibleUpdateImmediate()})):e.shouldBeVisible=!0):e.childrenTiles.forEach(t=>{t._setShouldNotBeVisibleRecursive()}):(e.childrenTiles.forEach(t=>{t.shouldBeVisible=!0,t._shouldBeVisibleUpdateImmediate()}),e.shouldBeVisible=!1)}_setShouldNotBeVisibleRecursive(){this.shouldBeVisible=!1,this.childrenTiles.forEach(e=>{e._setShouldNotBeVisibleRecursive()})}_loadMeshImmediate(){const e=this;e.hasMeshContent&&e.shouldBeVisible?e.meshContent.length<e.hasMeshContent&&e.contentURL.length==0&&(e.deleted=!1,e._load(!1,!0)):e.childrenTiles.forEach(t=>{t._loadMeshImmediate()})}_computeMetricRecursive(e,t){const a=this;a.metric=-1,a.isSetup&&(a.boundingVolume&&a.geometricError&&(a.metric=a._calculateUpdateMetric(e,t)),a.childrenTiles.forEach(n=>n._computeMetricRecursive(e,t)))}_expandTreeImmediate(e){const t=this;t.hasUnloadedJSONContent||(t.hasMeshContent?t.occlusionCullingService&&t.hasMeshContent&&!t.occlusionCullingService.hasID(t.colorID)||t.metric>=0&&t.metric<t.geometricErrorMultiplier*t.geometricError&&t.json&&t.json.children&&t.childrenTiles.length<t.json.children.length&&t._loadJsonChildren(e):t.json&&t.json.children&&t.childrenTiles.length<t.json.children.length&&t._loadJsonChildren(e)),t.childrenTiles.forEach(a=>a._expandTreeImmediate(e))}_update(e,t){const a=this;if(!a.isSetup)return;const n=a.materialVisibility;a.boundingVolume&&a.geometricError&&(a.metric=a._calculateUpdateMetric(e,t)),a.childrenTiles.forEach(i=>i._update(e,t)),function(i){if(i<0)return a.inFrustum=!1,void a._changeContentVisibility(!!a.loadOutsideView);if(a.inFrustum=!0,!!a.hasMeshContent&&!(a.meshContent.length<a.hasMeshContent)){if(a.childrenTiles.length==0)return void a._changeContentVisibility(!0);if(i>=a.geometricErrorMultiplier*a.geometricError)a._changeContentVisibility(!0);else if(i<a.geometricErrorMultiplier*a.geometricError&&a.refine=="REPLACE"){let o=!0;a.childrenTiles.every(s=>!!s._isReady()||(o=!1,!1)),o?a._changeContentVisibility(!1):a._changeContentVisibility(!0)}}}(a.metric),function(i){i<0&&a.hasMeshContent||a.occlusionCullingService&&a.hasMeshContent&&!a.occlusionCullingService.hasID(a.colorID)||(!a.hasMeshContent||i<=a.geometricErrorMultiplier*a.geometricError&&(a.meshContent.length>0||a.splatsMesh))&&a.json&&a.json.children&&a.childrenTiles.length!=a.json.children.length&&a._loadJsonChildren(e)}(a.metric),function(i,o){if(a.hasMeshContent){if(!a.inFrustum)return void a._disposeChildren();if(a.occlusionCullingService&&!o&&a.hasMeshContent&&a.meshContent.length>0&&a.materialVisibility&&a._areAllChildrenLoadedAndHidden())return a.splatsMesh&&this.materialVisibility&&!a.splatsReady?void 0:void a._disposeChildren();if(i>=a.geometricErrorMultiplier*a.geometricError){if(a.splatsMesh&&a.materialVisibility&&!a.splatsReady)return;a._disposeChildren()}}}(a.metric,n)}_loadJsonChildren(e){const t=this;for(let a=t.json.children.length-1;a>=0;a--)t.json.children[a].root||t.json.children[a].children||t.json.children[a].getChildren||t.json.children[a].content||t.json.children[a].contents||t.json.children.splice(a,1);t.json.children.forEach(a=>{let n=new jr({parentTile:t,queryParams:t.queryParams,parentGeometricError:t.geometricError,parentBoundingVolume:t.boundingVolume,parentRefine:t.refine,json:a,rootPath:t.rootPath,geometricErrorMultiplier:t.geometricErrorMultiplier,loadOutsideView:t.loadOutsideView,level:Math.floor(t.level)+1,tileLoader:t.tileLoader,cameraOnLoad:e,occlusionCullingService:t.occlusionCullingService,renderer:t.renderer,static:t.static,centerModel:!1,displayErrors:t.displayErrors,displayCopyright:t.displayCopyright,distanceBias:t.distanceBias,loadingStrategy:t.loadingStrategy,drawBoundingVolume:t.drawBoundingVolume,splatsMesh:t.splatsMesh});t.childrenTiles.push(n),t.add(n)}),t.updateMatrices(!0)}_areAllChildrenLoadedAndHidden(){let e=!0;const t=this;return this.childrenTiles.every(a=>{if(a.hasMeshContent){if(a.childrenTiles.length>0)return e=!1,!1;if(!a.metric<0)return!0;if(a.materialVisibility&&(!t.splatsMesh||t.splatsReady)||t.occlusionCullingService.hasID(a.colorID))return e=!1,!1}else if(!a._areAllChildrenLoadedAndHidden())return e=!1,!1;return!0}),e}_isReady(){if(this.metric==null)return!1;if(this.metric<0)return!0;if(this.hasUnloadedJSONContent)return!1;if(!this.hasMeshContent&&this.json.children.length==0&&!this.hasUnloadedJSONContent)return!0;if(!this.hasMeshContent||this.meshContent.length==0||!this.materialVisibility){if(this.children.length>0){var e=!0;return this.childrenTiles.every(t=>!!t._isReady()||(e=!1,!1)),e}return!1}return!this.hasMeshContent||!(this.meshContent.length<this.hasMeshContent)&&!!this.materialVisibility}_isReadyImmediate(){if(this.materialVisibility||!this.loadOutsideView&&this.metric<0)return!0;if(this.childrenTiles.length>0){var e=!0;return this.childrenTiles.every(t=>!!t._isReadyImmediate()||(e=!1,!1)),e}return!1}_changeContentVisibility(e){const t=this;if(t.bbox&&(t.bbox.material.visible=e),t.splatsMesh)e!=t.materialVisibility&&(t.meshContent.forEach(a=>{e&&a.isSplatsBatch?a.show(()=>{t.materialVisibility&&(t.splatsReady=!0)}):(a.hide(),t.splatsReady=!1)}),t.materialVisibility=e);else{if(t.hasMeshContent&&t.meshContent.length>0&&(e?t.meshContent.forEach(a=>{a.traverse(n=>{(n.isMesh||n.isPoints)&&n.layers.enable(0)})}):t.meshContent.forEach(a=>{a.traverse(n=>{(n.isMesh||n.isPoints)&&n.layers.disable(0)})})),t.materialVisibility==e)return;t.materialVisibility=e}}_calculateUpdateMetric(e,t){let a=0;if(this.boundingVolume instanceof it){if(xt.copy(this.boundingVolume),xt.applyMatrix4(this.matrixWorld),!xt.inFrustum(t))return-1;a=Math.max(0,xt.distanceToPoint(e.position)-e.near)}else{if(!(this.boundingVolume instanceof G.Sphere))return console.error("unsupported shape"),-1;if(ut.copy(this.boundingVolume),ut.applyMatrix4(this.matrixWorld),!t.intersectsSphere(ut))return-1;a=Math.max(0,e.position.distanceTo(ut.center)-ut.radius-e.near)}if(a=Math.pow(a,this.distanceBias),a==0)return 0;const n=this.matrixWorld.getMaxScaleOnAxis();this.renderer&&this.renderer.getDrawingBufferSize(this.rendererSize);let i=this.rendererSize.y,o=e.fov;return e.aspect<1&&(o*=e.aspect,i=this.rendererSize.x),16*(2*Math.tan(.5*o*.017453292519943295)*a)/(i*n)}_getSiblings(){const e=this,t=[];if(!e.parentTile)return t;let a=e.parentTile;for(;!a.hasMeshContent&&a.parentTile;)a=a.parentTile;return a.childrenTiles.forEach(n=>{if(n&&n!=e){for(;!n.hasMeshContent&&n.childrenTiles[0];)n=n.childrenTiles[0];t.push(n)}}),t}_calculateDistanceToCamera(e){return this.boundingVolume instanceof it?(xt.copy(this.boundingVolume),xt.applyMatrix4(this.matrixWorld),Math.max(0,xt.distanceToPoint(e.position))):this.boundingVolume instanceof G.Sphere?(ut.copy(this.boundingVolume),ut.applyMatrix4(this.matrixWorld),Math.max(0,e.position.distanceTo(ut.center)-ut.radius)):(console.error("unsupported shape"),-1)}setGeometricErrorMultiplier(e){this.geometricErrorMultiplier=e,this.childrenTiles.forEach(t=>t.setGeometricErrorMultiplier(e))}setDistanceBias(e){this.distanceBias=e,this.childrenTiles.forEach(t=>t.setDistanceBias(e))}_transformWGS84ToCartesian(e,t,a,n){const i=6378137/Math.sqrt(1-.006694384442042*Math.pow(Math.sin(t),2)),o=Math.cos(t),s=Math.cos(e),A=Math.sin(t),u=i+a,c=u*o*s,d=u*o*Math.sin(e),l=(.993305615557957*i+a)*A;n.set(c,d,l)}hideCopyright(){(function(){oe||((oe=document.createElement("div")).style.position="fixed",oe.style.bottom="20px",oe.style.left="20px",oe.style.color="white",oe.style.textShadow="2px 2px 0 #000, -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000",oe.style.padding="10px",oe.style.backgroundColor="rgba(0, 0, 0, 0.1)",document.body.appendChild(oe)),oe.style.opacity=0})()}showCopyright(){(function(){oe||((oe=document.createElement("div")).style.position="fixed",oe.style.bottom="20px",oe.style.left="20px",oe.style.color="white",oe.style.textShadow="2px 2px 0 #000, -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000",oe.style.padding="10px",oe.style.backgroundColor="rgba(0, 0, 0, 0.1)",document.body.appendChild(oe)),oe.style.opacity=1})()}}function Gn(r){var e=document.createElement("div");e.textContent=r,e.style.position="fixed",e.style.top="10px",e.style.left="50%",e.style.transform="translateX(-50%)",e.style.padding="10px",e.style.backgroundColor="#ff8800",e.style.color="#ffffff",e.style.zIndex="9999",document.body.appendChild(e),setTimeout(function(){e.remove()},8e3)}function rr(){oe||((oe=document.createElement("div")).style.position="fixed",oe.style.bottom="20px",oe.style.left="20px",oe.style.color="white",oe.style.textShadow="2px 2px 0 #000, -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000",oe.style.padding="10px",oe.style.backgroundColor="rgba(0, 0, 0, 0.1)",document.body.appendChild(oe));const r=Vi();let e="";r.forEach(t=>{e+=t+", "}),e=e.slice(0,-2),oe.textContent=e}const _e=new G.Sphere(new G.Vector3(0,0,0),1),ft=new G.Vector3(0,0,0),nr=new G.Vector3(0,0,0),Pc=new G.Vector3(0,1,0),ir=new G.Vector2,_n=new G.Quaternion,Hn=new G.Matrix4;class Mr extends G.Object3D{constructor(e){super();const t=this;if(e.queryParams&&(this.queryParams={...e.queryParams}),this.uuid=qn(),e.tileLoader?this.tileLoader=e.tileLoader:console.error("an instanced tileset must be provided an InstancedTilesetLoader"),this.master=e.master,this.loadOutsideView=e.loadOutsideView,this.cameraOnLoad=e.cameraOnLoad,this.parentTile=e.parentTile,this.distanceBias=Math.max(1e-4,e.distanceBias?e.distanceBias:1),this.childrenTiles=[],this.jsonChildren=[],this.meshContent=new Set,this.static=e.static,this.static&&(this.matrixAutoUpdate=!1,this.matrixWorldAutoUpdate=!1),this.tileContent,this.refinement,this.rootPath,this.geometricError,this.boundingVolume,this.json,this.materialVisibility=!1,this.inFrustum=!0,this.level=e.level?e.level:0,this.hasMeshContent=0,this.hasUnloadedJSONContent=0,this.centerModel=e.centerModel,this.deleted=!1,this.abortController=new AbortController,e.json)this.rootPath=e.json.rootPath?e.json.rootPath:e.rootPath,e.json.children&&(this.jsonChildren=e.json.children),t.setup(e);else if(e.url){this.loadJson=(i,o)=>{const s=It.dirname(o);t.setup({rootPath:s,json:i,onLoadCallback:e.onLoadCallback})};var a=e.url;if(t.queryParams){var n="";for(let i in t.queryParams)t.queryParams.hasOwnProperty(i)&&(n+="&"+i+"="+t.queryParams[i]);a.includes("?")?a+=n:a+="?"+n.substring(1)}t.tileLoader.get(t.abortController,a,t.uuid,t)}}async setup(e){const t=this;e.json.root?(t.json=e.json.root,!t.json.children&&t.json.getChildren&&(t.json.children=await t.json.getChildren()),t.jsonChildren=t.json.children,t.json.refinement||(t.json.refinement=e.json.refinement),t.json.geometricError||(t.json.geometricError=e.json.geometricError),t.json.transform||(t.json.transform=e.json.transform),t.json.boundingVolume||(t.json.boundingVolume=e.json.boundingVolume)):(t.json=e.json,!t.json.children&&t.json.getChildren&&(t.json.children=await t.json.getChildren(),t.jsonChildren=t.json.children)),t.rootPath=e.json.rootPath?e.json.rootPath:e.rootPath,t.json.refinement?t.refinement=t.json.refinement:t.refinement=e.parentRefinement,t.json.geometricError?t.geometricError=t.json.geometricError:t.geometricError=e.parentGeometricError;let a=new G.Matrix4;if(t.json.transform&&!t.centerModel&&(a.elements=t.json.transform),t.applyMatrix4(a),t.parentTile&&t.parentTile.matrix&&(t.matrix.premultiply(t.parentTile.matrix),t.matrix.decompose(t.position,t.quaternion,t.scale)),t.matrixWorldNeedsUpdate=!0,t.updateWorldMatrix(!0,!0),t.json.boundingVolume)if(t.json.boundingVolume.box)t.boundingVolume=new it(t.json.boundingVolume.box);else if(t.json.boundingVolume.region){const i=t.json.boundingVolume.region;t.transformWGS84ToCartesian(i[0],i[1],i[4],ft),t.transformWGS84ToCartesian(i[2],i[3],i[5],nr),ft.lerp(nr,.5),t.boundingVolume=new G.Sphere(new G.Vector3(ft.x,ft.y,ft.z),ft.distanceTo(nr))}else if(t.json.boundingVolume.sphere){const i=t.json.boundingVolume.sphere;t.boundingVolume=new G.Sphere(new G.Vector3(i[0],i[1],i[2]),i[3])}else t.boundingVolume=e.parentBoundingVolume;else t.boundingVolume=e.parentBoundingVolume;function n(i){i.uri&&i.uri.includes("json")||i.url&&i.url.includes("json")?t.hasUnloadedJSONContent++:t.hasMeshContent++}if(t.json.content?(n(t.json.content),t.load()):t.json.contents&&(t.json.contents.forEach(i=>n(i)),t.load()),t.centerModel){const i=new G.Sphere;t.boundingVolume instanceof it?i.copy(t.boundingVolume.sphere):t.boundingVolume instanceof G.Sphere&&i.copy(t.boundingVolume),this.json.boundingVolume.region&&(t.transformWGS84ToCartesian(.5*(t.json.boundingVolume.region[0]+t.json.boundingVolume.region[2]),.5*(t.json.boundingVolume.region[1]+t.json.boundingVolume.region[3]),.5*(t.json.boundingVolume.region[4]+t.json.boundingVolume.region[5]),ft),_n.setFromUnitVectors(ft.normalize(),Pc.normalize()),t.master.applyQuaternion(_n),t.master.updateWorldMatrix(!1,!1)),Hn.makeTranslation(-i.center.x*t.scale.x,-i.center.y*t.scale.y,-i.center.z*t.scale.z),t.master.matrix.multiply(Hn),t.master.matrix.decompose(t.master.position,t.master.quaternion,t.master.scale)}t.isSetup=!0,e.onLoadCallback&&e.onLoadCallback(t)}isAbsolutePathOrURL(e){const t=/^(?:http|https|ftp|tcp|udp):\/\/\S+/.test(e),a=e.startsWith("/")&&!e.startsWith("//");return t||a}assembleURL(e,t){e.endsWith("/")||(e+="/");const a=new URL(e);let n=a.pathname.split("/").filter(o=>o!==""),i=t.split("/").filter(o=>o!=="");for(let o=1;o<=n.length&&!(o>=i.length);o++)if(n.slice(n.length-o,n.length).join("/")===i.slice(0,o).join("/")){for(let s=0;s<o;s++)n.pop();break}for(;i.length>0&&i[0]==="..";)n.pop(),i.shift();return`${a.protocol}//${a.host}/${[...n,...i].join("/")}`}extractQueryParams(e,t){const a=new URL(e);for(let[n,i]of a.searchParams)t[n]=i;return a.search="",a.toString()}load(){var e=this;function t(a){let n;a.uri?n=a.uri:a.url&&(n=a.url);const i=/^(?:http|https|ftp|tcp|udp):\/\/\S+/;if(i.test(e.rootPath)?i.test(n)||(n=e.assembleURL(e.rootPath,n)):It.isAbsolute(e.rootPath)&&(n=e.rootPath+It.sep+n),n=e.extractQueryParams(n,e.queryParams),e.queryParams){var o="";for(let s in e.queryParams)e.queryParams.hasOwnProperty(s)&&(o+="&"+s+"="+e.queryParams[s]);n.includes("?")?n+=o:n+="?"+o.substring(1)}n&&(n.includes(".b3dm")||n.includes(".glb")||n.includes(".gltf")?(e.contentURL=n,e.tileLoader.get(e.abortController,n,e.uuid,e,e.cameraOnLoad?()=>e.calculateDistanceToCamera(e.cameraOnLoad):()=>0,()=>e.getSiblings(),e.level,!e.json.boundingVolume.region,!!e.json.boundingVolume.region,e.geometricError)):n.includes(".json")&&e.tileLoader.get(e.abortController,n,e.uuid,e))}e.deleted||(e.json.content?t(e.json.content):e.json.contents&&e.json.contents.forEach(a=>t(a)))}loadMesh(e){this.deleted||this.meshContent.add(e)}loadJson(e,t){this.deleted||(this.json.children&&(this.jsonChildren=this.json.children),e.rootPath=It.dirname(t),this.jsonChildren.push(e),this.hasUnloadedJSONContent--)}dispose(){const e=this;e.childrenTiles.forEach(t=>t.dispose()),e.deleted=!0,e.abortController&&e.abortController.abort(),this.parent=null,this.parentTile=null,this.dispatchEvent({type:"removed"})}disposeChildren(){this.childrenTiles.forEach(e=>e.dispose()),this.childrenTiles=[]}_update(e,t){const a=this;function n(i){if(a.hasMeshContent&&!(a.meshContent.size<a.hasMeshContent)){if(i<0)return a.inFrustum=!1,void a.changeContentVisibility(!!a.loadOutsideView);if(a.inFrustum=!0,a.childrenTiles.length!=0){if(i>=a.master.geometricErrorMultiplier*a.geometricError)a.changeContentVisibility(!0);else if(i<a.master.geometricErrorMultiplier*a.geometricError){let o=!0;a.childrenTiles.every(s=>!!s.isReady()||(o=!1,!1)),o&&a.changeContentVisibility(!1)}}else a.changeContentVisibility(!0)}}a.isSetup&&(a.materialVisibility,a.boundingVolume&&a.geometricError&&(a.metric=a.calculateUpdateMetric(e,t)),a.childrenTiles.forEach(i=>i._update(e,t)),n(a.metric),function(i){i<0&&a.hasMeshContent||(!a.hasMeshContent&&a.rootPath||i<a.master.geometricErrorMultiplier*a.geometricError&&a.meshContent.size>0)&&a.json&&a.jsonChildren&&a.childrenTiles.length!=a.jsonChildren.length&&a.jsonChildren.forEach(o=>{if(!(o.root||o.children||o.getChildren||o.content||o.contents))return;let s=new Mr({parentTile:a,queryParams:a.queryParams,parentGeometricError:a.geometricError,parentBoundingVolume:a.boundingVolume,parentRefinement:a.refinement,json:o,rootPath:a.rootPath,loadOutsideView:a.loadOutsideView,level:a.level+1,tileLoader:a.tileLoader,cameraOnLoad:e,master:a.master,centerModel:!1});a.childrenTiles.push(s)})}(a.metric),function(i){if(a.hasMeshContent){if(!a.inFrustum)return a.disposeChildren(),void n(i);i>=a.master.geometricErrorMultiplier*a.geometricError&&(a.disposeChildren(),n(i))}}(a.metric))}areAllChildrenLoadedAndHidden(){let e=!0;return this.childrenTiles.every(t=>{if(t.hasMeshContent){if(t.childrenTiles.length>0)return e=!1,!1;if(!t.inFrustum)return!0;if(!t.materialVisibility||t.meshesToDisplay!=t.meshesDisplayed)return e=!1,!1}else if(!t.areAllChildrenLoadedAndHidden())return e=!1,!1;return!0}),e}isReady(){if(!this.inFrustum)return!0;if(this.hasUnloadedJSONContent)return!1;if(!this.hasMeshContent||this.meshContent.size==0||!this.materialVisibility){if(this.childrenTiles.length>0){var e=!0;return this.childrenTiles.every(t=>!!t.isReady()||(e=!1,!1)),e}return!1}return!this.hasMeshContent||!(this.meshContent.size<this.hasMeshContent)&&!!this.materialVisibility}changeContentVisibility(e){this.materialVisibility=e}calculateUpdateMetric(e,t){if(this.boundingVolume instanceof it){if(_e.copy(this.boundingVolume.sphere),_e.applyMatrix4(this.matrixWorld),!t.intersectsSphere(_e))return-1}else{if(!(this.boundingVolume instanceof G.Sphere))return console.error("unsupported shape"),-1;if(_e.copy(this.boundingVolume),_e.applyMatrix4(this.matrixWorld),!t.intersectsSphere(_e))return-1}let a=Math.max(0,e.position.distanceTo(_e.center)-_e.radius);if(a=Math.pow(a,this.distanceBias),a==0)return 0;const n=this.matrixWorld.getMaxScaleOnAxis();this.master._renderSize(ir);let i=ir.y,o=e.fov;e.aspect<1&&(o*=e.aspect,i=ir.x);let s=2*Math.tan(.5*o*.017453292519943295)*a;return 16*window.devicePixelRatio*s/(i*n)}getSiblings(){const e=this,t=[];if(!e.parentTile)return t;let a=e.parentTile;for(;!a.hasMeshContent&&a.parentTile;)a=a.parentTile;return a.childrenTiles.forEach(n=>{if(n&&n!=e){for(;!n.hasMeshContent&&n.childrenTiles[0];)n=n.childrenTiles[0];t.push(n)}}),t}calculateDistanceToCamera(e){return this.boundingVolume instanceof it?(_e.copy(this.boundingVolume.sphere),_e.applyMatrix4(this.matrixWorld)):this.boundingVolume instanceof G.Sphere?(_e.copy(this.boundingVolume),_e.applyMatrix4(this.matrixWorld)):console.error("unsupported shape"),Math.max(0,e.position.distanceTo(_e.center)-_e.radius)}getWorldMatrix(){return this.matrixWorld}transformWGS84ToCartesian(e,t,a,n){const i=6378137/Math.sqrt(1-.006694384442042*Math.pow(Math.sin(t),2)),o=Math.cos(t),s=Math.cos(e),A=Math.sin(t),u=i+a,c=u*o*s,d=u*o*Math.sin(e),l=(.993305615557957*i+a)*A;n.set(c,d,l)}}class qc extends G.Object3D{constructor(e){super(),e.master=this,e.domWidth&&e.domHeight?this.rendererSize=new G.Vector2(e.domWidth,e.domHeight):this.rendererSize=new G.Vector2(1e3,1e3),this.renderer=e.renderer,this.distanceBias=Math.max(1e-4,e.distanceBias?e.distanceBias:1),this.geometricErrorMultiplier=e.geometricErrorMultiplier?e.geometricErrorMultiplier:1,this.tileset=new Mr(e),e.static&&(this.matrixAutoUpdate=!1),this.tileLoader=e.tileLoader}_renderSize(e){this.renderer?this.renderer.getDrawingBufferSize(e):e.copy(this.rendererSize)}setCanvasSize(e,t){this.rendererSize.set(e,t)}update(e,t){if(t)this.tileset._update(e,t);else{const a=new G.Frustum;a.setFromProjectionMatrix(new G.Matrix4().multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse)),this.tileset._update(e,a)}}setGeometricErrorMultiplier(e){this.geometricErrorMultiplier=e||1}}class Jc{constructor(e){const t=this;t.scene=e,t.instancedTiles=[],t.instancedMesh,t.reuseableMatrix=new G.Matrix4}addInstance(e){const t=this;e.added=!0,e.listOMesh=t.instancedTiles,t.instancedTiles.push(e),t.instancedMesh&&e.loadMesh(t.instancedMesh)}addToScene(){const e=this;e.instancedMesh.setMatrixAt(0,new G.Matrix4),e.instancedMesh.instanceMatrix.needsUpdate=!0,e.instancedMesh.count=1,e.scene.add(e.instancedMesh),e.instancedMesh.onAfterRender=()=>{delete e.instancedMesh.onAfterRender,e.instancedMesh.displayedOnce=!0}}setObject(e){const t=this;t.instancedMesh=e,t.instancedMesh.matrixAutoUpdate=!1,t.instancedMesh.matrixWorldAutoUpdate=!1,t.scene.children.includes(e)||this.addToScene();for(let a=0;a<t.instancedTiles.length;a++)t.instancedTiles[a].loadMesh(t.instancedMesh)}update(){const e=this;for(let t=e.instancedTiles.length-1;t>=0;t--)e.instancedTiles[t].deleted&&e.instancedTiles.splice(t,1);if(e.instancedMesh){e.instancedMesh.count=0,e.instancedMesh.instancedTiles=[];for(let t=0;t<e.instancedTiles.length;t++)e.instancedTiles[t].meshContent.add(e.instancedMesh),e.instancedTiles[t].materialVisibility&&(e.instancedMesh.count++,e.reuseableMatrix.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),e.reuseableMatrix.multiply(e.instancedTiles[t].matrixWorld),e.reuseableMatrix.multiply(e.instancedMesh.baseMatrix),e.instancedMesh.setMatrixAt(e.instancedMesh.count-1,e.reuseableMatrix),e.instancedMesh.instancedTiles.push(e.instancedTiles[t]));e.instancedMesh.instanceMatrix.needsUpdate=!0,e.instancedMesh.needsUpdate=!0,e.instancedMesh.computeBoundingSphere()}}getCount(){return this.instancedTiles.length}dispose(){const e=this;return!(e.instancedTiles.length>0)&&!!e.instancedMesh&&(e.scene.remove(e.instancedMesh),e.instancedMesh.traverse(t=>{if(t.dispose&&t.dispose(),t.material)if(t.material.length)for(let a=0;a<t.material.length;++a)t.material[a].dispose();else t.material.dispose();t.geometry&&t.geometry.dispose()}),e.instancedMesh.dispose(),!0)}}class Kc{constructor(){const e=this;e.count=0,e.json,e.instancedTiles=[]}addInstance(e){this.instancedTiles.push(e),this.json&&e.loadJson(this.json,this.url)}setObject(e,t){const a=this;a.json=e,a.url=t;for(let n=0;n<a.instancedTiles.length;n++)a.instancedTiles[n].loadJson(a.json,a.url)}getCount(){return this.instancedTiles.length}update(){const e=this;for(let t=e.instancedTiles.length-1;t>=0;t--)e.instancedTiles[t].deleted&&e.instancedTiles.splice(t,1)}dispose(){return!(!this.json||this.instancedTiles.length!=0)}}let Ft=0;async function Vc(r){return new Promise(e=>{const t=setInterval(()=>{r.hasDracoLoader&&!r.dracoLoader||r.hasKTX2Loader&&!r.ktx2Loader||(clearInterval(t),e())},10)})}exports.InstancedOGC3DTile=qc,exports.InstancedTileLoader=class{constructor(r,e){if(this.zUpToYUpMatrix=new G.Matrix4,this.zUpToYUpMatrix.set(1,0,0,0,0,0,-1,0,0,1,0,0,0,0,0,1),this.maxCachedItems=100,this.maxInstances=1,this.proxy=e.proxy,e&&(this.meshCallback=e.meshCallback,this.pointsCallback=e.pointsCallback,e.maxCachedItems&&(this.maxCachedItems=e.maxCachedItems),e.maxInstances&&(this.maxInstances=e.maxInstances)),this.gltfLoader=new Jn,e&&e.dracoLoader)this.gltfLoader.setDRACOLoader(e.dracoLoader),this.hasDracoLoader=!0;else{const t=new Wn;t.setDecoderPath("https://www.gstatic.com/draco/versioned/decoders/1.4.3/"),this.gltfLoader.setDRACOLoader(t),this.gltfLoader.hasDracoLoader=!0}if(e&&e.ktx2Loader)this.gltfLoader.setKTX2Loader(e.ktx2Loader),this.hasKTX2Loader=!0;else if(e&&e.renderer){const t=new qe;t.setTranscoderPath("https://storage.googleapis.com/ogc-3d-tiles/basis/").detectSupport(e.renderer),this.gltfLoader.setKTX2Loader(t),this.gltfLoader.hasKTX2Loader=!0}this.gltfLoader.setMeshoptDecoder(ui),this.hasMeshOptDecoder=!0,this.b3dmDecoder=new Pn(this.gltfLoader),this.cache=new On,this.scene=r,this.ready=[],this.downloads=[],this.nextReady=[],this.nextDownloads=[]}update(){const r=this;r._checkSize(),r.cache._data.forEach(e=>{e.update()}),Ft<8&&r._download(),r._loadBatch()}_download(){const r=this;if(r.nextDownloads.length!=0||(r._getNextDownloads(),r.nextDownloads.length!=0))for(;r.nextDownloads.length>0;){const t=r.nextDownloads.shift();if(t){if(t.path.includes(".b3dm")&&(e=r.proxy?()=>fetch(r.proxy,{method:"POST",body:t.path}):()=>fetch(t.path),Ft++,e().then(a=>{if(!a.ok)throw console.error("could not load tile with path : "+t.path),new Error(`couldn't load "${t.path}". Request failed with status ${a.status} : ${a.statusText}`);return a.arrayBuffer()}).then(a=>this.b3dmDecoder.parseB3DMInstanced(a,n=>{r.meshCallback(n,t.geometricError)},r.maxInstances,t.sceneZupToYup,t.meshZupToYup)).then(a=>{a.frustumCulled=!1,t.tile.setObject(a),r.ready.unshift(t)}).catch(a=>console.error(a)).finally(()=>{Ft--})),t.path.includes(".glb")||t.path.includes(".gltf"))e=r.proxy?()=>fetch(r.proxy,{method:"POST",body:t.path}):()=>fetch(t.path),Ft++,e().then(a=>{if(!a.ok)throw new Error("missing content");return a.arrayBuffer()}).then(async a=>{await Vc(this.gltfLoader),this.gltfLoader.parse(a,null,n=>{let i;n.scene.asset=n.asset,t.sceneZupToYup&&n.scene.applyMatrix4(this.zUpToYUpMatrix),n.scene.traverse(o=>{o.geometricError=t.geometricError,o.isMesh&&(t.meshZupToYup&&o.applyMatrix4(this.zUpToYUpMatrix),r.meshCallback&&r.meshCallback(o,o.geometricError)),o.isPoints&&console.error("instanced point cloud is not supported")}),n.scene.updateWorldMatrix(!1,!0),n.scene.traverse(o=>{o.isMesh&&(i=new G.InstancedMesh(o.geometry,o.material,r.maxInstances),i.baseMatrix=o.matrixWorld)}),r.ready.unshift(t),i?(i.frustumCulled=!1,t.tile.setObject(i)):n.scene.traverse(o=>{o.dispose&&o.dispose(),o.material&&o.material.dispose()})})},a=>{console.error("could not load tile : "+t.path)}).finally(()=>{Ft--});else if(t.path.includes(".json")){var e;e=r.proxy?()=>fetch(r.proxy,{method:"POST",body:t.path}):()=>fetch(t.path),Ft++,e().then(a=>{if(!a.ok)throw console.error("could not load tile with path : "+t.path),new Error(`couldn't load "${t.path}". Request failed with status ${a.status} : ${a.statusText}`);return a.json()}).then(a=>Br(a,t.path)).then(a=>{t.tile.setObject(a,t.path),r.ready.unshift(t)}).catch(a=>console.error(a)).finally(()=>{Ft--})}}}}_loadBatch(){return this.nextReady.length==0&&(this._getNextReady(),this.nextReady.length==0)?0:this.nextReady.shift()?1:0}_getNextReady(){let r=Number.MAX_VALUE,e=-1;for(let t=this.ready.length-1;t>=0;t--)this.ready[t].distanceFunction||this.nextReady.push(this.ready.splice(t,1)[0]);if(!(this.nextReady.length>0)){for(let t=this.ready.length-1;t>=0;t--){const a=this.ready[t].distanceFunction()*this.ready[t].level;a<r&&(r=a,e=t)}if(e>=0){const t=this.ready.splice(e,1).pop();this.nextReady.push(t);const a=t.getSiblings();for(let n=this.ready.length-1;n>=0;n--)a.includes(this.ready[n].uuid)&&this.nextready.push(this.ready.splice(n,1).pop())}}}get(r,e,t,a,n,i,o,s,A,u){const c=this,d=function(h){for(var b=h.split("/"),g=[],f=0,m=0;m<b.length;m++){var p=b[m];p!=="."&&p!==""&&p!==".."?g[f++]=p:p===".."&&f>0&&f--}if(f===0)return"/";var C="";for(m=0;m<f;m++)C+="/"+g[m];return C}(e);if(!(e.includes(".b3dm")||e.includes(".json")||e.includes(".glb")||e.includes(".gltf")))return void console.error("the 3DTiles cache can only be used to load B3DM, gltf and json data");const l=c.cache.get(d);if(l)l.addInstance(a);else if(e.includes(".b3dm")||e.includes(".glb")||e.includes(".gltf")){const h=new Jc(c.scene);h.addInstance(a),c.cache.put(d,h);const b=new AbortController;r.signal.addEventListener("abort",()=>{h.getCount()==0&&b.abort()}),this.downloads.push({abortController:b,tile:h,key:d,path:e,distanceFunction:n,getSiblings:i,level:o,uuid:t,sceneZupToYup:s,meshZupToYup:A,geometricError:u,shouldDoDownload:()=>!0})}else if(e.includes(".json")){const h=new Kc;h.addInstance(a),c.cache.put(d,h);const b=new AbortController;r.signal.addEventListener("abort",()=>{h.getCount()==0&&b.abort()}),this.downloads.push({abortController:b,tile:h,key:d,path:e,distanceFunction:n,getSiblings:i,level:o,shouldDoDownload:()=>!0})}}_getNextDownloads(){let r=Number.MAX_VALUE,e=-1;for(let t=this.downloads.length-1;t>=0;t--){const a=this.downloads[t];a.shouldDoDownload()?a.distanceFunction||this.nextDownloads.push(this.downloads.splice(t,1)[0]):this.downloads.splice(t,1)}if(!(this.nextDownloads.length>0)){for(let t=this.downloads.length-1;t>=0;t--){const a=this.downloads[t],n=a.distanceFunction()*a.level;n<r&&(r=n,e=t)}if(e>=0){const t=this.downloads.splice(e,1).pop();this.nextDownloads.push(t);const a=t.getSiblings();for(let n=this.downloads.length-1;n>=0;n--)a.includes(this.downloads[n].uuid)&&this.nextDownloads.push(this.downloads.splice(n,1).pop())}}}_checkSize(){const r=this;let e=0;for(;r.cache.size()>r.maxCachedItems&&e<r.cache.size();){e++;const t=r.cache.head();r.cache.remove(t.key),t.value.dispose()||r.cache.put(t.key,t.value)}}},exports.OGC3DTile=jr,exports.OcclusionCullingService=class{constructor(){this.cullMap=[],this.cullMaterial=new G.MeshBasicMaterial({vertexColors:!0}),this.cullMaterial.side=G.FrontSide,this.cullTarget=this._createCullTarget(),this.cullPixels=new Uint8Array(4*this.cullTarget.width*this.cullTarget.height)}setSide(r){this.cullMaterial.side=r}_createCullTarget(){const r=new G.WebGLRenderTarget(Math.floor(.05*window.innerWidth),Math.floor(.05*window.innerHeight));return r.texture.format=G.RGBAFormat,r.texture.colorSpace=G.LinearSRGBColorSpace,r.texture.minFilter=G.NearestFilter,r.texture.magFilter=G.NearestFilter,r.texture.generateMipmaps=!1,r.stencilBuffer=!1,r.depthBuffer=!0,r.depthTexture=new G.DepthTexture,r.depthTexture.format=G.DepthFormat,r.depthTexture.type=G.UnsignedShortType,r}update(r,e,t){let a=e.getRenderTarget(),n=r.overrideMaterial;r.overrideMaterial=this.cullMaterial,e.setRenderTarget(this.cullTarget),e.render(r,t),r.overrideMaterial=n,e.setRenderTarget(a),e.readRenderTargetPixels(this.cullTarget,0,0,this.cullTarget.width,this.cullTarget.height,this.cullPixels),this.cullMap=[];for(let i=0;i<this.cullPixels.length;i+=4){const o=G.MathUtils.clamp(this.cullPixels[i],0,255)<<16^G.MathUtils.clamp(this.cullPixels[i+1],0,255)<<8^G.MathUtils.clamp(this.cullPixels[i+2],0,255);this.cullMap[o]=!0}}hasID(r){return this.cullMap[r]}},exports.TileLoader=di,exports.getOGC3DTilesCopyrightInfo=Vi,exports.splatsFragmentShader=Ki,exports.splatsVertexShader=Ji;
294
294
  //# sourceMappingURL=threedtiles.cjs.js.map