leaflet-city-mapper 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (472) hide show
  1. package/README.md +15 -13
  2. package/cucumber.mjs +4 -0
  3. package/dist/leaflet-city-mapper.js +1 -1
  4. package/dist/leaflet-city-mapper.js.map +4 -4
  5. package/dist/utils/CELL.js +2 -0
  6. package/dist/utils/CELL.js.map +7 -0
  7. package/dist/utils/addBridges.js +2 -0
  8. package/dist/utils/addBridges.js.map +7 -0
  9. package/dist/utils/addRasterTile.js +2 -0
  10. package/dist/utils/addRasterTile.js.map +7 -0
  11. package/dist/utils/along.js +2 -0
  12. package/dist/utils/along.js.map +7 -0
  13. package/dist/utils/atmosphere.js +2 -0
  14. package/dist/utils/atmosphere.js.map +7 -0
  15. package/dist/utils/attach.js +2 -0
  16. package/dist/utils/attach.js.map +7 -0
  17. package/dist/utils/bindSunlight.js +2 -0
  18. package/dist/utils/bindSunlight.js.map +7 -0
  19. package/dist/utils/box.js +2 -0
  20. package/dist/utils/box.js.map +7 -0
  21. package/dist/utils/bridgeElevation.js +2 -0
  22. package/dist/utils/bridgeElevation.js.map +7 -0
  23. package/dist/utils/build.js +2 -0
  24. package/dist/utils/build.js.map +7 -0
  25. package/dist/utils/cameraControls.js +2 -0
  26. package/dist/utils/cameraControls.js.map +7 -0
  27. package/dist/utils/channel.js +2 -0
  28. package/dist/utils/channel.js.map +7 -0
  29. package/dist/utils/collider.js +2 -0
  30. package/dist/utils/collider.js.map +7 -0
  31. package/dist/utils/colliders.js +2 -0
  32. package/dist/utils/colliders.js.map +7 -0
  33. package/dist/utils/computeBounds.js +2 -0
  34. package/dist/utils/computeBounds.js.map +7 -0
  35. package/dist/utils/conformModelToTerrain.js +2 -0
  36. package/dist/utils/conformModelToTerrain.js.map +7 -0
  37. package/dist/utils/createMesh.js +2 -0
  38. package/dist/utils/createMesh.js.map +7 -0
  39. package/dist/utils/createProgram.js +3 -0
  40. package/dist/utils/createProgram.js.map +7 -0
  41. package/dist/utils/decodeDirectory.js +2 -0
  42. package/dist/utils/decodeDirectory.js.map +7 -0
  43. package/dist/utils/decodeHeader.js +2 -0
  44. package/dist/utils/decodeHeader.js.map +7 -0
  45. package/dist/utils/decodeModel.js +2 -0
  46. package/dist/utils/decodeModel.js.map +7 -0
  47. package/dist/utils/decompress.js +2 -0
  48. package/dist/utils/decompress.js.map +7 -0
  49. package/dist/utils/destroyTexture.js +2 -0
  50. package/dist/utils/destroyTexture.js.map +7 -0
  51. package/dist/utils/disposeMesh.js +2 -0
  52. package/dist/utils/disposeMesh.js.map +7 -0
  53. package/dist/utils/drawGeometry.js +2 -0
  54. package/dist/utils/drawGeometry.js.map +7 -0
  55. package/dist/utils/elevationWGSL.js +24 -0
  56. package/dist/utils/elevationWGSL.js.map +7 -0
  57. package/dist/utils/emptyNode.js +2 -0
  58. package/dist/utils/emptyNode.js.map +7 -0
  59. package/dist/utils/endZoom.js +2 -0
  60. package/dist/utils/endZoom.js.map +7 -0
  61. package/dist/utils/findFeature.js +2 -0
  62. package/dist/utils/findFeature.js.map +7 -0
  63. package/dist/utils/geometry.js +0 -1
  64. package/dist/utils/geometry.js.map +4 -4
  65. package/dist/utils/getElevation.js +2 -0
  66. package/dist/utils/getElevation.js.map +7 -0
  67. package/dist/utils/getHeader.js +2 -0
  68. package/dist/utils/getHeader.js.map +7 -0
  69. package/dist/utils/getZxy.js +2 -0
  70. package/dist/utils/getZxy.js.map +7 -0
  71. package/dist/utils/glass.js +2 -0
  72. package/dist/utils/glass.js.map +7 -0
  73. package/dist/utils/headlight.js +2 -0
  74. package/dist/utils/headlight.js.map +7 -0
  75. package/dist/utils/hit.js +2 -0
  76. package/dist/utils/hit.js.map +7 -0
  77. package/dist/utils/horizontalPosition.js +2 -0
  78. package/dist/utils/horizontalPosition.js.map +7 -0
  79. package/dist/utils/horizontalRay.js +2 -0
  80. package/dist/utils/horizontalRay.js.map +7 -0
  81. package/dist/utils/hull.js +2 -0
  82. package/dist/utils/hull.js.map +7 -0
  83. package/dist/utils/initSunlight.js +2 -0
  84. package/dist/utils/initSunlight.js.map +7 -0
  85. package/dist/utils/initTerrain.js +2 -0
  86. package/dist/utils/initTerrain.js.map +7 -0
  87. package/dist/utils/initTraffic.js +40 -0
  88. package/dist/utils/initTraffic.js.map +7 -0
  89. package/dist/utils/initWalk.js +2 -0
  90. package/dist/utils/initWalk.js.map +7 -0
  91. package/dist/utils/intersectMeshes.js +2 -0
  92. package/dist/utils/intersectMeshes.js.map +7 -0
  93. package/dist/utils/isClockWise.js +2 -0
  94. package/dist/utils/isClockWise.js.map +7 -0
  95. package/dist/utils/lampPostGeometry.js +2 -0
  96. package/dist/utils/lampPostGeometry.js.map +7 -0
  97. package/dist/utils/lightGeometry.js +2 -0
  98. package/dist/utils/lightGeometry.js.map +7 -0
  99. package/dist/utils/lightGrid.js +2 -0
  100. package/dist/utils/lightGrid.js.map +7 -0
  101. package/dist/utils/limbs.js +2 -0
  102. package/dist/utils/limbs.js.map +7 -0
  103. package/dist/utils/loadModel.js +2 -0
  104. package/dist/utils/loadModel.js.map +7 -0
  105. package/dist/utils/loadSource.js +2 -0
  106. package/dist/utils/loadSource.js.map +7 -0
  107. package/dist/utils/loadTerrain.js +2 -0
  108. package/dist/utils/loadTerrain.js.map +7 -0
  109. package/dist/utils/mapCamera.js +2 -0
  110. package/dist/utils/mapCamera.js.map +7 -0
  111. package/dist/utils/{shaders.js → materialShaders.js} +16 -8
  112. package/dist/utils/materialShaders.js.map +7 -0
  113. package/dist/utils/mirror.js +2 -0
  114. package/dist/utils/mirror.js.map +7 -0
  115. package/dist/utils/moonPosition.js +2 -0
  116. package/dist/utils/moonPosition.js.map +7 -0
  117. package/dist/utils/moves.js +2 -0
  118. package/dist/utils/moves.js.map +7 -0
  119. package/dist/utils/nativeEvents.js +2 -0
  120. package/dist/utils/nativeEvents.js.map +7 -0
  121. package/dist/utils/nativeGeometry.js +2 -0
  122. package/dist/utils/nativeGeometry.js.map +7 -0
  123. package/dist/utils/nativeLayer.js +2 -0
  124. package/dist/utils/nativeLayer.js.map +7 -0
  125. package/dist/utils/nodeMatrix.js +2 -0
  126. package/dist/utils/nodeMatrix.js.map +7 -0
  127. package/dist/utils/onAdd3DLayer.js +2 -0
  128. package/dist/utils/onAdd3DLayer.js.map +7 -0
  129. package/dist/utils/onAddSun.js +2 -0
  130. package/dist/utils/onAddSun.js.map +7 -0
  131. package/dist/utils/onClick.js +2 -0
  132. package/dist/utils/onClick.js.map +7 -0
  133. package/dist/utils/onMapChange.js +2 -0
  134. package/dist/utils/onMapChange.js.map +7 -0
  135. package/dist/utils/onPMTileAdd.js +2 -0
  136. package/dist/utils/onPMTileAdd.js.map +7 -0
  137. package/dist/utils/onPMTileRemove.js +2 -0
  138. package/dist/utils/onPMTileRemove.js.map +7 -0
  139. package/dist/utils/onPointerLeave.js +2 -0
  140. package/dist/utils/onPointerLeave.js.map +7 -0
  141. package/dist/utils/onPointerMove.js +2 -0
  142. package/dist/utils/onPointerMove.js.map +7 -0
  143. package/dist/utils/onRemove3DLayer.js +2 -0
  144. package/dist/utils/onRemove3DLayer.js.map +7 -0
  145. package/dist/utils/onRemoveSun.js +2 -0
  146. package/dist/utils/onRemoveSun.js.map +7 -0
  147. package/dist/utils/onTerrainAdd.js +2 -0
  148. package/dist/utils/onTerrainAdd.js.map +7 -0
  149. package/dist/utils/onTerrainChange.js +2 -0
  150. package/dist/utils/onTerrainChange.js.map +7 -0
  151. package/dist/utils/onTerrainRemove.js +2 -0
  152. package/dist/utils/onTerrainRemove.js.map +7 -0
  153. package/dist/utils/onZoomAnim.js +2 -0
  154. package/dist/utils/onZoomAnim.js.map +7 -0
  155. package/dist/utils/paints.js +2 -0
  156. package/dist/utils/paints.js.map +7 -0
  157. package/dist/utils/parseColor.js +2 -0
  158. package/dist/utils/parseColor.js.map +7 -0
  159. package/dist/utils/parts.js +2 -0
  160. package/dist/utils/parts.js.map +7 -0
  161. package/dist/utils/projectCelestialBody.js +2 -0
  162. package/dist/utils/projectCelestialBody.js.map +7 -0
  163. package/dist/utils/pump.js +2 -0
  164. package/dist/utils/pump.js.map +7 -0
  165. package/dist/utils/rasterTiles.js +2 -0
  166. package/dist/utils/rasterTiles.js.map +7 -0
  167. package/dist/utils/raycast.js +2 -0
  168. package/dist/utils/raycast.js.map +7 -0
  169. package/dist/utils/read.js +2 -0
  170. package/dist/utils/read.js.map +7 -0
  171. package/dist/utils/readAccessor.js +2 -0
  172. package/dist/utils/readAccessor.js.map +7 -0
  173. package/dist/utils/releaseArea.js +2 -0
  174. package/dist/utils/releaseArea.js.map +7 -0
  175. package/dist/utils/removeRasterTile.js +2 -0
  176. package/dist/utils/removeRasterTile.js.map +7 -0
  177. package/dist/utils/render.js +15 -0
  178. package/dist/utils/render.js.map +7 -0
  179. package/dist/utils/renderSunlight.js +13 -0
  180. package/dist/utils/renderSunlight.js.map +7 -0
  181. package/dist/utils/renderers.js +2 -0
  182. package/dist/utils/renderers.js.map +7 -0
  183. package/dist/utils/resizeSunlight.js +2 -0
  184. package/dist/utils/resizeSunlight.js.map +7 -0
  185. package/dist/utils/roofCoverage.js +2 -0
  186. package/dist/utils/roofCoverage.js.map +7 -0
  187. package/dist/utils/routeGeometry.js +2 -0
  188. package/dist/utils/routeGeometry.js.map +7 -0
  189. package/dist/utils/scheduledTrips.js +2 -0
  190. package/dist/utils/scheduledTrips.js.map +7 -0
  191. package/dist/utils/setGeoJSONData.js +2 -0
  192. package/dist/utils/setGeoJSONData.js.map +7 -0
  193. package/dist/utils/setHighlight.js +2 -0
  194. package/dist/utils/setHighlight.js.map +7 -0
  195. package/dist/utils/setPMTileOpacity.js +2 -0
  196. package/dist/utils/setPMTileOpacity.js.map +7 -0
  197. package/dist/utils/setPMTileZIndex.js +2 -0
  198. package/dist/utils/setPMTileZIndex.js.map +7 -0
  199. package/dist/utils/setParent.js +2 -0
  200. package/dist/utils/setParent.js.map +7 -0
  201. package/dist/utils/setTerrainHeight.js +2 -0
  202. package/dist/utils/setTerrainHeight.js.map +7 -0
  203. package/dist/utils/setVertexColor.js +2 -0
  204. package/dist/utils/setVertexColor.js.map +7 -0
  205. package/dist/utils/showFeature.js +2 -0
  206. package/dist/utils/showFeature.js.map +7 -0
  207. package/dist/utils/sizes.js +2 -0
  208. package/dist/utils/sizes.js.map +7 -0
  209. package/dist/utils/skin.js +2 -0
  210. package/dist/utils/skin.js.map +7 -0
  211. package/dist/utils/solarPosition.js +2 -0
  212. package/dist/utils/solarPosition.js.map +7 -0
  213. package/dist/utils/sortMeshes.js +2 -0
  214. package/dist/utils/sortMeshes.js.map +7 -0
  215. package/dist/utils/speed.js +2 -0
  216. package/dist/utils/speed.js.map +7 -0
  217. package/dist/utils/startZoom.js +2 -0
  218. package/dist/utils/startZoom.js.map +7 -0
  219. package/dist/utils/taillight.js +2 -0
  220. package/dist/utils/taillight.js.map +7 -0
  221. package/dist/utils/terrainAtlas.js +2 -0
  222. package/dist/utils/terrainAtlas.js.map +7 -0
  223. package/dist/utils/terrainElevation.js +2 -0
  224. package/dist/utils/terrainElevation.js.map +7 -0
  225. package/dist/utils/terrainGrid.js +2 -0
  226. package/dist/utils/terrainGrid.js.map +7 -0
  227. package/dist/utils/textureSampler.js +2 -0
  228. package/dist/utils/textureSampler.js.map +7 -0
  229. package/dist/utils/tileId.js +2 -0
  230. package/dist/utils/tileId.js.map +7 -0
  231. package/dist/utils/toLanes.js +2 -0
  232. package/dist/utils/toLanes.js.map +7 -0
  233. package/dist/utils/toSRGB.js +2 -0
  234. package/dist/utils/toSRGB.js.map +7 -0
  235. package/dist/utils/tooltip.js +3 -0
  236. package/dist/utils/tooltip.js.map +7 -0
  237. package/dist/utils/traffic.js +1 -1
  238. package/dist/utils/traffic.js.map +3 -3
  239. package/dist/utils/traverse.js +2 -0
  240. package/dist/utils/traverse.js.map +7 -0
  241. package/dist/utils/treeGeometry.js +2 -0
  242. package/dist/utils/treeGeometry.js.map +7 -0
  243. package/dist/utils/triangulate.js +2 -0
  244. package/dist/utils/triangulate.js.map +7 -0
  245. package/dist/utils/tripsAt.js +2 -0
  246. package/dist/utils/tripsAt.js.map +7 -0
  247. package/dist/utils/types.js +2 -0
  248. package/dist/utils/types.js.map +7 -0
  249. package/dist/utils/underEntry.js +2 -0
  250. package/dist/utils/underEntry.js.map +7 -0
  251. package/dist/utils/update.js +2 -0
  252. package/dist/utils/update.js.map +7 -0
  253. package/dist/utils/updateArea.js +2 -0
  254. package/dist/utils/updateArea.js.map +7 -0
  255. package/dist/utils/updateCamera.js +2 -0
  256. package/dist/utils/updateCamera.js.map +7 -0
  257. package/dist/utils/updatePointLights.js +2 -0
  258. package/dist/utils/updatePointLights.js.map +7 -0
  259. package/dist/utils/updateWorldMatrix.js +2 -0
  260. package/dist/utils/updateWorldMatrix.js.map +7 -0
  261. package/dist/utils/vehicleOffsets.js +2 -0
  262. package/dist/utils/vehicleOffsets.js.map +7 -0
  263. package/dist/utils/vehicles.js +1 -1
  264. package/dist/utils/vehicles.js.map +3 -3
  265. package/dist/utils/vertexNormals.js +2 -0
  266. package/dist/utils/vertexNormals.js.map +7 -0
  267. package/dist/utils/walk.js +1 -1
  268. package/dist/utils/walk.js.map +3 -3
  269. package/dist/utils/white.js +2 -0
  270. package/dist/utils/white.js.map +7 -0
  271. package/dist/utils/worldLights.js +2 -0
  272. package/dist/utils/worldLights.js.map +7 -0
  273. package/dist/utils/wrap.js +2 -0
  274. package/dist/utils/wrap.js.map +7 -0
  275. package/package.json +2 -4
  276. package/src/index.js +365 -50
  277. package/src/utils/CELL.js +4 -0
  278. package/src/utils/addBridges.js +66 -0
  279. package/src/utils/addRasterTile.js +112 -0
  280. package/src/utils/along.js +9 -0
  281. package/src/utils/atmosphere.js +20 -0
  282. package/src/utils/attach.js +255 -0
  283. package/src/utils/bindSunlight.js +12 -0
  284. package/src/utils/box.js +1 -0
  285. package/src/utils/bridgeElevation.js +18 -0
  286. package/src/utils/build.js +20 -0
  287. package/src/utils/cameraControls.js +287 -0
  288. package/src/utils/channel.js +4 -0
  289. package/src/utils/collider.js +62 -0
  290. package/src/utils/colliders.js +2 -0
  291. package/src/utils/computeBounds.js +17 -0
  292. package/src/utils/conformModelToTerrain.js +69 -0
  293. package/src/utils/createMesh.js +31 -0
  294. package/src/utils/createProgram.js +92 -0
  295. package/src/utils/decodeDirectory.js +40 -0
  296. package/src/utils/decodeHeader.js +15 -0
  297. package/src/utils/decodeModel.js +43 -0
  298. package/src/utils/decompress.js +5 -0
  299. package/src/utils/destroyTexture.js +7 -0
  300. package/src/utils/disposeMesh.js +13 -0
  301. package/src/utils/drawGeometry.js +122 -0
  302. package/src/utils/elevationWGSL.js +27 -0
  303. package/src/utils/emptyNode.js +9 -0
  304. package/src/utils/endZoom.js +15 -0
  305. package/src/utils/findFeature.js +49 -0
  306. package/src/utils/geometry.js +0 -254
  307. package/src/utils/getElevation.js +10 -0
  308. package/src/utils/getHeader.js +9 -0
  309. package/src/utils/getZxy.js +76 -0
  310. package/src/utils/glass.js +1 -0
  311. package/src/utils/headlight.js +1 -0
  312. package/src/utils/hit.js +41 -0
  313. package/src/utils/horizontalPosition.js +16 -0
  314. package/src/utils/horizontalRay.js +12 -0
  315. package/src/utils/hull.js +1 -0
  316. package/src/utils/initSunlight.js +9 -0
  317. package/src/utils/initTerrain.js +19 -0
  318. package/src/utils/initTraffic.js +93 -0
  319. package/src/utils/initWalk.js +72 -0
  320. package/src/utils/{picking.js → intersectMeshes.js} +121 -119
  321. package/src/utils/isClockWise.js +12 -0
  322. package/src/utils/lampPostGeometry.js +26 -0
  323. package/src/utils/lightGeometry.js +22 -0
  324. package/src/utils/{lighting.js → lightGrid.js} +50 -51
  325. package/src/utils/limbs.js +9 -0
  326. package/src/{scene/model.js → utils/loadModel.js} +37 -24
  327. package/src/utils/loadSource.js +17 -0
  328. package/src/utils/loadTerrain.js +65 -0
  329. package/src/utils/mapCamera.js +432 -0
  330. package/src/utils/{shaders.js → materialShaders.js} +243 -237
  331. package/src/utils/mirror.js +6 -0
  332. package/src/utils/moonPosition.js +17 -0
  333. package/src/utils/moves.js +11 -0
  334. package/src/utils/nativeEvents.js +77 -0
  335. package/src/utils/nativeGeometry.js +131 -0
  336. package/src/utils/nativeLayer.js +317 -0
  337. package/src/utils/nodeMatrix.js +22 -0
  338. package/src/utils/onAdd3DLayer.js +31 -0
  339. package/src/utils/onAddSun.js +147 -0
  340. package/src/utils/onClick.js +13 -0
  341. package/src/utils/onMapChange.js +16 -0
  342. package/src/utils/onPMTileAdd.js +15 -0
  343. package/src/utils/onPMTileRemove.js +8 -0
  344. package/src/utils/onPointerLeave.js +11 -0
  345. package/src/utils/onPointerMove.js +15 -0
  346. package/src/utils/onRemove3DLayer.js +78 -0
  347. package/src/utils/onRemoveSun.js +3 -0
  348. package/src/utils/onTerrainAdd.js +18 -0
  349. package/src/utils/onTerrainChange.js +13 -0
  350. package/src/utils/onTerrainRemove.js +40 -0
  351. package/src/utils/onZoomAnim.js +14 -0
  352. package/src/utils/paints.js +10 -0
  353. package/src/utils/parseColor.js +42 -0
  354. package/src/utils/parts.js +16 -0
  355. package/src/utils/projectCelestialBody.js +13 -0
  356. package/src/{scene/sources.js → utils/pump.js} +59 -98
  357. package/src/utils/rasterTiles.js +285 -0
  358. package/src/utils/raycast.js +60 -0
  359. package/src/utils/read.js +29 -0
  360. package/src/utils/readAccessor.js +68 -0
  361. package/src/utils/releaseArea.js +34 -0
  362. package/src/utils/removeRasterTile.js +13 -0
  363. package/src/{scene → utils}/render.js +112 -173
  364. package/src/utils/renderSunlight.js +170 -0
  365. package/src/utils/renderers.js +2 -0
  366. package/src/utils/resizeSunlight.js +15 -0
  367. package/src/utils/roofCoverage.js +47 -0
  368. package/src/utils/routeGeometry.js +22 -0
  369. package/src/utils/scheduledTrips.js +29 -0
  370. package/src/utils/setGeoJSONData.js +11 -0
  371. package/src/utils/setHighlight.js +13 -0
  372. package/src/utils/setPMTileOpacity.js +7 -0
  373. package/src/utils/setPMTileZIndex.js +7 -0
  374. package/src/utils/setParent.js +7 -0
  375. package/src/utils/setTerrainHeight.js +10 -0
  376. package/src/utils/setVertexColor.js +14 -0
  377. package/src/utils/showFeature.js +27 -0
  378. package/src/utils/sizes.js +1 -0
  379. package/src/utils/skin.js +2 -0
  380. package/src/utils/solarPosition.js +17 -0
  381. package/src/utils/sortMeshes.js +12 -0
  382. package/src/utils/speed.js +3 -0
  383. package/src/utils/startZoom.js +5 -0
  384. package/src/utils/taillight.js +1 -0
  385. package/src/utils/terrainAtlas.js +21 -0
  386. package/src/utils/terrainElevation.js +20 -0
  387. package/src/utils/terrainGrid.js +23 -0
  388. package/src/utils/textureSampler.js +10 -0
  389. package/src/utils/tileId.js +18 -0
  390. package/src/utils/toLanes.js +7 -0
  391. package/src/utils/toSRGB.js +1 -0
  392. package/src/utils/tooltip.js +6 -0
  393. package/src/utils/traffic.js +310 -85
  394. package/src/utils/traverse.js +6 -0
  395. package/src/utils/treeGeometry.js +45 -0
  396. package/src/utils/triangulate.js +100 -0
  397. package/src/utils/tripsAt.js +16 -0
  398. package/src/utils/types.js +8 -0
  399. package/src/utils/{control.js → underEntry.js} +1 -2
  400. package/src/utils/update.js +18 -0
  401. package/src/utils/updateArea.js +40 -0
  402. package/src/utils/updateCamera.js +32 -0
  403. package/src/utils/updatePointLights.js +38 -0
  404. package/src/utils/updateWorldMatrix.js +47 -0
  405. package/src/utils/vehicleOffsets.js +8 -0
  406. package/src/utils/vehicles.js +65 -69
  407. package/src/utils/vertexNormals.js +30 -0
  408. package/src/utils/walk.js +181 -66
  409. package/src/utils/white.js +1 -0
  410. package/src/utils/worldLights.js +25 -0
  411. package/src/utils/wrap.js +1 -0
  412. package/dist/scene/gpu.js +0 -3
  413. package/dist/scene/gpu.js.map +0 -7
  414. package/dist/scene/lighting.js +0 -9
  415. package/dist/scene/lighting.js.map +0 -7
  416. package/dist/scene/model.js +0 -2
  417. package/dist/scene/model.js.map +0 -7
  418. package/dist/scene/picking.js +0 -2
  419. package/dist/scene/picking.js.map +0 -7
  420. package/dist/scene/pmtiles.js +0 -2
  421. package/dist/scene/pmtiles.js.map +0 -7
  422. package/dist/scene/render.js +0 -15
  423. package/dist/scene/render.js.map +0 -7
  424. package/dist/scene/sources.js +0 -2
  425. package/dist/scene/sources.js.map +0 -7
  426. package/dist/types/3d.js +0 -2
  427. package/dist/types/3d.js.map +0 -7
  428. package/dist/types/geojson.js +0 -2
  429. package/dist/types/geojson.js.map +0 -7
  430. package/dist/types/pmtiles.js +0 -2
  431. package/dist/types/pmtiles.js.map +0 -7
  432. package/dist/types/sunlight.js +0 -2
  433. package/dist/types/sunlight.js.map +0 -7
  434. package/dist/types/terrain.js +0 -24
  435. package/dist/types/terrain.js.map +0 -7
  436. package/dist/types/traffic.js +0 -41
  437. package/dist/types/traffic.js.map +0 -7
  438. package/dist/types/walk.js +0 -2
  439. package/dist/types/walk.js.map +0 -7
  440. package/dist/utils/control.js +0 -2
  441. package/dist/utils/control.js.map +0 -7
  442. package/dist/utils/lighting.js +0 -2
  443. package/dist/utils/lighting.js.map +0 -7
  444. package/dist/utils/model.js +0 -2
  445. package/dist/utils/model.js.map +0 -7
  446. package/dist/utils/picking.js +0 -2
  447. package/dist/utils/picking.js.map +0 -7
  448. package/dist/utils/pmtiles.js +0 -2
  449. package/dist/utils/pmtiles.js.map +0 -7
  450. package/dist/utils/scene.js +0 -2
  451. package/dist/utils/scene.js.map +0 -7
  452. package/dist/utils/shaders.js.map +0 -7
  453. package/dist/utils/sun.js +0 -2
  454. package/dist/utils/sun.js.map +0 -7
  455. package/dist/utils/terrain.js +0 -2
  456. package/dist/utils/terrain.js.map +0 -7
  457. package/src/scene/gpu.js +0 -438
  458. package/src/scene/lighting.js +0 -193
  459. package/src/scene/picking.js +0 -150
  460. package/src/scene/pmtiles.js +0 -94
  461. package/src/types/3d.js +0 -337
  462. package/src/types/geojson.js +0 -42
  463. package/src/types/pmtiles.js +0 -143
  464. package/src/types/sunlight.js +0 -142
  465. package/src/types/terrain.js +0 -331
  466. package/src/types/traffic.js +0 -356
  467. package/src/types/walk.js +0 -219
  468. package/src/utils/model.js +0 -178
  469. package/src/utils/pmtiles.js +0 -79
  470. package/src/utils/scene.js +0 -102
  471. package/src/utils/sun.js +0 -71
  472. package/src/utils/terrain.js +0 -78
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/lighting.js"],
4
- "sourcesContent": ["/** Pack world-space point lights into the shader's spatial grid. */\r\nexport function lightGrid(packed, maxBytes) {\r\n const count = packed.reduce((sum, values) => sum + values.length / 8, 0), cellSize = 32;\r\n let data = new Float32Array(8);\r\n if (count) {\r\n let minX = Infinity, minZ = Infinity, maxX = -Infinity, maxZ = -Infinity;\r\n for (const values of packed) for (let i = 0; i < values.length; i += 8) {\r\n minX = Math.min(minX, values[i] - values[i + 3]); maxX = Math.max(maxX, values[i] + values[i + 3]);\r\n minZ = Math.min(minZ, values[i + 2] - values[i + 3]); maxZ = Math.max(maxZ, values[i + 2] + values[i + 3]);\r\n }\r\n const columns = Math.ceil((maxX - minX) / cellSize) + 1, rows = Math.ceil((maxZ - minZ) / cellSize) + 1;\r\n const each = callback => {\r\n for (const values of packed) for (let i = 0; i < values.length; i += 8) {\r\n const radius = values[i + 3], x = values[i] - minX, z = values[i + 2] - minZ;\r\n for (let y = Math.floor((z - radius) / cellSize); y <= Math.floor((z + radius) / cellSize); y++) {\r\n for (let c = Math.floor((x - radius) / cellSize); c <= Math.floor((x + radius) / cellSize); c++) callback(y * columns + c, values, i);\r\n }\r\n }\r\n };\r\n // Counting sort: count the lights of each cell, then fill each cell's slice.\r\n const counts = new Uint32Array(columns * rows), next = new Uint32Array(columns * rows);\r\n each(key => counts[key]++);\r\n const entries = counts.reduce((sum, value) => sum + value, 0);\r\n const length = (2 + columns * rows + entries * 2) * 4;\r\n if (length * 4 > maxBytes) throw new Error('Streetlight grid exceeds GPU storage limit');\r\n data = new Float32Array(length);\r\n data.set([minX, minZ, cellSize, columns, rows, count, 0, 0]);\r\n let offset = 2 + columns * rows;\r\n for (let key = 0; key < counts.length; key++) if (counts[key]) {\r\n data[(2 + key) * 4] = next[key] = offset;\r\n data[(2 + key) * 4 + 1] = counts[key];\r\n offset += counts[key] * 2;\r\n }\r\n each((key, values, i) => {\r\n for (let j = 0, o = next[key] * 4; j < 8; j++) data[o + j] = values[i + j];\r\n next[key] += 2;\r\n });\r\n }\r\n return { data, count };\r\n}\r\n\r\n/** World-space [x, y, z, radius, r, g, b, intensity] for one mesh's point lights. */\r\nexport function worldLights(lights, m) {\r\n const values = new Float32Array(lights.length * 8);\r\n lights.forEach(({ position: [x, y, z], radius, color, flux }, i) => {\r\n const w = m[3] * x + m[7] * y + m[11] * z + m[15];\r\n values.set([(m[0] * x + m[4] * y + m[8] * z + m[12]) / w, (m[1] * x + m[5] * y + m[9] * z + m[13]) / w,\r\n (m[2] * x + m[6] * y + m[10] * z + m[14]) / w, radius, ...color, flux / (4 * Math.PI) * 0.03], i * 8);\r\n });\r\n return values;\r\n}\r\n"],
5
- "mappings": "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",
6
- "names": ["lightGrid", "packed", "maxBytes", "count", "sum", "values", "cellSize", "data", "minX", "minZ", "maxX", "maxZ", "i", "columns", "rows", "each", "callback", "radius", "x", "z", "y", "c", "counts", "next", "key", "entries", "value", "length", "offset", "j", "o", "worldLights", "lights", "m", "color", "flux", "w"]
7
- }
@@ -1,2 +0,0 @@
1
- const h={5120:Int8Array,5121:Uint8Array,5122:Int16Array,5123:Uint16Array,5125:Uint32Array,5126:Float32Array},m={SCALAR:1,VEC2:2,VEC3:3,VEC4:4};function x(t){const s=new DataView(t),r=new TextDecoder;let e;if(s.getUint32(0,!0)===1179937895){if(s.getUint32(4,!0)!==2||s.getUint32(8,!0)!==t.byteLength)throw new Error("Invalid GLB header");let i;for(let n=12;n<t.byteLength;){if(n+8>t.byteLength)throw new Error("Truncated GLB chunk");const c=s.getUint32(n,!0),a=s.getUint32(n+4,!0);if(n+=8,n+c>t.byteLength)throw new Error("Truncated GLB data");const o=t.slice(n,n+c);a===1313821514&&(e=JSON.parse(r.decode(o))),a===5130562&&(i=o),n+=c}if(!e)throw new Error("Missing GLB JSON");i&&(e.buffers[0].binary=i)}else e=JSON.parse(r.decode(t));if(e.skins?.length||e.animations?.length||e.extensionsRequired?.length||e.meshes?.some(i=>i.primitives.some(n=>n.targets||n.mode!==void 0&&n.mode!==4)))throw new Error("Layer3D supports static triangle glTF models without required extensions");return e}function T(t,s){const r=t.accessors[s],e=h[r.componentType],i=m[r.type];if(!e||!i||!Number.isInteger(r.count)||r.count<0)throw new Error("Invalid glTF accessor");const n=new e(r.count*i),c=(o,l,f,u,b)=>{const y=t.bufferViews[o],g=e.BYTES_PER_ELEMENT,d=t.buffers[y.buffer].binary;if(u||=i*g,!d||u<i*g||l<0||(y.byteOffset||0)+y.byteLength>d.byteLength||(f-1)*u+i*g+l>y.byteLength)throw new Error("glTF accessor outside buffer view");for(let w=0;w<f;w++){const E=new e(d.slice((y.byteOffset||0)+l+w*u,(y.byteOffset||0)+l+w*u+i*g));n.set(E,b(w)*i)}};if(r.bufferView!==void 0&&c(r.bufferView,r.byteOffset||0,r.count,t.bufferViews[r.bufferView].byteStride,o=>o),r.sparse){const o=r.sparse,l=h[o.indices.componentType];if(![Uint8Array,Uint16Array,Uint32Array].includes(l))throw new Error("Invalid sparse glTF indices");const f=t.bufferViews[o.indices.bufferView],u=(f.byteOffset||0)+(o.indices.byteOffset||0);if(o.count>r.count||(o.indices.byteOffset||0)+o.count*l.BYTES_PER_ELEMENT>f.byteLength)throw new Error("Invalid sparse glTF indices");const b=new l(t.buffers[f.buffer].binary.slice(u,u+o.count*l.BYTES_PER_ELEMENT));c(o.values.bufferView,o.values.byteOffset||0,o.count,0,y=>{if(b[y]>=r.count)throw new Error("Invalid sparse glTF index");return b[y]})}if(r.componentType===5126)return{data:n,size:i};const a=new Float32Array(n.length);for(let o=0;o<n.length;o++)a[o]=r.normalized?Math.max(-1,n[o]/(e===Int8Array?127:e===Int16Array?32767:e===Uint8Array?255:e===Uint32Array?4294967295:65535)):n[o];return{data:a,size:i,indices:n}}function p(t){if(t.matrix)return Array.from(t.matrix);const[s,r,e,i]=t.rotation||[0,0,0,1],[n,c,a]=t.scale||[1,1,1];return[(1-2*(r*r+e*e))*n,2*(s*r+e*i)*n,2*(s*e-r*i)*n,0,2*(s*r-e*i)*c,(1-2*(s*s+e*e))*c,2*(r*e+s*i)*c,0,2*(s*e+r*i)*a,2*(r*e-s*i)*a,(1-2*(s*s+r*r))*a,0,...t.translation||[0,0,0],1]}function A(t,s){const r=new Float32Array(t.length);for(let e=0;e<(s?.length||t.length/3);e+=3){const i=s?s[e]:e,n=s?s[e+1]:e+1,c=s?s[e+2]:e+2,a=[0,1,2].map(f=>t[n*3+f]-t[i*3+f]),o=[0,1,2].map(f=>t[c*3+f]-t[i*3+f]),l=[a[1]*o[2]-a[2]*o[1],a[2]*o[0]-a[0]*o[2],a[0]*o[1]-a[1]*o[0]];for(const f of[i,n,c])for(let u=0;u<3;u++)r[f*3+u]+=l[u]}for(let e=0;e<r.length;e+=3){const i=Math.hypot(...r.subarray(e,e+3))||1;for(let n=0;n<3;n++)r[e+n]/=i}return r}function L(t){return{addressModeU:t.wrapS===33071?"clamp-to-edge":t.wrapS===33648?"mirror-repeat":"repeat",addressModeV:t.wrapT===33071?"clamp-to-edge":t.wrapT===33648?"mirror-repeat":"repeat",magFilter:t.magFilter===9728?"nearest":"linear",minFilter:t.minFilter===9728||t.minFilter===9984||t.minFilter===9986?"nearest":"linear"}}export{x as decodeModel,p as nodeMatrix,T as readAccessor,L as textureSampler,A as vertexNormals};
2
- //# sourceMappingURL=model.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/model.js"],
4
- "sourcesContent": ["const types = {\r\n 5120: Int8Array,\r\n 5121: Uint8Array,\r\n 5122: Int16Array,\r\n 5123: Uint16Array,\r\n 5125: Uint32Array,\r\n 5126: Float32Array,\r\n};\r\nconst sizes = { SCALAR: 1, VEC2: 2, VEC3: 3, VEC4: 4 };\r\n\r\n/** Decode a static glTF JSON document or GLB v2 container. */\r\nexport function decodeModel(data) {\r\n const view = new DataView(data),\r\n decoder = new TextDecoder();\r\n let description;\r\n if (view.getUint32(0, true) === 0x46546c67) {\r\n // Decode GLB v2 chunks; unknown types are skipped.\r\n if (view.getUint32(4, true) !== 2 || view.getUint32(8, true) !== data.byteLength) {\r\n throw new Error('Invalid GLB header');\r\n }\r\n let binary;\r\n for (let offset = 12; offset < data.byteLength;) {\r\n if (offset + 8 > data.byteLength) {\r\n throw new Error('Truncated GLB chunk');\r\n }\r\n const length = view.getUint32(offset, true), type = view.getUint32(offset + 4, true);\r\n offset += 8;\r\n if (offset + length > data.byteLength) {\r\n throw new Error('Truncated GLB data');\r\n }\r\n const chunk = data.slice(offset, offset + length);\r\n if (type === 0x4e4f534a) {\r\n description = JSON.parse(decoder.decode(chunk));\r\n }\r\n if (type === 0x004e4942) {\r\n binary = chunk;\r\n }\r\n offset += length;\r\n }\r\n if (!description) {\r\n throw new Error('Missing GLB JSON');\r\n }\r\n if (binary) {\r\n description.buffers[0].binary = binary;\r\n }\r\n } else {\r\n description = JSON.parse(decoder.decode(data));\r\n }\r\n if (description.skins?.length || description.animations?.length || description.extensionsRequired?.length || description.meshes?.some(mesh => mesh.primitives.some(primitive => primitive.targets || (primitive.mode !== undefined && primitive.mode !== 4)))) {\r\n throw new Error('Layer3D supports static triangle glTF models without required extensions');\r\n }\r\n return description;\r\n}\r\n\r\n/** Decode packed, interleaved, normalized or sparse glTF accessor data. */\r\nexport function readAccessor(description, index) {\r\n const spec = description.accessors[index],\r\n Type = types[spec.componentType],\r\n size = sizes[spec.type];\r\n if (!Type || !size || !Number.isInteger(spec.count) || spec.count < 0) {\r\n throw new Error('Invalid glTF accessor');\r\n }\r\n const data = new Type(spec.count * size);\r\n // The destination callback is sequential for base data and sparse-indexed for overrides.\r\n const read = (viewIndex, offset, count, stride, output) => {\r\n const view = description.bufferViews[viewIndex], bytes = Type.BYTES_PER_ELEMENT;\r\n const buffer = description.buffers[view.buffer].binary;\r\n stride ||= size * bytes;\r\n if (!buffer || stride < size * bytes || offset < 0 ||\r\n (view.byteOffset || 0) + view.byteLength > buffer.byteLength ||\r\n (count - 1) * stride + size * bytes + offset > view.byteLength) throw new Error('glTF accessor outside buffer view');\r\n for (let i = 0; i < count; i++) {\r\n const values = new Type(buffer.slice((view.byteOffset || 0) + offset + i * stride,\r\n (view.byteOffset || 0) + offset + i * stride + size * bytes));\r\n data.set(values, output(i) * size);\r\n }\r\n };\r\n if (spec.bufferView !== undefined) {\r\n read(\r\n spec.bufferView,\r\n spec.byteOffset || 0,\r\n spec.count,\r\n description.bufferViews[spec.bufferView].byteStride,\r\n i => i\r\n );\r\n }\r\n if (spec.sparse) {\r\n const sparse = spec.sparse, Index = types[sparse.indices.componentType];\r\n if (![Uint8Array, Uint16Array, Uint32Array].includes(Index)) {\r\n throw new Error('Invalid sparse glTF indices');\r\n }\r\n const view = description.bufferViews[sparse.indices.bufferView];\r\n const offset = (view.byteOffset || 0) + (sparse.indices.byteOffset || 0);\r\n if (sparse.count > spec.count || (sparse.indices.byteOffset || 0) + sparse.count * Index.BYTES_PER_ELEMENT > view.byteLength) {\r\n throw new Error('Invalid sparse glTF indices');\r\n }\r\n const indices = new Index(description.buffers[view.buffer].binary.slice(offset, offset + sparse.count * Index.BYTES_PER_ELEMENT));\r\n read(\r\n sparse.values.bufferView,\r\n sparse.values.byteOffset || 0,\r\n sparse.count,\r\n 0,\r\n i => {\r\n if (indices[i] >= spec.count) throw new Error('Invalid sparse glTF index');\r\n return indices[i];\r\n }\r\n );\r\n }\r\n if (spec.componentType === 5126) {\r\n return { data, size };\r\n }\r\n const normalized = new Float32Array(data.length);\r\n // Normalization is a glTF accessor rule, not sRGB conversion; indices stay integers.\r\n for (let i = 0; i < data.length; i++) {\r\n normalized[i] = spec.normalized\r\n ? Math.max(-1, data[i] / (Type === Int8Array ? 127 : Type === Int16Array ? 32767 : Type === Uint8Array ? 255 : Type === Uint32Array ? 4294967295 : 65535))\r\n : data[i];\r\n }\r\n return { data: normalized, size, indices: data };\r\n}\r\n\r\n/** glTF quaternion/translation/scale to a column-major matrix. */\r\nexport function nodeMatrix(spec) {\r\n if (spec.matrix) return Array.from(spec.matrix);\r\n // glTF stores quaternions [x,y,z,w]; convert directly to a scaled column-major matrix.\r\n const [x, y, z, w] = spec.rotation || [0, 0, 0, 1],\r\n [sx, sy, sz] = spec.scale || [1, 1, 1];\r\n return [\r\n (1 - 2 * (y * y + z * z)) * sx,\r\n 2 * (x * y + z * w) * sx,\r\n 2 * (x * z - y * w) * sx,\r\n 0,\r\n 2 * (x * y - z * w) * sy,\r\n (1 - 2 * (x * x + z * z)) * sy,\r\n 2 * (y * z + x * w) * sy, 0,\r\n 2 * (x * z + y * w) * sz,\r\n 2 * (y * z - x * w) * sz,\r\n (1 - 2 * (x * x + y * y)) * sz,\r\n 0,\r\n ...(spec.translation || [0, 0, 0]),\r\n 1,\r\n ];\r\n}\r\n\r\n/** Area-weighted vertex normals, for indexed or non-indexed triangles. */\r\nexport function vertexNormals(p, indices) {\r\n // Accumulate area-weighted face normals for shared vertices, then normalize.\r\n const normals = new Float32Array(p.length);\r\n for (let i = 0; i < (indices?.length || p.length / 3); i += 3) {\r\n const a = indices ? indices[i] : i,\r\n b = indices ? indices[i + 1] : i + 1,\r\n c = indices ? indices[i + 2] : i + 2;\r\n const u = [0, 1, 2].map(j => p[b * 3 + j] - p[a * 3 + j]), v = [0, 1, 2].map(j => p[c * 3 + j] - p[a * 3 + j]);\r\n const n = [u[1] * v[2] - u[2] * v[1], u[2] * v[0] - u[0] * v[2], u[0] * v[1] - u[1] * v[0]];\r\n for (const index of [a, b, c]) {\r\n for (let j = 0; j < 3; j++) {\r\n normals[index * 3 + j] += n[j];\r\n }\r\n }\r\n }\r\n for (let i = 0; i < normals.length; i += 3) {\r\n const length = Math.hypot(...normals.subarray(i, i + 3)) || 1;\r\n for (let j = 0; j < 3; j++) {\r\n normals[i + j] /= length;\r\n }\r\n }\r\n return normals;\r\n}\r\n\r\n/** Translate glTF sampler constants into WebGPU sampler options. */\r\nexport function textureSampler(sampler) {\r\n return {\r\n addressModeU: sampler.wrapS === 33071 ? 'clamp-to-edge' : sampler.wrapS === 33648 ? 'mirror-repeat' : 'repeat',\r\n addressModeV: sampler.wrapT === 33071 ? 'clamp-to-edge' : sampler.wrapT === 33648 ? 'mirror-repeat' : 'repeat',\r\n magFilter: sampler.magFilter === 9728 ? 'nearest' : 'linear',\r\n minFilter: sampler.minFilter === 9728 || sampler.minFilter === 9984 || sampler.minFilter === 9986 ? 'nearest' : 'linear',\r\n };\r\n}\r\n"],
5
- "mappings": "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",
6
- "names": ["types", "sizes", "decodeModel", "data", "view", "decoder", "description", "binary", "offset", "length", "type", "chunk", "mesh", "primitive", "readAccessor", "index", "spec", "Type", "size", "read", "viewIndex", "count", "stride", "output", "bytes", "buffer", "i", "values", "sparse", "Index", "indices", "normalized", "nodeMatrix", "x", "y", "z", "w", "sx", "sy", "sz", "vertexNormals", "p", "normals", "a", "b", "u", "j", "v", "n", "textureSampler", "sampler"]
7
- }
@@ -1,2 +0,0 @@
1
- import{computeBounds as J}from"./geometry.js";function Q(x,G,H=0){const k=[],d=[0,0,0],y=[0,0,0],p=[0,0,0],O=(n,i)=>n.map((v,s)=>v-i[s]),q=(n,i)=>[n[1]*i[2]-n[2]*i[1],n[2]*i[0]-n[0]*i[2],n[0]*i[1]-n[1]*i[0]],b=(n,i)=>n.reduce((v,s,r)=>v+s*i[r],0);for(const n of G){const i=new DOMMatrix(n.worldMatrix).inverse();if(![...i.toFloat64Array()].every(Number.isFinite))throw new Error("Singular 3D transform");const s=new DOMPoint(...x.origin,1).matrixTransform(i),r=[s.x/s.w,s.y/s.w,s.z/s.w],I=new DOMPoint(...x.direction,0).matrixTransform(i),e=[I.x,I.y,I.z],P=Math.hypot(...e)||1;e[0]/=P,e[1]/=P,e[2]/=P,n.geometry.bounds||J(n.geometry);let F=0,D=1/0;for(let t=0;t<3;t++)if(Math.abs(e[t])<1e-12){if(r[t]<n.geometry.bounds.min[t]||r[t]>n.geometry.bounds.max[t]){D=-1/0;break}}else{const m=(n.geometry.bounds.min[t]-r[t])/e[t],f=(n.geometry.bounds.max[t]-r[t])/e[t];F=Math.max(F,Math.min(m,f)),D=Math.min(D,Math.max(m,f))}if(D<F)continue;const{position:o,index:a}=n.geometry.attributes;let M=1/0,T;for(let t=0;t<(a?.count||o.count);t+=3){const m=(a?a.data[t]:t)*o.size,f=(a?a.data[t+1]:t+1)*o.size,L=(a?a.data[t+2]:t+2)*o.size;d[0]=o.data[m],d[1]=o.data[m+1],d[2]=o.data[m+2],y[0]=o.data[f],y[1]=o.data[f+1],y[2]=o.data[f+2],p[0]=o.data[L],p[1]=o.data[L+1],p[2]=o.data[L+2];const A=O(y,d),B=O(p,d),E=q(e,B),w=b(A,E);if(n.program.cullFace!==null?w<1e-9:Math.abs(w)<1e-9)continue;const N=O(r,d),c=b(N,E)/w;if(c<0||c>1)continue;const S=q(N,A),l=b(e,S)/w;if(l<0||c+l>1)continue;if(n.program.nightLight){const g=n.geometry.attributes.uv.data,h=a?[a.data[t],a.data[t+1],a.data[t+2]]:[t,t+1,t+2],j=g[h[0]*2]*(1-c-l)+g[h[1]*2]*c+g[h[2]*2]*l,C=g[h[0]*2+1]*(1-c-l)+g[h[1]*2+1]*c+g[h[2]*2+1]*l;if(j<=2&&(!H||j*j+C*C>.9))continue}const V=b(B,S)/w;V>0&&V<M&&(M=V,T=t/3)}if(T===void 0)continue;const u=new DOMPoint(e[0]*M+r[0],e[1]*M+r[1],e[2]*M+r[2],1).matrixTransform(new DOMMatrix(n.worldMatrix)),z=[u.x/u.w,u.y/u.w,u.z/u.w];k.push({faceIndex:T,object:n,point:z,distance:Math.hypot(z[0]-x.origin[0],z[1]-x.origin[1],z[2]-x.origin[2])})}return k.sort((n,i)=>n.distance-i.distance)}export{Q as intersectMeshes};
2
- //# sourceMappingURL=picking.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/picking.js"],
4
- "sourcesContent": ["import { computeBounds } from './geometry.js';\r\n\r\n/** Nearest triangle hit per mesh, sorted by world-space distance. */\r\nexport function intersectMeshes(ray, meshes, night = 0) {\r\n const hits = [],\r\n a = [0, 0, 0],\r\n b = [0, 0, 0],\r\n c = [0, 0, 0],\r\n sub = (a, b) => a.map((v, i) => v - b[i]),\r\n cross = (a, b) => [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]],\r\n dot = (a, b) => a.reduce((sum, v, i) => sum + v * b[i], 0);\r\n for (const mesh of meshes) {\r\n // Test in mesh-local space; compare distances only after returning to shared world space.\r\n const inverse = new DOMMatrix(mesh.worldMatrix).inverse();\r\n const inverseValues = inverse.toFloat64Array();\r\n if (![...inverseValues].every(Number.isFinite)) {\r\n throw new Error('Singular 3D transform');\r\n }\r\n const localOrigin = new DOMPoint(...ray.origin, 1).matrixTransform(inverse);\r\n const origin = [\r\n localOrigin.x / localOrigin.w,\r\n localOrigin.y / localOrigin.w,\r\n localOrigin.z / localOrigin.w\r\n ];\r\n const localDirection = new DOMPoint(...ray.direction, 0).matrixTransform(inverse);\r\n const direction = [\r\n localDirection.x,\r\n localDirection.y,\r\n localDirection.z\r\n ];\r\n const directionLength = Math.hypot(...direction) || 1;\r\n direction[0] /= directionLength; direction[1] /= directionLength; direction[2] /= directionLength;\r\n // AABB slab test reuses the same local ray as the triangle test.\r\n if (!mesh.geometry.bounds) {\r\n computeBounds(mesh.geometry);\r\n }\r\n let near = 0, far = Infinity;\r\n for (let i = 0; i < 3; i++) {\r\n if (Math.abs(direction[i]) < 1e-12) {\r\n if (origin[i] < mesh.geometry.bounds.min[i] || origin[i] > mesh.geometry.bounds.max[i]) {\r\n far = -Infinity;\r\n break;\r\n }\r\n } else {\r\n const a = (mesh.geometry.bounds.min[i] - origin[i]) / direction[i],\r\n b = (mesh.geometry.bounds.max[i] - origin[i]) / direction[i];\r\n near = Math.max(near, Math.min(a, b));\r\n far = Math.min(far, Math.max(a, b));\r\n }\r\n }\r\n if (far < near) {\r\n continue;\r\n }\r\n const { position, index } = mesh.geometry.attributes;\r\n let closest = Infinity, faceIndex;\r\n for (let i = 0; i < (index?.count || position.count); i += 3) {\r\n const ai = (index ? index.data[i] : i) * position.size;\r\n const bi = (index ? index.data[i + 1] : i + 1) * position.size;\r\n const ci = (index ? index.data[i + 2] : i + 2) * position.size;\r\n a[0] = position.data[ai];\r\n a[1] = position.data[ai + 1];\r\n a[2] = position.data[ai + 2];\r\n b[0] = position.data[bi];\r\n b[1] = position.data[bi + 1];\r\n b[2] = position.data[bi + 2];\r\n c[0] = position.data[ci];\r\n c[1] = position.data[ci + 1];\r\n c[2] = position.data[ci + 2];\r\n // Moller-Trumbore: barycentric triangle coordinates and local ray distance.\r\n const e = sub(b, a),\r\n f = sub(c, a),\r\n p = cross(direction, f),\r\n det = dot(e, p);\r\n if (mesh.program.cullFace !== null ? det < 1e-9 : Math.abs(det) < 1e-9) {\r\n continue;\r\n }\r\n const t = sub(origin, a),\r\n u = dot(t, p) / det;\r\n if (u < 0 || u > 1) {\r\n continue;\r\n }\r\n const q = cross(t, e),\r\n v = dot(direction, q) / det;\r\n if (v < 0 || u + v > 1) {\r\n continue;\r\n }\r\n if (mesh.program.nightLight) {\r\n const uv = mesh.geometry.attributes.uv.data;\r\n const ids = index ? [index.data[i], index.data[i + 1], index.data[i + 2]] : [i, i + 1, i + 2];\r\n const x = uv[ids[0] * 2] * (1 - u - v) + uv[ids[1] * 2] * u + uv[ids[2] * 2] * v;\r\n const y = uv[ids[0] * 2 + 1] * (1 - u - v) + uv[ids[1] * 2 + 1] * u + uv[ids[2] * 2 + 1] * v;\r\n if (x <= 2 && (!night || x * x + y * y > 0.9)) continue;\r\n }\r\n const distance = dot(f, q) / det;\r\n if (distance > 0 && distance < closest) {\r\n closest = distance; faceIndex = i / 3;\r\n }\r\n }\r\n if (faceIndex === undefined) continue;\r\n const point = new DOMPoint(\r\n direction[0] * closest + origin[0],\r\n direction[1] * closest + origin[1],\r\n direction[2] * closest + origin[2],\r\n 1\r\n ).matrixTransform(new DOMMatrix(mesh.worldMatrix));\r\n const worldPoint = [point.x / point.w, point.y / point.w, point.z / point.w];\r\n hits.push({\r\n faceIndex,\r\n object: mesh,\r\n point: worldPoint,\r\n distance: Math.hypot(\r\n worldPoint[0] - ray.origin[0],\r\n worldPoint[1] - ray.origin[1],\r\n worldPoint[2] - ray.origin[2]\r\n )\r\n });\r\n }\r\n return hits.sort((a, b) => a.distance - b.distance);\r\n}\r\n"],
5
- "mappings": "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",
6
- "names": ["computeBounds", "intersectMeshes", "ray", "meshes", "night", "hits", "a", "b", "c", "sub", "i", "cross", "dot", "sum", "v", "mesh", "inverse", "localOrigin", "origin", "localDirection", "direction", "directionLength", "near", "far", "position", "index", "closest", "faceIndex", "ai", "bi", "ci", "e", "f", "p", "det", "t", "u", "q", "uv", "ids", "x", "y", "distance", "point", "worldPoint"]
7
- }
@@ -1,2 +0,0 @@
1
- async function a(n,e){if(e===1)return n;if(e!==2)throw new Error(`Unsupported PMTiles compression: ${e}`);return new Response(new Blob([n]).stream().pipeThrough(new DecompressionStream("gzip"))).arrayBuffer()}function d(n){if(n.byteLength<127||new TextDecoder().decode(new Uint8Array(n,0,7))!=="PMTiles"||new Uint8Array(n)[7]!==3)throw new Error("Expected a PMTiles v3 archive");const e=new DataView(n),r={};return["rootDirectoryOffset","rootDirectoryLength","jsonMetadataOffset","jsonMetadataLength","leafDirectoryOffset","leafDirectoryLength","tileDataOffset","tileDataLength","numAddressedTiles","numTileEntries","numTileContents"].forEach((i,s)=>{r[i]=Number(e.getBigUint64(8+s*8,!0))}),["clustered","internalCompression","tileCompression","tileType","minZoom","maxZoom"].forEach((i,s)=>{r[i]=e.getUint8(96+s)}),["minLon","minLat","maxLon","maxLat"].forEach((i,s)=>{r[i]=e.getInt32(102+s*4,!0)/1e7}),r.centerZoom=e.getUint8(118),r.centerLon=e.getInt32(119,!0)/1e7,r.centerLat=e.getInt32(123,!0)/1e7,r}function h(n,e,r){if(![n,e,r].every(Number.isInteger)||n<0||n>26||e<0||r<0||e>=2**n||r>=2**n)throw new Error("Invalid PMTiles tile coordinates");let i=(4**n-1)/3;const s=2**n;for(let o=s/2;o>=1;o/=2){const l=e&o?1:0,t=r&o?1:0;i+=o*o*(3*l^t),t||(l&&(e=s-1-e,r=s-1-r),[e,r]=[r,e])}return i}function u(n){const e=new Uint8Array(n);let r=0;const i=()=>{let t=0;for(let c=1;c<=2**49;c*=128){if(r>=e.length)throw new Error("Truncated PMTiles directory");const f=e[r++];if(t+=(f&127)*c,!Number.isSafeInteger(t))throw new Error("Invalid PMTiles directory integer");if(f<128)return t}throw new Error("Invalid PMTiles directory integer")},s=i();if(s>(e.length-r)/4)throw new Error("Invalid PMTiles directory count");const o=[];let l=0;for(let t=0;t<s;t++){if(l+=i(),!Number.isSafeInteger(l)||t&&l<=o[t-1].tileId)throw new Error("Invalid PMTiles directory tile IDs");o.push({tileId:l})}for(const t of o)t.runLength=i();for(const t of o)if(t.length=i(),!t.length)throw new Error("Invalid PMTiles directory length");if(o.forEach((t,c)=>{const f=i();if(!f&&!c)throw new Error("Invalid PMTiles directory offset");t.offset=f?f-1:o[c-1].offset+o[c-1].length}),r!==e.length)throw new Error("Trailing PMTiles directory data");return o}export{u as decodeDirectory,d as decodeHeader,a as decompress,h as tileId};
2
- //# sourceMappingURL=pmtiles.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/pmtiles.js"],
4
- "sourcesContent": ["export async function decompress(data, compression) {\r\n if (compression === 1) return data;\r\n if (compression !== 2) throw new Error(`Unsupported PMTiles compression: ${compression}`);\r\n return new Response(new Blob([data]).stream().pipeThrough(new DecompressionStream('gzip'))).arrayBuffer();\r\n}\r\n\r\n/** Decode the PMTiles v3 header. */\r\nexport function decodeHeader(data) {\r\n if (data.byteLength < 127 || new TextDecoder().decode(new Uint8Array(data, 0, 7)) !== 'PMTiles' ||\r\n new Uint8Array(data)[7] !== 3) throw new Error('Expected a PMTiles v3 archive');\r\n const view = new DataView(data);\r\n const header = {};\r\n ['rootDirectoryOffset', 'rootDirectoryLength', 'jsonMetadataOffset', 'jsonMetadataLength', 'leafDirectoryOffset', 'leafDirectoryLength', 'tileDataOffset', 'tileDataLength', 'numAddressedTiles', 'numTileEntries', 'numTileContents'].forEach((name, i) => { header[name] = Number(view.getBigUint64(8 + i * 8, true)); });\r\n ['clustered', 'internalCompression', 'tileCompression', 'tileType', 'minZoom', 'maxZoom'].forEach((name, i) => { header[name] = view.getUint8(96 + i); });\r\n ['minLon', 'minLat', 'maxLon', 'maxLat'].forEach((name, i) => { header[name] = view.getInt32(102 + i * 4, true) / 1e7; });\r\n header.centerZoom = view.getUint8(118);\r\n header.centerLon = view.getInt32(119, true) / 1e7;\r\n header.centerLat = view.getInt32(123, true) / 1e7;\r\n return header;\r\n}\r\n\r\n/** Cumulative Hilbert ID for an archive tile. */\r\nexport function tileId(z, x, y) {\r\n if (![z, x, y].every(Number.isInteger) || z < 0 || z > 26 ||\r\n x < 0 || y < 0 || x >= 2 ** z || y >= 2 ** z) throw new Error('Invalid PMTiles tile coordinates');\r\n let id = (4 ** z - 1) / 3;\r\n const n = 2 ** z;\r\n // Same cumulative Hilbert ordering used by build/pmtiles.js.\r\n for (let s = n / 2; s >= 1; s /= 2) {\r\n const rx = (x & s) ? 1 : 0,\r\n ry = (y & s) ? 1 : 0;\r\n id += s * s * ((3 * rx) ^ ry);\r\n if (!ry) {\r\n if (rx) { x = n - 1 - x; y = n - 1 - y; }\r\n [x, y] = [y, x];\r\n }\r\n }\r\n return id;\r\n}\r\n\r\n/** Decode delta/varint directory columns, rejecting malformed entries. */\r\nexport function decodeDirectory(data) {\r\n const bytes = new Uint8Array(data);\r\n let cursor = 0;\r\n const varint = () => {\r\n let value = 0;\r\n for (let factor = 1; factor <= 2 ** 49; factor *= 128) {\r\n if (cursor >= bytes.length) throw new Error('Truncated PMTiles directory');\r\n const byte = bytes[cursor++];\r\n value += (byte & 127) * factor;\r\n if (!Number.isSafeInteger(value)) throw new Error('Invalid PMTiles directory integer');\r\n if (byte < 128) return value;\r\n }\r\n throw new Error('Invalid PMTiles directory integer');\r\n };\r\n const count = varint();\r\n if (count > (bytes.length - cursor) / 4) throw new Error('Invalid PMTiles directory count');\r\n const entries = [];\r\n let tileId = 0;\r\n for (let i = 0; i < count; i++) {\r\n tileId += varint();\r\n if (!Number.isSafeInteger(tileId) || (i && tileId <= entries[i - 1].tileId)) {\r\n throw new Error('Invalid PMTiles directory tile IDs');\r\n }\r\n entries.push({ tileId });\r\n }\r\n for (const entry of entries) entry.runLength = varint();\r\n for (const entry of entries) {\r\n entry.length = varint();\r\n if (!entry.length) throw new Error('Invalid PMTiles directory length');\r\n }\r\n entries.forEach((entry, i) => {\r\n const value = varint();\r\n if (!value && !i) throw new Error('Invalid PMTiles directory offset');\r\n entry.offset = value ? value - 1 : entries[i - 1].offset + entries[i - 1].length;\r\n });\r\n if (cursor !== bytes.length) throw new Error('Trailing PMTiles directory data');\r\n return entries;\r\n}\r\n"],
5
- "mappings": "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",
6
- "names": ["decompress", "data", "compression", "decodeHeader", "view", "header", "name", "i", "tileId", "z", "x", "y", "id", "n", "s", "rx", "ry", "decodeDirectory", "bytes", "cursor", "varint", "value", "factor", "byte", "count", "entries", "entry"]
7
- }
@@ -1,2 +0,0 @@
1
- const y=()=>({position:[0,0,0],rotation:[0,0,0],scale:[1,1,1],worldMatrix:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],children:[],visible:!0});function A(t,e){t.parent&&t.parent.children.splice(t.parent.children.indexOf(t),1),t.parent=e,e&&e.children.push(t)}function u(t,e){if(!e(t))for(const a of t.children)u(a,e)}function M(t){const e=t.parent,a=e?._worldMatrixVersion||0,c=!!t.matrix;let n=t._worldParent!==e||t._parentWorldVersion!==a||t._worldMatrixMode!==c;if(t.matrix){const o=t._matrixState||=new Float64Array(16);for(let i=0;i<16;i++)o[i]!==t.matrix[i]&&(n=!0),o[i]=t.matrix[i]}else{const o=t._transformState||=new Float64Array(9);for(let i=0;i<9;i++){const x=i<3?t.position[i]:i<6?t.rotation[i-3]:t.scale[i-6];o[i]!==x&&(n=!0),o[i]=x}}if(!n){for(const o of t.children)M(o);return}let s;if(t.matrix)s=t.matrix;else{const o=180/Math.PI,i=new DOMMatrix().translate(...t.position);i.rotateAxisAngleSelf(0,1,0,t.rotation[1]*o),i.rotateAxisAngleSelf(1,0,0,t.rotation[0]*o),i.rotateAxisAngleSelf(0,0,1,t.rotation[2]*o),s=i.scale(...t.scale).toFloat64Array()}const f=e?new DOMMatrix(e.worldMatrix).multiply(new DOMMatrix(s)).toFloat64Array():s;for(let o=0;o<16;o++)t.worldMatrix[o]=f[o];t._worldParent=e,t._parentWorldVersion=a,t._worldMatrixMode=c,t._worldMatrixVersion=(t._worldMatrixVersion||0)+1;for(const o of t.children)M(o)}function _(t){const e=t.position.map((r,l)=>r-t.target[l]),a=Math.hypot(...e)||1,c=(r,l)=>[r[1]*l[2]-r[2]*l[1],r[2]*l[0]-r[0]*l[2],r[0]*l[1]-r[1]*l[0]];for(let r=0;r<3;r++)e[r]/=a;const n=c(t.up,e),s=Math.hypot(...n)||1;for(let r=0;r<3;r++)n[r]/=s;const f=c(e,n),o=new DOMMatrix([n[0],n[1],n[2],0,f[0],f[1],f[2],0,e[0],e[1],e[2],0,...t.position,1]).inverse().toFloat64Array();if(![...o].every(Number.isFinite))throw new Error("Singular 3D transform");for(let r=0;r<16;r++)t.viewMatrix[r]=o[r];const i=1/Math.tan(t.fov*Math.PI/360),x=t.near,p=t.far,w=[i/t.aspect,0,0,0,0,i,0,0,0,0,p/(x-p),-1,0,0,p*x/(x-p),0];for(let r=0;r<16;r++)t.projectionMatrix[r]=w[r];const h=new DOMMatrix(t.projectionMatrix).multiply(new DOMMatrix(t.viewMatrix)).toFloat64Array();for(let r=0;r<16;r++)t.projectionViewMatrix[r]=h[r]}export{y as emptyNode,A as setParent,u as traverse,_ as updateCamera,M as updateWorldMatrix};
2
- //# sourceMappingURL=scene.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/scene.js"],
4
- "sourcesContent": ["/** A fresh, empty scene-graph node. */\r\nexport const emptyNode = () => ({\r\n position: [0, 0, 0],\r\n rotation: [0, 0, 0],\r\n scale: [1, 1, 1],\r\n worldMatrix: [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],\r\n children: [],\r\n visible: true,\r\n});\r\n\r\n/** Reparent/detach scene data without drawing or disposing GPU resources. */\r\nexport function setParent(node, parent) {\r\n if (node.parent) node.parent.children.splice(node.parent.children.indexOf(node), 1);\r\n node.parent = parent;\r\n if (parent) parent.children.push(node);\r\n}\r\n\r\n/** Depth-first walk; a truthy callback result skips that node's descendants. */\r\nexport function traverse(node, callback) {\r\n if (callback(node)) return;\r\n for (const child of node.children) traverse(child, callback);\r\n}\r\n\r\n/** Compose parent*local matrices; a node.matrix overrides its position/rotation/scale. */\r\nexport function updateWorldMatrix(node) {\r\n const parent = node.parent;\r\n const parentVersion = parent?._worldMatrixVersion || 0;\r\n const matrixMode = Boolean(node.matrix);\r\n let changed = node._worldParent !== parent || node._parentWorldVersion !== parentVersion ||\r\n node._worldMatrixMode !== matrixMode;\r\n if (node.matrix) {\r\n const state = node._matrixState ||= new Float64Array(16);\r\n for (let i = 0; i < 16; i++) {\r\n if (state[i] !== node.matrix[i]) changed = true;\r\n state[i] = node.matrix[i];\r\n }\r\n } else {\r\n const state = node._transformState ||= new Float64Array(9);\r\n for (let i = 0; i < 9; i++) {\r\n const value = i < 3 ? node.position[i] : i < 6 ? node.rotation[i - 3] : node.scale[i - 6];\r\n if (state[i] !== value) changed = true;\r\n state[i] = value;\r\n }\r\n }\r\n if (!changed) {\r\n for (const child of node.children) updateWorldMatrix(child);\r\n return;\r\n }\r\n let local;\r\n if (node.matrix) local = node.matrix;\r\n else {\r\n const degrees = 180 / Math.PI;\r\n const matrix = new DOMMatrix().translate(...node.position);\r\n // Node rotations use YXZ, as did the previous renderer.\r\n matrix.rotateAxisAngleSelf(0, 1, 0, node.rotation[1] * degrees);\r\n matrix.rotateAxisAngleSelf(1, 0, 0, node.rotation[0] * degrees);\r\n matrix.rotateAxisAngleSelf(0, 0, 1, node.rotation[2] * degrees);\r\n local = matrix.scale(...node.scale).toFloat64Array();\r\n }\r\n const world = parent\r\n ? new DOMMatrix(parent.worldMatrix).multiply(new DOMMatrix(local)).toFloat64Array()\r\n : local;\r\n for (let i = 0; i < 16; i++) node.worldMatrix[i] = world[i];\r\n node._worldParent = parent;\r\n node._parentWorldVersion = parentVersion;\r\n node._worldMatrixMode = matrixMode;\r\n node._worldMatrixVersion = (node._worldMatrixVersion || 0) + 1;\r\n for (const child of node.children) updateWorldMatrix(child);\r\n}\r\n\r\n/** Orthonormal view basis plus perspective matrices, refreshed before projecting/drawing. */\r\nexport function updateCamera(camera) {\r\n const z = camera.position.map((v, i) => v - camera.target[i]);\r\n const zLength = Math.hypot(...z) || 1;\r\n const cross = (a, b) => [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\r\n for (let i = 0; i < 3; i++) {\r\n z[i] /= zLength;\r\n }\r\n const x = cross(camera.up, z), xLength = Math.hypot(...x) || 1;\r\n for (let i = 0; i < 3; i++) {\r\n x[i] /= xLength;\r\n }\r\n const y = cross(z, x);\r\n const view = new DOMMatrix([x[0], x[1], x[2], 0, y[0], y[1], y[2], 0, z[0], z[1], z[2], 0, ...camera.position, 1]).inverse().toFloat64Array();\r\n if (![...view].every(Number.isFinite)) {\r\n throw new Error('Singular 3D transform');\r\n }\r\n for (let i = 0; i < 16; i++) {\r\n camera.viewMatrix[i] = view[i];\r\n }\r\n const f = 1 / Math.tan(camera.fov * Math.PI / 360),\r\n n = camera.near,\r\n r = camera.far;\r\n const projection = [f / camera.aspect, 0, 0, 0, 0, f, 0, 0, 0, 0, r / (n - r), -1, 0, 0, r * n / (n - r), 0];\r\n for (let i = 0; i < 16; i++) {\r\n camera.projectionMatrix[i] = projection[i];\r\n }\r\n const projectionView = new DOMMatrix(camera.projectionMatrix).multiply(new DOMMatrix(camera.viewMatrix)).toFloat64Array();\r\n for (let i = 0; i < 16; i++) {\r\n camera.projectionViewMatrix[i] = projectionView[i];\r\n }\r\n}\r\n"],
5
- "mappings": "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",
6
- "names": ["emptyNode", "setParent", "node", "parent", "traverse", "callback", "child", "updateWorldMatrix", "parentVersion", "matrixMode", "changed", "state", "value", "local", "degrees", "matrix", "world", "i", "updateCamera", "camera", "z", "v", "zLength", "cross", "a", "b", "x", "xLength", "y", "view", "f", "n", "r", "projection", "projectionView"]
7
- }
@@ -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
- }