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
@@ -0,0 +1,2 @@
1
+ const u=f=>{const g=[],m=[],a=[],r=(p,c,e,i)=>{const h=c.map((n,l)=>n-p[l]),t=e.map((n,l)=>n-p[l]),s=[h[1]*t[2]-h[2]*t[1],h[2]*t[0]-h[0]*t[2],h[0]*t[1]-h[1]*t[0]],o=Math.hypot(...s);for(const n of[p,c,e])g.push(...n),m.push(...s.map(l=>l/o)),a.push(...i)};for(const[p,c,e,i,h=p]of f){const t=p.map(([o,n])=>[o,c,n]),s=h.map(([o,n])=>[o,e,n]);for(let o=0;o<p.length;o++){const n=(o+1)%p.length;r(t[o],t[n],s[n],i),r(t[o],s[n],s[o],i)}for(let o=1;o<p.length-1;o++)r(s[0],s[o],s[o+1],i),r(t[0],t[o+1],t[o],i)}return{position:g,normal:m,color:a}};export{u as build};
2
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/build.js"],
4
+ "sourcesContent": ["\nexport const build = parts => {\n const position = [], normal = [], color = [];\n const triangle = (a, b, c, tint) => {\n const u = b.map((v, i) => v - a[i]), v = c.map((w, i) => w - a[i]);\n const n = [u[1] * v[2] - u[2] * v[1], u[2] * v[0] - u[0] * v[2], u[0] * v[1] - u[1] * v[0]], length = Math.hypot(...n);\n for (const point of [a, b, c]) { position.push(...point); normal.push(...n.map(w => w / length)); color.push(...tint); }\n };\n for (const [ring, bottom, top, tint, topRing = ring] of parts) {\n const low = ring.map(([x, z]) => [x, bottom, z]), high = topRing.map(([x, z]) => [x, top, z]);\n for (let i = 0; i < ring.length; i++) {\n const j = (i + 1) % ring.length;\n triangle(low[i], low[j], high[j], tint); triangle(low[i], high[j], high[i], tint);\n }\n for (let i = 1; i < ring.length - 1; i++) {\n triangle(high[0], high[i], high[i + 1], tint); triangle(low[0], low[i + 1], low[i], tint);\n }\n }\n return { position, normal, color };\n};\n"],
5
+ "mappings": "AACO,MAAMA,EAAQC,GAAS,CAC5B,MAAMC,EAAW,CAAC,EAAGC,EAAS,CAAC,EAAGC,EAAQ,CAAC,EACrCC,EAAW,CAACC,EAAGC,EAAGC,EAAGC,IAAS,CAClC,MAAMC,EAAIH,EAAE,IAAI,CAACI,EAAGC,IAAMD,EAAIL,EAAEM,CAAC,CAAC,EAAGD,EAAIH,EAAE,IAAI,CAACK,EAAGD,IAAMC,EAAIP,EAAEM,CAAC,CAAC,EAC3DE,EAAI,CAACJ,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAID,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAGD,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAID,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAGD,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAID,EAAE,CAAC,EAAIC,EAAE,CAAC,CAAC,EAAGI,EAAS,KAAK,MAAM,GAAGD,CAAC,EACrH,UAAWE,IAAS,CAACV,EAAGC,EAAGC,CAAC,EAAKN,EAAS,KAAK,GAAGc,CAAK,EAAGb,EAAO,KAAK,GAAGW,EAAE,IAAID,GAAKA,EAAIE,CAAM,CAAC,EAAGX,EAAM,KAAK,GAAGK,CAAI,CACtH,EACA,SAAW,CAACQ,EAAMC,EAAQC,EAAKV,EAAMW,EAAUH,CAAI,IAAKhB,EAAO,CAC7D,MAAMoB,EAAMJ,EAAK,IAAI,CAAC,CAACK,EAAGC,CAAC,IAAM,CAACD,EAAGJ,EAAQK,CAAC,CAAC,EAAGC,EAAOJ,EAAQ,IAAI,CAAC,CAACE,EAAGC,CAAC,IAAM,CAACD,EAAGH,EAAKI,CAAC,CAAC,EAC5F,QAASX,EAAI,EAAGA,EAAIK,EAAK,OAAQL,IAAK,CACpC,MAAMa,GAAKb,EAAI,GAAKK,EAAK,OACzBZ,EAASgB,EAAIT,CAAC,EAAGS,EAAII,CAAC,EAAGD,EAAKC,CAAC,EAAGhB,CAAI,EAAGJ,EAASgB,EAAIT,CAAC,EAAGY,EAAKC,CAAC,EAAGD,EAAKZ,CAAC,EAAGH,CAAI,CAClF,CACA,QAASG,EAAI,EAAGA,EAAIK,EAAK,OAAS,EAAGL,IACnCP,EAASmB,EAAK,CAAC,EAAGA,EAAKZ,CAAC,EAAGY,EAAKZ,EAAI,CAAC,EAAGH,CAAI,EAAGJ,EAASgB,EAAI,CAAC,EAAGA,EAAIT,EAAI,CAAC,EAAGS,EAAIT,CAAC,EAAGH,CAAI,CAE5F,CACA,MAAO,CAAE,SAAAP,EAAU,OAAAC,EAAQ,MAAAC,CAAM,CACnC",
6
+ "names": ["build", "parts", "position", "normal", "color", "triangle", "a", "b", "c", "tint", "u", "v", "i", "w", "n", "length", "point", "ring", "bottom", "top", "topRing", "low", "x", "z", "high", "j"]
7
+ }
@@ -0,0 +1,2 @@
1
+ function w(t){return t.closest?.('input,textarea,select,[contenteditable="true"]')}function p(t,n,o,i=[.8,.5],r=!1){let a,h=!1;const l=e=>{if(!a||e?.pointerId!==void 0&&e.pointerId!==a.id)return;const d=a;a=null,n.hasPointerCapture?.(d.id)&&n.releasePointerCapture(d.id),d.dragging&&t.getContainer()._leaflet_id&&t.dragging.enable(),n.style.cursor=d.cursor},g=e=>{if(a||!o(e)||w(e.target))return;e.preventDefault(),e.stopPropagation(),h=!1;const d=t.getContainer().getBoundingClientRect();a={id:e.pointerId,x:e.clientX,y:e.clientY,cursor:n.style.cursor,cx:d.left+d.width/2,cy:d.top+d.height/2,dragging:t.dragging?.enabled()},t.dragging?.disable(),n.focus?.({preventScroll:!0}),n.setPointerCapture(e.pointerId),n.style.cursor="grabbing"},u=e=>{if(!a||a.id!==e.pointerId)return;const d=e.clientX-a.x,f=e.clientY-a.y;if(Math.hypot(d,f)<3&&!h)return;t._stopPitchBearingAnimation(),h=!0,e.preventDefault();let b=d*i[0];if(r)if(Math.abs(a.cy-a.y)>100){const v=Math.atan2(e.clientY-a.cy,e.clientX-a.cx)-Math.atan2(e.clientY-a.cy,a.x-a.cx);b=Math.atan2(Math.sin(v),Math.cos(v))*180/Math.PI}else b*=e.clientY<a.cy?1:-1;t._setPitchAndBearing(t.getPitch()-f*i[1],t.getBearing()+b),a.x=e.clientX,a.y=e.clientY},c=e=>{h&&(e.preventDefault(),e.stopPropagation(),h=!1)},s=e=>{(a||h)&&(e.preventDefault(),e.stopPropagation())};return n.addEventListener("pointerdown",g,!0),n.addEventListener("pointermove",u),n.addEventListener("pointerup",l),n.addEventListener("pointercancel",l),n.addEventListener("lostpointercapture",l),n.addEventListener("click",c,!0),n.addEventListener("contextmenu",s),window.addEventListener("blur",l),()=>{l(),n.removeEventListener("pointerdown",g,!0),n.removeEventListener("pointermove",u),n.removeEventListener("pointerup",l),n.removeEventListener("pointercancel",l),n.removeEventListener("lostpointercapture",l),n.removeEventListener("click",c,!0),n.removeEventListener("contextmenu",s),window.removeEventListener("blur",l)}}L.Control.Rotate=L.Control.extend({options:{position:"topleft",closeOnZeroBearing:!0,visualizePitch:!0},onAdd(t){const n=L.DomUtil.create("div","leaflet-control-rotate leaflet-bar"),o=L.DomUtil.create("a","leaflet-control-rotate-toggle",n);o.href="#",o.setAttribute("role","button"),o.title=this.options.visualizePitch?"Reset bearing and pitch":"Reset bearing to north",o.setAttribute("aria-label",o.title),o.style.cssText="cursor:grab;touch-action:none";const i=L.DomUtil.create("span","leaflet-control-rotate-arrow",o);return i.setAttribute("aria-hidden","true"),i.style.cssText="display:block;width:100%;height:100%;pointer-events:none;background: no-repeat center / 29px 29px",i.style.backgroundImage='url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 29 29%27%3E%3Cpath fill=%27%23333%27 d=%27M10.5 14 14.5 6 18.5 14Z%27/%3E%3Cpath fill=%27%23ccc%27 d=%27M10.5 16 14.5 24 18.5 16Z%27/%3E%3C/svg%3E")',o.onclick=r=>{r.preventDefault(),this.options.visualizePitch?t.resetNorthPitch():t.resetNorth(),r.detail&&t.getContainer().focus({preventScroll:!0})},o.onkeydown=r=>{const a=r.shiftKey?15:5;if(r.key==="ArrowLeft")t.setBearing(t.getBearing()-a);else if(r.key==="ArrowRight")t.setBearing(t.getBearing()+a);else if(r.key==="ArrowUp"&&this.options.visualizePitch)t.setPitch(t.getPitch()+a);else if(r.key==="ArrowDown"&&this.options.visualizePitch)t.setPitch(t.getPitch()-a);else if(r.key==="Home"||r.key===" ")o.click();else return;r.preventDefault(),r.stopPropagation()},this._refresh=()=>{const r=this.options.visualizePitch?t.getPitch():0;i.style.transform=`scale(${1/Math.sqrt(Math.cos(r*Math.PI/180))}) rotateX(${r}deg) rotate(${t.getBearing()}deg)`,o.setAttribute("aria-description",`Bearing ${Math.round(t.getBearing())} degrees, pitch ${Math.round(t.getPitch())} degrees. Arrow keys adjust the camera; Home resets it.`),n.style.display=this.options.closeOnZeroBearing&&!t.getBearing()&&!r&&!n.contains(document.activeElement)?"none":""},t.on("rotate pitch",this._refresh),this._refresh(),this._endDrag=p(t,o,r=>r.button===0,[.8,this.options.visualizePitch?.5:0]),o.addEventListener("focusout",this._refresh),L.DomEvent.on(o,"dblclick contextmenu",L.DomEvent.stop),L.DomEvent.disableClickPropagation(n),L.DomEvent.disableScrollPropagation(n),n},onRemove(t){t.off("rotate pitch",this._refresh),this._endDrag()}}),L.control&&(L.control.rotate=t=>new L.Control.Rotate(t));const _=L.Handler.extend({addHooks(){this._wheel=t=>{!t.shiftKey||w(t.target)||t.target.closest(".leaflet-control")||(t.preventDefault(),t.stopImmediatePropagation(),this._map.setBearing(this._map.getBearing()+Math.sign(t.deltaY)*5))},this._map.getContainer().addEventListener("wheel",this._wheel,{passive:!1,capture:!0})},removeHooks(){this._map.getContainer().removeEventListener("wheel",this._wheel,!0)}}),C=L.Handler.extend({addHooks(){this._end=p(this._map,this._map.getContainer(),t=>!t.target.closest(".leaflet-control,.leaflet-marker-icon,.leaflet-popup")&&(t.button===2||t.button===0&&t.ctrlKey),[.8,.5],!0)},removeHooks(){this._end()}}),y=L.Handler.extend({addHooks(){const t=this._generation=(this._generation||0)+1;this._orientation=o=>{const i=Number.isFinite(o.webkitCompassHeading)?-o.webkitCompassHeading:o.alpha,r=o.absolute?0:screen.orientation?.angle??window.orientation??0;Number.isFinite(i)&&this._map.setBearing(i-r)};const n=window.DeviceOrientationEvent?.requestPermission;new Promise(o=>o(n?n.call(window.DeviceOrientationEvent):"granted")).then(o=>{if(!(!this.enabled()||this._generation!==t)){if(!window.DeviceOrientationEvent||o!=="granted")throw new Error("Device compass permission unavailable or denied");window.addEventListener("deviceorientation",this._orientation),window.addEventListener("deviceorientationabsolute",this._orientation)}}).catch(o=>{this.disable(),this._map.fire("error",{error:o})})},removeHooks(){this._generation++,window.removeEventListener("deviceorientation",this._orientation),window.removeEventListener("deviceorientationabsolute",this._orientation)}}),M=L.Handler.extend({addHooks(){this._observer=new ResizeObserver(()=>this._map.invalidateSize()),this._observer.observe(this._map.getContainer())},removeHooks(){this._observer.disconnect()}});function k(t){if(t.addHandler("trackContainerMutation",M),!t.options.rotate)return;t.addHandler("shiftKeyRotate",_),t.addHandler("pitchDrag",C),t.addHandler("compassBearing",y);const n=L.Handler.extend({addHooks(){t.fire("cameratouchchange")},removeHooks(){t.fire("cameratouchchange")}});t.addHandler("touchRotate",n),t.addHandler("touchPitch",n);const o=t.getContainer();let i,r;const a=c=>{if(c.touches.length!==2||c.target.closest(".leaflet-control")||!t.touchRotate.enabled()&&!t.touchPitch.enabled())return;const[s,e]=c.touches;if(Math.hypot(e.clientX-s.clientX,e.clientY-s.clientY)<1)return;t._stopPitchBearingAnimation();const d=new L.Point((s.clientX+e.clientX)/2,(s.clientY+e.clientY)/2).subtract(new L.Point(o.getBoundingClientRect().left,o.getBoundingClientRect().top));i={angle:Math.atan2(e.clientY-s.clientY,e.clientX-s.clientX),distance:Math.hypot(e.clientX-s.clientX,e.clientY-s.clientY),middle:d,anchor:t.containerPointToLatLng(d),zoom:t.getZoom(),bearing:t.getBearing(),pitch:t.getPitch(),zooming:t.touchZoom?.enabled(),dragging:t.dragging?.enabled()},t.dragging?.disable(),c.preventDefault(),c.stopImmediatePropagation()},h=c=>{if(!i||c.touches.length!==2)return;const[s,e]=c.touches,d=Math.atan2(e.clientY-s.clientY,e.clientX-s.clientX),f=new L.Point((s.clientX+e.clientX)/2,(s.clientY+e.clientY)/2).subtract(new L.Point(o.getBoundingClientRect().left,o.getBoundingClientRect().top)),b=Math.atan2(Math.sin(d-i.angle),Math.cos(d-i.angle))*180/Math.PI;t._setPitchAndBearing(t.touchPitch.enabled()?i.pitch-(f.y-i.middle.y)*.25:i.pitch,t.touchRotate.enabled()?i.bearing+b:i.bearing);const v=Math.hypot(e.clientX-s.clientX,e.clientY-s.clientY);if(v<1)return;const P=i.zooming?Math.max(t.getMinZoom(),Math.min(t.getMaxZoom(),i.zoom+Math.log2(v/i.distance))):i.zoom;if(t.setView(t.getCenter(),P,{animate:!1}),t.options.touchZoom!=="center"){const E=t.project(i.anchor).subtract(t.project(t.containerPointToLatLng(f)));t.setView(t.unproject(t.project(t.getCenter()).add(E)),t.getZoom(),{animate:!1})}c.preventDefault(),c.stopImmediatePropagation()},l=c=>{if(!i||c?.touches?.length>=2)return;i.dragging&&o._leaflet_id&&t.dragging.enable();const s=i.snap;t.options.zoomSnap=s,i.zooming&&s&&o._leaflet_id&&t.setZoom(Math.round(t.getZoom()/s)*s,{animate:!1}),i=null},g=()=>{const c=t.touchRotate.enabled()||t.touchPitch.enabled();c&&r===void 0?(r=t.touchZoom?.enabled(),t.touchZoom?.disable()):!c&&r!==void 0&&(l(),r&&o._leaflet_id&&t.touchZoom.enable(),r=void 0)};g();const u=c=>{i||(a(c),i&&(r!==void 0&&(i.zooming=r),i.snap=t.options.zoomSnap,t.options.zoomSnap=0))};o.addEventListener("touchstart",u,{capture:!0,passive:!1}),o.addEventListener("touchmove",h,{capture:!0,passive:!1}),o.addEventListener("touchend",l,!0),o.addEventListener("touchcancel",l,!0),window.addEventListener("blur",l),t.on("cameratouchchange",g),t.options.rotateControl&&(t.rotateControl=new L.Control.Rotate(typeof t.options.rotateControl=="object"?t.options.rotateControl:{}),t.rotateControl.addTo(t)),t.once("unload",()=>{l(),o.removeEventListener("touchstart",u,!0),o.removeEventListener("touchmove",h,!0),o.removeEventListener("touchend",l,!0),o.removeEventListener("touchcancel",l,!0),window.removeEventListener("blur",l),t.off("cameratouchchange",g),t.rotateControl?.remove()})}export{k as cameraControls};
2
+ //# sourceMappingURL=cameraControls.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/cameraControls.js"],
4
+ "sourcesContent": ["function editable(target) {\r\n return target.closest?.('input,textarea,select,[contenteditable=\"true\"]');\r\n}\r\n\r\nfunction dragCamera(map, element, accept, sensitivity = [0.8, 0.5], orbit = false) {\r\n let drag, moved = false;\r\n const end = event => {\r\n if (!drag) return;\r\n if (event?.pointerId !== undefined && event.pointerId !== drag.id) return;\r\n const finished = drag;\r\n drag = null;\r\n if (element.hasPointerCapture?.(finished.id)) element.releasePointerCapture(finished.id);\r\n if (finished.dragging && map.getContainer()._leaflet_id) map.dragging.enable();\r\n element.style.cursor = finished.cursor;\r\n };\r\n const down = event => {\r\n if (drag || !accept(event) || editable(event.target)) return;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n moved = false;\r\n const rect = map.getContainer().getBoundingClientRect();\r\n drag = { id: event.pointerId, x: event.clientX, y: event.clientY, cursor: element.style.cursor,\r\n cx: rect.left + rect.width / 2, cy: rect.top + rect.height / 2, dragging: map.dragging?.enabled() };\r\n map.dragging?.disable();\r\n element.focus?.({ preventScroll: true });\r\n element.setPointerCapture(event.pointerId);\r\n element.style.cursor = 'grabbing';\r\n };\r\n const move = event => {\r\n if (!drag || drag.id !== event.pointerId) return;\r\n const x = event.clientX - drag.x, y = event.clientY - drag.y;\r\n if (Math.hypot(x, y) < 3 && !moved) return;\r\n map._stopPitchBearingAnimation();\r\n moved = true;\r\n event.preventDefault();\r\n let bearing = x * sensitivity[0];\r\n if (orbit) {\r\n if (Math.abs(drag.cy - drag.y) > 100) {\r\n const angle = Math.atan2(event.clientY - drag.cy, event.clientX - drag.cx) -\r\n Math.atan2(event.clientY - drag.cy, drag.x - drag.cx);\r\n bearing = Math.atan2(Math.sin(angle), Math.cos(angle)) * 180 / Math.PI;\r\n } else bearing *= event.clientY < drag.cy ? 1 : -1;\r\n }\r\n map._setPitchAndBearing(map.getPitch() - y * sensitivity[1], map.getBearing() + bearing);\r\n drag.x = event.clientX; drag.y = event.clientY;\r\n };\r\n const click = event => { if (moved) { event.preventDefault(); event.stopPropagation(); moved = false; } };\r\n const context = event => {\r\n if (drag || moved) { event.preventDefault(); event.stopPropagation(); }\r\n };\r\n element.addEventListener('pointerdown', down, true);\r\n element.addEventListener('pointermove', move);\r\n element.addEventListener('pointerup', end);\r\n element.addEventListener('pointercancel', end);\r\n element.addEventListener('lostpointercapture', end);\r\n element.addEventListener('click', click, true);\r\n element.addEventListener('contextmenu', context);\r\n window.addEventListener('blur', end);\r\n return () => {\r\n end();\r\n element.removeEventListener('pointerdown', down, true);\r\n element.removeEventListener('pointermove', move);\r\n element.removeEventListener('pointerup', end);\r\n element.removeEventListener('pointercancel', end);\r\n element.removeEventListener('lostpointercapture', end);\r\n element.removeEventListener('click', click, true);\r\n element.removeEventListener('contextmenu', context);\r\n window.removeEventListener('blur', end);\r\n };\r\n}\r\n\r\nL.Control.Rotate = L.Control.extend({\r\n options: { position: 'topleft', closeOnZeroBearing: true, visualizePitch: true },\r\n onAdd(map) {\r\n const container = L.DomUtil.create('div', 'leaflet-control-rotate leaflet-bar');\r\n const button = L.DomUtil.create('a', 'leaflet-control-rotate-toggle', container);\r\n button.href = '#';\r\n button.setAttribute('role', 'button');\r\n button.title = this.options.visualizePitch ? 'Reset bearing and pitch' : 'Reset bearing to north';\r\n button.setAttribute('aria-label', button.title);\r\n button.style.cssText = 'cursor:grab;touch-action:none';\r\n const arrow = L.DomUtil.create('span', 'leaflet-control-rotate-arrow', button);\r\n arrow.setAttribute('aria-hidden', 'true');\r\n arrow.style.cssText = 'display:block;width:100%;height:100%;pointer-events:none;background: no-repeat center / 29px 29px';\r\n arrow.style.backgroundImage = 'url(\"data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 29 29%27%3E%3Cpath fill=%27%23333%27 d=%27M10.5 14 14.5 6 18.5 14Z%27/%3E%3Cpath fill=%27%23ccc%27 d=%27M10.5 16 14.5 24 18.5 16Z%27/%3E%3C/svg%3E\")';\r\n button.onclick = event => {\r\n event.preventDefault();\r\n if (this.options.visualizePitch) map.resetNorthPitch();\r\n else map.resetNorth();\r\n if (event.detail) map.getContainer().focus({ preventScroll: true });\r\n };\r\n button.onkeydown = event => {\r\n const step = event.shiftKey ? 15 : 5;\r\n if (event.key === 'ArrowLeft') map.setBearing(map.getBearing() - step);\r\n else if (event.key === 'ArrowRight') map.setBearing(map.getBearing() + step);\r\n else if (event.key === 'ArrowUp' && this.options.visualizePitch) map.setPitch(map.getPitch() + step);\r\n else if (event.key === 'ArrowDown' && this.options.visualizePitch) map.setPitch(map.getPitch() - step);\r\n else if (event.key === 'Home' || event.key === ' ') button.click();\r\n else return;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n };\r\n this._refresh = () => {\r\n const pitch = this.options.visualizePitch ? map.getPitch() : 0;\r\n arrow.style.transform = `scale(${1 / Math.sqrt(Math.cos(pitch * Math.PI / 180))}) rotateX(${pitch}deg) rotate(${map.getBearing()}deg)`;\r\n button.setAttribute('aria-description', `Bearing ${Math.round(map.getBearing())} degrees, pitch ${Math.round(map.getPitch())} degrees. Arrow keys adjust the camera; Home resets it.`);\r\n // Do not hide a focused control, even when the caller opts into auto-hiding.\r\n container.style.display = this.options.closeOnZeroBearing && !map.getBearing() && !pitch &&\r\n !container.contains(document.activeElement) ? 'none' : '';\r\n };\r\n map.on('rotate pitch', this._refresh);\r\n this._refresh();\r\n this._endDrag = dragCamera(map, button, event => event.button === 0,\r\n [0.8, this.options.visualizePitch ? 0.5 : 0]);\r\n button.addEventListener('focusout', this._refresh);\r\n L.DomEvent.on(button, 'dblclick contextmenu', L.DomEvent.stop);\r\n L.DomEvent.disableClickPropagation(container);\r\n L.DomEvent.disableScrollPropagation(container);\r\n return container;\r\n },\r\n onRemove(map) {\r\n map.off('rotate pitch', this._refresh);\r\n this._endDrag();\r\n },\r\n});\r\nif (L.control) L.control.rotate = options => new L.Control.Rotate(options);\r\n\r\nconst ShiftRotate = L.Handler.extend({\r\n addHooks() {\r\n this._wheel = event => {\r\n if (!event.shiftKey || editable(event.target) || event.target.closest('.leaflet-control')) return;\r\n event.preventDefault(); event.stopImmediatePropagation();\r\n this._map.setBearing(this._map.getBearing() + Math.sign(event.deltaY) * 5);\r\n };\r\n this._map.getContainer().addEventListener('wheel', this._wheel, { passive: false, capture: true });\r\n },\r\n removeHooks() { this._map.getContainer().removeEventListener('wheel', this._wheel, true); },\r\n});\r\nconst PitchDrag = L.Handler.extend({\r\n addHooks() {\r\n this._end = dragCamera(this._map, this._map.getContainer(), event =>\r\n !event.target.closest('.leaflet-control,.leaflet-marker-icon,.leaflet-popup') &&\r\n (event.button === 2 || event.button === 0 && event.ctrlKey), [0.8, 0.5], true);\r\n },\r\n removeHooks() {\r\n this._end();\r\n },\r\n});\r\nconst Compass = L.Handler.extend({\r\n addHooks() {\r\n const generation = this._generation = (this._generation || 0) + 1;\r\n this._orientation = event => {\r\n const bearing = Number.isFinite(event.webkitCompassHeading) ? -event.webkitCompassHeading : event.alpha;\r\n const orientation = event.absolute ? 0 : (screen.orientation?.angle ?? window.orientation ?? 0);\r\n if (Number.isFinite(bearing)) this._map.setBearing(bearing - orientation);\r\n };\r\n const permission = window.DeviceOrientationEvent?.requestPermission;\r\n new Promise(resolve => resolve(permission ? permission.call(window.DeviceOrientationEvent) : 'granted')).then(result => {\r\n if (!this.enabled() || this._generation !== generation) return;\r\n if (!window.DeviceOrientationEvent || result !== 'granted') throw new Error('Device compass permission unavailable or denied');\r\n window.addEventListener('deviceorientation', this._orientation);\r\n window.addEventListener('deviceorientationabsolute', this._orientation);\r\n }).catch(error => {\r\n this.disable();\r\n this._map.fire('error', { error });\r\n });\r\n },\r\n removeHooks() {\r\n this._generation++;\r\n window.removeEventListener('deviceorientation', this._orientation);\r\n window.removeEventListener('deviceorientationabsolute', this._orientation);\r\n },\r\n});\r\n\r\nconst ContainerResize = L.Handler.extend({\r\n addHooks() {\r\n this._observer = new ResizeObserver(() => this._map.invalidateSize());\r\n this._observer.observe(this._map.getContainer());\r\n },\r\n removeHooks() { this._observer.disconnect(); },\r\n});\r\n\r\nexport function cameraControls(map) {\r\n map.addHandler('trackContainerMutation', ContainerResize);\r\n if (!map.options.rotate) return;\r\n map.addHandler('shiftKeyRotate', ShiftRotate);\r\n map.addHandler('pitchDrag', PitchDrag);\r\n map.addHandler('compassBearing', Compass);\r\n // Two optional touch modes share one pinch/pan recognizer with Leaflet's zoom setting.\r\n const TouchMode = L.Handler.extend({\r\n addHooks() { map.fire('cameratouchchange'); },\r\n removeHooks() { map.fire('cameratouchchange'); },\r\n });\r\n map.addHandler('touchRotate', TouchMode);\r\n map.addHandler('touchPitch', TouchMode);\r\n const container = map.getContainer();\r\n let touch, nativeZoom;\r\n const start = event => {\r\n if (event.touches.length !== 2 || event.target.closest('.leaflet-control')) return;\r\n if (!map.touchRotate.enabled() && !map.touchPitch.enabled()) return;\r\n const [a, b] = event.touches;\r\n if (Math.hypot(b.clientX - a.clientX, b.clientY - a.clientY) < 1) return;\r\n map._stopPitchBearingAnimation();\r\n const middle = new L.Point((a.clientX + b.clientX) / 2, (a.clientY + b.clientY) / 2)\r\n .subtract(new L.Point(container.getBoundingClientRect().left, container.getBoundingClientRect().top));\r\n touch = { angle: Math.atan2(b.clientY - a.clientY, b.clientX - a.clientX),\r\n distance: Math.hypot(b.clientX - a.clientX, b.clientY - a.clientY), middle,\r\n anchor: map.containerPointToLatLng(middle), zoom: map.getZoom(),\r\n bearing: map.getBearing(), pitch: map.getPitch(), zooming: map.touchZoom?.enabled(),\r\n dragging: map.dragging?.enabled() };\r\n map.dragging?.disable();\r\n event.preventDefault(); event.stopImmediatePropagation();\r\n };\r\n const move = event => {\r\n if (!touch || event.touches.length !== 2) return;\r\n const [a, b] = event.touches;\r\n const angle = Math.atan2(b.clientY - a.clientY, b.clientX - a.clientX);\r\n const middle = new L.Point((a.clientX + b.clientX) / 2, (a.clientY + b.clientY) / 2)\r\n .subtract(new L.Point(container.getBoundingClientRect().left, container.getBoundingClientRect().top));\r\n const delta = Math.atan2(Math.sin(angle - touch.angle), Math.cos(angle - touch.angle)) * 180 / Math.PI;\r\n map._setPitchAndBearing(map.touchPitch.enabled() ? touch.pitch - (middle.y - touch.middle.y) * 0.25 : touch.pitch,\r\n map.touchRotate.enabled() ? touch.bearing + delta : touch.bearing);\r\n const distance = Math.hypot(b.clientX - a.clientX, b.clientY - a.clientY);\r\n if (distance < 1) return;\r\n const zoom = touch.zooming ? Math.max(map.getMinZoom(), Math.min(map.getMaxZoom(),\r\n touch.zoom + Math.log2(distance / touch.distance))) : touch.zoom;\r\n map.setView(map.getCenter(), zoom, { animate: false });\r\n if (map.options.touchZoom !== 'center') {\r\n const projected = map.project(touch.anchor).subtract(map.project(map.containerPointToLatLng(middle)));\r\n map.setView(map.unproject(map.project(map.getCenter()).add(projected)), map.getZoom(), { animate: false });\r\n }\r\n event.preventDefault(); event.stopImmediatePropagation();\r\n };\r\n const end = event => {\r\n if (!touch) return;\r\n if (event?.touches?.length >= 2) return;\r\n if (touch.dragging && container._leaflet_id) map.dragging.enable();\r\n const snap = touch.snap;\r\n map.options.zoomSnap = snap;\r\n if (touch.zooming && snap && container._leaflet_id) {\r\n map.setZoom(Math.round(map.getZoom() / snap) * snap, { animate: false });\r\n }\r\n touch = null;\r\n };\r\n const change = () => {\r\n const active = map.touchRotate.enabled() || map.touchPitch.enabled();\r\n if (active && nativeZoom === undefined) {\r\n nativeZoom = map.touchZoom?.enabled();\r\n map.touchZoom?.disable();\r\n } else if (!active && nativeZoom !== undefined) {\r\n end();\r\n if (nativeZoom && container._leaflet_id) map.touchZoom.enable();\r\n nativeZoom = undefined;\r\n }\r\n };\r\n // Preserve the zoom-enabled setting before handing pinch recognition over.\r\n change();\r\n const startTouch = event => {\r\n if (touch) return;\r\n start(event);\r\n if (touch) {\r\n if (nativeZoom !== undefined) touch.zooming = nativeZoom;\r\n touch.snap = map.options.zoomSnap;\r\n map.options.zoomSnap = 0;\r\n }\r\n };\r\n container.addEventListener('touchstart', startTouch, { capture: true, passive: false });\r\n container.addEventListener('touchmove', move, { capture: true, passive: false });\r\n container.addEventListener('touchend', end, true);\r\n container.addEventListener('touchcancel', end, true);\r\n window.addEventListener('blur', end);\r\n map.on('cameratouchchange', change);\r\n if (map.options.rotateControl) {\r\n map.rotateControl = new L.Control.Rotate(typeof map.options.rotateControl === 'object' ? map.options.rotateControl : {});\r\n map.rotateControl.addTo(map);\r\n }\r\n map.once('unload', () => {\r\n end();\r\n container.removeEventListener('touchstart', startTouch, true);\r\n container.removeEventListener('touchmove', move, true);\r\n container.removeEventListener('touchend', end, true);\r\n container.removeEventListener('touchcancel', end, true);\r\n window.removeEventListener('blur', end);\r\n map.off('cameratouchchange', change);\r\n map.rotateControl?.remove();\r\n });\r\n}\r\n"],
5
+ "mappings": "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",
6
+ "names": ["editable", "target", "dragCamera", "map", "element", "accept", "sensitivity", "orbit", "drag", "moved", "end", "event", "finished", "down", "rect", "move", "x", "y", "bearing", "angle", "click", "context", "container", "button", "arrow", "step", "pitch", "options", "ShiftRotate", "PitchDrag", "Compass", "generation", "orientation", "permission", "resolve", "result", "error", "ContainerResize", "cameraControls", "TouchMode", "touch", "nativeZoom", "start", "a", "b", "middle", "delta", "distance", "zoom", "projected", "snap", "change", "active", "startTouch"]
7
+ }
@@ -0,0 +1,2 @@
1
+ const h=(t,a,c,e)=>{const n=(t+a*12)%12;return c-e*Math.max(-1,Math.min(n-3,9-n,1))};export{h as channel};
2
+ //# sourceMappingURL=channel.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/channel.js"],
4
+ "sourcesContent": ["export const channel = (n, h, l, a) => {\n const k = (n + h * 12) % 12;\n return l - a * Math.max(-1, Math.min(k - 3, 9 - k, 1));\n};\n"],
5
+ "mappings": "AAAO,MAAMA,EAAU,CAACC,EAAGC,EAAGC,EAAGC,IAAM,CACrC,MAAMC,GAAKJ,EAAIC,EAAI,IAAM,GACzB,OAAOC,EAAIC,EAAI,KAAK,IAAI,GAAI,KAAK,IAAIC,EAAI,EAAG,EAAIA,EAAG,CAAC,CAAC,CACvD",
6
+ "names": ["channel", "n", "h", "l", "a", "k"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{CELL as M}from"./CELL.js";import{colliders as E}from"./colliders.js";function H(h){let c=E.get(h.geometry);if(c)return c;const o=h.worldMatrix,{position:{data:s},index:e,normal:y,uv:x}=h.geometry.attributes,q=e?e.count:s.length/3,d=[],g=[],m=new Map,t=[];for(let i=0;i<q;i+=3){const z=e?e.data[i]:i;if(h.program.nightLight&&x&&x.data[z*2]<=2)continue;for(let r=0;r<3;r++){const a=(e?e.data[i+r]:i+r)*3,n=s[a],p=s[a+1],u=s[a+2];t[r*3]=o[0]*n+o[4]*p+o[8]*u+o[12],t[r*3+1]=o[1]*n+o[5]*p+o[9]*u+o[13],t[r*3+2]=o[2]*n+o[6]*p+o[10]*u+o[14]}const L=t[3]-t[0],b=t[4]-t[1],j=t[5]-t[2],k=t[6]-t[0],v=t[7]-t[1],w=t[8]-t[2];let f=b*w-j*v,l=L*v-b*k;const A=j*k-L*w,F=Math.hypot(f,A,l);if(!F||Math.abs(A)>.9*F)continue;if(y){const r=z*3,a=y.data;(o[0]*a[r]+o[4]*a[r+1]+o[8]*a[r+2])*f+(o[2]*a[r]+o[6]*a[r+1]+o[10]*a[r+2])*l<0&&(f=-f,l=-l)}const C=Math.hypot(f,l),B=g.length/2;d.push(...t),g.push(f/C,l/C);for(let r=Math.floor(Math.min(t[0],t[3],t[6])/M);r<=Math.floor(Math.max(t[0],t[3],t[6])/M);r++)for(let a=Math.floor(Math.min(t[2],t[5],t[8])/M);a<=Math.floor(Math.max(t[2],t[5],t[8])/M);a++){const n=r+","+a;m.has(n)||m.set(n,[]),m.get(n).push(B)}}return c={tri:Float32Array.from(d),nrm:Float32Array.from(g),cells:m,origin:[o[12],o[13],o[14]]},E.set(h.geometry,c),c}export{H as collider};
2
+ //# sourceMappingURL=collider.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/collider.js"],
4
+ "sourcesContent": ["import { CELL } from './CELL.js';\nimport { colliders } from './colliders.js';\n\n\nexport function collider(mesh) {\n let c = colliders.get(mesh.geometry);\n if (c) return c;\n const m = mesh.worldMatrix, { position: { data: p }, index, normal, uv } = mesh.geometry.attributes;\n\n const count = index ? index.count : p.length / 3, tri = [], nrm = [], cells = new Map(), v = [];\n\n for (let i = 0; i < count; i += 3) {\n const first = index ? index.data[i] : i;\n // Streetlight halos (uv.x <= 2, see scene/picking.js) are light, not matter.\n if (mesh.program.nightLight && uv && uv.data[first * 2] <= 2) {\n continue;\n }\n for (let k = 0; k < 3; k++) {\n const j = (index ? index.data[i + k] : i + k) * 3, x = p[j], y = p[j + 1], z = p[j + 2];\n v[k * 3] = m[0] * x + m[4] * y + m[8] * z + m[12];\n v[k * 3 + 1] = m[1] * x + m[5] * y + m[9] * z + m[13];\n v[k * 3 + 2] = m[2] * x + m[6] * y + m[10] * z + m[14];\n }\n 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];\n\n let nx = ey * fz - ez * fy, nz = ex * fy - ey * fx;\n\n const ny = ez * fx - ex * fz, length = Math.hypot(nx, ny, nz);\n\n if (!length || Math.abs(ny) > 0.9 * length) {\n continue;\n }\n\n if (normal) {\n // The stored normal tells the outside, whatever the winding.\n const j = first * 3, a = normal.data;\n if ((m[0] * a[j] + m[4] * a[j + 1] + m[8] * a[j + 2]) * nx + (m[2] * a[j] + m[6] * a[j + 1] + m[10] * a[j + 2]) * nz < 0) { nx = -nx; nz = -nz; }\n }\n\n const h = Math.hypot(nx, nz), t = nrm.length / 2;\n\n tri.push(...v);\n nrm.push(nx / h, nz / h);\n\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++)\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++) {\n const key = ix + ',' + iz;\n if (!cells.has(key)) {\n cells.set(key, []);\n }\n cells.get(key).push(t);\n }\n }\n c = {\n tri: Float32Array.from(tri),\n nrm: Float32Array.from(nrm),\n cells,\n origin: [m[12], m[13], m[14]]\n };\n colliders.set(mesh.geometry, c);\n return c;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["CELL", "colliders", "collider", "mesh", "m", "p", "index", "normal", "uv", "count", "tri", "nrm", "cells", "v", "first", "k", "j", "x", "y", "z", "ex", "ey", "ez", "fx", "fy", "fz", "nx", "nz", "ny", "length", "h", "t", "ix", "iz", "key"]
7
+ }
@@ -0,0 +1,2 @@
1
+ const e=new WeakMap;export{e as colliders};
2
+ //# sourceMappingURL=colliders.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/colliders.js"],
4
+ "sourcesContent": ["\nexport const colliders = new WeakMap();\n"],
5
+ "mappings": "AACO,MAAMA,EAAY,IAAI",
6
+ "names": ["colliders"]
7
+ }
@@ -0,0 +1,2 @@
1
+ function s(e){const i=[1/0,1/0,1/0],a=[-1/0,-1/0,-1/0],n=e.attributes.position.data;for(let t=0;t<n.length;t++)i[t%3]=Math.min(i[t%3],n[t]),a[t%3]=Math.max(a[t%3],n[t]);const o=i.map((t,h)=>(t+a[h])/2);let f=0;for(let t=0;t<n.length;t+=3)f=Math.max(f,Math.hypot(n[t]-o[0],n[t+1]-o[1],n[t+2]-o[2]));e.bounds={min:i,max:a,center:o,radius:f}}export{s as computeBounds};
2
+ //# sourceMappingURL=computeBounds.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/computeBounds.js"],
4
+ "sourcesContent": ["/** Cache local AABB and center for ray picking and transparent mesh sorting. */\n\nexport function computeBounds(geometry) {\n const min = [Infinity, Infinity, Infinity], max = [-Infinity, -Infinity, -Infinity], data = geometry.attributes.position.data;\n for (let i = 0; i < data.length; i++) {\n min[i % 3] = Math.min(min[i % 3], data[i]);\n max[i % 3] = Math.max(max[i % 3], data[i]);\n }\n const center = min.map((v, i) => (v + max[i]) / 2);\n let radius = 0;\n for (let i = 0; i < data.length; i += 3) {\n radius = Math.max(radius, Math.hypot(\n data[i] - center[0], data[i + 1] - center[1], data[i + 2] - center[2]\n ));\n }\n geometry.bounds = { min, max, center, radius };\n}\n"],
5
+ "mappings": "AAEO,SAASA,EAAcC,EAAU,CACtC,MAAMC,EAAM,CAAC,IAAU,IAAU,GAAQ,EAAGC,EAAM,CAAC,KAAW,KAAW,IAAS,EAAGC,EAAOH,EAAS,WAAW,SAAS,KACzH,QAASI,EAAI,EAAGA,EAAID,EAAK,OAAQC,IAC/BH,EAAIG,EAAI,CAAC,EAAI,KAAK,IAAIH,EAAIG,EAAI,CAAC,EAAGD,EAAKC,CAAC,CAAC,EACzCF,EAAIE,EAAI,CAAC,EAAI,KAAK,IAAIF,EAAIE,EAAI,CAAC,EAAGD,EAAKC,CAAC,CAAC,EAE3C,MAAMC,EAASJ,EAAI,IAAI,CAACK,EAAGF,KAAOE,EAAIJ,EAAIE,CAAC,GAAK,CAAC,EACjD,IAAIG,EAAS,EACb,QAASH,EAAI,EAAGA,EAAID,EAAK,OAAQC,GAAK,EACpCG,EAAS,KAAK,IAAIA,EAAQ,KAAK,MAC7BJ,EAAKC,CAAC,EAAIC,EAAO,CAAC,EAAGF,EAAKC,EAAI,CAAC,EAAIC,EAAO,CAAC,EAAGF,EAAKC,EAAI,CAAC,EAAIC,EAAO,CAAC,CACtE,CAAC,EAEHL,EAAS,OAAS,CAAE,IAAAC,EAAK,IAAAC,EAAK,OAAAG,EAAQ,OAAAE,CAAO,CAC/C",
6
+ "names": ["computeBounds", "geometry", "min", "max", "data", "i", "center", "v", "radius"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{computeBounds as x}from"./computeBounds.js";import{getElevation as O}from"./getElevation.js";import{update as T}from"./update.js";import{updateWorldMatrix as y}from"./updateWorldMatrix.js";import{vertexNormals as E}from"./vertexNormals.js";const F=8;function A(i,n){if(!i.model)return;const c=[],h=e=>{e.geometry?.attributes.position&&c.push(e);for(const r of e.children)h(r)};if(h(i.model),!n?._terrainReady||!i.options.terrainConform){for(const e of c){const r=e.geometry._terrainBasePositions;if(!r)continue;const t=e.geometry,a=t.attributes.position;a.data.set(r),e.device.queue.writeBuffer(a.buffer,0,r);const o=t._terrainBaseNormals;o&&(t.attributes.normal.data.set(o),e.device.queue.writeBuffer(t.attributes.normal.buffer,0,o)),x(t)}return}y(i.root);const B=i._map,f=B.options.crs,b=f.project(i._shared._sceneOrigin),g=Math.cos(i._shared._sceneOrigin.lat*Math.PI/180),M=f.scale(n._terrainZoom);for(const e of c){const r=e.geometry,t=r.attributes.position;r._terrainBasePositions||=t.data.slice();const a=r.attributes.normal;r._terrainBaseNormals||=a.data.slice(),t.data.set(r._terrainBasePositions);const o=e.worldMatrix,m=new DOMMatrix(o).inverse().toFloat64Array();for(let s=0;s<t.data.length;s+=3){const d=t.data[s],u=t.data[s+1],p=t.data[s+2],w=o[1]*d+o[5]*u+o[9]*p+o[13],_=Math.max(0,Math.min(1,1-(w-i.root.position[1])/F));if(!_)continue;const P=o[0]*d+o[4]*u+o[8]*p+o[12],q=o[2]*d+o[6]*u+o[10]*p+o[14],N=f.transformation.transform(new L.Point(b.x+P/g,b.y-q/g),M),v=O(n,N);if(!Number.isFinite(v))continue;const l=(v-w)*_;t.data[s]+=m[4]*l,t.data[s+1]+=m[5]*l,t.data[s+2]+=m[6]*l}e.device.queue.writeBuffer(t.buffer,0,t.data),a.data.set(E(t.data,r.attributes.index?.data)),e.device.queue.writeBuffer(a.buffer,0,a.data),x(r)}T(i)}export{A as conformModelToTerrain};
2
+ //# sourceMappingURL=conformModelToTerrain.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/conformModelToTerrain.js"],
4
+ "sourcesContent": ["import { computeBounds } from './computeBounds.js';\r\nimport { getElevation } from './getElevation.js';\r\nimport { update } from './update.js';\r\nimport { updateWorldMatrix } from './updateWorldMatrix.js';\r\nimport { vertexNormals } from './vertexNormals.js';\r\n\r\nconst HEIGHT = 8;\r\n\r\nexport function conformModelToTerrain(layer, terrain) {\r\n if (!layer.model) return;\r\n const meshes = [];\r\n const visit = node => {\r\n if (node.geometry?.attributes.position) meshes.push(node);\r\n for (const child of node.children) visit(child);\r\n };\r\n visit(layer.model);\r\n if (!terrain?._terrainReady || !layer.options.terrainConform) {\r\n for (const mesh of meshes) {\r\n const positions = mesh.geometry._terrainBasePositions;\r\n if (!positions) continue;\r\n const geometry = mesh.geometry, position = geometry.attributes.position;\r\n position.data.set(positions);\r\n mesh.device.queue.writeBuffer(position.buffer, 0, positions);\r\n const normals = geometry._terrainBaseNormals;\r\n if (normals) {\r\n geometry.attributes.normal.data.set(normals);\r\n mesh.device.queue.writeBuffer(geometry.attributes.normal.buffer, 0, normals);\r\n }\r\n computeBounds(geometry);\r\n }\r\n return;\r\n }\r\n\r\n updateWorldMatrix(layer.root);\r\n const map = layer._map, crs = map.options.crs;\r\n const origin = crs.project(layer._shared._sceneOrigin);\r\n const metres = Math.cos(layer._shared._sceneOrigin.lat * Math.PI / 180);\r\n const pixelScale = crs.scale(terrain._terrainZoom);\r\n\r\n for (const mesh of meshes) {\r\n const geometry = mesh.geometry, attribute = geometry.attributes.position;\r\n geometry._terrainBasePositions ||= attribute.data.slice();\r\n const normal = geometry.attributes.normal;\r\n geometry._terrainBaseNormals ||= normal.data.slice();\r\n attribute.data.set(geometry._terrainBasePositions);\r\n const world = mesh.worldMatrix, inverse = new DOMMatrix(world).inverse().toFloat64Array();\r\n for (let i = 0; i < attribute.data.length; i += 3) {\r\n const x = attribute.data[i], y = attribute.data[i + 1], z = attribute.data[i + 2];\r\n const worldY = world[1] * x + world[5] * y + world[9] * z + world[13];\r\n const weight = Math.max(0, Math.min(1, 1 - (worldY - layer.root.position[1]) / HEIGHT));\r\n if (!weight) continue;\r\n const worldX = world[0] * x + world[4] * y + world[8] * z + world[12];\r\n const worldZ = world[2] * x + world[6] * y + world[10] * z + world[14];\r\n const point = crs.transformation.transform(new L.Point(\r\n origin.x + worldX / metres, origin.y - worldZ / metres), pixelScale);\r\n const elevation = getElevation(terrain, point);\r\n if (!Number.isFinite(elevation)) continue;\r\n const offset = (elevation - worldY) * weight;\r\n attribute.data[i] += inverse[4] * offset;\r\n attribute.data[i + 1] += inverse[5] * offset;\r\n attribute.data[i + 2] += inverse[6] * offset;\r\n }\r\n mesh.device.queue.writeBuffer(attribute.buffer, 0, attribute.data);\r\n normal.data.set(vertexNormals(attribute.data, geometry.attributes.index?.data));\r\n mesh.device.queue.writeBuffer(normal.buffer, 0, normal.data);\r\n computeBounds(geometry);\r\n }\r\n update(layer);\r\n}\r\n"],
5
+ "mappings": "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",
6
+ "names": ["computeBounds", "getElevation", "update", "updateWorldMatrix", "vertexNormals", "HEIGHT", "conformModelToTerrain", "layer", "terrain", "meshes", "visit", "node", "child", "mesh", "positions", "geometry", "position", "normals", "map", "crs", "origin", "metres", "pixelScale", "attribute", "normal", "world", "inverse", "i", "x", "y", "z", "worldY", "weight", "worldX", "worldZ", "point", "elevation", "offset"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{emptyNode as g}from"./emptyNode.js";import{createProgram as p}from"./createProgram.js";import{setParent as y}from"./setParent.js";import{update as h}from"./update.js";function B(e,f,i={},m=0,c){const{device:r}=e.renderer,o={};for(const[s,d]of Object.entries(f)){const t=new Float32Array(d),n=s==="uv"?2:3,u=r.createBuffer({size:Math.max(4,t.byteLength),usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST|m});r.queue.writeBuffer(u,0,t),o[s]={size:n,data:t,count:t.length/n,buffer:u}}const a={...g(),device:r,geometry:{device:r,attributes:o,drawRange:{start:0,count:o.position.count}},program:c||p(e,{vertexColors:!0,doubleSided:!0,...i}),id:L.Layer._nextId++,renderOrder:0,extras:{}};return y(a,e.root),h(e),a}export{B as createMesh};
2
+ //# sourceMappingURL=createMesh.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/createMesh.js"],
4
+ "sourcesContent": ["import { emptyNode } from './emptyNode.js';\nimport { createProgram } from './createProgram.js';\nimport { setParent } from './setParent.js';\nimport { update } from './update.js';\n\n/**\n * Add a non-indexed, vertex-coloured mesh from flat vec3 arrays `{ position, normal, color }` in layer-local metres.\n * `usage` adds GPUBufferUsage flags to the vertex buffers (e.g. STORAGE for compute passes).\n * A supplied `program` shares compiled shaders and pipelines across compatible meshes.\n */\n\nexport function createMesh(backend, data, material = {}, usage = 0, program) {\n const { device } = backend.renderer, attributes = {};\n for (const [name, values] of Object.entries(data)) {\n const array = new Float32Array(values);\n const size = name === 'uv' ? 2 : 3;\n const buffer = device.createBuffer({ size: Math.max(4, array.byteLength), usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST | usage });\n device.queue.writeBuffer(buffer, 0, array);\n attributes[name] = { size, data: array, count: array.length / size, buffer };\n }\n const mesh = {\n ...emptyNode(),\n device,\n geometry: { device, attributes, drawRange: { start: 0, count: attributes.position.count } },\n program: program || createProgram(backend, { vertexColors: true, doubleSided: true, ...material }),\n id: L.Layer._nextId++, renderOrder: 0, extras: {},\n };\n setParent(mesh, backend.root);\n update(backend);\n return mesh;\n}\n"],
5
+ "mappings": "AAAA,OAAS,aAAAA,MAAiB,iBAC1B,OAAS,iBAAAC,MAAqB,qBAC9B,OAAS,aAAAC,MAAiB,iBAC1B,OAAS,UAAAC,MAAc,cAQhB,SAASC,EAAWC,EAASC,EAAMC,EAAW,CAAC,EAAGC,EAAQ,EAAGC,EAAS,CAC3E,KAAM,CAAE,OAAAC,CAAO,EAAIL,EAAQ,SAAUM,EAAa,CAAC,EACnD,SAAW,CAACC,EAAMC,CAAM,IAAK,OAAO,QAAQP,CAAI,EAAG,CACjD,MAAMQ,EAAQ,IAAI,aAAaD,CAAM,EAC/BE,EAAOH,IAAS,KAAO,EAAI,EAC3BI,EAASN,EAAO,aAAa,CAAE,KAAM,KAAK,IAAI,EAAGI,EAAM,UAAU,EAAG,MAAO,eAAe,OAAS,eAAe,SAAWN,CAAM,CAAC,EAC1IE,EAAO,MAAM,YAAYM,EAAQ,EAAGF,CAAK,EACzCH,EAAWC,CAAI,EAAI,CAAE,KAAAG,EAAM,KAAMD,EAAO,MAAOA,EAAM,OAASC,EAAM,OAAAC,CAAO,CAC7E,CACA,MAAMC,EAAO,CACX,GAAGjB,EAAU,EACb,OAAAU,EACA,SAAU,CAAE,OAAAA,EAAQ,WAAAC,EAAY,UAAW,CAAE,MAAO,EAAG,MAAOA,EAAW,SAAS,KAAM,CAAE,EAC1F,QAASF,GAAWR,EAAcI,EAAS,CAAE,aAAc,GAAM,YAAa,GAAM,GAAGE,CAAS,CAAC,EACjG,GAAI,EAAE,MAAM,UAAW,YAAa,EAAG,OAAQ,CAAC,CAClD,EACA,OAAAL,EAAUe,EAAMZ,EAAQ,IAAI,EAC5BF,EAAOE,CAAO,EACPY,CACT",
6
+ "names": ["emptyNode", "createProgram", "setParent", "update", "createMesh", "backend", "data", "material", "usage", "program", "device", "attributes", "name", "values", "array", "size", "buffer", "mesh"]
7
+ }
@@ -0,0 +1,3 @@
1
+ import{materialShaders as p}from"./materialShaders.js";import{elevationWGSL as h}from"./elevationWGSL.js";function v(r,e={}){const t=p(e,!!r.options.nightSparkle,e.terrain?h:""),s=r.renderer.device.createShaderModule({code:t.vertex}),u=r.renderer.device.createShaderModule({code:t.fragment});Promise.all([s.getCompilationInfo(),u.getCompilationInfo()]).then(o=>{const l=o.flatMap(i=>i.messages).filter(i=>i.type==="error");l.length&&r.fire("error",{error:new Error(`Unable to compile Layer3D WGSL: ${l.map(i=>i.message).join(`
2
+ `)}`)})}).catch(o=>r.fire("error",{error:o}));const f=[{arrayStride:12,attributes:[{shaderLocation:0,offset:0,format:"float32x3"}]},{arrayStride:12,attributes:[{shaderLocation:1,offset:0,format:"float32x3"}]},e.vertexColors?{arrayStride:12,attributes:[{shaderLocation:2,offset:0,format:"float32x3"}]}:null,t.textured?{arrayStride:8,attributes:[{shaderLocation:3,offset:0,format:"float32x2"}]}:null],n=[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform",hasDynamicOffset:!0}},{binding:1,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}];t.hasTerrain&&n.push({binding:2,visibility:GPUShaderStage.VERTEX,texture:{sampleType:"unfilterable-float",viewDimension:"2d"}});for(const o of t.bindings)n.push({binding:o.texture,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float",viewDimension:"2d"}}),n.push({binding:o.sampler,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}});const a=r.renderer.device.createBindGroupLayout({entries:n}),d=r.renderer.device.createPipelineLayout({bindGroupLayouts:[a,r.renderer.sunlight.layout]});return{device:r.renderer.device,vertex:s,fragment:u,bindings:t.bindings,vertexBuffers:f,bindGroupLayout:a,pipelineLayout:d,pipelineCache:new Map,cullMode:e.doubleSided?"none":"back",transparent:e.alphaMode==="BLEND",depthWrite:e.depthWrite??e.alphaMode!=="BLEND",depthTest:e.depthTest!==!1,terrain:e.terrain,nightLight:!!e.nightLight,nightSparkle:!!r.options.nightSparkle,uniforms:{baseColor:{value:e.color||[1,1,1]},metallic:{value:e.metallic??0},roughness:{value:e.roughness??.85},opacity:{value:e.opacity??1},alphaCutoff:{value:e.alphaCutoff??.5},occlusionStrength:{value:e.occlusionStrength??1},emissive:{value:e.emissive||[0,0,0]},...e.baseTexture?{baseTexture:{value:e.baseTexture}}:{},...e.metalTexture?{metalTexture:{value:e.metalTexture}}:{},...e.emissiveTexture?{emissiveTexture:{value:e.emissiveTexture}}:{},...e.occlusionTexture?{occlusionTexture:{value:e.occlusionTexture}}:{},...e.roofTexture?{roofTexture:{value:null}}:{}},_layerMaterial:e}}export{v as createProgram};
3
+ //# sourceMappingURL=createProgram.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/createProgram.js"],
4
+ "sourcesContent": ["import { materialShaders } from './materialShaders.js';\nimport { elevationWGSL } from './elevationWGSL.js';\n\n\nexport function createProgram(backend, material = {}) {\n const shaders = materialShaders(\n material,\n !!backend.options.nightSparkle,\n material.terrain ? elevationWGSL : ''\n );\n const vertex = backend.renderer.device.createShaderModule({ code: shaders.vertex });\n const fragment = backend.renderer.device.createShaderModule({ code: shaders.fragment });\n Promise.all([\n vertex.getCompilationInfo(),\n fragment.getCompilationInfo()\n ]).then(infos => {\n const errors = infos.flatMap(info => info.messages).filter(message => message.type === 'error');\n if (errors.length) {\n backend.fire('error', {\n error: new Error(`Unable to compile Layer3D WGSL: ${errors.map(error => error.message).join('\\n')}`),\n });\n }\n }).catch(error => backend.fire('error', { error }));\n const vertexBuffers = [\n { arrayStride: 12, attributes: [{ shaderLocation: 0, offset: 0, format: 'float32x3' }] },\n { arrayStride: 12, attributes: [{ shaderLocation: 1, offset: 0, format: 'float32x3' }] },\n material.vertexColors ? { arrayStride: 12, attributes: [{ shaderLocation: 2, offset: 0, format: 'float32x3' }] } : null,\n shaders.textured ? { arrayStride: 8, attributes: [{ shaderLocation: 3, offset: 0, format: 'float32x2' }] } : null,\n ];\n const bindGroupEntries = [{\n binding: 0,\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n buffer: { type: 'uniform', hasDynamicOffset: true },\n }, {\n binding: 1,\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n buffer: { type: 'uniform' },\n }];\n if (shaders.hasTerrain) {\n bindGroupEntries.push({\n binding: 2,\n visibility: GPUShaderStage.VERTEX,\n texture: { sampleType: 'unfilterable-float', viewDimension: '2d' },\n });\n }\n for (const texture of shaders.bindings) {\n bindGroupEntries.push({\n binding: texture.texture,\n visibility: GPUShaderStage.FRAGMENT,\n texture: { sampleType: 'float', viewDimension: '2d' },\n });\n bindGroupEntries.push({\n binding: texture.sampler,\n visibility: GPUShaderStage.FRAGMENT,\n sampler: { type: 'filtering' },\n });\n }\n const bindGroupLayout = backend.renderer.device.createBindGroupLayout({ entries: bindGroupEntries });\n const pipelineLayout = backend.renderer.device.createPipelineLayout({ bindGroupLayouts: [bindGroupLayout, backend.renderer.sunlight.layout] });\n return {\n device: backend.renderer.device,\n vertex,\n fragment,\n bindings: shaders.bindings,\n vertexBuffers,\n bindGroupLayout,\n pipelineLayout,\n pipelineCache: new Map(),\n cullMode: material.doubleSided ? 'none' : 'back',\n transparent: material.alphaMode === 'BLEND',\n depthWrite: material.depthWrite ?? material.alphaMode !== 'BLEND',\n depthTest: material.depthTest !== false,\n terrain: material.terrain,\n nightLight: Boolean(material.nightLight),\n nightSparkle: !!backend.options.nightSparkle,\n uniforms: {\n baseColor: { value: material.color || [1, 1, 1] },\n metallic: { value: material.metallic ?? 0 },\n roughness: { value: material.roughness ?? 0.85 },\n opacity: { value: material.opacity ?? 1 },\n alphaCutoff: { value: material.alphaCutoff ?? 0.5 },\n occlusionStrength: { value: material.occlusionStrength ?? 1 },\n emissive: { value: material.emissive || [0, 0, 0] },\n ...(material.baseTexture ? { baseTexture: { value: material.baseTexture } } : {}),\n ...(material.metalTexture ? { metalTexture: { value: material.metalTexture } } : {}),\n ...(material.emissiveTexture ? { emissiveTexture: { value: material.emissiveTexture } } : {}),\n ...(material.occlusionTexture ? { occlusionTexture: { value: material.occlusionTexture } } : {}),\n ...(material.roofTexture ? { roofTexture: { value: null } } : {}),\n },\n _layerMaterial: material,\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["materialShaders", "elevationWGSL", "createProgram", "backend", "material", "shaders", "vertex", "fragment", "infos", "errors", "info", "message", "error", "vertexBuffers", "bindGroupEntries", "texture", "bindGroupLayout", "pipelineLayout"]
7
+ }
@@ -0,0 +1,2 @@
1
+ function d(f){const i=new Uint8Array(f);let l=0;const n=()=>{let r=0;for(let t=1;t<=2**49;t*=128){if(l>=i.length)throw new Error("Truncated PMTiles directory");const o=i[l++];if(r+=(o&127)*t,!Number.isSafeInteger(r))throw new Error("Invalid PMTiles directory integer");if(o<128)return r}throw new Error("Invalid PMTiles directory integer")},c=n();if(c>(i.length-l)/4)throw new Error("Invalid PMTiles directory count");const e=[];let s=0;for(let r=0;r<c;r++){if(s+=n(),!Number.isSafeInteger(s)||r&&s<=e[r-1].tileId)throw new Error("Invalid PMTiles directory tile IDs");e.push({tileId:s})}for(const r of e)r.runLength=n();for(const r of e)if(r.length=n(),!r.length)throw new Error("Invalid PMTiles directory length");if(e.forEach((r,t)=>{const o=n();if(!o&&!t)throw new Error("Invalid PMTiles directory offset");r.offset=o?o-1:e[t-1].offset+e[t-1].length}),l!==i.length)throw new Error("Trailing PMTiles directory data");return e}export{d as decodeDirectory};
2
+ //# sourceMappingURL=decodeDirectory.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/decodeDirectory.js"],
4
+ "sourcesContent": ["/** Decode delta/varint directory columns, rejecting malformed entries. */\n\nexport function decodeDirectory(data) {\n const bytes = new Uint8Array(data);\n let cursor = 0;\n const varint = () => {\n let value = 0;\n for (let factor = 1; factor <= 2 ** 49; factor *= 128) {\n if (cursor >= bytes.length) throw new Error('Truncated PMTiles directory');\n const byte = bytes[cursor++];\n value += (byte & 127) * factor;\n if (!Number.isSafeInteger(value)) throw new Error('Invalid PMTiles directory integer');\n if (byte < 128) return value;\n }\n throw new Error('Invalid PMTiles directory integer');\n };\n const count = varint();\n if (count > (bytes.length - cursor) / 4) throw new Error('Invalid PMTiles directory count');\n const entries = [];\n let tileId = 0;\n for (let i = 0; i < count; i++) {\n tileId += varint();\n if (!Number.isSafeInteger(tileId) || (i && tileId <= entries[i - 1].tileId)) {\n throw new Error('Invalid PMTiles directory tile IDs');\n }\n entries.push({ tileId });\n }\n for (const entry of entries) entry.runLength = varint();\n for (const entry of entries) {\n entry.length = varint();\n if (!entry.length) throw new Error('Invalid PMTiles directory length');\n }\n entries.forEach((entry, i) => {\n const value = varint();\n if (!value && !i) throw new Error('Invalid PMTiles directory offset');\n entry.offset = value ? value - 1 : entries[i - 1].offset + entries[i - 1].length;\n });\n if (cursor !== bytes.length) throw new Error('Trailing PMTiles directory data');\n return entries;\n}\n"],
5
+ "mappings": "AAEO,SAASA,EAAgBC,EAAM,CACpC,MAAMC,EAAQ,IAAI,WAAWD,CAAI,EACjC,IAAIE,EAAS,EACb,MAAMC,EAAS,IAAM,CACnB,IAAIC,EAAQ,EACZ,QAASC,EAAS,EAAGA,GAAU,GAAK,GAAIA,GAAU,IAAK,CACrD,GAAIH,GAAUD,EAAM,OAAQ,MAAM,IAAI,MAAM,6BAA6B,EACzE,MAAMK,EAAOL,EAAMC,GAAQ,EAE3B,GADAE,IAAUE,EAAO,KAAOD,EACpB,CAAC,OAAO,cAAcD,CAAK,EAAG,MAAM,IAAI,MAAM,mCAAmC,EACrF,GAAIE,EAAO,IAAK,OAAOF,CACzB,CACA,MAAM,IAAI,MAAM,mCAAmC,CACrD,EACMG,EAAQJ,EAAO,EACrB,GAAII,GAASN,EAAM,OAASC,GAAU,EAAG,MAAM,IAAI,MAAM,iCAAiC,EAC1F,MAAMM,EAAU,CAAC,EACjB,IAAIC,EAAS,EACb,QAASC,EAAI,EAAGA,EAAIH,EAAOG,IAAK,CAE9B,GADAD,GAAUN,EAAO,EACb,CAAC,OAAO,cAAcM,CAAM,GAAMC,GAAKD,GAAUD,EAAQE,EAAI,CAAC,EAAE,OAClE,MAAM,IAAI,MAAM,oCAAoC,EAEtDF,EAAQ,KAAK,CAAE,OAAAC,CAAO,CAAC,CACzB,CACA,UAAWE,KAASH,EAASG,EAAM,UAAYR,EAAO,EACtD,UAAWQ,KAASH,EAElB,GADAG,EAAM,OAASR,EAAO,EAClB,CAACQ,EAAM,OAAQ,MAAM,IAAI,MAAM,kCAAkC,EAOvE,GALAH,EAAQ,QAAQ,CAACG,EAAOD,IAAM,CAC5B,MAAMN,EAAQD,EAAO,EACrB,GAAI,CAACC,GAAS,CAACM,EAAG,MAAM,IAAI,MAAM,kCAAkC,EACpEC,EAAM,OAASP,EAAQA,EAAQ,EAAII,EAAQE,EAAI,CAAC,EAAE,OAASF,EAAQE,EAAI,CAAC,EAAE,MAC5E,CAAC,EACGR,IAAWD,EAAM,OAAQ,MAAM,IAAI,MAAM,iCAAiC,EAC9E,OAAOO,CACT",
6
+ "names": ["decodeDirectory", "data", "bytes", "cursor", "varint", "value", "factor", "byte", "count", "entries", "tileId", "i", "entry"]
7
+ }
@@ -0,0 +1,2 @@
1
+ function i(o){if(o.byteLength<127||new TextDecoder().decode(new Uint8Array(o,0,7))!=="PMTiles"||new Uint8Array(o)[7]!==3)throw new Error("Expected a PMTiles v3 archive");const t=new DataView(o),e={};return["rootDirectoryOffset","rootDirectoryLength","jsonMetadataOffset","jsonMetadataLength","leafDirectoryOffset","leafDirectoryLength","tileDataOffset","tileDataLength","numAddressedTiles","numTileEntries","numTileContents"].forEach((n,r)=>{e[n]=Number(t.getBigUint64(8+r*8,!0))}),["clustered","internalCompression","tileCompression","tileType","minZoom","maxZoom"].forEach((n,r)=>{e[n]=t.getUint8(96+r)}),["minLon","minLat","maxLon","maxLat"].forEach((n,r)=>{e[n]=t.getInt32(102+r*4,!0)/1e7}),e.centerZoom=t.getUint8(118),e.centerLon=t.getInt32(119,!0)/1e7,e.centerLat=t.getInt32(123,!0)/1e7,e}export{i as decodeHeader};
2
+ //# sourceMappingURL=decodeHeader.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/decodeHeader.js"],
4
+ "sourcesContent": ["/** Decode the PMTiles v3 header. */\n\nexport function decodeHeader(data) {\n if (data.byteLength < 127 || new TextDecoder().decode(new Uint8Array(data, 0, 7)) !== 'PMTiles' ||\n new Uint8Array(data)[7] !== 3) throw new Error('Expected a PMTiles v3 archive');\n const view = new DataView(data);\n const header = {};\n ['rootDirectoryOffset', 'rootDirectoryLength', 'jsonMetadataOffset', 'jsonMetadataLength', 'leafDirectoryOffset', 'leafDirectoryLength', 'tileDataOffset', 'tileDataLength', 'numAddressedTiles', 'numTileEntries', 'numTileContents'].forEach((name, i) => { header[name] = Number(view.getBigUint64(8 + i * 8, true)); });\n ['clustered', 'internalCompression', 'tileCompression', 'tileType', 'minZoom', 'maxZoom'].forEach((name, i) => { header[name] = view.getUint8(96 + i); });\n ['minLon', 'minLat', 'maxLon', 'maxLat'].forEach((name, i) => { header[name] = view.getInt32(102 + i * 4, true) / 1e7; });\n header.centerZoom = view.getUint8(118);\n header.centerLon = view.getInt32(119, true) / 1e7;\n header.centerLat = view.getInt32(123, true) / 1e7;\n return header;\n}\n"],
5
+ "mappings": "AAEO,SAASA,EAAaC,EAAM,CACjC,GAAIA,EAAK,WAAa,KAAO,IAAI,YAAY,EAAE,OAAO,IAAI,WAAWA,EAAM,EAAG,CAAC,CAAC,IAAM,WACpF,IAAI,WAAWA,CAAI,EAAE,CAAC,IAAM,EAAG,MAAM,IAAI,MAAM,+BAA+B,EAChF,MAAMC,EAAO,IAAI,SAASD,CAAI,EACxBE,EAAS,CAAC,EAChB,OAAC,sBAAuB,sBAAuB,qBAAsB,qBAAsB,sBAAuB,sBAAuB,iBAAkB,iBAAkB,oBAAqB,iBAAkB,iBAAiB,EAAE,QAAQ,CAACC,EAAMC,IAAM,CAAEF,EAAOC,CAAI,EAAI,OAAOF,EAAK,aAAa,EAAIG,EAAI,EAAG,EAAI,CAAC,CAAG,CAAC,EAC1T,CAAC,YAAa,sBAAuB,kBAAmB,WAAY,UAAW,SAAS,EAAE,QAAQ,CAACD,EAAMC,IAAM,CAAEF,EAAOC,CAAI,EAAIF,EAAK,SAAS,GAAKG,CAAC,CAAG,CAAC,EACxJ,CAAC,SAAU,SAAU,SAAU,QAAQ,EAAE,QAAQ,CAACD,EAAMC,IAAM,CAAEF,EAAOC,CAAI,EAAIF,EAAK,SAAS,IAAMG,EAAI,EAAG,EAAI,EAAI,GAAK,CAAC,EACxHF,EAAO,WAAaD,EAAK,SAAS,GAAG,EACrCC,EAAO,UAAYD,EAAK,SAAS,IAAK,EAAI,EAAI,IAC9CC,EAAO,UAAYD,EAAK,SAAS,IAAK,EAAI,EAAI,IACvCC,CACT",
6
+ "names": ["decodeHeader", "data", "view", "header", "name", "i"]
7
+ }
@@ -0,0 +1,2 @@
1
+ function d(r){const n=new DataView(r),s=new TextDecoder;let t;if(n.getUint32(0,!0)===1179937895){if(n.getUint32(4,!0)!==2||n.getUint32(8,!0)!==r.byteLength)throw new Error("Invalid GLB header");let o;for(let e=12;e<r.byteLength;){if(e+8>r.byteLength)throw new Error("Truncated GLB chunk");const i=n.getUint32(e,!0),h=n.getUint32(e+4,!0);if(e+=8,e+i>r.byteLength)throw new Error("Truncated GLB data");const c=r.slice(e,e+i);h===1313821514&&(t=JSON.parse(s.decode(c))),h===5130562&&(o=c),e+=i}if(!t)throw new Error("Missing GLB JSON");o&&(t.buffers[0].binary=o)}else t=JSON.parse(s.decode(r));if(t.skins?.length||t.animations?.length||t.extensionsRequired?.length||t.meshes?.some(o=>o.primitives.some(e=>e.targets||e.mode!==void 0&&e.mode!==4)))throw new Error("Layer3D supports static triangle glTF models without required extensions");return t}export{d as decodeModel};
2
+ //# sourceMappingURL=decodeModel.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/decodeModel.js"],
4
+ "sourcesContent": ["/** Decode a static glTF JSON document or GLB v2 container. */\n\nexport function decodeModel(data) {\n const view = new DataView(data), decoder = new TextDecoder();\n let description;\n if (view.getUint32(0, true) === 0x46546c67) {\n // Decode GLB v2 chunks; unknown types are skipped.\n if (view.getUint32(4, true) !== 2 || view.getUint32(8, true) !== data.byteLength) {\n throw new Error('Invalid GLB header');\n }\n let binary;\n for (let offset = 12; offset < data.byteLength;) {\n if (offset + 8 > data.byteLength) {\n throw new Error('Truncated GLB chunk');\n }\n const length = view.getUint32(offset, true), type = view.getUint32(offset + 4, true);\n offset += 8;\n if (offset + length > data.byteLength) {\n throw new Error('Truncated GLB data');\n }\n const chunk = data.slice(offset, offset + length);\n if (type === 0x4e4f534a) {\n description = JSON.parse(decoder.decode(chunk));\n }\n if (type === 0x004e4942) {\n binary = chunk;\n }\n offset += length;\n }\n if (!description) {\n throw new Error('Missing GLB JSON');\n }\n if (binary) {\n description.buffers[0].binary = binary;\n }\n } else {\n description = JSON.parse(decoder.decode(data));\n }\n if (description.skins?.length || description.animations?.length || description.extensionsRequired?.length || description.meshes?.some(mesh => mesh.primitives.some(primitive => primitive.targets || (primitive.mode !== undefined && primitive.mode !== 4)))) {\n throw new Error('Layer3D supports static triangle glTF models without required extensions');\n }\n return description;\n}\n"],
5
+ "mappings": "AAEO,SAASA,EAAYC,EAAM,CAChC,MAAMC,EAAO,IAAI,SAASD,CAAI,EAAGE,EAAU,IAAI,YAC/C,IAAIC,EACJ,GAAIF,EAAK,UAAU,EAAG,EAAI,IAAM,WAAY,CAE1C,GAAIA,EAAK,UAAU,EAAG,EAAI,IAAM,GAAKA,EAAK,UAAU,EAAG,EAAI,IAAMD,EAAK,WACpE,MAAM,IAAI,MAAM,oBAAoB,EAEtC,IAAII,EACJ,QAASC,EAAS,GAAIA,EAASL,EAAK,YAAa,CAC/C,GAAIK,EAAS,EAAIL,EAAK,WACpB,MAAM,IAAI,MAAM,qBAAqB,EAEvC,MAAMM,EAASL,EAAK,UAAUI,EAAQ,EAAI,EAAGE,EAAON,EAAK,UAAUI,EAAS,EAAG,EAAI,EAEnF,GADAA,GAAU,EACNA,EAASC,EAASN,EAAK,WACzB,MAAM,IAAI,MAAM,oBAAoB,EAEtC,MAAMQ,EAAQR,EAAK,MAAMK,EAAQA,EAASC,CAAM,EAC5CC,IAAS,aACXJ,EAAc,KAAK,MAAMD,EAAQ,OAAOM,CAAK,CAAC,GAE5CD,IAAS,UACXH,EAASI,GAEXH,GAAUC,CACZ,CACA,GAAI,CAACH,EACH,MAAM,IAAI,MAAM,kBAAkB,EAEhCC,IACFD,EAAY,QAAQ,CAAC,EAAE,OAASC,EAEpC,MACED,EAAc,KAAK,MAAMD,EAAQ,OAAOF,CAAI,CAAC,EAE/C,GAAIG,EAAY,OAAO,QAAUA,EAAY,YAAY,QAAUA,EAAY,oBAAoB,QAAUA,EAAY,QAAQ,KAAKM,GAAQA,EAAK,WAAW,KAAKC,GAAaA,EAAU,SAAYA,EAAU,OAAS,QAAaA,EAAU,OAAS,CAAE,CAAC,EAC1P,MAAM,IAAI,MAAM,0EAA0E,EAE5F,OAAOP,CACT",
6
+ "names": ["decodeModel", "data", "view", "decoder", "description", "binary", "offset", "length", "type", "chunk", "mesh", "primitive"]
7
+ }
@@ -0,0 +1,2 @@
1
+ async function n(r,e){if(e===1)return r;if(e!==2)throw new Error(`Unsupported PMTiles compression: ${e}`);return new Response(new Blob([r]).stream().pipeThrough(new DecompressionStream("gzip"))).arrayBuffer()}export{n as decompress};
2
+ //# sourceMappingURL=decompress.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/decompress.js"],
4
+ "sourcesContent": ["export async function decompress(data, compression) {\n if (compression === 1) return data;\n if (compression !== 2) throw new Error(`Unsupported PMTiles compression: ${compression}`);\n return new Response(new Blob([data]).stream().pipeThrough(new DecompressionStream('gzip'))).arrayBuffer();\n}\n"],
5
+ "mappings": "AAAA,eAAsBA,EAAWC,EAAMC,EAAa,CAClD,GAAIA,IAAgB,EAAG,OAAOD,EAC9B,GAAIC,IAAgB,EAAG,MAAM,IAAI,MAAM,oCAAoCA,CAAW,EAAE,EACxF,OAAO,IAAI,SAAS,IAAI,KAAK,CAACD,CAAI,CAAC,EAAE,OAAO,EAAE,YAAY,IAAI,oBAAoB,MAAM,CAAC,CAAC,EAAE,YAAY,CAC1G",
6
+ "names": ["decompress", "data", "compression"]
7
+ }
@@ -0,0 +1,2 @@
1
+ function t(e,r){e.renderer.device.queue.onSubmittedWorkDone().then(()=>r.destroy(),o=>{e.fire("error",{error:o}),r.destroy()})}export{t as destroyTexture};
2
+ //# sourceMappingURL=destroyTexture.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/destroyTexture.js"],
4
+ "sourcesContent": ["\nexport function destroyTexture(layer, texture) {\n layer.renderer.device.queue.onSubmittedWorkDone().then(() => texture.destroy(), error => {\n layer.fire('error', { error });\n texture.destroy();\n });\n}\n"],
5
+ "mappings": "AACO,SAASA,EAAeC,EAAOC,EAAS,CAC7CD,EAAM,SAAS,OAAO,MAAM,oBAAoB,EAAE,KAAK,IAAMC,EAAQ,QAAQ,EAAGC,GAAS,CACvFF,EAAM,KAAK,QAAS,CAAE,MAAAE,CAAM,CAAC,EAC7BD,EAAQ,QAAQ,CAClB,CAAC,CACH",
6
+ "names": ["destroyTexture", "layer", "texture", "error"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{setParent as o}from"./setParent.js";import{update as f}from"./update.js";function n(r,t){if(t){o(t,null),f(r);for(const e of Object.values(t.geometry.attributes))e.buffer.destroy()}}export{n as disposeMesh};
2
+ //# sourceMappingURL=disposeMesh.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/disposeMesh.js"],
4
+ "sourcesContent": ["import { setParent } from './setParent.js';\nimport { update } from './update.js';\n\nexport function disposeMesh(backend, mesh) {\n if (!mesh) {\n return;\n }\n setParent(mesh, null);\n update(backend);\n for (const attribute of Object.values(mesh.geometry.attributes)) {\n attribute.buffer.destroy();\n }\n}\n"],
5
+ "mappings": "AAAA,OAAS,aAAAA,MAAiB,iBAC1B,OAAS,UAAAC,MAAc,cAEhB,SAASC,EAAYC,EAASC,EAAM,CACzC,GAAKA,EAGL,CAAAJ,EAAUI,EAAM,IAAI,EACpBH,EAAOE,CAAO,EACd,UAAWE,KAAa,OAAO,OAAOD,EAAK,SAAS,UAAU,EAC5DC,EAAU,OAAO,QAAQ,EAE7B",
6
+ "names": ["setParent", "update", "disposeMesh", "backend", "mesh", "attribute"]
7
+ }
@@ -0,0 +1,2 @@
1
+ function G(b,e,o,m,h){const{geometry:a,program:i}=e,p=b.renderer.device,w=`${m}:${h}`;let c=i.pipelineCache.get(w);c||(c=p.createRenderPipeline({layout:i.pipelineLayout,vertex:{module:i.vertex,entryPoint:"vertexMain",buffers:i.vertexBuffers},fragment:{module:i.fragment,entryPoint:"fragmentMain",targets:[{format:b.renderer.format,blend:i.transparent?{color:{srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha",operation:"add"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"}}:void 0,writeMask:GPUColorWrite.ALL}]},primitive:{topology:"triangle-list",cullMode:m,frontFace:h},depthStencil:{format:"depth24plus",depthWriteEnabled:i.depthWrite,depthCompare:i.depthTest===!1?"always":"less-equal"}}),i.pipelineCache.set(w,c));const d=i.uniforms,s=b.renderer,B=s.uniformSlot++*256,r=s.uniformData,n=B/4;r.set(e.worldMatrix,n),r.set(d.baseColor.value,n+16),r[n+19]=1,r[n+20]=d.metallic.value,r[n+21]=d.roughness.value,r[n+22]=d.opacity.value*(e.ground?e._appearance??1:1),r[n+23]=d.alphaCutoff.value,r.set(d.emissive.value,n+24),r[n+27]=d.occlusionStrength.value,r[n+28]=e.terrain?.[0]??0,r[n+29]=e.terrain?.[1]??0,r[n+30]=e.terrain?.[2]??0,r[n+31]=e.terrain?.[3]??0,r[n+32]=e.highlight?.[0]??0,r[n+33]=e.highlight?.[1]??0,r[n+34]=i.nightSparkle?r[55]:0,r[n+35]=e.ground?1:e._appearance??1;const f=e._textures||=[];f.length=0;for(const t of i.bindings){const u=d[t.name]?.value;if(!u)throw new Error(`Missing Layer3D texture: ${t.name}`);u.uploaded!==u.image&&(p.queue.copyExternalImageToTexture({source:u.image,flipY:!!u.flipY},{texture:u.texture},[u.image.width,u.image.height]),u.uploaded=u.image),f.push(u)}let x=!e.bindGroup||e.boundBuffer!==s.uniformBuffer||f.length!==e.boundTextures.length;for(let t=0;!x&&t<f.length;t++)(f[t].texture!==e.boundTextures[t][0]||f[t].sampler!==e.boundTextures[t][1])&&(x=!0);if(x){const t=[{binding:0,resource:{buffer:s.uniformBuffer,size:144}},{binding:1,resource:{buffer:s.uniformBuffer,size:240}}];i.terrain&&t.push({binding:2,resource:i.terrain.texture.createView()}),e.boundBuffer=s.uniformBuffer;const u=e.boundTextures||=[];u.length=f.length;for(let l=0;l<f.length;l++){const y=i.bindings[l],g=f[l];t.push({binding:y.texture,resource:g.texture.createView()}),t.push({binding:y.sampler,resource:g.sampler}),u[l]||=[],u[l][0]=g.texture,u[l][1]=g.sampler}e.bindGroup=p.createBindGroup({layout:i.bindGroupLayout,entries:t})}o.setPipeline(c),o.setBindGroup(0,e.bindGroup,[B]),o.setVertexBuffer(0,a.attributes.position.buffer),o.setVertexBuffer(1,a.attributes.normal.buffer),a.attributes.color&&o.setVertexBuffer(2,a.attributes.color.buffer),a.attributes.uv&&o.setVertexBuffer(3,a.attributes.uv.buffer);for(const t of Object.values(a.attributes))t.needsUpdate&&(p.queue.writeBuffer(t.buffer,0,t.data),t.needsUpdate=!1,a.bounds=null);const v=a.attributes.index;v?(o.setIndexBuffer(v.buffer,v.indexFormat),o.drawIndexed(a.drawRange.count,1,a.drawRange.start,0,0)):o.draw(a.drawRange.count,1,a.drawRange.start,0)}export{G as drawGeometry};
2
+ //# sourceMappingURL=drawGeometry.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/drawGeometry.js"],
4
+ "sourcesContent": ["/** Upload retained CPU data and draw one mesh in the active WebGPU render pass. */\n\nexport function drawGeometry(backend, mesh, pass, cullMode, frontFace) {\n const { geometry, program } = mesh;\n const device = backend.renderer.device;\n const pipelineKey = `${cullMode}:${frontFace}`;\n let pipeline = program.pipelineCache.get(pipelineKey);\n if (!pipeline) {\n pipeline = device.createRenderPipeline({\n layout: program.pipelineLayout,\n vertex: {\n module: program.vertex,\n entryPoint: 'vertexMain',\n buffers: program.vertexBuffers,\n },\n fragment: {\n module: program.fragment,\n entryPoint: 'fragmentMain',\n targets: [{\n format: backend.renderer.format,\n blend: program.transparent ? {\n color: { srcFactor: 'src-alpha', dstFactor: 'one-minus-src-alpha', operation: 'add' },\n alpha: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha', operation: 'add' },\n } : undefined,\n writeMask: GPUColorWrite.ALL,\n }],\n },\n primitive: { topology: 'triangle-list', cullMode, frontFace },\n depthStencil: {\n format: 'depth24plus',\n depthWriteEnabled: program.depthWrite,\n depthCompare: program.depthTest === false ? 'always' : 'less-equal',\n },\n });\n program.pipelineCache.set(pipelineKey, pipeline);\n }\n\n const uniforms = program.uniforms;\n const renderer = backend.renderer;\n const offset = renderer.uniformSlot++ * 256;\n const data = renderer.uniformData, base = offset / 4;\n data.set(mesh.worldMatrix, base);\n data.set(uniforms.baseColor.value, base + 16);\n data[base + 19] = 1;\n data[base + 20] = uniforms.metallic.value;\n data[base + 21] = uniforms.roughness.value;\n data[base + 22] = uniforms.opacity.value * (mesh.ground ? mesh._appearance ?? 1 : 1);\n data[base + 23] = uniforms.alphaCutoff.value;\n data.set(uniforms.emissive.value, base + 24);\n data[base + 27] = uniforms.occlusionStrength.value;\n data[base + 28] = mesh.terrain?.[0] ?? 0;\n data[base + 29] = mesh.terrain?.[1] ?? 0;\n data[base + 30] = mesh.terrain?.[2] ?? 0;\n data[base + 31] = mesh.terrain?.[3] ?? 0;\n data[base + 32] = mesh.highlight?.[0] ?? 0;\n data[base + 33] = mesh.highlight?.[1] ?? 0;\n data[base + 34] = program.nightSparkle ? data[55] : 0;\n data[base + 35] = mesh.ground ? 1 : mesh._appearance ?? 1;\n\n const textures = mesh._textures ||= [];\n textures.length = 0;\n for (const binding of program.bindings) {\n const texture = uniforms[binding.name]?.value;\n if (!texture) throw new Error(`Missing Layer3D texture: ${binding.name}`);\n if (texture.uploaded !== texture.image) {\n device.queue.copyExternalImageToTexture(\n { source: texture.image, flipY: Boolean(texture.flipY) },\n { texture: texture.texture },\n [texture.image.width, texture.image.height]\n );\n texture.uploaded = texture.image;\n }\n textures.push(texture);\n }\n let bindingsChanged = !mesh.bindGroup || mesh.boundBuffer !== renderer.uniformBuffer ||\n textures.length !== mesh.boundTextures.length;\n for (let i = 0; !bindingsChanged && i < textures.length; i++) {\n if (textures[i].texture !== mesh.boundTextures[i][0] ||\n textures[i].sampler !== mesh.boundTextures[i][1]) bindingsChanged = true;\n }\n if (bindingsChanged) {\n const entries = [\n { binding: 0, resource: { buffer: renderer.uniformBuffer, size: 144 } },\n { binding: 1, resource: { buffer: renderer.uniformBuffer, size: 240 } },\n ];\n if (program.terrain) entries.push({ binding: 2, resource: program.terrain.texture.createView() });\n mesh.boundBuffer = renderer.uniformBuffer;\n const boundTextures = mesh.boundTextures ||= [];\n boundTextures.length = textures.length;\n for (let i = 0; i < textures.length; i++) {\n const binding = program.bindings[i], texture = textures[i];\n entries.push({ binding: binding.texture, resource: texture.texture.createView() });\n entries.push({ binding: binding.sampler, resource: texture.sampler });\n boundTextures[i] ||= [];\n boundTextures[i][0] = texture.texture;\n boundTextures[i][1] = texture.sampler;\n }\n mesh.bindGroup = device.createBindGroup({\n layout: program.bindGroupLayout,\n entries,\n });\n }\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, mesh.bindGroup, [offset]);\n pass.setVertexBuffer(0, geometry.attributes.position.buffer);\n pass.setVertexBuffer(1, geometry.attributes.normal.buffer);\n if (geometry.attributes.color) pass.setVertexBuffer(2, geometry.attributes.color.buffer);\n if (geometry.attributes.uv) pass.setVertexBuffer(3, geometry.attributes.uv.buffer);\n for (const attribute of Object.values(geometry.attributes)) {\n if (!attribute.needsUpdate) continue;\n device.queue.writeBuffer(attribute.buffer, 0, attribute.data);\n attribute.needsUpdate = false;\n geometry.bounds = null;\n }\n const index = geometry.attributes.index;\n if (index) {\n pass.setIndexBuffer(index.buffer, index.indexFormat);\n pass.drawIndexed(geometry.drawRange.count, 1, geometry.drawRange.start, 0, 0);\n } else {\n pass.draw(geometry.drawRange.count, 1, geometry.drawRange.start, 0);\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["drawGeometry", "backend", "mesh", "pass", "cullMode", "frontFace", "geometry", "program", "device", "pipelineKey", "pipeline", "uniforms", "renderer", "offset", "data", "base", "textures", "binding", "texture", "bindingsChanged", "i", "entries", "boundTextures", "attribute", "index"]
7
+ }
@@ -0,0 +1,24 @@
1
+ const e=`
2
+ fn demSample(pixel: vec2<i32>) -> f32 {
3
+ if (any(pixel < vec2<i32>(0)) || any(pixel >= vec2<i32>(textureDimensions(dem)))) { return -1e9; }
4
+ return textureLoad(dem, pixel, 0).r;
5
+ }
6
+ fn elevation(pixel: vec2<f32>, base: f32) -> f32 {
7
+ let p = pixel - vec2<f32>(0.5);
8
+ let f = fract(p);
9
+ let i = vec2<i32>(floor(p));
10
+ let v00 = demSample(i);
11
+ let v10 = demSample(i + vec2<i32>(1, 0));
12
+ let v01 = demSample(i + vec2<i32>(0, 1));
13
+ let v11 = demSample(i + vec2<i32>(1, 1));
14
+ if (v00 > -1000.0 && v10 > -1000.0 && v01 > -1000.0 && v11 > -1000.0) {
15
+ return mix(mix(v00, v10, f.x), mix(v01, v11, f.x), f.y);
16
+ }
17
+ if (v00 > -1000.0) { return v00; }
18
+ if (v10 > -1000.0) { return v10; }
19
+ if (v01 > -1000.0) { return v01; }
20
+ if (v11 > -1000.0) { return v11; }
21
+ return base;
22
+ }
23
+ `;export{e as elevationWGSL};
24
+ //# sourceMappingURL=elevationWGSL.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/elevationWGSL.js"],
4
+ "sourcesContent": ["/**\n * WGSL twin of getElevation for the vertex shader: bilinear DEM pixels, or the first valid\n * neighbour near no-data (stored as -1e9), else `base`. Expects `dem: texture_2d<f32>`.\n */\nexport const elevationWGSL = `\n fn demSample(pixel: vec2<i32>) -> f32 {\n if (any(pixel < vec2<i32>(0)) || any(pixel >= vec2<i32>(textureDimensions(dem)))) { return -1e9; }\n return textureLoad(dem, pixel, 0).r;\n }\n fn elevation(pixel: vec2<f32>, base: f32) -> f32 {\n let p = pixel - vec2<f32>(0.5);\n let f = fract(p);\n let i = vec2<i32>(floor(p));\n let v00 = demSample(i);\n let v10 = demSample(i + vec2<i32>(1, 0));\n let v01 = demSample(i + vec2<i32>(0, 1));\n let v11 = demSample(i + vec2<i32>(1, 1));\n if (v00 > -1000.0 && v10 > -1000.0 && v01 > -1000.0 && v11 > -1000.0) {\n return mix(mix(v00, v10, f.x), mix(v01, v11, f.x), f.y);\n }\n if (v00 > -1000.0) { return v00; }\n if (v10 > -1000.0) { return v10; }\n if (v01 > -1000.0) { return v01; }\n if (v11 > -1000.0) { return v11; }\n return base;\n }\n`;\n"],
5
+ "mappings": "AAIO,MAAMA,EAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
6
+ "names": ["elevationWGSL"]
7
+ }
@@ -0,0 +1,2 @@
1
+ const o=()=>({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});export{o as emptyNode};
2
+ //# sourceMappingURL=emptyNode.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/emptyNode.js"],
4
+ "sourcesContent": ["/** A fresh, empty scene-graph node. */\nexport const emptyNode = () => ({\n position: [0, 0, 0],\n rotation: [0, 0, 0],\n scale: [1, 1, 1],\n worldMatrix: [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],\n children: [],\n visible: true,\n});\n"],
5
+ "mappings": "AACO,MAAMA,EAAY,KAAO,CAC9B,SAAU,CAAC,EAAG,EAAG,CAAC,EAClB,SAAU,CAAC,EAAG,EAAG,CAAC,EAClB,MAAO,CAAC,EAAG,EAAG,CAAC,EACf,YAAa,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAC5D,SAAU,CAAC,EACX,QAAS,EACX",
6
+ "names": ["emptyNode"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{update as a}from"./update.js";function m(){const o=this;for(const e of o._zoomTransitions?.keys()||[])e.finish();o._zoomTransitions=null,o._zoomView=null,delete o._map._cameraView,o._map.getContainer().classList.remove("leaflet-camera-zoom"),o._map._updateCameraOverlays(),o._zoomLevel=null,a(o)}export{m as endZoom};
2
+ //# sourceMappingURL=endZoom.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/endZoom.js"],
4
+ "sourcesContent": ["import { update } from \"./update.js\";\n\n/** Stop using the outgoing level after zoomend; the next redraw uses current tiles. */\n\nexport function endZoom() {\n const backend = this;\n for (const animation of backend._zoomTransitions?.keys() || []) animation.finish();\n backend._zoomTransitions = null;\n backend._zoomView = null;\n delete backend._map._cameraView;\n backend._map.getContainer().classList.remove('leaflet-camera-zoom');\n backend._map._updateCameraOverlays();\n backend._zoomLevel = null;\n update(backend);\n}\n"],
5
+ "mappings": "AAAA,OAAS,UAAAA,MAAc,cAIhB,SAASC,GAAU,CACxB,MAAMC,EAAU,KAChB,UAAWC,KAAaD,EAAQ,kBAAkB,KAAK,GAAK,CAAC,EAAGC,EAAU,OAAO,EACjFD,EAAQ,iBAAmB,KAC3BA,EAAQ,UAAY,KACpB,OAAOA,EAAQ,KAAK,YACpBA,EAAQ,KAAK,aAAa,EAAE,UAAU,OAAO,qBAAqB,EAClEA,EAAQ,KAAK,sBAAsB,EACnCA,EAAQ,WAAa,KACrBF,EAAOE,CAAO,CAChB",
6
+ "names": ["update", "endZoom", "backend", "animation"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{raycast as m}from"./raycast.js";function u(e,f){if(!e.root||!e.camera)return null;for(const t of m(e,f,e.root.children,!!e.model)){if(e.model){let o=t.object;for(;o&&o!==e.model;)o=o.parent;if(o===e.model)return{id:e.model.id,properties:e.model.extras,model:e.model,mesh:t.object,point:t.point}}const r=t.object.extras?.featureFaces;if(!r)continue;let i=0,l=r.length-1;for(;i<=l;){const o=i+l>>1,n=r[o];if(t.faceIndex<n.faceStart)l=o-1;else if(t.faceIndex>=n.faceEnd)i=o+1;else return{...n,mesh:t.object,point:t.point}}}return null}export{u as findFeature};
2
+ //# sourceMappingURL=findFeature.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/findFeature.js"],
4
+ "sourcesContent": ["import { raycast } from './raycast.js';\n\n/**\n * Translate a geometry hit into a configured model or batched source feature.\n * Sorted half-open face ranges permit binary search without a feature per triangle.\n * @returns {PickedFeature|null}\n */\n\nexport function findFeature(backend, event) {\n if (!backend.root || !backend.camera) {\n return null;\n }\n for (const hit of raycast(backend, event, backend.root.children, Boolean(backend.model))) {\n if (backend.model) {\n let object = hit.object;\n while (object && object !== backend.model) {\n object = object.parent;\n }\n if (object === backend.model) {\n return {\n id: backend.model.id, properties: backend.model.extras,\n model: backend.model, mesh: hit.object, point: hit.point\n };\n }\n }\n const ranges = hit.object.extras?.featureFaces;\n if (!ranges) {\n continue;\n }\n let low = 0,\n high = ranges.length - 1;\n while (low <= high) {\n const middle = (low + high) >> 1;\n const range = ranges[middle];\n if (hit.faceIndex < range.faceStart) {\n high = middle - 1;\n } else if (hit.faceIndex >= range.faceEnd) {\n low = middle + 1;\n } else {\n return {\n ...range,\n mesh: hit.object,\n point: hit.point\n };\n }\n }\n }\n return null;\n}\n"],
5
+ "mappings": "AAAA,OAAS,WAAAA,MAAe,eAQjB,SAASC,EAAYC,EAASC,EAAO,CAC1C,GAAI,CAACD,EAAQ,MAAQ,CAACA,EAAQ,OAC5B,OAAO,KAET,UAAWE,KAAOJ,EAAQE,EAASC,EAAOD,EAAQ,KAAK,SAAU,EAAQA,EAAQ,KAAM,EAAG,CACxF,GAAIA,EAAQ,MAAO,CACjB,IAAIG,EAASD,EAAI,OACjB,KAAOC,GAAUA,IAAWH,EAAQ,OAClCG,EAASA,EAAO,OAElB,GAAIA,IAAWH,EAAQ,MACrB,MAAO,CACL,GAAIA,EAAQ,MAAM,GAAI,WAAYA,EAAQ,MAAM,OAChD,MAAOA,EAAQ,MAAO,KAAME,EAAI,OAAQ,MAAOA,EAAI,KACrD,CAEJ,CACA,MAAME,EAASF,EAAI,OAAO,QAAQ,aAClC,GAAI,CAACE,EACH,SAEF,IAAIC,EAAM,EACPC,EAAOF,EAAO,OAAS,EAC1B,KAAOC,GAAOC,GAAM,CAClB,MAAMC,EAAUF,EAAMC,GAAS,EACzBE,EAAQJ,EAAOG,CAAM,EAC3B,GAAIL,EAAI,UAAYM,EAAM,UACxBF,EAAOC,EAAS,UACPL,EAAI,WAAaM,EAAM,QAChCH,EAAME,EAAS,MAEf,OAAO,CACL,GAAGC,EACH,KAAMN,EAAI,OACV,MAAOA,EAAI,KACb,CAEJ,CACF,CACA,OAAO,IACT",
6
+ "names": ["raycast", "findFeature", "backend", "event", "hit", "object", "ranges", "low", "high", "middle", "range"]
7
+ }
@@ -1,2 +1 @@
1
- function F(o){if(o&&typeof o=="object"&&"h"in o){const{h:y,s:i,l:r}=o,u=i*Math.min(r,1-r),m=s=>{const d=(s+y*12)%12;return r-u*Math.max(-1,Math.min(d-3,9-d,1))},b=s=>s<=.0031308?s*12.92:1.055*s**(1/2.4)-.055;return{r:b(m(0)),g:b(m(8)),b:b(m(4))}}if(o&&typeof o=="object"&&"r"in o)return o;if(typeof o=="number")return{r:(o>>16&255)/255,g:(o>>8&255)/255,b:(o&255)/255};if(typeof o!="string"||!CSS.supports("color",o))throw new Error("Invalid 3D color");const f=document.createElement("canvas").getContext("2d");f.fillStyle=o,f.fillRect(0,0,1,1);const[x,a,c]=f.getImageData(0,0,1,1).data;return{r:x/255,g:a/255,b:c/255}}function G(o,f,x,a){for(let c=f;c<x;c++)o.geometry.attributes.color.data.set([a.r,a.g,a.b],c*3);o.geometry.attributes.color.needsUpdate=!0}function j(o,f=[]){const x=[o,...f].flat();if(x.some(t=>!Number.isFinite(t.x)||!Number.isFinite(t.y)))throw new Error("Invalid polygon coordinates");const a=x.map((t,n)=>({x:t.x-o[0].x,y:t.y-o[0].y,index:n})),c=(t,n,e)=>(n.x-t.x)*(e.y-t.y)-(n.y-t.y)*(e.x-t.x),y=(t,n)=>t.x===n.x&&t.y===n.y,i=t=>{let n=!0;for(;n&&t.length>3;){n=!1;for(let e=0;e<t.length;e++){const l=t[(e+t.length-1)%t.length],h=t[e],g=t[(e+1)%t.length];if(y(l,h)||Math.abs(c(l,h,g))<1e-10){t.splice(e,1),n=!0;break}}}if(t.length<3)throw new Error("Degenerate polygon ring");return t};let r=0;const u=[o,...f].map((t,n)=>{const e=i(a.slice(r,r+=t.length));return D(e)!==!!n&&e.reverse(),e}),m=(t,n)=>{let e=!1;for(let l=0,h=n.length-1;l<n.length;h=l++){const g=n[l],w=n[h];g.y>t.y!=w.y>t.y&&t.x<(w.x-g.x)*(t.y-g.y)/(w.y-g.y)+g.x&&(e=!e)}return e},b=(t,n,e,l)=>{if(y(t,e)||y(t,l)||y(n,e)||y(n,l))return!1;const h=c(t,n,e),g=c(t,n,l),w=c(e,l,t),k=c(e,l,n),I=(C,B,P)=>Math.min(C.x,B.x)<=P.x&&P.x<=Math.max(C.x,B.x)&&Math.min(C.y,B.y)<=P.y&&P.y<=Math.max(C.y,B.y);return h*g<0&&w*k<0||h===0&&I(t,n,e)||g===0&&I(t,n,l)||w===0&&I(e,l,t)||k===0&&I(e,l,n)};let s=u[0].slice();for(const t of u.slice(1).sort((n,e)=>Math.min(...n.map(l=>l.x))-Math.min(...e.map(l=>l.x)))){let n,e=1/0;for(let g=0;g<t.length;g++)for(let w=0;w<s.length;w++){const k=t[g],I=s[w],C=(k.x-I.x)**2+(k.y-I.y)**2;if(C>=e)continue;const B={x:(k.x+I.x)/2,y:(k.y+I.y)/2};!m(B,u[0])||u.slice(1).some(P=>m(B,P))||[s,...u.slice(1)].some(P=>P.some((N,S)=>b(k,I,N,P[(S+1)%P.length])))||(n=[g,w],e=C)}if(!n)throw new Error("Unable to connect polygon hole");const[l,h]=n;s=[...s.slice(0,h+1),...t.slice(l),...t.slice(0,l+1),s[h],...s.slice(h+1)]}const d=[];for(;s.length>3;){let t=!1;for(let n=0;n<s.length;n++){const e=s[(n+s.length-1)%s.length],l=s[n],h=s[(n+1)%s.length];if(!(c(e,l,h)<=1e-10)&&!s.some(g=>!y(g,e)&&!y(g,l)&&!y(g,h)&&c(e,l,g)>=0&&c(l,h,g)>=0&&c(h,e,g)>=0)){d.push([e.index,l.index,h.index]),s.splice(n,1),t=!0;break}}if(!t)throw new Error("Unable to triangulate polygon: invalid or self-intersecting rings")}c(...s)>1e-10&&d.push(s.map(t=>t.index));const p=t=>Math.abs(t.reduce((n,e,l)=>{const h=t[(l+1)%t.length];return n+e.x*h.y-h.x*e.y},0))/2,M=p(u[0])-u.slice(1).reduce((t,n)=>t+p(n),0),E=d.reduce((t,n)=>t+c(...n.map(e=>a[e]))/2,0);if(M<=0||Math.abs(E-M)>Math.max(1e-7,M*1e-8))throw new Error("Polygon triangulation area mismatch");return d}function D(o){let f=0;for(let x=0;x<o.length;x++){const a=o[x],c=o[(x+1)%o.length];f+=a.x*c.y-c.x*a.y}return f<0}function A(o,f,x){const{top:a,bottom:c=0,trunkRadius:y,crownRadius:i,crownBottom:r,crownShape:u="round"}=f;if(![y,i,r].every(Number.isFinite)||y<=0||i<y||r<=c||r>=a||!["round","cone"].includes(u))throw new Error("Invalid tree dimensions or crown shape");const m=F(f.trunkColor??7491898),b=F(f.color??5210683),s=p=>Array.from({length:8},(M,E)=>({x:o.x+Math.cos(E*Math.PI/4)*p,y:o.y+Math.sin(E*Math.PI/4)*p,ground:o.ground})),d=(p,M,E,t,n)=>{const e=s(p),l=s(E);for(let h=0;h<8;h++){const g=(h+1)%8,w=(h+.5)*Math.PI/4,k=(p-E)/(t-M),I=Math.hypot(1,k),C=Math.cos(w)/I,B=k/I,P=-Math.sin(w)/I;p&&x(e[h],M,e[g],M,l[g],t,C,B,P,n),E&&x(e[h],M,l[g],t,l[h],t,C,B,P,n)}};if(d(y,c,y,r+(a-r)*.25,m),u==="cone"){const p=s(i);for(let M=0;M<8;M++)x(o,r,p[M],r,p[(M+1)%8],r,0,-1,0,b);d(i,r,0,a,b)}else{const p=[[0,0],[.35,.8],[.6,1],[.85,.7],[1,0]];for(let M=1;M<p.length;M++){const[E,t]=p[M-1],[n,e]=p[M];d(t*i,r+E*(a-r),e*i,r+n*(a-r),b)}}}function R(o,f,x){if(!Number.isFinite(f.lightRadius)||f.lightRadius<=0)throw new Error("Invalid light radius");const a=F(f.color),c=(r,u,m,b,s,d)=>{x(r,s,u,s,m,s,...d,a),x(r,s,m,s,b,s,...d,a)},y=.65,i=(r,u,m)=>({x:o.x+(m===2?0:r*y),y:o.y+(m===1?0:m===2?r*y:u*y),ground:o.ground+(m===0?0:u*y),uv:[r,u]});for(let r=0;r<3;r++)c(i(-1,-1,r),i(1,-1,r),i(1,1,r),i(-1,1,r),f.top,r===0?[0,1,0]:r===1?[0,0,1]:[1,0,0])}function U(o,f,x){const a=F(5264986),c=f.poleRadius;if(!Number.isFinite(c)||c<=0)throw new Error("Invalid lamp pole radius");const y=r=>Array.from({length:6},(u,m)=>({x:o.x+Math.cos(m*Math.PI/3)*r,y:o.y+Math.sin(m*Math.PI/3)*r,ground:o.ground,uv:[3,3]})),i={...o,uv:[3,3]};for(const[r,u,m]of[[c,0,f.top],[c*2.5,f.top-.25,f.top+.15]]){const b=y(r);for(let s=0;s<6;s++){const d=b[s],p=b[(s+1)%6],M=(s+.5)*Math.PI/3,E=Math.cos(M),t=-Math.sin(M);x(d,u,p,u,p,m,E,0,t,a),x(d,u,p,m,d,m,E,0,t,a),x(i,m,d,m,p,m,0,1,0,a),x(i,u,p,u,d,u,0,-1,0,a)}}}function z(o){const f=[1/0,1/0,1/0],x=[-1/0,-1/0,-1/0],a=o.attributes.position.data;for(let i=0;i<a.length;i++)f[i%3]=Math.min(f[i%3],a[i]),x[i%3]=Math.max(x[i%3],a[i]);const c=f.map((i,r)=>(i+x[r])/2);let y=0;for(let i=0;i<a.length;i+=3)y=Math.max(y,Math.hypot(a[i]-c[0],a[i+1]-c[1],a[i+2]-c[2]));o.bounds={min:f,max:x,center:c,radius:y}}export{z as computeBounds,D as isClockWise,U as lampPostGeometry,R as lightGeometry,F as parseColor,G as setVertexColor,A as treeGeometry,j as triangulate};
2
1
  //# sourceMappingURL=geometry.js.map