leaflet-city-mapper 0.0.0-stage → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +674 -0
- package/README.md +78 -2
- package/cucumber.mjs +9 -0
- package/dist/leaflet-city-mapper.js +2 -0
- package/dist/leaflet-city-mapper.js.map +7 -0
- package/dist/utils/CELL.js +2 -0
- package/dist/utils/CELL.js.map +7 -0
- package/dist/utils/addBridges.js +2 -0
- package/dist/utils/addBridges.js.map +7 -0
- package/dist/utils/addRasterTile.js +2 -0
- package/dist/utils/addRasterTile.js.map +7 -0
- package/dist/utils/along.js +2 -0
- package/dist/utils/along.js.map +7 -0
- package/dist/utils/atmosphere.js +2 -0
- package/dist/utils/atmosphere.js.map +7 -0
- package/dist/utils/attach.js +2 -0
- package/dist/utils/attach.js.map +7 -0
- package/dist/utils/bindSunlight.js +2 -0
- package/dist/utils/bindSunlight.js.map +7 -0
- package/dist/utils/box.js +2 -0
- package/dist/utils/box.js.map +7 -0
- package/dist/utils/bridgeElevation.js +2 -0
- package/dist/utils/bridgeElevation.js.map +7 -0
- package/dist/utils/build.js +2 -0
- package/dist/utils/build.js.map +7 -0
- package/dist/utils/cameraControls.js +2 -0
- package/dist/utils/cameraControls.js.map +7 -0
- package/dist/utils/channel.js +2 -0
- package/dist/utils/channel.js.map +7 -0
- package/dist/utils/collider.js +2 -0
- package/dist/utils/collider.js.map +7 -0
- package/dist/utils/colliders.js +2 -0
- package/dist/utils/colliders.js.map +7 -0
- package/dist/utils/computeBounds.js +2 -0
- package/dist/utils/computeBounds.js.map +7 -0
- package/dist/utils/conformModelToTerrain.js +2 -0
- package/dist/utils/conformModelToTerrain.js.map +7 -0
- package/dist/utils/createMesh.js +2 -0
- package/dist/utils/createMesh.js.map +7 -0
- package/dist/utils/createProgram.js +3 -0
- package/dist/utils/createProgram.js.map +7 -0
- package/dist/utils/decodeDirectory.js +2 -0
- package/dist/utils/decodeDirectory.js.map +7 -0
- package/dist/utils/decodeHeader.js +2 -0
- package/dist/utils/decodeHeader.js.map +7 -0
- package/dist/utils/decodeModel.js +2 -0
- package/dist/utils/decodeModel.js.map +7 -0
- package/dist/utils/decompress.js +2 -0
- package/dist/utils/decompress.js.map +7 -0
- package/dist/utils/destroyTexture.js +2 -0
- package/dist/utils/destroyTexture.js.map +7 -0
- package/dist/utils/disposeMesh.js +2 -0
- package/dist/utils/disposeMesh.js.map +7 -0
- package/dist/utils/drawGeometry.js +2 -0
- package/dist/utils/drawGeometry.js.map +7 -0
- package/dist/utils/elevationWGSL.js +24 -0
- package/dist/utils/elevationWGSL.js.map +7 -0
- package/dist/utils/emptyNode.js +2 -0
- package/dist/utils/emptyNode.js.map +7 -0
- package/dist/utils/endZoom.js +2 -0
- package/dist/utils/endZoom.js.map +7 -0
- package/dist/utils/findFeature.js +2 -0
- package/dist/utils/findFeature.js.map +7 -0
- package/dist/utils/geometry.js +1 -0
- package/dist/utils/geometry.js.map +7 -0
- package/dist/utils/getElevation.js +2 -0
- package/dist/utils/getElevation.js.map +7 -0
- package/dist/utils/getHeader.js +2 -0
- package/dist/utils/getHeader.js.map +7 -0
- package/dist/utils/getZxy.js +2 -0
- package/dist/utils/getZxy.js.map +7 -0
- package/dist/utils/glass.js +2 -0
- package/dist/utils/glass.js.map +7 -0
- package/dist/utils/headlight.js +2 -0
- package/dist/utils/headlight.js.map +7 -0
- package/dist/utils/hit.js +2 -0
- package/dist/utils/hit.js.map +7 -0
- package/dist/utils/horizontalPosition.js +2 -0
- package/dist/utils/horizontalPosition.js.map +7 -0
- package/dist/utils/horizontalRay.js +2 -0
- package/dist/utils/horizontalRay.js.map +7 -0
- package/dist/utils/hull.js +2 -0
- package/dist/utils/hull.js.map +7 -0
- package/dist/utils/initSunlight.js +2 -0
- package/dist/utils/initSunlight.js.map +7 -0
- package/dist/utils/initTerrain.js +2 -0
- package/dist/utils/initTerrain.js.map +7 -0
- package/dist/utils/initTraffic.js +40 -0
- package/dist/utils/initTraffic.js.map +7 -0
- package/dist/utils/initWalk.js +2 -0
- package/dist/utils/initWalk.js.map +7 -0
- package/dist/utils/intersectMeshes.js +2 -0
- package/dist/utils/intersectMeshes.js.map +7 -0
- package/dist/utils/isClockWise.js +2 -0
- package/dist/utils/isClockWise.js.map +7 -0
- package/dist/utils/lampPostGeometry.js +2 -0
- package/dist/utils/lampPostGeometry.js.map +7 -0
- package/dist/utils/lightGeometry.js +2 -0
- package/dist/utils/lightGeometry.js.map +7 -0
- package/dist/utils/lightGrid.js +2 -0
- package/dist/utils/lightGrid.js.map +7 -0
- package/dist/utils/limbs.js +2 -0
- package/dist/utils/limbs.js.map +7 -0
- package/dist/utils/loadModel.js +2 -0
- package/dist/utils/loadModel.js.map +7 -0
- package/dist/utils/loadSource.js +2 -0
- package/dist/utils/loadSource.js.map +7 -0
- package/dist/utils/loadTerrain.js +2 -0
- package/dist/utils/loadTerrain.js.map +7 -0
- package/dist/utils/mapCamera.js +2 -0
- package/dist/utils/mapCamera.js.map +7 -0
- package/dist/utils/materialShaders.js +211 -0
- package/dist/utils/materialShaders.js.map +7 -0
- package/dist/utils/mirror.js +2 -0
- package/dist/utils/mirror.js.map +7 -0
- package/dist/utils/moonPosition.js +2 -0
- package/dist/utils/moonPosition.js.map +7 -0
- package/dist/utils/moves.js +2 -0
- package/dist/utils/moves.js.map +7 -0
- package/dist/utils/nativeEvents.js +2 -0
- package/dist/utils/nativeEvents.js.map +7 -0
- package/dist/utils/nativeGeometry.js +2 -0
- package/dist/utils/nativeGeometry.js.map +7 -0
- package/dist/utils/nativeLayer.js +2 -0
- package/dist/utils/nativeLayer.js.map +7 -0
- package/dist/utils/nodeMatrix.js +2 -0
- package/dist/utils/nodeMatrix.js.map +7 -0
- package/dist/utils/onAdd3DLayer.js +2 -0
- package/dist/utils/onAdd3DLayer.js.map +7 -0
- package/dist/utils/onAddSun.js +2 -0
- package/dist/utils/onAddSun.js.map +7 -0
- package/dist/utils/onClick.js +2 -0
- package/dist/utils/onClick.js.map +7 -0
- package/dist/utils/onMapChange.js +2 -0
- package/dist/utils/onMapChange.js.map +7 -0
- package/dist/utils/onPMTileAdd.js +2 -0
- package/dist/utils/onPMTileAdd.js.map +7 -0
- package/dist/utils/onPMTileRemove.js +2 -0
- package/dist/utils/onPMTileRemove.js.map +7 -0
- package/dist/utils/onPointerLeave.js +2 -0
- package/dist/utils/onPointerLeave.js.map +7 -0
- package/dist/utils/onPointerMove.js +2 -0
- package/dist/utils/onPointerMove.js.map +7 -0
- package/dist/utils/onRemove3DLayer.js +2 -0
- package/dist/utils/onRemove3DLayer.js.map +7 -0
- package/dist/utils/onRemoveSun.js +2 -0
- package/dist/utils/onRemoveSun.js.map +7 -0
- package/dist/utils/onTerrainAdd.js +2 -0
- package/dist/utils/onTerrainAdd.js.map +7 -0
- package/dist/utils/onTerrainChange.js +2 -0
- package/dist/utils/onTerrainChange.js.map +7 -0
- package/dist/utils/onTerrainRemove.js +2 -0
- package/dist/utils/onTerrainRemove.js.map +7 -0
- package/dist/utils/onZoomAnim.js +2 -0
- package/dist/utils/onZoomAnim.js.map +7 -0
- package/dist/utils/paints.js +2 -0
- package/dist/utils/paints.js.map +7 -0
- package/dist/utils/parseColor.js +2 -0
- package/dist/utils/parseColor.js.map +7 -0
- package/dist/utils/parts.js +2 -0
- package/dist/utils/parts.js.map +7 -0
- package/dist/utils/projectCelestialBody.js +2 -0
- package/dist/utils/projectCelestialBody.js.map +7 -0
- package/dist/utils/pump.js +2 -0
- package/dist/utils/pump.js.map +7 -0
- package/dist/utils/rasterTiles.js +2 -0
- package/dist/utils/rasterTiles.js.map +7 -0
- package/dist/utils/raycast.js +2 -0
- package/dist/utils/raycast.js.map +7 -0
- package/dist/utils/read.js +2 -0
- package/dist/utils/read.js.map +7 -0
- package/dist/utils/readAccessor.js +2 -0
- package/dist/utils/readAccessor.js.map +7 -0
- package/dist/utils/releaseArea.js +2 -0
- package/dist/utils/releaseArea.js.map +7 -0
- package/dist/utils/removeRasterTile.js +2 -0
- package/dist/utils/removeRasterTile.js.map +7 -0
- package/dist/utils/render.js +15 -0
- package/dist/utils/render.js.map +7 -0
- package/dist/utils/renderSunlight.js +13 -0
- package/dist/utils/renderSunlight.js.map +7 -0
- package/dist/utils/renderers.js +2 -0
- package/dist/utils/renderers.js.map +7 -0
- package/dist/utils/resizeSunlight.js +2 -0
- package/dist/utils/resizeSunlight.js.map +7 -0
- package/dist/utils/roofCoverage.js +2 -0
- package/dist/utils/roofCoverage.js.map +7 -0
- package/dist/utils/routeGeometry.js +2 -0
- package/dist/utils/routeGeometry.js.map +7 -0
- package/dist/utils/scheduledTrips.js +2 -0
- package/dist/utils/scheduledTrips.js.map +7 -0
- package/dist/utils/setGeoJSONData.js +2 -0
- package/dist/utils/setGeoJSONData.js.map +7 -0
- package/dist/utils/setHighlight.js +2 -0
- package/dist/utils/setHighlight.js.map +7 -0
- package/dist/utils/setPMTileOpacity.js +2 -0
- package/dist/utils/setPMTileOpacity.js.map +7 -0
- package/dist/utils/setPMTileZIndex.js +2 -0
- package/dist/utils/setPMTileZIndex.js.map +7 -0
- package/dist/utils/setParent.js +2 -0
- package/dist/utils/setParent.js.map +7 -0
- package/dist/utils/setTerrainHeight.js +2 -0
- package/dist/utils/setTerrainHeight.js.map +7 -0
- package/dist/utils/setVertexColor.js +2 -0
- package/dist/utils/setVertexColor.js.map +7 -0
- package/dist/utils/showFeature.js +2 -0
- package/dist/utils/showFeature.js.map +7 -0
- package/dist/utils/sizes.js +2 -0
- package/dist/utils/sizes.js.map +7 -0
- package/dist/utils/skin.js +2 -0
- package/dist/utils/skin.js.map +7 -0
- package/dist/utils/solarPosition.js +2 -0
- package/dist/utils/solarPosition.js.map +7 -0
- package/dist/utils/sortMeshes.js +2 -0
- package/dist/utils/sortMeshes.js.map +7 -0
- package/dist/utils/speed.js +2 -0
- package/dist/utils/speed.js.map +7 -0
- package/dist/utils/startZoom.js +2 -0
- package/dist/utils/startZoom.js.map +7 -0
- package/dist/utils/taillight.js +2 -0
- package/dist/utils/taillight.js.map +7 -0
- package/dist/utils/terrainAtlas.js +2 -0
- package/dist/utils/terrainAtlas.js.map +7 -0
- package/dist/utils/terrainElevation.js +2 -0
- package/dist/utils/terrainElevation.js.map +7 -0
- package/dist/utils/terrainGrid.js +2 -0
- package/dist/utils/terrainGrid.js.map +7 -0
- package/dist/utils/textureSampler.js +2 -0
- package/dist/utils/textureSampler.js.map +7 -0
- package/dist/utils/tileId.js +2 -0
- package/dist/utils/tileId.js.map +7 -0
- package/dist/utils/toLanes.js +2 -0
- package/dist/utils/toLanes.js.map +7 -0
- package/dist/utils/toSRGB.js +2 -0
- package/dist/utils/toSRGB.js.map +7 -0
- package/dist/utils/tooltip.js +3 -0
- package/dist/utils/tooltip.js.map +7 -0
- package/dist/utils/traffic.js +2 -0
- package/dist/utils/traffic.js.map +7 -0
- package/dist/utils/traverse.js +2 -0
- package/dist/utils/traverse.js.map +7 -0
- package/dist/utils/treeGeometry.js +2 -0
- package/dist/utils/treeGeometry.js.map +7 -0
- package/dist/utils/triangulate.js +2 -0
- package/dist/utils/triangulate.js.map +7 -0
- package/dist/utils/tripsAt.js +2 -0
- package/dist/utils/tripsAt.js.map +7 -0
- package/dist/utils/types.js +2 -0
- package/dist/utils/types.js.map +7 -0
- package/dist/utils/underEntry.js +2 -0
- package/dist/utils/underEntry.js.map +7 -0
- package/dist/utils/update.js +2 -0
- package/dist/utils/update.js.map +7 -0
- package/dist/utils/updateArea.js +2 -0
- package/dist/utils/updateArea.js.map +7 -0
- package/dist/utils/updateCamera.js +2 -0
- package/dist/utils/updateCamera.js.map +7 -0
- package/dist/utils/updatePointLights.js +2 -0
- package/dist/utils/updatePointLights.js.map +7 -0
- package/dist/utils/updateWorldMatrix.js +2 -0
- package/dist/utils/updateWorldMatrix.js.map +7 -0
- package/dist/utils/vehicleOffsets.js +2 -0
- package/dist/utils/vehicleOffsets.js.map +7 -0
- package/dist/utils/vehicles.js +2 -0
- package/dist/utils/vehicles.js.map +7 -0
- package/dist/utils/vertexNormals.js +2 -0
- package/dist/utils/vertexNormals.js.map +7 -0
- package/dist/utils/walk.js +2 -0
- package/dist/utils/walk.js.map +7 -0
- package/dist/utils/white.js +2 -0
- package/dist/utils/white.js.map +7 -0
- package/dist/utils/worldLights.js +2 -0
- package/dist/utils/worldLights.js.map +7 -0
- package/dist/utils/wrap.js +2 -0
- package/dist/utils/wrap.js.map +7 -0
- package/package.json +43 -4
- package/src/index.js +397 -0
- package/src/utils/CELL.js +4 -0
- package/src/utils/addBridges.js +66 -0
- package/src/utils/addRasterTile.js +112 -0
- package/src/utils/along.js +9 -0
- package/src/utils/atmosphere.js +20 -0
- package/src/utils/attach.js +255 -0
- package/src/utils/bindSunlight.js +12 -0
- package/src/utils/box.js +1 -0
- package/src/utils/bridgeElevation.js +18 -0
- package/src/utils/build.js +20 -0
- package/src/utils/cameraControls.js +287 -0
- package/src/utils/channel.js +4 -0
- package/src/utils/collider.js +62 -0
- package/src/utils/colliders.js +2 -0
- package/src/utils/computeBounds.js +17 -0
- package/src/utils/conformModelToTerrain.js +69 -0
- package/src/utils/createMesh.js +31 -0
- package/src/utils/createProgram.js +92 -0
- package/src/utils/decodeDirectory.js +40 -0
- package/src/utils/decodeHeader.js +15 -0
- package/src/utils/decodeModel.js +43 -0
- package/src/utils/decompress.js +5 -0
- package/src/utils/destroyTexture.js +7 -0
- package/src/utils/disposeMesh.js +13 -0
- package/src/utils/drawGeometry.js +122 -0
- package/src/utils/elevationWGSL.js +27 -0
- package/src/utils/emptyNode.js +9 -0
- package/src/utils/endZoom.js +15 -0
- package/src/utils/findFeature.js +49 -0
- package/src/utils/geometry.js +2 -0
- package/src/utils/getElevation.js +10 -0
- package/src/utils/getHeader.js +9 -0
- package/src/utils/getZxy.js +76 -0
- package/src/utils/glass.js +1 -0
- package/src/utils/headlight.js +1 -0
- package/src/utils/hit.js +41 -0
- package/src/utils/horizontalPosition.js +16 -0
- package/src/utils/horizontalRay.js +12 -0
- package/src/utils/hull.js +1 -0
- package/src/utils/initSunlight.js +9 -0
- package/src/utils/initTerrain.js +19 -0
- package/src/utils/initTraffic.js +93 -0
- package/src/utils/initWalk.js +72 -0
- package/src/utils/intersectMeshes.js +121 -0
- package/src/utils/isClockWise.js +12 -0
- package/src/utils/lampPostGeometry.js +26 -0
- package/src/utils/lightGeometry.js +22 -0
- package/src/utils/lightGrid.js +50 -0
- package/src/utils/limbs.js +9 -0
- package/src/utils/loadModel.js +217 -0
- package/src/utils/loadSource.js +17 -0
- package/src/utils/loadTerrain.js +65 -0
- package/src/utils/mapCamera.js +432 -0
- package/src/utils/materialShaders.js +243 -0
- package/src/utils/mirror.js +6 -0
- package/src/utils/moonPosition.js +17 -0
- package/src/utils/moves.js +11 -0
- package/src/utils/nativeEvents.js +77 -0
- package/src/utils/nativeGeometry.js +131 -0
- package/src/utils/nativeLayer.js +317 -0
- package/src/utils/nodeMatrix.js +22 -0
- package/src/utils/onAdd3DLayer.js +31 -0
- package/src/utils/onAddSun.js +147 -0
- package/src/utils/onClick.js +13 -0
- package/src/utils/onMapChange.js +16 -0
- package/src/utils/onPMTileAdd.js +15 -0
- package/src/utils/onPMTileRemove.js +8 -0
- package/src/utils/onPointerLeave.js +11 -0
- package/src/utils/onPointerMove.js +15 -0
- package/src/utils/onRemove3DLayer.js +78 -0
- package/src/utils/onRemoveSun.js +3 -0
- package/src/utils/onTerrainAdd.js +18 -0
- package/src/utils/onTerrainChange.js +13 -0
- package/src/utils/onTerrainRemove.js +40 -0
- package/src/utils/onZoomAnim.js +14 -0
- package/src/utils/paints.js +10 -0
- package/src/utils/parseColor.js +42 -0
- package/src/utils/parts.js +16 -0
- package/src/utils/projectCelestialBody.js +13 -0
- package/src/utils/pump.js +226 -0
- package/src/utils/rasterTiles.js +285 -0
- package/src/utils/raycast.js +60 -0
- package/src/utils/read.js +29 -0
- package/src/utils/readAccessor.js +68 -0
- package/src/utils/releaseArea.js +34 -0
- package/src/utils/removeRasterTile.js +13 -0
- package/src/utils/render.js +406 -0
- package/src/utils/renderSunlight.js +170 -0
- package/src/utils/renderers.js +2 -0
- package/src/utils/resizeSunlight.js +15 -0
- package/src/utils/roofCoverage.js +47 -0
- package/src/utils/routeGeometry.js +22 -0
- package/src/utils/scheduledTrips.js +29 -0
- package/src/utils/setGeoJSONData.js +11 -0
- package/src/utils/setHighlight.js +13 -0
- package/src/utils/setPMTileOpacity.js +7 -0
- package/src/utils/setPMTileZIndex.js +7 -0
- package/src/utils/setParent.js +7 -0
- package/src/utils/setTerrainHeight.js +10 -0
- package/src/utils/setVertexColor.js +14 -0
- package/src/utils/showFeature.js +27 -0
- package/src/utils/sizes.js +1 -0
- package/src/utils/skin.js +2 -0
- package/src/utils/solarPosition.js +17 -0
- package/src/utils/sortMeshes.js +12 -0
- package/src/utils/speed.js +3 -0
- package/src/utils/startZoom.js +5 -0
- package/src/utils/taillight.js +1 -0
- package/src/utils/terrainAtlas.js +21 -0
- package/src/utils/terrainElevation.js +20 -0
- package/src/utils/terrainGrid.js +23 -0
- package/src/utils/textureSampler.js +10 -0
- package/src/utils/tileId.js +18 -0
- package/src/utils/toLanes.js +7 -0
- package/src/utils/toSRGB.js +1 -0
- package/src/utils/tooltip.js +6 -0
- package/src/utils/traffic.js +315 -0
- package/src/utils/traverse.js +6 -0
- package/src/utils/treeGeometry.js +45 -0
- package/src/utils/triangulate.js +100 -0
- package/src/utils/tripsAt.js +16 -0
- package/src/utils/types.js +8 -0
- package/src/utils/underEntry.js +17 -0
- package/src/utils/update.js +18 -0
- package/src/utils/updateArea.js +40 -0
- package/src/utils/updateCamera.js +32 -0
- package/src/utils/updatePointLights.js +38 -0
- package/src/utils/updateWorldMatrix.js +47 -0
- package/src/utils/vehicleOffsets.js +8 -0
- package/src/utils/vehicles.js +65 -0
- package/src/utils/vertexNormals.js +30 -0
- package/src/utils/walk.js +187 -0
- package/src/utils/white.js +1 -0
- package/src/utils/worldLights.js +25 -0
- package/src/utils/wrap.js +1 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/hit.js"],
|
|
4
|
+
"sourcesContent": ["import { CELL } from './CELL.js';\nimport { collider } from './collider.js';\nimport { computeBounds } from './computeBounds.js';\nimport { horizontalRay } from './horizontalRay.js';\nimport { traverse } from './traverse.js';\nimport { updateWorldMatrix } from './updateWorldMatrix.js';\n\n// Horizontal normal of the nearest wall faced within `reach` metres of the feet at world (x, y, z), walking along\n// the unit (dx, dz); knee and chest rays, so arches and tree crowns above the head let the walker through.\n// ponytail: traffic vehicles and boats move on the GPU and are not obstacles.\n\nexport function hit(layer, x, y, z, dx, dz, reach) {\n const skip = other => other === layer || ['terrain', 'traffic'].includes(other._type);\n updateWorldMatrix(layer.scene);\n let best = reach, found = null;\n for (const other of layer._shared._layers) {\n if (skip(other)) continue;\n traverse(other.root, mesh => {\n if (!mesh.visible) return true;\n if (!mesh.geometry?.attributes?.position?.data || mesh.program?.depthTest === false) return;\n if (!mesh.geometry.bounds) computeBounds(mesh.geometry);\n const m = mesh.worldMatrix, { center: k, radius } = mesh.geometry.bounds;\n if (Math.hypot(m[0] * k[0] + m[4] * k[1] + m[8] * k[2] + m[12] - x, m[2] * k[0] + m[6] * k[1] + m[10] * k[2] + m[14] - z) >\n radius * Math.hypot(m[0], m[1], m[2]) + reach) return;\n const c = collider(mesh), ox = x - m[12] + c.origin[0], oy = y - m[13] + c.origin[1], oz = z - m[14] + c.origin[2];\n const seen = new Set();\n for (let ix = Math.floor(Math.min(ox, ox + dx * reach) / CELL); ix <= Math.floor(Math.max(ox, ox + dx * reach) / CELL); ix++)\n for (let iz = Math.floor(Math.min(oz, oz + dz * reach) / CELL); iz <= Math.floor(Math.max(oz, oz + dz * reach) / CELL); iz++)\n for (const t of c.cells.get(ix + ',' + iz) || []) {\n // Walls are one-way: walking out of a building (e.g. starting inside one) is allowed.\n if (seen.has(t) || dx * c.nrm[t * 2] + dz * c.nrm[t * 2 + 1] >= 0) continue;\n seen.add(t);\n for (const height of [0.4, 1.5]) {\n const d = horizontalRay(c.tri, t, ox, oy + height, oz, dx, dz);\n if (d >= 0 && d < best) { best = d; found = [c.nrm[t * 2], c.nrm[t * 2 + 1]]; }\n }\n }\n });\n }\n return found;\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,QAAAA,MAAY,YACrB,OAAS,YAAAC,MAAgB,gBACzB,OAAS,iBAAAC,MAAqB,qBAC9B,OAAS,iBAAAC,MAAqB,qBAC9B,OAAS,YAAAC,MAAgB,gBACzB,OAAS,qBAAAC,MAAyB,yBAM3B,SAASC,EAAIC,EAAOC,EAAGC,EAAGC,EAAGC,EAAIC,EAAIC,EAAO,CACjD,MAAMC,EAAOC,GAASA,IAAUR,GAAS,CAAC,UAAW,SAAS,EAAE,SAASQ,EAAM,KAAK,EACpFV,EAAkBE,EAAM,KAAK,EAC7B,IAAIS,EAAOH,EAAOI,EAAQ,KAC1B,UAAWF,KAASR,EAAM,QAAQ,QAC5BO,EAAKC,CAAK,GACdX,EAASW,EAAM,KAAMG,GAAQ,CAC3B,GAAI,CAACA,EAAK,QAAS,MAAO,GAC1B,GAAI,CAACA,EAAK,UAAU,YAAY,UAAU,MAAQA,EAAK,SAAS,YAAc,GAAO,OAChFA,EAAK,SAAS,QAAQhB,EAAcgB,EAAK,QAAQ,EACtD,MAAMC,EAAID,EAAK,YAAa,CAAE,OAAQE,EAAG,OAAAC,CAAO,EAAIH,EAAK,SAAS,OAClE,GAAI,KAAK,MAAMC,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAID,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAID,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAID,EAAE,EAAE,EAAIX,EAAGW,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAID,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAID,EAAE,EAAE,EAAIC,EAAE,CAAC,EAAID,EAAE,EAAE,EAAIT,CAAC,EACtHW,EAAS,KAAK,MAAMF,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EAAIN,EAAO,OACjD,MAAMS,EAAIrB,EAASiB,CAAI,EAAGK,EAAKf,EAAIW,EAAE,EAAE,EAAIG,EAAE,OAAO,CAAC,EAAGE,EAAKf,EAAIU,EAAE,EAAE,EAAIG,EAAE,OAAO,CAAC,EAAGG,EAAKf,EAAIS,EAAE,EAAE,EAAIG,EAAE,OAAO,CAAC,EAC3GI,EAAO,IAAI,IACjB,QAASC,EAAK,KAAK,MAAM,KAAK,IAAIJ,EAAIA,EAAKZ,EAAKE,CAAK,EAAIb,CAAI,EAAG2B,GAAM,KAAK,MAAM,KAAK,IAAIJ,EAAIA,EAAKZ,EAAKE,CAAK,EAAIb,CAAI,EAAG2B,IACtH,QAASC,EAAK,KAAK,MAAM,KAAK,IAAIH,EAAIA,EAAKb,EAAKC,CAAK,EAAIb,CAAI,EAAG4B,GAAM,KAAK,MAAM,KAAK,IAAIH,EAAIA,EAAKb,EAAKC,CAAK,EAAIb,CAAI,EAAG4B,IACtH,UAAWC,KAAKP,EAAE,MAAM,IAAIK,EAAK,IAAMC,CAAE,GAAK,CAAC,EAE7C,GAAI,EAAAF,EAAK,IAAIG,CAAC,GAAKlB,EAAKW,EAAE,IAAIO,EAAI,CAAC,EAAIjB,EAAKU,EAAE,IAAIO,EAAI,EAAI,CAAC,GAAK,GAChE,CAAAH,EAAK,IAAIG,CAAC,EACV,UAAWC,IAAU,CAAC,GAAK,GAAG,EAAG,CAC/B,MAAM,EAAI3B,EAAcmB,EAAE,IAAKO,EAAGN,EAAIC,EAAKM,EAAQL,EAAId,EAAIC,CAAE,EACzD,GAAK,GAAK,EAAII,IAAQA,EAAO,EAAGC,EAAQ,CAACK,EAAE,IAAIO,EAAI,CAAC,EAAGP,EAAE,IAAIO,EAAI,EAAI,CAAC,CAAC,EAC7E,EAER,CAAC,EAEH,OAAOZ,CACT",
|
|
6
|
+
"names": ["CELL", "collider", "computeBounds", "horizontalRay", "traverse", "updateWorldMatrix", "hit", "layer", "x", "y", "z", "dx", "dz", "reach", "skip", "other", "best", "found", "mesh", "m", "k", "radius", "c", "ox", "oy", "oz", "seen", "ix", "iz", "t", "height"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(M,i,c,u,s){const t=Math.PI/180,o=(280.16+360.9856235*M+c)*t-u,a=i*t,h=Math.asin(Math.sin(a)*Math.sin(s)+Math.cos(a)*Math.cos(s)*Math.cos(o)),n=(Math.atan2(Math.sin(o),Math.cos(o)*Math.sin(a)-Math.tan(s)*Math.cos(a))/t+180+360)%360;return{altitude:h/t,azimuth:n,direction:[Math.sin(n*t)*Math.cos(h),Math.sin(h),-Math.cos(n*t)*Math.cos(h)]}}export{e as horizontalPosition};
|
|
2
|
+
//# sourceMappingURL=horizontalPosition.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/horizontalPosition.js"],
|
|
4
|
+
"sourcesContent": ["\nexport function horizontalPosition(d, lat, lng, ascension, declination) {\n const rad = Math.PI / 180;\n const hourAngle = (280.16 + 360.9856235 * d + lng) * rad - ascension;\n const latitude = lat * rad;\n const altitude = Math.asin(Math.sin(latitude) * Math.sin(declination) +\n Math.cos(latitude) * Math.cos(declination) * Math.cos(hourAngle));\n const southAzimuth = Math.atan2(Math.sin(hourAngle),\n Math.cos(hourAngle) * Math.sin(latitude) - Math.tan(declination) * Math.cos(latitude));\n const azimuth = (southAzimuth / rad + 180 + 360) % 360;\n return {\n altitude: altitude / rad, azimuth,\n direction: [Math.sin(azimuth * rad) * Math.cos(altitude), Math.sin(altitude),\n -Math.cos(azimuth * rad) * Math.cos(altitude)]\n };\n}\n"],
|
|
5
|
+
"mappings": "AACO,SAASA,EAAmBC,EAAGC,EAAKC,EAAKC,EAAWC,EAAa,CACtE,MAAMC,EAAM,KAAK,GAAK,IAChBC,GAAa,OAAS,YAAcN,EAAIE,GAAOG,EAAMF,EACrDI,EAAWN,EAAMI,EACjBG,EAAW,KAAK,KAAK,KAAK,IAAID,CAAQ,EAAI,KAAK,IAAIH,CAAW,EAClE,KAAK,IAAIG,CAAQ,EAAI,KAAK,IAAIH,CAAW,EAAI,KAAK,IAAIE,CAAS,CAAC,EAG5DG,GAFe,KAAK,MAAM,KAAK,IAAIH,CAAS,EAChD,KAAK,IAAIA,CAAS,EAAI,KAAK,IAAIC,CAAQ,EAAI,KAAK,IAAIH,CAAW,EAAI,KAAK,IAAIG,CAAQ,CAAC,EACvDF,EAAM,IAAM,KAAO,IACnD,MAAO,CACL,SAAUG,EAAWH,EAAK,QAAAI,EAC1B,UAAW,CAAC,KAAK,IAAIA,EAAUJ,CAAG,EAAI,KAAK,IAAIG,CAAQ,EAAG,KAAK,IAAIA,CAAQ,EAC3E,CAAC,KAAK,IAAIC,EAAUJ,CAAG,EAAI,KAAK,IAAIG,CAAQ,CAAC,CAC/C,CACF",
|
|
6
|
+
"names": ["horizontalPosition", "d", "lat", "lng", "ascension", "declination", "rad", "hourAngle", "latitude", "altitude", "azimuth"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function A(t,R,g,j,k,r,o){const n=R*9,f=t[n+3]-t[n],c=t[n+4]-t[n+1],i=t[n+5]-t[n+2],x=t[n+6]-t[n],s=t[n+7]-t[n+1],z=t[n+8]-t[n+2],q=-o*s,h=o*x-r*z,b=r*s,e=f*q+c*h+i*b;if(Math.abs(e)<1e-9)return-1;const u=g-t[n],y=j-t[n+1],a=k-t[n+2],p=(u*q+y*h+a*b)/e;if(p<0||p>1)return-1;const l=y*i-a*c,m=a*f-u*i,w=u*c-y*f,M=(r*l+o*w)/e;return M<0||p+M>1?-1:(x*l+s*m+z*w)/e}export{A as horizontalRay};
|
|
2
|
+
//# sourceMappingURL=horizontalRay.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/horizontalRay.js"],
|
|
4
|
+
"sourcesContent": ["// M\u00F6ller-Trumbore for the horizontal ray (ox, oy, oz) + d\u00B7(dx, 0, dz) against triangle t; returns d or -1.\nexport function horizontalRay(v, t, ox, oy, oz, dx, dz) {\n const i = t * 9, ex = v[i + 3] - v[i], ey = v[i + 4] - v[i + 1], ez = v[i + 5] - v[i + 2];\n const fx = v[i + 6] - v[i], fy = v[i + 7] - v[i + 1], fz = v[i + 8] - v[i + 2];\n const px = -dz * fy, py = dz * fx - dx * fz, pz = dx * fy, det = ex * px + ey * py + ez * pz;\n if (Math.abs(det) < 1e-9) return -1;\n const tx = ox - v[i], ty = oy - v[i + 1], tz = oz - v[i + 2], u = (tx * px + ty * py + tz * pz) / det;\n if (u < 0 || u > 1) return -1;\n const qx = ty * ez - tz * ey, qy = tz * ex - tx * ez, qz = tx * ey - ty * ex, w = (dx * qx + dz * qz) / det;\n if (w < 0 || u + w > 1) return -1;\n return (fx * qx + fy * qy + fz * qz) / det;\n}\n"],
|
|
5
|
+
"mappings": "AACO,SAASA,EAAcC,EAAGC,EAAGC,EAAIC,EAAIC,EAAIC,EAAIC,EAAI,CACtD,MAAMC,EAAIN,EAAI,EAAGO,EAAKR,EAAEO,EAAI,CAAC,EAAIP,EAAEO,CAAC,EAAGE,EAAKT,EAAEO,EAAI,CAAC,EAAIP,EAAEO,EAAI,CAAC,EAAGG,EAAKV,EAAEO,EAAI,CAAC,EAAIP,EAAEO,EAAI,CAAC,EAClFI,EAAKX,EAAEO,EAAI,CAAC,EAAIP,EAAEO,CAAC,EAAGK,EAAKZ,EAAEO,EAAI,CAAC,EAAIP,EAAEO,EAAI,CAAC,EAAGM,EAAKb,EAAEO,EAAI,CAAC,EAAIP,EAAEO,EAAI,CAAC,EACvEO,EAAK,CAACR,EAAKM,EAAIG,EAAKT,EAAKK,EAAKN,EAAKQ,EAAIG,EAAKX,EAAKO,EAAIK,EAAMT,EAAKM,EAAKL,EAAKM,EAAKL,EAAKM,EAC1F,GAAI,KAAK,IAAIC,CAAG,EAAI,KAAM,MAAO,GACjC,MAAMC,EAAKhB,EAAKF,EAAEO,CAAC,EAAGY,EAAKhB,EAAKH,EAAEO,EAAI,CAAC,EAAGa,EAAKhB,EAAKJ,EAAEO,EAAI,CAAC,EAAGc,GAAKH,EAAKJ,EAAKK,EAAKJ,EAAKK,EAAKJ,GAAMC,EAClG,GAAII,EAAI,GAAKA,EAAI,EAAG,MAAO,GAC3B,MAAMC,EAAKH,EAAKT,EAAKU,EAAKX,EAAIc,EAAKH,EAAKZ,EAAKU,EAAKR,EAAIc,EAAKN,EAAKT,EAAKU,EAAKX,EAAIiB,GAAKpB,EAAKiB,EAAKhB,EAAKkB,GAAMP,EACxG,OAAIQ,EAAI,GAAKJ,EAAII,EAAI,EAAU,IACvBd,EAAKW,EAAKV,EAAKW,EAAKV,EAAKW,GAAMP,CACzC",
|
|
6
|
+
"names": ["horizontalRay", "v", "t", "ox", "oy", "oz", "dx", "dz", "i", "ex", "ey", "ez", "fx", "fy", "fz", "px", "py", "pz", "det", "tx", "ty", "tz", "u", "qx", "qy", "qz", "w"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/hull.js"],
|
|
4
|
+
"sourcesContent": ["export const hull = [[-5.5, 30], [5.5, 30], [5.5, -20], [4, -26], [1.5, -30], [-1.5, -30], [-4, -26], [-5.5, -20]];\n"],
|
|
5
|
+
"mappings": "AAAO,MAAMA,EAAO,CAAC,CAAC,KAAM,EAAE,EAAG,CAAC,IAAK,EAAE,EAAG,CAAC,IAAK,GAAG,EAAG,CAAC,EAAG,GAAG,EAAG,CAAC,IAAK,GAAG,EAAG,CAAC,KAAM,GAAG,EAAG,CAAC,GAAI,GAAG,EAAG,CAAC,KAAM,GAAG,CAAC",
|
|
6
|
+
"names": ["hull"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/initSunlight.js"],
|
|
4
|
+
"sourcesContent": ["import { onAddSun } from './onAddSun.js';\nimport { onRemoveSun } from './onRemoveSun.js';\n\n// Sun/moon clock control and sky colours; the control is created on first add (`layer.control`).\nexport function initSunlight(layer, options) {\n L.Util.setOptions(layer, options);\n layer.onAdd = map => onAddSun(layer, map);\n layer.onRemove = () => onRemoveSun(layer);\n}"],
|
|
5
|
+
"mappings": "AAAA,OAAS,YAAAA,MAAgB,gBACzB,OAAS,eAAAC,MAAmB,mBAGrB,SAASC,EAAaC,EAAOC,EAAS,CAC3C,EAAE,KAAK,WAAWD,EAAOC,CAAO,EAChCD,EAAM,MAAQE,GAAOL,EAASG,EAAOE,CAAG,EACxCF,EAAM,SAAW,IAAMF,EAAYE,CAAK,CAC1C",
|
|
6
|
+
"names": ["onAddSun", "onRemoveSun", "initSunlight", "layer", "options", "map"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{onTerrainRemove as t}from"./onTerrainRemove.js";import{onTerrainAdd as d}from"./onTerrainAdd.js";function a(n,e){const o=e.url,i={...e};delete i.url,n._init3D(i),n.terrainSource=o,n._terrainTiles=new Map,n._rasterTiles=new Map,n._terrainReady=!1,n.onAdd=r=>d(n,r),n.onRemove=r=>t(n,r)}export{a as initTerrain};
|
|
2
|
+
//# sourceMappingURL=initTerrain.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/initTerrain.js"],
|
|
4
|
+
"sourcesContent": ["import { onTerrainRemove } from './onTerrainRemove.js';\nimport { onTerrainAdd } from './onTerrainAdd.js';\n\n/**\n * Renders IGN Float32 DEM tiles and PMTiles raster basemaps in the shared WebGPU scene.\n * Source options: `url` (single-zoom Float32 PMTiles DEM); `bridges` (optional GeoJSON deck polygons with Z, see _addBridges).\n */\nexport function initTerrain(layer, options) {\n const terrainSource = options.url;\n const layerOptions = { ...options };\n delete layerOptions.url;\n layer._init3D(layerOptions);\n layer.terrainSource = terrainSource;\n layer._terrainTiles = new Map();\n layer._rasterTiles = new Map();\n layer._terrainReady = false;\n layer.onAdd = map => onTerrainAdd(layer, map);\n layer.onRemove = map => onTerrainRemove(layer, map);\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,mBAAAA,MAAuB,uBAChC,OAAS,gBAAAC,MAAoB,oBAMtB,SAASC,EAAYC,EAAOC,EAAS,CAC1C,MAAMC,EAAgBD,EAAQ,IACxBE,EAAe,CAAE,GAAGF,CAAQ,EAClC,OAAOE,EAAa,IACpBH,EAAM,QAAQG,CAAY,EAC1BH,EAAM,cAAgBE,EACtBF,EAAM,cAAgB,IAAI,IAC1BA,EAAM,aAAe,IAAI,IACzBA,EAAM,cAAgB,GACtBA,EAAM,MAAQI,GAAON,EAAaE,EAAOI,CAAG,EAC5CJ,EAAM,SAAWI,GAAOP,EAAgBG,EAAOI,CAAG,CACpD",
|
|
6
|
+
"names": ["onTerrainRemove", "onTerrainAdd", "initTerrain", "layer", "options", "terrainSource", "layerOptions", "map"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import{build as x}from"./build.js";import{tooltip as y}from"./tooltip.js";import{speed as w}from"./speed.js";import{vehicles as k}from"./vehicles.js";import{addTraffic as z,placeTraffic as T,removeTraffic as _,readyTraffic as A,tickTraffic as D,updateTraffic as I,updateTrafficTerrain as B}from"./traffic.js";function C(t,{url:l,vehicle:u="car",side:i,outline:c,speed:f=w,...p}={}){const{model:r,lights:n,side:m}=k[u];i??=m,t._init3D({tooltip:y,nightLight:!!n,...p});const o=L.DomUtil.create("small","traffic-status");o.style.cssText="display:block;max-width:200px;margin:0 0 4px 20px;color:#555;";const s=x(r(0)),d=s.position.length,v=d/3,a=new ArrayBuffer(16),b=new Float32Array(a),g=new Uint32Array(a),e={layer:t,url:l,model:r,lights:n,side:i,outline:c,velocity:f,status:o,template:s,stride:d,vertices:v,params:a,paramFloats:b,paramInts:g,ready:!1,frame:void 0,request:void 0,lanes:[],tripsKey:void 0,mesh:void 0,route:void 0,litAt:-1/0,trips:[],rebasedAt:0,nextCheck:-1/0,elapsed:0,gpu:null,lanesDirty:!0,stale:!1,loaded:void 0,file:void 0},h=`
|
|
2
|
+
struct Params { seconds: f32, side: f32, vertices: u32, total: u32 }
|
|
3
|
+
struct Vehicle { start: u32, count: u32, base: f32, speed: f32 }
|
|
4
|
+
@group(0) @binding(0) var<uniform> params: Params;
|
|
5
|
+
@group(0) @binding(1) var<storage, read> model: array<f32>;
|
|
6
|
+
@group(0) @binding(2) var<storage, read> points: array<vec4f>;
|
|
7
|
+
@group(0) @binding(3) var<storage, read> vehicles: array<Vehicle>;
|
|
8
|
+
@group(0) @binding(4) var<storage, read_write> position: array<f32>;
|
|
9
|
+
@group(0) @binding(5) var<storage, read_write> normal: array<f32>;
|
|
10
|
+
@compute @workgroup_size(64)
|
|
11
|
+
fn main(@builtin(global_invocation_id) id: vec3u) {
|
|
12
|
+
let v = id.x;
|
|
13
|
+
if (v >= params.total) { return; }
|
|
14
|
+
let vehicle = vehicles[v / params.vertices];
|
|
15
|
+
let last = vehicle.start + vehicle.count - 1u;
|
|
16
|
+
let length = points[last].w;
|
|
17
|
+
var s = vehicle.base + params.seconds * vehicle.speed;
|
|
18
|
+
s -= length * floor(s / length);
|
|
19
|
+
var i = vehicle.start + 1u;
|
|
20
|
+
while (i < last && points[i].w < s) { i++; }
|
|
21
|
+
let a = points[i - 1u];
|
|
22
|
+
let b = points[i];
|
|
23
|
+
let d = select(b.w - a.w, 1.0, b.w == a.w);
|
|
24
|
+
let t = (s - a.w) / d;
|
|
25
|
+
let dx = (b.x - a.x) / d;
|
|
26
|
+
let dz = (b.y - a.y) / d;
|
|
27
|
+
let cx = a.x + (b.x - a.x) * t - dz * params.side;
|
|
28
|
+
let cz = a.y + (b.y - a.y) * t + dx * params.side;
|
|
29
|
+
let y = a.z + (b.z - a.z) * t;
|
|
30
|
+
let k = (v % params.vertices) * 3u;
|
|
31
|
+
let n = params.vertices * 3u + k;
|
|
32
|
+
let o = v * 3u;
|
|
33
|
+
position[o] = cx - model[k] * dz - model[k + 2u] * dx;
|
|
34
|
+
position[o + 1u] = y + model[k + 1u];
|
|
35
|
+
position[o + 2u] = cz + model[k] * dx - model[k + 2u] * dz;
|
|
36
|
+
normal[o] = -model[n] * dz - model[n + 2u] * dx;
|
|
37
|
+
normal[o + 1u] = model[n + 1u];
|
|
38
|
+
normal[o + 2u] = model[n] * dx - model[n + 2u] * dz;
|
|
39
|
+
}`;e.shader=h,e.tick=D.bind(null,e),e.update=I.bind(null,e),e.terrain=B.bind(null,e),t._beforeRaycast=T.bind(null,e),t.on("ready",A.bind(null,e)),t.on("add",z.bind(null,e)),t.on("remove",_.bind(null,e))}export{C as initTraffic};
|
|
40
|
+
//# sourceMappingURL=initTraffic.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/initTraffic.js"],
|
|
4
|
+
"sourcesContent": ["\uFEFF/**\r\n * Vehicles moving along GeoJSON lanes; a compute pass places them on the GPU every frame.\r\n * Source options:\r\n * - `url`: GeoJSON (Multi)LineStrings, or a JS module whose default export `(time, layer, signal)` returns them (time-dependent data);\r\n * - `vehicle`: 'car' (default) or 'boat'; `side`: offset right of the lane centreline in metres (vehicle default);\r\n * - `speed`: m/s of `flow` lanes; `outline`: draw the lanes.\r\n * Lane properties: `flow` (vehicles/h) or `timetable` (see scheduledTrips.js), optional fixed `elevation`\r\n * in metres, `name`/`description` for the default tooltip. The status line (vehicle count, then the FeatureCollection `note`) sits under the layer's entry in the layers control.\r\n * The 'sunlight' layer on the same map drives the time; without one, vehicles run live.\r\n */\r\nimport { build } from './build.js';\r\nimport { tooltip } from './tooltip.js';\r\nimport { speed } from './speed.js';\r\nimport { vehicles } from './vehicles.js';\r\nimport {\r\n addTraffic,\r\n placeTraffic,\r\n removeTraffic,\r\n readyTraffic,\r\n tickTraffic,\r\n updateTraffic,\r\n updateTrafficTerrain,\r\n} from './traffic.js';\r\n\r\nexport function initTraffic(layer, { url, vehicle = 'car', side, outline, speed: velocity = speed, ...options } = {}) {\r\n const { model, lights, side: defaultSide } = vehicles[vehicle];\r\n side ??= defaultSide;\r\n layer._init3D({\r\n tooltip,\r\n nightLight: Boolean(lights),\r\n ...options,\r\n });\r\n const status = L.DomUtil.create('small', 'traffic-status');\r\n status.style.cssText = 'display:block;max-width:200px;margin:0 0 4px 20px;color:#555;';\r\n const template = build(model(0)), stride = template.position.length, vertices = stride / 3;\r\n const params = new ArrayBuffer(16), paramFloats = new Float32Array(params), paramInts = new Uint32Array(params);\r\n const state = {\r\n layer, url, model, lights, side, outline, velocity, status, template, stride, vertices,\r\n params, paramFloats, paramInts,\r\n ready: false, frame: undefined, request: undefined, lanes: [], tripsKey: undefined,\r\n mesh: undefined, route: undefined, litAt: -Infinity,\r\n trips: [], rebasedAt: 0, nextCheck: -Infinity, elapsed: 0, gpu: null,\r\n lanesDirty: true, stale: false, loaded: undefined, file: undefined,\r\n };\r\n // Lane points are [x, z, ground, cumulative length]. Mirrors along() and place().\r\n const shader = `\r\n struct Params { seconds: f32, side: f32, vertices: u32, total: u32 }\r\n struct Vehicle { start: u32, count: u32, base: f32, speed: f32 }\r\n @group(0) @binding(0) var<uniform> params: Params;\r\n @group(0) @binding(1) var<storage, read> model: array<f32>;\r\n @group(0) @binding(2) var<storage, read> points: array<vec4f>;\r\n @group(0) @binding(3) var<storage, read> vehicles: array<Vehicle>;\r\n @group(0) @binding(4) var<storage, read_write> position: array<f32>;\r\n @group(0) @binding(5) var<storage, read_write> normal: array<f32>;\r\n @compute @workgroup_size(64)\r\n fn main(@builtin(global_invocation_id) id: vec3u) {\r\n let v = id.x;\r\n if (v >= params.total) { return; }\r\n let vehicle = vehicles[v / params.vertices];\r\n let last = vehicle.start + vehicle.count - 1u;\r\n let length = points[last].w;\r\n var s = vehicle.base + params.seconds * vehicle.speed;\r\n s -= length * floor(s / length);\r\n var i = vehicle.start + 1u;\r\n while (i < last && points[i].w < s) { i++; }\r\n let a = points[i - 1u];\r\n let b = points[i];\r\n let d = select(b.w - a.w, 1.0, b.w == a.w);\r\n let t = (s - a.w) / d;\r\n let dx = (b.x - a.x) / d;\r\n let dz = (b.y - a.y) / d;\r\n let cx = a.x + (b.x - a.x) * t - dz * params.side;\r\n let cz = a.y + (b.y - a.y) * t + dx * params.side;\r\n let y = a.z + (b.z - a.z) * t;\r\n let k = (v % params.vertices) * 3u;\r\n let n = params.vertices * 3u + k;\r\n let o = v * 3u;\r\n position[o] = cx - model[k] * dz - model[k + 2u] * dx;\r\n position[o + 1u] = y + model[k + 1u];\r\n position[o + 2u] = cz + model[k] * dx - model[k + 2u] * dz;\r\n normal[o] = -model[n] * dz - model[n + 2u] * dx;\r\n normal[o + 1u] = model[n + 1u];\r\n normal[o + 2u] = model[n] * dx - model[n + 2u] * dz;\r\n }`;\r\n state.shader = shader;\r\n state.tick = tickTraffic.bind(null, state);\r\n state.update = updateTraffic.bind(null, state);\r\n state.terrain = updateTrafficTerrain.bind(null, state);\r\n layer._beforeRaycast = placeTraffic.bind(null, state);\r\n layer.on('ready', readyTraffic.bind(null, state));\r\n layer.on('add', addTraffic.bind(null, state));\r\n layer.on('remove', removeTraffic.bind(null, state));\r\n}\r\n"],
|
|
5
|
+
"mappings": "AAUA,OAAS,SAAAA,MAAa,aACtB,OAAS,WAAAC,MAAe,eACxB,OAAS,SAAAC,MAAa,aACtB,OAAS,YAAAC,MAAgB,gBACzB,OACE,cAAAC,EACA,gBAAAC,EACA,iBAAAC,EACA,gBAAAC,EACA,eAAAC,EACA,iBAAAC,EACA,wBAAAC,MACK,eAEA,SAASC,EAAYC,EAAO,CAAE,IAAAC,EAAK,QAAAC,EAAU,MAAO,KAAAC,EAAM,QAAAC,EAAS,MAAOC,EAAWf,EAAO,GAAGgB,CAAQ,EAAI,CAAC,EAAG,CACpH,KAAM,CAAE,MAAAC,EAAO,OAAAC,EAAQ,KAAMC,CAAY,EAAIlB,EAASW,CAAO,EAC7DC,IAASM,EACTT,EAAM,QAAQ,CACZ,QAAAX,EACA,WAAY,EAAQmB,EACpB,GAAGF,CACL,CAAC,EACD,MAAMI,EAAS,EAAE,QAAQ,OAAO,QAAS,gBAAgB,EACzDA,EAAO,MAAM,QAAU,gEACvB,MAAMC,EAAWvB,EAAMmB,EAAM,CAAC,CAAC,EAAGK,EAASD,EAAS,SAAS,OAAQE,EAAWD,EAAS,EACnFE,EAAS,IAAI,YAAY,EAAE,EAAGC,EAAc,IAAI,aAAaD,CAAM,EAAGE,EAAY,IAAI,YAAYF,CAAM,EACxGG,EAAQ,CACZ,MAAAjB,EAAO,IAAAC,EAAK,MAAAM,EAAO,OAAAC,EAAQ,KAAAL,EAAM,QAAAC,EAAS,SAAAC,EAAU,OAAAK,EAAQ,SAAAC,EAAU,OAAAC,EAAQ,SAAAC,EAC9E,OAAAC,EAAQ,YAAAC,EAAa,UAAAC,EACrB,MAAO,GAAO,MAAO,OAAW,QAAS,OAAW,MAAO,CAAC,EAAG,SAAU,OACzE,KAAM,OAAW,MAAO,OAAW,MAAO,KAC1C,MAAO,CAAC,EAAG,UAAW,EAAG,UAAW,KAAW,QAAS,EAAG,IAAK,KAChE,WAAY,GAAM,MAAO,GAAO,OAAQ,OAAW,KAAM,MAC3D,EAEME,EAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAuCfD,EAAM,OAASC,EACfD,EAAM,KAAOrB,EAAY,KAAK,KAAMqB,CAAK,EACzCA,EAAM,OAASpB,EAAc,KAAK,KAAMoB,CAAK,EAC7CA,EAAM,QAAUnB,EAAqB,KAAK,KAAMmB,CAAK,EACrDjB,EAAM,eAAiBP,EAAa,KAAK,KAAMwB,CAAK,EACpDjB,EAAM,GAAG,QAASL,EAAa,KAAK,KAAMsB,CAAK,CAAC,EAChDjB,EAAM,GAAG,MAAOR,EAAW,KAAK,KAAMyB,CAAK,CAAC,EAC5CjB,EAAM,GAAG,SAAUN,EAAc,KAAK,KAAMuB,CAAK,CAAC,CACpD",
|
|
6
|
+
"names": ["build", "tooltip", "speed", "vehicles", "addTraffic", "placeTraffic", "removeTraffic", "readyTraffic", "tickTraffic", "updateTraffic", "updateTrafficTerrain", "initTraffic", "layer", "url", "vehicle", "side", "outline", "velocity", "options", "model", "lights", "defaultSide", "status", "template", "stride", "vertices", "params", "paramFloats", "paramInts", "state", "shader"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{controlOnAdd as b,onBlur as p,onKey as u,onLayerAdd as g,onLayerRemove as f,onPointer as m,onReady as x,onTerrain as y,start as h,step as k,stop as A,toggle as v}from"./walk.js";function D(e,{speed:r=70,distance:a=20,position:l="bottomright",...s}={}){e._init3D(s);const c=new Set,d=new L.Control({position:l}),o=L.DomUtil.create("div","leaflet-bar leaflet-control");o.style.cssText="display:flex;align-items:center;background:#fff;";const t=L.DomUtil.create("button","",o);t.type="button",t.title="Walk",t.setAttribute("aria-label","Walk"),t.setAttribute("aria-pressed","false"),t.textContent="\u{1F6B6}",t.style.cssText="width:30px;height:30px;padding:0;border:0;border-radius:4px;background:#fff;font-size:18px;line-height:30px;cursor:pointer;";const i=L.DomUtil.create("small","",o);i.style.cssText="display:none;padding:0 8px;color:#333;white-space:nowrap;",i.textContent="W/S: run \xB7 A/D: turn \xB7 drag: look around \xB7 Esc: exit",L.DomEvent.disableClickPropagation(o);const n={layer:e,speed:r,distance:a,keys:c,control:d,container:o,button:t,hint:i,meshes:null,frame:null,last:void 0,swing:0,saved:null,drag:null,ready:!1,state:e.walker={latlng:null,heading:0,phase:0}};n.step=k.bind(n),n.onKey=u.bind(n),n.onBlur=p.bind(n),n.onPointer=m.bind(n),n.onTerrain=y.bind(n),n.start=h.bind(n),n.stop=A.bind(n),n.toggle=v.bind(n),n.controlOnAdd=b.bind(n),n.onReady=x.bind(n),n.onLayerAdd=g.bind(n),n.onLayerRemove=f.bind(n),d.onAdd=n.controlOnAdd,L.DomEvent.on(t,"click",n.toggle),e.on("ready",n.onReady),e.on("add",n.onLayerAdd),e.on("remove",n.onLayerRemove)}export{D as initWalk};
|
|
2
|
+
//# sourceMappingURL=initWalk.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/initWalk.js"],
|
|
4
|
+
"sourcesContent": ["import {\r\n controlOnAdd, onBlur, onKey, onLayerAdd, onLayerRemove, onPointer, onReady, onTerrain, start, step, stop, toggle\r\n} from './walk.js';\r\n\r\n/**\r\n * Third-person walk mode, toggled by a map button (and Esc): a pedestrian at the map centre runs with W/S (or \u2191/\u2193) and\r\n * turns with A/D (or \u2190/\u2192); the camera swings back behind it while it moves. Dragging the map only turns the camera\r\n * (bearing, pitch); the wheel changes the camera distance.\r\n * The walker follows the terrain, bridges included, and `layer.walker` exposes `{ latlng, heading, phase }`.\r\n * Source options: `speed` (m/s, default 6), `distance` (camera distance in metres, default 20), `position` (button corner, default 'topleft').\r\n * Visible meshes of the other 3D layers (buildings, trees, models, streetlights) are solid; terrain and traffic are not.\r\n */\r\nexport function initWalk(layer, {\r\n speed = 70,\r\n distance = 20,\r\n position = 'bottomright',\r\n ...options\r\n} = {}) {\r\n layer._init3D(options);\r\n const keys = new Set();\r\n const control = new L.Control({ position });\r\n const container = L.DomUtil.create('div', 'leaflet-bar leaflet-control');\r\n container.style.cssText = 'display:flex;align-items:center;background:#fff;';\r\n const button = L.DomUtil.create('button', '', container);\r\n button.type = 'button';\r\n button.title = 'Walk';\r\n button.setAttribute('aria-label', 'Walk');\r\n button.setAttribute('aria-pressed', 'false');\r\n button.textContent = '\uD83D\uDEB6';\r\n button.style.cssText = 'width:30px;height:30px;padding:0;border:0;border-radius:4px;background:#fff;font-size:18px;line-height:30px;cursor:pointer;';\r\n const hint = L.DomUtil.create('small', '', container);\r\n hint.style.cssText = 'display:none;padding:0 8px;color:#333;white-space:nowrap;';\r\n hint.textContent = 'W/S: run \u00B7 A/D: turn \u00B7 drag: look around \u00B7 Esc: exit';\r\n L.DomEvent.disableClickPropagation(container);\r\n\r\n const context = {\r\n layer,\r\n speed,\r\n distance,\r\n keys,\r\n control,\r\n container,\r\n button,\r\n hint,\r\n meshes: null,\r\n frame: null,\r\n last: undefined,\r\n swing: 0,\r\n saved: null,\r\n drag: null,\r\n ready: false,\r\n state: layer.walker = { latlng: null, heading: 0, phase: 0 }\r\n }\r\n context.step = step.bind(context);\r\n context.onKey = onKey.bind(context);\r\n context.onBlur = onBlur.bind(context);\r\n context.onPointer = onPointer.bind(context);\r\n context.onTerrain = onTerrain.bind(context);\r\n context.start = start.bind(context);\r\n context.stop = stop.bind(context);\r\n context.toggle = toggle.bind(context);\r\n context.controlOnAdd = controlOnAdd.bind(context);\r\n context.onReady = onReady.bind(context);\r\n context.onLayerAdd = onLayerAdd.bind(context);\r\n context.onLayerRemove = onLayerRemove.bind(context);\r\n\r\n control.onAdd = context.controlOnAdd;\r\n L.DomEvent.on(button, 'click', context.toggle);\r\n layer.on('ready', context.onReady);\r\n layer.on('add', context.onLayerAdd);\r\n layer.on('remove', context.onLayerRemove);\r\n};\r\n"],
|
|
5
|
+
"mappings": "AAAA,OACE,gBAAAA,EAAc,UAAAC,EAAQ,SAAAC,EAAO,cAAAC,EAAY,iBAAAC,EAAe,aAAAC,EAAW,WAAAC,EAAS,aAAAC,EAAW,SAAAC,EAAO,QAAAC,EAAM,QAAAC,EAAM,UAAAC,MACrG,YAUA,SAASC,EAASC,EAAO,CAC9B,MAAAC,EAAQ,GACR,SAAAC,EAAW,GACX,SAAAC,EAAW,cACX,GAAGC,CACL,EAAI,CAAC,EAAG,CACNJ,EAAM,QAAQI,CAAO,EACrB,MAAMC,EAAO,IAAI,IACXC,EAAU,IAAI,EAAE,QAAQ,CAAE,SAAAH,CAAS,CAAC,EACpCI,EAAY,EAAE,QAAQ,OAAO,MAAO,6BAA6B,EACvEA,EAAU,MAAM,QAAU,mDAC1B,MAAMC,EAAS,EAAE,QAAQ,OAAO,SAAU,GAAID,CAAS,EACvDC,EAAO,KAAO,SACdA,EAAO,MAAQ,OACfA,EAAO,aAAa,aAAc,MAAM,EACxCA,EAAO,aAAa,eAAgB,OAAO,EAC3CA,EAAO,YAAc,YACrBA,EAAO,MAAM,QAAU,8HACvB,MAAMC,EAAO,EAAE,QAAQ,OAAO,QAAS,GAAIF,CAAS,EACpDE,EAAK,MAAM,QAAU,4DACrBA,EAAK,YAAc,gEACnB,EAAE,SAAS,wBAAwBF,CAAS,EAE5C,MAAMG,EAAU,CACd,MAAAV,EACA,MAAAC,EACA,SAAAC,EACA,KAAAG,EACA,QAAAC,EACA,UAAAC,EACA,OAAAC,EACA,KAAAC,EACA,OAAQ,KACR,MAAO,KACP,KAAM,OACN,MAAO,EACP,MAAO,KACP,KAAM,KACN,MAAO,GACP,MAAOT,EAAM,OAAS,CAAE,OAAQ,KAAM,QAAS,EAAG,MAAO,CAAE,CAC7D,EACAU,EAAQ,KAAOd,EAAK,KAAKc,CAAO,EAChCA,EAAQ,MAAQrB,EAAM,KAAKqB,CAAO,EAClCA,EAAQ,OAAStB,EAAO,KAAKsB,CAAO,EACpCA,EAAQ,UAAYlB,EAAU,KAAKkB,CAAO,EAC1CA,EAAQ,UAAYhB,EAAU,KAAKgB,CAAO,EAC1CA,EAAQ,MAAQf,EAAM,KAAKe,CAAO,EAClCA,EAAQ,KAAOb,EAAK,KAAKa,CAAO,EAChCA,EAAQ,OAASZ,EAAO,KAAKY,CAAO,EACpCA,EAAQ,aAAevB,EAAa,KAAKuB,CAAO,EAChDA,EAAQ,QAAUjB,EAAQ,KAAKiB,CAAO,EACtCA,EAAQ,WAAapB,EAAW,KAAKoB,CAAO,EAC5CA,EAAQ,cAAgBnB,EAAc,KAAKmB,CAAO,EAElDJ,EAAQ,MAAQI,EAAQ,aACxB,EAAE,SAAS,GAAGF,EAAQ,QAASE,EAAQ,MAAM,EAC7CV,EAAM,GAAG,QAASU,EAAQ,OAAO,EACjCV,EAAM,GAAG,MAAOU,EAAQ,UAAU,EAClCV,EAAM,GAAG,SAAUU,EAAQ,aAAa,CAC1C",
|
|
6
|
+
"names": ["controlOnAdd", "onBlur", "onKey", "onLayerAdd", "onLayerRemove", "onPointer", "onReady", "onTerrain", "start", "step", "stop", "toggle", "initWalk", "layer", "speed", "distance", "position", "options", "keys", "control", "container", "button", "hint", "context"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{computeBounds as H}from"./computeBounds.js";const q=(n,e)=>n.map((w,u)=>w-e[u]),G=(n,e)=>[n[1]*e[2]-n[2]*e[1],n[2]*e[0]-n[0]*e[2],n[0]*e[1]-n[1]*e[0]],I=(n,e)=>n.reduce((w,u,r)=>w+u*e[r],0);function Q(n,e,w=0){const u=[],r=[0,0,0],v=[0,0,0],D=[0,0,0];for(const o of e){const y=new DOMMatrix(o.worldMatrix).inverse();if(![...y.toFloat64Array()].every(Number.isFinite))throw new Error("Singular 3D transform");const m=new DOMPoint(...n.origin,1).matrixTransform(y),c=[m.x/m.w,m.y/m.w,m.z/m.w],P=new DOMPoint(...n.direction,0).matrixTransform(y),a=[P.x,P.y,P.z],F=Math.hypot(...a)||1;a[0]/=F,a[1]/=F,a[2]/=F,o.geometry.bounds||H(o.geometry);let T=0,z=1/0;for(let t=0;t<3;t++)if(Math.abs(a[t])<1e-12){if(c[t]<o.geometry.bounds.min[t]||c[t]>o.geometry.bounds.max[t]){z=-1/0;break}}else{const l=(o.geometry.bounds.min[t]-c[t])/a[t],g=(o.geometry.bounds.max[t]-c[t])/a[t];T=Math.max(T,Math.min(l,g)),z=Math.min(z,Math.max(l,g))}if(z<T)continue;const{position:i,index:s}=o.geometry.attributes;let p=1/0,L;for(let t=0;t<(s?.count||i.count);t+=3){const l=(s?s.data[t]:t)*i.size,g=(s?s.data[t+1]:t+1)*i.size,V=(s?s.data[t+2]:t+2)*i.size;r[0]=i.data[l],r[1]=i.data[l+1],r[2]=i.data[l+2],v[0]=i.data[g],v[1]=i.data[g+1],v[2]=i.data[g+2],D[0]=i.data[V],D[1]=i.data[V+1],D[2]=i.data[V+2];const A=q(v,r),B=q(D,r),E=G(a,B),b=I(A,E);if(o.program.cullMode==="none"||o.program.cullFace===null?Math.abs(b)<1e-9:b<1e-9)continue;const N=q(c,r),d=I(N,E)/b;if(d<0||d>1)continue;const S=G(N,A),M=I(a,S)/b;if(M<0||d+M>1)continue;if(o.program.nightLight){const h=o.geometry.attributes.uv.data,x=s?[s.data[t],s.data[t+1],s.data[t+2]]:[t,t+1,t+2],k=h[x[0]*2]*(1-d-M)+h[x[1]*2]*d+h[x[2]*2]*M,C=h[x[0]*2+1]*(1-d-M)+h[x[1]*2+1]*d+h[x[2]*2+1]*M;if(k<=2&&(!w||k*k+C*C>.9))continue}const j=I(B,S)/b;j>0&&j<p&&(p=j,L=t/3)}if(L===void 0)continue;const f=new DOMPoint(a[0]*p+c[0],a[1]*p+c[1],a[2]*p+c[2],1).matrixTransform(new DOMMatrix(o.worldMatrix)),O=[f.x/f.w,f.y/f.w,f.z/f.w];u.push({faceIndex:L,object:o,point:O,distance:Math.hypot(O[0]-n.origin[0],O[1]-n.origin[1],O[2]-n.origin[2])})}return u.sort((o,y)=>o.distance-y.distance)}export{Q as intersectMeshes};
|
|
2
|
+
//# sourceMappingURL=intersectMeshes.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/intersectMeshes.js"],
|
|
4
|
+
"sourcesContent": ["import { computeBounds } from \"./computeBounds.js\";\n\nconst sub = (a, b) => a.map((v, i) => v - b[i]);\nconst cross = (a, b) => [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\nconst dot = (a, b) => a.reduce((sum, v, i) => sum + v * b[i], 0);\n\n/** Nearest triangle hit per mesh, sorted by world-space distance. */\n\nexport function intersectMeshes(ray, meshes, night = 0) {\n const hits = [],\n a = [0, 0, 0],\n b = [0, 0, 0],\n c = [0, 0, 0];\n for (const mesh of meshes) {\n // Test in mesh-local space; compare distances only after returning to shared world space.\n const inverse = new DOMMatrix(mesh.worldMatrix).inverse();\n const inverseValues = inverse.toFloat64Array();\n if (![...inverseValues].every(Number.isFinite)) {\n throw new Error('Singular 3D transform');\n }\n const localOrigin = new DOMPoint(...ray.origin, 1).matrixTransform(inverse);\n const origin = [\n localOrigin.x / localOrigin.w,\n localOrigin.y / localOrigin.w,\n localOrigin.z / localOrigin.w\n ];\n const localDirection = new DOMPoint(...ray.direction, 0).matrixTransform(inverse);\n const direction = [\n localDirection.x,\n localDirection.y,\n localDirection.z\n ];\n const directionLength = Math.hypot(...direction) || 1;\n direction[0] /= directionLength;\n direction[1] /= directionLength;\n direction[2] /= directionLength;\n // AABB slab test reuses the same local ray as the triangle test.\n if (!mesh.geometry.bounds) {\n computeBounds(mesh.geometry);\n }\n let near = 0, far = Infinity;\n for (let i = 0; i < 3; i++) {\n if (Math.abs(direction[i]) < 1e-12) {\n if (origin[i] < mesh.geometry.bounds.min[i] || origin[i] > mesh.geometry.bounds.max[i]) {\n far = -Infinity;\n break;\n }\n } else {\n const a = (mesh.geometry.bounds.min[i] - origin[i]) / direction[i], b = (mesh.geometry.bounds.max[i] - origin[i]) / direction[i];\n near = Math.max(near, Math.min(a, b));\n far = Math.min(far, Math.max(a, b));\n }\n }\n if (far < near) {\n continue;\n }\n const { position, index } = mesh.geometry.attributes;\n let closest = Infinity, faceIndex;\n for (let i = 0; i < (index?.count || position.count); i += 3) {\n const ai = (index ? index.data[i] : i) * position.size;\n const bi = (index ? index.data[i + 1] : i + 1) * position.size;\n const ci = (index ? index.data[i + 2] : i + 2) * position.size;\n a[0] = position.data[ai];\n a[1] = position.data[ai + 1];\n a[2] = position.data[ai + 2];\n b[0] = position.data[bi];\n b[1] = position.data[bi + 1];\n b[2] = position.data[bi + 2];\n c[0] = position.data[ci];\n c[1] = position.data[ci + 1];\n c[2] = position.data[ci + 2];\n // Moller-Trumbore: barycentric triangle coordinates and local ray distance.\n const e = sub(b, a),\n f = sub(c, a),\n p = cross(direction, f),\n det = dot(e, p);\n if (mesh.program.cullMode === 'none' || mesh.program.cullFace === null\n ? Math.abs(det) < 1e-9 : det < 1e-9) {\n continue;\n }\n const t = sub(origin, a), u = dot(t, p) / det;\n if (u < 0 || u > 1) {\n continue;\n }\n const q = cross(t, e), v = dot(direction, q) / det;\n if (v < 0 || u + v > 1) {\n continue;\n }\n if (mesh.program.nightLight) {\n const uv = mesh.geometry.attributes.uv.data;\n const ids = index ? [index.data[i], index.data[i + 1], index.data[i + 2]] : [i, i + 1, i + 2];\n const x = uv[ids[0] * 2] * (1 - u - v) + uv[ids[1] * 2] * u + uv[ids[2] * 2] * v;\n const y = uv[ids[0] * 2 + 1] * (1 - u - v) + uv[ids[1] * 2 + 1] * u + uv[ids[2] * 2 + 1] * v;\n if (x <= 2 && (!night || x * x + y * y > 0.9)) continue;\n }\n const distance = dot(f, q) / det;\n if (distance > 0 && distance < closest) {\n closest = distance; faceIndex = i / 3;\n }\n }\n if (faceIndex === undefined) continue;\n const point = new DOMPoint(\n direction[0] * closest + origin[0],\n direction[1] * closest + origin[1],\n direction[2] * closest + origin[2],\n 1\n ).matrixTransform(new DOMMatrix(mesh.worldMatrix));\n const worldPoint = [point.x / point.w, point.y / point.w, point.z / point.w];\n hits.push({\n faceIndex,\n object: mesh,\n point: worldPoint,\n distance: Math.hypot(\n worldPoint[0] - ray.origin[0],\n worldPoint[1] - ray.origin[1],\n worldPoint[2] - ray.origin[2]\n )\n });\n }\n return hits.sort((a, b) => a.distance - b.distance);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["computeBounds", "sub", "a", "b", "v", "i", "cross", "dot", "sum", "intersectMeshes", "ray", "meshes", "night", "hits", "c", "mesh", "inverse", "localOrigin", "origin", "localDirection", "direction", "directionLength", "near", "far", "position", "index", "closest", "faceIndex", "ai", "bi", "ci", "e", "f", "p", "det", "t", "u", "q", "uv", "ids", "x", "y", "distance", "point", "worldPoint"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/isClockWise.js"],
|
|
4
|
+
"sourcesContent": ["/**\n * @returns {boolean} Whether the `{x, y}` points are in clockwise order.\n */\n\nexport function isClockWise(points) {\n let area = 0;\n for (let i = 0; i < points.length; i++) {\n const a = points[i], b = points[(i + 1) % points.length];\n area += a.x * b.y - b.x * a.y;\n }\n return area < 0;\n}\n"],
|
|
5
|
+
"mappings": "AAIO,SAASA,EAAYC,EAAQ,CAClC,IAAIC,EAAO,EACX,QAASC,EAAI,EAAGA,EAAIF,EAAO,OAAQE,IAAK,CACtC,MAAMC,EAAIH,EAAOE,CAAC,EAAGE,EAAIJ,GAAQE,EAAI,GAAKF,EAAO,MAAM,EACvDC,GAAQE,EAAE,EAAIC,EAAE,EAAIA,EAAE,EAAID,EAAE,CAC9B,CACA,OAAOF,EAAO,CAChB",
|
|
6
|
+
"names": ["isClockWise", "points", "area", "i", "a", "b"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{parseColor as I}from"./parseColor.js";function g(a,c,h){const i=I(5264986),u=c.poleRadius;if(!Number.isFinite(u)||u<=0)throw new Error("Invalid lamp pole radius");const x=e=>Array.from({length:6},(t,o)=>({x:a.x+Math.cos(o*Math.PI/3)*e,y:a.y+Math.sin(o*Math.PI/3)*e,ground:a.ground,uv:[3,3]})),p={...a,uv:[3,3]};for(const[e,t,o]of[[u,0,c.top],[u*2.5,c.top-.25,c.top+.15]]){const f=x(e);for(let r=0;r<6;r++){const n=f[r],s=f[(r+1)%6],m=(r+.5)*Math.PI/3,M=Math.cos(m),l=-Math.sin(m);h(n,t,s,t,s,o,M,0,l,i),h(n,t,s,o,n,o,M,0,l,i),h(p,o,n,o,s,o,0,1,0,i),h(p,t,s,t,n,t,0,-1,0,i)}}}export{g as lampPostGeometry};
|
|
2
|
+
//# sourceMappingURL=lampPostGeometry.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/lampPostGeometry.js"],
|
|
4
|
+
"sourcesContent": ["import { parseColor } from \"./parseColor.js\";\n\n/** Schematic support and lamp head; wall-mounted fixtures do not get an invented pole. */\n\nexport function lampPostGeometry(point, style, addTriangle) {\n const color = parseColor(0x50565a), radius = style.poleRadius;\n if (!Number.isFinite(radius) || radius <= 0) {\n throw new Error('Invalid lamp pole radius');\n }\n const ring = r => Array.from({ length: 6 }, (_, i) => ({\n x: point.x + Math.cos(i * Math.PI / 3) * r,\n y: point.y + Math.sin(i * Math.PI / 3) * r, ground: point.ground, uv: [3, 3],\n }));\n const center = { ...point, uv: [3, 3] };\n for (const [r, low, high] of [[radius, 0, style.top], [radius * 2.5, style.top - 0.25, style.top + 0.15]]) {\n const points = ring(r);\n for (let i = 0; i < 6; i++) {\n const a = points[i], b = points[(i + 1) % 6], angle = (i + 0.5) * Math.PI / 3;\n const nx = Math.cos(angle), nz = -Math.sin(angle);\n addTriangle(a, low, b, low, b, high, nx, 0, nz, color);\n addTriangle(a, low, b, high, a, high, nx, 0, nz, color);\n addTriangle(center, high, a, high, b, high, 0, 1, 0, color);\n addTriangle(center, low, b, low, a, low, 0, -1, 0, color);\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,cAAAA,MAAkB,kBAIpB,SAASC,EAAiBC,EAAOC,EAAOC,EAAa,CAC1D,MAAMC,EAAQL,EAAW,OAAQ,EAAGM,EAASH,EAAM,WACnD,GAAI,CAAC,OAAO,SAASG,CAAM,GAAKA,GAAU,EACxC,MAAM,IAAI,MAAM,0BAA0B,EAE5C,MAAMC,EAAOC,GAAK,MAAM,KAAK,CAAE,OAAQ,CAAE,EAAG,CAACC,EAAGC,KAAO,CACrD,EAAGR,EAAM,EAAI,KAAK,IAAIQ,EAAI,KAAK,GAAK,CAAC,EAAIF,EACzC,EAAGN,EAAM,EAAI,KAAK,IAAIQ,EAAI,KAAK,GAAK,CAAC,EAAIF,EAAG,OAAQN,EAAM,OAAQ,GAAI,CAAC,EAAG,CAAC,CAC7E,EAAE,EACIS,EAAS,CAAE,GAAGT,EAAO,GAAI,CAAC,EAAG,CAAC,CAAE,EACtC,SAAW,CAACM,EAAGI,EAAKC,CAAI,GAAK,CAAC,CAACP,EAAQ,EAAGH,EAAM,GAAG,EAAG,CAACG,EAAS,IAAKH,EAAM,IAAM,IAAMA,EAAM,IAAM,GAAI,CAAC,EAAG,CACzG,MAAMW,EAASP,EAAKC,CAAC,EACrB,QAASE,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,MAAMK,EAAID,EAAOJ,CAAC,EAAGM,EAAIF,GAAQJ,EAAI,GAAK,CAAC,EAAGO,GAASP,EAAI,IAAO,KAAK,GAAK,EACtEQ,EAAK,KAAK,IAAID,CAAK,EAAGE,EAAK,CAAC,KAAK,IAAIF,CAAK,EAChDb,EAAYW,EAAGH,EAAKI,EAAGJ,EAAKI,EAAGH,EAAMK,EAAI,EAAGC,EAAId,CAAK,EACrDD,EAAYW,EAAGH,EAAKI,EAAGH,EAAME,EAAGF,EAAMK,EAAI,EAAGC,EAAId,CAAK,EACtDD,EAAYO,EAAQE,EAAME,EAAGF,EAAMG,EAAGH,EAAM,EAAG,EAAG,EAAGR,CAAK,EAC1DD,EAAYO,EAAQC,EAAKI,EAAGJ,EAAKG,EAAGH,EAAK,EAAG,GAAI,EAAGP,CAAK,CAC1D,CACF,CACF",
|
|
6
|
+
"names": ["parseColor", "lampPostGeometry", "point", "style", "addTriangle", "color", "radius", "ring", "r", "_", "i", "center", "low", "high", "points", "a", "b", "angle", "nx", "nz"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{parseColor as w}from"./parseColor.js";function b(i,u,f){if(!Number.isFinite(u.lightRadius)||u.lightRadius<=0)throw new Error("Invalid light radius");const l=w(u.color),s=(o,n,r,p,t,m)=>{f(o,t,n,t,r,t,...m,l),f(o,t,r,t,p,t,...m,l)},c=.65,d=(o,n,r)=>({x:i.x+(r===2?0:o*c),y:i.y+(r===1?0:r===2?o*c:n*c),ground:i.ground+(r===0?0:n*c),uv:[o,n]});for(let o=0;o<3;o++)s(d(-1,-1,o),d(1,-1,o),d(1,1,o),d(-1,1,o),u.top,o===0?[0,1,0]:o===1?[0,0,1]:[1,0,0])}export{b as lightGeometry};
|
|
2
|
+
//# sourceMappingURL=lightGeometry.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/lightGeometry.js"],
|
|
4
|
+
"sourcesContent": ["import { parseColor } from \"./parseColor.js\";\n\n/** Three crossed emitter discs; illumination itself is evaluated on receiving surfaces. */\n\nexport function lightGeometry(point, style, addTriangle) {\n if (!Number.isFinite(style.lightRadius) || style.lightRadius <= 0) throw new Error('Invalid light radius');\n const color = parseColor(style.color);\n const quad = (a, b, c, d, height, normal) => {\n addTriangle(a, height, b, height, c, height, ...normal, color);\n addTriangle(a, height, c, height, d, height, ...normal, color);\n };\n const r = 0.65;\n const emitter = (u, v, axis) => ({\n x: point.x + (axis === 2 ? 0 : u * r),\n y: point.y + (axis === 1 ? 0 : axis === 2 ? u * r : v * r),\n ground: point.ground + (axis === 0 ? 0 : v * r), uv: [u, v],\n });\n for (let axis = 0; axis < 3; axis++) {\n quad(emitter(-1, -1, axis), emitter(1, -1, axis), emitter(1, 1, axis), emitter(-1, 1, axis),\n style.top, axis === 0 ? [0, 1, 0] : axis === 1 ? [0, 0, 1] : [1, 0, 0]);\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,cAAAA,MAAkB,kBAIpB,SAASC,EAAcC,EAAOC,EAAOC,EAAa,CACvD,GAAI,CAAC,OAAO,SAASD,EAAM,WAAW,GAAKA,EAAM,aAAe,EAAG,MAAM,IAAI,MAAM,sBAAsB,EACzG,MAAME,EAAQL,EAAWG,EAAM,KAAK,EAC9BG,EAAO,CAACC,EAAGC,EAAGC,EAAGC,EAAGC,EAAQC,IAAW,CAC3CR,EAAYG,EAAGI,EAAQH,EAAGG,EAAQF,EAAGE,EAAQ,GAAGC,EAAQP,CAAK,EAC7DD,EAAYG,EAAGI,EAAQF,EAAGE,EAAQD,EAAGC,EAAQ,GAAGC,EAAQP,CAAK,CAC/D,EACMQ,EAAI,IACJC,EAAU,CAACC,EAAGC,EAAGC,KAAU,CAC/B,EAAGf,EAAM,GAAKe,IAAS,EAAI,EAAIF,EAAIF,GACnC,EAAGX,EAAM,GAAKe,IAAS,EAAI,EAAIA,IAAS,EAAIF,EAAIF,EAAIG,EAAIH,GACxD,OAAQX,EAAM,QAAUe,IAAS,EAAI,EAAID,EAAIH,GAAI,GAAI,CAACE,EAAGC,CAAC,CAC5D,GACA,QAASC,EAAO,EAAGA,EAAO,EAAGA,IAC3BX,EAAKQ,EAAQ,GAAI,GAAIG,CAAI,EAAGH,EAAQ,EAAG,GAAIG,CAAI,EAAGH,EAAQ,EAAG,EAAGG,CAAI,EAAGH,EAAQ,GAAI,EAAGG,CAAI,EACxFd,EAAM,IAAKc,IAAS,EAAI,CAAC,EAAG,EAAG,CAAC,EAAIA,IAAS,EAAI,CAAC,EAAG,EAAG,CAAC,EAAI,CAAC,EAAG,EAAG,CAAC,CAAC,CAE5E",
|
|
6
|
+
"names": ["parseColor", "lightGeometry", "point", "style", "addTriangle", "color", "quad", "a", "b", "c", "d", "height", "normal", "r", "emitter", "u", "v", "axis"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function F(m,v){const u=m.reduce((i,l)=>i+l.length/8,0),r=32;let a=new Float32Array(8);if(u){let i=1/0,l=1/0,M=-1/0,g=-1/0;for(const t of m)for(let e=0;e<t.length;e+=8)i=Math.min(i,t[e]-t[e+3]),M=Math.max(M,t[e]+t[e+3]),l=Math.min(l,t[e+2]-t[e+3]),g=Math.max(g,t[e+2]+t[e+3]);const f=Math.ceil((M-i)/r)+1,c=Math.ceil((g-l)/r)+1,d=t=>{for(const e of m)for(let o=0;o<e.length;o+=8){const n=e[o+3],h=e[o]-i,U=e[o+2]-l;for(let x=Math.floor((U-n)/r);x<=Math.floor((U+n)/r);x++)for(let w=Math.floor((h-n)/r);w<=Math.floor((h+n)/r);w++)t(x*f+w,e,o)}},s=new Uint32Array(f*c),y=new Uint32Array(f*c);d(t=>s[t]++);const z=s.reduce((t,e)=>t+e,0),A=(2+f*c+z*2)*4;if(A*4>v)throw new Error("Streetlight grid exceeds GPU storage limit");a=new Float32Array(A),a.set([i,l,r,f,c,u,0,0]);let I=2+f*c;for(let t=0;t<s.length;t++)s[t]&&(a[(2+t)*4]=y[t]=I,a[(2+t)*4+1]=s[t],I+=s[t]*2);d((t,e,o)=>{for(let n=0,h=y[t]*4;n<8;n++)a[h+n]=e[o+n];y[t]+=2})}return{data:a,count:u}}export{F as lightGrid};
|
|
2
|
+
//# sourceMappingURL=lightGrid.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/lightGrid.js"],
|
|
4
|
+
"sourcesContent": ["/** Pack world-space point lights into the shader's spatial grid. */\nexport function lightGrid(packed, maxBytes) {\n const count = packed.reduce((sum, values) => sum + values.length / 8, 0), cellSize = 32;\n let data = new Float32Array(8);\n if (count) {\n let minX = Infinity, minZ = Infinity, maxX = -Infinity, maxZ = -Infinity;\n for (const values of packed) for (let i = 0; i < values.length; i += 8) {\n minX = Math.min(minX, values[i] - values[i + 3]);\n maxX = Math.max(maxX, values[i] + values[i + 3]);\n minZ = Math.min(minZ, values[i + 2] - values[i + 3]);\n maxZ = Math.max(maxZ, values[i + 2] + values[i + 3]);\n }\n const columns = Math.ceil((maxX - minX) / cellSize) + 1,\n rows = Math.ceil((maxZ - minZ) / cellSize) + 1;\n const each = callback => {\n for (const values of packed) for (let i = 0; i < values.length; i += 8) {\n const radius = values[i + 3],\n x = values[i] - minX,\n z = values[i + 2] - minZ;\n for (let y = Math.floor((z - radius) / cellSize); y <= Math.floor((z + radius) / cellSize); y++) {\n for (let c = Math.floor((x - radius) / cellSize); c <= Math.floor((x + radius) / cellSize); c++) {\n callback(y * columns + c, values, i);\n }\n }\n }\n };\n // Counting sort: count the lights of each cell, then fill each cell's slice.\n const counts = new Uint32Array(columns * rows),\n next = new Uint32Array(columns * rows);\n each(key => counts[key]++);\n const entries = counts.reduce((sum, value) => sum + value, 0);\n const length = (2 + columns * rows + entries * 2) * 4;\n if (length * 4 > maxBytes) {\n throw new Error('Streetlight grid exceeds GPU storage limit');\n }\n data = new Float32Array(length);\n data.set([minX, minZ, cellSize, columns, rows, count, 0, 0]);\n let offset = 2 + columns * rows;\n for (let key = 0; key < counts.length; key++) if (counts[key]) {\n data[(2 + key) * 4] = next[key] = offset;\n data[(2 + key) * 4 + 1] = counts[key];\n offset += counts[key] * 2;\n }\n each((key, values, i) => {\n for (let j = 0, o = next[key] * 4; j < 8; j++) data[o + j] = values[i + j];\n next[key] += 2;\n });\n }\n return { data, count };\n}\n"],
|
|
5
|
+
"mappings": "AACO,SAASA,EAAUC,EAAQC,EAAU,CAC1C,MAAMC,EAAQF,EAAO,OAAO,CAACG,EAAKC,IAAWD,EAAMC,EAAO,OAAS,EAAG,CAAC,EAAGC,EAAW,GACrF,IAAIC,EAAO,IAAI,aAAa,CAAC,EAC7B,GAAIJ,EAAO,CACT,IAAIK,EAAO,IAAUC,EAAO,IAAUC,EAAO,KAAWC,EAAO,KAC/D,UAAWN,KAAUJ,EAAQ,QAASW,EAAI,EAAGA,EAAIP,EAAO,OAAQO,GAAK,EACnEJ,EAAO,KAAK,IAAIA,EAAMH,EAAOO,CAAC,EAAIP,EAAOO,EAAI,CAAC,CAAC,EAC/CF,EAAO,KAAK,IAAIA,EAAML,EAAOO,CAAC,EAAIP,EAAOO,EAAI,CAAC,CAAC,EAC/CH,EAAO,KAAK,IAAIA,EAAMJ,EAAOO,EAAI,CAAC,EAAIP,EAAOO,EAAI,CAAC,CAAC,EACnDD,EAAO,KAAK,IAAIA,EAAMN,EAAOO,EAAI,CAAC,EAAIP,EAAOO,EAAI,CAAC,CAAC,EAErD,MAAMC,EAAU,KAAK,MAAMH,EAAOF,GAAQF,CAAQ,EAAI,EAC7CQ,EAAO,KAAK,MAAMH,EAAOF,GAAQH,CAAQ,EAAI,EAChDS,EAAOC,GAAY,CACvB,UAAWX,KAAUJ,EAAQ,QAASW,EAAI,EAAGA,EAAIP,EAAO,OAAQO,GAAK,EAAG,CACtE,MAAMK,EAASZ,EAAOO,EAAI,CAAC,EAChBM,EAAIb,EAAOO,CAAC,EAAIJ,EAChBW,EAAId,EAAOO,EAAI,CAAC,EAAIH,EAC/B,QAASW,EAAI,KAAK,OAAOD,EAAIF,GAAUX,CAAQ,EAAGc,GAAK,KAAK,OAAOD,EAAIF,GAAUX,CAAQ,EAAGc,IAC1F,QAASC,EAAI,KAAK,OAAOH,EAAID,GAAUX,CAAQ,EAAGe,GAAK,KAAK,OAAOH,EAAID,GAAUX,CAAQ,EAAGe,IAC1FL,EAASI,EAAIP,EAAUQ,EAAGhB,EAAQO,CAAC,CAGzC,CACF,EAEMU,EAAS,IAAI,YAAYT,EAAUC,CAAI,EACrCS,EAAO,IAAI,YAAYV,EAAUC,CAAI,EAC7CC,EAAKS,GAAOF,EAAOE,CAAG,GAAG,EACzB,MAAMC,EAAUH,EAAO,OAAO,CAAClB,EAAKsB,IAAUtB,EAAMsB,EAAO,CAAC,EACtDC,GAAU,EAAId,EAAUC,EAAOW,EAAU,GAAK,EACpD,GAAIE,EAAS,EAAIzB,EACf,MAAM,IAAI,MAAM,4CAA4C,EAE9DK,EAAO,IAAI,aAAaoB,CAAM,EAC9BpB,EAAK,IAAI,CAACC,EAAMC,EAAMH,EAAUO,EAASC,EAAMX,EAAO,EAAG,CAAC,CAAC,EAC3D,IAAIyB,EAAS,EAAIf,EAAUC,EAC3B,QAASU,EAAM,EAAGA,EAAMF,EAAO,OAAQE,IAAWF,EAAOE,CAAG,IAC1DjB,GAAM,EAAIiB,GAAO,CAAC,EAAID,EAAKC,CAAG,EAAII,EAClCrB,GAAM,EAAIiB,GAAO,EAAI,CAAC,EAAIF,EAAOE,CAAG,EACpCI,GAAUN,EAAOE,CAAG,EAAI,GAE1BT,EAAK,CAACS,EAAKnB,EAAQO,IAAM,CACvB,QAASiB,EAAI,EAAGC,EAAIP,EAAKC,CAAG,EAAI,EAAGK,EAAI,EAAGA,IAAKtB,EAAKuB,EAAID,CAAC,EAAIxB,EAAOO,EAAIiB,CAAC,EACzEN,EAAKC,CAAG,GAAK,CACf,CAAC,CACH,CACA,MAAO,CAAE,KAAAjB,EAAM,MAAAJ,CAAM,CACvB",
|
|
6
|
+
"names": ["lightGrid", "packed", "maxBytes", "count", "sum", "values", "cellSize", "data", "minX", "minZ", "maxX", "maxZ", "i", "columns", "rows", "each", "callback", "radius", "x", "z", "y", "c", "counts", "next", "key", "entries", "value", "length", "offset", "j", "o"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/limbs.js"],
|
|
4
|
+
"sourcesContent": ["// [part, pivot x, pivot y, swing sign]\n\nexport const limbs = [\n ['body', 0, 0, 0],\n ['leg', -0.09, 0.9, 1],\n ['leg', 0.09, 0.9, -1],\n ['arm', -0.25, 1.42, -1],\n ['arm', 0.25, 1.42, 1]\n];\n"],
|
|
5
|
+
"mappings": "AAEO,MAAMA,EAAQ,CACnB,CAAC,OAAQ,EAAG,EAAG,CAAC,EAChB,CAAC,MAAO,KAAO,GAAK,CAAC,EACrB,CAAC,MAAO,IAAM,GAAK,EAAE,EACrB,CAAC,MAAO,KAAO,KAAM,EAAE,EACvB,CAAC,MAAO,IAAM,KAAM,CAAC,CACvB",
|
|
6
|
+
"names": ["limbs"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{decodeModel as A}from"./decodeModel.js";import{emptyNode as E}from"./emptyNode.js";import{nodeMatrix as B}from"./nodeMatrix.js";import{readAccessor as F}from"./readAccessor.js";import{setParent as x}from"./setParent.js";import{textureSampler as I}from"./textureSampler.js";import{vertexNormals as z}from"./vertexNormals.js";import{createProgram as D}from"./createProgram.js";import{conformModelToTerrain as S}from"./conformModelToTerrain.js";async function Q(r){await r._added.promise;const T=new URL(r.modelUrl,document.baseURI).href,g=await fetch(T);if(!g.ok)throw new Error(`Unable to load model: HTTP ${g.status}`);const R=await g.arrayBuffer(),n=A(R),v=new URL(".",T).href;await Promise.all((n.buffers||[]).map(async e=>{if(e.binary)return;const t=await fetch(new URL(e.uri,v).href);if(!t.ok)throw new Error(`Unable to load model buffer: HTTP ${t.status}`);e.binary=await t.arrayBuffer()})),await r._added.promise;const _=await Promise.all((n.images||[]).map(async e=>{let t;if(e.bufferView!==void 0){const s=n.bufferViews[e.bufferView],m=n.buffers[s.buffer].binary;t=new Blob([m.slice(s.byteOffset||0,(s.byteOffset||0)+s.byteLength)],{type:e.mimeType})}else{const s=await fetch(new URL(e.uri,v).href);if(!s.ok)throw new Error(`Unable to load model texture: HTTP ${s.status}`);t=await s.blob()}return createImageBitmap(t,{premultiplyAlpha:"none",colorSpaceConversion:"none"})}));await r._map?._terrain3D?._terrainPromise;const y=new Map,p=(e,t=!1)=>{if(!e)return null;if((e.texCoord||0)!==0||e.extensions)throw new Error("Model textures currently require untransformed TEXCOORD_0 UVs");const s=r.renderer.device,m=`${e.index}:${t}`;if(!y.has(m)){const f=n.textures[e.index],l=n.samplers?.[f.sampler]||{},u=_[f.source],c=t?"rgba8unorm-srgb":"rgba8unorm",o=I(l);y.set(m,{device:s,texture:s.createTexture({size:[u.width,u.height],format:c,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),sampler:s.createSampler(o),samplerOptions:o,format:c,srgb:t,image:u,flipY:!1,uploaded:null})}return y.get(m)},M=(n.materials||[]).map(e=>{const t=e.pbrMetallicRoughness||{};return{color:(t.baseColorFactor||[1,1,1,1]).slice(0,3),opacity:t.baseColorFactor?.[3]??1,metallic:t.metallicFactor??1,roughness:t.roughnessFactor??1,baseTexture:p(t.baseColorTexture,!0),metalTexture:p(t.metallicRoughnessTexture),emissiveTexture:p(e.emissiveTexture,!0),occlusionTexture:p(e.occlusionTexture),emissive:e.emissiveFactor||[0,0,0],occlusionStrength:e.occlusionTexture?.strength??1,alphaMode:r.options.alphaMode||e.alphaMode||"OPAQUE",alphaCutoff:e.alphaCutoff??.5,doubleSided:e.doubleSided}});let U;{const e=new Set,t=[],s=f=>{if(e.has(f))throw new Error("Cyclic glTF nodes");const l=n.nodes[f];if(!l)throw new Error("Invalid glTF node");e.add(f);const u={...E(),name:l.name};if(u.matrix=B(l),l.mesh!==void 0)for(const c of n.meshes[l.mesh].primitives){const o={};for(const[a,i]of[["POSITION","position"],["NORMAL","normal"],["TEXCOORD_0","uv"]])c.attributes[a]!==void 0&&(o[i]=F(n,c.attributes[a]));if(!o.position)throw new Error("glTF mesh has no positions");const h=o.position.data.length/3;if(o.position.size!==3||h<3||Object.values(o).some(a=>a.data.length/a.size!==h))throw new Error("Invalid glTF vertex attributes");if(c.indices!==void 0){const a=F(n,c.indices);if(o.index={size:1,data:a.indices},![Uint8Array,Uint16Array,Uint32Array].some(i=>a.indices instanceof i)||a.size!==1||a.indices.length%3||[...a.indices].some(i=>i>=h))throw new Error("Invalid glTF triangle indices")}if(!o.index&&h%3)throw new Error("Incomplete glTF triangle");if(!o.normal){const a=z(o.position.data,o.index?.data);o.normal={size:3,data:a}}const d=M[c.material]||{color:[1,1,1],metallic:1};if([d.baseTexture,d.metalTexture,d.emissiveTexture,d.occlusionTexture].some(Boolean)&&!o.uv)throw new Error("Textured model mesh requires UV coordinates");const O=D(r,d);t.push(O);const w=r.renderer.device;o.index?.data instanceof Uint8Array&&(o.index.data=Uint16Array.from(o.index.data));for(const[a,i]of Object.entries(o))i.size||=1,i.count=i.data.length/i.size,i.indexFormat=i.data instanceof Uint32Array?"uint32":"uint16",i.buffer=w.createBuffer({size:Math.max(4,i.data.byteLength),usage:a==="index"?GPUBufferUsage.INDEX|GPUBufferUsage.COPY_DST:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST}),w.queue.writeBuffer(i.buffer,0,i.data);const C={device:w,attributes:o,drawRange:{start:0,count:o.index?.count||o.position.count}};t.push(C);const b={...E(),device:w,geometry:C,program:O,fadeDuration:250,id:L.Layer._nextId++,renderOrder:0};b.name=n.meshes[l.mesh].name,b.extras=l.extras||{},x(b,u)}for(const c of l.children||[])x(s(c),u);return e.delete(f),u},m=n.scenes?.[n.scene||0];if(!m)throw new Error("Missing glTF scene");try{U=m.nodes.map(s)}catch(f){for(const l of t)if(l.attributes)for(const u of Object.values(l.attributes))u.buffer.destroy();else l.pipelineCache.clear();throw f}}const P={...E(),id:T,extras:n.extras||{}};if(!U.length)throw new Error("Expected a glTF model with a non-empty scene");for(const e of U)x(e,P);if(r.model=P,r.options.rotation){const[e,t=e,s=e]=r.options.rotation;r.model.rotation[0]=e,r.model.rotation[1]=t,r.model.rotation[2]=s}if(r.options.scale){const[e,t=e,s=e]=r.options.scale;r.model.scale[0]=e,r.model.scale[1]=t,r.model.scale[2]=s}x(r.model,r.root),S(r,r._map?._terrain3D)}export{Q as loadModel};
|
|
2
|
+
//# sourceMappingURL=loadModel.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/loadModel.js"],
|
|
4
|
+
"sourcesContent": ["import { decodeModel } from './decodeModel.js';\nimport { emptyNode } from './emptyNode.js';\nimport { nodeMatrix } from './nodeMatrix.js';\nimport { readAccessor } from './readAccessor.js';\nimport { setParent } from './setParent.js';\nimport { textureSampler } from './textureSampler.js';\nimport { vertexNormals } from './vertexNormals.js';\nimport { createProgram } from './createProgram.js';\nimport { conformModelToTerrain } from './conformModelToTerrain.js';\n\n/** glTF/GLB model loading. */\n/** Load the configured GLB/glTF (static triangles) under `root`; GPU resources need attachment. */\n\nexport async function loadModel(backend) {\n await backend._added.promise;\n const url = new URL(backend.modelUrl, document.baseURI).href;\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Unable to load model: HTTP ${response.status}`);\n }\n const data = await response.arrayBuffer();\n const description = decodeModel(data);\n const directory = new URL('.', url).href;\n await Promise.all((description.buffers || []).map(async (buffer) => {\n if (buffer.binary) {\n return;\n }\n const response = await fetch(new URL(buffer.uri, directory).href);\n if (!response.ok) {\n throw new Error(`Unable to load model buffer: HTTP ${response.status}`);\n }\n buffer.binary = await response.arrayBuffer();\n }));\n await backend._added.promise;\n const images = await Promise.all((description.images || []).map(async (image) => {\n let blob;\n if (image.bufferView !== undefined) {\n const view = description.bufferViews[image.bufferView];\n const buffer = description.buffers[view.buffer].binary;\n blob = new Blob([buffer.slice(view.byteOffset || 0, (view.byteOffset || 0) + view.byteLength)],\n { type: image.mimeType });\n } else {\n const response = await fetch(new URL(image.uri, directory).href);\n if (!response.ok) throw new Error(`Unable to load model texture: HTTP ${response.status}`);\n blob = await response.blob();\n }\n // Preserve straight alpha and raw samples; GPU sRGB formats do color decoding.\n return createImageBitmap(blob, { premultiplyAlpha: 'none', colorSpaceConversion: 'none' });\n }));\n await backend._map?._terrain3D?._terrainPromise;\n const textures = new Map();\n const textureFor = (reference, color = false) => {\n if (!reference) return null;\n if ((reference.texCoord || 0) !== 0 || reference.extensions) {\n throw new Error('Model textures currently require untransformed TEXCOORD_0 UVs');\n }\n const device = backend.renderer.device;\n // A glTF image may serve both color and data maps: those cannot share a GPU format.\n const key = `${reference.index}:${color}`;\n if (!textures.has(key)) {\n const texture = description.textures[reference.index];\n const sampler = description.samplers?.[texture.sampler] || {};\n const image = images[texture.source];\n const format = color ? 'rgba8unorm-srgb' : 'rgba8unorm';\n const samplerOptions = textureSampler(sampler);\n textures.set(key, {\n device,\n texture: device.createTexture({\n size: [image.width, image.height],\n format,\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,\n }),\n sampler: device.createSampler(samplerOptions),\n samplerOptions,\n format,\n srgb: color,\n image,\n flipY: false,\n uploaded: null,\n });\n }\n return textures.get(key);\n };\n // Convert glTF materials directly to the shader's retained CPU styles.\n const materials = (description.materials || []).map(material => {\n const pbr = material.pbrMetallicRoughness || {};\n return {\n color: (pbr.baseColorFactor || [1, 1, 1, 1]).slice(0, 3),\n opacity: pbr.baseColorFactor?.[3] ?? 1,\n metallic: pbr.metallicFactor ?? 1,\n roughness: pbr.roughnessFactor ?? 1,\n baseTexture: textureFor(pbr.baseColorTexture, true),\n metalTexture: textureFor(pbr.metallicRoughnessTexture),\n emissiveTexture: textureFor(material.emissiveTexture, true),\n occlusionTexture: textureFor(material.occlusionTexture),\n emissive: material.emissiveFactor || [0, 0, 0],\n occlusionStrength: material.occlusionTexture?.strength ?? 1,\n alphaMode: backend.options.alphaMode || material.alphaMode || 'OPAQUE',\n alphaCutoff: material.alphaCutoff ?? 0.5,\n doubleSided: material.doubleSided,\n };\n });\n let nodes;\n {\n // Track only the recursion path: shared mesh references are valid, cycles are not.\n const active = new Set(), resources = [];\n const node = index => {\n if (active.has(index)) throw new Error('Cyclic glTF nodes');\n const spec = description.nodes[index];\n if (!spec) throw new Error('Invalid glTF node');\n active.add(index);\n const group = {\n ...emptyNode(),\n name: spec.name\n };\n group.matrix = nodeMatrix(spec);\n if (spec.mesh !== undefined) {\n for (const primitive of description.meshes[spec.mesh].primitives) {\n const attributes = {};\n for (const [semantic, name] of [['POSITION', 'position'], ['NORMAL', 'normal'], ['TEXCOORD_0', 'uv']]) {\n if (primitive.attributes[semantic] !== undefined) attributes[name] = readAccessor(description, primitive.attributes[semantic]);\n }\n if (!attributes.position) throw new Error('glTF mesh has no positions');\n const vertexCount = attributes.position.data.length / 3;\n if (attributes.position.size !== 3 || vertexCount < 3 ||\n Object.values(attributes).some(attribute => attribute.data.length / attribute.size !== vertexCount)) throw new Error('Invalid glTF vertex attributes');\n if (primitive.indices !== undefined) {\n const index = readAccessor(description, primitive.indices);\n attributes.index = { size: 1, data: index.indices };\n if (![Uint8Array, Uint16Array, Uint32Array].some(Type => index.indices instanceof Type) ||\n index.size !== 1 || index.indices.length % 3 || [...index.indices].some(i => i >= vertexCount)) throw new Error('Invalid glTF triangle indices');\n }\n if (!attributes.index && vertexCount % 3) throw new Error('Incomplete glTF triangle');\n if (!attributes.normal) {\n const normals = vertexNormals(attributes.position.data, attributes.index?.data);\n attributes.normal = { size: 3, data: normals };\n }\n const style = materials[primitive.material] || { color: [1, 1, 1], metallic: 1 };\n if ([style.baseTexture, style.metalTexture, style.emissiveTexture, style.occlusionTexture].some(Boolean) && !attributes.uv) {\n throw new Error('Textured model mesh requires UV coordinates');\n }\n const program = createProgram(backend, style);\n resources.push(program);\n const device = backend.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 const geometry = {\n device,\n attributes,\n drawRange: { start: 0, count: attributes.index?.count || attributes.position.count },\n };\n resources.push(geometry);\n const mesh = {\n ...emptyNode(),\n device,\n geometry,\n program,\n fadeDuration: 250,\n id: L.Layer._nextId++,\n renderOrder: 0\n };\n mesh.name = description.meshes[spec.mesh].name; mesh.extras = spec.extras || {};\n setParent(mesh, group);\n }\n }\n for (const child of spec.children || []) setParent(node(child), group);\n active.delete(index);\n return group;\n };\n const scene = description.scenes?.[description.scene || 0];\n if (!scene) throw new Error('Missing glTF scene');\n try {\n nodes = scene.nodes.map(node);\n } catch (error) {\n // Parsing can fail after earlier primitives allocated buffers/programs.\n for (const resource of resources) {\n if (resource.attributes) {\n for (const attribute of Object.values(resource.attributes)) attribute.buffer.destroy();\n } else {\n resource.pipelineCache.clear();\n }\n }\n throw error;\n }\n }\n const model = {\n ...emptyNode(),\n id: url,\n extras: description.extras || {},\n };\n if (!nodes.length) throw new Error('Expected a glTF model with a non-empty scene');\n for (const node of nodes) setParent(node, model);\n backend.model = model;\n if (backend.options.rotation) {\n const [x, y = x, z = x] = backend.options.rotation;\n backend.model.rotation[0] = x; backend.model.rotation[1] = y; backend.model.rotation[2] = z;\n }\n if (backend.options.scale) {\n const [x, y = x, z = x] = backend.options.scale;\n backend.model.scale[0] = x; backend.model.scale[1] = y; backend.model.scale[2] = z;\n }\n setParent(backend.model, backend.root);\n conformModelToTerrain(backend, backend._map?._terrain3D);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["decodeModel", "emptyNode", "nodeMatrix", "readAccessor", "setParent", "textureSampler", "vertexNormals", "createProgram", "conformModelToTerrain", "loadModel", "backend", "url", "response", "data", "description", "directory", "buffer", "images", "image", "blob", "view", "textures", "textureFor", "reference", "color", "device", "key", "texture", "sampler", "format", "samplerOptions", "materials", "material", "pbr", "nodes", "active", "resources", "node", "index", "spec", "group", "primitive", "attributes", "semantic", "name", "vertexCount", "attribute", "Type", "normals", "style", "program", "geometry", "mesh", "child", "scene", "error", "resource", "model", "x", "y", "z"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{getZxy as u}from"./getZxy.js";async function d(o,e){if(o._geojson){const{data:r,url:t}=o.options;if(r!==void 0&&t)throw new Error("GeoJSON source requires either data or url");if(r!==void 0)return r;if(!t)throw new Error("GeoJSON source requires either data or url");const s=await fetch(new URL(t,document.baseURI),{signal:e.request.signal});if(!s.ok)throw new Error(`Unable to load GeoJSON: HTTP ${s.status}`);return s.json()}const n=await u(o,e.coords.z,e.coords.x,e.coords.y,e.request.signal);return n?JSON.parse(new TextDecoder().decode(n.data)):{type:"FeatureCollection",features:[]}}export{d as loadSource};
|
|
2
|
+
//# sourceMappingURL=loadSource.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/loadSource.js"],
|
|
4
|
+
"sourcesContent": ["import { getZxy } from './getZxy.js';\n\nexport async function loadSource(backend, area) {\n if (backend._geojson) {\n const { data, url } = backend.options;\n if (data !== undefined && url) throw new Error('GeoJSON source requires either data or url');\n if (data !== undefined) return data;\n if (!url) throw new Error('GeoJSON source requires either data or url');\n const response = await fetch(new URL(url, document.baseURI), { signal: area.request.signal });\n if (!response.ok) throw new Error(`Unable to load GeoJSON: HTTP ${response.status}`);\n return response.json();\n }\n const result = await getZxy(backend, area.coords.z, area.coords.x, area.coords.y, area.request.signal);\n return result\n ? JSON.parse(new TextDecoder().decode(result.data))\n : { type: 'FeatureCollection', features: [] };\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,UAAAA,MAAc,cAEvB,eAAsBC,EAAWC,EAASC,EAAM,CAC9C,GAAID,EAAQ,SAAU,CACpB,KAAM,CAAE,KAAAE,EAAM,IAAAC,CAAI,EAAIH,EAAQ,QAC9B,GAAIE,IAAS,QAAaC,EAAK,MAAM,IAAI,MAAM,4CAA4C,EAC3F,GAAID,IAAS,OAAW,OAAOA,EAC/B,GAAI,CAACC,EAAK,MAAM,IAAI,MAAM,4CAA4C,EACtE,MAAMC,EAAW,MAAM,MAAM,IAAI,IAAID,EAAK,SAAS,OAAO,EAAG,CAAE,OAAQF,EAAK,QAAQ,MAAO,CAAC,EAC5F,GAAI,CAACG,EAAS,GAAI,MAAM,IAAI,MAAM,gCAAgCA,EAAS,MAAM,EAAE,EACnF,OAAOA,EAAS,KAAK,CACvB,CACA,MAAMC,EAAS,MAAMP,EAAOE,EAASC,EAAK,OAAO,EAAGA,EAAK,OAAO,EAAGA,EAAK,OAAO,EAAGA,EAAK,QAAQ,MAAM,EACrG,OAAOI,EACH,KAAK,MAAM,IAAI,YAAY,EAAE,OAAOA,EAAO,IAAI,CAAC,EAChD,CAAE,KAAM,oBAAqB,SAAU,CAAC,CAAE,CAChD",
|
|
6
|
+
"names": ["getZxy", "loadSource", "backend", "area", "data", "url", "response", "result"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{addBridges as g}from"./addBridges.js";import{conformModelToTerrain as u}from"./conformModelToTerrain.js";import{getElevation as p}from"./getElevation.js";import{setTerrainHeight as w}from"./setTerrainHeight.js";import{update as _}from"./update.js";async function d(r){if(r._terrainLoading||!r._map)return;r._terrainLoading=!0,r._terrainReady=!1;const a=r._terrainController=new AbortController;try{if(!r.terrainSource)throw new Error("Terrain layer requires a PMTiles elevation archive");const n=r._terrainArchive=new L.Layer({source:{type:"pmtiles",url:r.terrainSource}});await n.ready;const e=n.header;if(e.tileType!==0||e.minZoom!==e.maxZoom)throw new Error("Expected a single-zoom Float32 PMTiles terrain archive");r._terrainZoom=e.maxZoom;const i=r._map,m=i.project([e.maxLat,e.minLon],r._terrainZoom).divideBy(256).floor(),y=i.project([e.minLat,e.maxLon],r._terrainZoom).divideBy(256).floor();r._terrainBounds=new L.Bounds(m,y);const s=[];for(let t=m.x;t<=y.x;t++)for(let o=m.y;o<=y.y;o++)s.push({z:r._terrainZoom,x:t,y:o});const l=i.project(i.getCenter(),r._terrainZoom).divideBy(256);s.sort((t,o)=>Math.hypot(t.x+.5-l.x,t.y+.5-l.y)-Math.hypot(o.x+.5-l.x,o.y+.5-l.y));let f=0;await Promise.all(Array.from({length:Math.min(4,s.length)},async()=>{for(;f<s.length;){a.signal.throwIfAborted();const t=s[f++],o=await n.getZxy(t.z,t.x,t.y,a.signal);if(!o||o.data.byteLength!==256*256*4)throw new Error(`Missing or invalid Float32 terrain tile ${t.z}/${t.x}/${t.y}`);r._terrainTiles.set(`${t.x}/${t.y}`,new Float32Array(o.data))}}));const h=r.options.bridges&&await fetch(r.options.bridges,{signal:a.signal}).then(t=>{if(!t.ok)throw new Error(`Bridges: HTTP ${t.status}`);return t.json()});if(a.signal.aborted||r._map!==i)return;r._terrainReady=!0,r._terrainOriginElevation=p(r,r.location)??0;for(const t of Object.values(i._layers))w(t),u(t,r);return h&&g(r,h),i.fire("terrainchange"),_(r),r.fire("terrainready"),!0}catch(n){return a.signal.aborted||r.fire("error",{error:n}),!1}finally{r._terrainLoading=!1}}export{d as loadTerrain};
|
|
2
|
+
//# sourceMappingURL=loadTerrain.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/loadTerrain.js"],
|
|
4
|
+
"sourcesContent": ["import { addBridges } from './addBridges.js';\nimport { conformModelToTerrain } from './conformModelToTerrain.js';\nimport { getElevation } from './getElevation.js';\nimport { setTerrainHeight } from './setTerrainHeight.js';\nimport { update } from './update.js';\n\n\nexport async function loadTerrain(backend) {\n if (backend._terrainLoading || !backend._map) return;\n backend._terrainLoading = true;\n backend._terrainReady = false;\n const controller = backend._terrainController = new AbortController();\n try {\n if (!backend.terrainSource) throw new Error('Terrain layer requires a PMTiles elevation archive');\n const archive = backend._terrainArchive = new L.Layer({ source: { type: 'pmtiles', url: backend.terrainSource } });\n await archive.ready;\n const header = archive.header;\n if (header.tileType !== 0 || header.minZoom !== header.maxZoom) {\n throw new Error('Expected a single-zoom Float32 PMTiles terrain archive');\n }\n backend._terrainZoom = header.maxZoom;\n const map = backend._map;\n const northwest = map.project([header.maxLat, header.minLon], backend._terrainZoom).divideBy(256).floor();\n const southeast = map.project([header.minLat, header.maxLon], backend._terrainZoom).divideBy(256).floor();\n backend._terrainBounds = new L.Bounds(northwest, southeast);\n const tiles = [];\n for (let x = northwest.x; x <= southeast.x; x++) {\n for (let y = northwest.y; y <= southeast.y; y++) tiles.push({ z: backend._terrainZoom, x, y });\n }\n const center = map.project(map.getCenter(), backend._terrainZoom).divideBy(256);\n tiles.sort((a, b) => Math.hypot(a.x + 0.5 - center.x, a.y + 0.5 - center.y) -\n Math.hypot(b.x + 0.5 - center.x, b.y + 0.5 - center.y));\n let next = 0;\n await Promise.all(Array.from({ length: Math.min(4, tiles.length) }, async () => {\n while (next < tiles.length) {\n controller.signal.throwIfAborted();\n const coords = tiles[next++];\n const result = await archive.getZxy(coords.z, coords.x, coords.y, controller.signal);\n if (!result || result.data.byteLength !== 256 * 256 * 4) {\n throw new Error(`Missing or invalid Float32 terrain tile ${coords.z}/${coords.x}/${coords.y}`);\n }\n backend._terrainTiles.set(`${coords.x}/${coords.y}`, new Float32Array(result.data));\n }\n }));\n const bridges = backend.options.bridges && await fetch(backend.options.bridges, { signal: controller.signal })\n .then(response => { if (!response.ok) throw new Error(`Bridges: HTTP ${response.status}`); return response.json(); });\n if (controller.signal.aborted || backend._map !== map) return;\n backend._terrainReady = true;\n backend._terrainOriginElevation = getElevation(backend, backend.location) ?? 0;\n for (const layer of Object.values(map._layers)) {\n setTerrainHeight(layer);\n conformModelToTerrain(layer, backend);\n }\n if (bridges) addBridges(backend, bridges);\n map.fire('terrainchange');\n update(backend);\n backend.fire('terrainready');\n return true;\n } catch (error) {\n if (!controller.signal.aborted) backend.fire('error', { error });\n return false;\n } finally {\n backend._terrainLoading = false;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["addBridges", "conformModelToTerrain", "getElevation", "setTerrainHeight", "update", "loadTerrain", "backend", "controller", "archive", "header", "map", "northwest", "southeast", "tiles", "x", "y", "center", "a", "b", "next", "coords", "result", "bridges", "response", "layer", "error"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const l=Object.defineProperties({},Object.getOwnPropertyDescriptors(L.Map.prototype)),T=Math.PI/180,m=t=>Array.isArray(t)?new L.Point(t[0],t[1]):new L.Point(t.x,t.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 G(t){const e=t.getBearing()*T,i=t.getPitch()*T;return[Math.cos(e),Math.sin(e),Math.cos(i),Math.sin(i)]}function M(t,e,i=!1,n=!1){const o=t.getSize().divideBy(2),a=t.getSize().y*1.5;if(!a)return m(e);const[s,r,h,c]=G(t),g=m(e).subtract(o);if(i){const y=t.getSize().y*t.options.pitchMaxDistance,B=h*a+c*g.y;let _=B>0?g.y*a/B:-y;n&&(_=Math.max(-y,Math.min(y,_)));const x=g.x*(a-c*_)/a;return new L.Point(s*x+r*_,-r*x+s*_).add(o)}const d=s*g.x-r*g.y,p=r*g.x+s*g.y,f=a/(a-c*p);return new L.Point(d*f,h*p*f).add(o)}function I(t,e){return t.layerPointToContainerPoint(e).subtract(t._getMapPanePos())}function E(t,e,i=!1){const n=t._cameraView;if(!n)return e;const o=t.getSize().divideBy(2),a=t.getZoomScale(n.zoom),s=t.project(t.getCenter(),n.zoom).subtract(t.project(n.center,n.zoom));return i?e.subtract(o).subtract(s).divideBy(a).add(o):e.subtract(o).multiplyBy(a).add(s).add(o)}function F(t,e=[0,0]){const i=m(e).divideBy(2),n=t.getSize().subtract(i);return new L.Bounds([[i.x,i.y],[n.x,i.y],[i.x,n.y],[n.x,n.y]].map(o=>M(t,o,!0,!0)))}function $(t,e,i={}){e=e.getBounds?e.getBounds():e instanceof L.LatLngBounds?e:new L.LatLngBounds(e);const n=t.getZoom()??0,o=t.getSize().divideBy(2),a=t.getSize().y*1.5,s=m(i.paddingTopLeft||i.padding||[0,0]).subtract(o),r=o.subtract(m(i.paddingBottomRight||i.padding||[0,0])),[h,c,g,d]=G(t),p=t.getSize().y*t.options.pitchMaxDistance,f=u=>g*a+d*u>0?Math.max(-p,Math.min(p,u*a/(g*a+d*u))):-p,y=f(s.y),B=f(r.y),_=t.project(e.getNorthWest(),n).add(t.project(e.getSouthEast(),n)).divideBy(2),x=[e.getNorthWest(),e.getNorthEast(),e.getSouthWest(),e.getSouthEast()].map(u=>{const S=t.project(u,n).subtract(_);return new L.Point(h*S.x-c*S.y,c*S.x+h*S.y)}),C=Math.min(...x.map(u=>u.y)),O=Math.max(...x.map(u=>u.y)),k=s.x*d/a,j=r.x*d/a,w=j-k,z=Math.min(...x.map(u=>u.x+k*u.y)),D=Math.max(...x.map(u=>u.x+j*u.y)),q=Math.min((B-y)/(O-C),(r.x-s.x-w*y)/(D-z-w*C));let P=t.getScaleZoom(q,n);const Z=t.options.zoomSnap;if(Z&&(P=Math.floor(Math.round(P/(Z/100))/100)*Z),P=Math.max(t.getMinZoom(),Math.min(t.getMaxZoom(),i.maxZoom??1/0,P)),!Number.isFinite(P))return{center:e.getCenter(),zoom:P};const b=t.getZoomScale(P,n),U=O*b-B,N=C*b-y,V=Math.max(U,w?(b*(D-z)-r.x+s.x)/w:U),A=(Math.min(N,V)+N)/2,R=(b*(z+D)-s.x-r.x-(k+j)*A)/2,H=_.add(new L.Point(h*R+c*A,-c*R+h*A).divideBy(b));return{center:t.unproject(H,n),zoom:P}}function W(){const t=this.getSize().y,e=this.getPitch()*T,i=t*this.options.pitchMaxDistance,n=t*1.5,o=t/2-i*Math.cos(e)*n/(n+Math.sin(e)*i);o>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(o))}px`,this._pitchSky.style.display=o>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(t,e){if(!Number.isFinite(t)||!Number.isFinite(e))throw new TypeError("Camera angles must be finite numbers");const i=this.getPitch(),n=this.getBearing();return this._cameraPitch=Math.max(0,Math.min(85,t)),this._cameraBearing=(e%360+360)%360,this._loaded&&(W.call(this),n!==this.getBearing()&&this.fire("rotate",{bearing:this.getBearing()}),i!==this.getPitch()&&this.fire("pitch",{pitch:this.getPitch()})),this},_animateCamera(t,e,i={}){if(cancelAnimationFrame(this._cameraFrame),!Number.isFinite(t)||!Number.isFinite(e))throw new TypeError("Camera angles must be finite numbers");if(!i.animate||matchMedia("(prefers-reduced-motion: reduce)").matches)return this._setPitchAndBearing(t,e);const n=i.duration??.3;if(!Number.isFinite(n)||n<0)throw new TypeError("Camera duration must be nonnegative");const o=performance.now(),a=this.getPitch(),s=this.getBearing(),r=((e-s)%360+540)%360-180,h=c=>{const g=n?Math.min(1,(c-o)/(n*1e3)):1,d=1-(1-g)**3;this._setPitchAndBearing(a+(Math.max(0,Math.min(85,t))-a)*d,s+r*d),g<1&&(this._cameraFrame=requestAnimationFrame(h))};return this._cameraFrame=requestAnimationFrame(h),this},setBearing(t,e){return this._animateCamera(this.getPitch(),t,e)},setPitch(t,e){return this._animateCamera(t,this.getBearing(),e)},resetNorth(t={animate:!0}){return this.setBearing(0,t)},resetNorthPitch(t={animate:!0}){return this._animateCamera(0,0,t)},layerPointToContainerPoint(t){return M(this,E(this,l.layerPointToContainerPoint.call(this,t)))},containerPointToLayerPoint(t){return l.containerPointToLayerPoint.call(this,E(this,M(this,t,!0),!0))},_getCenterLayerPoint(){return l.containerPointToLayerPoint.call(this,this.getSize().divideBy(2))},_updateCameraOverlays(){for(const t of Object.values(this._layers))t instanceof L.Marker?t.update():(t instanceof L.Popup||t instanceof L.Tooltip)&&t._updatePosition()},panBy(t,e){const i=this.getSize().divideBy(2),n=i.subtract(M(this,i.subtract(m(t)),!0));return l.panBy.call(this,n,e)},setZoomAround(t,e,i){if(!this.getPitch()&&!this.getBearing())return l.setZoomAround.call(this,t,e,i);e=this._limitZoom(e);const n=this.getZoomScale(e),o=this.getSize().divideBy(2),a=t instanceof L.Point?t:this.latLngToContainerPoint(t),s=this.containerPointToLayerPoint(o),r=this.containerPointToLayerPoint(a),h=s.add(r.subtract(s).multiplyBy(1-1/n));return this.setView(this.layerPointToLatLng(h),e,{zoom:i})},panInside(t,e={}){if(!this.getPitch()&&!this.getBearing())return l.panInside.call(this,t,e);const i=m(e.paddingTopLeft||e.padding||[0,0]),n=this.getSize().subtract(m(e.paddingBottomRight||e.padding||[0,0])),o=this.latLngToContainerPoint(t),a=new L.Point(Math.max(i.x,Math.min(n.x,o.x)),Math.max(i.y,Math.min(n.y,o.y)));if(a.equals(o))return this;const s=this.latLngToLayerPoint(t).subtract(this.containerPointToLayerPoint(a));return this.panTo(this.unproject(this.project(this.getCenter()).add(s)),e)},_limitCenter(t,e,i){if(!i||!this._loaded||!this.getPitch()&&!this.getBearing())return l._limitCenter.call(this,t,e,i);const n=this.getSize().divideBy(2),o=F(this),a=this.project(t,e),s=new L.Bounds(a.add(o.min.subtract(n)),a.add(o.max.subtract(n))),r=this._getBoundsOffset(s,i,e);return Math.abs(r.x)<=1&&Math.abs(r.y)<=1?t:this.unproject(a.add(r),e)},_limitOffset(t,e){if(!e||!this.getPitch()&&!this.getBearing())return l._limitOffset.call(this,t,e);const i=this.getSize().divideBy(2),n=i.subtract(M(this,i.subtract(t),!0)),o=this.project(this.getCenter()),a=this.project(this._limitCenter(this.unproject(o.add(n)),this.getZoom(),e));return i.subtract(M(this,i.subtract(a.subtract(o))))},_getBoundsCenterZoom(t,e){return this.getPitch()||this.getBearing()?$(this,t,e):l._getBoundsCenterZoom.call(this,t,e)},getBoundsZoom(t,e,i){if(!this.getPitch()&&!this.getBearing())return l.getBoundsZoom.call(this,t,e,i);if(!e)return $(this,t,{padding:m(i||[0,0]).divideBy(2)}).zoom;t=t instanceof L.LatLngBounds?t:new L.LatLngBounds(t);const n=F(this,i).getSize(),o=this.project(t.getSouthEast()).subtract(this.project(t.getNorthWest())),a=this.getScaleZoom(Math.max(n.x/o.x,n.y/o.y)),s=this.options.zoomSnap;return Math.max(this.getMinZoom(),Math.min(this.getMaxZoom(),s?Math.ceil(a/s)*s:a))},_tryAnimatedPan(t,e){const i=this._getCenterOffset(t)._trunc();return e?.animate!==!0&&!this.getSize().contains(i)?!1:(l.panBy.call(this,i,e),!0)},getBounds(){if(!this.getPitch()&&!this.getBearing())return l.getBounds.call(this);const t=F(this),e=new L.LatLngBounds;for(const i of[t.min,t.max]){const n=l.containerPointToLayerPoint.call(this,E(this,i,!0));e.extend(this.layerPointToLatLng(n))}return e}}),L.Map.addInitHook(function(){if(!document.getElementById("leaflet-camera-zoom-style")){const t=document.createElement("style");t.id="leaflet-camera-zoom-style",t.textContent=[".leaflet-marker-icon",".leaflet-marker-shadow",".leaflet-popup",".leaflet-tooltip"].map(e=>`.leaflet-camera-zoom ${e}`).join(",")+"{transition:none!important}",document.head.append(t)}this._setPitchAndBearing(this.options.pitch,this.options.bearing),this.on("load resize pitch",W),this.on("rotate pitch",()=>{this.options.maxBounds&&this._panInsideMaxBounds()}),this.once("unload",()=>{cancelAnimationFrame(this._cameraFrame),this._pitchSky?.remove()}),this.whenReady(()=>{const t=this.dragging?._draggable;if(!t)return;const e=()=>{if(!this.getPitch()&&!this.getBearing())return;const i=this.getSize().divideBy(2),n=t._newPos.subtract(t._startPos),o=i.subtract(M(this,i.subtract(n),!0));t._newPos=t._startPos.add(o)};t.on("predrag",e),this.once("unload",()=>t.off("predrag",e))}),(this.options.rotate||this.options.trackContainerMutation)&&(this.cameraReady=import("./cameraControls.js").then(({cameraControls:t})=>{this._container?._leaflet_id&&t(this)}),this.cameraReady.catch(t=>this.fire("error",{error:t})))});const v=Object.defineProperties({},Object.getOwnPropertyDescriptors(L.Marker.prototype));L.Marker.mergeOptions({rotation:0,rotateWithView:!1,keepUpright:!1,scale:1}),L.Marker.include({setIcon(t){t instanceof L.DivIcon||(t.options.crossOrigin||=!0);const e=v.setIcon.call(this,t);return this._map&&!(t instanceof L.DivIcon)&&this._initNativeGPU(this._map),e},setRotation(t){if(!Number.isFinite(t))throw new TypeError("Marker rotation must be finite");return this.options.rotation=t,this.update(),this._nativeGPU?.refresh?.(),this},_cameraIconPoint(t,e){let i=this.options.rotation+(this.options.rotateWithView?this._map.getBearing()*T:0);this.options.keepUpright&&Math.cos(i)<0&&(i+=Math.PI);const n=this.options.scale;return new L.Point((t*Math.cos(i)-e*Math.sin(i))*n,(t*Math.sin(i)+e*Math.cos(i))*n)},getEvents(){return{...v.getEvents.call(this),rotate:this.update,pitch:this.update,move:this.update}},_setPos(t){v._setPos.call(this,I(this._map,t));for(const[e,i]of[[this._icon,"iconAnchor"],[this._shadow,"shadowAnchor"]]){if(!e)continue;const n=this._cameraIconPoint(1,0),o=this.options.icon.options,a=o[i]||o.iconAnchor;e.style.transformOrigin=a?`${a.x??a[0]}px ${a.y??a[1]}px`:"center",e.style.transform+=` rotate(${Math.atan2(n.y,n.x)}rad) scale(${this.options.scale})`}},_updateZIndex(t){v._updateZIndex.call(this,t);const e=this._cameraZIndexOffset!==t;this._cameraZIndexOffset=t,e&&this._nativeGPU?.refresh?.()},_initInteraction(){const t=v._initInteraction.call(this);return K.call(this),t}});function K(){if(!this.dragging||this.dragging._cameraDrag)return;const t=this.dragging,e=t._onDrag,i=t._adjustPan;t._onDrag=function(o){const a=this._marker._map,s=L.DomUtil.getPosition(this._marker._icon).add(a._getMapPanePos()),r=a.containerPointToLayerPoint(s),h=this._marker._icon;L.DomUtil.setPosition(h,r),e.call(this,o),this._marker._setPos(r)},t._adjustPan=function(o){const a=this._marker,s=a._map;if(!s.getPitch()&&!s.getBearing())return i.call(this,o);const r=L.DomUtil.getPosition(a._icon).add(s._getMapPanePos()),h=s.getSize(),c=m(a.options.autoPanPadding),g=a.options.autoPanSpeed,d=new L.Point((Math.max(0,r.x-h.x+c.x)-Math.max(0,c.x-r.x))/Math.max(1,c.x)*g,(Math.max(0,r.y-h.y+c.y)-Math.max(0,c.y-r.y))/Math.max(1,c.y)*g);if(!d.x&&!d.y)return;const p=s._getMapPanePos();s.panBy(d,{animate:!1});const f=p.subtract(s._getMapPanePos());this._draggable._newPos._add(f),this._draggable._startPos._add(f),L.DomUtil.setPosition(a._icon,this._draggable._newPos),this._onDrag(o),this._panRequest=requestAnimationFrame(()=>this._adjustPan(o))},t.enabled()&&(t._draggable.off("drag",e,t),t._draggable.on("drag",t._onDrag,t)),t._cameraDrag=!0}for(const t of[L.Popup,L.Tooltip]){const e=t.prototype.getEvents;t.include({getEvents(){return{...e.call(this),rotate:this._updatePosition,pitch:this._updatePosition,move:this._updatePosition}}})}const X=L.Popup.prototype._updatePosition,Y=L.Popup.prototype._adjustPan;L.Popup.include({_adjustPan(){const t=this._map;if(!t.getPitch()&&!t.getBearing())return Y.call(this);if(!this.options.autoPan)return;if(t._panAnim&&t._panAnim.stop(),this._autopanning){this._autopanning=!1;return}const e=this._container.getBoundingClientRect(),i=t.getContainer().getBoundingClientRect(),n=m(this.options.autoPanPaddingTopLeft||this.options.autoPanPadding),o=t.getSize().subtract(m(this.options.autoPanPaddingBottomRight||this.options.autoPanPadding)),a=e.left-i.left,s=e.top-i.top,r=e.right-i.left,h=e.bottom-i.top,c=Math.min(0,a-n.x)||Math.max(0,r-o.x),g=Math.min(0,s-n.y)||Math.max(0,h-o.y);if(!c&&!g)return;this.options.keepInView&&(this._autopanning=!0);const d=t.latLngToContainerPoint(this._latlng).subtract(new L.Point(c,g)),p=t.latLngToLayerPoint(this._latlng).subtract(t.containerPointToLayerPoint(d));t.fire("autopanstart"),t.panTo(t.unproject(t.project(t.getCenter()).add(p)))},_updatePosition(){if(X.call(this),!this._map)return;const t=this._map.latLngToLayerPoint(this._latlng),e=I(this._map,t).subtract(t);this._zoomAnimated?L.DomUtil.setPosition(this._container,L.DomUtil.getPosition(this._container).add(e)):(this._container.style.left=`${this._containerLeft+e.x}px`,this._container.style.bottom=`${this._containerBottom-e.y}px`)}});const J=L.Tooltip.prototype._setPosition;L.Tooltip.include({_setPosition(t){J.call(this,t);const e=I(this._map,t).subtract(t);L.DomUtil.setPosition(this._container,L.DomUtil.getPosition(this._container).add(e))}});const Q=L.GridLayer.prototype._getTiledPixelBounds,tt=L.GridLayer.prototype.getEvents;L.GridLayer.include({getEvents(){const t=tt.call(this);return this._cameraGridUpdate||=L.Util.throttle(this._onMoveEnd,this.options.updateInterval,this),{...t,rotate:this._cameraGridUpdate,pitch:this._cameraGridUpdate}},_getTiledPixelBounds(t){if(!this._map.getBearing()&&!this._map.getPitch())return Q.call(this,t);const e=this._map.getBounds();return new L.Bounds(this._map.project(e.getNorthWest(),this._tileZoom),this._map.project(e.getSouthEast(),this._tileZoom))}});
|
|
2
|
+
//# sourceMappingURL=mapCamera.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/mapCamera.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"],
|
|
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"]
|
|
7
|
+
}
|