{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/components/Menu/TextInput.vue?3f27","webpack:///./src/components/Menu/MarkerItem.vue?d5b2","webpack:///./src/components/ControlBar/ControlsSwitch.vue?2956","webpack:///./src/components/ControlBar/SvgButton.vue?66d4","webpack:///./src/components/ControlBar/MenuButton.vue?ffe6","webpack:///./src/components/ControlBar/NumberInput.vue?95c0","webpack:///./src/components/ControlBar/DayNightSwitch.vue?a192","webpack:///./src/components/Menu/MapButton.vue?bd23","webpack:///./src/components/Controls/FreeFlightMobileControls.vue?1816","webpack:///./src/components/ControlBar/Compass.vue?bfcb","webpack:///./src/components/Menu/SideMenu.vue?96af","webpack:///./src/App.vue?bc4c","webpack:///./src/components/ControlBar/ControlBar.vue?e8b2","webpack:///./src/components/ControlBar/PositionInput.vue?b919","webpack:///./src/components/ControlBar/NumberInput.vue?26b4","webpack:///src/components/ControlBar/NumberInput.vue","webpack:///./src/components/ControlBar/NumberInput.vue?ace8","webpack:///./src/components/ControlBar/NumberInput.vue?70aa","webpack:///src/components/ControlBar/PositionInput.vue","webpack:///./src/components/ControlBar/PositionInput.vue?d949","webpack:///./src/components/ControlBar/PositionInput.vue?b166","webpack:///./src/components/ControlBar/Compass.vue?8d62","webpack:///./BlueMapWeb/src/util/Utils.js","webpack:///src/components/ControlBar/Compass.vue","webpack:///src/components/ControlBar/DayNightSwitch.vue","webpack:///./src/components/ControlBar/SvgButton.vue?d462","webpack:///src/components/ControlBar/SvgButton.vue","webpack:///./src/components/ControlBar/SvgButton.vue?ee5f","webpack:///./src/components/ControlBar/SvgButton.vue?6cb1","webpack:///./src/components/ControlBar/Compass.vue?d659","webpack:///./src/components/ControlBar/Compass.vue?7ca6","webpack:///./src/components/ControlBar/DayNightSwitch.vue?f1a2","webpack:///./src/components/ControlBar/DayNightSwitch.vue?2fe5","webpack:///./src/components/ControlBar/DayNightSwitch.vue?2ff5","webpack:///./src/components/ControlBar/ControlsSwitch.vue?fbf5","webpack:///src/components/ControlBar/ControlsSwitch.vue","webpack:///./src/components/ControlBar/ControlsSwitch.vue?742d","webpack:///./src/components/ControlBar/ControlsSwitch.vue?7231","webpack:///./src/components/ControlBar/MenuButton.vue?c924","webpack:///src/components/ControlBar/MenuButton.vue","webpack:///./src/components/ControlBar/MenuButton.vue?62de","webpack:///./src/components/ControlBar/MenuButton.vue?e96d","webpack:///src/components/ControlBar/ControlBar.vue","webpack:///./src/components/ControlBar/ControlBar.vue?dcc7","webpack:///./src/components/ControlBar/ControlBar.vue?42e9","webpack:///./src/components/Menu/MainMenu.vue?97a1","webpack:///./src/components/Menu/SideMenu.vue?8427","webpack:///src/components/Menu/SideMenu.vue","webpack:///./src/components/Menu/SideMenu.vue?4a50","webpack:///./src/components/Menu/SideMenu.vue?76b2","webpack:///./src/components/Menu/SimpleButton.vue?8a40","webpack:///src/components/Menu/SimpleButton.vue","webpack:///./src/components/Menu/SimpleButton.vue?29af","webpack:///./src/components/Menu/SimpleButton.vue?8fd0","webpack:///./src/components/Menu/SettingsMenu.vue?e982","webpack:///./src/components/Menu/Group.vue?11f4","webpack:///src/components/Menu/Group.vue","webpack:///./src/components/Menu/Group.vue?1201","webpack:///./src/components/Menu/Group.vue?c2ed","webpack:///./src/components/Menu/Slider.vue?44f6","webpack:///src/components/Menu/Slider.vue","webpack:///./src/components/Menu/Slider.vue?c766","webpack:///./src/components/Menu/Slider.vue?25e1","webpack:///./src/components/Menu/SwitchButton.vue?48b0","webpack:///./src/components/Menu/SwitchHandle.vue?8302","webpack:///src/components/Menu/SwitchHandle.vue","webpack:///./src/components/Menu/SwitchHandle.vue?b5b6","webpack:///./src/components/Menu/SwitchHandle.vue?9829","webpack:///src/components/Menu/SwitchButton.vue","webpack:///./src/components/Menu/SwitchButton.vue?9d74","webpack:///./src/components/Menu/SwitchButton.vue?ecd0","webpack:///./src/i18n/fallback.js","webpack:///./src/i18n/index.js","webpack:///src/components/Menu/SettingsMenu.vue","webpack:///./src/components/Menu/SettingsMenu.vue?56ae","webpack:///./src/components/Menu/SettingsMenu.vue","webpack:///./src/js/MainMenu.js","webpack:///./src/components/Menu/MarkerSetMenu.vue?0d42","webpack:///./src/components/Menu/MarkerItem.vue?13c8","webpack:///src/components/Menu/MarkerItem.vue","webpack:///./src/components/Menu/MarkerItem.vue?5063","webpack:///./src/components/Menu/MarkerItem.vue?48c1","webpack:///./src/components/Menu/TextInput.vue?db74","webpack:///src/components/Menu/TextInput.vue","webpack:///./src/components/Menu/TextInput.vue?9d93","webpack:///./src/components/Menu/TextInput.vue?3875","webpack:///./src/components/Menu/MarkerSet.vue?6400","webpack:///src/components/Menu/MarkerSet.vue","webpack:///./src/components/Menu/MarkerSet.vue?948d","webpack:///./src/components/Menu/MarkerSet.vue?a132","webpack:///src/components/Menu/MarkerSetMenu.vue","webpack:///./src/components/Menu/MarkerSetMenu.vue?1e88","webpack:///./src/components/Menu/MarkerSetMenu.vue","webpack:///./src/components/Menu/MapButton.vue?03c8","webpack:///src/components/Menu/MapButton.vue","webpack:///./src/components/Menu/MapButton.vue?9784","webpack:///./src/components/Menu/MapButton.vue?71ba","webpack:///src/components/Menu/MainMenu.vue","webpack:///./src/components/Menu/MainMenu.vue?64d4","webpack:///./src/components/Menu/MainMenu.vue?5ec9","webpack:///./src/components/Controls/FreeFlightMobileControls.vue?bf65","webpack:///src/components/Controls/FreeFlightMobileControls.vue","webpack:///./src/components/Controls/FreeFlightMobileControls.vue?86c6","webpack:///./src/components/Controls/FreeFlightMobileControls.vue?748e","webpack:///src/App.vue","webpack:///./src/App.vue?60d0","webpack:///./src/App.vue?315a","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/map/LowresTileLoader.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/util/CSS2DRenderer.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/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/MarkerSet.js","webpack:///./BlueMapWeb/src/MapViewer.js","webpack:///./BlueMapWeb/src/markers/PlayerMarker.js","webpack:///./BlueMapWeb/src/markers/PlayerMarkerSet.js","webpack:///./BlueMapWeb/src/markers/MarkerManager.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?db16","webpack:///./src/components/Menu/SwitchButton.vue?2357","webpack:///./src/components/ControlBar/ControlBar.vue?fec1","webpack:///./src/components/ControlBar/PositionInput.vue?eabc","webpack:///./src/components/Menu/SimpleButton.vue?1a7a","webpack:///./src/components/Menu/MarkerSet.vue?38b5","webpack:///./src/components/Menu/Slider.vue?2ac8","webpack:///./src/components/Menu/MainMenu.vue?bc01","webpack:///./src/components/Menu/SwitchHandle.vue?c8f1","webpack:///./src/components/Menu/Group.vue?9bb8"],"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","filters","format","component","components","NumberInput","action","style","VEC2_ZERO","Vector2","stringToImage","Vector3","string","image","document","createElementNS","src","pathFromCoords","path","splitNumberToPath","substring","num","toString","charAt","hashTile","generateCacheHash","Math","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","vecArrToObj","val","useZ","pixel","width","height","pixelContext","getContext","willReadFrequently","getPixel","img","drawImage","floor","getImageData","active","_t","SvgButton","computed","transform","methods","evt","isDay","mapViewer","isPerspectiveView","setPerspectiveView","isFlatView","setFlatView","isFreeFlight","setFreeFlight","close","back","MenuButton","ControlsSwitch","DayNightSwitch","PositionInput","Compass","id","currentPage","title","pageStack","closePage","closeAll","goFullscreen","takeScreenshot","updateMap","_l","map","version","settings","buttonEnterAnimation","open","rendered","default","submenu","uniforms","sunlightStrength","ambientLight","stage","superSampling","saveUserSettings","loadedHiresViewDistance","hiresSliderMin","hiresSliderMax","renderDistanceFormatter","updateLoadedMapArea","loadedLowresViewDistance","lowresSliderMin","lowresSliderMax","pauseTileLoading","mouseSensitivity","updateControlsSettings","invertMouse","setTheme","screenshot","clipboard","$i18n","languages","lang","locale","setLanguage","switchDebug","resetSettings","formatter","step","countDecimals","SwitchHandle","pageTitle","tooltip","button","marker","searchPlaceholder","followPlayerTitle","lighting","dayNightSwitch","sunlight","resolution","high","normal","low","freeFlightControls","invertMouseY","renderDistance","hiresLayer","lowersLayer","loadHiresWhileMoving","off","dark","light","contrast","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","SwitchButton","Slider","SimpleButton","Group","qualityStages","themes","MainMenu","NULL_PAGE","openMore","filteredMarkerSets","thisMarkerSet","filter","search","visible","click","playerUuid","steve","markerLabel","followingPlayer","v","follow","cm","matchingMap","toggle","$tc","MarkerSet","TextInput","MarkerItem","filteredMarkers","selected","selectedMapId","switchMap","color","skyColor","g","b","mapId","MapButton","MarkerSetMenu","SettingsMenu","SideMenu","disabled","enabled","forward","forwardPointer","changedTouches","identifier","preventDefault","up","upPointer","onTouchStop","onFrame","enable","mounted","beforeDestroy","FreeFlightMobileControls","ControlBar","Tile","onLoad","onUnload","model","unloaded","loading","tileLoader","Promise","reject","unload","load","then","disposeModel","finally","userData","tileType","geometry","dispose","material","textureImage","TileMap","canvas","tileMapContext","alpha","texture","Texture","generateMipmaps","magFilter","LinearFilter","minFilter","wrapS","ClampToEdgeWrapping","wrapT","flipY","needsUpdate","fillStyle","fillRect","TileManager","onTileLoad","onTileUnload","events","loadNextTile","loadTimeout","clearTimeout","currentlyLoading","setTimeout","loadCloseTiles","tile","tileMap","setTile","centerTile","tileMapHalfSize","LOADED","scene","add","EMPTY","remove","sceneParent","Scene","viewDistanceX","viewDistanceZ","tiles","Map","tileMapSize","unloadTiles","removeAllTiles","set","removeFarTiles","setAll","forEach","hash","delete","clear","tryLoadTile","abs","tileHash","undefined","handleLoadedTile","handleUnloadedTile","catch","TileLoader","tilePath","tileSettings","loadBlocker","resolve","tileCacheHash","tileX","tileZ","cancelCheck","tileUrl","fileLoader","json","geometryJson","tileGeometry","status","bufferGeometryLoader","parse","Mesh","tileSize","translate","scale","updateMatrixWorld","FileLoader","setResponseType","BufferGeometryLoader","LowresTileLoader","lod","vertexShader","fragmentShader","textureLoader","anisotropy","NearestFilter","NearestMipMapLinearFilter","flatShading","ShaderMaterial","textureSize","transparent","depthWrite","depthTest","vertexColors","VertexColors","side","FrontSide","wireframe","pow","lodFactor","TextureLoader","PlaneBufferGeometry","ceil","deleteAttribute","rotateX","PI","dataUrl","layer","sorting","settingsUrl","texturesUrl","startPos","Color","hires","lowres","lodCount","raycaster","Raycaster","hiresMaterial","lowresMaterial","loadedTextures","hiresTileManager","lowresTileManager","hiresVertexShader","hiresFragmentShader","lowresVertexShader","lowresFragmentShader","settingsPromise","loadSettings","textureFilePromise","loadTexturesFile","createLowresMaterial","all","values","textures","Error","createHiresMaterial","autoUpdate","loadSettingsFile","worldSettings","setRGB","hiresViewDistance","lowresViewDistance","isLoaded","hiresX","hiresZ","hiresViewX","hiresViewZ","loadAroundTile","lowresX","lowresZ","lowresViewX","lowresViewZ","loader","materials","textureSettings","opaque","halfTransparent","addEventListener","near","far","layers","enableAll","hiresTileHash","intersects","intersectObjects","point","ignore","scaledTileSize","lowresTileHash","heightUnsigned","SKY_FRAGMENT_SHADER","SKY_VERTEX_SHADER","SkyboxScene","SphereGeometry","BackSide","skybox","ControlsManager","camera","rotation","angle","tilt","lastPosition","clone","lastRotation","lastAngle","lastDistance","distance","lastOrtho","ortho","lastTilt","lastMapUpdatePosition","lastMapUpdateDistance","averageDeltaTime","_controls","updateCamera","update","valueChanged","isValueChanged","resetValueChanged","rotatableAngle","rotatableDistance","lerp","rotationVector","sin","cos","angleRotationAxis","cross","applyAxisAngle","multiplyScalar","copy","sub","lookAt","rotateZ","controlsManager","triggerDistance","loadMapArea","screenPosition","handleMapInteraction","equals","stop","start","_mapViewer","_camera","Stats","container","addPanel","panel","appendChild","dom","showPanel","children","display","hide","cssText","beginTime","performance","Date","now","prevTime","frames","prevFrameTime","fpsPanel","Panel","msPanel","lastFrameMsPanel","memPanel","self","memory","REVISION","begin","end","usedJSHeapSize","jsHeapSizeLimit","domElement","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","HIRES_VERTEX_SHADER","ShaderChunk","logdepthbuf_pars_vertex","logdepthbuf_vertex","HIRES_FRAGMENT_SHADER","logdepthbuf_pars_fragment","logdepthbuf_fragment","LOWRES_VERTEX_SHADER","LOWRES_FRAGMENT_SHADER","CombinedCamera","fov","aspect","zoom","updateProjectionMatrix","ortographicProjection","Matrix4","perspectiveProjection","tan","DEG2RAD","view","fullWidth","fullHeight","offsetX","offsetY","skew","filmOffset","getFilmWidth","normalizedOrtho","orthoTop","orthoHeight","orthoWidth","orthoLeft","makePerspective","makeOrthographic","projectionMatrix","elements","projectionMatrixInverse","invert","isPerspectiveCamera","PerspectiveCamera","CSS2DObject","Object3D","parent","parentNode","replaceChild","anchor","traverse","Element","removeChild","lastClick","handleClick","doubleTap","onClick","constructor","CSS2DRenderer","_width","_height","_widthHalf","_heightHalf","_this","vector","viewMatrix","viewProjectionMatrix","cache","objects","WeakMap","overflow","getSize","setSize","renderObject","parentVisible","onBeforeRender","setFromMatrixPosition","matrixWorld","applyMatrix4","WebkitTransform","MozTransform","oTransform","opacity","objectData","distanceToCameraSquared","getDistanceToSquared","onAfterRender","a","distanceToSquared","filterAndFlatten","zOrder","sorted","sort","distanceA","distanceB","zMax","zIndex","render","matrixWorldInverse","multiplyMatrices","UniformsLib","line","linewidth","dashScale","dashSize","gapSize","ShaderLib","UniformsUtils","merge","common","fog","LineMaterial","parameters","clipping","dashed","defineProperties","diffuse","setValues","isLineMaterial","MARKER_FILL_VERTEX_SHADER","MARKER_FILL_FRAGMENT_SHADER","LineSegmentsGeometry","InstancedBufferGeometry","positions","uvs","index","setIndex","Float32BufferAttribute","assign","isLineSegmentsGeometry","matrix","attributes","instanceStart","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","Sphere","center","getCenter","maxRadiusSq","il","count","fromBufferAttribute","radius","sqrt","isNaN","toJSON","applyMatrix","LineGeometry","isLineGeometry","points","fromLine","LineSegments2","isLineSegments2","computeLineDistances","lineDistances","distanceTo","instanceDistanceBuffer","raycast","Vector4","ssOrigin","ssOrigin3","mvMatrix","Line3","closestPoint","threshold","params","Line2","ray","lineWidth","at","w","isBehindCameraNear","isPastCameraFar","param","closestPointToPointParameter","zPos","isInClipSpace","isInside","pointOnLine","distanceSqToSegment","origin","face","faceIndex","uv","uv2","isLine2","Marker","markerId","markerData","fadeDistanceMin","fadeDistanceMax","calculateDistanceToCameraPlane","minDelta","maxDelta","_posRelativeToCamera","subVectors","getWorldDirection","_cameraDirection","dot","ObjectMarker","link","newTab","pos","intersection","popup","LabelPopup","setX","setY","setZ","autoClose","targetOpacity","inAnimation","removeHandler","composedPath","includes","removeEventListener","startOpacity","completed","ShapeMarker","zero","shape","Shape","fill","ShapeMarkerFill","border","ShapeMarkerBorder","renderOrder","_markerData","relativeY","updateGeometry","setShape","createShapeFromData","setShapeY","shapeY","bc","lineColor","borderColor","fc","fillColor","minDist","minDistance","maxDist","maxDistance","Number","MAX_VALUE","shapeData","createGeometry","DoubleSide","markerColor","markerOpacity","test","ShapeBufferGeometry","createLinePoints","innerWidth","innerHeight","renderer","points3d","getPoints","ExtrudeMarker","ExtrudeMarkerFill","ExtrudeMarkerBorder","minY","maxY","shapeMinY","shapeMaxY","ExtrudeBufferGeometry","depth","steps","bevelEnabled","prevPoint","LineMarker","LineMarkerLine","isVector3","setLine","createPointsFromData","lc","HtmlMarker","elementObject","calculateDistanceOpacity","getElementsByTagName","anch","PoiMarker","iconElement","item","labelElement","_lastIcon","highlight","eventHandler","classList","contains","iconAnchor","icon","toggleable","defaultHide","defaultHidden","updateMarkerSetsFromData","updateMarkersFromData","updatedMarkerSets","Set","keys","markerSetId","has","markerSetData","updateMarkerSetFromData","err","setId","updateFromData","updatedMarkers","updateMarkerFromData","isMarkerSet","isMarker","indexOf","child","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","intersectScenes","hit","lowresHits","hiresHit","covered","parentRoot","intersections","clearDepth","sX","sZ","cameraFar","highestLod","scenePos","isMap","initTexture","centerX","centerZ","newTileCacheHash","_controlsManager","_map","PlayerMarker","playerHeadElement","playerNameElement","once","deltaPos","ease","foreign","PlayerMarkerSet","updatedPlayerMarkers","playerData","playerMarker","updatePlayerMarkerFromData","uuid","getPlayerMarkerId","isPlayerMarker","MarkerFileType","NORMAL","PLAYER","PLAYER_MARKER_SET_ID","MarkerManager","root","fileUrl","fileType","disposed","_updateInterval","ms","success","e","loadMarkerFile","markerFileData","updateFromDataNormal","updateFromDataPlayer","getPlayerMarkerSet","updateFromPlayerData","getPlayerMarker","setAutoUpdateInterval","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","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","body","requestFullscreen","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","setLocalStorage","localStorage","setItem","JSON","stringify","getLocalStorage","getItem","precision","f","BlueMapApp","followPlayerMarkerWorld","updateLoop","hashUpdateTimeout","updatePageAddress","lastCameraMove","timeSinceLastMove","timeToWait","sleep","history","replaceState","location","startLocation","split","getWorldPosition","startDistance","targetDistance","startX","targetX","startZ","targetZ","viewAnimation","ep","download","href","toDataURL","toBlob","blob","navigator","write","ClipboardItem","mapControls","playerMarkerManager","markerFileManager","savedUserSettings","mapsMap","mainMenu","enableFreeFlight","initGeneralEvents","popupMarkerSet","popupMarker","oldMaps","getSettings","minZoomDistance","maxZoomDistance","loadMaps","loadPageAddress","cameraMoved","mapInteraction","loadUserSettings","player","findPlayerMap","followPlayerMarker","loadPlayerData","initPlayerMarkerManager","initMarkerFileManager","BlueMapMap","map1","map2","fileData","mouseInvert","fullscreen","transition","startY","targetY","startAngle","targetAngle","startOrtho","startTilt","startRotation","clearTileCache","saveUserSetting","reload","resolutionDefault","hiresSliderDefault","lowresSliderDefault","useCookies","loadUserSetting","setScreenshotClipboard","setDebug","defaultValue","String","includesCI","toLowerCase","bluemap","getElementById","config","productionTip","vue","h","App","$mount","$nextTick"],"mappings":"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","file":"js/app.d1a062f7.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--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SideMenu.vue?vue&type=style&index=0&lang=scss&\"","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', 'theme-contrast': _vm.appState.theme === 'contrast'},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 }","\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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","\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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 }","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport {MathUtils, Vector2, Vector3} from \"three\";\r\n\r\nexport const VEC2_ZERO = new Vector2(0, 0);\r\nexport const VEC3_ZERO = new Vector3(0, 0, 0);\r\nexport const VEC3_X = new Vector3(1, 0, 0);\r\nexport const VEC3_Y = new Vector3(0, 1, 0);\r\nexport const VEC3_Z = new Vector3(0, 0, 1);\r\n\r\n/**\r\n * Converts a url-encoded image string to an actual image-element\r\n * @param string {string}\r\n * @returns {HTMLElement}\r\n */\r\nexport const stringToImage = string => {\r\n let image = document.createElementNS('http://www.w3.org/1999/xhtml', 'img');\r\n image.src = string;\r\n return image;\r\n};\r\n\r\n/**\r\n * Creates an optimized path from x,z coordinates used by bluemap to save tiles\r\n * @param x {number}\r\n * @param z {number}\r\n * @returns {string}\r\n */\r\nexport const pathFromCoords = (x, z) => {\r\n let path = 'x';\r\n path += splitNumberToPath(x);\r\n\r\n path += 'z';\r\n path += splitNumberToPath(z);\r\n\r\n path = path.substring(0, path.length - 1);\r\n\r\n return path;\r\n};\r\n\r\n/**\r\n * Splits a number into an optimized folder-path used to save bluemap-tiles\r\n * @param num {number}\r\n * @returns {string}\r\n */\r\nconst splitNumberToPath = num => {\r\n let path = '';\r\n\r\n if (num < 0) {\r\n num = -num;\r\n path += '-';\r\n }\r\n\r\n let s = num.toString();\r\n\r\n for (let i = 0; i < s.length; i++) {\r\n path += s.charAt(i) + '/';\r\n }\r\n\r\n return path;\r\n};\r\n\r\n/**\r\n * Hashes tile-coordinates to be saved in a map\r\n * @param x {number}\r\n * @param z {number}\r\n * @returns {string}\r\n */\r\nexport const hashTile = (x, z) => `x${x}z${z}`;\r\n\r\nexport const generateCacheHash = () => {\r\n return Math.round(Math.random() * 1000000);\r\n}\r\n\r\n/**\r\n * Dispatches an event to the element of this map-viewer\r\n * @param element {EventTarget} the element on that the event is dispatched\r\n * @param event {string}\r\n * @param detail {object}\r\n * @returns {undefined|void|boolean}\r\n */\r\nexport const dispatchEvent = (element, event, detail = {}) => {\r\n if (!element || !element.dispatchEvent) return;\r\n\r\n return element.dispatchEvent(new CustomEvent(event, {\r\n detail: detail\r\n }));\r\n}\r\n\r\n/**\r\n * Sends a \"bluemapAlert\" event with a message and a level.\r\n * The level can be anything, but the app uses the levels\r\n * - debug\r\n * - fine\r\n * - info\r\n * - warning\r\n * - error\r\n * @param element {EventTarget} the element on that the event is dispatched\r\n * @param message {object}\r\n * @param level {string}\r\n */\r\nexport const alert = (element, message, level = \"info\") => {\r\n\r\n // alert event\r\n let printToConsole = dispatchEvent(element, \"bluemapAlert\", {\r\n message: message,\r\n level: level\r\n });\r\n\r\n // log alert to console\r\n if (printToConsole !== false) {\r\n if (level === \"info\") {\r\n console.log(`[BlueMap/${level}]`, message);\r\n } else if (level === \"warning\") {\r\n console.warn(`[BlueMap/${level}]`, message);\r\n } else if (level === \"error\") {\r\n console.error(`[BlueMap/${level}]`, message);\r\n } else {\r\n console.debug(`[BlueMap/${level}]`, message);\r\n }\r\n }\r\n}\r\n\r\n/**\r\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\r\n *\r\n * @param html {string} representing a single element\r\n * @return {Element}\r\n */\r\nexport const htmlToElement = html => {\r\n let template = document.createElement('template');\r\n template.innerHTML = html.trim();\r\n return template.content.firstChild;\r\n}\r\n\r\n/**\r\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\r\n *\r\n * @param html {string} representing any number of sibling elements\r\n * @return {NodeList}\r\n */\r\nexport const htmlToElements = html => {\r\n let template = document.createElement('template');\r\n template.innerHTML = html;\r\n return template.content.childNodes;\r\n}\r\n\r\n/**\r\n * Schedules an animation\r\n * @param durationMs {number} the duration of the animation in ms\r\n * @param animationFrame {function(progress: number, deltaTime: number)} a function that is getting called each frame with the parameters (progress (0-1), deltaTime)\r\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)\r\n * @returns {{cancel: function()}} the animation object\r\n */\r\nexport const animate = function (animationFrame, durationMs = 1000, postAnimation = null) {\r\n let animation = {\r\n animationStart: -1,\r\n lastFrame: -1,\r\n cancelled: false,\r\n\r\n frame: function (time) {\r\n if (this.cancelled) return;\r\n\r\n if (this.animationStart === -1) {\r\n this.animationStart = time;\r\n this.lastFrame = time;\r\n }\r\n\r\n let progress = durationMs === 0 ? 1 : MathUtils.clamp((time - this.animationStart) / durationMs, 0, 1);\r\n let deltaTime = time - this.lastFrame;\r\n\r\n animationFrame(progress, deltaTime);\r\n\r\n if (progress < 1) window.requestAnimationFrame(time => this.frame(time));\r\n else if (postAnimation) postAnimation(true);\r\n\r\n this.lastFrame = time;\r\n },\r\n\r\n cancel: function () {\r\n this.cancelled = true;\r\n if (postAnimation) postAnimation(false);\r\n }\r\n };\r\n\r\n window.requestAnimationFrame(time => animation.frame(time));\r\n\r\n return animation;\r\n}\r\n\r\n/**\r\n * Source: https://gist.github.com/gre/1650294\r\n * @type {{\r\n * easeOutCubic: (function(number): number),\r\n * linear: (function(number): number),\r\n * easeOutQuint: (function(number): number),\r\n * easeInQuart: (function(number): number),\r\n * easeInOutQuint: (function(number): number),\r\n * easeInQuad: (function(number): number),\r\n * easeOutQuart: (function(number): number),\r\n * easeInCubic: (function(number): number),\r\n * easeInQuint: (function(number): number),\r\n * easeOutQuad: (function(number): number),\r\n * easeInOutQuad: (function(number): number),\r\n * easeInOutCubic: (function(number): number),\r\n * easeInOutQuart: (function(number): number)\r\n * }}\r\n */\r\nexport const EasingFunctions = {\r\n // no easing, no acceleration\r\n linear: t => t,\r\n // accelerating from zero velocity\r\n easeInQuad: t => t*t,\r\n // decelerating to zero velocity\r\n easeOutQuad: t => t*(2-t),\r\n // acceleration until halfway, then deceleration\r\n easeInOutQuad: t => t<.5 ? 2*t*t : -1+(4-2*t)*t,\r\n // accelerating from zero velocity\r\n easeInCubic: t => t*t*t,\r\n // decelerating to zero velocity\r\n easeOutCubic: t => (--t)*t*t+1,\r\n // acceleration until halfway, then deceleration\r\n easeInOutCubic: t => t<.5 ? 4*t*t*t : (t-1)*(2*t-2)*(2*t-2)+1,\r\n // accelerating from zero velocity\r\n easeInQuart: t => t*t*t*t,\r\n // decelerating to zero velocity\r\n easeOutQuart: t => 1-(--t)*t*t*t,\r\n // acceleration until halfway, then deceleration\r\n easeInOutQuart: t => t<.5 ? 8*t*t*t*t : 1-8*(--t)*t*t*t,\r\n // accelerating from zero velocity\r\n easeInQuint: t => t*t*t*t*t,\r\n // decelerating to zero velocity\r\n easeOutQuint: t => 1+(--t)*t*t*t*t,\r\n // acceleration until halfway, then deceleration\r\n easeInOutQuint: t => t<.5 ? 16*t*t*t*t*t : 1+16*(--t)*t*t*t*t\r\n}\r\n\r\n/**\r\n * Returns the offset position of an element\r\n *\r\n * Source: https://plainjs.com/javascript/styles/get-the-position-of-an-element-relative-to-the-document-24/\r\n *\r\n * @param element {Element}\r\n * @returns {{top: number, left: number}}\r\n */\r\nexport const elementOffset = element => {\r\n let rect = element.getBoundingClientRect(),\r\n scrollLeft = window.pageXOffset || document.documentElement.scrollLeft,\r\n scrollTop = window.pageYOffset || document.documentElement.scrollTop;\r\n return { top: rect.top + scrollTop, left: rect.left + scrollLeft }\r\n}\r\n\r\n/**\r\n * Very simple deep equals, should not be used for complex objects. Is designed for comparing parsed json-objects.\r\n * @param object1 {object}\r\n * @param object2 {object}\r\n * @returns {boolean}\r\n */\r\nexport const deepEquals = (object1, object2) => {\r\n if (Object.is(object1, object2)) return true;\r\n\r\n let type = typeof object1;\r\n if (type !== typeof object2) return false;\r\n\r\n if (type === 'number' || type === 'boolean' || type === 'string') return false;\r\n\r\n if (Array.isArray(object1)){\r\n let len = object1.length;\r\n if (len !== object2.length) return false;\r\n for (let i = 0; i < len; i++) {\r\n if (!deepEquals(object1[i], object2[i])) return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n for (let property in object1) {\r\n if (!object1.hasOwnProperty(property)) continue;\r\n if (!deepEquals(object1[property], object2[property])) return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Adds one listener to multiple events\r\n * @param target {EventTarget}\r\n * @param types {string|string[]}\r\n * @param listener {EventListenerOrEventListenerObject | null}\r\n * @param options {boolean | AddEventListenerOptions?}\r\n */\r\nexport const addEventListeners = (target, types, listener, options) => {\r\n if (!Array.isArray(types)){\r\n types = types.trim().split(\" \");\r\n }\r\n\r\n types.forEach(type => target.addEventListener(type, listener, options));\r\n}\r\n\r\n/**\r\n * Removes one listener to multiple events\r\n * @param target {EventTarget}\r\n * @param types {string|string[]}\r\n * @param listener {EventListenerOrEventListenerObject | null}\r\n * @param options {boolean | EventListenerOptions?}\r\n */\r\nexport const removeEventListeners = (target, types, listener, options) => {\r\n if (!Array.isArray(types)){\r\n types = types.trim().split(\" \");\r\n }\r\n\r\n types.forEach(type => target.removeEventListener(type, listener, options));\r\n}\r\n\r\n/**\r\n * Softly clamps towards a minimum value\r\n * @param value {number}\r\n * @param min {number}\r\n * @param stiffness {number}\r\n * @returns {number}\r\n */\r\nexport const softMin = (value, min, stiffness) => {\r\n if (value >= min) return value;\r\n let delta = min - value;\r\n if (delta < 0.0001) return min;\r\n return value + delta * stiffness;\r\n}\r\n\r\n/**\r\n * Softly clamps towards a maximum value\r\n * @param value {number}\r\n * @param max {number}\r\n * @param stiffness {number}\r\n * @returns {number}\r\n */\r\nexport const softMax = (value, max, stiffness) => {\r\n if (value <= max) return value;\r\n let delta = value - max;\r\n if (delta < 0.0001) return max;\r\n return value - delta * stiffness;\r\n}\r\n\r\n/**\r\n * Softly clamps towards a minimum and maximum value\r\n * @param value {number}\r\n * @param min {number}\r\n * @param max {number}\r\n * @param stiffness {number}\r\n * @returns {number}\r\n */\r\nexport const softClamp = (value, min, max, stiffness) => {\r\n return softMax(softMin(value, min, stiffness), max, stiffness);\r\n}\r\n\r\nexport const vecArrToObj = (val, useZ = false) => {\r\n if (val && val.length >= 2) {\r\n if (useZ) return {x: val[0], z: val[1]};\r\n return {x: val[0], y: val[1]};\r\n }\r\n return {};\r\n}\r\n\r\nconst pixel = document.createElement('canvas');\r\npixel.width = 1;\r\npixel.height = 1;\r\nconst pixelContext = pixel.getContext('2d', {\r\n willReadFrequently: true\r\n});\r\n\r\nexport const getPixel = (img, x, y) => {\r\n pixelContext.drawImage(img, Math.floor(x), Math.floor(y), 1, 1, 0, 0, 1, 1);\r\n return pixelContext.getImageData(0, 0, 1, 1).data;\r\n}\r\n","\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\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 }","\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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=b5204e98&\"\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--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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\"}})])]),(_vm.controls.enableFreeFlight)?_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\"}})])]):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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=76711d43&\"\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 }","\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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","\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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',{on:{\"action\":function($event){return _vm.$bluemap.takeScreenshot()}}},[_vm._v(_vm._s(_vm.$t(\"screenshot.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', {\n version: _vm.$bluemap.settings.version\n }))}}):_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 }","\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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=aa1fb0b2&\"\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\\r\\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\\r\\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 }","\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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=500e3b38&\"\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\":_vm.settings.hiresSliderMin,\"max\":_vm.settings.hiresSliderMax,\"step\":10,\"formatter\":_vm.renderDistanceFormatter},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\":_vm.settings.lowresSliderMin,\"max\":_vm.settings.lowresSliderMax,\"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\")))]),_c('SwitchButton',{attrs:{\"on\":!_vm.appState.controls.pauseTileLoading},on:{\"action\":function($event){_vm.appState.controls.pauseTileLoading = !_vm.appState.controls.pauseTileLoading; _vm.$bluemap.saveUserSettings()}}},[_vm._v(_vm._s(_vm.$t(\"renderDistance.loadHiresWhileMoving\")))])],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),_c('Group',{attrs:{\"title\":_vm.$t('screenshot.title')}},[_c('SwitchButton',{attrs:{\"on\":_vm.appState.screenshot.clipboard},on:{\"action\":function($event){_vm.appState.screenshot.clipboard = !_vm.appState.screenshot.clipboard; _vm.$bluemap.saveUserSettings()}}},[_vm._v(_vm._s(_vm.$t(\"screenshot.clipboard\")))])],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 }","\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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=7490aab8&\"\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.formatter(_vm.value)))])],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 }","\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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=3f547a48&\"\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 }","\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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=3812a029&\"\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","\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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=618b8d4f&\"\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 {\r\n\tpageTitle: \"BlueMap - {map}\",\r\n\tmenu: {\r\n\t\ttitle: \"Menu\",\r\n\t\ttooltip: \"Menu\"\r\n\t},\r\n\tmaps: {\r\n\t\ttitle: \"Maps\",\r\n\t\tbutton: \"Maps\",\r\n\t\ttooltip: \"Map-List\"\r\n\t},\r\n\tmarkers: {\r\n\t\ttitle: \"Markers\",\r\n\t\tbutton: \"Markers\",\r\n\t\ttooltip: \"Marker-List\",\r\n\t\tmarker: \"marker | markers\",\r\n\t\tmarkerSet: \"marker-set | marker-sets\",\r\n\t\tsearchPlaceholder: \"Search...\",\r\n\t\tfollowPlayerTitle: \"Follow Player\"\r\n\t},\r\n\tsettings: {\r\n\t\ttitle: \"Settings\",\r\n\t\tbutton: \"Settings\"\r\n\t},\r\n\tgoFullscreen: {\r\n\t\tbutton: \"Go Fullscreen\"\r\n\t},\r\n\tresetCamera: {\r\n\t\tbutton: \"Reset Camera\",\r\n\t\ttooltip: \"Reset Camera & Position\"\r\n\t},\r\n\tupdateMap: {\r\n\t\tbutton: \"Update Map\",\r\n\t\ttooltip: \"Clear Tile Cache\"\r\n\t},\r\n\tlighting: {\r\n\t\ttitle: \"Lighting\",\r\n\t\tdayNightSwitch: {\r\n\t\t\ttooltip: \"Day/Night\"\r\n\t\t},\r\n\t\tsunlight: \"Sunlight\",\r\n\t\tambientLight: \"Ambient-Light\"\r\n\t},\r\n\tresolution: {\r\n\t\ttitle: \"Resolution\",\r\n\t\thigh: \"High (SSAA, x2)\",\r\n\t\tnormal: \"Normal (Native, x1)\",\r\n\t\tlow: \"Low (Upscaling, x0.5)\"\r\n\t},\r\n\tfreeFlightControls: {\r\n\t\ttitle: \"Free-Flight Controls\",\r\n\t\tmouseSensitivity: \"Mouse-Sensitivity\",\r\n\t\tinvertMouseY: \"Invert Mouse Y\"\r\n\t},\r\n\trenderDistance: {\r\n\t\ttitle: \"Render Distance\",\r\n\t\thiresLayer: \"Hires layer\",\r\n\t\tlowersLayer: \"Lowres layer\",\r\n\t\tloadHiresWhileMoving: \"Load hires-tiles while moving\",\r\n\t\toff: \"Off\"\r\n\t},\r\n\ttheme: {\r\n\t\ttitle: \"Theme\",\r\n\t\tdefault: \"Default (System/Browser)\",\r\n\t\tdark: \"Dark\",\r\n\t\tlight: \"Light\",\r\n\t\tcontrast: \"Contrast\"\r\n\t},\r\n\tdebug: {\r\n\t\tbutton: \"Debug\"\r\n\t},\r\n\tresetAllSettings: {\r\n\t\tbutton: \"Reset All Settings\"\r\n\t},\r\n\tplayers: {\r\n\t\ttitle: \"Players\",\r\n\t\ttooltip: \"Player-List\"\r\n\t},\r\n\tcompass: {\r\n\t\ttooltip: \"Compass / Face North\"\r\n\t},\r\n\tscreenshot: {\r\n\t\ttitle: \"Screenshot\",\r\n\t\tbutton: \"Take Screenshot\",\r\n clipboard: \"Copy to Clipboard\"\r\n\t},\r\n\tcontrols: {\r\n\t\ttitle: \"View / Controls\",\r\n\t\tperspective: {\r\n\t\t\tbutton: \"Perspective\",\r\n\t\t\ttooltip: \"Perspective-View\"\r\n\t\t},\r\n\t\tflatView: {\r\n\t\t\tbutton: \"Flat\",\r\n\t\t\ttooltip: \"Orthographic / Flat-View\",\r\n\t\t},\r\n\t\tfreeFlight: {\r\n\t\t\tbutton: \"Free-Flight\",\r\n\t\t\ttooltip: \"Free-Flight / Spectator Mode\"\r\n\t\t}\r\n\t},\r\n\tlanguage: {\r\n\t\ttitle: \"Language\",\r\n\t},\r\n\tblockTooltip: {\r\n\t\tblock: \"Block\",\r\n\t\tposition: \"Position\",\r\n\t\tchunk: \"Chunk\",\r\n\t\tregion: {\r\n\t\t\tregion: \"Region\",\r\n\t\t\tfile: \"File\"\r\n\t\t},\r\n\t\tlight: {\r\n\t\t\tlight: \"Light\",\r\n\t\t\tsun: \"Sun\",\r\n\t\t\tblock: \"Block\",\r\n\t\t}\r\n\t},\r\n\tinfo: {\r\n\t\ttitle: \"Info\",\r\n\t\tbutton: \"Info\",\r\n\t\tcontent: `\r\n\r\n

\r\n\t

Mouse-Controls:

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

\r\n

\r\n\t

Keyboard-Controls:

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

\r\n

\r\n\t

Touch-Controls:

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

\r\n

\r\n

\r\n\tThis map has been generated with ♥ using BlueMap {version}\r\n

\r\n\t\t`\r\n\t}\r\n};\r\n","import VueI18n from 'vue-i18n';\r\nimport Vue from 'vue';\r\nimport fallback from './fallback';\r\n\r\nVueI18n.prototype.setLanguage = async function(lang) {\r\n\ttry {\r\n\t\tif (!this.messages[lang]){\r\n\t\t\tlet messages = {};\r\n\t\t\tmessages = (await import(/* webpackIgnore: true */ `../lang/${lang}.js`)).default;\r\n\r\n\t\t\tthis.setLocaleMessage(lang, messages);\r\n\t\t}\r\n\r\n\t\tthis.locale = lang;\r\n\t\tdocument.querySelector('html').setAttribute('lang', lang);\r\n\t} catch (e) {\r\n\t\tconsole.error(`Failed to load language '${lang}'!`, e);\r\n\t}\r\n}\r\n\r\nVueI18n.prototype.loadLanguageSettings = async function() {\r\n\tlet settings = (await import(/* webpackIgnore: true */ \"../lang/settings.js\")).default;\r\n\tthis.languages = settings.languages;\r\n\tthis.setLanguage(settings.default);\r\n};\r\n\r\nVue.use(VueI18n);\r\n\r\nconst i18n = new VueI18n({\r\n\tlocale: 'fallback',\r\n\tfallbackLocale: 'fallback',\r\n\tsilentFallbackWarn: true,\r\n\tmessages: { fallback }\r\n});\r\n\r\nexport default i18n;\r\n","\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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=f1a78d74&\"\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","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport i18n from \"../i18n\";\r\n\r\nexport class MainMenu {\r\n\r\n static NULL_PAGE = {\r\n id: \"-\",\r\n title: \"-\"\r\n }\r\n\r\n constructor() {\r\n this.isOpen = false;\r\n this.pageStack = [];\r\n }\r\n\r\n currentPage() {\r\n if (this.pageStack.length === 0) return MainMenu.NULL_PAGE;\r\n return this.pageStack[this.pageStack.length - 1];\r\n }\r\n\r\n openPage(id = \"root\", title = () => i18n.t(\"menu.title\"), data = {}) {\r\n if (!this.isOpen){\r\n this.pageStack.splice(0, this.pageStack.length);\r\n this.isOpen = true;\r\n }\r\n\r\n if (typeof title === \"function\"){\r\n this.pageStack.push({\r\n id: id,\r\n get title(){ return title() },\r\n ...data\r\n });\r\n } else {\r\n this.pageStack.push({\r\n id: id,\r\n title: title,\r\n ...data\r\n });\r\n }\r\n\r\n }\r\n\r\n closePage() {\r\n this.pageStack.splice(this.pageStack.length - 1, 1);\r\n\r\n if (this.pageStack.length < 1) {\r\n this.isOpen = false\r\n }\r\n }\r\n\r\n reOpenPage() {\r\n if (this.pageStack.length === 0){\r\n this.openPage();\r\n } else if (this.pageStack[0].id !== 'root') {\r\n this.pageStack.splice(0, this.pageStack.length);\r\n this.openPage();\r\n } else {\r\n this.isOpen = true;\r\n }\r\n }\r\n\r\n closeAll() {\r\n this.isOpen = false;\r\n }\r\n\r\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\":_vm.$t('markers.searchPlaceholder')},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\":_vm.$t('markers.followPlayerTitle')},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 }","\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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=ea7ab79a&\"\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 }","\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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=13c3caa0&\"\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 }","\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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=3cd5339e&\"\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","\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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=21f0c4c5&\"\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 }","\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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=17174b7f&\"\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","\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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=7818903c&\"\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 }","\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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","\r\n\r\n\r\n\r\n\r\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--13-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--1-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--13-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--1-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=e84f4214&\"\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","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nexport class Tile {\r\n\r\n /**\r\n * @param x {number}\r\n * @param z {number}\r\n * @param onLoad {function(Tile)}\r\n * @param onUnload {function(Tile)}\r\n */\r\n constructor(x, z, onLoad, onUnload) {\r\n Object.defineProperty( this, 'isTile', { value: true } );\r\n\r\n /** @type {THREE.Mesh} */\r\n this.model = null;\r\n\r\n this.onLoad = onLoad;\r\n this.onUnload = onUnload;\r\n\r\n this.x = x;\r\n this.z = z;\r\n\r\n this.unloaded = true;\r\n this.loading = false;\r\n }\r\n\r\n /**\r\n * @param tileLoader {TileLoader}\r\n * @returns {Promise}\r\n */\r\n load(tileLoader) {\r\n if (this.loading) return Promise.reject(\"tile is already loading!\");\r\n this.loading = true;\r\n\r\n this.unload();\r\n\r\n this.unloaded = false;\r\n return tileLoader.load(this.x, this.z, () => this.unloaded)\r\n .then(model => {\r\n if (this.unloaded){\r\n Tile.disposeModel(model);\r\n return;\r\n }\r\n\r\n this.model = model;\r\n this.onLoad(this);\r\n })\r\n .finally(() => {\r\n this.loading = false;\r\n });\r\n }\r\n\r\n unload() {\r\n this.unloaded = true;\r\n if (this.model) {\r\n this.onUnload(this);\r\n\r\n Tile.disposeModel(this.model);\r\n\r\n this.model = null;\r\n }\r\n }\r\n\r\n static disposeModel(model) {\r\n if (model.userData?.tileType === \"hires\") {\r\n model.geometry.dispose();\r\n }\r\n\r\n else if (model.userData?.tileType === \"lowres\") {\r\n model.material.uniforms.textureImage.value.dispose();\r\n model.material.dispose();\r\n }\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n get loaded() {\r\n return !!this.model;\r\n }\r\n}\r\n","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport {ClampToEdgeWrapping, LinearFilter, NearestFilter, Texture} from \"three\";\r\n\r\nexport class TileMap {\r\n\r\n static EMPTY = \"#000\";\r\n static LOADED = \"#fff\";\r\n\r\n /**\r\n * @param width {number}\r\n * @param height {number}\r\n */\r\n constructor(width, height) {\r\n this.canvas = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas');\r\n this.canvas.width = width;\r\n this.canvas.height = height;\r\n\r\n /**\r\n * @type CanvasRenderingContext2D\r\n */\r\n this.tileMapContext = this.canvas.getContext('2d', {\r\n alpha: false,\r\n willReadFrequently: true,\r\n });\r\n\r\n this.texture = new Texture(this.canvas);\r\n this.texture.generateMipmaps = false;\r\n this.texture.magFilter = LinearFilter;\r\n this.texture.minFilter = LinearFilter;\r\n this.texture.wrapS = ClampToEdgeWrapping;\r\n this.texture.wrapT = ClampToEdgeWrapping;\r\n this.texture.flipY = false;\r\n this.texture.needsUpdate = true;\r\n }\r\n\r\n /**\r\n * @param state {string}\r\n */\r\n setAll(state) {\r\n this.tileMapContext.fillStyle = state;\r\n this.tileMapContext.fillRect(0, 0, this.canvas.width, this.canvas.height);\r\n\r\n this.texture.needsUpdate = true;\r\n }\r\n\r\n /**\r\n * @param x {number}\r\n * @param z {number}\r\n * @param state {string}\r\n */\r\n setTile(x, z, state) {\r\n this.tileMapContext.fillStyle = state;\r\n this.tileMapContext.fillRect(x, z, 1, 1);\r\n\r\n this.texture.needsUpdate = true;\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport { Vector2, Scene, Group } from 'three';\r\nimport { Tile } from './Tile.js';\r\nimport {alert, hashTile} from '../util/Utils.js';\r\nimport {TileMap} from \"./TileMap\";\r\n\r\nexport class TileManager {\r\n\r\n static tileMapSize = 100;\r\n static tileMapHalfSize = TileManager.tileMapSize / 2;\r\n\r\n /**\r\n * @param tileLoader {TileLoader | LowresTileLoader}\r\n * @param onTileLoad {function(Tile)}\r\n * @param onTileUnload {function(Tile)}\r\n * @param events {EventTarget}\r\n */\r\n constructor(tileLoader, onTileLoad = null, onTileUnload = null, events = null) {\r\n Object.defineProperty( this, 'isTileManager', { value: true } );\r\n\r\n this.sceneParent = new Scene();\r\n this.scene = new Group();\r\n this.sceneParent.add(this.scene);\r\n\r\n this.events = events;\r\n this.tileLoader = tileLoader;\r\n\r\n this.onTileLoad = onTileLoad || function(){};\r\n this.onTileUnload = onTileUnload || function(){};\r\n\r\n this.viewDistanceX = 1;\r\n this.viewDistanceZ = 1;\r\n this.centerTile = new Vector2(0, 0);\r\n\r\n this.currentlyLoading = 0;\r\n this.loadTimeout = null;\r\n\r\n //map of loaded tiles\r\n this.tiles = new Map();\r\n\r\n // a canvas that keeps track of the loaded tiles, used for shaders\r\n this.tileMap = new TileMap(TileManager.tileMapSize, TileManager.tileMapSize);\r\n\r\n this.unloaded = true;\r\n }\r\n\r\n /**\r\n * @param x {number}\r\n * @param z {number}\r\n * @param viewDistanceX {number}\r\n * @param viewDistanceZ {number}\r\n */\r\n loadAroundTile(x, z, viewDistanceX, viewDistanceZ) {\r\n this.unloaded = false;\r\n\r\n let unloadTiles = false;\r\n if (this.viewDistanceX > viewDistanceX || this.viewDistanceZ > viewDistanceZ) {\r\n unloadTiles = true;\r\n }\r\n\r\n this.viewDistanceX = viewDistanceX;\r\n this.viewDistanceZ = viewDistanceZ;\r\n\r\n if (viewDistanceX <= 0 || viewDistanceZ <= 0) {\r\n this.removeAllTiles();\r\n return;\r\n }\r\n\r\n if (unloadTiles || this.centerTile.x !== x || this.centerTile.y !== z) {\r\n this.centerTile.set(x, z);\r\n this.removeFarTiles();\r\n\r\n this.tileMap.setAll(TileMap.EMPTY);\r\n this.tiles.forEach(tile => {\r\n if (!tile.loading && !tile.unloaded) {\r\n this.tileMap.setTile(tile.x - this.centerTile.x + TileManager.tileMapHalfSize, tile.z - this.centerTile.y + TileManager.tileMapHalfSize, TileMap.LOADED);\r\n }\r\n });\r\n }\r\n\r\n this.loadCloseTiles();\r\n }\r\n\r\n unload() {\r\n this.unloaded = true;\r\n this.removeAllTiles();\r\n }\r\n\r\n removeFarTiles() {\r\n this.tiles.forEach((tile, hash, map) => {\r\n if (\r\n tile.x + this.viewDistanceX < this.centerTile.x ||\r\n tile.x - this.viewDistanceX > this.centerTile.x ||\r\n tile.z + this.viewDistanceZ < this.centerTile.y ||\r\n tile.z - this.viewDistanceZ > this.centerTile.y\r\n ) {\r\n tile.unload();\r\n map.delete(hash);\r\n }\r\n });\r\n }\r\n\r\n removeAllTiles() {\r\n this.tileMap.setAll(TileMap.EMPTY);\r\n\r\n this.tiles.forEach(tile => {\r\n tile.unload();\r\n });\r\n this.tiles.clear();\r\n }\r\n\r\n loadCloseTiles = () => {\r\n if (this.unloaded) return;\r\n if (!this.loadNextTile()) return;\r\n\r\n if (this.loadTimeout) clearTimeout(this.loadTimeout);\r\n\r\n if (this.currentlyLoading < 8) {\r\n this.loadTimeout = setTimeout(this.loadCloseTiles, 0);\r\n } else {\r\n this.loadTimeout = setTimeout(this.loadCloseTiles, 1000);\r\n }\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n loadNextTile() {\r\n if (this.unloaded) return false;\r\n\r\n let x = 0;\r\n let z = 0;\r\n let d = 1;\r\n let m = 1;\r\n\r\n while (m < Math.max(this.viewDistanceX, this.viewDistanceZ) * 2 + 1) {\r\n while (2 * x * d < m) {\r\n if (this.tryLoadTile(this.centerTile.x + x, this.centerTile.y + z)) return true;\r\n x = x + d;\r\n }\r\n while (2 * z * d < m) {\r\n if (this.tryLoadTile(this.centerTile.x + x, this.centerTile.y + z)) return true;\r\n z = z + d;\r\n }\r\n d = -1 * d;\r\n m = m + 1;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * @param x {number}\r\n * @param z {number}\r\n * @returns {boolean}\r\n */\r\n tryLoadTile(x, z) {\r\n if (this.unloaded) return false;\r\n\r\n if (Math.abs(x - this.centerTile.x) > this.viewDistanceX) return false;\r\n if (Math.abs(z - this.centerTile.y) > this.viewDistanceZ) return false;\r\n\r\n let tileHash = hashTile(x, z);\r\n\r\n let tile = this.tiles.get(tileHash);\r\n if (tile !== undefined) return false;\r\n\r\n this.currentlyLoading++;\r\n\r\n tile = new Tile(x, z, this.handleLoadedTile, this.handleUnloadedTile);\r\n this.tiles.set(tileHash, tile);\r\n tile.load(this.tileLoader)\r\n .then(() => {\r\n if (this.loadTimeout) clearTimeout(this.loadTimeout);\r\n this.loadTimeout = setTimeout(this.loadCloseTiles, 0);\r\n })\r\n .catch(error => {})\r\n .finally(() => {\r\n this.currentlyLoading--;\r\n });\r\n\r\n return true;\r\n }\r\n\r\n handleLoadedTile = tile => {\r\n this.tileMap.setTile(tile.x - this.centerTile.x + TileManager.tileMapHalfSize, tile.z - this.centerTile.y + TileManager.tileMapHalfSize, TileMap.LOADED);\r\n\r\n this.scene.add(tile.model);\r\n this.onTileLoad(tile);\r\n }\r\n\r\n handleUnloadedTile = tile => {\r\n this.tileMap.setTile(tile.x - this.centerTile.x + TileManager.tileMapHalfSize, tile.z - this.centerTile.y + TileManager.tileMapHalfSize, TileMap.EMPTY);\r\n\r\n this.scene.remove(tile.model);\r\n this.onTileUnload(tile);\r\n }\r\n}\r\n","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport {pathFromCoords} from \"../util/Utils\";\r\nimport {BufferGeometryLoader, FileLoader, Mesh} from \"three\";\r\n\r\nexport class TileLoader {\r\n\r\n /**\r\n * @param tilePath {string}\r\n * @param material {THREE.Material | THREE.Material[]}\r\n * @param tileSettings {{\r\n * tileSize: {x: number, z: number},\r\n *\t scale: {x: number, z: number},\r\n * translate: {x: number, z: number}\r\n * }}\r\n * @param loadBlocker {function: Promise}\r\n * @param tileCacheHash {number}\r\n */\r\n constructor(tilePath, material, tileSettings, loadBlocker = () => Promise.resolve(), tileCacheHash = 0) {\r\n Object.defineProperty( this, 'isTileLoader', { value: true } );\r\n\r\n this.tilePath = tilePath;\r\n this.material = material;\r\n this.tileSettings = tileSettings;\r\n\r\n this.tileCacheHash = tileCacheHash;\r\n\r\n this.loadBlocker = loadBlocker;\r\n\r\n this.fileLoader = new FileLoader();\r\n this.fileLoader.setResponseType('json');\r\n\r\n this.bufferGeometryLoader = new BufferGeometryLoader();\r\n }\r\n\r\n load = (tileX, tileZ, cancelCheck = () => false) => {\r\n let tileUrl = this.tilePath + pathFromCoords(tileX, tileZ) + '.json';\r\n\r\n //await this.loadBlocker();\r\n return new Promise((resolve, reject) => {\r\n this.fileLoader.load(tileUrl + '?' + this.tileCacheHash,\r\n async json => {\r\n let geometryJson = json.tileGeometry || {};\r\n if (!geometryJson.type || geometryJson.type !== 'BufferGeometry'){\r\n reject({status: \"empty\"});\r\n return;\r\n }\r\n\r\n await this.loadBlocker();\r\n if (cancelCheck()){\r\n reject({status: \"cancelled\"});\r\n return;\r\n }\r\n\r\n let geometry = this.bufferGeometryLoader.parse(geometryJson);\r\n\r\n let object = new Mesh(geometry, this.material);\r\n\r\n let tileSize = this.tileSettings.tileSize;\r\n let translate = this.tileSettings.translate;\r\n let scale = this.tileSettings.scale;\r\n object.position.set(tileX * tileSize.x + translate.x, 0, tileZ * tileSize.z + translate.z);\r\n object.scale.set(scale.x, 1, scale.z);\r\n\r\n object.userData.tileUrl = tileUrl;\r\n object.userData.tileType = \"hires\";\r\n\r\n object.updateMatrixWorld(true);\r\n\r\n resolve(object);\r\n },\r\n () => {},\r\n reject\r\n );\r\n });\r\n }\r\n\r\n}\r\n","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport {pathFromCoords} from \"../util/Utils\";\r\nimport {\r\n TextureLoader,\r\n Mesh,\r\n PlaneBufferGeometry,\r\n VertexColors,\r\n FrontSide,\r\n ShaderMaterial,\r\n NearestFilter,\r\n ClampToEdgeWrapping,\r\n NearestMipMapLinearFilter,\r\n Vector2\r\n} from \"three\";\r\n\r\nexport class LowresTileLoader {\r\n\r\n constructor(tilePath, tileSettings, lod, vertexShader, fragmentShader, uniforms, loadBlocker = () => Promise.resolve(), tileCacheHash = 0) {\r\n Object.defineProperty( this, 'isLowresTileLoader', { value: true } );\r\n\r\n this.tilePath = tilePath;\r\n this.tileSettings = tileSettings;\r\n this.lod = lod;\r\n this.loadBlocker = loadBlocker;\r\n this.tileCacheHash = tileCacheHash;\r\n\r\n this.vertexShader = vertexShader;\r\n this.fragmentShader = fragmentShader;\r\n this.uniforms = uniforms;\r\n\r\n this.textureLoader = new TextureLoader();\r\n this.geometry = new PlaneBufferGeometry(\r\n tileSettings.tileSize.x + 1, tileSettings.tileSize.z + 1,\r\n Math.ceil(100 / (lod * 2)), Math.ceil(100 / (lod * 2))\r\n );\r\n this.geometry.deleteAttribute('normal');\r\n this.geometry.deleteAttribute('uv');\r\n this.geometry.rotateX(-Math.PI / 2);\r\n this.geometry.translate(tileSettings.tileSize.x / 2 + 1, 0, tileSettings.tileSize.x / 2 + 1);\r\n }\r\n\r\n load = (tileX, tileZ, cancelCheck = () => false) => {\r\n let tileUrl = this.tilePath + this.lod + \"/\" + pathFromCoords(tileX, tileZ) + '.png';\r\n\r\n //await this.loadBlocker();\r\n return new Promise((resolve, reject) => {\r\n this.textureLoader.load(tileUrl + '?' + this.tileCacheHash,\r\n async texture => {\r\n texture.anisotropy = 1;\r\n texture.generateMipmaps = false;\r\n texture.magFilter = NearestFilter;\r\n texture.minFilter = texture.generateMipmaps ? NearestMipMapLinearFilter : NearestFilter;\r\n texture.wrapS = ClampToEdgeWrapping;\r\n texture.wrapT = ClampToEdgeWrapping;\r\n texture.flipY = false;\r\n texture.flatShading = true;\r\n\r\n await this.loadBlocker();\r\n if (cancelCheck()){\r\n texture.dispose();\r\n reject({status: \"cancelled\"});\r\n return;\r\n }\r\n\r\n let material = new ShaderMaterial({\r\n uniforms: {\r\n ...this.uniforms,\r\n tileSize: {\r\n value: new Vector2(this.tileSettings.tileSize.x, this.tileSettings.tileSize.z)\r\n },\r\n textureSize: {\r\n value: new Vector2(texture.image.width, texture.image.height)\r\n },\r\n textureImage: {\r\n type: 't',\r\n value: texture\r\n }\r\n },\r\n vertexShader: this.vertexShader,\r\n fragmentShader: this.fragmentShader,\r\n transparent: false,\r\n depthWrite: true,\r\n depthTest: true,\r\n vertexColors: VertexColors,\r\n side: FrontSide,\r\n wireframe: false,\r\n });\r\n\r\n let object = new Mesh(this.geometry, material);\r\n\r\n const scale = Math.pow(this.tileSettings.lodFactor, this.lod - 1);\r\n object.position.set(tileX * this.tileSettings.tileSize.x * scale, 0, tileZ * this.tileSettings.tileSize.z * scale);\r\n object.scale.set(scale, 1, scale);\r\n\r\n object.userData.tileUrl = tileUrl;\r\n object.userData.tileType = \"lowres\";\r\n\r\n object.updateMatrixWorld(true);\r\n\r\n resolve(object);\r\n },\r\n undefined,\r\n reject\r\n );\r\n });\r\n }\r\n\r\n}\r\n","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport {\r\n\tClampToEdgeWrapping,\r\n\tColor,\r\n\tFileLoader,\r\n\tFrontSide,\r\n\tNearestFilter,\r\n\tNearestMipMapLinearFilter,\r\n\tRaycaster,\r\n\tScene,\r\n\tShaderMaterial,\r\n\tTexture,\r\n\tVector3,\r\n\tVertexColors\r\n} from \"three\";\r\nimport {alert, dispatchEvent, generateCacheHash, getPixel, hashTile, stringToImage, vecArrToObj} from \"../util/Utils\";\r\nimport {TileManager} from \"./TileManager\";\r\nimport {TileLoader} from \"./TileLoader\";\r\nimport {LowresTileLoader} from \"./LowresTileLoader\";\r\n\r\nexport class Map {\r\n\r\n\t/**\r\n\t * @param id {string}\r\n\t * @param dataUrl {string}\r\n\t * @param loadBlocker {function: Promise}\r\n\t * @param events {EventTarget}\r\n\t */\r\n\tconstructor(id, dataUrl, loadBlocker, events = null) {\r\n\t\tObject.defineProperty( this, 'isMap', { value: true } );\r\n\r\n\t\tthis.loadBlocker = loadBlocker;\r\n\t\tthis.events = events;\r\n\r\n\t\tthis.data = {\r\n\t\t\tid: id,\r\n\t\t\tsorting: 0,\r\n\t\t\tdataUrl: dataUrl,\r\n\t\t\tsettingsUrl: dataUrl + \"settings.json\",\r\n\t\t\ttexturesUrl: dataUrl + \"textures.json\",\r\n\t\t\tname: id,\r\n\t\t\tstartPos: {x: 0, z: 0},\r\n\t\t\tskyColor: new Color(),\r\n\t\t\tambientLight: 0,\r\n\t\t\thires: {\r\n\t\t\t\ttileSize: {x: 32, z: 32},\r\n\t\t\t\tscale: {x: 1, z: 1},\r\n\t\t\t\ttranslate: {x: 2, z: 2}\r\n\t\t\t},\r\n\t\t\tlowres: {\r\n\t\t\t\ttileSize: {x: 32, z: 32},\r\n\t\t\t\tlodFactor: 5,\r\n\t\t\t\tlodCount: 3\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tthis.raycaster = new Raycaster();\r\n\r\n\t\t/** @type {ShaderMaterial[]} */\r\n\t\tthis.hiresMaterial = null;\r\n\t\t/** @type {ShaderMaterial} */\r\n\t\tthis.lowresMaterial = null;\r\n\t\t/** @type {Texture[]} */\r\n\t\tthis.loadedTextures = [];\r\n\r\n\t\t/** @type {TileManager} */\r\n\t\tthis.hiresTileManager = null;\r\n\t\t/** @type {TileManager[]} */\r\n\t\tthis.lowresTileManager = null;\r\n\t}\r\n\r\n\t/**\r\n\t * Loads textures and materials for this map so it is ready to load map-tiles\r\n\t * @param hiresVertexShader {string}\r\n\t * @param hiresFragmentShader {string}\r\n\t * @param lowresVertexShader {string}\r\n\t * @param lowresFragmentShader {string}\r\n\t * @param uniforms {object}\r\n\t * @param tileCacheHash {number}\r\n\t * @returns {Promise}\r\n\t */\r\n\tload(hiresVertexShader, hiresFragmentShader, lowresVertexShader, lowresFragmentShader, uniforms, tileCacheHash = 0) {\r\n\t\tthis.unload()\r\n\r\n\t\tlet settingsPromise = this.loadSettings();\r\n\t\tlet textureFilePromise = this.loadTexturesFile();\r\n\r\n\t\tthis.lowresMaterial = this.createLowresMaterial(lowresVertexShader, lowresFragmentShader, uniforms);\r\n\r\n\t\treturn Promise.all([settingsPromise, textureFilePromise])\r\n .then(values => {\r\n let textures = values[1];\r\n if (textures === null) throw new Error(\"Failed to parse textures.json!\");\r\n\r\n this.hiresMaterial = this.createHiresMaterial(hiresVertexShader, hiresFragmentShader, uniforms, textures);\r\n\r\n this.hiresTileManager = new TileManager(new TileLoader(`${this.data.dataUrl}tiles/0/`, this.hiresMaterial, this.data.hires, this.loadBlocker, tileCacheHash), this.onTileLoad(\"hires\"), this.onTileUnload(\"hires\"), this.events);\r\n\t\t\t\tthis.hiresTileManager.scene.autoUpdate = false;\r\n\r\n this.lowresTileManager = [];\r\n\t\t\t\tfor (let i = 0; i < this.data.lowres.lodCount; i++) {\r\n\t\t\t\t\tthis.lowresTileManager[i] = new TileManager(new LowresTileLoader(`${this.data.dataUrl}tiles/`, this.data.lowres, i + 1, lowresVertexShader, lowresFragmentShader, uniforms, async () => {}, tileCacheHash), this.onTileLoad(\"lowres\"), this.onTileUnload(\"lowres\"), this.events);\r\n\t\t\t\t\tthis.lowresTileManager[i].scene.autoUpdate = false;\r\n\t\t\t\t}\r\n\r\n alert(this.events, `Map '${this.data.id}' is loaded.`, \"fine\");\r\n });\r\n\t}\r\n\r\n\t/**\r\n\t * Loads the settings of this map\r\n\t * @returns {Promise}\r\n\t */\r\n\tloadSettings() {\r\n\t\treturn this.loadSettingsFile()\r\n\t\t\t.then(worldSettings => {\r\n\t\t\t\tthis.data.name = worldSettings.name ? worldSettings.name : this.data.name;\r\n\r\n\t\t\t\tthis.data.sorting = worldSettings.sorting ? worldSettings.sorting : this.data.sorting;\r\n\r\n\t\t\t\tthis.data.startPos = {...this.data.startPos, ...vecArrToObj(worldSettings.startPos, true)};\r\n\r\n\t\t\t\tif (worldSettings.skyColor && worldSettings.skyColor.length >= 3) {\r\n\t\t\t\t\tthis.data.skyColor.setRGB(\r\n\t\t\t\t\t\tworldSettings.skyColor[0],\r\n\t\t\t\t\t\tworldSettings.skyColor[1],\r\n\t\t\t\t\t\tworldSettings.skyColor[2]\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.data.ambientLight = worldSettings.ambientLight ? worldSettings.ambientLight : this.data.ambientLight;\r\n\r\n\t\t\t\tif (worldSettings.hires === undefined) worldSettings.hires = {};\r\n\t\t\t\tif (worldSettings.lowres === undefined) worldSettings.lowres = {};\r\n\r\n\t\t\t\tthis.data.hires = {\r\n\t\t\t\t\ttileSize: {...this.data.hires.tileSize, ...vecArrToObj(worldSettings.hires.tileSize, true)},\r\n\t\t\t\t\tscale: {...this.data.hires.scale, ...vecArrToObj(worldSettings.hires.scale, true)},\r\n\t\t\t\t\ttranslate: {...this.data.hires.translate, ...vecArrToObj(worldSettings.hires.translate, true)}\r\n\t\t\t\t};\r\n\t\t\t\tthis.data.lowres = {\r\n\t\t\t\t\ttileSize: {...this.data.lowres.tileSize, ...vecArrToObj(worldSettings.lowres.tileSize, true)},\r\n\t\t\t\t\tlodFactor: worldSettings.lowres.lodFactor !== undefined ? worldSettings.lowres.lodFactor : this.data.lowres.lodFactor,\r\n\t\t\t\t\tlodCount: worldSettings.lowres.lodCount !== undefined ? worldSettings.lowres.lodCount : this.data.lowres.lodCount\r\n\t\t\t\t};\r\n\r\n\t\t\t\talert(this.events, `Settings for map '${this.data.id}' loaded.`, \"fine\");\r\n\t\t\t});\r\n\t}\r\n\r\n\tonTileLoad = layer => tile => {\r\n\t\tdispatchEvent(this.events, \"bluemapMapTileLoaded\", {\r\n\t\t\ttile: tile,\r\n\t\t\tlayer: layer\r\n\t\t});\r\n\t}\r\n\r\n\tonTileUnload = layer => tile => {\r\n\t\tdispatchEvent(this.events, \"bluemapMapTileUnloaded\", {\r\n\t\t\ttile: tile,\r\n\t\t\tlayer: layer\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * @param x {number}\r\n\t * @param z {number}\r\n\t * @param hiresViewDistance {number}\r\n\t * @param lowresViewDistance {number}\r\n\t */\r\n\tloadMapArea(x, z, hiresViewDistance, lowresViewDistance) {\r\n\t\tif (!this.isLoaded) return;\r\n\r\n\t\tconst hiresX = Math.floor((x - this.data.hires.translate.x) / this.data.hires.tileSize.x);\r\n\t\tconst hiresZ = Math.floor((z - this.data.hires.translate.z) / this.data.hires.tileSize.z);\r\n\t\tconst hiresViewX = Math.floor(hiresViewDistance / this.data.hires.tileSize.x);\r\n\t\tconst hiresViewZ = Math.floor(hiresViewDistance / this.data.hires.tileSize.z);\r\n\t\tthis.hiresTileManager.loadAroundTile(hiresX, hiresZ, hiresViewX, hiresViewZ);\r\n\r\n\t\tfor (let i = 0; i < this.lowresTileManager.length; i++) {\r\n\t\t\tconst lod = i + 1;\r\n\t\t\tconst scale = Math.pow(this.data.lowres.lodFactor, lod - 1);\r\n\t\t\tconst lowresX = Math.floor(x / (this.data.lowres.tileSize.x * scale));\r\n\t\t\tconst lowresZ = Math.floor(z / (this.data.lowres.tileSize.z * scale));\r\n\t\t\tconst lowresViewX = Math.floor(lowresViewDistance / this.data.lowres.tileSize.x);\r\n\t\t\tconst lowresViewZ = Math.floor(lowresViewDistance / this.data.lowres.tileSize.z);\r\n\t\t\tthis.lowresTileManager[i].loadAroundTile(lowresX, lowresZ, lowresViewX, lowresViewZ);\r\n\t\t}\r\n\t}\r\n\r\n /**\r\n * Loads the settings.json file for this map\r\n * @returns {Promise}\r\n */\r\n loadSettingsFile() {\r\n return new Promise((resolve, reject) => {\r\n alert(this.events, `Loading settings for map '${this.data.id}'...`, \"fine\");\r\n\r\n let loader = new FileLoader();\r\n loader.setResponseType(\"json\");\r\n loader.load(this.data.settingsUrl + \"?\" + generateCacheHash(),\r\n resolve,\r\n () => {},\r\n () => reject(`Failed to load the settings.json for map: ${this.data.id}`)\r\n )\r\n });\r\n }\r\n\r\n\t/**\r\n\t * Loads the textures.json file for this map\r\n\t * @returns {Promise}\r\n\t */\r\n\tloadTexturesFile() {\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\talert(this.events, `Loading textures for map '${this.data.id}'...`, \"fine\");\r\n\r\n\t\t\tlet loader = new FileLoader();\r\n\t\t\tloader.setResponseType(\"json\");\r\n\t\t\tloader.load(this.data.texturesUrl + \"?\" + generateCacheHash(),\r\n\t\t\t\tresolve,\r\n\t\t\t\t() => {},\r\n\t\t\t\t() => reject(`Failed to load the textures.json for map: ${this.data.id}`)\r\n\t\t\t)\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Creates a hires Material with the given textures\r\n\t * @param vertexShader {string}\r\n\t * @param fragmentShader {string}\r\n\t * @param uniforms {object}\r\n\t * @param textures {{\r\n\t * resourcePath: string,\r\n\t * color: number[],\r\n\t * halfTransparent: boolean,\r\n\t * texture: string\r\n\t * }[]} the textures-data\r\n\t * @returns {ShaderMaterial[]} the hires Material (array because its a multi-material)\r\n\t */\r\n\tcreateHiresMaterial(vertexShader, fragmentShader, uniforms, textures) {\r\n\t\tlet materials = [];\r\n\t\tif (!Array.isArray(textures)) throw new Error(\"Invalid texture.json: 'textures' is not an array!\")\r\n\t\tfor (let i = 0; i < textures.length; i++) {\r\n\t\t\tlet textureSettings = textures[i];\r\n\r\n\t\t\tlet color = textureSettings.color;\r\n\t\t\tif (!Array.isArray(color) || color.length < 4){\r\n\t\t\t\tcolor = [0, 0, 0, 0];\r\n\t\t\t}\r\n\r\n\t\t\tlet opaque = color[3] === 1;\r\n\t\t\tlet transparent = !!textureSettings.halfTransparent;\r\n\r\n\t\t\tlet texture = new Texture();\r\n\t\t\ttexture.image = stringToImage(textureSettings.texture);\r\n\r\n\t\t\ttexture.anisotropy = 1;\r\n\t\t\ttexture.generateMipmaps = opaque || transparent;\r\n\t\t\ttexture.magFilter = NearestFilter;\r\n\t\t\ttexture.minFilter = texture.generateMipmaps ? NearestMipMapLinearFilter : NearestFilter;\r\n\t\t\ttexture.wrapS = ClampToEdgeWrapping;\r\n\t\t\ttexture.wrapT = ClampToEdgeWrapping;\r\n\t\t\ttexture.flipY = false;\r\n\t\t\ttexture.flatShading = true;\r\n\t\t\ttexture.image.addEventListener(\"load\", () => texture.needsUpdate = true);\r\n\r\n\t\t\tthis.loadedTextures.push(texture);\r\n\r\n\t\t\tlet material = new ShaderMaterial({\r\n\t\t\t\tuniforms: {\r\n\t\t\t\t\t...uniforms,\r\n\t\t\t\t\ttextureImage: {\r\n\t\t\t\t\t\ttype: 't',\r\n\t\t\t\t\t\tvalue: texture\r\n\t\t\t\t\t},\r\n\t\t\t\t\ttransparent: { value: transparent }\r\n\t\t\t\t},\r\n\t\t\t\tvertexShader: vertexShader,\r\n\t\t\t\tfragmentShader: fragmentShader,\r\n\t\t\t\ttransparent: transparent,\r\n\t\t\t\tdepthWrite: true,\r\n\t\t\t\tdepthTest: true,\r\n\t\t\t\tvertexColors: VertexColors,\r\n\t\t\t\tside: FrontSide,\r\n\t\t\t\twireframe: false,\r\n\t\t\t});\r\n\r\n\t\t\tmaterial.needsUpdate = true;\r\n\t\t\tmaterials[i] = material;\r\n\t\t}\r\n\r\n\t\treturn materials;\r\n\t}\r\n\r\n\t/**\r\n\t * Creates a lowres Material\r\n\t * @param vertexShader {string}\r\n\t * @param fragmentShader {string}\r\n\t * @param uniforms {object}\r\n\t * @returns {ShaderMaterial} the hires Material\r\n\t */\r\n\tcreateLowresMaterial(vertexShader, fragmentShader, uniforms) {\r\n\t\treturn new ShaderMaterial({\r\n\t\t\tuniforms: uniforms,\r\n\t\t\tvertexShader: vertexShader,\r\n\t\t\tfragmentShader: fragmentShader,\r\n\t\t\ttransparent: false,\r\n\t\t\tdepthWrite: true,\r\n\t\t\tdepthTest: true,\r\n\t\t\tvertexColors: VertexColors,\r\n\t\t\tside: FrontSide,\r\n\t\t\twireframe: false\r\n\t\t});\r\n\t}\r\n\r\n\tunload() {\r\n\t\tif (this.hiresTileManager) this.hiresTileManager.unload();\r\n\t\tthis.hiresTileManager = null;\r\n\r\n\t\tif (this.lowresTileManager) {\r\n\t\t\tfor (let i = 0; i < this.lowresTileManager.length; i++) {\r\n\t\t\t\tthis.lowresTileManager[i].unload();\r\n\t\t\t}\r\n\t\t\tthis.lowresTileManager = null;\r\n\t\t}\r\n\r\n\t\tif (this.hiresMaterial) this.hiresMaterial.forEach(material => material.dispose());\r\n\t\tthis.hiresMaterial = null;\r\n\r\n\t\tif (this.lowresMaterial) this.lowresMaterial.dispose();\r\n\t\tthis.lowresMaterial = null;\r\n\r\n\t\tthis.loadedTextures.forEach(texture => texture.dispose());\r\n\t\tthis.loadedTextures = [];\r\n\t}\r\n\r\n\t/**\r\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\r\n\t * @param x {number}\r\n\t * @param z {number}\r\n\t * @returns {boolean|number}\r\n\t */\r\n\tterrainHeightAt(x, z) {\r\n\t\tif (!this.isLoaded) return false;\r\n\r\n\t\tthis.raycaster.set(\r\n\t\t\tnew Vector3(x, 300, z), // ray-start\r\n\t\t\tnew Vector3(0, -1, 0) // ray-direction\r\n\t\t);\r\n\t\tthis.raycaster.near = 1;\r\n\t\tthis.raycaster.far = 300;\r\n\t\tthis.raycaster.layers.enableAll();\r\n\r\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));\r\n\t\tlet tile = this.hiresTileManager.tiles.get(hiresTileHash);\r\n\r\n\t\tif (tile?.model) {\r\n\t\t\ttry {\r\n\t\t\t\tlet intersects = this.raycaster.intersectObjects([tile.model]);\r\n\t\t\t\tif (intersects.length > 0) {\r\n\t\t\t\t\treturn intersects[0].point.y;\r\n\t\t\t\t}\r\n\t\t\t} catch (ignore) {\r\n\t\t\t\t//empty\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfor (let i = 0; i < this.lowresTileManager.length; i++) {\r\n\t\t\tconst lod = i + 1;\r\n\t\t\tconst scale = Math.pow(this.data.lowres.lodFactor, lod - 1);\r\n\t\t\tconst scaledTileSize = {\r\n\t\t\t\tx: this.data.lowres.tileSize.x * scale,\r\n\t\t\t\tz: this.data.lowres.tileSize.z * scale\r\n\t\t\t}\r\n\t\t\tconst tileX = Math.floor(x / scaledTileSize.x);\r\n\t\t\tconst tileZ = Math.floor(z / scaledTileSize.z);\r\n\t\t\tlet lowresTileHash = hashTile(tileX, tileZ);\r\n\t\t\ttile = this.lowresTileManager[i].tiles.get(lowresTileHash);\r\n\r\n\t\t\tif (!tile || !tile.model) continue;\r\n\r\n\t\t\tconst texture = tile.model.material.uniforms?.textureImage?.value?.image;\r\n\t\t\tif (texture == null) continue;\r\n\r\n\t\t\tconst color = getPixel(texture, x - tileX * scaledTileSize.x, z - tileZ * scaledTileSize.z + this.data.lowres.tileSize.z + 1);\r\n\r\n\t\t\tlet heightUnsigned = color[1] * 256.0 + color[2];\r\n\t\t\tif (heightUnsigned >= 32768.0) {\r\n\t\t\t\treturn -(65535.0 - heightUnsigned);\r\n\t\t\t} else {\r\n\t\t\t\treturn heightUnsigned;\r\n\t\t\t}\r\n\r\n\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\tdispose() {\r\n\t\tthis.unload();\r\n\t}\r\n\r\n\t/**\r\n\t * @returns {boolean}\r\n\t */\r\n\tget isLoaded() {\r\n\t\treturn !!(this.hiresMaterial && this.lowresMaterial);\r\n\t}\r\n\r\n}\r\n","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nexport const SKY_FRAGMENT_SHADER = `\r\nuniform float sunlightStrength;\r\nuniform float ambientLight;\r\nuniform vec3 skyColor;\r\n\r\nvarying vec3 vPosition;\r\n\r\nvoid main() {\r\n\tfloat horizonWidth = 0.005;\r\n\tfloat horizonHeight = 0.0;\r\n\t\r\n\tvec4 color = vec4(skyColor * max(sunlightStrength * sunlightStrength, ambientLight), 1.0);\r\n\tfloat voidMultiplier = (clamp(vPosition.y - horizonHeight, -horizonWidth, horizonWidth) + horizonWidth) / (horizonWidth * 2.0);\r\n\tcolor.rgb *= voidMultiplier;\r\n\r\n\tgl_FragColor = color;\r\n}\r\n`;\r\n","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nexport const SKY_VERTEX_SHADER = `\r\nvarying vec3 vPosition;\r\nvoid main() {\r\n\tvPosition = position;\r\n\t\r\n\tgl_Position = \r\n\t\tprojectionMatrix *\r\n\t\tmodelViewMatrix *\r\n\t\tvec4(position, 1);\r\n}\r\n`;\r\n","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport {BackSide, Mesh, Scene, ShaderMaterial, SphereGeometry} from 'three';\r\n\r\nimport {SKY_FRAGMENT_SHADER} from './SkyFragmentShader';\r\nimport {SKY_VERTEX_SHADER} from './SkyVertexShader';\r\n\r\nexport class SkyboxScene extends Scene {\r\n\r\n\tconstructor(uniforms) {\r\n\t\tsuper();\r\n\r\n\t\tthis.autoUpdate = false;\r\n\r\n\t\tObject.defineProperty(this, 'isSkyboxScene', {value: true});\r\n\r\n\t\tlet geometry = new SphereGeometry(1, 40, 5);\r\n\t\tlet material = new ShaderMaterial({\r\n\t\t\tuniforms: uniforms,\r\n\t\t\tvertexShader: SKY_VERTEX_SHADER,\r\n\t\t\tfragmentShader: SKY_FRAGMENT_SHADER,\r\n\t\t\tside: BackSide\r\n\t\t});\r\n\t\tlet skybox = new Mesh(geometry, material);\r\n\r\n\t\tthis.add(skybox);\r\n\t}\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\n\r\nimport {MathUtils, Vector3} from \"three\";\r\nimport {dispatchEvent} from \"../util/Utils\";\r\nimport {Map} from \"../map/Map\";\r\n\r\nexport class ControlsManager {\r\n\r\n\t/**\r\n\t * @param mapViewer {MapViewer}\r\n\t * @param camera {CombinedCamera}\r\n\t */\r\n\tconstructor(mapViewer, camera) {\r\n\t\tObject.defineProperty( this, 'isControlsManager', { value: true } );\r\n\r\n\t\tthis.data = {\r\n\t\t\tmapViewer: null,\r\n\t\t\tcamera: null,\r\n\t\t\tcontrols: null,\r\n\t\t\tposition: new Vector3(0, 0, 0),\r\n\t\t\trotation: 0,\r\n\t\t\tangle: 0,\r\n\t\t\ttilt: 0,\r\n\t\t};\r\n\r\n\t\tthis.mapViewer = mapViewer;\r\n\t\tthis.camera = camera;\r\n\r\n\t\t/** @type {Vector3} */\r\n\t\tthis.lastPosition = this.position.clone();\r\n\t\tthis.lastRotation = this.rotation;\r\n\t\tthis.lastAngle = this.angle;\r\n\t\tthis.lastDistance = this.distance;\r\n\t\tthis.lastOrtho = this.ortho;\r\n\t\tthis.lastTilt = this.tilt;\r\n\r\n\t\tthis.lastMapUpdatePosition = this.position.clone();\r\n\t\tthis.lastMapUpdateDistance = this.distance;\r\n\r\n\t\tthis.averageDeltaTime = 16;\r\n\r\n\t\tthis._controls = null;\r\n\r\n\t\t// start\r\n\t\tthis.distance = 300;\r\n\t\tthis.position.set(0, 0, 0);\r\n\t\tthis.rotation = 0;\r\n\t\tthis.angle = 0;\r\n\t\tthis.tilt = 0;\r\n\t\tthis.ortho = 0;\r\n\r\n\t\tthis.updateCamera();\r\n\t}\r\n\r\n\t/**\r\n\t * @param deltaTime {number}\r\n\t * @param map {Map}\r\n\t */\r\n\tupdate(deltaTime, map) {\r\n\t\tif (deltaTime > 50) deltaTime = 50; // assume min 20 UPS\r\n\t\tthis.averageDeltaTime = this.averageDeltaTime * 0.9 + deltaTime * 0.1; // average delta-time to avoid choppy controls on lag-spikes\r\n\r\n\t\tif (this._controls) this._controls.update(this.averageDeltaTime, map);\r\n\r\n\t\tthis.updateCamera();\r\n\t}\r\n\r\n\tupdateCamera() {\r\n\t\tlet valueChanged = this.isValueChanged();\r\n\r\n\t\tif (valueChanged) {\r\n\t\t\tthis.resetValueChanged();\r\n\r\n\t\t\t// wrap rotation\r\n\t\t\twhile (this.rotation >= Math.PI) this.rotation -= Math.PI * 2;\r\n\t\t\twhile (this.rotation <= -Math.PI) this.rotation += Math.PI * 2;\r\n\r\n\t\t\t// prevent problems with the rotation when the angle is 0 (top-down) or distance is 0 (first-person)\r\n\t\t\tlet rotatableAngle = this.angle;\r\n\t\t\tif (Math.abs(rotatableAngle) <= 0.0001) rotatableAngle = 0.0001;\r\n\t\t\telse if (Math.abs(rotatableAngle) - Math.PI <= 0.0001) rotatableAngle = rotatableAngle - 0.0001;\r\n\t\t\tlet rotatableDistance = this.distance;\r\n\t\t\tif (Math.abs(rotatableDistance) <= 0.0001) rotatableDistance = 0.0001;\r\n\r\n\t\t\t// fix distance for orthogonal-camera\r\n\t\t\tif (this.ortho > 0) {\r\n\t\t\t\trotatableDistance = MathUtils.lerp(rotatableDistance, Math.max(rotatableDistance, 300), Math.pow(this.ortho, 8));\r\n\t\t\t}\r\n\r\n\t\t\t// calculate rotationVector\r\n\t\t\tlet rotationVector = new Vector3(Math.sin(this.rotation), 0, -Math.cos(this.rotation)); // 0 is towards north\r\n\t\t\tlet angleRotationAxis = new Vector3(0, 1, 0).cross(rotationVector);\r\n\t\t\trotationVector.applyAxisAngle(angleRotationAxis, (Math.PI / 2) - rotatableAngle);\r\n\t\t\trotationVector.multiplyScalar(rotatableDistance);\r\n\r\n\t\t\t// position camera\r\n\t\t\tthis.camera.rotation.set(0, 0, 0);\r\n\t\t\tthis.camera.position.copy(this.position).sub(rotationVector);\r\n\t\t\tthis.camera.lookAt(this.position);\r\n\t\t\tthis.camera.rotateZ(this.tilt + rotatableAngle < 0 ? Math.PI : 0);\r\n\r\n\t\t\t// optimize far/near planes\r\n\t\t\tif (this.ortho <= 0) {\r\n\t\t\t\tlet near = MathUtils.clamp(rotatableDistance / 1000, 0.01, 1);\r\n\t\t\t\tlet far = MathUtils.clamp(rotatableDistance * 2, Math.max(near + 1, 2000), rotatableDistance + 5000);\r\n\t\t\t\tif (far - near > 10000) near = far - 10000;\r\n\t\t\t\tthis.camera.near = near;\r\n\t\t\t\tthis.camera.far = far;\r\n\t\t\t} else if (this.angle === 0) {\r\n\t\t\t\tthis.camera.near = 1;\r\n\t\t\t\tthis.camera.far = rotatableDistance + 300;\r\n\t\t\t} else {\r\n\t\t\t\tthis.camera.near = 1;\r\n\t\t\t\tthis.camera.far = 100000;\r\n\t\t\t}\r\n\r\n\t\t\t// event\r\n\t\t\tdispatchEvent(this.mapViewer.events, \"bluemapCameraMoved\", {\r\n\t\t\t\tcontrolsManager: this,\r\n\t\t\t\tcamera: this.camera\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// if the position changed, update map to show new position\r\n\t\tif (this.mapViewer.map) {\r\n\t\t\tlet triggerDistance = 1;\r\n\t\t\tif (valueChanged) {\r\n\t\t\t\tif (this.distance > 300) {\r\n\t\t\t\t\ttriggerDistance = this.mapViewer.data.loadedLowresViewDistance * 0.5;\r\n\t\t\t\t} else {\r\n\t\t\t\t\ttriggerDistance = this.mapViewer.data.loadedHiresViewDistance * 0.5;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (\r\n\t\t\t\tMath.abs(this.lastMapUpdatePosition.x - this.position.x) >= triggerDistance ||\r\n\t\t\t\tMath.abs(this.lastMapUpdatePosition.z - this.position.z) >= triggerDistance ||\r\n\t\t\t\t(this.distance < 1000 && this.lastMapUpdateDistance > 1000)\r\n\t\t\t) {\r\n\t\t\t\tthis.lastMapUpdatePosition = this.position.clone();\r\n\t\t\t\tthis.lastMapUpdateDistance = this.distance;\r\n\t\t\t\tthis.mapViewer.loadMapArea(this.position.x, this.position.z);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Triggers an interaction on the screen (map), e.g. a mouse-click\r\n\t * @param screenPosition {THREE.Vector2} - Clicked position on the screen (usually event.x, event.y)\r\n\t * @param data {object} - Custom event data that will be added to the interaction-event\r\n\t */\r\n\thandleMapInteraction(screenPosition, data = {}) {\r\n\t\tthis.mapViewer.handleMapInteraction(screenPosition, data);\r\n\t}\r\n\r\n\tisValueChanged() {\r\n\t\treturn !(\r\n\t\t\tthis.data.position.equals(this.lastPosition) &&\r\n\t\t\tthis.data.rotation === this.lastRotation &&\r\n\t\t\tthis.data.angle === this.lastAngle &&\r\n\t\t\tthis.distance === this.lastDistance &&\r\n\t\t\tthis.ortho === this.lastOrtho &&\r\n\t\t\tthis.data.tilt === this.lastTilt\r\n\t\t);\r\n\t}\r\n\r\n\tresetValueChanged() {\r\n\t\tthis.lastPosition.copy(this.data.position);\r\n\t\tthis.lastRotation = this.data.rotation;\r\n\t\tthis.lastAngle = this.data.angle;\r\n\t\tthis.lastDistance = this.distance;\r\n\t\tthis.lastOrtho = this.ortho;\r\n\t\tthis.lastTilt = this.data.tilt;\r\n\t}\r\n\r\n\t/**\r\n\t * @returns {number}\r\n\t */\r\n\tget ortho() {\r\n\t\treturn this.camera.ortho;\r\n\t}\r\n\r\n\t/**\r\n\t * @param ortho {number}\r\n\t */\r\n\tset ortho(ortho) {\r\n\t\tthis.camera.ortho = ortho;\r\n\t}\r\n\r\n\tget distance() {\r\n\t\treturn this.camera.distance;\r\n\t}\r\n\r\n\tset distance(distance) {\r\n\t\tthis.camera.distance = distance;\r\n\t}\r\n\r\n\t/** @typedef ControlsLike {{\r\n\t * \t\tstart: function(controls: ControlsManager),\r\n\t * \t\tstop: function(),\r\n\t * \t\tupdate: function(deltaTime: number, map: Map)\r\n\t * \t}}\r\n\r\n\t/**\r\n\t * @param controls {ControlsLike}\r\n\t */\r\n\tset controls(controls) {\r\n\t\tif (this._controls && this._controls.stop)\r\n\t\t\tthis._controls.stop();\r\n\r\n\t\tthis._controls = controls;\r\n\t\tif (controls) this.data.controls = controls.data || null\r\n\r\n\t\tif (this._controls && this._controls.start)\r\n\t\t\tthis._controls.start(this);\r\n\t}\r\n\r\n\t/**\r\n\t * @returns {ControlsLike}\r\n\t */\r\n\tget controls() {\r\n\t\treturn this._controls;\r\n\t}\r\n\r\n\t/**\r\n\t * @returns {MapViewer}\r\n\t */\r\n\tget mapViewer() {\r\n\t\treturn this._mapViewer;\r\n\t}\r\n\r\n\t/**\r\n\t * @param value {MapViewer}\r\n\t */\r\n\tset mapViewer(value) {\r\n\t\tthis._mapViewer = value;\r\n\t\tthis.data.mapViewer = value.data;\r\n\t}\r\n\r\n\t/**\r\n\t * @returns {CombinedCamera}\r\n\t */\r\n\tget camera() {\r\n\t\treturn this._camera;\r\n\t}\r\n\r\n\t/**\r\n\t * @param value {CombinedCamera}\r\n\t */\r\n\tset camera(value) {\r\n\t\tthis._camera = value;\r\n\t\tthis.data.camera = value.data;\r\n\t}\r\n\r\n\t/**\r\n\t * @returns {Vector3}\r\n\t */\r\n\tget position() {\r\n\t\treturn this.data.position;\r\n\t}\r\n\r\n\t/**\r\n\t * @param value {Vector3}\r\n\t */\r\n\tset position(value) {\r\n\t\tthis.data.position = value;\r\n\t}\r\n\r\n\t/**\r\n\t * @returns {number}\r\n\t */\r\n\tget rotation() {\r\n\t\treturn this.data.rotation;\r\n\t}\r\n\r\n\t/**\r\n\t * @param value {number}\r\n\t */\r\n\tset rotation(value) {\r\n\t\tthis.data.rotation = value;\r\n\t}\r\n\r\n\t/**\r\n\t * @returns {number}\r\n\t */\r\n\tget angle() {\r\n\t\treturn this.data.angle;\r\n\t}\r\n\r\n\t/**\r\n\t * @param value {number}\r\n\t */\r\n\tset angle(value) {\r\n\t\tthis.data.angle = value;\r\n\t}\r\n\r\n\t/**\r\n\t * @returns {number}\r\n\t */\r\n\tget tilt() {\r\n\t\treturn this.data.tilt;\r\n\t}\r\n\r\n\t/**\r\n\t * @param value {number}\r\n\t */\r\n\tset tilt(value) {\r\n\t\tthis.data.tilt = value;\r\n\t}\r\n}","/**\r\n * Taken from https://github.com/mrdoob/three.js/blob/master/examples/jsm/libs/stats.module.js\r\n */\r\nlet Stats = function () {\r\n\r\n let mode = 0;\r\n\r\n let container = document.createElement( 'div' );\r\n container.style.cssText = 'position:absolute;bottom:5px;right:5px;cursor:pointer;opacity:0.9;z-index:10000';\r\n container.addEventListener( 'click', function ( event ) {\r\n\r\n event.preventDefault();\r\n showPanel( ++ mode % container.children.length );\r\n\r\n }, false );\r\n\r\n //\r\n\r\n function addPanel( panel ) {\r\n\r\n container.appendChild( panel.dom );\r\n return panel;\r\n\r\n }\r\n\r\n function showPanel( id ) {\r\n\r\n for ( let i = 0; i < container.children.length; i ++ ) {\r\n\r\n container.children[ i ].style.display = i === id ? 'block' : 'none';\r\n\r\n }\r\n\r\n mode = id;\r\n\r\n }\r\n\r\n function hide() {\r\n showPanel(-1);\r\n }\r\n\r\n //\r\n\r\n let beginTime = ( performance || Date ).now(), prevTime = beginTime, frames = 0;\r\n let prevFrameTime = beginTime;\r\n\r\n let fpsPanel = addPanel( new Stats.Panel( 'FPS', '#0ff', '#002' ) );\r\n let msPanel = addPanel( new Stats.Panel( 'MS (render)', '#0f0', '#020' ) );\r\n let lastFrameMsPanel = addPanel( new Stats.Panel( 'MS (all)', '#f80', '#210' ) );\r\n\r\n let memPanel = null;\r\n if ( self.performance && self.performance.memory ) {\r\n\r\n memPanel = addPanel( new Stats.Panel( 'MB', '#f08', '#201' ) );\r\n\r\n }\r\n\r\n showPanel( 0 );\r\n\r\n return {\r\n\r\n REVISION: 16,\r\n\r\n dom: container,\r\n\r\n addPanel: addPanel,\r\n showPanel: showPanel,\r\n hide: hide,\r\n\r\n begin: function () {\r\n\r\n beginTime = ( performance || Date ).now();\r\n\r\n },\r\n\r\n end: function () {\r\n\r\n frames ++;\r\n\r\n let time = ( performance || Date ).now();\r\n\r\n msPanel.update( time - beginTime, 200 );\r\n lastFrameMsPanel.update( time - prevFrameTime, 200 )\r\n\r\n if ( time >= prevTime + 1000 ) {\r\n\r\n fpsPanel.update( ( frames * 1000 ) / ( time - prevTime ), 100 );\r\n\r\n prevTime = time;\r\n frames = 0;\r\n\r\n if ( memPanel ) {\r\n\r\n let memory = performance.memory;\r\n memPanel.update( memory.usedJSHeapSize / 1048576, memory.jsHeapSizeLimit / 1048576 );\r\n\r\n }\r\n\r\n }\r\n\r\n return time;\r\n\r\n },\r\n\r\n update: function () {\r\n\r\n beginTime = this.end();\r\n prevFrameTime = beginTime;\r\n\r\n },\r\n\r\n // Backwards Compatibility\r\n\r\n domElement: container,\r\n setMode: showPanel\r\n\r\n };\r\n\r\n};\r\n\r\nStats.Panel = function ( name, fg, bg ) {\r\n\r\n let min = Infinity, max = 0, round = Math.round;\r\n let PR = round( window.devicePixelRatio || 1 );\r\n\r\n let WIDTH = 160 * PR, HEIGHT = 96 * PR,\r\n TEXT_X = 3 * PR, TEXT_Y = 3 * PR,\r\n GRAPH_X = 3 * PR, GRAPH_Y = 15 * PR,\r\n GRAPH_WIDTH = 154 * PR, GRAPH_HEIGHT = 77 * PR;\r\n\r\n let canvas = document.createElement( 'canvas' );\r\n canvas.width = WIDTH;\r\n canvas.height = HEIGHT;\r\n canvas.style.cssText = 'width:160px;height:96px';\r\n\r\n let context = canvas.getContext( '2d' );\r\n context.font = 'bold ' + ( 9 * PR ) + 'px Helvetica,Arial,sans-serif';\r\n context.textBaseline = 'top';\r\n\r\n context.fillStyle = bg;\r\n context.fillRect( 0, 0, WIDTH, HEIGHT );\r\n\r\n context.fillStyle = fg;\r\n context.fillText( name, TEXT_X, TEXT_Y );\r\n context.fillRect( GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT );\r\n\r\n context.fillStyle = bg;\r\n context.globalAlpha = 0.9;\r\n context.fillRect( GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT );\r\n\r\n return {\r\n\r\n dom: canvas,\r\n\r\n update: function ( value, maxValue ) {\r\n\r\n min = Math.min( min, value );\r\n max = Math.max( max, value );\r\n\r\n context.fillStyle = bg;\r\n context.globalAlpha = 1;\r\n context.fillRect( 0, 0, WIDTH, GRAPH_Y );\r\n context.fillStyle = fg;\r\n context.fillText( round( value ) + ' ' + name + ' (' + round( min ) + '-' + round( max ) + ')', TEXT_X, TEXT_Y );\r\n\r\n context.drawImage( canvas, GRAPH_X + PR, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT, GRAPH_X, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT );\r\n\r\n context.fillRect( GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, GRAPH_HEIGHT );\r\n\r\n context.fillStyle = bg;\r\n context.globalAlpha = 0.9;\r\n context.fillRect( GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, round( ( 1 - ( value / maxValue ) ) * GRAPH_HEIGHT ) );\r\n\r\n }\r\n\r\n };\r\n\r\n};\r\n\r\nexport default Stats;","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the 'Software'), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport { ShaderChunk } from 'three';\r\n\r\nexport const HIRES_VERTEX_SHADER = `\r\n#include \r\n${ShaderChunk.logdepthbuf_pars_vertex}\r\n\r\nattribute float ao;\r\nattribute float sunlight;\r\nattribute float blocklight;\r\n\r\nvarying vec3 vPosition;\r\nvarying vec3 vNormal;\r\nvarying vec2 vUv;\r\nvarying vec3 vColor;\r\nvarying float vAo;\r\nvarying float vSunlight;\r\nvarying float vBlocklight;\r\n\r\nvoid main() {\r\n\tvPosition = position;\r\n\tvNormal = normal;\r\n\tvUv = uv;\r\n\tvColor = color;\r\n\tvAo = ao;\r\n\tvSunlight = sunlight;\r\n\tvBlocklight = blocklight;\r\n\t\r\n\tgl_Position = projectionMatrix * (viewMatrix * modelMatrix * vec4(position, 1));\r\n\t\r\n\t${ShaderChunk.logdepthbuf_vertex} \r\n}\r\n`;\r\n","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the 'Software'), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport { ShaderChunk } from 'three';\r\n\r\nexport const HIRES_FRAGMENT_SHADER = `\r\n${ShaderChunk.logdepthbuf_pars_fragment}\r\n\r\n#ifndef texture\r\n\t#define texture texture2D\r\n#endif\r\n\r\nuniform sampler2D textureImage;\r\nuniform float sunlightStrength;\r\nuniform float ambientLight;\r\n\r\nvarying vec3 vPosition;\r\n//varying vec3 vWorldPosition;\r\nvarying vec3 vNormal;\r\nvarying vec2 vUv;\r\nvarying vec3 vColor;\r\nvarying float vAo;\r\nvarying float vSunlight;\r\nvarying float vBlocklight;\r\n//varying float vDistance;\r\n\r\nvoid main() {\r\n\tvec4 color = texture(textureImage, vUv);\r\n\tif (color.a <= 0.01) discard;\r\n\t\r\n\t//apply vertex-color\r\n\tcolor.rgb *= vColor.rgb;\r\n\r\n\t//apply ao\r\n\tcolor.rgb *= vAo;\r\n\t\r\n\t//apply light\r\n\tfloat light = mix(vBlocklight, max(vSunlight, vBlocklight), sunlightStrength);\r\n\tcolor.rgb *= mix(ambientLight, 1.0, light / 15.0);\r\n\t\r\n\tgl_FragColor = color;\r\n\t\r\n\t${ShaderChunk.logdepthbuf_fragment}\r\n}\r\n`;\r\n","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the 'Software'), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport { ShaderChunk } from 'three';\r\n\r\nexport const LOWRES_VERTEX_SHADER = `\r\n#include \r\n${ShaderChunk.logdepthbuf_pars_vertex}\r\n\r\nuniform sampler2D textureImage;\r\nuniform vec2 tileSize;\r\nuniform vec2 textureSize;\r\n\r\nvarying vec3 vPosition;\r\nvarying vec3 vWorldPosition;\r\nvarying float vDistance;\r\n\r\nfloat metaToHeight(vec4 meta) {\r\n\tfloat heightUnsigned = meta.g * 65280.0 + meta.b * 255.0;\r\n\tif (heightUnsigned >= 32768.0) {\r\n\t\treturn -(65535.0 - heightUnsigned);\r\n\t} else {\r\n\t\treturn heightUnsigned;\t\r\n\t}\r\n}\r\n\r\nvec2 posToMetaUV(vec2 pos) {\r\n\treturn vec2(pos.x / textureSize.x, pos.y / textureSize.y + 0.5);\r\n}\r\n\r\nvoid main() {\r\n\tvPosition = position;\r\n\t\r\n\tvec4 meta = texture(textureImage, posToMetaUV(position.xz));\r\n\tvPosition.y = metaToHeight(meta) + 1.0 - position.x * 0.0001 - position.z * 0.0002; //including small offset-tilt to prevent z-fighting\r\n\t\r\n\tvec4 worldPos = modelMatrix * vec4(vPosition, 1);\r\n\tvec4 viewPos = viewMatrix * worldPos;\r\n\t\r\n\tvWorldPosition = worldPos.xyz;\r\n\tvDistance = -viewPos.z;\r\n\t\r\n\tgl_Position = projectionMatrix * viewPos;\r\n\t\t\r\n\t${ShaderChunk.logdepthbuf_vertex}\r\n}\r\n\r\n`;\r\n","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the 'Software'), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport { ShaderChunk } from 'three';\r\n\r\nexport const LOWRES_FRAGMENT_SHADER = `\r\n${ShaderChunk.logdepthbuf_pars_fragment}\r\n\r\n#ifndef texture\r\n\t#define texture texture2D\r\n#endif\r\n\r\nstruct TileMap {\r\n\tsampler2D map;\r\n\tfloat size;\r\n\tvec2 scale;\r\n\tvec2 translate;\r\n\tvec2 pos; \r\n};\r\n\r\nuniform float sunlightStrength;\r\nuniform float ambientLight;\r\nuniform TileMap hiresTileMap;\r\nuniform sampler2D textureImage;\r\nuniform vec2 tileSize;\r\nuniform vec2 textureSize;\r\n\r\nvarying vec3 vPosition;\r\nvarying vec3 vWorldPosition;\r\nvarying float vDistance;\r\n\r\nfloat metaToHeight(vec4 meta) {\r\n\tfloat heightUnsigned = meta.g * 65280.0 + meta.b * 255.0;\r\n\tif (heightUnsigned >= 32768.0) {\r\n\t\treturn -(65535.0 - heightUnsigned);\r\n\t} else {\r\n\t\treturn heightUnsigned;\t\r\n\t}\r\n}\r\n\r\nfloat metaToLight(vec4 meta) {\r\n\treturn meta.r * 255.0;\r\n}\r\n\r\nvec2 posToColorUV(vec2 pos) {\r\n\treturn vec2(pos.x / textureSize.x, min(pos.y, tileSize.y) / textureSize.y);\r\n}\r\n\r\nvec2 posToMetaUV(vec2 pos) {\r\n\treturn vec2(pos.x / textureSize.x, pos.y / textureSize.y + 0.5);\r\n}\r\n\r\nvoid main() {\r\n\t//discard if hires tile is loaded at that position\r\n\tif (vDistance < 900.0 && texture(hiresTileMap.map, ((vWorldPosition.xz - hiresTileMap.translate) / hiresTileMap.scale - hiresTileMap.pos) / hiresTileMap.size + 0.5).r > 0.75) discard;\r\n\t\r\n\tvec4 color = texture(textureImage, posToColorUV(vPosition.xz));\r\n\tvec4 meta = texture(textureImage, posToMetaUV(vPosition.xz));\r\n\t\r\n\tfloat height = metaToHeight(meta);\r\n\t\r\n\tfloat heightX = metaToHeight(texture(textureImage, posToMetaUV(vPosition.xz + vec2(1.0, 0.0))));\r\n\tfloat heightZ = metaToHeight(texture(textureImage, posToMetaUV(vPosition.xz + vec2(0.0, 1.0))));\r\n\tfloat diff = (height - heightX) + (height - heightZ);\r\n\tcolor.rgb += clamp(diff * 0.04, -0.2, 0.04);\r\n\t\r\n\tfloat blockLight = metaToLight(meta);\r\n\tfloat light = mix(blockLight, 15.0, sunlightStrength);\r\n\tcolor.rgb *= mix(ambientLight, 1.0, light / 15.0);\r\n\t\r\n\tgl_FragColor = color;\r\n\t\r\n\t${ShaderChunk.logdepthbuf_fragment}\r\n}\r\n\r\n`;\r\n","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport {MathUtils, Matrix4, PerspectiveCamera} from \"three\";\r\n\r\nexport class CombinedCamera extends PerspectiveCamera {\r\n\r\n /**\r\n * @param fov {number}\r\n * @param aspect {number}\r\n * @param near {number}\r\n * @param far {number}\r\n * @param ortho {number}\r\n */\r\n constructor(fov, aspect, near, far, ortho) {\r\n super(fov, aspect, near, far);\r\n\r\n this.needsUpdate = true;\r\n\r\n this.data = {\r\n fov: this.fov,\r\n aspect: this.aspect,\r\n near: this.near,\r\n far: this.far,\r\n zoom: this.zoom,\r\n ortho: ortho,\r\n distance: 1,\r\n };\r\n\r\n // redirect parent properties\r\n Object.defineProperty(this, \"fov\", {\r\n get() { return this.data.fov },\r\n set(value) { if (value !== this.data.fov) { this.data.fov = value; this.needsUpdate = true }}\r\n });\r\n Object.defineProperty(this, \"aspect\", {\r\n get() { return this.data.aspect },\r\n set(value) { if (value !== this.data.aspect) { this.data.aspect = value; this.needsUpdate = true }}\r\n });\r\n Object.defineProperty(this, \"near\", {\r\n get() { return this.data.near },\r\n set(value) { if (value !== this.data.near) { this.data.near = value; this.needsUpdate = true }}\r\n });\r\n Object.defineProperty(this, \"far\", {\r\n get() { return this.data.far },\r\n set(value) { if (value !== this.data.far) { this.data.far = value; this.needsUpdate = true }}\r\n });\r\n Object.defineProperty(this, \"zoom\", {\r\n get() { return this.data.zoom },\r\n set(value) { if (value !== this.data.zoom) { this.data.zoom = value; this.needsUpdate = true }}\r\n });\r\n\r\n this.updateProjectionMatrix();\r\n }\r\n\r\n updateProjectionMatrix() {\r\n if (!this.needsUpdate) return;\r\n\r\n if (!this.ortographicProjection)\r\n this.ortographicProjection = new Matrix4();\r\n\r\n if (!this.perspectiveProjection)\r\n this.perspectiveProjection = new Matrix4();\r\n\r\n if (!this.data)\r\n this.data = {};\r\n\r\n //copied from PerspectiveCamera\r\n const near = this.near;\r\n let top = near * Math.tan( MathUtils.DEG2RAD * 0.5 * this.fov ) / this.zoom;\r\n let height = 2 * top;\r\n let width = this.aspect * height;\r\n let left = - 0.5 * width;\r\n const view = this.view;\r\n\r\n if ( this.view !== null && this.view.enabled ) {\r\n\r\n const fullWidth = view.fullWidth,\r\n fullHeight = view.fullHeight;\r\n\r\n left += view.offsetX * width / fullWidth;\r\n top -= view.offsetY * height / fullHeight;\r\n width *= view.width / fullWidth;\r\n height *= view.height / fullHeight;\r\n\r\n }\r\n\r\n const skew = this.filmOffset;\r\n if ( skew !== 0 ) left += near * skew / this.getFilmWidth();\r\n\r\n // this part different to PerspectiveCamera\r\n let normalizedOrtho = -Math.pow(this.ortho - 1, 6) + 1;\r\n let orthoTop = Math.max(this.distance, 0.0001) * Math.tan( MathUtils.DEG2RAD * 0.5 * this.fov ) / this.zoom;\r\n let orthoHeight = 2 * orthoTop;\r\n let orthoWidth = this.aspect * orthoHeight;\r\n let orthoLeft = - 0.5 * orthoWidth;\r\n\r\n this.perspectiveProjection.makePerspective( left, left + width, top, top - height, near, this.far );\r\n this.ortographicProjection.makeOrthographic( orthoLeft, orthoLeft + orthoWidth, orthoTop, orthoTop - orthoHeight, near, this.far );\r\n\r\n for (let i = 0; i < 16; i++){\r\n this.projectionMatrix.elements[i] = (this.perspectiveProjection.elements[i] * (1 - normalizedOrtho)) + (this.ortographicProjection.elements[i] * normalizedOrtho);\r\n }\r\n // to here\r\n\r\n this.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\r\n\r\n this.needsUpdate = false;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n get isPerspectiveCamera() {\r\n return this.ortho < 1;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n get isOrthographicCamera() {\r\n return !this.isPerspectiveCamera;\r\n }\r\n\r\n /**\r\n * @returns {string}\r\n */\r\n get type() {\r\n return this.isPerspectiveCamera ? 'PerspectiveCamera' : 'OrthographicCamera';\r\n }\r\n\r\n /**\r\n * @param type {string}\r\n */\r\n set type(type) {\r\n //ignore\r\n }\r\n\r\n /**\r\n * @returns {number}\r\n */\r\n get ortho() {\r\n return this.data.ortho;\r\n }\r\n\r\n /**\r\n * @param value {number}\r\n */\r\n set ortho(value) {\r\n if (value !== this.data.ortho){\r\n this.data.ortho = value;\r\n this.needsUpdate = true;\r\n }\r\n }\r\n\r\n /**\r\n * @returns {number}\r\n */\r\n get distance() {\r\n return this.data.distance;\r\n }\r\n\r\n /**\r\n * @param value {number}\r\n */\r\n set distance(value) {\r\n if (value !== this.data.distance) {\r\n this.data.distance = value;\r\n this.needsUpdate = true;\r\n }\r\n }\r\n\r\n}","/**\r\n * @author mrdoob / http://mrdoob.com/\r\n *\r\n * adapted for bluemap's purposes\r\n */\r\n\r\nimport {\r\n Matrix4,\r\n Object3D, Vector2,\r\n Vector3\r\n} from \"three\";\r\nimport {dispatchEvent, htmlToElement} from \"./Utils\";\r\n\r\nvar CSS2DObject = function ( element ) {\r\n\r\n Object3D.call( this );\r\n\r\n this.element = document.createElement(\"div\");\r\n let parent = element.parentNode;\r\n parent.replaceChild(this.element, element);\r\n this.element.appendChild(element);\r\n\r\n this.element.style.position = 'absolute';\r\n\r\n this.anchor = new Vector2();\r\n\r\n this.events = null;\r\n\r\n this.addEventListener( 'removed', function () {\r\n\r\n this.traverse( function ( object ) {\r\n\r\n if ( object.element instanceof Element && object.element.parentNode !== null ) {\r\n\r\n object.element.parentNode.removeChild( object.element );\r\n\r\n }\r\n\r\n } );\r\n\r\n } );\r\n\r\n let lastClick = -1;\r\n let handleClick = event => {\r\n let doubleTap = false;\r\n\r\n let now = Date.now();\r\n if (now - lastClick < 500){\r\n doubleTap = true;\r\n }\r\n\r\n lastClick = now;\r\n\r\n let data = {doubleTap: doubleTap};\r\n\r\n if (this.onClick( {event: event, data: data} )) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n } else {\r\n // fire event\r\n dispatchEvent(this.events, \"bluemapMapInteraction\", {\r\n data: data,\r\n object: this,\r\n });\r\n }\r\n }\r\n\r\n this.element.addEventListener(\"click\", handleClick);\r\n this.element.addEventListener(\"touch\", handleClick);\r\n\r\n};\r\n\r\nCSS2DObject.prototype = Object.create( Object3D.prototype );\r\nCSS2DObject.prototype.constructor = CSS2DObject;\r\n\r\n//\r\n\r\nvar CSS2DRenderer = function (events = null) {\r\n\r\n var _this = this;\r\n\r\n var _width, _height;\r\n var _widthHalf, _heightHalf;\r\n\r\n var vector = new Vector3();\r\n var viewMatrix = new Matrix4();\r\n var viewProjectionMatrix = new Matrix4();\r\n\r\n var cache = {\r\n objects: new WeakMap()\r\n };\r\n\r\n var domElement = document.createElement( 'div' );\r\n domElement.style.overflow = 'hidden';\r\n\r\n this.domElement = domElement;\r\n\r\n this.events = events;\r\n\r\n this.getSize = function () {\r\n\r\n return {\r\n width: _width,\r\n height: _height\r\n };\r\n\r\n };\r\n\r\n this.setSize = function ( width, height ) {\r\n\r\n _width = width;\r\n _height = height;\r\n\r\n _widthHalf = _width / 2;\r\n _heightHalf = _height / 2;\r\n\r\n domElement.style.width = width + 'px';\r\n domElement.style.height = height + 'px';\r\n\r\n };\r\n\r\n var renderObject = function ( object, scene, camera, parentVisible ) {\r\n\r\n if ( object instanceof CSS2DObject ) {\r\n\r\n object.events = _this.events;\r\n\r\n object.onBeforeRender( _this, scene, camera );\r\n\r\n vector.setFromMatrixPosition( object.matrixWorld );\r\n vector.applyMatrix4( viewProjectionMatrix );\r\n\r\n var element = object.element;\r\n var style = 'translate(' + ( vector.x * _widthHalf + _widthHalf - object.anchor.x) + 'px,' + ( - vector.y * _heightHalf + _heightHalf - object.anchor.y ) + 'px)';\r\n\r\n element.style.WebkitTransform = style;\r\n element.style.MozTransform = style;\r\n element.style.oTransform = style;\r\n element.style.transform = style;\r\n\r\n element.style.display = ( parentVisible && object.visible && vector.z >= - 1 && vector.z <= 1 && element.style.opacity !== \"0\" ) ? '' : 'none';\r\n\r\n var objectData = {\r\n distanceToCameraSquared: getDistanceToSquared( camera, object )\r\n };\r\n\r\n cache.objects.set( object, objectData );\r\n\r\n if ( element.parentNode !== domElement ) {\r\n\r\n domElement.appendChild( element );\r\n\r\n }\r\n\r\n object.onAfterRender( _this, scene, camera );\r\n\r\n }\r\n\r\n for ( var i = 0, l = object.children.length; i < l; i ++ ) {\r\n\r\n renderObject( object.children[ i ], scene, camera, parentVisible && object.visible );\r\n\r\n }\r\n\r\n };\r\n\r\n var getDistanceToSquared = function () {\r\n\r\n var a = new Vector3();\r\n var b = new Vector3();\r\n\r\n return function ( object1, object2 ) {\r\n\r\n a.setFromMatrixPosition( object1.matrixWorld );\r\n b.setFromMatrixPosition( object2.matrixWorld );\r\n\r\n return a.distanceToSquared( b );\r\n\r\n };\r\n\r\n }();\r\n\r\n var filterAndFlatten = function ( scene ) {\r\n\r\n var result = [];\r\n\r\n scene.traverse( function ( object ) {\r\n\r\n if ( object instanceof CSS2DObject ) result.push( object );\r\n\r\n } );\r\n\r\n return result;\r\n\r\n };\r\n\r\n var zOrder = function ( scene ) {\r\n\r\n var sorted = filterAndFlatten( scene ).sort( function ( a, b ) {\r\n\r\n var distanceA = cache.objects.get( a ).distanceToCameraSquared;\r\n var distanceB = cache.objects.get( b ).distanceToCameraSquared;\r\n\r\n return distanceA - distanceB;\r\n\r\n } );\r\n\r\n var zMax = sorted.length;\r\n\r\n for ( var i = 0, l = sorted.length; i < l; i ++ ) {\r\n\r\n sorted[ i ].element.style.zIndex = zMax - i;\r\n\r\n }\r\n\r\n };\r\n\r\n this.render = function ( scene, camera ) {\r\n\r\n if ( scene.autoUpdate === true ) scene.updateMatrixWorld();\r\n if ( camera.parent === null ) camera.updateMatrixWorld();\r\n\r\n viewMatrix.copy( camera.matrixWorldInverse );\r\n viewProjectionMatrix.multiplyMatrices( camera.projectionMatrix, viewMatrix );\r\n\r\n renderObject( scene, scene, camera, true );\r\n zOrder( scene );\r\n\r\n };\r\n\r\n};\r\n\r\nexport { CSS2DObject, CSS2DRenderer };","import {\r\n\tShaderLib,\r\n\tShaderMaterial,\r\n\tUniformsLib,\r\n\tUniformsUtils,\r\n\tVector2\r\n} from \"three\";\r\n/**\r\n * parameters = {\r\n * color: ,\r\n * linewidth: ,\r\n * dashed: ,\r\n * dashScale: ,\r\n * dashSize: ,\r\n * gapSize: ,\r\n * resolution: , // to be set by renderer\r\n * }\r\n */\r\n\r\nUniformsLib.line = {\r\n\r\n\tlinewidth: { value: 1 },\r\n\tresolution: { value: new Vector2( 1, 1 ) },\r\n\tdashScale: { value: 1 },\r\n\tdashSize: { value: 1 },\r\n\tgapSize: { value: 1 },\r\n\topacity: { value: 1 }\r\n\r\n};\r\n\r\nShaderLib[ 'line' ] = {\r\n\r\n\tuniforms: UniformsUtils.merge( [\r\n\t\tUniformsLib.common,\r\n\t\tUniformsLib.fog,\r\n\t\tUniformsLib.line\r\n\t] ),\r\n\r\n\tvertexShader:\r\n\t\t`\r\n\t\t#include \r\n\t\t#include \r\n\t\t#include \r\n\t\t#include \r\n\t\t#include \r\n\r\n\t\tuniform float linewidth;\r\n\t\tuniform vec2 resolution;\r\n\r\n\t\tattribute vec3 instanceStart;\r\n\t\tattribute vec3 instanceEnd;\r\n\r\n\t\tattribute vec3 instanceColorStart;\r\n\t\tattribute vec3 instanceColorEnd;\r\n\r\n\t\tvarying vec2 vUv;\r\n\t\t\r\n\t\tvarying float vDistance;\r\n\r\n\t\t#ifdef USE_DASH\r\n\r\n\t\t\tuniform float dashScale;\r\n\t\t\tattribute float instanceDistanceStart;\r\n\t\t\tattribute float instanceDistanceEnd;\r\n\t\t\tvarying float vLineDistance;\r\n\r\n\t\t#endif\r\n\r\n\t\tvoid trimSegment( const in vec4 start, inout vec4 end ) {\r\n\r\n\t\t\t// trim end segment so it terminates between the camera plane and the near plane\r\n\r\n\t\t\t// conservative estimate of the near plane\r\n\t\t\tfloat a = projectionMatrix[ 2 ][ 2 ]; // 3nd entry in 3th column\r\n\t\t\tfloat b = projectionMatrix[ 3 ][ 2 ]; // 3nd entry in 4th column\r\n\t\t\tfloat nearEstimate = - 0.5 * b / a;\r\n\r\n\t\t\tfloat alpha = ( nearEstimate - start.z ) / ( end.z - start.z );\r\n\r\n\t\t\tend.xyz = mix( start.xyz, end.xyz, alpha );\r\n\r\n\t\t}\r\n\r\n\t\tvoid main() {\r\n\r\n\t\t\t#ifdef USE_COLOR\r\n\r\n\t\t\t\tvColor.xyz = ( position.y < 0.5 ) ? instanceColorStart : instanceColorEnd;\r\n\r\n\t\t\t#endif\r\n\r\n\t\t\t#ifdef USE_DASH\r\n\r\n\t\t\t\tvLineDistance = ( position.y < 0.5 ) ? dashScale * instanceDistanceStart : dashScale * instanceDistanceEnd;\r\n\r\n\t\t\t#endif\r\n\r\n\t\t\tfloat aspect = resolution.x / resolution.y;\r\n\r\n\t\t\tvUv = uv;\r\n\r\n\t\t\t// camera space\r\n\t\t\tvec4 start = modelViewMatrix * vec4( instanceStart, 1.0 );\r\n\t\t\tvec4 end = modelViewMatrix * vec4( instanceEnd, 1.0 );\r\n\r\n\t\t\t// special case for perspective projection, and segments that terminate either in, or behind, the camera plane\r\n\t\t\t// clearly the gpu firmware has a way of addressing this issue when projecting into ndc space\r\n\t\t\t// but we need to perform ndc-space calculations in the shader, so we must address this issue directly\r\n\t\t\t// perhaps there is a more elegant solution -- WestLangley\r\n\r\n\t\t\tbool perspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 ); // 4th entry in the 3rd column\r\n\r\n\t\t\tif ( perspective ) {\r\n\r\n\t\t\t\tif ( start.z < 0.0 && end.z >= 0.0 ) {\r\n\r\n\t\t\t\t\ttrimSegment( start, end );\r\n\r\n\t\t\t\t} else if ( end.z < 0.0 && start.z >= 0.0 ) {\r\n\r\n\t\t\t\t\ttrimSegment( end, start );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// clip space\r\n\t\t\tvec4 clipStart = projectionMatrix * start;\r\n\t\t\tvec4 clipEnd = projectionMatrix * end;\r\n\r\n\t\t\t// ndc space\r\n\t\t\tvec2 ndcStart = clipStart.xy / clipStart.w;\r\n\t\t\tvec2 ndcEnd = clipEnd.xy / clipEnd.w;\r\n\r\n\t\t\t// direction\r\n\t\t\tvec2 dir = ndcEnd - ndcStart;\r\n\r\n\t\t\t// account for clip-space aspect ratio\r\n\t\t\tdir.x *= aspect;\r\n\t\t\tdir = normalize( dir );\r\n\r\n\t\t\t// perpendicular to dir\r\n\t\t\tvec2 offset = vec2( dir.y, - dir.x );\r\n\r\n\t\t\t// undo aspect ratio adjustment\r\n\t\t\tdir.x /= aspect;\r\n\t\t\toffset.x /= aspect;\r\n\r\n\t\t\t// sign flip\r\n\t\t\tif ( position.x < 0.0 ) offset *= - 1.0;\r\n\r\n\t\t\t// endcaps\r\n\t\t\tif ( position.y < 0.0 ) {\r\n\r\n\t\t\t\toffset += - dir;\r\n\r\n\t\t\t} else if ( position.y > 1.0 ) {\r\n\r\n\t\t\t\toffset += dir;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// adjust for linewidth\r\n\t\t\toffset *= linewidth;\r\n\r\n\t\t\t// adjust for clip-space to screen-space conversion // maybe resolution should be based on viewport ...\r\n\t\t\toffset /= resolution.y;\r\n\r\n\t\t\t// select end\r\n\t\t\tvec4 clip = ( position.y < 0.5 ) ? clipStart : clipEnd;\r\n\r\n\t\t\t// back to clip space\r\n\t\t\toffset *= clip.w;\r\n\r\n\t\t\tclip.xy += offset;\r\n\r\n\t\t\tgl_Position = clip;\r\n\r\n\t\t\tvec4 mvPosition = ( position.y < 0.5 ) ? start : end; // this is an approximation\r\n\t\t\t\r\n\t\t\tvDistance = -mvPosition.z;\r\n\r\n\t\t\t#include \r\n\t\t\t#include \r\n\t\t\t#include \r\n\r\n\t\t}\r\n\t\t`,\r\n\r\n\tfragmentShader:\r\n\t\t`\r\n\t\t#define FLT_MAX 3.402823466e+38\r\n\r\n\t\tuniform vec3 diffuse;\r\n\t\tuniform float opacity;\r\n\t\t\r\n\t\tuniform float fadeDistanceMax;\r\n\t\tuniform float fadeDistanceMin;\r\n\r\n\t\t#ifdef USE_DASH\r\n\r\n\t\t\tuniform float dashSize;\r\n\t\t\tuniform float gapSize;\r\n\r\n\t\t#endif\r\n\r\n\t\tvarying float vLineDistance;\r\n\r\n\t\t#include \r\n\t\t#include \r\n\t\t#include \r\n\t\t#include \r\n\t\t#include \r\n\r\n\t\tvarying vec2 vUv;\r\n\t\t\r\n\t\tvarying float vDistance;\r\n\r\n\t\tvoid main() {\r\n\r\n\t\t\t#include \r\n\r\n\t\t\t#ifdef USE_DASH\r\n\r\n\t\t\t\tif ( vUv.y < - 1.0 || vUv.y > 1.0 ) discard; // discard endcaps\r\n\r\n\t\t\t\tif ( mod( vLineDistance, dashSize + gapSize ) > dashSize ) discard; // todo - FIX\r\n\r\n\t\t\t#endif\r\n\r\n\t\t\tif ( abs( vUv.y ) > 1.0 ) {\r\n\r\n\t\t\t\tfloat a = vUv.x;\r\n\t\t\t\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\r\n\t\t\t\tfloat len2 = a * a + b * b;\r\n\r\n\t\t\t\tif ( len2 > 1.0 ) discard;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// distance fading\r\n\t\t\tfloat fdMax = FLT_MAX;\r\n\t\t\tif ( fadeDistanceMax > 0.0 ) fdMax = fadeDistanceMax;\r\n\t\t\t\r\n\t\t\tfloat minDelta = (vDistance - fadeDistanceMin) / fadeDistanceMin;\r\n\t\t\tfloat maxDelta = (vDistance - fadeDistanceMax) / (fadeDistanceMax * 0.5);\r\n\t\t\tfloat distanceOpacity = min(\r\n\t\t\t\tclamp(minDelta, 0.0, 1.0),\r\n\t\t\t\t1.0 - clamp(maxDelta + 1.0, 0.0, 1.0)\r\n\t\t\t);\r\n\r\n\t\t\tvec4 diffuseColor = vec4( diffuse, opacity * distanceOpacity );\r\n\r\n\t\t\t#include \r\n\t\t\t#include \r\n\r\n\t\t\tgl_FragColor = vec4( diffuseColor.rgb, diffuseColor.a );\r\n\r\n\t\t\t#include \r\n\t\t\t#include \r\n\t\t\t#include \r\n\t\t\t#include \r\n\r\n\t\t}\r\n\t\t`\r\n};\r\n\r\nvar LineMaterial = function ( parameters ) {\r\n\r\n\tShaderMaterial.call( this, {\r\n\r\n\t\ttype: 'LineMaterial',\r\n\r\n\t\tuniforms: UniformsUtils.clone( ShaderLib[ 'line' ].uniforms ),\r\n\r\n\t\tvertexShader: ShaderLib[ 'line' ].vertexShader,\r\n\t\tfragmentShader: ShaderLib[ 'line' ].fragmentShader,\r\n\r\n\t\tclipping: true // required for clipping support\r\n\r\n\t} );\r\n\r\n\tthis.dashed = false;\r\n\r\n\tObject.defineProperties( this, {\r\n\r\n\t\tcolor: {\r\n\r\n\t\t\tenumerable: true,\r\n\r\n\t\t\tget: function () {\r\n\r\n\t\t\t\treturn this.uniforms.diffuse.value;\r\n\r\n\t\t\t},\r\n\r\n\t\t\tset: function ( value ) {\r\n\r\n\t\t\t\tthis.uniforms.diffuse.value = value;\r\n\r\n\t\t\t}\r\n\r\n\t\t},\r\n\r\n\t\tlinewidth: {\r\n\r\n\t\t\tenumerable: true,\r\n\r\n\t\t\tget: function () {\r\n\r\n\t\t\t\treturn this.uniforms.linewidth.value;\r\n\r\n\t\t\t},\r\n\r\n\t\t\tset: function ( value ) {\r\n\r\n\t\t\t\tthis.uniforms.linewidth.value = value;\r\n\r\n\t\t\t}\r\n\r\n\t\t},\r\n\r\n\t\tdashScale: {\r\n\r\n\t\t\tenumerable: true,\r\n\r\n\t\t\tget: function () {\r\n\r\n\t\t\t\treturn this.uniforms.dashScale.value;\r\n\r\n\t\t\t},\r\n\r\n\t\t\tset: function ( value ) {\r\n\r\n\t\t\t\tthis.uniforms.dashScale.value = value;\r\n\r\n\t\t\t}\r\n\r\n\t\t},\r\n\r\n\t\tdashSize: {\r\n\r\n\t\t\tenumerable: true,\r\n\r\n\t\t\tget: function () {\r\n\r\n\t\t\t\treturn this.uniforms.dashSize.value;\r\n\r\n\t\t\t},\r\n\r\n\t\t\tset: function ( value ) {\r\n\r\n\t\t\t\tthis.uniforms.dashSize.value = value;\r\n\r\n\t\t\t}\r\n\r\n\t\t},\r\n\r\n\t\tgapSize: {\r\n\r\n\t\t\tenumerable: true,\r\n\r\n\t\t\tget: function () {\r\n\r\n\t\t\t\treturn this.uniforms.gapSize.value;\r\n\r\n\t\t\t},\r\n\r\n\t\t\tset: function ( value ) {\r\n\r\n\t\t\t\tthis.uniforms.gapSize.value = value;\r\n\r\n\t\t\t}\r\n\r\n\t\t},\r\n\r\n\t\topacity: {\r\n\r\n\t\t\tenumerable: true,\r\n\r\n\t\t\tget: function () {\r\n\r\n\t\t\t\treturn this.uniforms.opacity.value;\r\n\r\n\t\t\t},\r\n\r\n\t\t\tset: function ( value ) {\r\n\r\n\t\t\t\tthis.uniforms.opacity.value = value;\r\n\r\n\t\t\t}\r\n\r\n\t\t},\r\n\r\n\t\tresolution: {\r\n\r\n\t\t\tenumerable: true,\r\n\r\n\t\t\tget: function () {\r\n\r\n\t\t\t\treturn this.uniforms.resolution.value;\r\n\r\n\t\t\t},\r\n\r\n\t\t\tset: function ( value ) {\r\n\r\n\t\t\t\tthis.uniforms.resolution.value.copy( value );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t} );\r\n\r\n\tthis.setValues( parameters );\r\n\r\n};\r\n\r\nLineMaterial.prototype = Object.create( ShaderMaterial.prototype );\r\nLineMaterial.prototype.constructor = LineMaterial;\r\n\r\nLineMaterial.prototype.isLineMaterial = true;\r\n\r\nexport { LineMaterial };\r\n","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the 'Software'), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport { ShaderChunk } from 'three';\r\n\r\nexport const MARKER_FILL_VERTEX_SHADER = `\r\n#include \r\n${ShaderChunk.logdepthbuf_pars_vertex}\r\n\r\nvarying vec3 vPosition;\r\n//varying vec3 vWorldPosition;\r\n//varying vec3 vNormal;\r\n//varying vec2 vUv;\r\n//varying vec3 vColor;\r\nvarying float vDistance;\r\n\r\nvoid main() {\r\n\tvec4 worldPos = modelMatrix * vec4(position, 1);\r\n\tvec4 viewPos = viewMatrix * worldPos;\r\n\t\r\n\tvPosition = position;\r\n\t//vWorldPosition = worldPos.xyz;\r\n\t//vNormal = normal;\r\n\t//vUv = uv;\r\n\t//vColor = vec3(1.0);\r\n\tvDistance = -viewPos.z;\r\n\t\r\n\tgl_Position = projectionMatrix * viewPos;\r\n\t\r\n\t${ShaderChunk.logdepthbuf_vertex} \r\n}\r\n`;\r\n","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the 'Software'), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport { ShaderChunk } from 'three';\r\n\r\nexport const MARKER_FILL_FRAGMENT_SHADER = `\r\n${ShaderChunk.logdepthbuf_pars_fragment}\r\n\r\n#define FLT_MAX 3.402823466e+38\r\n\r\nvarying vec3 vPosition;\r\n//varying vec3 vWorldPosition;\r\n//varying vec3 vNormal;\r\n//varying vec2 vUv;\r\n//varying vec3 vColor;\r\nvarying float vDistance;\r\n\r\nuniform vec3 markerColor;\r\nuniform float markerOpacity;\r\n\r\nuniform float fadeDistanceMax;\r\nuniform float fadeDistanceMin;\r\n\r\nvoid main() {\r\n\tvec4 color = vec4(markerColor, markerOpacity);\r\n\t\r\n\t// distance fading\r\n\tfloat fdMax = FLT_MAX;\r\n\tif ( fadeDistanceMax > 0.0 ) fdMax = fadeDistanceMax;\r\n\t\r\n\tfloat minDelta = (vDistance - fadeDistanceMin) / fadeDistanceMin;\r\n\tfloat maxDelta = (vDistance - fadeDistanceMax) / (fadeDistanceMax * 0.5);\r\n\tfloat distanceOpacity = min(\r\n\t\tclamp(minDelta, 0.0, 1.0),\r\n\t\t1.0 - clamp(maxDelta + 1.0, 0.0, 1.0)\r\n\t);\r\n\t\r\n\tcolor.a *= distanceOpacity;\r\n\t\r\n\t// apply vertex-color\r\n\t//color.rgb *= vColor.rgb;\r\n\t\r\n\tgl_FragColor = color;\r\n\t\r\n\t${ShaderChunk.logdepthbuf_fragment}\r\n}\r\n`;\r\n","import {\r\n\tBox3,\r\n\tFloat32BufferAttribute,\r\n\tInstancedBufferGeometry,\r\n\tInstancedInterleavedBuffer,\r\n\tInterleavedBufferAttribute,\r\n\tSphere,\r\n\tVector3,\r\n\tWireframeGeometry\r\n} from \"three\";\r\n\r\nvar LineSegmentsGeometry = function () {\r\n\r\n\tInstancedBufferGeometry.call( this );\r\n\r\n\tthis.type = 'LineSegmentsGeometry';\r\n\r\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 ];\r\n\tvar uvs = [ - 1, 2, 1, 2, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 2, 1, - 2 ];\r\n\tvar index = [ 0, 2, 1, 2, 3, 1, 2, 4, 3, 4, 5, 3, 4, 6, 5, 6, 7, 5 ];\r\n\r\n\tthis.setIndex( index );\r\n\tthis.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\r\n\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\r\n\r\n};\r\n\r\nLineSegmentsGeometry.prototype = Object.assign( Object.create( InstancedBufferGeometry.prototype ), {\r\n\r\n\tconstructor: LineSegmentsGeometry,\r\n\r\n\tisLineSegmentsGeometry: true,\r\n\r\n\tapplyMatrix4: function ( matrix ) {\r\n\r\n\t\tvar start = this.attributes.instanceStart;\r\n\t\tvar end = this.attributes.instanceEnd;\r\n\r\n\t\tif ( start !== undefined ) {\r\n\r\n\t\t\tstart.applyMatrix4( matrix );\r\n\r\n\t\t\tend.applyMatrix4( matrix );\r\n\r\n\t\t\tstart.needsUpdate = true;\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.boundingBox !== null ) {\r\n\r\n\t\t\tthis.computeBoundingBox();\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.boundingSphere !== null ) {\r\n\r\n\t\t\tthis.computeBoundingSphere();\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetPositions: function ( array ) {\r\n\r\n\t\tvar lineSegments;\r\n\r\n\t\tif ( array instanceof Float32Array ) {\r\n\r\n\t\t\tlineSegments = array;\r\n\r\n\t\t} else if ( Array.isArray( array ) ) {\r\n\r\n\t\t\tlineSegments = new Float32Array( array );\r\n\r\n\t\t}\r\n\r\n\t\tvar instanceBuffer = new InstancedInterleavedBuffer( lineSegments, 6, 1 ); // xyz, xyz\r\n\r\n\t\tthis.setAttribute( 'instanceStart', new InterleavedBufferAttribute( instanceBuffer, 3, 0 ) ); // xyz\r\n\t\tthis.setAttribute( 'instanceEnd', new InterleavedBufferAttribute( instanceBuffer, 3, 3 ) ); // xyz\r\n\r\n\t\t//\r\n\r\n\t\tthis.computeBoundingBox();\r\n\t\tthis.computeBoundingSphere();\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetColors: function ( array ) {\r\n\r\n\t\tvar colors;\r\n\r\n\t\tif ( array instanceof Float32Array ) {\r\n\r\n\t\t\tcolors = array;\r\n\r\n\t\t} else if ( Array.isArray( array ) ) {\r\n\r\n\t\t\tcolors = new Float32Array( array );\r\n\r\n\t\t}\r\n\r\n\t\tvar instanceColorBuffer = new InstancedInterleavedBuffer( colors, 6, 1 ); // rgb, rgb\r\n\r\n\t\tthis.setAttribute( 'instanceColorStart', new InterleavedBufferAttribute( instanceColorBuffer, 3, 0 ) ); // rgb\r\n\t\tthis.setAttribute( 'instanceColorEnd', new InterleavedBufferAttribute( instanceColorBuffer, 3, 3 ) ); // rgb\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tfromWireframeGeometry: function ( geometry ) {\r\n\r\n\t\tthis.setPositions( geometry.attributes.position.array );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tfromEdgesGeometry: function ( geometry ) {\r\n\r\n\t\tthis.setPositions( geometry.attributes.position.array );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tfromMesh: function ( mesh ) {\r\n\r\n\t\tthis.fromWireframeGeometry( new WireframeGeometry( mesh.geometry ) );\r\n\r\n\t\t// set colors, maybe\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tfromLineSegments: function ( lineSegments ) {\r\n\r\n\t\tvar geometry = lineSegments.geometry;\r\n\r\n\t\tif ( geometry.isGeometry ) {\r\n\r\n\t\t\tthis.setPositions( geometry.vertices );\r\n\r\n\t\t} else if ( geometry.isBufferGeometry ) {\r\n\r\n\t\t\tthis.setPositions( geometry.attributes.position.array ); // assumes non-indexed\r\n\r\n\t\t}\r\n\r\n\t\t// set colors, maybe\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcomputeBoundingBox: function () {\r\n\r\n\t\tvar box = new Box3();\r\n\r\n\t\treturn function computeBoundingBox() {\r\n\r\n\t\t\tif ( this.boundingBox === null ) {\r\n\r\n\t\t\t\tthis.boundingBox = new Box3();\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar start = this.attributes.instanceStart;\r\n\t\t\tvar end = this.attributes.instanceEnd;\r\n\r\n\t\t\tif ( start !== undefined && end !== undefined ) {\r\n\r\n\t\t\t\tthis.boundingBox.setFromBufferAttribute( start );\r\n\r\n\t\t\t\tbox.setFromBufferAttribute( end );\r\n\r\n\t\t\t\tthis.boundingBox.union( box );\r\n\r\n\t\t\t}\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tcomputeBoundingSphere: function () {\r\n\r\n\t\tvar vector = new Vector3();\r\n\r\n\t\treturn function computeBoundingSphere() {\r\n\r\n\t\t\tif ( this.boundingSphere === null ) {\r\n\r\n\t\t\t\tthis.boundingSphere = new Sphere();\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( this.boundingBox === null ) {\r\n\r\n\t\t\t\tthis.computeBoundingBox();\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar start = this.attributes.instanceStart;\r\n\t\t\tvar end = this.attributes.instanceEnd;\r\n\r\n\t\t\tif ( start !== undefined && end !== undefined ) {\r\n\r\n\t\t\t\tvar center = this.boundingSphere.center;\r\n\r\n\t\t\t\tthis.boundingBox.getCenter( center );\r\n\r\n\t\t\t\tvar maxRadiusSq = 0;\r\n\r\n\t\t\t\tfor ( var i = 0, il = start.count; i < il; i ++ ) {\r\n\r\n\t\t\t\t\tvector.fromBufferAttribute( start, i );\r\n\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );\r\n\r\n\t\t\t\t\tvector.fromBufferAttribute( end, i );\r\n\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\r\n\r\n\t\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\r\n\r\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 );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\ttoJSON: function () {\r\n\r\n\t},\r\n\r\n\tapplyMatrix: function ( matrix ) {\r\n\r\n\t\tconsole.warn( 'THREE.LineSegmentsGeometry: applyMatrix() has been renamed to applyMatrix4().' );\r\n\r\n\t\treturn this.applyMatrix4( matrix );\r\n\r\n\t}\r\n\r\n} );\r\n\r\nexport { LineSegmentsGeometry };\r\n","\r\nimport { LineSegmentsGeometry } from \"./LineSegmentsGeometry\";\r\n\r\nvar LineGeometry = function () {\r\n\r\n\tLineSegmentsGeometry.call( this );\r\n\r\n\tthis.type = 'LineGeometry';\r\n\r\n};\r\n\r\nLineGeometry.prototype = Object.assign( Object.create( LineSegmentsGeometry.prototype ), {\r\n\r\n\tconstructor: LineGeometry,\r\n\r\n\tisLineGeometry: true,\r\n\r\n\tsetPositions: function ( array ) {\r\n\r\n\t\t// converts [ x1, y1, z1, x2, y2, z2, ... ] to pairs format\r\n\r\n\t\tvar length = array.length - 3;\r\n\t\tvar points = new Float32Array( 2 * length );\r\n\r\n\t\tfor ( var i = 0; i < length; i += 3 ) {\r\n\r\n\t\t\tpoints[ 2 * i ] = array[ i ];\r\n\t\t\tpoints[ 2 * i + 1 ] = array[ i + 1 ];\r\n\t\t\tpoints[ 2 * i + 2 ] = array[ i + 2 ];\r\n\r\n\t\t\tpoints[ 2 * i + 3 ] = array[ i + 3 ];\r\n\t\t\tpoints[ 2 * i + 4 ] = array[ i + 4 ];\r\n\t\t\tpoints[ 2 * i + 5 ] = array[ i + 5 ];\r\n\r\n\t\t}\r\n\r\n\t\tLineSegmentsGeometry.prototype.setPositions.call( this, points );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetColors: function ( array ) {\r\n\r\n\t\t// converts [ r1, g1, b1, r2, g2, b2, ... ] to pairs format\r\n\r\n\t\tvar length = array.length - 3;\r\n\t\tvar colors = new Float32Array( 2 * length );\r\n\r\n\t\tfor ( var i = 0; i < length; i += 3 ) {\r\n\r\n\t\t\tcolors[ 2 * i ] = array[ i ];\r\n\t\t\tcolors[ 2 * i + 1 ] = array[ i + 1 ];\r\n\t\t\tcolors[ 2 * i + 2 ] = array[ i + 2 ];\r\n\r\n\t\t\tcolors[ 2 * i + 3 ] = array[ i + 3 ];\r\n\t\t\tcolors[ 2 * i + 4 ] = array[ i + 4 ];\r\n\t\t\tcolors[ 2 * i + 5 ] = array[ i + 5 ];\r\n\r\n\t\t}\r\n\r\n\t\tLineSegmentsGeometry.prototype.setColors.call( this, colors );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tfromLine: function ( line ) {\r\n\r\n\t\tvar geometry = line.geometry;\r\n\r\n\t\tif ( geometry.isGeometry ) {\r\n\r\n\t\t\tthis.setPositions( geometry.vertices );\r\n\r\n\t\t} else if ( geometry.isBufferGeometry ) {\r\n\r\n\t\t\tthis.setPositions( geometry.attributes.position.array ); // assumes non-indexed\r\n\r\n\t\t}\r\n\r\n\t\t// set colors, maybe\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcopy: function ( /* source */ ) {\r\n\r\n\t\treturn this;\r\n\r\n\t}\r\n\r\n} );\r\n\r\nexport { LineGeometry };\r\n","import {\r\n\tInstancedInterleavedBuffer,\r\n\tInterleavedBufferAttribute,\r\n\tLine3,\r\n\tMathUtils,\r\n\tMatrix4,\r\n\tMesh,\r\n\tVector3,\r\n\tVector4\r\n} from \"three\";\r\nimport { LineSegmentsGeometry } from \"./LineSegmentsGeometry\";\r\nimport { LineMaterial } from \"./LineMaterial\";\r\n\r\nvar LineSegments2 = function ( geometry, material ) {\r\n\r\n\tif ( geometry === undefined ) geometry = new LineSegmentsGeometry();\r\n\tif ( material === undefined ) material = new LineMaterial( { color: Math.random() * 0xffffff } );\r\n\r\n\tMesh.call( this, geometry, material );\r\n\r\n\tthis.type = 'LineSegments2';\r\n\r\n};\r\n\r\nLineSegments2.prototype = Object.assign( Object.create( Mesh.prototype ), {\r\n\r\n\tconstructor: LineSegments2,\r\n\r\n\tisLineSegments2: true,\r\n\r\n\tcomputeLineDistances: ( function () { // for backwards-compatability, but could be a method of LineSegmentsGeometry...\r\n\r\n\t\tvar start = new Vector3();\r\n\t\tvar end = new Vector3();\r\n\r\n\t\treturn function computeLineDistances() {\r\n\r\n\t\t\tvar geometry = this.geometry;\r\n\r\n\t\t\tvar instanceStart = geometry.attributes.instanceStart;\r\n\t\t\tvar instanceEnd = geometry.attributes.instanceEnd;\r\n\t\t\tvar lineDistances = new Float32Array( 2 * instanceStart.data.count );\r\n\r\n\t\t\tfor ( var i = 0, j = 0, l = instanceStart.data.count; i < l; i ++, j += 2 ) {\r\n\r\n\t\t\t\tstart.fromBufferAttribute( instanceStart, i );\r\n\t\t\t\tend.fromBufferAttribute( instanceEnd, i );\r\n\r\n\t\t\t\tlineDistances[ j ] = ( j === 0 ) ? 0 : lineDistances[ j - 1 ];\r\n\t\t\t\tlineDistances[ j + 1 ] = lineDistances[ j ] + start.distanceTo( end );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar instanceDistanceBuffer = new InstancedInterleavedBuffer( lineDistances, 2, 1 ); // d0, d1\r\n\r\n\t\t\tgeometry.setAttribute( 'instanceDistanceStart', new InterleavedBufferAttribute( instanceDistanceBuffer, 1, 0 ) ); // d0\r\n\t\t\tgeometry.setAttribute( 'instanceDistanceEnd', new InterleavedBufferAttribute( instanceDistanceBuffer, 1, 1 ) ); // d1\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}() ),\r\n\r\n\traycast: ( function () {\r\n\r\n\t\tvar start = new Vector4();\r\n\t\tvar end = new Vector4();\r\n\r\n\t\tvar ssOrigin = new Vector4();\r\n\t\tvar ssOrigin3 = new Vector3();\r\n\t\tvar mvMatrix = new Matrix4();\r\n\t\tvar line = new Line3();\r\n\t\tvar closestPoint = new Vector3();\r\n\r\n\t\treturn function raycast( raycaster, intersects ) {\r\n\r\n\t\t\tif ( raycaster.camera === null ) {\r\n\r\n\t\t\t\tconsole.error( 'LineSegments2: \"Raycaster.camera\" needs to be set in order to raycast against LineSegments2.' );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar threshold = ( raycaster.params.Line2 !== undefined ) ? raycaster.params.Line2.threshold || 0 : 0;\r\n\r\n\t\t\tvar ray = raycaster.ray;\r\n\t\t\tvar camera = raycaster.camera;\r\n\t\t\tvar projectionMatrix = camera.projectionMatrix;\r\n\r\n\t\t\tvar geometry = this.geometry;\r\n\t\t\tvar material = this.material;\r\n\t\t\tvar resolution = material.resolution;\r\n\t\t\tvar lineWidth = material.linewidth + threshold;\r\n\r\n\t\t\tvar instanceStart = geometry.attributes.instanceStart;\r\n\t\t\tvar instanceEnd = geometry.attributes.instanceEnd;\r\n\r\n\t\t\t// pick a point 1 unit out along the ray to avoid the ray origin\r\n\t\t\t// sitting at the camera origin which will cause \"w\" to be 0 when\r\n\t\t\t// applying the projection matrix.\r\n\t\t\tray.at( 1, ssOrigin );\r\n\r\n\t\t\t// ndc space [ - 1.0, 1.0 ]\r\n\t\t\tssOrigin.w = 1;\r\n\t\t\tssOrigin.applyMatrix4( camera.matrixWorldInverse );\r\n\t\t\tssOrigin.applyMatrix4( projectionMatrix );\r\n\t\t\tssOrigin.multiplyScalar( 1 / ssOrigin.w );\r\n\r\n\t\t\t// screen space\r\n\t\t\tssOrigin.x *= resolution.x / 2;\r\n\t\t\tssOrigin.y *= resolution.y / 2;\r\n\t\t\tssOrigin.z = 0;\r\n\r\n\t\t\tssOrigin3.copy( ssOrigin );\r\n\r\n\t\t\tvar matrixWorld = this.matrixWorld;\r\n\t\t\tmvMatrix.multiplyMatrices( camera.matrixWorldInverse, matrixWorld );\r\n\r\n\t\t\tfor ( var i = 0, l = instanceStart.count; i < l; i ++ ) {\r\n\r\n\t\t\t\tstart.fromBufferAttribute( instanceStart, i );\r\n\t\t\t\tend.fromBufferAttribute( instanceEnd, i );\r\n\r\n\t\t\t\tstart.w = 1;\r\n\t\t\t\tend.w = 1;\r\n\r\n\t\t\t\t// camera space\r\n\t\t\t\tstart.applyMatrix4( mvMatrix );\r\n\t\t\t\tend.applyMatrix4( mvMatrix );\r\n\r\n\t\t\t\t// clip space\r\n\t\t\t\tstart.applyMatrix4( projectionMatrix );\r\n\t\t\t\tend.applyMatrix4( projectionMatrix );\r\n\r\n\t\t\t\t// ndc space [ - 1.0, 1.0 ]\r\n\t\t\t\tstart.multiplyScalar( 1 / start.w );\r\n\t\t\t\tend.multiplyScalar( 1 / end.w );\r\n\r\n\t\t\t\t// skip the segment if it's outside the camera near and far planes\r\n\t\t\t\tvar isBehindCameraNear = start.z < - 1 && end.z < - 1;\r\n\t\t\t\tvar isPastCameraFar = start.z > 1 && end.z > 1;\r\n\t\t\t\tif ( isBehindCameraNear || isPastCameraFar ) {\r\n\r\n\t\t\t\t\tcontinue;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// screen space\r\n\t\t\t\tstart.x *= resolution.x / 2;\r\n\t\t\t\tstart.y *= resolution.y / 2;\r\n\r\n\t\t\t\tend.x *= resolution.x / 2;\r\n\t\t\t\tend.y *= resolution.y / 2;\r\n\r\n\t\t\t\t// create 2d segment\r\n\t\t\t\tline.start.copy( start );\r\n\t\t\t\tline.start.z = 0;\r\n\r\n\t\t\t\tline.end.copy( end );\r\n\t\t\t\tline.end.z = 0;\r\n\r\n\t\t\t\t// get closest point on ray to segment\r\n\t\t\t\tvar param = line.closestPointToPointParameter( ssOrigin3, true );\r\n\t\t\t\tline.at( param, closestPoint );\r\n\r\n\t\t\t\t// check if the intersection point is within clip space\r\n\t\t\t\tvar zPos = MathUtils.lerp( start.z, end.z, param );\r\n\t\t\t\tvar isInClipSpace = zPos >= - 1 && zPos <= 1;\r\n\r\n\t\t\t\tvar isInside = ssOrigin3.distanceTo( closestPoint ) < lineWidth * 0.5;\r\n\r\n\t\t\t\tif ( isInClipSpace && isInside ) {\r\n\r\n\t\t\t\t\tline.start.fromBufferAttribute( instanceStart, i );\r\n\t\t\t\t\tline.end.fromBufferAttribute( instanceEnd, i );\r\n\r\n\t\t\t\t\tline.start.applyMatrix4( matrixWorld );\r\n\t\t\t\t\tline.end.applyMatrix4( matrixWorld );\r\n\r\n\t\t\t\t\tvar pointOnLine = new Vector3();\r\n\t\t\t\t\tvar point = new Vector3();\r\n\r\n\t\t\t\t\tray.distanceSqToSegment( line.start, line.end, point, pointOnLine );\r\n\r\n\t\t\t\t\tintersects.push( {\r\n\r\n\t\t\t\t\t\tpoint: point,\r\n\t\t\t\t\t\tpointOnLine: pointOnLine,\r\n\t\t\t\t\t\tdistance: ray.origin.distanceTo( point ),\r\n\r\n\t\t\t\t\t\tobject: this,\r\n\t\t\t\t\t\tface: null,\r\n\t\t\t\t\t\tfaceIndex: i,\r\n\t\t\t\t\t\tuv: null,\r\n\t\t\t\t\t\tuv2: null,\r\n\r\n\t\t\t\t\t} );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t};\r\n\r\n\t}() )\r\n\r\n} );\r\n\r\nexport { LineSegments2 };\r\n","\r\nimport { LineSegments2 } from \"./LineSegments2\";\r\nimport { LineGeometry } from \"./LineGeometry\";\r\nimport { LineMaterial } from \"./LineMaterial\";\r\n\r\nvar Line2 = function ( geometry, material ) {\r\n\r\n\tif ( geometry === undefined ) geometry = new LineGeometry();\r\n\tif ( material === undefined ) material = new LineMaterial( { color: Math.random() * 0xffffff } );\r\n\r\n\tLineSegments2.call( this, geometry, material );\r\n\r\n\tthis.type = 'Line2';\r\n\r\n};\r\n\r\nLine2.prototype = Object.assign( Object.create( LineSegments2.prototype ), {\r\n\r\n\tconstructor: Line2,\r\n\r\n\tisLine2: true\r\n\r\n} );\r\n\r\nexport { Line2 };\r\n","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport {MathUtils, Object3D, Vector3} from \"three\";\r\n\r\nexport class Marker extends Object3D {\r\n\r\n /**\r\n * @param markerId {string}\r\n */\r\n constructor(markerId) {\r\n super();\r\n Object.defineProperty(this, 'isMarker', {value: true});\r\n\r\n this.data = {\r\n id: markerId,\r\n type: \"marker\",\r\n position: this.position,\r\n visible: this.visible\r\n };\r\n\r\n // redirect parent properties\r\n Object.defineProperty(this, \"position\", {\r\n get() { return this.data.position },\r\n set(value) { this.data.position = value }\r\n });\r\n Object.defineProperty(this, \"visible\", {\r\n get() { return this.data.visible },\r\n set(value) { this.data.visible = value }\r\n });\r\n }\r\n\r\n dispose() {}\r\n\r\n /**\r\n * Updates this marker from the provided data object, usually parsed form json from a markers.json\r\n * @param markerData {object}\r\n */\r\n updateFromData(markerData) {}\r\n\r\n // -- helper methods --\r\n\r\n static _posRelativeToCamera = new Vector3();\r\n static _cameraDirection = new Vector3();\r\n\r\n /**\r\n * @param position {Vector3}\r\n * @param camera {THREE.Camera}\r\n * @param fadeDistanceMax {number}\r\n * @param fadeDistanceMin {number}\r\n * @returns {number} - opacity between 0 and 1\r\n */\r\n static calculateDistanceOpacity(position, camera, fadeDistanceMin, fadeDistanceMax) {\r\n let distance = Marker.calculateDistanceToCameraPlane(position, camera);\r\n let minDelta = (distance - fadeDistanceMin) / fadeDistanceMin;\r\n let maxDelta = (distance - fadeDistanceMax) / (fadeDistanceMax * 0.5);\r\n return Math.min(\r\n MathUtils.clamp(minDelta, 0, 1),\r\n 1 - MathUtils.clamp(maxDelta + 1, 0, 1)\r\n );\r\n }\r\n\r\n /**\r\n * @param position {Vector3}\r\n * @param camera {THREE.Camera}\r\n * @returns {number}\r\n */\r\n static calculateDistanceToCameraPlane (position, camera) {\r\n Marker._posRelativeToCamera.subVectors(position, camera.position);\r\n camera.getWorldDirection(Marker._cameraDirection);\r\n return Marker._posRelativeToCamera.dot(Marker._cameraDirection);\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport {Marker} from \"./Marker\";\r\nimport {CSS2DObject} from \"../util/CSS2DRenderer\";\r\nimport {animate, htmlToElement} from \"../util/Utils\";\r\nimport {Vector3} from \"three\";\r\n\r\nexport class ObjectMarker extends Marker {\r\n\r\n /**\r\n * @param markerId {string}\r\n */\r\n constructor(markerId) {\r\n super(markerId);\r\n Object.defineProperty(this, 'isObjectMarker', {value: true});\r\n this.data.type = \"object\";\r\n\r\n this.data.label = null;\r\n this.data.detail = null;\r\n this.data.link = null;\r\n this.data.newTab = true;\r\n\r\n this.lastClick = -1;\r\n }\r\n\r\n onClick(event) {\r\n let pos = new Vector3();\r\n if (event.intersection) {\r\n pos.copy(event.intersection.pointOnLine || event.intersection.point);\r\n pos.sub(this.position);\r\n }\r\n\r\n if (event.data.doubleTap) return false;\r\n\r\n if (this.data.detail || this.data.label) {\r\n let popup = new LabelPopup(this.data.detail || this.data.label);\r\n popup.position.copy(pos);\r\n this.add(popup);\r\n popup.open();\r\n }\r\n\r\n if (this.data.link){\r\n window.open(this.data.link, this.data.newTab ? '_blank' : '_self');\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @param markerData {{\r\n * position: {x: number, y: number, z: number},\r\n * label: string,\r\n * detail: string,\r\n * link: string,\r\n * newTab: boolean\r\n * }}\r\n */\r\n updateFromData(markerData) {\r\n\r\n // update position\r\n let pos = markerData.position || {};\r\n this.position.setX(pos.x || 0);\r\n this.position.setY(pos.y || 0);\r\n this.position.setZ(pos.z || 0);\r\n\r\n // update label\r\n this.data.label = markerData.label || null;\r\n\r\n //update detail\r\n this.data.detail = markerData.detail || null;\r\n\r\n // update link\r\n this.data.link = markerData.link || null;\r\n this.data.newTab = !!markerData.newTab;\r\n }\r\n\r\n}\r\n\r\nexport class LabelPopup extends CSS2DObject {\r\n\r\n /**\r\n * @param label {string}\r\n */\r\n constructor(label) {\r\n super(htmlToElement(`
${label}
`));\r\n }\r\n\r\n /**\r\n * @param autoClose {boolean} - whether this object should be automatically closed and removed again on any other interaction\r\n */\r\n open(autoClose = true) {\r\n let targetOpacity = this.element.style.opacity || 1;\r\n\r\n this.element.style.opacity = 0;\r\n let inAnimation = animate(progress => {\r\n this.element.style.opacity = (progress * targetOpacity).toString();\r\n }, 300);\r\n\r\n if (autoClose) {\r\n let removeHandler = evt => {\r\n if (evt.composedPath().includes(this.element)) return;\r\n\r\n inAnimation.cancel();\r\n this.close();\r\n\r\n window.removeEventListener(\"mousedown\", removeHandler);\r\n window.removeEventListener(\"touchstart\", removeHandler);\r\n window.removeEventListener(\"keydown\", removeHandler);\r\n window.removeEventListener(\"mousewheel\", removeHandler);\r\n };\r\n\r\n window.addEventListener(\"mousedown\", removeHandler);\r\n window.addEventListener(\"touchstart\", removeHandler);\r\n window.addEventListener(\"keydown\", removeHandler);\r\n window.addEventListener(\"mousewheel\", removeHandler);\r\n }\r\n }\r\n\r\n /**\r\n * @param remove {boolean} - whether this object should be removed from its parent when the close-animation finished\r\n */\r\n close(remove = true) {\r\n let startOpacity = parseFloat(this.element.style.opacity);\r\n\r\n animate(progress => {\r\n this.element.style.opacity = (startOpacity - progress * startOpacity).toString();\r\n }, 300, completed => {\r\n if (remove && completed && this.parent) {\r\n this.parent.remove(this);\r\n }\r\n });\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport {Color, DoubleSide, Mesh, ShaderMaterial, Shape, ShapeBufferGeometry, Vector2} from \"three\";\r\nimport {LineMaterial} from \"../util/lines/LineMaterial\";\r\nimport {MARKER_FILL_VERTEX_SHADER} from \"./MarkerFillVertexShader\";\r\nimport {MARKER_FILL_FRAGMENT_SHADER} from \"./MarkerFillFragmentShader\";\r\nimport {LineGeometry} from \"../util/lines/LineGeometry\";\r\nimport {Line2} from \"../util/lines/Line2\";\r\nimport {deepEquals} from \"../util/Utils\";\r\nimport {ObjectMarker} from \"./ObjectMarker\";\r\n\r\nexport class ShapeMarker extends ObjectMarker {\r\n\r\n /**\r\n * @param markerId {string}\r\n */\r\n constructor(markerId) {\r\n super(markerId);\r\n Object.defineProperty(this, 'isShapeMarker', {value: true});\r\n this.data.type = \"shape\";\r\n\r\n let zero = new Vector2();\r\n let shape = new Shape([zero, zero, zero]);\r\n this.fill = new ShapeMarkerFill(shape);\r\n this.border = new ShapeMarkerBorder(shape);\r\n this.border.renderOrder = -1; // render border before fill\r\n\r\n this.add(this.border, this.fill);\r\n\r\n this._markerData = {};\r\n }\r\n\r\n /**\r\n * @param y {number}\r\n */\r\n setShapeY(y) {\r\n let relativeY = y - this.position.y;\r\n this.fill.position.y = relativeY;\r\n this.border.position.y = relativeY;\r\n }\r\n\r\n /**\r\n * @param shape {Shape}\r\n */\r\n setShape(shape) {\r\n this.fill.updateGeometry(shape);\r\n this.border.updateGeometry(shape);\r\n }\r\n\r\n /**\r\n * @typedef {{r: number, g: number, b: number, a: number}} ColorLike\r\n */\r\n\r\n /**\r\n * @param markerData {{\r\n * position: {x: number, y: number, z: number},\r\n * label: string,\r\n * detail: string,\r\n * shape: {x: number, z: number}[],\r\n * shapeY: number,\r\n * height: number,\r\n * link: string,\r\n * newTab: boolean,\r\n * depthTest: boolean,\r\n * lineWidth: number,\r\n * borderColor: ColorLike,\r\n * lineColor: ColorLike,\r\n * fillColor: ColorLike,\r\n * minDistance: number,\r\n * maxDistance: number\r\n * }}\r\n */\r\n updateFromData(markerData) {\r\n super.updateFromData(markerData);\r\n\r\n // update shape only if needed, based on last update-data\r\n if (\r\n !this._markerData.shape || !deepEquals(markerData.shape, this._markerData.shape) ||\r\n !this._markerData.position || !deepEquals(markerData.position, this._markerData.position)\r\n ){\r\n this.setShape(this.createShapeFromData(markerData.shape));\r\n }\r\n\r\n // update shapeY\r\n this.setShapeY((markerData.shapeY || markerData.height || 0) + 0.01); //\"height\" for backwards compatibility, adding 0.01 to avoid z-fighting\r\n\r\n // update depthTest\r\n this.border.depthTest = !!markerData.depthTest;\r\n this.fill.depthTest = !!markerData.depthTest;\r\n\r\n // update border-width\r\n this.border.linewidth = markerData.lineWidth !== undefined ? markerData.lineWidth : 2;\r\n\r\n // update border-color\r\n let bc = markerData.lineColor || markerData.borderColor || {}; //\"borderColor\" for backwards compatibility\r\n this.border.color.setRGB((bc.r || 0) / 255, (bc.g || 0) / 255, (bc.b || 0) / 255);\r\n this.border.opacity = bc.a || 0;\r\n\r\n // update fill-color\r\n let fc = markerData.fillColor || {};\r\n this.fill.color.setRGB((fc.r || 0) / 255, (fc.g || 0) / 255, (fc.b || 0) / 255);\r\n this.fill.opacity = fc.a || 0;\r\n\r\n // update min/max distances\r\n let minDist = markerData.minDistance || 0;\r\n let maxDist = markerData.maxDistance !== undefined ? markerData.maxDistance : Number.MAX_VALUE;\r\n this.border.fadeDistanceMin = minDist;\r\n this.border.fadeDistanceMax = maxDist;\r\n this.fill.fadeDistanceMin = minDist;\r\n this.fill.fadeDistanceMax = maxDist;\r\n\r\n // save used marker data for next update\r\n this._markerData = markerData;\r\n }\r\n\r\n dispose() {\r\n super.dispose();\r\n\r\n this.fill.dispose();\r\n this.border.dispose();\r\n }\r\n\r\n /**\r\n * @private\r\n * Creates a shape from a data object, usually parsed json from a markers.json\r\n * @param shapeData {object}\r\n * @returns {Shape}\r\n */\r\n createShapeFromData(shapeData) {\r\n /** @type {THREE.Vector2[]} **/\r\n let points = [];\r\n\r\n if (Array.isArray(shapeData)){\r\n shapeData.forEach(point => {\r\n let x = (point.x || 0) - this.position.x;\r\n let z = (point.z || 0) - this.position.z;\r\n\r\n points.push(new Vector2(x, z));\r\n });\r\n }\r\n\r\n return new Shape(points);\r\n }\r\n\r\n}\r\n\r\nclass ShapeMarkerFill extends Mesh {\r\n\r\n /**\r\n * @param shape {Shape}\r\n */\r\n constructor(shape) {\r\n let geometry = ShapeMarkerFill.createGeometry(shape);\r\n let material = new ShaderMaterial({\r\n vertexShader: MARKER_FILL_VERTEX_SHADER,\r\n fragmentShader: MARKER_FILL_FRAGMENT_SHADER,\r\n side: DoubleSide,\r\n depthTest: true,\r\n transparent: true,\r\n uniforms: {\r\n markerColor: { value: new Color() },\r\n markerOpacity: { value: 0 },\r\n fadeDistanceMin: { value: 0 },\r\n fadeDistanceMax: { value: Number.MAX_VALUE },\r\n }\r\n });\r\n\r\n super(geometry, material);\r\n }\r\n\r\n /**\r\n * @returns {Color}\r\n */\r\n get color(){\r\n return this.material.uniforms.markerColor.value;\r\n }\r\n\r\n /**\r\n * @returns {number}\r\n */\r\n get opacity() {\r\n return this.material.uniforms.markerOpacity.value;\r\n }\r\n\r\n /**\r\n * @param opacity {number}\r\n */\r\n set opacity(opacity) {\r\n this.material.uniforms.markerOpacity.value = opacity;\r\n this.visible = opacity > 0;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n get depthTest() {\r\n return this.material.depthTest;\r\n }\r\n\r\n /**\r\n * @param test {boolean}\r\n */\r\n set depthTest(test) {\r\n this.material.depthTest = test;\r\n }\r\n\r\n /**\r\n * @returns {number}\r\n */\r\n get fadeDistanceMin() {\r\n return this.material.uniforms.fadeDistanceMin.value;\r\n }\r\n\r\n /**\r\n * @param min {number}\r\n */\r\n set fadeDistanceMin(min) {\r\n this.material.uniforms.fadeDistanceMin.value = min;\r\n }\r\n\r\n /**\r\n * @returns {number}\r\n */\r\n get fadeDistanceMax() {\r\n return this.material.uniforms.fadeDistanceMax.value;\r\n }\r\n\r\n /**\r\n * @param max {number}\r\n */\r\n set fadeDistanceMax(max) {\r\n this.material.uniforms.fadeDistanceMax.value = max;\r\n }\r\n\r\n onClick(event) {\r\n if (event.intersection) {\r\n if (event.intersection.distance > this.fadeDistanceMax) return false;\r\n if (event.intersection.distance < this.fadeDistanceMin) return false;\r\n }\r\n\r\n return super.onClick(event);\r\n }\r\n\r\n /**\r\n * @param shape {Shape}\r\n */\r\n updateGeometry(shape) {\r\n this.geometry.dispose();\r\n this.geometry = ShapeMarkerFill.createGeometry(shape);\r\n }\r\n\r\n dispose() {\r\n this.geometry.dispose();\r\n this.material.dispose();\r\n }\r\n\r\n /**\r\n * @param shape {Shape}\r\n * @returns {ShapeBufferGeometry}\r\n */\r\n static createGeometry(shape) {\r\n let geometry = new ShapeBufferGeometry(shape, 5);\r\n geometry.rotateX(Math.PI / 2); //make y to z\r\n\r\n return geometry;\r\n }\r\n\r\n}\r\n\r\nclass ShapeMarkerBorder extends Line2 {\r\n\r\n /**\r\n * @param shape {Shape}\r\n */\r\n constructor(shape) {\r\n let geometry = new LineGeometry();\r\n geometry.setPositions(ShapeMarkerBorder.createLinePoints(shape));\r\n\r\n let material = new LineMaterial({\r\n color: new Color(),\r\n opacity: 0,\r\n transparent: true,\r\n linewidth: 1,\r\n depthTest: true,\r\n vertexColors: false,\r\n dashed: false,\r\n });\r\n material.uniforms.fadeDistanceMin = { value: 0 };\r\n material.uniforms.fadeDistanceMax = { value: Number.MAX_VALUE };\r\n\r\n material.resolution.set(window.innerWidth, window.innerHeight);\r\n\r\n super(geometry, material);\r\n\r\n this.computeLineDistances();\r\n }\r\n\r\n /**\r\n * @returns {Color}\r\n */\r\n get color(){\r\n return this.material.color;\r\n }\r\n\r\n /**\r\n * @returns {number}\r\n */\r\n get opacity() {\r\n return this.material.opacity;\r\n }\r\n\r\n /**\r\n * @param opacity {number}\r\n */\r\n set opacity(opacity) {\r\n this.material.opacity = opacity;\r\n this.visible = opacity > 0;\r\n }\r\n\r\n /**\r\n * @returns {number}\r\n */\r\n get linewidth() {\r\n return this.material.linewidth;\r\n }\r\n\r\n /**\r\n * @param width {number}\r\n */\r\n set linewidth(width) {\r\n this.material.linewidth = width;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n get depthTest() {\r\n return this.material.depthTest;\r\n }\r\n\r\n /**\r\n * @param test {boolean}\r\n */\r\n set depthTest(test) {\r\n this.material.depthTest = test;\r\n }\r\n\r\n /**\r\n * @returns {number}\r\n */\r\n get fadeDistanceMin() {\r\n return this.material.uniforms.fadeDistanceMin.value;\r\n }\r\n\r\n /**\r\n * @param min {number}\r\n */\r\n set fadeDistanceMin(min) {\r\n this.material.uniforms.fadeDistanceMin.value = min;\r\n }\r\n\r\n /**\r\n * @returns {number}\r\n */\r\n get fadeDistanceMax() {\r\n return this.material.uniforms.fadeDistanceMax.value;\r\n }\r\n\r\n /**\r\n * @param max {number}\r\n */\r\n set fadeDistanceMax(max) {\r\n this.material.uniforms.fadeDistanceMax.value = max;\r\n }\r\n\r\n onClick(event) {\r\n if (event.intersection) {\r\n if (event.intersection.distance > this.fadeDistanceMax) return false;\r\n if (event.intersection.distance < this.fadeDistanceMin) return false;\r\n }\r\n\r\n return super.onClick(event);\r\n }\r\n\r\n /**\r\n * @param shape {Shape}\r\n */\r\n updateGeometry(shape) {\r\n this.geometry = new LineGeometry();\r\n this.geometry.setPositions(ShapeMarkerBorder.createLinePoints(shape));\r\n this.computeLineDistances();\r\n }\r\n\r\n /**\r\n * @param renderer {THREE.WebGLRenderer}\r\n */\r\n onBeforeRender(renderer) {\r\n renderer.getSize(this.material.resolution);\r\n }\r\n\r\n dispose() {\r\n this.geometry.dispose();\r\n this.material.dispose();\r\n }\r\n\r\n /**\r\n * @param shape {Shape}\r\n * @returns {number[]}\r\n */\r\n static createLinePoints(shape) {\r\n let points3d = [];\r\n let points = shape.getPoints(5);\r\n points.forEach(point => points3d.push(point.x, 0, point.y));\r\n points3d.push(points[0].x, 0, points[0].y);\r\n\r\n return points3d;\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport {Color, DoubleSide, ExtrudeBufferGeometry, Mesh, ShaderMaterial, Shape, Vector2} from \"three\";\r\nimport {LineMaterial} from \"../util/lines/LineMaterial\";\r\nimport {MARKER_FILL_VERTEX_SHADER} from \"./MarkerFillVertexShader\";\r\nimport {MARKER_FILL_FRAGMENT_SHADER} from \"./MarkerFillFragmentShader\";\r\nimport {Line2} from \"../util/lines/Line2\";\r\nimport {deepEquals} from \"../util/Utils\";\r\nimport {LineSegmentsGeometry} from \"../util/lines/LineSegmentsGeometry\";\r\nimport {ObjectMarker} from \"./ObjectMarker\";\r\n\r\nexport class ExtrudeMarker extends ObjectMarker {\r\n\r\n /**\r\n * @param markerId {string}\r\n */\r\n constructor(markerId) {\r\n super(markerId);\r\n Object.defineProperty(this, 'isExtrudeMarker', {value: true});\r\n this.data.type = \"extrude\";\r\n\r\n let zero = new Vector2();\r\n let shape = new Shape([zero, zero, zero]);\r\n this.fill = new ExtrudeMarkerFill(shape);\r\n this.border = new ExtrudeMarkerBorder(shape);\r\n this.border.renderOrder = -1; // render border before fill\r\n\r\n this.add(this.border, this.fill);\r\n\r\n this._markerData = {};\r\n }\r\n\r\n /**\r\n * @param minY {number}\r\n * @param maxY {number}\r\n */\r\n setShapeY(minY, maxY) {\r\n let relativeY = maxY - this.position.y;\r\n let height = maxY - minY;\r\n this.fill.position.y = relativeY;\r\n this.border.position.y = relativeY;\r\n this.fill.scale.y = height;\r\n this.border.scale.y = height;\r\n }\r\n\r\n /**\r\n * @param shape {Shape}\r\n */\r\n setShape(shape) {\r\n this.fill.updateGeometry(shape);\r\n this.border.updateGeometry(shape);\r\n }\r\n\r\n /**\r\n * @typedef {{r: number, g: number, b: number, a: number}} ColorLike\r\n */\r\n\r\n /**\r\n * @param markerData {{\r\n * position: {x: number, y: number, z: number},\r\n * label: string,\r\n * detail: string,\r\n * shape: {x: number, z: number}[],\r\n * shapeMinY: number,\r\n * shapeMaxY: number,\r\n * link: string,\r\n * newTab: boolean,\r\n * depthTest: boolean,\r\n * lineWidth: number,\r\n * lineColor: ColorLike,\r\n * fillColor: ColorLike,\r\n * minDistance: number,\r\n * maxDistance: number\r\n * }}\r\n */\r\n updateFromData(markerData) {\r\n super.updateFromData(markerData);\r\n\r\n // update shape only if needed, based on last update-data\r\n if (\r\n !this._markerData.shape || !deepEquals(markerData.shape, this._markerData.shape) ||\r\n !this._markerData.position || !deepEquals(markerData.position, this._markerData.position)\r\n ){\r\n this.setShape(this.createShapeFromData(markerData.shape));\r\n }\r\n\r\n // update shapeY\r\n this.setShapeY((markerData.shapeMinY || 0) - 0.01, (markerData.shapeMaxY || 0) + 0.01); // offset by 0.01 to avoid z-fighting\r\n\r\n // update depthTest\r\n this.border.depthTest = !!markerData.depthTest;\r\n this.fill.depthTest = !!markerData.depthTest;\r\n\r\n // update border-width\r\n this.border.linewidth = markerData.lineWidth !== undefined ? markerData.lineWidth : 2;\r\n\r\n // update border-color\r\n let bc = markerData.lineColor || {};\r\n this.border.color.setRGB((bc.r || 0) / 255, (bc.g || 0) / 255, (bc.b || 0) / 255);\r\n this.border.opacity = bc.a || 0;\r\n\r\n // update fill-color\r\n let fc = markerData.fillColor || {};\r\n this.fill.color.setRGB((fc.r || 0) / 255, (fc.g || 0) / 255, (fc.b || 0) / 255);\r\n this.fill.opacity = fc.a || 0;\r\n\r\n // update min/max distances\r\n let minDist = markerData.minDistance || 0;\r\n let maxDist = markerData.maxDistance !== undefined ? markerData.maxDistance : Number.MAX_VALUE;\r\n this.border.fadeDistanceMin = minDist;\r\n this.border.fadeDistanceMax = maxDist;\r\n this.fill.fadeDistanceMin = minDist;\r\n this.fill.fadeDistanceMax = maxDist;\r\n\r\n // save used marker data for next update\r\n this._markerData = markerData;\r\n }\r\n\r\n dispose() {\r\n super.dispose();\r\n\r\n this.fill.dispose();\r\n this.border.dispose();\r\n }\r\n\r\n /**\r\n * @private\r\n * Creates a shape from a data object, usually parsed json from a markers.json\r\n * @param shapeData {object}\r\n * @returns {Shape}\r\n */\r\n createShapeFromData(shapeData) {\r\n /** @type {THREE.Vector2[]} **/\r\n let points = [];\r\n\r\n if (Array.isArray(shapeData)){\r\n shapeData.forEach(point => {\r\n let x = (point.x || 0) - this.position.x + 0.01; // offset by 0.01 to avoid z-fighting\r\n let z = (point.z || 0) - this.position.z + 0.01;\r\n\r\n points.push(new Vector2(x, z));\r\n });\r\n }\r\n\r\n return new Shape(points);\r\n }\r\n\r\n}\r\n\r\nclass ExtrudeMarkerFill extends Mesh {\r\n\r\n /**\r\n * @param shape {Shape}\r\n */\r\n constructor(shape) {\r\n let geometry = ExtrudeMarkerFill.createGeometry(shape);\r\n let material = new ShaderMaterial({\r\n vertexShader: MARKER_FILL_VERTEX_SHADER,\r\n fragmentShader: MARKER_FILL_FRAGMENT_SHADER,\r\n side: DoubleSide,\r\n depthTest: true,\r\n transparent: true,\r\n uniforms: {\r\n markerColor: { value: new Color() },\r\n markerOpacity: { value: 0 },\r\n fadeDistanceMin: { value: 0 },\r\n fadeDistanceMax: { value: Number.MAX_VALUE },\r\n }\r\n });\r\n\r\n super(geometry, material);\r\n }\r\n\r\n /**\r\n * @returns {Color}\r\n */\r\n get color(){\r\n return this.material.uniforms.markerColor.value;\r\n }\r\n\r\n /**\r\n * @returns {number}\r\n */\r\n get opacity() {\r\n return this.material.uniforms.markerOpacity.value;\r\n }\r\n\r\n /**\r\n * @param opacity {number}\r\n */\r\n set opacity(opacity) {\r\n this.material.uniforms.markerOpacity.value = opacity;\r\n this.visible = opacity > 0;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n get depthTest() {\r\n return this.material.depthTest;\r\n }\r\n\r\n /**\r\n * @param test {boolean}\r\n */\r\n set depthTest(test) {\r\n this.material.depthTest = test;\r\n }\r\n\r\n /**\r\n * @returns {number}\r\n */\r\n get fadeDistanceMin() {\r\n return this.material.uniforms.fadeDistanceMin.value;\r\n }\r\n\r\n /**\r\n * @param min {number}\r\n */\r\n set fadeDistanceMin(min) {\r\n this.material.uniforms.fadeDistanceMin.value = min;\r\n }\r\n\r\n /**\r\n * @returns {number}\r\n */\r\n get fadeDistanceMax() {\r\n return this.material.uniforms.fadeDistanceMax.value;\r\n }\r\n\r\n /**\r\n * @param max {number}\r\n */\r\n set fadeDistanceMax(max) {\r\n this.material.uniforms.fadeDistanceMax.value = max;\r\n }\r\n\r\n onClick(event) {\r\n if (event.intersection) {\r\n if (event.intersection.distance > this.fadeDistanceMax) return false;\r\n if (event.intersection.distance < this.fadeDistanceMin) return false;\r\n }\r\n\r\n return super.onClick(event);\r\n }\r\n\r\n /**\r\n * @param shape {Shape}\r\n */\r\n updateGeometry(shape) {\r\n this.geometry.dispose();\r\n this.geometry = ExtrudeMarkerFill.createGeometry(shape);\r\n }\r\n\r\n dispose() {\r\n this.geometry.dispose();\r\n this.material.dispose();\r\n }\r\n\r\n /**\r\n * @param shape {Shape}\r\n * @returns {ExtrudeBufferGeometry}\r\n */\r\n static createGeometry(shape) {\r\n let geometry = new ExtrudeBufferGeometry(shape, {\r\n depth: 1,\r\n steps: 5,\r\n bevelEnabled: false\r\n });\r\n geometry.rotateX(Math.PI / 2); //make y to z\r\n\r\n return geometry;\r\n }\r\n\r\n}\r\n\r\nclass ExtrudeMarkerBorder extends Line2 {\r\n\r\n /**\r\n * @param shape {Shape}\r\n */\r\n constructor(shape) {\r\n let geometry = new LineSegmentsGeometry();\r\n geometry.setPositions(ExtrudeMarkerBorder.createLinePoints(shape));\r\n\r\n let material = new LineMaterial({\r\n color: new Color(),\r\n opacity: 0,\r\n transparent: true,\r\n linewidth: 1,\r\n depthTest: true,\r\n vertexColors: false,\r\n dashed: false,\r\n });\r\n material.uniforms.fadeDistanceMin = { value: 0 };\r\n material.uniforms.fadeDistanceMax = { value: Number.MAX_VALUE };\r\n\r\n material.resolution.set(window.innerWidth, window.innerHeight);\r\n\r\n super(geometry, material);\r\n\r\n this.computeLineDistances();\r\n }\r\n\r\n /**\r\n * @returns {Color}\r\n */\r\n get color(){\r\n return this.material.color;\r\n }\r\n\r\n /**\r\n * @returns {number}\r\n */\r\n get opacity() {\r\n return this.material.opacity;\r\n }\r\n\r\n /**\r\n * @param opacity {number}\r\n */\r\n set opacity(opacity) {\r\n this.material.opacity = opacity;\r\n this.visible = opacity > 0;\r\n }\r\n\r\n /**\r\n * @returns {number}\r\n */\r\n get linewidth() {\r\n return this.material.linewidth;\r\n }\r\n\r\n /**\r\n * @param width {number}\r\n */\r\n set linewidth(width) {\r\n this.material.linewidth = width;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n get depthTest() {\r\n return this.material.depthTest;\r\n }\r\n\r\n /**\r\n * @param test {boolean}\r\n */\r\n set depthTest(test) {\r\n this.material.depthTest = test;\r\n }\r\n\r\n /**\r\n * @returns {number}\r\n */\r\n get fadeDistanceMin() {\r\n return this.material.uniforms.fadeDistanceMin.value;\r\n }\r\n\r\n /**\r\n * @param min {number}\r\n */\r\n set fadeDistanceMin(min) {\r\n this.material.uniforms.fadeDistanceMin.value = min;\r\n }\r\n\r\n /**\r\n * @returns {number}\r\n */\r\n get fadeDistanceMax() {\r\n return this.material.uniforms.fadeDistanceMax.value;\r\n }\r\n\r\n /**\r\n * @param max {number}\r\n */\r\n set fadeDistanceMax(max) {\r\n this.material.uniforms.fadeDistanceMax.value = max;\r\n }\r\n\r\n onClick(event) {\r\n if (event.intersection) {\r\n if (event.intersection.distance > this.fadeDistanceMax) return false;\r\n if (event.intersection.distance < this.fadeDistanceMin) return false;\r\n }\r\n\r\n return super.onClick(event);\r\n }\r\n\r\n /**\r\n * @param shape {Shape}\r\n */\r\n updateGeometry(shape) {\r\n this.geometry = new LineSegmentsGeometry();\r\n this.geometry.setPositions(ExtrudeMarkerBorder.createLinePoints(shape));\r\n this.computeLineDistances();\r\n }\r\n\r\n /**\r\n * @param renderer {THREE.WebGLRenderer}\r\n */\r\n onBeforeRender(renderer) {\r\n renderer.getSize(this.material.resolution);\r\n }\r\n\r\n dispose() {\r\n this.geometry.dispose();\r\n this.material.dispose();\r\n }\r\n\r\n /**\r\n * @param shape {Shape}\r\n * @returns {number[]}\r\n */\r\n static createLinePoints(shape) {\r\n let points3d = [];\r\n let points = shape.getPoints(5);\r\n points.push(points[0]);\r\n\r\n let prevPoint = null;\r\n points.forEach(point => {\r\n\r\n // vertical line\r\n points3d.push(point.x, 0, point.y);\r\n points3d.push(point.x, -1, point.y);\r\n\r\n if (prevPoint) {\r\n // line to previous point top\r\n points3d.push(prevPoint.x, 0, prevPoint.y);\r\n points3d.push(point.x, 0, point.y);\r\n\r\n // line to previous point bottom\r\n points3d.push(prevPoint.x, -1, prevPoint.y);\r\n points3d.push(point.x, -1, point.y);\r\n }\r\n\r\n prevPoint = point;\r\n });\r\n\r\n return points3d;\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport {Color} from \"three\";\r\nimport {LineMaterial} from \"../util/lines/LineMaterial\";\r\nimport {LineGeometry} from \"../util/lines/LineGeometry\";\r\nimport {Line2} from \"../util/lines/Line2\";\r\nimport {deepEquals} from \"../util/Utils\";\r\nimport {ObjectMarker} from \"./ObjectMarker\";\r\n\r\nexport class LineMarker extends ObjectMarker {\r\n\r\n /**\r\n * @param markerId {string}\r\n */\r\n constructor(markerId) {\r\n super(markerId);\r\n Object.defineProperty(this, 'isLineMarker', {value: true});\r\n this.data.type = \"line\";\r\n\r\n this.line = new LineMarkerLine([0, 0, 0]);\r\n\r\n this.add(this.line);\r\n\r\n this._markerData = {};\r\n }\r\n\r\n /**\r\n * @param line {number[] | THREE.Vector3[] | THREE.Curve}\r\n */\r\n setLine(line) {\r\n /** @type {number[]} */\r\n let points;\r\n\r\n if (line.type === 'Curve' || line.type === 'CurvePath') {\r\n line = line.getPoints(5);\r\n }\r\n\r\n if (Array.isArray(line)) {\r\n if (line.length === 0){\r\n points = [];\r\n } else if (line[0].isVector3) {\r\n points = [];\r\n line.forEach(point => {\r\n points.push(point.x, point.y, point.z);\r\n });\r\n } else {\r\n points = line;\r\n }\r\n } else {\r\n throw new Error(\"Invalid argument type!\");\r\n }\r\n\r\n this.line.updateGeometry(points);\r\n }\r\n\r\n /**\r\n * @typedef {{r: number, g: number, b: number, a: number}} ColorLike\r\n */\r\n\r\n /**\r\n * @param markerData {{\r\n * position: {x: number, y: number, z: number},\r\n * label: string,\r\n * detail: string,\r\n * line: {x: number, y: number, z: number}[],\r\n * link: string,\r\n * newTab: boolean,\r\n * depthTest: boolean,\r\n * lineWidth: number,\r\n * lineColor: ColorLike,\r\n * minDistance: number,\r\n * maxDistance: number\r\n * }}\r\n */\r\n updateFromData(markerData) {\r\n super.updateFromData(markerData);\r\n\r\n // update shape only if needed, based on last update-data\r\n if (\r\n !this._markerData.line || !deepEquals(markerData.line, this._markerData.line) ||\r\n !this._markerData.position || !deepEquals(markerData.position, this._markerData.position)\r\n ){\r\n this.setLine(this.createPointsFromData(markerData.line));\r\n }\r\n\r\n // update depthTest\r\n this.line.depthTest = !!markerData.depthTest;\r\n\r\n // update border-width\r\n this.line.linewidth = markerData.lineWidth !== undefined ? markerData.lineWidth : 2;\r\n\r\n // update line-color\r\n let lc = markerData.lineColor || {};\r\n this.line.color.setRGB((lc.r || 0) / 255, (lc.g || 0) / 255, (lc.b || 0) / 255);\r\n this.line.opacity = lc.a || 0;\r\n\r\n // update min/max distances\r\n let minDist = markerData.minDistance || 0;\r\n let maxDist = markerData.maxDistance !== undefined ? markerData.maxDistance : Number.MAX_VALUE;\r\n this.line.fadeDistanceMin = minDist;\r\n this.line.fadeDistanceMax = maxDist;\r\n\r\n // save used marker data for next update\r\n this._markerData = markerData;\r\n }\r\n\r\n dispose() {\r\n super.dispose();\r\n\r\n this.line.dispose();\r\n }\r\n\r\n /**\r\n * @private\r\n * Creates a shape from a data object, usually parsed json from a markers.json\r\n * @param shapeData {object}\r\n * @returns {number[]}\r\n */\r\n createPointsFromData(shapeData) {\r\n /** @type {number[]} **/\r\n let points = [];\r\n\r\n if (Array.isArray(shapeData)){\r\n shapeData.forEach(point => {\r\n let x = (point.x || 0) - this.position.x;\r\n let y = (point.y || 0) - this.position.y;\r\n let z = (point.z || 0) - this.position.z;\r\n\r\n points.push(x, y, z);\r\n });\r\n }\r\n\r\n return points;\r\n }\r\n\r\n}\r\n\r\nclass LineMarkerLine extends Line2 {\r\n\r\n /**\r\n * @param points {number[]}\r\n */\r\n constructor(points) {\r\n let geometry = new LineGeometry();\r\n geometry.setPositions(points);\r\n\r\n let material = new LineMaterial({\r\n color: new Color(),\r\n opacity: 0,\r\n transparent: true,\r\n linewidth: 1,\r\n depthTest: true,\r\n vertexColors: false,\r\n dashed: false,\r\n });\r\n material.uniforms.fadeDistanceMin = { value: 0 };\r\n material.uniforms.fadeDistanceMax = { value: Number.MAX_VALUE };\r\n\r\n material.resolution.set(window.innerWidth, window.innerHeight);\r\n\r\n super(geometry, material);\r\n\r\n this.computeLineDistances();\r\n }\r\n\r\n /**\r\n * @returns {Color}\r\n */\r\n get color(){\r\n return this.material.color;\r\n }\r\n\r\n /**\r\n * @returns {number}\r\n */\r\n get opacity() {\r\n return this.material.opacity;\r\n }\r\n\r\n /**\r\n * @param opacity {number}\r\n */\r\n set opacity(opacity) {\r\n this.material.opacity = opacity;\r\n this.visible = opacity > 0;\r\n }\r\n\r\n /**\r\n * @returns {number}\r\n */\r\n get linewidth() {\r\n return this.material.linewidth;\r\n }\r\n\r\n /**\r\n * @param width {number}\r\n */\r\n set linewidth(width) {\r\n this.material.linewidth = width;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n get depthTest() {\r\n return this.material.depthTest;\r\n }\r\n\r\n /**\r\n * @param test {boolean}\r\n */\r\n set depthTest(test) {\r\n this.material.depthTest = test;\r\n }\r\n\r\n /**\r\n * @returns {number}\r\n */\r\n get fadeDistanceMin() {\r\n return this.material.uniforms.fadeDistanceMin.value;\r\n }\r\n\r\n /**\r\n * @param min {number}\r\n */\r\n set fadeDistanceMin(min) {\r\n this.material.uniforms.fadeDistanceMin.value = min;\r\n }\r\n\r\n /**\r\n * @returns {number}\r\n */\r\n get fadeDistanceMax() {\r\n return this.material.uniforms.fadeDistanceMax.value;\r\n }\r\n\r\n /**\r\n * @param max {number}\r\n */\r\n set fadeDistanceMax(max) {\r\n this.material.uniforms.fadeDistanceMax.value = max;\r\n }\r\n\r\n onClick(event) {\r\n if (event.intersection) {\r\n if (event.intersection.distance > this.fadeDistanceMax) return false;\r\n if (event.intersection.distance < this.fadeDistanceMin) return false;\r\n }\r\n\r\n return super.onClick(event);\r\n }\r\n\r\n /**\r\n * @param points {number[]}\r\n */\r\n updateGeometry(points) {\r\n this.geometry = new LineGeometry();\r\n this.geometry.setPositions(points);\r\n this.computeLineDistances();\r\n }\r\n\r\n /**\r\n * @param renderer {THREE.WebGLRenderer}\r\n */\r\n onBeforeRender(renderer) {\r\n renderer.getSize(this.material.resolution);\r\n }\r\n\r\n dispose() {\r\n this.geometry.dispose();\r\n this.material.dispose();\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport {Marker} from \"./Marker\";\r\nimport {CSS2DObject} from \"../util/CSS2DRenderer\";\r\nimport {htmlToElement} from \"../util/Utils\";\r\n\r\nexport class HtmlMarker extends Marker {\r\n\r\n /**\r\n * @param markerId {string}\r\n */\r\n constructor(markerId) {\r\n super(markerId);\r\n Object.defineProperty(this, 'isHtmlMarker', {value: true});\r\n this.data.type = \"html\";\r\n\r\n this.data.label = null;\r\n\r\n this.elementObject = new CSS2DObject(htmlToElement(`
`));\r\n this.elementObject.onBeforeRender = (renderer, scene, camera) => this.onBeforeRender(renderer, scene, camera);\r\n\r\n this.fadeDistanceMin = 0;\r\n this.fadeDistanceMax = Number.MAX_VALUE;\r\n\r\n this.addEventListener( 'removed', () => {\r\n if (this.element?.parentNode) this.element.parentNode.removeChild(this.element);\r\n });\r\n\r\n this.add(this.elementObject);\r\n }\r\n\r\n onBeforeRender(renderer, scene, camera) {\r\n if (this.fadeDistanceMax === Number.MAX_VALUE && this.fadeDistanceMin <= 0){\r\n this.element.style.opacity = undefined;\r\n } else {\r\n this.element.style.opacity = Marker.calculateDistanceOpacity(this.position, camera, this.fadeDistanceMin, this.fadeDistanceMax).toString();\r\n }\r\n }\r\n\r\n /**\r\n * @returns {string}\r\n */\r\n get html() {\r\n return this.element.innerHTML;\r\n }\r\n\r\n /**\r\n * @param html {string}\r\n */\r\n set html(html) {\r\n this.element.innerHTML = html;\r\n }\r\n\r\n /**\r\n * @returns {THREE.Vector2}\r\n */\r\n get anchor() {\r\n return this.elementObject.anchor;\r\n }\r\n\r\n /**\r\n * @returns {Element}\r\n */\r\n get element() {\r\n return this.elementObject.element.getElementsByTagName(\"div\")[0];\r\n }\r\n\r\n /**\r\n * @param markerData {{\r\n * position: {x: number, y: number, z: number},\r\n * label: string,\r\n * anchor: {x: number, y: number},\r\n * html: string,\r\n * minDistance: number,\r\n * maxDistance: number\r\n * }}\r\n */\r\n updateFromData(markerData) {\r\n\r\n // update position\r\n let pos = markerData.position || {};\r\n this.position.setX(pos.x || 0);\r\n this.position.setY(pos.y || 0);\r\n this.position.setZ(pos.z || 0);\r\n\r\n // update label\r\n this.data.label = markerData.label || null;\r\n\r\n // update anchor\r\n let anch = markerData.anchor || {};\r\n this.anchor.setX(anch.x || 0);\r\n this.anchor.setY(anch.y || 0);\r\n\r\n // update html\r\n if (this.element.innerHTML !== markerData.html){\r\n this.element.innerHTML = markerData.html;\r\n }\r\n\r\n // update min/max distances\r\n this.fadeDistanceMin = markerData.minDistance || 0;\r\n this.fadeDistanceMax = markerData.maxDistance !== undefined ? markerData.maxDistance : Number.MAX_VALUE;\r\n\r\n }\r\n\r\n dispose() {\r\n super.dispose();\r\n\r\n if (this.element.parentNode) this.element.parentNode.removeChild(this.element);\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport {HtmlMarker} from \"./HtmlMarker\";\r\n\r\nexport class PoiMarker extends HtmlMarker {\r\n\r\n /**\r\n * @param markerId {string}\r\n */\r\n constructor(markerId) {\r\n super(markerId);\r\n Object.defineProperty(this, 'isPoiMarker', {value: true});\r\n this.data.type = \"poi\";\r\n\r\n this.html = `\"POI
`;\r\n\r\n this.iconElement = this.element.getElementsByTagName(\"img\").item(0);\r\n this.labelElement = this.element.getElementsByTagName(\"div\").item(0);\r\n\r\n this._lastIcon = null;\r\n }\r\n\r\n onClick(event) {\r\n if (event.data.doubleTap) return false;\r\n\r\n if (this.highlight || !this.data.label) return true;\r\n this.highlight = true;\r\n\r\n let eventHandler = evt => {\r\n if (evt.composedPath().includes(this.element)) return;\r\n\r\n this.highlight = false;\r\n\r\n window.removeEventListener(\"mousedown\", eventHandler);\r\n window.removeEventListener(\"touchstart\", eventHandler);\r\n window.removeEventListener(\"keydown\", eventHandler);\r\n window.removeEventListener(\"mousewheel\", eventHandler);\r\n };\r\n\r\n setTimeout(function () {\r\n window.addEventListener(\"mousedown\", eventHandler);\r\n window.addEventListener(\"touchstart\", eventHandler);\r\n window.addEventListener(\"keydown\", eventHandler);\r\n window.addEventListener(\"mousewheel\", eventHandler);\r\n }, 0);\r\n\r\n return true;\r\n }\r\n\r\n set highlight(highlight) {\r\n if (highlight) {\r\n this.element.classList.add(\"bm-marker-highlight\");\r\n } else {\r\n this.element.classList.remove(\"bm-marker-highlight\");\r\n }\r\n }\r\n\r\n get highlight() {\r\n return this.element.classList.contains(\"bm-marker-highlight\");\r\n }\r\n\r\n /**\r\n * @param markerData {{\r\n * position: {x: number, y: number, z: number},\r\n * anchor: {x: number, y: number},\r\n * iconAnchor: {x: number, y: number},\r\n * label: string,\r\n * icon: string,\r\n * minDistance: number,\r\n * maxDistance: number\r\n * }}\r\n */\r\n updateFromData(markerData) {\r\n\r\n // update position\r\n let pos = markerData.position || {};\r\n this.position.setX(pos.x || 0);\r\n this.position.setY(pos.y || 0);\r\n this.position.setZ(pos.z || 0);\r\n\r\n // update anchor\r\n let anch = markerData.anchor || markerData.iconAnchor || {}; //\"iconAnchor\" for backwards compatibility\r\n this.iconElement.style.transform = `translate(${-anch.x}px, ${-anch.y}px)`;\r\n //this.anchor.setX(anch.x || 0);\r\n //this.anchor.setY(anch.y || 0);\r\n\r\n\r\n // update label\r\n if (this.data.label !== markerData.label){\r\n this.data.label = markerData.label || \"\";\r\n this.labelElement.innerHTML = this.data.label || \"\";\r\n }\r\n\r\n // update icon\r\n if (this._lastIcon !== markerData.icon){\r\n this.iconElement.src = markerData.icon || \"assets/poi.svg\";\r\n this._lastIcon = markerData.icon;\r\n }\r\n\r\n // update min/max distances\r\n this.fadeDistanceMin = markerData.minDistance || 0;\r\n this.fadeDistanceMax = markerData.maxDistance !== undefined ? markerData.maxDistance : Number.MAX_VALUE;\r\n\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport {Scene} from \"three\";\r\nimport {alert} from \"../util/Utils\";\r\nimport {ShapeMarker} from \"./ShapeMarker\";\r\nimport {ExtrudeMarker} from \"./ExtrudeMarker\";\r\nimport {LineMarker} from \"./LineMarker\";\r\nimport {HtmlMarker} from \"./HtmlMarker\";\r\nimport {PoiMarker} from \"./PoiMarker\";\r\n\r\nexport class MarkerSet extends Scene {\r\n\r\n /**\r\n * @param id {string}\r\n */\r\n constructor(id) {\r\n super();\r\n Object.defineProperty(this, 'isMarkerSet', {value: true});\r\n\r\n /** @type {Map} */\r\n this.markerSets = new Map();\r\n /** @type {Map} */\r\n this.markers = new Map();\r\n\r\n this.data = {\r\n id: id,\r\n label: id,\r\n toggleable: true,\r\n defaultHide: false,\r\n markerSets: [],\r\n markers: [],\r\n visible: this.visible,\r\n };\r\n\r\n Object.defineProperty(this, \"visible\", {\r\n get() { return this.data.visible },\r\n set(value) { this.data.visible = value }\r\n });\r\n }\r\n\r\n updateFromData(data) {\r\n // update set info\r\n this.data.label = data.label || this.data.id;\r\n this.data.toggleable = !!data.toggleable;\r\n this.data.defaultHide = !!data.defaultHidden;\r\n\r\n // update markerSets\r\n this.updateMarkerSetsFromData(data.markerSets);\r\n\r\n // update markers\r\n this.updateMarkersFromData(data.markers);\r\n }\r\n\r\n updateMarkerSetsFromData(data = {}, ignore = []) {\r\n let updatedMarkerSets = new Set(ignore);\r\n\r\n // add & update MarkerSets\r\n Object.keys(data).forEach(markerSetId => {\r\n if (updatedMarkerSets.has(markerSetId)) return;\r\n updatedMarkerSets.add(markerSetId);\r\n\r\n let markerSetData = data[markerSetId];\r\n try {\r\n this.updateMarkerSetFromData(markerSetId, markerSetData);\r\n } catch (err) {\r\n alert(this.events, err, \"fine\");\r\n }\r\n });\r\n\r\n // remove not updated MarkerSets\r\n this.markerSets.forEach((markerSet, setId) => {\r\n if (!updatedMarkerSets.has(setId)) {\r\n this.remove(markerSet);\r\n }\r\n });\r\n }\r\n\r\n updateMarkerSetFromData(markerSetId, data) {\r\n let markerSet = this.markerSets.get(markerSetId);\r\n\r\n // create new if not existent\r\n if (!markerSet) {\r\n markerSet = new MarkerSet(markerSetId);\r\n this.add(markerSet);\r\n\r\n if (data.defaultHidden) {\r\n markerSet.visible = false;\r\n }\r\n }\r\n\r\n // update\r\n markerSet.updateFromData(data);\r\n }\r\n\r\n updateMarkersFromData(data = {}, ignore = []) {\r\n let updatedMarkers = new Set(ignore);\r\n\r\n Object.keys(data).forEach(markerId => {\r\n if (updatedMarkers.has(markerId)) return;\r\n\r\n let markerData = data[markerId];\r\n try {\r\n this.updateMarkerFromData(markerId, markerData);\r\n updatedMarkers.add(markerId);\r\n } catch (err) {\r\n alert(this.events, err, \"fine\");\r\n console.debug(err);\r\n }\r\n });\r\n\r\n // remove not updated Markers\r\n this.markers.forEach((marker, markerId) => {\r\n if (!updatedMarkers.has(markerId)) {\r\n this.remove(marker);\r\n }\r\n });\r\n }\r\n\r\n updateMarkerFromData(markerId, data) {\r\n if (!data.type) throw new Error(\"marker-data has no type!\");\r\n let marker = this.markers.get(markerId);\r\n\r\n // create new if not existent of wrong type\r\n if (!marker || marker.data.type !== data.type) {\r\n if (marker) this.remove(marker);\r\n\r\n switch (data.type) {\r\n case \"shape\" : marker = new ShapeMarker(markerId); break;\r\n case \"extrude\" : marker = new ExtrudeMarker(markerId); break;\r\n case \"line\" : marker = new LineMarker(markerId); break;\r\n case \"html\" : marker = new HtmlMarker(markerId); break;\r\n case \"poi\" : marker = new PoiMarker(markerId); break;\r\n default : throw new Error(`Unknown marker-type: '${data.type}'`);\r\n }\r\n\r\n this.add(marker);\r\n }\r\n\r\n // update marker\r\n marker.updateFromData(data);\r\n }\r\n\r\n /**\r\n * Removes all markers and marker-sets\r\n */\r\n clear() {\r\n [...this.data.markerSets].forEach(markerSet => this.remove(markerSet));\r\n [...this.data.markers].forEach(marker => this.remove(marker));\r\n }\r\n\r\n add(...object) {\r\n if (object.length === 1) { //super.add() will re-invoke this method for each array-entry if it's more than one\r\n let o = object[0];\r\n if (o.isMarkerSet && !this.markerSets.has(o.data.id)) {\r\n this.markerSets.set(o.data.id, o);\r\n this.data.markerSets.push(o.data);\r\n }\r\n if (o.isMarker && !this.markers.has(o.data.id)) {\r\n this.markers.set(o.data.id, o);\r\n this.data.markers.push(o.data);\r\n }\r\n }\r\n\r\n return super.add(...object);\r\n }\r\n\r\n remove(...object) {\r\n if (object.length === 1) { //super.remove() will re-invoke this method for each array-entry if it's more than one\r\n let o = object[0];\r\n if (o.isMarkerSet) {\r\n let i = this.data.markerSets.indexOf(o.data);\r\n if (i > -1) this.data.markerSets.splice(i, 1);\r\n this.markerSets.delete(o.data.id);\r\n o.dispose();\r\n }\r\n if (o.isMarker) {\r\n let i = this.data.markers.indexOf(o.data);\r\n if (i > -1) this.data.markers.splice(i, 1);\r\n this.markers.delete(o.data.id);\r\n o.dispose();\r\n }\r\n }\r\n\r\n return super.remove(...object);\r\n }\r\n\r\n dispose() {\r\n this.children.forEach(child => {\r\n if (child.dispose) child.dispose();\r\n });\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport {Color, PerspectiveCamera, Raycaster, Scene, Vector2, Vector3, WebGLRenderer} from \"three\";\r\nimport {Map} from \"./map/Map\";\r\nimport {SkyboxScene} from \"./skybox/SkyboxScene\";\r\nimport {ControlsManager} from \"./controls/ControlsManager\";\r\nimport Stats from \"./util/Stats\";\r\nimport {alert, dispatchEvent, elementOffset, generateCacheHash, htmlToElement, softClamp} from \"./util/Utils\";\r\nimport {TileManager} from \"./map/TileManager\";\r\nimport {HIRES_VERTEX_SHADER} from \"./map/hires/HiresVertexShader\";\r\nimport {HIRES_FRAGMENT_SHADER} from \"./map/hires/HiresFragmentShader\";\r\nimport {LOWRES_VERTEX_SHADER} from \"./map/lowres/LowresVertexShader\";\r\nimport {LOWRES_FRAGMENT_SHADER} from \"./map/lowres/LowresFragmentShader\";\r\nimport {CombinedCamera} from \"./util/CombinedCamera\";\r\nimport {CSS2DRenderer} from \"./util/CSS2DRenderer\";\r\nimport {MarkerSet} from \"./markers/MarkerSet\";\r\n\r\nexport class MapViewer {\r\n\r\n\t/**\r\n\t * @param element {Element}\r\n\t * @param events {EventTarget}\r\n\t */\r\n\tconstructor(element, events = element) {\r\n\t\tObject.defineProperty( this, 'isMapViewer', { value: true } );\r\n\r\n\t\tthis.rootElement = element;\r\n\t\tthis.events = events;\r\n\r\n\t\tthis.data = {\r\n\t\t\tmap: null,\r\n\t\t\tcamera: null,\r\n\t\t\tcontrolsManager: null,\r\n\t\t\tuniforms: {\r\n\t\t\t\tsunlightStrength: { value: 1 },\r\n\t\t\t\tambientLight: { value: 0 },\r\n\t\t\t\tskyColor: { value: new Color(0.5, 0.5, 1) },\r\n\t\t\t\thiresTileMap: {\r\n\t\t\t\t\tvalue: {\r\n\t\t\t\t\t\tmap: null,\r\n\t\t\t\t\t\tsize: TileManager.tileMapSize,\r\n\t\t\t\t\t\tscale: new Vector2(1, 1),\r\n\t\t\t\t\t\ttranslate: new Vector2(),\r\n\t\t\t\t\t\tpos: new Vector2(),\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tsuperSampling: 1,\r\n\t\t\tloadedCenter: new Vector2(0, 0),\r\n\t\t\tloadedHiresViewDistance: 200,\r\n\t\t\tloadedLowresViewDistance: 2000,\r\n\t\t}\r\n\r\n\t\tthis.tileCacheHash = generateCacheHash();\r\n\r\n\t\tthis.stats = new Stats();\r\n\t\tthis.stats.hide();\r\n\r\n\t\t// renderer\r\n\t\tthis.renderer = new WebGLRenderer({\r\n\t\t\tantialias: true,\r\n\t\t\tsortObjects: true,\r\n\t\t\tpreserveDrawingBuffer: true,\r\n\t\t\tlogarithmicDepthBuffer: true,\r\n\t\t});\r\n\t\tthis.renderer.autoClear = false;\r\n\t\tthis.renderer.uniforms = this.data.uniforms;\r\n\r\n\t\t// CSS2D renderer\r\n\t\tthis.css2dRenderer = new CSS2DRenderer(this.events);\r\n\r\n\t\tthis.skyboxScene = new SkyboxScene(this.data.uniforms);\r\n\r\n\t\tthis.camera = new CombinedCamera(75, 1, 0.1, 10000, 0);\r\n\t\tthis.skyboxCamera = new PerspectiveCamera(75, 1, 0.1, 10000);\r\n\t\tthis.skyboxCamera.updateProjectionMatrix();\r\n\r\n\t\tthis.controlsManager = new ControlsManager(this, this.camera);\r\n\r\n\t\tthis.raycaster = new Raycaster();\r\n\t\tthis.raycaster.layers.enableAll();\r\n\t\tthis.raycaster.params.Line2 = {threshold: 20}\r\n\r\n\t\t/** @type {Map} */\r\n\t\tthis.map = null;\r\n\r\n\t\tthis.markers = new MarkerSet(\"bm-root\");\r\n\r\n\t\tthis.lastFrame = 0;\r\n\r\n\t\t// initialize\r\n\t\tthis.initializeRootElement();\r\n\r\n\t\t// handle window resizes\r\n\t\twindow.addEventListener(\"resize\", this.handleContainerResize);\r\n\r\n\t\t// start render-loop\r\n\t\trequestAnimationFrame(this.renderLoop);\r\n\t}\r\n\r\n\t/**\r\n\t * Initializes the root-element\r\n\t */\r\n\tinitializeRootElement() {\r\n\t\tthis.rootElement.innerHTML = \"\";\r\n\r\n\t\tlet outerDiv = htmlToElement(`
`);\r\n\t\tthis.rootElement.appendChild(outerDiv);\r\n\r\n\t\t// 3d-canvas\r\n\t\touterDiv.appendChild(this.renderer.domElement);\r\n\r\n\t\t// html-markers\r\n\t\tthis.css2dRenderer.domElement.style.position = 'absolute';\r\n\t\tthis.css2dRenderer.domElement.style.top = '0';\r\n\t\tthis.css2dRenderer.domElement.style.left = '0';\r\n\t\tthis.css2dRenderer.domElement.style.pointerEvents = 'none';\r\n\t\touterDiv.appendChild(this.css2dRenderer.domElement);\r\n\r\n\t\t// performance monitor\r\n\t\touterDiv.appendChild(this.stats.dom);\r\n\r\n\t\tthis.handleContainerResize();\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the render-resolution and aspect ratio based on the size of the root-element\r\n\t */\r\n\thandleContainerResize = () => {\r\n\t\tthis.renderer.setSize(this.rootElement.clientWidth, this.rootElement.clientHeight);\r\n\t\tthis.renderer.setPixelRatio(window.devicePixelRatio * this.superSampling);\r\n\r\n\t\tthis.css2dRenderer.setSize(this.rootElement.clientWidth, this.rootElement.clientHeight);\r\n\r\n\t\tthis.camera.aspect = this.rootElement.clientWidth / this.rootElement.clientHeight;\r\n\t\tthis.camera.updateProjectionMatrix();\r\n\t};\r\n\r\n\t/**\r\n\t * Triggers an interaction on the screen (map), e.g. a mouse-click.\r\n\t *\r\n\t * This will first attempt to invoke the onClick() method on the Object3D (e.g. Markers) that has been clicked.\r\n\t * And if none of those consumed the event, it will fire a bluemapMapInteraction event.\r\n\t *\r\n\t * @param screenPosition {Vector2} - Clicked position on the screen (usually event.x, event.y)\r\n\t * @param data {object} - Custom event data that will be added to the interaction-event\r\n\t */\r\n\thandleMapInteraction(screenPosition, data = {}) {\r\n\t\tlet rootOffset = elementOffset(this.rootElement);\r\n\t\tlet normalizedScreenPos = new Vector2(\r\n\t\t\t((screenPosition.x - rootOffset.top) / this.rootElement.clientWidth) * 2 - 1,\r\n\t\t\t-((screenPosition.y - rootOffset.left) / this.rootElement.clientHeight) * 2 + 1\r\n\t\t);\r\n\r\n\t\tif (this.map && this.map.isLoaded){\r\n\t\t\tthis.raycaster.setFromCamera(normalizedScreenPos, this.camera);\r\n\r\n\t\t\t// check Object3D interactions\r\n\t\t\tconst intersectScenes = [this.map.hiresTileManager.scene, this.markers];\r\n\t\t\tfor (let i = 0; i < this.map.lowresTileManager.length; i++) {\r\n\t\t\t\tintersectScenes.push(this.map.lowresTileManager[i].scene);\r\n\t\t\t}\r\n\r\n\t\t\tlet intersects = this.raycaster.intersectObjects(intersectScenes, true);\r\n\t\t\tlet hit = null;\r\n\t\t\tlet lowresHits = [];\r\n\t\t\tlet hiresHit = null;\r\n\t\t\tlet covered = false;\r\n\r\n\t\t\tfor (let i = 0; i < intersects.length; i++) {\r\n\t\t\t\tif (intersects[i].object){\r\n\t\t\t\t\tlet object = intersects[i].object;\r\n\r\n\t\t\t\t\t// check if deeply-visible\r\n\t\t\t\t\tlet parent = object;\r\n\t\t\t\t\tlet visible = parent.visible;\r\n\t\t\t\t\twhile (visible && parent.parent){\r\n\t\t\t\t\t\tparent = parent.parent;\r\n\t\t\t\t\t\tvisible = parent.visible;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (visible) {\r\n\t\t\t\t\t\tif (!hit) hit = intersects[i];\r\n\r\n\t\t\t\t\t\t// find root-scene\r\n\t\t\t\t\t\tlet parentRoot = object;\r\n\t\t\t\t\t\twhile(parentRoot.parent) parentRoot = parentRoot.parent;\r\n\r\n\t\t\t\t\t\tfor (let l = 0; l < this.map.lowresTileManager.length; l++) {\r\n\t\t\t\t\t\t\tif (parentRoot === this.map.lowresTileManager[l].sceneParent) {\r\n\t\t\t\t\t\t\t\tif (!lowresHits[l]) lowresHits[l] = intersects[i];\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (parentRoot === this.map.hiresTileManager.sceneParent) {\r\n\t\t\t\t\t\t\tif (!hiresHit) hiresHit = intersects[i];\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (!covered || (object.material && !object.material.depthTest)) {\r\n\t\t\t\t\t\t\tif (object.onClick && object.onClick({\r\n\t\t\t\t\t\t\t\tdata: data,\r\n\t\t\t\t\t\t\t\tintersection: intersects[i]\r\n\t\t\t\t\t\t\t})) return;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (parentRoot !== this.map.lowresTileManager[0].sceneParent) {\r\n\t\t\t\t\t\t\tcovered = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// fire event\r\n\t\t\tdispatchEvent(this.events, \"bluemapMapInteraction\", {\r\n\t\t\t\tdata: data,\r\n\t\t\t\thit: hit,\r\n\t\t\t\thiresHit: hiresHit,\r\n\t\t\t\tlowresHits: lowresHits,\r\n\t\t\t\tintersections: intersects,\r\n\t\t\t\tray: this.raycaster.ray\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @private\r\n\t * The render-loop to update and possibly render a new frame.\r\n\t * @param now {number} the current time in milliseconds\r\n\t */\r\n\trenderLoop = (now) => {\r\n\t\trequestAnimationFrame(this.renderLoop);\r\n\r\n\t\t// calculate delta time\r\n\t\tif (this.lastFrame <= 0) this.lastFrame = now;\r\n\t\tlet delta = now - this.lastFrame;\r\n\t\tthis.lastFrame = now;\r\n\r\n\t\t// update stats\r\n\t\tthis.stats.begin();\r\n\r\n\t\t// update controls\r\n\t\tif (this.map != null) {\r\n\t\t\tthis.controlsManager.update(delta, this.map);\r\n\t\t}\r\n\r\n\t\t// render\r\n\t\tthis.render(delta);\r\n\r\n\t\t// update stats\r\n\t\tthis.stats.update();\r\n\t};\r\n\r\n\t/**\r\n\t * @private\r\n\t * Renders a frame\r\n\t * @param delta {number}\r\n\t */\r\n\trender(delta) {\r\n\t\tdispatchEvent(this.events, \"bluemapRenderFrame\", {\r\n\t\t\tdelta: delta,\r\n\t\t});\r\n\r\n\t\t// render\r\n\t\tthis.renderer.clear();\r\n\r\n\t\t// prepare skybox camera\r\n\t\tthis.skyboxCamera.rotation.copy(this.camera.rotation);\r\n\r\n\t\t// render skybox\r\n\t\tthis.renderer.render(this.skyboxScene, this.skyboxCamera);\r\n\t\tthis.renderer.clearDepth();\r\n\r\n\t\tif (this.map && this.map.isLoaded) {\r\n\r\n\t\t\t// shift whole scene including camera towards 0,0 to tackle shader-precision issues\r\n\t\t\tconst s = 10000;\r\n\t\t\tconst sX = Math.round(this.camera.position.x / s) * s;\r\n\t\t\tconst sZ = Math.round(this.camera.position.z / s) * s;\r\n\t\t\tthis.camera.position.x -= sX;\r\n\t\t\tthis.camera.position.z -= sZ;\r\n\r\n\t\t\t// update uniforms\r\n\t\t\tthis.data.uniforms.hiresTileMap.value.pos.copy(this.map.hiresTileManager.centerTile);\r\n\t\t\tthis.data.uniforms.hiresTileMap.value.translate.set(\r\n\t\t\t\tthis.map.data.hires.translate.x - sX,\r\n\t\t\t\tthis.map.data.hires.translate.z - sZ\r\n\t\t\t);\r\n\r\n\t\t\t// prepare camera for lowres\r\n\t\t\tconst cameraFar = this.camera.far;\r\n\t\t\tif (this.controlsManager.distance < 1000) {\r\n\t\t\t\tthis.camera.far = 1000000; // disable far clipping for lowres\r\n\t\t\t}\r\n\t\t\tthis.camera.updateProjectionMatrix();\r\n\r\n\t\t\t// render lowres\r\n\t\t\tconst highestLod = this.map.lowresTileManager.length - 1;\r\n\t\t\tfor (let i = this.map.lowresTileManager.length - 1; i >= 0; i--) {\r\n\t\t\t\tif (i === highestLod || this.controlsManager.distance < 1000 * Math.pow(this.map.data.lowres.lodFactor, i + 1)) {\r\n\t\t\t\t\tlet scenePos = this.map.lowresTileManager[i].scene.position;\r\n\t\t\t\t\tscenePos.x = -sX;\r\n\t\t\t\t\tscenePos.z = -sZ;\r\n\t\t\t\t\tthis.renderer.render(this.map.lowresTileManager[i].sceneParent, this.camera);\r\n\t\t\t\t\tthis.renderer.clearDepth();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.camera.far = cameraFar; // reset far clipping\r\n\r\n\t\t\t// render hires\r\n\t\t\tif (this.controlsManager.distance < 1000) {\r\n\t\t\t\tthis.camera.updateProjectionMatrix();\r\n\t\t\t\tlet scenePos = this.map.hiresTileManager.scene.position;\r\n\t\t\t\tscenePos.x = -sX;\r\n\t\t\t\tscenePos.z = -sZ;\r\n\t\t\t\tthis.renderer.render(this.map.hiresTileManager.sceneParent, this.camera);\r\n\t\t\t}\r\n\r\n\t\t\t// shift back\r\n\t\t\tthis.camera.position.x += sX;\r\n\t\t\tthis.camera.position.z += sZ;\r\n\r\n\t\t}\r\n\r\n\t\t// render markers\r\n\t\tthis.renderer.render(this.markers, this.camera);\r\n\t\tthis.css2dRenderer.render(this.markers, this.camera);\r\n\t}\r\n\r\n\t/**\r\n\t * Changes / Sets the map that will be loaded and displayed\r\n\t * @param map {Map}\r\n\t * @returns Promise\r\n\t */\r\n\tswitchMap(map = null) {\r\n\t\tif (this.map && this.map.isMap) this.map.unload();\r\n\r\n\t\tthis.map = map;\r\n\r\n\t\tif (this.map && this.map.isMap) {\r\n\t\t\treturn map.load(HIRES_VERTEX_SHADER, HIRES_FRAGMENT_SHADER, LOWRES_VERTEX_SHADER, LOWRES_FRAGMENT_SHADER, this.data.uniforms, this.tileCacheHash)\r\n\t\t\t\t.then(() => {\r\n\t\t\t\t\tfor (let texture of this.map.loadedTextures){\r\n\t\t\t\t\t\tthis.renderer.initTexture(texture);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tthis.data.uniforms.skyColor.value = map.data.skyColor;\r\n\t\t\t\t\tthis.data.uniforms.ambientLight.value = map.data.ambientLight;\r\n\t\t\t\t\tthis.data.uniforms.hiresTileMap.value.map = map.hiresTileManager.tileMap.texture;\r\n\t\t\t\t\tthis.data.uniforms.hiresTileMap.value.scale.set(map.data.hires.tileSize.x, map.data.hires.tileSize.z);\r\n\t\t\t\t\tthis.data.uniforms.hiresTileMap.value.translate.set(map.data.hires.translate.x, map.data.hires.translate.z);\r\n\r\n\t\t\t\t\tsetTimeout(this.updateLoadedMapArea);\r\n\r\n\t\t\t\t\tdispatchEvent(this.events, \"bluemapMapChanged\", {\r\n\t\t\t\t\t\tmap: map\r\n\t\t\t\t\t});\r\n\t\t\t\t})\r\n\t\t\t\t.catch(error => {\r\n\t\t\t\t\talert(this.events, error, \"error\");\r\n\t\t\t\t});\r\n\t\t} else {\r\n\t\t\treturn Promise.resolve();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Loads the given area on the map (and unloads everything outside that area)\r\n\t * @param centerX {number}\r\n\t * @param centerZ {number}\r\n\t * @param hiresViewDistance {number?}\r\n\t * @param lowresViewDistance {number?}\r\n\t */\r\n\tloadMapArea(centerX, centerZ, hiresViewDistance = -1, lowresViewDistance = -1) {\r\n\t\tthis.data.loadedCenter.set(centerX, centerZ);\r\n\t\tif (hiresViewDistance >= 0) this.data.loadedHiresViewDistance = hiresViewDistance;\r\n\t\tif (lowresViewDistance >= 0) this.data.loadedLowresViewDistance = lowresViewDistance;\r\n\r\n\t\tthis.updateLoadedMapArea();\r\n\t}\r\n\r\n\tupdateLoadedMapArea = () => {\r\n\t\tif (!this.map) return;\r\n\t\tif (this.controlsManager.distance < 1000) {\r\n\t\t\tthis.map.loadMapArea(this.data.loadedCenter.x, this.data.loadedCenter.y, this.data.loadedHiresViewDistance, this.data.loadedLowresViewDistance);\r\n\t\t} else {\r\n\t\t\tthis.map.loadMapArea(this.data.loadedCenter.x, this.data.loadedCenter.y, 0, this.data.loadedLowresViewDistance);\r\n\t\t}\r\n\t}\r\n\r\n\tclearTileCache(newTileCacheHash) {\r\n\t\tif (!newTileCacheHash) newTileCacheHash = generateCacheHash();\r\n\r\n\t\tthis.tileCacheHash = newTileCacheHash;\r\n\t\tif (this.map) {\r\n\t\t\tfor (let i = 0; i < this.map.lowresTileManager.length; i++) {\r\n\t\t\t\tthis.map.lowresTileManager[i].tileLoader.tileCacheHash = this.tileCacheHash;\r\n\t\t\t}\r\n\t\t\tthis.map.hiresTileManager.tileLoader.tileCacheHash = this.tileCacheHash;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @returns {number}\r\n\t */\r\n\tget superSampling() {\r\n\t\treturn this.data.superSampling;\r\n\t}\r\n\r\n\t/**\r\n\t * @param value {number}\r\n\t */\r\n\tset superSampling(value) {\r\n\t\tthis.data.superSampling = value;\r\n\t\tthis.handleContainerResize();\r\n\t}\r\n\r\n\t/**\r\n\t * @returns {CombinedCamera}\r\n\t */\r\n\tget camera() {\r\n\t\treturn this._camera;\r\n\t}\r\n\r\n\t/**\r\n\t * @param value {CombinedCamera}\r\n\t */\r\n\tset camera(value) {\r\n\t\tthis._camera = value;\r\n\t\tthis.data.camera = value.data;\r\n\t}\r\n\r\n\t/**\r\n\t * @returns {ControlsManager}\r\n\t */\r\n\tget controlsManager() {\r\n\t\treturn this._controlsManager;\r\n\t}\r\n\r\n\t/**\r\n\t * @param value {ControlsManager}\r\n\t */\r\n\tset controlsManager(value) {\r\n\t\tthis._controlsManager = value;\r\n\t\tthis.data.controlsManager = value.data;\r\n\t}\r\n\r\n\t/**\r\n\t * @returns {Map}\r\n\t */\r\n\tget map() {\r\n\t\treturn this._map;\r\n\t}\r\n\r\n\t/**\r\n\t * @param value {Map}\r\n\t */\r\n\tset map(value) {\r\n\t\tthis._map = value;\r\n\t\tif (value) this.data.map = value.data;\r\n\t}\r\n\r\n}\r\n","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport {Marker} from \"./Marker\";\r\nimport {CSS2DObject} from \"../util/CSS2DRenderer\";\r\nimport {animate, EasingFunctions, htmlToElement} from \"../util/Utils\";\r\n\r\nexport class PlayerMarker extends Marker {\r\n\r\n /**\r\n * @param markerId {string}\r\n * @param playerUuid {string}\r\n */\r\n constructor(markerId, playerUuid) {\r\n super(markerId);\r\n Object.defineProperty(this, 'isPlayerMarker', {value: true});\r\n this.data.type = \"player\";\r\n\r\n this.data.playerUuid = playerUuid;\r\n this.data.name = playerUuid;\r\n\r\n this.elementObject = new CSS2DObject(htmlToElement(`\r\n
\r\n \"playerhead\"\r\n
\r\n
\r\n `));\r\n this.elementObject.onBeforeRender = (renderer, scene, camera) => this.onBeforeRender(renderer, scene, camera);\r\n\r\n this.playerHeadElement = this.element.getElementsByTagName(\"img\")[0];\r\n this.playerNameElement = this.element.getElementsByTagName(\"div\")[0];\r\n\r\n this.addEventListener( 'removed', () => {\r\n if (this.element.parentNode) this.element.parentNode.removeChild(this.element);\r\n });\r\n\r\n this.playerHeadElement.addEventListener('error', () => {\r\n this.playerHeadElement.src = \"assets/steve.png\";\r\n }, {once: true});\r\n\r\n this.add(this.elementObject);\r\n }\r\n\r\n /**\r\n * @returns {Element}\r\n */\r\n get element() {\r\n return this.elementObject.element.getElementsByTagName(\"div\")[0];\r\n }\r\n\r\n onBeforeRender(renderer, scene, camera) {\r\n let distance = Marker.calculateDistanceToCameraPlane(this.position, camera);\r\n\r\n let value = \"near\";\r\n if (distance > 1000) {\r\n value = \"med\";\r\n }\r\n if (distance > 5000) {\r\n value = \"far\";\r\n }\r\n\r\n this.element.setAttribute(\"distance-data\", value);\r\n }\r\n\r\n /**\r\n * @typedef PlayerLike {{\r\n * uuid: string,\r\n * name: string,\r\n * foreign: boolean,\r\n * position: {x: number, y: number, z: number},\r\n * rotation: {yaw: number, pitch: number, roll: number}\r\n * }}\r\n */\r\n\r\n /**\r\n * @param markerData {PlayerLike}\r\n */\r\n updateFromData(markerData) {\r\n\r\n // animate position update\r\n let pos = markerData.position || {};\r\n if (!this.position.x && !this.position.y && !this.position.z) {\r\n this.position.set(\r\n pos.x || 0,\r\n pos.y || 0,\r\n pos.z || 0\r\n );\r\n } else {\r\n let startPos = {\r\n x: this.position.x,\r\n y: this.position.y,\r\n z: this.position.z,\r\n }\r\n let deltaPos = {\r\n x: (pos.x || 0) - startPos.x,\r\n y: ((pos.y || 0) + 1.8) - startPos.y,\r\n z: (pos.z || 0) - startPos.z,\r\n }\r\n if (deltaPos.x || deltaPos.y || deltaPos.z) {\r\n animate(progress => {\r\n let ease = EasingFunctions.easeInOutCubic(progress);\r\n this.position.set(\r\n startPos.x + deltaPos.x * ease || 0,\r\n startPos.y + deltaPos.y * ease || 0,\r\n startPos.z + deltaPos.z * ease || 0\r\n );\r\n }, 500);\r\n }\r\n }\r\n\r\n // update name\r\n let name = markerData.name || this.data.playerUuid;\r\n this.data.name = name;\r\n if (this.playerNameElement.innerHTML !== name)\r\n this.playerNameElement.innerHTML = name;\r\n\r\n // update world\r\n this.data.foreign = markerData.foreign;\r\n }\r\n\r\n dispose() {\r\n super.dispose();\r\n\r\n let element = this.elementObject.element;\r\n if (element.parentNode) element.parentNode.removeChild(element);\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\n\r\nimport {MarkerSet} from \"./MarkerSet\";\r\nimport {alert} from \"../util/Utils\";\r\nimport {PlayerMarker} from \"./PlayerMarker\";\r\n\r\nexport class PlayerMarkerSet extends MarkerSet {\r\n\r\n constructor(id) {\r\n super(id);\r\n this.data.label = \"Player\";\r\n this.data.toggleable = true;\r\n this.data.defaultHide = false;\r\n }\r\n\r\n updateFromPlayerData(data) {\r\n if (!Array.isArray(data.players)) {\r\n this.clear();\r\n return false;\r\n }\r\n\r\n /** @type Set */\r\n let updatedPlayerMarkers = new Set();\r\n\r\n // update\r\n data.players.forEach(playerData => {\r\n try {\r\n let playerMarker = this.updatePlayerMarkerFromData(playerData);\r\n updatedPlayerMarkers.add(playerMarker);\r\n } catch (err) {\r\n alert(this.events, err, \"fine\");\r\n }\r\n });\r\n\r\n // remove\r\n this.markers.forEach(playerMarker => {\r\n if (!updatedPlayerMarkers.has(playerMarker)) {\r\n this.remove(playerMarker);\r\n }\r\n });\r\n\r\n return true;\r\n }\r\n\r\n updatePlayerMarkerFromData(markerData) {\r\n let playerUuid = markerData.uuid;\r\n if (!playerUuid) throw new Error(\"player-data has no uuid!\");\r\n let markerId = this.getPlayerMarkerId(playerUuid);\r\n\r\n /** @type PlayerMarker */\r\n let marker = this.markers.get(markerId);\r\n\r\n // create new if not existent of wrong type\r\n if (!marker || !marker.isPlayerMarker) {\r\n if (marker) this.remove(marker);\r\n marker = new PlayerMarker(markerId, playerUuid);\r\n this.add(marker);\r\n }\r\n\r\n // update\r\n marker.updateFromData(markerData);\r\n\r\n // hide if from different world\r\n marker.visible = !markerData.foreign;\r\n\r\n return marker;\r\n }\r\n\r\n getPlayerMarker(playerUuid) {\r\n return this.markers.get(this.getPlayerMarkerId(playerUuid));\r\n }\r\n\r\n getPlayerMarkerId(playerUuid) {\r\n return \"bm-player-\" + playerUuid;\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport {FileLoader, Scene} from \"three\";\r\nimport {MarkerSet} from \"./MarkerSet\";\r\nimport {alert, generateCacheHash} from \"../util/Utils\";\r\nimport {PlayerMarkerSet} from \"./PlayerMarkerSet\";\r\n\r\nexport const MarkerFileType = {\r\n NORMAL: 1,\r\n PLAYER: 2,\r\n}\r\n\r\nexport const PLAYER_MARKER_SET_ID = \"bm-players\";\r\n\r\n/**\r\n * A manager for loading and updating markers from a file\r\n */\r\nexport class MarkerManager {\r\n\r\n /**\r\n * @constructor\r\n * @param root {MarkerSet} - The scene to which all markers will be added\r\n * @param fileUrl {string} - The marker file from which this manager updates its markers\r\n * @param fileType {number} - The type of the marker-file, see MarkerManager.NORMAL and MarkerManager.PLAYER\r\n * @param events {EventTarget}\r\n */\r\n constructor(root, fileUrl, fileType, events = null) {\r\n Object.defineProperty(this, 'isMarkerManager', {value: true});\r\n\r\n this.root = root;\r\n this.fileUrl = fileUrl;\r\n this.fileType = fileType;\r\n this.events = events;\r\n this.disposed = false;\r\n\r\n /** @type {NodeJS.Timeout} */\r\n this._updateInterval = null;\r\n }\r\n\r\n /**\r\n * Sets the automatic-update frequency, setting this to 0 or negative disables automatic updates (default).\r\n * This is better than using setInterval() on update() because this will wait for the update to finish before requesting the next update.\r\n * @param ms - interval in milliseconds\r\n */\r\n setAutoUpdateInterval(ms) {\r\n if (this._updateInterval) clearTimeout(this._updateInterval);\r\n if (ms > 0) {\r\n let autoUpdate = () => {\r\n if (this.disposed) return;\r\n this.update()\r\n .then(success => {\r\n if (success) {\r\n this._updateInterval = setTimeout(autoUpdate, ms);\r\n } else {\r\n this._updateInterval = setTimeout(autoUpdate, Math.max(ms, 1000 * 15));\r\n }\r\n })\r\n .catch(e => {\r\n alert(this.events, e, \"warning\");\r\n this._updateInterval = setTimeout(autoUpdate, Math.max(ms, 1000 * 15));\r\n });\r\n };\r\n\r\n this._updateInterval = setTimeout(autoUpdate, ms);\r\n }\r\n }\r\n\r\n /**\r\n * Loads the marker-file and updates all managed markers.\r\n * @returns {Promise} - A promise completing when the markers finished updating\r\n */\r\n update() {\r\n return this.loadMarkerFile()\r\n .then(markerFileData => this.updateFromData(markerFileData));\r\n }\r\n\r\n /**\r\n * @private\r\n * @param markerData\r\n */\r\n updateFromData(markerData) {\r\n switch (this.fileType) {\r\n case MarkerFileType.NORMAL: return this.updateFromDataNormal(markerData);\r\n case MarkerFileType.PLAYER: return this.updateFromDataPlayer(markerData);\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * @param markerData\r\n * @returns {boolean}\r\n */\r\n updateFromDataNormal(markerData) {\r\n this.root.updateMarkerSetsFromData(markerData, [PLAYER_MARKER_SET_ID, \"bm-popup-set\"]);\r\n return true;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param markerFileData\r\n * @returns {boolean}\r\n */\r\n updateFromDataPlayer(markerFileData) {\r\n let playerMarkerSet = this.getPlayerMarkerSet();\r\n return playerMarkerSet.updateFromPlayerData(markerFileData);\r\n }\r\n\r\n /**\r\n * @private\r\n * @returns {PlayerMarkerSet}\r\n */\r\n getPlayerMarkerSet() {\r\n /** @type {PlayerMarkerSet} */\r\n let playerMarkerSet = /** @type {PlayerMarkerSet} */ this.root.markerSets.get(PLAYER_MARKER_SET_ID);\r\n\r\n if (!playerMarkerSet) {\r\n playerMarkerSet = new PlayerMarkerSet(PLAYER_MARKER_SET_ID);\r\n this.root.add(playerMarkerSet);\r\n }\r\n\r\n return playerMarkerSet;\r\n }\r\n\r\n /**\r\n * @param playerUuid {string}\r\n * @returns {PlayerMarker | undefined}\r\n */\r\n getPlayerMarker(playerUuid) {\r\n return this.getPlayerMarkerSet().getPlayerMarker(playerUuid)\r\n }\r\n\r\n /**\r\n * Stops automatic-updates and disposes all markersets and markers managed by this manager\r\n */\r\n dispose() {\r\n this.disposed = true;\r\n this.setAutoUpdateInterval(0);\r\n this.clear();\r\n }\r\n\r\n /**\r\n * Removes all markers managed by this marker-manager\r\n */\r\n clear() {\r\n this.root.clear();\r\n }\r\n\r\n /**\r\n * @private\r\n * Loads the marker file\r\n * @returns {Promise} - A promise completing with the parsed json object from the loaded file\r\n */\r\n loadMarkerFile() {\r\n return new Promise((resolve, reject) => {\r\n let loader = new FileLoader();\r\n loader.setResponseType(\"json\");\r\n loader.load(this.fileUrl + \"?\" + generateCacheHash(),\r\n markerFileData => {\r\n if (!markerFileData) reject(`Failed to parse '${this.fileUrl}'!`);\r\n else resolve(markerFileData);\r\n },\r\n () => {},\r\n () => reject(`Failed to load '${this.fileUrl}'!`)\r\n )\r\n });\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\n\r\nimport {MathUtils, Vector2} from \"three\";\r\nimport {VEC2_ZERO} from \"../../../util/Utils\";\r\n\r\nexport class MouseMoveControls {\r\n\r\n static tempVec2_1 = new Vector2();\r\n\r\n /**\r\n * @param target {Element}\r\n * @param speed {number}\r\n * @param stiffness {number}\r\n */\r\n constructor(target, speed, stiffness) {\r\n this.target = target;\r\n this.manager = null;\r\n\r\n this.moving = false;\r\n this.lastPosition = new Vector2();\r\n this.deltaPosition = new Vector2();\r\n\r\n this.speed = speed;\r\n this.stiffness = stiffness;\r\n\r\n this.pixelToSpeedMultiplierX = 0;\r\n this.pixelToSpeedMultiplierY = 0;\r\n this.updatePixelToSpeedMultiplier();\r\n }\r\n\r\n /**\r\n * @param manager {ControlsManager}\r\n */\r\n start(manager) {\r\n this.manager = manager;\r\n\r\n this.target.addEventListener(\"mousedown\", this.onMouseDown);\r\n window.addEventListener(\"mousemove\", this.onMouseMove);\r\n window.addEventListener(\"mouseup\", this.onMouseUp);\r\n\r\n window.addEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\r\n }\r\n\r\n stop() {\r\n this.target.removeEventListener(\"mousedown\", this.onMouseDown);\r\n window.removeEventListener(\"mousemove\", this.onMouseMove);\r\n window.removeEventListener(\"mouseup\", this.onMouseUp);\r\n\r\n window.removeEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\r\n }\r\n\r\n /**\r\n * @param delta {number}\r\n * @param map {Map}\r\n */\r\n update(delta, map) {\r\n if (this.deltaPosition.x === 0 && this.deltaPosition.y === 0) return;\r\n\r\n let smoothing = this.stiffness / (16.666 / delta);\r\n smoothing = MathUtils.clamp(smoothing, 0, 1);\r\n\r\n let directionDelta = MouseMoveControls.tempVec2_1.copy(this.deltaPosition);\r\n directionDelta.rotateAround(VEC2_ZERO, this.manager.rotation);\r\n\r\n this.manager.position.x += directionDelta.x * smoothing * this.manager.distance * this.speed * this.pixelToSpeedMultiplierX;\r\n this.manager.position.z += directionDelta.y * smoothing * this.manager.distance * this.speed * this.pixelToSpeedMultiplierY;\r\n\r\n this.deltaPosition.multiplyScalar(1 - smoothing);\r\n if (this.deltaPosition.lengthSq() < 0.0001) {\r\n this.deltaPosition.set(0, 0);\r\n }\r\n }\r\n\r\n reset() {\r\n this.deltaPosition.set(0, 0);\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {MouseEvent}\r\n */\r\n onMouseDown = evt => {\r\n if ((evt.buttons !== undefined ? evt.buttons === 1 : evt.button === 0) && !evt.altKey) {\r\n this.moving = true;\r\n this.deltaPosition.set(0, 0);\r\n this.lastPosition.set(evt.x, evt.y);\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {MouseEvent}\r\n */\r\n onMouseMove = evt => {\r\n let position = MouseMoveControls.tempVec2_1.set(evt.x, evt.y);\r\n\r\n if(this.moving){\r\n this.deltaPosition.sub(position).add(this.lastPosition);\r\n }\r\n\r\n this.lastPosition.copy(position);\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {MouseEvent}\r\n */\r\n onMouseUp = evt => {\r\n if (evt.button === 0) this.moving = false;\r\n }\r\n\r\n updatePixelToSpeedMultiplier = () => {\r\n this.pixelToSpeedMultiplierX = (1 / this.target.clientWidth) * (this.target.clientWidth / this.target.clientHeight);\r\n this.pixelToSpeedMultiplierY = 1 / this.target.clientHeight;\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\n\r\nimport {MathUtils} from \"three\";\r\n\r\nexport class MouseZoomControls {\r\n\r\n /**\r\n * @param target {EventTarget}\r\n * @param speed {number}\r\n * @param stiffness {number}\r\n */\r\n constructor(target, speed, stiffness) {\r\n this.target = target;\r\n this.manager = null;\r\n\r\n this.stiffness = stiffness;\r\n this.speed = speed;\r\n\r\n this.deltaZoom = 0;\r\n }\r\n\r\n /**\r\n * @param manager {ControlsManager}\r\n */\r\n start(manager) {\r\n this.manager = manager;\r\n\r\n this.target.addEventListener(\"wheel\", this.onMouseWheel, {passive: true});\r\n }\r\n\r\n stop() {\r\n this.target.removeEventListener(\"wheel\", this.onMouseWheel);\r\n }\r\n\r\n /**\r\n * @param delta {number}\r\n * @param map {Map}\r\n */\r\n update(delta, map) {\r\n if (this.deltaZoom === 0) return;\r\n\r\n let smoothing = this.stiffness / (16.666 / delta);\r\n smoothing = MathUtils.clamp(smoothing, 0, 1);\r\n\r\n this.manager.distance *= Math.pow(1.5, this.deltaZoom * smoothing * this.speed);\r\n\r\n this.deltaZoom *= 1 - smoothing;\r\n if (Math.abs(this.deltaZoom) < 0.0001) {\r\n this.deltaZoom = 0;\r\n }\r\n }\r\n\r\n reset() {\r\n this.deltaZoom = 0;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {WheelEvent}\r\n */\r\n onMouseWheel = evt => {\r\n let delta = evt.deltaY;\r\n if (evt.deltaMode === WheelEvent.DOM_DELTA_PIXEL) delta *= 0.01;\r\n if (evt.deltaMode === WheelEvent.DOM_DELTA_LINE) delta *= 0.33;\r\n\r\n this.deltaZoom += delta;\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\n\r\nimport {MathUtils} from \"three\";\r\n\r\nexport class MouseRotateControls {\r\n\r\n /**\r\n * @param target {EventTarget}\r\n * @param speed {number}\r\n * @param stiffness {number}\r\n */\r\n constructor(target, speed, stiffness) {\r\n this.target = target;\r\n this.manager = null;\r\n\r\n this.moving = false;\r\n this.lastX = 0;\r\n this.deltaRotation = 0;\r\n\r\n this.speed = speed;\r\n this.stiffness = stiffness;\r\n\r\n this.pixelToSpeedMultiplierX = 0;\r\n this.updatePixelToSpeedMultiplier();\r\n }\r\n\r\n /**\r\n * @param manager {ControlsManager}\r\n */\r\n start(manager) {\r\n this.manager = manager;\r\n\r\n this.target.addEventListener(\"mousedown\", this.onMouseDown);\r\n window.addEventListener(\"mousemove\", this.onMouseMove);\r\n window.addEventListener(\"mouseup\", this.onMouseUp);\r\n\r\n window.addEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\r\n }\r\n\r\n stop() {\r\n this.target.removeEventListener(\"mousedown\", this.onMouseDown);\r\n window.removeEventListener(\"mousemove\", this.onMouseMove);\r\n window.removeEventListener(\"mouseup\", this.onMouseUp);\r\n\r\n window.removeEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\r\n }\r\n\r\n /**\r\n * @param delta {number}\r\n * @param map {Map}\r\n */\r\n update(delta, map) {\r\n if (this.deltaRotation === 0) return;\r\n\r\n let smoothing = this.stiffness / (16.666 / delta);\r\n smoothing = MathUtils.clamp(smoothing, 0, 1);\r\n\r\n this.manager.rotation += this.deltaRotation * smoothing * this.speed * this.pixelToSpeedMultiplierX;\r\n\r\n this.deltaRotation *= 1 - smoothing;\r\n if (Math.abs(this.deltaRotation) < 0.0001) {\r\n this.deltaRotation = 0;\r\n }\r\n }\r\n\r\n reset() {\r\n this.deltaRotation = 0;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {MouseEvent}\r\n */\r\n onMouseDown = evt => {\r\n if ((evt.buttons !== undefined ? evt.buttons === 2 : evt.button === 2) ||\r\n ((evt.altKey || evt.ctrlKey) && (evt.buttons !== undefined ? evt.buttons === 1 : evt.button === 0))) {\r\n this.moving = true;\r\n this.deltaRotation = 0;\r\n this.lastX = evt.x;\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {MouseEvent}\r\n */\r\n onMouseMove = evt => {\r\n if(this.moving){\r\n this.deltaRotation += evt.x - this.lastX;\r\n }\r\n\r\n this.lastX = evt.x;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {MouseEvent}\r\n */\r\n onMouseUp = evt => {\r\n this.moving = false;\r\n }\r\n\r\n updatePixelToSpeedMultiplier = () => {\r\n this.pixelToSpeedMultiplierX = (1 / this.target.clientWidth); //* (this.target.clientWidth / this.target.clientHeight);\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\n\r\nimport {MathUtils} from \"three\";\r\n\r\nexport class MouseAngleControls {\r\n\r\n /**\r\n * @param target {EventTarget}\r\n * @param speed {number}\r\n * @param stiffness {number}\r\n */\r\n constructor(target, speed, stiffness) {\r\n this.target = target;\r\n this.manager = null;\r\n\r\n this.moving = false;\r\n this.lastY = 0;\r\n this.deltaAngle = 0;\r\n\r\n this.speed = speed;\r\n this.stiffness = stiffness;\r\n\r\n this.pixelToSpeedMultiplierY = 0;\r\n this.updatePixelToSpeedMultiplier();\r\n }\r\n\r\n /**\r\n * @param manager {ControlsManager}\r\n */\r\n start(manager) {\r\n this.manager = manager;\r\n\r\n this.target.addEventListener(\"mousedown\", this.onMouseDown);\r\n window.addEventListener(\"mousemove\", this.onMouseMove);\r\n window.addEventListener(\"mouseup\", this.onMouseUp);\r\n\r\n window.addEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\r\n }\r\n\r\n stop() {\r\n this.target.removeEventListener(\"mousedown\", this.onMouseDown);\r\n window.removeEventListener(\"mousemove\", this.onMouseMove);\r\n window.removeEventListener(\"mouseup\", this.onMouseUp);\r\n\r\n window.removeEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\r\n }\r\n\r\n /**\r\n * @param delta {number}\r\n * @param map {Map}\r\n */\r\n update(delta, map) {\r\n if (this.deltaAngle === 0) return;\r\n\r\n let smoothing = this.stiffness / (16.666 / delta);\r\n smoothing = MathUtils.clamp(smoothing, 0, 1);\r\n\r\n this.manager.angle += this.deltaAngle * smoothing * this.speed * this.pixelToSpeedMultiplierY;\r\n\r\n this.deltaAngle *= 1 - smoothing;\r\n if (Math.abs(this.deltaAngle) < 0.0001) {\r\n this.deltaAngle = 0;\r\n }\r\n }\r\n\r\n reset() {\r\n this.deltaAngle = 0;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {MouseEvent}\r\n */\r\n onMouseDown = evt => {\r\n if ((evt.buttons !== undefined ? evt.buttons === 2 : evt.button === 2) ||\r\n ((evt.altKey || evt.ctrlKey) && (evt.buttons !== undefined ? evt.buttons === 1 : evt.button === 0))) {\r\n this.moving = true;\r\n this.deltaAngle = 0;\r\n this.lastY = evt.y;\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {MouseEvent}\r\n */\r\n onMouseMove = evt => {\r\n if(this.moving){\r\n this.deltaAngle -= evt.y - this.lastY;\r\n }\r\n\r\n this.lastY = evt.y;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {MouseEvent}\r\n */\r\n onMouseUp = evt => {\r\n this.moving = false;\r\n }\r\n\r\n updatePixelToSpeedMultiplier = () => {\r\n this.pixelToSpeedMultiplierY = 1 / this.target.clientHeight;\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\n\r\nimport {MathUtils, Vector2} from \"three\";\r\n\r\nexport class MapHeightControls {\r\n\r\n /**\r\n * @param cameraHeightStiffness {number}\r\n * @param targetHeightStiffness {number}\r\n */\r\n constructor(cameraHeightStiffness, targetHeightStiffness) {\r\n this.manager = null;\r\n\r\n this.cameraHeightStiffness = cameraHeightStiffness;\r\n this.targetHeightStiffness = targetHeightStiffness;\r\n this.maxAngle = Math.PI / 2;\r\n\r\n this.targetHeight = 0;\r\n this.cameraHeight = 0;\r\n\r\n this.minCameraHeight = 0;\r\n this.distanceTagretHeight = 0;\r\n }\r\n\r\n /**\r\n * @param manager {ControlsManager}\r\n */\r\n start(manager) {\r\n this.manager = manager;\r\n }\r\n\r\n stop() {}\r\n\r\n /**\r\n * @param delta {number}\r\n * @param map {Map}\r\n */\r\n update(delta, map) {\r\n\r\n // adjust target height\r\n this.updateHeights(delta, map);\r\n this.manager.position.y = Math.max(this.manager.position.y, this.getSuggestedHeight());\r\n }\r\n\r\n updateHeights(delta, map) {\r\n //target height\r\n let targetSmoothing = this.targetHeightStiffness / (16.666 / delta);\r\n targetSmoothing = MathUtils.clamp(targetSmoothing, 0, 1);\r\n\r\n let targetTerrainHeight = map.terrainHeightAt(this.manager.position.x, this.manager.position.z) + 3 || 0;\r\n\r\n let targetDelta = targetTerrainHeight - this.targetHeight;\r\n this.targetHeight += targetDelta * targetSmoothing;\r\n if (Math.abs(targetDelta) < 0.001) this.targetHeight = targetTerrainHeight;\r\n\r\n // camera height\r\n this.minCameraHeight = 0;\r\n if (this.maxAngle >= 0.1) {\r\n let cameraSmoothing = this.cameraHeightStiffness / (16.666 / delta);\r\n cameraSmoothing = MathUtils.clamp(cameraSmoothing, 0, 1);\r\n\r\n let cameraTerrainHeight = map.terrainHeightAt(this.manager.camera.position.x, this.manager.camera.position.z) || 0;\r\n\r\n let cameraDelta = cameraTerrainHeight - this.cameraHeight;\r\n this.cameraHeight += cameraDelta * cameraSmoothing;\r\n if (Math.abs(cameraDelta) < 0.001) this.cameraHeight = cameraTerrainHeight;\r\n\r\n let maxAngleHeight = Math.cos(this.maxAngle) * this.manager.distance;\r\n this.minCameraHeight = this.cameraHeight - maxAngleHeight + 1;\r\n }\r\n\r\n // adjust targetHeight by distance\r\n this.distanceTagretHeight = Math.max(MathUtils.lerp(this.targetHeight, 0, this.manager.distance / 500), 0);\r\n }\r\n\r\n getSuggestedHeight() {\r\n return Math.max(this.distanceTagretHeight, this.minCameraHeight);\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\n\r\nexport class KeyCombination {\r\n\r\n static CTRL = 0;\r\n static SHIFT = 1;\r\n static ALT = 2;\r\n\r\n /**\r\n * @param code {string}\r\n * @param modifiers {...number}\r\n */\r\n constructor(code, ...modifiers) {\r\n\r\n this.code = code;\r\n this.ctrl = modifiers.includes(KeyCombination.CTRL) || this.code === \"CtrlLeft\" || this.code === \"CtrlRight\";\r\n this.shift = modifiers.includes(KeyCombination.SHIFT) || this.code === \"ShiftLeft\" || this.code === \"ShiftRight\";\r\n this.alt = modifiers.includes(KeyCombination.ALT) || this.code === \"AltLeft\" || this.code === \"AltRight\";\r\n\r\n }\r\n\r\n /**\r\n * @param evt {KeyboardEvent}\r\n * @returns {boolean}\r\n */\r\n testDown(evt) {\r\n return this.code === evt.code &&\r\n this.ctrl === evt.ctrlKey &&\r\n this.shift === evt.shiftKey &&\r\n this.alt === evt.altKey;\r\n }\r\n\r\n /**\r\n * @param evt {KeyboardEvent}\r\n * @returns {boolean}\r\n */\r\n testUp(evt) {\r\n return this.code === evt.code;\r\n }\r\n\r\n static oneDown(evt, ...combinations) {\r\n for (let combination of combinations){\r\n if (combination.testDown(evt)) return true;\r\n }\r\n return false;\r\n }\r\n\r\n static oneUp(evt, ...combinations) {\r\n for (let combination of combinations){\r\n if (combination.testUp(evt)) return true;\r\n }\r\n return false;\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\n\r\nimport {MathUtils, Vector2} from \"three\";\r\nimport {VEC2_ZERO} from \"../../../util/Utils\";\r\nimport {KeyCombination} from \"../../KeyCombination\";\r\n\r\nexport class KeyMoveControls {\r\n\r\n static KEYS = {\r\n LEFT: [\r\n new KeyCombination(\"ArrowLeft\"),\r\n new KeyCombination(\"KeyA\")\r\n ],\r\n UP: [\r\n new KeyCombination(\"ArrowUp\"),\r\n new KeyCombination(\"KeyW\")\r\n ],\r\n RIGHT: [\r\n new KeyCombination(\"ArrowRight\"),\r\n new KeyCombination(\"KeyD\")\r\n ],\r\n DOWN: [\r\n new KeyCombination(\"ArrowDown\"),\r\n new KeyCombination(\"KeyS\")\r\n ],\r\n }\r\n\r\n static temp_v2 = new Vector2();\r\n\r\n /**\r\n * @param target {EventTarget}\r\n * @param speed {number}\r\n * @param stiffness {number}\r\n */\r\n constructor(target, speed, stiffness) {\r\n this.target = target;\r\n this.manager = null;\r\n\r\n this.deltaPosition = new Vector2();\r\n\r\n this.up = false;\r\n this.down = false;\r\n this.left = false;\r\n this.right = false;\r\n\r\n this.speed = speed;\r\n this.stiffness = stiffness;\r\n }\r\n\r\n /**\r\n * @param manager {ControlsManager}\r\n */\r\n start(manager) {\r\n this.manager = manager;\r\n\r\n window.addEventListener(\"keydown\", this.onKeyDown);\r\n window.addEventListener(\"keyup\", this.onKeyUp);\r\n }\r\n\r\n stop() {\r\n window.removeEventListener(\"keydown\", this.onKeyDown);\r\n window.removeEventListener(\"keyup\", this.onKeyUp);\r\n }\r\n\r\n /**\r\n * @param delta {number}\r\n * @param map {Map}\r\n */\r\n update(delta, map) {\r\n if (this.up) this.deltaPosition.y -= 1;\r\n if (this.down) this.deltaPosition.y += 1;\r\n if (this.left) this.deltaPosition.x -= 1;\r\n if (this.right) this.deltaPosition.x += 1;\r\n\r\n if (this.deltaPosition.x === 0 && this.deltaPosition.y === 0) return;\r\n\r\n let smoothing = this.stiffness / (16.666 / delta);\r\n smoothing = MathUtils.clamp(smoothing, 0, 1);\r\n\r\n let rotatedDelta = KeyMoveControls.temp_v2.copy(this.deltaPosition);\r\n rotatedDelta.rotateAround(VEC2_ZERO, this.manager.rotation);\r\n\r\n this.manager.position.x += rotatedDelta.x * smoothing * this.manager.distance * this.speed * delta * 0.06;\r\n this.manager.position.z += rotatedDelta.y * smoothing * this.manager.distance * this.speed * delta * 0.06;\r\n\r\n this.deltaPosition.multiplyScalar(1 - smoothing);\r\n if (this.deltaPosition.lengthSq() < 0.0001) {\r\n this.deltaPosition.set(0, 0);\r\n }\r\n }\r\n\r\n /**\r\n * @param evt {KeyboardEvent}\r\n */\r\n onKeyDown = evt => {\r\n if (KeyCombination.oneDown(evt, ...KeyMoveControls.KEYS.UP)){\r\n this.up = true;\r\n evt.preventDefault();\r\n }\r\n if (KeyCombination.oneDown(evt, ...KeyMoveControls.KEYS.DOWN)){\r\n this.down = true;\r\n evt.preventDefault();\r\n }\r\n if (KeyCombination.oneDown(evt, ...KeyMoveControls.KEYS.LEFT)){\r\n this.left = true;\r\n evt.preventDefault();\r\n }\r\n if (KeyCombination.oneDown(evt, ...KeyMoveControls.KEYS.RIGHT)){\r\n this.right = true;\r\n evt.preventDefault();\r\n }\r\n }\r\n\r\n /**\r\n * @param evt {KeyboardEvent}\r\n */\r\n onKeyUp = evt => {\r\n if (KeyCombination.oneUp(evt, ...KeyMoveControls.KEYS.UP)){\r\n this.up = false;\r\n }\r\n if (KeyCombination.oneUp(evt, ...KeyMoveControls.KEYS.DOWN)){\r\n this.down = false;\r\n }\r\n if (KeyCombination.oneUp(evt, ...KeyMoveControls.KEYS.LEFT)){\r\n this.left = false;\r\n }\r\n if (KeyCombination.oneUp(evt, ...KeyMoveControls.KEYS.RIGHT)){\r\n this.right = false;\r\n }\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\n\r\nimport {MathUtils} from \"three\";\r\nimport {KeyCombination} from \"../../KeyCombination\";\r\n\r\nexport class KeyAngleControls {\r\n\r\n static KEYS = {\r\n UP: [\r\n new KeyCombination(\"ArrowUp\", KeyCombination.ALT),\r\n new KeyCombination(\"KeyW\", KeyCombination.ALT),\r\n new KeyCombination(\"PageUp\")\r\n ],\r\n DOWN: [\r\n new KeyCombination(\"ArrowDown\", KeyCombination.ALT),\r\n new KeyCombination(\"KeyS\", KeyCombination.ALT),\r\n new KeyCombination(\"PageDown\")\r\n ],\r\n }\r\n\r\n /**\r\n * @param target {EventTarget}\r\n * @param speed {number}\r\n * @param stiffness {number}\r\n */\r\n constructor(target, speed, stiffness) {\r\n this.target = target;\r\n this.manager = null;\r\n\r\n this.deltaAngle = 0;\r\n\r\n this.up = false;\r\n this.down = false;\r\n\r\n this.speed = speed;\r\n this.stiffness = stiffness;\r\n }\r\n\r\n /**\r\n * @param manager {ControlsManager}\r\n */\r\n start(manager) {\r\n this.manager = manager;\r\n\r\n window.addEventListener(\"keydown\", this.onKeyDown);\r\n window.addEventListener(\"keyup\", this.onKeyUp);\r\n }\r\n\r\n stop() {\r\n window.removeEventListener(\"keydown\", this.onKeyDown);\r\n window.removeEventListener(\"keyup\", this.onKeyUp);\r\n }\r\n\r\n /**\r\n * @param delta {number}\r\n * @param map {Map}\r\n */\r\n update(delta, map) {\r\n if (this.up) this.deltaAngle -= 1;\r\n if (this.down) this.deltaAngle += 1;\r\n\r\n if (this.deltaAngle === 0) return;\r\n\r\n let smoothing = this.stiffness / (16.666 / delta);\r\n smoothing = MathUtils.clamp(smoothing, 0, 1);\r\n\r\n this.manager.angle += this.deltaAngle * smoothing * this.speed * delta * 0.06;\r\n\r\n this.deltaAngle *= 1 - smoothing;\r\n if (Math.abs(this.deltaAngle) < 0.0001) {\r\n this.deltaAngle = 0;\r\n }\r\n }\r\n\r\n /**\r\n * @param evt {KeyboardEvent}\r\n */\r\n onKeyDown = evt => {\r\n if (KeyCombination.oneDown(evt, ...KeyAngleControls.KEYS.UP)){\r\n this.up = true;\r\n evt.preventDefault();\r\n }\r\n if (KeyCombination.oneDown(evt, ...KeyAngleControls.KEYS.DOWN)){\r\n this.down = true;\r\n evt.preventDefault();\r\n }\r\n }\r\n\r\n /**\r\n * @param evt {KeyboardEvent}\r\n */\r\n onKeyUp = evt => {\r\n if (KeyCombination.oneUp(evt, ...KeyAngleControls.KEYS.UP)){\r\n this.up = false;\r\n }\r\n if (KeyCombination.oneUp(evt, ...KeyAngleControls.KEYS.DOWN)){\r\n this.down = false;\r\n }\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\n\r\nimport {MathUtils} from \"three\";\r\nimport {KeyCombination} from \"../../KeyCombination\";\r\n\r\nexport class KeyRotateControls {\r\n\r\n static KEYS = {\r\n LEFT: [\r\n new KeyCombination(\"ArrowLeft\", KeyCombination.ALT),\r\n new KeyCombination(\"KeyA\", KeyCombination.ALT),\r\n new KeyCombination(\"Delete\"),\r\n ],\r\n RIGHT: [\r\n new KeyCombination(\"ArrowRight\", KeyCombination.ALT),\r\n new KeyCombination(\"KeyD\", KeyCombination.ALT),\r\n new KeyCombination(\"End\"),\r\n ],\r\n }\r\n\r\n /**\r\n * @param target {EventTarget}\r\n * @param speed {number}\r\n * @param stiffness {number}\r\n */\r\n constructor(target, speed, stiffness) {\r\n this.target = target;\r\n this.manager = null;\r\n\r\n this.deltaRotation = 0;\r\n\r\n this.left = false;\r\n this.right = false;\r\n\r\n this.speed = speed;\r\n this.stiffness = stiffness;\r\n }\r\n\r\n /**\r\n * @param manager {ControlsManager}\r\n */\r\n start(manager) {\r\n this.manager = manager;\r\n\r\n window.addEventListener(\"keydown\", this.onKeyDown);\r\n window.addEventListener(\"keyup\", this.onKeyUp);\r\n }\r\n\r\n stop() {\r\n window.removeEventListener(\"keydown\", this.onKeyDown);\r\n window.removeEventListener(\"keyup\", this.onKeyUp);\r\n }\r\n\r\n /**\r\n * @param delta {number}\r\n * @param map {Map}\r\n */\r\n update(delta, map) {\r\n if (this.left) this.deltaRotation += 1;\r\n if (this.right) this.deltaRotation -= 1;\r\n\r\n if (this.deltaRotation === 0) return;\r\n\r\n let smoothing = this.stiffness / (16.666 / delta);\r\n smoothing = MathUtils.clamp(smoothing, 0, 1);\r\n\r\n this.manager.rotation += this.deltaRotation * smoothing * this.speed * delta * 0.06;\r\n\r\n this.deltaRotation *= 1 - smoothing;\r\n if (Math.abs(this.deltaRotation) < 0.0001) {\r\n this.deltaRotation = 0;\r\n }\r\n }\r\n\r\n /**\r\n * @param evt {KeyboardEvent}\r\n */\r\n onKeyDown = evt => {\r\n if (KeyCombination.oneDown(evt, ...KeyRotateControls.KEYS.LEFT)){\r\n this.left = true;\r\n evt.preventDefault();\r\n }\r\n if (KeyCombination.oneDown(evt, ...KeyRotateControls.KEYS.RIGHT)){\r\n this.right = true;\r\n evt.preventDefault();\r\n }\r\n }\r\n\r\n /**\r\n * @param evt {KeyboardEvent}\r\n */\r\n onKeyUp = evt => {\r\n if (KeyCombination.oneUp(evt, ...KeyRotateControls.KEYS.LEFT)){\r\n this.left = false;\r\n }\r\n if (KeyCombination.oneUp(evt, ...KeyRotateControls.KEYS.RIGHT)){\r\n this.right = false;\r\n }\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\n\r\nimport {MathUtils} from \"three\";\r\nimport {KeyCombination} from \"../../KeyCombination\";\r\n\r\nexport class KeyZoomControls {\r\n\r\n static KEYS = {\r\n IN: [\r\n new KeyCombination(\"NumpadAdd\"),\r\n new KeyCombination(\"Insert\"),\r\n ],\r\n OUT: [\r\n new KeyCombination(\"NumpadSubtract\"),\r\n new KeyCombination(\"Home\"),\r\n ],\r\n }\r\n\r\n /**\r\n * @param target {EventTarget}\r\n * @param speed {number}\r\n * @param stiffness {number}\r\n */\r\n constructor(target, speed, stiffness) {\r\n this.target = target;\r\n this.manager = null;\r\n\r\n this.deltaZoom = 0;\r\n\r\n this.in = false;\r\n this.out = false;\r\n\r\n this.speed = speed;\r\n this.stiffness = stiffness;\r\n }\r\n\r\n /**\r\n * @param manager {ControlsManager}\r\n */\r\n start(manager) {\r\n this.manager = manager;\r\n\r\n window.addEventListener(\"keydown\", this.onKeyDown);\r\n window.addEventListener(\"keyup\", this.onKeyUp);\r\n }\r\n\r\n stop() {\r\n window.removeEventListener(\"keydown\", this.onKeyDown);\r\n window.removeEventListener(\"keyup\", this.onKeyUp);\r\n }\r\n\r\n /**\r\n * @param delta {number}\r\n * @param map {Map}\r\n */\r\n update(delta, map) {\r\n if (this.in) this.deltaZoom -= 1;\r\n if (this.out) this.deltaZoom += 1;\r\n\r\n if (this.deltaZoom === 0) return;\r\n\r\n let smoothing = this.stiffness / (16.666 / delta);\r\n smoothing = MathUtils.clamp(smoothing, 0, 1);\r\n\r\n this.manager.distance *= Math.pow(1.5, this.deltaZoom * smoothing * this.speed * delta * 0.06);\r\n\r\n this.deltaZoom *= 1 - smoothing;\r\n if (Math.abs(this.deltaZoom) < 0.0001) {\r\n this.deltaZoom = 0;\r\n }\r\n }\r\n\r\n /**\r\n * @param evt {KeyboardEvent}\r\n */\r\n onKeyDown = evt => {\r\n if (KeyCombination.oneDown(evt, ...KeyZoomControls.KEYS.IN)){\r\n this.in = true;\r\n evt.preventDefault();\r\n }\r\n if (KeyCombination.oneDown(evt, ...KeyZoomControls.KEYS.OUT)){\r\n this.out = true;\r\n evt.preventDefault();\r\n }\r\n }\r\n\r\n /**\r\n * @param evt {KeyboardEvent}\r\n */\r\n onKeyUp = evt => {\r\n if (KeyCombination.oneUp(evt, ...KeyZoomControls.KEYS.IN)){\r\n this.in = false;\r\n }\r\n if (KeyCombination.oneUp(evt, ...KeyZoomControls.KEYS.OUT)){\r\n this.out = false;\r\n }\r\n }\r\n\r\n}","import {MathUtils, Vector2} from \"three\";\r\n/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\n\r\nimport {VEC2_ZERO} from \"../../../util/Utils\";\r\n\r\nexport class TouchMoveControls {\r\n\r\n static tempVec2_1 = new Vector2();\r\n\r\n /**\r\n * @param target {Element}\r\n * @param hammer {Manager}\r\n * @param speed {number}\r\n * @param stiffness {number}\r\n */\r\n constructor(target, hammer, speed, stiffness) {\r\n this.target = target;\r\n this.hammer = hammer;\r\n this.manager = null;\r\n\r\n this.moving = false;\r\n this.lastPosition = new Vector2();\r\n this.deltaPosition = new Vector2();\r\n\r\n this.speed = speed;\r\n this.stiffness = stiffness;\r\n\r\n this.pixelToSpeedMultiplierX = 0;\r\n this.pixelToSpeedMultiplierY = 0;\r\n this.updatePixelToSpeedMultiplier();\r\n }\r\n\r\n /**\r\n * @param manager {ControlsManager}\r\n */\r\n start(manager) {\r\n this.manager = manager;\r\n\r\n this.hammer.on(\"movestart\", this.onTouchDown);\r\n this.hammer.on(\"movemove\", this.onTouchMove);\r\n this.hammer.on(\"moveend\", this.onTouchUp);\r\n this.hammer.on(\"movecancel\", this.onTouchUp);\r\n\r\n window.addEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\r\n }\r\n\r\n stop() {\r\n this.hammer.off(\"movestart\", this.onTouchDown);\r\n this.hammer.off(\"movemove\", this.onTouchMove);\r\n this.hammer.off(\"moveend\", this.onTouchUp);\r\n this.hammer.off(\"movecancel\", this.onTouchUp);\r\n\r\n window.removeEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\r\n }\r\n\r\n /**\r\n * @param delta {number}\r\n * @param map {Map}\r\n */\r\n update(delta, map) {\r\n if (this.deltaPosition.x === 0 && this.deltaPosition.y === 0) return;\r\n\r\n let smoothing = this.stiffness / (16.666 / delta);\r\n smoothing = MathUtils.clamp(smoothing, 0, 1);\r\n\r\n let directionDelta = TouchMoveControls.tempVec2_1.copy(this.deltaPosition);\r\n directionDelta.rotateAround(VEC2_ZERO, this.manager.rotation);\r\n\r\n this.manager.position.x += directionDelta.x * smoothing * this.manager.distance * this.speed * this.pixelToSpeedMultiplierX;\r\n this.manager.position.z += directionDelta.y * smoothing * this.manager.distance * this.speed * this.pixelToSpeedMultiplierY;\r\n\r\n this.deltaPosition.multiplyScalar(1 - smoothing);\r\n if (this.deltaPosition.lengthSq() < 0.0001) {\r\n this.deltaPosition.set(0, 0);\r\n }\r\n }\r\n\r\n reset() {\r\n this.deltaPosition.set(0, 0);\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {object}\r\n */\r\n onTouchDown = evt => {\r\n if (evt.pointerType === \"mouse\") return;\r\n\r\n this.moving = true;\r\n this.deltaPosition.set(0, 0);\r\n this.lastPosition.set(evt.center.x, evt.center.y);\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {object}\r\n */\r\n onTouchMove = evt => {\r\n if (evt.pointerType === \"mouse\") return;\r\n\r\n let position = TouchMoveControls.tempVec2_1.set(evt.center.x, evt.center.y);\r\n\r\n if(this.moving){\r\n this.deltaPosition.sub(position).add(this.lastPosition);\r\n }\r\n\r\n this.lastPosition.copy(position);\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {object}\r\n */\r\n onTouchUp = evt => {\r\n if (evt.pointerType === \"mouse\") return;\r\n\r\n this.moving = false;\r\n }\r\n\r\n updatePixelToSpeedMultiplier = () => {\r\n this.pixelToSpeedMultiplierX = (1 / this.target.clientWidth) * (this.target.clientWidth / this.target.clientHeight);\r\n this.pixelToSpeedMultiplierY = 1 / this.target.clientHeight;\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\n\r\nimport {MathUtils} from \"three\";\r\n\r\nexport class TouchRotateControls {\r\n\r\n /**\r\n * @param hammer {Manager}\r\n * @param speed {number}\r\n * @param stiffness {number}\r\n */\r\n constructor(hammer, speed, stiffness) {\r\n this.hammer = hammer;\r\n this.manager = null;\r\n\r\n this.moving = false;\r\n this.lastRotation = 0;\r\n this.deltaRotation = 0;\r\n\r\n this.speed = speed;\r\n this.stiffness = stiffness;\r\n }\r\n\r\n /**\r\n * @param manager {ControlsManager}\r\n */\r\n start(manager) {\r\n this.manager = manager;\r\n\r\n this.hammer.on(\"rotatestart\", this.onTouchDown);\r\n this.hammer.on(\"rotatemove\", this.onTouchMove);\r\n this.hammer.on(\"rotateend\", this.onTouchUp);\r\n this.hammer.on(\"rotatecancel\", this.onTouchUp);\r\n }\r\n\r\n stop() {\r\n this.hammer.off(\"rotatestart\", this.onTouchDown);\r\n this.hammer.off(\"rotatemove\", this.onTouchMove);\r\n this.hammer.off(\"rotateend\", this.onTouchUp);\r\n this.hammer.off(\"rotatecancel\", this.onTouchUp);\r\n }\r\n\r\n /**\r\n * @param delta {number}\r\n * @param map {Map}\r\n */\r\n update(delta, map) {\r\n if (this.deltaRotation === 0) return;\r\n\r\n let smoothing = this.stiffness / (16.666 / delta);\r\n smoothing = MathUtils.clamp(smoothing, 0, 1);\r\n\r\n this.manager.rotation += this.deltaRotation * smoothing * this.speed;\r\n\r\n this.deltaRotation *= 1 - smoothing;\r\n if (Math.abs(this.deltaRotation) < 0.0001) {\r\n this.deltaRotation = 0;\r\n }\r\n }\r\n\r\n reset() {\r\n this.deltaRotation = 0;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {object}\r\n */\r\n onTouchDown = evt => {\r\n this.moving = true;\r\n this.deltaRotation = 0;\r\n this.lastRotation = evt.rotation;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {object}\r\n */\r\n onTouchMove = evt => {\r\n if(this.moving){\r\n let delta = evt.rotation - this.lastRotation;\r\n if (delta > 180) delta -= 360;\r\n if (delta < -180) delta += 360;\r\n\r\n this.deltaRotation -= delta;\r\n }\r\n\r\n this.lastRotation = evt.rotation;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {object}\r\n */\r\n onTouchUp = evt => {\r\n this.moving = false;\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\n\r\nimport {MathUtils} from \"three\";\r\n\r\nexport class TouchAngleControls {\r\n\r\n /**\r\n * @param target {Element}\r\n * @param hammer {Manager}\r\n * @param speed {number}\r\n * @param stiffness {number}\r\n */\r\n constructor(target, hammer, speed, stiffness) {\r\n this.target = target;\r\n this.hammer = hammer;\r\n this.manager = null;\r\n\r\n this.moving = false;\r\n this.lastY = 0;\r\n this.deltaAngle = 0;\r\n\r\n this.speed = speed;\r\n this.stiffness = stiffness;\r\n\r\n this.pixelToSpeedMultiplierY = 0;\r\n this.updatePixelToSpeedMultiplier();\r\n }\r\n\r\n /**\r\n * @param manager {ControlsManager}\r\n */\r\n start(manager) {\r\n this.manager = manager;\r\n\r\n this.hammer.on(\"tiltstart\", this.onTouchDown);\r\n this.hammer.on(\"tiltmove\", this.onTouchMove);\r\n this.hammer.on(\"tiltend\", this.onTouchUp);\r\n this.hammer.on(\"tiltcancel\", this.onTouchUp);\r\n\r\n window.addEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\r\n }\r\n\r\n stop() {\r\n this.hammer.off(\"tiltstart\", this.onTouchDown);\r\n this.hammer.off(\"tiltmove\", this.onTouchMove);\r\n this.hammer.off(\"tiltend\", this.onTouchUp);\r\n this.hammer.off(\"tiltcancel\", this.onTouchUp);\r\n\r\n window.removeEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\r\n }\r\n\r\n /**\r\n * @param delta {number}\r\n * @param map {Map}\r\n */\r\n update(delta, map) {\r\n if (this.deltaAngle === 0) return;\r\n\r\n let smoothing = this.stiffness / (16.666 / delta);\r\n smoothing = MathUtils.clamp(smoothing, 0, 1);\r\n\r\n this.manager.angle += this.deltaAngle * smoothing * this.speed * this.pixelToSpeedMultiplierY;\r\n\r\n this.deltaAngle *= 1 - smoothing;\r\n if (Math.abs(this.deltaAngle) < 0.0001) {\r\n this.deltaAngle = 0;\r\n }\r\n }\r\n\r\n reset() {\r\n this.deltaAngle = 0;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {object}\r\n */\r\n onTouchDown = evt => {\r\n this.moving = true;\r\n this.deltaAngle = 0;\r\n this.lastY = evt.center.y;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {object}\r\n */\r\n onTouchMove = evt => {\r\n if(this.moving){\r\n this.deltaAngle -= evt.center.y - this.lastY;\r\n }\r\n\r\n this.lastY = evt.center.y;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {object}\r\n */\r\n onTouchUp = evt => {\r\n this.moving = false;\r\n }\r\n\r\n updatePixelToSpeedMultiplier = () => {\r\n this.pixelToSpeedMultiplierY = 1 / this.target.clientHeight;\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\n\r\nexport class TouchZoomControls {\r\n\r\n /**\r\n * @param hammer {Manager}\r\n */\r\n constructor(hammer) {\r\n this.hammer = hammer;\r\n this.manager = null;\r\n\r\n this.moving = false;\r\n this.deltaZoom = 1;\r\n this.lastZoom = 1;\r\n }\r\n\r\n /**\r\n * @param manager {ControlsManager}\r\n */\r\n start(manager) {\r\n this.manager = manager;\r\n\r\n this.hammer.on(\"zoomstart\", this.onTouchDown);\r\n this.hammer.on(\"zoommove\", this.onTouchMove);\r\n this.hammer.on(\"zoomend\", this.onTouchUp);\r\n this.hammer.on(\"zoomcancel\", this.onTouchUp);\r\n }\r\n\r\n stop() {\r\n this.hammer.off(\"zoomstart\", this.onTouchDown);\r\n this.hammer.off(\"zoommove\", this.onTouchMove);\r\n this.hammer.off(\"zoomend\", this.onTouchUp);\r\n this.hammer.off(\"zoomcancel\", this.onTouchUp);\r\n }\r\n\r\n /**\r\n * @param delta {number}\r\n * @param map {Map}\r\n */\r\n update(delta, map) {\r\n if (this.deltaZoom === 1) return;\r\n\r\n this.manager.distance /= this.deltaZoom;\r\n this.deltaZoom = 1;\r\n }\r\n\r\n reset() {\r\n this.deltaZoom = 1;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {object}\r\n */\r\n onTouchDown = evt => {\r\n this.moving = true;\r\n this.lastZoom = 1;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {object}\r\n */\r\n onTouchMove = evt => {\r\n if(this.moving){\r\n this.deltaZoom *= evt.scale / this.lastZoom;\r\n }\r\n\r\n this.lastZoom = evt.scale;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {object}\r\n */\r\n onTouchUp = evt => {\r\n this.moving = false;\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\n\r\nimport {MouseMoveControls} from \"./mouse/MouseMoveControls\";\r\nimport {MouseZoomControls} from \"./mouse/MouseZoomControls\";\r\nimport {MouseRotateControls} from \"./mouse/MouseRotateControls\";\r\nimport {MouseAngleControls} from \"./mouse/MouseAngleControls\";\r\nimport {MathUtils, Vector2, Vector3} from \"three\";\r\nimport {Manager, Pan, Pinch, Rotate, Tap, DIRECTION_ALL, DIRECTION_VERTICAL} from \"hammerjs\";\r\nimport {softClamp} from \"../../util/Utils\";\r\nimport {MapHeightControls} from \"./MapHeightControls\";\r\nimport {KeyMoveControls} from \"./keyboard/KeyMoveControls\";\r\nimport {KeyAngleControls} from \"./keyboard/KeyAngleControls\";\r\nimport {KeyRotateControls} from \"./keyboard/KeyRotateControls\";\r\nimport {KeyZoomControls} from \"./keyboard/KeyZoomControls\";\r\nimport {TouchMoveControls} from \"./touch/TouchMoveControls\";\r\nimport {TouchRotateControls} from \"./touch/TouchRotateControls\";\r\nimport {TouchAngleControls} from \"./touch/TouchAngleControls\";\r\nimport {TouchZoomControls} from \"./touch/TouchZoomControls\";\r\nimport {PlayerMarker} from \"../../markers/PlayerMarker\";\r\n\r\nconst HALF_PI = Math.PI * 0.5;\r\n\r\nexport class MapControls {\r\n\r\n static _beforeMoveTemp = new Vector3();\r\n\r\n /**\r\n * @param rootElement {Element}\r\n */\r\n constructor(rootElement) {\r\n this.rootElement = rootElement;\r\n\r\n this.data = {\r\n followingPlayer: null\r\n };\r\n\r\n /** @type {ControlsManager} */\r\n this.manager = null;\r\n\r\n this.hammer = new Manager(this.rootElement);\r\n this.initializeHammer();\r\n\r\n //controls\r\n this.mouseMove = new MouseMoveControls(this.rootElement, 1.5,0.3);\r\n this.mouseRotate = new MouseRotateControls(this.rootElement, 6, 0.3);\r\n this.mouseAngle = new MouseAngleControls(this.rootElement, 3, 0.3);\r\n this.mouseZoom = new MouseZoomControls(this.rootElement, 1, 0.2);\r\n\r\n this.keyMove = new KeyMoveControls(this.rootElement, 0.025, 0.2);\r\n this.keyRotate = new KeyRotateControls(this.rootElement, 0.06, 0.15);\r\n this.keyAngle = new KeyAngleControls(this.rootElement, 0.04, 0.15);\r\n this.keyZoom = new KeyZoomControls(this.rootElement, 0.2, 0.15);\r\n\r\n this.touchMove = new TouchMoveControls(this.rootElement, this.hammer, 1.5,0.3);\r\n this.touchRotate = new TouchRotateControls(this.hammer, 0.0174533, 0.3);\r\n this.touchAngle = new TouchAngleControls(this.rootElement, this.hammer, 3, 0.3);\r\n this.touchZoom = new TouchZoomControls(this.hammer);\r\n\r\n this.mapHeight = new MapHeightControls(0.2, 0.1);\r\n\r\n this.lastTap = -1;\r\n this.lastTapCenter = null;\r\n\r\n this.minDistance = 5;\r\n this.maxDistance = 100000;\r\n }\r\n\r\n /**\r\n * @param manager {ControlsManager}\r\n */\r\n start(manager) {\r\n this.manager = manager;\r\n\r\n this.rootElement.addEventListener(\"contextmenu\", this.onContextMenu);\r\n this.hammer.on(\"tap\", this.onTap);\r\n\r\n this.mouseMove.start(manager);\r\n this.mouseRotate.start(manager);\r\n this.mouseAngle.start(manager);\r\n this.mouseZoom.start(manager);\r\n\r\n this.keyMove.start(manager);\r\n this.keyRotate.start(manager);\r\n this.keyAngle.start(manager);\r\n this.keyZoom.start(manager);\r\n\r\n this.touchMove.start(manager);\r\n this.touchRotate.start(manager);\r\n this.touchAngle.start(manager);\r\n this.touchZoom.start(manager);\r\n\r\n this.mapHeight.start(manager);\r\n }\r\n\r\n stop() {\r\n this.stopFollowingPlayerMarker();\r\n\r\n this.rootElement.removeEventListener(\"contextmenu\", this.onContextMenu);\r\n this.hammer.off(\"tap\", this.onTap);\r\n\r\n this.mouseMove.stop();\r\n this.mouseRotate.stop();\r\n this.mouseAngle.stop();\r\n this.mouseZoom.stop();\r\n\r\n this.keyMove.stop();\r\n this.keyRotate.stop();\r\n this.keyAngle.stop();\r\n this.keyZoom.stop();\r\n\r\n this.touchMove.stop();\r\n this.touchRotate.stop();\r\n this.touchAngle.stop();\r\n this.touchZoom.stop();\r\n\r\n this.mapHeight.stop();\r\n }\r\n\r\n /**\r\n * @param delta {number}\r\n * @param map {Map}\r\n */\r\n update(delta, map) {\r\n this.manager.position.y = 0; // reset target y position\r\n\r\n // move\r\n MapControls._beforeMoveTemp.copy(this.manager.position);\r\n this.mouseMove.update(delta, map);\r\n this.keyMove.update(delta, map);\r\n this.touchMove.update(delta, map);\r\n\r\n // if moved, stop following the marker and give back control\r\n if (this.data.followingPlayer && !MapControls._beforeMoveTemp.equals(this.manager.position)) {\r\n this.stopFollowingPlayerMarker();\r\n }\r\n\r\n // follow player marker\r\n if (this.data.followingPlayer) {\r\n this.manager.position.copy(this.data.followingPlayer.position);\r\n }\r\n\r\n // zoom\r\n this.mouseZoom.update(delta, map);\r\n this.keyZoom.update(delta, map);\r\n this.touchZoom.update(delta, map);\r\n\r\n this.manager.distance = softClamp(this.manager.distance, this.minDistance, this.maxDistance, 0.8);\r\n\r\n // max angle for current distance\r\n let maxAngleForZoom = this.getMaxPerspectiveAngleForDistance(this.manager.distance);\r\n\r\n // rotation\r\n if (this.manager.ortho === 0) {\r\n this.mouseRotate.update(delta, map);\r\n this.keyRotate.update(delta, map);\r\n this.touchRotate.update(delta, map);\r\n }\r\n\r\n // tilt\r\n if (this.manager.ortho === 0) {\r\n this.mouseAngle.update(delta, map);\r\n this.keyAngle.update(delta, map);\r\n this.touchAngle.update(delta, map);\r\n this.manager.angle = softClamp(this.manager.angle, 0, maxAngleForZoom, 0.8);\r\n }\r\n\r\n // target height\r\n if (this.manager.ortho === 0 || this.manager.angle === 0) {\r\n this.mapHeight.maxAngle = maxAngleForZoom;\r\n this.mapHeight.update(delta, map);\r\n }\r\n }\r\n\r\n reset() {\r\n this.mouseMove.reset();\r\n this.mouseRotate.reset();\r\n this.mouseAngle.reset();\r\n this.mouseZoom.reset();\r\n\r\n this.touchMove.reset();\r\n this.touchRotate.reset();\r\n this.touchAngle.reset();\r\n this.touchZoom.reset();\r\n }\r\n\r\n getMaxPerspectiveAngleForDistance(distance) {\r\n return MathUtils.clamp((1 - Math.pow(Math.max(distance - 5, 0.001) / 500, 0.5)) * HALF_PI,0, HALF_PI)\r\n }\r\n\r\n initializeHammer() {\r\n let touchTap = new Tap({ event: 'tap', pointers: 1, taps: 1, threshold: 5 });\r\n let touchMove = new Pan({ event: 'move', pointers: 1, direction: DIRECTION_ALL, threshold: 0 });\r\n let touchTilt = new Pan({ event: 'tilt', pointers: 2, direction: DIRECTION_VERTICAL, threshold: 0 });\r\n let touchRotate = new Rotate({ event: 'rotate', pointers: 2, threshold: 0 });\r\n let touchZoom = new Pinch({ event: 'zoom', pointers: 2, threshold: 0 });\r\n\r\n touchMove.recognizeWith(touchRotate);\r\n touchMove.recognizeWith(touchTilt);\r\n touchMove.recognizeWith(touchZoom);\r\n touchTilt.recognizeWith(touchRotate);\r\n touchTilt.recognizeWith(touchZoom);\r\n touchRotate.recognizeWith(touchZoom);\r\n\r\n this.hammer.add(touchTap);\r\n this.hammer.add(touchTilt);\r\n this.hammer.add(touchMove);\r\n this.hammer.add(touchRotate);\r\n this.hammer.add(touchZoom);\r\n }\r\n\r\n /**\r\n * @param marker {object}\r\n */\r\n followPlayerMarker(marker) {\r\n if (marker.isPlayerMarker) marker = marker.data;\r\n this.data.followingPlayer = marker;\r\n }\r\n\r\n stopFollowingPlayerMarker() {\r\n this.data.followingPlayer = null;\r\n }\r\n\r\n onContextMenu = evt => {\r\n evt.preventDefault();\r\n }\r\n\r\n onTap = evt => {\r\n let doubleTap = false;\r\n let center = new Vector2(evt.center.x, evt.center.y);\r\n\r\n let now = Date.now();\r\n if (this.lastTap > 0 && this.lastTapCenter && now - this.lastTap < 500 && this.lastTapCenter.distanceTo(center) < 5){\r\n doubleTap = true;\r\n this.lastTap = -1;\r\n } else {\r\n this.lastTap = now;\r\n this.lastTapCenter = center;\r\n }\r\n\r\n this.manager.handleMapInteraction(new Vector2(evt.center.x, evt.center.y), {doubleTap: doubleTap});\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\n\r\nimport {MathUtils, Vector2} from \"three\";\r\nimport {VEC2_ZERO} from \"../../../util/Utils\";\r\nimport {KeyCombination} from \"../../KeyCombination\";\r\n\r\nexport class KeyMoveControls {\r\n\r\n static KEYS = {\r\n LEFT: [\r\n new KeyCombination(\"ArrowLeft\"),\r\n new KeyCombination(\"KeyA\")\r\n ],\r\n UP: [\r\n new KeyCombination(\"ArrowUp\"),\r\n new KeyCombination(\"KeyW\")\r\n ],\r\n RIGHT: [\r\n new KeyCombination(\"ArrowRight\"),\r\n new KeyCombination(\"KeyD\")\r\n ],\r\n DOWN: [\r\n new KeyCombination(\"ArrowDown\"),\r\n new KeyCombination(\"KeyS\")\r\n ],\r\n }\r\n\r\n static temp_v2 = new Vector2();\r\n\r\n /**\r\n * @param target {EventTarget}\r\n * @param speed {number}\r\n * @param stiffness {number}\r\n */\r\n constructor(target, speed, stiffness) {\r\n this.target = target;\r\n this.manager = null;\r\n\r\n this.deltaPosition = new Vector2();\r\n\r\n this.up = false;\r\n this.down = false;\r\n this.left = false;\r\n this.right = false;\r\n\r\n this.speed = speed;\r\n this.stiffness = stiffness;\r\n }\r\n\r\n /**\r\n * @param manager {ControlsManager}\r\n */\r\n start(manager) {\r\n this.manager = manager;\r\n\r\n window.addEventListener(\"keydown\", this.onKeyDown);\r\n window.addEventListener(\"keyup\", this.onKeyUp);\r\n }\r\n\r\n stop() {\r\n window.removeEventListener(\"keydown\", this.onKeyDown);\r\n window.removeEventListener(\"keyup\", this.onKeyUp);\r\n }\r\n\r\n /**\r\n * @param delta {number}\r\n * @param map {Map}\r\n */\r\n update(delta, map) {\r\n if (this.up) this.deltaPosition.y -= 1;\r\n if (this.down) this.deltaPosition.y += 1;\r\n if (this.left) this.deltaPosition.x -= 1;\r\n if (this.right) this.deltaPosition.x += 1;\r\n\r\n if (this.deltaPosition.x === 0 && this.deltaPosition.y === 0) return;\r\n\r\n let smoothing = this.stiffness / (16.666 / delta);\r\n smoothing = MathUtils.clamp(smoothing, 0, 1);\r\n\r\n let rotatedDelta = KeyMoveControls.temp_v2.copy(this.deltaPosition);\r\n rotatedDelta.rotateAround(VEC2_ZERO, this.manager.rotation);\r\n\r\n this.manager.position.x += rotatedDelta.x * smoothing * this.speed * delta * 0.06;\r\n this.manager.position.z += rotatedDelta.y * smoothing * this.speed * delta * 0.06;\r\n\r\n this.deltaPosition.multiplyScalar(1 - smoothing);\r\n if (this.deltaPosition.lengthSq() < 0.0001) {\r\n this.deltaPosition.set(0, 0);\r\n }\r\n }\r\n\r\n /**\r\n * @param evt {KeyboardEvent}\r\n */\r\n onKeyDown = evt => {\r\n if (KeyCombination.oneUp(evt, ...KeyMoveControls.KEYS.UP)){\r\n this.up = true;\r\n evt.preventDefault();\r\n }\r\n if (KeyCombination.oneUp(evt, ...KeyMoveControls.KEYS.DOWN)){\r\n this.down = true;\r\n evt.preventDefault();\r\n }\r\n if (KeyCombination.oneUp(evt, ...KeyMoveControls.KEYS.LEFT)){\r\n this.left = true;\r\n evt.preventDefault();\r\n }\r\n if (KeyCombination.oneUp(evt, ...KeyMoveControls.KEYS.RIGHT)){\r\n this.right = true;\r\n evt.preventDefault();\r\n }\r\n }\r\n\r\n /**\r\n * @param evt {KeyboardEvent}\r\n */\r\n onKeyUp = evt => {\r\n if (KeyCombination.oneUp(evt, ...KeyMoveControls.KEYS.UP)){\r\n this.up = false;\r\n }\r\n if (KeyCombination.oneUp(evt, ...KeyMoveControls.KEYS.DOWN)){\r\n this.down = false;\r\n }\r\n if (KeyCombination.oneUp(evt, ...KeyMoveControls.KEYS.LEFT)){\r\n this.left = false;\r\n }\r\n if (KeyCombination.oneUp(evt, ...KeyMoveControls.KEYS.RIGHT)){\r\n this.right = false;\r\n }\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\n\r\nimport {MathUtils} from \"three\";\r\n\r\nexport class MouseRotateControls {\r\n\r\n /**\r\n * @param target {Element}\r\n * @param speedLeft {number}\r\n * @param speedRight {number}\r\n * @param speedCapture {number}\r\n * @param stiffness {number}\r\n */\r\n constructor(target, speedLeft, speedRight, speedCapture, stiffness) {\r\n this.target = target;\r\n this.manager = null;\r\n\r\n this.moving = false;\r\n this.lastX = 0;\r\n this.deltaRotation = 0;\r\n\r\n this.speedLeft = speedLeft;\r\n this.speedRight = speedRight;\r\n this.speedCapture = speedCapture;\r\n this.stiffness = stiffness;\r\n\r\n this.pixelToSpeedMultiplier = 0;\r\n this.updatePixelToSpeedMultiplier();\r\n }\r\n\r\n /**\r\n * @param manager {ControlsManager}\r\n */\r\n start(manager) {\r\n this.manager = manager;\r\n\r\n this.target.addEventListener(\"mousedown\", this.onMouseDown);\r\n window.addEventListener(\"mousemove\", this.onMouseMove);\r\n window.addEventListener(\"mouseup\", this.onMouseUp);\r\n\r\n window.addEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\r\n }\r\n\r\n stop() {\r\n this.target.removeEventListener(\"mousedown\", this.onMouseDown);\r\n window.removeEventListener(\"mousemove\", this.onMouseMove);\r\n window.removeEventListener(\"mouseup\", this.onMouseUp);\r\n\r\n window.removeEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\r\n }\r\n\r\n /**\r\n * @param delta {number}\r\n * @param map {Map}\r\n */\r\n update(delta, map) {\r\n if (this.deltaRotation === 0) return;\r\n\r\n let smoothing = this.stiffness / (16.666 / delta);\r\n smoothing = MathUtils.clamp(smoothing, 0, 1);\r\n\r\n this.manager.rotation += this.deltaRotation * smoothing;\r\n\r\n this.deltaRotation *= 1 - smoothing;\r\n if (Math.abs(this.deltaRotation) < 0.0001) {\r\n this.deltaRotation = 0;\r\n }\r\n }\r\n\r\n reset() {\r\n this.deltaRotation = 0;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {MouseEvent}\r\n */\r\n onMouseDown = evt => {\r\n this.moving = true;\r\n this.deltaRotation = 0;\r\n this.lastX = evt.x;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {MouseEvent}\r\n */\r\n onMouseMove = evt => {\r\n if (document.pointerLockElement) {\r\n this.deltaRotation -= evt.movementX * this.speedCapture * this.pixelToSpeedMultiplier;\r\n }\r\n\r\n else if(this.moving){\r\n if (evt.buttons === 1) {\r\n this.deltaRotation -= (evt.x - this.lastX) * this.speedLeft * this.pixelToSpeedMultiplier;\r\n } else {\r\n this.deltaRotation -= (evt.x - this.lastX) * this.speedRight * this.pixelToSpeedMultiplier;\r\n }\r\n }\r\n\r\n this.lastX = evt.x;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {MouseEvent}\r\n */\r\n onMouseUp = evt => {\r\n this.moving = false;\r\n }\r\n\r\n updatePixelToSpeedMultiplier = () => {\r\n this.pixelToSpeedMultiplier = (1 / this.target.clientWidth) * (this.target.clientWidth / this.target.clientHeight);\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\n\r\nimport {MathUtils} from \"three\";\r\n\r\nexport class MouseAngleControls {\r\n\r\n /**\r\n * @param target {EventTarget}\r\n * @param speedLeft {number}\r\n * @param speedRight {number}\r\n * @param speedCapture {number}\r\n * @param stiffness {number}\r\n */\r\n constructor(target, speedLeft, speedRight, speedCapture, stiffness) {\r\n this.target = target;\r\n this.manager = null;\r\n\r\n this.moving = false;\r\n this.lastY = 0;\r\n this.deltaAngle = 0;\r\n\r\n this.speedLeft = speedLeft;\r\n this.speedRight = speedRight;\r\n this.speedCapture = speedCapture;\r\n this.stiffness = stiffness;\r\n\r\n this.pixelToSpeedMultiplier = 0;\r\n this.updatePixelToSpeedMultiplier();\r\n }\r\n\r\n /**\r\n * @param manager {ControlsManager}\r\n */\r\n start(manager) {\r\n this.manager = manager;\r\n\r\n this.target.addEventListener(\"mousedown\", this.onMouseDown);\r\n window.addEventListener(\"mousemove\", this.onMouseMove);\r\n window.addEventListener(\"mouseup\", this.onMouseUp);\r\n\r\n window.addEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\r\n }\r\n\r\n stop() {\r\n this.target.removeEventListener(\"mousedown\", this.onMouseDown);\r\n window.removeEventListener(\"mousemove\", this.onMouseMove);\r\n window.removeEventListener(\"mouseup\", this.onMouseUp);\r\n\r\n window.removeEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\r\n }\r\n\r\n /**\r\n * @param delta {number}\r\n * @param map {Map}\r\n */\r\n update(delta, map) {\r\n if (this.deltaAngle === 0) return;\r\n\r\n let smoothing = this.stiffness / (16.666 / delta);\r\n smoothing = MathUtils.clamp(smoothing, 0, 1);\r\n\r\n this.manager.angle += this.deltaAngle * smoothing;\r\n\r\n this.deltaAngle *= 1 - smoothing;\r\n if (Math.abs(this.deltaAngle) < 0.0001) {\r\n this.deltaAngle = 0;\r\n }\r\n }\r\n\r\n reset() {\r\n this.deltaAngle = 0;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {MouseEvent}\r\n */\r\n onMouseDown = evt => {\r\n this.moving = true;\r\n this.deltaAngle = 0;\r\n this.lastY = evt.y;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {MouseEvent}\r\n */\r\n onMouseMove = evt => {\r\n if (document.pointerLockElement) {\r\n this.deltaAngle += evt.movementY * this.speedCapture * this.pixelToSpeedMultiplier;\r\n }\r\n\r\n else if(this.moving){\r\n if (evt.buttons === 1) {\r\n this.deltaAngle += (evt.y - this.lastY) * this.speedLeft * this.pixelToSpeedMultiplier;\r\n } else {\r\n this.deltaAngle += (evt.y - this.lastY) * this.speedRight * this.pixelToSpeedMultiplier;\r\n }\r\n }\r\n\r\n this.lastY = evt.y;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {MouseEvent}\r\n */\r\n onMouseUp = evt => {\r\n this.moving = false;\r\n }\r\n\r\n updatePixelToSpeedMultiplier = () => {\r\n this.pixelToSpeedMultiplier = 1 / this.target.clientHeight;\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\n\r\nimport {MathUtils} from \"three\";\r\nimport {KeyCombination} from \"../../KeyCombination\";\r\n\r\nexport class KeyHeightControls {\r\n\r\n static KEYS = {\r\n UP: [\r\n new KeyCombination(\"Space\"),\r\n new KeyCombination(\"PageUp\")\r\n ],\r\n DOWN: [\r\n new KeyCombination(\"ShiftLeft\"),\r\n new KeyCombination(\"ShiftRight\"),\r\n new KeyCombination(\"PageDown\")\r\n ],\r\n }\r\n\r\n /**\r\n * @param target {EventTarget}\r\n * @param speed {number}\r\n * @param stiffness {number}\r\n */\r\n constructor(target, speed, stiffness) {\r\n this.target = target;\r\n this.manager = null;\r\n\r\n this.deltaY = 0;\r\n\r\n this.up = false;\r\n this.down = false;\r\n\r\n this.speed = speed;\r\n this.stiffness = stiffness;\r\n }\r\n\r\n /**\r\n * @param manager {ControlsManager}\r\n */\r\n start(manager) {\r\n this.manager = manager;\r\n\r\n window.addEventListener(\"keydown\", this.onKeyDown);\r\n window.addEventListener(\"keyup\", this.onKeyUp);\r\n }\r\n\r\n stop() {\r\n window.removeEventListener(\"keydown\", this.onKeyDown);\r\n window.removeEventListener(\"keyup\", this.onKeyUp);\r\n }\r\n\r\n /**\r\n * @param delta {number}\r\n * @param map {Map}\r\n */\r\n update(delta, map) {\r\n if (this.up) this.deltaY += 1;\r\n if (this.down) this.deltaY -= 1;\r\n\r\n if (this.deltaY === 0) return;\r\n\r\n let smoothing = this.stiffness / (16.666 / delta);\r\n smoothing = MathUtils.clamp(smoothing, 0, 1);\r\n\r\n this.manager.position.y += this.deltaY * smoothing * this.speed * delta * 0.06;\r\n\r\n this.deltaY *= 1 - smoothing;\r\n if (Math.abs(this.deltaY) < 0.0001) {\r\n this.deltaY = 0;\r\n }\r\n }\r\n\r\n /**\r\n * @param evt {KeyboardEvent}\r\n */\r\n onKeyDown = evt => {\r\n if (KeyCombination.oneUp(evt, ...KeyHeightControls.KEYS.UP)){\r\n this.up = true;\r\n evt.preventDefault();\r\n }\r\n else if (KeyCombination.oneUp(evt, ...KeyHeightControls.KEYS.DOWN)){\r\n this.down = true;\r\n evt.preventDefault();\r\n }\r\n }\r\n\r\n /**\r\n * @param evt {KeyboardEvent}\r\n */\r\n onKeyUp = evt => {\r\n if (KeyCombination.oneUp(evt, ...KeyHeightControls.KEYS.UP)){\r\n this.up = false;\r\n }\r\n if (KeyCombination.oneUp(evt, ...KeyHeightControls.KEYS.DOWN)){\r\n this.down = false;\r\n }\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\n\r\nimport {MathUtils, Vector2} from \"three\";\r\n\r\nexport class TouchPanControls {\r\n\r\n static tempVec2_1 = new Vector2();\r\n\r\n /**\r\n * @param target {Element}\r\n * @param hammer {Manager}\r\n * @param speed {number}\r\n * @param stiffness {number}\r\n */\r\n constructor(target, hammer, speed, stiffness) {\r\n this.target = target;\r\n this.hammer = hammer;\r\n this.manager = null;\r\n\r\n this.moving = false;\r\n this.lastPosition = new Vector2();\r\n this.deltaPosition = new Vector2();\r\n\r\n this.speed = speed;\r\n this.stiffness = stiffness;\r\n\r\n this.pixelToSpeedMultiplierX = 0;\r\n this.pixelToSpeedMultiplierY = 0;\r\n this.updatePixelToSpeedMultiplier();\r\n }\r\n\r\n /**\r\n * @param manager {ControlsManager}\r\n */\r\n start(manager) {\r\n this.manager = manager;\r\n\r\n this.hammer.on(\"movestart\", this.onTouchDown);\r\n this.hammer.on(\"movemove\", this.onTouchMove);\r\n this.hammer.on(\"moveend\", this.onTouchUp);\r\n this.hammer.on(\"movecancel\", this.onTouchUp);\r\n\r\n window.addEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\r\n }\r\n\r\n stop() {\r\n this.hammer.off(\"movestart\", this.onTouchDown);\r\n this.hammer.off(\"movemove\", this.onTouchMove);\r\n this.hammer.off(\"moveend\", this.onTouchUp);\r\n this.hammer.off(\"movecancel\", this.onTouchUp);\r\n\r\n window.removeEventListener(\"resize\", this.updatePixelToSpeedMultiplier);\r\n }\r\n\r\n /**\r\n * @param delta {number}\r\n * @param map {Map}\r\n */\r\n update(delta, map) {\r\n if (this.deltaPosition.x === 0 && this.deltaPosition.y === 0) return;\r\n\r\n let smoothing = this.stiffness / (16.666 / delta);\r\n smoothing = MathUtils.clamp(smoothing, 0, 1);\r\n\r\n this.manager.rotation += this.deltaPosition.x * this.speed * this.pixelToSpeedMultiplierX * this.stiffness;\r\n this.manager.angle -= this.deltaPosition.y * this.speed * this.pixelToSpeedMultiplierY * this.stiffness;\r\n\r\n this.deltaPosition.multiplyScalar(1 - smoothing);\r\n if (this.deltaPosition.lengthSq() < 0.0001) {\r\n this.deltaPosition.set(0, 0);\r\n }\r\n }\r\n\r\n reset() {\r\n this.deltaPosition.set(0, 0);\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {object}\r\n */\r\n onTouchDown = evt => {\r\n if (evt.pointerType === \"mouse\") return;\r\n\r\n this.moving = true;\r\n this.deltaPosition.set(0, 0);\r\n this.lastPosition.set(evt.center.x, evt.center.y);\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {object}\r\n */\r\n onTouchMove = evt => {\r\n if (evt.pointerType === \"mouse\") return;\r\n\r\n let position = TouchPanControls.tempVec2_1.set(evt.center.x, evt.center.y);\r\n\r\n if(this.moving){\r\n this.deltaPosition.sub(position).add(this.lastPosition);\r\n }\r\n\r\n this.lastPosition.copy(position);\r\n }\r\n\r\n /**\r\n * @private\r\n * @param evt {object}\r\n */\r\n onTouchUp = evt => {\r\n if (evt.pointerType === \"mouse\") return;\r\n\r\n this.moving = false;\r\n }\r\n\r\n updatePixelToSpeedMultiplier = () => {\r\n this.pixelToSpeedMultiplierX = (1 / this.target.clientWidth) * (this.target.clientWidth / this.target.clientHeight);\r\n this.pixelToSpeedMultiplierY = 1 / this.target.clientHeight;\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\n\r\nimport {MathUtils, Vector2} from \"three\";\r\nimport {Manager, Pan, DIRECTION_ALL} from \"hammerjs\";\r\nimport {animate, EasingFunctions} from \"../../util/Utils\";\r\nimport {KeyMoveControls} from \"./keyboard/KeyMoveControls\";\r\nimport {MouseRotateControls} from \"./mouse/MouseRotateControls\";\r\nimport {MouseAngleControls} from \"./mouse/MouseAngleControls\";\r\nimport {KeyHeightControls} from \"./keyboard/KeyHeightControls\";\r\nimport {TouchPanControls} from \"./touch/TouchPanControls\";\r\n\r\nexport class FreeFlightControls {\r\n\r\n /**\r\n * @param target {Element}\r\n */\r\n constructor(target) {\r\n this.target = target;\r\n this.manager = null;\r\n\r\n this.data = {\r\n\r\n };\r\n\r\n this.hammer = new Manager(this.target);\r\n this.initializeHammer();\r\n\r\n this.keyMove = new KeyMoveControls(this.target, 0.5, 0.1);\r\n this.keyHeight = new KeyHeightControls(this.target, 0.5, 0.2);\r\n this.mouseRotate = new MouseRotateControls(this.target, 1.5, -2, -1.5, 0.5);\r\n this.mouseAngle = new MouseAngleControls(this.target, 1.5, -2, -1.5, 0.5);\r\n this.touchPan = new TouchPanControls(this.target, this.hammer, 5, 0.15);\r\n\r\n this.started = false;\r\n\r\n this.clickStart = new Vector2();\r\n this.moveSpeed = 0.5;\r\n\r\n this.animationTargetHeight = 0;\r\n }\r\n\r\n /**\r\n * @param manager {ControlsManager}\r\n */\r\n start(manager) {\r\n this.manager = manager;\r\n\r\n this.keyMove.start(manager);\r\n this.keyHeight.start(manager);\r\n this.mouseRotate.start(manager);\r\n this.mouseAngle.start(manager);\r\n this.touchPan.start(manager);\r\n\r\n this.target.addEventListener(\"contextmenu\", this.onContextMenu);\r\n this.target.addEventListener(\"mousedown\", this.onMouseDown);\r\n this.target.addEventListener(\"mouseup\", this.onMouseUp);\r\n window.addEventListener(\"wheel\", this.onWheel, {passive: true});\r\n }\r\n\r\n stop() {\r\n this.keyMove.stop();\r\n this.keyHeight.stop();\r\n this.mouseRotate.stop();\r\n this.mouseAngle.stop();\r\n this.touchPan.stop();\r\n\r\n this.target.removeEventListener(\"contextmenu\", this.onContextMenu);\r\n this.target.removeEventListener(\"mousedown\", this.onMouseDown);\r\n this.target.removeEventListener(\"mouseup\", this.onMouseUp);\r\n window.removeEventListener(\"wheel\", this.onWheel);\r\n }\r\n\r\n /**\r\n * @param delta {number}\r\n * @param map {Map}\r\n */\r\n update(delta, map) {\r\n this.keyMove.update(delta, map);\r\n this.keyHeight.update(delta, map);\r\n this.mouseRotate.update(delta, map);\r\n this.mouseAngle.update(delta, map);\r\n this.touchPan.update(delta, map);\r\n\r\n this.manager.angle = MathUtils.clamp(this.manager.angle, 0, Math.PI);\r\n this.manager.distance = 0;\r\n this.manager.ortho = 0;\r\n }\r\n\r\n initializeHammer() {\r\n let touchMove = new Pan({ event: 'move', pointers: 1, direction: DIRECTION_ALL, threshold: 0 });\r\n this.hammer.add(touchMove);\r\n }\r\n\r\n onContextMenu = evt => {\r\n evt.preventDefault();\r\n }\r\n\r\n onMouseDown = evt => {\r\n this.clickStart.set(evt.x, evt.y);\r\n }\r\n\r\n onMouseUp = evt => {\r\n if (Math.abs(this.clickStart.x - evt.x) > 5) return;\r\n if (Math.abs(this.clickStart.y - evt.y) > 5) return;\r\n\r\n document.body.requestFullscreen()\r\n .finally(() => {\r\n this.target.requestPointerLock();\r\n });\r\n }\r\n\r\n onWheel = evt => {\r\n let delta = evt.deltaY;\r\n if (evt.deltaMode === WheelEvent.DOM_DELTA_PIXEL) delta *= 0.01;\r\n if (evt.deltaMode === WheelEvent.DOM_DELTA_LINE) delta *= 0.33;\r\n\r\n this.moveSpeed *= Math.pow(1.5, -delta * 0.25);\r\n this.moveSpeed = MathUtils.clamp(this.moveSpeed, 0.05, 5);\r\n\r\n this.keyMove.speed = this.moveSpeed;\r\n this.keyHeight.speed = this.moveSpeed;\r\n }\r\n\r\n}","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport {Object3D} from \"three\";\r\n\r\nexport * from \"./MapViewer\";\r\n\r\nexport * from \"./map/Map\";\r\nexport * from \"./map/Tile\";\r\nexport * from \"./map/TileLoader\";\r\nexport * from \"./map/TileManager\";\r\nexport * from \"./map/TileMap\";\r\n\r\nexport * from \"./markers/ExtrudeMarker\";\r\nexport * from \"./markers/HtmlMarker\";\r\nexport * from \"./markers/LineMarker\";\r\nexport * from \"./markers/Marker\";\r\nexport * from \"./markers/MarkerManager\";\r\nexport * from \"./markers/MarkerSet\";\r\nexport * from \"./markers/PlayerMarkerSet\";\r\nexport * from \"./markers/ObjectMarker\";\r\nexport * from \"./markers/PlayerMarker\";\r\nexport * from \"./markers/PoiMarker\";\r\nexport * from \"./markers/ShapeMarker\";\r\n\r\nexport * from \"./controls/map/MapControls\";\r\nexport * from \"./controls/freeflight/FreeFlightControls\";\r\n\r\nexport * from \"./util/CombinedCamera\";\r\nexport * from \"./util/Utils\";\r\n\r\n/**\r\n * @param event {object}\r\n * @return {boolean} - whether the event has been consumed (true) or not (false)\r\n */\r\nObject3D.prototype.onClick = function(event) {\r\n\r\n if (this.parent){\r\n if (!Array.isArray(event.eventStack)) event.eventStack = [];\r\n event.eventStack.push(this);\r\n\r\n return this.parent.onClick(event);\r\n }\r\n\r\n return false;\r\n};\r\n","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport {Marker} from \"bluemap/src/markers/Marker\";\r\nimport {CSS2DObject} from \"bluemap/src/util/CSS2DRenderer\";\r\nimport {animate, htmlToElement} from \"bluemap/src/util/Utils\";\r\nimport {BoxGeometry, MeshBasicMaterial, Mesh, Vector2} from \"three\";\r\nimport i18n from \"../i18n\";\r\n\r\nexport class PopupMarker extends Marker {\r\n\r\n constructor(id, appState, events) {\r\n super(id);\r\n\r\n this.data.type = \"popup\";\r\n this.data.label = \"Last Map Interaction\";\r\n\r\n this.appState = appState;\r\n this.events = events;\r\n this.visible = false;\r\n\r\n this.elementObject = new CSS2DObject(htmlToElement(`
Test
`));\r\n this.elementObject.position.set(0.5, 1, 0.5);\r\n this.addEventListener( 'removed', () => {\r\n if (this.element.parentNode) this.element.parentNode.removeChild(this.element);\r\n });\r\n\r\n let cubeGeo = new BoxGeometry(1.01, 1.01, 1.01).translate(0.5, 0.5, 0.5);\r\n let cubeMaterial = new MeshBasicMaterial( {color: 0xffffff, opacity: 0.5, transparent: true} );\r\n this.cube = new Mesh(cubeGeo, cubeMaterial);\r\n this.cube.onClick = evt => this.onClick(evt);\r\n\r\n this.add(this.elementObject);\r\n this.add(this.cube);\r\n\r\n this.animation = null;\r\n\r\n this.events.addEventListener('bluemapMapInteraction', this.onMapInteraction);\r\n\r\n window.addEventListener(\"mousedown\", this.removeHandler);\r\n window.addEventListener(\"touchstart\", this.removeHandler);\r\n window.addEventListener(\"keydown\", this.removeHandler);\r\n window.addEventListener(\"mousewheel\", this.removeHandler);\r\n }\r\n\r\n onClick(event) {\r\n return true;\r\n }\r\n\r\n onMapInteraction = evt => {\r\n let isHires = true;\r\n let int = evt.detail.hiresHit;\r\n\r\n if (evt.detail.lowresHits) {\r\n for (let i = 0; i < evt.detail.lowresHits.length; i++) {\r\n if (!int) {\r\n isHires = false;\r\n int = evt.detail.lowresHits[i];\r\n } else break;\r\n }\r\n }\r\n\r\n if (!int) return;\r\n\r\n this.position\r\n .copy(int.pointOnLine || int.point)\r\n .add(evt.detail.ray.direction.clone().multiplyScalar(0.05))\r\n .floor();\r\n\r\n //this.elementObject.position\r\n //.copy(evt.detail.intersection.pointOnLine || evt.detail.intersection.point)\r\n //.sub(this.position);\r\n\r\n if (isHires) {\r\n this.element.innerHTML = `\r\n
\r\n
${i18n.t(\"blockTooltip.block\")}:
\r\n
\r\n
x: ${this.position.x}
\r\n
y: ${this.position.y}
\r\n
z: ${this.position.z}
\r\n
\r\n
\r\n `;\r\n } else {\r\n this.element.innerHTML = `\r\n
\r\n
${i18n.t(\"blockTooltip.position\")}:
\r\n
\r\n
x: ${this.position.x}
\r\n
z: ${this.position.z}
\r\n
\r\n
\r\n `;\r\n }\r\n\r\n if (this.appState.debug) {\r\n let chunkCoords = this.position.clone().divideScalar(16).floor();\r\n let regionCoords = new Vector2(this.position.x, this.position.z).divideScalar(512).floor();\r\n let regionFile = `r.${regionCoords.x}.${regionCoords.y}.mca`;\r\n\r\n this.element.innerHTML += `\r\n
\r\n
\r\n
${i18n.t(\"blockTooltip.chunk\")}:
\r\n
\r\n
x: ${chunkCoords.x}
\r\n
y: ${chunkCoords.y}
\r\n
z: ${chunkCoords.z}
\r\n
\r\n
\r\n
\r\n
\r\n
${i18n.t(\"blockTooltip.region.region\")}:
\r\n
\r\n
x: ${regionCoords.x}
\r\n
z: ${regionCoords.y}
\r\n
\r\n
\r\n
${i18n.t(\"blockTooltip.region.file\")}: ${regionFile}
\r\n
\r\n
\r\n `;\r\n }\r\n\r\n if (this.appState.debug) {\r\n let faceIndex = int.faceIndex;\r\n let attributes = int.object.geometry.attributes;\r\n if (attributes.sunlight && attributes.blocklight) {\r\n let sunlight = attributes.sunlight.array[faceIndex * 3];\r\n let blocklight = attributes.blocklight.array[faceIndex * 3];\r\n\r\n this.element.innerHTML += `\r\n
\r\n
\r\n
${i18n.t(\"blockTooltip.light.light\")}:
\r\n
\r\n
${i18n.t(\"blockTooltip.light.sun\")}: ${sunlight}
\r\n
${i18n.t(\"blockTooltip.light.block\")}: ${blocklight}
\r\n
\r\n
\r\n `;\r\n }\r\n }\r\n\r\n if (this.appState.debug) {\r\n let info = \"\";\r\n\r\n if (isHires) {\r\n let hrPath = evt.detail.hiresHit?.object?.userData?.tileUrl;\r\n info += `
${hrPath}
`;\r\n }\r\n\r\n if (evt.detail.lowresHits) {\r\n for (let i = 0; i < evt.detail.lowresHits.length; i++) {\r\n let lrPath = evt.detail.lowresHits[i]?.object?.userData?.tileUrl;\r\n if (lrPath) info += `
${lrPath}
`;\r\n }\r\n }\r\n\r\n this.element.innerHTML += `\r\n
\r\n
\r\n ${info}\r\n
\r\n `;\r\n }\r\n\r\n if (this.appState.debug){\r\n console.debug(\"Clicked Position Data:\", evt.detail);\r\n }\r\n\r\n this.open();\r\n };\r\n\r\n open() {\r\n if (this.animation) this.animation.cancel();\r\n\r\n this.visible = true;\r\n this.cube.visible = true;\r\n\r\n let targetOpacity = 1;\r\n\r\n this.element.style.opacity = \"0\";\r\n this.animation = animate(progress => {\r\n this.element.style.opacity = (progress * targetOpacity).toString();\r\n }, 300);\r\n }\r\n\r\n removeHandler = evt => {\r\n if (evt.composedPath().includes(this.element)) return;\r\n this.close();\r\n }\r\n\r\n close() {\r\n if (this.animation) this.animation.cancel();\r\n\r\n this.cube.visible = false;\r\n\r\n let startOpacity = parseFloat(this.element.style.opacity);\r\n this.animation = animate(progress => {\r\n this.element.style.opacity = (startOpacity - progress * startOpacity).toString();\r\n }, 300, finished => {\r\n if (finished) this.visible = false;\r\n });\r\n }\r\n\r\n /**\r\n * @returns {Element}\r\n */\r\n get element() {\r\n return this.elementObject.element.getElementsByTagName(\"div\")[0];\r\n }\r\n\r\n dispose() {\r\n super.dispose();\r\n\r\n if (this.element.parentNode) this.element.parentNode.removeChild(this.element);\r\n }\r\n\r\n}","/**\r\n * Converts a given value to JSON and writes it to the given key in\r\n * localStorage.\r\n */\r\nexport const setLocalStorage = (key, value) => {\r\n localStorage.setItem(key, JSON.stringify(value));\r\n};\r\n\r\n/**\r\n * Fetches the value from a given key from localStorage. If the stored value is\r\n * in JSON format, the parsed value will be returned.\r\n */\r\nexport const getLocalStorage = key => {\r\n const value = localStorage.getItem(key);\r\n\r\n // return undefined for not defined values\r\n // because \"null\" might be ambiguous if there is actually \"null\" stored for that key\r\n if (value == null) return undefined;\r\n\r\n try {\r\n return JSON.parse(value);\r\n } catch(e) {\r\n return value;\r\n }\r\n};\r\n\r\nexport const round = (value, precision) => {\r\n let f = Math.pow(10, precision);\r\n return Math.round(value * f) / f;\r\n}\r\n","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\nimport \"bluemap/src/BlueMap\";\r\nimport {MapViewer} from \"bluemap/src/MapViewer\";\r\nimport {MapControls} from \"bluemap/src/controls/map/MapControls\";\r\nimport {FreeFlightControls} from \"bluemap/src/controls/freeflight/FreeFlightControls\";\r\nimport {FileLoader, MathUtils, Vector3} from \"three\";\r\nimport {Map as BlueMapMap} from \"bluemap/src/map/Map\";\r\nimport {alert, animate, EasingFunctions, generateCacheHash} from \"bluemap/src/util/Utils\";\r\nimport {MainMenu} from \"@/js/MainMenu\";\r\nimport {PopupMarker} from \"@/js/PopupMarker\";\r\nimport {MarkerSet} from \"bluemap/src/markers/MarkerSet\";\r\nimport {getLocalStorage, round, setLocalStorage} from \"@/js/Utils\";\r\nimport i18n from \"../i18n\";\r\nimport {MarkerManager, MarkerFileType} from \"bluemap/src/markers/MarkerManager\";\r\n\r\nexport class BlueMapApp {\r\n\r\n /**\r\n * @param rootElement {Element}\r\n */\r\n constructor(rootElement) {\r\n this.events = rootElement;\r\n\r\n this.mapViewer = new MapViewer(rootElement, this.events);\r\n\r\n this.mapControls = new MapControls(this.mapViewer.renderer.domElement);\r\n this.freeFlightControls = new FreeFlightControls(this.mapViewer.renderer.domElement);\r\n\r\n /** @type {MarkerManager} */\r\n this.playerMarkerManager = null;\r\n /** @type {MarkerManager} */\r\n this.markerFileManager = null;\r\n\r\n /** @type {{\r\n * version: string,\r\n * useCookies: boolean,\r\n * enableFreeFlight: boolean,\r\n * resolutionDefault: number,\r\n * minZoomDistance: number,\r\n * maxZoomDistance: number,\r\n * hiresSliderMax: number,\r\n * hiresSliderDefault: number,\r\n * hiresSliderMin: number,\r\n * lowresSliderMax: number,\r\n * lowresSliderDefault: number,\r\n * lowresSliderMin: number,\r\n * startLocation: string,\r\n * maps: string[]\r\n * }}\r\n **/\r\n this.settings = null;\r\n this.savedUserSettings = new Map();\r\n\r\n /** @type BlueMapMap[] */\r\n this.maps = [];\r\n /** @type Map */\r\n this.mapsMap = new Map();\r\n\r\n this.lastCameraMove = 0;\r\n\r\n this.dataUrl = \"maps/\";\r\n\r\n this.mainMenu = new MainMenu();\r\n\r\n this.appState = {\r\n controls: {\r\n state: \"perspective\",\r\n mouseSensitivity: 1,\r\n invertMouse: false,\r\n enableFreeFlight: false,\r\n pauseTileLoading: false\r\n },\r\n menu: this.mainMenu,\r\n maps: [],\r\n theme: null,\r\n screenshot: {\r\n clipboard: true\r\n },\r\n debug: false\r\n };\r\n\r\n // init\r\n this.updateControlsSettings();\r\n this.initGeneralEvents();\r\n\r\n // popup on click\r\n this.popupMarkerSet = new MarkerSet(\"bm-popup-set\");\r\n this.popupMarker = new PopupMarker(\"bm-popup\", this.appState, this.events);\r\n this.popupMarkerSet.add(this.popupMarker);\r\n this.mapViewer.markers.add(this.popupMarkerSet);\r\n\r\n this.updateLoop = null;\r\n\r\n this.hashUpdateTimeout = null;\r\n this.viewAnimation = null;\r\n }\r\n\r\n\r\n /**\r\n * @returns {Promise}\r\n */\r\n async load() {\r\n let oldMaps = this.maps;\r\n this.maps = [];\r\n this.appState.maps.splice(0, this.appState.maps.length);\r\n this.mapsMap.clear();\r\n\r\n // load settings\r\n await this.getSettings();\r\n this.mapControls.minDistance = this.settings.minZoomDistance;\r\n this.mapControls.maxDistance = this.settings.maxZoomDistance;\r\n this.appState.controls.enableFreeFlight = this.settings.enableFreeFlight;\r\n\r\n // unload loaded maps\r\n await this.mapViewer.switchMap(null);\r\n oldMaps.forEach(map => map.dispose());\r\n\r\n // load maps\r\n this.maps = await this.loadMaps();\r\n for (let map of this.maps) {\r\n this.mapsMap.set(map.data.id, map);\r\n this.appState.maps.push(map.data);\r\n }\r\n\r\n // switch to map\r\n if (!await this.loadPageAddress()) {\r\n if (this.maps.length > 0) await this.switchMap(this.maps[0].data.id);\r\n this.resetCamera();\r\n }\r\n\r\n // map position address\r\n window.addEventListener(\"hashchange\", this.loadPageAddress);\r\n this.events.addEventListener(\"bluemapCameraMoved\", this.cameraMoved);\r\n this.events.addEventListener(\"bluemapMapInteraction\", this.mapInteraction);\r\n\r\n // start app update loop\r\n if(this.updateLoop) clearTimeout(this.updateLoop);\r\n this.updateLoop = setTimeout(this.update, 1000);\r\n\r\n // load user settings\r\n await this.loadUserSettings();\r\n\r\n // save user settings\r\n this.saveUserSettings();\r\n }\r\n\r\n update = async () => {\r\n await this.followPlayerMarkerWorld();\r\n this.updateLoop = setTimeout(this.update, 1000);\r\n }\r\n\r\n async followPlayerMarkerWorld() {\r\n /** @type {PlayerLike} */\r\n let player = this.mapViewer.controlsManager.controls?.data.followingPlayer;\r\n\r\n if (this.mapViewer.map && player) {\r\n if (player.foreign){\r\n\r\n let matchingMap = await this.findPlayerMap(player.playerUuid)\r\n if (matchingMap) {\r\n this.mainMenu.closeAll();\r\n await this.switchMap(matchingMap.data.id, false);\r\n let playerMarker = this.playerMarkerManager.getPlayerMarker(player.playerUuid);\r\n if (playerMarker && this.mapViewer.controlsManager.controls.followPlayerMarker)\r\n this.mapViewer.controlsManager.controls.followPlayerMarker(playerMarker);\r\n } else {\r\n if (this.mapViewer.controlsManager.controls.stopFollowingPlayerMarker)\r\n this.mapViewer.controlsManager.controls.stopFollowingPlayerMarker();\r\n }\r\n }\r\n }\r\n }\r\n\r\n async findPlayerMap(playerUuid) {\r\n /** @type BlueMapMap */\r\n let matchingMap = null;\r\n\r\n // search for the map that contains the player\r\n if (this.maps.length < 20) {\r\n for (let map of this.maps) {\r\n let playerData = await this.loadPlayerData(map);\r\n if (!Array.isArray(playerData.players)) continue;\r\n for (let p of playerData.players) {\r\n if (p.uuid === playerUuid && !p.foreign) {\r\n matchingMap = map;\r\n break;\r\n }\r\n }\r\n\r\n if (matchingMap) break;\r\n }\r\n }\r\n\r\n return matchingMap;\r\n }\r\n\r\n /**\r\n * @param mapId {String}\r\n * @param resetCamera {boolean}\r\n * @returns {Promise}\r\n */\r\n async switchMap(mapId, resetCamera = true) {\r\n let map = this.mapsMap.get(mapId);\r\n if (!map) return Promise.reject(`There is no map with the id \"${mapId}\" loaded!`);\r\n\r\n await this.mapViewer.switchMap(map)\r\n\r\n if (resetCamera) this.resetCamera();\r\n this.updatePageAddress();\r\n\r\n await Promise.all([\r\n this.initPlayerMarkerManager(),\r\n this.initMarkerFileManager()\r\n ]);\r\n }\r\n\r\n resetCamera() {\r\n let map = this.mapViewer.map;\r\n let controls = this.mapViewer.controlsManager;\r\n\r\n if (map) {\r\n controls.position.set(map.data.startPos.x, 0, map.data.startPos.z);\r\n controls.distance = 1500;\r\n controls.angle = 0;\r\n controls.rotation = 0;\r\n controls.tilt = 0;\r\n controls.ortho = 0;\r\n }\r\n\r\n controls.controls = this.mapControls;\r\n this.appState.controls.state = \"perspective\";\r\n this.updatePageAddress();\r\n }\r\n\r\n /**\r\n * @returns Promise\r\n */\r\n async loadMaps() {\r\n let settings = this.settings;\r\n let maps = [];\r\n\r\n // create maps\r\n if (settings.maps !== undefined){\r\n for (let mapId of settings.maps) {\r\n let map = new BlueMapMap(mapId, this.dataUrl + mapId + \"/\", this.loadBlocker, this.mapViewer.events);\r\n maps.push(map);\r\n\r\n await map.loadSettings()\r\n .catch(error => {\r\n alert(this.events, `Failed to load settings for map '${map.data.id}':` + error, \"warning\");\r\n });\r\n }\r\n }\r\n\r\n // sort maps\r\n maps.sort((map1, map2) => {\r\n let sort = map1.data.sorting - map2.data.sorting;\r\n if (isNaN(sort)) return 0;\r\n return sort;\r\n });\r\n\r\n return maps;\r\n }\r\n\r\n async getSettings() {\r\n if (!this.settings){\r\n this.settings = await this.loadSettings();\r\n }\r\n\r\n return this.settings;\r\n }\r\n\r\n /**\r\n * @returns {Promise}\r\n */\r\n loadSettings() {\r\n return new Promise((resolve, reject) => {\r\n let loader = new FileLoader();\r\n loader.setResponseType(\"json\");\r\n loader.load(\"settings.json?\" + generateCacheHash(),\r\n resolve,\r\n () => {},\r\n () => reject(\"Failed to load the settings.json!\")\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * @param map {BlueMapMap}\r\n * @returns {Promise}\r\n */\r\n loadPlayerData(map) {\r\n return new Promise((resolve, reject) => {\r\n let loader = new FileLoader();\r\n loader.setResponseType(\"json\");\r\n loader.load(map.data.dataUrl + \"live/players?\" + generateCacheHash(),\r\n fileData => {\r\n if (!fileData) reject(`Failed to parse '${this.fileUrl}'!`);\r\n else resolve(fileData);\r\n },\r\n () => {},\r\n () => reject(`Failed to load '${this.fileUrl}'!`)\r\n )\r\n });\r\n }\r\n\r\n initPlayerMarkerManager() {\r\n if (this.playerMarkerManager){\r\n this.playerMarkerManager.clear();\r\n this.playerMarkerManager.dispose()\r\n }\r\n\r\n const map = this.mapViewer.map;\r\n if (!map) return;\r\n\r\n this.playerMarkerManager = new MarkerManager(this.mapViewer.markers, map.data.dataUrl + \"live/players\", MarkerFileType.PLAYER, this.events);\r\n this.playerMarkerManager.setAutoUpdateInterval(0);\r\n return this.playerMarkerManager.update()\r\n .then(() => {\r\n this.playerMarkerManager.setAutoUpdateInterval(1000);\r\n })\r\n .catch(e => {\r\n alert(this.events, e, \"warning\");\r\n this.playerMarkerManager.clear();\r\n this.playerMarkerManager.dispose();\r\n });\r\n }\r\n\r\n initMarkerFileManager() {\r\n if (this.markerFileManager) {\r\n this.markerFileManager.clear();\r\n this.markerFileManager.dispose();\r\n }\r\n\r\n const map = this.mapViewer.map;\r\n if (!map) return;\r\n\r\n this.markerFileManager = new MarkerManager(this.mapViewer.markers, map.data.dataUrl + \"live/markers\", MarkerFileType.NORMAL, this.events);\r\n return this.markerFileManager.update()\r\n .then(() => {\r\n this.markerFileManager.setAutoUpdateInterval(1000 * 10);\r\n })\r\n .catch(e => {\r\n alert(this.events, e, \"warning\");\r\n this.markerFileManager.clear();\r\n this.markerFileManager.dispose();\r\n });\r\n }\r\n\r\n updateControlsSettings() {\r\n let mouseInvert = this.appState.controls.invertMouse ? -1 : 1;\r\n\r\n this.freeFlightControls.mouseRotate.speedCapture = -1.5 * this.appState.controls.mouseSensitivity;\r\n this.freeFlightControls.mouseAngle.speedCapture = -1.5 * this.appState.controls.mouseSensitivity * mouseInvert;\r\n this.freeFlightControls.mouseRotate.speedRight = -2 * this.appState.controls.mouseSensitivity;\r\n this.freeFlightControls.mouseAngle.speedRight = -2 * this.appState.controls.mouseSensitivity * mouseInvert;\r\n }\r\n\r\n initGeneralEvents() {\r\n //close menu on fullscreen\r\n document.addEventListener(\"fullscreenchange\", evt => {\r\n if (document.fullscreen) {\r\n this.mainMenu.closeAll();\r\n }\r\n });\r\n }\r\n\r\n setPerspectiveView(transition = 0, minDistance = 5) {\r\n if (!this.mapViewer.map) return;\r\n if (this.viewAnimation) this.viewAnimation.cancel();\r\n\r\n let cm = this.mapViewer.controlsManager;\r\n cm.controls = null;\r\n\r\n let startDistance = cm.distance;\r\n let targetDistance = Math.max(5, minDistance, startDistance);\r\n\r\n let startY = cm.position.y;\r\n let targetY = MathUtils.lerp(this.mapViewer.map.terrainHeightAt(cm.position.x, cm.position.z) + 3, 0, targetDistance / 500);\r\n\r\n let startAngle = cm.angle;\r\n let targetAngle = Math.min(Math.PI / 2, startAngle, this.mapControls.getMaxPerspectiveAngleForDistance(targetDistance));\r\n\r\n let startOrtho = cm.ortho;\r\n let startTilt = cm.tilt;\r\n\r\n this.viewAnimation = animate(p => {\r\n let ep = EasingFunctions.easeInOutQuad(p);\r\n cm.position.y = MathUtils.lerp(startY, targetY, ep);\r\n cm.distance = MathUtils.lerp(startDistance, targetDistance, ep);\r\n cm.angle = MathUtils.lerp(startAngle, targetAngle, ep);\r\n cm.ortho = MathUtils.lerp(startOrtho, 0, p);\r\n cm.tilt = MathUtils.lerp(startTilt, 0, ep);\r\n }, transition, finished => {\r\n this.mapControls.reset();\r\n if (finished){\r\n cm.controls = this.mapControls;\r\n this.updatePageAddress();\r\n }\r\n });\r\n\r\n this.appState.controls.state = \"perspective\";\r\n }\r\n\r\n setFlatView(transition = 0, minDistance = 5) {\r\n if (!this.mapViewer.map) return;\r\n if (this.viewAnimation) this.viewAnimation.cancel();\r\n\r\n let cm = this.mapViewer.controlsManager;\r\n cm.controls = null;\r\n\r\n let startDistance = cm.distance;\r\n let targetDistance = Math.max(5, minDistance, startDistance);\r\n\r\n let startRotation = cm.rotation;\r\n let startAngle = cm.angle;\r\n let startOrtho = cm.ortho;\r\n let startTilt = cm.tilt;\r\n\r\n this.viewAnimation = animate(p => {\r\n let ep = EasingFunctions.easeInOutQuad(p);\r\n cm.distance = MathUtils.lerp(startDistance, targetDistance, ep);\r\n cm.rotation = MathUtils.lerp(startRotation, 0, ep);\r\n cm.angle = MathUtils.lerp(startAngle, 0, ep);\r\n cm.ortho = MathUtils.lerp(startOrtho, 1, p);\r\n cm.tilt = MathUtils.lerp(startTilt, 0, ep);\r\n }, transition, finished => {\r\n this.mapControls.reset();\r\n if (finished){\r\n cm.controls = this.mapControls;\r\n this.updatePageAddress();\r\n }\r\n });\r\n\r\n this.appState.controls.state = \"flat\";\r\n }\r\n\r\n setFreeFlight(transition = 0, targetY = undefined) {\r\n if (!this.mapViewer.map) return;\r\n if (!this.settings.enableFreeFlight) return this.setPerspectiveView(transition);\r\n if (this.viewAnimation) this.viewAnimation.cancel();\r\n\r\n let cm = this.mapViewer.controlsManager;\r\n cm.controls = null;\r\n\r\n let startDistance = cm.distance;\r\n\r\n let startY = cm.position.y;\r\n if (!targetY) targetY = this.mapViewer.map.terrainHeightAt(cm.position.x, cm.position.z) + 3 || startY;\r\n\r\n let startAngle = cm.angle;\r\n let targetAngle = Math.PI / 2;\r\n\r\n let startOrtho = cm.ortho;\r\n let startTilt = cm.tilt;\r\n\r\n this.viewAnimation = animate(p => {\r\n let ep = EasingFunctions.easeInOutQuad(p);\r\n cm.position.y = MathUtils.lerp(startY, targetY, ep);\r\n cm.distance = MathUtils.lerp(startDistance, 0, ep);\r\n cm.angle = MathUtils.lerp(startAngle, targetAngle, ep);\r\n cm.ortho = MathUtils.lerp(startOrtho, 0, Math.min(p * 2, 1));\r\n cm.tilt = MathUtils.lerp(startTilt, 0, ep);\r\n }, transition, finished => {\r\n if (finished){\r\n cm.controls = this.freeFlightControls;\r\n this.updatePageAddress();\r\n }\r\n });\r\n\r\n this.appState.controls.state = \"free\";\r\n }\r\n\r\n setDebug(debug) {\r\n this.appState.debug = debug;\r\n\r\n if (debug){\r\n this.mapViewer.stats.showPanel(0);\r\n } else {\r\n this.mapViewer.stats.showPanel(-1);\r\n }\r\n }\r\n\r\n setTheme(theme) {\r\n this.appState.theme = theme;\r\n\r\n if (theme === \"light\") {\r\n this.mapViewer.rootElement.classList.remove(\"theme-dark\");\r\n this.mapViewer.rootElement.classList.remove(\"theme-contrast\");\r\n this.mapViewer.rootElement.classList.add(\"theme-light\");\r\n }\r\n else if (theme === \"dark\") {\r\n this.mapViewer.rootElement.classList.remove(\"theme-light\");\r\n this.mapViewer.rootElement.classList.remove(\"theme-contrast\");\r\n this.mapViewer.rootElement.classList.add(\"theme-dark\");\r\n }\r\n else if (theme === \"contrast\") {\r\n this.mapViewer.rootElement.classList.remove(\"theme-light\");\r\n this.mapViewer.rootElement.classList.remove(\"theme-dark\");\r\n this.mapViewer.rootElement.classList.add(\"theme-contrast\");\r\n }\r\n else {\r\n this.mapViewer.rootElement.classList.remove(\"theme-light\");\r\n this.mapViewer.rootElement.classList.remove(\"theme-dark\");\r\n this.mapViewer.rootElement.classList.remove(\"theme-contrast\");\r\n }\r\n }\r\n\r\n setScreenshotClipboard(clipboard) {\r\n this.appState.screenshot.clipboard = clipboard;\r\n }\r\n\r\n async updateMap() {\r\n try {\r\n this.mapViewer.clearTileCache();\r\n if (this.mapViewer.map) {\r\n await this.switchMap(this.mapViewer.map.data.id);\r\n }\r\n this.saveUserSettings();\r\n } catch (e) {\r\n alert(this.events, e, \"error\");\r\n }\r\n }\r\n\r\n resetSettings() {\r\n this.saveUserSetting(\"resetSettings\", true);\r\n location.reload();\r\n }\r\n\r\n async loadUserSettings(){\r\n if (!isNaN(this.settings.resolutionDefault)) this.mapViewer.data.superSampling = this.settings.resolutionDefault;\r\n if (!isNaN(this.settings.hiresSliderDefault)) this.mapViewer.data.loadedHiresViewDistance = this.settings.hiresSliderDefault;\r\n if (!isNaN(this.settings.lowresSliderDefault)) this.mapViewer.data.loadedLowresViewDistance = this.settings.lowresSliderDefault;\r\n\r\n if (!this.settings.useCookies) return;\r\n\r\n if (this.loadUserSetting(\"resetSettings\", false)) {\r\n alert(this.events, \"Settings reset!\", \"info\");\r\n this.saveUserSettings();\r\n return;\r\n }\r\n\r\n this.mapViewer.clearTileCache(this.loadUserSetting(\"tileCacheHash\", this.mapViewer.tileCacheHash));\r\n\r\n this.mapViewer.superSampling = this.loadUserSetting(\"superSampling\", this.mapViewer.data.superSampling);\r\n this.mapViewer.data.loadedHiresViewDistance = this.loadUserSetting(\"hiresViewDistance\", this.mapViewer.data.loadedHiresViewDistance);\r\n this.mapViewer.data.loadedLowresViewDistance = this.loadUserSetting(\"lowresViewDistance\", this.mapViewer.data.loadedLowresViewDistance);\r\n this.mapViewer.updateLoadedMapArea();\r\n this.appState.controls.mouseSensitivity = this.loadUserSetting(\"mouseSensitivity\", this.appState.controls.mouseSensitivity);\r\n this.appState.controls.invertMouse = this.loadUserSetting(\"invertMouse\", this.appState.controls.invertMouse);\r\n this.appState.controls.pauseTileLoading = this.loadUserSetting(\"pauseTileLoading\", this.appState.controls.pauseTileLoading);\r\n this.updateControlsSettings();\r\n this.setTheme(this.loadUserSetting(\"theme\", this.appState.theme));\r\n this.setScreenshotClipboard(this.loadUserSetting(\"screenshotClipboard\", this.appState.screenshot.clipboard));\r\n await i18n.setLanguage(this.loadUserSetting(\"lang\", i18n.locale));\r\n this.setDebug(this.loadUserSetting(\"debug\", this.appState.debug));\r\n\r\n alert(this.events, \"Settings loaded!\", \"info\");\r\n }\r\n\r\n saveUserSettings() {\r\n if (!this.settings.useCookies) return;\r\n\r\n this.saveUserSetting(\"resetSettings\", false);\r\n this.saveUserSetting(\"tileCacheHash\", this.mapViewer.tileCacheHash);\r\n\r\n this.saveUserSetting(\"superSampling\", this.mapViewer.data.superSampling);\r\n this.saveUserSetting(\"hiresViewDistance\", this.mapViewer.data.loadedHiresViewDistance);\r\n this.saveUserSetting(\"lowresViewDistance\", this.mapViewer.data.loadedLowresViewDistance);\r\n this.saveUserSetting(\"mouseSensitivity\", this.appState.controls.mouseSensitivity);\r\n this.saveUserSetting(\"invertMouse\", this.appState.controls.invertMouse);\r\n this.saveUserSetting(\"pauseTileLoading\", this.appState.controls.pauseTileLoading);\r\n this.saveUserSetting(\"theme\", this.appState.theme);\r\n this.saveUserSetting(\"screenshotClipboard\", this.appState.screenshot.clipboard);\r\n this.saveUserSetting(\"lang\", i18n.locale);\r\n this.saveUserSetting(\"debug\", this.appState.debug);\r\n\r\n alert(this.events, \"Settings saved!\", \"info\");\r\n }\r\n\r\n loadUserSetting(key, defaultValue){\r\n let value = getLocalStorage(\"bluemap-\" + key);\r\n\r\n if (value === undefined) return defaultValue;\r\n return value;\r\n }\r\n\r\n saveUserSetting(key, value){\r\n if (this.savedUserSettings.get(key) !== value){\r\n this.savedUserSettings.set(key, value);\r\n setLocalStorage(\"bluemap-\" + key, value);\r\n }\r\n }\r\n\r\n cameraMoved = () => {\r\n if (this.hashUpdateTimeout) clearTimeout(this.hashUpdateTimeout);\r\n this.hashUpdateTimeout = setTimeout(this.updatePageAddress, 1500);\r\n this.lastCameraMove = Date.now();\r\n }\r\n\r\n loadBlocker = async () => {\r\n if (!this.appState.controls.pauseTileLoading) return;\r\n\r\n let timeToWait;\r\n do {\r\n let timeSinceLastMove = Date.now() - this.lastCameraMove;\r\n timeToWait = 250 - timeSinceLastMove;\r\n if (timeToWait > 0) await this.sleep(timeToWait);\r\n } while (timeToWait > 0);\r\n }\r\n\r\n sleep(ms) {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n updatePageAddress = () => {\r\n let hash = \"#\";\r\n\r\n if (this.mapViewer.map) {\r\n hash += this.mapViewer.map.data.id;\r\n\r\n let controls = this.mapViewer.controlsManager;\r\n hash += \":\" + round(controls.position.x, 0);\r\n hash += \":\" + round(controls.position.y, 0);\r\n hash += \":\" + round(controls.position.z, 0);\r\n hash += \":\" + round(controls.distance, 0);\r\n hash += \":\" + round(controls.rotation, 2);\r\n hash += \":\" + round(controls.angle, 2);\r\n hash += \":\" + round(controls.tilt, 2);\r\n hash += \":\" + round(controls.ortho, 0);\r\n hash += \":\" + this.appState.controls.state;\r\n }\r\n\r\n history.replaceState(undefined, undefined, hash);\r\n\r\n document.title = i18n.t(\"pageTitle\", {\r\n map: this.mapViewer.map ? this.mapViewer.map.data.name : \"?\",\r\n version: this.settings.version\r\n });\r\n }\r\n\r\n loadPageAddress = async () => {\r\n let hash = window.location.hash?.substring(1) || this.settings.startLocation || \"\";\r\n let values = hash.split(\":\");\r\n\r\n if (values.length !== 10) return false;\r\n\r\n let controls = this.mapViewer.controlsManager;\r\n controls.controls = null;\r\n\r\n if (!this.mapViewer.map || this.mapViewer.map.data.id !== values[0]) {\r\n try {\r\n await this.switchMap(values[0]);\r\n } catch (e) {\r\n return false;\r\n }\r\n }\r\n\r\n controls.position.x = parseFloat(values[1]);\r\n controls.position.y = parseFloat(values[2]);\r\n controls.position.z = parseFloat(values[3]);\r\n controls.distance = parseFloat(values[4]);\r\n controls.rotation = parseFloat(values[5]);\r\n controls.angle = parseFloat(values[6]);\r\n controls.tilt = parseFloat(values[7]);\r\n controls.ortho = parseFloat(values[8]);\r\n\r\n switch (values[9]) {\r\n case \"flat\" : this.setFlatView(0); break;\r\n case \"free\" : this.setFreeFlight(0, controls.position.y); break;\r\n default : this.setPerspectiveView(0); break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n mapInteraction = event => {\r\n if (event.detail.data.doubleTap) {\r\n let cm = this.mapViewer.controlsManager;\r\n let pos = event.detail.hit?.point || event.detail.object?.getWorldPosition(new Vector3());\r\n if (!pos) return;\r\n\r\n let startDistance = cm.distance;\r\n let targetDistance = Math.max(startDistance * 0.25, 5);\r\n\r\n let startX = cm.position.x;\r\n let targetX = pos.x;\r\n\r\n let startZ = cm.position.z;\r\n let targetZ = pos.z;\r\n\r\n this.viewAnimation = animate(p => {\r\n let ep = EasingFunctions.easeInOutQuad(p);\r\n cm.distance = MathUtils.lerp(startDistance, targetDistance, ep);\r\n cm.position.x = MathUtils.lerp(startX, targetX, ep);\r\n cm.position.z = MathUtils.lerp(startZ, targetZ, ep);\r\n }, 500);\r\n }\r\n }\r\n\r\n takeScreenshot = () => {\r\n let link = document.createElement(\"a\");\r\n link.download = \"bluemap-screenshot.png\";\r\n link.href = this.mapViewer.renderer.domElement.toDataURL('image/png');\r\n link.click();\r\n\r\n if (this.appState.screenshot.clipboard) {\r\n this.mapViewer.renderer.domElement.toBlob(blob => {\r\n // eslint-disable-next-line no-undef\r\n navigator.clipboard.write([new ClipboardItem({ ['image/png']: blob })]).catch(e => {\r\n alert(this.events, \"Failed to copy screenshot to clipboard: \" + e, \"error\");\r\n });\r\n });\r\n }\r\n }\r\n\r\n}\r\n","/*\r\n * This file is part of BlueMap, licensed under the MIT License (MIT).\r\n *\r\n * Copyright (c) Blue (Lukas Rieger) \r\n * Copyright (c) contributors\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\n\r\nimport Vue from 'vue'\r\nimport App from './App.vue'\r\nimport {BlueMapApp} from \"@/js/BlueMapApp\";\r\nimport i18n from './i18n';\r\n\r\n// utils\r\nString.prototype.includesCI = function (val) {\r\n return this.toLowerCase().includes(val.toLowerCase());\r\n}\r\n\r\n// bluemap app\r\ntry {\r\n const bluemap = new BlueMapApp(document.getElementById(\"map-container\"));\r\n window.bluemap = bluemap;\r\n\r\n// init vue\r\n Vue.config.productionTip = false;\r\n Object.defineProperty(Vue.prototype, '$bluemap', {\r\n get() {\r\n return bluemap;\r\n }\r\n });\r\n\r\n const vue = new Vue({\r\n i18n,\r\n render: h => h(App)\r\n }).$mount('#app');\r\n\r\n// load languages\r\n i18n.loadLanguageSettings().catch(error => console.error(error));\r\n\r\n// load bluemap next tick (to let the assets load first)\r\n vue.$nextTick(() => {\r\n bluemap.load().catch(error => console.error(error));\r\n });\r\n} catch (e) {\r\n console.error(\"Failed to load BlueMap webapp!\", e);\r\n document.body.innerHTML = `\r\n
\r\n
\r\n \"bluemap\r\n
Failed to load BlueMap webapp!
\r\n
Make sure you have WebGL enabled on your browser.
\r\n
\r\n
\r\n `;\r\n}\r\n","export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../node_modules/cache-loader/dist/cjs.js??ref--1-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--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-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--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Group.vue?vue&type=style&index=0&lang=scss&\""],"sourceRoot":""}