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.
Files changed (629) hide show
  1. package/README.md +61 -13
  2. package/cucumber.mjs +4 -0
  3. package/dist/leaflet-city-mapper.js +3 -1
  4. package/dist/leaflet-city-mapper.js.map +4 -4
  5. package/package.json +3 -4
  6. package/src/archives/decodeDirectory.js +32 -0
  7. package/src/archives/decodeHeader.js +19 -0
  8. package/src/archives/decompress.js +5 -0
  9. package/src/archives/getHeader.js +9 -0
  10. package/src/archives/getZxy.js +75 -0
  11. package/src/archives/loadDirectory.js +7 -0
  12. package/src/archives/loadSource.js +17 -0
  13. package/src/archives/read.js +29 -0
  14. package/src/archives/tileId.js +19 -0
  15. package/src/archives/varint.js +15 -0
  16. package/src/camera/angles.js +6 -0
  17. package/src/camera/animationPoint.js +8 -0
  18. package/src/camera/cameraMapReady.js +8 -0
  19. package/src/camera/cancelCameraAnimation.js +11 -0
  20. package/src/camera/cleanupCameraMap.js +11 -0
  21. package/src/camera/constrainCameraToBounds.js +3 -0
  22. package/src/camera/displayPoint.js +3 -0
  23. package/src/camera/fitCameraBounds.js +48 -0
  24. package/src/camera/groundBounds.js +11 -0
  25. package/src/camera/initializeCameraMap.js +25 -0
  26. package/src/camera/mapAnimateCamera.js +17 -0
  27. package/src/camera/mapCamera.js +123 -0
  28. package/src/camera/mapContainerPointToLayerPoint.js +7 -0
  29. package/src/camera/mapGetBearing.js +1 -0
  30. package/src/camera/mapGetBounds.js +14 -0
  31. package/src/camera/mapGetBoundsCenterZoom.js +7 -0
  32. package/src/camera/mapGetBoundsZoom.js +14 -0
  33. package/src/camera/mapGetCenterLayerPoint.js +5 -0
  34. package/src/camera/mapGetPitch.js +1 -0
  35. package/src/camera/mapLayerPointToContainerPoint.js +7 -0
  36. package/src/camera/mapLimitCenter.js +12 -0
  37. package/src/camera/mapLimitOffset.js +10 -0
  38. package/src/camera/mapPanBy.js +9 -0
  39. package/src/camera/mapPanInside.js +14 -0
  40. package/src/camera/mapResetNorth.js +1 -0
  41. package/src/camera/mapResetNorthPitch.js +1 -0
  42. package/src/camera/mapSetBearing.js +1 -0
  43. package/src/camera/mapSetPitch.js +1 -0
  44. package/src/camera/mapSetPitchAndBearing.js +14 -0
  45. package/src/camera/mapSetZoomAround.js +11 -0
  46. package/src/camera/mapStopPitchBearingAnimation.js +6 -0
  47. package/src/camera/mapTryAnimatedPan.js +9 -0
  48. package/src/camera/mapUpdateCameraOverlays.js +7 -0
  49. package/src/camera/pointOf.js +3 -0
  50. package/src/camera/project.js +20 -0
  51. package/src/camera/runCameraAnimations.js +28 -0
  52. package/src/camera/scheduleCameraAnimation.js +8 -0
  53. package/src/camera/updateSky.js +16 -0
  54. package/src/camera/verticalGroundY.js +4 -0
  55. package/src/collision/collectMeshes.js +5 -0
  56. package/src/collision/collider.js +63 -0
  57. package/src/collision/horizontalRay.js +12 -0
  58. package/src/collision/intersectMeshes.js +133 -0
  59. package/src/collision/sortHits.js +23 -0
  60. package/src/constants/CELL.js +4 -0
  61. package/src/constants/Compass.js +7 -0
  62. package/src/constants/ContainerResize.js +7 -0
  63. package/src/constants/HEIGHT.js +1 -0
  64. package/src/constants/PitchDrag.js +7 -0
  65. package/src/constants/ShiftRotate.js +7 -0
  66. package/src/constants/TILE_RADIUS.js +1 -0
  67. package/src/constants/TILE_SIZE.js +1 -0
  68. package/src/constants/TouchMode.js +6 -0
  69. package/src/constants/accessorSizes.js +1 -0
  70. package/src/constants/accessorTypes.js +8 -0
  71. package/src/constants/attachState.js +1 -0
  72. package/src/constants/cameraControlsState.js +1 -0
  73. package/src/constants/cityMapper.js +6 -0
  74. package/src/constants/colliders.js +2 -0
  75. package/src/constants/dark.js +1 -0
  76. package/src/constants/elevationWGSL.js +27 -0
  77. package/src/constants/glass.js +1 -0
  78. package/src/constants/headlight.js +1 -0
  79. package/src/constants/hull.js +1 -0
  80. package/src/constants/indexState.js +1 -0
  81. package/src/constants/limbs.js +9 -0
  82. package/src/constants/mapCameraState.js +1 -0
  83. package/src/constants/moves.js +11 -0
  84. package/src/constants/nativeEventMaps.js +1 -0
  85. package/src/constants/nativeLayerState.js +1 -0
  86. package/src/constants/nativeMethodHandlers.js +31 -0
  87. package/src/constants/onMapChangeState.js +1 -0
  88. package/src/constants/onZoomAnimState.js +1 -0
  89. package/src/constants/paints.js +10 -0
  90. package/src/constants/parts.js +19 -0
  91. package/src/constants/pendingUpdates.js +1 -0
  92. package/src/constants/pumpState.js +1 -0
  93. package/src/constants/renderers.js +2 -0
  94. package/src/constants/ringDirections.js +10 -0
  95. package/src/constants/roundProfile.js +1 -0
  96. package/src/constants/shirt.js +1 -0
  97. package/src/constants/skin.js +2 -0
  98. package/src/constants/speed.js +3 -0
  99. package/src/constants/taillight.js +1 -0
  100. package/src/constants/trafficShader.js +49 -0
  101. package/src/constants/trousers.js +1 -0
  102. package/src/constants/tyre.js +1 -0
  103. package/src/constants/underEntryState.js +1 -0
  104. package/src/constants/vehicles.js +40 -0
  105. package/src/constants/white.js +1 -0
  106. package/src/controls/acceptPitchDrag.js +4 -0
  107. package/src/controls/acceptRotateDrag.js +3 -0
  108. package/src/controls/adjustCameraDrag.js +10 -0
  109. package/src/controls/cameraControls.js +60 -0
  110. package/src/controls/cameraDragClick.js +9 -0
  111. package/src/controls/cameraDragContextMenu.js +8 -0
  112. package/src/controls/cameraDragDown.js +20 -0
  113. package/src/controls/cameraDragEnd.js +6 -0
  114. package/src/controls/cameraDragMove.js +23 -0
  115. package/src/controls/changeCameraTouch.js +14 -0
  116. package/src/controls/cleanupCameraTouch.js +24 -0
  117. package/src/controls/compassAddHooks.js +15 -0
  118. package/src/controls/compassOrientation.js +6 -0
  119. package/src/controls/compassRemoveHooks.js +5 -0
  120. package/src/controls/containerResizeAddHooks.js +8 -0
  121. package/src/controls/containerResizeRemoveHooks.js +5 -0
  122. package/src/controls/dragCamera.js +22 -0
  123. package/src/controls/editable.js +3 -0
  124. package/src/controls/endAllCameraDrags.js +7 -0
  125. package/src/controls/endAllCameraTouches.js +7 -0
  126. package/src/controls/endCameraTouch.js +11 -0
  127. package/src/controls/endCameraTouchEvent.js +5 -0
  128. package/src/controls/finishCameraDrag.js +9 -0
  129. package/src/controls/finishCompassPermission.js +16 -0
  130. package/src/controls/loadCameraControls.js +9 -0
  131. package/src/controls/moveCameraTouch.js +22 -0
  132. package/src/controls/notifyCameraTouchChange.js +1 -0
  133. package/src/controls/pitchDragAddHooks.js +6 -0
  134. package/src/controls/pitchDragRemoveHooks.js +5 -0
  135. package/src/controls/refreshRotateControl.js +7 -0
  136. package/src/controls/refreshRotateFocus.js +5 -0
  137. package/src/controls/removeCameraDrag.js +23 -0
  138. package/src/controls/resizeMap.js +3 -0
  139. package/src/controls/rotateButtonClick.js +7 -0
  140. package/src/controls/rotateButtonKeydown.js +11 -0
  141. package/src/controls/rotateControl.js +3 -0
  142. package/src/controls/rotateOnAdd.js +38 -0
  143. package/src/controls/rotateOnRemove.js +6 -0
  144. package/src/controls/shiftRotateAddHooks.js +8 -0
  145. package/src/controls/shiftRotateRemoveHooks.js +5 -0
  146. package/src/controls/shiftRotateWheel.js +9 -0
  147. package/src/controls/startCameraTouch.js +23 -0
  148. package/src/core/addImageState.js +7 -0
  149. package/src/core/addRasterImage.js +10 -0
  150. package/src/core/adjustCameraMarkerPan.js +22 -0
  151. package/src/core/beforeNativeRender.js +10 -0
  152. package/src/core/boundsQuad.js +11 -0
  153. package/src/core/bringNativeLayerToBack.js +3 -0
  154. package/src/core/bringNativeLayerToFront.js +3 -0
  155. package/src/core/cameraCircleBounds.js +6 -0
  156. package/src/core/cameraMarkerDrag.js +18 -0
  157. package/src/core/cameraMarkerOnDrag.js +8 -0
  158. package/src/core/cancelGridFade.js +10 -0
  159. package/src/core/closestCameraLayerPoint.js +7 -0
  160. package/src/core/compareNativeHits.js +3 -0
  161. package/src/core/current.js +3 -0
  162. package/src/core/disposeNativeLayer.js +35 -0
  163. package/src/core/fireRasterLoad.js +5 -0
  164. package/src/core/forwardNativeError.js +3 -0
  165. package/src/core/gridlayerGetEvents.js +7 -0
  166. package/src/core/gridlayerGetTiledPixelBounds.js +8 -0
  167. package/src/core/handleNativeMapEvent.js +47 -0
  168. package/src/core/hideTargets.js +16 -0
  169. package/src/core/initNativeGPU.js +21 -0
  170. package/src/core/initializeGridContainer.js +6 -0
  171. package/src/core/initializeNativeLayer.js +42 -0
  172. package/src/core/localPixel.js +5 -0
  173. package/src/core/localPixelForGeometry.js +6 -0
  174. package/src/core/localPosition.js +6 -0
  175. package/src/core/markerCameraIconPoint.js +9 -0
  176. package/src/core/markerGetEvents.js +5 -0
  177. package/src/core/markerInitInteraction.js +8 -0
  178. package/src/core/markerQuadCorners.js +31 -0
  179. package/src/core/markerSetIcon.js +9 -0
  180. package/src/core/markerSetPos.js +14 -0
  181. package/src/core/markerSetRotation.js +7 -0
  182. package/src/core/markerUpdateZIndex.js +8 -0
  183. package/src/core/nativeAddLatLng.js +3 -0
  184. package/src/core/nativeBringToBack.js +3 -0
  185. package/src/core/nativeBringToFront.js +3 -0
  186. package/src/core/nativeEvents.js +26 -0
  187. package/src/core/nativeImageError.js +8 -0
  188. package/src/core/nativeImageRefresh.js +7 -0
  189. package/src/core/nativeLayer.js +97 -0
  190. package/src/core/nativeLayerMethod.js +21 -0
  191. package/src/core/nativeRedraw.js +3 -0
  192. package/src/core/nativeSetBounds.js +3 -0
  193. package/src/core/nativeSetIcon.js +3 -0
  194. package/src/core/nativeSetLatLng.js +3 -0
  195. package/src/core/nativeSetLatLngs.js +3 -0
  196. package/src/core/nativeSetOpacity.js +3 -0
  197. package/src/core/nativeSetRadius.js +3 -0
  198. package/src/core/nativeSetStyle.js +3 -0
  199. package/src/core/nativeSetUrl.js +3 -0
  200. package/src/core/nativeSetZIndex.js +3 -0
  201. package/src/core/nativeSetZIndexOffset.js +3 -0
  202. package/src/core/popupAdjustPan.js +23 -0
  203. package/src/core/popupGetEvents.js +5 -0
  204. package/src/core/popupUpdatePosition.js +14 -0
  205. package/src/core/putNativeMesh.js +33 -0
  206. package/src/core/quadNativeMesh.js +15 -0
  207. package/src/core/readyNativeGPU.js +6 -0
  208. package/src/core/refreshNativeEvent.js +5 -0
  209. package/src/core/refreshNativeLayer.js +29 -0
  210. package/src/core/refreshNativeLayerContract.js +3 -0
  211. package/src/core/rejectNativeReady.js +3 -0
  212. package/src/core/removeImageState.js +8 -0
  213. package/src/core/removeNativeEvents.js +16 -0
  214. package/src/core/removeTargets.js +8 -0
  215. package/src/core/reorderNativeLayer.js +6 -0
  216. package/src/core/resolveNativeReady.js +3 -0
  217. package/src/core/restoreNativeEvents.js +6 -0
  218. package/src/core/runGridFades.js +14 -0
  219. package/src/core/runMarkerPanFrame.js +12 -0
  220. package/src/core/scheduleGridFade.js +9 -0
  221. package/src/core/scheduleMarkerPan.js +8 -0
  222. package/src/core/styleNativeMesh.js +10 -0
  223. package/src/core/syncGridLayer.js +22 -0
  224. package/src/core/syncImageOverlay.js +9 -0
  225. package/src/core/syncMarker.js +12 -0
  226. package/src/core/syncVectorLayer.js +26 -0
  227. package/src/core/synchronizeNativeLayer.js +35 -0
  228. package/src/core/textureFor.js +48 -0
  229. package/src/core/tooltipGetEvents.js +5 -0
  230. package/src/core/tooltipSetPosition.js +8 -0
  231. package/src/core/updateGridOpacity.js +23 -0
  232. package/src/core/updateNativeLayerView.js +6 -0
  233. package/src/core/uploadCanvasTexture.js +19 -0
  234. package/src/geometry/addBridges.js +88 -0
  235. package/src/geometry/below.js +3 -0
  236. package/src/geometry/box.js +3 -0
  237. package/src/geometry/bridgeElevation.js +19 -0
  238. package/src/geometry/bridgeLocal.js +4 -0
  239. package/src/geometry/build.js +19 -0
  240. package/src/geometry/circleAt.js +5 -0
  241. package/src/geometry/clipLine.js +23 -0
  242. package/src/geometry/clipSegment.js +19 -0
  243. package/src/geometry/computeBounds.js +33 -0
  244. package/src/geometry/conformModelToTerrain.js +67 -0
  245. package/src/geometry/cross.js +3 -0
  246. package/src/geometry/disk.js +11 -0
  247. package/src/geometry/diskAt.js +4 -0
  248. package/src/geometry/dot.js +6 -0
  249. package/src/geometry/emitter.js +8 -0
  250. package/src/geometry/lampPostGeometry.js +24 -0
  251. package/src/geometry/lampRing.js +11 -0
  252. package/src/geometry/lightGeometry.js +15 -0
  253. package/src/geometry/line.js +54 -0
  254. package/src/geometry/nativeGeometry.js +55 -0
  255. package/src/geometry/nativeTriangle.js +3 -0
  256. package/src/geometry/polygon.js +22 -0
  257. package/src/geometry/push.js +3 -0
  258. package/src/geometry/quad.js +4 -0
  259. package/src/geometry/roofCoverage.js +52 -0
  260. package/src/geometry/samePoint.js +3 -0
  261. package/src/geometry/segment.js +21 -0
  262. package/src/geometry/setVertexColor.js +15 -0
  263. package/src/geometry/sub.js +6 -0
  264. package/src/geometry/surface.js +17 -0
  265. package/src/geometry/treeGeometry.js +31 -0
  266. package/src/geometry/treeRing.js +14 -0
  267. package/src/geometry/triangle.js +12 -0
  268. package/src/geometry/vertexNormals.js +32 -0
  269. package/src/geometry/visit.js +9 -0
  270. package/src/index.js +98 -65
  271. package/src/lighting/cacheLightGrid.js +23 -0
  272. package/src/lighting/collectLightMeshes.js +6 -0
  273. package/src/lighting/lightGrid.js +42 -0
  274. package/src/lighting/updatePointLights.js +34 -0
  275. package/src/lighting/visitCells.js +15 -0
  276. package/src/lighting/worldLights.js +27 -0
  277. package/src/models/decodeModel.js +45 -0
  278. package/src/models/hasUnsupportedPrimitives.js +10 -0
  279. package/src/models/loadBuffer.js +6 -0
  280. package/src/models/loadImage.js +15 -0
  281. package/src/models/loadModel.js +69 -0
  282. package/src/models/materialFor.js +21 -0
  283. package/src/models/modelNode.js +93 -0
  284. package/src/models/nodeMatrix.js +22 -0
  285. package/src/models/readAccessor.js +53 -0
  286. package/src/models/readAccessorValues.js +16 -0
  287. package/src/models/textureFor.js +35 -0
  288. package/src/models/textureSampler.js +10 -0
  289. package/src/picking/collectVisibleMesh.js +4 -0
  290. package/src/picking/findFeature.js +49 -0
  291. package/src/picking/hit.js +23 -0
  292. package/src/picking/hitMesh.js +30 -0
  293. package/src/picking/onClick.js +13 -0
  294. package/src/picking/onPointerLeave.js +11 -0
  295. package/src/picking/onPointerMove.js +15 -0
  296. package/src/picking/pointerClick.js +5 -0
  297. package/src/picking/pointerLeave.js +5 -0
  298. package/src/picking/pointerMove.js +5 -0
  299. package/src/picking/raycast.js +59 -0
  300. package/src/picking/setHighlight.js +13 -0
  301. package/src/picking/shouldSkipOther.js +3 -0
  302. package/src/picking/showFeature.js +34 -0
  303. package/src/raster/addRasterTile.js +114 -0
  304. package/src/raster/comparePendingTiles.js +5 -0
  305. package/src/raster/createGeometry.js +22 -0
  306. package/src/raster/createRasterMesh.js +47 -0
  307. package/src/raster/finishAttachment.js +11 -0
  308. package/src/raster/finishRasterTile.js +47 -0
  309. package/src/raster/getRasterEvents.js +6 -0
  310. package/src/raster/getRasterTileSize.js +5 -0
  311. package/src/raster/initRaster.js +38 -0
  312. package/src/raster/isLoading.js +5 -0
  313. package/src/raster/loadRasterTile.js +10 -0
  314. package/src/raster/onPMTileAdd.js +10 -0
  315. package/src/raster/onPMTileRemove.js +8 -0
  316. package/src/raster/pruneRasterTiles.js +37 -0
  317. package/src/raster/pumpRasterTiles.js +22 -0
  318. package/src/raster/readyRaster.js +13 -0
  319. package/src/raster/registerTerrainTile.js +12 -0
  320. package/src/raster/releaseRasterTile.js +18 -0
  321. package/src/raster/releaseRasterTiles.js +15 -0
  322. package/src/raster/removeRasterTile.js +13 -0
  323. package/src/raster/reportError.js +6 -0
  324. package/src/raster/setPMTileOpacity.js +7 -0
  325. package/src/raster/setPMTileZIndex.js +7 -0
  326. package/src/raster/setRasterOpacity.js +11 -0
  327. package/src/raster/setRasterTerrain.js +21 -0
  328. package/src/raster/setRasterZIndex.js +11 -0
  329. package/src/raster/updateAttachedTiles.js +10 -0
  330. package/src/raster/updateRasterTiles.js +59 -0
  331. package/src/rendering/collectFrameMeshes.js +31 -0
  332. package/src/rendering/collectMeshes.js +36 -0
  333. package/src/rendering/compareMeshes.js +10 -0
  334. package/src/rendering/compareRoofTiles.js +4 -0
  335. package/src/rendering/composeRoofAtlas.js +52 -0
  336. package/src/rendering/createMesh.js +33 -0
  337. package/src/rendering/createProgram.js +92 -0
  338. package/src/rendering/destroyAfterSubmission.js +8 -0
  339. package/src/rendering/destroyTexture.js +6 -0
  340. package/src/rendering/disposeMesh.js +14 -0
  341. package/src/rendering/drawGeometry.js +129 -0
  342. package/src/rendering/drawSceneMeshes.js +51 -0
  343. package/src/rendering/ensureRoofBlit.js +40 -0
  344. package/src/rendering/prepareFrameMeshes.js +42 -0
  345. package/src/rendering/prepareFrameUniforms.js +49 -0
  346. package/src/rendering/rebuildRoofAtlas.js +67 -0
  347. package/src/rendering/render.js +57 -0
  348. package/src/rendering/reportCompilation.js +17 -0
  349. package/src/rendering/resizeRenderer.js +19 -0
  350. package/src/rendering/sortMeshes.js +6 -0
  351. package/src/rendering/synchronizeZoomView.js +34 -0
  352. package/src/rendering/textureBinding.js +7 -0
  353. package/src/rendering/updateMapCamera.js +32 -0
  354. package/src/rendering/updateRoofRaster.js +32 -0
  355. package/src/scene/attach.js +161 -0
  356. package/src/scene/attachLayer.js +10 -0
  357. package/src/scene/cancelUpdate.js +10 -0
  358. package/src/scene/emptyEvents.js +3 -0
  359. package/src/scene/emptyNode.js +11 -0
  360. package/src/scene/endZoom.js +16 -0
  361. package/src/scene/failAttachment.js +9 -0
  362. package/src/scene/get3DEvents.js +13 -0
  363. package/src/scene/init3D.js +30 -0
  364. package/src/scene/initializeLayer.js +16 -0
  365. package/src/scene/initializerFor.js +14 -0
  366. package/src/scene/layerInitialize.js +38 -0
  367. package/src/scene/layerLayerAdd.js +21 -0
  368. package/src/scene/onAdd3DLayer.js +35 -0
  369. package/src/scene/onMapChange.js +16 -0
  370. package/src/scene/onRemove3DLayer.js +69 -0
  371. package/src/scene/onZoomAnim.js +16 -0
  372. package/src/scene/placeEntry.js +11 -0
  373. package/src/scene/placeUnderEntry.js +8 -0
  374. package/src/scene/ready3D.js +25 -0
  375. package/src/scene/releaseRenderer.js +14 -0
  376. package/src/scene/removeEntry.js +6 -0
  377. package/src/scene/renderPendingMapChange.js +11 -0
  378. package/src/scene/renderPendingUpdates.js +19 -0
  379. package/src/scene/renderPendingZoomAnimation.js +7 -0
  380. package/src/scene/rendererDeviceError.js +10 -0
  381. package/src/scene/rendererDeviceLost.js +11 -0
  382. package/src/scene/replaceEntry.js +7 -0
  383. package/src/scene/reportError.js +3 -0
  384. package/src/scene/requestAdapter.js +12 -0
  385. package/src/scene/requestDevice.js +9 -0
  386. package/src/scene/resolveNextInitialization.js +12 -0
  387. package/src/scene/restoreObject.js +71 -0
  388. package/src/scene/runPlacements.js +7 -0
  389. package/src/scene/setParent.js +7 -0
  390. package/src/scene/showWebGPUWarning.js +16 -0
  391. package/src/scene/startZoom.js +5 -0
  392. package/src/scene/traverse.js +7 -0
  393. package/src/scene/underEntry.js +17 -0
  394. package/src/scene/update.js +19 -0
  395. package/src/scene/updateCamera.js +34 -0
  396. package/src/scene/updateWorldMatrix.js +48 -0
  397. package/src/{utils/shaders.js → shaders/materialShaders.js} +246 -237
  398. package/src/shadows/bindSunlight.js +12 -0
  399. package/src/shadows/drawShadowMeshes.js +48 -0
  400. package/src/shadows/ensureShadowPipeline.js +53 -0
  401. package/src/shadows/renderSunlight.js +46 -0
  402. package/src/shadows/resizeSunlight.js +15 -0
  403. package/src/shadows/shadowBounds.js +32 -0
  404. package/src/shadows/shadowCacheMatches.js +23 -0
  405. package/src/shadows/shadowMatrix.js +39 -0
  406. package/src/sources/addGeneratedTriangle.js +6 -0
  407. package/src/sources/addTriangle.js +17 -0
  408. package/src/sources/attachAreaMesh.js +58 -0
  409. package/src/sources/buildArea.js +42 -0
  410. package/src/sources/buildAreaFeature.js +41 -0
  411. package/src/sources/buildAreaPoint.js +25 -0
  412. package/src/sources/buildAreaPolygon.js +29 -0
  413. package/src/sources/compareAreaDistance.js +4 -0
  414. package/src/sources/generateTreeGeometry.js +11 -0
  415. package/src/sources/groundOffset.js +3 -0
  416. package/src/sources/initializeGeoJSON.js +8 -0
  417. package/src/sources/instanceAreaGeometry.js +29 -0
  418. package/src/sources/projectRing.js +20 -0
  419. package/src/sources/projectedTree.js +13 -0
  420. package/src/sources/pump.js +54 -0
  421. package/src/sources/releaseArea.js +22 -0
  422. package/src/sources/setGeoJSONData.js +12 -0
  423. package/src/sources/setGeoJSONLayerData.js +5 -0
  424. package/src/sources/sourceAreaContext.js +9 -0
  425. package/src/sources/updateArea.js +45 -0
  426. package/src/sources/updateStatus.js +12 -0
  427. package/src/sunlight/addTimeLayer.js +3 -0
  428. package/src/sunlight/addTo.js +10 -0
  429. package/src/sunlight/atmosphere.js +28 -0
  430. package/src/sunlight/horizontalPosition.js +16 -0
  431. package/src/sunlight/initSunlight.js +14 -0
  432. package/src/sunlight/initialize.js +11 -0
  433. package/src/sunlight/mix.js +6 -0
  434. package/src/sunlight/moonPosition.js +17 -0
  435. package/src/sunlight/onAdd.js +5 -0
  436. package/src/sunlight/onAddSun.js +66 -0
  437. package/src/sunlight/projectCelestialBody.js +13 -0
  438. package/src/sunlight/remove.js +7 -0
  439. package/src/sunlight/removeSun.js +15 -0
  440. package/src/sunlight/removeTimeLayer.js +3 -0
  441. package/src/sunlight/render.js +7 -0
  442. package/src/sunlight/rgb.js +6 -0
  443. package/src/sunlight/solarPosition.js +17 -0
  444. package/src/sunlight/styleTimeControl.js +7 -0
  445. package/src/sunlight/tickSun.js +5 -0
  446. package/src/sunlight/updateSky.js +20 -0
  447. package/src/sunlight/updateSun.js +34 -0
  448. package/src/sunlight/useLiveTime.js +6 -0
  449. package/src/sunlight/useSelectedTime.js +20 -0
  450. package/src/terrain/clearLayerTerrain.js +5 -0
  451. package/src/terrain/getElevation.js +10 -0
  452. package/src/terrain/initTerrain.js +20 -0
  453. package/src/terrain/loadReadyTerrain.js +5 -0
  454. package/src/terrain/loadTerrain.js +63 -0
  455. package/src/terrain/loadTerrainTiles.js +13 -0
  456. package/src/terrain/onTerrainAdd.js +21 -0
  457. package/src/terrain/onTerrainChange.js +14 -0
  458. package/src/terrain/onTerrainRemove.js +41 -0
  459. package/src/terrain/readBridges.js +4 -0
  460. package/src/terrain/sample.js +7 -0
  461. package/src/terrain/setLayerTerrain.js +5 -0
  462. package/src/terrain/setTerrainHeight.js +10 -0
  463. package/src/terrain/terrainAtlas.js +23 -0
  464. package/src/terrain/terrainElevation.js +20 -0
  465. package/src/terrain/terrainGrid.js +24 -0
  466. package/src/traffic/addTraffic.js +7 -0
  467. package/src/traffic/along.js +14 -0
  468. package/src/traffic/clockMinutes.js +6 -0
  469. package/src/traffic/compareDepartures.js +5 -0
  470. package/src/traffic/createTrafficMesh.js +7 -0
  471. package/src/traffic/destroyTrafficGpu.js +5 -0
  472. package/src/traffic/disposeTrafficObject.js +13 -0
  473. package/src/traffic/drawTrafficRoute.js +6 -0
  474. package/src/traffic/failTraffic.js +6 -0
  475. package/src/traffic/failedTrafficLoad.js +5 -0
  476. package/src/traffic/fetchTrafficLanes.js +10 -0
  477. package/src/traffic/groundTraffic.js +15 -0
  478. package/src/traffic/initTraffic.js +54 -0
  479. package/src/traffic/loadTraffic.js +15 -0
  480. package/src/traffic/loadedTrafficLanes.js +16 -0
  481. package/src/traffic/locateTraffic.js +9 -0
  482. package/src/traffic/moveTraffic.js +15 -0
  483. package/src/traffic/placeTraffic.js +21 -0
  484. package/src/traffic/prepareTraffic.js +25 -0
  485. package/src/traffic/readyTraffic.js +6 -0
  486. package/src/traffic/rebaseTraffic.js +58 -0
  487. package/src/traffic/rebuildTrafficMesh.js +28 -0
  488. package/src/traffic/removeTraffic.js +17 -0
  489. package/src/traffic/routeColor.js +6 -0
  490. package/src/traffic/routeGeometry.js +31 -0
  491. package/src/traffic/scheduledTrips.js +40 -0
  492. package/src/traffic/startTraffic.js +8 -0
  493. package/src/traffic/tickTraffic.js +57 -0
  494. package/src/traffic/toLanes.js +16 -0
  495. package/src/traffic/tooltip.js +11 -0
  496. package/src/traffic/trafficBounds.js +17 -0
  497. package/src/traffic/trafficNow.js +4 -0
  498. package/src/traffic/trafficStorage.js +5 -0
  499. package/src/traffic/tripsAt.js +27 -0
  500. package/src/traffic/updateTraffic.js +8 -0
  501. package/src/traffic/updateTrafficTerrain.js +12 -0
  502. package/src/traffic/vehicleOffsets.js +11 -0
  503. package/src/triangulation/area.js +9 -0
  504. package/src/triangulation/clean.js +18 -0
  505. package/src/triangulation/containsVertex.js +11 -0
  506. package/src/triangulation/cross.js +3 -0
  507. package/src/triangulation/crossesBoundary.js +8 -0
  508. package/src/triangulation/crossesRing.js +9 -0
  509. package/src/triangulation/equal.js +3 -0
  510. package/src/triangulation/inside.js +10 -0
  511. package/src/triangulation/insideHole.js +7 -0
  512. package/src/triangulation/intersects.js +11 -0
  513. package/src/triangulation/isClockWise.js +13 -0
  514. package/src/triangulation/minimumX.js +6 -0
  515. package/src/triangulation/on.js +4 -0
  516. package/src/triangulation/sortHoles.js +26 -0
  517. package/src/triangulation/triangulate.js +86 -0
  518. package/src/utils/channel.js +4 -0
  519. package/src/utils/compareDistance.js +3 -0
  520. package/src/utils/noOperation.js +1 -0
  521. package/src/utils/parseColor.js +42 -0
  522. package/src/utils/toSRGB.js +3 -0
  523. package/src/utils/wrap.js +3 -0
  524. package/src/vehicles/bicycleModel.js +23 -0
  525. package/src/vehicles/boatBenches.js +8 -0
  526. package/src/vehicles/boatModel.js +27 -0
  527. package/src/vehicles/busModel.js +6 -0
  528. package/src/vehicles/carModel.js +22 -0
  529. package/src/vehicles/carriage.js +19 -0
  530. package/src/vehicles/metroModel.js +9 -0
  531. package/src/vehicles/mirror.js +8 -0
  532. package/src/vehicles/pedestrianModel.js +17 -0
  533. package/src/vehicles/tramModel.js +9 -0
  534. package/src/walk/blocked.js +6 -0
  535. package/src/walk/createWalk.js +60 -0
  536. package/src/walk/initWalk.js +18 -0
  537. package/src/walk/initialize.js +6 -0
  538. package/src/walk/local.js +10 -0
  539. package/src/walk/onAdd.js +4 -0
  540. package/src/walk/onBlur.js +3 -0
  541. package/src/walk/onKey.js +12 -0
  542. package/src/walk/onPointer.js +13 -0
  543. package/src/walk/onRemove.js +4 -0
  544. package/src/walk/onTerrain.js +5 -0
  545. package/src/walk/place.js +18 -0
  546. package/src/walk/start.js +37 -0
  547. package/src/walk/step.js +53 -0
  548. package/src/walk/stop.js +27 -0
  549. package/src/walk/toggle.js +6 -0
  550. package/dist/scene/gpu.js +0 -3
  551. package/dist/scene/gpu.js.map +0 -7
  552. package/dist/scene/lighting.js +0 -9
  553. package/dist/scene/lighting.js.map +0 -7
  554. package/dist/scene/model.js +0 -2
  555. package/dist/scene/model.js.map +0 -7
  556. package/dist/scene/picking.js +0 -2
  557. package/dist/scene/picking.js.map +0 -7
  558. package/dist/scene/pmtiles.js +0 -2
  559. package/dist/scene/pmtiles.js.map +0 -7
  560. package/dist/scene/render.js +0 -15
  561. package/dist/scene/render.js.map +0 -7
  562. package/dist/scene/sources.js +0 -2
  563. package/dist/scene/sources.js.map +0 -7
  564. package/dist/types/3d.js +0 -2
  565. package/dist/types/3d.js.map +0 -7
  566. package/dist/types/geojson.js +0 -2
  567. package/dist/types/geojson.js.map +0 -7
  568. package/dist/types/pmtiles.js +0 -2
  569. package/dist/types/pmtiles.js.map +0 -7
  570. package/dist/types/sunlight.js +0 -2
  571. package/dist/types/sunlight.js.map +0 -7
  572. package/dist/types/terrain.js +0 -24
  573. package/dist/types/terrain.js.map +0 -7
  574. package/dist/types/traffic.js +0 -41
  575. package/dist/types/traffic.js.map +0 -7
  576. package/dist/types/walk.js +0 -2
  577. package/dist/types/walk.js.map +0 -7
  578. package/dist/utils/control.js +0 -2
  579. package/dist/utils/control.js.map +0 -7
  580. package/dist/utils/geometry.js +0 -2
  581. package/dist/utils/geometry.js.map +0 -7
  582. package/dist/utils/lighting.js +0 -2
  583. package/dist/utils/lighting.js.map +0 -7
  584. package/dist/utils/model.js +0 -2
  585. package/dist/utils/model.js.map +0 -7
  586. package/dist/utils/picking.js +0 -2
  587. package/dist/utils/picking.js.map +0 -7
  588. package/dist/utils/pmtiles.js +0 -2
  589. package/dist/utils/pmtiles.js.map +0 -7
  590. package/dist/utils/scene.js +0 -2
  591. package/dist/utils/scene.js.map +0 -7
  592. package/dist/utils/shaders.js +0 -203
  593. package/dist/utils/shaders.js.map +0 -7
  594. package/dist/utils/sun.js +0 -2
  595. package/dist/utils/sun.js.map +0 -7
  596. package/dist/utils/terrain.js +0 -2
  597. package/dist/utils/terrain.js.map +0 -7
  598. package/dist/utils/traffic.js +0 -2
  599. package/dist/utils/traffic.js.map +0 -7
  600. package/dist/utils/vehicles.js +0 -2
  601. package/dist/utils/vehicles.js.map +0 -7
  602. package/dist/utils/walk.js +0 -2
  603. package/dist/utils/walk.js.map +0 -7
  604. package/src/scene/gpu.js +0 -438
  605. package/src/scene/lighting.js +0 -193
  606. package/src/scene/model.js +0 -204
  607. package/src/scene/picking.js +0 -150
  608. package/src/scene/pmtiles.js +0 -94
  609. package/src/scene/render.js +0 -467
  610. package/src/scene/sources.js +0 -265
  611. package/src/types/3d.js +0 -337
  612. package/src/types/geojson.js +0 -42
  613. package/src/types/pmtiles.js +0 -143
  614. package/src/types/sunlight.js +0 -142
  615. package/src/types/terrain.js +0 -331
  616. package/src/types/traffic.js +0 -356
  617. package/src/types/walk.js +0 -219
  618. package/src/utils/control.js +0 -18
  619. package/src/utils/geometry.js +0 -256
  620. package/src/utils/lighting.js +0 -51
  621. package/src/utils/model.js +0 -178
  622. package/src/utils/picking.js +0 -119
  623. package/src/utils/pmtiles.js +0 -79
  624. package/src/utils/scene.js +0 -102
  625. package/src/utils/sun.js +0 -71
  626. package/src/utils/terrain.js +0 -78
  627. package/src/utils/traffic.js +0 -90
  628. package/src/utils/vehicles.js +0 -69
  629. package/src/utils/walk.js +0 -72
