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
package/README.md
CHANGED
|
@@ -1,3 +1,79 @@
|
|
|
1
|
-
#
|
|
1
|
+
# leaflet-city-mapper
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/leaflet-city-mapper)
|
|
4
|
+
[](LICENSE)
|
|
5
|
+
|
|
6
|
+
**Your data, on a rotated and pitched Leaflet map:** a small 3D rendering engine (WebGPU) packaged onto standard `L.Layer`. Available sources: extruded GeoJSON, glTF models, raster PMTiles and terrain layers.
|
|
7
|
+
|
|
8
|
+
<p align="center">
|
|
9
|
+
<a href="https://raruto.github.io/leaflet-city-mapper/examples/leaflet-city-mapper.html"><img src="https://raruto.github.io/img/leaflet-city-mapper.png" alt="Leaflet 3D City Mapper" /></a>
|
|
10
|
+
</p>
|
|
11
|
+
|
|
12
|
+
_For a working example see one of the following demos:_
|
|
13
|
+
|
|
14
|
+
- [City of Paris in 3D](https://raruto.github.io/leaflet-city-mapper/examples/leaflet-city-mapper.html)
|
|
15
|
+
- [Ancient Rome in 3D](https://raruto.github.io/leaflet-city-mapper/examples/leaflet-city-mapper-geojson.html)
|
|
16
|
+
- [Native Leaflet layers on WebGPU](https://raruto.github.io/leaflet-city-mapper/examples/examples/leaflet-city-mapper-native.html)
|
|
17
|
+
|
|
18
|
+
## How to use
|
|
19
|
+
|
|
20
|
+
Load Leaflet (the only runtime dependency), then this plugin:
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
```html
|
|
24
|
+
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9/dist/leaflet.css">
|
|
25
|
+
<script src="https://unpkg.com/leaflet@1.9/dist/leaflet.js"></script>
|
|
26
|
+
<script src="https://unpkg.com/leaflet-city-mapper@0.0.2/dist/leaflet-city-mapper.js"></script>
|
|
27
|
+
```
|
|
28
|
+
And then set an approriate `source` param to layer constructor:
|
|
29
|
+
|
|
30
|
+
```js
|
|
31
|
+
new L.Layer({ source: .. })
|
|
32
|
+
```
|
|
33
|
+
For example, here you can use a `geojson` object, like this:
|
|
34
|
+
|
|
35
|
+
```js
|
|
36
|
+
const buildings = new L.Layer({
|
|
37
|
+
source: {
|
|
38
|
+
type: 'geojson',
|
|
39
|
+
url: GeoJSON,
|
|
40
|
+
style: ({ properties }) => ({ top: properties.height, color: properties.color }),
|
|
41
|
+
tooltip: ({ properties }) => `${properties.name}: ${properties.height} m`,
|
|
42
|
+
},
|
|
43
|
+
}).addTo(map);
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Vector and raster layers are initialized in [`src/index.js`](./src/index.js); their rendering utilities are loaded only when needed. Terrain, sunlight, traffic and walk initializers are also loaded lazily from [`src/utils`](./src/utils).
|
|
47
|
+
|
|
48
|
+
### Update demo data
|
|
49
|
+
|
|
50
|
+
The Paris example makes extensive use of [PMTiles](./build/pmtiles.js) to ensure offline access / long-term availability of the map. To update them:
|
|
51
|
+
|
|
52
|
+
```shell
|
|
53
|
+
npm run pmtiles
|
|
54
|
+
node build/pmtiles.js --only=trees
|
|
55
|
+
node build/pmtiles.js --jobs=6
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
All archives use the buildings bbox (default: `2.26,48.835,2.38,48.885`). Use `--bbox=west,south,east,north` to override it.
|
|
60
|
+
|
|
61
|
+
### Build Guide
|
|
62
|
+
|
|
63
|
+
Within your local development environment:
|
|
64
|
+
|
|
65
|
+
```shell
|
|
66
|
+
git clone git@github.com:Raruto/leaflet-city-mapper.git
|
|
67
|
+
cd ./leaflet-city-mapper
|
|
68
|
+
|
|
69
|
+
npm i # install dependencies
|
|
70
|
+
npm run dev # start dev server at: http://localhost:8080
|
|
71
|
+
npm run build # generate "dist" files (once)
|
|
72
|
+
npm run test # build and run browser tests
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
After that you can start developing inside the `src` folder (eg. open "http://localhost:8080/examples" in your browser to preview changes).
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
**Compatibile with:**
|
|
79
|
+
[](http://leafletjs.com/reference.html) [](http://leafletjs.com/reference.html)
|
package/cucumber.mjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var f=Object.defineProperties({},Object.getOwnPropertyDescriptors(L.Map.prototype)),k=Math.PI/180,_=e=>Array.isArray(e)?new L.Point(e[0],e[1]):new L.Point(e.x,e.y);L.Map.mergeOptions({rotate:!0,bearing:0,pitch:0,pitchMaxDistance:3,rotateControl:!0,shiftKeyRotate:!0,pitchDrag:!0,touchRotate:!1,touchPitch:!1,compassBearing:!1});function H(e){let t=e.getBearing()*k,i=e.getPitch()*k;return[Math.cos(t),Math.sin(t),Math.cos(i),Math.sin(i)]}function B(e,t,i=!1,a=!1){let n=e.getSize().divideBy(2),o=e.getSize().y*1.5;if(!o)return _(t);let[s,r,d,h]=H(e),l=_(t).subtract(n);if(i){let p=e.getSize().y*e.options.pitchMaxDistance,P=d*o+h*l.y,y=P>0?l.y*o/P:-p;a&&(y=Math.max(-p,Math.min(p,y)));let v=l.x*(o-h*y)/o;return new L.Point(s*v+r*y,-r*v+s*y).add(n)}let u=s*l.x-r*l.y,g=r*l.x+s*l.y,c=o/(o-h*g);return new L.Point(u*c,d*g*c).add(n)}function R(e,t){return e.layerPointToContainerPoint(t).subtract(e._getMapPanePos())}function I(e,t,i=!1){let a=e._cameraView;if(!a)return t;let n=e.getSize().divideBy(2),o=e.getZoomScale(a.zoom),s=e.project(e.getCenter(),a.zoom).subtract(e.project(a.center,a.zoom));return i?t.subtract(n).subtract(s).divideBy(o).add(n):t.subtract(n).multiplyBy(o).add(s).add(n)}function Z(e,t=[0,0]){let i=_(t).divideBy(2),a=e.getSize().subtract(i);return new L.Bounds([[i.x,i.y],[a.x,i.y],[i.x,a.y],[a.x,a.y]].map(n=>B(e,n,!0,!0)))}function V(e,t,i={}){t=t.getBounds?t.getBounds():t instanceof L.LatLngBounds?t:new L.LatLngBounds(t);let a=e.getZoom()??0,n=e.getSize().divideBy(2),o=e.getSize().y*1.5,s=_(i.paddingTopLeft||i.padding||[0,0]).subtract(n),r=n.subtract(_(i.paddingBottomRight||i.padding||[0,0])),[d,h,l,u]=H(e),g=e.getSize().y*e.options.pitchMaxDistance,c=m=>l*o+u*m>0?Math.max(-g,Math.min(g,m*o/(l*o+u*m))):-g,p=c(s.y),P=c(r.y),y=e.project(t.getNorthWest(),a).add(e.project(t.getSouthEast(),a)).divideBy(2),v=[t.getNorthWest(),t.getNorthEast(),t.getSouthWest(),t.getSouthEast()].map(m=>{let S=e.project(m,a).subtract(y);return new L.Point(d*S.x-h*S.y,h*S.x+d*S.y)}),O=Math.min(...v.map(m=>m.y)),N=Math.max(...v.map(m=>m.y)),j=s.x*u/o,z=r.x*u/o,T=z-j,C=Math.min(...v.map(m=>m.x+j*m.y)),U=Math.max(...v.map(m=>m.x+z*m.y)),X=Math.min((P-p)/(N-O),(r.x-s.x-T*p)/(U-C-T*O)),x=e.getScaleZoom(X,a),A=e.options.zoomSnap;if(A&&(x=Math.floor(Math.round(x/(A/100))/100)*A),x=Math.max(e.getMinZoom(),Math.min(e.getMaxZoom(),i.maxZoom??1/0,x)),!Number.isFinite(x))return{center:t.getCenter(),zoom:x};let w=e.getZoomScale(x,a),$=N*w-P,W=O*w-p,Y=Math.max($,T?(w*(U-C)-r.x+s.x)/T:$),D=(Math.min(W,Y)+W)/2,q=(w*(C+U)-s.x-r.x-(j+z)*D)/2,Q=y.add(new L.Point(d*q+h*D,-h*q+d*D).divideBy(w));return{center:e.unproject(Q,a),zoom:x}}function J(){let e=this.getSize().y,t=this.getPitch()*k,i=e*this.options.pitchMaxDistance,a=e*1.5,n=e/2-i*Math.cos(t)*a/(a+Math.sin(t)*i);n>0&&!this._pitchSky&&(this._pitchSky=L.DomUtil.create("div","leaflet-pitch-sky",this.getContainer()),this._pitchSky.setAttribute("aria-hidden","true"),this._pitchSky.style.cssText="position:absolute;inset:0 0 auto;height:0;z-index:0;pointer-events:none;background:var(--leaflet-sky-background,linear-gradient(#9ec5e8,#dfe9f0))"),this._pitchSky&&(this._pitchSky.style.height=`${Math.max(0,Math.ceil(n))}px`,this._pitchSky.style.display=n>0?"":"none")}L.Map.include({getBearing(){return this._cameraBearing??0},getPitch(){return this._cameraPitch??0},_stopPitchBearingAnimation(){return cancelAnimationFrame(this._cameraFrame),this._cameraFrame=null,this},_setPitchAndBearing(e,t){if(!Number.isFinite(e)||!Number.isFinite(t))throw new TypeError("Camera angles must be finite numbers");let i=this.getPitch(),a=this.getBearing();return this._cameraPitch=Math.max(0,Math.min(85,e)),this._cameraBearing=(t%360+360)%360,this._loaded&&(J.call(this),a!==this.getBearing()&&this.fire("rotate",{bearing:this.getBearing()}),i!==this.getPitch()&&this.fire("pitch",{pitch:this.getPitch()})),this},_animateCamera(e,t,i={}){if(cancelAnimationFrame(this._cameraFrame),!Number.isFinite(e)||!Number.isFinite(t))throw new TypeError("Camera angles must be finite numbers");if(!i.animate||matchMedia("(prefers-reduced-motion: reduce)").matches)return this._setPitchAndBearing(e,t);let a=i.duration??.3;if(!Number.isFinite(a)||a<0)throw new TypeError("Camera duration must be nonnegative");let n=performance.now(),o=this.getPitch(),s=this.getBearing(),r=((t-s)%360+540)%360-180,d=h=>{let l=a?Math.min(1,(h-n)/(a*1e3)):1,u=1-(1-l)**3;this._setPitchAndBearing(o+(Math.max(0,Math.min(85,e))-o)*u,s+r*u),l<1&&(this._cameraFrame=requestAnimationFrame(d))};return this._cameraFrame=requestAnimationFrame(d),this},setBearing(e,t){return this._animateCamera(this.getPitch(),e,t)},setPitch(e,t){return this._animateCamera(e,this.getBearing(),t)},resetNorth(e={animate:!0}){return this.setBearing(0,e)},resetNorthPitch(e={animate:!0}){return this._animateCamera(0,0,e)},layerPointToContainerPoint(e){return B(this,I(this,f.layerPointToContainerPoint.call(this,e)))},containerPointToLayerPoint(e){return f.containerPointToLayerPoint.call(this,I(this,B(this,e,!0),!0))},_getCenterLayerPoint(){return f.containerPointToLayerPoint.call(this,this.getSize().divideBy(2))},_updateCameraOverlays(){for(let e of Object.values(this._layers))e instanceof L.Marker?e.update():(e instanceof L.Popup||e instanceof L.Tooltip)&&e._updatePosition()},panBy(e,t){let i=this.getSize().divideBy(2),a=i.subtract(B(this,i.subtract(_(e)),!0));return f.panBy.call(this,a,t)},setZoomAround(e,t,i){if(!this.getPitch()&&!this.getBearing())return f.setZoomAround.call(this,e,t,i);t=this._limitZoom(t);let a=this.getZoomScale(t),n=this.getSize().divideBy(2),o=e instanceof L.Point?e:this.latLngToContainerPoint(e),s=this.containerPointToLayerPoint(n),r=this.containerPointToLayerPoint(o),d=s.add(r.subtract(s).multiplyBy(1-1/a));return this.setView(this.layerPointToLatLng(d),t,{zoom:i})},panInside(e,t={}){if(!this.getPitch()&&!this.getBearing())return f.panInside.call(this,e,t);let i=_(t.paddingTopLeft||t.padding||[0,0]),a=this.getSize().subtract(_(t.paddingBottomRight||t.padding||[0,0])),n=this.latLngToContainerPoint(e),o=new L.Point(Math.max(i.x,Math.min(a.x,n.x)),Math.max(i.y,Math.min(a.y,n.y)));if(o.equals(n))return this;let s=this.latLngToLayerPoint(e).subtract(this.containerPointToLayerPoint(o));return this.panTo(this.unproject(this.project(this.getCenter()).add(s)),t)},_limitCenter(e,t,i){if(!i||!this._loaded||!this.getPitch()&&!this.getBearing())return f._limitCenter.call(this,e,t,i);let a=this.getSize().divideBy(2),n=Z(this),o=this.project(e,t),s=new L.Bounds(o.add(n.min.subtract(a)),o.add(n.max.subtract(a))),r=this._getBoundsOffset(s,i,t);return Math.abs(r.x)<=1&&Math.abs(r.y)<=1?e:this.unproject(o.add(r),t)},_limitOffset(e,t){if(!t||!this.getPitch()&&!this.getBearing())return f._limitOffset.call(this,e,t);let i=this.getSize().divideBy(2),a=i.subtract(B(this,i.subtract(e),!0)),n=this.project(this.getCenter()),o=this.project(this._limitCenter(this.unproject(n.add(a)),this.getZoom(),t));return i.subtract(B(this,i.subtract(o.subtract(n))))},_getBoundsCenterZoom(e,t){return this.getPitch()||this.getBearing()?V(this,e,t):f._getBoundsCenterZoom.call(this,e,t)},getBoundsZoom(e,t,i){if(!this.getPitch()&&!this.getBearing())return f.getBoundsZoom.call(this,e,t,i);if(!t)return V(this,e,{padding:_(i||[0,0]).divideBy(2)}).zoom;e=e instanceof L.LatLngBounds?e:new L.LatLngBounds(e);let a=Z(this,i).getSize(),n=this.project(e.getSouthEast()).subtract(this.project(e.getNorthWest())),o=this.getScaleZoom(Math.max(a.x/n.x,a.y/n.y)),s=this.options.zoomSnap;return Math.max(this.getMinZoom(),Math.min(this.getMaxZoom(),s?Math.ceil(o/s)*s:o))},_tryAnimatedPan(e,t){let i=this._getCenterOffset(e)._trunc();return t?.animate!==!0&&!this.getSize().contains(i)?!1:(f.panBy.call(this,i,t),!0)},getBounds(){if(!this.getPitch()&&!this.getBearing())return f.getBounds.call(this);let e=Z(this),t=new L.LatLngBounds;for(let i of[e.min,e.max]){let a=f.containerPointToLayerPoint.call(this,I(this,i,!0));t.extend(this.layerPointToLatLng(a))}return t}});L.Map.addInitHook(function(){if(!document.getElementById("leaflet-camera-zoom-style")){let e=document.createElement("style");e.id="leaflet-camera-zoom-style",e.textContent=[".leaflet-marker-icon",".leaflet-marker-shadow",".leaflet-popup",".leaflet-tooltip"].map(t=>`.leaflet-camera-zoom ${t}`).join(",")+"{transition:none!important}",document.head.append(e)}this._setPitchAndBearing(this.options.pitch,this.options.bearing),this.on("load resize pitch",J),this.on("rotate pitch",()=>{this.options.maxBounds&&this._panInsideMaxBounds()}),this.once("unload",()=>{cancelAnimationFrame(this._cameraFrame),this._pitchSky?.remove()}),this.whenReady(()=>{let e=this.dragging?._draggable;if(!e)return;let t=()=>{if(!this.getPitch()&&!this.getBearing())return;let i=this.getSize().divideBy(2),a=e._newPos.subtract(e._startPos),n=i.subtract(B(this,i.subtract(a),!0));e._newPos=e._startPos.add(n)};e.on("predrag",t),this.once("unload",()=>e.off("predrag",t))}),(this.options.rotate||this.options.trackContainerMutation)&&(this.cameraReady=import("./utils/cameraControls.js").then(({cameraControls:e})=>{this._container?._leaflet_id&&e(this)}),this.cameraReady.catch(e=>this.fire("error",{error:e})))});var b=Object.defineProperties({},Object.getOwnPropertyDescriptors(L.Marker.prototype));L.Marker.mergeOptions({rotation:0,rotateWithView:!1,keepUpright:!1,scale:1});L.Marker.include({setIcon(e){e instanceof L.DivIcon||(e.options.crossOrigin||=!0);let t=b.setIcon.call(this,e);return this._map&&!(e instanceof L.DivIcon)&&this._initNativeGPU(this._map),t},setRotation(e){if(!Number.isFinite(e))throw new TypeError("Marker rotation must be finite");return this.options.rotation=e,this.update(),this._nativeGPU?.refresh?.(),this},_cameraIconPoint(e,t){let i=this.options.rotation+(this.options.rotateWithView?this._map.getBearing()*k:0);this.options.keepUpright&&Math.cos(i)<0&&(i+=Math.PI);let a=this.options.scale;return new L.Point((e*Math.cos(i)-t*Math.sin(i))*a,(e*Math.sin(i)+t*Math.cos(i))*a)},getEvents(){return{...b.getEvents.call(this),rotate:this.update,pitch:this.update,move:this.update}},_setPos(e){b._setPos.call(this,R(this._map,e));for(let[t,i]of[[this._icon,"iconAnchor"],[this._shadow,"shadowAnchor"]]){if(!t)continue;let a=this._cameraIconPoint(1,0),n=this.options.icon.options,o=n[i]||n.iconAnchor;t.style.transformOrigin=o?`${o.x??o[0]}px ${o.y??o[1]}px`:"center",t.style.transform+=` rotate(${Math.atan2(a.y,a.x)}rad) scale(${this.options.scale})`}},_updateZIndex(e){b._updateZIndex.call(this,e);let t=this._cameraZIndexOffset!==e;this._cameraZIndexOffset=e,t&&this._nativeGPU?.refresh?.()},_initInteraction(){let e=b._initInteraction.call(this);return tt.call(this),e}});function tt(){if(!this.dragging||this.dragging._cameraDrag)return;let e=this.dragging,t=e._onDrag,i=e._adjustPan;e._onDrag=function(n){let o=this._marker._map,s=L.DomUtil.getPosition(this._marker._icon).add(o._getMapPanePos()),r=o.containerPointToLayerPoint(s),d=this._marker._icon;L.DomUtil.setPosition(d,r),t.call(this,n),this._marker._setPos(r)},e._adjustPan=function(n){let o=this._marker,s=o._map;if(!s.getPitch()&&!s.getBearing())return i.call(this,n);let r=L.DomUtil.getPosition(o._icon).add(s._getMapPanePos()),d=s.getSize(),h=_(o.options.autoPanPadding),l=o.options.autoPanSpeed,u=new L.Point((Math.max(0,r.x-d.x+h.x)-Math.max(0,h.x-r.x))/Math.max(1,h.x)*l,(Math.max(0,r.y-d.y+h.y)-Math.max(0,h.y-r.y))/Math.max(1,h.y)*l);if(!u.x&&!u.y)return;let g=s._getMapPanePos();s.panBy(u,{animate:!1});let c=g.subtract(s._getMapPanePos());this._draggable._newPos._add(c),this._draggable._startPos._add(c),L.DomUtil.setPosition(o._icon,this._draggable._newPos),this._onDrag(n),this._panRequest=requestAnimationFrame(()=>this._adjustPan(n))},e.enabled()&&(e._draggable.off("drag",t,e),e._draggable.on("drag",e._onDrag,e)),e._cameraDrag=!0}for(let e of[L.Popup,L.Tooltip]){let t=e.prototype.getEvents;e.include({getEvents(){return{...t.call(this),rotate:this._updatePosition,pitch:this._updatePosition,move:this._updatePosition}}})}var et=L.Popup.prototype._updatePosition,it=L.Popup.prototype._adjustPan;L.Popup.include({_adjustPan(){let e=this._map;if(!e.getPitch()&&!e.getBearing())return it.call(this);if(!this.options.autoPan)return;if(e._panAnim&&e._panAnim.stop(),this._autopanning){this._autopanning=!1;return}let t=this._container.getBoundingClientRect(),i=e.getContainer().getBoundingClientRect(),a=_(this.options.autoPanPaddingTopLeft||this.options.autoPanPadding),n=e.getSize().subtract(_(this.options.autoPanPaddingBottomRight||this.options.autoPanPadding)),o=t.left-i.left,s=t.top-i.top,r=t.right-i.left,d=t.bottom-i.top,h=Math.min(0,o-a.x)||Math.max(0,r-n.x),l=Math.min(0,s-a.y)||Math.max(0,d-n.y);if(!h&&!l)return;this.options.keepInView&&(this._autopanning=!0);let u=e.latLngToContainerPoint(this._latlng).subtract(new L.Point(h,l)),g=e.latLngToLayerPoint(this._latlng).subtract(e.containerPointToLayerPoint(u));e.fire("autopanstart"),e.panTo(e.unproject(e.project(e.getCenter()).add(g)))},_updatePosition(){if(et.call(this),!this._map)return;let e=this._map.latLngToLayerPoint(this._latlng),t=R(this._map,e).subtract(e);this._zoomAnimated?L.DomUtil.setPosition(this._container,L.DomUtil.getPosition(this._container).add(t)):(this._container.style.left=`${this._containerLeft+t.x}px`,this._container.style.bottom=`${this._containerBottom-t.y}px`)}});var nt=L.Tooltip.prototype._setPosition;L.Tooltip.include({_setPosition(e){nt.call(this,e);let t=R(this._map,e).subtract(e);L.DomUtil.setPosition(this._container,L.DomUtil.getPosition(this._container).add(t))}});var at=L.GridLayer.prototype._getTiledPixelBounds,ot=L.GridLayer.prototype.getEvents;L.GridLayer.include({getEvents(){let e=ot.call(this);return this._cameraGridUpdate||=L.Util.throttle(this._onMoveEnd,this.options.updateInterval,this),{...e,rotate:this._cameraGridUpdate,pitch:this._cameraGridUpdate}},_getTiledPixelBounds(e){if(!this._map.getBearing()&&!this._map.getPitch())return at.call(this,e);let t=this._map.getBounds();return new L.Bounds(this._map.project(t.getNorthWest(),this._tileZoom),this._map.project(t.getSouthEast(),this._tileZoom))}});var G=Object.defineProperties({},Object.getOwnPropertyDescriptors(L.Layer.prototype)),E=Promise.resolve(),M,st,F,K;L.Layer._renderers=new WeakMap;L.Layer._nextId=0;L.Layer.include({_layerAdd(e){let t=!this._3d&&(this instanceof L.GridLayer||this instanceof L.Polyline||this instanceof L.CircleMarker||this instanceof L.Marker&&!(this.options.icon instanceof L.DivIcon)||this instanceof L.ImageOverlay&&!(this instanceof L.VideoOverlay)&&!(this instanceof L.SVGOverlay));t&&((this instanceof L.GridLayer||this instanceof L.ImageOverlay)&&(this.options.crossOrigin||=!0),this instanceof L.Marker&&(this.options.icon.options.crossOrigin||=!0)),G._layerAdd.call(this,e),!(!t||!e.target.hasLayer(this))&&this._initNativeGPU(e.target)},_initNativeGPU(e){if(this._nativeGPU)return;if(!document.getElementById("leaflet-webgpu-targets")){let i=document.createElement("style");i.id="leaflet-webgpu-targets",i.textContent=".leaflet-webgpu-target{opacity:0!important}",document.head.append(i)}let t=this._nativeGPU={source:this,map:e,hidden:new Set};t.hide=()=>{let i=this instanceof L.Marker&&this.options.icon instanceof L.DivIcon,a=[i?null:this._icon,i?null:this._shadow];for(let n of t.hidden)a.includes(n)||(n.classList.remove("leaflet-webgpu-target"),t.hidden.delete(n));for(let n of a)!n||t.hidden.has(n)||(n.classList.add("leaflet-webgpu-target"),t.hidden.add(n))},t.hide(),this.once("remove",()=>{this._nativeGPU===t&&(this._nativeGPU=null),t.dispose?.();for(let i of t.hidden)i.classList.remove("leaflet-webgpu-target")}),K||=import("./utils/nativeLayer.js"),this.ready=K.then(({nativeLayer:i})=>this._nativeGPU!==t?this:i(t)),this.ready.catch(i=>this.fire("error",{error:i}))},_init3D(e={}){let t=this,i=st||=Promise.all([import("./utils/onAdd3DLayer.js"),import("./utils/onRemove3DLayer.js"),import("./utils/updateArea.js"),import("./utils/onTerrainChange.js")]).then(([n,o,s,r])=>M={...n,...o,...s,...r});t._3d=!0,L.Util.setOptions(t,{ariaLabel:"3D scene",...e}),t.onAdd=n=>{if(M)return M.onAdd3DLayer(t,n);i.then(({onAdd3DLayer:o})=>{t._map===n&&o(t,n)}).catch(o=>t.fire("error",{error:o}))},t.onRemove=n=>{if(M)return M.onRemove3DLayer(t,n);i.then(({onRemove3DLayer:o})=>o(t,n)).catch(o=>t.fire("error",{error:o}))},t.getEvents=()=>{let n={};return t.url&&(n.moveend=n.zoomend=n.rotate=n.pitch=n.resize=()=>M?M.updateArea(t):i.then(({updateArea:o})=>o(t))),(t._geojson||t.url)&&(n.terrainchange=()=>M?M.onTerrainChange(t):i.then(({onTerrainChange:o})=>o(t))),n};let a=!t._geojson&&/\.(glb|gltf)(?:[?#]|$)/i.test(t.options.url);t.modelUrl=a?t.options.url:null,t.url=t.options.url&&!a&&!t._geojson?new URL(t.options.url,document.baseURI).href:null,t._directories=new Map,t.options.center&&(t.location=new L.LatLng(t.options.center[0],t.options.center[1])),t._areas=new Map,t._inflight=0,t._added=Promise.withResolvers(),queueMicrotask(async()=>{try{await i,t.root=(await import("./utils/emptyNode.js")).emptyNode(),t.raycaster={origin:[0,0,0],direction:[0,0,0]},(t.url||t._geojson)&&(t.group=t.root,t.url&&(t.header=await(await import("./utils/getHeader.js")).getHeader(t))),t._map&&(await(await import("./utils/attach.js")).attach(t,t._map),t._added.resolve()),t.modelUrl&&await(await import("./utils/loadModel.js")).loadModel(t),t._shared&&(await import("./utils/update.js")).update(t),t.fire("ready")}catch(n){t.fire("error",{error:n})}})},_initRaster(e){let t=this,[{read:i},{getHeader:a},{getZxy:n},{onPMTileAdd:o},{onPMTileRemove:s},{getRasterTileSize:r,updateRasterTiles:d},{setPMTileOpacity:h},{setPMTileZIndex:l},{emptyNode:u}]=F;t._read=(c,p,P)=>i(t,c,p,P),t.getHeader=()=>a(t),t.getZxy=(c,p,P,y)=>n(t,c,p,P,y),t.getTileSize=()=>r(),t.isLoading=()=>t._loadingTiles>0,t.setOpacity=c=>h(t,c),t.setZIndex=c=>l(t,c),t.onAdd=c=>o(t,c),t.onRemove=c=>s(t,c);let g=()=>d(t);t.getEvents=()=>({moveend:g,zoomend:g,rotate:g,pitch:g,resize:g}),e={ariaLabel:"PMTiles raster",maxZoom:18,opacity:1,zIndex:0,...e},L.Util.setOptions(t,e),t.root=u(),t._areas=new Map,t._rasterTiles=new Map,t._loadingTiles=0,t._added=Promise.withResolvers(),t.url=new URL(e.url,document.baseURI).href,t._directories=new Map,t.ready=Promise.resolve(t.options.archive||t).then(async c=>{let p=await c.getHeader();return t.options.archive=c,t.header=p,t.options.maxNativeZoom===void 0&&(t.options.maxNativeZoom=p.maxZoom),t.options.maxZoom=Math.max(t.options.minZoom||0,t.options.maxZoom),t.fire("ready"),t}).catch(c=>{throw t.fire("error",{error:c}),c})},initialize(e={}){if(Object.getPrototypeOf(this)!==L.Layer.prototype||!e.source){if(G.initialize)return G.initialize.apply(this,arguments);L.Util.setOptions(this,e);return}let{source:{type:t=e.source.data?.type==="FeatureCollection"?"geojson":/\.pmtiles(?:[?#]|$)/i.test(e.source.url)?"pmtiles":"3d",...i},...a}=e,n={...i,...a};if(L.Util.setOptions(this,a),this._type=t,t==="3d"){this._init3D(n);return}if(t==="pmtiles"&&F){this._initRaster(n);return}this.onAdd=()=>{},this.onRemove=()=>{},E=E.catch(()=>{}).then(async()=>{switch(t){case"geojson":{let{setGeoJSONData:s}=await import("./utils/setGeoJSONData.js");return(r,d)=>{r._geojson=!0,r.setData=h=>s(r,h),r._init3D(d)}}case"pmtiles":return F=await Promise.all([import("./utils/read.js"),import("./utils/getHeader.js"),import("./utils/getZxy.js"),import("./utils/onPMTileAdd.js"),import("./utils/onPMTileRemove.js"),import("./utils/rasterTiles.js"),import("./utils/setPMTileOpacity.js"),import("./utils/setPMTileZIndex.js"),import("./utils/emptyNode.js")]),(s,r)=>s._initRaster(r);case"terrain":return(await import("./utils/initTerrain.js")).initTerrain;case"sunlight":return(await import("./utils/initSunlight.js")).initSunlight;case"traffic":return(await import("./utils/initTraffic.js")).initTraffic;case"walk":return(await import("./utils/initWalk.js")).initWalk;default:throw new Error(`Unknown layer type: ${t}`)}});let o=this.ready=E.then(s=>{let r=this._map;return r?.removeLayer(this),delete this.onAdd,delete this.onRemove,s(this,n),r?.addLayer(this),this.ready===o?this:this.ready});o.catch(s=>this.fire("error",{error:s}))}});L.Layer.addInitHook(function(){if(this instanceof L.Polyline||this instanceof L.CircleMarker){let e=()=>this._nativeGPU?.refresh?.();if(this.beforeAdd=this.onAdd=this.onRemove=this._updateBounds=()=>{},this.getEvents=()=>({}),this._renderer={options:{tolerance:0},_updatePath:e,_updateStyle:e,_bringToFront:()=>this._nativeGPU?.reorder?.(!0),_bringToBack:()=>this._nativeGPU?.reorder?.(!1)},this instanceof L.Polyline){let t=this.closestLayerPoint;this.closestLayerPoint=function(i){return this._project(),this._parts=this._rings,t.call(this,i)}}if(this instanceof L.Circle){let t=this.getBounds;this.getBounds=function(){return this._project(),t.call(this)}}}else if(this instanceof L.GridLayer){let e=this._initContainer;this._initContainer=function(){e.call(this),this._container.remove()},this._updateOpacity=function(){if(!this._map)return;let t=Date.now(),i=!1,a=!1;for(let n of Object.values(this._tiles||{}))!n.current||!n.loaded||(n._gpuOpacity=this._map._fadeAnimated?Math.min(1,(t-n.loaded)/200):1,n._gpuOpacity<1?i=!0:n.active||(this._onOpaqueTile(n),n.active=!0,a=!0));a&&!this._noPrune&&this._pruneTiles(),this._nativeGPU?.refresh?.(),cancelAnimationFrame(this._fadeFrame),i&&(this._fadeFrame=requestAnimationFrame(()=>this._updateOpacity()))}}else this instanceof L.ImageOverlay&&!(this instanceof L.VideoOverlay)&&!(this instanceof L.SVGOverlay)&&(this.onAdd=function(){this._image||this._initImage(),this._image.complete&&this._image.naturalWidth&&queueMicrotask(()=>this.fire("load"))},this.onRemove=()=>{},this.getEvents=()=>({}),this._reset=()=>this._nativeGPU?.refresh?.())});
|
|
2
|
+
//# sourceMappingURL=leaflet-city-mapper.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utils/mapCamera.js", "../src/index.js"],
|
|
4
|
+
"sourcesContent": ["const mapMethods = Object.defineProperties({}, Object.getOwnPropertyDescriptors(L.Map.prototype));\r\nconst radians = Math.PI / 180;\r\nconst pointOf = point => Array.isArray(point) ? new L.Point(point[0], point[1]) : new L.Point(point.x, point.y);\r\n\r\nL.Map.mergeOptions({\r\n rotate: true, bearing: 0, pitch: 0, pitchMaxDistance: 3,\r\n rotateControl: true, shiftKeyRotate: true, pitchDrag: true,\r\n touchRotate: false, touchPitch: false, compassBearing: false,\r\n});\r\n\r\nfunction angles(map) {\r\n const bearing = map.getBearing() * radians, pitch = map.getPitch() * radians;\r\n return [Math.cos(bearing), Math.sin(bearing), Math.cos(pitch), Math.sin(pitch)];\r\n}\r\n\r\n// Ground coordinates only: the GPU camera handles elevated geometry, never CSS transforms.\r\nfunction project(map, point, inverse = false, limit = false) {\r\n const half = map.getSize().divideBy(2), distance = map.getSize().y * 1.5;\r\n if (!distance) return pointOf(point);\r\n const [cos, sin, tilt, rise] = angles(map);\r\n const p = pointOf(point).subtract(half);\r\n if (inverse) {\r\n const far = map.getSize().y * map.options.pitchMaxDistance;\r\n const denominator = tilt * distance + rise * p.y;\r\n let v = denominator > 0 ? p.y * distance / denominator : -far;\r\n if (limit) v = Math.max(-far, Math.min(far, v));\r\n const u = p.x * (distance - rise * v) / distance;\r\n return new L.Point(cos * u + sin * v, -sin * u + cos * v).add(half);\r\n }\r\n const u = cos * p.x - sin * p.y, v = sin * p.x + cos * p.y;\r\n const scale = distance / (distance - rise * v);\r\n return new L.Point(u * scale, tilt * v * scale).add(half);\r\n}\r\n\r\nfunction displayPoint(map, point) {\r\n return map.layerPointToContainerPoint(point).subtract(map._getMapPanePos());\r\n}\r\n\r\nfunction animationPoint(map, point, inverse = false) {\r\n const view = map._cameraView;\r\n if (!view) return point;\r\n const half = map.getSize().divideBy(2), scale = map.getZoomScale(view.zoom);\r\n const shift = map.project(map.getCenter(), view.zoom).subtract(map.project(view.center, view.zoom));\r\n return inverse ? point.subtract(half).subtract(shift).divideBy(scale).add(half) :\r\n point.subtract(half).multiplyBy(scale).add(shift).add(half);\r\n}\r\n\r\nfunction groundBounds(map, padding = [0, 0]) {\r\n const min = pointOf(padding).divideBy(2), max = map.getSize().subtract(min);\r\n return new L.Bounds([[min.x, min.y], [max.x, min.y], [min.x, max.y], [max.x, max.y]]\r\n .map(point => project(map, point, true, true)));\r\n}\r\n\r\nfunction fitCameraBounds(map, bounds, options = {}) {\r\n bounds = bounds.getBounds ? bounds.getBounds() : bounds instanceof L.LatLngBounds ? bounds : new L.LatLngBounds(bounds);\r\n const zoom = map.getZoom() ?? 0, half = map.getSize().divideBy(2), distance = map.getSize().y * 1.5;\r\n const min = pointOf(options.paddingTopLeft || options.padding || [0, 0]).subtract(half);\r\n const max = half.subtract(pointOf(options.paddingBottomRight || options.padding || [0, 0]));\r\n const [cos, sin, tilt, rise] = angles(map);\r\n const far = map.getSize().y * map.options.pitchMaxDistance;\r\n const vertical = y => tilt * distance + rise * y > 0\r\n ? Math.max(-far, Math.min(far, y * distance / (tilt * distance + rise * y))) : -far;\r\n const top = vertical(min.y), bottom = vertical(max.y);\r\n const origin = map.project(bounds.getNorthWest(), zoom).add(map.project(bounds.getSouthEast(), zoom)).divideBy(2);\r\n const points = [bounds.getNorthWest(), bounds.getNorthEast(), bounds.getSouthWest(), bounds.getSouthEast()]\r\n .map(latlng => {\r\n const p = map.project(latlng, zoom).subtract(origin);\r\n return new L.Point(cos * p.x - sin * p.y, sin * p.x + cos * p.y);\r\n });\r\n const low = Math.min(...points.map(p => p.y)), high = Math.max(...points.map(p => p.y));\r\n const leftSlope = min.x * rise / distance, rightSlope = max.x * rise / distance;\r\n const slope = rightSlope - leftSlope;\r\n const left = Math.min(...points.map(p => p.x + leftSlope * p.y));\r\n const right = Math.max(...points.map(p => p.x + rightSlope * p.y));\r\n // Perspective viewport edges are straight lines on the ground: fit all four corners, not their screen midpoint.\r\n const scale = Math.min((bottom - top) / (high - low),\r\n (max.x - min.x - slope * top) / (right - left - slope * low));\r\n let target = map.getScaleZoom(scale, zoom);\r\n const snap = map.options.zoomSnap;\r\n if (snap) target = Math.floor(Math.round(target / (snap / 100)) / 100) * snap;\r\n target = Math.max(map.getMinZoom(), Math.min(map.getMaxZoom(), options.maxZoom ?? Infinity, target));\r\n if (!Number.isFinite(target)) return { center: bounds.getCenter(), zoom: target };\r\n const actual = map.getZoomScale(target, zoom);\r\n const vMin = high * actual - bottom, vMax = low * actual - top;\r\n const v = Math.max(vMin, slope ? (actual * (right - left) - max.x + min.x) / slope : vMin);\r\n const centerY = (Math.min(vMax, v) + vMax) / 2;\r\n const centerX = (actual * (left + right) - min.x - max.x - (leftSlope + rightSlope) * centerY) / 2;\r\n const center = origin.add(new L.Point(cos * centerX + sin * centerY, -sin * centerX + cos * centerY).divideBy(actual));\r\n return { center: map.unproject(center, zoom), zoom: target };\r\n}\r\n\r\nfunction updateSky() {\r\n const height = this.getSize().y, pitch = this.getPitch() * radians;\r\n const far = height * this.options.pitchMaxDistance, distance = height * 1.5;\r\n const top = height / 2 - far * Math.cos(pitch) * distance / (distance + Math.sin(pitch) * far);\r\n if (top > 0 && !this._pitchSky) {\r\n this._pitchSky = L.DomUtil.create('div', 'leaflet-pitch-sky', this.getContainer());\r\n this._pitchSky.setAttribute('aria-hidden', 'true');\r\n this._pitchSky.style.cssText = 'position:absolute;inset:0 0 auto;height:0;z-index:0;pointer-events:none;background:var(--leaflet-sky-background,linear-gradient(#9ec5e8,#dfe9f0))';\r\n }\r\n if (this._pitchSky) {\r\n this._pitchSky.style.height = `${Math.max(0, Math.ceil(top))}px`;\r\n this._pitchSky.style.display = top > 0 ? '' : 'none';\r\n }\r\n}\r\n\r\nL.Map.include({\r\n getBearing() { return this._cameraBearing ?? 0; },\r\n getPitch() { return this._cameraPitch ?? 0; },\r\n _stopPitchBearingAnimation() {\r\n cancelAnimationFrame(this._cameraFrame);\r\n this._cameraFrame = null;\r\n return this;\r\n },\r\n _setPitchAndBearing(pitch, bearing) {\r\n if (!Number.isFinite(pitch) || !Number.isFinite(bearing)) throw new TypeError('Camera angles must be finite numbers');\r\n const previousPitch = this.getPitch(), previousBearing = this.getBearing();\r\n this._cameraPitch = Math.max(0, Math.min(85, pitch));\r\n this._cameraBearing = ((bearing % 360) + 360) % 360;\r\n if (this._loaded) {\r\n updateSky.call(this);\r\n if (previousBearing !== this.getBearing()) this.fire('rotate', { bearing: this.getBearing() });\r\n if (previousPitch !== this.getPitch()) this.fire('pitch', { pitch: this.getPitch() });\r\n }\r\n return this;\r\n },\r\n _animateCamera(pitch, bearing, options = {}) {\r\n cancelAnimationFrame(this._cameraFrame);\r\n if (!Number.isFinite(pitch) || !Number.isFinite(bearing)) throw new TypeError('Camera angles must be finite numbers');\r\n if (!options.animate || matchMedia('(prefers-reduced-motion: reduce)').matches) {\r\n return this._setPitchAndBearing(pitch, bearing);\r\n }\r\n const duration = options.duration ?? 0.3;\r\n if (!Number.isFinite(duration) || duration < 0) throw new TypeError('Camera duration must be nonnegative');\r\n const start = performance.now(), fromPitch = this.getPitch(), fromBearing = this.getBearing();\r\n const delta = ((bearing - fromBearing) % 360 + 540) % 360 - 180;\r\n const frame = now => {\r\n const progress = duration ? Math.min(1, (now - start) / (duration * 1000)) : 1;\r\n const eased = 1 - (1 - progress) ** 3;\r\n this._setPitchAndBearing(fromPitch + (Math.max(0, Math.min(85, pitch)) - fromPitch) * eased,\r\n fromBearing + delta * eased);\r\n if (progress < 1) this._cameraFrame = requestAnimationFrame(frame);\r\n };\r\n this._cameraFrame = requestAnimationFrame(frame);\r\n return this;\r\n },\r\n setBearing(bearing, options) { return this._animateCamera(this.getPitch(), bearing, options); },\r\n setPitch(pitch, options) { return this._animateCamera(pitch, this.getBearing(), options); },\r\n resetNorth(options = { animate: true }) { return this.setBearing(0, options); },\r\n resetNorthPitch(options = { animate: true }) { return this._animateCamera(0, 0, options); },\r\n layerPointToContainerPoint(point) {\r\n return project(this, animationPoint(this, mapMethods.layerPointToContainerPoint.call(this, point)));\r\n },\r\n containerPointToLayerPoint(point) {\r\n return mapMethods.containerPointToLayerPoint.call(this, animationPoint(this, project(this, point, true), true));\r\n },\r\n _getCenterLayerPoint() {\r\n return mapMethods.containerPointToLayerPoint.call(this, this.getSize().divideBy(2));\r\n },\r\n _updateCameraOverlays() {\r\n for (const layer of Object.values(this._layers)) {\r\n if (layer instanceof L.Marker) layer.update();\r\n else if (layer instanceof L.Popup || layer instanceof L.Tooltip) layer._updatePosition();\r\n }\r\n },\r\n panBy(offset, options) {\r\n const half = this.getSize().divideBy(2);\r\n const ground = half.subtract(project(this, half.subtract(pointOf(offset)), true));\r\n return mapMethods.panBy.call(this, ground, options);\r\n },\r\n setZoomAround(latlng, zoom, options) {\r\n if (!this.getPitch() && !this.getBearing()) return mapMethods.setZoomAround.call(this, latlng, zoom, options);\r\n zoom = this._limitZoom(zoom);\r\n const scale = this.getZoomScale(zoom), half = this.getSize().divideBy(2);\r\n const screen = latlng instanceof L.Point ? latlng : this.latLngToContainerPoint(latlng);\r\n const center = this.containerPointToLayerPoint(half), anchor = this.containerPointToLayerPoint(screen);\r\n const next = center.add(anchor.subtract(center).multiplyBy(1 - 1 / scale));\r\n return this.setView(this.layerPointToLatLng(next), zoom, { zoom: options });\r\n },\r\n panInside(latlng, options = {}) {\r\n if (!this.getPitch() && !this.getBearing()) return mapMethods.panInside.call(this, latlng, options);\r\n const min = pointOf(options.paddingTopLeft || options.padding || [0, 0]);\r\n const max = this.getSize().subtract(pointOf(options.paddingBottomRight || options.padding || [0, 0]));\r\n const screen = this.latLngToContainerPoint(latlng);\r\n const safe = new L.Point(Math.max(min.x, Math.min(max.x, screen.x)),\r\n Math.max(min.y, Math.min(max.y, screen.y)));\r\n if (safe.equals(screen)) return this;\r\n const delta = this.latLngToLayerPoint(latlng).subtract(this.containerPointToLayerPoint(safe));\r\n return this.panTo(this.unproject(this.project(this.getCenter()).add(delta)), options);\r\n },\r\n _limitCenter(center, zoom, bounds) {\r\n if (!bounds || !this._loaded || !this.getPitch() && !this.getBearing()) {\r\n return mapMethods._limitCenter.call(this, center, zoom, bounds);\r\n }\r\n const half = this.getSize().divideBy(2), footprint = groundBounds(this), point = this.project(center, zoom);\r\n const view = new L.Bounds(point.add(footprint.min.subtract(half)), point.add(footprint.max.subtract(half)));\r\n const offset = this._getBoundsOffset(view, bounds, zoom);\r\n return Math.abs(offset.x) <= 1 && Math.abs(offset.y) <= 1 ? center : this.unproject(point.add(offset), zoom);\r\n },\r\n _limitOffset(offset, bounds) {\r\n if (!bounds || !this.getPitch() && !this.getBearing()) return mapMethods._limitOffset.call(this, offset, bounds);\r\n const half = this.getSize().divideBy(2), ground = half.subtract(project(this, half.subtract(offset), true));\r\n const center = this.project(this.getCenter());\r\n const limited = this.project(this._limitCenter(this.unproject(center.add(ground)), this.getZoom(), bounds));\r\n return half.subtract(project(this, half.subtract(limited.subtract(center))));\r\n },\r\n _getBoundsCenterZoom(bounds, options) {\r\n return this.getPitch() || this.getBearing() ? fitCameraBounds(this, bounds, options) :\r\n mapMethods._getBoundsCenterZoom.call(this, bounds, options);\r\n },\r\n getBoundsZoom(bounds, inside, padding) {\r\n if (!this.getPitch() && !this.getBearing()) return mapMethods.getBoundsZoom.call(this, bounds, inside, padding);\r\n if (!inside) return fitCameraBounds(this, bounds, { padding: pointOf(padding || [0, 0]).divideBy(2) }).zoom;\r\n bounds = bounds instanceof L.LatLngBounds ? bounds : new L.LatLngBounds(bounds);\r\n const footprint = groundBounds(this, padding).getSize(), size = this.project(bounds.getSouthEast()).subtract(this.project(bounds.getNorthWest()));\r\n const zoom = this.getScaleZoom(Math.max(footprint.x / size.x, footprint.y / size.y));\r\n const snap = this.options.zoomSnap;\r\n return Math.max(this.getMinZoom(), Math.min(this.getMaxZoom(), snap ? Math.ceil(zoom / snap) * snap : zoom));\r\n },\r\n _tryAnimatedPan(center, options) {\r\n // Leaflet's geographic recentering already supplies ground pixels, not screen pixels.\r\n const offset = this._getCenterOffset(center)._trunc();\r\n if (options?.animate !== true && !this.getSize().contains(offset)) return false;\r\n mapMethods.panBy.call(this, offset, options);\r\n return true;\r\n },\r\n getBounds() {\r\n if (!this.getPitch() && !this.getBearing()) return mapMethods.getBounds.call(this);\r\n const footprint = groundBounds(this), bounds = new L.LatLngBounds();\r\n for (const point of [footprint.min, footprint.max]) {\r\n const raw = mapMethods.containerPointToLayerPoint.call(this, animationPoint(this, point, true));\r\n bounds.extend(this.layerPointToLatLng(raw));\r\n }\r\n return bounds;\r\n },\r\n});\r\n\r\nL.Map.addInitHook(function () {\r\n if (!document.getElementById('leaflet-camera-zoom-style')) {\r\n const style = document.createElement('style');\r\n style.id = 'leaflet-camera-zoom-style';\r\n style.textContent = ['.leaflet-marker-icon', '.leaflet-marker-shadow', '.leaflet-popup', '.leaflet-tooltip']\r\n .map(selector => `.leaflet-camera-zoom ${selector}`).join(',') + '{transition:none!important}';\r\n document.head.append(style);\r\n }\r\n this._setPitchAndBearing(this.options.pitch, this.options.bearing);\r\n this.on('load resize pitch', updateSky);\r\n this.on('rotate pitch', () => {\r\n if (this.options.maxBounds) this._panInsideMaxBounds();\r\n });\r\n this.once('unload', () => {\r\n cancelAnimationFrame(this._cameraFrame);\r\n this._pitchSky?.remove();\r\n });\r\n this.whenReady(() => {\r\n const draggable = this.dragging?._draggable;\r\n if (!draggable) return;\r\n const pan = () => {\r\n if (!this.getPitch() && !this.getBearing()) return;\r\n const half = this.getSize().divideBy(2), delta = draggable._newPos.subtract(draggable._startPos);\r\n const ground = half.subtract(project(this, half.subtract(delta), true));\r\n draggable._newPos = draggable._startPos.add(ground);\r\n };\r\n draggable.on('predrag', pan);\r\n this.once('unload', () => draggable.off('predrag', pan));\r\n });\r\n if (this.options.rotate || this.options.trackContainerMutation) {\r\n this.cameraReady = import('./cameraControls.js').then(({ cameraControls }) => {\r\n if (!this._container?._leaflet_id) return;\r\n cameraControls(this);\r\n });\r\n this.cameraReady.catch(error => this.fire('error', { error }));\r\n }\r\n});\r\n\r\nconst markerMethods = Object.defineProperties({}, Object.getOwnPropertyDescriptors(L.Marker.prototype));\r\nL.Marker.mergeOptions({ rotation: 0, rotateWithView: false, keepUpright: false, scale: 1 });\r\nL.Marker.include({\r\n setIcon(icon) {\r\n if (!(icon instanceof L.DivIcon)) icon.options.crossOrigin ||= true;\r\n const result = markerMethods.setIcon.call(this, icon);\r\n if (this._map && !(icon instanceof L.DivIcon)) this._initNativeGPU(this._map);\r\n return result;\r\n },\r\n setRotation(rotation) {\r\n if (!Number.isFinite(rotation)) throw new TypeError('Marker rotation must be finite');\r\n this.options.rotation = rotation;\r\n this.update();\r\n this._nativeGPU?.refresh?.();\r\n return this;\r\n },\r\n _cameraIconPoint(x, y) {\r\n let rotation = this.options.rotation + (this.options.rotateWithView ? this._map.getBearing() * radians : 0);\r\n if (this.options.keepUpright && Math.cos(rotation) < 0) rotation += Math.PI;\r\n const scale = this.options.scale;\r\n return new L.Point((x * Math.cos(rotation) - y * Math.sin(rotation)) * scale,\r\n (x * Math.sin(rotation) + y * Math.cos(rotation)) * scale);\r\n },\r\n getEvents() {\r\n return { ...markerMethods.getEvents.call(this), rotate: this.update, pitch: this.update, move: this.update };\r\n },\r\n _setPos(point) {\r\n markerMethods._setPos.call(this, displayPoint(this._map, point));\r\n for (const [element, key] of [[this._icon, 'iconAnchor'], [this._shadow, 'shadowAnchor']]) {\r\n if (!element) continue;\r\n const direction = this._cameraIconPoint(1, 0), options = this.options.icon.options;\r\n const anchor = options[key] || options.iconAnchor;\r\n element.style.transformOrigin = anchor ? `${anchor.x ?? anchor[0]}px ${anchor.y ?? anchor[1]}px` : 'center';\r\n element.style.transform += ` rotate(${Math.atan2(direction.y, direction.x)}rad) scale(${this.options.scale})`;\r\n }\r\n },\r\n _updateZIndex(offset) {\r\n markerMethods._updateZIndex.call(this, offset);\r\n const changed = this._cameraZIndexOffset !== offset;\r\n this._cameraZIndexOffset = offset;\r\n if (changed) this._nativeGPU?.refresh?.();\r\n },\r\n _initInteraction() {\r\n const result = markerMethods._initInteraction.call(this);\r\n cameraMarkerDrag.call(this);\r\n return result;\r\n },\r\n});\r\n\r\n// Keep Leaflet's focusable marker and its drag events; only translate its screen position back to ground.\r\nfunction cameraMarkerDrag() {\r\n if (!this.dragging || this.dragging._cameraDrag) return;\r\n const drag = this.dragging, original = drag._onDrag, adjustPan = drag._adjustPan;\r\n drag._onDrag = function (event) {\r\n const map = this._marker._map;\r\n const screen = L.DomUtil.getPosition(this._marker._icon).add(map._getMapPanePos());\r\n const point = map.containerPointToLayerPoint(screen);\r\n const icon = this._marker._icon;\r\n L.DomUtil.setPosition(icon, point);\r\n original.call(this, event);\r\n this._marker._setPos(point);\r\n };\r\n drag._adjustPan = function (event) {\r\n const marker = this._marker, map = marker._map;\r\n if (!map.getPitch() && !map.getBearing()) return adjustPan.call(this, event);\r\n const screen = L.DomUtil.getPosition(marker._icon).add(map._getMapPanePos());\r\n const size = map.getSize(), padding = pointOf(marker.options.autoPanPadding);\r\n const speed = marker.options.autoPanSpeed;\r\n const movement = new L.Point(\r\n (Math.max(0, screen.x - size.x + padding.x) - Math.max(0, padding.x - screen.x)) / Math.max(1, padding.x) * speed,\r\n (Math.max(0, screen.y - size.y + padding.y) - Math.max(0, padding.y - screen.y)) / Math.max(1, padding.y) * speed);\r\n if (!movement.x && !movement.y) return;\r\n const pane = map._getMapPanePos();\r\n map.panBy(movement, { animate: false });\r\n const shift = pane.subtract(map._getMapPanePos());\r\n this._draggable._newPos._add(shift);\r\n this._draggable._startPos._add(shift);\r\n L.DomUtil.setPosition(marker._icon, this._draggable._newPos);\r\n this._onDrag(event);\r\n this._panRequest = requestAnimationFrame(() => this._adjustPan(event));\r\n };\r\n // The handler may already be enabled and listening with its original method.\r\n const enabled = drag.enabled();\r\n if (enabled) {\r\n drag._draggable.off('drag', original, drag);\r\n drag._draggable.on('drag', drag._onDrag, drag);\r\n }\r\n drag._cameraDrag = true;\r\n}\r\n\r\nfor (const Class of [L.Popup, L.Tooltip]) {\r\n const events = Class.prototype.getEvents;\r\n Class.include({\r\n getEvents() {\r\n return { ...events.call(this), rotate: this._updatePosition, pitch: this._updatePosition, move: this._updatePosition };\r\n },\r\n });\r\n}\r\nconst popupPosition = L.Popup.prototype._updatePosition;\r\nconst popupPan = L.Popup.prototype._adjustPan;\r\nL.Popup.include({\r\n _adjustPan() {\r\n const map = this._map;\r\n if (!map.getPitch() && !map.getBearing()) return popupPan.call(this);\r\n if (!this.options.autoPan) return;\r\n if (map._panAnim) map._panAnim.stop();\r\n if (this._autopanning) { this._autopanning = false; return; }\r\n const rect = this._container.getBoundingClientRect(), container = map.getContainer().getBoundingClientRect();\r\n const min = pointOf(this.options.autoPanPaddingTopLeft || this.options.autoPanPadding);\r\n const max = map.getSize().subtract(pointOf(this.options.autoPanPaddingBottomRight || this.options.autoPanPadding));\r\n const left = rect.left - container.left, top = rect.top - container.top;\r\n const right = rect.right - container.left, bottom = rect.bottom - container.top;\r\n const dx = Math.min(0, left - min.x) || Math.max(0, right - max.x);\r\n const dy = Math.min(0, top - min.y) || Math.max(0, bottom - max.y);\r\n if (!dx && !dy) return;\r\n if (this.options.keepInView) this._autopanning = true;\r\n const screen = map.latLngToContainerPoint(this._latlng).subtract(new L.Point(dx, dy));\r\n const delta = map.latLngToLayerPoint(this._latlng).subtract(map.containerPointToLayerPoint(screen));\r\n map.fire('autopanstart');\r\n map.panTo(map.unproject(map.project(map.getCenter()).add(delta)));\r\n },\r\n _updatePosition() {\r\n popupPosition.call(this);\r\n if (!this._map) return;\r\n const point = this._map.latLngToLayerPoint(this._latlng), delta = displayPoint(this._map, point).subtract(point);\r\n if (this._zoomAnimated) {\r\n L.DomUtil.setPosition(this._container, L.DomUtil.getPosition(this._container).add(delta));\r\n } else {\r\n this._container.style.left = `${this._containerLeft + delta.x}px`;\r\n this._container.style.bottom = `${this._containerBottom - delta.y}px`;\r\n }\r\n },\r\n});\r\nconst tooltipPosition = L.Tooltip.prototype._setPosition;\r\nL.Tooltip.include({\r\n _setPosition(point) {\r\n tooltipPosition.call(this, point);\r\n const delta = displayPoint(this._map, point).subtract(point);\r\n L.DomUtil.setPosition(this._container, L.DomUtil.getPosition(this._container).add(delta));\r\n },\r\n});\r\n\r\nconst tiledBounds = L.GridLayer.prototype._getTiledPixelBounds;\r\nconst gridEvents = L.GridLayer.prototype.getEvents;\r\nL.GridLayer.include({\r\n getEvents() {\r\n const events = gridEvents.call(this);\r\n this._cameraGridUpdate ||= L.Util.throttle(this._onMoveEnd, this.options.updateInterval, this);\r\n return { ...events, rotate: this._cameraGridUpdate, pitch: this._cameraGridUpdate };\r\n },\r\n _getTiledPixelBounds(center) {\r\n if (!this._map.getBearing() && !this._map.getPitch()) return tiledBounds.call(this, center);\r\n const bounds = this._map.getBounds();\r\n return new L.Bounds(this._map.project(bounds.getNorthWest(), this._tileZoom),\r\n this._map.project(bounds.getSouthEast(), this._tileZoom));\r\n },\r\n});\r\n", "import './utils/mapCamera.js';\n\n/**\n * `new L.Layer({ source: { type, url, ...settings }, pane, attribution })`: layers with a `source`\n * load their specialized utilities on first use. Native map layers also join the WebGPU scene.\n */\n\n/**\n * Router for `new L.Layer({ source: { type, url, ...settings }, pane, attribution })`.\n * It imports source utilities on demand and initializes the existing instance;\n * types receive flat options (`{ ...source, pane, attribution }`), so `layer.options.url` etc.\n *\n * Folder layout:\n * - Vector ('3d', 'geojson') and raster ('pmtiles') initialization lives here.\n * - utils/: lazy operations for rendering, archives, geometry and specialized layers:\n * terrain (Float32 DEM), sunlight (clock and lighting), traffic and walking.\n * Operations receive the layer explicitly, without subclasses or prototype replacement.\n * Dataset-specific code and data (routes, timetables, API loaders) belong to the application, e.g. misc/.\n *\n * When `type` is omitted, inline FeatureCollections use 'geojson'; otherwise *.pmtiles URLs use\n * 'pmtiles' and other sources use '3d'.\n */\n\nconst layerProto = Object.defineProperties({}, Object.getOwnPropertyDescriptors(L.Layer.prototype));\n\n// One chain for every pending layer: they become real layers in creation order, whatever the import timing.\nlet loading = Promise.resolve();\nlet sceneModules, sceneLoading, rasterModules;\nlet nativeLoading;\n\n/**\n * The '3d' layer type: native WebGPU scene synchronized with the map camera.\n * Layers on one map share a canvas, scene and camera; each has its own root transform.\n *\n * @typedef {Object} Layer3DOptions Layer options; pane and attribution remain standard L.Layer options.\n * @property {string} [type] '3d', 'geojson', 'pmtiles', 'terrain', 'sunlight', 'traffic' or 'walk'.\n * @property {number[]} [center] Local origin [lat,lng]; defaults to the first map center.\n * @property {number} [terrainOffset=0] Vertical offset in metres when terrain is enabled.\n * @property {boolean} [terrainConform=false] Fit lower model geometry to local terrain elevation.\n * @property {'OPAQUE'|'MASK'|'BLEND'} [alphaMode] Override every glTF material's alpha mode.\n * @property {number[]} [rotation] Model Euler rotation [x,y,z] in radians, YXZ order.\n * @property {number[]} [scale] Model scale [x,y,z].\n * @property {string} [url] GLB/glTF model URL or PMTiles archive URL.\n * @property {function(Object): (ExtrusionStyle|null)} [style] Source styling; null skips a feature.\n * @property {function(PickedFeature): (Node|string)} [tooltip] Tooltip content; strings are text.\n * @property {string} [ariaLabel='3D scene'] Shared canvas accessible name.\n * @property {boolean} [nightLight=false] Point sources: emissive bulbs and local illumination.\n * @property {boolean} [nightSparkle=false] Model: sparse luminous points at night.\n *\n * @typedef {Object} ExtrusionStyle\n * @property {number} top Roof height in metres; must exceed bottom.\n * @property {number} [bottom=0] Nonnegative base height.\n * @property {number|string|Object} [color=0xd9b38c] RGB/CSS color or linear-space {h,s,l}.\n * @property {number} [trunkRadius] Point tree trunk radius in metres.\n * @property {number} [crownRadius] Point tree crown radius in metres.\n * @property {number} [crownBottom] Point tree crown base in metres.\n * @property {string} [crownShape='round'] Point tree crown shape.\n * @property {number|string|Object} [trunkColor=0x72513a] Point tree bark color.\n * @property {number} [lightRadius] Point light estimated ground reach in metres.\n * @property {number} [lightFlux] Point light luminous flux in lumens.\n *\n * @typedef {Object} PickedFeature\n * @property {string|number} id Source feature id or configured model URL.\n * @property {Object} properties GeoJSON properties or model-level glTF extras.\n * @property {Object} mesh Intersected mesh.\n * @property {number[]} point Intersection [x,y,z] in shared scene metres.\n * @property {Object} [model] Configured model root; absent for source polygons.\n * @property {number} [vertexStart] First polygon vertex in the batched mesh.\n * @property {number} [vertexEnd] Exclusive end of the polygon's vertex range.\n *\n * @typedef {Object} SourceArea\n * @property {Object} coords Archive block {z,x,y}.\n * @property {AbortController} request Cancellation prevents attaching obsolete results.\n * @property {boolean} [done] Geometry built successfully, including empty blocks.\n * @property {Object|null} [mesh] Batched GPU mesh.\n * @property {number} [buildings] Emitted feature count.\n * @property {number} [skipped] Features skipped by style.\n * @property {string} [error] Failed load/build message.\n *\n * @param {L.Layer} backend\n * @param {Layer3DOptions} [options] World origin comes from center or the first map centre.\n */\n\nL.Layer._renderers = new WeakMap();\nL.Layer._nextId = 0;\n\nL.Layer.include({\n _layerAdd(event) {\n const native = !this._3d && (\n this instanceof L.GridLayer ||\n this instanceof L.Polyline ||\n this instanceof L.CircleMarker ||\n this instanceof L.Marker && !(this.options.icon instanceof L.DivIcon) ||\n this instanceof L.ImageOverlay && !(this instanceof L.VideoOverlay) && !(this instanceof L.SVGOverlay)\n );\n if (native) {\n if (this instanceof L.GridLayer || this instanceof L.ImageOverlay) {\n this.options.crossOrigin ||= true;\n }\n if (this instanceof L.Marker) this.options.icon.options.crossOrigin ||= true;\n }\n layerProto._layerAdd.call(this, event);\n if (!native || !event.target.hasLayer(this)) return;\n this._initNativeGPU(event.target);\n },\n _initNativeGPU(map) {\n if (this._nativeGPU) return;\n if (!document.getElementById('leaflet-webgpu-targets')) {\n const style = document.createElement('style');\n style.id = 'leaflet-webgpu-targets';\n style.textContent = '.leaflet-webgpu-target{opacity:0!important}';\n document.head.append(style);\n }\n const state = this._nativeGPU = { source: this, map, hidden: new Set() };\n state.hide = () => {\n const htmlIcon = this instanceof L.Marker && this.options.icon instanceof L.DivIcon;\n const targets = [htmlIcon ? null : this._icon, htmlIcon ? null : this._shadow];\n for (const element of state.hidden) {\n if (targets.includes(element)) continue;\n element.classList.remove('leaflet-webgpu-target');\n state.hidden.delete(element);\n }\n for (const element of targets) {\n if (!element || state.hidden.has(element)) continue;\n element.classList.add('leaflet-webgpu-target');\n state.hidden.add(element);\n }\n };\n state.hide();\n this.once('remove', () => {\n if (this._nativeGPU === state) this._nativeGPU = null;\n state.dispose?.();\n for (const element of state.hidden) {\n element.classList.remove('leaflet-webgpu-target');\n }\n });\n\n nativeLoading ||= import('./utils/nativeLayer.js');\n this.ready = nativeLoading.then(({ nativeLayer }) => {\n if (this._nativeGPU !== state) return this;\n return nativeLayer(state);\n });\n this.ready.catch(error => this.fire('error', { error }));\n },\n _init3D(options = {}) {\n const layer = this;\n const ready = sceneLoading ||= Promise.all([\n import('./utils/onAdd3DLayer.js'),\n import('./utils/onRemove3DLayer.js'),\n import('./utils/updateArea.js'),\n import('./utils/onTerrainChange.js'),\n ]).then(([add, remove, update, terrain]) => sceneModules = { ...add, ...remove, ...update, ...terrain });\n layer._3d = true;\n L.Util.setOptions(layer, { ariaLabel: '3D scene', ...options });\n layer.onAdd = map => {\n if (sceneModules) return sceneModules.onAdd3DLayer(layer, map);\n ready.then(({ onAdd3DLayer }) => {\n if (layer._map === map) onAdd3DLayer(layer, map);\n }).catch(error => layer.fire('error', { error }));\n };\n layer.onRemove = map => {\n if (sceneModules) return sceneModules.onRemove3DLayer(layer, map);\n ready.then(({ onRemove3DLayer }) => onRemove3DLayer(layer, map))\n .catch(error => layer.fire('error', { error }));\n };\n layer.getEvents = () => {\n const events = {};\n if (layer.url) {\n events.moveend = events.zoomend = events.rotate = events.pitch = events.resize = () =>\n sceneModules ? sceneModules.updateArea(layer) : ready.then(({ updateArea }) => updateArea(layer));\n }\n if (layer._geojson || layer.url) {\n events.terrainchange = () => sceneModules\n ? sceneModules.onTerrainChange(layer)\n : ready.then(({ onTerrainChange }) => onTerrainChange(layer));\n }\n return events;\n };\n // ponytail: models are recognised by extension; extensionless model URLs need a .glb/.gltf suffix or query.\n const isModel = !layer._geojson && /\\.(glb|gltf)(?:[?#]|$)/i.test(layer.options.url);\n layer.modelUrl = isModel ? layer.options.url : null;\n layer.url = layer.options.url && !isModel && !layer._geojson ? new URL(layer.options.url, document.baseURI).href : null;\n layer._directories = new Map();\n if (layer.options.center) {\n layer.location = new L.LatLng(layer.options.center[0], layer.options.center[1]);\n }\n /** @type {Map<string, SourceArea>} Keys are archive x/y, not screen tiles. */\n layer._areas = new Map();\n layer._inflight = 0;\n layer._added = Promise.withResolvers();\n queueMicrotask(async () => {\n try {\n await ready;\n layer.root = (await import('./utils/emptyNode.js')).emptyNode();\n layer.raycaster = { origin: [0, 0, 0], direction: [0, 0, 0] };\n if (layer.url || layer._geojson) {\n layer.group = layer.root;\n if (layer.url) layer.header = await (await import('./utils/getHeader.js')).getHeader(layer);\n }\n if (layer._map) {\n await (await import('./utils/attach.js')).attach(layer, layer._map);\n layer._added.resolve();\n }\n if (layer.modelUrl) await (await import('./utils/loadModel.js')).loadModel(layer);\n if (layer._shared) (await import('./utils/update.js')).update(layer);\n layer.fire('ready');\n } catch (error) {\n layer.fire('error', { error });\n }\n });\n },\n _initRaster(options) {\n const layer = this;\n const [{ read }, { getHeader }, { getZxy }, { onPMTileAdd }, { onPMTileRemove },\n { getRasterTileSize, updateRasterTiles }, { setPMTileOpacity }, { setPMTileZIndex }, { emptyNode }] = rasterModules;\n layer._read = (offset, length, signal) => read(layer, offset, length, signal);\n layer.getHeader = () => getHeader(layer);\n layer.getZxy = (z, x, y, signal) => getZxy(layer, z, x, y, signal);\n layer.getTileSize = () => getRasterTileSize();\n layer.isLoading = () => layer._loadingTiles > 0;\n layer.setOpacity = opacity => setPMTileOpacity(layer, opacity);\n layer.setZIndex = zIndex => setPMTileZIndex(layer, zIndex);\n layer.onAdd = map => onPMTileAdd(layer, map);\n layer.onRemove = map => onPMTileRemove(layer, map);\n const update = () => updateRasterTiles(layer);\n layer.getEvents = () => ({\n moveend: update,\n zoomend: update,\n rotate: update,\n pitch: update,\n resize: update,\n });\n options = { ariaLabel: 'PMTiles raster', maxZoom: 18, opacity: 1, zIndex: 0, ...options };\n L.Util.setOptions(layer, options);\n layer.root = emptyNode();\n layer._areas = new Map();\n layer._rasterTiles = new Map();\n layer._loadingTiles = 0;\n layer._added = Promise.withResolvers();\n layer.url = new URL(options.url, document.baseURI).href;\n layer._directories = new Map();\n layer.ready = Promise.resolve(layer.options.archive || layer).then(async archive => {\n const header = await archive.getHeader();\n layer.options.archive = archive;\n layer.header = header;\n if (layer.options.maxNativeZoom === undefined) {\n layer.options.maxNativeZoom = header.maxZoom;\n }\n layer.options.maxZoom = Math.max(layer.options.minZoom || 0, layer.options.maxZoom);\n layer.fire('ready');\n return layer;\n }).catch(error => {\n layer.fire('error', { error });\n throw error;\n });\n },\n initialize(options = {}) {\n if (Object.getPrototypeOf(this) !== L.Layer.prototype || !options.source) {\n if (layerProto.initialize) return layerProto.initialize.apply(this, arguments);\n L.Util.setOptions(this, options);\n return;\n }\n const {\n source: {\n type = options.source.data?.type === 'FeatureCollection'\n ? 'geojson'\n : /\\.pmtiles(?:[?#]|$)/i.test(options.source.url) ? 'pmtiles' : '3d',\n ...source\n },\n ...core\n } = options;\n const settings = { ...source, ...core };\n L.Util.setOptions(this, core);\n this._type = type;\n if (type === '3d') {\n this._init3D(settings);\n return;\n }\n if (type === 'pmtiles' && rasterModules) {\n this._initRaster(settings);\n return;\n }\n this.onAdd = () => {};\n this.onRemove = () => {};\n // ponytail: type methods (setOpacity, add, ...) exist only once `ready` resolves.\n loading = loading.catch(() => {}).then(async () => {\n switch (type) {\n case 'geojson': {\n const { setGeoJSONData } = await import('./utils/setGeoJSONData.js');\n return (layer, options) => {\n layer._geojson = true;\n layer.setData = data => setGeoJSONData(layer, data);\n layer._init3D(options);\n };\n }\n case 'pmtiles': {\n rasterModules = await Promise.all([\n import('./utils/read.js'),\n import('./utils/getHeader.js'),\n import('./utils/getZxy.js'),\n import('./utils/onPMTileAdd.js'),\n import('./utils/onPMTileRemove.js'),\n import('./utils/rasterTiles.js'),\n import('./utils/setPMTileOpacity.js'),\n import('./utils/setPMTileZIndex.js'),\n import('./utils/emptyNode.js'),\n ]);\n return (layer, options) => layer._initRaster(options);\n }\n case 'terrain':\n return (await import('./utils/initTerrain.js')).initTerrain;\n case 'sunlight':\n return (await import('./utils/initSunlight.js')).initSunlight;\n case 'traffic':\n return (await import('./utils/initTraffic.js')).initTraffic;\n case 'walk':\n return (await import('./utils/initWalk.js')).initWalk;\n default:\n throw new Error(`Unknown layer type: ${type}`);\n }\n });\n const ready = this.ready = loading.then(initialize => {\n const map = this._map;\n map?.removeLayer(this);\n delete this.onAdd;\n delete this.onRemove;\n initialize(this, settings);\n map?.addLayer(this);\n return this.ready === ready ? this : this.ready;\n });\n ready.catch(error => this.fire('error', { error }));\n },\n});\n\nL.Layer.addInitHook(function () {\n if (this instanceof L.Polyline || this instanceof L.CircleMarker) {\n const refresh = () => this._nativeGPU?.refresh?.();\n this.beforeAdd = this.onAdd = this.onRemove = this._updateBounds = () => {};\n this.getEvents = () => ({});\n // Leaflet mutators call this renderer contract, but no SVG/Canvas renderer is created.\n this._renderer = {\n options: { tolerance: 0 },\n _updatePath: refresh,\n _updateStyle: refresh,\n _bringToFront: () => this._nativeGPU?.reorder?.(true),\n _bringToBack: () => this._nativeGPU?.reorder?.(false),\n };\n if (this instanceof L.Polyline) {\n const closest = this.closestLayerPoint;\n this.closestLayerPoint = function (point) {\n this._project();\n this._parts = this._rings;\n return closest.call(this, point);\n };\n }\n if (this instanceof L.Circle) {\n const getBounds = this.getBounds;\n this.getBounds = function () {\n this._project();\n return getBounds.call(this);\n };\n }\n } else if (this instanceof L.GridLayer) {\n const initialize = this._initContainer;\n this._initContainer = function () {\n initialize.call(this);\n this._container.remove();\n };\n this._updateOpacity = function () {\n if (!this._map) return;\n const now = Date.now();\n let fading = false, prune = false;\n for (const tile of Object.values(this._tiles || {})) {\n if (!tile.current || !tile.loaded) continue;\n tile._gpuOpacity = this._map._fadeAnimated ? Math.min(1, (now - tile.loaded) / 200) : 1;\n if (tile._gpuOpacity < 1) fading = true;\n else if (!tile.active) {\n this._onOpaqueTile(tile);\n tile.active = true;\n prune = true;\n }\n }\n if (prune && !this._noPrune) this._pruneTiles();\n this._nativeGPU?.refresh?.();\n cancelAnimationFrame(this._fadeFrame);\n if (fading) this._fadeFrame = requestAnimationFrame(() => this._updateOpacity());\n };\n } else if (this instanceof L.ImageOverlay && !(this instanceof L.VideoOverlay) && !(this instanceof L.SVGOverlay)) {\n this.onAdd = function () {\n if (!this._image) this._initImage();\n if (this._image.complete && this._image.naturalWidth) queueMicrotask(() => this.fire('load'));\n };\n this.onRemove = () => {};\n this.getEvents = () => ({});\n this._reset = () => this._nativeGPU?.refresh?.();\n }\n});"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["mapMethods", "radians", "pointOf", "point", "angles", "map", "bearing", "pitch", "project", "inverse", "limit", "half", "distance", "cos", "sin", "tilt", "rise", "p", "far", "denominator", "v", "u", "scale", "displayPoint", "animationPoint", "view", "shift", "groundBounds", "padding", "min", "max", "fitCameraBounds", "bounds", "options", "zoom", "vertical", "y", "top", "bottom", "origin", "points", "latlng", "low", "high", "leftSlope", "rightSlope", "slope", "left", "right", "target", "snap", "actual", "vMin", "vMax", "centerY", "centerX", "center", "updateSky", "height", "previousPitch", "previousBearing", "duration", "start", "fromPitch", "fromBearing", "delta", "frame", "now", "progress", "eased", "layer", "offset", "ground", "screen", "anchor", "next", "safe", "footprint", "limited", "inside", "size", "raw", "style", "selector", "draggable", "pan", "cameraControls", "error", "markerMethods", "icon", "result", "rotation", "x", "element", "key", "direction", "changed", "cameraMarkerDrag", "drag", "original", "adjustPan", "event", "marker", "speed", "movement", "pane", "Class", "events", "popupPosition", "popupPan", "rect", "container", "dx", "dy", "tooltipPosition", "tiledBounds", "gridEvents", "layerProto", "loading", "sceneModules", "sceneLoading", "rasterModules", "nativeLoading", "event", "native", "map", "style", "state", "htmlIcon", "targets", "element", "nativeLayer", "error", "options", "layer", "ready", "add", "remove", "update", "terrain", "onAdd3DLayer", "onRemove3DLayer", "events", "updateArea", "onTerrainChange", "isModel", "read", "getHeader", "getZxy", "onPMTileAdd", "onPMTileRemove", "getRasterTileSize", "updateRasterTiles", "setPMTileOpacity", "setPMTileZIndex", "emptyNode", "offset", "length", "signal", "z", "x", "y", "opacity", "zIndex", "archive", "header", "type", "source", "core", "settings", "setGeoJSONData", "data", "initialize", "refresh", "closest", "point", "getBounds", "now", "fading", "prune", "tile"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/CELL.js"],
|
|
4
|
+
"sourcesContent": ["// Walls (non-horizontal triangles) of a mesh in world space, bucketed by 8 m cells; `origin` is the world translation\n// at build time, since layer roots only move vertically with the terrain afterwards.\n\nexport const CELL = 8;\n"],
|
|
5
|
+
"mappings": "AAGO,MAAMA,EAAO",
|
|
6
|
+
"names": ["CELL"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{createMesh as b}from"./createMesh.js";import{triangulate as v}from"./triangulate.js";function D(s,z){const j=s._map,w=j.options.crs,B=s._terrainZoom,P=w.project(s.location),d=Math.cos(s.location.lat*Math.PI/180),I=s.root.position[1],y=[],$=[],q=[],Z=([c,f,u])=>{const e=w.project(new L.LatLng(f,c));return[(e.x-P.x)*d,u-I,-(e.y-P.y)*d]},M=(c,f)=>{y.push(...c),$.push(...f),q.push(.6,.58,.54)};s._bridges=new Map;for(const{geometry:c}of z.features){const f=c.type==="Polygon"?[c.coordinates]:c.type==="MultiPolygon"?c.coordinates:[];for(const u of f){const e=u.map(o=>o.slice(0,-1)).filter(o=>o.length>=3);if(!e.length)continue;const l=e.flat().map(([o,t,n])=>{const r=j.project([t,o],B);return[r.x,r.y,n]}),p=e.flat().map(Z);let x;try{const o=e.map((r,a)=>e.slice(0,a).reduce((m,i)=>m+i.length,0)),[t,...n]=e.map((r,a)=>r.map((m,i)=>({x:l[o[a]+i][0],y:l[o[a]+i][1]})));x=v(t,n)}catch{continue}const g={triangles:x.map(o=>o.map(t=>l[t])),min:[Math.min(...l.map(o=>o[0])),Math.min(...l.map(o=>o[1]))],max:[Math.max(...l.map(o=>o[0])),Math.max(...l.map(o=>o[1]))]};for(let o=Math.floor(g.min[0]/64);o<=Math.floor(g.max[0]/64);o++)for(let t=Math.floor(g.min[1]/64);t<=Math.floor(g.max[1]/64);t++){const n=`${o}/${t}`;s._bridges.set(n,[...s._bridges.get(n)||[],g])}const h=o=>[o[0],o[1]-1.2,o[2]];for(let[o,t,n]of x){const[r,a,m]=[p[o],p[t],p[n]];(a[2]-r[2])*(m[0]-r[0])-(a[0]-r[0])*(m[2]-r[2])<0&&([t,n]=[n,t]);for(const i of[o,t,n])M(p[i],[0,1,0]);for(const i of[o,n,t])M(h(p[i]),[0,-1,0])}let _=0;for(const o of e){for(let t=0;t<o.length;t++){const n=p[_+t],r=p[_+(t+1)%o.length],a=Math.hypot(r[0]-n[0],r[2]-n[2])||1,m=[(r[2]-n[2])/a,0,-(r[0]-n[0])/a];for(const i of[n,r,h(r),n,h(r),h(n)])M(i,m)}_+=o.length}}}y.length&&(s._bridgeMesh=b(s,{position:y,normal:$,color:q}))}export{D as addBridges};
|
|
2
|
+
//# sourceMappingURL=addBridges.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/addBridges.js"],
|
|
4
|
+
"sourcesContent": ["import { createMesh } from './createMesh.js';\nimport { triangulate } from './triangulate.js';\n\n/**\n * Bare-earth DEMs drop bridges: `getElevation` returns the deck height inside these polygons (GeoJSON\n * Polygon/MultiPolygon with Z, e.g. IGN BD TOPO), and one mesh draws the 1.2 m thick decks.\n * ponytail: anything under a deck (quays, boats asking `getElevation`) also gets the deck height.\n */\n\nexport function addBridges(backend, geojson) {\n const map = backend._map, crs = map.options.crs, zoom = backend._terrainZoom;\n const origin = crs.project(backend.location), metres = Math.cos(backend.location.lat * Math.PI / 180);\n const base = backend.root.position[1], position = [], normal = [], color = [];\n const local = ([lng, lat, z]) => {\n const p = crs.project(new L.LatLng(lat, lng));\n return [(p.x - origin.x) * metres, z - base, -(p.y - origin.y) * metres];\n };\n const push = (p, n) => { position.push(...p); normal.push(...n); color.push(0.6, 0.58, 0.54); };\n backend._bridges = new Map();\n for (const { geometry } of geojson.features) {\n const polygons = geometry.type === 'Polygon' ? [geometry.coordinates] : geometry.type === 'MultiPolygon' ? geometry.coordinates : [];\n for (const polygon of polygons) {\n const rings = polygon.map(ring => ring.slice(0, -1)).filter(ring => ring.length >= 3);\n if (!rings.length) continue;\n const pixels = rings.flat().map(([lng, lat, z]) => { const p = map.project([lat, lng], zoom); return [p.x, p.y, z]; });\n const points = rings.flat().map(local);\n let triangles;\n try {\n const starts = rings.map((ring, r) => rings.slice(0, r).reduce((sum, previous) => sum + previous.length, 0));\n const [contour, ...holes] = rings.map((ring, r) => ring.map((c, i) => ({ x: pixels[starts[r] + i][0], y: pixels[starts[r] + i][1] })));\n triangles = triangulate(contour, holes);\n } catch { continue; }\n const bridge = {\n triangles: triangles.map(t => t.map(i => pixels[i])),\n min: [Math.min(...pixels.map(p => p[0])), Math.min(...pixels.map(p => p[1]))],\n max: [Math.max(...pixels.map(p => p[0])), Math.max(...pixels.map(p => p[1]))],\n };\n for (let x = Math.floor(bridge.min[0] / 64); x <= Math.floor(bridge.max[0] / 64); x++) {\n for (let y = Math.floor(bridge.min[1] / 64); y <= Math.floor(bridge.max[1] / 64); y++) {\n const key = `${x}/${y}`;\n backend._bridges.set(key, [...backend._bridges.get(key) || [], bridge]);\n }\n }\n const below = p => [p[0], p[1] - 1.2, p[2]];\n for (let [a, b, c] of triangles) {\n // Counter-clockwise seen from above, so double-sided shading keeps the top lit.\n const [pa, pb, pc] = [points[a], points[b], points[c]];\n if ((pb[2] - pa[2]) * (pc[0] - pa[0]) - (pb[0] - pa[0]) * (pc[2] - pa[2]) < 0) [b, c] = [c, b];\n for (const i of [a, b, c]) push(points[i], [0, 1, 0]);\n for (const i of [a, c, b]) push(below(points[i]), [0, -1, 0]);\n }\n let start = 0;\n for (const ring of rings) {\n for (let i = 0; i < ring.length; i++) {\n const p = points[start + i], q = points[start + (i + 1) % ring.length];\n const length = Math.hypot(q[0] - p[0], q[2] - p[2]) || 1, n = [(q[2] - p[2]) / length, 0, -(q[0] - p[0]) / length];\n for (const corner of [p, q, below(q), p, below(q), below(p)]) push(corner, n);\n }\n start += ring.length;\n }\n }\n }\n if (position.length) {\n backend._bridgeMesh = createMesh(backend, { position, normal, color });\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["createMesh", "triangulate", "addBridges", "backend", "geojson", "map", "crs", "zoom", "origin", "metres", "base", "position", "normal", "color", "local", "lng", "lat", "z", "p", "push", "n", "geometry", "polygons", "polygon", "rings", "ring", "pixels", "points", "triangles", "starts", "r", "sum", "previous", "contour", "holes", "c", "bridge", "t", "i", "x", "y", "key", "below", "a", "b", "pa", "pb", "pc", "start", "q", "length", "corner"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{createProgram as O}from"./createProgram.js";import{destroyTexture as I}from"./destroyTexture.js";import{terrainAtlas as N}from"./terrainAtlas.js";import{terrainGrid as R}from"./terrainGrid.js";import{setParent as S}from"./setParent.js";import{update as X}from"./update.js";async function j(t,m,e,i){if(!await t._terrainPromise||!t._map||t._map._terrain3D!==t||m._terrain3D!==t||i.request.signal.aborted||!m._rasterTiles.has(`${e.z}/${e.x}/${e.y}`)||t._rasterTiles.has(i))return;const _=Math.max(1,Math.min(64,256/2**(e.z-t._terrainZoom))),v=t._map,u=v.options.crs,y=u.project(t.location),f=Math.cos(t.location.lat*Math.PI/180),T=u.scale(e.z),g=2**(t._terrainZoom-e.z),x=u.transformation.untransform(new L.Point(e.x*256,e.y*256),T),w=u.transformation.untransform(new L.Point((e.x+1)*256,(e.y+1)*256),T),o=t.renderer.device,U=i.texture;if(!t._rasterProgram||t._rasterProgram.device!==o){const a=t._terrainBounds,r=a.max.x-a.min.x+1,z=a.max.y-a.min.y+1,{elevations:E,low:B,high:G}=N(t._terrainTiles,a);t._dem&&I(t,t._dem.texture),t._dem={texture:o.createTexture({size:[r*256,z*256],format:"r32float",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST}),low:Number.isFinite(B)?B:t._terrainOriginElevation,high:Number.isFinite(G)?G:t._terrainOriginElevation},o.queue.writeTexture({texture:t._dem.texture},E,{bytesPerRow:r*1024},[r*256,z*256]),t._terrainGrids=new Map,t._rasterProgram=O(t,{baseTexture:U,unlit:!0,terrain:t._dem,alphaMode:"BLEND",depthWrite:!0})}let s=t._terrainGrids.get(_);if(!s){s=R(_);for(const[a,r]of Object.entries(s))r.size||=1,r.count=r.data.length/r.size,r.indexFormat="uint16",r.buffer=o.createBuffer({size:Math.max(4,r.data.byteLength),usage:a==="index"?GPUBufferUsage.INDEX|GPUBufferUsage.COPY_DST:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST}),o.queue.writeBuffer(r.buffer,0,r.data);t._terrainGrids.set(_,s)}const n=t._terrainOriginElevation,p=Math.min(t._dem.low,n)-n,h=Math.max(t._dem.high,n)-n,l=(w.x-x.x)*f,P=-(w.y-x.y)*f,D={device:o,attributes:s,drawRange:{start:0,count:s.index.count},bounds:{min:[0,p,0],max:[1,h,1],center:[.5,(p+h)/2,.5],radius:Math.hypot(l,h-p,P)/2/Math.max(l,1,P)}},M={position:[(x.x-y.x)*f,0,-(x.y-y.y)*f],rotation:[0,0,0],scale:[l,1,P],worldMatrix:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],children:[],visible:!0,device:o,geometry:D,program:t._rasterProgram,texture:U,terrain:[e.x*256*g-t._terrainBounds.min.x*256,e.y*256*g-t._terrainBounds.min.y*256,256*g,n],tile:i,opacity:m.options.opacity??1,id:L.Layer._nextId++,renderOrder:m.options.zIndex||0,fadeDuration:250,fadeStart:i.loadedAt,ground:!0};i.mesh.visible=!1,S(M,t.root),X(t),t._rasterTiles.set(i,M)}export{j as addRasterTile};
|
|
2
|
+
//# sourceMappingURL=addRasterTile.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/addRasterTile.js"],
|
|
4
|
+
"sourcesContent": ["import { createProgram } from './createProgram.js';\nimport { destroyTexture } from './destroyTexture.js';\nimport { terrainAtlas } from './terrainAtlas.js';\nimport { terrainGrid } from './terrainGrid.js';\nimport { setParent } from './setParent.js';\nimport { update } from './update.js';\n\nexport async function addRasterTile(backend, layer, coords, tile) {\n const ready = await backend._terrainPromise;\n if (!ready || !backend._map || backend._map._terrain3D !== backend || layer._terrain3D !== backend ||\n tile.request.signal.aborted || !layer._rasterTiles.has(`${coords.z}/${coords.x}/${coords.y}`) ||\n backend._rasterTiles.has(tile)) {\n return;\n }\n // Match DEM pixel spacing, capped at 64 subdivisions per tile.\n const divisions = Math.max(1, Math.min(64, 256 / 2 ** (coords.z - backend._terrainZoom)));\n const map = backend._map, crs = map.options.crs;\n const origin = crs.project(backend.location), metres = Math.cos(backend.location.lat * Math.PI / 180);\n // Tile pixels map linearly to projected metres: one scaled unit grid per tile, elevation in the vertex shader.\n const scale = crs.scale(coords.z), terrainScale = 2 ** (backend._terrainZoom - coords.z);\n const corner = crs.transformation.untransform(new L.Point(coords.x * 256, coords.y * 256), scale);\n const opposite = crs.transformation.untransform(new L.Point((coords.x + 1) * 256, (coords.y + 1) * 256), scale);\n const device = backend.renderer.device;\n const texture = tile.texture;\n if (!backend._rasterProgram || backend._rasterProgram.device !== device) {\n // DEM atlas over the archive's tile grid; invalid or missing samples become -1e9 (the shader's no-data).\n // ponytail: one texture, capped by maxTextureDimension2D (32\u00D732 DEM tiles at 8192 px); split it for larger archives.\n const bounds = backend._terrainBounds, columns = bounds.max.x - bounds.min.x + 1, rows = bounds.max.y - bounds.min.y + 1;\n const { elevations, low, high } = terrainAtlas(backend._terrainTiles, bounds);\n if (backend._dem) destroyTexture(backend, backend._dem.texture);\n backend._dem = {\n texture: device.createTexture({\n size: [columns * 256, rows * 256],\n format: 'r32float',\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,\n }),\n low: Number.isFinite(low) ? low : backend._terrainOriginElevation,\n high: Number.isFinite(high) ? high : backend._terrainOriginElevation,\n };\n device.queue.writeTexture({ texture: backend._dem.texture }, elevations,\n { bytesPerRow: columns * 1024 }, [columns * 256, rows * 256]);\n backend._terrainGrids = new Map();\n backend._rasterProgram = createProgram(backend, {\n baseTexture: texture,\n unlit: true,\n terrain: backend._dem,\n alphaMode: 'BLEND',\n depthWrite: true,\n });\n }\n let attributes = backend._terrainGrids.get(divisions);\n if (!attributes) {\n attributes = terrainGrid(divisions);\n for (const [name, attribute] of Object.entries(attributes)) {\n attribute.size ||= 1;\n attribute.count = attribute.data.length / attribute.size;\n attribute.indexFormat = 'uint16';\n attribute.buffer = device.createBuffer({\n size: Math.max(4, attribute.data.byteLength),\n usage: name === 'index'\n ? GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST\n : GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n });\n device.queue.writeBuffer(attribute.buffer, 0, attribute.data);\n }\n backend._terrainGrids.set(divisions, attributes);\n }\n const base = backend._terrainOriginElevation;\n const bottom = Math.min(backend._dem.low, base) - base, top = Math.max(backend._dem.high, base) - base;\n const sizeX = (opposite.x - corner.x) * metres, sizeZ = -(opposite.y - corner.y) * metres;\n // ponytail: ray picking sees the flat unit grid; read the DEM back if terrain must be pickable.\n const geometry = {\n device,\n attributes,\n drawRange: { start: 0, count: attributes.index.count },\n // Local bounds whose radius, scaled by the largest axis, still covers the displaced tile.\n bounds: {\n min: [0, bottom, 0], max: [1, top, 1], center: [0.5, (bottom + top) / 2, 0.5],\n radius: Math.hypot(sizeX, top - bottom, sizeZ) / 2 / Math.max(sizeX, 1, sizeZ),\n },\n };\n const mesh = {\n position: [(corner.x - origin.x) * metres, 0, -(corner.y - origin.y) * metres],\n rotation: [0, 0, 0],\n scale: [sizeX, 1, sizeZ],\n worldMatrix: [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],\n children: [],\n visible: true,\n device,\n geometry,\n program: backend._rasterProgram,\n texture,\n // DEM pixel of the tile's corner, DEM pixels per tile, and the elevation at the layer origin.\n terrain: [\n coords.x * 256 * terrainScale - backend._terrainBounds.min.x * 256,\n coords.y * 256 * terrainScale - backend._terrainBounds.min.y * 256,\n 256 * terrainScale,\n base,\n ],\n tile,\n opacity: layer.options.opacity ?? 1,\n id: L.Layer._nextId++,\n renderOrder: layer.options.zIndex || 0,\n fadeDuration: 250,\n fadeStart: tile.loadedAt,\n ground: true,\n };\n tile.mesh.visible = false;\n setParent(mesh, backend.root);\n update(backend);\n backend._rasterTiles.set(tile, mesh);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["createProgram", "destroyTexture", "terrainAtlas", "terrainGrid", "setParent", "update", "addRasterTile", "backend", "layer", "coords", "tile", "divisions", "map", "crs", "origin", "metres", "scale", "terrainScale", "corner", "opposite", "device", "texture", "bounds", "columns", "rows", "elevations", "low", "high", "attributes", "name", "attribute", "base", "bottom", "top", "sizeX", "sizeZ", "geometry", "mesh"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function n(a,d,i){let o=1;for(;o<d.length-1&&d[o]<i;)o++;const c=a[o-1],r=a[o],t=d[o]-d[o-1]||1,x=(i-d[o-1])/t;return{x:c[0]+(r[0]-c[0])*x,y:(c[2]??0)+((r[2]??0)-(c[2]??0))*x,z:c[1]+(r[1]-c[1])*x,dx:(r[0]-c[0])/t,dz:(r[1]-c[1])/t}}export{n as along};
|
|
2
|
+
//# sourceMappingURL=along.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/along.js"],
|
|
4
|
+
"sourcesContent": ["/** Point and unit direction at distance `s` along `points` ([x, z, y?]) with cumulative `lengths`. */\n\nexport function along(points, lengths, s) {\n let i = 1;\n while (i < lengths.length - 1 && lengths[i] < s) i++;\n const a = points[i - 1], b = points[i], d = lengths[i] - lengths[i - 1] || 1;\n const t = (s - lengths[i - 1]) / d;\n return { x: a[0] + (b[0] - a[0]) * t, y: (a[2] ?? 0) + ((b[2] ?? 0) - (a[2] ?? 0)) * t, z: a[1] + (b[1] - a[1]) * t, dx: (b[0] - a[0]) / d, dz: (b[1] - a[1]) / d };\n}\n"],
|
|
5
|
+
"mappings": "AAEO,SAASA,EAAMC,EAAQC,EAASC,EAAG,CACxC,IAAIC,EAAI,EACR,KAAOA,EAAIF,EAAQ,OAAS,GAAKA,EAAQE,CAAC,EAAID,GAAGC,IACjD,MAAMC,EAAIJ,EAAOG,EAAI,CAAC,EAAGE,EAAIL,EAAOG,CAAC,EAAGG,EAAIL,EAAQE,CAAC,EAAIF,EAAQE,EAAI,CAAC,GAAK,EACrEI,GAAKL,EAAID,EAAQE,EAAI,CAAC,GAAKG,EACjC,MAAO,CAAE,EAAGF,EAAE,CAAC,GAAKC,EAAE,CAAC,EAAID,EAAE,CAAC,GAAKG,EAAG,GAAIH,EAAE,CAAC,GAAK,KAAOC,EAAE,CAAC,GAAK,IAAMD,EAAE,CAAC,GAAK,IAAMG,EAAG,EAAGH,EAAE,CAAC,GAAKC,EAAE,CAAC,EAAID,EAAE,CAAC,GAAKG,EAAG,IAAKF,EAAE,CAAC,EAAID,EAAE,CAAC,GAAKE,EAAG,IAAKD,EAAE,CAAC,EAAID,EAAE,CAAC,GAAKE,CAAE,CACpK",
|
|
6
|
+
"names": ["along", "points", "lengths", "s", "i", "a", "b", "d", "t"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function b(s){if(!Number.isFinite(s))throw new Error("Invalid solar altitude");const t=[[-18,[3,7,20],[17,28,54],[.025,.04,.09]],[-6,[37,53,84],[182,106,86],[.12,.1,.14]],[0,[101,131,171],[246,170,115],[.38,.24,.18]],[10,[74,147,208],[197,221,237],[.8,.75,.68]],[25,[53,144,213],[223,238,250],[1,1,1]]],r=t.findIndex(n=>n[0]>=s),a=t[r<0?t.length-1:r],o=t[Math.max(0,r-1)],p=o===a||r<0?1:(s-o[0])/(a[0]-o[0]),i=n=>o[n].map((c,m)=>c+(a[n][m]-c)*p),e=n=>`rgb(${n.map(Math.round).join(", ")})`;return{background:`linear-gradient(${e(i(1))}, ${e(i(2))})`,tint:i(3)}}export{b as atmosphere};
|
|
2
|
+
//# sourceMappingURL=atmosphere.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/atmosphere.js"],
|
|
4
|
+
"sourcesContent": ["\nexport function atmosphere(altitude) {\n if (!Number.isFinite(altitude)) {\n throw new Error('Invalid solar altitude');\n }\n const stops = [\n [-18, [3, 7, 20], [17, 28, 54], [0.025, 0.04, 0.09]],\n [-6, [37, 53, 84], [182, 106, 86], [0.12, 0.10, 0.14]],\n [0, [101, 131, 171], [246, 170, 115], [0.38, 0.24, 0.18]],\n [10, [74, 147, 208], [197, 221, 237], [0.80, 0.75, 0.68]],\n [25, [53, 144, 213], [223, 238, 250], [1, 1, 1]],\n ];\n const upper = stops.findIndex(stop => stop[0] >= altitude);\n const b = stops[upper < 0 ? stops.length - 1 : upper],\n a = stops[Math.max(0, upper - 1)];\n const t = a === b || upper < 0 ? 1 : (altitude - a[0]) / (b[0] - a[0]);\n const mix = index => a[index].map((value, i) => value + (b[index][i] - value) * t);\n const rgb = values => `rgb(${values.map(Math.round).join(', ')})`;\n return { background: `linear-gradient(${rgb(mix(1))}, ${rgb(mix(2))})`, tint: mix(3) };\n}\n"],
|
|
5
|
+
"mappings": "AACO,SAASA,EAAWC,EAAU,CACnC,GAAI,CAAC,OAAO,SAASA,CAAQ,EAC3B,MAAM,IAAI,MAAM,wBAAwB,EAE1C,MAAMC,EAAQ,CACZ,CAAC,IAAK,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,GAAI,GAAI,EAAE,EAAG,CAAC,KAAO,IAAM,GAAI,CAAC,EACnD,CAAC,GAAI,CAAC,GAAI,GAAI,EAAE,EAAG,CAAC,IAAK,IAAK,EAAE,EAAG,CAAC,IAAM,GAAM,GAAI,CAAC,EACrD,CAAC,EAAG,CAAC,IAAK,IAAK,GAAG,EAAG,CAAC,IAAK,IAAK,GAAG,EAAG,CAAC,IAAM,IAAM,GAAI,CAAC,EACxD,CAAC,GAAI,CAAC,GAAI,IAAK,GAAG,EAAG,CAAC,IAAK,IAAK,GAAG,EAAG,CAAC,GAAM,IAAM,GAAI,CAAC,EACxD,CAAC,GAAI,CAAC,GAAI,IAAK,GAAG,EAAG,CAAC,IAAK,IAAK,GAAG,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,CACjD,EACMC,EAAQD,EAAM,UAAUE,GAAQA,EAAK,CAAC,GAAKH,CAAQ,EACnDI,EAAIH,EAAMC,EAAQ,EAAID,EAAM,OAAS,EAAIC,CAAK,EAC9CG,EAAIJ,EAAM,KAAK,IAAI,EAAGC,EAAQ,CAAC,CAAC,EAChCI,EAAID,IAAMD,GAAKF,EAAQ,EAAI,GAAKF,EAAWK,EAAE,CAAC,IAAMD,EAAE,CAAC,EAAIC,EAAE,CAAC,GAC9DE,EAAMC,GAASH,EAAEG,CAAK,EAAE,IAAI,CAACC,EAAOC,IAAMD,GAASL,EAAEI,CAAK,EAAEE,CAAC,EAAID,GAASH,CAAC,EAC3EK,EAAMC,GAAU,OAAOA,EAAO,IAAI,KAAK,KAAK,EAAE,KAAK,IAAI,CAAC,IAC9D,MAAO,CAAE,WAAY,mBAAmBD,EAAIJ,EAAI,CAAC,CAAC,CAAC,KAAKI,EAAIJ,EAAI,CAAC,CAAC,CAAC,IAAK,KAAMA,EAAI,CAAC,CAAE,CACvF",
|
|
6
|
+
"names": ["atmosphere", "altitude", "stops", "upper", "stop", "b", "a", "t", "mix", "index", "value", "i", "rgb", "values"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{emptyNode as _}from"./emptyNode.js";import{setParent as w}from"./setParent.js";import{traverse as G}from"./traverse.js";import{createProgram as E}from"./createProgram.js";import{endZoom as R}from"./endZoom.js";import{onMapChange as S}from"./onMapChange.js";import{onZoomAnim as A}from"./onZoomAnim.js";import{render as z}from"./render.js";import{startZoom as M}from"./startZoom.js";import{update as N}from"./update.js";import{updateArea as B}from"./updateArea.js";import{setTerrainHeight as C}from"./setTerrainHeight.js";import{resizeSunlight as D}from"./resizeSunlight.js";function O(e){const a=e.getContainer();if(a.querySelector(".leaflet-webgpu-warning"))return;const r=document.createElement("div");r.className="leaflet-webgpu-warning",r.setAttribute("role","alert"),r.style.cssText="position:absolute;z-index:1000;top:50%;left:50%;transform:translate(-50%,-50%);max-width:calc(100% - 32px);box-sizing:border-box;padding:12px 16px;border:1px solid #c98b24;border-radius:6px;background:#fff8e6;box-shadow:0 3px 12px #0005;color:#30251d;font:14px/1.5 sans-serif;text-align:center;pointer-events:auto",r.append("WebGPU is not available in this browser or device. ");const l=document.createElement("a");l.href="https://developer.mozilla.org/en-US/docs/Web/API/WebGPU_API#browser_compatibility",l.target="_blank",l.rel="noopener noreferrer",l.textContent="Learn more",r.append(l),a.append(r)}async function Q(e,a){let r=L.Layer._renderers.get(a);if(r?._rendererReady&&await r._rendererReady.promise,!r){r=e,e._rendererReady=Promise.withResolvers(),e._rendererReady.promise.catch(()=>{}),L.Layer._renderers.set(a,r);const t=d=>{throw O(a),e._rendererReady.reject(d),L.Layer._renderers.delete(a),d},u=document.createElement("canvas");navigator.gpu||t(new Error("Layer3D requires WebGPU"));const f=await navigator.gpu.requestAdapter().catch(t);f||t(new Error("Unable to acquire a WebGPU adapter"));const i=await f.requestDevice().catch(t);i.addEventListener("uncapturederror",d=>{const g=L.Layer._renderers.get(a);if(g?.renderer?.device===i)for(const T of g?._layers||[])T.fire("error",{error:d.error})}),i.lost.then(d=>{const g=L.Layer._renderers.get(a);if(!g||g.renderer?.device!==i)return;const T=new Error(`WebGPU device lost: ${d.message||d.reason}`);for(const h of g._layers)h.fire("error",{error:T})});const n=u.getContext("webgpu");n||(i.destroy(),t(new Error("Unable to create a WebGPU canvas context")));const s=navigator.gpu.getPreferredCanvasFormat();n.configure({device:i,format:s,alphaMode:"premultiplied"}),a.getContainer().querySelector(".leaflet-webgpu-warning")?.remove(),e._shared=e,e._layers=new Set,e._sceneOrigin=e.location,e.scene=_(),e.camera={position:[0,0,0],up:[0,1,0],target:[0,0,0],viewMatrix:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],projectionMatrix:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],projectionViewMatrix:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],fov:45,aspect:1,near:.1,far:1e4},e.renderer={device:i,context:n,format:s,canvas:u,dpr:Math.min(window.devicePixelRatio,2)};const o=i.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"depth"}},{binding:2,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"comparison"}},{binding:3,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"read-only-storage"}}]}),p=e.renderer.device.createBuffer({size:80,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),c=e.renderer.device.createSampler({compare:"less-equal",minFilter:"linear",magFilter:"linear"}),U=e.renderer.device.createBuffer({size:32,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});e.renderer.sunlight={layout:o,buffer:p,sampler:c,lights:U,size:0};const x=new Float32Array(20);x.set([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),e.renderer.device.queue.writeBuffer(p,0,x),D(e,1);const v=document.createElement("canvas");v.width=1,v.height=1,e.renderer.roofFallbackTexture={device:i,texture:i.createTexture({size:[1,1],format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),sampler:i.createSampler({addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}),image:v,format:"rgba8unorm",srgb:!1,uploaded:null},r._size=null,u.className="leaflet-3d",u.style.cssText="position:absolute;top:0;left:0;pointer-events:none",u.setAttribute("role","img"),u.setAttribute("aria-label",e.options.ariaLabel??"3D scene");let m=a.getPane("webgpuPane");m||(m=a.createPane("webgpuPane",a.getContainer()),m.style.zIndex=1,m.style.pointerEvents="none"),m.append(u),a.on("move zoom rotate pitch resize viewreset layeradd layerremove",S,r),a.on("zoomstart",M,r),a.on("zoomanim",A,r),a.on("zoomend",R,r),e._rendererReady.resolve(),delete r._rendererReady,z(r),L.Layer._renderers.set(a,r)}const l=a.options.crs.project(r._sceneOrigin),P=a.options.crs.project(e.location),y=Math.cos(r._sceneOrigin.lat*Math.PI/180);e._terrainBaseY??=e.root.position[1],e.root.position[0]=(P.x-l.x)*y,e.root.position[1]=e._terrainBaseY,e.root.position[2]=-(P.y-l.y)*y,C(e),e.root.scale.fill(y/Math.cos(e.location.lat*Math.PI/180)),e._shared=r,e.renderer=r.renderer,e.scene=r.scene,e.camera=r.camera,r._layers.add(e),w(e.root,r.scene),G(e.root,t=>{if(t.geometry&&t.geometry.device!==r.renderer.device){const u=t.geometry,f=t.program._layerMaterial,i={};for(const s of["position","normal","color","uv","index"]){const o=u.attributes[s];if(!o)continue;const{data:p,size:c,count:U,normalized:x}=o;i[s]={data:p.slice(0,U*c),size:c,normalized:x}}const n=r.renderer.device;i.index?.data instanceof Uint8Array&&(i.index.data=Uint16Array.from(i.index.data));for(const[s,o]of Object.entries(i))o.size||=1,o.count=o.data.length/o.size,o.indexFormat=o.data instanceof Uint32Array?"uint32":"uint16",o.buffer=n.createBuffer({size:Math.max(4,o.data.byteLength),usage:s==="index"?GPUBufferUsage.INDEX|GPUBufferUsage.COPY_DST:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST}),n.queue.writeBuffer(o.buffer,0,o.data);t.geometry={device:n,attributes:i,drawRange:{start:0,count:i.index?.count||i.position.count}};for(const s of Object.values(u.attributes))s.buffer.destroy();t.bindGroup=null,t.boundTextures=[];for(const s of["baseTexture","metalTexture","emissiveTexture","occlusionTexture"]){const o=f[s];!o||o.device===n||(f[s]={...o,device:n,texture:n.createTexture({size:[o.image.width,o.image.height],format:o.format,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),sampler:n.createSampler(o.samplerOptions),uploaded:null})}t.program.pipelineCache.clear(),t.program=E(e,f),t.device=n}t.texture&&t.texture.device!==r.renderer.device&&(t.texture={...t.texture,device:r.renderer.device,texture:r.renderer.device.createTexture({size:[t.texture.image.width,t.texture.image.height],format:t.texture.format,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),sampler:r.renderer.device.createSampler(t.texture.samplerOptions),uploaded:null})}),N(r),(e.header&&e._type!=="pmtiles"||e._geojson)&&B(e)}export{Q as attach};
|
|
2
|
+
//# sourceMappingURL=attach.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/attach.js"],
|
|
4
|
+
"sourcesContent": ["import { emptyNode } from './emptyNode.js';\nimport { setParent } from './setParent.js';\nimport { traverse } from './traverse.js';\nimport { createProgram } from './createProgram.js';\nimport { endZoom } from './endZoom.js';\nimport { onMapChange } from './onMapChange.js';\nimport { onZoomAnim } from './onZoomAnim.js';\nimport { render } from './render.js';\nimport { startZoom } from './startZoom.js';\nimport { update } from './update.js';\nimport { updateArea } from './updateArea.js';\nimport { setTerrainHeight } from './setTerrainHeight.js';\nimport { resizeSunlight } from './resizeSunlight.js';\n\nfunction showWebGPUWarning(map) {\n const container = map.getContainer();\n if (container.querySelector('.leaflet-webgpu-warning')) return;\n const warning = document.createElement('div');\n warning.className = 'leaflet-webgpu-warning';\n warning.setAttribute('role', 'alert');\n warning.style.cssText = 'position:absolute;z-index:1000;top:50%;left:50%;transform:translate(-50%,-50%);max-width:calc(100% - 32px);box-sizing:border-box;padding:12px 16px;border:1px solid #c98b24;border-radius:6px;background:#fff8e6;box-shadow:0 3px 12px #0005;color:#30251d;font:14px/1.5 sans-serif;text-align:center;pointer-events:auto';\n warning.append('WebGPU is not available in this browser or device. ');\n const link = document.createElement('a');\n link.href = 'https://developer.mozilla.org/en-US/docs/Web/API/WebGPU_API#browser_compatibility';\n link.target = '_blank';\n link.rel = 'noopener noreferrer';\n link.textContent = 'Learn more';\n warning.append(link);\n container.append(warning);\n}\n\n/** WebGPU device attachment, materials/pipelines and draw calls. */\n/**\n * Join/create this map's shared scene and rebuild GPU objects if its context changed.\n * Buffer/program handles belong to one context; typed arrays and decoded images do not.\n * @private\n */\n\nexport async function attach(backend, map) {\n let shared = L.Layer._renderers.get(map);\n if (shared?._rendererReady) {\n await shared._rendererReady.promise;\n }\n if (!shared) {\n shared = backend;\n backend._rendererReady = Promise.withResolvers();\n backend._rendererReady.promise.catch(() => { });\n L.Layer._renderers.set(map, shared);\n const fail = error => {\n showWebGPUWarning(map);\n backend._rendererReady.reject(error);\n L.Layer._renderers.delete(map);\n throw error;\n };\n const canvas = document.createElement('canvas');\n if (!navigator.gpu) {\n fail(new Error('Layer3D requires WebGPU'));\n }\n const adapter = await navigator.gpu.requestAdapter().catch(fail);\n if (!adapter) {\n fail(new Error('Unable to acquire a WebGPU adapter'));\n }\n const device = await adapter.requestDevice().catch(fail);\n device.addEventListener('uncapturederror', event => {\n const owner = L.Layer._renderers.get(map);\n if (owner?.renderer?.device !== device) {\n return;\n }\n for (const layer of owner?._layers || []) {\n layer.fire('error', { error: event.error });\n }\n });\n device.lost.then(info => {\n const owner = L.Layer._renderers.get(map);\n if (!owner || owner.renderer?.device !== device) {\n return;\n }\n const error = new Error(`WebGPU device lost: ${info.message || info.reason}`);\n for (const layer of owner._layers) {\n layer.fire('error', { error });\n }\n });\n const context = canvas.getContext('webgpu');\n if (!context) {\n device.destroy();\n fail(new Error('Unable to create a WebGPU canvas context'));\n }\n const format = navigator.gpu.getPreferredCanvasFormat();\n context.configure({ device, format, alphaMode: 'premultiplied' });\n map.getContainer().querySelector('.leaflet-webgpu-warning')?.remove();\n backend._shared = backend;\n backend._layers = new Set();\n backend._sceneOrigin = backend.location;\n backend.scene = emptyNode();\n // Perspective camera state: fov in degrees, near/far in scene metres.\n backend.camera = {\n position: [0, 0, 0],\n up: [0, 1, 0],\n target: [0, 0, 0],\n viewMatrix: [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],\n projectionMatrix: [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],\n projectionViewMatrix: [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],\n fov: 45,\n aspect: 1,\n near: 0.1,\n far: 10000,\n };\n backend.renderer = {\n device,\n context,\n format,\n canvas,\n dpr: Math.min(window.devicePixelRatio, 2)\n };\n const layout = device.createBindGroupLayout({\n entries: [\n { binding: 0, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, buffer: { type: 'uniform' } },\n { binding: 1, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: 'depth' } },\n { binding: 2, visibility: GPUShaderStage.FRAGMENT, sampler: { type: 'comparison' } },\n { binding: 3, visibility: GPUShaderStage.FRAGMENT, buffer: { type: 'read-only-storage' } },\n ]\n });\n const buffer = backend.renderer.device.createBuffer({ size: 80, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST });\n const sampler = backend.renderer.device.createSampler({ compare: 'less-equal', minFilter: 'linear', magFilter: 'linear' });\n const lights = backend.renderer.device.createBuffer({ size: 32, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST });\n backend.renderer.sunlight = { layout, buffer, sampler, lights, size: 0 };\n const values = new Float32Array(20);\n values.set([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);\n backend.renderer.device.queue.writeBuffer(buffer, 0, values);\n resizeSunlight(backend, 1);\n const emptyImage = document.createElement('canvas');\n emptyImage.width = 1;\n emptyImage.height = 1;\n backend.renderer.roofFallbackTexture = {\n device,\n texture: device.createTexture({\n size: [1, 1],\n format: 'rgba8unorm',\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,\n }),\n sampler: device.createSampler({\n addressModeU: 'clamp-to-edge', addressModeV: 'clamp-to-edge',\n }),\n image: emptyImage, format: 'rgba8unorm', srgb: false, uploaded: null,\n };\n shared._size = null;\n canvas.className = 'leaflet-3d';\n canvas.style.cssText = 'position:absolute;top:0;left:0;pointer-events:none';\n canvas.setAttribute('role', 'img');\n canvas.setAttribute('aria-label', backend.options.ariaLabel ?? '3D scene');\n let pane = map.getPane('webgpuPane');\n if (!pane) {\n pane = map.createPane('webgpuPane', map.getContainer());\n // The pitch sky uses 0 and may be inserted after this pane.\n pane.style.zIndex = 1;\n pane.style.pointerEvents = 'none';\n }\n pane.append(canvas);\n map.on('move zoom rotate pitch resize viewreset layeradd layerremove', onMapChange, shared);\n map.on('zoomstart', startZoom, shared);\n map.on('zoomanim', onZoomAnim, shared);\n map.on('zoomend', endZoom, shared);\n backend._rendererReady.resolve();\n delete shared._rendererReady;\n render(shared);\n L.Layer._renderers.set(map, shared);\n }\n const origin = map.options.crs.project(shared._sceneOrigin);\n const point = map.options.crs.project(backend.location);\n const metres = Math.cos(shared._sceneOrigin.lat * Math.PI / 180);\n backend._terrainBaseY ??= backend.root.position[1];\n backend.root.position[0] = (point.x - origin.x) * metres;\n backend.root.position[1] = backend._terrainBaseY;\n backend.root.position[2] = -(point.y - origin.y) * metres;\n setTerrainHeight(backend);\n // Each group's metres are measured at its own latitude, not the shared camera origin.\n backend.root.scale.fill(metres / Math.cos(backend.location.lat * Math.PI / 180));\n backend._shared = shared;\n backend.renderer = shared.renderer;\n backend.scene = shared.scene;\n backend.camera = shared.camera;\n shared._layers.add(backend);\n setParent(backend.root, shared.scene);\n traverse(backend.root, object => {\n if (object.geometry && object.geometry.device !== shared.renderer.device) {\n const geometry = object.geometry;\n const material = object.program._layerMaterial;\n // Retain packed CPU attributes, never old-context GPU buffer handles.\n const attributes = {};\n for (const name of ['position', 'normal', 'color', 'uv', 'index']) {\n const attribute = geometry.attributes[name];\n if (!attribute) continue;\n const { data, size, count, normalized } = attribute;\n attributes[name] = { data: data.slice(0, count * size), size, normalized };\n }\n const device = shared.renderer.device;\n if (attributes.index?.data instanceof Uint8Array) {\n attributes.index.data = Uint16Array.from(attributes.index.data);\n }\n for (const [name, attribute] of Object.entries(attributes)) {\n attribute.size ||= 1;\n attribute.count = attribute.data.length / attribute.size;\n attribute.indexFormat = attribute.data instanceof Uint32Array ? 'uint32' : 'uint16';\n attribute.buffer = device.createBuffer({\n size: Math.max(4, attribute.data.byteLength),\n usage: name === 'index'\n ? GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST\n : GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n });\n device.queue.writeBuffer(attribute.buffer, 0, attribute.data);\n }\n object.geometry = {\n device,\n attributes,\n drawRange: { start: 0, count: attributes.index?.count || attributes.position.count },\n };\n for (const attribute of Object.values(geometry.attributes)) attribute.buffer.destroy();\n object.bindGroup = null;\n object.boundTextures = [];\n for (const key of ['baseTexture', 'metalTexture', 'emissiveTexture', 'occlusionTexture']) {\n const texture = material[key];\n if (!texture || texture.device === device) continue;\n material[key] = {\n ...texture,\n device,\n texture: device.createTexture({\n size: [texture.image.width, texture.image.height],\n format: texture.format,\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,\n }),\n sampler: device.createSampler(texture.samplerOptions),\n uploaded: null,\n };\n }\n object.program.pipelineCache.clear();\n object.program = createProgram(backend, material);\n object.device = device;\n }\n if (object.texture && object.texture.device !== shared.renderer.device) {\n object.texture = {\n ...object.texture,\n device: shared.renderer.device,\n texture: shared.renderer.device.createTexture({\n size: [object.texture.image.width, object.texture.image.height],\n format: object.texture.format,\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,\n }),\n sampler: shared.renderer.device.createSampler(object.texture.samplerOptions),\n uploaded: null,\n };\n }\n });\n update(shared);\n if ((backend.header && backend._type !== 'pmtiles') || backend._geojson) updateArea(backend);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["emptyNode", "setParent", "traverse", "createProgram", "endZoom", "onMapChange", "onZoomAnim", "render", "startZoom", "update", "updateArea", "setTerrainHeight", "resizeSunlight", "showWebGPUWarning", "map", "container", "warning", "link", "attach", "backend", "shared", "fail", "error", "canvas", "adapter", "device", "event", "owner", "layer", "info", "context", "format", "layout", "buffer", "sampler", "lights", "values", "emptyImage", "pane", "origin", "point", "metres", "object", "geometry", "material", "attributes", "name", "attribute", "data", "size", "count", "normalized", "key", "texture"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function n(r){const e=r.renderer.sunlight;e.bindGroup=r.renderer.device.createBindGroup({layout:e.layout,entries:[{binding:0,resource:{buffer:e.buffer}},{binding:1,resource:e.texture.createView()},{binding:2,resource:e.sampler},{binding:3,resource:{buffer:e.lights}}]})}export{n as bindSunlight};
|
|
2
|
+
//# sourceMappingURL=bindSunlight.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/bindSunlight.js"],
|
|
4
|
+
"sourcesContent": ["\nexport function bindSunlight(backend) {\n const sun = backend.renderer.sunlight;\n sun.bindGroup = backend.renderer.device.createBindGroup({\n layout: sun.layout, entries: [\n { binding: 0, resource: { buffer: sun.buffer } },\n { binding: 1, resource: sun.texture.createView() },\n { binding: 2, resource: sun.sampler },\n { binding: 3, resource: { buffer: sun.lights } },\n ]\n });\n}\n"],
|
|
5
|
+
"mappings": "AACO,SAASA,EAAaC,EAAS,CACpC,MAAMC,EAAMD,EAAQ,SAAS,SAC7BC,EAAI,UAAYD,EAAQ,SAAS,OAAO,gBAAgB,CACtD,OAAQC,EAAI,OAAQ,QAAS,CAC3B,CAAE,QAAS,EAAG,SAAU,CAAE,OAAQA,EAAI,MAAO,CAAE,EAC/C,CAAE,QAAS,EAAG,SAAUA,EAAI,QAAQ,WAAW,CAAE,EACjD,CAAE,QAAS,EAAG,SAAUA,EAAI,OAAQ,EACpC,CAAE,QAAS,EAAG,SAAU,CAAE,OAAQA,EAAI,MAAO,CAAE,CACjD,CACF,CAAC,CACH",
|
|
6
|
+
"names": ["bindSunlight", "backend", "sun"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/box.js"],
|
|
4
|
+
"sourcesContent": ["export const box = (x0, x1, z0, z1) => [[x0, z0], [x1, z0], [x1, z1], [x0, z1]];\n"],
|
|
5
|
+
"mappings": "AAAO,MAAMA,EAAM,CAACC,EAAIC,EAAIC,EAAIC,IAAO,CAAC,CAACH,EAAIE,CAAE,EAAG,CAACD,EAAIC,CAAE,EAAG,CAACD,EAAIE,CAAE,EAAG,CAACH,EAAIG,CAAE,CAAC",
|
|
6
|
+
"names": ["box", "x0", "x1", "z0", "z1"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function s(e,l){for(const f of l?.get(`${Math.floor(e.x/64)}/${Math.floor(e.y/64)}`)||[])if(!(e.x<f.min[0]||e.x>f.max[0]||e.y<f.min[1]||e.y>f.max[1]))for(const[c,o,r]of f.triangles){const n=(o[1]-r[1])*(c[0]-r[0])+(r[0]-o[0])*(c[1]-r[1]),x=((o[1]-r[1])*(e.x-r[0])+(r[0]-o[0])*(e.y-r[1]))/n,a=((r[1]-c[1])*(e.x-r[0])+(c[0]-r[0])*(e.y-r[1]))/n;if(x>=0&&a>=0&&x+a<=1)return x*c[2]+a*o[2]+(1-x-a)*r[2]}return null}export{s as bridgeElevation};
|
|
2
|
+
//# sourceMappingURL=bridgeElevation.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/bridgeElevation.js"],
|
|
4
|
+
"sourcesContent": ["/** Height inside a bridge deck, or null outside its triangles. */\nexport function bridgeElevation(point, bridges) {\n // Bridges bucketed by 64 DEM pixels.\n for (const bridge of bridges?.get(`${Math.floor(point.x / 64)}/${Math.floor(point.y / 64)}`) || []) {\n if (point.x < bridge.min[0] || point.x > bridge.max[0] || point.y < bridge.min[1] || point.y > bridge.max[1]) {\n continue;\n }\n for (const [a, b, c] of bridge.triangles) {\n const d = (b[1] - c[1]) * (a[0] - c[0]) + (c[0] - b[0]) * (a[1] - c[1]);\n const u = ((b[1] - c[1]) * (point.x - c[0]) + (c[0] - b[0]) * (point.y - c[1])) / d;\n const v = ((c[1] - a[1]) * (point.x - c[0]) + (a[0] - c[0]) * (point.y - c[1])) / d;\n if (u >= 0 && v >= 0 && u + v <= 1) {\n return u * a[2] + v * b[2] + (1 - u - v) * c[2];\n }\n }\n }\n return null;\n}\n"],
|
|
5
|
+
"mappings": "AACO,SAASA,EAAgBC,EAAOC,EAAS,CAE9C,UAAWC,KAAUD,GAAS,IAAI,GAAG,KAAK,MAAMD,EAAM,EAAI,EAAE,CAAC,IAAI,KAAK,MAAMA,EAAM,EAAI,EAAE,CAAC,EAAE,GAAK,CAAC,EAC/F,GAAI,EAAAA,EAAM,EAAIE,EAAO,IAAI,CAAC,GAAKF,EAAM,EAAIE,EAAO,IAAI,CAAC,GAAKF,EAAM,EAAIE,EAAO,IAAI,CAAC,GAAKF,EAAM,EAAIE,EAAO,IAAI,CAAC,GAG3G,SAAW,CAACC,EAAGC,EAAGC,CAAC,IAAKH,EAAO,UAAW,CACxC,MAAMI,GAAKF,EAAE,CAAC,EAAIC,EAAE,CAAC,IAAMF,EAAE,CAAC,EAAIE,EAAE,CAAC,IAAMA,EAAE,CAAC,EAAID,EAAE,CAAC,IAAMD,EAAE,CAAC,EAAIE,EAAE,CAAC,GAC/DE,IAAMH,EAAE,CAAC,EAAIC,EAAE,CAAC,IAAML,EAAM,EAAIK,EAAE,CAAC,IAAMA,EAAE,CAAC,EAAID,EAAE,CAAC,IAAMJ,EAAM,EAAIK,EAAE,CAAC,IAAMC,EAC5EE,IAAMH,EAAE,CAAC,EAAIF,EAAE,CAAC,IAAMH,EAAM,EAAIK,EAAE,CAAC,IAAMF,EAAE,CAAC,EAAIE,EAAE,CAAC,IAAML,EAAM,EAAIK,EAAE,CAAC,IAAMC,EAClF,GAAIC,GAAK,GAAKC,GAAK,GAAKD,EAAIC,GAAK,EAC/B,OAAOD,EAAIJ,EAAE,CAAC,EAAIK,EAAIJ,EAAE,CAAC,GAAK,EAAIG,EAAIC,GAAKH,EAAE,CAAC,CAElD,CAEF,OAAO,IACT",
|
|
6
|
+
"names": ["bridgeElevation", "point", "bridges", "bridge", "a", "b", "c", "d", "u", "v"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const u=f=>{const g=[],m=[],a=[],r=(p,c,e,i)=>{const h=c.map((n,l)=>n-p[l]),t=e.map((n,l)=>n-p[l]),s=[h[1]*t[2]-h[2]*t[1],h[2]*t[0]-h[0]*t[2],h[0]*t[1]-h[1]*t[0]],o=Math.hypot(...s);for(const n of[p,c,e])g.push(...n),m.push(...s.map(l=>l/o)),a.push(...i)};for(const[p,c,e,i,h=p]of f){const t=p.map(([o,n])=>[o,c,n]),s=h.map(([o,n])=>[o,e,n]);for(let o=0;o<p.length;o++){const n=(o+1)%p.length;r(t[o],t[n],s[n],i),r(t[o],s[n],s[o],i)}for(let o=1;o<p.length-1;o++)r(s[0],s[o],s[o+1],i),r(t[0],t[o+1],t[o],i)}return{position:g,normal:m,color:a}};export{u as build};
|
|
2
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/build.js"],
|
|
4
|
+
"sourcesContent": ["\nexport const build = parts => {\n const position = [], normal = [], color = [];\n const triangle = (a, b, c, tint) => {\n const u = b.map((v, i) => v - a[i]), v = c.map((w, i) => w - a[i]);\n const n = [u[1] * v[2] - u[2] * v[1], u[2] * v[0] - u[0] * v[2], u[0] * v[1] - u[1] * v[0]], length = Math.hypot(...n);\n for (const point of [a, b, c]) { position.push(...point); normal.push(...n.map(w => w / length)); color.push(...tint); }\n };\n for (const [ring, bottom, top, tint, topRing = ring] of parts) {\n const low = ring.map(([x, z]) => [x, bottom, z]), high = topRing.map(([x, z]) => [x, top, z]);\n for (let i = 0; i < ring.length; i++) {\n const j = (i + 1) % ring.length;\n triangle(low[i], low[j], high[j], tint); triangle(low[i], high[j], high[i], tint);\n }\n for (let i = 1; i < ring.length - 1; i++) {\n triangle(high[0], high[i], high[i + 1], tint); triangle(low[0], low[i + 1], low[i], tint);\n }\n }\n return { position, normal, color };\n};\n"],
|
|
5
|
+
"mappings": "AACO,MAAMA,EAAQC,GAAS,CAC5B,MAAMC,EAAW,CAAC,EAAGC,EAAS,CAAC,EAAGC,EAAQ,CAAC,EACrCC,EAAW,CAACC,EAAGC,EAAGC,EAAGC,IAAS,CAClC,MAAMC,EAAIH,EAAE,IAAI,CAACI,EAAGC,IAAMD,EAAIL,EAAEM,CAAC,CAAC,EAAGD,EAAIH,EAAE,IAAI,CAACK,EAAGD,IAAMC,EAAIP,EAAEM,CAAC,CAAC,EAC3DE,EAAI,CAACJ,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAID,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAGD,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAID,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAGD,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAID,EAAE,CAAC,EAAIC,EAAE,CAAC,CAAC,EAAGI,EAAS,KAAK,MAAM,GAAGD,CAAC,EACrH,UAAWE,IAAS,CAACV,EAAGC,EAAGC,CAAC,EAAKN,EAAS,KAAK,GAAGc,CAAK,EAAGb,EAAO,KAAK,GAAGW,EAAE,IAAID,GAAKA,EAAIE,CAAM,CAAC,EAAGX,EAAM,KAAK,GAAGK,CAAI,CACtH,EACA,SAAW,CAACQ,EAAMC,EAAQC,EAAKV,EAAMW,EAAUH,CAAI,IAAKhB,EAAO,CAC7D,MAAMoB,EAAMJ,EAAK,IAAI,CAAC,CAACK,EAAGC,CAAC,IAAM,CAACD,EAAGJ,EAAQK,CAAC,CAAC,EAAGC,EAAOJ,EAAQ,IAAI,CAAC,CAACE,EAAGC,CAAC,IAAM,CAACD,EAAGH,EAAKI,CAAC,CAAC,EAC5F,QAASX,EAAI,EAAGA,EAAIK,EAAK,OAAQL,IAAK,CACpC,MAAMa,GAAKb,EAAI,GAAKK,EAAK,OACzBZ,EAASgB,EAAIT,CAAC,EAAGS,EAAII,CAAC,EAAGD,EAAKC,CAAC,EAAGhB,CAAI,EAAGJ,EAASgB,EAAIT,CAAC,EAAGY,EAAKC,CAAC,EAAGD,EAAKZ,CAAC,EAAGH,CAAI,CAClF,CACA,QAASG,EAAI,EAAGA,EAAIK,EAAK,OAAS,EAAGL,IACnCP,EAASmB,EAAK,CAAC,EAAGA,EAAKZ,CAAC,EAAGY,EAAKZ,EAAI,CAAC,EAAGH,CAAI,EAAGJ,EAASgB,EAAI,CAAC,EAAGA,EAAIT,EAAI,CAAC,EAAGS,EAAIT,CAAC,EAAGH,CAAI,CAE5F,CACA,MAAO,CAAE,SAAAP,EAAU,OAAAC,EAAQ,MAAAC,CAAM,CACnC",
|
|
6
|
+
"names": ["build", "parts", "position", "normal", "color", "triangle", "a", "b", "c", "tint", "u", "v", "i", "w", "n", "length", "point", "ring", "bottom", "top", "topRing", "low", "x", "z", "high", "j"]
|
|
7
|
+
}
|