leaflet-city-mapper 0.0.2 → 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.
Files changed (919) hide show
  1. package/README.md +49 -3
  2. package/cucumber.mjs +1 -1
  3. package/dist/leaflet-city-mapper.js +3 -1
  4. package/dist/leaflet-city-mapper.js.map +4 -4
  5. package/package.json +2 -1
  6. package/src/archives/decodeDirectory.js +32 -0
  7. package/src/archives/decodeHeader.js +19 -0
  8. package/src/archives/getZxy.js +75 -0
  9. package/src/archives/loadDirectory.js +7 -0
  10. package/src/archives/tileId.js +19 -0
  11. package/src/archives/varint.js +15 -0
  12. package/src/camera/angles.js +6 -0
  13. package/src/camera/animationPoint.js +8 -0
  14. package/src/camera/cameraMapReady.js +8 -0
  15. package/src/camera/cancelCameraAnimation.js +11 -0
  16. package/src/camera/cleanupCameraMap.js +11 -0
  17. package/src/camera/constrainCameraToBounds.js +3 -0
  18. package/src/camera/displayPoint.js +3 -0
  19. package/src/camera/fitCameraBounds.js +48 -0
  20. package/src/camera/groundBounds.js +11 -0
  21. package/src/camera/initializeCameraMap.js +25 -0
  22. package/src/camera/mapAnimateCamera.js +17 -0
  23. package/src/camera/mapCamera.js +123 -0
  24. package/src/camera/mapContainerPointToLayerPoint.js +7 -0
  25. package/src/camera/mapGetBearing.js +1 -0
  26. package/src/camera/mapGetBounds.js +14 -0
  27. package/src/camera/mapGetBoundsCenterZoom.js +7 -0
  28. package/src/camera/mapGetBoundsZoom.js +14 -0
  29. package/src/camera/mapGetCenterLayerPoint.js +5 -0
  30. package/src/camera/mapGetPitch.js +1 -0
  31. package/src/camera/mapLayerPointToContainerPoint.js +7 -0
  32. package/src/camera/mapLimitCenter.js +12 -0
  33. package/src/camera/mapLimitOffset.js +10 -0
  34. package/src/camera/mapPanBy.js +9 -0
  35. package/src/camera/mapPanInside.js +14 -0
  36. package/src/camera/mapResetNorth.js +1 -0
  37. package/src/camera/mapResetNorthPitch.js +1 -0
  38. package/src/camera/mapSetBearing.js +1 -0
  39. package/src/camera/mapSetPitch.js +1 -0
  40. package/src/camera/mapSetPitchAndBearing.js +14 -0
  41. package/src/camera/mapSetZoomAround.js +11 -0
  42. package/src/camera/mapStopPitchBearingAnimation.js +6 -0
  43. package/src/camera/mapTryAnimatedPan.js +9 -0
  44. package/src/camera/mapUpdateCameraOverlays.js +7 -0
  45. package/src/camera/pointOf.js +3 -0
  46. package/src/camera/project.js +20 -0
  47. package/src/camera/runCameraAnimations.js +28 -0
  48. package/src/camera/scheduleCameraAnimation.js +8 -0
  49. package/src/camera/updateSky.js +16 -0
  50. package/src/camera/verticalGroundY.js +4 -0
  51. package/src/collision/collectMeshes.js +5 -0
  52. package/src/collision/collider.js +63 -0
  53. package/src/collision/intersectMeshes.js +133 -0
  54. package/src/collision/sortHits.js +23 -0
  55. package/src/constants/Compass.js +7 -0
  56. package/src/constants/ContainerResize.js +7 -0
  57. package/src/constants/HEIGHT.js +1 -0
  58. package/src/constants/PitchDrag.js +7 -0
  59. package/src/constants/ShiftRotate.js +7 -0
  60. package/src/constants/TILE_RADIUS.js +1 -0
  61. package/src/constants/TILE_SIZE.js +1 -0
  62. package/src/constants/TouchMode.js +6 -0
  63. package/src/constants/attachState.js +1 -0
  64. package/src/constants/cameraControlsState.js +1 -0
  65. package/src/constants/cityMapper.js +6 -0
  66. package/src/constants/dark.js +1 -0
  67. package/src/constants/elevationWGSL.js +27 -0
  68. package/src/constants/glass.js +1 -0
  69. package/src/constants/indexState.js +1 -0
  70. package/src/constants/mapCameraState.js +1 -0
  71. package/src/constants/nativeEventMaps.js +1 -0
  72. package/src/constants/nativeLayerState.js +1 -0
  73. package/src/constants/nativeMethodHandlers.js +31 -0
  74. package/src/constants/onMapChangeState.js +1 -0
  75. package/src/constants/onZoomAnimState.js +1 -0
  76. package/src/constants/parts.js +19 -0
  77. package/src/constants/pendingUpdates.js +1 -0
  78. package/src/constants/pumpState.js +1 -0
  79. package/src/constants/ringDirections.js +10 -0
  80. package/src/constants/roundProfile.js +1 -0
  81. package/src/constants/shirt.js +1 -0
  82. package/src/constants/skin.js +2 -0
  83. package/src/constants/trafficShader.js +49 -0
  84. package/src/constants/trousers.js +1 -0
  85. package/src/constants/tyre.js +1 -0
  86. package/src/constants/underEntryState.js +1 -0
  87. package/src/constants/vehicles.js +40 -0
  88. package/src/controls/acceptPitchDrag.js +4 -0
  89. package/src/controls/acceptRotateDrag.js +3 -0
  90. package/src/controls/adjustCameraDrag.js +10 -0
  91. package/src/controls/cameraControls.js +60 -0
  92. package/src/controls/cameraDragClick.js +9 -0
  93. package/src/controls/cameraDragContextMenu.js +8 -0
  94. package/src/controls/cameraDragDown.js +20 -0
  95. package/src/controls/cameraDragEnd.js +6 -0
  96. package/src/controls/cameraDragMove.js +23 -0
  97. package/src/controls/changeCameraTouch.js +14 -0
  98. package/src/controls/cleanupCameraTouch.js +24 -0
  99. package/src/controls/compassAddHooks.js +15 -0
  100. package/src/controls/compassOrientation.js +6 -0
  101. package/src/controls/compassRemoveHooks.js +5 -0
  102. package/src/controls/containerResizeAddHooks.js +8 -0
  103. package/src/controls/containerResizeRemoveHooks.js +5 -0
  104. package/src/controls/dragCamera.js +22 -0
  105. package/src/controls/editable.js +3 -0
  106. package/src/controls/endAllCameraDrags.js +7 -0
  107. package/src/controls/endAllCameraTouches.js +7 -0
  108. package/src/controls/endCameraTouch.js +11 -0
  109. package/src/controls/endCameraTouchEvent.js +5 -0
  110. package/src/controls/finishCameraDrag.js +9 -0
  111. package/src/controls/finishCompassPermission.js +16 -0
  112. package/src/controls/loadCameraControls.js +9 -0
  113. package/src/controls/moveCameraTouch.js +22 -0
  114. package/src/controls/notifyCameraTouchChange.js +1 -0
  115. package/src/controls/pitchDragAddHooks.js +6 -0
  116. package/src/controls/pitchDragRemoveHooks.js +5 -0
  117. package/src/controls/refreshRotateControl.js +7 -0
  118. package/src/controls/refreshRotateFocus.js +5 -0
  119. package/src/controls/removeCameraDrag.js +23 -0
  120. package/src/controls/resizeMap.js +3 -0
  121. package/src/controls/rotateButtonClick.js +7 -0
  122. package/src/controls/rotateButtonKeydown.js +11 -0
  123. package/src/controls/rotateControl.js +3 -0
  124. package/src/controls/rotateOnAdd.js +38 -0
  125. package/src/controls/rotateOnRemove.js +6 -0
  126. package/src/controls/shiftRotateAddHooks.js +8 -0
  127. package/src/controls/shiftRotateRemoveHooks.js +5 -0
  128. package/src/controls/shiftRotateWheel.js +9 -0
  129. package/src/controls/startCameraTouch.js +23 -0
  130. package/src/core/addImageState.js +7 -0
  131. package/src/core/addRasterImage.js +10 -0
  132. package/src/core/adjustCameraMarkerPan.js +22 -0
  133. package/src/core/beforeNativeRender.js +10 -0
  134. package/src/core/boundsQuad.js +11 -0
  135. package/src/core/bringNativeLayerToBack.js +3 -0
  136. package/src/core/bringNativeLayerToFront.js +3 -0
  137. package/src/core/cameraCircleBounds.js +6 -0
  138. package/src/core/cameraMarkerDrag.js +18 -0
  139. package/src/core/cameraMarkerOnDrag.js +8 -0
  140. package/src/core/cancelGridFade.js +10 -0
  141. package/src/core/closestCameraLayerPoint.js +7 -0
  142. package/src/core/compareNativeHits.js +3 -0
  143. package/src/core/current.js +3 -0
  144. package/src/core/disposeNativeLayer.js +35 -0
  145. package/src/core/fireRasterLoad.js +5 -0
  146. package/src/core/forwardNativeError.js +3 -0
  147. package/src/core/gridlayerGetEvents.js +7 -0
  148. package/src/core/gridlayerGetTiledPixelBounds.js +8 -0
  149. package/src/core/handleNativeMapEvent.js +47 -0
  150. package/src/core/hideTargets.js +16 -0
  151. package/src/core/initNativeGPU.js +21 -0
  152. package/src/core/initializeGridContainer.js +6 -0
  153. package/src/core/initializeNativeLayer.js +42 -0
  154. package/src/core/localPixel.js +5 -0
  155. package/src/core/localPixelForGeometry.js +6 -0
  156. package/src/core/localPosition.js +6 -0
  157. package/src/core/markerCameraIconPoint.js +9 -0
  158. package/src/core/markerGetEvents.js +5 -0
  159. package/src/core/markerInitInteraction.js +8 -0
  160. package/src/core/markerQuadCorners.js +31 -0
  161. package/src/core/markerSetIcon.js +9 -0
  162. package/src/core/markerSetPos.js +14 -0
  163. package/src/core/markerSetRotation.js +7 -0
  164. package/src/core/markerUpdateZIndex.js +8 -0
  165. package/src/core/nativeAddLatLng.js +3 -0
  166. package/src/core/nativeBringToBack.js +3 -0
  167. package/src/core/nativeBringToFront.js +3 -0
  168. package/src/core/nativeEvents.js +26 -0
  169. package/src/core/nativeImageError.js +8 -0
  170. package/src/core/nativeImageRefresh.js +7 -0
  171. package/src/core/nativeLayer.js +97 -0
  172. package/src/core/nativeLayerMethod.js +21 -0
  173. package/src/core/nativeRedraw.js +3 -0
  174. package/src/core/nativeSetBounds.js +3 -0
  175. package/src/core/nativeSetIcon.js +3 -0
  176. package/src/core/nativeSetLatLng.js +3 -0
  177. package/src/core/nativeSetLatLngs.js +3 -0
  178. package/src/core/nativeSetOpacity.js +3 -0
  179. package/src/core/nativeSetRadius.js +3 -0
  180. package/src/core/nativeSetStyle.js +3 -0
  181. package/src/core/nativeSetUrl.js +3 -0
  182. package/src/core/nativeSetZIndex.js +3 -0
  183. package/src/core/nativeSetZIndexOffset.js +3 -0
  184. package/src/core/popupAdjustPan.js +23 -0
  185. package/src/core/popupGetEvents.js +5 -0
  186. package/src/core/popupUpdatePosition.js +14 -0
  187. package/src/core/putNativeMesh.js +33 -0
  188. package/src/core/quadNativeMesh.js +15 -0
  189. package/src/core/readyNativeGPU.js +6 -0
  190. package/src/core/refreshNativeEvent.js +5 -0
  191. package/src/core/refreshNativeLayer.js +29 -0
  192. package/src/core/refreshNativeLayerContract.js +3 -0
  193. package/src/core/rejectNativeReady.js +3 -0
  194. package/src/core/removeImageState.js +8 -0
  195. package/src/core/removeNativeEvents.js +16 -0
  196. package/src/core/removeTargets.js +8 -0
  197. package/src/core/reorderNativeLayer.js +6 -0
  198. package/src/core/resolveNativeReady.js +3 -0
  199. package/src/core/restoreNativeEvents.js +6 -0
  200. package/src/core/runGridFades.js +14 -0
  201. package/src/core/runMarkerPanFrame.js +12 -0
  202. package/src/core/scheduleGridFade.js +9 -0
  203. package/src/core/scheduleMarkerPan.js +8 -0
  204. package/src/core/styleNativeMesh.js +10 -0
  205. package/src/core/syncGridLayer.js +22 -0
  206. package/src/core/syncImageOverlay.js +9 -0
  207. package/src/core/syncMarker.js +12 -0
  208. package/src/core/syncVectorLayer.js +26 -0
  209. package/src/core/synchronizeNativeLayer.js +35 -0
  210. package/src/core/textureFor.js +48 -0
  211. package/src/core/tooltipGetEvents.js +5 -0
  212. package/src/core/tooltipSetPosition.js +8 -0
  213. package/src/core/updateGridOpacity.js +23 -0
  214. package/src/core/updateNativeLayerView.js +6 -0
  215. package/src/core/uploadCanvasTexture.js +19 -0
  216. package/src/geometry/addBridges.js +88 -0
  217. package/src/geometry/below.js +3 -0
  218. package/src/geometry/box.js +3 -0
  219. package/src/geometry/bridgeElevation.js +19 -0
  220. package/src/geometry/bridgeLocal.js +4 -0
  221. package/src/geometry/build.js +19 -0
  222. package/src/geometry/circleAt.js +5 -0
  223. package/src/geometry/clipLine.js +23 -0
  224. package/src/geometry/clipSegment.js +19 -0
  225. package/src/geometry/computeBounds.js +33 -0
  226. package/src/geometry/conformModelToTerrain.js +67 -0
  227. package/src/geometry/cross.js +3 -0
  228. package/src/geometry/disk.js +11 -0
  229. package/src/geometry/diskAt.js +4 -0
  230. package/src/geometry/dot.js +6 -0
  231. package/src/geometry/emitter.js +8 -0
  232. package/src/geometry/lampPostGeometry.js +24 -0
  233. package/src/geometry/lampRing.js +11 -0
  234. package/src/geometry/lightGeometry.js +15 -0
  235. package/src/geometry/line.js +54 -0
  236. package/src/geometry/nativeGeometry.js +55 -0
  237. package/src/geometry/nativeTriangle.js +3 -0
  238. package/src/geometry/polygon.js +22 -0
  239. package/src/geometry/push.js +3 -0
  240. package/src/geometry/quad.js +4 -0
  241. package/src/geometry/roofCoverage.js +52 -0
  242. package/src/geometry/samePoint.js +3 -0
  243. package/src/geometry/segment.js +21 -0
  244. package/src/geometry/setVertexColor.js +15 -0
  245. package/src/geometry/sub.js +6 -0
  246. package/src/geometry/surface.js +17 -0
  247. package/src/geometry/treeGeometry.js +31 -0
  248. package/src/geometry/treeRing.js +14 -0
  249. package/src/geometry/triangle.js +12 -0
  250. package/src/geometry/vertexNormals.js +32 -0
  251. package/src/geometry/visit.js +9 -0
  252. package/src/index.js +41 -323
  253. package/src/lighting/cacheLightGrid.js +23 -0
  254. package/src/lighting/collectLightMeshes.js +6 -0
  255. package/src/lighting/lightGrid.js +42 -0
  256. package/src/lighting/updatePointLights.js +34 -0
  257. package/src/lighting/visitCells.js +15 -0
  258. package/src/lighting/worldLights.js +27 -0
  259. package/src/models/decodeModel.js +45 -0
  260. package/src/models/hasUnsupportedPrimitives.js +10 -0
  261. package/src/models/loadBuffer.js +6 -0
  262. package/src/models/loadImage.js +15 -0
  263. package/src/models/loadModel.js +69 -0
  264. package/src/models/materialFor.js +21 -0
  265. package/src/models/modelNode.js +93 -0
  266. package/src/models/readAccessor.js +53 -0
  267. package/src/models/readAccessorValues.js +16 -0
  268. package/src/models/textureFor.js +35 -0
  269. package/src/picking/collectVisibleMesh.js +4 -0
  270. package/src/picking/findFeature.js +49 -0
  271. package/src/picking/hit.js +23 -0
  272. package/src/picking/hitMesh.js +30 -0
  273. package/src/picking/pointerClick.js +5 -0
  274. package/src/picking/pointerLeave.js +5 -0
  275. package/src/picking/pointerMove.js +5 -0
  276. package/src/picking/raycast.js +59 -0
  277. package/src/picking/setHighlight.js +13 -0
  278. package/src/picking/shouldSkipOther.js +3 -0
  279. package/src/picking/showFeature.js +34 -0
  280. package/src/raster/addRasterTile.js +114 -0
  281. package/src/raster/comparePendingTiles.js +5 -0
  282. package/src/raster/createGeometry.js +22 -0
  283. package/src/raster/createRasterMesh.js +47 -0
  284. package/src/raster/finishAttachment.js +11 -0
  285. package/src/raster/finishRasterTile.js +47 -0
  286. package/src/raster/getRasterEvents.js +6 -0
  287. package/src/raster/getRasterTileSize.js +5 -0
  288. package/src/raster/initRaster.js +38 -0
  289. package/src/raster/isLoading.js +5 -0
  290. package/src/raster/loadRasterTile.js +10 -0
  291. package/src/raster/onPMTileAdd.js +10 -0
  292. package/src/raster/onPMTileRemove.js +8 -0
  293. package/src/raster/pruneRasterTiles.js +37 -0
  294. package/src/raster/pumpRasterTiles.js +22 -0
  295. package/src/raster/readyRaster.js +13 -0
  296. package/src/raster/registerTerrainTile.js +12 -0
  297. package/src/raster/releaseRasterTile.js +18 -0
  298. package/src/raster/releaseRasterTiles.js +15 -0
  299. package/src/raster/removeRasterTile.js +13 -0
  300. package/src/raster/reportError.js +6 -0
  301. package/src/raster/setPMTileOpacity.js +7 -0
  302. package/src/raster/setPMTileZIndex.js +7 -0
  303. package/src/raster/setRasterOpacity.js +11 -0
  304. package/src/raster/setRasterTerrain.js +21 -0
  305. package/src/raster/setRasterZIndex.js +11 -0
  306. package/src/raster/updateAttachedTiles.js +10 -0
  307. package/src/raster/updateRasterTiles.js +59 -0
  308. package/src/rendering/collectFrameMeshes.js +31 -0
  309. package/src/rendering/collectMeshes.js +36 -0
  310. package/src/rendering/compareMeshes.js +10 -0
  311. package/src/rendering/compareRoofTiles.js +4 -0
  312. package/src/rendering/composeRoofAtlas.js +52 -0
  313. package/src/rendering/createMesh.js +33 -0
  314. package/src/rendering/createProgram.js +92 -0
  315. package/src/rendering/destroyAfterSubmission.js +8 -0
  316. package/src/rendering/destroyTexture.js +6 -0
  317. package/src/rendering/disposeMesh.js +14 -0
  318. package/src/rendering/drawGeometry.js +129 -0
  319. package/src/rendering/drawSceneMeshes.js +51 -0
  320. package/src/rendering/ensureRoofBlit.js +40 -0
  321. package/src/rendering/prepareFrameMeshes.js +42 -0
  322. package/src/rendering/prepareFrameUniforms.js +49 -0
  323. package/src/rendering/rebuildRoofAtlas.js +67 -0
  324. package/src/rendering/render.js +57 -0
  325. package/src/rendering/reportCompilation.js +17 -0
  326. package/src/rendering/resizeRenderer.js +19 -0
  327. package/src/rendering/sortMeshes.js +6 -0
  328. package/src/rendering/synchronizeZoomView.js +34 -0
  329. package/src/rendering/textureBinding.js +7 -0
  330. package/src/rendering/updateMapCamera.js +32 -0
  331. package/src/rendering/updateRoofRaster.js +32 -0
  332. package/src/scene/attach.js +161 -0
  333. package/src/scene/attachLayer.js +10 -0
  334. package/src/scene/cancelUpdate.js +10 -0
  335. package/src/scene/emptyEvents.js +3 -0
  336. package/src/scene/emptyNode.js +11 -0
  337. package/src/scene/endZoom.js +16 -0
  338. package/src/scene/failAttachment.js +9 -0
  339. package/src/scene/get3DEvents.js +13 -0
  340. package/src/scene/init3D.js +30 -0
  341. package/src/scene/initializeLayer.js +16 -0
  342. package/src/scene/initializerFor.js +14 -0
  343. package/src/scene/layerInitialize.js +38 -0
  344. package/src/scene/layerLayerAdd.js +21 -0
  345. package/src/scene/onAdd3DLayer.js +35 -0
  346. package/src/scene/onMapChange.js +16 -0
  347. package/src/scene/onRemove3DLayer.js +69 -0
  348. package/src/scene/onZoomAnim.js +16 -0
  349. package/src/scene/placeEntry.js +11 -0
  350. package/src/scene/placeUnderEntry.js +8 -0
  351. package/src/scene/ready3D.js +25 -0
  352. package/src/scene/releaseRenderer.js +14 -0
  353. package/src/scene/removeEntry.js +6 -0
  354. package/src/scene/renderPendingMapChange.js +11 -0
  355. package/src/scene/renderPendingUpdates.js +19 -0
  356. package/src/scene/renderPendingZoomAnimation.js +7 -0
  357. package/src/scene/rendererDeviceError.js +10 -0
  358. package/src/scene/rendererDeviceLost.js +11 -0
  359. package/src/scene/replaceEntry.js +7 -0
  360. package/src/scene/reportError.js +3 -0
  361. package/src/scene/requestAdapter.js +12 -0
  362. package/src/scene/requestDevice.js +9 -0
  363. package/src/scene/resolveNextInitialization.js +12 -0
  364. package/src/scene/restoreObject.js +71 -0
  365. package/src/scene/runPlacements.js +7 -0
  366. package/src/scene/showWebGPUWarning.js +16 -0
  367. package/src/scene/traverse.js +7 -0
  368. package/src/scene/underEntry.js +17 -0
  369. package/src/scene/update.js +19 -0
  370. package/src/scene/updateCamera.js +34 -0
  371. package/src/scene/updateWorldMatrix.js +48 -0
  372. package/src/shaders/materialShaders.js +246 -0
  373. package/src/shadows/bindSunlight.js +12 -0
  374. package/src/shadows/drawShadowMeshes.js +48 -0
  375. package/src/shadows/ensureShadowPipeline.js +53 -0
  376. package/src/shadows/renderSunlight.js +46 -0
  377. package/src/shadows/resizeSunlight.js +15 -0
  378. package/src/shadows/shadowBounds.js +32 -0
  379. package/src/shadows/shadowCacheMatches.js +23 -0
  380. package/src/shadows/shadowMatrix.js +39 -0
  381. package/src/sources/addGeneratedTriangle.js +6 -0
  382. package/src/sources/addTriangle.js +17 -0
  383. package/src/sources/attachAreaMesh.js +58 -0
  384. package/src/sources/buildArea.js +42 -0
  385. package/src/sources/buildAreaFeature.js +41 -0
  386. package/src/sources/buildAreaPoint.js +25 -0
  387. package/src/sources/buildAreaPolygon.js +29 -0
  388. package/src/sources/compareAreaDistance.js +4 -0
  389. package/src/sources/generateTreeGeometry.js +11 -0
  390. package/src/sources/groundOffset.js +3 -0
  391. package/src/sources/initializeGeoJSON.js +8 -0
  392. package/src/sources/instanceAreaGeometry.js +29 -0
  393. package/src/sources/projectRing.js +20 -0
  394. package/src/sources/projectedTree.js +13 -0
  395. package/src/sources/pump.js +54 -0
  396. package/src/sources/releaseArea.js +22 -0
  397. package/src/sources/setGeoJSONData.js +12 -0
  398. package/src/sources/setGeoJSONLayerData.js +5 -0
  399. package/src/sources/sourceAreaContext.js +9 -0
  400. package/src/sources/updateArea.js +45 -0
  401. package/src/sources/updateStatus.js +12 -0
  402. package/src/sunlight/addTimeLayer.js +3 -0
  403. package/src/sunlight/addTo.js +10 -0
  404. package/src/sunlight/atmosphere.js +28 -0
  405. package/src/sunlight/initSunlight.js +14 -0
  406. package/src/sunlight/initialize.js +11 -0
  407. package/src/sunlight/mix.js +6 -0
  408. package/src/sunlight/onAdd.js +5 -0
  409. package/src/sunlight/onAddSun.js +66 -0
  410. package/src/sunlight/remove.js +7 -0
  411. package/src/sunlight/removeSun.js +15 -0
  412. package/src/sunlight/removeTimeLayer.js +3 -0
  413. package/src/sunlight/render.js +7 -0
  414. package/src/sunlight/rgb.js +6 -0
  415. package/src/sunlight/styleTimeControl.js +7 -0
  416. package/src/sunlight/tickSun.js +5 -0
  417. package/src/sunlight/updateSky.js +20 -0
  418. package/src/sunlight/updateSun.js +34 -0
  419. package/src/sunlight/useLiveTime.js +6 -0
  420. package/src/sunlight/useSelectedTime.js +20 -0
  421. package/src/terrain/clearLayerTerrain.js +5 -0
  422. package/src/terrain/getElevation.js +10 -0
  423. package/src/terrain/initTerrain.js +20 -0
  424. package/src/terrain/loadReadyTerrain.js +5 -0
  425. package/src/terrain/loadTerrain.js +63 -0
  426. package/src/terrain/loadTerrainTiles.js +13 -0
  427. package/src/terrain/onTerrainAdd.js +21 -0
  428. package/src/terrain/onTerrainChange.js +14 -0
  429. package/src/terrain/onTerrainRemove.js +41 -0
  430. package/src/terrain/readBridges.js +4 -0
  431. package/src/terrain/sample.js +7 -0
  432. package/src/terrain/setLayerTerrain.js +5 -0
  433. package/src/terrain/terrainAtlas.js +23 -0
  434. package/src/terrain/terrainElevation.js +20 -0
  435. package/src/terrain/terrainGrid.js +24 -0
  436. package/src/traffic/addTraffic.js +7 -0
  437. package/src/traffic/along.js +14 -0
  438. package/src/traffic/clockMinutes.js +6 -0
  439. package/src/traffic/compareDepartures.js +5 -0
  440. package/src/traffic/createTrafficMesh.js +7 -0
  441. package/src/traffic/destroyTrafficGpu.js +5 -0
  442. package/src/traffic/disposeTrafficObject.js +13 -0
  443. package/src/traffic/drawTrafficRoute.js +6 -0
  444. package/src/traffic/failTraffic.js +6 -0
  445. package/src/traffic/failedTrafficLoad.js +5 -0
  446. package/src/traffic/fetchTrafficLanes.js +10 -0
  447. package/src/traffic/groundTraffic.js +15 -0
  448. package/src/traffic/initTraffic.js +54 -0
  449. package/src/traffic/loadTraffic.js +15 -0
  450. package/src/traffic/loadedTrafficLanes.js +16 -0
  451. package/src/traffic/locateTraffic.js +9 -0
  452. package/src/traffic/moveTraffic.js +15 -0
  453. package/src/traffic/placeTraffic.js +21 -0
  454. package/src/traffic/prepareTraffic.js +25 -0
  455. package/src/traffic/readyTraffic.js +6 -0
  456. package/src/traffic/rebaseTraffic.js +58 -0
  457. package/src/traffic/rebuildTrafficMesh.js +28 -0
  458. package/src/traffic/removeTraffic.js +17 -0
  459. package/src/traffic/routeColor.js +6 -0
  460. package/src/traffic/routeGeometry.js +31 -0
  461. package/src/traffic/scheduledTrips.js +40 -0
  462. package/src/traffic/startTraffic.js +8 -0
  463. package/src/traffic/tickTraffic.js +57 -0
  464. package/src/traffic/toLanes.js +16 -0
  465. package/src/traffic/tooltip.js +11 -0
  466. package/src/traffic/trafficBounds.js +17 -0
  467. package/src/traffic/trafficNow.js +4 -0
  468. package/src/traffic/trafficStorage.js +5 -0
  469. package/src/traffic/tripsAt.js +27 -0
  470. package/src/traffic/updateTraffic.js +8 -0
  471. package/src/traffic/updateTrafficTerrain.js +12 -0
  472. package/src/traffic/vehicleOffsets.js +11 -0
  473. package/src/triangulation/area.js +9 -0
  474. package/src/triangulation/clean.js +18 -0
  475. package/src/triangulation/containsVertex.js +11 -0
  476. package/src/triangulation/cross.js +3 -0
  477. package/src/triangulation/crossesBoundary.js +8 -0
  478. package/src/triangulation/crossesRing.js +9 -0
  479. package/src/triangulation/equal.js +3 -0
  480. package/src/triangulation/inside.js +10 -0
  481. package/src/triangulation/insideHole.js +7 -0
  482. package/src/triangulation/intersects.js +11 -0
  483. package/src/triangulation/isClockWise.js +13 -0
  484. package/src/triangulation/minimumX.js +6 -0
  485. package/src/triangulation/on.js +4 -0
  486. package/src/triangulation/sortHoles.js +26 -0
  487. package/src/triangulation/triangulate.js +86 -0
  488. package/src/utils/channel.js +2 -2
  489. package/src/utils/compareDistance.js +3 -0
  490. package/src/utils/noOperation.js +1 -0
  491. package/src/utils/toSRGB.js +3 -1
  492. package/src/utils/wrap.js +3 -1
  493. package/src/vehicles/bicycleModel.js +23 -0
  494. package/src/vehicles/boatBenches.js +8 -0
  495. package/src/vehicles/boatModel.js +27 -0
  496. package/src/vehicles/busModel.js +6 -0
  497. package/src/vehicles/carModel.js +22 -0
  498. package/src/vehicles/carriage.js +19 -0
  499. package/src/vehicles/metroModel.js +9 -0
  500. package/src/vehicles/mirror.js +8 -0
  501. package/src/vehicles/pedestrianModel.js +17 -0
  502. package/src/vehicles/tramModel.js +9 -0
  503. package/src/walk/blocked.js +6 -0
  504. package/src/walk/createWalk.js +60 -0
  505. package/src/walk/initWalk.js +18 -0
  506. package/src/walk/initialize.js +6 -0
  507. package/src/walk/local.js +10 -0
  508. package/src/walk/onAdd.js +4 -0
  509. package/src/walk/onBlur.js +3 -0
  510. package/src/walk/onKey.js +12 -0
  511. package/src/walk/onPointer.js +13 -0
  512. package/src/walk/onRemove.js +4 -0
  513. package/src/walk/onTerrain.js +5 -0
  514. package/src/walk/place.js +18 -0
  515. package/src/walk/start.js +37 -0
  516. package/src/walk/step.js +53 -0
  517. package/src/walk/stop.js +27 -0
  518. package/src/walk/toggle.js +6 -0
  519. package/dist/utils/CELL.js +0 -2
  520. package/dist/utils/CELL.js.map +0 -7
  521. package/dist/utils/addBridges.js +0 -2
  522. package/dist/utils/addBridges.js.map +0 -7
  523. package/dist/utils/addRasterTile.js +0 -2
  524. package/dist/utils/addRasterTile.js.map +0 -7
  525. package/dist/utils/along.js +0 -2
  526. package/dist/utils/along.js.map +0 -7
  527. package/dist/utils/atmosphere.js +0 -2
  528. package/dist/utils/atmosphere.js.map +0 -7
  529. package/dist/utils/attach.js +0 -2
  530. package/dist/utils/attach.js.map +0 -7
  531. package/dist/utils/bindSunlight.js +0 -2
  532. package/dist/utils/bindSunlight.js.map +0 -7
  533. package/dist/utils/box.js +0 -2
  534. package/dist/utils/box.js.map +0 -7
  535. package/dist/utils/bridgeElevation.js +0 -2
  536. package/dist/utils/bridgeElevation.js.map +0 -7
  537. package/dist/utils/build.js +0 -2
  538. package/dist/utils/build.js.map +0 -7
  539. package/dist/utils/cameraControls.js +0 -2
  540. package/dist/utils/cameraControls.js.map +0 -7
  541. package/dist/utils/channel.js +0 -2
  542. package/dist/utils/channel.js.map +0 -7
  543. package/dist/utils/collider.js +0 -2
  544. package/dist/utils/collider.js.map +0 -7
  545. package/dist/utils/colliders.js +0 -2
  546. package/dist/utils/colliders.js.map +0 -7
  547. package/dist/utils/computeBounds.js +0 -2
  548. package/dist/utils/computeBounds.js.map +0 -7
  549. package/dist/utils/conformModelToTerrain.js +0 -2
  550. package/dist/utils/conformModelToTerrain.js.map +0 -7
  551. package/dist/utils/createMesh.js +0 -2
  552. package/dist/utils/createMesh.js.map +0 -7
  553. package/dist/utils/createProgram.js +0 -3
  554. package/dist/utils/createProgram.js.map +0 -7
  555. package/dist/utils/decodeDirectory.js +0 -2
  556. package/dist/utils/decodeDirectory.js.map +0 -7
  557. package/dist/utils/decodeHeader.js +0 -2
  558. package/dist/utils/decodeHeader.js.map +0 -7
  559. package/dist/utils/decodeModel.js +0 -2
  560. package/dist/utils/decodeModel.js.map +0 -7
  561. package/dist/utils/decompress.js +0 -2
  562. package/dist/utils/decompress.js.map +0 -7
  563. package/dist/utils/destroyTexture.js +0 -2
  564. package/dist/utils/destroyTexture.js.map +0 -7
  565. package/dist/utils/disposeMesh.js +0 -2
  566. package/dist/utils/disposeMesh.js.map +0 -7
  567. package/dist/utils/drawGeometry.js +0 -2
  568. package/dist/utils/drawGeometry.js.map +0 -7
  569. package/dist/utils/elevationWGSL.js +0 -24
  570. package/dist/utils/elevationWGSL.js.map +0 -7
  571. package/dist/utils/emptyNode.js +0 -2
  572. package/dist/utils/emptyNode.js.map +0 -7
  573. package/dist/utils/endZoom.js +0 -2
  574. package/dist/utils/endZoom.js.map +0 -7
  575. package/dist/utils/findFeature.js +0 -2
  576. package/dist/utils/findFeature.js.map +0 -7
  577. package/dist/utils/geometry.js +0 -1
  578. package/dist/utils/geometry.js.map +0 -7
  579. package/dist/utils/getElevation.js +0 -2
  580. package/dist/utils/getElevation.js.map +0 -7
  581. package/dist/utils/getHeader.js +0 -2
  582. package/dist/utils/getHeader.js.map +0 -7
  583. package/dist/utils/getZxy.js +0 -2
  584. package/dist/utils/getZxy.js.map +0 -7
  585. package/dist/utils/glass.js +0 -2
  586. package/dist/utils/glass.js.map +0 -7
  587. package/dist/utils/headlight.js +0 -2
  588. package/dist/utils/headlight.js.map +0 -7
  589. package/dist/utils/hit.js +0 -2
  590. package/dist/utils/hit.js.map +0 -7
  591. package/dist/utils/horizontalPosition.js +0 -2
  592. package/dist/utils/horizontalPosition.js.map +0 -7
  593. package/dist/utils/horizontalRay.js +0 -2
  594. package/dist/utils/horizontalRay.js.map +0 -7
  595. package/dist/utils/hull.js +0 -2
  596. package/dist/utils/hull.js.map +0 -7
  597. package/dist/utils/initSunlight.js +0 -2
  598. package/dist/utils/initSunlight.js.map +0 -7
  599. package/dist/utils/initTerrain.js +0 -2
  600. package/dist/utils/initTerrain.js.map +0 -7
  601. package/dist/utils/initTraffic.js +0 -40
  602. package/dist/utils/initTraffic.js.map +0 -7
  603. package/dist/utils/initWalk.js +0 -2
  604. package/dist/utils/initWalk.js.map +0 -7
  605. package/dist/utils/intersectMeshes.js +0 -2
  606. package/dist/utils/intersectMeshes.js.map +0 -7
  607. package/dist/utils/isClockWise.js +0 -2
  608. package/dist/utils/isClockWise.js.map +0 -7
  609. package/dist/utils/lampPostGeometry.js +0 -2
  610. package/dist/utils/lampPostGeometry.js.map +0 -7
  611. package/dist/utils/lightGeometry.js +0 -2
  612. package/dist/utils/lightGeometry.js.map +0 -7
  613. package/dist/utils/lightGrid.js +0 -2
  614. package/dist/utils/lightGrid.js.map +0 -7
  615. package/dist/utils/limbs.js +0 -2
  616. package/dist/utils/limbs.js.map +0 -7
  617. package/dist/utils/loadModel.js +0 -2
  618. package/dist/utils/loadModel.js.map +0 -7
  619. package/dist/utils/loadSource.js +0 -2
  620. package/dist/utils/loadSource.js.map +0 -7
  621. package/dist/utils/loadTerrain.js +0 -2
  622. package/dist/utils/loadTerrain.js.map +0 -7
  623. package/dist/utils/mapCamera.js +0 -2
  624. package/dist/utils/mapCamera.js.map +0 -7
  625. package/dist/utils/materialShaders.js +0 -211
  626. package/dist/utils/materialShaders.js.map +0 -7
  627. package/dist/utils/mirror.js +0 -2
  628. package/dist/utils/mirror.js.map +0 -7
  629. package/dist/utils/moonPosition.js +0 -2
  630. package/dist/utils/moonPosition.js.map +0 -7
  631. package/dist/utils/moves.js +0 -2
  632. package/dist/utils/moves.js.map +0 -7
  633. package/dist/utils/nativeEvents.js +0 -2
  634. package/dist/utils/nativeEvents.js.map +0 -7
  635. package/dist/utils/nativeGeometry.js +0 -2
  636. package/dist/utils/nativeGeometry.js.map +0 -7
  637. package/dist/utils/nativeLayer.js +0 -2
  638. package/dist/utils/nativeLayer.js.map +0 -7
  639. package/dist/utils/nodeMatrix.js +0 -2
  640. package/dist/utils/nodeMatrix.js.map +0 -7
  641. package/dist/utils/onAdd3DLayer.js +0 -2
  642. package/dist/utils/onAdd3DLayer.js.map +0 -7
  643. package/dist/utils/onAddSun.js +0 -2
  644. package/dist/utils/onAddSun.js.map +0 -7
  645. package/dist/utils/onClick.js +0 -2
  646. package/dist/utils/onClick.js.map +0 -7
  647. package/dist/utils/onMapChange.js +0 -2
  648. package/dist/utils/onMapChange.js.map +0 -7
  649. package/dist/utils/onPMTileAdd.js +0 -2
  650. package/dist/utils/onPMTileAdd.js.map +0 -7
  651. package/dist/utils/onPMTileRemove.js +0 -2
  652. package/dist/utils/onPMTileRemove.js.map +0 -7
  653. package/dist/utils/onPointerLeave.js +0 -2
  654. package/dist/utils/onPointerLeave.js.map +0 -7
  655. package/dist/utils/onPointerMove.js +0 -2
  656. package/dist/utils/onPointerMove.js.map +0 -7
  657. package/dist/utils/onRemove3DLayer.js +0 -2
  658. package/dist/utils/onRemove3DLayer.js.map +0 -7
  659. package/dist/utils/onRemoveSun.js +0 -2
  660. package/dist/utils/onRemoveSun.js.map +0 -7
  661. package/dist/utils/onTerrainAdd.js +0 -2
  662. package/dist/utils/onTerrainAdd.js.map +0 -7
  663. package/dist/utils/onTerrainChange.js +0 -2
  664. package/dist/utils/onTerrainChange.js.map +0 -7
  665. package/dist/utils/onTerrainRemove.js +0 -2
  666. package/dist/utils/onTerrainRemove.js.map +0 -7
  667. package/dist/utils/onZoomAnim.js +0 -2
  668. package/dist/utils/onZoomAnim.js.map +0 -7
  669. package/dist/utils/paints.js +0 -2
  670. package/dist/utils/paints.js.map +0 -7
  671. package/dist/utils/parseColor.js +0 -2
  672. package/dist/utils/parseColor.js.map +0 -7
  673. package/dist/utils/parts.js +0 -2
  674. package/dist/utils/parts.js.map +0 -7
  675. package/dist/utils/projectCelestialBody.js +0 -2
  676. package/dist/utils/projectCelestialBody.js.map +0 -7
  677. package/dist/utils/pump.js +0 -2
  678. package/dist/utils/pump.js.map +0 -7
  679. package/dist/utils/rasterTiles.js +0 -2
  680. package/dist/utils/rasterTiles.js.map +0 -7
  681. package/dist/utils/raycast.js +0 -2
  682. package/dist/utils/raycast.js.map +0 -7
  683. package/dist/utils/read.js +0 -2
  684. package/dist/utils/read.js.map +0 -7
  685. package/dist/utils/readAccessor.js +0 -2
  686. package/dist/utils/readAccessor.js.map +0 -7
  687. package/dist/utils/releaseArea.js +0 -2
  688. package/dist/utils/releaseArea.js.map +0 -7
  689. package/dist/utils/removeRasterTile.js +0 -2
  690. package/dist/utils/removeRasterTile.js.map +0 -7
  691. package/dist/utils/render.js +0 -15
  692. package/dist/utils/render.js.map +0 -7
  693. package/dist/utils/renderSunlight.js +0 -13
  694. package/dist/utils/renderSunlight.js.map +0 -7
  695. package/dist/utils/renderers.js +0 -2
  696. package/dist/utils/renderers.js.map +0 -7
  697. package/dist/utils/resizeSunlight.js +0 -2
  698. package/dist/utils/resizeSunlight.js.map +0 -7
  699. package/dist/utils/roofCoverage.js +0 -2
  700. package/dist/utils/roofCoverage.js.map +0 -7
  701. package/dist/utils/routeGeometry.js +0 -2
  702. package/dist/utils/routeGeometry.js.map +0 -7
  703. package/dist/utils/scheduledTrips.js +0 -2
  704. package/dist/utils/scheduledTrips.js.map +0 -7
  705. package/dist/utils/setGeoJSONData.js +0 -2
  706. package/dist/utils/setGeoJSONData.js.map +0 -7
  707. package/dist/utils/setHighlight.js +0 -2
  708. package/dist/utils/setHighlight.js.map +0 -7
  709. package/dist/utils/setPMTileOpacity.js +0 -2
  710. package/dist/utils/setPMTileOpacity.js.map +0 -7
  711. package/dist/utils/setPMTileZIndex.js +0 -2
  712. package/dist/utils/setPMTileZIndex.js.map +0 -7
  713. package/dist/utils/setParent.js +0 -2
  714. package/dist/utils/setParent.js.map +0 -7
  715. package/dist/utils/setTerrainHeight.js +0 -2
  716. package/dist/utils/setTerrainHeight.js.map +0 -7
  717. package/dist/utils/setVertexColor.js +0 -2
  718. package/dist/utils/setVertexColor.js.map +0 -7
  719. package/dist/utils/showFeature.js +0 -2
  720. package/dist/utils/showFeature.js.map +0 -7
  721. package/dist/utils/sizes.js +0 -2
  722. package/dist/utils/sizes.js.map +0 -7
  723. package/dist/utils/skin.js +0 -2
  724. package/dist/utils/skin.js.map +0 -7
  725. package/dist/utils/solarPosition.js +0 -2
  726. package/dist/utils/solarPosition.js.map +0 -7
  727. package/dist/utils/sortMeshes.js +0 -2
  728. package/dist/utils/sortMeshes.js.map +0 -7
  729. package/dist/utils/speed.js +0 -2
  730. package/dist/utils/speed.js.map +0 -7
  731. package/dist/utils/startZoom.js +0 -2
  732. package/dist/utils/startZoom.js.map +0 -7
  733. package/dist/utils/taillight.js +0 -2
  734. package/dist/utils/taillight.js.map +0 -7
  735. package/dist/utils/terrainAtlas.js +0 -2
  736. package/dist/utils/terrainAtlas.js.map +0 -7
  737. package/dist/utils/terrainElevation.js +0 -2
  738. package/dist/utils/terrainElevation.js.map +0 -7
  739. package/dist/utils/terrainGrid.js +0 -2
  740. package/dist/utils/terrainGrid.js.map +0 -7
  741. package/dist/utils/textureSampler.js +0 -2
  742. package/dist/utils/textureSampler.js.map +0 -7
  743. package/dist/utils/tileId.js +0 -2
  744. package/dist/utils/tileId.js.map +0 -7
  745. package/dist/utils/toLanes.js +0 -2
  746. package/dist/utils/toLanes.js.map +0 -7
  747. package/dist/utils/toSRGB.js +0 -2
  748. package/dist/utils/toSRGB.js.map +0 -7
  749. package/dist/utils/tooltip.js +0 -3
  750. package/dist/utils/tooltip.js.map +0 -7
  751. package/dist/utils/traffic.js +0 -2
  752. package/dist/utils/traffic.js.map +0 -7
  753. package/dist/utils/traverse.js +0 -2
  754. package/dist/utils/traverse.js.map +0 -7
  755. package/dist/utils/treeGeometry.js +0 -2
  756. package/dist/utils/treeGeometry.js.map +0 -7
  757. package/dist/utils/triangulate.js +0 -2
  758. package/dist/utils/triangulate.js.map +0 -7
  759. package/dist/utils/tripsAt.js +0 -2
  760. package/dist/utils/tripsAt.js.map +0 -7
  761. package/dist/utils/types.js +0 -2
  762. package/dist/utils/types.js.map +0 -7
  763. package/dist/utils/underEntry.js +0 -2
  764. package/dist/utils/underEntry.js.map +0 -7
  765. package/dist/utils/update.js +0 -2
  766. package/dist/utils/update.js.map +0 -7
  767. package/dist/utils/updateArea.js +0 -2
  768. package/dist/utils/updateArea.js.map +0 -7
  769. package/dist/utils/updateCamera.js +0 -2
  770. package/dist/utils/updateCamera.js.map +0 -7
  771. package/dist/utils/updatePointLights.js +0 -2
  772. package/dist/utils/updatePointLights.js.map +0 -7
  773. package/dist/utils/updateWorldMatrix.js +0 -2
  774. package/dist/utils/updateWorldMatrix.js.map +0 -7
  775. package/dist/utils/vehicleOffsets.js +0 -2
  776. package/dist/utils/vehicleOffsets.js.map +0 -7
  777. package/dist/utils/vehicles.js +0 -2
  778. package/dist/utils/vehicles.js.map +0 -7
  779. package/dist/utils/vertexNormals.js +0 -2
  780. package/dist/utils/vertexNormals.js.map +0 -7
  781. package/dist/utils/walk.js +0 -2
  782. package/dist/utils/walk.js.map +0 -7
  783. package/dist/utils/white.js +0 -2
  784. package/dist/utils/white.js.map +0 -7
  785. package/dist/utils/worldLights.js +0 -2
  786. package/dist/utils/worldLights.js.map +0 -7
  787. package/dist/utils/wrap.js +0 -2
  788. package/dist/utils/wrap.js.map +0 -7
  789. package/src/utils/addBridges.js +0 -66
  790. package/src/utils/addRasterTile.js +0 -112
  791. package/src/utils/along.js +0 -9
  792. package/src/utils/atmosphere.js +0 -20
  793. package/src/utils/attach.js +0 -255
  794. package/src/utils/bindSunlight.js +0 -12
  795. package/src/utils/box.js +0 -1
  796. package/src/utils/bridgeElevation.js +0 -18
  797. package/src/utils/build.js +0 -20
  798. package/src/utils/cameraControls.js +0 -287
  799. package/src/utils/collider.js +0 -62
  800. package/src/utils/computeBounds.js +0 -17
  801. package/src/utils/conformModelToTerrain.js +0 -69
  802. package/src/utils/createMesh.js +0 -31
  803. package/src/utils/createProgram.js +0 -92
  804. package/src/utils/decodeDirectory.js +0 -40
  805. package/src/utils/decodeHeader.js +0 -15
  806. package/src/utils/decodeModel.js +0 -43
  807. package/src/utils/destroyTexture.js +0 -7
  808. package/src/utils/disposeMesh.js +0 -13
  809. package/src/utils/drawGeometry.js +0 -122
  810. package/src/utils/elevationWGSL.js +0 -27
  811. package/src/utils/emptyNode.js +0 -9
  812. package/src/utils/endZoom.js +0 -15
  813. package/src/utils/findFeature.js +0 -49
  814. package/src/utils/geometry.js +0 -2
  815. package/src/utils/getElevation.js +0 -10
  816. package/src/utils/getZxy.js +0 -76
  817. package/src/utils/glass.js +0 -1
  818. package/src/utils/hit.js +0 -41
  819. package/src/utils/initSunlight.js +0 -9
  820. package/src/utils/initTerrain.js +0 -19
  821. package/src/utils/initTraffic.js +0 -93
  822. package/src/utils/initWalk.js +0 -72
  823. package/src/utils/intersectMeshes.js +0 -121
  824. package/src/utils/isClockWise.js +0 -12
  825. package/src/utils/lampPostGeometry.js +0 -26
  826. package/src/utils/lightGeometry.js +0 -22
  827. package/src/utils/lightGrid.js +0 -50
  828. package/src/utils/loadModel.js +0 -217
  829. package/src/utils/loadTerrain.js +0 -65
  830. package/src/utils/mapCamera.js +0 -432
  831. package/src/utils/materialShaders.js +0 -243
  832. package/src/utils/mirror.js +0 -6
  833. package/src/utils/nativeEvents.js +0 -77
  834. package/src/utils/nativeGeometry.js +0 -131
  835. package/src/utils/nativeLayer.js +0 -317
  836. package/src/utils/onAdd3DLayer.js +0 -31
  837. package/src/utils/onAddSun.js +0 -147
  838. package/src/utils/onMapChange.js +0 -16
  839. package/src/utils/onPMTileAdd.js +0 -15
  840. package/src/utils/onPMTileRemove.js +0 -8
  841. package/src/utils/onRemove3DLayer.js +0 -78
  842. package/src/utils/onRemoveSun.js +0 -3
  843. package/src/utils/onTerrainAdd.js +0 -18
  844. package/src/utils/onTerrainChange.js +0 -13
  845. package/src/utils/onTerrainRemove.js +0 -40
  846. package/src/utils/onZoomAnim.js +0 -14
  847. package/src/utils/parts.js +0 -16
  848. package/src/utils/pump.js +0 -226
  849. package/src/utils/rasterTiles.js +0 -285
  850. package/src/utils/raycast.js +0 -60
  851. package/src/utils/readAccessor.js +0 -68
  852. package/src/utils/releaseArea.js +0 -34
  853. package/src/utils/removeRasterTile.js +0 -13
  854. package/src/utils/render.js +0 -406
  855. package/src/utils/renderSunlight.js +0 -170
  856. package/src/utils/resizeSunlight.js +0 -15
  857. package/src/utils/roofCoverage.js +0 -47
  858. package/src/utils/routeGeometry.js +0 -22
  859. package/src/utils/scheduledTrips.js +0 -29
  860. package/src/utils/setGeoJSONData.js +0 -11
  861. package/src/utils/setHighlight.js +0 -13
  862. package/src/utils/setPMTileOpacity.js +0 -7
  863. package/src/utils/setPMTileZIndex.js +0 -7
  864. package/src/utils/setVertexColor.js +0 -14
  865. package/src/utils/showFeature.js +0 -27
  866. package/src/utils/skin.js +0 -2
  867. package/src/utils/sortMeshes.js +0 -12
  868. package/src/utils/terrainAtlas.js +0 -21
  869. package/src/utils/terrainElevation.js +0 -20
  870. package/src/utils/terrainGrid.js +0 -23
  871. package/src/utils/tileId.js +0 -18
  872. package/src/utils/toLanes.js +0 -7
  873. package/src/utils/tooltip.js +0 -6
  874. package/src/utils/traffic.js +0 -315
  875. package/src/utils/traverse.js +0 -6
  876. package/src/utils/treeGeometry.js +0 -45
  877. package/src/utils/triangulate.js +0 -100
  878. package/src/utils/tripsAt.js +0 -16
  879. package/src/utils/underEntry.js +0 -17
  880. package/src/utils/update.js +0 -18
  881. package/src/utils/updateArea.js +0 -40
  882. package/src/utils/updateCamera.js +0 -32
  883. package/src/utils/updatePointLights.js +0 -38
  884. package/src/utils/updateWorldMatrix.js +0 -47
  885. package/src/utils/vehicleOffsets.js +0 -8
  886. package/src/utils/vehicles.js +0 -65
  887. package/src/utils/vertexNormals.js +0 -30
  888. package/src/utils/walk.js +0 -187
  889. package/src/utils/worldLights.js +0 -25
  890. /package/src/{utils → archives}/decompress.js +0 -0
  891. /package/src/{utils → archives}/getHeader.js +0 -0
  892. /package/src/{utils → archives}/loadSource.js +0 -0
  893. /package/src/{utils → archives}/read.js +0 -0
  894. /package/src/{utils → collision}/horizontalRay.js +0 -0
  895. /package/src/{utils → constants}/CELL.js +0 -0
  896. /package/src/{utils/sizes.js → constants/accessorSizes.js} +0 -0
  897. /package/src/{utils/types.js → constants/accessorTypes.js} +0 -0
  898. /package/src/{utils → constants}/colliders.js +0 -0
  899. /package/src/{utils → constants}/headlight.js +0 -0
  900. /package/src/{utils → constants}/hull.js +0 -0
  901. /package/src/{utils → constants}/limbs.js +0 -0
  902. /package/src/{utils → constants}/moves.js +0 -0
  903. /package/src/{utils → constants}/paints.js +0 -0
  904. /package/src/{utils → constants}/renderers.js +0 -0
  905. /package/src/{utils → constants}/speed.js +0 -0
  906. /package/src/{utils → constants}/taillight.js +0 -0
  907. /package/src/{utils → constants}/white.js +0 -0
  908. /package/src/{utils → models}/nodeMatrix.js +0 -0
  909. /package/src/{utils → models}/textureSampler.js +0 -0
  910. /package/src/{utils → picking}/onClick.js +0 -0
  911. /package/src/{utils → picking}/onPointerLeave.js +0 -0
  912. /package/src/{utils → picking}/onPointerMove.js +0 -0
  913. /package/src/{utils → scene}/setParent.js +0 -0
  914. /package/src/{utils → scene}/startZoom.js +0 -0
  915. /package/src/{utils → sunlight}/horizontalPosition.js +0 -0
  916. /package/src/{utils → sunlight}/moonPosition.js +0 -0
  917. /package/src/{utils → sunlight}/projectCelestialBody.js +0 -0
  918. /package/src/{utils → sunlight}/solarPosition.js +0 -0
  919. /package/src/{utils → terrain}/setTerrainHeight.js +0 -0
