babyeditor-tool 0.0.8 → 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.
@@ -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,s=[]){this.scene=e,this.scriptInstanceList=s,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).then(()=>{const e=this.scriptInstanceList.find(e=>e.node===n);e&&"function"==typeof e.ready&&e.ready()})}}}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,"scriptsMap",{}),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.scriptsMap=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),i&&this.initScripts(i),new t(this.scene,this.scriptInstanceList),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\nimport { IScript } from \"./SceneLoader\";\r\n\r\nexport class CustomSystem {\r\n constructor (public scene: Scene, private scriptInstanceList: IScript[] = []) {\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 // 当对象是外部资源模型时\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 }\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 scriptsMap: 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.scriptsMap = 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 if (scriptsMap) this.initScripts(scriptsMap)\r\n console.log('完成场景初始化')\r\n\r\n new CustomSystem(this.scene, this.scriptInstanceList)\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\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":["CustomSystem","constructor","scene","scriptInstanceList","this","load","transNodes","transformNodes","i","length","transNode","metadata","metaData","meshBuilderType","assetModelBuilderOptions","url","LoadAssetModel","then","findInstance","find","instance","node","ready","parentNode","applyMetaData","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","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","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]}