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/toSRGB.js"],
|
|
4
|
+
"sourcesContent": ["export const toSRGB = value => value <= 0.0031308 ? value * 12.92 : 1.055 * value ** (1 / 2.4) - 0.055;\n"],
|
|
5
|
+
"mappings": "AAAO,MAAMA,EAASC,GAASA,GAAS,SAAYA,EAAQ,MAAQ,MAAQA,GAAU,kBAAW",
|
|
6
|
+
"names": ["toSRGB", "value"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const n=({properties:e})=>{const t=document.createElement("div");return t.style.whiteSpace="pre-line",t.textContent=[e.name,e.departure&&`Departure ${e.departure} ${e.timetable.timeZone}`,e.description].filter(Boolean).join(`
|
|
2
|
+
`),t};export{n as tooltip};
|
|
3
|
+
//# sourceMappingURL=tooltip.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/tooltip.js"],
|
|
4
|
+
"sourcesContent": ["export const tooltip = ({ properties: p }) => {\n const content = document.createElement('div');\n content.style.whiteSpace = 'pre-line';\n content.textContent = [p.name, p.departure && `Departure ${p.departure} ${p.timetable.timeZone}`, p.description].filter(Boolean).join('\\n');\n return content;\n};\n"],
|
|
5
|
+
"mappings": "AAAO,MAAMA,EAAU,CAAC,CAAE,WAAYC,CAAE,IAAM,CAC5C,MAAMC,EAAU,SAAS,cAAc,KAAK,EAC5C,OAAAA,EAAQ,MAAM,WAAa,WAC3BA,EAAQ,YAAc,CAACD,EAAE,KAAMA,EAAE,WAAa,aAAaA,EAAE,SAAS,IAAIA,EAAE,UAAU,QAAQ,GAAIA,EAAE,WAAW,EAAE,OAAO,OAAO,EAAE,KAAK;AAAA,CAAI,EACnIC,CACT",
|
|
6
|
+
"names": ["tooltip", "p", "content"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import*as U from"./createMesh.js";import*as B from"./disposeMesh.js";import*as G from"./setHighlight.js";import*as _ from"./showFeature.js";import{update as P}from"./update.js";import{along as C}from"./along.js";import{build as E}from"./build.js";import{computeBounds as k}from"./computeBounds.js";import{routeGeometry as S}from"./routeGeometry.js";import{toLanes as z}from"./toLanes.js";import{tripsAt as R}from"./tripsAt.js";import{underEntry as q}from"./underEntry.js";import{getElevation as D}from"./getElevation.js";function x(e){let r={live:!0};return e.layer._map?.eachLayer(n=>{n.control?.time&&(r=n.control)}),{live:r.live,time:r.live?new Date:r.time}}function b(e,r,n,f,l=0){const u=U.createMesh(e.layer,r,f,l);return u.extras.featureFaces=n,u}function s(e,r){r&&(e.layer.highlightedFeature?.mesh===r&&(G.setHighlight(e.layer,null),e.layer.hoveredFeature=null,_.showFeature(e.layer,null)),B.disposeMesh(e.layer,r))}function T(e,r){e.status.textContent=`Error: ${r.message}`,e.status.setAttribute("role","alert"),console.error("Traffic layer",r)}function v(e){const{layer:r,lanes:n}=e,f=r._map._terrain3D?._terrainReady&&r._map._terrain3D,l=r.root.position[1];for(const u of n)u.points.forEach((i,o)=>{const p=f&&(u.elevation??D(f,u.latlngs[o]));i[2]=Number.isFinite(p)&&Number.isFinite(l)?p-l:0});e.lanesDirty=!0,e.nextCheck=-1/0}function I(e){const{layer:r,lanes:n}=e,f=r._map.options.crs,l=f.project(r.location),u=Math.cos(r.location.lat*Math.PI/180);for(const i of n){i.points=i.latlngs.map(([o,p])=>{const c=f.project(new L.LatLng(o,p));return[(c.x-l.x)*u,-(c.y-l.y)*u,0]}),i.lengths=[0];for(let o=1;o<i.points.length;o++)i.lengths.push(i.lengths[o-1]+Math.hypot(i.points[o][0]-i.points[o-1][0],i.points[o][1]-i.points[o-1][1]));i.length=i.lengths.at(-1)}v(e),s(e,e.route),e.route=null,e.tripsKey=null}function O(e){e.route=b(e,S(e.lanes),[],{emissive:[.03,.25,.3]})}function $(e){const{trips:r,model:n,vertices:f}=e;if(s(e,e.mesh),e.mesh=null,!r.length)return;const l=r.flatMap((i,o)=>E(n(o)).color),u=l.length/3;e.mesh=b(e,{position:l.map(()=>0),normal:l.map(()=>0),color:l},r.map((i,o)=>({id:i.id,properties:i.properties,faceStart:o*f/3,faceEnd:(o+1)*f/3,vertexStart:o*f,vertexEnd:(o+1)*f})),{},GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC),e.mesh.geometry.drawRange.count=u,w(e)}function w(e){const r={attributes:{position:{data:e.lanes.flatMap(n=>n.points.flatMap(([f,l,u])=>[f-20,u,l-20,f+20,u+5,l+20]))}}};k(r),e.mesh.geometry.bounds=r.bounds}function A(e){for(const r of[e.gpu?.params,e.gpu?.template,e.gpu?.points,e.gpu?.vehicles])r?.destroy();e.gpu=null}function y(e,r){const n=e.createBuffer({size:Math.max(16,r.byteLength),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});return e.queue.writeBuffer(n,0,r),n}function K(e){const{device:r}=e.layer.renderer;if(e.gpu?.device!==r&&(A(e),e.gpu={device:r,pipeline:r.createComputePipeline({layout:"auto",compute:{module:r.createShaderModule({code:e.shader}),entryPoint:"main"}}),params:r.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),template:y(r,new Float32Array([...e.template.position,...e.template.normal]))},e.lanesDirty=!0),e.lanesDirty){const i=new Float32Array(e.lanes.reduce((p,c)=>p+c.points.length,0)*4);let o=0;for(const p of e.lanes)p.start=o/4,p.points.forEach((c,a)=>{i.set([c[0],c[1],c[2],p.lengths[a]],o),o+=4});e.gpu.points?.destroy(),e.gpu.points=y(r,i),e.lanesDirty=!1}const n=new Float32Array(e.trips.length*4),f=new Uint32Array(n.buffer);e.trips.forEach((i,o)=>{f[o*4]=i.lane.start,f[o*4+1]=i.lane.points.length,n[o*4+2]=i.distance,n[o*4+3]=i.speed,e.mesh.extras.featureFaces[o].properties=i.properties}),e.gpu.vehicles?.size>=n.byteLength?r.queue.writeBuffer(e.gpu.vehicles,0,n):(e.gpu.vehicles?.destroy(),e.gpu.vehicles=y(r,n));const{position:l,normal:u}=e.mesh.geometry.attributes;e.gpu.bindGroup=r.createBindGroup({layout:e.gpu.pipeline.getBindGroupLayout(0),entries:[e.gpu.params,e.gpu.template,e.gpu.points,e.gpu.vehicles,l.buffer,u.buffer].map((i,o)=>({binding:o,resource:{buffer:i}}))})}function N(e,r){const{device:n}=e.gpu;e.paramFloats[0]=e.elapsed=r,e.paramFloats[1]=e.side,e.paramInts[2]=e.vertices,e.paramInts[3]=e.trips.length*e.vertices,n.queue.writeBuffer(e.gpu.params,0,e.params);const f=n.createCommandEncoder(),l=f.beginComputePass();l.setPipeline(e.gpu.pipeline),l.setBindGroup(0,e.gpu.bindGroup),l.dispatchWorkgroups(Math.ceil(e.paramInts[3]/64)),l.end(),n.queue.submit([f.finish()]),e.stale=!0}function F(e,r){const{points:n,lengths:f,length:l}=r.lane;let u=r.distance+e.elapsed*r.speed;u-=l*Math.floor(u/l);const{x:i,y:o,z:p,dx:c,dz:a}=C(n,f,u);return{x:i-a*e.side,y:o,z:p+c*e.side,dx:c,dz:a}}function ie(e){if(!e.mesh||!e.stale)return;e.stale=!1;const{position:r,normal:n}=e.mesh.geometry.attributes;e.trips.forEach((f,l)=>{const{x:u,y:i,z:o,dx:p,dz:c}=F(e,f);for(let a=0,m=l*e.stride;a<e.stride;a+=3,m+=3){const t=e.template.position[a],h=e.template.position[a+2],d=e.template.normal[a],g=e.template.normal[a+2];r.data[m]=u-t*c-h*p,r.data[m+1]=i+e.template.position[a+1],r.data[m+2]=o+t*p-h*c,n.data[m]=-d*c-g*p,n.data[m+1]=e.template.normal[a+1],n.data[m+2]=d*p-g*c}})}function le(e){if(e.frame=void 0,!e.ready||!e.layer._map)return;if(!e.layer.renderer){e.frame=requestAnimationFrame(e.tick);return}e.mesh&&!(e.mesh.geometry.attributes.position.buffer.usage&GPUBufferUsage.STORAGE)&&(e.tripsKey=null,e.nextCheck=-1/0);const{live:r,time:n}=x(e),f=n?.getTime(),l=Number.isFinite(f);let u=!1;if(!r||!l||!(f>=e.rebasedAt&&f<e.nextCheck)){let i;try{e.trips=l?R(n,e.lanes,e.velocity):[],i=l?e.loaded?`${e.trips.length} vehicle${e.trips.length===1?"":"s"}${e.loaded.note?` \xB7 ${e.loaded.note}`:""}`:"Loading\u2026":"Select a valid simulation date"}catch(p){return T(e,p)}e.rebasedAt=f,e.nextCheck=f+1e3;const o=e.trips.map(p=>p.id).join();u=o!==e.tripsKey||e.outline&&!e.route&&e.lanes.length,e.outline&&!e.route&&e.lanes.length&&O(e),o!==e.tripsKey&&($(e),e.tripsKey=o),e.mesh&&K(e),e.status.textContent!==i&&(e.status.textContent=i),e.status.removeAttribute("role")}e.mesh&&N(e,(f-e.rebasedAt)/1e3),e.mesh&&e.lights&&(!r||!(performance.now()-e.litAt<100))&&(e.litAt=performance.now(),e.mesh.extras.lights=e.trips.flatMap(i=>{const{x:o,y:p,z:c,dx:a,dz:m}=F(e,i);return e.lights.map(({position:[t,h,d],...g})=>({...g,position:[o-t*m-d*a,p+h,c+t*a-d*m]}))})),(e.mesh||u)&&P(e.layer),r&&l&&(e.frame=requestAnimationFrame(e.tick))}async function j(e,r,n){const f=new URL(e.url,document.baseURI).href;if(/\.m?js(?:[?#]|$)/i.test(e.url))return(await import(f)).default(r,e.layer,n);if(!e.file){const l=await fetch(f,{signal:n});if(!l.ok)throw new Error(`HTTP ${l.status}`);e.file=await l.json()}return e.file}function H(e,r,n){r.aborted||!e.layer._map||n===e.loaded||(e.loaded=n,e.lanes=z(n),I(e),e.frame||e.tick())}function Y(e,r){r.name!=="AbortError"&&T(e,r)}function W(e){const{time:r}=x(e);if(!Number.isFinite(r?.getTime()))return;e.request?.abort();const{signal:n}=e.request=new AbortController;j(e,r,n).then(H.bind(null,e,n),Y.bind(null,e))}function fe(e,r){r?.layer!==e.layer&&(cancelAnimationFrame(e.frame),W(e),e.tick())}function ue(e){e.lanes.length&&(v(e),s(e,e.route),e.route=null,e.mesh&&w(e),e.frame||e.tick())}function M(e){e.layer._map.off("simulationtimechange layerremove",e.update).on("simulationtimechange layerremove",e.update),e.layer._map.off("terrainchange",e.terrain).on("terrainchange",e.terrain),q(e.layer,e.status),e.update()}function pe(e){e.ready=!0,e.layer._map&&M(e)}function ce(e){e.ready&&M(e)}function ae(e){e.request?.abort(),cancelAnimationFrame(e.frame),e.frame=void 0,e.layer._map.off("simulationtimechange layerremove",e.update).off("terrainchange",e.terrain),s(e,e.mesh),s(e,e.route),e.mesh=e.route=null,delete e.layer._beforeRaycast,A(e),e.lanes=[],e.trips=[],e.tripsKey=e.loaded=null}export{ce as addTraffic,b as createTrafficMesh,A as destroyTrafficGpu,s as disposeTrafficObject,O as drawTrafficRoute,T as failTraffic,Y as failedTrafficLoad,j as fetchTrafficLanes,v as groundTraffic,W as loadTraffic,H as loadedTrafficLanes,F as locateTraffic,N as moveTraffic,ie as placeTraffic,I as prepareTraffic,pe as readyTraffic,K as rebaseTraffic,$ as rebuildTrafficMesh,ae as removeTraffic,M as startTraffic,le as tickTraffic,w as trafficBounds,x as trafficNow,y as trafficStorage,fe as updateTraffic,ue as updateTrafficTerrain};
|
|
2
|
+
//# sourceMappingURL=traffic.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/traffic.js"],
|
|
4
|
+
"sourcesContent": ["import * as createMeshApi from './createMesh.js';\r\nimport * as disposeMesh from './disposeMesh.js';\r\nimport * as setHighlight from './setHighlight.js';\r\nimport * as showFeature from './showFeature.js';\r\nimport { update as updateScene } from './update.js';\r\nimport { along } from './along.js';\r\nimport { build } from './build.js';\r\nimport { computeBounds } from './computeBounds.js';\r\nimport { routeGeometry } from './routeGeometry.js';\r\nimport { toLanes } from './toLanes.js';\r\nimport { tripsAt } from './tripsAt.js';\r\nimport { underEntry } from './underEntry.js';\r\nimport { getElevation } from './getElevation.js';\r\n\r\nexport function trafficNow(state) {\r\n let control = { live: true };\r\n state.layer._map?.eachLayer(other => { if (other.control?.time) control = other.control; });\r\n return { live: control.live, time: control.live ? new Date() : control.time };\r\n}\r\n\r\nexport function createTrafficMesh(state, data, featureFaces, material, usage = 0) {\r\n const result = createMeshApi.createMesh(state.layer, data, material, usage);\r\n result.extras.featureFaces = featureFaces;\r\n return result;\r\n}\r\n\r\nexport function disposeTrafficObject(state, object) {\r\n if (!object) return;\r\n if (state.layer.highlightedFeature?.mesh === object) {\r\n setHighlight.setHighlight(state.layer, null);\r\n state.layer.hoveredFeature = null;\r\n showFeature.showFeature(state.layer, null);\r\n };\r\n disposeMesh.disposeMesh(state.layer, object);\r\n}\r\n\r\nexport function failTraffic(state, error) {\r\n state.status.textContent = `Error: ${error.message}`;\r\n state.status.setAttribute('role', 'alert');\r\n console.error('Traffic layer', error);\r\n}\r\n\r\nexport function groundTraffic(state) {\r\n const { layer, lanes } = state;\r\n const terrain = layer._map._terrain3D?._terrainReady && layer._map._terrain3D, base = layer.root.position[1];\r\n for (const lane of lanes) lane.points.forEach((point, i) => {\r\n const elevation = terrain && (lane.elevation ?? getElevation(terrain, lane.latlngs[i]));\r\n point[2] = Number.isFinite(elevation) && Number.isFinite(base) ? elevation - base : 0;\r\n });\r\n state.lanesDirty = true;\r\n state.nextCheck = -Infinity;\r\n}\r\n\r\nexport function prepareTraffic(state) {\r\n const { layer, lanes } = state;\r\n const crs = layer._map.options.crs, origin = crs.project(layer.location);\r\n const metres = Math.cos(layer.location.lat * Math.PI / 180);\r\n for (const lane of lanes) {\r\n lane.points = lane.latlngs.map(([lat, lng]) => {\r\n const point = crs.project(new L.LatLng(lat, lng));\r\n return [(point.x - origin.x) * metres, -(point.y - origin.y) * metres, 0];\r\n });\r\n lane.lengths = [0];\r\n for (let i = 1; i < lane.points.length; i++) {\r\n lane.lengths.push(lane.lengths[i - 1] + Math.hypot(lane.points[i][0] - lane.points[i - 1][0], lane.points[i][1] - lane.points[i - 1][1]));\r\n }\r\n lane.length = lane.lengths.at(-1);\r\n }\r\n groundTraffic(state);\r\n disposeTrafficObject(state, state.route);\r\n state.route = null;\r\n state.tripsKey = null;\r\n}\r\n\r\nexport function drawTrafficRoute(state) {\r\n state.route = createTrafficMesh(state, routeGeometry(state.lanes), [], { emissive: [0.03, 0.25, 0.3] });\r\n}\r\n\r\nexport function rebuildTrafficMesh(state) {\r\n const { trips, model, vertices } = state;\r\n disposeTrafficObject(state, state.mesh);\r\n state.mesh = null;\r\n if (!trips.length) return;\r\n const color = trips.flatMap((trip, i) => build(model(i)).color), count = color.length / 3;\r\n state.mesh = createTrafficMesh(state, { position: color.map(() => 0), normal: color.map(() => 0), color },\r\n trips.map((trip, i) => ({\r\n id: trip.id, properties: trip.properties, faceStart: i * vertices / 3, faceEnd: (i + 1) * vertices / 3,\r\n vertexStart: i * vertices, vertexEnd: (i + 1) * vertices\r\n })), {}, GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC);\r\n state.mesh.geometry.drawRange.count = count;\r\n trafficBounds(state);\r\n}\r\n\r\nexport function trafficBounds(state) {\r\n const extent = { attributes: { position: { data: state.lanes.flatMap(lane => lane.points.flatMap(([x, z, y]) => [x - 20, y, z - 20, x + 20, y + 5, z + 20])) } } };\r\n computeBounds(extent);\r\n state.mesh.geometry.bounds = extent.bounds;\r\n}\r\n\r\nexport function destroyTrafficGpu(state) {\r\n for (const buffer of [state.gpu?.params, state.gpu?.template, state.gpu?.points, state.gpu?.vehicles]) buffer?.destroy();\r\n state.gpu = null;\r\n}\r\n\r\nexport function trafficStorage(device, data) {\r\n const buffer = device.createBuffer({ size: Math.max(16, data.byteLength), usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST });\r\n device.queue.writeBuffer(buffer, 0, data);\r\n return buffer;\r\n}\r\n\r\nexport function rebaseTraffic(state) {\r\n const { device } = state.layer.renderer;\r\n if (state.gpu?.device !== device) {\r\n destroyTrafficGpu(state);\r\n state.gpu = {\r\n device,\r\n pipeline: device.createComputePipeline({ layout: 'auto', compute: { module: device.createShaderModule({ code: state.shader }), entryPoint: 'main' } }),\r\n params: device.createBuffer({ size: 16, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST }),\r\n template: trafficStorage(device, new Float32Array([...state.template.position, ...state.template.normal])),\r\n };\r\n state.lanesDirty = true;\r\n }\r\n if (state.lanesDirty) {\r\n const data = new Float32Array(state.lanes.reduce((count, lane) => count + lane.points.length, 0) * 4);\r\n let offset = 0;\r\n for (const lane of state.lanes) {\r\n lane.start = offset / 4;\r\n lane.points.forEach((point, i) => { data.set([point[0], point[1], point[2], lane.lengths[i]], offset); offset += 4; });\r\n }\r\n state.gpu.points?.destroy();\r\n state.gpu.points = trafficStorage(device, data);\r\n state.lanesDirty = false;\r\n }\r\n const data = new Float32Array(state.trips.length * 4), index = new Uint32Array(data.buffer);\r\n state.trips.forEach((trip, i) => {\r\n index[i * 4] = trip.lane.start;\r\n index[i * 4 + 1] = trip.lane.points.length;\r\n data[i * 4 + 2] = trip.distance;\r\n data[i * 4 + 3] = trip.speed;\r\n state.mesh.extras.featureFaces[i].properties = trip.properties;\r\n });\r\n if (state.gpu.vehicles?.size >= data.byteLength) device.queue.writeBuffer(state.gpu.vehicles, 0, data);\r\n else {\r\n state.gpu.vehicles?.destroy();\r\n state.gpu.vehicles = trafficStorage(device, data);\r\n }\r\n const { position, normal } = state.mesh.geometry.attributes;\r\n state.gpu.bindGroup = device.createBindGroup({\r\n layout: state.gpu.pipeline.getBindGroupLayout(0),\r\n entries: [state.gpu.params, state.gpu.template, state.gpu.points, state.gpu.vehicles, position.buffer, normal.buffer]\r\n .map((buffer, binding) => ({ binding, resource: { buffer } })),\r\n });\r\n}\r\n\r\nexport function moveTraffic(state, seconds) {\r\n const { device } = state.gpu;\r\n state.paramFloats[0] = state.elapsed = seconds;\r\n state.paramFloats[1] = state.side;\r\n state.paramInts[2] = state.vertices;\r\n state.paramInts[3] = state.trips.length * state.vertices;\r\n device.queue.writeBuffer(state.gpu.params, 0, state.params);\r\n const encoder = device.createCommandEncoder(), pass = encoder.beginComputePass();\r\n pass.setPipeline(state.gpu.pipeline);\r\n pass.setBindGroup(0, state.gpu.bindGroup);\r\n pass.dispatchWorkgroups(Math.ceil(state.paramInts[3] / 64));\r\n pass.end();\r\n device.queue.submit([encoder.finish()]);\r\n state.stale = true;\r\n}\r\n\r\nexport function locateTraffic(state, trip) {\r\n const { points, lengths, length } = trip.lane;\r\n let distance = trip.distance + state.elapsed * trip.speed;\r\n distance -= length * Math.floor(distance / length);\r\n const { x, y, z, dx, dz } = along(points, lengths, distance);\r\n return { x: x - dz * state.side, y, z: z + dx * state.side, dx, dz };\r\n}\r\n\r\nexport function placeTraffic(state) {\r\n if (!state.mesh || !state.stale) return;\r\n state.stale = false;\r\n const { position, normal } = state.mesh.geometry.attributes;\r\n state.trips.forEach((trip, i) => {\r\n const { x: cx, y, z: cz, dx, dz } = locateTraffic(state, trip);\r\n for (let k = 0, o = i * state.stride; k < state.stride; k += 3, o += 3) {\r\n const lx = state.template.position[k], lz = state.template.position[k + 2], nx = state.template.normal[k], nz = state.template.normal[k + 2];\r\n position.data[o] = cx - lx * dz - lz * dx;\r\n position.data[o + 1] = y + state.template.position[k + 1];\r\n position.data[o + 2] = cz + lx * dx - lz * dz;\r\n normal.data[o] = -nx * dz - nz * dx;\r\n normal.data[o + 1] = state.template.normal[k + 1];\r\n normal.data[o + 2] = nx * dx - nz * dz;\r\n }\r\n });\r\n}\r\n\r\nexport function tickTraffic(state) {\r\n state.frame = undefined;\r\n if (!state.ready || !state.layer._map) return;\r\n if (!state.layer.renderer) { state.frame = requestAnimationFrame(state.tick); return; }\r\n if (state.mesh && !(state.mesh.geometry.attributes.position.buffer.usage & GPUBufferUsage.STORAGE)) {\r\n state.tripsKey = null;\r\n state.nextCheck = -Infinity;\r\n }\r\n const { live, time } = trafficNow(state), ms = time?.getTime(), valid = Number.isFinite(ms);\r\n let changed = false;\r\n if (!live || !valid || !(ms >= state.rebasedAt && ms < state.nextCheck)) {\r\n let text;\r\n try {\r\n state.trips = valid ? tripsAt(time, state.lanes, state.velocity) : [];\r\n text = !valid ? 'Select a valid simulation date' : !state.loaded ? 'Loading\u2026' :\r\n `${state.trips.length} vehicle${state.trips.length === 1 ? '' : 's'}${state.loaded.note ? ` \u00B7 ${state.loaded.note}` : ''}`;\r\n } catch (error) { return failTraffic(state, error); }\r\n state.rebasedAt = ms;\r\n state.nextCheck = ms + 1000;\r\n const key = state.trips.map(trip => trip.id).join();\r\n changed = key !== state.tripsKey || (state.outline && !state.route && state.lanes.length);\r\n if (state.outline && !state.route && state.lanes.length) drawTrafficRoute(state);\r\n if (key !== state.tripsKey) { rebuildTrafficMesh(state); state.tripsKey = key; }\r\n if (state.mesh) rebaseTraffic(state);\r\n if (state.status.textContent !== text) state.status.textContent = text;\r\n state.status.removeAttribute('role');\r\n }\r\n if (state.mesh) moveTraffic(state, (ms - state.rebasedAt) / 1000);\r\n if (state.mesh && state.lights && (!live || !(performance.now() - state.litAt < 100))) {\r\n state.litAt = performance.now();\r\n state.mesh.extras.lights = state.trips.flatMap(trip => {\r\n const { x, y, z, dx, dz } = locateTraffic(state, trip);\r\n return state.lights.map(({ position: [lx, ly, lz], ...light }) => ({ ...light, position: [x - lx * dz - lz * dx, y + ly, z + lx * dx - lz * dz] }));\r\n });\r\n }\r\n if (state.mesh || changed) updateScene(state.layer);\r\n if (live && valid) state.frame = requestAnimationFrame(state.tick);\r\n}\r\n\r\nexport async function fetchTrafficLanes(state, time, signal) {\r\n const href = new URL(state.url, document.baseURI).href;\r\n if (/\\.m?js(?:[?#]|$)/i.test(state.url)) return (await import(href)).default(time, state.layer, signal);\r\n if (!state.file) {\r\n const response = await fetch(href, { signal });\r\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\r\n state.file = await response.json();\r\n }\r\n return state.file;\r\n}\r\n\r\nexport function loadedTrafficLanes(state, signal, data) {\r\n if (signal.aborted || !state.layer._map || data === state.loaded) return;\r\n state.loaded = data;\r\n state.lanes = toLanes(data);\r\n prepareTraffic(state);\r\n if (!state.frame) state.tick();\r\n}\r\n\r\nexport function failedTrafficLoad(state, error) {\r\n if (error.name !== 'AbortError') failTraffic(state, error);\r\n}\r\n\r\nexport function loadTraffic(state) {\r\n const { time } = trafficNow(state);\r\n if (!Number.isFinite(time?.getTime())) return;\r\n state.request?.abort();\r\n const { signal } = state.request = new AbortController();\r\n fetchTrafficLanes(state, time, signal).then(\r\n loadedTrafficLanes.bind(null, state, signal),\r\n failedTrafficLoad.bind(null, state),\r\n );\r\n}\r\n\r\nexport function updateTraffic(state, event) {\r\n if (event?.layer === state.layer) return;\r\n cancelAnimationFrame(state.frame);\r\n loadTraffic(state);\r\n state.tick();\r\n}\r\n\r\nexport function updateTrafficTerrain(state) {\r\n if (!state.lanes.length) return;\r\n groundTraffic(state);\r\n disposeTrafficObject(state, state.route);\r\n state.route = null;\r\n if (state.mesh) trafficBounds(state);\r\n if (!state.frame) state.tick();\r\n}\r\n\r\nexport function startTraffic(state) {\r\n state.layer._map.off('simulationtimechange layerremove', state.update).on('simulationtimechange layerremove', state.update);\r\n state.layer._map.off('terrainchange', state.terrain).on('terrainchange', state.terrain);\r\n underEntry(state.layer, state.status);\r\n state.update();\r\n}\r\n\r\nexport function readyTraffic(state) {\r\n state.ready = true;\r\n if (state.layer._map) startTraffic(state);\r\n}\r\n\r\nexport function addTraffic(state) {\r\n if (state.ready) startTraffic(state);\r\n}\r\n\r\nexport function removeTraffic(state) {\r\n state.request?.abort();\r\n cancelAnimationFrame(state.frame);\r\n state.frame = undefined;\r\n state.layer._map.off('simulationtimechange layerremove', state.update).off('terrainchange', state.terrain);\r\n disposeTrafficObject(state, state.mesh);\r\n disposeTrafficObject(state, state.route);\r\n state.mesh = state.route = null;\r\n delete state.layer._beforeRaycast;\r\n destroyTrafficGpu(state);\r\n state.lanes = [];\r\n state.trips = [];\r\n state.tripsKey = state.loaded = null;\r\n}\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["createMeshApi", "disposeMesh", "setHighlight", "showFeature", "updateScene", "along", "build", "computeBounds", "routeGeometry", "toLanes", "tripsAt", "underEntry", "getElevation", "trafficNow", "state", "control", "other", "createTrafficMesh", "data", "featureFaces", "material", "usage", "result", "disposeTrafficObject", "object", "failTraffic", "error", "groundTraffic", "layer", "lanes", "terrain", "base", "lane", "point", "i", "elevation", "prepareTraffic", "crs", "origin", "metres", "lat", "lng", "drawTrafficRoute", "rebuildTrafficMesh", "trips", "model", "vertices", "color", "trip", "count", "trafficBounds", "extent", "x", "z", "y", "destroyTrafficGpu", "buffer", "trafficStorage", "device", "rebaseTraffic", "offset", "index", "position", "normal", "binding", "moveTraffic", "seconds", "encoder", "pass", "locateTraffic", "points", "lengths", "length", "distance", "dx", "dz", "placeTraffic", "cx", "cz", "k", "o", "lx", "lz", "nx", "nz", "tickTraffic", "live", "time", "ms", "valid", "changed", "text", "key", "ly", "light", "fetchTrafficLanes", "signal", "href", "response", "loadedTrafficLanes", "failedTrafficLoad", "loadTraffic", "updateTraffic", "event", "updateTrafficTerrain", "startTraffic", "readyTraffic", "addTraffic", "removeTraffic"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/traverse.js"],
|
|
4
|
+
"sourcesContent": ["/** Depth-first walk; a truthy callback result skips that node's descendants. */\n\nexport function traverse(node, callback) {\n if (callback(node)) return;\n for (const child of node.children) traverse(child, callback);\n}\n"],
|
|
5
|
+
"mappings": "AAEO,SAASA,EAASC,EAAMC,EAAU,CACvC,GAAI,CAAAA,EAASD,CAAI,EACjB,UAAWE,KAASF,EAAK,SAAUD,EAASG,EAAOD,CAAQ,CAC7D",
|
|
6
|
+
"names": ["traverse", "node", "callback", "child"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{parseColor as A}from"./parseColor.js";function F(h,m,p){const{top:f,bottom:I=0,trunkRadius:a,crownRadius:c,crownBottom:n,crownShape:k="round"}=m;if(![a,c,n].every(Number.isFinite)||a<=0||c<a||n<=I||n>=f||!["round","cone"].includes(k))throw new Error("Invalid tree dimensions or crown shape");const B=A(m.trunkColor??7491898),M=A(m.color??5210683),i=t=>Array.from({length:8},(o,r)=>({x:h.x+Math.cos(r*Math.PI/4)*t,y:h.y+Math.sin(r*Math.PI/4)*t,ground:h.ground})),x=(t,o,r,s,l)=>{const u=i(t),y=i(r);for(let e=0;e<8;e++){const b=(e+1)%8,P=(e+.5)*Math.PI/4,v=(t-r)/(s-o),w=Math.hypot(1,v),C=Math.cos(P)/w,g=v/w,z=-Math.sin(P)/w;t&&p(u[e],o,u[b],o,y[b],s,C,g,z,l),r&&p(u[e],o,y[b],s,y[e],s,C,g,z,l)}};if(x(a,I,a,n+(f-n)*.25,B),k==="cone"){const t=i(c);for(let o=0;o<8;o++)p(h,n,t[o],n,t[(o+1)%8],n,0,-1,0,M);x(c,n,0,f,M)}else{const t=[[0,0],[.35,.8],[.6,1],[.85,.7],[1,0]];for(let o=1;o<t.length;o++){const[r,s]=t[o-1],[l,u]=t[o];x(s*c,n+r*(f-n),u*c,n+l*(f-n),M)}}}export{F as treeGeometry};
|
|
2
|
+
//# sourceMappingURL=treeGeometry.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/treeGeometry.js"],
|
|
4
|
+
"sourcesContent": ["import { parseColor } from \"./parseColor.js\";\n\n/** Low-poly tree, sharing the source block's buffers, picking and terrain offset. */\n\nexport function treeGeometry(point, style, addTriangle) {\n const { top, bottom = 0, trunkRadius, crownRadius, crownBottom, crownShape = 'round' } = style;\n if (![trunkRadius, crownRadius, crownBottom].every(Number.isFinite) ||\n trunkRadius <= 0 || crownRadius < trunkRadius || crownBottom <= bottom || crownBottom >= top ||\n !['round', 'cone'].includes(crownShape)) {\n throw new Error('Invalid tree dimensions or crown shape');\n }\n const trunk = parseColor(style.trunkColor ?? 0x72513a);\n const crown = parseColor(style.color ?? 0x4f823b);\n const ring = radius => Array.from({ length: 8 }, (_, i) => ({\n x: point.x + Math.cos(i * Math.PI / 4) * radius,\n y: point.y + Math.sin(i * Math.PI / 4) * radius,\n ground: point.ground,\n }));\n const surface = (lowRadius, low, highRadius, high, color) => {\n const lower = ring(lowRadius), upper = ring(highRadius);\n for (let i = 0; i < 8; i++) {\n const next = (i + 1) % 8;\n const angle = (i + 0.5) * Math.PI / 4;\n const slope = (lowRadius - highRadius) / (high - low);\n const length = Math.hypot(1, slope);\n const nx = Math.cos(angle) / length, ny = slope / length, nz = -Math.sin(angle) / length;\n if (lowRadius) addTriangle(lower[i], low, lower[next], low, upper[next], high, nx, ny, nz, color);\n if (highRadius) addTriangle(lower[i], low, upper[next], high, upper[i], high, nx, ny, nz, color);\n }\n };\n surface(trunkRadius, bottom, trunkRadius, crownBottom + (top - crownBottom) * 0.25, trunk);\n if (crownShape === 'cone') {\n const base = ring(crownRadius);\n for (let i = 0; i < 8; i++) addTriangle(point, crownBottom, base[i], crownBottom,\n base[(i + 1) % 8], crownBottom, 0, -1, 0, crown);\n surface(crownRadius, crownBottom, 0, top, crown);\n } else {\n const profile = [[0, 0], [0.35, 0.8], [0.6, 1], [0.85, 0.7], [1, 0]];\n for (let i = 1; i < profile.length; i++) {\n const [low, lr] = profile[i - 1], [high, hr] = profile[i];\n surface(lr * crownRadius, crownBottom + low * (top - crownBottom),\n hr * crownRadius, crownBottom + high * (top - crownBottom), crown);\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,cAAAA,MAAkB,kBAIpB,SAASC,EAAaC,EAAOC,EAAOC,EAAa,CACtD,KAAM,CAAE,IAAAC,EAAK,OAAAC,EAAS,EAAG,YAAAC,EAAa,YAAAC,EAAa,YAAAC,EAAa,WAAAC,EAAa,OAAQ,EAAIP,EACzF,GAAI,CAAC,CAACI,EAAaC,EAAaC,CAAW,EAAE,MAAM,OAAO,QAAQ,GAChEF,GAAe,GAAKC,EAAcD,GAAeE,GAAeH,GAAUG,GAAeJ,GACzF,CAAC,CAAC,QAAS,MAAM,EAAE,SAASK,CAAU,EACtC,MAAM,IAAI,MAAM,wCAAwC,EAE1D,MAAMC,EAAQX,EAAWG,EAAM,YAAc,OAAQ,EAC/CS,EAAQZ,EAAWG,EAAM,OAAS,OAAQ,EAC1CU,EAAOC,GAAU,MAAM,KAAK,CAAE,OAAQ,CAAE,EAAG,CAACC,EAAGC,KAAO,CAC1D,EAAGd,EAAM,EAAI,KAAK,IAAIc,EAAI,KAAK,GAAK,CAAC,EAAIF,EACzC,EAAGZ,EAAM,EAAI,KAAK,IAAIc,EAAI,KAAK,GAAK,CAAC,EAAIF,EACzC,OAAQZ,EAAM,MAChB,EAAE,EACIe,EAAU,CAACC,EAAWC,EAAKC,EAAYC,EAAMC,IAAU,CAC3D,MAAMC,EAAQV,EAAKK,CAAS,EAAGM,EAAQX,EAAKO,CAAU,EACtD,QAASJ,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,MAAMS,GAAQT,EAAI,GAAK,EACjBU,GAASV,EAAI,IAAO,KAAK,GAAK,EAC9BW,GAAST,EAAYE,IAAeC,EAAOF,GAC3CS,EAAS,KAAK,MAAM,EAAGD,CAAK,EAC5BE,EAAK,KAAK,IAAIH,CAAK,EAAIE,EAAQE,EAAKH,EAAQC,EAAQG,EAAK,CAAC,KAAK,IAAIL,CAAK,EAAIE,EAC9EV,GAAWd,EAAYmB,EAAMP,CAAC,EAAGG,EAAKI,EAAME,CAAI,EAAGN,EAAKK,EAAMC,CAAI,EAAGJ,EAAMQ,EAAIC,EAAIC,EAAIT,CAAK,EAC5FF,GAAYhB,EAAYmB,EAAMP,CAAC,EAAGG,EAAKK,EAAMC,CAAI,EAAGJ,EAAMG,EAAMR,CAAC,EAAGK,EAAMQ,EAAIC,EAAIC,EAAIT,CAAK,CACjG,CACF,EAEA,GADAL,EAAQV,EAAaD,EAAQC,EAAaE,GAAeJ,EAAMI,GAAe,IAAME,CAAK,EACrFD,IAAe,OAAQ,CACzB,MAAMsB,EAAOnB,EAAKL,CAAW,EAC7B,QAASQ,EAAI,EAAGA,EAAI,EAAGA,IAAKZ,EAAYF,EAAOO,EAAauB,EAAKhB,CAAC,EAAGP,EACnEuB,GAAMhB,EAAI,GAAK,CAAC,EAAGP,EAAa,EAAG,GAAI,EAAGG,CAAK,EACjDK,EAAQT,EAAaC,EAAa,EAAGJ,EAAKO,CAAK,CACjD,KAAO,CACL,MAAMqB,EAAU,CAAC,CAAC,EAAG,CAAC,EAAG,CAAC,IAAM,EAAG,EAAG,CAAC,GAAK,CAAC,EAAG,CAAC,IAAM,EAAG,EAAG,CAAC,EAAG,CAAC,CAAC,EACnE,QAASjB,EAAI,EAAGA,EAAIiB,EAAQ,OAAQjB,IAAK,CACvC,KAAM,CAACG,EAAKe,CAAE,EAAID,EAAQjB,EAAI,CAAC,EAAG,CAACK,EAAMc,CAAE,EAAIF,EAAQjB,CAAC,EACxDC,EAAQiB,EAAK1B,EAAaC,EAAcU,GAAOd,EAAMI,GACnD0B,EAAK3B,EAAaC,EAAcY,GAAQhB,EAAMI,GAAcG,CAAK,CACrE,CACF,CACF",
|
|
6
|
+
"names": ["parseColor", "treeGeometry", "point", "style", "addTriangle", "top", "bottom", "trunkRadius", "crownRadius", "crownBottom", "crownShape", "trunk", "crown", "ring", "radius", "_", "i", "surface", "lowRadius", "low", "highRadius", "high", "color", "lower", "upper", "next", "angle", "slope", "length", "nx", "ny", "nz", "base", "profile", "lr", "hr"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{isClockWise as N}from"./isClockWise.js";function j(g,M=[]){const p=[g,...M].flat();if(p.some(e=>!Number.isFinite(e.x)||!Number.isFinite(e.y)))throw new Error("Invalid polygon coordinates");const b=p.map((e,t)=>({x:e.x-g[0].x,y:e.y-g[0].y,index:t})),c=(e,t,n)=>(t.x-e.x)*(n.y-e.y)-(t.y-e.y)*(n.x-e.x),x=(e,t)=>e.x===t.x&&e.y===t.y,B=e=>{let t=!0;for(;t&&e.length>3;){t=!1;for(let n=0;n<e.length;n++){const o=e[(n+e.length-1)%e.length],s=e[n],l=e[(n+1)%e.length];if(x(o,s)||Math.abs(c(o,s,l))<1e-10){e.splice(n,1),t=!0;break}}}if(e.length<3)throw new Error("Degenerate polygon ring");return e};let E=0;const f=[g,...M].map((e,t)=>{const n=B(b.slice(E,E+=e.length));return N(n)!==!!t&&n.reverse(),n}),v=(e,t)=>{let n=!1;for(let o=0,s=t.length-1;o<t.length;s=o++){const l=t[o],r=t[s];l.y>e.y!=r.y>e.y&&e.x<(r.x-l.x)*(e.y-l.y)/(r.y-l.y)+l.x&&(n=!n)}return n},C=(e,t,n,o)=>{if(x(e,n)||x(e,o)||x(t,n)||x(t,o))return!1;const s=c(e,t,n),l=c(e,t,o),r=c(n,o,e),y=c(n,o,t),a=(u,m,h)=>Math.min(u.x,m.x)<=h.x&&h.x<=Math.max(u.x,m.x)&&Math.min(u.y,m.y)<=h.y&&h.y<=Math.max(u.y,m.y);return s*l<0&&r*y<0||s===0&&a(e,t,n)||l===0&&a(e,t,o)||r===0&&a(n,o,e)||y===0&&a(n,o,t)};let i=f[0].slice();for(const e of f.slice(1).sort((t,n)=>Math.min(...t.map(o=>o.x))-Math.min(...n.map(o=>o.x)))){let t,n=1/0;for(let l=0;l<e.length;l++)for(let r=0;r<i.length;r++){const y=e[l],a=i[r],u=(y.x-a.x)**2+(y.y-a.y)**2;if(u>=n)continue;const m={x:(y.x+a.x)/2,y:(y.y+a.y)/2};!v(m,f[0])||f.slice(1).some(h=>v(m,h))||[i,...f.slice(1)].some(h=>h.some((F,I)=>C(y,a,F,h[(I+1)%h.length])))||(t=[l,r],n=u)}if(!t)throw new Error("Unable to connect polygon hole");const[o,s]=t;i=[...i.slice(0,s+1),...e.slice(o),...e.slice(0,o+1),i[s],...i.slice(s+1)]}const d=[];for(;i.length>3;){let e=!1;for(let t=0;t<i.length;t++){const n=i[(t+i.length-1)%i.length],o=i[t],s=i[(t+1)%i.length];if(!(c(n,o,s)<=1e-10)&&!i.some(l=>!x(l,n)&&!x(l,o)&&!x(l,s)&&c(n,o,l)>=0&&c(o,s,l)>=0&&c(s,n,l)>=0)){d.push([n.index,o.index,s.index]),i.splice(t,1),e=!0;break}}if(!e)throw new Error("Unable to triangulate polygon: invalid or self-intersecting rings")}c(...i)>1e-10&&d.push(i.map(e=>e.index));const k=e=>Math.abs(e.reduce((t,n,o)=>{const s=e[(o+1)%e.length];return t+n.x*s.y-s.x*n.y},0))/2,w=k(f[0])-f.slice(1).reduce((e,t)=>e+k(t),0),D=d.reduce((e,t)=>e+c(...t.map(n=>b[n]))/2,0);if(w<=0||Math.abs(D-w)>Math.max(1e-7,w*1e-8))throw new Error("Polygon triangulation area mismatch");return d}export{j as triangulate};
|
|
2
|
+
//# sourceMappingURL=triangulate.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/triangulate.js"],
|
|
4
|
+
"sourcesContent": ["import { isClockWise } from \"./isClockWise.js\";\n\n/**\n * Triangulates a polygon given as `{x, y}` points.\n * Rings omit the repeated closing point; winding is normalized internally.\n * Vertex indices remain relative to the original inputs after duplicate/collinear\n * cleanup. Hole bridges duplicate endpoints, not source vertices.\n * @param {Object[]} contour Outer boundary.\n * @param {Object[][]} [holes] Interior boundaries.\n *\n * @returns {number[][]} Triangles as indices in `[...contour, ...holes.flat()]`.\n */\n\nexport function triangulate(contour, holes = []) {\n const points = [contour, ...holes].flat();\n if (points.some(p => !Number.isFinite(p.x) || !Number.isFinite(p.y))) throw new Error('Invalid polygon coordinates');\n // Translate near the origin to avoid cancellation with geographic coordinates.\n const vertices = points.map((p, index) => ({ x: p.x - contour[0].x, y: p.y - contour[0].y, index }));\n const cross = (a, b, c) => (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);\n const equal = (a, b) => a.x === b.x && a.y === b.y;\n // Remove zero-area corners before connecting holes; keep original vertex indices.\n const clean = ring => {\n let changed = true;\n while (changed && ring.length > 3) {\n changed = false;\n for (let i = 0; i < ring.length; i++) {\n const a = ring[(i + ring.length - 1) % ring.length], b = ring[i], c = ring[(i + 1) % ring.length];\n if (equal(a, b) || Math.abs(cross(a, b, c)) < 1e-10) {\n ring.splice(i, 1); changed = true; break;\n }\n }\n }\n if (ring.length < 3) throw new Error('Degenerate polygon ring');\n return ring;\n };\n let offset = 0;\n const rings = [contour, ...holes].map((path, index) => {\n const ring = clean(vertices.slice(offset, offset += path.length));\n if (isClockWise(ring) !== Boolean(index)) ring.reverse();\n return ring;\n });\n const inside = (point, ring) => {\n let result = false;\n for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {\n const a = ring[i], b = ring[j];\n if ((a.y > point.y) !== (b.y > point.y) &&\n point.x < (b.x - a.x) * (point.y - a.y) / (b.y - a.y) + a.x) result = !result;\n }\n return result;\n };\n const intersects = (a, b, c, d) => {\n if (equal(a, c) || equal(a, d) || equal(b, c) || equal(b, d)) return false;\n const abC = cross(a, b, c), abD = cross(a, b, d), cdA = cross(c, d, a), cdB = cross(c, d, b);\n const on = (p, q, r) => Math.min(p.x, q.x) <= r.x && r.x <= Math.max(p.x, q.x) &&\n Math.min(p.y, q.y) <= r.y && r.y <= Math.max(p.y, q.y);\n return abC * abD < 0 && cdA * cdB < 0 ||\n abC === 0 && on(a, b, c) || abD === 0 && on(a, b, d) ||\n cdA === 0 && on(c, d, a) || cdB === 0 && on(c, d, b);\n };\n let polygon = rings[0].slice();\n // A bridge must stay inside the outer boundary, outside every hole, and cross no edge.\n // ponytail: quadratic ear clipping for building footprints; use spatial indexing for large rings.\n for (const hole of rings.slice(1).sort((a, b) => Math.min(...a.map(p => p.x)) - Math.min(...b.map(p => p.x)))) {\n let bridge, distance = Infinity;\n for (let h = 0; h < hole.length; h++) for (let p = 0; p < polygon.length; p++) {\n const a = hole[h], b = polygon[p], d = (a.x - b.x) ** 2 + (a.y - b.y) ** 2;\n if (d >= distance) continue;\n const mid = { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n if (!inside(mid, rings[0]) || rings.slice(1).some(r => inside(mid, r))) continue;\n if ([polygon, ...rings.slice(1)].some(r => r.some((c, i) => intersects(a, b, c, r[(i + 1) % r.length])))) continue;\n bridge = [h, p]; distance = d;\n }\n if (!bridge) throw new Error('Unable to connect polygon hole');\n const [h, p] = bridge;\n polygon = [...polygon.slice(0, p + 1), ...hole.slice(h), ...hole.slice(0, h + 1),\n polygon[p], ...polygon.slice(p + 1)];\n }\n // Clip a convex corner only when no other vertex is inside/on its triangle.\n const result = [];\n while (polygon.length > 3) {\n let clipped = false;\n for (let i = 0; i < polygon.length; i++) {\n const a = polygon[(i + polygon.length - 1) % polygon.length], b = polygon[i], c = polygon[(i + 1) % polygon.length];\n if (cross(a, b, c) <= 1e-10) continue;\n if (polygon.some(p => !equal(p, a) && !equal(p, b) && !equal(p, c) &&\n cross(a, b, p) >= 0 && cross(b, c, p) >= 0 && cross(c, a, p) >= 0)) continue;\n result.push([a.index, b.index, c.index]); polygon.splice(i, 1); clipped = true; break;\n }\n if (!clipped) throw new Error('Unable to triangulate polygon: invalid or self-intersecting rings');\n }\n if (cross(...polygon) > 1e-10) result.push(polygon.map(p => p.index));\n const area = ring => Math.abs(ring.reduce((sum, p, i) => {\n const q = ring[(i + 1) % ring.length]; return sum + p.x * q.y - q.x * p.y;\n }, 0)) / 2;\n // Reject incomplete coverage instead of silently emitting a partial roof.\n const expected = area(rings[0]) - rings.slice(1).reduce((sum, ring) => sum + area(ring), 0);\n const actual = result.reduce((sum, triangle) => sum + cross(...triangle.map(i => vertices[i])) / 2, 0);\n if (expected <= 0 || Math.abs(actual - expected) > Math.max(1e-7, expected * 1e-8)) throw new Error('Polygon triangulation area mismatch');\n return result;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["isClockWise", "triangulate", "contour", "holes", "points", "p", "vertices", "index", "cross", "a", "b", "c", "equal", "clean", "ring", "changed", "i", "offset", "rings", "path", "inside", "point", "result", "j", "intersects", "d", "abC", "abD", "cdA", "cdB", "on", "q", "r", "polygon", "hole", "bridge", "distance", "h", "mid", "clipped", "area", "sum", "expected", "actual", "triangle"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{vehicleOffsets as u}from"./vehicleOffsets.js";import{scheduledTrips as g}from"./scheduledTrips.js";const n=(s,i,t)=>i.flatMap((r,o)=>{const{timetable:p,flow:d=0}=r.properties;if(!r.length)return[];if(p)return g(s,p).map(e=>({id:`${o}-${e.id}`,lane:r,distance:e.progress*r.length,speed:r.length/(p.duration*60),properties:{...r.properties,departure:e.departure}}));const f=s/1e3*t;return(r.offsets||=u(r.length,d,t)).map((e,h)=>({id:`${o}-${h}`,lane:r,distance:(e+f)%r.length,speed:t,properties:r.properties}))});export{n as tripsAt};
|
|
2
|
+
//# sourceMappingURL=tripsAt.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/tripsAt.js"],
|
|
4
|
+
"sourcesContent": ["import { vehicleOffsets } from \"./vehicleOffsets.js\";\nimport { scheduledTrips } from \"./scheduledTrips.js\";\n\n// A lane with a `timetable` runs scheduled trips end to end; one with a `flow` (vehicles/h) loops evenly spaced vehicles.\n\nexport const tripsAt = (time, lanes, velocity) => lanes.flatMap((lane, l) => {\n const { timetable, flow = 0 } = lane.properties;\n if (!lane.length) return [];\n if (timetable) return scheduledTrips(time, timetable).map(trip => ({\n id: `${l}-${trip.id}`, lane, distance: trip.progress * lane.length, speed: lane.length / (timetable.duration * 60),\n properties: { ...lane.properties, departure: trip.departure },\n }));\n const travelled = time / 1000 * velocity;\n return (lane.offsets ||= vehicleOffsets(lane.length, flow, velocity))\n .map((offset, k) => ({ id: `${l}-${k}`, lane, distance: (offset + travelled) % lane.length, speed: velocity, properties: lane.properties }));\n});\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,kBAAAA,MAAsB,sBAC/B,OAAS,kBAAAC,MAAsB,sBAIxB,MAAMC,EAAU,CAACC,EAAMC,EAAOC,IAAaD,EAAM,QAAQ,CAACE,EAAMC,IAAM,CAC3E,KAAM,CAAE,UAAAC,EAAW,KAAAC,EAAO,CAAE,EAAIH,EAAK,WACrC,GAAI,CAACA,EAAK,OAAQ,MAAO,CAAC,EAC1B,GAAIE,EAAW,OAAOP,EAAeE,EAAMK,CAAS,EAAE,IAAIE,IAAS,CACjE,GAAI,GAAGH,CAAC,IAAIG,EAAK,EAAE,GAAI,KAAAJ,EAAM,SAAUI,EAAK,SAAWJ,EAAK,OAAQ,MAAOA,EAAK,QAAUE,EAAU,SAAW,IAC/G,WAAY,CAAE,GAAGF,EAAK,WAAY,UAAWI,EAAK,SAAU,CAC9D,EAAE,EACF,MAAMC,EAAYR,EAAO,IAAOE,EAChC,OAAQC,EAAK,UAAYN,EAAeM,EAAK,OAAQG,EAAMJ,CAAQ,GAChE,IAAI,CAACO,EAAQC,KAAO,CAAE,GAAI,GAAGN,CAAC,IAAIM,CAAC,GAAI,KAAAP,EAAM,UAAWM,EAASD,GAAaL,EAAK,OAAQ,MAAOD,EAAU,WAAYC,EAAK,UAAW,EAAE,CAC/I,CAAC",
|
|
6
|
+
"names": ["vehicleOffsets", "scheduledTrips", "tripsAt", "time", "lanes", "velocity", "lane", "l", "timetable", "flow", "trip", "travelled", "offset", "k"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/types.js"],
|
|
4
|
+
"sourcesContent": ["export const types = {\n 5120: Int8Array,\n 5121: Uint8Array,\n 5122: Int16Array,\n 5123: Uint16Array,\n 5125: Uint32Array,\n 5126: Float32Array,\n};\n"],
|
|
5
|
+
"mappings": "AAAO,MAAMA,EAAQ,CACnB,KAAM,UACN,KAAM,WACN,KAAM,WACN,KAAM,YACN,KAAM,YACN,KAAM,YACR",
|
|
6
|
+
"names": ["types"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function c(e,o){const r=e._map,t=()=>{const n=[...r.getContainer().querySelectorAll(".leaflet-control-layers-selector")].find(l=>l.layerId===L.Util.stamp(e));return n?.closest("label").after(o),!!n},a=()=>queueMicrotask(()=>r.hasLayer(e)&&t());return r.on("layeradd layerremove",a),e.once("remove",()=>{r.off("layeradd layerremove",a),o.remove()}),t()}export{c as underEntry};
|
|
2
|
+
//# sourceMappingURL=underEntry.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/underEntry.js"],
|
|
4
|
+
"sourcesContent": ["/**\n * Keeps `element` right under `layer`'s entry in the map's layers control while the layer is on the map.\n * Returns false when no layers control lists the layer.\n */\nexport function underEntry(layer, element) {\n const map = layer._map;\n const place = () => {\n const input = [...map.getContainer().querySelectorAll('.leaflet-control-layers-selector')].find(input => input.layerId === L.Util.stamp(layer));\n input?.closest('label').after(element);\n return Boolean(input);\n };\n // Leaflet rebuilds the list after 'layeradd'/'layerremove' (on the layer's own 'add'/'remove'): re-place afterwards.\n const replace = () => queueMicrotask(() => map.hasLayer(layer) && place());\n map.on('layeradd layerremove', replace);\n layer.once('remove', () => { map.off('layeradd layerremove', replace); element.remove(); });\n return place();\n}\n"],
|
|
5
|
+
"mappings": "AAIO,SAASA,EAAWC,EAAOC,EAAS,CACzC,MAAMC,EAAMF,EAAM,KACZG,EAAQ,IAAM,CAClB,MAAMC,EAAQ,CAAC,GAAGF,EAAI,aAAa,EAAE,iBAAiB,kCAAkC,CAAC,EAAE,KAAKE,GAASA,EAAM,UAAY,EAAE,KAAK,MAAMJ,CAAK,CAAC,EAC9I,OAAAI,GAAO,QAAQ,OAAO,EAAE,MAAMH,CAAO,EAC9B,EAAQG,CACjB,EAEMC,EAAU,IAAM,eAAe,IAAMH,EAAI,SAASF,CAAK,GAAKG,EAAM,CAAC,EACzE,OAAAD,EAAI,GAAG,uBAAwBG,CAAO,EACtCL,EAAM,KAAK,SAAU,IAAM,CAAEE,EAAI,IAAI,uBAAwBG,CAAO,EAAGJ,EAAQ,OAAO,CAAG,CAAC,EACnFE,EAAM,CACf",
|
|
6
|
+
"names": ["underEntry", "layer", "element", "map", "place", "input", "replace"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/update.js"],
|
|
4
|
+
"sourcesContent": ["import { render } from \"./render.js\";\n\n/** Scene graph, shared camera and frame rendering. */\n/** Content changes: render once on the next animation frame. */\n\nexport function update(backend) {\n const shared = backend._shared;\n if (!shared) return backend;\n if (shared !== backend) {\n update(shared);\n return backend;\n }\n backend._frame ||= requestAnimationFrame(() => {\n backend._frame = null;\n if (backend._shared === backend && backend.renderer) render(backend);\n });\n return backend;\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,UAAAA,MAAc,cAKhB,SAASC,EAAOC,EAAS,CAC9B,MAAMC,EAASD,EAAQ,QACvB,OAAKC,EACDA,IAAWD,GACbD,EAAOE,CAAM,EACND,IAETA,EAAQ,SAAW,sBAAsB,IAAM,CAC7CA,EAAQ,OAAS,KACbA,EAAQ,UAAYA,GAAWA,EAAQ,UAAUF,EAAOE,CAAO,CACrE,CAAC,EACMA,GATaA,CAUtB",
|
|
6
|
+
"names": ["render", "update", "backend", "shared"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{pump as x}from"./pump.js";import{releaseArea as l}from"./releaseArea.js";function j(o){if(!o._map||!o._shared)return;if(o._geojson){o._areas.has("geojson")||o._areas.set("geojson",{request:new AbortController}),x(o);return}if(!o.header)return;const t=o.header.minZoom,s=o._map.project(o._map.getCenter(),t).divideBy(256).floor(),i=o._map.getBounds(),m=o._map.project(i.getNorthWest(),t).divideBy(256).floor(),h=o._map.project(i.getSouthEast(),t).divideBy(256).floor(),p=o._map.project([o.header.maxLat,o.header.minLon],t).divideBy(256).floor(),f=o._map.project([o.header.minLat,o.header.maxLon],t).divideBy(256).floor(),a=new Map;for(let r=Math.max(0,m.x-1,p.x);r<=Math.min(2**t-1,h.x+1,f.x);r++)for(let e=Math.max(0,m.y-1,p.y);e<=Math.min(2**t-1,h.y+1,f.y);e++)a.set(`${r}/${e}`,{z:t,x:r,y:e});for(const[r,e]of o._areas)a.has(r)||(l(o,e),o._areas.delete(r));for(const[r,e]of[...a].sort(([,y],[,_])=>Math.hypot(y.x-s.x,y.y-s.y)-Math.hypot(_.x-s.x,_.y-s.y)))o._areas.has(r)||o._areas.set(r,{coords:e,request:new AbortController});x(o)}export{j as updateArea};
|
|
2
|
+
//# sourceMappingURL=updateArea.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/updateArea.js"],
|
|
4
|
+
"sourcesContent": ["import { pump } from \"./pump.js\";\nimport { releaseArea } from \"./releaseArea.js\";\n\n/** Cover the visible ground bounds and one bordering block, clipped to the archive. */\n\nexport function updateArea(backend) {\n if (!backend._map || !backend._shared) return;\n if (backend._geojson) {\n if (!backend._areas.has('geojson')) {\n backend._areas.set('geojson', { request: new AbortController() });\n }\n pump(backend);\n return;\n }\n if (!backend.header) return;\n const z = backend.header.minZoom;\n const center = backend._map.project(backend._map.getCenter(), z).divideBy(256).floor();\n const bounds = backend._map.getBounds();\n const nw = backend._map.project(bounds.getNorthWest(), z).divideBy(256).floor();\n const se = backend._map.project(bounds.getSouthEast(), z).divideBy(256).floor();\n const archiveNW = backend._map.project([backend.header.maxLat, backend.header.minLon], z).divideBy(256).floor();\n const archiveSE = backend._map.project([backend.header.minLat, backend.header.maxLon], z).divideBy(256).floor();\n const wanted = new Map();\n for (let x = Math.max(0, nw.x - 1, archiveNW.x); x <= Math.min(2 ** z - 1, se.x + 1, archiveSE.x); x++) {\n for (let y = Math.max(0, nw.y - 1, archiveNW.y); y <= Math.min(2 ** z - 1, se.y + 1, archiveSE.y); y++) {\n wanted.set(`${x}/${y}`, { z, x, y });\n }\n }\n for (const [key, area] of backend._areas) {\n if (!wanted.has(key)) {\n releaseArea(backend, area);\n backend._areas.delete(key);\n }\n }\n // Load the nearest new blocks first without rebuilding retained geometry.\n for (const [key, coords] of [...wanted].sort(([, a], [, b]) => Math.hypot(a.x - center.x, a.y - center.y) - Math.hypot(b.x - center.x, b.y - center.y))) {\n if (!backend._areas.has(key)) backend._areas.set(key, { coords, request: new AbortController() });\n }\n pump(backend);\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,QAAAA,MAAY,YACrB,OAAS,eAAAC,MAAmB,mBAIrB,SAASC,EAAWC,EAAS,CAClC,GAAI,CAACA,EAAQ,MAAQ,CAACA,EAAQ,QAAS,OACvC,GAAIA,EAAQ,SAAU,CACfA,EAAQ,OAAO,IAAI,SAAS,GAC/BA,EAAQ,OAAO,IAAI,UAAW,CAAE,QAAS,IAAI,eAAkB,CAAC,EAElEH,EAAKG,CAAO,EACZ,MACF,CACA,GAAI,CAACA,EAAQ,OAAQ,OACrB,MAAMC,EAAID,EAAQ,OAAO,QACnBE,EAASF,EAAQ,KAAK,QAAQA,EAAQ,KAAK,UAAU,EAAGC,CAAC,EAAE,SAAS,GAAG,EAAE,MAAM,EAC/EE,EAASH,EAAQ,KAAK,UAAU,EAChCI,EAAKJ,EAAQ,KAAK,QAAQG,EAAO,aAAa,EAAGF,CAAC,EAAE,SAAS,GAAG,EAAE,MAAM,EACxEI,EAAKL,EAAQ,KAAK,QAAQG,EAAO,aAAa,EAAGF,CAAC,EAAE,SAAS,GAAG,EAAE,MAAM,EACxEK,EAAYN,EAAQ,KAAK,QAAQ,CAACA,EAAQ,OAAO,OAAQA,EAAQ,OAAO,MAAM,EAAGC,CAAC,EAAE,SAAS,GAAG,EAAE,MAAM,EACxGM,EAAYP,EAAQ,KAAK,QAAQ,CAACA,EAAQ,OAAO,OAAQA,EAAQ,OAAO,MAAM,EAAGC,CAAC,EAAE,SAAS,GAAG,EAAE,MAAM,EACxGO,EAAS,IAAI,IACnB,QAASC,EAAI,KAAK,IAAI,EAAGL,EAAG,EAAI,EAAGE,EAAU,CAAC,EAAGG,GAAK,KAAK,IAAI,GAAKR,EAAI,EAAGI,EAAG,EAAI,EAAGE,EAAU,CAAC,EAAGE,IACjG,QAASC,EAAI,KAAK,IAAI,EAAGN,EAAG,EAAI,EAAGE,EAAU,CAAC,EAAGI,GAAK,KAAK,IAAI,GAAKT,EAAI,EAAGI,EAAG,EAAI,EAAGE,EAAU,CAAC,EAAGG,IACjGF,EAAO,IAAI,GAAGC,CAAC,IAAIC,CAAC,GAAI,CAAE,EAAAT,EAAG,EAAAQ,EAAG,EAAAC,CAAE,CAAC,EAGvC,SAAW,CAACC,EAAKC,CAAI,IAAKZ,EAAQ,OAC3BQ,EAAO,IAAIG,CAAG,IACjBb,EAAYE,EAASY,CAAI,EACzBZ,EAAQ,OAAO,OAAOW,CAAG,GAI7B,SAAW,CAACA,EAAKE,CAAM,GAAK,CAAC,GAAGL,CAAM,EAAE,KAAK,CAAC,CAAC,CAAEM,CAAC,EAAG,CAAC,CAAEC,CAAC,IAAM,KAAK,MAAMD,EAAE,EAAIZ,EAAO,EAAGY,EAAE,EAAIZ,EAAO,CAAC,EAAI,KAAK,MAAMa,EAAE,EAAIb,EAAO,EAAGa,EAAE,EAAIb,EAAO,CAAC,CAAC,EAC/IF,EAAQ,OAAO,IAAIW,CAAG,GAAGX,EAAQ,OAAO,IAAIW,EAAK,CAAE,OAAAE,EAAQ,QAAS,IAAI,eAAkB,CAAC,EAElGhB,EAAKG,CAAO,CACd",
|
|
6
|
+
"names": ["pump", "releaseArea", "updateArea", "backend", "z", "center", "bounds", "nw", "se", "archiveNW", "archiveSE", "wanted", "x", "y", "key", "area", "coords", "a", "b"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const f=(o,i)=>[o[1]*i[2]-o[2]*i[1],o[2]*i[0]-o[0]*i[2],o[0]*i[1]-o[1]*i[0]];function u(o){const i=o.position.map((t,y)=>t-o.target[y]),x=Math.hypot(...i)||1;for(let t=0;t<3;t++)i[t]/=x;const n=f(o.up,i),l=Math.hypot(...n)||1;for(let t=0;t<3;t++)n[t]/=l;const e=f(i,n),p=new DOMMatrix([n[0],n[1],n[2],0,e[0],e[1],e[2],0,i[0],i[1],i[2],0,...o.position,1]).inverse().toFloat64Array();if(![...p].every(Number.isFinite))throw new Error("Singular 3D transform");for(let t=0;t<16;t++)o.viewMatrix[t]=p[t];const M=1/Math.tan(o.fov*Math.PI/360),s=o.near,r=o.far,w=[M/o.aspect,0,0,0,0,M,0,0,0,0,r/(s-r),-1,0,0,r*s/(s-r),0];for(let t=0;t<16;t++)o.projectionMatrix[t]=w[t];const h=new DOMMatrix(o.projectionMatrix).multiply(new DOMMatrix(o.viewMatrix)).toFloat64Array();for(let t=0;t<16;t++)o.projectionViewMatrix[t]=h[t]}export{u as updateCamera};
|
|
2
|
+
//# sourceMappingURL=updateCamera.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/updateCamera.js"],
|
|
4
|
+
"sourcesContent": ["/** Orthonormal view basis plus perspective matrices, refreshed before projecting/drawing. */\n\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]];\n\nexport function updateCamera(camera) {\n const z = camera.position.map((v, i) => v - camera.target[i]);\n const zLength = Math.hypot(...z) || 1;\n for (let i = 0; i < 3; i++) {\n z[i] /= zLength;\n }\n const x = cross(camera.up, z), xLength = Math.hypot(...x) || 1;\n for (let i = 0; i < 3; i++) {\n x[i] /= xLength;\n }\n const y = cross(z, x);\n const view = new DOMMatrix([x[0], x[1], x[2], 0, y[0], y[1], y[2], 0, z[0], z[1], z[2], 0, ...camera.position, 1]).inverse().toFloat64Array();\n if (![...view].every(Number.isFinite)) {\n throw new Error('Singular 3D transform');\n }\n for (let i = 0; i < 16; i++) {\n camera.viewMatrix[i] = view[i];\n }\n const f = 1 / Math.tan(camera.fov * Math.PI / 360), n = camera.near, r = camera.far;\n const projection = [f / camera.aspect, 0, 0, 0, 0, f, 0, 0, 0, 0, r / (n - r), -1, 0, 0, r * n / (n - r), 0];\n for (let i = 0; i < 16; i++) {\n camera.projectionMatrix[i] = projection[i];\n }\n const projectionView = new DOMMatrix(camera.projectionMatrix).multiply(new DOMMatrix(camera.viewMatrix)).toFloat64Array();\n for (let i = 0; i < 16; i++) {\n camera.projectionViewMatrix[i] = projectionView[i];\n }\n}\n"],
|
|
5
|
+
"mappings": "AAEA,MAAMA,EAAQ,CAACC,EAAGC,IAAM,CAACD,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAID,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAGD,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAID,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAGD,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAID,EAAE,CAAC,EAAIC,EAAE,CAAC,CAAC,EAEjG,SAASC,EAAaC,EAAQ,CACnC,MAAMC,EAAID,EAAO,SAAS,IAAI,CAACE,EAAGC,IAAMD,EAAIF,EAAO,OAAOG,CAAC,CAAC,EACtDC,EAAU,KAAK,MAAM,GAAGH,CAAC,GAAK,EACpC,QAASE,EAAI,EAAGA,EAAI,EAAGA,IACrBF,EAAEE,CAAC,GAAKC,EAEV,MAAMC,EAAIT,EAAMI,EAAO,GAAIC,CAAC,EAAGK,EAAU,KAAK,MAAM,GAAGD,CAAC,GAAK,EAC7D,QAASF,EAAI,EAAGA,EAAI,EAAGA,IACrBE,EAAEF,CAAC,GAAKG,EAEV,MAAMC,EAAIX,EAAMK,EAAGI,CAAC,EACdG,EAAO,IAAI,UAAU,CAACH,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAG,EAAGE,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAG,EAAGN,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAG,EAAG,GAAGD,EAAO,SAAU,CAAC,CAAC,EAAE,QAAQ,EAAE,eAAe,EAC5I,GAAI,CAAC,CAAC,GAAGQ,CAAI,EAAE,MAAM,OAAO,QAAQ,EAClC,MAAM,IAAI,MAAM,uBAAuB,EAEzC,QAASL,EAAI,EAAGA,EAAI,GAAIA,IACtBH,EAAO,WAAWG,CAAC,EAAIK,EAAKL,CAAC,EAE/B,MAAMM,EAAI,EAAI,KAAK,IAAIT,EAAO,IAAM,KAAK,GAAK,GAAG,EAAGU,EAAIV,EAAO,KAAM,EAAIA,EAAO,IAC1EW,EAAa,CAACF,EAAIT,EAAO,OAAQ,EAAG,EAAG,EAAG,EAAGS,EAAG,EAAG,EAAG,EAAG,EAAG,GAAKC,EAAI,GAAI,GAAI,EAAG,EAAG,EAAIA,GAAKA,EAAI,GAAI,CAAC,EAC3G,QAASP,EAAI,EAAGA,EAAI,GAAIA,IACtBH,EAAO,iBAAiBG,CAAC,EAAIQ,EAAWR,CAAC,EAE3C,MAAMS,EAAiB,IAAI,UAAUZ,EAAO,gBAAgB,EAAE,SAAS,IAAI,UAAUA,EAAO,UAAU,CAAC,EAAE,eAAe,EACxH,QAASG,EAAI,EAAGA,EAAI,GAAIA,IACtBH,EAAO,qBAAqBG,CAAC,EAAIS,EAAeT,CAAC,CAErD",
|
|
6
|
+
"names": ["cross", "a", "b", "updateCamera", "camera", "z", "v", "i", "zLength", "x", "xLength", "y", "view", "f", "n", "projection", "projectionView"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{lightGrid as x}from"./lightGrid.js";import{traverse as c}from"./traverse.js";import{worldLights as m}from"./worldLights.js";import{destroyTexture as p}from"./destroyTexture.js";import{bindSunlight as v}from"./bindSunlight.js";function S(g){const{device:l,sunlight:r}=g.renderer,e=[];for(const t of g._layers)!t.options.nightLight||!t.root.visible||c(t.root,i=>{if(!i.visible)return!0;i.extras?.lights&&e.push(i)});if(r.lightMeshes?.length===e.length&&e.every((t,i)=>r.lightMeshes[i].mesh===t&&r.lightMeshes[i].lights===t.extras.lights&&t.worldMatrix.every((s,o)=>s===r.lightMeshes[i].matrix[o])))return;const n=e.map(t=>{const i=t._worldLights,s=t.worldMatrix,o=t.extras.lights;if(i?.lights===o&&s.every((u,d)=>u===i.matrix[d]))return i.data;const a=m(o,s);return t._worldLights={lights:o,matrix:[...s],data:a},a}),{data:h,count:f}=x(n,l.limits.maxStorageBufferBindingSize);r.lights.size<h.byteLength&&(p(g,r.lights),r.lights=l.createBuffer({size:h.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),v(g)),l.queue.writeBuffer(r.lights,0,h),r.lightCount=f,r.lightMeshes=e.map(t=>({mesh:t,lights:t.extras.lights,matrix:[...t.worldMatrix]}))}export{S as updatePointLights};
|
|
2
|
+
//# sourceMappingURL=updatePointLights.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/updatePointLights.js"],
|
|
4
|
+
"sourcesContent": ["import { lightGrid } from './lightGrid.js';\nimport { traverse } from './traverse.js';\nimport { worldLights } from './worldLights.js';\nimport { destroyTexture } from './destroyTexture.js';\nimport { bindSunlight } from './bindSunlight.js';\n\n/** A cached spatial grid limits fragment lighting to nearby lamps, without dropping dense cells. */\n\nexport function updatePointLights(backend) {\n const { device, sunlight: sun } = backend.renderer;\n const meshes = [];\n for (const layer of backend._layers) {\n if (!layer.options.nightLight || !layer.root.visible) continue;\n traverse(layer.root, mesh => {\n if (!mesh.visible) return true;\n if (mesh.extras?.lights) meshes.push(mesh);\n });\n }\n if (sun.lightMeshes?.length === meshes.length && meshes.every((mesh, i) => sun.lightMeshes[i].mesh === mesh &&\n sun.lightMeshes[i].lights === mesh.extras.lights && mesh.worldMatrix.every((v, j) => v === sun.lightMeshes[i].matrix[j]))) return;\n // Per mesh, world-space [x, y, z, radius, r, g, b, intensity] per light: re-packed only when its lights or matrix change.\n const packed = meshes.map(mesh => {\n const cache = mesh._worldLights, m = mesh.worldMatrix, lights = mesh.extras.lights;\n if (cache?.lights === lights && m.every((v, j) => v === cache.matrix[j])) return cache.data;\n const values = worldLights(lights, m);\n mesh._worldLights = { lights, matrix: [...m], data: values };\n return values;\n });\n const { data, count } = lightGrid(packed, device.limits.maxStorageBufferBindingSize);\n if (sun.lights.size < data.byteLength) {\n destroyTexture(backend, sun.lights);\n sun.lights = device.createBuffer({ size: data.byteLength, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST });\n bindSunlight(backend);\n }\n device.queue.writeBuffer(sun.lights, 0, data);\n sun.lightCount = count;\n sun.lightMeshes = meshes.map(mesh => ({ mesh, lights: mesh.extras.lights, matrix: [...mesh.worldMatrix] }));\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,aAAAA,MAAiB,iBAC1B,OAAS,YAAAC,MAAgB,gBACzB,OAAS,eAAAC,MAAmB,mBAC5B,OAAS,kBAAAC,MAAsB,sBAC/B,OAAS,gBAAAC,MAAoB,oBAItB,SAASC,EAAkBC,EAAS,CACzC,KAAM,CAAE,OAAAC,EAAQ,SAAUC,CAAI,EAAIF,EAAQ,SACpCG,EAAS,CAAC,EAChB,UAAWC,KAASJ,EAAQ,QACtB,CAACI,EAAM,QAAQ,YAAc,CAACA,EAAM,KAAK,SAC7CT,EAASS,EAAM,KAAMC,GAAQ,CAC3B,GAAI,CAACA,EAAK,QAAS,MAAO,GACtBA,EAAK,QAAQ,QAAQF,EAAO,KAAKE,CAAI,CAC3C,CAAC,EAEH,GAAIH,EAAI,aAAa,SAAWC,EAAO,QAAUA,EAAO,MAAM,CAACE,EAAM,IAAMH,EAAI,YAAY,CAAC,EAAE,OAASG,GACrGH,EAAI,YAAY,CAAC,EAAE,SAAWG,EAAK,OAAO,QAAUA,EAAK,YAAY,MAAM,CAACC,EAAGC,IAAMD,IAAMJ,EAAI,YAAY,CAAC,EAAE,OAAOK,CAAC,CAAC,CAAC,EAAG,OAE7H,MAAMC,EAASL,EAAO,IAAIE,GAAQ,CAChC,MAAMI,EAAQJ,EAAK,aAAcK,EAAIL,EAAK,YAAaM,EAASN,EAAK,OAAO,OAC5E,GAAII,GAAO,SAAWE,GAAUD,EAAE,MAAM,CAACJ,EAAGC,IAAMD,IAAMG,EAAM,OAAOF,CAAC,CAAC,EAAG,OAAOE,EAAM,KACvF,MAAMG,EAAShB,EAAYe,EAAQD,CAAC,EACpC,OAAAL,EAAK,aAAe,CAAE,OAAAM,EAAQ,OAAQ,CAAC,GAAGD,CAAC,EAAG,KAAME,CAAO,EACpDA,CACT,CAAC,EACK,CAAE,KAAAC,EAAM,MAAAC,CAAM,EAAIpB,EAAUc,EAAQP,EAAO,OAAO,2BAA2B,EAC/EC,EAAI,OAAO,KAAOW,EAAK,aACzBhB,EAAeG,EAASE,EAAI,MAAM,EAClCA,EAAI,OAASD,EAAO,aAAa,CAAE,KAAMY,EAAK,WAAY,MAAO,eAAe,QAAU,eAAe,QAAS,CAAC,EACnHf,EAAaE,CAAO,GAEtBC,EAAO,MAAM,YAAYC,EAAI,OAAQ,EAAGW,CAAI,EAC5CX,EAAI,WAAaY,EACjBZ,EAAI,YAAcC,EAAO,IAAIE,IAAS,CAAE,KAAAA,EAAM,OAAQA,EAAK,OAAO,OAAQ,OAAQ,CAAC,GAAGA,EAAK,WAAW,CAAE,EAAE,CAC5G",
|
|
6
|
+
"names": ["lightGrid", "traverse", "worldLights", "destroyTexture", "bindSunlight", "updatePointLights", "backend", "device", "sun", "meshes", "layer", "mesh", "v", "j", "packed", "cache", "m", "lights", "values", "data", "count"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function c(t){const i=t.parent,e=i?._worldMatrixVersion||0,s=!!t.matrix;let o=t._worldParent!==i||t._parentWorldVersion!==e||t._worldMatrixMode!==s;if(t.matrix){const a=t._matrixState||=new Float64Array(16);for(let r=0;r<16;r++)a[r]!==t.matrix[r]&&(o=!0),a[r]=t.matrix[r]}else{const a=t._transformState||=new Float64Array(9);for(let r=0;r<9;r++){const x=r<3?t.position[r]:r<6?t.rotation[r-3]:t.scale[r-6];a[r]!==x&&(o=!0),a[r]=x}}if(!o){for(const a of t.children)c(a);return}let l;if(t.matrix)l=t.matrix;else{const a=180/Math.PI,r=new DOMMatrix().translate(...t.position);r.rotateAxisAngleSelf(0,1,0,t.rotation[1]*a),r.rotateAxisAngleSelf(1,0,0,t.rotation[0]*a),r.rotateAxisAngleSelf(0,0,1,t.rotation[2]*a),l=r.scale(...t.scale).toFloat64Array()}const n=i?new DOMMatrix(i.worldMatrix).multiply(new DOMMatrix(l)).toFloat64Array():l;for(let a=0;a<16;a++)t.worldMatrix[a]=n[a];t._worldParent=i,t._parentWorldVersion=e,t._worldMatrixMode=s,t._worldMatrixVersion=(t._worldMatrixVersion||0)+1;for(const a of t.children)c(a)}export{c as updateWorldMatrix};
|
|
2
|
+
//# sourceMappingURL=updateWorldMatrix.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/updateWorldMatrix.js"],
|
|
4
|
+
"sourcesContent": ["/** Compose parent*local matrices; a node.matrix overrides its position/rotation/scale. */\n\nexport function updateWorldMatrix(node) {\n const parent = node.parent;\n const parentVersion = parent?._worldMatrixVersion || 0;\n const matrixMode = Boolean(node.matrix);\n let changed = node._worldParent !== parent || node._parentWorldVersion !== parentVersion ||\n node._worldMatrixMode !== matrixMode;\n if (node.matrix) {\n const state = node._matrixState ||= new Float64Array(16);\n for (let i = 0; i < 16; i++) {\n if (state[i] !== node.matrix[i]) changed = true;\n state[i] = node.matrix[i];\n }\n } else {\n const state = node._transformState ||= new Float64Array(9);\n for (let i = 0; i < 9; i++) {\n const value = i < 3 ? node.position[i] : i < 6 ? node.rotation[i - 3] : node.scale[i - 6];\n if (state[i] !== value) changed = true;\n state[i] = value;\n }\n }\n if (!changed) {\n for (const child of node.children) updateWorldMatrix(child);\n return;\n }\n let local;\n if (node.matrix) local = node.matrix;\n else {\n const degrees = 180 / Math.PI;\n const matrix = new DOMMatrix().translate(...node.position);\n // Node rotations use YXZ, as did the previous renderer.\n matrix.rotateAxisAngleSelf(0, 1, 0, node.rotation[1] * degrees);\n matrix.rotateAxisAngleSelf(1, 0, 0, node.rotation[0] * degrees);\n matrix.rotateAxisAngleSelf(0, 0, 1, node.rotation[2] * degrees);\n local = matrix.scale(...node.scale).toFloat64Array();\n }\n const world = parent\n ? new DOMMatrix(parent.worldMatrix).multiply(new DOMMatrix(local)).toFloat64Array()\n : local;\n for (let i = 0; i < 16; i++) node.worldMatrix[i] = world[i];\n node._worldParent = parent;\n node._parentWorldVersion = parentVersion;\n node._worldMatrixMode = matrixMode;\n node._worldMatrixVersion = (node._worldMatrixVersion || 0) + 1;\n for (const child of node.children) updateWorldMatrix(child);\n}\n"],
|
|
5
|
+
"mappings": "AAEO,SAASA,EAAkBC,EAAM,CACtC,MAAMC,EAASD,EAAK,OACdE,EAAgBD,GAAQ,qBAAuB,EAC/CE,EAAa,EAAQH,EAAK,OAChC,IAAII,EAAUJ,EAAK,eAAiBC,GAAUD,EAAK,sBAAwBE,GACzEF,EAAK,mBAAqBG,EAC5B,GAAIH,EAAK,OAAQ,CACf,MAAMK,EAAQL,EAAK,eAAiB,IAAI,aAAa,EAAE,EACvD,QAASM,EAAI,EAAGA,EAAI,GAAIA,IAClBD,EAAMC,CAAC,IAAMN,EAAK,OAAOM,CAAC,IAAGF,EAAU,IAC3CC,EAAMC,CAAC,EAAIN,EAAK,OAAOM,CAAC,CAE5B,KAAO,CACL,MAAMD,EAAQL,EAAK,kBAAoB,IAAI,aAAa,CAAC,EACzD,QAASM,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,MAAMC,EAAQD,EAAI,EAAIN,EAAK,SAASM,CAAC,EAAIA,EAAI,EAAIN,EAAK,SAASM,EAAI,CAAC,EAAIN,EAAK,MAAMM,EAAI,CAAC,EACpFD,EAAMC,CAAC,IAAMC,IAAOH,EAAU,IAClCC,EAAMC,CAAC,EAAIC,CACb,CACF,CACA,GAAI,CAACH,EAAS,CACZ,UAAWI,KAASR,EAAK,SAAUD,EAAkBS,CAAK,EAC1D,MACF,CACA,IAAIC,EACJ,GAAIT,EAAK,OAAQS,EAAQT,EAAK,WACzB,CACH,MAAMU,EAAU,IAAM,KAAK,GACrBC,EAAS,IAAI,UAAU,EAAE,UAAU,GAAGX,EAAK,QAAQ,EAEzDW,EAAO,oBAAoB,EAAG,EAAG,EAAGX,EAAK,SAAS,CAAC,EAAIU,CAAO,EAC9DC,EAAO,oBAAoB,EAAG,EAAG,EAAGX,EAAK,SAAS,CAAC,EAAIU,CAAO,EAC9DC,EAAO,oBAAoB,EAAG,EAAG,EAAGX,EAAK,SAAS,CAAC,EAAIU,CAAO,EAC9DD,EAAQE,EAAO,MAAM,GAAGX,EAAK,KAAK,EAAE,eAAe,CACrD,CACA,MAAMY,EAAQX,EACV,IAAI,UAAUA,EAAO,WAAW,EAAE,SAAS,IAAI,UAAUQ,CAAK,CAAC,EAAE,eAAe,EAChFA,EACJ,QAASH,EAAI,EAAGA,EAAI,GAAIA,IAAKN,EAAK,YAAYM,CAAC,EAAIM,EAAMN,CAAC,EAC1DN,EAAK,aAAeC,EACpBD,EAAK,oBAAsBE,EAC3BF,EAAK,iBAAmBG,EACxBH,EAAK,qBAAuBA,EAAK,qBAAuB,GAAK,EAC7D,UAAWQ,KAASR,EAAK,SAAUD,EAAkBS,CAAK,CAC5D",
|
|
6
|
+
"names": ["updateWorldMatrix", "node", "parent", "parentVersion", "matrixMode", "changed", "state", "i", "value", "child", "local", "degrees", "matrix", "world"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/vehicleOffsets.js"],
|
|
4
|
+
"sourcesContent": ["import { speed } from \"./speed.js\";\n\n/** Evenly spaced starting offsets (metres) for `flow` vehicles/h moving at `velocity` m/s on a `length` metres lane. */\n\nexport function vehicleOffsets(length, flow, velocity = speed) {\n const count = Math.round(length * flow / 3600 / velocity);\n return Array.from({ length: count }, (_, i) => (i + 0.5) * length / count);\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,SAAAA,MAAa,aAIf,SAASC,EAAeC,EAAQC,EAAMC,EAAWJ,EAAO,CAC7D,MAAMK,EAAQ,KAAK,MAAMH,EAASC,EAAO,KAAOC,CAAQ,EACxD,OAAO,MAAM,KAAK,CAAE,OAAQC,CAAM,EAAG,CAACC,EAAGC,KAAOA,EAAI,IAAOL,EAASG,CAAK,CAC3E",
|
|
6
|
+
"names": ["speed", "vehicleOffsets", "length", "flow", "velocity", "count", "_", "i"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{hull as s}from"./hull.js";import{box as o}from"./box.js";import{glass as m,tyre as e}from"./glass.js";import{mirror as t}from"./mirror.js";import{white as r}from"./white.js";import{paints as p}from"./paints.js";import{headlight as f}from"./headlight.js";import{taillight as a}from"./taillight.js";const y={car:{side:1.8,model:l=>{const i=p[l%p.length];return[...t(.7,.92,-1.68,-1.02,0,.64,e),...t(.7,.92,1.02,1.68,0,.64,e),[[[-.9,-1.95],[-.72,-2.25],[.72,-2.25],[.9,-1.95],[.9,2.05],[.76,2.25],[-.76,2.25],[-.9,2.05]],.28,.82,i],[o(-.84,.84,-.75,1.6),.82,1.38,m,o(-.7,.7,-.05,1.3)],[o(-.71,.71,-.06,1.31),1.38,1.46,i],...t(.38,.8,-2.3,-2.16,.56,.76,f),[o(-.78,.78,2.16,2.3),.6,.76,a]]},lights:[{position:[0,1.2,-6],radius:10,color:[1,.94,.82],flux:800}]},boat:{side:0,model:()=>[[s,0,.8,[.1,.16,.26]],[s,.8,1.4,r],[o(-5,5,-18,26),1.4,3.7,m,o(-4.6,4.6,-17.4,25.6)],...t(4.64,4.74,-17,25,3.25,3.45,[1.6,1.25,.8]),[o(-4.8,4.8,-17.8,25.8),3.7,3.9,r],...Array.from({length:12},(l,i)=>t(.5,3.8,-12+i*3,-11.3+i*3,3.9,4.4,[.62,.1,.1])).flat(),...t(4.65,4.8,-13.6,25.8,3.9,4.8,r),[o(-4.8,4.8,25.65,25.8),3.9,4.8,r],[o(-2.2,2.2,-17.6,-14),3.9,4.7,r],[o(-2.2,2.2,-17.6,-14),4.7,5.5,m],[o(-2.5,2.5,-18,-13.6),5.5,5.7,r],[o(-2.45,-2.2,-16.2,-15.8),5,5.3,[2,.15,.1]],[o(2.2,2.45,-16.2,-15.8),5,5.3,[.1,2,.4]],[o(-.1,.1,-15.9,-15.7),5.7,6.6,r],[o(-.15,.15,-15.95,-15.65),6.6,6.8,[2,2,1.9]]],lights:[{position:[0,8,4],radius:30,color:[1,.8,.55],flux:2e4}]}};export{y as vehicles};
|
|
2
|
+
//# sourceMappingURL=vehicles.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/vehicles.js"],
|
|
4
|
+
"sourcesContent": ["import { hull } from \"./hull.js\";\nimport { box } from './box.js';\nimport { glass, tyre } from './glass.js';\nimport { mirror } from './mirror.js';\nimport { white } from \"./white.js\";\nimport { paints } from './paints.js';\nimport { headlight } from './headlight.js';\nimport { taillight } from './taillight.js';\n\n/**\n * `side`: default offset (metres) to the right of the lane centreline. `model(i)` gives the prisms of the i-th vehicle.\n * `lights`: night point lights in model space (see the night lighting grid), e.g. the pool cast by the headlights.\n */\nexport const vehicles = {\n car: {\n side: 1.8,\n model: i => {\n const paint = paints[i % paints.length];\n return [\n ...mirror(0.7, 0.92, -1.68, -1.02, 0, 0.64, tyre),\n ...mirror(0.7, 0.92, 1.02, 1.68, 0, 0.64, tyre),\n [[[-0.9, -1.95], [-0.72, -2.25], [0.72, -2.25], [0.9, -1.95], [0.9, 2.05], [0.76, 2.25], [-0.76, 2.25], [-0.9, 2.05]],\n 0.28, 0.82, paint],\n // Greenhouse: the windscreen leans back, the rear window less.\n [box(-0.84, 0.84, -0.75, 1.6), 0.82, 1.38, glass, box(-0.7, 0.7, -0.05, 1.3)],\n [box(-0.71, 0.71, -0.06, 1.31), 1.38, 1.46, paint],\n ...mirror(0.38, 0.8, -2.3, -2.16, 0.56, 0.76, headlight),\n [box(-0.78, 0.78, 2.16, 2.3), 0.6, 0.76, taillight],\n ];\n },\n lights: [{\n position: [0, 1.2, -6],\n radius: 10,\n color: [1, 0.94, 0.82],\n flux: 800\n }]\n },\n // Panoramic river cruiser, about 60 \u00D7 11 m: glass saloon, open upper deck with benches, wheelhouse forward.\n boat: {\n side: 0,\n model: () => [\n [hull, 0, 0.8, [0.1, 0.16, 0.26]],\n [hull, 0.8, 1.4, white],\n [box(-5, 5, -18, 26), 1.4, 3.7, glass, box(-4.6, 4.6, -17.4, 25.6)],\n ...mirror(4.64, 4.74, -17, 25, 3.25, 3.45, [1.6, 1.25, 0.8]),\n [box(-4.8, 4.8, -17.8, 25.8), 3.7, 3.9, white],\n ...Array.from({ length: 12 }, (_, i) => mirror(0.5, 3.8, -12 + i * 3, -11.3 + i * 3, 3.9, 4.4, [0.62, 0.1, 0.1])).flat(),\n ...mirror(4.65, 4.8, -13.6, 25.8, 3.9, 4.8, white),\n [box(-4.8, 4.8, 25.65, 25.8), 3.9, 4.8, white],\n [box(-2.2, 2.2, -17.6, -14), 3.9, 4.7, white],\n [box(-2.2, 2.2, -17.6, -14), 4.7, 5.5, glass],\n [box(-2.5, 2.5, -18, -13.6), 5.5, 5.7, white],\n [box(-2.45, -2.2, -16.2, -15.8), 5, 5.3, [2, 0.15, 0.1]],\n [box(2.2, 2.45, -16.2, -15.8), 5, 5.3, [0.1, 2, 0.4]],\n [box(-0.1, 0.1, -15.9, -15.7), 5.7, 6.6, white],\n [box(-0.15, 0.15, -15.95, -15.65), 6.6, 6.8, [2, 2, 1.9]],\n ],\n lights: [{\n position: [0, 8, 4],\n radius: 30,\n color: [1, 0.8, 0.55],\n flux: 20000\n }]\n },\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["hull", "box", "glass", "tyre", "mirror", "white", "paints", "headlight", "taillight", "vehicles", "i", "paint", "_"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function s(l,o){const f=new Float32Array(l.length);for(let t=0;t<(o?.length||l.length/3);t+=3){const h=o?o[t]:t,n=o?o[t+1]:t+1,m=o?o[t+2]:t+2,a=[0,1,2].map(r=>l[n*3+r]-l[h*3+r]),e=[0,1,2].map(r=>l[m*3+r]-l[h*3+r]),u=[a[1]*e[2]-a[2]*e[1],a[2]*e[0]-a[0]*e[2],a[0]*e[1]-a[1]*e[0]];for(const r of[h,n,m])for(let g=0;g<3;g++)f[r*3+g]+=u[g]}for(let t=0;t<f.length;t+=3){const h=Math.hypot(...f.subarray(t,t+3))||1;for(let n=0;n<3;n++)f[t+n]/=h}return f}export{s as vertexNormals};
|
|
2
|
+
//# sourceMappingURL=vertexNormals.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/vertexNormals.js"],
|
|
4
|
+
"sourcesContent": ["/** Area-weighted vertex normals, for indexed or non-indexed triangles. */\n\nexport function vertexNormals(p, indices) {\n // Accumulate area-weighted face normals for shared vertices, then normalize.\n const normals = new Float32Array(p.length);\n for (let i = 0; i < (indices?.length || p.length / 3); i += 3) {\n const a = indices ? indices[i] : i,\n b = indices ? indices[i + 1] : i + 1,\n c = indices ? indices[i + 2] : i + 2;\n const u = [0, 1, 2].map(j => p[b * 3 + j] - p[a * 3 + j]),\n v = [0, 1, 2].map(j => p[c * 3 + j] - p[a * 3 + j]);\n const n = [\n u[1] * v[2] - u[2] * v[1],\n u[2] * v[0] - u[0] * v[2],\n u[0] * v[1] - u[1] * v[0]\n ];\n for (const index of [a, b, c]) {\n for (let j = 0; j < 3; j++) {\n normals[index * 3 + j] += n[j];\n }\n }\n }\n for (let i = 0; i < normals.length; i += 3) {\n const length = Math.hypot(...normals.subarray(i, i + 3)) || 1;\n for (let j = 0; j < 3; j++) {\n normals[i + j] /= length;\n }\n }\n return normals;\n}\n"],
|
|
5
|
+
"mappings": "AAEO,SAASA,EAAcC,EAAGC,EAAS,CAExC,MAAMC,EAAU,IAAI,aAAaF,EAAE,MAAM,EACzC,QAASG,EAAI,EAAGA,GAAKF,GAAS,QAAUD,EAAE,OAAS,GAAIG,GAAK,EAAG,CAC7D,MAAMC,EAAIH,EAAUA,EAAQE,CAAC,EAAIA,EAC3BE,EAAIJ,EAAUA,EAAQE,EAAI,CAAC,EAAIA,EAAI,EACnCG,EAAIL,EAAUA,EAAQE,EAAI,CAAC,EAAIA,EAAI,EACnCI,EAAI,CAAC,EAAG,EAAG,CAAC,EAAE,IAAIC,GAAKR,EAAEK,EAAI,EAAIG,CAAC,EAAIR,EAAEI,EAAI,EAAII,CAAC,CAAC,EAClDC,EAAI,CAAC,EAAG,EAAG,CAAC,EAAE,IAAID,GAAKR,EAAEM,EAAI,EAAIE,CAAC,EAAIR,EAAEI,EAAI,EAAII,CAAC,CAAC,EAClDE,EAAI,CACRH,EAAE,CAAC,EAAIE,EAAE,CAAC,EAAIF,EAAE,CAAC,EAAIE,EAAE,CAAC,EACxBF,EAAE,CAAC,EAAIE,EAAE,CAAC,EAAIF,EAAE,CAAC,EAAIE,EAAE,CAAC,EACxBF,EAAE,CAAC,EAAIE,EAAE,CAAC,EAAIF,EAAE,CAAC,EAAIE,EAAE,CAAC,CAC1B,EACA,UAAWE,IAAS,CAACP,EAAGC,EAAGC,CAAC,EAC1B,QAASE,EAAI,EAAGA,EAAI,EAAGA,IACrBN,EAAQS,EAAQ,EAAIH,CAAC,GAAKE,EAAEF,CAAC,CAGnC,CACA,QAASL,EAAI,EAAGA,EAAID,EAAQ,OAAQC,GAAK,EAAG,CAC1C,MAAMS,EAAS,KAAK,MAAM,GAAGV,EAAQ,SAASC,EAAGA,EAAI,CAAC,CAAC,GAAK,EAC5D,QAASK,EAAI,EAAGA,EAAI,EAAGA,IACrBN,EAAQC,EAAIK,CAAC,GAAKI,CAEtB,CACA,OAAOV,CACT",
|
|
6
|
+
"names": ["vertexNormals", "p", "indices", "normals", "i", "a", "b", "c", "u", "j", "v", "n", "index", "length"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import*as Z from"./createMesh.js";import*as A from"./disposeMesh.js";import*as D from"./update.js";import{build as B}from"./build.js";import{getElevation as E}from"./getElevation.js";import{hit as I}from"./hit.js";import{limbs as u}from"./limbs.js";import{moves as y}from"./moves.js";import{parts as C}from"./parts.js";import{wrap as M}from"./wrap.js";function x(){const{layer:t,state:e}=this,i=t._map,s=i.options.crs,o=s.project(t.location),r=Math.cos(t.location.lat*Math.PI/180),n=s.project(e.latlng),l=i._terrain3D?._terrainReady&&i._terrain3D,a=l&&E(l,e.latlng)||0;return[(n.x-o.x)*r,a-t.root.position[1],-(n.y-o.y)*r]}function b(){const[t,e,i]=x.call(this),s=-this.state.heading,o=Math.cos(s),r=Math.sin(s);for(let n=0;n<u.length;n++){const[,l,a,c]=u[n],p=this.meshes[n];p.position[0]=t+l*o,p.position[1]=e+a,p.position[2]=i-l*r,p.rotation[0]=c*this.swing*Math.sin(this.state.phase),p.rotation[1]=s}D.update(this.layer)}function w(t,e,i){const s=Math.hypot(t,e);return s>1e-6&&I(this.layer,i[0],i[1],i[2],t/s,-e/s,s+.3)}function X(t){const e=this.layer,i=e._map;this.frame=requestAnimationFrame(this.step);const s=Math.min(.1,(t-(this.last??t))/1e3);if(this.last=t,!e.renderer)return;let o=!1;if(!this.meshes){this.meshes=[];for(const[a]of u)this.meshes.push(Z.createMesh(e,B(C[a])));o=!0}let r=0,n=0;for(const a of this.keys)r+=y[a]?.[0]||0,n+=y[a]?.[1]||0;if(r=Math.sign(r),n=Math.sign(n),n&&(this.state.heading=M(this.state.heading+n*2.5*s),o=!0),r){const a=r*this.speed*s,{lat:c,lng:p}=this.state.latlng,{position:k,scale:_}=e.root;let m=Math.sin(this.state.heading)*a,d=Math.cos(this.state.heading)*a;const f=x.call(this);for(let h=0;h<f.length;h++)f[h]=k[h]+_[h]*f[h];const g=w.call(this,m,d,f);if(g){const h=m*g[0]-d*g[1];m-=h*g[0],d+=h*g[1],w.call(this,m,d,f)&&(m=d=0)}this.state.latlng=new L.LatLng(c+d/111320,p+m/(111320*Math.cos(c*Math.PI/180))),this.state.phase+=Math.hypot(m,d)/1.6*Math.PI,o=!0}if(r||n){const a=i.getBearing()*Math.PI/180,c=M(-this.state.heading-a);Math.abs(c)>.001&&i._setPitchAndBearing(i.getPitch(),(a+c*Math.min(1,s*4))*180/Math.PI),i.setView(this.state.latlng,i.getZoom(),{animate:!1})}const l=r?.9:0;Math.abs(this.swing-l)>.001&&(this.swing+=(l-this.swing)*Math.min(1,s*10),o=!0),o&&b.call(this)}function Y(t){if(!(t.target.closest?.("input:not([type=checkbox], [type=radio]), select, textarea, [contenteditable]")||t.ctrlKey||t.altKey||t.metaKey)){if(t.type==="keydown"&&t.code==="Escape"){this.stop();return}y[t.code]&&(t.preventDefault(),t.type==="keydown"?this.keys.add(t.code):this.keys.delete(t.code))}}function j(){this.keys.clear()}function q(t){const e=this.layer._map;if(t.type==="pointerdown"){if(t.button!==0||t.target.closest(".leaflet-control"))return;this.drag={x:t.clientX,y:t.clientY},e.getContainer().setPointerCapture(t.pointerId)}else this.drag&&t.type==="pointermove"?(e._setPitchAndBearing(Math.max(20,Math.min(85,e.getPitch()-(t.clientY-this.drag.y)*.2)),e.getBearing()-(t.clientX-this.drag.x)*.25),this.drag={x:t.clientX,y:t.clientY}):this.drag=null}function O(){this.meshes&&b.call(this)}function K(){const t=this.layer._map;if(this.saved||!t)return;this.state.latlng=t.getCenter();const e=t.getSize().y*1.5/this.distance,i=Math.min(t.getMaxZoom(),Math.log2(e*4007501668557849e-8*Math.cos(this.state.latlng.lat*Math.PI/180)/256)),s=[];for(const o of["dragging","keyboard","doubleClickZoom","boxZoom"])t[o]?.enabled()&&s.push(o);this.saved={zoom:t.getZoom(),pitch:t.getPitch(),scrollWheelZoom:t.options.scrollWheelZoom,handlers:s};for(const o of this.saved.handlers)t[o].disable();t.options.scrollWheelZoom=this.saved.scrollWheelZoom&&"center",this.state.heading=-t.getBearing()*Math.PI/180,t.setView(this.state.latlng,i,{animate:!1}),t.setPitch(75),L.DomEvent.on(document,"keydown keyup",this.onKey),L.DomEvent.on(window,"blur",this.onBlur),L.DomEvent.on(t.getContainer(),"pointerdown pointermove pointerup pointercancel",this.onPointer),t.on("terrainchange",this.onTerrain),this.button.setAttribute("aria-pressed","true"),this.button.style.background="#e4e4e4",this.hint.style.display="",this.last=void 0,this.frame=requestAnimationFrame(this.step)}function P(){const t=this.layer._map;cancelAnimationFrame(this.frame),this.keys.clear(),this.drag=null,L.DomEvent.off(document,"keydown keyup",this.onKey),L.DomEvent.off(window,"blur",this.onBlur);for(const e of this.meshes||[])A.disposeMesh(this.layer,e);if(this.meshes=null,this.button.setAttribute("aria-pressed","false"),this.button.style.background="#fff",this.hint.style.display="none",!(!t||!this.saved)){L.DomEvent.off(t.getContainer(),"pointerdown pointermove pointerup pointercancel",this.onPointer),t.off("terrainchange",this.onTerrain),t.options.scrollWheelZoom=this.saved.scrollWheelZoom;for(const e of this.saved.handlers)t[e].enable();t.setView(this.state.latlng,this.saved.zoom,{animate:!1}),t.setPitch(this.saved.pitch),this.saved=null}}function S(){this.saved?P.call(this):K.call(this)}function G(){return this.container}function H(){this.ready=!0,this.layer._map&&this.control.addTo(this.layer._map)}function J(){this.ready&&this.control.addTo(this.layer._map)}function N(){P.call(this),this.control.remove()}export{w as blocked,G as controlOnAdd,x as local,j as onBlur,Y as onKey,J as onLayerAdd,N as onLayerRemove,q as onPointer,H as onReady,O as onTerrain,b as place,K as start,X as step,P as stop,S as toggle};
|
|
2
|
+
//# sourceMappingURL=walk.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/walk.js"],
|
|
4
|
+
"sourcesContent": ["import * as createMesh from './createMesh.js';\r\nimport * as disposeMesh from './disposeMesh.js';\r\nimport * as update from './update.js';\r\nimport { build } from './build.js';\r\nimport { getElevation } from './getElevation.js';\r\nimport { hit } from './hit.js';\r\nimport { limbs } from './limbs.js';\r\nimport { moves } from './moves.js';\r\nimport { parts } from './parts.js';\r\nimport { wrap } from './wrap.js';\r\n\r\nexport function local() {\r\n const { layer, state } = this;\r\n const map = layer._map, crs = map.options.crs, origin = crs.project(layer.location);\r\n const metres = Math.cos(layer.location.lat * Math.PI / 180);\r\n const p = crs.project(state.latlng), terrain = map._terrain3D?._terrainReady && map._terrain3D;\r\n const ground = (terrain && getElevation(terrain, state.latlng)) || 0;\r\n return [(p.x - origin.x) * metres, ground - layer.root.position[1], -(p.y - origin.y) * metres];\r\n}\r\n\r\nexport function place() {\r\n const [x, y, z] = local.call(this);\r\n // Model forward is -z; a yaw of -heading turns it to the compass heading (x east, -z north).\r\n const yaw = -this.state.heading, cos = Math.cos(yaw), sin = Math.sin(yaw);\r\n for (let i = 0; i < limbs.length; i++) {\r\n const [, px, py, sign] = limbs[i];\r\n const mesh = this.meshes[i];\r\n mesh.position[0] = x + px * cos; mesh.position[1] = y + py; mesh.position[2] = z - px * sin;\r\n mesh.rotation[0] = sign * this.swing * Math.sin(this.state.phase);\r\n mesh.rotation[1] = yaw;\r\n }\r\n update.update(this.layer);\r\n}\r\n\r\nexport function blocked(east, north, feet) {\r\n const length = Math.hypot(east, north);\r\n return length > 1e-6 && hit(this.layer, feet[0], feet[1], feet[2], east / length, -north / length, length + 0.3);\r\n}\r\n\r\nexport function step(now) {\r\n const layer = this.layer, map = layer._map;\r\n this.frame = requestAnimationFrame(this.step);\r\n const dt = Math.min(0.1, (now - (this.last ?? now)) / 1000);\r\n this.last = now;\r\n if (!layer.renderer) return;\r\n let changed = false;\r\n if (!this.meshes) {\r\n this.meshes = [];\r\n for (const [part] of limbs) this.meshes.push(createMesh.createMesh(layer, build(parts[part])));\r\n changed = true;\r\n }\r\n let forward = 0, turn = 0;\r\n for (const key of this.keys) { forward += moves[key]?.[0] || 0; turn += moves[key]?.[1] || 0; }\r\n forward = Math.sign(forward); turn = Math.sign(turn);\r\n if (turn) { this.state.heading = wrap(this.state.heading + turn * 2.5 * dt); changed = true; }\r\n if (forward) {\r\n const metres = forward * this.speed * dt, { lat, lng } = this.state.latlng, { position, scale } = layer.root;\r\n let east = Math.sin(this.state.heading) * metres, north = Math.cos(this.state.heading) * metres;\r\n const feet = local.call(this);\r\n for (let i = 0; i < feet.length; i++) feet[i] = position[i] + scale[i] * feet[i];\r\n // World x is east, z south; keep 0.3 m from walls and slide along the one in the way.\r\n const wall = blocked.call(this, east, north, feet);\r\n if (wall) {\r\n const into = east * wall[0] - north * wall[1];\r\n east -= into * wall[0]; north += into * wall[1];\r\n if (blocked.call(this, east, north, feet)) east = north = 0;\r\n }\r\n this.state.latlng = new L.LatLng(lat + north / 111320, lng + east / (111320 * Math.cos(lat * Math.PI / 180)));\r\n this.state.phase += Math.hypot(east, north) / 1.6 * Math.PI;\r\n changed = true;\r\n }\r\n if (forward || turn) {\r\n // The camera (looking along -bearing) swings back behind the walker.\r\n const bearing = map.getBearing() * Math.PI / 180, behind = wrap(-this.state.heading - bearing);\r\n if (Math.abs(behind) > 1e-3) map._setPitchAndBearing(map.getPitch(), (bearing + behind * Math.min(1, dt * 4)) * 180 / Math.PI);\r\n map.setView(this.state.latlng, map.getZoom(), { animate: false });\r\n }\r\n const target = forward ? 0.9 : 0;\r\n if (Math.abs(this.swing - target) > 1e-3) { this.swing += (target - this.swing) * Math.min(1, dt * 10); changed = true; }\r\n if (changed) place.call(this);\r\n}\r\n\r\nexport function onKey(event) {\r\n // Text fields and sliders keep their keys; buttons and checkboxes don't.\r\n if (event.target.closest?.('input:not([type=checkbox], [type=radio]), select, textarea, [contenteditable]') ||\r\n event.ctrlKey || event.altKey || event.metaKey) return;\r\n if (event.type === 'keydown' && event.code === 'Escape') { this.stop(); return; }\r\n if (!moves[event.code]) return;\r\n event.preventDefault();\r\n if (event.type === 'keydown') this.keys.add(event.code); else this.keys.delete(event.code);\r\n}\r\n\r\nexport function onBlur() {\r\n this.keys.clear();\r\n}\r\n\r\nexport function onPointer(event) {\r\n // Dragging only turns the camera around the walker: horizontal = bearing, vertical = pitch.\r\n const map = this.layer._map;\r\n if (event.type === 'pointerdown') {\r\n if (event.button !== 0 || event.target.closest('.leaflet-control')) return;\r\n this.drag = { x: event.clientX, y: event.clientY };\r\n map.getContainer().setPointerCapture(event.pointerId);\r\n } else if (this.drag && event.type === 'pointermove') {\r\n map._setPitchAndBearing(Math.max(20, Math.min(85, map.getPitch() - (event.clientY - this.drag.y) * 0.2)),\r\n map.getBearing() - (event.clientX - this.drag.x) * 0.25);\r\n this.drag = { x: event.clientX, y: event.clientY };\r\n } else this.drag = null;\r\n}\r\n\r\nexport function onTerrain() {\r\n if (this.meshes) place.call(this);\r\n}\r\n\r\nexport function start() {\r\n const map = this.layer._map;\r\n if (this.saved || !map) return;\r\n this.state.latlng = map.getCenter();\r\n // Zoom whose camera distance (1.5 viewport heights, as in scene/render.js) is about `distance` metres behind the walker.\r\n const pixelsPerMetre = map.getSize().y * 1.5 / this.distance;\r\n const zoom = Math.min(map.getMaxZoom(), Math.log2(pixelsPerMetre * 40075016.68557849 * Math.cos(this.state.latlng.lat * Math.PI / 180) / 256));\r\n const handlers = [];\r\n for (const name of ['dragging', 'keyboard', 'doubleClickZoom', 'boxZoom']) {\r\n if (map[name]?.enabled()) handlers.push(name);\r\n }\r\n this.saved = {\r\n zoom: map.getZoom(), pitch: map.getPitch(), scrollWheelZoom: map.options.scrollWheelZoom, handlers\r\n };\r\n for (const name of this.saved.handlers) map[name].disable();\r\n // Wheel zoom moves the camera closer or farther, keeping the walker centred.\r\n map.options.scrollWheelZoom = this.saved.scrollWheelZoom && 'center';\r\n this.state.heading = -map.getBearing() * Math.PI / 180;\r\n map.setView(this.state.latlng, zoom, { animate: false });\r\n map.setPitch(75);\r\n L.DomEvent.on(document, 'keydown keyup', this.onKey);\r\n L.DomEvent.on(window, 'blur', this.onBlur);\r\n L.DomEvent.on(map.getContainer(), 'pointerdown pointermove pointerup pointercancel', this.onPointer);\r\n map.on('terrainchange', this.onTerrain);\r\n this.button.setAttribute('aria-pressed', 'true');\r\n this.button.style.background = '#e4e4e4';\r\n this.hint.style.display = '';\r\n this.last = undefined;\r\n this.frame = requestAnimationFrame(this.step);\r\n}\r\n\r\nexport function stop() {\r\n const map = this.layer._map;\r\n cancelAnimationFrame(this.frame);\r\n this.keys.clear(); this.drag = null;\r\n L.DomEvent.off(document, 'keydown keyup', this.onKey);\r\n L.DomEvent.off(window, 'blur', this.onBlur);\r\n for (const mesh of this.meshes || []) disposeMesh.disposeMesh(this.layer, mesh);\r\n this.meshes = null;\r\n this.button.setAttribute('aria-pressed', 'false');\r\n this.button.style.background = '#fff';\r\n this.hint.style.display = 'none';\r\n if (!map || !this.saved) return;\r\n L.DomEvent.off(map.getContainer(), 'pointerdown pointermove pointerup pointercancel', this.onPointer);\r\n map.off('terrainchange', this.onTerrain);\r\n map.options.scrollWheelZoom = this.saved.scrollWheelZoom;\r\n for (const name of this.saved.handlers) map[name].enable();\r\n map.setView(this.state.latlng, this.saved.zoom, { animate: false });\r\n map.setPitch(this.saved.pitch);\r\n this.saved = null;\r\n}\r\n\r\nexport function toggle() {\r\n if (this.saved) stop.call(this); else start.call(this);\r\n}\r\n\r\nexport function controlOnAdd() {\r\n return this.container;\r\n}\r\n\r\nexport function onReady() {\r\n this.ready = true;\r\n if (this.layer._map) this.control.addTo(this.layer._map);\r\n}\r\n\r\nexport function onLayerAdd() {\r\n if (this.ready) this.control.addTo(this.layer._map);\r\n}\r\n\r\nexport function onLayerRemove() {\r\n stop.call(this);\r\n this.control.remove();\r\n}\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["createMesh", "disposeMesh", "update", "build", "getElevation", "hit", "limbs", "moves", "parts", "wrap", "local", "layer", "state", "map", "crs", "origin", "metres", "p", "terrain", "ground", "place", "x", "y", "z", "yaw", "cos", "sin", "i", "px", "py", "sign", "mesh", "blocked", "east", "north", "feet", "length", "step", "now", "dt", "changed", "part", "forward", "turn", "key", "lat", "lng", "position", "scale", "wall", "into", "bearing", "behind", "target", "onKey", "event", "onBlur", "onPointer", "onTerrain", "start", "pixelsPerMetre", "zoom", "handlers", "name", "stop", "toggle", "controlOnAdd", "onReady", "onLayerAdd", "onLayerRemove"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function u(a,t){const s=new Float32Array(a.length*8);return a.forEach(({position:[o,n,r],radius:c,color:h,flux:i},l)=>{const e=t[3]*o+t[7]*n+t[11]*r+t[15];s.set([(t[0]*o+t[4]*n+t[8]*r+t[12])/e,(t[1]*o+t[5]*n+t[9]*r+t[13])/e,(t[2]*o+t[6]*n+t[10]*r+t[14])/e,c,...h,i/(4*Math.PI)*.03],l*8)}),s}export{u as worldLights};
|
|
2
|
+
//# sourceMappingURL=worldLights.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/worldLights.js"],
|
|
4
|
+
"sourcesContent": ["\n/** World-space [x, y, z, radius, r, g, b, intensity] for one mesh's point lights. */\nexport function worldLights(lights, m) {\n const values = new Float32Array(lights.length * 8);\n lights.forEach(({\n position: [x, y, z],\n radius,\n color,\n flux\n }, i) => {\n const w = m[3] * x + m[7] * y + m[11] * z + m[15];\n values.set(\n [\n (m[0] * x + m[4] * y + m[8] * z + m[12]) / w,\n (m[1] * x + m[5] * y + m[9] * z + m[13]) / w,\n (m[2] * x + m[6] * y + m[10] * z + m[14]) / w,\n radius,\n ...color,\n flux / (4 * Math.PI) * 0.03\n ],\n i * 8\n );\n });\n return values;\n}"],
|
|
5
|
+
"mappings": "AAEO,SAASA,EAAYC,EAAQC,EAAG,CACrC,MAAMC,EAAS,IAAI,aAAaF,EAAO,OAAS,CAAC,EACjD,OAAAA,EAAO,QAAQ,CAAC,CACd,SAAU,CAACG,EAAGC,EAAGC,CAAC,EAClB,OAAAC,EACA,MAAAC,EACA,KAAAC,CACF,EAAGC,IAAM,CACP,MAAMC,EAAIT,EAAE,CAAC,EAAIE,EAAIF,EAAE,CAAC,EAAIG,EAAIH,EAAE,EAAE,EAAII,EAAIJ,EAAE,EAAE,EAChDC,EAAO,IACL,EACGD,EAAE,CAAC,EAAIE,EAAIF,EAAE,CAAC,EAAIG,EAAIH,EAAE,CAAC,EAAII,EAAIJ,EAAE,EAAE,GAAKS,GAC1CT,EAAE,CAAC,EAAIE,EAAIF,EAAE,CAAC,EAAIG,EAAIH,EAAE,CAAC,EAAII,EAAIJ,EAAE,EAAE,GAAKS,GAC3CT,EAAE,CAAC,EAAIE,EAAIF,EAAE,CAAC,EAAIG,EAAIH,EAAE,EAAE,EAAII,EAAIJ,EAAE,EAAE,GAAKS,EAC5CJ,EACA,GAAGC,EACHC,GAAQ,EAAI,KAAK,IAAM,GACxB,EACCC,EAAI,CACP,CACF,CAAC,EACMP,CACT",
|
|
6
|
+
"names": ["worldLights", "lights", "m", "values", "x", "y", "z", "radius", "color", "flux", "i", "w"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/wrap.js"],
|
|
4
|
+
"sourcesContent": ["export const wrap = angle => Math.atan2(Math.sin(angle), Math.cos(angle));\n"],
|
|
5
|
+
"mappings": "AAAO,MAAMA,EAAOC,GAAS,KAAK,MAAM,KAAK,IAAIA,CAAK,EAAG,KAAK,IAAIA,CAAK,CAAC",
|
|
6
|
+
"names": ["wrap", "angle"]
|
|
7
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,45 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leaflet-city-mapper",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.0.2",
|
|
4
|
+
"description": "A small 3D rendering engine for leaflet",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/leaflet-city-mapper.js",
|
|
7
|
+
"browser": "dist/leaflet-city-mapper.js",
|
|
8
|
+
"module": "src/index.js",
|
|
9
|
+
"scripts": {
|
|
10
|
+
"dev": "node build/dev.js",
|
|
11
|
+
"build": "node build/build.js",
|
|
12
|
+
"test": "node build/test.js",
|
|
13
|
+
"pmtiles": "node build/pmtiles.js",
|
|
14
|
+
"version": "npm run build && git add -A dist"
|
|
15
|
+
},
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "https://github.com/Raruto/leaflet-city-mapper.git"
|
|
19
|
+
},
|
|
20
|
+
"keywords": [
|
|
21
|
+
"leaflet",
|
|
22
|
+
"3d",
|
|
23
|
+
"rotation",
|
|
24
|
+
"webgpu",
|
|
25
|
+
"terrain",
|
|
26
|
+
"pmtiles"
|
|
27
|
+
],
|
|
28
|
+
"author": {
|
|
29
|
+
"name": "Raruto",
|
|
30
|
+
"url": "https://github.com/Raruto/leaflet-city-mapper"
|
|
31
|
+
},
|
|
32
|
+
"license": "GPL-3.0",
|
|
33
|
+
"bugs": {
|
|
34
|
+
"url": "https://github.com/Raruto/leaflet-city-mapper/issues"
|
|
35
|
+
},
|
|
36
|
+
"homepage": "https://github.com/Raruto/leaflet-city-mapper#readme",
|
|
37
|
+
"peerDependencies": {
|
|
38
|
+
"leaflet": "^1.9.3 || ^2.0.0-alpha.1"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@cucumber/cucumber": "^10.3.1",
|
|
42
|
+
"esbuild": "^0.28.2",
|
|
43
|
+
"playwright": "^1.64.1"
|
|
44
|
+
}
|
|
45
|
+
}
|