package/src/utils/wrap.js CHANGED
@@ -1 +1,3 @@
1
- export const wrap = angle => Math.atan2(Math.sin(angle), Math.cos(angle));
1
+ export function wrap(angle) {
2
+ return Math.atan2(Math.sin(angle), Math.cos(angle));
3
+ }
@@ -0,0 +1,23 @@
1
+ import { box } from '../geometry/box.js';
2
+ import { skin } from '../constants/skin.js';
3
+ import { trousers } from '../constants/trousers.js';
4
+ import { dark } from '../constants/dark.js';
5
+ import { paints } from '../constants/paints.js';
6
+
7
+ export function bicycleModel(index) {
8
+ const paint = paints[index % paints.length];
9
+ return [
10
+ [box(-0.045, 0.045, -0.85, -0.25), 0.02, 0.62, dark],
11
+ [box(-0.045, 0.045, 0.25, 0.85), 0.02, 0.62, dark],
12
+ [box(-0.06, 0.06, -0.5, 0.5), 0.4, 0.65, paint],
13
+ [box(-0.32, 0.32, -0.58, -0.5), 0.95, 1.02, dark],
14
+ [box(-0.1, 0.1, 0.15, 0.4), 0.85, 0.92, dark],
15
+ [box(-0.18, 0.18, -0.12, 0.28), 1, 1.5, paint],
16
+ [box(-0.11, 0.11, -0.22, 0), 1.5, 1.72, skin],
17
+ [box(-0.13, 0.13, -0.23, 0.01), 1.72, 1.8, paint],
18
+ [box(-0.25, -0.15, -0.5, -0.05), 1, 1.25, skin],
19
+ [box(0.15, 0.25, -0.5, -0.05), 1, 1.25, skin],
20
+ [box(-0.2, -0.08, 0, 0.32), 0.3, 1, trousers],
21
+ [box(0.08, 0.2, -0.25, 0.07), 0.3, 1, trousers],
22
+ ];
23
+ }
@@ -0,0 +1,8 @@
1
+ import { mirror } from './mirror.js';
2
+
3
+ export function boatBenches() {
4
+ const benches = [];
5
+ let i;
6
+ for (i = 0; i < 12; i++) benches.push(...mirror(0.5, 3.8, -12 + i * 3, -11.3 + i * 3, 3.9, 4.4, [0.62, 0.1, 0.1]));
7
+ return benches;
8
+ }
@@ -0,0 +1,27 @@
1
+ import { hull } from '../constants/hull.js';
2
+ import { box } from '../geometry/box.js';
3
+ import { glass } from '../constants/glass.js';
4
+ import { mirror } from './mirror.js';
5
+ import { white } from '../constants/white.js';
6
+ import { boatBenches } from './boatBenches.js';
7
+
8
+ // Panoramic river cruiser, about 60 x 11 m.
9
+ export function boatModel() {
10
+ return [
11
+ [hull, 0, 0.8, [0.1, 0.16, 0.26]],
12
+ [hull, 0.8, 1.4, white],
13
+ [box(-5, 5, -18, 26), 1.4, 3.7, glass, box(-4.6, 4.6, -17.4, 25.6)],
14
+ ...mirror(4.64, 4.74, -17, 25, 3.25, 3.45, [1.6, 1.25, 0.8]),
15
+ [box(-4.8, 4.8, -17.8, 25.8), 3.7, 3.9, white],
16
+ ...boatBenches(),
17
+ ...mirror(4.65, 4.8, -13.6, 25.8, 3.9, 4.8, white),
18
+ [box(-4.8, 4.8, 25.65, 25.8), 3.9, 4.8, white],
19
+ [box(-2.2, 2.2, -17.6, -14), 3.9, 4.7, white],
20
+ [box(-2.2, 2.2, -17.6, -14), 4.7, 5.5, glass],
21
+ [box(-2.5, 2.5, -18, -13.6), 5.5, 5.7, white],
22
+ [box(-2.45, -2.2, -16.2, -15.8), 5, 5.3, [2, 0.15, 0.1]],
23
+ [box(2.2, 2.45, -16.2, -15.8), 5, 5.3, [0.1, 2, 0.4]],
24
+ [box(-0.1, 0.1, -15.9, -15.7), 5.7, 6.6, white],
25
+ [box(-0.15, 0.15, -15.95, -15.65), 6.6, 6.8, [2, 2, 1.9]],
26
+ ];
27
+ }
@@ -0,0 +1,6 @@
1
+ import { routeColor } from '../traffic/routeColor.js';
2
+ import { carriage } from './carriage.js';
3
+
4
+ export function busModel(index, properties) {
5
+ return carriage(0, 12, routeColor(properties));
6
+ }
@@ -0,0 +1,22 @@
1
+ import { box } from '../geometry/box.js';
2
+ import { glass } from '../constants/glass.js';
3
+ import { tyre } from '../constants/tyre.js';
4
+ import { mirror } from './mirror.js';
5
+ import { paints } from '../constants/paints.js';
6
+ import { headlight } from '../constants/headlight.js';
7
+ import { taillight } from '../constants/taillight.js';
8
+
9
+ export function carModel(i) {
10
+ const paint = paints[i % paints.length];
11
+ return [
12
+ ...mirror(0.7, 0.92, -1.68, -1.02, 0, 0.64, tyre),
13
+ ...mirror(0.7, 0.92, 1.02, 1.68, 0, 0.64, tyre),
14
+ [[[-0.9, -1.95], [-0.72, -2.25], [0.72, -2.25], [0.9, -1.95], [0.9, 2.05], [0.76, 2.25], [-0.76, 2.25], [-0.9, 2.05]],
15
+ 0.28, 0.82, paint],
16
+ // Greenhouse: the windscreen leans back, the rear window less.
17
+ [box(-0.84, 0.84, -0.75, 1.6), 0.82, 1.38, glass, box(-0.7, 0.7, -0.05, 1.3)],
18
+ [box(-0.71, 0.71, -0.06, 1.31), 1.38, 1.46, paint],
19
+ ...mirror(0.38, 0.8, -2.3, -2.16, 0.56, 0.76, headlight),
20
+ [box(-0.78, 0.78, 2.16, 2.3), 0.6, 0.76, taillight],
21
+ ];
22
+ }
@@ -0,0 +1,19 @@
1
+ import { box } from '../geometry/box.js';
2
+ import { glass } from '../constants/glass.js';
3
+ import { tyre } from '../constants/tyre.js';
4
+ import { white } from '../constants/white.js';
5
+ import { headlight } from '../constants/headlight.js';
6
+ import { taillight } from '../constants/taillight.js';
7
+
8
+ export function carriage(center, length, color) {
9
+ const front = center - length / 2, rear = center + length / 2;
10
+ return [
11
+ [box(-1.25, 1.25, front, rear), 0.45, 1.25, color],
12
+ [box(-1.2, 1.2, front + 0.15, rear - 0.15), 1.25, 2.65, glass],
13
+ [box(-1.25, 1.25, front, rear), 2.65, 3.1, white],
14
+ [box(-1.15, -0.85, front + 1, front + 2), 0, 0.7, tyre],
15
+ [box(0.85, 1.15, rear - 2, rear - 1), 0, 0.7, tyre],
16
+ [box(-0.9, 0.9, front - 0.03, front), 0.8, 1.05, headlight],
17
+ [box(-0.9, 0.9, rear, rear + 0.03), 0.8, 1.05, taillight],
18
+ ];
19
+ }
@@ -0,0 +1,9 @@
1
+ import { routeColor } from '../traffic/routeColor.js';
2
+ import { carriage } from './carriage.js';
3
+
4
+ export function metroModel(index, properties) {
5
+ const color = routeColor(properties), parts = [];
6
+ let car;
7
+ for (car = 0; car < 5; car++) parts.push(...carriage((car - 2) * 15, 14, color));
8
+ return parts;
9
+ }
@@ -0,0 +1,8 @@
1
+ import { box } from "../geometry/box.js";
2
+
3
+ export function mirror(x0, x1, z0, z1, ...rest) {
4
+ return [
5
+ [box(x0, x1, z0, z1), ...rest],
6
+ [box(-x1, -x0, z0, z1), ...rest]
7
+ ];
8
+ }
@@ -0,0 +1,17 @@
1
+ import { box } from '../geometry/box.js';
2
+ import { parts } from '../constants/parts.js';
3
+ import { skin } from '../constants/skin.js';
4
+ import { trousers } from '../constants/trousers.js';
5
+ import { paints } from '../constants/paints.js';
6
+
7
+ export function pedestrianModel(index) {
8
+ const model = parts.body.slice();
9
+ model[1] = [model[1][0], model[1][1], model[1][2], paints[index % paints.length]];
10
+ model.push(
11
+ [box(-0.16, -0.02, -0.07, 0.07), 0.08, 0.9, trousers],
12
+ [box(0.02, 0.16, -0.07, 0.07), 0.08, 0.9, trousers],
13
+ [box(-0.3, -0.2, -0.05, 0.05), 0.76, 1.42, skin],
14
+ [box(0.2, 0.3, -0.05, 0.05), 0.76, 1.42, skin],
15
+ );
16
+ return model;
17
+ }
@@ -0,0 +1,9 @@
1
+ import { routeColor } from '../traffic/routeColor.js';
2
+ import { carriage } from './carriage.js';
3
+
4
+ export function tramModel(index, properties) {
5
+ const color = routeColor(properties), parts = [];
6
+ let car;
7
+ for (car = 0; car < 5; car++) parts.push(...carriage((car - 2) * 6.5, 6, color));
8
+ return parts;
9
+ }
@@ -0,0 +1,6 @@
1
+ import { hit } from '../picking/hit.js';
2
+
3
+ export function blocked(east, north, feet) {
4
+ const length = Math.hypot(east, north);
5
+ return length > 1e-6 && hit(this.layer, feet[0], feet[1], feet[2], east / length, -north / length, length + 0.3);
6
+ }
@@ -0,0 +1,60 @@
1
+ import { init3D } from '../scene/init3D.js';
2
+ import { onBlur } from './onBlur.js';
3
+ import { onKey } from './onKey.js';
4
+ import { onPointer } from './onPointer.js';
5
+ import { onTerrain } from './onTerrain.js';
6
+ import { start } from './start.js';
7
+ import { step } from './step.js';
8
+ import { stop } from './stop.js';
9
+ import { toggle } from './toggle.js';
10
+
11
+ export function createWalk(control, {
12
+ speed,
13
+ distance,
14
+ ...options
15
+ } = {}) {
16
+ const layer = new L.Layer();
17
+ layer._type = 'walk';
18
+ init3D(layer, options);
19
+ const keys = new Set();
20
+ const container = L.DomUtil.create('div', 'leaflet-bar leaflet-control');
21
+ container.style.cssText = 'display:flex;align-items:center;background:#fff;';
22
+ const button = L.DomUtil.create('button', '', container);
23
+ button.type = 'button';
24
+ button.title = 'Walk';
25
+ button.setAttribute('aria-label', 'Walk');
26
+ button.setAttribute('aria-pressed', 'false');
27
+ button.textContent = '🚶';
28
+ button.style.cssText = 'width:30px;height:30px;padding:0;border:0;border-radius:4px;background:#fff;font-size:18px;line-height:30px;cursor:pointer;';
29
+ const hint = L.DomUtil.create('small', '', container);
30
+ hint.style.cssText = 'display:none;padding:0 8px;color:#333;white-space:nowrap;';
31
+ hint.textContent = 'W/S: run · A/D: turn · drag: look around · Esc: exit';
32
+ L.DomEvent.disableClickPropagation(container);
33
+
34
+ const context = {
35
+ layer,
36
+ speed,
37
+ distance,
38
+ keys,
39
+ container,
40
+ button,
41
+ hint,
42
+ meshes: null,
43
+ frame: null,
44
+ last: undefined,
45
+ swing: 0,
46
+ saved: null,
47
+ drag: null,
48
+ state: control.walker = layer.walker = { latlng: null, heading: 0, phase: 0 }
49
+ }
50
+ context.step = step.bind(context);
51
+ context.onKey = onKey.bind(context);
52
+ context.onBlur = onBlur.bind(context);
53
+ context.onPointer = onPointer.bind(context);
54
+ context.onTerrain = onTerrain.bind(context);
55
+ context.start = start.bind(context);
56
+ context.stop = stop.bind(context);
57
+ context.toggle = toggle.bind(context);
58
+ control._walk = context;
59
+ L.DomEvent.on(button, 'click', context.toggle);
60
+ }
@@ -0,0 +1,18 @@
1
+ import { initialize } from './initialize.js';
2
+ import { onAdd } from './onAdd.js';
3
+ import { onRemove } from './onRemove.js';
4
+
5
+ /**
6
+ * Third-person walk mode, toggled by a map button (and Esc): a pedestrian at the map centre runs with W/S (or ↑/↓) and
7
+ * turns with A/D (or ←/→); the camera swings back behind it while it moves. Dragging the map only turns the camera
8
+ * (bearing, pitch); the wheel changes the camera distance.
9
+ * The walker follows the terrain, bridges included, and `control.walker` exposes `{ latlng, heading, phase }`.
10
+ * Options: `speed` (m/s, default 70), `distance` (camera distance in metres, default 20), `position` (button corner, default 'bottomright').
11
+ * Visible meshes of the other 3D layers (buildings, trees, models, streetlights) are solid; terrain and traffic are not.
12
+ */
13
+ L.Control.Walk = L.Control.extend({
14
+ options: { position: 'bottomright', speed: 70, distance: 20 },
15
+ initialize,
16
+ onAdd,
17
+ onRemove,
18
+ });
@@ -0,0 +1,6 @@
1
+ import { createWalk } from './createWalk.js';
2
+
3
+ export function initialize(options) {
4
+ L.Util.setOptions(this, options);
5
+ createWalk(this, this.options);
6
+ }
@@ -0,0 +1,10 @@
1
+ import { getElevation } from '../terrain/getElevation.js';
2
+
3
+ export function local() {
4
+ const { layer, state } = this;
5
+ const map = layer._map, crs = map.options.crs, origin = crs.project(layer.location);
6
+ const metres = Math.cos(layer.location.lat * Math.PI / 180);
7
+ const p = crs.project(state.latlng), terrain = map._terrain3D?._terrainReady && map._terrain3D;
8
+ const ground = (terrain && getElevation(terrain, state.latlng)) || 0;
9
+ return [(p.x - origin.x) * metres, ground - layer.root.position[1], -(p.y - origin.y) * metres];
10
+ }
@@ -0,0 +1,4 @@
1
+ export function onAdd(map) {
2
+ this._walk.layer.addTo(map);
3
+ return this._walk.container;
4
+ }
@@ -0,0 +1,3 @@
1
+ export function onBlur() {
2
+ this.keys.clear();
3
+ }
@@ -0,0 +1,12 @@
1
+ import { moves } from '../constants/moves.js';
2
+ import { stop } from './stop.js';
3
+
4
+ export function onKey(event) {
5
+ // Text fields and sliders keep their keys; buttons and checkboxes don't.
6
+ if (event.target.closest?.('input:not([type=checkbox], [type=radio]), select, textarea, [contenteditable]') ||
7
+ event.ctrlKey || event.altKey || event.metaKey) return;
8
+ if (event.type === 'keydown' && event.code === 'Escape') { this.stop(); return; }
9
+ if (!moves[event.code]) return;
10
+ event.preventDefault();
11
+ if (event.type === 'keydown') this.keys.add(event.code); else this.keys.delete(event.code);
12
+ }
@@ -0,0 +1,13 @@
1
+ export function onPointer(event) {
2
+ // Dragging only turns the camera around the walker: horizontal = bearing, vertical = pitch.
3
+ const map = this.layer._map;
4
+ if (event.type === 'pointerdown') {
5
+ if (event.button !== 0 || event.target.closest('.leaflet-control')) return;
6
+ this.drag = { x: event.clientX, y: event.clientY };
7
+ map.getContainer().setPointerCapture(event.pointerId);
8
+ } else if (this.drag && event.type === 'pointermove') {
9
+ map._setPitchAndBearing(Math.max(20, Math.min(85, map.getPitch() - (event.clientY - this.drag.y) * 0.2)),
10
+ map.getBearing() - (event.clientX - this.drag.x) * 0.25);
11
+ this.drag = { x: event.clientX, y: event.clientY };
12
+ } else this.drag = null;
13
+ }
@@ -0,0 +1,4 @@
1
+ export function onRemove() {
2
+ this._walk.stop();
3
+ this._walk.layer.remove();
4
+ }
@@ -0,0 +1,5 @@
1
+ import { place } from './place.js';
2
+
3
+ export function onTerrain() {
4
+ if (this.meshes) place.call(this);
5
+ }
@@ -0,0 +1,18 @@
1
+ import { update } from '../scene/update.js';
2
+ import { limbs } from '../constants/limbs.js';
3
+ import { local } from './local.js';
4
+
5
+ export function place() {
6
+ const [x, y, z] = local.call(this);
7
+ // Model forward is -z; a yaw of -heading turns it to the compass heading (x east, -z north).
8
+ const yaw = -this.state.heading, cos = Math.cos(yaw), sin = Math.sin(yaw);
9
+ let i, px, py, sign, mesh;
10
+ for (i = 0; i < limbs.length; i++) {
11
+ [, px, py, sign] = limbs[i];
12
+ mesh = this.meshes[i];
13
+ mesh.position[0] = x + px * cos; mesh.position[1] = y + py; mesh.position[2] = z - px * sin;
14
+ mesh.rotation[0] = sign * this.swing * Math.sin(this.state.phase);
15
+ mesh.rotation[1] = yaw;
16
+ }
17
+ update(this.layer);
18
+ }
@@ -0,0 +1,37 @@
1
+ import { step } from './step.js';
2
+ import { onKey } from './onKey.js';
3
+ import { onBlur } from './onBlur.js';
4
+ import { onPointer } from './onPointer.js';
5
+ import { onTerrain } from './onTerrain.js';
6
+
7
+ export function start() {
8
+ const map = this.layer._map;
9
+ if (this.saved || !map) return;
10
+ this.state.latlng = map.getCenter();
11
+ // Zoom whose camera distance (1.5 viewport heights, as in scene/render.js) is about `distance` metres behind the walker.
12
+ const pixelsPerMetre = map.getSize().y * 1.5 / this.distance;
13
+ const zoom = Math.min(map.getMaxZoom(), Math.log2(pixelsPerMetre * 40075016.68557849 * Math.cos(this.state.latlng.lat * Math.PI / 180) / 256));
14
+ const handlers = [];
15
+ let name;
16
+ for (name of ['dragging', 'keyboard', 'doubleClickZoom', 'boxZoom']) {
17
+ if (map[name]?.enabled()) handlers.push(name);
18
+ }
19
+ this.saved = {
20
+ zoom: map.getZoom(), pitch: map.getPitch(), scrollWheelZoom: map.options.scrollWheelZoom, handlers
21
+ };
22
+ for (name of this.saved.handlers) map[name].disable();
23
+ // Wheel zoom moves the camera closer or farther, keeping the walker centred.
24
+ map.options.scrollWheelZoom = this.saved.scrollWheelZoom && 'center';
25
+ this.state.heading = -map.getBearing() * Math.PI / 180;
26
+ map.setView(this.state.latlng, zoom, { animate: false });
27
+ map.setPitch(75);
28
+ L.DomEvent.on(document, 'keydown keyup', this.onKey);
29
+ L.DomEvent.on(window, 'blur', this.onBlur);
30
+ L.DomEvent.on(map.getContainer(), 'pointerdown pointermove pointerup pointercancel', this.onPointer);
31
+ map.on('terrainchange', this.onTerrain);
32
+ this.button.setAttribute('aria-pressed', 'true');
33
+ this.button.style.background = '#e4e4e4';
34
+ this.hint.style.display = '';
35
+ this.last = undefined;
36
+ this.frame = requestAnimationFrame(this.step);
37
+ }
@@ -0,0 +1,53 @@
1
+ import * as createMesh from '../rendering/createMesh.js';
2
+ import { build } from '../geometry/build.js';
3
+ import { limbs } from '../constants/limbs.js';
4
+ import { moves } from '../constants/moves.js';
5
+ import { parts } from '../constants/parts.js';
6
+ import { wrap } from '../utils/wrap.js';
7
+ import { local } from './local.js';
8
+ import { place } from './place.js';
9
+ import { blocked } from './blocked.js';
10
+
11
+ export function step(now) {
12
+ const layer = this.layer, map = layer._map;
13
+ this.frame = requestAnimationFrame(this.step);
14
+ const dt = Math.min(0.1, (now - (this.last ?? now)) / 1000);
15
+ this.last = now;
16
+ if (!layer.renderer) return;
17
+ let changed = false;
18
+ let part, key, i;
19
+ if (!this.meshes) {
20
+ this.meshes = [];
21
+ for ([part] of limbs) this.meshes.push(createMesh.createMesh(layer, build(parts[part])));
22
+ changed = true;
23
+ }
24
+ let forward = 0, turn = 0;
25
+ for (key of this.keys) { forward += moves[key]?.[0] || 0; turn += moves[key]?.[1] || 0; }
26
+ forward = Math.sign(forward); turn = Math.sign(turn);
27
+ if (turn) { this.state.heading = wrap(this.state.heading + turn * 2.5 * dt); changed = true; }
28
+ if (forward) {
29
+ const metres = forward * this.speed * dt, { lat, lng } = this.state.latlng, { position, scale } = layer.root;
30
+ let east = Math.sin(this.state.heading) * metres, north = Math.cos(this.state.heading) * metres;
31
+ const feet = local.call(this);
32
+ for (i = 0; i < feet.length; i++) feet[i] = position[i] + scale[i] * feet[i];
33
+ // World x is east, z south; keep 0.3 m from walls and slide along the one in the way.
34
+ const wall = blocked.call(this, east, north, feet);
35
+ if (wall) {
36
+ const into = east * wall[0] - north * wall[1];
37
+ east -= into * wall[0]; north += into * wall[1];
38
+ if (blocked.call(this, east, north, feet)) east = north = 0;
39
+ }
40
+ this.state.latlng = new L.LatLng(lat + north / 111320, lng + east / (111320 * Math.cos(lat * Math.PI / 180)));
41
+ this.state.phase += Math.hypot(east, north) / 1.6 * Math.PI;
42
+ changed = true;
43
+ }
44
+ if (forward || turn) {
45
+ // The camera (looking along -bearing) swings back behind the walker.
46
+ const bearing = map.getBearing() * Math.PI / 180, behind = wrap(-this.state.heading - bearing);
47
+ if (Math.abs(behind) > 1e-3) map._setPitchAndBearing(map.getPitch(), (bearing + behind * Math.min(1, dt * 4)) * 180 / Math.PI);
48
+ map.setView(this.state.latlng, map.getZoom(), { animate: false });
49
+ }
50
+ const target = forward ? 0.9 : 0;
51
+ if (Math.abs(this.swing - target) > 1e-3) { this.swing += (target - this.swing) * Math.min(1, dt * 10); changed = true; }
52
+ if (changed) place.call(this);
53
+ }
@@ -0,0 +1,27 @@
1
+ import * as disposeMesh from '../rendering/disposeMesh.js';
2
+ import { onKey } from './onKey.js';
3
+ import { onBlur } from './onBlur.js';
4
+ import { onPointer } from './onPointer.js';
5
+ import { onTerrain } from './onTerrain.js';
6
+
7
+ export function stop() {
8
+ const map = this.layer._map;
9
+ cancelAnimationFrame(this.frame);
10
+ this.keys.clear(); this.drag = null;
11
+ L.DomEvent.off(document, 'keydown keyup', this.onKey);
12
+ L.DomEvent.off(window, 'blur', this.onBlur);
13
+ let mesh, name;
14
+ for (mesh of this.meshes || []) disposeMesh.disposeMesh(this.layer, mesh);
15
+ this.meshes = null;
16
+ this.button.setAttribute('aria-pressed', 'false');
17
+ this.button.style.background = '#fff';
18
+ this.hint.style.display = 'none';
19
+ if (!map || !this.saved) return;
20
+ L.DomEvent.off(map.getContainer(), 'pointerdown pointermove pointerup pointercancel', this.onPointer);
21
+ map.off('terrainchange', this.onTerrain);
22
+ map.options.scrollWheelZoom = this.saved.scrollWheelZoom;
23
+ for (name of this.saved.handlers) map[name].enable();
24
+ map.setView(this.state.latlng, this.saved.zoom, { animate: false });
25
+ map.setPitch(this.saved.pitch);
26
+ this.saved = null;
27
+ }
@@ -0,0 +1,6 @@
1
+ import { start } from './start.js';
2
+ import { stop } from './stop.js';
3
+
4
+ export function toggle() {
5
+ if (this.saved) stop.call(this); else start.call(this);
6
+ }
@@ -1,2 +0,0 @@
1
- const o=8;export{o as CELL};
2
- //# sourceMappingURL=CELL.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/CELL.js"],
4
- "sourcesContent": ["// Walls (non-horizontal triangles) of a mesh in world space, bucketed by 8 m cells; `origin` is the world translation\n// at build time, since layer roots only move vertically with the terrain afterwards.\n\nexport const CELL = 8;\n"],
5
- "mappings": "AAGO,MAAMA,EAAO",
6
- "names": ["CELL"]
7
- }
@@ -1,2 +0,0 @@
1
- import{createMesh as b}from"./createMesh.js";import{triangulate as v}from"./triangulate.js";function D(s,z){const j=s._map,w=j.options.crs,B=s._terrainZoom,P=w.project(s.location),d=Math.cos(s.location.lat*Math.PI/180),I=s.root.position[1],y=[],$=[],q=[],Z=([c,f,u])=>{const e=w.project(new L.LatLng(f,c));return[(e.x-P.x)*d,u-I,-(e.y-P.y)*d]},M=(c,f)=>{y.push(...c),$.push(...f),q.push(.6,.58,.54)};s._bridges=new Map;for(const{geometry:c}of z.features){const f=c.type==="Polygon"?[c.coordinates]:c.type==="MultiPolygon"?c.coordinates:[];for(const u of f){const e=u.map(o=>o.slice(0,-1)).filter(o=>o.length>=3);if(!e.length)continue;const l=e.flat().map(([o,t,n])=>{const r=j.project([t,o],B);return[r.x,r.y,n]}),p=e.flat().map(Z);let x;try{const o=e.map((r,a)=>e.slice(0,a).reduce((m,i)=>m+i.length,0)),[t,...n]=e.map((r,a)=>r.map((m,i)=>({x:l[o[a]+i][0],y:l[o[a]+i][1]})));x=v(t,n)}catch{continue}const g={triangles:x.map(o=>o.map(t=>l[t])),min:[Math.min(...l.map(o=>o[0])),Math.min(...l.map(o=>o[1]))],max:[Math.max(...l.map(o=>o[0])),Math.max(...l.map(o=>o[1]))]};for(let o=Math.floor(g.min[0]/64);o<=Math.floor(g.max[0]/64);o++)for(let t=Math.floor(g.min[1]/64);t<=Math.floor(g.max[1]/64);t++){const n=`${o}/${t}`;s._bridges.set(n,[...s._bridges.get(n)||[],g])}const h=o=>[o[0],o[1]-1.2,o[2]];for(let[o,t,n]of x){const[r,a,m]=[p[o],p[t],p[n]];(a[2]-r[2])*(m[0]-r[0])-(a[0]-r[0])*(m[2]-r[2])<0&&([t,n]=[n,t]);for(const i of[o,t,n])M(p[i],[0,1,0]);for(const i of[o,n,t])M(h(p[i]),[0,-1,0])}let _=0;for(const o of e){for(let t=0;t<o.length;t++){const n=p[_+t],r=p[_+(t+1)%o.length],a=Math.hypot(r[0]-n[0],r[2]-n[2])||1,m=[(r[2]-n[2])/a,0,-(r[0]-n[0])/a];for(const i of[n,r,h(r),n,h(r),h(n)])M(i,m)}_+=o.length}}}y.length&&(s._bridgeMesh=b(s,{position:y,normal:$,color:q}))}export{D as addBridges};
2
- //# sourceMappingURL=addBridges.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/addBridges.js"],
4
- "sourcesContent": ["import { createMesh } from './createMesh.js';\nimport { triangulate } from './triangulate.js';\n\n/**\n * Bare-earth DEMs drop bridges: `getElevation` returns the deck height inside these polygons (GeoJSON\n * Polygon/MultiPolygon with Z, e.g. IGN BD TOPO), and one mesh draws the 1.2 m thick decks.\n * ponytail: anything under a deck (quays, boats asking `getElevation`) also gets the deck height.\n */\n\nexport function addBridges(backend, geojson) {\n const map = backend._map, crs = map.options.crs, zoom = backend._terrainZoom;\n const origin = crs.project(backend.location), metres = Math.cos(backend.location.lat * Math.PI / 180);\n const base = backend.root.position[1], position = [], normal = [], color = [];\n const local = ([lng, lat, z]) => {\n const p = crs.project(new L.LatLng(lat, lng));\n return [(p.x - origin.x) * metres, z - base, -(p.y - origin.y) * metres];\n };\n const push = (p, n) => { position.push(...p); normal.push(...n); color.push(0.6, 0.58, 0.54); };\n backend._bridges = new Map();\n for (const { geometry } of geojson.features) {\n const polygons = geometry.type === 'Polygon' ? [geometry.coordinates] : geometry.type === 'MultiPolygon' ? geometry.coordinates : [];\n for (const polygon of polygons) {\n const rings = polygon.map(ring => ring.slice(0, -1)).filter(ring => ring.length >= 3);\n if (!rings.length) continue;\n const pixels = rings.flat().map(([lng, lat, z]) => { const p = map.project([lat, lng], zoom); return [p.x, p.y, z]; });\n const points = rings.flat().map(local);\n let triangles;\n try {\n const starts = rings.map((ring, r) => rings.slice(0, r).reduce((sum, previous) => sum + previous.length, 0));\n const [contour, ...holes] = rings.map((ring, r) => ring.map((c, i) => ({ x: pixels[starts[r] + i][0], y: pixels[starts[r] + i][1] })));\n triangles = triangulate(contour, holes);\n } catch { continue; }\n const bridge = {\n triangles: triangles.map(t => t.map(i => pixels[i])),\n min: [Math.min(...pixels.map(p => p[0])), Math.min(...pixels.map(p => p[1]))],\n max: [Math.max(...pixels.map(p => p[0])), Math.max(...pixels.map(p => p[1]))],\n };\n for (let x = Math.floor(bridge.min[0] / 64); x <= Math.floor(bridge.max[0] / 64); x++) {\n for (let y = Math.floor(bridge.min[1] / 64); y <= Math.floor(bridge.max[1] / 64); y++) {\n const key = `${x}/${y}`;\n backend._bridges.set(key, [...backend._bridges.get(key) || [], bridge]);\n }\n }\n const below = p => [p[0], p[1] - 1.2, p[2]];\n for (let [a, b, c] of triangles) {\n // Counter-clockwise seen from above, so double-sided shading keeps the top lit.\n const [pa, pb, pc] = [points[a], points[b], points[c]];\n if ((pb[2] - pa[2]) * (pc[0] - pa[0]) - (pb[0] - pa[0]) * (pc[2] - pa[2]) < 0) [b, c] = [c, b];\n for (const i of [a, b, c]) push(points[i], [0, 1, 0]);\n for (const i of [a, c, b]) push(below(points[i]), [0, -1, 0]);\n }\n let start = 0;\n for (const ring of rings) {\n for (let i = 0; i < ring.length; i++) {\n const p = points[start + i], q = points[start + (i + 1) % ring.length];\n const length = Math.hypot(q[0] - p[0], q[2] - p[2]) || 1, n = [(q[2] - p[2]) / length, 0, -(q[0] - p[0]) / length];\n for (const corner of [p, q, below(q), p, below(q), below(p)]) push(corner, n);\n }\n start += ring.length;\n }\n }\n }\n if (position.length) {\n backend._bridgeMesh = createMesh(backend, { position, normal, color });\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["createMesh", "triangulate", "addBridges", "backend", "geojson", "map", "crs", "zoom", "origin", "metres", "base", "position", "normal", "color", "local", "lng", "lat", "z", "p", "push", "n", "geometry", "polygons", "polygon", "rings", "ring", "pixels", "points", "triangles", "starts", "r", "sum", "previous", "contour", "holes", "c", "bridge", "t", "i", "x", "y", "key", "below", "a", "b", "pa", "pb", "pc", "start", "q", "length", "corner"]
7
- }
@@ -1,2 +0,0 @@
1
- import{createProgram as O}from"./createProgram.js";import{destroyTexture as I}from"./destroyTexture.js";import{terrainAtlas as N}from"./terrainAtlas.js";import{terrainGrid as R}from"./terrainGrid.js";import{setParent as S}from"./setParent.js";import{update as X}from"./update.js";async function j(t,m,e,i){if(!await t._terrainPromise||!t._map||t._map._terrain3D!==t||m._terrain3D!==t||i.request.signal.aborted||!m._rasterTiles.has(`${e.z}/${e.x}/${e.y}`)||t._rasterTiles.has(i))return;const _=Math.max(1,Math.min(64,256/2**(e.z-t._terrainZoom))),v=t._map,u=v.options.crs,y=u.project(t.location),f=Math.cos(t.location.lat*Math.PI/180),T=u.scale(e.z),g=2**(t._terrainZoom-e.z),x=u.transformation.untransform(new L.Point(e.x*256,e.y*256),T),w=u.transformation.untransform(new L.Point((e.x+1)*256,(e.y+1)*256),T),o=t.renderer.device,U=i.texture;if(!t._rasterProgram||t._rasterProgram.device!==o){const a=t._terrainBounds,r=a.max.x-a.min.x+1,z=a.max.y-a.min.y+1,{elevations:E,low:B,high:G}=N(t._terrainTiles,a);t._dem&&I(t,t._dem.texture),t._dem={texture:o.createTexture({size:[r*256,z*256],format:"r32float",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST}),low:Number.isFinite(B)?B:t._terrainOriginElevation,high:Number.isFinite(G)?G:t._terrainOriginElevation},o.queue.writeTexture({texture:t._dem.texture},E,{bytesPerRow:r*1024},[r*256,z*256]),t._terrainGrids=new Map,t._rasterProgram=O(t,{baseTexture:U,unlit:!0,terrain:t._dem,alphaMode:"BLEND",depthWrite:!0})}let s=t._terrainGrids.get(_);if(!s){s=R(_);for(const[a,r]of Object.entries(s))r.size||=1,r.count=r.data.length/r.size,r.indexFormat="uint16",r.buffer=o.createBuffer({size:Math.max(4,r.data.byteLength),usage:a==="index"?GPUBufferUsage.INDEX|GPUBufferUsage.COPY_DST:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST}),o.queue.writeBuffer(r.buffer,0,r.data);t._terrainGrids.set(_,s)}const n=t._terrainOriginElevation,p=Math.min(t._dem.low,n)-n,h=Math.max(t._dem.high,n)-n,l=(w.x-x.x)*f,P=-(w.y-x.y)*f,D={device:o,attributes:s,drawRange:{start:0,count:s.index.count},bounds:{min:[0,p,0],max:[1,h,1],center:[.5,(p+h)/2,.5],radius:Math.hypot(l,h-p,P)/2/Math.max(l,1,P)}},M={position:[(x.x-y.x)*f,0,-(x.y-y.y)*f],rotation:[0,0,0],scale:[l,1,P],worldMatrix:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],children:[],visible:!0,device:o,geometry:D,program:t._rasterProgram,texture:U,terrain:[e.x*256*g-t._terrainBounds.min.x*256,e.y*256*g-t._terrainBounds.min.y*256,256*g,n],tile:i,opacity:m.options.opacity??1,id:L.Layer._nextId++,renderOrder:m.options.zIndex||0,fadeDuration:250,fadeStart:i.loadedAt,ground:!0};i.mesh.visible=!1,S(M,t.root),X(t),t._rasterTiles.set(i,M)}export{j as addRasterTile};
2
- //# sourceMappingURL=addRasterTile.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/addRasterTile.js"],
4
- "sourcesContent": ["import { createProgram } from './createProgram.js';\nimport { destroyTexture } from './destroyTexture.js';\nimport { terrainAtlas } from './terrainAtlas.js';\nimport { terrainGrid } from './terrainGrid.js';\nimport { setParent } from './setParent.js';\nimport { update } from './update.js';\n\nexport async function addRasterTile(backend, layer, coords, tile) {\n const ready = await backend._terrainPromise;\n if (!ready || !backend._map || backend._map._terrain3D !== backend || layer._terrain3D !== backend ||\n tile.request.signal.aborted || !layer._rasterTiles.has(`${coords.z}/${coords.x}/${coords.y}`) ||\n backend._rasterTiles.has(tile)) {\n return;\n }\n // Match DEM pixel spacing, capped at 64 subdivisions per tile.\n const divisions = Math.max(1, Math.min(64, 256 / 2 ** (coords.z - backend._terrainZoom)));\n const map = backend._map, crs = map.options.crs;\n const origin = crs.project(backend.location), metres = Math.cos(backend.location.lat * Math.PI / 180);\n // Tile pixels map linearly to projected metres: one scaled unit grid per tile, elevation in the vertex shader.\n const scale = crs.scale(coords.z), terrainScale = 2 ** (backend._terrainZoom - coords.z);\n const corner = crs.transformation.untransform(new L.Point(coords.x * 256, coords.y * 256), scale);\n const opposite = crs.transformation.untransform(new L.Point((coords.x + 1) * 256, (coords.y + 1) * 256), scale);\n const device = backend.renderer.device;\n const texture = tile.texture;\n if (!backend._rasterProgram || backend._rasterProgram.device !== device) {\n // DEM atlas over the archive's tile grid; invalid or missing samples become -1e9 (the shader's no-data).\n // ponytail: one texture, capped by maxTextureDimension2D (32\u00D732 DEM tiles at 8192 px); split it for larger archives.\n const bounds = backend._terrainBounds, columns = bounds.max.x - bounds.min.x + 1, rows = bounds.max.y - bounds.min.y + 1;\n const { elevations, low, high } = terrainAtlas(backend._terrainTiles, bounds);\n if (backend._dem) destroyTexture(backend, backend._dem.texture);\n backend._dem = {\n texture: device.createTexture({\n size: [columns * 256, rows * 256],\n format: 'r32float',\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,\n }),\n low: Number.isFinite(low) ? low : backend._terrainOriginElevation,\n high: Number.isFinite(high) ? high : backend._terrainOriginElevation,\n };\n device.queue.writeTexture({ texture: backend._dem.texture }, elevations,\n { bytesPerRow: columns * 1024 }, [columns * 256, rows * 256]);\n backend._terrainGrids = new Map();\n backend._rasterProgram = createProgram(backend, {\n baseTexture: texture,\n unlit: true,\n terrain: backend._dem,\n alphaMode: 'BLEND',\n depthWrite: true,\n });\n }\n let attributes = backend._terrainGrids.get(divisions);\n if (!attributes) {\n attributes = terrainGrid(divisions);\n for (const [name, attribute] of Object.entries(attributes)) {\n attribute.size ||= 1;\n attribute.count = attribute.data.length / attribute.size;\n attribute.indexFormat = 'uint16';\n attribute.buffer = device.createBuffer({\n size: Math.max(4, attribute.data.byteLength),\n usage: name === 'index'\n ? GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST\n : GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n });\n device.queue.writeBuffer(attribute.buffer, 0, attribute.data);\n }\n backend._terrainGrids.set(divisions, attributes);\n }\n const base = backend._terrainOriginElevation;\n const bottom = Math.min(backend._dem.low, base) - base, top = Math.max(backend._dem.high, base) - base;\n const sizeX = (opposite.x - corner.x) * metres, sizeZ = -(opposite.y - corner.y) * metres;\n // ponytail: ray picking sees the flat unit grid; read the DEM back if terrain must be pickable.\n const geometry = {\n device,\n attributes,\n drawRange: { start: 0, count: attributes.index.count },\n // Local bounds whose radius, scaled by the largest axis, still covers the displaced tile.\n bounds: {\n min: [0, bottom, 0], max: [1, top, 1], center: [0.5, (bottom + top) / 2, 0.5],\n radius: Math.hypot(sizeX, top - bottom, sizeZ) / 2 / Math.max(sizeX, 1, sizeZ),\n },\n };\n const mesh = {\n position: [(corner.x - origin.x) * metres, 0, -(corner.y - origin.y) * metres],\n rotation: [0, 0, 0],\n scale: [sizeX, 1, sizeZ],\n worldMatrix: [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],\n children: [],\n visible: true,\n device,\n geometry,\n program: backend._rasterProgram,\n texture,\n // DEM pixel of the tile's corner, DEM pixels per tile, and the elevation at the layer origin.\n terrain: [\n coords.x * 256 * terrainScale - backend._terrainBounds.min.x * 256,\n coords.y * 256 * terrainScale - backend._terrainBounds.min.y * 256,\n 256 * terrainScale,\n base,\n ],\n tile,\n opacity: layer.options.opacity ?? 1,\n id: L.Layer._nextId++,\n renderOrder: layer.options.zIndex || 0,\n fadeDuration: 250,\n fadeStart: tile.loadedAt,\n ground: true,\n };\n tile.mesh.visible = false;\n setParent(mesh, backend.root);\n update(backend);\n backend._rasterTiles.set(tile, mesh);\n}\n"],
5
- "mappings": "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",
6
- "names": ["createProgram", "destroyTexture", "terrainAtlas", "terrainGrid", "setParent", "update", "addRasterTile", "backend", "layer", "coords", "tile", "divisions", "map", "crs", "origin", "metres", "scale", "terrainScale", "corner", "opposite", "device", "texture", "bounds", "columns", "rows", "elevations", "low", "high", "attributes", "name", "attribute", "base", "bottom", "top", "sizeX", "sizeZ", "geometry", "mesh"]
7
- }
@@ -1,2 +0,0 @@
1
- function n(a,d,i){let o=1;for(;o<d.length-1&&d[o]<i;)o++;const c=a[o-1],r=a[o],t=d[o]-d[o-1]||1,x=(i-d[o-1])/t;return{x:c[0]+(r[0]-c[0])*x,y:(c[2]??0)+((r[2]??0)-(c[2]??0))*x,z:c[1]+(r[1]-c[1])*x,dx:(r[0]-c[0])/t,dz:(r[1]-c[1])/t}}export{n as along};
2
- //# sourceMappingURL=along.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/along.js"],
4
- "sourcesContent": ["/** Point and unit direction at distance `s` along `points` ([x, z, y?]) with cumulative `lengths`. */\n\nexport function along(points, lengths, s) {\n let i = 1;\n while (i < lengths.length - 1 && lengths[i] < s) i++;\n const a = points[i - 1], b = points[i], d = lengths[i] - lengths[i - 1] || 1;\n const t = (s - lengths[i - 1]) / d;\n return { x: a[0] + (b[0] - a[0]) * t, y: (a[2] ?? 0) + ((b[2] ?? 0) - (a[2] ?? 0)) * t, z: a[1] + (b[1] - a[1]) * t, dx: (b[0] - a[0]) / d, dz: (b[1] - a[1]) / d };\n}\n"],
5
- "mappings": "AAEO,SAASA,EAAMC,EAAQC,EAASC,EAAG,CACxC,IAAIC,EAAI,EACR,KAAOA,EAAIF,EAAQ,OAAS,GAAKA,EAAQE,CAAC,EAAID,GAAGC,IACjD,MAAMC,EAAIJ,EAAOG,EAAI,CAAC,EAAGE,EAAIL,EAAOG,CAAC,EAAGG,EAAIL,EAAQE,CAAC,EAAIF,EAAQE,EAAI,CAAC,GAAK,EACrEI,GAAKL,EAAID,EAAQE,EAAI,CAAC,GAAKG,EACjC,MAAO,CAAE,EAAGF,EAAE,CAAC,GAAKC,EAAE,CAAC,EAAID,EAAE,CAAC,GAAKG,EAAG,GAAIH,EAAE,CAAC,GAAK,KAAOC,EAAE,CAAC,GAAK,IAAMD,EAAE,CAAC,GAAK,IAAMG,EAAG,EAAGH,EAAE,CAAC,GAAKC,EAAE,CAAC,EAAID,EAAE,CAAC,GAAKG,EAAG,IAAKF,EAAE,CAAC,EAAID,EAAE,CAAC,GAAKE,EAAG,IAAKD,EAAE,CAAC,EAAID,EAAE,CAAC,GAAKE,CAAE,CACpK",
6
- "names": ["along", "points", "lengths", "s", "i", "a", "b", "d", "t"]
7
- }
@@ -1,2 +0,0 @@
1
- function b(s){if(!Number.isFinite(s))throw new Error("Invalid solar altitude");const t=[[-18,[3,7,20],[17,28,54],[.025,.04,.09]],[-6,[37,53,84],[182,106,86],[.12,.1,.14]],[0,[101,131,171],[246,170,115],[.38,.24,.18]],[10,[74,147,208],[197,221,237],[.8,.75,.68]],[25,[53,144,213],[223,238,250],[1,1,1]]],r=t.findIndex(n=>n[0]>=s),a=t[r<0?t.length-1:r],o=t[Math.max(0,r-1)],p=o===a||r<0?1:(s-o[0])/(a[0]-o[0]),i=n=>o[n].map((c,m)=>c+(a[n][m]-c)*p),e=n=>`rgb(${n.map(Math.round).join(", ")})`;return{background:`linear-gradient(${e(i(1))}, ${e(i(2))})`,tint:i(3)}}export{b as atmosphere};
2
- //# sourceMappingURL=atmosphere.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/atmosphere.js"],
4
- "sourcesContent": ["\nexport function atmosphere(altitude) {\n if (!Number.isFinite(altitude)) {\n throw new Error('Invalid solar altitude');\n }\n const stops = [\n [-18, [3, 7, 20], [17, 28, 54], [0.025, 0.04, 0.09]],\n [-6, [37, 53, 84], [182, 106, 86], [0.12, 0.10, 0.14]],\n [0, [101, 131, 171], [246, 170, 115], [0.38, 0.24, 0.18]],\n [10, [74, 147, 208], [197, 221, 237], [0.80, 0.75, 0.68]],\n [25, [53, 144, 213], [223, 238, 250], [1, 1, 1]],\n ];\n const upper = stops.findIndex(stop => stop[0] >= altitude);\n const b = stops[upper < 0 ? stops.length - 1 : upper],\n a = stops[Math.max(0, upper - 1)];\n const t = a === b || upper < 0 ? 1 : (altitude - a[0]) / (b[0] - a[0]);\n const mix = index => a[index].map((value, i) => value + (b[index][i] - value) * t);\n const rgb = values => `rgb(${values.map(Math.round).join(', ')})`;\n return { background: `linear-gradient(${rgb(mix(1))}, ${rgb(mix(2))})`, tint: mix(3) };\n}\n"],
5
- "mappings": "AACO,SAASA,EAAWC,EAAU,CACnC,GAAI,CAAC,OAAO,SAASA,CAAQ,EAC3B,MAAM,IAAI,MAAM,wBAAwB,EAE1C,MAAMC,EAAQ,CACZ,CAAC,IAAK,CAAC,EAAG,EAAG,EAAE,EAAG,CAAC,GAAI,GAAI,EAAE,EAAG,CAAC,KAAO,IAAM,GAAI,CAAC,EACnD,CAAC,GAAI,CAAC,GAAI,GAAI,EAAE,EAAG,CAAC,IAAK,IAAK,EAAE,EAAG,CAAC,IAAM,GAAM,GAAI,CAAC,EACrD,CAAC,EAAG,CAAC,IAAK,IAAK,GAAG,EAAG,CAAC,IAAK,IAAK,GAAG,EAAG,CAAC,IAAM,IAAM,GAAI,CAAC,EACxD,CAAC,GAAI,CAAC,GAAI,IAAK,GAAG,EAAG,CAAC,IAAK,IAAK,GAAG,EAAG,CAAC,GAAM,IAAM,GAAI,CAAC,EACxD,CAAC,GAAI,CAAC,GAAI,IAAK,GAAG,EAAG,CAAC,IAAK,IAAK,GAAG,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,CACjD,EACMC,EAAQD,EAAM,UAAUE,GAAQA,EAAK,CAAC,GAAKH,CAAQ,EACnDI,EAAIH,EAAMC,EAAQ,EAAID,EAAM,OAAS,EAAIC,CAAK,EAC9CG,EAAIJ,EAAM,KAAK,IAAI,EAAGC,EAAQ,CAAC,CAAC,EAChCI,EAAID,IAAMD,GAAKF,EAAQ,EAAI,GAAKF,EAAWK,EAAE,CAAC,IAAMD,EAAE,CAAC,EAAIC,EAAE,CAAC,GAC9DE,EAAMC,GAASH,EAAEG,CAAK,EAAE,IAAI,CAACC,EAAOC,IAAMD,GAASL,EAAEI,CAAK,EAAEE,CAAC,EAAID,GAASH,CAAC,EAC3EK,EAAMC,GAAU,OAAOA,EAAO,IAAI,KAAK,KAAK,EAAE,KAAK,IAAI,CAAC,IAC9D,MAAO,CAAE,WAAY,mBAAmBD,EAAIJ,EAAI,CAAC,CAAC,CAAC,KAAKI,EAAIJ,EAAI,CAAC,CAAC,CAAC,IAAK,KAAMA,EAAI,CAAC,CAAE,CACvF",
6
- "names": ["atmosphere", "altitude", "stops", "upper", "stop", "b", "a", "t", "mix", "index", "value", "i", "rgb", "values"]
7
- }
@@ -1,2 +0,0 @@
1
- import{emptyNode as _}from"./emptyNode.js";import{setParent as w}from"./setParent.js";import{traverse as G}from"./traverse.js";import{createProgram as E}from"./createProgram.js";import{endZoom as R}from"./endZoom.js";import{onMapChange as S}from"./onMapChange.js";import{onZoomAnim as A}from"./onZoomAnim.js";import{render as z}from"./render.js";import{startZoom as M}from"./startZoom.js";import{update as N}from"./update.js";import{updateArea as B}from"./updateArea.js";import{setTerrainHeight as C}from"./setTerrainHeight.js";import{resizeSunlight as D}from"./resizeSunlight.js";function O(e){const a=e.getContainer();if(a.querySelector(".leaflet-webgpu-warning"))return;const r=document.createElement("div");r.className="leaflet-webgpu-warning",r.setAttribute("role","alert"),r.style.cssText="position:absolute;z-index:1000;top:50%;left:50%;transform:translate(-50%,-50%);max-width:calc(100% - 32px);box-sizing:border-box;padding:12px 16px;border:1px solid #c98b24;border-radius:6px;background:#fff8e6;box-shadow:0 3px 12px #0005;color:#30251d;font:14px/1.5 sans-serif;text-align:center;pointer-events:auto",r.append("WebGPU is not available in this browser or device. ");const l=document.createElement("a");l.href="https://developer.mozilla.org/en-US/docs/Web/API/WebGPU_API#browser_compatibility",l.target="_blank",l.rel="noopener noreferrer",l.textContent="Learn more",r.append(l),a.append(r)}async function Q(e,a){let r=L.Layer._renderers.get(a);if(r?._rendererReady&&await r._rendererReady.promise,!r){r=e,e._rendererReady=Promise.withResolvers(),e._rendererReady.promise.catch(()=>{}),L.Layer._renderers.set(a,r);const t=d=>{throw O(a),e._rendererReady.reject(d),L.Layer._renderers.delete(a),d},u=document.createElement("canvas");navigator.gpu||t(new Error("Layer3D requires WebGPU"));const f=await navigator.gpu.requestAdapter().catch(t);f||t(new Error("Unable to acquire a WebGPU adapter"));const i=await f.requestDevice().catch(t);i.addEventListener("uncapturederror",d=>{const g=L.Layer._renderers.get(a);if(g?.renderer?.device===i)for(const T of g?._layers||[])T.fire("error",{error:d.error})}),i.lost.then(d=>{const g=L.Layer._renderers.get(a);if(!g||g.renderer?.device!==i)return;const T=new Error(`WebGPU device lost: ${d.message||d.reason}`);for(const h of g._layers)h.fire("error",{error:T})});const n=u.getContext("webgpu");n||(i.destroy(),t(new Error("Unable to create a WebGPU canvas context")));const s=navigator.gpu.getPreferredCanvasFormat();n.configure({device:i,format:s,alphaMode:"premultiplied"}),a.getContainer().querySelector(".leaflet-webgpu-warning")?.remove(),e._shared=e,e._layers=new Set,e._sceneOrigin=e.location,e.scene=_(),e.camera={position:[0,0,0],up:[0,1,0],target:[0,0,0],viewMatrix:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],projectionMatrix:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],projectionViewMatrix:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],fov:45,aspect:1,near:.1,far:1e4},e.renderer={device:i,context:n,format:s,canvas:u,dpr:Math.min(window.devicePixelRatio,2)};const o=i.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"depth"}},{binding:2,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"comparison"}},{binding:3,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"read-only-storage"}}]}),p=e.renderer.device.createBuffer({size:80,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),c=e.renderer.device.createSampler({compare:"less-equal",minFilter:"linear",magFilter:"linear"}),U=e.renderer.device.createBuffer({size:32,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});e.renderer.sunlight={layout:o,buffer:p,sampler:c,lights:U,size:0};const x=new Float32Array(20);x.set([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),e.renderer.device.queue.writeBuffer(p,0,x),D(e,1);const v=document.createElement("canvas");v.width=1,v.height=1,e.renderer.roofFallbackTexture={device:i,texture:i.createTexture({size:[1,1],format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),sampler:i.createSampler({addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}),image:v,format:"rgba8unorm",srgb:!1,uploaded:null},r._size=null,u.className="leaflet-3d",u.style.cssText="position:absolute;top:0;left:0;pointer-events:none",u.setAttribute("role","img"),u.setAttribute("aria-label",e.options.ariaLabel??"3D scene");let m=a.getPane("webgpuPane");m||(m=a.createPane("webgpuPane",a.getContainer()),m.style.zIndex=1,m.style.pointerEvents="none"),m.append(u),a.on("move zoom rotate pitch resize viewreset layeradd layerremove",S,r),a.on("zoomstart",M,r),a.on("zoomanim",A,r),a.on("zoomend",R,r),e._rendererReady.resolve(),delete r._rendererReady,z(r),L.Layer._renderers.set(a,r)}const l=a.options.crs.project(r._sceneOrigin),P=a.options.crs.project(e.location),y=Math.cos(r._sceneOrigin.lat*Math.PI/180);e._terrainBaseY??=e.root.position[1],e.root.position[0]=(P.x-l.x)*y,e.root.position[1]=e._terrainBaseY,e.root.position[2]=-(P.y-l.y)*y,C(e),e.root.scale.fill(y/Math.cos(e.location.lat*Math.PI/180)),e._shared=r,e.renderer=r.renderer,e.scene=r.scene,e.camera=r.camera,r._layers.add(e),w(e.root,r.scene),G(e.root,t=>{if(t.geometry&&t.geometry.device!==r.renderer.device){const u=t.geometry,f=t.program._layerMaterial,i={};for(const s of["position","normal","color","uv","index"]){const o=u.attributes[s];if(!o)continue;const{data:p,size:c,count:U,normalized:x}=o;i[s]={data:p.slice(0,U*c),size:c,normalized:x}}const n=r.renderer.device;i.index?.data instanceof Uint8Array&&(i.index.data=Uint16Array.from(i.index.data));for(const[s,o]of Object.entries(i))o.size||=1,o.count=o.data.length/o.size,o.indexFormat=o.data instanceof Uint32Array?"uint32":"uint16",o.buffer=n.createBuffer({size:Math.max(4,o.data.byteLength),usage:s==="index"?GPUBufferUsage.INDEX|GPUBufferUsage.COPY_DST:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST}),n.queue.writeBuffer(o.buffer,0,o.data);t.geometry={device:n,attributes:i,drawRange:{start:0,count:i.index?.count||i.position.count}};for(const s of Object.values(u.attributes))s.buffer.destroy();t.bindGroup=null,t.boundTextures=[];for(const s of["baseTexture","metalTexture","emissiveTexture","occlusionTexture"]){const o=f[s];!o||o.device===n||(f[s]={...o,device:n,texture:n.createTexture({size:[o.image.width,o.image.height],format:o.format,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),sampler:n.createSampler(o.samplerOptions),uploaded:null})}t.program.pipelineCache.clear(),t.program=E(e,f),t.device=n}t.texture&&t.texture.device!==r.renderer.device&&(t.texture={...t.texture,device:r.renderer.device,texture:r.renderer.device.createTexture({size:[t.texture.image.width,t.texture.image.height],format:t.texture.format,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),sampler:r.renderer.device.createSampler(t.texture.samplerOptions),uploaded:null})}),N(r),(e.header&&e._type!=="pmtiles"||e._geojson)&&B(e)}export{Q as attach};
2
- //# sourceMappingURL=attach.js.map