leaflet-city-mapper 0.0.0-stage → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +674 -0
- package/README.md +78 -2
- package/cucumber.mjs +9 -0
- package/dist/leaflet-city-mapper.js +2 -0
- package/dist/leaflet-city-mapper.js.map +7 -0
- package/dist/utils/CELL.js +2 -0
- package/dist/utils/CELL.js.map +7 -0
- package/dist/utils/addBridges.js +2 -0
- package/dist/utils/addBridges.js.map +7 -0
- package/dist/utils/addRasterTile.js +2 -0
- package/dist/utils/addRasterTile.js.map +7 -0
- package/dist/utils/along.js +2 -0
- package/dist/utils/along.js.map +7 -0
- package/dist/utils/atmosphere.js +2 -0
- package/dist/utils/atmosphere.js.map +7 -0
- package/dist/utils/attach.js +2 -0
- package/dist/utils/attach.js.map +7 -0
- package/dist/utils/bindSunlight.js +2 -0
- package/dist/utils/bindSunlight.js.map +7 -0
- package/dist/utils/box.js +2 -0
- package/dist/utils/box.js.map +7 -0
- package/dist/utils/bridgeElevation.js +2 -0
- package/dist/utils/bridgeElevation.js.map +7 -0
- package/dist/utils/build.js +2 -0
- package/dist/utils/build.js.map +7 -0
- package/dist/utils/cameraControls.js +2 -0
- package/dist/utils/cameraControls.js.map +7 -0
- package/dist/utils/channel.js +2 -0
- package/dist/utils/channel.js.map +7 -0
- package/dist/utils/collider.js +2 -0
- package/dist/utils/collider.js.map +7 -0
- package/dist/utils/colliders.js +2 -0
- package/dist/utils/colliders.js.map +7 -0
- package/dist/utils/computeBounds.js +2 -0
- package/dist/utils/computeBounds.js.map +7 -0
- package/dist/utils/conformModelToTerrain.js +2 -0
- package/dist/utils/conformModelToTerrain.js.map +7 -0
- package/dist/utils/createMesh.js +2 -0
- package/dist/utils/createMesh.js.map +7 -0
- package/dist/utils/createProgram.js +3 -0
- package/dist/utils/createProgram.js.map +7 -0
- package/dist/utils/decodeDirectory.js +2 -0
- package/dist/utils/decodeDirectory.js.map +7 -0
- package/dist/utils/decodeHeader.js +2 -0
- package/dist/utils/decodeHeader.js.map +7 -0
- package/dist/utils/decodeModel.js +2 -0
- package/dist/utils/decodeModel.js.map +7 -0
- package/dist/utils/decompress.js +2 -0
- package/dist/utils/decompress.js.map +7 -0
- package/dist/utils/destroyTexture.js +2 -0
- package/dist/utils/destroyTexture.js.map +7 -0
- package/dist/utils/disposeMesh.js +2 -0
- package/dist/utils/disposeMesh.js.map +7 -0
- package/dist/utils/drawGeometry.js +2 -0
- package/dist/utils/drawGeometry.js.map +7 -0
- package/dist/utils/elevationWGSL.js +24 -0
- package/dist/utils/elevationWGSL.js.map +7 -0
- package/dist/utils/emptyNode.js +2 -0
- package/dist/utils/emptyNode.js.map +7 -0
- package/dist/utils/endZoom.js +2 -0
- package/dist/utils/endZoom.js.map +7 -0
- package/dist/utils/findFeature.js +2 -0
- package/dist/utils/findFeature.js.map +7 -0
- package/dist/utils/geometry.js +1 -0
- package/dist/utils/geometry.js.map +7 -0
- package/dist/utils/getElevation.js +2 -0
- package/dist/utils/getElevation.js.map +7 -0
- package/dist/utils/getHeader.js +2 -0
- package/dist/utils/getHeader.js.map +7 -0
- package/dist/utils/getZxy.js +2 -0
- package/dist/utils/getZxy.js.map +7 -0
- package/dist/utils/glass.js +2 -0
- package/dist/utils/glass.js.map +7 -0
- package/dist/utils/headlight.js +2 -0
- package/dist/utils/headlight.js.map +7 -0
- package/dist/utils/hit.js +2 -0
- package/dist/utils/hit.js.map +7 -0
- package/dist/utils/horizontalPosition.js +2 -0
- package/dist/utils/horizontalPosition.js.map +7 -0
- package/dist/utils/horizontalRay.js +2 -0
- package/dist/utils/horizontalRay.js.map +7 -0
- package/dist/utils/hull.js +2 -0
- package/dist/utils/hull.js.map +7 -0
- package/dist/utils/initSunlight.js +2 -0
- package/dist/utils/initSunlight.js.map +7 -0
- package/dist/utils/initTerrain.js +2 -0
- package/dist/utils/initTerrain.js.map +7 -0
- package/dist/utils/initTraffic.js +40 -0
- package/dist/utils/initTraffic.js.map +7 -0
- package/dist/utils/initWalk.js +2 -0
- package/dist/utils/initWalk.js.map +7 -0
- package/dist/utils/intersectMeshes.js +2 -0
- package/dist/utils/intersectMeshes.js.map +7 -0
- package/dist/utils/isClockWise.js +2 -0
- package/dist/utils/isClockWise.js.map +7 -0
- package/dist/utils/lampPostGeometry.js +2 -0
- package/dist/utils/lampPostGeometry.js.map +7 -0
- package/dist/utils/lightGeometry.js +2 -0
- package/dist/utils/lightGeometry.js.map +7 -0
- package/dist/utils/lightGrid.js +2 -0
- package/dist/utils/lightGrid.js.map +7 -0
- package/dist/utils/limbs.js +2 -0
- package/dist/utils/limbs.js.map +7 -0
- package/dist/utils/loadModel.js +2 -0
- package/dist/utils/loadModel.js.map +7 -0
- package/dist/utils/loadSource.js +2 -0
- package/dist/utils/loadSource.js.map +7 -0
- package/dist/utils/loadTerrain.js +2 -0
- package/dist/utils/loadTerrain.js.map +7 -0
- package/dist/utils/mapCamera.js +2 -0
- package/dist/utils/mapCamera.js.map +7 -0
- package/dist/utils/materialShaders.js +211 -0
- package/dist/utils/materialShaders.js.map +7 -0
- package/dist/utils/mirror.js +2 -0
- package/dist/utils/mirror.js.map +7 -0
- package/dist/utils/moonPosition.js +2 -0
- package/dist/utils/moonPosition.js.map +7 -0
- package/dist/utils/moves.js +2 -0
- package/dist/utils/moves.js.map +7 -0
- package/dist/utils/nativeEvents.js +2 -0
- package/dist/utils/nativeEvents.js.map +7 -0
- package/dist/utils/nativeGeometry.js +2 -0
- package/dist/utils/nativeGeometry.js.map +7 -0
- package/dist/utils/nativeLayer.js +2 -0
- package/dist/utils/nativeLayer.js.map +7 -0
- package/dist/utils/nodeMatrix.js +2 -0
- package/dist/utils/nodeMatrix.js.map +7 -0
- package/dist/utils/onAdd3DLayer.js +2 -0
- package/dist/utils/onAdd3DLayer.js.map +7 -0
- package/dist/utils/onAddSun.js +2 -0
- package/dist/utils/onAddSun.js.map +7 -0
- package/dist/utils/onClick.js +2 -0
- package/dist/utils/onClick.js.map +7 -0
- package/dist/utils/onMapChange.js +2 -0
- package/dist/utils/onMapChange.js.map +7 -0
- package/dist/utils/onPMTileAdd.js +2 -0
- package/dist/utils/onPMTileAdd.js.map +7 -0
- package/dist/utils/onPMTileRemove.js +2 -0
- package/dist/utils/onPMTileRemove.js.map +7 -0
- package/dist/utils/onPointerLeave.js +2 -0
- package/dist/utils/onPointerLeave.js.map +7 -0
- package/dist/utils/onPointerMove.js +2 -0
- package/dist/utils/onPointerMove.js.map +7 -0
- package/dist/utils/onRemove3DLayer.js +2 -0
- package/dist/utils/onRemove3DLayer.js.map +7 -0
- package/dist/utils/onRemoveSun.js +2 -0
- package/dist/utils/onRemoveSun.js.map +7 -0
- package/dist/utils/onTerrainAdd.js +2 -0
- package/dist/utils/onTerrainAdd.js.map +7 -0
- package/dist/utils/onTerrainChange.js +2 -0
- package/dist/utils/onTerrainChange.js.map +7 -0
- package/dist/utils/onTerrainRemove.js +2 -0
- package/dist/utils/onTerrainRemove.js.map +7 -0
- package/dist/utils/onZoomAnim.js +2 -0
- package/dist/utils/onZoomAnim.js.map +7 -0
- package/dist/utils/paints.js +2 -0
- package/dist/utils/paints.js.map +7 -0
- package/dist/utils/parseColor.js +2 -0
- package/dist/utils/parseColor.js.map +7 -0
- package/dist/utils/parts.js +2 -0
- package/dist/utils/parts.js.map +7 -0
- package/dist/utils/projectCelestialBody.js +2 -0
- package/dist/utils/projectCelestialBody.js.map +7 -0
- package/dist/utils/pump.js +2 -0
- package/dist/utils/pump.js.map +7 -0
- package/dist/utils/rasterTiles.js +2 -0
- package/dist/utils/rasterTiles.js.map +7 -0
- package/dist/utils/raycast.js +2 -0
- package/dist/utils/raycast.js.map +7 -0
- package/dist/utils/read.js +2 -0
- package/dist/utils/read.js.map +7 -0
- package/dist/utils/readAccessor.js +2 -0
- package/dist/utils/readAccessor.js.map +7 -0
- package/dist/utils/releaseArea.js +2 -0
- package/dist/utils/releaseArea.js.map +7 -0
- package/dist/utils/removeRasterTile.js +2 -0
- package/dist/utils/removeRasterTile.js.map +7 -0
- package/dist/utils/render.js +15 -0
- package/dist/utils/render.js.map +7 -0
- package/dist/utils/renderSunlight.js +13 -0
- package/dist/utils/renderSunlight.js.map +7 -0
- package/dist/utils/renderers.js +2 -0
- package/dist/utils/renderers.js.map +7 -0
- package/dist/utils/resizeSunlight.js +2 -0
- package/dist/utils/resizeSunlight.js.map +7 -0
- package/dist/utils/roofCoverage.js +2 -0
- package/dist/utils/roofCoverage.js.map +7 -0
- package/dist/utils/routeGeometry.js +2 -0
- package/dist/utils/routeGeometry.js.map +7 -0
- package/dist/utils/scheduledTrips.js +2 -0
- package/dist/utils/scheduledTrips.js.map +7 -0
- package/dist/utils/setGeoJSONData.js +2 -0
- package/dist/utils/setGeoJSONData.js.map +7 -0
- package/dist/utils/setHighlight.js +2 -0
- package/dist/utils/setHighlight.js.map +7 -0
- package/dist/utils/setPMTileOpacity.js +2 -0
- package/dist/utils/setPMTileOpacity.js.map +7 -0
- package/dist/utils/setPMTileZIndex.js +2 -0
- package/dist/utils/setPMTileZIndex.js.map +7 -0
- package/dist/utils/setParent.js +2 -0
- package/dist/utils/setParent.js.map +7 -0
- package/dist/utils/setTerrainHeight.js +2 -0
- package/dist/utils/setTerrainHeight.js.map +7 -0
- package/dist/utils/setVertexColor.js +2 -0
- package/dist/utils/setVertexColor.js.map +7 -0
- package/dist/utils/showFeature.js +2 -0
- package/dist/utils/showFeature.js.map +7 -0
- package/dist/utils/sizes.js +2 -0
- package/dist/utils/sizes.js.map +7 -0
- package/dist/utils/skin.js +2 -0
- package/dist/utils/skin.js.map +7 -0
- package/dist/utils/solarPosition.js +2 -0
- package/dist/utils/solarPosition.js.map +7 -0
- package/dist/utils/sortMeshes.js +2 -0
- package/dist/utils/sortMeshes.js.map +7 -0
- package/dist/utils/speed.js +2 -0
- package/dist/utils/speed.js.map +7 -0
- package/dist/utils/startZoom.js +2 -0
- package/dist/utils/startZoom.js.map +7 -0
- package/dist/utils/taillight.js +2 -0
- package/dist/utils/taillight.js.map +7 -0
- package/dist/utils/terrainAtlas.js +2 -0
- package/dist/utils/terrainAtlas.js.map +7 -0
- package/dist/utils/terrainElevation.js +2 -0
- package/dist/utils/terrainElevation.js.map +7 -0
- package/dist/utils/terrainGrid.js +2 -0
- package/dist/utils/terrainGrid.js.map +7 -0
- package/dist/utils/textureSampler.js +2 -0
- package/dist/utils/textureSampler.js.map +7 -0
- package/dist/utils/tileId.js +2 -0
- package/dist/utils/tileId.js.map +7 -0
- package/dist/utils/toLanes.js +2 -0
- package/dist/utils/toLanes.js.map +7 -0
- package/dist/utils/toSRGB.js +2 -0
- package/dist/utils/toSRGB.js.map +7 -0
- package/dist/utils/tooltip.js +3 -0
- package/dist/utils/tooltip.js.map +7 -0
- package/dist/utils/traffic.js +2 -0
- package/dist/utils/traffic.js.map +7 -0
- package/dist/utils/traverse.js +2 -0
- package/dist/utils/traverse.js.map +7 -0
- package/dist/utils/treeGeometry.js +2 -0
- package/dist/utils/treeGeometry.js.map +7 -0
- package/dist/utils/triangulate.js +2 -0
- package/dist/utils/triangulate.js.map +7 -0
- package/dist/utils/tripsAt.js +2 -0
- package/dist/utils/tripsAt.js.map +7 -0
- package/dist/utils/types.js +2 -0
- package/dist/utils/types.js.map +7 -0
- package/dist/utils/underEntry.js +2 -0
- package/dist/utils/underEntry.js.map +7 -0
- package/dist/utils/update.js +2 -0
- package/dist/utils/update.js.map +7 -0
- package/dist/utils/updateArea.js +2 -0
- package/dist/utils/updateArea.js.map +7 -0
- package/dist/utils/updateCamera.js +2 -0
- package/dist/utils/updateCamera.js.map +7 -0
- package/dist/utils/updatePointLights.js +2 -0
- package/dist/utils/updatePointLights.js.map +7 -0
- package/dist/utils/updateWorldMatrix.js +2 -0
- package/dist/utils/updateWorldMatrix.js.map +7 -0
- package/dist/utils/vehicleOffsets.js +2 -0
- package/dist/utils/vehicleOffsets.js.map +7 -0
- package/dist/utils/vehicles.js +2 -0
- package/dist/utils/vehicles.js.map +7 -0
- package/dist/utils/vertexNormals.js +2 -0
- package/dist/utils/vertexNormals.js.map +7 -0
- package/dist/utils/walk.js +2 -0
- package/dist/utils/walk.js.map +7 -0
- package/dist/utils/white.js +2 -0
- package/dist/utils/white.js.map +7 -0
- package/dist/utils/worldLights.js +2 -0
- package/dist/utils/worldLights.js.map +7 -0
- package/dist/utils/wrap.js +2 -0
- package/dist/utils/wrap.js.map +7 -0
- package/package.json +43 -4
- package/src/index.js +397 -0
- package/src/utils/CELL.js +4 -0
- package/src/utils/addBridges.js +66 -0
- package/src/utils/addRasterTile.js +112 -0
- package/src/utils/along.js +9 -0
- package/src/utils/atmosphere.js +20 -0
- package/src/utils/attach.js +255 -0
- package/src/utils/bindSunlight.js +12 -0
- package/src/utils/box.js +1 -0
- package/src/utils/bridgeElevation.js +18 -0
- package/src/utils/build.js +20 -0
- package/src/utils/cameraControls.js +287 -0
- package/src/utils/channel.js +4 -0
- package/src/utils/collider.js +62 -0
- package/src/utils/colliders.js +2 -0
- package/src/utils/computeBounds.js +17 -0
- package/src/utils/conformModelToTerrain.js +69 -0
- package/src/utils/createMesh.js +31 -0
- package/src/utils/createProgram.js +92 -0
- package/src/utils/decodeDirectory.js +40 -0
- package/src/utils/decodeHeader.js +15 -0
- package/src/utils/decodeModel.js +43 -0
- package/src/utils/decompress.js +5 -0
- package/src/utils/destroyTexture.js +7 -0
- package/src/utils/disposeMesh.js +13 -0
- package/src/utils/drawGeometry.js +122 -0
- package/src/utils/elevationWGSL.js +27 -0
- package/src/utils/emptyNode.js +9 -0
- package/src/utils/endZoom.js +15 -0
- package/src/utils/findFeature.js +49 -0
- package/src/utils/geometry.js +2 -0
- package/src/utils/getElevation.js +10 -0
- package/src/utils/getHeader.js +9 -0
- package/src/utils/getZxy.js +76 -0
- package/src/utils/glass.js +1 -0
- package/src/utils/headlight.js +1 -0
- package/src/utils/hit.js +41 -0
- package/src/utils/horizontalPosition.js +16 -0
- package/src/utils/horizontalRay.js +12 -0
- package/src/utils/hull.js +1 -0
- package/src/utils/initSunlight.js +9 -0
- package/src/utils/initTerrain.js +19 -0
- package/src/utils/initTraffic.js +93 -0
- package/src/utils/initWalk.js +72 -0
- package/src/utils/intersectMeshes.js +121 -0
- package/src/utils/isClockWise.js +12 -0
- package/src/utils/lampPostGeometry.js +26 -0
- package/src/utils/lightGeometry.js +22 -0
- package/src/utils/lightGrid.js +50 -0
- package/src/utils/limbs.js +9 -0
- package/src/utils/loadModel.js +217 -0
- package/src/utils/loadSource.js +17 -0
- package/src/utils/loadTerrain.js +65 -0
- package/src/utils/mapCamera.js +432 -0
- package/src/utils/materialShaders.js +243 -0
- package/src/utils/mirror.js +6 -0
- package/src/utils/moonPosition.js +17 -0
- package/src/utils/moves.js +11 -0
- package/src/utils/nativeEvents.js +77 -0
- package/src/utils/nativeGeometry.js +131 -0
- package/src/utils/nativeLayer.js +317 -0
- package/src/utils/nodeMatrix.js +22 -0
- package/src/utils/onAdd3DLayer.js +31 -0
- package/src/utils/onAddSun.js +147 -0
- package/src/utils/onClick.js +13 -0
- package/src/utils/onMapChange.js +16 -0
- package/src/utils/onPMTileAdd.js +15 -0
- package/src/utils/onPMTileRemove.js +8 -0
- package/src/utils/onPointerLeave.js +11 -0
- package/src/utils/onPointerMove.js +15 -0
- package/src/utils/onRemove3DLayer.js +78 -0
- package/src/utils/onRemoveSun.js +3 -0
- package/src/utils/onTerrainAdd.js +18 -0
- package/src/utils/onTerrainChange.js +13 -0
- package/src/utils/onTerrainRemove.js +40 -0
- package/src/utils/onZoomAnim.js +14 -0
- package/src/utils/paints.js +10 -0
- package/src/utils/parseColor.js +42 -0
- package/src/utils/parts.js +16 -0
- package/src/utils/projectCelestialBody.js +13 -0
- package/src/utils/pump.js +226 -0
- package/src/utils/rasterTiles.js +285 -0
- package/src/utils/raycast.js +60 -0
- package/src/utils/read.js +29 -0
- package/src/utils/readAccessor.js +68 -0
- package/src/utils/releaseArea.js +34 -0
- package/src/utils/removeRasterTile.js +13 -0
- package/src/utils/render.js +406 -0
- package/src/utils/renderSunlight.js +170 -0
- package/src/utils/renderers.js +2 -0
- package/src/utils/resizeSunlight.js +15 -0
- package/src/utils/roofCoverage.js +47 -0
- package/src/utils/routeGeometry.js +22 -0
- package/src/utils/scheduledTrips.js +29 -0
- package/src/utils/setGeoJSONData.js +11 -0
- package/src/utils/setHighlight.js +13 -0
- package/src/utils/setPMTileOpacity.js +7 -0
- package/src/utils/setPMTileZIndex.js +7 -0
- package/src/utils/setParent.js +7 -0
- package/src/utils/setTerrainHeight.js +10 -0
- package/src/utils/setVertexColor.js +14 -0
- package/src/utils/showFeature.js +27 -0
- package/src/utils/sizes.js +1 -0
- package/src/utils/skin.js +2 -0
- package/src/utils/solarPosition.js +17 -0
- package/src/utils/sortMeshes.js +12 -0
- package/src/utils/speed.js +3 -0
- package/src/utils/startZoom.js +5 -0
- package/src/utils/taillight.js +1 -0
- package/src/utils/terrainAtlas.js +21 -0
- package/src/utils/terrainElevation.js +20 -0
- package/src/utils/terrainGrid.js +23 -0
- package/src/utils/textureSampler.js +10 -0
- package/src/utils/tileId.js +18 -0
- package/src/utils/toLanes.js +7 -0
- package/src/utils/toSRGB.js +1 -0
- package/src/utils/tooltip.js +6 -0
- package/src/utils/traffic.js +315 -0
- package/src/utils/traverse.js +6 -0
- package/src/utils/treeGeometry.js +45 -0
- package/src/utils/triangulate.js +100 -0
- package/src/utils/tripsAt.js +16 -0
- package/src/utils/types.js +8 -0
- package/src/utils/underEntry.js +17 -0
- package/src/utils/update.js +18 -0
- package/src/utils/updateArea.js +40 -0
- package/src/utils/updateCamera.js +32 -0
- package/src/utils/updatePointLights.js +38 -0
- package/src/utils/updateWorldMatrix.js +47 -0
- package/src/utils/vehicleOffsets.js +8 -0
- package/src/utils/vehicles.js +65 -0
- package/src/utils/vertexNormals.js +30 -0
- package/src/utils/walk.js +187 -0
- package/src/utils/white.js +1 -0
- package/src/utils/worldLights.js +25 -0
- package/src/utils/wrap.js +1 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function w(t){return t.closest?.('input,textarea,select,[contenteditable="true"]')}function p(t,n,o,i=[.8,.5],r=!1){let a,h=!1;const l=e=>{if(!a||e?.pointerId!==void 0&&e.pointerId!==a.id)return;const d=a;a=null,n.hasPointerCapture?.(d.id)&&n.releasePointerCapture(d.id),d.dragging&&t.getContainer()._leaflet_id&&t.dragging.enable(),n.style.cursor=d.cursor},g=e=>{if(a||!o(e)||w(e.target))return;e.preventDefault(),e.stopPropagation(),h=!1;const d=t.getContainer().getBoundingClientRect();a={id:e.pointerId,x:e.clientX,y:e.clientY,cursor:n.style.cursor,cx:d.left+d.width/2,cy:d.top+d.height/2,dragging:t.dragging?.enabled()},t.dragging?.disable(),n.focus?.({preventScroll:!0}),n.setPointerCapture(e.pointerId),n.style.cursor="grabbing"},u=e=>{if(!a||a.id!==e.pointerId)return;const d=e.clientX-a.x,f=e.clientY-a.y;if(Math.hypot(d,f)<3&&!h)return;t._stopPitchBearingAnimation(),h=!0,e.preventDefault();let b=d*i[0];if(r)if(Math.abs(a.cy-a.y)>100){const v=Math.atan2(e.clientY-a.cy,e.clientX-a.cx)-Math.atan2(e.clientY-a.cy,a.x-a.cx);b=Math.atan2(Math.sin(v),Math.cos(v))*180/Math.PI}else b*=e.clientY<a.cy?1:-1;t._setPitchAndBearing(t.getPitch()-f*i[1],t.getBearing()+b),a.x=e.clientX,a.y=e.clientY},c=e=>{h&&(e.preventDefault(),e.stopPropagation(),h=!1)},s=e=>{(a||h)&&(e.preventDefault(),e.stopPropagation())};return n.addEventListener("pointerdown",g,!0),n.addEventListener("pointermove",u),n.addEventListener("pointerup",l),n.addEventListener("pointercancel",l),n.addEventListener("lostpointercapture",l),n.addEventListener("click",c,!0),n.addEventListener("contextmenu",s),window.addEventListener("blur",l),()=>{l(),n.removeEventListener("pointerdown",g,!0),n.removeEventListener("pointermove",u),n.removeEventListener("pointerup",l),n.removeEventListener("pointercancel",l),n.removeEventListener("lostpointercapture",l),n.removeEventListener("click",c,!0),n.removeEventListener("contextmenu",s),window.removeEventListener("blur",l)}}L.Control.Rotate=L.Control.extend({options:{position:"topleft",closeOnZeroBearing:!0,visualizePitch:!0},onAdd(t){const n=L.DomUtil.create("div","leaflet-control-rotate leaflet-bar"),o=L.DomUtil.create("a","leaflet-control-rotate-toggle",n);o.href="#",o.setAttribute("role","button"),o.title=this.options.visualizePitch?"Reset bearing and pitch":"Reset bearing to north",o.setAttribute("aria-label",o.title),o.style.cssText="cursor:grab;touch-action:none";const i=L.DomUtil.create("span","leaflet-control-rotate-arrow",o);return i.setAttribute("aria-hidden","true"),i.style.cssText="display:block;width:100%;height:100%;pointer-events:none;background: no-repeat center / 29px 29px",i.style.backgroundImage='url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 29 29%27%3E%3Cpath fill=%27%23333%27 d=%27M10.5 14 14.5 6 18.5 14Z%27/%3E%3Cpath fill=%27%23ccc%27 d=%27M10.5 16 14.5 24 18.5 16Z%27/%3E%3C/svg%3E")',o.onclick=r=>{r.preventDefault(),this.options.visualizePitch?t.resetNorthPitch():t.resetNorth(),r.detail&&t.getContainer().focus({preventScroll:!0})},o.onkeydown=r=>{const a=r.shiftKey?15:5;if(r.key==="ArrowLeft")t.setBearing(t.getBearing()-a);else if(r.key==="ArrowRight")t.setBearing(t.getBearing()+a);else if(r.key==="ArrowUp"&&this.options.visualizePitch)t.setPitch(t.getPitch()+a);else if(r.key==="ArrowDown"&&this.options.visualizePitch)t.setPitch(t.getPitch()-a);else if(r.key==="Home"||r.key===" ")o.click();else return;r.preventDefault(),r.stopPropagation()},this._refresh=()=>{const r=this.options.visualizePitch?t.getPitch():0;i.style.transform=`scale(${1/Math.sqrt(Math.cos(r*Math.PI/180))}) rotateX(${r}deg) rotate(${t.getBearing()}deg)`,o.setAttribute("aria-description",`Bearing ${Math.round(t.getBearing())} degrees, pitch ${Math.round(t.getPitch())} degrees. Arrow keys adjust the camera; Home resets it.`),n.style.display=this.options.closeOnZeroBearing&&!t.getBearing()&&!r&&!n.contains(document.activeElement)?"none":""},t.on("rotate pitch",this._refresh),this._refresh(),this._endDrag=p(t,o,r=>r.button===0,[.8,this.options.visualizePitch?.5:0]),o.addEventListener("focusout",this._refresh),L.DomEvent.on(o,"dblclick contextmenu",L.DomEvent.stop),L.DomEvent.disableClickPropagation(n),L.DomEvent.disableScrollPropagation(n),n},onRemove(t){t.off("rotate pitch",this._refresh),this._endDrag()}}),L.control&&(L.control.rotate=t=>new L.Control.Rotate(t));const _=L.Handler.extend({addHooks(){this._wheel=t=>{!t.shiftKey||w(t.target)||t.target.closest(".leaflet-control")||(t.preventDefault(),t.stopImmediatePropagation(),this._map.setBearing(this._map.getBearing()+Math.sign(t.deltaY)*5))},this._map.getContainer().addEventListener("wheel",this._wheel,{passive:!1,capture:!0})},removeHooks(){this._map.getContainer().removeEventListener("wheel",this._wheel,!0)}}),C=L.Handler.extend({addHooks(){this._end=p(this._map,this._map.getContainer(),t=>!t.target.closest(".leaflet-control,.leaflet-marker-icon,.leaflet-popup")&&(t.button===2||t.button===0&&t.ctrlKey),[.8,.5],!0)},removeHooks(){this._end()}}),y=L.Handler.extend({addHooks(){const t=this._generation=(this._generation||0)+1;this._orientation=o=>{const i=Number.isFinite(o.webkitCompassHeading)?-o.webkitCompassHeading:o.alpha,r=o.absolute?0:screen.orientation?.angle??window.orientation??0;Number.isFinite(i)&&this._map.setBearing(i-r)};const n=window.DeviceOrientationEvent?.requestPermission;new Promise(o=>o(n?n.call(window.DeviceOrientationEvent):"granted")).then(o=>{if(!(!this.enabled()||this._generation!==t)){if(!window.DeviceOrientationEvent||o!=="granted")throw new Error("Device compass permission unavailable or denied");window.addEventListener("deviceorientation",this._orientation),window.addEventListener("deviceorientationabsolute",this._orientation)}}).catch(o=>{this.disable(),this._map.fire("error",{error:o})})},removeHooks(){this._generation++,window.removeEventListener("deviceorientation",this._orientation),window.removeEventListener("deviceorientationabsolute",this._orientation)}}),M=L.Handler.extend({addHooks(){this._observer=new ResizeObserver(()=>this._map.invalidateSize()),this._observer.observe(this._map.getContainer())},removeHooks(){this._observer.disconnect()}});function k(t){if(t.addHandler("trackContainerMutation",M),!t.options.rotate)return;t.addHandler("shiftKeyRotate",_),t.addHandler("pitchDrag",C),t.addHandler("compassBearing",y);const n=L.Handler.extend({addHooks(){t.fire("cameratouchchange")},removeHooks(){t.fire("cameratouchchange")}});t.addHandler("touchRotate",n),t.addHandler("touchPitch",n);const o=t.getContainer();let i,r;const a=c=>{if(c.touches.length!==2||c.target.closest(".leaflet-control")||!t.touchRotate.enabled()&&!t.touchPitch.enabled())return;const[s,e]=c.touches;if(Math.hypot(e.clientX-s.clientX,e.clientY-s.clientY)<1)return;t._stopPitchBearingAnimation();const d=new L.Point((s.clientX+e.clientX)/2,(s.clientY+e.clientY)/2).subtract(new L.Point(o.getBoundingClientRect().left,o.getBoundingClientRect().top));i={angle:Math.atan2(e.clientY-s.clientY,e.clientX-s.clientX),distance:Math.hypot(e.clientX-s.clientX,e.clientY-s.clientY),middle:d,anchor:t.containerPointToLatLng(d),zoom:t.getZoom(),bearing:t.getBearing(),pitch:t.getPitch(),zooming:t.touchZoom?.enabled(),dragging:t.dragging?.enabled()},t.dragging?.disable(),c.preventDefault(),c.stopImmediatePropagation()},h=c=>{if(!i||c.touches.length!==2)return;const[s,e]=c.touches,d=Math.atan2(e.clientY-s.clientY,e.clientX-s.clientX),f=new L.Point((s.clientX+e.clientX)/2,(s.clientY+e.clientY)/2).subtract(new L.Point(o.getBoundingClientRect().left,o.getBoundingClientRect().top)),b=Math.atan2(Math.sin(d-i.angle),Math.cos(d-i.angle))*180/Math.PI;t._setPitchAndBearing(t.touchPitch.enabled()?i.pitch-(f.y-i.middle.y)*.25:i.pitch,t.touchRotate.enabled()?i.bearing+b:i.bearing);const v=Math.hypot(e.clientX-s.clientX,e.clientY-s.clientY);if(v<1)return;const P=i.zooming?Math.max(t.getMinZoom(),Math.min(t.getMaxZoom(),i.zoom+Math.log2(v/i.distance))):i.zoom;if(t.setView(t.getCenter(),P,{animate:!1}),t.options.touchZoom!=="center"){const E=t.project(i.anchor).subtract(t.project(t.containerPointToLatLng(f)));t.setView(t.unproject(t.project(t.getCenter()).add(E)),t.getZoom(),{animate:!1})}c.preventDefault(),c.stopImmediatePropagation()},l=c=>{if(!i||c?.touches?.length>=2)return;i.dragging&&o._leaflet_id&&t.dragging.enable();const s=i.snap;t.options.zoomSnap=s,i.zooming&&s&&o._leaflet_id&&t.setZoom(Math.round(t.getZoom()/s)*s,{animate:!1}),i=null},g=()=>{const c=t.touchRotate.enabled()||t.touchPitch.enabled();c&&r===void 0?(r=t.touchZoom?.enabled(),t.touchZoom?.disable()):!c&&r!==void 0&&(l(),r&&o._leaflet_id&&t.touchZoom.enable(),r=void 0)};g();const u=c=>{i||(a(c),i&&(r!==void 0&&(i.zooming=r),i.snap=t.options.zoomSnap,t.options.zoomSnap=0))};o.addEventListener("touchstart",u,{capture:!0,passive:!1}),o.addEventListener("touchmove",h,{capture:!0,passive:!1}),o.addEventListener("touchend",l,!0),o.addEventListener("touchcancel",l,!0),window.addEventListener("blur",l),t.on("cameratouchchange",g),t.options.rotateControl&&(t.rotateControl=new L.Control.Rotate(typeof t.options.rotateControl=="object"?t.options.rotateControl:{}),t.rotateControl.addTo(t)),t.once("unload",()=>{l(),o.removeEventListener("touchstart",u,!0),o.removeEventListener("touchmove",h,!0),o.removeEventListener("touchend",l,!0),o.removeEventListener("touchcancel",l,!0),window.removeEventListener("blur",l),t.off("cameratouchchange",g),t.rotateControl?.remove()})}export{k as cameraControls};
|
|
2
|
+
//# sourceMappingURL=cameraControls.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/cameraControls.js"],
|
|
4
|
+
"sourcesContent": ["function editable(target) {\r\n return target.closest?.('input,textarea,select,[contenteditable=\"true\"]');\r\n}\r\n\r\nfunction dragCamera(map, element, accept, sensitivity = [0.8, 0.5], orbit = false) {\r\n let drag, moved = false;\r\n const end = event => {\r\n if (!drag) return;\r\n if (event?.pointerId !== undefined && event.pointerId !== drag.id) return;\r\n const finished = drag;\r\n drag = null;\r\n if (element.hasPointerCapture?.(finished.id)) element.releasePointerCapture(finished.id);\r\n if (finished.dragging && map.getContainer()._leaflet_id) map.dragging.enable();\r\n element.style.cursor = finished.cursor;\r\n };\r\n const down = event => {\r\n if (drag || !accept(event) || editable(event.target)) return;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n moved = false;\r\n const rect = map.getContainer().getBoundingClientRect();\r\n drag = { id: event.pointerId, x: event.clientX, y: event.clientY, cursor: element.style.cursor,\r\n cx: rect.left + rect.width / 2, cy: rect.top + rect.height / 2, dragging: map.dragging?.enabled() };\r\n map.dragging?.disable();\r\n element.focus?.({ preventScroll: true });\r\n element.setPointerCapture(event.pointerId);\r\n element.style.cursor = 'grabbing';\r\n };\r\n const move = event => {\r\n if (!drag || drag.id !== event.pointerId) return;\r\n const x = event.clientX - drag.x, y = event.clientY - drag.y;\r\n if (Math.hypot(x, y) < 3 && !moved) return;\r\n map._stopPitchBearingAnimation();\r\n moved = true;\r\n event.preventDefault();\r\n let bearing = x * sensitivity[0];\r\n if (orbit) {\r\n if (Math.abs(drag.cy - drag.y) > 100) {\r\n const angle = Math.atan2(event.clientY - drag.cy, event.clientX - drag.cx) -\r\n Math.atan2(event.clientY - drag.cy, drag.x - drag.cx);\r\n bearing = Math.atan2(Math.sin(angle), Math.cos(angle)) * 180 / Math.PI;\r\n } else bearing *= event.clientY < drag.cy ? 1 : -1;\r\n }\r\n map._setPitchAndBearing(map.getPitch() - y * sensitivity[1], map.getBearing() + bearing);\r\n drag.x = event.clientX; drag.y = event.clientY;\r\n };\r\n const click = event => { if (moved) { event.preventDefault(); event.stopPropagation(); moved = false; } };\r\n const context = event => {\r\n if (drag || moved) { event.preventDefault(); event.stopPropagation(); }\r\n };\r\n element.addEventListener('pointerdown', down, true);\r\n element.addEventListener('pointermove', move);\r\n element.addEventListener('pointerup', end);\r\n element.addEventListener('pointercancel', end);\r\n element.addEventListener('lostpointercapture', end);\r\n element.addEventListener('click', click, true);\r\n element.addEventListener('contextmenu', context);\r\n window.addEventListener('blur', end);\r\n return () => {\r\n end();\r\n element.removeEventListener('pointerdown', down, true);\r\n element.removeEventListener('pointermove', move);\r\n element.removeEventListener('pointerup', end);\r\n element.removeEventListener('pointercancel', end);\r\n element.removeEventListener('lostpointercapture', end);\r\n element.removeEventListener('click', click, true);\r\n element.removeEventListener('contextmenu', context);\r\n window.removeEventListener('blur', end);\r\n };\r\n}\r\n\r\nL.Control.Rotate = L.Control.extend({\r\n options: { position: 'topleft', closeOnZeroBearing: true, visualizePitch: true },\r\n onAdd(map) {\r\n const container = L.DomUtil.create('div', 'leaflet-control-rotate leaflet-bar');\r\n const button = L.DomUtil.create('a', 'leaflet-control-rotate-toggle', container);\r\n button.href = '#';\r\n button.setAttribute('role', 'button');\r\n button.title = this.options.visualizePitch ? 'Reset bearing and pitch' : 'Reset bearing to north';\r\n button.setAttribute('aria-label', button.title);\r\n button.style.cssText = 'cursor:grab;touch-action:none';\r\n const arrow = L.DomUtil.create('span', 'leaflet-control-rotate-arrow', button);\r\n arrow.setAttribute('aria-hidden', 'true');\r\n arrow.style.cssText = 'display:block;width:100%;height:100%;pointer-events:none;background: no-repeat center / 29px 29px';\r\n arrow.style.backgroundImage = 'url(\"data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 29 29%27%3E%3Cpath fill=%27%23333%27 d=%27M10.5 14 14.5 6 18.5 14Z%27/%3E%3Cpath fill=%27%23ccc%27 d=%27M10.5 16 14.5 24 18.5 16Z%27/%3E%3C/svg%3E\")';\r\n button.onclick = event => {\r\n event.preventDefault();\r\n if (this.options.visualizePitch) map.resetNorthPitch();\r\n else map.resetNorth();\r\n if (event.detail) map.getContainer().focus({ preventScroll: true });\r\n };\r\n button.onkeydown = event => {\r\n const step = event.shiftKey ? 15 : 5;\r\n if (event.key === 'ArrowLeft') map.setBearing(map.getBearing() - step);\r\n else if (event.key === 'ArrowRight') map.setBearing(map.getBearing() + step);\r\n else if (event.key === 'ArrowUp' && this.options.visualizePitch) map.setPitch(map.getPitch() + step);\r\n else if (event.key === 'ArrowDown' && this.options.visualizePitch) map.setPitch(map.getPitch() - step);\r\n else if (event.key === 'Home' || event.key === ' ') button.click();\r\n else return;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n };\r\n this._refresh = () => {\r\n const pitch = this.options.visualizePitch ? map.getPitch() : 0;\r\n arrow.style.transform = `scale(${1 / Math.sqrt(Math.cos(pitch * Math.PI / 180))}) rotateX(${pitch}deg) rotate(${map.getBearing()}deg)`;\r\n button.setAttribute('aria-description', `Bearing ${Math.round(map.getBearing())} degrees, pitch ${Math.round(map.getPitch())} degrees. Arrow keys adjust the camera; Home resets it.`);\r\n // Do not hide a focused control, even when the caller opts into auto-hiding.\r\n container.style.display = this.options.closeOnZeroBearing && !map.getBearing() && !pitch &&\r\n !container.contains(document.activeElement) ? 'none' : '';\r\n };\r\n map.on('rotate pitch', this._refresh);\r\n this._refresh();\r\n this._endDrag = dragCamera(map, button, event => event.button === 0,\r\n [0.8, this.options.visualizePitch ? 0.5 : 0]);\r\n button.addEventListener('focusout', this._refresh);\r\n L.DomEvent.on(button, 'dblclick contextmenu', L.DomEvent.stop);\r\n L.DomEvent.disableClickPropagation(container);\r\n L.DomEvent.disableScrollPropagation(container);\r\n return container;\r\n },\r\n onRemove(map) {\r\n map.off('rotate pitch', this._refresh);\r\n this._endDrag();\r\n },\r\n});\r\nif (L.control) L.control.rotate = options => new L.Control.Rotate(options);\r\n\r\nconst ShiftRotate = L.Handler.extend({\r\n addHooks() {\r\n this._wheel = event => {\r\n if (!event.shiftKey || editable(event.target) || event.target.closest('.leaflet-control')) return;\r\n event.preventDefault(); event.stopImmediatePropagation();\r\n this._map.setBearing(this._map.getBearing() + Math.sign(event.deltaY) * 5);\r\n };\r\n this._map.getContainer().addEventListener('wheel', this._wheel, { passive: false, capture: true });\r\n },\r\n removeHooks() { this._map.getContainer().removeEventListener('wheel', this._wheel, true); },\r\n});\r\nconst PitchDrag = L.Handler.extend({\r\n addHooks() {\r\n this._end = dragCamera(this._map, this._map.getContainer(), event =>\r\n !event.target.closest('.leaflet-control,.leaflet-marker-icon,.leaflet-popup') &&\r\n (event.button === 2 || event.button === 0 && event.ctrlKey), [0.8, 0.5], true);\r\n },\r\n removeHooks() {\r\n this._end();\r\n },\r\n});\r\nconst Compass = L.Handler.extend({\r\n addHooks() {\r\n const generation = this._generation = (this._generation || 0) + 1;\r\n this._orientation = event => {\r\n const bearing = Number.isFinite(event.webkitCompassHeading) ? -event.webkitCompassHeading : event.alpha;\r\n const orientation = event.absolute ? 0 : (screen.orientation?.angle ?? window.orientation ?? 0);\r\n if (Number.isFinite(bearing)) this._map.setBearing(bearing - orientation);\r\n };\r\n const permission = window.DeviceOrientationEvent?.requestPermission;\r\n new Promise(resolve => resolve(permission ? permission.call(window.DeviceOrientationEvent) : 'granted')).then(result => {\r\n if (!this.enabled() || this._generation !== generation) return;\r\n if (!window.DeviceOrientationEvent || result !== 'granted') throw new Error('Device compass permission unavailable or denied');\r\n window.addEventListener('deviceorientation', this._orientation);\r\n window.addEventListener('deviceorientationabsolute', this._orientation);\r\n }).catch(error => {\r\n this.disable();\r\n this._map.fire('error', { error });\r\n });\r\n },\r\n removeHooks() {\r\n this._generation++;\r\n window.removeEventListener('deviceorientation', this._orientation);\r\n window.removeEventListener('deviceorientationabsolute', this._orientation);\r\n },\r\n});\r\n\r\nconst ContainerResize = L.Handler.extend({\r\n addHooks() {\r\n this._observer = new ResizeObserver(() => this._map.invalidateSize());\r\n this._observer.observe(this._map.getContainer());\r\n },\r\n removeHooks() { this._observer.disconnect(); },\r\n});\r\n\r\nexport function cameraControls(map) {\r\n map.addHandler('trackContainerMutation', ContainerResize);\r\n if (!map.options.rotate) return;\r\n map.addHandler('shiftKeyRotate', ShiftRotate);\r\n map.addHandler('pitchDrag', PitchDrag);\r\n map.addHandler('compassBearing', Compass);\r\n // Two optional touch modes share one pinch/pan recognizer with Leaflet's zoom setting.\r\n const TouchMode = L.Handler.extend({\r\n addHooks() { map.fire('cameratouchchange'); },\r\n removeHooks() { map.fire('cameratouchchange'); },\r\n });\r\n map.addHandler('touchRotate', TouchMode);\r\n map.addHandler('touchPitch', TouchMode);\r\n const container = map.getContainer();\r\n let touch, nativeZoom;\r\n const start = event => {\r\n if (event.touches.length !== 2 || event.target.closest('.leaflet-control')) return;\r\n if (!map.touchRotate.enabled() && !map.touchPitch.enabled()) return;\r\n const [a, b] = event.touches;\r\n if (Math.hypot(b.clientX - a.clientX, b.clientY - a.clientY) < 1) return;\r\n map._stopPitchBearingAnimation();\r\n const middle = new L.Point((a.clientX + b.clientX) / 2, (a.clientY + b.clientY) / 2)\r\n .subtract(new L.Point(container.getBoundingClientRect().left, container.getBoundingClientRect().top));\r\n touch = { angle: Math.atan2(b.clientY - a.clientY, b.clientX - a.clientX),\r\n distance: Math.hypot(b.clientX - a.clientX, b.clientY - a.clientY), middle,\r\n anchor: map.containerPointToLatLng(middle), zoom: map.getZoom(),\r\n bearing: map.getBearing(), pitch: map.getPitch(), zooming: map.touchZoom?.enabled(),\r\n dragging: map.dragging?.enabled() };\r\n map.dragging?.disable();\r\n event.preventDefault(); event.stopImmediatePropagation();\r\n };\r\n const move = event => {\r\n if (!touch || event.touches.length !== 2) return;\r\n const [a, b] = event.touches;\r\n const angle = Math.atan2(b.clientY - a.clientY, b.clientX - a.clientX);\r\n const middle = new L.Point((a.clientX + b.clientX) / 2, (a.clientY + b.clientY) / 2)\r\n .subtract(new L.Point(container.getBoundingClientRect().left, container.getBoundingClientRect().top));\r\n const delta = Math.atan2(Math.sin(angle - touch.angle), Math.cos(angle - touch.angle)) * 180 / Math.PI;\r\n map._setPitchAndBearing(map.touchPitch.enabled() ? touch.pitch - (middle.y - touch.middle.y) * 0.25 : touch.pitch,\r\n map.touchRotate.enabled() ? touch.bearing + delta : touch.bearing);\r\n const distance = Math.hypot(b.clientX - a.clientX, b.clientY - a.clientY);\r\n if (distance < 1) return;\r\n const zoom = touch.zooming ? Math.max(map.getMinZoom(), Math.min(map.getMaxZoom(),\r\n touch.zoom + Math.log2(distance / touch.distance))) : touch.zoom;\r\n map.setView(map.getCenter(), zoom, { animate: false });\r\n if (map.options.touchZoom !== 'center') {\r\n const projected = map.project(touch.anchor).subtract(map.project(map.containerPointToLatLng(middle)));\r\n map.setView(map.unproject(map.project(map.getCenter()).add(projected)), map.getZoom(), { animate: false });\r\n }\r\n event.preventDefault(); event.stopImmediatePropagation();\r\n };\r\n const end = event => {\r\n if (!touch) return;\r\n if (event?.touches?.length >= 2) return;\r\n if (touch.dragging && container._leaflet_id) map.dragging.enable();\r\n const snap = touch.snap;\r\n map.options.zoomSnap = snap;\r\n if (touch.zooming && snap && container._leaflet_id) {\r\n map.setZoom(Math.round(map.getZoom() / snap) * snap, { animate: false });\r\n }\r\n touch = null;\r\n };\r\n const change = () => {\r\n const active = map.touchRotate.enabled() || map.touchPitch.enabled();\r\n if (active && nativeZoom === undefined) {\r\n nativeZoom = map.touchZoom?.enabled();\r\n map.touchZoom?.disable();\r\n } else if (!active && nativeZoom !== undefined) {\r\n end();\r\n if (nativeZoom && container._leaflet_id) map.touchZoom.enable();\r\n nativeZoom = undefined;\r\n }\r\n };\r\n // Preserve the zoom-enabled setting before handing pinch recognition over.\r\n change();\r\n const startTouch = event => {\r\n if (touch) return;\r\n start(event);\r\n if (touch) {\r\n if (nativeZoom !== undefined) touch.zooming = nativeZoom;\r\n touch.snap = map.options.zoomSnap;\r\n map.options.zoomSnap = 0;\r\n }\r\n };\r\n container.addEventListener('touchstart', startTouch, { capture: true, passive: false });\r\n container.addEventListener('touchmove', move, { capture: true, passive: false });\r\n container.addEventListener('touchend', end, true);\r\n container.addEventListener('touchcancel', end, true);\r\n window.addEventListener('blur', end);\r\n map.on('cameratouchchange', change);\r\n if (map.options.rotateControl) {\r\n map.rotateControl = new L.Control.Rotate(typeof map.options.rotateControl === 'object' ? map.options.rotateControl : {});\r\n map.rotateControl.addTo(map);\r\n }\r\n map.once('unload', () => {\r\n end();\r\n container.removeEventListener('touchstart', startTouch, true);\r\n container.removeEventListener('touchmove', move, true);\r\n container.removeEventListener('touchend', end, true);\r\n container.removeEventListener('touchcancel', end, true);\r\n window.removeEventListener('blur', end);\r\n map.off('cameratouchchange', change);\r\n map.rotateControl?.remove();\r\n });\r\n}\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["editable", "target", "dragCamera", "map", "element", "accept", "sensitivity", "orbit", "drag", "moved", "end", "event", "finished", "down", "rect", "move", "x", "y", "bearing", "angle", "click", "context", "container", "button", "arrow", "step", "pitch", "options", "ShiftRotate", "PitchDrag", "Compass", "generation", "orientation", "permission", "resolve", "result", "error", "ContainerResize", "cameraControls", "TouchMode", "touch", "nativeZoom", "start", "a", "b", "middle", "delta", "distance", "zoom", "projected", "snap", "change", "active", "startTouch"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/channel.js"],
|
|
4
|
+
"sourcesContent": ["export const channel = (n, h, l, a) => {\n const k = (n + h * 12) % 12;\n return l - a * Math.max(-1, Math.min(k - 3, 9 - k, 1));\n};\n"],
|
|
5
|
+
"mappings": "AAAO,MAAMA,EAAU,CAACC,EAAGC,EAAGC,EAAGC,IAAM,CACrC,MAAMC,GAAKJ,EAAIC,EAAI,IAAM,GACzB,OAAOC,EAAIC,EAAI,KAAK,IAAI,GAAI,KAAK,IAAIC,EAAI,EAAG,EAAIA,EAAG,CAAC,CAAC,CACvD",
|
|
6
|
+
"names": ["channel", "n", "h", "l", "a", "k"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{CELL as M}from"./CELL.js";import{colliders as E}from"./colliders.js";function H(h){let c=E.get(h.geometry);if(c)return c;const o=h.worldMatrix,{position:{data:s},index:e,normal:y,uv:x}=h.geometry.attributes,q=e?e.count:s.length/3,d=[],g=[],m=new Map,t=[];for(let i=0;i<q;i+=3){const z=e?e.data[i]:i;if(h.program.nightLight&&x&&x.data[z*2]<=2)continue;for(let r=0;r<3;r++){const a=(e?e.data[i+r]:i+r)*3,n=s[a],p=s[a+1],u=s[a+2];t[r*3]=o[0]*n+o[4]*p+o[8]*u+o[12],t[r*3+1]=o[1]*n+o[5]*p+o[9]*u+o[13],t[r*3+2]=o[2]*n+o[6]*p+o[10]*u+o[14]}const L=t[3]-t[0],b=t[4]-t[1],j=t[5]-t[2],k=t[6]-t[0],v=t[7]-t[1],w=t[8]-t[2];let f=b*w-j*v,l=L*v-b*k;const A=j*k-L*w,F=Math.hypot(f,A,l);if(!F||Math.abs(A)>.9*F)continue;if(y){const r=z*3,a=y.data;(o[0]*a[r]+o[4]*a[r+1]+o[8]*a[r+2])*f+(o[2]*a[r]+o[6]*a[r+1]+o[10]*a[r+2])*l<0&&(f=-f,l=-l)}const C=Math.hypot(f,l),B=g.length/2;d.push(...t),g.push(f/C,l/C);for(let r=Math.floor(Math.min(t[0],t[3],t[6])/M);r<=Math.floor(Math.max(t[0],t[3],t[6])/M);r++)for(let a=Math.floor(Math.min(t[2],t[5],t[8])/M);a<=Math.floor(Math.max(t[2],t[5],t[8])/M);a++){const n=r+","+a;m.has(n)||m.set(n,[]),m.get(n).push(B)}}return c={tri:Float32Array.from(d),nrm:Float32Array.from(g),cells:m,origin:[o[12],o[13],o[14]]},E.set(h.geometry,c),c}export{H as collider};
|
|
2
|
+
//# sourceMappingURL=collider.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/collider.js"],
|
|
4
|
+
"sourcesContent": ["import { CELL } from './CELL.js';\nimport { colliders } from './colliders.js';\n\n\nexport function collider(mesh) {\n let c = colliders.get(mesh.geometry);\n if (c) return c;\n const m = mesh.worldMatrix, { position: { data: p }, index, normal, uv } = mesh.geometry.attributes;\n\n const count = index ? index.count : p.length / 3, tri = [], nrm = [], cells = new Map(), v = [];\n\n for (let i = 0; i < count; i += 3) {\n const first = index ? index.data[i] : i;\n // Streetlight halos (uv.x <= 2, see scene/picking.js) are light, not matter.\n if (mesh.program.nightLight && uv && uv.data[first * 2] <= 2) {\n continue;\n }\n for (let k = 0; k < 3; k++) {\n const j = (index ? index.data[i + k] : i + k) * 3, x = p[j], y = p[j + 1], z = p[j + 2];\n v[k * 3] = m[0] * x + m[4] * y + m[8] * z + m[12];\n v[k * 3 + 1] = m[1] * x + m[5] * y + m[9] * z + m[13];\n v[k * 3 + 2] = m[2] * x + m[6] * y + m[10] * z + m[14];\n }\n const ex = v[3] - v[0], ey = v[4] - v[1], ez = v[5] - v[2], fx = v[6] - v[0], fy = v[7] - v[1], fz = v[8] - v[2];\n\n let nx = ey * fz - ez * fy, nz = ex * fy - ey * fx;\n\n const ny = ez * fx - ex * fz, length = Math.hypot(nx, ny, nz);\n\n if (!length || Math.abs(ny) > 0.9 * length) {\n continue;\n }\n\n if (normal) {\n // The stored normal tells the outside, whatever the winding.\n const j = first * 3, a = normal.data;\n if ((m[0] * a[j] + m[4] * a[j + 1] + m[8] * a[j + 2]) * nx + (m[2] * a[j] + m[6] * a[j + 1] + m[10] * a[j + 2]) * nz < 0) { nx = -nx; nz = -nz; }\n }\n\n const h = Math.hypot(nx, nz), t = nrm.length / 2;\n\n tri.push(...v);\n nrm.push(nx / h, nz / h);\n\n for (let ix = Math.floor(Math.min(v[0], v[3], v[6]) / CELL); ix <= Math.floor(Math.max(v[0], v[3], v[6]) / CELL); ix++)\n for (let iz = Math.floor(Math.min(v[2], v[5], v[8]) / CELL); iz <= Math.floor(Math.max(v[2], v[5], v[8]) / CELL); iz++) {\n const key = ix + ',' + iz;\n if (!cells.has(key)) {\n cells.set(key, []);\n }\n cells.get(key).push(t);\n }\n }\n c = {\n tri: Float32Array.from(tri),\n nrm: Float32Array.from(nrm),\n cells,\n origin: [m[12], m[13], m[14]]\n };\n colliders.set(mesh.geometry, c);\n return c;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["CELL", "colliders", "collider", "mesh", "m", "p", "index", "normal", "uv", "count", "tri", "nrm", "cells", "v", "first", "k", "j", "x", "y", "z", "ex", "ey", "ez", "fx", "fy", "fz", "nx", "nz", "ny", "length", "h", "t", "ix", "iz", "key"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function s(e){const i=[1/0,1/0,1/0],a=[-1/0,-1/0,-1/0],n=e.attributes.position.data;for(let t=0;t<n.length;t++)i[t%3]=Math.min(i[t%3],n[t]),a[t%3]=Math.max(a[t%3],n[t]);const o=i.map((t,h)=>(t+a[h])/2);let f=0;for(let t=0;t<n.length;t+=3)f=Math.max(f,Math.hypot(n[t]-o[0],n[t+1]-o[1],n[t+2]-o[2]));e.bounds={min:i,max:a,center:o,radius:f}}export{s as computeBounds};
|
|
2
|
+
//# sourceMappingURL=computeBounds.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/computeBounds.js"],
|
|
4
|
+
"sourcesContent": ["/** Cache local AABB and center for ray picking and transparent mesh sorting. */\n\nexport function computeBounds(geometry) {\n const min = [Infinity, Infinity, Infinity], max = [-Infinity, -Infinity, -Infinity], data = geometry.attributes.position.data;\n for (let i = 0; i < data.length; i++) {\n min[i % 3] = Math.min(min[i % 3], data[i]);\n max[i % 3] = Math.max(max[i % 3], data[i]);\n }\n const center = min.map((v, i) => (v + max[i]) / 2);\n let radius = 0;\n for (let i = 0; i < data.length; i += 3) {\n radius = Math.max(radius, Math.hypot(\n data[i] - center[0], data[i + 1] - center[1], data[i + 2] - center[2]\n ));\n }\n geometry.bounds = { min, max, center, radius };\n}\n"],
|
|
5
|
+
"mappings": "AAEO,SAASA,EAAcC,EAAU,CACtC,MAAMC,EAAM,CAAC,IAAU,IAAU,GAAQ,EAAGC,EAAM,CAAC,KAAW,KAAW,IAAS,EAAGC,EAAOH,EAAS,WAAW,SAAS,KACzH,QAASI,EAAI,EAAGA,EAAID,EAAK,OAAQC,IAC/BH,EAAIG,EAAI,CAAC,EAAI,KAAK,IAAIH,EAAIG,EAAI,CAAC,EAAGD,EAAKC,CAAC,CAAC,EACzCF,EAAIE,EAAI,CAAC,EAAI,KAAK,IAAIF,EAAIE,EAAI,CAAC,EAAGD,EAAKC,CAAC,CAAC,EAE3C,MAAMC,EAASJ,EAAI,IAAI,CAACK,EAAGF,KAAOE,EAAIJ,EAAIE,CAAC,GAAK,CAAC,EACjD,IAAIG,EAAS,EACb,QAASH,EAAI,EAAGA,EAAID,EAAK,OAAQC,GAAK,EACpCG,EAAS,KAAK,IAAIA,EAAQ,KAAK,MAC7BJ,EAAKC,CAAC,EAAIC,EAAO,CAAC,EAAGF,EAAKC,EAAI,CAAC,EAAIC,EAAO,CAAC,EAAGF,EAAKC,EAAI,CAAC,EAAIC,EAAO,CAAC,CACtE,CAAC,EAEHL,EAAS,OAAS,CAAE,IAAAC,EAAK,IAAAC,EAAK,OAAAG,EAAQ,OAAAE,CAAO,CAC/C",
|
|
6
|
+
"names": ["computeBounds", "geometry", "min", "max", "data", "i", "center", "v", "radius"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{computeBounds as x}from"./computeBounds.js";import{getElevation as O}from"./getElevation.js";import{update as T}from"./update.js";import{updateWorldMatrix as y}from"./updateWorldMatrix.js";import{vertexNormals as E}from"./vertexNormals.js";const F=8;function A(i,n){if(!i.model)return;const c=[],h=e=>{e.geometry?.attributes.position&&c.push(e);for(const r of e.children)h(r)};if(h(i.model),!n?._terrainReady||!i.options.terrainConform){for(const e of c){const r=e.geometry._terrainBasePositions;if(!r)continue;const t=e.geometry,a=t.attributes.position;a.data.set(r),e.device.queue.writeBuffer(a.buffer,0,r);const o=t._terrainBaseNormals;o&&(t.attributes.normal.data.set(o),e.device.queue.writeBuffer(t.attributes.normal.buffer,0,o)),x(t)}return}y(i.root);const B=i._map,f=B.options.crs,b=f.project(i._shared._sceneOrigin),g=Math.cos(i._shared._sceneOrigin.lat*Math.PI/180),M=f.scale(n._terrainZoom);for(const e of c){const r=e.geometry,t=r.attributes.position;r._terrainBasePositions||=t.data.slice();const a=r.attributes.normal;r._terrainBaseNormals||=a.data.slice(),t.data.set(r._terrainBasePositions);const o=e.worldMatrix,m=new DOMMatrix(o).inverse().toFloat64Array();for(let s=0;s<t.data.length;s+=3){const d=t.data[s],u=t.data[s+1],p=t.data[s+2],w=o[1]*d+o[5]*u+o[9]*p+o[13],_=Math.max(0,Math.min(1,1-(w-i.root.position[1])/F));if(!_)continue;const P=o[0]*d+o[4]*u+o[8]*p+o[12],q=o[2]*d+o[6]*u+o[10]*p+o[14],N=f.transformation.transform(new L.Point(b.x+P/g,b.y-q/g),M),v=O(n,N);if(!Number.isFinite(v))continue;const l=(v-w)*_;t.data[s]+=m[4]*l,t.data[s+1]+=m[5]*l,t.data[s+2]+=m[6]*l}e.device.queue.writeBuffer(t.buffer,0,t.data),a.data.set(E(t.data,r.attributes.index?.data)),e.device.queue.writeBuffer(a.buffer,0,a.data),x(r)}T(i)}export{A as conformModelToTerrain};
|
|
2
|
+
//# sourceMappingURL=conformModelToTerrain.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/conformModelToTerrain.js"],
|
|
4
|
+
"sourcesContent": ["import { computeBounds } from './computeBounds.js';\r\nimport { getElevation } from './getElevation.js';\r\nimport { update } from './update.js';\r\nimport { updateWorldMatrix } from './updateWorldMatrix.js';\r\nimport { vertexNormals } from './vertexNormals.js';\r\n\r\nconst HEIGHT = 8;\r\n\r\nexport function conformModelToTerrain(layer, terrain) {\r\n if (!layer.model) return;\r\n const meshes = [];\r\n const visit = node => {\r\n if (node.geometry?.attributes.position) meshes.push(node);\r\n for (const child of node.children) visit(child);\r\n };\r\n visit(layer.model);\r\n if (!terrain?._terrainReady || !layer.options.terrainConform) {\r\n for (const mesh of meshes) {\r\n const positions = mesh.geometry._terrainBasePositions;\r\n if (!positions) continue;\r\n const geometry = mesh.geometry, position = geometry.attributes.position;\r\n position.data.set(positions);\r\n mesh.device.queue.writeBuffer(position.buffer, 0, positions);\r\n const normals = geometry._terrainBaseNormals;\r\n if (normals) {\r\n geometry.attributes.normal.data.set(normals);\r\n mesh.device.queue.writeBuffer(geometry.attributes.normal.buffer, 0, normals);\r\n }\r\n computeBounds(geometry);\r\n }\r\n return;\r\n }\r\n\r\n updateWorldMatrix(layer.root);\r\n const map = layer._map, crs = map.options.crs;\r\n const origin = crs.project(layer._shared._sceneOrigin);\r\n const metres = Math.cos(layer._shared._sceneOrigin.lat * Math.PI / 180);\r\n const pixelScale = crs.scale(terrain._terrainZoom);\r\n\r\n for (const mesh of meshes) {\r\n const geometry = mesh.geometry, attribute = geometry.attributes.position;\r\n geometry._terrainBasePositions ||= attribute.data.slice();\r\n const normal = geometry.attributes.normal;\r\n geometry._terrainBaseNormals ||= normal.data.slice();\r\n attribute.data.set(geometry._terrainBasePositions);\r\n const world = mesh.worldMatrix, inverse = new DOMMatrix(world).inverse().toFloat64Array();\r\n for (let i = 0; i < attribute.data.length; i += 3) {\r\n const x = attribute.data[i], y = attribute.data[i + 1], z = attribute.data[i + 2];\r\n const worldY = world[1] * x + world[5] * y + world[9] * z + world[13];\r\n const weight = Math.max(0, Math.min(1, 1 - (worldY - layer.root.position[1]) / HEIGHT));\r\n if (!weight) continue;\r\n const worldX = world[0] * x + world[4] * y + world[8] * z + world[12];\r\n const worldZ = world[2] * x + world[6] * y + world[10] * z + world[14];\r\n const point = crs.transformation.transform(new L.Point(\r\n origin.x + worldX / metres, origin.y - worldZ / metres), pixelScale);\r\n const elevation = getElevation(terrain, point);\r\n if (!Number.isFinite(elevation)) continue;\r\n const offset = (elevation - worldY) * weight;\r\n attribute.data[i] += inverse[4] * offset;\r\n attribute.data[i + 1] += inverse[5] * offset;\r\n attribute.data[i + 2] += inverse[6] * offset;\r\n }\r\n mesh.device.queue.writeBuffer(attribute.buffer, 0, attribute.data);\r\n normal.data.set(vertexNormals(attribute.data, geometry.attributes.index?.data));\r\n mesh.device.queue.writeBuffer(normal.buffer, 0, normal.data);\r\n computeBounds(geometry);\r\n }\r\n update(layer);\r\n}\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["computeBounds", "getElevation", "update", "updateWorldMatrix", "vertexNormals", "HEIGHT", "conformModelToTerrain", "layer", "terrain", "meshes", "visit", "node", "child", "mesh", "positions", "geometry", "position", "normals", "map", "crs", "origin", "metres", "pixelScale", "attribute", "normal", "world", "inverse", "i", "x", "y", "z", "worldY", "weight", "worldX", "worldZ", "point", "elevation", "offset"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{emptyNode as g}from"./emptyNode.js";import{createProgram as p}from"./createProgram.js";import{setParent as y}from"./setParent.js";import{update as h}from"./update.js";function B(e,f,i={},m=0,c){const{device:r}=e.renderer,o={};for(const[s,d]of Object.entries(f)){const t=new Float32Array(d),n=s==="uv"?2:3,u=r.createBuffer({size:Math.max(4,t.byteLength),usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST|m});r.queue.writeBuffer(u,0,t),o[s]={size:n,data:t,count:t.length/n,buffer:u}}const a={...g(),device:r,geometry:{device:r,attributes:o,drawRange:{start:0,count:o.position.count}},program:c||p(e,{vertexColors:!0,doubleSided:!0,...i}),id:L.Layer._nextId++,renderOrder:0,extras:{}};return y(a,e.root),h(e),a}export{B as createMesh};
|
|
2
|
+
//# sourceMappingURL=createMesh.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/createMesh.js"],
|
|
4
|
+
"sourcesContent": ["import { emptyNode } from './emptyNode.js';\nimport { createProgram } from './createProgram.js';\nimport { setParent } from './setParent.js';\nimport { update } from './update.js';\n\n/**\n * Add a non-indexed, vertex-coloured mesh from flat vec3 arrays `{ position, normal, color }` in layer-local metres.\n * `usage` adds GPUBufferUsage flags to the vertex buffers (e.g. STORAGE for compute passes).\n * A supplied `program` shares compiled shaders and pipelines across compatible meshes.\n */\n\nexport function createMesh(backend, data, material = {}, usage = 0, program) {\n const { device } = backend.renderer, attributes = {};\n for (const [name, values] of Object.entries(data)) {\n const array = new Float32Array(values);\n const size = name === 'uv' ? 2 : 3;\n const buffer = device.createBuffer({ size: Math.max(4, array.byteLength), usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST | usage });\n device.queue.writeBuffer(buffer, 0, array);\n attributes[name] = { size, data: array, count: array.length / size, buffer };\n }\n const mesh = {\n ...emptyNode(),\n device,\n geometry: { device, attributes, drawRange: { start: 0, count: attributes.position.count } },\n program: program || createProgram(backend, { vertexColors: true, doubleSided: true, ...material }),\n id: L.Layer._nextId++, renderOrder: 0, extras: {},\n };\n setParent(mesh, backend.root);\n update(backend);\n return mesh;\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,aAAAA,MAAiB,iBAC1B,OAAS,iBAAAC,MAAqB,qBAC9B,OAAS,aAAAC,MAAiB,iBAC1B,OAAS,UAAAC,MAAc,cAQhB,SAASC,EAAWC,EAASC,EAAMC,EAAW,CAAC,EAAGC,EAAQ,EAAGC,EAAS,CAC3E,KAAM,CAAE,OAAAC,CAAO,EAAIL,EAAQ,SAAUM,EAAa,CAAC,EACnD,SAAW,CAACC,EAAMC,CAAM,IAAK,OAAO,QAAQP,CAAI,EAAG,CACjD,MAAMQ,EAAQ,IAAI,aAAaD,CAAM,EAC/BE,EAAOH,IAAS,KAAO,EAAI,EAC3BI,EAASN,EAAO,aAAa,CAAE,KAAM,KAAK,IAAI,EAAGI,EAAM,UAAU,EAAG,MAAO,eAAe,OAAS,eAAe,SAAWN,CAAM,CAAC,EAC1IE,EAAO,MAAM,YAAYM,EAAQ,EAAGF,CAAK,EACzCH,EAAWC,CAAI,EAAI,CAAE,KAAAG,EAAM,KAAMD,EAAO,MAAOA,EAAM,OAASC,EAAM,OAAAC,CAAO,CAC7E,CACA,MAAMC,EAAO,CACX,GAAGjB,EAAU,EACb,OAAAU,EACA,SAAU,CAAE,OAAAA,EAAQ,WAAAC,EAAY,UAAW,CAAE,MAAO,EAAG,MAAOA,EAAW,SAAS,KAAM,CAAE,EAC1F,QAASF,GAAWR,EAAcI,EAAS,CAAE,aAAc,GAAM,YAAa,GAAM,GAAGE,CAAS,CAAC,EACjG,GAAI,EAAE,MAAM,UAAW,YAAa,EAAG,OAAQ,CAAC,CAClD,EACA,OAAAL,EAAUe,EAAMZ,EAAQ,IAAI,EAC5BF,EAAOE,CAAO,EACPY,CACT",
|
|
6
|
+
"names": ["emptyNode", "createProgram", "setParent", "update", "createMesh", "backend", "data", "material", "usage", "program", "device", "attributes", "name", "values", "array", "size", "buffer", "mesh"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{materialShaders as p}from"./materialShaders.js";import{elevationWGSL as h}from"./elevationWGSL.js";function v(r,e={}){const t=p(e,!!r.options.nightSparkle,e.terrain?h:""),s=r.renderer.device.createShaderModule({code:t.vertex}),u=r.renderer.device.createShaderModule({code:t.fragment});Promise.all([s.getCompilationInfo(),u.getCompilationInfo()]).then(o=>{const l=o.flatMap(i=>i.messages).filter(i=>i.type==="error");l.length&&r.fire("error",{error:new Error(`Unable to compile Layer3D WGSL: ${l.map(i=>i.message).join(`
|
|
2
|
+
`)}`)})}).catch(o=>r.fire("error",{error:o}));const f=[{arrayStride:12,attributes:[{shaderLocation:0,offset:0,format:"float32x3"}]},{arrayStride:12,attributes:[{shaderLocation:1,offset:0,format:"float32x3"}]},e.vertexColors?{arrayStride:12,attributes:[{shaderLocation:2,offset:0,format:"float32x3"}]}:null,t.textured?{arrayStride:8,attributes:[{shaderLocation:3,offset:0,format:"float32x2"}]}:null],n=[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform",hasDynamicOffset:!0}},{binding:1,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}];t.hasTerrain&&n.push({binding:2,visibility:GPUShaderStage.VERTEX,texture:{sampleType:"unfilterable-float",viewDimension:"2d"}});for(const o of t.bindings)n.push({binding:o.texture,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float",viewDimension:"2d"}}),n.push({binding:o.sampler,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}});const a=r.renderer.device.createBindGroupLayout({entries:n}),d=r.renderer.device.createPipelineLayout({bindGroupLayouts:[a,r.renderer.sunlight.layout]});return{device:r.renderer.device,vertex:s,fragment:u,bindings:t.bindings,vertexBuffers:f,bindGroupLayout:a,pipelineLayout:d,pipelineCache:new Map,cullMode:e.doubleSided?"none":"back",transparent:e.alphaMode==="BLEND",depthWrite:e.depthWrite??e.alphaMode!=="BLEND",depthTest:e.depthTest!==!1,terrain:e.terrain,nightLight:!!e.nightLight,nightSparkle:!!r.options.nightSparkle,uniforms:{baseColor:{value:e.color||[1,1,1]},metallic:{value:e.metallic??0},roughness:{value:e.roughness??.85},opacity:{value:e.opacity??1},alphaCutoff:{value:e.alphaCutoff??.5},occlusionStrength:{value:e.occlusionStrength??1},emissive:{value:e.emissive||[0,0,0]},...e.baseTexture?{baseTexture:{value:e.baseTexture}}:{},...e.metalTexture?{metalTexture:{value:e.metalTexture}}:{},...e.emissiveTexture?{emissiveTexture:{value:e.emissiveTexture}}:{},...e.occlusionTexture?{occlusionTexture:{value:e.occlusionTexture}}:{},...e.roofTexture?{roofTexture:{value:null}}:{}},_layerMaterial:e}}export{v as createProgram};
|
|
3
|
+
//# sourceMappingURL=createProgram.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/createProgram.js"],
|
|
4
|
+
"sourcesContent": ["import { materialShaders } from './materialShaders.js';\nimport { elevationWGSL } from './elevationWGSL.js';\n\n\nexport function createProgram(backend, material = {}) {\n const shaders = materialShaders(\n material,\n !!backend.options.nightSparkle,\n material.terrain ? elevationWGSL : ''\n );\n const vertex = backend.renderer.device.createShaderModule({ code: shaders.vertex });\n const fragment = backend.renderer.device.createShaderModule({ code: shaders.fragment });\n Promise.all([\n vertex.getCompilationInfo(),\n fragment.getCompilationInfo()\n ]).then(infos => {\n const errors = infos.flatMap(info => info.messages).filter(message => message.type === 'error');\n if (errors.length) {\n backend.fire('error', {\n error: new Error(`Unable to compile Layer3D WGSL: ${errors.map(error => error.message).join('\\n')}`),\n });\n }\n }).catch(error => backend.fire('error', { error }));\n const vertexBuffers = [\n { arrayStride: 12, attributes: [{ shaderLocation: 0, offset: 0, format: 'float32x3' }] },\n { arrayStride: 12, attributes: [{ shaderLocation: 1, offset: 0, format: 'float32x3' }] },\n material.vertexColors ? { arrayStride: 12, attributes: [{ shaderLocation: 2, offset: 0, format: 'float32x3' }] } : null,\n shaders.textured ? { arrayStride: 8, attributes: [{ shaderLocation: 3, offset: 0, format: 'float32x2' }] } : null,\n ];\n const bindGroupEntries = [{\n binding: 0,\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n buffer: { type: 'uniform', hasDynamicOffset: true },\n }, {\n binding: 1,\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n buffer: { type: 'uniform' },\n }];\n if (shaders.hasTerrain) {\n bindGroupEntries.push({\n binding: 2,\n visibility: GPUShaderStage.VERTEX,\n texture: { sampleType: 'unfilterable-float', viewDimension: '2d' },\n });\n }\n for (const texture of shaders.bindings) {\n bindGroupEntries.push({\n binding: texture.texture,\n visibility: GPUShaderStage.FRAGMENT,\n texture: { sampleType: 'float', viewDimension: '2d' },\n });\n bindGroupEntries.push({\n binding: texture.sampler,\n visibility: GPUShaderStage.FRAGMENT,\n sampler: { type: 'filtering' },\n });\n }\n const bindGroupLayout = backend.renderer.device.createBindGroupLayout({ entries: bindGroupEntries });\n const pipelineLayout = backend.renderer.device.createPipelineLayout({ bindGroupLayouts: [bindGroupLayout, backend.renderer.sunlight.layout] });\n return {\n device: backend.renderer.device,\n vertex,\n fragment,\n bindings: shaders.bindings,\n vertexBuffers,\n bindGroupLayout,\n pipelineLayout,\n pipelineCache: new Map(),\n cullMode: material.doubleSided ? 'none' : 'back',\n transparent: material.alphaMode === 'BLEND',\n depthWrite: material.depthWrite ?? material.alphaMode !== 'BLEND',\n depthTest: material.depthTest !== false,\n terrain: material.terrain,\n nightLight: Boolean(material.nightLight),\n nightSparkle: !!backend.options.nightSparkle,\n uniforms: {\n baseColor: { value: material.color || [1, 1, 1] },\n metallic: { value: material.metallic ?? 0 },\n roughness: { value: material.roughness ?? 0.85 },\n opacity: { value: material.opacity ?? 1 },\n alphaCutoff: { value: material.alphaCutoff ?? 0.5 },\n occlusionStrength: { value: material.occlusionStrength ?? 1 },\n emissive: { value: material.emissive || [0, 0, 0] },\n ...(material.baseTexture ? { baseTexture: { value: material.baseTexture } } : {}),\n ...(material.metalTexture ? { metalTexture: { value: material.metalTexture } } : {}),\n ...(material.emissiveTexture ? { emissiveTexture: { value: material.emissiveTexture } } : {}),\n ...(material.occlusionTexture ? { occlusionTexture: { value: material.occlusionTexture } } : {}),\n ...(material.roofTexture ? { roofTexture: { value: null } } : {}),\n },\n _layerMaterial: material,\n };\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,mBAAAA,MAAuB,uBAChC,OAAS,iBAAAC,MAAqB,qBAGvB,SAASC,EAAcC,EAASC,EAAW,CAAC,EAAG,CACpD,MAAMC,EAAUL,EACdI,EACA,CAAC,CAACD,EAAQ,QAAQ,aAClBC,EAAS,QAAUH,EAAgB,EACrC,EACMK,EAASH,EAAQ,SAAS,OAAO,mBAAmB,CAAE,KAAME,EAAQ,MAAO,CAAC,EAC5EE,EAAWJ,EAAQ,SAAS,OAAO,mBAAmB,CAAE,KAAME,EAAQ,QAAS,CAAC,EACtF,QAAQ,IAAI,CACVC,EAAO,mBAAmB,EAC1BC,EAAS,mBAAmB,CAC9B,CAAC,EAAE,KAAKC,GAAS,CACf,MAAMC,EAASD,EAAM,QAAQE,GAAQA,EAAK,QAAQ,EAAE,OAAOC,GAAWA,EAAQ,OAAS,OAAO,EAC1FF,EAAO,QACTN,EAAQ,KAAK,QAAS,CACpB,MAAO,IAAI,MAAM,mCAAmCM,EAAO,IAAIG,GAASA,EAAM,OAAO,EAAE,KAAK;AAAA,CAAI,CAAC,EAAE,CACrG,CAAC,CAEL,CAAC,EAAE,MAAMA,GAAST,EAAQ,KAAK,QAAS,CAAE,MAAAS,CAAM,CAAC,CAAC,EAClD,MAAMC,EAAgB,CACpB,CAAE,YAAa,GAAI,WAAY,CAAC,CAAE,eAAgB,EAAG,OAAQ,EAAG,OAAQ,WAAY,CAAC,CAAE,EACvF,CAAE,YAAa,GAAI,WAAY,CAAC,CAAE,eAAgB,EAAG,OAAQ,EAAG,OAAQ,WAAY,CAAC,CAAE,EACvFT,EAAS,aAAe,CAAE,YAAa,GAAI,WAAY,CAAC,CAAE,eAAgB,EAAG,OAAQ,EAAG,OAAQ,WAAY,CAAC,CAAE,EAAI,KACnHC,EAAQ,SAAW,CAAE,YAAa,EAAG,WAAY,CAAC,CAAE,eAAgB,EAAG,OAAQ,EAAG,OAAQ,WAAY,CAAC,CAAE,EAAI,IAC/G,EACMS,EAAmB,CAAC,CACxB,QAAS,EACT,WAAY,eAAe,OAAS,eAAe,SACnD,OAAQ,CAAE,KAAM,UAAW,iBAAkB,EAAK,CACpD,EAAG,CACD,QAAS,EACT,WAAY,eAAe,OAAS,eAAe,SACnD,OAAQ,CAAE,KAAM,SAAU,CAC5B,CAAC,EACGT,EAAQ,YACVS,EAAiB,KAAK,CACpB,QAAS,EACT,WAAY,eAAe,OAC3B,QAAS,CAAE,WAAY,qBAAsB,cAAe,IAAK,CACnE,CAAC,EAEH,UAAWC,KAAWV,EAAQ,SAC5BS,EAAiB,KAAK,CACpB,QAASC,EAAQ,QACjB,WAAY,eAAe,SAC3B,QAAS,CAAE,WAAY,QAAS,cAAe,IAAK,CACtD,CAAC,EACDD,EAAiB,KAAK,CACpB,QAASC,EAAQ,QACjB,WAAY,eAAe,SAC3B,QAAS,CAAE,KAAM,WAAY,CAC/B,CAAC,EAEH,MAAMC,EAAkBb,EAAQ,SAAS,OAAO,sBAAsB,CAAE,QAASW,CAAiB,CAAC,EAC7FG,EAAiBd,EAAQ,SAAS,OAAO,qBAAqB,CAAE,iBAAkB,CAACa,EAAiBb,EAAQ,SAAS,SAAS,MAAM,CAAE,CAAC,EAC7I,MAAO,CACL,OAAQA,EAAQ,SAAS,OACzB,OAAAG,EACA,SAAAC,EACA,SAAUF,EAAQ,SAClB,cAAAQ,EACA,gBAAAG,EACA,eAAAC,EACA,cAAe,IAAI,IACnB,SAAUb,EAAS,YAAc,OAAS,OAC1C,YAAaA,EAAS,YAAc,QACpC,WAAYA,EAAS,YAAcA,EAAS,YAAc,QAC1D,UAAWA,EAAS,YAAc,GAClC,QAASA,EAAS,QAClB,WAAY,EAAQA,EAAS,WAC7B,aAAc,CAAC,CAACD,EAAQ,QAAQ,aAChC,SAAU,CACR,UAAW,CAAE,MAAOC,EAAS,OAAS,CAAC,EAAG,EAAG,CAAC,CAAE,EAChD,SAAU,CAAE,MAAOA,EAAS,UAAY,CAAE,EAC1C,UAAW,CAAE,MAAOA,EAAS,WAAa,GAAK,EAC/C,QAAS,CAAE,MAAOA,EAAS,SAAW,CAAE,EACxC,YAAa,CAAE,MAAOA,EAAS,aAAe,EAAI,EAClD,kBAAmB,CAAE,MAAOA,EAAS,mBAAqB,CAAE,EAC5D,SAAU,CAAE,MAAOA,EAAS,UAAY,CAAC,EAAG,EAAG,CAAC,CAAE,EAClD,GAAIA,EAAS,YAAc,CAAE,YAAa,CAAE,MAAOA,EAAS,WAAY,CAAE,EAAI,CAAC,EAC/E,GAAIA,EAAS,aAAe,CAAE,aAAc,CAAE,MAAOA,EAAS,YAAa,CAAE,EAAI,CAAC,EAClF,GAAIA,EAAS,gBAAkB,CAAE,gBAAiB,CAAE,MAAOA,EAAS,eAAgB,CAAE,EAAI,CAAC,EAC3F,GAAIA,EAAS,iBAAmB,CAAE,iBAAkB,CAAE,MAAOA,EAAS,gBAAiB,CAAE,EAAI,CAAC,EAC9F,GAAIA,EAAS,YAAc,CAAE,YAAa,CAAE,MAAO,IAAK,CAAE,EAAI,CAAC,CACjE,EACA,eAAgBA,CAClB,CACF",
|
|
6
|
+
"names": ["materialShaders", "elevationWGSL", "createProgram", "backend", "material", "shaders", "vertex", "fragment", "infos", "errors", "info", "message", "error", "vertexBuffers", "bindGroupEntries", "texture", "bindGroupLayout", "pipelineLayout"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function d(f){const i=new Uint8Array(f);let l=0;const n=()=>{let r=0;for(let t=1;t<=2**49;t*=128){if(l>=i.length)throw new Error("Truncated PMTiles directory");const o=i[l++];if(r+=(o&127)*t,!Number.isSafeInteger(r))throw new Error("Invalid PMTiles directory integer");if(o<128)return r}throw new Error("Invalid PMTiles directory integer")},c=n();if(c>(i.length-l)/4)throw new Error("Invalid PMTiles directory count");const e=[];let s=0;for(let r=0;r<c;r++){if(s+=n(),!Number.isSafeInteger(s)||r&&s<=e[r-1].tileId)throw new Error("Invalid PMTiles directory tile IDs");e.push({tileId:s})}for(const r of e)r.runLength=n();for(const r of e)if(r.length=n(),!r.length)throw new Error("Invalid PMTiles directory length");if(e.forEach((r,t)=>{const o=n();if(!o&&!t)throw new Error("Invalid PMTiles directory offset");r.offset=o?o-1:e[t-1].offset+e[t-1].length}),l!==i.length)throw new Error("Trailing PMTiles directory data");return e}export{d as decodeDirectory};
|
|
2
|
+
//# sourceMappingURL=decodeDirectory.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/decodeDirectory.js"],
|
|
4
|
+
"sourcesContent": ["/** Decode delta/varint directory columns, rejecting malformed entries. */\n\nexport function decodeDirectory(data) {\n const bytes = new Uint8Array(data);\n let cursor = 0;\n const varint = () => {\n let value = 0;\n for (let factor = 1; factor <= 2 ** 49; factor *= 128) {\n if (cursor >= bytes.length) throw new Error('Truncated PMTiles directory');\n const byte = bytes[cursor++];\n value += (byte & 127) * factor;\n if (!Number.isSafeInteger(value)) throw new Error('Invalid PMTiles directory integer');\n if (byte < 128) return value;\n }\n throw new Error('Invalid PMTiles directory integer');\n };\n const count = varint();\n if (count > (bytes.length - cursor) / 4) throw new Error('Invalid PMTiles directory count');\n const entries = [];\n let tileId = 0;\n for (let i = 0; i < count; i++) {\n tileId += varint();\n if (!Number.isSafeInteger(tileId) || (i && tileId <= entries[i - 1].tileId)) {\n throw new Error('Invalid PMTiles directory tile IDs');\n }\n entries.push({ tileId });\n }\n for (const entry of entries) entry.runLength = varint();\n for (const entry of entries) {\n entry.length = varint();\n if (!entry.length) throw new Error('Invalid PMTiles directory length');\n }\n entries.forEach((entry, i) => {\n const value = varint();\n if (!value && !i) throw new Error('Invalid PMTiles directory offset');\n entry.offset = value ? value - 1 : entries[i - 1].offset + entries[i - 1].length;\n });\n if (cursor !== bytes.length) throw new Error('Trailing PMTiles directory data');\n return entries;\n}\n"],
|
|
5
|
+
"mappings": "AAEO,SAASA,EAAgBC,EAAM,CACpC,MAAMC,EAAQ,IAAI,WAAWD,CAAI,EACjC,IAAIE,EAAS,EACb,MAAMC,EAAS,IAAM,CACnB,IAAIC,EAAQ,EACZ,QAASC,EAAS,EAAGA,GAAU,GAAK,GAAIA,GAAU,IAAK,CACrD,GAAIH,GAAUD,EAAM,OAAQ,MAAM,IAAI,MAAM,6BAA6B,EACzE,MAAMK,EAAOL,EAAMC,GAAQ,EAE3B,GADAE,IAAUE,EAAO,KAAOD,EACpB,CAAC,OAAO,cAAcD,CAAK,EAAG,MAAM,IAAI,MAAM,mCAAmC,EACrF,GAAIE,EAAO,IAAK,OAAOF,CACzB,CACA,MAAM,IAAI,MAAM,mCAAmC,CACrD,EACMG,EAAQJ,EAAO,EACrB,GAAII,GAASN,EAAM,OAASC,GAAU,EAAG,MAAM,IAAI,MAAM,iCAAiC,EAC1F,MAAMM,EAAU,CAAC,EACjB,IAAIC,EAAS,EACb,QAASC,EAAI,EAAGA,EAAIH,EAAOG,IAAK,CAE9B,GADAD,GAAUN,EAAO,EACb,CAAC,OAAO,cAAcM,CAAM,GAAMC,GAAKD,GAAUD,EAAQE,EAAI,CAAC,EAAE,OAClE,MAAM,IAAI,MAAM,oCAAoC,EAEtDF,EAAQ,KAAK,CAAE,OAAAC,CAAO,CAAC,CACzB,CACA,UAAWE,KAASH,EAASG,EAAM,UAAYR,EAAO,EACtD,UAAWQ,KAASH,EAElB,GADAG,EAAM,OAASR,EAAO,EAClB,CAACQ,EAAM,OAAQ,MAAM,IAAI,MAAM,kCAAkC,EAOvE,GALAH,EAAQ,QAAQ,CAACG,EAAOD,IAAM,CAC5B,MAAMN,EAAQD,EAAO,EACrB,GAAI,CAACC,GAAS,CAACM,EAAG,MAAM,IAAI,MAAM,kCAAkC,EACpEC,EAAM,OAASP,EAAQA,EAAQ,EAAII,EAAQE,EAAI,CAAC,EAAE,OAASF,EAAQE,EAAI,CAAC,EAAE,MAC5E,CAAC,EACGR,IAAWD,EAAM,OAAQ,MAAM,IAAI,MAAM,iCAAiC,EAC9E,OAAOO,CACT",
|
|
6
|
+
"names": ["decodeDirectory", "data", "bytes", "cursor", "varint", "value", "factor", "byte", "count", "entries", "tileId", "i", "entry"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function i(o){if(o.byteLength<127||new TextDecoder().decode(new Uint8Array(o,0,7))!=="PMTiles"||new Uint8Array(o)[7]!==3)throw new Error("Expected a PMTiles v3 archive");const t=new DataView(o),e={};return["rootDirectoryOffset","rootDirectoryLength","jsonMetadataOffset","jsonMetadataLength","leafDirectoryOffset","leafDirectoryLength","tileDataOffset","tileDataLength","numAddressedTiles","numTileEntries","numTileContents"].forEach((n,r)=>{e[n]=Number(t.getBigUint64(8+r*8,!0))}),["clustered","internalCompression","tileCompression","tileType","minZoom","maxZoom"].forEach((n,r)=>{e[n]=t.getUint8(96+r)}),["minLon","minLat","maxLon","maxLat"].forEach((n,r)=>{e[n]=t.getInt32(102+r*4,!0)/1e7}),e.centerZoom=t.getUint8(118),e.centerLon=t.getInt32(119,!0)/1e7,e.centerLat=t.getInt32(123,!0)/1e7,e}export{i as decodeHeader};
|
|
2
|
+
//# sourceMappingURL=decodeHeader.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/decodeHeader.js"],
|
|
4
|
+
"sourcesContent": ["/** Decode the PMTiles v3 header. */\n\nexport function decodeHeader(data) {\n if (data.byteLength < 127 || new TextDecoder().decode(new Uint8Array(data, 0, 7)) !== 'PMTiles' ||\n new Uint8Array(data)[7] !== 3) throw new Error('Expected a PMTiles v3 archive');\n const view = new DataView(data);\n const header = {};\n ['rootDirectoryOffset', 'rootDirectoryLength', 'jsonMetadataOffset', 'jsonMetadataLength', 'leafDirectoryOffset', 'leafDirectoryLength', 'tileDataOffset', 'tileDataLength', 'numAddressedTiles', 'numTileEntries', 'numTileContents'].forEach((name, i) => { header[name] = Number(view.getBigUint64(8 + i * 8, true)); });\n ['clustered', 'internalCompression', 'tileCompression', 'tileType', 'minZoom', 'maxZoom'].forEach((name, i) => { header[name] = view.getUint8(96 + i); });\n ['minLon', 'minLat', 'maxLon', 'maxLat'].forEach((name, i) => { header[name] = view.getInt32(102 + i * 4, true) / 1e7; });\n header.centerZoom = view.getUint8(118);\n header.centerLon = view.getInt32(119, true) / 1e7;\n header.centerLat = view.getInt32(123, true) / 1e7;\n return header;\n}\n"],
|
|
5
|
+
"mappings": "AAEO,SAASA,EAAaC,EAAM,CACjC,GAAIA,EAAK,WAAa,KAAO,IAAI,YAAY,EAAE,OAAO,IAAI,WAAWA,EAAM,EAAG,CAAC,CAAC,IAAM,WACpF,IAAI,WAAWA,CAAI,EAAE,CAAC,IAAM,EAAG,MAAM,IAAI,MAAM,+BAA+B,EAChF,MAAMC,EAAO,IAAI,SAASD,CAAI,EACxBE,EAAS,CAAC,EAChB,OAAC,sBAAuB,sBAAuB,qBAAsB,qBAAsB,sBAAuB,sBAAuB,iBAAkB,iBAAkB,oBAAqB,iBAAkB,iBAAiB,EAAE,QAAQ,CAACC,EAAMC,IAAM,CAAEF,EAAOC,CAAI,EAAI,OAAOF,EAAK,aAAa,EAAIG,EAAI,EAAG,EAAI,CAAC,CAAG,CAAC,EAC1T,CAAC,YAAa,sBAAuB,kBAAmB,WAAY,UAAW,SAAS,EAAE,QAAQ,CAACD,EAAMC,IAAM,CAAEF,EAAOC,CAAI,EAAIF,EAAK,SAAS,GAAKG,CAAC,CAAG,CAAC,EACxJ,CAAC,SAAU,SAAU,SAAU,QAAQ,EAAE,QAAQ,CAACD,EAAMC,IAAM,CAAEF,EAAOC,CAAI,EAAIF,EAAK,SAAS,IAAMG,EAAI,EAAG,EAAI,EAAI,GAAK,CAAC,EACxHF,EAAO,WAAaD,EAAK,SAAS,GAAG,EACrCC,EAAO,UAAYD,EAAK,SAAS,IAAK,EAAI,EAAI,IAC9CC,EAAO,UAAYD,EAAK,SAAS,IAAK,EAAI,EAAI,IACvCC,CACT",
|
|
6
|
+
"names": ["decodeHeader", "data", "view", "header", "name", "i"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function d(r){const n=new DataView(r),s=new TextDecoder;let t;if(n.getUint32(0,!0)===1179937895){if(n.getUint32(4,!0)!==2||n.getUint32(8,!0)!==r.byteLength)throw new Error("Invalid GLB header");let o;for(let e=12;e<r.byteLength;){if(e+8>r.byteLength)throw new Error("Truncated GLB chunk");const i=n.getUint32(e,!0),h=n.getUint32(e+4,!0);if(e+=8,e+i>r.byteLength)throw new Error("Truncated GLB data");const c=r.slice(e,e+i);h===1313821514&&(t=JSON.parse(s.decode(c))),h===5130562&&(o=c),e+=i}if(!t)throw new Error("Missing GLB JSON");o&&(t.buffers[0].binary=o)}else t=JSON.parse(s.decode(r));if(t.skins?.length||t.animations?.length||t.extensionsRequired?.length||t.meshes?.some(o=>o.primitives.some(e=>e.targets||e.mode!==void 0&&e.mode!==4)))throw new Error("Layer3D supports static triangle glTF models without required extensions");return t}export{d as decodeModel};
|
|
2
|
+
//# sourceMappingURL=decodeModel.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/decodeModel.js"],
|
|
4
|
+
"sourcesContent": ["/** Decode a static glTF JSON document or GLB v2 container. */\n\nexport function decodeModel(data) {\n const view = new DataView(data), decoder = new TextDecoder();\n let description;\n if (view.getUint32(0, true) === 0x46546c67) {\n // Decode GLB v2 chunks; unknown types are skipped.\n if (view.getUint32(4, true) !== 2 || view.getUint32(8, true) !== data.byteLength) {\n throw new Error('Invalid GLB header');\n }\n let binary;\n for (let offset = 12; offset < data.byteLength;) {\n if (offset + 8 > data.byteLength) {\n throw new Error('Truncated GLB chunk');\n }\n const length = view.getUint32(offset, true), type = view.getUint32(offset + 4, true);\n offset += 8;\n if (offset + length > data.byteLength) {\n throw new Error('Truncated GLB data');\n }\n const chunk = data.slice(offset, offset + length);\n if (type === 0x4e4f534a) {\n description = JSON.parse(decoder.decode(chunk));\n }\n if (type === 0x004e4942) {\n binary = chunk;\n }\n offset += length;\n }\n if (!description) {\n throw new Error('Missing GLB JSON');\n }\n if (binary) {\n description.buffers[0].binary = binary;\n }\n } else {\n description = JSON.parse(decoder.decode(data));\n }\n if (description.skins?.length || description.animations?.length || description.extensionsRequired?.length || description.meshes?.some(mesh => mesh.primitives.some(primitive => primitive.targets || (primitive.mode !== undefined && primitive.mode !== 4)))) {\n throw new Error('Layer3D supports static triangle glTF models without required extensions');\n }\n return description;\n}\n"],
|
|
5
|
+
"mappings": "AAEO,SAASA,EAAYC,EAAM,CAChC,MAAMC,EAAO,IAAI,SAASD,CAAI,EAAGE,EAAU,IAAI,YAC/C,IAAIC,EACJ,GAAIF,EAAK,UAAU,EAAG,EAAI,IAAM,WAAY,CAE1C,GAAIA,EAAK,UAAU,EAAG,EAAI,IAAM,GAAKA,EAAK,UAAU,EAAG,EAAI,IAAMD,EAAK,WACpE,MAAM,IAAI,MAAM,oBAAoB,EAEtC,IAAII,EACJ,QAASC,EAAS,GAAIA,EAASL,EAAK,YAAa,CAC/C,GAAIK,EAAS,EAAIL,EAAK,WACpB,MAAM,IAAI,MAAM,qBAAqB,EAEvC,MAAMM,EAASL,EAAK,UAAUI,EAAQ,EAAI,EAAGE,EAAON,EAAK,UAAUI,EAAS,EAAG,EAAI,EAEnF,GADAA,GAAU,EACNA,EAASC,EAASN,EAAK,WACzB,MAAM,IAAI,MAAM,oBAAoB,EAEtC,MAAMQ,EAAQR,EAAK,MAAMK,EAAQA,EAASC,CAAM,EAC5CC,IAAS,aACXJ,EAAc,KAAK,MAAMD,EAAQ,OAAOM,CAAK,CAAC,GAE5CD,IAAS,UACXH,EAASI,GAEXH,GAAUC,CACZ,CACA,GAAI,CAACH,EACH,MAAM,IAAI,MAAM,kBAAkB,EAEhCC,IACFD,EAAY,QAAQ,CAAC,EAAE,OAASC,EAEpC,MACED,EAAc,KAAK,MAAMD,EAAQ,OAAOF,CAAI,CAAC,EAE/C,GAAIG,EAAY,OAAO,QAAUA,EAAY,YAAY,QAAUA,EAAY,oBAAoB,QAAUA,EAAY,QAAQ,KAAKM,GAAQA,EAAK,WAAW,KAAKC,GAAaA,EAAU,SAAYA,EAAU,OAAS,QAAaA,EAAU,OAAS,CAAE,CAAC,EAC1P,MAAM,IAAI,MAAM,0EAA0E,EAE5F,OAAOP,CACT",
|
|
6
|
+
"names": ["decodeModel", "data", "view", "decoder", "description", "binary", "offset", "length", "type", "chunk", "mesh", "primitive"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/decompress.js"],
|
|
4
|
+
"sourcesContent": ["export async function decompress(data, compression) {\n if (compression === 1) return data;\n if (compression !== 2) throw new Error(`Unsupported PMTiles compression: ${compression}`);\n return new Response(new Blob([data]).stream().pipeThrough(new DecompressionStream('gzip'))).arrayBuffer();\n}\n"],
|
|
5
|
+
"mappings": "AAAA,eAAsBA,EAAWC,EAAMC,EAAa,CAClD,GAAIA,IAAgB,EAAG,OAAOD,EAC9B,GAAIC,IAAgB,EAAG,MAAM,IAAI,MAAM,oCAAoCA,CAAW,EAAE,EACxF,OAAO,IAAI,SAAS,IAAI,KAAK,CAACD,CAAI,CAAC,EAAE,OAAO,EAAE,YAAY,IAAI,oBAAoB,MAAM,CAAC,CAAC,EAAE,YAAY,CAC1G",
|
|
6
|
+
"names": ["decompress", "data", "compression"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/destroyTexture.js"],
|
|
4
|
+
"sourcesContent": ["\nexport function destroyTexture(layer, texture) {\n layer.renderer.device.queue.onSubmittedWorkDone().then(() => texture.destroy(), error => {\n layer.fire('error', { error });\n texture.destroy();\n });\n}\n"],
|
|
5
|
+
"mappings": "AACO,SAASA,EAAeC,EAAOC,EAAS,CAC7CD,EAAM,SAAS,OAAO,MAAM,oBAAoB,EAAE,KAAK,IAAMC,EAAQ,QAAQ,EAAGC,GAAS,CACvFF,EAAM,KAAK,QAAS,CAAE,MAAAE,CAAM,CAAC,EAC7BD,EAAQ,QAAQ,CAClB,CAAC,CACH",
|
|
6
|
+
"names": ["destroyTexture", "layer", "texture", "error"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/disposeMesh.js"],
|
|
4
|
+
"sourcesContent": ["import { setParent } from './setParent.js';\nimport { update } from './update.js';\n\nexport function disposeMesh(backend, mesh) {\n if (!mesh) {\n return;\n }\n setParent(mesh, null);\n update(backend);\n for (const attribute of Object.values(mesh.geometry.attributes)) {\n attribute.buffer.destroy();\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,aAAAA,MAAiB,iBAC1B,OAAS,UAAAC,MAAc,cAEhB,SAASC,EAAYC,EAASC,EAAM,CACzC,GAAKA,EAGL,CAAAJ,EAAUI,EAAM,IAAI,EACpBH,EAAOE,CAAO,EACd,UAAWE,KAAa,OAAO,OAAOD,EAAK,SAAS,UAAU,EAC5DC,EAAU,OAAO,QAAQ,EAE7B",
|
|
6
|
+
"names": ["setParent", "update", "disposeMesh", "backend", "mesh", "attribute"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function G(b,e,o,m,h){const{geometry:a,program:i}=e,p=b.renderer.device,w=`${m}:${h}`;let c=i.pipelineCache.get(w);c||(c=p.createRenderPipeline({layout:i.pipelineLayout,vertex:{module:i.vertex,entryPoint:"vertexMain",buffers:i.vertexBuffers},fragment:{module:i.fragment,entryPoint:"fragmentMain",targets:[{format:b.renderer.format,blend:i.transparent?{color:{srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha",operation:"add"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"}}:void 0,writeMask:GPUColorWrite.ALL}]},primitive:{topology:"triangle-list",cullMode:m,frontFace:h},depthStencil:{format:"depth24plus",depthWriteEnabled:i.depthWrite,depthCompare:i.depthTest===!1?"always":"less-equal"}}),i.pipelineCache.set(w,c));const d=i.uniforms,s=b.renderer,B=s.uniformSlot++*256,r=s.uniformData,n=B/4;r.set(e.worldMatrix,n),r.set(d.baseColor.value,n+16),r[n+19]=1,r[n+20]=d.metallic.value,r[n+21]=d.roughness.value,r[n+22]=d.opacity.value*(e.ground?e._appearance??1:1),r[n+23]=d.alphaCutoff.value,r.set(d.emissive.value,n+24),r[n+27]=d.occlusionStrength.value,r[n+28]=e.terrain?.[0]??0,r[n+29]=e.terrain?.[1]??0,r[n+30]=e.terrain?.[2]??0,r[n+31]=e.terrain?.[3]??0,r[n+32]=e.highlight?.[0]??0,r[n+33]=e.highlight?.[1]??0,r[n+34]=i.nightSparkle?r[55]:0,r[n+35]=e.ground?1:e._appearance??1;const f=e._textures||=[];f.length=0;for(const t of i.bindings){const u=d[t.name]?.value;if(!u)throw new Error(`Missing Layer3D texture: ${t.name}`);u.uploaded!==u.image&&(p.queue.copyExternalImageToTexture({source:u.image,flipY:!!u.flipY},{texture:u.texture},[u.image.width,u.image.height]),u.uploaded=u.image),f.push(u)}let x=!e.bindGroup||e.boundBuffer!==s.uniformBuffer||f.length!==e.boundTextures.length;for(let t=0;!x&&t<f.length;t++)(f[t].texture!==e.boundTextures[t][0]||f[t].sampler!==e.boundTextures[t][1])&&(x=!0);if(x){const t=[{binding:0,resource:{buffer:s.uniformBuffer,size:144}},{binding:1,resource:{buffer:s.uniformBuffer,size:240}}];i.terrain&&t.push({binding:2,resource:i.terrain.texture.createView()}),e.boundBuffer=s.uniformBuffer;const u=e.boundTextures||=[];u.length=f.length;for(let l=0;l<f.length;l++){const y=i.bindings[l],g=f[l];t.push({binding:y.texture,resource:g.texture.createView()}),t.push({binding:y.sampler,resource:g.sampler}),u[l]||=[],u[l][0]=g.texture,u[l][1]=g.sampler}e.bindGroup=p.createBindGroup({layout:i.bindGroupLayout,entries:t})}o.setPipeline(c),o.setBindGroup(0,e.bindGroup,[B]),o.setVertexBuffer(0,a.attributes.position.buffer),o.setVertexBuffer(1,a.attributes.normal.buffer),a.attributes.color&&o.setVertexBuffer(2,a.attributes.color.buffer),a.attributes.uv&&o.setVertexBuffer(3,a.attributes.uv.buffer);for(const t of Object.values(a.attributes))t.needsUpdate&&(p.queue.writeBuffer(t.buffer,0,t.data),t.needsUpdate=!1,a.bounds=null);const v=a.attributes.index;v?(o.setIndexBuffer(v.buffer,v.indexFormat),o.drawIndexed(a.drawRange.count,1,a.drawRange.start,0,0)):o.draw(a.drawRange.count,1,a.drawRange.start,0)}export{G as drawGeometry};
|
|
2
|
+
//# sourceMappingURL=drawGeometry.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/drawGeometry.js"],
|
|
4
|
+
"sourcesContent": ["/** Upload retained CPU data and draw one mesh in the active WebGPU render pass. */\n\nexport function drawGeometry(backend, mesh, pass, cullMode, frontFace) {\n const { geometry, program } = mesh;\n const device = backend.renderer.device;\n const pipelineKey = `${cullMode}:${frontFace}`;\n let pipeline = program.pipelineCache.get(pipelineKey);\n if (!pipeline) {\n pipeline = device.createRenderPipeline({\n layout: program.pipelineLayout,\n vertex: {\n module: program.vertex,\n entryPoint: 'vertexMain',\n buffers: program.vertexBuffers,\n },\n fragment: {\n module: program.fragment,\n entryPoint: 'fragmentMain',\n targets: [{\n format: backend.renderer.format,\n blend: program.transparent ? {\n color: { srcFactor: 'src-alpha', dstFactor: 'one-minus-src-alpha', operation: 'add' },\n alpha: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha', operation: 'add' },\n } : undefined,\n writeMask: GPUColorWrite.ALL,\n }],\n },\n primitive: { topology: 'triangle-list', cullMode, frontFace },\n depthStencil: {\n format: 'depth24plus',\n depthWriteEnabled: program.depthWrite,\n depthCompare: program.depthTest === false ? 'always' : 'less-equal',\n },\n });\n program.pipelineCache.set(pipelineKey, pipeline);\n }\n\n const uniforms = program.uniforms;\n const renderer = backend.renderer;\n const offset = renderer.uniformSlot++ * 256;\n const data = renderer.uniformData, base = offset / 4;\n data.set(mesh.worldMatrix, base);\n data.set(uniforms.baseColor.value, base + 16);\n data[base + 19] = 1;\n data[base + 20] = uniforms.metallic.value;\n data[base + 21] = uniforms.roughness.value;\n data[base + 22] = uniforms.opacity.value * (mesh.ground ? mesh._appearance ?? 1 : 1);\n data[base + 23] = uniforms.alphaCutoff.value;\n data.set(uniforms.emissive.value, base + 24);\n data[base + 27] = uniforms.occlusionStrength.value;\n data[base + 28] = mesh.terrain?.[0] ?? 0;\n data[base + 29] = mesh.terrain?.[1] ?? 0;\n data[base + 30] = mesh.terrain?.[2] ?? 0;\n data[base + 31] = mesh.terrain?.[3] ?? 0;\n data[base + 32] = mesh.highlight?.[0] ?? 0;\n data[base + 33] = mesh.highlight?.[1] ?? 0;\n data[base + 34] = program.nightSparkle ? data[55] : 0;\n data[base + 35] = mesh.ground ? 1 : mesh._appearance ?? 1;\n\n const textures = mesh._textures ||= [];\n textures.length = 0;\n for (const binding of program.bindings) {\n const texture = uniforms[binding.name]?.value;\n if (!texture) throw new Error(`Missing Layer3D texture: ${binding.name}`);\n if (texture.uploaded !== texture.image) {\n device.queue.copyExternalImageToTexture(\n { source: texture.image, flipY: Boolean(texture.flipY) },\n { texture: texture.texture },\n [texture.image.width, texture.image.height]\n );\n texture.uploaded = texture.image;\n }\n textures.push(texture);\n }\n let bindingsChanged = !mesh.bindGroup || mesh.boundBuffer !== renderer.uniformBuffer ||\n textures.length !== mesh.boundTextures.length;\n for (let i = 0; !bindingsChanged && i < textures.length; i++) {\n if (textures[i].texture !== mesh.boundTextures[i][0] ||\n textures[i].sampler !== mesh.boundTextures[i][1]) bindingsChanged = true;\n }\n if (bindingsChanged) {\n const entries = [\n { binding: 0, resource: { buffer: renderer.uniformBuffer, size: 144 } },\n { binding: 1, resource: { buffer: renderer.uniformBuffer, size: 240 } },\n ];\n if (program.terrain) entries.push({ binding: 2, resource: program.terrain.texture.createView() });\n mesh.boundBuffer = renderer.uniformBuffer;\n const boundTextures = mesh.boundTextures ||= [];\n boundTextures.length = textures.length;\n for (let i = 0; i < textures.length; i++) {\n const binding = program.bindings[i], texture = textures[i];\n entries.push({ binding: binding.texture, resource: texture.texture.createView() });\n entries.push({ binding: binding.sampler, resource: texture.sampler });\n boundTextures[i] ||= [];\n boundTextures[i][0] = texture.texture;\n boundTextures[i][1] = texture.sampler;\n }\n mesh.bindGroup = device.createBindGroup({\n layout: program.bindGroupLayout,\n entries,\n });\n }\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, mesh.bindGroup, [offset]);\n pass.setVertexBuffer(0, geometry.attributes.position.buffer);\n pass.setVertexBuffer(1, geometry.attributes.normal.buffer);\n if (geometry.attributes.color) pass.setVertexBuffer(2, geometry.attributes.color.buffer);\n if (geometry.attributes.uv) pass.setVertexBuffer(3, geometry.attributes.uv.buffer);\n for (const attribute of Object.values(geometry.attributes)) {\n if (!attribute.needsUpdate) continue;\n device.queue.writeBuffer(attribute.buffer, 0, attribute.data);\n attribute.needsUpdate = false;\n geometry.bounds = null;\n }\n const index = geometry.attributes.index;\n if (index) {\n pass.setIndexBuffer(index.buffer, index.indexFormat);\n pass.drawIndexed(geometry.drawRange.count, 1, geometry.drawRange.start, 0, 0);\n } else {\n pass.draw(geometry.drawRange.count, 1, geometry.drawRange.start, 0);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["drawGeometry", "backend", "mesh", "pass", "cullMode", "frontFace", "geometry", "program", "device", "pipelineKey", "pipeline", "uniforms", "renderer", "offset", "data", "base", "textures", "binding", "texture", "bindingsChanged", "i", "entries", "boundTextures", "attribute", "index"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const e=`
|
|
2
|
+
fn demSample(pixel: vec2<i32>) -> f32 {
|
|
3
|
+
if (any(pixel < vec2<i32>(0)) || any(pixel >= vec2<i32>(textureDimensions(dem)))) { return -1e9; }
|
|
4
|
+
return textureLoad(dem, pixel, 0).r;
|
|
5
|
+
}
|
|
6
|
+
fn elevation(pixel: vec2<f32>, base: f32) -> f32 {
|
|
7
|
+
let p = pixel - vec2<f32>(0.5);
|
|
8
|
+
let f = fract(p);
|
|
9
|
+
let i = vec2<i32>(floor(p));
|
|
10
|
+
let v00 = demSample(i);
|
|
11
|
+
let v10 = demSample(i + vec2<i32>(1, 0));
|
|
12
|
+
let v01 = demSample(i + vec2<i32>(0, 1));
|
|
13
|
+
let v11 = demSample(i + vec2<i32>(1, 1));
|
|
14
|
+
if (v00 > -1000.0 && v10 > -1000.0 && v01 > -1000.0 && v11 > -1000.0) {
|
|
15
|
+
return mix(mix(v00, v10, f.x), mix(v01, v11, f.x), f.y);
|
|
16
|
+
}
|
|
17
|
+
if (v00 > -1000.0) { return v00; }
|
|
18
|
+
if (v10 > -1000.0) { return v10; }
|
|
19
|
+
if (v01 > -1000.0) { return v01; }
|
|
20
|
+
if (v11 > -1000.0) { return v11; }
|
|
21
|
+
return base;
|
|
22
|
+
}
|
|
23
|
+
`;export{e as elevationWGSL};
|
|
24
|
+
//# sourceMappingURL=elevationWGSL.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/elevationWGSL.js"],
|
|
4
|
+
"sourcesContent": ["/**\n * WGSL twin of getElevation for the vertex shader: bilinear DEM pixels, or the first valid\n * neighbour near no-data (stored as -1e9), else `base`. Expects `dem: texture_2d<f32>`.\n */\nexport const elevationWGSL = `\n fn demSample(pixel: vec2<i32>) -> f32 {\n if (any(pixel < vec2<i32>(0)) || any(pixel >= vec2<i32>(textureDimensions(dem)))) { return -1e9; }\n return textureLoad(dem, pixel, 0).r;\n }\n fn elevation(pixel: vec2<f32>, base: f32) -> f32 {\n let p = pixel - vec2<f32>(0.5);\n let f = fract(p);\n let i = vec2<i32>(floor(p));\n let v00 = demSample(i);\n let v10 = demSample(i + vec2<i32>(1, 0));\n let v01 = demSample(i + vec2<i32>(0, 1));\n let v11 = demSample(i + vec2<i32>(1, 1));\n if (v00 > -1000.0 && v10 > -1000.0 && v01 > -1000.0 && v11 > -1000.0) {\n return mix(mix(v00, v10, f.x), mix(v01, v11, f.x), f.y);\n }\n if (v00 > -1000.0) { return v00; }\n if (v10 > -1000.0) { return v10; }\n if (v01 > -1000.0) { return v01; }\n if (v11 > -1000.0) { return v11; }\n return base;\n }\n`;\n"],
|
|
5
|
+
"mappings": "AAIO,MAAMA,EAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
|
|
6
|
+
"names": ["elevationWGSL"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/emptyNode.js"],
|
|
4
|
+
"sourcesContent": ["/** A fresh, empty scene-graph node. */\nexport const emptyNode = () => ({\n position: [0, 0, 0],\n rotation: [0, 0, 0],\n scale: [1, 1, 1],\n worldMatrix: [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],\n children: [],\n visible: true,\n});\n"],
|
|
5
|
+
"mappings": "AACO,MAAMA,EAAY,KAAO,CAC9B,SAAU,CAAC,EAAG,EAAG,CAAC,EAClB,SAAU,CAAC,EAAG,EAAG,CAAC,EAClB,MAAO,CAAC,EAAG,EAAG,CAAC,EACf,YAAa,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAC5D,SAAU,CAAC,EACX,QAAS,EACX",
|
|
6
|
+
"names": ["emptyNode"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{update as a}from"./update.js";function m(){const o=this;for(const e of o._zoomTransitions?.keys()||[])e.finish();o._zoomTransitions=null,o._zoomView=null,delete o._map._cameraView,o._map.getContainer().classList.remove("leaflet-camera-zoom"),o._map._updateCameraOverlays(),o._zoomLevel=null,a(o)}export{m as endZoom};
|
|
2
|
+
//# sourceMappingURL=endZoom.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/endZoom.js"],
|
|
4
|
+
"sourcesContent": ["import { update } from \"./update.js\";\n\n/** Stop using the outgoing level after zoomend; the next redraw uses current tiles. */\n\nexport function endZoom() {\n const backend = this;\n for (const animation of backend._zoomTransitions?.keys() || []) animation.finish();\n backend._zoomTransitions = null;\n backend._zoomView = null;\n delete backend._map._cameraView;\n backend._map.getContainer().classList.remove('leaflet-camera-zoom');\n backend._map._updateCameraOverlays();\n backend._zoomLevel = null;\n update(backend);\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,UAAAA,MAAc,cAIhB,SAASC,GAAU,CACxB,MAAMC,EAAU,KAChB,UAAWC,KAAaD,EAAQ,kBAAkB,KAAK,GAAK,CAAC,EAAGC,EAAU,OAAO,EACjFD,EAAQ,iBAAmB,KAC3BA,EAAQ,UAAY,KACpB,OAAOA,EAAQ,KAAK,YACpBA,EAAQ,KAAK,aAAa,EAAE,UAAU,OAAO,qBAAqB,EAClEA,EAAQ,KAAK,sBAAsB,EACnCA,EAAQ,WAAa,KACrBF,EAAOE,CAAO,CAChB",
|
|
6
|
+
"names": ["update", "endZoom", "backend", "animation"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{raycast as m}from"./raycast.js";function u(e,f){if(!e.root||!e.camera)return null;for(const t of m(e,f,e.root.children,!!e.model)){if(e.model){let o=t.object;for(;o&&o!==e.model;)o=o.parent;if(o===e.model)return{id:e.model.id,properties:e.model.extras,model:e.model,mesh:t.object,point:t.point}}const r=t.object.extras?.featureFaces;if(!r)continue;let i=0,l=r.length-1;for(;i<=l;){const o=i+l>>1,n=r[o];if(t.faceIndex<n.faceStart)l=o-1;else if(t.faceIndex>=n.faceEnd)i=o+1;else return{...n,mesh:t.object,point:t.point}}}return null}export{u as findFeature};
|
|
2
|
+
//# sourceMappingURL=findFeature.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/findFeature.js"],
|
|
4
|
+
"sourcesContent": ["import { raycast } from './raycast.js';\n\n/**\n * Translate a geometry hit into a configured model or batched source feature.\n * Sorted half-open face ranges permit binary search without a feature per triangle.\n * @returns {PickedFeature|null}\n */\n\nexport function findFeature(backend, event) {\n if (!backend.root || !backend.camera) {\n return null;\n }\n for (const hit of raycast(backend, event, backend.root.children, Boolean(backend.model))) {\n if (backend.model) {\n let object = hit.object;\n while (object && object !== backend.model) {\n object = object.parent;\n }\n if (object === backend.model) {\n return {\n id: backend.model.id, properties: backend.model.extras,\n model: backend.model, mesh: hit.object, point: hit.point\n };\n }\n }\n const ranges = hit.object.extras?.featureFaces;\n if (!ranges) {\n continue;\n }\n let low = 0,\n high = ranges.length - 1;\n while (low <= high) {\n const middle = (low + high) >> 1;\n const range = ranges[middle];\n if (hit.faceIndex < range.faceStart) {\n high = middle - 1;\n } else if (hit.faceIndex >= range.faceEnd) {\n low = middle + 1;\n } else {\n return {\n ...range,\n mesh: hit.object,\n point: hit.point\n };\n }\n }\n }\n return null;\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,WAAAA,MAAe,eAQjB,SAASC,EAAYC,EAASC,EAAO,CAC1C,GAAI,CAACD,EAAQ,MAAQ,CAACA,EAAQ,OAC5B,OAAO,KAET,UAAWE,KAAOJ,EAAQE,EAASC,EAAOD,EAAQ,KAAK,SAAU,EAAQA,EAAQ,KAAM,EAAG,CACxF,GAAIA,EAAQ,MAAO,CACjB,IAAIG,EAASD,EAAI,OACjB,KAAOC,GAAUA,IAAWH,EAAQ,OAClCG,EAASA,EAAO,OAElB,GAAIA,IAAWH,EAAQ,MACrB,MAAO,CACL,GAAIA,EAAQ,MAAM,GAAI,WAAYA,EAAQ,MAAM,OAChD,MAAOA,EAAQ,MAAO,KAAME,EAAI,OAAQ,MAAOA,EAAI,KACrD,CAEJ,CACA,MAAME,EAASF,EAAI,OAAO,QAAQ,aAClC,GAAI,CAACE,EACH,SAEF,IAAIC,EAAM,EACPC,EAAOF,EAAO,OAAS,EAC1B,KAAOC,GAAOC,GAAM,CAClB,MAAMC,EAAUF,EAAMC,GAAS,EACzBE,EAAQJ,EAAOG,CAAM,EAC3B,GAAIL,EAAI,UAAYM,EAAM,UACxBF,EAAOC,EAAS,UACPL,EAAI,WAAaM,EAAM,QAChCH,EAAME,EAAS,MAEf,OAAO,CACL,GAAGC,EACH,KAAMN,EAAI,OACV,MAAOA,EAAI,KACb,CAEJ,CACF,CACA,OAAO,IACT",
|
|
6
|
+
"names": ["raycast", "findFeature", "backend", "event", "hit", "object", "ranges", "low", "high", "middle", "range"]
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=geometry.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{bridgeElevation as e}from"./bridgeElevation.js";import{terrainElevation as o}from"./terrainElevation.js";function p(r,t){if(!r._map||!r._terrainReady)return null;const i=t instanceof L.Point?t:r._map.project(t,r._terrainZoom);return e(i,r._bridges)??o(i,r._terrainTiles)}export{p as getElevation};
|
|
2
|
+
//# sourceMappingURL=getElevation.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/getElevation.js"],
|
|
4
|
+
"sourcesContent": ["import { bridgeElevation } from './bridgeElevation.js';\nimport { terrainElevation } from './terrainElevation.js';\n\n/** @param {L.LatLng|L.Point} location LatLng, or a pixel point at the terrain zoom. */\n\nexport function getElevation(backend, location) {\n if (!backend._map || !backend._terrainReady) return null;\n const point = location instanceof L.Point ? location : backend._map.project(location, backend._terrainZoom);\n return bridgeElevation(point, backend._bridges) ?? terrainElevation(point, backend._terrainTiles);\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,mBAAAA,MAAuB,uBAChC,OAAS,oBAAAC,MAAwB,wBAI1B,SAASC,EAAaC,EAASC,EAAU,CAC9C,GAAI,CAACD,EAAQ,MAAQ,CAACA,EAAQ,cAAe,OAAO,KACpD,MAAME,EAAQD,aAAoB,EAAE,MAAQA,EAAWD,EAAQ,KAAK,QAAQC,EAAUD,EAAQ,YAAY,EAC1G,OAAOH,EAAgBK,EAAOF,EAAQ,QAAQ,GAAKF,EAAiBI,EAAOF,EAAQ,aAAa,CAClG",
|
|
6
|
+
"names": ["bridgeElevation", "terrainElevation", "getElevation", "backend", "location", "point"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/getHeader.js"],
|
|
4
|
+
"sourcesContent": ["import { decodeHeader } from './decodeHeader.js';\nimport { read } from './read.js';\n\n/** Cache header initialization; failures remain visible to all callers. */\n\nexport function getHeader(backend) {\n if (backend.options.archive && backend.options.archive !== backend) return backend.options.archive.getHeader();\n return backend._header ||= read(backend, 0, 127).then(decodeHeader);\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,gBAAAA,MAAoB,oBAC7B,OAAS,QAAAC,MAAY,YAId,SAASC,EAAUC,EAAS,CACjC,OAAIA,EAAQ,QAAQ,SAAWA,EAAQ,QAAQ,UAAYA,EAAgBA,EAAQ,QAAQ,QAAQ,UAAU,EACtGA,EAAQ,UAAYF,EAAKE,EAAS,EAAG,GAAG,EAAE,KAAKH,CAAY,CACpE",
|
|
6
|
+
"names": ["decodeHeader", "read", "getHeader", "backend"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{decodeDirectory as v}from"./decodeDirectory.js";import{decompress as u}from"./decompress.js";import{tileId as D}from"./tileId.js";import{read as _}from"./read.js";import{getHeader as I}from"./getHeader.js";async function M(t,h,m,p,i){if(t.options.archive&&t.options.archive!==t&&t.options.archive.getZxy)return t.options.archive.getZxy(h,m,p,i);const y=D(h,m,p);i?.throwIfAborted();const r=await I(t);if(i?.throwIfAborted(),h<r.minZoom||h>r.maxZoom)return;let s=r.rootDirectoryOffset,l=r.rootDirectoryLength;const a=new Set;for(let g=0;g<4;g++){if(a.has(s))throw new Error("Cyclic PMTiles directory");a.add(s);const f=`${s}:${l}`;if(!t._directories.has(f)){t._directories.size>=32&&t._directories.delete(t._directories.keys().next().value);const o=_(t,s,l).then(w=>u(w,r.internalCompression)).then(v).catch(w=>{throw t._directories.get(f)===o&&t._directories.delete(f),w});t._directories.set(f,o)}const c=await t._directories.get(f);i?.throwIfAborted();let d=0,n=c.length-1;for(;d<=n;){const o=d+n>>1;c[o].tileId<=y?d=o+1:n=o-1}const e=c[n];if(!e)return;if(e.runLength){if(y-e.tileId>=e.runLength)return;if(e.offset+e.length>r.tileDataLength)throw new Error("PMTiles tile outside data section");const o=await u(await _(t,r.tileDataOffset+e.offset,e.length,i),r.tileCompression);return i?.throwIfAborted(),{data:o}}if(e.offset+e.length>r.leafDirectoryLength)throw new Error("PMTiles directory outside leaf section");s=r.leafDirectoryOffset+e.offset,l=e.length}throw new Error("PMTiles directory depth exceeds four levels")}export{M as getZxy};
|
|
2
|
+
//# sourceMappingURL=getZxy.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/getZxy.js"],
|
|
4
|
+
"sourcesContent": ["import { decodeDirectory } from './decodeDirectory.js';\nimport { decompress } from './decompress.js';\nimport { tileId } from './tileId.js';\nimport { read } from './read.js';\nimport { getHeader } from './getHeader.js';\n\n/** Nearest directory entry at/before the Hilbert ID, then follow leaf pointers. */\n\nexport async function getZxy(backend, z, x, y, signal) {\n if (backend.options.archive && backend.options.archive !== backend && backend.options.archive.getZxy) {\n return backend.options.archive.getZxy(z, x, y, signal);\n }\n const id = tileId(z, x, y);\n signal?.throwIfAborted();\n const header = await getHeader(backend);\n signal?.throwIfAborted();\n if (z < header.minZoom || z > header.maxZoom) {\n return;\n }\n let offset = header.rootDirectoryOffset, length = header.rootDirectoryLength;\n const visited = new Set();\n for (let depth = 0; depth < 4; depth++) {\n if (visited.has(offset)) {\n throw new Error('Cyclic PMTiles directory');\n }\n visited.add(offset);\n const key = `${offset}:${length}`;\n if (!backend._directories.has(key)) {\n if (backend._directories.size >= 32) {\n backend._directories.delete(backend._directories.keys().next().value);\n }\n const pending = read(backend, offset, length)\n .then(data => decompress(data, header.internalCompression))\n .then(decodeDirectory)\n .catch(error => {\n if (backend._directories.get(key) === pending) {\n backend._directories.delete(key);\n }\n throw error;\n });\n backend._directories.set(key, pending);\n }\n const entries = await backend._directories.get(key);\n signal?.throwIfAborted();\n let low = 0, high = entries.length - 1;\n while (low <= high) {\n const mid = (low + high) >> 1;\n if (entries[mid].tileId <= id) {\n low = mid + 1;\n } else {\n high = mid - 1;\n }\n }\n const entry = entries[high];\n if (!entry) {\n return;\n }\n if (entry.runLength) {\n if (id - entry.tileId >= entry.runLength) {\n return;\n }\n if (entry.offset + entry.length > header.tileDataLength) {\n throw new Error('PMTiles tile outside data section');\n }\n const data = await decompress(await read(backend, header.tileDataOffset + entry.offset, entry.length, signal), header.tileCompression);\n signal?.throwIfAborted();\n return { data };\n }\n if (entry.offset + entry.length > header.leafDirectoryLength) {\n throw new Error('PMTiles directory outside leaf section');\n }\n offset = header.leafDirectoryOffset + entry.offset;\n length = entry.length;\n }\n throw new Error('PMTiles directory depth exceeds four levels');\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,mBAAAA,MAAuB,uBAChC,OAAS,cAAAC,MAAkB,kBAC3B,OAAS,UAAAC,MAAc,cACvB,OAAS,QAAAC,MAAY,YACrB,OAAS,aAAAC,MAAiB,iBAI1B,eAAsBC,EAAOC,EAASC,EAAGC,EAAGC,EAAGC,EAAQ,CACrD,GAAIJ,EAAQ,QAAQ,SAAWA,EAAQ,QAAQ,UAAYA,GAAWA,EAAQ,QAAQ,QAAQ,OAC5F,OAAOA,EAAQ,QAAQ,QAAQ,OAAOC,EAAGC,EAAGC,EAAGC,CAAM,EAEvD,MAAMC,EAAKT,EAAOK,EAAGC,EAAGC,CAAC,EACzBC,GAAQ,eAAe,EACvB,MAAME,EAAS,MAAMR,EAAUE,CAAO,EAEtC,GADAI,GAAQ,eAAe,EACnBH,EAAIK,EAAO,SAAWL,EAAIK,EAAO,QACnC,OAEF,IAAIC,EAASD,EAAO,oBAAqBE,EAASF,EAAO,oBACzD,MAAMG,EAAU,IAAI,IACpB,QAASC,EAAQ,EAAGA,EAAQ,EAAGA,IAAS,CACtC,GAAID,EAAQ,IAAIF,CAAM,EACpB,MAAM,IAAI,MAAM,0BAA0B,EAE5CE,EAAQ,IAAIF,CAAM,EAClB,MAAMI,EAAM,GAAGJ,CAAM,IAAIC,CAAM,GAC/B,GAAI,CAACR,EAAQ,aAAa,IAAIW,CAAG,EAAG,CAC9BX,EAAQ,aAAa,MAAQ,IAC/BA,EAAQ,aAAa,OAAOA,EAAQ,aAAa,KAAK,EAAE,KAAK,EAAE,KAAK,EAEtE,MAAMY,EAAUf,EAAKG,EAASO,EAAQC,CAAM,EACzC,KAAKK,GAAQlB,EAAWkB,EAAMP,EAAO,mBAAmB,CAAC,EACzD,KAAKZ,CAAe,EACpB,MAAMoB,GAAS,CACd,MAAId,EAAQ,aAAa,IAAIW,CAAG,IAAMC,GACpCZ,EAAQ,aAAa,OAAOW,CAAG,EAE3BG,CACR,CAAC,EACHd,EAAQ,aAAa,IAAIW,EAAKC,CAAO,CACvC,CACA,MAAMG,EAAU,MAAMf,EAAQ,aAAa,IAAIW,CAAG,EAClDP,GAAQ,eAAe,EACvB,IAAIY,EAAM,EAAGC,EAAOF,EAAQ,OAAS,EACrC,KAAOC,GAAOC,GAAM,CAClB,MAAMC,EAAOF,EAAMC,GAAS,EACxBF,EAAQG,CAAG,EAAE,QAAUb,EACzBW,EAAME,EAAM,EAEZD,EAAOC,EAAM,CAEjB,CACA,MAAMC,EAAQJ,EAAQE,CAAI,EAC1B,GAAI,CAACE,EACH,OAEF,GAAIA,EAAM,UAAW,CACnB,GAAId,EAAKc,EAAM,QAAUA,EAAM,UAC7B,OAEF,GAAIA,EAAM,OAASA,EAAM,OAASb,EAAO,eACvC,MAAM,IAAI,MAAM,mCAAmC,EAErD,MAAMO,EAAO,MAAMlB,EAAW,MAAME,EAAKG,EAASM,EAAO,eAAiBa,EAAM,OAAQA,EAAM,OAAQf,CAAM,EAAGE,EAAO,eAAe,EACrI,OAAAF,GAAQ,eAAe,EAChB,CAAE,KAAAS,CAAK,CAChB,CACA,GAAIM,EAAM,OAASA,EAAM,OAASb,EAAO,oBACvC,MAAM,IAAI,MAAM,wCAAwC,EAE1DC,EAASD,EAAO,oBAAsBa,EAAM,OAC5CX,EAASW,EAAM,MACjB,CACA,MAAM,IAAI,MAAM,6CAA6C,CAC/D",
|
|
6
|
+
"names": ["decodeDirectory", "decompress", "tileId", "read", "getHeader", "getZxy", "backend", "z", "x", "y", "signal", "id", "header", "offset", "length", "visited", "depth", "key", "pending", "data", "error", "entries", "low", "high", "mid", "entry"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/glass.js"],
|
|
4
|
+
"sourcesContent": ["export const glass = [0.12, 0.15, 0.18], tyre = [0.05, 0.05, 0.05];\n"],
|
|
5
|
+
"mappings": "AAAO,MAAMA,EAAQ,CAAC,IAAM,IAAM,GAAI,EAAGC,EAAO,CAAC,IAAM,IAAM,GAAI",
|
|
6
|
+
"names": ["glass", "tyre"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{CELL as u}from"./CELL.js";import{collider as B}from"./collider.js";import{computeBounds as C}from"./computeBounds.js";import{horizontalRay as E}from"./horizontalRay.js";import{traverse as R}from"./traverse.js";import{updateWorldMatrix as S}from"./updateWorldMatrix.js";function F(p,g,_,y,s,l,n){const k=f=>f===p||["terrain","traffic"].includes(f._type);S(p.scene);let h=n,b=null;for(const f of p._shared._layers)k(f)||R(f.root,r=>{if(!r.visible)return!0;if(!r.geometry?.attributes?.position?.data||r.program?.depthTest===!1)return;r.geometry.bounds||C(r.geometry);const o=r.worldMatrix,{center:e,radius:v}=r.geometry.bounds;if(Math.hypot(o[0]*e[0]+o[4]*e[1]+o[8]*e[2]+o[12]-g,o[2]*e[0]+o[6]*e[1]+o[10]*e[2]+o[14]-y)>v*Math.hypot(o[0],o[1],o[2])+n)return;const t=B(r),a=g-o[12]+t.origin[0],w=_-o[13]+t.origin[1],m=y-o[14]+t.origin[2],x=new Set;for(let c=Math.floor(Math.min(a,a+s*n)/u);c<=Math.floor(Math.max(a,a+s*n)/u);c++)for(let M=Math.floor(Math.min(m,m+l*n)/u);M<=Math.floor(Math.max(m,m+l*n)/u);M++)for(const i of t.cells.get(c+","+M)||[])if(!(x.has(i)||s*t.nrm[i*2]+l*t.nrm[i*2+1]>=0)){x.add(i);for(const L of[.4,1.5]){const d=E(t.tri,i,a,w+L,m,s,l);d>=0&&d<h&&(h=d,b=[t.nrm[i*2],t.nrm[i*2+1]])}}});return b}export{F as hit};
|
|
2
|
+
//# sourceMappingURL=hit.js.map
|