BlueMapWeb/public/js/bluemap.min.js

2 lines
36 KiB
JavaScript

!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("three")):"function"==typeof define&&define.amd?define(["exports","three"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).BlueMap={},t.THREE)}(this,(function(t,e){"use strict";function i(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}function n(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t}function o(){return(o=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var i=arguments[e];for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&(t[n]=i[n])}return t}).apply(this,arguments)}var a=function(t){var e=document.createElementNS("http://www.w3.org/1999/xhtml","img");return e.src=t,e},s=function(t,e){var i="x";return i+=r(t),i+="z",i=(i+=r(e)).substring(0,i.length-1)},r=function(t){var e="";t<0&&(t=-t,e+="-");for(var i=parseInt(t).toString(),n=0;n<i.length;n++)e+=i.charAt(n)+"/";return e},l=function(t,e){return"x"+t+"z"+e},h=function(t,e,i){if(void 0===i&&(i={}),t&&t.dispatchEvent)return t.dispatchEvent(new CustomEvent(e,{detail:i}))},c=function(t,e,i){void 0===i&&(i="info"),h(t,"bluemapAlert",{message:e,level:i})&&("info"===i?console.log("[BlueMap/"+i+"]",e):"warning"===i?console.warn("[BlueMap/"+i+"]",e):"error"===i?console.error("[BlueMap/"+i+"]",e):console.debug("[BlueMap/"+i+"]",e))},u=function(){function t(t,e,i,n){Object.defineProperty(this,"isTile",{value:!0}),this.model=null,this.onLoad=i,this.onUnload=n,this.x=t,this.z=e,this.unloaded=!0,this.loading=!1}var e=t.prototype;return e.load=function(t){var e=this;if(!this.loading)return this.loading=!0,this.unload(),this.unloaded=!1,t.load(this.x,this.z).then((function(t){e.loading=!1,e.unloaded?t.geometry.dispose():(e.model=t,e.onLoad(e))}))},e.unload=function(){this.unloaded=!0,this.model&&(this.onUnload(this),this.model.geometry.dispose(),this.model=null)},n(t,[{key:"loaded",get:function(){return!!this.model}}]),t}(),d=function(){function t(t,i){this.canvas=document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),this.canvas.width=t,this.canvas.height=i,this.tileMapContext=this.canvas.getContext("2d",{alpha:!1,willReadFrequently:!0}),this.texture=new e.Texture(this.canvas),this.texture.generateMipmaps=!1,this.texture.magFilter=e.LinearFilter,this.texture.minFilter=e.LinearFilter,this.texture.wrapS=e.ClampToEdgeWrapping,this.texture.wrapT=e.ClampToEdgeWrapping,this.texture.flipY=!1,this.texture.needsUpdate=!0}var i=t.prototype;return i.setAll=function(t){this.tileMapContext.fillStyle=t,this.tileMapContext.fillRect(0,0,this.canvas.width,this.canvas.height),this.texture.needsUpdate=!0},i.setTile=function(t,e,i){this.tileMapContext.fillStyle=i,this.tileMapContext.fillRect(t,e,1,1),this.texture.needsUpdate=!0},t}();d.EMPTY="#000",d.LOADED="#fff";var m=function(){function t(i,n,o,a,s){var r=this;void 0===o&&(o=null),void 0===a&&(a=null),void 0===s&&(s=null),this.loadCloseTiles=function(){r.unloaded||r.loadNextTile()&&(r.loadTimeout&&clearTimeout(r.loadTimeout),r.currentlyLoading<4?r.loadTimeout=setTimeout(r.loadCloseTiles,0):r.loadTimeout=setTimeout(r.loadCloseTiles,1e3))},this.handleLoadedTile=function(e){r.tileMap.setTile(e.x-r.centerTile.x+t.tileMapHalfSize,e.z-r.centerTile.y+t.tileMapHalfSize,d.LOADED),r.scene.add(e.model),r.onTileLoad(e)},this.handleUnloadedTile=function(e){r.tileMap.setTile(e.x-r.centerTile.x+t.tileMapHalfSize,e.z-r.centerTile.y+t.tileMapHalfSize,d.EMPTY),r.scene.remove(e.model),r.onTileUnload(e)},Object.defineProperty(this,"isTileManager",{value:!0}),this.events=s,this.scene=i,this.tileLoader=n,this.onTileLoad=o||function(){},this.onTileUnload=a||function(){},this.viewDistanceX=1,this.viewDistanceZ=1,this.centerTile=new e.Vector2(0,0),this.currentlyLoading=0,this.loadTimeout=null,this.tiles={},this.tileMap=new d(t.tileMapSize,t.tileMapSize),this.unloaded=!0}var i=t.prototype;return i.loadAroundTile=function(e,i,n,o){if(this.unloaded=!1,this.viewDistanceX=n,this.viewDistanceZ=o,this.centerTile.x!==e||this.centerTile.y!==i){this.centerTile.set(e,i),this.removeFarTiles(),this.tileMap.setAll(d.EMPTY);for(var a=Object.keys(this.tiles),s=0;s<a.length;s++)if(this.tiles.hasOwnProperty(a[s])){var r=this.tiles[a[s]];r.loaded&&this.tileMap.setTile(r.x-this.centerTile.x+t.tileMapHalfSize,r.z-this.centerTile.y+t.tileMapHalfSize,d.LOADED)}}this.loadCloseTiles()},i.unload=function(){this.unloaded=!0,this.removeAllTiles()},i.removeFarTiles=function(){for(var t=Object.keys(this.tiles),e=0;e<t.length;e++)if(this.tiles.hasOwnProperty(t[e])){var i=this.tiles[t[e]];(i.x+this.viewDistanceX<this.centerTile.x||i.x-this.viewDistanceX>this.centerTile.x||i.z+this.viewDistanceZ<this.centerTile.y||i.z-this.viewDistanceZ>this.centerTile.y)&&(i.unload(),delete this.tiles[t[e]])}},i.removeAllTiles=function(){this.tileMap.setAll(d.EMPTY);for(var t=Object.keys(this.tiles),e=0;e<t.length;e++){if(this.tiles.hasOwnProperty(t[e]))this.tiles[t[e]].unload(),delete this.tiles[t[e]]}},i.loadNextTile=function(){if(!this.unloaded){for(var t=0,e=0,i=1,n=1;n<2*Math.max(this.viewDistanceX,this.viewDistanceZ)+1;){for(;2*t*i<n;){if(this.tryLoadTile(this.centerTile.x+t,this.centerTile.y+e))return!0;t+=i}for(;2*e*i<n;){if(this.tryLoadTile(this.centerTile.x+t,this.centerTile.y+e))return!0;e+=i}i*=-1,n+=1}return!1}},i.tryLoadTile=function(t,e){var i=this;if(!this.unloaded){if(Math.abs(t-this.centerTile.x)>this.viewDistanceX)return!1;if(Math.abs(e-this.centerTile.y)>this.viewDistanceZ)return!1;var n=l(t,e),o=this.tiles[n];return void 0===o&&(this.currentlyLoading++,o=new u(t,e,this.handleLoadedTile,this.handleUnloadedTile),this.tiles[n]=o,o.load(this.tileLoader).then((function(){i.loadTimeout&&clearTimeout(i.loadTimeout),i.loadTimeout=setTimeout(i.loadCloseTiles,0)})).catch((function(t){t.target&&404===t.target.status||c(i.events,"Failed to load tile: "+t,"warning")})).finally((function(){i.currentlyLoading--})),!0)}},t}();m.tileMapSize=100,m.tileMapHalfSize=m.tileMapSize/2;var p=function(t,i,n,o){var a=this;void 0===o&&(o=0),this.load=function(t,i){return new Promise((function(n,o){a.bufferGeometryLoader.load(a.tilePath+s(t,i)+".json",(function(o){var s=new e.Mesh(o,a.material);a.layer&&s.layers.set(a.layer);var r=a.tileSettings.tileSize,l=a.tileSettings.translate,h=a.tileSettings.scale;s.position.set(t*r.x+l.x,0,i*r.z+l.z),s.scale.set(h.x,1,h.z),n(s)}),(function(){}),o)}))},Object.defineProperty(this,"isTileLoader",{value:!0}),this.tilePath=t,this.material=i,this.tileSettings=n,this.layer=o,this.bufferGeometryLoader=new e.BufferGeometryLoader},f=function(){function t(t,i,n){var o=this;void 0===n&&(n=null),this.onTileLoad=function(t){return function(e){h(o.events,"bluemapMapTileLoaded",{tile:e,layer:t})}},this.onTileUnload=function(t){return function(e){h(o.events,"bluemapMapTileUnloaded",{tile:e,layer:t})}},Object.defineProperty(this,"isMap",{value:!0}),this.id=t,this.events=n,this.dataUrl=i,this.name=this.id,this.world="-",this.startPos={x:0,z:0},this.skyColor={r:0,g:0,b:0},this.ambientLight=0,this.hires={tileSize:{x:32,z:32},scale:{x:1,z:1},translate:{x:2,z:2}},this.lowres={tileSize:{x:32,z:32},scale:{x:1,z:1},translate:{x:2,z:2}},this.scene=new e.Scene,this.raycaster=new e.Raycaster,this.hiresMaterial=null,this.lowresMaterial=null,this.loadedTextures=[],this.hiresTileManager=null,this.lowresTileManager=null}var i=t.prototype;return i.load=function(t,e,i,n,a,s){var r=this;this.unload();var l=this.loadSettings(),h=this.loadTextures();this.lowresMaterial=this.createLowresMaterial(n,a,s);var u=l.then((function(t){r.name=t.name?t.name:r.name,r.world=t.world?t.world:r.world,r.startPos=o({},r.startPos,t.startPos),r.skyColor=o({},r.skyColor,t.skyColor),r.ambientLight=t.ambientLight?t.ambientLight:0,void 0===t.hires&&(t.hires={}),void 0===t.lowres&&(t.lowres={}),r.hires={tileSize:o({},r.hires.tileSize,t.hires.tileSize),scale:o({},r.hires.scale,t.hires.scale),translate:o({},r.hires.translate,t.hires.translate)},r.lowres={tileSize:o({},r.lowres.tileSize,t.lowres.tileSize),scale:o({},r.lowres.scale,t.lowres.scale),translate:o({},r.lowres.translate,t.lowres.translate)}}));return Promise.all([u,h]).then((function(n){var o=n[1];if(null===o)throw new Error("Failed to parse textures.json!");r.hiresMaterial=r.createHiresMaterial(t,e,i,o),r.hiresTileManager=new m(r.scene,new p(r.dataUrl+"hires/",r.hiresMaterial,r.hires,1),r.onTileLoad("hires"),r.onTileUnload("hires"),r.events),r.lowresTileManager=new m(r.scene,new p(r.dataUrl+"lowres/",r.lowresMaterial,r.lowres,2),r.onTileLoad("lowres"),r.onTileUnload("lowres"),r.events),c(r.events,"Loaded '"+r.id+"'.","fine")}))},i.loadMapArea=function(t,e,i,n){if(this.isLoaded){var o=Math.floor((t-this.hires.translate.x)/this.hires.tileSize.x),a=Math.floor((e-this.hires.translate.z)/this.hires.tileSize.z),s=Math.floor(i/this.hires.tileSize.x),r=Math.floor(i/this.hires.tileSize.z),l=Math.floor((t-this.lowres.translate.x)/this.lowres.tileSize.x),h=Math.floor((e-this.lowres.translate.z)/this.lowres.tileSize.z),c=Math.floor(n/this.lowres.tileSize.x),u=Math.floor(n/this.lowres.tileSize.z);this.hiresTileManager.loadAroundTile(o,a,s,r),this.lowresTileManager.loadAroundTile(l,h,c,u)}},i.loadSettings=function(){var t=this;return new Promise((function(i,n){c(t.events,"Loading settings for map '"+t.id+"'...","fine");var o=new e.FileLoader;o.setResponseType("json"),o.load(t.dataUrl+"../settings.json",(function(e){e.maps&&e.maps[t.id]?i(e.maps[t.id]):n("the settings.json does not contain informations for map: "+t.id)}),(function(){}),(function(){return n("Failed to load the settings.json for map: "+t.id)}))}))},i.loadTextures=function(){var t=this;return new Promise((function(i,n){c(t.events,"Loading textures for map '"+t.id+"'...","fine");var o=new e.FileLoader;o.setResponseType("json"),o.load(t.dataUrl+"../textures.json",i,(function(){}),(function(){return n("Failed to load the textures.json for map: "+t.id)}))}))},i.createHiresMaterial=function(t,i,n,s){var r=[];if(!Array.isArray(s.textures))throw new Error("Invalid texture.json: 'textures' is not an array!");for(var l=0;l<s.textures.length;l++){var h=s.textures[l],c=h.color;(!Array.isArray(c)||c.length<4)&&(c=[0,0,0,0]);var u=1===c[3],d=!!h.transparent,m=new e.Texture;m.image=a(h.texture),m.anisotropy=1,m.generateMipmaps=u||d,m.magFilter=e.NearestFilter,m.minFilter=m.generateMipmaps?e.NearestMipMapLinearFilter:e.NearestFilter,m.wrapS=e.ClampToEdgeWrapping,m.wrapT=e.ClampToEdgeWrapping,m.flipY=!1,m.flatShading=!0,m.needsUpdate=!0,this.loadedTextures.push(m);var p=new e.ShaderMaterial({uniforms:o({},n,{textureImage:{type:"t",value:m}}),vertexShader:t,fragmentShader:i,transparent:d,depthWrite:!0,depthTest:!0,vertexColors:e.VertexColors,side:e.FrontSide,wireframe:!1});p.needsUpdate=!0,r[l]=p}return r},i.createLowresMaterial=function(t,i,n){return new e.ShaderMaterial({uniforms:n,vertexShader:t,fragmentShader:i,transparent:!1,depthWrite:!0,depthTest:!0,vertexColors:e.VertexColors,side:e.FrontSide,wireframe:!1})},i.unload=function(){this.hiresTileManager&&this.hiresTileManager.unload(),this.hiresTileManager=null,this.lowresTileManager&&this.lowresTileManager.unload(),this.lowresTileManager=null,this.hiresMaterial&&this.hiresMaterial.forEach((function(t){return t.dispose()})),this.hiresMaterial=null,this.lowresMaterial&&this.lowresMaterial.dispose(),this.lowresMaterial=null,this.loadedTextures.forEach((function(t){return t.dispose()})),this.loadedTextures=[]},i.terrainHeightAt=function(t,i){if(!this.isLoaded)return!1;this.raycaster.set(new e.Vector3(t,300,i),new e.Vector3(0,-1,0)),this.raycaster.near=1,this.raycaster.far=300,this.raycaster.layers.enableAll();var n=l(Math.floor((t-this.hires.translate.x)/this.hires.tileSize.x),Math.floor((i-this.hires.translate.z)/this.hires.tileSize.z)),o=this.hiresTileManager.tiles[n];if(!o||!o.model){var a=l(Math.floor((t-this.lowres.translate.x)/this.lowres.tileSize.x),Math.floor((i-this.lowres.translate.z)/this.lowres.tileSize.z));o=this.lowresTileManager.tiles[a]}if(!o||!o.model)return!1;try{var s=this.raycaster.intersectObjects([o.model]);if(s.length>0)return s[0].point.y}catch(t){return!1}},i.dispose=function(){this.unload()},n(t,[{key:"isLoaded",get:function(){return!(!this.hiresMaterial||!this.lowresMaterial)}}]),t}(),v=function(t){var i,o;function a(){var i;i=t.call(this)||this,Object.defineProperty(function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(i),"isSkyboxScene",{value:!0}),i.UNIFORM_sunlight={value:1},i.UNIFORM_skyColor={value:new e.Vector3(.5,.5,1)},i.UNIFORM_ambientLight={value:0};var n=new e.SphereGeometry(1,40,5),o=new e.ShaderMaterial({uniforms:{sunlight:i.UNIFORM_sunlight,skyColor:i.UNIFORM_skyColor,ambientLight:i.UNIFORM_ambientLight},vertexShader:"\nvarying vec3 vPosition;\nvoid main() {\n\tvPosition = position;\n\t\n\tgl_Position = \n\t\tprojectionMatrix *\n\t\tmodelViewMatrix *\n\t\tvec4(position, 1);\n}\n",fragmentShader:"\nuniform float sunlight;\nuniform float ambientLight;\nuniform vec3 skyColor;\n\nvarying vec3 vPosition;\n\nvoid main() {\n\tfloat horizonWidth = 0.005;\n\tfloat horizonHeight = 0.0;\n\t\n\tvec4 color = vec4(skyColor * max(sunlight, ambientLight), 1.0);\n\tfloat voidMultiplier = (clamp(vPosition.y - horizonHeight, -horizonWidth, horizonWidth) + horizonWidth) / (horizonWidth * 2.0);\n\tcolor.rgb *= voidMultiplier;\n\n\tgl_FragColor = color;\n}\n",side:e.BackSide}),a=new e.Mesh(n,o);return i.add(a),i}return o=t,(i=a).prototype=Object.create(o.prototype),i.prototype.constructor=i,i.__proto__=o,n(a,[{key:"sunlight",get:function(){return this.UNIFORM_sunlight.value},set:function(t){this.UNIFORM_sunlight.value=t}},{key:"skyColor",get:function(){return this.UNIFORM_skyColor.value},set:function(t){this.UNIFORM_skyColor.value=t}},{key:"ambientLight",get:function(){return this.UNIFORM_ambientLight.value},set:function(t){this.UNIFORM_ambientLight.value=t}}]),a}(e.Scene),g=function(){function t(t,i){Object.defineProperty(this,"isControlsManager",{value:!0}),this.mapViewer=t,this.camera=i,this.positionValue=new e.Vector3(0,0,0),this.rotationValue=0,this.angleValue=0,this.distanceValue=500,this.orthoValue=0,this.valueChanged=!0,this.lastMapUpdatePosition=this.positionValue.clone(),this.controlsValue=null,this.updateCamera()}var i=t.prototype;return i.update=function(t,e){this.controlsValue&&"function"==typeof this.controlsValue.update&&this.controlsValue.update(t,e)},i.updateCamera=function(){if(this.valueChanged){var t=this.angleValue;Math.abs(t)<=1e-4&&(t=1e-4);var i=this.distanceValue;Math.abs(i)<=1e-4&&(i=-1e-4),this.orthoValue>0&&(i=e.MathUtils.lerp(i,Math.max(i,300),Math.pow(this.orthoValue,2)));var n=new e.Vector3(Math.sin(this.rotationValue),0,-Math.cos(this.rotationValue)),o=new e.Vector3(0,1,0).cross(n);if(n.applyAxisAngle(o,Math.PI/2-t),n.multiplyScalar(i),this.camera.position.copy(this.positionValue).sub(n),this.camera.lookAt(this.positionValue),this.mapViewer.uniforms&&(this.mapViewer.uniforms.orthoEffect.value.distance=this.distanceValue,this.mapViewer.uniforms.orthoEffect.value.amount=this.orthoValue),this.orthoValue<=0){var a=e.MathUtils.clamp(this.distanceValue/1e3,.01,1),s=e.MathUtils.clamp(2*this.distanceValue,Math.max(a+1,2e3),this.distanceValue+5e3);s-a>1e4&&(a=s-1e4),this.camera.near=a,this.camera.far=s}else this.camera.near=1,this.camera.far=i+300;h(this.mapViewer.events,"bluemapCameraMoved",{controlsManager:this,camera:this.camera})}if(this.mapViewer.map){var r=1;this.valueChanged&&(r=.8*this.mapViewer.loadedHiresViewDistance),(Math.abs(this.lastMapUpdatePosition.x-this.positionValue.x)>=r||Math.abs(this.lastMapUpdatePosition.z-this.positionValue.z)>=r)&&(this.lastMapUpdatePosition=this.positionValue.clone(),this.mapViewer.loadMapArea(this.positionValue.x,this.positionValue.z))}this.valueChanged=!1},i.handleValueChange=function(){this.valueChanged=!0},n(t,[{key:"x",get:function(){return this.positionValue.x},set:function(t){this.positionValue.x=t,this.handleValueChange()}},{key:"y",get:function(){return this.positionValue.y},set:function(t){this.positionValue.y=t,this.handleValueChange()}},{key:"z",get:function(){return this.positionValue.z},set:function(t){this.positionValue.z=t,this.handleValueChange()}},{key:"position",get:function(){return this.positionValue},set:function(t){this.position.copy(t),this.handleValueChange()}},{key:"rotation",get:function(){return this.rotationValue},set:function(t){this.rotationValue=t,this.handleValueChange()}},{key:"angle",get:function(){return this.angleValue},set:function(t){this.angleValue=t,this.handleValueChange()}},{key:"distance",get:function(){return this.distanceValue},set:function(t){this.distanceValue=t,this.handleValueChange()}},{key:"ortho",get:function(){return this.orthoValue},set:function(t){this.orthoValue=t,this.handleValueChange()}},{key:"controls",set:function(t){this.controlsValue&&"function"==typeof this.controlsValue.stop&&this.controlsValue.stop(),this.controlsValue=t,this.controlsValue&&"function"==typeof this.controlsValue.start&&this.controlsValue.start(this)},get:function(){return this.controlsValue}}]),t}(),T=function(){function t(i,n,o){var a=this;void 0===o&&(o=null),this.onKeyDown=function(e){var i=e.key||e.keyCode;for(var n in t.KEYS)t.KEYS.hasOwnProperty(n)&&t.KEYS[n].includes(i)&&(a.keyStates[n]=!0)},this.onKeyUp=function(e){var i=e.key||e.keyCode;for(var n in t.KEYS)t.KEYS.hasOwnProperty(n)&&t.KEYS[n].includes(i)&&(a.keyStates[n]=!1)},this.onWheel=function(t){a.targetDistance*=Math.pow(1.5,t.deltaY/100),a.targetDistance=e.MathUtils.clamp(a.targetDistance,a.minDistance,a.maxDistance),a.updateMaxAngleForZoom(),a.targetAngle=e.MathUtils.clamp(a.targetAngle,a.minAngle,a.maxAngleForZoom)},this.onMouseDown=function(e){a.state===t.STATES.NONE&&(t.BUTTONS.MOVE.includes(e.button)&&(a.state=t.STATES.MOVE,e.preventDefault()),t.BUTTONS.ORBIT.includes(e.button)&&(a.state=t.STATES.ORBIT,e.preventDefault()))},this.onMouseMove=function(e){a.mouse.set(e.clientX,e.clientY),a.state!==t.STATES.NONE&&e.preventDefault()},this.onMouseUp=function(e){a.state!==t.STATES.NONE&&(t.BUTTONS.MOVE.includes(e.button)&&(a.state===t.STATES.MOVE&&(a.state=t.STATES.NONE),e.preventDefault()),t.BUTTONS.ORBIT.includes(e.button)&&(a.state===t.STATES.ORBIT&&(a.state=t.STATES.NONE),e.preventDefault()))},this.onTouchDown=function(e){"mouse"!==e.pointerType&&(a.touchStart.set(a.targetPosition.x,a.targetPosition.z),a.state=t.STATES.MOVE)},this.onTouchMove=function(i){if("mouse"!==i.pointerType&&a.state===t.STATES.MOVE){var n=new e.Vector2(i.deltaX,i.deltaY);0===n.x&&0===n.y||(n.rotateAround(t.VECTOR2_ZERO,a.controls.rotation),a.targetPosition.x=a.touchStart.x-n.x*a.targetDistance/a.rootElement.clientHeight*1.5,a.targetPosition.z=a.touchStart.y-n.y*a.targetDistance/a.rootElement.clientHeight*1.5)}},this.onTouchUp=function(e){"mouse"!==e.pointerType&&(a.state=t.STATES.NONE)},this.onTouchTiltDown=function(){a.touchTiltStart=a.targetAngle,a.state=t.STATES.ORBIT},this.onTouchTiltMove=function(i){a.state===t.STATES.ORBIT&&(a.targetAngle=a.touchTiltStart-i.deltaY/a.rootElement.clientHeight*Math.PI,a.targetAngle=e.MathUtils.clamp(a.targetAngle,a.minAngle,a.maxAngleForZoom))},this.onTouchTiltUp=function(){a.state=t.STATES.NONE},this.onTouchRotateDown=function(e){a.lastTouchRotation=e.rotation,a.state=t.STATES.ORBIT},this.onTouchRotateMove=function(e){if(a.state===t.STATES.ORBIT){var i=e.rotation-a.lastTouchRotation;a.lastTouchRotation=e.rotation,i>180&&(i-=360),i<-180&&(i+=360),a.targetRotation+=i*(Math.PI/180)*1.4,a.wrapRotation()}},this.onTouchRotateUp=function(){a.state=t.STATES.NONE},this.onTouchZoomDown=function(){a.touchZoomStart=a.targetDistance},this.onTouchZoomMove=function(t){a.targetDistance=a.touchZoomStart/t.scale,a.targetDistance=e.MathUtils.clamp(a.targetDistance,a.minDistance,a.maxDistance)},this.onContextMenu=function(t){t.preventDefault()},Object.defineProperty(this,"isMapControls",{value:!0}),this.rootElement=i,this.hammer=n,this.events=o,this.controls=null,this.targetPosition=new e.Vector3,this.positionTerrainHeight=!1,this.targetDistance=400,this.minDistance=10,this.maxDistance=1e4,this.targetRotation=0,this.targetAngle=0,this.minAngle=0,this.maxAngle=Math.PI/2,this.maxAngleForZoom=this.maxAngle,this.state=t.STATES.NONE,this.mouse=new e.Vector2,this.lastMouse=new e.Vector2,this.keyStates={},this.touchStart=new e.Vector2,this.touchTiltStart=0,this.lastTouchRotation=0,this.touchZoomStart=0}var i=t.prototype;return i.start=function(t){this.controls=t,this.targetPosition.copy(this.controls.position),this.positionTerrainHeight=!1,this.targetDistance=this.controls.distance,this.targetDistance=e.MathUtils.clamp(this.targetDistance,this.minDistance,this.maxDistance),this.targetRotation=this.controls.rotation,this.targetAngle=this.controls.angle,this.rootElement.addEventListener("wheel",this.onWheel,{passive:!0}),this.hammer.on("zoomstart",this.onTouchZoomDown),this.hammer.on("zoommove",this.onTouchZoomMove),this.rootElement.addEventListener("mousedown",this.onMouseDown),window.addEventListener("mousemove",this.onMouseMove),window.addEventListener("mouseup",this.onMouseUp),window.addEventListener("keydown",this.onKeyDown),window.addEventListener("keyup",this.onKeyUp),this.hammer.on("movestart",this.onTouchDown),this.hammer.on("movemove",this.onTouchMove),this.hammer.on("moveend",this.onTouchUp),this.hammer.on("movecancel",this.onTouchUp),this.hammer.on("tiltstart",this.onTouchTiltDown),this.hammer.on("tiltmove",this.onTouchTiltMove),this.hammer.on("tiltend",this.onTouchTiltUp),this.hammer.on("tiltcancel",this.onTouchTiltUp),this.hammer.on("rotatestart",this.onTouchRotateDown),this.hammer.on("rotatemove",this.onTouchRotateMove),this.hammer.on("rotateend",this.onTouchRotateUp),this.hammer.on("rotatecancel",this.onTouchRotateUp),window.addEventListener("contextmenu",this.onContextMenu)},i.stop=function(){this.rootElement.removeEventListener("wheel",this.onWheel),this.hammer.off("zoomstart",this.onTouchZoomDown),this.hammer.off("zoommove",this.onTouchZoomMove),this.rootElement.addEventListener("mousedown",this.onMouseDown),window.removeEventListener("mousemove",this.onMouseMove),window.removeEventListener("mouseup",this.onMouseUp),window.removeEventListener("keydown",this.onKeyDown),window.removeEventListener("keyup",this.onKeyUp),this.hammer.on("movestart",this.onTouchDown),this.hammer.off("movemove",this.onTouchMove),this.hammer.off("moveend",this.onTouchUp),this.hammer.off("movecancel",this.onTouchUp),this.hammer.off("tiltstart",this.onTouchTiltDown),this.hammer.off("tiltmove",this.onTouchTiltMove),this.hammer.off("tiltend",this.onTouchTiltUp),this.hammer.off("tiltcancel",this.onTouchTiltUp),this.hammer.off("rotatestart",this.onTouchRotateDown),this.hammer.off("rotatemove",this.onTouchRotateMove),this.hammer.off("rotateend",this.onTouchRotateUp),this.hammer.off("rotatecancel",this.onTouchRotateUp),window.removeEventListener("contextmenu",this.onContextMenu)},i.update=function(i,n){var o=this.lastMouse.clone().sub(this.mouse),a=new e.Vector2;this.state===t.STATES.MOVE?a.copy(o):(this.keyStates.UP&&(a.y-=20),this.keyStates.DOWN&&(a.y+=20),this.keyStates.LEFT&&(a.x-=20),this.keyStates.RIGHT&&(a.x+=20)),0!==a.x||0!==a.y?(a.rotateAround(t.VECTOR2_ZERO,this.controls.rotation),this.targetPosition.set(this.targetPosition.x+a.x*this.targetDistance/this.rootElement.clientHeight*1.5,this.targetPosition.y,this.targetPosition.z+a.y*this.targetDistance/this.rootElement.clientHeight*1.5),this.updatePositionTerrainHeight(n)):this.positionTerrainHeight||this.updatePositionTerrainHeight(n),this.state===t.STATES.ORBIT&&(0!==o.x&&(this.targetRotation-=o.x/this.rootElement.clientHeight*Math.PI,this.wrapRotation()),0!==o.y&&(this.targetAngle+=o.y/this.rootElement.clientHeight*Math.PI,this.targetAngle=e.MathUtils.clamp(this.targetAngle,this.minAngle,this.maxAngleForZoom)));var s=!1,r=this.targetPosition.clone().sub(this.controls.position);(Math.abs(r.x)>.01||Math.abs(r.y)>.001||Math.abs(r.z)>.01)&&(this.controls.position=this.controls.position.add(r.multiplyScalar(.015*i)),s=!0);var l=this.targetRotation-this.controls.rotation;Math.abs(l)>1e-4&&(this.controls.rotation+=.015*l*i,s=!0);var h=this.targetAngle-this.controls.angle;Math.abs(h)>1e-4&&(this.controls.angle+=.015*h*i,s=!0);var u=this.targetDistance-this.controls.distance;if(Math.abs(u)>.001&&(this.controls.distance+=.01*u*i,s=!0),s){var d=0;if(!1!==this.positionTerrainHeight){d=this.targetPosition.y;var m=this.positionTerrainHeight-d;Math.abs(m)>.001&&(d+=.01*m*i)}var p=n.terrainHeightAt(this.controls.camera.position.x,this.controls.camera.position.z)+(this.minDistance-this.targetDistance)/2+1;p>d&&(d=p),this.targetPosition.y=d}isNaN(this.targetPosition.x)&&(c(this.events,"Invalid targetPosition x: "+this.targetPosition.x,"warning"),this.targetPosition.x=0),isNaN(this.targetPosition.y)&&(c(this.events,"Invalid targetPosition y: "+this.targetPosition.y,"warning"),this.targetPosition.y=0),isNaN(this.targetPosition.z)&&(c(this.events,"Invalid targetPosition z: "+this.targetPosition.z,"warning"),this.targetPosition.z=0),isNaN(this.targetDistance)&&(c(this.events,"Invalid targetDistance: "+this.targetDistance,"warning"),this.targetDistance=this.minDistance),isNaN(this.targetRotation)&&(c(this.events,"Invalid targetRotation: "+this.targetRotation,"warning"),this.targetRotation=0),isNaN(this.targetAngle)&&(c(this.events,"Invalid targetAngle: "+this.targetAngle,"warning"),this.targetAngle=this.minAngle),this.lastMouse.copy(this.mouse)},i.updateMaxAngleForZoom=function(){this.maxAngleForZoom=e.MathUtils.clamp((1-Math.pow((this.targetDistance-this.minDistance)/(500-this.minDistance),.5))*this.maxAngle,this.minAngle,this.maxAngle)},i.updatePositionTerrainHeight=function(t){this.positionTerrainHeight=t.terrainHeightAt(this.targetPosition.x,this.targetPosition.z)},i.wrapRotation=function(){for(;this.targetRotation>=Math.PI;)this.targetRotation-=2*Math.PI,this.controls.rotation-=2*Math.PI;for(;this.targetRotation<=-Math.PI;)this.targetRotation+=2*Math.PI,this.controls.rotation+=2*Math.PI},t}();T.STATES={NONE:0,MOVE:1,ORBIT:2},T.KEYS={LEFT:["ArrowLeft","a",37,65],UP:["ArrowUp","w",38,87],RIGHT:["ArrowRight","d",39,68],DOWN:["ArrowDown","s",40,83]},T.BUTTONS={ORBIT:[e.MOUSE.RIGHT],MOVE:[e.MOUSE.LEFT]},T.VECTOR2_ZERO=new e.Vector2(0,0);var w=function t(){var e=0,i=document.createElement("div");function n(t){return i.appendChild(t.dom),t}function o(t){for(var n=0;n<i.children.length;n++)i.children[n].style.display=n===t?"block":"none";e=t}i.style.cssText="position:fixed;bottom:0;right:0;cursor:pointer;opacity:0.9;z-index:10000",i.addEventListener("click",(function(t){t.preventDefault(),o(++e%i.children.length)}),!1);var a=(performance||Date).now(),s=a,r=0,l=a,h=n(new t.Panel("FPS","#0ff","#002")),c=n(new t.Panel("MS (render)","#0f0","#020")),u=n(new t.Panel("MS (all)","#f80","#210")),d=null;return self.performance&&self.performance.memory&&(d=n(new t.Panel("MB","#f08","#201"))),o(0),{REVISION:16,dom:i,addPanel:n,showPanel:o,hide:function(){o(-1)},begin:function(){a=(performance||Date).now()},end:function(){r++;var t=(performance||Date).now();if(c.update(t-a,200),u.update(t-l,200),t>=s+1e3&&(h.update(1e3*r/(t-s),100),s=t,r=0,d)){var e=performance.memory;d.update(e.usedJSHeapSize/1048576,e.jsHeapSizeLimit/1048576)}return t},update:function(){a=this.end(),l=a},domElement:i,setMode:o}};w.Panel=function(t,e,i){var n=1/0,o=0,a=Math.round,s=a(window.devicePixelRatio||1),r=160*s,l=96*s,h=3*s,c=3*s,u=3*s,d=15*s,m=154*s,p=77*s,f=document.createElement("canvas");f.width=r,f.height=l,f.style.cssText="width:160px;height:96px";var v=f.getContext("2d");return v.font="bold "+9*s+"px Helvetica,Arial,sans-serif",v.textBaseline="top",v.fillStyle=i,v.fillRect(0,0,r,l),v.fillStyle=e,v.fillText(t,h,c),v.fillRect(u,d,m,p),v.fillStyle=i,v.globalAlpha=.9,v.fillRect(u,d,m,p),{dom:f,update:function(l,g){n=Math.min(n,l),o=Math.max(o,l),v.fillStyle=i,v.globalAlpha=1,v.fillRect(0,0,r,d),v.fillStyle=e,v.fillText(a(l)+" "+t+" ("+a(n)+"-"+a(o)+")",h,c),v.drawImage(f,u+s,d,m-s,p,u,d,m-s,p),v.fillRect(u+m-s,d,s,p),v.fillStyle=i,v.globalAlpha=.9,v.fillRect(u+m-s,d,s,a((1-l/g)*p))}}};var M="\n#include <common>\n"+e.ShaderChunk.logdepthbuf_pars_vertex+"\n\nstruct OrthoEffect {\n\tfloat amount;\n\tfloat distance;\n};\n\nattribute float ao;\nattribute float sunlight;\nattribute float blocklight;\n\nuniform OrthoEffect orthoEffect;\n\nvarying vec3 vPosition;\nvarying vec3 vWorldPosition;\nvarying vec3 vNormal;\nvarying vec2 vUv;\nvarying vec3 vColor;\nvarying float vAo;\nvarying float vSunlight;\nvarying float vBlocklight;\n\nvoid main() {\n\tvPosition = position;\n\tvWorldPosition = (modelMatrix * vec4(position, 1)).xyz;\n\tvNormal = normal;\n\tvUv = uv;\n\tvColor = color;\n\tvAo = ao;\n\tvSunlight = sunlight;\n\tvBlocklight = blocklight;\n\t\n\tvec4 view = \n\t\tviewMatrix *\n\t\tmodelMatrix *\n\t\tvec4(position, 1);\n\t\n\t//make view orthographic\n\tif (orthoEffect.amount > 0.0) {\n\t\tview.xy = mix(view.xy, view.xy * -(view.z / orthoEffect.distance), orthoEffect.amount);\n\t}\n\t\n\tgl_Position = \n\t\tprojectionMatrix *\n\t\tview;\n\t\n\t"+e.ShaderChunk.logdepthbuf_vertex+" \n}\n",y="\n"+e.ShaderChunk.logdepthbuf_pars_fragment+"\n\nuniform sampler2D textureImage;\nuniform float sunlightStrength;\nuniform float ambientLight;\n\nvarying vec3 vPosition;\nvarying vec3 vWorldPosition;\nvarying vec3 vNormal;\nvarying vec2 vUv;\nvarying vec3 vColor;\nvarying float vAo;\nvarying float vSunlight;\nvarying float vBlocklight;\n\nvoid main() {\n\tvec4 color = texture(textureImage, vUv);\n\tif (color.a == 0.0) discard;\n\t\n\t//apply vertex-color\n\tcolor.rgb *= vColor.rgb;\n\n\t//apply ao\n\tcolor.rgb *= vAo;\n\t\n\t//apply light\n\tfloat light = mix(vBlocklight, max(vSunlight, vBlocklight), sunlightStrength);\n\tcolor.rgb *= mix(ambientLight, 1.0, light / 15.0);\n\t\n\tgl_FragColor = color;\n\t\n\t"+e.ShaderChunk.logdepthbuf_fragment+"\n}\n",x="\n#include <common>\n"+e.ShaderChunk.logdepthbuf_pars_vertex+"\n\nstruct OrthoEffect {\n\tfloat amount;\n\tfloat distance;\n};\n\nuniform OrthoEffect orthoEffect;\n\nvarying vec3 vPosition;\nvarying vec3 vWorldPosition;\nvarying vec3 vNormal;\nvarying vec2 vUv;\nvarying vec3 vColor;\n\nvoid main() {\n\tvPosition = position;\n\tvWorldPosition = (modelMatrix * vec4(position, 1)).xyz;\n\tvNormal = normal;\n\tvUv = uv;\n\tvColor = color;\n\t\n\tvec4 view = \n\t\tviewMatrix *\n\t\tmodelMatrix *\n\t\tvec4(position, 1);\n\t\n\t//make view orthographic\n\tif (orthoEffect.amount > 0.0) {\n\t\tview.xy = mix(view.xy, view.xy * -(view.z / orthoEffect.distance), orthoEffect.amount);\n\t}\n\t\n\tgl_Position = \n\t\tprojectionMatrix *\n\t\tview;\n\t\t\n\t"+e.ShaderChunk.logdepthbuf_vertex+"\n}\n",S="\n"+e.ShaderChunk.logdepthbuf_pars_fragment+"\n\nstruct TileMap {\n\tsampler2D map;\n\tfloat size;\n\tvec2 scale;\n\tvec2 translate;\n\tvec2 pos; \n};\n\nuniform float sunlightStrength;\nuniform float ambientLight;\nuniform TileMap hiresTileMap;\n\nvarying vec3 vPosition;\nvarying vec3 vWorldPosition;\nvarying vec3 vNormal;\nvarying vec2 vUv;\nvarying vec3 vColor;\n\nvoid main() {\n\tfloat depth = gl_FragCoord.z / gl_FragCoord.w;\n\n\t//discard if hires tile is loaded at that position\n\tif (depth < 1900.0 && texture(hiresTileMap.map, ((vWorldPosition.xz - hiresTileMap.translate) / hiresTileMap.scale - hiresTileMap.pos) / hiresTileMap.size + 0.5).r == 1.0) discard;\n\t\n\tvec4 color = vec4(vColor, 1.0);\n\n\tfloat diff = sqrt(max(dot(vNormal, vec3(0.3637, 0.7274, 0.5819)), 0.0)) * 0.4 + 0.6;\n\tcolor *= diff;\n\n\tcolor *= mix(sunlightStrength, 1.0, ambientLight);\n\n\tgl_FragColor = color;\n\t\n\t"+e.ShaderChunk.logdepthbuf_fragment+"\n}\n",E=function(){function t(t,i,n,o){var a=this;void 0===i&&(i="data/"),void 0===n&&(n="live/"),void 0===o&&(o=t),this.handleContainerResize=function(){a.renderer.setSize(a.rootElement.clientWidth,a.rootElement.clientHeight),a.renderer.setPixelRatio(window.devicePixelRatio*a.superSamplingValue),a.camera.aspect=a.rootElement.clientWidth/a.rootElement.clientHeight,a.camera.updateProjectionMatrix()},this.updateLoadedMapArea=function(){a.map&&a.map.loadMapArea(a.loadedCenter.x,a.loadedCenter.y,a.loadedHiresViewDistance,a.loadedLowresViewDistance)},this.renderLoop=function(t){requestAnimationFrame(a.renderLoop),a.lastFrame<=0&&(a.lastFrame=t);var e=t-a.lastFrame;a.lastFrame=t,e>100&&(e=100),a.stats.begin(),null!=a.map&&(a.controlsManager.update(e,a.map),a.controlsManager.updateCamera()),a.render(e),a.stats.update()},Object.defineProperty(this,"isMapViewer",{value:!0}),this.rootElement=t,this.events=o,this.dataUrl=i,this.liveApiUrl=n,this.stats=new w,this.superSamplingValue=1,this.loadedCenter=new e.Vector2(0,0),this.loadedHiresViewDistance=200,this.loadedLowresViewDistance=2e3,this.renderer=new e.WebGLRenderer({antialias:!0,sortObjects:!0,preserveDrawingBuffer:!0,logarithmicDepthBuffer:!0}),this.renderer.autoClear=!1,this.skyboxScene=new v,this.camera=new e.PerspectiveCamera(75,1,.1,1e4),this.skyboxCamera=this.camera.clone(),this.hammer=new Hammer.Manager(this.rootElement),this.initializeHammer(),this.controlsManager=new g(this,this.camera),this.controlsManager.controls=new T(this.renderer.domElement,this.hammer,this.events),this.map=null,this.lastFrame=0,this.uniforms={sunlightStrength:{value:1},ambientLight:{value:0},hiresTileMap:{value:{map:null,size:m.tileMapSize,scale:new e.Vector2(1,1),translate:new e.Vector2,pos:new e.Vector2}},orthoEffect:{value:{amount:0,distance:100}}},this.initializeRootElement(),window.addEventListener("resize",this.handleContainerResize),requestAnimationFrame(this.renderLoop)}var i=t.prototype;return i.initializeRootElement=function(){this.rootElement.innerHTML="",this.rootElement.appendChild(this.renderer.domElement),this.rootElement.appendChild(this.stats.dom),this.handleContainerResize()},i.initializeHammer=function(){var t=new Hammer.Tap({event:"tap",pointers:1,taps:1,threshold:2}),e=new Hammer.Pan({event:"move",direction:Hammer.DIRECTION_ALL,threshold:0}),i=new Hammer.Pan({event:"tilt",direction:Hammer.DIRECTION_VERTICAL,pointers:2,threshold:0}),n=new Hammer.Rotate({event:"rotate",pointers:2,threshold:10}),o=new Hammer.Pinch({event:"zoom",pointers:2,threshold:0});i.recognizeWith(n),i.recognizeWith(o),n.recognizeWith(o),this.hammer.add(t),this.hammer.add(e),this.hammer.add(i),this.hammer.add(n),this.hammer.add(o)},i.render=function(t){h(this.events,"bluemapRenderFrame",{delta:t}),this.camera.updateProjectionMatrix(),this.skyboxCamera.rotation.copy(this.camera.rotation),this.skyboxCamera.updateProjectionMatrix(),this.renderer.clear(),this.renderer.render(this.skyboxScene,this.skyboxCamera),this.renderer.clearDepth(),this.map&&this.map.isLoaded&&(this.uniforms.hiresTileMap.value.pos.copy(this.map.hiresTileManager.centerTile),this.camera.layers.set(2),this.renderer.render(this.map.scene,this.camera),this.renderer.clearDepth(),this.camera.layers.set(0),this.controlsManager.distance<2e3&&this.camera.layers.enable(1),this.renderer.render(this.map.scene,this.camera))},i.setMap=function(t){var e=this;return void 0===t&&(t=null),this.map&&this.map.unload(),this.map=t,this.map?t.load(M,y,this.uniforms,x,S,this.uniforms).then((function(){e.skyboxScene.ambientLight=t.ambientLight,e.skyboxScene.skyColor=t.skyColor,e.uniforms.ambientLight.value=t.ambientLight,e.uniforms.hiresTileMap.value.map=t.hiresTileManager.tileMap.texture,e.uniforms.hiresTileMap.value.scale.set(t.hires.tileSize.x,t.hires.tileSize.z),e.uniforms.hiresTileMap.value.translate.set(t.hires.translate.x,t.hires.translate.z),setTimeout(e.updateLoadedMapArea),h(e.events,"bluemapMapChanged",{map:t})})).catch((function(t){c(e.events,t,"error")})):Promise.resolve()},i.loadMapArea=function(t,e,i,n){void 0===i&&(i=-1),void 0===n&&(n=-1),this.loadedCenter.set(t,e),i>=0&&(this.loadedHiresViewDistance=i),n>=0&&(this.loadedLowresViewDistance=n),this.updateLoadedMapArea()},i.applySettings=function(t){if(this.maps.forEach((function(t){return t.dispose()})),this.maps=[],void 0!==t.maps)for(var e in t.maps){if(t.maps.hasOwnProperty(e))t.maps[e].enabled&&this.maps.push(new f(e,this.dataUrl+e+"/",this.rootElement))}this.maps.sort((function(e,i){var n=t.maps[e.id].ordinal-t.maps[i.id].ordinal;return isNaN(n)?0:n}))},n(t,[{key:"superSampling",get:function(){return this.superSamplingValue},set:function(t){this.superSamplingValue=t,this.handleContainerResize()}}]),t}();t.MapViewer=E,t.alert=c,t.dispatchEvent=h,t.hashTile=l,t.loadMaps=function(t,i){return void 0===i&&(i=null),new Promise((function(i,n){var o=new e.FileLoader;o.setResponseType("json"),o.load(t+"settings.json",i,(function(){}),(function(){return n("Failed to load the settings.json!")}))})).then((function(e){var n=[];if(console.log(e),void 0!==e.maps)for(var o in e.maps){if(e.maps.hasOwnProperty(o))e.maps[o].enabled&&n.push(new f(o,t+o+"/",i))}return n.sort((function(t,i){var n=e.maps[t.id].ordinal-e.maps[i.id].ordinal;return isNaN(n)?0:n})),n}))},t.pathFromCoords=s,t.stringToImage=a,Object.defineProperty(t,"__esModule",{value:!0})}));