{"version":3,"file":"vendor.openbim-components-493298cd.1fafd4903ef434b3.bundle.js","mappings":"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","sources":["webpack://client-app/./node_modules/openbim-components/src/core/Simple2DMarker/index.js","webpack://client-app/./node_modules/openbim-components/src/core/Simple2DMarker/src/marker-manager.js","webpack://client-app/./node_modules/openbim-components/src/core/Simple2DScene/src/infinite-2d-grid.js","webpack://client-app/./node_modules/openbim-components/src/core/Simple2DScene/index.js","webpack://client-app/./node_modules/openbim-components/src/core/SimpleCamera/index.js"],"sourcesContent":["import { CSS2DObject } from \"three/examples/jsm/renderers/CSS2DRenderer\";\r\nimport { Event } from \"../../base-types\";\r\nimport { Component } from \"../../base-types/component\";\r\nexport class Simple2DMarker extends Component {\r\n set visible(value) {\r\n this._visible = value;\r\n this._marker.visible = value;\r\n }\r\n get visible() {\r\n return this._visible;\r\n }\r\n // Define marker as setup configuration?\r\n constructor(components, marker, parent) {\r\n super(components);\r\n /** {@link Component.enabled} */\r\n this.enabled = true;\r\n this._visible = true;\r\n /** {@link Disposable.onDisposed} */\r\n this.onDisposed = new Event();\r\n let _marker;\r\n if (marker) {\r\n _marker = marker;\r\n }\r\n else {\r\n _marker = document.createElement(\"div\");\r\n _marker.className =\r\n \"w-[15px] h-[15px] border-3 border-solid border-red-600\";\r\n }\r\n this._marker = new CSS2DObject(_marker);\r\n if (parent) {\r\n parent.add(this._marker);\r\n }\r\n else {\r\n this.components.scene.get().add(this._marker);\r\n }\r\n this.visible = true;\r\n }\r\n /** {@link Component.get} */\r\n get() {\r\n return this._marker;\r\n }\r\n toggleVisibility() {\r\n this.visible = !this.visible;\r\n }\r\n async dispose() {\r\n this._marker.removeFromParent();\r\n this._marker.element.remove();\r\n await this.onDisposed.trigger();\r\n this.onDisposed.reset();\r\n }\r\n}\r\n//# sourceMappingURL=index.js.map","import * as THREE from \"three\";\r\nimport { Simple2DMarker } from \"../..\";\r\n/**\r\n * Class for Managing Markers along with creating different types of markers\r\n * Every marker is a Simple2DMarker\r\n * For every marker that needs to be added, you can use the Manager to add the marker and change its look and feel\r\n */\r\nexport class MarkerManager {\r\n constructor(components, renderer, scene, controls) {\r\n this.components = components;\r\n this.renderer = renderer;\r\n this.controls = controls;\r\n this.markers = new Set();\r\n this.clusterLabels = new Set();\r\n this.currentKeys = new Set();\r\n this._clusterOnZoom = true;\r\n this._color = \"white\";\r\n // TODO: Replace with UUID for the marker key\r\n this._markerKey = 0;\r\n this._clusterKey = 0;\r\n this._clusterThreeshold = 50;\r\n this.isNavigating = false;\r\n this.scene = scene;\r\n this.setupEvents();\r\n }\r\n set clusterOnZoom(value) {\r\n this._clusterOnZoom = value;\r\n }\r\n get clusterOnZoom() {\r\n return this._clusterOnZoom;\r\n }\r\n set color(value) {\r\n this._color = value;\r\n for (const marker of this.markers) {\r\n marker.label.get().element.style.color = value;\r\n }\r\n }\r\n set clusterThreeshold(value) {\r\n this._clusterThreeshold = value;\r\n }\r\n get clusterThreeshold() {\r\n return this._clusterThreeshold;\r\n }\r\n setupEvents() {\r\n if (this.scene) {\r\n this.controls.addEventListener(\"sleep\", () => {\r\n this.manageCluster();\r\n });\r\n this.controls.addEventListener(\"rest\", () => {\r\n if (this.isNavigating) {\r\n this.manageCluster();\r\n this.isNavigating = false;\r\n }\r\n });\r\n }\r\n }\r\n resetMarkers() {\r\n for (const marker of this.markers) {\r\n marker.merged = false;\r\n }\r\n for (const cluster of this.clusterLabels) {\r\n this.scene.remove(cluster.label.get());\r\n }\r\n this.clusterLabels.clear();\r\n this._clusterKey = 0;\r\n }\r\n removeMergeMarkers() {\r\n for (const marker of this.markers) {\r\n if (marker.merged) {\r\n this.scene.remove(marker.label.get());\r\n }\r\n else {\r\n this.scene.add(marker.label.get());\r\n }\r\n }\r\n for (const cluster of this.clusterLabels) {\r\n if (cluster.markerKeys.length === 1) {\r\n const marker = Array.from(this.markers).find((marker) => marker.key === cluster.markerKeys[0]);\r\n if (marker) {\r\n this.scene.add(marker.label.get());\r\n marker.merged = false;\r\n }\r\n this.scene.remove(cluster.label.get());\r\n this.clusterLabels.delete(cluster);\r\n }\r\n }\r\n }\r\n manageCluster() {\r\n this.resetMarkers();\r\n for (const marker of this.markers) {\r\n if (!marker.merged && !marker.static) {\r\n this.currentKeys.clear();\r\n for (const marker2 of this.markers) {\r\n if (marker2.static) {\r\n continue;\r\n }\r\n if (marker.key !== marker2.key && !marker2.merged) {\r\n const distance = this.distance(marker.label, marker2.label);\r\n if (distance < this._clusterThreeshold) {\r\n this.currentKeys.add(marker2.key);\r\n marker2.merged = true;\r\n }\r\n }\r\n }\r\n if (this.currentKeys.size > 0) {\r\n if (!this.scene) {\r\n return;\r\n }\r\n this.currentKeys.add(marker.key);\r\n marker.merged = true;\r\n const clusterGroup = Array.from(this.currentKeys);\r\n const averagePosition = this.getAveragePositionFromLabels(clusterGroup);\r\n const clusterLabel = new Simple2DMarker(this.components, this.createClusterElement(this._clusterKey.toString()), this.scene);\r\n clusterLabel.get().element.textContent =\r\n clusterGroup.length.toString();\r\n clusterLabel.get().position.copy(averagePosition);\r\n this.clusterLabels.add({\r\n key: this._clusterKey.toString(),\r\n markerKeys: clusterGroup,\r\n label: clusterLabel,\r\n });\r\n this._clusterKey++;\r\n }\r\n }\r\n }\r\n this.removeMergeMarkers();\r\n }\r\n getAveragePositionFromLabels(clusterGroup) {\r\n const positions = clusterGroup.map((key) => {\r\n const marker = Array.from(this.markers).find((marker) => marker.key === key);\r\n if (marker) {\r\n return marker.label.get().position;\r\n }\r\n return new THREE.Vector3();\r\n });\r\n const averagePosition = positions\r\n .reduce((acc, curr) => acc.add(curr), new THREE.Vector3())\r\n .divideScalar(positions.length);\r\n return averagePosition;\r\n }\r\n createClusterElement(key) {\r\n const div = document.createElement(\"div\");\r\n div.textContent = key;\r\n div.style.color = \"#000000\";\r\n div.style.background = \"#FFFFFF\";\r\n div.style.fontSize = \"1.2rem\";\r\n div.style.fontWeight = \"500\";\r\n div.style.pointerEvents = \"auto\";\r\n div.style.borderRadius = \"50%\";\r\n div.style.padding = \"5px 11px\";\r\n div.style.textAlign = \"center\";\r\n div.style.cursor = \"pointer\";\r\n // div.style.transition = \"all 0.05s\";\r\n div.addEventListener(\"pointerdown\", () => {\r\n this.navigateToCluster(key);\r\n });\r\n div.addEventListener(\"pointerover\", () => {\r\n div.style.background = \"#BCF124\";\r\n });\r\n div.addEventListener(\"pointerout\", () => {\r\n div.style.background = \"#FFFFFF\";\r\n });\r\n return div;\r\n }\r\n addMarker(text, mesh) {\r\n const span = document.createElement(\"span\");\r\n span.innerHTML = text;\r\n span.style.color = this._color;\r\n const marker = this.addMarkerToScene(span);\r\n marker.get().position.copy(mesh.position);\r\n this.markers.add({\r\n label: marker,\r\n mesh,\r\n key: this._markerKey.toString(),\r\n merged: false,\r\n static: false,\r\n });\r\n this._markerKey++;\r\n }\r\n addMarkerAtPoint(text, point, type, isStatic = false) {\r\n if (type !== undefined) {\r\n const span = document.createElement(\"span\");\r\n span.innerHTML = text;\r\n span.style.color = this._color;\r\n const marker = new Simple2DMarker(this.components, span, this.scene);\r\n marker.get().position.copy(point);\r\n this.markers.add({\r\n label: marker,\r\n mesh: new THREE.Mesh(),\r\n key: this._markerKey.toString(),\r\n merged: false,\r\n type,\r\n static: isStatic,\r\n });\r\n this._markerKey++;\r\n }\r\n else {\r\n // Generating Labels that are perpendicular to the point and has dotted line beneath it\r\n }\r\n }\r\n // TODO: Move this to switch statement inside addCivilMarker\r\n addKPStation(text, mesh) {\r\n const container = document.createElement(\"div\");\r\n const span = document.createElement(\"div\");\r\n container.appendChild(span);\r\n span.innerHTML = text;\r\n span.style.color = this._color;\r\n span.style.borderBottom = \"1px dotted white\";\r\n span.style.width = \"160px\";\r\n span.style.textAlign = \"left\";\r\n const marker = new Simple2DMarker(this.components, container, this.scene);\r\n const point = new THREE.Vector3();\r\n point.x = mesh.geometry.attributes.position.getX(mesh.geometry.attributes.position.count - 1);\r\n point.y = mesh.geometry.attributes.position.getY(mesh.geometry.attributes.position.count - 1);\r\n point.z = mesh.geometry.attributes.position.getZ(mesh.geometry.attributes.position.count - 1);\r\n const secondLastPoint = new THREE.Vector3();\r\n secondLastPoint.x = mesh.geometry.attributes.position.getX(mesh.geometry.attributes.position.count - 2);\r\n secondLastPoint.y = mesh.geometry.attributes.position.getY(mesh.geometry.attributes.position.count - 2);\r\n secondLastPoint.z = mesh.geometry.attributes.position.getZ(mesh.geometry.attributes.position.count - 2);\r\n const midPoint = new THREE.Vector3();\r\n midPoint.x = (point.x + secondLastPoint.x) / 2;\r\n midPoint.y = (point.y + secondLastPoint.y) / 2;\r\n midPoint.z = (point.z + secondLastPoint.z) / 2;\r\n marker.get().position.copy(midPoint);\r\n const direction = new THREE.Vector3();\r\n direction.subVectors(point, secondLastPoint).normalize();\r\n const quaternion = new THREE.Quaternion();\r\n quaternion.setFromUnitVectors(new THREE.Vector3(0, 1, 0), direction);\r\n const eulerZ = new THREE.Euler().setFromQuaternion(quaternion).z;\r\n const rotationZ = THREE.MathUtils.radToDeg(eulerZ);\r\n span.style.transform = `rotate(${-rotationZ - 90}deg) translate(-35%, -50%)`;\r\n this.markers.add({\r\n label: marker,\r\n mesh,\r\n key: this._markerKey.toString(),\r\n merged: false,\r\n static: false,\r\n });\r\n this._markerKey++;\r\n }\r\n addCivilVerticalMarker(text, mesh, type, root) {\r\n const span = document.createElement(\"span\");\r\n span.innerHTML = text;\r\n span.style.color = this._color;\r\n const marker = new Simple2DMarker(this.components, span, root);\r\n if (type === \"Height\") {\r\n const span = document.createElement(\"span\");\r\n span.innerHTML = text;\r\n span.style.color = this._color;\r\n const { position } = mesh.geometry.attributes;\r\n const setArray = position.array.length / 3;\r\n const firstIndex = (setArray - 1) * 3;\r\n const lastIndex = position.array.slice(firstIndex, firstIndex + 3);\r\n marker.get().position.set(lastIndex[0], lastIndex[1] + 10, lastIndex[2]);\r\n }\r\n else if (type === \"InitialKPV\") {\r\n const { position } = mesh.geometry.attributes;\r\n const pX = position.getX(0);\r\n const pY = position.getY(0);\r\n const pZ = position.getZ(0);\r\n marker.get().position.set(pX - 20, pY, pZ);\r\n }\r\n else if (type === \"FinalKPV\") {\r\n const { position } = mesh.geometry.attributes;\r\n const pX = position.getX(mesh.geometry.attributes.position.count - 1);\r\n const pY = position.getY(mesh.geometry.attributes.position.count - 1);\r\n const pZ = position.getZ(mesh.geometry.attributes.position.count - 1);\r\n marker.get().position.set(pX + 20, pY, pZ);\r\n }\r\n else if (type === \"Slope\") {\r\n span.style.color = \"grey\";\r\n const { position } = mesh.geometry.attributes;\r\n const pointStart = new THREE.Vector3();\r\n pointStart.x = position.getX(0);\r\n pointStart.y = position.getY(0);\r\n pointStart.z = position.getZ(0);\r\n const pointEnd = new THREE.Vector3();\r\n pointEnd.x = position.getX(position.count - 1);\r\n pointEnd.y = position.getY(position.count - 1);\r\n pointEnd.z = position.getZ(position.count - 1);\r\n const midPoint = new THREE.Vector3();\r\n midPoint.addVectors(pointStart, pointEnd).multiplyScalar(0.5);\r\n marker.get().position.set(midPoint.x, midPoint.y - 10, midPoint.z);\r\n }\r\n this.markers.add({\r\n label: marker,\r\n mesh,\r\n key: this._markerKey.toString(),\r\n type,\r\n merged: false,\r\n static: false,\r\n });\r\n this._markerKey++;\r\n return marker;\r\n }\r\n addCivilMarker(text, mesh, type) {\r\n const span = document.createElement(\"span\");\r\n span.innerHTML = text;\r\n span.style.color = this._color;\r\n const marker = this.addMarkerToScene(span);\r\n if (type === \"InitialKP\") {\r\n const pX = mesh.geometry.attributes.position.getX(0);\r\n const pY = mesh.geometry.attributes.position.getY(0);\r\n const pZ = mesh.geometry.attributes.position.getZ(0);\r\n marker.get().position.set(pX + 2, pY + 2, pZ);\r\n }\r\n else if (type === \"FinalKP\") {\r\n const pX = mesh.geometry.attributes.position.getX(mesh.geometry.attributes.position.count - 1);\r\n const pY = mesh.geometry.attributes.position.getY(mesh.geometry.attributes.position.count - 1);\r\n const pZ = mesh.geometry.attributes.position.getZ(mesh.geometry.attributes.position.count - 1);\r\n marker.get().position.set(pX + 2, pY - 2, pZ);\r\n }\r\n else if (type === \"Length\") {\r\n const pointStart = new THREE.Vector3();\r\n pointStart.x = mesh.geometry.attributes.position.getX(0);\r\n pointStart.y = mesh.geometry.attributes.position.getY(0);\r\n pointStart.z = mesh.geometry.attributes.position.getZ(0);\r\n const pointEnd = new THREE.Vector3();\r\n pointEnd.x = mesh.geometry.attributes.position.getX(mesh.geometry.attributes.position.count - 1);\r\n pointEnd.y = mesh.geometry.attributes.position.getY(mesh.geometry.attributes.position.count - 1);\r\n pointEnd.z = mesh.geometry.attributes.position.getZ(mesh.geometry.attributes.position.count - 1);\r\n const length = pointStart.distanceTo(pointEnd);\r\n marker.get().element.innerText = length.toFixed(2);\r\n marker\r\n .get()\r\n .position.copy(pointEnd.clone().add(pointStart).divideScalar(2));\r\n }\r\n this.markers.add({\r\n label: marker,\r\n mesh,\r\n key: this._markerKey.toString(),\r\n type,\r\n merged: false,\r\n static: false,\r\n });\r\n this._markerKey++;\r\n return marker;\r\n }\r\n addMarkerToScene(span) {\r\n if (!this.scene) {\r\n throw new Error(\"Scene is needed to add markers!\");\r\n }\r\n const scene = this.scene;\r\n const marker = new Simple2DMarker(this.components, span, scene);\r\n return marker;\r\n }\r\n getScreenPosition(label) {\r\n const screenPosition = new THREE.Vector3();\r\n if (!this.scene) {\r\n const labelPosition = label\r\n .get()\r\n .position.clone()\r\n .project(this.components.camera.get());\r\n const dimensions = this.components.renderer.getSize();\r\n screenPosition.x =\r\n (labelPosition.x * dimensions.x) / 2 + dimensions.x / 2;\r\n screenPosition.y =\r\n -((labelPosition.y * dimensions.y) / 2) + dimensions.y / 2;\r\n }\r\n else {\r\n const labelPosition = label\r\n .get()\r\n .position.clone()\r\n .project(this.controls.camera);\r\n const dimensions = this.renderer.getSize();\r\n screenPosition.x =\r\n (labelPosition.x * dimensions.x) / 2 + dimensions.x / 2;\r\n screenPosition.y =\r\n -((labelPosition.y * dimensions.y) / 2) + dimensions.y / 2;\r\n }\r\n return screenPosition;\r\n }\r\n distance(label1, label2) {\r\n const screenPosition1 = this.getScreenPosition(label1);\r\n const screenPosition2 = this.getScreenPosition(label2);\r\n const dx = screenPosition1.x - screenPosition2.x;\r\n const dy = screenPosition1.y - screenPosition2.y;\r\n const distance = Math.sqrt(dx * dx + dy * dy) * 0.5;\r\n // Managing Overlapping Labels\r\n if (distance === 0) {\r\n const updateDistance = this._clusterThreeshold + 1;\r\n return updateDistance;\r\n }\r\n return distance;\r\n }\r\n navigateToCluster(key) {\r\n const boundingRegion = [];\r\n const cluster = Array.from(this.clusterLabels).find((cluster) => cluster.key === key);\r\n if (cluster) {\r\n for (const markerKey of cluster.markerKeys) {\r\n const marker = Array.from(this.markers).find((marker) => marker.key === markerKey);\r\n if (marker) {\r\n boundingRegion.push(marker.label.get().position);\r\n }\r\n }\r\n this.scene.remove(cluster?.label.get());\r\n this.clusterLabels.delete(cluster);\r\n }\r\n if (this.scene) {\r\n const box3 = this.createBox3FromPoints(boundingRegion);\r\n const size = new THREE.Vector3();\r\n box3.getSize(size);\r\n const center = new THREE.Vector3();\r\n box3.getCenter(center);\r\n const geometry = new THREE.BoxGeometry(size.x, size.y, size.z);\r\n geometry.translate(center.x, center.y, center.z);\r\n const mesh = new THREE.Mesh(geometry);\r\n mesh.geometry.computeBoundingSphere();\r\n const boundingSphere = mesh.geometry?.boundingSphere;\r\n if (this.controls && boundingSphere) {\r\n this.controls.fitToSphere(mesh, true);\r\n }\r\n this.isNavigating = true;\r\n geometry.dispose();\r\n mesh.clear();\r\n }\r\n boundingRegion.length = 0;\r\n }\r\n createBox3FromPoints(points) {\r\n const bbox = new THREE.Box3();\r\n for (const point of points) {\r\n bbox.expandByPoint(point);\r\n }\r\n return bbox;\r\n }\r\n clearMarkers() {\r\n for (const marker of this.markers) {\r\n this.scene.remove(marker.label.get());\r\n }\r\n this.markers.clear();\r\n this._markerKey = 0;\r\n }\r\n clearMarkersByType(type) {\r\n for (const marker of this.markers) {\r\n if (marker.type === type) {\r\n this.scene.remove(marker.label.get());\r\n this.markers.delete(marker);\r\n }\r\n }\r\n }\r\n dispose() {\r\n for (const marker of this.markers) {\r\n marker.label.dispose();\r\n }\r\n this.markers.clear();\r\n this._markerKey = 0;\r\n for (const cluster of this.clusterLabels) {\r\n cluster.label.dispose();\r\n }\r\n this.clusterLabels.clear();\r\n this._clusterKey = 0;\r\n this.currentKeys.clear();\r\n }\r\n}\r\n//# sourceMappingURL=marker-manager.js.map","import * as THREE from \"three\";\r\nimport { CSS2DObject } from \"three/examples/jsm/renderers/CSS2DRenderer\";\r\n/**\r\n * An infinite lightweight 2D grid that can be used for any\r\n * kind of 2d viewports.\r\n */\r\nexport class Infinite2dGrid {\r\n constructor(camera, container) {\r\n this.numbers = new THREE.Group();\r\n this.maxRegenerateRetrys = 4;\r\n this.gridsFactor = 5;\r\n this.scaleX = 1;\r\n this.scaleY = 1;\r\n this._group = new THREE.Group();\r\n this._frustum = new THREE.Frustum();\r\n this._frustumMat = new THREE.Matrix4();\r\n this._regenerateDelay = 200;\r\n this._regenerateCounter = 0;\r\n this._camera = camera;\r\n this._container = container;\r\n const main = this.newGrid(0x222222, -1);\r\n const secondary = this.newGrid(0x111111, -2);\r\n this.grids = { main, secondary };\r\n this._group.add(secondary, main, this.numbers);\r\n }\r\n get() {\r\n return this._group;\r\n }\r\n dispose() {\r\n const { main, secondary } = this.grids;\r\n main.removeFromParent();\r\n secondary.removeFromParent();\r\n main.geometry.dispose();\r\n const mMat = main.material;\r\n mMat.dispose();\r\n secondary.geometry.dispose();\r\n const sMat = secondary.material;\r\n sMat.dispose();\r\n }\r\n regenerate() {\r\n const isReady = this.isGridReady();\r\n if (!isReady) {\r\n this._regenerateCounter++;\r\n if (this._regenerateCounter > this.maxRegenerateRetrys) {\r\n throw new Error(\"Grid could not be regenerated\");\r\n }\r\n setTimeout(() => this.regenerate, this._regenerateDelay);\r\n return;\r\n }\r\n this._regenerateCounter = 0;\r\n const matrix = this._frustumMat.multiplyMatrices(this._camera.projectionMatrix, this._camera.matrixWorldInverse);\r\n this._frustum.setFromProjectionMatrix(matrix);\r\n // Step 1: find out the distance of the visible area of the 2D scene\r\n // and the translation pixel / 3d unit\r\n const { planes } = this._frustum;\r\n const right = planes[0].constant * -planes[0].normal.x;\r\n const left = planes[1].constant * -planes[1].normal.x;\r\n const bottom = planes[2].constant * -planes[2].normal.y;\r\n const top = planes[3].constant * -planes[3].normal.y;\r\n const horizontalDistance = Math.abs(right - left);\r\n const verticalDistance = Math.abs(top - bottom);\r\n const { clientWidth, clientHeight } = this._container;\r\n const maxPixelDist = Math.max(clientWidth, clientHeight);\r\n const maxUnit3dDist = Math.max(horizontalDistance, verticalDistance);\r\n const unit3dPixelRel = maxUnit3dDist / maxPixelDist;\r\n // Step 2: find out its order of magnitude\r\n const magnitudeX = Math.ceil(Math.log10(horizontalDistance / this.scaleX));\r\n const magnitudeY = Math.ceil(Math.log10(verticalDistance / this.scaleY));\r\n // Step 3: represent main grid\r\n const sDistanceHor = 10 ** (magnitudeX - 2) * this.scaleX;\r\n const sDistanceVert = 10 ** (magnitudeY - 2) * this.scaleY;\r\n const mDistanceHor = sDistanceHor * this.gridsFactor;\r\n const mDistanceVert = sDistanceVert * this.gridsFactor;\r\n const mainGridCountVert = Math.ceil(verticalDistance / mDistanceVert);\r\n const mainGridCountHor = Math.ceil(horizontalDistance / mDistanceHor);\r\n const secondaryGridCountVert = Math.ceil(verticalDistance / sDistanceVert);\r\n const secondaryGridCountHor = Math.ceil(horizontalDistance / sDistanceHor);\r\n // Step 4: find out position of first lines\r\n const sTrueLeft = sDistanceHor * Math.ceil(left / sDistanceHor);\r\n const sTrueBottom = sDistanceVert * Math.ceil(bottom / sDistanceVert);\r\n const mTrueLeft = mDistanceHor * Math.ceil(left / mDistanceHor);\r\n const mTrueBottom = mDistanceVert * Math.ceil(bottom / mDistanceVert);\r\n // Step 5: draw lines and texts\r\n const numbers = [...this.numbers.children];\r\n for (const number of numbers) {\r\n number.removeFromParent();\r\n }\r\n this.numbers.children = [];\r\n const mPoints = [];\r\n const realWidthPerCharacter = 9 * unit3dPixelRel; // 9 pixels per char\r\n const p = 10000;\r\n // Avoid horizontal text overlap by computing the real width of a text\r\n // and computing which lines should have a label starting from zero\r\n const minLabel = Math.round(Math.abs(mTrueLeft / this.scaleX) * p) / p;\r\n const maxDist = (mainGridCountHor - 1) * mDistanceHor;\r\n const maxLabel = Math.round(Math.abs((mTrueLeft + maxDist) / this.scaleX) * p) / p;\r\n const biggestLabelLength = Math.max(minLabel, maxLabel).toString().length;\r\n const biggestLabelSize = biggestLabelLength * realWidthPerCharacter;\r\n const cellsOccupiedByALabel = Math.ceil(biggestLabelSize / mDistanceHor);\r\n let offsetToZero = cellsOccupiedByALabel * mDistanceHor;\r\n for (let i = 0; i < mainGridCountHor; i++) {\r\n let offset = mTrueLeft + i * mDistanceHor;\r\n mPoints.push(offset, top, 0, offset, bottom, 0);\r\n const value = offset / this.scaleX;\r\n offset = Math.round(offset * p) / p;\r\n offsetToZero = Math.round(offsetToZero * p) / p;\r\n const result = offset % offsetToZero;\r\n // TODO: Removing horizontal labels for clarity doesn't work for small distances\r\n const isSmall = mDistanceHor < 1 || mDistanceVert < 1;\r\n if (!isSmall && Math.abs(result) > 0.01) {\r\n continue;\r\n }\r\n const sign = this.newNumber(value);\r\n const textOffsetPixels = 12;\r\n const textOffset = textOffsetPixels * unit3dPixelRel;\r\n sign.position.set(offset, bottom + textOffset, 0);\r\n }\r\n for (let i = 0; i < mainGridCountVert; i++) {\r\n const offset = mTrueBottom + i * mDistanceVert;\r\n mPoints.push(left, offset, 0, right, offset, 0);\r\n const sign = this.newNumber(offset / this.scaleY);\r\n let textOffsetPixels = 12;\r\n if (sign.element.textContent) {\r\n textOffsetPixels += 4 * sign.element.textContent.length;\r\n }\r\n const textOffset = textOffsetPixels * unit3dPixelRel;\r\n sign.position.set(left + textOffset, offset, 0);\r\n }\r\n const sPoints = [];\r\n for (let i = 0; i < secondaryGridCountHor; i++) {\r\n const offset = sTrueLeft + i * sDistanceHor;\r\n sPoints.push(offset, top, 0, offset, bottom, 0);\r\n }\r\n for (let i = 0; i < secondaryGridCountVert; i++) {\r\n const offset = sTrueBottom + i * sDistanceVert;\r\n sPoints.push(left, offset, 0, right, offset, 0);\r\n }\r\n const mBuffer = new THREE.BufferAttribute(new Float32Array(mPoints), 3);\r\n const sBuffer = new THREE.BufferAttribute(new Float32Array(sPoints), 3);\r\n const { main, secondary } = this.grids;\r\n main.geometry.setAttribute(\"position\", mBuffer);\r\n secondary.geometry.setAttribute(\"position\", sBuffer);\r\n }\r\n newNumber(offset) {\r\n const text = document.createElement(\"div\");\r\n const formattedNumber = Math.round(offset * 100) / 100;\r\n text.textContent = `${formattedNumber}`;\r\n text.style.height = \"24px\";\r\n text.style.fontSize = \"12px\";\r\n const sign = new CSS2DObject(text);\r\n this.numbers.add(sign);\r\n return sign;\r\n }\r\n newGrid(color, renderOrder) {\r\n const geometry = new THREE.BufferGeometry();\r\n const material = new THREE.LineBasicMaterial({ color });\r\n const grid = new THREE.LineSegments(geometry, material);\r\n grid.frustumCulled = false;\r\n grid.renderOrder = renderOrder;\r\n return grid;\r\n }\r\n isGridReady() {\r\n const nums = this._camera.projectionMatrix.elements;\r\n for (let i = 0; i < nums.length; i++) {\r\n const num = nums[i];\r\n if (Number.isNaN(num)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n}\r\n//# sourceMappingURL=infinite-2d-grid.js.map","import * as THREE from \"three\";\r\nimport CameraControls from \"camera-controls\";\r\nimport { Component, Event, UIElement, } from \"../../base-types\";\r\nimport { SimpleUIComponent } from \"../../ui\";\r\nimport { Disposer } from \"../Disposer\";\r\nimport { SimpleRenderer } from \"../SimpleRenderer\";\r\nimport { PostproductionRenderer } from \"../../navigation/PostproductionRenderer\";\r\nimport { Infinite2dGrid } from \"./src\";\r\n// TODO: Make a scene manager as a Tool (so that it as an UUID)\r\n/**\r\n * A simple floating 2D scene that you can use to easily draw 2D graphics\r\n * with all the power of Three.js.\r\n */\r\nexport class Simple2DScene extends Component {\r\n get size() {\r\n return this._size.clone();\r\n }\r\n get scaleX() {\r\n return this._scaleX;\r\n }\r\n set scaleX(value) {\r\n this._scaleX = value;\r\n this._root.scale.x = value;\r\n this.grid.scaleX = value;\r\n this.grid.regenerate();\r\n }\r\n get scaleY() {\r\n return this._scaleY;\r\n }\r\n set scaleY(value) {\r\n this._scaleY = value;\r\n this._root.scale.y = value;\r\n this.grid.scaleY = value;\r\n this.grid.regenerate();\r\n }\r\n constructor(components, postproduction = false) {\r\n super(components);\r\n /** {@link Updateable.onAfterUpdate} */\r\n this.onAfterUpdate = new Event();\r\n /** {@link Updateable.onBeforeUpdate} */\r\n this.onBeforeUpdate = new Event();\r\n /** {@link Resizeable.onResize} */\r\n this.onResize = new Event();\r\n /** {@link Component.enabled} */\r\n this.enabled = true;\r\n /** {@link Disposable.onDisposed} */\r\n this.onDisposed = new Event();\r\n /** {@link UI.uiElement} */\r\n this.uiElement = new UIElement();\r\n this._scaleX = 1;\r\n this._scaleY = 1;\r\n this._root = new THREE.Group();\r\n this._size = new THREE.Vector2();\r\n this._frustumSize = 50;\r\n /** {@link Resizeable.resize} */\r\n this.resize = () => {\r\n const { height, width } = this._size;\r\n const aspect = width / height;\r\n this.camera.left = (-this._frustumSize * aspect) / 2;\r\n this.camera.right = (this._frustumSize * aspect) / 2;\r\n this.camera.top = this._frustumSize / 2;\r\n this.camera.bottom = -this._frustumSize / 2;\r\n this.camera.updateProjectionMatrix();\r\n this.camera.updateProjectionMatrix();\r\n this.renderer.resize(this._size);\r\n };\r\n if (!components.uiEnabled) {\r\n throw new Error(\"The Simple2DScene component needs to use UI elements (TODO: Decouple from them).\");\r\n }\r\n const container = new SimpleUIComponent(components);\r\n container.domElement.classList.add(\"relative\");\r\n this.uiElement.set({ container });\r\n this.scene = new THREE.Scene();\r\n this._size.set(window.innerWidth, window.innerHeight);\r\n const { width, height } = this._size;\r\n // Creates the camera (point of view of the user)\r\n const aspect = width / height;\r\n const halfSize = this._frustumSize * 0.5;\r\n this.camera = new THREE.OrthographicCamera(-halfSize * aspect, halfSize * aspect, halfSize, -halfSize, -1000, 1000);\r\n this.scene.add(this.camera);\r\n this.camera.position.z = 10;\r\n const domContainer = container.domElement;\r\n this.scene.add(this._root);\r\n this.grid = new Infinite2dGrid(this.camera, domContainer);\r\n const gridObject = this.grid.get();\r\n this.scene.add(gridObject);\r\n if (postproduction) {\r\n this.renderer = new PostproductionRenderer(this.components, domContainer);\r\n }\r\n else {\r\n this.renderer = new SimpleRenderer(this.components, domContainer);\r\n }\r\n const renderer = this.renderer.get();\r\n renderer.localClippingEnabled = false;\r\n this.renderer.setupEvents(false);\r\n this.renderer.overrideScene = this.scene;\r\n this.renderer.overrideCamera = this.camera;\r\n this.controls = new CameraControls(this.camera, renderer.domElement);\r\n // this.controls.smoothTime = 0.6;\r\n this.controls.setTarget(0, 0, 0);\r\n this.controls.addEventListener(\"update\", () => this.grid.regenerate());\r\n this.controls.mouseButtons.left = CameraControls.ACTION.TRUCK;\r\n this.controls.dollyToCursor = true;\r\n this.controls.restThreshold = 2;\r\n this.controls.smoothTime = 0.2;\r\n }\r\n /**\r\n * {@link Component.get}\r\n * @returns the 2D scene.\r\n */\r\n get() {\r\n return this._root;\r\n }\r\n /** {@link Disposable.dispose} */\r\n async dispose() {\r\n const disposer = this.components.tools.get(Disposer);\r\n for (const child of this.scene.children) {\r\n const item = child;\r\n if (item instanceof THREE.Object3D) {\r\n disposer.destroy(item);\r\n }\r\n }\r\n await this.renderer.dispose();\r\n await this.uiElement.dispose();\r\n await this.onDisposed.trigger(Simple2DScene.uuid);\r\n this.onDisposed.reset();\r\n }\r\n /** {@link Updateable.update} */\r\n async update() {\r\n await this.onBeforeUpdate.trigger();\r\n this.controls.update(1 / 60);\r\n await this.renderer.update();\r\n await this.onAfterUpdate.trigger();\r\n }\r\n /** {@link Resizeable.getSize} */\r\n getSize() {\r\n return new THREE.Vector2(this._size.width, this._size.height);\r\n }\r\n setSize(height, width) {\r\n this._size.width = width;\r\n this._size.height = height;\r\n this.resize();\r\n }\r\n}\r\nSimple2DScene.uuid = \"b48b7194-0f9a-43a4-a718-270b1522595f\";\r\n//# sourceMappingURL=index.js.map","import * as THREE from \"three\";\r\nimport CameraControls from \"camera-controls\";\r\nimport { Component, Event } from \"../../base-types\";\r\n/**\r\n * A basic camera that uses\r\n * [yomotsu's cameracontrols](https://github.com/yomotsu/camera-controls) to\r\n * easily control the camera in 2D and 3D. Check out it's API to find out\r\n * what features it offers.\r\n */\r\nexport class SimpleCamera extends Component {\r\n /** {@link Component.enabled} */\r\n get enabled() {\r\n return this.controls.enabled;\r\n }\r\n /** {@link Component.enabled} */\r\n set enabled(enabled) {\r\n this.controls.enabled = enabled;\r\n }\r\n constructor(components) {\r\n super(components);\r\n /** {@link Updateable.onBeforeUpdate} */\r\n this.onBeforeUpdate = new Event();\r\n /** {@link Updateable.onAfterUpdate} */\r\n this.onAfterUpdate = new Event();\r\n this.onAspectUpdated = new Event();\r\n /** {@link Disposable.onDisposed} */\r\n this.onDisposed = new Event();\r\n /**\r\n * Updates the aspect of the camera to match the size of the\r\n * {@link Components.renderer}.\r\n */\r\n this.updateAspect = () => {\r\n if (this.components.renderer.isResizeable()) {\r\n const size = this.components.renderer.getSize();\r\n this._perspectiveCamera.aspect = size.width / size.height;\r\n this._perspectiveCamera.updateProjectionMatrix();\r\n this.onAspectUpdated.trigger();\r\n }\r\n };\r\n this._perspectiveCamera = this.setupCamera();\r\n this.activeCamera = this._perspectiveCamera;\r\n this.controls = this.setupCameraControls();\r\n const scene = components.scene.get();\r\n scene.add(this._perspectiveCamera);\r\n this.setupEvents(true);\r\n }\r\n /** {@link Component.get} */\r\n get() {\r\n return this.activeCamera;\r\n }\r\n /** {@link Disposable.dispose} */\r\n async dispose() {\r\n this.setupEvents(false);\r\n this.enabled = false;\r\n this.onAspectUpdated.reset();\r\n this.onBeforeUpdate.reset();\r\n this.onAfterUpdate.reset();\r\n this._perspectiveCamera.removeFromParent();\r\n this.controls.dispose();\r\n await this.onDisposed.trigger();\r\n this.onDisposed.reset();\r\n }\r\n /** {@link Updateable.update} */\r\n async update(_delta) {\r\n if (this.enabled) {\r\n await this.onBeforeUpdate.trigger(this);\r\n this.controls.update(_delta);\r\n await this.onAfterUpdate.trigger(this);\r\n }\r\n }\r\n setupCamera() {\r\n const aspect = window.innerWidth / window.innerHeight;\r\n const camera = new THREE.PerspectiveCamera(60, aspect, 1, 1000);\r\n camera.position.set(50, 50, 50);\r\n camera.lookAt(new THREE.Vector3(0, 0, 0));\r\n return camera;\r\n }\r\n setupCameraControls() {\r\n CameraControls.install({ THREE: SimpleCamera.getSubsetOfThree() });\r\n const dom = this.components.renderer.get().domElement;\r\n const controls = new CameraControls(this._perspectiveCamera, dom);\r\n controls.smoothTime = 0.2;\r\n controls.dollyToCursor = true;\r\n controls.infinityDolly = true;\r\n controls.setTarget(0, 0, 0);\r\n return controls;\r\n }\r\n setupEvents(active) {\r\n if (active) {\r\n window.addEventListener(\"resize\", this.updateAspect);\r\n }\r\n else {\r\n window.removeEventListener(\"resize\", this.updateAspect);\r\n }\r\n }\r\n static getSubsetOfThree() {\r\n return {\r\n MOUSE: THREE.MOUSE,\r\n Vector2: THREE.Vector2,\r\n Vector3: THREE.Vector3,\r\n Vector4: THREE.Vector4,\r\n Quaternion: THREE.Quaternion,\r\n Matrix4: THREE.Matrix4,\r\n Spherical: THREE.Spherical,\r\n Box3: THREE.Box3,\r\n Sphere: THREE.Sphere,\r\n Raycaster: THREE.Raycaster,\r\n MathUtils: THREE.MathUtils,\r\n };\r\n }\r\n}\r\n//# sourceMappingURL=index.js.map"],"names":["Simple2DMarker","visible","value","this","_visible","_marker","constructor","components","marker","parent","super","enabled","onDisposed","document","createElement","className","add","scene","get","toggleVisibility","dispose","removeFromParent","element","remove","trigger","reset","MarkerManager","renderer","controls","markers","Set","clusterLabels","currentKeys","_clusterOnZoom","_color","_markerKey","_clusterKey","_clusterThreeshold","isNavigating","setupEvents","clusterOnZoom","color","label","style","clusterThreeshold","addEventListener","manageCluster","resetMarkers","merged","cluster","clear","removeMergeMarkers","markerKeys","length","Array","from","find","key","delete","static","marker2","distance","size","clusterGroup","averagePosition","getAveragePositionFromLabels","clusterLabel","createClusterElement","toString","textContent","position","copy","positions","map","reduce","acc","curr","divideScalar","div","background","fontSize","fontWeight","pointerEvents","borderRadius","padding","textAlign","cursor","navigateToCluster","addMarker","text","mesh","span","innerHTML","addMarkerToScene","addMarkerAtPoint","point","type","isStatic","undefined","addKPStation","container","appendChild","borderBottom","width","x","geometry","attributes","getX","count","y","getY","z","getZ","secondLastPoint","midPoint","direction","subVectors","normalize","quaternion","setFromUnitVectors","eulerZ","setFromQuaternion","rotationZ","radToDeg","transform","addCivilVerticalMarker","root","firstIndex","array","lastIndex","slice","set","pX","pY","pZ","pointStart","pointEnd","addVectors","multiplyScalar","addCivilMarker","distanceTo","innerText","toFixed","clone","Error","getScreenPosition","screenPosition","labelPosition","project","camera","dimensions","getSize","label1","label2","screenPosition1","screenPosition2","dx","dy","Math","sqrt","boundingRegion","markerKey","push","box3","createBox3FromPoints","center","getCenter","translate","computeBoundingSphere","boundingSphere","fitToSphere","points","bbox","expandByPoint","clearMarkers","clearMarkersByType","Infinite2dGrid","numbers","maxRegenerateRetrys","gridsFactor","scaleX","scaleY","_group","_frustum","_frustumMat","_regenerateDelay","_regenerateCounter","_camera","_container","main","newGrid","secondary","grids","material","regenerate","isGridReady","setTimeout","matrix","multiplyMatrices","projectionMatrix","matrixWorldInverse","setFromProjectionMatrix","planes","right","constant","normal","left","bottom","top","horizontalDistance","abs","verticalDistance","clientWidth","clientHeight","maxPixelDist","max","unit3dPixelRel","magnitudeX","ceil","log10","magnitudeY","sDistanceHor","sDistanceVert","mDistanceHor","mDistanceVert","mainGridCountVert","mainGridCountHor","secondaryGridCountVert","secondaryGridCountHor","sTrueLeft","sTrueBottom","mTrueLeft","mTrueBottom","children","number","mPoints","realWidthPerCharacter","p","minLabel","round","maxDist","maxLabel","biggestLabelSize","offsetToZero","i","offset","result","textOffset","newNumber","sign","textOffsetPixels","sPoints","mBuffer","Float32Array","sBuffer","setAttribute","formattedNumber","height","renderOrder","grid","frustumCulled","nums","elements","num","Number","isNaN","Simple2DScene","_size","_scaleX","_root","scale","_scaleY","postproduction","onAfterUpdate","onBeforeUpdate","onResize","uiElement","_frustumSize","resize","aspect","updateProjectionMatrix","uiEnabled","domElement","classList","window","innerWidth","innerHeight","halfSize","domContainer","gridObject","PostproductionRenderer","SimpleRenderer","localClippingEnabled","overrideScene","overrideCamera","setTarget","mouseButtons","ACTION","TRUCK","dollyToCursor","restThreshold","smoothTime","disposer","tools","Disposer","child","item","destroy","uuid","update","setSize","SimpleCamera","onAspectUpdated","updateAspect","isResizeable","_perspectiveCamera","setupCamera","activeCamera","setupCameraControls","_delta","lookAt","install","THREE","getSubsetOfThree","dom","infinityDolly","active","removeEventListener","MOUSE","Vector2","Vector3","Vector4","Quaternion","Matrix4","Spherical","Box3","Sphere","Raycaster","MathUtils"],"sourceRoot":""}