s3m-three 0.4.23 → 0.4.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/analysis/clipping.d.ts +63 -0
- package/dist/analysis/clipping.d.ts.map +1 -0
- package/dist/analysis/clipping.js +69 -0
- package/dist/analysis/clipping.js.map +1 -0
- package/dist/analysis/depth.d.ts +55 -0
- package/dist/analysis/depth.d.ts.map +1 -0
- package/dist/analysis/depth.js +99 -0
- package/dist/analysis/depth.js.map +1 -0
- package/dist/analysis/index.d.ts +21 -0
- package/dist/analysis/index.d.ts.map +1 -0
- package/dist/analysis/index.js +17 -0
- package/dist/analysis/index.js.map +1 -0
- package/dist/analysis/lineOfSight.d.ts +60 -0
- package/dist/analysis/lineOfSight.d.ts.map +1 -0
- package/dist/analysis/lineOfSight.js +56 -0
- package/dist/analysis/lineOfSight.js.map +1 -0
- package/dist/analysis/measure.d.ts +56 -0
- package/dist/analysis/measure.d.ts.map +1 -0
- package/dist/analysis/measure.js +95 -0
- package/dist/analysis/measure.js.map +1 -0
- package/dist/analysis/skyline.d.ts +55 -0
- package/dist/analysis/skyline.d.ts.map +1 -0
- package/dist/analysis/skyline.js +78 -0
- package/dist/analysis/skyline.js.map +1 -0
- package/dist/analysis/viewshed.d.ts +48 -0
- package/dist/analysis/viewshed.d.ts.map +1 -0
- package/dist/analysis/viewshed.js +115 -0
- package/dist/analysis/viewshed.js.map +1 -0
- package/dist/browser/s3m-three.iife.ext-three.js +20 -3
- package/dist/browser/s3m-three.iife.js +20 -3
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/render/S3MViewer.d.ts +106 -0
- package/dist/render/S3MViewer.d.ts.map +1 -1
- package/dist/render/S3MViewer.js +174 -1
- package/dist/render/S3MViewer.js.map +1 -1
- package/dist/render/analysis/DepthPass.d.ts +78 -0
- package/dist/render/analysis/DepthPass.d.ts.map +1 -0
- package/dist/render/analysis/DepthPass.js +209 -0
- package/dist/render/analysis/DepthPass.js.map +1 -0
- package/dist/render/viewer/PickService.d.ts +15 -0
- package/dist/render/viewer/PickService.d.ts.map +1 -1
- package/dist/render/viewer/PickService.js +41 -0
- package/dist/render/viewer/PickService.js.map +1 -1
- package/docs/API.md +100 -0
- package/package.json +1 -1
- package/src/analysis/clipping.ts +135 -0
- package/src/analysis/depth.ts +126 -0
- package/src/analysis/index.ts +47 -0
- package/src/analysis/lineOfSight.ts +110 -0
- package/src/analysis/measure.ts +119 -0
- package/src/analysis/skyline.ts +125 -0
- package/src/analysis/viewshed.ts +160 -0
- package/src/index.ts +5 -0
- package/src/render/S3MViewer.ts +233 -2
- package/src/render/analysis/DepthPass.ts +278 -0
- package/src/render/viewer/PickService.ts +47 -0
|
@@ -4980,7 +4980,7 @@ void main() {
|
|
|
4980
4980
|
}
|
|
4981
4981
|
`,aC=class{constructor(){X(this,`rt`,null),X(this,`width`,0),X(this,`height`,0),X(this,`normalMaterial`,new Ef),X(this,`quadScene`,new Jl),X(this,`quadCamera`,new Uc(-1,1,1,-1,0,1)),X(this,`material`,void 0),this.material=new bc({glslVersion:za,uniforms:{tNormal:{value:null},tDepth:{value:null},uTexel:{value:new B(1,1)},uRadius:{value:1.5},uNormalThreshold:{value:.55},uDepthThreshold:{value:.08},uColor:{value:new W(`#334155`)},uOpacity:{value:.6}},vertexShader:rC,fragmentShader:iC,transparent:!0,depthTest:!0,depthWrite:!1,side:2,blending:1});let e=new hc(new Rc(2,2),this.material);e.frustumCulled=!1,e.raycast=()=>{},this.quadScene.add(e)}supported(e){return e.capabilities.isWebGL2===!0}ensureTarget(e,t){if(this.rt&&this.width===e&&this.height===t)return this.rt;this.disposeTarget();let n=new uo(Math.max(1,e),Math.max(1,t),{minFilter:Hr,magFilter:Hr,format:fi,type:Qr,depthBuffer:!0,stencilBuffer:!1,generateMipmaps:!1});return n.texture.generateMipmaps=!1,n.depthTexture=new rl(Math.max(1,e),Math.max(1,t),ri),this.rt=n,this.width=e,this.height=t,n}render(e,t,n,r,i,a){if(!this.supported(e)||r<=0||i<=0)return;let o=this.ensureTarget(r,i),s=t.overrideMaterial,c=e.getClearColor(new W),l=e.getClearAlpha();t.overrideMaterial=this.normalMaterial,e.setRenderTarget(o),e.setClearColor(0,0),e.clear(!0,!0,!0),e.render(t,n),t.overrideMaterial=s,e.setRenderTarget(null),e.setClearColor(c,l);let u=this.material.uniforms;u.tNormal.value=o.texture,u.tDepth.value=o.depthTexture,u.uTexel.value.set(1/Math.max(1,r),1/Math.max(1,i)),u.uRadius.value=Math.max(1,a.radius),u.uNormalThreshold.value=Math.max(.001,a.normalThreshold),u.uDepthThreshold.value=Math.max(.001,a.depthThreshold),u.uColor.value.copy(a.color),u.uOpacity.value=a.opacity,e.setViewport(0,0,r,i),e.resetState(),e.render(this.quadScene,this.quadCamera)}disposeTarget(){this.rt&&(this.rt.depthTexture?.dispose(),this.rt.dispose(),this.rt=null,this.width=0,this.height=0)}dispose(){this.disposeTarget(),this.material.dispose(),this.normalMaterial.dispose(),this.quadScene.traverse(e=>{e.geometry?.dispose?.()})}};sh(),tx(),mh();function oC(e){let t=Array.isArray(e.material)?e.material[0]:e.material;return t?.userData?.isStyled?t:null}function sC(e){let t=e??1;return t<0?0:t>1?1:t}var cC=[`terrain`,`ground`,`vegetation`,`green`,`road`,`dem`,`绿地`,`道路`,`地面`,`地形`,`植被`,`铺装`],lC=class{constructor(e){X(this,`host`,void 0),X(this,`lineShared`,void 0),X(this,`edgeMaterial`,void 0),X(this,`selectionEdgeMaterial`,void 0),X(this,`_edgeStyleUniforms`,void 0),X(this,`_selEdgeStyleUniforms`,void 0),X(this,`_hullStyleUniforms`,void 0),X(this,`_enabled`,!1),X(this,`_modes`,void 0),X(this,`_creaseLines`,null),X(this,`_nativeLines`,new Set),X(this,`_gpuEdge`,null),X(this,`_gpuEdgeColor`,new W),this.host=e;let t=e.style;this._modes=yb(!1),this.lineShared=GS(),this._edgeStyleUniforms={uColor:{value:new W(t.edgeColor)},uWidth:{value:Math.max(.1,t.edgeWidth??1.5)},uOpacity:{value:.6},uOffset:{value:t.edgeOffset??.15}},this.edgeMaterial=JS(this.lineShared,{},this._edgeStyleUniforms);let n=t;this._selEdgeStyleUniforms={uColor:{value:new W(n.outlineColor??n.selectColor??`#ffffff`)},uWidth:{value:Math.max(.1,n.outlineWidthPx??3)},uOpacity:{value:1},uElevation:{value:n.selectElevation??0}},this.selectionEdgeMaterial=JS(this.lineShared,{},this._selEdgeStyleUniforms),this._hullStyleUniforms={uColor:{value:new W(t.edgeColor)},uWidth:{value:Math.max(0,t.edgeHullWidth??.9)},uOpacity:{value:.6}}}get enabled(){return this._enabled}get modes(){return this._modes}useNativeEdges(e){return e&&this.host.style.forceCpuEdges!==!0&&!this._modes.gpu}registerNativeLine(e,t){this._nativeLines.add(e),e.visible=t,this._styleEdgeLine(e)}unregisterNativeLine(e){this._nativeLines.delete(e)}autoDecorate(e,t,n){if(n||uC(e)||!this._datasetEdgesEnabled(t))return;let r=e.userData;this._shouldSkipAutoEdges(r,t.name)||(this._modes.line||this._modes.hull?this._ensureEdgeDecoration(e):this._modes.gpu||this._ensureEdges(e))}disposeAll(){for(let e of this.host.pickables.values())this._removeEdges(e.mesh);this._gpuEdge?.dispose(),this._gpuEdge=null,this.edgeMaterial.dispose(),this.selectionEdgeMaterial.dispose()}get gpuEdge(){return this._gpuEdge}set gpuEdge(e){this._gpuEdge=e}disposeGpuEdge(){this._gpuEdge?.dispose(),this._gpuEdge=null}renderGpuEdges(e){if(!this._modes.gpu)return;let t=this.host.renderer,n=this.host.scene,r=this.host.camera;if(!t||!n||!r)return;let i=this.host.style,a=this.host.uniforms.uEdgeFade?.value??1,o=Math.min(1,Math.max(0,i.edgeOpacity??.6))*sC(i.opacity)*a;if(o<=.004||(this._gpuEdge||(this._gpuEdge=new aC),!this._gpuEdge.supported(t)))return;let s=Math.min(179,Math.max(1,i.edgeThreshold??55)),c=2*Math.sin(s*Math.PI/360)*.6;this._gpuEdge.render(t,n,r,e.width,e.height,{color:this._gpuEdgeColor.set(i.edgeColor),opacity:o,radius:Math.max(1,i.edgeWidth??1.5),normalThreshold:c,depthThreshold:.08})}createPerMeshEdgeMaterial(e,t=!1){let n=oC(e),r=this.host.uniforms,i=n?.userData?.uBatchTex?{uBatchTex:n.userData.uBatchTex,uBatchTex2:n.userData.uBatchTex2,uBatchMix:r.uBatchMix,uBatchTexWidth:n.userData.uBatchTexWidth,uBatchTexActive:n.userData.uBatchTexActive,uPathTex:r.uPathTex,uPathCount:r.uPathCount,uPathTexActive:r.uPathTexActive,uPathTime:r.uPathTime}:void 0;return JS(this.lineShared,{},t?this._selEdgeStyleUniforms:this._edgeStyleUniforms,i)}setEdges(e,t){let n=!!t&&((t.duration??0)>0||!!t.spring),r=yb(e),i=!bb(this._modes,r);this._modes=r,this._enabled=r.enabled,this.host.style.edges=e,this.host.styleTarget.edges=e;let a=r.enabled&&!r.gpu&&this.host.style.forceCpuEdges!==!0;for(let e of this._nativeLines)e.visible=a,this._styleEdgeLine(e);if(this._syncEdgeStyle(),!r.gpu&&this._gpuEdge&&(this._gpuEdge.dispose(),this._gpuEdge=null),!r.enabled){n?this.host.animator.to(`style.edgeFade`,0,{...t,onComplete:()=>{this._disposeEdges(),this.host.requestRepaint(),t?.onComplete?.()}}):(this._setEdgeFade(1),this._disposeEdges()),this.host.requestRepaint();return}i&&this._disposeEdges();let o=[...this.host.pickables.values()].map(e=>e.mesh).filter(e=>{let t=e.userData;return!uC(e)&&(t.nativeEdges=t.nativeEdgesRaw===!0&&this.host.style.forceCpuEdges!==!0,!t.nativeEdges&&this._needsEdgeDecoration(t))}),s=0,c=()=>{let e=performance.now();for(;s<o.length&&performance.now()-e<8;)this._ensureEdgeDecoration(o[s++]);s<o.length?setTimeout(c,0):this.host.requestRepaint()};c(),n?(this._setEdgeFade(0),this.host.animator.to(`style.edgeFade`,1,t)):this._setEdgeFade(1)}_setEdgeFade(e){this.host.uniforms.uEdgeFade&&(this.host.uniforms.uEdgeFade.value=e),this._syncEdgeStyle()}_disposeEdges(){for(let e of this.host.pickables.values())this._removeEdges(e.mesh)}async loadCreases(e){let t=await E_(e,this.host.authenticate,`creases`);if(!t.ok)throw Error(`[s3m] 棱线缓存加载失败: ${t.status} ${e}`);let n=await t.arrayBuffer(),r=new Float32Array(n);if(r.length<6)return;let i=new q;i.setAttribute(`position`,new G(r,3));let a=this.host.style,o=new nd({color:new W(a.edgeColor),transparent:!0,opacity:Math.min(1,Math.max(0,a.edgeOpacity??.6))*sC(a.opacity),depthWrite:!1}),s=new pd(i,o);s.renderOrder=2,s.frustumCulled=!1,s.raycast=()=>{},this.clearCreases(),this._creaseLines=s,this.host.scene?.add(s),this.host.requestRepaint()}clearCreases(){this._creaseLines&&(this.host.scene?.remove(this._creaseLines),this._creaseLines.geometry.dispose(),this._creaseLines.material?.dispose?.(),this._creaseLines=null,this.host.requestRepaint())}_syncEdgeStyle(){let e=this.host.style,t=this.host.uniforms.uEdgeFade?.value??1,n=Math.min(1,Math.max(0,e.edgeOpacity??.6))*sC(e.opacity)*t,r=this.edgeMaterial.uniforms;r.uColor.value.set(e.edgeColor),r.uWidth.value=Math.max(.1,e.edgeWidth??1.5),r.uOpacity.value=n,r.uOffset.value=this._modes.offset?Math.max(0,e.edgeOffset??.15):0;let i=this._hullStyleUniforms;if(i.uColor.value.set(e.edgeColor),i.uWidth.value=Math.max(0,e.edgeHullWidth??.9),i.uOpacity.value=n,this._creaseLines){let t=this._creaseLines.material;t.color.set(e.edgeColor),t.opacity=n}}_styleEdgeLine(e){let t=e.material;t&&t.color&&(t.color.set(this.host.style.edgeColor),t.opacity=(this.host.style.edgeOpacity??.6)*sC(this.host.style.opacity)*(this.host.uniforms.uEdgeFade?.value??1),t.transparent=!0,t.polygonOffset=!0,t.polygonOffsetFactor=-1,t.polygonOffsetUnits=-1,t.needsUpdate=!0)}_refreshEdgeLines(){this._syncEdgeStyle();for(let e of this._nativeLines)e.parent&&this._styleEdgeLine(e)}_datasetEdgesEnabled(e){let t=e.options?.enableEdges;return t===!0||t!==!1&&this._enabled}_shouldSkipAutoEdges(e,t){let n=`${e.skeletonName??``} ${t}`.toLowerCase();return cC.some(e=>n.includes(e))}_needsEdgeDecoration(e){return!!(this._modes.line&&!e.edges||this._modes.hull&&!e.edgeHull)}_ensureEdgeDecoration(e){this._modes.line&&this._ensureEdges(e),this._modes.hull&&this._ensureHull(e)}_ensureEdges(e){let t=e.userData;if(t.edges||t.nativeEdges||!e.geometry||this._shouldSkipAutoEdges(t,``))return;let n=e.geometry.getAttribute(`position`);if((e.geometry.index?.count??(n?n.count:0))>12e4)return;let r=nC(e.geometry,.005),i=this.host.style.edgeThreshold??55,a,o;if(this._modes.offset){let e=[];a=eC(r,null,i,e),e.length>0&&(o=new Float32Array(e))}else{let e=new nf(r,i),t=e.getAttribute(`position`);a=t?t.array:null,e.dispose()}if(r.dispose(),!a||a.length<6)return;let s=.005,c=XS(e.geometry,s),l;if(c){let e=a.length/6;l=new Float32Array(e);for(let t=0;t<e;t++){let e=t*6;l[t]=c.get(ZS(a[e],a[e+1],a[e+2],1/s))??-1}}let u=new hc(YS(a,l,o),this.createPerMeshEdgeMaterial(e));u.renderOrder=2,u.frustumCulled=!1,u.raycast=()=>{},u.userData.isThickEdge=!0,t.edges=u,e.add(u)}_ensureHull(e){let t=e.userData;if(t.edgeHull||!e.geometry||e.isInstancedMesh||this._shouldSkipAutoEdges(t,``))return;let n=Ab(this.host.uniforms,this.host.style.edgeHullWidth??.9,this._hullStyleUniforms,!0);n.uniforms.uSelWhole.value=1,n.uniforms.uSelBatch.value=-1;let r=oC(e);r?.userData?.uBatchTex&&(n.uniforms.uBatchTex.value=r.userData.uBatchTex.value,n.uniforms.uBatchTexWidth.value=r.userData.uBatchTexWidth.value,n.uniforms.uBatchTexActive.value=r.userData.uBatchTexActive.value);let i=new hc(e.geometry,n);i.renderOrder=2,i.frustumCulled=!1,i.raycast=()=>{},i.userData.isEdgeHull=!0,t.edgeHull=i,e.add(i)}_createSelectionEdgeMaterial(e){let t=oC(e),n=t?.userData?.uBatchTex?{uBatchTex:t.userData.uBatchTex,uBatchTex2:t.userData.uBatchTex2,uBatchMix:this.host.uniforms.uBatchMix,uBatchTexWidth:t.userData.uBatchTexWidth,uBatchTexActive:t.userData.uBatchTexActive,uPathTex:this.host.uniforms.uPathTex,uPathCount:this.host.uniforms.uPathCount,uPathTexActive:this.host.uniforms.uPathTexActive,uPathTime:this.host.uniforms.uPathTime}:void 0;return JS(this.lineShared,{},this._selEdgeStyleUniforms,n)}_removeEdges(e){let t=e.userData,n=t.edges;if(n){e.remove(n),n.geometry?.dispose();let r=n.material;Array.isArray(r)?r.forEach(e=>e?.dispose?.()):r?.dispose?.(),t.edges=null}let r=t.edgeHull;if(r){e.remove(r);let n=r.material;Array.isArray(n)?n.forEach(e=>e?.dispose?.()):n?.dispose?.(),t.edgeHull=null}}syncStyle(){this._syncEdgeStyle()}refreshLines(){this._refreshEdgeLines()}disposeEdgeGeometry(){this._disposeEdges()}ensureEdges(e){this._ensureEdges(e)}removeEdges(e){this._removeEdges(e)}createSelectionEdgeMaterial(e){return this._createSelectionEdgeMaterial(e)}};function uC(e){return e.isPoints===!0}sh(),w_(),tx(),mh();function dC(e){if(e==null)return null;if(typeof e==`number`){let t=Math.cos(e),n=Math.sin(e);return[t,-n,0,n,t,0,0,0,1]}if(Array.isArray(e)){if(e.length===3){let t=new es(e[0],e[1],e[2]),n=new U().makeRotationFromEuler(t).elements;return[n[0],n[4],n[8],n[1],n[5],n[9],n[2],n[6],n[10]]}if(e.length===4){let t=new go(e[0],e[1],e[2],e[3]),n=new U().makeRotationFromQuaternion(t).elements;return[n[0],n[4],n[8],n[1],n[5],n[9],n[2],n[6],n[10]]}}if(e instanceof es){let t=new U().makeRotationFromEuler(e).elements;return[t[0],t[4],t[8],t[1],t[5],t[9],t[2],t[6],t[10]]}if(e instanceof go){let t=new U().makeRotationFromQuaternion(e).elements;return[t[0],t[4],t[8],t[1],t[5],t[9],t[2],t[6],t[10]]}if(e instanceof V){let t=e.elements;return[t[0],t[3],t[6],t[1],t[4],t[7],t[2],t[5],t[8]]}if(e instanceof U){let t=e.elements;return[t[0],t[4],t[8],t[1],t[5],t[9],t[2],t[6],t[10]]}return null}function fC(e){if(e==null)return[0,0,0];if(typeof e==`number`)return[0,0,e];if(Array.isArray(e)){if(e.length===3)return[e[0],e[1],e[2]];if(e.length===4){let t=new go(e[0],e[1],e[2],e[3]),n=new es().setFromQuaternion(t);return[n.x,n.y,n.z]}}if(e instanceof es)return[e.x,e.y,e.z];if(e instanceof go){let t=new es().setFromQuaternion(e);return[t.x,t.y,t.z]}if(e instanceof V){let t=new U().set(e.elements[0],e.elements[3],e.elements[6],0,e.elements[1],e.elements[4],e.elements[7],0,e.elements[2],e.elements[5],e.elements[8],0,0,0,0,1),n=new es().setFromRotationMatrix(t);return[n.x,n.y,n.z]}if(e instanceof U){let t=new es().setFromRotationMatrix(e);return[t.x,t.y,t.z]}return[0,0,0]}function pC(e){let t=Array.isArray(e.material)?e.material[0]:e.material;return t?.userData?.isStyled?t:null}function mC(e,t){if(e.length<2)return e[0].clone();let n=Math.min(1,Math.max(0,t))*(e.length-1),r=Math.min(e.length-2,Math.floor(n));return e[r].clone().lerp(e[r+1],n-r)}function hC(e,t,n){if(n.keep&&!n.keep(e,t))return!1;if(n.values?.length){let t=e==null?``:String(e);if(!n.values.some(e=>String(e)===t))return!1}if(n.min!=null||n.max!=null){let t=Number(e);if(!Number.isFinite(t)||n.min!=null&&t<n.min||n.max!=null&&t>n.max)return!1}return!n.keep&&!n.values?.length&&n.min==null&&n.max==null?e!=null&&String(e)!==``:!0}function gC(e){if(!Number.isFinite(e))return`—`;let t=Math.abs(e);return t>=100?e.toFixed(0):t>=10?e.toFixed(1):e.toFixed(2)}var _C=class{constructor(e,t,n,r,i,a=()=>!1){X(this,`_getLayerFloorHeight`,void 0),X(this,`_triggerRepaint`,void 0),X(this,`_onStyleChanged`,void 0),X(this,`_getAllMeshes`,void 0),X(this,`_applyOverrideHook`,void 0),X(this,`_isLayerTransparent`,void 0),X(this,`featureStyles`,new Map),X(this,`thematicColors`,new Map),X(this,`thematicElevation`,new Map),X(this,`thematicField`,null),X(this,`elevationField`,null),X(this,`filter`,null),X(this,`fieldFilter`,null),X(this,`_meshBatchTextures`,new WeakMap),X(this,`_markedMeshes`,new Set),X(this,`_dirtyAll`,!1),X(this,`_flushScheduled`,!1),X(this,`_batchConflictWarned`,!1),this._getLayerFloorHeight=e,this._triggerRepaint=t,this._onStyleChanged=n,this._getAllMeshes=r,this._applyOverrideHook=i,this._isLayerTransparent=a}setFeatureStyle(e,t,n){this.featureStyles.set(e,t),this.markOverridesDirty(n),this._onStyleChanged(),this._triggerRepaint()}setFeaturesStyle(e,t,n){for(let n of e)this.featureStyles.set(n,t);this.markOverridesDirty(n),this._onStyleChanged(),this._triggerRepaint()}getFeatureStyle(e){return this.featureStyles.get(e)??null}getFeatureEffectiveOffset(e){if(e==null)return{};let t=this.featureStyles.get(e),n=t?.elevation??this.thematicElevation.get(e);return{translation:t?.translation,elevation:n,rotation:t?.rotation,pivot:t?.pivot}}getFeatureStyles(){return new Map(this.featureStyles)}removeFeatureStyle(e,t){this.featureStyles.delete(e)&&(this.markOverridesDirty(t),this._onStyleChanged(),this._triggerRepaint())}clearFeatureStyles(){this.featureStyles.size>0&&(this.featureStyles.clear(),this.markOverridesDirty(),this._onStyleChanged(),this._triggerRepaint())}setThematicColors(e,t=`custom`){this.thematicColors=e&&e.size>0?new Map(e):new Map,this.thematicField=this.thematicColors.size>0?t:null,this.markOverridesDirty(),this._triggerRepaint()}clearThematicColors(){this.thematicColors.size!==0&&(this.thematicColors=new Map,this.thematicField=null,this.markOverridesDirty(),this._triggerRepaint())}setThematicElevation(e,t=`custom`){this.thematicElevation=e&&e.size>0?new Map([...e].filter(([,e])=>Number.isFinite(e)&&e>0)):new Map,this.elevationField=this.thematicElevation.size>0?t:null,this.markOverridesDirty(),this._onStyleChanged(),this._triggerRepaint()}clearThematicElevation(){this.thematicElevation.size!==0&&(this.thematicElevation=new Map,this.elevationField=null,this.markOverridesDirty(),this._onStyleChanged(),this._triggerRepaint())}setFilter(e,t){this.filter=e,e&&(e.minHeight!=null||e.maxHeight!=null)?(t.uFilterMinZ&&(t.uFilterMinZ.value=e.minHeight??-99999),t.uFilterMaxZ&&(t.uFilterMaxZ.value=e.maxHeight??99999),t.uFilterHeightActive&&(t.uFilterHeightActive.value=1)):t.uFilterHeightActive&&(t.uFilterHeightActive.value=0),this.markOverridesDirty(),this._onStyleChanged(),this._triggerRepaint()}clearFilter(e){this.setFilter(null,e)}async colorByField(e,t,n){if(!t)throw Error(`[s3m] 未配置业务属性数据源,先调用 setAttributeSource() 或构造时传 attributes`);let r=e.smids?.length?[...new Set(e.smids)]:n;if(!r.length)return this.clearThematicColors(),{field:e.field,type:`discrete`,matched:0,missing:0,legend:[]};let i=await t.queryBySmids(r),a=[],o=[];for(let t of r){let n=i.get(t),r=n?n[e.field]:void 0;if(r==null||r===``)continue;let s=Number(r);Number.isFinite(s)?a.push({smid:t,val:s}):o.push({smid:t,val:String(r)})}let s=a.length>=o.length&&a.length>0,c=new Map,l=[],u=e.defaultColor??`#64748b`,d=e.nullColor??`#334155`;if(s){let t=a.map(e=>e.val),n=Math.min(...t),r=Math.max(...t)-n||1,i=(e.ramp??[`#3b82f6`,`#10b981`,`#f59e0b`,`#ef4444`]).map(e=>new W(e)),o=Math.max(2,e.stops??5);for(let e=0;e<o;e++){let t=e/o,a=(e+1)/o,s=mC(i,(t+a)/2),c=n+t*r,u=n+a*r;l.push({color:`#${s.getHexString()}`,label:`${gC(c)} ~ ${gC(u)}`,count:0,min:c,max:u})}for(let{smid:e,val:t}of a){let i=Math.min(1,Math.max(0,(t-n)/r)),a=Math.min(o-1,Math.floor(i*o)),s=l[a].color;c.set(e,s),l[a].count++}}else{let t=new Map;for(let{val:e}of o)t.set(e,(t.get(e)??0)+1);let n=[...t.entries()].sort((e,t)=>t[1]-e[1]),r=Array.isArray(e.colors)?e.colors:[`#3b82f6`,`#10b981`,`#f59e0b`,`#ef4444`,`#8b5cf6`,`#ec4899`,`#06b6d4`,`#84cc16`],i=!Array.isArray(e.colors)&&e.colors?e.colors:null;for(let e=0;e<n.length;e++){let[t,a]=n[e],o=i?.[t]??r[e%r.length];l.push({color:o,label:t,count:a})}let a=new Map(l.map(e=>[e.label,e.color]));for(let{smid:e,val:t}of o)c.set(e,a.get(t)??u)}let f=0;for(let e of r)c.has(e)||(c.set(e,d),f++);return f>0&&l.push({color:d,label:`无数据 / 缺失`,count:f}),this.setThematicColors(c,e.field),{field:e.field,type:s?`continuous`:`discrete`,matched:r.length-f,missing:f,legend:l}}async filterByField(e,t,n){if(!t)throw Error(`[s3m] 未配置业务属性数据源,先调用 setAttributeSource() 或构造时传 attributes`);let r=e.smids?.length?[...new Set(e.smids)]:n,i=e.mode??`keep`,a=e.onMissing??`drop`,o={field:e.field,mode:i,matched:0,hidden:[]};if(!r.length)return this.fieldFilter=null,this.markOverridesDirty(),o;let s=await t.queryBySmids(r),c=new Set;for(let t of r){let n=s.get(t);n?hC(n[e.field]??null,n,e)&&c.add(t):a===`keep`&&c.add(t)}o.matched=c.size;let l=i===`keep`;return this.fieldFilter=c.size||l?{field:e.field,mode:l?`keep`:`drop`,matched:c}:null,o.hidden=r.filter(e=>l?!c.has(e):c.has(e)),this.markOverridesDirty(),this._onStyleChanged(),this._triggerRepaint(),o}clearFieldFilter(){this.fieldFilter&&(this.fieldFilter=null,this.markOverridesDirty(),this._triggerRepaint())}async elevateByField(e,t,n){if(!t)throw Error(`[s3m] 未配置业务属性数据源,先调用 setAttributeSource() 或构造时传 attributes`);let r=e.smids?.length?[...new Set(e.smids)]:n,i={field:e.field,matched:0,missing:r.length,min:0,max:0,appliedMax:0};if(!r.length)return this.thematicElevation=new Map,this.elevationField=null,this.markOverridesDirty(),i;let a=await t.queryBySmids(r),o=new Map;for(let t of r){let n=Number(a.get(t)?.[e.field]);Number.isFinite(n)&&o.set(t,n)}if(o.size===0)return this.thematicElevation=new Map,this.elevationField=null,this.markOverridesDirty(),this._onStyleChanged(),this._triggerRepaint(),i;let s=[...o.values()],c=Math.min(...s),l=Math.max(...s),u=e.scale??1,d=e.offset??0,f=new Map,p=0;for(let[t,n]of o){let r=e.map?e.map(n,{min:c,max:l}):n*u+d;Number.isFinite(r)&&(e.max!=null&&r>e.max&&(r=e.max),!(r<=0)&&(f.set(t,r),r>p&&(p=r)))}return this.thematicElevation=f,this.elevationField=e.field,this.markOverridesDirty(),this._onStyleChanged(),this._triggerRepaint(),{field:e.field,matched:f.size,missing:r.length-o.size,min:c,max:l,appliedMax:p}}auditBatches(e){let t=[],n=new Set,r=0;for(let i of e){let e=i.mesh.userData.geoRef?.pickInfo;if(!e)continue;let a=new Map;for(let[t,n]of Object.entries(e)){let e=__(n);if(e<0)continue;let r=Number(t),i=a.get(e);i?i.push(r):a.set(e,[r])}r+=a.size;for(let[e,r]of a)if(!(r.length<2)){for(let e of r)n.add(e);t.push({datasetId:i.datasetId,batchId:e,smids:r})}}return{smids:0,batches:r,conflicts:t,conflictingSmids:n.size}}_bakeStylesIntoBuffer(e,t,n,r,i){let a=t;for(let t=0;t<a;t++){e[t*4+0]=-1,e[t*4+1]=-1,e[t*4+2]=-1,e[t*4+3]=0;let n=(a+t)*4;e[n+0]=0,e[n+1]=0,e[n+2]=0,e[n+3]=0;let r=(a*2+t)*4;e[r+0]=1,e[r+1]=0,e[r+2]=0,e[r+3]=0;let i=(a*3+t)*4;e[i+0]=0,e[i+1]=1,e[i+2]=0,e[i+3]=0;let o=(a*4+t)*4;e[o+0]=0,e[o+1]=0,e[o+2]=1,e[o+3]=0;let s=(a*5+t)*4;e[s+0]=-1,e[s+1]=0,e[s+2]=0,e[s+3]=0}let o=!1,s=new Set,c=new Map,l=new Map,u=new Map,d=new Map,f=new Map,p=new Map,m=new Map,h=new Map,g=this.filter,_=r.userData;for(let[e,t]of Object.entries(n)){let n=Number(e),o=__(t);if(o<0||o>=a)continue;h.set(o,(h.get(o)??0)+1);let v=!1;if(g&&(g.include&&g.include.length>0&&!g.include.includes(n)&&(v=!0),g.exclude&&g.exclude.length>0&&g.exclude.includes(n)&&(v=!0),g.predicate)){let{segments:e}=y_(_.geoRef,o),t=x_({smid:n,box:b_(r.geometry,e),triangles:0,floorHeight:this._getLayerFloorHeight()});g.predicate({...t,smid:n})||(v=!0)}if(v){s.add(o);continue}if(this.fieldFilter){let e=this.fieldFilter.matched.has(n);if(this.fieldFilter.mode===`keep`?!e:e){s.add(o);continue}}let y=i.get(n);if(y?.hidden){s.add(o);continue}let b=y?.opacity;if(b!=null){if(b<=0){s.add(o);continue}b<1&&!m.has(o)&&m.set(o,b)}let x=y?.color??this.thematicColors.get(n);x&&!c.has(o)&&c.set(o,x);let S=y?.elevation??this.thematicElevation.get(n);if(S!=null&&!l.has(o)&&l.set(o,S),y?.translation&&!u.has(o)&&u.set(o,y.translation),y?.rotation!=null&&!d.has(o)){let e=dC(y.rotation);e&&d.set(o,e)}y?.pivot&&!f.has(o)&&f.set(o,y.pivot),y?.gpuPath&&!p.has(o)&&p.set(o,y.gpuPath)}for(let t of s)e[t*4+3]=-1,o=!0;let v=new W;for(let[t,n]of c)s.has(t)||(v.set(n),e[t*4+0]=v.r,e[t*4+1]=v.g,e[t*4+2]=v.b,o=!0);for(let[t,n]of l){if(s.has(t))continue;e[t*4+3]=n;let r=(a+t)*4;e[r+2]=n,o=!0}for(let[t,n]of u){if(s.has(t))continue;let r=(a+t)*4;e[r+0]=n[0],e[r+1]=n[1],e[r+2]=n[2]+(l.get(t)??0),o=!0}let y=!1;for(let[t,n]of m)s.has(t)||(e[(a+t)*4+3]=n,o=!0,y=!0);for(let[t,n]of d){if(s.has(t))continue;let r=f.get(t)??[0,0,0],i=(a*2+t)*4;e[i+0]=n[0],e[i+1]=n[1],e[i+2]=n[2],e[i+3]=r[0];let c=(a*3+t)*4;e[c+0]=n[3],e[c+1]=n[4],e[c+2]=n[5],e[c+3]=r[1];let l=(a*4+t)*4;e[l+0]=n[6],e[l+1]=n[7],e[l+2]=n[8],e[l+3]=r[2],o=!0}for(let[t,n]of f)d.has(t)||s.has(t)||(e[(a*2+t)*4+3]=n[0],e[(a*3+t)*4+3]=n[1],e[(a*4+t)*4+3]=n[2],o=!0);for(let[t,n]of p){if(s.has(t))continue;let r=(a*5+t)*4;e[r+0]=n.pathId,e[r+1]=n.speed??0,e[r+2]=n.phase??0;let i=1;n.loop===`clamp`||n.loop===!1?i=2:n.loop===`pingpong`&&(i=3),n.autoHeading===!1&&(i+=3),e[r+3]=i,o=!0}let b=0;for(let[e,t]of h)t<2||(s.has(e)||c.has(e)||l.has(e)||d.has(e)||p.has(e))&&b++;return{hasActive:o,hasFade:y,conflicts:b}}applyOverridesToMesh(e){let t=pC(e);if(!t)return;let n=e.userData.geoRef?.pickInfo,r=this.featureStyles.size>0||this.thematicColors.size>0||this.thematicElevation.size>0,i=this.filter,a=this.fieldFilter!=null||i!=null&&((i.include?.length??0)>0||(i.exclude?.length??0)>0||i.predicate!=null);if(!r&&!a||!n||Object.keys(n).length===0){t.userData.uBatchTexActive&&(t.userData.uBatchTexActive.value=0),t.transparent&&!this._isLayerTransparent()&&kb(t,!1);return}let o=0;for(let e of Object.values(n)){let t=__(e);t>o&&(o=t)}let s=Math.max(o+1,1),c=this._meshBatchTextures.get(e);if(!c||c.width<s){let n=new Float32Array(s*6*4),r=new Du(n,s,6,fi,ii);r.minFilter=Hr,r.magFilter=Hr,c={texture:r,data:n,width:s},this._meshBatchTextures.set(e,c),t.userData.uBatchTex.value=r,t.userData.uBatchTexWidth.value=s}let{data:l,texture:u}=c,{hasActive:d,hasFade:f,conflicts:p}=this._bakeStylesIntoBuffer(l,c.width,n,e,this.featureStyles);f&&!t.transparent?t.transparent=!0:!f&&t.transparent&&!this._isLayerTransparent()&&kb(t,!1),p>0&&!this._batchConflictWarned&&(this._batchConflictWarned=!0,console.warn(`[s3m] 有 ${p} 个单体状态写不进独立的 batch(多个 SMID 共用同一个 batchId,\n S3M 的单体化粒度只到 batch,无法单独隐藏/改色其中一部分)。
|
|
4982
4982
|
当前规则:任一 SMID 需要隐藏则整批隐藏,颜色 / 抬高取首个。
|
|
4983
|
-
用 layer.auditBatches() 可以列出具体是哪些 SMID 共用了 batchId。`)),u.needsUpdate=!0,t.userData.uBatchTexActive&&(t.userData.uBatchTexActive.value=+!!d)}prepareCrossFade(e,t){for(let n of t){let t=pC(n);if(!t)continue;let r=n.userData.geoRef?.pickInfo;if(!r||Object.keys(r).length===0)continue;let i=0;for(let e of Object.values(r)){let t=__(e);t>i&&(i=t)}let a=Math.max(i+1,1),o=this._meshBatchTextures.get(n);if(!o||o.width<a){let e=new Float32Array(a*6*4),r=new Du(e,a,6,fi,ii);r.minFilter=Hr,r.magFilter=Hr,o={texture:r,data:e,width:a},this._meshBatchTextures.set(n,o),t.userData.uBatchTex.value=r,t.userData.uBatchTexWidth.value=a}if(!o.texture2||!o.data2||o.data2.length<o.width*6*4){let e=new Float32Array(o.width*6*4),t=new Du(e,o.width,6,fi,ii);t.minFilter=Hr,t.magFilter=Hr,o.data2=e,o.texture2=t}this._bakeStylesIntoBuffer(o.data,o.width,r,n,this.featureStyles),o.texture.needsUpdate=!0;let s=this._bakeStylesIntoBuffer(o.data2,o.width,r,n,e);o.texture2.needsUpdate=!0,t.userData.uBatchTex2.value=o.texture2,t.userData.uBatchTexActive.value=1,s.hasFade&&!t.transparent&&(t.transparent=!0)}}commitCrossFade(e,t){this.featureStyles.clear();for(let[t,n]of e)this.featureStyles.set(t,n);for(let e of t){let t=pC(e);if(!t)continue;let n=this._meshBatchTextures.get(e);n&&n.data2&&n.texture2&&(n.data.set(n.data2),n.texture.needsUpdate=!0,t.userData.uBatchTex2.value=t.userData.uBatchTex.value)}this._onStyleChanged(),this._triggerRepaint()}cancelCrossFade(e){for(let t of e){let e=pC(t);e&&(e.userData.uBatchTex2.value=e.userData.uBatchTex.value)}this._triggerRepaint()}markOverridesDirty(e,t){if(e)for(let t of e)this._markedMeshes.add(t);else if(t)for(let e of t)this._markedMeshes.add(e);else this._dirtyAll=!0,this._markedMeshes.clear();this._flushScheduled||(this._flushScheduled=!0,queueMicrotask(()=>this.flushOverrides()))}disposeMesh(e){this._markedMeshes.delete(e);let t=this._meshBatchTextures.get(e);t&&(t.texture.dispose(),t.texture2?.dispose(),this._meshBatchTextures.delete(e))}flushOverrides(){if(!this._flushScheduled&&!this._dirtyAll&&this._markedMeshes.size===0)return;this._flushScheduled=!1;let e=this._applyOverrideHook??(e=>this.applyOverridesToMesh(e));if(this._dirtyAll){this._dirtyAll=!1,this._markedMeshes.clear();let t=this._getAllMeshes?this._getAllMeshes():[];for(let n of t)e(n);this._triggerRepaint()}else{for(let t of this._markedMeshes)e(t);this._markedMeshes.clear(),this._triggerRepaint()}}bindGPUPath(e,t,n={},r){let i=this.getFeatureStyle(e)??{};this.setFeatureStyle(e,{...i,gpuPath:{pathId:t,speed:n.speed??0,phase:n.phase??0,loop:n.loop??`loop`,autoHeading:n.autoHeading??!0}},r)}unbindGPUPath(e,t){let n=this.getFeatureStyle(e);if(!n||!n.gpuPath)return;let r={...n};delete r.gpuPath,this.setFeatureStyle(e,r,t)}setGPUPathProgress(e,t,n){let r=this.getFeatureStyle(e);r?.gpuPath&&this.setFeatureStyle(e,{...r,gpuPath:{...r.gpuPath,speed:0,phase:Math.min(1,Math.max(0,t))}},n)}};sh(),w_(),Ux(),mh();var vC=65534,yC=class{constructor(e){X(this,`host`,void 0),X(this,`pickables`,new Map),X(this,`_pickSeq`,0),X(this,`_freePickIds`,[]),this.host=e}allocPickId(){let e=this._freePickIds.pop();if(e!==void 0)return e;if(this._pickSeq>vC){for(let e=0;e<=vC;e++)if(!this.pickables.has(e))return e;throw Error(`[s3m] 可拾取网格超过 65535 个,2 字节 ID 编码不够用`)}return this._pickSeq++}releasePickId(e){this._freePickIds.push(e)}meshes(){let e=[];for(let t of this.pickables.values())e.push(t.mesh);return e}clear(){this.pickables.clear(),this._freePickIds.length=0,this._pickSeq=0}getRayAt(e,t){if(!this.host.camera||!this.host.canvas)return null;let n=this.host.canvas,r=n.clientWidth||n.width,i=n.clientHeight||n.height;if(!r||!i)return null;let a=e/r*2-1,o=-(t/i)*2+1,s=new H(a,o,-1).unproject(this.host.camera),c=new H(a,o,1).unproject(this.host.camera).clone().sub(s).normalize();return new Wo(s,c)}intersectMeshAtRay(e,t,n){let r=new bm;r.ray.copy(t);let i=r.intersectObject(e,!1);if(!i.length)return null;if(n!=null){let e=i.find(e=>e.instanceId===n);return e?e.point:i[0].point}return i[0].point}buildPickResult(e,t,n,r){let i=t.mesh.userData;if(i.isGaussianSplat)return this.buildSplatPickResult(e,t,n,r);let a=null,o=e.batchId,s=e.instanceIndex,c=i.geoRef,l=[];if(s!=null){let e=this.instanceFeature(t.mesh,c,s);if(!e)return null;a=e.smid,o=e.batchId}else{c=i.geoByBatchId?.get(e.batchId)??i.geoRef;let t=y_(c,e.batchId);a=t.smid,l=t.segments}if(this.host.isFeatureHidden(a,o))return null;let u=null,d=0;if(s!=null)u=this.instanceBox(t.mesh,s),d=t.mesh.geometry.index?Math.round(t.mesh.geometry.index.count/3):0;else if(a!=null&&this.host.smidMeshes.has(a)){let e=this.host.smidMeshes.get(a),t=1/0,n=1/0,r=1/0,i=-1/0,o=-1/0,s=-1/0,c=0;for(let l of e){let e=l.userData,u=e.geoRef?.pickInfo,f=u?.[a]??u?.[String(a)],p=f?__(f):-1,m=f?.segments??(p>=0?y_(e.geoRef,p).segments:[]),h=b_(l.geometry,m);h&&(h.minX<t&&(t=h.minX),h.minY<n&&(n=h.minY),h.minZ<r&&(r=h.minZ),h.maxX>i&&(i=h.maxX),h.maxY>o&&(o=h.maxY),h.maxZ>s&&(s=h.maxZ),c+=h.count,d+=h.triangles)}c>0&&(u={minX:t,minY:n,minZ:r,maxX:i,maxY:o,maxZ:s,count:c,triangles:d})}if(!u&&(u=b_(t.mesh.geometry,l),!u&&t.mesh.geometry)){t.mesh.geometry.boundingBox||t.mesh.geometry.computeBoundingBox();let e=t.mesh.geometry.boundingBox;e&&(u={minX:e.min.x,maxX:e.max.x,minY:e.min.y,maxY:e.max.y,minZ:e.min.z,maxZ:e.max.z,count:0,triangles:0})}let f=t.mesh.geometry,p=d>0?d:f.index?Math.round(f.index.count/3):0,m=x_({smid:a,box:u,triangles:p,floorHeight:this.host.style.floorHeight}),h=null;if(u&&this.host.sceneAnchor){let e=new H((u.minX+u.maxX)/2,(u.minY+u.maxY)/2,(u.minZ+u.maxZ)/2);e.applyMatrix4(t.mesh.matrixWorld);let n=this.host.sceneAnchor.meterInMercator;h=this.host.lngLatFromWorld(e.x*n+this.host.sceneAnchor.x,-e.y*n+this.host.sceneAnchor.y)}let g=n??null;!g&&r&&(g=this.intersectMeshAtRay(t.mesh,r,s));let _=null,v=null,y=null;if(g&&this.host.sceneAnchor){let e=a==null?{}:this.host.featureStyleManager.getFeatureEffectiveOffset(a),t=e.translation,n=e.elevation,r=g.clone();if(e.rotation){let t=dC(e.rotation);if(t){let n=new V().set(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8]),i=e.pivot?new H(e.pivot[0],e.pivot[1],e.pivot[2]):new H(0,0,0);r.sub(i).applyMatrix3(n).add(i)}}t?r.add(new H(t[0],t[1],t[2])):n&&(r.z+=n),_=[r.x,r.y,r.z];let i=this.host.sceneAnchor.meterInMercator;v=this.host.lngLatFromWorld(r.x*i+this.host.sceneAnchor.x,-r.y*i+this.host.sceneAnchor.y),y=r.z+(this.host.sceneAnchor.altitude??0)}else h&&u&&this.host.sceneAnchor&&(v=h,y=(u.minZ+u.maxZ)/2+(this.host.sceneAnchor.altitude??0));return{datasetId:t.datasetId,datasetName:this.host.datasets.get(t.datasetId)?.name??t.datasetId,objectId:e.objectId,batchId:o,instanceIndex:s,skeletonName:t.skeletonName,centerLngLat:h,point:_,lngLat:v,altitude:y,...m,mesh:t.mesh}}buildSplatPickResult(e,t,n,r){let i=this.host.sceneAnchor;if(!i)return null;let a=t.mesh,o=n??null;!o&&r&&(o=this.intersectMeshAtRay(a,r));let s=Rx(a.geometry),c=s?{minX:s.minX,minY:s.minY,minZ:s.minZ,maxX:s.maxX,maxY:s.maxY,maxZ:s.maxZ,count:s.count,triangles:0}:null,l=x_({smid:null,box:c,triangles:0,floorHeight:this.host.style.floorHeight}),u=i.meterInMercator,d=null,f=null,p=null,m=null;if(o)d=[o.x,o.y,o.z],f=this.host.lngLatFromWorld(o.x*u+i.x,-o.y*u+i.y),p=o.z+(i.altitude??0),m=f;else if(c){let e=new H((c.minX+c.maxX)/2,(c.minY+c.maxY)/2,(c.minZ+c.maxZ)/2).applyMatrix4(a.matrixWorld);m=this.host.lngLatFromWorld(e.x*u+i.x,-e.y*u+i.y),p=e.z+(i.altitude??0)}return{datasetId:t.datasetId,datasetName:this.host.datasets.get(t.datasetId)?.name??t.datasetId,objectId:e.objectId,batchId:-1,instanceIndex:void 0,skeletonName:t.skeletonName,centerLngLat:m,point:d,lngLat:f,altitude:p,...l,mesh:a}}pick(e,t){if(!this.host.picker||!this.host.scene||!this.host.camera||!this.host.sceneAnchor)return null;let n=this.host.picker.pick(this.host.scene,this.host.camera,e,t);if(!n)return null;let r=this.pickables.get(n.objectId);if(!r)return null;let i=this.getRayAt(e,t);return this.buildPickResult(n,r,void 0,i??void 0)}pickPosition(e,t){if(!this.host.camera||!this.host.sceneAnchor)return null;let n=this.pick(e,t);if(n?.point&&n?.lngLat&&n.altitude!=null)return{lngLat:n.lngLat,altitude:n.altitude,point:n.point};let r=this.getRayAt(e,t);if(!r)return null;let i=new Pc(new H(0,0,1),0),a=new H,o=r.intersectPlane(i,a);if(o){let e=this.host.sceneAnchor.meterInMercator;return{lngLat:this.host.lngLatFromWorld(o.x*e+this.host.sceneAnchor.x,-o.y*e+this.host.sceneAnchor.y),altitude:o.z+(this.host.sceneAnchor.altitude??0),point:[o.x,o.y,o.z]}}return null}drillPick(e,t,n=10){if(!this.host.sceneAnchor||!this.host.camera)return[];let r=this.getRayAt(e,t);if(!r)return[];let i=new bm;i.ray.copy(r);let a=[...this.pickables.values()].map(e=>e.mesh).filter(e=>{let t=e;for(;t;){if(!t.visible)return!1;t=t.parent}return!0}),o=i.intersectObjects(a,!1);if(!o.length)return[];let s=[],c=new Set,l=new Set;for(let e of o){if(s.length>=n)break;let t=e.object,r=t.userData;if(r.pickId==null)continue;let i=this.pickables.get(r.pickId);if(!i)continue;let a=null,o=-1,u=e.instanceId;if(u!=null){let e=this.instanceFeature(t,r.geoRef,u);if(!e)continue;a=e.smid,o=e.batchId}else if(e.faceIndex!=null){let n=t.geometry.attributes.aBatchId;if(n){let i=t.geometry.index?t.geometry.index.getX(e.faceIndex*3):e.faceIndex*3;o=Math.round(n.getX(i)),a=y_(r.geoByBatchId?.get(o)??r.geoRef,o).smid}}if(a!=null){if(c.has(a))continue;c.add(a)}else{let e=`${r.pickId}:${o}:${u??-1}`;if(l.has(e))continue;l.add(e)}if(this.host.isFeatureHidden(a,o))continue;let d={objectId:r.pickId,batchId:o,instanceIndex:u},f=this.buildPickResult(d,i,e.point);f&&s.push(f)}return s}getFeatureBounds(e){if(!this.host.sceneAnchor)return null;let t=1/0,n=-1/0,r=1/0,i=-1/0,a=!1;for(let o of this.pickables.values()){let s=o.mesh,c=s.userData,l=c.geoRef,u=l?.pickInfo;if(!u)continue;let d=null;if(s.isInstancedMesh){let t=c.instanceLookup;t||(t=v_(u),c.instanceLookup=t);for(let[n,r]of t)if(r.smid===e){d=this.instanceBox(s,n);break}}else{let t=u,n=t[e]??t[String(e)];if(n){let e=y_(l,__(n));if(d=b_(s.geometry,e.segments),!d&&s.geometry){s.geometry.boundingBox||s.geometry.computeBoundingBox();let e=s.geometry.boundingBox;e&&(d={minX:e.min.x,maxX:e.max.x,minY:e.min.y,maxY:e.max.y,minZ:e.min.z,maxZ:e.max.z,count:0,triangles:0})}}}if(d){a=!0;let o=[new H(d.minX,d.minY,d.minZ),new H(d.maxX,d.minY,d.minZ),new H(d.minX,d.maxY,d.minZ),new H(d.maxX,d.maxY,d.minZ),new H(d.minX,d.minY,d.maxZ),new H(d.maxX,d.minY,d.maxZ),new H(d.minX,d.maxY,d.maxZ),new H(d.maxX,d.maxY,d.maxZ)],c=e==null?{}:this.host.featureStyleManager.getFeatureEffectiveOffset(e),l=c.translation,u=c.elevation,f=c.rotation?dC(c.rotation):null,p=null,m=null;f&&(p=new V().set(f[0],f[1],f[2],f[3],f[4],f[5],f[6],f[7],f[8]),m=c.pivot?new H(c.pivot[0],c.pivot[1],c.pivot[2]):new H(0,0,0));let h=e==null?null:this.host.gpuPathPoseAt(e),g=null;if(h&&h.yaw!==0){let e=Math.cos(h.yaw),t=Math.sin(h.yaw);g=new V().set(e,-t,0,t,e,0,0,0,1)}for(let e of o){if(p&&m&&e.sub(m).applyMatrix3(p).add(m),g){let t=m??new H(0,0,0);e.sub(t).applyMatrix3(g).add(t)}l?e.add(new H(l[0],l[1],l[2])):u&&(e.z+=u),h&&e.add(new H(h.pos[0],h.pos[1],h.pos[2])),e.applyMatrix4(s.matrixWorld);let a=this.host.sceneAnchor.meterInMercator,[o,c]=this.host.lngLatFromWorld(e.x*a+this.host.sceneAnchor.x,-e.y*a+this.host.sceneAnchor.y);o<t&&(t=o),o>n&&(n=o),c<r&&(r=c),c>i&&(i=c)}}}return a?[[t,r],[n,i]]:null}instanceFeature(e,t,n){let r=e.userData;return r.instanceLookup||(r.instanceLookup=v_(t?.pickInfo)),r.instanceLookup.get(n)??null}instanceBox(e,t){let n=e;if(!n.isInstancedMesh)return null;let r=e.geometry;r.boundingBox||r.computeBoundingBox();let i=r.boundingBox;if(!i)return null;let a=new U;n.getMatrixAt(t,a);let o=i.clone().applyMatrix4(a);return{minX:o.min.x,minY:o.min.y,minZ:o.min.z,maxX:o.max.x,maxY:o.max.y,maxZ:o.max.z,count:r.getAttribute(`position`)?.count??0,triangles:r.index?Math.round(r.index.count/3):0}}};sh(),w_(),mh();function bC(e){let t=Array.isArray(e.material)?e.material[0]:e.material;return t?.userData?.isStyled?t:null}function xC(e){let t=e??1;return t<0?0:t>1?1:t}function SC(e){return e.isPoints===!0}var CC=class{constructor(e){X(this,`host`,void 0),X(this,`selection`,null),X(this,`selectedMeshes`,[]),X(this,`_outlineMeshes`,[]),X(this,`_selectionEdgeMeshes`,[]),this.host=e}get selectionEdgeMeshes(){return this._selectionEdgeMeshes}reset(){this.selection=null,this.selectedMeshes=[],this._outlineMeshes=[],this._selectionEdgeMeshes=[]}select(e,{silent:t=!1}={}){if(this.selection){for(let e of this.selectedMeshes){if(SC(e)){this.host.applyPointCloudStyle(e,!1);continue}let t=bC(e);t&&(t.userData.uSelBatch.value=-1,t.userData.uSelWhole.value=0)}this.selectedMeshes=[],this.clearDecoration(),this.selection=null}if(!e){this.host.uniforms.uSelMix.value=0,this.host.uniforms.uDim.value=0,this.host.outlineMaterial.uniforms.uSelBatch.value=-1,this.host.outlineMaterial.uniforms.uSelWhole.value=0,this.host.outlineMaterial.uniforms.uElevation.value=0,this.host.requestRepaint(),t||this.host.onPick(null);return}this.selection=e;let n=new Set;if(e.smid!=null){let t=this.host.smidMeshes.get(e.smid);if(t)for(let e of t)n.add(e)}n.add(e.mesh);for(let t of n){let n=bC(t);if(!n)continue;let r=e.batchId;if(e.instanceIndex!=null&&t===e.mesh)r=e.batchId;else if(e.smid!=null){let n=t.userData.geoRef?.pickInfo,i=n?.[e.smid]??n?.[String(e.smid)],a=i?__(i):-1;r=a>=0?a:t===e.mesh?e.batchId:-1}n.userData.uSelBatch.value=r,n.userData.uSelWhole.value=+(r<0),this.selectedMeshes.push(t)}for(let e of this.selectedMeshes)SC(e)&&this.host.applyPointCloudStyle(e,!0);if(this.host.uniforms.uSelMix.value=1,this.host.uniforms.uDim.value=+!!this.host.style.dimOthers,this.host.style.outline){let t=[...n].filter(e=>!SC(e));t.length&&((this.host.style.outlineStyle??`edges`)===`edges`?this.addSelectionEdges(e,t):this.addSelectionHull(e,t))}this.host.requestRepaint()}addSelectionEdges(e,t){this.syncStyle();for(let n of t){let t=n.userData,r=t.geoRef,i=[],a=-1;if(n===e.mesh&&e.instanceIndex!=null){i=[{vertexOffset:0,vertexCount:n.geometry.getAttribute(`position`)?.count??0}];let t=r?.pickInfo,o=t?.[e.smid??``]??t?.[String(e.smid)];a=o?__(o):-1}else if(e.smid!=null){let t=r?.pickInfo,n=t?.[e.smid]??t?.[String(e.smid)],o=n?__(n):-1;a=o,i=n?.segments??(o>=0?y_(r,o).segments:[])}else n===e.mesh&&(i=y_(t.geoByBatchId?.get(e.batchId)??r,e.batchId).segments,a=e.batchId);let o=eC(n.geometry,i);if(o&&o.length>0){let t=a>=0?new Float32Array(o.length/6).fill(a):void 0,r=new hc(YS(o,t),this.host.createSelectionEdgeMaterial(n));r.renderOrder=4,r.frustumCulled=!1,r.raycast=()=>{},r.userData.isSelectionEdge=!0,n===e.mesh&&e.instanceIndex!=null&&this.applyInstanceTransform(r,e),n.add(r),this._selectionEdgeMeshes.push(r)}}this._selectionEdgeMeshes.length===0&&this.addSelectionHull(e,t)}applyInstanceTransform(e,t){let n=t.mesh;if(t.instanceIndex==null||!n.isInstancedMesh)return;let r=new U;n.getMatrixAt(t.instanceIndex,r),r.decompose(e.position,e.quaternion,e.scale)}addSelectionHull(e,t){let n=e.instanceIndex!=null;this.host.outlineMaterial.uniforms.uSelBatch.value=n?-1:e.batchId,this.host.outlineMaterial.uniforms.uSelWhole.value=n||e.batchId<0?1:0,this.host.outlineMaterial.uniforms.uElevation.value=n?this.selectionElevation(e):this.host.style.selectElevation??0;for(let n of t){let t=bC(n);t?.userData?.uBatchTex&&(this.host.outlineMaterial.uniforms.uBatchTex.value=t.userData.uBatchTex.value,this.host.outlineMaterial.uniforms.uBatchTexWidth.value=t.userData.uBatchTexWidth.value,this.host.outlineMaterial.uniforms.uBatchTexActive.value=t.userData.uBatchTexActive.value);let r=new hc(n.geometry,this.host.outlineMaterial);r.renderOrder=3,r.frustumCulled=!1,r.raycast=()=>{},n===e.mesh&&e.instanceIndex!=null&&this.applyInstanceTransform(r,e),n.add(r),this._outlineMeshes.push(r)}}syncStyle(){let e=this.host.style,t=this.host.selectionEdgeMaterial.uniforms;t.uColor.value.set(e.outlineColor??e.selectColor),t.uWidth.value=Math.max(.1,e.outlineWidthPx??3),t.uOpacity.value=xC(e.opacity),t.uElevation&&(t.uElevation.value=e.selectElevation??0);for(let e of this._outlineMeshes){let t=e.parent,n=t?bC(t)?.userData:null;n?.uBatchTex&&(this.host.outlineMaterial.uniforms.uBatchTex.value=n.uBatchTex.value,this.host.outlineMaterial.uniforms.uBatchTexWidth.value=n.uBatchTexWidth.value,this.host.outlineMaterial.uniforms.uBatchTexActive.value=n.uBatchTexActive.value)}}selectionElevation(e){let t=this.host.style.selectElevation??0;if(e.smid!=null){let n=this.host.featureStyleManager.getFeatureEffectiveOffset(e.smid);n.elevation&&(t+=n.elevation)}return t}clearDecoration(){for(let e of this._outlineMeshes)e.parent?.remove(e);this._outlineMeshes=[];for(let e of this._selectionEdgeMeshes)e.parent?.remove(e),e.geometry.dispose();this._selectionEdgeMeshes=[]}isMeshCoveringSelection(e,t){if(!t.point)return!1;let n=e.geometry;if(!n||(n.boundingBox||n.computeBoundingBox(),!n.boundingBox))return!1;let r=new H(t.point[0],t.point[1],t.point[2]);e.updateWorldMatrix(!0,!1);let i=e.matrixWorld.clone().invert(),a=r.applyMatrix4(i);return n.boundingBox.clone().expandByScalar(.5).containsPoint(a)}replayOnto(e){let t=this.selection;if(!t)return;let n=bC(e);if(!n)return;let r=e.userData,i=-1;if(t.smid!=null){let e=r.geoRef?.pickInfo,n=e?.[t.smid]??e?.[String(t.smid)];i=n?__(n):-1}if(e===t.mesh&&(i=t.batchId),i<0&&e!==t.mesh){if(t.smid==null&&r.datasetId===t.datasetId&&this.isMeshCoveringSelection(e,t))i=-1;else return}n.userData.uSelBatch.value=i,n.userData.uSelWhole.value=+(i<0),this.selectedMeshes.includes(e)||this.selectedMeshes.push(e),SC(e)&&this.host.applyPointCloudStyle(e,!0),this.host.uniforms.uSelMix.value=1,this.host.uniforms.uDim.value=+!!this.host.style.dimOthers}};sh(),tx();var wC=2;function TC(e){return e===jb.SOLID?`solid`:e===jb.HEIGHT?`height`:`vertex`}var EC=`
|
|
4983
|
+
用 layer.auditBatches() 可以列出具体是哪些 SMID 共用了 batchId。`)),u.needsUpdate=!0,t.userData.uBatchTexActive&&(t.userData.uBatchTexActive.value=+!!d)}prepareCrossFade(e,t){for(let n of t){let t=pC(n);if(!t)continue;let r=n.userData.geoRef?.pickInfo;if(!r||Object.keys(r).length===0)continue;let i=0;for(let e of Object.values(r)){let t=__(e);t>i&&(i=t)}let a=Math.max(i+1,1),o=this._meshBatchTextures.get(n);if(!o||o.width<a){let e=new Float32Array(a*6*4),r=new Du(e,a,6,fi,ii);r.minFilter=Hr,r.magFilter=Hr,o={texture:r,data:e,width:a},this._meshBatchTextures.set(n,o),t.userData.uBatchTex.value=r,t.userData.uBatchTexWidth.value=a}if(!o.texture2||!o.data2||o.data2.length<o.width*6*4){let e=new Float32Array(o.width*6*4),t=new Du(e,o.width,6,fi,ii);t.minFilter=Hr,t.magFilter=Hr,o.data2=e,o.texture2=t}this._bakeStylesIntoBuffer(o.data,o.width,r,n,this.featureStyles),o.texture.needsUpdate=!0;let s=this._bakeStylesIntoBuffer(o.data2,o.width,r,n,e);o.texture2.needsUpdate=!0,t.userData.uBatchTex2.value=o.texture2,t.userData.uBatchTexActive.value=1,s.hasFade&&!t.transparent&&(t.transparent=!0)}}commitCrossFade(e,t){this.featureStyles.clear();for(let[t,n]of e)this.featureStyles.set(t,n);for(let e of t){let t=pC(e);if(!t)continue;let n=this._meshBatchTextures.get(e);n&&n.data2&&n.texture2&&(n.data.set(n.data2),n.texture.needsUpdate=!0,t.userData.uBatchTex2.value=t.userData.uBatchTex.value)}this._onStyleChanged(),this._triggerRepaint()}cancelCrossFade(e){for(let t of e){let e=pC(t);e&&(e.userData.uBatchTex2.value=e.userData.uBatchTex.value)}this._triggerRepaint()}markOverridesDirty(e,t){if(e)for(let t of e)this._markedMeshes.add(t);else if(t)for(let e of t)this._markedMeshes.add(e);else this._dirtyAll=!0,this._markedMeshes.clear();this._flushScheduled||(this._flushScheduled=!0,queueMicrotask(()=>this.flushOverrides()))}disposeMesh(e){this._markedMeshes.delete(e);let t=this._meshBatchTextures.get(e);t&&(t.texture.dispose(),t.texture2?.dispose(),this._meshBatchTextures.delete(e))}flushOverrides(){if(!this._flushScheduled&&!this._dirtyAll&&this._markedMeshes.size===0)return;this._flushScheduled=!1;let e=this._applyOverrideHook??(e=>this.applyOverridesToMesh(e));if(this._dirtyAll){this._dirtyAll=!1,this._markedMeshes.clear();let t=this._getAllMeshes?this._getAllMeshes():[];for(let n of t)e(n);this._triggerRepaint()}else{for(let t of this._markedMeshes)e(t);this._markedMeshes.clear(),this._triggerRepaint()}}bindGPUPath(e,t,n={},r){let i=this.getFeatureStyle(e)??{};this.setFeatureStyle(e,{...i,gpuPath:{pathId:t,speed:n.speed??0,phase:n.phase??0,loop:n.loop??`loop`,autoHeading:n.autoHeading??!0}},r)}unbindGPUPath(e,t){let n=this.getFeatureStyle(e);if(!n||!n.gpuPath)return;let r={...n};delete r.gpuPath,this.setFeatureStyle(e,r,t)}setGPUPathProgress(e,t,n){let r=this.getFeatureStyle(e);r?.gpuPath&&this.setFeatureStyle(e,{...r,gpuPath:{...r.gpuPath,speed:0,phase:Math.min(1,Math.max(0,t))}},n)}};sh(),w_(),Ux(),mh();var vC=65534,yC=class{constructor(e){X(this,`host`,void 0),X(this,`pickables`,new Map),X(this,`_pickSeq`,0),X(this,`_freePickIds`,[]),this.host=e}allocPickId(){let e=this._freePickIds.pop();if(e!==void 0)return e;if(this._pickSeq>vC){for(let e=0;e<=vC;e++)if(!this.pickables.has(e))return e;throw Error(`[s3m] 可拾取网格超过 65535 个,2 字节 ID 编码不够用`)}return this._pickSeq++}releasePickId(e){this._freePickIds.push(e)}meshes(){let e=[];for(let t of this.pickables.values())e.push(t.mesh);return e}clear(){this.pickables.clear(),this._freePickIds.length=0,this._pickSeq=0}getRayAt(e,t){if(!this.host.camera||!this.host.canvas)return null;let n=this.host.canvas,r=n.clientWidth||n.width,i=n.clientHeight||n.height;if(!r||!i)return null;let a=e/r*2-1,o=-(t/i)*2+1,s=new H(a,o,-1).unproject(this.host.camera),c=new H(a,o,1).unproject(this.host.camera).clone().sub(s).normalize();return new Wo(s,c)}intersectMeshAtRay(e,t,n){let r=new bm;r.ray.copy(t);let i=r.intersectObject(e,!1);if(!i.length)return null;if(n!=null){let e=i.find(e=>e.instanceId===n);return e?e.point:i[0].point}return i[0].point}buildPickResult(e,t,n,r){let i=t.mesh.userData;if(i.isGaussianSplat)return this.buildSplatPickResult(e,t,n,r);let a=null,o=e.batchId,s=e.instanceIndex,c=i.geoRef,l=[];if(s!=null){let e=this.instanceFeature(t.mesh,c,s);if(!e)return null;a=e.smid,o=e.batchId}else{c=i.geoByBatchId?.get(e.batchId)??i.geoRef;let t=y_(c,e.batchId);a=t.smid,l=t.segments}if(this.host.isFeatureHidden(a,o))return null;let u=null,d=0;if(s!=null)u=this.instanceBox(t.mesh,s),d=t.mesh.geometry.index?Math.round(t.mesh.geometry.index.count/3):0;else if(a!=null&&this.host.smidMeshes.has(a)){let e=this.host.smidMeshes.get(a),t=1/0,n=1/0,r=1/0,i=-1/0,o=-1/0,s=-1/0,c=0;for(let l of e){let e=l.userData,u=e.geoRef?.pickInfo,f=u?.[a]??u?.[String(a)],p=f?__(f):-1,m=f?.segments??(p>=0?y_(e.geoRef,p).segments:[]),h=b_(l.geometry,m);h&&(h.minX<t&&(t=h.minX),h.minY<n&&(n=h.minY),h.minZ<r&&(r=h.minZ),h.maxX>i&&(i=h.maxX),h.maxY>o&&(o=h.maxY),h.maxZ>s&&(s=h.maxZ),c+=h.count,d+=h.triangles)}c>0&&(u={minX:t,minY:n,minZ:r,maxX:i,maxY:o,maxZ:s,count:c,triangles:d})}if(!u&&(u=b_(t.mesh.geometry,l),!u&&t.mesh.geometry)){t.mesh.geometry.boundingBox||t.mesh.geometry.computeBoundingBox();let e=t.mesh.geometry.boundingBox;e&&(u={minX:e.min.x,maxX:e.max.x,minY:e.min.y,maxY:e.max.y,minZ:e.min.z,maxZ:e.max.z,count:0,triangles:0})}let f=t.mesh.geometry,p=d>0?d:f.index?Math.round(f.index.count/3):0,m=x_({smid:a,box:u,triangles:p,floorHeight:this.host.style.floorHeight}),h=null;if(u&&this.host.sceneAnchor){let e=new H((u.minX+u.maxX)/2,(u.minY+u.maxY)/2,(u.minZ+u.maxZ)/2);e.applyMatrix4(t.mesh.matrixWorld);let n=this.host.sceneAnchor.meterInMercator;h=this.host.lngLatFromWorld(e.x*n+this.host.sceneAnchor.x,-e.y*n+this.host.sceneAnchor.y)}let g=n??null;!g&&r&&(g=this.intersectMeshAtRay(t.mesh,r,s));let _=null,v=null,y=null;if(g&&this.host.sceneAnchor){let e=a==null?{}:this.host.featureStyleManager.getFeatureEffectiveOffset(a),t=e.translation,n=e.elevation,r=g.clone();if(e.rotation){let t=dC(e.rotation);if(t){let n=new V().set(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8]),i=e.pivot?new H(e.pivot[0],e.pivot[1],e.pivot[2]):new H(0,0,0);r.sub(i).applyMatrix3(n).add(i)}}t?r.add(new H(t[0],t[1],t[2])):n&&(r.z+=n),_=[r.x,r.y,r.z];let i=this.host.sceneAnchor.meterInMercator;v=this.host.lngLatFromWorld(r.x*i+this.host.sceneAnchor.x,-r.y*i+this.host.sceneAnchor.y),y=r.z+(this.host.sceneAnchor.altitude??0)}else h&&u&&this.host.sceneAnchor&&(v=h,y=(u.minZ+u.maxZ)/2+(this.host.sceneAnchor.altitude??0));return{datasetId:t.datasetId,datasetName:this.host.datasets.get(t.datasetId)?.name??t.datasetId,objectId:e.objectId,batchId:o,instanceIndex:s,skeletonName:t.skeletonName,centerLngLat:h,point:_,lngLat:v,altitude:y,...m,mesh:t.mesh}}buildSplatPickResult(e,t,n,r){let i=this.host.sceneAnchor;if(!i)return null;let a=t.mesh,o=n??null;!o&&r&&(o=this.intersectMeshAtRay(a,r));let s=Rx(a.geometry),c=s?{minX:s.minX,minY:s.minY,minZ:s.minZ,maxX:s.maxX,maxY:s.maxY,maxZ:s.maxZ,count:s.count,triangles:0}:null,l=x_({smid:null,box:c,triangles:0,floorHeight:this.host.style.floorHeight}),u=i.meterInMercator,d=null,f=null,p=null,m=null;if(o)d=[o.x,o.y,o.z],f=this.host.lngLatFromWorld(o.x*u+i.x,-o.y*u+i.y),p=o.z+(i.altitude??0),m=f;else if(c){let e=new H((c.minX+c.maxX)/2,(c.minY+c.maxY)/2,(c.minZ+c.maxZ)/2).applyMatrix4(a.matrixWorld);m=this.host.lngLatFromWorld(e.x*u+i.x,-e.y*u+i.y),p=e.z+(i.altitude??0)}return{datasetId:t.datasetId,datasetName:this.host.datasets.get(t.datasetId)?.name??t.datasetId,objectId:e.objectId,batchId:-1,instanceIndex:void 0,skeletonName:t.skeletonName,centerLngLat:m,point:d,lngLat:f,altitude:p,...l,mesh:a}}pick(e,t){if(!this.host.picker||!this.host.scene||!this.host.camera||!this.host.sceneAnchor)return null;let n=this.host.picker.pick(this.host.scene,this.host.camera,e,t);if(!n)return null;let r=this.pickables.get(n.objectId);if(!r)return null;let i=this.getRayAt(e,t);return this.buildPickResult(n,r,void 0,i??void 0)}pickPosition(e,t){if(!this.host.camera||!this.host.sceneAnchor)return null;let n=this.pick(e,t);if(n?.point&&n?.lngLat&&n.altitude!=null)return{lngLat:n.lngLat,altitude:n.altitude,point:n.point};let r=this.getRayAt(e,t);if(!r)return null;let i=new Pc(new H(0,0,1),0),a=new H,o=r.intersectPlane(i,a);if(o){let e=this.host.sceneAnchor.meterInMercator;return{lngLat:this.host.lngLatFromWorld(o.x*e+this.host.sceneAnchor.x,-o.y*e+this.host.sceneAnchor.y),altitude:o.z+(this.host.sceneAnchor.altitude??0),point:[o.x,o.y,o.z]}}return null}raycastDistance(e,t,n){if(!this.host.scene)return null;let r=[...this.pickables.values()].map(e=>e.mesh).filter(e=>{let t=e;for(;t;){if(!t.visible)return!1;t=t.parent}return!0});if(!r.length)return null;let i=new bm;i.set(new H(e[0],e[1],e[2]),new H(t[0],t[1],t[2]).normalize()),i.near=0,i.far=n;let a=i.intersectObjects(r,!1);if(!a.length)return null;let o=a[0];return{distance:o.distance,point:[o.point.x,o.point.y,o.point.z]}}drillPick(e,t,n=10){if(!this.host.sceneAnchor||!this.host.camera)return[];let r=this.getRayAt(e,t);if(!r)return[];let i=new bm;i.ray.copy(r);let a=[...this.pickables.values()].map(e=>e.mesh).filter(e=>{let t=e;for(;t;){if(!t.visible)return!1;t=t.parent}return!0}),o=i.intersectObjects(a,!1);if(!o.length)return[];let s=[],c=new Set,l=new Set;for(let e of o){if(s.length>=n)break;let t=e.object,r=t.userData;if(r.pickId==null)continue;let i=this.pickables.get(r.pickId);if(!i)continue;let a=null,o=-1,u=e.instanceId;if(u!=null){let e=this.instanceFeature(t,r.geoRef,u);if(!e)continue;a=e.smid,o=e.batchId}else if(e.faceIndex!=null){let n=t.geometry.attributes.aBatchId;if(n){let i=t.geometry.index?t.geometry.index.getX(e.faceIndex*3):e.faceIndex*3;o=Math.round(n.getX(i)),a=y_(r.geoByBatchId?.get(o)??r.geoRef,o).smid}}if(a!=null){if(c.has(a))continue;c.add(a)}else{let e=`${r.pickId}:${o}:${u??-1}`;if(l.has(e))continue;l.add(e)}if(this.host.isFeatureHidden(a,o))continue;let d={objectId:r.pickId,batchId:o,instanceIndex:u},f=this.buildPickResult(d,i,e.point);f&&s.push(f)}return s}getFeatureBounds(e){if(!this.host.sceneAnchor)return null;let t=1/0,n=-1/0,r=1/0,i=-1/0,a=!1;for(let o of this.pickables.values()){let s=o.mesh,c=s.userData,l=c.geoRef,u=l?.pickInfo;if(!u)continue;let d=null;if(s.isInstancedMesh){let t=c.instanceLookup;t||(t=v_(u),c.instanceLookup=t);for(let[n,r]of t)if(r.smid===e){d=this.instanceBox(s,n);break}}else{let t=u,n=t[e]??t[String(e)];if(n){let e=y_(l,__(n));if(d=b_(s.geometry,e.segments),!d&&s.geometry){s.geometry.boundingBox||s.geometry.computeBoundingBox();let e=s.geometry.boundingBox;e&&(d={minX:e.min.x,maxX:e.max.x,minY:e.min.y,maxY:e.max.y,minZ:e.min.z,maxZ:e.max.z,count:0,triangles:0})}}}if(d){a=!0;let o=[new H(d.minX,d.minY,d.minZ),new H(d.maxX,d.minY,d.minZ),new H(d.minX,d.maxY,d.minZ),new H(d.maxX,d.maxY,d.minZ),new H(d.minX,d.minY,d.maxZ),new H(d.maxX,d.minY,d.maxZ),new H(d.minX,d.maxY,d.maxZ),new H(d.maxX,d.maxY,d.maxZ)],c=e==null?{}:this.host.featureStyleManager.getFeatureEffectiveOffset(e),l=c.translation,u=c.elevation,f=c.rotation?dC(c.rotation):null,p=null,m=null;f&&(p=new V().set(f[0],f[1],f[2],f[3],f[4],f[5],f[6],f[7],f[8]),m=c.pivot?new H(c.pivot[0],c.pivot[1],c.pivot[2]):new H(0,0,0));let h=e==null?null:this.host.gpuPathPoseAt(e),g=null;if(h&&h.yaw!==0){let e=Math.cos(h.yaw),t=Math.sin(h.yaw);g=new V().set(e,-t,0,t,e,0,0,0,1)}for(let e of o){if(p&&m&&e.sub(m).applyMatrix3(p).add(m),g){let t=m??new H(0,0,0);e.sub(t).applyMatrix3(g).add(t)}l?e.add(new H(l[0],l[1],l[2])):u&&(e.z+=u),h&&e.add(new H(h.pos[0],h.pos[1],h.pos[2])),e.applyMatrix4(s.matrixWorld);let a=this.host.sceneAnchor.meterInMercator,[o,c]=this.host.lngLatFromWorld(e.x*a+this.host.sceneAnchor.x,-e.y*a+this.host.sceneAnchor.y);o<t&&(t=o),o>n&&(n=o),c<r&&(r=c),c>i&&(i=c)}}}return a?[[t,r],[n,i]]:null}instanceFeature(e,t,n){let r=e.userData;return r.instanceLookup||(r.instanceLookup=v_(t?.pickInfo)),r.instanceLookup.get(n)??null}instanceBox(e,t){let n=e;if(!n.isInstancedMesh)return null;let r=e.geometry;r.boundingBox||r.computeBoundingBox();let i=r.boundingBox;if(!i)return null;let a=new U;n.getMatrixAt(t,a);let o=i.clone().applyMatrix4(a);return{minX:o.min.x,minY:o.min.y,minZ:o.min.z,maxX:o.max.x,maxY:o.max.y,maxZ:o.max.z,count:r.getAttribute(`position`)?.count??0,triangles:r.index?Math.round(r.index.count/3):0}}};sh(),w_(),mh();function bC(e){let t=Array.isArray(e.material)?e.material[0]:e.material;return t?.userData?.isStyled?t:null}function xC(e){let t=e??1;return t<0?0:t>1?1:t}function SC(e){return e.isPoints===!0}var CC=class{constructor(e){X(this,`host`,void 0),X(this,`selection`,null),X(this,`selectedMeshes`,[]),X(this,`_outlineMeshes`,[]),X(this,`_selectionEdgeMeshes`,[]),this.host=e}get selectionEdgeMeshes(){return this._selectionEdgeMeshes}reset(){this.selection=null,this.selectedMeshes=[],this._outlineMeshes=[],this._selectionEdgeMeshes=[]}select(e,{silent:t=!1}={}){if(this.selection){for(let e of this.selectedMeshes){if(SC(e)){this.host.applyPointCloudStyle(e,!1);continue}let t=bC(e);t&&(t.userData.uSelBatch.value=-1,t.userData.uSelWhole.value=0)}this.selectedMeshes=[],this.clearDecoration(),this.selection=null}if(!e){this.host.uniforms.uSelMix.value=0,this.host.uniforms.uDim.value=0,this.host.outlineMaterial.uniforms.uSelBatch.value=-1,this.host.outlineMaterial.uniforms.uSelWhole.value=0,this.host.outlineMaterial.uniforms.uElevation.value=0,this.host.requestRepaint(),t||this.host.onPick(null);return}this.selection=e;let n=new Set;if(e.smid!=null){let t=this.host.smidMeshes.get(e.smid);if(t)for(let e of t)n.add(e)}n.add(e.mesh);for(let t of n){let n=bC(t);if(!n)continue;let r=e.batchId;if(e.instanceIndex!=null&&t===e.mesh)r=e.batchId;else if(e.smid!=null){let n=t.userData.geoRef?.pickInfo,i=n?.[e.smid]??n?.[String(e.smid)],a=i?__(i):-1;r=a>=0?a:t===e.mesh?e.batchId:-1}n.userData.uSelBatch.value=r,n.userData.uSelWhole.value=+(r<0),this.selectedMeshes.push(t)}for(let e of this.selectedMeshes)SC(e)&&this.host.applyPointCloudStyle(e,!0);if(this.host.uniforms.uSelMix.value=1,this.host.uniforms.uDim.value=+!!this.host.style.dimOthers,this.host.style.outline){let t=[...n].filter(e=>!SC(e));t.length&&((this.host.style.outlineStyle??`edges`)===`edges`?this.addSelectionEdges(e,t):this.addSelectionHull(e,t))}this.host.requestRepaint()}addSelectionEdges(e,t){this.syncStyle();for(let n of t){let t=n.userData,r=t.geoRef,i=[],a=-1;if(n===e.mesh&&e.instanceIndex!=null){i=[{vertexOffset:0,vertexCount:n.geometry.getAttribute(`position`)?.count??0}];let t=r?.pickInfo,o=t?.[e.smid??``]??t?.[String(e.smid)];a=o?__(o):-1}else if(e.smid!=null){let t=r?.pickInfo,n=t?.[e.smid]??t?.[String(e.smid)],o=n?__(n):-1;a=o,i=n?.segments??(o>=0?y_(r,o).segments:[])}else n===e.mesh&&(i=y_(t.geoByBatchId?.get(e.batchId)??r,e.batchId).segments,a=e.batchId);let o=eC(n.geometry,i);if(o&&o.length>0){let t=a>=0?new Float32Array(o.length/6).fill(a):void 0,r=new hc(YS(o,t),this.host.createSelectionEdgeMaterial(n));r.renderOrder=4,r.frustumCulled=!1,r.raycast=()=>{},r.userData.isSelectionEdge=!0,n===e.mesh&&e.instanceIndex!=null&&this.applyInstanceTransform(r,e),n.add(r),this._selectionEdgeMeshes.push(r)}}this._selectionEdgeMeshes.length===0&&this.addSelectionHull(e,t)}applyInstanceTransform(e,t){let n=t.mesh;if(t.instanceIndex==null||!n.isInstancedMesh)return;let r=new U;n.getMatrixAt(t.instanceIndex,r),r.decompose(e.position,e.quaternion,e.scale)}addSelectionHull(e,t){let n=e.instanceIndex!=null;this.host.outlineMaterial.uniforms.uSelBatch.value=n?-1:e.batchId,this.host.outlineMaterial.uniforms.uSelWhole.value=n||e.batchId<0?1:0,this.host.outlineMaterial.uniforms.uElevation.value=n?this.selectionElevation(e):this.host.style.selectElevation??0;for(let n of t){let t=bC(n);t?.userData?.uBatchTex&&(this.host.outlineMaterial.uniforms.uBatchTex.value=t.userData.uBatchTex.value,this.host.outlineMaterial.uniforms.uBatchTexWidth.value=t.userData.uBatchTexWidth.value,this.host.outlineMaterial.uniforms.uBatchTexActive.value=t.userData.uBatchTexActive.value);let r=new hc(n.geometry,this.host.outlineMaterial);r.renderOrder=3,r.frustumCulled=!1,r.raycast=()=>{},n===e.mesh&&e.instanceIndex!=null&&this.applyInstanceTransform(r,e),n.add(r),this._outlineMeshes.push(r)}}syncStyle(){let e=this.host.style,t=this.host.selectionEdgeMaterial.uniforms;t.uColor.value.set(e.outlineColor??e.selectColor),t.uWidth.value=Math.max(.1,e.outlineWidthPx??3),t.uOpacity.value=xC(e.opacity),t.uElevation&&(t.uElevation.value=e.selectElevation??0);for(let e of this._outlineMeshes){let t=e.parent,n=t?bC(t)?.userData:null;n?.uBatchTex&&(this.host.outlineMaterial.uniforms.uBatchTex.value=n.uBatchTex.value,this.host.outlineMaterial.uniforms.uBatchTexWidth.value=n.uBatchTexWidth.value,this.host.outlineMaterial.uniforms.uBatchTexActive.value=n.uBatchTexActive.value)}}selectionElevation(e){let t=this.host.style.selectElevation??0;if(e.smid!=null){let n=this.host.featureStyleManager.getFeatureEffectiveOffset(e.smid);n.elevation&&(t+=n.elevation)}return t}clearDecoration(){for(let e of this._outlineMeshes)e.parent?.remove(e);this._outlineMeshes=[];for(let e of this._selectionEdgeMeshes)e.parent?.remove(e),e.geometry.dispose();this._selectionEdgeMeshes=[]}isMeshCoveringSelection(e,t){if(!t.point)return!1;let n=e.geometry;if(!n||(n.boundingBox||n.computeBoundingBox(),!n.boundingBox))return!1;let r=new H(t.point[0],t.point[1],t.point[2]);e.updateWorldMatrix(!0,!1);let i=e.matrixWorld.clone().invert(),a=r.applyMatrix4(i);return n.boundingBox.clone().expandByScalar(.5).containsPoint(a)}replayOnto(e){let t=this.selection;if(!t)return;let n=bC(e);if(!n)return;let r=e.userData,i=-1;if(t.smid!=null){let e=r.geoRef?.pickInfo,n=e?.[t.smid]??e?.[String(t.smid)];i=n?__(n):-1}if(e===t.mesh&&(i=t.batchId),i<0&&e!==t.mesh){if(t.smid==null&&r.datasetId===t.datasetId&&this.isMeshCoveringSelection(e,t))i=-1;else return}n.userData.uSelBatch.value=i,n.userData.uSelWhole.value=+(i<0),this.selectedMeshes.includes(e)||this.selectedMeshes.push(e),SC(e)&&this.host.applyPointCloudStyle(e,!0),this.host.uniforms.uSelMix.value=1,this.host.uniforms.uDim.value=+!!this.host.style.dimOthers}};sh(),tx();var wC=2;function TC(e){return e===jb.SOLID?`solid`:e===jb.HEIGHT?`height`:`vertex`}var EC=`
|
|
4984
4984
|
uniform float uPointSize;
|
|
4985
4985
|
varying float vWorldZ;
|
|
4986
4986
|
void main() {
|
|
@@ -5148,7 +5148,24 @@ void main() {
|
|
|
5148
5148
|
floor( b / 256.0 ) / 255.0
|
|
5149
5149
|
);
|
|
5150
5150
|
}
|
|
5151
|
-
`,PC=(()=>{let e=new Du(new Float32Array([-1,-1,-1,0,0,0,0,0]),1,2,fi,ii);return e.minFilter=Hr,e.magFilter=Hr,e.needsUpdate=!0,e})(),FC=(()=>{let e=new Du(new Float32Array([0,0,0,0]),1,1,fi,ii);return e.minFilter=Hr,e.magFilter=Hr,e.needsUpdate=!0,e})();function IC(e){return new bc({uniforms:{uObjectId:{value:e},uBatchTex:{value:PC},uBatchTex2:{value:PC},uBatchMix:{value:0},uBatchTexWidth:{value:1},uBatchTexActive:{value:0},uPathTex:{value:FC},uPathCount:{value:1},uPathTime:{value:0},uPathTexActive:{value:0},uSelBatch:{value:-1},uSelWhole:{value:0},uSelElevation:{value:0}},vertexShader:MC,fragmentShader:NC,side:2,depthTest:!0,depthWrite:!0,toneMapped:!1})}function LC(e){return e.isPoints===!0}var RC=class{constructor(e,t={}){X(this,`renderer`,void 0),X(this,`size`,void 0),X(this,`target`,null),X(this,`buf`,new Uint8Array(4)),this.renderer=e,this.size=Math.max(1,Math.floor(t.size??1))}_ensureTarget(e){return this.target&&this.target.width===e&&this.target.height===e||(this.target?.dispose(),this.target=new uo(e,e,{minFilter:Hr,magFilter:Hr,format:fi,type:Qr,depthBuffer:!0,stencilBuffer:!1}),this.target.texture.colorSpace=_a),this.target}pick(e,t,n,r){let i=this.renderer,a=i.domElement,o=a.width,s=a.height;if(!o||!s)return null;let c=Math.floor(n/a.clientWidth*o),l=Math.floor(r/a.clientHeight*s);if(c<0||l<0||c>=o||l>=s)return null;let u=this._ensureTarget(this.size),d=s-1-l,f=Math.floor(this.size/2),p=Math.floor(this.size/2);u.viewport.set(f-c,p-d,o,s);let m=i.getRenderTarget(),h=i.getViewport(new co),g=i.toneMapping,_=i.outputColorSpace,v=i.autoClear,y=i.getClearColor(new W),b=i.getClearAlpha(),x=[],S=new Set;e.traverseVisible(e=>{let t=e;if(!t.isMesh&&!LC(t))return;let n=t.userData;if(n.pickId===void 0)return;let r=n.isGaussianSplat===!0;n.pickMaterial||(n.pickMaterial=r?Lx(n.pickId):IC(n.pickId)),!r&&t.isInstancedMesh&&S.add(n.pickId);let i=t.material,a=n.pickMaterial;if(r){x.push([t,i]),t.material=a;return}let o=Array.isArray(i)?i[0]:i,s=o?.userData?.uBatchTex;s?(a.uniforms.uBatchTex.value=s.value,a.uniforms.uBatchTex2.value=o?.userData?.uBatchTex2?.value??s.value,a.uniforms.uBatchTexWidth.value=o?.userData?.uBatchTexWidth?.value??1,a.uniforms.uBatchTexActive.value=o?.userData?.uBatchTexActive?.value??0):(a.uniforms.uBatchTex.value=PC,a.uniforms.uBatchTex2.value=PC,a.uniforms.uBatchTexWidth.value=1,a.uniforms.uBatchTexActive.value=0),a.uniforms.uBatchMix.value=o?.userData?.uBatchMix?.value??0,a.uniforms.uPathTex.value=o?.userData?.uPathTex?.value??FC,a.uniforms.uPathCount.value=o?.userData?.uPathCount?.value??1,a.uniforms.uPathTime.value=o?.userData?.uPathTime?.value??0,a.uniforms.uPathTexActive.value=o?.userData?.uPathTexActive?.value??0,a.uniforms.uSelBatch.value=o?.userData?.uSelBatch?.value??-1,a.uniforms.uSelWhole.value=o?.userData?.uSelWhole?.value??0,a.uniforms.uSelElevation.value=o?.userData?.uSelElevation?.value??o?.uniforms?.uSelElevation?.value??0,x.push([t,i]),t.material=a});let C=[];e.traverseVisible(e=>{let t=e;(t.isMesh||LC(t))&&t.userData.pickId===void 0&&(C.push(t),t.visible=!1)});let w=null;try{i.resetState(),i.setRenderTarget(u),i.toneMapping=0,i.outputColorSpace=_a,i.autoClear=!0,i.setClearColor(0,0),i.clear(),i.render(e,t),i.readRenderTargetPixels(u,f,p,1,1,this.buf);let n=this.buf[0],r=this.buf[1],a=this.buf[2],o=this.buf[3],s=n+r*256-1,c=a+o*256-1;s>=0&&(w=S.has(s)?{objectId:s,batchId:-1,instanceIndex:Math.max(0,c)}:{objectId:s,batchId:c})}finally{for(let[e,t]of x)e.material=t;for(let e of C)e.visible=!0;i.setRenderTarget(m),i.setViewport(h),i.toneMapping=g,i.outputColorSpace=_,i.autoClear=v,i.setClearColor(y,b),i.resetState()}return w}dispose(){this.target?.dispose(),this.target=null}},zC=1.70158,BC=zC*1.525,VC=2.70158,HC=2*Math.PI/3,UC=2*Math.PI/4.5,WC=7.5625,GC=2.75;function KC(e){if(e<1/GC)return WC*e*e;if(e<2/GC){let t=e-1.5/GC;return WC*t*t+.75}if(e<2.5/GC){let t=e-2.25/GC;return WC*t*t+.9375}let t=e-2.625/GC;return WC*t*t+.984375}function qC(e){return 1-KC(1-e)}var JC={linear:e=>e,easeInQuad:e=>e*e,easeOutQuad:e=>1-(1-e)*(1-e),easeInOutQuad:e=>e<.5?2*e*e:1-(-2*e+2)**2/2,easeInCubic:e=>e*e*e,easeOutCubic:e=>1-(1-e)**3,easeInOutCubic:e=>e<.5?4*e*e*e:1-(-2*e+2)**3/2,easeInQuart:e=>e*e*e*e,easeOutQuart:e=>1-(1-e)**4,easeInOutQuart:e=>e<.5?8*e*e*e*e:1-(-2*e+2)**4/2,easeInQuint:e=>e*e*e*e*e,easeOutQuint:e=>1-(1-e)**5,easeInOutQuint:e=>e<.5?16*e*e*e*e*e:1-(-2*e+2)**5/2,easeInSine:e=>1-Math.cos(e*Math.PI/2),easeOutSine:e=>Math.sin(e*Math.PI/2),easeInOutSine:e=>-(Math.cos(Math.PI*e)-1)/2,easeInExpo:e=>e===0?0:2**(10*e-10),easeOutExpo:e=>e===1?1:1-2**(-10*e),easeInOutExpo:e=>e===0?0:e===1?1:e<.5?2**(20*e-10)/2:(2-2**(-20*e+10))/2,easeInCirc:e=>1-Math.sqrt(1-e*e),easeOutCirc:e=>Math.sqrt(1-(e-1)**2),easeInOutCirc:e=>e<.5?(1-Math.sqrt(1-(2*e)**2))/2:(Math.sqrt(1-(-2*e+2)**2)+1)/2,easeInBack:e=>VC*e*e*e-zC*e*e,easeOutBack:e=>1+VC*(e-1)**3+zC*(e-1)**2,easeInOutBack:e=>e<.5?(2*e)**2*(7.189819*e-BC)/2:((2*e-2)**2*(3.5949095*(e*2-2)+BC)+2)/2,easeInElastic:e=>e===0?0:e===1?1:-(2**(10*e-10))*Math.sin((e*10-10.75)*HC),easeOutElastic:e=>e===0?0:e===1?1:2**(-10*e)*Math.sin((e*10-.75)*HC)+1,easeInOutElastic:e=>e===0?0:e===1?1:e<.5?-(2**(20*e-10)*Math.sin((20*e-11.125)*UC))/2:2**(-20*e+10)*Math.sin((20*e-11.125)*UC)/2+1,easeInBounce:qC,easeOutBounce:KC,easeInOutBounce:e=>e<.5?(1-qC(1-2*e))/2:(1+qC(2*e-1))/2},YC=Object.keys(JC);function XC(e){if(typeof e==`function`)return e;let t=JC[e];if(!t)throw Error(`[s3m] 未知的缓动曲线: ${String(e)}`);return t}var ZC=8,QC=.001,$C=1e-7,ew=12,tw=(e,t)=>1-3*t+3*e,nw=(e,t)=>3*t-6*e,rw=e=>3*e;function iw(e,t,n){return((tw(t,n)*e+nw(t,n))*e+rw(t))*e}function aw(e,t,n){return 3*tw(t,n)*e*e+2*nw(t,n)*e+rw(t)}function ow(e,t,n,r){if(e===t&&n===r)return e=>e;let i=t=>{let r=t;for(let i=0;i<ZC;i++){let i=aw(r,e,n);if(Math.abs(i)<QC)break;let a=iw(r,e,n)-t;if(Math.abs(a)<$C)return r;r-=a/i}let i=0,a=1;r=t;for(let o=0;o<ew;o++){let o=iw(r,e,n);if(Math.abs(o-t)<$C)return r;o<t?i=r:a=r,r=(i+a)/2}return r};return e=>e<=0?0:e>=1?1:iw(i(e),t,r)}function sw(e,t=`end`){let n=Math.max(1,Math.floor(e));return e=>{let r=Math.min(1,Math.max(0,e));return t===`start`?Math.min(1,(Math.floor(r*n)+1)/n):Math.min(1,Math.floor(r*n)/n)}}mh();var cw=1e-4,lw=.15;function uw(e){return e<0?0:e>1?1:e}function dw(e,t,n){let r=0;for(let i=0;i<n;i++){let n=Math.abs(e[i]-t[i]);n>r&&(r=n)}return r}var fw=class{constructor(e,t){X(this,`key`,void 0),X(this,`channel`,void 0),X(this,`dim`,void 0),X(this,`to`,new Float32Array(3)),X(this,`_cur`,new Float32Array(3)),X(this,`done`,!1),X(this,`onComplete`,void 0),this.key=e,this.channel=t,this.dim=t.dim}},pw=class extends fw{constructor(...e){super(...e),X(this,`_from`,new Float32Array(3)),X(this,`_start`,0),X(this,`_duration`,0),X(this,`_delay`,0),X(this,`_ease`,XC(`linear`)),X(this,`_retarget`,`proportional`),X(this,`_span`,0),X(this,`_progress`,0)}get progress(){return this._progress}start(e,t,n){n?this._from.set(n.subarray(0,this.dim)):this.channel.read(this._from),this._start=e,this._delay=Math.max(0,t.delay??0),this._duration=Math.max(0,t.duration??0),this._ease=t.easing?XC(t.easing):XC(`linear`),this._retarget=t.retarget??`proportional`,this._span=dw(this._from,this.to,this.dim),this._progress=0,this.done=!1}advance(e){let t=e-this._start-this._delay,n=this._duration<=0?1:uw(t/this._duration);this._progress=n;let r=this._ease(n);for(let e=0;e<this.dim;e++)this._cur[e]=this._from[e]+(this.to[e]-this._from[e])*r;this.channel.write(this._cur),n>=1&&(this.done=!0)}retarget(e,t,n){this.channel.read(this._from),this.to.set(e.subarray(0,this.dim));let r=Math.max(0,n.duration??this._duration),i=r;if((n.retarget??this._retarget)!==`fixed`&&this._span>cw){let e=dw(this._from,this.to,this.dim)/this._span;i=Math.min(r,Math.max(r*lw,r*e))}this._start=t,this._delay=Math.max(0,n.delay??0),this._duration=i,this._ease=n.easing?XC(n.easing):this._ease,this._span=dw(this._from,this.to,this.dim),this._progress=0,this.done=!1}},mw=class extends fw{constructor(...e){super(...e),X(this,`_x0`,new Float32Array(3)),X(this,`_v0`,new Float32Array(3)),X(this,`_vel`,new Float32Array(3)),X(this,`_start`,0),X(this,`_k`,120),X(this,`_c`,14),X(this,`_eps`,.001),X(this,`_progress`,0)}get progress(){return this._progress}start(e,t,n){let r=t.spring??{stiffness:120,damping:14};this._k=Math.max(.001,r.stiffness),this._c=Math.max(0,r.damping),this._eps=r.epsilon??.001,n?this._x0.set(n.subarray(0,this.dim)):this.channel.read(this._x0),this._v0.fill(0),this._vel.fill(0),this._start=e,this.done=!1,this._progress=0}advance(e){let t=Math.max(0,(e-this._start)/1e3),n=!0;for(let e=0;e<this.dim;e++){let{x:r,v:i}=hw(this._x0[e]-this.to[e],this._v0[e],this._k,this._c,t);this._cur[e]=this.to[e]+r,this._vel[e]=i,(Math.abs(r)>this._eps||Math.abs(i)>this._eps)&&(n=!1)}if(this.channel.write(this._cur),n){for(let e=0;e<this.dim;e++)this._cur[e]=this.to[e];this.channel.write(this._cur),this.done=!0,this._progress=1}}retarget(e,t,n){this.channel.read(this._cur);let r=n.spring;r&&(this._k=Math.max(.001,r.stiffness),this._c=Math.max(0,r.damping),this._eps=r.epsilon??this._eps);let i=Math.max(0,(t-this._start)/1e3);for(let t=0;t<this.dim;t++){let n=hw(this._x0[t]-this.to[t],this._v0[t],this._k,this._c,i);this._x0[t]=this._cur[t]-e[t],this._v0[t]=n.v}this.to.set(e.subarray(0,this.dim)),this._start=t,this.done=!1}};function hw(e,t,n,r,i){let a=Math.sqrt(n),o=r/(2*a);if(o<1){let n=a*Math.sqrt(1-o*o),r=Math.exp(-o*a*i),s=Math.cos(n*i),c=Math.sin(n*i),l=e,u=(t+o*a*e)/n;return{x:r*(l*s+u*c),v:r*((u*n-o*a*l)*s+(-l*n-o*a*u)*c)}}let s=Math.exp(-a*i),c=t+a*e;return{x:(e+c*i)*s,v:(t-a*c*i)*s}}var gw=class{constructor(e=()=>performance.now()){X(this,`_channels`,new Map),X(this,`_tracks`,new Map),X(this,`_buf`,new Float32Array(3)),X(this,`_finished`,[]),X(this,`_now`,void 0),X(this,`_budgetMs`,2.5),X(this,`_lastTick`,-1/0),X(this,`_skipped`,0),X(this,`onActive`,void 0),this._now=e}set budgetMs(e){this._budgetMs=Math.max(0,e)}get budgetMs(){return this._budgetMs}get skippedLastTick(){return this._skipped}get activeCount(){return this._tracks.size}get active(){return this._tracks.size>0}register(e,t){this._channels.set(e,t)}unregister(e){this._channels.delete(e),this._tracks.delete(e)}unregisterPrefix(e){for(let t of[...this._channels.keys()])t.startsWith(e)&&(this._channels.delete(t),this._tracks.delete(t))}has(e){return this._channels.has(e)}isActive(e){return this._tracks.has(e)}to(e,t,n={}){let r=this._channels.get(e);if(!r)throw Error(`[s3m] 未注册的动画通道: ${e}`);let i=this._buf;if(r.dim===1)i[0]=typeof t==`number`?t:Number(t[0]),i[1]=0,i[2]=0;else{if(typeof t==`number`)throw Error(`[s3m] 通道 ${e} 需要三元数组目标值`);for(let e=0;e<3;e++)i[e]=Number(t[e]??0)}let a=!!n.spring,o=Math.max(0,n.duration??0);if(!a&&o<=0&&!n.delay){this._tracks.delete(e),r.write(i),this.onActive?.(),n.onComplete?.();return}let s=Math.max(this._now(),this._lastTick),c=this._tracks.get(e),l=a,u=c instanceof mw;if(c&&c!=null&&u!==l&&(this._tracks.delete(e),c=void 0),c||this.onActive?.(),!c){let t=l?new mw(e,r):new pw(e,r);t.to.set(i.subarray(0,r.dim)),t.onComplete=n.onComplete,t.start(s,n),this._tracks.set(e,t)}else c.to.set(i.subarray(0,r.dim)),c.onComplete=n.onComplete,c.retarget(i,s,n)}cancel(e){this._tracks.delete(e)}finish(e){let t=this._tracks.get(e);t&&(this._tracks.delete(e),t.channel.write(t.to),this.onActive?.(),t.onComplete?.())}clear(){this._tracks.clear()}tick(e=this._now()){if(this._tracks.size===0)return this._lastTick=Math.max(this._lastTick,e),!1;this._lastTick=Math.max(this._lastTick,e);let t=performance.now(),n=0;for(let r of this._tracks.values())if(r.advance(e),n++,r.done&&this._finished.push(r),performance.now()-t>=this._budgetMs)break;if(this._finished.length>0){for(let e of this._finished)this._tracks.get(e.key)===e&&this._tracks.delete(e.key);let e=this._finished.splice(0,this._finished.length);for(let t of e)t.onComplete?.()}return this._skipped=Math.max(0,this._tracks.size-n),this._tracks.size>0}};sh(),mh();var _w=class{constructor(){X(this,`datasets`,new Map),X(this,`sceneAnchor`,null),X(this,`totalMaxTiles`,0),X(this,`defaultMaterialQuality`,void 0),X(this,`defaultColorPipeline`,void 0),X(this,`defaultTextureOptions`,void 0)}setDefaultMaterialQuality(e){this.defaultMaterialQuality=e;for(let t of this.datasets.values())t.options.materialQuality||t.tileset?.setMaterialQuality(e)}setRenderProfile(e){e.colorPipeline!==void 0&&(this.defaultColorPipeline=e.colorPipeline),e.textureOptions!==void 0&&(this.defaultTextureOptions=e.textureOptions);for(let t of this.datasets.values())t.tileset?.setRenderProfile(e)}get(e){return this.datasets.get(e)}values(){return this.datasets.values()}registerDataset(e){let t=this.datasets.get(e.id);if(t)return t;let n=new Il;n.name=`s3m-dataset:${e.id}`,n.visible=e.visible!==!1;let r={id:e.id,name:e.name??e.id,options:e,root:n,tileset:null,anchor:null,baseAlignOffset:0,userOffset:e.heightOffset??0,heightOffset:e.heightOffset??0,offset:[0,0,0],visible:e.visible!==!1,error:null};return this.datasets.set(e.id,r),this.rebalanceBudgets(),r}rebalanceBudgets(e){let t=e??this.totalMaxTiles;if(!t||t<=0)return;this.totalMaxTiles=t;let n=Array.from(this.datasets.values()).filter(e=>e.visible&&e.tileset),r=Math.max(1,n.length),i=Math.max(8,Math.floor(t/r));for(let e of this.datasets.values())e.tileset&&(e.visible?(e.tileset.maxTiles=i,e.tileset.hardCap=i+Math.max(4,Math.ceil(i*.5))):(e.tileset.maxTiles=Math.min(4,e.tileset.maxTiles),e.tileset.hardCap=Math.min(6,e.tileset.hardCap)))}computeAlignOffset(e,t){if(!t||t===`origin`||!e)return 0;let n=e.heightRange;if(!n)return 0;switch(t){case`top`:return-n.max;case`bottom`:return-n.min;case`center`:return-(n.min+n.max)/2;default:return 0}}async addDataset(e,t,n,r,i,a,o,s,c,l=1/0,u=128,d,f=1/0){let p=this.datasets.get(e.id);if(p)return p;let m=new Il;m.name=`s3m-dataset:${e.id}`,m.visible=e.visible!==!1,t.add(m);let h={id:e.id,name:e.name??e.id,options:e,root:m,tileset:null,anchor:null,baseAlignOffset:0,userOffset:e.heightOffset??0,heightOffset:e.heightOffset??0,offset:[0,0,0],visible:e.visible!==!1,error:null};this.datasets.set(e.id,h);let g=new CS({configUrl:e.configUrl,maxTiles:e.maxTiles??o,maxConcurrent:s,maxTriangles:e.maxTriangles??l,maxMemory:e.maxMemory??f,maxImageCache:e.maxImageCache??u,lodRangeScale:e.lodRangeScale??i,buildTile:a??null,polygonOffset:e.polygonOffset,materialQuality:e.materialQuality??this.defaultMaterialQuality,colorPipeline:this.defaultColorPipeline,textureOptions:this.defaultTextureOptions,useWorker:e.useWorker,authenticate:e.authenticate??d,unsupported:e.unsupported,uniforms:r,onTile:e=>{c.onTile(e,h)},onTileRemoved:e=>{c.onTileRemoved(e,h)},onProgress:()=>{c.onStats(),c.triggerRepaint()},onError:e=>{h.error=e,c.onError(e),c.onStats()}});h.tileset=g,this.rebalanceBudgets();try{await g.init()}catch(e){return h.error=e,c.onError(e),h}return h.anchor=g.anchor,h.baseAlignOffset=this.computeAlignOffset(g,e.align),h.userOffset=e.heightOffset??0,h.heightOffset=h.baseAlignOffset+h.userOffset,this.layoutDataset(h,n),c.onReady(h),c.triggerRepaint(),h}removeDataset(e,t,n,r){let i=this.datasets.get(e);return i?(r(i),i.tileset?.dispose(),t.remove(i.root),this.datasets.delete(e),this.rebalanceBudgets(),this.datasets.size>0?this.recomputeAnchors(n):this.sceneAnchor=null,!0):!1}clearDatasets(e,t){for(let n of this.datasets.values())t(n),n.tileset?.dispose(),e.remove(n.root);this.datasets.clear(),this.sceneAnchor=null}layoutDataset(e,t){if(!e.anchor)return;this.sceneAnchor||(this.sceneAnchor=F_(t,e.anchor.lon,e.anchor.lat,e.anchor.height??0));let n=this.sceneAnchor.meterInMercator,r=F_(t,e.anchor.lon,e.anchor.lat,e.anchor.height??0);e.offset=[(r.x-this.sceneAnchor.x)/n,-(r.y-this.sceneAnchor.y)/n,(r.z-this.sceneAnchor.z)/n+(e.heightOffset??0)],e.root.position.set(e.offset[0],e.offset[1],e.offset[2]),e.root.updateMatrixWorld(!0)}recomputeAnchors(e){if(this.datasets.size!==0){this.sceneAnchor=null;for(let t of this.datasets.values())this.layoutDataset(t,e)}}getDatasetHeight(e){let t=e??this.datasets.keys().next().value;return t?this.datasets.get(t)?.userOffset??0:0}setDatasetHeight(e,t,n){let r=this.datasets.get(e);r&&(r.userOffset=t,r.heightOffset=r.baseAlignOffset+t,this.layoutDataset(r,n))}setDatasetAlign(e,t,n){let r=this.datasets.get(e);if(!r)return;let i=r.heightOffset-r.baseAlignOffset;r.baseAlignOffset=this.computeAlignOffset(r.tileset,t),r.userOffset=i,r.heightOffset=r.baseAlignOffset+i,r.options.align=t,this.layoutDataset(r,n)}setDatasetVisible(e,t){let n=this.datasets.get(e);n&&(n.visible=t,n.root.visible=t,this.rebalanceBudgets())}getBounds(){let e=1/0,t=1/0,n=-1/0,r=-1/0,i=!1;for(let a of this.datasets.values()){if(!a.visible||!a.tileset?.config)continue;let o=vS(a.tileset.config.geoBounds);o&&(e=Math.min(e,o.left),t=Math.min(t,o.bottom),n=Math.max(n,o.right),r=Math.max(r,o.top),i=!0)}return i?[[e,t],[n,r]]:null}};sh(),mh();var vw=class{constructor(e={}){X(this,`mode`,void 0),X(this,`opacity`,void 0),X(this,`color`,void 0),X(this,`gridColor`,void 0),X(this,`gridSize`,void 0),X(this,`excavationBounds`,null),X(this,`size`,void 0),X(this,`groundHeight`,0),X(this,`occlude`,void 0),X(this,`trackHeight`,void 0),X(this,`group`,void 0),X(this,`_mesh`,null),X(this,`_material`,null),X(this,`_depthMesh`,null),X(this,`_depthMaterial`,null),X(this,`_geom`,null),X(this,`_occludeExplicit`,void 0),this.mode=e.mode??`none`,this.opacity=e.opacity??.62,this.color=new W(e.color??`#0f172a`),this.gridColor=new W(e.gridColor??`#38bdf8`),this.gridSize=e.gridSize??10,this.excavationBounds=e.excavationBounds??null,this.size=e.size??6e3,this._occludeExplicit=e.occlude!==void 0,this.occlude=e.occlude??this.mode===`excavate`,this.trackHeight=e.trackHeight??!0,this.group=new Il,this.group.name=`s3m-ground-surface`,this._initMesh(),this._applyMode()}_initMesh(){let e=new Rc(this.size,this.size,1,1);this._geom=e;let t=new bc({transparent:!0,depthTest:!0,depthWrite:!1,side:2,uniforms:{uColor:{value:this.color},uGridColor:{value:this.gridColor},uOpacity:{value:this.opacity},uGridSize:{value:this.gridSize},uMode:{value:this.mode===`excavate`?2:+(this.mode===`translucent`)},uHasExcavation:{value:0},uExcavationMin:{value:new B(-9999,-9999)},uExcavationMax:{value:new B(9999,9999)}},vertexShader:`
|
|
5151
|
+
`,PC=(()=>{let e=new Du(new Float32Array([-1,-1,-1,0,0,0,0,0]),1,2,fi,ii);return e.minFilter=Hr,e.magFilter=Hr,e.needsUpdate=!0,e})(),FC=(()=>{let e=new Du(new Float32Array([0,0,0,0]),1,1,fi,ii);return e.minFilter=Hr,e.magFilter=Hr,e.needsUpdate=!0,e})();function IC(e){return new bc({uniforms:{uObjectId:{value:e},uBatchTex:{value:PC},uBatchTex2:{value:PC},uBatchMix:{value:0},uBatchTexWidth:{value:1},uBatchTexActive:{value:0},uPathTex:{value:FC},uPathCount:{value:1},uPathTime:{value:0},uPathTexActive:{value:0},uSelBatch:{value:-1},uSelWhole:{value:0},uSelElevation:{value:0}},vertexShader:MC,fragmentShader:NC,side:2,depthTest:!0,depthWrite:!0,toneMapped:!1})}function LC(e){return e.isPoints===!0}var RC=class{constructor(e,t={}){X(this,`renderer`,void 0),X(this,`size`,void 0),X(this,`target`,null),X(this,`buf`,new Uint8Array(4)),this.renderer=e,this.size=Math.max(1,Math.floor(t.size??1))}_ensureTarget(e){return this.target&&this.target.width===e&&this.target.height===e||(this.target?.dispose(),this.target=new uo(e,e,{minFilter:Hr,magFilter:Hr,format:fi,type:Qr,depthBuffer:!0,stencilBuffer:!1}),this.target.texture.colorSpace=_a),this.target}pick(e,t,n,r){let i=this.renderer,a=i.domElement,o=a.width,s=a.height;if(!o||!s)return null;let c=Math.floor(n/a.clientWidth*o),l=Math.floor(r/a.clientHeight*s);if(c<0||l<0||c>=o||l>=s)return null;let u=this._ensureTarget(this.size),d=s-1-l,f=Math.floor(this.size/2),p=Math.floor(this.size/2);u.viewport.set(f-c,p-d,o,s);let m=i.getRenderTarget(),h=i.getViewport(new co),g=i.toneMapping,_=i.outputColorSpace,v=i.autoClear,y=i.getClearColor(new W),b=i.getClearAlpha(),x=[],S=new Set;e.traverseVisible(e=>{let t=e;if(!t.isMesh&&!LC(t))return;let n=t.userData;if(n.pickId===void 0)return;let r=n.isGaussianSplat===!0;n.pickMaterial||(n.pickMaterial=r?Lx(n.pickId):IC(n.pickId)),!r&&t.isInstancedMesh&&S.add(n.pickId);let i=t.material,a=n.pickMaterial;if(r){x.push([t,i]),t.material=a;return}let o=Array.isArray(i)?i[0]:i,s=o?.userData?.uBatchTex;s?(a.uniforms.uBatchTex.value=s.value,a.uniforms.uBatchTex2.value=o?.userData?.uBatchTex2?.value??s.value,a.uniforms.uBatchTexWidth.value=o?.userData?.uBatchTexWidth?.value??1,a.uniforms.uBatchTexActive.value=o?.userData?.uBatchTexActive?.value??0):(a.uniforms.uBatchTex.value=PC,a.uniforms.uBatchTex2.value=PC,a.uniforms.uBatchTexWidth.value=1,a.uniforms.uBatchTexActive.value=0),a.uniforms.uBatchMix.value=o?.userData?.uBatchMix?.value??0,a.uniforms.uPathTex.value=o?.userData?.uPathTex?.value??FC,a.uniforms.uPathCount.value=o?.userData?.uPathCount?.value??1,a.uniforms.uPathTime.value=o?.userData?.uPathTime?.value??0,a.uniforms.uPathTexActive.value=o?.userData?.uPathTexActive?.value??0,a.uniforms.uSelBatch.value=o?.userData?.uSelBatch?.value??-1,a.uniforms.uSelWhole.value=o?.userData?.uSelWhole?.value??0,a.uniforms.uSelElevation.value=o?.userData?.uSelElevation?.value??o?.uniforms?.uSelElevation?.value??0,x.push([t,i]),t.material=a});let C=[];e.traverseVisible(e=>{let t=e;(t.isMesh||LC(t))&&t.userData.pickId===void 0&&(C.push(t),t.visible=!1)});let w=null;try{i.resetState(),i.setRenderTarget(u),i.toneMapping=0,i.outputColorSpace=_a,i.autoClear=!0,i.setClearColor(0,0),i.clear(),i.render(e,t),i.readRenderTargetPixels(u,f,p,1,1,this.buf);let n=this.buf[0],r=this.buf[1],a=this.buf[2],o=this.buf[3],s=n+r*256-1,c=a+o*256-1;s>=0&&(w=S.has(s)?{objectId:s,batchId:-1,instanceIndex:Math.max(0,c)}:{objectId:s,batchId:c})}finally{for(let[e,t]of x)e.material=t;for(let e of C)e.visible=!0;i.setRenderTarget(m),i.setViewport(h),i.toneMapping=g,i.outputColorSpace=_,i.autoClear=v,i.setClearColor(y,b),i.resetState()}return w}dispose(){this.target?.dispose(),this.target=null}},zC=1.70158,BC=zC*1.525,VC=2.70158,HC=2*Math.PI/3,UC=2*Math.PI/4.5,WC=7.5625,GC=2.75;function KC(e){if(e<1/GC)return WC*e*e;if(e<2/GC){let t=e-1.5/GC;return WC*t*t+.75}if(e<2.5/GC){let t=e-2.25/GC;return WC*t*t+.9375}let t=e-2.625/GC;return WC*t*t+.984375}function qC(e){return 1-KC(1-e)}var JC={linear:e=>e,easeInQuad:e=>e*e,easeOutQuad:e=>1-(1-e)*(1-e),easeInOutQuad:e=>e<.5?2*e*e:1-(-2*e+2)**2/2,easeInCubic:e=>e*e*e,easeOutCubic:e=>1-(1-e)**3,easeInOutCubic:e=>e<.5?4*e*e*e:1-(-2*e+2)**3/2,easeInQuart:e=>e*e*e*e,easeOutQuart:e=>1-(1-e)**4,easeInOutQuart:e=>e<.5?8*e*e*e*e:1-(-2*e+2)**4/2,easeInQuint:e=>e*e*e*e*e,easeOutQuint:e=>1-(1-e)**5,easeInOutQuint:e=>e<.5?16*e*e*e*e*e:1-(-2*e+2)**5/2,easeInSine:e=>1-Math.cos(e*Math.PI/2),easeOutSine:e=>Math.sin(e*Math.PI/2),easeInOutSine:e=>-(Math.cos(Math.PI*e)-1)/2,easeInExpo:e=>e===0?0:2**(10*e-10),easeOutExpo:e=>e===1?1:1-2**(-10*e),easeInOutExpo:e=>e===0?0:e===1?1:e<.5?2**(20*e-10)/2:(2-2**(-20*e+10))/2,easeInCirc:e=>1-Math.sqrt(1-e*e),easeOutCirc:e=>Math.sqrt(1-(e-1)**2),easeInOutCirc:e=>e<.5?(1-Math.sqrt(1-(2*e)**2))/2:(Math.sqrt(1-(-2*e+2)**2)+1)/2,easeInBack:e=>VC*e*e*e-zC*e*e,easeOutBack:e=>1+VC*(e-1)**3+zC*(e-1)**2,easeInOutBack:e=>e<.5?(2*e)**2*(7.189819*e-BC)/2:((2*e-2)**2*(3.5949095*(e*2-2)+BC)+2)/2,easeInElastic:e=>e===0?0:e===1?1:-(2**(10*e-10))*Math.sin((e*10-10.75)*HC),easeOutElastic:e=>e===0?0:e===1?1:2**(-10*e)*Math.sin((e*10-.75)*HC)+1,easeInOutElastic:e=>e===0?0:e===1?1:e<.5?-(2**(20*e-10)*Math.sin((20*e-11.125)*UC))/2:2**(-20*e+10)*Math.sin((20*e-11.125)*UC)/2+1,easeInBounce:qC,easeOutBounce:KC,easeInOutBounce:e=>e<.5?(1-qC(1-2*e))/2:(1+qC(2*e-1))/2},YC=Object.keys(JC);function XC(e){if(typeof e==`function`)return e;let t=JC[e];if(!t)throw Error(`[s3m] 未知的缓动曲线: ${String(e)}`);return t}var ZC=8,QC=.001,$C=1e-7,ew=12,tw=(e,t)=>1-3*t+3*e,nw=(e,t)=>3*t-6*e,rw=e=>3*e;function iw(e,t,n){return((tw(t,n)*e+nw(t,n))*e+rw(t))*e}function aw(e,t,n){return 3*tw(t,n)*e*e+2*nw(t,n)*e+rw(t)}function ow(e,t,n,r){if(e===t&&n===r)return e=>e;let i=t=>{let r=t;for(let i=0;i<ZC;i++){let i=aw(r,e,n);if(Math.abs(i)<QC)break;let a=iw(r,e,n)-t;if(Math.abs(a)<$C)return r;r-=a/i}let i=0,a=1;r=t;for(let o=0;o<ew;o++){let o=iw(r,e,n);if(Math.abs(o-t)<$C)return r;o<t?i=r:a=r,r=(i+a)/2}return r};return e=>e<=0?0:e>=1?1:iw(i(e),t,r)}function sw(e,t=`end`){let n=Math.max(1,Math.floor(e));return e=>{let r=Math.min(1,Math.max(0,e));return t===`start`?Math.min(1,(Math.floor(r*n)+1)/n):Math.min(1,Math.floor(r*n)/n)}}mh();var cw=1e-4,lw=.15;function uw(e){return e<0?0:e>1?1:e}function dw(e,t,n){let r=0;for(let i=0;i<n;i++){let n=Math.abs(e[i]-t[i]);n>r&&(r=n)}return r}var fw=class{constructor(e,t){X(this,`key`,void 0),X(this,`channel`,void 0),X(this,`dim`,void 0),X(this,`to`,new Float32Array(3)),X(this,`_cur`,new Float32Array(3)),X(this,`done`,!1),X(this,`onComplete`,void 0),this.key=e,this.channel=t,this.dim=t.dim}},pw=class extends fw{constructor(...e){super(...e),X(this,`_from`,new Float32Array(3)),X(this,`_start`,0),X(this,`_duration`,0),X(this,`_delay`,0),X(this,`_ease`,XC(`linear`)),X(this,`_retarget`,`proportional`),X(this,`_span`,0),X(this,`_progress`,0)}get progress(){return this._progress}start(e,t,n){n?this._from.set(n.subarray(0,this.dim)):this.channel.read(this._from),this._start=e,this._delay=Math.max(0,t.delay??0),this._duration=Math.max(0,t.duration??0),this._ease=t.easing?XC(t.easing):XC(`linear`),this._retarget=t.retarget??`proportional`,this._span=dw(this._from,this.to,this.dim),this._progress=0,this.done=!1}advance(e){let t=e-this._start-this._delay,n=this._duration<=0?1:uw(t/this._duration);this._progress=n;let r=this._ease(n);for(let e=0;e<this.dim;e++)this._cur[e]=this._from[e]+(this.to[e]-this._from[e])*r;this.channel.write(this._cur),n>=1&&(this.done=!0)}retarget(e,t,n){this.channel.read(this._from),this.to.set(e.subarray(0,this.dim));let r=Math.max(0,n.duration??this._duration),i=r;if((n.retarget??this._retarget)!==`fixed`&&this._span>cw){let e=dw(this._from,this.to,this.dim)/this._span;i=Math.min(r,Math.max(r*lw,r*e))}this._start=t,this._delay=Math.max(0,n.delay??0),this._duration=i,this._ease=n.easing?XC(n.easing):this._ease,this._span=dw(this._from,this.to,this.dim),this._progress=0,this.done=!1}},mw=class extends fw{constructor(...e){super(...e),X(this,`_x0`,new Float32Array(3)),X(this,`_v0`,new Float32Array(3)),X(this,`_vel`,new Float32Array(3)),X(this,`_start`,0),X(this,`_k`,120),X(this,`_c`,14),X(this,`_eps`,.001),X(this,`_progress`,0)}get progress(){return this._progress}start(e,t,n){let r=t.spring??{stiffness:120,damping:14};this._k=Math.max(.001,r.stiffness),this._c=Math.max(0,r.damping),this._eps=r.epsilon??.001,n?this._x0.set(n.subarray(0,this.dim)):this.channel.read(this._x0),this._v0.fill(0),this._vel.fill(0),this._start=e,this.done=!1,this._progress=0}advance(e){let t=Math.max(0,(e-this._start)/1e3),n=!0;for(let e=0;e<this.dim;e++){let{x:r,v:i}=hw(this._x0[e]-this.to[e],this._v0[e],this._k,this._c,t);this._cur[e]=this.to[e]+r,this._vel[e]=i,(Math.abs(r)>this._eps||Math.abs(i)>this._eps)&&(n=!1)}if(this.channel.write(this._cur),n){for(let e=0;e<this.dim;e++)this._cur[e]=this.to[e];this.channel.write(this._cur),this.done=!0,this._progress=1}}retarget(e,t,n){this.channel.read(this._cur);let r=n.spring;r&&(this._k=Math.max(.001,r.stiffness),this._c=Math.max(0,r.damping),this._eps=r.epsilon??this._eps);let i=Math.max(0,(t-this._start)/1e3);for(let t=0;t<this.dim;t++){let n=hw(this._x0[t]-this.to[t],this._v0[t],this._k,this._c,i);this._x0[t]=this._cur[t]-e[t],this._v0[t]=n.v}this.to.set(e.subarray(0,this.dim)),this._start=t,this.done=!1}};function hw(e,t,n,r,i){let a=Math.sqrt(n),o=r/(2*a);if(o<1){let n=a*Math.sqrt(1-o*o),r=Math.exp(-o*a*i),s=Math.cos(n*i),c=Math.sin(n*i),l=e,u=(t+o*a*e)/n;return{x:r*(l*s+u*c),v:r*((u*n-o*a*l)*s+(-l*n-o*a*u)*c)}}let s=Math.exp(-a*i),c=t+a*e;return{x:(e+c*i)*s,v:(t-a*c*i)*s}}var gw=class{constructor(e=()=>performance.now()){X(this,`_channels`,new Map),X(this,`_tracks`,new Map),X(this,`_buf`,new Float32Array(3)),X(this,`_finished`,[]),X(this,`_now`,void 0),X(this,`_budgetMs`,2.5),X(this,`_lastTick`,-1/0),X(this,`_skipped`,0),X(this,`onActive`,void 0),this._now=e}set budgetMs(e){this._budgetMs=Math.max(0,e)}get budgetMs(){return this._budgetMs}get skippedLastTick(){return this._skipped}get activeCount(){return this._tracks.size}get active(){return this._tracks.size>0}register(e,t){this._channels.set(e,t)}unregister(e){this._channels.delete(e),this._tracks.delete(e)}unregisterPrefix(e){for(let t of[...this._channels.keys()])t.startsWith(e)&&(this._channels.delete(t),this._tracks.delete(t))}has(e){return this._channels.has(e)}isActive(e){return this._tracks.has(e)}to(e,t,n={}){let r=this._channels.get(e);if(!r)throw Error(`[s3m] 未注册的动画通道: ${e}`);let i=this._buf;if(r.dim===1)i[0]=typeof t==`number`?t:Number(t[0]),i[1]=0,i[2]=0;else{if(typeof t==`number`)throw Error(`[s3m] 通道 ${e} 需要三元数组目标值`);for(let e=0;e<3;e++)i[e]=Number(t[e]??0)}let a=!!n.spring,o=Math.max(0,n.duration??0);if(!a&&o<=0&&!n.delay){this._tracks.delete(e),r.write(i),this.onActive?.(),n.onComplete?.();return}let s=Math.max(this._now(),this._lastTick),c=this._tracks.get(e),l=a,u=c instanceof mw;if(c&&c!=null&&u!==l&&(this._tracks.delete(e),c=void 0),c||this.onActive?.(),!c){let t=l?new mw(e,r):new pw(e,r);t.to.set(i.subarray(0,r.dim)),t.onComplete=n.onComplete,t.start(s,n),this._tracks.set(e,t)}else c.to.set(i.subarray(0,r.dim)),c.onComplete=n.onComplete,c.retarget(i,s,n)}cancel(e){this._tracks.delete(e)}finish(e){let t=this._tracks.get(e);t&&(this._tracks.delete(e),t.channel.write(t.to),this.onActive?.(),t.onComplete?.())}clear(){this._tracks.clear()}tick(e=this._now()){if(this._tracks.size===0)return this._lastTick=Math.max(this._lastTick,e),!1;this._lastTick=Math.max(this._lastTick,e);let t=performance.now(),n=0;for(let r of this._tracks.values())if(r.advance(e),n++,r.done&&this._finished.push(r),performance.now()-t>=this._budgetMs)break;if(this._finished.length>0){for(let e of this._finished)this._tracks.get(e.key)===e&&this._tracks.delete(e.key);let e=this._finished.splice(0,this._finished.length);for(let t of e)t.onComplete?.()}return this._skipped=Math.max(0,this._tracks.size-n),this._tracks.size>0}};function _w(e,t){let n=t[0]-e[0],r=t[1]-e[1],i=t[2]-e[2];return Math.sqrt(n*n+r*r+i*i)}function vw(e,t){let n=t[0]-e[0],r=t[1]-e[1];return Math.sqrt(n*n+r*r)}function yw(e,t){return t[2]-e[2]}function bw(e){let t=0;for(let n=1;n<e.length;n++)t+=_w(e[n-1],e[n]);return t}function xw(e){let t=0;for(let n=1;n<e.length;n++)t+=vw(e[n-1],e[n]);return t}function Sw(e){return e.length<2?0:bw(e)+_w(e[e.length-1],e[0])}function Cw(e){let t=e.length;if(t<3)return 0;let n=0,r=0,i=0;for(let a=0;a<t;a++){let o=e[a],s=e[(a+1)%t];n+=(o[1]-s[1])*(o[2]+s[2]),r+=(o[2]-s[2])*(o[0]+s[0]),i+=(o[0]-s[0])*(o[1]+s[1])}return Math.sqrt(n*n+r*r+i*i)/2}function ww(e){let t=e.length;if(t<3)return 0;let n=0;for(let r=0;r<t;r++){let i=e[r],a=e[(r+1)%t];n+=i[0]*a[1]-a[0]*i[1]}return Math.abs(n)/2}function Tw(e,t){return{distance3D:_w(e,t),distanceHorizontal:vw(e,t),heightDiff:yw(e,t)}}function Ew(e,t,n,r={}){let i=_w(e,t);if(i<=1e-6)return{visible:!0,distance:0,blockedDistance:null,blockedPoint:null,visibleRatio:1};let a=[(t[0]-e[0])/i,(t[1]-e[1])/i,(t[2]-e[2])/i],o=Math.max(0,r.originOffset??.05),s=Math.max(0,r.targetOffset??.05),c=Math.min(o+s,i*.5),l=[e[0]+a[0]*o,e[1]+a[1]*o,e[2]+a[2]*o],u=Math.max(0,i-c),d=n(l,a,u);if(d&&d.distance<u){let t=Math.min(i,d.distance+o);return{visible:!1,distance:i,blockedDistance:t,blockedPoint:d.point??[e[0]+a[0]*t,e[1]+a[1]*t,e[2]+a[2]*t],visibleRatio:Math.max(0,Math.min(1,t/i))}}return{visible:!0,distance:i,blockedDistance:null,blockedPoint:null,visibleRatio:1}}function Dw(e){let t=Math.hypot(e[0],e[1],e[2]);return t<1e-9?[0,0,1]:[e[0]/t,e[1]/t,e[2]/t]}function Ow(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]}function kw(e,t){let n=Dw(e);return{normal:n,constant:-Ow(n,t)}}function Aw(e,t){for(let n of e)if(Ow(n.normal,t)+n.constant<0)return!1;return!0}function jw(e){return[kw(e.normal,e.point)]}function Mw(e){let t=[Math.min(e.a[0],e.b[0]),Math.min(e.a[1],e.b[1]),Math.min(e.a[2],e.b[2])],n=[Math.max(e.a[0],e.b[0]),Math.max(e.a[1],e.b[1]),Math.max(e.a[2],e.b[2])];return[{normal:[1,0,0],constant:-t[0]},{normal:[-1,0,0],constant:n[0]},{normal:[0,1,0],constant:-t[1]},{normal:[0,-1,0],constant:n[1]},{normal:[0,0,1],constant:-t[2]},{normal:[0,0,-1],constant:n[2]}]}function Nw(e){let t=[kw([e.keepX,0,0],e.center),kw([0,e.keepY,0],e.center)];return e.horizontal&&t.push(kw([0,0,e.keepZ??-1],e.center)),t}function Pw(e){switch(e.type){case`plane`:return jw(e);case`box`:return Mw(e);case`cross`:return Nw(e)}}var Fw=256/255,Iw=255/256,Lw=1/256,Rw=16777216;function zw(e){let t=Math.min(1,Math.max(0,e));if(t<=0)return[0,0,0,0];if(t>=1)return[255,255,255,255];let n=Vw(t*Rw),r=Vw(n.int*Lw),i=Vw(r.int*Lw),a=e=>Math.max(0,Math.min(255,Math.round(e*255)));return[a(i.int/255),a(i.frac*Fw),a(r.frac*Fw),a(n.frac)]}function Bw(e,t=0){let n=e[t]/255,r=e[t+1]/255,i=e[t+2]/255,a=e[t+3]/255;return n*Iw+Iw/256*r+Iw/65536*i+a/Rw}function Vw(e){let t=Math.floor(e);return{frac:e-t,int:t}}function Hw(e,t,n,r){let i=n*2-1,a=r,o=a[0]*e+a[4]*t+a[8]*i+a[12],s=a[1]*e+a[5]*t+a[9]*i+a[13],c=a[2]*e+a[6]*t+a[10]*i+a[14],l=a[3]*e+a[7]*t+a[11]*i+a[15],u=Math.abs(l)>1e-12?1/l:1;return[o*u,s*u,c*u]}function Uw(e,t,n,r){return[(e+.5)/n*2-1,1-(t+.5)/r*2]}function Ww(e,t){let n=t[0]-e[0],r=t[1]-e[1],i=t[2]-e[2],a=Math.hypot(n,r),o=Math.hypot(a,i);return{azimuth:(Math.atan2(n,r)*180/Math.PI+360)%360,elevation:Math.atan2(i,a)*180/Math.PI,distance:o}}function Gw(e){let{rgba:t,width:n,height:r,inverseViewProj:i,cameraPos:a}=e,o=e.skyDepth??.9999,s=Math.max(1,Math.floor(e.step??1)),c=Math.ceil(n/s),l=new Float32Array(c),u=new Float32Array(c),d=new Float32Array(c*2),f=new Uint8Array(c),p=-90,m=90,h=0;for(let e=0;e<c;e++){let c=Math.min(n-1,e*s),g=!1;for(let s=0;s<r;s++){let h=Bw(t,(s*n+c)*4);if(h>=o)continue;let[_,v]=Uw(c,s,n,r),{azimuth:y,elevation:b}=Ww(a,Hw(_,v,h,i));l[e]=y,u[e]=b,d[e*2]=(c+.5)/n,d[e*2+1]=(s+.5)/r,f[e]=1,b>p&&(p=b),b<m&&(m=b),g=!0;break}g||(h++,l[e]=0,u[e]=0,d[e*2]=(c+.5)/n,d[e*2+1]=1,f[e]=0,0>p&&(p=0),0<m&&(m=0))}return{azimuths:l,elevations:u,maxElevation:p,minElevation:m,openRatio:c>0?h/c:0,screen:d,hasGeometry:f}}function Kw(e,t,n){let r=Math.max(.001,n.radius),i=Math.max(2,Math.floor(n.grid??96)),a=Math.max(0,n.bias??.5),o=n.groundZ??0,s=r*2/i,c=e[0]-r,l=e[1]-r,u=new Float32Array(i*i),d=0,f=0;for(let n=0;n<i;n++){let p=l+(n+.5)*s;for(let l=0;l<i;l++){let m=c+(l+.5)*s-e[0],h=p-e[1],g=o-e[2],_=Math.sqrt(m*m+h*h+g*g),v=n*i+l;if(_>r||_<1e-6){u[v]=-1;continue}let y=_<=t([m/_,h/_,g/_])+a;u[v]=+!!y,f++,y&&d++}}return{raster:u,grid:i,minX:c,minY:l,cellSize:s,visibleRatio:f>0?d/f:0}}function qw(e,t,n){return r=>{let[i,a,o]=r,s=Math.abs(i),c=Math.abs(a),l=Math.abs(o),u,d,f;if(s>=c&&s>=l){u=i>=0?0:1;let e=s;d=i>=0?-o/e:o/e,f=-a/e}else if(c>=l){u=a>=0?2:3;let e=c;d=i/e,f=a>=0?o/e:-o/e}else{u=o>=0?4:5;let e=l;d=o>=0?i/e:-i/e,f=-a/e}let p=e[u];if(!p)return 1/0;let m=Math.min(t-1,Math.max(0,Math.floor((d+1)/2*t))),h=Bw(p,(Math.min(t-1,Math.max(0,Math.floor((f+1)/2*t)))*t+m)*4);return h>=.9999?1/0:h*n}}sh();function Jw(e,t){if(!t?.length)return()=>{};let n=t.filter(e=>e&&!e.parent);for(let t of n)e.add(t);return()=>{for(let t of n)e.remove(t)}}function Yw(e){return{target:e.getRenderTarget(),toneMapping:e.toneMapping,colorSpace:e.outputColorSpace,autoClear:e.autoClear,clearColor:e.getClearColor(new W),clearAlpha:e.getClearAlpha()}}function Xw(e,t){e.setRenderTarget(t.target),e.toneMapping=t.toneMapping,e.outputColorSpace=t.colorSpace,e.autoClear=t.autoClear,e.setClearColor(t.clearColor,t.clearAlpha)}function Zw(e,t,n,r){let i=new Uint8Array(n*r*4);e.readRenderTargetPixels(t,0,0,n,r,i);let a=new Uint8Array(i.length),o=n*4;for(let e=0;e<r;e++)a.set(i.subarray((r-1-e)*o,(r-e)*o),e*o);return a}function Qw(e,t){return new uo(e,t,{format:fi,type:Qr,minFilter:Hr,magFilter:Hr,depthBuffer:!0})}function $w(e,t,n,r){let i=e.renderer(),a=e.scene(),o=e.camera();if(!i||!a||!o)return null;let s=Math.max(1,Math.floor(t)),c=Math.max(1,Math.floor(n)),l=Qw(s,c),u=new kl({depthPacking:pa}),d=a.overrideMaterial,f=Yw(i),p=Jw(a,r),m=null;try{i.resetState(),i.setRenderTarget(l),i.toneMapping=0,i.outputColorSpace=_a,i.autoClear=!0,i.setClearColor(16777215,1),i.clear(),a.overrideMaterial=u,o.updateMatrixWorld(),i.render(a,o),m=Zw(i,l,s,c)}finally{p(),a.overrideMaterial=d,Xw(i,f),u.dispose(),l.dispose()}let h=new U().multiplyMatrices(o.projectionMatrix,o.matrixWorldInverse),g=new Float32Array(h.clone().invert().elements),_=new H().setFromMatrixPosition(o.matrixWorld);return{rgba:m,width:s,height:c,inverseViewProj:g,cameraPos:[_.x,_.y,_.z]}}var eT=[{forward:[1,0,0],up:[0,-1,0]},{forward:[-1,0,0],up:[0,-1,0]},{forward:[0,1,0],up:[0,0,1]},{forward:[0,-1,0],up:[0,0,-1]},{forward:[0,0,1],up:[0,-1,0]},{forward:[0,0,-1],up:[0,-1,0]}];function tT(e,t,n){return eT.map(({forward:r,up:i})=>{let a=new Tc(90,1,t,n);return a.up.set(i[0],i[1],i[2]),a.position.set(e[0],e[1],e[2]),a.lookAt(e[0]+r[0],e[1]+r[1],e[2]+r[2]),a.updateMatrixWorld(!0),a})}function nT(e,t,n,r,i){let a=e.renderer(),o=e.scene();if(!a||!o)return null;let s=Math.max(8,Math.floor(n)),c=Qw(s,s),l=new bc({uniforms:{uOrigin:{value:new H(t[0],t[1],t[2])},uMaxDist:{value:r}},vertexShader:`
|
|
5152
|
+
varying vec3 vWorld;
|
|
5153
|
+
void main() {
|
|
5154
|
+
vec4 world = modelMatrix * vec4( position, 1.0 );
|
|
5155
|
+
vWorld = world.xyz;
|
|
5156
|
+
gl_Position = projectionMatrix * viewMatrix * world;
|
|
5157
|
+
}
|
|
5158
|
+
`,fragmentShader:`
|
|
5159
|
+
#include <common>
|
|
5160
|
+
#include <packing>
|
|
5161
|
+
uniform vec3 uOrigin;
|
|
5162
|
+
uniform float uMaxDist;
|
|
5163
|
+
varying vec3 vWorld;
|
|
5164
|
+
void main() {
|
|
5165
|
+
float d = clamp( length( vWorld - uOrigin ) / uMaxDist, 0.0, 1.0 );
|
|
5166
|
+
gl_FragColor = packDepthToRGBA( d );
|
|
5167
|
+
}
|
|
5168
|
+
`}),u=o.overrideMaterial,d=Yw(a),f=Jw(o,i),p=tT(t,.1,r),m=[];try{a.resetState(),a.setRenderTarget(c),a.toneMapping=0,a.outputColorSpace=_a,a.autoClear=!0,a.setClearColor(16777215,1),o.overrideMaterial=l;for(let e of p)a.clear(),a.render(o,e),m.push(Zw(a,c,s,s))}finally{f(),o.overrideMaterial=u,Xw(a,d),l.dispose(),c.dispose()}return m}sh(),mh();var rT=class{constructor(){X(this,`datasets`,new Map),X(this,`sceneAnchor`,null),X(this,`totalMaxTiles`,0),X(this,`defaultMaterialQuality`,void 0),X(this,`defaultColorPipeline`,void 0),X(this,`defaultTextureOptions`,void 0)}setDefaultMaterialQuality(e){this.defaultMaterialQuality=e;for(let t of this.datasets.values())t.options.materialQuality||t.tileset?.setMaterialQuality(e)}setRenderProfile(e){e.colorPipeline!==void 0&&(this.defaultColorPipeline=e.colorPipeline),e.textureOptions!==void 0&&(this.defaultTextureOptions=e.textureOptions);for(let t of this.datasets.values())t.tileset?.setRenderProfile(e)}get(e){return this.datasets.get(e)}values(){return this.datasets.values()}registerDataset(e){let t=this.datasets.get(e.id);if(t)return t;let n=new Il;n.name=`s3m-dataset:${e.id}`,n.visible=e.visible!==!1;let r={id:e.id,name:e.name??e.id,options:e,root:n,tileset:null,anchor:null,baseAlignOffset:0,userOffset:e.heightOffset??0,heightOffset:e.heightOffset??0,offset:[0,0,0],visible:e.visible!==!1,error:null};return this.datasets.set(e.id,r),this.rebalanceBudgets(),r}rebalanceBudgets(e){let t=e??this.totalMaxTiles;if(!t||t<=0)return;this.totalMaxTiles=t;let n=Array.from(this.datasets.values()).filter(e=>e.visible&&e.tileset),r=Math.max(1,n.length),i=Math.max(8,Math.floor(t/r));for(let e of this.datasets.values())e.tileset&&(e.visible?(e.tileset.maxTiles=i,e.tileset.hardCap=i+Math.max(4,Math.ceil(i*.5))):(e.tileset.maxTiles=Math.min(4,e.tileset.maxTiles),e.tileset.hardCap=Math.min(6,e.tileset.hardCap)))}computeAlignOffset(e,t){if(!t||t===`origin`||!e)return 0;let n=e.heightRange;if(!n)return 0;switch(t){case`top`:return-n.max;case`bottom`:return-n.min;case`center`:return-(n.min+n.max)/2;default:return 0}}async addDataset(e,t,n,r,i,a,o,s,c,l=1/0,u=128,d,f=1/0){let p=this.datasets.get(e.id);if(p)return p;let m=new Il;m.name=`s3m-dataset:${e.id}`,m.visible=e.visible!==!1,t.add(m);let h={id:e.id,name:e.name??e.id,options:e,root:m,tileset:null,anchor:null,baseAlignOffset:0,userOffset:e.heightOffset??0,heightOffset:e.heightOffset??0,offset:[0,0,0],visible:e.visible!==!1,error:null};this.datasets.set(e.id,h);let g=new CS({configUrl:e.configUrl,maxTiles:e.maxTiles??o,maxConcurrent:s,maxTriangles:e.maxTriangles??l,maxMemory:e.maxMemory??f,maxImageCache:e.maxImageCache??u,lodRangeScale:e.lodRangeScale??i,buildTile:a??null,polygonOffset:e.polygonOffset,materialQuality:e.materialQuality??this.defaultMaterialQuality,colorPipeline:this.defaultColorPipeline,textureOptions:this.defaultTextureOptions,useWorker:e.useWorker,authenticate:e.authenticate??d,unsupported:e.unsupported,uniforms:r,onTile:e=>{c.onTile(e,h)},onTileRemoved:e=>{c.onTileRemoved(e,h)},onProgress:()=>{c.onStats(),c.triggerRepaint()},onError:e=>{h.error=e,c.onError(e),c.onStats()}});h.tileset=g,this.rebalanceBudgets();try{await g.init()}catch(e){return h.error=e,c.onError(e),h}return h.anchor=g.anchor,h.baseAlignOffset=this.computeAlignOffset(g,e.align),h.userOffset=e.heightOffset??0,h.heightOffset=h.baseAlignOffset+h.userOffset,this.layoutDataset(h,n),c.onReady(h),c.triggerRepaint(),h}removeDataset(e,t,n,r){let i=this.datasets.get(e);return i?(r(i),i.tileset?.dispose(),t.remove(i.root),this.datasets.delete(e),this.rebalanceBudgets(),this.datasets.size>0?this.recomputeAnchors(n):this.sceneAnchor=null,!0):!1}clearDatasets(e,t){for(let n of this.datasets.values())t(n),n.tileset?.dispose(),e.remove(n.root);this.datasets.clear(),this.sceneAnchor=null}layoutDataset(e,t){if(!e.anchor)return;this.sceneAnchor||(this.sceneAnchor=F_(t,e.anchor.lon,e.anchor.lat,e.anchor.height??0));let n=this.sceneAnchor.meterInMercator,r=F_(t,e.anchor.lon,e.anchor.lat,e.anchor.height??0);e.offset=[(r.x-this.sceneAnchor.x)/n,-(r.y-this.sceneAnchor.y)/n,(r.z-this.sceneAnchor.z)/n+(e.heightOffset??0)],e.root.position.set(e.offset[0],e.offset[1],e.offset[2]),e.root.updateMatrixWorld(!0)}recomputeAnchors(e){if(this.datasets.size!==0){this.sceneAnchor=null;for(let t of this.datasets.values())this.layoutDataset(t,e)}}getDatasetHeight(e){let t=e??this.datasets.keys().next().value;return t?this.datasets.get(t)?.userOffset??0:0}setDatasetHeight(e,t,n){let r=this.datasets.get(e);r&&(r.userOffset=t,r.heightOffset=r.baseAlignOffset+t,this.layoutDataset(r,n))}setDatasetAlign(e,t,n){let r=this.datasets.get(e);if(!r)return;let i=r.heightOffset-r.baseAlignOffset;r.baseAlignOffset=this.computeAlignOffset(r.tileset,t),r.userOffset=i,r.heightOffset=r.baseAlignOffset+i,r.options.align=t,this.layoutDataset(r,n)}setDatasetVisible(e,t){let n=this.datasets.get(e);n&&(n.visible=t,n.root.visible=t,this.rebalanceBudgets())}getBounds(){let e=1/0,t=1/0,n=-1/0,r=-1/0,i=!1;for(let a of this.datasets.values()){if(!a.visible||!a.tileset?.config)continue;let o=vS(a.tileset.config.geoBounds);o&&(e=Math.min(e,o.left),t=Math.min(t,o.bottom),n=Math.max(n,o.right),r=Math.max(r,o.top),i=!0)}return i?[[e,t],[n,r]]:null}};sh(),mh();var iT=class{constructor(e={}){X(this,`mode`,void 0),X(this,`opacity`,void 0),X(this,`color`,void 0),X(this,`gridColor`,void 0),X(this,`gridSize`,void 0),X(this,`excavationBounds`,null),X(this,`size`,void 0),X(this,`groundHeight`,0),X(this,`occlude`,void 0),X(this,`trackHeight`,void 0),X(this,`group`,void 0),X(this,`_mesh`,null),X(this,`_material`,null),X(this,`_depthMesh`,null),X(this,`_depthMaterial`,null),X(this,`_geom`,null),X(this,`_occludeExplicit`,void 0),this.mode=e.mode??`none`,this.opacity=e.opacity??.62,this.color=new W(e.color??`#0f172a`),this.gridColor=new W(e.gridColor??`#38bdf8`),this.gridSize=e.gridSize??10,this.excavationBounds=e.excavationBounds??null,this.size=e.size??6e3,this._occludeExplicit=e.occlude!==void 0,this.occlude=e.occlude??this.mode===`excavate`,this.trackHeight=e.trackHeight??!0,this.group=new Il,this.group.name=`s3m-ground-surface`,this._initMesh(),this._applyMode()}_initMesh(){let e=new Rc(this.size,this.size,1,1);this._geom=e;let t=new bc({transparent:!0,depthTest:!0,depthWrite:!1,side:2,uniforms:{uColor:{value:this.color},uGridColor:{value:this.gridColor},uOpacity:{value:this.opacity},uGridSize:{value:this.gridSize},uMode:{value:this.mode===`excavate`?2:+(this.mode===`translucent`)},uHasExcavation:{value:0},uExcavationMin:{value:new B(-9999,-9999)},uExcavationMax:{value:new B(9999,9999)}},vertexShader:`
|
|
5152
5169
|
varying vec2 vEnuPos;
|
|
5153
5170
|
void main() {
|
|
5154
5171
|
vec4 worldPos = modelMatrix * vec4(position, 1.0);
|
|
@@ -5226,4 +5243,4 @@ void main() {
|
|
|
5226
5243
|
}
|
|
5227
5244
|
gl_FragColor = vec4(1.0);
|
|
5228
5245
|
}
|
|
5229
|
-
`}),i=new hc(e,r);i.position.set(0,0,-.02),i.renderOrder=-1e3,i.name=`s3m-ground-depth`,i.visible=!1,this.group.add(i),this._depthMesh=i,this._depthMaterial=r,this._syncUniforms()}_applyMode(){this._mesh&&(this._mesh.visible=this.mode!==`none`),this._material&&(this._material.uniforms.uMode.value=this.mode===`excavate`?2:+(this.mode===`translucent`),this._material.depthWrite=this.mode===`excavate`),this._depthMesh&&(this._depthMesh.visible=this.occlude,this._depthMaterial&&(this._depthMaterial.uniforms.uPunchPit.value=+(this.mode===`excavate`)))}update(e){e&&this.group.position.set(e.position.x,e.position.y,this.groundHeight)}setGroundHeight(e){this.groundHeight=e,this.group.position.z=e}setMode(e){this.mode=e,this._occludeExplicit||(this.occlude=e===`excavate`),this._applyMode()}setOcclude(e){this.occlude=e,this._occludeExplicit=!0,this._applyMode()}setOpacity(e){this.opacity=Math.max(0,Math.min(1,e)),this._material&&(this._material.uniforms.uOpacity.value=this.opacity)}setColors(e,t){this.color.set(e),t&&this.gridColor.set(t),this._material&&(this._material.uniforms.uColor.value=this.color,this._material.uniforms.uGridColor.value=this.gridColor)}setExcavationBounds(e){this.excavationBounds=e,this._syncUniforms()}autoFitExcavation(e){let t=1/0,n=1/0,r=-1/0,i=-1/0,a=!1;for(let o of e){let e=o.tileset?.config,s=e?.rootTiles??e?.tiles;if(Array.isArray(s))for(let e of s){let s=e.boundingBox;if(!s)continue;let c=s.center??{x:0,y:0},l=s.xExtent?.x?Math.abs(s.xExtent.x):50,u=s.yExtent?.y?Math.abs(s.yExtent.y):50,d=c.x+o.offset[0]-l,f=c.x+o.offset[0]+l,p=c.y+o.offset[1]-u,m=c.y+o.offset[1]+u;d<t&&(t=d),f>r&&(r=f),p<n&&(n=p),m>i&&(i=m),a=!0}}a&&Number.isFinite(t)&&this.setExcavationBounds([t-5,n-5,r+5,i+5])}_syncUniforms(){let e=this.excavationBounds;if(this._material){let t=this._material.uniforms;e?(t.uHasExcavation.value=1,t.uExcavationMin.value.set(e[0],e[1]),t.uExcavationMax.value.set(e[2],e[3])):t.uHasExcavation.value=0}if(this._depthMaterial){let t=this._depthMaterial.uniforms;e?(t.uHasExcavation.value=1,t.uExcavationMin.value.set(e[0],e[1]),t.uExcavationMax.value.set(e[2],e[3])):t.uHasExcavation.value=0}}dispose(){this._geom?.dispose(),this._geom=null,this._material?.dispose(),this._material=null,this._depthMaterial?.dispose(),this._depthMaterial=null,this._mesh=null,this._depthMesh=null,this.group.clear()}};sh(),pb(),tx(),hb(),vb(),mh();function yw(e){let t=Array.isArray(e.material)?e.material[0]:e.material;return t?.userData?.isStyled?t:null}function bw(e){return e.isPoints===!0}function xw(e){let t=e??1;return t<0?0:t>1?1:t}var Sw=.001,Cw=[`opacity`,`floorHeight`,`selectOpacity`,`selectEmissive`,`selectElevation`,`dimFactor`,`texMix`,`roofThreshold`,`ambientGain`,`metalness`,`roughness`,`edgeWidth`,`edgeOpacity`,`edgeOffset`,`edgeHullWidth`,`outlineWidth`],ww={metalness:0,roughness:.95},Tw=[`colorA`,`colorB`,`colorC`,`selectColor`,`edgeColor`],Ew=[`translation`,`elevation`,`opacity`,`color`,`rotation`],Dw=class{get datasets(){return this._datasetManager.datasets}get sceneAnchor(){return this._datasetManager.sceneAnchor}set sceneAnchor(e){this._datasetManager.sceneAnchor=e}_requestRepaint(){this._onRequestRepaint()}triggerRepaint(){this._requestRepaint()}constructor(e={}){X(this,`options`,void 0),X(this,`pickable`,void 0),X(this,`onStats`,void 0),X(this,`onReady`,void 0),X(this,`onPick`,void 0),X(this,`onError`,void 0),X(this,`geo`,null),X(this,`canvas`,null),X(this,`renderer`,null),X(this,`scene`,null),X(this,`camera`,null),X(this,`picker`,null),X(this,`uniforms`,void 0),X(this,`style`,void 0),X(this,`_styleTarget`,void 0),X(this,`outlineMaterial`,void 0),X(this,`lineShared`,void 0),X(this,`edgeMaterial`,void 0),X(this,`selectionEdgeMaterial`,void 0),X(this,`_edges`,void 0),X(this,`groundManager`,void 0),X(this,`_datasetManager`,new _w),X(this,`_materialQuality`,void 0),X(this,`_colorPipeline`,void 0),X(this,`_pipelineGen`,0),X(this,`_featureStyleManager`,void 0),X(this,`gpuPathManager`,new _b),X(this,`_customPathTime`,!1),X(this,`_picks`,void 0),X(this,`_smidMeshes`,new Map),X(this,`_heights`,void 0),X(this,`_sel`,void 0),X(this,`_tileFadeSeq`,0),X(this,`_modeGen`,0),X(this,`_shadingPrewarmed`,!1),X(this,`_prewarmShadingEnabled`,!0),X(this,`_prewarming`,!1),X(this,`_pathSpecs`,new Map),X(this,`_pathScratch`,new Float32Array(3)),X(this,`_pathScratch2`,new Float32Array(3)),X(this,`_pointClouds`,new Set),X(this,`_splats`,new WS),X(this,`_opacityTransparent`,!1),X(this,`animator`,new gw),X(this,`attributeQuery`,null),X(this,`_enuMatrix`,new U),X(this,`_frameMvp`,new U),X(this,`_colorScratch`,new W),X(this,`_frame`,0),X(this,`_fps`,{value:0,last:0}),X(this,`_lights`,void 0),X(this,`_datasetQueue`,void 0),X(this,`_onRequestRepaint`,()=>{}),X(this,`_getBearing`,void 0),X(this,`_authenticate`,void 0),X(this,`_lodRangeScale`,1),X(this,`_unsupported`,void 0),X(this,`_lodPixelRatioCap`,1/0),this.options=e,this.pickable=e.pickable!==!1,this._lodRangeScale=e.lodRangeScale??1,this._unsupported=e.unsupported??`warn`,this._lodPixelRatioCap=e.lodPixelRatioCap??1/0,$y(e.maxTextureSize??1/0),this._materialQuality=xb(e.materialQuality),this._datasetManager.defaultMaterialQuality=this._materialQuality,e.totalMaxTiles&&(this._datasetManager.totalMaxTiles=e.totalMaxTiles),this._onRequestRepaint=e.onRequestRepaint??(()=>{}),this._getBearing=e.getBearing,this._authenticate=e.authenticate,this.onStats=e.onStats??(()=>{}),this.onReady=e.onReady??(()=>{}),this.onPick=e.onPick??(()=>{}),this.onError=e.onError??(e=>console.warn(`[s3m]`,e)),this._prewarmShadingEnabled=e.prewarmShading!==!1,this.groundManager=new vw(e.ground),this.scene||(this.scene=new Jl,this.scene.add(this.groundManager.group)),this._featureStyleManager=new _C(()=>this.style.floorHeight,()=>this._requestRepaint(),()=>{this._sel.selection&&this._sel.syncStyle()},()=>this.getAllMeshes(),e=>this._applyOverridesToMesh(e),()=>this._opacityTransparent),this.uniforms=Db(),this._colorPipeline=Eb(e.colorPipeline),this._applyRenderProfile({},!0),this._lights=new kS({scene:()=>this.scene,renderer:()=>this.renderer,uniforms:this.uniforms,options:this.options,getBearing:()=>this._getBearing?.(),repaint:()=>this.triggerRepaint(),applyRenderProfile:(e,t)=>this._applyRenderProfile(e,t)}),this._lights.addToScene(),this._heights=new AS(this.uniforms);let t=this;this._picks=new yC({get picker(){return t.picker},get camera(){return t.camera},get scene(){return t.scene},get canvas(){return t.canvas},get style(){return t.style},get sceneAnchor(){return t.sceneAnchor},get datasets(){return t.datasets},get featureStyleManager(){return t._featureStyleManager},get smidMeshes(){return t._smidMeshes},lngLatFromWorld:(e,n)=>t._lngLatFromWorld(e,n),gpuPathPoseAt:e=>t._gpuPathPoseAt(e),isFeatureHidden:(e,n)=>t._isFeatureHidden(e,n)}),tb(q_),this.style={...Ib,...e.style??{}},this._styleTarget={...this.style},this._opacityTransparent=(this.style.opacity??1)<.999,this._applyStyleUniforms(),this._registerAnimChannels(),this.animator.onActive=()=>this._requestRepaint(),this.outlineMaterial=Ab(this.uniforms),this._edges=new lC({uniforms:this.uniforms,style:this.style,styleTarget:this._styleTarget,animator:this.animator,pickables:this._picks.pickables,scene:this.scene,renderer:this.renderer,camera:this.camera,authenticate:this._authenticate,requestRepaint:()=>this.triggerRepaint()}),this.lineShared=this._edges.lineShared,this.edgeMaterial=this._edges.edgeMaterial,this.selectionEdgeMaterial=this._edges.selectionEdgeMaterial,this._sel=new CC({uniforms:this.uniforms,style:this.style,outlineMaterial:this.outlineMaterial,selectionEdgeMaterial:this.selectionEdgeMaterial,featureStyleManager:this._featureStyleManager,smidMeshes:this._smidMeshes,pointClouds:this._pointClouds,applyPointCloudStyle:(e,t)=>this._applyPointCloudStyle(e,t),onPick:e=>this.onPick(e),requestRepaint:()=>this.triggerRepaint(),createSelectionEdgeMaterial:e=>this._edges.createSelectionEdgeMaterial(e)}),this.setEdges(this.style.edges),this._applyOpacity(),this._fps.last=performance.now(),this._datasetQueue=this._normalizeDatasets(e),e.attributes&&(this.attributeQuery=new j_({...e.attributes,authenticate:e.attributes.authenticate??this._authenticate}))}_createRenderer(e,t){let n=new Gl({canvas:e,context:t,antialias:!0});return n.autoClear=!1,n.setPixelRatio(1),n.toneMapping=this.options.toneMapping===void 0?0:this.options.toneMapping,n.toneMappingExposure=this.options.toneMappingExposure??1,n}_syncTextureCapabilities(e){let t=!!e.getExtension(`WEBGL_compressed_texture_s3tc`),n=!!e.getExtension(`WEBGL_compressed_texture_s3tc_srgb`);eb(t&&n)}mount(e,t){this.canvas=e,this.renderer=this._createRenderer(e,t),Xy(this.renderer.capabilities.getMaxAnisotropy(),this.options.anisotropyCap??1/0),this._syncTextureCapabilities(t),this.scene=new Jl,this.scene.add(this.groundManager.group),this._addLights(),this.camera=new xc,this.camera.matrixAutoUpdate=!1,this.picker=new RC(this.renderer),this._applyStyleUniforms();for(let e of this._datasetQueue)this.addDataset(e).catch(e=>this.onError(e));this._recomputeAnchors()}restoreContext(e){if(!this.canvas)console.warn(`[s3m] restoreContext 调用过早(尚未 mount),按首次挂载处理`);else{try{this.renderer?.dispose?.()}catch{}this.renderer=this._createRenderer(this.canvas,e),Xy(this.renderer.capabilities.getMaxAnisotropy(),this.options.anisotropyCap??1/0),this._syncTextureCapabilities(e),this.picker?.dispose(),this.picker=new RC(this.renderer),this._edges.disposeGpuEdge(),this._requestRepaint()}}unmount(){for(let e of[...this.datasets.keys()])this.removeDataset(e);this.clearCreases(),this.groundManager.dispose(),this.picker?.dispose(),this.picker=null,this._lights.dispose(),this.outlineMaterial.dispose(),this._edges.disposeGpuEdge(),this.edgeMaterial.dispose(),this.selectionEdgeMaterial.dispose(),this.scene?.clear(),this._sel.reset(),this._smidMeshes.clear(),this._heights.clear(),this.animator.clear(),this.animator.unregisterPrefix(`tile.`),this.animator.unregisterPrefix(`feature.`),this._pathSpecs.clear(),this.renderer?.dispose?.(),this.renderer=null,this.canvas=null}get _ambientLight(){return this._lights.ambient}get _hemiLight(){return this._lights.hemi}get _keyLight(){return this._lights.key}get _fillLight(){return this._lights.fill}_updateLights(){this._lights.update()}_addLights(){this._lights.addToScene()}setLightingPreset(e){this._lights.setLightingPreset(e)}setLight(e){this._lights.setLight(e)}getLight(){return this._lights.getLight()}setToneMapping(e,t=1){this._lights.setToneMapping(e,t)}getToneMapping(){return this._lights.getToneMapping()}setEnvironment(e,t=1){return this._lights.setEnvironment(e,t)}_normalizeDatasets(e){return Array.isArray(e.datasets)?e.datasets.filter(e=>!!e?.configUrl).map(t=>({...t,polygonOffset:t.polygonOffset??e.polygonOffset})):e.configUrl?[{id:`default`,name:`默认数据集`,configUrl:e.configUrl,useWorker:e.useWorker,polygonOffset:e.polygonOffset}]:[]}async addDataset(e){if(!this.scene)throw Error(`[s3m] 图层尚未 addLayer,不能添加数据集`);let t={...e,unsupported:e.unsupported??this._unsupported};return await this._datasetManager.addDataset(t,this.scene,this.geo,this.uniforms,this._lodRangeScale,this.options.buildTile,this.options.maxTiles??64,this.options.maxConcurrent??4,{onTile:(e,t)=>{this._registerTile(e,t),this.onStats(this.stats),this._requestRepaint()},onTileRemoved:(e,t)=>{this._unregisterTile(e,t),this.onStats(this.stats),this._requestRepaint()},onStats:()=>{this.onStats(this.stats),this._requestRepaint()},onError:e=>{this.onError(e),this.onStats(this.stats)},onReady:e=>{this.onReady(e),this._heights.refreshAll(),this.groundManager.excavationBounds||this.groundManager.autoFitExcavation(this.datasets.values())},triggerRepaint:()=>{this._requestRepaint()}},this.options.maxTriangles??1/0,this.options.maxImageCache??128,this._authenticate,this.options.maxMemory??1/0)}_lngLatFromWorld(e,t){return I_(this.geo,e,t)}recomputeAnchors(){this._datasetManager.recomputeAnchors(this.geo),this._heights.refreshAll(),this._requestRepaint()}_recomputeAnchors(){this.recomputeAnchors()}getDatasetHeight(e){return this._datasetManager.getDatasetHeight(e)}setDatasetHeight(e,t){let n,r;typeof e==`number`?(n=this.datasets.keys().next().value??``,r=e):(n=e,r=t??0),this._datasetManager.setDatasetHeight(n,r,this.geo),this._syncGroundHeight(),this._heights.refreshAll(),this._requestRepaint()}_syncGroundHeight(){if(!this.groundManager.trackHeight)return;let e=this.datasets.keys().next().value;if(!e)return;let t=this._datasetManager.getDatasetHeight(e);this.groundManager.setGroundHeight(t)}setDatasetAlign(e,t){let n,r;t===void 0&&(e===`origin`||e===`bottom`||e===`top`||e===`center`)?(n=this.datasets.keys().next().value??``,r=e):(n=e,r=t??`origin`),this._datasetManager.setDatasetAlign(n,r,this.geo),this._heights.refreshAll(),this._requestRepaint()}_computeAlignOffset(e,t){return this._datasetManager.computeAlignOffset(e,t)}computeAlignOffset(e,t){return this._datasetManager.computeAlignOffset(e,t)}setFeatureStyle(e,t){this._featureStyleManager.setFeatureStyle(e,t,this._meshesOf([e]))}setFeaturesStyle(e,t){this._featureStyleManager.setFeaturesStyle(e,t,this._meshesOf(e))}moveFeature(e,t,n){let r=this._ensureFeatureChannel(e,`translation`);this.animator.to(r,t,n)}moveFeatureBy(e,t,n){let r=this._featureStyleManager.getFeatureStyle(e)?.translation??[0,0,0];this.moveFeature(e,[r[0]+t[0],r[1]+t[1],r[2]+t[2]],n)}rotateFeature(e,t,n,r){let i=this._featureStyleManager.getFeatureStyle(e)??{};n&&this._featureStyleManager.setFeatureStyle(e,{...i,pivot:n},this._meshesOf([e]));let a=fC(t),o=this._ensureFeatureChannel(e,`rotation`);this.animator.to(o,a,r)}rotateFeatureBy(e,t,n,r){let i=fC(this._featureStyleManager.getFeatureStyle(e)?.rotation),a=typeof t==`number`?[0,0,t]:t;this.rotateFeature(e,[i[0]+a[0],i[1]+a[1],i[2]+a[2]],n,r)}crossFadeStyles(e,t){let n=e instanceof Map?e:new Map(Object.entries(e).map(([e,t])=>[Number(e),t])),r=this.getAllMeshes();this._featureStyleManager.prepareCrossFade(n,r);let i=`batch.mix`;this.animator.has(i)||this.animator.register(i,{dim:1,read:e=>{e[0]=this.uniforms.uBatchMix?.value??0},write:e=>{this.uniforms.uBatchMix&&(this.uniforms.uBatchMix.value=e[0]),this.triggerRepaint()}}),(t?.duration??0)>0||t?.spring?(this.uniforms.uBatchMix&&(this.uniforms.uBatchMix.value=0),this.animator.to(i,1,{...t,onComplete:()=>{this.uniforms.uBatchMix&&(this.uniforms.uBatchMix.value=0),this._featureStyleManager.commitCrossFade(n,r),this.triggerRepaint(),t?.onComplete?.()}})):(this.animator.has(i)&&this.animator.cancel(i),this.uniforms.uBatchMix&&(this.uniforms.uBatchMix.value=0),this._featureStyleManager.commitCrossFade(n,r),this.triggerRepaint(),t?.onComplete?.())}followPath(e,t,n={}){let r=t instanceof mb?t:new mb(t,{closed:n.closed});if(r.length<=0)return;let i=n.offset??[0,0,0],a=n.duration??(n.speed&&n.speed>0?r.length/n.speed*1e3:2e3),o=`feature.${e}.path`;this._pathSpecs.set(o,{path:r,offset:i}),this.animator.has(o)||this.animator.register(o,{dim:1,read:e=>{e[0]=0},write:t=>{let n=this._pathSpecs.get(o);if(!n)return;n.path.sampleAt(t[0],this._pathScratch);let r=this._meshesOf([e]),i=this._featureStyleManager.getFeatureStyle(e)??{};this._featureStyleManager.setFeatureStyle(e,{...i,translation:[n.offset[0]+this._pathScratch[0],n.offset[1]+this._pathScratch[1],n.offset[2]+this._pathScratch[2]]},r);for(let e of r)e.frustumCulled=!1}});let s=()=>{this.animator.to(o,1,{duration:a,easing:n.easing??`linear`,onComplete:()=>{n.loop?s():n.onComplete?.()}})};s()}stopPath(e){let t=`feature.${e}.path`;this.animator.cancel(t),this.animator.unregister(t),this._pathSpecs.delete(t)}_gpuPathPoseAt(e){let t=this._featureStyleManager.getFeatureStyle(e)?.gpuPath;if(!t)return null;let n=this.gpuPathManager.getPath(t.pathId);if(!n||n.length<=0)return null;let r=this.uniforms.uPathTime?.value??0,i=(t.phase??0)+r*(t.speed??0),a=t.loop;a===`clamp`||a===!1?i=Math.min(1,Math.max(0,i)):a===`pingpong`?(i%=2,i<0&&(i+=2),i=i>1?2-i:i):i-=Math.floor(i),n.sampleAt(i,this._pathScratch);let o=[this._pathScratch[0],this._pathScratch[1],this._pathScratch[2]],s=0;if(t.autoHeading!==!1){let e=.001;n.sampleAt(Math.min(1,i+e),this._pathScratch2);let t=this._pathScratch2[0]-o[0],r=this._pathScratch2[1]-o[1];t*t+r*r<1e-8&&(n.sampleAt(Math.max(0,i-e),this._pathScratch2),t=o[0]-this._pathScratch2[0],r=o[1]-this._pathScratch2[1]),t*t+r*r>=1e-8&&(s=Math.atan2(r,t))}return{pos:o,yaw:s}}registerGPUPath(e,t={}){let n=this.gpuPathManager.registerPath(e,t);return this.gpuPathManager.updateUniforms(this.uniforms),n}unregisterGPUPath(e){let t=this.gpuPathManager.unregisterPath(e);return this.gpuPathManager.updateUniforms(this.uniforms),t}getGPUPathManager(){return this.gpuPathManager}bindGPUPath(e,t,n={}){let r;r=typeof t==`number`?t:this.registerGPUPath(t);let i=this._meshesOf([e]);this._featureStyleManager.bindGPUPath(e,r,n,i);for(let e of i)e.frustumCulled=!1;return this.gpuPathManager.updateUniforms(this.uniforms),r}unbindGPUPath(e){let t=this._meshesOf([e]);this._featureStyleManager.unbindGPUPath(e,t),this.gpuPathManager.updateUniforms(this.uniforms)}setGPUPathProgress(e,t){let n=this._meshesOf([e]);this._featureStyleManager.setGPUPathProgress(e,t,n);for(let e of n)e.frustumCulled=!1}setGPUPathTime(e,t=!1){this.uniforms.uPathTime&&(this.uniforms.uPathTime.value=e),this._customPathTime=!t}getGPUPathTime(){return this.uniforms.uPathTime?.value??0}animateFeature(e,t,n){if(t.translation&&this.moveFeature(e,t.translation,n),t.rotation!=null&&this.rotateFeature(e,t.rotation,t.pivot,n),t.elevation!=null&&this.animator.to(this._ensureFeatureChannel(e,`elevation`),t.elevation,n),t.opacity!=null&&this.animator.to(this._ensureFeatureChannel(e,`opacity`),t.opacity,n),t.color&&(this._colorScratch.set(t.color),this.animator.to(this._ensureFeatureChannel(e,`color`),[this._colorScratch.r,this._colorScratch.g,this._colorScratch.b],n)),t.hidden!=null){let n=this._featureStyleManager.getFeatureStyle(e)??{};this.setFeatureStyle(e,{...n,hidden:t.hidden})}}animateFeatures(e,t,n){let r=n?.stagger??0;if(r<=0){for(let r of e)this.animateFeature(r,t,n);return}let i=n?.delay??0;for(let a=0;a<e.length;a++)this.animateFeature(e[a],t,{...n,delay:i+a*r})}setMode(e,t={}){let n=Math.max(0,t.duration??300),r=Math.min(1,Math.max(.05,t.dim??.35));if(this.style.mode===e)return Promise.resolve();if(n<=0)return this.setStyle({mode:e}),Promise.resolve();let i=++this._modeGen;return new Promise(t=>{this.animator.to(`style.fade`,r,{duration:n,easing:`easeInOutQuad`,onComplete:()=>{i===this._modeGen?(this.setStyle({mode:e}),this.animator.to(`style.fade`,1,{duration:n,easing:`easeInOutQuad`,onComplete:t})):t()}})})}_ensureFeatureChannel(e,t){let n=`feature.${e}.${t}`;if(this.animator.has(n))return n;let r=t===`translation`||t===`color`||t===`rotation`?{dim:3,read:n=>{if(t===`translation`){let t=this._featureStyleManager.getFeatureStyle(e)?.translation;n[0]=t?.[0]??0,n[1]=t?.[1]??0,n[2]=t?.[2]??0}else if(t===`rotation`){let t=this._featureStyleManager.getFeatureStyle(e)?.rotation,r=fC(t);n[0]=r[0],n[1]=r[1],n[2]=r[2]}else{let t=this._featureStyleManager.getFeatureStyle(e)?.color??this.style.colorA;this._colorScratch.set(t),n[0]=this._colorScratch.r,n[1]=this._colorScratch.g,n[2]=this._colorScratch.b}},write:n=>{let r=this._meshesOf([e]),i=this._featureStyleManager.getFeatureStyle(e)??{};if(t===`translation`){this._featureStyleManager.setFeatureStyle(e,{...i,translation:[n[0],n[1],n[2]]},r);let t=Math.abs(n[0])>1e-6||Math.abs(n[1])>1e-6||Math.abs(n[2])>1e-6,a=fC(i.rotation),o=Math.abs(a[0])>1e-6||Math.abs(a[1])>1e-6||Math.abs(a[2])>1e-6;for(let e of r)e.frustumCulled=!(t||o)}else if(t===`rotation`){this._featureStyleManager.setFeatureStyle(e,{...i,rotation:[n[0],n[1],n[2]]},r);let t=Math.abs(n[0])>1e-6||Math.abs(n[1])>1e-6||Math.abs(n[2])>1e-6,a=i.translation??[0,0,0],o=Math.abs(a[0])>1e-6||Math.abs(a[1])>1e-6||Math.abs(a[2])>1e-6;for(let e of r)e.frustumCulled=!(t||o)}else{let t=this._colorScratch.setRGB(n[0],n[1],n[2]);this._featureStyleManager.setFeatureStyle(e,{...i,color:`#${t.getHexString()}`},r)}}}:{dim:1,read:n=>{let r=this._featureStyleManager.getFeatureStyle(e);n[0]=(t===`elevation`?r?.elevation:r?.opacity)??+(t===`opacity`)},write:n=>{let r=this._featureStyleManager.getFeatureStyle(e)??{},i=t===`elevation`?{...r,elevation:n[0]}:{...r,opacity:n[0]};this._featureStyleManager.setFeatureStyle(e,i,this._meshesOf([e]))}};return this.animator.register(n,r),n}_releaseFeatureChannels(e){for(let t of Ew)this.animator.unregister(`feature.${e}.${t}`);let t=`feature.${e}.path`;this.animator.unregister(t),this._pathSpecs.delete(t)}getFeatureStyle(e){return this._featureStyleManager.getFeatureStyle(e)}getFeatureStyles(){return this._featureStyleManager.getFeatureStyles()}removeFeatureStyle(e){this._releaseFeatureChannels(e),this._featureStyleManager.removeFeatureStyle(e,this._meshesOf([e]))}clearFeatureStyles(){for(let e of this._featureStyleManager.getFeatureStyles().keys())this._releaseFeatureChannels(e);this._featureStyleManager.clearFeatureStyles()}setAttributeSource(e){this.attributeQuery=e?new j_({...e,authenticate:e.authenticate??this._authenticate}):null}getLoadedSmids(){return[...this._smidMeshes.keys()]}auditBatches(){let e=this._featureStyleManager.auditBatches(this._picks.pickables.values());return e.smids=this._smidMeshes.size,e}getThematicField(){return this._featureStyleManager.thematicField}setThematicColors(e,t=`custom`){this._featureStyleManager.setThematicColors(e,t)}clearThematic(){this._featureStyleManager.clearThematicColors()}getFilterField(){return this._featureStyleManager.fieldFilter?.field??null}filterByField(e){return this._featureStyleManager.filterByField(e,this.attributeQuery,this.getLoadedSmids())}clearFieldFilter(){this._featureStyleManager.clearFieldFilter()}getElevationField(){return this._featureStyleManager.elevationField}elevateByField(e){return this._featureStyleManager.elevateByField(e,this.attributeQuery,this.getLoadedSmids())}setThematicElevation(e,t=`custom`){this._featureStyleManager.setThematicElevation(e,t)}clearThematicElevation(){this._featureStyleManager.clearThematicElevation()}colorByField(e){return this._featureStyleManager.colorByField(e,this.attributeQuery,this.getLoadedSmids())}setFilter(e){this._featureStyleManager.setFilter(e,this.uniforms)}getFilter(){return this._featureStyleManager.filter}clearFilter(){this._featureStyleManager.clearFilter(this.uniforms)}setGroundMode(e){this.groundManager.setMode(e),this._requestRepaint()}setGroundOpacity(e){this.groundManager.setOpacity(e),this._requestRepaint()}setExcavationBounds(e){this.groundManager.setExcavationBounds(e),this._requestRepaint()}setGroundOcclude(e){this.groundManager.setOcclude(e),this._requestRepaint()}_isFeatureHidden(e,t){if(e==null)return!1;let n=this._featureStyleManager.fieldFilter;if(n){let t=n.matched.has(e);if(n.mode===`keep`?!t:t)return!0}let r=this._featureStyleManager.filter;return!!(r&&(r.include&&r.include.length>0&&!r.include.includes(e)||r.exclude&&r.exclude.length>0&&r.exclude.includes(e))||this._featureStyleManager.featureStyles.get(e)?.hidden)}getAllMeshes(){let e=[];for(let t of this._picks.pickables.values())e.push(t.mesh);return e}_meshesOf(e){let t=new Set;for(let n of e){let e=this._smidMeshes.get(n);if(e)for(let n of e)t.add(n)}return t}flushOverrides(){this._featureStyleManager.flushOverrides()}_applyOverridesToMesh(e){this._featureStyleManager.applyOverridesToMesh(e)}removeDataset(e){if(this.datasets.get(e)){this._sel.selection?.datasetId===e&&this.select(null),this._datasetManager.removeDataset(e,this.scene,this.geo,e=>{e.root.traverse(e=>{let t=e,n=t.userData;n.pickId!=null&&(this._picks.pickables.delete(n.pickId),this._releasePickId(n.pickId),n.pickId=void 0),this._unindexMeshSmids(t),this._heights.remove(t),t.geometry?.dispose?.();let r=yw(t);r&&r.dispose(),jC(t.material)&&t.material.dispose(),this._featureStyleManager.disposeMesh(t)})});for(let[t,n]of this._picks.pickables)n.datasetId===e&&this._picks.pickables.delete(t);this.onStats(this.stats),this._requestRepaint()}}clearDatasets(){for(let e of[...this.datasets.keys()])this.removeDataset(e)}setDatasetVisible(e,t){this._datasetManager.setDatasetVisible(e,t),!t&&this._sel.selection?.datasetId===e&&this.select(null),this._requestRepaint()}_registerTile(e,t){t.root.add(e.group),e.group.updateMatrixWorld(!0);let n=e.group.userData.hasNativeEdges===!0,r=this._edges.useNativeEdges(n);for(let i of e.group.children){if(i.isLineSegments&&i.userData.isEdgeLines){this._edges.registerNativeLine(i,r&&this._edges.enabled);continue}let a=bw(i),o=i;if(!o.isMesh&&!a)continue;a&&this._pointClouds.add(i),a&&this._splats.markDirty();let s=o.userData;if(s.pickId=this._allocPickId(),s.datasetId=t.id,s.nativeEdges=r,s.nativeEdgesRaw=n,this._picks.pickables.set(s.pickId,{datasetId:t.id,mesh:o,tile:e.tile,skeletonName:s.skeletonName??``}),this._indexMeshSmids(o),this._heights.add(o),this._edges.autoDecorate(o,t,r),a)this._applyPointCloudStyle(i);else{let e=yw(o);if(e){let t=xw(this.style.opacity),n=this.style.depthWrite!==!1;kb(e,t<.999,n),e.userData.uFlatShading&&(e.userData.uFlatShading.value=this.style.shading===`smooth`?0:1),this._featureStyleManager.applyOverridesToMesh(o),this._startTileFade(o,e)}}this._sel.replayOnto(o)}}_startTileFade(e,t){let n=this.style.fadeIn??0;if(n<=0)return;let r=t.userData.uTileFade;if(!r)return;r.value=0,t.transparent=!0,t.depthWrite=!0;let i=`tile.${this._tileFadeSeq++}.fade`;e.userData.tileFadeKey=i,this.animator.register(i,{dim:1,read:e=>{e[0]=r.value},write:e=>{r.value=e[0]}}),this.animator.to(i,1,{duration:n,easing:`easeOutQuad`,onComplete:()=>{r.value=1,e.userData.tileFadeKey=void 0,this.animator.unregister(i),kb(t,this._opacityTransparent,this.style.depthWrite!==!1),this._featureStyleManager.applyOverridesToMesh(e),this._requestRepaint()}})}_replaySelectionOnto(e){this._sel.replayOnto(e)}_unregisterTile(e,t){e.group.traverse(e=>{let t=e;if(e.isLineSegments&&t.userData?.isEdgeLines&&this._edges.unregisterNativeLine(e),bw(e)&&this._pointClouds.delete(e),t.userData?.tileFadeKey&&(this.animator.unregister(t.userData.tileFadeKey),t.userData.tileFadeKey=void 0),t.userData?.pickId!=null&&(this._picks.pickables.delete(t.userData.pickId),this._releasePickId(t.userData.pickId),t.userData.pickId=void 0),t.isMesh){this._sel.selectedMeshes.includes(t)&&(this._sel.selectedMeshes=this._sel.selectedMeshes.filter(e=>e!==t));let e=this._sel.selection;if(e&&e.mesh===t){let n=e.smid,r=n==null?this._sel.selectedMeshes.find(e=>e!==t&&e.parent&&e.parent.visible)??this._sel.selectedMeshes.find(e=>e!==t&&e.parent):[...this._smidMeshes.get(n)??[]].find(e=>e!==t&&e.parent);r?(this._sel.selection={...e,mesh:r},this._sel.replayOnto(r)):this.select(null)}this._unindexMeshSmids(t),this._heights.remove(t),this._featureStyleManager.disposeMesh(t),yw(t)?.dispose?.()}jC(t.material)?t.material.dispose():t.material&&(Array.isArray(t.material)?t.material.forEach(e=>e?.dispose?.()):t.material.dispose?.()),t.geometry?.dispose?.()}),t.root.remove(e.group)}setOpacity(e,t){this.setStyle({opacity:e},t)}setStyle(e={},t){Object.assign(this._styleTarget,e);let n=t?.duration??0,r=n>0||!!t?.spring,i=e;if(`edges`in e){let{edges:n,...a}=e;if(i=a,this.setEdges(n,r?t:void 0),Object.keys(i).length===0){this._requestRepaint();return}}let a=[],o={};for(let e of Object.keys(i))r&&this.animator.has(`style.${String(e)}`)?a.push(String(e)):o[e]=i[e];Object.keys(o).length>0&&(Object.assign(this.style,o),this._applyStyleEffects(o));for(let e of a)this.animator.to(`style.${e}`,this._animTargetOf(e,i),{...t,duration:n});this._requestRepaint()}getStyle(){return{...this._styleTarget,modeLabel:Mb[this._styleTarget.mode]}}_animTargetOf(e,t){let n=t[e];return this._animDimOf(e)===1?Number(n):(this._colorScratch.set(String(n)),[this._colorScratch.r,this._colorScratch.g,this._colorScratch.b])}_animDimOf(e){return Tw.includes(e)?3:1}_registerAnimChannels(){for(let e of Cw)this.animator.register(`style.${e}`,{dim:1,read:t=>{t[0]=Number(this.style[e]??ww[e]??0)},write:t=>{this.style[e]=t[0],this._onStyleChannelWrote(e)}});for(let e of Tw)this.animator.register(`style.${e}`,{dim:3,read:t=>{let n=this._uniformColorOf(e);t[0]=n.r,t[1]=n.g,t[2]=n.b},write:t=>{let n=this._uniformColorOf(e);n.setRGB(t[0],t[1],t[2]),this.style[e]=`#${n.getHexString()}`,this._onStyleChannelWrote(e)}});this.animator.register(`style.edgeFade`,{dim:1,read:e=>{e[0]=this.uniforms.uEdgeFade?.value??1},write:e=>{this.uniforms.uEdgeFade&&(this.uniforms.uEdgeFade.value=e[0]),this._edges.syncStyle()}}),this.animator.register(`style.fade`,{dim:1,read:e=>{e[0]=this.uniforms.uFade?.value??1},write:e=>{this.uniforms.uFade&&(this.uniforms.uFade.value=e[0]),this._requestRepaint()}})}_onStyleChannelWrote(e){e===`opacity`?this._applyOpacity():(this._applyStyleUniforms(),(e===`edgeColor`||e===`edgeWidth`||e===`edgeOpacity`||e===`edgeOffset`||e===`edgeHullWidth`)&&this._edges.refreshLines())}_uniformColorOf(e){let t=this.uniforms;switch(e){case`colorA`:return t.uColorA.value;case`colorB`:return t.uColorB.value;case`colorC`:return t.uColorC.value;case`selectColor`:return t.uSelColor.value;case`edgeColor`:return this.edgeMaterial.uniforms.uColor.value;default:return t.uColorA.value}}_applyStyleEffects(e){this._applyStyleUniforms(),(`opacity`in e||`depthWrite`in e)&&this._applyOpacity(),`mode`in e&&this._applyPointCloudStyles(),`shading`in e&&this._applyShading(),(`edgeThreshold`in e||`forceCpuEdges`in e)&&this._edges.enabled?(this._edges.disposeEdgeGeometry(),this.setEdges(this.style.edges)):(`edgeColor`in e||`edgeWidth`in e||`opacity`in e||`edgeOpacity`in e||`edgeOffset`in e||`edgeHullWidth`in e)&&this._edges.refreshLines(),this._sel.selection&&(`outline`in e||`outlineStyle`in e?this.select(this._sel.selection,{silent:!0}):this._sel.syncStyle())}_applyStyleUniforms(){let e=this.uniforms,t=this.style;e.uMode.value=t.mode,e.uColorA.value.set(t.colorA),e.uColorB.value.set(t.colorB),e.uColorC.value.set(t.colorC),e.uSelColor.value.set(t.selectColor),e.uFloorHeight.value=t.floorHeight;let n=t.selectMode??Nb.OVERLAY;e.uSelMode&&(e.uSelMode.value=n===Nb.REPLACE?0:n===Nb.MULTIPLY?2:n===Nb.GLOW_ONLY?3:1),e.uSelOpacity&&t.selectOpacity!=null&&(e.uSelOpacity.value=t.selectOpacity),e.uSelEmissive&&t.selectEmissive!=null&&(e.uSelEmissive.value=t.selectEmissive),e.uSelElevation&&t.selectElevation!=null&&(e.uSelElevation.value=t.selectElevation),e.uDimFactor&&t.dimFactor!=null&&(e.uDimFactor.value=t.dimFactor),e.uRoofThreshold&&t.roofThreshold!=null&&(e.uRoofThreshold.value=t.roofThreshold),e.uTexMix&&t.texMix!=null&&(e.uTexMix.value=t.texMix),e.uAmbientGain&&t.ambientGain!=null&&(e.uAmbientGain.value=t.ambientGain),e.uMetalness&&(e.uMetalness.value=t.metalness??-1),e.uRoughness&&(e.uRoughness.value=t.roughness??-1),e.uOpacity&&t.opacity!=null&&(e.uOpacity.value=xw(t.opacity)),this.outlineMaterial&&(this.outlineMaterial.uniforms.uElevation&&t.selectElevation!=null&&(this.outlineMaterial.uniforms.uElevation.value=t.selectElevation),t.outlineWidth!=null&&(this.outlineMaterial.uniforms.uWidth.value=t.outlineWidth),t.outlineColor==null?this.outlineMaterial.uniforms.uColor.value.set(t.selectColor):this.outlineMaterial.uniforms.uColor.value.set(t.outlineColor))}_applyOpacity(){let e=xw(this.style.opacity);this.uniforms.uOpacity&&(this.uniforms.uOpacity.value=e);let t=e<.999;if(t!==this._opacityTransparent){this._opacityTransparent=t;let e=this.style.depthWrite!==!1;for(let n of this._picks.pickables.values()){if(bw(n.mesh))continue;let r=yw(n.mesh);r&&(r.userData.uBatchTexActive?.value||(r.userData.uTileFade?.value??1)<1||kb(r,t,e))}}for(let e of this._pointClouds)this._applyPointCloudStyle(e);this._edges.syncStyle(),this._requestRepaint()}_applyPointCloudStyle(e,t=this._sel.selectedMeshes.includes(e)){AC(e,this.style,this.uniforms,t)}_applyPointCloudStyles(){for(let e of this._pointClouds)this._applyPointCloudStyle(e);this._requestRepaint()}_applyShading(){let e=this.style.shading===`smooth`?0:1;for(let t of this._picks.pickables.values()){let n=yw(t.mesh)?.userData.uFlatShading;n&&n.value!==e&&(n.value=e)}this._requestRepaint()}setMaterialQuality(e){this._materialQuality=xb(e)??`pbr`,this._datasetManager.setDefaultMaterialQuality(this._materialQuality),this._rebuildStyledMaterials(),this._requestRepaint()}get materialQuality(){return this._materialQuality??Cb()}setColorPipeline(e,t={}){let n=Eb(e)??`linear`;if(n===this.colorPipeline)return Promise.resolve();let r=Math.max(0,t.duration??0);if(r<=0)return this._applyRenderProfile({colorPipeline:n}),Promise.resolve();let i=Math.min(1,Math.max(.05,t.dim??.35)),a=++this._pipelineGen;return new Promise(e=>{this.animator.to(`style.fade`,i,{duration:r,easing:`easeInOutQuad`,onComplete:()=>{a===this._pipelineGen?(this._applyRenderProfile({colorPipeline:n}),this.animator.to(`style.fade`,1,{duration:r,easing:`easeInOutQuad`,onComplete:e})):e()}})})}get colorPipeline(){return this._colorPipeline??Tb()}_textureOptions(){return{srgbDecode:this.colorPipeline!==`direct`,maxSize:this.options.maxTextureSize??1/0,anisotropyCap:this.options.anisotropyCap??1/0}}_applyRenderProfile(e,t=!1){let n=this.colorPipeline;e.colorPipeline!==void 0&&(this._colorPipeline=Eb(e.colorPipeline)??`linear`),e.anisotropyCap!==void 0&&(this.options.anisotropyCap=e.anisotropyCap);let r=this._textureOptions();this._datasetManager.setRenderProfile({colorPipeline:this.colorPipeline,textureOptions:r}),!t&&(this.colorPipeline!==n&&this._rebuildStyledMaterials(),this._syncCachedTextures(r),this._requestRepaint())}_syncCachedTextures(e){let t=e.srgbDecode?ga:``;for(let n of this.datasets.values()){let r=n.tileset?.textureCache;if(r){for(let e of r.values())e.colorSpace!==t&&(e.colorSpace=t,e.needsUpdate=!0);Qy(r.values(),e.anisotropyCap??1/0)}}}_rebuildStyledMaterials(){let e=[`uSelBatch`,`uSelWhole`,`uBatchTex`,`uBatchTex2`,`uBatchTexWidth`,`uBatchTexActive`,`uTileFade`];for(let t of this._picks.pickables.values()){let n=t.mesh,r=n.material;if(Array.isArray(r))continue;let i=r;if(!i?.userData?.isStyled||!i.userData?.s3mOpts)continue;let a=i.userData.s3mOpts,o=Ob({...a,uniforms:this.uniforms,materialQuality:this.materialQuality,colorPipeline:this.colorPipeline});for(let t of e){let e=i.userData[t],n=o.userData[t];e&&n&&(n.value=e.value)}n.material=o,i.dispose()}}async prewarmShading(){if(this._shadingPrewarmed||this._prewarming)return;let e=this.renderer,t=this.scene,n=this.camera;if(!e||!t||!n)return;let r=!1;for(let e of this._picks.pickables.values())if(yw(e.mesh)){r=!0;break}if(r){this._shadingPrewarmed=!0;try{let r=e;typeof r.compileAsync==`function`?await r.compileAsync(t,n):e.compile(t,n)}catch{}this._requestRepaint()}}_addMeshHeight(e){this._heights.add(e)}_removeMeshHeight(e){this._heights.remove(e)}_indexMeshSmids(e){let t=e.userData.geoRef?.pickInfo;if(t)for(let n of Object.keys(t)){let t=Number(n);if(!Number.isFinite(t)||t<0)continue;let r=this._smidMeshes.get(t);r||this._smidMeshes.set(t,r=new Set),r.add(e)}}_unindexMeshSmids(e){let t=e.userData.geoRef?.pickInfo;if(t)for(let n of Object.keys(t)){let t=Number(n),r=this._smidMeshes.get(t);r&&(r.delete(e),r.size===0&&this._smidMeshes.delete(t))}}get _edgesEnabled(){return this._edges.enabled}get _edgeModes(){return this._edges.modes}get _gpuEdge(){return this._edges.gpuEdge}set _gpuEdge(e){this._edges.gpuEdge=e}_ensureEdges(e){this._edges.ensureEdges(e)}_removeEdges(e){this._edges.removeEdges(e)}setEdges(e,t){this._edges.setEdges(e,t)}loadCreases(e){return this._edges.loadCreases(e)}clearCreases(){this._edges.clearCreases()}getRayAt(e,t){return this._picks.getRayAt(e,t)}pick(e,t){return this._picks.pick(e,t)}pickPosition(e,t){return this._picks.pickPosition(e,t)}drillPick(e,t,n=10){return this._picks.drillPick(e,t,n)}getFeatureBounds(e){return this._picks.getFeatureBounds(e)}_intersectMeshAtRay(e,t,n){return this._picks.intersectMeshAtRay(e,t,n)}_buildPickResult(e,t,n,r){return this._picks.buildPickResult(e,t,n,r)}_buildSplatPickResult(e,t,n,r){return this._picks.buildSplatPickResult(e,t,n,r)}_instanceFeature(e,t,n){return this._picks.instanceFeature(e,t,n)}_instanceBox(e,t){return this._picks.instanceBox(e,t)}_allocPickId(){return this._picks.allocPickId()}_releasePickId(e){this._picks.releasePickId(e)}get _pickables(){return this._picks.pickables}select(e,t={}){this._sel.select(e,t)}_syncSelectionStyle(){this._sel.syncStyle()}get _selection(){return this._sel.selection}get _selectedMeshes(){return this._sel.selectedMeshes}get _selectionEdgeMeshes(){return this._sel.selectionEdgeMeshes}_updateLineResolution(e){let t=e.width||1,n=e.height||1,r=e.clientWidth||t;this.lineShared.uResolution.value.set(t,n),this.lineShared.uDpr.value=Math.max(1,t/r)}get lodRangeScale(){return this._lodRangeScale}get lodPixelRatioCap(){return this._lodPixelRatioCap}setLodPixelRatioCap(e){let t=e>0?e:1/0;this._lodPixelRatioCap=t,this.options.lodPixelRatioCap=t,this._requestRepaint()}_lodScreenHeight(e){let t=this._lodPixelRatioCap;if(!Number.isFinite(t))return e;let n=this.canvas?.clientHeight??0;return n<=0?e:Math.min(e,n*t)}get maxImageCache(){return this.options.maxImageCache??128}setMaxImageCache(e,t){let n=Number.isFinite(e)?Math.max(1,Math.floor(e)):128;if(t){let e=this.datasets.get(t);e?.tileset&&(e.tileset.maxImageCache=n)}else{this.options.maxImageCache=n;for(let e of this.datasets.values())e.tileset&&(e.tileset.maxImageCache=n)}this._requestRepaint()}get maxTriangles(){return this.options.maxTriangles??1/0}setMaxTriangles(e,t){let n=e>0?e:1/0;if(t){let e=this.datasets.get(t);e?.tileset&&e.tileset.setMaxTriangles(n)}else{this.options.maxTriangles=n;for(let e of this.datasets.values())e.tileset&&e.tileset.setMaxTriangles(n)}}get maxMemory(){return this.options.maxMemory??1/0}setMaxMemory(e,t){let n=Number.isFinite(e)&&e>0?e:1/0;if(t){let e=this.datasets.get(t);e?.tileset&&e.tileset.setMaxMemory(n)}else{this.options.maxMemory=n;for(let e of this.datasets.values())e.tileset&&e.tileset.setMaxMemory(n)}}get anisotropyCap(){return this.options.anisotropyCap??1/0}setAnisotropyCap(e){let t=Number.isFinite(e)&&e>0?Math.max(1,e):1/0;this.options.anisotropyCap=t,Xy(this.renderer?.capabilities.getMaxAnisotropy?.()??1,t),this._applyRenderProfile({anisotropyCap:t})}get maxTextureSize(){return this.options.maxTextureSize??1/0}setMaxTextureSize(e){let t=Number.isFinite(e)&&e>=1?e:1/0;this.options.maxTextureSize=t,$y(t),this._datasetManager.setRenderProfile({textureOptions:this._textureOptions()}),this._requestRepaint()}setLodRangeScale(e,t){if(!(e<=0)){if(t){let n=this.datasets.get(t);n?.tileset&&(n.tileset.lodRangeScale=e)}else{this._lodRangeScale=e;for(let t of this.datasets.values())t.tileset&&(t.tileset.lodRangeScale=e)}this._requestRepaint()}}_sortSplats(){this._splats.sort(this.camera,this._pointClouds)}renderFrame(e){if(!this.renderer||!this.scene||!this.camera||!this.sceneAnchor||!this.canvas)return!1;let t=this.renderer.getContext();if(t&&typeof t.isContextLost==`function`&&t.isContextLost())return!1;if(this._prewarming)return!0;let n=this.animator.tick();this.flushOverrides();let r=this.canvas,i=this.sceneAnchor.meterInMercator;this._enuMatrix.set(i,0,0,this.sceneAnchor.x,0,-i,0,this.sceneAnchor.y,0,0,i,this.sceneAnchor.z,0,0,0,1);let a=this._frameMvp.fromArray(e.mvp);a.multiply(this._enuMatrix),this.camera.projectionMatrix.copy(a),this.camera.projectionMatrixInverse.copy(a).invert();let o=e.cameraEnu;this.camera.position.set(o[0],o[1],o[2]),this.camera.matrixWorld.setPosition(o[0],o[1],o[2]),this.camera.matrixWorldInverse.copy(this.camera.matrixWorld).invert(),this.groundManager.update(this.camera);let s=!1,c=this._lodScreenHeight(e.canvasHeight);for(let t of this.datasets.values()){if(!t.visible||!t.tileset)continue;let n=[o[0]-t.offset[0],o[1]-t.offset[1],o[2]-t.offset[2]];t.tileset.update(n,e.fovRad,c)&&(s=!0)}this.style.mode===jb.DYNAMIC&&(this.uniforms.uTime.value+=.016*(this.style.speed??1)),this.gpuPathManager.updateUniforms(this.uniforms);let l=(this.uniforms.uPathTexActive?.value??0)>0;l&&!this._customPathTime&&this.uniforms.uPathTime&&(this.uniforms.uPathTime.value+=.016),this._updateLights(),this._updateLineResolution(r),Jx(r.width,r.height),this.renderer.setViewport(0,0,r.width,r.height),this.renderer.resetState(),(this.uniforms.uOpacity?.value??1)>Sw&&(this._sortSplats(),this.renderer.render(this.scene,this.camera),this._edges.renderGpuEdges(r)),this._frame++;let u=performance.now();u-this._fps.last>500&&(this._fps.value=Math.round(this._frame*1e3/(u-this._fps.last)),this._frame=0,this._fps.last=u);let d=n||this.style.mode===jb.DYNAMIC||l||this.stats.loading>0||s;return this._prewarmShadingEnabled&&!this._shadingPrewarmed&&this._picks.pickables.size>0&&this.prewarmShading(),d}get fps(){return this._fps.value}get stats(){let e={tiles:0,loading:0,failed:0,meshes:0,vertices:0,triangles:0,datasets:this.datasets.size,drawCalls:0,programs:0,textures:0,geometries:0,degradations:[]},t=null;for(let n of this.datasets.values()){let r=n.tileset?.stats;if(r&&(e.tiles+=r.tiles,e.loading+=r.loading,e.failed+=r.failed,e.meshes+=r.meshes,e.vertices+=r.vertices,e.triangles+=r.triangles,r.degradations?.length)){t??(t=[]);for(let e of r.degradations)t.includes(e)||t.push(e)}}t&&(e.degradations=t);let n=this.renderer?.info;return n&&(e.drawCalls=n.render.calls,e.programs=n.programs?.length??0,e.textures=n.memory.textures,e.geometries=n.memory.geometries),e}getBounds(){let e=1/0,t=1/0,n=-1/0,r=-1/0;for(let i of this.datasets.values()){let a=vS(i.tileset?.config?.geoBounds);a&&(e=Math.min(e,a.left),n=Math.max(n,a.right),t=Math.min(t,a.bottom),r=Math.max(r,a.top))}return isFinite(e)?[[e,t],[n,r]]:null}dispose(){this.unmount()}};mh();var Ow=class e{constructor(t={}){X(this,`id`,void 0),X(this,`options`,void 0),X(this,`pickable`,void 0),X(this,`onStats`,void 0),X(this,`onReady`,void 0),X(this,`onPick`,void 0),X(this,`onError`,void 0),X(this,`viewer`,void 0),X(this,`_projection`,`perspective`),X(this,`_projectionT`,0),X(this,`_orthoWarned`,!1),X(this,`_nearPlaneScale`,1),this.id=t.id??`s3m`,this.options=t,this.pickable=t.pickable!==!1,this._projection=t.projection===`orthographic`?`orthographic`:`perspective`,this._nearPlaneScale=e.normalizeNearPlaneScale(t.nearPlaneScale),this._projectionT=+(this._projection===`orthographic`),this.onStats=t.onStats??(()=>{}),this.onReady=t.onReady??(()=>{}),this.onPick=t.onPick??(()=>{}),this.onError=t.onError??(e=>console.warn(`[s3m]`,e));let{id:n,projection:r,nearPlaneScale:i,...a}=t;this.viewer=new Dw({...a,onRequestRepaint:()=>this.requestRepaint(),getBearing:()=>this.getBearing(),onStats:e=>this.onStats(e),onReady:e=>this.onReady(e),onPick:e=>this.onPick(e),onError:e=>this.onError(e)})}getBearing(){return 0}mountViewer(e,t){this.viewer.renderer?this.viewer.restoreContext(t):this.viewer.mount(e,t)}unmountViewer(){this.viewer.unmount()}driveFrame(e){let t=this.viewer.renderFrame(e);return t&&this.requestRepaint(),t}setProjection(e,t){let n=e===`orthographic`?`orthographic`:`perspective`,r=+(n===`orthographic`),i=t?.duration??0,a=i>0||!!t?.spring;this._projection=n,this._orthoWarned=!1,a?(this._ensureProjectionChannel(),this.viewer.animator.to(`projection.t`,r,{...t,duration:i,easing:t?.easing??`easeInOutCubic`,onComplete:()=>{this._projectionT=r,this.requestRepaint()}}),this.requestRepaint()):(this.viewer.animator.has(`projection.t`)&&this.viewer.animator.cancel(`projection.t`),this._projectionT=r,this.requestRepaint())}get projection(){return this._projection}get projectionT(){return this._projectionT}_ensureProjectionChannel(){this.viewer.animator.has(`projection.t`)||this.viewer.animator.register(`projection.t`,{dim:1,read:e=>{e[0]=this._projectionT},write:e=>{this._projectionT=e[0],this.requestRepaint()}})}setNearPlaneScale(t){this._nearPlaneScale=e.normalizeNearPlaneScale(t),this.requestRepaint()}get nearPlaneScale(){return this._nearPlaneScale}static normalizeNearPlaneScale(e){return typeof e!=`number`||!Number.isFinite(e)?1:e>0&&e<1?e:1}};sh();var kw=1e-4;function Aw(e,t){let n=e.elements;for(let e=0;e<16;e++){let r=Math.max(1,Math.abs(n[e]),Math.abs(t[e]));if(Math.abs(n[e]-t[e])>kw*r)return!1}return!0}function jw(e){let t=e.elements,n=1;for(let e=0;e<16;e++){let r=Math.abs(t[e]);r>n&&(n=r)}let r=1e-6*n;return Math.abs(t[3])<r&&Math.abs(t[7])<r&&Math.abs(t[11])<r&&Math.abs(t[15]-1)<r}function Mw(e,t){return t>0&&Math.abs(e.elements[5]*Math.tan(t/2)-1)<.001}function Nw(e){if(!e||typeof e!=`object`)return null;let t=e;return t.defaultProjectionData?.projectionMatrix??t.projectionMatrix??null}function Pw(e){let t={nearZ:null,farZ:null};if(!e||typeof e!=`object`)return t;let n=e,r=n.defaultProjectionData,i=e=>{let t=n[e];if(typeof t==`number`&&Number.isFinite(t))return t;let i=r?.[e];return typeof i==`number`&&Number.isFinite(i)?i:null};return{nearZ:i(`nearZ`),farZ:i(`farZ`)}}function Fw(e,t){if(e&&typeof e==`object`){let t=e.fov;if(typeof t==`number`&&Number.isFinite(t)&&t>0)return t}return typeof t==`number`&&Number.isFinite(t)&&t>0?t:null}function Iw(e,t){let n=e.projectionMatrix;if(!n||n.length<16)return null;let r=new U().fromArray(Array.from(n)),i=new U().fromArray(Array.from(e.mvp));if(r.determinant()===0||!Mw(r,t.fov))return null;let a=r.clone().invert().multiply(i);if(!Aw(r.clone().multiply(a),Array.from(e.mvp))||!jw(a)||!Mw(r,t.fov))return null;let{distance:o,fov:s,aspect:c}=t;if(!(o>0)||!(s>0)||!(c>0))return null;let l=o*Math.tan(s/2),u=l*c,d=e.nearZ!=null&&e.nearZ>0?e.nearZ:1,f=e.farZ!=null&&e.farZ>d?e.farZ:o*4+1e3;f>d||(f=d+1e3);let p=new Uc(-u,u,l,-l,d,f);return p.updateProjectionMatrix(),{matrix:p.projectionMatrix.clone().multiply(a),view:a}}function Lw(e,t){if(!(t>0)||t>=1)return null;let n=e.projectionMatrix;if(!n||n.length<16)return null;let r=new U().fromArray(Array.from(n));if(!Number.isFinite(r.determinant())||r.determinant()===0||Math.abs(r.elements[11]+1)>1e-6)return null;let i=e.nearZ!=null&&e.nearZ>0?e.nearZ:NaN,a=e.farZ!=null&&e.farZ>i?e.farZ:NaN;if(!(i>0)||!(a>i)){let e=-r.elements[10];if(!(e>1)||(i=-r.elements[14]/(e+1),a=i*(e+1)/(e-1),!(i>0)||!(a>i)))return null}let o=i*t;if(!(o>0)||!(o<a))return null;let s=r.clone();s.elements[10]=-(a+o)/(a-o),s.elements[14]=-2*a*o/(a-o);let c=s.multiply(r.clone().invert()).multiply(new U().fromArray(Array.from(e.mvp)));for(let e=0;e<16;e++)if(!Number.isFinite(c.elements[e]))return null;return c}function Rw(e,t,n){let r=e.projectionMatrix;if(!r||r.length<16)return null;let i=new U().fromArray(Array.from(r)),a=new U().fromArray(Array.from(e.mvp));if(i.determinant()===0||!Mw(i,t.fov))return null;let o=i.clone().invert().multiply(a);if(!Aw(i.clone().multiply(o),Array.from(e.mvp))||!jw(o))return null;let s=Math.max(0,Math.min(1,n));if(s<=0)return{matrix:a,view:o};let{distance:c,fov:l,aspect:u}=t;if(!(c>0)||!(l>0)||!(u>0))return null;let d=c*Math.tan(l/2),f=d*u,p=e.nearZ!=null&&e.nearZ>0?e.nearZ:1,m=e.farZ!=null&&e.farZ>p?e.farZ:c*4+1e3;m>p||(m=p+1e3);let h=new Uc(-f,f,d,-d,p,m);if(h.updateProjectionMatrix(),s>=1)return{matrix:h.projectionMatrix.clone().multiply(o),view:o};let g=new U,_=i.elements,v=h.projectionMatrix.elements,y=g.elements;for(let e=0;e<16;e++)y[e]=(1-s)*_[e]+s*v[e];return{matrix:g.multiply(o),view:o}}var zw=o({Animator:()=>gw,AttributeQuery:()=>j_,BinaryReader:()=>hh,DEFAULT_FLOOR_HEIGHT:()=>C_,DEFAULT_LIGHT_PRESET:()=>wS,DEFAULT_STYLE:()=>Ib,DatasetManager:()=>_w,EARTH_RADIUS:()=>M_,EASING_NAMES:()=>YC,FeatureStyleManager:()=>_C,GPUPathManager:()=>_b,GpuEdgePass:()=>aC,GroundManager:()=>vw,HostRenderer:()=>Ow,LIGHT_PRESETS:()=>ES,Path:()=>mb,Picker:()=>RC,PixelFormat:()=>my,S3MFormatError:()=>p_,S3MTileset:()=>CS,S3MViewer:()=>Dw,S3M_VERSION:()=>Fg,SAMPLES_PER_PATH:()=>256,SELECT_MODE:()=>Nb,SELECT_MODE_LABELS:()=>Pb,STYLE:()=>jb,STYLE_LABELS:()=>Mb,SUPERMAP_LIGHT_PRESET:()=>TS,TextureCompress:()=>hy,VertexTag:()=>Ig,VertexTagV3:()=>Lg,authFetch:()=>E_,buildAttributes:()=>x_,buildBlendedMVP:()=>Rw,buildFeatureEdgeSegments:()=>eC,buildNearScaledMVP:()=>Lw,buildOrthoMVP:()=>Iw,buildThickLineGeometry:()=>YS,buildTileObjects:()=>iS,createLineSharedUniforms:()=>GS,createOutlineMaterial:()=>Ab,createSharedUniforms:()=>Db,createStyledMaterial:()=>Ob,createTexture:()=>ob,createThickLineMaterial:()=>JS,cubicBezier:()=>ow,default:()=>Dw,dxtPixelFormatOf:()=>py,easing:()=>XC,extractEulerAngles:()=>fC,extractFovRadians:()=>Fw,extractNearFar:()=>Pw,extractProjectionMatrix:()=>Nw,getColorPipeline:()=>Tb,getMaterialQuality:()=>Cb,isS3M1Buffer:()=>pg,lngLatFromMercator:()=>P_,lngLatFromWorld:()=>I_,measureSegments:()=>b_,mercatorFromLngLat:()=>N_,parseS3M1:()=>Pg,parseS3MB:()=>m_,planDegradations:()=>g_,resolveAuthRequest:()=>T_,resolveEdgeModes:()=>yb,resolveFeature:()=>y_,resolveLightingPreset:()=>DS,resolveRotationMatrix:()=>dC,resolveTextureKind:()=>fy,sameEdgeModes:()=>bb,setColorPipeline:()=>wb,setMaterialQuality:()=>Sb,setMaxAnisotropy:()=>Xy,setMaxTextureSize:()=>$y,setSrgbTextureDecode:()=>rb,steps:()=>sw,worldFromLngLat:()=>F_});w_(),tx(),vb(),dS(),pb(),vy(),hb(),sh(),w_(),vy(),pb(),hb(),vb(),tx(),dS();var Bw=globalThis;return Bw.THREE||(Bw.THREE=l),Bw.S3M=zw,e.Animator=gw,e.AttributeQuery=j_,e.BinaryReader=hh,e.DEFAULT_FLOOR_HEIGHT=C_,e.DEFAULT_LIGHT_PRESET=wS,e.DEFAULT_STYLE=Ib,e.DatasetManager=_w,e.EARTH_RADIUS=M_,e.EASING_NAMES=YC,e.FeatureStyleManager=_C,e.GPUPathManager=_b,e.GpuEdgePass=aC,e.GroundManager=vw,e.HostRenderer=Ow,e.LIGHT_PRESETS=ES,e.Path=mb,e.Picker=RC,e.PixelFormat=my,e.S3MFormatError=p_,e.S3MTileset=CS,e.S3MViewer=Dw,e.default=Dw,e.S3M_VERSION=Fg,e.SAMPLES_PER_PATH=gb,e.SELECT_MODE=Nb,e.SELECT_MODE_LABELS=Pb,e.STYLE=jb,e.STYLE_LABELS=Mb,e.SUPERMAP_LIGHT_PRESET=TS,e.TextureCompress=hy,e.VertexTag=Ig,e.VertexTagV3=Lg,e.authFetch=E_,e.buildAttributes=x_,e.buildBlendedMVP=Rw,e.buildFeatureEdgeSegments=eC,e.buildNearScaledMVP=Lw,e.buildOrthoMVP=Iw,e.buildThickLineGeometry=YS,e.buildTileObjects=iS,e.createLineSharedUniforms=GS,e.createOutlineMaterial=Ab,e.createSharedUniforms=Db,e.createStyledMaterial=Ob,e.createTexture=ob,e.createThickLineMaterial=JS,e.cubicBezier=ow,e.dxtPixelFormatOf=py,e.easing=XC,e.extractEulerAngles=fC,e.extractFovRadians=Fw,e.extractNearFar=Pw,e.extractProjectionMatrix=Nw,e.getColorPipeline=Tb,e.getMaterialQuality=Cb,e.isS3M1Buffer=pg,e.lngLatFromMercator=P_,e.lngLatFromWorld=I_,e.measureSegments=b_,e.mercatorFromLngLat=N_,e.parseS3M1=Pg,e.parseS3MB=m_,e.planDegradations=g_,e.resolveAuthRequest=T_,e.resolveEdgeModes=yb,e.resolveFeature=y_,e.resolveLightingPreset=DS,e.resolveRotationMatrix=dC,e.resolveTextureKind=fy,e.sameEdgeModes=bb,e.setColorPipeline=wb,e.setMaterialQuality=Sb,e.setMaxAnisotropy=Xy,e.setMaxTextureSize=$y,e.setSrgbTextureDecode=rb,e.steps=sw,e.worldFromLngLat=F_,e})({});
|
|
5246
|
+
`}),i=new hc(e,r);i.position.set(0,0,-.02),i.renderOrder=-1e3,i.name=`s3m-ground-depth`,i.visible=!1,this.group.add(i),this._depthMesh=i,this._depthMaterial=r,this._syncUniforms()}_applyMode(){this._mesh&&(this._mesh.visible=this.mode!==`none`),this._material&&(this._material.uniforms.uMode.value=this.mode===`excavate`?2:+(this.mode===`translucent`),this._material.depthWrite=this.mode===`excavate`),this._depthMesh&&(this._depthMesh.visible=this.occlude,this._depthMaterial&&(this._depthMaterial.uniforms.uPunchPit.value=+(this.mode===`excavate`)))}update(e){e&&this.group.position.set(e.position.x,e.position.y,this.groundHeight)}setGroundHeight(e){this.groundHeight=e,this.group.position.z=e}setMode(e){this.mode=e,this._occludeExplicit||(this.occlude=e===`excavate`),this._applyMode()}setOcclude(e){this.occlude=e,this._occludeExplicit=!0,this._applyMode()}setOpacity(e){this.opacity=Math.max(0,Math.min(1,e)),this._material&&(this._material.uniforms.uOpacity.value=this.opacity)}setColors(e,t){this.color.set(e),t&&this.gridColor.set(t),this._material&&(this._material.uniforms.uColor.value=this.color,this._material.uniforms.uGridColor.value=this.gridColor)}setExcavationBounds(e){this.excavationBounds=e,this._syncUniforms()}autoFitExcavation(e){let t=1/0,n=1/0,r=-1/0,i=-1/0,a=!1;for(let o of e){let e=o.tileset?.config,s=e?.rootTiles??e?.tiles;if(Array.isArray(s))for(let e of s){let s=e.boundingBox;if(!s)continue;let c=s.center??{x:0,y:0},l=s.xExtent?.x?Math.abs(s.xExtent.x):50,u=s.yExtent?.y?Math.abs(s.yExtent.y):50,d=c.x+o.offset[0]-l,f=c.x+o.offset[0]+l,p=c.y+o.offset[1]-u,m=c.y+o.offset[1]+u;d<t&&(t=d),f>r&&(r=f),p<n&&(n=p),m>i&&(i=m),a=!0}}a&&Number.isFinite(t)&&this.setExcavationBounds([t-5,n-5,r+5,i+5])}_syncUniforms(){let e=this.excavationBounds;if(this._material){let t=this._material.uniforms;e?(t.uHasExcavation.value=1,t.uExcavationMin.value.set(e[0],e[1]),t.uExcavationMax.value.set(e[2],e[3])):t.uHasExcavation.value=0}if(this._depthMaterial){let t=this._depthMaterial.uniforms;e?(t.uHasExcavation.value=1,t.uExcavationMin.value.set(e[0],e[1]),t.uExcavationMax.value.set(e[2],e[3])):t.uHasExcavation.value=0}}dispose(){this._geom?.dispose(),this._geom=null,this._material?.dispose(),this._material=null,this._depthMaterial?.dispose(),this._depthMaterial=null,this._mesh=null,this._depthMesh=null,this.group.clear()}};sh(),pb(),tx(),hb(),vb(),mh();function aT(e){let t=Array.isArray(e.material)?e.material[0]:e.material;return t?.userData?.isStyled?t:null}function oT(e){return e.isPoints===!0}function sT(e){let t=e??1;return t<0?0:t>1?1:t}var cT=.001,lT=[`opacity`,`floorHeight`,`selectOpacity`,`selectEmissive`,`selectElevation`,`dimFactor`,`texMix`,`roofThreshold`,`ambientGain`,`metalness`,`roughness`,`edgeWidth`,`edgeOpacity`,`edgeOffset`,`edgeHullWidth`,`outlineWidth`],uT={metalness:0,roughness:.95},dT=[`colorA`,`colorB`,`colorC`,`selectColor`,`edgeColor`],fT=[`translation`,`elevation`,`opacity`,`color`,`rotation`],pT=class{get datasets(){return this._datasetManager.datasets}get sceneAnchor(){return this._datasetManager.sceneAnchor}set sceneAnchor(e){this._datasetManager.sceneAnchor=e}_requestRepaint(){this._onRequestRepaint()}triggerRepaint(){this._requestRepaint()}constructor(e={}){X(this,`options`,void 0),X(this,`pickable`,void 0),X(this,`onStats`,void 0),X(this,`onReady`,void 0),X(this,`onPick`,void 0),X(this,`onError`,void 0),X(this,`geo`,null),X(this,`canvas`,null),X(this,`renderer`,null),X(this,`scene`,null),X(this,`camera`,null),X(this,`picker`,null),X(this,`uniforms`,void 0),X(this,`style`,void 0),X(this,`_styleTarget`,void 0),X(this,`outlineMaterial`,void 0),X(this,`lineShared`,void 0),X(this,`edgeMaterial`,void 0),X(this,`selectionEdgeMaterial`,void 0),X(this,`_edges`,void 0),X(this,`groundManager`,void 0),X(this,`_datasetManager`,new rT),X(this,`_materialQuality`,void 0),X(this,`_colorPipeline`,void 0),X(this,`_pipelineGen`,0),X(this,`_clip`,null),X(this,`_featureStyleManager`,void 0),X(this,`gpuPathManager`,new _b),X(this,`_customPathTime`,!1),X(this,`_picks`,void 0),X(this,`_smidMeshes`,new Map),X(this,`_heights`,void 0),X(this,`_sel`,void 0),X(this,`_tileFadeSeq`,0),X(this,`_modeGen`,0),X(this,`_shadingPrewarmed`,!1),X(this,`_prewarmShadingEnabled`,!0),X(this,`_prewarming`,!1),X(this,`_pathSpecs`,new Map),X(this,`_pathScratch`,new Float32Array(3)),X(this,`_pathScratch2`,new Float32Array(3)),X(this,`_pointClouds`,new Set),X(this,`_splats`,new WS),X(this,`_opacityTransparent`,!1),X(this,`animator`,new gw),X(this,`attributeQuery`,null),X(this,`_enuMatrix`,new U),X(this,`_frameMvp`,new U),X(this,`_colorScratch`,new W),X(this,`_frame`,0),X(this,`_fps`,{value:0,last:0}),X(this,`_lights`,void 0),X(this,`_datasetQueue`,void 0),X(this,`_onRequestRepaint`,()=>{}),X(this,`_getBearing`,void 0),X(this,`_authenticate`,void 0),X(this,`_lodRangeScale`,1),X(this,`_unsupported`,void 0),X(this,`_lodPixelRatioCap`,1/0),this.options=e,this.pickable=e.pickable!==!1,this._lodRangeScale=e.lodRangeScale??1,this._unsupported=e.unsupported??`warn`,this._lodPixelRatioCap=e.lodPixelRatioCap??1/0,$y(e.maxTextureSize??1/0),this._materialQuality=xb(e.materialQuality),this._datasetManager.defaultMaterialQuality=this._materialQuality,e.totalMaxTiles&&(this._datasetManager.totalMaxTiles=e.totalMaxTiles),this._onRequestRepaint=e.onRequestRepaint??(()=>{}),this._getBearing=e.getBearing,this._authenticate=e.authenticate,this.onStats=e.onStats??(()=>{}),this.onReady=e.onReady??(()=>{}),this.onPick=e.onPick??(()=>{}),this.onError=e.onError??(e=>console.warn(`[s3m]`,e)),this._prewarmShadingEnabled=e.prewarmShading!==!1,this.groundManager=new iT(e.ground),this.scene||(this.scene=new Jl,this.scene.add(this.groundManager.group)),this._featureStyleManager=new _C(()=>this.style.floorHeight,()=>this._requestRepaint(),()=>{this._sel.selection&&this._sel.syncStyle()},()=>this.getAllMeshes(),e=>this._applyOverridesToMesh(e),()=>this._opacityTransparent),this.uniforms=Db(),this._colorPipeline=Eb(e.colorPipeline),this._applyRenderProfile({},!0),this._lights=new kS({scene:()=>this.scene,renderer:()=>this.renderer,uniforms:this.uniforms,options:this.options,getBearing:()=>this._getBearing?.(),repaint:()=>this.triggerRepaint(),applyRenderProfile:(e,t)=>this._applyRenderProfile(e,t)}),this._lights.addToScene(),this._heights=new AS(this.uniforms);let t=this;this._picks=new yC({get picker(){return t.picker},get camera(){return t.camera},get scene(){return t.scene},get canvas(){return t.canvas},get style(){return t.style},get sceneAnchor(){return t.sceneAnchor},get datasets(){return t.datasets},get featureStyleManager(){return t._featureStyleManager},get smidMeshes(){return t._smidMeshes},lngLatFromWorld:(e,n)=>t._lngLatFromWorld(e,n),gpuPathPoseAt:e=>t._gpuPathPoseAt(e),isFeatureHidden:(e,n)=>t._isFeatureHidden(e,n)}),tb(q_),this.style={...Ib,...e.style??{}},this._styleTarget={...this.style},this._opacityTransparent=(this.style.opacity??1)<.999,this._applyStyleUniforms(),this._registerAnimChannels(),this.animator.onActive=()=>this._requestRepaint(),this.outlineMaterial=Ab(this.uniforms),this._edges=new lC({uniforms:this.uniforms,style:this.style,styleTarget:this._styleTarget,animator:this.animator,pickables:this._picks.pickables,scene:this.scene,renderer:this.renderer,camera:this.camera,authenticate:this._authenticate,requestRepaint:()=>this.triggerRepaint()}),this.lineShared=this._edges.lineShared,this.edgeMaterial=this._edges.edgeMaterial,this.selectionEdgeMaterial=this._edges.selectionEdgeMaterial,this._sel=new CC({uniforms:this.uniforms,style:this.style,outlineMaterial:this.outlineMaterial,selectionEdgeMaterial:this.selectionEdgeMaterial,featureStyleManager:this._featureStyleManager,smidMeshes:this._smidMeshes,pointClouds:this._pointClouds,applyPointCloudStyle:(e,t)=>this._applyPointCloudStyle(e,t),onPick:e=>this.onPick(e),requestRepaint:()=>this.triggerRepaint(),createSelectionEdgeMaterial:e=>this._edges.createSelectionEdgeMaterial(e)}),this.setEdges(this.style.edges),this._applyOpacity(),this._fps.last=performance.now(),this._datasetQueue=this._normalizeDatasets(e),e.attributes&&(this.attributeQuery=new j_({...e.attributes,authenticate:e.attributes.authenticate??this._authenticate}))}_createRenderer(e,t){let n=new Gl({canvas:e,context:t,antialias:!0});return n.autoClear=!1,n.setPixelRatio(1),n.toneMapping=this.options.toneMapping===void 0?0:this.options.toneMapping,n.toneMappingExposure=this.options.toneMappingExposure??1,n}_syncTextureCapabilities(e){let t=!!e.getExtension(`WEBGL_compressed_texture_s3tc`),n=!!e.getExtension(`WEBGL_compressed_texture_s3tc_srgb`);eb(t&&n)}mount(e,t){this.canvas=e,this.renderer=this._createRenderer(e,t),Xy(this.renderer.capabilities.getMaxAnisotropy(),this.options.anisotropyCap??1/0),this._syncTextureCapabilities(t),this._applyClipping(),this.scene=new Jl,this.scene.add(this.groundManager.group),this._addLights(),this.camera=new xc,this.camera.matrixAutoUpdate=!1,this.picker=new RC(this.renderer),this._applyStyleUniforms();for(let e of this._datasetQueue)this.addDataset(e).catch(e=>this.onError(e));this._recomputeAnchors()}restoreContext(e){if(!this.canvas)console.warn(`[s3m] restoreContext 调用过早(尚未 mount),按首次挂载处理`);else{try{this.renderer?.dispose?.()}catch{}this.renderer=this._createRenderer(this.canvas,e),Xy(this.renderer.capabilities.getMaxAnisotropy(),this.options.anisotropyCap??1/0),this._syncTextureCapabilities(e),this._applyClipping(),this.picker?.dispose(),this.picker=new RC(this.renderer),this._edges.disposeGpuEdge(),this._requestRepaint()}}unmount(){for(let e of[...this.datasets.keys()])this.removeDataset(e);this.clearCreases(),this.groundManager.dispose(),this.picker?.dispose(),this.picker=null,this._lights.dispose(),this.outlineMaterial.dispose(),this._edges.disposeGpuEdge(),this.edgeMaterial.dispose(),this.selectionEdgeMaterial.dispose(),this.scene?.clear(),this._sel.reset(),this._smidMeshes.clear(),this._heights.clear(),this.animator.clear(),this.animator.unregisterPrefix(`tile.`),this.animator.unregisterPrefix(`feature.`),this._pathSpecs.clear(),this.renderer?.dispose?.(),this.renderer=null,this.canvas=null}get _ambientLight(){return this._lights.ambient}get _hemiLight(){return this._lights.hemi}get _keyLight(){return this._lights.key}get _fillLight(){return this._lights.fill}_updateLights(){this._lights.update()}_addLights(){this._lights.addToScene()}setLightingPreset(e){this._lights.setLightingPreset(e)}setLight(e){this._lights.setLight(e)}getLight(){return this._lights.getLight()}setToneMapping(e,t=1){this._lights.setToneMapping(e,t)}getToneMapping(){return this._lights.getToneMapping()}setEnvironment(e,t=1){return this._lights.setEnvironment(e,t)}_normalizeDatasets(e){return Array.isArray(e.datasets)?e.datasets.filter(e=>!!e?.configUrl).map(t=>({...t,polygonOffset:t.polygonOffset??e.polygonOffset})):e.configUrl?[{id:`default`,name:`默认数据集`,configUrl:e.configUrl,useWorker:e.useWorker,polygonOffset:e.polygonOffset}]:[]}async addDataset(e){if(!this.scene)throw Error(`[s3m] 图层尚未 addLayer,不能添加数据集`);let t={...e,unsupported:e.unsupported??this._unsupported};return await this._datasetManager.addDataset(t,this.scene,this.geo,this.uniforms,this._lodRangeScale,this.options.buildTile,this.options.maxTiles??64,this.options.maxConcurrent??4,{onTile:(e,t)=>{this._registerTile(e,t),this.onStats(this.stats),this._requestRepaint()},onTileRemoved:(e,t)=>{this._unregisterTile(e,t),this.onStats(this.stats),this._requestRepaint()},onStats:()=>{this.onStats(this.stats),this._requestRepaint()},onError:e=>{this.onError(e),this.onStats(this.stats)},onReady:e=>{this.onReady(e),this._heights.refreshAll(),this.groundManager.excavationBounds||this.groundManager.autoFitExcavation(this.datasets.values())},triggerRepaint:()=>{this._requestRepaint()}},this.options.maxTriangles??1/0,this.options.maxImageCache??128,this._authenticate,this.options.maxMemory??1/0)}_lngLatFromWorld(e,t){return I_(this.geo,e,t)}recomputeAnchors(){this._datasetManager.recomputeAnchors(this.geo),this._heights.refreshAll(),this._requestRepaint()}_recomputeAnchors(){this.recomputeAnchors()}getDatasetHeight(e){return this._datasetManager.getDatasetHeight(e)}setDatasetHeight(e,t){let n,r;typeof e==`number`?(n=this.datasets.keys().next().value??``,r=e):(n=e,r=t??0),this._datasetManager.setDatasetHeight(n,r,this.geo),this._syncGroundHeight(),this._heights.refreshAll(),this._requestRepaint()}_syncGroundHeight(){if(!this.groundManager.trackHeight)return;let e=this.datasets.keys().next().value;if(!e)return;let t=this._datasetManager.getDatasetHeight(e);this.groundManager.setGroundHeight(t)}setDatasetAlign(e,t){let n,r;t===void 0&&(e===`origin`||e===`bottom`||e===`top`||e===`center`)?(n=this.datasets.keys().next().value??``,r=e):(n=e,r=t??`origin`),this._datasetManager.setDatasetAlign(n,r,this.geo),this._heights.refreshAll(),this._requestRepaint()}_computeAlignOffset(e,t){return this._datasetManager.computeAlignOffset(e,t)}computeAlignOffset(e,t){return this._datasetManager.computeAlignOffset(e,t)}setFeatureStyle(e,t){this._featureStyleManager.setFeatureStyle(e,t,this._meshesOf([e]))}setFeaturesStyle(e,t){this._featureStyleManager.setFeaturesStyle(e,t,this._meshesOf(e))}moveFeature(e,t,n){let r=this._ensureFeatureChannel(e,`translation`);this.animator.to(r,t,n)}moveFeatureBy(e,t,n){let r=this._featureStyleManager.getFeatureStyle(e)?.translation??[0,0,0];this.moveFeature(e,[r[0]+t[0],r[1]+t[1],r[2]+t[2]],n)}rotateFeature(e,t,n,r){let i=this._featureStyleManager.getFeatureStyle(e)??{};n&&this._featureStyleManager.setFeatureStyle(e,{...i,pivot:n},this._meshesOf([e]));let a=fC(t),o=this._ensureFeatureChannel(e,`rotation`);this.animator.to(o,a,r)}rotateFeatureBy(e,t,n,r){let i=fC(this._featureStyleManager.getFeatureStyle(e)?.rotation),a=typeof t==`number`?[0,0,t]:t;this.rotateFeature(e,[i[0]+a[0],i[1]+a[1],i[2]+a[2]],n,r)}crossFadeStyles(e,t){let n=e instanceof Map?e:new Map(Object.entries(e).map(([e,t])=>[Number(e),t])),r=this.getAllMeshes();this._featureStyleManager.prepareCrossFade(n,r);let i=`batch.mix`;this.animator.has(i)||this.animator.register(i,{dim:1,read:e=>{e[0]=this.uniforms.uBatchMix?.value??0},write:e=>{this.uniforms.uBatchMix&&(this.uniforms.uBatchMix.value=e[0]),this.triggerRepaint()}}),(t?.duration??0)>0||t?.spring?(this.uniforms.uBatchMix&&(this.uniforms.uBatchMix.value=0),this.animator.to(i,1,{...t,onComplete:()=>{this.uniforms.uBatchMix&&(this.uniforms.uBatchMix.value=0),this._featureStyleManager.commitCrossFade(n,r),this.triggerRepaint(),t?.onComplete?.()}})):(this.animator.has(i)&&this.animator.cancel(i),this.uniforms.uBatchMix&&(this.uniforms.uBatchMix.value=0),this._featureStyleManager.commitCrossFade(n,r),this.triggerRepaint(),t?.onComplete?.())}followPath(e,t,n={}){let r=t instanceof mb?t:new mb(t,{closed:n.closed});if(r.length<=0)return;let i=n.offset??[0,0,0],a=n.duration??(n.speed&&n.speed>0?r.length/n.speed*1e3:2e3),o=`feature.${e}.path`;this._pathSpecs.set(o,{path:r,offset:i}),this.animator.has(o)||this.animator.register(o,{dim:1,read:e=>{e[0]=0},write:t=>{let n=this._pathSpecs.get(o);if(!n)return;n.path.sampleAt(t[0],this._pathScratch);let r=this._meshesOf([e]),i=this._featureStyleManager.getFeatureStyle(e)??{};this._featureStyleManager.setFeatureStyle(e,{...i,translation:[n.offset[0]+this._pathScratch[0],n.offset[1]+this._pathScratch[1],n.offset[2]+this._pathScratch[2]]},r);for(let e of r)e.frustumCulled=!1}});let s=()=>{this.animator.to(o,1,{duration:a,easing:n.easing??`linear`,onComplete:()=>{n.loop?s():n.onComplete?.()}})};s()}stopPath(e){let t=`feature.${e}.path`;this.animator.cancel(t),this.animator.unregister(t),this._pathSpecs.delete(t)}_gpuPathPoseAt(e){let t=this._featureStyleManager.getFeatureStyle(e)?.gpuPath;if(!t)return null;let n=this.gpuPathManager.getPath(t.pathId);if(!n||n.length<=0)return null;let r=this.uniforms.uPathTime?.value??0,i=(t.phase??0)+r*(t.speed??0),a=t.loop;a===`clamp`||a===!1?i=Math.min(1,Math.max(0,i)):a===`pingpong`?(i%=2,i<0&&(i+=2),i=i>1?2-i:i):i-=Math.floor(i),n.sampleAt(i,this._pathScratch);let o=[this._pathScratch[0],this._pathScratch[1],this._pathScratch[2]],s=0;if(t.autoHeading!==!1){let e=.001;n.sampleAt(Math.min(1,i+e),this._pathScratch2);let t=this._pathScratch2[0]-o[0],r=this._pathScratch2[1]-o[1];t*t+r*r<1e-8&&(n.sampleAt(Math.max(0,i-e),this._pathScratch2),t=o[0]-this._pathScratch2[0],r=o[1]-this._pathScratch2[1]),t*t+r*r>=1e-8&&(s=Math.atan2(r,t))}return{pos:o,yaw:s}}registerGPUPath(e,t={}){let n=this.gpuPathManager.registerPath(e,t);return this.gpuPathManager.updateUniforms(this.uniforms),n}unregisterGPUPath(e){let t=this.gpuPathManager.unregisterPath(e);return this.gpuPathManager.updateUniforms(this.uniforms),t}getGPUPathManager(){return this.gpuPathManager}bindGPUPath(e,t,n={}){let r;r=typeof t==`number`?t:this.registerGPUPath(t);let i=this._meshesOf([e]);this._featureStyleManager.bindGPUPath(e,r,n,i);for(let e of i)e.frustumCulled=!1;return this.gpuPathManager.updateUniforms(this.uniforms),r}unbindGPUPath(e){let t=this._meshesOf([e]);this._featureStyleManager.unbindGPUPath(e,t),this.gpuPathManager.updateUniforms(this.uniforms)}setGPUPathProgress(e,t){let n=this._meshesOf([e]);this._featureStyleManager.setGPUPathProgress(e,t,n);for(let e of n)e.frustumCulled=!1}setGPUPathTime(e,t=!1){this.uniforms.uPathTime&&(this.uniforms.uPathTime.value=e),this._customPathTime=!t}getGPUPathTime(){return this.uniforms.uPathTime?.value??0}animateFeature(e,t,n){if(t.translation&&this.moveFeature(e,t.translation,n),t.rotation!=null&&this.rotateFeature(e,t.rotation,t.pivot,n),t.elevation!=null&&this.animator.to(this._ensureFeatureChannel(e,`elevation`),t.elevation,n),t.opacity!=null&&this.animator.to(this._ensureFeatureChannel(e,`opacity`),t.opacity,n),t.color&&(this._colorScratch.set(t.color),this.animator.to(this._ensureFeatureChannel(e,`color`),[this._colorScratch.r,this._colorScratch.g,this._colorScratch.b],n)),t.hidden!=null){let n=this._featureStyleManager.getFeatureStyle(e)??{};this.setFeatureStyle(e,{...n,hidden:t.hidden})}}animateFeatures(e,t,n){let r=n?.stagger??0;if(r<=0){for(let r of e)this.animateFeature(r,t,n);return}let i=n?.delay??0;for(let a=0;a<e.length;a++)this.animateFeature(e[a],t,{...n,delay:i+a*r})}setMode(e,t={}){let n=Math.max(0,t.duration??300),r=Math.min(1,Math.max(.05,t.dim??.35));if(this.style.mode===e)return Promise.resolve();if(n<=0)return this.setStyle({mode:e}),Promise.resolve();let i=++this._modeGen;return new Promise(t=>{this.animator.to(`style.fade`,r,{duration:n,easing:`easeInOutQuad`,onComplete:()=>{i===this._modeGen?(this.setStyle({mode:e}),this.animator.to(`style.fade`,1,{duration:n,easing:`easeInOutQuad`,onComplete:t})):t()}})})}_ensureFeatureChannel(e,t){let n=`feature.${e}.${t}`;if(this.animator.has(n))return n;let r=t===`translation`||t===`color`||t===`rotation`?{dim:3,read:n=>{if(t===`translation`){let t=this._featureStyleManager.getFeatureStyle(e)?.translation;n[0]=t?.[0]??0,n[1]=t?.[1]??0,n[2]=t?.[2]??0}else if(t===`rotation`){let t=this._featureStyleManager.getFeatureStyle(e)?.rotation,r=fC(t);n[0]=r[0],n[1]=r[1],n[2]=r[2]}else{let t=this._featureStyleManager.getFeatureStyle(e)?.color??this.style.colorA;this._colorScratch.set(t),n[0]=this._colorScratch.r,n[1]=this._colorScratch.g,n[2]=this._colorScratch.b}},write:n=>{let r=this._meshesOf([e]),i=this._featureStyleManager.getFeatureStyle(e)??{};if(t===`translation`){this._featureStyleManager.setFeatureStyle(e,{...i,translation:[n[0],n[1],n[2]]},r);let t=Math.abs(n[0])>1e-6||Math.abs(n[1])>1e-6||Math.abs(n[2])>1e-6,a=fC(i.rotation),o=Math.abs(a[0])>1e-6||Math.abs(a[1])>1e-6||Math.abs(a[2])>1e-6;for(let e of r)e.frustumCulled=!(t||o)}else if(t===`rotation`){this._featureStyleManager.setFeatureStyle(e,{...i,rotation:[n[0],n[1],n[2]]},r);let t=Math.abs(n[0])>1e-6||Math.abs(n[1])>1e-6||Math.abs(n[2])>1e-6,a=i.translation??[0,0,0],o=Math.abs(a[0])>1e-6||Math.abs(a[1])>1e-6||Math.abs(a[2])>1e-6;for(let e of r)e.frustumCulled=!(t||o)}else{let t=this._colorScratch.setRGB(n[0],n[1],n[2]);this._featureStyleManager.setFeatureStyle(e,{...i,color:`#${t.getHexString()}`},r)}}}:{dim:1,read:n=>{let r=this._featureStyleManager.getFeatureStyle(e);n[0]=(t===`elevation`?r?.elevation:r?.opacity)??+(t===`opacity`)},write:n=>{let r=this._featureStyleManager.getFeatureStyle(e)??{},i=t===`elevation`?{...r,elevation:n[0]}:{...r,opacity:n[0]};this._featureStyleManager.setFeatureStyle(e,i,this._meshesOf([e]))}};return this.animator.register(n,r),n}_releaseFeatureChannels(e){for(let t of fT)this.animator.unregister(`feature.${e}.${t}`);let t=`feature.${e}.path`;this.animator.unregister(t),this._pathSpecs.delete(t)}getFeatureStyle(e){return this._featureStyleManager.getFeatureStyle(e)}getFeatureStyles(){return this._featureStyleManager.getFeatureStyles()}removeFeatureStyle(e){this._releaseFeatureChannels(e),this._featureStyleManager.removeFeatureStyle(e,this._meshesOf([e]))}clearFeatureStyles(){for(let e of this._featureStyleManager.getFeatureStyles().keys())this._releaseFeatureChannels(e);this._featureStyleManager.clearFeatureStyles()}setAttributeSource(e){this.attributeQuery=e?new j_({...e,authenticate:e.authenticate??this._authenticate}):null}getLoadedSmids(){return[...this._smidMeshes.keys()]}auditBatches(){let e=this._featureStyleManager.auditBatches(this._picks.pickables.values());return e.smids=this._smidMeshes.size,e}getThematicField(){return this._featureStyleManager.thematicField}setThematicColors(e,t=`custom`){this._featureStyleManager.setThematicColors(e,t)}clearThematic(){this._featureStyleManager.clearThematicColors()}getFilterField(){return this._featureStyleManager.fieldFilter?.field??null}filterByField(e){return this._featureStyleManager.filterByField(e,this.attributeQuery,this.getLoadedSmids())}clearFieldFilter(){this._featureStyleManager.clearFieldFilter()}getElevationField(){return this._featureStyleManager.elevationField}elevateByField(e){return this._featureStyleManager.elevateByField(e,this.attributeQuery,this.getLoadedSmids())}setThematicElevation(e,t=`custom`){this._featureStyleManager.setThematicElevation(e,t)}clearThematicElevation(){this._featureStyleManager.clearThematicElevation()}colorByField(e){return this._featureStyleManager.colorByField(e,this.attributeQuery,this.getLoadedSmids())}setFilter(e){this._featureStyleManager.setFilter(e,this.uniforms)}getFilter(){return this._featureStyleManager.filter}clearFilter(){this._featureStyleManager.clearFilter(this.uniforms)}setGroundMode(e){this.groundManager.setMode(e),this._requestRepaint()}setGroundOpacity(e){this.groundManager.setOpacity(e),this._requestRepaint()}setExcavationBounds(e){this.groundManager.setExcavationBounds(e),this._requestRepaint()}setGroundOcclude(e){this.groundManager.setOcclude(e),this._requestRepaint()}_isFeatureHidden(e,t){if(e==null)return!1;let n=this._featureStyleManager.fieldFilter;if(n){let t=n.matched.has(e);if(n.mode===`keep`?!t:t)return!0}let r=this._featureStyleManager.filter;return!!(r&&(r.include&&r.include.length>0&&!r.include.includes(e)||r.exclude&&r.exclude.length>0&&r.exclude.includes(e))||this._featureStyleManager.featureStyles.get(e)?.hidden)}getAllMeshes(){let e=[];for(let t of this._picks.pickables.values())e.push(t.mesh);return e}_meshesOf(e){let t=new Set;for(let n of e){let e=this._smidMeshes.get(n);if(e)for(let n of e)t.add(n)}return t}flushOverrides(){this._featureStyleManager.flushOverrides()}_applyOverridesToMesh(e){this._featureStyleManager.applyOverridesToMesh(e)}removeDataset(e){if(this.datasets.get(e)){this._sel.selection?.datasetId===e&&this.select(null),this._datasetManager.removeDataset(e,this.scene,this.geo,e=>{e.root.traverse(e=>{let t=e,n=t.userData;n.pickId!=null&&(this._picks.pickables.delete(n.pickId),this._releasePickId(n.pickId),n.pickId=void 0),this._unindexMeshSmids(t),this._heights.remove(t),t.geometry?.dispose?.();let r=aT(t);r&&r.dispose(),jC(t.material)&&t.material.dispose(),this._featureStyleManager.disposeMesh(t)})});for(let[t,n]of this._picks.pickables)n.datasetId===e&&this._picks.pickables.delete(t);this.onStats(this.stats),this._requestRepaint()}}clearDatasets(){for(let e of[...this.datasets.keys()])this.removeDataset(e)}setDatasetVisible(e,t){this._datasetManager.setDatasetVisible(e,t),!t&&this._sel.selection?.datasetId===e&&this.select(null),this._requestRepaint()}_registerTile(e,t){t.root.add(e.group),e.group.updateMatrixWorld(!0);let n=e.group.userData.hasNativeEdges===!0,r=this._edges.useNativeEdges(n);for(let i of e.group.children){if(i.isLineSegments&&i.userData.isEdgeLines){this._edges.registerNativeLine(i,r&&this._edges.enabled);continue}let a=oT(i),o=i;if(!o.isMesh&&!a)continue;a&&this._pointClouds.add(i),a&&this._splats.markDirty();let s=o.userData;if(s.pickId=this._allocPickId(),s.datasetId=t.id,s.nativeEdges=r,s.nativeEdgesRaw=n,this._picks.pickables.set(s.pickId,{datasetId:t.id,mesh:o,tile:e.tile,skeletonName:s.skeletonName??``}),this._indexMeshSmids(o),this._heights.add(o),this._edges.autoDecorate(o,t,r),a)this._applyPointCloudStyle(i);else{let e=aT(o);if(e){let t=sT(this.style.opacity),n=this.style.depthWrite!==!1;kb(e,t<.999,n),e.userData.uFlatShading&&(e.userData.uFlatShading.value=this.style.shading===`smooth`?0:1),this._featureStyleManager.applyOverridesToMesh(o),this._startTileFade(o,e)}}this._sel.replayOnto(o)}}_startTileFade(e,t){let n=this.style.fadeIn??0;if(n<=0)return;let r=t.userData.uTileFade;if(!r)return;r.value=0,t.transparent=!0,t.depthWrite=!0;let i=`tile.${this._tileFadeSeq++}.fade`;e.userData.tileFadeKey=i,this.animator.register(i,{dim:1,read:e=>{e[0]=r.value},write:e=>{r.value=e[0]}}),this.animator.to(i,1,{duration:n,easing:`easeOutQuad`,onComplete:()=>{r.value=1,e.userData.tileFadeKey=void 0,this.animator.unregister(i),kb(t,this._opacityTransparent,this.style.depthWrite!==!1),this._featureStyleManager.applyOverridesToMesh(e),this._requestRepaint()}})}_replaySelectionOnto(e){this._sel.replayOnto(e)}_unregisterTile(e,t){e.group.traverse(e=>{let t=e;if(e.isLineSegments&&t.userData?.isEdgeLines&&this._edges.unregisterNativeLine(e),oT(e)&&this._pointClouds.delete(e),t.userData?.tileFadeKey&&(this.animator.unregister(t.userData.tileFadeKey),t.userData.tileFadeKey=void 0),t.userData?.pickId!=null&&(this._picks.pickables.delete(t.userData.pickId),this._releasePickId(t.userData.pickId),t.userData.pickId=void 0),t.isMesh){this._sel.selectedMeshes.includes(t)&&(this._sel.selectedMeshes=this._sel.selectedMeshes.filter(e=>e!==t));let e=this._sel.selection;if(e&&e.mesh===t){let n=e.smid,r=n==null?this._sel.selectedMeshes.find(e=>e!==t&&e.parent&&e.parent.visible)??this._sel.selectedMeshes.find(e=>e!==t&&e.parent):[...this._smidMeshes.get(n)??[]].find(e=>e!==t&&e.parent);r?(this._sel.selection={...e,mesh:r},this._sel.replayOnto(r)):this.select(null)}this._unindexMeshSmids(t),this._heights.remove(t),this._featureStyleManager.disposeMesh(t),aT(t)?.dispose?.()}jC(t.material)?t.material.dispose():t.material&&(Array.isArray(t.material)?t.material.forEach(e=>e?.dispose?.()):t.material.dispose?.()),t.geometry?.dispose?.()}),t.root.remove(e.group)}setOpacity(e,t){this.setStyle({opacity:e},t)}setStyle(e={},t){Object.assign(this._styleTarget,e);let n=t?.duration??0,r=n>0||!!t?.spring,i=e;if(`edges`in e){let{edges:n,...a}=e;if(i=a,this.setEdges(n,r?t:void 0),Object.keys(i).length===0){this._requestRepaint();return}}let a=[],o={};for(let e of Object.keys(i))r&&this.animator.has(`style.${String(e)}`)?a.push(String(e)):o[e]=i[e];Object.keys(o).length>0&&(Object.assign(this.style,o),this._applyStyleEffects(o));for(let e of a)this.animator.to(`style.${e}`,this._animTargetOf(e,i),{...t,duration:n});this._requestRepaint()}getStyle(){return{...this._styleTarget,modeLabel:Mb[this._styleTarget.mode]}}_animTargetOf(e,t){let n=t[e];return this._animDimOf(e)===1?Number(n):(this._colorScratch.set(String(n)),[this._colorScratch.r,this._colorScratch.g,this._colorScratch.b])}_animDimOf(e){return dT.includes(e)?3:1}_registerAnimChannels(){for(let e of lT)this.animator.register(`style.${e}`,{dim:1,read:t=>{t[0]=Number(this.style[e]??uT[e]??0)},write:t=>{this.style[e]=t[0],this._onStyleChannelWrote(e)}});for(let e of dT)this.animator.register(`style.${e}`,{dim:3,read:t=>{let n=this._uniformColorOf(e);t[0]=n.r,t[1]=n.g,t[2]=n.b},write:t=>{let n=this._uniformColorOf(e);n.setRGB(t[0],t[1],t[2]),this.style[e]=`#${n.getHexString()}`,this._onStyleChannelWrote(e)}});this.animator.register(`style.edgeFade`,{dim:1,read:e=>{e[0]=this.uniforms.uEdgeFade?.value??1},write:e=>{this.uniforms.uEdgeFade&&(this.uniforms.uEdgeFade.value=e[0]),this._edges.syncStyle()}}),this.animator.register(`style.fade`,{dim:1,read:e=>{e[0]=this.uniforms.uFade?.value??1},write:e=>{this.uniforms.uFade&&(this.uniforms.uFade.value=e[0]),this._requestRepaint()}})}_onStyleChannelWrote(e){e===`opacity`?this._applyOpacity():(this._applyStyleUniforms(),(e===`edgeColor`||e===`edgeWidth`||e===`edgeOpacity`||e===`edgeOffset`||e===`edgeHullWidth`)&&this._edges.refreshLines())}_uniformColorOf(e){let t=this.uniforms;switch(e){case`colorA`:return t.uColorA.value;case`colorB`:return t.uColorB.value;case`colorC`:return t.uColorC.value;case`selectColor`:return t.uSelColor.value;case`edgeColor`:return this.edgeMaterial.uniforms.uColor.value;default:return t.uColorA.value}}_applyStyleEffects(e){this._applyStyleUniforms(),(`opacity`in e||`depthWrite`in e)&&this._applyOpacity(),`mode`in e&&this._applyPointCloudStyles(),`shading`in e&&this._applyShading(),(`edgeThreshold`in e||`forceCpuEdges`in e)&&this._edges.enabled?(this._edges.disposeEdgeGeometry(),this.setEdges(this.style.edges)):(`edgeColor`in e||`edgeWidth`in e||`opacity`in e||`edgeOpacity`in e||`edgeOffset`in e||`edgeHullWidth`in e)&&this._edges.refreshLines(),this._sel.selection&&(`outline`in e||`outlineStyle`in e?this.select(this._sel.selection,{silent:!0}):this._sel.syncStyle())}_applyStyleUniforms(){let e=this.uniforms,t=this.style;e.uMode.value=t.mode,e.uColorA.value.set(t.colorA),e.uColorB.value.set(t.colorB),e.uColorC.value.set(t.colorC),e.uSelColor.value.set(t.selectColor),e.uFloorHeight.value=t.floorHeight;let n=t.selectMode??Nb.OVERLAY;e.uSelMode&&(e.uSelMode.value=n===Nb.REPLACE?0:n===Nb.MULTIPLY?2:n===Nb.GLOW_ONLY?3:1),e.uSelOpacity&&t.selectOpacity!=null&&(e.uSelOpacity.value=t.selectOpacity),e.uSelEmissive&&t.selectEmissive!=null&&(e.uSelEmissive.value=t.selectEmissive),e.uSelElevation&&t.selectElevation!=null&&(e.uSelElevation.value=t.selectElevation),e.uDimFactor&&t.dimFactor!=null&&(e.uDimFactor.value=t.dimFactor),e.uRoofThreshold&&t.roofThreshold!=null&&(e.uRoofThreshold.value=t.roofThreshold),e.uTexMix&&t.texMix!=null&&(e.uTexMix.value=t.texMix),e.uAmbientGain&&t.ambientGain!=null&&(e.uAmbientGain.value=t.ambientGain),e.uMetalness&&(e.uMetalness.value=t.metalness??-1),e.uRoughness&&(e.uRoughness.value=t.roughness??-1),e.uOpacity&&t.opacity!=null&&(e.uOpacity.value=sT(t.opacity)),this.outlineMaterial&&(this.outlineMaterial.uniforms.uElevation&&t.selectElevation!=null&&(this.outlineMaterial.uniforms.uElevation.value=t.selectElevation),t.outlineWidth!=null&&(this.outlineMaterial.uniforms.uWidth.value=t.outlineWidth),t.outlineColor==null?this.outlineMaterial.uniforms.uColor.value.set(t.selectColor):this.outlineMaterial.uniforms.uColor.value.set(t.outlineColor))}_applyOpacity(){let e=sT(this.style.opacity);this.uniforms.uOpacity&&(this.uniforms.uOpacity.value=e);let t=e<.999;if(t!==this._opacityTransparent){this._opacityTransparent=t;let e=this.style.depthWrite!==!1;for(let n of this._picks.pickables.values()){if(oT(n.mesh))continue;let r=aT(n.mesh);r&&(r.userData.uBatchTexActive?.value||(r.userData.uTileFade?.value??1)<1||kb(r,t,e))}}for(let e of this._pointClouds)this._applyPointCloudStyle(e);this._edges.syncStyle(),this._requestRepaint()}_applyPointCloudStyle(e,t=this._sel.selectedMeshes.includes(e)){AC(e,this.style,this.uniforms,t)}_applyPointCloudStyles(){for(let e of this._pointClouds)this._applyPointCloudStyle(e);this._requestRepaint()}_applyShading(){let e=this.style.shading===`smooth`?0:1;for(let t of this._picks.pickables.values()){let n=aT(t.mesh)?.userData.uFlatShading;n&&n.value!==e&&(n.value=e)}this._requestRepaint()}setMaterialQuality(e){this._materialQuality=xb(e)??`pbr`,this._datasetManager.setDefaultMaterialQuality(this._materialQuality),this._rebuildStyledMaterials(),this._requestRepaint()}get materialQuality(){return this._materialQuality??Cb()}setColorPipeline(e,t={}){let n=Eb(e)??`linear`;if(n===this.colorPipeline)return Promise.resolve();let r=Math.max(0,t.duration??0);if(r<=0)return this._applyRenderProfile({colorPipeline:n}),Promise.resolve();let i=Math.min(1,Math.max(.05,t.dim??.35)),a=++this._pipelineGen;return new Promise(e=>{this.animator.to(`style.fade`,i,{duration:r,easing:`easeInOutQuad`,onComplete:()=>{a===this._pipelineGen?(this._applyRenderProfile({colorPipeline:n}),this.animator.to(`style.fade`,1,{duration:r,easing:`easeInOutQuad`,onComplete:e})):e()}})})}get colorPipeline(){return this._colorPipeline??Tb()}_textureOptions(){return{srgbDecode:this.colorPipeline!==`direct`,maxSize:this.options.maxTextureSize??1/0,anisotropyCap:this.options.anisotropyCap??1/0}}_applyRenderProfile(e,t=!1){let n=this.colorPipeline;e.colorPipeline!==void 0&&(this._colorPipeline=Eb(e.colorPipeline)??`linear`),e.anisotropyCap!==void 0&&(this.options.anisotropyCap=e.anisotropyCap);let r=this._textureOptions();this._datasetManager.setRenderProfile({colorPipeline:this.colorPipeline,textureOptions:r}),!t&&(this.colorPipeline!==n&&this._rebuildStyledMaterials(),this._syncCachedTextures(r),this._requestRepaint())}_syncCachedTextures(e){let t=e.srgbDecode?ga:``;for(let n of this.datasets.values()){let r=n.tileset?.textureCache;if(r){for(let e of r.values())e.colorSpace!==t&&(e.colorSpace=t,e.needsUpdate=!0);Qy(r.values(),e.anisotropyCap??1/0)}}}_rebuildStyledMaterials(){let e=[`uSelBatch`,`uSelWhole`,`uBatchTex`,`uBatchTex2`,`uBatchTexWidth`,`uBatchTexActive`,`uTileFade`];for(let t of this._picks.pickables.values()){let n=t.mesh,r=n.material;if(Array.isArray(r))continue;let i=r;if(!i?.userData?.isStyled||!i.userData?.s3mOpts)continue;let a=i.userData.s3mOpts,o=Ob({...a,uniforms:this.uniforms,materialQuality:this.materialQuality,colorPipeline:this.colorPipeline});for(let t of e){let e=i.userData[t],n=o.userData[t];e&&n&&(n.value=e.value)}n.material=o,i.dispose()}}async prewarmShading(){if(this._shadingPrewarmed||this._prewarming)return;let e=this.renderer,t=this.scene,n=this.camera;if(!e||!t||!n)return;let r=!1;for(let e of this._picks.pickables.values())if(aT(e.mesh)){r=!0;break}if(r){this._shadingPrewarmed=!0;try{let r=e;typeof r.compileAsync==`function`?await r.compileAsync(t,n):e.compile(t,n)}catch{}this._requestRepaint()}}_addMeshHeight(e){this._heights.add(e)}_removeMeshHeight(e){this._heights.remove(e)}_indexMeshSmids(e){let t=e.userData.geoRef?.pickInfo;if(t)for(let n of Object.keys(t)){let t=Number(n);if(!Number.isFinite(t)||t<0)continue;let r=this._smidMeshes.get(t);r||this._smidMeshes.set(t,r=new Set),r.add(e)}}_unindexMeshSmids(e){let t=e.userData.geoRef?.pickInfo;if(t)for(let n of Object.keys(t)){let t=Number(n),r=this._smidMeshes.get(t);r&&(r.delete(e),r.size===0&&this._smidMeshes.delete(t))}}get _edgesEnabled(){return this._edges.enabled}get _edgeModes(){return this._edges.modes}get _gpuEdge(){return this._edges.gpuEdge}set _gpuEdge(e){this._edges.gpuEdge=e}_ensureEdges(e){this._edges.ensureEdges(e)}_removeEdges(e){this._edges.removeEdges(e)}setEdges(e,t){this._edges.setEdges(e,t)}loadCreases(e){return this._edges.loadCreases(e)}clearCreases(){this._edges.clearCreases()}getRayAt(e,t){return this._picks.getRayAt(e,t)}pick(e,t){return this._picks.pick(e,t)}pickPosition(e,t){return this._picks.pickPosition(e,t)}drillPick(e,t,n=10){return this._picks.drillPick(e,t,n)}getFeatureBounds(e){return this._picks.getFeatureBounds(e)}_sceneFromLngLat(e){let t=this.sceneAnchor;if(!t)return[0,0,0];let n=t.meterInMercator,r=F_(this.geo,e.lng,e.lat,e.altitude);return[(r.x-t.x)/n,-(r.y-t.y)/n,e.altitude-(t.altitude??0)]}lngLatToPoint(e){return this._sceneFromLngLat(e)}pointToLngLat(e){return this._lngLatFromScene(e)}_lngLatFromScene(e){let t=this.sceneAnchor;if(!t)return{lng:0,lat:0,altitude:e[2]};let n=t.meterInMercator,[r,i]=I_(this.geo,e[0]*n+t.x,-e[1]*n+t.y);return{lng:r,lat:i,altitude:e[2]+(t.altitude??0)}}measureDistance(e,t){return Tw(this._sceneFromLngLat(e),this._sceneFromLngLat(t))}measurePolyline(e){let t=e.map(e=>this._sceneFromLngLat(e));return{length3D:bw(t),lengthHorizontal:xw(t)}}measurePolygon(e){let t=e.map(e=>this._sceneFromLngLat(e));return{area3D:Cw(t),areaHorizontal:ww(t),perimeter:Sw(t)}}lineOfSight(e,t,n={}){return Ew(this._sceneFromLngLat(e),this._sceneFromLngLat(t),(e,t,n)=>{let r=this._picks.raycastDistance(e,t,n);return r?{distance:r.distance,point:r.point}:null},n)}setClipping(e){this._clip=e,this._applyClipping(),this._requestRepaint()}get clipping(){return this._clip}_applyClipping(){let e=this.renderer;e&&(e.clippingPlanes=this._clip?Pw(this._clip).map(e=>new Pc(new H(e.normal[0],e.normal[1],e.normal[2]),e.constant)):[])}_depthCtx(){return{renderer:()=>this.renderer,scene:()=>this.scene,camera:()=>this.camera}}skyline(e={}){let t=$w(this._depthCtx(),e.width??640,e.height??360,e.include);return t?Gw({rgba:t.rgba,width:t.width,height:t.height,inverseViewProj:t.inverseViewProj,cameraPos:t.cameraPos,step:e.step}):null}viewshed(e){let t=e.eyeHeight??1.7,n=this._sceneFromLngLat({...e.origin,altitude:e.origin.altitude+t}),r=e.size??128,i=nT(this._depthCtx(),n,r,e.radius,e.include);return i?Kw(n,qw(i,r,e.radius),{radius:e.radius,grid:e.grid,groundZ:0}):null}_intersectMeshAtRay(e,t,n){return this._picks.intersectMeshAtRay(e,t,n)}_buildPickResult(e,t,n,r){return this._picks.buildPickResult(e,t,n,r)}_buildSplatPickResult(e,t,n,r){return this._picks.buildSplatPickResult(e,t,n,r)}_instanceFeature(e,t,n){return this._picks.instanceFeature(e,t,n)}_instanceBox(e,t){return this._picks.instanceBox(e,t)}_allocPickId(){return this._picks.allocPickId()}_releasePickId(e){this._picks.releasePickId(e)}get _pickables(){return this._picks.pickables}select(e,t={}){this._sel.select(e,t)}_syncSelectionStyle(){this._sel.syncStyle()}get _selection(){return this._sel.selection}get _selectedMeshes(){return this._sel.selectedMeshes}get _selectionEdgeMeshes(){return this._sel.selectionEdgeMeshes}_updateLineResolution(e){let t=e.width||1,n=e.height||1,r=e.clientWidth||t;this.lineShared.uResolution.value.set(t,n),this.lineShared.uDpr.value=Math.max(1,t/r)}get lodRangeScale(){return this._lodRangeScale}get lodPixelRatioCap(){return this._lodPixelRatioCap}setLodPixelRatioCap(e){let t=e>0?e:1/0;this._lodPixelRatioCap=t,this.options.lodPixelRatioCap=t,this._requestRepaint()}_lodScreenHeight(e){let t=this._lodPixelRatioCap;if(!Number.isFinite(t))return e;let n=this.canvas?.clientHeight??0;return n<=0?e:Math.min(e,n*t)}get maxImageCache(){return this.options.maxImageCache??128}setMaxImageCache(e,t){let n=Number.isFinite(e)?Math.max(1,Math.floor(e)):128;if(t){let e=this.datasets.get(t);e?.tileset&&(e.tileset.maxImageCache=n)}else{this.options.maxImageCache=n;for(let e of this.datasets.values())e.tileset&&(e.tileset.maxImageCache=n)}this._requestRepaint()}get maxTriangles(){return this.options.maxTriangles??1/0}setMaxTriangles(e,t){let n=e>0?e:1/0;if(t){let e=this.datasets.get(t);e?.tileset&&e.tileset.setMaxTriangles(n)}else{this.options.maxTriangles=n;for(let e of this.datasets.values())e.tileset&&e.tileset.setMaxTriangles(n)}}get maxMemory(){return this.options.maxMemory??1/0}setMaxMemory(e,t){let n=Number.isFinite(e)&&e>0?e:1/0;if(t){let e=this.datasets.get(t);e?.tileset&&e.tileset.setMaxMemory(n)}else{this.options.maxMemory=n;for(let e of this.datasets.values())e.tileset&&e.tileset.setMaxMemory(n)}}get anisotropyCap(){return this.options.anisotropyCap??1/0}setAnisotropyCap(e){let t=Number.isFinite(e)&&e>0?Math.max(1,e):1/0;this.options.anisotropyCap=t,Xy(this.renderer?.capabilities.getMaxAnisotropy?.()??1,t),this._applyRenderProfile({anisotropyCap:t})}get maxTextureSize(){return this.options.maxTextureSize??1/0}setMaxTextureSize(e){let t=Number.isFinite(e)&&e>=1?e:1/0;this.options.maxTextureSize=t,$y(t),this._datasetManager.setRenderProfile({textureOptions:this._textureOptions()}),this._requestRepaint()}setLodRangeScale(e,t){if(!(e<=0)){if(t){let n=this.datasets.get(t);n?.tileset&&(n.tileset.lodRangeScale=e)}else{this._lodRangeScale=e;for(let t of this.datasets.values())t.tileset&&(t.tileset.lodRangeScale=e)}this._requestRepaint()}}_sortSplats(){this._splats.sort(this.camera,this._pointClouds)}renderFrame(e){if(!this.renderer||!this.scene||!this.camera||!this.sceneAnchor||!this.canvas)return!1;let t=this.renderer.getContext();if(t&&typeof t.isContextLost==`function`&&t.isContextLost())return!1;if(this._prewarming)return!0;let n=this.animator.tick();this.flushOverrides();let r=this.canvas,i=this.sceneAnchor.meterInMercator;this._enuMatrix.set(i,0,0,this.sceneAnchor.x,0,-i,0,this.sceneAnchor.y,0,0,i,this.sceneAnchor.z,0,0,0,1);let a=this._frameMvp.fromArray(e.mvp);a.multiply(this._enuMatrix),this.camera.projectionMatrix.copy(a),this.camera.projectionMatrixInverse.copy(a).invert();let o=e.cameraEnu;this.camera.position.set(o[0],o[1],o[2]),this.camera.matrixWorld.setPosition(o[0],o[1],o[2]),this.camera.matrixWorldInverse.copy(this.camera.matrixWorld).invert(),this.groundManager.update(this.camera);let s=!1,c=this._lodScreenHeight(e.canvasHeight);for(let t of this.datasets.values()){if(!t.visible||!t.tileset)continue;let n=[o[0]-t.offset[0],o[1]-t.offset[1],o[2]-t.offset[2]];t.tileset.update(n,e.fovRad,c)&&(s=!0)}this.style.mode===jb.DYNAMIC&&(this.uniforms.uTime.value+=.016*(this.style.speed??1)),this.gpuPathManager.updateUniforms(this.uniforms);let l=(this.uniforms.uPathTexActive?.value??0)>0;l&&!this._customPathTime&&this.uniforms.uPathTime&&(this.uniforms.uPathTime.value+=.016),this._updateLights(),this._updateLineResolution(r),Jx(r.width,r.height),this.renderer.setViewport(0,0,r.width,r.height),this.renderer.resetState(),(this.uniforms.uOpacity?.value??1)>cT&&(this._sortSplats(),this.renderer.render(this.scene,this.camera),this._edges.renderGpuEdges(r)),this._frame++;let u=performance.now();u-this._fps.last>500&&(this._fps.value=Math.round(this._frame*1e3/(u-this._fps.last)),this._frame=0,this._fps.last=u);let d=n||this.style.mode===jb.DYNAMIC||l||this.stats.loading>0||s;return this._prewarmShadingEnabled&&!this._shadingPrewarmed&&this._picks.pickables.size>0&&this.prewarmShading(),d}get fps(){return this._fps.value}get stats(){let e={tiles:0,loading:0,failed:0,meshes:0,vertices:0,triangles:0,datasets:this.datasets.size,drawCalls:0,programs:0,textures:0,geometries:0,degradations:[]},t=null;for(let n of this.datasets.values()){let r=n.tileset?.stats;if(r&&(e.tiles+=r.tiles,e.loading+=r.loading,e.failed+=r.failed,e.meshes+=r.meshes,e.vertices+=r.vertices,e.triangles+=r.triangles,r.degradations?.length)){t??(t=[]);for(let e of r.degradations)t.includes(e)||t.push(e)}}t&&(e.degradations=t);let n=this.renderer?.info;return n&&(e.drawCalls=n.render.calls,e.programs=n.programs?.length??0,e.textures=n.memory.textures,e.geometries=n.memory.geometries),e}getBounds(){let e=1/0,t=1/0,n=-1/0,r=-1/0;for(let i of this.datasets.values()){let a=vS(i.tileset?.config?.geoBounds);a&&(e=Math.min(e,a.left),n=Math.max(n,a.right),t=Math.min(t,a.bottom),r=Math.max(r,a.top))}return isFinite(e)?[[e,t],[n,r]]:null}dispose(){this.unmount()}};mh();var mT=class e{constructor(t={}){X(this,`id`,void 0),X(this,`options`,void 0),X(this,`pickable`,void 0),X(this,`onStats`,void 0),X(this,`onReady`,void 0),X(this,`onPick`,void 0),X(this,`onError`,void 0),X(this,`viewer`,void 0),X(this,`_projection`,`perspective`),X(this,`_projectionT`,0),X(this,`_orthoWarned`,!1),X(this,`_nearPlaneScale`,1),this.id=t.id??`s3m`,this.options=t,this.pickable=t.pickable!==!1,this._projection=t.projection===`orthographic`?`orthographic`:`perspective`,this._nearPlaneScale=e.normalizeNearPlaneScale(t.nearPlaneScale),this._projectionT=+(this._projection===`orthographic`),this.onStats=t.onStats??(()=>{}),this.onReady=t.onReady??(()=>{}),this.onPick=t.onPick??(()=>{}),this.onError=t.onError??(e=>console.warn(`[s3m]`,e));let{id:n,projection:r,nearPlaneScale:i,...a}=t;this.viewer=new pT({...a,onRequestRepaint:()=>this.requestRepaint(),getBearing:()=>this.getBearing(),onStats:e=>this.onStats(e),onReady:e=>this.onReady(e),onPick:e=>this.onPick(e),onError:e=>this.onError(e)})}getBearing(){return 0}mountViewer(e,t){this.viewer.renderer?this.viewer.restoreContext(t):this.viewer.mount(e,t)}unmountViewer(){this.viewer.unmount()}driveFrame(e){let t=this.viewer.renderFrame(e);return t&&this.requestRepaint(),t}setProjection(e,t){let n=e===`orthographic`?`orthographic`:`perspective`,r=+(n===`orthographic`),i=t?.duration??0,a=i>0||!!t?.spring;this._projection=n,this._orthoWarned=!1,a?(this._ensureProjectionChannel(),this.viewer.animator.to(`projection.t`,r,{...t,duration:i,easing:t?.easing??`easeInOutCubic`,onComplete:()=>{this._projectionT=r,this.requestRepaint()}}),this.requestRepaint()):(this.viewer.animator.has(`projection.t`)&&this.viewer.animator.cancel(`projection.t`),this._projectionT=r,this.requestRepaint())}get projection(){return this._projection}get projectionT(){return this._projectionT}_ensureProjectionChannel(){this.viewer.animator.has(`projection.t`)||this.viewer.animator.register(`projection.t`,{dim:1,read:e=>{e[0]=this._projectionT},write:e=>{this._projectionT=e[0],this.requestRepaint()}})}setNearPlaneScale(t){this._nearPlaneScale=e.normalizeNearPlaneScale(t),this.requestRepaint()}get nearPlaneScale(){return this._nearPlaneScale}static normalizeNearPlaneScale(e){return typeof e!=`number`||!Number.isFinite(e)?1:e>0&&e<1?e:1}};sh();var hT=1e-4;function gT(e,t){let n=e.elements;for(let e=0;e<16;e++){let r=Math.max(1,Math.abs(n[e]),Math.abs(t[e]));if(Math.abs(n[e]-t[e])>hT*r)return!1}return!0}function _T(e){let t=e.elements,n=1;for(let e=0;e<16;e++){let r=Math.abs(t[e]);r>n&&(n=r)}let r=1e-6*n;return Math.abs(t[3])<r&&Math.abs(t[7])<r&&Math.abs(t[11])<r&&Math.abs(t[15]-1)<r}function vT(e,t){return t>0&&Math.abs(e.elements[5]*Math.tan(t/2)-1)<.001}function yT(e){if(!e||typeof e!=`object`)return null;let t=e;return t.defaultProjectionData?.projectionMatrix??t.projectionMatrix??null}function bT(e){let t={nearZ:null,farZ:null};if(!e||typeof e!=`object`)return t;let n=e,r=n.defaultProjectionData,i=e=>{let t=n[e];if(typeof t==`number`&&Number.isFinite(t))return t;let i=r?.[e];return typeof i==`number`&&Number.isFinite(i)?i:null};return{nearZ:i(`nearZ`),farZ:i(`farZ`)}}function xT(e,t){if(e&&typeof e==`object`){let t=e.fov;if(typeof t==`number`&&Number.isFinite(t)&&t>0)return t}return typeof t==`number`&&Number.isFinite(t)&&t>0?t:null}function ST(e,t){let n=e.projectionMatrix;if(!n||n.length<16)return null;let r=new U().fromArray(Array.from(n)),i=new U().fromArray(Array.from(e.mvp));if(r.determinant()===0||!vT(r,t.fov))return null;let a=r.clone().invert().multiply(i);if(!gT(r.clone().multiply(a),Array.from(e.mvp))||!_T(a)||!vT(r,t.fov))return null;let{distance:o,fov:s,aspect:c}=t;if(!(o>0)||!(s>0)||!(c>0))return null;let l=o*Math.tan(s/2),u=l*c,d=e.nearZ!=null&&e.nearZ>0?e.nearZ:1,f=e.farZ!=null&&e.farZ>d?e.farZ:o*4+1e3;f>d||(f=d+1e3);let p=new Uc(-u,u,l,-l,d,f);return p.updateProjectionMatrix(),{matrix:p.projectionMatrix.clone().multiply(a),view:a}}function CT(e,t){if(!(t>0)||t>=1)return null;let n=e.projectionMatrix;if(!n||n.length<16)return null;let r=new U().fromArray(Array.from(n));if(!Number.isFinite(r.determinant())||r.determinant()===0||Math.abs(r.elements[11]+1)>1e-6)return null;let i=e.nearZ!=null&&e.nearZ>0?e.nearZ:NaN,a=e.farZ!=null&&e.farZ>i?e.farZ:NaN;if(!(i>0)||!(a>i)){let e=-r.elements[10];if(!(e>1)||(i=-r.elements[14]/(e+1),a=i*(e+1)/(e-1),!(i>0)||!(a>i)))return null}let o=i*t;if(!(o>0)||!(o<a))return null;let s=r.clone();s.elements[10]=-(a+o)/(a-o),s.elements[14]=-2*a*o/(a-o);let c=s.multiply(r.clone().invert()).multiply(new U().fromArray(Array.from(e.mvp)));for(let e=0;e<16;e++)if(!Number.isFinite(c.elements[e]))return null;return c}function wT(e,t,n){let r=e.projectionMatrix;if(!r||r.length<16)return null;let i=new U().fromArray(Array.from(r)),a=new U().fromArray(Array.from(e.mvp));if(i.determinant()===0||!vT(i,t.fov))return null;let o=i.clone().invert().multiply(a);if(!gT(i.clone().multiply(o),Array.from(e.mvp))||!_T(o))return null;let s=Math.max(0,Math.min(1,n));if(s<=0)return{matrix:a,view:o};let{distance:c,fov:l,aspect:u}=t;if(!(c>0)||!(l>0)||!(u>0))return null;let d=c*Math.tan(l/2),f=d*u,p=e.nearZ!=null&&e.nearZ>0?e.nearZ:1,m=e.farZ!=null&&e.farZ>p?e.farZ:c*4+1e3;m>p||(m=p+1e3);let h=new Uc(-f,f,d,-d,p,m);if(h.updateProjectionMatrix(),s>=1)return{matrix:h.projectionMatrix.clone().multiply(o),view:o};let g=new U,_=i.elements,v=h.projectionMatrix.elements,y=g.elements;for(let e=0;e<16;e++)y[e]=(1-s)*_[e]+s*v[e];return{matrix:g.multiply(o),view:o}}var TT=o({Animator:()=>gw,AttributeQuery:()=>j_,BinaryReader:()=>hh,CUBE_FACES:()=>eT,DEFAULT_FLOOR_HEIGHT:()=>C_,DEFAULT_LIGHT_PRESET:()=>wS,DEFAULT_STYLE:()=>Ib,DatasetManager:()=>rT,EARTH_RADIUS:()=>M_,EASING_NAMES:()=>YC,FeatureStyleManager:()=>_C,GPUPathManager:()=>_b,GpuEdgePass:()=>aC,GroundManager:()=>iT,HostRenderer:()=>mT,LIGHT_PRESETS:()=>ES,Path:()=>mb,Picker:()=>RC,PixelFormat:()=>my,S3MFormatError:()=>p_,S3MTileset:()=>CS,S3MViewer:()=>pT,S3M_VERSION:()=>Fg,SAMPLES_PER_PATH:()=>256,SELECT_MODE:()=>Nb,SELECT_MODE_LABELS:()=>Pb,STYLE:()=>jb,STYLE_LABELS:()=>Mb,SUPERMAP_LIGHT_PRESET:()=>TS,TextureCompress:()=>hy,VertexTag:()=>Ig,VertexTagV3:()=>Lg,authFetch:()=>E_,azimuthElevation:()=>Ww,boxClipping:()=>Mw,buildAttributes:()=>x_,buildBlendedMVP:()=>wT,buildClipPlanes:()=>Pw,buildCubeCameras:()=>tT,buildFeatureEdgeSegments:()=>eC,buildNearScaledMVP:()=>CT,buildOrthoMVP:()=>ST,buildThickLineGeometry:()=>YS,buildTileObjects:()=>iS,captureRadialCube:()=>nT,captureSkylineDepth:()=>$w,computeViewshed:()=>Kw,createLineSharedUniforms:()=>GS,createOutlineMaterial:()=>Ab,createSharedUniforms:()=>Db,createStyledMaterial:()=>Ob,createTexture:()=>ob,createThickLineMaterial:()=>JS,crossClipping:()=>Nw,cubicBezier:()=>ow,default:()=>pT,distance3D:()=>_w,distanceHorizontal:()=>vw,dxtPixelFormatOf:()=>py,easing:()=>XC,extractEulerAngles:()=>fC,extractFovRadians:()=>xT,extractNearFar:()=>bT,extractProjectionMatrix:()=>yT,getColorPipeline:()=>Tb,getMaterialQuality:()=>Cb,heightDifference:()=>yw,isPointKept:()=>Aw,isS3M1Buffer:()=>pg,lineOfSight:()=>Ew,lngLatFromMercator:()=>P_,lngLatFromWorld:()=>I_,makeCubeDistanceSampler:()=>qw,measureSegment:()=>Tw,measureSegments:()=>b_,mercatorFromLngLat:()=>N_,packRGBADepth:()=>zw,parseS3M1:()=>Pg,parseS3MB:()=>m_,pixelToNdc:()=>Uw,planDegradations:()=>g_,planeClipping:()=>jw,planeFromPointNormal:()=>kw,polygonArea:()=>Cw,polygonAreaHorizontal:()=>ww,polygonPerimeter:()=>Sw,polylineLength:()=>bw,polylineLengthHorizontal:()=>xw,resolveAuthRequest:()=>T_,resolveEdgeModes:()=>yb,resolveFeature:()=>y_,resolveLightingPreset:()=>DS,resolveRotationMatrix:()=>dC,resolveTextureKind:()=>fy,sameEdgeModes:()=>bb,setColorPipeline:()=>wb,setMaterialQuality:()=>Sb,setMaxAnisotropy:()=>Xy,setMaxTextureSize:()=>$y,setSrgbTextureDecode:()=>rb,skylineFromDepth:()=>Gw,steps:()=>sw,unpackRGBADepth:()=>Bw,unprojectNdc:()=>Hw,worldFromLngLat:()=>F_});w_(),tx(),vb(),dS(),pb(),vy(),hb(),sh(),w_(),vy(),pb(),hb(),vb(),tx(),dS();var ET=globalThis;return ET.THREE||(ET.THREE=l),ET.S3M=TT,e.Animator=gw,e.AttributeQuery=j_,e.BinaryReader=hh,e.CUBE_FACES=eT,e.DEFAULT_FLOOR_HEIGHT=C_,e.DEFAULT_LIGHT_PRESET=wS,e.DEFAULT_STYLE=Ib,e.DatasetManager=rT,e.EARTH_RADIUS=M_,e.EASING_NAMES=YC,e.FeatureStyleManager=_C,e.GPUPathManager=_b,e.GpuEdgePass=aC,e.GroundManager=iT,e.HostRenderer=mT,e.LIGHT_PRESETS=ES,e.Path=mb,e.Picker=RC,e.PixelFormat=my,e.S3MFormatError=p_,e.S3MTileset=CS,e.S3MViewer=pT,e.default=pT,e.S3M_VERSION=Fg,e.SAMPLES_PER_PATH=gb,e.SELECT_MODE=Nb,e.SELECT_MODE_LABELS=Pb,e.STYLE=jb,e.STYLE_LABELS=Mb,e.SUPERMAP_LIGHT_PRESET=TS,e.TextureCompress=hy,e.VertexTag=Ig,e.VertexTagV3=Lg,e.authFetch=E_,e.azimuthElevation=Ww,e.boxClipping=Mw,e.buildAttributes=x_,e.buildBlendedMVP=wT,e.buildClipPlanes=Pw,e.buildCubeCameras=tT,e.buildFeatureEdgeSegments=eC,e.buildNearScaledMVP=CT,e.buildOrthoMVP=ST,e.buildThickLineGeometry=YS,e.buildTileObjects=iS,e.captureRadialCube=nT,e.captureSkylineDepth=$w,e.computeViewshed=Kw,e.createLineSharedUniforms=GS,e.createOutlineMaterial=Ab,e.createSharedUniforms=Db,e.createStyledMaterial=Ob,e.createTexture=ob,e.createThickLineMaterial=JS,e.crossClipping=Nw,e.cubicBezier=ow,e.distance3D=_w,e.distanceHorizontal=vw,e.dxtPixelFormatOf=py,e.easing=XC,e.extractEulerAngles=fC,e.extractFovRadians=xT,e.extractNearFar=bT,e.extractProjectionMatrix=yT,e.getColorPipeline=Tb,e.getMaterialQuality=Cb,e.heightDifference=yw,e.isPointKept=Aw,e.isS3M1Buffer=pg,e.lineOfSight=Ew,e.lngLatFromMercator=P_,e.lngLatFromWorld=I_,e.makeCubeDistanceSampler=qw,e.measureSegment=Tw,e.measureSegments=b_,e.mercatorFromLngLat=N_,e.packRGBADepth=zw,e.parseS3M1=Pg,e.parseS3MB=m_,e.pixelToNdc=Uw,e.planDegradations=g_,e.planeClipping=jw,e.planeFromPointNormal=kw,e.polygonArea=Cw,e.polygonAreaHorizontal=ww,e.polygonPerimeter=Sw,e.polylineLength=bw,e.polylineLengthHorizontal=xw,e.resolveAuthRequest=T_,e.resolveEdgeModes=yb,e.resolveFeature=y_,e.resolveLightingPreset=DS,e.resolveRotationMatrix=dC,e.resolveTextureKind=fy,e.sameEdgeModes=bb,e.setColorPipeline=wb,e.setMaterialQuality=Sb,e.setMaxAnisotropy=Xy,e.setMaxTextureSize=$y,e.setSrgbTextureDecode=rb,e.skylineFromDepth=Gw,e.steps=sw,e.unpackRGBADepth=Bw,e.unprojectNdc=Hw,e.worldFromLngLat=F_,e})({});
|
package/dist/index.d.ts
CHANGED
|
@@ -53,6 +53,9 @@ export { resolveEdgeModes, sameEdgeModes } from './render/StyleMaterial.js';
|
|
|
53
53
|
export { setMaterialQuality, getMaterialQuality } from './render/StyleMaterial.js';
|
|
54
54
|
export { Picker } from './render/Picker.js';
|
|
55
55
|
export { GpuEdgePass } from './render/GpuEdgePass.js';
|
|
56
|
+
export * from './analysis/index.js';
|
|
57
|
+
export { captureSkylineDepth, captureRadialCube, buildCubeCameras, CUBE_FACES } from './render/analysis/DepthPass.js';
|
|
58
|
+
export type { DepthCaptureContext, SkylineCapture } from './render/analysis/DepthPass.js';
|
|
56
59
|
export type { GpuEdgeParams } from './render/GpuEdgePass.js';
|
|
57
60
|
export type { PickHit } from './render/Picker.js';
|
|
58
61
|
export { Animator, Path, easing, cubicBezier, steps, EASING_NAMES } from './anim/index.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACtG,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC/D,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAClG,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC/G,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,YAAY,EACV,qBAAqB,EACrB,cAAc,EACd,YAAY,GACb,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAChG,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGpE,YAAY,EACV,IAAI,EACJ,WAAW,EACX,SAAS,EACT,eAAe,EACf,YAAY,EACZ,aAAa,EACb,WAAW,EACX,SAAS,EACT,eAAe,EACf,KAAK,EACL,OAAO,EACP,SAAS,EACT,UAAU,EACV,UAAU,EACV,MAAM,EACN,KAAK,EACL,iBAAiB,EACjB,UAAU,EACV,aAAa,GACd,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGzD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAGxF,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,YAAY,EACV,gBAAgB,EAChB,UAAU,GACX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EACL,aAAa,EACb,KAAK,EACL,YAAY,EACZ,WAAW,EACX,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,cAAc,EACd,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9E,YAAY,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,SAAS,EACT,UAAU,EACV,aAAa,EACb,YAAY,EACZ,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAC/H,YAAY,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEzF,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAErG,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACnI,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,YAAY,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,YAAY,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAChG,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,qBAAqB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAChJ,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACzG,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEnF,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACtG,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC/D,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAClG,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC/G,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,YAAY,EACV,qBAAqB,EACrB,cAAc,EACd,YAAY,GACb,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAChG,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGpE,YAAY,EACV,IAAI,EACJ,WAAW,EACX,SAAS,EACT,eAAe,EACf,YAAY,EACZ,aAAa,EACb,WAAW,EACX,SAAS,EACT,eAAe,EACf,KAAK,EACL,OAAO,EACP,SAAS,EACT,UAAU,EACV,UAAU,EACV,MAAM,EACN,KAAK,EACL,iBAAiB,EACjB,UAAU,EACV,aAAa,GACd,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGzD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAGxF,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,YAAY,EACV,gBAAgB,EAChB,UAAU,GACX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EACL,aAAa,EACb,KAAK,EACL,YAAY,EACZ,WAAW,EACX,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,cAAc,EACd,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9E,YAAY,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,SAAS,EACT,UAAU,EACV,aAAa,EACb,YAAY,EACZ,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAC/H,YAAY,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEzF,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAErG,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACnI,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,YAAY,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,YAAY,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAChG,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,qBAAqB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAChJ,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACzG,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEnF,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGtD,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACtH,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAC1F,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC3F,YAAY,EACV,OAAO,EACP,UAAU,EACV,iBAAiB,EACjB,QAAQ,EACR,UAAU,GACX,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACvB,cAAc,EACd,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AACrC,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAErG,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAEpG,OAAO,EAAE,SAAS,IAAI,OAAO,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -37,6 +37,9 @@ export { resolveEdgeModes, sameEdgeModes } from './render/StyleMaterial.js';
|
|
|
37
37
|
export { setMaterialQuality, getMaterialQuality } from './render/StyleMaterial.js';
|
|
38
38
|
export { Picker } from './render/Picker.js';
|
|
39
39
|
export { GpuEdgePass } from './render/GpuEdgePass.js';
|
|
40
|
+
/* 三维空间分析内核:纯数学,不依赖 WebGL,可单独用于服务端 / Worker */
|
|
41
|
+
export * from './analysis/index.js';
|
|
42
|
+
export { captureSkylineDepth, captureRadialCube, buildCubeCameras, CUBE_FACES } from './render/analysis/DepthPass.js';
|
|
40
43
|
export { Animator, Path, easing, cubicBezier, steps, EASING_NAMES } from './anim/index.js';
|
|
41
44
|
export { buildOrthoMVP, buildBlendedMVP, buildNearScaledMVP, extractProjectionMatrix, extractNearFar, extractFovRadians, } from './render/OrthoProjection.js';
|
|
42
45
|
export { createThickLineMaterial, createLineSharedUniforms, buildThickLineGeometry, buildFeatureEdgeSegments, } from './render/EdgeLines.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,oCAAoC;AACpC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACtG,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC/G,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAO1D,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAyBpE,4BAA4B;AAC5B,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAGhC,SAAS;AACT,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGrD,SAAS;AACT,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAKlD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,EACL,aAAa,EACb,KAAK,EACL,YAAY,EACZ,WAAW,EACX,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,aAAa,EACb,cAAc,EACd,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAuB9E,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAG/H,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAG/D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACnI,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAI/E,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAGhG,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEnF,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,oCAAoC;AACpC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACtG,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC/G,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAO1D,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAyBpE,4BAA4B;AAC5B,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAGhC,SAAS;AACT,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGrD,SAAS;AACT,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAKlD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,EACL,aAAa,EACb,KAAK,EACL,YAAY,EACZ,WAAW,EACX,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,aAAa,EACb,cAAc,EACd,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAuB9E,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAG/H,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAG/D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACnI,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAI/E,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAGhG,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEnF,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,8CAA8C;AAC9C,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAKtH,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAS3F,OAAO,EACL,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACvB,cAAc,EACd,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,SAAS,IAAI,OAAO,EAAE,MAAM,uBAAuB,CAAC"}
|