leaflet-city-mapper 0.0.1 → 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/README.md +15 -13
- package/cucumber.mjs +4 -0
- package/dist/leaflet-city-mapper.js +1 -1
- package/dist/leaflet-city-mapper.js.map +4 -4
- 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 +0 -1
- package/dist/utils/geometry.js.map +4 -4
- 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/{shaders.js → materialShaders.js} +16 -8
- 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 +1 -1
- package/dist/utils/traffic.js.map +3 -3
- 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 +1 -1
- package/dist/utils/vehicles.js.map +3 -3
- package/dist/utils/vertexNormals.js +2 -0
- package/dist/utils/vertexNormals.js.map +7 -0
- package/dist/utils/walk.js +1 -1
- package/dist/utils/walk.js.map +3 -3
- 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 +2 -4
- package/src/index.js +365 -50
- 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 +0 -254
- 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/{picking.js → intersectMeshes.js} +121 -119
- package/src/utils/isClockWise.js +12 -0
- package/src/utils/lampPostGeometry.js +26 -0
- package/src/utils/lightGeometry.js +22 -0
- package/src/utils/{lighting.js → lightGrid.js} +50 -51
- package/src/utils/limbs.js +9 -0
- package/src/{scene/model.js → utils/loadModel.js} +37 -24
- package/src/utils/loadSource.js +17 -0
- package/src/utils/loadTerrain.js +65 -0
- package/src/utils/mapCamera.js +432 -0
- package/src/utils/{shaders.js → materialShaders.js} +243 -237
- 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/{scene/sources.js → utils/pump.js} +59 -98
- 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/{scene → utils}/render.js +112 -173
- 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 +310 -85
- 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/{control.js → underEntry.js} +1 -2
- 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 -69
- package/src/utils/vertexNormals.js +30 -0
- package/src/utils/walk.js +181 -66
- package/src/utils/white.js +1 -0
- package/src/utils/worldLights.js +25 -0
- package/src/utils/wrap.js +1 -0
- package/dist/scene/gpu.js +0 -3
- package/dist/scene/gpu.js.map +0 -7
- package/dist/scene/lighting.js +0 -9
- package/dist/scene/lighting.js.map +0 -7
- package/dist/scene/model.js +0 -2
- package/dist/scene/model.js.map +0 -7
- package/dist/scene/picking.js +0 -2
- package/dist/scene/picking.js.map +0 -7
- package/dist/scene/pmtiles.js +0 -2
- package/dist/scene/pmtiles.js.map +0 -7
- package/dist/scene/render.js +0 -15
- package/dist/scene/render.js.map +0 -7
- package/dist/scene/sources.js +0 -2
- package/dist/scene/sources.js.map +0 -7
- package/dist/types/3d.js +0 -2
- package/dist/types/3d.js.map +0 -7
- package/dist/types/geojson.js +0 -2
- package/dist/types/geojson.js.map +0 -7
- package/dist/types/pmtiles.js +0 -2
- package/dist/types/pmtiles.js.map +0 -7
- package/dist/types/sunlight.js +0 -2
- package/dist/types/sunlight.js.map +0 -7
- package/dist/types/terrain.js +0 -24
- package/dist/types/terrain.js.map +0 -7
- package/dist/types/traffic.js +0 -41
- package/dist/types/traffic.js.map +0 -7
- package/dist/types/walk.js +0 -2
- package/dist/types/walk.js.map +0 -7
- package/dist/utils/control.js +0 -2
- package/dist/utils/control.js.map +0 -7
- package/dist/utils/lighting.js +0 -2
- package/dist/utils/lighting.js.map +0 -7
- package/dist/utils/model.js +0 -2
- package/dist/utils/model.js.map +0 -7
- package/dist/utils/picking.js +0 -2
- package/dist/utils/picking.js.map +0 -7
- package/dist/utils/pmtiles.js +0 -2
- package/dist/utils/pmtiles.js.map +0 -7
- package/dist/utils/scene.js +0 -2
- package/dist/utils/scene.js.map +0 -7
- package/dist/utils/shaders.js.map +0 -7
- package/dist/utils/sun.js +0 -2
- package/dist/utils/sun.js.map +0 -7
- package/dist/utils/terrain.js +0 -2
- package/dist/utils/terrain.js.map +0 -7
- package/src/scene/gpu.js +0 -438
- package/src/scene/lighting.js +0 -193
- package/src/scene/picking.js +0 -150
- package/src/scene/pmtiles.js +0 -94
- package/src/types/3d.js +0 -337
- package/src/types/geojson.js +0 -42
- package/src/types/pmtiles.js +0 -143
- package/src/types/sunlight.js +0 -142
- package/src/types/terrain.js +0 -331
- package/src/types/traffic.js +0 -356
- package/src/types/walk.js +0 -219
- package/src/utils/model.js +0 -178
- package/src/utils/pmtiles.js +0 -79
- package/src/utils/scene.js +0 -102
- package/src/utils/sun.js +0 -71
- package/src/utils/terrain.js +0 -78
|
@@ -1,119 +1,121 @@
|
|
|
1
|
-
import { computeBounds } from
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
localOrigin.
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
localDirection.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
const
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
direction[
|
|
104
|
-
1
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
worldPoint[
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
}
|
|
1
|
+
import { computeBounds } from "./computeBounds.js";
|
|
2
|
+
|
|
3
|
+
const sub = (a, b) => a.map((v, i) => v - b[i]);
|
|
4
|
+
const 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]];
|
|
5
|
+
const dot = (a, b) => a.reduce((sum, v, i) => sum + v * b[i], 0);
|
|
6
|
+
|
|
7
|
+
/** Nearest triangle hit per mesh, sorted by world-space distance. */
|
|
8
|
+
|
|
9
|
+
export function intersectMeshes(ray, meshes, night = 0) {
|
|
10
|
+
const hits = [],
|
|
11
|
+
a = [0, 0, 0],
|
|
12
|
+
b = [0, 0, 0],
|
|
13
|
+
c = [0, 0, 0];
|
|
14
|
+
for (const mesh of meshes) {
|
|
15
|
+
// Test in mesh-local space; compare distances only after returning to shared world space.
|
|
16
|
+
const inverse = new DOMMatrix(mesh.worldMatrix).inverse();
|
|
17
|
+
const inverseValues = inverse.toFloat64Array();
|
|
18
|
+
if (![...inverseValues].every(Number.isFinite)) {
|
|
19
|
+
throw new Error('Singular 3D transform');
|
|
20
|
+
}
|
|
21
|
+
const localOrigin = new DOMPoint(...ray.origin, 1).matrixTransform(inverse);
|
|
22
|
+
const origin = [
|
|
23
|
+
localOrigin.x / localOrigin.w,
|
|
24
|
+
localOrigin.y / localOrigin.w,
|
|
25
|
+
localOrigin.z / localOrigin.w
|
|
26
|
+
];
|
|
27
|
+
const localDirection = new DOMPoint(...ray.direction, 0).matrixTransform(inverse);
|
|
28
|
+
const direction = [
|
|
29
|
+
localDirection.x,
|
|
30
|
+
localDirection.y,
|
|
31
|
+
localDirection.z
|
|
32
|
+
];
|
|
33
|
+
const directionLength = Math.hypot(...direction) || 1;
|
|
34
|
+
direction[0] /= directionLength;
|
|
35
|
+
direction[1] /= directionLength;
|
|
36
|
+
direction[2] /= directionLength;
|
|
37
|
+
// AABB slab test reuses the same local ray as the triangle test.
|
|
38
|
+
if (!mesh.geometry.bounds) {
|
|
39
|
+
computeBounds(mesh.geometry);
|
|
40
|
+
}
|
|
41
|
+
let near = 0, far = Infinity;
|
|
42
|
+
for (let i = 0; i < 3; i++) {
|
|
43
|
+
if (Math.abs(direction[i]) < 1e-12) {
|
|
44
|
+
if (origin[i] < mesh.geometry.bounds.min[i] || origin[i] > mesh.geometry.bounds.max[i]) {
|
|
45
|
+
far = -Infinity;
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
} else {
|
|
49
|
+
const a = (mesh.geometry.bounds.min[i] - origin[i]) / direction[i], b = (mesh.geometry.bounds.max[i] - origin[i]) / direction[i];
|
|
50
|
+
near = Math.max(near, Math.min(a, b));
|
|
51
|
+
far = Math.min(far, Math.max(a, b));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (far < near) {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
const { position, index } = mesh.geometry.attributes;
|
|
58
|
+
let closest = Infinity, faceIndex;
|
|
59
|
+
for (let i = 0; i < (index?.count || position.count); i += 3) {
|
|
60
|
+
const ai = (index ? index.data[i] : i) * position.size;
|
|
61
|
+
const bi = (index ? index.data[i + 1] : i + 1) * position.size;
|
|
62
|
+
const ci = (index ? index.data[i + 2] : i + 2) * position.size;
|
|
63
|
+
a[0] = position.data[ai];
|
|
64
|
+
a[1] = position.data[ai + 1];
|
|
65
|
+
a[2] = position.data[ai + 2];
|
|
66
|
+
b[0] = position.data[bi];
|
|
67
|
+
b[1] = position.data[bi + 1];
|
|
68
|
+
b[2] = position.data[bi + 2];
|
|
69
|
+
c[0] = position.data[ci];
|
|
70
|
+
c[1] = position.data[ci + 1];
|
|
71
|
+
c[2] = position.data[ci + 2];
|
|
72
|
+
// Moller-Trumbore: barycentric triangle coordinates and local ray distance.
|
|
73
|
+
const e = sub(b, a),
|
|
74
|
+
f = sub(c, a),
|
|
75
|
+
p = cross(direction, f),
|
|
76
|
+
det = dot(e, p);
|
|
77
|
+
if (mesh.program.cullMode === 'none' || mesh.program.cullFace === null
|
|
78
|
+
? Math.abs(det) < 1e-9 : det < 1e-9) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
const t = sub(origin, a), u = dot(t, p) / det;
|
|
82
|
+
if (u < 0 || u > 1) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
const q = cross(t, e), v = dot(direction, q) / det;
|
|
86
|
+
if (v < 0 || u + v > 1) {
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
if (mesh.program.nightLight) {
|
|
90
|
+
const uv = mesh.geometry.attributes.uv.data;
|
|
91
|
+
const ids = index ? [index.data[i], index.data[i + 1], index.data[i + 2]] : [i, i + 1, i + 2];
|
|
92
|
+
const x = uv[ids[0] * 2] * (1 - u - v) + uv[ids[1] * 2] * u + uv[ids[2] * 2] * v;
|
|
93
|
+
const y = uv[ids[0] * 2 + 1] * (1 - u - v) + uv[ids[1] * 2 + 1] * u + uv[ids[2] * 2 + 1] * v;
|
|
94
|
+
if (x <= 2 && (!night || x * x + y * y > 0.9)) continue;
|
|
95
|
+
}
|
|
96
|
+
const distance = dot(f, q) / det;
|
|
97
|
+
if (distance > 0 && distance < closest) {
|
|
98
|
+
closest = distance; faceIndex = i / 3;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (faceIndex === undefined) continue;
|
|
102
|
+
const point = new DOMPoint(
|
|
103
|
+
direction[0] * closest + origin[0],
|
|
104
|
+
direction[1] * closest + origin[1],
|
|
105
|
+
direction[2] * closest + origin[2],
|
|
106
|
+
1
|
|
107
|
+
).matrixTransform(new DOMMatrix(mesh.worldMatrix));
|
|
108
|
+
const worldPoint = [point.x / point.w, point.y / point.w, point.z / point.w];
|
|
109
|
+
hits.push({
|
|
110
|
+
faceIndex,
|
|
111
|
+
object: mesh,
|
|
112
|
+
point: worldPoint,
|
|
113
|
+
distance: Math.hypot(
|
|
114
|
+
worldPoint[0] - ray.origin[0],
|
|
115
|
+
worldPoint[1] - ray.origin[1],
|
|
116
|
+
worldPoint[2] - ray.origin[2]
|
|
117
|
+
)
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return hits.sort((a, b) => a.distance - b.distance);
|
|
121
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @returns {boolean} Whether the `{x, y}` points are in clockwise order.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export function isClockWise(points) {
|
|
6
|
+
let area = 0;
|
|
7
|
+
for (let i = 0; i < points.length; i++) {
|
|
8
|
+
const a = points[i], b = points[(i + 1) % points.length];
|
|
9
|
+
area += a.x * b.y - b.x * a.y;
|
|
10
|
+
}
|
|
11
|
+
return area < 0;
|
|
12
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { parseColor } from "./parseColor.js";
|
|
2
|
+
|
|
3
|
+
/** Schematic support and lamp head; wall-mounted fixtures do not get an invented pole. */
|
|
4
|
+
|
|
5
|
+
export function lampPostGeometry(point, style, addTriangle) {
|
|
6
|
+
const color = parseColor(0x50565a), radius = style.poleRadius;
|
|
7
|
+
if (!Number.isFinite(radius) || radius <= 0) {
|
|
8
|
+
throw new Error('Invalid lamp pole radius');
|
|
9
|
+
}
|
|
10
|
+
const ring = r => Array.from({ length: 6 }, (_, i) => ({
|
|
11
|
+
x: point.x + Math.cos(i * Math.PI / 3) * r,
|
|
12
|
+
y: point.y + Math.sin(i * Math.PI / 3) * r, ground: point.ground, uv: [3, 3],
|
|
13
|
+
}));
|
|
14
|
+
const center = { ...point, uv: [3, 3] };
|
|
15
|
+
for (const [r, low, high] of [[radius, 0, style.top], [radius * 2.5, style.top - 0.25, style.top + 0.15]]) {
|
|
16
|
+
const points = ring(r);
|
|
17
|
+
for (let i = 0; i < 6; i++) {
|
|
18
|
+
const a = points[i], b = points[(i + 1) % 6], angle = (i + 0.5) * Math.PI / 3;
|
|
19
|
+
const nx = Math.cos(angle), nz = -Math.sin(angle);
|
|
20
|
+
addTriangle(a, low, b, low, b, high, nx, 0, nz, color);
|
|
21
|
+
addTriangle(a, low, b, high, a, high, nx, 0, nz, color);
|
|
22
|
+
addTriangle(center, high, a, high, b, high, 0, 1, 0, color);
|
|
23
|
+
addTriangle(center, low, b, low, a, low, 0, -1, 0, color);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { parseColor } from "./parseColor.js";
|
|
2
|
+
|
|
3
|
+
/** Three crossed emitter discs; illumination itself is evaluated on receiving surfaces. */
|
|
4
|
+
|
|
5
|
+
export function lightGeometry(point, style, addTriangle) {
|
|
6
|
+
if (!Number.isFinite(style.lightRadius) || style.lightRadius <= 0) throw new Error('Invalid light radius');
|
|
7
|
+
const color = parseColor(style.color);
|
|
8
|
+
const quad = (a, b, c, d, height, normal) => {
|
|
9
|
+
addTriangle(a, height, b, height, c, height, ...normal, color);
|
|
10
|
+
addTriangle(a, height, c, height, d, height, ...normal, color);
|
|
11
|
+
};
|
|
12
|
+
const r = 0.65;
|
|
13
|
+
const emitter = (u, v, axis) => ({
|
|
14
|
+
x: point.x + (axis === 2 ? 0 : u * r),
|
|
15
|
+
y: point.y + (axis === 1 ? 0 : axis === 2 ? u * r : v * r),
|
|
16
|
+
ground: point.ground + (axis === 0 ? 0 : v * r), uv: [u, v],
|
|
17
|
+
});
|
|
18
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
19
|
+
quad(emitter(-1, -1, axis), emitter(1, -1, axis), emitter(1, 1, axis), emitter(-1, 1, axis),
|
|
20
|
+
style.top, axis === 0 ? [0, 1, 0] : axis === 1 ? [0, 0, 1] : [1, 0, 0]);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -1,51 +1,50 @@
|
|
|
1
|
-
/** Pack world-space point lights into the shader's spatial grid. */
|
|
2
|
-
export function lightGrid(packed, maxBytes) {
|
|
3
|
-
const count = packed.reduce((sum, values) => sum + values.length / 8, 0), cellSize = 32;
|
|
4
|
-
let data = new Float32Array(8);
|
|
5
|
-
if (count) {
|
|
6
|
-
let minX = Infinity, minZ = Infinity, maxX = -Infinity, maxZ = -Infinity;
|
|
7
|
-
for (const values of packed) for (let i = 0; i < values.length; i += 8) {
|
|
8
|
-
minX = Math.min(minX, values[i] - values[i + 3]);
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
}
|
|
1
|
+
/** Pack world-space point lights into the shader's spatial grid. */
|
|
2
|
+
export function lightGrid(packed, maxBytes) {
|
|
3
|
+
const count = packed.reduce((sum, values) => sum + values.length / 8, 0), cellSize = 32;
|
|
4
|
+
let data = new Float32Array(8);
|
|
5
|
+
if (count) {
|
|
6
|
+
let minX = Infinity, minZ = Infinity, maxX = -Infinity, maxZ = -Infinity;
|
|
7
|
+
for (const values of packed) for (let i = 0; i < values.length; i += 8) {
|
|
8
|
+
minX = Math.min(minX, values[i] - values[i + 3]);
|
|
9
|
+
maxX = Math.max(maxX, values[i] + values[i + 3]);
|
|
10
|
+
minZ = Math.min(minZ, values[i + 2] - values[i + 3]);
|
|
11
|
+
maxZ = Math.max(maxZ, values[i + 2] + values[i + 3]);
|
|
12
|
+
}
|
|
13
|
+
const columns = Math.ceil((maxX - minX) / cellSize) + 1,
|
|
14
|
+
rows = Math.ceil((maxZ - minZ) / cellSize) + 1;
|
|
15
|
+
const each = callback => {
|
|
16
|
+
for (const values of packed) for (let i = 0; i < values.length; i += 8) {
|
|
17
|
+
const radius = values[i + 3],
|
|
18
|
+
x = values[i] - minX,
|
|
19
|
+
z = values[i + 2] - minZ;
|
|
20
|
+
for (let y = Math.floor((z - radius) / cellSize); y <= Math.floor((z + radius) / cellSize); y++) {
|
|
21
|
+
for (let c = Math.floor((x - radius) / cellSize); c <= Math.floor((x + radius) / cellSize); c++) {
|
|
22
|
+
callback(y * columns + c, values, i);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
// Counting sort: count the lights of each cell, then fill each cell's slice.
|
|
28
|
+
const counts = new Uint32Array(columns * rows),
|
|
29
|
+
next = new Uint32Array(columns * rows);
|
|
30
|
+
each(key => counts[key]++);
|
|
31
|
+
const entries = counts.reduce((sum, value) => sum + value, 0);
|
|
32
|
+
const length = (2 + columns * rows + entries * 2) * 4;
|
|
33
|
+
if (length * 4 > maxBytes) {
|
|
34
|
+
throw new Error('Streetlight grid exceeds GPU storage limit');
|
|
35
|
+
}
|
|
36
|
+
data = new Float32Array(length);
|
|
37
|
+
data.set([minX, minZ, cellSize, columns, rows, count, 0, 0]);
|
|
38
|
+
let offset = 2 + columns * rows;
|
|
39
|
+
for (let key = 0; key < counts.length; key++) if (counts[key]) {
|
|
40
|
+
data[(2 + key) * 4] = next[key] = offset;
|
|
41
|
+
data[(2 + key) * 4 + 1] = counts[key];
|
|
42
|
+
offset += counts[key] * 2;
|
|
43
|
+
}
|
|
44
|
+
each((key, values, i) => {
|
|
45
|
+
for (let j = 0, o = next[key] * 4; j < 8; j++) data[o + j] = values[i + j];
|
|
46
|
+
next[key] += 2;
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
return { data, count };
|
|
50
|
+
}
|
|
@@ -1,11 +1,19 @@
|
|
|
1
|
-
import { decodeModel
|
|
2
|
-
import { emptyNode
|
|
1
|
+
import { decodeModel } from './decodeModel.js';
|
|
2
|
+
import { emptyNode } from './emptyNode.js';
|
|
3
|
+
import { nodeMatrix } from './nodeMatrix.js';
|
|
4
|
+
import { readAccessor } from './readAccessor.js';
|
|
5
|
+
import { setParent } from './setParent.js';
|
|
6
|
+
import { textureSampler } from './textureSampler.js';
|
|
7
|
+
import { vertexNormals } from './vertexNormals.js';
|
|
8
|
+
import { createProgram } from './createProgram.js';
|
|
9
|
+
import { conformModelToTerrain } from './conformModelToTerrain.js';
|
|
3
10
|
|
|
4
11
|
/** glTF/GLB model loading. */
|
|
5
12
|
/** Load the configured GLB/glTF (static triangles) under `root`; GPU resources need attachment. */
|
|
13
|
+
|
|
6
14
|
export async function loadModel(backend) {
|
|
7
15
|
await backend._added.promise;
|
|
8
|
-
const url
|
|
16
|
+
const url = new URL(backend.modelUrl, document.baseURI).href;
|
|
9
17
|
const response = await fetch(url);
|
|
10
18
|
if (!response.ok) {
|
|
11
19
|
throw new Error(`Unable to load model: HTTP ${response.status}`);
|
|
@@ -13,7 +21,7 @@ export async function loadModel(backend) {
|
|
|
13
21
|
const data = await response.arrayBuffer();
|
|
14
22
|
const description = decodeModel(data);
|
|
15
23
|
const directory = new URL('.', url).href;
|
|
16
|
-
await Promise.all((description.buffers || []).map(async buffer => {
|
|
24
|
+
await Promise.all((description.buffers || []).map(async (buffer) => {
|
|
17
25
|
if (buffer.binary) {
|
|
18
26
|
return;
|
|
19
27
|
}
|
|
@@ -24,7 +32,7 @@ export async function loadModel(backend) {
|
|
|
24
32
|
buffer.binary = await response.arrayBuffer();
|
|
25
33
|
}));
|
|
26
34
|
await backend._added.promise;
|
|
27
|
-
const images = await Promise.all((description.images || []).map(async image => {
|
|
35
|
+
const images = await Promise.all((description.images || []).map(async (image) => {
|
|
28
36
|
let blob;
|
|
29
37
|
if (image.bufferView !== undefined) {
|
|
30
38
|
const view = description.bufferViews[image.bufferView];
|
|
@@ -39,6 +47,7 @@ export async function loadModel(backend) {
|
|
|
39
47
|
// Preserve straight alpha and raw samples; GPU sRGB formats do color decoding.
|
|
40
48
|
return createImageBitmap(blob, { premultiplyAlpha: 'none', colorSpaceConversion: 'none' });
|
|
41
49
|
}));
|
|
50
|
+
await backend._map?._terrain3D?._terrainPromise;
|
|
42
51
|
const textures = new Map();
|
|
43
52
|
const textureFor = (reference, color = false) => {
|
|
44
53
|
if (!reference) return null;
|
|
@@ -66,7 +75,7 @@ export async function loadModel(backend) {
|
|
|
66
75
|
format,
|
|
67
76
|
srgb: color,
|
|
68
77
|
image,
|
|
69
|
-
flipY:
|
|
78
|
+
flipY: false,
|
|
70
79
|
uploaded: null,
|
|
71
80
|
});
|
|
72
81
|
}
|
|
@@ -76,19 +85,19 @@ export async function loadModel(backend) {
|
|
|
76
85
|
const materials = (description.materials || []).map(material => {
|
|
77
86
|
const pbr = material.pbrMetallicRoughness || {};
|
|
78
87
|
return {
|
|
79
|
-
color:
|
|
80
|
-
opacity:
|
|
81
|
-
metallic:
|
|
82
|
-
roughness:
|
|
83
|
-
baseTexture:
|
|
84
|
-
metalTexture:
|
|
85
|
-
emissiveTexture:
|
|
86
|
-
occlusionTexture:
|
|
87
|
-
emissive:
|
|
88
|
+
color: (pbr.baseColorFactor || [1, 1, 1, 1]).slice(0, 3),
|
|
89
|
+
opacity: pbr.baseColorFactor?.[3] ?? 1,
|
|
90
|
+
metallic: pbr.metallicFactor ?? 1,
|
|
91
|
+
roughness: pbr.roughnessFactor ?? 1,
|
|
92
|
+
baseTexture: textureFor(pbr.baseColorTexture, true),
|
|
93
|
+
metalTexture: textureFor(pbr.metallicRoughnessTexture),
|
|
94
|
+
emissiveTexture: textureFor(material.emissiveTexture, true),
|
|
95
|
+
occlusionTexture: textureFor(material.occlusionTexture),
|
|
96
|
+
emissive: material.emissiveFactor || [0, 0, 0],
|
|
88
97
|
occlusionStrength: material.occlusionTexture?.strength ?? 1,
|
|
89
|
-
alphaMode:
|
|
90
|
-
alphaCutoff:
|
|
91
|
-
doubleSided:
|
|
98
|
+
alphaMode: backend.options.alphaMode || material.alphaMode || 'OPAQUE',
|
|
99
|
+
alphaCutoff: material.alphaCutoff ?? 0.5,
|
|
100
|
+
doubleSided: material.doubleSided,
|
|
92
101
|
};
|
|
93
102
|
});
|
|
94
103
|
let nodes;
|
|
@@ -102,7 +111,7 @@ export async function loadModel(backend) {
|
|
|
102
111
|
active.add(index);
|
|
103
112
|
const group = {
|
|
104
113
|
...emptyNode(),
|
|
105
|
-
name:
|
|
114
|
+
name: spec.name
|
|
106
115
|
};
|
|
107
116
|
group.matrix = nodeMatrix(spec);
|
|
108
117
|
if (spec.mesh !== undefined) {
|
|
@@ -130,7 +139,7 @@ export async function loadModel(backend) {
|
|
|
130
139
|
if ([style.baseTexture, style.metalTexture, style.emissiveTexture, style.occlusionTexture].some(Boolean) && !attributes.uv) {
|
|
131
140
|
throw new Error('Textured model mesh requires UV coordinates');
|
|
132
141
|
}
|
|
133
|
-
const program = backend
|
|
142
|
+
const program = createProgram(backend, style);
|
|
134
143
|
resources.push(program);
|
|
135
144
|
const device = backend.renderer.device;
|
|
136
145
|
if (attributes.index?.data instanceof Uint8Array) {
|
|
@@ -159,7 +168,8 @@ export async function loadModel(backend) {
|
|
|
159
168
|
device,
|
|
160
169
|
geometry,
|
|
161
170
|
program,
|
|
162
|
-
|
|
171
|
+
fadeDuration: 250,
|
|
172
|
+
id: L.Layer._nextId++,
|
|
163
173
|
renderOrder: 0
|
|
164
174
|
};
|
|
165
175
|
mesh.name = description.meshes[spec.mesh].name; mesh.extras = spec.extras || {};
|
|
@@ -179,15 +189,17 @@ export async function loadModel(backend) {
|
|
|
179
189
|
for (const resource of resources) {
|
|
180
190
|
if (resource.attributes) {
|
|
181
191
|
for (const attribute of Object.values(resource.attributes)) attribute.buffer.destroy();
|
|
182
|
-
} else
|
|
192
|
+
} else {
|
|
193
|
+
resource.pipelineCache.clear();
|
|
194
|
+
}
|
|
183
195
|
}
|
|
184
196
|
throw error;
|
|
185
197
|
}
|
|
186
198
|
}
|
|
187
199
|
const model = {
|
|
188
200
|
...emptyNode(),
|
|
189
|
-
id:
|
|
190
|
-
extras:
|
|
201
|
+
id: url,
|
|
202
|
+
extras: description.extras || {},
|
|
191
203
|
};
|
|
192
204
|
if (!nodes.length) throw new Error('Expected a glTF model with a non-empty scene');
|
|
193
205
|
for (const node of nodes) setParent(node, model);
|
|
@@ -201,4 +213,5 @@ export async function loadModel(backend) {
|
|
|
201
213
|
backend.model.scale[0] = x; backend.model.scale[1] = y; backend.model.scale[2] = z;
|
|
202
214
|
}
|
|
203
215
|
setParent(backend.model, backend.root);
|
|
216
|
+
conformModelToTerrain(backend, backend._map?._terrain3D);
|
|
204
217
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { getZxy } from './getZxy.js';
|
|
2
|
+
|
|
3
|
+
export async function loadSource(backend, area) {
|
|
4
|
+
if (backend._geojson) {
|
|
5
|
+
const { data, url } = backend.options;
|
|
6
|
+
if (data !== undefined && url) throw new Error('GeoJSON source requires either data or url');
|
|
7
|
+
if (data !== undefined) return data;
|
|
8
|
+
if (!url) throw new Error('GeoJSON source requires either data or url');
|
|
9
|
+
const response = await fetch(new URL(url, document.baseURI), { signal: area.request.signal });
|
|
10
|
+
if (!response.ok) throw new Error(`Unable to load GeoJSON: HTTP ${response.status}`);
|
|
11
|
+
return response.json();
|
|
12
|
+
}
|
|
13
|
+
const result = await getZxy(backend, area.coords.z, area.coords.x, area.coords.y, area.request.signal);
|
|
14
|
+
return result
|
|
15
|
+
? JSON.parse(new TextDecoder().decode(result.data))
|
|
16
|
+
: { type: 'FeatureCollection', features: [] };
|
|
17
|
+
}
|