@@ -1,203 +0,0 @@
1
- function T(e={},t=!1,x=""){const n=!!e.baseTexture,l=!!e.metalTexture,c=!!e.emissiveTexture,u=!!e.occlusionTexture,o=!!e.roofTexture,s=!!e.terrain,i=n||l||c||u||e.nightLight,p=`
2
- struct Mesh {
3
- worldMatrix: mat4x4<f32>,
4
- baseColor: vec4<f32>,
5
- material: vec4<f32>,
6
- emissive: vec4<f32>,
7
- terrain: vec4<f32>,
8
- highlight: vec4<f32>,
9
- };
10
- struct Frame {
11
- viewMatrix: mat4x4<f32>,
12
- projectionMatrix: mat4x4<f32>,
13
- roofMatrix: mat4x4<f32>,
14
- lightDirection: vec4<f32>,
15
- skyDirection: vec4<f32>,
16
- atmosphereTint: vec4<f32>,
17
- };
18
- @group(0) @binding(0) var<uniform> u: Mesh;
19
- @group(0) @binding(1) var<uniform> frame: Frame;
20
- struct Solar { matrix: mat4x4<f32>, params: vec4<f32> };
21
- @group(1) @binding(0) var<uniform> solar: Solar;
22
- ${s?`@group(0) @binding(2) var dem: texture_2d<f32>;${x}`:""}
23
- struct VertexInput {
24
- @location(0) position: vec3<f32>,
25
- @location(1) normal: vec3<f32>,
26
- ${e.vertexColors?"@location(2) color: vec3<f32>,":""}
27
- ${i?"@location(3) uv: vec2<f32>,":""}
28
- };
29
- struct VertexOutput {
30
- @builtin(position) position: vec4<f32>,
31
- @location(0) color: vec3<f32>,
32
- @location(1) normal: vec3<f32>,
33
- @location(2) viewPosition: vec3<f32>,
34
- @location(6) shadowPosition: vec4<f32>,
35
- @location(7) worldPosition: vec3<f32>,
36
- ${t?"@location(8) localPosition: vec3<f32>,":""}
37
- ${i?"@location(3) uv: vec2<f32>,":""}
38
- ${o?"@location(4) roofUv: vec2<f32>, @location(5) roof: f32,":""}
39
- };
40
- @vertex fn vertexMain(input: VertexInput, @builtin(vertex_index) vertexIndex: u32) -> VertexOutput {
41
- var output: VertexOutput;
42
- var position = input.position;
43
- ${s?"position.y = elevation(u.terrain.xy + input.uv * u.terrain.z, u.terrain.w) - u.terrain.w;":""}
44
- let highlighted = f32(vertexIndex) >= u.highlight.x && f32(vertexIndex) < u.highlight.y;
45
- output.color = ${e.vertexColors?"select(input.color, vec3<f32>(72.0 / 255.0, 217.0 / 255.0, 1.0), highlighted)":"u.baseColor.rgb"};
46
- // Inverse-transpose from cofactors; the camera view matrix is orthonormal.
47
- let m = mat3x3<f32>(u.worldMatrix[0].xyz, u.worldMatrix[1].xyz, u.worldMatrix[2].xyz);
48
- let normal = (cross(m[1], m[2]) * input.normal.x + cross(m[2], m[0]) * input.normal.y +
49
- cross(m[0], m[1]) * input.normal.z) / determinant(m);
50
- output.normal = (frame.viewMatrix * vec4<f32>(normal, 0.0)).xyz;
51
- let world = u.worldMatrix * vec4<f32>(position, 1.0);
52
- output.shadowPosition = solar.matrix * world;
53
- output.worldPosition = world.xyz / world.w;
54
- ${t?"output.localPosition = input.position;":""}
55
- let viewPosition = frame.viewMatrix * world;
56
- output.viewPosition = viewPosition.xyz;
57
- ${i?"output.uv = input.uv;":""}
58
- ${o?`
59
- output.roofUv = (frame.roofMatrix * world).xz;
60
- output.roof = select(0.0, 1.0, input.normal.y >= 0.5 && !highlighted);
61
- `:""}
62
- output.position = frame.projectionMatrix * viewPosition;
63
- return output;
64
- }
65
- `,v=[];let a=3;const r=(f,$)=>{if(!$)return"";v.push({name:f,texture:a,sampler:a+1});const m=a;return a+=2,`@group(0) @binding(${m}) var ${f}: texture_2d<f32>;
66
- @group(0) @binding(${m+1}) var ${f}Sampler: sampler;`},g=r("baseTexture",n),d=r("metalTexture",l),h=r("emissiveTexture",c),w=r("occlusionTexture",u),b=r("roofTexture",o),y=`
67
- struct Mesh {
68
- worldMatrix: mat4x4<f32>,
69
- baseColor: vec4<f32>,
70
- material: vec4<f32>,
71
- emissive: vec4<f32>,
72
- terrain: vec4<f32>,
73
- highlight: vec4<f32>,
74
- };
75
- struct Frame {
76
- viewMatrix: mat4x4<f32>,
77
- projectionMatrix: mat4x4<f32>,
78
- roofMatrix: mat4x4<f32>,
79
- lightDirection: vec4<f32>,
80
- skyDirection: vec4<f32>,
81
- atmosphereTint: vec4<f32>,
82
- };
83
- struct Solar {
84
- matrix: mat4x4<f32>,
85
- params: vec4<f32>,
86
- };
87
- @group(0) @binding(0) var<uniform> u: Mesh;
88
- @group(0) @binding(1) var<uniform> frame: Frame;
89
- @group(1) @binding(0) var<uniform> solar: Solar;
90
- @group(1) @binding(1) var shadowTexture: texture_depth_2d;
91
- @group(1) @binding(2) var shadowSampler: sampler_comparison;
92
- @group(1) @binding(3) var<storage, read> lightGrid: array<vec4<f32>>;
93
- ${g}${d}${h}${w}${b}
94
- struct FragmentInput {
95
- @location(0) color: vec3<f32>,
96
- @location(1) normal: vec3<f32>,
97
- @location(2) viewPosition: vec3<f32>,
98
- @location(6) shadowPosition: vec4<f32>,
99
- @location(7) worldPosition: vec3<f32>,
100
- ${t?"@location(8) localPosition: vec3<f32>,":""}
101
- ${i?"@location(3) uv: vec2<f32>,":""}
102
- ${o?"@location(4) roofUv: vec2<f32>, @location(5) roof: f32,":""}
103
- };
104
- const PI: f32 = 3.14159265;
105
- fn toLinear(c: vec3<f32>) -> vec3<f32> {
106
- return select(c / 12.92, pow((c + vec3<f32>(0.055)) / 1.055, vec3<f32>(2.4)), c >= vec3<f32>(0.04045));
107
- }
108
- fn toSRGB(c: vec3<f32>) -> vec3<f32> {
109
- return select(c * 12.92, 1.055 * pow(max(c, vec3<f32>(0.0)), vec3<f32>(1.0 / 2.4)) - vec3<f32>(0.055), c >= vec3<f32>(0.0031308));
110
- }
111
- fn sunVisibility(position: vec4<f32>) -> f32 {
112
- let p = position.xyz / position.w;
113
- let uv = vec2<f32>(p.x * 0.5 + 0.5, 0.5 - p.y * 0.5);
114
- if (solar.params.x < 0.5 || any(uv < vec2<f32>(0.0)) || any(uv > vec2<f32>(1.0)) || p.z < 0.0 || p.z > 1.0) {
115
- return 1.0;
116
- }
117
- return textureSampleCompareLevel(shadowTexture, shadowSampler, uv, p.z - 0.0003);
118
- }
119
- fn localLighting(position: vec3<f32>, normal: vec3<f32>) -> vec3<f32> {
120
- if (frame.skyDirection.w <= 0.0 || lightGrid[0].w < 1.0) { return vec3<f32>(0.0); }
121
- let cell = vec2<i32>(floor((position.xz - lightGrid[0].xy) / lightGrid[0].z));
122
- if (any(cell < vec2<i32>(0)) || cell.x >= i32(lightGrid[0].w) || cell.y >= i32(lightGrid[1].x)) {
123
- return vec3<f32>(0.0);
124
- }
125
- let header = lightGrid[2u + u32(cell.y) * u32(lightGrid[0].w) + u32(cell.x)];
126
- var light = vec3<f32>(0.0);
127
- for (var i = 0u; i < u32(header.y); i++) {
128
- let source = lightGrid[u32(header.x) + i * 2u];
129
- let colour = lightGrid[u32(header.x) + i * 2u + 1u];
130
- let delta = source.xyz - position;
131
- let distance2 = max(dot(delta, delta), 1.0);
132
- let falloff = max(0.0, 1.0 - distance2 / (source.w * source.w));
133
- let lambert = max(0.0, dot(normal, delta / sqrt(distance2)));
134
- light += toLinear(colour.rgb) * colour.w * lambert * falloff * falloff / distance2;
135
- }
136
- return light * frame.skyDirection.w;
137
- }
138
- @fragment fn fragmentMain(input: FragmentInput, @builtin(front_facing) frontFacing: bool) -> @location(0) vec4<f32> {
139
- ${e.nightLight?`
140
- if (input.uv.x <= 2.0) {
141
- let radial = max(0.0, 1.0 - dot(input.uv, input.uv));
142
- let alpha = radial * radial * frame.skyDirection.w * 0.65;
143
- if (alpha < 0.005) { discard; }
144
- return vec4<f32>(input.color, alpha);
145
- }
146
- `:""}
147
- let sunlight = sunVisibility(input.shadowPosition);
148
- let worldNormal = normalize(transpose(mat3x3<f32>(frame.viewMatrix[0].xyz, frame.viewMatrix[1].xyz, frame.viewMatrix[2].xyz)) * normalize(input.normal)) * select(-1.0, 1.0, frontFacing);
149
- let artificial = localLighting(input.worldPosition, worldNormal);
150
- ${e.unlit?`
151
- let rasterTexel = textureSample(baseTexture, baseTextureSampler, input.uv);
152
- return vec4<f32>(toSRGB(toLinear(rasterTexel.rgb) * (frame.atmosphereTint.rgb * (0.55 + 0.45 * sunlight) + artificial)), ${e.alphaMode==="BLEND"?"u.material.z * rasterTexel.a":"1.0"});
153
- `:`
154
- var normal = normalize(input.normal) * select(-1.0, 1.0, frontFacing);
155
- let texel = ${n?"textureSample(baseTexture, baseTextureSampler, input.uv)":"vec4<f32>(1.0)"};
156
- let alpha = u.material.z * texel.a;
157
- ${e.alphaMode==="MASK"?"if (alpha < u.material.w) { discard; }":""}
158
- ${e.alphaMode==="BLEND"?"if (alpha < 0.01) { discard; }":""}
159
- var base = ${e.vertexColors?"toLinear(min(input.color, vec3<f32>(1.0)))":"input.color"} *
160
- ${e.baseTexture?.srgb?"texel.rgb":"toLinear(texel.rgb)"};
161
- ${o?`
162
- if (input.roof > 0.5 && all(input.roofUv >= vec2<f32>(0.0)) &&
163
- all(input.roofUv <= vec2<f32>(1.0))) {
164
- let roof = textureSampleLevel(roofTexture, roofTextureSampler, input.roofUv, 0.0);
165
- base = mix(base, toLinear(roof.rgb), roof.a);
166
- }
167
- `:""}
168
- let mr = ${l?"textureSample(metalTexture, metalTextureSampler, input.uv)":"vec4<f32>(1.0)"};
169
- let metal = clamp(u.material.x * mr.b, 0.0, 1.0);
170
- let rough = clamp(u.material.y * mr.g, 0.08, 1.0);
171
- let view = normalize(-input.viewPosition);
172
- let halfVector = normalize(view + frame.lightDirection.xyz);
173
- let nl = max(dot(normal, frame.lightDirection.xyz), 0.0) * frame.lightDirection.w * sunlight;
174
- let nv = max(dot(normal, view), 0.001);
175
- let nh = max(dot(normal, halfVector), 0.0);
176
- let vh = max(dot(view, halfVector), 0.0);
177
- let a2 = pow(rough, 4.0);
178
- let d = a2 / max(PI * pow(nh * nh * (a2 - 1.0) + 1.0, 2.0), 0.0001);
179
- let gv = nl * sqrt(nv * nv * (1.0 - a2) + a2);
180
- let gl = nv * sqrt(nl * nl * (1.0 - a2) + a2);
181
- let visibility = 0.5 / max(gv + gl, 0.0001);
182
- let f0 = mix(vec3<f32>(0.04), base, metal);
183
- let fresnel = f0 + (1.0 - f0) * pow(1.0 - vh, 5.0);
184
- let specular = d * visibility * fresnel;
185
- let diffuse = (1.0 - metal) * base / PI;
186
- let sky = dot(normal, frame.skyDirection.xyz) * 0.5 + 0.5;
187
- let ambient = mix(toLinear(vec3<f32>(0.455, 0.412, 0.322)), vec3<f32>(1.0), sky) * (2.0 / PI);
188
- let ao = ${u?"mix(1.0, textureSample(occlusionTexture, occlusionTextureSampler, input.uv).r, u.emissive.w)":"1.0"};
189
- ${t?`
190
- let lattice = (fract(input.localPosition / 2.5) - 0.5) * 2.5;
191
- let pointGlow = (1.0 - smoothstep(0.16, 0.42, length(lattice))) * u.highlight.z;
192
- `:""}
193
- // Vertex colour components above 1 are self-lit (e.g. vehicle lamps): dim by day, bright at night.
194
- let glow = ${t?"vec3<f32>(3.0, 2.6, 1.8) * pointGlow +":""}${e.vertexColors?" max(input.color - vec3<f32>(1.0), vec3<f32>(0.0)) * (0.3 + 5.0 * frame.skyDirection.w) +":""} u.emissive.rgb * ${c?e.emissiveTexture.srgb?"textureSample(emissiveTexture, emissiveTextureSampler, input.uv).rgb":"toLinear(textureSample(emissiveTexture, emissiveTextureSampler, input.uv).rgb)":"vec3<f32>(1.0)"};
195
- var color = ambient * base * (1.0 - metal) * ao +
196
- (diffuse + specular) * nl * toLinear(vec3<f32>(1.0, 0.937, 0.835)) * 3.0 + glow;
197
- ${e.vertexColors?"color = base * (ambient + toLinear(vec3<f32>(1.0, 0.937, 0.835)) * (3.0 / PI) * nl) + glow;":""}
198
- color = (color - glow) * frame.atmosphereTint.rgb + base * artificial * (1.0 - metal * 0.5) + glow;
199
- return vec4<f32>(toSRGB(color), ${e.alphaMode==="BLEND"?"alpha":"1.0"});
200
- `}
201
- }
202
- `;return{vertex:p,fragment:y,bindings:v,textured:i,hasTerrain:s}}export{T as materialShaders};
203
- //# sourceMappingURL=shaders.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/shaders.js"],
4
- "sourcesContent": ["/** Material WGSL and texture bindings, without a GPU device or Leaflet layer. */\r\nexport function materialShaders(material = {}, sparkle = false, elevationWGSL = '') {\r\n const hasBase = Boolean(material.baseTexture);\r\n const hasMetal = Boolean(material.metalTexture);\r\n const hasEmissive = Boolean(material.emissiveTexture);\r\n const hasOcclusion = Boolean(material.occlusionTexture);\r\n const hasRoof = Boolean(material.roofTexture);\r\n const hasTerrain = Boolean(material.terrain);\r\n const textured = hasBase || hasMetal || hasEmissive || hasOcclusion || material.nightLight;\r\n const vertex = `\r\n struct Mesh {\r\n worldMatrix: mat4x4<f32>,\r\n baseColor: vec4<f32>,\r\n material: vec4<f32>,\r\n emissive: vec4<f32>,\r\n terrain: vec4<f32>,\r\n highlight: vec4<f32>,\r\n };\r\n struct Frame {\r\n viewMatrix: mat4x4<f32>,\r\n projectionMatrix: mat4x4<f32>,\r\n roofMatrix: mat4x4<f32>,\r\n lightDirection: vec4<f32>,\r\n skyDirection: vec4<f32>,\r\n atmosphereTint: vec4<f32>,\r\n };\r\n @group(0) @binding(0) var<uniform> u: Mesh;\r\n @group(0) @binding(1) var<uniform> frame: Frame;\r\n struct Solar { matrix: mat4x4<f32>, params: vec4<f32> };\r\n @group(1) @binding(0) var<uniform> solar: Solar;\r\n ${hasTerrain ? `@group(0) @binding(2) var dem: texture_2d<f32>;${elevationWGSL}` : ''}\r\n struct VertexInput {\r\n @location(0) position: vec3<f32>,\r\n @location(1) normal: vec3<f32>,\r\n ${material.vertexColors ? '@location(2) color: vec3<f32>,' : ''}\r\n ${textured ? '@location(3) uv: vec2<f32>,' : ''}\r\n };\r\n struct VertexOutput {\r\n @builtin(position) position: vec4<f32>,\r\n @location(0) color: vec3<f32>,\r\n @location(1) normal: vec3<f32>,\r\n @location(2) viewPosition: vec3<f32>,\r\n @location(6) shadowPosition: vec4<f32>,\r\n @location(7) worldPosition: vec3<f32>,\r\n ${sparkle ? '@location(8) localPosition: vec3<f32>,' : ''}\r\n ${textured ? '@location(3) uv: vec2<f32>,' : ''}\r\n ${hasRoof ? '@location(4) roofUv: vec2<f32>, @location(5) roof: f32,' : ''}\r\n };\r\n @vertex fn vertexMain(input: VertexInput, @builtin(vertex_index) vertexIndex: u32) -> VertexOutput {\r\n var output: VertexOutput;\r\n var position = input.position;\r\n ${hasTerrain ? 'position.y = elevation(u.terrain.xy + input.uv * u.terrain.z, u.terrain.w) - u.terrain.w;' : ''}\r\n let highlighted = f32(vertexIndex) >= u.highlight.x && f32(vertexIndex) < u.highlight.y;\r\n output.color = ${material.vertexColors\r\n ? 'select(input.color, vec3<f32>(72.0 / 255.0, 217.0 / 255.0, 1.0), highlighted)'\r\n : 'u.baseColor.rgb'};\r\n // Inverse-transpose from cofactors; the camera view matrix is orthonormal.\r\n let m = mat3x3<f32>(u.worldMatrix[0].xyz, u.worldMatrix[1].xyz, u.worldMatrix[2].xyz);\r\n let normal = (cross(m[1], m[2]) * input.normal.x + cross(m[2], m[0]) * input.normal.y +\r\n cross(m[0], m[1]) * input.normal.z) / determinant(m);\r\n output.normal = (frame.viewMatrix * vec4<f32>(normal, 0.0)).xyz;\r\n let world = u.worldMatrix * vec4<f32>(position, 1.0);\r\n output.shadowPosition = solar.matrix * world;\r\n output.worldPosition = world.xyz / world.w;\r\n ${sparkle ? 'output.localPosition = input.position;' : ''}\r\n let viewPosition = frame.viewMatrix * world;\r\n output.viewPosition = viewPosition.xyz;\r\n ${textured ? 'output.uv = input.uv;' : ''}\r\n ${hasRoof ? `\r\n output.roofUv = (frame.roofMatrix * world).xz;\r\n output.roof = select(0.0, 1.0, input.normal.y >= 0.5 && !highlighted);\r\n ` : ''}\r\n output.position = frame.projectionMatrix * viewPosition;\r\n return output;\r\n }\r\n `;\r\n const bindings = [];\r\n let binding = 3;\r\n const textureBinding = (name, enabled) => {\r\n if (!enabled) return '';\r\n bindings.push({ name, texture: binding, sampler: binding + 1 });\r\n const current = binding;\r\n binding += 2;\r\n return `@group(0) @binding(${current}) var ${name}: texture_2d<f32>;\r\n @group(0) @binding(${current + 1}) var ${name}Sampler: sampler;`;\r\n };\r\n const baseBinding = textureBinding('baseTexture', hasBase);\r\n const metalBinding = textureBinding('metalTexture', hasMetal);\r\n const emissiveBinding = textureBinding('emissiveTexture', hasEmissive);\r\n const occlusionBinding = textureBinding('occlusionTexture', hasOcclusion);\r\n const roofBinding = textureBinding('roofTexture', hasRoof);\r\n const fragment = `\r\n struct Mesh {\r\n worldMatrix: mat4x4<f32>,\r\n baseColor: vec4<f32>,\r\n material: vec4<f32>,\r\n emissive: vec4<f32>,\r\n terrain: vec4<f32>,\r\n highlight: vec4<f32>,\r\n };\r\n struct Frame {\r\n viewMatrix: mat4x4<f32>,\r\n projectionMatrix: mat4x4<f32>,\r\n roofMatrix: mat4x4<f32>,\r\n lightDirection: vec4<f32>,\r\n skyDirection: vec4<f32>,\r\n atmosphereTint: vec4<f32>,\r\n };\r\n struct Solar {\r\n matrix: mat4x4<f32>,\r\n params: vec4<f32>,\r\n };\r\n @group(0) @binding(0) var<uniform> u: Mesh;\r\n @group(0) @binding(1) var<uniform> frame: Frame;\r\n @group(1) @binding(0) var<uniform> solar: Solar;\r\n @group(1) @binding(1) var shadowTexture: texture_depth_2d;\r\n @group(1) @binding(2) var shadowSampler: sampler_comparison;\r\n @group(1) @binding(3) var<storage, read> lightGrid: array<vec4<f32>>;\r\n ${baseBinding}${metalBinding}${emissiveBinding}${occlusionBinding}${roofBinding}\r\n struct FragmentInput {\r\n @location(0) color: vec3<f32>,\r\n @location(1) normal: vec3<f32>,\r\n @location(2) viewPosition: vec3<f32>,\r\n @location(6) shadowPosition: vec4<f32>,\r\n @location(7) worldPosition: vec3<f32>,\r\n ${sparkle ? '@location(8) localPosition: vec3<f32>,' : ''}\r\n ${textured ? '@location(3) uv: vec2<f32>,' : ''}\r\n ${hasRoof ? '@location(4) roofUv: vec2<f32>, @location(5) roof: f32,' : ''}\r\n };\r\n const PI: f32 = 3.14159265;\r\n fn toLinear(c: vec3<f32>) -> vec3<f32> {\r\n return select(c / 12.92, pow((c + vec3<f32>(0.055)) / 1.055, vec3<f32>(2.4)), c >= vec3<f32>(0.04045));\r\n }\r\n fn toSRGB(c: vec3<f32>) -> vec3<f32> {\r\n return select(c * 12.92, 1.055 * pow(max(c, vec3<f32>(0.0)), vec3<f32>(1.0 / 2.4)) - vec3<f32>(0.055), c >= vec3<f32>(0.0031308));\r\n }\r\n fn sunVisibility(position: vec4<f32>) -> f32 {\r\n let p = position.xyz / position.w;\r\n let uv = vec2<f32>(p.x * 0.5 + 0.5, 0.5 - p.y * 0.5);\r\n if (solar.params.x < 0.5 || any(uv < vec2<f32>(0.0)) || any(uv > vec2<f32>(1.0)) || p.z < 0.0 || p.z > 1.0) {\r\n return 1.0;\r\n }\r\n return textureSampleCompareLevel(shadowTexture, shadowSampler, uv, p.z - 0.0003);\r\n }\r\n fn localLighting(position: vec3<f32>, normal: vec3<f32>) -> vec3<f32> {\r\n if (frame.skyDirection.w <= 0.0 || lightGrid[0].w < 1.0) { return vec3<f32>(0.0); }\r\n let cell = vec2<i32>(floor((position.xz - lightGrid[0].xy) / lightGrid[0].z));\r\n if (any(cell < vec2<i32>(0)) || cell.x >= i32(lightGrid[0].w) || cell.y >= i32(lightGrid[1].x)) {\r\n return vec3<f32>(0.0);\r\n }\r\n let header = lightGrid[2u + u32(cell.y) * u32(lightGrid[0].w) + u32(cell.x)];\r\n var light = vec3<f32>(0.0);\r\n for (var i = 0u; i < u32(header.y); i++) {\r\n let source = lightGrid[u32(header.x) + i * 2u];\r\n let colour = lightGrid[u32(header.x) + i * 2u + 1u];\r\n let delta = source.xyz - position;\r\n let distance2 = max(dot(delta, delta), 1.0);\r\n let falloff = max(0.0, 1.0 - distance2 / (source.w * source.w));\r\n let lambert = max(0.0, dot(normal, delta / sqrt(distance2)));\r\n light += toLinear(colour.rgb) * colour.w * lambert * falloff * falloff / distance2;\r\n }\r\n return light * frame.skyDirection.w;\r\n }\r\n @fragment fn fragmentMain(input: FragmentInput, @builtin(front_facing) frontFacing: bool) -> @location(0) vec4<f32> {\r\n ${material.nightLight ? `\r\n if (input.uv.x <= 2.0) {\r\n let radial = max(0.0, 1.0 - dot(input.uv, input.uv));\r\n let alpha = radial * radial * frame.skyDirection.w * 0.65;\r\n if (alpha < 0.005) { discard; }\r\n return vec4<f32>(input.color, alpha);\r\n }\r\n ` : ''}\r\n let sunlight = sunVisibility(input.shadowPosition);\r\n let worldNormal = normalize(transpose(mat3x3<f32>(frame.viewMatrix[0].xyz, frame.viewMatrix[1].xyz, frame.viewMatrix[2].xyz)) * normalize(input.normal)) * select(-1.0, 1.0, frontFacing);\r\n let artificial = localLighting(input.worldPosition, worldNormal);\r\n ${material.unlit ? `\r\n let rasterTexel = textureSample(baseTexture, baseTextureSampler, input.uv);\r\n return vec4<f32>(toSRGB(toLinear(rasterTexel.rgb) * (frame.atmosphereTint.rgb * (0.55 + 0.45 * sunlight) + artificial)), ${material.alphaMode === 'BLEND' ? 'u.material.z * rasterTexel.a' : '1.0'});\r\n ` : `\r\n var normal = normalize(input.normal) * select(-1.0, 1.0, frontFacing);\r\n let texel = ${hasBase ? 'textureSample(baseTexture, baseTextureSampler, input.uv)' : 'vec4<f32>(1.0)'};\r\n let alpha = u.material.z * texel.a;\r\n ${material.alphaMode === 'MASK' ? 'if (alpha < u.material.w) { discard; }' : ''}\r\n ${material.alphaMode === 'BLEND' ? 'if (alpha < 0.01) { discard; }' : ''}\r\n var base = ${material.vertexColors ? 'toLinear(min(input.color, vec3<f32>(1.0)))' : 'input.color'} *\r\n ${material.baseTexture?.srgb ? 'texel.rgb' : 'toLinear(texel.rgb)'};\r\n ${hasRoof ? `\r\n if (input.roof > 0.5 && all(input.roofUv >= vec2<f32>(0.0)) &&\r\n all(input.roofUv <= vec2<f32>(1.0))) {\r\n let roof = textureSampleLevel(roofTexture, roofTextureSampler, input.roofUv, 0.0);\r\n base = mix(base, toLinear(roof.rgb), roof.a);\r\n }\r\n ` : ''}\r\n let mr = ${hasMetal ? 'textureSample(metalTexture, metalTextureSampler, input.uv)' : 'vec4<f32>(1.0)'};\r\n let metal = clamp(u.material.x * mr.b, 0.0, 1.0);\r\n let rough = clamp(u.material.y * mr.g, 0.08, 1.0);\r\n let view = normalize(-input.viewPosition);\r\n let halfVector = normalize(view + frame.lightDirection.xyz);\r\n let nl = max(dot(normal, frame.lightDirection.xyz), 0.0) * frame.lightDirection.w * sunlight;\r\n let nv = max(dot(normal, view), 0.001);\r\n let nh = max(dot(normal, halfVector), 0.0);\r\n let vh = max(dot(view, halfVector), 0.0);\r\n let a2 = pow(rough, 4.0);\r\n let d = a2 / max(PI * pow(nh * nh * (a2 - 1.0) + 1.0, 2.0), 0.0001);\r\n let gv = nl * sqrt(nv * nv * (1.0 - a2) + a2);\r\n let gl = nv * sqrt(nl * nl * (1.0 - a2) + a2);\r\n let visibility = 0.5 / max(gv + gl, 0.0001);\r\n let f0 = mix(vec3<f32>(0.04), base, metal);\r\n let fresnel = f0 + (1.0 - f0) * pow(1.0 - vh, 5.0);\r\n let specular = d * visibility * fresnel;\r\n let diffuse = (1.0 - metal) * base / PI;\r\n let sky = dot(normal, frame.skyDirection.xyz) * 0.5 + 0.5;\r\n let ambient = mix(toLinear(vec3<f32>(0.455, 0.412, 0.322)), vec3<f32>(1.0), sky) * (2.0 / PI);\r\n let ao = ${hasOcclusion ? 'mix(1.0, textureSample(occlusionTexture, occlusionTextureSampler, input.uv).r, u.emissive.w)' : '1.0'};\r\n ${sparkle ? `\r\n let lattice = (fract(input.localPosition / 2.5) - 0.5) * 2.5;\r\n let pointGlow = (1.0 - smoothstep(0.16, 0.42, length(lattice))) * u.highlight.z;\r\n ` : ''}\r\n // Vertex colour components above 1 are self-lit (e.g. vehicle lamps): dim by day, bright at night.\r\n let glow = ${sparkle ? 'vec3<f32>(3.0, 2.6, 1.8) * pointGlow +' : ''}${material.vertexColors\r\n ? ' max(input.color - vec3<f32>(1.0), vec3<f32>(0.0)) * (0.3 + 5.0 * frame.skyDirection.w) +' : ''} u.emissive.rgb * ${\r\n hasEmissive\r\n ? material.emissiveTexture.srgb\r\n ? 'textureSample(emissiveTexture, emissiveTextureSampler, input.uv).rgb'\r\n : 'toLinear(textureSample(emissiveTexture, emissiveTextureSampler, input.uv).rgb)'\r\n : 'vec3<f32>(1.0)'\r\n };\r\n var color = ambient * base * (1.0 - metal) * ao +\r\n (diffuse + specular) * nl * toLinear(vec3<f32>(1.0, 0.937, 0.835)) * 3.0 + glow;\r\n ${material.vertexColors ? 'color = base * (ambient + toLinear(vec3<f32>(1.0, 0.937, 0.835)) * (3.0 / PI) * nl) + glow;' : ''}\r\n color = (color - glow) * frame.atmosphereTint.rgb + base * artificial * (1.0 - metal * 0.5) + glow;\r\n return vec4<f32>(toSRGB(color), ${material.alphaMode === 'BLEND' ? 'alpha' : '1.0'});\r\n `}\r\n }\r\n `;\r\n return { vertex, fragment, bindings, textured, hasTerrain };\r\n}\r\n"],
5
- "mappings": "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",
6
- "names": ["materialShaders", "material", "sparkle", "elevationWGSL", "hasBase", "hasMetal", "hasEmissive", "hasOcclusion", "hasRoof", "hasTerrain", "textured", "vertex", "bindings", "binding", "textureBinding", "name", "enabled", "current", "baseBinding", "metalBinding", "emissiveBinding", "occlusionBinding", "roofBinding", "fragment"]
7
- }
package/dist/utils/sun.js DELETED
@@ -1,2 +0,0 @@
1
- function m(c,i,s){const t=new Date(c).getTime();if(!Number.isFinite(t)||!Number.isFinite(i)||Math.abs(i)>90||!Number.isFinite(s)||Math.abs(s)>180)throw new Error("Invalid solar date or location");const n=Math.PI/180,M=t/864e5-10957.5,a=(357.5291+.98560028*M)*n,h=a+(1.9148*Math.sin(a)+.02*Math.sin(2*a)+3e-4*Math.sin(3*a)+102.9372+180)*n,o=23.4397*n,r=Math.asin(Math.sin(h)*Math.sin(o)),e=Math.atan2(Math.sin(h)*Math.cos(o),Math.cos(h));return d(M,i,s,e,r)}function d(c,i,s,t,n){const M=Math.PI/180,a=(280.16+360.9856235*c+s)*M-t,h=i*M,o=Math.asin(Math.sin(h)*Math.sin(n)+Math.cos(h)*Math.cos(n)*Math.cos(a)),e=(Math.atan2(Math.sin(a),Math.cos(a)*Math.sin(h)-Math.tan(n)*Math.cos(h))/M+180+360)%360;return{altitude:o/M,azimuth:e,direction:[Math.sin(e*M)*Math.cos(o),Math.sin(o),-Math.cos(e*M)*Math.cos(o)]}}function l(c,i,s){m(c,i,s);const t=Math.PI/180,n=new Date(c).getTime()/864e5-10957.5,M=(134.963+13.064993*n)*t,a=(218.316+13.176396*n+6.289*Math.sin(M))*t,h=5.128*Math.sin((93.272+13.22935*n)*t)*t,o=23.4397*t,r=Math.cos(h)*Math.cos(a),e=Math.cos(h)*Math.sin(a)*Math.cos(o)-Math.sin(h)*Math.sin(o),u=Math.cos(h)*Math.sin(a)*Math.sin(o)+Math.sin(h)*Math.cos(o);return d(n,i,s,Math.atan2(e,r),Math.asin(u))}function f(c){if(!Number.isFinite(c))throw new Error("Invalid solar altitude");const i=[[-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]]],s=i.findIndex(o=>o[0]>=c),t=i[s<0?i.length-1:s],n=i[Math.max(0,s-1)],M=n===t||s<0?1:(c-n[0])/(t[0]-n[0]),a=o=>n[o].map((r,e)=>r+(t[o][e]-r)*M),h=o=>`rgb(${o.map(Math.round).join(", ")})`;return{background:`linear-gradient(${h(a(1))}, ${h(a(2))})`,tint:a(3)}}function x(c,i,s,t){const[n,M,a]=c,h=n*Math.cos(t)-a*Math.sin(t),o=-n*Math.sin(t)*Math.cos(s)+M*Math.sin(s)-a*Math.cos(t)*Math.cos(s),r=-n*Math.sin(t)*Math.sin(s)-M*Math.cos(s)-a*Math.cos(t)*Math.sin(s);if(r<=0)return null;const e=i.x/2+i.y*1.5*h/r,u=i.y/2-i.y*1.5*o/r;return{left:e,top:u}}export{f as atmosphere,l as moonPosition,x as projectCelestialBody,m as solarPosition};
2
- //# sourceMappingURL=sun.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/sun.js"],
4
- "sourcesContent": ["// Solar centre, without atmospheric refraction.\nexport function solarPosition(date, lat, lng) {\n const time = new Date(date).getTime();\n if (!Number.isFinite(time) || !Number.isFinite(lat) || Math.abs(lat) > 90 ||\n !Number.isFinite(lng) || Math.abs(lng) > 180) throw new Error('Invalid solar date or location');\n const rad = Math.PI / 180, d = time / 86400000 - 10957.5;\n const mean = (357.5291 + 0.98560028 * d) * rad;\n const longitude = mean + (1.9148 * Math.sin(mean) + 0.02 * Math.sin(2 * mean) +\n 0.0003 * Math.sin(3 * mean) + 102.9372 + 180) * rad;\n const obliquity = 23.4397 * rad;\n const declination = Math.asin(Math.sin(longitude) * Math.sin(obliquity));\n const ascension = Math.atan2(Math.sin(longitude) * Math.cos(obliquity), Math.cos(longitude));\n return horizontalPosition(d, lat, lng, ascension, declination);\n}\n\nfunction horizontalPosition(d, lat, lng, ascension, declination) {\n const rad = Math.PI / 180;\n const hourAngle = (280.16 + 360.9856235 * d + lng) * rad - ascension;\n const latitude = lat * rad;\n const altitude = Math.asin(Math.sin(latitude) * Math.sin(declination) +\n Math.cos(latitude) * Math.cos(declination) * Math.cos(hourAngle));\n const southAzimuth = Math.atan2(Math.sin(hourAngle),\n Math.cos(hourAngle) * Math.sin(latitude) - Math.tan(declination) * Math.cos(latitude));\n const azimuth = (southAzimuth / rad + 180 + 360) % 360;\n return { altitude: altitude / rad, azimuth,\n direction: [Math.sin(azimuth * rad) * Math.cos(altitude), Math.sin(altitude),\n -Math.cos(azimuth * rad) * Math.cos(altitude)] };\n}\n\n// Low-precision geocentric lunar orbit; no parallax or atmospheric refraction.\nexport function moonPosition(date, lat, lng) {\n solarPosition(date, lat, lng);\n const rad = Math.PI / 180, d = new Date(date).getTime() / 86400000 - 10957.5;\n const anomaly = (134.963 + 13.064993 * d) * rad;\n const longitude = (218.316 + 13.176396 * d + 6.289 * Math.sin(anomaly)) * rad;\n const latitude = 5.128 * Math.sin((93.272 + 13.229350 * d) * rad) * rad;\n const obliquity = 23.4397 * rad;\n const x = Math.cos(latitude) * Math.cos(longitude);\n const y = Math.cos(latitude) * Math.sin(longitude) * Math.cos(obliquity) - Math.sin(latitude) * Math.sin(obliquity);\n const z = Math.cos(latitude) * Math.sin(longitude) * Math.sin(obliquity) + Math.sin(latitude) * Math.cos(obliquity);\n return horizontalPosition(d, lat, lng, Math.atan2(y, x), Math.asin(z));\n}\n\nexport function atmosphere(altitude) {\n if (!Number.isFinite(altitude)) throw new Error('Invalid solar altitude');\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], 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\n/** Perspective projection of a celestial direction; null when behind the camera. */\nexport function projectCelestialBody(direction, size, pitch, bearing) {\n const [x, y, z] = direction;\n const right = x * Math.cos(bearing) - z * Math.sin(bearing);\n const up = -x * Math.sin(bearing) * Math.cos(pitch) + y * Math.sin(pitch) - z * Math.cos(bearing) * Math.cos(pitch);\n const forward = -x * Math.sin(bearing) * Math.sin(pitch) - y * Math.cos(pitch) - z * Math.cos(bearing) * Math.sin(pitch);\n if (forward <= 0) return null;\n const left = size.x / 2 + size.y * 1.5 * right / forward;\n const top = size.y / 2 - size.y * 1.5 * up / forward;\n return { left, top };\n}\n"],
5
- "mappings": "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",
6
- "names": ["solarPosition", "date", "lat", "lng", "time", "rad", "d", "mean", "longitude", "obliquity", "declination", "ascension", "horizontalPosition", "hourAngle", "latitude", "altitude", "azimuth", "moonPosition", "anomaly", "x", "y", "z", "atmosphere", "stops", "upper", "stop", "b", "a", "t", "mix", "index", "value", "i", "rgb", "values", "projectCelestialBody", "direction", "size", "pitch", "bearing", "right", "up", "forward", "left", "top"]
7
- }
@@ -1,2 +0,0 @@
1
- function g(r,l){for(const o of l?.get(`${Math.floor(r.x/64)}/${Math.floor(r.y/64)}`)||[])if(!(r.x<o.min[0]||r.x>o.max[0]||r.y<o.min[1]||r.y>o.max[1]))for(const[c,n,t]of o.triangles){const e=(n[1]-t[1])*(c[0]-t[0])+(t[0]-n[0])*(c[1]-t[1]),f=((n[1]-t[1])*(r.x-t[0])+(t[0]-n[0])*(r.y-t[1]))/e,a=((t[1]-c[1])*(r.x-t[0])+(c[0]-t[0])*(r.y-t[1]))/e;if(f>=0&&a>=0&&f+a<=1)return f*c[2]+a*n[2]+(1-f-a)*t[2]}return null}function M(r,l){const o=r.x-.5,c=r.y-.5,n=Math.floor(o),t=Math.floor(c),e=o-n,f=c-t,a=(s,i)=>{const y=Math.floor(s/256),m=Math.floor(i/256),w=l.get(`${y}/${m}`);if(!w)return null;const h=w[(i-m*256)*256+s-y*256];return Number.isFinite(h)&&h>-1e3?h:null},u=[a(n,t),a(n+1,t),a(n,t+1),a(n+1,t+1)],x=u.map((s,i)=>Number.isFinite(s)?i:-1).filter(s=>s>=0);return x.length?x.length<4?u[x[0]]:(u[0]*(1-e)+u[1]*e)*(1-f)+(u[2]*(1-e)+u[3]*e)*f:null}function F(r){const l=[],o=[],c=[],n=[];for(let t=0;t<=r;t++)for(let e=0;e<=r;e++)if(l.push(e/r,0,t/r),o.push(0,1,0),c.push(e/r,t/r),t<r&&e<r){const f=t*(r+1)+e,a=f+1,u=f+r+1,x=u+1;n.push(f,u,a,a,u,x)}return{position:{size:3,data:new Float32Array(l)},normal:{size:3,data:new Float32Array(o)},uv:{size:2,data:new Float32Array(c)},index:{data:new Uint16Array(n)}}}function A(r,l){const o=l.max.x-l.min.x+1,c=l.max.y-l.min.y+1,n=new Float32Array(o*c*65536).fill(-1e9);let t=1/0,e=-1/0;for(const[f,a]of r){const[u,x]=f.split("/").map(Number),s=(x-l.min.y)*256*o*256+(u-l.min.x)*256;for(let i=0;i<256;i++)for(let y=0;y<256;y++){const m=a[i*256+y];!Number.isFinite(m)||m<=-1e3||(n[s+i*o*256+y]=m,t=Math.min(t,m),e=Math.max(e,m))}}return{elevations:n,low:t,high:e}}export{g as bridgeElevation,A as terrainAtlas,M as terrainElevation,F as terrainGrid};
2
- //# sourceMappingURL=terrain.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/terrain.js"],
4
- "sourcesContent": ["/** Height inside a bridge deck, or null outside its triangles. */\r\nexport function bridgeElevation(point, bridges) {\r\n // Bridges bucketed by 64 DEM pixels.\r\n for (const bridge of bridges?.get(`${Math.floor(point.x / 64)}/${Math.floor(point.y / 64)}`) || []) {\r\n if (point.x < bridge.min[0] || point.x > bridge.max[0] || point.y < bridge.min[1] || point.y > bridge.max[1]) continue;\r\n for (const [a, b, c] of bridge.triangles) {\r\n const d = (b[1] - c[1]) * (a[0] - c[0]) + (c[0] - b[0]) * (a[1] - c[1]);\r\n const u = ((b[1] - c[1]) * (point.x - c[0]) + (c[0] - b[0]) * (point.y - c[1])) / d;\r\n const v = ((c[1] - a[1]) * (point.x - c[0]) + (a[0] - c[0]) * (point.y - c[1])) / d;\r\n if (u >= 0 && v >= 0 && u + v <= 1) return u * a[2] + v * b[2] + (1 - u - v) * c[2];\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/** Bilinear DEM sampling, with the original first-valid-neighbour no-data rule. */\r\nexport function terrainElevation(point, tiles) {\r\n const x = point.x - 0.5, y = point.y - 0.5;\r\n const x0 = Math.floor(x), y0 = Math.floor(y);\r\n const fx = x - x0, fy = y - y0;\r\n const sample = (px, py) => {\r\n const tileX = Math.floor(px / 256), tileY = Math.floor(py / 256);\r\n const tile = tiles.get(`${tileX}/${tileY}`);\r\n if (!tile) return null;\r\n const elevation = tile[(py - tileY * 256) * 256 + px - tileX * 256];\r\n return Number.isFinite(elevation) && elevation > -1000 ? elevation : null;\r\n };\r\n const values = [sample(x0, y0), sample(x0 + 1, y0), sample(x0, y0 + 1), sample(x0 + 1, y0 + 1)];\r\n const valid = values.map((value, i) => Number.isFinite(value) ? i : -1).filter(i => i >= 0);\r\n if (!valid.length) return null;\r\n if (valid.length < 4) return values[valid[0]];\r\n return (values[0] * (1 - fx) + values[1] * fx) * (1 - fy) +\r\n (values[2] * (1 - fx) + values[3] * fx) * fy;\r\n}\r\n\r\n/** Unit tile grid; the vertex shader supplies the elevation. */\r\nexport function terrainGrid(divisions) {\r\n const positions = [], normals = [], uvs = [], indices = [];\r\n for (let row = 0; row <= divisions; row++) {\r\n for (let column = 0; column <= divisions; column++) {\r\n positions.push(column / divisions, 0, row / divisions);\r\n normals.push(0, 1, 0);\r\n uvs.push(column / divisions, row / divisions);\r\n if (row < divisions && column < divisions) {\r\n const a = row * (divisions + 1) + column;\r\n const b = a + 1, c = a + divisions + 1, d = c + 1;\r\n indices.push(a, c, b, b, c, d);\r\n }\r\n }\r\n }\r\n return {\r\n position: { size: 3, data: new Float32Array(positions) },\r\n normal: { size: 3, data: new Float32Array(normals) },\r\n uv: { size: 2, data: new Float32Array(uvs) },\r\n index: { data: new Uint16Array(indices) },\r\n };\r\n}\r\n\r\n/** Float32 DEM atlas; missing samples retain the shader no-data sentinel. */\r\nexport function terrainAtlas(tiles, bounds) {\r\n const columns = bounds.max.x - bounds.min.x + 1, rows = bounds.max.y - bounds.min.y + 1;\r\n const elevations = new Float32Array(columns * rows * 65536).fill(-1e9);\r\n let low = Infinity, high = -Infinity;\r\n for (const [key, values] of tiles) {\r\n const [x, y] = key.split('/').map(Number);\r\n const start = (y - bounds.min.y) * 256 * columns * 256 + (x - bounds.min.x) * 256;\r\n for (let row = 0; row < 256; row++) {\r\n for (let column = 0; column < 256; column++) {\r\n const value = values[row * 256 + column];\r\n if (!Number.isFinite(value) || value <= -1000) continue;\r\n elevations[start + row * columns * 256 + column] = value;\r\n low = Math.min(low, value);\r\n high = Math.max(high, value);\r\n }\r\n }\r\n }\r\n return { elevations, low, high };\r\n}\r\n"],
5
- "mappings": "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",
6
- "names": ["bridgeElevation", "point", "bridges", "bridge", "a", "b", "c", "d", "u", "v", "terrainElevation", "tiles", "x", "y", "x0", "y0", "fx", "fy", "sample", "px", "py", "tileX", "tileY", "tile", "elevation", "values", "valid", "value", "i", "terrainGrid", "divisions", "positions", "normals", "uvs", "indices", "row", "column", "terrainAtlas", "bounds", "columns", "rows", "elevations", "low", "high", "key", "start"]
7
- }
@@ -1,2 +0,0 @@
1
- const T=8;function M(c,i,s=8){const t=Math.round(c*i/3600/s);return Array.from({length:t},(n,r)=>(r+.5)*c/t)}function S(c,i,s){let t=1;for(;t<i.length-1&&i[t]<s;)t++;const n=c[t-1],r=c[t],e=i[t]-i[t-1]||1,a=(s-i[t-1])/e;return{x:n[0]+(r[0]-n[0])*a,y:(n[2]??0)+((r[2]??0)-(n[2]??0))*a,z:n[1]+(r[1]-n[1])*a,dx:(r[0]-n[0])/e,dz:(r[1]-n[1])/e}}function b(c,{timeZone:i,duration:s,services:t}){const n=new Date(c);if(!Number.isFinite(n.getTime()))throw new Error("Invalid date");const r=new Intl.DateTimeFormat("en-GB",{timeZone:i,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hourCycle:"h23"}),e=Object.fromEntries(r.formatToParts(n).filter(o=>o.type!=="literal").map(o=>[o.type,Number(o.value)])),a=e.hour*60+e.minute+(e.second+n.getUTCMilliseconds()/1e3)/60,d=new Date(Date.UTC(e.year,e.month-1,e.day)).getUTCDay(),f=o=>o.split(":").reduce((p,u)=>p*60+Number(u)),m=[];for(const{from:o,to:p,every:u=1/0,months:h,weekdays:x}of t)if(!(h?.includes(e.month)===!1||x?.includes(d)===!1))for(let l=f(o);l<=f(p);l+=u)m.push(l);return m.sort((o,p)=>o-p).filter(o=>a>=o&&a<o+s).map(o=>({id:`${e.year}-${e.month}-${e.day}-${o}`,departure:`${String(Math.floor(o/60)).padStart(2,"0")}:${String(o%60).padStart(2,"0")}`,progress:(a-o)/s}))}const v=({features:c=[]})=>c.flatMap(({geometry:i,properties:s})=>(i?.type==="LineString"?[i.coordinates]:i?.type==="MultiLineString"?i.coordinates:[]).map(n=>({latlngs:n.map(([r,e])=>[e,r]),properties:s??{},elevation:s?.elevation}))),D=(c,i,s)=>i.flatMap((t,n)=>{const{timetable:r,flow:e=0}=t.properties;if(!t.length)return[];if(r)return b(c,r).map(d=>({id:`${n}-${d.id}`,lane:t,distance:d.progress*t.length,speed:t.length/(r.duration*60),properties:{...t.properties,departure:d.departure}}));const a=c/1e3*s;return(t.offsets||=M(t.length,e,s)).map((d,f)=>({id:`${n}-${f}`,lane:t,distance:(d+a)%t.length,speed:s,properties:t.properties}))});function z(c){const i=[],s=[],t=[];for(const{points:n,lengths:r}of c)for(let e=1;e<n.length;e++){const a=n[e-1],d=n[e],f=d[0]-a[0],m=d[1]-a[1],o=r[e]-r[e-1];if(!o)continue;const p=-m/o*2.5,u=f/o*2.5;for(let h=Math.floor(r[e-1]/30)*30;h<r[e];h+=30){const x=Math.max(0,(h-r[e-1])/o),l=Math.min(1,(h+18-r[e-1])/o);if(l<=x)continue;const g=[a[0]+f*x,a[1]+m*x],y=[a[0]+f*l,a[1]+m*l],w=a[2]+.4;for(const $ of[[g[0]-p,g[1]-u],[g[0]+p,g[1]+u],[y[0]+p,y[1]+u],[g[0]-p,g[1]-u],[y[0]+p,y[1]+u],[y[0]-p,y[1]-u]])i.push($[0],w,$[1]),s.push(0,1,0),t.push(.08,.7,.85)}}return{position:i,normal:s,color:t}}export{S as along,z as routeGeometry,b as scheduledTrips,T as speed,v as toLanes,D as tripsAt,M as vehicleOffsets};
2
- //# sourceMappingURL=traffic.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/traffic.js"],
4
- "sourcesContent": ["// Pure helpers of the 'traffic' type: lane interpolation and vehicle scheduling.\r\n\r\n/** Default urban speed (m/s) used to turn a lane's hourly `flow` into vehicles on the road. */\r\nexport const speed = 8;\r\n\r\n/** Evenly spaced starting offsets (metres) for `flow` vehicles/h moving at `velocity` m/s on a `length` metres lane. */\r\nexport function vehicleOffsets(length, flow, velocity = speed) {\r\n const count = Math.round(length * flow / 3600 / velocity);\r\n return Array.from({ length: count }, (_, i) => (i + 0.5) * length / count);\r\n}\r\n\r\n/** Point and unit direction at distance `s` along `points` ([x, z, y?]) with cumulative `lengths`. */\r\nexport function along(points, lengths, s) {\r\n let i = 1;\r\n while (i < lengths.length - 1 && lengths[i] < s) i++;\r\n const a = points[i - 1], b = points[i], d = lengths[i] - lengths[i - 1] || 1;\r\n const t = (s - lengths[i - 1]) / d;\r\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 };\r\n}\r\n\r\n/**\r\n * Trips of a frequency-based timetable (like GTFS frequencies.txt) underway at `date`, in the timetable's local time.\r\n * @param {{timeZone: string, duration: number, services: Array<{from: string, to: string, every?: number, months?: number[], weekdays?: number[]}>}} timetable\r\n * `duration` and `every` are minutes; `from`/`to` are 'HH:MM' first/last departures; months are 1-12, weekdays 0 (Sunday)-6.\r\n * @returns {Array<{id: string, departure: string, progress: number}>} `progress` is 0-1 along the lane.\r\n */\r\nexport function scheduledTrips(date, { timeZone, duration, services }) {\r\n const time = new Date(date);\r\n if (!Number.isFinite(time.getTime())) throw new Error('Invalid date');\r\n const clock = new Intl.DateTimeFormat('en-GB', {\r\n timeZone, year: 'numeric', month: '2-digit', day: '2-digit',\r\n hour: '2-digit', minute: '2-digit', second: '2-digit', hourCycle: 'h23',\r\n });\r\n const parts = Object.fromEntries(clock.formatToParts(time).filter(p => p.type !== 'literal').map(p => [p.type, Number(p.value)]));\r\n const minute = parts.hour * 60 + parts.minute + (parts.second + time.getUTCMilliseconds() / 1000) / 60;\r\n const weekday = new Date(Date.UTC(parts.year, parts.month - 1, parts.day)).getUTCDay();\r\n const minutes = clockTime => clockTime.split(':').reduce((hours, value) => hours * 60 + Number(value));\r\n const departures = [];\r\n for (const { from, to, every = Infinity, months, weekdays } of services) {\r\n if (months?.includes(parts.month) === false || weekdays?.includes(weekday) === false) continue;\r\n for (let departure = minutes(from); departure <= minutes(to); departure += every) departures.push(departure);\r\n }\r\n return departures.sort((a, b) => a - b).filter(departure => minute >= departure && minute < departure + duration).map(departure => ({\r\n id: `${parts.year}-${parts.month}-${parts.day}-${departure}`,\r\n departure: `${String(Math.floor(departure / 60)).padStart(2, '0')}:${String(departure % 60).padStart(2, '0')}`,\r\n progress: (minute - departure) / duration,\r\n }));\r\n}\r\n\r\n// GeoJSON (Multi)LineStrings become lanes ({latlngs, properties, elevation?}); prepare() adds `points` ([x, z, ground]),\r\n// `lengths` and `length` in layer-local metres.\r\nexport const toLanes = ({ features = [] }) => features.flatMap(({ geometry, properties }) => {\r\n const lines = geometry?.type === 'LineString' ? [geometry.coordinates] : geometry?.type === 'MultiLineString' ? geometry.coordinates : [];\r\n return lines.map(line => ({ latlngs: line.map(([lng, lat]) => [lat, lng]), properties: properties ?? {}, elevation: properties?.elevation }));\r\n});\r\n\r\n// A lane with a `timetable` runs scheduled trips end to end; one with a `flow` (vehicles/h) loops evenly spaced vehicles.\r\nexport const tripsAt = (time, lanes, velocity) => lanes.flatMap((lane, l) => {\r\n const { timetable, flow = 0 } = lane.properties;\r\n if (!lane.length) return [];\r\n if (timetable) return scheduledTrips(time, timetable).map(trip => ({\r\n id: `${l}-${trip.id}`, lane, distance: trip.progress * lane.length, speed: lane.length / (timetable.duration * 60),\r\n properties: { ...lane.properties, departure: trip.departure },\r\n }));\r\n const travelled = time / 1000 * velocity;\r\n return (lane.offsets ||= vehicleOffsets(lane.length, flow, velocity))\r\n .map((offset, k) => ({ id: `${l}-${k}`, lane, distance: (offset + travelled) % lane.length, speed: velocity, properties: lane.properties }));\r\n});\r\n\r\n/** Dashed lane outline, in layer-local metres. */\r\nexport function routeGeometry(lanes) {\r\n const position = [], normal = [], color = [];\r\n for (const { points, lengths } of lanes) for (let i = 1; i < points.length; i++) {\r\n const a = points[i - 1], b = points[i];\r\n const dx = b[0] - a[0], dz = b[1] - a[1], length = lengths[i] - lengths[i - 1];\r\n if (!length) continue;\r\n const x = -dz / length * 2.5, z = dx / length * 2.5;\r\n for (let distance = Math.floor(lengths[i - 1] / 30) * 30; distance < lengths[i]; distance += 30) {\r\n const start = Math.max(0, (distance - lengths[i - 1]) / length);\r\n const end = Math.min(1, (distance + 18 - lengths[i - 1]) / length);\r\n if (end <= start) continue;\r\n const p = [a[0] + dx * start, a[1] + dz * start], q = [a[0] + dx * end, a[1] + dz * end], y = a[2] + 0.4;\r\n for (const point of [[p[0] - x, p[1] - z], [p[0] + x, p[1] + z], [q[0] + x, q[1] + z],\r\n [p[0] - x, p[1] - z], [q[0] + x, q[1] + z], [q[0] - x, q[1] - z]]) {\r\n position.push(point[0], y, point[1]); normal.push(0, 1, 0); color.push(0.08, 0.7, 0.85);\r\n }\r\n }\r\n }\r\n return { position, normal, color };\r\n}\r\n"],
5
- "mappings": "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",
6
- "names": ["speed", "vehicleOffsets", "length", "flow", "velocity", "count", "_", "i", "along", "points", "lengths", "a", "b", "d", "t", "scheduledTrips", "date", "timeZone", "duration", "services", "time", "clock", "parts", "p", "minute", "weekday", "minutes", "clockTime", "hours", "value", "departures", "from", "to", "every", "months", "weekdays", "departure", "toLanes", "features", "geometry", "properties", "line", "lng", "lat", "tripsAt", "lanes", "lane", "l", "timetable", "trip", "travelled", "offset", "k", "routeGeometry", "position", "normal", "color", "dx", "dz", "x", "z", "distance", "start", "end", "q", "y", "point"]
7
- }
@@ -1,2 +0,0 @@
1
- const v=[[.86,.86,.88],[.1,.1,.12],[.5,.53,.57],[.65,.1,.08],[.12,.25,.55],[.85,.7,.15]],o=(i,n,e,h)=>[[i,e],[n,e],[n,h],[i,h]],m=(i,n,e,h,...a)=>[[o(i,n,e,h),...a],[o(-n,-i,e,h),...a]],y=[.12,.15,.18],w=[.05,.05,.05],j=[1.9,1.85,1.7],A=[1.7,.06,.05],M=i=>{const n=v[i%v.length];return[...m(.7,.92,-1.68,-1.02,0,.64,w),...m(.7,.92,1.02,1.68,0,.64,w),[[[-.9,-1.95],[-.72,-2.25],[.72,-2.25],[.9,-1.95],[.9,2.05],[.76,2.25],[-.76,2.25],[-.9,2.05]],.28,.82,n],[o(-.84,.84,-.75,1.6),.82,1.38,y,o(-.7,.7,-.05,1.3)],[o(-.71,.71,-.06,1.31),1.38,1.46,n],...m(.38,.8,-2.3,-2.16,.56,.76,j),[o(-.78,.78,2.16,2.3),.6,.76,A]]},g=[.92,.93,.92],x=[[-5.5,30],[5.5,30],[5.5,-20],[4,-26],[1.5,-30],[-1.5,-30],[-4,-26],[-5.5,-20]],R=()=>[[x,0,.8,[.1,.16,.26]],[x,.8,1.4,g],[o(-5,5,-18,26),1.4,3.7,y,o(-4.6,4.6,-17.4,25.6)],...m(4.64,4.74,-17,25,3.25,3.45,[1.6,1.25,.8]),[o(-4.8,4.8,-17.8,25.8),3.7,3.9,g],...Array.from({length:12},(i,n)=>m(.5,3.8,-12+n*3,-11.3+n*3,3.9,4.4,[.62,.1,.1])).flat(),...m(4.65,4.8,-13.6,25.8,3.9,4.8,g),[o(-4.8,4.8,25.65,25.8),3.9,4.8,g],[o(-2.2,2.2,-17.6,-14),3.9,4.7,g],[o(-2.2,2.2,-17.6,-14),4.7,5.5,y],[o(-2.5,2.5,-18,-13.6),5.5,5.7,g],[o(-2.45,-2.2,-16.2,-15.8),5,5.3,[2,.15,.1]],[o(2.2,2.45,-16.2,-15.8),5,5.3,[.1,2,.4]],[o(-.1,.1,-15.9,-15.7),5.7,6.6,g],[o(-.15,.15,-15.95,-15.65),6.6,6.8,[2,2,1.9]]],_=i=>{const n=[],e=[],h=[],a=(r,d,b,u)=>{const p=d.map((l,f)=>l-r[f]),s=b.map((l,f)=>l-r[f]),c=[p[1]*s[2]-p[2]*s[1],p[2]*s[0]-p[0]*s[2],p[0]*s[1]-p[1]*s[0]],t=Math.hypot(...c);for(const l of[r,d,b])n.push(...l),e.push(...c.map(f=>f/t)),h.push(...u)};for(const[r,d,b,u,p=r]of i){const s=r.map(([t,l])=>[t,d,l]),c=p.map(([t,l])=>[t,b,l]);for(let t=0;t<r.length;t++){const l=(t+1)%r.length;a(s[t],s[l],c[l],u),a(s[t],c[l],c[t],u)}for(let t=1;t<r.length-1;t++)a(c[0],c[t],c[t+1],u),a(s[0],s[t+1],s[t],u)}return{position:n,normal:e,color:h}},k={car:{side:1.8,model:M,lights:[{position:[0,1.2,-6],radius:10,color:[1,.94,.82],flux:800}]},boat:{side:0,model:R,lights:[{position:[0,8,4],radius:30,color:[1,.8,.55],flux:2e4}]}};export{o as box,_ as build,k as vehicles};
2
- //# sourceMappingURL=vehicles.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/vehicles.js"],
4
- "sourcesContent": ["// Built-in vehicles for the 'traffic' type. Models are [ring of [x, z], bottom, top, rgb, topRing?] convex prisms in metres;\r\n// forward is -z, right is +x. `topRing` (same length as `ring`) tapers the prism; rgb components above 1 are self-lit lamps.\r\nconst paints = [[0.86, 0.86, 0.88], [0.1, 0.1, 0.12], [0.5, 0.53, 0.57], [0.65, 0.1, 0.08], [0.12, 0.25, 0.55], [0.85, 0.7, 0.15]];\r\nexport const box = (x0, x1, z0, z1) => [[x0, z0], [x1, z0], [x1, z1], [x0, z1]];\r\nconst mirror = (x0, x1, z0, z1, ...rest) => [[box(x0, x1, z0, z1), ...rest], [box(-x1, -x0, z0, z1), ...rest]];\r\nconst glass = [0.12, 0.15, 0.18], tyre = [0.05, 0.05, 0.05];\r\nconst headlight = [1.9, 1.85, 1.7], taillight = [1.7, 0.06, 0.05];\r\nconst car = i => {\r\n const paint = paints[i % paints.length];\r\n return [\r\n ...mirror(0.7, 0.92, -1.68, -1.02, 0, 0.64, tyre),\r\n ...mirror(0.7, 0.92, 1.02, 1.68, 0, 0.64, tyre),\r\n [[[-0.9, -1.95], [-0.72, -2.25], [0.72, -2.25], [0.9, -1.95], [0.9, 2.05], [0.76, 2.25], [-0.76, 2.25], [-0.9, 2.05]],\r\n 0.28, 0.82, paint],\r\n // Greenhouse: the windscreen leans back, the rear window less.\r\n [box(-0.84, 0.84, -0.75, 1.6), 0.82, 1.38, glass, box(-0.7, 0.7, -0.05, 1.3)],\r\n [box(-0.71, 0.71, -0.06, 1.31), 1.38, 1.46, paint],\r\n ...mirror(0.38, 0.8, -2.3, -2.16, 0.56, 0.76, headlight),\r\n [box(-0.78, 0.78, 2.16, 2.3), 0.6, 0.76, taillight],\r\n ];\r\n};\r\n// Panoramic river cruiser, about 60 \u00D7 11 m: glass saloon, open upper deck with benches, wheelhouse forward.\r\nconst white = [0.92, 0.93, 0.92], hull = [[-5.5, 30], [5.5, 30], [5.5, -20], [4, -26], [1.5, -30], [-1.5, -30], [-4, -26], [-5.5, -20]];\r\nconst boat = () => [\r\n [hull, 0, 0.8, [0.1, 0.16, 0.26]],\r\n [hull, 0.8, 1.4, white],\r\n [box(-5, 5, -18, 26), 1.4, 3.7, glass, box(-4.6, 4.6, -17.4, 25.6)],\r\n ...mirror(4.64, 4.74, -17, 25, 3.25, 3.45, [1.6, 1.25, 0.8]),\r\n [box(-4.8, 4.8, -17.8, 25.8), 3.7, 3.9, white],\r\n ...Array.from({ length: 12 }, (_, i) => mirror(0.5, 3.8, -12 + i * 3, -11.3 + i * 3, 3.9, 4.4, [0.62, 0.1, 0.1])).flat(),\r\n ...mirror(4.65, 4.8, -13.6, 25.8, 3.9, 4.8, white),\r\n [box(-4.8, 4.8, 25.65, 25.8), 3.9, 4.8, white],\r\n [box(-2.2, 2.2, -17.6, -14), 3.9, 4.7, white],\r\n [box(-2.2, 2.2, -17.6, -14), 4.7, 5.5, glass],\r\n [box(-2.5, 2.5, -18, -13.6), 5.5, 5.7, white],\r\n [box(-2.45, -2.2, -16.2, -15.8), 5, 5.3, [2, 0.15, 0.1]],\r\n [box(2.2, 2.45, -16.2, -15.8), 5, 5.3, [0.1, 2, 0.4]],\r\n [box(-0.1, 0.1, -15.9, -15.7), 5.7, 6.6, white],\r\n [box(-0.15, 0.15, -15.95, -15.65), 6.6, 6.8, [2, 2, 1.9]],\r\n];\r\n\r\nexport const build = parts => {\r\n const position = [], normal = [], color = [];\r\n const triangle = (a, b, c, tint) => {\r\n const u = b.map((v, i) => v - a[i]), v = c.map((w, i) => w - a[i]);\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]], length = Math.hypot(...n);\r\n for (const point of [a, b, c]) { position.push(...point); normal.push(...n.map(w => w / length)); color.push(...tint); }\r\n };\r\n for (const [ring, bottom, top, tint, topRing = ring] of parts) {\r\n const low = ring.map(([x, z]) => [x, bottom, z]), high = topRing.map(([x, z]) => [x, top, z]);\r\n for (let i = 0; i < ring.length; i++) {\r\n const j = (i + 1) % ring.length;\r\n triangle(low[i], low[j], high[j], tint); triangle(low[i], high[j], high[i], tint);\r\n }\r\n for (let i = 1; i < ring.length - 1; i++) {\r\n triangle(high[0], high[i], high[i + 1], tint); triangle(low[0], low[i + 1], low[i], tint);\r\n }\r\n }\r\n return { position, normal, color };\r\n};\r\n\r\n/**\r\n * `side`: default offset (metres) to the right of the lane centreline. `model(i)` gives the prisms of the i-th vehicle.\r\n * `lights`: night point lights in model space (see the night lighting grid), e.g. the pool cast by the headlights.\r\n */\r\nexport const vehicles = {\r\n car: { side: 1.8, model: car, lights: [{ position: [0, 1.2, -6], radius: 10, color: [1, 0.94, 0.82], flux: 800 }] },\r\n boat: { side: 0, model: boat, lights: [{ position: [0, 8, 4], radius: 30, color: [1, 0.8, 0.55], flux: 20000 }] },\r\n};\r\n"],
5
- "mappings": "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",
6
- "names": ["paints", "box", "x0", "x1", "z0", "z1", "mirror", "rest", "glass", "tyre", "headlight", "taillight", "car", "paint", "white", "hull", "boat", "_", "i", "build", "parts", "position", "normal", "color", "triangle", "a", "b", "c", "tint", "u", "v", "w", "n", "length", "point", "ring", "bottom", "top", "topRing", "low", "x", "z", "high", "j", "vehicles"]
7
- }
@@ -1,2 +0,0 @@
1
- import{box as f}from"./vehicles.js";const B=[.85,.64,.5],G=[.75,.2,.15],H=[.16,.2,.32],D=[.08,.07,.06],K={body:[[f(-.17,.17,-.1,.1),.82,.95,H],[f(-.19,.19,-.11,.11),.95,1.44,G],[f(-.05,.05,-.05,.05),1.44,1.5,B],[f(-.1,.1,-.11,.1),1.5,1.72,B],[f(-.105,.105,-.06,.115),1.58,1.77,D],[f(-.105,.105,-.115,-.06),1.7,1.77,D]],leg:[[f(-.07,.07,-.07,.07),-.82,0,H],[f(-.07,.07,-.17,.07),-.9,-.82,D]],arm:[[f(-.05,.05,-.05,.05),-.55,0,G],[f(-.045,.045,-.045,.045),-.66,-.55,B]]},N=[["body",0,0,0],["leg",-.09,.9,1],["leg",.09,.9,-1],["arm",-.25,1.42,-1],["arm",.25,1.42,1]],E=8,I=new WeakMap;function O(r){let p=I.get(r.geometry);if(p)return p;const o=r.worldMatrix,{position:{data:m},index:l,normal:g,uv:M}=r.geometry.attributes,e=l?l.count:m.length/3,d=[],y=[],h=new Map,t=[];for(let i=0;i<e;i+=3){const k=l?l.data[i]:i;if(r.program.nightLight&&M&&M.data[k*2]<=2)continue;for(let n=0;n<3;n++){const a=(l?l.data[i+n]:i+n)*3,x=m[a],R=m[a+1],W=m[a+2];t[n*3]=o[0]*x+o[4]*R+o[8]*W+o[12],t[n*3+1]=o[1]*x+o[5]*R+o[9]*W+o[13],t[n*3+2]=o[2]*x+o[6]*R+o[10]*W+o[14]}const w=t[3]-t[0],q=t[4]-t[1],L=t[5]-t[2],u=t[6]-t[0],z=t[7]-t[1],b=t[8]-t[2];let s=q*b-L*z,c=w*z-q*u;const j=L*u-w*b,F=Math.hypot(s,j,c);if(!F||Math.abs(j)>.9*F)continue;if(g){const n=k*3,a=g.data;(o[0]*a[n]+o[4]*a[n+1]+o[8]*a[n+2])*s+(o[2]*a[n]+o[6]*a[n+1]+o[10]*a[n+2])*c<0&&(s=-s,c=-c)}const A=Math.hypot(s,c),C=y.length/2;d.push(...t),y.push(s/A,c/A);for(let n=Math.floor(Math.min(t[0],t[3],t[6])/E);n<=Math.floor(Math.max(t[0],t[3],t[6])/E);n++)for(let a=Math.floor(Math.min(t[2],t[5],t[8])/E);a<=Math.floor(Math.max(t[2],t[5],t[8])/E);a++){const x=n+","+a;h.has(x)||h.set(x,[]),h.get(x).push(C)}}return p={tri:Float32Array.from(d),nrm:Float32Array.from(y),cells:h,origin:[o[12],o[13],o[14]]},I.set(r.geometry,p),p}function P(r,p,o,m,l,g,M){const e=p*9,d=r[e+3]-r[e],y=r[e+4]-r[e+1],h=r[e+5]-r[e+2],t=r[e+6]-r[e],i=r[e+7]-r[e+1],k=r[e+8]-r[e+2],w=-M*i,q=M*t-g*k,L=g*i,u=d*w+y*q+h*L;if(Math.abs(u)<1e-9)return-1;const z=o-r[e],b=m-r[e+1],s=l-r[e+2],c=(z*w+b*q+s*L)/u;if(c<0||c>1)return-1;const j=b*h-s*y,F=s*d-z*h,A=z*y-b*d,C=(g*j+M*A)/u;return C<0||c+C>1?-1:(t*j+i*F+k*A)/u}export{E as CELL,O as collider,P as horizontalRay,N as limbs,K as parts};
2
- //# sourceMappingURL=walk.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/walk.js"],
4
- "sourcesContent": ["import { box } from './vehicles.js';\r\n\r\n// Pedestrian, about 1.77 m tall, prisms as in utils/vehicles.js (forward -z). Limbs hang from their pivot at y = 0.\r\nconst skin = [0.85, 0.64, 0.5], shirt = [0.75, 0.2, 0.15], trousers = [0.16, 0.2, 0.32], dark = [0.08, 0.07, 0.06];\r\nexport const parts = {\r\n body: [\r\n [box(-0.17, 0.17, -0.1, 0.1), 0.82, 0.95, trousers],\r\n [box(-0.19, 0.19, -0.11, 0.11), 0.95, 1.44, shirt],\r\n [box(-0.05, 0.05, -0.05, 0.05), 1.44, 1.5, skin],\r\n [box(-0.1, 0.1, -0.11, 0.1), 1.5, 1.72, skin],\r\n [box(-0.105, 0.105, -0.06, 0.115), 1.58, 1.77, dark],\r\n [box(-0.105, 0.105, -0.115, -0.06), 1.7, 1.77, dark],\r\n ],\r\n leg: [[box(-0.07, 0.07, -0.07, 0.07), -0.82, 0, trousers], [box(-0.07, 0.07, -0.17, 0.07), -0.9, -0.82, dark]],\r\n arm: [[box(-0.05, 0.05, -0.05, 0.05), -0.55, 0, shirt], [box(-0.045, 0.045, -0.045, 0.045), -0.66, -0.55, skin]],\r\n};\r\n// [part, pivot x, pivot y, swing sign]\r\nexport const limbs = [['body', 0, 0, 0], ['leg', -0.09, 0.9, 1], ['leg', 0.09, 0.9, -1], ['arm', -0.25, 1.42, -1], ['arm', 0.25, 1.42, 1]];\r\n// Walls (non-horizontal triangles) of a mesh in world space, bucketed by 8 m cells; `origin` is the world translation\r\n// at build time, since layer roots only move vertically with the terrain afterwards.\r\nexport const CELL = 8;\r\nconst colliders = new WeakMap();\r\nexport function collider(mesh) {\r\n let c = colliders.get(mesh.geometry);\r\n if (c) return c;\r\n const m = mesh.worldMatrix, { position: { data: p }, index, normal, uv } = mesh.geometry.attributes;\r\n const count = index ? index.count : p.length / 3, tri = [], nrm = [], cells = new Map(), v = [];\r\n for (let i = 0; i < count; i += 3) {\r\n const first = index ? index.data[i] : i;\r\n // Streetlight halos (uv.x <= 2, see scene/picking.js) are light, not matter.\r\n if (mesh.program.nightLight && uv && uv.data[first * 2] <= 2) continue;\r\n for (let k = 0; k < 3; k++) {\r\n const j = (index ? index.data[i + k] : i + k) * 3, x = p[j], y = p[j + 1], z = p[j + 2];\r\n v[k * 3] = m[0] * x + m[4] * y + m[8] * z + m[12];\r\n v[k * 3 + 1] = m[1] * x + m[5] * y + m[9] * z + m[13];\r\n v[k * 3 + 2] = m[2] * x + m[6] * y + m[10] * z + m[14];\r\n }\r\n const ex = v[3] - v[0], ey = v[4] - v[1], ez = v[5] - v[2], fx = v[6] - v[0], fy = v[7] - v[1], fz = v[8] - v[2];\r\n let nx = ey * fz - ez * fy, nz = ex * fy - ey * fx;\r\n const ny = ez * fx - ex * fz, length = Math.hypot(nx, ny, nz);\r\n if (!length || Math.abs(ny) > 0.9 * length) continue;\r\n if (normal) {\r\n // The stored normal tells the outside, whatever the winding.\r\n const j = first * 3, a = normal.data;\r\n if ((m[0] * a[j] + m[4] * a[j + 1] + m[8] * a[j + 2]) * nx + (m[2] * a[j] + m[6] * a[j + 1] + m[10] * a[j + 2]) * nz < 0) { nx = -nx; nz = -nz; }\r\n }\r\n const h = Math.hypot(nx, nz), t = nrm.length / 2;\r\n tri.push(...v); nrm.push(nx / h, nz / h);\r\n for (let ix = Math.floor(Math.min(v[0], v[3], v[6]) / CELL); ix <= Math.floor(Math.max(v[0], v[3], v[6]) / CELL); ix++)\r\n for (let iz = Math.floor(Math.min(v[2], v[5], v[8]) / CELL); iz <= Math.floor(Math.max(v[2], v[5], v[8]) / CELL); iz++) {\r\n const key = ix + ',' + iz;\r\n if (!cells.has(key)) cells.set(key, []);\r\n cells.get(key).push(t);\r\n }\r\n }\r\n c = { tri: Float32Array.from(tri), nrm: Float32Array.from(nrm), cells, origin: [m[12], m[13], m[14]] };\r\n colliders.set(mesh.geometry, c);\r\n return c;\r\n}\r\n\r\n// M\u00F6ller-Trumbore for the horizontal ray (ox, oy, oz) + d\u00B7(dx, 0, dz) against triangle t; returns d or -1.\r\nexport function horizontalRay(v, t, ox, oy, oz, dx, dz) {\r\n const i = t * 9, ex = v[i + 3] - v[i], ey = v[i + 4] - v[i + 1], ez = v[i + 5] - v[i + 2];\r\n const fx = v[i + 6] - v[i], fy = v[i + 7] - v[i + 1], fz = v[i + 8] - v[i + 2];\r\n const px = -dz * fy, py = dz * fx - dx * fz, pz = dx * fy, det = ex * px + ey * py + ez * pz;\r\n if (Math.abs(det) < 1e-9) return -1;\r\n const tx = ox - v[i], ty = oy - v[i + 1], tz = oz - v[i + 2], u = (tx * px + ty * py + tz * pz) / det;\r\n if (u < 0 || u > 1) return -1;\r\n const qx = ty * ez - tz * ey, qy = tz * ex - tx * ez, qz = tx * ey - ty * ex, w = (dx * qx + dz * qz) / det;\r\n if (w < 0 || u + w > 1) return -1;\r\n return (fx * qx + fy * qy + fz * qz) / det;\r\n}\r\n"],
5
- "mappings": "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",
6
- "names": ["box", "skin", "shirt", "trousers", "dark", "parts", "limbs", "CELL", "colliders", "collider", "mesh", "c", "m", "p", "index", "normal", "uv", "count", "tri", "nrm", "cells", "v", "first", "k", "j", "y", "z", "ex", "ey", "ez", "fx", "fy", "fz", "nx", "nz", "ny", "length", "h", "t", "ix", "iz", "key", "horizontalRay", "ox", "oy", "oz", "dx", "dz", "i", "px", "py", "pz", "det", "tx", "ty", "tz", "u", "qx", "qy", "qz", "w"]
7
- }