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
package/dist/types/traffic.js
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import"./3d.js";import{computeBounds as xe}from"../utils/geometry.js";import{along as ye,speed as we,toLanes as _e,tripsAt as ze,routeGeometry as Ae}from"../utils/traffic.js";import{build as se,vehicles as $}from"../utils/vehicles.js";import{underEntry as Ue}from"../utils/control.js";const Be=({properties:r})=>{const m=document.createElement("div");return m.style.whiteSpace="pre-line",m.textContent=[r.name,r.departure&&`Departure ${r.departure} ${r.timetable.timeZone}`,r.description].filter(Boolean).join(`
|
|
2
|
-
`),m};function Le(r,{url:m,model:P,lights:G,side:A,outline:k,velocity:le}){const W=globalThis.L,Z=()=>{let e={live:!0};return r._map?.eachLayer(o=>{o.control?.time&&(e=o.control)}),{live:e.live,time:e.live?new Date:e.time}},y=W.DomUtil.create("small","traffic-status");y.style.cssText="display:block;max-width:200px;margin:0 0 4px 20px;color:#555;";const b=se(P(0)),D=b.position.length,w=D/3;let I=!1,x,O,h=[],_,c,g,J=-1/0,d=[],q=0,M=-1/0,Q=0,l=null,C=!0,N=!1;const j=new ArrayBuffer(16),X=new Float32Array(j),Y=new Uint32Array(j),ee=(e,o,n,t=0)=>{const a=r._createMesh(e,n,t);return a.extras.featureFaces=o,a},U=e=>{e&&(r.highlightedFeature?.mesh===e&&(r._setHighlight(null),r.hoveredFeature=null,r._showFeature(null)),r._disposeMesh(e))},te=e=>{y.textContent=`Error: ${e.message}`,y.setAttribute("role","alert"),console.error("Traffic layer",e)},ne=()=>{const e=r._map._terrain3D?._terrainReady&&r._map._terrain3D,o=r.root.position[1];for(const n of h)n.points.forEach((t,a)=>{const i=e&&(n.elevation??e._getElevation(n.latlngs[a]));t[2]=Number.isFinite(i)&&Number.isFinite(o)?i-o:0});C=!0,M=-1/0},ce=()=>{const e=r._map.options.crs,o=e.project(r.location),n=Math.cos(r.location.lat*Math.PI/180);for(const t of h){t.points=t.latlngs.map(([a,i])=>{const s=e.project(new W.LatLng(a,i));return[(s.x-o.x)*n,-(s.y-o.y)*n,0]}),t.lengths=[0];for(let a=1;a<t.points.length;a++)t.lengths.push(t.lengths[a-1]+Math.hypot(t.points[a][0]-t.points[a-1][0],t.points[a][1]-t.points[a-1][1]));t.length=t.lengths.at(-1)}ne(),U(g),g=null,_=null},ue=()=>{g=ee(Ae(h),[],{emissive:[.03,.25,.3],alphaMode:"BLEND"}),g.renderOrder=1e3},fe=()=>{if(U(c),c=null,!d.length)return;const e=d.flatMap((n,t)=>se(P(t)).color),o=e.length/3;c=ee({position:e.map(()=>0),normal:e.map(()=>0),color:e},d.map((n,t)=>({id:n.id,properties:n.properties,faceStart:t*w/3,faceEnd:(t+1)*w/3,vertexStart:t*w,vertexEnd:(t+1)*w})),{},GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC),c.geometry.drawRange.count=o,oe()},oe=()=>{const e={attributes:{position:{data:h.flatMap(o=>o.points.flatMap(([n,t,a])=>[n-20,a,t-20,n+20,a+5,t+20]))}}};xe(e),c.geometry.bounds=e.bounds},re=()=>{for(const e of[l?.params,l?.template,l?.points,l?.vehicles])e?.destroy();l=null},H=(e,o)=>{const n=e.createBuffer({size:Math.max(16,o.byteLength),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});return e.queue.writeBuffer(n,0,o),n},pe=`
|
|
3
|
-
struct Params { seconds: f32, side: f32, vertices: u32, total: u32 }
|
|
4
|
-
struct Vehicle { start: u32, count: u32, base: f32, speed: f32 }
|
|
5
|
-
@group(0) @binding(0) var<uniform> params: Params;
|
|
6
|
-
@group(0) @binding(1) var<storage, read> model: array<f32>;
|
|
7
|
-
@group(0) @binding(2) var<storage, read> points: array<vec4f>;
|
|
8
|
-
@group(0) @binding(3) var<storage, read> vehicles: array<Vehicle>;
|
|
9
|
-
@group(0) @binding(4) var<storage, read_write> position: array<f32>;
|
|
10
|
-
@group(0) @binding(5) var<storage, read_write> normal: array<f32>;
|
|
11
|
-
@compute @workgroup_size(64)
|
|
12
|
-
fn main(@builtin(global_invocation_id) id: vec3u) {
|
|
13
|
-
let v = id.x;
|
|
14
|
-
if (v >= params.total) { return; }
|
|
15
|
-
let vehicle = vehicles[v / params.vertices];
|
|
16
|
-
let last = vehicle.start + vehicle.count - 1u;
|
|
17
|
-
let length = points[last].w;
|
|
18
|
-
var s = vehicle.base + params.seconds * vehicle.speed;
|
|
19
|
-
s -= length * floor(s / length);
|
|
20
|
-
var i = vehicle.start + 1u;
|
|
21
|
-
while (i < last && points[i].w < s) { i++; }
|
|
22
|
-
let a = points[i - 1u];
|
|
23
|
-
let b = points[i];
|
|
24
|
-
let d = select(b.w - a.w, 1.0, b.w == a.w);
|
|
25
|
-
let t = (s - a.w) / d;
|
|
26
|
-
let dx = (b.x - a.x) / d;
|
|
27
|
-
let dz = (b.y - a.y) / d;
|
|
28
|
-
let cx = a.x + (b.x - a.x) * t - dz * params.side;
|
|
29
|
-
let cz = a.y + (b.y - a.y) * t + dx * params.side;
|
|
30
|
-
let y = a.z + (b.z - a.z) * t;
|
|
31
|
-
let k = (v % params.vertices) * 3u;
|
|
32
|
-
let n = params.vertices * 3u + k;
|
|
33
|
-
let o = v * 3u;
|
|
34
|
-
position[o] = cx - model[k] * dz - model[k + 2u] * dx;
|
|
35
|
-
position[o + 1u] = y + model[k + 1u];
|
|
36
|
-
position[o + 2u] = cz + model[k] * dx - model[k + 2u] * dz;
|
|
37
|
-
normal[o] = -model[n] * dz - model[n + 2u] * dx;
|
|
38
|
-
normal[o + 1u] = model[n + 1u];
|
|
39
|
-
normal[o + 2u] = model[n] * dx - model[n + 2u] * dz;
|
|
40
|
-
}`,de=()=>{const{device:e}=r.renderer;if(l?.device!==e&&(re(),l={device:e,pipeline:e.createComputePipeline({layout:"auto",compute:{module:e.createShaderModule({code:pe}),entryPoint:"main"}}),params:e.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),template:H(e,new Float32Array([...b.position,...b.normal]))},C=!0),C){const i=new Float32Array(h.reduce((u,p)=>u+p.points.length,0)*4);let s=0;for(const u of h)u.start=s/4,u.points.forEach((p,f)=>{i.set([p[0],p[1],p[2],u.lengths[f]],s),s+=4});l.points?.destroy(),l.points=H(e,i),C=!1}const o=new Float32Array(d.length*4),n=new Uint32Array(o.buffer);d.forEach((i,s)=>{n[s*4]=i.lane.start,n[s*4+1]=i.lane.points.length,o[s*4+2]=i.distance,o[s*4+3]=i.speed,c.extras.featureFaces[s].properties=i.properties}),l.vehicles?.size>=o.byteLength?e.queue.writeBuffer(l.vehicles,0,o):(l.vehicles?.destroy(),l.vehicles=H(e,o));const{position:t,normal:a}=c.geometry.attributes;l.bindGroup=e.createBindGroup({layout:l.pipeline.getBindGroupLayout(0),entries:[l.params,l.template,l.points,l.vehicles,t.buffer,a.buffer].map((i,s)=>({binding:s,resource:{buffer:i}}))})},me=e=>{const{device:o}=l;X[0]=Q=e,X[1]=A,Y[2]=w,Y[3]=d.length*w,o.queue.writeBuffer(l.params,0,j);const n=o.createCommandEncoder(),t=n.beginComputePass();t.setPipeline(l.pipeline),t.setBindGroup(0,l.bindGroup),t.dispatchWorkgroups(Math.ceil(Y[3]/64)),t.end(),o.queue.submit([n.finish()]),N=!0},ae=e=>{const{points:o,lengths:n,length:t}=e.lane;let a=e.distance+Q*e.speed;a-=t*Math.floor(a/t);const{x:i,y:s,z:u,dx:p,dz:f}=ye(o,n,a);return{x:i-f*A,y:s,z:u+p*A,dx:p,dz:f}},he=()=>{if(!c||!N)return;N=!1;const{position:e,normal:o}=c.geometry.attributes;d.forEach((n,t)=>{const{x:a,y:i,z:s,dx:u,dz:p}=ae(n);for(let f=0,v=t*D;f<D;f+=3,v+=3){const E=b.position[f],S=b.position[f+2],F=b.normal[f],R=b.normal[f+2];e.data[v]=a-E*p-S*u,e.data[v+1]=i+b.position[f+1],e.data[v+2]=s+E*u-S*p,o.data[v]=-F*p-R*u,o.data[v+1]=b.normal[f+1],o.data[v+2]=F*u-R*p}})},ge=r.raycast;r.raycast=function(...e){return he(),ge.apply(this,e)};const B=()=>{if(x=void 0,!I||!r._map)return;if(!r.renderer){x=requestAnimationFrame(B);return}c&&!(c.geometry.attributes.position.buffer.usage&GPUBufferUsage.STORAGE)&&(_=null,M=-1/0);const{live:e,time:o}=Z(),n=o?.getTime(),t=Number.isFinite(n);let a=!1;if(!e||!t||!(n>=q&&n<M)){let i;try{d=t?ze(o,h,le):[],i=t?z?`${d.length} vehicle${d.length===1?"":"s"}${z.note?` \xB7 ${z.note}`:""}`:"Loading\u2026":"Select a valid simulation date"}catch(u){return te(u)}q=n,M=n+1e3;const s=d.map(u=>u.id).join();a=s!==_||k&&!g&&h.length,k&&!g&&h.length&&ue(),s!==_&&(fe(),_=s),c&&de(),y.textContent!==i&&(y.textContent=i),y.removeAttribute("role")}c&&me((n-q)/1e3),c&&G&&(!e||!(performance.now()-J<100))&&(J=performance.now(),c.extras.lights=d.flatMap(i=>{const{x:s,y:u,z:p,dx:f,dz:v}=ae(i);return G.map(({position:[E,S,F],...R})=>({...R,position:[s-E*v-F*f,u+S,p+E*f-F*v]}))})),(c||a)&&r.update(),e&&t&&(x=requestAnimationFrame(B))};let z,V;const ve=async(e,o)=>{const n=new URL(m,document.baseURI).href;if(/\.m?js(?:[?#]|$)/i.test(m))return(await import(n)).default(e,r,o);if(!V){const t=await fetch(n,{signal:o});if(!t.ok)throw new Error(`HTTP ${t.status}`);V=await t.json()}return V},be=()=>{const{time:e}=Z();if(!Number.isFinite(e?.getTime()))return;O?.abort();const{signal:o}=O=new AbortController;ve(e,o).then(n=>{o.aborted||!r._map||n===z||(z=n,h=_e(n),ce(),x||B())},n=>{n.name!=="AbortError"&&te(n)})},T=e=>{e?.layer!==r&&(cancelAnimationFrame(x),be(),B())},K=()=>{h.length&&(ne(),U(g),g=null,c&&oe(),x||B())},ie=()=>{r._map.off("simulationtimechange layerremove",T).on("simulationtimechange layerremove",T),r._map.off("terrainchange",K).on("terrainchange",K),Ue(r,y),T()};r.on("ready",()=>{I=!0,r._map&&ie()}),r.on("add",()=>{I&&ie()}),r.on("remove",()=>{O?.abort(),cancelAnimationFrame(x),x=void 0,r._map.off("simulationtimechange layerremove",T).off("terrainchange",K),U(c),U(g),c=g=null,re(),h=[],d=[],_=z=null})}L.Layer.types.traffic=L.Layer.types["3d"].extend({initialize({url:r,vehicle:m="car",side:P,outline:G=!1,speed:A=we,...k}={}){if(!r)throw new Error("Traffic needs a source url");if(!$[m])throw new Error(`Unknown vehicle: ${m}`);L.Layer.types["3d"].prototype.initialize.call(this,{tooltipContent:Be,nightLight:!!$[m].lights,...k}),Le(this,{url:r,...$[m],side:P??$[m].side,outline:G,velocity:A})}});
|
|
41
|
-
//# sourceMappingURL=traffic.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/types/traffic.js"],
|
|
4
|
-
"sourcesContent": ["import './3d.js';\nimport { computeBounds } from '../utils/geometry.js';\nimport { along, speed, toLanes, tripsAt, routeGeometry } from '../utils/traffic.js';\nimport { build, vehicles } from '../utils/vehicles.js';\nimport { underEntry } from '../utils/control.js';\n\nconst tooltip = ({ properties: p }) => {\n const content = document.createElement('div');\n content.style.whiteSpace = 'pre-line';\n content.textContent = [p.name, p.departure && `Departure ${p.departure} ${p.timetable.timeZone}`, p.description].filter(Boolean).join('\\n');\n return content;\n};\n\nfunction installTraffic(layer, { url, model, lights, side, outline, velocity }) {\n const L = globalThis.L;\n // The 'sunlight' layer on the same map drives the simulation time; without one, vehicles run live.\n const now = () => {\n let control = { live: true };\n layer._map?.eachLayer(other => { if (other.control?.time) control = other.control; });\n return { live: control.live, time: control.live ? new Date() : control.time };\n };\n const status = L.DomUtil.create('small', 'traffic-status');\n status.style.cssText = 'display:block;max-width:200px;margin:0 0 4px 20px;color:#555;';\n const template = build(model(0)), stride = template.position.length, vertices = stride / 3;\n let ready = false, frame, request, lanes = [], tripsKey, mesh, route, litAt = -Infinity;\n // Vehicles move on the GPU: `trips` are rebased at most once per second, a compute pass places them every frame.\n let trips = [], rebasedAt = 0, nextCheck = -Infinity, elapsed = 0, gpu = null, lanesDirty = true, stale = false;\n const params = new ArrayBuffer(16), paramFloats = new Float32Array(params), paramInts = new Uint32Array(params);\n\n const createMesh = (data, featureFaces, material, usage = 0) => {\n const result = layer._createMesh(data, material, usage);\n result.extras.featureFaces = featureFaces;\n return result;\n };\n const dispose = object => {\n if (!object) return;\n if (layer.highlightedFeature?.mesh === object) {\n layer._setHighlight(null);\n layer.hoveredFeature = null;\n layer._showFeature(null);\n }\n layer._disposeMesh(object);\n };\n const fail = error => {\n status.textContent = `Error: ${error.message}`;\n status.setAttribute('role', 'alert');\n console.error('Traffic layer', error);\n };\n\n const ground = () => {\n const terrain = layer._map._terrain3D?._terrainReady && layer._map._terrain3D, base = layer.root.position[1];\n for (const lane of lanes) lane.points.forEach((point, i) => {\n const elevation = terrain && (lane.elevation ?? terrain._getElevation(lane.latlngs[i]));\n point[2] = Number.isFinite(elevation) && Number.isFinite(base) ? elevation - base : 0;\n });\n lanesDirty = true;\n nextCheck = -Infinity;\n };\n const prepare = () => {\n const crs = layer._map.options.crs, origin = crs.project(layer.location);\n const metres = Math.cos(layer.location.lat * Math.PI / 180);\n for (const lane of lanes) {\n lane.points = lane.latlngs.map(([lat, lng]) => {\n const point = crs.project(new L.LatLng(lat, lng));\n return [(point.x - origin.x) * metres, -(point.y - origin.y) * metres, 0];\n });\n lane.lengths = [0];\n for (let 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 ground();\n dispose(route); route = null;\n tripsKey = null;\n };\n\n // Dashed lane outline, just above the lanes.\n const drawRoute = () => {\n\n route = createMesh(routeGeometry(lanes), [], { emissive: [0.03, 0.25, 0.3], alphaMode: 'BLEND' });\n route.renderOrder = 1000;\n };\n // One batched mesh, `vertices` per vehicle; the compute pass writes its position/normal buffers (STORAGE).\n const rebuild = () => {\n dispose(mesh); mesh = null;\n if (!trips.length) return;\n const color = trips.flatMap((trip, i) => build(model(i)).color), count = color.length / 3;\n mesh = createMesh({ position: color.map(() => 0), normal: color.map(() => 0), color },\n trips.map((trip, i) => ({ id: trip.id, properties: trip.properties, faceStart: i * vertices / 3, faceEnd: (i + 1) * vertices / 3,\n vertexStart: i * vertices, vertexEnd: (i + 1) * vertices })), {}, GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC);\n mesh.geometry.drawRange.count = count;\n bounds();\n };\n // Vehicles never leave their lanes: cull and pick against the lanes' extent.\n const bounds = () => {\n const extent = { attributes: { position: { data: lanes.flatMap(lane => lane.points.flatMap(([x, z, y]) => [x - 20, y, z - 20, x + 20, y + 5, z + 20])) } } };\n computeBounds(extent);\n mesh.geometry.bounds = extent.bounds;\n };\n\n const destroyGpu = () => {\n for (const buffer of [gpu?.params, gpu?.template, gpu?.points, gpu?.vehicles]) buffer?.destroy();\n gpu = null;\n };\n const storage = (device, data) => {\n const buffer = device.createBuffer({ size: Math.max(16, data.byteLength), usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST });\n device.queue.writeBuffer(buffer, 0, data);\n return buffer;\n };\n // Lane points are [x, z, ground, cumulative length]. Mirrors along() and place().\n const shader = `\n struct Params { seconds: f32, side: f32, vertices: u32, total: u32 }\n struct Vehicle { start: u32, count: u32, base: f32, speed: f32 }\n @group(0) @binding(0) var<uniform> params: Params;\n @group(0) @binding(1) var<storage, read> model: array<f32>;\n @group(0) @binding(2) var<storage, read> points: array<vec4f>;\n @group(0) @binding(3) var<storage, read> vehicles: array<Vehicle>;\n @group(0) @binding(4) var<storage, read_write> position: array<f32>;\n @group(0) @binding(5) var<storage, read_write> normal: array<f32>;\n @compute @workgroup_size(64)\n fn main(@builtin(global_invocation_id) id: vec3u) {\n let v = id.x;\n if (v >= params.total) { return; }\n let vehicle = vehicles[v / params.vertices];\n let last = vehicle.start + vehicle.count - 1u;\n let length = points[last].w;\n var s = vehicle.base + params.seconds * vehicle.speed;\n s -= length * floor(s / length);\n var i = vehicle.start + 1u;\n while (i < last && points[i].w < s) { i++; }\n let a = points[i - 1u];\n let b = points[i];\n let d = select(b.w - a.w, 1.0, b.w == a.w);\n let t = (s - a.w) / d;\n let dx = (b.x - a.x) / d;\n let dz = (b.y - a.y) / d;\n let cx = a.x + (b.x - a.x) * t - dz * params.side;\n let cz = a.y + (b.y - a.y) * t + dx * params.side;\n let y = a.z + (b.z - a.z) * t;\n let k = (v % params.vertices) * 3u;\n let n = params.vertices * 3u + k;\n let o = v * 3u;\n position[o] = cx - model[k] * dz - model[k + 2u] * dx;\n position[o + 1u] = y + model[k + 1u];\n position[o + 2u] = cz + model[k] * dx - model[k + 2u] * dz;\n normal[o] = -model[n] * dz - model[n + 2u] * dx;\n normal[o + 1u] = model[n + 1u];\n normal[o + 2u] = model[n] * dx - model[n + 2u] * dz;\n }`;\n // Upload lanes and the rebased trips; the CPU copy is refreshed only for picking (place()).\n const rebase = () => {\n const { device } = layer.renderer;\n if (gpu?.device !== device) {\n destroyGpu();\n gpu = {\n device,\n pipeline: device.createComputePipeline({ layout: 'auto', compute: { module: device.createShaderModule({ code: shader }), entryPoint: 'main' } }),\n params: device.createBuffer({ size: 16, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST }),\n template: storage(device, new Float32Array([...template.position, ...template.normal])),\n };\n lanesDirty = true;\n }\n if (lanesDirty) {\n const data = new Float32Array(lanes.reduce((count, lane) => count + lane.points.length, 0) * 4);\n let offset = 0;\n for (const lane of lanes) {\n lane.start = offset / 4;\n lane.points.forEach((point, i) => { data.set([point[0], point[1], point[2], lane.lengths[i]], offset); offset += 4; });\n }\n gpu.points?.destroy();\n gpu.points = storage(device, data);\n lanesDirty = false;\n }\n const data = new Float32Array(trips.length * 4), index = new Uint32Array(data.buffer);\n trips.forEach((trip, 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 mesh.extras.featureFaces[i].properties = trip.properties;\n });\n if (gpu.vehicles?.size >= data.byteLength) device.queue.writeBuffer(gpu.vehicles, 0, data);\n else {\n gpu.vehicles?.destroy();\n gpu.vehicles = storage(device, data);\n }\n const { position, normal } = mesh.geometry.attributes;\n gpu.bindGroup = device.createBindGroup({\n layout: gpu.pipeline.getBindGroupLayout(0),\n entries: [gpu.params, gpu.template, gpu.points, gpu.vehicles, position.buffer, normal.buffer]\n .map((buffer, binding) => ({ binding, resource: { buffer } })),\n });\n };\n const move = seconds => {\n const { device } = gpu;\n paramFloats[0] = elapsed = seconds;\n paramFloats[1] = side;\n paramInts[2] = vertices;\n paramInts[3] = trips.length * vertices;\n device.queue.writeBuffer(gpu.params, 0, params);\n const encoder = device.createCommandEncoder(), pass = encoder.beginComputePass();\n pass.setPipeline(gpu.pipeline);\n pass.setBindGroup(0, gpu.bindGroup);\n pass.dispatchWorkgroups(Math.ceil(paramInts[3] / 64));\n pass.end();\n device.queue.submit([encoder.finish()]);\n stale = true;\n };\n // CPU twin of the compute pass: the centre of `trip` and its heading.\n const locate = trip => {\n const { points, lengths, length } = trip.lane;\n let distance = trip.distance + elapsed * trip.speed;\n distance -= length * Math.floor(distance / length);\n const { x, y, z, dx, dz } = along(points, lengths, distance);\n return { x: x - dz * side, y, z: z + dx * side, dx, dz };\n };\n // Run lazily before picking.\n const place = () => {\n if (!mesh || !stale) return;\n stale = false;\n const { position, normal } = mesh.geometry.attributes;\n trips.forEach((trip, i) => {\n const { x: cx, y, z: cz, dx, dz } = locate(trip);\n for (let k = 0, o = i * stride; k < stride; k += 3, o += 3) {\n const lx = template.position[k], lz = template.position[k + 2], nx = template.normal[k], nz = template.normal[k + 2];\n position.data[o] = cx - lx * dz - lz * dx;\n position.data[o + 1] = y + 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] = template.normal[k + 1];\n normal.data[o + 2] = nx * dx - nz * dz;\n }\n });\n };\n const raycast = layer.raycast;\n layer.raycast = function (...args) {\n place();\n return raycast.apply(this, args);\n };\n\n const tick = () => {\n frame = undefined;\n if (!ready || !layer._map) return;\n // Re-adding after the last GPU owner was removed can attach asynchronously.\n if (!layer.renderer) { frame = requestAnimationFrame(tick); return; }\n // A renderer change re-creates vertex buffers without STORAGE: rebuild the mesh.\n if (mesh && !(mesh.geometry.attributes.position.buffer.usage & GPUBufferUsage.STORAGE)) { tripsKey = null; nextCheck = -Infinity; }\n const { live, time } = now(), ms = time?.getTime(), valid = Number.isFinite(ms);\n let changed = false;\n // Trips only change at timetable/hour boundaries: re-check once per second while live.\n if (!live || !valid || !(ms >= rebasedAt && ms < nextCheck)) {\n let text;\n try {\n trips = valid ? tripsAt(time, lanes, velocity) : [];\n text = !valid ? 'Select a valid simulation date' : !loaded ? 'Loading\u2026' :\n `${trips.length} vehicle${trips.length === 1 ? '' : 's'}${loaded.note ? ` \u00B7 ${loaded.note}` : ''}`;\n } catch (error) { return fail(error); }\n rebasedAt = ms;\n nextCheck = ms + 1000;\n const key = trips.map(trip => trip.id).join();\n changed = key !== tripsKey || (outline && !route && lanes.length);\n if (outline && !route && lanes.length) drawRoute();\n if (key !== tripsKey) { rebuild(); tripsKey = key; }\n if (mesh) rebase();\n if (status.textContent !== text) status.textContent = text;\n status.removeAttribute('role');\n }\n if (mesh) move((ms - rebasedAt) / 1000);\n // ponytail: night point lights follow the vehicles at 10 Hz via the shared CPU light grid (~5 ms with thousands of lamps);\n // bin the lights in a compute pass if it shows up in profiles.\n if (mesh && lights && (!live || !(performance.now() - litAt < 100))) {\n litAt = performance.now();\n mesh.extras.lights = trips.flatMap(trip => {\n const { x, y, z, dx, dz } = locate(trip);\n return lights.map(({ position: [lx, ly, lz], ...light }) => ({ ...light, position: [x - lx * dz - lz * dx, y + ly, z + lx * dx - lz * dz] }));\n });\n }\n if (mesh || changed) layer.update();\n if (live && valid) frame = requestAnimationFrame(tick);\n };\n let loaded, file;\n // A JS module serves time-dependent lanes; anything else is a static GeoJSON file, fetched once.\n const fetchLanes = async (time, signal) => {\n const href = new URL(url, document.baseURI).href;\n if (/\\.m?js(?:[?#]|$)/i.test(url)) return (await import(href)).default(time, layer, signal);\n if (!file) {\n const response = await fetch(href, { signal });\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n file = await response.json();\n }\n return file;\n };\n const load = () => {\n const { time } = now();\n if (!Number.isFinite(time?.getTime())) return;\n request?.abort();\n const { signal } = request = new AbortController();\n fetchLanes(time, signal).then(data => {\n if (signal.aborted || !layer._map || data === loaded) return;\n loaded = data;\n lanes = toLanes(data);\n prepare();\n if (!frame) tick();\n }, error => { if (error.name !== 'AbortError') fail(error); });\n };\n // 'layerremove' fires once the clock layer has really left the map.\n const update = event => {\n if (event?.layer === layer) return;\n cancelAnimationFrame(frame);\n load();\n tick();\n };\n const terrain = () => {\n if (!lanes.length) return;\n ground();\n dispose(route); route = null;\n if (mesh) bounds();\n if (!frame) tick();\n };\n const start = () => {\n layer._map.off('simulationtimechange layerremove', update).on('simulationtimechange layerremove', update);\n layer._map.off('terrainchange', terrain).on('terrainchange', terrain);\n underEntry(layer, status);\n update();\n };\n layer.on('ready', () => { ready = true; if (layer._map) start(); });\n layer.on('add', () => { if (ready) start(); });\n layer.on('remove', () => {\n request?.abort();\n cancelAnimationFrame(frame); frame = undefined;\n layer._map.off('simulationtimechange layerremove', update).off('terrainchange', terrain);\n dispose(mesh); dispose(route); mesh = route = null;\n destroyGpu();\n lanes = []; trips = []; tripsKey = loaded = null;\n });\n}\n\n/**\n * Vehicles moving along GeoJSON lanes; a compute pass places them on the GPU every frame.\n * Source options:\n * - `url`: GeoJSON (Multi)LineStrings, or a JS module whose default export `(time, layer, signal)` returns them (time-dependent data);\n * - `vehicle`: 'car' (default) or 'boat'; `side`: offset right of the lane centreline in metres (vehicle default);\n * - `speed`: m/s of `flow` lanes; `outline`: draw the lanes.\n * Lane properties: `flow` (vehicles/h) or `timetable` (see scheduledTrips in utils/traffic.js), optional fixed `elevation`\n * in metres, `name`/`description` for the default tooltip. The status line (vehicle count, then the FeatureCollection `note`) sits under the layer's entry in the layers control.\n * The 'sunlight' layer on the same map drives the time; without one, vehicles run live.\n */\nL.Layer.types.traffic = L.Layer.types['3d'].extend({\n initialize({ url, vehicle = 'car', side, outline = false, speed: velocity = speed, ...options } = {}) {\n if (!url) throw new Error('Traffic needs a source url');\n if (!vehicles[vehicle]) throw new Error(`Unknown vehicle: ${vehicle}`);\n L.Layer.types['3d'].prototype.initialize.call(this, { tooltipContent: tooltip, nightLight: Boolean(vehicles[vehicle].lights), ...options });\n installTraffic(this, { url, ...vehicles[vehicle], side: side ?? vehicles[vehicle].side, outline, velocity });\n },\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["computeBounds", "along", "speed", "toLanes", "tripsAt", "routeGeometry", "build", "vehicles", "underEntry", "tooltip", "p", "content", "installTraffic", "layer", "url", "model", "lights", "side", "outline", "velocity", "L", "now", "control", "other", "status", "template", "stride", "vertices", "ready", "frame", "request", "lanes", "tripsKey", "mesh", "route", "litAt", "trips", "rebasedAt", "nextCheck", "elapsed", "gpu", "lanesDirty", "stale", "params", "paramFloats", "paramInts", "createMesh", "data", "featureFaces", "material", "usage", "result", "dispose", "object", "fail", "error", "ground", "terrain", "base", "lane", "point", "i", "elevation", "prepare", "crs", "origin", "metres", "lat", "lng", "drawRoute", "rebuild", "color", "trip", "count", "bounds", "extent", "x", "z", "y", "destroyGpu", "buffer", "storage", "device", "shader", "rebase", "offset", "index", "position", "normal", "binding", "move", "seconds", "encoder", "pass", "locate", "points", "lengths", "length", "distance", "dx", "dz", "place", "cx", "cz", "k", "o", "lx", "lz", "nx", "nz", "raycast", "args", "tick", "live", "time", "ms", "valid", "changed", "text", "loaded", "key", "ly", "light", "file", "fetchLanes", "signal", "href", "response", "load", "update", "event", "start", "vehicle", "options"]
|
|
7
|
-
}
|
package/dist/types/walk.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{CELL as R,collider as O,horizontalRay as Q,parts as $,limbs as H}from"../utils/walk.js";import"./3d.js";import{computeBounds as tt}from"../utils/geometry.js";import{traverse as ot,updateWorldMatrix as et}from"../utils/scene.js";import{build as nt}from"../utils/vehicles.js";const j={KeyW:[1,0],ArrowUp:[1,0],KeyS:[-1,0],ArrowDown:[-1,0],KeyD:[0,1],ArrowRight:[0,1],KeyA:[0,-1],ArrowLeft:[0,-1]},J=o=>Math.atan2(Math.sin(o),Math.cos(o));function it(o,T,B,I,a,g,f){const x=globalThis.L.Layer.types,c=y=>y===o||["terrain","traffic"].some(l=>x[l]&&y instanceof x[l]);et(o.scene);let _=f,M=null;for(const y of o._shared._layers)c(y)||ot(y.root,l=>{if(!l.visible)return!0;if(!l.geometry?.attributes?.position?.data||l.program?.depthTest===!1)return;l.geometry.bounds||tt(l.geometry);const i=l.worldMatrix,{center:r,radius:b}=l.geometry.bounds;if(Math.hypot(i[0]*r[0]+i[4]*r[1]+i[8]*r[2]+i[12]-T,i[2]*r[0]+i[6]*r[1]+i[10]*r[2]+i[14]-I)>b*Math.hypot(i[0],i[1],i[2])+f)return;const e=O(l),k=T-i[12]+e.origin[0],F=B-i[13]+e.origin[1],P=I-i[14]+e.origin[2],S=new Set;for(let K=Math.floor(Math.min(k,k+a*f)/R);K<=Math.floor(Math.max(k,k+a*f)/R);K++)for(let z=Math.floor(Math.min(P,P+g*f)/R);z<=Math.floor(Math.max(P,P+g*f)/R);z++)for(const u of e.cells.get(K+","+z)||[])if(!(S.has(u)||a*e.nrm[u*2]+g*e.nrm[u*2+1]>=0)){S.add(u);for(const V of[.4,1.5]){const D=Q(e.tri,u,k,F+V,P,a,g);D>=0&&D<_&&(_=D,M=[e.nrm[u*2],e.nrm[u*2+1]])}}});return M}function at(o,{speed:T,distance:B,position:I}){const a=globalThis.L,g=new Set,f=new a.Control({position:I}),x=a.DomUtil.create("div","leaflet-bar leaflet-control");x.style.cssText="display:flex;align-items:center;background:#fff;";const c=a.DomUtil.create("button","",x);c.type="button",c.title="Walk",c.setAttribute("aria-label","Walk"),c.setAttribute("aria-pressed","false"),c.textContent="\u{1F6B6}",c.style.cssText="width:30px;height:30px;padding:0;border:0;border-radius:4px;background:#fff;font-size:18px;line-height:30px;cursor:pointer;";const _=a.DomUtil.create("small","",x);_.style.cssText="display:none;padding:0 8px;color:#333;white-space:nowrap;",_.textContent="W/S: run \xB7 A/D: turn \xB7 drag: look around \xB7 Esc: exit",a.DomEvent.disableClickPropagation(x),f.onAdd=()=>x;let M,y,l,i=0,r,b;const e=o.walker={latlng:null,heading:0,phase:0},k=()=>{const t=o._map,n=t.options.crs,h=n.project(o.location),s=Math.cos(o.location.lat*Math.PI/180),p=n.project(e.latlng),m=t._terrain3D?._terrainReady&&t._terrain3D,A=m&&m._getElevation(e.latlng)||0;return[(p.x-h.x)*s,A-o.root.position[1],-(p.y-h.y)*s]},F=()=>{const[t,n,h]=k(),s=-e.heading,p=Math.cos(s),m=Math.sin(s);H.forEach(([,A,d,E],X)=>{const W=M[X];W.position[0]=t+A*p,W.position[1]=n+d,W.position[2]=h-A*m,W.rotation[0]=E*i*Math.sin(e.phase),W.rotation[1]=s}),o.update()},P=t=>{y=requestAnimationFrame(P);const n=o._map,h=Math.min(.1,(t-(l??t))/1e3);if(l=t,!o.renderer)return;let s=!1;M||(M=H.map(([d])=>o._createMesh(nt($[d]))),s=!0);let p=0,m=0;for(const d of g)p+=j[d]?.[0]||0,m+=j[d]?.[1]||0;if(p=Math.sign(p),m=Math.sign(m),m&&(e.heading=J(e.heading+m*2.5*h),s=!0),p){const d=p*T*h,{lat:E,lng:X}=e.latlng,{position:W,scale:N}=o.root;let C=Math.sin(e.heading)*d,Z=Math.cos(e.heading)*d;const Y=k().map((w,G)=>W[G]+N[G]*w),v=()=>{const w=Math.hypot(C,Z);return w>1e-6&&it(o,Y[0],Y[1],Y[2],C/w,-Z/w,w+.3)},U=v();if(U){const w=C*U[0]-Z*U[1];C-=w*U[0],Z+=w*U[1],v()&&(C=Z=0)}e.latlng=new a.LatLng(E+Z/111320,X+C/(111320*Math.cos(E*Math.PI/180))),e.phase+=Math.hypot(C,Z)/1.6*Math.PI,s=!0}if(p||m){const d=n.getBearing()*Math.PI/180,E=J(-e.heading-d);Math.abs(E)>.001&&n._setPitchAndBearing(n.getPitch(),(d+E*Math.min(1,h*4))*180/Math.PI),n.setView(e.latlng,n.getZoom(),{animate:!1})}const A=p?.9:0;Math.abs(i-A)>.001&&(i+=(A-i)*Math.min(1,h*10),s=!0),s&&F()},S=t=>{if(!(t.target.closest?.("input:not([type=checkbox], [type=radio]), select, textarea, [contenteditable]")||t.ctrlKey||t.altKey||t.metaKey)){if(t.type==="keydown"&&t.code==="Escape"){D();return}j[t.code]&&(t.preventDefault(),t.type==="keydown"?g.add(t.code):g.delete(t.code))}},K=()=>g.clear(),z=t=>{const n=o._map;if(t.type==="pointerdown"){if(t.button!==0||t.target.closest(".leaflet-control"))return;b={x:t.clientX,y:t.clientY},n.getContainer().setPointerCapture(t.pointerId)}else b&&t.type==="pointermove"?(n._setPitchAndBearing(Math.max(20,Math.min(85,n.getPitch()-(t.clientY-b.y)*.2)),n.getBearing()-(t.clientX-b.x)*.25),b={x:t.clientX,y:t.clientY}):b=null},u=()=>{M&&F()},V=()=>{const t=o._map;if(r||!t)return;e.latlng=t.getCenter();const n=t.getSize().y*1.5/B,h=Math.min(t.getMaxZoom(),Math.log2(n*4007501668557849e-8*Math.cos(e.latlng.lat*Math.PI/180)/256));r={zoom:t.getZoom(),pitch:t.getPitch(),scrollWheelZoom:t.options.scrollWheelZoom,handlers:["dragging","keyboard","doubleClickZoom","boxZoom"].filter(s=>t[s]?.enabled())};for(const s of r.handlers)t[s].disable();t.options.scrollWheelZoom=r.scrollWheelZoom&&"center",e.heading=-t.getBearing()*Math.PI/180,t.setView(e.latlng,h,{animate:!1}),t.setPitch(75),a.DomEvent.on(document,"keydown keyup",S),a.DomEvent.on(window,"blur",K),a.DomEvent.on(t.getContainer(),"pointerdown pointermove pointerup pointercancel",z),t.on("terrainchange",u),c.setAttribute("aria-pressed","true"),c.style.background="#e4e4e4",_.style.display="",l=void 0,y=requestAnimationFrame(P)},D=()=>{const t=o._map;cancelAnimationFrame(y),g.clear(),b=null,a.DomEvent.off(document,"keydown keyup",S),a.DomEvent.off(window,"blur",K);for(const n of M||[])o._disposeMesh(n);if(M=null,c.setAttribute("aria-pressed","false"),c.style.background="#fff",_.style.display="none",!(!t||!r)){a.DomEvent.off(t.getContainer(),"pointerdown pointermove pointerup pointercancel",z),t.off("terrainchange",u),t.options.scrollWheelZoom=r.scrollWheelZoom;for(const n of r.handlers)t[n].enable();t.setView(e.latlng,r.zoom,{animate:!1}),t.setPitch(r.pitch),r=null}};a.DomEvent.on(c,"click",()=>r?D():V());let q=!1;o.on("ready",()=>{q=!0,o._map&&f.addTo(o._map)}),o.on("add",()=>{q&&f.addTo(o._map)}),o.on("remove",()=>{D(),f.remove()})}L.Layer.types.walk=L.Layer.types["3d"].extend({initialize({speed:o=70,distance:T=20,position:B="bottomright",...I}={}){L.Layer.types["3d"].prototype.initialize.call(this,I),at(this,{speed:o,distance:T,position:B})}});
|
|
2
|
-
//# sourceMappingURL=walk.js.map
|
package/dist/types/walk.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/types/walk.js"],
|
|
4
|
-
"sourcesContent": ["import { CELL, collider, horizontalRay, parts, limbs } from '../utils/walk.js';\nimport './3d.js';\nimport { computeBounds } from '../utils/geometry.js';\nimport { traverse, updateWorldMatrix } from '../utils/scene.js';\nimport { build } from '../utils/vehicles.js';\n\n// W/S (\u2191/\u2193) run forward/back along the heading, A/D (\u2190/\u2192) turn: [forward, turn].\nconst moves = { KeyW: [1, 0], ArrowUp: [1, 0], KeyS: [-1, 0], ArrowDown: [-1, 0], KeyD: [0, 1], ArrowRight: [0, 1], KeyA: [0, -1], ArrowLeft: [0, -1] };\nconst wrap = angle => Math.atan2(Math.sin(angle), Math.cos(angle));\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.\nfunction hit(layer, x, y, z, dx, dz, reach) {\n const types = globalThis.L.Layer.types, skip = other => other === layer ||\n ['terrain', 'traffic'].some(name => types[name] && other instanceof types[name]);\n updateWorldMatrix(layer.scene);\n let best = reach, found = null;\n for (const other of layer._shared._layers) {\n if (skip(other)) continue;\n traverse(other.root, mesh => {\n if (!mesh.visible) return true;\n if (!mesh.geometry?.attributes?.position?.data || mesh.program?.depthTest === false) return;\n if (!mesh.geometry.bounds) computeBounds(mesh.geometry);\n const m = mesh.worldMatrix, { center: k, radius } = mesh.geometry.bounds;\n if (Math.hypot(m[0] * k[0] + m[4] * k[1] + m[8] * k[2] + m[12] - x, m[2] * k[0] + m[6] * k[1] + m[10] * k[2] + m[14] - z) >\n radius * Math.hypot(m[0], m[1], m[2]) + reach) return;\n const c = collider(mesh), ox = x - m[12] + c.origin[0], oy = y - m[13] + c.origin[1], oz = z - m[14] + c.origin[2];\n const seen = new Set();\n for (let ix = Math.floor(Math.min(ox, ox + dx * reach) / CELL); ix <= Math.floor(Math.max(ox, ox + dx * reach) / CELL); ix++)\n for (let iz = Math.floor(Math.min(oz, oz + dz * reach) / CELL); iz <= Math.floor(Math.max(oz, oz + dz * reach) / CELL); iz++)\n for (const t of c.cells.get(ix + ',' + iz) || []) {\n // Walls are one-way: walking out of a building (e.g. starting inside one) is allowed.\n if (seen.has(t) || dx * c.nrm[t * 2] + dz * c.nrm[t * 2 + 1] >= 0) continue;\n seen.add(t);\n for (const height of [0.4, 1.5]) {\n const d = horizontalRay(c.tri, t, ox, oy + height, oz, dx, dz);\n if (d >= 0 && d < best) { best = d; found = [c.nrm[t * 2], c.nrm[t * 2 + 1]]; }\n }\n }\n });\n }\n return found;\n}\n\nfunction installWalk(layer, { speed, distance, position }) {\n const L = globalThis.L, keys = new Set();\n // Map button (leaflet-bar look) toggling the walk; the key hint shows beside it while walking.\n const control = new L.Control({ position });\n const container = L.DomUtil.create('div', 'leaflet-bar leaflet-control');\n container.style.cssText = 'display:flex;align-items:center;background:#fff;';\n const button = L.DomUtil.create('button', '', container);\n button.type = 'button';\n button.title = 'Walk';\n button.setAttribute('aria-label', 'Walk');\n button.setAttribute('aria-pressed', 'false');\n button.textContent = '\uD83D\uDEB6';\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;';\n const hint = L.DomUtil.create('small', '', container);\n hint.style.cssText = 'display:none;padding:0 8px;color:#333;white-space:nowrap;';\n hint.textContent = 'W/S: run \u00B7 A/D: turn \u00B7 drag: look around \u00B7 Esc: exit';\n L.DomEvent.disableClickPropagation(container);\n control.onAdd = () => container;\n let meshes, frame, last, swing = 0, saved, drag;\n // Walker state: position, compass heading (radians, clockwise from north) and stride phase.\n const state = layer.walker = { latlng: null, heading: 0, phase: 0 };\n\n // Feet position in this layer's root space.\n const local = () => {\n const map = layer._map, crs = map.options.crs, origin = crs.project(layer.location), metres = Math.cos(layer.location.lat * Math.PI / 180);\n const p = crs.project(state.latlng), terrain = map._terrain3D?._terrainReady && map._terrain3D;\n const ground = (terrain && terrain._getElevation(state.latlng)) || 0;\n return [(p.x - origin.x) * metres, ground - layer.root.position[1], -(p.y - origin.y) * metres];\n };\n const place = () => {\n const [x, y, z] = local();\n // Model forward is -z; a yaw of -heading turns it to the compass heading (x east, -z north).\n const yaw = -state.heading, cos = Math.cos(yaw), sin = Math.sin(yaw);\n limbs.forEach(([, px, py, sign], i) => {\n const mesh = 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 * swing * Math.sin(state.phase);\n mesh.rotation[1] = yaw;\n });\n layer.update();\n };\n\n const step = now => {\n frame = requestAnimationFrame(step);\n const map = layer._map, dt = Math.min(0.1, (now - (last ?? now)) / 1000);\n last = now;\n if (!layer.renderer) return;\n let changed = false;\n if (!meshes) { meshes = limbs.map(([part]) => layer._createMesh(build(parts[part]))); changed = true; }\n let forward = 0, turn = 0;\n for (const key of keys) { forward += moves[key]?.[0] || 0; turn += moves[key]?.[1] || 0; }\n forward = Math.sign(forward); turn = Math.sign(turn);\n if (turn) { state.heading = wrap(state.heading + turn * 2.5 * dt); changed = true; }\n if (forward) {\n const metres = forward * speed * dt, { lat, lng } = state.latlng, { position, scale } = layer.root;\n let east = Math.sin(state.heading) * metres, north = Math.cos(state.heading) * metres;\n const feet = local().map((value, i) => position[i] + scale[i] * value);\n // World x is east, z south; keep 0.3 m from walls and slide along the one in the way.\n const blocked = () => {\n const length = Math.hypot(east, north);\n return length > 1e-6 && hit(layer, feet[0], feet[1], feet[2], east / length, -north / length, length + 0.3);\n };\n const wall = blocked();\n if (wall) {\n const into = east * wall[0] - north * wall[1];\n east -= into * wall[0]; north += into * wall[1];\n if (blocked()) east = north = 0;\n }\n state.latlng = new L.LatLng(lat + north / 111320, lng + east / (111320 * Math.cos(lat * Math.PI / 180)));\n 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(-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(state.latlng, map.getZoom(), { animate: false });\n }\n const target = forward ? 0.9 : 0;\n if (Math.abs(swing - target) > 1e-3) { swing += (target - swing) * Math.min(1, dt * 10); changed = true; }\n if (changed) place();\n };\n\n const onKey = event => {\n // Text fields and sliders keep their keys; buttons and checkboxes (e.g. the Walk button, focused once clicked) don't.\n if (event.target.closest?.('input:not([type=checkbox], [type=radio]), select, textarea, [contenteditable]') ||\n event.ctrlKey || event.altKey || event.metaKey) return;\n if (event.type === 'keydown' && event.code === 'Escape') { stop(); return; }\n if (!moves[event.code]) return;\n event.preventDefault();\n if (event.type === 'keydown') keys.add(event.code); else keys.delete(event.code);\n };\n const onBlur = () => keys.clear();\n // Dragging only turns the camera around the walker: horizontal = bearing, vertical = pitch.\n const onPointer = event => {\n const map = layer._map;\n if (event.type === 'pointerdown') {\n if (event.button !== 0 || event.target.closest('.leaflet-control')) return;\n drag = { x: event.clientX, y: event.clientY };\n map.getContainer().setPointerCapture(event.pointerId);\n } else if (drag && event.type === 'pointermove') {\n map._setPitchAndBearing(Math.max(20, Math.min(85, map.getPitch() - (event.clientY - drag.y) * 0.2)),\n map.getBearing() - (event.clientX - drag.x) * 0.25);\n drag = { x: event.clientX, y: event.clientY };\n } else drag = null;\n };\n const onTerrain = () => { if (meshes) place(); };\n\n const start = () => {\n const map = layer._map;\n if (saved || !map) return;\n 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 / distance;\n const zoom = Math.min(map.getMaxZoom(), Math.log2(pixelsPerMetre * 40075016.68557849 * Math.cos(state.latlng.lat * Math.PI / 180) / 256));\n saved = { zoom: map.getZoom(), pitch: map.getPitch(), scrollWheelZoom: map.options.scrollWheelZoom,\n handlers: ['dragging', 'keyboard', 'doubleClickZoom', 'boxZoom'].filter(name => map[name]?.enabled()) };\n for (const name of saved.handlers) map[name].disable();\n // Wheel zoom moves the camera closer or farther, keeping the walker centred.\n map.options.scrollWheelZoom = saved.scrollWheelZoom && 'center';\n state.heading = -map.getBearing() * Math.PI / 180;\n map.setView(state.latlng, zoom, { animate: false });\n map.setPitch(75);\n L.DomEvent.on(document, 'keydown keyup', onKey);\n L.DomEvent.on(window, 'blur', onBlur);\n L.DomEvent.on(map.getContainer(), 'pointerdown pointermove pointerup pointercancel', onPointer);\n map.on('terrainchange', onTerrain);\n button.setAttribute('aria-pressed', 'true');\n button.style.background = '#e4e4e4';\n hint.style.display = '';\n last = undefined;\n frame = requestAnimationFrame(step);\n };\n const stop = () => {\n const map = layer._map;\n cancelAnimationFrame(frame);\n keys.clear(); drag = null;\n L.DomEvent.off(document, 'keydown keyup', onKey);\n L.DomEvent.off(window, 'blur', onBlur);\n for (const mesh of meshes || []) layer._disposeMesh(mesh);\n meshes = null;\n button.setAttribute('aria-pressed', 'false');\n button.style.background = '#fff';\n hint.style.display = 'none';\n if (!map || !saved) return;\n L.DomEvent.off(map.getContainer(), 'pointerdown pointermove pointerup pointercancel', onPointer);\n map.off('terrainchange', onTerrain);\n map.options.scrollWheelZoom = saved.scrollWheelZoom;\n for (const name of saved.handlers) map[name].enable();\n map.setView(state.latlng, saved.zoom, { animate: false });\n map.setPitch(saved.pitch);\n saved = null;\n };\n L.DomEvent.on(button, 'click', () => (saved ? stop() : start()));\n let ready = false;\n layer.on('ready', () => { ready = true; if (layer._map) control.addTo(layer._map); });\n layer.on('add', () => { if (ready) control.addTo(layer._map); });\n layer.on('remove', () => { stop(); control.remove(); });\n}\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 `layer.walker` exposes `{ latlng, heading, phase }`.\n * Source options: `speed` (m/s, default 6), `distance` (camera distance in metres, default 20), `position` (button corner, default 'topleft').\n * Visible meshes of the other 3D layers (buildings, trees, models, streetlights) are solid; terrain and traffic are not.\n */\nL.Layer.types.walk = L.Layer.types['3d'].extend({\n initialize({ speed = 70, distance = 20, position = 'bottomright', ...options } = {}) {\n L.Layer.types['3d'].prototype.initialize.call(this, options);\n installWalk(this, { speed, distance, position });\n },\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["CELL", "collider", "horizontalRay", "parts", "limbs", "computeBounds", "traverse", "updateWorldMatrix", "build", "moves", "wrap", "angle", "hit", "layer", "x", "y", "z", "dx", "dz", "reach", "types", "skip", "other", "name", "best", "found", "mesh", "m", "k", "radius", "c", "ox", "oy", "oz", "seen", "ix", "iz", "t", "height", "d", "installWalk", "speed", "distance", "position", "L", "keys", "control", "container", "button", "hint", "meshes", "frame", "last", "swing", "saved", "drag", "state", "local", "map", "crs", "origin", "metres", "terrain", "ground", "place", "yaw", "cos", "sin", "px", "py", "sign", "i", "step", "now", "dt", "changed", "part", "forward", "turn", "key", "lat", "lng", "scale", "east", "north", "feet", "value", "blocked", "length", "wall", "into", "bearing", "behind", "target", "onKey", "event", "stop", "onBlur", "onPointer", "onTerrain", "start", "pixelsPerMetre", "zoom", "ready", "options"]
|
|
7
|
-
}
|
package/dist/utils/control.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
function c(e,r){const o=e._map,t=()=>{const l=[...o.getContainer().querySelectorAll(".leaflet-control-layers-selector")].find(n=>n.layerId===globalThis.L.Util.stamp(e));return l?.closest("label").after(r),!!l},a=()=>queueMicrotask(()=>o.hasLayer(e)&&t());return o.on("layeradd layerremove",a),e.once("remove",()=>{o.off("layeradd layerremove",a),r.remove()}),t()}export{c as underEntry};
|
|
2
|
-
//# sourceMappingURL=control.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/utils/control.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * Keeps `element` right under `layer`'s entry in the map's layers control while the layer is on the map.\n * Returns false when no layers control lists the layer.\n */\nexport function underEntry(layer, element) {\n const map = layer._map;\n const place = () => {\n const input = [...map.getContainer().querySelectorAll('.leaflet-control-layers-selector')]\n .find(input => input.layerId === globalThis.L.Util.stamp(layer));\n input?.closest('label').after(element);\n return Boolean(input);\n };\n // Leaflet rebuilds the list after 'layeradd'/'layerremove' (on the layer's own 'add'/'remove'): re-place afterwards.\n const replace = () => queueMicrotask(() => map.hasLayer(layer) && place());\n map.on('layeradd layerremove', replace);\n layer.once('remove', () => { map.off('layeradd layerremove', replace); element.remove(); });\n return place();\n}\n"],
|
|
5
|
-
"mappings": "AAIO,SAASA,EAAWC,EAAOC,EAAS,CACzC,MAAMC,EAAMF,EAAM,KACZG,EAAQ,IAAM,CAClB,MAAMC,EAAQ,CAAC,GAAGF,EAAI,aAAa,EAAE,iBAAiB,kCAAkC,CAAC,EACtF,KAAKE,GAASA,EAAM,UAAY,WAAW,EAAE,KAAK,MAAMJ,CAAK,CAAC,EACjE,OAAAI,GAAO,QAAQ,OAAO,EAAE,MAAMH,CAAO,EAC9B,EAAQG,CACjB,EAEMC,EAAU,IAAM,eAAe,IAAMH,EAAI,SAASF,CAAK,GAAKG,EAAM,CAAC,EACzE,OAAAD,EAAI,GAAG,uBAAwBG,CAAO,EACtCL,EAAM,KAAK,SAAU,IAAM,CAAEE,EAAI,IAAI,uBAAwBG,CAAO,EAAGJ,EAAQ,OAAO,CAAG,CAAC,EACnFE,EAAM,CACf",
|
|
6
|
-
"names": ["underEntry", "layer", "element", "map", "place", "input", "replace"]
|
|
7
|
-
}
|
package/dist/utils/geometry.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
function F(o){if(o&&typeof o=="object"&&"h"in o){const{h:y,s:i,l:r}=o,u=i*Math.min(r,1-r),m=s=>{const d=(s+y*12)%12;return r-u*Math.max(-1,Math.min(d-3,9-d,1))},b=s=>s<=.0031308?s*12.92:1.055*s**(1/2.4)-.055;return{r:b(m(0)),g:b(m(8)),b:b(m(4))}}if(o&&typeof o=="object"&&"r"in o)return o;if(typeof o=="number")return{r:(o>>16&255)/255,g:(o>>8&255)/255,b:(o&255)/255};if(typeof o!="string"||!CSS.supports("color",o))throw new Error("Invalid 3D color");const f=document.createElement("canvas").getContext("2d");f.fillStyle=o,f.fillRect(0,0,1,1);const[x,a,c]=f.getImageData(0,0,1,1).data;return{r:x/255,g:a/255,b:c/255}}function G(o,f,x,a){for(let c=f;c<x;c++)o.geometry.attributes.color.data.set([a.r,a.g,a.b],c*3);o.geometry.attributes.color.needsUpdate=!0}function j(o,f=[]){const x=[o,...f].flat();if(x.some(t=>!Number.isFinite(t.x)||!Number.isFinite(t.y)))throw new Error("Invalid polygon coordinates");const a=x.map((t,n)=>({x:t.x-o[0].x,y:t.y-o[0].y,index:n})),c=(t,n,e)=>(n.x-t.x)*(e.y-t.y)-(n.y-t.y)*(e.x-t.x),y=(t,n)=>t.x===n.x&&t.y===n.y,i=t=>{let n=!0;for(;n&&t.length>3;){n=!1;for(let e=0;e<t.length;e++){const l=t[(e+t.length-1)%t.length],h=t[e],g=t[(e+1)%t.length];if(y(l,h)||Math.abs(c(l,h,g))<1e-10){t.splice(e,1),n=!0;break}}}if(t.length<3)throw new Error("Degenerate polygon ring");return t};let r=0;const u=[o,...f].map((t,n)=>{const e=i(a.slice(r,r+=t.length));return D(e)!==!!n&&e.reverse(),e}),m=(t,n)=>{let e=!1;for(let l=0,h=n.length-1;l<n.length;h=l++){const g=n[l],w=n[h];g.y>t.y!=w.y>t.y&&t.x<(w.x-g.x)*(t.y-g.y)/(w.y-g.y)+g.x&&(e=!e)}return e},b=(t,n,e,l)=>{if(y(t,e)||y(t,l)||y(n,e)||y(n,l))return!1;const h=c(t,n,e),g=c(t,n,l),w=c(e,l,t),k=c(e,l,n),I=(C,B,P)=>Math.min(C.x,B.x)<=P.x&&P.x<=Math.max(C.x,B.x)&&Math.min(C.y,B.y)<=P.y&&P.y<=Math.max(C.y,B.y);return h*g<0&&w*k<0||h===0&&I(t,n,e)||g===0&&I(t,n,l)||w===0&&I(e,l,t)||k===0&&I(e,l,n)};let s=u[0].slice();for(const t of u.slice(1).sort((n,e)=>Math.min(...n.map(l=>l.x))-Math.min(...e.map(l=>l.x)))){let n,e=1/0;for(let g=0;g<t.length;g++)for(let w=0;w<s.length;w++){const k=t[g],I=s[w],C=(k.x-I.x)**2+(k.y-I.y)**2;if(C>=e)continue;const B={x:(k.x+I.x)/2,y:(k.y+I.y)/2};!m(B,u[0])||u.slice(1).some(P=>m(B,P))||[s,...u.slice(1)].some(P=>P.some((N,S)=>b(k,I,N,P[(S+1)%P.length])))||(n=[g,w],e=C)}if(!n)throw new Error("Unable to connect polygon hole");const[l,h]=n;s=[...s.slice(0,h+1),...t.slice(l),...t.slice(0,l+1),s[h],...s.slice(h+1)]}const d=[];for(;s.length>3;){let t=!1;for(let n=0;n<s.length;n++){const e=s[(n+s.length-1)%s.length],l=s[n],h=s[(n+1)%s.length];if(!(c(e,l,h)<=1e-10)&&!s.some(g=>!y(g,e)&&!y(g,l)&&!y(g,h)&&c(e,l,g)>=0&&c(l,h,g)>=0&&c(h,e,g)>=0)){d.push([e.index,l.index,h.index]),s.splice(n,1),t=!0;break}}if(!t)throw new Error("Unable to triangulate polygon: invalid or self-intersecting rings")}c(...s)>1e-10&&d.push(s.map(t=>t.index));const p=t=>Math.abs(t.reduce((n,e,l)=>{const h=t[(l+1)%t.length];return n+e.x*h.y-h.x*e.y},0))/2,M=p(u[0])-u.slice(1).reduce((t,n)=>t+p(n),0),E=d.reduce((t,n)=>t+c(...n.map(e=>a[e]))/2,0);if(M<=0||Math.abs(E-M)>Math.max(1e-7,M*1e-8))throw new Error("Polygon triangulation area mismatch");return d}function D(o){let f=0;for(let x=0;x<o.length;x++){const a=o[x],c=o[(x+1)%o.length];f+=a.x*c.y-c.x*a.y}return f<0}function A(o,f,x){const{top:a,bottom:c=0,trunkRadius:y,crownRadius:i,crownBottom:r,crownShape:u="round"}=f;if(![y,i,r].every(Number.isFinite)||y<=0||i<y||r<=c||r>=a||!["round","cone"].includes(u))throw new Error("Invalid tree dimensions or crown shape");const m=F(f.trunkColor??7491898),b=F(f.color??5210683),s=p=>Array.from({length:8},(M,E)=>({x:o.x+Math.cos(E*Math.PI/4)*p,y:o.y+Math.sin(E*Math.PI/4)*p,ground:o.ground})),d=(p,M,E,t,n)=>{const e=s(p),l=s(E);for(let h=0;h<8;h++){const g=(h+1)%8,w=(h+.5)*Math.PI/4,k=(p-E)/(t-M),I=Math.hypot(1,k),C=Math.cos(w)/I,B=k/I,P=-Math.sin(w)/I;p&&x(e[h],M,e[g],M,l[g],t,C,B,P,n),E&&x(e[h],M,l[g],t,l[h],t,C,B,P,n)}};if(d(y,c,y,r+(a-r)*.25,m),u==="cone"){const p=s(i);for(let M=0;M<8;M++)x(o,r,p[M],r,p[(M+1)%8],r,0,-1,0,b);d(i,r,0,a,b)}else{const p=[[0,0],[.35,.8],[.6,1],[.85,.7],[1,0]];for(let M=1;M<p.length;M++){const[E,t]=p[M-1],[n,e]=p[M];d(t*i,r+E*(a-r),e*i,r+n*(a-r),b)}}}function R(o,f,x){if(!Number.isFinite(f.lightRadius)||f.lightRadius<=0)throw new Error("Invalid light radius");const a=F(f.color),c=(r,u,m,b,s,d)=>{x(r,s,u,s,m,s,...d,a),x(r,s,m,s,b,s,...d,a)},y=.65,i=(r,u,m)=>({x:o.x+(m===2?0:r*y),y:o.y+(m===1?0:m===2?r*y:u*y),ground:o.ground+(m===0?0:u*y),uv:[r,u]});for(let r=0;r<3;r++)c(i(-1,-1,r),i(1,-1,r),i(1,1,r),i(-1,1,r),f.top,r===0?[0,1,0]:r===1?[0,0,1]:[1,0,0])}function U(o,f,x){const a=F(5264986),c=f.poleRadius;if(!Number.isFinite(c)||c<=0)throw new Error("Invalid lamp pole radius");const y=r=>Array.from({length:6},(u,m)=>({x:o.x+Math.cos(m*Math.PI/3)*r,y:o.y+Math.sin(m*Math.PI/3)*r,ground:o.ground,uv:[3,3]})),i={...o,uv:[3,3]};for(const[r,u,m]of[[c,0,f.top],[c*2.5,f.top-.25,f.top+.15]]){const b=y(r);for(let s=0;s<6;s++){const d=b[s],p=b[(s+1)%6],M=(s+.5)*Math.PI/3,E=Math.cos(M),t=-Math.sin(M);x(d,u,p,u,p,m,E,0,t,a),x(d,u,p,m,d,m,E,0,t,a),x(i,m,d,m,p,m,0,1,0,a),x(i,u,p,u,d,u,0,-1,0,a)}}}function z(o){const f=[1/0,1/0,1/0],x=[-1/0,-1/0,-1/0],a=o.attributes.position.data;for(let i=0;i<a.length;i++)f[i%3]=Math.min(f[i%3],a[i]),x[i%3]=Math.max(x[i%3],a[i]);const c=f.map((i,r)=>(i+x[r])/2);let y=0;for(let i=0;i<a.length;i+=3)y=Math.max(y,Math.hypot(a[i]-c[0],a[i+1]-c[1],a[i+2]-c[2]));o.bounds={min:f,max:x,center:c,radius:y}}export{z as computeBounds,D as isClockWise,U as lampPostGeometry,R as lightGeometry,F as parseColor,G as setVertexColor,A as treeGeometry,j as triangulate};
|
|
2
|
-
//# sourceMappingURL=geometry.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/utils/geometry.js"],
|
|
4
|
-
"sourcesContent": ["/**\r\n * HSL inputs are linear-space to preserve the original building styling.\r\n * Numeric/CSS/RGB inputs are already sRGB; CSS alpha is not used for extrusion.\r\n * @param {number|string|Object} value 0xRRGGBB, CSS color, {r,g,b}, or {h,s,l} in 0..1.\r\n * @returns {Object} sRGB {r,g,b} components in 0..1.\r\n */\r\nexport function parseColor(value) {\r\n if (value && typeof value === 'object' && 'h' in value) {\r\n const { h, s, l } = value;\r\n const a = s * Math.min(l, 1 - l);\r\n const channel = n => {\r\n const k = (n + h * 12) % 12;\r\n return l - a * Math.max(-1, Math.min(k - 3, 9 - k, 1));\r\n };\r\n const toSRGB = value => value <= 0.0031308 ? value * 12.92 : 1.055 * value ** (1 / 2.4) - 0.055;\r\n return { r: toSRGB(channel(0)), g: toSRGB(channel(8)), b: toSRGB(channel(4)) };\r\n }\r\n if (value && typeof value === 'object' && 'r' in value) return value;\r\n if (typeof value === 'number') return {\r\n r: (value >> 16 & 255) / 255, g: (value >> 8 & 255) / 255, b: (value & 255) / 255,\r\n };\r\n if (typeof value !== 'string' || !CSS.supports('color', value)) throw new Error('Invalid 3D color');\r\n const context = document.createElement('canvas').getContext('2d');\r\n context.fillStyle = value;\r\n context.fillRect(0, 0, 1, 1);\r\n const [r, g, b] = context.getImageData(0, 0, 1, 1).data;\r\n return { r: r / 255, g: g / 255, b: b / 255 };\r\n}\r\n\r\n/**\r\n * Paints the vertices `[start, end)` of a mesh and marks its color buffer dirty.\r\n * @param {Object} mesh Layer-created mesh with a color attribute.\r\n * @param {number} start Inclusive vertex index, not an offset into the RGB array.\r\n * @param {number} end Exclusive vertex index.\r\n * @param {Object} color sRGB {r,g,b}, typically from parseColor().\r\n */\r\nexport function setVertexColor(mesh, start, end, color) {\r\n for (let i = start; i < end; i++) {\r\n mesh.geometry.attributes.color.data.set([color.r, color.g, color.b], i * 3);\r\n }\r\n mesh.geometry.attributes.color.needsUpdate = true;\r\n}\r\n\r\n/**\r\n * Triangulates a polygon given as `{x, y}` points.\r\n * Rings omit the repeated closing point; winding is normalized internally.\r\n * Vertex indices remain relative to the original inputs after duplicate/collinear\r\n * cleanup. Hole bridges duplicate endpoints, not source vertices.\r\n * @param {Object[]} contour Outer boundary.\r\n * @param {Object[][]} [holes] Interior boundaries.\r\n *\r\n * @returns {number[][]} Triangles as indices in `[...contour, ...holes.flat()]`.\r\n */\r\nexport function triangulate(contour, holes = []) {\r\n const points = [contour, ...holes].flat();\r\n if (points.some(p => !Number.isFinite(p.x) || !Number.isFinite(p.y))) throw new Error('Invalid polygon coordinates');\r\n // Translate near the origin to avoid cancellation with geographic coordinates.\r\n const vertices = points.map((p, index) => ({ x: p.x - contour[0].x, y: p.y - contour[0].y, index }));\r\n const cross = (a, b, c) => (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);\r\n const equal = (a, b) => a.x === b.x && a.y === b.y;\r\n // Remove zero-area corners before connecting holes; keep original vertex indices.\r\n const clean = ring => {\r\n let changed = true;\r\n while (changed && ring.length > 3) {\r\n changed = false;\r\n for (let i = 0; i < ring.length; i++) {\r\n const a = ring[(i + ring.length - 1) % ring.length], b = ring[i], c = ring[(i + 1) % ring.length];\r\n if (equal(a, b) || Math.abs(cross(a, b, c)) < 1e-10) {\r\n ring.splice(i, 1); changed = true; break;\r\n }\r\n }\r\n }\r\n if (ring.length < 3) throw new Error('Degenerate polygon ring');\r\n return ring;\r\n };\r\n let offset = 0;\r\n const rings = [contour, ...holes].map((path, index) => {\r\n const ring = clean(vertices.slice(offset, offset += path.length));\r\n if (isClockWise(ring) !== Boolean(index)) ring.reverse();\r\n return ring;\r\n });\r\n const inside = (point, ring) => {\r\n let result = false;\r\n for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {\r\n const a = ring[i], b = ring[j];\r\n if ((a.y > point.y) !== (b.y > point.y) &&\r\n point.x < (b.x - a.x) * (point.y - a.y) / (b.y - a.y) + a.x) result = !result;\r\n }\r\n return result;\r\n };\r\n const 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 const on = (p, q, r) => 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 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 let polygon = rings[0].slice();\r\n // A bridge must stay inside the outer boundary, outside every hole, and cross no edge.\r\n // ponytail: quadratic ear clipping for building footprints; use spatial indexing for large rings.\r\n for (const hole of rings.slice(1).sort((a, b) => Math.min(...a.map(p => p.x)) - Math.min(...b.map(p => p.x)))) {\r\n let bridge, distance = Infinity;\r\n for (let h = 0; h < hole.length; h++) for (let p = 0; p < polygon.length; p++) {\r\n const a = hole[h], b = polygon[p], d = (a.x - b.x) ** 2 + (a.y - b.y) ** 2;\r\n if (d >= distance) continue;\r\n const mid = { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\r\n if (!inside(mid, rings[0]) || rings.slice(1).some(r => inside(mid, r))) continue;\r\n if ([polygon, ...rings.slice(1)].some(r => r.some((c, i) => intersects(a, b, c, r[(i + 1) % r.length])))) continue;\r\n bridge = [h, p]; distance = d;\r\n }\r\n if (!bridge) throw new Error('Unable to connect polygon hole');\r\n const [h, p] = bridge;\r\n polygon = [...polygon.slice(0, p + 1), ...hole.slice(h), ...hole.slice(0, h + 1),\r\n polygon[p], ...polygon.slice(p + 1)];\r\n }\r\n // Clip a convex corner only when no other vertex is inside/on its triangle.\r\n const result = [];\r\n while (polygon.length > 3) {\r\n let clipped = false;\r\n for (let i = 0; i < polygon.length; i++) {\r\n const a = polygon[(i + polygon.length - 1) % polygon.length], b = polygon[i], c = polygon[(i + 1) % polygon.length];\r\n if (cross(a, b, c) <= 1e-10) continue;\r\n if (polygon.some(p => !equal(p, a) && !equal(p, b) && !equal(p, c) &&\r\n cross(a, b, p) >= 0 && cross(b, c, p) >= 0 && cross(c, a, p) >= 0)) continue;\r\n result.push([a.index, b.index, c.index]); polygon.splice(i, 1); clipped = true; break;\r\n }\r\n if (!clipped) throw new Error('Unable to triangulate polygon: invalid or self-intersecting rings');\r\n }\r\n if (cross(...polygon) > 1e-10) result.push(polygon.map(p => p.index));\r\n const area = ring => Math.abs(ring.reduce((sum, p, i) => {\r\n const q = ring[(i + 1) % ring.length]; return sum + p.x * q.y - q.x * p.y;\r\n }, 0)) / 2;\r\n // Reject incomplete coverage instead of silently emitting a partial roof.\r\n const expected = area(rings[0]) - rings.slice(1).reduce((sum, ring) => sum + area(ring), 0);\r\n const actual = result.reduce((sum, triangle) => sum + cross(...triangle.map(i => vertices[i])) / 2, 0);\r\n if (expected <= 0 || Math.abs(actual - expected) > Math.max(1e-7, expected * 1e-8)) throw new Error('Polygon triangulation area mismatch');\r\n return result;\r\n}\r\n\r\n/**\r\n * @returns {boolean} Whether the `{x, y}` points are in clockwise order.\r\n */\r\nexport function isClockWise(points) {\r\n let area = 0;\r\n for (let i = 0; i < points.length; i++) {\r\n const a = points[i], b = points[(i + 1) % points.length];\r\n area += a.x * b.y - b.x * a.y;\r\n }\r\n return area < 0;\r\n}\r\n\r\n/** Low-poly tree, sharing the source block's buffers, picking and terrain offset. */\r\nexport function treeGeometry(point, style, addTriangle) {\r\n const { top, bottom = 0, trunkRadius, crownRadius, crownBottom, crownShape = 'round' } = style;\r\n if (![trunkRadius, crownRadius, crownBottom].every(Number.isFinite) ||\r\n trunkRadius <= 0 || crownRadius < trunkRadius || crownBottom <= bottom || crownBottom >= top ||\r\n !['round', 'cone'].includes(crownShape)) {\r\n throw new Error('Invalid tree dimensions or crown shape');\r\n }\r\n const trunk = parseColor(style.trunkColor ?? 0x72513a);\r\n const crown = parseColor(style.color ?? 0x4f823b);\r\n const ring = radius => Array.from({ length: 8 }, (_, i) => ({\r\n x: point.x + Math.cos(i * Math.PI / 4) * radius,\r\n y: point.y + Math.sin(i * Math.PI / 4) * radius,\r\n ground: point.ground,\r\n }));\r\n const surface = (lowRadius, low, highRadius, high, color) => {\r\n const lower = ring(lowRadius), upper = ring(highRadius);\r\n for (let i = 0; i < 8; i++) {\r\n const next = (i + 1) % 8;\r\n const angle = (i + 0.5) * Math.PI / 4;\r\n const slope = (lowRadius - highRadius) / (high - low);\r\n const length = Math.hypot(1, slope);\r\n const nx = Math.cos(angle) / length, ny = slope / length, nz = -Math.sin(angle) / length;\r\n if (lowRadius) addTriangle(lower[i], low, lower[next], low, upper[next], high, nx, ny, nz, color);\r\n if (highRadius) addTriangle(lower[i], low, upper[next], high, upper[i], high, nx, ny, nz, color);\r\n }\r\n };\r\n surface(trunkRadius, bottom, trunkRadius, crownBottom + (top - crownBottom) * 0.25, trunk);\r\n if (crownShape === 'cone') {\r\n const base = ring(crownRadius);\r\n for (let i = 0; i < 8; i++) addTriangle(point, crownBottom, base[i], crownBottom,\r\n base[(i + 1) % 8], crownBottom, 0, -1, 0, crown);\r\n surface(crownRadius, crownBottom, 0, top, crown);\r\n } else {\r\n const profile = [[0, 0], [0.35, 0.8], [0.6, 1], [0.85, 0.7], [1, 0]];\r\n for (let i = 1; i < profile.length; i++) {\r\n const [low, lr] = profile[i - 1], [high, hr] = profile[i];\r\n surface(lr * crownRadius, crownBottom + low * (top - crownBottom),\r\n hr * crownRadius, crownBottom + high * (top - crownBottom), crown);\r\n }\r\n }\r\n}\r\n\r\n/** Three crossed emitter discs; illumination itself is evaluated on receiving surfaces. */\r\nexport function lightGeometry(point, style, addTriangle) {\r\n if (!Number.isFinite(style.lightRadius) || style.lightRadius <= 0) throw new Error('Invalid light radius');\r\n const color = parseColor(style.color);\r\n const quad = (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 const r = 0.65;\r\n const emitter = (u, v, axis) => ({\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 for (let axis = 0; axis < 3; axis++) {\r\n quad(emitter(-1, -1, axis), emitter(1, -1, axis), emitter(1, 1, axis), emitter(-1, 1, axis),\r\n style.top, axis === 0 ? [0, 1, 0] : axis === 1 ? [0, 0, 1] : [1, 0, 0]);\r\n }\r\n}\r\n\r\n/** Schematic support and lamp head; wall-mounted fixtures do not get an invented pole. */\r\nexport function lampPostGeometry(point, style, addTriangle) {\r\n const color = parseColor(0x50565a), radius = style.poleRadius;\r\n if (!Number.isFinite(radius) || radius <= 0) throw new Error('Invalid lamp pole radius');\r\n const ring = r => Array.from({ length: 6 }, (_, i) => ({\r\n x: point.x + Math.cos(i * Math.PI / 3) * r,\r\n y: point.y + Math.sin(i * Math.PI / 3) * r, ground: point.ground, uv: [3, 3],\r\n }));\r\n const center = { ...point, uv: [3, 3] };\r\n for (const [r, low, high] of [[radius, 0, style.top], [radius * 2.5, style.top - 0.25, style.top + 0.15]]) {\r\n const points = ring(r);\r\n for (let i = 0; i < 6; i++) {\r\n const a = points[i], b = points[(i + 1) % 6], angle = (i + 0.5) * Math.PI / 3;\r\n const nx = Math.cos(angle), nz = -Math.sin(angle);\r\n addTriangle(a, low, b, low, b, high, nx, 0, nz, color);\r\n addTriangle(a, low, b, high, a, high, nx, 0, nz, color);\r\n addTriangle(center, high, a, high, b, high, 0, 1, 0, color);\r\n addTriangle(center, low, b, low, a, low, 0, -1, 0, color);\r\n }\r\n }\r\n}\r\n\r\n/** Cache local AABB and center for ray picking and transparent mesh sorting. */\r\nexport function computeBounds(geometry) {\r\n const min = [Infinity, Infinity, Infinity],\r\n max = [-Infinity, -Infinity, -Infinity],\r\n data = geometry.attributes.position.data;\r\n for (let i = 0; i < data.length; i++) {\r\n min[i % 3] = Math.min(min[i % 3], data[i]);\r\n max[i % 3] = Math.max(max[i % 3], data[i]);\r\n }\r\n const center = min.map((v, i) => (v + max[i]) / 2);\r\n let radius = 0;\r\n for (let i = 0; i < data.length; i += 3) {\r\n radius = Math.max(radius, Math.hypot(\r\n data[i] - center[0], data[i + 1] - center[1], data[i + 2] - center[2]\r\n ));\r\n }\r\n geometry.bounds = { min, max, center, radius };\r\n}\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["parseColor", "value", "h", "s", "l", "a", "channel", "n", "k", "toSRGB", "context", "r", "g", "b", "setVertexColor", "mesh", "start", "end", "color", "i", "triangulate", "contour", "holes", "points", "p", "vertices", "index", "cross", "c", "equal", "clean", "ring", "changed", "offset", "rings", "path", "isClockWise", "inside", "point", "result", "j", "intersects", "d", "abC", "abD", "cdA", "cdB", "on", "q", "polygon", "hole", "bridge", "distance", "mid", "clipped", "area", "sum", "expected", "actual", "triangle", "treeGeometry", "style", "addTriangle", "top", "bottom", "trunkRadius", "crownRadius", "crownBottom", "crownShape", "trunk", "crown", "radius", "_", "surface", "lowRadius", "low", "highRadius", "high", "lower", "upper", "next", "angle", "slope", "length", "nx", "ny", "nz", "base", "profile", "lr", "hr", "lightGeometry", "quad", "height", "normal", "emitter", "u", "v", "axis", "lampPostGeometry", "center", "computeBounds", "geometry", "min", "max", "data"]
|
|
7
|
-
}
|
package/dist/utils/lighting.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
function G(h,o){const u=h.reduce((r,l)=>r+l.length/8,0),e=32;let i=new Float32Array(8);if(u){let r=1/0,l=1/0,g=-1/0,w=-1/0;for(const t of h)for(let n=0;n<t.length;n+=8)r=Math.min(r,t[n]-t[n+3]),g=Math.max(g,t[n]+t[n+3]),l=Math.min(l,t[n+2]-t[n+3]),w=Math.max(w,t[n+2]+t[n+3]);const s=Math.ceil((g-r)/e)+1,a=Math.ceil((w-l)/e)+1,I=t=>{for(const n of h)for(let c=0;c<n.length;c+=8){const f=n[c+3],y=n[c]-r,U=n[c+2]-l;for(let x=Math.floor((U-f)/e);x<=Math.floor((U+f)/e);x++)for(let A=Math.floor((y-f)/e);A<=Math.floor((y+f)/e);A++)t(x*s+A,n,c)}},M=new Uint32Array(s*a),d=new Uint32Array(s*a);I(t=>M[t]++);const E=M.reduce((t,n)=>t+n,0),v=(2+s*a+E*2)*4;if(v*4>o)throw new Error("Streetlight grid exceeds GPU storage limit");i=new Float32Array(v),i.set([r,l,e,s,a,u,0,0]);let F=2+s*a;for(let t=0;t<M.length;t++)M[t]&&(i[(2+t)*4]=d[t]=F,i[(2+t)*4+1]=M[t],F+=M[t]*2);I((t,n,c)=>{for(let f=0,y=d[t]*4;f<8;f++)i[y+f]=n[c+f];d[t]+=2})}return{data:i,count:u}}function P(h,o){const u=new Float32Array(h.length*8);return h.forEach(({position:[e,i,r],radius:l,color:g,flux:w},s)=>{const a=o[3]*e+o[7]*i+o[11]*r+o[15];u.set([(o[0]*e+o[4]*i+o[8]*r+o[12])/a,(o[1]*e+o[5]*i+o[9]*r+o[13])/a,(o[2]*e+o[6]*i+o[10]*r+o[14])/a,l,...g,w/(4*Math.PI)*.03],s*8)}),u}export{G as lightGrid,P as worldLights};
|
|
2
|
-
//# sourceMappingURL=lighting.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/utils/lighting.js"],
|
|
4
|
-
"sourcesContent": ["/** Pack world-space point lights into the shader's spatial grid. */\r\nexport function lightGrid(packed, maxBytes) {\r\n const count = packed.reduce((sum, values) => sum + values.length / 8, 0), cellSize = 32;\r\n let data = new Float32Array(8);\r\n if (count) {\r\n let minX = Infinity, minZ = Infinity, maxX = -Infinity, maxZ = -Infinity;\r\n for (const values of packed) for (let i = 0; i < values.length; i += 8) {\r\n minX = Math.min(minX, values[i] - values[i + 3]); maxX = Math.max(maxX, values[i] + values[i + 3]);\r\n minZ = Math.min(minZ, values[i + 2] - values[i + 3]); maxZ = Math.max(maxZ, values[i + 2] + values[i + 3]);\r\n }\r\n const columns = Math.ceil((maxX - minX) / cellSize) + 1, rows = Math.ceil((maxZ - minZ) / cellSize) + 1;\r\n const each = callback => {\r\n for (const values of packed) for (let i = 0; i < values.length; i += 8) {\r\n const radius = values[i + 3], x = values[i] - minX, z = values[i + 2] - minZ;\r\n for (let y = Math.floor((z - radius) / cellSize); y <= Math.floor((z + radius) / cellSize); y++) {\r\n for (let c = Math.floor((x - radius) / cellSize); c <= Math.floor((x + radius) / cellSize); c++) callback(y * columns + c, values, i);\r\n }\r\n }\r\n };\r\n // Counting sort: count the lights of each cell, then fill each cell's slice.\r\n const counts = new Uint32Array(columns * rows), next = new Uint32Array(columns * rows);\r\n each(key => counts[key]++);\r\n const entries = counts.reduce((sum, value) => sum + value, 0);\r\n const length = (2 + columns * rows + entries * 2) * 4;\r\n if (length * 4 > maxBytes) throw new Error('Streetlight grid exceeds GPU storage limit');\r\n data = new Float32Array(length);\r\n data.set([minX, minZ, cellSize, columns, rows, count, 0, 0]);\r\n let offset = 2 + columns * rows;\r\n for (let key = 0; key < counts.length; key++) if (counts[key]) {\r\n data[(2 + key) * 4] = next[key] = offset;\r\n data[(2 + key) * 4 + 1] = counts[key];\r\n offset += counts[key] * 2;\r\n }\r\n each((key, values, i) => {\r\n for (let j = 0, o = next[key] * 4; j < 8; j++) data[o + j] = values[i + j];\r\n next[key] += 2;\r\n });\r\n }\r\n return { data, count };\r\n}\r\n\r\n/** World-space [x, y, z, radius, r, g, b, intensity] for one mesh's point lights. */\r\nexport function worldLights(lights, m) {\r\n const values = new Float32Array(lights.length * 8);\r\n lights.forEach(({ position: [x, y, z], radius, color, flux }, i) => {\r\n const w = m[3] * x + m[7] * y + m[11] * z + m[15];\r\n values.set([(m[0] * x + m[4] * y + m[8] * z + m[12]) / w, (m[1] * x + m[5] * y + m[9] * z + m[13]) / w,\r\n (m[2] * x + m[6] * y + m[10] * z + m[14]) / w, radius, ...color, flux / (4 * Math.PI) * 0.03], i * 8);\r\n });\r\n return values;\r\n}\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["lightGrid", "packed", "maxBytes", "count", "sum", "values", "cellSize", "data", "minX", "minZ", "maxX", "maxZ", "i", "columns", "rows", "each", "callback", "radius", "x", "z", "y", "c", "counts", "next", "key", "entries", "value", "length", "offset", "j", "o", "worldLights", "lights", "m", "color", "flux", "w"]
|
|
7
|
-
}
|
package/dist/utils/model.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const h={5120:Int8Array,5121:Uint8Array,5122:Int16Array,5123:Uint16Array,5125:Uint32Array,5126:Float32Array},m={SCALAR:1,VEC2:2,VEC3:3,VEC4:4};function x(t){const s=new DataView(t),r=new TextDecoder;let e;if(s.getUint32(0,!0)===1179937895){if(s.getUint32(4,!0)!==2||s.getUint32(8,!0)!==t.byteLength)throw new Error("Invalid GLB header");let i;for(let n=12;n<t.byteLength;){if(n+8>t.byteLength)throw new Error("Truncated GLB chunk");const c=s.getUint32(n,!0),a=s.getUint32(n+4,!0);if(n+=8,n+c>t.byteLength)throw new Error("Truncated GLB data");const o=t.slice(n,n+c);a===1313821514&&(e=JSON.parse(r.decode(o))),a===5130562&&(i=o),n+=c}if(!e)throw new Error("Missing GLB JSON");i&&(e.buffers[0].binary=i)}else e=JSON.parse(r.decode(t));if(e.skins?.length||e.animations?.length||e.extensionsRequired?.length||e.meshes?.some(i=>i.primitives.some(n=>n.targets||n.mode!==void 0&&n.mode!==4)))throw new Error("Layer3D supports static triangle glTF models without required extensions");return e}function T(t,s){const r=t.accessors[s],e=h[r.componentType],i=m[r.type];if(!e||!i||!Number.isInteger(r.count)||r.count<0)throw new Error("Invalid glTF accessor");const n=new e(r.count*i),c=(o,l,f,u,b)=>{const y=t.bufferViews[o],g=e.BYTES_PER_ELEMENT,d=t.buffers[y.buffer].binary;if(u||=i*g,!d||u<i*g||l<0||(y.byteOffset||0)+y.byteLength>d.byteLength||(f-1)*u+i*g+l>y.byteLength)throw new Error("glTF accessor outside buffer view");for(let w=0;w<f;w++){const E=new e(d.slice((y.byteOffset||0)+l+w*u,(y.byteOffset||0)+l+w*u+i*g));n.set(E,b(w)*i)}};if(r.bufferView!==void 0&&c(r.bufferView,r.byteOffset||0,r.count,t.bufferViews[r.bufferView].byteStride,o=>o),r.sparse){const o=r.sparse,l=h[o.indices.componentType];if(![Uint8Array,Uint16Array,Uint32Array].includes(l))throw new Error("Invalid sparse glTF indices");const f=t.bufferViews[o.indices.bufferView],u=(f.byteOffset||0)+(o.indices.byteOffset||0);if(o.count>r.count||(o.indices.byteOffset||0)+o.count*l.BYTES_PER_ELEMENT>f.byteLength)throw new Error("Invalid sparse glTF indices");const b=new l(t.buffers[f.buffer].binary.slice(u,u+o.count*l.BYTES_PER_ELEMENT));c(o.values.bufferView,o.values.byteOffset||0,o.count,0,y=>{if(b[y]>=r.count)throw new Error("Invalid sparse glTF index");return b[y]})}if(r.componentType===5126)return{data:n,size:i};const a=new Float32Array(n.length);for(let o=0;o<n.length;o++)a[o]=r.normalized?Math.max(-1,n[o]/(e===Int8Array?127:e===Int16Array?32767:e===Uint8Array?255:e===Uint32Array?4294967295:65535)):n[o];return{data:a,size:i,indices:n}}function p(t){if(t.matrix)return Array.from(t.matrix);const[s,r,e,i]=t.rotation||[0,0,0,1],[n,c,a]=t.scale||[1,1,1];return[(1-2*(r*r+e*e))*n,2*(s*r+e*i)*n,2*(s*e-r*i)*n,0,2*(s*r-e*i)*c,(1-2*(s*s+e*e))*c,2*(r*e+s*i)*c,0,2*(s*e+r*i)*a,2*(r*e-s*i)*a,(1-2*(s*s+r*r))*a,0,...t.translation||[0,0,0],1]}function A(t,s){const r=new Float32Array(t.length);for(let e=0;e<(s?.length||t.length/3);e+=3){const i=s?s[e]:e,n=s?s[e+1]:e+1,c=s?s[e+2]:e+2,a=[0,1,2].map(f=>t[n*3+f]-t[i*3+f]),o=[0,1,2].map(f=>t[c*3+f]-t[i*3+f]),l=[a[1]*o[2]-a[2]*o[1],a[2]*o[0]-a[0]*o[2],a[0]*o[1]-a[1]*o[0]];for(const f of[i,n,c])for(let u=0;u<3;u++)r[f*3+u]+=l[u]}for(let e=0;e<r.length;e+=3){const i=Math.hypot(...r.subarray(e,e+3))||1;for(let n=0;n<3;n++)r[e+n]/=i}return r}function L(t){return{addressModeU:t.wrapS===33071?"clamp-to-edge":t.wrapS===33648?"mirror-repeat":"repeat",addressModeV:t.wrapT===33071?"clamp-to-edge":t.wrapT===33648?"mirror-repeat":"repeat",magFilter:t.magFilter===9728?"nearest":"linear",minFilter:t.minFilter===9728||t.minFilter===9984||t.minFilter===9986?"nearest":"linear"}}export{x as decodeModel,p as nodeMatrix,T as readAccessor,L as textureSampler,A as vertexNormals};
|
|
2
|
-
//# sourceMappingURL=model.js.map
|
package/dist/utils/model.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/utils/model.js"],
|
|
4
|
-
"sourcesContent": ["const types = {\r\n 5120: Int8Array,\r\n 5121: Uint8Array,\r\n 5122: Int16Array,\r\n 5123: Uint16Array,\r\n 5125: Uint32Array,\r\n 5126: Float32Array,\r\n};\r\nconst sizes = { SCALAR: 1, VEC2: 2, VEC3: 3, VEC4: 4 };\r\n\r\n/** Decode a static glTF JSON document or GLB v2 container. */\r\nexport function decodeModel(data) {\r\n const view = new DataView(data),\r\n decoder = new TextDecoder();\r\n let description;\r\n if (view.getUint32(0, true) === 0x46546c67) {\r\n // Decode GLB v2 chunks; unknown types are skipped.\r\n if (view.getUint32(4, true) !== 2 || view.getUint32(8, true) !== data.byteLength) {\r\n throw new Error('Invalid GLB header');\r\n }\r\n let binary;\r\n for (let offset = 12; offset < data.byteLength;) {\r\n if (offset + 8 > data.byteLength) {\r\n throw new Error('Truncated GLB chunk');\r\n }\r\n const length = view.getUint32(offset, true), type = view.getUint32(offset + 4, true);\r\n offset += 8;\r\n if (offset + length > data.byteLength) {\r\n throw new Error('Truncated GLB data');\r\n }\r\n const chunk = data.slice(offset, offset + length);\r\n if (type === 0x4e4f534a) {\r\n description = JSON.parse(decoder.decode(chunk));\r\n }\r\n if (type === 0x004e4942) {\r\n binary = chunk;\r\n }\r\n offset += length;\r\n }\r\n if (!description) {\r\n throw new Error('Missing GLB JSON');\r\n }\r\n if (binary) {\r\n description.buffers[0].binary = binary;\r\n }\r\n } else {\r\n description = JSON.parse(decoder.decode(data));\r\n }\r\n if (description.skins?.length || description.animations?.length || description.extensionsRequired?.length || description.meshes?.some(mesh => mesh.primitives.some(primitive => primitive.targets || (primitive.mode !== undefined && primitive.mode !== 4)))) {\r\n throw new Error('Layer3D supports static triangle glTF models without required extensions');\r\n }\r\n return description;\r\n}\r\n\r\n/** Decode packed, interleaved, normalized or sparse glTF accessor data. */\r\nexport function readAccessor(description, index) {\r\n const spec = description.accessors[index],\r\n Type = types[spec.componentType],\r\n size = sizes[spec.type];\r\n if (!Type || !size || !Number.isInteger(spec.count) || spec.count < 0) {\r\n throw new Error('Invalid glTF accessor');\r\n }\r\n const data = new Type(spec.count * size);\r\n // The destination callback is sequential for base data and sparse-indexed for overrides.\r\n const read = (viewIndex, offset, count, stride, output) => {\r\n const view = description.bufferViews[viewIndex], bytes = Type.BYTES_PER_ELEMENT;\r\n const buffer = description.buffers[view.buffer].binary;\r\n stride ||= size * bytes;\r\n if (!buffer || stride < size * bytes || offset < 0 ||\r\n (view.byteOffset || 0) + view.byteLength > buffer.byteLength ||\r\n (count - 1) * stride + size * bytes + offset > view.byteLength) throw new Error('glTF accessor outside buffer view');\r\n for (let i = 0; i < count; i++) {\r\n const values = new Type(buffer.slice((view.byteOffset || 0) + offset + i * stride,\r\n (view.byteOffset || 0) + offset + i * stride + size * bytes));\r\n data.set(values, output(i) * size);\r\n }\r\n };\r\n if (spec.bufferView !== undefined) {\r\n read(\r\n spec.bufferView,\r\n spec.byteOffset || 0,\r\n spec.count,\r\n description.bufferViews[spec.bufferView].byteStride,\r\n i => i\r\n );\r\n }\r\n if (spec.sparse) {\r\n const sparse = spec.sparse, Index = types[sparse.indices.componentType];\r\n if (![Uint8Array, Uint16Array, Uint32Array].includes(Index)) {\r\n throw new Error('Invalid sparse glTF indices');\r\n }\r\n const view = description.bufferViews[sparse.indices.bufferView];\r\n const offset = (view.byteOffset || 0) + (sparse.indices.byteOffset || 0);\r\n if (sparse.count > spec.count || (sparse.indices.byteOffset || 0) + sparse.count * Index.BYTES_PER_ELEMENT > view.byteLength) {\r\n throw new Error('Invalid sparse glTF indices');\r\n }\r\n const indices = new Index(description.buffers[view.buffer].binary.slice(offset, offset + sparse.count * Index.BYTES_PER_ELEMENT));\r\n read(\r\n sparse.values.bufferView,\r\n sparse.values.byteOffset || 0,\r\n sparse.count,\r\n 0,\r\n i => {\r\n if (indices[i] >= spec.count) throw new Error('Invalid sparse glTF index');\r\n return indices[i];\r\n }\r\n );\r\n }\r\n if (spec.componentType === 5126) {\r\n return { data, size };\r\n }\r\n const normalized = new Float32Array(data.length);\r\n // Normalization is a glTF accessor rule, not sRGB conversion; indices stay integers.\r\n for (let i = 0; i < data.length; i++) {\r\n normalized[i] = spec.normalized\r\n ? Math.max(-1, data[i] / (Type === Int8Array ? 127 : Type === Int16Array ? 32767 : Type === Uint8Array ? 255 : Type === Uint32Array ? 4294967295 : 65535))\r\n : data[i];\r\n }\r\n return { data: normalized, size, indices: data };\r\n}\r\n\r\n/** glTF quaternion/translation/scale to a column-major matrix. */\r\nexport function nodeMatrix(spec) {\r\n if (spec.matrix) return Array.from(spec.matrix);\r\n // glTF stores quaternions [x,y,z,w]; convert directly to a scaled column-major matrix.\r\n const [x, y, z, w] = spec.rotation || [0, 0, 0, 1],\r\n [sx, sy, sz] = spec.scale || [1, 1, 1];\r\n return [\r\n (1 - 2 * (y * y + z * z)) * sx,\r\n 2 * (x * y + z * w) * sx,\r\n 2 * (x * z - y * w) * sx,\r\n 0,\r\n 2 * (x * y - z * w) * sy,\r\n (1 - 2 * (x * x + z * z)) * sy,\r\n 2 * (y * z + x * w) * sy, 0,\r\n 2 * (x * z + y * w) * sz,\r\n 2 * (y * z - x * w) * sz,\r\n (1 - 2 * (x * x + y * y)) * sz,\r\n 0,\r\n ...(spec.translation || [0, 0, 0]),\r\n 1,\r\n ];\r\n}\r\n\r\n/** Area-weighted vertex normals, for indexed or non-indexed triangles. */\r\nexport function vertexNormals(p, indices) {\r\n // Accumulate area-weighted face normals for shared vertices, then normalize.\r\n const normals = new Float32Array(p.length);\r\n for (let i = 0; i < (indices?.length || p.length / 3); i += 3) {\r\n const a = indices ? indices[i] : i,\r\n b = indices ? indices[i + 1] : i + 1,\r\n c = indices ? indices[i + 2] : i + 2;\r\n const u = [0, 1, 2].map(j => p[b * 3 + j] - p[a * 3 + j]), v = [0, 1, 2].map(j => p[c * 3 + j] - p[a * 3 + j]);\r\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]];\r\n for (const index of [a, b, c]) {\r\n for (let j = 0; j < 3; j++) {\r\n normals[index * 3 + j] += n[j];\r\n }\r\n }\r\n }\r\n for (let i = 0; i < normals.length; i += 3) {\r\n const length = Math.hypot(...normals.subarray(i, i + 3)) || 1;\r\n for (let j = 0; j < 3; j++) {\r\n normals[i + j] /= length;\r\n }\r\n }\r\n return normals;\r\n}\r\n\r\n/** Translate glTF sampler constants into WebGPU sampler options. */\r\nexport function textureSampler(sampler) {\r\n return {\r\n addressModeU: sampler.wrapS === 33071 ? 'clamp-to-edge' : sampler.wrapS === 33648 ? 'mirror-repeat' : 'repeat',\r\n addressModeV: sampler.wrapT === 33071 ? 'clamp-to-edge' : sampler.wrapT === 33648 ? 'mirror-repeat' : 'repeat',\r\n magFilter: sampler.magFilter === 9728 ? 'nearest' : 'linear',\r\n minFilter: sampler.minFilter === 9728 || sampler.minFilter === 9984 || sampler.minFilter === 9986 ? 'nearest' : 'linear',\r\n };\r\n}\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["types", "sizes", "decodeModel", "data", "view", "decoder", "description", "binary", "offset", "length", "type", "chunk", "mesh", "primitive", "readAccessor", "index", "spec", "Type", "size", "read", "viewIndex", "count", "stride", "output", "bytes", "buffer", "i", "values", "sparse", "Index", "indices", "normalized", "nodeMatrix", "x", "y", "z", "w", "sx", "sy", "sz", "vertexNormals", "p", "normals", "a", "b", "u", "j", "v", "n", "textureSampler", "sampler"]
|
|
7
|
-
}
|
package/dist/utils/picking.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{computeBounds as J}from"./geometry.js";function Q(x,G,H=0){const k=[],d=[0,0,0],y=[0,0,0],p=[0,0,0],O=(n,i)=>n.map((v,s)=>v-i[s]),q=(n,i)=>[n[1]*i[2]-n[2]*i[1],n[2]*i[0]-n[0]*i[2],n[0]*i[1]-n[1]*i[0]],b=(n,i)=>n.reduce((v,s,r)=>v+s*i[r],0);for(const n of G){const i=new DOMMatrix(n.worldMatrix).inverse();if(![...i.toFloat64Array()].every(Number.isFinite))throw new Error("Singular 3D transform");const s=new DOMPoint(...x.origin,1).matrixTransform(i),r=[s.x/s.w,s.y/s.w,s.z/s.w],I=new DOMPoint(...x.direction,0).matrixTransform(i),e=[I.x,I.y,I.z],P=Math.hypot(...e)||1;e[0]/=P,e[1]/=P,e[2]/=P,n.geometry.bounds||J(n.geometry);let F=0,D=1/0;for(let t=0;t<3;t++)if(Math.abs(e[t])<1e-12){if(r[t]<n.geometry.bounds.min[t]||r[t]>n.geometry.bounds.max[t]){D=-1/0;break}}else{const m=(n.geometry.bounds.min[t]-r[t])/e[t],f=(n.geometry.bounds.max[t]-r[t])/e[t];F=Math.max(F,Math.min(m,f)),D=Math.min(D,Math.max(m,f))}if(D<F)continue;const{position:o,index:a}=n.geometry.attributes;let M=1/0,T;for(let t=0;t<(a?.count||o.count);t+=3){const m=(a?a.data[t]:t)*o.size,f=(a?a.data[t+1]:t+1)*o.size,L=(a?a.data[t+2]:t+2)*o.size;d[0]=o.data[m],d[1]=o.data[m+1],d[2]=o.data[m+2],y[0]=o.data[f],y[1]=o.data[f+1],y[2]=o.data[f+2],p[0]=o.data[L],p[1]=o.data[L+1],p[2]=o.data[L+2];const A=O(y,d),B=O(p,d),E=q(e,B),w=b(A,E);if(n.program.cullFace!==null?w<1e-9:Math.abs(w)<1e-9)continue;const N=O(r,d),c=b(N,E)/w;if(c<0||c>1)continue;const S=q(N,A),l=b(e,S)/w;if(l<0||c+l>1)continue;if(n.program.nightLight){const g=n.geometry.attributes.uv.data,h=a?[a.data[t],a.data[t+1],a.data[t+2]]:[t,t+1,t+2],j=g[h[0]*2]*(1-c-l)+g[h[1]*2]*c+g[h[2]*2]*l,C=g[h[0]*2+1]*(1-c-l)+g[h[1]*2+1]*c+g[h[2]*2+1]*l;if(j<=2&&(!H||j*j+C*C>.9))continue}const V=b(B,S)/w;V>0&&V<M&&(M=V,T=t/3)}if(T===void 0)continue;const u=new DOMPoint(e[0]*M+r[0],e[1]*M+r[1],e[2]*M+r[2],1).matrixTransform(new DOMMatrix(n.worldMatrix)),z=[u.x/u.w,u.y/u.w,u.z/u.w];k.push({faceIndex:T,object:n,point:z,distance:Math.hypot(z[0]-x.origin[0],z[1]-x.origin[1],z[2]-x.origin[2])})}return k.sort((n,i)=>n.distance-i.distance)}export{Q as intersectMeshes};
|
|
2
|
-
//# sourceMappingURL=picking.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/utils/picking.js"],
|
|
4
|
-
"sourcesContent": ["import { computeBounds } from './geometry.js';\r\n\r\n/** Nearest triangle hit per mesh, sorted by world-space distance. */\r\nexport function intersectMeshes(ray, meshes, night = 0) {\r\n const hits = [],\r\n a = [0, 0, 0],\r\n b = [0, 0, 0],\r\n c = [0, 0, 0],\r\n sub = (a, b) => a.map((v, i) => v - b[i]),\r\n cross = (a, b) => [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]],\r\n dot = (a, b) => a.reduce((sum, v, i) => sum + v * b[i], 0);\r\n for (const mesh of meshes) {\r\n // Test in mesh-local space; compare distances only after returning to shared world space.\r\n const inverse = new DOMMatrix(mesh.worldMatrix).inverse();\r\n const inverseValues = inverse.toFloat64Array();\r\n if (![...inverseValues].every(Number.isFinite)) {\r\n throw new Error('Singular 3D transform');\r\n }\r\n const localOrigin = new DOMPoint(...ray.origin, 1).matrixTransform(inverse);\r\n const origin = [\r\n localOrigin.x / localOrigin.w,\r\n localOrigin.y / localOrigin.w,\r\n localOrigin.z / localOrigin.w\r\n ];\r\n const localDirection = new DOMPoint(...ray.direction, 0).matrixTransform(inverse);\r\n const direction = [\r\n localDirection.x,\r\n localDirection.y,\r\n localDirection.z\r\n ];\r\n const directionLength = Math.hypot(...direction) || 1;\r\n direction[0] /= directionLength; direction[1] /= directionLength; direction[2] /= directionLength;\r\n // AABB slab test reuses the same local ray as the triangle test.\r\n if (!mesh.geometry.bounds) {\r\n computeBounds(mesh.geometry);\r\n }\r\n let near = 0, far = Infinity;\r\n for (let i = 0; i < 3; i++) {\r\n if (Math.abs(direction[i]) < 1e-12) {\r\n if (origin[i] < mesh.geometry.bounds.min[i] || origin[i] > mesh.geometry.bounds.max[i]) {\r\n far = -Infinity;\r\n break;\r\n }\r\n } else {\r\n const a = (mesh.geometry.bounds.min[i] - origin[i]) / direction[i],\r\n b = (mesh.geometry.bounds.max[i] - origin[i]) / direction[i];\r\n near = Math.max(near, Math.min(a, b));\r\n far = Math.min(far, Math.max(a, b));\r\n }\r\n }\r\n if (far < near) {\r\n continue;\r\n }\r\n const { position, index } = mesh.geometry.attributes;\r\n let closest = Infinity, faceIndex;\r\n for (let i = 0; i < (index?.count || position.count); i += 3) {\r\n const ai = (index ? index.data[i] : i) * position.size;\r\n const bi = (index ? index.data[i + 1] : i + 1) * position.size;\r\n const ci = (index ? index.data[i + 2] : i + 2) * position.size;\r\n a[0] = position.data[ai];\r\n a[1] = position.data[ai + 1];\r\n a[2] = position.data[ai + 2];\r\n b[0] = position.data[bi];\r\n b[1] = position.data[bi + 1];\r\n b[2] = position.data[bi + 2];\r\n c[0] = position.data[ci];\r\n c[1] = position.data[ci + 1];\r\n c[2] = position.data[ci + 2];\r\n // Moller-Trumbore: barycentric triangle coordinates and local ray distance.\r\n const e = sub(b, a),\r\n f = sub(c, a),\r\n p = cross(direction, f),\r\n det = dot(e, p);\r\n if (mesh.program.cullFace !== null ? det < 1e-9 : Math.abs(det) < 1e-9) {\r\n continue;\r\n }\r\n const t = sub(origin, a),\r\n u = dot(t, p) / det;\r\n if (u < 0 || u > 1) {\r\n continue;\r\n }\r\n const q = cross(t, e),\r\n v = dot(direction, q) / det;\r\n if (v < 0 || u + v > 1) {\r\n continue;\r\n }\r\n if (mesh.program.nightLight) {\r\n const uv = mesh.geometry.attributes.uv.data;\r\n const ids = index ? [index.data[i], index.data[i + 1], index.data[i + 2]] : [i, i + 1, i + 2];\r\n const x = uv[ids[0] * 2] * (1 - u - v) + uv[ids[1] * 2] * u + uv[ids[2] * 2] * v;\r\n const y = uv[ids[0] * 2 + 1] * (1 - u - v) + uv[ids[1] * 2 + 1] * u + uv[ids[2] * 2 + 1] * v;\r\n if (x <= 2 && (!night || x * x + y * y > 0.9)) continue;\r\n }\r\n const distance = dot(f, q) / det;\r\n if (distance > 0 && distance < closest) {\r\n closest = distance; faceIndex = i / 3;\r\n }\r\n }\r\n if (faceIndex === undefined) continue;\r\n const point = new DOMPoint(\r\n direction[0] * closest + origin[0],\r\n direction[1] * closest + origin[1],\r\n direction[2] * closest + origin[2],\r\n 1\r\n ).matrixTransform(new DOMMatrix(mesh.worldMatrix));\r\n const worldPoint = [point.x / point.w, point.y / point.w, point.z / point.w];\r\n hits.push({\r\n faceIndex,\r\n object: mesh,\r\n point: worldPoint,\r\n distance: Math.hypot(\r\n worldPoint[0] - ray.origin[0],\r\n worldPoint[1] - ray.origin[1],\r\n worldPoint[2] - ray.origin[2]\r\n )\r\n });\r\n }\r\n return hits.sort((a, b) => a.distance - b.distance);\r\n}\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["computeBounds", "intersectMeshes", "ray", "meshes", "night", "hits", "a", "b", "c", "sub", "i", "cross", "dot", "sum", "v", "mesh", "inverse", "localOrigin", "origin", "localDirection", "direction", "directionLength", "near", "far", "position", "index", "closest", "faceIndex", "ai", "bi", "ci", "e", "f", "p", "det", "t", "u", "q", "uv", "ids", "x", "y", "distance", "point", "worldPoint"]
|
|
7
|
-
}
|
package/dist/utils/pmtiles.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
async function a(n,e){if(e===1)return n;if(e!==2)throw new Error(`Unsupported PMTiles compression: ${e}`);return new Response(new Blob([n]).stream().pipeThrough(new DecompressionStream("gzip"))).arrayBuffer()}function d(n){if(n.byteLength<127||new TextDecoder().decode(new Uint8Array(n,0,7))!=="PMTiles"||new Uint8Array(n)[7]!==3)throw new Error("Expected a PMTiles v3 archive");const e=new DataView(n),r={};return["rootDirectoryOffset","rootDirectoryLength","jsonMetadataOffset","jsonMetadataLength","leafDirectoryOffset","leafDirectoryLength","tileDataOffset","tileDataLength","numAddressedTiles","numTileEntries","numTileContents"].forEach((i,s)=>{r[i]=Number(e.getBigUint64(8+s*8,!0))}),["clustered","internalCompression","tileCompression","tileType","minZoom","maxZoom"].forEach((i,s)=>{r[i]=e.getUint8(96+s)}),["minLon","minLat","maxLon","maxLat"].forEach((i,s)=>{r[i]=e.getInt32(102+s*4,!0)/1e7}),r.centerZoom=e.getUint8(118),r.centerLon=e.getInt32(119,!0)/1e7,r.centerLat=e.getInt32(123,!0)/1e7,r}function h(n,e,r){if(![n,e,r].every(Number.isInteger)||n<0||n>26||e<0||r<0||e>=2**n||r>=2**n)throw new Error("Invalid PMTiles tile coordinates");let i=(4**n-1)/3;const s=2**n;for(let o=s/2;o>=1;o/=2){const l=e&o?1:0,t=r&o?1:0;i+=o*o*(3*l^t),t||(l&&(e=s-1-e,r=s-1-r),[e,r]=[r,e])}return i}function u(n){const e=new Uint8Array(n);let r=0;const i=()=>{let t=0;for(let c=1;c<=2**49;c*=128){if(r>=e.length)throw new Error("Truncated PMTiles directory");const f=e[r++];if(t+=(f&127)*c,!Number.isSafeInteger(t))throw new Error("Invalid PMTiles directory integer");if(f<128)return t}throw new Error("Invalid PMTiles directory integer")},s=i();if(s>(e.length-r)/4)throw new Error("Invalid PMTiles directory count");const o=[];let l=0;for(let t=0;t<s;t++){if(l+=i(),!Number.isSafeInteger(l)||t&&l<=o[t-1].tileId)throw new Error("Invalid PMTiles directory tile IDs");o.push({tileId:l})}for(const t of o)t.runLength=i();for(const t of o)if(t.length=i(),!t.length)throw new Error("Invalid PMTiles directory length");if(o.forEach((t,c)=>{const f=i();if(!f&&!c)throw new Error("Invalid PMTiles directory offset");t.offset=f?f-1:o[c-1].offset+o[c-1].length}),r!==e.length)throw new Error("Trailing PMTiles directory data");return o}export{u as decodeDirectory,d as decodeHeader,a as decompress,h as tileId};
|
|
2
|
-
//# sourceMappingURL=pmtiles.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/utils/pmtiles.js"],
|
|
4
|
-
"sourcesContent": ["export async function decompress(data, compression) {\r\n if (compression === 1) return data;\r\n if (compression !== 2) throw new Error(`Unsupported PMTiles compression: ${compression}`);\r\n return new Response(new Blob([data]).stream().pipeThrough(new DecompressionStream('gzip'))).arrayBuffer();\r\n}\r\n\r\n/** Decode the PMTiles v3 header. */\r\nexport function decodeHeader(data) {\r\n if (data.byteLength < 127 || new TextDecoder().decode(new Uint8Array(data, 0, 7)) !== 'PMTiles' ||\r\n new Uint8Array(data)[7] !== 3) throw new Error('Expected a PMTiles v3 archive');\r\n const view = new DataView(data);\r\n const header = {};\r\n ['rootDirectoryOffset', 'rootDirectoryLength', 'jsonMetadataOffset', 'jsonMetadataLength', 'leafDirectoryOffset', 'leafDirectoryLength', 'tileDataOffset', 'tileDataLength', 'numAddressedTiles', 'numTileEntries', 'numTileContents'].forEach((name, i) => { header[name] = Number(view.getBigUint64(8 + i * 8, true)); });\r\n ['clustered', 'internalCompression', 'tileCompression', 'tileType', 'minZoom', 'maxZoom'].forEach((name, i) => { header[name] = view.getUint8(96 + i); });\r\n ['minLon', 'minLat', 'maxLon', 'maxLat'].forEach((name, i) => { header[name] = view.getInt32(102 + i * 4, true) / 1e7; });\r\n header.centerZoom = view.getUint8(118);\r\n header.centerLon = view.getInt32(119, true) / 1e7;\r\n header.centerLat = view.getInt32(123, true) / 1e7;\r\n return header;\r\n}\r\n\r\n/** Cumulative Hilbert ID for an archive tile. */\r\nexport function tileId(z, x, y) {\r\n if (![z, x, y].every(Number.isInteger) || z < 0 || z > 26 ||\r\n x < 0 || y < 0 || x >= 2 ** z || y >= 2 ** z) throw new Error('Invalid PMTiles tile coordinates');\r\n let id = (4 ** z - 1) / 3;\r\n const n = 2 ** z;\r\n // Same cumulative Hilbert ordering used by build/pmtiles.js.\r\n for (let s = n / 2; s >= 1; s /= 2) {\r\n const rx = (x & s) ? 1 : 0,\r\n ry = (y & s) ? 1 : 0;\r\n id += s * s * ((3 * rx) ^ ry);\r\n if (!ry) {\r\n if (rx) { x = n - 1 - x; y = n - 1 - y; }\r\n [x, y] = [y, x];\r\n }\r\n }\r\n return id;\r\n}\r\n\r\n/** Decode delta/varint directory columns, rejecting malformed entries. */\r\nexport function decodeDirectory(data) {\r\n const bytes = new Uint8Array(data);\r\n let cursor = 0;\r\n const varint = () => {\r\n let value = 0;\r\n for (let factor = 1; factor <= 2 ** 49; factor *= 128) {\r\n if (cursor >= bytes.length) throw new Error('Truncated PMTiles directory');\r\n const byte = bytes[cursor++];\r\n value += (byte & 127) * factor;\r\n if (!Number.isSafeInteger(value)) throw new Error('Invalid PMTiles directory integer');\r\n if (byte < 128) return value;\r\n }\r\n throw new Error('Invalid PMTiles directory integer');\r\n };\r\n const count = varint();\r\n if (count > (bytes.length - cursor) / 4) throw new Error('Invalid PMTiles directory count');\r\n const entries = [];\r\n let tileId = 0;\r\n for (let i = 0; i < count; i++) {\r\n tileId += varint();\r\n if (!Number.isSafeInteger(tileId) || (i && tileId <= entries[i - 1].tileId)) {\r\n throw new Error('Invalid PMTiles directory tile IDs');\r\n }\r\n entries.push({ tileId });\r\n }\r\n for (const entry of entries) entry.runLength = varint();\r\n for (const entry of entries) {\r\n entry.length = varint();\r\n if (!entry.length) throw new Error('Invalid PMTiles directory length');\r\n }\r\n entries.forEach((entry, i) => {\r\n const value = varint();\r\n if (!value && !i) throw new Error('Invalid PMTiles directory offset');\r\n entry.offset = value ? value - 1 : entries[i - 1].offset + entries[i - 1].length;\r\n });\r\n if (cursor !== bytes.length) throw new Error('Trailing PMTiles directory data');\r\n return entries;\r\n}\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["decompress", "data", "compression", "decodeHeader", "view", "header", "name", "i", "tileId", "z", "x", "y", "id", "n", "s", "rx", "ry", "decodeDirectory", "bytes", "cursor", "varint", "value", "factor", "byte", "count", "entries", "entry"]
|
|
7
|
-
}
|
package/dist/utils/scene.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const y=()=>({position:[0,0,0],rotation:[0,0,0],scale:[1,1,1],worldMatrix:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],children:[],visible:!0});function A(t,e){t.parent&&t.parent.children.splice(t.parent.children.indexOf(t),1),t.parent=e,e&&e.children.push(t)}function u(t,e){if(!e(t))for(const a of t.children)u(a,e)}function M(t){const e=t.parent,a=e?._worldMatrixVersion||0,c=!!t.matrix;let n=t._worldParent!==e||t._parentWorldVersion!==a||t._worldMatrixMode!==c;if(t.matrix){const o=t._matrixState||=new Float64Array(16);for(let i=0;i<16;i++)o[i]!==t.matrix[i]&&(n=!0),o[i]=t.matrix[i]}else{const o=t._transformState||=new Float64Array(9);for(let i=0;i<9;i++){const x=i<3?t.position[i]:i<6?t.rotation[i-3]:t.scale[i-6];o[i]!==x&&(n=!0),o[i]=x}}if(!n){for(const o of t.children)M(o);return}let s;if(t.matrix)s=t.matrix;else{const o=180/Math.PI,i=new DOMMatrix().translate(...t.position);i.rotateAxisAngleSelf(0,1,0,t.rotation[1]*o),i.rotateAxisAngleSelf(1,0,0,t.rotation[0]*o),i.rotateAxisAngleSelf(0,0,1,t.rotation[2]*o),s=i.scale(...t.scale).toFloat64Array()}const f=e?new DOMMatrix(e.worldMatrix).multiply(new DOMMatrix(s)).toFloat64Array():s;for(let o=0;o<16;o++)t.worldMatrix[o]=f[o];t._worldParent=e,t._parentWorldVersion=a,t._worldMatrixMode=c,t._worldMatrixVersion=(t._worldMatrixVersion||0)+1;for(const o of t.children)M(o)}function _(t){const e=t.position.map((r,l)=>r-t.target[l]),a=Math.hypot(...e)||1,c=(r,l)=>[r[1]*l[2]-r[2]*l[1],r[2]*l[0]-r[0]*l[2],r[0]*l[1]-r[1]*l[0]];for(let r=0;r<3;r++)e[r]/=a;const n=c(t.up,e),s=Math.hypot(...n)||1;for(let r=0;r<3;r++)n[r]/=s;const f=c(e,n),o=new DOMMatrix([n[0],n[1],n[2],0,f[0],f[1],f[2],0,e[0],e[1],e[2],0,...t.position,1]).inverse().toFloat64Array();if(![...o].every(Number.isFinite))throw new Error("Singular 3D transform");for(let r=0;r<16;r++)t.viewMatrix[r]=o[r];const i=1/Math.tan(t.fov*Math.PI/360),x=t.near,p=t.far,w=[i/t.aspect,0,0,0,0,i,0,0,0,0,p/(x-p),-1,0,0,p*x/(x-p),0];for(let r=0;r<16;r++)t.projectionMatrix[r]=w[r];const h=new DOMMatrix(t.projectionMatrix).multiply(new DOMMatrix(t.viewMatrix)).toFloat64Array();for(let r=0;r<16;r++)t.projectionViewMatrix[r]=h[r]}export{y as emptyNode,A as setParent,u as traverse,_ as updateCamera,M as updateWorldMatrix};
|
|
2
|
-
//# sourceMappingURL=scene.js.map
|
package/dist/utils/scene.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/utils/scene.js"],
|
|
4
|
-
"sourcesContent": ["/** A fresh, empty scene-graph node. */\r\nexport const emptyNode = () => ({\r\n position: [0, 0, 0],\r\n rotation: [0, 0, 0],\r\n scale: [1, 1, 1],\r\n worldMatrix: [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],\r\n children: [],\r\n visible: true,\r\n});\r\n\r\n/** Reparent/detach scene data without drawing or disposing GPU resources. */\r\nexport function setParent(node, parent) {\r\n if (node.parent) node.parent.children.splice(node.parent.children.indexOf(node), 1);\r\n node.parent = parent;\r\n if (parent) parent.children.push(node);\r\n}\r\n\r\n/** Depth-first walk; a truthy callback result skips that node's descendants. */\r\nexport function traverse(node, callback) {\r\n if (callback(node)) return;\r\n for (const child of node.children) traverse(child, callback);\r\n}\r\n\r\n/** Compose parent*local matrices; a node.matrix overrides its position/rotation/scale. */\r\nexport function updateWorldMatrix(node) {\r\n const parent = node.parent;\r\n const parentVersion = parent?._worldMatrixVersion || 0;\r\n const matrixMode = Boolean(node.matrix);\r\n let changed = node._worldParent !== parent || node._parentWorldVersion !== parentVersion ||\r\n node._worldMatrixMode !== matrixMode;\r\n if (node.matrix) {\r\n const state = node._matrixState ||= new Float64Array(16);\r\n for (let i = 0; i < 16; i++) {\r\n if (state[i] !== node.matrix[i]) changed = true;\r\n state[i] = node.matrix[i];\r\n }\r\n } else {\r\n const state = node._transformState ||= new Float64Array(9);\r\n for (let i = 0; i < 9; i++) {\r\n const value = i < 3 ? node.position[i] : i < 6 ? node.rotation[i - 3] : node.scale[i - 6];\r\n if (state[i] !== value) changed = true;\r\n state[i] = value;\r\n }\r\n }\r\n if (!changed) {\r\n for (const child of node.children) updateWorldMatrix(child);\r\n return;\r\n }\r\n let local;\r\n if (node.matrix) local = node.matrix;\r\n else {\r\n const degrees = 180 / Math.PI;\r\n const matrix = new DOMMatrix().translate(...node.position);\r\n // Node rotations use YXZ, as did the previous renderer.\r\n matrix.rotateAxisAngleSelf(0, 1, 0, node.rotation[1] * degrees);\r\n matrix.rotateAxisAngleSelf(1, 0, 0, node.rotation[0] * degrees);\r\n matrix.rotateAxisAngleSelf(0, 0, 1, node.rotation[2] * degrees);\r\n local = matrix.scale(...node.scale).toFloat64Array();\r\n }\r\n const world = parent\r\n ? new DOMMatrix(parent.worldMatrix).multiply(new DOMMatrix(local)).toFloat64Array()\r\n : local;\r\n for (let i = 0; i < 16; i++) node.worldMatrix[i] = world[i];\r\n node._worldParent = parent;\r\n node._parentWorldVersion = parentVersion;\r\n node._worldMatrixMode = matrixMode;\r\n node._worldMatrixVersion = (node._worldMatrixVersion || 0) + 1;\r\n for (const child of node.children) updateWorldMatrix(child);\r\n}\r\n\r\n/** Orthonormal view basis plus perspective matrices, refreshed before projecting/drawing. */\r\nexport function updateCamera(camera) {\r\n const z = camera.position.map((v, i) => v - camera.target[i]);\r\n const zLength = Math.hypot(...z) || 1;\r\n const cross = (a, b) => [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\r\n for (let i = 0; i < 3; i++) {\r\n z[i] /= zLength;\r\n }\r\n const x = cross(camera.up, z), xLength = Math.hypot(...x) || 1;\r\n for (let i = 0; i < 3; i++) {\r\n x[i] /= xLength;\r\n }\r\n const y = cross(z, x);\r\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();\r\n if (![...view].every(Number.isFinite)) {\r\n throw new Error('Singular 3D transform');\r\n }\r\n for (let i = 0; i < 16; i++) {\r\n camera.viewMatrix[i] = view[i];\r\n }\r\n const f = 1 / Math.tan(camera.fov * Math.PI / 360),\r\n n = camera.near,\r\n r = camera.far;\r\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];\r\n for (let i = 0; i < 16; i++) {\r\n camera.projectionMatrix[i] = projection[i];\r\n }\r\n const projectionView = new DOMMatrix(camera.projectionMatrix).multiply(new DOMMatrix(camera.viewMatrix)).toFloat64Array();\r\n for (let i = 0; i < 16; i++) {\r\n camera.projectionViewMatrix[i] = projectionView[i];\r\n }\r\n}\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["emptyNode", "setParent", "node", "parent", "traverse", "callback", "child", "updateWorldMatrix", "parentVersion", "matrixMode", "changed", "state", "value", "local", "degrees", "matrix", "world", "i", "updateCamera", "camera", "z", "v", "zLength", "cross", "a", "b", "x", "xLength", "y", "view", "f", "n", "r", "projection", "projectionView"]
|
|
7
|
-
}
|