@jdultra/threedtiles 13.0.22 → 13.0.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/threedtiles.cjs.js
CHANGED
|
@@ -219,5 +219,5 @@ out vec2 vUv;
|
|
|
219
219
|
void main() {
|
|
220
220
|
vUv = uv;
|
|
221
221
|
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
222
|
-
}`}var z;const X=new Q.Sphere(new Q.Vector3(0,0,0),1),re=new W([0,0,0,1,0,0,0,1,0,0,0,1]);new Q.Box3;const ae=new Q.Vector3(0,0,0),he=new Q.Vector3(0,0,0),rA=new Q.Vector3(0,1,0),Me=new Q.Ray,Fe=new Q.Matrix4;new Q.Matrix4,new Q.Frustum;const We=new Q.Vector3,Se=[],xa=new Q.Quaternion,V={};function At(){var o=[];for(let e in V)V.hasOwnProperty(e)&&V[e]>0&&o.push(e);return o}class ia extends Q.Object3D{constructor(e){super();const a=this;if(a.splatsMesh=e.splatsMesh,this.contentURL=[],e.domWidth&&e.domHeight?this.rendererSize=new Q.Vector2(e.domWidth,e.domHeight):this.rendererSize=new Q.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=Ra(),e.tileLoader)this.tileLoader=e.tileLoader;else{const i={};i.meshCallback=e.meshCallback?e.meshCallback:(s,r)=>{s.material.wireframe=!1,s.material.side=Q.DoubleSide},i.pointsCallback=e.pointsCallback?e.pointsCallback:(s,r)=>{s.material.size=Math.pow(r,.33),s.material.sizeAttenuation=!0},i.proxy=this.proxy,i.renderer=e.renderer,i.dracoLoader=e.dracoLoader,i.ktx2Loader=e.ktx2Loader,this.tileLoader=new $a(i),this.update=s=>{this.update(s),this.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 Q.Color,this.color.setHex(16777215*Math.random()),this.colorID=Q.MathUtils.clamp(255*a.color.r,0,255)<<16^Q.MathUtils.clamp(255*a.color.g,0,255)<<8^Q.MathUtils.clamp(255*a.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)a._setup(e);else if(e.url){var t=e.url;if(a.queryParams){var A="";for(let i in a.queryParams)a.queryParams.hasOwnProperty(i)&&(A+="&"+i+"="+a.queryParams[i]);t.includes("?")?t+=A:t+="?"+A.substring(1)}(a.proxy?()=>fetch(a.proxy,{method:"POST",body:t,signal:a.abortController.signal}):()=>fetch(t,{signal:a.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(s=>Aa(s,t)).then(s=>{a._setup({rootPath:Ae.dirname(e.url),json:s})})}).catch(i=>{a.displayErrors&&ka(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)}updateMatrices(){this.updateMatrix(),this.static&&this.traverse(e=>{e.isObject3D&&(e.matrixWorldAutoUpdate=!0)}),this.updateMatrixWorld(!0),this.static&&this.traverse(e=>{e.isObject3D&&(e.matrixWorldAutoUpdate=!1)})}setCanvasSize(e,a){this.rendererSize.set(e,a)}async _setup(e){const a=this;if(e.json.extensionsRequired&&e.json.extensionsRequired.includes("JDULTRA_gaussian_splats")&&(a.splatsMesh=new sA(a.tileLoader.renderer),this.splatsMesh.setSplatsCropRadius(this.splatsCropRadius),this.splatsMesh.setSplatsSizeMultiplier(this.splatsSizeMultiplier),a.add(a.splatsMesh)),e.json.root?(a.json=e.json.root,a.json.refine||(a.json.refine=e.json.refine),a.json.geometricError||(a.json.geometricError=e.json.geometricError),a.json.transform||(a.json.transform=e.json.transform),a.json.boundingVolume||(a.json.boundingVolume=e.json.boundingVolume)):a.json=e.json,a.json.children||(a.json.getChildren?a.json.children=await a.json.getChildren():a.json.children=[]),a.rootPath=e.json.rootPath?e.json.rootPath:e.rootPath,a.json.refine?a.refine=a.json.refine:a.refine=e.parentRefine,a.json.geometricError?a.geometricError=a.json.geometricError:a.geometricError=e.parentGeometricError,a.json.transform){let A=new Q.Matrix4;A.elements=a.json.transform,a.applyMatrix4(A)}if(a.json.boundingVolume)if(a.json.boundingVolume.box)a.boundingVolume=new W(a.json.boundingVolume.box);else if(a.json.boundingVolume.region){const A=a.json.boundingVolume.region;a._transformWGS84ToCartesian(A[0],A[1],A[4],ae),a._transformWGS84ToCartesian(A[2],A[3],A[5],he),ae.lerp(he,.5),a.boundingVolume=new Q.Sphere(new Q.Vector3(ae.x,ae.y,ae.z),ae.distanceTo(he))}else if(a.json.boundingVolume.sphere){const A=a.json.boundingVolume.sphere;a.boundingVolume=new Q.Sphere(new Q.Vector3(A[0],A[1],A[2]),A[3])}else a.boundingVolume=e.parentBoundingVolume;else a.boundingVolume=e.parentBoundingVolume;function t(A){A.uri&&A.uri.includes("json")||A.url&&A.url.includes("json")?a.hasUnloadedJSONContent++:a.hasMeshContent++}if(a.json.content?(t(a.json.content),a.hasMeshContent==0&&(a.level=Math.max(0,a.parentTile?a.parentTile.level+.01:0)),a.loadingStrategy==="IMMEDIATE"?a._load(!0,!1):a._load()):a.json.contents&&(a.json.contents.forEach(A=>t(A)),a.hasMeshContent==0&&(a.level=Math.max(0,a.parentTile?a.parentTile.level+.01:0)),a.loadingStrategy==="IMMEDIATE"?a._load(!0,!1):a._load()),a.centerModel&&(he.copy(a.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]),ae),xa.setFromUnitVectors(ae.normalize(),rA.normalize()),a.applyQuaternion(xa)),he.applyMatrix4(a.matrix),a.position.sub(he),a.updateMatrices()),e.onLoadCallback&&a.onLoadCallback(a),a.isSetup=!0,a.level>0&&a.drawBoundingVolume)if(a.bbox&&console.log("double setup"),this.boundingVolume.aabb){let A=this.boundingVolume.aabb.clone();A.applyMatrix4(this.matrixWorld),a.bbox=new Q.Box3Helper(A,new Q.Color(Math.random(),Math.random(),Math.random())),a.add(a.bbox),a.bbox.material.visible=!1}else a.boundingVolume instanceof W&&(a.bbox=a.boundingVolume.helper(),a.add(a.bbox),a.bbox.material.visible=!1)}_assembleURL(e,a){e.endsWith("/")||(e+="/");const t=new URL(e);let A=t.pathname.split("/").filter(s=>s!==""),i=a.split("/").filter(s=>s!=="");for(let s=1;s<=A.length&&!(s>=i.length);s++)if(A.slice(A.length-s,A.length).join("/")===i.slice(0,s).join("/")){for(let r=0;r<s;r++)A.pop();break}for(;i.length>0&&i[0]==="..";)A.pop(),i.shift();return`${t.protocol}//${t.host}/${[...A,...i].join("/")}`}_extractQueryParams(e,a){const t=new URL(e);for(let[A,i]of t.searchParams)a[A]=i;return t.search="",t.toString()}async _load(e=!0,a=!0){var t=this;if(!t.deleted){if(t.json.content)await A(t.json.content,null,e,a);else if(t.json.contents){let i=t.json.contents.map((s,r)=>A(s,r,e,a));Promise.all(i)}}async function A(i,s,r,c){let n;i.uri?n=i.uri:i.url&&(n=i.url);const b=/^(?:http|https|ftp|tcp|udp):\/\/\S+/;if(b.test(t.rootPath)?b.test(n)||(n=t._assembleURL(t.rootPath,n)):Ae.isAbsolute(t.rootPath)&&(n=t.rootPath+Ae.sep+n),n=t._extractQueryParams(n,t.queryParams),t.queryParams){var l="";for(let f in t.queryParams)t.queryParams.hasOwnProperty(f)&&(l+="&"+f+"="+t.queryParams[f]);n.includes("?")?n+=l:n+="?"+l.substring(1)}if(n)if(c&&(n.includes(".b3dm")||n.includes(".glb")||n.includes(".gltf"))){t.contentURL.push(n);try{t.tileLoader.get(t.abortController,t.uuid,n,f=>{t.deleted||(f.asset&&f.asset.copyright&&(f.asset.copyright.split(";").forEach(h=>{V[h]?V[h]++:V[h]=1}),t.displayCopyright&&Ye()),t.meshContent.push(f),t.splatsMesh||(f.traverse(h=>{if((h.isMesh||h.isPoints)&&h.layers.disable(0),h.isMesh&&t.occlusionCullingService){const g=h.geometry.attributes.position,u=[];for(let p=0;p<g.count;p++)u.push(t.color.r,t.color.g,t.color.b);h.geometry.setAttribute("color",new Q.Float32BufferAttribute(u,3))}}),t.add(f),t.updateMatrices()))},t.cameraOnLoad?()=>t.metric&&t.metric<0||t.deleted?(console.log(t.metric),Number.MAX_VALUE):t.loadingStrategy=="IMMEDIATE"?t._calculateDistanceToCamera(t.cameraOnLoad):t.loadingStrategy=="INTERMEDIATE"?t.parentTile?t.parentTile._calculateDistanceToCamera(t.cameraOnLoad)/t.level:t._calculateDistanceToCamera(t.cameraOnLoad)/t.level:t.loadingStrategy=="PERLEVEL"?t.parentTile?t.level+t.parentTile._calculateDistanceToCamera(t.cameraOnLoad):t.level+t._calculateDistanceToCamera(t.cameraOnLoad):void 0:()=>0,()=>t._getSiblings(),t.level,t.loadingStrategy,!t.json.boundingVolume.region,!!t.json.boundingVolume.region,t.geometricError,t.splatsMesh)}catch(f){t.displayErrors&&ka(f)}}else r&&n.includes(".json")&&(t.jsonRequested=n,t.tileLoader.get(t.abortController,t.uuid,n,async f=>{t.deleted||(f.rootPath=Ae.dirname(n),t.json.children.push(f),s==null?delete t.json.content:t.json.contents.splice(s,1),t.hasUnloadedJSONContent--)}))}}dispose(){const e=this;e.meshContent.forEach(a=>{a&&a.asset&&a.asset.copyright&&(a.asset.copyright.split(";").forEach(t=>{V[t]&&V[t]--}),e.displayCopyright&&Ye())}),e.meshContent=[],e.bbox&&e.bbox.dispose(),e.childrenTiles.forEach(a=>a.dispose()),e.deleted=!0,e.splatsMesh&&(e.meshContent.forEach(a=>a.hide()),e.parentTile||e.splatsMesh.dispose()),e.contentURL&&(e.contentURL.forEach(a=>{e.tileLoader.invalidate(a,e.uuid)}),e.contentURL=[]),e.abortController&&e.abortController.abort("tile not needed"),this.parent=null,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 a=e.meshContent.length-1;a>=0;a--){const t=e.meshContent[a];t&&t.asset&&t.asset.copyright&&(t.asset.copyright.split(";").forEach(A=>{V[A]&&V[A]--}),e.displayCopyright&&Ye()),e.remove(t)}e.splatsMesh&&e.meshContent.forEach(a=>a.hide()),e.meshContent=[],e.contentURL.forEach(a=>{e.tileLoader.invalidate(a,e.uuid)}),e.contentURL=[]}}_disposeChildren(){var e=this;e.childrenTiles.forEach(a=>{a.dispose(),e.remove(a)}),e.childrenTiles=[]}raycast(e,a){if(this.splatsMesh){Me.copy(e.ray),Fe.copy(this.matrixWorld).invert(),Me.applyMatrix4(Fe);let t=!1;if(this.boundingVolume instanceof W)t=this.boundingVolume.intersectsRay(Me);else{if(!(this.boundingVolume instanceof Q.Sphere))return!1;t=ray.intersectsSphere(this.boundingVolume)}return t&&this.materialVisibility&&this.splatsReady&&(Se.length=0,this.meshContent.forEach(A=>{A.isSplatsBatch&&(A.raycast(Me,Se,e.params.Points.threshold),Se.forEach(i=>{i.point.applyMatrix4(this.matrixWorld)}),a.push(...Se))})),t}return super.raycast(e,a)}update(e){const a=new Q.Frustum;a.setFromProjectionMatrix(new Q.Matrix4().multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse));let t=[0],A=[0],i=[0],s=[0];return this.refine=="REPLACE"?this.loadingStrategy==="IMMEDIATE"?(this._updateImmediate(e,a),this._statsImmediate(i,t,s,A)):(this._update(e,a),this._stats(i,t,s,A)):(this._update(e,a),this._stats(i,t,s,A)),t>0&&(s[0]/=t[0]),this.splatsMesh&&(We.copy(e.position),Fe.copy(this.matrixWorld).invert(),We.applyMatrix4(Fe),this.splatsMesh.sort(We)),{numTilesLoaded:t[0],numTilesRendered:A[0],maxLOD:i[0],percentageLoaded:s[0]}}_updateImmediate(e,a){this._computeMetricRecursive(e,a),this._updateNodeVisibilityImmediate(),this._expandTreeImmediate(e),this.shouldBeVisible=this.metric>0||!!this.loadOutsideView,this._shouldBeVisibleUpdateImmediate(),this._trimTreeImmediate(),this._loadMeshImmediate()}_statsImmediate(e,a,t,A){e[0]=Math.max(e[0],this.level),(this.shouldBeVisible||this.materialVisibility)&&(a[0]++,this.materialVisibility&&t[0]++),this.materialVisibility&&A[0]++,this.childrenTiles.forEach(i=>{i._statsImmediate(e,a,t,A)})}_stats(e,a,t,A){e[0]=Math.max(e[0],this.level),this.hasMeshContent&&(a[0]++,this.meshContent.length==this.hasMeshContent&&t[0]++,this.materialVisibility&&A[0]++),this.childrenTiles.forEach(i=>{i._stats(e,a,t,A)})}_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 a=this;if(a.hasMeshContent)if(a.shouldBeVisible)a.meshContent.length==a.hasMeshContent?a.materialVisibility?a.childrenTiles.forEach(t=>{t._updateNodeVisibilityImmediate(!0)}):(a._changeContentVisibility(!0),a.childrenTiles.forEach(t=>{t._updateNodeVisibilityImmediate(e)})):a.childrenTiles.forEach(t=>{t._updateNodeVisibilityImmediate(e)});else{if(!a.loadOutsideView&&a.metric<0)return a._changeContentVisibility(!1),a.meshContent.length>0&&a._disposeMeshContent(),void a.childrenTiles.forEach(t=>{t._updateNodeVisibilityImmediate(!0)});if(!a.materialVisibility||a.splatsMesh&&!a.splatsReady)a.childrenTiles.forEach(t=>{t._updateNodeVisibilityImmediate(e)});else if(e)a._changeContentVisibility(!1),a.meshContent.length>0&&a._disposeMeshContent(),a.childrenTiles.forEach(t=>{t._updateNodeVisibilityImmediate(e)});else{let t=!0;a.childrenTiles.every(A=>!!A._isReadyImmediate()||(t=!1,!1)),t&&a.childrenTiles.length>0?(a._changeContentVisibility(!1),a.meshContent.length>0&&a._disposeMeshContent(),a.childrenTiles.forEach(A=>{A._updateNodeVisibilityImmediate(e)})):a.childrenTiles.forEach(A=>{A._updateNodeVisibilityImmediate(!a.splatsMesh||a.splatsReady)})}}else a.childrenTiles.forEach(t=>{t._updateNodeVisibilityImmediate(e)})}_shouldBeVisibleUpdateImmediate(){const e=this;e.hasMeshContent?e.metric==null?e.shouldBeVisible=!1:e.metric<0?(e.shouldBeVisible=!!e.loadOutsideView,e.childrenTiles.forEach(a=>{a._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(a=>{a.shouldBeVisible=!0,a._shouldBeVisibleUpdateImmediate()})):e.shouldBeVisible=!0):e.childrenTiles.forEach(a=>{a._setShouldNotBeVisibleRecursive()}):(e.childrenTiles.forEach(a=>{a.shouldBeVisible=!0,a._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(a=>{a._loadMeshImmediate()})}_computeMetricRecursive(e,a){const t=this;t.metric=-1,t.isSetup&&(t.boundingVolume&&t.geometricError&&(t.metric=t._calculateUpdateMetric(e,a)),t.childrenTiles.forEach(A=>A._computeMetricRecursive(e,a)))}_expandTreeImmediate(e){const a=this;a.hasUnloadedJSONContent||(a.hasMeshContent?a.occlusionCullingService&&a.hasMeshContent&&!a.occlusionCullingService.hasID(a.colorID)||a.metric>=0&&a.metric<a.geometricErrorMultiplier*a.geometricError&&a.json&&a.json.children&&a.childrenTiles.length<a.json.children.length&&a._loadJsonChildren(e):a.json&&a.json.children&&a.childrenTiles.length<a.json.children.length&&a._loadJsonChildren(e)),a.childrenTiles.forEach(t=>t._expandTreeImmediate(e))}_update(e,a){const t=this;if(!t.isSetup)return;const A=t.materialVisibility;t.boundingVolume&&t.geometricError&&(t.metric=t._calculateUpdateMetric(e,a)),t.childrenTiles.forEach(i=>i._update(e,a)),function(i){if(t.hasMeshContent&&!(t.meshContent.length<t.hasMeshContent)){if(i<0)return t.inFrustum=!1,void t._changeContentVisibility(!!t.loadOutsideView);if(t.inFrustum=!0,t.childrenTiles.length==0)return void t._changeContentVisibility(!0);if(i>=t.geometricErrorMultiplier*t.geometricError)t._changeContentVisibility(!0);else if(i<t.geometricErrorMultiplier*t.geometricError&&t.refine=="REPLACE"){let s=!0;t.childrenTiles.every(r=>!!r._isReady()||(s=!1,!1)),s?t._changeContentVisibility(!1):t._changeContentVisibility(!0)}}}(t.metric),function(i){i<0&&t.hasMeshContent||t.occlusionCullingService&&t.hasMeshContent&&!t.occlusionCullingService.hasID(t.colorID)||(!t.hasMeshContent||i<=t.geometricErrorMultiplier*t.geometricError&&t.meshContent.length>0)&&t.json&&t.json.children&&t.childrenTiles.length!=t.json.children.length&&t._loadJsonChildren(e)}(t.metric),function(i,s){if(t.hasMeshContent){if(!t.inFrustum)return void t._disposeChildren();if(t.occlusionCullingService&&!s&&t.hasMeshContent&&t.meshContent.length>0&&t.materialVisibility&&t._areAllChildrenLoadedAndHidden())return t.splatsMesh&&this.materialVisibility&&!t.splatsReady?void 0:void t._disposeChildren();if(i>=t.geometricErrorMultiplier*t.geometricError){if(t.splatsMesh&&t.materialVisibility&&!t.splatsReady)return;t._disposeChildren()}}}(t.metric,A)}_loadJsonChildren(e){const a=this;for(let t=a.json.children.length-1;t>=0;t--)a.json.children[t].root||a.json.children[t].children||a.json.children[t].getChildren||a.json.children[t].content||a.json.children[t].contents||a.json.children.splice(t,1);a.json.children.forEach(t=>{let A=new ia({parentTile:a,queryParams:a.queryParams,parentGeometricError:a.geometricError,parentBoundingVolume:a.boundingVolume,parentRefine:a.refine,json:t,rootPath:a.rootPath,geometricErrorMultiplier:a.geometricErrorMultiplier,loadOutsideView:a.loadOutsideView,level:Math.floor(a.level)+1,tileLoader:a.tileLoader,cameraOnLoad:e,occlusionCullingService:a.occlusionCullingService,renderer:a.renderer,static:a.static,centerModel:!1,displayErrors:a.displayErrors,displayCopyright:a.displayCopyright,distanceBias:a.distanceBias,loadingStrategy:a.loadingStrategy,drawBoundingVolume:a.drawBoundingVolume,splatsMesh:a.splatsMesh});a.childrenTiles.push(A),a.add(A)}),a.updateMatrices(!0)}_areAllChildrenLoadedAndHidden(){let e=!0;const a=this;return this.childrenTiles.every(t=>{if(t.hasMeshContent){if(t.childrenTiles.length>0)return e=!1,!1;if(!t.metric<0)return!0;if(t.materialVisibility&&(!a.splatsMesh||a.splatsReady)||a.occlusionCullingService.hasID(t.colorID))return e=!1,!1}else if(!t._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||self.splatsMesh&&!self.splatsReady){if(this.children.length>0){var e=!0;return this.childrenTiles.every(a=>!!a._isReady()||(e=!1,!1)),e}return!1}return!this.hasMeshContent||!(this.meshContent.length<this.hasMeshContent)&&!(!this.materialVisibility||this.splatsMesh&&!this.splatsReady)}_isReadyImmediate(){if(this.materialVisibility||!this.loadOutsideView&&this.metric<0)return!0;if(this.childrenTiles.length>0){var e=!0;return this.childrenTiles.every(a=>!!a._isReadyImmediate()||(e=!1,!1)),e}return!1}_changeContentVisibility(e){const a=this;if(a.bbox&&(a.bbox.material.visible=e),a.splatsMesh)e!=a.materialVisibility&&(a.meshContent.forEach(t=>{e&&t.isSplatsBatch?(a.splatsReady=!0,t.show(()=>{a.materialVisibility&&(a.splatsReady=!0)})):t.hide()}),a.materialVisibility=e);else{if(a.hasMeshContent&&a.meshContent.length>0&&(e?a.meshContent.forEach(t=>{t.traverse(A=>{(A.isMesh||A.isPoints)&&A.layers.enable(0)})}):a.meshContent.forEach(t=>{t.traverse(A=>{(A.isMesh||A.isPoints)&&A.layers.disable(0)})})),a.materialVisibility==e)return;a.materialVisibility=e}}_calculateUpdateMetric(e,a){let t=0;if(this.boundingVolume instanceof W){if(re.copy(this.boundingVolume),re.applyMatrix4(this.matrixWorld),!re.inFrustum(a))return-1;t=Math.max(0,re.distanceToPoint(e.position)-e.near)}else{if(!(this.boundingVolume instanceof Q.Sphere))return console.error("unsupported shape"),-1;if(X.copy(this.boundingVolume),X.applyMatrix4(this.matrixWorld),!a.intersectsSphere(X))return-1;t=Math.max(0,e.position.distanceTo(X.center)-X.radius-e.near)}if(t=Math.pow(t,this.distanceBias),t==0)return 0;const A=this.matrixWorld.getMaxScaleOnAxis();this.renderer&&this.renderer.getDrawingBufferSize(this.rendererSize);let i=this.rendererSize.y,s=e.fov;e.aspect<1&&(s*=e.aspect,i=this.rendererSize.x);let r=2*Math.tan(.5*s*.017453292519943295)*t;return 16*window.devicePixelRatio*r/(i*A)}_getSiblings(){const e=this,a=[];if(!e.parentTile)return a;let t=e.parentTile;for(;!t.hasMeshContent&&t.parentTile;)t=t.parentTile;return t.childrenTiles.forEach(A=>{if(A&&A!=e){for(;!A.hasMeshContent&&A.childrenTiles[0];)A=A.childrenTiles[0];a.push(A)}}),a}_calculateDistanceToCamera(e){return this.boundingVolume instanceof W?(re.copy(this.boundingVolume),re.applyMatrix4(this.matrixWorld),Math.max(0,re.distanceToPoint(e.position))):this.boundingVolume instanceof Q.Sphere?(X.copy(this.boundingVolume),X.applyMatrix4(this.matrixWorld),Math.max(0,e.position.distanceTo(X.center)-X.radius)):(console.error("unsupported shape"),-1)}setGeometricErrorMultiplier(e){this.geometricErrorMultiplier=e,this.splatsReady=!0,this.childrenTiles.forEach(a=>a.setGeometricErrorMultiplier(e))}setDistanceBias(e){this.distanceBias=e,this.childrenTiles.forEach(a=>a.setDistanceBias(e))}_transformWGS84ToCartesian(e,a,t,A){const i=6378137/Math.sqrt(1-.006694384442042*Math.pow(Math.sin(a),2)),s=Math.cos(a),r=Math.cos(e),c=Math.sin(a),n=i+t,b=n*s*r,l=n*s*Math.sin(e),f=(.993305615557957*i+t)*c;A.set(b,l,f)}}function ka(o){var e=document.createElement("div");e.textContent=o,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 Ye(){z||((z=document.createElement("div")).style.position="fixed",z.style.bottom="20px",z.style.left="20px",z.style.color="white",z.style.textShadow="2px 2px 0 #000, -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000",z.style.padding="10px",z.style.backgroundColor="rgba(0, 0, 0, 0.1)",document.body.appendChild(z));const o=At();let e="";o.forEach(a=>{e+=a+", "}),e=e.slice(0,-2),z.textContent=e}const G=new Q.Sphere(new Q.Vector3(0,0,0),1),te=new Q.Vector3(0,0,0),Xe=new Q.Vector3(0,0,0),oA=new Q.Vector3(0,1,0),Ze=new Q.Vector2,Da=new Q.Quaternion,ja=new Q.Matrix4;class sa extends Q.Object3D{constructor(e){super();const a=this;if(e.queryParams&&(this.queryParams={...e.queryParams}),this.uuid=Ra(),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),a.setup(e);else if(e.url){this.loadJson=(i,s)=>{const r=Ae.dirname(s);a.setup({rootPath:r,json:i,onLoadCallback:e.onLoadCallback})};var t=e.url;if(a.queryParams){var A="";for(let i in a.queryParams)a.queryParams.hasOwnProperty(i)&&(A+="&"+i+"="+a.queryParams[i]);t.includes("?")?t+=A:t+="?"+A.substring(1)}a.tileLoader.get(a.abortController,t,a.uuid,a)}}async setup(e){const a=this;e.json.root?(a.json=e.json.root,!a.json.children&&a.json.getChildren&&(a.json.children=await a.json.getChildren()),a.jsonChildren=a.json.children,a.json.refinement||(a.json.refinement=e.json.refinement),a.json.geometricError||(a.json.geometricError=e.json.geometricError),a.json.transform||(a.json.transform=e.json.transform),a.json.boundingVolume||(a.json.boundingVolume=e.json.boundingVolume)):(a.json=e.json,!a.json.children&&a.json.getChildren&&(a.json.children=await a.json.getChildren(),a.jsonChildren=a.json.children)),a.rootPath=e.json.rootPath?e.json.rootPath:e.rootPath,a.json.refinement?a.refinement=a.json.refinement:a.refinement=e.parentRefinement,a.json.geometricError?a.geometricError=a.json.geometricError:a.geometricError=e.parentGeometricError;let t=new Q.Matrix4;if(a.json.transform&&!a.centerModel&&(t.elements=a.json.transform),a.applyMatrix4(t),a.parentTile&&a.parentTile.matrix&&(a.matrix.premultiply(a.parentTile.matrix),a.matrix.decompose(a.position,a.quaternion,a.scale)),a.matrixWorldNeedsUpdate=!0,a.updateWorldMatrix(!0,!0),a.json.boundingVolume)if(a.json.boundingVolume.box)a.boundingVolume=new W(a.json.boundingVolume.box);else if(a.json.boundingVolume.region){const i=a.json.boundingVolume.region;a.transformWGS84ToCartesian(i[0],i[1],i[4],te),a.transformWGS84ToCartesian(i[2],i[3],i[5],Xe),te.lerp(Xe,.5),a.boundingVolume=new Q.Sphere(new Q.Vector3(te.x,te.y,te.z),te.distanceTo(Xe))}else if(a.json.boundingVolume.sphere){const i=a.json.boundingVolume.sphere;a.boundingVolume=new Q.Sphere(new Q.Vector3(i[0],i[1],i[2]),i[3])}else a.boundingVolume=e.parentBoundingVolume;else a.boundingVolume=e.parentBoundingVolume;function A(i){i.uri&&i.uri.includes("json")||i.url&&i.url.includes("json")?a.hasUnloadedJSONContent++:a.hasMeshContent++}if(a.json.content?(A(a.json.content),a.load()):a.json.contents&&(a.json.contents.forEach(i=>A(i)),a.load()),a.centerModel){const i=new Q.Sphere;a.boundingVolume instanceof W?i.copy(a.boundingVolume.sphere):a.boundingVolume instanceof Q.Sphere&&i.copy(a.boundingVolume),this.json.boundingVolume.region&&(a.transformWGS84ToCartesian(.5*(a.json.boundingVolume.region[0]+a.json.boundingVolume.region[2]),.5*(a.json.boundingVolume.region[1]+a.json.boundingVolume.region[3]),.5*(a.json.boundingVolume.region[4]+a.json.boundingVolume.region[5]),te),Da.setFromUnitVectors(te.normalize(),oA.normalize()),a.master.applyQuaternion(Da),a.master.updateWorldMatrix(!1,!1)),ja.makeTranslation(-i.center.x*a.scale.x,-i.center.y*a.scale.y,-i.center.z*a.scale.z),a.master.matrix.multiply(ja),a.master.matrix.decompose(a.master.position,a.master.quaternion,a.master.scale)}a.isSetup=!0,e.onLoadCallback&&e.onLoadCallback(a)}isAbsolutePathOrURL(e){const a=/^(?:http|https|ftp|tcp|udp):\/\/\S+/.test(e),t=e.startsWith("/")&&!e.startsWith("//");return a||t}assembleURL(e,a){e.endsWith("/")||(e+="/");const t=new URL(e);let A=t.pathname.split("/").filter(s=>s!==""),i=a.split("/").filter(s=>s!=="");for(let s=1;s<=A.length&&!(s>=i.length);s++)if(A.slice(A.length-s,A.length).join("/")===i.slice(0,s).join("/")){for(let r=0;r<s;r++)A.pop();break}for(;i.length>0&&i[0]==="..";)A.pop(),i.shift();return`${t.protocol}//${t.host}/${[...A,...i].join("/")}`}extractQueryParams(e,a){const t=new URL(e);for(let[A,i]of t.searchParams)a[A]=i;return t.search="",t.toString()}load(){var e=this;function a(t){let A;t.uri?A=t.uri:t.url&&(A=t.url);const i=/^(?:http|https|ftp|tcp|udp):\/\/\S+/;if(i.test(e.rootPath)?i.test(A)||(A=e.assembleURL(e.rootPath,A)):Ae.isAbsolute(e.rootPath)&&(A=e.rootPath+Ae.sep+A),A=e.extractQueryParams(A,e.queryParams),e.queryParams){var s="";for(let r in e.queryParams)e.queryParams.hasOwnProperty(r)&&(s+="&"+r+"="+e.queryParams[r]);A.includes("?")?A+=s:A+="?"+s.substring(1)}A&&(A.includes(".b3dm")||A.includes(".glb")||A.includes(".gltf")?(e.contentURL=A,e.tileLoader.get(e.abortController,A,e.uuid,e,e.cameraOnLoad?()=>e.calculateDistanceToCamera(e.cameraOnLoad):()=>0,()=>e.getSiblings(),e.level,!e.json.boundingVolume.region,!!e.json.boundingVolume.region,e.geometricError)):A.includes(".json")&&e.tileLoader.get(e.abortController,A,e.uuid,e))}e.deleted||(e.json.content?a(e.json.content):e.json.contents&&e.json.contents.forEach(t=>a(t)))}loadMesh(e){this.deleted||this.meshContent.add(e)}loadJson(e,a){this.deleted||(this.json.children&&(this.jsonChildren=this.json.children),e.rootPath=Ae.dirname(a),this.jsonChildren.push(e),this.hasUnloadedJSONContent--)}dispose(){const e=this;e.childrenTiles.forEach(a=>a.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,a){const t=this;function A(i){if(t.hasMeshContent&&!(t.meshContent.size<t.hasMeshContent)){if(i<0)return t.inFrustum=!1,void t.changeContentVisibility(!!t.loadOutsideView);if(t.inFrustum=!0,t.childrenTiles.length!=0){if(i>=t.master.geometricErrorMultiplier*t.geometricError)t.changeContentVisibility(!0);else if(i<t.master.geometricErrorMultiplier*t.geometricError){let s=!0;t.childrenTiles.every(r=>!!r.isReady()||(s=!1,!1)),s&&t.changeContentVisibility(!1)}}else t.changeContentVisibility(!0)}}t.isSetup&&(t.materialVisibility,t.boundingVolume&&t.geometricError&&(t.metric=t.calculateUpdateMetric(e,a)),t.childrenTiles.forEach(i=>i._update(e,a)),A(t.metric),function(i){i<0&&t.hasMeshContent||(!t.hasMeshContent&&t.rootPath||i<t.master.geometricErrorMultiplier*t.geometricError&&t.meshContent.size>0)&&t.json&&t.jsonChildren&&t.childrenTiles.length!=t.jsonChildren.length&&t.jsonChildren.forEach(s=>{if(!(s.root||s.children||s.getChildren||s.content||s.contents))return;let r=new sa({parentTile:t,queryParams:t.queryParams,parentGeometricError:t.geometricError,parentBoundingVolume:t.boundingVolume,parentRefinement:t.refinement,json:s,rootPath:t.rootPath,loadOutsideView:t.loadOutsideView,level:t.level+1,tileLoader:t.tileLoader,cameraOnLoad:e,master:t.master,centerModel:!1});t.childrenTiles.push(r)})}(t.metric),function(i){if(t.hasMeshContent){if(!t.inFrustum)return t.disposeChildren(),void A(i);i>=t.master.geometricErrorMultiplier*t.geometricError&&(t.disposeChildren(),A(i))}}(t.metric))}areAllChildrenLoadedAndHidden(){let e=!0;return this.childrenTiles.every(a=>{if(a.hasMeshContent){if(a.childrenTiles.length>0)return e=!1,!1;if(!a.inFrustum)return!0;if(!a.materialVisibility||a.meshesToDisplay!=a.meshesDisplayed)return e=!1,!1}else if(!a.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(a=>!!a.isReady()||(e=!1,!1)),e}return!1}return!this.hasMeshContent||!(this.meshContent.size<this.hasMeshContent)&&!!this.materialVisibility}changeContentVisibility(e){this.materialVisibility=e}calculateUpdateMetric(e,a){if(this.boundingVolume instanceof W){if(G.copy(this.boundingVolume.sphere),G.applyMatrix4(this.matrixWorld),!a.intersectsSphere(G))return-1}else{if(!(this.boundingVolume instanceof Q.Sphere))return console.error("unsupported shape"),-1;if(G.copy(this.boundingVolume),G.applyMatrix4(this.matrixWorld),!a.intersectsSphere(G))return-1}let t=Math.max(0,e.position.distanceTo(G.center)-G.radius);if(t=Math.pow(t,this.distanceBias),t==0)return 0;const A=this.matrixWorld.getMaxScaleOnAxis();this.master._renderSize(Ze);let i=Ze.y,s=e.fov;e.aspect<1&&(s*=e.aspect,i=Ze.x);let r=2*Math.tan(.5*s*.017453292519943295)*t;return 16*window.devicePixelRatio*r/(i*A)}getSiblings(){const e=this,a=[];if(!e.parentTile)return a;let t=e.parentTile;for(;!t.hasMeshContent&&t.parentTile;)t=t.parentTile;return t.childrenTiles.forEach(A=>{if(A&&A!=e){for(;!A.hasMeshContent&&A.childrenTiles[0];)A=A.childrenTiles[0];a.push(A)}}),a}calculateDistanceToCamera(e){return this.boundingVolume instanceof W?(G.copy(this.boundingVolume.sphere),G.applyMatrix4(this.matrixWorld)):this.boundingVolume instanceof Q.Sphere?(G.copy(this.boundingVolume),G.applyMatrix4(this.matrixWorld)):console.error("unsupported shape"),Math.max(0,e.position.distanceTo(G.center)-G.radius)}getWorldMatrix(){return this.matrixWorld}transformWGS84ToCartesian(e,a,t,A){const i=6378137/Math.sqrt(1-.006694384442042*Math.pow(Math.sin(a),2)),s=Math.cos(a),r=Math.cos(e),c=Math.sin(a),n=i+t,b=n*s*r,l=n*s*Math.sin(e),f=(.993305615557957*i+t)*c;A.set(b,l,f)}}class nA extends Q.Object3D{constructor(e){super(),e.master=this,e.domWidth&&e.domHeight?this.rendererSize=new Q.Vector2(e.domWidth,e.domHeight):this.rendererSize=new Q.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 sa(e),e.static&&(this.matrixAutoUpdate=!1),this.tileLoader=e.tileLoader}_renderSize(e){this.renderer?this.renderer.getDrawingBufferSize(e):e.copy(this.rendererSize)}setCanvasSize(e,a){this.rendererSize.set(e,a)}update(e,a){if(a)this.tileset._update(e,a);else{const t=new Q.Frustum;t.setFromProjectionMatrix(new Q.Matrix4().multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse)),this.tileset._update(e,t)}}setGeometricErrorMultiplier(e){this.geometricErrorMultiplier=e||1}}class cA{constructor(e){const a=this;a.scene=e,a.instancedTiles=[],a.instancedMesh,a.reuseableMatrix=new Q.Matrix4}addInstance(e){const a=this;e.added=!0,e.listOMesh=a.instancedTiles,a.instancedTiles.push(e),a.instancedMesh&&e.loadMesh(a.instancedMesh)}addToScene(){const e=this;e.instancedMesh.setMatrixAt(0,new Q.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 a=this;a.instancedMesh=e,a.instancedMesh.matrixAutoUpdate=!1,a.instancedMesh.matrixWorldAutoUpdate=!1,a.scene.children.includes(e)||this.addToScene();for(let t=0;t<a.instancedTiles.length;t++)a.instancedTiles[t].loadMesh(a.instancedMesh)}update(){const e=this;for(let a=e.instancedTiles.length-1;a>=0;a--)e.instancedTiles[a].deleted&&e.instancedTiles.splice(a,1);if(e.instancedMesh){e.instancedMesh.count=0,e.instancedMesh.instancedTiles=[];for(let a=0;a<e.instancedTiles.length;a++)e.instancedTiles[a].meshContent.add(e.instancedMesh),e.instancedTiles[a].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[a].matrixWorld),e.reuseableMatrix.multiply(e.instancedMesh.baseMatrix),e.instancedMesh.setMatrixAt(e.instancedMesh.count-1,e.reuseableMatrix),e.instancedMesh.instancedTiles.push(e.instancedTiles[a]));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(a=>{if(a.dispose&&a.dispose(),a.material)if(a.material.length)for(let t=0;t<a.material.length;++t)a.material[t].dispose();else a.material.dispose();a.geometry&&a.geometry.dispose()}),e.instancedMesh.dispose(),!0)}}class dA{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,a){const t=this;t.json=e,t.url=a;for(let A=0;A<t.instancedTiles.length;A++)t.instancedTiles[A].loadJson(t.json,t.url)}getCount(){return this.instancedTiles.length}update(){const e=this;for(let a=e.instancedTiles.length-1;a>=0;a--)e.instancedTiles[a].deleted&&e.instancedTiles.splice(a,1)}dispose(){return!(!this.json||this.instancedTiles.length!=0)}}let oe=0;async function lA(o){return new Promise(e=>{const a=setInterval(()=>{o.hasDracoLoader&&!o.dracoLoader||o.hasKTX2Loader&&!o.ktx2Loader||(clearInterval(a),e())},10)})}exports.InstancedOGC3DTile=nA,exports.InstancedTileLoader=class{constructor(o,e){if(this.zUpToYUpMatrix=new Q.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 Ta,e&&e.dracoLoader)this.gltfLoader.setDRACOLoader(e.dracoLoader),this.hasDracoLoader=!0;else{const a=new Ga;a.setDecoderPath("https://www.gstatic.com/draco/versioned/decoders/1.4.3/"),this.gltfLoader.setDRACOLoader(a),this.gltfLoader.hasDracoLoader=!0}if(e&&e.ktx2Loader)this.gltfLoader.setKTX2Loader(e.ktx2Loader),this.hasKTX2Loader=!0;else if(e&&e.renderer){const a=new U;a.setTranscoderPath("https://storage.googleapis.com/ogc-3d-tiles/basis/").detectSupport(e.renderer),this.gltfLoader.setKTX2Loader(a),this.gltfLoader.hasKTX2Loader=!0}this.gltfLoader.setMeshoptDecoder(Za),this.hasMeshOptDecoder=!0,this.b3dmDecoder=new Sa(this.gltfLoader),this.cache=new Ma,this.scene=o,this.ready=[],this.downloads=[],this.nextReady=[],this.nextDownloads=[]}update(){const o=this;o._checkSize(),o.cache._data.forEach(e=>{e.update()}),oe<8&&o._download(),o._loadBatch()}_download(){const o=this;if(o.nextDownloads.length!=0||(o._getNextDownloads(),o.nextDownloads.length!=0))for(;o.nextDownloads.length>0;){const a=o.nextDownloads.shift();if(a){if(a.path.includes(".b3dm")&&(e=o.proxy?()=>fetch(o.proxy,{method:"POST",body:a.path}):()=>fetch(a.path),oe++,e().then(t=>{if(!t.ok)throw console.error("could not load tile with path : "+a.path),new Error(`couldn't load "${a.path}". Request failed with status ${t.status} : ${t.statusText}`);return t.arrayBuffer()}).then(t=>this.b3dmDecoder.parseB3DMInstanced(t,A=>{o.meshCallback(A,a.geometricError)},o.maxInstances,a.sceneZupToYup,a.meshZupToYup)).then(t=>{t.frustumCulled=!1,a.tile.setObject(t),o.ready.unshift(a)}).catch(t=>console.error(t)).finally(()=>{oe--})),a.path.includes(".glb")||a.path.includes(".gltf"))e=o.proxy?()=>fetch(o.proxy,{method:"POST",body:a.path}):()=>fetch(a.path),oe++,e().then(t=>{if(!t.ok)throw new Error("missing content");return t.arrayBuffer()}).then(async t=>{await lA(this.gltfLoader),this.gltfLoader.parse(t,null,A=>{let i;A.scene.asset=A.asset,a.sceneZupToYup&&A.scene.applyMatrix4(this.zUpToYUpMatrix),A.scene.traverse(s=>{s.geometricError=a.geometricError,s.isMesh&&(a.meshZupToYup&&s.applyMatrix4(this.zUpToYUpMatrix),o.meshCallback&&o.meshCallback(s,s.geometricError)),s.isPoints&&console.error("instanced point cloud is not supported")}),A.scene.updateWorldMatrix(!1,!0),A.scene.traverse(s=>{s.isMesh&&(i=new Q.InstancedMesh(s.geometry,s.material,o.maxInstances),i.baseMatrix=s.matrixWorld)}),o.ready.unshift(a),i?(i.frustumCulled=!1,a.tile.setObject(i)):A.scene.traverse(s=>{s.dispose&&s.dispose(),s.material&&s.material.dispose()})})},t=>{console.error("could not load tile : "+a.path)}).finally(()=>{oe--});else if(a.path.includes(".json")){var e;e=o.proxy?()=>fetch(o.proxy,{method:"POST",body:a.path}):()=>fetch(a.path),oe++,e().then(t=>{if(!t.ok)throw console.error("could not load tile with path : "+a.path),new Error(`couldn't load "${a.path}". Request failed with status ${t.status} : ${t.statusText}`);return t.json()}).then(t=>Aa(t,a.path)).then(t=>{a.tile.setObject(t,a.path),o.ready.unshift(a)}).catch(t=>console.error(t)).finally(()=>{oe--})}}}}_loadBatch(){return this.nextReady.length==0&&(this._getNextReady(),this.nextReady.length==0)?0:this.nextReady.shift()?1:0}_getNextReady(){let o=Number.MAX_VALUE,e=-1;for(let a=this.ready.length-1;a>=0;a--)this.ready[a].distanceFunction||this.nextReady.push(this.ready.splice(a,1)[0]);if(!(this.nextReady.length>0)){for(let a=this.ready.length-1;a>=0;a--){const t=this.ready[a].distanceFunction()*this.ready[a].level;t<o&&(o=t,e=a)}if(e>=0){const a=this.ready.splice(e,1).pop();this.nextReady.push(a);const t=a.getSiblings();for(let A=this.ready.length-1;A>=0;A--)t.includes(this.ready[A].uuid)&&this.nextready.push(this.ready.splice(A,1).pop())}}}get(o,e,a,t,A,i,s,r,c,n){const b=this,l=function(h){for(var g=h.split("/"),u=[],p=0,B=0;B<g.length;B++){var I=g[B];I!=="."&&I!==""&&I!==".."?u[p++]=I:I===".."&&p>0&&p--}if(p===0)return"/";var m="";for(B=0;B<p;B++)m+="/"+u[B];return m}(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 f=b.cache.get(l);if(f)f.addInstance(t);else if(e.includes(".b3dm")||e.includes(".glb")||e.includes(".gltf")){const h=new cA(b.scene);h.addInstance(t),b.cache.put(l,h);const g=new AbortController;o.signal.addEventListener("abort",()=>{h.getCount()==0&&g.abort()}),this.downloads.push({abortController:g,tile:h,key:l,path:e,distanceFunction:A,getSiblings:i,level:s,uuid:a,sceneZupToYup:r,meshZupToYup:c,geometricError:n,shouldDoDownload:()=>!0})}else if(e.includes(".json")){const h=new dA;h.addInstance(t),b.cache.put(l,h);const g=new AbortController;o.signal.addEventListener("abort",()=>{h.getCount()==0&&g.abort()}),this.downloads.push({abortController:g,tile:h,key:l,path:e,distanceFunction:A,getSiblings:i,level:s,shouldDoDownload:()=>!0})}}_getNextDownloads(){let o=Number.MAX_VALUE,e=-1;for(let a=this.downloads.length-1;a>=0;a--){const t=this.downloads[a];t.shouldDoDownload()?t.distanceFunction||this.nextDownloads.push(this.downloads.splice(a,1)[0]):this.downloads.splice(a,1)}if(!(this.nextDownloads.length>0)){for(let a=this.downloads.length-1;a>=0;a--){const t=this.downloads[a],A=t.distanceFunction()*t.level;A<o&&(o=A,e=a)}if(e>=0){const a=this.downloads.splice(e,1).pop();this.nextDownloads.push(a);const t=a.getSiblings();for(let A=this.downloads.length-1;A>=0;A--)t.includes(this.downloads[A].uuid)&&this.nextDownloads.push(this.downloads.splice(A,1).pop())}}}_checkSize(){const o=this;let e=0;for(;o.cache.size()>o.maxCachedItems&&e<o.cache.size();){e++;const a=o.cache.head();o.cache.remove(a.key),a.value.dispose()||o.cache.put(a.key,a.value)}}},exports.OGC3DTile=ia,exports.OcclusionCullingService=class{constructor(){this.cullMap=[],this.cullMaterial=new Q.MeshBasicMaterial({vertexColors:!0}),this.cullMaterial.side=Q.FrontSide,this.cullTarget=this._createCullTarget(),this.cullPixels=new Uint8Array(4*this.cullTarget.width*this.cullTarget.height)}setSide(o){this.cullMaterial.side=o}_createCullTarget(){const o=new Q.WebGLRenderTarget(Math.floor(.05*window.innerWidth),Math.floor(.05*window.innerHeight));return o.texture.format=Q.RGBAFormat,o.texture.colorSpace=Q.LinearSRGBColorSpace,o.texture.minFilter=Q.NearestFilter,o.texture.magFilter=Q.NearestFilter,o.texture.generateMipmaps=!1,o.stencilBuffer=!1,o.depthBuffer=!0,o.depthTexture=new Q.DepthTexture,o.depthTexture.format=Q.DepthFormat,o.depthTexture.type=Q.UnsignedShortType,o}update(o,e,a){let t=e.getRenderTarget(),A=o.overrideMaterial;o.overrideMaterial=this.cullMaterial,e.setRenderTarget(this.cullTarget),e.render(o,a),o.overrideMaterial=A,e.setRenderTarget(t),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 s=Q.MathUtils.clamp(this.cullPixels[i],0,255)<<16^Q.MathUtils.clamp(this.cullPixels[i+1],0,255)<<8^Q.MathUtils.clamp(this.cullPixels[i+2],0,255);this.cullMap[s]=!0}}hasID(o){return this.cullMap[o]}},exports.TileLoader=$a,exports.getOGC3DTilesCopyrightInfo=At,exports.splatsFragmentShader=tt,exports.splatsVertexShader=at;
|
|
222
|
+
}`}var z;const X=new Q.Sphere(new Q.Vector3(0,0,0),1),re=new W([0,0,0,1,0,0,0,1,0,0,0,1]);new Q.Box3;const ae=new Q.Vector3(0,0,0),he=new Q.Vector3(0,0,0),rA=new Q.Vector3(0,1,0),Me=new Q.Ray,Fe=new Q.Matrix4;new Q.Matrix4,new Q.Frustum;const We=new Q.Vector3,Se=[],xa=new Q.Quaternion,V={};function At(){var o=[];for(let e in V)V.hasOwnProperty(e)&&V[e]>0&&o.push(e);return o}class ia extends Q.Object3D{constructor(e){super();const a=this;if(a.splatsMesh=e.splatsMesh,this.contentURL=[],e.domWidth&&e.domHeight?this.rendererSize=new Q.Vector2(e.domWidth,e.domHeight):this.rendererSize=new Q.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=Ra(),e.tileLoader)this.tileLoader=e.tileLoader;else{const i={};i.meshCallback=e.meshCallback?e.meshCallback:(s,r)=>{s.material.wireframe=!1,s.material.side=Q.DoubleSide},i.pointsCallback=e.pointsCallback?e.pointsCallback:(s,r)=>{s.material.size=Math.pow(r,.33),s.material.sizeAttenuation=!0},i.proxy=this.proxy,i.renderer=e.renderer,i.dracoLoader=e.dracoLoader,i.ktx2Loader=e.ktx2Loader,this.tileLoader=new $a(i),this.update=s=>{this.update(s),this.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 Q.Color,this.color.setHex(16777215*Math.random()),this.colorID=Q.MathUtils.clamp(255*a.color.r,0,255)<<16^Q.MathUtils.clamp(255*a.color.g,0,255)<<8^Q.MathUtils.clamp(255*a.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)a._setup(e);else if(e.url){var t=e.url;if(a.queryParams){var A="";for(let i in a.queryParams)a.queryParams.hasOwnProperty(i)&&(A+="&"+i+"="+a.queryParams[i]);t.includes("?")?t+=A:t+="?"+A.substring(1)}(a.proxy?()=>fetch(a.proxy,{method:"POST",body:t,signal:a.abortController.signal}):()=>fetch(t,{signal:a.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(s=>Aa(s,t)).then(s=>{a._setup({rootPath:Ae.dirname(e.url),json:s})})}).catch(i=>{a.displayErrors&&ka(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)}updateMatrices(){this.updateMatrix(),this.static&&this.traverse(e=>{e.isObject3D&&(e.matrixWorldAutoUpdate=!0)}),this.updateMatrixWorld(!0),this.static&&this.traverse(e=>{e.isObject3D&&(e.matrixWorldAutoUpdate=!1)})}setCanvasSize(e,a){this.rendererSize.set(e,a)}async _setup(e){const a=this;if(e.json.extensionsRequired&&e.json.extensionsRequired.includes("JDULTRA_gaussian_splats")&&(a.splatsMesh=new sA(a.tileLoader.renderer),this.splatsMesh.setSplatsCropRadius(this.splatsCropRadius),this.splatsMesh.setSplatsSizeMultiplier(this.splatsSizeMultiplier),a.add(a.splatsMesh)),e.json.root?(a.json=e.json.root,a.json.refine||(a.json.refine=e.json.refine),a.json.geometricError||(a.json.geometricError=e.json.geometricError),a.json.transform||(a.json.transform=e.json.transform),a.json.boundingVolume||(a.json.boundingVolume=e.json.boundingVolume)):a.json=e.json,a.json.children||(a.json.getChildren?a.json.children=await a.json.getChildren():a.json.children=[]),a.rootPath=e.json.rootPath?e.json.rootPath:e.rootPath,a.json.refine?a.refine=a.json.refine:a.refine=e.parentRefine,a.json.geometricError?a.geometricError=a.json.geometricError:a.geometricError=e.parentGeometricError,a.json.transform){let A=new Q.Matrix4;A.elements=a.json.transform,a.applyMatrix4(A)}if(a.json.boundingVolume)if(a.json.boundingVolume.box)a.boundingVolume=new W(a.json.boundingVolume.box);else if(a.json.boundingVolume.region){const A=a.json.boundingVolume.region;a._transformWGS84ToCartesian(A[0],A[1],A[4],ae),a._transformWGS84ToCartesian(A[2],A[3],A[5],he),ae.lerp(he,.5),a.boundingVolume=new Q.Sphere(new Q.Vector3(ae.x,ae.y,ae.z),ae.distanceTo(he))}else if(a.json.boundingVolume.sphere){const A=a.json.boundingVolume.sphere;a.boundingVolume=new Q.Sphere(new Q.Vector3(A[0],A[1],A[2]),A[3])}else a.boundingVolume=e.parentBoundingVolume;else a.boundingVolume=e.parentBoundingVolume;function t(A){A.uri&&A.uri.includes("json")||A.url&&A.url.includes("json")?a.hasUnloadedJSONContent++:a.hasMeshContent++}if(a.json.content?(t(a.json.content),a.hasMeshContent==0&&(a.level=Math.max(0,a.parentTile?a.parentTile.level+.01:0)),a.loadingStrategy==="IMMEDIATE"?a._load(!0,!1):a._load()):a.json.contents&&(a.json.contents.forEach(A=>t(A)),a.hasMeshContent==0&&(a.level=Math.max(0,a.parentTile?a.parentTile.level+.01:0)),a.loadingStrategy==="IMMEDIATE"?a._load(!0,!1):a._load()),a.centerModel&&(he.copy(a.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]),ae),xa.setFromUnitVectors(ae.normalize(),rA.normalize()),a.applyQuaternion(xa)),he.applyMatrix4(a.matrix),a.position.sub(he),a.updateMatrices()),a.onLoadCallback&&a.onLoadCallback(a),a.isSetup=!0,a.level>0&&a.drawBoundingVolume)if(a.bbox&&console.log("double setup"),this.boundingVolume.aabb){let A=this.boundingVolume.aabb.clone();A.applyMatrix4(this.matrixWorld),a.bbox=new Q.Box3Helper(A,new Q.Color(Math.random(),Math.random(),Math.random())),a.add(a.bbox),a.bbox.material.visible=!1}else a.boundingVolume instanceof W&&(a.bbox=a.boundingVolume.helper(),a.add(a.bbox),a.bbox.material.visible=!1)}_assembleURL(e,a){e.endsWith("/")||(e+="/");const t=new URL(e);let A=t.pathname.split("/").filter(s=>s!==""),i=a.split("/").filter(s=>s!=="");for(let s=1;s<=A.length&&!(s>=i.length);s++)if(A.slice(A.length-s,A.length).join("/")===i.slice(0,s).join("/")){for(let r=0;r<s;r++)A.pop();break}for(;i.length>0&&i[0]==="..";)A.pop(),i.shift();return`${t.protocol}//${t.host}/${[...A,...i].join("/")}`}_extractQueryParams(e,a){const t=new URL(e);for(let[A,i]of t.searchParams)a[A]=i;return t.search="",t.toString()}async _load(e=!0,a=!0){var t=this;if(!t.deleted){if(t.json.content)await A(t.json.content,null,e,a);else if(t.json.contents){let i=t.json.contents.map((s,r)=>A(s,r,e,a));Promise.all(i)}}async function A(i,s,r,c){let n;i.uri?n=i.uri:i.url&&(n=i.url);const b=/^(?:http|https|ftp|tcp|udp):\/\/\S+/;if(b.test(t.rootPath)?b.test(n)||(n=t._assembleURL(t.rootPath,n)):Ae.isAbsolute(t.rootPath)&&(n=t.rootPath+Ae.sep+n),n=t._extractQueryParams(n,t.queryParams),t.queryParams){var l="";for(let f in t.queryParams)t.queryParams.hasOwnProperty(f)&&(l+="&"+f+"="+t.queryParams[f]);n.includes("?")?n+=l:n+="?"+l.substring(1)}if(n)if(c&&(n.includes(".b3dm")||n.includes(".glb")||n.includes(".gltf"))){t.contentURL.push(n);try{t.tileLoader.get(t.abortController,t.uuid,n,f=>{t.deleted||(f.asset&&f.asset.copyright&&(f.asset.copyright.split(";").forEach(h=>{V[h]?V[h]++:V[h]=1}),t.displayCopyright&&Ye()),t.meshContent.push(f),t.splatsMesh||(f.traverse(h=>{if((h.isMesh||h.isPoints)&&h.layers.disable(0),h.isMesh&&t.occlusionCullingService){const g=h.geometry.attributes.position,u=[];for(let p=0;p<g.count;p++)u.push(t.color.r,t.color.g,t.color.b);h.geometry.setAttribute("color",new Q.Float32BufferAttribute(u,3))}}),t.add(f),t.updateMatrices()))},t.cameraOnLoad?()=>t.metric&&t.metric<0||t.deleted?Number.MAX_VALUE:t.loadingStrategy=="IMMEDIATE"?t._calculateDistanceToCamera(t.cameraOnLoad):t.loadingStrategy=="INTERMEDIATE"?t.parentTile?t.parentTile._calculateDistanceToCamera(t.cameraOnLoad)/t.level:t._calculateDistanceToCamera(t.cameraOnLoad)/t.level:t.loadingStrategy=="PERLEVEL"?t.parentTile?t.level+t.parentTile._calculateDistanceToCamera(t.cameraOnLoad):t.level+t._calculateDistanceToCamera(t.cameraOnLoad):void 0:()=>0,()=>t._getSiblings(),t.level,t.loadingStrategy,!t.json.boundingVolume.region,!!t.json.boundingVolume.region,t.geometricError,t.splatsMesh)}catch(f){t.displayErrors&&ka(f)}}else r&&n.includes(".json")&&(t.jsonRequested=n,t.tileLoader.get(t.abortController,t.uuid,n,async f=>{t.deleted||(f.rootPath=Ae.dirname(n),t.json.children.push(f),s==null?delete t.json.content:t.json.contents.splice(s,1),t.hasUnloadedJSONContent--)}))}}dispose(){const e=this;e.meshContent.forEach(a=>{a&&a.asset&&a.asset.copyright&&(a.asset.copyright.split(";").forEach(t=>{V[t]&&V[t]--}),e.displayCopyright&&Ye())}),e.meshContent=[],e.bbox&&e.bbox.dispose(),e.childrenTiles.forEach(a=>a.dispose()),e.deleted=!0,e.splatsMesh&&(e.meshContent.forEach(a=>a.hide()),e.parentTile||e.splatsMesh.dispose()),e.contentURL&&(e.contentURL.forEach(a=>{e.tileLoader.invalidate(a,e.uuid)}),e.contentURL=[]),e.abortController&&e.abortController.abort("tile not needed"),this.parent=null,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 a=e.meshContent.length-1;a>=0;a--){const t=e.meshContent[a];t&&t.asset&&t.asset.copyright&&(t.asset.copyright.split(";").forEach(A=>{V[A]&&V[A]--}),e.displayCopyright&&Ye()),e.remove(t)}e.splatsMesh&&e.meshContent.forEach(a=>a.hide()),e.meshContent=[],e.contentURL.forEach(a=>{e.tileLoader.invalidate(a,e.uuid)}),e.contentURL=[]}}_disposeChildren(){var e=this;e.childrenTiles.forEach(a=>{a.dispose(),e.remove(a)}),e.childrenTiles=[]}raycast(e,a){if(this.splatsMesh){Me.copy(e.ray),Fe.copy(this.matrixWorld).invert(),Me.applyMatrix4(Fe);let t=!1;if(this.boundingVolume instanceof W)t=this.boundingVolume.intersectsRay(Me);else{if(!(this.boundingVolume instanceof Q.Sphere))return!1;t=ray.intersectsSphere(this.boundingVolume)}return t&&this.materialVisibility&&this.splatsReady&&(Se.length=0,this.meshContent.forEach(A=>{A.isSplatsBatch&&(A.raycast(Me,Se,e.params.Points.threshold),Se.forEach(i=>{i.point.applyMatrix4(this.matrixWorld)}),a.push(...Se))})),t}return super.raycast(e,a)}update(e){const a=new Q.Frustum;a.setFromProjectionMatrix(new Q.Matrix4().multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse));let t=[0],A=[0],i=[0],s=[0];return this.refine=="REPLACE"?this.loadingStrategy==="IMMEDIATE"?(this._updateImmediate(e,a),this._statsImmediate(i,t,s,A)):(this._update(e,a),this._stats(i,t,s,A)):(this._update(e,a),this._stats(i,t,s,A)),t>0&&(s[0]/=t[0]),this.splatsMesh&&(We.copy(e.position),Fe.copy(this.matrixWorld).invert(),We.applyMatrix4(Fe),this.splatsMesh.sort(We)),{numTilesLoaded:t[0],numTilesRendered:A[0],maxLOD:i[0],percentageLoaded:s[0]}}_updateImmediate(e,a){this._computeMetricRecursive(e,a),this._updateNodeVisibilityImmediate(),this._expandTreeImmediate(e),this.shouldBeVisible=this.metric>0||!!this.loadOutsideView,this._shouldBeVisibleUpdateImmediate(),this._trimTreeImmediate(),this._loadMeshImmediate()}_statsImmediate(e,a,t,A){e[0]=Math.max(e[0],this.level),(this.shouldBeVisible||this.materialVisibility)&&(a[0]++,this.materialVisibility&&t[0]++),this.materialVisibility&&A[0]++,this.childrenTiles.forEach(i=>{i._statsImmediate(e,a,t,A)})}_stats(e,a,t,A){e[0]=Math.max(e[0],this.level),this.hasMeshContent&&(a[0]++,this.meshContent.length==this.hasMeshContent&&t[0]++,this.materialVisibility&&A[0]++),this.childrenTiles.forEach(i=>{i._stats(e,a,t,A)})}_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 a=this;if(a.hasMeshContent)if(a.shouldBeVisible)a.meshContent.length==a.hasMeshContent?a.materialVisibility?a.childrenTiles.forEach(t=>{t._updateNodeVisibilityImmediate(!0)}):(a._changeContentVisibility(!0),a.childrenTiles.forEach(t=>{t._updateNodeVisibilityImmediate(e)})):a.childrenTiles.forEach(t=>{t._updateNodeVisibilityImmediate(e)});else{if(!a.loadOutsideView&&a.metric<0)return a._changeContentVisibility(!1),a.meshContent.length>0&&a._disposeMeshContent(),void a.childrenTiles.forEach(t=>{t._updateNodeVisibilityImmediate(!0)});if(!a.materialVisibility||a.splatsMesh&&!a.splatsReady)a.childrenTiles.forEach(t=>{t._updateNodeVisibilityImmediate(e)});else if(e)a._changeContentVisibility(!1),a.meshContent.length>0&&a._disposeMeshContent(),a.childrenTiles.forEach(t=>{t._updateNodeVisibilityImmediate(e)});else{let t=!0;a.childrenTiles.every(A=>!!A._isReadyImmediate()||(t=!1,!1)),t&&a.childrenTiles.length>0?(a._changeContentVisibility(!1),a.meshContent.length>0&&a._disposeMeshContent(),a.childrenTiles.forEach(A=>{A._updateNodeVisibilityImmediate(e)})):a.childrenTiles.forEach(A=>{A._updateNodeVisibilityImmediate(!a.splatsMesh||a.splatsReady)})}}else a.childrenTiles.forEach(t=>{t._updateNodeVisibilityImmediate(e)})}_shouldBeVisibleUpdateImmediate(){const e=this;e.hasMeshContent?e.metric==null?e.shouldBeVisible=!1:e.metric<0?(e.shouldBeVisible=!!e.loadOutsideView,e.childrenTiles.forEach(a=>{a._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(a=>{a.shouldBeVisible=!0,a._shouldBeVisibleUpdateImmediate()})):e.shouldBeVisible=!0):e.childrenTiles.forEach(a=>{a._setShouldNotBeVisibleRecursive()}):(e.childrenTiles.forEach(a=>{a.shouldBeVisible=!0,a._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(a=>{a._loadMeshImmediate()})}_computeMetricRecursive(e,a){const t=this;t.metric=-1,t.isSetup&&(t.boundingVolume&&t.geometricError&&(t.metric=t._calculateUpdateMetric(e,a)),t.childrenTiles.forEach(A=>A._computeMetricRecursive(e,a)))}_expandTreeImmediate(e){const a=this;a.hasUnloadedJSONContent||(a.hasMeshContent?a.occlusionCullingService&&a.hasMeshContent&&!a.occlusionCullingService.hasID(a.colorID)||a.metric>=0&&a.metric<a.geometricErrorMultiplier*a.geometricError&&a.json&&a.json.children&&a.childrenTiles.length<a.json.children.length&&a._loadJsonChildren(e):a.json&&a.json.children&&a.childrenTiles.length<a.json.children.length&&a._loadJsonChildren(e)),a.childrenTiles.forEach(t=>t._expandTreeImmediate(e))}_update(e,a){const t=this;if(!t.isSetup)return;const A=t.materialVisibility;t.boundingVolume&&t.geometricError&&(t.metric=t._calculateUpdateMetric(e,a)),t.childrenTiles.forEach(i=>i._update(e,a)),function(i){if(t.hasMeshContent&&!(t.meshContent.length<t.hasMeshContent)){if(i<0)return t.inFrustum=!1,void t._changeContentVisibility(!!t.loadOutsideView);if(t.inFrustum=!0,t.childrenTiles.length==0)return void t._changeContentVisibility(!0);if(i>=t.geometricErrorMultiplier*t.geometricError)t._changeContentVisibility(!0);else if(i<t.geometricErrorMultiplier*t.geometricError&&t.refine=="REPLACE"){let s=!0;t.childrenTiles.every(r=>!!r._isReady()||(s=!1,!1)),s?t._changeContentVisibility(!1):t._changeContentVisibility(!0)}}}(t.metric),function(i){i<0&&t.hasMeshContent||t.occlusionCullingService&&t.hasMeshContent&&!t.occlusionCullingService.hasID(t.colorID)||(!t.hasMeshContent||i<=t.geometricErrorMultiplier*t.geometricError&&t.meshContent.length>0)&&t.json&&t.json.children&&t.childrenTiles.length!=t.json.children.length&&t._loadJsonChildren(e)}(t.metric),function(i,s){if(t.hasMeshContent){if(!t.inFrustum)return void t._disposeChildren();if(t.occlusionCullingService&&!s&&t.hasMeshContent&&t.meshContent.length>0&&t.materialVisibility&&t._areAllChildrenLoadedAndHidden())return t.splatsMesh&&this.materialVisibility&&!t.splatsReady?void 0:void t._disposeChildren();if(i>=t.geometricErrorMultiplier*t.geometricError){if(t.splatsMesh&&t.materialVisibility&&!t.splatsReady)return;t._disposeChildren()}}}(t.metric,A)}_loadJsonChildren(e){const a=this;for(let t=a.json.children.length-1;t>=0;t--)a.json.children[t].root||a.json.children[t].children||a.json.children[t].getChildren||a.json.children[t].content||a.json.children[t].contents||a.json.children.splice(t,1);a.json.children.forEach(t=>{let A=new ia({parentTile:a,queryParams:a.queryParams,parentGeometricError:a.geometricError,parentBoundingVolume:a.boundingVolume,parentRefine:a.refine,json:t,rootPath:a.rootPath,geometricErrorMultiplier:a.geometricErrorMultiplier,loadOutsideView:a.loadOutsideView,level:Math.floor(a.level)+1,tileLoader:a.tileLoader,cameraOnLoad:e,occlusionCullingService:a.occlusionCullingService,renderer:a.renderer,static:a.static,centerModel:!1,displayErrors:a.displayErrors,displayCopyright:a.displayCopyright,distanceBias:a.distanceBias,loadingStrategy:a.loadingStrategy,drawBoundingVolume:a.drawBoundingVolume,splatsMesh:a.splatsMesh});a.childrenTiles.push(A),a.add(A)}),a.updateMatrices(!0)}_areAllChildrenLoadedAndHidden(){let e=!0;const a=this;return this.childrenTiles.every(t=>{if(t.hasMeshContent){if(t.childrenTiles.length>0)return e=!1,!1;if(!t.metric<0)return!0;if(t.materialVisibility&&(!a.splatsMesh||a.splatsReady)||a.occlusionCullingService.hasID(t.colorID))return e=!1,!1}else if(!t._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||self.splatsMesh&&!self.splatsReady){if(this.children.length>0){var e=!0;return this.childrenTiles.every(a=>!!a._isReady()||(e=!1,!1)),e}return!1}return!this.hasMeshContent||!(this.meshContent.length<this.hasMeshContent)&&!(!this.materialVisibility||this.splatsMesh&&!this.splatsReady)}_isReadyImmediate(){if(this.materialVisibility||!this.loadOutsideView&&this.metric<0)return!0;if(this.childrenTiles.length>0){var e=!0;return this.childrenTiles.every(a=>!!a._isReadyImmediate()||(e=!1,!1)),e}return!1}_changeContentVisibility(e){const a=this;if(a.bbox&&(a.bbox.material.visible=e),a.splatsMesh)e!=a.materialVisibility&&(a.meshContent.forEach(t=>{e&&t.isSplatsBatch?(a.splatsReady=!0,t.show(()=>{a.materialVisibility&&(a.splatsReady=!0)})):t.hide()}),a.materialVisibility=e);else{if(a.hasMeshContent&&a.meshContent.length>0&&(e?a.meshContent.forEach(t=>{t.traverse(A=>{(A.isMesh||A.isPoints)&&A.layers.enable(0)})}):a.meshContent.forEach(t=>{t.traverse(A=>{(A.isMesh||A.isPoints)&&A.layers.disable(0)})})),a.materialVisibility==e)return;a.materialVisibility=e}}_calculateUpdateMetric(e,a){let t=0;if(this.boundingVolume instanceof W){if(re.copy(this.boundingVolume),re.applyMatrix4(this.matrixWorld),!re.inFrustum(a))return-1;t=Math.max(0,re.distanceToPoint(e.position)-e.near)}else{if(!(this.boundingVolume instanceof Q.Sphere))return console.error("unsupported shape"),-1;if(X.copy(this.boundingVolume),X.applyMatrix4(this.matrixWorld),!a.intersectsSphere(X))return-1;t=Math.max(0,e.position.distanceTo(X.center)-X.radius-e.near)}if(t=Math.pow(t,this.distanceBias),t==0)return 0;const A=this.matrixWorld.getMaxScaleOnAxis();this.renderer&&this.renderer.getDrawingBufferSize(this.rendererSize);let i=this.rendererSize.y,s=e.fov;e.aspect<1&&(s*=e.aspect,i=this.rendererSize.x);let r=2*Math.tan(.5*s*.017453292519943295)*t;return 16*window.devicePixelRatio*r/(i*A)}_getSiblings(){const e=this,a=[];if(!e.parentTile)return a;let t=e.parentTile;for(;!t.hasMeshContent&&t.parentTile;)t=t.parentTile;return t.childrenTiles.forEach(A=>{if(A&&A!=e){for(;!A.hasMeshContent&&A.childrenTiles[0];)A=A.childrenTiles[0];a.push(A)}}),a}_calculateDistanceToCamera(e){return this.boundingVolume instanceof W?(re.copy(this.boundingVolume),re.applyMatrix4(this.matrixWorld),Math.max(0,re.distanceToPoint(e.position))):this.boundingVolume instanceof Q.Sphere?(X.copy(this.boundingVolume),X.applyMatrix4(this.matrixWorld),Math.max(0,e.position.distanceTo(X.center)-X.radius)):(console.error("unsupported shape"),-1)}setGeometricErrorMultiplier(e){this.geometricErrorMultiplier=e,this.splatsReady=!0,this.childrenTiles.forEach(a=>a.setGeometricErrorMultiplier(e))}setDistanceBias(e){this.distanceBias=e,this.childrenTiles.forEach(a=>a.setDistanceBias(e))}_transformWGS84ToCartesian(e,a,t,A){const i=6378137/Math.sqrt(1-.006694384442042*Math.pow(Math.sin(a),2)),s=Math.cos(a),r=Math.cos(e),c=Math.sin(a),n=i+t,b=n*s*r,l=n*s*Math.sin(e),f=(.993305615557957*i+t)*c;A.set(b,l,f)}}function ka(o){var e=document.createElement("div");e.textContent=o,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 Ye(){z||((z=document.createElement("div")).style.position="fixed",z.style.bottom="20px",z.style.left="20px",z.style.color="white",z.style.textShadow="2px 2px 0 #000, -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000",z.style.padding="10px",z.style.backgroundColor="rgba(0, 0, 0, 0.1)",document.body.appendChild(z));const o=At();let e="";o.forEach(a=>{e+=a+", "}),e=e.slice(0,-2),z.textContent=e}const G=new Q.Sphere(new Q.Vector3(0,0,0),1),te=new Q.Vector3(0,0,0),Xe=new Q.Vector3(0,0,0),oA=new Q.Vector3(0,1,0),Ze=new Q.Vector2,Da=new Q.Quaternion,ja=new Q.Matrix4;class sa extends Q.Object3D{constructor(e){super();const a=this;if(e.queryParams&&(this.queryParams={...e.queryParams}),this.uuid=Ra(),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),a.setup(e);else if(e.url){this.loadJson=(i,s)=>{const r=Ae.dirname(s);a.setup({rootPath:r,json:i,onLoadCallback:e.onLoadCallback})};var t=e.url;if(a.queryParams){var A="";for(let i in a.queryParams)a.queryParams.hasOwnProperty(i)&&(A+="&"+i+"="+a.queryParams[i]);t.includes("?")?t+=A:t+="?"+A.substring(1)}a.tileLoader.get(a.abortController,t,a.uuid,a)}}async setup(e){const a=this;e.json.root?(a.json=e.json.root,!a.json.children&&a.json.getChildren&&(a.json.children=await a.json.getChildren()),a.jsonChildren=a.json.children,a.json.refinement||(a.json.refinement=e.json.refinement),a.json.geometricError||(a.json.geometricError=e.json.geometricError),a.json.transform||(a.json.transform=e.json.transform),a.json.boundingVolume||(a.json.boundingVolume=e.json.boundingVolume)):(a.json=e.json,!a.json.children&&a.json.getChildren&&(a.json.children=await a.json.getChildren(),a.jsonChildren=a.json.children)),a.rootPath=e.json.rootPath?e.json.rootPath:e.rootPath,a.json.refinement?a.refinement=a.json.refinement:a.refinement=e.parentRefinement,a.json.geometricError?a.geometricError=a.json.geometricError:a.geometricError=e.parentGeometricError;let t=new Q.Matrix4;if(a.json.transform&&!a.centerModel&&(t.elements=a.json.transform),a.applyMatrix4(t),a.parentTile&&a.parentTile.matrix&&(a.matrix.premultiply(a.parentTile.matrix),a.matrix.decompose(a.position,a.quaternion,a.scale)),a.matrixWorldNeedsUpdate=!0,a.updateWorldMatrix(!0,!0),a.json.boundingVolume)if(a.json.boundingVolume.box)a.boundingVolume=new W(a.json.boundingVolume.box);else if(a.json.boundingVolume.region){const i=a.json.boundingVolume.region;a.transformWGS84ToCartesian(i[0],i[1],i[4],te),a.transformWGS84ToCartesian(i[2],i[3],i[5],Xe),te.lerp(Xe,.5),a.boundingVolume=new Q.Sphere(new Q.Vector3(te.x,te.y,te.z),te.distanceTo(Xe))}else if(a.json.boundingVolume.sphere){const i=a.json.boundingVolume.sphere;a.boundingVolume=new Q.Sphere(new Q.Vector3(i[0],i[1],i[2]),i[3])}else a.boundingVolume=e.parentBoundingVolume;else a.boundingVolume=e.parentBoundingVolume;function A(i){i.uri&&i.uri.includes("json")||i.url&&i.url.includes("json")?a.hasUnloadedJSONContent++:a.hasMeshContent++}if(a.json.content?(A(a.json.content),a.load()):a.json.contents&&(a.json.contents.forEach(i=>A(i)),a.load()),a.centerModel){const i=new Q.Sphere;a.boundingVolume instanceof W?i.copy(a.boundingVolume.sphere):a.boundingVolume instanceof Q.Sphere&&i.copy(a.boundingVolume),this.json.boundingVolume.region&&(a.transformWGS84ToCartesian(.5*(a.json.boundingVolume.region[0]+a.json.boundingVolume.region[2]),.5*(a.json.boundingVolume.region[1]+a.json.boundingVolume.region[3]),.5*(a.json.boundingVolume.region[4]+a.json.boundingVolume.region[5]),te),Da.setFromUnitVectors(te.normalize(),oA.normalize()),a.master.applyQuaternion(Da),a.master.updateWorldMatrix(!1,!1)),ja.makeTranslation(-i.center.x*a.scale.x,-i.center.y*a.scale.y,-i.center.z*a.scale.z),a.master.matrix.multiply(ja),a.master.matrix.decompose(a.master.position,a.master.quaternion,a.master.scale)}a.isSetup=!0,e.onLoadCallback&&e.onLoadCallback(a)}isAbsolutePathOrURL(e){const a=/^(?:http|https|ftp|tcp|udp):\/\/\S+/.test(e),t=e.startsWith("/")&&!e.startsWith("//");return a||t}assembleURL(e,a){e.endsWith("/")||(e+="/");const t=new URL(e);let A=t.pathname.split("/").filter(s=>s!==""),i=a.split("/").filter(s=>s!=="");for(let s=1;s<=A.length&&!(s>=i.length);s++)if(A.slice(A.length-s,A.length).join("/")===i.slice(0,s).join("/")){for(let r=0;r<s;r++)A.pop();break}for(;i.length>0&&i[0]==="..";)A.pop(),i.shift();return`${t.protocol}//${t.host}/${[...A,...i].join("/")}`}extractQueryParams(e,a){const t=new URL(e);for(let[A,i]of t.searchParams)a[A]=i;return t.search="",t.toString()}load(){var e=this;function a(t){let A;t.uri?A=t.uri:t.url&&(A=t.url);const i=/^(?:http|https|ftp|tcp|udp):\/\/\S+/;if(i.test(e.rootPath)?i.test(A)||(A=e.assembleURL(e.rootPath,A)):Ae.isAbsolute(e.rootPath)&&(A=e.rootPath+Ae.sep+A),A=e.extractQueryParams(A,e.queryParams),e.queryParams){var s="";for(let r in e.queryParams)e.queryParams.hasOwnProperty(r)&&(s+="&"+r+"="+e.queryParams[r]);A.includes("?")?A+=s:A+="?"+s.substring(1)}A&&(A.includes(".b3dm")||A.includes(".glb")||A.includes(".gltf")?(e.contentURL=A,e.tileLoader.get(e.abortController,A,e.uuid,e,e.cameraOnLoad?()=>e.calculateDistanceToCamera(e.cameraOnLoad):()=>0,()=>e.getSiblings(),e.level,!e.json.boundingVolume.region,!!e.json.boundingVolume.region,e.geometricError)):A.includes(".json")&&e.tileLoader.get(e.abortController,A,e.uuid,e))}e.deleted||(e.json.content?a(e.json.content):e.json.contents&&e.json.contents.forEach(t=>a(t)))}loadMesh(e){this.deleted||this.meshContent.add(e)}loadJson(e,a){this.deleted||(this.json.children&&(this.jsonChildren=this.json.children),e.rootPath=Ae.dirname(a),this.jsonChildren.push(e),this.hasUnloadedJSONContent--)}dispose(){const e=this;e.childrenTiles.forEach(a=>a.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,a){const t=this;function A(i){if(t.hasMeshContent&&!(t.meshContent.size<t.hasMeshContent)){if(i<0)return t.inFrustum=!1,void t.changeContentVisibility(!!t.loadOutsideView);if(t.inFrustum=!0,t.childrenTiles.length!=0){if(i>=t.master.geometricErrorMultiplier*t.geometricError)t.changeContentVisibility(!0);else if(i<t.master.geometricErrorMultiplier*t.geometricError){let s=!0;t.childrenTiles.every(r=>!!r.isReady()||(s=!1,!1)),s&&t.changeContentVisibility(!1)}}else t.changeContentVisibility(!0)}}t.isSetup&&(t.materialVisibility,t.boundingVolume&&t.geometricError&&(t.metric=t.calculateUpdateMetric(e,a)),t.childrenTiles.forEach(i=>i._update(e,a)),A(t.metric),function(i){i<0&&t.hasMeshContent||(!t.hasMeshContent&&t.rootPath||i<t.master.geometricErrorMultiplier*t.geometricError&&t.meshContent.size>0)&&t.json&&t.jsonChildren&&t.childrenTiles.length!=t.jsonChildren.length&&t.jsonChildren.forEach(s=>{if(!(s.root||s.children||s.getChildren||s.content||s.contents))return;let r=new sa({parentTile:t,queryParams:t.queryParams,parentGeometricError:t.geometricError,parentBoundingVolume:t.boundingVolume,parentRefinement:t.refinement,json:s,rootPath:t.rootPath,loadOutsideView:t.loadOutsideView,level:t.level+1,tileLoader:t.tileLoader,cameraOnLoad:e,master:t.master,centerModel:!1});t.childrenTiles.push(r)})}(t.metric),function(i){if(t.hasMeshContent){if(!t.inFrustum)return t.disposeChildren(),void A(i);i>=t.master.geometricErrorMultiplier*t.geometricError&&(t.disposeChildren(),A(i))}}(t.metric))}areAllChildrenLoadedAndHidden(){let e=!0;return this.childrenTiles.every(a=>{if(a.hasMeshContent){if(a.childrenTiles.length>0)return e=!1,!1;if(!a.inFrustum)return!0;if(!a.materialVisibility||a.meshesToDisplay!=a.meshesDisplayed)return e=!1,!1}else if(!a.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(a=>!!a.isReady()||(e=!1,!1)),e}return!1}return!this.hasMeshContent||!(this.meshContent.size<this.hasMeshContent)&&!!this.materialVisibility}changeContentVisibility(e){this.materialVisibility=e}calculateUpdateMetric(e,a){if(this.boundingVolume instanceof W){if(G.copy(this.boundingVolume.sphere),G.applyMatrix4(this.matrixWorld),!a.intersectsSphere(G))return-1}else{if(!(this.boundingVolume instanceof Q.Sphere))return console.error("unsupported shape"),-1;if(G.copy(this.boundingVolume),G.applyMatrix4(this.matrixWorld),!a.intersectsSphere(G))return-1}let t=Math.max(0,e.position.distanceTo(G.center)-G.radius);if(t=Math.pow(t,this.distanceBias),t==0)return 0;const A=this.matrixWorld.getMaxScaleOnAxis();this.master._renderSize(Ze);let i=Ze.y,s=e.fov;e.aspect<1&&(s*=e.aspect,i=Ze.x);let r=2*Math.tan(.5*s*.017453292519943295)*t;return 16*window.devicePixelRatio*r/(i*A)}getSiblings(){const e=this,a=[];if(!e.parentTile)return a;let t=e.parentTile;for(;!t.hasMeshContent&&t.parentTile;)t=t.parentTile;return t.childrenTiles.forEach(A=>{if(A&&A!=e){for(;!A.hasMeshContent&&A.childrenTiles[0];)A=A.childrenTiles[0];a.push(A)}}),a}calculateDistanceToCamera(e){return this.boundingVolume instanceof W?(G.copy(this.boundingVolume.sphere),G.applyMatrix4(this.matrixWorld)):this.boundingVolume instanceof Q.Sphere?(G.copy(this.boundingVolume),G.applyMatrix4(this.matrixWorld)):console.error("unsupported shape"),Math.max(0,e.position.distanceTo(G.center)-G.radius)}getWorldMatrix(){return this.matrixWorld}transformWGS84ToCartesian(e,a,t,A){const i=6378137/Math.sqrt(1-.006694384442042*Math.pow(Math.sin(a),2)),s=Math.cos(a),r=Math.cos(e),c=Math.sin(a),n=i+t,b=n*s*r,l=n*s*Math.sin(e),f=(.993305615557957*i+t)*c;A.set(b,l,f)}}class nA extends Q.Object3D{constructor(e){super(),e.master=this,e.domWidth&&e.domHeight?this.rendererSize=new Q.Vector2(e.domWidth,e.domHeight):this.rendererSize=new Q.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 sa(e),e.static&&(this.matrixAutoUpdate=!1),this.tileLoader=e.tileLoader}_renderSize(e){this.renderer?this.renderer.getDrawingBufferSize(e):e.copy(this.rendererSize)}setCanvasSize(e,a){this.rendererSize.set(e,a)}update(e,a){if(a)this.tileset._update(e,a);else{const t=new Q.Frustum;t.setFromProjectionMatrix(new Q.Matrix4().multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse)),this.tileset._update(e,t)}}setGeometricErrorMultiplier(e){this.geometricErrorMultiplier=e||1}}class cA{constructor(e){const a=this;a.scene=e,a.instancedTiles=[],a.instancedMesh,a.reuseableMatrix=new Q.Matrix4}addInstance(e){const a=this;e.added=!0,e.listOMesh=a.instancedTiles,a.instancedTiles.push(e),a.instancedMesh&&e.loadMesh(a.instancedMesh)}addToScene(){const e=this;e.instancedMesh.setMatrixAt(0,new Q.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 a=this;a.instancedMesh=e,a.instancedMesh.matrixAutoUpdate=!1,a.instancedMesh.matrixWorldAutoUpdate=!1,a.scene.children.includes(e)||this.addToScene();for(let t=0;t<a.instancedTiles.length;t++)a.instancedTiles[t].loadMesh(a.instancedMesh)}update(){const e=this;for(let a=e.instancedTiles.length-1;a>=0;a--)e.instancedTiles[a].deleted&&e.instancedTiles.splice(a,1);if(e.instancedMesh){e.instancedMesh.count=0,e.instancedMesh.instancedTiles=[];for(let a=0;a<e.instancedTiles.length;a++)e.instancedTiles[a].meshContent.add(e.instancedMesh),e.instancedTiles[a].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[a].matrixWorld),e.reuseableMatrix.multiply(e.instancedMesh.baseMatrix),e.instancedMesh.setMatrixAt(e.instancedMesh.count-1,e.reuseableMatrix),e.instancedMesh.instancedTiles.push(e.instancedTiles[a]));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(a=>{if(a.dispose&&a.dispose(),a.material)if(a.material.length)for(let t=0;t<a.material.length;++t)a.material[t].dispose();else a.material.dispose();a.geometry&&a.geometry.dispose()}),e.instancedMesh.dispose(),!0)}}class dA{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,a){const t=this;t.json=e,t.url=a;for(let A=0;A<t.instancedTiles.length;A++)t.instancedTiles[A].loadJson(t.json,t.url)}getCount(){return this.instancedTiles.length}update(){const e=this;for(let a=e.instancedTiles.length-1;a>=0;a--)e.instancedTiles[a].deleted&&e.instancedTiles.splice(a,1)}dispose(){return!(!this.json||this.instancedTiles.length!=0)}}let oe=0;async function lA(o){return new Promise(e=>{const a=setInterval(()=>{o.hasDracoLoader&&!o.dracoLoader||o.hasKTX2Loader&&!o.ktx2Loader||(clearInterval(a),e())},10)})}exports.InstancedOGC3DTile=nA,exports.InstancedTileLoader=class{constructor(o,e){if(this.zUpToYUpMatrix=new Q.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 Ta,e&&e.dracoLoader)this.gltfLoader.setDRACOLoader(e.dracoLoader),this.hasDracoLoader=!0;else{const a=new Ga;a.setDecoderPath("https://www.gstatic.com/draco/versioned/decoders/1.4.3/"),this.gltfLoader.setDRACOLoader(a),this.gltfLoader.hasDracoLoader=!0}if(e&&e.ktx2Loader)this.gltfLoader.setKTX2Loader(e.ktx2Loader),this.hasKTX2Loader=!0;else if(e&&e.renderer){const a=new U;a.setTranscoderPath("https://storage.googleapis.com/ogc-3d-tiles/basis/").detectSupport(e.renderer),this.gltfLoader.setKTX2Loader(a),this.gltfLoader.hasKTX2Loader=!0}this.gltfLoader.setMeshoptDecoder(Za),this.hasMeshOptDecoder=!0,this.b3dmDecoder=new Sa(this.gltfLoader),this.cache=new Ma,this.scene=o,this.ready=[],this.downloads=[],this.nextReady=[],this.nextDownloads=[]}update(){const o=this;o._checkSize(),o.cache._data.forEach(e=>{e.update()}),oe<8&&o._download(),o._loadBatch()}_download(){const o=this;if(o.nextDownloads.length!=0||(o._getNextDownloads(),o.nextDownloads.length!=0))for(;o.nextDownloads.length>0;){const a=o.nextDownloads.shift();if(a){if(a.path.includes(".b3dm")&&(e=o.proxy?()=>fetch(o.proxy,{method:"POST",body:a.path}):()=>fetch(a.path),oe++,e().then(t=>{if(!t.ok)throw console.error("could not load tile with path : "+a.path),new Error(`couldn't load "${a.path}". Request failed with status ${t.status} : ${t.statusText}`);return t.arrayBuffer()}).then(t=>this.b3dmDecoder.parseB3DMInstanced(t,A=>{o.meshCallback(A,a.geometricError)},o.maxInstances,a.sceneZupToYup,a.meshZupToYup)).then(t=>{t.frustumCulled=!1,a.tile.setObject(t),o.ready.unshift(a)}).catch(t=>console.error(t)).finally(()=>{oe--})),a.path.includes(".glb")||a.path.includes(".gltf"))e=o.proxy?()=>fetch(o.proxy,{method:"POST",body:a.path}):()=>fetch(a.path),oe++,e().then(t=>{if(!t.ok)throw new Error("missing content");return t.arrayBuffer()}).then(async t=>{await lA(this.gltfLoader),this.gltfLoader.parse(t,null,A=>{let i;A.scene.asset=A.asset,a.sceneZupToYup&&A.scene.applyMatrix4(this.zUpToYUpMatrix),A.scene.traverse(s=>{s.geometricError=a.geometricError,s.isMesh&&(a.meshZupToYup&&s.applyMatrix4(this.zUpToYUpMatrix),o.meshCallback&&o.meshCallback(s,s.geometricError)),s.isPoints&&console.error("instanced point cloud is not supported")}),A.scene.updateWorldMatrix(!1,!0),A.scene.traverse(s=>{s.isMesh&&(i=new Q.InstancedMesh(s.geometry,s.material,o.maxInstances),i.baseMatrix=s.matrixWorld)}),o.ready.unshift(a),i?(i.frustumCulled=!1,a.tile.setObject(i)):A.scene.traverse(s=>{s.dispose&&s.dispose(),s.material&&s.material.dispose()})})},t=>{console.error("could not load tile : "+a.path)}).finally(()=>{oe--});else if(a.path.includes(".json")){var e;e=o.proxy?()=>fetch(o.proxy,{method:"POST",body:a.path}):()=>fetch(a.path),oe++,e().then(t=>{if(!t.ok)throw console.error("could not load tile with path : "+a.path),new Error(`couldn't load "${a.path}". Request failed with status ${t.status} : ${t.statusText}`);return t.json()}).then(t=>Aa(t,a.path)).then(t=>{a.tile.setObject(t,a.path),o.ready.unshift(a)}).catch(t=>console.error(t)).finally(()=>{oe--})}}}}_loadBatch(){return this.nextReady.length==0&&(this._getNextReady(),this.nextReady.length==0)?0:this.nextReady.shift()?1:0}_getNextReady(){let o=Number.MAX_VALUE,e=-1;for(let a=this.ready.length-1;a>=0;a--)this.ready[a].distanceFunction||this.nextReady.push(this.ready.splice(a,1)[0]);if(!(this.nextReady.length>0)){for(let a=this.ready.length-1;a>=0;a--){const t=this.ready[a].distanceFunction()*this.ready[a].level;t<o&&(o=t,e=a)}if(e>=0){const a=this.ready.splice(e,1).pop();this.nextReady.push(a);const t=a.getSiblings();for(let A=this.ready.length-1;A>=0;A--)t.includes(this.ready[A].uuid)&&this.nextready.push(this.ready.splice(A,1).pop())}}}get(o,e,a,t,A,i,s,r,c,n){const b=this,l=function(h){for(var g=h.split("/"),u=[],p=0,B=0;B<g.length;B++){var I=g[B];I!=="."&&I!==""&&I!==".."?u[p++]=I:I===".."&&p>0&&p--}if(p===0)return"/";var m="";for(B=0;B<p;B++)m+="/"+u[B];return m}(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 f=b.cache.get(l);if(f)f.addInstance(t);else if(e.includes(".b3dm")||e.includes(".glb")||e.includes(".gltf")){const h=new cA(b.scene);h.addInstance(t),b.cache.put(l,h);const g=new AbortController;o.signal.addEventListener("abort",()=>{h.getCount()==0&&g.abort()}),this.downloads.push({abortController:g,tile:h,key:l,path:e,distanceFunction:A,getSiblings:i,level:s,uuid:a,sceneZupToYup:r,meshZupToYup:c,geometricError:n,shouldDoDownload:()=>!0})}else if(e.includes(".json")){const h=new dA;h.addInstance(t),b.cache.put(l,h);const g=new AbortController;o.signal.addEventListener("abort",()=>{h.getCount()==0&&g.abort()}),this.downloads.push({abortController:g,tile:h,key:l,path:e,distanceFunction:A,getSiblings:i,level:s,shouldDoDownload:()=>!0})}}_getNextDownloads(){let o=Number.MAX_VALUE,e=-1;for(let a=this.downloads.length-1;a>=0;a--){const t=this.downloads[a];t.shouldDoDownload()?t.distanceFunction||this.nextDownloads.push(this.downloads.splice(a,1)[0]):this.downloads.splice(a,1)}if(!(this.nextDownloads.length>0)){for(let a=this.downloads.length-1;a>=0;a--){const t=this.downloads[a],A=t.distanceFunction()*t.level;A<o&&(o=A,e=a)}if(e>=0){const a=this.downloads.splice(e,1).pop();this.nextDownloads.push(a);const t=a.getSiblings();for(let A=this.downloads.length-1;A>=0;A--)t.includes(this.downloads[A].uuid)&&this.nextDownloads.push(this.downloads.splice(A,1).pop())}}}_checkSize(){const o=this;let e=0;for(;o.cache.size()>o.maxCachedItems&&e<o.cache.size();){e++;const a=o.cache.head();o.cache.remove(a.key),a.value.dispose()||o.cache.put(a.key,a.value)}}},exports.OGC3DTile=ia,exports.OcclusionCullingService=class{constructor(){this.cullMap=[],this.cullMaterial=new Q.MeshBasicMaterial({vertexColors:!0}),this.cullMaterial.side=Q.FrontSide,this.cullTarget=this._createCullTarget(),this.cullPixels=new Uint8Array(4*this.cullTarget.width*this.cullTarget.height)}setSide(o){this.cullMaterial.side=o}_createCullTarget(){const o=new Q.WebGLRenderTarget(Math.floor(.05*window.innerWidth),Math.floor(.05*window.innerHeight));return o.texture.format=Q.RGBAFormat,o.texture.colorSpace=Q.LinearSRGBColorSpace,o.texture.minFilter=Q.NearestFilter,o.texture.magFilter=Q.NearestFilter,o.texture.generateMipmaps=!1,o.stencilBuffer=!1,o.depthBuffer=!0,o.depthTexture=new Q.DepthTexture,o.depthTexture.format=Q.DepthFormat,o.depthTexture.type=Q.UnsignedShortType,o}update(o,e,a){let t=e.getRenderTarget(),A=o.overrideMaterial;o.overrideMaterial=this.cullMaterial,e.setRenderTarget(this.cullTarget),e.render(o,a),o.overrideMaterial=A,e.setRenderTarget(t),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 s=Q.MathUtils.clamp(this.cullPixels[i],0,255)<<16^Q.MathUtils.clamp(this.cullPixels[i+1],0,255)<<8^Q.MathUtils.clamp(this.cullPixels[i+2],0,255);this.cullMap[s]=!0}}hasID(o){return this.cullMap[o]}},exports.TileLoader=$a,exports.getOGC3DTilesCopyrightInfo=At,exports.splatsFragmentShader=tt,exports.splatsVertexShader=at;
|
|
223
223
|
//# sourceMappingURL=threedtiles.cjs.js.map
|