leaflet-city-mapper 0.0.1 → 0.0.3
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 +61 -13
- package/cucumber.mjs +4 -0
- package/dist/leaflet-city-mapper.js +3 -1
- package/dist/leaflet-city-mapper.js.map +4 -4
- package/package.json +3 -4
- package/src/archives/decodeDirectory.js +32 -0
- package/src/archives/decodeHeader.js +19 -0
- package/src/archives/decompress.js +5 -0
- package/src/archives/getHeader.js +9 -0
- package/src/archives/getZxy.js +75 -0
- package/src/archives/loadDirectory.js +7 -0
- package/src/archives/loadSource.js +17 -0
- package/src/archives/read.js +29 -0
- package/src/archives/tileId.js +19 -0
- package/src/archives/varint.js +15 -0
- package/src/camera/angles.js +6 -0
- package/src/camera/animationPoint.js +8 -0
- package/src/camera/cameraMapReady.js +8 -0
- package/src/camera/cancelCameraAnimation.js +11 -0
- package/src/camera/cleanupCameraMap.js +11 -0
- package/src/camera/constrainCameraToBounds.js +3 -0
- package/src/camera/displayPoint.js +3 -0
- package/src/camera/fitCameraBounds.js +48 -0
- package/src/camera/groundBounds.js +11 -0
- package/src/camera/initializeCameraMap.js +25 -0
- package/src/camera/mapAnimateCamera.js +17 -0
- package/src/camera/mapCamera.js +123 -0
- package/src/camera/mapContainerPointToLayerPoint.js +7 -0
- package/src/camera/mapGetBearing.js +1 -0
- package/src/camera/mapGetBounds.js +14 -0
- package/src/camera/mapGetBoundsCenterZoom.js +7 -0
- package/src/camera/mapGetBoundsZoom.js +14 -0
- package/src/camera/mapGetCenterLayerPoint.js +5 -0
- package/src/camera/mapGetPitch.js +1 -0
- package/src/camera/mapLayerPointToContainerPoint.js +7 -0
- package/src/camera/mapLimitCenter.js +12 -0
- package/src/camera/mapLimitOffset.js +10 -0
- package/src/camera/mapPanBy.js +9 -0
- package/src/camera/mapPanInside.js +14 -0
- package/src/camera/mapResetNorth.js +1 -0
- package/src/camera/mapResetNorthPitch.js +1 -0
- package/src/camera/mapSetBearing.js +1 -0
- package/src/camera/mapSetPitch.js +1 -0
- package/src/camera/mapSetPitchAndBearing.js +14 -0
- package/src/camera/mapSetZoomAround.js +11 -0
- package/src/camera/mapStopPitchBearingAnimation.js +6 -0
- package/src/camera/mapTryAnimatedPan.js +9 -0
- package/src/camera/mapUpdateCameraOverlays.js +7 -0
- package/src/camera/pointOf.js +3 -0
- package/src/camera/project.js +20 -0
- package/src/camera/runCameraAnimations.js +28 -0
- package/src/camera/scheduleCameraAnimation.js +8 -0
- package/src/camera/updateSky.js +16 -0
- package/src/camera/verticalGroundY.js +4 -0
- package/src/collision/collectMeshes.js +5 -0
- package/src/collision/collider.js +63 -0
- package/src/collision/horizontalRay.js +12 -0
- package/src/collision/intersectMeshes.js +133 -0
- package/src/collision/sortHits.js +23 -0
- package/src/constants/CELL.js +4 -0
- package/src/constants/Compass.js +7 -0
- package/src/constants/ContainerResize.js +7 -0
- package/src/constants/HEIGHT.js +1 -0
- package/src/constants/PitchDrag.js +7 -0
- package/src/constants/ShiftRotate.js +7 -0
- package/src/constants/TILE_RADIUS.js +1 -0
- package/src/constants/TILE_SIZE.js +1 -0
- package/src/constants/TouchMode.js +6 -0
- package/src/constants/accessorSizes.js +1 -0
- package/src/constants/accessorTypes.js +8 -0
- package/src/constants/attachState.js +1 -0
- package/src/constants/cameraControlsState.js +1 -0
- package/src/constants/cityMapper.js +6 -0
- package/src/constants/colliders.js +2 -0
- package/src/constants/dark.js +1 -0
- package/src/constants/elevationWGSL.js +27 -0
- package/src/constants/glass.js +1 -0
- package/src/constants/headlight.js +1 -0
- package/src/constants/hull.js +1 -0
- package/src/constants/indexState.js +1 -0
- package/src/constants/limbs.js +9 -0
- package/src/constants/mapCameraState.js +1 -0
- package/src/constants/moves.js +11 -0
- package/src/constants/nativeEventMaps.js +1 -0
- package/src/constants/nativeLayerState.js +1 -0
- package/src/constants/nativeMethodHandlers.js +31 -0
- package/src/constants/onMapChangeState.js +1 -0
- package/src/constants/onZoomAnimState.js +1 -0
- package/src/constants/paints.js +10 -0
- package/src/constants/parts.js +19 -0
- package/src/constants/pendingUpdates.js +1 -0
- package/src/constants/pumpState.js +1 -0
- package/src/constants/renderers.js +2 -0
- package/src/constants/ringDirections.js +10 -0
- package/src/constants/roundProfile.js +1 -0
- package/src/constants/shirt.js +1 -0
- package/src/constants/skin.js +2 -0
- package/src/constants/speed.js +3 -0
- package/src/constants/taillight.js +1 -0
- package/src/constants/trafficShader.js +49 -0
- package/src/constants/trousers.js +1 -0
- package/src/constants/tyre.js +1 -0
- package/src/constants/underEntryState.js +1 -0
- package/src/constants/vehicles.js +40 -0
- package/src/constants/white.js +1 -0
- package/src/controls/acceptPitchDrag.js +4 -0
- package/src/controls/acceptRotateDrag.js +3 -0
- package/src/controls/adjustCameraDrag.js +10 -0
- package/src/controls/cameraControls.js +60 -0
- package/src/controls/cameraDragClick.js +9 -0
- package/src/controls/cameraDragContextMenu.js +8 -0
- package/src/controls/cameraDragDown.js +20 -0
- package/src/controls/cameraDragEnd.js +6 -0
- package/src/controls/cameraDragMove.js +23 -0
- package/src/controls/changeCameraTouch.js +14 -0
- package/src/controls/cleanupCameraTouch.js +24 -0
- package/src/controls/compassAddHooks.js +15 -0
- package/src/controls/compassOrientation.js +6 -0
- package/src/controls/compassRemoveHooks.js +5 -0
- package/src/controls/containerResizeAddHooks.js +8 -0
- package/src/controls/containerResizeRemoveHooks.js +5 -0
- package/src/controls/dragCamera.js +22 -0
- package/src/controls/editable.js +3 -0
- package/src/controls/endAllCameraDrags.js +7 -0
- package/src/controls/endAllCameraTouches.js +7 -0
- package/src/controls/endCameraTouch.js +11 -0
- package/src/controls/endCameraTouchEvent.js +5 -0
- package/src/controls/finishCameraDrag.js +9 -0
- package/src/controls/finishCompassPermission.js +16 -0
- package/src/controls/loadCameraControls.js +9 -0
- package/src/controls/moveCameraTouch.js +22 -0
- package/src/controls/notifyCameraTouchChange.js +1 -0
- package/src/controls/pitchDragAddHooks.js +6 -0
- package/src/controls/pitchDragRemoveHooks.js +5 -0
- package/src/controls/refreshRotateControl.js +7 -0
- package/src/controls/refreshRotateFocus.js +5 -0
- package/src/controls/removeCameraDrag.js +23 -0
- package/src/controls/resizeMap.js +3 -0
- package/src/controls/rotateButtonClick.js +7 -0
- package/src/controls/rotateButtonKeydown.js +11 -0
- package/src/controls/rotateControl.js +3 -0
- package/src/controls/rotateOnAdd.js +38 -0
- package/src/controls/rotateOnRemove.js +6 -0
- package/src/controls/shiftRotateAddHooks.js +8 -0
- package/src/controls/shiftRotateRemoveHooks.js +5 -0
- package/src/controls/shiftRotateWheel.js +9 -0
- package/src/controls/startCameraTouch.js +23 -0
- package/src/core/addImageState.js +7 -0
- package/src/core/addRasterImage.js +10 -0
- package/src/core/adjustCameraMarkerPan.js +22 -0
- package/src/core/beforeNativeRender.js +10 -0
- package/src/core/boundsQuad.js +11 -0
- package/src/core/bringNativeLayerToBack.js +3 -0
- package/src/core/bringNativeLayerToFront.js +3 -0
- package/src/core/cameraCircleBounds.js +6 -0
- package/src/core/cameraMarkerDrag.js +18 -0
- package/src/core/cameraMarkerOnDrag.js +8 -0
- package/src/core/cancelGridFade.js +10 -0
- package/src/core/closestCameraLayerPoint.js +7 -0
- package/src/core/compareNativeHits.js +3 -0
- package/src/core/current.js +3 -0
- package/src/core/disposeNativeLayer.js +35 -0
- package/src/core/fireRasterLoad.js +5 -0
- package/src/core/forwardNativeError.js +3 -0
- package/src/core/gridlayerGetEvents.js +7 -0
- package/src/core/gridlayerGetTiledPixelBounds.js +8 -0
- package/src/core/handleNativeMapEvent.js +47 -0
- package/src/core/hideTargets.js +16 -0
- package/src/core/initNativeGPU.js +21 -0
- package/src/core/initializeGridContainer.js +6 -0
- package/src/core/initializeNativeLayer.js +42 -0
- package/src/core/localPixel.js +5 -0
- package/src/core/localPixelForGeometry.js +6 -0
- package/src/core/localPosition.js +6 -0
- package/src/core/markerCameraIconPoint.js +9 -0
- package/src/core/markerGetEvents.js +5 -0
- package/src/core/markerInitInteraction.js +8 -0
- package/src/core/markerQuadCorners.js +31 -0
- package/src/core/markerSetIcon.js +9 -0
- package/src/core/markerSetPos.js +14 -0
- package/src/core/markerSetRotation.js +7 -0
- package/src/core/markerUpdateZIndex.js +8 -0
- package/src/core/nativeAddLatLng.js +3 -0
- package/src/core/nativeBringToBack.js +3 -0
- package/src/core/nativeBringToFront.js +3 -0
- package/src/core/nativeEvents.js +26 -0
- package/src/core/nativeImageError.js +8 -0
- package/src/core/nativeImageRefresh.js +7 -0
- package/src/core/nativeLayer.js +97 -0
- package/src/core/nativeLayerMethod.js +21 -0
- package/src/core/nativeRedraw.js +3 -0
- package/src/core/nativeSetBounds.js +3 -0
- package/src/core/nativeSetIcon.js +3 -0
- package/src/core/nativeSetLatLng.js +3 -0
- package/src/core/nativeSetLatLngs.js +3 -0
- package/src/core/nativeSetOpacity.js +3 -0
- package/src/core/nativeSetRadius.js +3 -0
- package/src/core/nativeSetStyle.js +3 -0
- package/src/core/nativeSetUrl.js +3 -0
- package/src/core/nativeSetZIndex.js +3 -0
- package/src/core/nativeSetZIndexOffset.js +3 -0
- package/src/core/popupAdjustPan.js +23 -0
- package/src/core/popupGetEvents.js +5 -0
- package/src/core/popupUpdatePosition.js +14 -0
- package/src/core/putNativeMesh.js +33 -0
- package/src/core/quadNativeMesh.js +15 -0
- package/src/core/readyNativeGPU.js +6 -0
- package/src/core/refreshNativeEvent.js +5 -0
- package/src/core/refreshNativeLayer.js +29 -0
- package/src/core/refreshNativeLayerContract.js +3 -0
- package/src/core/rejectNativeReady.js +3 -0
- package/src/core/removeImageState.js +8 -0
- package/src/core/removeNativeEvents.js +16 -0
- package/src/core/removeTargets.js +8 -0
- package/src/core/reorderNativeLayer.js +6 -0
- package/src/core/resolveNativeReady.js +3 -0
- package/src/core/restoreNativeEvents.js +6 -0
- package/src/core/runGridFades.js +14 -0
- package/src/core/runMarkerPanFrame.js +12 -0
- package/src/core/scheduleGridFade.js +9 -0
- package/src/core/scheduleMarkerPan.js +8 -0
- package/src/core/styleNativeMesh.js +10 -0
- package/src/core/syncGridLayer.js +22 -0
- package/src/core/syncImageOverlay.js +9 -0
- package/src/core/syncMarker.js +12 -0
- package/src/core/syncVectorLayer.js +26 -0
- package/src/core/synchronizeNativeLayer.js +35 -0
- package/src/core/textureFor.js +48 -0
- package/src/core/tooltipGetEvents.js +5 -0
- package/src/core/tooltipSetPosition.js +8 -0
- package/src/core/updateGridOpacity.js +23 -0
- package/src/core/updateNativeLayerView.js +6 -0
- package/src/core/uploadCanvasTexture.js +19 -0
- package/src/geometry/addBridges.js +88 -0
- package/src/geometry/below.js +3 -0
- package/src/geometry/box.js +3 -0
- package/src/geometry/bridgeElevation.js +19 -0
- package/src/geometry/bridgeLocal.js +4 -0
- package/src/geometry/build.js +19 -0
- package/src/geometry/circleAt.js +5 -0
- package/src/geometry/clipLine.js +23 -0
- package/src/geometry/clipSegment.js +19 -0
- package/src/geometry/computeBounds.js +33 -0
- package/src/geometry/conformModelToTerrain.js +67 -0
- package/src/geometry/cross.js +3 -0
- package/src/geometry/disk.js +11 -0
- package/src/geometry/diskAt.js +4 -0
- package/src/geometry/dot.js +6 -0
- package/src/geometry/emitter.js +8 -0
- package/src/geometry/lampPostGeometry.js +24 -0
- package/src/geometry/lampRing.js +11 -0
- package/src/geometry/lightGeometry.js +15 -0
- package/src/geometry/line.js +54 -0
- package/src/geometry/nativeGeometry.js +55 -0
- package/src/geometry/nativeTriangle.js +3 -0
- package/src/geometry/polygon.js +22 -0
- package/src/geometry/push.js +3 -0
- package/src/geometry/quad.js +4 -0
- package/src/geometry/roofCoverage.js +52 -0
- package/src/geometry/samePoint.js +3 -0
- package/src/geometry/segment.js +21 -0
- package/src/geometry/setVertexColor.js +15 -0
- package/src/geometry/sub.js +6 -0
- package/src/geometry/surface.js +17 -0
- package/src/geometry/treeGeometry.js +31 -0
- package/src/geometry/treeRing.js +14 -0
- package/src/geometry/triangle.js +12 -0
- package/src/geometry/vertexNormals.js +32 -0
- package/src/geometry/visit.js +9 -0
- package/src/index.js +98 -65
- package/src/lighting/cacheLightGrid.js +23 -0
- package/src/lighting/collectLightMeshes.js +6 -0
- package/src/lighting/lightGrid.js +42 -0
- package/src/lighting/updatePointLights.js +34 -0
- package/src/lighting/visitCells.js +15 -0
- package/src/lighting/worldLights.js +27 -0
- package/src/models/decodeModel.js +45 -0
- package/src/models/hasUnsupportedPrimitives.js +10 -0
- package/src/models/loadBuffer.js +6 -0
- package/src/models/loadImage.js +15 -0
- package/src/models/loadModel.js +69 -0
- package/src/models/materialFor.js +21 -0
- package/src/models/modelNode.js +93 -0
- package/src/models/nodeMatrix.js +22 -0
- package/src/models/readAccessor.js +53 -0
- package/src/models/readAccessorValues.js +16 -0
- package/src/models/textureFor.js +35 -0
- package/src/models/textureSampler.js +10 -0
- package/src/picking/collectVisibleMesh.js +4 -0
- package/src/picking/findFeature.js +49 -0
- package/src/picking/hit.js +23 -0
- package/src/picking/hitMesh.js +30 -0
- package/src/picking/onClick.js +13 -0
- package/src/picking/onPointerLeave.js +11 -0
- package/src/picking/onPointerMove.js +15 -0
- package/src/picking/pointerClick.js +5 -0
- package/src/picking/pointerLeave.js +5 -0
- package/src/picking/pointerMove.js +5 -0
- package/src/picking/raycast.js +59 -0
- package/src/picking/setHighlight.js +13 -0
- package/src/picking/shouldSkipOther.js +3 -0
- package/src/picking/showFeature.js +34 -0
- package/src/raster/addRasterTile.js +114 -0
- package/src/raster/comparePendingTiles.js +5 -0
- package/src/raster/createGeometry.js +22 -0
- package/src/raster/createRasterMesh.js +47 -0
- package/src/raster/finishAttachment.js +11 -0
- package/src/raster/finishRasterTile.js +47 -0
- package/src/raster/getRasterEvents.js +6 -0
- package/src/raster/getRasterTileSize.js +5 -0
- package/src/raster/initRaster.js +38 -0
- package/src/raster/isLoading.js +5 -0
- package/src/raster/loadRasterTile.js +10 -0
- package/src/raster/onPMTileAdd.js +10 -0
- package/src/raster/onPMTileRemove.js +8 -0
- package/src/raster/pruneRasterTiles.js +37 -0
- package/src/raster/pumpRasterTiles.js +22 -0
- package/src/raster/readyRaster.js +13 -0
- package/src/raster/registerTerrainTile.js +12 -0
- package/src/raster/releaseRasterTile.js +18 -0
- package/src/raster/releaseRasterTiles.js +15 -0
- package/src/raster/removeRasterTile.js +13 -0
- package/src/raster/reportError.js +6 -0
- package/src/raster/setPMTileOpacity.js +7 -0
- package/src/raster/setPMTileZIndex.js +7 -0
- package/src/raster/setRasterOpacity.js +11 -0
- package/src/raster/setRasterTerrain.js +21 -0
- package/src/raster/setRasterZIndex.js +11 -0
- package/src/raster/updateAttachedTiles.js +10 -0
- package/src/raster/updateRasterTiles.js +59 -0
- package/src/rendering/collectFrameMeshes.js +31 -0
- package/src/rendering/collectMeshes.js +36 -0
- package/src/rendering/compareMeshes.js +10 -0
- package/src/rendering/compareRoofTiles.js +4 -0
- package/src/rendering/composeRoofAtlas.js +52 -0
- package/src/rendering/createMesh.js +33 -0
- package/src/rendering/createProgram.js +92 -0
- package/src/rendering/destroyAfterSubmission.js +8 -0
- package/src/rendering/destroyTexture.js +6 -0
- package/src/rendering/disposeMesh.js +14 -0
- package/src/rendering/drawGeometry.js +129 -0
- package/src/rendering/drawSceneMeshes.js +51 -0
- package/src/rendering/ensureRoofBlit.js +40 -0
- package/src/rendering/prepareFrameMeshes.js +42 -0
- package/src/rendering/prepareFrameUniforms.js +49 -0
- package/src/rendering/rebuildRoofAtlas.js +67 -0
- package/src/rendering/render.js +57 -0
- package/src/rendering/reportCompilation.js +17 -0
- package/src/rendering/resizeRenderer.js +19 -0
- package/src/rendering/sortMeshes.js +6 -0
- package/src/rendering/synchronizeZoomView.js +34 -0
- package/src/rendering/textureBinding.js +7 -0
- package/src/rendering/updateMapCamera.js +32 -0
- package/src/rendering/updateRoofRaster.js +32 -0
- package/src/scene/attach.js +161 -0
- package/src/scene/attachLayer.js +10 -0
- package/src/scene/cancelUpdate.js +10 -0
- package/src/scene/emptyEvents.js +3 -0
- package/src/scene/emptyNode.js +11 -0
- package/src/scene/endZoom.js +16 -0
- package/src/scene/failAttachment.js +9 -0
- package/src/scene/get3DEvents.js +13 -0
- package/src/scene/init3D.js +30 -0
- package/src/scene/initializeLayer.js +16 -0
- package/src/scene/initializerFor.js +14 -0
- package/src/scene/layerInitialize.js +38 -0
- package/src/scene/layerLayerAdd.js +21 -0
- package/src/scene/onAdd3DLayer.js +35 -0
- package/src/scene/onMapChange.js +16 -0
- package/src/scene/onRemove3DLayer.js +69 -0
- package/src/scene/onZoomAnim.js +16 -0
- package/src/scene/placeEntry.js +11 -0
- package/src/scene/placeUnderEntry.js +8 -0
- package/src/scene/ready3D.js +25 -0
- package/src/scene/releaseRenderer.js +14 -0
- package/src/scene/removeEntry.js +6 -0
- package/src/scene/renderPendingMapChange.js +11 -0
- package/src/scene/renderPendingUpdates.js +19 -0
- package/src/scene/renderPendingZoomAnimation.js +7 -0
- package/src/scene/rendererDeviceError.js +10 -0
- package/src/scene/rendererDeviceLost.js +11 -0
- package/src/scene/replaceEntry.js +7 -0
- package/src/scene/reportError.js +3 -0
- package/src/scene/requestAdapter.js +12 -0
- package/src/scene/requestDevice.js +9 -0
- package/src/scene/resolveNextInitialization.js +12 -0
- package/src/scene/restoreObject.js +71 -0
- package/src/scene/runPlacements.js +7 -0
- package/src/scene/setParent.js +7 -0
- package/src/scene/showWebGPUWarning.js +16 -0
- package/src/scene/startZoom.js +5 -0
- package/src/scene/traverse.js +7 -0
- package/src/scene/underEntry.js +17 -0
- package/src/scene/update.js +19 -0
- package/src/scene/updateCamera.js +34 -0
- package/src/scene/updateWorldMatrix.js +48 -0
- package/src/{utils/shaders.js → shaders/materialShaders.js} +246 -237
- package/src/shadows/bindSunlight.js +12 -0
- package/src/shadows/drawShadowMeshes.js +48 -0
- package/src/shadows/ensureShadowPipeline.js +53 -0
- package/src/shadows/renderSunlight.js +46 -0
- package/src/shadows/resizeSunlight.js +15 -0
- package/src/shadows/shadowBounds.js +32 -0
- package/src/shadows/shadowCacheMatches.js +23 -0
- package/src/shadows/shadowMatrix.js +39 -0
- package/src/sources/addGeneratedTriangle.js +6 -0
- package/src/sources/addTriangle.js +17 -0
- package/src/sources/attachAreaMesh.js +58 -0
- package/src/sources/buildArea.js +42 -0
- package/src/sources/buildAreaFeature.js +41 -0
- package/src/sources/buildAreaPoint.js +25 -0
- package/src/sources/buildAreaPolygon.js +29 -0
- package/src/sources/compareAreaDistance.js +4 -0
- package/src/sources/generateTreeGeometry.js +11 -0
- package/src/sources/groundOffset.js +3 -0
- package/src/sources/initializeGeoJSON.js +8 -0
- package/src/sources/instanceAreaGeometry.js +29 -0
- package/src/sources/projectRing.js +20 -0
- package/src/sources/projectedTree.js +13 -0
- package/src/sources/pump.js +54 -0
- package/src/sources/releaseArea.js +22 -0
- package/src/sources/setGeoJSONData.js +12 -0
- package/src/sources/setGeoJSONLayerData.js +5 -0
- package/src/sources/sourceAreaContext.js +9 -0
- package/src/sources/updateArea.js +45 -0
- package/src/sources/updateStatus.js +12 -0
- package/src/sunlight/addTimeLayer.js +3 -0
- package/src/sunlight/addTo.js +10 -0
- package/src/sunlight/atmosphere.js +28 -0
- package/src/sunlight/horizontalPosition.js +16 -0
- package/src/sunlight/initSunlight.js +14 -0
- package/src/sunlight/initialize.js +11 -0
- package/src/sunlight/mix.js +6 -0
- package/src/sunlight/moonPosition.js +17 -0
- package/src/sunlight/onAdd.js +5 -0
- package/src/sunlight/onAddSun.js +66 -0
- package/src/sunlight/projectCelestialBody.js +13 -0
- package/src/sunlight/remove.js +7 -0
- package/src/sunlight/removeSun.js +15 -0
- package/src/sunlight/removeTimeLayer.js +3 -0
- package/src/sunlight/render.js +7 -0
- package/src/sunlight/rgb.js +6 -0
- package/src/sunlight/solarPosition.js +17 -0
- package/src/sunlight/styleTimeControl.js +7 -0
- package/src/sunlight/tickSun.js +5 -0
- package/src/sunlight/updateSky.js +20 -0
- package/src/sunlight/updateSun.js +34 -0
- package/src/sunlight/useLiveTime.js +6 -0
- package/src/sunlight/useSelectedTime.js +20 -0
- package/src/terrain/clearLayerTerrain.js +5 -0
- package/src/terrain/getElevation.js +10 -0
- package/src/terrain/initTerrain.js +20 -0
- package/src/terrain/loadReadyTerrain.js +5 -0
- package/src/terrain/loadTerrain.js +63 -0
- package/src/terrain/loadTerrainTiles.js +13 -0
- package/src/terrain/onTerrainAdd.js +21 -0
- package/src/terrain/onTerrainChange.js +14 -0
- package/src/terrain/onTerrainRemove.js +41 -0
- package/src/terrain/readBridges.js +4 -0
- package/src/terrain/sample.js +7 -0
- package/src/terrain/setLayerTerrain.js +5 -0
- package/src/terrain/setTerrainHeight.js +10 -0
- package/src/terrain/terrainAtlas.js +23 -0
- package/src/terrain/terrainElevation.js +20 -0
- package/src/terrain/terrainGrid.js +24 -0
- package/src/traffic/addTraffic.js +7 -0
- package/src/traffic/along.js +14 -0
- package/src/traffic/clockMinutes.js +6 -0
- package/src/traffic/compareDepartures.js +5 -0
- package/src/traffic/createTrafficMesh.js +7 -0
- package/src/traffic/destroyTrafficGpu.js +5 -0
- package/src/traffic/disposeTrafficObject.js +13 -0
- package/src/traffic/drawTrafficRoute.js +6 -0
- package/src/traffic/failTraffic.js +6 -0
- package/src/traffic/failedTrafficLoad.js +5 -0
- package/src/traffic/fetchTrafficLanes.js +10 -0
- package/src/traffic/groundTraffic.js +15 -0
- package/src/traffic/initTraffic.js +54 -0
- package/src/traffic/loadTraffic.js +15 -0
- package/src/traffic/loadedTrafficLanes.js +16 -0
- package/src/traffic/locateTraffic.js +9 -0
- package/src/traffic/moveTraffic.js +15 -0
- package/src/traffic/placeTraffic.js +21 -0
- package/src/traffic/prepareTraffic.js +25 -0
- package/src/traffic/readyTraffic.js +6 -0
- package/src/traffic/rebaseTraffic.js +58 -0
- package/src/traffic/rebuildTrafficMesh.js +28 -0
- package/src/traffic/removeTraffic.js +17 -0
- package/src/traffic/routeColor.js +6 -0
- package/src/traffic/routeGeometry.js +31 -0
- package/src/traffic/scheduledTrips.js +40 -0
- package/src/traffic/startTraffic.js +8 -0
- package/src/traffic/tickTraffic.js +57 -0
- package/src/traffic/toLanes.js +16 -0
- package/src/traffic/tooltip.js +11 -0
- package/src/traffic/trafficBounds.js +17 -0
- package/src/traffic/trafficNow.js +4 -0
- package/src/traffic/trafficStorage.js +5 -0
- package/src/traffic/tripsAt.js +27 -0
- package/src/traffic/updateTraffic.js +8 -0
- package/src/traffic/updateTrafficTerrain.js +12 -0
- package/src/traffic/vehicleOffsets.js +11 -0
- package/src/triangulation/area.js +9 -0
- package/src/triangulation/clean.js +18 -0
- package/src/triangulation/containsVertex.js +11 -0
- package/src/triangulation/cross.js +3 -0
- package/src/triangulation/crossesBoundary.js +8 -0
- package/src/triangulation/crossesRing.js +9 -0
- package/src/triangulation/equal.js +3 -0
- package/src/triangulation/inside.js +10 -0
- package/src/triangulation/insideHole.js +7 -0
- package/src/triangulation/intersects.js +11 -0
- package/src/triangulation/isClockWise.js +13 -0
- package/src/triangulation/minimumX.js +6 -0
- package/src/triangulation/on.js +4 -0
- package/src/triangulation/sortHoles.js +26 -0
- package/src/triangulation/triangulate.js +86 -0
- package/src/utils/channel.js +4 -0
- package/src/utils/compareDistance.js +3 -0
- package/src/utils/noOperation.js +1 -0
- package/src/utils/parseColor.js +42 -0
- package/src/utils/toSRGB.js +3 -0
- package/src/utils/wrap.js +3 -0
- package/src/vehicles/bicycleModel.js +23 -0
- package/src/vehicles/boatBenches.js +8 -0
- package/src/vehicles/boatModel.js +27 -0
- package/src/vehicles/busModel.js +6 -0
- package/src/vehicles/carModel.js +22 -0
- package/src/vehicles/carriage.js +19 -0
- package/src/vehicles/metroModel.js +9 -0
- package/src/vehicles/mirror.js +8 -0
- package/src/vehicles/pedestrianModel.js +17 -0
- package/src/vehicles/tramModel.js +9 -0
- package/src/walk/blocked.js +6 -0
- package/src/walk/createWalk.js +60 -0
- package/src/walk/initWalk.js +18 -0
- package/src/walk/initialize.js +6 -0
- package/src/walk/local.js +10 -0
- package/src/walk/onAdd.js +4 -0
- package/src/walk/onBlur.js +3 -0
- package/src/walk/onKey.js +12 -0
- package/src/walk/onPointer.js +13 -0
- package/src/walk/onRemove.js +4 -0
- package/src/walk/onTerrain.js +5 -0
- package/src/walk/place.js +18 -0
- package/src/walk/start.js +37 -0
- package/src/walk/step.js +53 -0
- package/src/walk/stop.js +27 -0
- package/src/walk/toggle.js +6 -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/geometry.js +0 -2
- package/dist/utils/geometry.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 +0 -203
- 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/dist/utils/traffic.js +0 -2
- package/dist/utils/traffic.js.map +0 -7
- package/dist/utils/vehicles.js +0 -2
- package/dist/utils/vehicles.js.map +0 -7
- package/dist/utils/walk.js +0 -2
- package/dist/utils/walk.js.map +0 -7
- package/src/scene/gpu.js +0 -438
- package/src/scene/lighting.js +0 -193
- package/src/scene/model.js +0 -204
- package/src/scene/picking.js +0 -150
- package/src/scene/pmtiles.js +0 -94
- package/src/scene/render.js +0 -467
- package/src/scene/sources.js +0 -265
- 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/control.js +0 -18
- package/src/utils/geometry.js +0 -256
- package/src/utils/lighting.js +0 -51
- package/src/utils/model.js +0 -178
- package/src/utils/picking.js +0 -119
- 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
- package/src/utils/traffic.js +0 -90
- package/src/utils/vehicles.js +0 -69
- package/src/utils/walk.js +0 -72
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/index.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * `new L.Layer({ source: { type, url, ...settings }, pane, attribution })`: layers with a `source`\n * load their type module on first use. Subclasses are unchanged.\n */\n\n/**\n * Router for `new L.Layer({ source: { type, url, ...settings }, pane, attribution })`.\n * It imports the type module on demand and turns the\n * layer into it; types receive flat options (`{ ...source, pane, attribution }`), so `layer.options.url` etc.\n *\n * Folder layout:\n * - types/: one module per `source.type`, the only files imported by this router:\n * - 'pmtiles': raster PMTiles basemap (an L.TileLayer), draped on the terrain when present;\n * - '3d': shared WebGPU scene with a GLB/glTF model, PMTiles GeoJSON features, or empty;\n * - 'geojson': inline or URL-backed GeoJSON features rendered by the shared 3D scene;\n * - 'terrain': Float32 PMTiles DEM that deforms raster tiles, buildings and the camera, plus optional bridge decks;\n * - 'sunlight': simulation clock control, sun/moon lighting and shadows;\n * - 'traffic': vehicles moving along GeoJSON lanes (measured flow or timetable);\n * - 'walk': third-person pedestrian moved with the keyboard, the camera following behind.\n * - scene/: named operations for GPU resources, model/archive loading, lighting, sources, picking\n * and rendering. They receive the layer explicitly; types/3d.js declares its delegates, without mixins.\n * - utils/: computations and scene-data helpers, independent of Leaflet layers and GPU devices.\n * Geometry, decoders, lighting grids, terrain sampling, traffic and collisions can be tested in Node;\n * scene transforms/picking use browser DOMMatrix/DOMPoint, and CSS colors use a canvas.\n * Dataset-specific code and data (routes, timetables, API loaders) belong to the application, e.g. misc/.\n *\n * When `type` is omitted it is inferred from `source.url`: *.pmtiles -> 'pmtiles', anything else -> '3d'.\n */\n\nconst layerProto = Object.defineProperties({}, Object.getOwnPropertyDescriptors(L.Layer.prototype));\n\n// Stand-in while the type module loads: remembers the map, renders nothing.\nconst Pending = L.Layer.extend({\n onAdd() {},\n onRemove() {},\n});\n\n// One chain for every pending layer: they become real layers in creation order, whatever the import timing.\nlet loading = Promise.resolve();\n\n// Shared registry: type modules (src/types) register here.\nL.Layer.types = {};\n\n// Core L.Layer has no initialize and init hooks get no arguments: keep the options for the hook.\nL.Layer.include({\n initialize(options = {}) {\n if (Object.getPrototypeOf(this) !== L.Layer.prototype || !options.source) {\n if (layerProto.initialize) return layerProto.initialize.apply(this, arguments);\n L.Util.setOptions(this, options);\n return;\n }\n const layer = this;\n const { source: { type = /\\.pmtiles(?:[?#]|$)/i.test(options.source.url) ? 'pmtiles' : '3d', ...source }, ...core } = options;\n const settings = { ...source, ...core };\n // A stand-in created by the entry point before this module loaded may already be on a map.\n const map = layer._map;\n map?.removeLayer(layer);\n delete layer.onAdd;\n delete layer.onRemove;\n if (L.Layer.types[type]) {\n Object.setPrototypeOf(layer, L.Layer.types[type].prototype);\n layer.options = Object.create(L.Layer.types[type].prototype.options);\n L.Layer.types[type].prototype.initialize.call(layer, settings);\n map?.addLayer(layer);\n return;\n }\n Object.setPrototypeOf(layer, Pending.prototype);\n L.Util.setOptions(layer, core);\n map?.addLayer(layer);\n // ponytail: type methods (setOpacity, add, ...) exist only once `ready` resolves.\n loading = loading.catch(() => {}).then(() => import(`./types/${type}.js`));\n const pending = layer.ready = loading.then(() => {\n const map = layer._map;\n map?.removeLayer(layer);\n Object.setPrototypeOf(layer, L.Layer.types[type].prototype);\n layer.options = Object.create(L.Layer.types[type].prototype.options);\n L.Layer.types[type].prototype.initialize.call(layer, settings);\n map?.addLayer(layer);\n return layer.ready === pending ? layer : layer.ready;\n });\n },\n});"],
|
|
5
|
-
"mappings": "AA6BA,MAAMA,EAAa,OAAO,iBAAiB,CAAC,EAAG,OAAO,0BAA0B,EAAE,MAAM,SAAS,CAAC,EAG5FC,EAAU,EAAE,MAAM,OAAO,CAC7B,OAAQ,CAAC,EACT,UAAW,CAAC,CACd,CAAC,EAGD,IAAIC,EAAU,QAAQ,QAAQ,EAG9B,EAAE,MAAM,MAAQ,CAAC,EAGjB,EAAE,MAAM,QAAQ,CACd,WAAWC,EAAU,CAAC,EAAG,CACvB,GAAI,OAAO,eAAe,IAAI,IAAM,EAAE,MAAM,WAAa,CAACA,EAAQ,OAAQ,CACxE,GAAIH,EAAW,WAAY,OAAOA,EAAW,WAAW,MAAM,KAAM,SAAS,EAC7E,EAAE,KAAK,WAAW,KAAMG,CAAO,EAC/B,MACF,CACA,MAAMC,EAAQ,KACR,CAAE,OAAQ,CAAE,KAAAC,EAAO,uBAAuB,KAAKF,EAAQ,OAAO,GAAG,EAAI,UAAY,KAAM,GAAGG,CAAO,EAAG,GAAGC,CAAK,EAAIJ,EAChHK,EAAW,CAAE,GAAGF,EAAQ,GAAGC,CAAK,EAEhCE,EAAML,EAAM,KAIlB,GAHAK,GAAK,YAAYL,CAAK,EACtB,OAAOA,EAAM,MACb,OAAOA,EAAM,SACT,EAAE,MAAM,MAAMC,CAAI,EAAG,CACvB,OAAO,eAAeD,EAAO,EAAE,MAAM,MAAMC,CAAI,EAAE,SAAS,EAC1DD,EAAM,QAAU,OAAO,OAAO,EAAE,MAAM,MAAMC,CAAI,EAAE,UAAU,OAAO,EACnE,EAAE,MAAM,MAAMA,CAAI,EAAE,UAAU,WAAW,KAAKD,EAAOI,CAAQ,EAC7DC,GAAK,SAASL,CAAK,EACnB,MACF,CACA,OAAO,eAAeA,EAAOH,EAAQ,SAAS,EAC9C,EAAE,KAAK,WAAWG,EAAOG,CAAI,EAC7BE,GAAK,SAASL,CAAK,EAEnBF,EAAUA,EAAQ,MAAM,IAAM,CAAC,CAAC,EAAE,KAAK,IAAM,OAAO,WAAWG,CAAI,MAAM,EACzE,MAAMK,EAAUN,EAAM,MAAQF,EAAQ,KAAK,IAAM,CAC/C,MAAMO,EAAML,EAAM,KAClB,OAAAK,GAAK,YAAYL,CAAK,EACtB,OAAO,eAAeA,EAAO,EAAE,MAAM,MAAMC,CAAI,EAAE,SAAS,EAC1DD,EAAM,QAAU,OAAO,OAAO,EAAE,MAAM,MAAMC,CAAI,EAAE,UAAU,OAAO,EACnE,EAAE,MAAM,MAAMA,CAAI,EAAE,UAAU,WAAW,KAAKD,EAAOI,CAAQ,EAC7DC,GAAK,SAASL,CAAK,EACZA,EAAM,QAAUM,EAAUN,EAAQA,EAAM,KACjD,CAAC,CACH,CACF,CAAC",
|
|
6
|
-
"names": ["layerProto", "Pending", "loading", "options", "layer", "type", "source", "core", "settings", "map", "pending"]
|
|
3
|
+
"sources": ["../src/controls/editable.js", "../src/controls/shiftRotateWheel.js", "../src/controls/shiftRotateAddHooks.js", "../src/controls/shiftRotateRemoveHooks.js", "../src/constants/ShiftRotate.js", "../src/constants/cameraControlsState.js", "../src/controls/cameraDragDown.js", "../src/controls/cameraDragMove.js", "../src/controls/finishCameraDrag.js", "../src/controls/cameraDragEnd.js", "../src/controls/cameraDragClick.js", "../src/controls/cameraDragContextMenu.js", "../src/controls/endAllCameraDrags.js", "../src/controls/dragCamera.js", "../src/controls/acceptPitchDrag.js", "../src/controls/pitchDragAddHooks.js", "../src/controls/removeCameraDrag.js", "../src/controls/pitchDragRemoveHooks.js", "../src/constants/PitchDrag.js", "../src/controls/compassOrientation.js", "../src/controls/finishCompassPermission.js", "../src/controls/compassAddHooks.js", "../src/controls/compassRemoveHooks.js", "../src/constants/Compass.js", "../src/controls/resizeMap.js", "../src/controls/containerResizeAddHooks.js", "../src/controls/containerResizeRemoveHooks.js", "../src/constants/ContainerResize.js", "../src/controls/notifyCameraTouchChange.js", "../src/constants/TouchMode.js", "../src/controls/rotateButtonClick.js", "../src/controls/rotateButtonKeydown.js", "../src/controls/refreshRotateControl.js", "../src/controls/acceptRotateDrag.js", "../src/controls/refreshRotateFocus.js", "../src/controls/rotateOnAdd.js", "../src/controls/rotateOnRemove.js", "../src/controls/rotateControl.js", "../src/controls/startCameraTouch.js", "../src/controls/moveCameraTouch.js", "../src/controls/endCameraTouch.js", "../src/controls/endCameraTouchEvent.js", "../src/controls/changeCameraTouch.js", "../src/controls/endAllCameraTouches.js", "../src/controls/cleanupCameraTouch.js", "../src/controls/cameraControls.js", "../src/constants/nativeLayerState.js", "../src/core/nativeImageRefresh.js", "../src/core/nativeImageError.js", "../src/core/removeImageState.js", "../src/core/addImageState.js", "../src/rendering/synchronizeZoomView.js", "../src/rendering/destroyAfterSubmission.js", "../src/rendering/destroyTexture.js", "../src/rendering/resizeRenderer.js", "../src/geometry/cross.js", "../src/scene/updateCamera.js", "../src/geometry/bridgeElevation.js", "../src/terrain/sample.js", "../src/terrain/terrainElevation.js", "../src/terrain/getElevation.js", "../src/rendering/updateMapCamera.js", "../src/scene/updateWorldMatrix.js", "../src/geometry/computeBounds.js", "../src/rendering/collectMeshes.js", "../src/rendering/collectFrameMeshes.js", "../src/rendering/ensureRoofBlit.js", "../src/raster/getRasterTileSize.js", "../src/rendering/compareRoofTiles.js", "../src/rendering/composeRoofAtlas.js", "../src/rendering/rebuildRoofAtlas.js", "../src/rendering/updateRoofRaster.js", "../src/rendering/compareMeshes.js", "../src/rendering/sortMeshes.js", "../src/geometry/roofCoverage.js", "../src/rendering/prepareFrameMeshes.js", "../src/shadows/bindSunlight.js", "../src/lighting/visitCells.js", "../src/lighting/lightGrid.js", "../src/lighting/worldLights.js", "../src/lighting/cacheLightGrid.js", "../src/lighting/collectLightMeshes.js", "../src/lighting/updatePointLights.js", "../src/rendering/prepareFrameUniforms.js", "../src/rendering/drawGeometry.js", "../src/rendering/drawSceneMeshes.js", "../src/shadows/shadowCacheMatches.js", "../src/shadows/shadowBounds.js", "../src/shadows/shadowMatrix.js", "../src/shadows/ensureShadowPipeline.js", "../src/shadows/drawShadowMeshes.js", "../src/shadows/resizeSunlight.js", "../src/shadows/renderSunlight.js", "../src/constants/pendingUpdates.js", "../src/scene/cancelUpdate.js", "../src/scene/setParent.js", "../src/raster/removeRasterTile.js", "../src/raster/releaseRasterTile.js", "../src/raster/pruneRasterTiles.js", "../src/rendering/render.js", "../src/scene/renderPendingUpdates.js", "../src/scene/update.js", "../src/core/refreshNativeLayer.js", "../src/core/nativeLayerMethod.js", "../src/core/nativeSetLatLng.js", "../src/core/nativeSetLatLngs.js", "../src/core/nativeAddLatLng.js", "../src/core/nativeSetRadius.js", "../src/core/nativeSetStyle.js", "../src/core/nativeRedraw.js", "../src/core/nativeSetIcon.js", "../src/core/nativeSetUrl.js", "../src/core/nativeSetBounds.js", "../src/core/nativeSetOpacity.js", "../src/core/nativeSetZIndex.js", "../src/core/nativeSetZIndexOffset.js", "../src/core/nativeBringToFront.js", "../src/core/nativeBringToBack.js", "../src/constants/nativeMethodHandlers.js", "../src/constants/renderers.js", "../src/constants/cityMapper.js", "../src/scene/emptyNode.js", "../src/rendering/textureBinding.js", "../src/shaders/materialShaders.js", "../src/constants/elevationWGSL.js", "../src/rendering/reportCompilation.js", "../src/rendering/createProgram.js", "../src/rendering/createMesh.js", "../src/rendering/disposeMesh.js", "../src/triangulation/isClockWise.js", "../src/triangulation/cross.js", "../src/triangulation/equal.js", "../src/triangulation/clean.js", "../src/triangulation/inside.js", "../src/triangulation/insideHole.js", "../src/triangulation/on.js", "../src/triangulation/intersects.js", "../src/triangulation/crossesRing.js", "../src/triangulation/crossesBoundary.js", "../src/triangulation/containsVertex.js", "../src/triangulation/area.js", "../src/triangulation/minimumX.js", "../src/triangulation/sortHoles.js", "../src/triangulation/triangulate.js", "../src/geometry/nativeTriangle.js", "../src/geometry/diskAt.js", "../src/geometry/disk.js", "../src/geometry/circleAt.js", "../src/geometry/segment.js", "../src/geometry/line.js", "../src/geometry/polygon.js", "../src/geometry/visit.js", "../src/geometry/nativeGeometry.js", "../src/geometry/sub.js", "../src/geometry/dot.js", "../src/collision/sortHits.js", "../src/collision/intersectMeshes.js", "../src/scene/traverse.js", "../src/picking/collectVisibleMesh.js", "../src/picking/raycast.js", "../src/constants/nativeEventMaps.js", "../src/core/restoreNativeEvents.js", "../src/core/compareNativeHits.js", "../src/core/handleNativeMapEvent.js", "../src/core/nativeEvents.js", "../src/core/removeNativeEvents.js", "../src/utils/toSRGB.js", "../src/utils/channel.js", "../src/utils/parseColor.js", "../src/core/current.js", "../src/core/refreshNativeEvent.js", "../src/core/reorderNativeLayer.js", "../src/core/updateNativeLayerView.js", "../src/core/disposeNativeLayer.js", "../src/core/resolveNativeReady.js", "../src/core/rejectNativeReady.js", "../src/core/forwardNativeError.js", "../src/core/styleNativeMesh.js", "../src/core/uploadCanvasTexture.js", "../src/core/textureFor.js", "../src/core/putNativeMesh.js", "../src/core/quadNativeMesh.js", "../src/core/localPosition.js", "../src/core/boundsQuad.js", "../src/core/syncGridLayer.js", "../src/core/syncImageOverlay.js", "../src/core/markerQuadCorners.js", "../src/core/syncMarker.js", "../src/core/localPixel.js", "../src/core/localPixelForGeometry.js", "../src/core/syncVectorLayer.js", "../src/core/synchronizeNativeLayer.js", "../src/core/beforeNativeRender.js", "../src/core/nativeLayer.js", "../src/core/hideTargets.js", "../src/core/removeTargets.js", "../src/core/readyNativeGPU.js", "../src/scene/reportError.js", "../src/core/initNativeGPU.js", "../src/constants/mapCameraState.js", "../src/camera/mapGetBearing.js", "../src/camera/mapGetPitch.js", "../src/camera/cancelCameraAnimation.js", "../src/camera/mapStopPitchBearingAnimation.js", "../src/camera/updateSky.js", "../src/camera/mapSetPitchAndBearing.js", "../src/camera/runCameraAnimations.js", "../src/camera/scheduleCameraAnimation.js", "../src/camera/mapAnimateCamera.js", "../src/camera/mapSetBearing.js", "../src/camera/mapSetPitch.js", "../src/camera/mapResetNorth.js", "../src/camera/mapResetNorthPitch.js", "../src/camera/pointOf.js", "../src/camera/angles.js", "../src/camera/project.js", "../src/camera/animationPoint.js", "../src/camera/mapLayerPointToContainerPoint.js", "../src/camera/mapContainerPointToLayerPoint.js", "../src/camera/mapGetCenterLayerPoint.js", "../src/camera/mapUpdateCameraOverlays.js", "../src/camera/mapPanBy.js", "../src/camera/mapSetZoomAround.js", "../src/camera/mapPanInside.js", "../src/camera/groundBounds.js", "../src/camera/mapLimitCenter.js", "../src/camera/mapLimitOffset.js", "../src/camera/verticalGroundY.js", "../src/camera/fitCameraBounds.js", "../src/camera/mapGetBoundsCenterZoom.js", "../src/camera/mapGetBoundsZoom.js", "../src/camera/mapTryAnimatedPan.js", "../src/camera/mapGetBounds.js", "../src/camera/constrainCameraToBounds.js", "../src/controls/adjustCameraDrag.js", "../src/camera/cleanupCameraMap.js", "../src/camera/cameraMapReady.js", "../src/controls/loadCameraControls.js", "../src/utils/noOperation.js", "../src/camera/initializeCameraMap.js", "../src/core/markerSetIcon.js", "../src/core/markerSetRotation.js", "../src/core/markerCameraIconPoint.js", "../src/core/markerGetEvents.js", "../src/camera/displayPoint.js", "../src/core/markerSetPos.js", "../src/core/markerUpdateZIndex.js", "../src/core/cameraMarkerOnDrag.js", "../src/core/runMarkerPanFrame.js", "../src/core/scheduleMarkerPan.js", "../src/core/adjustCameraMarkerPan.js", "../src/core/cameraMarkerDrag.js", "../src/core/markerInitInteraction.js", "../src/core/popupGetEvents.js", "../src/core/tooltipGetEvents.js", "../src/core/popupAdjustPan.js", "../src/core/popupUpdatePosition.js", "../src/core/tooltipSetPosition.js", "../src/core/gridlayerGetEvents.js", "../src/core/gridlayerGetTiledPixelBounds.js", "../src/camera/mapCamera.js", "../src/scene/endZoom.js", "../src/constants/onMapChangeState.js", "../src/scene/renderPendingMapChange.js", "../src/scene/onMapChange.js", "../src/constants/onZoomAnimState.js", "../src/scene/renderPendingZoomAnimation.js", "../src/scene/onZoomAnim.js", "../src/scene/startZoom.js", "../src/geometry/lampRing.js", "../src/geometry/lampPostGeometry.js", "../src/geometry/quad.js", "../src/geometry/emitter.js", "../src/geometry/lightGeometry.js", "../src/constants/roundProfile.js", "../src/constants/ringDirections.js", "../src/geometry/treeRing.js", "../src/geometry/surface.js", "../src/geometry/treeGeometry.js", "../src/sources/updateStatus.js", "../src/archives/varint.js", "../src/archives/decodeDirectory.js", "../src/archives/decompress.js", "../src/archives/read.js", "../src/archives/loadDirectory.js", "../src/archives/tileId.js", "../src/archives/decodeHeader.js", "../src/archives/getHeader.js", "../src/archives/getZxy.js", "../src/archives/loadSource.js", "../src/constants/pumpState.js", "../src/utils/compareDistance.js", "../src/sources/projectedTree.js", "../src/sources/groundOffset.js", "../src/sources/addTriangle.js", "../src/sources/addGeneratedTriangle.js", "../src/sources/generateTreeGeometry.js", "../src/sources/buildAreaPoint.js", "../src/sources/projectRing.js", "../src/sources/buildAreaPolygon.js", "../src/sources/buildAreaFeature.js", "../src/sources/instanceAreaGeometry.js", "../src/sources/attachAreaMesh.js", "../src/sources/sourceAreaContext.js", "../src/sources/buildArea.js", "../src/sources/pump.js", "../src/picking/setHighlight.js", "../src/picking/showFeature.js", "../src/sources/releaseArea.js", "../src/sources/compareAreaDistance.js", "../src/sources/updateArea.js", "../src/terrain/setTerrainHeight.js", "../src/constants/attachState.js", "../src/scene/showWebGPUWarning.js", "../src/scene/failAttachment.js", "../src/scene/requestAdapter.js", "../src/scene/requestDevice.js", "../src/scene/rendererDeviceError.js", "../src/scene/rendererDeviceLost.js", "../src/scene/restoreObject.js", "../src/scene/attach.js", "../src/picking/findFeature.js", "../src/picking/onClick.js", "../src/picking/onPointerLeave.js", "../src/picking/onPointerMove.js", "../src/picking/pointerMove.js", "../src/picking/pointerClick.js", "../src/picking/pointerLeave.js", "../src/scene/attachLayer.js", "../src/scene/onAdd3DLayer.js", "../src/scene/releaseRenderer.js", "../src/scene/onRemove3DLayer.js", "../src/terrain/onTerrainChange.js", "../src/models/hasUnsupportedPrimitives.js", "../src/models/decodeModel.js", "../src/geometry/vertexNormals.js", "../src/collision/collectMeshes.js", "../src/geometry/conformModelToTerrain.js", "../src/models/loadBuffer.js", "../src/models/loadImage.js", "../src/models/textureSampler.js", "../src/models/textureFor.js", "../src/models/materialFor.js", "../src/models/nodeMatrix.js", "../src/constants/accessorTypes.js", "../src/constants/accessorSizes.js", "../src/models/readAccessorValues.js", "../src/models/readAccessor.js", "../src/models/modelNode.js", "../src/models/loadModel.js", "../src/scene/get3DEvents.js", "../src/scene/ready3D.js", "../src/scene/init3D.js", "../src/raster/isLoading.js", "../src/raster/comparePendingTiles.js", "../src/terrain/terrainAtlas.js", "../src/terrain/terrainGrid.js", "../src/raster/addRasterTile.js", "../src/raster/registerTerrainTile.js", "../src/raster/createGeometry.js", "../src/raster/createRasterMesh.js", "../src/raster/finishRasterTile.js", "../src/raster/loadRasterTile.js", "../src/raster/pumpRasterTiles.js", "../src/raster/updateRasterTiles.js", "../src/raster/getRasterEvents.js", "../src/raster/readyRaster.js", "../src/raster/reportError.js", "../src/raster/setRasterTerrain.js", "../src/raster/finishAttachment.js", "../src/raster/updateAttachedTiles.js", "../src/raster/onPMTileAdd.js", "../src/raster/releaseRasterTiles.js", "../src/raster/onPMTileRemove.js", "../src/raster/setRasterOpacity.js", "../src/raster/setPMTileOpacity.js", "../src/raster/setRasterZIndex.js", "../src/raster/setPMTileZIndex.js", "../src/raster/initRaster.js", "../src/sources/setGeoJSONData.js", "../src/terrain/clearLayerTerrain.js", "../src/terrain/onTerrainRemove.js", "../src/geometry/bridgeLocal.js", "../src/geometry/push.js", "../src/geometry/below.js", "../src/geometry/addBridges.js", "../src/terrain/loadTerrainTiles.js", "../src/terrain/readBridges.js", "../src/terrain/loadTerrain.js", "../src/terrain/loadReadyTerrain.js", "../src/terrain/setLayerTerrain.js", "../src/terrain/onTerrainAdd.js", "../src/terrain/initTerrain.js", "../src/sunlight/mix.js", "../src/sunlight/rgb.js", "../src/sunlight/atmosphere.js", "../src/sunlight/horizontalPosition.js", "../src/sunlight/solarPosition.js", "../src/sunlight/moonPosition.js", "../src/sunlight/projectCelestialBody.js", "../src/sunlight/updateSky.js", "../src/sunlight/render.js", "../src/sunlight/updateSun.js", "../src/sunlight/useLiveTime.js", "../src/sunlight/useSelectedTime.js", "../src/sunlight/tickSun.js", "../src/sunlight/removeSun.js", "../src/sunlight/onAddSun.js", "../src/constants/underEntryState.js", "../src/scene/placeEntry.js", "../src/scene/placeUnderEntry.js", "../src/scene/runPlacements.js", "../src/scene/replaceEntry.js", "../src/scene/removeEntry.js", "../src/scene/underEntry.js", "../src/sunlight/addTimeLayer.js", "../src/sunlight/removeTimeLayer.js", "../src/sunlight/initialize.js", "../src/sunlight/onAdd.js", "../src/sunlight/styleTimeControl.js", "../src/sunlight/addTo.js", "../src/sunlight/remove.js", "../src/sunlight/initSunlight.js", "../src/geometry/triangle.js", "../src/geometry/build.js", "../src/traffic/tooltip.js", "../src/geometry/box.js", "../src/constants/glass.js", "../src/constants/tyre.js", "../src/vehicles/mirror.js", "../src/constants/paints.js", "../src/constants/headlight.js", "../src/constants/taillight.js", "../src/vehicles/carModel.js", "../src/constants/hull.js", "../src/constants/white.js", "../src/vehicles/boatBenches.js", "../src/vehicles/boatModel.js", "../src/traffic/routeColor.js", "../src/vehicles/carriage.js", "../src/vehicles/busModel.js", "../src/vehicles/tramModel.js", "../src/vehicles/metroModel.js", "../src/constants/skin.js", "../src/constants/trousers.js", "../src/constants/dark.js", "../src/vehicles/bicycleModel.js", "../src/constants/shirt.js", "../src/constants/parts.js", "../src/vehicles/pedestrianModel.js", "../src/constants/vehicles.js", "../src/constants/trafficShader.js", "../src/traffic/along.js", "../src/traffic/locateTraffic.js", "../src/traffic/placeTraffic.js", "../src/traffic/startTraffic.js", "../src/traffic/addTraffic.js", "../src/traffic/disposeTrafficObject.js", "../src/traffic/destroyTrafficGpu.js", "../src/traffic/removeTraffic.js", "../src/traffic/readyTraffic.js", "../src/traffic/vehicleOffsets.js", "../src/traffic/clockMinutes.js", "../src/traffic/compareDepartures.js", "../src/traffic/scheduledTrips.js", "../src/traffic/tripsAt.js", "../src/traffic/trafficNow.js", "../src/traffic/failTraffic.js", "../src/traffic/routeGeometry.js", "../src/traffic/createTrafficMesh.js", "../src/traffic/drawTrafficRoute.js", "../src/traffic/trafficBounds.js", "../src/traffic/rebuildTrafficMesh.js", "../src/traffic/trafficStorage.js", "../src/traffic/rebaseTraffic.js", "../src/traffic/moveTraffic.js", "../src/traffic/tickTraffic.js", "../src/traffic/fetchTrafficLanes.js", "../src/traffic/toLanes.js", "../src/traffic/groundTraffic.js", "../src/traffic/prepareTraffic.js", "../src/traffic/loadedTrafficLanes.js", "../src/traffic/failedTrafficLoad.js", "../src/traffic/loadTraffic.js", "../src/traffic/updateTraffic.js", "../src/traffic/updateTrafficTerrain.js", "../src/traffic/initTraffic.js", "../src/walk/onBlur.js", "../src/constants/moves.js", "../src/walk/onPointer.js", "../src/constants/limbs.js", "../src/walk/local.js", "../src/walk/place.js", "../src/walk/onTerrain.js", "../src/walk/stop.js", "../src/walk/onKey.js", "../src/utils/wrap.js", "../src/constants/colliders.js", "../src/collision/collider.js", "../src/collision/horizontalRay.js", "../src/picking/shouldSkipOther.js", "../src/picking/hitMesh.js", "../src/picking/hit.js", "../src/walk/blocked.js", "../src/walk/step.js", "../src/walk/start.js", "../src/walk/toggle.js", "../src/walk/createWalk.js", "../src/walk/initialize.js", "../src/walk/onAdd.js", "../src/walk/onRemove.js", "../src/walk/initWalk.js", "../src/constants/indexState.js", "../src/scene/emptyEvents.js", "../src/core/refreshNativeLayerContract.js", "../src/core/bringNativeLayerToFront.js", "../src/core/bringNativeLayerToBack.js", "../src/core/closestCameraLayerPoint.js", "../src/core/cameraCircleBounds.js", "../src/core/initializeGridContainer.js", "../src/core/cancelGridFade.js", "../src/core/runGridFades.js", "../src/core/scheduleGridFade.js", "../src/core/updateGridOpacity.js", "../src/core/fireRasterLoad.js", "../src/core/addRasterImage.js", "../src/core/initializeNativeLayer.js", "../src/scene/layerLayerAdd.js", "../src/sources/setGeoJSONLayerData.js", "../src/sources/initializeGeoJSON.js", "../src/scene/initializerFor.js", "../src/scene/resolveNextInitialization.js", "../src/scene/initializeLayer.js", "../src/scene/layerInitialize.js", "../src/index.js"],
|
|
4
|
+
"sourcesContent": ["export function editable(target) {\r\n return target.closest?.('input,textarea,select,[contenteditable=\"true\"]');\r\n}\n", "import { editable } from './editable.js';\n\nexport function shiftRotateWheel(event) {\r\n const handler = this._cameraShiftRotate;\r\n if (!event.shiftKey || editable(event.target) || event.target.closest('.leaflet-control')) return;\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n handler._map.setBearing(handler._map.getBearing() + Math.sign(event.deltaY) * 5);\r\n}\n", "import { shiftRotateWheel } from './shiftRotateWheel.js';\n\nexport function shiftRotateAddHooks() {\n const container = this._map.getContainer();\r\n container._cameraShiftRotate = this;\r\n this._wheel = shiftRotateWheel;\r\n container.addEventListener('wheel', this._wheel, { passive: false, capture: true });\n}\n", "export function shiftRotateRemoveHooks() {\n const container = this._map.getContainer();\r\n container.removeEventListener('wheel', this._wheel, true);\r\n delete container._cameraShiftRotate;\n}\n", "import { shiftRotateAddHooks } from '../controls/shiftRotateAddHooks.js';\nimport { shiftRotateRemoveHooks } from '../controls/shiftRotateRemoveHooks.js';\n\nexport const ShiftRotate = L.Handler.extend({\n addHooks: shiftRotateAddHooks,\n removeHooks: shiftRotateRemoveHooks,\n});\n", "export const cameraControlsState = {};\n", "import { cameraControlsState } from '../constants/cameraControlsState.js';\nimport { editable } from './editable.js';\n\nexport function cameraDragDown(event) {\r\n const state = cameraControlsState.dragStates.get(this);\r\n if (state.drag || !state.accept(event) || editable(event.target)) return;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n state.moved = false;\r\n const rect = state.map.getContainer().getBoundingClientRect();\r\n state.drag = {\r\n id: event.pointerId, x: event.clientX, y: event.clientY, cursor: state.element.style.cursor,\r\n cx: rect.left + rect.width / 2, cy: rect.top + rect.height / 2,\r\n dragging: state.map.dragging?.enabled(),\r\n };\r\n state.map.dragging?.disable();\r\n state.element.focus?.({ preventScroll: true });\r\n state.element.setPointerCapture(event.pointerId);\r\n state.element.style.cursor = 'grabbing';\r\n}\n", "import { cameraControlsState } from '../constants/cameraControlsState.js';\n\nexport function cameraDragMove(event) {\r\n const state = cameraControlsState.dragStates.get(this);\r\n if (!state.drag || state.drag.id !== event.pointerId) return;\r\n const x = event.clientX - state.drag.x, y = event.clientY - state.drag.y;\r\n if (Math.hypot(x, y) < 3 && !state.moved) return;\r\n state.map._stopPitchBearingAnimation();\r\n state.moved = true;\r\n event.preventDefault();\r\n let bearing = x * state.sensitivity[0];\r\n if (state.orbit) {\r\n if (Math.abs(state.drag.cy - state.drag.y) > 100) {\r\n const angle = Math.atan2(event.clientY - state.drag.cy, event.clientX - state.drag.cx) -\r\n Math.atan2(event.clientY - state.drag.cy, state.drag.x - state.drag.cx);\r\n bearing = Math.atan2(Math.sin(angle), Math.cos(angle)) * 180 / Math.PI;\r\n } else bearing *= event.clientY < state.drag.cy ? 1 : -1;\r\n }\r\n state.map._setPitchAndBearing(state.map.getPitch() - y * state.sensitivity[1],\r\n state.map.getBearing() + bearing);\r\n state.drag.x = event.clientX;\r\n state.drag.y = event.clientY;\r\n}\n", "export function finishCameraDrag(state, event) {\r\n if (!state?.drag) return;\r\n if (event?.pointerId !== undefined && event.pointerId !== state.drag.id) return;\r\n const finished = state.drag;\r\n state.drag = null;\r\n if (state.element.hasPointerCapture?.(finished.id)) state.element.releasePointerCapture(finished.id);\r\n if (finished.dragging && state.map.getContainer()._leaflet_id) state.map.dragging.enable();\r\n state.element.style.cursor = finished.cursor;\r\n}\n", "import { finishCameraDrag } from './finishCameraDrag.js';\nimport { cameraControlsState } from '../constants/cameraControlsState.js';\n\nexport function cameraDragEnd(event) {\r\n finishCameraDrag(cameraControlsState.dragStates.get(this), event);\r\n}\n", "import { cameraControlsState } from '../constants/cameraControlsState.js';\n\nexport function cameraDragClick(event) {\r\n const state = cameraControlsState.dragStates.get(this);\r\n if (!state.moved) return;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n state.moved = false;\r\n}\n", "import { cameraControlsState } from '../constants/cameraControlsState.js';\n\nexport function cameraDragContextMenu(event) {\r\n const state = cameraControlsState.dragStates.get(this);\r\n if (!state.drag && !state.moved) return;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n}\n", "import { cameraControlsState } from '../constants/cameraControlsState.js';\nimport { finishCameraDrag } from './finishCameraDrag.js';\n\nexport function endAllCameraDrags() {\n let state;\n for (state of cameraControlsState.cameraDrags) finishCameraDrag(state);\n}\n", "import { cameraControlsState } from '../constants/cameraControlsState.js';\nimport { cameraDragDown } from './cameraDragDown.js';\nimport { cameraDragMove } from './cameraDragMove.js';\nimport { cameraDragEnd } from './cameraDragEnd.js';\nimport { cameraDragClick } from './cameraDragClick.js';\nimport { cameraDragContextMenu } from './cameraDragContextMenu.js';\nimport { endAllCameraDrags } from './endAllCameraDrags.js';\n\nexport function dragCamera(map, element, accept, sensitivity = [0.8, 0.5], orbit = false) {\r\n const state = { map, element, accept, sensitivity, orbit, drag: null, moved: false };\r\n cameraControlsState.dragStates.set(element, state);\r\n cameraControlsState.cameraDrags.add(state);\r\n element.addEventListener('pointerdown', cameraDragDown, true);\r\n element.addEventListener('pointermove', cameraDragMove);\r\n element.addEventListener('pointerup', cameraDragEnd);\r\n element.addEventListener('pointercancel', cameraDragEnd);\r\n element.addEventListener('lostpointercapture', cameraDragEnd);\r\n element.addEventListener('click', cameraDragClick, true);\r\n element.addEventListener('contextmenu', cameraDragContextMenu);\r\n window.addEventListener('blur', endAllCameraDrags);\r\n return state;\r\n}\n", "export function acceptPitchDrag(event) {\r\n return !event.target.closest('.leaflet-control,.leaflet-marker-icon,.leaflet-popup') &&\r\n (event.button === 2 || event.button === 0 && event.ctrlKey);\r\n}\n", "import { dragCamera } from './dragCamera.js';\nimport { acceptPitchDrag } from './acceptPitchDrag.js';\n\nexport function pitchDragAddHooks() {\n this._dragState = dragCamera(this._map, this._map.getContainer(), acceptPitchDrag, [0.8, 0.5], true);\n}\n", "import { finishCameraDrag } from './finishCameraDrag.js';\nimport { cameraDragDown } from './cameraDragDown.js';\nimport { cameraDragMove } from './cameraDragMove.js';\nimport { cameraDragEnd } from './cameraDragEnd.js';\nimport { cameraDragClick } from './cameraDragClick.js';\nimport { cameraDragContextMenu } from './cameraDragContextMenu.js';\nimport { cameraControlsState } from '../constants/cameraControlsState.js';\nimport { endAllCameraDrags } from './endAllCameraDrags.js';\n\nexport function removeCameraDrag(state) {\r\n finishCameraDrag(state);\r\n const { element } = state;\r\n element.removeEventListener('pointerdown', cameraDragDown, true);\r\n element.removeEventListener('pointermove', cameraDragMove);\r\n element.removeEventListener('pointerup', cameraDragEnd);\r\n element.removeEventListener('pointercancel', cameraDragEnd);\r\n element.removeEventListener('lostpointercapture', cameraDragEnd);\r\n element.removeEventListener('click', cameraDragClick, true);\r\n element.removeEventListener('contextmenu', cameraDragContextMenu);\r\n cameraControlsState.dragStates.delete(element);\r\n cameraControlsState.cameraDrags.delete(state);\r\n if (!cameraControlsState.cameraDrags.size) window.removeEventListener('blur', endAllCameraDrags);\r\n}\n", "import { removeCameraDrag } from './removeCameraDrag.js';\n\nexport function pitchDragRemoveHooks() {\n removeCameraDrag(this._dragState);\n}\n", "import { pitchDragAddHooks } from '../controls/pitchDragAddHooks.js';\nimport { pitchDragRemoveHooks } from '../controls/pitchDragRemoveHooks.js';\n\nexport const PitchDrag = L.Handler.extend({\n addHooks: pitchDragAddHooks,\n removeHooks: pitchDragRemoveHooks,\n});\n", "export function compassOrientation(event) {\r\n const handler = this.handler;\r\n const bearing = Number.isFinite(event.webkitCompassHeading) ? -event.webkitCompassHeading : event.alpha;\r\n const orientation = event.absolute ? 0 : (screen.orientation?.angle ?? window.orientation ?? 0);\r\n if (Number.isFinite(bearing)) handler._map.setBearing(bearing - orientation);\r\n}\n", "export function finishCompassPermission([handlerResult, permissionResult]) {\r\n const { handler, generation } = handlerResult.value;\r\n try {\r\n if (!handler.enabled() || handler._generation !== generation) return;\r\n if (!window.DeviceOrientationEvent || permissionResult.status !== 'fulfilled' ||\r\n permissionResult.value !== 'granted') {\r\n throw permissionResult.status === 'rejected' ? permissionResult.reason :\r\n new Error('Device compass permission unavailable or denied');\r\n }\r\n window.addEventListener('deviceorientation', handler._orientation);\r\n window.addEventListener('deviceorientationabsolute', handler._orientation);\r\n } catch (error) {\r\n handler.disable();\r\n handler._map.fire('error', { error });\r\n }\r\n}\n", "import { compassOrientation } from './compassOrientation.js';\nimport { finishCompassPermission } from './finishCompassPermission.js';\n\nexport function compassAddHooks() {\n this._compassGeneration = (this._generation = (this._generation || 0) + 1);\r\n this._orientation = { handler: this, handleEvent: compassOrientation };\r\n const permission = window.DeviceOrientationEvent?.requestPermission;\r\n let request;\r\n try {\r\n request = permission ? permission.call(window.DeviceOrientationEvent) : 'granted';\r\n } catch (error) {\r\n request = Promise.reject(error);\r\n }\r\n Promise.allSettled([Promise.resolve({ handler: this, generation: this._generation }), request]).then(finishCompassPermission);\n}\n", "export function compassRemoveHooks() {\n this._generation++;\r\n window.removeEventListener('deviceorientation', this._orientation);\r\n window.removeEventListener('deviceorientationabsolute', this._orientation);\n}\n", "import { compassAddHooks } from '../controls/compassAddHooks.js';\nimport { compassRemoveHooks } from '../controls/compassRemoveHooks.js';\n\nexport const Compass = L.Handler.extend({\n addHooks: compassAddHooks,\n removeHooks: compassRemoveHooks,\n});\n", "export function resizeMap(entries) {\r\n entries[0]?.target._containerResizeMap.invalidateSize();\r\n}\n", "import { resizeMap } from './resizeMap.js';\n\nexport function containerResizeAddHooks() {\n const container = this._map.getContainer();\r\n container._containerResizeMap = this._map;\r\n this._observer = new ResizeObserver(resizeMap);\r\n this._observer.observe(container);\n}\n", "export function containerResizeRemoveHooks() {\n const container = this._map.getContainer();\r\n this._observer.disconnect();\r\n delete container._containerResizeMap;\n}\n", "import { containerResizeAddHooks } from '../controls/containerResizeAddHooks.js';\nimport { containerResizeRemoveHooks } from '../controls/containerResizeRemoveHooks.js';\n\nexport const ContainerResize = L.Handler.extend({\n addHooks: containerResizeAddHooks,\n removeHooks: containerResizeRemoveHooks,\n});\n", "export function notifyCameraTouchChange() { this._map.fire('cameratouchchange'); }\n", "import { notifyCameraTouchChange } from '../controls/notifyCameraTouchChange.js';\n\nexport const TouchMode = L.Handler.extend({\n addHooks: notifyCameraTouchChange,\n removeHooks: notifyCameraTouchChange,\n});\n", "export function rotateButtonClick(event) {\r\n const control = this._rotateControl, map = control._map;\r\n event.preventDefault();\r\n if (control.options.visualizePitch) map.resetNorthPitch();\r\n else map.resetNorth();\r\n if (event.detail) map.getContainer().focus({ preventScroll: true });\r\n}\n", "export function rotateButtonKeydown(event) {\r\n const control = this._rotateControl, map = control._map, step = event.shiftKey ? 15 : 5;\r\n if (event.key === 'ArrowLeft') map.setBearing(map.getBearing() - step);\r\n else if (event.key === 'ArrowRight') map.setBearing(map.getBearing() + step);\r\n else if (event.key === 'ArrowUp' && control.options.visualizePitch) map.setPitch(map.getPitch() + step);\r\n else if (event.key === 'ArrowDown' && control.options.visualizePitch) map.setPitch(map.getPitch() - step);\r\n else if (event.key === 'Home' || event.key === ' ') this.click();\r\n else return;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n}\n", "export function refreshRotateControl() {\r\n const map = this._map, pitch = this.options.visualizePitch ? map.getPitch() : 0;\r\n this._arrow.style.transform = `scale(${1 / Math.sqrt(Math.cos(pitch * Math.PI / 180))}) rotateX(${pitch}deg) rotate(${map.getBearing()}deg)`;\r\n this._button.setAttribute('aria-description', `Bearing ${Math.round(map.getBearing())} degrees, pitch ${Math.round(map.getPitch())} degrees. Arrow keys adjust the camera; Home resets it.`);\r\n this._container.style.display = this.options.closeOnZeroBearing && !map.getBearing() && !pitch &&\r\n !this._container.contains(document.activeElement) ? 'none' : '';\r\n}\n", "export function acceptRotateDrag(event) {\r\n return event.button === 0;\r\n}\n", "import { refreshRotateControl } from './refreshRotateControl.js';\n\nexport function refreshRotateFocus() {\r\n refreshRotateControl.call(this._rotateControl);\r\n}\n", "import { rotateButtonClick } from './rotateButtonClick.js';\nimport { rotateButtonKeydown } from './rotateButtonKeydown.js';\nimport { refreshRotateControl } from './refreshRotateControl.js';\nimport { dragCamera } from './dragCamera.js';\nimport { acceptRotateDrag } from './acceptRotateDrag.js';\nimport { refreshRotateFocus } from './refreshRotateFocus.js';\n\nexport function rotateOnAdd(map) {\n const container = L.DomUtil.create('div', 'leaflet-control-rotate leaflet-bar');\r\n const button = L.DomUtil.create('a', 'leaflet-control-rotate-toggle', container);\r\n this._map = map;\r\n this._container = container;\r\n this._button = button;\r\n button._rotateControl = this;\r\n button.href = '#';\r\n button.draggable = false;\r\n button.setAttribute('role', 'button');\r\n button.title = this.options.visualizePitch ? 'Reset bearing and pitch' : 'Reset bearing to north';\r\n button.setAttribute('aria-label', button.title);\r\n button.style.cssText = 'cursor:grab;touch-action:none';\r\n const arrow = L.DomUtil.create('span', 'leaflet-control-rotate-arrow', button);\r\n this._arrow = arrow;\r\n arrow.setAttribute('aria-hidden', 'true');\r\n arrow.style.cssText = 'display:block;width:100%;height:100%;pointer-events:none;background: no-repeat center / 29px 29px';\r\n arrow.style.backgroundImage = 'url(\"data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 29 29%27%3E%3Cpath fill=%27%23333%27 d=%27M10.5 14 14.5 6 18.5 14Z%27/%3E%3Cpath fill=%27%23ccc%27 d=%27M10.5 16 14.5 24 18.5 16Z%27/%3E%3C/svg%3E\")';\r\n button.onclick = rotateButtonClick;\r\n button.onkeydown = rotateButtonKeydown;\r\n this._refresh = refreshRotateControl;\r\n map.on('rotate pitch', this._refresh, this);\r\n this._refresh();\r\n this._dragState = dragCamera(map, button, acceptRotateDrag,\r\n [0.8, this.options.visualizePitch ? 0.5 : 0]);\r\n button.addEventListener('focusout', refreshRotateFocus);\r\n L.DomEvent.on(button, 'dblclick contextmenu', L.DomEvent.stop);\r\n L.DomEvent.disableClickPropagation(container);\r\n L.DomEvent.disableScrollPropagation(container);\r\n return container;\n}\n", "import { pitchDragRemoveHooks } from './pitchDragRemoveHooks.js';\n\nexport function rotateOnRemove(map) {\n map.off('rotate pitch', this._refresh, this);\n pitchDragRemoveHooks.call(this);\n}\n", "export function rotateControl(options) {\r\n return new L.Control.Rotate(options);\r\n}\n", "export function startCameraTouch(event) {\r\n const state = this._cameraTouchState, { map, container } = state;\r\n if (state.touch || event.touches.length !== 2 || event.target.closest('.leaflet-control')) return;\r\n if (!map.touchRotate.enabled() && !map.touchPitch.enabled()) return;\r\n const [a, b] = event.touches;\r\n if (Math.hypot(b.clientX - a.clientX, b.clientY - a.clientY) < 1) return;\r\n map._stopPitchBearingAnimation();\r\n const middle = new L.Point((a.clientX + b.clientX) / 2, (a.clientY + b.clientY) / 2)\r\n .subtract(new L.Point(container.getBoundingClientRect().left, container.getBoundingClientRect().top));\r\n state.touch = {\r\n angle: Math.atan2(b.clientY - a.clientY, b.clientX - a.clientX),\r\n distance: Math.hypot(b.clientX - a.clientX, b.clientY - a.clientY), middle,\r\n anchor: map.containerPointToLatLng(middle), zoom: map.getZoom(),\r\n bearing: map.getBearing(), pitch: map.getPitch(), zooming: map.touchZoom?.enabled(),\r\n dragging: map.dragging?.enabled(),\r\n };\r\n map.dragging?.disable();\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n if (state.nativeZoom !== undefined) state.touch.zooming = state.nativeZoom;\r\n state.touch.snap = map.options.zoomSnap;\r\n map.options.zoomSnap = 0;\r\n}\n", "export function moveCameraTouch(event) {\r\n const state = this._cameraTouchState, { map, container, touch } = state;\r\n if (!touch || event.touches.length !== 2) return;\r\n const [a, b] = event.touches;\r\n const angle = Math.atan2(b.clientY - a.clientY, b.clientX - a.clientX);\r\n const middle = new L.Point((a.clientX + b.clientX) / 2, (a.clientY + b.clientY) / 2)\r\n .subtract(new L.Point(container.getBoundingClientRect().left, container.getBoundingClientRect().top));\r\n const delta = Math.atan2(Math.sin(angle - touch.angle), Math.cos(angle - touch.angle)) * 180 / Math.PI;\r\n map._setPitchAndBearing(map.touchPitch.enabled() ? touch.pitch - (middle.y - touch.middle.y) * 0.25 : touch.pitch,\r\n map.touchRotate.enabled() ? touch.bearing + delta : touch.bearing);\r\n const distance = Math.hypot(b.clientX - a.clientX, b.clientY - a.clientY);\r\n if (distance < 1) return;\r\n const zoom = touch.zooming ? Math.max(map.getMinZoom(), Math.min(map.getMaxZoom(),\r\n touch.zoom + Math.log2(distance / touch.distance))) : touch.zoom;\r\n map.setView(map.getCenter(), zoom, { animate: false });\r\n if (map.options.touchZoom !== 'center') {\r\n const projected = map.project(touch.anchor).subtract(map.project(map.containerPointToLatLng(middle)));\r\n map.setView(map.unproject(map.project(map.getCenter()).add(projected)), map.getZoom(), { animate: false });\r\n }\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n}\n", "export function endCameraTouch(state, event) {\r\n if (!state.touch) return;\r\n if (event?.touches?.length >= 2) return;\r\n const { map, container, touch } = state;\r\n if (touch.dragging && container._leaflet_id) map.dragging.enable();\r\n map.options.zoomSnap = touch.snap;\r\n if (touch.zooming && touch.snap && container._leaflet_id) {\r\n map.setZoom(Math.round(map.getZoom() / touch.snap) * touch.snap, { animate: false });\r\n }\r\n state.touch = null;\r\n}\n", "import { endCameraTouch } from './endCameraTouch.js';\n\nexport function endCameraTouchEvent(event) {\r\n endCameraTouch(this._cameraTouchState, event);\r\n}\n", "import { endCameraTouch } from './endCameraTouch.js';\n\nexport function changeCameraTouch() {\r\n const state = this._cameraTouchState, { map, container } = state;\r\n const active = map.touchRotate.enabled() || map.touchPitch.enabled();\r\n if (active && state.nativeZoom === undefined) {\r\n state.nativeZoom = map.touchZoom?.enabled();\r\n map.touchZoom?.disable();\r\n } else if (!active && state.nativeZoom !== undefined) {\r\n endCameraTouch(state);\r\n if (state.nativeZoom && container._leaflet_id) map.touchZoom.enable();\r\n state.nativeZoom = undefined;\r\n }\r\n}\n", "import { cameraControlsState } from '../constants/cameraControlsState.js';\nimport { endCameraTouch } from './endCameraTouch.js';\n\nexport function endAllCameraTouches() {\n let state;\n for (state of cameraControlsState.cameraTouchStates) endCameraTouch(state);\n}\n", "import { endCameraTouch } from './endCameraTouch.js';\nimport { startCameraTouch } from './startCameraTouch.js';\nimport { moveCameraTouch } from './moveCameraTouch.js';\nimport { endCameraTouchEvent } from './endCameraTouchEvent.js';\nimport { cameraControlsState } from '../constants/cameraControlsState.js';\nimport { endAllCameraTouches } from './endAllCameraTouches.js';\nimport { changeCameraTouch } from './changeCameraTouch.js';\n\nexport function cleanupCameraTouch() {\r\n const state = this._cameraTouchState;\r\n if (!state) return;\r\n const { container, map } = state;\r\n endCameraTouch(state);\r\n container.removeEventListener('touchstart', startCameraTouch, true);\r\n container.removeEventListener('touchmove', moveCameraTouch, true);\r\n container.removeEventListener('touchend', endCameraTouchEvent, true);\r\n container.removeEventListener('touchcancel', endCameraTouchEvent, true);\r\n cameraControlsState.cameraTouchStates.delete(state);\r\n if (!cameraControlsState.cameraTouchStates.size) window.removeEventListener('blur', endAllCameraTouches);\r\n map.off('cameratouchchange', changeCameraTouch, map);\r\n map.rotateControl?.remove();\r\n delete container._cameraTouchState;\r\n delete map._cameraTouchState;\r\n}\n", "import { ShiftRotate } from '../constants/ShiftRotate.js';\nimport { PitchDrag } from '../constants/PitchDrag.js';\nimport { Compass } from '../constants/Compass.js';\nimport { ContainerResize } from '../constants/ContainerResize.js';\nimport { TouchMode } from '../constants/TouchMode.js';\nimport { cameraControlsState } from '../constants/cameraControlsState.js';\nimport { rotateOnAdd } from './rotateOnAdd.js';\nimport { rotateOnRemove } from './rotateOnRemove.js';\nimport { rotateControl } from './rotateControl.js';\nimport { shiftRotateAddHooks } from './shiftRotateAddHooks.js';\nimport { shiftRotateRemoveHooks } from './shiftRotateRemoveHooks.js';\nimport { pitchDragAddHooks } from './pitchDragAddHooks.js';\nimport { pitchDragRemoveHooks } from './pitchDragRemoveHooks.js';\nimport { compassAddHooks } from './compassAddHooks.js';\nimport { compassRemoveHooks } from './compassRemoveHooks.js';\nimport { containerResizeAddHooks } from './containerResizeAddHooks.js';\nimport { containerResizeRemoveHooks } from './containerResizeRemoveHooks.js';\nimport { startCameraTouch } from './startCameraTouch.js';\nimport { moveCameraTouch } from './moveCameraTouch.js';\nimport { endCameraTouchEvent } from './endCameraTouchEvent.js';\nimport { changeCameraTouch } from './changeCameraTouch.js';\nimport { cleanupCameraTouch } from './cleanupCameraTouch.js';\nimport { endAllCameraTouches } from './endAllCameraTouches.js';\n\ncameraControlsState.cameraDrags = new Set();\ncameraControlsState.dragStates = new WeakMap();\ncameraControlsState.cameraTouchStates = new Set();\n\nL.Control.Rotate = L.Control.extend({\n options: { position: 'topleft', closeOnZeroBearing: true, visualizePitch: true },\n onAdd: rotateOnAdd,\n onRemove: rotateOnRemove,\n});\n\nif (L.control) L.control.rotate = rotateControl;\n\nexport function cameraControls(map) {\n map.addHandler('trackContainerMutation', ContainerResize);\n if (!map.options.rotate) return;\n map.addHandler('shiftKeyRotate', ShiftRotate);\n map.addHandler('pitchDrag', PitchDrag);\n map.addHandler('compassBearing', Compass);\n map.addHandler('touchRotate', TouchMode);\n map.addHandler('touchPitch', TouchMode);\n const container = map.getContainer();\n const state = map._cameraTouchState = { map, container, touch: null, nativeZoom: undefined };\n container._cameraTouchState = state;\n cameraControlsState.cameraTouchStates.add(state);\n container.addEventListener('touchstart', startCameraTouch, { capture: true, passive: false });\n container.addEventListener('touchmove', moveCameraTouch, { capture: true, passive: false });\n container.addEventListener('touchend', endCameraTouchEvent, true);\n container.addEventListener('touchcancel', endCameraTouchEvent, true);\n window.addEventListener('blur', endAllCameraTouches);\n map.on('cameratouchchange', changeCameraTouch, map);\n if (map.options.rotateControl) {\n map.rotateControl = new L.Control.Rotate(typeof map.options.rotateControl === 'object' ? map.options.rotateControl : {});\n map.rotateControl.addTo(map);\n }\n map.once('unload', cleanupCameraTouch, map);\n}\n", "export const nativeLayerState = {};\n", "import { nativeLayerState } from '../constants/nativeLayerState.js';\nimport { refreshNativeLayer } from './refreshNativeLayer.js';\n\nexport function nativeImageRefresh(event) {\n let state;\n for (state of nativeLayerState.imageStates.get(event.currentTarget) || []) refreshNativeLayer(state);\n}\n", "import { nativeLayerState } from '../constants/nativeLayerState.js';\n\nexport function nativeImageError(event) {\n let state;\n for (state of nativeLayerState.imageStates.get(event.currentTarget) || []) {\n state.source.fire('error', { error: new Error('Unable to load native layer image') });\n }\n}\n", "import { nativeLayerState } from '../constants/nativeLayerState.js';\n\nexport function removeImageState(image, state) {\r\n const states = nativeLayerState.imageStates.get(image);\r\n if (!states) return;\r\n states.delete(state);\r\n if (!states.size) nativeLayerState.imageStates.delete(image);\r\n}\n", "import { nativeLayerState } from '../constants/nativeLayerState.js';\n\nexport function addImageState(image, state) {\r\n let states = nativeLayerState.imageStates.get(image);\r\n if (!states) nativeLayerState.imageStates.set(image, states = new Set());\r\n states.add(state);\r\n}\n", "export function synchronizeZoomView(backend, now) {\n const map = backend._map;\n let animation, time, start;\n if (map._animatingZoom) {\n backend._zoomTransitions ||= new Map();\n for (animation of map.getContainer().getAnimations({ subtree: true })) {\n if (!(animation instanceof CSSTransition) || animation.transitionProperty !== 'transform' ||\n !animation.effect.target.classList.contains('leaflet-zoom-animated') ||\n backend._zoomTransitions.has(animation)) {\n continue;\n }\n time = animation.currentTime || 0;\n animation.pause();\n backend._zoomTransitions.set(animation, { start: now, time });\n }\n // Freeze CSS between rendered frames: the compositor must not outrun the canvas.\n for ([animation, { start, time }] of backend._zoomTransitions) {\n animation.currentTime = Math.min(animation.effect.getComputedTiming().endTime, time + now - start);\n }\n if (backend._zoomView) {\n const view = backend._zoomView;\n let proxy;\n for (animation of backend._zoomTransitions.keys()) {\n if (animation.effect.target === map._proxy) { proxy = animation; break; }\n }\n const progress = proxy?.effect.getComputedTiming().progress ?? Math.min(1, (now - view.start) / 250);\n const targetScale = map.getZoomScale(view.targetZoom, view.zoom), scale = 1 + (targetScale - 1) * progress;\n const from = map.project(view.from, view.zoom), to = map.project(view.to, view.zoom);\n map._cameraView = { zoom: map.getScaleZoom(scale, view.zoom),\n center: map.unproject(from.add(to.subtract(from).multiplyBy(targetScale * progress / scale)), view.zoom) };\n map._updateCameraOverlays();\n }\n }\n}\n", "export async function destroyAfterSubmission(layer, texture, submitted) {\r\n try {\r\n await submitted;\r\n } catch (error) {\r\n layer.fire('error', { error });\r\n }\r\n texture.destroy();\r\n}\r\n", "\nimport { destroyAfterSubmission } from './destroyAfterSubmission.js';\n\nexport function destroyTexture(layer, texture) {\n destroyAfterSubmission(layer, texture, layer.renderer.device.queue.onSubmittedWorkDone());\n}\n", "import { destroyTexture } from './destroyTexture.js';\n\nexport function resizeRenderer(backend, size) {\n if (!backend._size || !backend._size.equals(size)) {\n backend.renderer.width = size.x;\n backend.renderer.height = size.y;\n backend.renderer.canvas.width = Math.round(size.x * backend.renderer.dpr);\n backend.renderer.canvas.height = Math.round(size.y * backend.renderer.dpr);\n backend.renderer.canvas.style.width = `${size.x}px`;\n backend.renderer.canvas.style.height = `${size.y}px`;\n if (backend.renderer.depthTexture) destroyTexture(backend, backend.renderer.depthTexture);\n backend.renderer.depthTexture = backend.renderer.device.createTexture({\n size: [backend.renderer.canvas.width, backend.renderer.canvas.height],\n format: 'depth24plus',\n usage: GPUTextureUsage.RENDER_ATTACHMENT,\n });\n backend._size = size;\n }\n}\n", "export function cross(a, b) {\r\n return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\r\n}\r\n", "import { cross } from '../geometry/cross.js';\n\n/** Orthonormal view basis plus perspective matrices, refreshed before projecting/drawing. */\n\nexport function updateCamera(camera) {\n const z = [];\n let i, value;\n for (i = 0; i < camera.position.length; i++) z.push(camera.position[i] - camera.target[i]);\n const zLength = Math.hypot(...z) || 1;\n for (i = 0; i < 3; i++) {\n z[i] /= zLength;\n }\n const x = cross(camera.up, z), xLength = Math.hypot(...x) || 1;\n for (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 for (value of view) {\n if (!Number.isFinite(value)) throw new Error('Singular 3D transform');\n }\n for (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 (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 (i = 0; i < 16; i++) {\n camera.projectionViewMatrix[i] = projectionView[i];\n }\n}\n", "/** Height inside a bridge deck, or null outside its triangles. */\nexport function bridgeElevation(point, bridges) {\n // Bridges bucketed by 64 DEM pixels.\n let bridge, a, b, c, d, u, v;\n for (bridge of bridges?.get(`${Math.floor(point.x / 64)}/${Math.floor(point.y / 64)}`) || []) {\n if (point.x < bridge.min[0] || point.x > bridge.max[0] || point.y < bridge.min[1] || point.y > bridge.max[1]) {\n continue;\n }\n for ([a, b, c] of bridge.triangles) {\n d = (b[1] - c[1]) * (a[0] - c[0]) + (c[0] - b[0]) * (a[1] - c[1]);\n u = ((b[1] - c[1]) * (point.x - c[0]) + (c[0] - b[0]) * (point.y - c[1])) / d;\n v = ((c[1] - a[1]) * (point.x - c[0]) + (a[0] - c[0]) * (point.y - c[1])) / d;\n if (u >= 0 && v >= 0 && u + v <= 1) {\n return u * a[2] + v * b[2] + (1 - u - v) * c[2];\n }\n }\n }\n return null;\n}\n", "export function sample(tiles, px, py) {\r\n const tileX = Math.floor(px / 256), tileY = Math.floor(py / 256);\r\n const tile = tiles.get(`${tileX}/${tileY}`);\r\n if (!tile) return null;\r\n const elevation = tile[(py - tileY * 256) * 256 + px - tileX * 256];\r\n return Number.isFinite(elevation) && elevation > -1000 ? elevation : null;\r\n}\r\n", "import { sample } from './sample.js';\n\n/** Bilinear DEM sampling, with the original first-valid-neighbour no-data rule. */\n\nexport function terrainElevation(point, tiles) {\n const x = point.x - 0.5, y = point.y - 0.5;\n const x0 = Math.floor(x), y0 = Math.floor(y);\n const fx = x - x0, fy = y - y0;\n const values = [sample(tiles, x0, y0), sample(tiles, x0 + 1, y0), sample(tiles, x0, y0 + 1), sample(tiles, x0 + 1, y0 + 1)];\n let valid = 0, first = null;\n let value;\n for (value of values) {\n if (!Number.isFinite(value)) continue;\n if (!valid) first = value;\n valid++;\n }\n if (valid < 4) return first;\n return (values[0] * (1 - fx) + values[1] * fx) * (1 - fy) +\n (values[2] * (1 - fx) + values[3] * fx) * fy;\n}\n", "import { bridgeElevation } from '../geometry/bridgeElevation.js';\nimport { terrainElevation } from './terrainElevation.js';\n\n/** @param {L.LatLng|L.Point} location LatLng, or a pixel point at the terrain zoom. */\n\nexport function getElevation(backend, location) {\n if (!backend._map || !backend._terrainReady) return null;\n const point = location instanceof L.Point ? location : backend._map.project(location, backend._terrainZoom);\n return bridgeElevation(point, backend._bridges) ?? terrainElevation(point, backend._terrainTiles);\n}\n", "import { updateCamera } from \"../scene/updateCamera.js\";\nimport { getElevation } from \"../terrain/getElevation.js\";\n\nexport function updateMapCamera(backend, size) {\n const map = backend._map;\n // Match the map's perspective, including the intermediate view of an animated zoom.\n const zoom = map._cameraView?.zoom ?? map.getZoom(), center = map._cameraView?.center ?? map.getCenter();\n const pixelsPerMeter = map.options.crs.scale(zoom) / (40075016.68557849 * Math.cos(backend._sceneOrigin.lat * Math.PI / 180));\n const offset = map.project(center, zoom).subtract(map.project(backend._sceneOrigin, zoom));\n const distance = size.y * 1.5 / pixelsPerMeter;\n const target = [\n offset.x / pixelsPerMeter,\n (map._terrain3D ? getElevation(map._terrain3D, center): undefined) ?? 0,\n offset.y / pixelsPerMeter\n ];\n const pitch = map.getPitch() * Math.PI / 180;\n const bearing = map.getBearing() * Math.PI / 180;\n const camera = backend.camera;\n camera.fov = 2 * Math.atan(1 / 3) * 180 / Math.PI;\n camera.aspect = size.x / size.y;\n camera.near = Math.max(0.1, distance / 10000);\n camera.far = Math.max(10000, distance * 10);\n camera.position[0] = target[0] + Math.sin(bearing) * Math.sin(pitch) * distance;\n camera.position[1] = target[1] + Math.cos(pitch) * distance;\n camera.position[2] = target[2] + Math.cos(bearing) * Math.sin(pitch) * distance;\n camera.up[0] = -Math.sin(bearing) * Math.cos(pitch);\n camera.up[1] = Math.sin(pitch);\n camera.up[2] = -Math.cos(bearing) * Math.cos(pitch);\n camera.target[0] = target[0]; camera.target[1] = target[1]; camera.target[2] = target[2];\n // Refresh the camera view, projection and combined projection-view matrices.\n updateCamera(camera);\n}\n", "/** 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 let i, value, child;\n if (node.matrix) {\n const state = node._matrixState ||= new Float64Array(16);\n for (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 (i = 0; i < 9; i++) {\n 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 (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 (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 (child of node.children) updateWorldMatrix(child);\n}\n", "/** Cache local AABB and center for ray picking and transparent mesh sorting. */\n\nexport function computeBounds(geometry) {\n const min = [Infinity, Infinity, Infinity], max = [-Infinity, -Infinity, -Infinity], data = geometry.attributes.position.data;\n let i;\n for (i = 0; i < data.length; i++) {\n min[i % 3] = Math.min(min[i % 3], data[i]);\n max[i % 3] = Math.max(max[i % 3], data[i]);\n }\n const instances = geometry.attributes.instanceOffset;\n if (instances) {\n let axis, offset, low, high;\n for (axis = 0; axis < 3; axis++) {\n low = Infinity;\n high = -Infinity;\n for (offset = axis; offset < instances.data.length; offset += instances.size) {\n low = Math.min(low, instances.data[offset]);\n high = Math.max(high, instances.data[offset]);\n }\n min[axis] = Math.fround(min[axis] + low);\n max[axis] = Math.fround(max[axis] + high);\n }\n }\n const center = [];\n for (i = 0; i < min.length; i++) center.push((min[i] + max[i]) / 2);\n let radius = instances ? Math.hypot(max[0] - min[0], max[1] - min[1], max[2] - min[2]) / 2 : 0;\n for (i = 0; !instances && i < data.length; i += 3) {\n radius = Math.max(radius, Math.hypot(\n data[i] - center[0], data[i + 1] - center[1], data[i + 2] - center[2]\n ));\n }\n geometry.bounds = { min, max, center, radius };\n}\n", "import { computeBounds } from '../geometry/computeBounds.js';\n\nexport function collectMeshes(mesh, sunlight, projection, frustum, frustumLengths, candidates, shadowMeshes) {\n if (!mesh.visible) return;\n if (mesh.geometry) {\n if (sunlight?.altitude >= 3 && !mesh.tile && mesh._appearance !== 0 &&\n !mesh.program.nightLight && mesh.program.depthTest !== false) shadowMeshes.push(mesh);\n if (!mesh.geometry.bounds) computeBounds(mesh.geometry);\n const bounds = mesh.geometry.bounds;\n const world = mesh.worldMatrix;\n const center = bounds.center;\n const x = world[0] * center[0] + world[4] * center[1] + world[8] * center[2] + world[12];\n const y = world[1] * center[0] + world[5] * center[1] + world[9] * center[2] + world[13];\n const z = world[2] * center[0] + world[6] * center[1] + world[10] * center[2] + world[14];\n const clipZ = projection[2] * x + projection[6] * y + projection[10] * z + projection[14];\n const clipW = projection[3] * x + projection[7] * y + projection[11] * z + projection[15];\n mesh._sortDepth = clipZ / clipW;\n const radius = bounds.radius * Math.max(\n Math.hypot(world[0], world[1], world[2]),\n Math.hypot(world[4], world[5], world[6]),\n Math.hypot(world[8], world[9], world[10])\n );\n mesh._visibleInFrame =\n frustum[0][0] * x + frustum[0][1] * y + frustum[0][2] * z + frustum[0][3] >= -radius * frustumLengths[0] &&\n frustum[1][0] * x + frustum[1][1] * y + frustum[1][2] * z + frustum[1][3] >= -radius * frustumLengths[1] &&\n frustum[2][0] * x + frustum[2][1] * y + frustum[2][2] * z + frustum[2][3] >= -radius * frustumLengths[2] &&\n frustum[3][0] * x + frustum[3][1] * y + frustum[3][2] * z + frustum[3][3] >= -radius * frustumLengths[3] &&\n frustum[4][0] * x + frustum[4][1] * y + frustum[4][2] * z + frustum[4][3] >= -radius * frustumLengths[4] &&\n frustum[5][0] * x + frustum[5][1] * y + frustum[5][2] * z + frustum[5][3] >= -radius * frustumLengths[5];\n if (mesh._visibleInFrame) candidates.push(mesh);\n }\n let child;\n for (child of mesh.children) {\n collectMeshes(child, sunlight, projection, frustum, frustumLengths, candidates, shadowMeshes);\n }\n}\n", "import { updateWorldMatrix } from \"../scene/updateWorldMatrix.js\";\nimport { collectMeshes } from './collectMeshes.js';\n\nexport function collectFrameMeshes(backend, sunlight, sceneChanged) {\n const camera = backend.camera;\n const projection = camera.projectionViewMatrix;\n const renderer = backend.renderer;\n const frustum = renderer.frustum ||= [\n new Float64Array(4), new Float64Array(4), new Float64Array(4),\n new Float64Array(4), new Float64Array(4), new Float64Array(4),\n ];\n const frustumLengths = renderer.frustumLengths ||= new Float64Array(6);\n let i, axis, plane, j, offset;\n for (i = 0; i < 6; i++) {\n axis = Math.floor(i / 2);\n plane = frustum[i];\n for (j = 0; j < 4; j++) {\n offset = j * 4;\n plane[j] = i === 4 ? projection[offset + 2]\n : i % 2 ? projection[offset + 3] - projection[offset + axis]\n : projection[offset + 3] + projection[offset + axis];\n }\n frustumLengths[i] = Math.hypot(plane[0], plane[1], plane[2]);\n }\n const candidates = backend._visibleMeshes ||= [];\n candidates.length = 0;\n const shadowMeshes = backend._shadowMeshes ||= [];\n shadowMeshes.length = 0;\n if (sceneChanged) updateWorldMatrix(backend.scene);\n collectMeshes(backend.scene, sunlight, projection, frustum, frustumLengths, candidates, shadowMeshes);\n}\n", "export function ensureRoofBlit(renderer) {\n const device = renderer.device;\n if (!renderer.roofBlit) {\n const module = device.createShaderModule({\n code: /* wgsl */ `@group(0)@binding(0)var source:texture_2d<f32>;@group(0)@binding(1)var sourceSampler:sampler;@group(0)@binding(2)var<uniform> opacity:f32;struct Varyings{@builtin(position)position:vec4f,@location(0)uv:vec2f};@vertex fn vertexMain(@builtin(vertex_index)index:u32)-> Varyings{let uv = vec2f(f32(index & 1u),f32(index >> 1u));return Varyings(vec4f(uv.x * 2.0 - 1.0,1.0 - uv.y * 2.0,0.0,1.0),uv);}@fragment fn fragmentMain(input:Varyings)->@location(0)vec4f{let color = textureSample(source,sourceSampler,input.uv);return vec4f(color.rgb,color.a * opacity);}`\n });\n renderer.roofBlit = {\n pipeline: device.createRenderPipeline({\n layout: 'auto',\n vertex: { module, entryPoint: 'vertexMain' },\n fragment: {\n module,\n entryPoint: 'fragmentMain',\n targets: [{\n format: 'rgba8unorm',\n blend: {\n color: { srcFactor: 'src-alpha', dstFactor: 'one-minus-src-alpha', operation: 'add' },\n alpha: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha', operation: 'add' },\n },\n }],\n },\n primitive: { topology: 'triangle-strip' },\n }),\n sampler: device.createSampler({ magFilter: 'linear', minFilter: 'linear' }),\n };\n }\n}\n", "import { TILE_SIZE } from '../constants/TILE_SIZE.js';\n\nexport function getRasterTileSize() {\r\n return new L.Point(TILE_SIZE, TILE_SIZE);\r\n}\n", "export function compareRoofTiles(a, b) {\r\n return (a.layer.options.zIndex || 0) - (b.layer.options.zIndex || 0) ||\r\n a.tile.coords.z - b.tile.coords.z;\r\n}\r\n", "import { getRasterTileSize } from '../raster/getRasterTileSize.js';\nimport { compareRoofTiles } from './compareRoofTiles.js';\n\nexport function composeRoofAtlas(backend, tiles, zoom, min, size, width, height) {\n const renderer = backend.renderer, device = renderer.device, map = backend._map;\n const opacities = new Float32Array(Math.max(1, tiles.length) * 64);\n const opacityBuffer = device.createBuffer({\n size: opacities.byteLength,\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n });\n const encoder = device.createCommandEncoder();\n const atlasPass = encoder.beginRenderPass({\n colorAttachments: [{\n view: backend._roofRaster.texture.texture.createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: 'clear',\n storeOp: 'store',\n }],\n });\n atlasPass.setPipeline(renderer.roofBlit.pipeline);\n tiles.sort(compareRoofTiles);\n let i, tile, layer, coords, image, source, tileSize, offset, x, y;\n for ([i, { tile, layer }] of tiles.entries()) {\n ({ coords, image } = tile);\n source = tile.texture;\n if (source.uploaded !== source.image) {\n device.queue.copyExternalImageToTexture({ source: image }, { texture: source.texture },\n [source.texture.width, source.texture.height]);\n source.uploaded = source.image;\n }\n\n opacities[i * 64] = layer.options.opacity;\n tileSize = getRasterTileSize().multiplyBy(map.getZoomScale(zoom, coords.z));\n offset = new L.Point(coords.x, coords.y).scaleBy(tileSize).subtract(min);\n x = offset.x * width / size.x, y = offset.y * height / size.y;\n atlasPass.setViewport(x, y, Math.min(tileSize.x * width / size.x, width - x),\n Math.min(tileSize.y * height / size.y, height - y), 0, 1);\n atlasPass.setBindGroup(0, device.createBindGroup({\n layout: renderer.roofBlit.pipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: source.texture.createView() },\n { binding: 1, resource: renderer.roofBlit.sampler },\n { binding: 2, resource: { buffer: opacityBuffer, offset: i * 256, size: 4 } },\n ],\n }));\n atlasPass.draw(4);\n }\n atlasPass.end();\n device.queue.writeBuffer(opacityBuffer, 0, opacities);\n device.queue.submit([encoder.finish()]);\n opacityBuffer.destroy();\n}\n", "import { ensureRoofBlit } from './ensureRoofBlit.js';\nimport { composeRoofAtlas } from './composeRoofAtlas.js';\nimport { destroyTexture } from './destroyTexture.js';\nimport { getRasterTileSize } from '../raster/getRasterTileSize.js';\n\nexport function rebuildRoofAtlas(backend, rasters, signature, now) {\n const map = backend._map, renderer = backend.renderer;\n const tiles = [];\n let zoom = -Infinity;\n let layer, tile, coords, size2;\n for (layer of rasters) for (tile of layer._rasterTiles.values()) {\n if (tile.done && !tile.request.signal.aborted && tile.image) {\n tiles.push({ tile, layer });\n zoom = Math.max(zoom, tile.coords.z);\n }\n }\n if (!tiles.length) zoom = map.getZoom();\n const bounds = new L.Bounds();\n for ({ tile: { coords }, layer } of tiles) {\n size2 = getRasterTileSize().multiplyBy(map.getZoomScale(zoom, coords.z));\n bounds.extend(new L.Point(coords.x, coords.y).scaleBy(size2));\n bounds.extend(new L.Point(coords.x + 1, coords.y + 1).scaleBy(size2));\n }\n const min = bounds.min || map.project(backend._sceneOrigin, zoom);\n const size = bounds.isValid() ? bounds.getSize() : new L.Point(1, 1);\n // ponytail: cap at 4096 px; virtual textures if wide views need native detail.\n const limit = 4096;\n const scale = Math.min(1, limit / Math.max(size.x, size.y));\n const width = Math.max(1, Math.ceil(size.x * scale));\n const height = Math.max(1, Math.ceil(size.y * scale));\n const origin = map.project(backend._sceneOrigin, zoom);\n const pixels = map.options.crs.scale(zoom) / (40075016.68557849 * Math.cos(backend._sceneOrigin.lat * Math.PI / 180));\n const matrix = new DOMMatrix();\n matrix.m11 = pixels / size.x; matrix.m33 = pixels / size.y;\n matrix.m41 = (origin.x - min.x) / size.x; matrix.m43 = (origin.y - min.y) / size.y;\n const texture = backend._roofRaster?.texture;\n if (texture && (texture.width !== width || texture.height !== height)) {\n destroyTexture(backend, texture.texture);\n texture.texture = renderer.device.createTexture({\n size: [width, height],\n format: 'rgba8unorm',\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,\n });\n texture.width = width;\n texture.height = height;\n }\n backend._roofRaster = {\n signature, updatedAt: now, matrix: Array.from(matrix.toFloat64Array()),\n texture: texture || {\n device: renderer.device,\n texture: renderer.device.createTexture({\n size: [width, height],\n format: 'rgba8unorm',\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,\n }),\n sampler: renderer.device.createSampler({\n addressModeU: 'clamp-to-edge', addressModeV: 'clamp-to-edge',\n }),\n samplerOptions: { addressModeU: 'clamp-to-edge', addressModeV: 'clamp-to-edge' },\n image: null, width, height,\n format: 'rgba8unorm', srgb: false, flipY: false, uploaded: null,\n },\n };\n // Compose the atlas on the GPU: re-uploading a large canvas stalls Firefox for hundreds of ms.\n ensureRoofBlit(renderer);\n composeRoofAtlas(backend, tiles, zoom, min, size, width, height);\n}\n", "import { rebuildRoofAtlas } from './rebuildRoofAtlas.js';\nimport { destroyTexture } from './destroyTexture.js';\n\nexport function updateRoofRaster(backend, now) {\n const map = backend._map;\n const rasters = [];\n let hasRoofTexture = false;\n let layer;\n for (layer of backend._layers) {\n if (layer.options.roofTexture) { hasRoofTexture = true; break; }\n }\n if (hasRoofTexture) {\n for (layer of Object.values(map._layers)) {\n if (layer._type === 'pmtiles' && layer._rasterTiles && layer.options.opacity > 0) rasters.push(layer);\n }\n const signatures = [];\n let loading = false;\n for (layer of rasters) {\n signatures.push(`${L.Util.stamp(layer)}:${layer._rasterVersion || 0}:${layer.options.opacity}:${layer.options.zIndex}`);\n loading ||= Boolean(layer._loadingTiles);\n }\n const signature = signatures.join('|');\n if (!backend._roofRaster || backend._roofRaster.signature !== signature &&\n (!loading || now - backend._roofRaster.updatedAt >= 50)) {\n rebuildRoofAtlas(backend, rasters, signature, now);\n }\n } else if (backend._roofRaster) {\n destroyTexture(backend, backend._roofRaster.texture.texture);\n backend._roofRaster = null;\n }\n return rasters;\n}\n", "export function compareMeshes(a, b) {\r\n return Number(Boolean(b.ground)) - Number(Boolean(a.ground)) ||\r\n (a.ground && b.ground ? (a.renderOrder || 0) - (b.renderOrder || 0) ||\r\n a.tile.coords.z - b.tile.coords.z : 0) ||\r\n Number(a.program.transparent) - Number(b.program.transparent) ||\r\n (a.program.transparent\r\n ? (a.renderOrder || 0) - (b.renderOrder || 0) ||\r\n b._sortDepth - a._sortDepth || a.id - b.id\r\n : (a._sortDepth ?? 0) - (b._sortDepth ?? 0) || a.id - b.id);\r\n}\r\n", "\nimport { compareMeshes } from './compareMeshes.js';\n\nexport function sortMeshes(meshes) {\n return meshes.sort(compareMeshes);\n}\n", "/** Test the mesh's ground footprint against loaded imagery, including coarse parent tiles. */\nexport function roofCoverage(mesh, backend, rasters) {\n const map = backend._map, bounds = mesh.geometry.bounds, world = mesh.worldMatrix;\n let intersectsArchive = false;\n let layer, zoom, origin, scale, min, max, i, x, y, z, px, py, nw, se, remaining, tile, size, left;\n let top, pieces, x0, y0, x1, y1, l, t, r, b;\n for (layer of rasters) {\n zoom = layer._tileZoom, origin = map.project(backend._sceneOrigin, zoom);\n scale = map.options.crs.scale(zoom) / (40075016.68557849 * Math.cos(backend._sceneOrigin.lat * Math.PI / 180));\n min = [Infinity, Infinity], max = [-Infinity, -Infinity];\n for (i = 0; i < 8; i++) {\n x = i & 1 ? bounds.max[0] : bounds.min[0], y = i & 2 ? bounds.max[1] : bounds.min[1];\n z = i & 4 ? bounds.max[2] : bounds.min[2];\n px = origin.x + (world[0] * x + world[4] * y + world[8] * z + world[12]) * scale;\n py = origin.y + (world[2] * x + world[6] * y + world[10] * z + world[14]) * scale;\n min[0] = Math.min(min[0], px); min[1] = Math.min(min[1], py);\n max[0] = Math.max(max[0], px); max[1] = Math.max(max[1], py);\n }\n if (layer.header.maxLat !== undefined && layer.header.minLon !== undefined &&\n layer.header.minLat !== undefined && layer.header.maxLon !== undefined) {\n nw = map.project([layer.header.maxLat, layer.header.minLon], zoom);\n se = map.project([layer.header.minLat, layer.header.maxLon], zoom);\n min[0] = Math.max(min[0], nw.x); min[1] = Math.max(min[1], nw.y);\n max[0] = Math.min(max[0], se.x); max[1] = Math.min(max[1], se.y);\n if (min[0] >= max[0] || min[1] >= max[1]) continue;\n }\n intersectsArchive = true;\n remaining = [[min[0], min[1], max[0], max[1]]];\n for (tile of layer._rasterTiles.values()) {\n // Failed imagery already reports an error; do not hide the building indefinitely.\n if (!tile.done && !tile.error) continue;\n size = 256 * 2 ** (zoom - tile.coords.z);\n left = tile.coords.x * size, top = tile.coords.y * size;\n pieces = [];\n for ([x0, y0, x1, y1] of remaining) {\n l = Math.max(x0, left), t = Math.max(y0, top);\n r = Math.min(x1, left + size), b = Math.min(y1, top + size);\n if (l >= r || t >= b) {\n pieces.push([x0, y0, x1, y1]);\n continue;\n }\n if (y0 < t) pieces.push([x0, y0, x1, t]);\n if (b < y1) pieces.push([x0, b, x1, y1]);\n if (x0 < l) pieces.push([x0, t, l, b]);\n if (r < x1) pieces.push([r, t, x1, b]);\n }\n remaining = pieces;\n if (!remaining.length) return true;\n }\n }\n return !intersectsArchive;\n}\n", "import { sortMeshes } from \"./sortMeshes.js\";\nimport { roofCoverage } from \"../geometry/roofCoverage.js\";\n\nexport function prepareFrameMeshes(backend, rasters, now, meshes) {\n const candidates = backend._visibleMeshes, shadowMeshes = backend._shadowMeshes, renderer = backend.renderer;\n let appearing = false;\n // Visible meshes: opaque first, transparent surfaces back-to-front.\n let mesh, progress;\n for (mesh of candidates) {\n if (mesh.program.uniforms.roofTexture && !rasters.length) mesh._roofRevealed = true;\n if (mesh.program.uniforms.roofTexture && !mesh._roofRevealed && rasters.length) {\n if (mesh._roofCoverageSignature !== backend._roofRaster?.signature) {\n mesh._roofCoverageSignature = backend._roofRaster?.signature;\n mesh._roofCovered = roofCoverage(mesh, backend, rasters);\n }\n if (!mesh._roofCovered) { mesh._appearance = 0; continue; }\n mesh._roofRevealed = true;\n }\n if (mesh.fadeDuration) {\n mesh.fadeStart ??= mesh.tile?.loadedAt ?? now;\n progress = Math.min(1, (now - mesh.fadeStart) / mesh.fadeDuration);\n mesh._appearance = progress * progress * (3 - 2 * progress);\n appearing ||= progress < 1;\n }\n meshes.push(mesh);\n }\n candidates.length = 0;\n sortMeshes(meshes);\n let minGroundZoom = Infinity, maxGroundZoom = -Infinity;\n for (mesh of meshes) {\n if (!mesh.ground) continue;\n minGroundZoom = Math.min(minGroundZoom, mesh.tile.coords.z);\n maxGroundZoom = Math.max(maxGroundZoom, mesh.tile.coords.z);\n }\n renderer.groundOverlap = minGroundZoom !== maxGroundZoom;\n let shadowCount = 0;\n for (mesh of shadowMeshes) {\n if (mesh.visible && mesh._appearance !== 0) shadowMeshes[shadowCount++] = mesh;\n }\n shadowMeshes.length = shadowCount;\n return appearing;\n}\n", "\nexport function bindSunlight(layer) {\n const sun = layer.renderer.sunlight;\n sun.bindGroup = layer.renderer.device.createBindGroup({\n layout: sun.layout, entries: [\n { binding: 0, resource: { buffer: sun.buffer } },\n { binding: 1, resource: sun.texture.createView() },\n { binding: 2, resource: sun.sampler },\n { binding: 3, resource: { buffer: sun.lights } },\n ]\n });\n}\n", "export function visitCells(packed, minX, minZ, cellSize, columns, offsets, data) {\n let values, i, radius, x, z, y, c, key, j, o;\n for (values of packed) for (i = 0; i < values.length; i += 8) {\n radius = values[i + 3], x = values[i] - minX, z = values[i + 2] - minZ;\n for (y = Math.floor((z - radius) / cellSize); y <= Math.floor((z + radius) / cellSize); y++) {\n for (c = Math.floor((x - radius) / cellSize); c <= Math.floor((x + radius) / cellSize); c++) {\n key = y * columns + c;\n if (data) {\n for (j = 0, o = offsets[key] * 4; j < 8; j++) data[o + j] = values[i + j];\n offsets[key] += 2;\n } else offsets[key]++;\n }\n }\n }\n}\n", "import { visitCells } from './visitCells.js';\n\n/** Pack world-space point lights into the shader's spatial grid. */\nexport function lightGrid(packed, maxBytes) {\n let count = 0;\n let values, i, value, key;\n for (values of packed) count += values.length / 8;\n const cellSize = 32;\n let data = new Float32Array(8);\n if (count) {\n let minX = Infinity, minZ = Infinity, maxX = -Infinity, maxZ = -Infinity;\n for (values of packed) for (i = 0; i < values.length; i += 8) {\n minX = Math.min(minX, values[i] - values[i + 3]);\n maxX = Math.max(maxX, values[i] + values[i + 3]);\n minZ = Math.min(minZ, values[i + 2] - values[i + 3]);\n maxZ = Math.max(maxZ, values[i + 2] + values[i + 3]);\n }\n const columns = Math.ceil((maxX - minX) / cellSize) + 1,\n rows = Math.ceil((maxZ - minZ) / cellSize) + 1;\n // Counting sort: count the lights of each cell, then fill each cell's slice.\n const counts = new Uint32Array(columns * rows),\n next = new Uint32Array(columns * rows);\n visitCells(packed, minX, minZ, cellSize, columns, counts);\n let entries = 0;\n for (value of counts) entries += value;\n const length = (2 + columns * rows + entries * 2) * 4;\n if (length * 4 > maxBytes) {\n throw new Error('Streetlight grid exceeds GPU storage limit');\n }\n data = new Float32Array(length);\n data.set([minX, minZ, cellSize, columns, rows, count, 0, 0]);\n let offset = 2 + columns * rows;\n for (key = 0; key < counts.length; key++) if (counts[key]) {\n data[(2 + key) * 4] = next[key] = offset;\n data[(2 + key) * 4 + 1] = counts[key];\n offset += counts[key] * 2;\n }\n visitCells(packed, minX, minZ, cellSize, columns, next, data);\n }\n\n return { data, count };\n}\n", "\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 let i, x, y, z, radius, color, flux, w;\n for (i = 0; i < lights.length; i++) {\n ({\n position: [x, y, z],\n radius,\n color,\n flux\n } = lights[i]);\n 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}", "import { lightGrid } from './lightGrid.js';\nimport { worldLights } from './worldLights.js';\n\n/** Keep fixed lamps cached when moving headlights change. */\nexport function cacheLightGrid(meshes, previous, maxBytes) {\n let unchanged = previous?.meshes.length === meshes.length;\n const packed = [], snapshots = [];\n let i, mesh, matrix, lights, cache, sameMatrix, j;\n for (i = 0; i < meshes.length; i++) {\n mesh = meshes[i], matrix = mesh.worldMatrix, lights = mesh.extras.lights;\n cache = mesh._worldLights;\n sameMatrix = Boolean(cache);\n for (j = 0; j < matrix.length && sameMatrix; j++) sameMatrix = matrix[j] === cache.matrix[j];\n if (!sameMatrix || cache.lights !== lights) {\n cache = mesh._worldLights = { lights, matrix: [...matrix], data: worldLights(lights, matrix) };\n }\n unchanged &&= previous.meshes[i].mesh === mesh && previous.meshes[i].cache === cache;\n packed.push(cache.data);\n snapshots.push({ mesh, cache });\n }\n if (unchanged) return previous;\n return { ...lightGrid(packed, maxBytes), meshes: snapshots };\n}\n", "export function collectLightMeshes(node, fixed, moving) {\n if (!node.visible) return;\n if (node.extras?.lights) (node.extras.dynamicLights ? moving : fixed).push(node);\n let child;\n for (child of node.children || []) collectLightMeshes(child, fixed, moving);\n}\n", "import { destroyTexture } from '../rendering/destroyTexture.js';\nimport { bindSunlight } from '../shadows/bindSunlight.js';\nimport { cacheLightGrid } from './cacheLightGrid.js';\nimport { collectLightMeshes } from './collectLightMeshes.js';\n\nexport function updatePointLights(backend) {\n const { device, sunlight: sun } = backend.renderer;\n const fixed = [], moving = [];\n let layer;\n for (layer of backend._layers) {\n if (!layer.options.nightLight || !layer.root.visible) continue;\n collectLightMeshes(layer.root, fixed, moving);\n }\n const maxBytes = device.limits.maxStorageBufferBindingSize;\n const staticGrid = cacheLightGrid(fixed, sun.staticLightGrid, maxBytes);\n const dynamicGrid = cacheLightGrid(moving, sun.dynamicLightGrid, maxBytes);\n if (staticGrid === sun.staticLightGrid && dynamicGrid === sun.dynamicLightGrid) return;\n const size = staticGrid.data.byteLength + dynamicGrid.data.byteLength;\n if (size > maxBytes) throw new Error('Streetlight grid exceeds GPU storage limit');\n let uploadStatic = staticGrid !== sun.staticLightGrid;\n if (sun.lights.size < size) {\n destroyTexture(backend, sun.lights);\n sun.lights = device.createBuffer({ size, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST });\n bindSunlight(backend);\n uploadStatic = true;\n }\n // The spare header component points to a second grid in the same storage binding.\n staticGrid.data[6] = staticGrid.data.length / 4;\n if (uploadStatic) device.queue.writeBuffer(sun.lights, 0, staticGrid.data);\n device.queue.writeBuffer(sun.lights, staticGrid.data.byteLength, dynamicGrid.data);\n sun.lightCount = staticGrid.count + dynamicGrid.count;\n sun.staticLightGrid = staticGrid;\n sun.dynamicLightGrid = dynamicGrid;\n}\n", "import { destroyTexture } from './destroyTexture.js';\nimport { updatePointLights } from '../lighting/updatePointLights.js';\n\nexport function prepareFrameUniforms(backend, meshes, shadowMeshes, sunlight) {\n const renderer = backend.renderer, camera = backend.camera;\n const view = camera.viewMatrix, direction = sunlight?.direction;\n const x = direction ? direction[0] : -300;\n const y = direction ? direction[1] : 500;\n const z = direction ? direction[2] : 300;\n const lightX = view[0] * x + view[4] * y + view[8] * z;\n const lightY = view[1] * x + view[5] * y + view[9] * z;\n const lightZ = view[2] * x + view[6] * y + view[10] * z;\n const lightLength = Math.hypot(lightX, lightY, lightZ) || 1;\n const skyLength = Math.hypot(view[4], view[5], view[6]) || 1;\n // One uniform upload per frame: per-mesh writeBuffer calls dominate Firefox's GPU process.\n // Slot 0 holds the camera; 256-byte mesh slots follow (double-sided meshes use two).\n if (!renderer.uniformBuffer || renderer.uniformBuffer.size < (meshes.length * 2 + shadowMeshes.length + 1) * 256) {\n if (renderer.uniformBuffer) destroyTexture(backend, renderer.uniformBuffer);\n renderer.uniformBuffer = renderer.device.createBuffer({\n size: Math.max(64, meshes.length * 4 + shadowMeshes.length * 2) * 256,\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n });\n renderer.uniformData = new Float32Array(renderer.uniformBuffer.size / 4);\n }\n const frameData = renderer.uniformData;\n frameData.set(camera.viewMatrix, 0);\n frameData.set(camera.projectionMatrix, 16);\n if (backend._roofRaster?.matrix) frameData.set(backend._roofRaster.matrix, 32);\n else {\n frameData.fill(0, 32, 48);\n frameData[32] = frameData[37] = frameData[42] = frameData[47] = 1;\n }\n frameData[48] = lightX / lightLength;\n frameData[49] = lightY / lightLength;\n frameData[50] = lightZ / lightLength;\n frameData[51] = sunlight && sunlight.altitude <= 0 ? 0 : 1;\n frameData[52] = view[4] / skyLength;\n frameData[53] = view[5] / skyLength;\n frameData[54] = view[6] / skyLength;\n const night = sunlight ? Math.max(0, Math.min(1, (3 - sunlight.altitude) / 9)) : 0;\n frameData[55] = night * night * (3 - 2 * night);\n const tint = sunlight?.tint;\n frameData[56] = tint ? tint[0] : 1;\n frameData[57] = tint ? tint[1] : 1;\n frameData[58] = tint ? tint[2] : 1;\n frameData[59] = 0;\n if (night > 0) updatePointLights(backend);\n renderer.uniformSlot = 1;\n}\n", "/** Upload retained CPU data and draw one mesh in the active WebGPU render pass. */\n\nexport function drawGeometry(backend, mesh, pass, cullMode, frontFace) {\n const { geometry, program } = mesh;\n const device = backend.renderer.device;\n // Mixed-LOD imagery composites coarse-to-fine; its depth still occludes later 3D objects.\n // ponytail: self-occlusion during LOD blending needs separate per-LOD depth passes.\n const depthCompare = program.depthTest === false || (mesh.ground && backend.renderer.groundOverlap)\n ? 'always' : 'less-equal';\n const pipelineKey = `${cullMode}:${frontFace}:${depthCompare}`;\n let pipeline = program.pipelineCache.get(pipelineKey);\n if (!pipeline) {\n pipeline = device.createRenderPipeline({\n layout: program.pipelineLayout,\n vertex: {\n module: program.vertex,\n entryPoint: 'vertexMain',\n buffers: program.vertexBuffers,\n },\n fragment: {\n module: program.fragment,\n entryPoint: 'fragmentMain',\n targets: [{\n format: backend.renderer.format,\n blend: program.transparent ? {\n color: { srcFactor: 'src-alpha', dstFactor: 'one-minus-src-alpha', operation: 'add' },\n alpha: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha', operation: 'add' },\n } : undefined,\n writeMask: GPUColorWrite.ALL,\n }],\n },\n primitive: { topology: 'triangle-list', cullMode, frontFace },\n depthStencil: {\n format: 'depth24plus',\n depthWriteEnabled: program.depthWrite,\n depthCompare,\n },\n });\n program.pipelineCache.set(pipelineKey, pipeline);\n }\n\n const uniforms = program.uniforms;\n const renderer = backend.renderer;\n const offset = renderer.uniformSlot++ * 256;\n const data = renderer.uniformData, base = offset / 4;\n data.set(mesh.worldMatrix, base);\n data.set(uniforms.baseColor.value, base + 16);\n data[base + 19] = 1;\n data[base + 20] = uniforms.metallic.value;\n data[base + 21] = uniforms.roughness.value;\n data[base + 22] = uniforms.opacity.value * (mesh.ground ? mesh._appearance ?? 1 : 1);\n data[base + 23] = uniforms.alphaCutoff.value;\n data.set(uniforms.emissive.value, base + 24);\n data[base + 27] = uniforms.occlusionStrength.value;\n data[base + 28] = mesh.terrain?.[0] ?? 0;\n data[base + 29] = mesh.terrain?.[1] ?? 0;\n data[base + 30] = mesh.terrain?.[2] ?? 0;\n data[base + 31] = mesh.terrain?.[3] ?? 0;\n data[base + 32] = mesh.highlight?.[0] ?? 0;\n data[base + 33] = mesh.highlight?.[1] ?? 0;\n data[base + 34] = program.nightSparkle ? data[55] : 0;\n data[base + 35] = mesh.ground ? 1 : mesh._appearance ?? 1;\n\n const textures = mesh._textures ||= [];\n textures.length = 0;\n let binding, texture, i, attribute;\n for (binding of program.bindings) {\n texture = uniforms[binding.name]?.value;\n if (!texture) throw new Error(`Missing Layer3D texture: ${binding.name}`);\n if (texture.uploaded !== texture.image) {\n device.queue.copyExternalImageToTexture(\n { source: texture.image, flipY: Boolean(texture.flipY) },\n { texture: texture.texture },\n [texture.image.width, texture.image.height]\n );\n texture.uploaded = texture.image;\n }\n textures.push(texture);\n }\n let bindingsChanged = !mesh.bindGroup || mesh.boundBuffer !== renderer.uniformBuffer ||\n textures.length !== mesh.boundTextures.length;\n for (i = 0; !bindingsChanged && i < textures.length; i++) {\n if (textures[i].texture !== mesh.boundTextures[i][0] ||\n textures[i].sampler !== mesh.boundTextures[i][1]) bindingsChanged = true;\n }\n if (bindingsChanged) {\n const entries = [\n { binding: 0, resource: { buffer: renderer.uniformBuffer, size: 144 } },\n { binding: 1, resource: { buffer: renderer.uniformBuffer, size: 240 } },\n ];\n if (program.terrain) entries.push({ binding: 2, resource: program.terrain.texture.createView() });\n mesh.boundBuffer = renderer.uniformBuffer;\n const boundTextures = mesh.boundTextures ||= [];\n boundTextures.length = textures.length;\n for (i = 0; i < textures.length; i++) {\n binding = program.bindings[i], texture = textures[i];\n entries.push({ binding: binding.texture, resource: texture.texture.createView() });\n entries.push({ binding: binding.sampler, resource: texture.sampler });\n boundTextures[i] ||= [];\n boundTextures[i][0] = texture.texture;\n boundTextures[i][1] = texture.sampler;\n }\n mesh.bindGroup = device.createBindGroup({\n layout: program.bindGroupLayout,\n entries,\n });\n }\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, mesh.bindGroup, [offset]);\n pass.setVertexBuffer(0, geometry.attributes.position.buffer);\n pass.setVertexBuffer(1, geometry.attributes.normal.buffer);\n if (geometry.attributes.color) pass.setVertexBuffer(2, geometry.attributes.color.buffer);\n if (geometry.attributes.uv) pass.setVertexBuffer(3, geometry.attributes.uv.buffer);\n const instances = geometry.attributes.instanceOffset;\n if (instances) pass.setVertexBuffer(4, instances.buffer);\n for (attribute of Object.values(geometry.attributes)) {\n if (!attribute.needsUpdate) continue;\n device.queue.writeBuffer(attribute.buffer, 0, attribute.data);\n attribute.needsUpdate = false;\n geometry.bounds = null;\n }\n const index = geometry.attributes.index;\n if (index) {\n pass.setIndexBuffer(index.buffer, index.indexFormat);\n pass.drawIndexed(geometry.drawRange.count, instances?.count ?? 1, geometry.drawRange.start, 0, 0);\n } else {\n pass.draw(geometry.drawRange.count, instances?.count ?? 1, geometry.drawRange.start, 0);\n }\n}\n", "import { drawGeometry } from './drawGeometry.js';\n\nexport function drawSceneMeshes(backend, encoder, meshes) {\n const renderer = backend.renderer;\n const pass = encoder.beginRenderPass({\n colorAttachments: [{\n view: renderer.context.getCurrentTexture().createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: 'clear',\n storeOp: 'store',\n }],\n depthStencilAttachment: {\n view: renderer.depthTexture.createView(),\n depthClearValue: 1,\n depthLoadOp: 'clear',\n depthStoreOp: 'store',\n },\n });\n pass.setViewport(0, 0, renderer.canvas.width, renderer.canvas.height, 0, 1);\n pass.setBindGroup(1, renderer.sunlight.bindGroup);\n let mesh, world, uniforms, determinant, frontFace, program;\n for (mesh of meshes) {\n world = mesh.worldMatrix;\n if (mesh.texture) {\n mesh.program.uniforms.baseTexture.value = mesh.texture;\n mesh.program.uniforms.opacity.value = mesh.opacity;\n }\n uniforms = mesh.program.uniforms;\n if (uniforms.roofTexture) uniforms.roofTexture.value = backend._roofRaster?.texture || renderer.roofFallbackTexture;\n if (!mesh._frontFace || mesh._frontFaceWorldVersion !== mesh._worldMatrixVersion ||\n mesh._worldMatrixVersion === undefined) {\n determinant = world[0] * (world[5] * world[10] - world[6] * world[9]) -\n world[4] * (world[1] * world[10] - world[2] * world[9]) +\n world[8] * (world[1] * world[6] - world[2] * world[5]);\n if (!Number.isFinite(determinant) || determinant === 0) {\n throw new Error('Singular 3D transform');\n }\n mesh._frontFace = determinant < 0 ? 'cw' : 'ccw';\n mesh._frontFaceWorldVersion = mesh._worldMatrixVersion;\n }\n frontFace = mesh._frontFace;\n program = mesh.program;\n if (program.transparent && program._layerMaterial.doubleSided && !mesh._nativeSource) {\n drawGeometry(backend, mesh, pass, 'front', frontFace);\n drawGeometry(backend, mesh, pass, 'back', frontFace);\n } else {\n drawGeometry(backend, mesh, pass, program.cullMode, frontFace);\n }\n }\n pass.end();\n}\n", "export function shadowCacheMatches(sun, meshes, sunlight) {\n const cache = sun.cache;\n let unchanged = sun.enabled && cache?.meshes.size === meshes.length;\n let i, mesh, previous, range, attribute;\n if (unchanged) {\n for (i = 0; i < sunlight.direction.length; i++) {\n if (sunlight.direction[i] !== cache.direction[i]) { unchanged = false; break; }\n }\n }\n if (unchanged) {\n for (mesh of meshes) {\n previous = cache.meshes.get(mesh), range = mesh.geometry.drawRange;\n if (!(previous && previous.world === mesh._worldMatrixVersion && previous.geometry === mesh.geometry &&\n previous.start === range.start && previous.count === range.count &&\n previous.appearance === (mesh._appearance ?? 1))) { unchanged = false; break; }\n for (attribute of Object.values(mesh.geometry.attributes)) {\n if (attribute.needsUpdate) { unchanged = false; break; }\n }\n if (!unchanged) break;\n }\n }\n return unchanged;\n}\n", "import { computeBounds } from '../geometry/computeBounds.js';\n\nexport function shadowBounds(meshes) {\n const min = [Infinity, Infinity, Infinity], max = [-Infinity, -Infinity, -Infinity];\n let mesh, bounds, matrix, cached, i, x, y, z, w, axis, value;\n for (mesh of meshes) {\n if (!mesh.geometry.bounds || mesh.geometry.attributes.position.needsUpdate) computeBounds(mesh.geometry);\n bounds = mesh.geometry.bounds, matrix = mesh.worldMatrix;\n cached = mesh._shadowBounds;\n if (!cached || cached.version !== mesh._worldMatrixVersion || cached.bounds !== bounds) {\n cached = mesh._shadowBounds = { version: mesh._worldMatrixVersion, bounds,\n min: [Infinity, Infinity, Infinity], max: [-Infinity, -Infinity, -Infinity] };\n for (i = 0; i < 8; i++) {\n x = i & 1 ? bounds.max[0] : bounds.min[0], y = i & 2 ? bounds.max[1] : bounds.min[1];\n z = i & 4 ? bounds.max[2] : bounds.min[2];\n w = matrix[3] * x + matrix[7] * y + matrix[11] * z + matrix[15];\n for (axis = 0; axis < 3; axis++) {\n value = (matrix[axis] * x + matrix[axis + 4] * y + matrix[axis + 8] * z + matrix[axis + 12]) / w;\n cached.min[axis] = Math.min(cached.min[axis], value);\n cached.max[axis] = Math.max(cached.max[axis], value);\n }\n }\n }\n for (axis = 0; axis < 3; axis++) {\n min[axis] = Math.min(min[axis], cached.min[axis]);\n max[axis] = Math.max(max[axis], cached.max[axis]);\n }\n }\n // Include ground receivers below/around the loaded buildings and trees.\n min[1] = Math.min(0, min[1]);\n return { min, max };\n}\n", "import { shadowBounds } from './shadowBounds.js';\nimport { updateCamera } from '../scene/updateCamera.js';\n\nexport function shadowMatrix(meshes, sunlight) {\n const { min, max } = shadowBounds(meshes);\n const span = [], center = [], position = [];\n let i, corner, axis, point, coordinates, value;\n for (i = 0; i < 3; i++) {\n span[i] = max[i] - min[i];\n center[i] = (min[i] + max[i]) / 2;\n }\n const radius = Math.max(100, Math.hypot(...span));\n for (i = 0; i < 3; i++) position[i] = center[i] + sunlight.direction[i] * radius * 2;\n const lightCamera = {\n position,\n target: center, up: [0, 0, -1], fov: 45, aspect: 1, near: 1, far: radius * 5,\n viewMatrix: [], projectionMatrix: [], projectionViewMatrix: [],\n };\n updateCamera(lightCamera);\n const view = new DOMMatrix(lightCamera.viewMatrix);\n const low = [Infinity, Infinity, Infinity], high = [-Infinity, -Infinity, -Infinity];\n for (i = 0; i < 8; i++) {\n corner = [];\n for (axis = 0; axis < 3; axis++) corner[axis] = i & (1 << axis) ? max[axis] : min[axis];\n point = new DOMPoint(...corner, 1).matrixTransform(view);\n coordinates = [point.x, point.y, point.z];\n for (axis = 0; axis < 3; axis++) {\n value = coordinates[axis];\n low[axis] = Math.min(low[axis], value - 20);\n high[axis] = Math.max(high[axis], value + 20);\n }\n }\n for (i = 0; i < 3; i++) span[i] = high[i] - low[i];\n const projection = new DOMMatrix([\n 2 / span[0], 0, 0, 0, 0, 2 / span[1], 0, 0, 0, 0, -1 / span[2], 0,\n -(high[0] + low[0]) / span[0], -(high[1] + low[1]) / span[1], high[2] / span[2], 1,\n ]);\n return projection.multiply(view).toFloat32Array();\n}\n", "export function ensureShadowPipeline(device, sun, instanced = false) {\n const key = instanced ? 'instancePipeline' : 'pipeline';\n if (!sun[key]) {\n if (!sun.meshLayout) {\n sun.meshLayout = device.createBindGroupLayout({\n entries: [\n { binding: 0, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, buffer: { type: 'uniform', hasDynamicOffset: true } },\n ]\n });\n // Do not bind the sampled depth texture while it is a render attachment.\n sun.depthLayout = device.createBindGroupLayout({\n entries: [\n { binding: 0, visibility: GPUShaderStage.VERTEX, buffer: { type: 'uniform' } },\n ]\n });\n sun.depthBindGroup = device.createBindGroup({\n layout: sun.depthLayout, entries: [{ binding: 0, resource: { buffer: sun.buffer } }],\n });\n }\n const shader = device.createShaderModule({\n code: /* wgsl */ ` struct Mesh{world:mat4x4<f32>,padding:array<vec4<f32>,4>,highlight:vec4<f32>};@group(0)@binding(0)var<uniform> mesh:Mesh;@group(1)@binding(0)var<uniform> matrix:mat4x4<f32>;@vertex fn main(@location(0)position:vec3<f32>${instanced ? ', @location(4) offset: vec4<f32>' : ''})->@builtin(position)vec4<f32>{return matrix * mesh.world * vec4<f32>(position${instanced ? ' + offset.xyz' : ''},1.0);}@fragment fn fragmentMain(@builtin(position)position:vec4<f32>){let noise = fract(52.9829189 * fract(dot(floor(position.xy),vec2<f32>(0.06711056,0.00583715))));if(mesh.highlight.w < 1.0 && noise >= mesh.highlight.w){discard;}}` });\n const buffers = [\n { arrayStride: 12, attributes: [{ shaderLocation: 0, offset: 0, format: 'float32x3' }] },\n ];\n if (instanced) buffers.push({\n arrayStride: 16, stepMode: 'instance',\n attributes: [{ shaderLocation: 4, offset: 0, format: 'float32x4' }],\n });\n sun[key] = device.createRenderPipeline({\n layout: device.createPipelineLayout({ bindGroupLayouts: [sun.meshLayout, sun.depthLayout] }),\n vertex: {\n module: shader, entryPoint: 'main', buffers\n },\n fragment: { module: shader, entryPoint: 'fragmentMain', targets: [] },\n primitive: { topology: 'triangle-list', cullMode: 'none' },\n depthStencil: {\n format: 'depth32float', depthWriteEnabled: true, depthCompare: 'less',\n depthBias: 2, depthBiasSlopeScale: 2\n },\n });\n }\n}\n", "export function drawShadowMeshes(backend, encoder, meshes) {\n const renderer = backend.renderer, device = renderer.device, sun = renderer.sunlight;\n const pass = encoder.beginRenderPass({\n colorAttachments: [],\n depthStencilAttachment: {\n view: sun.texture.createView(), depthClearValue: 1,\n depthLoadOp: 'clear', depthStoreOp: 'store'\n },\n });\n let pipeline = sun.pipeline;\n pass.setPipeline(pipeline);\n pass.setBindGroup(1, sun.depthBindGroup);\n let mesh, instances, nextPipeline, offset, attribute, index, range;\n for (mesh of meshes) {\n instances = mesh.geometry.attributes.instanceOffset;\n nextPipeline = instances ? sun.instancePipeline : sun.pipeline;\n if (nextPipeline !== pipeline) {\n pipeline = nextPipeline;\n pass.setPipeline(pipeline);\n }\n offset = renderer.uniformSlot++ * 256;\n renderer.uniformData.set(mesh.worldMatrix, offset / 4);\n renderer.uniformData[offset / 4 + 35] = mesh._appearance ?? 1;\n if (mesh._shadowBuffer !== renderer.uniformBuffer) {\n mesh._shadowBuffer = renderer.uniformBuffer;\n mesh._shadowBindGroup = device.createBindGroup({\n layout: sun.meshLayout, entries: [\n { binding: 0, resource: { buffer: renderer.uniformBuffer, size: 144 } },\n ]\n });\n }\n for (attribute of Object.values(mesh.geometry.attributes)) {\n if (attribute.needsUpdate) {\n device.queue.writeBuffer(attribute.buffer, 0, attribute.data);\n attribute.needsUpdate = false;\n }\n }\n pass.setBindGroup(0, mesh._shadowBindGroup, [offset]);\n pass.setVertexBuffer(0, mesh.geometry.attributes.position.buffer);\n if (instances) pass.setVertexBuffer(1, instances.buffer);\n index = mesh.geometry.attributes.index, range = mesh.geometry.drawRange;\n if (index) {\n pass.setIndexBuffer(index.buffer, index.indexFormat);\n pass.drawIndexed(range.count, instances?.count ?? 1, range.start, 0, 0);\n } else pass.draw(range.count, instances?.count ?? 1, range.start, 0);\n }\n pass.end();\n}\n", "import { bindSunlight } from './bindSunlight.js';\nimport { destroyTexture } from '../rendering/destroyTexture.js';\n\n\nexport function resizeSunlight(backend, size) {\n const device = backend.renderer.device, sun = backend.renderer.sunlight;\n if (sun.size === size) return;\n if (sun.texture) destroyTexture(backend, sun.texture);\n sun.size = size;\n sun.texture = device.createTexture({\n size: [size, size], format: 'depth32float',\n usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC,\n });\n bindSunlight(backend);\n}\n", "import { shadowCacheMatches } from './shadowCacheMatches.js';\nimport { shadowMatrix } from './shadowMatrix.js';\nimport { ensureShadowPipeline } from './ensureShadowPipeline.js';\nimport { drawShadowMeshes } from './drawShadowMeshes.js';\nimport { resizeSunlight } from './resizeSunlight.js';\n\n/** One shared directional depth map. Off-screen but loaded geometry can cast shadows. */\n\nexport function renderSunlight(backend, encoder, meshes, sunlight) {\n const renderer = backend.renderer, device = renderer.device, sun = renderer.sunlight;\n if (!meshes.length || !sunlight || sunlight.altitude < 3) {\n if (!sun.enabled) return;\n const values = new Float32Array(20);\n values.set([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);\n device.queue.writeBuffer(sun.buffer, 0, values);\n sun.enabled = false;\n sun.cache = null;\n return;\n }\n if (shadowCacheMatches(sun, meshes, sunlight)) return;\n const values = new Float32Array(20);\n sun.enabled = true;\n resizeSunlight(backend, Math.min(2048, device.limits.maxTextureDimension2D));\n values.set(shadowMatrix(meshes, sunlight));\n values[16] = 1;\n device.queue.writeBuffer(sun.buffer, 0, values);\n ensureShadowPipeline(device, sun);\n let mesh;\n for (mesh of meshes) {\n if (mesh.geometry.attributes.instanceOffset) {\n ensureShadowPipeline(device, sun, true);\n break;\n }\n }\n drawShadowMeshes(backend, encoder, meshes);\n const snapshots = new Map();\n let mesh2;\n for (mesh2 of meshes) {\n snapshots.set(mesh2, {\n world: mesh2._worldMatrixVersion, geometry: mesh2.geometry,\n start: mesh2.geometry.drawRange.start, count: mesh2.geometry.drawRange.count,\n appearance: mesh2._appearance ?? 1,\n });\n }\n sun.cache = { direction: [...sunlight.direction], meshes: snapshots };\n}\n", "export const pendingUpdates = new Set();\n", "import { pendingUpdates } from '../constants/pendingUpdates.js';\n\nexport function cancelUpdate(backend) {\n const frame = backend._frame;\n pendingUpdates.delete(backend);\n backend._frame = null;\n if (!pendingUpdates.size && frame != null) {\n cancelAnimationFrame(frame);\n }\n}\n", "/** Reparent/detach scene data without drawing or disposing GPU resources. */\n\nexport function setParent(node, parent) {\n if (node.parent) node.parent.children.splice(node.parent.children.indexOf(node), 1);\n node.parent = parent;\n if (parent) parent.children.push(node);\n}\n", "import { destroyTexture } from '../rendering/destroyTexture.js';\nimport { setParent } from '../scene/setParent.js';\nimport { update } from '../scene/update.js';\n\nexport function removeRasterTile(layer, tile) {\n layer._terrainRequest?.abort();\n const mesh = layer._rasterTiles.get(tile);\n if (!mesh) return;\n setParent(mesh, null);\n update(layer);\n if (mesh.texture !== tile.texture) destroyTexture(layer, mesh.texture.texture);\n layer._rasterTiles.delete(tile);\n}\n", "import { destroyTexture } from '../rendering/destroyTexture.js';\nimport { removeRasterTile } from './removeRasterTile.js';\nimport { setParent } from '../scene/setParent.js';\nimport { update } from '../scene/update.js';\n\nexport function releaseRasterTile(backend, tile) {\r\n const key = `${tile.coords.z}/${tile.coords.x}/${tile.coords.y}`;\r\n if (backend._rasterTiles.get(key) !== tile) return;\r\n backend._rasterTiles.delete(key);\r\n backend._rasterVersion = (backend._rasterVersion || 0) + 1;\r\n tile.request.abort();\r\n if(backend._terrain3D) removeRasterTile(backend._terrain3D, tile);\r\n if (tile.mesh) setParent(tile.mesh, null);\r\n if (tile.texture) destroyTexture(backend, tile.texture.texture);\r\n tile.image?.close();\r\n backend.fire('tileunload', { tile, coords: tile.coords });\r\n update(backend);\r\n}\n", "import { releaseRasterTile } from './releaseRasterTile.js';\n\nexport function pruneRasterTiles(backend) {\n const wanted = backend._wantedRasterTiles;\n const now = performance.now();\n if (backend._pruneVersion === backend._rasterVersion && backend._pruneWanted === wanted &&\n now < backend._pruneAfter) return Number.isFinite(backend._pruneAfter);\n backend._pruneVersion = backend._rasterVersion;\n backend._pruneWanted = wanted;\n backend._pruneAfter = Infinity;\n const pending = [];\n let key, tile, parts, overlaps, coords, zoom;\n for (key of wanted) {\n tile = backend._rasterTiles.get(key);\n if (tile?.done && now - tile.loadedAt < 250) {\n backend._pruneAfter = Math.min(backend._pruneAfter, tile.loadedAt + 250);\n }\n if (!tile?.done || now - tile.loadedAt < 250) {\n parts = key.split('/');\n pending.push({ z: Number(parts[0]), x: Number(parts[1]), y: Number(parts[2]) });\n }\n }\n for ([key, tile] of backend._rasterTiles) {\n if (wanted.has(key)) continue;\n overlaps = false;\n for (coords of pending) {\n zoom = Math.min(coords.z, tile.coords.z);\n if (Math.floor(coords.x / 2 ** (coords.z - zoom)) === Math.floor(tile.coords.x / 2 ** (tile.coords.z - zoom)) &&\n Math.floor(coords.y / 2 ** (coords.z - zoom)) === Math.floor(tile.coords.y / 2 ** (tile.coords.z - zoom))) {\n overlaps = true;\n break;\n }\n }\n if (!overlaps) releaseRasterTile(backend, tile);\n }\n return Number.isFinite(backend._pruneAfter);\n}\n", "import { synchronizeZoomView } from './synchronizeZoomView.js';\nimport { resizeRenderer } from './resizeRenderer.js';\nimport { updateMapCamera } from './updateMapCamera.js';\nimport { collectFrameMeshes } from './collectFrameMeshes.js';\nimport { updateRoofRaster } from './updateRoofRaster.js';\nimport { prepareFrameMeshes } from './prepareFrameMeshes.js';\nimport { prepareFrameUniforms } from './prepareFrameUniforms.js';\nimport { drawSceneMeshes } from './drawSceneMeshes.js';\nimport { updateWorldMatrix } from \"../scene/updateWorldMatrix.js\";\nimport { renderSunlight } from '../shadows/renderSunlight.js';\nimport { cancelUpdate } from '../scene/cancelUpdate.js';\nimport { update } from '../scene/update.js';\nimport { pruneRasterTiles } from '../raster/pruneRasterTiles.js';\n\n/**\n * Rendering owner: CSS pixels -> scene metres -> perspective camera.\n * Lights and transparent sort centers are converted into the current camera space.\n * Without raster tiles, logical map projection supplies the same static alignment.\n */\n\nexport function render(backend) {\n cancelUpdate(backend);\n if (backend._shared !== backend || !backend.renderer) return;\n const map = backend._map;\n const now = performance.now();\n const size = map.getSize();\n if (!size.x || !size.y) return;\n synchronizeZoomView(backend, now);\n resizeRenderer(backend, size);\n updateMapCamera(backend, size);\n updateWorldMatrix(backend.scene);\n let sceneChanged = false;\n let layer;\n for (layer of backend._layers) {\n if (!layer._beforeRender) continue;\n layer._beforeRender();\n sceneChanged = true;\n }\n const sunlight = map._sunlight;\n collectFrameMeshes(backend, sunlight, sceneChanged);\n const shadowMeshes = backend._shadowMeshes;\n const renderer = backend.renderer;\n const rasters = updateRoofRaster(backend, now);\n const meshes = renderer.frameMeshes ||= [];\n meshes.length = 0;\n let appearing = prepareFrameMeshes(backend, rasters, now, meshes);\n const encoder = renderer.device.createCommandEncoder();\n prepareFrameUniforms(backend, meshes, shadowMeshes, sunlight);\n renderSunlight(backend, encoder, shadowMeshes, sunlight);\n drawSceneMeshes(backend, encoder, meshes);\n renderer.device.queue.writeBuffer(renderer.uniformBuffer, 0, renderer.uniformData, 0, renderer.uniformSlot * 64);\n renderer.device.queue.submit([encoder.finish()]);\n for (layer of backend._layers) {\n if (layer._wantedRasterTiles) appearing = pruneRasterTiles(layer) || appearing;\n }\n if (map._animatingZoom || appearing) update(backend);\n}\n", "import { pendingUpdates } from '../constants/pendingUpdates.js';\nimport { render } from '../rendering/render.js';\n\nexport function renderPendingUpdates() {\n const updates = [...pendingUpdates];\n pendingUpdates.clear();\n let failure;\n let backend;\n for (backend of updates) {\n backend._frame = null;\n if (backend._shared !== backend || !backend.renderer) continue;\n try {\n render(backend);\n } catch (error) {\n failure ||= error;\n }\n }\n if (failure) throw failure;\n}\n", "import { render } from \"../rendering/render.js\";\nimport { pendingUpdates } from '../constants/pendingUpdates.js';\nimport { renderPendingUpdates } from './renderPendingUpdates.js';\n\n/** Scene graph, shared camera and frame rendering. */\n/** Content changes: render once on the next animation frame. */\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 if (backend._frame != null) return backend;\n const first = pendingUpdates.values().next().value;\n pendingUpdates.add(backend);\n backend._frame = first ? first._frame : requestAnimationFrame(renderPendingUpdates);\n return backend;\n}\n", "import { nativeImageRefresh } from './nativeImageRefresh.js';\nimport { nativeImageError } from './nativeImageError.js';\nimport { removeImageState } from './removeImageState.js';\nimport { addImageState } from './addImageState.js';\nimport { update } from '../scene/update.js';\n\nexport function refreshNativeLayer(state = this) {\n state.dirty = true;\n state.viewDirty = true;\n state.failed = false;\n state.hide();\n const activeImages = [state.source._icon, state.source._shadow, state.source._image];\n let image;\n for (image of state.images) {\n if (activeImages.includes(image)) continue;\n image.removeEventListener('load', nativeImageRefresh);\n image.removeEventListener('error', nativeImageError);\n removeImageState(image, state);\n state.images.delete(image);\n }\n for (image of activeImages) {\n if (!(image instanceof HTMLImageElement) || state.images.has(image)) continue;\n state.images.add(image);\n addImageState(image, state);\n image.addEventListener('load', nativeImageRefresh);\n image.addEventListener('error', nativeImageError);\n }\n if (state.backend._shared) update(state.backend);\n}\n", "import { refreshNativeLayer } from './refreshNativeLayer.js';\n\nexport function nativeLayerMethod(name, source, args) {\n const state = source._nativeGPU, original = state.originalMethods.get(name);\n const result = original.apply(source, args);\n let layer, zIndex;\n if ((name === 'bringToFront' || name === 'bringToBack') && source instanceof L.GridLayer) {\n let extreme = name === 'bringToFront' ? -Infinity : Infinity;\n for (layer of Object.values(state.map._layers)) {\n if (layer === source || !(layer instanceof L.GridLayer) || layer.getPane() !== source.getPane()) continue;\n zIndex = layer.options.zIndex || 0;\n extreme = name === 'bringToFront' ? Math.max(extreme, zIndex) : Math.min(extreme, zIndex);\n }\n const edge = name === 'bringToFront' ? extreme + 1 : extreme - 1;\n if (Number.isFinite(edge)) source.setZIndex(edge);\n }\n if (name === 'bringToFront') state.order = ++state.map._nativeGPUOrder;\n if (name === 'bringToBack') state.order = --state.map._nativeGPUBack;\n refreshNativeLayer(state);\n return result;\n}\n", "import { nativeLayerMethod } from './nativeLayerMethod.js';\n\nexport function nativeSetLatLng(...args) { return nativeLayerMethod('setLatLng', this, args); }\n", "import { nativeLayerMethod } from './nativeLayerMethod.js';\n\nexport function nativeSetLatLngs(...args) { return nativeLayerMethod('setLatLngs', this, args); }\n", "import { nativeLayerMethod } from './nativeLayerMethod.js';\n\nexport function nativeAddLatLng(...args) { return nativeLayerMethod('addLatLng', this, args); }\n", "import { nativeLayerMethod } from './nativeLayerMethod.js';\n\nexport function nativeSetRadius(...args) { return nativeLayerMethod('setRadius', this, args); }\n", "import { nativeLayerMethod } from './nativeLayerMethod.js';\n\nexport function nativeSetStyle(...args) { return nativeLayerMethod('setStyle', this, args); }\n", "import { nativeLayerMethod } from './nativeLayerMethod.js';\n\nexport function nativeRedraw(...args) { return nativeLayerMethod('redraw', this, args); }\n", "import { nativeLayerMethod } from './nativeLayerMethod.js';\n\nexport function nativeSetIcon(...args) { return nativeLayerMethod('setIcon', this, args); }\n", "import { nativeLayerMethod } from './nativeLayerMethod.js';\n\nexport function nativeSetUrl(...args) { return nativeLayerMethod('setUrl', this, args); }\n", "import { nativeLayerMethod } from './nativeLayerMethod.js';\n\nexport function nativeSetBounds(...args) { return nativeLayerMethod('setBounds', this, args); }\n", "import { nativeLayerMethod } from './nativeLayerMethod.js';\n\nexport function nativeSetOpacity(...args) { return nativeLayerMethod('setOpacity', this, args); }\n", "import { nativeLayerMethod } from './nativeLayerMethod.js';\n\nexport function nativeSetZIndex(...args) { return nativeLayerMethod('setZIndex', this, args); }\n", "import { nativeLayerMethod } from './nativeLayerMethod.js';\n\nexport function nativeSetZIndexOffset(...args) { return nativeLayerMethod('setZIndexOffset', this, args); }\n", "import { nativeLayerMethod } from './nativeLayerMethod.js';\n\nexport function nativeBringToFront(...args) { return nativeLayerMethod('bringToFront', this, args); }\n", "import { nativeLayerMethod } from './nativeLayerMethod.js';\n\nexport function nativeBringToBack(...args) { return nativeLayerMethod('bringToBack', this, args); }\n", "import { nativeSetLatLng } from '../core/nativeSetLatLng.js';\nimport { nativeSetLatLngs } from '../core/nativeSetLatLngs.js';\nimport { nativeAddLatLng } from '../core/nativeAddLatLng.js';\nimport { nativeSetRadius } from '../core/nativeSetRadius.js';\nimport { nativeSetStyle } from '../core/nativeSetStyle.js';\nimport { nativeRedraw } from '../core/nativeRedraw.js';\nimport { nativeSetIcon } from '../core/nativeSetIcon.js';\nimport { nativeSetUrl } from '../core/nativeSetUrl.js';\nimport { nativeSetBounds } from '../core/nativeSetBounds.js';\nimport { nativeSetOpacity } from '../core/nativeSetOpacity.js';\nimport { nativeSetZIndex } from '../core/nativeSetZIndex.js';\nimport { nativeSetZIndexOffset } from '../core/nativeSetZIndexOffset.js';\nimport { nativeBringToFront } from '../core/nativeBringToFront.js';\nimport { nativeBringToBack } from '../core/nativeBringToBack.js';\n\nexport const nativeMethodHandlers = {\n setLatLng: nativeSetLatLng,\n setLatLngs: nativeSetLatLngs,\n addLatLng: nativeAddLatLng,\n setRadius: nativeSetRadius,\n setStyle: nativeSetStyle,\n redraw: nativeRedraw,\n setIcon: nativeSetIcon,\n setUrl: nativeSetUrl,\n setBounds: nativeSetBounds,\n setOpacity: nativeSetOpacity,\n setZIndex: nativeSetZIndex,\n setZIndexOffset: nativeSetZIndexOffset,\n bringToFront: nativeBringToFront,\n bringToBack: nativeBringToBack,\n};\n", "/** Rendering owner per map; entries are removed on the last layer removal. */\nexport const renderers = new WeakMap();\n", "import { renderers } from './renderers.js';\r\n\r\nexport const cityMapper = {\r\n renderers,\r\n nextId: 0,\r\n};\r\n", "/** A fresh, empty scene-graph node. */\nexport function emptyNode() {\n return {\n position: [0, 0, 0],\n rotation: [0, 0, 0],\n scale: [1, 1, 1],\n worldMatrix: [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],\n children: [],\n visible: true,\n };\n}\n", "export function textureBinding(bindings, name, enabled) {\r\n if (!enabled) return '';\r\n const current = 3 + bindings.length * 2;\r\n bindings.push({ name, texture: current, sampler: current + 1 });\r\n return /* wgsl */ `@group(0)@binding(${current})var ${name}:texture_2d<f32>;@group(0)@binding(${current + 1})var ${name}Sampler:sampler;`;\r\n}\r\n", "import { textureBinding } from '../rendering/textureBinding.js';\n\n/** Material WGSL and texture bindings, without a GPU device or Leaflet layer. */\nexport function materialShaders(material = {}, sparkle = false, elevationWGSL = '') {\n const hasBase = Boolean(material.baseTexture);\n const hasMetal = Boolean(material.metalTexture);\n const hasEmissive = Boolean(material.emissiveTexture);\n const hasOcclusion = Boolean(material.occlusionTexture);\n const hasRoof = Boolean(material.roofTexture);\n const hasTerrain = Boolean(material.terrain);\n const textured = hasBase || hasMetal || hasEmissive || hasOcclusion || material.nightLight;\n const vertex = /* wgsl */ ` struct Mesh{worldMatrix:mat4x4<f32>,baseColor:vec4<f32>,material:vec4<f32>,emissive:vec4<f32>,terrain:vec4<f32>,highlight:vec4<f32>,};struct Frame{viewMatrix:mat4x4<f32>,projectionMatrix:mat4x4<f32>,roofMatrix:mat4x4<f32>,lightDirection:vec4<f32>,skyDirection:vec4<f32>,atmosphereTint:vec4<f32>,};@group(0)@binding(0)var<uniform> u:Mesh;@group(0)@binding(1)var<uniform> frame:Frame;struct Solar{matrix:mat4x4<f32>,params:vec4<f32>};@group(1)@binding(0)var<uniform> solar:Solar;${hasTerrain ? /* wgsl */ `@group(0)@binding(2)var dem:texture_2d<f32>;${elevationWGSL}` : ''} struct VertexInput{@location(0)position:vec3<f32>,@location(1)normal:vec3<f32>,${material.instanced ? '@location(4) instanceOffset: vec4<f32>,' : ''} ${material.vertexColors ? '@location(2) color: vec3<f32>,' : ''} ${textured ? '@location(3) uv: vec2<f32>,' : ''}};struct VertexOutput{@builtin(position)position:vec4<f32>,@location(0)color:vec3<f32>,@location(1)normal:vec3<f32>,@location(2)viewPosition:vec3<f32>,@location(6)shadowPosition:vec4<f32>,@location(7)worldPosition:vec3<f32>,${sparkle ? '@location(8) localPosition: vec3<f32>,' : ''} ${textured ? '@location(3) uv: vec2<f32>,' : ''} ${hasRoof ? '@location(4) roofUv: vec2<f32>, @location(5) roof: f32,' : ''}};@vertex fn vertexMain(input:VertexInput,@builtin(vertex_index)vertexIndex:u32)-> VertexOutput{var output:VertexOutput;var position = input.position${material.instanced ? ' + input.instanceOffset.xyz' : ''};${hasTerrain ? 'position.y = elevation(u.terrain.xy + input.uv * u.terrain.z, u.terrain.w) - u.terrain.w;' : ''} let featureVertex = f32(vertexIndex)${material.instanced ? ' + input.instanceOffset.w' : ''};let highlighted = featureVertex >= u.highlight.x && featureVertex < u.highlight.y;output.color = ${material.vertexColors\n ? 'select(input.color, vec3<f32>(72.0 / 255.0, 217.0 / 255.0, 1.0), highlighted)'\n : 'u.baseColor.rgb'};let m = mat3x3<f32>(u.worldMatrix[0].xyz,u.worldMatrix[1].xyz,u.worldMatrix[2].xyz);let normal =(cross(m[1],m[2])* input.normal.x + cross(m[2],m[0])* input.normal.y + cross(m[0],m[1])* input.normal.z)/ determinant(m);output.normal =(frame.viewMatrix * vec4<f32>(normal,0.0)).xyz;let world = u.worldMatrix * vec4<f32>(position,1.0);output.shadowPosition = solar.matrix * world;output.worldPosition = world.xyz / world.w;${sparkle ? `output.localPosition = input.position${material.instanced ? ' + input.instanceOffset.xyz' : ''};` : ''} let viewPosition = frame.viewMatrix * world;output.viewPosition = viewPosition.xyz;${textured ? 'output.uv = input.uv;' : ''} ${hasRoof ? /* wgsl */ ` output.roofUv =(frame.roofMatrix * world).xz;output.roof = select(0.0,1.0,input.normal.y >= 0.5 && !highlighted);` : ''} output.position = frame.projectionMatrix * viewPosition;return output;}`;\n const bindings = [];\n const baseBinding = textureBinding(bindings, 'baseTexture', hasBase);\n const metalBinding = textureBinding(bindings, 'metalTexture', hasMetal);\n const emissiveBinding = textureBinding(bindings, 'emissiveTexture', hasEmissive);\n const occlusionBinding = textureBinding(bindings, 'occlusionTexture', hasOcclusion);\n const roofBinding = textureBinding(bindings, 'roofTexture', hasRoof);\n const fragment = /* wgsl */ ` struct Mesh{worldMatrix:mat4x4<f32>,baseColor:vec4<f32>,material:vec4<f32>,emissive:vec4<f32>,terrain:vec4<f32>,highlight:vec4<f32>,};struct Frame{viewMatrix:mat4x4<f32>,projectionMatrix:mat4x4<f32>,roofMatrix:mat4x4<f32>,lightDirection:vec4<f32>,skyDirection:vec4<f32>,atmosphereTint:vec4<f32>,};struct Solar{matrix:mat4x4<f32>,params:vec4<f32>,};@group(0)@binding(0)var<uniform> u:Mesh;@group(0)@binding(1)var<uniform> frame:Frame;@group(1)@binding(0)var<uniform> solar:Solar;@group(1)@binding(1)var shadowTexture:texture_depth_2d;@group(1)@binding(2)var shadowSampler:sampler_comparison;@group(1)@binding(3)var<storage,read> lightGrid:array<vec4<f32>>;${baseBinding}${metalBinding}${emissiveBinding}${occlusionBinding}${roofBinding} struct FragmentInput{@builtin(position)position:vec4<f32>,@location(0)color:vec3<f32>,@location(1)normal:vec3<f32>,@location(2)viewPosition:vec3<f32>,@location(6)shadowPosition:vec4<f32>,@location(7)worldPosition:vec3<f32>,${sparkle ? '@location(8) localPosition: vec3<f32>,' : ''} ${textured ? '@location(3) uv: vec2<f32>,' : ''} ${hasRoof ? '@location(4) roofUv: vec2<f32>, @location(5) roof: f32,' : ''}};const PI:f32 = 3.14159265;fn toLinear(c:vec3<f32>)-> vec3<f32>{return select(c / 12.92,pow((c + vec3<f32>(0.055))/ 1.055,vec3<f32>(2.4)),c >= vec3<f32>(0.04045));}fn toSRGB(c:vec3<f32>)-> vec3<f32>{return select(c * 12.92,1.055 * pow(max(c,vec3<f32>(0.0)),vec3<f32>(1.0 / 2.4))- vec3<f32>(0.055),c >= vec3<f32>(0.0031308));}fn sunVisibility(position:vec4<f32>)-> f32{let p = position.xyz / position.w;let uv = vec2<f32>(p.x * 0.5 + 0.5,0.5 - p.y * 0.5);if(solar.params.x < 0.5 || any(uv < vec2<f32>(0.0))|| any(uv > vec2<f32>(1.0))|| p.z < 0.0 || p.z > 1.0){return 1.0;}return textureSampleCompareLevel(shadowTexture,shadowSampler,uv,p.z - 0.0003);}fn gridLighting(position:vec3<f32>,normal:vec3<f32>,offset:u32)-> vec3<f32>{let grid = lightGrid[offset];if(grid.w < 1.0){return vec3<f32>(0.0);}let cell = vec2<i32>(floor((position.xz - grid.xy)/ grid.z));if(any(cell < vec2<i32>(0))|| cell.x >= i32(grid.w)|| cell.y >= i32(lightGrid[offset + 1u].x)){return vec3<f32>(0.0);}let header = lightGrid[offset + 2u + u32(cell.y)* u32(grid.w)+ u32(cell.x)];var light = vec3<f32>(0.0);for(var i = 0u;i < u32(header.y);i++){let source = lightGrid[offset + u32(header.x)+ i * 2u];let colour = lightGrid[offset + u32(header.x)+ i * 2u + 1u];let delta = source.xyz - position;let distance2 = max(dot(delta,delta),1.0);let falloff = max(0.0,1.0 - distance2 /(source.w * source.w));let lambert = max(0.0,dot(normal,delta / sqrt(distance2)));light += toLinear(colour.rgb)* colour.w * lambert * falloff * falloff / distance2;}return light;}fn localLighting(position:vec3<f32>,normal:vec3<f32>)-> vec3<f32>{if(frame.skyDirection.w <= 0.0){return vec3<f32>(0.0);}var light = gridLighting(position,normal,0u);let moving = u32(lightGrid[1].z);if(moving > 0u){light += gridLighting(position,normal,moving);}return light * frame.skyDirection.w;}fn appearance(position:vec2<f32>){let noise = fract(52.9829189 * fract(dot(floor(position),vec2<f32>(0.06711056,0.00583715))));if(u.highlight.w < 1.0 && noise >= u.highlight.w){discard;}}@fragment fn fragmentMain(input:FragmentInput,@builtin(front_facing)frontFacing:bool)->@location(0)vec4<f32>{${material.nightLight ? /* wgsl */ ` if(input.uv.x <= 2.0){let radial = max(0.0,1.0 - dot(input.uv,input.uv));let alpha = radial * radial * frame.skyDirection.w * 0.65;if(alpha < 0.005){discard;}appearance(input.position.xy);return vec4<f32>(input.color,alpha);}` : ''} let sunlight = sunVisibility(input.shadowPosition);let worldNormal = normalize(transpose(mat3x3<f32>(frame.viewMatrix[0].xyz,frame.viewMatrix[1].xyz,frame.viewMatrix[2].xyz))* normalize(input.normal))* select(-1.0,1.0,frontFacing);let artificial = localLighting(input.worldPosition,worldNormal);${material.unlit ? /* wgsl */ ` let rasterTexel = ${hasBase ? 'textureSample(baseTexture, baseTextureSampler, input.uv)' : 'vec4<f32>(input.color, 1.0)'};return vec4<f32>(toSRGB(toLinear(rasterTexel.rgb)*(frame.atmosphereTint.rgb *(0.55 + 0.45 * sunlight)+ artificial)),${material.alphaMode === 'BLEND' ? 'u.material.z * rasterTexel.a' : '1.0'});` : /* wgsl */ ` var normal = normalize(input.normal)* select(-1.0,1.0,frontFacing);let texel = ${hasBase ? 'textureSample(baseTexture, baseTextureSampler, input.uv)' : 'vec4<f32>(1.0)'};let alpha = u.material.z * texel.a;${material.alphaMode === 'MASK' ? 'if (alpha < u.material.w) { discard; }' : ''} ${material.alphaMode === 'BLEND' ? 'if (alpha < 0.01) { discard; }' : ''} var base = ${material.vertexColors ? 'toLinear(min(input.color, vec3<f32>(1.0)))' : 'input.color'} * ${material.baseTexture?.srgb ? 'texel.rgb' : 'toLinear(texel.rgb)'};${hasRoof ? /* wgsl */ ` if(input.roof > 0.5 && all(input.roofUv >= vec2<f32>(0.0))&& all(input.roofUv <= vec2<f32>(1.0))){let roof = textureSampleLevel(roofTexture,roofTextureSampler,input.roofUv,0.0);base = mix(base,toLinear(roof.rgb),roof.a);}` : ''} let mr = ${hasMetal ? 'textureSample(metalTexture, metalTextureSampler, input.uv)' : 'vec4<f32>(1.0)'};let metal = clamp(u.material.x * mr.b,0.0,1.0);let rough = clamp(u.material.y * mr.g,0.08,1.0);let view = normalize(-input.viewPosition);let halfVector = normalize(view + frame.lightDirection.xyz);let nl = max(dot(normal,frame.lightDirection.xyz),0.0)* frame.lightDirection.w * sunlight;let nv = max(dot(normal,view),0.001);let nh = max(dot(normal,halfVector),0.0);let vh = max(dot(view,halfVector),0.0);let a2 = pow(rough,4.0);let d = a2 / max(PI * pow(nh * nh *(a2 - 1.0)+ 1.0,2.0),0.0001);let gv = nl * sqrt(nv * nv *(1.0 - a2)+ a2);let gl = nv * sqrt(nl * nl *(1.0 - a2)+ a2);let visibility = 0.5 / max(gv + gl,0.0001);let f0 = mix(vec3<f32>(0.04),base,metal);let fresnel = f0 +(1.0 - f0)* pow(1.0 - vh,5.0);let specular = d * visibility * fresnel;let diffuse =(1.0 - metal)* base / PI;let sky = dot(normal,frame.skyDirection.xyz)* 0.5 + 0.5;let ambient = mix(toLinear(vec3<f32>(0.455,0.412,0.322)),vec3<f32>(1.0),sky)*(2.0 / PI);let ao = ${hasOcclusion ? 'mix(1.0, textureSample(occlusionTexture, occlusionTextureSampler, input.uv).r, u.emissive.w)' : '1.0'};${sparkle ? /* wgsl */ ` let lattice =(fract(input.localPosition / 2.5)- 0.5)* 2.5;let pointGlow =(1.0 - smoothstep(0.16,0.42,length(lattice)))* u.highlight.z;` : ''} let glow = ${sparkle ? 'vec3<f32>(3.0, 2.6, 1.8) * pointGlow +' : ''}${material.vertexColors\n ? ' max(input.color - vec3<f32>(1.0), vec3<f32>(0.0)) * (0.3 + 5.0 * frame.skyDirection.w) +' : ''} u.emissive.rgb * ${hasEmissive\n ? material.emissiveTexture.srgb\n ? 'textureSample(emissiveTexture, emissiveTextureSampler, input.uv).rgb'\n : 'toLinear(textureSample(emissiveTexture, emissiveTextureSampler, input.uv).rgb)'\n : 'vec3<f32>(1.0)'};var color = ambient * base *(1.0 - metal)* ao +(diffuse + specular)* nl * toLinear(vec3<f32>(1.0,0.937,0.835))* 3.0 + glow;${material.vertexColors ? 'color = base * (ambient + toLinear(vec3<f32>(1.0, 0.937, 0.835)) * (3.0 / PI) * nl) + glow;' : ''} color =(color - glow)* frame.atmosphereTint.rgb + base * artificial *(1.0 - metal * 0.5)+ glow;appearance(input.position.xy);return vec4<f32>(toSRGB(color),${material.alphaMode === 'BLEND' ? 'alpha' : '1.0'});`}}`;\n return { vertex, fragment, bindings, textured, hasTerrain };\n}\n", "/**\n * WGSL twin of getElevation for the vertex shader: bilinear DEM pixels, or the first valid\n * neighbour near no-data (stored as -1e9), else `base`. Expects `dem: texture_2d<f32>`.\n */\nexport const elevationWGSL = /* wgsl */ ` fn demSample(pixel:vec2<i32>)-> f32{if(any(pixel < vec2<i32>(0))|| any(pixel >= vec2<i32>(textureDimensions(dem)))){return -1e9;}return textureLoad(dem,pixel,0).r;}fn elevation(pixel:vec2<f32>,base:f32)-> f32{let p = pixel - vec2<f32>(0.5);let f = fract(p);let i = vec2<i32>(floor(p));let v00 = demSample(i);let v10 = demSample(i + vec2<i32>(1,0));let v01 = demSample(i + vec2<i32>(0,1));let v11 = demSample(i + vec2<i32>(1,1));if(v00 > -1000.0 && v10 > -1000.0 && v01 > -1000.0 && v11 > -1000.0){return mix(mix(v00,v10,f.x),mix(v01,v11,f.x),f.y);}if(v00 > -1000.0){return v00;}if(v10 > -1000.0){return v10;}if(v01 > -1000.0){return v01;}if(v11 > -1000.0){return v11;}return base;}`;\n", "export async function reportCompilation(backend, pending) {\n let info, message;\n try {\n const infos = await Promise.all(pending);\n const errors = [];\n for (info of infos) {\n for (message of info.messages) if (message.type === 'error') errors.push(message.message);\n }\n if (errors.length) {\n backend.fire('error', {\n error: new Error(`Unable to compile Layer3D WGSL: ${errors.join('\\n')}`),\n });\n }\n } catch (error) {\n backend.fire('error', { error });\n }\n}\n", "import { materialShaders } from '../shaders/materialShaders.js';\nimport { elevationWGSL } from '../constants/elevationWGSL.js';\nimport { reportCompilation } from './reportCompilation.js';\n\n\nexport function createProgram(backend, material = {}) {\n const shaders = materialShaders(\n material,\n !!backend.options.nightSparkle,\n material.terrain ? elevationWGSL : ''\n );\n const vertex = backend.renderer.device.createShaderModule({ code: shaders.vertex });\n const fragment = backend.renderer.device.createShaderModule({ code: shaders.fragment });\n reportCompilation(backend, [\n vertex.getCompilationInfo(),\n fragment.getCompilationInfo()\n ]);\n const vertexBuffers = [\n { arrayStride: 12, attributes: [{ shaderLocation: 0, offset: 0, format: 'float32x3' }] },\n { arrayStride: 12, attributes: [{ shaderLocation: 1, offset: 0, format: 'float32x3' }] },\n material.vertexColors ? { arrayStride: 12, attributes: [{ shaderLocation: 2, offset: 0, format: 'float32x3' }] } : null,\n shaders.textured ? { arrayStride: 8, attributes: [{ shaderLocation: 3, offset: 0, format: 'float32x2' }] } : null,\n ];\n if (material.instanced) vertexBuffers.push({\n arrayStride: 16, stepMode: 'instance',\n attributes: [{ shaderLocation: 4, offset: 0, format: 'float32x4' }],\n });\n const bindGroupEntries = [{\n binding: 0,\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n buffer: { type: 'uniform', hasDynamicOffset: true },\n }, {\n binding: 1,\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n buffer: { type: 'uniform' },\n }];\n if (shaders.hasTerrain) {\n bindGroupEntries.push({\n binding: 2,\n visibility: GPUShaderStage.VERTEX,\n texture: { sampleType: 'unfilterable-float', viewDimension: '2d' },\n });\n }\n\n let texture;\n for (texture of shaders.bindings) {\n bindGroupEntries.push({\n binding: texture.texture,\n visibility: GPUShaderStage.FRAGMENT,\n texture: { sampleType: 'float', viewDimension: '2d' },\n });\n bindGroupEntries.push({\n binding: texture.sampler,\n visibility: GPUShaderStage.FRAGMENT,\n sampler: { type: 'filtering' },\n });\n }\n const bindGroupLayout = backend.renderer.device.createBindGroupLayout({ entries: bindGroupEntries });\n const pipelineLayout = backend.renderer.device.createPipelineLayout({ bindGroupLayouts: [bindGroupLayout, backend.renderer.sunlight.layout] });\n return {\n device: backend.renderer.device,\n vertex,\n fragment,\n bindings: shaders.bindings,\n vertexBuffers,\n bindGroupLayout,\n pipelineLayout,\n pipelineCache: new Map(),\n cullMode: material.doubleSided ? 'none' : 'back',\n transparent: material.alphaMode === 'BLEND',\n depthWrite: material.depthWrite ?? material.alphaMode !== 'BLEND',\n depthTest: material.depthTest !== false,\n terrain: material.terrain,\n nightLight: Boolean(material.nightLight),\n nightSparkle: !!backend.options.nightSparkle,\n uniforms: {\n baseColor: { value: material.color || [1, 1, 1] },\n metallic: { value: material.metallic ?? 0 },\n roughness: { value: material.roughness ?? 0.85 },\n opacity: { value: material.opacity ?? 1 },\n alphaCutoff: { value: material.alphaCutoff ?? 0.5 },\n occlusionStrength: { value: material.occlusionStrength ?? 1 },\n emissive: { value: material.emissive || [0, 0, 0] },\n ...(material.baseTexture ? { baseTexture: { value: material.baseTexture } } : {}),\n ...(material.metalTexture ? { metalTexture: { value: material.metalTexture } } : {}),\n ...(material.emissiveTexture ? { emissiveTexture: { value: material.emissiveTexture } } : {}),\n ...(material.occlusionTexture ? { occlusionTexture: { value: material.occlusionTexture } } : {}),\n ...(material.roofTexture ? { roofTexture: { value: null } } : {}),\n },\n _layerMaterial: material,\n };\n}\n", "import { cityMapper } from '../constants/cityMapper.js';\nimport { emptyNode } from '../scene/emptyNode.js';\nimport { createProgram } from './createProgram.js';\nimport { setParent } from '../scene/setParent.js';\nimport { update } from '../scene/update.js';\n\n/**\n * Add a non-indexed, vertex-coloured mesh from flat vec3 arrays `{ position, normal, color }` in layer-local metres.\n * `usage` adds GPUBufferUsage flags to the vertex buffers (e.g. STORAGE for compute passes).\n * A supplied `program` shares compiled shaders and pipelines across compatible meshes.\n */\n\nexport function createMesh(backend, data, material = {}, usage = 0, program) {\n const { device } = backend.renderer, attributes = {};\n let name, values, array, size, buffer;\n for ([name, values] of Object.entries(data)) {\n array = new Float32Array(values);\n size = name === 'uv' ? 2 : 3;\n buffer = device.createBuffer({ size: Math.max(4, array.byteLength), usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST | usage });\n device.queue.writeBuffer(buffer, 0, array);\n attributes[name] = { size, data: array, count: array.length / size, buffer };\n }\n const mesh = {\n ...emptyNode(),\n device,\n geometry: { device, attributes, drawRange: { start: 0, count: attributes.position.count } },\n program: program || createProgram(backend, { vertexColors: true, doubleSided: true, ...material }),\n id: cityMapper.nextId++, renderOrder: 0, extras: {},\n };\n setParent(mesh, backend.root);\n update(backend);\n return mesh;\n}\n", "import { setParent } from '../scene/setParent.js';\nimport { update } from '../scene/update.js';\n\nexport function disposeMesh(backend, mesh) {\n if (!mesh) {\n return;\n }\n setParent(mesh, null);\n update(backend);\n let attribute;\n for (attribute of Object.values(mesh.geometry.attributes)) {\n attribute.buffer.destroy();\n }\n}\n", "/**\n * @returns {boolean} Whether the `{x, y}` points are in clockwise order.\n */\n\nexport function isClockWise(points) {\n let area = 0;\n let i, a, b;\n for (i = 0; i < points.length; i++) {\n a = points[i], b = points[(i + 1) % points.length];\n area += a.x * b.y - b.x * a.y;\n }\n return area < 0;\n}\n", "export function cross(a, b, c) {\r\n return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);\r\n}\r\n", "export function equal(a, b) {\r\n return a.x === b.x && a.y === b.y;\r\n}\r\n", "import { cross } from './cross.js';\nimport { equal } from './equal.js';\n\nexport function clean(ring) {\n let changed = true;\n let i, a, b, c;\n while (changed && ring.length > 3) {\n changed = false;\n for (i = 0; i < ring.length; i++) {\n 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", "export function inside(point, ring) {\n let result = false;\n let i, j, a, b;\n for (i = 0, j = ring.length - 1; i < ring.length; j = i++) {\n 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", "import { inside } from './inside.js';\n\nexport function insideHole(point, rings) {\n let i;\n for (i = 1; i < rings.length; i++) if (inside(point, rings[i])) return true;\n return false;\n}\n", "export function on(p, q, r) {\r\n return Math.min(p.x, q.x) <= r.x && r.x <= Math.max(p.x, q.x) &&\r\n Math.min(p.y, q.y) <= r.y && r.y <= Math.max(p.y, q.y);\r\n}\r\n", "import { equal } from './equal.js';\r\nimport { cross } from './cross.js';\r\nimport { on } from './on.js';\r\n\r\nexport function intersects(a, b, c, d) {\r\n if (equal(a, c) || equal(a, d) || equal(b, c) || equal(b, d)) return false;\r\n const abC = cross(a, b, c), abD = cross(a, b, d), cdA = cross(c, d, a), cdB = cross(c, d, b);\r\n return abC * abD < 0 && cdA * cdB < 0 ||\r\n abC === 0 && on(a, b, c) || abD === 0 && on(a, b, d) ||\r\n cdA === 0 && on(c, d, a) || cdB === 0 && on(c, d, b);\r\n}\r\n", "import { intersects } from './intersects.js';\n\nexport function crossesRing(a, b, ring) {\n let i;\n for (i = 0; i < ring.length; i++) {\n if (intersects(a, b, ring[i], ring[(i + 1) % ring.length])) return true;\n }\n return false;\n}\n", "import { crossesRing } from './crossesRing.js';\n\nexport function crossesBoundary(a, b, polygon, rings) {\n if (crossesRing(a, b, polygon)) return true;\n let i;\n for (i = 1; i < rings.length; i++) if (crossesRing(a, b, rings[i])) return true;\n return false;\n}\n", "import { equal } from './equal.js';\nimport { cross } from './cross.js';\n\nexport function containsVertex(polygon, a, b, c) {\n let p;\n for (p of polygon) {\n if (!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) return true;\n }\n return false;\n}\n", "export function area(ring) {\n let sum = 0;\n let i, p, q;\n for (i = 0; i < ring.length; i++) {\n p = ring[i], q = ring[(i + 1) % ring.length];\n sum += p.x * q.y - q.x * p.y;\n }\n return Math.abs(sum) / 2;\n}\n", "export function minimumX(ring) {\n const values = [];\n let point;\n for (point of ring) values.push(point.x);\n return Math.min(...values);\n}\n", "import { minimumX } from './minimumX.js';\n\nexport function sortHoles(holes) {\n const buffer = new Array(holes.length), entries = [];\n let ring, width, start, middle, end, left, right, output, previous, i;\n for (ring of holes) entries.push({ ring, x: minimumX(ring) });\n let source = entries, target = buffer;\n for (width = 1; width < entries.length; width *= 2) {\n for (start = 0; start < entries.length; start += width * 2) {\n middle = Math.min(start + width, entries.length), end = Math.min(start + width * 2, entries.length);\n left = start, right = middle;\n for (output = start; output < end; output++) {\n if (left < middle && (right >= end || source[left].x <= source[right].x)) {\n target[output] = source[left++];\n } else {\n target[output] = source[right++];\n }\n }\n }\n previous = source;\n source = target;\n target = previous;\n }\n for (i = 0; i < holes.length; i++) holes[i] = source[i].ring;\n return holes;\n}\n", "import { isClockWise } from \"./isClockWise.js\";\nimport { cross } from './cross.js';\nimport { clean } from './clean.js';\nimport { inside } from './inside.js';\nimport { insideHole } from './insideHole.js';\nimport { crossesBoundary } from './crossesBoundary.js';\nimport { containsVertex } from './containsVertex.js';\nimport { area } from './area.js';\nimport { sortHoles } from './sortHoles.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 let p, index, path, ring, hole, bridge, distance, h, a, b, d, mid, h2, p2, clipped, i, c, triangle2;\n for (p of points) {\n if (!Number.isFinite(p.x) || !Number.isFinite(p.y)) throw new Error('Invalid polygon coordinates');\n }\n // Translate near the origin to avoid cancellation with geographic coordinates.\n const vertices = [];\n for (index = 0; index < points.length; index++) {\n p = points[index];\n vertices.push({ x: p.x - contour[0].x, y: p.y - contour[0].y, index });\n }\n // Remove zero-area corners before connecting holes; keep original vertex indices.\n let offset = 0;\n const rings = [], paths = [contour, ...holes];\n for (index = 0; index < paths.length; index++) {\n path = paths[index];\n ring = clean(vertices.slice(offset, offset += path.length));\n if (isClockWise(ring) !== Boolean(index)) ring.reverse();\n rings.push(ring);\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 const holesToConnect = sortHoles(rings.slice(1));\n for (hole of holesToConnect) {\n bridge = void 0, distance = Infinity;\n for (h = 0; h < hole.length; h++) for (p = 0; p < polygon.length; p++) {\n a = hole[h], b = polygon[p], d = (a.x - b.x) ** 2 + (a.y - b.y) ** 2;\n if (d >= distance) continue;\n mid = { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n if (!inside(mid, rings[0]) || insideHole(mid, rings)) continue;\n if (crossesBoundary(a, b, polygon, rings)) continue;\n bridge = [h, p]; distance = d;\n }\n if (!bridge) throw new Error('Unable to connect polygon hole');\n [h2, p2] = bridge;\n polygon = [...polygon.slice(0, p2 + 1), ...hole.slice(h2), ...hole.slice(0, h2 + 1),\n polygon[p2], ...polygon.slice(p2 + 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 clipped = false;\n for (i = 0; i < polygon.length; i++) {\n 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 (containsVertex(polygon, a, b, c)) 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) {\n const triangle = [];\n for (p of polygon) triangle.push(p.index);\n result.push(triangle);\n }\n // Reject incomplete coverage instead of silently emitting a partial roof.\n let holeArea = 0, actual = 0;\n for (i = 1; i < rings.length; i++) holeArea += area(rings[i]);\n const expected = area(rings[0]) - holeArea;\n for (triangle2 of result) actual += cross(vertices[triangle2[0]], vertices[triangle2[1]], vertices[triangle2[2]]) / 2;\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", "export function triangle(point, target, a, b, c) {\r\n return target.push(...point(a), ...point(b), ...point(c));\r\n}\r\n", "export function diskAt(center, radius, radiusY, count, index) {\r\n return new L.Point(center.x + radius * Math.cos(index * 2 * Math.PI / count),\r\n center.y + radiusY * Math.sin(index * 2 * Math.PI / count));\r\n}\r\n", "import { triangle } from './nativeTriangle.js';\nimport { diskAt } from './diskAt.js';\n\nexport function disk(point, center, radius, target, radiusY = radius) {\n if (!(radius > 0) || !(radiusY > 0)) return;\n const count = Math.max(12, Math.min(128, Math.ceil(Math.PI * Math.sqrt(radius))));\n let i;\n for (i = 0; i < count; i++) {\n triangle(point, target, center, diskAt(center, radius, radiusY, count, i), diskAt(center, radius, radiusY, count, i + 1));\n }\n}\n", "export function circleAt(center, radius, radiusY, count, index, offset = 0) {\r\n const angle = index * Math.PI * 2 / count;\r\n return new L.Point(center.x + Math.max(0, radius + offset) * Math.cos(angle),\r\n center.y + Math.max(0, radiusY + offset) * Math.sin(angle));\r\n}\r\n", "import { triangle } from './nativeTriangle.js';\r\nimport { disk } from './disk.js';\r\n\r\nexport function segment(context, a, b, startCap, endCap) {\r\n const { options, width, stroke, point } = context;\r\n const radius = width / 2;\r\n const length = a.distanceTo(b);\r\n if (!length) return;\r\n const direction = b.subtract(a).divideBy(length);\r\n const normal = new L.Point(-direction.y * radius, direction.x * radius);\r\n if (options.lineCap === 'square') {\r\n if (startCap) a = a.subtract(direction.multiplyBy(radius));\r\n if (endCap) b = b.add(direction.multiplyBy(radius));\r\n }\r\n triangle(point, stroke, a.add(normal), a.subtract(normal), b.add(normal));\r\n triangle(point, stroke, b.add(normal), a.subtract(normal), b.subtract(normal));\r\n if (options.lineCap === 'round') {\r\n if (startCap) disk(point, a, radius, stroke);\r\n if (endCap) disk(point, b, radius, stroke);\r\n }\r\n}\r\n", "import { triangle } from './nativeTriangle.js';\nimport { disk } from './disk.js';\nimport { segment } from './segment.js';\n\nexport function line(context, points, closed) {\n const { options, width, dash, stroke, point } = context;\n if (!options.stroke || width <= 0 || points.length < 2) return;\n const radius = width / 2;\n let distance = Number(options.dashOffset) || 0;\n let period = 0;\n let value, i, a, b, length, previous, previousLength, incoming, outgoing, side, n1, n2, from, to;\n let denominator, miter, offset, phase, index, end, delta;\n for (value of dash) period += value;\n for (i = 0; i < points.length - (closed ? 0 : 1); i++) {\n a = points[i], b = points[(i + 1) % points.length], length = a.distanceTo(b);\n if (!dash.length) {\n segment(context, a, b, !closed && i === 0, !closed && i === points.length - 2);\n if (closed || i > 0) {\n if (options.lineJoin === 'round') disk(point, a, radius, stroke);\n else {\n previous = a.subtract(points[(i + points.length - 1) % points.length]);\n previousLength = Math.hypot(previous.x, previous.y);\n if (previousLength && length) {\n incoming = previous.divideBy(previousLength);\n outgoing = b.subtract(a).divideBy(length);\n side = incoming.x * outgoing.y - incoming.y * outgoing.x > 0 ? -1 : 1;\n n1 = new L.Point(-incoming.y * side, incoming.x * side);\n n2 = new L.Point(-outgoing.y * side, outgoing.x * side);\n from = a.add(n1.multiplyBy(radius)), to = a.add(n2.multiplyBy(radius));\n denominator = 1 + n1.x * n2.x + n1.y * n2.y;\n miter = denominator > 0 ? n1.add(n2).multiplyBy(radius / denominator) : null;\n triangle(point, stroke, from, a, to);\n if (options.lineJoin === 'miter' && miter && Math.hypot(miter.x, miter.y) <= radius * 4) {\n triangle(point, stroke, from, a.add(miter), to);\n }\n }\n }\n }\n } else {\n offset = 0;\n while (offset < length) {\n phase = ((distance + offset) % period + period) % period, index = 0;\n while (phase >= dash[index]) phase -= dash[index++];\n end = Math.min(length, offset + dash[index] - phase);\n if (index % 2 === 0) {\n delta = b.subtract(a).divideBy(length);\n segment(context, a.add(delta.multiplyBy(offset)), a.add(delta.multiplyBy(end)), true, true);\n }\n offset = end;\n }\n }\n distance += length;\n }\n}\n", "import { triangle } from './nativeTriangle.js';\nimport { line } from './line.js';\nimport { triangulate } from '../triangulation/triangulate.js';\n\nexport function polygon(context, rings, closed) {\n const { options, fill, point, map } = context, projected = [];\n let ring, path, latlng, indices;\n for (ring of rings) {\n path = [];\n for (latlng of ring) path.push(map.project(latlng));\n projected.push(path);\n }\n if (closed && options.fill && projected[0]?.length >= 3) {\n const valid = [];\n for (ring of projected) if (ring.length >= 3) valid.push(ring);\n const vertices = valid.flat();\n for (indices of triangulate(valid[0], valid.slice(1))) {\n triangle(point, fill, vertices[indices[0]], vertices[indices[1]], vertices[indices[2]]);\n }\n }\n for (ring of projected) line(context, ring, closed);\n}\n", "import { polygon } from './polygon.js';\n\nexport function visit(context, coordinates, closed) {\n if (!coordinates.length) return;\n let child;\n if (coordinates[0] instanceof L.LatLng) polygon(context, [coordinates], closed);\n else if (closed && coordinates[0][0] instanceof L.LatLng) polygon(context, coordinates, closed);\n else for (child of coordinates) visit(context, child, closed);\n}\n", "import { triangulate } from '../triangulation/triangulate.js';\nimport { disk } from './disk.js';\nimport { circleAt } from './circleAt.js';\nimport { line } from './line.js';\nimport { visit } from './visit.js';\n\n/** Leaflet paths become flat triangles; pixel-sized strokes are rebuilt on zoom. */\nexport function nativeGeometry(source, map, point) {\n const fill = [], stroke = [], options = source.options;\n const width = Number(options.weight) || 0;\n const values = Array.isArray(options.dashArray) ? options.dashArray :\n String(options.dashArray || '').trim().split(/[ ,]+/);\n const dash = [];\n let value, index, i;\n for (value of values) dash.push(Number(value));\n let allZero = true;\n for (value of dash) {\n if (!Number.isFinite(value) || value < 0) throw new Error('Invalid Leaflet dashArray');\n if (value !== 0) allZero = false;\n }\n if (allZero) dash.length = 0;\n if (dash.length % 2) dash.push(...dash);\n const context = { fill, stroke, options, width, dash, point, map };\n if (source instanceof L.CircleMarker) {\n const center = map.project(source.getLatLng());\n let radius = source.getRadius(), radiusY = radius;\n if (source instanceof L.Circle) {\n source._project();\n const projected = source._point.add(map.getPixelOrigin());\n center.x = projected.x;\n center.y = projected.y;\n radius = source._radius;\n radiusY = source._radiusY || radius;\n }\n if (options.fill) disk(point, center, radius, fill, radiusY);\n const count = Math.max(12, Math.min(128, Math.ceil(Math.PI * Math.sqrt(Math.max(radius, radiusY)))));\n if (dash.length) {\n const points = [];\n for (index = 0; index < count; index++) points.push(circleAt(center, radius, radiusY, count, index));\n line(context, points, true);\n }\n else if (options.stroke && width > 0) {\n for (i = 0; i < count; i++) {\n triangle(point, stroke, circleAt(center, radius, radiusY, count, i, width / 2),\n circleAt(center, radius, radiusY, count, i, -width / 2), circleAt(center, radius, radiusY, count, i + 1, width / 2));\n triangle(point, stroke, circleAt(center, radius, radiusY, count, i + 1, width / 2),\n circleAt(center, radius, radiusY, count, i, -width / 2), circleAt(center, radius, radiusY, count, i + 1, -width / 2));\n }\n }\n } else {\n const closed = source instanceof L.Polygon;\n visit(context, source.getLatLngs(), closed);\n }\n return { fill, stroke };\n}\n", "export function sub(a, b) {\n const result = [];\n let i;\n for (i = 0; i < a.length; i++) result.push(a[i] - b[i]);\n return result;\n}\n", "export function dot(a, b) {\n let sum = 0;\n let i;\n for (i = 0; i < a.length; i++) sum += a[i] * b[i];\n return sum;\n}\n", "export function sortHits(hits) {\n const buffer = new Array(hits.length);\n let source = hits, target = buffer;\n let width, start, middle, end, left, right, output, previous, i;\n for (width = 1; width < hits.length; width *= 2) {\n for (start = 0; start < hits.length; start += width * 2) {\n middle = Math.min(start + width, hits.length), end = Math.min(start + width * 2, hits.length);\n left = start, right = middle;\n for (output = start; output < end; output++) {\n if (left < middle && (right >= end || !(source[right].distance < source[left].distance))) {\n target[output] = source[left++];\n } else {\n target[output] = source[right++];\n }\n }\n }\n previous = source;\n source = target;\n target = previous;\n }\n if (source !== hits) for (i = 0; i < hits.length; i++) hits[i] = source[i];\n return hits;\n}\n", "import { computeBounds } from \"../geometry/computeBounds.js\";\nimport { sub } from '../geometry/sub.js';\nimport { cross } from '../geometry/cross.js';\nimport { dot } from '../geometry/dot.js';\nimport { sortHits } from './sortHits.js';\n\n/** Nearest triangle hit per mesh, sorted by world-space distance. */\n\nexport function intersectMeshes(ray, meshes, night = 0) {\n const hits = [],\n a = [0, 0, 0],\n b = [0, 0, 0],\n c = [0, 0, 0];\n let mesh, inverse, inverseValues, value, localOrigin, origin, localDirection, direction;\n let directionLength, near, far, i, a2, b2, position, index, instanceOffset, vertices, closest;\n let faceIndex, vertex, offset, x, y, z, ai, bi, ci, e, f, p, det, t, u, q, v, uv, ids, x2, y2;\n let distance, point, worldPoint;\n for (mesh of meshes) {\n // Test in mesh-local space; compare distances only after returning to shared world space.\n inverse = new DOMMatrix(mesh.worldMatrix).inverse();\n inverseValues = inverse.toFloat64Array();\n for (value of inverseValues) {\n if (!Number.isFinite(value)) throw new Error('Singular 3D transform');\n }\n localOrigin = new DOMPoint(...ray.origin, 1).matrixTransform(inverse);\n origin = [\n localOrigin.x / localOrigin.w,\n localOrigin.y / localOrigin.w,\n localOrigin.z / localOrigin.w\n ];\n localDirection = new DOMPoint(...ray.direction, 0).matrixTransform(inverse);\n direction = [\n localDirection.x,\n localDirection.y,\n localDirection.z\n ];\n directionLength = Math.hypot(...direction) || 1;\n direction[0] /= directionLength;\n direction[1] /= directionLength;\n direction[2] /= directionLength;\n // AABB slab test reuses the same local ray as the triangle test.\n if (!mesh.geometry.bounds) {\n computeBounds(mesh.geometry);\n }\n near = 0, far = Infinity;\n for (i = 0; i < 3; i++) {\n if (Math.abs(direction[i]) < 1e-12) {\n if (origin[i] < mesh.geometry.bounds.min[i] || origin[i] > mesh.geometry.bounds.max[i]) {\n far = -Infinity;\n break;\n }\n } else {\n a2 = (mesh.geometry.bounds.min[i] - origin[i]) / direction[i], b2 = (mesh.geometry.bounds.max[i] - origin[i]) / direction[i];\n near = Math.max(near, Math.min(a2, b2));\n far = Math.min(far, Math.max(a2, b2));\n }\n }\n if (far < near) {\n continue;\n }\n ({ position, index, instanceOffset } = mesh.geometry.attributes);\n vertices = index?.count || position.count;\n closest = Infinity, faceIndex = void 0;\n for (i = 0; i < vertices * (instanceOffset?.count ?? 1); i += 3) {\n vertex = instanceOffset ? i % vertices : i;\n offset = instanceOffset ? Math.floor(i / vertices) * instanceOffset.size : 0;\n x = instanceOffset?.data[offset] ?? 0;\n y = instanceOffset?.data[offset + 1] ?? 0;\n z = instanceOffset?.data[offset + 2] ?? 0;\n ai = (index ? index.data[vertex] : vertex) * position.size;\n bi = (index ? index.data[vertex + 1] : vertex + 1) * position.size;\n ci = (index ? index.data[vertex + 2] : vertex + 2) * position.size;\n a[0] = position.data[ai];\n a[1] = position.data[ai + 1];\n a[2] = position.data[ai + 2];\n b[0] = position.data[bi];\n b[1] = position.data[bi + 1];\n b[2] = position.data[bi + 2];\n c[0] = position.data[ci];\n c[1] = position.data[ci + 1];\n c[2] = position.data[ci + 2];\n if (instanceOffset) {\n a[0] = Math.fround(a[0] + x); a[1] = Math.fround(a[1] + y); a[2] = Math.fround(a[2] + z);\n b[0] = Math.fround(b[0] + x); b[1] = Math.fround(b[1] + y); b[2] = Math.fround(b[2] + z);\n c[0] = Math.fround(c[0] + x); c[1] = Math.fround(c[1] + y); c[2] = Math.fround(c[2] + z);\n }\n // Moller-Trumbore: barycentric triangle coordinates and local ray distance.\n e = sub(b, a), f = sub(c, a), p = cross(direction, f), det = dot(e, p);\n if (mesh.program.cullMode === 'none' || mesh.program.cullFace === null\n ? Math.abs(det) < 1e-9 : det < 1e-9) {\n continue;\n }\n t = sub(origin, a), u = dot(t, p) / det;\n if (u < 0 || u > 1) {\n continue;\n }\n q = cross(t, e), v = dot(direction, q) / det;\n if (v < 0 || u + v > 1) {\n continue;\n }\n if (mesh.program.nightLight) {\n uv = mesh.geometry.attributes.uv.data;\n ids = index ? [index.data[i], index.data[i + 1], index.data[i + 2]] : [i, i + 1, i + 2];\n x2 = uv[ids[0] * 2] * (1 - u - v) + uv[ids[1] * 2] * u + uv[ids[2] * 2] * v;\n y2 = uv[ids[0] * 2 + 1] * (1 - u - v) + uv[ids[1] * 2 + 1] * u + uv[ids[2] * 2 + 1] * v;\n if (x2 <= 2 && (!night || x2 * x2 + y2 * y2 > 0.9)) continue;\n }\n distance = dot(f, q) / det;\n if (distance > 0 && distance < closest) {\n closest = distance; faceIndex = i / 3;\n }\n }\n if (faceIndex === undefined) continue;\n point = new DOMPoint(\n direction[0] * closest + origin[0],\n direction[1] * closest + origin[1],\n direction[2] * closest + origin[2],\n 1\n ).matrixTransform(new DOMMatrix(mesh.worldMatrix));\n worldPoint = [point.x / point.w, point.y / point.w, point.z / point.w];\n hits.push({\n faceIndex,\n object: mesh,\n point: worldPoint,\n distance: Math.hypot(\n worldPoint[0] - ray.origin[0],\n worldPoint[1] - ray.origin[1],\n worldPoint[2] - ray.origin[2]\n )\n });\n }\n return sortHits(hits);\n}\n", "/** Depth-first walk; a truthy callback result skips that node's descendants. */\n\nexport function traverse(node, callback, context) {\n if (callback(node, context)) return;\n let child;\n for (child of node.children) traverse(child, callback, context);\n}\n", "export function collectVisibleMesh(mesh, meshes) {\n if (!mesh.visible) return true;\n if (mesh.geometry && mesh._appearance !== 0) meshes.push(mesh);\n}\n", "import { intersectMeshes } from '../collision/intersectMeshes.js';\nimport { traverse } from '../scene/traverse.js';\nimport { updateCamera } from '../scene/updateCamera.js';\nimport { updateWorldMatrix } from '../scene/updateWorldMatrix.js';\nimport { collectVisibleMesh } from './collectVisibleMesh.js';\n\n/** Raycasting, hover/click highlight and tooltips. */\n/**\n * Finds the objects under a mouse or pointer event, nearest first.\n *\n * @param {MouseEvent} event\n * @param {Object[]} [objects] Defaults to this layer's root children, not all map layers.\n * @param {boolean} [recursive] Also test the descendants of `objects`.\n * @returns {Object[]} Nearest hit per mesh: object, shared-world point/distance and triangle faceIndex.\n */\n\nexport function raycast(backend, event, objects = backend.root.children, recursive = true) {\n if (!backend.renderer) {\n return [];\n }\n backend._beforeRaycast?.();\n const rect = backend._map.getContainer().getBoundingClientRect();\n updateWorldMatrix(backend.scene);\n updateCamera(backend.camera);\n // Unproject the mouse (-1..1) into a world-space ray from the camera.\n const inverseCamera = new DOMMatrix(backend.camera.projectionViewMatrix).inverse();\n const inverseCameraValues = inverseCamera.toFloat64Array();\n let value, object;\n for (value of inverseCameraValues) {\n if (!Number.isFinite(value)) throw new Error('Singular 3D transform');\n }\n backend.raycaster.origin[0] = backend.camera.position[0];\n backend.raycaster.origin[1] = backend.camera.position[1];\n backend.raycaster.origin[2] = backend.camera.position[2];\n const unprojected = new DOMPoint(\n ((event.clientX - rect.left) / rect.width) * 2 - 1,\n -((event.clientY - rect.top) / rect.height) * 2 + 1,\n 0,\n 1\n ).matrixTransform(inverseCamera);\n const end = [\n unprojected.x / unprojected.w,\n unprojected.y / unprojected.w,\n unprojected.z / unprojected.w\n ];\n backend.raycaster.direction[0] = end[0] - backend.raycaster.origin[0];\n backend.raycaster.direction[1] = end[1] - backend.raycaster.origin[1];\n backend.raycaster.direction[2] = end[2] - backend.raycaster.origin[2];\n const rayLength = Math.hypot(...backend.raycaster.direction) || 1;\n backend.raycaster.direction[0] /= rayLength;\n backend.raycaster.direction[1] /= rayLength;\n backend.raycaster.direction[2] /= rayLength;\n const meshes = [];\n for (object of objects) {\n if (recursive) traverse(object, collectVisibleMesh, meshes);\n else if (object.geometry && object.visible && object._appearance !== 0) meshes.push(object);\n }\n return intersectMeshes(backend.raycaster, meshes, backend.renderer.uniformData?.[55]);\n}\n", "export const nativeEventMaps = new WeakMap();\n", "export function restoreNativeEvents() {\r\n const { map, descriptor, handle } = this;\r\n if (map._fireDOMEvent !== handle) return;\r\n if (descriptor) Object.defineProperty(map, '_fireDOMEvent', descriptor);\r\n else delete map._fireDOMEvent;\r\n}\n", "export function compareNativeHits(a, b) {\r\n return b.object.renderOrder - a.object.renderOrder || a.distance - b.distance;\r\n}\n", "import { nativeEventMaps } from '../constants/nativeEventMaps.js';\nimport { cityMapper } from '../constants/cityMapper.js';\nimport { raycast } from '../picking/raycast.js';\nimport { compareNativeHits } from './compareNativeHits.js';\n\nexport function handleNativeMapEvent(event, type = event.type, targets) {\n const map = this, context = nativeEventMaps.get(map), fireDOMEvent = context.fireDOMEvent;\n const owner = cityMapper.renderers.get(map);\n if (!owner?.renderer || targets || !['click', 'preclick', 'dblclick', 'contextmenu',\n 'mousedown', 'mouseup', 'mousemove', 'mouseover', 'mouseout',\n 'pointerdown', 'pointerup', 'pointermove', 'pointerover', 'pointerout'].includes(type)) {\n return fireDOMEvent.call(this, event, type, targets);\n }\n const target = event.target;\n const dom = target instanceof Element &&\n target.closest('.leaflet-marker-icon,.leaflet-popup,.leaflet-tooltip,.leaflet-control');\n if (dom && context.hovered && (type === context.move || type === context.out)) {\n fireDOMEvent.call(map, event, context.out, [context.hovered]);\n context.hovered = null;\n map.getContainer().style.cursor = '';\n }\n if (dom || type === context.move && (map.dragging?.moving() || map._animatingZoom)) {\n return fireDOMEvent.call(this, event, type, targets);\n }\n const hits = [];\n let candidate, source2, backend;\n if (type !== context.out) {\n for (candidate of context.states) {\n ({ source: source2, backend } = candidate);\n if (source2 instanceof L.Marker || source2.options.interactive === false ||\n !(source2 instanceof L.Path) && !source2.options.interactive) continue;\n hits.push(...raycast(backend, event, candidate.meshes.values(), false));\n }\n }\n hits.sort(compareNativeHits);\n let source = hits[0]?.object._nativeSource || null;\n if ((type === 'click' || type === 'preclick') && source && map._draggableMoved(source)) source = null;\n if (type === context.move || type === context.out) {\n if (context.hovered !== source) {\n if (context.hovered) fireDOMEvent.call(map, event, context.out, [context.hovered]);\n context.hovered = source;\n if (source) fireDOMEvent.call(map, event, context.over, [source]);\n map.getContainer().style.cursor = source ? 'pointer' : '';\n }\n }\n return fireDOMEvent.call(this, event, type, source ? [source] : undefined);\n}\n", "import { cityMapper } from '../constants/cityMapper.js';\nimport { raycast } from '../picking/raycast.js';\nimport { nativeEventMaps } from '../constants/nativeEventMaps.js';\nimport { restoreNativeEvents } from './restoreNativeEvents.js';\nimport { handleNativeMapEvent } from './handleNativeMapEvent.js';\n\n/** One GPU hit test per map event, rather than one invisible SVG path per feature. */\nexport function nativeEvents(state) {\n const { map } = state;\n let context = nativeEventMaps.get(map);\n if (!context) {\n context = { map, states: new Set(), hovered: null };\n const pointer = L.version.startsWith('2');\n context.move = pointer ? 'pointermove' : 'mousemove';\n context.out = pointer ? 'pointerout' : 'mouseout';\n context.over = pointer ? 'pointerover' : 'mouseover';\n context.descriptor = Object.getOwnPropertyDescriptor(map, '_fireDOMEvent');\n context.fireDOMEvent = map._fireDOMEvent;\n context.handle = handleNativeMapEvent;\n context.restore = restoreNativeEvents;\n nativeEventMaps.set(map, context);\n map._fireDOMEvent = handleNativeMapEvent;\n }\n context.states.add(state);\n state._nativeEventContext = context;\n}\n", "import { nativeEventMaps } from '../constants/nativeEventMaps.js';\n\nexport function removeNativeEvents(state) {\r\n const context = state._nativeEventContext;\r\n if (!context) return;\r\n const { map } = context;\r\n context.states.delete(state);\r\n if (context.hovered === state.source) {\r\n context.hovered = null;\r\n map.getContainer().style.cursor = '';\r\n }\r\n state._nativeEventContext = null;\r\n if (context.states.size) return;\r\n context.restore();\r\n nativeEventMaps.delete(map);\r\n}\n", "export function toSRGB(value) {\n return value <= 0.0031308 ? value * 12.92 : 1.055 * value ** (1 / 2.4) - 0.055;\n}\n", "export function channel(n, h, l, a) {\n const k = (n + h * 12) % 12;\n return l - a * Math.max(-1, Math.min(k - 3, 9 - k, 1));\n}\n", "import { toSRGB } from \"./toSRGB.js\";\nimport { channel } from \"./channel.js\";\n\n/**\n * HSL inputs are linear-space to preserve the original building styling.\n * Numeric/CSS/RGB inputs are already sRGB; CSS alpha is not used for extrusion.\n * @param {number|string|Object} value 0xRRGGBB, CSS color, {r,g,b}, or {h,s,l} in 0..1.\n * @returns {Object} sRGB {r,g,b} components in 0..1.\n */\n\nexport function parseColor(value) {\n if (value && typeof value === 'object' && 'h' in value) {\n const a = value.s * Math.min(value.l, 1 - value.l);\n return {\n r: toSRGB(channel(0, value.h, value.l, a)),\n g: toSRGB(channel(8, value.h, value.l, a)),\n b: toSRGB(channel(4, value.h, value.l, a))\n };\n }\n if (value && typeof value === 'object' && 'r' in value) {\n return value;\n }\n if (typeof value === 'number') {\n return {\n r: (value >> 16 & 255) / 255,\n g: (value >> 8 & 255) / 255,\n b: (value & 255) / 255,\n };\n }\n if (typeof value !== 'string' || !CSS.supports('color', value)) {\n throw new Error('Invalid 3D color');\n }\n const context = document.createElement('canvas').getContext('2d');\n context.fillStyle = value;\n context.fillRect(0, 0, 1, 1);\n const [r, g, b] = context.getImageData(0, 0, 1, 1).data;\n return {\n r: r / 255,\n g: g / 255,\n b: b / 255\n };\n}\n", "export function current(state) {\r\n return state.source._nativeGPU === state && state.map.hasLayer(state.source);\r\n}\n", "import { refreshNativeLayer } from './refreshNativeLayer.js';\n\nexport function refreshNativeEvent() {\r\n refreshNativeLayer(this);\r\n}\n", "import { refreshNativeLayer } from './refreshNativeLayer.js';\n\nexport function reorderNativeLayer(front) {\r\n this.order = front ? ++this.map._nativeGPUOrder : --this.map._nativeGPUBack;\r\n refreshNativeLayer(this);\r\n}\n", "import { update } from '../scene/update.js';\n\nexport function updateNativeLayerView() {\r\n this.viewDirty = true;\r\n if (this.backend._shared) update(this.backend);\r\n}\n", "import { refreshNativeEvent } from './refreshNativeEvent.js';\nimport { updateNativeLayerView } from './updateNativeLayerView.js';\nimport { removeNativeEvents } from './removeNativeEvents.js';\nimport { disposeMesh } from '../rendering/disposeMesh.js';\nimport { destroyTexture } from '../rendering/destroyTexture.js';\nimport { nativeImageRefresh } from './nativeImageRefresh.js';\nimport { nativeImageError } from './nativeImageError.js';\nimport { removeImageState } from './removeImageState.js';\n\nexport function disposeNativeLayer() {\n const state = this;\n const { source, map, backend, meshes, textures, images } = state;\n const events = 'load tileload tileunload move drag';\n source.off(events, refreshNativeEvent, state);\n map.off('zoomend', refreshNativeEvent, state);\n if (state.marker) map.off('move zoom rotate pitch resize viewreset', updateNativeLayerView, state);\n removeNativeEvents(state);\n state.refresh = state.reorder = null;\n let name, methods, mesh, texture, image;\n for ([name, methods] of state.methods) {\n if (methods.own) Object.defineProperty(source, name, methods.own);\n else delete source[name];\n }\n for (mesh of meshes.values()) disposeMesh(backend, mesh);\n meshes.clear();\n for (texture of textures.values()) destroyTexture(backend, texture.texture);\n textures.clear();\n for (image of images) {\n image.removeEventListener('load', nativeImageRefresh);\n image.removeEventListener('error', nativeImageError);\n removeImageState(image, state);\n }\n backend._beforeRender = null;\n backend.remove();\n}\n", "export function resolveNativeReady() {\r\n this.ready.resolve();\r\n}\n", "export function rejectNativeReady({ error }) {\r\n this.ready.reject(error);\r\n}\n", "export function forwardNativeError({ error }) {\r\n this.source.fire('error', { error });\r\n}\n", "export function styleNativeMesh(state, mesh, color, opacity) {\r\n const { source, marker, paneOrder, order } = state;\r\n mesh.program.uniforms.baseColor.value = color;\r\n mesh.program.uniforms.opacity.value = opacity;\r\n if (source instanceof L.GridLayer) mesh.opacity = opacity;\r\n const zIndex = marker ? source._zIndex + (source._cameraZIndexOffset || 0) : source.options.zIndex;\r\n mesh.renderOrder = paneOrder * 1e6 + (zIndex || 0) * 1000 + order;\r\n mesh._nativeSource = source;\r\n mesh._nativeUsed = true;\r\n}\n", "import { current } from './current.js';\nimport { refreshNativeLayer } from './refreshNativeLayer.js';\n\nexport async function uploadCanvasTexture(state, key, texture, image, device, width, height) {\r\n let bitmap;\r\n try {\r\n bitmap = await createImageBitmap(image);\r\n if (!current(state) || state.textures.get(key) !== texture) return;\r\n device.queue.copyExternalImageToTexture({ source: bitmap }, { texture: texture.texture }, [width, height]);\r\n texture.uploaded = image;\r\n texture.pending = false;\r\n refreshNativeLayer(state);\r\n } catch (error) {\r\n state.failed = true;\r\n state.source.fire('error', { error });\r\n } finally {\r\n bitmap?.close();\r\n }\r\n}\n", "import { disposeMesh } from '../rendering/disposeMesh.js';\nimport { destroyTexture } from '../rendering/destroyTexture.js';\nimport { uploadCanvasTexture } from './uploadCanvasTexture.js';\n\nexport function textureFor(state, key, image) {\r\n if (!(image instanceof HTMLImageElement) && !(image instanceof HTMLCanvasElement)) {\r\n throw new Error('WebGPU native raster layers require image or canvas tiles');\r\n }\r\n const { backend, textures, meshes } = state;\r\n let texture = textures.get(key);\r\n const url = image.currentSrc || image.src;\r\n if (!texture || texture.image !== image || texture.url !== url) {\r\n if (texture) {\r\n const mesh = meshes.get(key);\r\n if (mesh) disposeMesh(backend, mesh);\r\n meshes.delete(key);\r\n destroyTexture(backend, texture.texture);\r\n textures.delete(key);\r\n }\r\n const width = image.naturalWidth || image.width, height = image.naturalHeight || image.height;\r\n if (!width || !height) return;\r\n const { device } = backend.renderer;\r\n texture = {\r\n device, image, url, format: 'rgba8unorm', uploaded: null,\r\n texture: device.createTexture({\r\n size: [width, height], format: 'rgba8unorm',\r\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,\r\n }),\r\n sampler: device.createSampler({ minFilter: 'linear', magFilter: 'linear' }),\r\n };\r\n textures.set(key, texture);\r\n if (image instanceof HTMLCanvasElement) {\r\n texture.pending = true;\r\n uploadCanvasTexture(state, key, texture, image, device, width, height);\r\n } else {\r\n try {\r\n device.queue.copyExternalImageToTexture({ source: image }, { texture: texture.texture }, [width, height]);\r\n } catch (error) {\r\n texture.texture.destroy();\r\n textures.delete(key);\r\n throw error;\r\n }\r\n texture.uploaded = image;\r\n }\r\n }\r\n texture.used = true;\r\n return texture.uploaded === image ? texture : undefined;\r\n}\n", "import { disposeMesh } from '../rendering/disposeMesh.js';\nimport { createMesh } from '../rendering/createMesh.js';\nimport { styleNativeMesh } from './styleNativeMesh.js';\n\nexport function putNativeMesh(state, key, position, color, opacity, texture, uv) {\n const { backend, source, meshes } = state;\n if (!position.length) return;\n let mesh = meshes.get(key);\n const normal = [];\n let index;\n for (index = 0; index < position.length; index++) normal.push(index % 3 === 1 ? 1 : 0);\n const data = { position, normal, ...(uv ? { uv } : {}) };\n if (!mesh || mesh.geometry.attributes.position.data.length !== position.length ||\n mesh.program.uniforms.baseTexture?.value !== texture) {\n if (mesh) disposeMesh(backend, mesh);\n mesh = createMesh(backend, data, {\n vertexColors: false, color, opacity, unlit: true, alphaMode: 'BLEND',\n ...(texture ? { baseTexture: texture } : {}),\n }, 0, source instanceof L.GridLayer ? state.rasterProgram : undefined);\n if (source instanceof L.GridLayer) {\n state.rasterProgram ||= mesh.program;\n mesh.texture = texture;\n }\n meshes.set(key, mesh);\n } else {\n const attribute = mesh.geometry.attributes.position;\n attribute.data.set(position);\n attribute.needsUpdate = true;\n mesh.geometry.bounds = null;\n }\n styleNativeMesh(state, mesh, color, opacity);\n return mesh;\n}\n", "import { textureFor } from './textureFor.js';\nimport { putNativeMesh } from './putNativeMesh.js';\n\nexport function quadNativeMesh(state, key, image, corners, opacity) {\n const texture = textureFor(state, key, image);\n if (!texture) return;\n const indices = [0, 2, 1, 1, 2, 3];\n const position = [], uv = [], textureCoords = [[0, 0], [1, 0], [0, 1], [1, 1]];\n let index;\n for (index of indices) {\n position.push(...corners[index]);\n uv.push(...textureCoords[index]);\n }\n return putNativeMesh(state, key, position, [1, 1, 1], opacity, texture, uv);\n}\n", "export function localPosition(state, latlng) {\r\n const { map, backend } = state, crs = map.options.crs;\r\n const origin = crs.project(backend.location), point = crs.project(latlng);\r\n const metres = Math.cos(backend.location.lat * Math.PI / 180);\r\n return [(point.x - origin.x) * metres, 0, -(point.y - origin.y) * metres];\r\n}\n", "import { localPosition } from './localPosition.js';\n\nexport function boundsQuad(state, bounds) {\n const corners = [\n bounds.getNorthWest(), bounds.getNorthEast(), bounds.getSouthWest(), bounds.getSouthEast(),\n ];\n const positions = [];\n let corner;\n for (corner of corners) positions.push(localPosition(state, corner));\n return positions;\n}\n", "import { styleNativeMesh } from './styleNativeMesh.js';\nimport { quadNativeMesh } from './quadNativeMesh.js';\nimport { boundsQuad } from './boundsQuad.js';\n\nexport function syncGridLayer(state) {\n const { source, textures, meshes } = state;\n let key, tile, opacity, retained, mesh, nw, se;\n for ([key, tile] of Object.entries(source._tiles || {})) {\n if (!tile.loaded || tile.el instanceof HTMLImageElement && !tile.el.naturalWidth) continue;\n opacity = (source.options.opacity ?? 1) * (tile._gpuOpacity ?? 1);\n retained = textures.get(key);\n mesh = meshes.get(key);\n if (mesh && retained?.image === tile.el && retained.url === (tile.el.currentSrc || tile.el.src)) {\n retained.used = true;\n styleNativeMesh(state, mesh, [1, 1, 1], opacity);\n } else {\n [nw, se] = source._tileCoordsToNwSe(tile.coords);\n mesh = quadNativeMesh(state, key, tile.el, boundsQuad(state, new L.LatLngBounds(nw, se)), opacity);\n }\n if (mesh) mesh.renderOrder += tile.coords.z / 100;\n }\n}\n", "import { quadNativeMesh } from './quadNativeMesh.js';\nimport { boundsQuad } from './boundsQuad.js';\n\nexport function syncImageOverlay(state) {\r\n const { source } = state;\r\n if (source._image?.complete && source._image.naturalWidth) {\r\n quadNativeMesh(state, 'image', source._image, boundsQuad(state, source.getBounds()), source.options.opacity ?? 1);\r\n }\r\n}\n", "import { localPosition } from './localPosition.js';\n\nexport function markerQuadCorners(state, key, image) {\n const { source, map, backend } = state;\n const world = new DOMPoint(...localPosition(state, source.getLatLng()), 1)\n .matrixTransform(new DOMMatrix(backend.root.worldMatrix));\n const clip = world.matrixTransform(new DOMMatrix(backend.camera.projectionViewMatrix));\n const inverse = new DOMMatrix(backend.camera.projectionViewMatrix).inverse();\n const toLocal = new DOMMatrix(backend.root.worldMatrix).inverse();\n const options = source.options.icon.options, size = map.getSize();\n const dimensions = options[key === 'shadow' ? 'shadowSize' : 'iconSize'] ||\n [image.naturalWidth, image.naturalHeight];\n const width = dimensions.x ?? dimensions[0], height = dimensions.y ?? dimensions[1];\n const anchor = (key === 'shadow' && options.shadowAnchor) ||\n options.iconAnchor || [Math.floor(width / 2), Math.floor(height / 2)];\n const center = new L.Point((clip.x / clip.w + 1) * size.x / 2, (1 - clip.y / clip.w) * size.y / 2);\n const left = center.x - (anchor.x ?? anchor[0]), top = center.y - (anchor.y ?? anchor[1]);\n const screenCorners = [[left, top], [left + width, top],\n [left, top + height], [left + width, top + height]];\n const corners = [];\n let pointX, pointY, offset, x, y, p, result;\n for ([pointX, pointY] of screenCorners) {\n offset = source._cameraIconPoint(pointX - center.x, pointY - center.y);\n x = center.x + offset.x, y = center.y + offset.y;\n p = new DOMPoint(x / size.x * 2 - 1,\n 1 - y / size.y * 2, clip.z / clip.w, 1).matrixTransform(inverse);\n result = new DOMPoint(p.x / p.w, p.y / p.w, p.z / p.w, 1).matrixTransform(toLocal);\n corners.push([result.x, result.y, result.z]);\n }\n return corners;\n}\n", "import { quadNativeMesh } from './quadNativeMesh.js';\nimport { markerQuadCorners } from './markerQuadCorners.js';\n\nexport function syncMarker(state) {\n const { source } = state;\n let key, image, mesh;\n for ([key, image] of [['shadow', source._shadow], ['icon', source._icon]]) {\n if (!(image instanceof HTMLImageElement) || !image.complete || !image.naturalWidth) continue;\n mesh = quadNativeMesh(state, key, image, markerQuadCorners(state, key, image), source.options.opacity ?? 1);\n if (key === 'shadow' && mesh) mesh.renderOrder -= 100 * 1e6;\n }\n}\n", "import { localPosition } from './localPosition.js';\n\nexport function localPixel(state, point) {\r\n return localPosition(state, state.map.unproject(point));\r\n}\n", "import { localPixel } from './localPixel.js';\nimport { nativeLayerState } from '../constants/nativeLayerState.js';\n\nexport function localPixelForGeometry(point) {\r\n return localPixel(nativeLayerState.geometryPixelStates[nativeLayerState.geometryPixelStates.length - 1], point);\r\n}\n", "import { nativeLayerState } from '../constants/nativeLayerState.js';\nimport { nativeGeometry } from '../geometry/nativeGeometry.js';\nimport { localPixelForGeometry } from './localPixelForGeometry.js';\nimport { parseColor } from '../utils/parseColor.js';\nimport { putNativeMesh } from './putNativeMesh.js';\n\nexport function syncVectorLayer(state) {\n const { source } = state;\n nativeLayerState.geometryPixelStates.push(state);\n let geometry;\n try {\n geometry = nativeGeometry(source, state.map, localPixelForGeometry);\n } finally {\n nativeLayerState.geometryPixelStates.pop();\n }\n const { fill, stroke } = geometry;\n let key, positions, color, opacity, r, g, b;\n for ([key, positions, color, opacity] of [\n ['fill', fill, source.options.fillColor || source.options.color, source.options.fillOpacity],\n ['stroke', stroke, source.options.color, source.options.opacity],\n ]) {\n if (!positions.length) continue;\n ({ r, g, b } = parseColor(color));\n putNativeMesh(state, key, positions, [r, g, b], opacity ?? 1);\n }\n}\n", "import { current } from './current.js';\nimport { syncGridLayer } from './syncGridLayer.js';\nimport { syncImageOverlay } from './syncImageOverlay.js';\nimport { syncMarker } from './syncMarker.js';\nimport { syncVectorLayer } from './syncVectorLayer.js';\nimport { disposeMesh } from '../rendering/disposeMesh.js';\nimport { destroyTexture } from '../rendering/destroyTexture.js';\n\nexport function synchronizeNativeLayer(state) {\n const { source, meshes, textures } = state;\n if (!current(state) || !state.backend.renderer || state.failed) return;\n if (!state.dirty && (!state.marker || !state.viewDirty)) return;\n state.dirty = false;\n state.viewDirty = false;\n let mesh, texture, key;\n for (mesh of meshes.values()) mesh._nativeUsed = false;\n for (texture of textures.values()) texture.used = false;\n if (source instanceof L.GridLayer) syncGridLayer(state);\n else if (source instanceof L.ImageOverlay) syncImageOverlay(state);\n else if (state.marker) syncMarker(state);\n else syncVectorLayer(state);\n for ([key, mesh] of meshes) {\n if (mesh._nativeUsed) continue;\n disposeMesh(state.backend, mesh);\n meshes.delete(key);\n texture = textures.get(key);\n if (texture) destroyTexture(state.backend, texture.texture);\n textures.delete(key);\n }\n for ([key, texture] of textures) {\n if (texture.used) continue;\n destroyTexture(state.backend, texture.texture);\n textures.delete(key);\n }\n}\n", "import { synchronizeNativeLayer } from './synchronizeNativeLayer.js';\r\n\r\nexport function beforeNativeRender(state) {\r\n try {\r\n synchronizeNativeLayer(state);\r\n } catch (error) {\r\n state.failed = true;\r\n state.source.fire('error', { error });\r\n }\r\n}\r\n", "import { nativeMethodHandlers } from '../constants/nativeMethodHandlers.js';\nimport { createMesh } from '../rendering/createMesh.js';\nimport { destroyTexture } from '../rendering/destroyTexture.js';\nimport { disposeMesh } from '../rendering/disposeMesh.js';\nimport { nativeGeometry } from '../geometry/nativeGeometry.js';\nimport { nativeEvents } from './nativeEvents.js';\nimport { removeNativeEvents } from './removeNativeEvents.js';\nimport { parseColor } from '../utils/parseColor.js';\nimport { update } from '../scene/update.js';\nimport { nativeLayerState } from '../constants/nativeLayerState.js';\nimport { current } from './current.js';\nimport { refreshNativeLayer } from './refreshNativeLayer.js';\nimport { refreshNativeEvent } from './refreshNativeEvent.js';\nimport { reorderNativeLayer } from './reorderNativeLayer.js';\nimport { nativeSetLatLng } from './nativeSetLatLng.js';\nimport { nativeSetLatLngs } from './nativeSetLatLngs.js';\nimport { nativeAddLatLng } from './nativeAddLatLng.js';\nimport { nativeSetRadius } from './nativeSetRadius.js';\nimport { nativeSetStyle } from './nativeSetStyle.js';\nimport { nativeRedraw } from './nativeRedraw.js';\nimport { nativeSetIcon } from './nativeSetIcon.js';\nimport { nativeSetUrl } from './nativeSetUrl.js';\nimport { nativeSetBounds } from './nativeSetBounds.js';\nimport { nativeSetOpacity } from './nativeSetOpacity.js';\nimport { nativeSetZIndex } from './nativeSetZIndex.js';\nimport { nativeSetZIndexOffset } from './nativeSetZIndexOffset.js';\nimport { nativeBringToFront } from './nativeBringToFront.js';\nimport { nativeBringToBack } from './nativeBringToBack.js';\nimport { disposeNativeLayer } from './disposeNativeLayer.js';\nimport { resolveNativeReady } from './resolveNativeReady.js';\nimport { rejectNativeReady } from './rejectNativeReady.js';\nimport { forwardNativeError } from './forwardNativeError.js';\nimport { updateNativeLayerView } from './updateNativeLayerView.js';\nimport { synchronizeNativeLayer } from './synchronizeNativeLayer.js';\nimport { beforeNativeRender } from './beforeNativeRender.js';\n\nnativeLayerState.imageStates = new WeakMap();\nnativeLayerState.geometryPixelStates = [];\n\n/** Render from coordinates and detached raster sources; only accessible marker controls remain DOM. */\nexport async function nativeLayer(state) {\n const { source, map } = state;\n const backend = state.backend = new L.Layer({ source: { type: '3d' } });\n state.meshes = new Map();\n state.textures = new Map();\n state.methods = new Map();\n state.originalMethods = new Map();\n state.images = new Set();\n map._nativeGPUOrder ||= 0;\n map._nativeGPUBack ||= 0;\n state.dirty = true;\n state.viewDirty = true;\n state.failed = false;\n state.order = ++map._nativeGPUOrder;\n state.marker = source instanceof L.Marker;\n state.paneOrder = Number(getComputedStyle(source.getPane()).zIndex) || 0;\n state.refresh = refreshNativeLayer;\n state.reorder = reorderNativeLayer;\n state.dispose = disposeNativeLayer;\n const currentEvents = 'load tileload tileunload move drag';\n source.on(currentEvents, refreshNativeEvent, state);\n map.on('zoomend', refreshNativeEvent, state);\n if (state.marker) map.on('move zoom rotate pitch resize viewreset', updateNativeLayerView, state);\n nativeEvents(state);\n let name, own, original;\n for (name of ['setLatLng', 'setLatLngs', 'addLatLng', 'setRadius', 'setStyle', 'redraw',\n 'setIcon', 'setUrl', 'setBounds', 'setOpacity', 'setZIndex', 'setZIndexOffset', 'bringToFront', 'bringToBack']) {\n if (typeof source[name] !== 'function') continue;\n own = Object.getOwnPropertyDescriptor(source, name), original = source[name];\n state.methods.set(name, { own, original });\n state.originalMethods.set(name, original);\n source[name] = nativeMethodHandlers[name];\n }\n const ready = state.ready = Promise.withResolvers();\n backend.once('ready', resolveNativeReady, state);\n backend.once('error', rejectNativeReady, state);\n backend.on('error', forwardNativeError, state);\n refreshNativeLayer(state);\n backend.addTo(map);\n try {\n await ready.promise;\n } catch (error) {\n disposeNativeLayer.call(state);\n throw error;\n }\n if (!current(state)) return source;\n\n backend._beforeRender = beforeNativeRender.bind(null, state);\n try {\n synchronizeNativeLayer(state);\n } catch (error) {\n disposeNativeLayer.call(state);\n throw error;\n }\n update(state.backend);\n return source;\n}\n", "export function hideTargets(state) {\n const { source } = state;\n const htmlIcon = source instanceof L.Marker && source.options.icon instanceof L.DivIcon;\n const targets = [htmlIcon ? null : source._icon, htmlIcon ? null : source._shadow];\n let element;\n for (element of state.hidden) {\n if (targets.includes(element)) continue;\n element.classList.remove('leaflet-webgpu-target');\n state.hidden.delete(element);\n }\n for (element of targets) {\n if (!element || state.hidden.has(element)) continue;\n element.classList.add('leaflet-webgpu-target');\n state.hidden.add(element);\n }\n}\n", "export function removeTargets(state) {\n if (state.source._nativeGPU === state) state.source._nativeGPU = null;\n state.dispose?.();\n let element;\n for (element of state.hidden) {\n element.classList.remove('leaflet-webgpu-target');\n }\n}\n", "import { nativeLayer } from './nativeLayer.js';\n\nexport function readyNativeGPU(state) {\r\n if (state.source._nativeGPU !== state) return state.source;\r\n return nativeLayer(state);\r\n}\n", "export function reportError(source, error) {\r\n source.fire('error', { error });\r\n}\n", "import { nativeLayer } from './nativeLayer.js';\nimport { hideTargets } from './hideTargets.js';\nimport { removeTargets } from './removeTargets.js';\nimport { readyNativeGPU } from './readyNativeGPU.js';\nimport { reportError } from '../scene/reportError.js';\n\nexport function initNativeGPU(source, map) {\n if (source._nativeGPU) return;\n if (!document.getElementById('leaflet-webgpu-targets')) {\n const style = document.createElement('style');\n style.id = 'leaflet-webgpu-targets';\n style.textContent = '.leaflet-webgpu-target{opacity:0!important}';\n document.head.append(style);\n }\n const state = source._nativeGPU = { source, map, hidden: new Set() };\n state.hide = hideTargets.bind(null, state);\n state.hide();\n source.once('remove', removeTargets.bind(null, state));\n source.ready = Promise.resolve().then(readyNativeGPU.bind(null, state));\n source.ready.catch(reportError.bind(null, source));\n}\n", "export const mapCameraState = {};\n", "export function mapGetBearing() { return this._cameraBearing ?? 0; }\n", "export function mapGetPitch() { return this._cameraPitch ?? 0; }\n", "import { mapCameraState } from '../constants/mapCameraState.js';\n\nexport function cancelCameraAnimation(map) {\r\n mapCameraState.cameraAnimations.delete(map);\r\n map._cameraAnimation = null;\r\n map._cameraFrame = null;\r\n if (!mapCameraState.cameraAnimations.size && mapCameraState.cameraAnimationFrame !== null) {\r\n cancelAnimationFrame(mapCameraState.cameraAnimationFrame);\r\n mapCameraState.cameraAnimationFrame = null;\r\n }\r\n}\n", "import { cancelCameraAnimation } from './cancelCameraAnimation.js';\n\nexport function mapStopPitchBearingAnimation() {\n cancelCameraAnimation(this);\r\n return this;\n}\n", "import { mapCameraState } from '../constants/mapCameraState.js';\n\nexport function updateSky() {\r\n const height = this.getSize().y, pitch = this.getPitch() * mapCameraState.radians;\r\n const far = height * this.options.pitchMaxDistance, distance = height * 1.5;\r\n const top = height / 2 - far * Math.cos(pitch) * distance / (distance + Math.sin(pitch) * far);\r\n if (top > 0 && !this._pitchSky) {\r\n this._pitchSky = L.DomUtil.create('div', 'leaflet-pitch-sky', this.getContainer());\r\n this._pitchSky.setAttribute('aria-hidden', 'true');\r\n this._pitchSky.style.cssText = 'position:absolute;inset:0 0 auto;height:0;z-index:0;pointer-events:none;background:var(--leaflet-sky-background,linear-gradient(#9ec5e8,#dfe9f0))';\r\n }\r\n if (this._pitchSky) {\r\n this._pitchSky.style.height = `${Math.max(0, Math.ceil(top))}px`;\r\n this._pitchSky.style.display = top > 0 ? '' : 'none';\r\n }\r\n}\n", "import { updateSky } from './updateSky.js';\n\nexport function mapSetPitchAndBearing(pitch, bearing) {\n if (!Number.isFinite(pitch) || !Number.isFinite(bearing)) throw new TypeError('Camera angles must be finite numbers');\r\n const previousPitch = this.getPitch(), previousBearing = this.getBearing();\r\n this._cameraPitch = Math.max(0, Math.min(85, pitch));\r\n this._cameraBearing = ((bearing % 360) + 360) % 360;\r\n if (this._loaded) {\r\n updateSky.call(this);\r\n if (previousBearing !== this.getBearing()) this.fire('rotate', { bearing: this.getBearing() });\r\n if (previousPitch !== this.getPitch()) this.fire('pitch', { pitch: this.getPitch() });\r\n }\r\n return this;\n}\n", "import { mapCameraState } from '../constants/mapCameraState.js';\nimport { scheduleCameraAnimation } from './scheduleCameraAnimation.js';\n\nexport function runCameraAnimations(now) {\n mapCameraState.cameraAnimationFrame = null;\n const pending = [...mapCameraState.cameraAnimations];\n mapCameraState.cameraAnimations.clear();\n let failure;\n let map, animation, progress, eased;\n for ([map, animation] of pending) {\n map._cameraFrame = null;\n if (map._cameraAnimation !== animation) continue;\n progress = animation.duration\n ? Math.min(1, (now - animation.start) / (animation.duration * 1000)) : 1;\n eased = 1 - (1 - progress) ** 3;\n try {\n map._setPitchAndBearing(\n animation.fromPitch + (Math.max(0, Math.min(85, animation.pitch)) - animation.fromPitch) * eased,\n animation.fromBearing + animation.delta * eased,\n );\n if (progress < 1 && map._cameraAnimation === animation) scheduleCameraAnimation(map, animation);\n else if (map._cameraAnimation === animation) map._cameraAnimation = null;\n } catch (error) {\n failure ||= error;\n }\n }\n if (failure) throw failure;\n}\n", "import { mapCameraState } from '../constants/mapCameraState.js';\nimport { runCameraAnimations } from './runCameraAnimations.js';\n\nexport function scheduleCameraAnimation(map, animation) {\r\n mapCameraState.cameraAnimations.set(map, animation);\r\n if (mapCameraState.cameraAnimationFrame === null) mapCameraState.cameraAnimationFrame = requestAnimationFrame(runCameraAnimations);\r\n map._cameraFrame = mapCameraState.cameraAnimationFrame;\r\n}\n", "import { cancelCameraAnimation } from './cancelCameraAnimation.js';\nimport { scheduleCameraAnimation } from './scheduleCameraAnimation.js';\n\nexport function mapAnimateCamera(pitch, bearing, options = {}) {\n cancelCameraAnimation(this);\r\n if (!Number.isFinite(pitch) || !Number.isFinite(bearing)) throw new TypeError('Camera angles must be finite numbers');\r\n if (!options.animate || matchMedia('(prefers-reduced-motion: reduce)').matches) {\r\n return this._setPitchAndBearing(pitch, bearing);\r\n }\r\n const duration = options.duration ?? 0.3;\r\n if (!Number.isFinite(duration) || duration < 0) throw new TypeError('Camera duration must be nonnegative');\r\n const start = performance.now(), fromPitch = this.getPitch(), fromBearing = this.getBearing();\r\n const delta = ((bearing - fromBearing) % 360 + 540) % 360 - 180;\r\n const animation = this._cameraAnimation = { duration, start, fromPitch, fromBearing, pitch, delta };\r\n scheduleCameraAnimation(this, animation);\r\n return this;\n}\n", "export function mapSetBearing(bearing, options) { return this._animateCamera(this.getPitch(), bearing, options); }\n", "export function mapSetPitch(pitch, options) { return this._animateCamera(pitch, this.getBearing(), options); }\n", "export function mapResetNorth(options = { animate: true }) { return this.setBearing(0, options); }\n", "export function mapResetNorthPitch(options = { animate: true }) { return this._animateCamera(0, 0, options); }\n", "export function pointOf(point) {\r\n return Array.isArray(point) ? new L.Point(point[0], point[1]) : new L.Point(point.x, point.y);\r\n}\n", "import { mapCameraState } from '../constants/mapCameraState.js';\n\nexport function angles(map) {\r\n const bearing = map.getBearing() * mapCameraState.radians, pitch = map.getPitch() * mapCameraState.radians;\r\n return [Math.cos(bearing), Math.sin(bearing), Math.cos(pitch), Math.sin(pitch)];\r\n}\n", "import { pointOf } from './pointOf.js';\nimport { angles } from './angles.js';\n\nexport function project(map, point, inverse = false, limit = false) {\r\n const half = map.getSize().divideBy(2), distance = map.getSize().y * 1.5;\r\n if (!distance) return pointOf(point);\r\n const [cos, sin, tilt, rise] = angles(map);\r\n const p = pointOf(point).subtract(half);\r\n if (inverse) {\r\n const far = map.getSize().y * map.options.pitchMaxDistance;\r\n const denominator = tilt * distance + rise * p.y;\r\n let v = denominator > 0 ? p.y * distance / denominator : -far;\r\n if (limit) v = Math.max(-far, Math.min(far, v));\r\n const u = p.x * (distance - rise * v) / distance;\r\n return new L.Point(cos * u + sin * v, -sin * u + cos * v).add(half);\r\n }\r\n const u = cos * p.x - sin * p.y, v = sin * p.x + cos * p.y;\r\n const scale = distance / (distance - rise * v);\r\n return new L.Point(u * scale, tilt * v * scale).add(half);\r\n}\n", "export function animationPoint(map, point, inverse = false) {\r\n const view = map._cameraView;\r\n if (!view) return point;\r\n const half = map.getSize().divideBy(2), scale = map.getZoomScale(view.zoom);\r\n const shift = map.project(map.getCenter(), view.zoom).subtract(map.project(view.center, view.zoom));\r\n return inverse ? point.subtract(half).subtract(shift).divideBy(scale).add(half) :\r\n point.subtract(half).multiplyBy(scale).add(shift).add(half);\r\n}\n", "import { project } from './project.js';\nimport { animationPoint } from './animationPoint.js';\nimport { mapCameraState } from '../constants/mapCameraState.js';\n\nexport function mapLayerPointToContainerPoint(point) {\n return project(this, animationPoint(this, mapCameraState.mapMethods.layerPointToContainerPoint.call(this, point)));\n}\n", "import { mapCameraState } from '../constants/mapCameraState.js';\nimport { animationPoint } from './animationPoint.js';\nimport { project } from './project.js';\n\nexport function mapContainerPointToLayerPoint(point) {\n return mapCameraState.mapMethods.containerPointToLayerPoint.call(this, animationPoint(this, project(this, point, true), true));\n}\n", "import { mapCameraState } from '../constants/mapCameraState.js';\n\nexport function mapGetCenterLayerPoint() {\n return mapCameraState.mapMethods.containerPointToLayerPoint.call(this, this.getSize().divideBy(2));\n}\n", "export function mapUpdateCameraOverlays() {\n let layer;\n for (layer of Object.values(this._layers)) {\n if (layer instanceof L.Marker) layer.update();\n else if (layer instanceof L.Popup || layer instanceof L.Tooltip) layer._updatePosition();\n }\n}\n", "import { project } from './project.js';\nimport { pointOf } from './pointOf.js';\nimport { mapCameraState } from '../constants/mapCameraState.js';\n\nexport function mapPanBy(offset, options) {\n const half = this.getSize().divideBy(2);\r\n const ground = half.subtract(project(this, half.subtract(pointOf(offset)), true));\r\n return mapCameraState.mapMethods.panBy.call(this, ground, options);\n}\n", "import { mapCameraState } from '../constants/mapCameraState.js';\n\nexport function mapSetZoomAround(latlng, zoom, options) {\n if (!this.getPitch() && !this.getBearing()) return mapCameraState.mapMethods.setZoomAround.call(this, latlng, zoom, options);\r\n zoom = this._limitZoom(zoom);\r\n const scale = this.getZoomScale(zoom), half = this.getSize().divideBy(2);\r\n const screen = latlng instanceof L.Point ? latlng : this.latLngToContainerPoint(latlng);\r\n const center = this.containerPointToLayerPoint(half), anchor = this.containerPointToLayerPoint(screen);\r\n const next = center.add(anchor.subtract(center).multiplyBy(1 - 1 / scale));\r\n return this.setView(this.layerPointToLatLng(next), zoom, { zoom: options });\n}\n", "import { mapCameraState } from '../constants/mapCameraState.js';\nimport { pointOf } from './pointOf.js';\n\nexport function mapPanInside(latlng, options = {}) {\n if (!this.getPitch() && !this.getBearing()) return mapCameraState.mapMethods.panInside.call(this, latlng, options);\r\n const min = pointOf(options.paddingTopLeft || options.padding || [0, 0]);\r\n const max = this.getSize().subtract(pointOf(options.paddingBottomRight || options.padding || [0, 0]));\r\n const screen = this.latLngToContainerPoint(latlng);\r\n const safe = new L.Point(Math.max(min.x, Math.min(max.x, screen.x)),\r\n Math.max(min.y, Math.min(max.y, screen.y)));\r\n if (safe.equals(screen)) return this;\r\n const delta = this.latLngToLayerPoint(latlng).subtract(this.containerPointToLayerPoint(safe));\r\n return this.panTo(this.unproject(this.project(this.getCenter()).add(delta)), options);\n}\n", "import { pointOf } from './pointOf.js';\nimport { project } from './project.js';\n\nexport function groundBounds(map, padding = [0, 0]) {\n const min = pointOf(padding).divideBy(2), max = map.getSize().subtract(min);\n const corners = [[min.x, min.y], [max.x, min.y], [min.x, max.y], [max.x, max.y]];\n const points = [];\n let point;\n for (point of corners) points.push(project(map, point, true, true));\n return new L.Bounds(points);\n}\n", "import { mapCameraState } from '../constants/mapCameraState.js';\nimport { groundBounds } from './groundBounds.js';\n\nexport function mapLimitCenter(center, zoom, bounds) {\n if (!bounds || !this._loaded || !this.getPitch() && !this.getBearing()) {\r\n return mapCameraState.mapMethods._limitCenter.call(this, center, zoom, bounds);\r\n }\r\n const half = this.getSize().divideBy(2), footprint = groundBounds(this), point = this.project(center, zoom);\r\n const view = new L.Bounds(point.add(footprint.min.subtract(half)), point.add(footprint.max.subtract(half)));\r\n const offset = this._getBoundsOffset(view, bounds, zoom);\r\n return Math.abs(offset.x) <= 1 && Math.abs(offset.y) <= 1 ? center : this.unproject(point.add(offset), zoom);\n}\n", "import { mapCameraState } from '../constants/mapCameraState.js';\nimport { project } from './project.js';\n\nexport function mapLimitOffset(offset, bounds) {\n if (!bounds || !this.getPitch() && !this.getBearing()) return mapCameraState.mapMethods._limitOffset.call(this, offset, bounds);\r\n const half = this.getSize().divideBy(2), ground = half.subtract(project(this, half.subtract(offset), true));\r\n const center = this.project(this.getCenter());\r\n const limited = this.project(this._limitCenter(this.unproject(center.add(ground)), this.getZoom(), bounds));\r\n return half.subtract(project(this, half.subtract(limited.subtract(center))));\n}\n", "export function verticalGroundY(y, tilt, distance, rise, far) {\r\n return tilt * distance + rise * y > 0\r\n ? Math.max(-far, Math.min(far, y * distance / (tilt * distance + rise * y))) : -far;\r\n}\n", "import { pointOf } from './pointOf.js';\nimport { angles } from './angles.js';\nimport { verticalGroundY } from './verticalGroundY.js';\n\nexport function fitCameraBounds(map, bounds, options = {}) {\n bounds = bounds.getBounds ? bounds.getBounds() : bounds instanceof L.LatLngBounds ? bounds : new L.LatLngBounds(bounds);\n const zoom = map.getZoom() ?? 0, half = map.getSize().divideBy(2), distance = map.getSize().y * 1.5;\n const min = pointOf(options.paddingTopLeft || options.padding || [0, 0]).subtract(half);\n const max = half.subtract(pointOf(options.paddingBottomRight || options.padding || [0, 0]));\n const [cos, sin, tilt, rise] = angles(map);\n const far = map.getSize().y * map.options.pitchMaxDistance;\n const top = verticalGroundY(min.y, tilt, distance, rise, far);\n const bottom = verticalGroundY(max.y, tilt, distance, rise, far);\n const origin = map.project(bounds.getNorthWest(), zoom).add(map.project(bounds.getSouthEast(), zoom)).divideBy(2);\n const points = [];\n let latlng, p, point;\n for (latlng of [bounds.getNorthWest(), bounds.getNorthEast(), bounds.getSouthWest(), bounds.getSouthEast()]) {\n p = map.project(latlng, zoom).subtract(origin);\n points.push(new L.Point(cos * p.x - sin * p.y, sin * p.x + cos * p.y));\n }\n let low = Infinity, high = -Infinity;\n for (point of points) {\n low = Math.min(low, point.y);\n high = Math.max(high, point.y);\n }\n const leftSlope = min.x * rise / distance, rightSlope = max.x * rise / distance;\n const slope = rightSlope - leftSlope;\n let left = Infinity, right = -Infinity;\n for (point of points) {\n left = Math.min(left, point.x + leftSlope * point.y);\n right = Math.max(right, point.x + rightSlope * point.y);\n }\n // Perspective viewport edges are straight lines on the ground: fit all four corners, not their screen midpoint.\n const scale = Math.min((bottom - top) / (high - low),\n (max.x - min.x - slope * top) / (right - left - slope * low));\n let target = map.getScaleZoom(scale, zoom);\n const snap = map.options.zoomSnap;\n if (snap) target = Math.floor(Math.round(target / (snap / 100)) / 100) * snap;\n target = Math.max(map.getMinZoom(), Math.min(map.getMaxZoom(), options.maxZoom ?? Infinity, target));\n if (!Number.isFinite(target)) return { center: bounds.getCenter(), zoom: target };\n const actual = map.getZoomScale(target, zoom);\n const vMin = high * actual - bottom, vMax = low * actual - top;\n const v = Math.max(vMin, slope ? (actual * (right - left) - max.x + min.x) / slope : vMin);\n const centerY = (Math.min(vMax, v) + vMax) / 2;\n const centerX = (actual * (left + right) - min.x - max.x - (leftSlope + rightSlope) * centerY) / 2;\n const center = origin.add(new L.Point(cos * centerX + sin * centerY, -sin * centerX + cos * centerY).divideBy(actual));\n return { center: map.unproject(center, zoom), zoom: target };\n}\n", "import { fitCameraBounds } from './fitCameraBounds.js';\nimport { mapCameraState } from '../constants/mapCameraState.js';\n\nexport function mapGetBoundsCenterZoom(bounds, options) {\n return this.getPitch() || this.getBearing() ? fitCameraBounds(this, bounds, options) :\r\n mapCameraState.mapMethods._getBoundsCenterZoom.call(this, bounds, options);\n}\n", "import { mapCameraState } from '../constants/mapCameraState.js';\nimport { fitCameraBounds } from './fitCameraBounds.js';\nimport { pointOf } from './pointOf.js';\nimport { groundBounds } from './groundBounds.js';\n\nexport function mapGetBoundsZoom(bounds, inside, padding) {\n if (!this.getPitch() && !this.getBearing()) return mapCameraState.mapMethods.getBoundsZoom.call(this, bounds, inside, padding);\r\n if (!inside) return fitCameraBounds(this, bounds, { padding: pointOf(padding || [0, 0]).divideBy(2) }).zoom;\r\n bounds = bounds instanceof L.LatLngBounds ? bounds : new L.LatLngBounds(bounds);\r\n const footprint = groundBounds(this, padding).getSize(), size = this.project(bounds.getSouthEast()).subtract(this.project(bounds.getNorthWest()));\r\n const zoom = this.getScaleZoom(Math.max(footprint.x / size.x, footprint.y / size.y));\r\n const snap = this.options.zoomSnap;\r\n return Math.max(this.getMinZoom(), Math.min(this.getMaxZoom(), snap ? Math.ceil(zoom / snap) * snap : zoom));\n}\n", "import { mapCameraState } from '../constants/mapCameraState.js';\n\nexport function mapTryAnimatedPan(center, options) {\n // Leaflet's geographic recentering already supplies ground pixels, not screen pixels.\r\n const offset = this._getCenterOffset(center)._trunc();\r\n if (options?.animate !== true && !this.getSize().contains(offset)) return false;\r\n mapCameraState.mapMethods.panBy.call(this, offset, options);\r\n return true;\n}\n", "import { mapCameraState } from '../constants/mapCameraState.js';\nimport { groundBounds } from './groundBounds.js';\nimport { animationPoint } from './animationPoint.js';\n\nexport function mapGetBounds() {\n if (!this.getPitch() && !this.getBearing()) return mapCameraState.mapMethods.getBounds.call(this);\n const footprint = groundBounds(this), bounds = new L.LatLngBounds();\n let point, raw;\n for (point of [footprint.min, footprint.max]) {\n raw = mapCameraState.mapMethods.containerPointToLayerPoint.call(this, animationPoint(this, point, true));\n bounds.extend(this.layerPointToLatLng(raw));\n }\n return bounds;\n}\n", "export function constrainCameraToBounds() {\r\n if (this.options.maxBounds) this._panInsideMaxBounds();\r\n}\n", "import { project } from '../camera/project.js';\n\nexport function adjustCameraDrag() {\r\n const map = this;\r\n const draggable = map._cameraDraggable;\r\n if (!map.getPitch() && !map.getBearing()) return;\r\n const half = map.getSize().divideBy(2), delta = draggable._newPos.subtract(draggable._startPos);\r\n const ground = half.subtract(project(map, half.subtract(delta), true));\r\n draggable._newPos = draggable._startPos.add(ground);\r\n}\n", "import { cancelCameraAnimation } from './cancelCameraAnimation.js';\nimport { adjustCameraDrag } from '../controls/adjustCameraDrag.js';\n\nexport function cleanupCameraMap() {\r\n cancelCameraAnimation(this);\r\n this._pitchSky?.remove();\r\n if (this._cameraDraggable) {\r\n this._cameraDraggable.off('predrag', adjustCameraDrag, this);\r\n delete this._cameraDraggable;\r\n }\r\n}\n", "import { adjustCameraDrag } from '../controls/adjustCameraDrag.js';\n\nexport function cameraMapReady() {\r\n const draggable = this.dragging?._draggable;\r\n if (!draggable) return;\r\n this._cameraDraggable = draggable;\r\n draggable.on('predrag', adjustCameraDrag, this);\r\n}\n", "export async function loadCameraControls(map) {\r\n try {\r\n const { cameraControls } = await import('./cameraControls.js');\r\n if (map._container?._leaflet_id) cameraControls(map);\r\n } catch (error) {\r\n map.fire('error', { error });\r\n throw error;\r\n }\r\n}\n", "export function noOperation() {}\n", "import { updateSky } from './updateSky.js';\nimport { constrainCameraToBounds } from './constrainCameraToBounds.js';\nimport { cleanupCameraMap } from './cleanupCameraMap.js';\nimport { cameraMapReady } from './cameraMapReady.js';\nimport { loadCameraControls } from '../controls/loadCameraControls.js';\nimport { noOperation } from '../utils/noOperation.js';\n\nexport function initializeCameraMap() {\n if (!document.getElementById('leaflet-camera-zoom-style')) {\n const style = document.createElement('style');\n style.id = 'leaflet-camera-zoom-style';\n style.textContent = '.leaflet-camera-zoom .leaflet-marker-icon,.leaflet-camera-zoom .leaflet-marker-shadow,' +\n '.leaflet-camera-zoom .leaflet-popup,.leaflet-camera-zoom .leaflet-tooltip{transition:none!important}';\n document.head.append(style);\n }\n this._setPitchAndBearing(this.options.pitch, this.options.bearing);\n this.on('load resize pitch', updateSky);\n this.on('rotate pitch', constrainCameraToBounds, this);\n this.once('unload', cleanupCameraMap, this);\n this.whenReady(cameraMapReady, this);\n if (this.options.rotate || this.options.trackContainerMutation) {\n this.cameraReady = loadCameraControls(this);\n this.cameraReady.catch(noOperation);\n }\n}\n", "import { mapCameraState } from '../constants/mapCameraState.js';\nimport { initNativeGPU } from './initNativeGPU.js';\n\nexport function markerSetIcon(icon) {\n if (!(icon instanceof L.DivIcon)) icon.options.crossOrigin ||= true;\r\n const result = mapCameraState.markerMethods.setIcon.call(this, icon);\r\n if (this._map && !(icon instanceof L.DivIcon)) initNativeGPU(this, this._map);\r\n return result;\n}\n", "export function markerSetRotation(rotation) {\n if (!Number.isFinite(rotation)) throw new TypeError('Marker rotation must be finite');\r\n this.options.rotation = rotation;\r\n this.update();\r\n this._nativeGPU?.refresh?.();\r\n return this;\n}\n", "import { mapCameraState } from '../constants/mapCameraState.js';\n\nexport function markerCameraIconPoint(x, y) {\n let rotation = this.options.rotation + (this.options.rotateWithView ? this._map.getBearing() * mapCameraState.radians : 0);\r\n if (this.options.keepUpright && Math.cos(rotation) < 0) rotation += Math.PI;\r\n const scale = this.options.scale;\r\n return new L.Point((x * Math.cos(rotation) - y * Math.sin(rotation)) * scale,\r\n (x * Math.sin(rotation) + y * Math.cos(rotation)) * scale);\n}\n", "import { mapCameraState } from '../constants/mapCameraState.js';\n\nexport function markerGetEvents() {\n return { ...mapCameraState.markerMethods.getEvents.call(this), rotate: this.update, pitch: this.update, move: this.update };\n}\n", "export function displayPoint(map, point) {\r\n return map.layerPointToContainerPoint(point).subtract(map._getMapPanePos());\r\n}\n", "import { mapCameraState } from '../constants/mapCameraState.js';\nimport { displayPoint } from '../camera/displayPoint.js';\n\nexport function markerSetPos(point) {\n mapCameraState.markerMethods._setPos.call(this, displayPoint(this._map, point));\n let element, key, direction, options, anchor;\n for ([element, key] of [[this._icon, 'iconAnchor'], [this._shadow, 'shadowAnchor']]) {\n if (!element) continue;\n direction = this._cameraIconPoint(1, 0), options = this.options.icon.options;\n anchor = options[key] || options.iconAnchor;\n element.style.transformOrigin = anchor ? `${anchor.x ?? anchor[0]}px ${anchor.y ?? anchor[1]}px` : 'center';\n element.style.transform += ` rotate(${Math.atan2(direction.y, direction.x)}rad) scale(${this.options.scale})`;\n }\n}\n", "import { mapCameraState } from '../constants/mapCameraState.js';\n\nexport function markerUpdateZIndex(offset) {\n mapCameraState.markerMethods._updateZIndex.call(this, offset);\r\n const changed = this._cameraZIndexOffset !== offset;\r\n this._cameraZIndexOffset = offset;\r\n if (changed) this._nativeGPU?.refresh?.();\n}\n", "export function cameraMarkerOnDrag(event) {\r\n const map = this._marker._map;\r\n const screen = L.DomUtil.getPosition(this._marker._icon).add(map._getMapPanePos());\r\n const point = map.containerPointToLayerPoint(screen);\r\n L.DomUtil.setPosition(this._marker._icon, point);\r\n this._cameraOriginalOnDrag.call(this, event);\r\n this._marker._setPos(point);\r\n}\n", "import { mapCameraState } from '../constants/mapCameraState.js';\n\nexport function runMarkerPanFrame() {\n mapCameraState.markerPanFrame = null;\n const pending = [...mapCameraState.pendingMarkerPan];\n mapCameraState.pendingMarkerPan.clear();\n let drag, event;\n for ([drag, event] of pending) {\n drag._panRequest = null;\n drag._adjustPan(event);\n }\n}\n", "import { mapCameraState } from '../constants/mapCameraState.js';\nimport { runMarkerPanFrame } from './runMarkerPanFrame.js';\n\nexport function scheduleMarkerPan(drag, event) {\r\n mapCameraState.pendingMarkerPan.set(drag, event);\r\n if (mapCameraState.markerPanFrame === null) mapCameraState.markerPanFrame = requestAnimationFrame(runMarkerPanFrame);\r\n drag._panRequest = mapCameraState.markerPanFrame;\r\n}\n", "import { pointOf } from '../camera/pointOf.js';\nimport { scheduleMarkerPan } from './scheduleMarkerPan.js';\n\nexport function adjustCameraMarkerPan(event) {\r\n const marker = this._marker, map = marker._map;\r\n if (!map.getPitch() && !map.getBearing()) return this._cameraOriginalAdjustPan.call(this, event);\r\n const screen = L.DomUtil.getPosition(marker._icon).add(map._getMapPanePos());\r\n const size = map.getSize(), padding = pointOf(marker.options.autoPanPadding);\r\n const speed = marker.options.autoPanSpeed;\r\n const movement = new L.Point(\r\n (Math.max(0, screen.x - size.x + padding.x) - Math.max(0, padding.x - screen.x)) / Math.max(1, padding.x) * speed,\r\n (Math.max(0, screen.y - size.y + padding.y) - Math.max(0, padding.y - screen.y)) / Math.max(1, padding.y) * speed);\r\n if (!movement.x && !movement.y) return;\r\n const pane = map._getMapPanePos();\r\n map.panBy(movement, { animate: false });\r\n const shift = pane.subtract(map._getMapPanePos());\r\n this._draggable._newPos._add(shift);\r\n this._draggable._startPos._add(shift);\r\n L.DomUtil.setPosition(marker._icon, this._draggable._newPos);\r\n this._onDrag(event);\r\n scheduleMarkerPan(this, event);\r\n}\n", "import { cameraMarkerOnDrag } from './cameraMarkerOnDrag.js';\nimport { adjustCameraMarkerPan } from './adjustCameraMarkerPan.js';\n\nexport function cameraMarkerDrag() {\n if (!this.dragging || this.dragging._cameraDrag) return;\r\n const drag = this.dragging, original = drag._onDrag, adjustPan = drag._adjustPan;\r\n drag._cameraOriginalOnDrag = original;\r\n drag._cameraOriginalAdjustPan = adjustPan;\r\n drag._onDrag = cameraMarkerOnDrag;\r\n drag._adjustPan = adjustCameraMarkerPan;\r\n // The handler may already be enabled and listening with its original method.\r\n const enabled = drag.enabled();\r\n if (enabled) {\r\n drag._draggable.off('drag', original, drag);\r\n drag._draggable.on('drag', drag._onDrag, drag);\r\n }\r\n drag._cameraDrag = true;\n}\n", "import { mapCameraState } from '../constants/mapCameraState.js';\nimport { cameraMarkerDrag } from './cameraMarkerDrag.js';\n\nexport function markerInitInteraction() {\n const result = mapCameraState.markerMethods._initInteraction.call(this);\r\n cameraMarkerDrag.call(this);\r\n return result;\n}\n", "import { mapCameraState } from '../constants/mapCameraState.js';\n\nexport function popupGetEvents() {\n return { ...mapCameraState.popupEvents.call(this), rotate: this._updatePosition, pitch: this._updatePosition, move: this._updatePosition };\n}\n", "import { mapCameraState } from '../constants/mapCameraState.js';\n\nexport function tooltipGetEvents() {\n return { ...mapCameraState.tooltipEvents.call(this), rotate: this._updatePosition, pitch: this._updatePosition, move: this._updatePosition };\n}\n", "import { mapCameraState } from '../constants/mapCameraState.js';\nimport { pointOf } from '../camera/pointOf.js';\n\nexport function popupAdjustPan() {\n const map = this._map;\r\n if (!map.getPitch() && !map.getBearing()) return mapCameraState.popupPan.call(this);\r\n if (!this.options.autoPan) return;\r\n if (map._panAnim) map._panAnim.stop();\r\n if (this._autopanning) { this._autopanning = false; return; }\r\n const rect = this._container.getBoundingClientRect(), container = map.getContainer().getBoundingClientRect();\r\n const min = pointOf(this.options.autoPanPaddingTopLeft || this.options.autoPanPadding);\r\n const max = map.getSize().subtract(pointOf(this.options.autoPanPaddingBottomRight || this.options.autoPanPadding));\r\n const left = rect.left - container.left, top = rect.top - container.top;\r\n const right = rect.right - container.left, bottom = rect.bottom - container.top;\r\n const dx = Math.min(0, left - min.x) || Math.max(0, right - max.x);\r\n const dy = Math.min(0, top - min.y) || Math.max(0, bottom - max.y);\r\n if (!dx && !dy) return;\r\n if (this.options.keepInView) this._autopanning = true;\r\n const screen = map.latLngToContainerPoint(this._latlng).subtract(new L.Point(dx, dy));\r\n const delta = map.latLngToLayerPoint(this._latlng).subtract(map.containerPointToLayerPoint(screen));\r\n map.fire('autopanstart');\r\n map.panTo(map.unproject(map.project(map.getCenter()).add(delta)));\n}\n", "import { mapCameraState } from '../constants/mapCameraState.js';\nimport { displayPoint } from '../camera/displayPoint.js';\n\nexport function popupUpdatePosition() {\n mapCameraState.popupPosition.call(this);\r\n if (!this._map) return;\r\n const point = this._map.latLngToLayerPoint(this._latlng), delta = displayPoint(this._map, point).subtract(point);\r\n if (this._zoomAnimated) {\r\n L.DomUtil.setPosition(this._container, L.DomUtil.getPosition(this._container).add(delta));\r\n } else {\r\n this._container.style.left = `${this._containerLeft + delta.x}px`;\r\n this._container.style.bottom = `${this._containerBottom - delta.y}px`;\r\n }\n}\n", "import { mapCameraState } from '../constants/mapCameraState.js';\nimport { displayPoint } from '../camera/displayPoint.js';\n\nexport function tooltipSetPosition(point) {\n mapCameraState.tooltipPosition.call(this, point);\r\n const delta = displayPoint(this._map, point).subtract(point);\r\n L.DomUtil.setPosition(this._container, L.DomUtil.getPosition(this._container).add(delta));\n}\n", "import { mapCameraState } from '../constants/mapCameraState.js';\n\nexport function gridlayerGetEvents() {\n const events = mapCameraState.gridEvents.call(this);\r\n this._cameraGridUpdate ||= L.Util.throttle(this._onMoveEnd, this.options.updateInterval, this);\r\n return { ...events, rotate: this._cameraGridUpdate, pitch: this._cameraGridUpdate };\n}\n", "import { mapCameraState } from '../constants/mapCameraState.js';\n\nexport function gridlayerGetTiledPixelBounds(center) {\n if (!this._map.getBearing() && !this._map.getPitch()) return mapCameraState.tiledBounds.call(this, center);\r\n const bounds = this._map.getBounds();\r\n return new L.Bounds(this._map.project(bounds.getNorthWest(), this._tileZoom),\r\n this._map.project(bounds.getSouthEast(), this._tileZoom));\n}\n", "import { initNativeGPU } from '../core/initNativeGPU.js';\nimport { mapCameraState } from '../constants/mapCameraState.js';\nimport { mapGetBearing } from './mapGetBearing.js';\nimport { mapGetPitch } from './mapGetPitch.js';\nimport { mapStopPitchBearingAnimation } from './mapStopPitchBearingAnimation.js';\nimport { mapSetPitchAndBearing } from './mapSetPitchAndBearing.js';\nimport { mapAnimateCamera } from './mapAnimateCamera.js';\nimport { mapSetBearing } from './mapSetBearing.js';\nimport { mapSetPitch } from './mapSetPitch.js';\nimport { mapResetNorth } from './mapResetNorth.js';\nimport { mapResetNorthPitch } from './mapResetNorthPitch.js';\nimport { mapLayerPointToContainerPoint } from './mapLayerPointToContainerPoint.js';\nimport { mapContainerPointToLayerPoint } from './mapContainerPointToLayerPoint.js';\nimport { mapGetCenterLayerPoint } from './mapGetCenterLayerPoint.js';\nimport { mapUpdateCameraOverlays } from './mapUpdateCameraOverlays.js';\nimport { mapPanBy } from './mapPanBy.js';\nimport { mapSetZoomAround } from './mapSetZoomAround.js';\nimport { mapPanInside } from './mapPanInside.js';\nimport { mapLimitCenter } from './mapLimitCenter.js';\nimport { mapLimitOffset } from './mapLimitOffset.js';\nimport { mapGetBoundsCenterZoom } from './mapGetBoundsCenterZoom.js';\nimport { mapGetBoundsZoom } from './mapGetBoundsZoom.js';\nimport { mapTryAnimatedPan } from './mapTryAnimatedPan.js';\nimport { mapGetBounds } from './mapGetBounds.js';\nimport { initializeCameraMap } from './initializeCameraMap.js';\nimport { markerSetIcon } from '../core/markerSetIcon.js';\nimport { markerSetRotation } from '../core/markerSetRotation.js';\nimport { markerCameraIconPoint } from '../core/markerCameraIconPoint.js';\nimport { markerGetEvents } from '../core/markerGetEvents.js';\nimport { markerSetPos } from '../core/markerSetPos.js';\nimport { markerUpdateZIndex } from '../core/markerUpdateZIndex.js';\nimport { markerInitInteraction } from '../core/markerInitInteraction.js';\nimport { popupGetEvents } from '../core/popupGetEvents.js';\nimport { tooltipGetEvents } from '../core/tooltipGetEvents.js';\nimport { popupAdjustPan } from '../core/popupAdjustPan.js';\nimport { popupUpdatePosition } from '../core/popupUpdatePosition.js';\nimport { tooltipSetPosition } from '../core/tooltipSetPosition.js';\nimport { gridlayerGetEvents } from '../core/gridlayerGetEvents.js';\nimport { gridlayerGetTiledPixelBounds } from '../core/gridlayerGetTiledPixelBounds.js';\n\nmapCameraState.mapMethods = Object.defineProperties({}, Object.getOwnPropertyDescriptors(L.Map.prototype));\nmapCameraState.radians = Math.PI / 180;\n\nmapCameraState.cameraAnimations = new Map();\nmapCameraState.cameraAnimationFrame = null;\n\nL.Map.mergeOptions({\n rotate: true, bearing: 0, pitch: 0, pitchMaxDistance: 3,\n rotateControl: true, shiftKeyRotate: true, pitchDrag: true,\n touchRotate: false, touchPitch: false, compassBearing: false,\n});\n\n// Ground coordinates only: the GPU camera handles elevated geometry, never CSS transforms.\n\nL.Map.include({\n getBearing: mapGetBearing,\n getPitch: mapGetPitch,\n _stopPitchBearingAnimation: mapStopPitchBearingAnimation,\n _setPitchAndBearing: mapSetPitchAndBearing,\n _animateCamera: mapAnimateCamera,\n setBearing: mapSetBearing,\n setPitch: mapSetPitch,\n resetNorth: mapResetNorth,\n resetNorthPitch: mapResetNorthPitch,\n layerPointToContainerPoint: mapLayerPointToContainerPoint,\n containerPointToLayerPoint: mapContainerPointToLayerPoint,\n _getCenterLayerPoint: mapGetCenterLayerPoint,\n _updateCameraOverlays: mapUpdateCameraOverlays,\n panBy: mapPanBy,\n setZoomAround: mapSetZoomAround,\n panInside: mapPanInside,\n _limitCenter: mapLimitCenter,\n _limitOffset: mapLimitOffset,\n _getBoundsCenterZoom: mapGetBoundsCenterZoom,\n getBoundsZoom: mapGetBoundsZoom,\n _tryAnimatedPan: mapTryAnimatedPan,\n getBounds: mapGetBounds,\n});\n\nL.Map.addInitHook(initializeCameraMap);\n\nmapCameraState.markerMethods = Object.defineProperties({}, Object.getOwnPropertyDescriptors(L.Marker.prototype));\nL.Marker.mergeOptions({ rotation: 0, rotateWithView: false, keepUpright: false, scale: 1 });\nL.Marker.include({\n setIcon: markerSetIcon,\n setRotation: markerSetRotation,\n _cameraIconPoint: markerCameraIconPoint,\n getEvents: markerGetEvents,\n _setPos: markerSetPos,\n _updateZIndex: markerUpdateZIndex,\n _initInteraction: markerInitInteraction,\n});\n\n// Keep Leaflet's focusable marker and its drag events; only translate its screen position back to ground.\n\nmapCameraState.pendingMarkerPan = new Map();\nmapCameraState.markerPanFrame = null;\n\nmapCameraState.popupEvents = L.Popup.prototype.getEvents;\nL.Popup.include({\n getEvents: popupGetEvents,\n});\nmapCameraState.tooltipEvents = L.Tooltip.prototype.getEvents;\nL.Tooltip.include({\n getEvents: tooltipGetEvents,\n});\nmapCameraState.popupPosition = L.Popup.prototype._updatePosition;\nmapCameraState.popupPan = L.Popup.prototype._adjustPan;\nL.Popup.include({\n _adjustPan: popupAdjustPan,\n _updatePosition: popupUpdatePosition,\n});\nmapCameraState.tooltipPosition = L.Tooltip.prototype._setPosition;\nL.Tooltip.include({\n _setPosition: tooltipSetPosition,\n});\n\nmapCameraState.tiledBounds = L.GridLayer.prototype._getTiledPixelBounds;\nmapCameraState.gridEvents = L.GridLayer.prototype.getEvents;\nL.GridLayer.include({\n getEvents: gridlayerGetEvents,\n _getTiledPixelBounds: gridlayerGetTiledPixelBounds,\n});\n", "import { update } from './update.js';\n\n/** Stop using the outgoing level after zoomend; the next redraw uses current tiles. */\n\nexport function endZoom() {\n const backend = this;\n let animation;\n for (animation of backend._zoomTransitions?.keys() || []) animation.finish();\n backend._zoomTransitions = null;\n backend._zoomView = null;\n delete backend._map._cameraView;\n backend._map.getContainer().classList.remove('leaflet-camera-zoom');\n backend._map._updateCameraOverlays();\n backend._zoomLevel = null;\n update(backend);\n}\n", "export const onMapChangeState = {};\n", "import { onMapChangeState } from '../constants/onMapChangeState.js';\nimport { update } from './update.js';\nimport { render } from '../rendering/render.js';\n\nexport function renderPendingMapChange() {\n const layer = onMapChangeState.pendingMapChanges.shift();\n layer._queued = false;\n if (layer._shared !== layer || !layer.renderer) return;\n if (layer._map._animatingZoom) update(layer);\n else render(layer);\n}\n", "import { update } from './update.js';\nimport { render } from \"../rendering/render.js\";\nimport { onMapChangeState } from '../constants/onMapChangeState.js';\nimport { renderPendingMapChange } from './renderPendingMapChange.js';\n\n/** Map movement: render within the frame of Leaflet's CSS transforms, coalescing same-tick events. */\n\nonMapChangeState.pendingMapChanges = [];\n\nexport function onMapChange() {\n const layer = this;\n if (layer._queued) return;\n layer._queued = true;\n onMapChangeState.pendingMapChanges.push(layer);\n queueMicrotask(renderPendingMapChange);\n}\n", "export const onZoomAnimState = {};\n", "import { onZoomAnimState } from '../constants/onZoomAnimState.js';\nimport { render } from '../rendering/render.js';\n\nexport function renderPendingZoomAnimation() {\n const layer = onZoomAnimState.pendingZoomAnimations.shift();\n if (layer._shared === layer && layer.renderer) render(layer);\n}\n", "import { render } from \"../rendering/render.js\";\nimport { onZoomAnimState } from '../constants/onZoomAnimState.js';\nimport { renderPendingZoomAnimation } from './renderPendingZoomAnimation.js';\n\nonZoomAnimState.pendingZoomAnimations = [];\n\nexport function onZoomAnim(event) {\n const map = this._map;\n if (event && !this._zoomView) {\n this._zoomView = { from: map.getCenter(), zoom: map.getZoom(), to: event.center,\n targetZoom: event.zoom, start: performance.now() };\n map.getContainer().classList.add('leaflet-camera-zoom');\n }\n onZoomAnimState.pendingZoomAnimations.push(this);\n queueMicrotask(renderPendingZoomAnimation);\n}\n", "/** Preserve the outgoing tile level before Leaflet changes its logical zoom. */\n\nexport function startZoom() {\n this._zoomLevel = null;\n}\n", "export function ring(point, radius) {\n const points = [];\n let i;\n for (i = 0; i < 6; i++) {\n points.push({\n x: point.x + Math.cos(i * Math.PI / 3) * radius,\n y: point.y + Math.sin(i * Math.PI / 3) * radius, ground: point.ground, uv: [3, 3],\n });\n }\n return points;\n}\n", "import { parseColor } from \"../utils/parseColor.js\";\nimport { ring } from './lampRing.js';\n\n/** Schematic support and lamp head; wall-mounted fixtures do not get an invented pole. */\n\nexport function lampPostGeometry(point, style, addTriangle) {\n const color = parseColor(0x50565a), radius = style.poleRadius;\n if (!Number.isFinite(radius) || radius <= 0) {\n throw new Error('Invalid lamp pole radius');\n }\n const center = { ...point, uv: [3, 3] };\n let r, low, high, points, i, a, b, angle, nx, nz;\n for ([r, low, high] of [[radius, 0, style.top], [radius * 2.5, style.top - 0.25, style.top + 0.15]]) {\n points = ring(point, r);\n for (i = 0; i < 6; i++) {\n a = points[i], b = points[(i + 1) % 6], angle = (i + 0.5) * Math.PI / 3;\n nx = Math.cos(angle), nz = -Math.sin(angle);\n addTriangle(a, low, b, low, b, high, nx, 0, nz, color);\n addTriangle(a, low, b, high, a, high, nx, 0, nz, color);\n addTriangle(center, high, a, high, b, high, 0, 1, 0, color);\n addTriangle(center, low, b, low, a, low, 0, -1, 0, color);\n }\n }\n}\n", "export function quad(addTriangle, color, a, b, c, d, height, normal) {\r\n addTriangle(a, height, b, height, c, height, ...normal, color);\r\n addTriangle(a, height, c, height, d, height, ...normal, color);\r\n}\r\n", "export function emitter(point, u, v, axis) {\r\n const r = 0.65;\r\n return {\r\n x: point.x + (axis === 2 ? 0 : u * r),\r\n y: point.y + (axis === 1 ? 0 : axis === 2 ? u * r : v * r),\r\n ground: point.ground + (axis === 0 ? 0 : v * r), uv: [u, v],\r\n };\r\n}\r\n", "import { parseColor } from \"../utils/parseColor.js\";\nimport { quad } from './quad.js';\nimport { emitter } from './emitter.js';\n\n/** Three crossed emitter discs; illumination itself is evaluated on receiving surfaces. */\n\nexport function lightGeometry(point, style, addTriangle) {\n if (!Number.isFinite(style.lightRadius) || style.lightRadius <= 0) throw new Error('Invalid light radius');\n const color = parseColor(style.color);\n let axis;\n for (axis = 0; axis < 3; axis++) {\n quad(addTriangle, color, emitter(point, -1, -1, axis), emitter(point, 1, -1, axis), emitter(point, 1, 1, axis), emitter(point, -1, 1, axis),\n style.top, axis === 0 ? [0, 1, 0] : axis === 1 ? [0, 0, 1] : [1, 0, 0]);\n }\n}\n", "export const roundProfile = [[0, 0], [0.35, 0.8], [0.6, 1], [0.85, 0.7], [1, 0]];\n", "export const ringDirections = [\r\n { x: Math.cos(0 * Math.PI / 4), y: Math.sin(0 * Math.PI / 4), nx: Math.cos((0 + 0.5) * Math.PI / 4), nz: -Math.sin((0 + 0.5) * Math.PI / 4) },\r\n { x: Math.cos(1 * Math.PI / 4), y: Math.sin(1 * Math.PI / 4), nx: Math.cos((1 + 0.5) * Math.PI / 4), nz: -Math.sin((1 + 0.5) * Math.PI / 4) },\r\n { x: Math.cos(2 * Math.PI / 4), y: Math.sin(2 * Math.PI / 4), nx: Math.cos((2 + 0.5) * Math.PI / 4), nz: -Math.sin((2 + 0.5) * Math.PI / 4) },\r\n { x: Math.cos(3 * Math.PI / 4), y: Math.sin(3 * Math.PI / 4), nx: Math.cos((3 + 0.5) * Math.PI / 4), nz: -Math.sin((3 + 0.5) * Math.PI / 4) },\r\n { x: Math.cos(4 * Math.PI / 4), y: Math.sin(4 * Math.PI / 4), nx: Math.cos((4 + 0.5) * Math.PI / 4), nz: -Math.sin((4 + 0.5) * Math.PI / 4) },\r\n { x: Math.cos(5 * Math.PI / 4), y: Math.sin(5 * Math.PI / 4), nx: Math.cos((5 + 0.5) * Math.PI / 4), nz: -Math.sin((5 + 0.5) * Math.PI / 4) },\r\n { x: Math.cos(6 * Math.PI / 4), y: Math.sin(6 * Math.PI / 4), nx: Math.cos((6 + 0.5) * Math.PI / 4), nz: -Math.sin((6 + 0.5) * Math.PI / 4) },\r\n { x: Math.cos(7 * Math.PI / 4), y: Math.sin(7 * Math.PI / 4), nx: Math.cos((7 + 0.5) * Math.PI / 4), nz: -Math.sin((7 + 0.5) * Math.PI / 4) },\r\n];\r\n", "import { ringDirections } from '../constants/ringDirections.js';\n\nexport function ring(point, radius) {\n const result = [];\n let direction;\n for (direction of ringDirections) {\n result.push({\n x: point.x + direction.x * radius,\n y: point.y + direction.y * radius,\n ground: point.ground,\n });\n }\n return result;\n}\n", "import { ring } from './treeRing.js';\nimport { ringDirections } from '../constants/ringDirections.js';\n\nexport function surface(point, addTriangle, lowRadius, low, highRadius, high, color) {\n const lower = ring(point, lowRadius), upper = ring(point, highRadius);\n let i, next, slope, length, nx, nz, ny, normalX, normalZ;\n for (i = 0; i < 8; i++) {\n next = (i + 1) % 8;\n slope = (lowRadius - highRadius) / (high - low);\n length = Math.hypot(1, slope);\n ({ nx, nz } = ringDirections[i]);\n ny = slope / length;\n normalX = nx / length, normalZ = nz / length;\n if (lowRadius) addTriangle(lower[i], low, lower[next], low, upper[next], high, normalX, ny, normalZ, color);\n if (highRadius) addTriangle(lower[i], low, upper[next], high, upper[i], high, normalX, ny, normalZ, color);\n }\n}\n", "import { roundProfile } from '../constants/roundProfile.js';\nimport { parseColor } from \"../utils/parseColor.js\";\nimport { ring } from './treeRing.js';\nimport { surface } from './surface.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 (!Number.isFinite(trunkRadius) || !Number.isFinite(crownRadius) || !Number.isFinite(crownBottom) ||\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 surface(point, addTriangle, trunkRadius, bottom, trunkRadius, crownBottom + (top - crownBottom) * 0.25, trunk);\n let i, low, lr, high, hr;\n if (crownShape === 'cone') {\n const base = ring(point, crownRadius);\n for (i = 0; i < 8; i++) addTriangle(point, crownBottom, base[i], crownBottom,\n base[(i + 1) % 8], crownBottom, 0, -1, 0, crown);\n surface(point, addTriangle, crownRadius, crownBottom, 0, top, crown);\n } else {\n for (i = 1; i < roundProfile.length; i++) {\n [low, lr] = roundProfile[i - 1], [high, hr] = roundProfile[i];\n surface(point, addTriangle, lr * crownRadius, crownBottom + low * (top - crownBottom),\n hr * crownRadius, crownBottom + high * (top - crownBottom), crown);\n }\n }\n}\n", "/** Emit a snapshot for consumers; ready does not wait for all neighborhood tasks. */\nexport function updateStatus(backend, enabled = true) {\n const progress = { enabled, loaded: 0, skipped: 0, pending: 0, errors: [] };\n let area;\n for (area of backend._areas.values()) {\n if (area.error) progress.errors.push(area.error);\n else if (!area.done) progress.pending++;\n progress.loaded += area.buildings ?? 0;\n progress.skipped += area.skipped ?? 0;\n }\n backend.fire('progress', progress);\n}\n", "\n\nexport function varint(reader) {\n const { bytes } = reader;\n let value = 0;\n let factor, byte;\n for (factor = 1; factor <= 2 ** 49; factor *= 128) {\n if (reader.cursor >= bytes.length) throw new Error('Truncated PMTiles directory');\n byte = bytes[reader.cursor++];\n value += (byte & 127) * factor;\n if (!Number.isSafeInteger(value)) throw new Error('Invalid PMTiles directory integer');\n if (byte < 128) return value;\n }\n throw new Error('Invalid PMTiles directory integer');\n}\n", "import { varint } from './varint.js';\n/** Decode delta/varint directory columns, rejecting malformed entries. */\n\nexport function decodeDirectory(data) {\n const bytes = new Uint8Array(data);\n const reader = { bytes, cursor: 0 };\n const count = varint(reader);\n if (count > (bytes.length - reader.cursor) / 4) throw new Error('Invalid PMTiles directory count');\n const entries = [];\n let tileId = 0;\n let i, entry, value;\n for (i = 0; i < count; i++) {\n tileId += varint(reader);\n if (!Number.isSafeInteger(tileId) || (i && tileId <= entries[i - 1].tileId)) {\n throw new Error('Invalid PMTiles directory tile IDs');\n }\n entries.push({ tileId });\n }\n for (entry of entries) entry.runLength = varint(reader);\n for (entry of entries) {\n entry.length = varint(reader);\n if (!entry.length) throw new Error('Invalid PMTiles directory length');\n }\n for (i = 0; i < entries.length; i++) {\n entry = entries[i];\n value = varint(reader);\n if (!value && !i) throw new Error('Invalid PMTiles directory offset');\n entry.offset = value ? value - 1 : entries[i - 1].offset + entries[i - 1].length;\n }\n if (reader.cursor !== bytes.length) throw new Error('Trailing PMTiles directory data');\n return entries;\n}\n", "export async function decompress(data, compression) {\n if (compression === 1) return data;\n if (compression !== 2) throw new Error(`Unsupported PMTiles compression: ${compression}`);\n return new Response(new Blob([data]).stream().pipeThrough(new DecompressionStream('gzip'))).arrayBuffer();\n}\n", "export async function read(backend, offset, length, signal) {\r\n signal?.throwIfAborted();\r\n if (!Number.isSafeInteger(offset) || !Number.isSafeInteger(length) ||\r\n offset < 0 || length <= 0 || !Number.isSafeInteger(offset + length)) {\r\n throw new Error('Invalid PMTiles byte range');\r\n }\r\n const response = await fetch(backend.url, {\r\n headers: { Range: `bytes=${offset}-${offset + length - 1}` }, signal,\r\n });\r\n if (!response.ok) {\r\n throw new Error(`Unable to read PMTiles: HTTP ${response.status}`);\r\n }\r\n const etag = response.headers.get('ETag');\r\n if (backend._etag && etag !== backend._etag) {\r\n throw new Error('PMTiles archive changed; recreate the layer');\r\n }\r\n if (etag) backend._etag = etag;\r\n let data = await response.arrayBuffer();\r\n if (response.status === 200) {\r\n data = data.slice(offset, offset + length);\r\n } else if (response.status !== 206 ||\r\n !response.headers.get('Content-Range')?.startsWith(`bytes ${offset}-${offset + length - 1}/`)) {\r\n throw new Error('Invalid PMTiles range response');\r\n }\r\n if (data.byteLength !== length) {\r\n throw new Error('Truncated PMTiles range');\r\n }\r\n return data;\r\n}\r\n", "import { decodeDirectory } from \"./decodeDirectory.js\";\nimport { decompress } from \"./decompress.js\";\nimport { read } from \"./read.js\";\n\nexport async function loadDirectory(backend, offset, length, compression) {\n return decodeDirectory(await decompress(await read(backend, offset, length), compression));\n}\n", "/** Cumulative Hilbert ID for an archive tile. */\n\nexport function tileId(z, x, y) {\n if (!Number.isInteger(z) || !Number.isInteger(x) || !Number.isInteger(y) || z < 0 || z > 26 ||\n x < 0 || y < 0 || x >= 2 ** z || y >= 2 ** z) throw new Error('Invalid PMTiles tile coordinates');\n let id = (4 ** z - 1) / 3;\n const n = 2 ** z;\n // Same cumulative Hilbert ordering used by build/pmtiles.js.\n let s, rx, ry;\n for (s = n / 2; s >= 1; s /= 2) {\n rx = (x & s) ? 1 : 0, ry = (y & s) ? 1 : 0;\n id += s * s * ((3 * rx) ^ ry);\n if (!ry) {\n if (rx) { x = n - 1 - x; y = n - 1 - y; }\n [x, y] = [y, x];\n }\n }\n return id;\n}\n", "/** Decode the PMTiles v3 header. */\n\nexport function decodeHeader(data) {\n if (data.byteLength < 127 || new TextDecoder().decode(new Uint8Array(data, 0, 7)) !== 'PMTiles' ||\n new Uint8Array(data)[7] !== 3) throw new Error('Expected a PMTiles v3 archive');\n const view = new DataView(data);\n const header = {};\n const offsets = ['rootDirectoryOffset', 'rootDirectoryLength', 'jsonMetadataOffset', 'jsonMetadataLength', 'leafDirectoryOffset', 'leafDirectoryLength', 'tileDataOffset', 'tileDataLength', 'numAddressedTiles', 'numTileEntries', 'numTileContents'];\n const flags = ['clustered', 'internalCompression', 'tileCompression', 'tileType', 'minZoom', 'maxZoom'];\n const bounds = ['minLon', 'minLat', 'maxLon', 'maxLat'];\n let i;\n for (i = 0; i < offsets.length; i++) header[offsets[i]] = Number(view.getBigUint64(8 + i * 8, true));\n for (i = 0; i < flags.length; i++) header[flags[i]] = view.getUint8(96 + i);\n for (i = 0; i < bounds.length; i++) header[bounds[i]] = view.getInt32(102 + i * 4, true) / 1e7;\n header.centerZoom = view.getUint8(118);\n header.centerLon = view.getInt32(119, true) / 1e7;\n header.centerLat = view.getInt32(123, true) / 1e7;\n return header;\n}\n", "import { decodeHeader } from './decodeHeader.js';\nimport { read } from './read.js';\n\n/** Cache header initialization; failures remain visible to all callers. */\n\nexport function getHeader(backend) {\n if (backend.options.archive && backend.options.archive !== backend) return backend.options.archive.getHeader();\n return backend._header ||= read(backend, 0, 127).then(decodeHeader);\n}\n", "import { loadDirectory } from './loadDirectory.js';\nimport { decompress } from './decompress.js';\nimport { tileId } from './tileId.js';\nimport { read } from './read.js';\nimport { getHeader } from './getHeader.js';\n\n/** Nearest directory entry at/before the Hilbert ID, then follow leaf pointers. */\n\nexport async function getZxy(backend, z, x, y, signal) {\n if (backend.options.archive && backend.options.archive !== backend && backend.options.archive.getZxy) {\n return backend.options.archive.getZxy(z, x, y, signal);\n }\n const id = tileId(z, x, y);\n signal?.throwIfAborted();\n const header = await getHeader(backend);\n signal?.throwIfAborted();\n if (z < header.minZoom || z > header.maxZoom) {\n return;\n }\n let offset = header.rootDirectoryOffset, length = header.rootDirectoryLength;\n const visited = new Set();\n let depth, key, pending, entries, low, high, mid, entry, data;\n for (depth = 0; depth < 4; depth++) {\n if (visited.has(offset)) {\n throw new Error('Cyclic PMTiles directory');\n }\n visited.add(offset);\n key = `${offset}:${length}`;\n if (!backend._directories.has(key)) {\n if (backend._directories.size >= 32) {\n backend._directories.delete(backend._directories.keys().next().value);\n }\n backend._directories.set(key, loadDirectory(backend, offset, length, header.internalCompression));\n }\n pending = backend._directories.get(key);\n entries = void 0;\n try {\n entries = await pending;\n } catch (error) {\n if (backend._directories.get(key) === pending) backend._directories.delete(key);\n throw error;\n }\n signal?.throwIfAborted();\n low = 0, high = entries.length - 1;\n while (low <= high) {\n mid = (low + high) >> 1;\n if (entries[mid].tileId <= id) {\n low = mid + 1;\n } else {\n high = mid - 1;\n }\n }\n entry = entries[high];\n if (!entry) {\n return;\n }\n if (entry.runLength) {\n if (id - entry.tileId >= entry.runLength) {\n return;\n }\n if (entry.offset + entry.length > header.tileDataLength) {\n throw new Error('PMTiles tile outside data section');\n }\n data = await decompress(await read(backend, header.tileDataOffset + entry.offset, entry.length, signal), header.tileCompression);\n signal?.throwIfAborted();\n return { data };\n }\n if (entry.offset + entry.length > header.leafDirectoryLength) {\n throw new Error('PMTiles directory outside leaf section');\n }\n offset = header.leafDirectoryOffset + entry.offset;\n length = entry.length;\n }\n throw new Error('PMTiles directory depth exceeds four levels');\n}\n", "import { getZxy } from './getZxy.js';\n\nexport async function loadSource(backend, area) {\n if (backend._geojson) {\n const { data, url } = backend.options;\n if (data !== undefined && url) throw new Error('GeoJSON source requires either data or url');\n if (data !== undefined) return data;\n if (!url) throw new Error('GeoJSON source requires either data or url');\n const response = await fetch(new URL(url, document.baseURI), { signal: area.request.signal });\n if (!response.ok) throw new Error(`Unable to load GeoJSON: HTTP ${response.status}`);\n return response.json();\n }\n const result = await getZxy(backend, area.coords.z, area.coords.x, area.coords.y, area.request.signal);\n return result\n ? JSON.parse(new TextDecoder().decode(result.data))\n : { type: 'FeatureCollection', features: [] };\n}\n", "export const pumpState = {};\n", "export function compareDistance(a, b) {\r\n return a.distance - b.distance;\r\n}\r\n", "import { getElevation } from '../terrain/getElevation.js';\n\nexport function projectedTree(context, lon, lat) {\r\n const { backend, crs, origin, metres, map } = context;\r\n const point = crs.project(new L.LatLng(lat, lon));\r\n const elevation = map._terrain3D ? getElevation(map._terrain3D, [lat, lon]) : undefined;\r\n return {\r\n x: (point.x - origin.x) * metres,\r\n y: (point.y - origin.y) * metres,\r\n ground: Number.isFinite(elevation) && Number.isFinite(backend.root.position[1])\r\n ? elevation - backend.root.position[1] : 0,\r\n };\r\n}\n", "export function groundOffset(point) {\r\n return point.ground || 0;\r\n}\n", "import { groundOffset } from './groundOffset.js';\n\nexport function addTriangle(context, a, ah, b, bh, c, ch, nx, ny, nz, color) {\r\n const { backend, positions, normals, colors, uvs } = context;\r\n const ux = b.x - a.x, uy = bh - ah, uz = a.y - b.y;\r\n const vx = c.x - a.x, vy = ch - ah, vz = a.y - c.y;\r\n if ((uy * vz - uz * vy) * nx + (uz * vx - ux * vz) * ny + (ux * vy - uy * vx) * nz < 0) {\r\n const point = b, height = bh;\r\n b = c; bh = ch; c = point; ch = height;\r\n }\r\n positions.push(a.x, ah + groundOffset(a), -a.y,\r\n b.x, bh + groundOffset(b), -b.y,\r\n c.x, ch + groundOffset(c), -c.y);\r\n normals.push(nx, ny, nz, nx, ny, nz, nx, ny, nz);\r\n colors.push(color.r, color.g, color.b, color.r, color.g, color.b, color.r, color.g, color.b);\r\n if (backend.options.nightLight) uvs.push(...a.uv, ...b.uv, ...c.uv);\r\n}\n", "import { addTriangle } from './addTriangle.js';\nimport { pumpState } from '../constants/pumpState.js';\n\nexport function addGeneratedTriangle(...args) {\r\n addTriangle(pumpState.triangleContexts[pumpState.triangleContexts.length - 1], ...args);\r\n}\n", "import { pumpState } from '../constants/pumpState.js';\nimport { addGeneratedTriangle } from './addGeneratedTriangle.js';\n\nexport function generateTreeGeometry(context, generator, point, style) {\r\n pumpState.triangleContexts.push(context);\r\n try {\r\n generator(point, style, addGeneratedTriangle);\r\n } finally {\r\n pumpState.triangleContexts.pop();\r\n }\r\n}\n", "import { projectedTree } from './projectedTree.js';\nimport { generateTreeGeometry } from './generateTreeGeometry.js';\nimport { lampPostGeometry } from '../geometry/lampPostGeometry.js';\nimport { lightGeometry } from '../geometry/lightGeometry.js';\nimport { treeGeometry } from '../geometry/treeGeometry.js';\n\nexport function buildAreaPoint(context, feature, lon, lat, style, baseColor) {\n const { backend } = context;\n const { top } = style;\n const projected = projectedTree(context, lon, lat);\n if (backend.options.nightLight) {\n if (!Number.isFinite(style.lightFlux) || style.lightFlux <= 0) throw new Error('Invalid light flux');\n const support = feature.properties?.cod_ouvrag || `${lon},${lat}`;\n if (style.poleRadius > 0 && !context.supports.has(support)) {\n generateTreeGeometry(context, lampPostGeometry, projected, style);\n context.supports.add(support);\n }\n generateTreeGeometry(context, lightGeometry, projected, style);\n context.lights.push({\n position: [projected.x, projected.ground + top, -projected.y],\n radius: Math.hypot(top, style.lightRadius), color: [baseColor.r, baseColor.g, baseColor.b],\n flux: style.lightFlux,\n });\n } else generateTreeGeometry(context, treeGeometry, projected, style);\n}\n", "import { getElevation } from '../terrain/getElevation.js';\n\nexport function projectRing(context, ring) {\n const { backend, crs, origin, metres, map } = context;\n if (ring.length < 4) throw new Error('Invalid GeoJSON polygon ring');\n const path = [];\n let lng, lat, point, elevation;\n for ([lng, lat] of ring.slice(0, -1)) {\n if (!Number.isFinite(lng) || !Number.isFinite(lat)) throw new Error('Invalid GeoJSON coordinates');\n point = crs.project(new L.LatLng(lat, lng));\n elevation = map._terrain3D ? getElevation(map._terrain3D, [lat, lng]) : undefined;\n path.push({\n x: (point.x - origin.x) * metres,\n y: (point.y - origin.y) * metres,\n ground: Number.isFinite(elevation) && Number.isFinite(backend.root.position[1])\n ? elevation - backend.root.position[1] : 0,\n });\n }\n return path;\n}\n", "import { projectRing } from './projectRing.js';\nimport { triangulate } from '../triangulation/triangulate.js';\nimport { addTriangle } from './addTriangle.js';\nimport { isClockWise } from '../triangulation/isClockWise.js';\n\nexport function buildAreaPolygon(context, rings, top, bottom, baseColor) {\n if (!rings.length) throw new Error('Empty GeoJSON polygon');\n const paths = [];\n let ring, path, point, a, b, c, index, sign, i, length, nx, nz;\n for (ring of rings) paths.push(projectRing(context, ring));\n const points = [];\n for (path of paths) for (point of path) points.push(point);\n for ([a, b, c] of triangulate(paths[0], paths.slice(1))) {\n addTriangle(context, points[a], top, points[b], top, points[c], top, 0, 1, 0, baseColor);\n if (bottom > 0) addTriangle(context, points[a], bottom, points[b], bottom, points[c], bottom, 0, -1, 0, baseColor);\n }\n for (index = 0; index < paths.length; index++) {\n path = paths[index];\n sign = isClockWise(path) === (index === 0) ? -1 : 1;\n for (i = 0; i < path.length; i++) {\n a = path[i], b = path[(i + 1) % path.length];\n length = Math.hypot(b.x - a.x, b.y - a.y);\n if (!length) continue;\n nx = sign * (b.y - a.y) / length, nz = sign * (b.x - a.x) / length;\n addTriangle(context, a, bottom, b, bottom, b, top, nx, 0, nz, baseColor);\n addTriangle(context, a, bottom, b, top, a, top, nx, 0, nz, baseColor);\n }\n }\n}\n", "import { buildAreaPoint } from './buildAreaPoint.js';\nimport { buildAreaPolygon } from './buildAreaPolygon.js';\nimport { parseColor } from '../utils/parseColor.js';\n\nexport function buildAreaFeature(context, feature) {\n const { backend, area, map } = context;\n const coords = area.coords;\n const geometry = feature?.geometry;\n const isTree = geometry?.type === 'Point';\n if (backend.options.nightLight && !isTree) throw new Error('Night lights require Point geometry');\n const polygons = geometry?.type === 'Polygon' ? [geometry.coordinates] :\n geometry?.type === 'MultiPolygon' ? geometry.coordinates : null;\n if (!polygons && !isTree) throw new Error('Unsupported GeoJSON geometry');\n const [lon, lat] = (isTree ? geometry.coordinates : polygons[0]?.[0]?.[0]) ?? [];\n if (!Number.isFinite(lon) || !Number.isFinite(lat)) throw new Error('Invalid GeoJSON coordinates');\n if (coords) {\n const anchor = map.project(new L.LatLng(lat, lon), coords.z);\n if (Math.floor(anchor.x / 256) !== coords.x || Math.floor(anchor.y / 256) !== coords.y) return;\n }\n const style = backend.options.style(feature);\n if (style === null) {\n context.skipped++;\n return;\n }\n if (!style || typeof style !== 'object') throw new Error('style must return an extrusion style or null');\n const { top, bottom = 0, color = 0xd9b38c } = style;\n if (!Number.isFinite(top) || !Number.isFinite(bottom) || bottom < 0 || top <= bottom) {\n throw new Error('Invalid extrusion heights: expected top > bottom >= 0');\n }\n const baseColor = parseColor(color);\n const vertexStart = context.positions.length / 3;\n if (isTree) buildAreaPoint(context, feature, lon, lat, style, baseColor);\n let rings;\n for (rings of polygons || []) buildAreaPolygon(context, rings, top, bottom, baseColor);\n const vertexEnd = context.positions.length / 3;\n context.featureFaces.push({\n id: feature.id ?? feature.properties?.objectid ?? JSON.stringify(geometry),\n properties: feature.properties, baseColor,\n faceStart: vertexStart / 3, faceEnd: vertexEnd / 3, vertexStart, vertexEnd,\n });\n}\n", "/** Compact repeated features only when reconstructed float32 positions compare equal. */\r\nexport function instanceAreaGeometry(context) {\r\n const { positions, normals, colors, featureFaces } = context;\r\n if (context.backend.options.nightLight || featureFaces.length < 2) return context;\r\n const vertices = featureFaces[0].vertexEnd;\r\n const length = vertices * 3;\r\n if (!vertices || positions.length !== length * featureFaces.length) return context;\r\n const origin = [Math.trunc(positions[0]), Math.trunc(positions[1]), Math.trunc(positions[2])];\r\n const template = new Float32Array(length);\r\n let i, instance, axis, face, start;\r\n for (i = 0; i < length; i++) template[i] = positions[i] - origin[i % 3];\r\n const offsets = new Float32Array(featureFaces.length * 4);\r\n for (instance = 0; instance < featureFaces.length; instance++) {\r\n face = featureFaces[instance];\r\n start = instance * length;\r\n if (face.vertexStart !== instance * vertices || face.vertexEnd !== (instance + 1) * vertices) return context;\r\n for (axis = 0; axis < 3; axis++) offsets[instance * 4 + axis] = origin[axis] + positions[start + axis] - positions[axis];\r\n offsets[instance * 4 + 3] = instance * vertices;\r\n for (i = 0; i < length; i++) {\r\n if (Math.fround(template[i] + offsets[instance * 4 + i % 3]) !== Math.fround(positions[start + i]) ||\r\n Math.fround(normals[i]) !== Math.fround(normals[start + i]) ||\r\n Math.fround(colors[i]) !== Math.fround(colors[start + i])) return context;\r\n }\r\n }\r\n return {\r\n positions: template, normals: normals.slice(0, length), colors: colors.slice(0, length),\r\n instanceOffsets: offsets,\r\n };\r\n}\r\n", "import { emptyNode } from '../scene/emptyNode.js';\nimport { createProgram } from '../rendering/createProgram.js';\nimport { cityMapper } from '../constants/cityMapper.js';\nimport { setParent } from '../scene/setParent.js';\nimport { update } from '../scene/update.js';\nimport { instanceAreaGeometry } from './instanceAreaGeometry.js';\n\nexport function attachAreaMesh(context) {\n const { backend, area } = context;\n if (!context.positions.length) {\n Object.assign(area, { mesh: null, buildings: 0, skipped: context.skipped, done: true });\n return;\n }\n const device = backend.renderer.device;\n const data = instanceAreaGeometry(context);\n const attributes = {\n position: { size: 3, data: new Float32Array(data.positions) },\n normal: { size: 3, data: new Float32Array(data.normals) },\n color: { size: 3, data: new Float32Array(data.colors) },\n };\n if (data.instanceOffsets) attributes.instanceOffset = { size: 4, data: data.instanceOffsets };\n if (backend.options.nightLight) attributes.uv = { size: 2, data: new Float32Array(context.uvs) };\n let name, attribute;\n for ([name, attribute] of Object.entries(attributes)) {\n attribute.count = attribute.data.length / attribute.size;\n attribute.buffer = device.createBuffer({\n size: Math.max(4, attribute.data.byteLength),\n usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n });\n device.queue.writeBuffer(attribute.buffer, 0, attribute.data);\n }\n const meshGeometry = {\n device,\n attributes,\n drawRange: { start: 0, count: attributes.position.count },\n };\n Object.assign(area, {\n mesh: {\n ...emptyNode(),\n device,\n geometry: meshGeometry,\n program: createProgram(backend, {\n instanced: Boolean(data.instanceOffsets),\n vertexColors: true, roofTexture: Boolean(backend.options.roofTexture),\n ...(backend.options.nightLight ? { nightLight: true, alphaMode: 'BLEND', doubleSided: true } : {}),\n }),\n id: cityMapper.nextId++,\n renderOrder: 0,\n fadeDuration: 250,\n extras: { featureFaces: context.featureFaces, lights: context.lights },\n },\n buildings: context.featureFaces.length,\n skipped: context.skipped,\n done: true,\n });\n setParent(area.mesh, backend.root);\n update(backend);\n}\n", "export function sourceAreaContext(backend, area, map) {\r\n const crs = map.options.crs, origin = crs.project(backend.location);\r\n return {\r\n backend, area, map, crs, origin,\r\n metres: Math.cos(backend.location.lat * Math.PI / 180),\r\n positions: [], normals: [], colors: [], uvs: [], featureFaces: [], lights: [],\r\n supports: new Set(), skipped: 0,\r\n };\r\n}\n", "import { buildAreaFeature } from './buildAreaFeature.js';\nimport { attachAreaMesh } from './attachAreaMesh.js';\nimport { loadSource } from '../archives/loadSource.js';\nimport { sourceAreaContext } from './sourceAreaContext.js';\nimport { pump } from './pump.js';\n\nexport async function buildArea(backend, area, map) {\n let feature;\n try {\n await new Promise(requestAnimationFrame);\n await map._terrain3D?._terrainPromise;\n if (area.request.signal.aborted) return;\n const data = await loadSource(backend, area);\n if (area.request.signal.aborted) return;\n if (data?.type !== 'FeatureCollection' || !Array.isArray(data.features)) {\n throw new Error('Invalid GeoJSON response');\n }\n if (backend._geojson && typeof backend.options.style !== 'function') {\n throw new Error('style must be a function');\n }\n const context = sourceAreaContext(backend, area, map);\n let deadline = performance.now() + 4;\n for (feature of data.features) {\n if (area.request.signal.aborted) return;\n if (performance.now() >= deadline) {\n await new Promise(requestAnimationFrame);\n if (area.request.signal.aborted) return;\n deadline = performance.now() + 4;\n }\n buildAreaFeature(context, feature);\n }\n attachAreaMesh(context);\n } catch (error) {\n if (!area.request.signal.aborted) {\n area.error = error.message;\n backend.fire('error', { error });\n }\n } finally {\n backend._inflight--;\n pump(backend, map);\n }\n}\n", "import { cityMapper } from '../constants/cityMapper.js';\nimport { emptyNode } from \"../scene/emptyNode.js\";\nimport { isClockWise } from \"../triangulation/isClockWise.js\";\nimport { lampPostGeometry } from \"../geometry/lampPostGeometry.js\";\nimport { lightGeometry } from \"../geometry/lightGeometry.js\";\nimport { parseColor } from \"../utils/parseColor.js\";\nimport { treeGeometry } from \"../geometry/treeGeometry.js\";\nimport { triangulate } from \"../triangulation/triangulate.js\";\nimport { createProgram } from '../rendering/createProgram.js';\nimport { updateStatus } from './updateStatus.js';\nimport { loadSource } from '../archives/loadSource.js';\nimport { setParent } from '../scene/setParent.js';\nimport { update } from '../scene/update.js';\nimport { getElevation } from \"../terrain/getElevation.js\";\nimport { pumpState } from '../constants/pumpState.js';\nimport { compareDistance } from '../utils/compareDistance.js';\nimport { buildArea } from './buildArea.js';\n\npumpState.triangleContexts = [];\n\n/** Share four load/build slots across source layers, nearest ground blocks first. */\nexport function pump(backend, map = backend._map) {\n const shared = map && cityMapper.renderers.get(map);\n if (!shared) return;\n const layers = [];\n let layer, area, center, areaBackend;\n for (layer of shared._layers) {\n if (Number.isFinite(layer._inflight) && layer._areas && (layer.url || layer._geojson)) layers.push(layer);\n }\n const pending = [];\n for (layer of layers) {\n for (area of layer._areas.values()) {\n if (area.started || area.request.signal.aborted) continue;\n center = area.coords && map.project(map.getCenter(), area.coords.z).divideBy(256);\n pending.push({\n layer, area,\n distance: center\n ? Math.hypot(area.coords.x + 0.5 - center.x, area.coords.y + 0.5 - center.y) / 2 ** area.coords.z : 0,\n });\n }\n }\n pending.sort(compareDistance);\n let inflight = 0;\n for (layer of layers) inflight += layer._inflight;\n for ({ layer: areaBackend, area } of pending) {\n if (inflight >= 4) break;\n if (areaBackend._inflight >= 2) continue;\n area.started = true;\n areaBackend._inflight++;\n inflight++;\n buildArea(areaBackend, area, map);\n }\n for (layer of layers) updateStatus(layer);\n}\n", "import { update } from '../scene/update.js';\n\n/** Highlight a source vertex range in the shader; vertex colors stay untouched. */\n\nexport function setHighlight(backend, feature) {\n if (feature?.model) feature = null;\n if (backend.highlightedFeature?.mesh === feature?.mesh &&\n backend.highlightedFeature?.vertexStart === feature?.vertexStart) return;\n if (backend.highlightedFeature) backend.highlightedFeature.mesh.highlight = null;\n backend.highlightedFeature = feature;\n if (feature) feature.mesh.highlight = [feature.vertexStart, feature.vertexEnd];\n update(backend);\n}\n", "/** Update tooltip content/position and arbitrate cursor ownership across shared layers. */\n\nexport function showFeature(backend, feature, event) {\n const tooltip = backend._tooltip;\n if (!tooltip) return;\n if (feature) {\n tooltip.replaceChildren(backend.options.tooltip(feature));\n tooltip.hidden = false;\n const rect = backend.container.getBoundingClientRect();\n const x = event.clientX - rect.left, y = event.clientY - rect.top;\n tooltip.style.left = `${x + tooltip.offsetWidth + 16 > rect.width ? x - tooltip.offsetWidth - 12 : x + 12}px`;\n tooltip.style.top = `${y + tooltip.offsetHeight + 16 > rect.height ? y - tooltip.offsetHeight - 12 : y + 12}px`;\n } else {\n tooltip.hidden = true;\n }\n const shared = backend._shared;\n let layer;\n if (shared) {\n let visible = false;\n for (layer of shared._layers) {\n if (layer._tooltip && !layer._tooltip.hidden) {\n visible = true;\n break;\n }\n }\n if (visible) {\n if (shared._cursor === undefined) shared._cursor = backend.container.style.cursor;\n backend.container.style.cursor = 'pointer';\n } else if (shared._cursor !== undefined) {\n backend.container.style.cursor = shared._cursor;\n delete shared._cursor;\n }\n }\n}\n", "import { setHighlight } from '../picking/setHighlight.js';\nimport { showFeature } from '../picking/showFeature.js';\nimport { setParent } from '../scene/setParent.js';\nimport { update } from '../scene/update.js';\n\n/** Cancel pending work and dispose this block's GPU data, including any hover highlight. */\nexport function releaseArea(backend, area) {\n area.request.abort();\n let attribute;\n if (area.mesh) {\n if (backend.highlightedFeature?.mesh === area.mesh) {\n setHighlight(backend, null);\n backend.hoveredFeature = null;\n showFeature(backend, null);\n }\n setParent(area.mesh, null);\n update(backend);\n const geometry = area.mesh.geometry;\n for (attribute of Object.values(geometry.attributes)) attribute.buffer.destroy();\n area.mesh.program.pipelineCache.clear();\n }\n}\n", "export function compareAreaDistance(a, b) {\n return Math.hypot(a[1].x - a[2].x, a[1].y - a[2].y) -\n Math.hypot(b[1].x - b[2].x, b[1].y - b[2].y);\n}\n", "import { pump } from \"./pump.js\";\nimport { releaseArea } from './releaseArea.js';\nimport { compareAreaDistance } from './compareAreaDistance.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 let x, y, key, area, coords;\n for (x = Math.max(0, nw.x - 1, archiveNW.x); x <= Math.min(2 ** z - 1, se.x + 1, archiveSE.x); x++) {\n for (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 ([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 const areas = [];\n for ([key, coords] of wanted) areas.push([key, coords, center]);\n areas.sort(compareAreaDistance);\n for ([key, coords] of areas) {\n if (!backend._areas.has(key)) backend._areas.set(key, { coords, request: new AbortController() });\n }\n pump(backend);\n}\n", "import { getElevation } from './getElevation.js';\r\n\r\nexport function setTerrainHeight(layer) {\r\n if (!layer.root || !layer.location) return;\r\n layer._terrainBaseY ??= layer.root.position[1];\r\n const terrain = layer._map?._terrain3D;\r\n const elevation = terrain && getElevation(terrain, layer.location);\r\n const offset = Number.isFinite(elevation) ? layer.options.terrainOffset ?? 0 : 0;\r\n layer.root.position[1] = layer._terrainBaseY + (elevation ?? 0) + offset;\r\n}\r\n", "export const attachState = {};\n", "export function showWebGPUWarning(map) {\n const container = map.getContainer();\n if (container.querySelector('.leaflet-webgpu-warning')) return;\n const warning = document.createElement('div');\n warning.className = 'leaflet-webgpu-warning';\n warning.setAttribute('role', 'alert');\n warning.style.cssText = 'position:absolute;z-index:1000;top:50%;left:50%;transform:translate(-50%,-50%);max-width:calc(100% - 32px);box-sizing:border-box;padding:12px 16px;border:1px solid #c98b24;border-radius:6px;background:#fff8e6;box-shadow:0 3px 12px #0005;color:#30251d;font:14px/1.5 sans-serif;text-align:center;pointer-events:auto';\n warning.append('WebGPU is not available in this browser or device. ');\n const link = document.createElement('a');\n link.href = 'https://developer.mozilla.org/en-US/docs/Web/API/WebGPU_API#browser_compatibility';\n link.target = '_blank';\n link.rel = 'noopener noreferrer';\n link.textContent = 'Learn more';\n warning.append(link);\n container.append(warning);\n}\n", "import { showWebGPUWarning } from './showWebGPUWarning.js';\nimport { cityMapper } from '../constants/cityMapper.js';\n\nexport function failAttachment(error, backend, map) {\n showWebGPUWarning(map);\n backend._rendererReady.reject(error);\n cityMapper.renderers.delete(map);\n throw error;\n}\n", "import { failAttachment } from './failAttachment.js';\n\nexport async function requestAdapter(backend, map) {\n let adapter;\n try {\n adapter = await navigator.gpu.requestAdapter();\n } catch (error) {\n failAttachment(error, backend, map);\n }\n if (!adapter) failAttachment(new Error('Unable to acquire a WebGPU adapter'), backend, map);\n return adapter;\n}\n", "import { failAttachment } from './failAttachment.js';\n\nexport async function requestDevice(adapter, backend, map) {\n try {\n return await adapter.requestDevice();\n } catch (error) {\n failAttachment(error, backend, map);\n }\n}\n", "import { attachState } from '../constants/attachState.js';\nimport { cityMapper } from '../constants/cityMapper.js';\n\nexport function rendererDeviceError(event) {\n const map = attachState.rendererDevices.get(event.currentTarget);\n const owner = cityMapper.renderers.get(map);\n if (owner?.renderer?.device !== event.currentTarget) return;\n let layer;\n for (layer of owner._layers || []) layer.fire('error', { error: event.error });\n}\n", "import { attachState } from '../constants/attachState.js';\nimport { cityMapper } from '../constants/cityMapper.js';\n\nexport function rendererDeviceLost([info, device]) {\n const map = attachState.rendererDevices.get(device);\n const owner = cityMapper.renderers.get(map);\n if (!owner || owner.renderer?.device !== device) return;\n const error = new Error(`WebGPU device lost: ${info.message || info.reason}`);\n let layer;\n for (layer of owner._layers) layer.fire('error', { error });\n}\n", "import { createProgram } from '../rendering/createProgram.js';\n\nexport function restoreObject(backend, shared, object) {\n let name, attribute, data, size, count, normalized, key, texture;\n if (object.geometry && object.geometry.device !== shared.renderer.device) {\n const geometry = object.geometry;\n const material = object.program._layerMaterial;\n const attributes = {};\n for (name of ['position', 'normal', 'color', 'uv', 'index', 'instanceOffset']) {\n attribute = geometry.attributes[name];\n if (!attribute) continue;\n ({ data, size, count, normalized } = attribute);\n attributes[name] = { data: data.slice(0, count * size), size, normalized };\n }\n const device = shared.renderer.device;\n if (attributes.index?.data instanceof Uint8Array) {\n attributes.index.data = Uint16Array.from(attributes.index.data);\n }\n for ([name, attribute] of Object.entries(attributes)) {\n attribute.size ||= 1;\n attribute.count = attribute.data.length / attribute.size;\n attribute.indexFormat = attribute.data instanceof Uint32Array ? 'uint32' : 'uint16';\n attribute.buffer = device.createBuffer({\n size: Math.max(4, attribute.data.byteLength),\n usage: name === 'index'\n ? GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST\n : GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n });\n device.queue.writeBuffer(attribute.buffer, 0, attribute.data);\n }\n object.geometry = {\n device,\n attributes,\n drawRange: { start: 0, count: attributes.index?.count || attributes.position.count },\n };\n for (attribute of Object.values(geometry.attributes)) attribute.buffer.destroy();\n object.bindGroup = null;\n object.boundTextures = [];\n for (key of ['baseTexture', 'metalTexture', 'emissiveTexture', 'occlusionTexture']) {\n texture = material[key];\n if (!texture || texture.device === device) continue;\n material[key] = {\n ...texture,\n device,\n texture: device.createTexture({\n size: [texture.image.width, texture.image.height],\n format: texture.format,\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,\n }),\n sampler: device.createSampler(texture.samplerOptions),\n uploaded: null,\n };\n }\n object.program.pipelineCache.clear();\n object.program = createProgram(backend, material);\n object.device = device;\n }\n if (object.texture && object.texture.device !== shared.renderer.device) {\n object.texture = {\n ...object.texture,\n device: shared.renderer.device,\n texture: shared.renderer.device.createTexture({\n size: [object.texture.image.width, object.texture.image.height],\n format: object.texture.format,\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,\n }),\n sampler: shared.renderer.device.createSampler(object.texture.samplerOptions),\n uploaded: null,\n };\n }\n}\n", "import { cityMapper } from '../constants/cityMapper.js';\nimport { emptyNode } from './emptyNode.js';\nimport { setParent } from './setParent.js';\nimport { createProgram } from '../rendering/createProgram.js';\nimport { endZoom } from './endZoom.js';\nimport { onMapChange } from './onMapChange.js';\nimport { onZoomAnim } from './onZoomAnim.js';\nimport { render } from '../rendering/render.js';\nimport { startZoom } from './startZoom.js';\nimport { update } from './update.js';\nimport { updateArea } from '../sources/updateArea.js';\nimport { setTerrainHeight } from '../terrain/setTerrainHeight.js';\nimport { resizeSunlight } from '../shadows/resizeSunlight.js';\nimport { attachState } from '../constants/attachState.js';\nimport { noOperation } from '../utils/noOperation.js';\nimport { failAttachment } from './failAttachment.js';\nimport { requestAdapter } from './requestAdapter.js';\nimport { requestDevice } from './requestDevice.js';\nimport { rendererDeviceError } from './rendererDeviceError.js';\nimport { rendererDeviceLost } from './rendererDeviceLost.js';\nimport { restoreObject } from './restoreObject.js';\n\nattachState.rendererDevices = new WeakMap();\n\n/** WebGPU device attachment, materials/pipelines and draw calls. */\n/**\n * Join/create this map's shared scene and rebuild GPU objects if its context changed.\n * Buffer/program handles belong to one context; typed arrays and decoded images do not.\n * @private\n */\n\nexport async function attach(backend, map) {\n let shared = cityMapper.renderers.get(map);\n if (shared?._rendererReady) {\n await shared._rendererReady.promise;\n }\n if (!shared) {\n shared = backend;\n backend._rendererReady = Promise.withResolvers();\n backend._rendererReady.promise.catch(noOperation);\n cityMapper.renderers.set(map, shared);\n const canvas = document.createElement('canvas');\n if (!navigator.gpu) {\n failAttachment(new Error('Layer3D requires WebGPU'), backend, map);\n }\n const adapter = await requestAdapter(backend, map);\n const device = await requestDevice(adapter, backend, map);\n attachState.rendererDevices.set(device, map);\n device.addEventListener('uncapturederror', rendererDeviceError);\n Promise.all([device.lost, Promise.resolve(device)]).then(rendererDeviceLost);\n const context = canvas.getContext('webgpu');\n if (!context) {\n device.destroy();\n failAttachment(new Error('Unable to create a WebGPU canvas context'), backend, map);\n }\n const format = navigator.gpu.getPreferredCanvasFormat();\n context.configure({ device, format, alphaMode: 'premultiplied' });\n map.getContainer().querySelector('.leaflet-webgpu-warning')?.remove();\n backend._shared = backend;\n backend._layers = new Set();\n backend._sceneOrigin = backend.location;\n backend.scene = emptyNode();\n // Perspective camera state: fov in degrees, near/far in scene metres.\n backend.camera = {\n position: [0, 0, 0],\n up: [0, 1, 0],\n target: [0, 0, 0],\n viewMatrix: [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],\n projectionMatrix: [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],\n projectionViewMatrix: [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],\n fov: 45,\n aspect: 1,\n near: 0.1,\n far: 10000,\n };\n backend.renderer = {\n device,\n context,\n format,\n canvas,\n dpr: Math.min(window.devicePixelRatio, 2)\n };\n const layout = device.createBindGroupLayout({\n entries: [\n { binding: 0, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, buffer: { type: 'uniform' } },\n { binding: 1, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: 'depth' } },\n { binding: 2, visibility: GPUShaderStage.FRAGMENT, sampler: { type: 'comparison' } },\n { binding: 3, visibility: GPUShaderStage.FRAGMENT, buffer: { type: 'read-only-storage' } },\n ]\n });\n const buffer = backend.renderer.device.createBuffer({ size: 80, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST });\n const sampler = backend.renderer.device.createSampler({ compare: 'less-equal', minFilter: 'linear', magFilter: 'linear' });\n const lights = backend.renderer.device.createBuffer({ size: 32, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST });\n backend.renderer.sunlight = { layout, buffer, sampler, lights, size: 0 };\n const values = new Float32Array(20);\n values.set([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);\n backend.renderer.device.queue.writeBuffer(buffer, 0, values);\n resizeSunlight(backend, 1);\n const emptyImage = document.createElement('canvas');\n emptyImage.width = 1;\n emptyImage.height = 1;\n backend.renderer.roofFallbackTexture = {\n device,\n texture: device.createTexture({\n size: [1, 1],\n format: 'rgba8unorm',\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,\n }),\n sampler: device.createSampler({\n addressModeU: 'clamp-to-edge', addressModeV: 'clamp-to-edge',\n }),\n image: emptyImage, format: 'rgba8unorm', srgb: false, uploaded: null,\n };\n shared._size = null;\n canvas.className = 'leaflet-3d';\n canvas.style.cssText = 'position:absolute;top:0;left:0;pointer-events:none';\n canvas.setAttribute('role', 'img');\n canvas.setAttribute('aria-label', backend.options.ariaLabel ?? '3D scene');\n let pane = map.getPane('webgpuPane');\n if (!pane) {\n pane = map.createPane('webgpuPane', map.getContainer());\n // The pitch sky uses 0 and may be inserted after this pane.\n pane.style.zIndex = 1;\n pane.style.pointerEvents = 'none';\n }\n pane.append(canvas);\n map.on('move zoom rotate pitch resize viewreset layeradd layerremove', onMapChange, shared);\n map.on('zoomstart', startZoom, shared);\n map.on('zoomanim', onZoomAnim, shared);\n map.on('zoomend', endZoom, shared);\n backend._rendererReady.resolve();\n delete shared._rendererReady;\n render(shared);\n cityMapper.renderers.set(map, shared);\n }\n const origin = map.options.crs.project(shared._sceneOrigin);\n const point = map.options.crs.project(backend.location);\n const metres = Math.cos(shared._sceneOrigin.lat * Math.PI / 180);\n backend._terrainBaseY ??= backend.root.position[1];\n backend.root.position[0] = (point.x - origin.x) * metres;\n backend.root.position[1] = backend._terrainBaseY;\n backend.root.position[2] = -(point.y - origin.y) * metres;\n setTerrainHeight(backend);\n // Each group's metres are measured at its own latitude, not the shared camera origin.\n backend.root.scale.fill(metres / Math.cos(backend.location.lat * Math.PI / 180));\n backend._shared = shared;\n backend.renderer = shared.renderer;\n backend.scene = shared.scene;\n backend.camera = shared.camera;\n shared._layers.add(backend);\n setParent(backend.root, shared.scene);\n const pendingObjects = [backend.root];\n let object, i;\n while (pendingObjects.length) {\n object = pendingObjects.pop();\n restoreObject(backend, shared, object);\n for (i = object.children.length - 1; i >= 0; i--) pendingObjects.push(object.children[i]);\n }\n update(shared);\n if ((backend.header && backend._type !== 'pmtiles') || backend._geojson) updateArea(backend);\n}\n", "import { raycast } from './raycast.js';\n\n/**\n * Translate a geometry hit into a configured model or batched source feature.\n * Sorted half-open face ranges permit binary search without a feature per triangle.\n * @returns {PickedFeature|null}\n */\n\nexport function findFeature(backend, event) {\n if (!backend.root || !backend.camera) {\n return null;\n }\n let hit, object, ranges, low, high, middle, range;\n for (hit of raycast(backend, event, backend.root.children, Boolean(backend.model))) {\n if (backend.model) {\n object = hit.object;\n while (object && object !== backend.model) {\n object = object.parent;\n }\n if (object === backend.model) {\n return {\n id: backend.model.id, properties: backend.model.extras,\n model: backend.model, mesh: hit.object, point: hit.point\n };\n }\n }\n ranges = hit.object.extras?.featureFaces;\n if (!ranges) {\n continue;\n }\n low = 0, high = ranges.length - 1;\n while (low <= high) {\n middle = (low + high) >> 1;\n range = ranges[middle];\n if (hit.faceIndex < range.faceStart) {\n high = middle - 1;\n } else if (hit.faceIndex >= range.faceEnd) {\n low = middle + 1;\n } else {\n return {\n ...range,\n mesh: hit.object,\n point: hit.point\n };\n }\n }\n }\n return null;\n}\n", "import { findFeature } from './findFeature.js';\nimport { setHighlight } from './setHighlight.js';\nimport { showFeature } from './showFeature.js';\n\n/** Emit click without moving the map or pinning the tooltip. */\n\nexport function onClick(layer, event) {\n const feature = findFeature(layer, event);\n layer.hoveredFeature = feature;\n setHighlight(layer, feature);\n showFeature(layer, feature, event);\n layer.fire('featureclick', { feature, originalEvent: event });\n}\n", "import { setHighlight } from './setHighlight.js';\nimport { showFeature } from './showFeature.js';\n\n/** Clear hover, highlight and tooltip without retaining a selected feature. */\n\nexport function onPointerLeave(layer) {\n layer.hoveredFeature = null;\n setHighlight(layer, null);\n showFeature(layer, null);\n layer.fire('featurehover', { feature: null });\n}\n", "import { findFeature } from './findFeature.js';\nimport { setHighlight } from './setHighlight.js';\nimport { showFeature } from './showFeature.js';\n\n/** Hover is transient; featurehover also reports misses with feature:null. */\n\nexport function onPointerMove(layer, event) {\n layer.hoveredFeature = findFeature(layer, event);\n setHighlight(layer, layer.hoveredFeature);\n showFeature(layer, layer.hoveredFeature, event);\n layer.fire('featurehover', {\n feature: layer.hoveredFeature,\n originalEvent: event\n });\n}\n", "import * as onPointerMove from './onPointerMove.js';\n\nexport function pointerMove(event) {\n onPointerMove.onPointerMove(this, event);\n}\n", "import * as onClick from './onClick.js';\n\nexport function pointerClick(event) {\n onClick.onClick(this, event);\n}\n", "import * as onPointerLeave from './onPointerLeave.js';\n\nexport function pointerLeave() {\n onPointerLeave.onPointerLeave(this);\n}\n", "import * as attach from './attach.js';\n\nexport async function attachLayer(backend, map) {\n try {\n await attach.attach(backend, map);\n backend._added.resolve();\n } catch (error) {\n backend.fire('error', { error });\n }\n}\n", "import * as attach from './attach.js';\nimport * as onClick from '../picking/onClick.js';\nimport * as onPointerLeave from '../picking/onPointerLeave.js';\nimport * as onPointerMove from '../picking/onPointerMove.js';\nimport { pointerMove } from '../picking/pointerMove.js';\nimport { pointerClick } from '../picking/pointerClick.js';\nimport { pointerLeave } from '../picking/pointerLeave.js';\nimport { attachLayer } from './attachLayer.js';\n\n/** Attach interaction immediately; initialization may finish before or after onAdd. */\nexport function onAdd3DLayer(backend, map) {\n if (!backend.location) {\n const center = map.getCenter();\n backend.location = new L.LatLng(center.lat, center.lng);\n }\n if (backend.url || backend._geojson || backend.options.tooltip || backend.modelUrl) {\n backend.container = map.getContainer();\n backend._pointerEvents ||= {\n mousemove: pointerMove,\n click: pointerClick,\n mouseleave: pointerLeave,\n };\n if (backend.options.tooltip) {\n backend._tooltip = L.DomUtil.create('div', 'leaflet-3d-tooltip', backend.container);\n backend._tooltip.hidden = true;\n backend._tooltip.setAttribute('role', 'tooltip');\n backend._tooltip.setAttribute('aria-live', 'polite');\n backend._tooltip.style.cssText = 'position:absolute;z-index:600;max-width:220px;padding:10px 12px;border:1px solid #6b5140;border-radius:6px;background:#fffaf0;box-shadow:0 3px 12px #0005;color:#30251d;font:13px/1.45 sans-serif;pointer-events:none';\n }\n L.DomEvent.on(backend.container, backend._pointerEvents, backend);\n }\n if (backend.root) {\n attachLayer(backend, map);\n }\n}\n", "export async function releaseRenderer(renderer, backend) {\n try {\n await renderer.device.queue.onSubmittedWorkDone();\n renderer.depthTexture?.destroy();\n renderer.roofFallbackTexture?.texture?.destroy();\n renderer.uniformBuffer?.destroy();\n renderer.sunlight?.texture?.destroy();\n renderer.sunlight?.buffer?.destroy();\n renderer.sunlight?.lights?.destroy();\n } catch (error) {\n backend.fire('error', { error });\n }\n renderer.device.destroy();\n}\n", "import { cityMapper } from '../constants/cityMapper.js';\nimport * as destroyTexture from '../rendering/destroyTexture.js';\nimport * as endZoom from './endZoom.js';\nimport * as onMapChange from './onMapChange.js';\nimport * as onPointerLeave from '../picking/onPointerLeave.js';\nimport * as onZoomAnim from './onZoomAnim.js';\nimport { releaseArea } from '../sources/releaseArea.js';\nimport { updateStatus } from '../sources/updateStatus.js';\nimport { setParent } from './setParent.js';\nimport * as startZoom from './startZoom.js';\nimport { cancelUpdate } from './cancelUpdate.js';\nimport { update } from './update.js';\nimport { releaseRenderer } from './releaseRenderer.js';\n\n/** Release source meshes/UI; retain manually added objects and model CPU data. */\nexport function onRemove3DLayer(backend, map) {\n backend._added = Promise.withResolvers();\n if (backend.container) {\n onPointerLeave.onPointerLeave(backend);\n L.DomEvent.off(backend.container, backend._pointerEvents, backend);\n backend.container = null;\n }\n let area, key, layer, animation;\n for (area of backend._areas.values()) releaseArea(backend, area);\n backend._areas.clear();\n backend._tooltip?.remove();\n backend._tooltip = null;\n if (backend.url || backend._geojson) updateStatus(backend, false);\n const shared = backend._shared;\n if (!shared) return;\n setParent(backend.root, null);\n shared._layers.delete(backend);\n if (shared === backend) {\n map.off('move zoom rotate pitch resize viewreset layeradd layerremove', onMapChange.onMapChange, backend);\n map.off('zoomstart', startZoom.startZoom, backend);\n map.off('zoomanim', onZoomAnim.onZoomAnim, backend);\n map.off('zoomend', endZoom.endZoom, backend);\n cancelUpdate(backend);\n if (backend._layers.size) {\n // Keep the original scene origin and GPU resources when ownership changes.\n const next = backend._layers.values().next().value;\n for (key of ['_layers', '_sceneOrigin', '_size', '_zoomLevel', '_zoomTransitions', '_zoomView', '_cursor', '_roofRaster']) {\n next[key] = backend[key];\n delete backend[key];\n }\n for (layer of next._layers) layer._shared = next;\n cityMapper.renderers.set(map, next);\n map.on('move zoom rotate pitch resize viewreset layeradd layerremove', onMapChange.onMapChange, next);\n map.on('zoomstart', startZoom.startZoom, next);\n map.on('zoomanim', onZoomAnim.onZoomAnim, next);\n map.on('zoomend', endZoom.endZoom, next);\n update(next);\n } else {\n if (backend._roofRaster) destroyTexture.destroyTexture(backend, backend._roofRaster.texture.texture);\n backend._roofRaster = null;\n for (animation of backend._zoomTransitions?.keys() || []) animation.play();\n backend._zoomTransitions = null;\n backend._zoomView = null;\n delete map._cameraView;\n map.getContainer().classList.remove('leaflet-camera-zoom');\n const renderer = backend.renderer;\n renderer.canvas.remove();\n releaseRenderer(renderer, backend);\n cityMapper.renderers.delete(map);\n for (key of ['_layers', '_sceneOrigin', '_size', '_zoomLevel', '_cursor']) delete backend[key];\n }\n } else update(shared);\n backend._shared = backend.renderer = backend.scene = backend.camera = null;\n}\n", "import { releaseArea } from '../sources/releaseArea.js';\nimport { updateArea } from \"../sources/updateArea.js\";\n\n/** GeoJSON source areas: loading, building and releasing. */\n\nexport function onTerrainChange(layer) {\n if (!layer._map) return;\n let area;\n for (area of layer._areas.values()) {\n releaseArea(layer, area);\n }\n layer._areas.clear();\n updateArea(layer);\n}\n", "export function hasUnsupportedPrimitives(meshes) {\n if (!meshes) return false;\n let mesh, primitive;\n for (mesh of meshes) {\n for (primitive of mesh.primitives) {\n if (primitive.targets || (primitive.mode !== undefined && primitive.mode !== 4)) return true;\n }\n }\n return false;\n}\n", "/** Decode a static glTF JSON document or GLB v2 container. */\nimport { hasUnsupportedPrimitives } from './hasUnsupportedPrimitives.js';\n\nexport function decodeModel(data) {\n const view = new DataView(data), decoder = new TextDecoder();\n let description;\n let offset, length, type, chunk;\n if (view.getUint32(0, true) === 0x46546c67) {\n // Decode GLB v2 chunks; unknown types are skipped.\n if (view.getUint32(4, true) !== 2 || view.getUint32(8, true) !== data.byteLength) {\n throw new Error('Invalid GLB header');\n }\n let binary;\n for (offset = 12; offset < data.byteLength;) {\n if (offset + 8 > data.byteLength) {\n throw new Error('Truncated GLB chunk');\n }\n length = view.getUint32(offset, true), type = view.getUint32(offset + 4, true);\n offset += 8;\n if (offset + length > data.byteLength) {\n throw new Error('Truncated GLB data');\n }\n chunk = data.slice(offset, offset + length);\n if (type === 0x4e4f534a) {\n description = JSON.parse(decoder.decode(chunk));\n }\n if (type === 0x004e4942) {\n binary = chunk;\n }\n offset += length;\n }\n if (!description) {\n throw new Error('Missing GLB JSON');\n }\n if (binary) {\n description.buffers[0].binary = binary;\n }\n } else {\n description = JSON.parse(decoder.decode(data));\n }\n if (description.skins?.length || description.animations?.length || description.extensionsRequired?.length || hasUnsupportedPrimitives(description.meshes)) {\n throw new Error('Layer3D supports static triangle glTF models without required extensions');\n }\n return description;\n}\n", "/** 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 let i, a, b, c, u, v, j, n, index, length;\n for (i = 0; i < (indices?.length || p.length / 3); i += 3) {\n a = indices ? indices[i] : i, b = indices ? indices[i + 1] : i + 1, c = indices ? indices[i + 2] : i + 2;\n u = [], v = [];\n for (j = 0; j < 3; j++) {\n u.push(p[b * 3 + j] - p[a * 3 + j]);\n v.push(p[c * 3 + j] - p[a * 3 + j]);\n }\n 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 (index of [a, b, c]) {\n for (j = 0; j < 3; j++) {\n normals[index * 3 + j] += n[j];\n }\n }\n }\n for (i = 0; i < normals.length; i += 3) {\n length = Math.hypot(...normals.subarray(i, i + 3)) || 1;\n for (j = 0; j < 3; j++) {\n normals[i + j] /= length;\n }\n }\n return normals;\n}\n", "export function collectMeshes(node, meshes) {\n if (node.geometry?.attributes.position) meshes.push(node);\n let child;\n for (child of node.children) collectMeshes(child, meshes);\n}\n", "import { computeBounds } from './computeBounds.js';\nimport { getElevation } from '../terrain/getElevation.js';\nimport { update } from '../scene/update.js';\nimport { updateWorldMatrix } from '../scene/updateWorldMatrix.js';\nimport { vertexNormals } from './vertexNormals.js';\nimport { collectMeshes } from '../collision/collectMeshes.js';\nimport { HEIGHT } from '../constants/HEIGHT.js';\n\nexport function conformModelToTerrain(layer, terrain) {\n if (!layer.model) return;\n const meshes = [];\n collectMeshes(layer.model, meshes);\n let mesh, positions, geometry, position, normals, attribute, normal, world, inverse, i, x, y, z;\n let worldY, weight, worldX, worldZ, point, elevation, offset;\n if (!terrain?._terrainReady || !layer.options.terrainConform) {\n for (mesh of meshes) {\n positions = mesh.geometry._terrainBasePositions;\n if (!positions) continue;\n geometry = mesh.geometry, position = geometry.attributes.position;\n position.data.set(positions);\n mesh.device.queue.writeBuffer(position.buffer, 0, positions);\n normals = geometry._terrainBaseNormals;\n if (normals) {\n geometry.attributes.normal.data.set(normals);\n mesh.device.queue.writeBuffer(geometry.attributes.normal.buffer, 0, normals);\n }\n computeBounds(geometry);\n }\n return;\n }\n\n updateWorldMatrix(layer.root);\n const map = layer._map, crs = map.options.crs;\n const origin = crs.project(layer._shared._sceneOrigin);\n const metres = Math.cos(layer._shared._sceneOrigin.lat * Math.PI / 180);\n const pixelScale = crs.scale(terrain._terrainZoom);\n\n for (mesh of meshes) {\n geometry = mesh.geometry, attribute = geometry.attributes.position;\n geometry._terrainBasePositions ||= attribute.data.slice();\n normal = geometry.attributes.normal;\n geometry._terrainBaseNormals ||= normal.data.slice();\n attribute.data.set(geometry._terrainBasePositions);\n world = mesh.worldMatrix, inverse = new DOMMatrix(world).inverse().toFloat64Array();\n for (i = 0; i < attribute.data.length; i += 3) {\n x = attribute.data[i], y = attribute.data[i + 1], z = attribute.data[i + 2];\n worldY = world[1] * x + world[5] * y + world[9] * z + world[13];\n weight = Math.max(0, Math.min(1, 1 - (worldY - layer.root.position[1]) / HEIGHT));\n if (!weight) continue;\n worldX = world[0] * x + world[4] * y + world[8] * z + world[12];\n worldZ = world[2] * x + world[6] * y + world[10] * z + world[14];\n point = crs.transformation.transform(new L.Point(\n origin.x + worldX / metres, origin.y - worldZ / metres), pixelScale);\n elevation = getElevation(terrain, point);\n if (!Number.isFinite(elevation)) continue;\n offset = (elevation - worldY) * weight;\n attribute.data[i] += inverse[4] * offset;\n attribute.data[i + 1] += inverse[5] * offset;\n attribute.data[i + 2] += inverse[6] * offset;\n }\n mesh.device.queue.writeBuffer(attribute.buffer, 0, attribute.data);\n normal.data.set(vertexNormals(attribute.data, geometry.attributes.index?.data));\n mesh.device.queue.writeBuffer(normal.buffer, 0, normal.data);\n computeBounds(geometry);\n }\n update(layer);\n}\n", "export async function loadBuffer(buffer, directory) {\r\n if (buffer.binary) return;\r\n const response = await fetch(new URL(buffer.uri, directory).href);\r\n if (!response.ok) throw new Error(`Unable to load model buffer: HTTP ${response.status}`);\r\n buffer.binary = await response.arrayBuffer();\r\n}\r\n", "export async function loadImage(description, directory, image) {\r\n let blob;\r\n if (image.bufferView !== undefined) {\r\n const view = description.bufferViews[image.bufferView];\r\n const buffer = description.buffers[view.buffer].binary;\r\n blob = new Blob([buffer.slice(view.byteOffset || 0, (view.byteOffset || 0) + view.byteLength)],\r\n { type: image.mimeType });\r\n } else {\r\n const response = await fetch(new URL(image.uri, directory).href);\r\n if (!response.ok) throw new Error(`Unable to load model texture: HTTP ${response.status}`);\r\n blob = await response.blob();\r\n }\r\n // Preserve straight alpha and raw samples; GPU sRGB formats do color decoding.\r\n return createImageBitmap(blob, { premultiplyAlpha: 'none', colorSpaceConversion: 'none' });\r\n}\r\n", "/** Translate glTF sampler constants into WebGPU sampler options. */\n\nexport function textureSampler(sampler) {\n return {\n addressModeU: sampler.wrapS === 33071 ? 'clamp-to-edge' : sampler.wrapS === 33648 ? 'mirror-repeat' : 'repeat',\n addressModeV: sampler.wrapT === 33071 ? 'clamp-to-edge' : sampler.wrapT === 33648 ? 'mirror-repeat' : 'repeat',\n magFilter: sampler.magFilter === 9728 ? 'nearest' : 'linear',\n minFilter: sampler.minFilter === 9728 || sampler.minFilter === 9984 || sampler.minFilter === 9986 ? 'nearest' : 'linear',\n };\n}\n", "import { textureSampler } from './textureSampler.js';\r\n\r\nexport function textureFor(context, reference, color = false) {\r\n const { backend, description, images, textures } = context;\r\n if (!reference) return null;\r\n if ((reference.texCoord || 0) !== 0 || reference.extensions) {\r\n throw new Error('Model textures currently require untransformed TEXCOORD_0 UVs');\r\n }\r\n const device = backend.renderer.device;\r\n // A glTF image may serve both color and data maps: those cannot share a GPU format.\r\n const key = `${reference.index}:${color}`;\r\n if (!textures.has(key)) {\r\n const texture = description.textures[reference.index];\r\n const sampler = description.samplers?.[texture.sampler] || {};\r\n const image = images[texture.source];\r\n const format = color ? 'rgba8unorm-srgb' : 'rgba8unorm';\r\n const samplerOptions = textureSampler(sampler);\r\n textures.set(key, {\r\n device,\r\n texture: device.createTexture({\r\n size: [image.width, image.height],\r\n format,\r\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,\r\n }),\r\n sampler: device.createSampler(samplerOptions),\r\n samplerOptions,\r\n format,\r\n srgb: color,\r\n image,\r\n flipY: false,\r\n uploaded: null,\r\n });\r\n }\r\n return textures.get(key);\r\n}\r\n", "import { textureFor } from './textureFor.js';\r\n\r\nexport function materialFor(context, material) {\r\n const { backend } = context;\r\n const pbr = material.pbrMetallicRoughness || {};\r\n return {\r\n color: (pbr.baseColorFactor || [1, 1, 1, 1]).slice(0, 3),\r\n opacity: pbr.baseColorFactor?.[3] ?? 1,\r\n metallic: pbr.metallicFactor ?? 1,\r\n roughness: pbr.roughnessFactor ?? 1,\r\n baseTexture: textureFor(context, pbr.baseColorTexture, true),\r\n metalTexture: textureFor(context, pbr.metallicRoughnessTexture),\r\n emissiveTexture: textureFor(context, material.emissiveTexture, true),\r\n occlusionTexture: textureFor(context, material.occlusionTexture),\r\n emissive: material.emissiveFactor || [0, 0, 0],\r\n occlusionStrength: material.occlusionTexture?.strength ?? 1,\r\n alphaMode: backend.options.alphaMode || material.alphaMode || 'OPAQUE',\r\n alphaCutoff: material.alphaCutoff ?? 0.5,\r\n doubleSided: material.doubleSided,\r\n };\r\n}\r\n", "/** glTF quaternion/translation/scale to a column-major matrix. */\n\nexport function nodeMatrix(spec) {\n if (spec.matrix) return Array.from(spec.matrix);\n // glTF stores quaternions [x,y,z,w]; convert directly to a scaled column-major matrix.\n const [x, y, z, w] = spec.rotation || [0, 0, 0, 1], [sx, sy, sz] = spec.scale || [1, 1, 1];\n return [\n (1 - 2 * (y * y + z * z)) * sx,\n 2 * (x * y + z * w) * sx,\n 2 * (x * z - y * w) * sx,\n 0,\n 2 * (x * y - z * w) * sy,\n (1 - 2 * (x * x + z * z)) * sy,\n 2 * (y * z + x * w) * sy, 0,\n 2 * (x * z + y * w) * sz,\n 2 * (y * z - x * w) * sz,\n (1 - 2 * (x * x + y * y)) * sz,\n 0,\n ...(spec.translation || [0, 0, 0]),\n 1,\n ];\n}\n", "export const types = {\n 5120: Int8Array,\n 5121: Uint8Array,\n 5122: Int16Array,\n 5123: Uint16Array,\n 5125: Uint32Array,\n 5126: Float32Array,\n};\n", "export const sizes = { SCALAR: 1, VEC2: 2, VEC3: 3, VEC4: 4 };\n", "export function readAccessorValues(description, Type, size, data, accessorCount, indices, viewIndex, offset, count, stride) {\n const view = description.bufferViews[viewIndex], bytes = Type.BYTES_PER_ELEMENT;\n const buffer = description.buffers[view.buffer].binary;\n stride ||= size * bytes;\n if (!buffer || stride < size * bytes || offset < 0 ||\n (view.byteOffset || 0) + view.byteLength > buffer.byteLength ||\n (count - 1) * stride + size * bytes + offset > view.byteLength) throw new Error('glTF accessor outside buffer view');\n let i, values, output;\n for (i = 0; i < count; i++) {\n values = new Type(buffer.slice((view.byteOffset || 0) + offset + i * stride,\n (view.byteOffset || 0) + offset + i * stride + size * bytes));\n output = indices ? indices[i] : i;\n if (indices && output >= accessorCount) throw new Error('Invalid sparse glTF index');\n data.set(values, output * size);\n }\n}\n", "import { types } from \"../constants/accessorTypes.js\";\nimport { sizes } from \"../constants/accessorSizes.js\";\nimport { readAccessorValues } from './readAccessorValues.js';\n\n/** Decode packed, interleaved, normalized or sparse glTF accessor data. */\n\nexport function readAccessor(description, index) {\n const spec = description.accessors[index], Type = types[spec.componentType], size = sizes[spec.type];\n if (!Type || !size || !Number.isInteger(spec.count) || spec.count < 0) {\n throw new Error('Invalid glTF accessor');\n }\n const data = new Type(spec.count * size);\n if (spec.bufferView !== undefined) {\n readAccessorValues(\n description, Type, size, data, spec.count, null,\n spec.bufferView,\n spec.byteOffset || 0,\n spec.count,\n description.bufferViews[spec.bufferView].byteStride\n );\n }\n if (spec.sparse) {\n const sparse = spec.sparse, Index = types[sparse.indices.componentType];\n if (![Uint8Array, Uint16Array, Uint32Array].includes(Index)) {\n throw new Error('Invalid sparse glTF indices');\n }\n const view = description.bufferViews[sparse.indices.bufferView];\n const offset = (view.byteOffset || 0) + (sparse.indices.byteOffset || 0);\n if (sparse.count > spec.count || (sparse.indices.byteOffset || 0) + sparse.count * Index.BYTES_PER_ELEMENT > view.byteLength) {\n throw new Error('Invalid sparse glTF indices');\n }\n const indices = new Index(description.buffers[view.buffer].binary.slice(offset, offset + sparse.count * Index.BYTES_PER_ELEMENT));\n readAccessorValues(\n description, Type, size, data, spec.count, indices,\n sparse.values.bufferView,\n sparse.values.byteOffset || 0,\n sparse.count,\n 0\n );\n }\n if (spec.componentType === 5126) {\n return { data, size };\n }\n const normalized = new Float32Array(data.length);\n // Normalization is a glTF accessor rule, not sRGB conversion; indices stay integers.\n let i;\n for (i = 0; i < data.length; i++) {\n normalized[i] = spec.normalized\n ? Math.max(-1, data[i] / (Type === Int8Array ? 127 : Type === Int16Array ? 32767 : Type === Uint8Array ? 255 : Type === Uint32Array ? 4294967295 : 65535))\n : data[i];\n }\n return { data: normalized, size, indices: data };\n}\n", "import { cityMapper } from '../constants/cityMapper.js';\nimport { emptyNode } from '../scene/emptyNode.js';\nimport { nodeMatrix } from './nodeMatrix.js';\nimport { readAccessor } from './readAccessor.js';\nimport { setParent } from '../scene/setParent.js';\nimport { vertexNormals } from '../geometry/vertexNormals.js';\nimport { createProgram } from '../rendering/createProgram.js';\n\nexport function modelNode(context, index) {\n const { backend, description, materials, active, resources } = context;\n // Track only the recursion path: shared mesh references are valid, cycles are not.\n if (active.has(index)) throw new Error('Cyclic glTF nodes');\n const spec = description.nodes[index];\n if (!spec) throw new Error('Invalid glTF node');\n active.add(index);\n const group = {\n ...emptyNode(),\n name: spec.name\n };\n group.matrix = nodeMatrix(spec);\n let primitive, attributes, semantic, name, vertexCount, attribute, index2, i, normals, style, program;\n let device, geometry, mesh, child;\n if (spec.mesh !== undefined) {\n for (primitive of description.meshes[spec.mesh].primitives) {\n attributes = {};\n for ([semantic, name] of [['POSITION', 'position'], ['NORMAL', 'normal'], ['TEXCOORD_0', 'uv']]) {\n if (primitive.attributes[semantic] !== undefined) attributes[name] = readAccessor(description, primitive.attributes[semantic]);\n }\n if (!attributes.position) throw new Error('glTF mesh has no positions');\n vertexCount = attributes.position.data.length / 3;\n if (attributes.position.size !== 3 || vertexCount < 3) throw new Error('Invalid glTF vertex attributes');\n for (attribute of Object.values(attributes)) {\n if (attribute.data.length / attribute.size !== vertexCount) throw new Error('Invalid glTF vertex attributes');\n }\n if (primitive.indices !== undefined) {\n index2 = readAccessor(description, primitive.indices);\n attributes.index = { size: 1, data: index2.indices };\n if (!(index2.indices instanceof Uint8Array || index2.indices instanceof Uint16Array || index2.indices instanceof Uint32Array) ||\n index2.size !== 1 || index2.indices.length % 3) throw new Error('Invalid glTF triangle indices');\n for (i of index2.indices) {\n if (i >= vertexCount) throw new Error('Invalid glTF triangle indices');\n }\n }\n if (!attributes.index && vertexCount % 3) throw new Error('Incomplete glTF triangle');\n if (!attributes.normal) {\n normals = vertexNormals(attributes.position.data, attributes.index?.data);\n attributes.normal = { size: 3, data: normals };\n }\n style = materials[primitive.material] || { color: [1, 1, 1], metallic: 1 };\n if ((style.baseTexture || style.metalTexture || style.emissiveTexture || style.occlusionTexture) && !attributes.uv) {\n throw new Error('Textured model mesh requires UV coordinates');\n }\n program = createProgram(backend, style);\n resources.push(program);\n device = backend.renderer.device;\n if (attributes.index?.data instanceof Uint8Array) {\n attributes.index.data = Uint16Array.from(attributes.index.data);\n }\n for ([name, attribute] of Object.entries(attributes)) {\n attribute.size ||= 1;\n attribute.count = attribute.data.length / attribute.size;\n attribute.indexFormat = attribute.data instanceof Uint32Array ? 'uint32' : 'uint16';\n attribute.buffer = device.createBuffer({\n size: Math.max(4, attribute.data.byteLength),\n usage: name === 'index'\n ? GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST\n : GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n });\n device.queue.writeBuffer(attribute.buffer, 0, attribute.data);\n }\n geometry = {\n device,\n attributes,\n drawRange: { start: 0, count: attributes.index?.count || attributes.position.count },\n };\n resources.push(geometry);\n mesh = {\n ...emptyNode(),\n device,\n geometry,\n program,\n fadeDuration: 250,\n id: cityMapper.nextId++,\n renderOrder: 0\n };\n mesh.name = description.meshes[spec.mesh].name; mesh.extras = spec.extras || {};\n setParent(mesh, group);\n }\n }\n for (child of spec.children || []) setParent(modelNode(context, child), group);\n active.delete(index);\n return group;\n}\n", "import { decodeModel } from './decodeModel.js';\nimport { setParent } from '../scene/setParent.js';\nimport { emptyNode } from '../scene/emptyNode.js';\nimport { conformModelToTerrain } from '../geometry/conformModelToTerrain.js';\nimport { loadBuffer } from './loadBuffer.js';\nimport { loadImage } from './loadImage.js';\nimport { materialFor } from './materialFor.js';\nimport { modelNode } from './modelNode.js';\n\n/** glTF/GLB model loading. */\n/** Load the configured GLB/glTF (static triangles) under `root`; GPU resources need attachment. */\n\nexport async function loadModel(backend) {\n await backend._added.promise;\n const url = new URL(backend.modelUrl, document.baseURI).href;\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Unable to load model: HTTP ${response.status}`);\n }\n const data = await response.arrayBuffer();\n const description = decodeModel(data);\n const directory = new URL('.', url).href;\n const bufferRequests = [];\n let buffer, image, material, index, resource, attribute, node;\n for (buffer of description.buffers || []) bufferRequests.push(loadBuffer(buffer, directory));\n await Promise.all(bufferRequests);\n await backend._added.promise;\n const imageRequests = [];\n for (image of description.images || []) imageRequests.push(loadImage(description, directory, image));\n const images = await Promise.all(imageRequests);\n await backend._map?._terrain3D?._terrainPromise;\n const context = { backend, description, images, textures: new Map(), materials: [], active: new Set(), resources: [] };\n // Convert glTF materials directly to the shader's retained CPU styles.\n for (material of description.materials || []) context.materials.push(materialFor(context, material));\n const scene = description.scenes?.[description.scene || 0];\n if (!scene) throw new Error('Missing glTF scene');\n const nodes = [];\n try {\n for (index of scene.nodes) nodes.push(modelNode(context, index));\n } catch (error) {\n // Parsing can fail after earlier primitives allocated buffers/programs.\n for (resource of context.resources) {\n if (resource.attributes) {\n for (attribute of Object.values(resource.attributes)) attribute.buffer.destroy();\n } else {\n resource.pipelineCache.clear();\n }\n }\n throw error;\n }\n const model = {\n ...emptyNode(),\n id: url,\n extras: description.extras || {},\n };\n if (!nodes.length) throw new Error('Expected a glTF model with a non-empty scene');\n for (node of nodes) setParent(node, model);\n backend.model = model;\n if (backend.options.rotation) {\n const [x, y = x, z = x] = backend.options.rotation;\n backend.model.rotation[0] = x; backend.model.rotation[1] = y; backend.model.rotation[2] = z;\n }\n if (backend.options.scale) {\n const [x, y = x, z = x] = backend.options.scale;\n backend.model.scale[0] = x; backend.model.scale[1] = y; backend.model.scale[2] = z;\n }\n setParent(backend.model, backend.root);\n conformModelToTerrain(backend, backend._map?._terrain3D);\n}\n", "import { updateArea } from '../sources/updateArea.js';\nimport { onTerrainChange } from '../terrain/onTerrainChange.js';\n\nexport function get3DEvents(layer) {\r\n const events = {};\r\n if (layer.url) {\r\n events.moveend = events.zoomend = events.rotate = events.pitch = events.resize = updateArea.bind(null, layer);\r\n }\r\n if (layer._geojson || layer.url) {\r\n events.terrainchange = onTerrainChange.bind(null, layer);\r\n }\r\n return events;\r\n}\n", "import { emptyNode } from './emptyNode.js';\nimport { getHeader } from '../archives/getHeader.js';\nimport { attach } from './attach.js';\nimport { loadModel } from '../models/loadModel.js';\nimport { update } from './update.js';\n\nexport async function ready3D(layer) {\r\n try {\r\n layer.root = emptyNode();\r\n layer.raycaster = { origin: [0, 0, 0], direction: [0, 0, 0] };\r\n if (layer.url || layer._geojson) {\r\n layer.group = layer.root;\r\n if (layer.url) layer.header = await getHeader(layer);\r\n }\r\n if (layer._map) {\r\n await attach(layer, layer._map);\r\n layer._added.resolve();\r\n }\r\n if (layer.modelUrl) await loadModel(layer);\r\n if (layer._shared) update(layer);\r\n layer.fire('ready');\r\n } catch (error) {\r\n layer.fire('error', { error });\r\n }\r\n}\n", "import { attach } from './attach.js';\nimport { emptyNode } from './emptyNode.js';\nimport { onAdd3DLayer } from './onAdd3DLayer.js';\nimport { onRemove3DLayer } from './onRemove3DLayer.js';\nimport { update } from './update.js';\nimport { updateArea } from '../sources/updateArea.js';\nimport { onTerrainChange } from '../terrain/onTerrainChange.js';\nimport { getHeader } from '../archives/getHeader.js';\nimport { loadModel } from '../models/loadModel.js';\nimport { get3DEvents } from './get3DEvents.js';\nimport { ready3D } from './ready3D.js';\n\nexport function init3D(layer, options = {}) {\n layer._3d = true;\n L.Util.setOptions(layer, { ariaLabel: '3D scene', ...options });\n layer.onAdd = onAdd3DLayer.bind(null, layer);\n layer.onRemove = onRemove3DLayer.bind(null, layer);\n layer.getEvents = get3DEvents.bind(null, layer);\n const isModel = !layer._geojson && /\\.(glb|gltf)(?:[?#]|$)/i.test(layer.options.url);\n layer.modelUrl = isModel ? layer.options.url : null;\n layer.url = layer.options.url && !isModel && !layer._geojson ? new URL(layer.options.url, document.baseURI).href : null;\n layer._directories = new Map();\n if (layer.options.center) {\n layer.location = new L.LatLng(layer.options.center[0], layer.options.center[1]);\n }\n layer._areas = new Map();\n layer._inflight = 0;\n layer._added = Promise.withResolvers();\n queueMicrotask(ready3D.bind(null, layer));\n}\n", "\n\nexport function isLoading(layer) {\r\n return layer._loadingTiles > 0;\r\n}\n", "\n\nexport function comparePendingTiles(a, b) {\r\n return a.tile.coords.z - b.tile.coords.z || a.distance - b.distance;\r\n}\n", "/** Float32 DEM atlas; missing samples retain the shader no-data sentinel. */\n\nexport function terrainAtlas(tiles, bounds) {\n const columns = bounds.max.x - bounds.min.x + 1, rows = bounds.max.y - bounds.min.y + 1;\n const elevations = new Float32Array(columns * rows * 65536).fill(-1e9);\n let low = Infinity, high = -Infinity;\n let key, values, coordinates, x, y, start, row, column, value;\n for ([key, values] of tiles) {\n coordinates = key.split('/');\n x = Number(coordinates[0]), y = Number(coordinates[1]);\n start = (y - bounds.min.y) * 256 * columns * 256 + (x - bounds.min.x) * 256;\n for (row = 0; row < 256; row++) {\n for (column = 0; column < 256; column++) {\n value = values[row * 256 + column];\n if (!Number.isFinite(value) || value <= -1000) continue;\n elevations[start + row * columns * 256 + column] = value;\n low = Math.min(low, value);\n high = Math.max(high, value);\n }\n }\n }\n return { elevations, low, high };\n}\n", "/** Unit tile grid; the vertex shader supplies the elevation. */\n\nexport function terrainGrid(divisions) {\n const positions = [], normals = [], uvs = [], indices = [];\n let row, column, a, b, c, d;\n for (row = 0; row <= divisions; row++) {\n for (column = 0; column <= divisions; column++) {\n positions.push(column / divisions, 0, row / divisions);\n normals.push(0, 1, 0);\n uvs.push(column / divisions, row / divisions);\n if (row < divisions && column < divisions) {\n a = row * (divisions + 1) + column;\n b = a + 1, c = a + divisions + 1, d = c + 1;\n indices.push(a, c, b, b, c, d);\n }\n }\n }\n return {\n position: { size: 3, data: new Float32Array(positions) },\n normal: { size: 3, data: new Float32Array(normals) },\n uv: { size: 2, data: new Float32Array(uvs) },\n index: { data: new Uint16Array(indices) },\n };\n}\n", "import { cityMapper } from '../constants/cityMapper.js';\nimport { createProgram } from '../rendering/createProgram.js';\nimport { destroyTexture } from '../rendering/destroyTexture.js';\nimport { terrainAtlas } from '../terrain/terrainAtlas.js';\nimport { terrainGrid } from '../terrain/terrainGrid.js';\nimport { setParent } from '../scene/setParent.js';\nimport { update } from '../scene/update.js';\n\nexport async function addRasterTile(backend, layer, coords, tile) {\n const ready = await backend._terrainPromise;\n if (!ready || !backend._map || backend._map._terrain3D !== backend || layer._terrain3D !== backend ||\n tile.request.signal.aborted || !layer._rasterTiles.has(`${coords.z}/${coords.x}/${coords.y}`) ||\n backend._rasterTiles.has(tile)) {\n return;\n }\n // Match DEM pixel spacing, capped at 64 subdivisions per tile.\n const divisions = Math.max(1, Math.min(64, 256 / 2 ** (coords.z - backend._terrainZoom)));\n const map = backend._map, crs = map.options.crs;\n const origin = crs.project(backend.location), metres = Math.cos(backend.location.lat * Math.PI / 180);\n // Tile pixels map linearly to projected metres: one scaled unit grid per tile, elevation in the vertex shader.\n const scale = crs.scale(coords.z), terrainScale = 2 ** (backend._terrainZoom - coords.z);\n const corner = crs.transformation.untransform(new L.Point(coords.x * 256, coords.y * 256), scale);\n const opposite = crs.transformation.untransform(new L.Point((coords.x + 1) * 256, (coords.y + 1) * 256), scale);\n const device = backend.renderer.device;\n const texture = tile.texture;\n if (!backend._rasterProgram || backend._rasterProgram.device !== device) {\n // DEM atlas over the archive's tile grid; invalid or missing samples become -1e9 (the shader's no-data).\n // ponytail: one texture, capped by maxTextureDimension2D (32\u00D732 DEM tiles at 8192 px); split it for larger archives.\n const bounds = backend._terrainBounds, columns = bounds.max.x - bounds.min.x + 1, rows = bounds.max.y - bounds.min.y + 1;\n const { elevations, low, high } = terrainAtlas(backend._terrainTiles, bounds);\n if (backend._dem) destroyTexture(backend, backend._dem.texture);\n backend._dem = {\n texture: device.createTexture({\n size: [columns * 256, rows * 256],\n format: 'r32float',\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,\n }),\n low: Number.isFinite(low) ? low : backend._terrainOriginElevation,\n high: Number.isFinite(high) ? high : backend._terrainOriginElevation,\n };\n device.queue.writeTexture({ texture: backend._dem.texture }, elevations,\n { bytesPerRow: columns * 1024 }, [columns * 256, rows * 256]);\n backend._terrainGrids = new Map();\n backend._rasterProgram = createProgram(backend, {\n baseTexture: texture,\n unlit: true,\n terrain: backend._dem,\n alphaMode: 'BLEND',\n depthWrite: true,\n });\n }\n let attributes = backend._terrainGrids.get(divisions);\n let name, attribute;\n if (!attributes) {\n attributes = terrainGrid(divisions);\n for ([name, attribute] of Object.entries(attributes)) {\n attribute.size ||= 1;\n attribute.count = attribute.data.length / attribute.size;\n attribute.indexFormat = 'uint16';\n attribute.buffer = device.createBuffer({\n size: Math.max(4, attribute.data.byteLength),\n usage: name === 'index'\n ? GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST\n : GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n });\n device.queue.writeBuffer(attribute.buffer, 0, attribute.data);\n }\n backend._terrainGrids.set(divisions, attributes);\n }\n const base = backend._terrainOriginElevation;\n const bottom = Math.min(backend._dem.low, base) - base, top = Math.max(backend._dem.high, base) - base;\n const sizeX = (opposite.x - corner.x) * metres, sizeZ = -(opposite.y - corner.y) * metres;\n // ponytail: ray picking sees the flat unit grid; read the DEM back if terrain must be pickable.\n const geometry = {\n device,\n attributes,\n drawRange: { start: 0, count: attributes.index.count },\n // Local bounds whose radius, scaled by the largest axis, still covers the displaced tile.\n bounds: {\n min: [0, bottom, 0], max: [1, top, 1], center: [0.5, (bottom + top) / 2, 0.5],\n radius: Math.hypot(sizeX, top - bottom, sizeZ) / 2 / Math.max(sizeX, 1, sizeZ),\n },\n };\n const mesh = {\n position: [(corner.x - origin.x) * metres, 0, -(corner.y - origin.y) * metres],\n rotation: [0, 0, 0],\n scale: [sizeX, 1, sizeZ],\n worldMatrix: [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],\n children: [],\n visible: true,\n device,\n geometry,\n program: backend._rasterProgram,\n texture,\n // DEM pixel of the tile's corner, DEM pixels per tile, and the elevation at the layer origin.\n terrain: [\n coords.x * 256 * terrainScale - backend._terrainBounds.min.x * 256,\n coords.y * 256 * terrainScale - backend._terrainBounds.min.y * 256,\n 256 * terrainScale,\n base,\n ],\n tile,\n opacity: layer.options.opacity ?? 1,\n id: cityMapper.nextId++,\n renderOrder: layer.options.zIndex || 0,\n fadeDuration: 250,\n fadeStart: tile.loadedAt,\n ground: true,\n };\n tile.mesh.visible = false;\n setParent(mesh, backend.root);\n update(backend);\n backend._rasterTiles.set(tile, mesh);\n}\n", "import { addRasterTile } from './addRasterTile.js';\n\nexport async function registerTerrainTile(backend, coords, tile) {\r\n if (backend._terrain3D && tile.done && !tile.request.signal.aborted &&\r\n backend._rasterTiles.get(`${coords.z}/${coords.x}/${coords.y}`) === tile) {\r\n try {\r\n await addRasterTile(backend._terrain3D, backend, coords, tile);\r\n } catch (error) {\r\n backend.fire('tileerror', { tile, coords, error });\r\n }\r\n }\r\n}\n", "\n\nexport function createGeometry(device) {\n const attributes = {\n position: { size: 3, data: new Float32Array([0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1]) },\n normal: { size: 3, data: new Float32Array([0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0]) },\n uv: { size: 2, data: new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]) },\n index: { data: new Uint16Array([0, 2, 1, 1, 2, 3]) },\n };\n let name, attribute;\n for ([name, attribute] of Object.entries(attributes)) {\n attribute.count = attribute.data.length / (attribute.size || 1);\n attribute.indexFormat = 'uint16';\n attribute.buffer = device.createBuffer({\n size: attribute.data.byteLength,\n usage: name === 'index' ? GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST\n : GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n });\n device.queue.writeBuffer(attribute.buffer, 0, attribute.data);\n }\n return { device, attributes, drawRange: { start: 0, count: attributes.index.count } };\n}\n", "import { cityMapper } from \"../constants/cityMapper.js\";\nimport { createProgram } from \"../rendering/createProgram.js\";\nimport { setParent } from \"../scene/setParent.js\";\nimport { TILE_SIZE } from \"../constants/TILE_SIZE.js\";\nimport { createGeometry } from './createGeometry.js';\n\nexport function createRasterMesh(backend, tile) {\r\n const device = backend.renderer.device;\r\n const texture = {\r\n device,\r\n texture: device.createTexture({\r\n size: [tile.image.width, tile.image.height],\r\n format: 'rgba8unorm',\r\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,\r\n }),\r\n sampler: device.createSampler({ addressModeU: 'clamp-to-edge', addressModeV: 'clamp-to-edge',\r\n magFilter: 'linear', minFilter: 'linear' }),\r\n image: tile.image, format: 'rgba8unorm', srgb: false, uploaded: null,\r\n };\r\n if (!backend._rasterProgram) {\r\n backend._rasterProgram = createProgram(backend, {\r\n baseTexture: texture, unlit: true, alphaMode: 'BLEND',\r\n });\r\n }\r\n if (!backend._rasterGeometry) backend._rasterGeometry = createGeometry(device);\r\n const { coords } = tile;\r\n const crs = backend._map.options.crs;\r\n const origin = crs.project(backend.location);\r\n const metres = Math.cos(backend.location.lat * Math.PI / 180);\r\n const scale = crs.scale(coords.z);\r\n const corner = crs.transformation.untransform(new L.Point(coords.x * TILE_SIZE, coords.y * TILE_SIZE), scale);\r\n const opposite = crs.transformation.untransform(new L.Point((coords.x + 1) * TILE_SIZE, (coords.y + 1) * TILE_SIZE), scale);\r\n const sizeX = (opposite.x - corner.x) * metres;\r\n const sizeZ = -(opposite.y - corner.y) * metres;\r\n tile.texture = texture;\r\n tile.mesh = {\r\n position: [(corner.x - origin.x) * metres, 0, -(corner.y - origin.y) * metres],\r\n rotation: [0, 0, 0],\r\n scale: [sizeX, 1, sizeZ],\r\n worldMatrix: [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],\r\n children: [], visible: true, device, geometry: backend._rasterGeometry,\r\n program: backend._rasterProgram, texture,\r\n opacity: backend.options.opacity, id: cityMapper.nextId++,\r\n renderOrder: backend.options.zIndex || 0, tile, fadeDuration: 250, ground: true,\r\n };\r\n setParent(tile.mesh, backend.root);\r\n}\n", "import { update } from \"../scene/update.js\";\nimport { registerTerrainTile } from \"./registerTerrainTile.js\";\nimport { pruneRasterTiles } from \"./pruneRasterTiles.js\";\nimport { pumpRasterTiles } from './pumpRasterTiles.js';\nimport { createRasterMesh } from './createRasterMesh.js';\n\nexport async function finishRasterTile(backend, tile) {\r\n try {\r\n await backend.ready;\r\n const result = await backend.options.archive.getZxy(\r\n tile.coords.z, tile.coords.x, tile.coords.y, tile.request.signal\r\n );\r\n if (tile.request.signal.aborted) return;\r\n if (!result) throw new Error(`Tile ${tile.coords.z}/${tile.coords.x}/${tile.coords.y} is not in the offline archive`);\r\n try {\r\n tile.image = await createImageBitmap(new Blob([result.data]));\r\n } catch {\r\n throw new Error(`Unable to decode tile ${tile.coords.z}/${tile.coords.x}/${tile.coords.y}`);\r\n }\r\n if (tile.request.signal.aborted) {\r\n tile.image.close();\r\n tile.image = null;\r\n return;\r\n }\r\n createRasterMesh(backend, tile);\r\n tile.loadedAt = performance.now();\r\n tile.done = true;\r\n backend._rasterVersion = (backend._rasterVersion || 0) + 1;\r\n registerTerrainTile(backend, tile.coords, tile);\r\n backend.fire('tileload', { tile, coords: tile.coords });\r\n update(backend);\r\n } catch (error) {\r\n if (tile.request.signal.aborted) return;\r\n tile.error = error.message;\r\n backend._rasterVersion = (backend._rasterVersion || 0) + 1;\r\n backend.fire('tileerror', { tile, coords: tile.coords, error });\r\n backend.fire('error', { error, coords: tile.coords });\r\n } finally {\r\n backend._loadingTiles--;\r\n if (backend._map) {\r\n pumpRasterTiles(backend);\r\n pruneRasterTiles(backend);\r\n if (!backend._loadingTiles) backend.fire('load');\r\n update(backend);\r\n }\r\n }\r\n}\n", "import { finishRasterTile } from './finishRasterTile.js';\n\nexport function loadRasterTile(backend, tile) {\r\n tile.started = true;\r\n const first = backend._loadingTiles === 0;\r\n backend._loadingTiles++;\r\n backend.fire('tileloadstart', { tile, coords: tile.coords });\r\n if (first) backend.fire('loading');\r\n return finishRasterTile(backend, tile);\r\n}\n", "import { TILE_SIZE } from \"../constants/TILE_SIZE.js\";\nimport { comparePendingTiles } from './comparePendingTiles.js';\nimport { loadRasterTile } from './loadRasterTile.js';\n\nexport function pumpRasterTiles(backend) {\n const map = backend._map;\n if (!map) return;\n const center = map.project(map.getCenter(), 0).divideBy(TILE_SIZE);\n const pending = [];\n let tile, coords;\n for (tile of backend._rasterTiles.values()) {\n if (tile.started || tile.request.signal.aborted) continue;\n ({ coords } = tile);\n pending.push({ tile, distance: Math.hypot((coords.x + 0.5) / 2 ** coords.z - center.x,\n (coords.y + 0.5) / 2 ** coords.z - center.y) });\n }\n pending.sort(comparePendingTiles);\n for ({ tile } of pending) {\n if (backend._loadingTiles >= 4) break;\n loadRasterTile(backend, tile);\n }\n}\n", "import { TILE_RADIUS } from '../constants/TILE_RADIUS.js';\nimport { pumpRasterTiles } from './pumpRasterTiles.js';\nimport { TILE_SIZE } from '../constants/TILE_SIZE.js';\nimport { releaseRasterTile } from './releaseRasterTile.js';\nimport { pruneRasterTiles } from './pruneRasterTiles.js';\n\n// ponytail: cap horizon views at 169 tiles; raise the radius if extreme pitches need more.\n\nexport function updateRasterTiles(backend) {\n const map = backend._map;\n if (!map || !backend._shared || !backend.header) return;\n\n const zoom = Math.max(backend.header.minZoom ?? 0, Math.min(\n Math.round(map.getZoom()),\n backend.options.maxZoom,\n backend.options.maxNativeZoom\n ));\n backend._tileZoom = zoom;\n const bounds = map.getBounds();\n const northWest = map.project(bounds.getNorthWest(), zoom).divideBy(TILE_SIZE).floor();\n const southEast = map.project(bounds.getSouthEast(), zoom).divideBy(TILE_SIZE).floor();\n const archiveNorthWest = backend.header.maxLat === undefined || backend.header.minLon === undefined\n ? new L.Point(0, 0)\n : map.project([backend.header.maxLat, backend.header.minLon], zoom).divideBy(TILE_SIZE).floor();\n const archiveSouthEast = backend.header.minLat === undefined || backend.header.maxLon === undefined\n ? new L.Point(2 ** zoom - 1, 2 ** zoom - 1)\n : map.project([backend.header.minLat, backend.header.maxLon], zoom).divideBy(TILE_SIZE).floor();\n const center = map.project(map.getCenter(), zoom).divideBy(TILE_SIZE).floor();\n const wanted = new Map();\n let x, y, key, coords, parent, tile;\n for (x = Math.max(0, northWest.x, archiveNorthWest.x, center.x - TILE_RADIUS);\n x <= Math.min(2 ** zoom - 1, southEast.x, archiveSouthEast.x, center.x + TILE_RADIUS); x++) {\n for (y = Math.max(0, northWest.y, archiveNorthWest.y, center.y - TILE_RADIUS);\n y <= Math.min(2 ** zoom - 1, southEast.y, archiveSouthEast.y, center.y + TILE_RADIUS); y++) {\n wanted.set(`${zoom}/${x}/${y}`, { z: zoom, x, y });\n }\n }\n backend._wantedRasterTiles = new Set(wanted.keys());\n const coverage = new Map();\n const parentZoom = Math.max(backend.header.minZoom ?? 0, zoom - 2), factor = 2 ** (zoom - parentZoom);\n if (parentZoom < zoom) {\n for ([key, coords] of wanted) {\n if (backend._rasterTiles.get(key)?.done) continue;\n parent = { z: parentZoom, x: Math.floor(coords.x / factor), y: Math.floor(coords.y / factor) };\n coverage.set(`${parent.z}/${parent.x}/${parent.y}`, parent);\n }\n }\n const required = new Map([...coverage, ...wanted]);\n for ([key, tile] of backend._rasterTiles) {\n if (!required.has(key) && !tile.done) releaseRasterTile(backend, tile);\n }\n for ([key, coords] of required) {\n if (backend._rasterTiles.has(key)) continue;\n tile = { coords, request: new AbortController(), done: false };\n backend._rasterTiles.set(key, tile);\n }\n pumpRasterTiles(backend);\n pruneRasterTiles(backend);\n}\n", "import { updateRasterTiles } from \"./updateRasterTiles.js\";\n\nexport function getRasterEvents(layer) {\r\n const update = updateRasterTiles.bind(null, layer);\r\n return { moveend: update, zoomend: update, rotate: update, pitch: update, resize: update };\r\n}\n", "import { getHeader } from \"../archives/getHeader.js\";\n\nexport async function readyRaster(layer, archive) {\r\n const header = await archive.getHeader();\r\n layer.options.archive = archive;\r\n layer.header = header;\r\n if (layer.options.maxNativeZoom === undefined) {\r\n layer.options.maxNativeZoom = header.maxZoom;\r\n }\r\n layer.options.maxZoom = Math.max(layer.options.minZoom || 0, layer.options.maxZoom);\r\n layer.fire('ready');\r\n return layer;\r\n}\n", "\n\nexport function reportError(layer, error) {\r\n layer.fire('error', { error });\r\n throw error;\r\n}\n", "import { removeRasterTile } from './removeRasterTile.js';\nimport { setParent } from '../scene/setParent.js';\nimport { registerTerrainTile } from './registerTerrainTile.js';\n\nexport function setRasterTerrain(backend, terrain) {\n if (backend._terrain3D === terrain) return;\n let tile;\n for (tile of backend._rasterTiles.values()) {\n if(backend._terrain3D) removeRasterTile(backend._terrain3D, tile);\n if (tile.mesh) {\n tile.mesh.visible = true;\n setParent(tile.mesh, backend.root);\n }\n }\n backend._terrain3D = terrain || null;\n if (terrain) {\n for (tile of backend._rasterTiles.values()) {\n if (tile.done) registerTerrainTile(backend, tile.coords, tile);\n }\n }\n}\n", "import { setRasterTerrain } from \"./setRasterTerrain.js\";\n\nexport async function finishAttachment(backend, map, attached) {\n try {\n await attached;\n backend._added.resolve();\n setRasterTerrain(backend, map._terrain3D);\n } catch (error) {\n backend.fire('error', { error });\n }\n}\n", "import { updateRasterTiles } from \"./updateRasterTiles.js\";\n\nexport async function updateAttachedTiles(backend, map, attached) {\n try {\n await Promise.all([attached, backend.ready]);\n if (backend._map === map && map.hasLayer(backend)) updateRasterTiles(backend);\n } catch (error) {\n backend.fire('error', { error });\n }\n}\n", "import { finishAttachment } from './finishAttachment.js';\nimport { updateAttachedTiles } from './updateAttachedTiles.js';\nimport { attach } from '../scene/attach.js';\n\nexport function onPMTileAdd(backend, map) {\n if (!backend.location) backend.location = map.getCenter();\n const attached = attach(backend, map);\n finishAttachment(backend, map, attached);\n updateAttachedTiles(backend, map, attached);\n}\n", "import { destroyTexture } from '../rendering/destroyTexture.js';\nimport { releaseRasterTile } from './releaseRasterTile.js';\n\nexport function releaseRasterTiles(backend) {\n let tile, attribute;\n for (tile of backend._rasterTiles.values()) releaseRasterTile(backend, tile);\n backend._rasterProgram?.pipelineCache.clear();\n backend._rasterProgram = null;\n if (backend._rasterGeometry) {\n for (attribute of Object.values(backend._rasterGeometry.attributes)) {\n destroyTexture(backend, attribute.buffer);\n }\n backend._rasterGeometry = null;\n }\n}\n", "import { releaseRasterTiles } from './releaseRasterTiles.js';\nimport { onRemove3DLayer } from '../scene/onRemove3DLayer.js';\n\nexport function onPMTileRemove(backend, map) {\n releaseRasterTiles(backend);\n backend._terrain3D = null;\n onRemove3DLayer(backend, map);\n}\n", "import { update } from '../scene/update.js';\n\nexport function setRasterOpacity(backend, opacity) {\n let tile, terrainMesh;\n for (tile of backend._rasterTiles.values()) {\n if (tile.mesh) tile.mesh.opacity = opacity;\n terrainMesh = backend._terrain3D?._rasterTiles.get(tile);\n if (terrainMesh) terrainMesh.opacity = opacity;\n }\n update(backend);\n}\n", "import { setRasterOpacity } from './setRasterOpacity.js';\n\nexport function setPMTileOpacity(backend, opacity) {\n backend.options.opacity = opacity;\n setRasterOpacity(backend, opacity);\n return backend;\n}\n", "import { update } from '../scene/update.js';\n\nexport function setRasterZIndex(backend, zIndex) {\n let tile, terrainMesh;\n for (tile of backend._rasterTiles.values()) {\n if (tile.mesh) tile.mesh.renderOrder = zIndex;\n terrainMesh = backend._terrain3D?._rasterTiles.get(tile);\n if (terrainMesh) terrainMesh.renderOrder = zIndex;\n }\n update(backend);\n}\n", "import { setRasterZIndex } from './setRasterZIndex.js';\n\nexport function setPMTileZIndex(backend, zIndex) {\n backend.options.zIndex = zIndex;\n setRasterZIndex(backend, zIndex);\n return backend;\n}\n", "import { isLoading } from './isLoading.js';\nimport { getRasterEvents } from './getRasterEvents.js';\nimport { readyRaster } from './readyRaster.js';\nimport { reportError } from './reportError.js';\nimport { emptyNode } from '../scene/emptyNode.js';\nimport { read } from '../archives/read.js';\nimport { getHeader } from '../archives/getHeader.js';\nimport { getZxy } from '../archives/getZxy.js';\nimport { onPMTileAdd } from './onPMTileAdd.js';\nimport { onPMTileRemove } from './onPMTileRemove.js';\nimport { getRasterTileSize } from './getRasterTileSize.js';\nimport { setPMTileOpacity } from './setPMTileOpacity.js';\nimport { setPMTileZIndex } from './setPMTileZIndex.js';\n\nexport function initRaster(layer, options) {\n layer._read = read.bind(null, layer);\n layer.getHeader = getHeader.bind(null, layer);\n layer.getZxy = getZxy.bind(null, layer);\n layer.getTileSize = getRasterTileSize;\n layer.isLoading = isLoading.bind(null, layer);\n layer.setOpacity = setPMTileOpacity.bind(null, layer);\n layer.setZIndex = setPMTileZIndex.bind(null, layer);\n layer.onAdd = onPMTileAdd.bind(null, layer);\n layer.onRemove = onPMTileRemove.bind(null, layer);\n layer.getEvents = getRasterEvents.bind(null, layer);\n options = { ariaLabel: 'PMTiles raster', maxZoom: 18, opacity: 1, zIndex: 0, ...options };\n L.Util.setOptions(layer, options);\n layer.root = emptyNode();\n layer._areas = new Map();\n layer._rasterTiles = new Map();\n layer._loadingTiles = 0;\n layer._added = Promise.withResolvers();\n layer.url = new URL(options.url, document.baseURI).href;\n layer._directories = new Map();\n layer.ready = Promise.resolve(layer.options.archive || layer)\n .then(readyRaster.bind(null, layer))\n .catch(reportError.bind(null, layer));\n}\n", "import { releaseArea } from './releaseArea.js';\nimport { updateArea } from './updateArea.js';\n\nexport function setGeoJSONData(layer, data) {\n layer.options.data = data;\n delete layer.options.url;\n let area;\n for (area of layer._areas.values()) releaseArea(layer, area);\n layer._areas.clear();\n updateArea(layer);\n return layer;\n}\n", "import { setRasterTerrain } from '../raster/setRasterTerrain.js';\r\n\r\nexport function clearLayerTerrain(layer) {\r\n if (layer._type === 'pmtiles') setRasterTerrain(layer, null);\r\n}\r\n", "import { destroyTexture } from '../rendering/destroyTexture.js';\nimport { conformModelToTerrain } from '../geometry/conformModelToTerrain.js';\nimport { disposeMesh } from '../rendering/disposeMesh.js';\nimport { setRasterTerrain } from '../raster/setRasterTerrain.js';\nimport { removeRasterTile } from '../raster/removeRasterTile.js';\nimport { setTerrainHeight } from './setTerrainHeight.js';\nimport { onRemove3DLayer } from '../scene/onRemove3DLayer.js';\nimport { clearLayerTerrain } from './clearLayerTerrain.js';\n\nexport function onTerrainRemove(layer, map) {\n layer._terrainController?.abort();\n layer._terrainLoading = false;\n layer._terrainReady = false;\n map.eachLayer(clearLayerTerrain);\n let tile, l, grid, attribute;\n for (tile of layer._rasterTiles.keys()) removeRasterTile(layer, tile);\n if (map._terrain3D === layer) delete map._terrain3D;\n for (l of Object.values(map._layers)) {\n conformModelToTerrain(l, null);\n setTerrainHeight(l);\n }\n\n map.fire('terrainchange');\n layer._terrainTiles.clear();\n layer._terrainOriginElevation = 0;\n layer._terrainPromise = null;\n if (layer._rasterProgram) {\n layer._rasterProgram.pipelineCache.clear();\n }\n layer._rasterProgram = null;\n if (layer._dem) destroyTexture(layer, layer._dem.texture);\n layer._dem = null;\n for (grid of layer._terrainGrids?.values() || []) {\n for (attribute of Object.values(grid)) destroyTexture(layer, attribute.buffer);\n }\n layer._terrainGrids = null;\n layer._bridges = null;\n disposeMesh(layer, layer._bridgeMesh);\n layer._bridgeMesh = null;\n onRemove3DLayer(layer, map);\n}\n", "export function local([lng, lat, z], crs, origin, metres, base) {\r\n const p = crs.project(new L.LatLng(lat, lng));\r\n return [(p.x - origin.x) * metres, z - base, -(p.y - origin.y) * metres];\r\n}\r\n", "export function push(position, normal, color, p, n) {\r\n position.push(...p); normal.push(...n); color.push(0.6, 0.58, 0.54);\r\n}\r\n", "export function below(p) {\r\n return [p[0], p[1] - 1.2, p[2]];\r\n}\r\n", "import { createMesh } from '../rendering/createMesh.js';\nimport { triangulate } from '../triangulation/triangulate.js';\nimport { local } from './bridgeLocal.js';\nimport { push } from './push.js';\nimport { below } from './below.js';\n\n/**\n * Bare-earth DEMs drop bridges: `getElevation` returns the deck height inside these polygons (GeoJSON\n * Polygon/MultiPolygon with Z, e.g. IGN BD TOPO), and one mesh draws the 1.2 m thick decks.\n * ponytail: anything under a deck (quays, boats asking `getElevation`) also gets the deck height.\n */\n\nexport function addBridges(backend, geojson) {\n const map = backend._map, crs = map.options.crs, zoom = backend._terrainZoom;\n const origin = crs.project(backend.location), metres = Math.cos(backend.location.lat * Math.PI / 180);\n const base = backend.root.position[1], position = [], normal = [], color = [];\n backend._bridges = new Map();\n let geometry, polygons, polygon, rings, ring, path, pixels, points, lng, lat, z, p, coordinate;\n let triangles, paths, start, i, contour, holes, bridgeTriangles, xs, ys, t, triangle, bridge, x, y;\n let key, a, b, c, pa, pb, pc, start2, q, length, n, corner;\n for ({ geometry } of geojson.features) {\n polygons = geometry.type === 'Polygon' ? [geometry.coordinates] : geometry.type === 'MultiPolygon' ? geometry.coordinates : [];\n for (polygon of polygons) {\n rings = [];\n for (ring of polygon) {\n path = ring.slice(0, -1);\n if (path.length >= 3) rings.push(path);\n }\n if (!rings.length) continue;\n pixels = [], points = [];\n for (ring of rings) for ([lng, lat, z] of ring) {\n p = map.project([lat, lng], zoom);\n pixels.push([p.x, p.y, z]);\n }\n for (ring of rings) for (coordinate of ring) points.push(local(coordinate, crs, origin, metres, base));\n triangles = void 0;\n try {\n paths = [];\n start = 0;\n for (ring of rings) {\n path = [];\n for (i = 0; i < ring.length; i++) path.push({ x: pixels[start + i][0], y: pixels[start + i][1] });\n paths.push(path);\n start += ring.length;\n }\n [contour, ...holes] = paths;\n triangles = triangulate(contour, holes);\n } catch { continue; }\n bridgeTriangles = [], xs = [], ys = [];\n for (t of triangles) {\n triangle = [];\n for (i of t) triangle.push(pixels[i]);\n bridgeTriangles.push(triangle);\n }\n for (p of pixels) { xs.push(p[0]); ys.push(p[1]); }\n bridge = {\n triangles: bridgeTriangles,\n min: [Math.min(...xs), Math.min(...ys)],\n max: [Math.max(...xs), Math.max(...ys)],\n };\n for (x = Math.floor(bridge.min[0] / 64); x <= Math.floor(bridge.max[0] / 64); x++) {\n for (y = Math.floor(bridge.min[1] / 64); y <= Math.floor(bridge.max[1] / 64); y++) {\n key = `${x}/${y}`;\n backend._bridges.set(key, [...backend._bridges.get(key) || [], bridge]);\n }\n }\n for ([a, b, c] of triangles) {\n // Counter-clockwise seen from above, so double-sided shading keeps the top lit.\n [pa, pb, pc] = [points[a], points[b], points[c]];\n if ((pb[2] - pa[2]) * (pc[0] - pa[0]) - (pb[0] - pa[0]) * (pc[2] - pa[2]) < 0) [b, c] = [c, b];\n for (i of [a, b, c]) push(position, normal, color, points[i], [0, 1, 0]);\n for (i of [a, c, b]) push(position, normal, color, below(points[i]), [0, -1, 0]);\n }\n start2 = 0;\n for (ring of rings) {\n for (i = 0; i < ring.length; i++) {\n p = points[start2 + i], q = points[start2 + (i + 1) % ring.length];\n length = Math.hypot(q[0] - p[0], q[2] - p[2]) || 1, n = [(q[2] - p[2]) / length, 0, -(q[0] - p[0]) / length];\n for (corner of [p, q, below(q), p, below(q), below(p)]) push(position, normal, color, corner, n);\n }\n start2 += ring.length;\n }\n }\n }\n if (position.length) {\n backend._bridgeMesh = createMesh(backend, { position, normal, color });\n }\n}\n", "export async function loadTerrainTiles(state) {\n const { backend, archive, controller, tiles } = state;\n let coords, result;\n while (state.next < tiles.length) {\n controller.signal.throwIfAborted();\n coords = tiles[state.next++];\n result = await archive.getZxy(coords.z, coords.x, coords.y, controller.signal);\n if (!result || result.data.byteLength !== 256 * 256 * 4) {\n throw new Error(`Missing or invalid Float32 terrain tile ${coords.z}/${coords.x}/${coords.y}`);\n }\n backend._terrainTiles.set(`${coords.x}/${coords.y}`, new Float32Array(result.data));\n }\n}\n", "export function readBridges(response) {\r\n if (!response.ok) throw new Error(`Bridges: HTTP ${response.status}`);\r\n return response.json();\r\n}\r\n", "import { addBridges } from '../geometry/addBridges.js';\nimport { conformModelToTerrain } from '../geometry/conformModelToTerrain.js';\nimport { getElevation } from './getElevation.js';\nimport { setTerrainHeight } from './setTerrainHeight.js';\nimport { update } from '../scene/update.js';\nimport { compareDistance } from '../utils/compareDistance.js';\nimport { loadTerrainTiles } from './loadTerrainTiles.js';\nimport { readBridges } from './readBridges.js';\n\n\nexport async function loadTerrain(backend) {\n if (backend._terrainLoading || !backend._map) return;\n backend._terrainLoading = true;\n backend._terrainReady = false;\n const controller = backend._terrainController = new AbortController();\n let x, y, i, layer;\n try {\n if (!backend.terrainSource) throw new Error('Terrain layer requires a PMTiles elevation archive');\n const archive = backend._terrainArchive = new L.Layer({ source: { type: 'pmtiles', url: backend.terrainSource } });\n await archive.ready;\n const header = archive.header;\n if (header.tileType !== 0 || header.minZoom !== header.maxZoom) {\n throw new Error('Expected a single-zoom Float32 PMTiles terrain archive');\n }\n backend._terrainZoom = header.maxZoom;\n const map = backend._map;\n const northwest = map.project([header.maxLat, header.minLon], backend._terrainZoom).divideBy(256).floor();\n const southeast = map.project([header.minLat, header.maxLon], backend._terrainZoom).divideBy(256).floor();\n backend._terrainBounds = new L.Bounds(northwest, southeast);\n const tiles = [];\n const center = map.project(map.getCenter(), backend._terrainZoom).divideBy(256);\n for (x = northwest.x; x <= southeast.x; x++) {\n for (y = northwest.y; y <= southeast.y; y++) {\n tiles.push({ z: backend._terrainZoom, x, y, distance: Math.hypot(x + 0.5 - center.x, y + 0.5 - center.y) });\n }\n }\n tiles.sort(compareDistance);\n const state = { backend, archive, controller, tiles, next: 0 };\n const workers = [];\n for (i = 0; i < Math.min(4, tiles.length); i++) workers.push(loadTerrainTiles(state));\n await Promise.all(workers);\n const bridges = backend.options.bridges && await fetch(backend.options.bridges, { signal: controller.signal })\n .then(readBridges);\n if (controller.signal.aborted || backend._map !== map) return;\n backend._terrainReady = true;\n backend._terrainOriginElevation = getElevation(backend, backend.location) ?? 0;\n for (layer of Object.values(map._layers)) {\n setTerrainHeight(layer);\n conformModelToTerrain(layer, backend);\n }\n\n if (bridges) addBridges(backend, bridges);\n map.fire('terrainchange');\n update(backend);\n backend.fire('terrainready');\n return true;\n } catch (error) {\n if (!controller.signal.aborted) backend.fire('error', { error });\n return false;\n } finally {\n backend._terrainLoading = false;\n }\n}\n", "import { loadTerrain } from './loadTerrain.js';\r\n\r\nexport function loadReadyTerrain() {\r\n loadTerrain(this.backend).then(this.resolve, this.reject);\r\n}\r\n", "import { setRasterTerrain } from '../raster/setRasterTerrain.js';\r\n\r\nexport function setLayerTerrain(layer) {\r\n if (layer._type === 'pmtiles') setRasterTerrain(layer, this);\r\n}\r\n", "import { loadTerrain } from \"./loadTerrain.js\";\nimport { setRasterTerrain } from '../raster/setRasterTerrain.js';\nimport { onAdd3DLayer } from '../scene/onAdd3DLayer.js';\nimport { loadReadyTerrain } from './loadReadyTerrain.js';\nimport { setLayerTerrain } from './setLayerTerrain.js';\n\nexport function onTerrainAdd(backend, map) {\n if (map._terrain3D && map._terrain3D !== backend) {\n throw new Error('Only one terrain layer can be active per map');\n }\n map._terrain3D = backend;\n onAdd3DLayer(backend, map);\n if (backend.root) backend._terrainPromise = loadTerrain(backend);\n else {\n const pending = Promise.withResolvers();\n backend._terrainPromise = pending.promise;\n backend.once('ready', loadReadyTerrain, { backend, ...pending });\n }\n map.eachLayer(setLayerTerrain, backend);\n map.fire('terrainchange');\n}\n", "import { onTerrainRemove } from './onTerrainRemove.js';\nimport { onTerrainAdd } from './onTerrainAdd.js';\nimport { init3D } from '../scene/init3D.js';\n\n/**\n * Renders IGN Float32 DEM tiles and PMTiles raster basemaps in the shared WebGPU scene.\n * Source options: `url` (single-zoom Float32 PMTiles DEM); `bridges` (optional GeoJSON deck polygons with Z, see _addBridges).\n */\nexport function initTerrain(layer, options) {\n const terrainSource = options.url;\n const layerOptions = { ...options };\n delete layerOptions.url;\n init3D(layer, layerOptions);\n layer.terrainSource = terrainSource;\n layer._terrainTiles = new Map();\n layer._rasterTiles = new Map();\n layer._terrainReady = false;\n layer.onAdd = onTerrainAdd.bind(null, layer);\n layer.onRemove = onTerrainRemove.bind(null, layer);\n}\n", "export function mix(a, b, t) {\n const values = [];\n let i;\n for (i = 0; i < a.length; i++) values.push(a[i] + (b[i] - a[i]) * t);\n return values;\n}\n", "export function rgb(values) {\n const rounded = [];\n let value;\n for (value of values) rounded.push(Math.round(value));\n return `rgb(${rounded.join(', ')})`;\n}\n", "\nimport { mix } from './mix.js';\nimport { rgb } from './rgb.js';\n\nexport function atmosphere(altitude) {\n if (!Number.isFinite(altitude)) {\n throw new Error('Invalid solar altitude');\n }\n const stops = [\n [-18, [3, 7, 20], [17, 28, 54], [0.025, 0.04, 0.09]],\n [-6, [37, 53, 84], [182, 106, 86], [0.12, 0.10, 0.14]],\n [0, [101, 131, 171], [246, 170, 115], [0.38, 0.24, 0.18]],\n [10, [74, 147, 208], [197, 221, 237], [0.80, 0.75, 0.68]],\n [25, [53, 144, 213], [223, 238, 250], [1, 1, 1]],\n ];\n let upper = -1;\n let i;\n for (i = 0; i < stops.length; i++) {\n if (stops[i][0] >= altitude) { upper = i; break; }\n }\n const b = stops[upper < 0 ? stops.length - 1 : upper],\n a = stops[Math.max(0, upper - 1)];\n const t = a === b || upper < 0 ? 1 : (altitude - a[0]) / (b[0] - a[0]);\n return {\n background: `linear-gradient(${rgb(mix(a[1], b[1], t))}, ${rgb(mix(a[2], b[2], t))})`,\n tint: mix(a[3], b[3], t),\n };\n}\n", "\nexport function horizontalPosition(d, lat, lng, ascension, declination) {\n const rad = Math.PI / 180;\n const hourAngle = (280.16 + 360.9856235 * d + lng) * rad - ascension;\n const latitude = lat * rad;\n const altitude = Math.asin(Math.sin(latitude) * Math.sin(declination) +\n Math.cos(latitude) * Math.cos(declination) * Math.cos(hourAngle));\n const southAzimuth = Math.atan2(Math.sin(hourAngle),\n Math.cos(hourAngle) * Math.sin(latitude) - Math.tan(declination) * Math.cos(latitude));\n const azimuth = (southAzimuth / rad + 180 + 360) % 360;\n return {\n altitude: altitude / rad, azimuth,\n direction: [Math.sin(azimuth * rad) * Math.cos(altitude), Math.sin(altitude),\n -Math.cos(azimuth * rad) * Math.cos(altitude)]\n };\n}\n", "import { horizontalPosition } from \"./horizontalPosition.js\";\n\n// Solar centre, without atmospheric refraction.\n\nexport function solarPosition(date, lat, lng) {\n const time = new Date(date).getTime();\n if (!Number.isFinite(time) || !Number.isFinite(lat) || Math.abs(lat) > 90 ||\n !Number.isFinite(lng) || Math.abs(lng) > 180) throw new Error('Invalid solar date or location');\n const rad = Math.PI / 180, d = time / 86400000 - 10957.5;\n const mean = (357.5291 + 0.98560028 * d) * rad;\n const longitude = mean + (1.9148 * Math.sin(mean) + 0.02 * Math.sin(2 * mean) +\n 0.0003 * Math.sin(3 * mean) + 102.9372 + 180) * rad;\n const obliquity = 23.4397 * rad;\n const declination = Math.asin(Math.sin(longitude) * Math.sin(obliquity));\n const ascension = Math.atan2(Math.sin(longitude) * Math.cos(obliquity), Math.cos(longitude));\n return horizontalPosition(d, lat, lng, ascension, declination);\n}\n", "import { solarPosition } from \"./solarPosition.js\";\nimport { horizontalPosition } from \"./horizontalPosition.js\";\n\n// Low-precision geocentric lunar orbit; no parallax or atmospheric refraction.\n\nexport function moonPosition(date, lat, lng) {\n solarPosition(date, lat, lng);\n const rad = Math.PI / 180, d = new Date(date).getTime() / 86400000 - 10957.5;\n const anomaly = (134.963 + 13.064993 * d) * rad;\n const longitude = (218.316 + 13.176396 * d + 6.289 * Math.sin(anomaly)) * rad;\n const latitude = 5.128 * Math.sin((93.272 + 13.229350 * d) * rad) * rad;\n const obliquity = 23.4397 * rad;\n const x = Math.cos(latitude) * Math.cos(longitude);\n const y = Math.cos(latitude) * Math.sin(longitude) * Math.cos(obliquity) - Math.sin(latitude) * Math.sin(obliquity);\n const z = Math.cos(latitude) * Math.sin(longitude) * Math.sin(obliquity) + Math.sin(latitude) * Math.cos(obliquity);\n return horizontalPosition(d, lat, lng, Math.atan2(y, x), Math.asin(z));\n}\n", "/** Perspective projection of a celestial direction; null when behind the camera. */\n\nexport function projectCelestialBody(dir, size, pitch, bearing) {\n const [x, y, z] = dir;\n const forward = -x * Math.sin(bearing) * Math.sin(pitch) - y * Math.cos(pitch) - z * Math.cos(bearing) * Math.sin(pitch);\n if (forward > 0) {\n return {\n left: size.x / 2 + size.y * 1.5 * (x * Math.cos(bearing) - z * Math.sin(bearing)) / forward,\n top: size.y / 2 - size.y * 1.5 * (-x * Math.sin(bearing) * Math.cos(pitch) + y * Math.sin(pitch) - z * Math.cos(bearing) * Math.cos(pitch)) / forward\n };\n }\n return null;\n}\n", "import { projectCelestialBody } from './projectCelestialBody.js';\n\nexport function updateSky({ map, originalSky, sunDisc, moonDisc }) {\n const sun = map._sunlight, sky = map._pitchSky;\n if (sun) map.getContainer().style.setProperty('--leaflet-sky-background', sun.background);\n else if (originalSky) map.getContainer().style.setProperty('--leaflet-sky-background', originalSky);\n else map.getContainer().style.removeProperty('--leaflet-sky-background');\n const size = map.getSize(), pitch = map.getPitch() * Math.PI / 180, bearing = map.getBearing() * Math.PI / 180;\n let disc, body, point, left, top;\n for ([disc, body] of [[sunDisc, sun], [moonDisc, sun?.moon]]) {\n disc.hidden = true;\n if (!sky || !body || body.altitude <= 0 || !sun) continue;\n if (disc.parentNode !== sky) sky.append(disc);\n point = projectCelestialBody(body.direction, size, pitch, bearing);\n if (!point) continue;\n ({ left, top } = point);\n disc.hidden = left < 0 || left > size.x || top < 0 || top > sky.clientHeight || sky.style.display === 'none';\n disc.style.left = `${left}px`; disc.style.top = `${top}px`;\n }\n}\n", "import { cityMapper } from '../constants/cityMapper.js';\r\nimport { update as updateScene } from '../scene/update.js';\r\n\r\nexport function render(map) {\r\n const renderer = cityMapper.renderers.get(map);\r\n if (renderer) updateScene(renderer);\r\n}\r\n", "import { atmosphere } from './atmosphere.js';\r\nimport { moonPosition } from './moonPosition.js';\r\nimport { solarPosition } from './solarPosition.js';\r\nimport { render } from './render.js';\r\nimport { updateSky } from './updateSky.js';\r\n\r\nexport function updateSun(state) {\r\n const { control, map, date, slider, output, status } = state;\r\n try {\r\n if (control.live) control.time = new Date();\r\n const time = control.time.toISOString();\r\n date.value = time.slice(0, 10);\r\n slider.value = String(control.time.getUTCHours() * 60 + control.time.getUTCMinutes());\r\n output.textContent = `${time.slice(11, 16)} UTC${control.live ? ' \u00B7 now' : ''}`;\r\n const center = map.getCenter();\r\n const sun = map._sunlight = solarPosition(control.time, center.lat, center.lng);\r\n Object.assign(sun, atmosphere(sun.altitude));\r\n sun.moon = moonPosition(control.time, center.lat, center.lng);\r\n status.textContent = sun.altitude <= 0\r\n ? 'Night \u00B7 no direct sunlight'\r\n : sun.altitude < 3\r\n ? 'Low sun \u00B7 shadows paused'\r\n : `Sun altitude ${sun.altitude.toFixed(1)}\u00B0`;\r\n map.fire('simulationtimechange', { time: new Date(control.time), live: control.live });\r\n updateSky(state);\r\n render(map);\r\n } catch (error) {\r\n delete map._sunlight;\r\n updateSky(state);\r\n render(map);\r\n status.textContent = `Error: ${error.message}`;\r\n console.error('Solar simulation', error);\r\n }\r\n}\r\n", "import { updateSun } from './updateSun.js';\r\n\r\nexport function useLiveTime(state) {\r\n state.control.live = true;\r\n updateSun(state);\r\n}\r\n", "import { render } from './render.js';\r\nimport { updateSky } from './updateSky.js';\r\nimport { updateSun } from './updateSun.js';\r\n\r\nexport function useSelectedTime(state) {\r\n const { control, map, date, slider, status } = state;\r\n control.live = false;\r\n if (!date.value || !date.validity.valid) {\r\n control.time = new Date(NaN);\r\n map.fire('simulationtimechange', { time: null, live: false });\r\n delete map._sunlight;\r\n updateSky(state);\r\n render(map);\r\n status.textContent = 'Error: choose a valid solar date';\r\n return;\r\n }\r\n control.time = new Date(`${date.value}T00:00:00Z`);\r\n control.time.setUTCMinutes(Number(slider.value));\r\n updateSun(state);\r\n}\r\n", "import { updateSun } from './updateSun.js';\r\n\r\nexport function tickSun(state) {\r\n if (state.control.live) updateSun(state);\r\n}\r\n", "import { render } from './render.js';\r\nimport { updateSky } from './updateSky.js';\r\n\r\nexport function removeSun(state) {\r\n const { map, timer, sunDisc, moonDisc } = state;\r\n clearInterval(timer);\r\n delete map._timeControl;\r\n map.fire('simulationtimechange', { time: null, live: false });\r\n map.off('moveend', state.update);\r\n map.off('move rotate pitch resize', state.updateSky);\r\n delete map._sunlight;\r\n updateSky(state);\r\n sunDisc.remove(); moonDisc.remove();\r\n render(map);\r\n}\r\n", "import { cityMapper } from '../constants/cityMapper.js';\nimport { update as updateScene } from '../scene/update.js';\nimport { atmosphere } from './atmosphere.js';\nimport { moonPosition } from './moonPosition.js';\nimport { projectCelestialBody } from './projectCelestialBody.js';\nimport { solarPosition } from './solarPosition.js';\nimport { updateSky } from './updateSky.js';\nimport { render } from './render.js';\nimport { updateSun } from './updateSun.js';\nimport { useLiveTime } from './useLiveTime.js';\nimport { useSelectedTime } from './useSelectedTime.js';\nimport { tickSun } from './tickSun.js';\nimport { removeSun } from './removeSun.js';\n\nexport function onAddSun(control, map) {\n map._timeControl = control;\n const originalSky = map.getContainer().style.getPropertyValue('--leaflet-sky-background');\n const disc = 'position:absolute;width:18px;height:18px;border-radius:50%;transform:translate(-50%,-50%);pointer-events:none;';\n const sunDisc = L.DomUtil.create('div', 'sunlight-sun');\n const moonDisc = L.DomUtil.create('div', 'sunlight-moon');\n sunDisc.style.cssText = disc + 'background:#fff3bd;box-shadow:0 0 18px 7px #ffd27699;';\n moonDisc.style.cssText = disc + 'background:#dce5f2;box-shadow:0 0 10px 2px #cbdcff55;';\n sunDisc.setAttribute('role', 'img'); sunDisc.setAttribute('aria-label', 'Sun');\n moonDisc.setAttribute('role', 'img'); moonDisc.setAttribute('aria-label', 'Moon');\n const container = L.DomUtil.create('div', 'sunlight-control');\n container.style.cssText = 'color:#222;width:min(200px,calc(100vw - 60px));font:12px/1.4 sans-serif;';\n const date = document.createElement('input');\n date.type = 'date';\n date.style.cssText = 'width:100%;box-sizing:border-box;';\n date.setAttribute('aria-label', 'Solar date (UTC)');\n const slider = document.createElement('input');\n slider.type = 'range';\n slider.style.cssText = 'width:100%;box-sizing:border-box;margin:10px 0 4px;cursor:pointer;';\n slider.min = '0'; slider.max = '1439'; slider.step = '1';\n slider.setAttribute('aria-label', 'Time of day (UTC)');\n const output = document.createElement('output');\n output.style.cssText = 'font-weight:bold;font-variant-numeric:tabular-nums;';\n output.setAttribute('aria-live', 'off');\n const now = document.createElement('button');\n now.type = 'button'; now.textContent = 'Now';\n const timeRow = document.createElement('div');\n timeRow.className = 'sunlight-time';\n timeRow.style.cssText = 'display:flex;justify-content:space-between;align-items:center;';\n timeRow.append(output, now);\n const status = document.createElement('div');\n status.className = 'sunlight-status';\n status.style.marginTop = '5px';\n status.setAttribute('role', 'status');\n const note = document.createElement('small');\n note.style.color = '#555';\n note.textContent = 'Indicative \u00B7 loaded geometry only. Streetlight illumination is estimated, not measured lux.';\n container.append(date, slider, timeRow, status, note);\n const state = { control, map, originalSky, sunDisc, moonDisc, date, slider, output, status };\n state.update = updateSun.bind(null, state);\n state.updateSky = updateSky.bind(null, state);\n now.onclick = useLiveTime.bind(null, state);\n date.onchange = slider.oninput = useSelectedTime.bind(null, state);\n L.DomEvent.disableClickPropagation(container);\n L.DomEvent.disableScrollPropagation(container);\n state.update();\n state.timer = setInterval(tickSun, 60000, state);\n map.on('moveend', state.update);\n map.on('move rotate pitch resize', state.updateSky);\n control.onRemove = removeSun.bind(null, state);\n return container;\n}\n", "export const underEntryState = {};\n", "export function placeEntry(map, layer, element) {\n let input, entry;\n for (input of map.getContainer().querySelectorAll('.leaflet-control-layers-selector')) {\n entry = map._layers[input.layerId];\n if (input.layerId === L.Util.stamp(layer) || entry instanceof L.LayerGroup && entry.hasLayer(layer)) {\n input.closest('label').after(element);\n return true;\n }\n }\n return false;\n}\n", "import { placeEntry } from './placeEntry.js';\n\nexport function placeUnderEntry(state) {\n const nested = placeEntry(state.map, state.layer, state.element);\n const onPlace = state.onPlace;\n onPlace?.(nested);\n return nested;\n}\n", "import { underEntryState } from '../constants/underEntryState.js';\nimport { placeUnderEntry } from './placeUnderEntry.js';\n\nexport function runPlacements() {\n const state = underEntryState.pendingPlacements.shift();\n if (state?.map.hasLayer(state.layer)) placeUnderEntry(state);\n}\n", "import { underEntryState } from '../constants/underEntryState.js';\nimport { runPlacements } from './runPlacements.js';\n\nexport function replaceEntry() {\n underEntryState.pendingPlacements.push(this);\n queueMicrotask(runPlacements);\n}\n", "import { replaceEntry } from './replaceEntry.js';\n\nexport function removeEntry() {\n this.map.off('layeradd layerremove', replaceEntry, this);\n this.element.remove();\n}\n", "import { underEntryState } from '../constants/underEntryState.js';\nimport { placeUnderEntry } from './placeUnderEntry.js';\nimport { replaceEntry } from './replaceEntry.js';\nimport { removeEntry } from './removeEntry.js';\n\n/**\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 */\nunderEntryState.pendingPlacements = [];\n\nexport function underEntry(layer, element, onPlace) {\n const state = { map: layer._map, layer, element, onPlace };\n state.map.on('layeradd layerremove', replaceEntry, state);\n layer.once('remove', removeEntry, state);\n return placeUnderEntry(state);\n}\n", "export function addTimeLayer(map) {\r\n return this.control.addTo(map);\r\n}\r\n", "export function removeTimeLayer() {\r\n return L.Control.prototype.remove.call(this.control);\r\n}\r\n", "import { addTimeLayer } from './addTimeLayer.js';\r\nimport { removeTimeLayer } from './removeTimeLayer.js';\r\n\r\nexport function initialize(options) {\r\n L.Util.setOptions(this, options);\r\n this.live = true;\r\n this.layer = new L.Layer();\r\n this.layer.control = this;\r\n this.layer.onAdd = addTimeLayer;\r\n this.layer.onRemove = removeTimeLayer;\r\n}\r\n", "import { onAddSun } from './onAddSun.js';\r\n\r\nexport function onAdd(map) {\r\n return onAddSun(this, map);\r\n}\r\n", "export function styleTimeControl(container, nested) {\r\n container.classList.toggle('leaflet-control', !nested);\r\n container.classList.toggle('leaflet-bar', !nested);\r\n Object.assign(container.style, nested\r\n ? { background: '', padding: '2px 0 6px 20px', margin: '0' }\r\n : { background: '#fff', padding: '8px', margin: '' });\r\n}\r\n", "import { underEntry } from '../scene/underEntry.js';\r\nimport { styleTimeControl } from './styleTimeControl.js';\r\n\r\nexport function addTo(map) {\r\n L.Control.prototype.addTo.call(this, map);\r\n const container = this.getContainer();\r\n if (this.layer._map === map) underEntry(this.layer, container, styleTimeControl.bind(null, container));\r\n else styleTimeControl(container, false);\r\n return this;\r\n}\r\n", "export function remove() {\r\n if (this._map?.hasLayer(this.layer)) {\r\n this._map.removeLayer(this.layer);\r\n return this;\r\n }\r\n return L.Control.prototype.remove.call(this);\r\n}\r\n", "import { onAddSun } from './onAddSun.js';\nimport { underEntry } from '../scene/underEntry.js';\nimport { initialize } from './initialize.js';\nimport { onAdd } from './onAdd.js';\nimport { addTo } from './addTo.js';\nimport { remove } from './remove.js';\n\nL.Control.Time = L.Control.extend({\n options: { position: 'bottomright' },\n initialize,\n onAdd,\n addTo,\n remove,\n});", "export function triangle(position, normal, color, a, b, c, tint) {\n const u = [], v = [];\n let i, point, value;\n for (i = 0; i < b.length; i++) u.push(b[i] - a[i]);\n for (i = 0; i < c.length; i++) v.push(c[i] - a[i]);\n const n = [u[1] * v[2] - u[2] * v[1], u[2] * v[0] - u[0] * v[2], u[0] * v[1] - u[1] * v[0]], length = Math.hypot(...n);\n for (point of [a, b, c]) {\n position.push(...point);\n for (value of n) normal.push(value / length);\n color.push(...tint);\n }\n}\n", "import { triangle } from './triangle.js';\n\nexport function build(parts) {\n const position = [], normal = [], color = [];\n let ring, bottom, top, tint, topRing, low, high, x, z, i, j;\n for ([ring, bottom, top, tint, topRing = ring] of parts) {\n low = [], high = [];\n for ([x, z] of ring) low.push([x, bottom, z]);\n for ([x, z] of topRing) high.push([x, top, z]);\n for (i = 0; i < ring.length; i++) {\n j = (i + 1) % ring.length;\n triangle(position, normal, color, low[i], low[j], high[j], tint); triangle(position, normal, color, low[i], high[j], high[i], tint);\n }\n for (i = 1; i < ring.length - 1; i++) {\n triangle(position, normal, color, high[0], high[i], high[i + 1], tint); triangle(position, normal, color, low[0], low[i + 1], low[i], tint);\n }\n }\n return { position, normal, color };\n}\n", "export function tooltip({ properties: p }) {\n const content = document.createElement('div');\n content.style.whiteSpace = 'pre-line';\n const lines = [];\n let line;\n for (line of [p.name, p.departure && `Departure ${p.departure} ${p.timetable.timeZone}`, p.description]) {\n if (line) lines.push(line);\n }\n content.textContent = lines.join('\\n');\n return content;\n}\n", "export function box(x0, x1, z0, z1) {\n return [[x0, z0], [x1, z0], [x1, z1], [x0, z1]];\n}\n", "export const glass = [0.12, 0.15, 0.18];\n", "export const tyre = [0.05, 0.05, 0.05];\n", "import { box } from \"../geometry/box.js\";\n\nexport function mirror(x0, x1, z0, z1, ...rest) {\n return [\n [box(x0, x1, z0, z1), ...rest],\n [box(-x1, -x0, z0, z1), ...rest]\n ];\n}\n", "// Built-in vehicles for the 'traffic' type. Models are [ring of [x, z], bottom, top, rgb, topRing?] convex prisms in metres;\n// forward is -z, right is +x. `topRing` (same length as `ring`) tapers the prism; rgb components above 1 are self-lit lamps.\nexport const paints = [\n [0.86, 0.86, 0.88],\n [0.1, 0.1, 0.12],\n [0.5, 0.53, 0.57],\n [0.65, 0.1, 0.08],\n [0.12, 0.25, 0.55],\n [0.85, 0.7, 0.15]\n];\n", "export const headlight = [1.9, 1.85, 1.7];\n", "export const taillight = [1.7, 0.06, 0.05];\n", "import { box } from '../geometry/box.js';\r\nimport { glass } from '../constants/glass.js';\r\nimport { tyre } from '../constants/tyre.js';\r\nimport { mirror } from './mirror.js';\r\nimport { paints } from '../constants/paints.js';\r\nimport { headlight } from '../constants/headlight.js';\r\nimport { taillight } from '../constants/taillight.js';\r\n\r\nexport function carModel(i) {\r\n const paint = paints[i % paints.length];\r\n return [\r\n ...mirror(0.7, 0.92, -1.68, -1.02, 0, 0.64, tyre),\r\n ...mirror(0.7, 0.92, 1.02, 1.68, 0, 0.64, tyre),\r\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]],\r\n 0.28, 0.82, paint],\r\n // Greenhouse: the windscreen leans back, the rear window less.\r\n [box(-0.84, 0.84, -0.75, 1.6), 0.82, 1.38, glass, box(-0.7, 0.7, -0.05, 1.3)],\r\n [box(-0.71, 0.71, -0.06, 1.31), 1.38, 1.46, paint],\r\n ...mirror(0.38, 0.8, -2.3, -2.16, 0.56, 0.76, headlight),\r\n [box(-0.78, 0.78, 2.16, 2.3), 0.6, 0.76, taillight],\r\n ];\r\n}\r\n", "export const hull = [[-5.5, 30], [5.5, 30], [5.5, -20], [4, -26], [1.5, -30], [-1.5, -30], [-4, -26], [-5.5, -20]];\n", "export const white = [0.92, 0.93, 0.92];\n", "import { mirror } from './mirror.js';\n\nexport function boatBenches() {\n const benches = [];\n let i;\n for (i = 0; i < 12; i++) benches.push(...mirror(0.5, 3.8, -12 + i * 3, -11.3 + i * 3, 3.9, 4.4, [0.62, 0.1, 0.1]));\n return benches;\n}\n", "import { hull } from '../constants/hull.js';\r\nimport { box } from '../geometry/box.js';\r\nimport { glass } from '../constants/glass.js';\r\nimport { mirror } from './mirror.js';\r\nimport { white } from '../constants/white.js';\r\nimport { boatBenches } from './boatBenches.js';\r\n\r\n// Panoramic river cruiser, about 60 x 11 m.\r\nexport function boatModel() {\r\n return [\r\n [hull, 0, 0.8, [0.1, 0.16, 0.26]],\r\n [hull, 0.8, 1.4, white],\r\n [box(-5, 5, -18, 26), 1.4, 3.7, glass, box(-4.6, 4.6, -17.4, 25.6)],\r\n ...mirror(4.64, 4.74, -17, 25, 3.25, 3.45, [1.6, 1.25, 0.8]),\r\n [box(-4.8, 4.8, -17.8, 25.8), 3.7, 3.9, white],\r\n ...boatBenches(),\r\n ...mirror(4.65, 4.8, -13.6, 25.8, 3.9, 4.8, white),\r\n [box(-4.8, 4.8, 25.65, 25.8), 3.9, 4.8, white],\r\n [box(-2.2, 2.2, -17.6, -14), 3.9, 4.7, white],\r\n [box(-2.2, 2.2, -17.6, -14), 4.7, 5.5, glass],\r\n [box(-2.5, 2.5, -18, -13.6), 5.5, 5.7, white],\r\n [box(-2.45, -2.2, -16.2, -15.8), 5, 5.3, [2, 0.15, 0.1]],\r\n [box(2.2, 2.45, -16.2, -15.8), 5, 5.3, [0.1, 2, 0.4]],\r\n [box(-0.1, 0.1, -15.9, -15.7), 5.7, 6.6, white],\r\n [box(-0.15, 0.15, -15.95, -15.65), 6.6, 6.8, [2, 2, 1.9]],\r\n ];\r\n}\r\n", "export function routeColor(properties) {\r\n const color = properties?.route_color;\r\n if (!/^[\\da-f]{6}$/i.test(color)) return [0.1, 0.55, 0.65];\r\n const value = Number.parseInt(color, 16);\r\n return [(value >> 16 & 255) / 255, (value >> 8 & 255) / 255, (value & 255) / 255];\r\n}\n", "import { box } from '../geometry/box.js';\nimport { glass } from '../constants/glass.js';\nimport { tyre } from '../constants/tyre.js';\nimport { white } from '../constants/white.js';\nimport { headlight } from '../constants/headlight.js';\nimport { taillight } from '../constants/taillight.js';\n\nexport function carriage(center, length, color) {\r\n const front = center - length / 2, rear = center + length / 2;\r\n return [\r\n [box(-1.25, 1.25, front, rear), 0.45, 1.25, color],\r\n [box(-1.2, 1.2, front + 0.15, rear - 0.15), 1.25, 2.65, glass],\r\n [box(-1.25, 1.25, front, rear), 2.65, 3.1, white],\r\n [box(-1.15, -0.85, front + 1, front + 2), 0, 0.7, tyre],\r\n [box(0.85, 1.15, rear - 2, rear - 1), 0, 0.7, tyre],\r\n [box(-0.9, 0.9, front - 0.03, front), 0.8, 1.05, headlight],\r\n [box(-0.9, 0.9, rear, rear + 0.03), 0.8, 1.05, taillight],\r\n ];\r\n}\n", "import { routeColor } from '../traffic/routeColor.js';\nimport { carriage } from './carriage.js';\n\nexport function busModel(index, properties) {\r\n return carriage(0, 12, routeColor(properties));\r\n}\n", "import { routeColor } from '../traffic/routeColor.js';\nimport { carriage } from './carriage.js';\n\nexport function tramModel(index, properties) {\n const color = routeColor(properties), parts = [];\n let car;\n for (car = 0; car < 5; car++) parts.push(...carriage((car - 2) * 6.5, 6, color));\n return parts;\n}\n", "import { routeColor } from '../traffic/routeColor.js';\nimport { carriage } from './carriage.js';\n\nexport function metroModel(index, properties) {\n const color = routeColor(properties), parts = [];\n let car;\n for (car = 0; car < 5; car++) parts.push(...carriage((car - 2) * 15, 14, color));\n return parts;\n}\n", "// Pedestrian, about 1.77 m tall, prisms as in utils/vehicles.js (forward -z). Limbs hang from their pivot at y = 0.\nexport const skin = [0.85, 0.64, 0.5];\n", "export const trousers = [0.16, 0.2, 0.32];\n", "export const dark = [0.08, 0.07, 0.06];\n", "import { box } from '../geometry/box.js';\nimport { skin } from '../constants/skin.js';\nimport { trousers } from '../constants/trousers.js';\nimport { dark } from '../constants/dark.js';\nimport { paints } from '../constants/paints.js';\n\nexport function bicycleModel(index) {\r\n const paint = paints[index % paints.length];\r\n return [\r\n [box(-0.045, 0.045, -0.85, -0.25), 0.02, 0.62, dark],\r\n [box(-0.045, 0.045, 0.25, 0.85), 0.02, 0.62, dark],\r\n [box(-0.06, 0.06, -0.5, 0.5), 0.4, 0.65, paint],\r\n [box(-0.32, 0.32, -0.58, -0.5), 0.95, 1.02, dark],\r\n [box(-0.1, 0.1, 0.15, 0.4), 0.85, 0.92, dark],\r\n [box(-0.18, 0.18, -0.12, 0.28), 1, 1.5, paint],\r\n [box(-0.11, 0.11, -0.22, 0), 1.5, 1.72, skin],\r\n [box(-0.13, 0.13, -0.23, 0.01), 1.72, 1.8, paint],\r\n [box(-0.25, -0.15, -0.5, -0.05), 1, 1.25, skin],\r\n [box(0.15, 0.25, -0.5, -0.05), 1, 1.25, skin],\r\n [box(-0.2, -0.08, 0, 0.32), 0.3, 1, trousers],\r\n [box(0.08, 0.2, -0.25, 0.07), 0.3, 1, trousers],\r\n ];\r\n}\n", "export const shirt = [0.75, 0.2, 0.15];\n", "import { box } from \"../geometry/box.js\";\nimport { trousers } from './trousers.js';\nimport { shirt } from './shirt.js';\nimport { skin } from './skin.js';\nimport { dark } from './dark.js';\n\n\nexport const parts = {\n body: [\n [box(-0.17, 0.17, -0.1, 0.1), 0.82, 0.95, trousers],\n [box(-0.19, 0.19, -0.11, 0.11), 0.95, 1.44, shirt],\n [box(-0.05, 0.05, -0.05, 0.05), 1.44, 1.5, skin],\n [box(-0.1, 0.1, -0.11, 0.1), 1.5, 1.72, skin],\n [box(-0.105, 0.105, -0.06, 0.115), 1.58, 1.77, dark],\n [box(-0.105, 0.105, -0.115, -0.06), 1.7, 1.77, dark],\n ],\n leg: [[box(-0.07, 0.07, -0.07, 0.07), -0.82, 0, trousers], [box(-0.07, 0.07, -0.17, 0.07), -0.9, -0.82, dark]],\n arm: [[box(-0.05, 0.05, -0.05, 0.05), -0.55, 0, shirt], [box(-0.045, 0.045, -0.045, 0.045), -0.66, -0.55, skin]],\n};\n", "import { box } from '../geometry/box.js';\nimport { parts } from '../constants/parts.js';\nimport { skin } from '../constants/skin.js';\nimport { trousers } from '../constants/trousers.js';\nimport { paints } from '../constants/paints.js';\n\nexport function pedestrianModel(index) {\r\n const model = parts.body.slice();\r\n model[1] = [model[1][0], model[1][1], model[1][2], paints[index % paints.length]];\r\n model.push(\r\n [box(-0.16, -0.02, -0.07, 0.07), 0.08, 0.9, trousers],\r\n [box(0.02, 0.16, -0.07, 0.07), 0.08, 0.9, trousers],\r\n [box(-0.3, -0.2, -0.05, 0.05), 0.76, 1.42, skin],\r\n [box(0.2, 0.3, -0.05, 0.05), 0.76, 1.42, skin],\r\n );\r\n return model;\r\n}\n", "import { carModel } from '../vehicles/carModel.js';\nimport { boatModel } from '../vehicles/boatModel.js';\nimport { busModel } from '../vehicles/busModel.js';\nimport { tramModel } from '../vehicles/tramModel.js';\nimport { metroModel } from '../vehicles/metroModel.js';\nimport { bicycleModel } from '../vehicles/bicycleModel.js';\nimport { pedestrianModel } from '../vehicles/pedestrianModel.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 bicycle: { side: 0.4, model: bicycleModel },\n pedestrian: { side: 0.3, model: pedestrianModel },\n bus: { side: 1.5, model: busModel },\n tram: { side: 0, model: tramModel },\n metro: { side: 0, model: metroModel },\n car: {\n side: 1.8,\n model: carModel,\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: boatModel,\n lights: [{\n position: [0, 8, 4],\n radius: 30,\n color: [1, 0.8, 0.55],\n flux: 20000\n }]\n },\n};\n", "// One workgroup per vehicle shares its lane lookup and pose across all model vertices.\r\nexport const trafficShader = /* wgsl */ ` struct Params{seconds:f32,side:f32,vertices:u32,total:u32}struct Vehicle{start:u32,count:u32,base:f32,speed:f32}@group(0)@binding(0)var<uniform> params:Params;@group(0)@binding(1)var<storage,read> model:array<f32>;@group(0)@binding(2)var<storage,read> points:array<vec4f>;@group(0)@binding(3)var<storage,read> vehicles:array<Vehicle>;@group(0)@binding(4)var<storage,read_write> position:array<f32>;@group(0)@binding(5)var<storage,read_write> normal:array<f32>;var<workgroup> center:vec3f;var<workgroup> heading:vec2f;@compute@workgroup_size(64)fn main(@builtin(workgroup_id)group:vec3u,@builtin(local_invocation_index)thread:u32){let vehicleIndex = group.x;if(thread == 0u){let vehicle = vehicles[vehicleIndex];let last = vehicle.start + vehicle.count - 1u;let length = points[last].w;var s = vehicle.base + params.seconds * vehicle.speed;s -= length * floor(s / length);var i = vehicle.start + 1u;var end = last;while(i < end){let middle = i +(end - i)/ 2u;if(points[middle].w < s){i = middle + 1u;}else{end = middle;}}let a = points[i - 1u];let b = points[i];let d = select(b.w - a.w,1.0,b.w == a.w);let t =(s - a.w)/ d;heading =(b.xy - a.xy)/ d;center = vec3f(a.x +(b.x - a.x)* t - heading.y * params.side,a.z +(b.z - a.z)* t,a.y +(b.y - a.y)* t + heading.x * params.side);}workgroupBarrier();for(var vertex = thread;vertex < params.vertices;vertex += 64u){let k = vertex * 3u;let n = params.vertices * 3u + k;let o =(vehicleIndex * params.vertices + vertex)* 3u;position[o]= center.x - model[k]* heading.y - model[k + 2u]* heading.x;position[o + 1u]= center.y + model[k + 1u];position[o + 2u]= center.z + model[k]* heading.x - model[k + 2u]* heading.y;normal[o]= -model[n]* heading.y - model[n + 2u]* heading.x;normal[o + 1u]= model[n + 1u];normal[o + 2u]= model[n]* heading.x - model[n + 2u]* heading.y;}}`;\r\n", "/** Point and unit direction at distance `s` along `points` ([x, z, y?]) with cumulative `lengths`. */\n\nexport function along(points, lengths, s) {\n let i = 1, end = lengths.length - 1;\n let middle;\n while (i < end) {\n middle = i + Math.floor((end - i) / 2);\n if (lengths[middle] < s) i = middle + 1;\n else end = middle;\n }\n const a = points[i - 1], b = points[i], d = lengths[i] - lengths[i - 1] || 1;\n const t = (s - lengths[i - 1]) / d;\n return { x: a[0] + (b[0] - a[0]) * t, y: (a[2] ?? 0) + ((b[2] ?? 0) - (a[2] ?? 0)) * t, z: a[1] + (b[1] - a[1]) * t, dx: (b[0] - a[0]) / d, dz: (b[1] - a[1]) / d };\n}\n", "import { along } from './along.js';\n\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}\n", "import { locateTraffic } from './locateTraffic.js';\n\nexport function placeTraffic(state) {\n if (!state.mesh || !state.stale) return;\n state.stale = false;\n const { position, normal } = state.mesh.geometry.attributes;\n let i, trip, cx, y, cz, dx, dz, k, o, lx, lz, nx, nz;\n for (i = 0; i < state.trips.length; i++) {\n trip = state.trips[i];\n ({ x: cx, y, z: cz, dx, dz } = locateTraffic(state, trip));\n for (k = 0, o = i * state.stride; k < state.stride; k += 3, o += 3) {\n lx = state.template.position[k], lz = state.template.position[k + 2], nx = state.template.normal[k], nz = state.template.normal[k + 2];\n position.data[o] = cx - lx * dz - lz * dx;\n position.data[o + 1] = y + state.template.position[k + 1];\n position.data[o + 2] = cz + lx * dx - lz * dz;\n normal.data[o] = -nx * dz - nz * dx;\n normal.data[o + 1] = state.template.normal[k + 1];\n normal.data[o + 2] = nx * dx - nz * dz;\n }\n }\n}\n", "import { underEntry } from '../scene/underEntry.js';\n\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}\n", "import { placeTraffic } from './placeTraffic.js';\nimport { startTraffic } from './startTraffic.js';\n\nexport function addTraffic(state) {\r\n state.layer._beforeRaycast = placeTraffic.bind(null, state);\r\n if (state.ready) startTraffic(state);\r\n}\n", "import * as disposeMesh from '../rendering/disposeMesh.js';\nimport * as setHighlight from '../picking/setHighlight.js';\nimport * as showFeature from '../picking/showFeature.js';\n\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}\n", "export function destroyTrafficGpu(state) {\n let buffer;\n for (buffer of [state.gpu?.params, state.gpu?.template, state.gpu?.points, state.gpu?.vehicles]) buffer?.destroy();\n state.gpu = null;\n}\n", "import { disposeTrafficObject } from './disposeTrafficObject.js';\nimport { destroyTrafficGpu } from './destroyTrafficGpu.js';\n\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}\n", "import { startTraffic } from './startTraffic.js';\n\nexport function readyTraffic(state) {\r\n state.ready = true;\r\n if (state.layer._map) startTraffic(state);\r\n}\n", "import { speed } from \"../constants/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 const offsets = Array.from({ length: count });\n let i;\n for (i = 0; i < offsets.length; i++) offsets[i] = (i + 0.5) * length / count;\n return offsets;\n}\n", "\n\nexport function clockMinutes(clockTime) {\n const parts = clockTime.split(':');\n return Number(parts[0]) * 60 + Number(parts[1]);\n}\n", "\n\nexport function compareDepartures(a, b) {\n return a - b;\n}\n", "import { clockMinutes } from './clockMinutes.js';\nimport { compareDepartures } from './compareDepartures.js';\n\n/**\n * Trips of a frequency-based timetable (like GTFS frequencies.txt) underway at `date`, in the timetable's local time.\n * @param {{timeZone: string, duration: number, services: Array<{from: string, to: string, every?: number, months?: number[], weekdays?: number[]}>}} timetable\n * `duration` and `every` are minutes; `from`/`to` are 'HH:MM' first/last departures; months are 1-12, weekdays 0 (Sunday)-6.\n * @returns {Array<{id: string, departure: string, progress: number}>} `progress` is 0-1 along the lane.\n */\n\nexport function scheduledTrips(date, { timeZone, duration, services }) {\n const time = new Date(date);\n if (!Number.isFinite(time.getTime())) throw new Error('Invalid date');\n const clock = new Intl.DateTimeFormat('en-GB', {\n timeZone, year: 'numeric', month: '2-digit', day: '2-digit',\n hour: '2-digit', minute: '2-digit', second: '2-digit', hourCycle: 'h23',\n });\n const parts = {};\n let part, from, to, every, months, weekdays, departure;\n for (part of clock.formatToParts(time)) {\n if (part.type !== 'literal') parts[part.type] = Number(part.value);\n }\n const minute = parts.hour * 60 + parts.minute + (parts.second + time.getUTCMilliseconds() / 1000) / 60;\n const weekday = new Date(Date.UTC(parts.year, parts.month - 1, parts.day)).getUTCDay();\n const departures = [];\n for ({ from, to, every = Infinity, months, weekdays } of services) {\n if (months?.includes(parts.month) === false || weekdays?.includes(weekday) === false) continue;\n for (departure = clockMinutes(from); departure <= clockMinutes(to); departure += every) departures.push(departure);\n }\n departures.sort(compareDepartures);\n const trips = [];\n for (departure of departures) {\n if (minute >= departure && minute < departure + duration) trips.push({\n id: `${parts.year}-${parts.month}-${parts.day}-${departure}`,\n departure: `${String(Math.floor(departure / 60)).padStart(2, '0')}:${String(departure % 60).padStart(2, '0')}`,\n progress: (minute - departure) / duration,\n });\n }\n return trips;\n}\n", "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 function tripsAt(time, lanes, velocity) {\n const trips = [];\n let l, lane, timetable, flow, trip, travelled, offsets, k;\n for (l = 0; l < lanes.length; l++) {\n lane = lanes[l];\n ({ timetable, flow = 0 } = lane.properties);\n if (!lane.length) continue;\n if (timetable) {\n for (trip of scheduledTrips(time, timetable)) trips.push({\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 } else {\n travelled = time / 1000 * velocity;\n offsets = lane.offsets ||= vehicleOffsets(lane.length, flow, velocity);\n for (k = 0; k < offsets.length; k++) trips.push({\n id: `${l}-${k}`, lane, distance: (offsets[k] + travelled) % lane.length, speed: velocity, properties: lane.properties,\n });\n }\n }\n return trips;\n}\n", "export function trafficNow(state) {\r\n const control = state.layer._map?._timeControl || { live: true };\r\n return { live: control.live, time: control.live ? new Date() : control.time };\r\n}\n", "export function failTraffic(state, error) {\r\n state.error = 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}\n", "/** Dashed lane outline, in layer-local metres. */\n\nexport function routeGeometry(lanes) {\n const position = [], normal = [], color = [];\n let points, lengths, properties, raw, rgb, tint, i, a, b, dx, dz, length, x, z, distance, start, end;\n let p, q, point;\n for ({ points, lengths, properties } of lanes) {\n raw = properties?.route_color;\n rgb = /^[\\da-f]{6}$/i.test(raw) ? Number.parseInt(raw, 16) : null;\n tint = rgb === null ? [0.08, 0.7, 0.85]\n : [(rgb >> 16 & 255) / 255, (rgb >> 8 & 255) / 255, (rgb & 255) / 255];\n for (i = 1; i < points.length; i++) {\n a = points[i - 1], b = points[i];\n dx = b[0] - a[0], dz = b[1] - a[1], length = lengths[i] - lengths[i - 1];\n if (!length) continue;\n x = -dz / length * 2.5, z = dx / length * 2.5;\n for (distance = Math.floor(lengths[i - 1] / 30) * 30; distance < lengths[i]; distance += 30) {\n start = Math.max(0, (distance - lengths[i - 1]) / length);\n end = Math.min(1, (distance + 18 - lengths[i - 1]) / length);\n if (end <= start) continue;\n p = [a[0] + dx * start, a[1] + dz * start, a[2] + (b[2] - a[2]) * start + 0.4];\n q = [a[0] + dx * end, a[1] + dz * end, a[2] + (b[2] - a[2]) * end + 0.4];\n for (point of [[p[0] - x, p[2], p[1] - z], [p[0] + x, p[2], p[1] + z], [q[0] + x, q[2], q[1] + z],\n [p[0] - x, p[2], p[1] - z], [q[0] + x, q[2], q[1] + z], [q[0] - x, q[2], q[1] - z]]) {\n position.push(...point); normal.push(0, 1, 0); color.push(...tint);\n }\n }\n }\n }\n return { position, normal, color };\n}\n", "import * as createMeshApi from '../rendering/createMesh.js';\n\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}\n", "import { routeGeometry } from './routeGeometry.js';\nimport { createTrafficMesh } from './createTrafficMesh.js';\n\nexport function drawTrafficRoute(state) {\r\n state.route = createTrafficMesh(state, routeGeometry(state.lanes), [], { unlit: true });\r\n}\n", "import { computeBounds } from '../geometry/computeBounds.js';\n\nexport function trafficBounds(state) {\n let radius = 20, height = 5;\n let i, lane, x, z, y;\n for (i = 0; i < state.template.position.length; i += 3) {\n radius = Math.max(radius, Math.hypot(state.template.position[i], state.template.position[i + 2]) + Math.abs(state.side));\n height = Math.max(height, state.template.position[i + 1]);\n }\n const data = [];\n for (lane of state.lanes) {\n for ([x, z, y] of lane.points) data.push(x - radius, y, z - radius, x + radius, y + height, z + radius);\n }\n const extent = { attributes: { position: { data } } };\n computeBounds(extent);\n state.mesh.geometry.bounds = extent.bounds;\n}\n", "import { build } from '../geometry/build.js';\nimport { createTrafficMesh } from './createTrafficMesh.js';\nimport { disposeTrafficObject } from './disposeTrafficObject.js';\nimport { trafficBounds } from './trafficBounds.js';\n\nexport function rebuildTrafficMesh(state) {\n const { trips, model, vertices } = state;\n disposeTrafficObject(state, state.mesh);\n state.mesh = null;\n if (!trips.length) return;\n const color = [], featureFaces = [];\n let i, trip, component;\n for (i = 0; i < trips.length; i++) {\n trip = trips[i];\n for (component of build(model(i, trip.properties)).color) color.push(component);\n featureFaces.push({\n id: trip.id, properties: trip.properties, faceStart: i * vertices / 3, faceEnd: (i + 1) * vertices / 3,\n vertexStart: i * vertices, vertexEnd: (i + 1) * vertices\n });\n }\n const count = color.length / 3;\n state.mesh = createTrafficMesh(state, {\n position: new Array(color.length).fill(0), normal: new Array(color.length).fill(0), color,\n }, featureFaces, {}, GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC);\n state.mesh.geometry.drawRange.count = count;\n state.mesh.extras.dynamicLights = true;\n trafficBounds(state);\n}\n", "export 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}\n", "import { destroyTrafficGpu } from './destroyTrafficGpu.js';\nimport { trafficStorage } from './trafficStorage.js';\n\nexport function rebaseTraffic(state) {\n const { device } = state.layer.renderer;\n if (state.gpu?.device !== device) {\n destroyTrafficGpu(state);\n state.gpu = {\n device,\n pipeline: device.createComputePipeline({ layout: 'auto', compute: { module: device.createShaderModule({ code: state.shader }), entryPoint: 'main' } }),\n params: device.createBuffer({ size: 16, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST }),\n template: trafficStorage(device, new Float32Array([...state.template.position, ...state.template.normal])),\n };\n state.lanesDirty = true;\n }\n let lane, i, point, trip, binding;\n if (state.lanesDirty) {\n let count = 0;\n for (lane of state.lanes) count += lane.points.length;\n const data = new Float32Array(count * 4);\n let offset = 0;\n for (lane of state.lanes) {\n lane.start = offset / 4;\n for (i = 0; i < lane.points.length; i++) {\n point = lane.points[i];\n data[offset++] = point[0];\n data[offset++] = point[1];\n data[offset++] = point[2];\n data[offset++] = lane.lengths[i];\n }\n }\n state.gpu.points?.destroy();\n state.gpu.points = trafficStorage(device, data);\n state.lanesDirty = false;\n }\n const data = new Float32Array(state.trips.length * 4), index = new Uint32Array(data.buffer);\n for (i = 0; i < state.trips.length; i++) {\n trip = state.trips[i];\n index[i * 4] = trip.lane.start;\n index[i * 4 + 1] = trip.lane.points.length;\n data[i * 4 + 2] = trip.distance;\n data[i * 4 + 3] = trip.speed;\n state.mesh.extras.featureFaces[i].properties = trip.properties;\n }\n if (state.gpu.vehicles?.size >= data.byteLength) device.queue.writeBuffer(state.gpu.vehicles, 0, data);\n else {\n state.gpu.vehicles?.destroy();\n state.gpu.vehicles = trafficStorage(device, data);\n }\n const { position, normal } = state.mesh.geometry.attributes;\n const buffers = [state.gpu.params, state.gpu.template, state.gpu.points, state.gpu.vehicles, position.buffer, normal.buffer];\n const entries = [];\n for (binding = 0; binding < buffers.length; binding++) entries.push({ binding, resource: { buffer: buffers[binding] } });\n state.gpu.bindGroup = device.createBindGroup({\n layout: state.gpu.pipeline.getBindGroupLayout(0),\n entries,\n });\n}\n", "export 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(state.trips.length);\r\n pass.end();\r\n device.queue.submit([encoder.finish()]);\r\n state.stale = true;\r\n}\n", "import { update as updateScene } from '../scene/update.js';\nimport { tripsAt } from './tripsAt.js';\nimport { trafficNow } from './trafficNow.js';\nimport { failTraffic } from './failTraffic.js';\nimport { drawTrafficRoute } from './drawTrafficRoute.js';\nimport { rebuildTrafficMesh } from './rebuildTrafficMesh.js';\nimport { rebaseTraffic } from './rebaseTraffic.js';\nimport { moveTraffic } from './moveTraffic.js';\nimport { locateTraffic } from './locateTraffic.js';\n\nexport function tickTraffic(state) {\n state.frame = undefined;\n if (!state.ready || !state.layer._map) return;\n if (!state.layer.renderer) { state.frame = requestAnimationFrame(state.tick); return; }\n if (state.mesh && !(state.mesh.geometry.attributes.position.buffer.usage & GPUBufferUsage.STORAGE)) {\n state.tripsKey = null;\n state.nextCheck = -Infinity;\n }\n const { live, time } = trafficNow(state), ms = time?.getTime(), valid = Number.isFinite(ms);\n let changed = false;\n let trip, x, y, z, dx, dz, lx, ly, lz, light;\n if (!live || !valid || !(ms >= state.rebasedAt && ms < state.nextCheck)) {\n let text;\n try {\n state.trips = valid ? tripsAt(time, state.lanes, state.velocity) : [];\n text = !valid ? 'Select a valid simulation date' : !state.loaded ? 'Loading\u2026' :\n `${state.trips.length} ${state.vehicle === 'boat' ? 'boats' : state.vehicle}`;\n } catch (error) { return failTraffic(state, error); }\n state.rebasedAt = ms;\n state.nextCheck = ms + 1000;\n const ids = [];\n for (trip of state.trips) ids.push(trip.id);\n const key = ids.join();\n changed = key !== state.tripsKey || (state.outline && !state.route && state.lanes.length);\n if (state.outline && !state.route && state.lanes.length) drawTrafficRoute(state);\n if (key !== state.tripsKey) { rebuildTrafficMesh(state); state.tripsKey = key; }\n if (state.mesh) rebaseTraffic(state);\n if (!state.error) {\n if (state.status.textContent !== text) state.status.textContent = text;\n state.status.removeAttribute('role');\n }\n }\n if (state.mesh) moveTraffic(state, (ms - state.rebasedAt) / 1000);\n if (state.mesh && state.lights && (!live || !(performance.now() - state.litAt < 100))) {\n state.litAt = performance.now();\n const lights = [];\n for (trip of state.trips) {\n ({ x, y, z, dx, dz } = locateTraffic(state, trip));\n for ({ position: [lx, ly, lz], ...light } of state.lights) {\n lights.push({ ...light, position: [x - lx * dz - lz * dx, y + ly, z + lx * dx - lz * dz] });\n }\n }\n state.mesh.extras.lights = lights;\n }\n if (state.mesh || changed) updateScene(state.layer);\n if (live && valid) state.frame = requestAnimationFrame(state.tick);\n}\n", "export 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}\n", "// GeoJSON (Multi)LineStrings become lanes ({latlngs, properties, elevation?}); prepare() adds `points` ([x, z, ground]),\n// `lengths` and `length` in layer-local metres.\n\nexport function toLanes({ features = [] }) {\n const lanes = [];\n let geometry, properties, lines, line, latlngs, lng, lat;\n for ({ geometry, properties } of features) {\n lines = geometry?.type === 'LineString' ? [geometry.coordinates] : geometry?.type === 'MultiLineString' ? geometry.coordinates : [];\n for (line of lines) {\n latlngs = [];\n for ([lng, lat] of line) latlngs.push([lat, lng]);\n lanes.push({ latlngs, properties: properties ?? {}, elevation: properties?.elevation });\n }\n }\n return lanes;\n}\n", "import { getElevation } from '../terrain/getElevation.js';\n\nexport function groundTraffic(state) {\n const { layer, lanes } = state;\n const terrain = layer._map._terrain3D?._terrainReady && layer._map._terrain3D, base = layer.root.position[1];\n let lane, i, elevation;\n for (lane of lanes) {\n for (i = 0; i < lane.points.length; i++) {\n elevation = terrain && (lane.elevation ?? getElevation(terrain, lane.latlngs[i]));\n lane.points[i][2] = Number.isFinite(elevation) && Number.isFinite(base) ? elevation - base : 0;\n }\n }\n state.lanesDirty = true;\n state.nextCheck = -Infinity;\n}\n", "import { disposeTrafficObject } from './disposeTrafficObject.js';\nimport { groundTraffic } from './groundTraffic.js';\n\nexport function prepareTraffic(state) {\n const { layer, lanes } = state;\n const crs = layer._map.options.crs, origin = crs.project(layer.location);\n const metres = Math.cos(layer.location.lat * Math.PI / 180);\n let lane, lat, lng, point, i;\n for (lane of lanes) {\n lane.points = [];\n for ([lat, lng] of lane.latlngs) {\n point = crs.project(new L.LatLng(lat, lng));\n lane.points.push([(point.x - origin.x) * metres, -(point.y - origin.y) * metres, 0]);\n }\n lane.lengths = [0];\n for (i = 1; i < lane.points.length; i++) {\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]));\n }\n lane.length = lane.lengths.at(-1);\n }\n groundTraffic(state);\n disposeTrafficObject(state, state.route);\n state.route = null;\n state.tripsKey = null;\n}\n", "import { toLanes } from './toLanes.js';\nimport { prepareTraffic } from './prepareTraffic.js';\n\nexport function loadedTrafficLanes(state, signal, data) {\r\n if (signal.aborted || !state.layer._map) return;\r\n state.error = null;\r\n if (data === state.loaded) {\r\n state.nextCheck = -Infinity;\r\n if (!state.frame) state.tick();\r\n return;\r\n }\r\n state.loaded = data;\r\n state.lanes = toLanes(data);\r\n prepareTraffic(state);\r\n if (!state.frame) state.tick();\r\n}\n", "import { failTraffic } from './failTraffic.js';\n\nexport function failedTrafficLoad(state, signal, error) {\r\n if (!signal.aborted && error.name !== 'AbortError') failTraffic(state, error);\r\n}\n", "import { trafficNow } from './trafficNow.js';\nimport { fetchTrafficLanes } from './fetchTrafficLanes.js';\nimport { loadedTrafficLanes } from './loadedTrafficLanes.js';\nimport { failedTrafficLoad } from './failedTrafficLoad.js';\n\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, signal),\r\n );\r\n}\n", "import { loadTraffic } from './loadTraffic.js';\n\nexport function updateTraffic(state, event) {\r\n if (event?.layer && !event.layer.control?.time) return;\r\n cancelAnimationFrame(state.frame);\r\n loadTraffic(state);\r\n state.tick();\r\n}\n", "import { disposeTrafficObject } from './disposeTrafficObject.js';\nimport { groundTraffic } from './groundTraffic.js';\nimport { trafficBounds } from './trafficBounds.js';\n\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}\n", "\uFEFF/**\r\n * Vehicles moving along GeoJSON lanes; a compute pass places them on the GPU every frame.\r\n * Source options:\r\n * - `url`: GeoJSON (Multi)LineStrings, or a JS module whose default export `(time, layer, signal)` returns them (time-dependent data);\r\n * - `vehicle`: 'car' (default), 'boat', 'bus', 'tram', 'metro', 'bicycle' or 'pedestrian'; `side`: offset right of the lane centreline in metres (vehicle default);\r\n * - `speed`: m/s of `flow` lanes; `outline`: draw the lanes.\r\n * Lane properties: `flow` (vehicles/h) or `timetable` (see scheduledTrips.js), optional fixed `elevation`\r\n * in metres, `name`/`description` for the default tooltip. The status line (count and vehicle type) sits under the layer's entry in the layers control.\r\n * L.Control.Time on the same map drives the time; without one, vehicles run live.\r\n */\r\nimport { build } from '../geometry/build.js';\r\nimport { init3D } from '../scene/init3D.js';\r\nimport { tooltip } from './tooltip.js';\r\nimport { speed } from '../constants/speed.js';\r\nimport { vehicles } from '../constants/vehicles.js';\r\nimport { trafficShader } from '../constants/trafficShader.js';\r\nimport { addTraffic } from './addTraffic.js';\nimport { placeTraffic } from './placeTraffic.js';\nimport { removeTraffic } from './removeTraffic.js';\nimport { readyTraffic } from './readyTraffic.js';\nimport { tickTraffic } from './tickTraffic.js';\nimport { updateTraffic } from './updateTraffic.js';\nimport { updateTrafficTerrain } from './updateTrafficTerrain.js';\r\n\r\nexport function initTraffic(layer, { url, vehicle = 'car', side, outline, speed: velocity = speed, ...options } = {}) {\r\n const { model, lights, side: defaultSide } = vehicles[vehicle];\r\n side ??= defaultSide;\r\n init3D(layer, {\r\n tooltip,\r\n nightLight: Boolean(lights),\r\n ...options,\r\n });\r\n const status = L.DomUtil.create('small', 'traffic-status');\r\n status.style.cssText = 'display:block;max-width:200px;margin:0 0 4px 20px;color:#555;';\r\n const template = build(model(0)), stride = template.position.length, vertices = stride / 3;\r\n const params = new ArrayBuffer(16), paramFloats = new Float32Array(params), paramInts = new Uint32Array(params);\r\n const state = {\r\n layer, url, model, lights, side, outline, velocity, vehicle, status, template, stride, vertices,\r\n params, paramFloats, paramInts,\r\n ready: false, frame: undefined, request: undefined, lanes: [], tripsKey: undefined,\r\n mesh: undefined, route: undefined, litAt: -Infinity,\r\n trips: [], rebasedAt: 0, nextCheck: -Infinity, elapsed: 0, gpu: null,\r\n lanesDirty: true, stale: false, loaded: undefined, file: undefined,\r\n };\r\n // Lane points are [x, z, ground, cumulative length]. Mirrors along() and place().\r\n state.shader = trafficShader;\r\n state.tick = tickTraffic.bind(null, state);\r\n state.update = updateTraffic.bind(null, state);\r\n state.terrain = updateTrafficTerrain.bind(null, state);\r\n layer._beforeRaycast = placeTraffic.bind(null, state);\r\n layer.on('ready', readyTraffic.bind(null, state));\r\n layer.on('add', addTraffic.bind(null, state));\r\n layer.on('remove', removeTraffic.bind(null, state));\r\n}\r\n", "export function onBlur() {\r\n this.keys.clear();\r\n}\n", "// W/S (\u2191/\u2193) run forward/back along the heading, A/D (\u2190/\u2192) turn: [forward, turn].\nexport const moves = {\n KeyW: [1, 0],\n ArrowUp: [1, 0],\n KeyS: [-1, 0],\n ArrowDown: [-1, 0],\n KeyD: [0, 1],\n ArrowRight: [0, 1],\n KeyA: [0, -1],\n ArrowLeft: [0, -1]\n};\n", "export 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}\n", "// [part, pivot x, pivot y, swing sign]\n\nexport const limbs = [\n ['body', 0, 0, 0],\n ['leg', -0.09, 0.9, 1],\n ['leg', 0.09, 0.9, -1],\n ['arm', -0.25, 1.42, -1],\n ['arm', 0.25, 1.42, 1]\n];\n", "import { getElevation } from '../terrain/getElevation.js';\n\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}\n", "import { update } from '../scene/update.js';\nimport { limbs } from '../constants/limbs.js';\nimport { local } from './local.js';\n\nexport function place() {\n const [x, y, z] = local.call(this);\n // Model forward is -z; a yaw of -heading turns it to the compass heading (x east, -z north).\n const yaw = -this.state.heading, cos = Math.cos(yaw), sin = Math.sin(yaw);\n let i, px, py, sign, mesh;\n for (i = 0; i < limbs.length; i++) {\n [, px, py, sign] = limbs[i];\n mesh = this.meshes[i];\n mesh.position[0] = x + px * cos; mesh.position[1] = y + py; mesh.position[2] = z - px * sin;\n mesh.rotation[0] = sign * this.swing * Math.sin(this.state.phase);\n mesh.rotation[1] = yaw;\n }\n update(this.layer);\n}\n", "import { place } from './place.js';\n\nexport function onTerrain() {\r\n if (this.meshes) place.call(this);\r\n}\n", "import * as disposeMesh from '../rendering/disposeMesh.js';\nimport { onKey } from './onKey.js';\nimport { onBlur } from './onBlur.js';\nimport { onPointer } from './onPointer.js';\nimport { onTerrain } from './onTerrain.js';\n\nexport function stop() {\n const map = this.layer._map;\n cancelAnimationFrame(this.frame);\n this.keys.clear(); this.drag = null;\n L.DomEvent.off(document, 'keydown keyup', this.onKey);\n L.DomEvent.off(window, 'blur', this.onBlur);\n let mesh, name;\n for (mesh of this.meshes || []) disposeMesh.disposeMesh(this.layer, mesh);\n this.meshes = null;\n this.button.setAttribute('aria-pressed', 'false');\n this.button.style.background = '#fff';\n this.hint.style.display = 'none';\n if (!map || !this.saved) return;\n L.DomEvent.off(map.getContainer(), 'pointerdown pointermove pointerup pointercancel', this.onPointer);\n map.off('terrainchange', this.onTerrain);\n map.options.scrollWheelZoom = this.saved.scrollWheelZoom;\n for (name of this.saved.handlers) map[name].enable();\n map.setView(this.state.latlng, this.saved.zoom, { animate: false });\n map.setPitch(this.saved.pitch);\n this.saved = null;\n}\n", "import { moves } from '../constants/moves.js';\nimport { stop } from './stop.js';\n\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}\n", "export function wrap(angle) {\n return Math.atan2(Math.sin(angle), Math.cos(angle));\n}\n", "\nexport const colliders = new WeakMap();\n", "import { CELL } from '../constants/CELL.js';\nimport { colliders } from '../constants/colliders.js';\n\n\nexport function collider(mesh) {\n let c = colliders.get(mesh.geometry);\n if (c) return c;\n const m = mesh.worldMatrix, { position: { data: p }, index, normal, uv } = mesh.geometry.attributes;\n\n const count = index ? index.count : p.length / 3, tri = [], nrm = [], cells = new Map(), v = [];\n\n let i, first, k, j, x, y, z, ex, ey, ez, fx, fy, fz, nx, nz, ny, length, a, h, t, ix, iz, key;\n for (i = 0; i < count; i += 3) {\n first = index ? index.data[i] : i;\n // Streetlight halos (uv.x <= 2, see scene/picking.js) are light, not matter.\n if (mesh.program.nightLight && uv && uv.data[first * 2] <= 2) {\n continue;\n }\n for (k = 0; k < 3; k++) {\n j = (index ? index.data[i + k] : i + k) * 3, x = p[j], y = p[j + 1], z = p[j + 2];\n v[k * 3] = m[0] * x + m[4] * y + m[8] * z + m[12];\n v[k * 3 + 1] = m[1] * x + m[5] * y + m[9] * z + m[13];\n v[k * 3 + 2] = m[2] * x + m[6] * y + m[10] * z + m[14];\n }\n ex = v[3] - v[0], ey = v[4] - v[1], ez = v[5] - v[2], fx = v[6] - v[0], fy = v[7] - v[1], fz = v[8] - v[2];\n\n nx = ey * fz - ez * fy, nz = ex * fy - ey * fx;\n\n ny = ez * fx - ex * fz, length = Math.hypot(nx, ny, nz);\n\n if (!length || Math.abs(ny) > 0.9 * length) {\n continue;\n }\n\n if (normal) {\n // The stored normal tells the outside, whatever the winding.\n j = first * 3, a = normal.data;\n if ((m[0] * a[j] + m[4] * a[j + 1] + m[8] * a[j + 2]) * nx + (m[2] * a[j] + m[6] * a[j + 1] + m[10] * a[j + 2]) * nz < 0) { nx = -nx; nz = -nz; }\n }\n\n h = Math.hypot(nx, nz), t = nrm.length / 2;\n\n tri.push(...v);\n nrm.push(nx / h, nz / h);\n\n for (ix = Math.floor(Math.min(v[0], v[3], v[6]) / CELL); ix <= Math.floor(Math.max(v[0], v[3], v[6]) / CELL); ix++)\n for (iz = Math.floor(Math.min(v[2], v[5], v[8]) / CELL); iz <= Math.floor(Math.max(v[2], v[5], v[8]) / CELL); iz++) {\n key = ix + ',' + iz;\n if (!cells.has(key)) {\n cells.set(key, []);\n }\n cells.get(key).push(t);\n }\n }\n c = {\n tri: Float32Array.from(tri),\n nrm: Float32Array.from(nrm),\n cells,\n origin: [m[12], m[13], m[14]]\n };\n colliders.set(mesh.geometry, c);\n return c;\n}\n", "// M\u00F6ller-Trumbore for the horizontal ray (ox, oy, oz) + d\u00B7(dx, 0, dz) against triangle t; returns d or -1.\nexport function horizontalRay(v, t, ox, oy, oz, dx, dz) {\n const i = t * 9, ex = v[i + 3] - v[i], ey = v[i + 4] - v[i + 1], ez = v[i + 5] - v[i + 2];\n const fx = v[i + 6] - v[i], fy = v[i + 7] - v[i + 1], fz = v[i + 8] - v[i + 2];\n const px = -dz * fy, py = dz * fx - dx * fz, pz = dx * fy, det = ex * px + ey * py + ez * pz;\n if (Math.abs(det) < 1e-9) return -1;\n const tx = ox - v[i], ty = oy - v[i + 1], tz = oz - v[i + 2], u = (tx * px + ty * py + tz * pz) / det;\n if (u < 0 || u > 1) return -1;\n const qx = ty * ez - tz * ey, qy = tz * ex - tx * ez, qz = tx * ey - ty * ex, w = (dx * qx + dz * qz) / det;\n if (w < 0 || u + w > 1) return -1;\n return (fx * qx + fy * qy + fz * qz) / det;\n}\n", "export function shouldSkipOther(other, layer) {\n return other === layer || other._type === 'terrain' || other._type === 'traffic';\n}\n", "import { computeBounds } from '../geometry/computeBounds.js';\nimport { collider } from '../collision/collider.js';\nimport { CELL } from '../constants/CELL.js';\nimport { horizontalRay } from '../collision/horizontalRay.js';\n\nexport function hitMesh(mesh, data) {\n if (!mesh.visible) return true;\n if (!mesh.geometry?.attributes?.position?.data || mesh.program?.depthTest === false) return;\n if (!mesh.geometry.bounds) computeBounds(mesh.geometry);\n const m = mesh.worldMatrix, { center: k, radius } = mesh.geometry.bounds;\n const { x, y, z, dx, dz, reach } = data;\n if (Math.hypot(m[0] * k[0] + m[4] * k[1] + m[8] * k[2] + m[12] - x, m[2] * k[0] + m[6] * k[1] + m[10] * k[2] + m[14] - z) >\n radius * Math.hypot(m[0], m[1], m[2]) + reach) return;\n const c = collider(mesh), ox = x - m[12] + c.origin[0], oy = y - m[13] + c.origin[1], oz = z - m[14] + c.origin[2];\n const seen = new Set();\n let ix, iz, t, height, d;\n for (ix = Math.floor(Math.min(ox, ox + dx * reach) / CELL); ix <= Math.floor(Math.max(ox, ox + dx * reach) / CELL); ix++)\n for (iz = Math.floor(Math.min(oz, oz + dz * reach) / CELL); iz <= Math.floor(Math.max(oz, oz + dz * reach) / CELL); iz++)\n for (t of c.cells.get(ix + ',' + iz) || []) {\n if (seen.has(t) || dx * c.nrm[t * 2] + dz * c.nrm[t * 2 + 1] >= 0) continue;\n seen.add(t);\n for (height of [0.4, 1.5]) {\n d = horizontalRay(c.tri, t, ox, oy + height, oz, dx, dz);\n if (d >= 0 && d < data.best) {\n data.best = d;\n data.found = [c.nrm[t * 2], c.nrm[t * 2 + 1]];\n }\n }\n }\n}\n", "import { CELL } from '../constants/CELL.js';\nimport { collider } from '../collision/collider.js';\nimport { computeBounds } from '../geometry/computeBounds.js';\nimport { horizontalRay } from '../collision/horizontalRay.js';\nimport { traverse } from '../scene/traverse.js';\nimport { updateWorldMatrix } from '../scene/updateWorldMatrix.js';\nimport { shouldSkipOther } from './shouldSkipOther.js';\nimport { hitMesh } from './hitMesh.js';\n\n// Horizontal normal of the nearest wall faced within `reach` metres of the feet at world (x, y, z), walking along\n// the unit (dx, dz); knee and chest rays, so arches and tree crowns above the head let the walker through.\n// ponytail: traffic vehicles and boats move on the GPU and are not obstacles.\n\nexport function hit(layer, x, y, z, dx, dz, reach) {\n updateWorldMatrix(layer.scene);\n const data = { x, y, z, dx, dz, reach, best: reach, found: null };\n let other;\n for (other of layer._shared._layers) {\n if (shouldSkipOther(other, layer)) continue;\n traverse(other.root, hitMesh, data);\n }\n return data.found;\n}\n", "import { hit } from '../picking/hit.js';\n\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}\n", "import * as createMesh from '../rendering/createMesh.js';\nimport { build } from '../geometry/build.js';\nimport { limbs } from '../constants/limbs.js';\nimport { moves } from '../constants/moves.js';\nimport { parts } from '../constants/parts.js';\nimport { wrap } from '../utils/wrap.js';\nimport { local } from './local.js';\nimport { place } from './place.js';\nimport { blocked } from './blocked.js';\n\nexport function step(now) {\n const layer = this.layer, map = layer._map;\n this.frame = requestAnimationFrame(this.step);\n const dt = Math.min(0.1, (now - (this.last ?? now)) / 1000);\n this.last = now;\n if (!layer.renderer) return;\n let changed = false;\n let part, key, i;\n if (!this.meshes) {\n this.meshes = [];\n for ([part] of limbs) this.meshes.push(createMesh.createMesh(layer, build(parts[part])));\n changed = true;\n }\n let forward = 0, turn = 0;\n for (key of this.keys) { forward += moves[key]?.[0] || 0; turn += moves[key]?.[1] || 0; }\n forward = Math.sign(forward); turn = Math.sign(turn);\n if (turn) { this.state.heading = wrap(this.state.heading + turn * 2.5 * dt); changed = true; }\n if (forward) {\n const metres = forward * this.speed * dt, { lat, lng } = this.state.latlng, { position, scale } = layer.root;\n let east = Math.sin(this.state.heading) * metres, north = Math.cos(this.state.heading) * metres;\n const feet = local.call(this);\n for (i = 0; i < feet.length; i++) feet[i] = position[i] + scale[i] * feet[i];\n // World x is east, z south; keep 0.3 m from walls and slide along the one in the way.\n const wall = blocked.call(this, east, north, feet);\n if (wall) {\n const into = east * wall[0] - north * wall[1];\n east -= into * wall[0]; north += into * wall[1];\n if (blocked.call(this, east, north, feet)) east = north = 0;\n }\n this.state.latlng = new L.LatLng(lat + north / 111320, lng + east / (111320 * Math.cos(lat * Math.PI / 180)));\n this.state.phase += Math.hypot(east, north) / 1.6 * Math.PI;\n changed = true;\n }\n if (forward || turn) {\n // The camera (looking along -bearing) swings back behind the walker.\n const bearing = map.getBearing() * Math.PI / 180, behind = wrap(-this.state.heading - bearing);\n if (Math.abs(behind) > 1e-3) map._setPitchAndBearing(map.getPitch(), (bearing + behind * Math.min(1, dt * 4)) * 180 / Math.PI);\n map.setView(this.state.latlng, map.getZoom(), { animate: false });\n }\n const target = forward ? 0.9 : 0;\n if (Math.abs(this.swing - target) > 1e-3) { this.swing += (target - this.swing) * Math.min(1, dt * 10); changed = true; }\n if (changed) place.call(this);\n}\n", "import { step } from './step.js';\nimport { onKey } from './onKey.js';\nimport { onBlur } from './onBlur.js';\nimport { onPointer } from './onPointer.js';\nimport { onTerrain } from './onTerrain.js';\n\nexport function start() {\n const map = this.layer._map;\n if (this.saved || !map) return;\n this.state.latlng = map.getCenter();\n // Zoom whose camera distance (1.5 viewport heights, as in scene/render.js) is about `distance` metres behind the walker.\n const pixelsPerMetre = map.getSize().y * 1.5 / this.distance;\n const zoom = Math.min(map.getMaxZoom(), Math.log2(pixelsPerMetre * 40075016.68557849 * Math.cos(this.state.latlng.lat * Math.PI / 180) / 256));\n const handlers = [];\n let name;\n for (name of ['dragging', 'keyboard', 'doubleClickZoom', 'boxZoom']) {\n if (map[name]?.enabled()) handlers.push(name);\n }\n this.saved = {\n zoom: map.getZoom(), pitch: map.getPitch(), scrollWheelZoom: map.options.scrollWheelZoom, handlers\n };\n for (name of this.saved.handlers) map[name].disable();\n // Wheel zoom moves the camera closer or farther, keeping the walker centred.\n map.options.scrollWheelZoom = this.saved.scrollWheelZoom && 'center';\n this.state.heading = -map.getBearing() * Math.PI / 180;\n map.setView(this.state.latlng, zoom, { animate: false });\n map.setPitch(75);\n L.DomEvent.on(document, 'keydown keyup', this.onKey);\n L.DomEvent.on(window, 'blur', this.onBlur);\n L.DomEvent.on(map.getContainer(), 'pointerdown pointermove pointerup pointercancel', this.onPointer);\n map.on('terrainchange', this.onTerrain);\n this.button.setAttribute('aria-pressed', 'true');\n this.button.style.background = '#e4e4e4';\n this.hint.style.display = '';\n this.last = undefined;\n this.frame = requestAnimationFrame(this.step);\n}\n", "import { start } from './start.js';\nimport { stop } from './stop.js';\n\nexport function toggle() {\r\n if (this.saved) stop.call(this); else start.call(this);\r\n}\n", "import { init3D } from '../scene/init3D.js';\r\nimport { onBlur } from './onBlur.js';\r\nimport { onKey } from './onKey.js';\r\nimport { onPointer } from './onPointer.js';\r\nimport { onTerrain } from './onTerrain.js';\r\nimport { start } from './start.js';\r\nimport { step } from './step.js';\r\nimport { stop } from './stop.js';\r\nimport { toggle } from './toggle.js';\r\n\r\nexport function createWalk(control, {\r\n speed,\r\n distance,\r\n ...options\r\n} = {}) {\r\n const layer = new L.Layer();\r\n layer._type = 'walk';\r\n init3D(layer, options);\r\n const keys = new Set();\r\n const container = L.DomUtil.create('div', 'leaflet-bar leaflet-control');\r\n container.style.cssText = 'display:flex;align-items:center;background:#fff;';\r\n const button = L.DomUtil.create('button', '', container);\r\n button.type = 'button';\r\n button.title = 'Walk';\r\n button.setAttribute('aria-label', 'Walk');\r\n button.setAttribute('aria-pressed', 'false');\r\n button.textContent = '\uD83D\uDEB6';\r\n button.style.cssText = 'width:30px;height:30px;padding:0;border:0;border-radius:4px;background:#fff;font-size:18px;line-height:30px;cursor:pointer;';\r\n const hint = L.DomUtil.create('small', '', container);\r\n hint.style.cssText = 'display:none;padding:0 8px;color:#333;white-space:nowrap;';\r\n hint.textContent = 'W/S: run \u00B7 A/D: turn \u00B7 drag: look around \u00B7 Esc: exit';\r\n L.DomEvent.disableClickPropagation(container);\r\n\r\n const context = {\r\n layer,\r\n speed,\r\n distance,\r\n keys,\r\n container,\r\n button,\r\n hint,\r\n meshes: null,\r\n frame: null,\r\n last: undefined,\r\n swing: 0,\r\n saved: null,\r\n drag: null,\r\n state: control.walker = layer.walker = { latlng: null, heading: 0, phase: 0 }\r\n }\r\n context.step = step.bind(context);\r\n context.onKey = onKey.bind(context);\r\n context.onBlur = onBlur.bind(context);\r\n context.onPointer = onPointer.bind(context);\r\n context.onTerrain = onTerrain.bind(context);\r\n context.start = start.bind(context);\r\n context.stop = stop.bind(context);\r\n context.toggle = toggle.bind(context);\r\n control._walk = context;\r\n L.DomEvent.on(button, 'click', context.toggle);\r\n}\r\n", "import { createWalk } from './createWalk.js';\r\n\r\nexport function initialize(options) {\r\n L.Util.setOptions(this, options);\r\n createWalk(this, this.options);\r\n}\r\n", "export function onAdd(map) {\r\n this._walk.layer.addTo(map);\r\n return this._walk.container;\r\n}\r\n", "export function onRemove() {\r\n this._walk.stop();\r\n this._walk.layer.remove();\r\n}\r\n", "import { initialize } from './initialize.js';\nimport { onAdd } from './onAdd.js';\nimport { onRemove } from './onRemove.js';\n\n/**\n * Third-person walk mode, toggled by a map button (and Esc): a pedestrian at the map centre runs with W/S (or \u2191/\u2193) and\n * turns with A/D (or \u2190/\u2192); the camera swings back behind it while it moves. Dragging the map only turns the camera\n * (bearing, pitch); the wheel changes the camera distance.\n * The walker follows the terrain, bridges included, and `control.walker` exposes `{ latlng, heading, phase }`.\n * Options: `speed` (m/s, default 70), `distance` (camera distance in metres, default 20), `position` (button corner, default 'bottomright').\n * Visible meshes of the other 3D layers (buildings, trees, models, streetlights) are solid; terrain and traffic are not.\n */\nL.Control.Walk = L.Control.extend({\n options: { position: 'bottomright', speed: 70, distance: 20 },\n initialize,\n onAdd,\n onRemove,\n});\n", "export const indexState = {};\n", "export function emptyEvents() {\n return {};\n}\n", "export function refreshNativeLayerContract(layer = this) {\n layer?._nativeGPU?.refresh?.();\n}\n", "export function bringNativeLayerToFront(layer = this) {\n layer?._nativeGPU?.reorder?.(true);\n}\n", "export function bringNativeLayerToBack(layer = this) {\n layer?._nativeGPU?.reorder?.(false);\n}\n", "import { indexState } from '../constants/indexState.js';\n\nexport function closestCameraLayerPoint(point) {\n this._project();\n this._parts = this._rings;\n return indexState.closestMethods.get(this).call(this, point);\n}\n", "import { indexState } from '../constants/indexState.js';\n\nexport function cameraCircleBounds() {\n this._project();\n return indexState.boundsMethods.get(this).call(this);\n}\n", "import { indexState } from '../constants/indexState.js';\n\nexport function initializeGridContainer() {\n indexState.gridInitializers.get(this).call(this);\n this._container.remove();\n}\n", "import { indexState } from '../constants/indexState.js';\n\nexport function cancelGridFade(layer) {\n indexState.pendingGridFades.delete(layer);\n layer._fadeFrame = null;\n if (!indexState.pendingGridFades.size && indexState.gridFadeFrame !== null) {\n cancelAnimationFrame(indexState.gridFadeFrame);\n indexState.gridFadeFrame = null;\n }\n}\n", "import { indexState } from '../constants/indexState.js';\nimport { updateGridOpacity } from './updateGridOpacity.js';\n\nexport function runGridFades() {\n indexState.gridFadeFrame = null;\n const layers = [...indexState.pendingGridFades];\n let layer, version;\n for ([layer, version] of layers) {\n if (indexState.pendingGridFades.get(layer) !== version) continue;\n indexState.pendingGridFades.delete(layer);\n layer._fadeFrame = null;\n updateGridOpacity.call(layer);\n }\n}\n", "import { indexState } from '../constants/indexState.js';\nimport { runGridFades } from './runGridFades.js';\n\nexport function scheduleGridFade(layer) {\n layer._fadeVersion = (layer._fadeVersion || 0) + 1;\n indexState.pendingGridFades.set(layer, layer._fadeVersion);\n if (indexState.gridFadeFrame === null) indexState.gridFadeFrame = requestAnimationFrame(runGridFades);\n layer._fadeFrame = indexState.gridFadeFrame;\n}\n", "import { cancelGridFade } from './cancelGridFade.js';\nimport { scheduleGridFade } from './scheduleGridFade.js';\n\nexport function updateGridOpacity() {\n if (!this._map) return;\n const layer = this, now = Date.now();\n let fading = false, prune = false;\n let tile;\n for (tile of Object.values(this._tiles || {})) {\n if (!tile.current || !tile.loaded) continue;\n tile._gpuOpacity = this._map._fadeAnimated ? Math.min(1, (now - tile.loaded) / 200) : 1;\n if (tile._gpuOpacity < 1) fading = true;\n else if (!tile.active) {\n this._onOpaqueTile(tile);\n tile.active = true;\n prune = true;\n }\n }\n if (prune && !this._noPrune) this._pruneTiles();\n this._nativeGPU?.refresh?.();\n cancelGridFade(layer);\n if (fading) scheduleGridFade(layer);\n}\n", "import { indexState } from '../constants/indexState.js';\n\nexport function fireRasterLoad() {\n indexState.pendingRasterLoads.shift()?.fire('load');\n}\n", "import { indexState } from '../constants/indexState.js';\nimport { fireRasterLoad } from './fireRasterLoad.js';\n\nexport function addRasterImage() {\n if (!this._image) this._initImage();\n if (this._image.complete && this._image.naturalWidth) {\n indexState.pendingRasterLoads.push(this);\n queueMicrotask(fireRasterLoad);\n }\n}\n", "import { noOperation } from '../utils/noOperation.js';\nimport { emptyEvents } from '../scene/emptyEvents.js';\nimport { refreshNativeLayerContract } from './refreshNativeLayerContract.js';\nimport { bringNativeLayerToFront } from './bringNativeLayerToFront.js';\nimport { bringNativeLayerToBack } from './bringNativeLayerToBack.js';\nimport { indexState } from '../constants/indexState.js';\nimport { closestCameraLayerPoint } from './closestCameraLayerPoint.js';\nimport { cameraCircleBounds } from './cameraCircleBounds.js';\nimport { initializeGridContainer } from './initializeGridContainer.js';\nimport { updateGridOpacity } from './updateGridOpacity.js';\nimport { addRasterImage } from './addRasterImage.js';\n\nexport function initializeNativeLayer() {\n if (this instanceof L.Polyline || this instanceof L.CircleMarker) {\n this.beforeAdd = this.onAdd = this.onRemove = this._updateBounds = noOperation;\n this.getEvents = emptyEvents;\n this._renderer = {\n options: { tolerance: 0 },\n _updatePath: refreshNativeLayerContract,\n _updateStyle: refreshNativeLayerContract,\n _bringToFront: bringNativeLayerToFront,\n _bringToBack: bringNativeLayerToBack,\n };\n if (this instanceof L.Polyline) {\n indexState.closestMethods.set(this, this.closestLayerPoint);\n this.closestLayerPoint = closestCameraLayerPoint;\n }\n if (this instanceof L.Circle) {\n indexState.boundsMethods.set(this, this.getBounds);\n this.getBounds = cameraCircleBounds;\n }\n } else if (this instanceof L.GridLayer) {\n indexState.gridInitializers.set(this, this._initContainer);\n this._initContainer = initializeGridContainer;\n this._updateOpacity = updateGridOpacity;\n } else if (this instanceof L.ImageOverlay && !(this instanceof L.VideoOverlay) && !(this instanceof L.SVGOverlay)) {\n this.onAdd = addRasterImage;\n this.onRemove = noOperation;\n this.getEvents = emptyEvents;\n this._reset = refreshNativeLayerContract;\n }\n}\n", "import { indexState } from '../constants/indexState.js';\nimport { initNativeGPU } from '../core/initNativeGPU.js';\n\nexport function layerLayerAdd(event) {\n const native = !this._3d && (\n this instanceof L.GridLayer ||\n this instanceof L.Polyline ||\n this instanceof L.CircleMarker ||\n this instanceof L.Marker && !(this.options.icon instanceof L.DivIcon) ||\n this instanceof L.ImageOverlay && !(this instanceof L.VideoOverlay) && !(this instanceof L.SVGOverlay)\n );\n if (native) {\n if (this instanceof L.GridLayer || this instanceof L.ImageOverlay) {\n this.options.crossOrigin ||= true;\n }\n if (this instanceof L.Marker) this.options.icon.options.crossOrigin ||= true;\n }\n indexState.layerProto._layerAdd.call(this, event);\n if (!native || !event.target.hasLayer(this)) return;\n initNativeGPU(this, event.target);\n}\n", "import { setGeoJSONData } from './setGeoJSONData.js';\n\nexport function setGeoJSONLayerData(data) {\n return setGeoJSONData(this, data);\n}\n", "import { setGeoJSONLayerData } from './setGeoJSONLayerData.js';\nimport { init3D } from '../scene/init3D.js';\n\nexport function initializeGeoJSON(layer, options) {\n layer._geojson = true;\n layer.setData = setGeoJSONLayerData;\n init3D(layer, options);\n}\n", "import { initializeGeoJSON } from '../sources/initializeGeoJSON.js';\nimport { initRaster } from '../raster/initRaster.js';\nimport { initTerrain } from '../terrain/initTerrain.js';\nimport { initTraffic } from '../traffic/initTraffic.js';\n\nexport function initializerFor(type) {\n switch (type) {\n case 'geojson': return initializeGeoJSON;\n case 'pmtiles': return initRaster;\n case 'terrain': return initTerrain;\n case 'traffic': return initTraffic;\n default: throw new Error(`Unknown layer type: ${type}`);\n }\n}\n", "import { indexState } from '../constants/indexState.js';\nimport { initializerFor } from './initializerFor.js';\n\nexport function resolveNextInitialization() {\n const task = indexState.pendingInitializations.shift();\n try {\n task.initialize = initializerFor(task.type);\n } catch (error) {\n task.error = error;\n }\n return task;\n}\n", "export function initializeLayer(task) {\n const { layer, ready } = task;\n try {\n if (task.error) throw task.error;\n const map = layer._map;\n map?.removeLayer(layer);\n delete layer.onAdd;\n delete layer.onRemove;\n task.initialize(layer, task.settings);\n map?.addLayer(layer);\n return layer.ready === ready ? layer : layer.ready;\n } catch (error) {\n layer.fire('error', { error });\n throw error;\n }\n}\n", "import { indexState } from '../constants/indexState.js';\nimport { init3D } from './init3D.js';\nimport { noOperation } from '../utils/noOperation.js';\nimport { resolveNextInitialization } from './resolveNextInitialization.js';\nimport { initializeLayer } from './initializeLayer.js';\n\nexport function layerInitialize(options = {}) {\n if (Object.getPrototypeOf(this) !== L.Layer.prototype || !options.source) {\n if (indexState.layerProto.initialize) return indexState.layerProto.initialize.apply(this, arguments);\n L.Util.setOptions(this, options);\n return;\n }\n const {\n source: {\n type = options.source.data?.type === 'FeatureCollection'\n ? 'geojson'\n : /\\.pmtiles(?:[?#]|$)/i.test(options.source.url) ? 'pmtiles' : '3d',\n ...source\n },\n ...core\n } = options;\n const settings = { ...source, ...core };\n L.Util.setOptions(this, core);\n this._type = type;\n if (type === '3d') {\n init3D(this, settings);\n return;\n }\n this.onAdd = noOperation;\n this.onRemove = noOperation;\n // ponytail: type methods (setOpacity, add, ...) exist only once `ready` resolves.\n const task = { layer: this, type, settings, ready: null };\n indexState.pendingInitializations.push(task);\n indexState.loading = indexState.loading.catch(noOperation).then(resolveNextInitialization);\n const ready = this.ready = indexState.loading.then(initializeLayer);\n task.ready = ready;\n ready.catch(noOperation);\n}\n", "import './camera/mapCamera.js';\nimport { init3D } from './scene/init3D.js';\nimport { initNativeGPU } from './core/initNativeGPU.js';\nimport { initRaster } from './raster/initRaster.js';\nimport { setGeoJSONData } from './sources/setGeoJSONData.js';\nimport { initTerrain } from './terrain/initTerrain.js';\nimport './sunlight/initSunlight.js';\nimport { initTraffic } from './traffic/initTraffic.js';\nimport './walk/initWalk.js';\nimport { indexState } from './constants/indexState.js';\nimport { initializeNativeLayer } from './core/initializeNativeLayer.js';\nimport { layerLayerAdd } from './scene/layerLayerAdd.js';\nimport { layerInitialize } from './scene/layerInitialize.js';\n\n/**\n * `new L.Layer({ source: { type, url, ...settings }, pane, attribution })`: layers with a `source`\n * initialize their specialized behavior on first use. Native map layers also join the WebGPU scene.\n */\n\n/**\n * Router for `new L.Layer({ source: { type, url, ...settings }, pane, attribution })`.\n * It initializes the existing instance from the bundled source modules;\n * types receive flat options (`{ ...source, pane, attribution }`), so `layer.options.url` etc.\n *\n * Folder layout:\n * - scene/: source routing, lifecycle and graph; initializers live in their domain folders.\n * - core/: Leaflet layer integration; camera/ and controls/: camera and interaction.\n * - sources/ and picking/: source geometry and feature interaction.\n * - rendering/, shaders/, shadows/ and lighting/: WebGPU drawing and illumination.\n * - geometry/, triangulation/ and collision/: mesh operations and spatial queries.\n * - models/, archives/ and raster/: glTF loading, archive access and raster tiles.\n * - constants/ and state/: exported module-level const and let bindings.\n * - terrain/, sunlight/, traffic/ and walk/: feature-specific operations.\n * Operations receive the layer explicitly, without subclasses or prototype replacement.\n * Dataset-specific code and data (routes, timetables, API loaders) belong to the application, e.g. misc/.\n *\n * When `type` is omitted, inline FeatureCollections use 'geojson'; otherwise *.pmtiles URLs use\n * 'pmtiles' and other sources use '3d'.\n */\n\nindexState.layerProto = Object.defineProperties({}, Object.getOwnPropertyDescriptors(L.Layer.prototype));\n\n// One chain for every pending layer: they become real layers in creation order.\nindexState.loading = Promise.resolve();\n\nindexState.pendingInitializations = [];\n\nindexState.closestMethods = new WeakMap();\nindexState.boundsMethods = new WeakMap();\nindexState.gridInitializers = new WeakMap();\n\nindexState.pendingGridFades = new Map();\nindexState.gridFadeFrame = null;\n\nindexState.pendingRasterLoads = [];\n\n/**\n * The '3d' layer type: native WebGPU scene synchronized with the map camera.\n * Layers on one map share a canvas, scene and camera; each has its own root transform.\n *\n * @typedef {Object} Layer3DOptions Layer options; pane and attribution remain standard L.Layer options.\n * @property {string} [type] '3d', 'geojson', 'pmtiles', 'terrain' or 'traffic'.\n * @property {number[]} [center] Local origin [lat,lng]; defaults to the first map center.\n * @property {number} [terrainOffset=0] Vertical offset in metres when terrain is enabled.\n * @property {boolean} [terrainConform=false] Fit lower model geometry to local terrain elevation.\n * @property {'OPAQUE'|'MASK'|'BLEND'} [alphaMode] Override every glTF material's alpha mode.\n * @property {number[]} [rotation] Model Euler rotation [x,y,z] in radians, YXZ order.\n * @property {number[]} [scale] Model scale [x,y,z].\n * @property {string} [url] GLB/glTF model URL or PMTiles archive URL.\n * @property {function(Object): (ExtrusionStyle|null)} [style] Source styling; null skips a feature.\n * @property {function(PickedFeature): (Node|string)} [tooltip] Tooltip content; strings are text.\n * @property {string} [ariaLabel='3D scene'] Shared canvas accessible name.\n * @property {boolean} [nightLight=false] Point sources: emissive bulbs and local illumination.\n * @property {boolean} [nightSparkle=false] Model: sparse luminous points at night.\n *\n * @typedef {Object} ExtrusionStyle\n * @property {number} top Roof height in metres; must exceed bottom.\n * @property {number} [bottom=0] Nonnegative base height.\n * @property {number|string|Object} [color=0xd9b38c] RGB/CSS color or linear-space {h,s,l}.\n * @property {number} [trunkRadius] Point tree trunk radius in metres.\n * @property {number} [crownRadius] Point tree crown radius in metres.\n * @property {number} [crownBottom] Point tree crown base in metres.\n * @property {string} [crownShape='round'] Point tree crown shape.\n * @property {number|string|Object} [trunkColor=0x72513a] Point tree bark color.\n * @property {number} [lightRadius] Point light estimated ground reach in metres.\n * @property {number} [lightFlux] Point light luminous flux in lumens.\n *\n * @typedef {Object} PickedFeature\n * @property {string|number} id Source feature id or configured model URL.\n * @property {Object} properties GeoJSON properties or model-level glTF extras.\n * @property {Object} mesh Intersected mesh.\n * @property {number[]} point Intersection [x,y,z] in shared scene metres.\n * @property {Object} [model] Configured model root; absent for source polygons.\n * @property {number} [vertexStart] First polygon vertex in the batched mesh.\n * @property {number} [vertexEnd] Exclusive end of the polygon's vertex range.\n *\n * @typedef {Object} SourceArea\n * @property {Object} coords Archive block {z,x,y}.\n * @property {AbortController} request Cancellation prevents attaching obsolete results.\n * @property {boolean} [done] Geometry built successfully, including empty blocks.\n * @property {Object|null} [mesh] Batched GPU mesh.\n * @property {number} [buildings] Emitted feature count.\n * @property {number} [skipped] Features skipped by style.\n * @property {string} [error] Failed load/build message.\n *\n * @param {L.Layer} backend\n * @param {Layer3DOptions} [options] World origin comes from center or the first map centre.\n */\n\nL.Layer.include({\n _layerAdd: layerLayerAdd,\n initialize: layerInitialize,\n});\n\nL.Layer.addInitHook(initializeNativeLayer);"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["editable", "target", "init_editable", "__esmMin", "shiftRotateWheel", "event", "handler", "editable", "init_shiftRotateWheel", "__esmMin", "init_editable", "shiftRotateAddHooks", "container", "shiftRotateWheel", "init_shiftRotateAddHooks", "__esmMin", "init_shiftRotateWheel", "shiftRotateRemoveHooks", "container", "init_shiftRotateRemoveHooks", "__esmMin", "ShiftRotate", "init_ShiftRotate", "__esmMin", "init_shiftRotateAddHooks", "init_shiftRotateRemoveHooks", "shiftRotateAddHooks", "shiftRotateRemoveHooks", "cameraControlsState", "init_cameraControlsState", "__esmMin", "cameraDragDown", "event", "state", "cameraControlsState", "editable", "rect", "init_cameraDragDown", "__esmMin", "init_cameraControlsState", "init_editable", "cameraDragMove", "event", "state", "cameraControlsState", "x", "y", "bearing", "angle", "init_cameraDragMove", "__esmMin", "init_cameraControlsState", "finishCameraDrag", "state", "event", "finished", "init_finishCameraDrag", "__esmMin", "cameraDragEnd", "event", "finishCameraDrag", "cameraControlsState", "init_cameraDragEnd", "__esmMin", "init_finishCameraDrag", "init_cameraControlsState", "cameraDragClick", "event", "state", "cameraControlsState", "init_cameraDragClick", "__esmMin", "init_cameraControlsState", "cameraDragContextMenu", "event", "state", "cameraControlsState", "init_cameraDragContextMenu", "__esmMin", "init_cameraControlsState", "endAllCameraDrags", "state", "cameraControlsState", "finishCameraDrag", "init_endAllCameraDrags", "__esmMin", "init_cameraControlsState", "init_finishCameraDrag", "dragCamera", "map", "element", "accept", "sensitivity", "orbit", "state", "cameraControlsState", "cameraDragDown", "cameraDragMove", "cameraDragEnd", "cameraDragClick", "cameraDragContextMenu", "endAllCameraDrags", "init_dragCamera", "__esmMin", "init_cameraControlsState", "init_cameraDragDown", "init_cameraDragMove", "init_cameraDragEnd", "init_cameraDragClick", "init_cameraDragContextMenu", "init_endAllCameraDrags", "acceptPitchDrag", "event", "init_acceptPitchDrag", "__esmMin", "pitchDragAddHooks", "dragCamera", "acceptPitchDrag", "init_pitchDragAddHooks", "__esmMin", "init_dragCamera", "init_acceptPitchDrag", "removeCameraDrag", "state", "finishCameraDrag", "element", "cameraDragDown", "cameraDragMove", "cameraDragEnd", "cameraDragClick", "cameraDragContextMenu", "cameraControlsState", "endAllCameraDrags", "init_removeCameraDrag", "__esmMin", "init_finishCameraDrag", "init_cameraDragDown", "init_cameraDragMove", "init_cameraDragEnd", "init_cameraDragClick", "init_cameraDragContextMenu", "init_cameraControlsState", "init_endAllCameraDrags", "pitchDragRemoveHooks", "removeCameraDrag", "init_pitchDragRemoveHooks", "__esmMin", "init_removeCameraDrag", "PitchDrag", "init_PitchDrag", "__esmMin", "init_pitchDragAddHooks", "init_pitchDragRemoveHooks", "pitchDragAddHooks", "pitchDragRemoveHooks", "compassOrientation", "event", "handler", "bearing", "orientation", "init_compassOrientation", "__esmMin", "finishCompassPermission", "handlerResult", "permissionResult", "handler", "generation", "error", "init_finishCompassPermission", "__esmMin", "compassAddHooks", "compassOrientation", "permission", "request", "error", "finishCompassPermission", "init_compassAddHooks", "__esmMin", "init_compassOrientation", "init_finishCompassPermission", "compassRemoveHooks", "init_compassRemoveHooks", "__esmMin", "Compass", "init_Compass", "__esmMin", "init_compassAddHooks", "init_compassRemoveHooks", "compassAddHooks", "compassRemoveHooks", "resizeMap", "entries", "init_resizeMap", "__esmMin", "containerResizeAddHooks", "container", "resizeMap", "init_containerResizeAddHooks", "__esmMin", "init_resizeMap", "containerResizeRemoveHooks", "container", "init_containerResizeRemoveHooks", "__esmMin", "ContainerResize", "init_ContainerResize", "__esmMin", "init_containerResizeAddHooks", "init_containerResizeRemoveHooks", "containerResizeAddHooks", "containerResizeRemoveHooks", "notifyCameraTouchChange", "init_notifyCameraTouchChange", "__esmMin", "TouchMode", "init_TouchMode", "__esmMin", "init_notifyCameraTouchChange", "notifyCameraTouchChange", "rotateButtonClick", "event", "control", "map", "init_rotateButtonClick", "__esmMin", "rotateButtonKeydown", "event", "control", "map", "step", "init_rotateButtonKeydown", "__esmMin", "refreshRotateControl", "map", "pitch", "init_refreshRotateControl", "__esmMin", "acceptRotateDrag", "event", "init_acceptRotateDrag", "__esmMin", "refreshRotateFocus", "refreshRotateControl", "init_refreshRotateFocus", "__esmMin", "init_refreshRotateControl", "rotateOnAdd", "map", "container", "button", "arrow", "rotateButtonClick", "rotateButtonKeydown", "refreshRotateControl", "dragCamera", "acceptRotateDrag", "refreshRotateFocus", "init_rotateOnAdd", "__esmMin", "init_rotateButtonClick", "init_rotateButtonKeydown", "init_refreshRotateControl", "init_dragCamera", "init_acceptRotateDrag", "init_refreshRotateFocus", "rotateOnRemove", "map", "pitchDragRemoveHooks", "init_rotateOnRemove", "__esmMin", "init_pitchDragRemoveHooks", "rotateControl", "options", "init_rotateControl", "__esmMin", "startCameraTouch", "event", "state", "map", "container", "a", "b", "middle", "init_startCameraTouch", "__esmMin", "moveCameraTouch", "event", "state", "map", "container", "touch", "a", "b", "angle", "middle", "delta", "distance", "zoom", "projected", "init_moveCameraTouch", "__esmMin", "endCameraTouch", "state", "event", "map", "container", "touch", "init_endCameraTouch", "__esmMin", "endCameraTouchEvent", "event", "endCameraTouch", "init_endCameraTouchEvent", "__esmMin", "init_endCameraTouch", "changeCameraTouch", "state", "map", "container", "active", "endCameraTouch", "init_changeCameraTouch", "__esmMin", "init_endCameraTouch", "endAllCameraTouches", "state", "cameraControlsState", "endCameraTouch", "init_endAllCameraTouches", "__esmMin", "init_cameraControlsState", "init_endCameraTouch", "cleanupCameraTouch", "state", "container", "map", "endCameraTouch", "startCameraTouch", "moveCameraTouch", "endCameraTouchEvent", "cameraControlsState", "endAllCameraTouches", "changeCameraTouch", "init_cleanupCameraTouch", "__esmMin", "init_endCameraTouch", "init_startCameraTouch", "init_moveCameraTouch", "init_endCameraTouchEvent", "init_cameraControlsState", "init_endAllCameraTouches", "init_changeCameraTouch", "cameraControls_exports", "__export", "cameraControls", "map", "ContainerResize", "ShiftRotate", "PitchDrag", "Compass", "TouchMode", "container", "state", "cameraControlsState", "startCameraTouch", "moveCameraTouch", "endCameraTouchEvent", "endAllCameraTouches", "changeCameraTouch", "cleanupCameraTouch", "init_cameraControls", "__esmMin", "init_ShiftRotate", "init_PitchDrag", "init_Compass", "init_ContainerResize", "init_TouchMode", "init_cameraControlsState", "init_rotateOnAdd", "init_rotateOnRemove", "init_rotateControl", "init_shiftRotateAddHooks", "init_shiftRotateRemoveHooks", "init_pitchDragAddHooks", "init_pitchDragRemoveHooks", "init_compassAddHooks", "init_compassRemoveHooks", "init_containerResizeAddHooks", "init_containerResizeRemoveHooks", "init_startCameraTouch", "init_moveCameraTouch", "init_endCameraTouchEvent", "init_changeCameraTouch", "init_cleanupCameraTouch", "init_endAllCameraTouches", "rotateOnAdd", "rotateOnRemove", "rotateControl", "nativeLayerState", "nativeImageRefresh", "event", "state", "nativeLayerState", "refreshNativeLayer", "nativeImageError", "event", "state", "nativeLayerState", "removeImageState", "image", "state", "states", "nativeLayerState", "addImageState", "image", "state", "states", "nativeLayerState", "synchronizeZoomView", "backend", "now", "map", "animation", "time", "start", "view", "proxy", "progress", "targetScale", "scale", "from", "to", "destroyAfterSubmission", "layer", "texture", "submitted", "error", "destroyTexture", "layer", "texture", "destroyAfterSubmission", "resizeRenderer", "backend", "size", "destroyTexture", "cross", "a", "b", "updateCamera", "camera", "z", "i", "value", "zLength", "x", "cross", "xLength", "y", "view", "f", "n", "r", "projection", "projectionView", "bridgeElevation", "point", "bridges", "bridge", "a", "b", "c", "d", "u", "v", "sample", "tiles", "px", "py", "tileX", "tileY", "tile", "elevation", "terrainElevation", "point", "tiles", "x", "y", "x0", "y0", "fx", "fy", "values", "sample", "valid", "first", "value", "getElevation", "backend", "location", "point", "bridgeElevation", "terrainElevation", "updateMapCamera", "backend", "size", "map", "zoom", "center", "pixelsPerMeter", "offset", "distance", "target", "getElevation", "pitch", "bearing", "camera", "updateCamera", "updateWorldMatrix", "node", "parent", "parentVersion", "matrixMode", "changed", "i", "value", "child", "state", "local", "degrees", "matrix", "world", "computeBounds", "geometry", "min", "max", "data", "instances", "axis", "offset", "low", "high", "center", "radius", "collectMeshes", "mesh", "sunlight", "projection", "frustum", "frustumLengths", "candidates", "shadowMeshes", "computeBounds", "bounds", "world", "center", "x", "y", "z", "clipZ", "clipW", "radius", "child", "collectFrameMeshes", "backend", "sunlight", "sceneChanged", "projection", "renderer", "frustum", "frustumLengths", "i", "axis", "plane", "j", "offset", "candidates", "shadowMeshes", "updateWorldMatrix", "collectMeshes", "ensureRoofBlit", "renderer", "device", "module", "getRasterTileSize", "compareRoofTiles", "a", "b", "composeRoofAtlas", "backend", "tiles", "zoom", "min", "size", "width", "height", "renderer", "device", "map", "opacities", "opacityBuffer", "encoder", "atlasPass", "compareRoofTiles", "i", "tile", "layer", "coords", "image", "source", "tileSize", "offset", "x", "y", "getRasterTileSize", "rebuildRoofAtlas", "backend", "rasters", "signature", "now", "map", "renderer", "tiles", "zoom", "layer", "tile", "coords", "size2", "bounds", "getRasterTileSize", "min", "size", "scale", "width", "height", "origin", "pixels", "matrix", "texture", "destroyTexture", "ensureRoofBlit", "composeRoofAtlas", "updateRoofRaster", "backend", "now", "map", "rasters", "hasRoofTexture", "layer", "signatures", "loading", "signature", "rebuildRoofAtlas", "destroyTexture", "compareMeshes", "a", "b", "sortMeshes", "meshes", "compareMeshes", "roofCoverage", "mesh", "backend", "rasters", "map", "bounds", "world", "intersectsArchive", "layer", "zoom", "origin", "scale", "min", "max", "i", "x", "y", "z", "px", "py", "nw", "se", "remaining", "tile", "size", "left", "top", "pieces", "x0", "y0", "x1", "y1", "l", "t", "r", "b", "prepareFrameMeshes", "backend", "rasters", "now", "meshes", "candidates", "shadowMeshes", "renderer", "appearing", "mesh", "progress", "roofCoverage", "sortMeshes", "minGroundZoom", "maxGroundZoom", "shadowCount", "bindSunlight", "layer", "sun", "visitCells", "packed", "minX", "minZ", "cellSize", "columns", "offsets", "data", "values", "i", "radius", "x", "z", "y", "c", "key", "j", "o", "lightGrid", "packed", "maxBytes", "count", "values", "value", "key", "cellSize", "data", "minX", "minZ", "maxX", "maxZ", "columns", "rows", "counts", "next", "visitCells", "entries", "length", "offset", "worldLights", "lights", "m", "values", "i", "x", "y", "z", "radius", "color", "flux", "w", "cacheLightGrid", "meshes", "previous", "maxBytes", "unchanged", "packed", "snapshots", "i", "mesh", "matrix", "lights", "cache", "sameMatrix", "j", "worldLights", "lightGrid", "collectLightMeshes", "node", "fixed", "moving", "child", "updatePointLights", "backend", "device", "sun", "fixed", "moving", "layer", "collectLightMeshes", "maxBytes", "staticGrid", "cacheLightGrid", "dynamicGrid", "size", "uploadStatic", "destroyTexture", "bindSunlight", "prepareFrameUniforms", "backend", "meshes", "shadowMeshes", "sunlight", "renderer", "camera", "view", "direction", "x", "y", "z", "lightX", "lightY", "lightZ", "lightLength", "skyLength", "destroyTexture", "frameData", "night", "tint", "updatePointLights", "drawGeometry", "backend", "mesh", "pass", "cullMode", "frontFace", "geometry", "program", "device", "depthCompare", "pipelineKey", "pipeline", "uniforms", "renderer", "offset", "data", "base", "textures", "binding", "texture", "i", "attribute", "bindingsChanged", "entries", "boundTextures", "instances", "index", "drawSceneMeshes", "backend", "encoder", "meshes", "renderer", "pass", "mesh", "world", "uniforms", "determinant", "frontFace", "program", "drawGeometry", "shadowCacheMatches", "sun", "meshes", "sunlight", "cache", "unchanged", "i", "mesh", "previous", "range", "attribute", "shadowBounds", "meshes", "min", "max", "mesh", "bounds", "matrix", "cached", "i", "x", "y", "z", "w", "axis", "value", "computeBounds", "shadowMatrix", "meshes", "sunlight", "min", "max", "shadowBounds", "span", "center", "position", "i", "corner", "axis", "point", "coordinates", "value", "radius", "lightCamera", "updateCamera", "view", "low", "high", "ensureShadowPipeline", "device", "sun", "instanced", "key", "shader", "buffers", "drawShadowMeshes", "backend", "encoder", "meshes", "renderer", "device", "sun", "pass", "pipeline", "mesh", "instances", "nextPipeline", "offset", "attribute", "index", "range", "resizeSunlight", "backend", "size", "device", "sun", "destroyTexture", "bindSunlight", "renderSunlight", "backend", "encoder", "meshes", "sunlight", "renderer", "device", "sun", "values", "shadowCacheMatches", "resizeSunlight", "shadowMatrix", "ensureShadowPipeline", "mesh", "drawShadowMeshes", "snapshots", "mesh2", "pendingUpdates", "cancelUpdate", "backend", "frame", "pendingUpdates", "setParent", "node", "parent", "removeRasterTile", "layer", "tile", "mesh", "setParent", "update", "destroyTexture", "releaseRasterTile", "backend", "tile", "key", "removeRasterTile", "setParent", "destroyTexture", "update", "pruneRasterTiles", "backend", "wanted", "now", "pending", "key", "tile", "parts", "overlaps", "coords", "zoom", "releaseRasterTile", "render", "backend", "cancelUpdate", "map", "now", "size", "synchronizeZoomView", "resizeRenderer", "updateMapCamera", "updateWorldMatrix", "sceneChanged", "layer", "sunlight", "collectFrameMeshes", "shadowMeshes", "renderer", "rasters", "updateRoofRaster", "meshes", "appearing", "prepareFrameMeshes", "encoder", "prepareFrameUniforms", "renderSunlight", "drawSceneMeshes", "pruneRasterTiles", "update", "renderPendingUpdates", "updates", "pendingUpdates", "failure", "backend", "render", "error", "update", "backend", "shared", "first", "pendingUpdates", "renderPendingUpdates", "refreshNativeLayer", "state", "activeImages", "image", "nativeImageRefresh", "nativeImageError", "removeImageState", "addImageState", "update", "nativeLayerMethod", "name", "source", "args", "state", "result", "layer", "zIndex", "extreme", "edge", "refreshNativeLayer", "nativeSetLatLng", "args", "nativeLayerMethod", "nativeSetLatLngs", "args", "nativeLayerMethod", "nativeAddLatLng", "args", "nativeLayerMethod", "nativeSetRadius", "args", "nativeLayerMethod", "nativeSetStyle", "args", "nativeLayerMethod", "nativeRedraw", "args", "nativeLayerMethod", "nativeSetIcon", "args", "nativeLayerMethod", "nativeSetUrl", "args", "nativeLayerMethod", "nativeSetBounds", "args", "nativeLayerMethod", "nativeSetOpacity", "args", "nativeLayerMethod", "nativeSetZIndex", "args", "nativeLayerMethod", "nativeSetZIndexOffset", "args", "nativeLayerMethod", "nativeBringToFront", "args", "nativeLayerMethod", "nativeBringToBack", "args", "nativeLayerMethod", "nativeMethodHandlers", "nativeSetLatLng", "nativeSetLatLngs", "nativeAddLatLng", "nativeSetRadius", "nativeSetStyle", "nativeRedraw", "nativeSetIcon", "nativeSetUrl", "nativeSetBounds", "nativeSetOpacity", "nativeSetZIndex", "nativeSetZIndexOffset", "nativeBringToFront", "nativeBringToBack", "renderers", "cityMapper", "renderers", "emptyNode", "textureBinding", "bindings", "name", "enabled", "current", "materialShaders", "material", "sparkle", "elevationWGSL", "hasBase", "hasMetal", "hasEmissive", "hasOcclusion", "hasRoof", "hasTerrain", "textured", "vertex", "bindings", "baseBinding", "textureBinding", "metalBinding", "emissiveBinding", "occlusionBinding", "roofBinding", "fragment", "elevationWGSL", "reportCompilation", "backend", "pending", "info", "message", "infos", "errors", "error", "createProgram", "backend", "material", "shaders", "materialShaders", "elevationWGSL", "vertex", "fragment", "reportCompilation", "vertexBuffers", "bindGroupEntries", "texture", "bindGroupLayout", "pipelineLayout", "createMesh", "backend", "data", "material", "usage", "program", "device", "attributes", "name", "values", "array", "size", "buffer", "mesh", "emptyNode", "createProgram", "cityMapper", "setParent", "update", "disposeMesh", "backend", "mesh", "setParent", "update", "attribute", "isClockWise", "points", "area", "i", "a", "b", "cross", "a", "b", "c", "equal", "a", "b", "clean", "ring", "changed", "i", "a", "b", "c", "equal", "cross", "inside", "point", "ring", "result", "i", "j", "a", "b", "insideHole", "point", "rings", "i", "inside", "on", "p", "q", "intersects", "a", "b", "c", "d", "equal", "abC", "cross", "abD", "cdA", "cdB", "on", "crossesRing", "a", "b", "ring", "i", "intersects", "crossesBoundary", "a", "b", "polygon", "rings", "crossesRing", "containsVertex", "polygon", "a", "b", "c", "p", "equal", "cross", "area", "ring", "sum", "i", "p", "q", "minimumX", "ring", "values", "point", "sortHoles", "holes", "buffer", "entries", "ring", "width", "start", "middle", "end", "left", "right", "output", "previous", "i", "minimumX", "source", "target", "triangulate", "contour", "holes", "points", "p", "index", "path", "ring", "hole", "bridge", "distance", "h", "a", "b", "mid", "h2", "p2", "clipped", "i", "c", "triangle2", "vertices", "offset", "rings", "paths", "clean", "isClockWise", "polygon", "holesToConnect", "sortHoles", "inside", "insideHole", "crossesBoundary", "result", "cross", "containsVertex", "triangle", "holeArea", "actual", "area", "expected", "triangle", "point", "target", "a", "b", "c", "diskAt", "center", "radius", "radiusY", "count", "index", "disk", "point", "center", "radius", "target", "radiusY", "count", "i", "triangle", "diskAt", "circleAt", "center", "radius", "radiusY", "count", "index", "offset", "angle", "segment", "context", "a", "b", "startCap", "endCap", "options", "width", "stroke", "point", "radius", "length", "direction", "normal", "triangle", "disk", "line", "context", "points", "closed", "options", "width", "dash", "stroke", "point", "radius", "distance", "period", "value", "i", "a", "b", "length", "previous", "previousLength", "incoming", "outgoing", "side", "n1", "n2", "from", "to", "denominator", "miter", "offset", "phase", "index", "end", "delta", "segment", "disk", "triangle", "polygon", "context", "rings", "closed", "options", "fill", "point", "map", "projected", "ring", "path", "latlng", "indices", "valid", "vertices", "triangulate", "triangle", "line", "visit", "context", "coordinates", "closed", "child", "polygon", "nativeGeometry", "source", "map", "point", "fill", "stroke", "options", "width", "values", "dash", "value", "index", "i", "allZero", "context", "center", "radius", "radiusY", "projected", "disk", "count", "points", "circleAt", "line", "closed", "visit", "sub", "a", "b", "result", "i", "dot", "a", "b", "sum", "i", "sortHits", "hits", "buffer", "source", "target", "width", "start", "middle", "end", "left", "right", "output", "previous", "i", "intersectMeshes", "ray", "meshes", "night", "hits", "a", "b", "c", "mesh", "inverse", "inverseValues", "value", "localOrigin", "origin", "localDirection", "direction", "directionLength", "near", "far", "i", "a2", "b2", "position", "index", "instanceOffset", "vertices", "closest", "faceIndex", "vertex", "offset", "x", "y", "z", "ai", "bi", "ci", "e", "f", "p", "det", "t", "u", "q", "v", "uv", "ids", "x2", "y2", "distance", "point", "worldPoint", "computeBounds", "sub", "cross", "dot", "sortHits", "traverse", "node", "callback", "context", "child", "collectVisibleMesh", "mesh", "meshes", "raycast", "backend", "event", "objects", "recursive", "rect", "updateWorldMatrix", "updateCamera", "inverseCamera", "inverseCameraValues", "value", "object", "unprojected", "end", "rayLength", "meshes", "traverse", "collectVisibleMesh", "intersectMeshes", "nativeEventMaps", "restoreNativeEvents", "map", "descriptor", "handle", "compareNativeHits", "a", "b", "handleNativeMapEvent", "event", "type", "targets", "map", "context", "nativeEventMaps", "fireDOMEvent", "cityMapper", "target", "dom", "hits", "candidate", "source2", "backend", "raycast", "compareNativeHits", "source", "nativeEvents", "state", "map", "context", "nativeEventMaps", "pointer", "handleNativeMapEvent", "restoreNativeEvents", "removeNativeEvents", "state", "context", "map", "nativeEventMaps", "toSRGB", "value", "channel", "n", "h", "l", "a", "k", "parseColor", "value", "a", "toSRGB", "channel", "context", "g", "b", "current", "state", "refreshNativeEvent", "refreshNativeLayer", "reorderNativeLayer", "front", "refreshNativeLayer", "updateNativeLayerView", "update", "disposeNativeLayer", "state", "source", "map", "backend", "meshes", "textures", "images", "refreshNativeEvent", "updateNativeLayerView", "removeNativeEvents", "name", "methods", "mesh", "texture", "image", "disposeMesh", "destroyTexture", "nativeImageRefresh", "nativeImageError", "removeImageState", "resolveNativeReady", "rejectNativeReady", "error", "forwardNativeError", "error", "styleNativeMesh", "state", "mesh", "color", "opacity", "source", "marker", "paneOrder", "order", "zIndex", "uploadCanvasTexture", "state", "key", "texture", "image", "device", "width", "height", "bitmap", "current", "refreshNativeLayer", "error", "textureFor", "state", "key", "image", "backend", "textures", "meshes", "texture", "url", "mesh", "disposeMesh", "destroyTexture", "width", "height", "device", "uploadCanvasTexture", "error", "putNativeMesh", "state", "key", "position", "color", "opacity", "texture", "uv", "backend", "source", "meshes", "mesh", "normal", "index", "data", "disposeMesh", "createMesh", "attribute", "styleNativeMesh", "quadNativeMesh", "state", "key", "image", "corners", "opacity", "texture", "textureFor", "indices", "position", "uv", "textureCoords", "index", "putNativeMesh", "localPosition", "state", "latlng", "map", "backend", "crs", "origin", "point", "metres", "boundsQuad", "state", "bounds", "corners", "positions", "corner", "localPosition", "syncGridLayer", "state", "source", "textures", "meshes", "key", "tile", "opacity", "retained", "mesh", "nw", "se", "styleNativeMesh", "quadNativeMesh", "boundsQuad", "syncImageOverlay", "state", "source", "quadNativeMesh", "boundsQuad", "markerQuadCorners", "state", "key", "image", "source", "map", "backend", "clip", "localPosition", "inverse", "toLocal", "options", "size", "dimensions", "width", "height", "anchor", "center", "left", "top", "screenCorners", "corners", "pointX", "pointY", "offset", "x", "y", "p", "result", "syncMarker", "state", "source", "key", "image", "mesh", "quadNativeMesh", "markerQuadCorners", "localPixel", "state", "point", "localPosition", "localPixelForGeometry", "point", "localPixel", "nativeLayerState", "syncVectorLayer", "state", "source", "nativeLayerState", "geometry", "nativeGeometry", "localPixelForGeometry", "fill", "stroke", "key", "positions", "color", "opacity", "r", "g", "b", "parseColor", "putNativeMesh", "synchronizeNativeLayer", "state", "source", "meshes", "textures", "current", "mesh", "texture", "key", "syncGridLayer", "syncImageOverlay", "syncMarker", "syncVectorLayer", "disposeMesh", "destroyTexture", "beforeNativeRender", "state", "synchronizeNativeLayer", "error", "nativeLayerState", "nativeLayer", "state", "source", "map", "backend", "refreshNativeLayer", "reorderNativeLayer", "disposeNativeLayer", "refreshNativeEvent", "updateNativeLayerView", "nativeEvents", "name", "own", "original", "nativeMethodHandlers", "ready", "resolveNativeReady", "rejectNativeReady", "forwardNativeError", "error", "current", "beforeNativeRender", "synchronizeNativeLayer", "update", "hideTargets", "state", "source", "htmlIcon", "targets", "element", "removeTargets", "state", "element", "readyNativeGPU", "state", "nativeLayer", "reportError", "source", "error", "initNativeGPU", "source", "map", "style", "state", "hideTargets", "removeTargets", "readyNativeGPU", "reportError", "mapCameraState", "mapGetBearing", "mapGetPitch", "cancelCameraAnimation", "map", "mapCameraState", "mapStopPitchBearingAnimation", "cancelCameraAnimation", "updateSky", "height", "pitch", "mapCameraState", "far", "distance", "top", "mapSetPitchAndBearing", "pitch", "bearing", "previousPitch", "previousBearing", "updateSky", "runCameraAnimations", "now", "mapCameraState", "pending", "failure", "map", "animation", "progress", "eased", "scheduleCameraAnimation", "error", "scheduleCameraAnimation", "map", "animation", "mapCameraState", "runCameraAnimations", "mapAnimateCamera", "pitch", "bearing", "options", "cancelCameraAnimation", "duration", "start", "fromPitch", "fromBearing", "delta", "animation", "scheduleCameraAnimation", "mapSetBearing", "bearing", "options", "mapSetPitch", "pitch", "options", "mapResetNorth", "options", "mapResetNorthPitch", "options", "pointOf", "point", "angles", "map", "bearing", "mapCameraState", "pitch", "project", "map", "point", "inverse", "limit", "half", "distance", "pointOf", "cos", "sin", "tilt", "rise", "angles", "p", "far", "denominator", "v", "u", "scale", "animationPoint", "map", "point", "inverse", "view", "half", "scale", "shift", "mapLayerPointToContainerPoint", "point", "project", "animationPoint", "mapCameraState", "mapContainerPointToLayerPoint", "point", "mapCameraState", "animationPoint", "project", "mapGetCenterLayerPoint", "mapCameraState", "mapUpdateCameraOverlays", "layer", "mapPanBy", "offset", "options", "half", "ground", "project", "pointOf", "mapCameraState", "mapSetZoomAround", "latlng", "zoom", "options", "mapCameraState", "scale", "half", "screen", "center", "anchor", "next", "mapPanInside", "latlng", "options", "mapCameraState", "min", "pointOf", "max", "screen", "safe", "delta", "groundBounds", "map", "padding", "min", "pointOf", "max", "corners", "points", "point", "project", "mapLimitCenter", "center", "zoom", "bounds", "mapCameraState", "half", "footprint", "groundBounds", "point", "view", "offset", "mapLimitOffset", "offset", "bounds", "mapCameraState", "half", "ground", "project", "center", "limited", "verticalGroundY", "y", "tilt", "distance", "rise", "far", "fitCameraBounds", "map", "bounds", "options", "zoom", "half", "distance", "min", "pointOf", "max", "cos", "sin", "tilt", "rise", "angles", "far", "top", "verticalGroundY", "bottom", "origin", "points", "latlng", "p", "point", "low", "high", "leftSlope", "rightSlope", "slope", "left", "right", "scale", "target", "snap", "actual", "vMin", "vMax", "v", "centerY", "centerX", "center", "mapGetBoundsCenterZoom", "bounds", "options", "fitCameraBounds", "mapCameraState", "mapGetBoundsZoom", "bounds", "inside", "padding", "mapCameraState", "fitCameraBounds", "pointOf", "footprint", "groundBounds", "size", "zoom", "snap", "mapTryAnimatedPan", "center", "options", "offset", "mapCameraState", "mapGetBounds", "mapCameraState", "footprint", "groundBounds", "bounds", "point", "raw", "animationPoint", "constrainCameraToBounds", "adjustCameraDrag", "map", "draggable", "half", "delta", "ground", "project", "cleanupCameraMap", "cancelCameraAnimation", "adjustCameraDrag", "cameraMapReady", "draggable", "adjustCameraDrag", "loadCameraControls", "map", "cameraControls", "error", "noOperation", "initializeCameraMap", "style", "updateSky", "constrainCameraToBounds", "cleanupCameraMap", "cameraMapReady", "loadCameraControls", "noOperation", "markerSetIcon", "icon", "result", "mapCameraState", "initNativeGPU", "markerSetRotation", "rotation", "markerCameraIconPoint", "x", "y", "rotation", "mapCameraState", "scale", "markerGetEvents", "mapCameraState", "displayPoint", "map", "point", "markerSetPos", "point", "mapCameraState", "displayPoint", "element", "key", "direction", "options", "anchor", "markerUpdateZIndex", "offset", "mapCameraState", "changed", "cameraMarkerOnDrag", "event", "map", "screen", "point", "runMarkerPanFrame", "mapCameraState", "pending", "drag", "event", "scheduleMarkerPan", "drag", "event", "mapCameraState", "runMarkerPanFrame", "adjustCameraMarkerPan", "event", "marker", "map", "screen", "size", "padding", "pointOf", "speed", "movement", "pane", "shift", "scheduleMarkerPan", "cameraMarkerDrag", "drag", "original", "adjustPan", "cameraMarkerOnDrag", "adjustCameraMarkerPan", "markerInitInteraction", "result", "mapCameraState", "cameraMarkerDrag", "popupGetEvents", "mapCameraState", "tooltipGetEvents", "mapCameraState", "popupAdjustPan", "map", "mapCameraState", "rect", "container", "min", "pointOf", "max", "left", "top", "right", "bottom", "dx", "dy", "screen", "delta", "popupUpdatePosition", "mapCameraState", "point", "delta", "displayPoint", "tooltipSetPosition", "point", "mapCameraState", "delta", "displayPoint", "gridlayerGetEvents", "events", "mapCameraState", "gridlayerGetTiledPixelBounds", "center", "mapCameraState", "bounds", "mapCameraState", "mapGetBearing", "mapGetPitch", "mapStopPitchBearingAnimation", "mapSetPitchAndBearing", "mapAnimateCamera", "mapSetBearing", "mapSetPitch", "mapResetNorth", "mapResetNorthPitch", "mapLayerPointToContainerPoint", "mapContainerPointToLayerPoint", "mapGetCenterLayerPoint", "mapUpdateCameraOverlays", "mapPanBy", "mapSetZoomAround", "mapPanInside", "mapLimitCenter", "mapLimitOffset", "mapGetBoundsCenterZoom", "mapGetBoundsZoom", "mapTryAnimatedPan", "mapGetBounds", "initializeCameraMap", "markerSetIcon", "markerSetRotation", "markerCameraIconPoint", "markerGetEvents", "markerSetPos", "markerUpdateZIndex", "markerInitInteraction", "popupGetEvents", "tooltipGetEvents", "popupAdjustPan", "popupUpdatePosition", "tooltipSetPosition", "gridlayerGetEvents", "gridlayerGetTiledPixelBounds", "endZoom", "backend", "animation", "update", "onMapChangeState", "renderPendingMapChange", "layer", "onMapChangeState", "update", "render", "onMapChangeState", "onMapChange", "layer", "renderPendingMapChange", "onZoomAnimState", "renderPendingZoomAnimation", "layer", "onZoomAnimState", "render", "onZoomAnimState", "onZoomAnim", "event", "map", "renderPendingZoomAnimation", "startZoom", "ring", "point", "radius", "points", "i", "lampPostGeometry", "point", "style", "addTriangle", "color", "parseColor", "radius", "center", "r", "low", "high", "points", "i", "a", "b", "angle", "nx", "nz", "ring", "quad", "addTriangle", "color", "a", "b", "c", "d", "height", "normal", "emitter", "point", "u", "v", "axis", "lightGeometry", "point", "style", "addTriangle", "color", "parseColor", "axis", "quad", "emitter", "roundProfile", "ringDirections", "ring", "point", "radius", "result", "direction", "ringDirections", "surface", "point", "addTriangle", "lowRadius", "low", "highRadius", "high", "color", "lower", "ring", "upper", "i", "next", "slope", "length", "nx", "nz", "ny", "normalX", "normalZ", "ringDirections", "treeGeometry", "point", "style", "addTriangle", "top", "bottom", "trunkRadius", "crownRadius", "crownBottom", "crownShape", "trunk", "parseColor", "crown", "surface", "i", "low", "lr", "high", "hr", "base", "ring", "roundProfile", "updateStatus", "backend", "enabled", "progress", "area", "varint", "reader", "bytes", "value", "factor", "byte", "decodeDirectory", "data", "bytes", "reader", "count", "varint", "entries", "tileId", "i", "entry", "value", "decompress", "data", "compression", "read", "backend", "offset", "length", "signal", "response", "etag", "data", "loadDirectory", "backend", "offset", "length", "compression", "decodeDirectory", "decompress", "read", "tileId", "z", "x", "y", "id", "n", "s", "rx", "ry", "decodeHeader", "data", "view", "header", "offsets", "flags", "bounds", "i", "getHeader", "backend", "read", "decodeHeader", "getZxy", "backend", "z", "x", "y", "signal", "id", "tileId", "header", "getHeader", "offset", "length", "visited", "depth", "key", "pending", "entries", "low", "high", "mid", "entry", "data", "loadDirectory", "error", "decompress", "read", "loadSource", "backend", "area", "data", "url", "response", "result", "getZxy", "pumpState", "compareDistance", "a", "b", "projectedTree", "context", "lon", "lat", "backend", "crs", "origin", "metres", "map", "point", "elevation", "getElevation", "groundOffset", "point", "addTriangle", "context", "a", "ah", "b", "bh", "c", "ch", "nx", "ny", "nz", "color", "backend", "positions", "normals", "colors", "uvs", "ux", "uy", "uz", "vx", "vy", "vz", "point", "height", "groundOffset", "addGeneratedTriangle", "args", "addTriangle", "pumpState", "generateTreeGeometry", "context", "generator", "point", "style", "pumpState", "addGeneratedTriangle", "buildAreaPoint", "context", "feature", "lon", "lat", "style", "baseColor", "backend", "top", "projected", "projectedTree", "support", "generateTreeGeometry", "lampPostGeometry", "lightGeometry", "treeGeometry", "projectRing", "context", "ring", "backend", "crs", "origin", "metres", "map", "path", "lng", "lat", "point", "elevation", "getElevation", "buildAreaPolygon", "context", "rings", "top", "bottom", "baseColor", "paths", "ring", "path", "point", "a", "b", "c", "index", "sign", "i", "length", "nx", "nz", "projectRing", "points", "triangulate", "addTriangle", "isClockWise", "buildAreaFeature", "context", "feature", "backend", "area", "map", "coords", "geometry", "isTree", "polygons", "lon", "lat", "anchor", "style", "top", "bottom", "color", "baseColor", "parseColor", "vertexStart", "buildAreaPoint", "rings", "buildAreaPolygon", "vertexEnd", "instanceAreaGeometry", "context", "positions", "normals", "colors", "featureFaces", "vertices", "length", "origin", "template", "i", "instance", "axis", "face", "start", "offsets", "attachAreaMesh", "context", "backend", "area", "device", "data", "instanceAreaGeometry", "attributes", "name", "attribute", "meshGeometry", "emptyNode", "createProgram", "cityMapper", "setParent", "update", "sourceAreaContext", "backend", "area", "map", "crs", "origin", "buildArea", "backend", "area", "map", "feature", "data", "loadSource", "context", "sourceAreaContext", "deadline", "buildAreaFeature", "attachAreaMesh", "error", "pump", "pumpState", "pump", "backend", "map", "shared", "cityMapper", "layers", "layer", "area", "center", "areaBackend", "pending", "compareDistance", "inflight", "buildArea", "updateStatus", "setHighlight", "backend", "feature", "update", "showFeature", "backend", "feature", "event", "tooltip", "rect", "x", "y", "shared", "layer", "visible", "releaseArea", "backend", "area", "attribute", "setHighlight", "showFeature", "setParent", "update", "geometry", "compareAreaDistance", "a", "b", "updateArea", "backend", "pump", "z", "center", "bounds", "nw", "se", "archiveNW", "archiveSE", "wanted", "x", "y", "key", "area", "coords", "releaseArea", "areas", "compareAreaDistance", "setTerrainHeight", "layer", "terrain", "elevation", "getElevation", "offset", "attachState", "showWebGPUWarning", "map", "container", "warning", "link", "failAttachment", "error", "backend", "map", "showWebGPUWarning", "cityMapper", "requestAdapter", "backend", "map", "adapter", "error", "failAttachment", "requestDevice", "adapter", "backend", "map", "error", "failAttachment", "rendererDeviceError", "event", "map", "attachState", "owner", "cityMapper", "layer", "rendererDeviceLost", "info", "device", "map", "attachState", "owner", "cityMapper", "error", "layer", "restoreObject", "backend", "shared", "object", "name", "attribute", "data", "size", "count", "normalized", "key", "texture", "geometry", "material", "attributes", "device", "createProgram", "attachState", "attach", "backend", "map", "shared", "cityMapper", "noOperation", "canvas", "failAttachment", "adapter", "requestAdapter", "device", "requestDevice", "rendererDeviceError", "rendererDeviceLost", "context", "format", "emptyNode", "layout", "buffer", "sampler", "lights", "values", "resizeSunlight", "emptyImage", "pane", "onMapChange", "startZoom", "onZoomAnim", "endZoom", "render", "origin", "point", "metres", "setTerrainHeight", "setParent", "pendingObjects", "object", "i", "restoreObject", "update", "updateArea", "findFeature", "backend", "event", "hit", "object", "ranges", "low", "high", "middle", "range", "raycast", "onClick", "layer", "event", "feature", "findFeature", "setHighlight", "showFeature", "onPointerLeave", "layer", "setHighlight", "showFeature", "onPointerMove", "layer", "event", "findFeature", "setHighlight", "showFeature", "pointerMove", "event", "onPointerMove", "pointerClick", "event", "onClick", "pointerLeave", "onPointerLeave", "attachLayer", "backend", "map", "attach", "error", "onAdd3DLayer", "backend", "map", "center", "pointerMove", "pointerClick", "pointerLeave", "attachLayer", "releaseRenderer", "renderer", "backend", "error", "onRemove3DLayer", "backend", "map", "onPointerLeave", "area", "key", "layer", "animation", "releaseArea", "updateStatus", "shared", "setParent", "onMapChange", "startZoom", "onZoomAnim", "endZoom", "cancelUpdate", "next", "cityMapper", "update", "destroyTexture", "renderer", "releaseRenderer", "onTerrainChange", "layer", "area", "releaseArea", "updateArea", "hasUnsupportedPrimitives", "meshes", "mesh", "primitive", "decodeModel", "data", "view", "decoder", "description", "offset", "length", "type", "chunk", "binary", "hasUnsupportedPrimitives", "vertexNormals", "p", "indices", "normals", "i", "a", "b", "c", "u", "v", "j", "n", "index", "length", "collectMeshes", "node", "meshes", "child", "conformModelToTerrain", "layer", "terrain", "meshes", "collectMeshes", "mesh", "positions", "geometry", "position", "normals", "attribute", "normal", "world", "inverse", "i", "x", "y", "z", "worldY", "weight", "worldX", "worldZ", "point", "elevation", "offset", "computeBounds", "updateWorldMatrix", "map", "crs", "origin", "metres", "pixelScale", "getElevation", "vertexNormals", "update", "loadBuffer", "buffer", "directory", "response", "loadImage", "description", "directory", "image", "blob", "view", "buffer", "response", "textureSampler", "sampler", "textureFor", "context", "reference", "color", "backend", "description", "images", "textures", "device", "key", "texture", "sampler", "image", "format", "samplerOptions", "textureSampler", "materialFor", "context", "material", "backend", "pbr", "textureFor", "nodeMatrix", "spec", "x", "y", "z", "w", "sx", "sy", "sz", "types", "sizes", "readAccessorValues", "description", "Type", "size", "data", "accessorCount", "indices", "viewIndex", "offset", "count", "stride", "view", "bytes", "buffer", "i", "values", "output", "readAccessor", "description", "index", "spec", "Type", "types", "size", "sizes", "data", "readAccessorValues", "sparse", "Index", "view", "offset", "indices", "normalized", "i", "modelNode", "context", "index", "backend", "description", "materials", "active", "resources", "spec", "group", "emptyNode", "nodeMatrix", "primitive", "attributes", "semantic", "name", "vertexCount", "attribute", "index2", "i", "normals", "style", "program", "device", "geometry", "mesh", "child", "readAccessor", "vertexNormals", "createProgram", "cityMapper", "setParent", "loadModel", "backend", "url", "response", "data", "description", "decodeModel", "directory", "bufferRequests", "buffer", "image", "material", "index", "resource", "attribute", "node", "loadBuffer", "imageRequests", "loadImage", "images", "context", "materialFor", "scene", "nodes", "modelNode", "error", "model", "emptyNode", "setParent", "x", "y", "z", "conformModelToTerrain", "get3DEvents", "layer", "events", "updateArea", "onTerrainChange", "ready3D", "layer", "emptyNode", "getHeader", "attach", "loadModel", "update", "error", "init3D", "layer", "options", "onAdd3DLayer", "onRemove3DLayer", "get3DEvents", "isModel", "ready3D", "isLoading", "layer", "comparePendingTiles", "a", "b", "terrainAtlas", "tiles", "bounds", "columns", "rows", "elevations", "low", "high", "key", "values", "coordinates", "x", "y", "start", "row", "column", "value", "terrainGrid", "divisions", "positions", "normals", "uvs", "indices", "row", "column", "a", "b", "c", "d", "addRasterTile", "backend", "layer", "coords", "tile", "divisions", "map", "crs", "origin", "metres", "scale", "terrainScale", "corner", "opposite", "device", "texture", "bounds", "columns", "rows", "elevations", "low", "high", "terrainAtlas", "destroyTexture", "createProgram", "attributes", "name", "attribute", "terrainGrid", "base", "bottom", "top", "sizeX", "sizeZ", "geometry", "mesh", "cityMapper", "setParent", "update", "registerTerrainTile", "backend", "coords", "tile", "addRasterTile", "error", "createGeometry", "device", "attributes", "name", "attribute", "createRasterMesh", "backend", "tile", "device", "texture", "createProgram", "createGeometry", "coords", "crs", "origin", "metres", "scale", "corner", "opposite", "sizeX", "sizeZ", "cityMapper", "setParent", "finishRasterTile", "backend", "tile", "result", "createRasterMesh", "registerTerrainTile", "update", "error", "pumpRasterTiles", "pruneRasterTiles", "loadRasterTile", "backend", "tile", "first", "finishRasterTile", "pumpRasterTiles", "backend", "map", "center", "pending", "tile", "coords", "comparePendingTiles", "loadRasterTile", "updateRasterTiles", "backend", "map", "zoom", "bounds", "northWest", "southEast", "archiveNorthWest", "archiveSouthEast", "center", "wanted", "x", "y", "key", "coords", "parent", "tile", "coverage", "parentZoom", "factor", "required", "releaseRasterTile", "pumpRasterTiles", "pruneRasterTiles", "getRasterEvents", "layer", "update", "updateRasterTiles", "readyRaster", "layer", "archive", "header", "reportError", "layer", "error", "setRasterTerrain", "backend", "terrain", "tile", "removeRasterTile", "setParent", "registerTerrainTile", "finishAttachment", "backend", "map", "attached", "setRasterTerrain", "error", "updateAttachedTiles", "backend", "map", "attached", "updateRasterTiles", "error", "onPMTileAdd", "backend", "map", "attached", "attach", "finishAttachment", "updateAttachedTiles", "releaseRasterTiles", "backend", "tile", "attribute", "releaseRasterTile", "destroyTexture", "onPMTileRemove", "backend", "map", "releaseRasterTiles", "onRemove3DLayer", "setRasterOpacity", "backend", "opacity", "tile", "terrainMesh", "update", "setPMTileOpacity", "backend", "opacity", "setRasterOpacity", "setRasterZIndex", "backend", "zIndex", "tile", "terrainMesh", "update", "setPMTileZIndex", "backend", "zIndex", "setRasterZIndex", "initRaster", "layer", "options", "read", "getHeader", "getZxy", "getRasterTileSize", "isLoading", "setPMTileOpacity", "setPMTileZIndex", "onPMTileAdd", "onPMTileRemove", "getRasterEvents", "emptyNode", "readyRaster", "reportError", "setGeoJSONData", "layer", "data", "area", "releaseArea", "updateArea", "clearLayerTerrain", "layer", "setRasterTerrain", "onTerrainRemove", "layer", "map", "clearLayerTerrain", "tile", "l", "grid", "attribute", "removeRasterTile", "conformModelToTerrain", "setTerrainHeight", "destroyTexture", "disposeMesh", "onRemove3DLayer", "local", "lng", "lat", "z", "crs", "origin", "metres", "base", "p", "push", "position", "normal", "color", "p", "n", "below", "p", "addBridges", "backend", "geojson", "map", "crs", "zoom", "origin", "metres", "base", "position", "normal", "color", "geometry", "polygons", "polygon", "rings", "ring", "path", "pixels", "points", "lng", "lat", "z", "p", "coordinate", "triangles", "paths", "start", "i", "contour", "holes", "bridgeTriangles", "xs", "ys", "t", "triangle", "bridge", "x", "y", "key", "a", "b", "c", "pa", "pb", "pc", "start2", "q", "length", "n", "corner", "local", "triangulate", "push", "below", "createMesh", "loadTerrainTiles", "state", "backend", "archive", "controller", "tiles", "coords", "result", "readBridges", "response", "loadTerrain", "backend", "controller", "x", "y", "layer", "archive", "header", "map", "northwest", "southeast", "tiles", "center", "compareDistance", "state", "workers", "loadTerrainTiles", "bridges", "readBridges", "getElevation", "setTerrainHeight", "conformModelToTerrain", "addBridges", "update", "error", "loadReadyTerrain", "loadTerrain", "setLayerTerrain", "layer", "setRasterTerrain", "onTerrainAdd", "backend", "map", "onAdd3DLayer", "loadTerrain", "pending", "loadReadyTerrain", "setLayerTerrain", "initTerrain", "layer", "options", "terrainSource", "layerOptions", "init3D", "onTerrainAdd", "onTerrainRemove", "mix", "a", "b", "t", "values", "rgb", "values", "rounded", "value", "atmosphere", "altitude", "stops", "upper", "i", "b", "a", "t", "rgb", "mix", "horizontalPosition", "d", "lat", "lng", "ascension", "declination", "rad", "hourAngle", "latitude", "altitude", "azimuth", "solarPosition", "date", "lat", "lng", "time", "rad", "d", "mean", "longitude", "obliquity", "declination", "ascension", "horizontalPosition", "moonPosition", "date", "lat", "lng", "solarPosition", "rad", "d", "anomaly", "longitude", "latitude", "obliquity", "x", "y", "z", "horizontalPosition", "projectCelestialBody", "dir", "size", "pitch", "bearing", "x", "y", "z", "forward", "updateSky", "map", "originalSky", "sunDisc", "moonDisc", "sun", "sky", "size", "pitch", "bearing", "disc", "body", "point", "left", "top", "projectCelestialBody", "render", "map", "renderer", "cityMapper", "update", "updateSun", "state", "control", "map", "date", "slider", "output", "status", "time", "center", "sun", "solarPosition", "atmosphere", "moonPosition", "updateSky", "render", "error", "useLiveTime", "state", "updateSun", "useSelectedTime", "state", "control", "map", "date", "slider", "status", "updateSky", "render", "updateSun", "tickSun", "state", "updateSun", "removeSun", "state", "map", "timer", "sunDisc", "moonDisc", "updateSky", "render", "onAddSun", "control", "map", "originalSky", "disc", "sunDisc", "moonDisc", "container", "date", "slider", "output", "now", "timeRow", "status", "note", "state", "updateSun", "updateSky", "useLiveTime", "useSelectedTime", "tickSun", "removeSun", "underEntryState", "placeEntry", "map", "layer", "element", "input", "entry", "placeUnderEntry", "state", "nested", "placeEntry", "onPlace", "runPlacements", "state", "underEntryState", "placeUnderEntry", "replaceEntry", "underEntryState", "runPlacements", "removeEntry", "replaceEntry", "underEntryState", "underEntry", "layer", "element", "onPlace", "state", "replaceEntry", "removeEntry", "placeUnderEntry", "addTimeLayer", "map", "removeTimeLayer", "initialize", "options", "addTimeLayer", "removeTimeLayer", "onAdd", "map", "onAddSun", "styleTimeControl", "container", "nested", "addTo", "map", "container", "underEntry", "styleTimeControl", "remove", "initialize", "onAdd", "addTo", "remove", "triangle", "position", "normal", "color", "a", "b", "c", "tint", "u", "v", "i", "point", "value", "n", "length", "build", "parts", "position", "normal", "color", "ring", "bottom", "top", "tint", "topRing", "low", "high", "x", "z", "i", "j", "triangle", "tooltip", "p", "content", "lines", "line", "box", "x0", "x1", "z0", "z1", "glass", "tyre", "mirror", "x0", "x1", "z0", "z1", "rest", "box", "paints", "headlight", "taillight", "carModel", "i", "paint", "paints", "mirror", "tyre", "box", "glass", "headlight", "taillight", "hull", "white", "boatBenches", "benches", "i", "mirror", "boatModel", "hull", "white", "box", "glass", "mirror", "boatBenches", "routeColor", "properties", "color", "value", "carriage", "center", "length", "color", "front", "rear", "box", "glass", "white", "tyre", "headlight", "taillight", "busModel", "index", "properties", "carriage", "routeColor", "tramModel", "index", "properties", "color", "routeColor", "parts", "car", "carriage", "metroModel", "index", "properties", "color", "routeColor", "parts", "car", "carriage", "skin", "trousers", "dark", "bicycleModel", "index", "paint", "paints", "box", "dark", "skin", "trousers", "shirt", "parts", "box", "trousers", "shirt", "skin", "dark", "pedestrianModel", "index", "model", "parts", "paints", "box", "trousers", "skin", "vehicles", "bicycleModel", "pedestrianModel", "busModel", "tramModel", "metroModel", "carModel", "boatModel", "trafficShader", "along", "points", "lengths", "s", "i", "end", "middle", "b", "d", "t", "locateTraffic", "state", "trip", "points", "lengths", "length", "distance", "x", "y", "z", "dx", "dz", "along", "placeTraffic", "state", "position", "normal", "i", "trip", "cx", "y", "cz", "dx", "dz", "k", "o", "lx", "lz", "nx", "nz", "locateTraffic", "startTraffic", "state", "underEntry", "addTraffic", "state", "placeTraffic", "startTraffic", "disposeTrafficObject", "state", "object", "setHighlight", "showFeature", "disposeMesh", "destroyTrafficGpu", "state", "buffer", "removeTraffic", "state", "disposeTrafficObject", "destroyTrafficGpu", "readyTraffic", "state", "startTraffic", "vehicleOffsets", "length", "flow", "velocity", "count", "offsets", "i", "clockMinutes", "clockTime", "parts", "compareDepartures", "a", "b", "scheduledTrips", "date", "timeZone", "duration", "services", "time", "clock", "parts", "part", "from", "to", "every", "months", "weekdays", "departure", "minute", "weekday", "departures", "clockMinutes", "compareDepartures", "trips", "tripsAt", "time", "lanes", "velocity", "trips", "l", "lane", "timetable", "flow", "trip", "travelled", "offsets", "k", "scheduledTrips", "vehicleOffsets", "trafficNow", "state", "control", "failTraffic", "state", "error", "routeGeometry", "lanes", "position", "normal", "color", "points", "lengths", "properties", "raw", "rgb", "tint", "i", "a", "b", "dx", "dz", "length", "x", "z", "distance", "start", "end", "p", "q", "point", "createTrafficMesh", "state", "data", "featureFaces", "material", "usage", "result", "createMesh", "drawTrafficRoute", "state", "createTrafficMesh", "routeGeometry", "trafficBounds", "state", "radius", "height", "i", "lane", "x", "z", "y", "data", "extent", "computeBounds", "rebuildTrafficMesh", "state", "trips", "model", "vertices", "disposeTrafficObject", "color", "featureFaces", "i", "trip", "component", "build", "count", "createTrafficMesh", "trafficBounds", "trafficStorage", "device", "data", "buffer", "rebaseTraffic", "state", "device", "destroyTrafficGpu", "trafficStorage", "lane", "i", "point", "trip", "binding", "count", "data", "offset", "index", "position", "normal", "buffers", "entries", "moveTraffic", "state", "seconds", "device", "encoder", "pass", "tickTraffic", "state", "live", "time", "trafficNow", "ms", "valid", "changed", "trip", "x", "y", "z", "dx", "dz", "lx", "ly", "lz", "light", "text", "tripsAt", "error", "failTraffic", "ids", "key", "drawTrafficRoute", "rebuildTrafficMesh", "rebaseTraffic", "moveTraffic", "lights", "locateTraffic", "update", "fetchTrafficLanes", "state", "time", "signal", "href", "response", "toLanes", "features", "lanes", "geometry", "properties", "lines", "line", "latlngs", "lng", "lat", "groundTraffic", "state", "layer", "lanes", "terrain", "base", "lane", "i", "elevation", "getElevation", "prepareTraffic", "state", "layer", "lanes", "crs", "origin", "metres", "lane", "lat", "lng", "point", "i", "groundTraffic", "disposeTrafficObject", "loadedTrafficLanes", "state", "signal", "data", "toLanes", "prepareTraffic", "failedTrafficLoad", "state", "signal", "error", "failTraffic", "loadTraffic", "state", "time", "trafficNow", "signal", "fetchTrafficLanes", "loadedTrafficLanes", "failedTrafficLoad", "updateTraffic", "state", "event", "loadTraffic", "updateTrafficTerrain", "state", "groundTraffic", "disposeTrafficObject", "trafficBounds", "initTraffic", "layer", "url", "vehicle", "side", "outline", "velocity", "options", "model", "lights", "defaultSide", "vehicles", "init3D", "tooltip", "status", "template", "build", "stride", "vertices", "params", "paramFloats", "paramInts", "state", "trafficShader", "tickTraffic", "updateTraffic", "updateTrafficTerrain", "placeTraffic", "readyTraffic", "addTraffic", "removeTraffic", "onBlur", "moves", "onPointer", "event", "map", "limbs", "local", "layer", "state", "map", "crs", "origin", "metres", "p", "terrain", "ground", "getElevation", "place", "x", "y", "z", "local", "yaw", "cos", "sin", "i", "px", "py", "sign", "mesh", "limbs", "update", "onTerrain", "place", "stop", "map", "mesh", "name", "disposeMesh", "onKey", "event", "moves", "wrap", "angle", "colliders", "collider", "mesh", "c", "colliders", "m", "p", "index", "normal", "uv", "count", "tri", "nrm", "cells", "v", "i", "first", "k", "j", "x", "z", "ex", "ey", "ez", "fx", "fy", "fz", "nx", "nz", "ny", "length", "a", "h", "t", "ix", "iz", "key", "horizontalRay", "v", "ox", "oy", "oz", "dx", "dz", "i", "ex", "ey", "ez", "fx", "fy", "fz", "px", "py", "pz", "det", "tx", "ty", "tz", "u", "qx", "qy", "qz", "w", "shouldSkipOther", "other", "layer", "hitMesh", "mesh", "data", "computeBounds", "m", "k", "radius", "x", "y", "z", "dx", "dz", "reach", "c", "collider", "ox", "oy", "oz", "seen", "ix", "iz", "t", "height", "d", "horizontalRay", "hit", "layer", "x", "y", "z", "dx", "dz", "reach", "updateWorldMatrix", "data", "other", "shouldSkipOther", "traverse", "hitMesh", "blocked", "east", "north", "feet", "length", "hit", "step", "now", "layer", "map", "dt", "changed", "part", "key", "i", "limbs", "createMesh", "build", "parts", "forward", "turn", "moves", "wrap", "metres", "lat", "lng", "position", "scale", "east", "north", "feet", "local", "wall", "blocked", "into", "bearing", "behind", "target", "place", "start", "map", "pixelsPerMetre", "zoom", "handlers", "name", "toggle", "stop", "start", "createWalk", "control", "speed", "distance", "options", "layer", "init3D", "keys", "container", "button", "hint", "context", "step", "onKey", "onBlur", "onPointer", "onTerrain", "start", "stop", "toggle", "initialize", "options", "createWalk", "onAdd", "map", "onRemove", "initialize", "onAdd", "onRemove", "indexState", "emptyEvents", "refreshNativeLayerContract", "layer", "bringNativeLayerToFront", "layer", "bringNativeLayerToBack", "layer", "closestCameraLayerPoint", "point", "indexState", "cameraCircleBounds", "indexState", "initializeGridContainer", "indexState", "cancelGridFade", "layer", "indexState", "runGridFades", "indexState", "layers", "layer", "version", "updateGridOpacity", "scheduleGridFade", "layer", "indexState", "runGridFades", "updateGridOpacity", "layer", "now", "fading", "prune", "tile", "cancelGridFade", "scheduleGridFade", "fireRasterLoad", "indexState", "addRasterImage", "indexState", "fireRasterLoad", "initializeNativeLayer", "noOperation", "emptyEvents", "refreshNativeLayerContract", "bringNativeLayerToFront", "bringNativeLayerToBack", "indexState", "closestCameraLayerPoint", "cameraCircleBounds", "initializeGridContainer", "updateGridOpacity", "addRasterImage", "layerLayerAdd", "event", "native", "indexState", "initNativeGPU", "setGeoJSONLayerData", "data", "setGeoJSONData", "initializeGeoJSON", "layer", "options", "setGeoJSONLayerData", "init3D", "initializerFor", "type", "initializeGeoJSON", "initRaster", "initTerrain", "initTraffic", "resolveNextInitialization", "task", "indexState", "initializerFor", "error", "initializeLayer", "task", "layer", "ready", "map", "error", "layerInitialize", "options", "indexState", "type", "source", "core", "settings", "init3D", "noOperation", "task", "resolveNextInitialization", "ready", "initializeLayer", "indexState", "layerLayerAdd", "layerInitialize", "initializeNativeLayer"]
|
|
7
7
|
}
|