babyeditor-tool 0.0.7 → 0.0.10
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/babyeditor.tool.cjs.js +1 -1
- package/dist/babyeditor.tool.cjs.js.map +1 -1
- package/dist/babyeditor.tool.es.js +937 -14
- package/dist/babyeditor.tool.es.js.map +1 -1
- package/dist/babyeditor.tool.umd.js +1 -1
- package/dist/babyeditor.tool.umd.js.map +1 -1
- package/package.json +5 -5
- package/types/interfaces/MetaData.interface.d.ts +54 -0
- package/types/interfaces/MetaData.interface.d.ts.map +1 -1
- package/types/tool/CustomSystem.d.ts +26 -3
- package/types/tool/CustomSystem.d.ts.map +1 -1
- package/types/tool/CustomSystem.js +105 -6
- package/types/tool/SceneLoader.d.ts +100 -4
- package/types/tool/SceneLoader.d.ts.map +1 -1
- package/types/tool/SceneLoader.js +251 -8
- package/types/tool/map/Layer.d.ts +37 -0
- package/types/tool/map/Layer.d.ts.map +1 -0
- package/types/tool/map/Layer.js +49 -0
- package/types/tool/map/MapViewer.d.ts +68 -0
- package/types/tool/map/MapViewer.d.ts.map +1 -0
- package/types/tool/map/MapViewer.js +105 -0
- package/types/tool/map/Projection.d.ts +40 -0
- package/types/tool/map/Projection.d.ts.map +1 -0
- package/types/tool/map/Projection.js +75 -0
- package/types/tool/map/tile/TileLayer.d.ts +9 -0
- package/types/tool/map/tile/TileLayer.d.ts.map +1 -0
- package/types/tool/map/tile/TileLayer.js +22 -0
- package/types/tool/map/tile/TileLayerRenderer.d.ts +145 -0
- package/types/tool/map/tile/TileLayerRenderer.d.ts.map +1 -0
- package/types/tool/map/tile/TileLayerRenderer.js +329 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("@babylonjs/core");require("@babylonjs/materials"),require("@babylonjs/loaders"),require("@babylonjs/post-processes"),require("@babylonjs/procedural-textures");const s=require("@babylonjs/havok");class t{constructor(e){this.scene=e,this.load()}load(){const e=this.scene.transformNodes;for(let s=0;s<e.length;s++){const n=e[s];if(n.metadata){const e=n.metadata;"assetModel"===e.meshBuilderType&&e.assetModelBuilderOptions?.url&&t.LoadAssetModel(n,e.assetModelBuilderOptions.url,this.scene)}}}static async LoadAssetModel(s,t,n){const i=t=>{t instanceof e.Node&&!t.parent&&(t.parent=s),t instanceof e.Mesh&&t.material&&(t.material.doNotSerialize=!0),t.doNotSerialize=!0},{meshes:a,transformNodes:c,lights:r,skeletons:o}=await e.ImportMeshAsync(t,n);a.forEach(e=>i(e)),c.forEach(e=>i(e)),r.forEach(e=>i(e)),o.forEach(e=>i(e))}}var n=Object.defineProperty,i=(e,s,t)=>((e,s,t)=>s in e?n(e,s,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[s]=t)(e,"symbol"!=typeof s?s+"":s,t);class a{constructor(s,t,n){i(this,"container"),i(this,"canvas"),i(this,"engine"),i(this,"scene"),i(this,"sceneData",""),i(this,"scritpsMap",{}),i(this,"scriptInstanceList",[]),this.container=s,this.canvas=document.createElement("canvas"),this.canvas.className="main-display-canvas",this.canvas.width=s.clientWidth,this.canvas.height=s.clientHeight,this.container.appendChild(this.canvas),this.engine=new e.Engine(this.canvas,!0),this.scene=new e.Scene(this.engine),this.load(t,n)}async load(n,i){this.scene&&this.scene.dispose(),i&&(this.scritpsMap=i),this.scene=new e.Scene(this.engine),this.sceneData=n,this.scriptInstanceList=[],this.scene.onBeforeRenderObservable.add(()=>{if(this.scriptInstanceList){const e=this.engine.getDeltaTime();for(let s=0;s<this.scriptInstanceList.length;s++){const t=this.scriptInstanceList[s];t.update&&t.update(e)}}});const a=await s();let c;this.scene.enablePhysics(new e.Vector3(0,-9.81,0),new e.HavokPlugin(!0,a)),await e.AppendSceneAsync("data:"+n,this.scene),c=0===this.scene.cameras.length?new e.FreeCamera("摄影机",new e.Vector3(50,50,50),this.scene,!0):this.scene.activeCamera||this.scene.cameras[0],c.attachControl(this.canvas),new t(this.scene),i&&this.initScripts(i),this.render()}initScripts(e){if(!e)return;if(this.scene.metadata){const s=this.scene.metadata.scripts;s&&s.length>0&&this.runScript(this.scene,e,s)}const s=this.scene.getNodes();for(let t=0;t<s.length;t++){const n=s[t];n.metadata?.scripts&&n.metadata.scripts.length>0&&this.runScript(n,e,n.metadata.scripts)}}runScript(e,s,t){if(t)for(let n=0;n<t.length;n++){const i=t[n];for(const t in s)if(Object.prototype.hasOwnProperty.call(s,t)&&t===i.key&&!0!==i.disabled){let t=s[i.key];if(t instanceof Function){const s=new t(this.scene,e,i.values||{});if(s.start&&s.start(),s.dispose&&e.onDisposeObservable){const t=s.dispose;e.onDisposeObservable.addOnce(t.bind(s))}this.scriptInstanceList.push(s)}}}}render(){let e=this.scene;this.engine.runRenderLoop(()=>{e.render()})}resize(){this.engine.resize()}dispose(){this.scene.dispose(),this.engine.dispose()}static LoadCustomSystem(){}}exports.SceneLoader=a,exports.loadScene=function(e,s,t={}){return new a(e,s,t)};
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("@babylonjs/core"),t=require("@babylonjs/materials");require("@babylonjs/loaders"),require("@babylonjs/post-processes"),require("@babylonjs/procedural-textures");const i=require("@babylonjs/havok");var s=Object.defineProperty,o=(e,t,i)=>((e,t,i)=>t in e?s(e,t,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[t]=i)(e,"symbol"!=typeof t?t+"":t,i);const a=class e{static Transform(t,i,s){if(t===i)return s;if(t===e.EPSG4326&&i===e.EPSG3857)return this.EPSG4326To3857(s);if(t===e.EPSG3857&&i===e.EPSG4326)return this.EPSG3857To4326(s);throw new Error(`Unsupported projection transformation: ${t} to ${i}`)}static EPSG4326To3857(e){const t=Math.max(-this.MAX_LATITUDE,Math.min(this.MAX_LATITUDE,e[1])),i=Math.max(-180,Math.min(180,e[0])),s=t*Math.PI/180,o=i*Math.PI/180,a=this.R*o,n=this.R*Math.log(Math.tan(Math.PI/4+s/2));return[Math.max(-this.MAX_PROJECTED_COORD,Math.min(this.MAX_PROJECTED_COORD,a)),Math.max(-this.MAX_PROJECTED_COORD,Math.min(this.MAX_PROJECTED_COORD,n))]}static EPSG3857To4326(e){const t=Math.max(-this.MAX_PROJECTED_COORD,Math.min(this.MAX_PROJECTED_COORD,e[0])),i=Math.max(-this.MAX_PROJECTED_COORD,Math.min(this.MAX_PROJECTED_COORD,e[1]));return[t/this.R*180/Math.PI,180*(2*Math.atan(Math.exp(i/this.R))-Math.PI/2)/Math.PI]}};o(a,"R",6378137),o(a,"R_MINOR",6356752.314245179),o(a,"MAX_LATITUDE",85.0511287798),o(a,"MAX_PROJECTED_COORD",a.R*Math.PI),o(a,"EPSG4326","EPSG:4326"),o(a,"EPSG3857","EPSG:3857"),o(a,"Max3857BBox",[-20037508.342789244,-20037508.33989489,20037508.342789244,20037508.33989489]),o(a,"Max4326BBox",[-180,-90,180,90]);let n=a;var r=Object.defineProperty,h=(e,t,i)=>((e,t,i)=>t in e?r(e,t,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[t]=i)(e,"symbol"!=typeof t?t+"":t,i);class c{constructor(t,i){h(this,"layerRootNode"),h(this,"name",""),this.name=t,this.layerRootNode=new e.TransformNode(t,i),this.layerRootNode.name=t,this.layerRootNode.metadata={editable:!1,layerName:t}}get isEnabled(){return this.layerRootNode.isEnabled()}set isEnabled(e){this.layerRootNode.setEnabled(e)}get onEnabledStateChanged(){return this.layerRootNode.onEnabledStateChangedObservable}setEnabled(e){this.layerRootNode.setEnabled(e)}dispose(){this.layerRootNode.dispose()}onDisposeObservable(e){return this.layerRootNode.onDisposeObservable.add(e)}}var l=Object.defineProperty,d=(e,t,i)=>((e,t,i)=>t in e?l(e,t,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[t]=i)(e,"symbol"!=typeof t?t+"":t,i);class p{constructor(e,t){d(this,"name",""),d(this,"url",""),d(this,"bbox",[0,0,0,0]),this.name=e,this.url=t}getTileUrl(e,t,i){return this.url.replace("{z}",i.toString()).replace("{x}",e.toString()).replace("{y}",t.toString())}requestImage(e,t,i){const s=this.getTileUrl(e,t,i),o=new Image;return o.crossOrigin="anonymous",o.src=s,new Promise((e,t)=>{o.onload=()=>e(o),o.onerror=()=>t(new Error("Failed to load image"))})}}var m=Object.defineProperty,u=(e,t,i)=>((e,t,i)=>t in e?m(e,t,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[t]=i)(e,"symbol"!=typeof t?t+"":t,i);class g extends c{constructor(e){super("TileLayerRenderer",e.scene),u(this,"tileLayers",[]),u(this,"mapViewer"),u(this,"maxBBox"),u(this,"currentZoom",1),u(this,"renderedTiles",new Map),u(this,"cameraObserver",null),u(this,"autoUpdate",!1),this.mapViewer=e,this.maxBBox="EPSG:3857"===e.projection?n.Max3857BBox:n.Max4326BBox,this.layerRootNode.parent=e.rootNode,this.tileLayers=[new p("aaa","https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}")]}get projectionBBox(){return this.mapViewer.getProjectionBbox()}get bbox(){return this.mapViewer.bbox}get size(){return this.mapViewer.size}get projection(){return this.mapViewer.projection}positionToTile(e,t,i){const[s,o,a,n]=this.maxBBox,r=a-s,h=n-o,c=Math.pow(2,i),l=r/c,d=h/c;return[Math.floor((e-s)/l),Math.floor((n-t)/d)]}tileToBBox(e,t,i){const[s,o,a,n]=this.maxBBox,r=a-s,h=n-o,c=Math.pow(2,i),l=r/c,d=h/c,p=s+e*l,m=n-t*d-d;return[p,m+d,p+l,m]}tileToCenter(e,t,i){const[s,o,a,n]=this.tileToBBox(e,t,i);return[(s+a)/2,(o+n)/2]}tileToViewportSize(e,t,i){const[s,o,a,n]=this.tileToBBox(e,t,i),[r,h]=this.projectionToViewport(s,n),[c,l]=this.projectionToViewport(a,o);return[Math.abs(c-r),Math.abs(l-h)]}projectionToViewport(e,t){const[i,s,o,a]=this.projectionBBox,[n,r]=this.size,h=(t-s)/(a-s);return[(e-i)/(o-i)*n-this.size[0]/2,h*r-this.size[1]/2]}getTileMesh(t,i,s){const o=e.MeshBuilder.CreateGround(`tile-${t}-${i}-${s}`,{width:1,height:1},this.mapViewer.scene),a=this.tileToCenter(t,i,s),n=this.projectionToViewport(a[0],a[1]),r=this.tileToViewportSize(t,i,s);return o.position.x=n[0],o.position.z=n[1],o.scaling.x=r[0],o.scaling.z=r[1],o.parent=this.layerRootNode,this.updateTileTexture(t,i,s,o),o}getTileCanvas(e,t,i){const s=document.createElement("canvas");s.width=256,s.height=256;const o=s.getContext("2d");return o&&(o.fillStyle="red",o.font="18px Arial",o.textBaseline="middle",o.textAlign="center",o.fillText(`Tile: ${e}-${t}, ${i}`,s.width/2,s.height/2)),s}updateTileTexture(t,i,s,o){const a=document.createElement("canvas");a.width=256,a.height=256;const n=a.getContext("2d");n&&(n.fillStyle="red",n.font="18px Arial",n.textBaseline="middle",n.textAlign="center",n.fillText(`Tile: ${t}-${i}, ${s}`,a.width/2,a.height/2));let r=o.material;r||(r=new e.StandardMaterial(`tile-${t}-${i}-${s}`,this.mapViewer.scene),r.specularColor=new e.Color3(0,0,0),o.material=r),this.tileLayers.forEach(o=>{r.diffuseTexture=new e.Texture(o.getTileUrl(t,i,s),this.mapViewer.scene,!1,!0)})}calculateVisibleTiles(e){const[t,i,s,o]=this.projectionBBox,[a,n]=this.positionToTile(t,i,e),[r,h]=this.positionToTile(s,o,e),c=[];for(let l=h;l<=n;l++)for(let n=a;n<=r;n++){const a=this.tileToCenter(n,l,e);a[0]>=t&&a[0]<=s&&a[1]>=i&&a[1]<=o&&c.push([n,l,e])}return c}updateTiles(e){this.currentZoom=e;const t=this.calculateVisibleTiles(e),i=new Set;t.forEach(([e,t,s])=>{i.add(`${e}-${t}-${s}`)}),this.renderedTiles.forEach((e,t)=>{i.has(t)||(e.dispose(),this.renderedTiles.delete(t))}),t.forEach(([e,t,i])=>{const s=`${e}-${t}-${i}`;if(!this.renderedTiles.has(s)){const o=this.getTileMesh(e,t,i);this.renderedTiles.set(s,o)}})}enableAutoUpdate(e=0){this.autoUpdate=!0,this.currentZoom=e,this.updateTiles(e);const t=this.mapViewer.scene;t.activeCamera&&(this.cameraObserver=t.onAfterCameraRenderObservable.add(()=>{this.autoUpdate&&this.updateTiles(this.currentZoom)}))}disableAutoUpdate(){this.autoUpdate=!1,this.cameraObserver&&(this.mapViewer.scene.onAfterCameraRenderObservable.remove(this.cameraObserver),this.cameraObserver=null)}setZoom(e){e!==this.currentZoom&&(this.currentZoom=e,this.updateTiles(e))}clearTiles(){this.renderedTiles.forEach(e=>{e.dispose()}),this.renderedTiles.clear()}dispose(){this.disableAutoUpdate(),this.clearTiles(),super.dispose()}}const b=[];for(let C=0;C<256;++C)b.push((C+256).toString(16).slice(1));let f;const v=new Uint8Array(16);const y={};function T(e,t,i){let s;{const e=Date.now(),o=function(){if(!f){if("undefined"==typeof crypto||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");f=crypto.getRandomValues.bind(crypto)}return f(v)}();!function(e,t,i){e.msecs??(e.msecs=-1/0),e.nsecs??(e.nsecs=0),t===e.msecs?(e.nsecs++,e.nsecs>=1e4&&(e.node=void 0,e.nsecs=0)):t>e.msecs?e.nsecs=0:t<e.msecs&&(e.node=void 0);e.node||(e.node=i.slice(10,16),e.node[0]|=1,e.clockseq=16383&(i[8]<<8|i[9]));e.msecs=t}(y,e,o),s=function(e,t,i,s,o,a,n=0){if(e.length<16)throw new Error("Random bytes length must be >= 16");if(a){if(n<0||n+16>a.length)throw new RangeError(`UUID byte range ${n}:${n+15} is out of buffer bounds`)}else a=new Uint8Array(16),n=0;t??(t=Date.now()),i??(i=0),s??(s=16383&(e[8]<<8|e[9])),o??(o=e.slice(10,16));const r=(1e4*(268435455&(t+=122192928e5))+i)%4294967296;a[n++]=r>>>24&255,a[n++]=r>>>16&255,a[n++]=r>>>8&255,a[n++]=255&r;const h=t/4294967296*1e4&268435455;a[n++]=h>>>8&255,a[n++]=255&h,a[n++]=h>>>24&15|16,a[n++]=h>>>16&255,a[n++]=s>>>8|128,a[n++]=255&s;for(let c=0;c<6;++c)a[n++]=o[c];return a}(o,y.msecs,y.nsecs,y.clockseq,y.node,t,i)}return t??function(e,t=0){return(b[e[t+0]]+b[e[t+1]]+b[e[t+2]]+b[e[t+3]]+"-"+b[e[t+4]]+b[e[t+5]]+"-"+b[e[t+6]]+b[e[t+7]]+"-"+b[e[t+8]]+b[e[t+9]]+"-"+b[e[t+10]]+b[e[t+11]]+b[e[t+12]]+b[e[t+13]]+b[e[t+14]]+b[e[t+15]]).toLowerCase()}(s)}var w=Object.defineProperty,B=(e,t,i)=>((e,t,i)=>t in e?w(e,t,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[t]=i)(e,"symbol"!=typeof t?t+"":t,i);class M{constructor(t={},i){B(this,"id",T()),B(this,"name","MapViewer"),B(this,"rootNode"),B(this,"projection","EPSG:3857"),B(this,"bbox",[-180,-90,180,90]),B(this,"size",[100,100]),B(this,"tileLayerRenderer"),B(this,"scene"),B(this,"disposed",!1),B(this,"zoomOffset",1),this.id=t.id||this.id,this.name=t.name||this.name,this.rootNode=new e.TransformNode(t.name||"MapViewerRootNode",i),this.rootNode.name=t.name||this.rootNode.name,this.rootNode.metadata={editable:!1},this.rootNode.doNotSerialize=!0,this.bbox=t.bbox||this.bbox,this.projection=t.projection||this.projection,this.zoomOffset=t.zoomOffset||this.zoomOffset,this.setViewWidth(t.viewWidth||this.size[0]),this.scene=i,this.tileLayerRenderer=new g(this),this.tileLayerRenderer.updateTiles(this.getMinZoom()+this.zoomOffset)}setZoomOffset(e){this.zoomOffset=Math.min(4,e),this.tileLayerRenderer.setZoom(this.getMinZoom()+e)}setBBox(e){this.bbox=e,this.setViewWidth(this.size[0]),this.tileLayerRenderer.updateTiles(this.getMinZoom()+this.zoomOffset)}setViewWidth(e){const t=this.getProjectionBbox();this.size=[e,(t[3]-t[1])*e/(t[2]-t[0])],this.tileLayerRenderer&&this.tileLayerRenderer.updateTiles(this.getMinZoom()+this.zoomOffset)}getMinZoom(){const e=this.getProjectionBbox(),t="EPSG:3857"===this.projection?n.Max3857BBox:n.Max4326BBox;return Math.round(Math.log(Math.abs((t[2]-t[0])/(e[3]-e[1])))/Math.log(2))}setProjection(e){this.projection=e}getProjectionBbox(){const e=this.project([this.bbox[0],this.bbox[1]]),t=this.project([this.bbox[2],this.bbox[3]]);return[e[0],e[1],t[0],t[1]]}project(e){return"EPSG:3857"===this.projection?n.EPSG4326To3857(e):e}createGround(){const i=e.MeshBuilder.CreateGround("ground",{width:this.size[0],height:this.size[1]},this.scene);i.parent=this.rootNode;const s=new t.GridMaterial("初始网格材质",this.scene);s.mainColor=new e.Color3(0,0,0),s.opacity=.8,s.lineColor=new e.Color3(0,0,0),s.backFaceCulling=!1,i.material=s}dispose(){this.disposed=!0}}var R=Object.defineProperty,E=(e,t,i)=>((e,t,i)=>t in e?R(e,t,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[t]=i)(e,t+"",i);class O{constructor(e,t=[],i){this.scene=e,this.scriptInstanceList=t,E(this,"mapViewers",[]),this.load(i)}load(t){const i=this.scene.transformNodes;for(let e=0;e<i.length;e++){const t=i[e];if(t.metadata){const e=t.metadata;"assetModel"===e.meshBuilderType&&e.assetModelBuilderOptions?.url?O.LoadAssetModel(t,e.assetModelBuilderOptions.url,this.scene).then(()=>{const e=this.scriptInstanceList.find(e=>e.node===t);e&&"function"==typeof e.ready&&e.ready()}):"mapViewer"===e.meshBuilderType&&e.mapViewerBuilderOptions&&this.createMapViewer(t,e)}}const s=this.scene.cameras;for(let e=0;e<s.length;e++){const i=s[e];i.metadata&&"editor"!==t&&this.applyCameraBehavior(i)}if(this.scene.environmentTexture){const t=this.scene.environmentTexture.url;this.scene.environmentTexture=null,setTimeout(()=>{try{this.scene.environmentTexture=new e.HDRCubeTexture(t,this.scene,256)}catch(i){}},1e3)}}applyCameraBehavior(t){const i=t.metadata;if(t instanceof e.ArcRotateCamera&&i){if(i.useAutoRotationBehavior&&i.autoRotationBehavior){t.useAutoRotationBehavior=!0;const e=t.autoRotationBehavior;e&&(e.zoomStopsAnimation=i.autoRotationBehavior.zoomStopsAnimation,e.idleRotationSpeed=i.autoRotationBehavior.idleRotationSpeed,e.idleRotationWaitTime=i.autoRotationBehavior.idleRotationWaitTime)}if(i.useFramingBehavior&&i.framingBehavior){t.useFramingBehavior=!0;const e=t.framingBehavior;e&&(e.zoomStopsAnimation=i.framingBehavior.zoomStopsAnimation,e.defaultElevation=i.framingBehavior.defaultElevation,e.elevationReturnTime=i.framingBehavior.elevationReturnTime,e.elevationReturnWaitTime=i.framingBehavior.elevationReturnWaitTime,e.framingTime=i.framingBehavior.framingTime)}i.useBouncingBehavior&&i.bouncingBehavior&&(t.useBouncingBehavior=!0,t.bouncingBehavior&&(t.bouncingBehavior.autoTransitionRange=i.bouncingBehavior.autoTransitionRange||!1,t.bouncingBehavior.lowerRadiusTransitionRange=i.bouncingBehavior.lowerRadiusTransitionRange||2,t.bouncingBehavior.upperRadiusTransitionRange=i.bouncingBehavior.upperRadiusTransitionRange||-2))}}static async LoadAssetModel(t,i,s){const o=i=>{i instanceof e.Node&&!i.parent&&(i.parent=t),i instanceof e.AbstractMesh&&i.material&&(i.material.doNotSerialize=!0),i.doNotSerialize=!0},{meshes:a,transformNodes:n,lights:r,skeletons:h}=await e.ImportMeshAsync(i,s);a.forEach(e=>o(e)),n.forEach(e=>o(e)),r.forEach(e=>o(e)),h.forEach(e=>o(e))}createMapViewer(e,t){const i=new M({id:t.mapViewerBuilderOptions?.id,viewWidth:t.mapViewerBuilderOptions?.viewWidth,bbox:[t.mapViewerBuilderOptions?.minX||-180,t.mapViewerBuilderOptions?.minY||-90,t.mapViewerBuilderOptions?.maxX||180,t.mapViewerBuilderOptions?.maxY||90]},this.scene);return e.onDisposeObservable.addOnce(()=>{i.dispose(),this.mapViewers=this.mapViewers.filter(e=>e!==i)}),i.rootNode.parent=e,this.mapViewers.push(i),i}getMapViewerById(e){return this.mapViewers.find(t=>t.id===e)}}var x=Object.defineProperty,P=(e,t,i)=>((e,t,i)=>t in e?x(e,t,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[t]=i)(e,"symbol"!=typeof t?t+"":t,i);class S{constructor(t,i,s,o={}){P(this,"container"),P(this,"canvas"),P(this,"engine"),P(this,"scene"),P(this,"sceneData",""),P(this,"scriptsMap",{}),P(this,"onLoadObservable",new e.Observable),P(this,"option",{}),P(this,"scriptInstanceList",[]),P(this,"eventsSystem",{click:[],dblclick:[],pointerdown:[],pointerup:[],pointermove:[]}),this.container=t,this.canvas=document.createElement("canvas"),this.canvas.className="main-display-canvas",this.canvas.width=t.clientWidth,this.canvas.height=t.clientHeight,this.container.appendChild(this.canvas),this.engine=new e.Engine(this.canvas,!0,{adaptToDeviceRatio:!0,antialias:!0,stencil:!0,preserveDrawingBuffer:!0,alpha:!1}),this.scene=new e.Scene(this.engine),this.option={showLoadingUI:!0,...o};new ResizeObserver(()=>{this.canvas.width=t.clientWidth,this.canvas.height=t.clientHeight,this.engine.resize()}).observe(t),this.load(i,s)}initEvents(){let t=0;this.scene.onPointerObservable.add(i=>{switch(i.type){case e.PointerEventTypes.POINTERDOWN:const s=Date.now();s-t<300?this.eventsSystem.dblclick.forEach(e=>e(i)):(t=s,this.eventsSystem.click.forEach(e=>e(i))),this.eventsSystem.pointerdown.forEach(e=>e(i));break;case e.PointerEventTypes.POINTERUP:this.eventsSystem.pointerup.forEach(e=>e(i));break;case e.PointerEventTypes.POINTERMOVE:this.eventsSystem.pointermove.forEach(e=>e(i))}})}on(e,t){this.eventsSystem[e]&&this.eventsSystem[e].push(t)}off(e,t){this.eventsSystem[e]&&(this.eventsSystem[e]=this.eventsSystem[e].filter(e=>e!==t))}async load(t,s){this.scene&&this.scene.dispose(),s&&(this.scriptsMap=s),this.scene=new e.Scene(this.engine),this.sceneData=t,this.scriptInstanceList=[],this.initEvents(),this.scene.onBeforeRenderObservable.add(()=>{if(this.scriptInstanceList){const e=this.engine.getDeltaTime();for(let t=0;t<this.scriptInstanceList.length;t++){const i=this.scriptInstanceList[t];i.update&&i.update(e)}}});const o=await i();let a;this.scene.enablePhysics(new e.Vector3(0,-9.81,0),new e.HavokPlugin(!0,o)),await e.AppendSceneAsync("data:"+t,this.scene),this.option.showLoadingUI||this.engine.hideLoadingUI(),a=0===this.scene.cameras.length?new e.FreeCamera("摄影机",new e.Vector3(50,50,50),this.scene,!0):this.scene.activeCamera||this.scene.cameras[0],a.attachControl(this.canvas),s&&this.initScripts(s),new O(this.scene,this.scriptInstanceList,this.option.environment),this.render(),this.onLoadObservable.notifyObservers(this.scene)}initScripts(e){if(!e)return;if(this.scene.metadata){const t=this.scene.metadata.scripts;t&&t.length>0&&this.runScript(this.scene,e,t)}const t=this.scene.getNodes();for(let i=0;i<t.length;i++){const s=t[i];s.metadata?.scripts&&s.metadata.scripts.length>0&&this.runScript(s,e,s.metadata.scripts)}}runScript(e,t,i){if(i)for(let s=0;s<i.length;s++){const o=i[s];for(const i in t)if(Object.prototype.hasOwnProperty.call(t,i)&&i===o.key&&!0!==o.disabled){let i=t[o.key];if(i instanceof Function){const t=new i(this.scene,e,o.values||{});if(t.start&&t.start(),t.dispose&&e.onDisposeObservable){const i=t.dispose;e.onDisposeObservable.addOnce(i.bind(t))}this.scriptInstanceList.push(t)}}}}render(){let e=this.scene;this.engine.runRenderLoop(()=>{e.render()})}getNodeByName(e){return this.scene.getNodeByName(e)}getMeshByName(e){return this.scene.getMeshByName(e)}getLightByName(e){return this.scene.getLightByName(e)}getTransformNodeByName(e){return this.scene.getTransformNodeByName(e)}getCameraByName(e){return this.scene.getCameraByName(e)}flyTo(e,t=2e3){return this.scene.activeCamera?S.FlyTo(this.scene.activeCamera,e,t):Promise.resolve()}viewTo(e){this.scene.activeCamera&&S.ViewTo(this.scene.activeCamera,e)}flyToAnchorByName(e,t=2e3){const i=this.scene.activeCamera;if(i){const s=(i.metadata?.cameraAnchorList||[]).find(t=>t.name===e);if(s)return S.FlyTo(i,s,t)}return Promise.resolve()}flyToAnchorByIndex(e,t=2e3){const i=this.scene.activeCamera;if(i){const s=(i.metadata?.cameraAnchorList||[])[e];if(s)return S.FlyTo(i,s,t)}return Promise.resolve()}static FlyTo(t,i,s=2e3){return new Promise((o,a)=>{const n=new e.QuadraticEase;n.setEasingMode(e.EasingFunction.EASINGMODE_EASEOUT);const r=Date.now(),h={position:t.position.asArray(),target:[0,0,0],radius:0,alpha:0,beta:0};t instanceof e.ArcRotateCamera&&(h.radius=t.radius,h.alpha=t.alpha%(2*Math.PI),h.beta=t.beta%Math.PI,h.target=t.target.asArray(),Math.abs(h.alpha-i.alpha)>Math.PI&&(i.alpha>h.alpha?i.alpha-=2*Math.PI:i.alpha+=2*Math.PI)),t instanceof e.TargetCamera&&(h.target=t.target.asArray());const c=(e,t,i)=>e+(t-e)*i,l=()=>{const a=Date.now()-r,d=n.ease(a/s);if(a<s&&requestAnimationFrame(l),t instanceof e.ArcRotateCamera){t.radius=c(h.radius,i.radius,d),t.alpha=c(h.alpha,i.alpha,d),t.beta=c(h.beta,i.beta,d);const e=c(h.target[0],i.target[0],d),s=c(h.target[1],i.target[1],d),o=c(h.target[2],i.target[2],d);t.target.x=e,t.target.y=s,t.target.z=o}else if(t instanceof e.TargetCamera){const s=c(h.position[0],i.position[0],d),o=c(h.position[1],i.position[1],d),a=c(h.position[2],i.position[2],d);t.position=new e.Vector3(s,o,a);const n=c(h.target[0],i.target[0],d),r=c(h.target[1],i.target[1],d),l=c(h.target[2],i.target[2],d);t.target.x=n,t.target.y=r,t.target.z=l}a>=s&&o()};l()})}static ViewTo(t,i){let s=t;s&&(s.position=new e.Vector3(i.position[0],i.position[1],i.position[2]),s instanceof e.ArcRotateCamera?(s.radius=i.radius,s.alpha=i.alpha,s.beta=i.beta):s instanceof e.TargetCamera&&s.setTarget(new e.Vector3(i.target[0],i.target[1],i.target[2])))}resize(){this.engine.resize()}dispose(){this.scene.dispose(),this.engine.dispose()}static LoadCustomSystem(){}}exports.SceneLoader=S,exports.loadScene=function(e,t,i={},s){return new S(e,t,i,s)};
|
|
2
2
|
//# sourceMappingURL=babyeditor.tool.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"babyeditor.tool.cjs.js","sources":["../../src/tool/CustomSystem.ts","../../src/tool/SceneLoader.ts"],"sourcesContent":["import { MetaData } from \"../interfaces/MetaData.interface\";\r\nimport { ImportMeshAsync, Scene, TransformNode, Node, Skeleton, AnimationGroup, Mesh } from \"@babylonjs/core\";\r\n\r\nexport class CustomSystem {\r\n constructor (public scene: Scene) {\r\n this.load()\r\n }\r\n\r\n load () {\r\n const transNodes = this.scene.transformNodes\r\n\r\n for (let i = 0; i < transNodes.length; i++) {\r\n const transNode = transNodes[i];\r\n if (transNode.metadata) {\r\n const metaData: MetaData = transNode.metadata\r\n if (metaData.meshBuilderType === 'assetModel' && metaData.assetModelBuilderOptions?.url) {\r\n CustomSystem.LoadAssetModel(transNode, metaData.assetModelBuilderOptions.url, this.scene)\r\n }\r\n }\r\n }\r\n }\r\n\r\n static async LoadAssetModel (parentNode: TransformNode, url: string, scene: Scene) {\r\n const applyMetaData = (node: Node | Skeleton) => {\r\n if (node instanceof Node && !node.parent) {\r\n node.parent = parentNode\r\n }\r\n if (node instanceof Mesh && node.material) {\r\n node.material.doNotSerialize = true\r\n }\r\n node.doNotSerialize = true\r\n }\r\n const { meshes, transformNodes, lights, skeletons } = await ImportMeshAsync(url, scene)\r\n meshes.forEach(node => applyMetaData(node))\r\n transformNodes.forEach(node => applyMetaData(node))\r\n lights.forEach(node => applyMetaData(node))\r\n skeletons.forEach(node => applyMetaData(node)) \r\n }\r\n}","import { Engine, Scene, Nullable, FreeCamera, Vector3, HavokPlugin, AppendSceneAsync, AbstractMesh, Camera, Node, TransformNode } from \"@babylonjs/core\";\r\nimport '@babylonjs/materials'\r\nimport '@babylonjs/loaders'\r\nimport '@babylonjs/post-processes'\r\nimport '@babylonjs/procedural-textures'\r\nimport HavokPhysics from \"@babylonjs/havok\";\r\nimport { CustomSystem } from \"./CustomSystem\";\r\n\r\n/**\r\n * 脚本接口\r\n */\r\nexport interface ScriptsMap {\r\n [index: string]: IScript | Function;\r\n}\r\n\r\n/**\r\n * 字符串字典\r\n */\r\nexport interface IStringDictionary<T> {\r\n [index: string]: T;\r\n}\r\n\r\n/**\r\n * 行为脚本接口\r\n */\r\nexport interface BehaviorScript {\r\n // 脚本类型\r\n type: 'script',\r\n // 是否启用脚本\r\n disabled: boolean,\r\n // 是否从资源中找不到对应的文件\r\n isLoss?: boolean,\r\n // 脚本标识key, 对应脚本资源的的请求路径\r\n key: string,\r\n // 脚本参数\r\n values: IStringDictionary<any>\r\n}\r\n\r\n/**\r\n * 运行场景加载的核心类\r\n * @description 在这里创建初始化场景所需要的一切的东西\r\n */\r\nexport class SceneLoader {\r\n /**\r\n * 场景容器\r\n */\r\n container: HTMLElement\r\n /**\r\n * 画布\r\n */\r\n canvas: HTMLCanvasElement\r\n /**\r\n * 引擎\r\n */\r\n engine: Engine\r\n /**\r\n * 场景\r\n */\r\n scene: Scene\r\n /**\r\n * 场景数据\r\n */\r\n sceneData: string = ''\r\n /**\r\n * 脚本代码列表\r\n */\r\n scritpsMap: ScriptsMap = {}\r\n /**\r\n * 脚本实例列表\r\n */\r\n private scriptInstanceList: IScript[] = []\r\n /**\r\n * 构造函数\r\n * @param container 容器\r\n * @param sceneData 场景数据\r\n * @param scriptsMap 脚本代码列表\r\n */\r\n constructor(container: HTMLDivElement, sceneData: string, scriptsMap?: ScriptsMap) {\r\n this.container = container\r\n this.canvas = document.createElement('canvas')\r\n this.canvas.className = 'main-display-canvas'\r\n this.canvas.width = container.clientWidth\r\n this.canvas.height = container.clientHeight\r\n this.container.appendChild(this.canvas)\r\n this.engine = new Engine(this.canvas, true)\r\n this.scene = new Scene(this.engine)\r\n\r\n this.load(sceneData, scriptsMap)\r\n }\r\n\r\n /**\r\n * 加载场景\r\n * @param sceneData 场景数据数据\r\n * @param scriptsMap 代码脚本地图\r\n */\r\n async load (sceneData: string, scriptsMap?: ScriptsMap) {\r\n if (this.scene) {\r\n this.scene.dispose()\r\n }\r\n if (scriptsMap) this.scritpsMap = scriptsMap\r\n this.scene = new Scene(this.engine)\r\n this.sceneData = sceneData\r\n this.scriptInstanceList = []\r\n\r\n // 执行更新代码\r\n this.scene.onBeforeRenderObservable.add(() => {\r\n if (this.scriptInstanceList) {\r\n const deltaTime = this.engine.getDeltaTime()\r\n for (let i = 0; i < this.scriptInstanceList.length; i++) {\r\n const script = this.scriptInstanceList[i];\r\n if (script.update) {\r\n script.update(deltaTime)\r\n }\r\n }\r\n }\r\n })\r\n\r\n const havokModule = await HavokPhysics()\r\n this.scene.enablePhysics(new Vector3(0, -9.81, 0), new HavokPlugin(true, havokModule));\r\n\r\n await AppendSceneAsync('data:' + sceneData, this.scene)\r\n let camera\r\n if (this.scene.cameras.length === 0) {\r\n camera = new FreeCamera('摄影机', new Vector3(50, 50, 50), this.scene, true)\r\n console.log('场景中无摄影机,自动创建摄影机')\r\n } else {\r\n camera = this.scene.activeCamera || this.scene.cameras[0]\r\n console.log('解析并使用场景摄影机')\r\n }\r\n camera.attachControl(this.canvas)\r\n\r\n new CustomSystem(this.scene)\r\n\r\n if (scriptsMap) this.initScripts(scriptsMap)\r\n console.log('完成场景初始化')\r\n\r\n this.render()\r\n }\r\n\r\n /**\r\n * 初始化脚本\r\n */\r\n private initScripts(scriptsMap: ScriptsMap) {\r\n if (!scriptsMap) return\r\n\r\n if (this.scene.metadata) {\r\n const scriptList = this.scene.metadata.scripts as BehaviorScript[]\r\n if (scriptList && scriptList.length > 0) {\r\n this.runScript(this.scene, scriptsMap, scriptList)\r\n }\r\n }\r\n\r\n const nodes = this.scene.getNodes()\r\n for (let i = 0; i < nodes.length; i++) {\r\n const node = nodes[i];\r\n\r\n if (node.metadata?.scripts && node.metadata.scripts.length > 0) {\r\n this.runScript(node, scriptsMap, node.metadata.scripts)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 执行代码\r\n * @param node 代码绑定对象\r\n * @param scriptsMap 注入的全部脚本\r\n * @param scriptList 对象绑定的代码列表\r\n * @returns \r\n */\r\n private runScript (node: Scene | Node, scriptsMap: ScriptsMap, scriptList?: BehaviorScript[]) {\r\n if (!scriptList) return\r\n for (let i = 0; i < scriptList.length; i++) {\r\n const script: BehaviorScript = scriptList[i];\r\n\r\n for (const key in scriptsMap) {\r\n if (Object.prototype.hasOwnProperty.call(scriptsMap, key)) {\r\n if (key === script.key && script.disabled !== true) {\r\n let constructor: any = scriptsMap[script.key]\r\n\r\n if (constructor instanceof Function) {\r\n const instance = new (constructor)(this.scene, node, script.values || {})\r\n\r\n if (instance.start) instance.start()\r\n\r\n if (instance.dispose && node.onDisposeObservable) {\r\n const callback: any = instance.dispose\r\n node.onDisposeObservable.addOnce(callback.bind(instance))\r\n }\r\n\r\n this.scriptInstanceList.push(instance)\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 开始渲染循环\r\n */\r\n private render() {\r\n let scene = this.scene\r\n this.engine.runRenderLoop(() => {\r\n scene.render()\r\n })\r\n }\r\n\r\n /**\r\n * 重置canvas变形后的系统尺寸\r\n */\r\n resize() {\r\n this.engine.resize()\r\n }\r\n\r\n dispose() {\r\n this.scene.dispose()\r\n this.engine.dispose()\r\n }\r\n\r\n /**\r\n * 加载自定义组件系统。比如天气系统,模型系统\r\n */\r\n static LoadCustomSystem () {}\r\n}\r\n\r\nexport function loadScene (container: HTMLDivElement, sceneData: string, scriptsMap: ScriptsMap = {}) {\r\n const sceneLoader = new SceneLoader(container, sceneData, scriptsMap)\r\n\r\n return sceneLoader\r\n}\r\n\r\nexport type IScript = {\r\n start?: () => void,\r\n update?: (deltaTime: number) => void,\r\n dispose?: () => void,\r\n}\r\n"],"names":["CustomSystem","constructor","scene","this","load","transNodes","transformNodes","i","length","transNode","metadata","metaData","meshBuilderType","assetModelBuilderOptions","url","LoadAssetModel","parentNode","applyMetaData","node","Node","parent","Mesh","material","doNotSerialize","meshes","lights","skeletons","ImportMeshAsync","forEach","SceneLoader","container","sceneData","scriptsMap","__publicField","canvas","document","createElement","className","width","clientWidth","height","clientHeight","appendChild","engine","Engine","Scene","dispose","scritpsMap","scriptInstanceList","onBeforeRenderObservable","add","deltaTime","getDeltaTime","script","update","havokModule","HavokPhysics","camera","enablePhysics","Vector3","HavokPlugin","AppendSceneAsync","cameras","FreeCamera","activeCamera","attachControl","initScripts","render","scriptList","scripts","runScript","nodes","getNodes","key","Object","prototype","hasOwnProperty","call","disabled","Function","instance","values","start","onDisposeObservable","callback","addOnce","bind","push","runRenderLoop","resize","LoadCustomSystem"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"babyeditor.tool.cjs.js","sources":["../../src/tool/map/Projection.ts","../../src/tool/map/Layer.ts","../../src/tool/map/tile/TileLayer.ts","../../src/tool/map/tile/TileLayerRenderer.ts","../../node_modules/uuid/dist/esm-browser/stringify.js","../../node_modules/uuid/dist/esm-browser/rng.js","../../node_modules/uuid/dist/esm-browser/v1.js","../../src/tool/map/MapViewer.ts","../../src/tool/CustomSystem.ts","../../src/tool/SceneLoader.ts"],"sourcesContent":["/**\r\n * 坐标投影转换\r\n */\r\nexport class Projection {\r\n static R = 6378137;\r\n static R_MINOR = 6356752.314245179\r\n\r\n static MAX_LATITUDE = 85.0511287798\r\n static MAX_PROJECTED_COORD = this.R * Math.PI\r\n\r\n static EPSG4326 = \"EPSG:4326\";\r\n static EPSG3857 = \"EPSG:3857\";\r\n\r\n /**\r\n * 投影坐标转换\r\n * @param from 原始坐标系\r\n * @param to 投影坐标系\r\n * @param coordinates 坐标\r\n * @returns 转换后的坐标\r\n */\r\n static Transform(from: string, to: string, coordinates: number[]) {\r\n if (from === to) {\r\n return coordinates;\r\n }\r\n if (from === Projection.EPSG4326 && to === Projection.EPSG3857) {\r\n return this.EPSG4326To3857(coordinates);\r\n }\r\n if (from === Projection.EPSG3857 && to === Projection.EPSG4326) {\r\n return this.EPSG3857To4326(coordinates);\r\n }\r\n throw new Error(`Unsupported projection transformation: ${from} to ${to}`);\r\n }\r\n\r\n /**\r\n * EPSG:4326转EPSG:3857\r\n * @param coordinates 坐标\r\n * @returns 转换后的坐标\r\n */\r\n static EPSG4326To3857(coordinates: number[]) {\r\n // 约束纬度范围到有效值\r\n const lat = Math.max(-this.MAX_LATITUDE, Math.min(this.MAX_LATITUDE, coordinates[1]));\r\n const lng = Math.max(-180, Math.min(180, coordinates[0]));\r\n\r\n // 转换为弧度\r\n const latRad = lat * Math.PI / 180;\r\n const lngRad = lng * Math.PI / 180;\r\n \r\n // Web墨卡托投影公式\r\n const x = this.R * lngRad;\r\n const y = this.R * Math.log(Math.tan(Math.PI / 4 + latRad / 2));\r\n \r\n // 约束坐标范围\r\n const clampedX = Math.max(-this.MAX_PROJECTED_COORD, Math.min(this.MAX_PROJECTED_COORD, x));\r\n const clampedY = Math.max(-this.MAX_PROJECTED_COORD, Math.min(this.MAX_PROJECTED_COORD, y));\r\n return [clampedX, clampedY]\r\n }\r\n\r\n /**\r\n * EPSG:3857转EPSG:4326\r\n * @param coordinates 坐标\r\n * @returns 转换后的坐标\r\n */\r\n static EPSG3857To4326(coordinates: number[]) {\r\n // 约束坐标范围\r\n const x = Math.max(-this.MAX_PROJECTED_COORD, Math.min(this.MAX_PROJECTED_COORD, coordinates[0]));\r\n const y = Math.max(-this.MAX_PROJECTED_COORD, Math.min(this.MAX_PROJECTED_COORD, coordinates[1]));\r\n \r\n // 反投影公式\r\n const lng = x / this.R * 180 / Math.PI;\r\n const latRad = 2 * Math.atan(Math.exp(y / this.R)) - Math.PI / 2;\r\n const lat = latRad * 180 / Math.PI;\r\n \r\n return [lng, lat];\r\n }\r\n\r\n /**\r\n * EPSG:3857范围\r\n */\r\n static Max3857BBox: [number, number, number, number] = [-20037508.342789244, -20037508.33989489, 20037508.342789244, 20037508.33989489];\r\n\r\n /**\r\n * EPSG:4326范围\r\n */\r\n static Max4326BBox: [number, number, number, number] = [-180, -90, 180, 90];\r\n}\r\n","import { Scene, TransformNode } from \"@babylonjs/core\";\r\n\r\nexport class Layer {\r\n /**\r\n * 图层根节点\r\n */\r\n layerRootNode: TransformNode\r\n /**\r\n * 图层名称\r\n */\r\n name: string = \"\";\r\n\r\n constructor(name: string, scene: Scene) {\r\n this.name = name;\r\n this.layerRootNode = new TransformNode(name, scene);\r\n this.layerRootNode.name = name;\r\n this.layerRootNode.metadata = { editable: false, layerName: name };\r\n }\r\n\r\n /**\r\n * 获取图层是否启用\r\n */\r\n get isEnabled () {\r\n return this.layerRootNode.isEnabled();\r\n }\r\n\r\n /**\r\n * 设置图层是否启用\r\n * @param enabled 是否启用\r\n */\r\n set isEnabled (enabled: boolean) {\r\n this.layerRootNode.setEnabled(enabled);\r\n }\r\n\r\n /**\r\n * 当图层启用状态改变时触发\r\n * @param observers 观察者\r\n */\r\n get onEnabledStateChanged () {\r\n return this.layerRootNode.onEnabledStateChangedObservable;\r\n }\r\n\r\n /**\r\n * 设置图层是否启用\r\n * @param enabled 是否启用\r\n */\r\n setEnabled(enabled: boolean) {\r\n this.layerRootNode.setEnabled(enabled);\r\n }\r\n\r\n /**\r\n * 释放图层\r\n */\r\n dispose() {\r\n this.layerRootNode.dispose();\r\n }\r\n\r\n onDisposeObservable (observers: () => void) {\r\n return this.layerRootNode.onDisposeObservable.add(observers);\r\n }\r\n}\r\n","export class TileLayer {\r\n name: string = \"\";\r\n url: string = ''\r\n bbox: [number, number, number, number] = [0, 0, 0, 0];\r\n constructor(name: string, url: string) {\r\n this.name = name;\r\n this.url = url;\r\n }\r\n\r\n getTileUrl (x: number, y: number, z: number) {\r\n return this.url.replace(\"{z}\", z.toString()).replace(\"{x}\", x.toString()).replace(\"{y}\", y.toString());\r\n }\r\n\r\n requestImage (x: number, y: number, z: number): Promise<HTMLImageElement> {\r\n const url = this.getTileUrl(x, y, z);\r\n\r\n const image = new Image();\r\n image.crossOrigin = 'anonymous'\r\n image.src = url;\r\n\r\n return new Promise((resolve, reject) => {\r\n image.onload = () => resolve(image);\r\n image.onerror = () => reject(new Error(\"Failed to load image\"));\r\n });\r\n }\r\n}\r\n","import { Mesh, MeshBuilder, StandardMaterial, Texture, Camera, Observer, Color3 } from \"@babylonjs/core\";\r\nimport { Layer } from \"../Layer\";\r\nimport { MapViewer } from \"../MapViewer\";\r\nimport { Projection } from \"../Projection\";\r\nimport { TileLayer } from \"./TileLayer\";\r\nimport { Image } from \"@babylonjs/gui/2D/controls/image\";\r\n\r\n/**\r\n * 瓦片图层渲染器\r\n */\r\nexport class TileLayerRenderer extends Layer {\r\n /**\r\n * 瓦片图层渲染器\r\n */\r\n tileLayers: TileLayer[] = [];\r\n /**\r\n * 地图视图\r\n */\r\n mapViewer: MapViewer;\r\n /**\r\n * 最大范围\r\n */\r\n maxBBox: [number, number, number, number];\r\n /**\r\n * 当前缩放级别\r\n */\r\n currentZoom: number = 1;\r\n /**\r\n * 已渲染的瓦片集合,使用 \"x-y-z\" 作为键\r\n */\r\n private renderedTiles: Map<string, Mesh> = new Map();\r\n /**\r\n * 摄像机位置观察者\r\n */\r\n private cameraObserver: Observer<Camera> | null = null;\r\n /**\r\n * 是否启用自动更新\r\n */\r\n autoUpdate: boolean = false;\r\n /**\r\n * 构造函数\r\n * @param mapViewer 地图视图\r\n */\r\n constructor(mapViewer: MapViewer) {\r\n super('TileLayerRenderer', mapViewer.scene);\r\n this.mapViewer = mapViewer;\r\n this.maxBBox = mapViewer.projection === 'EPSG:3857' ? Projection.Max3857BBox : Projection.Max4326BBox;\r\n \r\n // 将瓦片图层添加到地图根节点\r\n this.layerRootNode.parent = mapViewer.rootNode;\r\n\r\n this.tileLayers = [new TileLayer('aaa', 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}')]\r\n }\r\n\r\n get projectionBBox(): [number, number, number, number] {\r\n return this.mapViewer.getProjectionBbox()\r\n }\r\n\r\n /**\r\n * 获取地图范围\r\n * @returns [minX, minY, maxX, maxY] 地图范围\r\n */\r\n get bbox() {\r\n return this.mapViewer.bbox;\r\n }\r\n\r\n /**\r\n * 获取地图大小\r\n * @returns [width, height] 地图大小\r\n */\r\n get size() {\r\n return this.mapViewer.size;\r\n }\r\n\r\n /**\r\n * 获取地图投影\r\n * @returns 地图投影\r\n */\r\n get projection() {\r\n return this.mapViewer.projection;\r\n }\r\n\r\n /**\r\n * 根据地图投影坐标和缩放级别获取瓦片序号\r\n * @param x 投影坐标X\r\n * @param y 投影坐标Y\r\n * @param z 缩放级别\r\n * @returns [tileX, tileY] 瓦片序号\r\n */\r\n positionToTile(x: number, y: number, z: number): [number, number] {\r\n const [bboxMinX, bboxMinY, bboxMaxX, bboxMaxY] = this.maxBBox;\r\n const width = bboxMaxX - bboxMinX;\r\n const height = bboxMaxY - bboxMinY;\r\n \r\n // 计算单个瓦片在当前缩放级别下的大小\r\n const tileCount = Math.pow(2, z);\r\n const tileWidth = width / tileCount;\r\n const tileHeight = height / tileCount;\r\n \r\n // 计算瓦片序号\r\n const tileX = Math.floor((x - bboxMinX) / tileWidth);\r\n const tileY = Math.floor((bboxMaxY - y) / tileHeight); // Y轴通常是从上到下\r\n\r\n return [tileX, tileY];\r\n }\r\n\r\n /**\r\n * 根据瓦片序号和缩放级别获取瓦片范围\r\n * @param tileX 瓦片序号X\r\n * @param tileY 瓦片序号Y\r\n * @param z 缩放级别\r\n * @returns [minX, minY, maxX, maxY] 瓦片范围\r\n */\r\n tileToBBox(tileX: number, tileY: number, z: number): [number, number, number, number] {\r\n const [minX, minY, maxX, maxY] = this.maxBBox;\r\n const width = maxX - minX;\r\n const height = maxY - minY;\r\n \r\n // 计算单个瓦片在当前缩放级别下的大小\r\n const tileCount = Math.pow(2, z);\r\n const tileWidth = width / tileCount;\r\n const tileHeight = height / tileCount;\r\n\r\n // 计算瓦片范围\r\n const tileMinX = minX + tileX * tileWidth;\r\n const tileMinY = maxY - tileY * tileHeight - tileHeight;\r\n const tileMaxX = tileMinX + tileWidth;\r\n const tileMaxY = tileMinY + tileHeight;\r\n\r\n return [tileMinX, tileMaxY, tileMaxX, tileMinY];\r\n }\r\n\r\n /**\r\n * 根据瓦片序号和缩放级别获取瓦片中心点坐标\r\n * @param tileX 瓦片序号X\r\n * @param tileY 瓦片序号Y\r\n * @param z 缩放级别\r\n * @returns [centerX, centerY] 瓦片中心点坐标\r\n */\r\n tileToCenter(tileX: number, tileY: number, z: number): [number, number] {\r\n const [minX, minY, maxX, maxY] = this.tileToBBox(tileX, tileY, z);\r\n const centerX = (minX + maxX) / 2;\r\n const centerY = (minY + maxY) / 2;\r\n return [centerX, centerY];\r\n }\r\n\r\n /**\r\n * 根据瓦片序号和缩放级别获取瓦片在视野中的尺寸大小\r\n * @param tileX 瓦片序号X\r\n * @param tileY 瓦片序号Y\r\n * @param z 缩放级别\r\n * @returns [width, height] 瓦片在视野中的宽度和高度(像素)\r\n */\r\n tileToViewportSize(tileX: number, tileY: number, z: number): [number, number] {\r\n const [minX, minY, maxX, maxY] = this.tileToBBox(tileX, tileY, z);\r\n \r\n // 获取瓦片左上角和右下角在视口中的坐标\r\n const [viewportMinX, viewportMinY] = this.projectionToViewport(minX, maxY);\r\n const [viewportMaxX, viewportMaxY] = this.projectionToViewport(maxX, minY);\r\n \r\n // 计算视口尺寸\r\n const viewportWidth = Math.abs(viewportMaxX - viewportMinX);\r\n const viewportHeight = Math.abs(viewportMaxY - viewportMinY);\r\n \r\n return [viewportWidth, viewportHeight];\r\n }\r\n\r\n /**\r\n * 将投影坐标转换为地图视野相对坐标\r\n * @param x 投影坐标X\r\n * @param y 投影坐标Y\r\n * @returns [relativeX, relativeY] 相对于地图视野的坐标\r\n */\r\n projectionToViewport(x: number, y: number): [number, number] {\r\n const [bboxMinX, bboxMinY, bboxMaxX, bboxMaxY] = this.projectionBBox;\r\n const [width, height] = this.size;\r\n \r\n // 计算投影坐标在地图范围内的相对位置(0-1)\r\n const relativeX = (x - bboxMinX) / (bboxMaxX - bboxMinX);\r\n const relativeY = (y - bboxMinY) / (bboxMaxY - bboxMinY);\r\n \r\n // 转换为视口像素坐标\r\n const viewportX = relativeX * width - this.size[0] / 2;\r\n const viewportY = relativeY * height - this.size[1] / 2;\r\n \r\n return [viewportX, viewportY];\r\n }\r\n\r\n /**\r\n * 根据瓦片序号和缩放级别获取瓦片网格\r\n * @param tileX 瓦片序号X\r\n * @param tileY 瓦片序号Y\r\n * @param z 缩放级别\r\n * @returns 瓦片网格\r\n */\r\n getTileMesh(tileX: number, tileY: number, z: number): Mesh {\r\n const tileMesh = MeshBuilder.CreateGround(`tile-${tileX}-${tileY}-${z}`, { width: 1, height: 1 }, this.mapViewer.scene);\r\n const center = this.tileToCenter(tileX, tileY, z);\r\n const worldPosition = this.projectionToViewport(center[0], center[1]);\r\n const worldSize = this.tileToViewportSize(tileX, tileY, z);\r\n\r\n tileMesh.position.x = worldPosition[0];\r\n tileMesh.position.z = worldPosition[1];\r\n\r\n tileMesh.scaling.x = worldSize[0];\r\n tileMesh.scaling.z = worldSize[1];\r\n\r\n tileMesh.parent = this.layerRootNode;\r\n\r\n this.updateTileTexture(tileX, tileY, z, tileMesh);\r\n\r\n return tileMesh;\r\n }\r\n\r\n /**\r\n * 获取调试画布\r\n * @returns 调试画布元素\r\n */\r\n getTileCanvas(tileX: number, tileY: number, z: number): HTMLCanvasElement {\r\n const canvas = document.createElement('canvas');\r\n canvas.width = 256;\r\n canvas.height = 256;\r\n\r\n const ctx = canvas.getContext('2d');\r\n\r\n if (ctx) {\r\n ctx.fillStyle = 'red';\r\n\r\n ctx.font = '18px Arial';\r\n ctx.textBaseline = 'middle';\r\n ctx.textAlign = 'center';\r\n ctx.fillText(`Tile: ${tileX}-${tileY}, ${z}`, canvas.width / 2, canvas.height / 2);\r\n }\r\n\r\n return canvas;\r\n }\r\n\r\n updateTileTexture (tileX: number, tileY: number, z: number, tileMesh: Mesh) {\r\n const canvas = document.createElement('canvas');\r\n canvas.width = 256;\r\n canvas.height = 256;\r\n\r\n const ctx = canvas.getContext('2d');\r\n\r\n if (ctx) {\r\n ctx.fillStyle = 'red';\r\n\r\n ctx.font = '18px Arial';\r\n ctx.textBaseline = 'middle';\r\n ctx.textAlign = 'center';\r\n ctx.fillText(`Tile: ${tileX}-${tileY}, ${z}`, canvas.width / 2, canvas.height / 2);\r\n }\r\n\r\n let material: StandardMaterial = tileMesh.material as StandardMaterial\r\n\r\n if (!material) {\r\n material = new StandardMaterial(`tile-${tileX}-${tileY}-${z}`, this.mapViewer.scene);\r\n material.specularColor = new Color3(0, 0, 0);\r\n\r\n tileMesh.material = material;\r\n }\r\n\r\n this.tileLayers.forEach((tileLayer) => {\r\n // tileLayer.requestImage(tileX, tileY, z).then((image: HTMLImageElement) => {\r\n // if (image) {\r\n // if (ctx) ctx.drawImage(image, 0, 0, 256, 256);\r\n // material.diffuseTexture = new Texture(canvas.toDataURL(), this.mapViewer.scene, false, true);\r\n // }\r\n // })\r\n material.diffuseTexture = new Texture(tileLayer.getTileUrl(tileX, tileY, z), this.mapViewer.scene, false, true);\r\n });\r\n \r\n // material.diffuseTexture = new Texture(canvas.toDataURL(), this.mapViewer.scene, false, true);\r\n }\r\n\r\n /**\r\n * 根据当前视野范围和缩放级别计算需要渲染的瓦片列表\r\n * @param zoom 缩放级别\r\n * @returns 需要渲染的瓦片坐标数组 [[tileX, tileY, z], ...]\r\n */\r\n calculateVisibleTiles(zoom: number): Array<[number, number, number]> {\r\n const [bboxMinX, bboxMinY, bboxMaxX, bboxMaxY] = this.projectionBBox;\r\n\r\n // 获取视野范围的四个角点对应的瓦片坐标\r\n const [minTileX, maxTileY] = this.positionToTile(bboxMinX, bboxMinY, zoom);\r\n const [maxTileX, minTileY] = this.positionToTile(bboxMaxX, bboxMaxY, zoom);\r\n \r\n const visibleTiles: Array<[number, number, number]> = [];\r\n \r\n // 遍历视野范围内的所有瓦片\r\n for (let tileY = minTileY; tileY <= maxTileY; tileY++) {\r\n for (let tileX = minTileX; tileX <= maxTileX; tileX++) {\r\n // 确保瓦片坐标在有效范围内\r\n const center = this.tileToCenter(tileX, tileY, zoom);\r\n if (center[0] >= bboxMinX && center[0] <= bboxMaxX && center[1] >= bboxMinY && center[1] <= bboxMaxY) {\r\n visibleTiles.push([tileX, tileY, zoom]);\r\n }\r\n }\r\n }\r\n \r\n return visibleTiles;\r\n }\r\n\r\n /**\r\n * 更新瓦片渲染,只渲染当前视野内的瓦片\r\n * @param zoom 缩放级别\r\n */\r\n updateTiles(zoom: number): void {\r\n this.currentZoom = zoom;\r\n const visibleTiles = this.calculateVisibleTiles(zoom);\r\n\r\n // 创建当前应该存在的瓦片集合\r\n const shouldExistTiles = new Set<string>();\r\n visibleTiles.forEach(([x, y, z]) => {\r\n shouldExistTiles.add(`${x}-${y}-${z}`);\r\n });\r\n \r\n // 移除不在视野内的瓦片\r\n this.renderedTiles.forEach((mesh, key) => {\r\n if (!shouldExistTiles.has(key)) {\r\n mesh.dispose();\r\n this.renderedTiles.delete(key);\r\n }\r\n });\r\n \r\n // 添加新的可见瓦片\r\n visibleTiles.forEach(([tileX, tileY, z]) => {\r\n const tileKey = `${tileX}-${tileY}-${z}`;\r\n if (!this.renderedTiles.has(tileKey)) {\r\n const tileMesh = this.getTileMesh(tileX, tileY, z);\r\n this.renderedTiles.set(tileKey, tileMesh);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * 启用自动更新模式,监听摄像机变化自动更新瓦片\r\n * @param zoom 缩放级别\r\n */\r\n enableAutoUpdate(zoom: number = 0): void {\r\n this.autoUpdate = true;\r\n this.currentZoom = zoom;\r\n \r\n // 初始渲染\r\n this.updateTiles(zoom);\r\n \r\n // 监听场景渲染,检测视野变化\r\n const scene = this.mapViewer.scene;\r\n if (scene.activeCamera) {\r\n this.cameraObserver = scene.onAfterCameraRenderObservable.add(() => {\r\n if (this.autoUpdate) {\r\n // 这里可以添加防抖逻辑,避免频繁更新\r\n this.updateTiles(this.currentZoom);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * 禁用自动更新模式\r\n */\r\n disableAutoUpdate(): void {\r\n this.autoUpdate = false;\r\n if (this.cameraObserver) {\r\n this.mapViewer.scene.onAfterCameraRenderObservable.remove(this.cameraObserver);\r\n this.cameraObserver = null;\r\n }\r\n }\r\n\r\n /**\r\n * 设置缩放级别并更新瓦片\r\n * @param zoom 缩放级别\r\n */\r\n setZoom(zoom: number): void {\r\n if (zoom !== this.currentZoom) {\r\n this.currentZoom = zoom;\r\n this.updateTiles(zoom);\r\n }\r\n }\r\n\r\n /**\r\n * 清除所有已渲染的瓦片\r\n */\r\n clearTiles(): void {\r\n this.renderedTiles.forEach((mesh) => {\r\n mesh.dispose();\r\n });\r\n this.renderedTiles.clear();\r\n }\r\n\r\n /**\r\n * 释放资源\r\n */\r\n dispose(): void {\r\n this.disableAutoUpdate();\r\n this.clearTiles();\r\n super.dispose();\r\n }\r\n}\r\n","import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n","let getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n if (!getRandomValues) {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n getRandomValues = crypto.getRandomValues.bind(crypto);\n }\n return getRandomValues(rnds8);\n}\n","import rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nconst _state = {};\nfunction v1(options, buf, offset) {\n let bytes;\n const isV6 = options?._v6 ?? false;\n if (options) {\n const optionsKeys = Object.keys(options);\n if (optionsKeys.length === 1 && optionsKeys[0] === '_v6') {\n options = undefined;\n }\n }\n if (options) {\n bytes = v1Bytes(options.random ?? options.rng?.() ?? rng(), options.msecs, options.nsecs, options.clockseq, options.node, buf, offset);\n }\n else {\n const now = Date.now();\n const rnds = rng();\n updateV1State(_state, now, rnds);\n bytes = v1Bytes(rnds, _state.msecs, _state.nsecs, isV6 ? undefined : _state.clockseq, isV6 ? undefined : _state.node, buf, offset);\n }\n return buf ?? unsafeStringify(bytes);\n}\nexport function updateV1State(state, now, rnds) {\n state.msecs ??= -Infinity;\n state.nsecs ??= 0;\n if (now === state.msecs) {\n state.nsecs++;\n if (state.nsecs >= 10000) {\n state.node = undefined;\n state.nsecs = 0;\n }\n }\n else if (now > state.msecs) {\n state.nsecs = 0;\n }\n else if (now < state.msecs) {\n state.node = undefined;\n }\n if (!state.node) {\n state.node = rnds.slice(10, 16);\n state.node[0] |= 0x01;\n state.clockseq = ((rnds[8] << 8) | rnds[9]) & 0x3fff;\n }\n state.msecs = now;\n return state;\n}\nfunction v1Bytes(rnds, msecs, nsecs, clockseq, node, buf, offset = 0) {\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n if (!buf) {\n buf = new Uint8Array(16);\n offset = 0;\n }\n else {\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n }\n msecs ??= Date.now();\n nsecs ??= 0;\n clockseq ??= ((rnds[8] << 8) | rnds[9]) & 0x3fff;\n node ??= rnds.slice(10, 16);\n msecs += 12219292800000;\n const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n buf[offset++] = (tl >>> 24) & 0xff;\n buf[offset++] = (tl >>> 16) & 0xff;\n buf[offset++] = (tl >>> 8) & 0xff;\n buf[offset++] = tl & 0xff;\n const tmh = ((msecs / 0x100000000) * 10000) & 0xfffffff;\n buf[offset++] = (tmh >>> 8) & 0xff;\n buf[offset++] = tmh & 0xff;\n buf[offset++] = ((tmh >>> 24) & 0xf) | 0x10;\n buf[offset++] = (tmh >>> 16) & 0xff;\n buf[offset++] = (clockseq >>> 8) | 0x80;\n buf[offset++] = clockseq & 0xff;\n for (let n = 0; n < 6; ++n) {\n buf[offset++] = node[n];\n }\n return buf;\n}\nexport default v1;\n","import { Color3, MeshBuilder, Scene, StandardMaterial, TransformNode } from \"@babylonjs/core\";\r\nimport { Projection } from \"./Projection\";\r\nimport { TileLayerRenderer } from \"./tile/TileLayerRenderer\";\r\nimport { GridMaterial } from \"@babylonjs/materials\";\r\nimport { v1 } from \"uuid\";\r\n\r\nexport interface IMapViewerOption {\r\n id?: string\r\n name?: string;\r\n projection?: 'EPSG:4326' | 'EPSG:3857';\r\n viewWidth?: number;\r\n bbox?: [number, number, number, number];\r\n zoomOffset?: number;\r\n}\r\n\r\nexport class MapViewer {\r\n id: string = v1()\r\n name: string = 'MapViewer'\r\n /**\r\n * 地图根节点\r\n */\r\n rootNode: TransformNode\r\n /**\r\n * 投影坐标系\r\n */\r\n projection: 'EPSG:4326' | 'EPSG:3857' = \"EPSG:3857\";\r\n /**\r\n * 地图范围\r\n */\r\n bbox: [number, number, number, number] = [-180, -90, 180, 90];\r\n /**\r\n * 地图大小\r\n */\r\n size: [number, number] = [100, 100];\r\n /**\r\n * 瓦片图层渲染器\r\n */\r\n readonly tileLayerRenderer: TileLayerRenderer;\r\n /**\r\n * 地图场景\r\n */\r\n scene: Scene\r\n\r\n disposed = false\r\n\r\n zoomOffset: number = 1;\r\n\r\n /**\r\n * 创建地图实例\r\n * @param options 地图参数\r\n */\r\n constructor (options: IMapViewerOption = {}, scene: Scene) {\r\n this.id = options.id || this.id\r\n this.name = options.name || this.name\r\n this.rootNode = new TransformNode(options.name || \"MapViewerRootNode\", scene);\r\n this.rootNode.name = options.name || this.rootNode.name;\r\n this.rootNode.metadata = { editable: false };\r\n this.rootNode.doNotSerialize = true;\r\n\r\n this.bbox = options.bbox || this.bbox;\r\n this.projection = options.projection || this.projection;\r\n this.zoomOffset = options.zoomOffset || this.zoomOffset;\r\n\r\n this.setViewWidth(options.viewWidth || this.size[0]);\r\n\r\n this.scene = scene;\r\n this.tileLayerRenderer = new TileLayerRenderer(this);\r\n this.tileLayerRenderer.updateTiles(this.getMinZoom() + this.zoomOffset);\r\n\r\n // this.createGround()\r\n }\r\n\r\n setZoomOffset(zoomOffset: number) {\r\n this.zoomOffset = Math.min(4, zoomOffset);\r\n this.tileLayerRenderer.setZoom(this.getMinZoom() + zoomOffset);\r\n } \r\n\r\n setBBox(bbox: [number, number, number, number]) {\r\n this.bbox = bbox;\r\n\r\n this.setViewWidth(this.size[0]);\r\n\r\n this.tileLayerRenderer.updateTiles(this.getMinZoom() + this.zoomOffset);\r\n }\r\n\r\n setViewWidth(viewWidth: number) {\r\n const bbox = this.getProjectionBbox();\r\n this.size = [viewWidth, (bbox[3] - bbox[1]) * viewWidth / (bbox[2] - bbox[0])];\r\n\r\n if (this.tileLayerRenderer) {\r\n this.tileLayerRenderer.updateTiles(this.getMinZoom() + this.zoomOffset);\r\n }\r\n }\r\n\r\n getMinZoom () {\r\n const bbox = this.getProjectionBbox();\r\n const maxBBox = this.projection === 'EPSG:3857' ? Projection.Max3857BBox : Projection.Max4326BBox;\r\n\r\n const minZoom = Math.round(Math.log(Math.abs((maxBBox[2] - maxBBox[0]) / (bbox[3] - bbox[1]))) / Math.log(2));\r\n\r\n return minZoom\r\n }\r\n\r\n /**\r\n * 设置地图投影坐标系\r\n * @param projection 投影坐标系\r\n */\r\n setProjection(projection: 'EPSG:4326' | 'EPSG:3857') {\r\n this.projection = projection;\r\n }\r\n\r\n /**\r\n * 获取地图投影坐标系\r\n * @returns 投影坐标系\r\n */\r\n getProjectionBbox(): [number, number, number, number] {\r\n const min = this.project([this.bbox[0], this.bbox[1]]);\r\n const max = this.project([this.bbox[2], this.bbox[3]]);\r\n\r\n return [min[0], min[1], max[0], max[1]]\r\n }\r\n\r\n /**\r\n * 将wgs84坐标投影到地图坐标系\r\n * @param coordinates 坐标\r\n * @returns 投影后的坐标\r\n */\r\n project (coordinates: number[]) {\r\n if (this.projection === 'EPSG:3857') {\r\n return Projection.EPSG4326To3857(coordinates);\r\n }\r\n return coordinates;\r\n }\r\n\r\n createGround () {\r\n const ground = MeshBuilder.CreateGround(\"ground\", { width: this.size[0], height: this.size[1] }, this.scene);\r\n ground.parent = this.rootNode;\r\n \r\n const groundMaterial = new GridMaterial('初始网格材质', this.scene)\r\n groundMaterial.mainColor = new Color3(0, 0, 0)\r\n groundMaterial.opacity = 0.8\r\n groundMaterial.lineColor = new Color3(0, 0, 0)\r\n groundMaterial.backFaceCulling = false\r\n\r\n ground.material = groundMaterial;\r\n }\r\n\r\n dispose () {\r\n this.disposed = true\r\n }\r\n}\r\n","import { MetaData } from \"../interfaces/MetaData.interface\";\r\nimport { ImportMeshAsync, Scene, TransformNode, Node, Skeleton, AnimationGroup, Mesh, AbstractMesh, ArcRotateCamera, AutoRotationBehavior, FramingBehavior, Vector3, Camera, HDRCubeTexture } from \"@babylonjs/core\";\r\nimport { IScript } from \"./SceneLoader\";\r\nimport { MapViewer } from \"./map/MapViewer\";\r\n\r\nexport class CustomSystem {\r\n mapViewers: MapViewer[] = []\r\n constructor (public scene: Scene, private scriptInstanceList: IScript[] = [], environment?: string) {\r\n this.load(environment)\r\n }\r\n\r\n load (environment?: string) {\r\n const transNodes = this.scene.transformNodes\r\n\r\n for (let i = 0; i < transNodes.length; i++) {\r\n const transNode = transNodes[i];\r\n if (transNode.metadata) {\r\n const metaData: MetaData = transNode.metadata\r\n // 当对象是外部资源模型时\r\n if (metaData.meshBuilderType === 'assetModel' && metaData.assetModelBuilderOptions?.url) {\r\n CustomSystem.LoadAssetModel(transNode, metaData.assetModelBuilderOptions.url, this.scene).then(() => {\r\n const findInstance = this.scriptInstanceList.find(instance => instance.node === transNode)\r\n if (findInstance && typeof findInstance.ready === 'function') {\r\n findInstance.ready()\r\n }\r\n })\r\n } else if (metaData.meshBuilderType === 'mapViewer' && metaData.mapViewerBuilderOptions) {\r\n this.createMapViewer(transNode, metaData)\r\n }\r\n }\r\n }\r\n\r\n const cameras = this.scene.cameras\r\n\r\n for (let i = 0; i < cameras.length; i++) {\r\n const camera = cameras[i];\r\n if (camera.metadata && environment !== 'editor') {\r\n this.applyCameraBehavior(camera as ArcRotateCamera)\r\n }\r\n }\r\n\r\n if (this.scene.environmentTexture as HDRCubeTexture) {\r\n const url = (this.scene.environmentTexture as HDRCubeTexture).url\r\n this.scene.environmentTexture = null\r\n setTimeout(() => {\r\n try {\r\n this.scene.environmentTexture = new HDRCubeTexture(url, this.scene, 256);\r\n } \r\n catch (error) {\r\n console.error('加载环境纹理时出错', error)\r\n }\r\n }, 1000)\r\n }\r\n }\r\n\r\n applyCameraBehavior (camera: Camera) {\r\n const metaData: MetaData = camera.metadata\r\n if (camera instanceof ArcRotateCamera && metaData) {\r\n // 自动旋转行为\r\n if (metaData.useAutoRotationBehavior && metaData.autoRotationBehavior) {\r\n camera.useAutoRotationBehavior = true\r\n\r\n const autoRotationBehavior = camera.autoRotationBehavior\r\n\r\n if (autoRotationBehavior) {\r\n autoRotationBehavior.zoomStopsAnimation = metaData.autoRotationBehavior.zoomStopsAnimation\r\n autoRotationBehavior.idleRotationSpeed = metaData.autoRotationBehavior.idleRotationSpeed\r\n autoRotationBehavior.idleRotationWaitTime = metaData.autoRotationBehavior.idleRotationWaitTime\r\n }\r\n }\r\n\r\n // 自动抬回视角行为\r\n if (metaData.useFramingBehavior && metaData.framingBehavior) {\r\n camera.useFramingBehavior = true\r\n\r\n const framingBehavior = camera.framingBehavior\r\n\r\n if (framingBehavior) {\r\n framingBehavior.zoomStopsAnimation = metaData.framingBehavior.zoomStopsAnimation\r\n framingBehavior.defaultElevation = metaData.framingBehavior.defaultElevation\r\n framingBehavior.elevationReturnTime = metaData.framingBehavior.elevationReturnTime\r\n framingBehavior.elevationReturnWaitTime = metaData.framingBehavior.elevationReturnWaitTime\r\n framingBehavior.framingTime = metaData.framingBehavior.framingTime\r\n }\r\n }\r\n\r\n // 视野反弹行为\r\n if (metaData.useBouncingBehavior && metaData.bouncingBehavior) {\r\n camera.useBouncingBehavior = true\r\n if (camera.bouncingBehavior) {\r\n camera.bouncingBehavior.autoTransitionRange = metaData.bouncingBehavior.autoTransitionRange || false\r\n camera.bouncingBehavior.lowerRadiusTransitionRange = metaData.bouncingBehavior.lowerRadiusTransitionRange || 2\r\n camera.bouncingBehavior.upperRadiusTransitionRange = metaData.bouncingBehavior.upperRadiusTransitionRange || -2\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 加载外部资源模型\r\n * @param parentNode 父对象\r\n * @param url 模型地址\r\n * @param scene 场景\r\n */\r\n static async LoadAssetModel (parentNode: TransformNode, url: string, scene: Scene) {\r\n const applyMetaData = (node: Node | Skeleton) => {\r\n if (node instanceof Node && !node.parent) {\r\n node.parent = parentNode\r\n }\r\n if (node instanceof AbstractMesh && node.material) {\r\n node.material.doNotSerialize = true\r\n }\r\n node.doNotSerialize = true\r\n }\r\n const { meshes, transformNodes, lights, skeletons } = await ImportMeshAsync(url, scene)\r\n meshes.forEach(node => applyMetaData(node))\r\n transformNodes.forEach(node => applyMetaData(node))\r\n lights.forEach(node => applyMetaData(node))\r\n skeletons.forEach(node => applyMetaData(node)) \r\n }\r\n\r\n /**\r\n * 创建地图查看器\r\n * @param parentNode 父对象\r\n * @param metaData 元数据\r\n */\r\n createMapViewer (parentNode: TransformNode, metaData: MetaData) {\r\n const mapViewer = new MapViewer({\r\n id: metaData.mapViewerBuilderOptions?.id,\r\n viewWidth: metaData.mapViewerBuilderOptions?.viewWidth,\r\n bbox: [metaData.mapViewerBuilderOptions?.minX || -180, metaData.mapViewerBuilderOptions?.minY || -90, metaData.mapViewerBuilderOptions?.maxX || 180, metaData.mapViewerBuilderOptions?.maxY || 90 ],\r\n }, this.scene)\r\n\r\n parentNode.onDisposeObservable.addOnce(() => {\r\n mapViewer.dispose()\r\n\r\n this.mapViewers = this.mapViewers.filter(item => item !== mapViewer)\r\n })\r\n\r\n mapViewer.rootNode.parent = parentNode\r\n\r\n this.mapViewers.push(mapViewer)\r\n\r\n return mapViewer\r\n }\r\n\r\n /**\r\n * 根据ID获取地图查看器\r\n * @param id 地图查看器ID\r\n */\r\n getMapViewerById (id: string) {\r\n return this.mapViewers.find(item => item.id === id)\r\n }\r\n}","import { Engine, Scene, Nullable, FreeCamera, Vector3, HavokPlugin, AppendSceneAsync, Node, Observable, EasingFunction, QuarticEase, QuadraticEase, Camera, ArcRotateCamera, TargetCamera, PointerInfo, Texture, HDRCubeTexture, PointerEventTypes } from \"@babylonjs/core\";\r\nimport '@babylonjs/materials'\r\nimport '@babylonjs/loaders'\r\nimport '@babylonjs/post-processes'\r\nimport '@babylonjs/procedural-textures'\r\nimport HavokPhysics from \"@babylonjs/havok\";\r\nimport { CustomSystem } from \"./CustomSystem\";\r\nimport { CameraAnchor } from \"../interfaces/MetaData.interface\";\r\n\r\n/**\r\n * 脚本接口\r\n */\r\nexport interface ScriptsMap {\r\n [index: string]: IScript | Function;\r\n}\r\n\r\n/**\r\n * 字符串字典\r\n */\r\nexport interface IStringDictionary<T> {\r\n [index: string]: T;\r\n}\r\n\r\n/**\r\n * 行为脚本接口\r\n */\r\nexport interface BehaviorScript {\r\n // 脚本类型\r\n type: 'script',\r\n // 是否启用脚本\r\n disabled: boolean,\r\n // 是否从资源中找不到对应的文件\r\n isLoss?: boolean,\r\n // 脚本标识key, 对应脚本资源的的请求路径\r\n key: string,\r\n // 脚本参数\r\n values: IStringDictionary<any>\r\n}\r\n\r\nexport interface SceneLoaderOption {\r\n showLoadingUI?: boolean\r\n environment?: string\r\n}\r\n\r\nexport type EventType = 'click' | 'dblclick' | 'pointerdown' | 'pointerup' | 'pointermove'\r\n\r\n/**\r\n * 运行场景加载的核心类\r\n * @description 在这里创建初始化场景所需要的一切的东西\r\n */\r\nexport class SceneLoader {\r\n /**\r\n * 场景容器\r\n */\r\n container: HTMLElement\r\n /**\r\n * 画布\r\n */\r\n canvas: HTMLCanvasElement\r\n /**\r\n * 引擎\r\n */\r\n engine: Engine\r\n /**\r\n * 场景\r\n */\r\n scene: Scene\r\n /**\r\n * 场景数据\r\n */\r\n sceneData: string = ''\r\n /**\r\n * 脚本代码列表\r\n */\r\n scriptsMap: ScriptsMap = {}\r\n /**\r\n * 场景加载完成观察者\r\n */\r\n onLoadObservable = new Observable<Scene>()\r\n /**\r\n * 场景加载选项\r\n */\r\n option: SceneLoaderOption = {}\r\n /**\r\n * 脚本实例列表\r\n */\r\n private scriptInstanceList: IScript[] = []\r\n /**\r\n * 事件系统\r\n */\r\n private eventsSystem: Record<EventType, ((event: any) => void)[]> = {\r\n click: [] as ((event: any) => void)[],\r\n dblclick: [] as ((event: any) => void)[],\r\n pointerdown: [] as ((event: any) => void)[],\r\n pointerup: [] as ((event: any) => void)[],\r\n pointermove: [] as ((event: any) => void)[],\r\n }\r\n\r\n /**\r\n * 构造函数\r\n * @param container 容器\r\n * @param sceneData 场景数据\r\n * @param scriptsMap 脚本代码列表\r\n */\r\n constructor(container: HTMLDivElement, sceneData: string, scriptsMap?: ScriptsMap, option: SceneLoaderOption = {}) {\r\n this.container = container\r\n this.canvas = document.createElement('canvas')\r\n this.canvas.className = 'main-display-canvas'\r\n this.canvas.width = container.clientWidth\r\n this.canvas.height = container.clientHeight\r\n this.container.appendChild(this.canvas)\r\n this.engine = new Engine(this.canvas, true, {\r\n adaptToDeviceRatio: true,\r\n antialias: true,\r\n stencil: true,\r\n preserveDrawingBuffer: true,\r\n alpha: false\r\n })\r\n this.scene = new Scene(this.engine)\r\n this.option = {\r\n showLoadingUI: true,\r\n ...option\r\n }\r\n\r\n // 监听容器尺寸变化\r\n const resizeObserver = new ResizeObserver(() => {\r\n this.canvas.width = container.clientWidth\r\n this.canvas.height = container.clientHeight\r\n this.engine.resize()\r\n })\r\n resizeObserver.observe(container)\r\n\r\n this.load(sceneData, scriptsMap)\r\n }\r\n\r\n /**\r\n * 初始化事件系统\r\n */\r\n private initEvents () {\r\n let lastClickTime = 0\r\n this.scene.onPointerObservable.add((pointerInfo: PointerInfo) => {\r\n switch (pointerInfo.type) {\r\n case PointerEventTypes.POINTERDOWN: // POINTERDOWN\r\n const clickTime = Date.now()\r\n if (clickTime - lastClickTime < 300) {\r\n this.eventsSystem.dblclick.forEach(callback => callback(pointerInfo));\r\n } else {\r\n lastClickTime = clickTime\r\n this.eventsSystem.click.forEach(callback => callback(pointerInfo));\r\n }\r\n this.eventsSystem.pointerdown.forEach(callback => callback(pointerInfo));\r\n break;\r\n case PointerEventTypes.POINTERUP: // POINTERUP\r\n this.eventsSystem.pointerup.forEach(callback => callback(pointerInfo));\r\n break;\r\n case PointerEventTypes.POINTERMOVE: // POINTERMOVE\r\n this.eventsSystem.pointermove.forEach(callback => callback(pointerInfo));\r\n break;\r\n }\r\n });\r\n }\r\n\r\n // 绑定事件\r\n on (eventName: EventType, callback: (event: any) => void) {\r\n if (this.eventsSystem[eventName]) this.eventsSystem[eventName].push(callback)\r\n }\r\n\r\n // 解绑事件\r\n off (eventName: EventType, callback: (event: any) => void) {\r\n if (this.eventsSystem[eventName]) this.eventsSystem[eventName] = this.eventsSystem[eventName].filter(item => item !== callback)\r\n }\r\n\r\n /**\r\n * 加载场景\r\n * @param sceneData 场景数据数据\r\n * @param scriptsMap 代码脚本地图\r\n */\r\n async load (sceneData: string, scriptsMap?: ScriptsMap) {\r\n if (this.scene) {\r\n this.scene.dispose()\r\n }\r\n if (scriptsMap) this.scriptsMap = scriptsMap\r\n this.scene = new Scene(this.engine)\r\n this.sceneData = sceneData\r\n this.scriptInstanceList = []\r\n this.initEvents()\r\n\r\n // 执行更新代码\r\n this.scene.onBeforeRenderObservable.add(() => {\r\n if (this.scriptInstanceList) {\r\n const deltaTime = this.engine.getDeltaTime()\r\n for (let i = 0; i < this.scriptInstanceList.length; i++) {\r\n const script = this.scriptInstanceList[i];\r\n if (script.update) {\r\n script.update(deltaTime)\r\n }\r\n }\r\n }\r\n })\r\n\r\n const havokModule = await HavokPhysics()\r\n this.scene.enablePhysics(new Vector3(0, -9.81, 0), new HavokPlugin(true, havokModule));\r\n\r\n await AppendSceneAsync('data:' + sceneData, this.scene)\r\n if (!this.option.showLoadingUI) this.engine.hideLoadingUI()\r\n\r\n let camera\r\n if (this.scene.cameras.length === 0) {\r\n camera = new FreeCamera('摄影机', new Vector3(50, 50, 50), this.scene, true)\r\n console.log('场景中无摄影机,自动创建摄影机')\r\n } else {\r\n camera = this.scene.activeCamera || this.scene.cameras[0]\r\n console.log('解析并使用场景摄影机')\r\n }\r\n camera.attachControl(this.canvas)\r\n\r\n if (scriptsMap) this.initScripts(scriptsMap)\r\n console.log('完成场景初始化')\r\n\r\n new CustomSystem(this.scene, this.scriptInstanceList, this.option.environment)\r\n\r\n this.render()\r\n this.onLoadObservable.notifyObservers(this.scene)\r\n }\r\n\r\n /**\r\n * 初始化脚本\r\n */\r\n private initScripts(scriptsMap: ScriptsMap) {\r\n if (!scriptsMap) return\r\n\r\n if (this.scene.metadata) {\r\n const scriptList = this.scene.metadata.scripts as BehaviorScript[]\r\n if (scriptList && scriptList.length > 0) {\r\n this.runScript(this.scene, scriptsMap, scriptList)\r\n }\r\n }\r\n\r\n const nodes = this.scene.getNodes()\r\n for (let i = 0; i < nodes.length; i++) {\r\n const node = nodes[i];\r\n\r\n if (node.metadata?.scripts && node.metadata.scripts.length > 0) {\r\n this.runScript(node, scriptsMap, node.metadata.scripts)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 执行代码\r\n * @param node 代码绑定对象\r\n * @param scriptsMap 注入的全部脚本\r\n * @param scriptList 对象绑定的代码列表\r\n * @returns \r\n */\r\n private runScript (node: Scene | Node, scriptsMap: ScriptsMap, scriptList?: BehaviorScript[]) {\r\n if (!scriptList) return\r\n for (let i = 0; i < scriptList.length; i++) {\r\n const script: BehaviorScript = scriptList[i];\r\n\r\n for (const key in scriptsMap) {\r\n if (Object.prototype.hasOwnProperty.call(scriptsMap, key)) {\r\n if (key === script.key && script.disabled !== true) {\r\n let constructor: any = scriptsMap[script.key]\r\n\r\n if (constructor instanceof Function) {\r\n const instance = new (constructor)(this.scene, node, script.values || {})\r\n\r\n if (instance.start) instance.start()\r\n\r\n if (instance.dispose && node.onDisposeObservable) {\r\n const callback: any = instance.dispose\r\n node.onDisposeObservable.addOnce(callback.bind(instance))\r\n }\r\n\r\n this.scriptInstanceList.push(instance)\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n \r\n /**\r\n * 开始渲染循环\r\n */\r\n private render() {\r\n let scene = this.scene\r\n this.engine.runRenderLoop(() => {\r\n scene.render()\r\n })\r\n }\r\n\r\n /**\r\n * 根据名称获取节点\r\n * @param name \r\n * @returns \r\n */\r\n getNodeByName (name: string) {\r\n return this.scene.getNodeByName(name)\r\n }\r\n getMeshByName (name: string) {\r\n return this.scene.getMeshByName(name)\r\n }\r\n getLightByName (name: string) {\r\n return this.scene.getLightByName(name)\r\n }\r\n getTransformNodeByName (name: string) {\r\n return this.scene.getTransformNodeByName(name)\r\n }\r\n getCameraByName (name: string) {\r\n return this.scene.getCameraByName(name)\r\n }\r\n\r\n /**\r\n * 摄影机飞行到设置的位置锚点\r\n * @param anchor 目标节点\r\n * @param duration 飞行时间毫秒,ms\r\n */\r\n flyTo (anchor: CameraAnchor, duration: number = 2000): Promise<void> {\r\n if (this.scene.activeCamera) {\r\n return SceneLoader.FlyTo(this.scene.activeCamera, anchor, duration)\r\n }\r\n return Promise.resolve()\r\n }\r\n\r\n /**\r\n * 摄影机直接定位到设置的位置锚点\r\n * @param anchor 目标节点\r\n * @param camera 指定查看摄影机\r\n */\r\n viewTo (anchor: CameraAnchor) {\r\n if (this.scene.activeCamera) {\r\n SceneLoader.ViewTo(this.scene.activeCamera, anchor)\r\n }\r\n }\r\n\r\n /**\r\n * 根据名称摄影机飞行到设置的锚点\r\n * @param name 摄影机锚点名称\r\n * @param duration 飞行时间毫秒,ms\r\n */\r\n flyToAnchorByName (name: string, duration: number = 2000): Promise<void> {\r\n const camera = this.scene.activeCamera\r\n if (camera) {\r\n const anchorList = camera.metadata?.cameraAnchorList as CameraAnchor[] || []\r\n const anchor = anchorList.find(item => item.name === name)\r\n if (anchor) {\r\n return SceneLoader.FlyTo(camera, anchor, duration)\r\n }\r\n }\r\n\r\n return Promise.resolve()\r\n }\r\n\r\n /**\r\n * 根据名称摄影机飞行到设置的锚点\r\n * @param name 摄影机锚点名称\r\n * @param duration 飞行时间毫秒,ms\r\n */\r\n flyToAnchorByIndex (index: number, duration: number = 2000): Promise<void> {\r\n const camera = this.scene.activeCamera\r\n if (camera) {\r\n const anchorList = camera.metadata?.cameraAnchorList as CameraAnchor[] || []\r\n const anchor = anchorList[index]\r\n if (anchor) {\r\n return SceneLoader.FlyTo(camera, anchor, duration)\r\n }\r\n }\r\n\r\n return Promise.resolve()\r\n }\r\n\r\n /**\r\n * 摄影机飞行到\r\n * @param anchor 目标节点\r\n * @param duration 飞行时间毫秒,ms\r\n * @param camera 指定飞行摄影机\r\n */\r\n static FlyTo (camera: Camera, anchor: CameraAnchor, duration: number = 2000) {\r\n return new Promise<void>((resolve, reject) => {\r\n const easeFunction = new QuadraticEase()\r\n easeFunction.setEasingMode(EasingFunction.EASINGMODE_EASEOUT)\r\n const startTime = Date.now()\r\n\r\n const currentAnchor = {\r\n name: '锚点3',\r\n position: camera.position.asArray(),\r\n target: [0, 0, 0],\r\n radius: 0,\r\n alpha: 0,\r\n beta: 0\r\n }\r\n if (camera instanceof ArcRotateCamera) {\r\n currentAnchor.radius = camera.radius\r\n currentAnchor.alpha = camera.alpha % (2 * Math.PI)\r\n currentAnchor.beta = camera.beta % (Math.PI)\r\n currentAnchor.target = camera.target.asArray()\r\n\r\n if (Math.abs(currentAnchor.alpha - anchor.alpha) > Math.PI) {\r\n if (anchor.alpha > currentAnchor.alpha) {\r\n anchor.alpha -= 2 * Math.PI\r\n } else {\r\n anchor.alpha += 2 * Math.PI\r\n }\r\n }\r\n }\r\n if (camera instanceof TargetCamera) {\r\n currentAnchor.target = camera.target.asArray()\r\n }\r\n\r\n const getLinearValue = (start: number, end: number, val: number) => {\r\n return start + (end - start) * val\r\n }\r\n\r\n const animate = () => {\r\n const elapsedTime = Date.now() - startTime\r\n const val = easeFunction.ease(elapsedTime / duration)\r\n if (elapsedTime < duration) {\r\n requestAnimationFrame(animate)\r\n }\r\n \r\n if (camera instanceof ArcRotateCamera) {\r\n camera.radius = getLinearValue(currentAnchor.radius, anchor.radius, val)\r\n camera.alpha = getLinearValue(currentAnchor.alpha, anchor.alpha, val)\r\n camera.beta = getLinearValue(currentAnchor.beta, anchor.beta, val)\r\n\r\n const x = getLinearValue(currentAnchor.target[0], anchor.target[0], val)\r\n const y = getLinearValue(currentAnchor.target[1], anchor.target[1], val)\r\n const z = getLinearValue(currentAnchor.target[2], anchor.target[2], val)\r\n\r\n camera.target.x = x\r\n camera.target.y = y\r\n camera.target.z = z\r\n } else if (camera instanceof TargetCamera) {\r\n const px = getLinearValue(currentAnchor.position[0], anchor.position[0], val)\r\n const py = getLinearValue(currentAnchor.position[1], anchor.position[1], val)\r\n const pz = getLinearValue(currentAnchor.position[2], anchor.position[2], val)\r\n\r\n camera.position = new Vector3(px, py, pz)\r\n\r\n const x = getLinearValue(currentAnchor.target[0], anchor.target[0], val)\r\n const y = getLinearValue(currentAnchor.target[1], anchor.target[1], val)\r\n const z = getLinearValue(currentAnchor.target[2], anchor.target[2], val)\r\n\r\n camera.target.x = x\r\n camera.target.y = y\r\n camera.target.z = z\r\n }\r\n\r\n if (elapsedTime >= duration) {\r\n resolve()\r\n }\r\n }\r\n\r\n animate()\r\n })\r\n }\r\n\r\n /**\r\n * 摄影机定位到\r\n * @param anchor 目标节点\r\n * @param camera 指定查看摄影机\r\n */\r\n static ViewTo (camera: Camera, anchor: CameraAnchor) {\r\n let activeCamera = camera\r\n \r\n if (activeCamera) {\r\n activeCamera.position = new Vector3(anchor.position[0], anchor.position[1], anchor.position[2])\r\n if (activeCamera instanceof ArcRotateCamera) {\r\n activeCamera.radius = anchor.radius\r\n activeCamera.alpha = anchor.alpha\r\n activeCamera.beta = anchor.beta\r\n } else if (activeCamera instanceof TargetCamera) {\r\n activeCamera.setTarget(new Vector3(anchor.target[0], anchor.target[1], anchor.target[2]))\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 重置canvas变形后的系统尺寸\r\n */\r\n resize() {\r\n this.engine.resize()\r\n }\r\n\r\n dispose() {\r\n this.scene.dispose()\r\n this.engine.dispose()\r\n }\r\n\r\n /**\r\n * 加载自定义组件系统。比如天气系统,模型系统\r\n */\r\n static LoadCustomSystem () {}\r\n}\r\n\r\nexport function loadScene (container: HTMLDivElement, sceneData: string, scriptsMap: ScriptsMap = {}, option?: SceneLoaderOption) {\r\n const sceneLoader = new SceneLoader(container, sceneData, scriptsMap, option)\r\n\r\n return sceneLoader\r\n}\r\n\r\n/**\r\n * 脚本代码结构\r\n */\r\nexport type IScript = {\r\n /**\r\n * 脚执行时注入的场景对象\r\n */\r\n scene: Scene,\r\n /**\r\n * 当前实例化脚本绑定的对象\r\n */\r\n node: Node | Scene,\r\n /**\r\n * 脚本初始化执行的钩子函数\r\n */\r\n start?: () => void,\r\n /**\r\n * 当有异步动作初始化完成时的钩子函数\r\n */\r\n ready?: () => void,\r\n /**\r\n * 当没帧渲染是执行函数\r\n * @param deltaTime 间隔时间\r\n */\r\n update?: (deltaTime: number) => void,\r\n /**\r\n * 当对象被销毁时执行的函数\r\n */\r\n dispose?: () => void,\r\n}\r\n"],"names":["_Projection","Transform","from","to","coordinates","EPSG4326","EPSG3857","this","EPSG4326To3857","EPSG3857To4326","Error","lat","Math","max","MAX_LATITUDE","min","lng","latRad","PI","lngRad","x","R","y","log","tan","MAX_PROJECTED_COORD","atan","exp","__publicField","Projection","Layer","constructor","name","scene","layerRootNode","TransformNode","metadata","editable","layerName","isEnabled","enabled","setEnabled","onEnabledStateChanged","onEnabledStateChangedObservable","dispose","onDisposeObservable","observers","add","TileLayer","url","getTileUrl","z","replace","toString","requestImage","image","Image","crossOrigin","src","Promise","resolve","reject","onload","onerror","TileLayerRenderer","mapViewer","super","Map","maxBBox","projection","Max3857BBox","Max4326BBox","parent","rootNode","tileLayers","projectionBBox","getProjectionBbox","bbox","size","positionToTile","bboxMinX","bboxMinY","bboxMaxX","bboxMaxY","width","height","tileCount","pow","tileWidth","tileHeight","floor","tileToBBox","tileX","tileY","minX","minY","maxX","maxY","tileMinX","tileMinY","tileToCenter","tileToViewportSize","viewportMinX","viewportMinY","projectionToViewport","viewportMaxX","viewportMaxY","abs","relativeY","getTileMesh","tileMesh","MeshBuilder","CreateGround","center","worldPosition","worldSize","position","scaling","updateTileTexture","getTileCanvas","canvas","document","createElement","ctx","getContext","fillStyle","font","textBaseline","textAlign","fillText","material","StandardMaterial","specularColor","Color3","forEach","tileLayer","diffuseTexture","Texture","calculateVisibleTiles","zoom","minTileX","maxTileY","maxTileX","minTileY","visibleTiles","push","updateTiles","currentZoom","shouldExistTiles","Set","renderedTiles","mesh","key","has","delete","tileKey","set","enableAutoUpdate","autoUpdate","activeCamera","cameraObserver","onAfterCameraRenderObservable","disableAutoUpdate","remove","setZoom","clearTiles","clear","byteToHex","i","slice","getRandomValues","rnds8","Uint8Array","_state","v1","options","buf","offset","bytes","now","Date","rnds","crypto","bind","rng","state","msecs","Infinity","nsecs","node","clockseq","updateV1State","length","RangeError","tl","tmh","n","v1Bytes","arr","toLowerCase","unsafeStringify","MapViewer","id","doNotSerialize","zoomOffset","setViewWidth","viewWidth","tileLayerRenderer","getMinZoom","setZoomOffset","setBBox","round","setProjection","project","createGround","ground","groundMaterial","GridMaterial","mainColor","opacity","lineColor","backFaceCulling","disposed","CustomSystem","scriptInstanceList","environment","load","transNodes","transformNodes","transNode","metaData","meshBuilderType","assetModelBuilderOptions","LoadAssetModel","then","findInstance","find","instance","ready","mapViewerBuilderOptions","createMapViewer","cameras","camera","applyCameraBehavior","environmentTexture","setTimeout","HDRCubeTexture","error","ArcRotateCamera","useAutoRotationBehavior","autoRotationBehavior","zoomStopsAnimation","idleRotationSpeed","idleRotationWaitTime","useFramingBehavior","framingBehavior","defaultElevation","elevationReturnTime","elevationReturnWaitTime","framingTime","useBouncingBehavior","bouncingBehavior","autoTransitionRange","lowerRadiusTransitionRange","upperRadiusTransitionRange","parentNode","applyMetaData","Node","AbstractMesh","meshes","lights","skeletons","ImportMeshAsync","addOnce","mapViewers","filter","item","getMapViewerById","SceneLoader","container","sceneData","scriptsMap","option","Observable","click","dblclick","pointerdown","pointerup","pointermove","className","clientWidth","clientHeight","appendChild","engine","Engine","adaptToDeviceRatio","antialias","stencil","preserveDrawingBuffer","alpha","Scene","showLoadingUI","ResizeObserver","resize","observe","initEvents","lastClickTime","onPointerObservable","pointerInfo","type","PointerEventTypes","POINTERDOWN","clickTime","eventsSystem","callback","POINTERUP","POINTERMOVE","on","eventName","off","onBeforeRenderObservable","deltaTime","getDeltaTime","script","update","havokModule","HavokPhysics","enablePhysics","Vector3","HavokPlugin","AppendSceneAsync","hideLoadingUI","FreeCamera","attachControl","initScripts","render","onLoadObservable","notifyObservers","scriptList","scripts","runScript","nodes","getNodes","Object","prototype","hasOwnProperty","call","disabled","Function","values","start","runRenderLoop","getNodeByName","getMeshByName","getLightByName","getTransformNodeByName","getCameraByName","flyTo","anchor","duration","FlyTo","viewTo","ViewTo","flyToAnchorByName","cameraAnchorList","flyToAnchorByIndex","index","easeFunction","QuadraticEase","setEasingMode","EasingFunction","EASINGMODE_EASEOUT","startTime","currentAnchor","asArray","target","radius","beta","TargetCamera","getLinearValue","end","val","animate","elapsedTime","ease","requestAnimationFrame","px","py","pz","setTarget","LoadCustomSystem"],"mappings":"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","x_google_ignoreList":[4,5,6]}
|