{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/components/Menu/TextInput.vue?c504","webpack:///./src/components/Menu/MarkerItem.vue?7540","webpack:///./src/components/ControlBar/ControlsSwitch.vue?e247","webpack:///./src/components/ControlBar/SvgButton.vue?c3a8","webpack:///./src/components/ControlBar/MenuButton.vue?7380","webpack:///./src/components/ControlBar/NumberInput.vue?6553","webpack:///./src/components/ControlBar/DayNightSwitch.vue?4902","webpack:///./src/components/Menu/MapButton.vue?7706","webpack:///./src/components/Controls/FreeFlightMobileControls.vue?4b1f","webpack:///./src/components/ControlBar/Compass.vue?c968","webpack:///./src/components/Menu/SideMenu.vue?d295","webpack:///src/components/ControlBar/Compass.vue","webpack:///src/components/ControlBar/DayNightSwitch.vue","webpack:///./src/App.vue?3809","webpack:///./src/components/ControlBar/ControlBar.vue?71fc","webpack:///./src/components/ControlBar/PositionInput.vue?ef91","webpack:///./src/components/ControlBar/NumberInput.vue?0365","webpack:///src/components/ControlBar/NumberInput.vue","webpack:///./src/components/ControlBar/NumberInput.vue?6840","webpack:///./src/components/ControlBar/NumberInput.vue?ca83","webpack:///src/components/ControlBar/PositionInput.vue","webpack:///./src/components/ControlBar/PositionInput.vue?0771","webpack:///./src/components/ControlBar/PositionInput.vue?a802","webpack:///./src/components/ControlBar/Compass.vue?ce4a","webpack:///./BlueMapWeb/src/util/Utils.js","webpack:///./src/components/ControlBar/SvgButton.vue?7515","webpack:///src/components/ControlBar/SvgButton.vue","webpack:///./src/components/ControlBar/SvgButton.vue?ad68","webpack:///./src/components/ControlBar/SvgButton.vue?446c","webpack:///./src/components/ControlBar/Compass.vue?f42a","webpack:///./src/components/ControlBar/Compass.vue?c753","webpack:///./src/components/ControlBar/DayNightSwitch.vue?7821","webpack:///./src/components/ControlBar/DayNightSwitch.vue?29aa","webpack:///./src/components/ControlBar/DayNightSwitch.vue?d8ca","webpack:///./src/components/ControlBar/ControlsSwitch.vue?b5b3","webpack:///src/components/ControlBar/ControlsSwitch.vue","webpack:///./src/components/ControlBar/ControlsSwitch.vue?96e3","webpack:///./src/components/ControlBar/ControlsSwitch.vue?f8d9","webpack:///./src/components/ControlBar/MenuButton.vue?adbe","webpack:///src/components/ControlBar/MenuButton.vue","webpack:///./src/components/ControlBar/MenuButton.vue?a402","webpack:///./src/components/ControlBar/MenuButton.vue?efd7","webpack:///src/components/ControlBar/ControlBar.vue","webpack:///./src/components/ControlBar/ControlBar.vue?441a","webpack:///./src/components/ControlBar/ControlBar.vue?19ef","webpack:///./src/components/Menu/MainMenu.vue?3e3d","webpack:///./src/components/Menu/SideMenu.vue?b9fc","webpack:///src/components/Menu/SideMenu.vue","webpack:///./src/components/Menu/SideMenu.vue?7e03","webpack:///./src/components/Menu/SideMenu.vue?0b06","webpack:///./src/components/Menu/SimpleButton.vue?1f61","webpack:///src/components/Menu/SimpleButton.vue","webpack:///./src/components/Menu/SimpleButton.vue?1e98","webpack:///./src/components/Menu/SimpleButton.vue?c5cd","webpack:///./src/components/Menu/SettingsMenu.vue?a500","webpack:///./src/components/Menu/Group.vue?85b8","webpack:///src/components/Menu/Group.vue","webpack:///./src/components/Menu/Group.vue?f1cd","webpack:///./src/components/Menu/Group.vue?422b","webpack:///./src/components/Menu/Slider.vue?7a83","webpack:///src/components/Menu/Slider.vue","webpack:///./src/components/Menu/Slider.vue?f28a","webpack:///./src/components/Menu/Slider.vue?56fd","webpack:///./src/components/Menu/SwitchButton.vue?4771","webpack:///./src/components/Menu/SwitchHandle.vue?f972","webpack:///src/components/Menu/SwitchHandle.vue","webpack:///./src/components/Menu/SwitchHandle.vue?9339","webpack:///./src/components/Menu/SwitchHandle.vue?86f3","webpack:///src/components/Menu/SwitchButton.vue","webpack:///./src/components/Menu/SwitchButton.vue?a6d7","webpack:///./src/components/Menu/SwitchButton.vue?232e","webpack:///./src/i18n/fallback.js","webpack:///./src/i18n/index.js","webpack:///src/components/Menu/SettingsMenu.vue","webpack:///./src/components/Menu/SettingsMenu.vue?e413","webpack:///./src/components/Menu/SettingsMenu.vue","webpack:///./src/js/MainMenu.js","webpack:///./src/components/Menu/MarkerSetMenu.vue?db17","webpack:///./src/components/Menu/MarkerItem.vue?e52c","webpack:///src/components/Menu/MarkerItem.vue","webpack:///./src/components/Menu/MarkerItem.vue?e3b2","webpack:///./src/components/Menu/MarkerItem.vue?ef38","webpack:///./src/components/Menu/TextInput.vue?e16d","webpack:///src/components/Menu/TextInput.vue","webpack:///./src/components/Menu/TextInput.vue?951e","webpack:///./src/components/Menu/TextInput.vue?f431","webpack:///./src/components/Menu/MarkerSet.vue?2492","webpack:///src/components/Menu/MarkerSet.vue","webpack:///./src/components/Menu/MarkerSet.vue?a0ed","webpack:///./src/components/Menu/MarkerSet.vue?daef","webpack:///src/components/Menu/MarkerSetMenu.vue","webpack:///./src/components/Menu/MarkerSetMenu.vue?8c7b","webpack:///./src/components/Menu/MarkerSetMenu.vue","webpack:///./src/components/Menu/MapButton.vue?04aa","webpack:///src/components/Menu/MapButton.vue","webpack:///./src/components/Menu/MapButton.vue?a414","webpack:///./src/components/Menu/MapButton.vue?31c6","webpack:///src/components/Menu/MainMenu.vue","webpack:///./src/components/Menu/MainMenu.vue?aa64","webpack:///./src/components/Menu/MainMenu.vue?6ef8","webpack:///./src/components/Controls/FreeFlightMobileControls.vue?d6e5","webpack:///src/components/Controls/FreeFlightMobileControls.vue","webpack:///./src/components/Controls/FreeFlightMobileControls.vue?e14c","webpack:///./src/components/Controls/FreeFlightMobileControls.vue?d47c","webpack:///src/App.vue","webpack:///./src/App.vue?1160","webpack:///./src/App.vue?bff9","webpack:///./BlueMapWeb/src/map/Tile.js","webpack:///./BlueMapWeb/src/map/TileMap.js","webpack:///./BlueMapWeb/src/map/TileManager.js","webpack:///./BlueMapWeb/src/map/TileLoader.js","webpack:///./BlueMapWeb/src/markers/MarkerSet.js","webpack:///./BlueMapWeb/src/util/lines/LineMaterial.js","webpack:///./BlueMapWeb/src/markers/MarkerFillVertexShader.js","webpack:///./BlueMapWeb/src/markers/MarkerFillFragmentShader.js","webpack:///./BlueMapWeb/src/util/lines/LineSegmentsGeometry.js","webpack:///./BlueMapWeb/src/util/lines/LineGeometry.js","webpack:///./BlueMapWeb/src/util/lines/LineSegments2.js","webpack:///./BlueMapWeb/src/util/lines/Line2.js","webpack:///./BlueMapWeb/src/markers/Marker.js","webpack:///./BlueMapWeb/src/util/CSS2DRenderer.js","webpack:///./BlueMapWeb/src/markers/ObjectMarker.js","webpack:///./BlueMapWeb/src/markers/ShapeMarker.js","webpack:///./BlueMapWeb/src/markers/ExtrudeMarker.js","webpack:///./BlueMapWeb/src/markers/LineMarker.js","webpack:///./BlueMapWeb/src/markers/HtmlMarker.js","webpack:///./BlueMapWeb/src/markers/PoiMarker.js","webpack:///./BlueMapWeb/src/markers/MarkerManager.js","webpack:///./BlueMapWeb/src/markers/MarkerFileManager.js","webpack:///./BlueMapWeb/src/markers/PlayerMarker.js","webpack:///./BlueMapWeb/src/markers/PlayerMarkerManager.js","webpack:///./BlueMapWeb/src/map/Map.js","webpack:///./BlueMapWeb/src/skybox/SkyFragmentShader.js","webpack:///./BlueMapWeb/src/skybox/SkyVertexShader.js","webpack:///./BlueMapWeb/src/skybox/SkyboxScene.js","webpack:///./BlueMapWeb/src/controls/ControlsManager.js","webpack:///./BlueMapWeb/src/util/Stats.js","webpack:///./BlueMapWeb/src/map/hires/HiresVertexShader.js","webpack:///./BlueMapWeb/src/map/hires/HiresFragmentShader.js","webpack:///./BlueMapWeb/src/map/lowres/LowresVertexShader.js","webpack:///./BlueMapWeb/src/map/lowres/LowresFragmentShader.js","webpack:///./BlueMapWeb/src/util/CombinedCamera.js","webpack:///./BlueMapWeb/src/MapViewer.js","webpack:///./BlueMapWeb/src/controls/map/mouse/MouseMoveControls.js","webpack:///./BlueMapWeb/src/controls/map/mouse/MouseZoomControls.js","webpack:///./BlueMapWeb/src/controls/map/mouse/MouseRotateControls.js","webpack:///./BlueMapWeb/src/controls/map/mouse/MouseAngleControls.js","webpack:///./BlueMapWeb/src/controls/map/MapHeightControls.js","webpack:///./BlueMapWeb/src/controls/KeyCombination.js","webpack:///./BlueMapWeb/src/controls/map/keyboard/KeyMoveControls.js","webpack:///./BlueMapWeb/src/controls/map/keyboard/KeyAngleControls.js","webpack:///./BlueMapWeb/src/controls/map/keyboard/KeyRotateControls.js","webpack:///./BlueMapWeb/src/controls/map/keyboard/KeyZoomControls.js","webpack:///./BlueMapWeb/src/controls/map/touch/TouchMoveControls.js","webpack:///./BlueMapWeb/src/controls/map/touch/TouchRotateControls.js","webpack:///./BlueMapWeb/src/controls/map/touch/TouchAngleControls.js","webpack:///./BlueMapWeb/src/controls/map/touch/TouchZoomControls.js","webpack:///./BlueMapWeb/src/controls/map/MapControls.js","webpack:///./BlueMapWeb/src/controls/freeflight/keyboard/KeyMoveControls.js","webpack:///./BlueMapWeb/src/controls/freeflight/mouse/MouseRotateControls.js","webpack:///./BlueMapWeb/src/controls/freeflight/mouse/MouseAngleControls.js","webpack:///./BlueMapWeb/src/controls/freeflight/keyboard/KeyHeightControls.js","webpack:///./BlueMapWeb/src/controls/freeflight/touch/TouchPanControls.js","webpack:///./BlueMapWeb/src/controls/freeflight/FreeFlightControls.js","webpack:///./BlueMapWeb/src/BlueMap.js","webpack:///./src/js/PopupMarker.js","webpack:///./src/js/Utils.js","webpack:///./src/js/BlueMapApp.js","webpack:///./src/main.js","webpack:///./src/App.vue?c650","webpack:///./src/components/Menu/SwitchButton.vue?d90e","webpack:///./src/components/ControlBar/ControlBar.vue?b095","webpack:///./src/components/ControlBar/PositionInput.vue?d13b","webpack:///./src/components/Menu/SimpleButton.vue?d014","webpack:///./src/components/Menu/MarkerSet.vue?c495","webpack:///./src/components/Menu/Slider.vue?a3fd","webpack:///./src/components/Menu/MainMenu.vue?a86a","webpack:///./src/components/Menu/SwitchHandle.vue?afcc","webpack:///./src/components/Menu/Group.vue?e7b6"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","_vm","this","_h","$createElement","_c","_self","class","appState","theme","attrs","controls","state","_e","menu","staticRenderFns","staticClass","isOpen","$t","on","$event","reOpenPage","maps","openPage","markers","markerSets","markerSet","playerMarkerSet","fake","openPlayerList","$bluemap","resetCamera","position","x","parseFloat","target","y","z","_v","_s","label","domProps","_f","$emit","stopPropagation","props","String","Number","filters","format","Math","floor","component","action","style","VEC2_ZERO","Vector2","stringToImage","Vector3","string","image","document","createElementNS","src","pathFromCoords","path","splitNumberToPath","substring","num","toString","charAt","hashTile","generateCacheHash","round","random","dispatchEvent","element","event","detail","CustomEvent","alert","message","level","printToConsole","console","log","warn","error","debug","htmlToElement","html","template","createElement","innerHTML","trim","content","firstChild","animate","animationFrame","durationMs","postAnimation","animation","animationStart","lastFrame","cancelled","frame","time","progress","MathUtils","clamp","deltaTime","requestAnimationFrame","cancel","EasingFunctions","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","elementOffset","rect","getBoundingClientRect","scrollLeft","pageXOffset","documentElement","scrollTop","pageYOffset","top","left","deepEquals","object1","object2","is","type","Array","isArray","len","softMin","min","stiffness","delta","softMax","max","softClamp","active","_t","isDay","components","isPerspectiveView","setPerspectiveView","isFlatView","setFlatView","isFreeFlight","setFreeFlight","close","back","Boolean","set","id","currentPage","title","pageStack","closePage","closeAll","goFullscreen","updateMap","_l","map","buttonEnterAnimation","open","rendered","default","methods","submenu","mapViewer","uniforms","sunlightStrength","ambientLight","stage","superSampling","saveUserSettings","loadedHiresViewDistance","updateLoadedMapArea","loadedLowresViewDistance","mouseSensitivity","updateControlsSettings","invertMouse","setTheme","$i18n","languages","lang","locale","setLanguage","switchDebug","resetSettings","formattedValue","step","countDecimals","split","computed","toFixed","pageTitle","tooltip","button","marker","settings","lighting","dayNightSwitch","sunlight","resolution","high","normal","low","freeFlightControls","invertMouseY","renderDistance","hiresLayer","lowersLayer","dark","light","resetAllSettings","players","compass","perspective","flatView","freeFlight","language","blockTooltip","block","chunk","region","file","sun","info","VueI18n","messages","import","setLocaleMessage","querySelector","setAttribute","loadLanguageSettings","Vue","use","i18n","fallbackLocale","silentFallbackWarn","fallback","qualityStages","themes","setDebug","MainMenu","NULL_PAGE","openMore","filteredMarkerSets","thisMarkerSet","filter","search","visible","click","playerUuid","steve","markerLabel","followingPlayer","controlsManager","strippedLabel","v","toggle","$tc","toggleable","filteredMarkers","a","b","includesCI","selected","selectedMapId","switchMap","color","skyColor","g","mapId","body","requestFullscreen","disabled","enabled","forward","forwardPointer","changedTouches","identifier","preventDefault","up","upPointer","onTouchStop","evt","onFrame","cm","sin","rotation","cos","enable","mounted","addEventListener","events","beforeDestroy","removeEventListener","FreeFlightMobileControls","ControlBar","Tile","onLoad","onUnload","model","unloaded","loading","tileLoader","Promise","reject","unload","load","then","geometry","dispose","finally","TileMap","width","height","canvas","tileMapContext","getContext","alpha","willReadFrequently","texture","Texture","generateMipmaps","magFilter","LinearFilter","minFilter","wrapS","ClampToEdgeWrapping","wrapT","flipY","needsUpdate","fillStyle","fillRect","TileManager","scene","onTileLoad","onTileUnload","loadNextTile","loadTimeout","clearTimeout","currentlyLoading","setTimeout","loadCloseTiles","tile","add","tileMap","setTile","centerTile","tileMapHalfSize","EMPTY","remove","viewDistanceX","viewDistanceZ","tiles","Map","tileMapSize","unloadTiles","removeFarTiles","setAll","forEach","LOADED","removeAllTiles","hash","delete","clear","tryLoadTile","abs","tileHash","undefined","handleLoadedTile","handleUnloadedTile","catch","status","TileLoader","tilePath","material","tileSettings","tileCacheHash","layer","tileX","tileZ","tileUrl","resolve","fileLoader","geometryJson","bufferGeometryLoader","parse","Mesh","layers","tileSize","translate","scale","userData","updateMatrixWorld","FileLoader","setResponseType","BufferGeometryLoader","MarkerSet","defaultHide","isMarkerSet","isMarker","indexOf","children","child","Scene","UniformsLib","line","linewidth","dashScale","dashSize","gapSize","opacity","ShaderLib","UniformsUtils","merge","common","fog","vertexShader","fragmentShader","LineMaterial","parameters","ShaderMaterial","clone","clipping","dashed","defineProperties","diffuse","copy","setValues","constructor","isLineMaterial","MARKER_FILL_VERTEX_SHADER","ShaderChunk","logdepthbuf_pars_vertex","logdepthbuf_vertex","MARKER_FILL_FRAGMENT_SHADER","logdepthbuf_pars_fragment","logdepthbuf_fragment","LineSegmentsGeometry","InstancedBufferGeometry","positions","uvs","index","setIndex","Float32BufferAttribute","assign","isLineSegmentsGeometry","applyMatrix4","matrix","start","attributes","instanceStart","end","instanceEnd","boundingBox","computeBoundingBox","boundingSphere","computeBoundingSphere","setPositions","array","lineSegments","Float32Array","instanceBuffer","InstancedInterleavedBuffer","InterleavedBufferAttribute","setColors","colors","instanceColorBuffer","fromWireframeGeometry","fromEdgesGeometry","fromMesh","mesh","WireframeGeometry","fromLineSegments","isGeometry","vertices","isBufferGeometry","box","Box3","setFromBufferAttribute","union","vector","Sphere","center","getCenter","maxRadiusSq","il","count","fromBufferAttribute","distanceToSquared","radius","sqrt","isNaN","toJSON","applyMatrix","LineGeometry","isLineGeometry","points","fromLine","LineSegments2","isLineSegments2","computeLineDistances","lineDistances","distanceTo","instanceDistanceBuffer","raycast","Vector4","ssOrigin","ssOrigin3","mvMatrix","Matrix4","Line3","closestPoint","raycaster","intersects","camera","threshold","params","Line2","ray","projectionMatrix","lineWidth","at","w","matrixWorldInverse","multiplyScalar","matrixWorld","multiplyMatrices","isBehindCameraNear","isPastCameraFar","param","closestPointToPointParameter","zPos","lerp","isInClipSpace","isInside","pointOnLine","point","distanceSqToSegment","distance","origin","face","faceIndex","uv","uv2","isLine2","Marker","markerId","markerData","fadeDistanceMin","fadeDistanceMax","calculateDistanceToCameraPlane","minDelta","maxDelta","_posRelativeToCamera","subVectors","getWorldDirection","_cameraDirection","dot","Object3D","CSS2DObject","parent","parentNode","replaceChild","appendChild","anchor","traverse","Element","removeChild","lastClick","handleClick","doubleTap","now","Date","onClick","CSS2DRenderer","_width","_height","_widthHalf","_heightHalf","_this","viewMatrix","viewProjectionMatrix","cache","objects","WeakMap","domElement","overflow","getSize","setSize","renderObject","parentVisible","onBeforeRender","setFromMatrixPosition","WebkitTransform","MozTransform","oTransform","transform","display","objectData","distanceToCameraSquared","getDistanceToSquared","onAfterRender","filterAndFlatten","zOrder","sorted","sort","distanceA","distanceB","zMax","zIndex","render","autoUpdate","ObjectMarker","link","newTab","pos","intersection","sub","popup","LabelPopup","setX","setY","setZ","autoClose","targetOpacity","inAnimation","removeHandler","composedPath","includes","startOpacity","completed","ShapeMarker","zero","shape","Shape","fill","ShapeMarkerFill","border","ShapeMarkerBorder","renderOrder","_markerData","relativeY","updateGeometry","setShape","createShapeFromData","setShapeY","shapeY","depthTest","bc","lineColor","borderColor","setRGB","fc","fillColor","minDist","minDistance","maxDist","maxDistance","MAX_VALUE","shapeData","createGeometry","side","DoubleSide","transparent","markerColor","Color","markerOpacity","test","ShapeBufferGeometry","rotateX","PI","createLinePoints","vertexColors","innerWidth","innerHeight","renderer","points3d","getPoints","ExtrudeMarker","ExtrudeMarkerFill","ExtrudeMarkerBorder","minY","maxY","shapeMinY","shapeMaxY","ExtrudeBufferGeometry","depth","steps","bevelEnabled","prevPoint","LineMarker","LineMarkerLine","Error","isVector3","setLine","createPointsFromData","lc","HtmlMarker","elementObject","calculateDistanceOpacity","getElementsByTagName","anch","PoiMarker","iconElement","item","labelElement","_lastIcon","highlight","eventHandler","classList","contains","iconAnchor","icon","MarkerManager","markerScene","fileUrl","_updateInterval","ms","update","success","e","loadMarkerFile","markerFileData","updateFromData","setAutoUpdateInterval","removeMarkerSet","setId","removeMarker","loader","MarkerFileManager","updatedMarkerSets","Set","markerSetData","updateMarkerSetFromData","err","has","addMarkerSet","updatedMarkers","updateMarkerFromData","addMarker","PlayerMarker","world","playerHeadElement","playerNameElement","once","startPos","deltaPos","ease","PlayerMarkerManager","playerDataUrl","worldId","getPlayerMarkerSet","updatedPlayerMarkers","playerData","playerMarker","updatePlayerMarkerFromData","uuid","isPlayerMarker","dataUrl","settingsUrl","texturesUrl","hires","lowres","Raycaster","hiresMaterial","lowresMaterial","loadedTextures","hiresTileManager","lowresTileManager","hiresVertexShader","hiresFragmentShader","lowresVertexShader","lowresFragmentShader","settingsPromise","loadSettings","textureFilePromise","loadTexturesFile","createLowresMaterial","all","values","textures","createHiresMaterial","loadSettingsFile","worldSettings","hiresViewDistance","lowresViewDistance","isLoaded","hiresX","hiresZ","hiresViewX","hiresViewZ","lowresX","lowresZ","lowresViewX","lowresViewZ","loadAroundTile","materials","textureSettings","opaque","anisotropy","NearestFilter","NearestMipMapLinearFilter","flatShading","textureImage","depthWrite","VertexColors","FrontSide","wireframe","near","far","enableAll","hiresTileHash","lowresTileHash","intersectObjects","SKY_FRAGMENT_SHADER","SKY_VERTEX_SHADER","SkyboxScene","SphereGeometry","BackSide","skybox","ControlsManager","angle","tilt","lastPosition","lastRotation","lastAngle","lastDistance","lastOrtho","ortho","lastTilt","lastMapUpdatePosition","averageDeltaTime","_controls","updateCamera","valueChanged","isValueChanged","resetValueChanged","rotatableAngle","rotatableDistance","pow","rotationVector","angleRotationAxis","cross","applyAxisAngle","lookAt","rotateZ","triggerDistance","loadMapArea","screenPosition","handleMapInteraction","equals","stop","_mapViewer","_camera","Stats","container","addPanel","panel","dom","showPanel","hide","cssText","beginTime","performance","prevTime","frames","prevFrameTime","fpsPanel","Panel","msPanel","lastFrameMsPanel","memPanel","self","memory","REVISION","begin","usedJSHeapSize","jsHeapSizeLimit","setMode","fg","bg","Infinity","PR","devicePixelRatio","WIDTH","HEIGHT","TEXT_X","TEXT_Y","GRAPH_X","GRAPH_Y","GRAPH_WIDTH","GRAPH_HEIGHT","context","font","textBaseline","fillText","globalAlpha","maxValue","drawImage","HIRES_VERTEX_SHADER","HIRES_FRAGMENT_SHADER","LOWRES_VERTEX_SHADER","LOWRES_FRAGMENT_SHADER","CombinedCamera","fov","aspect","zoom","updateProjectionMatrix","ortographicProjection","perspectiveProjection","tan","DEG2RAD","view","fullWidth","fullHeight","offsetX","offsetY","skew","filmOffset","getFilmWidth","normalizedOrtho","orthoTop","orthoHeight","orthoWidth","orthoLeft","makePerspective","makeOrthographic","elements","projectionMatrixInverse","invert","isPerspectiveCamera","PerspectiveCamera","MapViewer","rootElement","clientWidth","clientHeight","setPixelRatio","css2dRenderer","renderLoop","stats","loadedCenter","hiresTileMap","size","WebGLRenderer","antialias","sortObjects","preserveDrawingBuffer","logarithmicDepthBuffer","autoClear","skyboxScene","skyboxCamera","initializeRootElement","handleContainerResize","outerDiv","pointerEvents","rootOffset","normalizedScreenPos","setFromCamera","hit","lowresHit","hiresHit","covered","parentRoot","intersections","clearDepth","isMap","initTexture","centerX","centerZ","newTileCacheHash","_controlsManager","_map","MouseMoveControls","speed","buttons","altKey","moving","deltaPosition","tempVec2_1","pixelToSpeedMultiplierX","pixelToSpeedMultiplierY","manager","updatePixelToSpeedMultiplier","onMouseDown","onMouseMove","onMouseUp","smoothing","directionDelta","rotateAround","lengthSq","MouseZoomControls","deltaY","deltaMode","WheelEvent","DOM_DELTA_PIXEL","DOM_DELTA_LINE","deltaZoom","onMouseWheel","passive","MouseRotateControls","ctrlKey","deltaRotation","lastX","MouseAngleControls","deltaAngle","lastY","MapHeightControls","cameraHeightStiffness","targetHeightStiffness","maxAngle","targetHeight","cameraHeight","minCameraHeight","distanceTagretHeight","updateHeights","getSuggestedHeight","targetSmoothing","targetTerrainHeight","terrainHeightAt","targetDelta","cameraSmoothing","cameraTerrainHeight","cameraDelta","maxAngleHeight","KeyCombination","code","modifiers","ctrl","CTRL","SHIFT","alt","ALT","shiftKey","combinations","combination","testDown","testUp","KeyMoveControls","oneDown","KEYS","UP","DOWN","down","LEFT","RIGHT","right","oneUp","onKeyDown","onKeyUp","rotatedDelta","temp_v2","KeyAngleControls","KeyRotateControls","KeyZoomControls","IN","in","OUT","out","TouchMoveControls","hammer","pointerType","onTouchDown","onTouchMove","onTouchUp","off","TouchRotateControls","TouchAngleControls","TouchZoomControls","lastZoom","HALF_PI","MapControls","lastTap","lastTapCenter","Manager","initializeHammer","mouseMove","mouseRotate","mouseAngle","mouseZoom","keyMove","keyRotate","keyAngle","keyZoom","touchMove","touchRotate","touchAngle","touchZoom","mapHeight","onContextMenu","onTap","stopFollowingPlayerMarker","_beforeMoveTemp","maxAngleForZoom","getMaxPerspectiveAngleForDistance","reset","touchTap","Tap","pointers","taps","Pan","direction","DIRECTION_ALL","touchTilt","DIRECTION_VERTICAL","Rotate","Pinch","recognizeWith","speedLeft","speedRight","speedCapture","pointerLockElement","movementX","pixelToSpeedMultiplier","movementY","KeyHeightControls","TouchPanControls","FreeFlightControls","clickStart","requestPointerLock","moveSpeed","keyHeight","touchPan","started","animationTargetHeight","onWheel","eventStack","PopupMarker","isHires","int","chunkCoords","divideScalar","regionCoords","regionFile","blocklight","hrPath","lrPath","cubeGeo","BoxGeometry","cubeMaterial","MeshBasicMaterial","cube","onMapInteraction","finished","setCookie","days","JSON","stringify","expireDate","setTime","getTime","cookie","toUTCString","getCookie","cookieString","decodeURIComponent","cookies","precision","f","BlueMapApp","followPlayerMarkerWorld","updateLoop","hashUpdateTimeout","updatePageAddress","history","replaceState","location","substr","getWorldPosition","startDistance","targetDistance","startX","targetX","startZ","targetZ","viewAnimation","ep","mapControls","playerMarkerManager","markerFileManager","savedUserSettings","mapsMap","mainMenu","popupMarkerSet","popupMarker","oldMaps","getSettings","loadMaps","loadPageAddress","cameraMoved","mapInteraction","loadUserSettings","player","matchingMap","resetCameraIfNewWorld","oldWorld","initPlayerMarkerManager","initMarkerFileManager","mapSettings","BlueMapMap","map1","map2","ordinal","mouseInvert","transition","startY","targetY","startAngle","targetAngle","startOrtho","startTilt","startRotation","clearTileCache","saveUserSetting","reload","useCookies","loadUserSetting","defaultValue","val","toLowerCase","bluemap","getElementById","config","productionTip","vue","h","App","$mount","$nextTick"],"mappings":"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","file":"js/app.2df3842f.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TextInput.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MarkerItem.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ControlsSwitch.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SvgButton.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MenuButton.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NumberInput.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DayNightSwitch.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MapButton.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FreeFlightMobileControls.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Compass.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SideMenu.vue?vue&type=style&index=0&lang=scss&\"","\n\n\n\n","\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:{'theme-light': _vm.appState.theme === 'light', 'theme-dark': _vm.appState.theme === 'dark'},attrs:{\"id\":\"app\"}},[(_vm.appState.controls.state === 'free')?_c('FreeFlightMobileControls'):_vm._e(),_c('ControlBar'),_c('MainMenu',{attrs:{\"menu\":_vm.appState.menu}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"control-bar\"},[_c('MenuButton',{attrs:{\"close\":_vm.appState.menu.isOpen,\"back\":false,\"title\":_vm.$t('menu.tooltip')},on:{\"action\":function($event){return _vm.appState.menu.reOpenPage()}}}),_c('div',{staticClass:\"space thin-hide\"}),(_vm.appState.maps.length > 0)?_c('SvgButton',{staticClass:\"thin-hide\",attrs:{\"title\":_vm.$t('maps.tooltip')},on:{\"action\":function($event){_vm.appState.menu.openPage('maps', _vm.$t('maps.title'))}}},[_c('svg',{attrs:{\"viewBox\":\"0 0 30 30\"}},[_c('polygon',{attrs:{\"points\":\"26.708,22.841 19.049,25.186 11.311,20.718 3.292,22.841 7.725,5.96 13.475,4.814 19.314,7.409 25.018,6.037 \"}})])]):_vm._e(),(_vm.markers.markerSets.length > 0 || _vm.markers.markers.length > 0)?_c('SvgButton',{staticClass:\"thin-hide\",attrs:{\"title\":_vm.$t('markers.tooltip')},on:{\"action\":function($event){_vm.appState.menu.openPage('markers', _vm.$t('markers.title'), {markerSet: _vm.markers})}}},[_c('svg',{attrs:{\"viewBox\":\"0 0 30 30\"}},[_c('path',{attrs:{\"d\":\"M15,3.563c-4.459,0-8.073,3.615-8.073,8.073c0,6.483,8.196,14.802,8.196,14.802s7.951-8.013,7.951-14.802\\n\\t\\t\\tC23.073,7.177,19.459,3.563,15,3.563z M15,15.734c-2.263,0-4.098-1.835-4.098-4.099c0-2.263,1.835-4.098,4.098-4.098\\n\\t\\t\\tc2.263,0,4.098,1.835,4.098,4.098C19.098,13.899,17.263,15.734,15,15.734z\"}})])]):_vm._e(),(!_vm.playerMarkerSet.fake)?_c('SvgButton',{staticClass:\"thin-hide\",attrs:{\"title\":_vm.$t('players.tooltip')},on:{\"action\":_vm.openPlayerList}},[_c('svg',{attrs:{\"viewBox\":\"0 0 30 30\"}},[_c('g',[_c('path',{attrs:{\"d\":\"M8.95,14.477c0.409-0.77,1.298-1.307,2.164-1.309h0.026c-0.053-0.234-0.087-0.488-0.087-0.755\\n\\t\\t\\tc0-1.381,0.715-2.595,1.791-3.301c-0.01,0-0.021-0.006-0.03-0.006h-1.427c-0.39,0-0.514-0.251-0.276-0.563\\n\\t\\t\\tc0,0,0.497-0.645,0.497-1.452c0-1.48-1.2-2.681-2.679-2.681c-1.481,0-2.679,1.2-2.679,2.681c0,0.807,0.496,1.452,0.496,1.452\\n\\t\\t\\tc0.24,0.311,0.114,0.565-0.275,0.565L5.042,9.118C4.649,9.119,4.182,9.405,3.998,9.75l-2.601,4.927\\n\\t\\t\\tc-0.184,0.347-0.062,0.802,0.265,1.015l1.297,0.83c0.332,0.213,0.794,0.135,1.034-0.18l0.598-0.775\\n\\t\\t\\tc0.238-0.31,0.471-0.245,0.516,0.141l0.454,3.854c0.035,0.311,0.272,0.566,0.564,0.66c0.018-0.279,0.087-0.561,0.225-0.82\\n\\t\\t\\tL8.95,14.477z\"}}),_c('path',{attrs:{\"d\":\"M28.604,14.677l-2.597-4.94c-0.185-0.346-0.65-0.631-1.042-0.631h-1.428c-0.39,0-0.514-0.251-0.274-0.563\\n\\t\\t\\tc0,0,0.496-0.645,0.496-1.452c0-1.48-1.2-2.681-2.68-2.681c-1.481,0-2.679,1.2-2.679,2.681c0,0.807,0.496,1.452,0.496,1.452\\n\\t\\t\\tc0.239,0.311,0.114,0.565-0.275,0.565l-1.428,0.009c-0.005,0-0.009,0.002-0.015,0.002c1.067,0.708,1.774,1.917,1.774,3.292\\n\\t\\t\\tc0,0.263-0.031,0.513-0.084,0.744h0.02c0.868,0,1.758,0.537,2.166,1.305l2.598,4.944c0.137,0.262,0.205,0.539,0.222,0.818\\n\\t\\t\\tc0.296-0.092,0.538-0.35,0.574-0.664l0.451-3.842c0.044-0.389,0.28-0.452,0.519-0.143l0.588,0.768\\n\\t\\t\\tc0.239,0.313,0.702,0.391,1.033,0.182l1.297-0.833C28.667,15.479,28.787,15.026,28.604,14.677z\"}})]),_c('path',{attrs:{\"d\":\"M19.932,15.058c-0.184-0.346-0.651-0.63-1.043-0.63h-1.427c-0.39,0-0.515-0.252-0.275-0.564c0,0,0.496-0.645,0.496-1.451\\n\\t\\tc0-1.479-1.199-2.68-2.679-2.68c-1.482,0-2.679,1.201-2.679,2.68c0,0.806,0.496,1.451,0.496,1.451\\n\\t\\tc0.24,0.312,0.114,0.566-0.275,0.566l-1.427,0.009c-0.393,0.001-0.861,0.287-1.045,0.632l-2.602,4.925\\n\\t\\tc-0.185,0.348-0.062,0.803,0.266,1.016l1.297,0.832c0.332,0.213,0.794,0.133,1.034-0.18l0.598-0.775\\n\\t\\tc0.239-0.311,0.472-0.246,0.517,0.141l0.454,3.854c0.043,0.389,0.403,0.705,0.794,0.705h5.148c0.392,0,0.749-0.316,0.794-0.705\\n\\t\\tl0.45-3.844c0.045-0.389,0.282-0.451,0.52-0.143l0.587,0.768c0.239,0.313,0.703,0.393,1.033,0.182l1.297-0.832\\n\\t\\tc0.331-0.213,0.451-0.666,0.269-1.016L19.932,15.058z\"}})])]):_vm._e(),_c('div',{staticClass:\"space thin-hide greedy\"}),_c('DayNightSwitch',{staticClass:\"thin-hide\",attrs:{\"title\":_vm.$t('lighting.dayNightSwitch.tooltip')}}),_c('div',{staticClass:\"space thin-hide\"}),_c('ControlsSwitch',{staticClass:\"thin-hide\"}),_c('div',{staticClass:\"space thin-hide\"}),_c('SvgButton',{staticClass:\"thin-hide\",attrs:{\"title\":_vm.$t('resetCamera.tooltip')},on:{\"action\":function($event){return _vm.$bluemap.resetCamera()}}},[_c('svg',{attrs:{\"viewBox\":\"0 0 30 30\"}},[_c('rect',{attrs:{\"x\":\"7.085\",\"y\":\"4.341\",\"transform\":\"matrix(0.9774 0.2116 -0.2116 0.9774 3.2046 -1.394)\",\"width\":\"2.063\",\"height\":\"19.875\"}}),_c('path',{attrs:{\"d\":\"M12.528,5.088c0,0,3.416-0.382,4.479-0.031c1.005,0.332,2.375,2.219,3.382,2.545c1.096,0.354,4.607-0.089,4.607-0.089\\n l-2.738,8.488c0,0-3.285,0.641-4.344,0.381c-1.049-0.257-2.607-2.015-3.642-2.324c-0.881-0.264-3.678-0.052-3.678-0.052\\n L12.528,5.088z\"}})])]),_c('PositionInput',{staticClass:\"pos-input\"}),_c('Compass',{attrs:{\"title\":_vm.$t('compass.tooltip')}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"position-input\"},[_c('NumberInput',{attrs:{\"label\":\"x\",\"value\":_vm.controls.position.x},on:{\"input\":function($event){_vm.controls.position.x = parseFloat($event.target.value);}}}),(_vm.appState.controls.state === 'free')?_c('NumberInput',{attrs:{\"label\":\"y\",\"value\":_vm.controls.position.y},on:{\"input\":function($event){_vm.controls.position.y = parseFloat($event.target.value);}}}):_vm._e(),_c('NumberInput',{attrs:{\"label\":\"z\",\"value\":_vm.controls.position.z},on:{\"input\":function($event){_vm.controls.position.z = parseFloat($event.target.value);}}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"number-input\"},[_c('label',[_c('span',{staticClass:\"label\"},[_vm._v(_vm._s(_vm.label)+\":\")]),_c('input',{attrs:{\"type\":\"number\"},domProps:{\"value\":_vm._f(\"format\")(_vm.value)},on:{\"input\":function($event){return _vm.$emit('input', $event)},\"keydown\":function($event){return $event.stopPropagation()}}})])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NumberInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NumberInput.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./NumberInput.vue?vue&type=template&id=69a7a1b7&\"\nimport script from \"./NumberInput.vue?vue&type=script&lang=js&\"\nexport * from \"./NumberInput.vue?vue&type=script&lang=js&\"\nimport style0 from \"./NumberInput.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PositionInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PositionInput.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PositionInput.vue?vue&type=template&id=cd44c82e&\"\nimport script from \"./PositionInput.vue?vue&type=script&lang=js&\"\nexport * from \"./PositionInput.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PositionInput.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('SvgButton',{staticClass:\"compass\",on:{\"action\":_vm.action}},[_c('svg',{style:(_vm.style),attrs:{\"viewBox\":\"0 0 30 30\"}},[_c('path',{staticClass:\"north\",attrs:{\"d\":\"M14.792,1.04c0.114-0.354,0.299-0.354,0.412,0l4.089,12.729c0.114,0.353-0.097,0.642-0.468,0.642\\n l-7.651,0.001c-0.371,0-0.581-0.288-0.468-0.642L14.792,1.04z\"}}),_c('path',{staticClass:\"south\",attrs:{\"d\":\"M10.707,16.23c-0.114-0.353,0.097-0.642,0.468-0.642l7.651-0.001c0.371,0,0.581,0.289,0.468,0.642\\n l-4.086,12.73c-0.113,0.353-0.299,0.353-0.412,0L10.707,16.23z\"}})])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport {MathUtils, Vector2, Vector3} from \"three\";\n\nexport const VEC2_ZERO = new Vector2(0, 0);\nexport const VEC3_ZERO = new Vector3(0, 0, 0);\nexport const VEC3_X = new Vector3(1, 0, 0);\nexport const VEC3_Y = new Vector3(0, 1, 0);\nexport const VEC3_Z = new Vector3(0, 0, 1);\n\n/**\n * Converts a url-encoded image string to an actual image-element\n * @param string {string}\n * @returns {HTMLElement}\n */\nexport const stringToImage = string => {\n let image = document.createElementNS('http://www.w3.org/1999/xhtml', 'img');\n image.src = string;\n return image;\n};\n\n/**\n * Creates an optimized path from x,z coordinates used by bluemap to save tiles\n * @param x {number}\n * @param z {number}\n * @returns {string}\n */\nexport const pathFromCoords = (x, z) => {\n let path = 'x';\n path += splitNumberToPath(x);\n\n path += 'z';\n path += splitNumberToPath(z);\n\n path = path.substring(0, path.length - 1);\n\n return path;\n};\n\n/**\n * Splits a number into an optimized folder-path used to save bluemap-tiles\n * @param num {number}\n * @returns {string}\n */\nconst splitNumberToPath = num => {\n let path = '';\n\n if (num < 0) {\n num = -num;\n path += '-';\n }\n\n let s = num.toString();\n\n for (let i = 0; i < s.length; i++) {\n path += s.charAt(i) + '/';\n }\n\n return path;\n};\n\n/**\n * Hashes tile-coordinates to be saved in a map\n * @param x {number}\n * @param z {number}\n * @returns {string}\n */\nexport const hashTile = (x, z) => `x${x}z${z}`;\n\nexport const generateCacheHash = () => {\n return Math.round(Math.random() * 1000000);\n}\n\n/**\n * Dispatches an event to the element of this map-viewer\n * @param element {EventTarget} the element on that the event is dispatched\n * @param event {string}\n * @param detail {object}\n * @returns {undefined|void|boolean}\n */\nexport const dispatchEvent = (element, event, detail = {}) => {\n if (!element || !element.dispatchEvent) return;\n\n return element.dispatchEvent(new CustomEvent(event, {\n detail: detail\n }));\n}\n\n/**\n * Sends a \"bluemapAlert\" event with a message and a level.\n * The level can be anything, but the app uses the levels\n * - debug\n * - fine\n * - info\n * - warning\n * - error\n * @param element {EventTarget} the element on that the event is dispatched\n * @param message {object}\n * @param level {string}\n */\nexport const alert = (element, message, level = \"info\") => {\n\n // alert event\n let printToConsole = dispatchEvent(element, \"bluemapAlert\", {\n message: message,\n level: level\n });\n\n // log alert to console\n if (printToConsole) {\n if (level === \"info\") {\n console.log(`[BlueMap/${level}]`, message);\n } else if (level === \"warning\") {\n console.warn(`[BlueMap/${level}]`, message);\n } else if (level === \"error\") {\n console.error(`[BlueMap/${level}]`, message);\n } else {\n console.debug(`[BlueMap/${level}]`, message);\n }\n }\n}\n\n/**\n * Source: https://stackoverflow.com/questions/494143/creating-a-new-dom-element-from-an-html-string-using-built-in-dom-methods-or-pro/35385518#35385518\n *\n * @param html {string} representing a single element\n * @return {Element}\n */\nexport const htmlToElement = html => {\n let template = document.createElement('template');\n template.innerHTML = html.trim();\n return template.content.firstChild;\n}\n\n/**\n * Source: https://stackoverflow.com/questions/494143/creating-a-new-dom-element-from-an-html-string-using-built-in-dom-methods-or-pro/35385518#35385518\n *\n * @param html {string} representing any number of sibling elements\n * @return {NodeList}\n */\nexport const htmlToElements = html => {\n let template = document.createElement('template');\n template.innerHTML = html;\n return template.content.childNodes;\n}\n\n/**\n * Schedules an animation\n * @param durationMs {number} the duration of the animation in ms\n * @param animationFrame {function(progress: number, deltaTime: number)} a function that is getting called each frame with the parameters (progress (0-1), deltaTime)\n * @param postAnimation {function(finished: boolean)} a function that gets called once after the animation is finished or cancelled. The function accepts one bool-parameter whether the animation was finished (true) or canceled (false)\n * @returns {{cancel: function()}} the animation object\n */\nexport const animate = function (animationFrame, durationMs = 1000, postAnimation = null) {\n let animation = {\n animationStart: -1,\n lastFrame: -1,\n cancelled: false,\n\n frame: function (time) {\n if (this.cancelled) return;\n\n if (this.animationStart === -1) {\n this.animationStart = time;\n this.lastFrame = time;\n }\n\n let progress = durationMs === 0 ? 1 : MathUtils.clamp((time - this.animationStart) / durationMs, 0, 1);\n let deltaTime = time - this.lastFrame;\n\n animationFrame(progress, deltaTime);\n\n if (progress < 1) window.requestAnimationFrame(time => this.frame(time));\n else if (postAnimation) postAnimation(true);\n\n this.lastFrame = time;\n },\n\n cancel: function () {\n this.cancelled = true;\n if (postAnimation) postAnimation(false);\n }\n };\n\n window.requestAnimationFrame(time => animation.frame(time));\n\n return animation;\n}\n\n/**\n * Source: https://gist.github.com/gre/1650294\n * @type {{\n * easeOutCubic: (function(number): number),\n * linear: (function(number): number),\n * easeOutQuint: (function(number): number),\n * easeInQuart: (function(number): number),\n * easeInOutQuint: (function(number): number),\n * easeInQuad: (function(number): number),\n * easeOutQuart: (function(number): number),\n * easeInCubic: (function(number): number),\n * easeInQuint: (function(number): number),\n * easeOutQuad: (function(number): number),\n * easeInOutQuad: (function(number): number),\n * easeInOutCubic: (function(number): number),\n * easeInOutQuart: (function(number): number)\n * }}\n */\nexport const EasingFunctions = {\n // no easing, no acceleration\n linear: t => t,\n // accelerating from zero velocity\n easeInQuad: t => t*t,\n // decelerating to zero velocity\n easeOutQuad: t => t*(2-t),\n // acceleration until halfway, then deceleration\n easeInOutQuad: t => t<.5 ? 2*t*t : -1+(4-2*t)*t,\n // accelerating from zero velocity\n easeInCubic: t => t*t*t,\n // decelerating to zero velocity\n easeOutCubic: t => (--t)*t*t+1,\n // acceleration until halfway, then deceleration\n easeInOutCubic: t => t<.5 ? 4*t*t*t : (t-1)*(2*t-2)*(2*t-2)+1,\n // accelerating from zero velocity\n easeInQuart: t => t*t*t*t,\n // decelerating to zero velocity\n easeOutQuart: t => 1-(--t)*t*t*t,\n // acceleration until halfway, then deceleration\n easeInOutQuart: t => t<.5 ? 8*t*t*t*t : 1-8*(--t)*t*t*t,\n // accelerating from zero velocity\n easeInQuint: t => t*t*t*t*t,\n // decelerating to zero velocity\n easeOutQuint: t => 1+(--t)*t*t*t*t,\n // acceleration until halfway, then deceleration\n easeInOutQuint: t => t<.5 ? 16*t*t*t*t*t : 1+16*(--t)*t*t*t*t\n}\n\n/**\n * Returns the offset position of an element\n *\n * Source: https://plainjs.com/javascript/styles/get-the-position-of-an-element-relative-to-the-document-24/\n *\n * @param element {Element}\n * @returns {{top: number, left: number}}\n */\nexport const elementOffset = element => {\n let rect = element.getBoundingClientRect(),\n scrollLeft = window.pageXOffset || document.documentElement.scrollLeft,\n scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n return { top: rect.top + scrollTop, left: rect.left + scrollLeft }\n}\n\n/**\n * Very simple deep equals, should not be used for complex objects. Is designed for comparing parsed json-objects.\n * @param object1 {object}\n * @param object2 {object}\n * @returns {boolean}\n */\nexport const deepEquals = (object1, object2) => {\n if (Object.is(object1, object2)) return true;\n\n let type = typeof object1;\n if (type !== typeof object2) return false;\n\n if (type === 'number' || type === 'boolean' || type === 'string') return false;\n\n if (Array.isArray(object1)){\n let len = object1.length;\n if (len !== object2.length) return false;\n for (let i = 0; i < len; i++) {\n if (!deepEquals(object1[i], object2[i])) return false;\n }\n\n return true;\n }\n\n for (let property in object1) {\n if (!object1.hasOwnProperty(property)) continue;\n if (!deepEquals(object1[property], object2[property])) return false;\n }\n\n return true;\n}\n\n/**\n * Adds one listener to multiple events\n * @param target {EventTarget}\n * @param types {string|string[]}\n * @param listener {EventListenerOrEventListenerObject | null}\n * @param options {boolean | AddEventListenerOptions?}\n */\nexport const addEventListeners = (target, types, listener, options) => {\n if (!Array.isArray(types)){\n types = types.trim().split(\" \");\n }\n\n types.forEach(type => target.addEventListener(type, listener, options));\n}\n\n/**\n * Removes one listener to multiple events\n * @param target {EventTarget}\n * @param types {string|string[]}\n * @param listener {EventListenerOrEventListenerObject | null}\n * @param options {boolean | EventListenerOptions?}\n */\nexport const removeEventListeners = (target, types, listener, options) => {\n if (!Array.isArray(types)){\n types = types.trim().split(\" \");\n }\n\n types.forEach(type => target.removeEventListener(type, listener, options));\n}\n\n/**\n * Softly clamps towards a minimum value\n * @param value {number}\n * @param min {number}\n * @param stiffness {number}\n * @returns {number}\n */\nexport const softMin = (value, min, stiffness) => {\n if (value >= min) return value;\n let delta = min - value;\n if (delta < 0.0001) return min;\n return value + delta * stiffness;\n}\n\n/**\n * Softly clamps towards a maximum value\n * @param value {number}\n * @param max {number}\n * @param stiffness {number}\n * @returns {number}\n */\nexport const softMax = (value, max, stiffness) => {\n if (value <= max) return value;\n let delta = value - max;\n if (delta < 0.0001) return max;\n return value - delta * stiffness;\n}\n\n/**\n * Softly clamps towards a minimum and maximum value\n * @param value {number}\n * @param min {number}\n * @param max {number}\n * @param stiffness {number}\n * @returns {number}\n */\nexport const softClamp = (value, min, max, stiffness) => {\n return softMax(softMin(value, min, stiffness), max, stiffness);\n}","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"svg-button\",class:{active: _vm.active},on:{\"click\":function($event){return _vm.$emit('action', $event)}}},[_vm._t(\"default\")],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SvgButton.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SvgButton.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SvgButton.vue?vue&type=template&id=0bca2c93&\"\nimport script from \"./SvgButton.vue?vue&type=script&lang=js&\"\nexport * from \"./SvgButton.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SvgButton.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Compass.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Compass.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Compass.vue?vue&type=template&id=9d1413c2&\"\nimport script from \"./Compass.vue?vue&type=script&lang=js&\"\nexport * from \"./Compass.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Compass.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('SvgButton',{staticClass:\"day-night-switch\",attrs:{\"active\":!_vm.isDay},on:{\"action\":_vm.action}},[_c('svg',{attrs:{\"viewBox\":\"0 0 30 30\"}},[_c('path',{attrs:{\"d\":\"M17.011,19.722c-3.778-1.613-5.533-5.982-3.921-9.76c0.576-1.348,1.505-2.432,2.631-3.204\\n c-3.418-0.243-6.765,1.664-8.186,4.992c-1.792,4.197,0.159,9.053,4.356,10.844c3.504,1.496,7.462,0.377,9.717-2.476\\n C20.123,20.465,18.521,20.365,17.011,19.722z\"}}),_c('circle',{attrs:{\"cx\":\"5.123\",\"cy\":\"7.64\",\"r\":\"1.196\"}}),_c('circle',{attrs:{\"cx\":\"23.178\",\"cy\":\"5.249\",\"r\":\"1.195\"}}),_c('circle',{attrs:{\"cx\":\"20.412\",\"cy\":\"13.805\",\"r\":\"1.195\"}}),_c('circle',{attrs:{\"cx\":\"25.878\",\"cy\":\"23.654\",\"r\":\"1.195\"}})])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DayNightSwitch.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DayNightSwitch.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./DayNightSwitch.vue?vue&type=template&id=5b57efe8&\"\nimport script from \"./DayNightSwitch.vue?vue&type=script&lang=js&\"\nexport * from \"./DayNightSwitch.vue?vue&type=script&lang=js&\"\nimport style0 from \"./DayNightSwitch.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"controls-switch\"},[_c('SvgButton',{attrs:{\"active\":_vm.isPerspectiveView,\"title\":_vm.$t('controls.perspective.tooltip')},on:{\"action\":_vm.setPerspectiveView}},[_c('svg',{attrs:{\"viewBox\":\"0 0 30 30\"}},[_c('path',{attrs:{\"d\":\"M19.475,10.574c-0.166-0.021-0.337-0.036-0.51-0.045c-0.174-0.009-0.35-0.013-0.525-0.011\\n c-0.176,0.002-0.353,0.01-0.526,0.024c-0.175,0.015-0.347,0.036-0.515,0.063l-13.39,2.189\\n c-0.372,0.061-0.7,0.146-0.975,0.247c-0.276,0.102-0.5,0.221-0.66,0.349c-0.161,0.129-0.259,0.268-0.282,0.408\\n c-0.024,0.141,0.028,0.285,0.165,0.421l5.431,5.511c0.086,0.087,0.191,0.167,0.314,0.241s0.263,0.142,0.417,0.202\\n c0.155,0.062,0.323,0.115,0.502,0.162c0.18,0.046,0.371,0.085,0.569,0.116s0.405,0.054,0.616,0.068\\n c0.211,0.015,0.427,0.021,0.645,0.017c0.217-0.003,0.436-0.016,0.652-0.037c0.217-0.022,0.431-0.054,0.641-0.095L27.12,17.43\\n c0.371-0.073,0.679-0.175,0.917-0.296c0.236-0.12,0.404-0.259,0.497-0.407c0.093-0.147,0.111-0.305,0.052-0.461\\n c-0.059-0.156-0.195-0.313-0.415-0.46l-7.089-4.742c-0.089-0.06-0.192-0.115-0.308-0.166\\n c-0.116-0.051-0.243-0.097-0.381-0.138c-0.137-0.041-0.283-0.078-0.438-0.108C19.803,10.621,19.641,10.595,19.475,10.574\"}})])]),_c('SvgButton',{attrs:{\"active\":_vm.isFlatView,\"title\":_vm.$t('controls.flatView.tooltip')},on:{\"action\":_vm.setFlatView}},[_c('svg',{attrs:{\"viewBox\":\"0 0 30 30\"}},[_c('path',{attrs:{\"d\":\"M22.371,4.158c1.65,0,3,1.35,3,3v15.684c0,1.65-1.35,3-3,3H7.629c-1.65,0-3-1.35-3-3V7.158c0-1.65,1.35-3,3-3H22.371z\"}})])]),_c('SvgButton',{attrs:{\"active\":_vm.isFreeFlight,\"title\":_vm.$t('controls.freeFlight.tooltip')},on:{\"action\":_vm.setFreeFlight}},[_c('svg',{attrs:{\"viewBox\":\"0 0 30 30\"}},[_c('path',{attrs:{\"d\":\"M21.927,11.253c-0.256-0.487-0.915-0.885-1.465-0.885h-2.004c-0.55,0-0.726-0.356-0.39-0.792c0,0,0.698-0.905,0.698-2.041\\n c0-2.08-1.687-3.767-3.767-3.767s-3.767,1.687-3.767,3.767c0,1.136,0.698,2.041,0.698,2.041c0.336,0.436,0.161,0.794-0.389,0.797\\n l-2.005,0.01c-0.55,0.002-1.21,0.403-1.467,0.889l-3.656,6.924c-0.257,0.487-0.088,1.128,0.375,1.425l1.824,1.171\\n c0.462,0.297,1.116,0.184,1.451-0.253l0.839-1.092c0.335-0.437,0.662-0.346,0.726,0.2l0.637,5.415\\n c0.064,0.546,0.567,0.993,1.117,0.993h7.234c0.55,0,1.053-0.447,1.117-0.993l0.635-5.401c0.064-0.546,0.392-0.637,0.727-0.2\\n l0.828,1.078c0.335,0.437,0.988,0.55,1.451,0.253l1.823-1.171c0.463-0.297,0.633-0.938,0.377-1.425L21.927,11.253z\"}})])])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ControlsSwitch.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ControlsSwitch.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ControlsSwitch.vue?vue&type=template&id=4fb37c66&\"\nimport script from \"./ControlsSwitch.vue?vue&type=script&lang=js&\"\nexport * from \"./ControlsSwitch.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ControlsSwitch.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('SvgButton',{staticClass:\"menu-button\",class:{close: _vm.close, back: _vm.back},on:{\"action\":function($event){return _vm.$emit('action', $event)}}},[_c('svg',{attrs:{\"viewBox\":\"0 0 30 30\"}},[_c('g',[_c('path',{attrs:{\"d\":\"M25.004,9.294c0,0.806-0.75,1.46-1.676,1.46H6.671c-0.925,0-1.674-0.654-1.674-1.46l0,0\\n c0-0.807,0.749-1.461,1.674-1.461h16.657C24.254,7.833,25.004,8.487,25.004,9.294L25.004,9.294z\"}}),_c('path',{attrs:{\"d\":\"M25.004,15c0,0.807-0.75,1.461-1.676,1.461H6.671c-0.925,0-1.674-0.654-1.674-1.461l0,0\\n c0-0.807,0.749-1.461,1.674-1.461h16.657C24.254,13.539,25.004,14.193,25.004,15L25.004,15z\"}}),_c('path',{attrs:{\"d\":\"M25.004,20.706c0,0.807-0.75,1.461-1.676,1.461H6.671c-0.925,0-1.674-0.654-1.674-1.461l0,0\\n c0-0.807,0.749-1.461,1.674-1.461h16.657C24.254,19.245,25.004,19.899,25.004,20.706L25.004,20.706z\"}})])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MenuButton.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MenuButton.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./MenuButton.vue?vue&type=template&id=6d719739&\"\nimport script from \"./MenuButton.vue?vue&type=script&lang=js&\"\nexport * from \"./MenuButton.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MenuButton.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ControlBar.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ControlBar.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ControlBar.vue?vue&type=template&id=e943b240&\"\nimport script from \"./ControlBar.vue?vue&type=script&lang=js&\"\nexport * from \"./ControlBar.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ControlBar.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('SideMenu',{attrs:{\"open\":_vm.menu.isOpen,\"title\":_vm.menu.currentPage().title,\"back\":_vm.menu.pageStack.length > 1},on:{\"back\":function($event){return _vm.menu.closePage()},\"close\":function($event){return _vm.menu.closeAll()}}},[(_vm.menu.currentPage().id === 'root')?_c('div',[_c('SimpleButton',{attrs:{\"submenu\":true},on:{\"action\":function($event){_vm.menu.openPage('maps', function () { return _vm.$t('maps.title'); })}}},[_vm._v(_vm._s(_vm.$t(\"maps.button\")))]),_c('SimpleButton',{attrs:{\"submenu\":true},on:{\"action\":function($event){_vm.menu.openPage('markers', function () { return _vm.$t('markers.title'); }, {markerSet: _vm.markers})}}},[_vm._v(_vm._s(_vm.$t(\"markers.button\")))]),_c('SimpleButton',{attrs:{\"submenu\":true},on:{\"action\":function($event){_vm.menu.openPage('settings', function () { return _vm.$t('settings.title'); })}}},[_vm._v(_vm._s(_vm.$t(\"settings.button\")))]),_c('SimpleButton',{attrs:{\"submenu\":true},on:{\"action\":function($event){_vm.menu.openPage('info', function () { return _vm.$t('info.title'); })}}},[_vm._v(_vm._s(_vm.$t(\"info.button\")))]),_c('hr'),_c('SimpleButton',{on:{\"action\":_vm.goFullscreen}},[_vm._v(_vm._s(_vm.$t(\"goFullscreen.button\")))]),_c('SimpleButton',{on:{\"action\":function($event){return _vm.$bluemap.resetCamera()}}},[_vm._v(_vm._s(_vm.$t(\"resetCamera.button\")))]),_c('SimpleButton',{attrs:{\"title\":_vm.$t('updateMap.tooltip')},on:{\"action\":function($event){return _vm.$bluemap.updateMap()}}},[_vm._v(_vm._s(_vm.$t(\"updateMap.button\")))])],1):_vm._e(),(_vm.menu.currentPage().id === 'maps')?_c('div',_vm._l((_vm.appState.maps),function(map){return _c('MapButton',{key:map.id,attrs:{\"map\":map}})}),1):_vm._e(),(_vm.menu.currentPage().id === 'markers')?_c('MarkerSetMenu',{attrs:{\"menu\":_vm.menu}}):_vm._e(),(_vm.menu.currentPage().id === 'settings')?_c('SettingsMenu'):_vm._e(),(_vm.menu.currentPage().id === 'info')?_c('div',{staticClass:\"info-content\",domProps:{\"innerHTML\":_vm._s(_vm.$t('info.content'))}}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Transition',{attrs:{\"name\":\"side-menu\"},on:{\"enter\":function($event){_vm.buttonEnterAnimation(); _vm.$emit('enter', $event)}}},[(_vm.open)?_c('div',{staticClass:\"side-menu\"},[_c('MenuButton',{attrs:{\"close\":_vm.open && _vm.rendered,\"back\":_vm.back},on:{\"action\":function($event){return _vm.$emit('back', $event)}}}),(_vm.open && _vm.back)?_c('MenuButton',{staticClass:\"full-close\",attrs:{\"close\":true},on:{\"action\":function($event){return _vm.$emit('close', $event)}}}):_vm._e(),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.title))]),_c('div',{staticClass:\"content\"},[_vm._t(\"default\")],2)],1):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SideMenu.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SideMenu.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SideMenu.vue?vue&type=template&id=68ad7d88&\"\nimport script from \"./SideMenu.vue?vue&type=script&lang=js&\"\nexport * from \"./SideMenu.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SideMenu.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"simple-button\",class:{active: _vm.active},on:{\"click\":function($event){return _vm.$emit('action')}}},[_c('div',{staticClass:\"label\"},[_vm._t(\"default\")],2),(_vm.submenu)?_c('div',{staticClass:\"submenu-icon\"},[_c('svg',{attrs:{\"viewBox\":\"0 0 30 30\"}},[_c('path',{attrs:{\"d\":\"M25.004,9.294c0,0.806-0.75,1.46-1.676,1.46H6.671c-0.925,0-1.674-0.654-1.674-1.46l0,0\\n\\tc0-0.807,0.749-1.461,1.674-1.461h16.657C24.254,7.833,25.004,8.487,25.004,9.294L25.004,9.294z\"}}),_c('path',{attrs:{\"d\":\"M25.004,20.706c0,0.807-0.75,1.461-1.676,1.461H6.671c-0.925,0-1.674-0.654-1.674-1.461l0,0\\n\\tc0-0.807,0.749-1.461,1.674-1.461h16.657C24.254,19.245,25.004,19.899,25.004,20.706L25.004,20.706z\"}})])]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SimpleButton.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SimpleButton.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SimpleButton.vue?vue&type=template&id=7478772b&\"\nimport script from \"./SimpleButton.vue?vue&type=script&lang=js&\"\nexport * from \"./SimpleButton.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SimpleButton.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('Group',{attrs:{\"title\":_vm.$t('controls.title')}},[_c('SimpleButton',{attrs:{\"active\":_vm.appState.controls.state === 'perspective'},on:{\"action\":function($event){return _vm.$bluemap.setPerspectiveView(500, _vm.appState.controls.state === 'free' ? 100 : 0)}}},[_vm._v(_vm._s(_vm.$t('controls.perspective.button')))]),_c('SimpleButton',{attrs:{\"active\":_vm.appState.controls.state === 'flat'},on:{\"action\":function($event){return _vm.$bluemap.setFlatView(500, _vm.appState.controls.state === 'free' ? 100 : 0)}}},[_vm._v(_vm._s(_vm.$t('controls.flatView.button')))]),_c('SimpleButton',{attrs:{\"active\":_vm.appState.controls.state === 'free'},on:{\"action\":function($event){return _vm.$bluemap.setFreeFlight(500)}}},[_vm._v(_vm._s(_vm.$t('controls.freeFlight.button')))])],1),_c('Group',{attrs:{\"title\":_vm.$t('lighting.title')}},[_c('Slider',{attrs:{\"value\":_vm.mapViewer.uniforms.sunlightStrength.value,\"min\":0,\"max\":1,\"step\":0.01},on:{\"update\":function($event){_vm.mapViewer.uniforms.sunlightStrength.value = $event}}},[_vm._v(_vm._s(_vm.$t('lighting.sunlight')))]),_c('Slider',{attrs:{\"value\":_vm.mapViewer.uniforms.ambientLight.value,\"min\":0,\"max\":1,\"step\":0.01},on:{\"update\":function($event){_vm.mapViewer.uniforms.ambientLight.value = $event}}},[_vm._v(_vm._s(_vm.$t('lighting.ambientLight')))])],1),_c('Group',{attrs:{\"title\":_vm.$t('resolution.title')}},_vm._l((_vm.qualityStages),function(stage){return _c('SimpleButton',{key:stage.name,attrs:{\"active\":_vm.mapViewer.superSampling === stage.value},on:{\"action\":function($event){_vm.$bluemap.mapViewer.superSampling = stage.value; _vm.$bluemap.saveUserSettings();}}},[_vm._v(_vm._s(stage.name))])}),1),_c('Group',{attrs:{\"title\":_vm.$t('renderDistance.title')}},[_c('Slider',{attrs:{\"value\":_vm.mapViewer.loadedHiresViewDistance,\"min\":50,\"max\":500,\"step\":10},on:{\"update\":function($event){_vm.mapViewer.loadedHiresViewDistance = $event; _vm.$bluemap.mapViewer.updateLoadedMapArea()},\"lazy\":function($event){return _vm.$bluemap.saveUserSettings()}}},[_vm._v(_vm._s(_vm.$t(\"renderDistance.hiresLayer\")))]),_c('Slider',{attrs:{\"value\":_vm.mapViewer.loadedLowresViewDistance,\"min\":500,\"max\":10000,\"step\":100},on:{\"update\":function($event){_vm.mapViewer.loadedLowresViewDistance = $event; _vm.$bluemap.mapViewer.updateLoadedMapArea()},\"lazy\":function($event){return _vm.$bluemap.saveUserSettings()}}},[_vm._v(_vm._s(_vm.$t(\"renderDistance.lowersLayer\")))])],1),_c('Group',{attrs:{\"title\":_vm.$t('freeFlightControls.title')}},[_c('Slider',{attrs:{\"value\":_vm.appState.controls.mouseSensitivity,\"min\":0.1,\"max\":5,\"step\":0.05},on:{\"update\":function($event){_vm.appState.controls.mouseSensitivity = $event; _vm.$bluemap.updateControlsSettings();},\"lazy\":function($event){return _vm.$bluemap.saveUserSettings()}}},[_vm._v(_vm._s(_vm.$t(\"freeFlightControls.mouseSensitivity\")))]),_c('SwitchButton',{attrs:{\"on\":_vm.appState.controls.invertMouse},on:{\"action\":function($event){_vm.appState.controls.invertMouse = !_vm.appState.controls.invertMouse; _vm.$bluemap.updateControlsSettings(); _vm.$bluemap.saveUserSettings()}}},[_vm._v(_vm._s(_vm.$t(\"freeFlightControls.invertMouseY\")))])],1),_c('Group',{attrs:{\"title\":_vm.$t('theme.title')}},_vm._l((_vm.themes),function(theme){return _c('SimpleButton',{key:theme.name,attrs:{\"active\":_vm.appState.theme === theme.value},on:{\"action\":function($event){_vm.$bluemap.setTheme(theme.value); _vm.$bluemap.saveUserSettings();}}},[_vm._v(_vm._s(theme.name))])}),1),(_vm.$i18n.languages.length > 1)?_c('Group',{attrs:{\"title\":_vm.$t('language.title')}},_vm._l((_vm.$i18n.languages),function(lang){return _c('SimpleButton',{key:lang.locale,attrs:{\"active\":lang.locale === _vm.$i18n.locale},on:{\"action\":function($event){_vm.$i18n.setLanguage(lang.locale); _vm.$bluemap.saveUserSettings();}}},[_vm._v(_vm._s(lang.name))])}),1):_vm._e(),_c('SwitchButton',{attrs:{\"on\":_vm.appState.debug},on:{\"action\":function($event){_vm.switchDebug(); _vm.$bluemap.saveUserSettings();}}},[_vm._v(_vm._s(_vm.$t(\"debug.button\")))]),_c('SimpleButton',{on:{\"action\":function($event){return _vm.$bluemap.resetSettings()}}},[_vm._v(_vm._s(_vm.$t(\"resetAllSettings.button\")))])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"group\"},[_c('span',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.title))]),_c('div',{staticClass:\"content\"},[_vm._t(\"default\")],2)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Group.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Group.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Group.vue?vue&type=template&id=282a5cc2&\"\nimport script from \"./Group.vue?vue&type=script&lang=js&\"\nexport * from \"./Group.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Group.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"slider\"},[_c('div',{staticClass:\"label\"},[_vm._t(\"default\"),_vm._v(\": \"),_c('span',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.formattedValue))])],2),_c('label',[_c('input',{attrs:{\"type\":\"range\",\"min\":_vm.min,\"max\":_vm.max,\"step\":_vm.step},domProps:{\"value\":_vm.value},on:{\"input\":function($event){_vm.$emit('update', parseFloat($event.target.value))},\"change\":function($event){_vm.$emit('lazy', parseFloat($event.target.value))}}})])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Slider.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Slider.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Slider.vue?vue&type=template&id=54631848&\"\nimport script from \"./Slider.vue?vue&type=script&lang=js&\"\nexport * from \"./Slider.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Slider.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"switch-button\",on:{\"click\":function($event){return _vm.$emit('action')}}},[_c('div',{staticClass:\"label\"},[_vm._t(\"default\")],2),_c('SwitchHandle',{attrs:{\"on\":_vm.on}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"switch\",class:{on: _vm.on}})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SwitchHandle.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SwitchHandle.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SwitchHandle.vue?vue&type=template&id=0f0670a5&\"\nimport script from \"./SwitchHandle.vue?vue&type=script&lang=js&\"\nexport * from \"./SwitchHandle.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SwitchHandle.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SwitchButton.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SwitchButton.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SwitchButton.vue?vue&type=template&id=0f1912ae&\"\nimport script from \"./SwitchButton.vue?vue&type=script&lang=js&\"\nexport * from \"./SwitchButton.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SwitchButton.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","export default {\n\tpageTitle: \"BlueMap - {map}\",\n\tmenu: {\n\t\ttitle: \"Menu\",\n\t\ttooltip: \"Menu\"\n\t},\n\tmaps: {\n\t\ttitle: \"Maps\",\n\t\tbutton: \"Maps\",\n\t\ttooltip: \"Map-List\"\n\t},\n\tmarkers: {\n\t\ttitle: \"Markers\",\n\t\tbutton: \"Markers\",\n\t\ttooltip: \"Marker-List\",\n\t\tmarker: \"marker | markers\",\n\t\tmarkerSet: \"marker-set | marker-sets\"\n\t},\n\tsettings: {\n\t\ttitle: \"Settings\",\n\t\tbutton: \"Settings\"\n\t},\n\tgoFullscreen: {\n\t\tbutton: \"Go Fullscreen\"\n\t},\n\tresetCamera: {\n\t\tbutton: \"Reset Camera\",\n\t\ttooltip: \"Reset Camera & Position\"\n\t},\n\tupdateMap: {\n\t\tbutton: \"Update Map\",\n\t\ttooltip: \"Clear Tile Cache\"\n\t},\n\tlighting: {\n\t\ttitle: \"Lighting\",\n\t\tdayNightSwitch: {\n\t\t\ttooltip: \"Day/Night\"\n\t\t},\n\t\tsunlight: \"Sunlight\",\n\t\tambientLight: \"Ambient-Light\"\n\t},\n\tresolution: {\n\t\ttitle: \"Resolution\",\n\t\thigh: \"High (SSAA, x2)\",\n\t\tnormal: \"Normal (Native, x1)\",\n\t\tlow: \"Low (Upscaling, x0.5)\"\n\t},\n\tfreeFlightControls: {\n\t\ttitle: \"Free-Flight Controls\",\n\t\tmouseSensitivity: \"Mouse-Sensitivity\",\n\t\tinvertMouseY: \"Invert Mouse Y\"\n\t},\n\trenderDistance: {\n\t\ttitle: \"Render Distance\",\n\t\thiresLayer: \"Hires layer\",\n\t\tlowersLayer: \"Lowres layer\"\n\t},\n\ttheme: {\n\t\ttitle: \"Theme\",\n\t\tdefault: \"Default (System/Browser)\",\n\t\tdark: \"Dark\",\n\t\tlight: \"Light\"\n\t},\n\tdebug: {\n\t\tbutton: \"Debug\"\n\t},\n\tresetAllSettings: {\n\t\tbutton: \"Reset All Settings\"\n\t},\n\tplayers: {\n\t\ttitle: \"Players\",\n\t\ttooltip: \"Player-List\"\n\t},\n\tcompass: {\n\t\ttooltip: \"Compass / Face North\"\n\t},\n\tcontrols: {\n\t\ttitle: \"View / Controls\",\n\t\tperspective: {\n\t\t\tbutton: \"Perspective\",\n\t\t\ttooltip: \"Perspective-View\"\n\t\t},\n\t\tflatView: {\n\t\t\tbutton: \"Flat\",\n\t\t\ttooltip: \"Orthographic / Flat-View\",\n\t\t},\n\t\tfreeFlight: {\n\t\t\tbutton: \"Free-Flight\",\n\t\t\ttooltip: \"Free-Flight / Spectator Mode\"\n\t\t}\n\t},\n\tlanguage: {\n\t\ttitle: \"Language\",\n\t},\n\tblockTooltip: {\n\t\tblock: \"Block\",\n\t\tposition: \"Position\",\n\t\tchunk: \"Chunk\",\n\t\tregion: {\n\t\t\tregion: \"Region\",\n\t\t\tfile: \"File\"\n\t\t},\n\t\tlight: {\n\t\t\tlight: \"Light\",\n\t\t\tsun: \"Sun\",\n\t\t\tblock: \"Block\",\n\t\t}\n\t},\n\tinfo: {\n\t\ttitle: \"Info\",\n\t\tbutton: \"Info\",\n\t\tcontent: `\n\n

\n\t

Mouse-Controls:

\n\t\n\t\t\n\t\t\n\t\t\n\t
moveleft-click + drag
zoommousewheel (scroll)
rotate / tiltright-click + drag
\n

\n

\n\t

Keyboard-Controls:

\n\t\n\t\t\n\t\t\n\t\t\n\t
movewasd / arrow-keys
zoomNumpad: +/- or Ins/Home
rotate / tiltLeft-Alt + wasd / arrow-keys or Delete/End/Page Up/Page Down
\n

\n

\n\t

Touch-Controls:

\n\t\n\t\t\n\t\t\n\t\t\n\t
movetouch + drag
zoomtouch with two fingers + pinch
rotate / tilttouch with two fingers + rotate / move up/down
\n

\n

\n

\n\tThis map has been generated with ♥ using BlueMap.\n

\n\t\t`\n\t}\n};\n","import VueI18n from 'vue-i18n';\nimport Vue from 'vue';\nimport fallback from './fallback';\n\nVueI18n.prototype.setLanguage = async function(lang) {\n\ttry {\n\t\tif (!this.messages[lang]){\n\t\t\tlet messages = {};\n\t\t\tmessages = (await import(/* webpackIgnore: true */ `../lang/${lang}.js`)).default;\n\n\t\t\tthis.setLocaleMessage(lang, messages);\n\t\t}\n\n\t\tthis.locale = lang;\n\t\tdocument.querySelector('html').setAttribute('lang', lang);\n\t} catch (e) {\n\t\tconsole.error(`Failed to load language '${lang}'!`, e);\n\t}\n}\n\nVueI18n.prototype.loadLanguageSettings = async function() {\n\tlet settings = (await import(/* webpackIgnore: true */ \"../lang/settings.js\")).default;\n\tthis.languages = settings.languages;\n\tthis.setLanguage(settings.default);\n};\n\nVue.use(VueI18n);\n\nconst i18n = new VueI18n({\n\tlocale: 'fallback',\n\tfallbackLocale: 'fallback',\n\tsilentFallbackWarn: true,\n\tmessages: { fallback }\n});\n\nexport default i18n;\n","\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SettingsMenu.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SettingsMenu.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SettingsMenu.vue?vue&type=template&id=15966b59&\"\nimport script from \"./SettingsMenu.vue?vue&type=script&lang=js&\"\nexport * from \"./SettingsMenu.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport i18n from \"../i18n\";\n\nexport class MainMenu {\n\n static NULL_PAGE = {\n id: \"-\",\n title: \"-\"\n }\n\n constructor() {\n this.isOpen = false;\n this.pageStack = [];\n }\n\n currentPage() {\n if (this.pageStack.length === 0) return MainMenu.NULL_PAGE;\n return this.pageStack[this.pageStack.length - 1];\n }\n\n openPage(id = \"root\", title = () => i18n.t(\"menu.title\"), data = {}) {\n if (!this.isOpen){\n this.pageStack.splice(0, this.pageStack.length);\n this.isOpen = true;\n }\n\n if (typeof title === \"function\"){\n this.pageStack.push({\n id: id,\n get title(){ return title() },\n ...data\n });\n } else {\n this.pageStack.push({\n id: id,\n title: title,\n ...data\n });\n }\n\n }\n\n closePage() {\n this.pageStack.splice(this.pageStack.length - 1, 1);\n\n if (this.pageStack.length < 1) {\n this.isOpen = false\n }\n }\n\n reOpenPage() {\n if (this.pageStack.length === 0){\n this.openPage();\n } else if (this.pageStack[0].id !== 'root') {\n this.pageStack.splice(0, this.pageStack.length);\n this.openPage();\n } else {\n this.isOpen = true;\n }\n }\n\n closeAll() {\n this.isOpen = false;\n }\n\n}","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{staticClass:\"marker-sets\"},_vm._l((_vm.filteredMarkerSets),function(markerSet){return _c('MarkerSet',{key:markerSet.id,attrs:{\"marker-set\":markerSet},on:{\"more\":function($event){return _vm.openMore(markerSet)}}})}),1),(_vm.filteredMarkerSets.length > 0 & _vm.thisMarkerSet.markers.length > 0)?_c('hr'):_vm._e(),(_vm.thisMarkerSet.markers.length > 0)?_c('div',{staticClass:\"markers\"},[_c('TextInput',{attrs:{\"value\":_vm.filter.search,\"placeholder\":\"Search...\"},on:{\"input\":function($event){_vm.filter.search = $event.target.value}}}),_vm._l((_vm.filteredMarkers),function(marker){return _c('MarkerItem',{key:marker.id,attrs:{\"marker\":marker}})})],2):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"marker-item\",class:{'marker-hidden': !_vm.marker.visible}},[_c('div',{staticClass:\"marker-button\",attrs:{\"title\":_vm.marker.id},on:{\"click\":function($event){return _vm.click(false)}}},[(_vm.marker.type === 'player')?_c('div',{staticClass:\"icon\"},[_c('img',{attrs:{\"src\":'assets/playerheads/' + _vm.marker.playerUuid + '.png',\"alt\":\"playerhead\"},on:{\"error\":_vm.steve}})]):_vm._e(),_c('div',{staticClass:\"info\"},[_c('div',{staticClass:\"label\"},[_vm._v(_vm._s(_vm.markerLabel))]),_c('div',{staticClass:\"stats\"},[(_vm.appState.debug)?_c('div',[_vm._v(\" \"+_vm._s(_vm.marker.type)+\"-marker \")]):_vm._e(),_c('div',[_vm._v(\" (\"+_vm._s(_vm._f(\"position\")(_vm.marker.position.x))+\" | \"+_vm._s(_vm._f(\"position\")(_vm.marker.position.y))+\" | \"+_vm._s(_vm._f(\"position\")(_vm.marker.position.z))+\") \")])])])]),(_vm.marker.type === 'player')?_c('div',{staticClass:\"follow-player-button\",class:{active: _vm.controls.controls.followingPlayer && _vm.controls.controls.followingPlayer.id === _vm.marker.id},attrs:{\"title\":\"Follow Player\"},on:{\"click\":function($event){return _vm.click(true)}}},[_c('svg',{attrs:{\"viewBox\":\"0 0 30 30\"}},[_c('circle',{attrs:{\"fill\":\"none\",\"stroke-width\":\"3\",\"stroke-miterlimit\":\"10\",\"cx\":\"15\",\"cy\":\"15\",\"r\":\"10.375\"}}),_c('line',{attrs:{\"fill\":\"none\",\"stroke-width\":\"3\",\"stroke-miterlimit\":\"10\",\"x1\":\"3.25\",\"y1\":\"15\",\"x2\":\"1.063\",\"y2\":\"15\"}}),_c('line',{attrs:{\"fill\":\"none\",\"stroke-width\":\"3\",\"stroke-miterlimit\":\"10\",\"x1\":\"15\",\"y1\":\"26.75\",\"x2\":\"15\",\"y2\":\"28.938\"}}),_c('line',{attrs:{\"fill\":\"none\",\"stroke-width\":\"3\",\"stroke-miterlimit\":\"10\",\"x1\":\"26.75\",\"y1\":\"15\",\"x2\":\"28.938\",\"y2\":\"15\"}}),_c('line',{attrs:{\"fill\":\"none\",\"stroke-width\":\"3\",\"stroke-miterlimit\":\"10\",\"x1\":\"15\",\"y1\":\"3.25\",\"x2\":\"15\",\"y2\":\"1.063\"}}),_c('circle',{attrs:{\"stroke\":\"none\",\"cx\":\"15\",\"cy\":\"15\",\"r\":\"6.042\"}})])]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MarkerItem.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MarkerItem.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./MarkerItem.vue?vue&type=template&id=1cb7e8e3&\"\nimport script from \"./MarkerItem.vue?vue&type=script&lang=js&\"\nexport * from \"./MarkerItem.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MarkerItem.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('input',{staticClass:\"text-input\",attrs:{\"type\":\"text\"},domProps:{\"value\":_vm.value},on:{\"input\":function($event){return _vm.$emit('input', $event)},\"keydown\":function($event){return $event.stopPropagation()}}})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TextInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TextInput.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TextInput.vue?vue&type=template&id=a1c45c0c&\"\nimport script from \"./TextInput.vue?vue&type=script&lang=js&\"\nexport * from \"./TextInput.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TextInput.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"marker-set\",attrs:{\"title\":_vm.markerSet.id}},[_c('div',{staticClass:\"info\",on:{\"click\":_vm.toggle}},[_c('div',{staticClass:\"marker-set-switch\"},[_c('div',{staticClass:\"label\"},[_vm._v(_vm._s(_vm.label))]),(_vm.markerSet.toggleable)?_c('SwitchHandle',{attrs:{\"on\":_vm.markerSet.visible}}):_vm._e()],1),_c('div',{staticClass:\"stats\"},[_c('div',[_vm._v(\" \"+_vm._s(_vm.markerSet.markers.length)+\" \"+_vm._s(_vm.$tc('markers.marker', _vm.markerSet.markers.length))+\" \")]),(_vm.filteredMarkerSets.length > 0)?_c('div',[_vm._v(\" \"+_vm._s(_vm.filteredMarkerSets.length)+\" \"+_vm._s(_vm.$tc('markers.markerSet', _vm.filteredMarkerSets.length))+\" \")]):_vm._e()])]),_c('div',{staticClass:\"open-menu-button\",on:{\"click\":function($event){return _vm.$emit('more', $event)}}},[_c('svg',{attrs:{\"viewBox\":\"0 0 30 30\"}},[_c('path',{attrs:{\"d\":\"M25.004,9.294c0,0.806-0.75,1.46-1.676,1.46H6.671c-0.925,0-1.674-0.654-1.674-1.46l0,0\\n\\tc0-0.807,0.749-1.461,1.674-1.461h16.657C24.254,7.833,25.004,8.487,25.004,9.294L25.004,9.294z\"}}),_c('path',{attrs:{\"d\":\"M25.004,20.706c0,0.807-0.75,1.461-1.676,1.461H6.671c-0.925,0-1.674-0.654-1.674-1.461l0,0\\n\\tc0-0.807,0.749-1.461,1.674-1.461h16.657C24.254,19.245,25.004,19.899,25.004,20.706L25.004,20.706z\"}})])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MarkerSet.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MarkerSet.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./MarkerSet.vue?vue&type=template&id=56f7b506&\"\nimport script from \"./MarkerSet.vue?vue&type=script&lang=js&\"\nexport * from \"./MarkerSet.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MarkerSet.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MarkerSetMenu.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MarkerSetMenu.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./MarkerSetMenu.vue?vue&type=template&id=d1f7b138&\"\nimport script from \"./MarkerSetMenu.vue?vue&type=script&lang=js&\"\nexport * from \"./MarkerSetMenu.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"map-button\",class:{selected: _vm.map.id === _vm.selectedMapId},attrs:{\"title\":_vm.map.id},on:{\"click\":function($event){return _vm.switchMap(_vm.map.id)}}},[_c('span',{staticClass:\"sky\",style:({color: 'rgb(' + _vm.map.skyColor.r * 255 + ',' + _vm.map.skyColor.g * 255 + ',' + _vm.map.skyColor.b * 255 + ')'})},[_vm._v(\"•\")]),_c('span',{staticClass:\"name\"},[_vm._v(_vm._s(_vm.map.name))])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MapButton.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MapButton.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./MapButton.vue?vue&type=template&id=5528b08c&\"\nimport script from \"./MapButton.vue?vue&type=script&lang=js&\"\nexport * from \"./MapButton.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MapButton.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MainMenu.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MainMenu.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./MainMenu.vue?vue&type=template&id=bd5a469a&\"\nimport script from \"./MainMenu.vue?vue&type=script&lang=js&\"\nexport * from \"./MainMenu.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MainMenu.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:{disabled: !_vm.enabled},attrs:{\"id\":\"ff-mobile-controls\"}},[_c('div',{staticClass:\"move-fields\"},[_c('div',{staticClass:\"button up-button\",on:{\"touchstart\":function($event){_vm.forward = 1; _vm.forwardPointer = $event.changedTouches[0].identifier; $event.preventDefault();}}},[_c('svg',{attrs:{\"viewBox\":\"0 0 100 50\"}},[_c('path',{attrs:{\"d\":\"M6.75,48.375c-2.75,0-3.384-1.565-1.409-3.479L46.41,5.104c1.975-1.914,5.207-1.913,7.182,0l41.067,39.792\\n c1.975,1.914,1.341,3.479-1.409,3.479H6.75z\"}})])]),_c('div',{staticClass:\"button down-button\",on:{\"touchstart\":function($event){_vm.forward = -1; _vm.forwardPointer = $event.changedTouches[0].identifier; $event.preventDefault();}}},[_c('svg',{staticClass:\"down\",attrs:{\"viewBox\":\"0 0 100 50\"}},[_c('path',{attrs:{\"d\":\"M6.75,48.375c-2.75,0-3.384-1.565-1.409-3.479L46.41,5.104c1.975-1.914,5.207-1.913,7.182,0l41.067,39.792\\n c1.975,1.914,1.341,3.479-1.409,3.479H6.75z\"}})])])]),_c('div',{staticClass:\"height-fields\"},[_c('div',{staticClass:\"button up-button\",on:{\"touchstart\":function($event){_vm.up = 1; _vm.upPointer = $event.changedTouches[0].identifier; $event.preventDefault();}}},[_c('svg',{attrs:{\"viewBox\":\"0 0 100 50\"}},[_c('path',{attrs:{\"d\":\"M6.75,48.375c-2.75,0-3.384-1.565-1.409-3.479L46.41,5.104c1.975-1.914,5.207-1.913,7.182,0l41.067,39.792\\n c1.975,1.914,1.341,3.479-1.409,3.479H6.75z\"}})])]),_c('div',{staticClass:\"button down-button\",on:{\"touchstart\":function($event){_vm.up = -1; _vm.upPointer = $event.changedTouches[0].identifier; $event.preventDefault();}}},[_c('svg',{staticClass:\"down\",attrs:{\"viewBox\":\"0 0 100 50\"}},[_c('path',{attrs:{\"d\":\"M6.75,48.375c-2.75,0-3.384-1.565-1.409-3.479L46.41,5.104c1.975-1.914,5.207-1.913,7.182,0l41.067,39.792\\n c1.975,1.914,1.341,3.479-1.409,3.479H6.75z\"}})])])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FreeFlightMobileControls.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FreeFlightMobileControls.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./FreeFlightMobileControls.vue?vue&type=template&id=3e2107aa&\"\nimport script from \"./FreeFlightMobileControls.vue?vue&type=script&lang=js&\"\nexport * from \"./FreeFlightMobileControls.vue?vue&type=script&lang=js&\"\nimport style0 from \"./FreeFlightMobileControls.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\n\n\n\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=bb279048&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nexport class Tile {\n\n /**\n * @param x {number}\n * @param z {number}\n * @param onLoad {function(Tile)}\n * @param onUnload {function(Tile)}\n */\n constructor(x, z, onLoad, onUnload) {\n Object.defineProperty( this, 'isTile', { value: true } );\n\n /** @type {THREE.Mesh} */\n this.model = null;\n\n this.onLoad = onLoad;\n this.onUnload = onUnload;\n\n this.x = x;\n this.z = z;\n\n this.unloaded = true;\n this.loading = false;\n }\n\n /**\n * @param tileLoader {TileLoader}\n * @returns {Promise}\n */\n load(tileLoader) {\n if (this.loading) return Promise.reject(\"tile is already loading!\");\n this.loading = true;\n\n this.unload();\n\n this.unloaded = false;\n return tileLoader.load(this.x, this.z)\n .then(model => {\n if (this.unloaded){\n model.geometry.dispose();\n return;\n }\n\n this.model = model;\n this.onLoad(this);\n })\n .finally(() => {\n this.loading = false;\n });\n }\n\n unload() {\n this.unloaded = true;\n if (this.model) {\n this.onUnload(this);\n\n this.model.geometry.dispose();\n this.model = null;\n }\n }\n\n /**\n * @returns {boolean}\n */\n get loaded() {\n return !!this.model;\n }\n}\n","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport {ClampToEdgeWrapping, LinearFilter, Texture} from \"three\";\n\nexport class TileMap {\n\n static EMPTY = \"#000\";\n static LOADED = \"#fff\";\n\n /**\n * @param width {number}\n * @param height {number}\n */\n constructor(width, height) {\n this.canvas = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas');\n this.canvas.width = width;\n this.canvas.height = height;\n\n /**\n * @type CanvasRenderingContext2D\n */\n this.tileMapContext = this.canvas.getContext('2d', {\n alpha: false,\n willReadFrequently: true,\n });\n\n this.texture = new Texture(this.canvas);\n this.texture.generateMipmaps = false;\n this.texture.magFilter = LinearFilter;\n this.texture.minFilter = LinearFilter;\n this.texture.wrapS = ClampToEdgeWrapping;\n this.texture.wrapT = ClampToEdgeWrapping;\n this.texture.flipY = false;\n this.texture.needsUpdate = true;\n }\n\n /**\n * @param state {string}\n */\n setAll(state) {\n this.tileMapContext.fillStyle = state;\n this.tileMapContext.fillRect(0, 0, this.canvas.width, this.canvas.height);\n\n this.texture.needsUpdate = true;\n }\n\n /**\n * @param x {number}\n * @param z {number}\n * @param state {string}\n */\n setTile(x, z, state) {\n this.tileMapContext.fillStyle = state;\n this.tileMapContext.fillRect(x, z, 1, 1);\n\n this.texture.needsUpdate = true;\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport { Vector2 } from 'three';\nimport { Tile } from './Tile.js';\nimport {alert, hashTile} from '../util/Utils.js';\nimport {TileMap} from \"./TileMap\";\n\nexport class TileManager {\n\n static tileMapSize = 100;\n static tileMapHalfSize = TileManager.tileMapSize / 2;\n\n /**\n * @param scene {THREE.Scene}\n * @param tileLoader {TileLoader}\n * @param onTileLoad {function(Tile)}\n * @param onTileUnload {function(Tile)}\n * @param events {EventTarget}\n */\n constructor(scene, tileLoader, onTileLoad = null, onTileUnload = null, events = null) {\n Object.defineProperty( this, 'isTileManager', { value: true } );\n\n this.events = events;\n this.scene = scene;\n this.tileLoader = tileLoader;\n\n this.onTileLoad = onTileLoad || function(){};\n this.onTileUnload = onTileUnload || function(){};\n\n this.viewDistanceX = 1;\n this.viewDistanceZ = 1;\n this.centerTile = new Vector2(0, 0);\n\n this.currentlyLoading = 0;\n this.loadTimeout = null;\n\n //map of loaded tiles\n this.tiles = new Map();\n\n // a canvas that keeps track of the loaded tiles, used for shaders\n this.tileMap = new TileMap(TileManager.tileMapSize, TileManager.tileMapSize);\n\n this.unloaded = true;\n }\n\n /**\n * @param x {number}\n * @param z {number}\n * @param viewDistanceX {number}\n * @param viewDistanceZ {number}\n */\n loadAroundTile(x, z, viewDistanceX, viewDistanceZ) {\n this.unloaded = false;\n\n let unloadTiles = false;\n if (this.viewDistanceX > viewDistanceX || this.viewDistanceZ > viewDistanceZ) {\n unloadTiles = true;\n }\n\n this.viewDistanceX = viewDistanceX;\n this.viewDistanceZ = viewDistanceZ;\n\n if (unloadTiles || this.centerTile.x !== x || this.centerTile.y !== z) {\n this.centerTile.set(x, z);\n this.removeFarTiles();\n\n this.tileMap.setAll(TileMap.EMPTY);\n this.tiles.forEach(tile => {\n if (!tile.loading) {\n this.tileMap.setTile(tile.x - this.centerTile.x + TileManager.tileMapHalfSize, tile.z - this.centerTile.y + TileManager.tileMapHalfSize, TileMap.LOADED);\n }\n });\n }\n\n this.loadCloseTiles();\n }\n\n unload() {\n this.unloaded = true;\n this.removeAllTiles();\n }\n\n removeFarTiles() {\n this.tiles.forEach((tile, hash, map) => {\n if (\n tile.x + this.viewDistanceX < this.centerTile.x ||\n tile.x - this.viewDistanceX > this.centerTile.x ||\n tile.z + this.viewDistanceZ < this.centerTile.y ||\n tile.z - this.viewDistanceZ > this.centerTile.y\n ) {\n tile.unload();\n map.delete(hash);\n }\n });\n }\n\n removeAllTiles() {\n this.tileMap.setAll(TileMap.EMPTY);\n\n this.tiles.forEach(tile => {\n tile.unload();\n });\n this.tiles.clear();\n }\n\n loadCloseTiles = () => {\n if (this.unloaded) return;\n if (!this.loadNextTile()) return;\n\n if (this.loadTimeout) clearTimeout(this.loadTimeout);\n\n if (this.currentlyLoading < 8) {\n this.loadTimeout = setTimeout(this.loadCloseTiles, 0);\n } else {\n this.loadTimeout = setTimeout(this.loadCloseTiles, 1000);\n }\n }\n\n /**\n * @returns {boolean}\n */\n loadNextTile() {\n if (this.unloaded) return false;\n\n let x = 0;\n let z = 0;\n let d = 1;\n let m = 1;\n\n while (m < Math.max(this.viewDistanceX, this.viewDistanceZ) * 2 + 1) {\n while (2 * x * d < m) {\n if (this.tryLoadTile(this.centerTile.x + x, this.centerTile.y + z)) return true;\n x = x + d;\n }\n while (2 * z * d < m) {\n if (this.tryLoadTile(this.centerTile.x + x, this.centerTile.y + z)) return true;\n z = z + d;\n }\n d = -1 * d;\n m = m + 1;\n }\n\n return false;\n }\n\n /**\n * @param x {number}\n * @param z {number}\n * @returns {boolean}\n */\n tryLoadTile(x, z) {\n if (this.unloaded) return false;\n\n if (Math.abs(x - this.centerTile.x) > this.viewDistanceX) return false;\n if (Math.abs(z - this.centerTile.y) > this.viewDistanceZ) return false;\n\n let tileHash = hashTile(x, z);\n\n let tile = this.tiles.get(tileHash);\n if (tile !== undefined) return false;\n\n this.currentlyLoading++;\n\n tile = new Tile(x, z, this.handleLoadedTile, this.handleUnloadedTile);\n this.tiles.set(tileHash, tile);\n tile.load(this.tileLoader)\n .then(() => {\n this.tileMap.setTile(tile.x - this.centerTile.x + TileManager.tileMapHalfSize, tile.z - this.centerTile.y + TileManager.tileMapHalfSize, TileMap.LOADED);\n\n if (this.loadTimeout) clearTimeout(this.loadTimeout);\n this.loadTimeout = setTimeout(this.loadCloseTiles, 0);\n })\n .catch(error => {\n if (error.status && error.status === \"empty\") return;\n if (error.target && error.target.status === 404) return;\n if (error.type && error.type === \"abort\") return;\n\n alert(this.events, \"Failed to load tile: \" + error, \"warning\");\n })\n .finally(() => {\n this.tileMap.setTile(tile.x - this.centerTile.x + TileManager.tileMapHalfSize, tile.z - this.centerTile.y + TileManager.tileMapHalfSize, TileMap.LOADED);\n this.currentlyLoading--;\n });\n\n return true;\n }\n\n handleLoadedTile = tile => {\n //this.tileMap.setTile(tile.x - this.centerTile.x + TileManager.tileMapHalfSize, tile.z - this.centerTile.y + TileManager.tileMapHalfSize, TileMap.LOADED);\n\n this.scene.add(tile.model);\n this.onTileLoad(tile);\n }\n\n handleUnloadedTile = tile => {\n this.tileMap.setTile(tile.x - this.centerTile.x + TileManager.tileMapHalfSize, tile.z - this.centerTile.y + TileManager.tileMapHalfSize, TileMap.EMPTY);\n\n this.scene.remove(tile.model);\n this.onTileUnload(tile);\n }\n}\n","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport {pathFromCoords} from \"../util/Utils\";\nimport {BufferGeometryLoader, FileLoader, Mesh} from \"three\";\n\nexport class TileLoader {\n\n /**\n * @param tilePath {string}\n * @param material {THREE.Material | THREE.Material[]}\n * @param tileSettings {{\n * tileSize: {x: number, z: number},\n *\t scale: {x: number, z: number},\n * translate: {x: number, z: number}\n * }}\n * @param tileCacheHash {number}\n * @param layer {number}\n */\n constructor(tilePath, material, tileSettings, tileCacheHash = 0, layer = 0) {\n Object.defineProperty( this, 'isTileLoader', { value: true } );\n\n this.tilePath = tilePath;\n this.material = material;\n this.tileSettings = tileSettings;\n\n this.layer = layer;\n\n this.tileCacheHash = tileCacheHash;\n\n this.fileLoader = new FileLoader();\n this.fileLoader.setResponseType('json');\n\n this.bufferGeometryLoader = new BufferGeometryLoader();\n }\n\n load = (tileX, tileZ) => {\n let tileUrl = this.tilePath + pathFromCoords(tileX, tileZ) + '.json';\n\n return new Promise((resolve, reject) => {\n this.fileLoader.load(tileUrl + '?' + this.tileCacheHash,\n geometryJson => {\n if (!geometryJson.type || geometryJson.type !== 'BufferGeometry'){\n reject({status: \"empty\"});\n return;\n }\n\n let geometry = this.bufferGeometryLoader.parse(geometryJson);\n\n let object = new Mesh(geometry, this.material);\n if (this.layer) object.layers.set(this.layer);\n\n let tileSize = this.tileSettings.tileSize;\n let translate = this.tileSettings.translate;\n let scale = this.tileSettings.scale;\n object.position.set(tileX * tileSize.x + translate.x, 0, tileZ * tileSize.z + translate.z);\n object.scale.set(scale.x, 1, scale.z);\n\n object.userData.tileUrl = tileUrl;\n\n object.updateMatrixWorld(true);\n\n resolve(object);\n },\n () => {},\n reject\n );\n });\n }\n\n}\n","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport {Scene} from \"three\";\n\nexport class MarkerSet extends Scene {\n\n /**\n * @param id {string}\n */\n constructor(id) {\n super();\n Object.defineProperty(this, 'isMarkerSet', {value: true});\n\n this.data = {\n id: id,\n label: id,\n toggleable: true,\n defaultHide: false,\n markerSets: [],\n markers: [],\n visible: this.visible,\n };\n\n Object.defineProperty(this, \"visible\", {\n get() { return this.data.visible },\n set(value) { this.data.visible = value }\n });\n }\n\n add(...object) {\n if (object.length === 1) { //super.add() will re-invoke this method for each array-entry if its more than one\n let o = object[0];\n if (o.isMarkerSet) {\n this.data.markerSets.push(o.data);\n }\n if (o.isMarker) {\n this.data.markers.push(o.data);\n }\n }\n\n return super.add(...object);\n }\n\n remove(...object) {\n if (object.length === 1) { //super.remove() will re-invoke this method for each array-entry if its more than one\n let o = object[0];\n if (o.isMarkerSet) {\n let i = this.data.markerSets.indexOf(o.data);\n if (i > -1) this.data.markerSets.splice(i, 1);\n }\n if (o.isMarker) {\n let i = this.data.markers.indexOf(o.data);\n if (i > -1) this.data.markers.splice(i, 1);\n }\n }\n\n return super.remove(...object);\n }\n\n dispose() {\n this.children.forEach(child => {\n if (child.dispose) child.dispose();\n });\n }\n\n}","import {\n\tShaderLib,\n\tShaderMaterial,\n\tUniformsLib,\n\tUniformsUtils,\n\tVector2\n} from \"three\";\n/**\n * parameters = {\n * color: ,\n * linewidth: ,\n * dashed: ,\n * dashScale: ,\n * dashSize: ,\n * gapSize: ,\n * resolution: , // to be set by renderer\n * }\n */\n\nUniformsLib.line = {\n\n\tlinewidth: { value: 1 },\n\tresolution: { value: new Vector2( 1, 1 ) },\n\tdashScale: { value: 1 },\n\tdashSize: { value: 1 },\n\tgapSize: { value: 1 }, // todo FIX - maybe change to totalSize\n\topacity: { value: 1 }\n\n};\n\nShaderLib[ 'line' ] = {\n\n\tuniforms: UniformsUtils.merge( [\n\t\tUniformsLib.common,\n\t\tUniformsLib.fog,\n\t\tUniformsLib.line\n\t] ),\n\n\tvertexShader:\n\t\t`\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\n\t\tuniform float linewidth;\n\t\tuniform vec2 resolution;\n\n\t\tattribute vec3 instanceStart;\n\t\tattribute vec3 instanceEnd;\n\n\t\tattribute vec3 instanceColorStart;\n\t\tattribute vec3 instanceColorEnd;\n\n\t\tvarying vec2 vUv;\n\t\t\n\t\tvarying float vDistance;\n\n\t\t#ifdef USE_DASH\n\n\t\t\tuniform float dashScale;\n\t\t\tattribute float instanceDistanceStart;\n\t\t\tattribute float instanceDistanceEnd;\n\t\t\tvarying float vLineDistance;\n\n\t\t#endif\n\n\t\tvoid trimSegment( const in vec4 start, inout vec4 end ) {\n\n\t\t\t// trim end segment so it terminates between the camera plane and the near plane\n\n\t\t\t// conservative estimate of the near plane\n\t\t\tfloat a = projectionMatrix[ 2 ][ 2 ]; // 3nd entry in 3th column\n\t\t\tfloat b = projectionMatrix[ 3 ][ 2 ]; // 3nd entry in 4th column\n\t\t\tfloat nearEstimate = - 0.5 * b / a;\n\n\t\t\tfloat alpha = ( nearEstimate - start.z ) / ( end.z - start.z );\n\n\t\t\tend.xyz = mix( start.xyz, end.xyz, alpha );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\t#ifdef USE_COLOR\n\n\t\t\t\tvColor.xyz = ( position.y < 0.5 ) ? instanceColorStart : instanceColorEnd;\n\n\t\t\t#endif\n\n\t\t\t#ifdef USE_DASH\n\n\t\t\t\tvLineDistance = ( position.y < 0.5 ) ? dashScale * instanceDistanceStart : dashScale * instanceDistanceEnd;\n\n\t\t\t#endif\n\n\t\t\tfloat aspect = resolution.x / resolution.y;\n\n\t\t\tvUv = uv;\n\n\t\t\t// camera space\n\t\t\tvec4 start = modelViewMatrix * vec4( instanceStart, 1.0 );\n\t\t\tvec4 end = modelViewMatrix * vec4( instanceEnd, 1.0 );\n\n\t\t\t// special case for perspective projection, and segments that terminate either in, or behind, the camera plane\n\t\t\t// clearly the gpu firmware has a way of addressing this issue when projecting into ndc space\n\t\t\t// but we need to perform ndc-space calculations in the shader, so we must address this issue directly\n\t\t\t// perhaps there is a more elegant solution -- WestLangley\n\n\t\t\tbool perspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 ); // 4th entry in the 3rd column\n\n\t\t\tif ( perspective ) {\n\n\t\t\t\tif ( start.z < 0.0 && end.z >= 0.0 ) {\n\n\t\t\t\t\ttrimSegment( start, end );\n\n\t\t\t\t} else if ( end.z < 0.0 && start.z >= 0.0 ) {\n\n\t\t\t\t\ttrimSegment( end, start );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// clip space\n\t\t\tvec4 clipStart = projectionMatrix * start;\n\t\t\tvec4 clipEnd = projectionMatrix * end;\n\n\t\t\t// ndc space\n\t\t\tvec2 ndcStart = clipStart.xy / clipStart.w;\n\t\t\tvec2 ndcEnd = clipEnd.xy / clipEnd.w;\n\n\t\t\t// direction\n\t\t\tvec2 dir = ndcEnd - ndcStart;\n\n\t\t\t// account for clip-space aspect ratio\n\t\t\tdir.x *= aspect;\n\t\t\tdir = normalize( dir );\n\n\t\t\t// perpendicular to dir\n\t\t\tvec2 offset = vec2( dir.y, - dir.x );\n\n\t\t\t// undo aspect ratio adjustment\n\t\t\tdir.x /= aspect;\n\t\t\toffset.x /= aspect;\n\n\t\t\t// sign flip\n\t\t\tif ( position.x < 0.0 ) offset *= - 1.0;\n\n\t\t\t// endcaps\n\t\t\tif ( position.y < 0.0 ) {\n\n\t\t\t\toffset += - dir;\n\n\t\t\t} else if ( position.y > 1.0 ) {\n\n\t\t\t\toffset += dir;\n\n\t\t\t}\n\n\t\t\t// adjust for linewidth\n\t\t\toffset *= linewidth;\n\n\t\t\t// adjust for clip-space to screen-space conversion // maybe resolution should be based on viewport ...\n\t\t\toffset /= resolution.y;\n\n\t\t\t// select end\n\t\t\tvec4 clip = ( position.y < 0.5 ) ? clipStart : clipEnd;\n\n\t\t\t// back to clip space\n\t\t\toffset *= clip.w;\n\n\t\t\tclip.xy += offset;\n\n\t\t\tgl_Position = clip;\n\n\t\t\tvec4 mvPosition = ( position.y < 0.5 ) ? start : end; // this is an approximation\n\t\t\t\n\t\t\tvDistance = -mvPosition.z;\n\n\t\t\t#include \n\t\t\t#include \n\t\t\t#include \n\n\t\t}\n\t\t`,\n\n\tfragmentShader:\n\t\t`\n\t\t#define FLT_MAX 3.402823466e+38\n\n\t\tuniform vec3 diffuse;\n\t\tuniform float opacity;\n\t\t\n\t\tuniform float fadeDistanceMax;\n\t\tuniform float fadeDistanceMin;\n\n\t\t#ifdef USE_DASH\n\n\t\t\tuniform float dashSize;\n\t\t\tuniform float gapSize;\n\n\t\t#endif\n\n\t\tvarying float vLineDistance;\n\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\n\t\tvarying vec2 vUv;\n\t\t\n\t\tvarying float vDistance;\n\n\t\tvoid main() {\n\n\t\t\t#include \n\n\t\t\t#ifdef USE_DASH\n\n\t\t\t\tif ( vUv.y < - 1.0 || vUv.y > 1.0 ) discard; // discard endcaps\n\n\t\t\t\tif ( mod( vLineDistance, dashSize + gapSize ) > dashSize ) discard; // todo - FIX\n\n\t\t\t#endif\n\n\t\t\tif ( abs( vUv.y ) > 1.0 ) {\n\n\t\t\t\tfloat a = vUv.x;\n\t\t\t\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\n\t\t\t\tfloat len2 = a * a + b * b;\n\n\t\t\t\tif ( len2 > 1.0 ) discard;\n\n\t\t\t}\n\n\t\t\t// distance fading\n\t\t\tfloat fdMax = FLT_MAX;\n\t\t\tif ( fadeDistanceMax > 0.0 ) fdMax = fadeDistanceMax;\n\t\t\t\n\t\t\tfloat minDelta = (vDistance - fadeDistanceMin) / fadeDistanceMin;\n\t\t\tfloat maxDelta = (vDistance - fadeDistanceMax) / (fadeDistanceMax * 0.5);\n\t\t\tfloat distanceOpacity = min(\n\t\t\t\tclamp(minDelta, 0.0, 1.0),\n\t\t\t\t1.0 - clamp(maxDelta + 1.0, 0.0, 1.0)\n\t\t\t);\n\n\t\t\tvec4 diffuseColor = vec4( diffuse, opacity * distanceOpacity );\n\n\t\t\t#include \n\t\t\t#include \n\n\t\t\tgl_FragColor = vec4( diffuseColor.rgb, diffuseColor.a );\n\n\t\t\t#include \n\t\t\t#include \n\t\t\t#include \n\t\t\t#include \n\n\t\t}\n\t\t`\n};\n\nvar LineMaterial = function ( parameters ) {\n\n\tShaderMaterial.call( this, {\n\n\t\ttype: 'LineMaterial',\n\n\t\tuniforms: UniformsUtils.clone( ShaderLib[ 'line' ].uniforms ),\n\n\t\tvertexShader: ShaderLib[ 'line' ].vertexShader,\n\t\tfragmentShader: ShaderLib[ 'line' ].fragmentShader,\n\n\t\tclipping: true // required for clipping support\n\n\t} );\n\n\tthis.dashed = false;\n\n\tObject.defineProperties( this, {\n\n\t\tcolor: {\n\n\t\t\tenumerable: true,\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.uniforms.diffuse.value;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis.uniforms.diffuse.value = value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tlinewidth: {\n\n\t\t\tenumerable: true,\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.uniforms.linewidth.value;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis.uniforms.linewidth.value = value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tdashScale: {\n\n\t\t\tenumerable: true,\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.uniforms.dashScale.value;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis.uniforms.dashScale.value = value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tdashSize: {\n\n\t\t\tenumerable: true,\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.uniforms.dashSize.value;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis.uniforms.dashSize.value = value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgapSize: {\n\n\t\t\tenumerable: true,\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.uniforms.gapSize.value;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis.uniforms.gapSize.value = value;\n\n\t\t\t}\n\n\t\t},\n\n\t\topacity: {\n\n\t\t\tenumerable: true,\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.uniforms.opacity.value;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis.uniforms.opacity.value = value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tresolution: {\n\n\t\t\tenumerable: true,\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.uniforms.resolution.value;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis.uniforms.resolution.value.copy( value );\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\tthis.setValues( parameters );\n\n};\n\nLineMaterial.prototype = Object.create( ShaderMaterial.prototype );\nLineMaterial.prototype.constructor = LineMaterial;\n\nLineMaterial.prototype.isLineMaterial = true;\n\nexport { LineMaterial };\n","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the 'Software'), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport { ShaderChunk } from 'three';\n\nexport const MARKER_FILL_VERTEX_SHADER = `\n#include \n${ShaderChunk.logdepthbuf_pars_vertex}\n\nvarying vec3 vPosition;\n//varying vec3 vWorldPosition;\n//varying vec3 vNormal;\n//varying vec2 vUv;\n//varying vec3 vColor;\nvarying float vDistance;\n\nvoid main() {\n\tvec4 worldPos = modelMatrix * vec4(position, 1);\n\tvec4 viewPos = viewMatrix * worldPos;\n\t\n\tvPosition = position;\n\t//vWorldPosition = worldPos.xyz;\n\t//vNormal = normal;\n\t//vUv = uv;\n\t//vColor = vec3(1.0);\n\tvDistance = -viewPos.z;\n\t\n\tgl_Position = projectionMatrix * viewPos;\n\t\n\t${ShaderChunk.logdepthbuf_vertex} \n}\n`;\n","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the 'Software'), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport { ShaderChunk } from 'three';\n\nexport const MARKER_FILL_FRAGMENT_SHADER = `\n${ShaderChunk.logdepthbuf_pars_fragment}\n\n#define FLT_MAX 3.402823466e+38\n\nvarying vec3 vPosition;\n//varying vec3 vWorldPosition;\n//varying vec3 vNormal;\n//varying vec2 vUv;\n//varying vec3 vColor;\nvarying float vDistance;\n\nuniform vec3 markerColor;\nuniform float markerOpacity;\n\nuniform float fadeDistanceMax;\nuniform float fadeDistanceMin;\n\nvoid main() {\n\tvec4 color = vec4(markerColor, markerOpacity);\n\t\n\t// distance fading\n\tfloat fdMax = FLT_MAX;\n\tif ( fadeDistanceMax > 0.0 ) fdMax = fadeDistanceMax;\n\t\n\tfloat minDelta = (vDistance - fadeDistanceMin) / fadeDistanceMin;\n\tfloat maxDelta = (vDistance - fadeDistanceMax) / (fadeDistanceMax * 0.5);\n\tfloat distanceOpacity = min(\n\t\tclamp(minDelta, 0.0, 1.0),\n\t\t1.0 - clamp(maxDelta + 1.0, 0.0, 1.0)\n\t);\n\t\n\tcolor.a *= distanceOpacity;\n\t\n\t// apply vertex-color\n\t//color.rgb *= vColor.rgb;\n\t\n\tgl_FragColor = color;\n\t\n\t${ShaderChunk.logdepthbuf_fragment}\n}\n`;\n","import {\n\tBox3,\n\tFloat32BufferAttribute,\n\tInstancedBufferGeometry,\n\tInstancedInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tSphere,\n\tVector3,\n\tWireframeGeometry\n} from \"three\";\n\nvar LineSegmentsGeometry = function () {\n\n\tInstancedBufferGeometry.call( this );\n\n\tthis.type = 'LineSegmentsGeometry';\n\n\tvar positions = [ - 1, 2, 0, 1, 2, 0, - 1, 1, 0, 1, 1, 0, - 1, 0, 0, 1, 0, 0, - 1, - 1, 0, 1, - 1, 0 ];\n\tvar uvs = [ - 1, 2, 1, 2, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 2, 1, - 2 ];\n\tvar index = [ 0, 2, 1, 2, 3, 1, 2, 4, 3, 4, 5, 3, 4, 6, 5, 6, 7, 5 ];\n\n\tthis.setIndex( index );\n\tthis.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n};\n\nLineSegmentsGeometry.prototype = Object.assign( Object.create( InstancedBufferGeometry.prototype ), {\n\n\tconstructor: LineSegmentsGeometry,\n\n\tisLineSegmentsGeometry: true,\n\n\tapplyMatrix4: function ( matrix ) {\n\n\t\tvar start = this.attributes.instanceStart;\n\t\tvar end = this.attributes.instanceEnd;\n\n\t\tif ( start !== undefined ) {\n\n\t\t\tstart.applyMatrix4( matrix );\n\n\t\t\tend.applyMatrix4( matrix );\n\n\t\t\tstart.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetPositions: function ( array ) {\n\n\t\tvar lineSegments;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\tlineSegments = array;\n\n\t\t} else if ( Array.isArray( array ) ) {\n\n\t\t\tlineSegments = new Float32Array( array );\n\n\t\t}\n\n\t\tvar instanceBuffer = new InstancedInterleavedBuffer( lineSegments, 6, 1 ); // xyz, xyz\n\n\t\tthis.setAttribute( 'instanceStart', new InterleavedBufferAttribute( instanceBuffer, 3, 0 ) ); // xyz\n\t\tthis.setAttribute( 'instanceEnd', new InterleavedBufferAttribute( instanceBuffer, 3, 3 ) ); // xyz\n\n\t\t//\n\n\t\tthis.computeBoundingBox();\n\t\tthis.computeBoundingSphere();\n\n\t\treturn this;\n\n\t},\n\n\tsetColors: function ( array ) {\n\n\t\tvar colors;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\tcolors = array;\n\n\t\t} else if ( Array.isArray( array ) ) {\n\n\t\t\tcolors = new Float32Array( array );\n\n\t\t}\n\n\t\tvar instanceColorBuffer = new InstancedInterleavedBuffer( colors, 6, 1 ); // rgb, rgb\n\n\t\tthis.setAttribute( 'instanceColorStart', new InterleavedBufferAttribute( instanceColorBuffer, 3, 0 ) ); // rgb\n\t\tthis.setAttribute( 'instanceColorEnd', new InterleavedBufferAttribute( instanceColorBuffer, 3, 3 ) ); // rgb\n\n\t\treturn this;\n\n\t},\n\n\tfromWireframeGeometry: function ( geometry ) {\n\n\t\tthis.setPositions( geometry.attributes.position.array );\n\n\t\treturn this;\n\n\t},\n\n\tfromEdgesGeometry: function ( geometry ) {\n\n\t\tthis.setPositions( geometry.attributes.position.array );\n\n\t\treturn this;\n\n\t},\n\n\tfromMesh: function ( mesh ) {\n\n\t\tthis.fromWireframeGeometry( new WireframeGeometry( mesh.geometry ) );\n\n\t\t// set colors, maybe\n\n\t\treturn this;\n\n\t},\n\n\tfromLineSegments: function ( lineSegments ) {\n\n\t\tvar geometry = lineSegments.geometry;\n\n\t\tif ( geometry.isGeometry ) {\n\n\t\t\tthis.setPositions( geometry.vertices );\n\n\t\t} else if ( geometry.isBufferGeometry ) {\n\n\t\t\tthis.setPositions( geometry.attributes.position.array ); // assumes non-indexed\n\n\t\t}\n\n\t\t// set colors, maybe\n\n\t\treturn this;\n\n\t},\n\n\tcomputeBoundingBox: function () {\n\n\t\tvar box = new Box3();\n\n\t\treturn function computeBoundingBox() {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tvar start = this.attributes.instanceStart;\n\t\t\tvar end = this.attributes.instanceEnd;\n\n\t\t\tif ( start !== undefined && end !== undefined ) {\n\n\t\t\t\tthis.boundingBox.setFromBufferAttribute( start );\n\n\t\t\t\tbox.setFromBufferAttribute( end );\n\n\t\t\t\tthis.boundingBox.union( box );\n\n\t\t\t}\n\n\t\t};\n\n\t}(),\n\n\tcomputeBoundingSphere: function () {\n\n\t\tvar vector = new Vector3();\n\n\t\treturn function computeBoundingSphere() {\n\n\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tvar start = this.attributes.instanceStart;\n\t\t\tvar end = this.attributes.instanceEnd;\n\n\t\t\tif ( start !== undefined && end !== undefined ) {\n\n\t\t\t\tvar center = this.boundingSphere.center;\n\n\t\t\t\tthis.boundingBox.getCenter( center );\n\n\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\tfor ( var i = 0, il = start.count; i < il; i ++ ) {\n\n\t\t\t\t\tvector.fromBufferAttribute( start, i );\n\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );\n\n\t\t\t\t\tvector.fromBufferAttribute( end, i );\n\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\t\tconsole.error( 'THREE.LineSegmentsGeometry.computeBoundingSphere(): Computed radius is NaN. The instanced position data is likely to have NaN values.', this );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t}(),\n\n\ttoJSON: function () {\n\n\t\t// todo\n\n\t},\n\n\tapplyMatrix: function ( matrix ) {\n\n\t\tconsole.warn( 'THREE.LineSegmentsGeometry: applyMatrix() has been renamed to applyMatrix4().' );\n\n\t\treturn this.applyMatrix4( matrix );\n\n\t}\n\n} );\n\nexport { LineSegmentsGeometry };\n","\nimport { LineSegmentsGeometry } from \"./LineSegmentsGeometry\";\n\nvar LineGeometry = function () {\n\n\tLineSegmentsGeometry.call( this );\n\n\tthis.type = 'LineGeometry';\n\n};\n\nLineGeometry.prototype = Object.assign( Object.create( LineSegmentsGeometry.prototype ), {\n\n\tconstructor: LineGeometry,\n\n\tisLineGeometry: true,\n\n\tsetPositions: function ( array ) {\n\n\t\t// converts [ x1, y1, z1, x2, y2, z2, ... ] to pairs format\n\n\t\tvar length = array.length - 3;\n\t\tvar points = new Float32Array( 2 * length );\n\n\t\tfor ( var i = 0; i < length; i += 3 ) {\n\n\t\t\tpoints[ 2 * i ] = array[ i ];\n\t\t\tpoints[ 2 * i + 1 ] = array[ i + 1 ];\n\t\t\tpoints[ 2 * i + 2 ] = array[ i + 2 ];\n\n\t\t\tpoints[ 2 * i + 3 ] = array[ i + 3 ];\n\t\t\tpoints[ 2 * i + 4 ] = array[ i + 4 ];\n\t\t\tpoints[ 2 * i + 5 ] = array[ i + 5 ];\n\n\t\t}\n\n\t\tLineSegmentsGeometry.prototype.setPositions.call( this, points );\n\n\t\treturn this;\n\n\t},\n\n\tsetColors: function ( array ) {\n\n\t\t// converts [ r1, g1, b1, r2, g2, b2, ... ] to pairs format\n\n\t\tvar length = array.length - 3;\n\t\tvar colors = new Float32Array( 2 * length );\n\n\t\tfor ( var i = 0; i < length; i += 3 ) {\n\n\t\t\tcolors[ 2 * i ] = array[ i ];\n\t\t\tcolors[ 2 * i + 1 ] = array[ i + 1 ];\n\t\t\tcolors[ 2 * i + 2 ] = array[ i + 2 ];\n\n\t\t\tcolors[ 2 * i + 3 ] = array[ i + 3 ];\n\t\t\tcolors[ 2 * i + 4 ] = array[ i + 4 ];\n\t\t\tcolors[ 2 * i + 5 ] = array[ i + 5 ];\n\n\t\t}\n\n\t\tLineSegmentsGeometry.prototype.setColors.call( this, colors );\n\n\t\treturn this;\n\n\t},\n\n\tfromLine: function ( line ) {\n\n\t\tvar geometry = line.geometry;\n\n\t\tif ( geometry.isGeometry ) {\n\n\t\t\tthis.setPositions( geometry.vertices );\n\n\t\t} else if ( geometry.isBufferGeometry ) {\n\n\t\t\tthis.setPositions( geometry.attributes.position.array ); // assumes non-indexed\n\n\t\t}\n\n\t\t// set colors, maybe\n\n\t\treturn this;\n\n\t},\n\n\tcopy: function ( /* source */ ) {\n\n\t\t// todo\n\n\t\treturn this;\n\n\t}\n\n} );\n\nexport { LineGeometry };\n","import {\n\tInstancedInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tLine3,\n\tMathUtils,\n\tMatrix4,\n\tMesh,\n\tVector3,\n\tVector4\n} from \"three\";\nimport { LineSegmentsGeometry } from \"./LineSegmentsGeometry\";\nimport { LineMaterial } from \"./LineMaterial\";\n\nvar LineSegments2 = function ( geometry, material ) {\n\n\tif ( geometry === undefined ) geometry = new LineSegmentsGeometry();\n\tif ( material === undefined ) material = new LineMaterial( { color: Math.random() * 0xffffff } );\n\n\tMesh.call( this, geometry, material );\n\n\tthis.type = 'LineSegments2';\n\n};\n\nLineSegments2.prototype = Object.assign( Object.create( Mesh.prototype ), {\n\n\tconstructor: LineSegments2,\n\n\tisLineSegments2: true,\n\n\tcomputeLineDistances: ( function () { // for backwards-compatability, but could be a method of LineSegmentsGeometry...\n\n\t\tvar start = new Vector3();\n\t\tvar end = new Vector3();\n\n\t\treturn function computeLineDistances() {\n\n\t\t\tvar geometry = this.geometry;\n\n\t\t\tvar instanceStart = geometry.attributes.instanceStart;\n\t\t\tvar instanceEnd = geometry.attributes.instanceEnd;\n\t\t\tvar lineDistances = new Float32Array( 2 * instanceStart.data.count );\n\n\t\t\tfor ( var i = 0, j = 0, l = instanceStart.data.count; i < l; i ++, j += 2 ) {\n\n\t\t\t\tstart.fromBufferAttribute( instanceStart, i );\n\t\t\t\tend.fromBufferAttribute( instanceEnd, i );\n\n\t\t\t\tlineDistances[ j ] = ( j === 0 ) ? 0 : lineDistances[ j - 1 ];\n\t\t\t\tlineDistances[ j + 1 ] = lineDistances[ j ] + start.distanceTo( end );\n\n\t\t\t}\n\n\t\t\tvar instanceDistanceBuffer = new InstancedInterleavedBuffer( lineDistances, 2, 1 ); // d0, d1\n\n\t\t\tgeometry.setAttribute( 'instanceDistanceStart', new InterleavedBufferAttribute( instanceDistanceBuffer, 1, 0 ) ); // d0\n\t\t\tgeometry.setAttribute( 'instanceDistanceEnd', new InterleavedBufferAttribute( instanceDistanceBuffer, 1, 1 ) ); // d1\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() ),\n\n\traycast: ( function () {\n\n\t\tvar start = new Vector4();\n\t\tvar end = new Vector4();\n\n\t\tvar ssOrigin = new Vector4();\n\t\tvar ssOrigin3 = new Vector3();\n\t\tvar mvMatrix = new Matrix4();\n\t\tvar line = new Line3();\n\t\tvar closestPoint = new Vector3();\n\n\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\tif ( raycaster.camera === null ) {\n\n\t\t\t\tconsole.error( 'LineSegments2: \"Raycaster.camera\" needs to be set in order to raycast against LineSegments2.' );\n\n\t\t\t}\n\n\t\t\tvar threshold = ( raycaster.params.Line2 !== undefined ) ? raycaster.params.Line2.threshold || 0 : 0;\n\n\t\t\tvar ray = raycaster.ray;\n\t\t\tvar camera = raycaster.camera;\n\t\t\tvar projectionMatrix = camera.projectionMatrix;\n\n\t\t\tvar geometry = this.geometry;\n\t\t\tvar material = this.material;\n\t\t\tvar resolution = material.resolution;\n\t\t\tvar lineWidth = material.linewidth + threshold;\n\n\t\t\tvar instanceStart = geometry.attributes.instanceStart;\n\t\t\tvar instanceEnd = geometry.attributes.instanceEnd;\n\n\t\t\t// pick a point 1 unit out along the ray to avoid the ray origin\n\t\t\t// sitting at the camera origin which will cause \"w\" to be 0 when\n\t\t\t// applying the projection matrix.\n\t\t\tray.at( 1, ssOrigin );\n\n\t\t\t// ndc space [ - 1.0, 1.0 ]\n\t\t\tssOrigin.w = 1;\n\t\t\tssOrigin.applyMatrix4( camera.matrixWorldInverse );\n\t\t\tssOrigin.applyMatrix4( projectionMatrix );\n\t\t\tssOrigin.multiplyScalar( 1 / ssOrigin.w );\n\n\t\t\t// screen space\n\t\t\tssOrigin.x *= resolution.x / 2;\n\t\t\tssOrigin.y *= resolution.y / 2;\n\t\t\tssOrigin.z = 0;\n\n\t\t\tssOrigin3.copy( ssOrigin );\n\n\t\t\tvar matrixWorld = this.matrixWorld;\n\t\t\tmvMatrix.multiplyMatrices( camera.matrixWorldInverse, matrixWorld );\n\n\t\t\tfor ( var i = 0, l = instanceStart.count; i < l; i ++ ) {\n\n\t\t\t\tstart.fromBufferAttribute( instanceStart, i );\n\t\t\t\tend.fromBufferAttribute( instanceEnd, i );\n\n\t\t\t\tstart.w = 1;\n\t\t\t\tend.w = 1;\n\n\t\t\t\t// camera space\n\t\t\t\tstart.applyMatrix4( mvMatrix );\n\t\t\t\tend.applyMatrix4( mvMatrix );\n\n\t\t\t\t// clip space\n\t\t\t\tstart.applyMatrix4( projectionMatrix );\n\t\t\t\tend.applyMatrix4( projectionMatrix );\n\n\t\t\t\t// ndc space [ - 1.0, 1.0 ]\n\t\t\t\tstart.multiplyScalar( 1 / start.w );\n\t\t\t\tend.multiplyScalar( 1 / end.w );\n\n\t\t\t\t// skip the segment if it's outside the camera near and far planes\n\t\t\t\tvar isBehindCameraNear = start.z < - 1 && end.z < - 1;\n\t\t\t\tvar isPastCameraFar = start.z > 1 && end.z > 1;\n\t\t\t\tif ( isBehindCameraNear || isPastCameraFar ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// screen space\n\t\t\t\tstart.x *= resolution.x / 2;\n\t\t\t\tstart.y *= resolution.y / 2;\n\n\t\t\t\tend.x *= resolution.x / 2;\n\t\t\t\tend.y *= resolution.y / 2;\n\n\t\t\t\t// create 2d segment\n\t\t\t\tline.start.copy( start );\n\t\t\t\tline.start.z = 0;\n\n\t\t\t\tline.end.copy( end );\n\t\t\t\tline.end.z = 0;\n\n\t\t\t\t// get closest point on ray to segment\n\t\t\t\tvar param = line.closestPointToPointParameter( ssOrigin3, true );\n\t\t\t\tline.at( param, closestPoint );\n\n\t\t\t\t// check if the intersection point is within clip space\n\t\t\t\tvar zPos = MathUtils.lerp( start.z, end.z, param );\n\t\t\t\tvar isInClipSpace = zPos >= - 1 && zPos <= 1;\n\n\t\t\t\tvar isInside = ssOrigin3.distanceTo( closestPoint ) < lineWidth * 0.5;\n\n\t\t\t\tif ( isInClipSpace && isInside ) {\n\n\t\t\t\t\tline.start.fromBufferAttribute( instanceStart, i );\n\t\t\t\t\tline.end.fromBufferAttribute( instanceEnd, i );\n\n\t\t\t\t\tline.start.applyMatrix4( matrixWorld );\n\t\t\t\t\tline.end.applyMatrix4( matrixWorld );\n\n\t\t\t\t\tvar pointOnLine = new Vector3();\n\t\t\t\t\tvar point = new Vector3();\n\n\t\t\t\t\tray.distanceSqToSegment( line.start, line.end, point, pointOnLine );\n\n\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\tpoint: point,\n\t\t\t\t\t\tpointOnLine: pointOnLine,\n\t\t\t\t\t\tdistance: ray.origin.distanceTo( point ),\n\n\t\t\t\t\t\tobject: this,\n\t\t\t\t\t\tface: null,\n\t\t\t\t\t\tfaceIndex: i,\n\t\t\t\t\t\tuv: null,\n\t\t\t\t\t\tuv2: null,\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t}() )\n\n} );\n\nexport { LineSegments2 };\n","\nimport { LineSegments2 } from \"./LineSegments2\";\nimport { LineGeometry } from \"./LineGeometry\";\nimport { LineMaterial } from \"./LineMaterial\";\n\nvar Line2 = function ( geometry, material ) {\n\n\tif ( geometry === undefined ) geometry = new LineGeometry();\n\tif ( material === undefined ) material = new LineMaterial( { color: Math.random() * 0xffffff } );\n\n\tLineSegments2.call( this, geometry, material );\n\n\tthis.type = 'Line2';\n\n};\n\nLine2.prototype = Object.assign( Object.create( LineSegments2.prototype ), {\n\n\tconstructor: Line2,\n\n\tisLine2: true\n\n} );\n\nexport { Line2 };\n","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport {MathUtils, Object3D, Vector3} from \"three\";\n\nexport class Marker extends Object3D {\n\n /**\n * @param markerId {string}\n */\n constructor(markerId) {\n super();\n Object.defineProperty(this, 'isMarker', {value: true});\n\n this.data = {\n id: markerId,\n type: \"marker\",\n position: this.position,\n visible: this.visible\n };\n\n // redirect parent properties\n Object.defineProperty(this, \"position\", {\n get() { return this.data.position },\n set(value) { this.data.position = value }\n });\n Object.defineProperty(this, \"visible\", {\n get() { return this.data.visible },\n set(value) { this.data.visible = value }\n });\n }\n\n dispose() {}\n\n /**\n * Updates this marker from the provided data object, usually parsed form json from a markers.json\n * @param markerData {object}\n */\n updateFromData(markerData) {}\n\n // -- helper methods --\n\n static _posRelativeToCamera = new Vector3();\n static _cameraDirection = new Vector3();\n\n /**\n * @param position {Vector3}\n * @param camera {THREE.Camera}\n * @param fadeDistanceMax {number}\n * @param fadeDistanceMin {number}\n * @returns {number} - opacity between 0 and 1\n */\n static calculateDistanceOpacity(position, camera, fadeDistanceMin, fadeDistanceMax) {\n let distance = Marker.calculateDistanceToCameraPlane(position, camera);\n let minDelta = (distance - fadeDistanceMin) / fadeDistanceMin;\n let maxDelta = (distance - fadeDistanceMax) / (fadeDistanceMax * 0.5);\n return Math.min(\n MathUtils.clamp(minDelta, 0, 1),\n 1 - MathUtils.clamp(maxDelta + 1, 0, 1)\n );\n }\n\n /**\n * @param position {Vector3}\n * @param camera {THREE.Camera}\n * @returns {number}\n */\n static calculateDistanceToCameraPlane (position, camera) {\n Marker._posRelativeToCamera.subVectors(position, camera.position);\n camera.getWorldDirection(Marker._cameraDirection);\n return Marker._posRelativeToCamera.dot(Marker._cameraDirection);\n }\n\n}","/**\n * @author mrdoob / http://mrdoob.com/\n *\n * adapted for bluemap's purposes\n */\n\nimport {\n Matrix4,\n Object3D, Vector2,\n Vector3\n} from \"three\";\nimport {dispatchEvent, htmlToElement} from \"./Utils\";\n\nvar CSS2DObject = function ( element ) {\n\n Object3D.call( this );\n\n this.element = document.createElement(\"div\");\n let parent = element.parentNode;\n parent.replaceChild(this.element, element);\n this.element.appendChild(element);\n\n this.element.style.position = 'absolute';\n\n this.anchor = new Vector2();\n\n this.events = null;\n\n this.addEventListener( 'removed', function () {\n\n this.traverse( function ( object ) {\n\n if ( object.element instanceof Element && object.element.parentNode !== null ) {\n\n object.element.parentNode.removeChild( object.element );\n\n }\n\n } );\n\n } );\n\n let lastClick = -1;\n let handleClick = event => {\n let doubleTap = false;\n\n let now = Date.now();\n if (now - lastClick < 500){\n doubleTap = true;\n }\n\n lastClick = now;\n\n let data = {doubleTap: doubleTap};\n\n if (this.onClick( {event: event, data: data} )) {\n event.preventDefault();\n event.stopPropagation();\n } else {\n // fire event\n dispatchEvent(this.events, \"bluemapMapInteraction\", {\n data: data,\n object: this,\n });\n }\n }\n\n this.element.addEventListener(\"click\", handleClick);\n this.element.addEventListener(\"touch\", handleClick);\n\n};\n\nCSS2DObject.prototype = Object.create( Object3D.prototype );\nCSS2DObject.prototype.constructor = CSS2DObject;\n\n//\n\nvar CSS2DRenderer = function (events = null) {\n\n var _this = this;\n\n var _width, _height;\n var _widthHalf, _heightHalf;\n\n var vector = new Vector3();\n var viewMatrix = new Matrix4();\n var viewProjectionMatrix = new Matrix4();\n\n var cache = {\n objects: new WeakMap()\n };\n\n var domElement = document.createElement( 'div' );\n domElement.style.overflow = 'hidden';\n\n this.domElement = domElement;\n\n this.events = events;\n\n this.getSize = function () {\n\n return {\n width: _width,\n height: _height\n };\n\n };\n\n this.setSize = function ( width, height ) {\n\n _width = width;\n _height = height;\n\n _widthHalf = _width / 2;\n _heightHalf = _height / 2;\n\n domElement.style.width = width + 'px';\n domElement.style.height = height + 'px';\n\n };\n\n var renderObject = function ( object, scene, camera, parentVisible ) {\n\n if ( object instanceof CSS2DObject ) {\n\n object.events = _this.events;\n\n object.onBeforeRender( _this, scene, camera );\n\n vector.setFromMatrixPosition( object.matrixWorld );\n vector.applyMatrix4( viewProjectionMatrix );\n\n var element = object.element;\n var style = 'translate(' + ( vector.x * _widthHalf + _widthHalf - object.anchor.x) + 'px,' + ( - vector.y * _heightHalf + _heightHalf - object.anchor.y ) + 'px)';\n\n element.style.WebkitTransform = style;\n element.style.MozTransform = style;\n element.style.oTransform = style;\n element.style.transform = style;\n\n element.style.display = ( parentVisible && object.visible && vector.z >= - 1 && vector.z <= 1 && element.style.opacity !== \"0\" ) ? '' : 'none';\n\n var objectData = {\n distanceToCameraSquared: getDistanceToSquared( camera, object )\n };\n\n cache.objects.set( object, objectData );\n\n if ( element.parentNode !== domElement ) {\n\n domElement.appendChild( element );\n\n }\n\n object.onAfterRender( _this, scene, camera );\n\n }\n\n for ( var i = 0, l = object.children.length; i < l; i ++ ) {\n\n renderObject( object.children[ i ], scene, camera, parentVisible && object.visible );\n\n }\n\n };\n\n var getDistanceToSquared = function () {\n\n var a = new Vector3();\n var b = new Vector3();\n\n return function ( object1, object2 ) {\n\n a.setFromMatrixPosition( object1.matrixWorld );\n b.setFromMatrixPosition( object2.matrixWorld );\n\n return a.distanceToSquared( b );\n\n };\n\n }();\n\n var filterAndFlatten = function ( scene ) {\n\n var result = [];\n\n scene.traverse( function ( object ) {\n\n if ( object instanceof CSS2DObject ) result.push( object );\n\n } );\n\n return result;\n\n };\n\n var zOrder = function ( scene ) {\n\n var sorted = filterAndFlatten( scene ).sort( function ( a, b ) {\n\n var distanceA = cache.objects.get( a ).distanceToCameraSquared;\n var distanceB = cache.objects.get( b ).distanceToCameraSquared;\n\n return distanceA - distanceB;\n\n } );\n\n var zMax = sorted.length;\n\n for ( var i = 0, l = sorted.length; i < l; i ++ ) {\n\n sorted[ i ].element.style.zIndex = zMax - i;\n\n }\n\n };\n\n this.render = function ( scene, camera ) {\n\n if ( scene.autoUpdate === true ) scene.updateMatrixWorld();\n if ( camera.parent === null ) camera.updateMatrixWorld();\n\n viewMatrix.copy( camera.matrixWorldInverse );\n viewProjectionMatrix.multiplyMatrices( camera.projectionMatrix, viewMatrix );\n\n renderObject( scene, scene, camera, true );\n zOrder( scene );\n\n };\n\n};\n\nexport { CSS2DObject, CSS2DRenderer };","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport {Marker} from \"./Marker\";\nimport {CSS2DObject} from \"../util/CSS2DRenderer\";\nimport {animate, htmlToElement} from \"../util/Utils\";\nimport {Vector3} from \"three\";\n\nexport class ObjectMarker extends Marker {\n\n /**\n * @param markerId {string}\n */\n constructor(markerId) {\n super(markerId);\n Object.defineProperty(this, 'isObjectMarker', {value: true});\n this.data.type = \"object\";\n\n this.data.label = null;\n this.data.detail = null;\n this.data.link = null;\n this.data.newTab = true;\n\n this.lastClick = -1;\n }\n\n onClick(event) {\n let pos = new Vector3();\n if (event.intersection) {\n pos.copy(event.intersection.pointOnLine || event.intersection.point);\n pos.sub(this.position);\n }\n\n if (event.data.doubleTap) return false;\n\n if (this.data.detail || this.data.label) {\n let popup = new LabelPopup(this.data.detail || this.data.label);\n popup.position.copy(pos);\n this.add(popup);\n popup.open();\n }\n\n if (this.data.link){\n window.open(this.data.link, this.data.newTab ? '_blank' : '_self');\n }\n\n return true;\n }\n\n /**\n * @param markerData {{\n * position: {x: number, y: number, z: number},\n * label: string,\n * detail: string,\n * link: string,\n * newTab: boolean\n * }}\n */\n updateFromData(markerData) {\n\n // update position\n let pos = markerData.position || {};\n this.position.setX(pos.x || 0);\n this.position.setY(pos.y || 0);\n this.position.setZ(pos.z || 0);\n\n // update label\n this.data.label = markerData.label || null;\n\n //update detail\n this.data.detail = markerData.detail || null;\n\n // update link\n this.data.link = markerData.link || null;\n this.data.newTab = !!markerData.newTab;\n }\n\n}\n\nexport class LabelPopup extends CSS2DObject {\n\n /**\n * @param label {string}\n */\n constructor(label) {\n super(htmlToElement(`
${label}
`));\n }\n\n /**\n * @param autoClose {boolean} - whether this object should be automatically closed and removed again on any other interaction\n */\n open(autoClose = true) {\n let targetOpacity = this.element.style.opacity || 1;\n\n this.element.style.opacity = 0;\n let inAnimation = animate(progress => {\n this.element.style.opacity = (progress * targetOpacity).toString();\n }, 300);\n\n if (autoClose) {\n let removeHandler = evt => {\n if (evt.composedPath().includes(this.element)) return;\n\n inAnimation.cancel();\n this.close();\n\n window.removeEventListener(\"mousedown\", removeHandler);\n window.removeEventListener(\"touchstart\", removeHandler);\n window.removeEventListener(\"keydown\", removeHandler);\n window.removeEventListener(\"mousewheel\", removeHandler);\n };\n\n window.addEventListener(\"mousedown\", removeHandler);\n window.addEventListener(\"touchstart\", removeHandler);\n window.addEventListener(\"keydown\", removeHandler);\n window.addEventListener(\"mousewheel\", removeHandler);\n }\n }\n\n /**\n * @param remove {boolean} - whether this object should be removed from its parent when the close-animation finished\n */\n close(remove = true) {\n let startOpacity = parseFloat(this.element.style.opacity);\n\n animate(progress => {\n this.element.style.opacity = (startOpacity - progress * startOpacity).toString();\n }, 300, completed => {\n if (remove && completed && this.parent) {\n this.parent.remove(this);\n }\n });\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport {Color, DoubleSide, Mesh, ShaderMaterial, Shape, ShapeBufferGeometry, Vector2} from \"three\";\nimport {LineMaterial} from \"../util/lines/LineMaterial\";\nimport {MARKER_FILL_VERTEX_SHADER} from \"./MarkerFillVertexShader\";\nimport {MARKER_FILL_FRAGMENT_SHADER} from \"./MarkerFillFragmentShader\";\nimport {LineGeometry} from \"../util/lines/LineGeometry\";\nimport {Line2} from \"../util/lines/Line2\";\nimport {deepEquals} from \"../util/Utils\";\nimport {ObjectMarker} from \"./ObjectMarker\";\n\nexport class ShapeMarker extends ObjectMarker {\n\n /**\n * @param markerId {string}\n */\n constructor(markerId) {\n super(markerId);\n Object.defineProperty(this, 'isShapeMarker', {value: true});\n this.data.type = \"shape\";\n\n let zero = new Vector2();\n let shape = new Shape([zero, zero, zero]);\n this.fill = new ShapeMarkerFill(shape);\n this.border = new ShapeMarkerBorder(shape);\n this.border.renderOrder = -1; // render border before fill\n\n this.add(this.border, this.fill);\n\n this._markerData = {};\n }\n\n /**\n * @param y {number}\n */\n setShapeY(y) {\n let relativeY = y - this.position.y;\n this.fill.position.y = relativeY;\n this.border.position.y = relativeY;\n }\n\n /**\n * @param shape {Shape}\n */\n setShape(shape) {\n this.fill.updateGeometry(shape);\n this.border.updateGeometry(shape);\n }\n\n /**\n * @typedef {{r: number, g: number, b: number, a: number}} ColorLike\n */\n\n /**\n * @param markerData {{\n * position: {x: number, y: number, z: number},\n * label: string,\n * detail: string,\n * shape: {x: number, z: number}[],\n * shapeY: number,\n * height: number,\n * link: string,\n * newTab: boolean,\n * depthTest: boolean,\n * lineWidth: number,\n * borderColor: ColorLike,\n * lineColor: ColorLike,\n * fillColor: ColorLike,\n * minDistance: number,\n * maxDistance: number\n * }}\n */\n updateFromData(markerData) {\n super.updateFromData(markerData);\n\n // update shape only if needed, based on last update-data\n if (\n !this._markerData.shape || !deepEquals(markerData.shape, this._markerData.shape) ||\n !this._markerData.position || !deepEquals(markerData.position, this._markerData.position)\n ){\n this.setShape(this.createShapeFromData(markerData.shape));\n }\n\n // update shapeY\n this.setShapeY((markerData.shapeY || markerData.height || 0) + 0.01); //\"height\" for backwards compatibility, adding 0.01 to avoid z-fighting\n\n // update depthTest\n this.border.depthTest = !!markerData.depthTest;\n this.fill.depthTest = !!markerData.depthTest;\n\n // update border-width\n this.border.linewidth = markerData.lineWidth !== undefined ? markerData.lineWidth : 2;\n\n // update border-color\n let bc = markerData.lineColor || markerData.borderColor || {}; //\"borderColor\" for backwards compatibility\n this.border.color.setRGB((bc.r || 0) / 255, (bc.g || 0) / 255, (bc.b || 0) / 255);\n this.border.opacity = bc.a || 0;\n\n // update fill-color\n let fc = markerData.fillColor || {};\n this.fill.color.setRGB((fc.r || 0) / 255, (fc.g || 0) / 255, (fc.b || 0) / 255);\n this.fill.opacity = fc.a || 0;\n\n // update min/max distances\n let minDist = markerData.minDistance || 0;\n let maxDist = markerData.maxDistance !== undefined ? markerData.maxDistance : Number.MAX_VALUE;\n this.border.fadeDistanceMin = minDist;\n this.border.fadeDistanceMax = maxDist;\n this.fill.fadeDistanceMin = minDist;\n this.fill.fadeDistanceMax = maxDist;\n\n // save used marker data for next update\n this._markerData = markerData;\n }\n\n dispose() {\n super.dispose();\n\n this.fill.dispose();\n this.border.dispose();\n }\n\n /**\n * @private\n * Creates a shape from a data object, usually parsed json from a markers.json\n * @param shapeData {object}\n * @returns {Shape}\n */\n createShapeFromData(shapeData) {\n /** @type {THREE.Vector2[]} **/\n let points = [];\n\n if (Array.isArray(shapeData)){\n shapeData.forEach(point => {\n let x = (point.x || 0) - this.position.x;\n let z = (point.z || 0) - this.position.z;\n\n points.push(new Vector2(x, z));\n });\n }\n\n return new Shape(points);\n }\n\n}\n\nclass ShapeMarkerFill extends Mesh {\n\n /**\n * @param shape {Shape}\n */\n constructor(shape) {\n let geometry = ShapeMarkerFill.createGeometry(shape);\n let material = new ShaderMaterial({\n vertexShader: MARKER_FILL_VERTEX_SHADER,\n fragmentShader: MARKER_FILL_FRAGMENT_SHADER,\n side: DoubleSide,\n depthTest: true,\n transparent: true,\n uniforms: {\n markerColor: { value: new Color() },\n markerOpacity: { value: 0 },\n fadeDistanceMin: { value: 0 },\n fadeDistanceMax: { value: Number.MAX_VALUE },\n }\n });\n\n super(geometry, material);\n }\n\n /**\n * @returns {Color}\n */\n get color(){\n return this.material.uniforms.markerColor.value;\n }\n\n /**\n * @returns {number}\n */\n get opacity() {\n return this.material.uniforms.markerOpacity.value;\n }\n\n /**\n * @param opacity {number}\n */\n set opacity(opacity) {\n this.material.uniforms.markerOpacity.value = opacity;\n this.visible = opacity > 0;\n }\n\n /**\n * @returns {boolean}\n */\n get depthTest() {\n return this.material.depthTest;\n }\n\n /**\n * @param test {boolean}\n */\n set depthTest(test) {\n this.material.depthTest = test;\n }\n\n /**\n * @returns {number}\n */\n get fadeDistanceMin() {\n return this.material.uniforms.fadeDistanceMin.value;\n }\n\n /**\n * @param min {number}\n */\n set fadeDistanceMin(min) {\n this.material.uniforms.fadeDistanceMin.value = min;\n }\n\n /**\n * @returns {number}\n */\n get fadeDistanceMax() {\n return this.material.uniforms.fadeDistanceMax.value;\n }\n\n /**\n * @param max {number}\n */\n set fadeDistanceMax(max) {\n this.material.uniforms.fadeDistanceMax.value = max;\n }\n\n onClick(event) {\n if (event.intersection) {\n if (event.intersection.distance > this.fadeDistanceMax) return false;\n if (event.intersection.distance < this.fadeDistanceMin) return false;\n }\n\n return super.onClick(event);\n }\n\n /**\n * @param shape {Shape}\n */\n updateGeometry(shape) {\n this.geometry.dispose();\n this.geometry = ShapeMarkerFill.createGeometry(shape);\n }\n\n dispose() {\n this.geometry.dispose();\n this.material.dispose();\n }\n\n /**\n * @param shape {Shape}\n * @returns {ShapeBufferGeometry}\n */\n static createGeometry(shape) {\n let geometry = new ShapeBufferGeometry(shape, 5);\n geometry.rotateX(Math.PI / 2); //make y to z\n\n return geometry;\n }\n\n}\n\nclass ShapeMarkerBorder extends Line2 {\n\n /**\n * @param shape {Shape}\n */\n constructor(shape) {\n let geometry = new LineGeometry();\n geometry.setPositions(ShapeMarkerBorder.createLinePoints(shape));\n\n let material = new LineMaterial({\n color: new Color(),\n opacity: 0,\n transparent: true,\n linewidth: 1,\n depthTest: true,\n vertexColors: false,\n dashed: false,\n });\n material.uniforms.fadeDistanceMin = { value: 0 };\n material.uniforms.fadeDistanceMax = { value: Number.MAX_VALUE };\n\n material.resolution.set(window.innerWidth, window.innerHeight);\n\n super(geometry, material);\n\n this.computeLineDistances();\n }\n\n /**\n * @returns {Color}\n */\n get color(){\n return this.material.color;\n }\n\n /**\n * @returns {number}\n */\n get opacity() {\n return this.material.opacity;\n }\n\n /**\n * @param opacity {number}\n */\n set opacity(opacity) {\n this.material.opacity = opacity;\n this.visible = opacity > 0;\n }\n\n /**\n * @returns {number}\n */\n get linewidth() {\n return this.material.linewidth;\n }\n\n /**\n * @param width {number}\n */\n set linewidth(width) {\n this.material.linewidth = width;\n }\n\n /**\n * @returns {boolean}\n */\n get depthTest() {\n return this.material.depthTest;\n }\n\n /**\n * @param test {boolean}\n */\n set depthTest(test) {\n this.material.depthTest = test;\n }\n\n /**\n * @returns {number}\n */\n get fadeDistanceMin() {\n return this.material.uniforms.fadeDistanceMin.value;\n }\n\n /**\n * @param min {number}\n */\n set fadeDistanceMin(min) {\n this.material.uniforms.fadeDistanceMin.value = min;\n }\n\n /**\n * @returns {number}\n */\n get fadeDistanceMax() {\n return this.material.uniforms.fadeDistanceMax.value;\n }\n\n /**\n * @param max {number}\n */\n set fadeDistanceMax(max) {\n this.material.uniforms.fadeDistanceMax.value = max;\n }\n\n onClick(event) {\n if (event.intersection) {\n if (event.intersection.distance > this.fadeDistanceMax) return false;\n if (event.intersection.distance < this.fadeDistanceMin) return false;\n }\n\n return super.onClick(event);\n }\n\n /**\n * @param shape {Shape}\n */\n updateGeometry(shape) {\n this.geometry.setPositions(ShapeMarkerBorder.createLinePoints(shape));\n this.computeLineDistances();\n }\n\n /**\n * @param renderer {THREE.WebGLRenderer}\n */\n onBeforeRender(renderer) {\n renderer.getSize(this.material.resolution);\n }\n\n dispose() {\n this.geometry.dispose();\n this.material.dispose();\n }\n\n /**\n * @param shape {Shape}\n * @returns {number[]}\n */\n static createLinePoints(shape) {\n let points3d = [];\n let points = shape.getPoints(5);\n points.forEach(point => points3d.push(point.x, 0, point.y));\n points3d.push(points[0].x, 0, points[0].y);\n\n return points3d;\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport {Color, DoubleSide, ExtrudeBufferGeometry, Mesh, ShaderMaterial, Shape, Vector2} from \"three\";\nimport {LineMaterial} from \"../util/lines/LineMaterial\";\nimport {MARKER_FILL_VERTEX_SHADER} from \"./MarkerFillVertexShader\";\nimport {MARKER_FILL_FRAGMENT_SHADER} from \"./MarkerFillFragmentShader\";\nimport {Line2} from \"../util/lines/Line2\";\nimport {deepEquals} from \"../util/Utils\";\nimport {LineSegmentsGeometry} from \"../util/lines/LineSegmentsGeometry\";\nimport {ObjectMarker} from \"./ObjectMarker\";\n\nexport class ExtrudeMarker extends ObjectMarker {\n\n /**\n * @param markerId {string}\n */\n constructor(markerId) {\n super(markerId);\n Object.defineProperty(this, 'isExtrudeMarker', {value: true});\n this.data.type = \"extrude\";\n\n let zero = new Vector2();\n let shape = new Shape([zero, zero, zero]);\n this.fill = new ExtrudeMarkerFill(shape);\n this.border = new ExtrudeMarkerBorder(shape);\n this.border.renderOrder = -1; // render border before fill\n\n this.add(this.border, this.fill);\n\n this._markerData = {};\n }\n\n /**\n * @param minY {number}\n * @param maxY {number}\n */\n setShapeY(minY, maxY) {\n let relativeY = maxY - this.position.y;\n let height = maxY - minY;\n this.fill.position.y = relativeY;\n this.border.position.y = relativeY;\n this.fill.scale.y = height;\n this.border.scale.y = height;\n }\n\n /**\n * @param shape {Shape}\n */\n setShape(shape) {\n this.fill.updateGeometry(shape);\n this.border.updateGeometry(shape);\n }\n\n /**\n * @typedef {{r: number, g: number, b: number, a: number}} ColorLike\n */\n\n /**\n * @param markerData {{\n * position: {x: number, y: number, z: number},\n * label: string,\n * detail: string,\n * shape: {x: number, z: number}[],\n * shapeMinY: number,\n * shapeMaxY: number,\n * link: string,\n * newTab: boolean,\n * depthTest: boolean,\n * lineWidth: number,\n * lineColor: ColorLike,\n * fillColor: ColorLike,\n * minDistance: number,\n * maxDistance: number\n * }}\n */\n updateFromData(markerData) {\n super.updateFromData(markerData);\n\n // update shape only if needed, based on last update-data\n if (\n !this._markerData.shape || !deepEquals(markerData.shape, this._markerData.shape) ||\n !this._markerData.position || !deepEquals(markerData.position, this._markerData.position)\n ){\n this.setShape(this.createShapeFromData(markerData.shape));\n }\n\n // update shapeY\n this.setShapeY((markerData.shapeMinY || 0) - 0.01, (markerData.shapeMaxY || 0) + 0.01); // offset by 0.01 to avoid z-fighting\n\n // update depthTest\n this.border.depthTest = !!markerData.depthTest;\n this.fill.depthTest = !!markerData.depthTest;\n\n // update border-width\n this.border.linewidth = markerData.lineWidth !== undefined ? markerData.lineWidth : 2;\n\n // update border-color\n let bc = markerData.lineColor || {};\n this.border.color.setRGB((bc.r || 0) / 255, (bc.g || 0) / 255, (bc.b || 0) / 255);\n this.border.opacity = bc.a || 0;\n\n // update fill-color\n let fc = markerData.fillColor || {};\n this.fill.color.setRGB((fc.r || 0) / 255, (fc.g || 0) / 255, (fc.b || 0) / 255);\n this.fill.opacity = fc.a || 0;\n\n // update min/max distances\n let minDist = markerData.minDistance || 0;\n let maxDist = markerData.maxDistance !== undefined ? markerData.maxDistance : Number.MAX_VALUE;\n this.border.fadeDistanceMin = minDist;\n this.border.fadeDistanceMax = maxDist;\n this.fill.fadeDistanceMin = minDist;\n this.fill.fadeDistanceMax = maxDist;\n\n // save used marker data for next update\n this._markerData = markerData;\n }\n\n dispose() {\n super.dispose();\n\n this.fill.dispose();\n this.border.dispose();\n }\n\n /**\n * @private\n * Creates a shape from a data object, usually parsed json from a markers.json\n * @param shapeData {object}\n * @returns {Shape}\n */\n createShapeFromData(shapeData) {\n /** @type {THREE.Vector2[]} **/\n let points = [];\n\n if (Array.isArray(shapeData)){\n shapeData.forEach(point => {\n let x = (point.x || 0) - this.position.x + 0.01; // offset by 0.01 to avoid z-fighting\n let z = (point.z || 0) - this.position.z + 0.01;\n\n points.push(new Vector2(x, z));\n });\n }\n\n return new Shape(points);\n }\n\n}\n\nclass ExtrudeMarkerFill extends Mesh {\n\n /**\n * @param shape {Shape}\n */\n constructor(shape) {\n let geometry = ExtrudeMarkerFill.createGeometry(shape);\n let material = new ShaderMaterial({\n vertexShader: MARKER_FILL_VERTEX_SHADER,\n fragmentShader: MARKER_FILL_FRAGMENT_SHADER,\n side: DoubleSide,\n depthTest: true,\n transparent: true,\n uniforms: {\n markerColor: { value: new Color() },\n markerOpacity: { value: 0 },\n fadeDistanceMin: { value: 0 },\n fadeDistanceMax: { value: Number.MAX_VALUE },\n }\n });\n\n super(geometry, material);\n }\n\n /**\n * @returns {Color}\n */\n get color(){\n return this.material.uniforms.markerColor.value;\n }\n\n /**\n * @returns {number}\n */\n get opacity() {\n return this.material.uniforms.markerOpacity.value;\n }\n\n /**\n * @param opacity {number}\n */\n set opacity(opacity) {\n this.material.uniforms.markerOpacity.value = opacity;\n this.visible = opacity > 0;\n }\n\n /**\n * @returns {boolean}\n */\n get depthTest() {\n return this.material.depthTest;\n }\n\n /**\n * @param test {boolean}\n */\n set depthTest(test) {\n this.material.depthTest = test;\n }\n\n /**\n * @returns {number}\n */\n get fadeDistanceMin() {\n return this.material.uniforms.fadeDistanceMin.value;\n }\n\n /**\n * @param min {number}\n */\n set fadeDistanceMin(min) {\n this.material.uniforms.fadeDistanceMin.value = min;\n }\n\n /**\n * @returns {number}\n */\n get fadeDistanceMax() {\n return this.material.uniforms.fadeDistanceMax.value;\n }\n\n /**\n * @param max {number}\n */\n set fadeDistanceMax(max) {\n this.material.uniforms.fadeDistanceMax.value = max;\n }\n\n onClick(event) {\n if (event.intersection) {\n if (event.intersection.distance > this.fadeDistanceMax) return false;\n if (event.intersection.distance < this.fadeDistanceMin) return false;\n }\n\n return super.onClick(event);\n }\n\n /**\n * @param shape {Shape}\n */\n updateGeometry(shape) {\n this.geometry.dispose();\n this.geometry = ExtrudeMarkerFill.createGeometry(shape);\n }\n\n dispose() {\n this.geometry.dispose();\n this.material.dispose();\n }\n\n /**\n * @param shape {Shape}\n * @returns {ExtrudeBufferGeometry}\n */\n static createGeometry(shape) {\n let geometry = new ExtrudeBufferGeometry(shape, {\n depth: 1,\n steps: 5,\n bevelEnabled: false\n });\n geometry.rotateX(Math.PI / 2); //make y to z\n\n return geometry;\n }\n\n}\n\nclass ExtrudeMarkerBorder extends Line2 {\n\n /**\n * @param shape {Shape}\n */\n constructor(shape) {\n let geometry = new LineSegmentsGeometry();\n geometry.setPositions(ExtrudeMarkerBorder.createLinePoints(shape));\n\n let material = new LineMaterial({\n color: new Color(),\n opacity: 0,\n transparent: true,\n linewidth: 1,\n depthTest: true,\n vertexColors: false,\n dashed: false,\n });\n material.uniforms.fadeDistanceMin = { value: 0 };\n material.uniforms.fadeDistanceMax = { value: Number.MAX_VALUE };\n\n material.resolution.set(window.innerWidth, window.innerHeight);\n\n super(geometry, material);\n\n this.computeLineDistances();\n }\n\n /**\n * @returns {Color}\n */\n get color(){\n return this.material.color;\n }\n\n /**\n * @returns {number}\n */\n get opacity() {\n return this.material.opacity;\n }\n\n /**\n * @param opacity {number}\n */\n set opacity(opacity) {\n this.material.opacity = opacity;\n this.visible = opacity > 0;\n }\n\n /**\n * @returns {number}\n */\n get linewidth() {\n return this.material.linewidth;\n }\n\n /**\n * @param width {number}\n */\n set linewidth(width) {\n this.material.linewidth = width;\n }\n\n /**\n * @returns {boolean}\n */\n get depthTest() {\n return this.material.depthTest;\n }\n\n /**\n * @param test {boolean}\n */\n set depthTest(test) {\n this.material.depthTest = test;\n }\n\n /**\n * @returns {number}\n */\n get fadeDistanceMin() {\n return this.material.uniforms.fadeDistanceMin.value;\n }\n\n /**\n * @param min {number}\n */\n set fadeDistanceMin(min) {\n this.material.uniforms.fadeDistanceMin.value = min;\n }\n\n /**\n * @returns {number}\n */\n get fadeDistanceMax() {\n return this.material.uniforms.fadeDistanceMax.value;\n }\n\n /**\n * @param max {number}\n */\n set fadeDistanceMax(max) {\n this.material.uniforms.fadeDistanceMax.value = max;\n }\n\n onClick(event) {\n if (event.intersection) {\n if (event.intersection.distance > this.fadeDistanceMax) return false;\n if (event.intersection.distance < this.fadeDistanceMin) return false;\n }\n\n return super.onClick(event);\n }\n\n /**\n * @param shape {Shape}\n */\n updateGeometry(shape) {\n this.geometry.setPositions(ExtrudeMarkerBorder.createLinePoints(shape));\n this.computeLineDistances();\n }\n\n /**\n * @param renderer {THREE.WebGLRenderer}\n */\n onBeforeRender(renderer) {\n renderer.getSize(this.material.resolution);\n }\n\n dispose() {\n this.geometry.dispose();\n this.material.dispose();\n }\n\n /**\n * @param shape {Shape}\n * @returns {number[]}\n */\n static createLinePoints(shape) {\n let points3d = [];\n let points = shape.getPoints(5);\n points.push(points[0]);\n\n let prevPoint = null;\n points.forEach(point => {\n\n // vertical line\n points3d.push(point.x, 0, point.y);\n points3d.push(point.x, -1, point.y);\n\n if (prevPoint) {\n // line to previous point top\n points3d.push(prevPoint.x, 0, prevPoint.y);\n points3d.push(point.x, 0, point.y);\n\n // line to previous point bottom\n points3d.push(prevPoint.x, -1, prevPoint.y);\n points3d.push(point.x, -1, point.y);\n }\n\n prevPoint = point;\n });\n\n return points3d;\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport {Color} from \"three\";\nimport {LineMaterial} from \"../util/lines/LineMaterial\";\nimport {LineGeometry} from \"../util/lines/LineGeometry\";\nimport {Line2} from \"../util/lines/Line2\";\nimport {deepEquals} from \"../util/Utils\";\nimport {ObjectMarker} from \"./ObjectMarker\";\n\nexport class LineMarker extends ObjectMarker {\n\n /**\n * @param markerId {string}\n */\n constructor(markerId) {\n super(markerId);\n Object.defineProperty(this, 'isLineMarker', {value: true});\n this.data.type = \"line\";\n\n this.line = new LineMarkerLine([0, 0, 0]);\n\n this.add(this.line);\n\n this._markerData = {};\n }\n\n /**\n * @param line {number[] | THREE.Vector3[] | THREE.Curve}\n */\n setLine(line) {\n /** @type {number[]} */\n let points;\n\n if (line.type === 'Curve' || line.type === 'CurvePath') {\n line = line.getPoints(5);\n }\n\n if (Array.isArray(line)) {\n if (line.length === 0){\n points = [];\n } else if (line[0].isVector3) {\n points = [];\n line.forEach(point => {\n points.push(point.x, point.y, point.z);\n });\n } else {\n points = line;\n }\n } else {\n throw new Error(\"Invalid argument type!\");\n }\n\n this.line.updateGeometry(points);\n }\n\n /**\n * @typedef {{r: number, g: number, b: number, a: number}} ColorLike\n */\n\n /**\n * @param markerData {{\n * position: {x: number, y: number, z: number},\n * label: string,\n * detail: string,\n * line: {x: number, y: number, z: number}[],\n * link: string,\n * newTab: boolean,\n * depthTest: boolean,\n * lineWidth: number,\n * lineColor: ColorLike,\n * minDistance: number,\n * maxDistance: number\n * }}\n */\n updateFromData(markerData) {\n super.updateFromData(markerData);\n\n // update shape only if needed, based on last update-data\n if (\n !this._markerData.line || !deepEquals(markerData.line, this._markerData.line) ||\n !this._markerData.position || !deepEquals(markerData.position, this._markerData.position)\n ){\n this.setLine(this.createPointsFromData(markerData.line));\n }\n\n // update depthTest\n this.line.depthTest = !!markerData.depthTest;\n\n // update border-width\n this.line.linewidth = markerData.lineWidth !== undefined ? markerData.lineWidth : 2;\n\n // update line-color\n let lc = markerData.lineColor || {};\n this.line.color.setRGB((lc.r || 0) / 255, (lc.g || 0) / 255, (lc.b || 0) / 255);\n this.line.opacity = lc.a || 0;\n\n // update min/max distances\n let minDist = markerData.minDistance || 0;\n let maxDist = markerData.maxDistance !== undefined ? markerData.maxDistance : Number.MAX_VALUE;\n this.line.fadeDistanceMin = minDist;\n this.line.fadeDistanceMax = maxDist;\n\n // save used marker data for next update\n this._markerData = markerData;\n }\n\n dispose() {\n super.dispose();\n\n this.line.dispose();\n }\n\n /**\n * @private\n * Creates a shape from a data object, usually parsed json from a markers.json\n * @param shapeData {object}\n * @returns {number[]}\n */\n createPointsFromData(shapeData) {\n /** @type {number[]} **/\n let points = [];\n\n if (Array.isArray(shapeData)){\n shapeData.forEach(point => {\n let x = (point.x || 0) - this.position.x;\n let y = (point.y || 0) - this.position.y;\n let z = (point.z || 0) - this.position.z;\n\n points.push(x, y, z);\n });\n }\n\n return points;\n }\n\n}\n\nclass LineMarkerLine extends Line2 {\n\n /**\n * @param points {number[]}\n */\n constructor(points) {\n let geometry = new LineGeometry();\n geometry.setPositions(points);\n\n let material = new LineMaterial({\n color: new Color(),\n opacity: 0,\n transparent: true,\n linewidth: 1,\n depthTest: true,\n vertexColors: false,\n dashed: false,\n });\n material.uniforms.fadeDistanceMin = { value: 0 };\n material.uniforms.fadeDistanceMax = { value: Number.MAX_VALUE };\n\n material.resolution.set(window.innerWidth, window.innerHeight);\n\n super(geometry, material);\n\n this.computeLineDistances();\n }\n\n /**\n * @returns {Color}\n */\n get color(){\n return this.material.color;\n }\n\n /**\n * @returns {number}\n */\n get opacity() {\n return this.material.opacity;\n }\n\n /**\n * @param opacity {number}\n */\n set opacity(opacity) {\n this.material.opacity = opacity;\n this.visible = opacity > 0;\n }\n\n /**\n * @returns {number}\n */\n get linewidth() {\n return this.material.linewidth;\n }\n\n /**\n * @param width {number}\n */\n set linewidth(width) {\n this.material.linewidth = width;\n }\n\n /**\n * @returns {boolean}\n */\n get depthTest() {\n return this.material.depthTest;\n }\n\n /**\n * @param test {boolean}\n */\n set depthTest(test) {\n this.material.depthTest = test;\n }\n\n /**\n * @returns {number}\n */\n get fadeDistanceMin() {\n return this.material.uniforms.fadeDistanceMin.value;\n }\n\n /**\n * @param min {number}\n */\n set fadeDistanceMin(min) {\n this.material.uniforms.fadeDistanceMin.value = min;\n }\n\n /**\n * @returns {number}\n */\n get fadeDistanceMax() {\n return this.material.uniforms.fadeDistanceMax.value;\n }\n\n /**\n * @param max {number}\n */\n set fadeDistanceMax(max) {\n this.material.uniforms.fadeDistanceMax.value = max;\n }\n\n onClick(event) {\n if (event.intersection) {\n if (event.intersection.distance > this.fadeDistanceMax) return false;\n if (event.intersection.distance < this.fadeDistanceMin) return false;\n }\n\n return super.onClick(event);\n }\n\n /**\n * @param points {number[]}\n */\n updateGeometry(points) {\n this.geometry.setPositions(points);\n this.computeLineDistances();\n }\n\n /**\n * @param renderer {THREE.WebGLRenderer}\n */\n onBeforeRender(renderer) {\n renderer.getSize(this.material.resolution);\n }\n\n dispose() {\n this.geometry.dispose();\n this.material.dispose();\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport {Marker} from \"./Marker\";\nimport {CSS2DObject} from \"../util/CSS2DRenderer\";\nimport {htmlToElement} from \"../util/Utils\";\n\nexport class HtmlMarker extends Marker {\n\n /**\n * @param markerId {string}\n */\n constructor(markerId) {\n super(markerId);\n Object.defineProperty(this, 'isHtmlMarker', {value: true});\n this.data.type = \"html\";\n\n this.data.label = null;\n\n this.elementObject = new CSS2DObject(htmlToElement(`
`));\n this.elementObject.onBeforeRender = (renderer, scene, camera) => this.onBeforeRender(renderer, scene, camera);\n\n this.fadeDistanceMin = 0;\n this.fadeDistanceMax = Number.MAX_VALUE;\n\n this.addEventListener( 'removed', () => {\n if (this.element.parentNode) this.element.parentNode.removeChild(this.element);\n });\n\n this.add(this.elementObject);\n }\n\n onBeforeRender(renderer, scene, camera) {\n if (this.fadeDistanceMax === Number.MAX_VALUE && this.fadeDistanceMin <= 0){\n this.element.style.opacity = undefined;\n } else {\n this.element.style.opacity = Marker.calculateDistanceOpacity(this.position, camera, this.fadeDistanceMin, this.fadeDistanceMax).toString();\n }\n }\n\n /**\n * @returns {string}\n */\n get html() {\n return this.element.innerHTML;\n }\n\n /**\n * @param html {string}\n */\n set html(html) {\n this.element.innerHTML = html;\n }\n\n /**\n * @returns {THREE.Vector2}\n */\n get anchor() {\n return this.elementObject.anchor;\n }\n\n /**\n * @returns {Element}\n */\n get element() {\n return this.elementObject.element.getElementsByTagName(\"div\")[0];\n }\n\n /**\n * @param markerData {{\n * position: {x: number, y: number, z: number},\n * label: string,\n * anchor: {x: number, y: number},\n * html: string,\n * minDistance: number,\n * maxDistance: number\n * }}\n */\n updateFromData(markerData) {\n\n // update position\n let pos = markerData.position || {};\n this.position.setX(pos.x || 0);\n this.position.setY(pos.y || 0);\n this.position.setZ(pos.z || 0);\n\n // update label\n this.data.label = markerData.label || null;\n\n // update anchor\n let anch = markerData.anchor || {};\n this.anchor.setX(anch.x || 0);\n this.anchor.setY(anch.y || 0);\n\n // update html\n if (this.element.innerHTML !== markerData.html){\n this.element.innerHTML = markerData.html;\n }\n\n // update min/max distances\n this.fadeDistanceMin = markerData.minDistance || 0;\n this.fadeDistanceMax = markerData.maxDistance !== undefined ? markerData.maxDistance : Number.MAX_VALUE;\n\n }\n\n dispose() {\n super.dispose();\n\n if (this.element.parentNode) this.element.parentNode.removeChild(this.element);\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport {HtmlMarker} from \"./HtmlMarker\";\n\nexport class PoiMarker extends HtmlMarker {\n\n /**\n * @param markerId {string}\n */\n constructor(markerId) {\n super(markerId);\n Object.defineProperty(this, 'isPoiMarker', {value: true});\n this.data.type = \"poi\";\n\n this.html = `\"POI
`;\n\n this.iconElement = this.element.getElementsByTagName(\"img\").item(0);\n this.labelElement = this.element.getElementsByTagName(\"div\").item(0);\n\n this._lastIcon = null;\n }\n\n onClick(event) {\n if (event.data.doubleTap) return false;\n\n if (this.highlight || !this.data.label) return true;\n this.highlight = true;\n\n let eventHandler = evt => {\n if (evt.composedPath().includes(this.element)) return;\n\n this.highlight = false;\n\n window.removeEventListener(\"mousedown\", eventHandler);\n window.removeEventListener(\"touchstart\", eventHandler);\n window.removeEventListener(\"keydown\", eventHandler);\n window.removeEventListener(\"mousewheel\", eventHandler);\n };\n\n setTimeout(function () {\n window.addEventListener(\"mousedown\", eventHandler);\n window.addEventListener(\"touchstart\", eventHandler);\n window.addEventListener(\"keydown\", eventHandler);\n window.addEventListener(\"mousewheel\", eventHandler);\n }, 0);\n\n return true;\n }\n\n set highlight(highlight) {\n if (highlight) {\n this.element.classList.add(\"bm-marker-highlight\");\n } else {\n this.element.classList.remove(\"bm-marker-highlight\");\n }\n }\n\n get highlight() {\n return this.element.classList.contains(\"bm-marker-highlight\");\n }\n\n /**\n * @param markerData {{\n * position: {x: number, y: number, z: number},\n * anchor: {x: number, y: number},\n * iconAnchor: {x: number, y: number},\n * label: string,\n * icon: string,\n * minDistance: number,\n * maxDistance: number\n * }}\n */\n updateFromData(markerData) {\n\n // update position\n let pos = markerData.position || {};\n this.position.setX(pos.x || 0);\n this.position.setY(pos.y || 0);\n this.position.setZ(pos.z || 0);\n\n // update anchor\n let anch = markerData.anchor || markerData.iconAnchor || {}; //\"iconAnchor\" for backwards compatibility\n this.iconElement.style.transform = `translate(${-anch.x}px, ${-anch.y}px)`;\n //this.anchor.setX(anch.x || 0);\n //this.anchor.setY(anch.y || 0);\n\n\n // update label\n if (this.data.label !== markerData.label){\n this.data.label = markerData.label || \"\";\n this.labelElement.innerHTML = this.data.label || \"\";\n }\n\n // update icon\n if (this._lastIcon !== markerData.icon){\n this.iconElement.src = markerData.icon || \"assets/poi.svg\";\n this._lastIcon = markerData.icon;\n }\n\n // update min/max distances\n this.fadeDistanceMin = markerData.minDistance || 0;\n this.fadeDistanceMax = markerData.maxDistance !== undefined ? markerData.maxDistance : Number.MAX_VALUE;\n\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport {FileLoader, Scene} from \"three\";\nimport {MarkerSet} from \"./MarkerSet\";\nimport {alert, generateCacheHash} from \"../util/Utils\";\n\n/**\n * A manager for loading and updating markers from a file\n */\nexport class MarkerManager {\n\n /**\n * @constructor\n * @param markerScene {Scene} - The scene to which all markers will be added\n * @param fileUrl {string} - The marker file from which this manager updates its markers\n * @param events {EventTarget}\n */\n constructor(markerScene, fileUrl, events = null) {\n Object.defineProperty(this, 'isMarkerManager', {value: true});\n\n this.markerScene = markerScene;\n this.fileUrl = fileUrl;\n this.events = events;\n\n /** @type {Map} */\n this.markerSets = new Map();\n /** @type {Map} */\n this.markers = new Map();\n\n /** @type {NodeJS.Timeout} */\n this._updateInterval = null;\n }\n\n /**\n * Sets the automatic-update frequency, setting this to 0 or negative disables automatic updates (default).\n * This is better than using setInterval() on update() because this will wait for the update to finish before requesting the next update.\n * @param ms - interval in milliseconds\n */\n setAutoUpdateInterval(ms) {\n if (this._updateInterval) clearTimeout(this._updateInterval);\n if (ms > 0) {\n let autoUpdate = () => {\n this.update()\n .then(success => {\n if (success) {\n this._updateInterval = setTimeout(autoUpdate, ms);\n } else {\n this._updateInterval = setTimeout(autoUpdate, Math.max(ms, 1000 * 15));\n }\n })\n .catch(e => {\n alert(this.events, e, \"warning\");\n this._updateInterval = setTimeout(autoUpdate, Math.max(ms, 1000 * 15));\n });\n };\n\n this._updateInterval = setTimeout(autoUpdate, ms);\n }\n }\n\n /**\n * Loads the marker-file and updates all managed markers.\n * @returns {Promise} - A promise completing when the markers finished updating\n */\n update() {\n return this.loadMarkerFile()\n .then(markerFileData => this.updateFromData(markerFileData));\n }\n\n /**\n * Stops automatic-updates and disposes all markersets and markers managed by this manager\n */\n dispose() {\n this.setAutoUpdateInterval(0);\n this.markerSets.forEach(markerSet => markerSet.dispose());\n }\n\n /**\n * Removes all markers managed by this marker-manager\n */\n clear() {\n this.markerSets.forEach(markerSet => this.removeMarkerSet(markerSet.data.id));\n }\n\n /**\n * @protected\n * Adds a MarkerSet to this Manager, removing any existing markerSet with this id first.\n * @param markerSet {MarkerSet}\n */\n addMarkerSet(markerSet) {\n this.removeMarkerSet(markerSet.data.id);\n\n this.markerSets.set(markerSet.data.id, markerSet);\n this.markerScene.add(markerSet);\n }\n\n /**\n * @protected\n * Removes a MarkerSet from this Manager\n * @param setId {string} - The id of the MarkerSet\n */\n removeMarkerSet(setId) {\n let markerSet = this.markerSets.get(setId);\n\n if (markerSet) {\n this.markerScene.remove(markerSet);\n this.markerSets.delete(setId);\n markerSet.dispose();\n }\n }\n\n /**\n * @protected\n * Adds a marker to this manager\n * @param markerSet {MarkerSet}\n * @param marker {Marker}\n */\n addMarker(markerSet, marker) {\n this.removeMarker(marker.data.id);\n\n this.markers.set(marker.data.id, marker);\n markerSet.add(marker);\n }\n\n /**\n * @protected\n * Removes a marker from this manager\n * @param markerId {string}\n */\n removeMarker(markerId) {\n let marker = this.markers.get(markerId);\n\n if (marker) {\n if (marker.parent) marker.parent.remove(marker);\n this.markers.delete(markerId);\n marker.dispose();\n }\n }\n\n /**\n * Updates all managed markers using the provided data.\n * @param markerData {object} - The data object, usually parsed json from a markers.json\n * @returns {boolean} - If the update was successful\n */\n updateFromData(markerData) {\n return false;\n }\n\n /**\n * @private\n * Loads the marker file\n * @returns {Promise} - A promise completing with the parsed json object from the loaded file\n */\n loadMarkerFile() {\n return new Promise((resolve, reject) => {\n let loader = new FileLoader();\n loader.setResponseType(\"json\");\n loader.load(this.fileUrl + \"?\" + generateCacheHash(),\n markerFileData => {\n if (!markerFileData) reject(`Failed to parse '${this.fileUrl}'!`);\n else resolve(markerFileData);\n },\n () => {},\n () => reject(`Failed to load '${this.fileUrl}'!`)\n )\n });\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport {Scene} from \"three\";\nimport {MarkerSet} from \"./MarkerSet\";\nimport {ShapeMarker} from \"./ShapeMarker\";\nimport {alert} from \"../util/Utils\";\nimport {ExtrudeMarker} from \"./ExtrudeMarker\";\nimport {LineMarker} from \"./LineMarker\";\nimport {HtmlMarker} from \"./HtmlMarker\";\nimport {PoiMarker} from \"./PoiMarker\";\nimport {MarkerManager} from \"./MarkerManager\";\n\n/**\n * A manager for loading and updating markers from a markers.json file\n */\nexport class MarkerFileManager extends MarkerManager {\n\n /**\n * @constructor\n * @param markerScene {Scene} - The scene to which all markers will be added\n * @param fileUrl {string} - The marker file from which this manager updates its markers\n * @param mapId {string} - The mapId of the map for which the markers should be loaded\n * @param events {EventTarget}\n */\n constructor(markerScene, fileUrl, mapId, events = null) {\n super(markerScene, fileUrl, events);\n Object.defineProperty(this, 'isMarkerFileManager', {value: true});\n\n this.mapId = mapId;\n }\n\n updateFromData(markerData) {\n if (!Array.isArray(markerData.markerSets)) return false;\n let updatedMarkerSets = new Set();\n\n // add & update\n markerData.markerSets.forEach(markerSetData => {\n try {\n let markerSet = this.updateMarkerSetFromData(markerSetData);\n updatedMarkerSets.add(markerSet);\n } catch (err) {\n alert(this.events, err, \"fine\");\n }\n });\n\n // remove not updated MarkerSets\n this.markerSets.forEach((markerSet, setId) => {\n if (!updatedMarkerSets.has(markerSet)) {\n this.removeMarkerSet(setId);\n }\n });\n\n return true;\n }\n\n /**\n * @private\n * Updates a managed MarkerSet using the provided data\n * @param markerSetData {object} - The data object for a MarkerSet, usually parsed json from a markers.json\n * @returns {MarkerSet} - The updated MarkerSet\n * @throws {Error} - On invalid / missing data\n */\n updateMarkerSetFromData(markerSetData) {\n if (!markerSetData.id) throw new Error(\"markerset-data has no id!\");\n let markerSet = this.markerSets.get(markerSetData.id);\n\n // create new if not existent\n if (!markerSet) {\n markerSet = new MarkerSet(markerSetData.id);\n this.addMarkerSet(markerSet);\n\n if (markerSetData.defaultHide) {\n markerSet.visible = false;\n }\n }\n\n // update set info\n markerSet.data.label = markerSetData.label || markerSetData.id;\n markerSet.data.toggleable = !!markerSetData.toggleable;\n markerSet.data.defaultHide = !!markerSetData.defaultHide;\n\n // update markers\n let updatedMarkers = new Set();\n\n if (Array.isArray(markerSetData.marker)) {\n markerSetData.marker.forEach(markerData => {\n if (markerData.map && markerData.map !== this.mapId) return;\n\n try {\n let marker = this.updateMarkerFromData(markerSet, markerData);\n updatedMarkers.add(marker);\n } catch (err) {\n alert(this.events, err, \"fine\");\n console.debug(err);\n }\n });\n }\n\n // remove not updated Markers\n markerSet.children.forEach((marker) => {\n if (marker.isMarker && !updatedMarkers.has(marker) && !this.markers.has(marker.markerId)) {\n this.removeMarker(marker.markerId);\n }\n });\n\n return markerSet;\n }\n\n /**\n * @private\n * Updates a managed Marker using the provided data\n * @param markerSet {MarkerSet} - The MarkerSet this marker should be in\n * @param markerData {object}\n * @returns {Marker} - The updated Marker\n * @throws {Error} - On invalid / missing data\n */\n updateMarkerFromData(markerSet, markerData) {\n if (!markerData.id) throw new Error(\"marker-data has no id!\");\n if (!markerData.type) throw new Error(\"marker-data has no type!\");\n let marker = this.markers.get(markerData.id);\n\n // create new if not existent of wrong type\n if (!marker || marker.data.type !== markerData.type) {\n switch (markerData.type) {\n case \"shape\" : marker = new ShapeMarker(markerData.id); break;\n case \"extrude\" : marker = new ExtrudeMarker(markerData.id); break;\n case \"line\" : marker = new LineMarker(markerData.id); break;\n case \"html\" : marker = new HtmlMarker(markerData.id); break;\n case \"poi\" : marker = new PoiMarker(markerData.id); break;\n default : throw new Error(`Unknown marker-type: '${markerData.type}'`);\n }\n\n this.addMarker(markerSet, marker);\n }\n\n // make sure marker is in the correct MarkerSet\n if (marker.parent !== markerSet) markerSet.add(marker);\n\n // update marker\n marker.updateFromData(markerData);\n\n return marker;\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport {Marker} from \"./Marker\";\nimport {CSS2DObject} from \"../util/CSS2DRenderer\";\nimport {animate, EasingFunctions, htmlToElement} from \"../util/Utils\";\n\nexport class PlayerMarker extends Marker {\n\n /**\n * @param markerId {string}\n * @param playerUuid {string}\n */\n constructor(markerId, playerUuid) {\n super(markerId);\n Object.defineProperty(this, 'isPlayerMarker', {value: true});\n this.data.type = \"player\";\n\n this.data.playerUuid = playerUuid;\n this.data.name = playerUuid;\n\n this.data.world = \"?\";\n\n this.elementObject = new CSS2DObject(htmlToElement(`\n
\n \"playerhead\"\n
\n
\n `));\n this.elementObject.onBeforeRender = (renderer, scene, camera) => this.onBeforeRender(renderer, scene, camera);\n\n this.playerHeadElement = this.element.getElementsByTagName(\"img\")[0];\n this.playerNameElement = this.element.getElementsByTagName(\"div\")[0];\n\n this.addEventListener( 'removed', () => {\n if (this.element.parentNode) this.element.parentNode.removeChild(this.element);\n });\n\n this.playerHeadElement.addEventListener('error', () => {\n this.playerHeadElement.src = \"assets/steve.png\";\n }, {once: true});\n\n this.add(this.elementObject);\n }\n\n /**\n * @returns {Element}\n */\n get element() {\n return this.elementObject.element.getElementsByTagName(\"div\")[0];\n }\n\n onBeforeRender(renderer, scene, camera) {\n let distance = Marker.calculateDistanceToCameraPlane(this.position, camera);\n\n let value = \"near\";\n if (distance > 1000) {\n value = \"med\";\n }\n if (distance > 5000) {\n value = \"far\";\n }\n\n this.element.setAttribute(\"distance-data\", value);\n }\n\n /**\n * @typedef PlayerLike {{\n * uuid: string,\n * name: string,\n * world: string,\n * position: {x: number, y: number, z: number},\n * rotation: {yaw: number, pitch: number, roll: number}\n * }}\n */\n\n /**\n * @param markerData {PlayerLike}\n */\n updateFromData(markerData) {\n\n // animate position update\n let pos = markerData.position || {};\n if (!this.position.x && !this.position.y && !this.position.z) {\n this.position.set(\n pos.x || 0,\n pos.y || 0,\n pos.z || 0\n );\n } else {\n let startPos = {\n x: this.position.x,\n y: this.position.y,\n z: this.position.z,\n }\n let deltaPos = {\n x: (pos.x || 0) - startPos.x,\n y: ((pos.y || 0) + 1.8) - startPos.y,\n z: (pos.z || 0) - startPos.z,\n }\n if (deltaPos.x || deltaPos.y || deltaPos.z) {\n animate(progress => {\n let ease = EasingFunctions.easeInOutCubic(progress);\n this.position.set(\n startPos.x + deltaPos.x * ease || 0,\n startPos.y + deltaPos.y * ease || 0,\n startPos.z + deltaPos.z * ease || 0\n );\n }, 500);\n }\n }\n\n // update name\n let name = markerData.name || this.data.playerUuid;\n this.data.name = name;\n if (this.playerNameElement.innerHTML !== name)\n this.playerNameElement.innerHTML = name;\n\n // update world\n this.data.world = markerData.world || \"?\";\n\n }\n\n dispose() {\n super.dispose();\n\n let element = this.elementObject.element;\n if (element.parentNode) element.parentNode.removeChild(element);\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport {MarkerManager} from \"./MarkerManager\";\nimport {alert} from \"../util/Utils\";\nimport {MarkerSet} from \"./MarkerSet\";\nimport {PlayerMarker} from \"./PlayerMarker\";\n\nexport class PlayerMarkerManager extends MarkerManager {\n\n /**\n * @constructor\n * @param markerScene {THREE.Scene} - The scene to which all markers will be added\n * @param playerDataUrl {string} - The marker file from which this manager updates its markers\n * @param worldId {string} - The worldId of the world for which the markers should be loaded\n * @param events {EventTarget}\n */\n constructor(markerScene, playerDataUrl, worldId, events = null) {\n super(markerScene, playerDataUrl, events);\n Object.defineProperty(this, 'isPlayerMarkerManager', {value: true});\n\n this.worldId = worldId;\n\n this.getPlayerMarkerSet();\n }\n\n /**\n * @param markerData {{players: PlayerLike[]}}\n */\n updateFromData(markerData) {\n\n if (!Array.isArray(markerData.players)) {\n this.clear();\n return false;\n }\n\n /** @type Set */\n let updatedPlayerMarkers = new Set();\n\n // update\n markerData.players.forEach(playerData => {\n try {\n let playerMarker = this.updatePlayerMarkerFromData(playerData);\n updatedPlayerMarkers.add(playerMarker);\n } catch (err) {\n alert(this.events, err, \"fine\");\n }\n });\n\n // remove\n this.markers.forEach((playerMarker, markerId) => {\n if (!updatedPlayerMarkers.has(playerMarker)) {\n this.removeMarker(markerId);\n }\n });\n\n return true;\n }\n\n /**\n * @private\n * @param markerData {PlayerLike}\n * @returns PlayerMarker\n */\n updatePlayerMarkerFromData(markerData) {\n let playerUuid = markerData.uuid;\n if (!playerUuid) throw new Error(\"player-data has no uuid!\");\n let markerId = \"bm-player-\" + playerUuid;\n\n /** @type PlayerMarker */\n let marker = this.markers.get(markerId);\n\n let markerSet = this.getPlayerMarkerSet();\n\n // create new if not existent of wrong type\n if (!marker || !marker.isPlayerMarker) {\n marker = new PlayerMarker(markerId, playerUuid);\n this.addMarker(markerSet, marker);\n }\n\n // make sure marker is in the correct MarkerSet\n if (marker.parent !== markerSet) markerSet.add(marker);\n\n // update\n marker.updateFromData(markerData);\n\n // hide if wrong world\n marker.visible = markerData.world === this.worldId;\n\n return marker;\n }\n\n /**\n * @private\n * @returns {MarkerSet}\n */\n getPlayerMarkerSet() {\n let playerMarkerSet = this.markerSets.get(\"bm-players\");\n\n if (!playerMarkerSet) {\n playerMarkerSet = new MarkerSet(\"bm-players\");\n playerMarkerSet.data.label = \"Players\";\n this.addMarkerSet(playerMarkerSet);\n }\n\n return playerMarkerSet;\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport {\n\tClampToEdgeWrapping, Color,\n\tFileLoader, FrontSide, NearestFilter, NearestMipMapLinearFilter, Raycaster,\n\tScene, ShaderMaterial, Texture, Vector2, Vector3, VertexColors\n} from \"three\";\nimport {alert, dispatchEvent, generateCacheHash, hashTile, stringToImage} from \"../util/Utils\";\nimport {TileManager} from \"./TileManager\";\nimport {TileLoader} from \"./TileLoader\";\nimport {MarkerFileManager} from \"../markers/MarkerFileManager\";\nimport {PlayerMarkerManager} from \"../markers/PlayerMarkerManager\";\n\nexport class Map {\n\n\t/**\n\t * @param id {string}\n\t * @param dataUrl {string}\n\t * @param settingsUrl {string}\n\t * @param texturesUrl {string}\n\t * @param events {EventTarget}\n\t */\n\tconstructor(id, dataUrl, settingsUrl, texturesUrl, events = null) {\n\t\tObject.defineProperty( this, 'isMap', { value: true } );\n\n\t\tthis.events = events;\n\n\t\tthis.data = {\n\t\t\tid: id,\n\t\t\tdataUrl: dataUrl,\n\t\t\tsettingsUrl: settingsUrl,\n\t\t\ttexturesUrl: texturesUrl,\n\t\t\tname: id,\n\t\t\tworld: \"-\",\n\t\t\tstartPos: {x: 0, z: 0},\n\t\t\tskyColor: new Color(),\n\t\t\tambientLight: 0,\n\t\t\thires: {\n\t\t\t\ttileSize: {x: 32, z: 32},\n\t\t\t\tscale: {x: 1, z: 1},\n\t\t\t\ttranslate: {x: 2, z: 2}\n\t\t\t},\n\t\t\tlowres: {\n\t\t\t\ttileSize: {x: 32, z: 32},\n\t\t\t\tscale: {x: 1, z: 1},\n\t\t\t\ttranslate: {x: 2, z: 2}\n\t\t\t}\n\t\t};\n\n\t\tthis.raycaster = new Raycaster();\n\n\t\t/** @type {ShaderMaterial[]} */\n\t\tthis.hiresMaterial = null;\n\t\t/** @type {ShaderMaterial} */\n\t\tthis.lowresMaterial = null;\n\t\t/** @type {Texture[]} */\n\t\tthis.loadedTextures = [];\n\n\t\t/** @type {TileManager} */\n\t\tthis.hiresTileManager = null;\n\t\t/** @type {TileManager} */\n\t\tthis.lowresTileManager = null;\n\t}\n\n\t/**\n\t * Loads textures and materials for this map so it is ready to load map-tiles\n\t * @param hiresVertexShader {string}\n\t * @param hiresFragmentShader {string}\n\t * @param lowresVertexShader {string}\n\t * @param lowresFragmentShader {string}\n\t * @param uniforms {object}\n\t * @param tileCacheHash {number}\n\t * @returns {Promise}\n\t */\n\tload(hiresVertexShader, hiresFragmentShader, lowresVertexShader, lowresFragmentShader, uniforms, tileCacheHash = 0) {\n\t\tthis.unload()\n\n\t\tlet settingsPromise = this.loadSettings();\n\t\tlet textureFilePromise = this.loadTexturesFile();\n\n\t\tthis.lowresMaterial = this.createLowresMaterial(lowresVertexShader, lowresFragmentShader, uniforms);\n\n\t\treturn Promise.all([settingsPromise, textureFilePromise])\n .then(values => {\n let textures = values[1];\n if (textures === null) throw new Error(\"Failed to parse textures.json!\");\n\n this.hiresMaterial = this.createHiresMaterial(hiresVertexShader, hiresFragmentShader, uniforms, textures);\n\n this.hiresTileManager = new TileManager(new Scene(), new TileLoader(`${this.data.dataUrl}hires/`, this.hiresMaterial, this.data.hires, tileCacheHash), this.onTileLoad(\"hires\"), this.onTileUnload(\"hires\"), this.events);\n this.lowresTileManager = new TileManager(new Scene(), new TileLoader(`${this.data.dataUrl}lowres/`, this.lowresMaterial, this.data.lowres, tileCacheHash), this.onTileLoad(\"lowres\"), this.onTileUnload(\"lowres\"), this.events);\n\n this.hiresTileManager.scene.autoUpdate = false;\n this.lowresTileManager.scene.autoUpdate = false;\n\n alert(this.events, `Map '${this.data.id}' is loaded.`, \"fine\");\n });\n\t}\n\n\t/**\n\t * Loads the settings of this map\n\t * @returns {Promise}\n\t */\n\tloadSettings() {\n\t\treturn this.loadSettingsFile()\n\t\t\t.then(worldSettings => {\n\t\t\t\tthis.data.name = worldSettings.name ? worldSettings.name : this.data.name;\n\t\t\t\tthis.data.world = worldSettings.world ? worldSettings.world : this.data.world;\n\n\t\t\t\tthis.data.startPos = {...this.data.startPos, ...worldSettings.startPos};\n\t\t\t\tthis.data.skyColor.setRGB(\n\t\t\t\t\tworldSettings.skyColor.r !== undefined ? worldSettings.skyColor.r : this.data.skyColor.r,\n\t\t\t\t\tworldSettings.skyColor.g !== undefined ? worldSettings.skyColor.g : this.data.skyColor.g,\n\t\t\t\t\tworldSettings.skyColor.b !== undefined ? worldSettings.skyColor.b : this.data.skyColor.b\n\t\t\t\t);\n\t\t\t\tthis.data.ambientLight = worldSettings.ambientLight ? worldSettings.ambientLight : this.data.ambientLight;\n\n\t\t\t\tif (worldSettings.hires === undefined) worldSettings.hires = {};\n\t\t\t\tif (worldSettings.lowres === undefined) worldSettings.lowres = {};\n\n\t\t\t\tthis.data.hires = {\n\t\t\t\t\ttileSize: {...this.data.hires.tileSize, ...worldSettings.hires.tileSize},\n\t\t\t\t\tscale: {...this.data.hires.scale, ...worldSettings.hires.scale},\n\t\t\t\t\ttranslate: {...this.data.hires.translate, ...worldSettings.hires.translate}\n\t\t\t\t};\n\t\t\t\tthis.data.lowres = {\n\t\t\t\t\ttileSize: {...this.data.lowres.tileSize, ...worldSettings.lowres.tileSize},\n\t\t\t\t\tscale: {...this.data.lowres.scale, ...worldSettings.lowres.scale},\n\t\t\t\t\ttranslate: {...this.data.lowres.translate, ...worldSettings.lowres.translate}\n\t\t\t\t};\n\n\t\t\t\talert(this.events, `Settings for map '${this.data.id}' loaded.`, \"fine\");\n\t\t\t});\n\t}\n\n\tonTileLoad = layer => tile => {\n\t\tdispatchEvent(this.events, \"bluemapMapTileLoaded\", {\n\t\t\ttile: tile,\n\t\t\tlayer: layer\n\t\t});\n\t}\n\n\tonTileUnload = layer => tile => {\n\t\tdispatchEvent(this.events, \"bluemapMapTileUnloaded\", {\n\t\t\ttile: tile,\n\t\t\tlayer: layer\n\t\t});\n\t}\n\n\t/**\n\t * @param x {number}\n\t * @param z {number}\n\t * @param hiresViewDistance {number}\n\t * @param lowresViewDistance {number}\n\t */\n\tloadMapArea(x, z, hiresViewDistance, lowresViewDistance) {\n\t\tif (!this.isLoaded) return;\n\n\t\tlet hiresX = Math.floor((x - this.data.hires.translate.x) / this.data.hires.tileSize.x);\n\t\tlet hiresZ = Math.floor((z - this.data.hires.translate.z) / this.data.hires.tileSize.z);\n\t\tlet hiresViewX = Math.floor(hiresViewDistance / this.data.hires.tileSize.x);\n\t\tlet hiresViewZ = Math.floor(hiresViewDistance / this.data.hires.tileSize.z);\n\n\t\tlet lowresX = Math.floor((x - this.data.lowres.translate.x) / this.data.lowres.tileSize.x);\n\t\tlet lowresZ = Math.floor((z - this.data.lowres.translate.z) / this.data.lowres.tileSize.z);\n\t\tlet lowresViewX = Math.floor(lowresViewDistance / this.data.lowres.tileSize.x);\n\t\tlet lowresViewZ = Math.floor(lowresViewDistance / this.data.lowres.tileSize.z);\n\n\t\tthis.hiresTileManager.loadAroundTile(hiresX, hiresZ, hiresViewX, hiresViewZ);\n\t\tthis.lowresTileManager.loadAroundTile(lowresX, lowresZ, lowresViewX, lowresViewZ);\n\t}\n\n /**\n * Loads the settings.json file for this map\n * @returns {Promise}\n */\n loadSettingsFile() {\n return new Promise((resolve, reject) => {\n alert(this.events, `Loading settings for map '${this.data.id}'...`, \"fine\");\n\n let loader = new FileLoader();\n loader.setResponseType(\"json\");\n loader.load(this.data.settingsUrl + \"?\" + generateCacheHash(),\n settings => {\n if (settings.maps && settings.maps[this.data.id]) {\n resolve(settings.maps[this.data.id]);\n } else {\n reject(`the settings.json does not contain information for map: ${this.data.id}`);\n }\n },\n () => {},\n () => reject(`Failed to load the settings.json for map: ${this.data.id}`)\n )\n });\n }\n\n\t/**\n\t * Loads the textures.json file for this map\n\t * @returns {Promise}\n\t */\n\tloadTexturesFile() {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\talert(this.events, `Loading textures for map '${this.data.id}'...`, \"fine\");\n\n\t\t\tlet loader = new FileLoader();\n\t\t\tloader.setResponseType(\"json\");\n\t\t\tloader.load(this.data.texturesUrl + \"?\" + generateCacheHash(),\n\t\t\t\tresolve,\n\t\t\t\t() => {},\n\t\t\t\t() => reject(`Failed to load the textures.json for map: ${this.data.id}`)\n\t\t\t)\n\t\t});\n\t}\n\n\t/**\n\t * Creates a hires Material with the given textures\n\t * @param vertexShader {string}\n\t * @param fragmentShader {string}\n\t * @param uniforms {object}\n\t * @param textures {object} the textures-data\n\t * @returns {ShaderMaterial[]} the hires Material (array because its a multi-material)\n\t */\n\tcreateHiresMaterial(vertexShader, fragmentShader, uniforms, textures) {\n\t\tlet materials = [];\n\t\tif (!Array.isArray(textures.textures)) throw new Error(\"Invalid texture.json: 'textures' is not an array!\")\n\t\tfor (let i = 0; i < textures.textures.length; i++) {\n\t\t\tlet textureSettings = textures.textures[i];\n\n\t\t\tlet color = textureSettings.color;\n\t\t\tif (!Array.isArray(color) || color.length < 4){\n\t\t\t\tcolor = [0, 0, 0, 0];\n\t\t\t}\n\n\t\t\tlet opaque = color[3] === 1;\n\t\t\tlet transparent = !!textureSettings.transparent;\n\n\t\t\tlet texture = new Texture();\n\t\t\ttexture.image = stringToImage(textureSettings.texture);\n\n\t\t\ttexture.anisotropy = 1;\n\t\t\ttexture.generateMipmaps = opaque || transparent;\n\t\t\ttexture.magFilter = NearestFilter;\n\t\t\ttexture.minFilter = texture.generateMipmaps ? NearestMipMapLinearFilter : NearestFilter;\n\t\t\ttexture.wrapS = ClampToEdgeWrapping;\n\t\t\ttexture.wrapT = ClampToEdgeWrapping;\n\t\t\ttexture.flipY = false;\n\t\t\ttexture.flatShading = true;\n\t\t\ttexture.image.addEventListener(\"load\", () => texture.needsUpdate = true);\n\n\t\t\tthis.loadedTextures.push(texture);\n\n\t\t\tlet material = new ShaderMaterial({\n\t\t\t\tuniforms: {\n\t\t\t\t\t...uniforms,\n\t\t\t\t\ttextureImage: {\n\t\t\t\t\t\ttype: 't',\n\t\t\t\t\t\tvalue: texture\n\t\t\t\t\t},\n\t\t\t\t\ttransparent: { value: transparent }\n\t\t\t\t},\n\t\t\t\tvertexShader: vertexShader,\n\t\t\t\tfragmentShader: fragmentShader,\n\t\t\t\ttransparent: transparent,\n\t\t\t\tdepthWrite: true,\n\t\t\t\tdepthTest: true,\n\t\t\t\tvertexColors: VertexColors,\n\t\t\t\tside: FrontSide,\n\t\t\t\twireframe: false,\n\t\t\t});\n\n\t\t\tmaterial.needsUpdate = true;\n\t\t\tmaterials[i] = material;\n\t\t}\n\n\t\treturn materials;\n\t}\n\n\t/**\n\t * Creates a lowres Material\n\t * @param vertexShader {string}\n\t * @param fragmentShader {string}\n\t * @param uniforms {object}\n\t * @returns {ShaderMaterial} the hires Material\n\t */\n\tcreateLowresMaterial(vertexShader, fragmentShader, uniforms) {\n\t\treturn new ShaderMaterial({\n\t\t\tuniforms: uniforms,\n\t\t\tvertexShader: vertexShader,\n\t\t\tfragmentShader: fragmentShader,\n\t\t\ttransparent: false,\n\t\t\tdepthWrite: true,\n\t\t\tdepthTest: true,\n\t\t\tvertexColors: VertexColors,\n\t\t\tside: FrontSide,\n\t\t\twireframe: false\n\t\t});\n\t}\n\n\tunload() {\n\t\tif (this.hiresTileManager) this.hiresTileManager.unload();\n\t\tthis.hiresTileManager = null;\n\n\t\tif (this.lowresTileManager) this.lowresTileManager.unload();\n\t\tthis.lowresTileManager = null;\n\n\t\tif (this.hiresMaterial) this.hiresMaterial.forEach(material => material.dispose());\n\t\tthis.hiresMaterial = null;\n\n\t\tif (this.lowresMaterial) this.lowresMaterial.dispose();\n\t\tthis.lowresMaterial = null;\n\n\t\tthis.loadedTextures.forEach(texture => texture.dispose());\n\t\tthis.loadedTextures = [];\n\t}\n\n\t/**\n\t * Ray-traces and returns the terrain-height at a specific location, returns false if there is no map-tile loaded at that location\n\t * @param x {number}\n\t * @param z {number}\n\t * @returns {boolean|number}\n\t */\n\tterrainHeightAt(x, z) {\n\t\tif (!this.isLoaded) return false;\n\n\t\tthis.raycaster.set(\n\t\t\tnew Vector3(x, 300, z), // ray-start\n\t\t\tnew Vector3(0, -1, 0) // ray-direction\n\t\t);\n\t\tthis.raycaster.near = 1;\n\t\tthis.raycaster.far = 300;\n\t\tthis.raycaster.layers.enableAll();\n\n\t\tlet hiresTileHash = hashTile(Math.floor((x - this.data.hires.translate.x) / this.data.hires.tileSize.x), Math.floor((z - this.data.hires.translate.z) / this.data.hires.tileSize.z));\n\t\tlet tile = this.hiresTileManager.tiles.get(hiresTileHash);\n\t\tif (!tile || !tile.model) {\n\t\t\tlet lowresTileHash = hashTile(Math.floor((x - this.data.lowres.translate.x) / this.data.lowres.tileSize.x), Math.floor((z - this.data.lowres.translate.z) / this.data.lowres.tileSize.z));\n\t\t\ttile = this.lowresTileManager.tiles.get(lowresTileHash);\n\t\t}\n\n\t\tif (!tile || !tile.model){\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\tlet intersects = this.raycaster.intersectObjects([tile.model]);\n\t\t\tif (intersects.length > 0) {\n\t\t\t\treturn intersects[0].point.y;\n\t\t\t}\n\t\t} catch (err) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tdispose() {\n\t\tthis.unload();\n\t}\n\n\t/**\n\t * @returns {boolean}\n\t */\n\tget isLoaded() {\n\t\treturn !!(this.hiresMaterial && this.lowresMaterial);\n\t}\n\n}\n","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nexport const SKY_FRAGMENT_SHADER = `\nuniform float sunlightStrength;\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(sunlightStrength * sunlightStrength, 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`;\n","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nexport const SKY_VERTEX_SHADER = `\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`;\n","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport {BackSide, Mesh, Scene, ShaderMaterial, SphereGeometry} from 'three';\n\nimport {SKY_FRAGMENT_SHADER} from './SkyFragmentShader';\nimport {SKY_VERTEX_SHADER} from './SkyVertexShader';\n\nexport class SkyboxScene extends Scene {\n\n\tconstructor(uniforms) {\n\t\tsuper();\n\n\t\tthis.autoUpdate = false;\n\n\t\tObject.defineProperty(this, 'isSkyboxScene', {value: true});\n\n\t\tlet geometry = new SphereGeometry(1, 40, 5);\n\t\tlet material = new ShaderMaterial({\n\t\t\tuniforms: uniforms,\n\t\t\tvertexShader: SKY_VERTEX_SHADER,\n\t\t\tfragmentShader: SKY_FRAGMENT_SHADER,\n\t\t\tside: BackSide\n\t\t});\n\t\tlet skybox = new Mesh(geometry, material);\n\n\t\tthis.add(skybox);\n\t}\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nimport {MathUtils, Vector3} from \"three\";\nimport {dispatchEvent} from \"../util/Utils\";\nimport {Map} from \"../map/Map\";\n\nexport class ControlsManager {\n\n\t/**\n\t * @param mapViewer {MapViewer}\n\t * @param camera {CombinedCamera}\n\t */\n\tconstructor(mapViewer, camera) {\n\t\tObject.defineProperty( this, 'isControlsManager', { value: true } );\n\n\t\tthis.data = {\n\t\t\tmapViewer: null,\n\t\t\tcamera: null,\n\t\t\tcontrols: null,\n\t\t\tposition: new Vector3(0, 0, 0),\n\t\t\trotation: 0,\n\t\t\tangle: 0,\n\t\t\ttilt: 0,\n\t\t};\n\n\t\tthis.mapViewer = mapViewer;\n\t\tthis.camera = camera;\n\n\t\t/** @type {Vector3} */\n\t\tthis.lastPosition = this.position.clone();\n\t\tthis.lastRotation = this.rotation;\n\t\tthis.lastAngle = this.angle;\n\t\tthis.lastDistance = this.distance;\n\t\tthis.lastOrtho = this.ortho;\n\t\tthis.lastTilt = this.tilt;\n\n\t\tthis.lastMapUpdatePosition = this.position.clone();\n\n\t\tthis.averageDeltaTime = 16;\n\n\t\tthis._controls = null;\n\n\t\t// start\n\t\tthis.distance = 300;\n\t\tthis.position.set(0, 0, 0);\n\t\tthis.rotation = 0;\n\t\tthis.angle = 0;\n\t\tthis.tilt = 0;\n\t\tthis.ortho = 0;\n\n\t\tthis.updateCamera();\n\t}\n\n\t/**\n\t * @param deltaTime {number}\n\t * @param map {Map}\n\t */\n\tupdate(deltaTime, map) {\n\t\tif (deltaTime > 50) deltaTime = 50; // assume min 20 UPS\n\t\tthis.averageDeltaTime = this.averageDeltaTime * 0.9 + deltaTime * 0.1; // average delta-time to avoid choppy controls on lag-spikes\n\n\t\tif (this._controls) this._controls.update(this.averageDeltaTime, map);\n\n\t\tthis.updateCamera();\n\t}\n\n\tupdateCamera() {\n\t\tlet valueChanged = this.isValueChanged();\n\n\t\tif (valueChanged) {\n\t\t\tthis.resetValueChanged();\n\n\t\t\t// wrap rotation\n\t\t\twhile (this.rotation >= Math.PI) this.rotation -= Math.PI * 2;\n\t\t\twhile (this.rotation <= -Math.PI) this.rotation += Math.PI * 2;\n\n\t\t\t// prevent problems with the rotation when the angle is 0 (top-down) or distance is 0 (first-person)\n\t\t\tlet rotatableAngle = this.angle;\n\t\t\tif (Math.abs(rotatableAngle) <= 0.0001) rotatableAngle = 0.0001;\n\t\t\telse if (Math.abs(rotatableAngle) - Math.PI <= 0.0001) rotatableAngle = rotatableAngle - 0.0001;\n\t\t\tlet rotatableDistance = this.distance;\n\t\t\tif (Math.abs(rotatableDistance) <= 0.0001) rotatableDistance = 0.0001;\n\n\t\t\t// fix distance for orthogonal-camera\n\t\t\tif (this.ortho > 0) {\n\t\t\t\trotatableDistance = MathUtils.lerp(rotatableDistance, Math.max(rotatableDistance, 300), Math.pow(this.ortho, 8));\n\t\t\t}\n\n\t\t\t// calculate rotationVector\n\t\t\tlet rotationVector = new Vector3(Math.sin(this.rotation), 0, -Math.cos(this.rotation)); // 0 is towards north\n\t\t\tlet angleRotationAxis = new Vector3(0, 1, 0).cross(rotationVector);\n\t\t\trotationVector.applyAxisAngle(angleRotationAxis, (Math.PI / 2) - rotatableAngle);\n\t\t\trotationVector.multiplyScalar(rotatableDistance);\n\n\t\t\t// position camera\n\t\t\tthis.camera.rotation.set(0, 0, 0);\n\t\t\tthis.camera.position.copy(this.position).sub(rotationVector);\n\t\t\tthis.camera.lookAt(this.position);\n\t\t\tthis.camera.rotateZ(this.tilt + rotatableAngle < 0 ? Math.PI : 0);\n\n\t\t\t// optimize far/near planes\n\t\t\tif (this.ortho <= 0) {\n\t\t\t\tlet near = MathUtils.clamp(rotatableDistance / 1000, 0.01, 1);\n\t\t\t\tlet far = MathUtils.clamp(rotatableDistance * 2, Math.max(near + 1, 2000), rotatableDistance + 5000);\n\t\t\t\tif (far - near > 10000) near = far - 10000;\n\t\t\t\tthis.camera.near = near;\n\t\t\t\tthis.camera.far = far;\n\t\t\t} else if (this.angle === 0) {\n\t\t\t\tthis.camera.near = 1;\n\t\t\t\tthis.camera.far = rotatableDistance + 300;\n\t\t\t} else {\n\t\t\t\tthis.camera.near = 1;\n\t\t\t\tthis.camera.far = 100000;\n\t\t\t}\n\n\t\t\t// event\n\t\t\tdispatchEvent(this.mapViewer.events, \"bluemapCameraMoved\", {\n\t\t\t\tcontrolsManager: this,\n\t\t\t\tcamera: this.camera\n\t\t\t});\n\t\t}\n\n\t\t// if the position changed, update map to show new position\n\t\tif (this.mapViewer.map) {\n\t\t\tlet triggerDistance = 1;\n\t\t\tif (valueChanged) {\n\t\t\t\tif (this.distance > 300) {\n\t\t\t\t\ttriggerDistance = this.mapViewer.data.loadedLowresViewDistance * 0.5;\n\t\t\t\t} else {\n\t\t\t\t\ttriggerDistance = this.mapViewer.data.loadedHiresViewDistance * 0.5;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tMath.abs(this.lastMapUpdatePosition.x - this.position.x) >= triggerDistance ||\n\t\t\t\tMath.abs(this.lastMapUpdatePosition.z - this.position.z) >= triggerDistance\n\t\t\t) {\n\t\t\t\tthis.lastMapUpdatePosition = this.position.clone();\n\t\t\t\tthis.mapViewer.loadMapArea(this.position.x, this.position.z);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Triggers an interaction on the screen (map), e.g. a mouse-click\n\t * @param screenPosition {THREE.Vector2} - Clicked position on the screen (usually event.x, event.y)\n\t * @param data {object} - Custom event data that will be added to the interaction-event\n\t */\n\thandleMapInteraction(screenPosition, data = {}) {\n\t\tthis.mapViewer.handleMapInteraction(screenPosition, data);\n\t}\n\n\tisValueChanged() {\n\t\treturn !(\n\t\t\tthis.data.position.equals(this.lastPosition) &&\n\t\t\tthis.data.rotation === this.lastRotation &&\n\t\t\tthis.data.angle === this.lastAngle &&\n\t\t\tthis.distance === this.lastDistance &&\n\t\t\tthis.ortho === this.lastOrtho &&\n\t\t\tthis.data.tilt === this.lastTilt\n\t\t);\n\t}\n\n\tresetValueChanged() {\n\t\tthis.lastPosition.copy(this.data.position);\n\t\tthis.lastRotation = this.data.rotation;\n\t\tthis.lastAngle = this.data.angle;\n\t\tthis.lastDistance = this.distance;\n\t\tthis.lastOrtho = this.ortho;\n\t\tthis.lastTilt = this.data.tilt;\n\t}\n\n\t/**\n\t * @returns {number}\n\t */\n\tget ortho() {\n\t\treturn this.camera.ortho;\n\t}\n\n\t/**\n\t * @param ortho {number}\n\t */\n\tset ortho(ortho) {\n\t\tthis.camera.ortho = ortho;\n\t}\n\n\tget distance() {\n\t\treturn this.camera.distance;\n\t}\n\n\tset distance(distance) {\n\t\tthis.camera.distance = distance;\n\t}\n\n\t/** @typedef ControlsLike {{\n\t * \t\tstart: function(controls: ControlsManager),\n\t * \t\tstop: function(),\n\t * \t\tupdate: function(deltaTime: number, map: Map)\n\t * \t}}\n\n\t/**\n\t * @param controls {ControlsLike}\n\t */\n\tset controls(controls) {\n\t\tif (this._controls && this._controls.stop)\n\t\t\tthis._controls.stop();\n\n\t\tthis._controls = controls;\n\t\tif (controls) this.data.controls = controls.data || null\n\n\t\tif (this._controls && this._controls.start)\n\t\t\tthis._controls.start(this);\n\t}\n\n\t/**\n\t * @returns {ControlsLike}\n\t */\n\tget controls() {\n\t\treturn this._controls;\n\t}\n\n\t/**\n\t * @returns {MapViewer}\n\t */\n\tget mapViewer() {\n\t\treturn this._mapViewer;\n\t}\n\n\t/**\n\t * @param value {MapViewer}\n\t */\n\tset mapViewer(value) {\n\t\tthis._mapViewer = value;\n\t\tthis.data.mapViewer = value.data;\n\t}\n\n\t/**\n\t * @returns {CombinedCamera}\n\t */\n\tget camera() {\n\t\treturn this._camera;\n\t}\n\n\t/**\n\t * @param value {CombinedCamera}\n\t */\n\tset camera(value) {\n\t\tthis._camera = value;\n\t\tthis.data.camera = value.data;\n\t}\n\n\t/**\n\t * @returns {Vector3}\n\t */\n\tget position() {\n\t\treturn this.data.position;\n\t}\n\n\t/**\n\t * @param value {Vector3}\n\t */\n\tset position(value) {\n\t\tthis.data.position = value;\n\t}\n\n\t/**\n\t * @returns {number}\n\t */\n\tget rotation() {\n\t\treturn this.data.rotation;\n\t}\n\n\t/**\n\t * @param value {number}\n\t */\n\tset rotation(value) {\n\t\tthis.data.rotation = value;\n\t}\n\n\t/**\n\t * @returns {number}\n\t */\n\tget angle() {\n\t\treturn this.data.angle;\n\t}\n\n\t/**\n\t * @param value {number}\n\t */\n\tset angle(value) {\n\t\tthis.data.angle = value;\n\t}\n\n\t/**\n\t * @returns {number}\n\t */\n\tget tilt() {\n\t\treturn this.data.tilt;\n\t}\n\n\t/**\n\t * @param value {number}\n\t */\n\tset tilt(value) {\n\t\tthis.data.tilt = value;\n\t}\n}","/**\n * Taken from https://github.com/mrdoob/three.js/blob/master/examples/jsm/libs/stats.module.js\n */\nlet Stats = function () {\n\n let mode = 0;\n\n let container = document.createElement( 'div' );\n container.style.cssText = 'position:absolute;bottom:5px;right:5px;cursor:pointer;opacity:0.9;z-index:10000';\n container.addEventListener( 'click', function ( event ) {\n\n event.preventDefault();\n showPanel( ++ mode % container.children.length );\n\n }, false );\n\n //\n\n function addPanel( panel ) {\n\n container.appendChild( panel.dom );\n return panel;\n\n }\n\n function showPanel( id ) {\n\n for ( let i = 0; i < container.children.length; i ++ ) {\n\n container.children[ i ].style.display = i === id ? 'block' : 'none';\n\n }\n\n mode = id;\n\n }\n\n function hide() {\n showPanel(-1);\n }\n\n //\n\n let beginTime = ( performance || Date ).now(), prevTime = beginTime, frames = 0;\n let prevFrameTime = beginTime;\n\n let fpsPanel = addPanel( new Stats.Panel( 'FPS', '#0ff', '#002' ) );\n let msPanel = addPanel( new Stats.Panel( 'MS (render)', '#0f0', '#020' ) );\n let lastFrameMsPanel = addPanel( new Stats.Panel( 'MS (all)', '#f80', '#210' ) );\n\n let memPanel = null;\n if ( self.performance && self.performance.memory ) {\n\n memPanel = addPanel( new Stats.Panel( 'MB', '#f08', '#201' ) );\n\n }\n\n showPanel( 0 );\n\n return {\n\n REVISION: 16,\n\n dom: container,\n\n addPanel: addPanel,\n showPanel: showPanel,\n hide: hide,\n\n begin: function () {\n\n beginTime = ( performance || Date ).now();\n\n },\n\n end: function () {\n\n frames ++;\n\n let time = ( performance || Date ).now();\n\n msPanel.update( time - beginTime, 200 );\n lastFrameMsPanel.update( time - prevFrameTime, 200 )\n\n if ( time >= prevTime + 1000 ) {\n\n fpsPanel.update( ( frames * 1000 ) / ( time - prevTime ), 100 );\n\n prevTime = time;\n frames = 0;\n\n if ( memPanel ) {\n\n let memory = performance.memory;\n memPanel.update( memory.usedJSHeapSize / 1048576, memory.jsHeapSizeLimit / 1048576 );\n\n }\n\n }\n\n return time;\n\n },\n\n update: function () {\n\n beginTime = this.end();\n prevFrameTime = beginTime;\n\n },\n\n // Backwards Compatibility\n\n domElement: container,\n setMode: showPanel\n\n };\n\n};\n\nStats.Panel = function ( name, fg, bg ) {\n\n let min = Infinity, max = 0, round = Math.round;\n let PR = round( window.devicePixelRatio || 1 );\n\n let WIDTH = 160 * PR, HEIGHT = 96 * PR,\n TEXT_X = 3 * PR, TEXT_Y = 3 * PR,\n GRAPH_X = 3 * PR, GRAPH_Y = 15 * PR,\n GRAPH_WIDTH = 154 * PR, GRAPH_HEIGHT = 77 * PR;\n\n let canvas = document.createElement( 'canvas' );\n canvas.width = WIDTH;\n canvas.height = HEIGHT;\n canvas.style.cssText = 'width:160px;height:96px';\n\n let context = canvas.getContext( '2d' );\n context.font = 'bold ' + ( 9 * PR ) + 'px Helvetica,Arial,sans-serif';\n context.textBaseline = 'top';\n\n context.fillStyle = bg;\n context.fillRect( 0, 0, WIDTH, HEIGHT );\n\n context.fillStyle = fg;\n context.fillText( name, TEXT_X, TEXT_Y );\n context.fillRect( GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT );\n\n context.fillStyle = bg;\n context.globalAlpha = 0.9;\n context.fillRect( GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT );\n\n return {\n\n dom: canvas,\n\n update: function ( value, maxValue ) {\n\n min = Math.min( min, value );\n max = Math.max( max, value );\n\n context.fillStyle = bg;\n context.globalAlpha = 1;\n context.fillRect( 0, 0, WIDTH, GRAPH_Y );\n context.fillStyle = fg;\n context.fillText( round( value ) + ' ' + name + ' (' + round( min ) + '-' + round( max ) + ')', TEXT_X, TEXT_Y );\n\n context.drawImage( canvas, GRAPH_X + PR, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT, GRAPH_X, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT );\n\n context.fillRect( GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, GRAPH_HEIGHT );\n\n context.fillStyle = bg;\n context.globalAlpha = 0.9;\n context.fillRect( GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, round( ( 1 - ( value / maxValue ) ) * GRAPH_HEIGHT ) );\n\n }\n\n };\n\n};\n\nexport default Stats;","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the 'Software'), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport { ShaderChunk } from 'three';\n\nexport const HIRES_VERTEX_SHADER = `\n#include \n${ShaderChunk.logdepthbuf_pars_vertex}\n\nattribute float ao;\nattribute float sunlight;\nattribute float blocklight;\n\nvarying vec3 vPosition;\n//varying vec3 vWorldPosition;\nvarying vec3 vNormal;\nvarying vec2 vUv;\nvarying vec3 vColor;\nvarying float vAo;\nvarying float vSunlight;\nvarying float vBlocklight;\n//varying float vDistance;\n\nvoid main() {\n\tvec4 worldPos = modelMatrix * vec4(position, 1);\n\tvec4 viewPos = viewMatrix * worldPos;\n\n\tvPosition = position;\n\t//vWorldPosition = worldPos.xyz;\n\tvNormal = normal;\n\tvUv = uv;\n\tvColor = color;\n\tvAo = ao;\n\tvSunlight = sunlight;\n\tvBlocklight = blocklight;\n\t//vDistance = -viewPos.z\n\t\n\tgl_Position = projectionMatrix * viewPos;\n\t\n\t${ShaderChunk.logdepthbuf_vertex} \n}\n`;\n","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the 'Software'), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport { ShaderChunk } from 'three';\n\nexport const HIRES_FRAGMENT_SHADER = `\n${ShaderChunk.logdepthbuf_pars_fragment}\n\n#ifndef texture\n\t#define texture texture2D\n#endif\n\nuniform sampler2D textureImage;\nuniform float sunlightStrength;\nuniform float ambientLight;\n\nvarying vec3 vPosition;\n//varying vec3 vWorldPosition;\nvarying vec3 vNormal;\nvarying vec2 vUv;\nvarying vec3 vColor;\nvarying float vAo;\nvarying float vSunlight;\nvarying float vBlocklight;\n//varying float vDistance;\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${ShaderChunk.logdepthbuf_fragment}\n}\n`;\n","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the 'Software'), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport { ShaderChunk } from 'three';\n\nexport const LOWRES_VERTEX_SHADER = `\n#include \n${ShaderChunk.logdepthbuf_pars_vertex}\n\nvarying vec3 vPosition;\nvarying vec3 vWorldPosition;\nvarying vec3 vNormal;\nvarying vec2 vUv;\nvarying vec3 vColor;\nvarying float vDistance;\n\nvoid main() {\n\tvec4 worldPos = modelMatrix * vec4(position, 1);\n\tvec4 viewPos = viewMatrix * worldPos;\n\t\n\tvPosition = position;\n\tvWorldPosition = worldPos.xyz;\n\tvNormal = normal;\n\tvUv = uv;\n\tvColor = color;\n\tvDistance = -viewPos.z;\n\t\n\tgl_Position = projectionMatrix * viewPos;\n\t\t\n\t${ShaderChunk.logdepthbuf_vertex}\n}\n`;\n","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the 'Software'), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport { ShaderChunk } from 'three';\n\nexport const LOWRES_FRAGMENT_SHADER = `\n${ShaderChunk.logdepthbuf_pars_fragment}\n\n#ifndef texture\n\t#define texture texture2D\n#endif\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;\nvarying float vDistance;\n\nvoid main() {\n\t//discard if hires tile is loaded at that position\n\tif (vDistance < 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${ShaderChunk.logdepthbuf_fragment}\n}\n`;\n","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport {MathUtils, Matrix4, PerspectiveCamera} from \"three\";\n\nexport class CombinedCamera extends PerspectiveCamera {\n\n /**\n * @param fov {number}\n * @param aspect {number}\n * @param near {number}\n * @param far {number}\n * @param ortho {number}\n */\n constructor(fov, aspect, near, far, ortho) {\n super(fov, aspect, near, far);\n\n this.data = {\n fov: this.fov,\n aspect: this.aspect,\n near: this.near,\n far: this.far,\n zoom: this.zoom,\n ortho: ortho,\n distance: 1,\n };\n\n // redirect parent properties\n Object.defineProperty(this, \"fov\", {\n get() { return this.data.fov },\n set(value) { this.data.fov = value }\n });\n Object.defineProperty(this, \"aspect\", {\n get() { return this.data.aspect },\n set(value) { this.data.aspect = value }\n });\n Object.defineProperty(this, \"near\", {\n get() { return this.data.near },\n set(value) { this.data.near = value }\n });\n Object.defineProperty(this, \"far\", {\n get() { return this.data.far },\n set(value) { this.data.far = value }\n });\n Object.defineProperty(this, \"zoom\", {\n get() { return this.data.zoom },\n set(value) { this.data.zoom = value }\n });\n\n this.updateProjectionMatrix();\n }\n\n updateProjectionMatrix() {\n if (!this.ortographicProjection)\n this.ortographicProjection = new Matrix4();\n\n if (!this.perspectiveProjection)\n this.perspectiveProjection = new Matrix4();\n\n if (!this.data)\n this.data = {};\n\n //copied from PerspectiveCamera\n const near = this.near;\n let top = near * Math.tan( MathUtils.DEG2RAD * 0.5 * this.fov ) / this.zoom;\n let height = 2 * top;\n let width = this.aspect * height;\n let left = - 0.5 * width;\n const view = this.view;\n\n if ( this.view !== null && this.view.enabled ) {\n\n const fullWidth = view.fullWidth,\n fullHeight = view.fullHeight;\n\n left += view.offsetX * width / fullWidth;\n top -= view.offsetY * height / fullHeight;\n width *= view.width / fullWidth;\n height *= view.height / fullHeight;\n\n }\n\n const skew = this.filmOffset;\n if ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n // this part different to PerspectiveCamera\n let normalizedOrtho = -Math.pow(this.ortho - 1, 6) + 1;\n let orthoTop = Math.max(this.distance, 0.0001) * Math.tan( MathUtils.DEG2RAD * 0.5 * this.fov ) / this.zoom;\n let orthoHeight = 2 * orthoTop;\n let orthoWidth = this.aspect * orthoHeight;\n let orthoLeft = - 0.5 * orthoWidth;\n\n this.perspectiveProjection.makePerspective( left, left + width, top, top - height, near, this.far );\n this.ortographicProjection.makeOrthographic( orthoLeft, orthoLeft + orthoWidth, orthoTop, orthoTop - orthoHeight, near, this.far );\n\n for (let i = 0; i < 16; i++){\n this.projectionMatrix.elements[i] = (this.perspectiveProjection.elements[i] * (1 - normalizedOrtho)) + (this.ortographicProjection.elements[i] * normalizedOrtho);\n }\n // to here\n\n this.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n }\n\n /**\n * @returns {boolean}\n */\n get isPerspectiveCamera() {\n return this.ortho < 1;\n }\n\n /**\n * @returns {boolean}\n */\n get isOrthographicCamera() {\n return !this.isPerspectiveCamera;\n }\n\n /**\n * @returns {string}\n */\n get type() {\n return this.isPerspectiveCamera ? 'PerspectiveCamera' : 'OrthographicCamera';\n }\n\n /**\n * @param type {string}\n */\n set type(type) {\n //ignore\n }\n\n /**\n * @returns {number}\n */\n get ortho() {\n return this.data.ortho;\n }\n\n /**\n * @param value {number}\n */\n set ortho(value) {\n this.data.ortho = value;\n }\n\n /**\n * @returns {number}\n */\n get distance() {\n return this.data.distance;\n }\n\n /**\n * @param value {number}\n */\n set distance(value) {\n this.data.distance = value;\n }\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport {Color, PerspectiveCamera, Raycaster, Scene, Vector2, Vector3, WebGLRenderer} from \"three\";\nimport {Map} from \"./map/Map\";\nimport {SkyboxScene} from \"./skybox/SkyboxScene\";\nimport {ControlsManager} from \"./controls/ControlsManager\";\nimport Stats from \"./util/Stats\";\nimport {alert, dispatchEvent, elementOffset, generateCacheHash, htmlToElement} from \"./util/Utils\";\nimport {TileManager} from \"./map/TileManager\";\nimport {HIRES_VERTEX_SHADER} from \"./map/hires/HiresVertexShader\";\nimport {HIRES_FRAGMENT_SHADER} from \"./map/hires/HiresFragmentShader\";\nimport {LOWRES_VERTEX_SHADER} from \"./map/lowres/LowresVertexShader\";\nimport {LOWRES_FRAGMENT_SHADER} from \"./map/lowres/LowresFragmentShader\";\nimport {CombinedCamera} from \"./util/CombinedCamera\";\nimport {CSS2DRenderer} from \"./util/CSS2DRenderer\";\nimport {MarkerSet} from \"./markers/MarkerSet\";\n\nexport class MapViewer {\n\n\t/**\n\t * @param element {Element}\n\t * @param events {EventTarget}\n\t */\n\tconstructor(element, events = element) {\n\t\tObject.defineProperty( this, 'isMapViewer', { value: true } );\n\n\t\tthis.rootElement = element;\n\t\tthis.events = events;\n\n\t\tthis.data = {\n\t\t\tmap: null,\n\t\t\tcamera: null,\n\t\t\tcontrolsManager: null,\n\t\t\tuniforms: {\n\t\t\t\tsunlightStrength: { value: 1 },\n\t\t\t\tambientLight: { value: 0 },\n\t\t\t\tskyColor: { value: new Color(0.5, 0.5, 1) },\n\t\t\t\thiresTileMap: {\n\t\t\t\t\tvalue: {\n\t\t\t\t\t\tmap: null,\n\t\t\t\t\t\tsize: TileManager.tileMapSize,\n\t\t\t\t\t\tscale: new Vector2(1, 1),\n\t\t\t\t\t\ttranslate: new Vector2(),\n\t\t\t\t\t\tpos: new Vector2(),\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tsuperSampling: 1,\n\t\t\tloadedCenter: new Vector2(0, 0),\n\t\t\tloadedHiresViewDistance: 200,\n\t\t\tloadedLowresViewDistance: 2000,\n\t\t}\n\n\t\tthis.tileCacheHash = generateCacheHash();\n\n\t\tthis.stats = new Stats();\n\t\tthis.stats.hide();\n\n\t\t// renderer\n\t\tthis.renderer = new WebGLRenderer({\n\t\t\tantialias: true,\n\t\t\tsortObjects: true,\n\t\t\tpreserveDrawingBuffer: true,\n\t\t\tlogarithmicDepthBuffer: true,\n\t\t});\n\t\tthis.renderer.autoClear = false;\n\t\tthis.renderer.uniforms = this.data.uniforms;\n\n\t\t// CSS2D renderer\n\t\tthis.css2dRenderer = new CSS2DRenderer(this.events);\n\n\t\tthis.skyboxScene = new SkyboxScene(this.data.uniforms);\n\n\t\tthis.camera = new CombinedCamera(75, 1, 0.1, 10000, 0);\n\t\tthis.skyboxCamera = new PerspectiveCamera(75, 1, 0.1, 10000);\n\n\t\tthis.controlsManager = new ControlsManager(this, this.camera);\n\n\t\tthis.raycaster = new Raycaster();\n\t\tthis.raycaster.layers.enableAll();\n\t\tthis.raycaster.params.Line2 = {threshold: 20}\n\n\t\t/** @type {Map} */\n\t\tthis.map = null;\n\n\t\tthis.markers = new MarkerSet(\"bm-root\");\n\n\t\tthis.lastFrame = 0;\n\n\t\t// initialize\n\t\tthis.initializeRootElement();\n\n\t\t// handle window resizes\n\t\twindow.addEventListener(\"resize\", this.handleContainerResize);\n\n\t\t// start render-loop\n\t\trequestAnimationFrame(this.renderLoop);\n\t}\n\n\t/**\n\t * Initializes the root-element\n\t */\n\tinitializeRootElement() {\n\t\tthis.rootElement.innerHTML = \"\";\n\n\t\tlet outerDiv = htmlToElement(`
`);\n\t\tthis.rootElement.appendChild(outerDiv);\n\n\t\t// 3d-canvas\n\t\touterDiv.appendChild(this.renderer.domElement);\n\n\t\t// html-markers\n\t\tthis.css2dRenderer.domElement.style.position = 'absolute';\n\t\tthis.css2dRenderer.domElement.style.top = '0';\n\t\tthis.css2dRenderer.domElement.style.left = '0';\n\t\tthis.css2dRenderer.domElement.style.pointerEvents = 'none';\n\t\touterDiv.appendChild(this.css2dRenderer.domElement);\n\n\t\t// performance monitor\n\t\touterDiv.appendChild(this.stats.dom);\n\n\t\tthis.handleContainerResize();\n\t}\n\n\t/**\n\t * Updates the render-resolution and aspect ratio based on the size of the root-element\n\t */\n\thandleContainerResize = () => {\n\t\tthis.renderer.setSize(this.rootElement.clientWidth, this.rootElement.clientHeight);\n\t\tthis.renderer.setPixelRatio(window.devicePixelRatio * this.superSampling);\n\n\t\tthis.css2dRenderer.setSize(this.rootElement.clientWidth, this.rootElement.clientHeight);\n\n\t\tthis.camera.aspect = this.rootElement.clientWidth / this.rootElement.clientHeight;\n\t\tthis.camera.updateProjectionMatrix();\n\t};\n\n\t/**\n\t * Triggers an interaction on the screen (map), e.g. a mouse-click.\n\t *\n\t * This will first attempt to invoke the onClick() method on the Object3D (e.g. Markers) that has been clicked.\n\t * And if none of those consumed the event, it will fire a bluemapMapInteraction event.\n\t *\n\t * @param screenPosition {Vector2} - Clicked position on the screen (usually event.x, event.y)\n\t * @param data {object} - Custom event data that will be added to the interaction-event\n\t */\n\thandleMapInteraction(screenPosition, data = {}) {\n\t\tlet rootOffset = elementOffset(this.rootElement);\n\t\tlet normalizedScreenPos = new Vector2(\n\t\t\t((screenPosition.x - rootOffset.top) / this.rootElement.clientWidth) * 2 - 1,\n\t\t\t-((screenPosition.y - rootOffset.left) / this.rootElement.clientHeight) * 2 + 1\n\t\t);\n\n\t\tif (this.map && this.map.isLoaded){\n\t\t\tthis.raycaster.setFromCamera(normalizedScreenPos, this.camera);\n\n\t\t\t// check Object3D interactions\n\t\t\tlet intersects = this.raycaster.intersectObjects([this.map.hiresTileManager.scene, this.map.lowresTileManager.scene, this.markers], true);\n\t\t\tlet hit = null;\n\t\t\tlet lowresHit = null;\n\t\t\tlet hiresHit = null;\n\t\t\tlet covered = false;\n\t\t\tfor (let i = 0; i < intersects.length; i++) {\n\t\t\t\tif (intersects[i].object){\n\t\t\t\t\tlet object = intersects[i].object;\n\n\t\t\t\t\t// check if deeply-visible\n\t\t\t\t\tlet parent = object;\n\t\t\t\t\tlet visible = parent.visible;\n\t\t\t\t\twhile (visible && parent.parent){\n\t\t\t\t\t\tparent = parent.parent;\n\t\t\t\t\t\tvisible = parent.visible;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (visible) {\n\t\t\t\t\t\tif (!hit) hit = intersects[i];\n\n\t\t\t\t\t\t// find root-scene\n\t\t\t\t\t\tlet parentRoot = object;\n\t\t\t\t\t\twhile(parentRoot.parent) parentRoot = parentRoot.parent;\n\n\t\t\t\t\t\tif (parentRoot === this.map.lowresTileManager.scene) {\n\t\t\t\t\t\t\tif (!lowresHit) lowresHit = intersects[i];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (parentRoot === this.map.hiresTileManager.scene) {\n\t\t\t\t\t\t\tif (!hiresHit) hiresHit = intersects[i];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!covered || (object.material && !object.material.depthTest)) {\n\t\t\t\t\t\t\tif (object.onClick && object.onClick({\n\t\t\t\t\t\t\t\tdata: data,\n\t\t\t\t\t\t\t\tintersection: intersects[i]\n\t\t\t\t\t\t\t})) return;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (parentRoot !== this.map.lowresTileManager.scene) {\n\t\t\t\t\t\t\tcovered = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// fire event\n\t\t\tdispatchEvent(this.events, \"bluemapMapInteraction\", {\n\t\t\t\tdata: data,\n\t\t\t\thit: hit,\n\t\t\t\thiresHit: hiresHit,\n\t\t\t\tlowresHit: lowresHit,\n\t\t\t\tintersections: intersects,\n\t\t\t\tray: this.raycaster.ray\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * @private\n\t * The render-loop to update and possibly render a new frame.\n\t * @param now {number} the current time in milliseconds\n\t */\n\trenderLoop = (now) => {\n\t\trequestAnimationFrame(this.renderLoop);\n\n\t\t// calculate delta time\n\t\tif (this.lastFrame <= 0) this.lastFrame = now;\n\t\tlet delta = now - this.lastFrame;\n\t\tthis.lastFrame = now;\n\n\t\t// update stats\n\t\tthis.stats.begin();\n\n\t\t// update controls\n\t\tif (this.map != null) {\n\t\t\tthis.controlsManager.update(delta, this.map);\n\t\t}\n\n\t\t// render\n\t\tthis.render(delta);\n\n\t\t// update stats\n\t\tthis.stats.update();\n\t};\n\n\t/**\n\t * @private\n\t * Renders a frame\n\t * @param delta {number}\n\t */\n\trender(delta) {\n\t\tdispatchEvent(this.events, \"bluemapRenderFrame\", {\n\t\t\tdelta: delta,\n\t\t});\n\n\t\t//prepare camera\n\t\tthis.camera.updateProjectionMatrix();\n\t\tthis.skyboxCamera.rotation.copy(this.camera.rotation);\n\t\tthis.skyboxCamera.updateProjectionMatrix();\n\n\t\t//render\n\t\tthis.renderer.clear();\n\n\t\tthis.renderer.render(this.skyboxScene, this.skyboxCamera);\n\t\tthis.renderer.clearDepth();\n\n\t\tif (this.map && this.map.isLoaded) {\n\t\t\t//update uniforms\n\t\t\tthis.data.uniforms.hiresTileMap.value.pos.copy(this.map.hiresTileManager.centerTile);\n\n\t\t\tthis.renderer.render(this.map.lowresTileManager.scene, this.camera);\n\t\t\tthis.renderer.clearDepth();\n\n\t\t\tif (this.controlsManager.distance < 2000) {\n\t\t\t\tthis.renderer.render(this.map.hiresTileManager.scene, this.camera);\n\t\t\t}\n\t\t}\n\n\t\t// render markers\n\t\tthis.renderer.render(this.markers, this.camera);\n\t\tthis.css2dRenderer.render(this.markers, this.camera);\n\t}\n\n\t/**\n\t * Changes / Sets the map that will be loaded and displayed\n\t * @param map {Map}\n\t * @returns Promise\n\t */\n\tswitchMap(map = null) {\n\t\tif (this.map && this.map.isMap) this.map.unload();\n\n\t\tthis.map = map;\n\n\t\tif (this.map && this.map.isMap) {\n\t\t\treturn map.load(HIRES_VERTEX_SHADER, HIRES_FRAGMENT_SHADER, LOWRES_VERTEX_SHADER, LOWRES_FRAGMENT_SHADER, this.data.uniforms, this.tileCacheHash)\n\t\t\t\t.then(() => {\n\t\t\t\t\tfor (let texture of this.map.loadedTextures){\n\t\t\t\t\t\tthis.renderer.initTexture(texture);\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.data.uniforms.skyColor.value = map.data.skyColor;\n\t\t\t\t\tthis.data.uniforms.ambientLight.value = map.data.ambientLight;\n\t\t\t\t\tthis.data.uniforms.hiresTileMap.value.map = map.hiresTileManager.tileMap.texture;\n\t\t\t\t\tthis.data.uniforms.hiresTileMap.value.scale.set(map.data.hires.tileSize.x, map.data.hires.tileSize.z);\n\t\t\t\t\tthis.data.uniforms.hiresTileMap.value.translate.set(map.data.hires.translate.x, map.data.hires.translate.z);\n\n\t\t\t\t\tsetTimeout(this.updateLoadedMapArea);\n\n\t\t\t\t\tdispatchEvent(this.events, \"bluemapMapChanged\", {\n\t\t\t\t\t\tmap: map\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.catch(error => {\n\t\t\t\t\talert(this.events, error, \"error\");\n\t\t\t\t});\n\t\t} else {\n\t\t\treturn Promise.resolve();\n\t\t}\n\t}\n\n\t/**\n\t * Loads the given area on the map (and unloads everything outside that area)\n\t * @param centerX {number}\n\t * @param centerZ {number}\n\t * @param hiresViewDistance {number?}\n\t * @param lowresViewDistance {number?}\n\t */\n\tloadMapArea(centerX, centerZ, hiresViewDistance = -1, lowresViewDistance = -1) {\n\t\tthis.data.loadedCenter.set(centerX, centerZ);\n\t\tif (hiresViewDistance >= 0) this.data.loadedHiresViewDistance = hiresViewDistance;\n\t\tif (lowresViewDistance >= 0) this.data.loadedLowresViewDistance = lowresViewDistance;\n\n\t\tthis.updateLoadedMapArea();\n\t}\n\n\tupdateLoadedMapArea = () => {\n\t\tif (!this.map) return;\n\t\tthis.map.loadMapArea(this.data.loadedCenter.x, this.data.loadedCenter.y, this.data.loadedHiresViewDistance, this.data.loadedLowresViewDistance);\n\t}\n\n\tclearTileCache(newTileCacheHash) {\n\t\tif (!newTileCacheHash) newTileCacheHash = generateCacheHash();\n\n\t\tthis.tileCacheHash = newTileCacheHash;\n\t\tif (this.map) {\n\t\t\tthis.map.lowresTileManager.tileLoader.tileCacheHash = this.tileCacheHash;\n\t\t\tthis.map.hiresTileManager.tileLoader.tileCacheHash = this.tileCacheHash;\n\t\t}\n\t}\n\n\t/**\n\t * @returns {number}\n\t */\n\tget superSampling() {\n\t\treturn this.data.superSampling;\n\t}\n\n\t/**\n\t * @param value {number}\n\t */\n\tset superSampling(value) {\n\t\tthis.data.superSampling = value;\n\t\tthis.handleContainerResize();\n\t}\n\n\t/**\n\t * @returns {CombinedCamera}\n\t */\n\tget camera() {\n\t\treturn this._camera;\n\t}\n\n\t/**\n\t * @param value {CombinedCamera}\n\t */\n\tset camera(value) {\n\t\tthis._camera = value;\n\t\tthis.data.camera = value.data;\n\t}\n\n\t/**\n\t * @returns {ControlsManager}\n\t */\n\tget controlsManager() {\n\t\treturn this._controlsManager;\n\t}\n\n\t/**\n\t * @param value {ControlsManager}\n\t */\n\tset controlsManager(value) {\n\t\tthis._controlsManager = value;\n\t\tthis.data.controlsManager = value.data;\n\t}\n\n\t/**\n\t * @returns {Map}\n\t */\n\tget map() {\n\t\treturn this._map;\n\t}\n\n\t/**\n\t * @param value {Map}\n\t */\n\tset map(value) {\n\t\tthis._map = value;\n\t\tif (value) this.data.map = value.data;\n\t}\n\n}\n","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nimport {MathUtils, Vector2} from \"three\";\nimport {VEC2_ZERO} from \"../../../util/Utils\";\n\nexport class MouseMoveControls {\n\n static tempVec2_1 = new Vector2();\n\n /**\n * @param target {Element}\n * @param speed {number}\n * @param stiffness {number}\n */\n constructor(target, speed, stiffness) {\n this.target = target;\n this.manager = null;\n\n this.moving = false;\n this.lastPosition = new Vector2();\n this.deltaPosition = new Vector2();\n\n this.speed = speed;\n this.stiffness = stiffness;\n\n this.pixelToSpeedMultiplierX = 0;\n this.pixelToSpeedMultiplierY = 0;\n this.updatePixelToSpeedMultiplier();\n }\n\n /**\n * @param manager {ControlsManager}\n */\n start(manager) {\n this.manager = manager;\n\n this.target.addEventListener(\"mousedown\", this.onMouseDown);\n window.addEventListener(\"mousemove\", this.onMouseMove);\n window.addEventListener(\"mouseup\", this.onMouseUp);\n\n window.addEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\n }\n\n stop() {\n this.target.removeEventListener(\"mousedown\", this.onMouseDown);\n window.removeEventListener(\"mousemove\", this.onMouseMove);\n window.removeEventListener(\"mouseup\", this.onMouseUp);\n\n window.removeEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\n }\n\n /**\n * @param delta {number}\n * @param map {Map}\n */\n update(delta, map) {\n if (this.deltaPosition.x === 0 && this.deltaPosition.y === 0) return;\n\n let smoothing = this.stiffness / (16.666 / delta);\n smoothing = MathUtils.clamp(smoothing, 0, 1);\n\n let directionDelta = MouseMoveControls.tempVec2_1.copy(this.deltaPosition);\n directionDelta.rotateAround(VEC2_ZERO, this.manager.rotation);\n\n this.manager.position.x += directionDelta.x * smoothing * this.manager.distance * this.speed * this.pixelToSpeedMultiplierX;\n this.manager.position.z += directionDelta.y * smoothing * this.manager.distance * this.speed * this.pixelToSpeedMultiplierY;\n\n this.deltaPosition.multiplyScalar(1 - smoothing);\n if (this.deltaPosition.lengthSq() < 0.0001) {\n this.deltaPosition.set(0, 0);\n }\n }\n\n reset() {\n this.deltaPosition.set(0, 0);\n }\n\n /**\n * @private\n * @param evt {MouseEvent}\n */\n onMouseDown = evt => {\n if ((evt.buttons !== undefined ? evt.buttons === 1 : evt.button === 0) && !evt.altKey) {\n this.moving = true;\n this.deltaPosition.set(0, 0);\n this.lastPosition.set(evt.x, evt.y);\n }\n }\n\n /**\n * @private\n * @param evt {MouseEvent}\n */\n onMouseMove = evt => {\n let position = MouseMoveControls.tempVec2_1.set(evt.x, evt.y);\n\n if(this.moving){\n this.deltaPosition.sub(position).add(this.lastPosition);\n }\n\n this.lastPosition.copy(position);\n }\n\n /**\n * @private\n * @param evt {MouseEvent}\n */\n onMouseUp = evt => {\n if (evt.button === 0) this.moving = false;\n }\n\n updatePixelToSpeedMultiplier = () => {\n this.pixelToSpeedMultiplierX = (1 / this.target.clientWidth) * (this.target.clientWidth / this.target.clientHeight);\n this.pixelToSpeedMultiplierY = 1 / this.target.clientHeight;\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nimport {MathUtils} from \"three\";\n\nexport class MouseZoomControls {\n\n /**\n * @param target {EventTarget}\n * @param speed {number}\n * @param stiffness {number}\n */\n constructor(target, speed, stiffness) {\n this.target = target;\n this.manager = null;\n\n this.stiffness = stiffness;\n this.speed = speed;\n\n this.deltaZoom = 0;\n }\n\n /**\n * @param manager {ControlsManager}\n */\n start(manager) {\n this.manager = manager;\n\n this.target.addEventListener(\"wheel\", this.onMouseWheel, {passive: true});\n }\n\n stop() {\n this.target.removeEventListener(\"wheel\", this.onMouseWheel);\n }\n\n /**\n * @param delta {number}\n * @param map {Map}\n */\n update(delta, map) {\n if (this.deltaZoom === 0) return;\n\n let smoothing = this.stiffness / (16.666 / delta);\n smoothing = MathUtils.clamp(smoothing, 0, 1);\n\n this.manager.distance *= Math.pow(1.5, this.deltaZoom * smoothing * this.speed);\n\n this.deltaZoom *= 1 - smoothing;\n if (Math.abs(this.deltaZoom) < 0.0001) {\n this.deltaZoom = 0;\n }\n }\n\n reset() {\n this.deltaZoom = 0;\n }\n\n /**\n * @private\n * @param evt {WheelEvent}\n */\n onMouseWheel = evt => {\n let delta = evt.deltaY;\n if (evt.deltaMode === WheelEvent.DOM_DELTA_PIXEL) delta *= 0.01;\n if (evt.deltaMode === WheelEvent.DOM_DELTA_LINE) delta *= 0.33;\n\n this.deltaZoom += delta;\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nimport {MathUtils} from \"three\";\n\nexport class MouseRotateControls {\n\n /**\n * @param target {EventTarget}\n * @param speed {number}\n * @param stiffness {number}\n */\n constructor(target, speed, stiffness) {\n this.target = target;\n this.manager = null;\n\n this.moving = false;\n this.lastX = 0;\n this.deltaRotation = 0;\n\n this.speed = speed;\n this.stiffness = stiffness;\n\n this.pixelToSpeedMultiplierX = 0;\n this.updatePixelToSpeedMultiplier();\n }\n\n /**\n * @param manager {ControlsManager}\n */\n start(manager) {\n this.manager = manager;\n\n this.target.addEventListener(\"mousedown\", this.onMouseDown);\n window.addEventListener(\"mousemove\", this.onMouseMove);\n window.addEventListener(\"mouseup\", this.onMouseUp);\n\n window.addEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\n }\n\n stop() {\n this.target.removeEventListener(\"mousedown\", this.onMouseDown);\n window.removeEventListener(\"mousemove\", this.onMouseMove);\n window.removeEventListener(\"mouseup\", this.onMouseUp);\n\n window.removeEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\n }\n\n /**\n * @param delta {number}\n * @param map {Map}\n */\n update(delta, map) {\n if (this.deltaRotation === 0) return;\n\n let smoothing = this.stiffness / (16.666 / delta);\n smoothing = MathUtils.clamp(smoothing, 0, 1);\n\n this.manager.rotation += this.deltaRotation * smoothing * this.speed * this.pixelToSpeedMultiplierX;\n\n this.deltaRotation *= 1 - smoothing;\n if (Math.abs(this.deltaRotation) < 0.0001) {\n this.deltaRotation = 0;\n }\n }\n\n reset() {\n this.deltaRotation = 0;\n }\n\n /**\n * @private\n * @param evt {MouseEvent}\n */\n onMouseDown = evt => {\n if ((evt.buttons !== undefined ? evt.buttons === 2 : evt.button === 2) ||\n ((evt.altKey || evt.ctrlKey) && (evt.buttons !== undefined ? evt.buttons === 1 : evt.button === 0))) {\n this.moving = true;\n this.deltaRotation = 0;\n this.lastX = evt.x;\n }\n }\n\n /**\n * @private\n * @param evt {MouseEvent}\n */\n onMouseMove = evt => {\n if(this.moving){\n this.deltaRotation += evt.x - this.lastX;\n }\n\n this.lastX = evt.x;\n }\n\n /**\n * @private\n * @param evt {MouseEvent}\n */\n onMouseUp = evt => {\n this.moving = false;\n }\n\n updatePixelToSpeedMultiplier = () => {\n this.pixelToSpeedMultiplierX = (1 / this.target.clientWidth); //* (this.target.clientWidth / this.target.clientHeight);\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nimport {MathUtils} from \"three\";\n\nexport class MouseAngleControls {\n\n /**\n * @param target {EventTarget}\n * @param speed {number}\n * @param stiffness {number}\n */\n constructor(target, speed, stiffness) {\n this.target = target;\n this.manager = null;\n\n this.moving = false;\n this.lastY = 0;\n this.deltaAngle = 0;\n\n this.speed = speed;\n this.stiffness = stiffness;\n\n this.pixelToSpeedMultiplierY = 0;\n this.updatePixelToSpeedMultiplier();\n }\n\n /**\n * @param manager {ControlsManager}\n */\n start(manager) {\n this.manager = manager;\n\n this.target.addEventListener(\"mousedown\", this.onMouseDown);\n window.addEventListener(\"mousemove\", this.onMouseMove);\n window.addEventListener(\"mouseup\", this.onMouseUp);\n\n window.addEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\n }\n\n stop() {\n this.target.removeEventListener(\"mousedown\", this.onMouseDown);\n window.removeEventListener(\"mousemove\", this.onMouseMove);\n window.removeEventListener(\"mouseup\", this.onMouseUp);\n\n window.removeEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\n }\n\n /**\n * @param delta {number}\n * @param map {Map}\n */\n update(delta, map) {\n if (this.deltaAngle === 0) return;\n\n let smoothing = this.stiffness / (16.666 / delta);\n smoothing = MathUtils.clamp(smoothing, 0, 1);\n\n this.manager.angle += this.deltaAngle * smoothing * this.speed * this.pixelToSpeedMultiplierY;\n\n this.deltaAngle *= 1 - smoothing;\n if (Math.abs(this.deltaAngle) < 0.0001) {\n this.deltaAngle = 0;\n }\n }\n\n reset() {\n this.deltaAngle = 0;\n }\n\n /**\n * @private\n * @param evt {MouseEvent}\n */\n onMouseDown = evt => {\n if ((evt.buttons !== undefined ? evt.buttons === 2 : evt.button === 2) ||\n ((evt.altKey || evt.ctrlKey) && (evt.buttons !== undefined ? evt.buttons === 1 : evt.button === 0))) {\n this.moving = true;\n this.deltaAngle = 0;\n this.lastY = evt.y;\n }\n }\n\n /**\n * @private\n * @param evt {MouseEvent}\n */\n onMouseMove = evt => {\n if(this.moving){\n this.deltaAngle -= evt.y - this.lastY;\n }\n\n this.lastY = evt.y;\n }\n\n /**\n * @private\n * @param evt {MouseEvent}\n */\n onMouseUp = evt => {\n this.moving = false;\n }\n\n updatePixelToSpeedMultiplier = () => {\n this.pixelToSpeedMultiplierY = 1 / this.target.clientHeight;\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nimport {MathUtils, Vector2} from \"three\";\n\nexport class MapHeightControls {\n\n /**\n * @param cameraHeightStiffness {number}\n * @param targetHeightStiffness {number}\n */\n constructor(cameraHeightStiffness, targetHeightStiffness) {\n this.manager = null;\n\n this.cameraHeightStiffness = cameraHeightStiffness;\n this.targetHeightStiffness = targetHeightStiffness;\n this.maxAngle = Math.PI / 2;\n\n this.targetHeight = 0;\n this.cameraHeight = 0;\n\n this.minCameraHeight = 0;\n this.distanceTagretHeight = 0;\n }\n\n /**\n * @param manager {ControlsManager}\n */\n start(manager) {\n this.manager = manager;\n }\n\n stop() {}\n\n /**\n * @param delta {number}\n * @param map {Map}\n */\n update(delta, map) {\n\n // adjust target height\n this.updateHeights(delta, map);\n this.manager.position.y = Math.max(this.manager.position.y, this.getSuggestedHeight());\n }\n\n updateHeights(delta, map) {\n //target height\n let targetSmoothing = this.targetHeightStiffness / (16.666 / delta);\n targetSmoothing = MathUtils.clamp(targetSmoothing, 0, 1);\n\n let targetTerrainHeight = map.terrainHeightAt(this.manager.position.x, this.manager.position.z) + 3 || 0;\n\n let targetDelta = targetTerrainHeight - this.targetHeight;\n this.targetHeight += targetDelta * targetSmoothing;\n if (Math.abs(targetDelta) < 0.001) this.targetHeight = targetTerrainHeight;\n\n // camera height\n this.minCameraHeight = 0;\n if (this.maxAngle >= 0.1) {\n let cameraSmoothing = this.cameraHeightStiffness / (16.666 / delta);\n cameraSmoothing = MathUtils.clamp(cameraSmoothing, 0, 1);\n\n let cameraTerrainHeight = map.terrainHeightAt(this.manager.camera.position.x, this.manager.camera.position.z) || 0;\n\n let cameraDelta = cameraTerrainHeight - this.cameraHeight;\n this.cameraHeight += cameraDelta * cameraSmoothing;\n if (Math.abs(cameraDelta) < 0.001) this.cameraHeight = cameraTerrainHeight;\n\n let maxAngleHeight = Math.cos(this.maxAngle) * this.manager.distance;\n this.minCameraHeight = this.cameraHeight - maxAngleHeight + 1;\n }\n\n // adjust targetHeight by distance\n this.distanceTagretHeight = Math.max(MathUtils.lerp(this.targetHeight, 0, this.manager.distance / 500), 0);\n }\n\n getSuggestedHeight() {\n return Math.max(this.distanceTagretHeight, this.minCameraHeight);\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nexport class KeyCombination {\n\n static CTRL = 0;\n static SHIFT = 1;\n static ALT = 2;\n\n /**\n * @param code {string}\n * @param modifiers {...number}\n */\n constructor(code, ...modifiers) {\n\n this.code = code;\n this.ctrl = modifiers.includes(KeyCombination.CTRL) || this.code === \"CtrlLeft\" || this.code === \"CtrlRight\";\n this.shift = modifiers.includes(KeyCombination.SHIFT) || this.code === \"ShiftLeft\" || this.code === \"ShiftRight\";\n this.alt = modifiers.includes(KeyCombination.ALT) || this.code === \"AltLeft\" || this.code === \"AltRight\";\n\n }\n\n /**\n * @param evt {KeyboardEvent}\n * @returns {boolean}\n */\n testDown(evt) {\n return this.code === evt.code &&\n this.ctrl === evt.ctrlKey &&\n this.shift === evt.shiftKey &&\n this.alt === evt.altKey;\n }\n\n /**\n * @param evt {KeyboardEvent}\n * @returns {boolean}\n */\n testUp(evt) {\n return this.code === evt.code;\n }\n\n static oneDown(evt, ...combinations) {\n for (let combination of combinations){\n if (combination.testDown(evt)) return true;\n }\n return false;\n }\n\n static oneUp(evt, ...combinations) {\n for (let combination of combinations){\n if (combination.testUp(evt)) return true;\n }\n return false;\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nimport {MathUtils, Vector2} from \"three\";\nimport {VEC2_ZERO} from \"../../../util/Utils\";\nimport {KeyCombination} from \"../../KeyCombination\";\n\nexport class KeyMoveControls {\n\n static KEYS = {\n LEFT: [\n new KeyCombination(\"ArrowLeft\"),\n new KeyCombination(\"KeyA\")\n ],\n UP: [\n new KeyCombination(\"ArrowUp\"),\n new KeyCombination(\"KeyW\")\n ],\n RIGHT: [\n new KeyCombination(\"ArrowRight\"),\n new KeyCombination(\"KeyD\")\n ],\n DOWN: [\n new KeyCombination(\"ArrowDown\"),\n new KeyCombination(\"KeyS\")\n ],\n }\n\n static temp_v2 = new Vector2();\n\n /**\n * @param target {EventTarget}\n * @param speed {number}\n * @param stiffness {number}\n */\n constructor(target, speed, stiffness) {\n this.target = target;\n this.manager = null;\n\n this.deltaPosition = new Vector2();\n\n this.up = false;\n this.down = false;\n this.left = false;\n this.right = false;\n\n this.speed = speed;\n this.stiffness = stiffness;\n }\n\n /**\n * @param manager {ControlsManager}\n */\n start(manager) {\n this.manager = manager;\n\n window.addEventListener(\"keydown\", this.onKeyDown);\n window.addEventListener(\"keyup\", this.onKeyUp);\n }\n\n stop() {\n window.removeEventListener(\"keydown\", this.onKeyDown);\n window.removeEventListener(\"keyup\", this.onKeyUp);\n }\n\n /**\n * @param delta {number}\n * @param map {Map}\n */\n update(delta, map) {\n if (this.up) this.deltaPosition.y -= 1;\n if (this.down) this.deltaPosition.y += 1;\n if (this.left) this.deltaPosition.x -= 1;\n if (this.right) this.deltaPosition.x += 1;\n\n if (this.deltaPosition.x === 0 && this.deltaPosition.y === 0) return;\n\n let smoothing = this.stiffness / (16.666 / delta);\n smoothing = MathUtils.clamp(smoothing, 0, 1);\n\n let rotatedDelta = KeyMoveControls.temp_v2.copy(this.deltaPosition);\n rotatedDelta.rotateAround(VEC2_ZERO, this.manager.rotation);\n\n this.manager.position.x += rotatedDelta.x * smoothing * this.manager.distance * this.speed * delta * 0.06;\n this.manager.position.z += rotatedDelta.y * smoothing * this.manager.distance * this.speed * delta * 0.06;\n\n this.deltaPosition.multiplyScalar(1 - smoothing);\n if (this.deltaPosition.lengthSq() < 0.0001) {\n this.deltaPosition.set(0, 0);\n }\n }\n\n /**\n * @param evt {KeyboardEvent}\n */\n onKeyDown = evt => {\n if (KeyCombination.oneDown(evt, ...KeyMoveControls.KEYS.UP)){\n this.up = true;\n evt.preventDefault();\n }\n if (KeyCombination.oneDown(evt, ...KeyMoveControls.KEYS.DOWN)){\n this.down = true;\n evt.preventDefault();\n }\n if (KeyCombination.oneDown(evt, ...KeyMoveControls.KEYS.LEFT)){\n this.left = true;\n evt.preventDefault();\n }\n if (KeyCombination.oneDown(evt, ...KeyMoveControls.KEYS.RIGHT)){\n this.right = true;\n evt.preventDefault();\n }\n }\n\n /**\n * @param evt {KeyboardEvent}\n */\n onKeyUp = evt => {\n if (KeyCombination.oneUp(evt, ...KeyMoveControls.KEYS.UP)){\n this.up = false;\n }\n if (KeyCombination.oneUp(evt, ...KeyMoveControls.KEYS.DOWN)){\n this.down = false;\n }\n if (KeyCombination.oneUp(evt, ...KeyMoveControls.KEYS.LEFT)){\n this.left = false;\n }\n if (KeyCombination.oneUp(evt, ...KeyMoveControls.KEYS.RIGHT)){\n this.right = false;\n }\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nimport {MathUtils} from \"three\";\nimport {KeyCombination} from \"../../KeyCombination\";\n\nexport class KeyAngleControls {\n\n static KEYS = {\n UP: [\n new KeyCombination(\"ArrowUp\", KeyCombination.ALT),\n new KeyCombination(\"KeyW\", KeyCombination.ALT),\n new KeyCombination(\"PageUp\")\n ],\n DOWN: [\n new KeyCombination(\"ArrowDown\", KeyCombination.ALT),\n new KeyCombination(\"KeyS\", KeyCombination.ALT),\n new KeyCombination(\"PageDown\")\n ],\n }\n\n /**\n * @param target {EventTarget}\n * @param speed {number}\n * @param stiffness {number}\n */\n constructor(target, speed, stiffness) {\n this.target = target;\n this.manager = null;\n\n this.deltaAngle = 0;\n\n this.up = false;\n this.down = false;\n\n this.speed = speed;\n this.stiffness = stiffness;\n }\n\n /**\n * @param manager {ControlsManager}\n */\n start(manager) {\n this.manager = manager;\n\n window.addEventListener(\"keydown\", this.onKeyDown);\n window.addEventListener(\"keyup\", this.onKeyUp);\n }\n\n stop() {\n window.removeEventListener(\"keydown\", this.onKeyDown);\n window.removeEventListener(\"keyup\", this.onKeyUp);\n }\n\n /**\n * @param delta {number}\n * @param map {Map}\n */\n update(delta, map) {\n if (this.up) this.deltaAngle -= 1;\n if (this.down) this.deltaAngle += 1;\n\n if (this.deltaAngle === 0) return;\n\n let smoothing = this.stiffness / (16.666 / delta);\n smoothing = MathUtils.clamp(smoothing, 0, 1);\n\n this.manager.angle += this.deltaAngle * smoothing * this.speed * delta * 0.06;\n\n this.deltaAngle *= 1 - smoothing;\n if (Math.abs(this.deltaAngle) < 0.0001) {\n this.deltaAngle = 0;\n }\n }\n\n /**\n * @param evt {KeyboardEvent}\n */\n onKeyDown = evt => {\n if (KeyCombination.oneDown(evt, ...KeyAngleControls.KEYS.UP)){\n this.up = true;\n evt.preventDefault();\n }\n if (KeyCombination.oneDown(evt, ...KeyAngleControls.KEYS.DOWN)){\n this.down = true;\n evt.preventDefault();\n }\n }\n\n /**\n * @param evt {KeyboardEvent}\n */\n onKeyUp = evt => {\n if (KeyCombination.oneUp(evt, ...KeyAngleControls.KEYS.UP)){\n this.up = false;\n }\n if (KeyCombination.oneUp(evt, ...KeyAngleControls.KEYS.DOWN)){\n this.down = false;\n }\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nimport {MathUtils} from \"three\";\nimport {KeyCombination} from \"../../KeyCombination\";\n\nexport class KeyRotateControls {\n\n static KEYS = {\n LEFT: [\n new KeyCombination(\"ArrowLeft\", KeyCombination.ALT),\n new KeyCombination(\"KeyA\", KeyCombination.ALT),\n new KeyCombination(\"Delete\"),\n ],\n RIGHT: [\n new KeyCombination(\"ArrowRight\", KeyCombination.ALT),\n new KeyCombination(\"KeyD\", KeyCombination.ALT),\n new KeyCombination(\"End\"),\n ],\n }\n\n /**\n * @param target {EventTarget}\n * @param speed {number}\n * @param stiffness {number}\n */\n constructor(target, speed, stiffness) {\n this.target = target;\n this.manager = null;\n\n this.deltaRotation = 0;\n\n this.left = false;\n this.right = false;\n\n this.speed = speed;\n this.stiffness = stiffness;\n }\n\n /**\n * @param manager {ControlsManager}\n */\n start(manager) {\n this.manager = manager;\n\n window.addEventListener(\"keydown\", this.onKeyDown);\n window.addEventListener(\"keyup\", this.onKeyUp);\n }\n\n stop() {\n window.removeEventListener(\"keydown\", this.onKeyDown);\n window.removeEventListener(\"keyup\", this.onKeyUp);\n }\n\n /**\n * @param delta {number}\n * @param map {Map}\n */\n update(delta, map) {\n if (this.left) this.deltaRotation += 1;\n if (this.right) this.deltaRotation -= 1;\n\n if (this.deltaRotation === 0) return;\n\n let smoothing = this.stiffness / (16.666 / delta);\n smoothing = MathUtils.clamp(smoothing, 0, 1);\n\n this.manager.rotation += this.deltaRotation * smoothing * this.speed * delta * 0.06;\n\n this.deltaRotation *= 1 - smoothing;\n if (Math.abs(this.deltaRotation) < 0.0001) {\n this.deltaRotation = 0;\n }\n }\n\n /**\n * @param evt {KeyboardEvent}\n */\n onKeyDown = evt => {\n if (KeyCombination.oneDown(evt, ...KeyRotateControls.KEYS.LEFT)){\n this.left = true;\n evt.preventDefault();\n }\n if (KeyCombination.oneDown(evt, ...KeyRotateControls.KEYS.RIGHT)){\n this.right = true;\n evt.preventDefault();\n }\n }\n\n /**\n * @param evt {KeyboardEvent}\n */\n onKeyUp = evt => {\n if (KeyCombination.oneUp(evt, ...KeyRotateControls.KEYS.LEFT)){\n this.left = false;\n }\n if (KeyCombination.oneUp(evt, ...KeyRotateControls.KEYS.RIGHT)){\n this.right = false;\n }\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nimport {MathUtils} from \"three\";\nimport {KeyCombination} from \"../../KeyCombination\";\n\nexport class KeyZoomControls {\n\n static KEYS = {\n IN: [\n new KeyCombination(\"NumpadAdd\"),\n new KeyCombination(\"Insert\"),\n ],\n OUT: [\n new KeyCombination(\"NumpadSubtract\"),\n new KeyCombination(\"Home\"),\n ],\n }\n\n /**\n * @param target {EventTarget}\n * @param speed {number}\n * @param stiffness {number}\n */\n constructor(target, speed, stiffness) {\n this.target = target;\n this.manager = null;\n\n this.deltaZoom = 0;\n\n this.in = false;\n this.out = false;\n\n this.speed = speed;\n this.stiffness = stiffness;\n }\n\n /**\n * @param manager {ControlsManager}\n */\n start(manager) {\n this.manager = manager;\n\n window.addEventListener(\"keydown\", this.onKeyDown);\n window.addEventListener(\"keyup\", this.onKeyUp);\n }\n\n stop() {\n window.removeEventListener(\"keydown\", this.onKeyDown);\n window.removeEventListener(\"keyup\", this.onKeyUp);\n }\n\n /**\n * @param delta {number}\n * @param map {Map}\n */\n update(delta, map) {\n if (this.in) this.deltaZoom -= 1;\n if (this.out) this.deltaZoom += 1;\n\n if (this.deltaZoom === 0) return;\n\n let smoothing = this.stiffness / (16.666 / delta);\n smoothing = MathUtils.clamp(smoothing, 0, 1);\n\n this.manager.distance *= Math.pow(1.5, this.deltaZoom * smoothing * this.speed * delta * 0.06);\n\n this.deltaZoom *= 1 - smoothing;\n if (Math.abs(this.deltaZoom) < 0.0001) {\n this.deltaZoom = 0;\n }\n }\n\n /**\n * @param evt {KeyboardEvent}\n */\n onKeyDown = evt => {\n if (KeyCombination.oneDown(evt, ...KeyZoomControls.KEYS.IN)){\n this.in = true;\n evt.preventDefault();\n }\n if (KeyCombination.oneDown(evt, ...KeyZoomControls.KEYS.OUT)){\n this.out = true;\n evt.preventDefault();\n }\n }\n\n /**\n * @param evt {KeyboardEvent}\n */\n onKeyUp = evt => {\n if (KeyCombination.oneUp(evt, ...KeyZoomControls.KEYS.IN)){\n this.in = false;\n }\n if (KeyCombination.oneUp(evt, ...KeyZoomControls.KEYS.OUT)){\n this.out = false;\n }\n }\n\n}","import {MathUtils, Vector2} from \"three\";\n/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nimport {VEC2_ZERO} from \"../../../util/Utils\";\n\nexport class TouchMoveControls {\n\n static tempVec2_1 = new Vector2();\n\n /**\n * @param target {Element}\n * @param hammer {Manager}\n * @param speed {number}\n * @param stiffness {number}\n */\n constructor(target, hammer, speed, stiffness) {\n this.target = target;\n this.hammer = hammer;\n this.manager = null;\n\n this.moving = false;\n this.lastPosition = new Vector2();\n this.deltaPosition = new Vector2();\n\n this.speed = speed;\n this.stiffness = stiffness;\n\n this.pixelToSpeedMultiplierX = 0;\n this.pixelToSpeedMultiplierY = 0;\n this.updatePixelToSpeedMultiplier();\n }\n\n /**\n * @param manager {ControlsManager}\n */\n start(manager) {\n this.manager = manager;\n\n this.hammer.on(\"movestart\", this.onTouchDown);\n this.hammer.on(\"movemove\", this.onTouchMove);\n this.hammer.on(\"moveend\", this.onTouchUp);\n this.hammer.on(\"movecancel\", this.onTouchUp);\n\n window.addEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\n }\n\n stop() {\n this.hammer.off(\"movestart\", this.onTouchDown);\n this.hammer.off(\"movemove\", this.onTouchMove);\n this.hammer.off(\"moveend\", this.onTouchUp);\n this.hammer.off(\"movecancel\", this.onTouchUp);\n\n window.removeEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\n }\n\n /**\n * @param delta {number}\n * @param map {Map}\n */\n update(delta, map) {\n if (this.deltaPosition.x === 0 && this.deltaPosition.y === 0) return;\n\n let smoothing = this.stiffness / (16.666 / delta);\n smoothing = MathUtils.clamp(smoothing, 0, 1);\n\n let directionDelta = TouchMoveControls.tempVec2_1.copy(this.deltaPosition);\n directionDelta.rotateAround(VEC2_ZERO, this.manager.rotation);\n\n this.manager.position.x += directionDelta.x * smoothing * this.manager.distance * this.speed * this.pixelToSpeedMultiplierX;\n this.manager.position.z += directionDelta.y * smoothing * this.manager.distance * this.speed * this.pixelToSpeedMultiplierY;\n\n this.deltaPosition.multiplyScalar(1 - smoothing);\n if (this.deltaPosition.lengthSq() < 0.0001) {\n this.deltaPosition.set(0, 0);\n }\n }\n\n reset() {\n this.deltaPosition.set(0, 0);\n }\n\n /**\n * @private\n * @param evt {object}\n */\n onTouchDown = evt => {\n if (evt.pointerType === \"mouse\") return;\n\n this.moving = true;\n this.deltaPosition.set(0, 0);\n this.lastPosition.set(evt.center.x, evt.center.y);\n }\n\n /**\n * @private\n * @param evt {object}\n */\n onTouchMove = evt => {\n if (evt.pointerType === \"mouse\") return;\n\n let position = TouchMoveControls.tempVec2_1.set(evt.center.x, evt.center.y);\n\n if(this.moving){\n this.deltaPosition.sub(position).add(this.lastPosition);\n }\n\n this.lastPosition.copy(position);\n }\n\n /**\n * @private\n * @param evt {object}\n */\n onTouchUp = evt => {\n if (evt.pointerType === \"mouse\") return;\n\n this.moving = false;\n }\n\n updatePixelToSpeedMultiplier = () => {\n this.pixelToSpeedMultiplierX = (1 / this.target.clientWidth) * (this.target.clientWidth / this.target.clientHeight);\n this.pixelToSpeedMultiplierY = 1 / this.target.clientHeight;\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nimport {MathUtils} from \"three\";\n\nexport class TouchRotateControls {\n\n /**\n * @param hammer {Manager}\n * @param speed {number}\n * @param stiffness {number}\n */\n constructor(hammer, speed, stiffness) {\n this.hammer = hammer;\n this.manager = null;\n\n this.moving = false;\n this.lastRotation = 0;\n this.deltaRotation = 0;\n\n this.speed = speed;\n this.stiffness = stiffness;\n }\n\n /**\n * @param manager {ControlsManager}\n */\n start(manager) {\n this.manager = manager;\n\n this.hammer.on(\"rotatestart\", this.onTouchDown);\n this.hammer.on(\"rotatemove\", this.onTouchMove);\n this.hammer.on(\"rotateend\", this.onTouchUp);\n this.hammer.on(\"rotatecancel\", this.onTouchUp);\n }\n\n stop() {\n this.hammer.off(\"rotatestart\", this.onTouchDown);\n this.hammer.off(\"rotatemove\", this.onTouchMove);\n this.hammer.off(\"rotateend\", this.onTouchUp);\n this.hammer.off(\"rotatecancel\", this.onTouchUp);\n }\n\n /**\n * @param delta {number}\n * @param map {Map}\n */\n update(delta, map) {\n if (this.deltaRotation === 0) return;\n\n let smoothing = this.stiffness / (16.666 / delta);\n smoothing = MathUtils.clamp(smoothing, 0, 1);\n\n this.manager.rotation += this.deltaRotation * smoothing * this.speed;\n\n this.deltaRotation *= 1 - smoothing;\n if (Math.abs(this.deltaRotation) < 0.0001) {\n this.deltaRotation = 0;\n }\n }\n\n reset() {\n this.deltaRotation = 0;\n }\n\n /**\n * @private\n * @param evt {object}\n */\n onTouchDown = evt => {\n this.moving = true;\n this.deltaRotation = 0;\n this.lastRotation = evt.rotation;\n }\n\n /**\n * @private\n * @param evt {object}\n */\n onTouchMove = evt => {\n if(this.moving){\n let delta = evt.rotation - this.lastRotation;\n if (delta > 180) delta -= 360;\n if (delta < -180) delta += 360;\n\n this.deltaRotation -= delta;\n }\n\n this.lastRotation = evt.rotation;\n }\n\n /**\n * @private\n * @param evt {object}\n */\n onTouchUp = evt => {\n this.moving = false;\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nimport {MathUtils} from \"three\";\n\nexport class TouchAngleControls {\n\n /**\n * @param target {Element}\n * @param hammer {Manager}\n * @param speed {number}\n * @param stiffness {number}\n */\n constructor(target, hammer, speed, stiffness) {\n this.target = target;\n this.hammer = hammer;\n this.manager = null;\n\n this.moving = false;\n this.lastY = 0;\n this.deltaAngle = 0;\n\n this.speed = speed;\n this.stiffness = stiffness;\n\n this.pixelToSpeedMultiplierY = 0;\n this.updatePixelToSpeedMultiplier();\n }\n\n /**\n * @param manager {ControlsManager}\n */\n start(manager) {\n this.manager = manager;\n\n this.hammer.on(\"tiltstart\", this.onTouchDown);\n this.hammer.on(\"tiltmove\", this.onTouchMove);\n this.hammer.on(\"tiltend\", this.onTouchUp);\n this.hammer.on(\"tiltcancel\", this.onTouchUp);\n\n window.addEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\n }\n\n stop() {\n this.hammer.off(\"tiltstart\", this.onTouchDown);\n this.hammer.off(\"tiltmove\", this.onTouchMove);\n this.hammer.off(\"tiltend\", this.onTouchUp);\n this.hammer.off(\"tiltcancel\", this.onTouchUp);\n\n window.removeEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\n }\n\n /**\n * @param delta {number}\n * @param map {Map}\n */\n update(delta, map) {\n if (this.deltaAngle === 0) return;\n\n let smoothing = this.stiffness / (16.666 / delta);\n smoothing = MathUtils.clamp(smoothing, 0, 1);\n\n this.manager.angle += this.deltaAngle * smoothing * this.speed * this.pixelToSpeedMultiplierY;\n\n this.deltaAngle *= 1 - smoothing;\n if (Math.abs(this.deltaAngle) < 0.0001) {\n this.deltaAngle = 0;\n }\n }\n\n reset() {\n this.deltaAngle = 0;\n }\n\n /**\n * @private\n * @param evt {object}\n */\n onTouchDown = evt => {\n this.moving = true;\n this.deltaAngle = 0;\n this.lastY = evt.center.y;\n }\n\n /**\n * @private\n * @param evt {object}\n */\n onTouchMove = evt => {\n if(this.moving){\n this.deltaAngle -= evt.center.y - this.lastY;\n }\n\n this.lastY = evt.center.y;\n }\n\n /**\n * @private\n * @param evt {object}\n */\n onTouchUp = evt => {\n this.moving = false;\n }\n\n updatePixelToSpeedMultiplier = () => {\n this.pixelToSpeedMultiplierY = 1 / this.target.clientHeight;\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nexport class TouchZoomControls {\n\n /**\n * @param hammer {Manager}\n */\n constructor(hammer) {\n this.hammer = hammer;\n this.manager = null;\n\n this.moving = false;\n this.deltaZoom = 1;\n this.lastZoom = 1;\n }\n\n /**\n * @param manager {ControlsManager}\n */\n start(manager) {\n this.manager = manager;\n\n this.hammer.on(\"zoomstart\", this.onTouchDown);\n this.hammer.on(\"zoommove\", this.onTouchMove);\n this.hammer.on(\"zoomend\", this.onTouchUp);\n this.hammer.on(\"zoomcancel\", this.onTouchUp);\n }\n\n stop() {\n this.hammer.off(\"zoomstart\", this.onTouchDown);\n this.hammer.off(\"zoommove\", this.onTouchMove);\n this.hammer.off(\"zoomend\", this.onTouchUp);\n this.hammer.off(\"zoomcancel\", this.onTouchUp);\n }\n\n /**\n * @param delta {number}\n * @param map {Map}\n */\n update(delta, map) {\n if (this.deltaZoom === 1) return;\n\n this.manager.distance /= this.deltaZoom;\n this.deltaZoom = 1;\n }\n\n reset() {\n this.deltaZoom = 1;\n }\n\n /**\n * @private\n * @param evt {object}\n */\n onTouchDown = evt => {\n this.moving = true;\n this.lastZoom = 1;\n }\n\n /**\n * @private\n * @param evt {object}\n */\n onTouchMove = evt => {\n if(this.moving){\n this.deltaZoom *= evt.scale / this.lastZoom;\n }\n\n this.lastZoom = evt.scale;\n }\n\n /**\n * @private\n * @param evt {object}\n */\n onTouchUp = evt => {\n this.moving = false;\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nimport {MouseMoveControls} from \"./mouse/MouseMoveControls\";\nimport {MouseZoomControls} from \"./mouse/MouseZoomControls\";\nimport {MouseRotateControls} from \"./mouse/MouseRotateControls\";\nimport {MouseAngleControls} from \"./mouse/MouseAngleControls\";\nimport {MathUtils, Vector2, Vector3} from \"three\";\nimport {Manager, Pan, Pinch, Rotate, Tap, DIRECTION_ALL, DIRECTION_VERTICAL} from \"hammerjs\";\nimport {softClamp} from \"../../util/Utils\";\nimport {MapHeightControls} from \"./MapHeightControls\";\nimport {KeyMoveControls} from \"./keyboard/KeyMoveControls\";\nimport {KeyAngleControls} from \"./keyboard/KeyAngleControls\";\nimport {KeyRotateControls} from \"./keyboard/KeyRotateControls\";\nimport {KeyZoomControls} from \"./keyboard/KeyZoomControls\";\nimport {TouchMoveControls} from \"./touch/TouchMoveControls\";\nimport {TouchRotateControls} from \"./touch/TouchRotateControls\";\nimport {TouchAngleControls} from \"./touch/TouchAngleControls\";\nimport {TouchZoomControls} from \"./touch/TouchZoomControls\";\nimport {PlayerMarker} from \"../../markers/PlayerMarker\";\n\nconst HALF_PI = Math.PI * 0.5;\n\nexport class MapControls {\n\n static _beforeMoveTemp = new Vector3();\n\n /**\n * @param rootElement {Element}\n */\n constructor(rootElement) {\n this.rootElement = rootElement;\n\n this.data = {\n followingPlayer: null\n };\n\n /** @type {ControlsManager} */\n this.manager = null;\n\n this.hammer = new Manager(this.rootElement);\n this.initializeHammer();\n\n //controls\n this.mouseMove = new MouseMoveControls(this.rootElement, 1.5,0.3);\n this.mouseRotate = new MouseRotateControls(this.rootElement, 6, 0.3);\n this.mouseAngle = new MouseAngleControls(this.rootElement, 3, 0.3);\n this.mouseZoom = new MouseZoomControls(this.rootElement, 1, 0.2);\n\n this.keyMove = new KeyMoveControls(this.rootElement, 0.025, 0.2);\n this.keyRotate = new KeyRotateControls(this.rootElement, 0.06, 0.15);\n this.keyAngle = new KeyAngleControls(this.rootElement, 0.04, 0.15);\n this.keyZoom = new KeyZoomControls(this.rootElement, 0.2, 0.15);\n\n this.touchMove = new TouchMoveControls(this.rootElement, this.hammer, 1.5,0.3);\n this.touchRotate = new TouchRotateControls(this.hammer, 0.0174533, 0.3);\n this.touchAngle = new TouchAngleControls(this.rootElement, this.hammer, 3, 0.3);\n this.touchZoom = new TouchZoomControls(this.hammer);\n\n this.mapHeight = new MapHeightControls(0.2, 0.1);\n\n this.lastTap = -1;\n this.lastTapCenter = null;\n }\n\n /**\n * @param manager {ControlsManager}\n */\n start(manager) {\n this.manager = manager;\n\n this.rootElement.addEventListener(\"contextmenu\", this.onContextMenu);\n this.hammer.on(\"tap\", this.onTap);\n\n this.mouseMove.start(manager);\n this.mouseRotate.start(manager);\n this.mouseAngle.start(manager);\n this.mouseZoom.start(manager);\n\n this.keyMove.start(manager);\n this.keyRotate.start(manager);\n this.keyAngle.start(manager);\n this.keyZoom.start(manager);\n\n this.touchMove.start(manager);\n this.touchRotate.start(manager);\n this.touchAngle.start(manager);\n this.touchZoom.start(manager);\n\n this.mapHeight.start(manager);\n }\n\n stop() {\n this.stopFollowingPlayerMarker();\n\n this.rootElement.removeEventListener(\"contextmenu\", this.onContextMenu);\n this.hammer.off(\"tap\", this.onTap);\n\n this.mouseMove.stop();\n this.mouseRotate.stop();\n this.mouseAngle.stop();\n this.mouseZoom.stop();\n\n this.keyMove.stop();\n this.keyRotate.stop();\n this.keyAngle.stop();\n this.keyZoom.stop();\n\n this.touchMove.stop();\n this.touchRotate.stop();\n this.touchAngle.stop();\n this.touchZoom.stop();\n\n this.mapHeight.stop();\n }\n\n /**\n * @param delta {number}\n * @param map {Map}\n */\n update(delta, map) {\n this.manager.position.y = 0; // reset target y position\n\n // move\n MapControls._beforeMoveTemp.copy(this.manager.position);\n this.mouseMove.update(delta, map);\n this.keyMove.update(delta, map);\n this.touchMove.update(delta, map);\n\n // if moved, stop following the marker and give back control\n if (this.data.followingPlayer && !MapControls._beforeMoveTemp.equals(this.manager.position)) {\n this.stopFollowingPlayerMarker();\n }\n\n // follow player marker\n if (this.data.followingPlayer) {\n this.manager.position.copy(this.data.followingPlayer.position);\n }\n\n // zoom\n this.mouseZoom.update(delta, map);\n this.keyZoom.update(delta, map);\n this.touchZoom.update(delta, map);\n\n this.manager.distance = softClamp(this.manager.distance, 5, 10000, 0.8);\n\n // max angle for current distance\n let maxAngleForZoom = this.getMaxPerspectiveAngleForDistance(this.manager.distance);\n\n // rotation\n if (this.manager.ortho === 0) {\n this.mouseRotate.update(delta, map);\n this.keyRotate.update(delta, map);\n this.touchRotate.update(delta, map);\n }\n\n // tilt\n if (this.manager.ortho === 0) {\n this.mouseAngle.update(delta, map);\n this.keyAngle.update(delta, map);\n this.touchAngle.update(delta, map);\n this.manager.angle = softClamp(this.manager.angle, 0, maxAngleForZoom, 0.8);\n }\n\n // target height\n if (this.manager.ortho === 0 || this.manager.angle === 0) {\n this.mapHeight.maxAngle = maxAngleForZoom;\n this.mapHeight.update(delta, map);\n }\n }\n\n reset() {\n this.mouseMove.reset();\n this.mouseRotate.reset();\n this.mouseAngle.reset();\n this.mouseZoom.reset();\n\n this.touchMove.reset();\n this.touchRotate.reset();\n this.touchAngle.reset();\n this.touchZoom.reset();\n }\n\n getMaxPerspectiveAngleForDistance(distance) {\n return MathUtils.clamp((1 - Math.pow(Math.max(distance - 5, 0.001) / 500, 0.5)) * HALF_PI,0, HALF_PI)\n }\n\n initializeHammer() {\n let touchTap = new Tap({ event: 'tap', pointers: 1, taps: 1, threshold: 5 });\n let touchMove = new Pan({ event: 'move', pointers: 1, direction: DIRECTION_ALL, threshold: 0 });\n let touchTilt = new Pan({ event: 'tilt', pointers: 2, direction: DIRECTION_VERTICAL, threshold: 0 });\n let touchRotate = new Rotate({ event: 'rotate', pointers: 2, threshold: 0 });\n let touchZoom = new Pinch({ event: 'zoom', pointers: 2, threshold: 0 });\n\n touchMove.recognizeWith(touchRotate);\n touchMove.recognizeWith(touchTilt);\n touchMove.recognizeWith(touchZoom);\n touchTilt.recognizeWith(touchRotate);\n touchTilt.recognizeWith(touchZoom);\n touchRotate.recognizeWith(touchZoom);\n\n this.hammer.add(touchTap);\n this.hammer.add(touchTilt);\n this.hammer.add(touchMove);\n this.hammer.add(touchRotate);\n this.hammer.add(touchZoom);\n }\n\n /**\n * @param marker {object}\n */\n followPlayerMarker(marker) {\n if (marker.isPlayerMarker) marker = marker.data;\n this.data.followingPlayer = marker;\n }\n\n stopFollowingPlayerMarker() {\n this.data.followingPlayer = null;\n }\n\n onContextMenu = evt => {\n evt.preventDefault();\n }\n\n onTap = evt => {\n let doubleTap = false;\n let center = new Vector2(evt.center.x, evt.center.y);\n\n let now = Date.now();\n if (this.lastTap > 0 && this.lastTapCenter && now - this.lastTap < 500 && this.lastTapCenter.distanceTo(center) < 5){\n doubleTap = true;\n this.lastTap = -1;\n } else {\n this.lastTap = now;\n this.lastTapCenter = center;\n }\n\n this.manager.handleMapInteraction(new Vector2(evt.center.x, evt.center.y), {doubleTap: doubleTap});\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nimport {MathUtils, Vector2} from \"three\";\nimport {VEC2_ZERO} from \"../../../util/Utils\";\nimport {KeyCombination} from \"../../KeyCombination\";\n\nexport class KeyMoveControls {\n\n static KEYS = {\n LEFT: [\n new KeyCombination(\"ArrowLeft\"),\n new KeyCombination(\"KeyA\")\n ],\n UP: [\n new KeyCombination(\"ArrowUp\"),\n new KeyCombination(\"KeyW\")\n ],\n RIGHT: [\n new KeyCombination(\"ArrowRight\"),\n new KeyCombination(\"KeyD\")\n ],\n DOWN: [\n new KeyCombination(\"ArrowDown\"),\n new KeyCombination(\"KeyS\")\n ],\n }\n\n static temp_v2 = new Vector2();\n\n /**\n * @param target {EventTarget}\n * @param speed {number}\n * @param stiffness {number}\n */\n constructor(target, speed, stiffness) {\n this.target = target;\n this.manager = null;\n\n this.deltaPosition = new Vector2();\n\n this.up = false;\n this.down = false;\n this.left = false;\n this.right = false;\n\n this.speed = speed;\n this.stiffness = stiffness;\n }\n\n /**\n * @param manager {ControlsManager}\n */\n start(manager) {\n this.manager = manager;\n\n window.addEventListener(\"keydown\", this.onKeyDown);\n window.addEventListener(\"keyup\", this.onKeyUp);\n }\n\n stop() {\n window.removeEventListener(\"keydown\", this.onKeyDown);\n window.removeEventListener(\"keyup\", this.onKeyUp);\n }\n\n /**\n * @param delta {number}\n * @param map {Map}\n */\n update(delta, map) {\n if (this.up) this.deltaPosition.y -= 1;\n if (this.down) this.deltaPosition.y += 1;\n if (this.left) this.deltaPosition.x -= 1;\n if (this.right) this.deltaPosition.x += 1;\n\n if (this.deltaPosition.x === 0 && this.deltaPosition.y === 0) return;\n\n let smoothing = this.stiffness / (16.666 / delta);\n smoothing = MathUtils.clamp(smoothing, 0, 1);\n\n let rotatedDelta = KeyMoveControls.temp_v2.copy(this.deltaPosition);\n rotatedDelta.rotateAround(VEC2_ZERO, this.manager.rotation);\n\n this.manager.position.x += rotatedDelta.x * smoothing * this.speed * delta * 0.06;\n this.manager.position.z += rotatedDelta.y * smoothing * this.speed * delta * 0.06;\n\n this.deltaPosition.multiplyScalar(1 - smoothing);\n if (this.deltaPosition.lengthSq() < 0.0001) {\n this.deltaPosition.set(0, 0);\n }\n }\n\n /**\n * @param evt {KeyboardEvent}\n */\n onKeyDown = evt => {\n if (KeyCombination.oneUp(evt, ...KeyMoveControls.KEYS.UP)){\n this.up = true;\n evt.preventDefault();\n }\n if (KeyCombination.oneUp(evt, ...KeyMoveControls.KEYS.DOWN)){\n this.down = true;\n evt.preventDefault();\n }\n if (KeyCombination.oneUp(evt, ...KeyMoveControls.KEYS.LEFT)){\n this.left = true;\n evt.preventDefault();\n }\n if (KeyCombination.oneUp(evt, ...KeyMoveControls.KEYS.RIGHT)){\n this.right = true;\n evt.preventDefault();\n }\n }\n\n /**\n * @param evt {KeyboardEvent}\n */\n onKeyUp = evt => {\n if (KeyCombination.oneUp(evt, ...KeyMoveControls.KEYS.UP)){\n this.up = false;\n }\n if (KeyCombination.oneUp(evt, ...KeyMoveControls.KEYS.DOWN)){\n this.down = false;\n }\n if (KeyCombination.oneUp(evt, ...KeyMoveControls.KEYS.LEFT)){\n this.left = false;\n }\n if (KeyCombination.oneUp(evt, ...KeyMoveControls.KEYS.RIGHT)){\n this.right = false;\n }\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nimport {MathUtils} from \"three\";\n\nexport class MouseRotateControls {\n\n /**\n * @param target {Element}\n * @param speedLeft {number}\n * @param speedRight {number}\n * @param speedCapture {number}\n * @param stiffness {number}\n */\n constructor(target, speedLeft, speedRight, speedCapture, stiffness) {\n this.target = target;\n this.manager = null;\n\n this.moving = false;\n this.lastX = 0;\n this.deltaRotation = 0;\n\n this.speedLeft = speedLeft;\n this.speedRight = speedRight;\n this.speedCapture = speedCapture;\n this.stiffness = stiffness;\n\n this.pixelToSpeedMultiplier = 0;\n this.updatePixelToSpeedMultiplier();\n }\n\n /**\n * @param manager {ControlsManager}\n */\n start(manager) {\n this.manager = manager;\n\n this.target.addEventListener(\"mousedown\", this.onMouseDown);\n window.addEventListener(\"mousemove\", this.onMouseMove);\n window.addEventListener(\"mouseup\", this.onMouseUp);\n\n window.addEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\n }\n\n stop() {\n this.target.removeEventListener(\"mousedown\", this.onMouseDown);\n window.removeEventListener(\"mousemove\", this.onMouseMove);\n window.removeEventListener(\"mouseup\", this.onMouseUp);\n\n window.removeEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\n }\n\n /**\n * @param delta {number}\n * @param map {Map}\n */\n update(delta, map) {\n if (this.deltaRotation === 0) return;\n\n let smoothing = this.stiffness / (16.666 / delta);\n smoothing = MathUtils.clamp(smoothing, 0, 1);\n\n this.manager.rotation += this.deltaRotation * smoothing;\n\n this.deltaRotation *= 1 - smoothing;\n if (Math.abs(this.deltaRotation) < 0.0001) {\n this.deltaRotation = 0;\n }\n }\n\n reset() {\n this.deltaRotation = 0;\n }\n\n /**\n * @private\n * @param evt {MouseEvent}\n */\n onMouseDown = evt => {\n this.moving = true;\n this.deltaRotation = 0;\n this.lastX = evt.x;\n }\n\n /**\n * @private\n * @param evt {MouseEvent}\n */\n onMouseMove = evt => {\n if (document.pointerLockElement) {\n this.deltaRotation -= evt.movementX * this.speedCapture * this.pixelToSpeedMultiplier;\n }\n\n else if(this.moving){\n if (evt.buttons === 1) {\n this.deltaRotation -= (evt.x - this.lastX) * this.speedLeft * this.pixelToSpeedMultiplier;\n } else {\n this.deltaRotation -= (evt.x - this.lastX) * this.speedRight * this.pixelToSpeedMultiplier;\n }\n }\n\n this.lastX = evt.x;\n }\n\n /**\n * @private\n * @param evt {MouseEvent}\n */\n onMouseUp = evt => {\n this.moving = false;\n }\n\n updatePixelToSpeedMultiplier = () => {\n this.pixelToSpeedMultiplier = (1 / this.target.clientWidth) * (this.target.clientWidth / this.target.clientHeight);\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nimport {MathUtils} from \"three\";\n\nexport class MouseAngleControls {\n\n /**\n * @param target {EventTarget}\n * @param speedLeft {number}\n * @param speedRight {number}\n * @param speedCapture {number}\n * @param stiffness {number}\n */\n constructor(target, speedLeft, speedRight, speedCapture, stiffness) {\n this.target = target;\n this.manager = null;\n\n this.moving = false;\n this.lastY = 0;\n this.deltaAngle = 0;\n\n this.speedLeft = speedLeft;\n this.speedRight = speedRight;\n this.speedCapture = speedCapture;\n this.stiffness = stiffness;\n\n this.pixelToSpeedMultiplier = 0;\n this.updatePixelToSpeedMultiplier();\n }\n\n /**\n * @param manager {ControlsManager}\n */\n start(manager) {\n this.manager = manager;\n\n this.target.addEventListener(\"mousedown\", this.onMouseDown);\n window.addEventListener(\"mousemove\", this.onMouseMove);\n window.addEventListener(\"mouseup\", this.onMouseUp);\n\n window.addEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\n }\n\n stop() {\n this.target.removeEventListener(\"mousedown\", this.onMouseDown);\n window.removeEventListener(\"mousemove\", this.onMouseMove);\n window.removeEventListener(\"mouseup\", this.onMouseUp);\n\n window.removeEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\n }\n\n /**\n * @param delta {number}\n * @param map {Map}\n */\n update(delta, map) {\n if (this.deltaAngle === 0) return;\n\n let smoothing = this.stiffness / (16.666 / delta);\n smoothing = MathUtils.clamp(smoothing, 0, 1);\n\n this.manager.angle += this.deltaAngle * smoothing;\n\n this.deltaAngle *= 1 - smoothing;\n if (Math.abs(this.deltaAngle) < 0.0001) {\n this.deltaAngle = 0;\n }\n }\n\n reset() {\n this.deltaAngle = 0;\n }\n\n /**\n * @private\n * @param evt {MouseEvent}\n */\n onMouseDown = evt => {\n this.moving = true;\n this.deltaAngle = 0;\n this.lastY = evt.y;\n }\n\n /**\n * @private\n * @param evt {MouseEvent}\n */\n onMouseMove = evt => {\n if (document.pointerLockElement) {\n this.deltaAngle += evt.movementY * this.speedCapture * this.pixelToSpeedMultiplier;\n }\n\n else if(this.moving){\n if (evt.buttons === 1) {\n this.deltaAngle += (evt.y - this.lastY) * this.speedLeft * this.pixelToSpeedMultiplier;\n } else {\n this.deltaAngle += (evt.y - this.lastY) * this.speedRight * this.pixelToSpeedMultiplier;\n }\n }\n\n this.lastY = evt.y;\n }\n\n /**\n * @private\n * @param evt {MouseEvent}\n */\n onMouseUp = evt => {\n this.moving = false;\n }\n\n updatePixelToSpeedMultiplier = () => {\n this.pixelToSpeedMultiplier = 1 / this.target.clientHeight;\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nimport {MathUtils} from \"three\";\nimport {KeyCombination} from \"../../KeyCombination\";\n\nexport class KeyHeightControls {\n\n static KEYS = {\n UP: [\n new KeyCombination(\"Space\"),\n new KeyCombination(\"PageUp\")\n ],\n DOWN: [\n new KeyCombination(\"ShiftLeft\"),\n new KeyCombination(\"ShiftRight\"),\n new KeyCombination(\"PageDown\")\n ],\n }\n\n /**\n * @param target {EventTarget}\n * @param speed {number}\n * @param stiffness {number}\n */\n constructor(target, speed, stiffness) {\n this.target = target;\n this.manager = null;\n\n this.deltaY = 0;\n\n this.up = false;\n this.down = false;\n\n this.speed = speed;\n this.stiffness = stiffness;\n }\n\n /**\n * @param manager {ControlsManager}\n */\n start(manager) {\n this.manager = manager;\n\n window.addEventListener(\"keydown\", this.onKeyDown);\n window.addEventListener(\"keyup\", this.onKeyUp);\n }\n\n stop() {\n window.removeEventListener(\"keydown\", this.onKeyDown);\n window.removeEventListener(\"keyup\", this.onKeyUp);\n }\n\n /**\n * @param delta {number}\n * @param map {Map}\n */\n update(delta, map) {\n if (this.up) this.deltaY += 1;\n if (this.down) this.deltaY -= 1;\n\n if (this.deltaY === 0) return;\n\n let smoothing = this.stiffness / (16.666 / delta);\n smoothing = MathUtils.clamp(smoothing, 0, 1);\n\n this.manager.position.y += this.deltaY * smoothing * this.speed * delta * 0.06;\n\n this.deltaY *= 1 - smoothing;\n if (Math.abs(this.deltaY) < 0.0001) {\n this.deltaY = 0;\n }\n }\n\n /**\n * @param evt {KeyboardEvent}\n */\n onKeyDown = evt => {\n if (KeyCombination.oneUp(evt, ...KeyHeightControls.KEYS.UP)){\n this.up = true;\n evt.preventDefault();\n }\n else if (KeyCombination.oneUp(evt, ...KeyHeightControls.KEYS.DOWN)){\n this.down = true;\n evt.preventDefault();\n }\n }\n\n /**\n * @param evt {KeyboardEvent}\n */\n onKeyUp = evt => {\n if (KeyCombination.oneUp(evt, ...KeyHeightControls.KEYS.UP)){\n this.up = false;\n }\n if (KeyCombination.oneUp(evt, ...KeyHeightControls.KEYS.DOWN)){\n this.down = false;\n }\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nimport {MathUtils, Vector2} from \"three\";\n\nexport class TouchPanControls {\n\n static tempVec2_1 = new Vector2();\n\n /**\n * @param target {Element}\n * @param hammer {Manager}\n * @param speed {number}\n * @param stiffness {number}\n */\n constructor(target, hammer, speed, stiffness) {\n this.target = target;\n this.hammer = hammer;\n this.manager = null;\n\n this.moving = false;\n this.lastPosition = new Vector2();\n this.deltaPosition = new Vector2();\n\n this.speed = speed;\n this.stiffness = stiffness;\n\n this.pixelToSpeedMultiplierX = 0;\n this.pixelToSpeedMultiplierY = 0;\n this.updatePixelToSpeedMultiplier();\n }\n\n /**\n * @param manager {ControlsManager}\n */\n start(manager) {\n this.manager = manager;\n\n this.hammer.on(\"movestart\", this.onTouchDown);\n this.hammer.on(\"movemove\", this.onTouchMove);\n this.hammer.on(\"moveend\", this.onTouchUp);\n this.hammer.on(\"movecancel\", this.onTouchUp);\n\n window.addEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\n }\n\n stop() {\n this.hammer.off(\"movestart\", this.onTouchDown);\n this.hammer.off(\"movemove\", this.onTouchMove);\n this.hammer.off(\"moveend\", this.onTouchUp);\n this.hammer.off(\"movecancel\", this.onTouchUp);\n\n window.removeEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\n }\n\n /**\n * @param delta {number}\n * @param map {Map}\n */\n update(delta, map) {\n if (this.deltaPosition.x === 0 && this.deltaPosition.y === 0) return;\n\n let smoothing = this.stiffness / (16.666 / delta);\n smoothing = MathUtils.clamp(smoothing, 0, 1);\n\n this.manager.rotation += this.deltaPosition.x * this.speed * this.pixelToSpeedMultiplierX * this.stiffness;\n this.manager.angle -= this.deltaPosition.y * this.speed * this.pixelToSpeedMultiplierY * this.stiffness;\n\n this.deltaPosition.multiplyScalar(1 - smoothing);\n if (this.deltaPosition.lengthSq() < 0.0001) {\n this.deltaPosition.set(0, 0);\n }\n }\n\n reset() {\n this.deltaPosition.set(0, 0);\n }\n\n /**\n * @private\n * @param evt {object}\n */\n onTouchDown = evt => {\n if (evt.pointerType === \"mouse\") return;\n\n this.moving = true;\n this.deltaPosition.set(0, 0);\n this.lastPosition.set(evt.center.x, evt.center.y);\n }\n\n /**\n * @private\n * @param evt {object}\n */\n onTouchMove = evt => {\n if (evt.pointerType === \"mouse\") return;\n\n let position = TouchPanControls.tempVec2_1.set(evt.center.x, evt.center.y);\n\n if(this.moving){\n this.deltaPosition.sub(position).add(this.lastPosition);\n }\n\n this.lastPosition.copy(position);\n }\n\n /**\n * @private\n * @param evt {object}\n */\n onTouchUp = evt => {\n if (evt.pointerType === \"mouse\") return;\n\n this.moving = false;\n }\n\n updatePixelToSpeedMultiplier = () => {\n this.pixelToSpeedMultiplierX = (1 / this.target.clientWidth) * (this.target.clientWidth / this.target.clientHeight);\n this.pixelToSpeedMultiplierY = 1 / this.target.clientHeight;\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nimport {MathUtils, Vector2} from \"three\";\nimport {Manager, Pan, DIRECTION_ALL} from \"hammerjs\";\nimport {animate, EasingFunctions} from \"../../util/Utils\";\nimport {KeyMoveControls} from \"./keyboard/KeyMoveControls\";\nimport {MouseRotateControls} from \"./mouse/MouseRotateControls\";\nimport {MouseAngleControls} from \"./mouse/MouseAngleControls\";\nimport {KeyHeightControls} from \"./keyboard/KeyHeightControls\";\nimport {TouchPanControls} from \"./touch/TouchPanControls\";\n\nexport class FreeFlightControls {\n\n /**\n * @param target {Element}\n */\n constructor(target) {\n this.target = target;\n this.manager = null;\n\n this.data = {\n\n };\n\n this.hammer = new Manager(this.target);\n this.initializeHammer();\n\n this.keyMove = new KeyMoveControls(this.target, 0.5, 0.1);\n this.keyHeight = new KeyHeightControls(this.target, 0.5, 0.2);\n this.mouseRotate = new MouseRotateControls(this.target, 1.5, -2, -1.5, 0.5);\n this.mouseAngle = new MouseAngleControls(this.target, 1.5, -2, -1.5, 0.5);\n this.touchPan = new TouchPanControls(this.target, this.hammer, 5, 0.15);\n\n this.started = false;\n\n this.clickStart = new Vector2();\n this.moveSpeed = 0.5;\n\n this.animationTargetHeight = 0;\n }\n\n /**\n * @param manager {ControlsManager}\n */\n start(manager) {\n this.manager = manager;\n\n this.keyMove.start(manager);\n this.keyHeight.start(manager);\n this.mouseRotate.start(manager);\n this.mouseAngle.start(manager);\n this.touchPan.start(manager);\n\n this.target.addEventListener(\"contextmenu\", this.onContextMenu);\n this.target.addEventListener(\"mousedown\", this.onMouseDown);\n this.target.addEventListener(\"mouseup\", this.onMouseUp);\n window.addEventListener(\"wheel\", this.onWheel, {passive: true});\n }\n\n stop() {\n this.keyMove.stop();\n this.keyHeight.stop();\n this.mouseRotate.stop();\n this.mouseAngle.stop();\n this.touchPan.stop();\n\n this.target.removeEventListener(\"contextmenu\", this.onContextMenu);\n this.target.removeEventListener(\"mousedown\", this.onMouseDown);\n this.target.removeEventListener(\"mouseup\", this.onMouseUp);\n window.removeEventListener(\"wheel\", this.onWheel);\n }\n\n /**\n * @param delta {number}\n * @param map {Map}\n */\n update(delta, map) {\n this.keyMove.update(delta, map);\n this.keyHeight.update(delta, map);\n this.mouseRotate.update(delta, map);\n this.mouseAngle.update(delta, map);\n this.touchPan.update(delta, map);\n\n this.manager.angle = MathUtils.clamp(this.manager.angle, 0, Math.PI);\n this.manager.distance = 0;\n this.manager.ortho = 0;\n }\n\n initializeHammer() {\n let touchMove = new Pan({ event: 'move', pointers: 1, direction: DIRECTION_ALL, threshold: 0 });\n this.hammer.add(touchMove);\n }\n\n onContextMenu = evt => {\n evt.preventDefault();\n }\n\n onMouseDown = evt => {\n this.clickStart.set(evt.x, evt.y);\n }\n\n onMouseUp = evt => {\n if (Math.abs(this.clickStart.x - evt.x) > 5) return;\n if (Math.abs(this.clickStart.y - evt.y) > 5) return;\n\n document.body.requestFullscreen()\n .finally(() => {\n this.target.requestPointerLock();\n });\n }\n\n onWheel = evt => {\n let delta = evt.deltaY;\n if (evt.deltaMode === WheelEvent.DOM_DELTA_PIXEL) delta *= 0.01;\n if (evt.deltaMode === WheelEvent.DOM_DELTA_LINE) delta *= 0.33;\n\n this.moveSpeed *= Math.pow(1.5, -delta * 0.25);\n this.moveSpeed = MathUtils.clamp(this.moveSpeed, 0.05, 5);\n\n this.keyMove.speed = this.moveSpeed;\n this.keyHeight.speed = this.moveSpeed;\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport {Object3D} from \"three\";\n\nexport * from \"./MapViewer\";\n\nexport * from \"./map/Map\";\nexport * from \"./map/Tile\";\nexport * from \"./map/TileLoader\";\nexport * from \"./map/TileManager\";\nexport * from \"./map/TileMap\";\n\nexport * from \"./markers/ExtrudeMarker\";\nexport * from \"./markers/HtmlMarker\";\nexport * from \"./markers/LineMarker\";\nexport * from \"./markers/Marker\";\nexport * from \"./markers/MarkerFileManager\";\nexport * from \"./markers/MarkerManager\";\nexport * from \"./markers/MarkerSet\";\nexport * from \"./markers/ObjectMarker\";\nexport * from \"./markers/PlayerMarker\";\nexport * from \"./markers/PlayerMarkerManager\";\nexport * from \"./markers/PoiMarker\";\nexport * from \"./markers/ShapeMarker\";\n\nexport * from \"./controls/map/MapControls\";\nexport * from \"./controls/freeflight/FreeFlightControls\";\n\nexport * from \"./util/CombinedCamera\";\nexport * from \"./util/Utils\";\n\n/**\n * @param event {object}\n * @return {boolean} - whether the event has been consumed (true) or not (false)\n */\nObject3D.prototype.onClick = function(event) {\n\n if (this.parent){\n if (!Array.isArray(event.eventStack)) event.eventStack = [];\n event.eventStack.push(this);\n\n return this.parent.onClick(event);\n }\n\n return false;\n};\n","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport {Marker} from \"bluemap/src/markers/Marker\";\nimport {CSS2DObject} from \"bluemap/src/util/CSS2DRenderer\";\nimport {animate, htmlToElement} from \"bluemap/src/util/Utils\";\nimport {BoxGeometry, MeshBasicMaterial, Mesh, Vector2} from \"three\";\nimport i18n from \"../i18n\";\n\nexport class PopupMarker extends Marker {\n\n constructor(id, appState, events) {\n super(id);\n\n this.data.type = \"popup\";\n this.data.label = \"Last Map Interaction\";\n\n this.appState = appState;\n this.events = events;\n this.visible = false;\n\n this.elementObject = new CSS2DObject(htmlToElement(`
Test
`));\n this.elementObject.position.set(0.5, 1, 0.5);\n this.addEventListener( 'removed', () => {\n if (this.element.parentNode) this.element.parentNode.removeChild(this.element);\n });\n\n let cubeGeo = new BoxGeometry(1.01, 1.01, 1.01).translate(0.5, 0.5, 0.5);\n let cubeMaterial = new MeshBasicMaterial( {color: 0xffffff, opacity: 0.5, transparent: true} );\n this.cube = new Mesh(cubeGeo, cubeMaterial);\n this.cube.onClick = evt => this.onClick(evt);\n\n this.add(this.elementObject);\n this.add(this.cube);\n\n this.animation = null;\n\n this.events.addEventListener('bluemapMapInteraction', this.onMapInteraction);\n\n window.addEventListener(\"mousedown\", this.removeHandler);\n window.addEventListener(\"touchstart\", this.removeHandler);\n window.addEventListener(\"keydown\", this.removeHandler);\n window.addEventListener(\"mousewheel\", this.removeHandler);\n }\n\n onClick(event) {\n return true;\n }\n\n onMapInteraction = evt => {\n let isHires = true;\n let int = evt.detail.hiresHit;\n\n if (!int) {\n isHires = false;\n int = evt.detail.lowresHit;\n }\n\n if (!int) return;\n\n this.position\n .copy(int.pointOnLine || int.point)\n .add(evt.detail.ray.direction.clone().multiplyScalar(0.05))\n .floor();\n\n //this.elementObject.position\n //.copy(evt.detail.intersection.pointOnLine || evt.detail.intersection.point)\n //.sub(this.position);\n\n if (isHires) {\n this.element.innerHTML = `\n
\n
${i18n.t(\"blockTooltip.block\")}:
\n
\n
x: ${this.position.x}
\n
y: ${this.position.y}
\n
z: ${this.position.z}
\n
\n
\n `;\n } else {\n this.element.innerHTML = `\n
\n
${i18n.t(\"blockTooltip.position\")}:
\n
\n
x: ${this.position.x}
\n
z: ${this.position.z}
\n
\n
\n `;\n }\n\n if (this.appState.debug) {\n let chunkCoords = this.position.clone().divideScalar(16).floor();\n let regionCoords = new Vector2(this.position.x, this.position.z).divideScalar(512).floor();\n let regionFile = `r.${regionCoords.x}.${regionCoords.y}.mca`;\n\n this.element.innerHTML += `\n
\n
\n
${i18n.t(\"blockTooltip.chunk\")}:
\n
\n
x: ${chunkCoords.x}
\n
y: ${chunkCoords.y}
\n
z: ${chunkCoords.z}
\n
\n
\n
\n
\n
${i18n.t(\"blockTooltip.region.region\")}:
\n
\n
x: ${regionCoords.x}
\n
z: ${regionCoords.y}
\n
\n
\n
${i18n.t(\"blockTooltip.region.file\")}: ${regionFile}
\n
\n
\n `;\n }\n\n if (this.appState.debug) {\n let faceIndex = int.faceIndex;\n let attributes = int.object.geometry.attributes;\n if (attributes.sunlight && attributes.blocklight) {\n let sunlight = attributes.sunlight.array[faceIndex * 3];\n let blocklight = attributes.blocklight.array[faceIndex * 3];\n\n this.element.innerHTML += `\n
\n
\n
${i18n.t(\"blockTooltip.light.light\")}:
\n
\n
${i18n.t(\"blockTooltip.light.sun\")}: ${sunlight}
\n
${i18n.t(\"blockTooltip.light.block\")}: ${blocklight}
\n
\n
\n `;\n }\n }\n\n if (this.appState.debug) {\n let info = \"\";\n\n if (isHires) {\n let hrPath = evt.detail.hiresHit.object.userData.tileUrl;\n info += `
${hrPath}
`;\n }\n\n let lrPath = evt.detail.lowresHit.object.userData.tileUrl;\n info += `
${lrPath}
`;\n\n this.element.innerHTML += `\n
\n
\n ${info}\n
\n `;\n }\n\n if (this.appState.debug){\n console.debug(\"Clicked Position Data:\", evt.detail);\n }\n\n this.open();\n };\n\n open() {\n if (this.animation) this.animation.cancel();\n\n this.visible = true;\n this.cube.visible = true;\n\n let targetOpacity = 1;\n\n this.element.style.opacity = \"0\";\n this.animation = animate(progress => {\n this.element.style.opacity = (progress * targetOpacity).toString();\n }, 300);\n }\n\n removeHandler = evt => {\n if (evt.composedPath().includes(this.element)) return;\n this.close();\n }\n\n close() {\n if (this.animation) this.animation.cancel();\n\n this.cube.visible = false;\n\n let startOpacity = parseFloat(this.element.style.opacity);\n this.animation = animate(progress => {\n this.element.style.opacity = (startOpacity - progress * startOpacity).toString();\n }, 300, finished => {\n if (finished) this.visible = false;\n });\n }\n\n /**\n * @returns {Element}\n */\n get element() {\n return this.elementObject.element.getElementsByTagName(\"div\")[0];\n }\n\n dispose() {\n super.dispose();\n\n if (this.element.parentNode) this.element.parentNode.removeChild(this.element);\n }\n\n}","/**\n * Adapted from https://www.w3schools.com/js/js_cookies.asp\n */\nexport const setCookie = (key, value, days = 360) => {\n value = JSON.stringify(value);\n\n let expireDate = new Date();\n expireDate.setTime(expireDate.getTime() + days * 24 * 60 * 60 * 1000);\n document.cookie = key + \"=\" + value + \";\" + \"expires=\" + expireDate.toUTCString() + \";\" + \"SameSite=Lax\";\n};\n\n/**\n * Adapted from https://www.w3schools.com/js/js_cookies.asp\n */\nexport const getCookie = key => {\n let cookieString = decodeURIComponent(document.cookie);\n let cookies = cookieString.split(';');\n\n for(let i = 0; i < cookies.length; i++) {\n let cookie = cookies[i];\n\n while (cookie.charAt(0) === ' ') {\n cookie = cookie.substring(1);\n }\n\n if (cookie.indexOf(key + \"=\") === 0) {\n let value = cookie.substring(key.length + 1, cookie.length);\n\n try {\n value = JSON.parse(value);\n } catch (e) {} // eslint-disable-line no-empty\n\n return value;\n }\n }\n\n return undefined;\n};\n\nexport const round = (value, precision) => {\n let f = Math.pow(10, precision);\n return Math.round(value * f) / f;\n}\n","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport \"bluemap/src/BlueMap\";\nimport {MapViewer} from \"bluemap/src/MapViewer\";\nimport {MapControls} from \"bluemap/src/controls/map/MapControls\";\nimport {FreeFlightControls} from \"bluemap/src/controls/freeflight/FreeFlightControls\";\nimport {FileLoader, MathUtils, Vector3} from \"three\";\nimport {Map as BlueMapMap} from \"bluemap/src/map/Map\";\nimport {alert, animate, EasingFunctions, generateCacheHash} from \"bluemap/src/util/Utils\";\nimport {PlayerMarkerManager} from \"bluemap/src/markers/PlayerMarkerManager\";\nimport {MarkerFileManager} from \"bluemap/src/markers/MarkerFileManager\";\nimport {MainMenu} from \"@/js/MainMenu\";\nimport {PopupMarker} from \"@/js/PopupMarker\";\nimport {MarkerSet} from \"bluemap/src/markers/MarkerSet\";\nimport {getCookie, round, setCookie} from \"@/js/Utils\";\nimport i18n from \"../i18n\";\n\nexport class BlueMapApp {\n\n /**\n * @param rootElement {Element}\n */\n constructor(rootElement) {\n this.events = rootElement;\n\n this.mapViewer = new MapViewer(rootElement, this.events);\n\n this.mapControls = new MapControls(this.mapViewer.renderer.domElement);\n this.freeFlightControls = new FreeFlightControls(this.mapViewer.renderer.domElement);\n\n /** @type {PlayerMarkerManager} */\n this.playerMarkerManager = null;\n /** @type {MarkerFileManager} */\n this.markerFileManager = null;\n\n /** @type {{useCookies: boolean, maps: []}} */\n this.settings = null;\n this.savedUserSettings = new Map();\n\n /** @type BlueMapMap[] */\n this.maps = [];\n /** @type Map */\n this.mapsMap = new Map();\n\n this.dataUrl = \"data/\";\n\n this.mainMenu = new MainMenu();\n\n this.appState = {\n controls: {\n state: \"perspective\",\n mouseSensitivity: 1,\n invertMouse: false,\n },\n menu: this.mainMenu,\n maps: [],\n theme: null,\n debug: false\n };\n\n // init\n this.updateControlsSettings();\n\n // popup on click\n this.popupMarkerSet = new MarkerSet(\"bm-popup-set\");\n this.popupMarker = new PopupMarker(\"bm-popup\", this.appState, this.events);\n this.popupMarkerSet.add(this.popupMarker);\n this.mapViewer.markers.add(this.popupMarkerSet);\n\n this.updateLoop = null;\n\n this.hashUpdateTimeout = null;\n this.viewAnimation = null;\n }\n\n\n /**\n * @returns {Promise}\n */\n async load() {\n let oldMaps = this.maps;\n this.maps = [];\n this.appState.maps.splice(0, this.appState.maps.length);\n this.mapsMap.clear();\n\n // load settings\n await this.getSettings();\n\n // unload loaded maps\n await this.mapViewer.switchMap(null);\n oldMaps.forEach(map => map.dispose());\n\n // load maps\n this.maps = this.loadMaps();\n for (let map of this.maps) {\n this.mapsMap.set(map.data.id, map);\n this.appState.maps.push(map.data);\n }\n\n // switch to map\n if (!await this.loadPageAddress()) {\n if (this.maps.length > 0) await this.switchMap(this.maps[0].data.id);\n this.resetCamera();\n }\n\n // map position address\n window.addEventListener(\"hashchange\", this.loadPageAddress);\n this.events.addEventListener(\"bluemapCameraMoved\", this.cameraMoved);\n this.events.addEventListener(\"bluemapMapInteraction\", this.mapInteraction);\n\n // start app update loop\n if(this.updateLoop) clearTimeout(this.updateLoop);\n this.updateLoop = setTimeout(this.update, 1000);\n\n // load user settings\n await this.loadUserSettings();\n\n // save user settings\n this.saveUserSettings();\n }\n\n update = async () => {\n await this.followPlayerMarkerWorld();\n this.updateLoop = setTimeout(this.update, 1000);\n }\n\n async followPlayerMarkerWorld() {\n let player = this.mapViewer.controlsManager.controls ?\n this.mapViewer.controlsManager.controls.data.followingPlayer :\n false;\n\n if (this.mapViewer.map && player) {\n if (player.world !== this.mapViewer.map.data.world){\n\n /** @type BlueMapMap */\n let matchingMap = null;\n for (let map of this.maps) {\n if (map.data.world === player.world) {\n matchingMap = map;\n break;\n }\n }\n\n if (!matchingMap) {\n if (this.mapViewer.controlsManager.controls.stopFollowingPlayerMarker)\n this.mapViewer.controlsManager.controls.stopFollowingPlayerMarker();\n return;\n }\n\n await this.switchMap(matchingMap.data.id);\n }\n }\n }\n\n /**\n * @param mapId {String}\n * @param resetCameraIfNewWorld {boolean}\n * @returns {Promise}\n */\n switchMap(mapId, resetCameraIfNewWorld = false) {\n let map = this.mapsMap.get(mapId);\n if (!map) return Promise.reject(`There is no map with the id \"${mapId}\" loaded!`);\n\n let oldWorld = this.mapViewer.map ? this.mapViewer.map.data.world : null;\n return this.mapViewer.switchMap(map).then(() => {\n if (map) {\n this.initPlayerMarkerManager();\n this.initMarkerFileManager();\n\n if (resetCameraIfNewWorld && map.data.world !== oldWorld) {\n this.resetCamera();\n }\n }\n\n this.updatePageAddress();\n });\n }\n\n resetCamera() {\n let map = this.mapViewer.map;\n let controls = this.mapViewer.controlsManager;\n\n if (map) {\n controls.position.set(map.data.startPos.x, 0, map.data.startPos.z);\n controls.distance = 500;\n controls.angle = 0;\n controls.rotation = 0;\n controls.tilt = 0;\n controls.ortho = 0;\n }\n\n controls.controls = this.mapControls;\n this.appState.controls.state = \"perspective\";\n this.updatePageAddress();\n }\n\n /**\n * @returns BlueMapMap[]\n */\n loadMaps() {\n let settings = this.settings;\n let maps = [];\n\n // create maps\n if (settings.maps !== undefined){\n for (let mapId in settings.maps) {\n if (!Object.prototype.hasOwnProperty.call(settings.maps, mapId)) continue;\n\n let mapSettings = settings.maps[mapId];\n if (mapSettings.enabled) {\n let map = new BlueMapMap(mapId, this.dataUrl + mapId + \"/\", this.dataUrl + \"settings.json\", this.dataUrl + \"textures.json\", this.mapViewer.events);\n maps.push(map);\n\n map.loadSettings()\n .catch(error => {\n alert(this.events, `Failed to load settings for map '${map.data.id}':` + error, \"warning\");\n });\n }\n }\n }\n\n // sort maps\n maps.sort((map1, map2) => {\n let sort = settings.maps[map1.data.id].ordinal - settings.maps[map2.data.id].ordinal;\n if (isNaN(sort)) return 0;\n return sort;\n });\n\n return maps;\n }\n\n async getSettings() {\n if (!this.settings){\n this.settings = await this.loadSettings();\n }\n\n return this.settings;\n }\n\n /**\n * @returns {Promise}\n */\n loadSettings() {\n return new Promise((resolve, reject) => {\n let loader = new FileLoader();\n loader.setResponseType(\"json\");\n loader.load(this.dataUrl + \"settings.json?\" + generateCacheHash(),\n resolve,\n () => {},\n () => reject(\"Failed to load the settings.json!\")\n );\n });\n }\n\n initPlayerMarkerManager() {\n if (!this.mapViewer.map) return;\n\n if (this.playerMarkerManager) {\n this.playerMarkerManager.worldId = this.mapViewer.map.data.world;\n } else {\n this.playerMarkerManager = new PlayerMarkerManager(this.mapViewer.markers, \"live/players\", this.mapViewer.map.data.world, this.events);\n }\n\n this.playerMarkerManager.setAutoUpdateInterval(0);\n this.playerMarkerManager.update()\n .then(() => {\n this.playerMarkerManager.setAutoUpdateInterval(1000);\n })\n .catch(e => {\n alert(this.events, e, \"warning\");\n this.playerMarkerManager.clear();\n this.playerMarkerManager.dispose();\n });\n }\n\n initMarkerFileManager() {\n if (this.markerFileManager) {\n this.markerFileManager.clear();\n this.markerFileManager.dispose();\n }\n\n if (!this.mapViewer.map) return;\n\n this.markerFileManager = new MarkerFileManager(this.mapViewer.markers, \"data/markers.json\", this.mapViewer.map.data.id, this.events);\n this.markerFileManager.update()\n .then(() => {\n this.markerFileManager.setAutoUpdateInterval(1000 * 10);\n })\n .catch(e => {\n alert(this.events, e, \"warning\");\n this.markerFileManager.clear();\n this.markerFileManager.dispose();\n });\n }\n\n updateControlsSettings() {\n let mouseInvert = this.appState.controls.invertMouse ? -1 : 1;\n\n this.freeFlightControls.mouseRotate.speedCapture = -1.5 * this.appState.controls.mouseSensitivity;\n this.freeFlightControls.mouseAngle.speedCapture = -1.5 * this.appState.controls.mouseSensitivity * mouseInvert;\n this.freeFlightControls.mouseRotate.speedRight = -2 * this.appState.controls.mouseSensitivity;\n this.freeFlightControls.mouseAngle.speedRight = -2 * this.appState.controls.mouseSensitivity * mouseInvert;\n }\n\n setPerspectiveView(transition = 0, minDistance = 5) {\n if (!this.mapViewer.map) return;\n if (this.viewAnimation) this.viewAnimation.cancel();\n\n let cm = this.mapViewer.controlsManager;\n cm.controls = null;\n\n let startDistance = cm.distance;\n let targetDistance = Math.max(5, minDistance, startDistance);\n\n let startY = cm.position.y;\n let targetY = MathUtils.lerp(this.mapViewer.map.terrainHeightAt(cm.position.x, cm.position.z) + 3, 0, targetDistance / 500);\n\n let startAngle = cm.angle;\n let targetAngle = Math.min(Math.PI / 2, startAngle, this.mapControls.getMaxPerspectiveAngleForDistance(targetDistance));\n\n let startOrtho = cm.ortho;\n let startTilt = cm.tilt;\n\n this.viewAnimation = animate(p => {\n let ep = EasingFunctions.easeInOutQuad(p);\n cm.position.y = MathUtils.lerp(startY, targetY, ep);\n cm.distance = MathUtils.lerp(startDistance, targetDistance, ep);\n cm.angle = MathUtils.lerp(startAngle, targetAngle, ep);\n cm.ortho = MathUtils.lerp(startOrtho, 0, p);\n cm.tilt = MathUtils.lerp(startTilt, 0, ep);\n }, transition, finished => {\n this.mapControls.reset();\n if (finished){\n cm.controls = this.mapControls;\n this.updatePageAddress();\n }\n });\n\n this.appState.controls.state = \"perspective\";\n }\n\n setFlatView(transition = 0, minDistance = 5) {\n if (!this.mapViewer.map) return;\n if (this.viewAnimation) this.viewAnimation.cancel();\n\n let cm = this.mapViewer.controlsManager;\n cm.controls = null;\n\n let startDistance = cm.distance;\n let targetDistance = Math.max(5, minDistance, startDistance);\n\n let startRotation = cm.rotation;\n let startAngle = cm.angle;\n let startOrtho = cm.ortho;\n let startTilt = cm.tilt;\n\n this.viewAnimation = animate(p => {\n let ep = EasingFunctions.easeInOutQuad(p);\n cm.distance = MathUtils.lerp(startDistance, targetDistance, ep);\n cm.rotation = MathUtils.lerp(startRotation, 0, ep);\n cm.angle = MathUtils.lerp(startAngle, 0, ep);\n cm.ortho = MathUtils.lerp(startOrtho, 1, p);\n cm.tilt = MathUtils.lerp(startTilt, 0, ep);\n }, transition, finished => {\n this.mapControls.reset();\n if (finished){\n cm.controls = this.mapControls;\n this.updatePageAddress();\n }\n });\n\n this.appState.controls.state = \"flat\";\n }\n\n setFreeFlight(transition = 0, targetY = undefined) {\n if (!this.mapViewer.map) return;\n if (this.viewAnimation) this.viewAnimation.cancel();\n\n let cm = this.mapViewer.controlsManager;\n cm.controls = null;\n\n let startDistance = cm.distance;\n\n let startY = cm.position.y;\n if (!targetY) targetY = this.mapViewer.map.terrainHeightAt(cm.position.x, cm.position.z) + 3;\n\n let startAngle = cm.angle;\n let targetAngle = Math.PI / 2;\n\n let startOrtho = cm.ortho;\n let startTilt = cm.tilt;\n\n this.viewAnimation = animate(p => {\n let ep = EasingFunctions.easeInOutQuad(p);\n cm.position.y = MathUtils.lerp(startY, targetY, ep);\n cm.distance = MathUtils.lerp(startDistance, 0, ep);\n cm.angle = MathUtils.lerp(startAngle, targetAngle, ep);\n cm.ortho = MathUtils.lerp(startOrtho, 0, Math.min(p * 2, 1));\n cm.tilt = MathUtils.lerp(startTilt, 0, ep);\n }, transition, finished => {\n if (finished){\n cm.controls = this.freeFlightControls;\n this.updatePageAddress();\n }\n });\n\n this.appState.controls.state = \"free\";\n }\n\n setDebug(debug) {\n this.appState.debug = debug;\n\n if (debug){\n this.mapViewer.stats.showPanel(0);\n } else {\n this.mapViewer.stats.showPanel(-1);\n }\n }\n\n setTheme(theme) {\n this.appState.theme = theme;\n\n if (theme === \"light\") {\n this.mapViewer.rootElement.classList.remove(\"theme-dark\");\n this.mapViewer.rootElement.classList.add(\"theme-light\");\n }\n else if (theme === \"dark\") {\n this.mapViewer.rootElement.classList.remove(\"theme-light\");\n this.mapViewer.rootElement.classList.add(\"theme-dark\");\n }\n else {\n this.mapViewer.rootElement.classList.remove(\"theme-light\");\n this.mapViewer.rootElement.classList.remove(\"theme-dark\");\n }\n }\n\n async updateMap() {\n try {\n this.mapViewer.clearTileCache();\n if (this.mapViewer.map) {\n await this.switchMap(this.mapViewer.map.data.id);\n }\n this.saveUserSettings();\n } catch (e) {\n alert(this.events, e, \"error\");\n }\n }\n\n resetSettings() {\n this.saveUserSetting(\"resetSettings\", true);\n location.reload();\n }\n\n async loadUserSettings(){\n if (!this.settings.useCookies) return;\n\n if (this.loadUserSetting(\"resetSettings\", false)) {\n alert(this.events, \"Settings reset!\", \"info\");\n this.saveUserSettings();\n return;\n }\n\n this.mapViewer.clearTileCache(this.loadUserSetting(\"tileCacheHash\", this.mapViewer.tileCacheHash));\n\n this.mapViewer.superSampling = this.loadUserSetting(\"superSampling\", this.mapViewer.data.superSampling);\n this.mapViewer.data.loadedHiresViewDistance = this.loadUserSetting(\"hiresViewDistance\", this.mapViewer.data.loadedHiresViewDistance);\n this.mapViewer.data.loadedLowresViewDistance = this.loadUserSetting(\"lowresViewDistance\", this.mapViewer.data.loadedLowresViewDistance);\n this.mapViewer.updateLoadedMapArea();\n this.appState.controls.mouseSensitivity = this.loadUserSetting(\"mouseSensitivity\", this.appState.controls.mouseSensitivity);\n this.appState.controls.invertMouse = this.loadUserSetting(\"invertMouse\", this.appState.controls.invertMouse);\n this.updateControlsSettings();\n this.setTheme(this.loadUserSetting(\"theme\", this.appState.theme));\n await i18n.setLanguage(this.loadUserSetting(\"lang\", i18n.locale));\n this.setDebug(this.loadUserSetting(\"debug\", this.appState.debug));\n\n alert(this.events, \"Settings loaded!\", \"info\");\n }\n\n saveUserSettings() {\n if (!this.settings.useCookies) return;\n\n this.saveUserSetting(\"resetSettings\", false);\n this.saveUserSetting(\"tileCacheHash\", this.mapViewer.tileCacheHash);\n\n this.saveUserSetting(\"superSampling\", this.mapViewer.data.superSampling);\n this.saveUserSetting(\"hiresViewDistance\", this.mapViewer.data.loadedHiresViewDistance);\n this.saveUserSetting(\"lowresViewDistance\", this.mapViewer.data.loadedLowresViewDistance);\n this.saveUserSetting(\"mouseSensitivity\", this.appState.controls.mouseSensitivity);\n this.saveUserSetting(\"invertMouse\", this.appState.controls.invertMouse);\n this.saveUserSetting(\"theme\", this.appState.theme);\n this.saveUserSetting(\"lang\", i18n.locale);\n this.saveUserSetting(\"debug\", this.appState.debug);\n\n alert(this.events, \"Settings saved!\", \"info\");\n }\n\n loadUserSetting(key, defaultValue){\n let value = getCookie(\"bluemap-\" + key);\n\n if (value === undefined) return defaultValue;\n return value;\n }\n\n saveUserSetting(key, value){\n if (this.savedUserSettings.get(key) !== value){\n this.savedUserSettings.set(key, value);\n setCookie(\"bluemap-\" + key, value);\n }\n }\n\n cameraMoved = () => {\n if (this.hashUpdateTimeout) clearTimeout(this.hashUpdateTimeout);\n this.hashUpdateTimeout = setTimeout(this.updatePageAddress, 1500);\n }\n\n updatePageAddress = () => {\n let hash = \"#\";\n\n if (this.mapViewer.map) {\n hash += this.mapViewer.map.data.id;\n\n let controls = this.mapViewer.controlsManager;\n hash += \":\" + round(controls.position.x, 0);\n hash += \":\" + round(controls.position.y, 0);\n hash += \":\" + round(controls.position.z, 0);\n hash += \":\" + round(controls.distance, 0);\n hash += \":\" + round(controls.rotation, 2);\n hash += \":\" + round(controls.angle, 2);\n hash += \":\" + round(controls.tilt, 2);\n hash += \":\" + round(controls.ortho, 0);\n hash += \":\" + this.appState.controls.state;\n }\n\n history.replaceState(undefined, undefined, hash);\n\n document.title = i18n.t(\"pageTitle\", {\n map: this.mapViewer.map ? this.mapViewer.map.data.name : \"?\"\n });\n }\n\n loadPageAddress = async () => {\n let hash = window.location.hash.substr(1);\n let values = hash.split(\":\");\n\n if (values.length !== 10) return false;\n\n let controls = this.mapViewer.controlsManager;\n controls.controls = null;\n\n if (!this.mapViewer.map || this.mapViewer.map.data.id !== values[0]) {\n try {\n await this.switchMap(values[0]);\n } catch (e) {\n return false;\n }\n }\n\n controls.position.x = parseFloat(values[1]);\n controls.position.y = parseFloat(values[2]);\n controls.position.z = parseFloat(values[3]);\n controls.distance = parseFloat(values[4]);\n controls.rotation = parseFloat(values[5]);\n controls.angle = parseFloat(values[6]);\n controls.tilt = parseFloat(values[7]);\n controls.ortho = parseFloat(values[8]);\n\n switch (values[9]) {\n case \"flat\" : this.setFlatView(0); break;\n case \"free\" : this.setFreeFlight(0, controls.position.y); break;\n default : this.setPerspectiveView(0); break;\n }\n\n return true;\n }\n\n mapInteraction = event => {\n if (event.detail.data.doubleTap) {\n let cm = this.mapViewer.controlsManager;\n let pos = (event.detail.hit ? event.detail.hit.point : false) || event.detail.object.getWorldPosition(new Vector3());\n\n let startDistance = cm.distance;\n let targetDistance = Math.max(startDistance * 0.25, 5);\n\n let startX = cm.position.x;\n let targetX = pos.x;\n\n let startZ = cm.position.z;\n let targetZ = pos.z;\n\n this.viewAnimation = animate(p => {\n let ep = EasingFunctions.easeInOutQuad(p);\n cm.distance = MathUtils.lerp(startDistance, targetDistance, ep);\n cm.position.x = MathUtils.lerp(startX, targetX, ep);\n cm.position.z = MathUtils.lerp(startZ, targetZ, ep);\n }, 500);\n }\n }\n\n}","/*\n * This file is part of BlueMap, licensed under the MIT License (MIT).\n *\n * Copyright (c) Blue (Lukas Rieger) \n * Copyright (c) contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nimport Vue from 'vue'\nimport App from './App.vue'\nimport {BlueMapApp} from \"@/js/BlueMapApp\";\nimport i18n from './i18n';\n\n// utils\nString.prototype.includesCI = function (val) {\n return this.toLowerCase().includes(val.toLowerCase());\n}\n\n// bluemap app\nconst bluemap = new BlueMapApp(document.getElementById(\"map-container\"));\nwindow.bluemap = bluemap;\n\n// init vue\nVue.config.productionTip = false;\nObject.defineProperty(Vue.prototype, '$bluemap', {\n get() { return bluemap; }\n});\n\nconst vue = new Vue({\n i18n,\n render: h => h(App)\n}).$mount('#app');\n\n// load languages\ni18n.loadLanguageSettings().catch(error => console.error(error));\n\n// load bluemap next tick (to let the assets load first)\nvue.$nextTick(() => {\n bluemap.load().catch(error => console.error(error));\n});\n","export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SwitchButton.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ControlBar.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PositionInput.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SimpleButton.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MarkerSet.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Slider.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MainMenu.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SwitchHandle.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Group.vue?vue&type=style&index=0&lang=scss&\""],"sourceRoot":""}