leaflet-city-mapper 0.0.0-stage → 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 (412) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +78 -2
  3. package/cucumber.mjs +9 -0
  4. package/dist/leaflet-city-mapper.js +2 -0
  5. package/dist/leaflet-city-mapper.js.map +7 -0
  6. package/dist/utils/CELL.js +2 -0
  7. package/dist/utils/CELL.js.map +7 -0
  8. package/dist/utils/addBridges.js +2 -0
  9. package/dist/utils/addBridges.js.map +7 -0
  10. package/dist/utils/addRasterTile.js +2 -0
  11. package/dist/utils/addRasterTile.js.map +7 -0
  12. package/dist/utils/along.js +2 -0
  13. package/dist/utils/along.js.map +7 -0
  14. package/dist/utils/atmosphere.js +2 -0
  15. package/dist/utils/atmosphere.js.map +7 -0
  16. package/dist/utils/attach.js +2 -0
  17. package/dist/utils/attach.js.map +7 -0
  18. package/dist/utils/bindSunlight.js +2 -0
  19. package/dist/utils/bindSunlight.js.map +7 -0
  20. package/dist/utils/box.js +2 -0
  21. package/dist/utils/box.js.map +7 -0
  22. package/dist/utils/bridgeElevation.js +2 -0
  23. package/dist/utils/bridgeElevation.js.map +7 -0
  24. package/dist/utils/build.js +2 -0
  25. package/dist/utils/build.js.map +7 -0
  26. package/dist/utils/cameraControls.js +2 -0
  27. package/dist/utils/cameraControls.js.map +7 -0
  28. package/dist/utils/channel.js +2 -0
  29. package/dist/utils/channel.js.map +7 -0
  30. package/dist/utils/collider.js +2 -0
  31. package/dist/utils/collider.js.map +7 -0
  32. package/dist/utils/colliders.js +2 -0
  33. package/dist/utils/colliders.js.map +7 -0
  34. package/dist/utils/computeBounds.js +2 -0
  35. package/dist/utils/computeBounds.js.map +7 -0
  36. package/dist/utils/conformModelToTerrain.js +2 -0
  37. package/dist/utils/conformModelToTerrain.js.map +7 -0
  38. package/dist/utils/createMesh.js +2 -0
  39. package/dist/utils/createMesh.js.map +7 -0
  40. package/dist/utils/createProgram.js +3 -0
  41. package/dist/utils/createProgram.js.map +7 -0
  42. package/dist/utils/decodeDirectory.js +2 -0
  43. package/dist/utils/decodeDirectory.js.map +7 -0
  44. package/dist/utils/decodeHeader.js +2 -0
  45. package/dist/utils/decodeHeader.js.map +7 -0
  46. package/dist/utils/decodeModel.js +2 -0
  47. package/dist/utils/decodeModel.js.map +7 -0
  48. package/dist/utils/decompress.js +2 -0
  49. package/dist/utils/decompress.js.map +7 -0
  50. package/dist/utils/destroyTexture.js +2 -0
  51. package/dist/utils/destroyTexture.js.map +7 -0
  52. package/dist/utils/disposeMesh.js +2 -0
  53. package/dist/utils/disposeMesh.js.map +7 -0
  54. package/dist/utils/drawGeometry.js +2 -0
  55. package/dist/utils/drawGeometry.js.map +7 -0
  56. package/dist/utils/elevationWGSL.js +24 -0
  57. package/dist/utils/elevationWGSL.js.map +7 -0
  58. package/dist/utils/emptyNode.js +2 -0
  59. package/dist/utils/emptyNode.js.map +7 -0
  60. package/dist/utils/endZoom.js +2 -0
  61. package/dist/utils/endZoom.js.map +7 -0
  62. package/dist/utils/findFeature.js +2 -0
  63. package/dist/utils/findFeature.js.map +7 -0
  64. package/dist/utils/geometry.js +1 -0
  65. package/dist/utils/geometry.js.map +7 -0
  66. package/dist/utils/getElevation.js +2 -0
  67. package/dist/utils/getElevation.js.map +7 -0
  68. package/dist/utils/getHeader.js +2 -0
  69. package/dist/utils/getHeader.js.map +7 -0
  70. package/dist/utils/getZxy.js +2 -0
  71. package/dist/utils/getZxy.js.map +7 -0
  72. package/dist/utils/glass.js +2 -0
  73. package/dist/utils/glass.js.map +7 -0
  74. package/dist/utils/headlight.js +2 -0
  75. package/dist/utils/headlight.js.map +7 -0
  76. package/dist/utils/hit.js +2 -0
  77. package/dist/utils/hit.js.map +7 -0
  78. package/dist/utils/horizontalPosition.js +2 -0
  79. package/dist/utils/horizontalPosition.js.map +7 -0
  80. package/dist/utils/horizontalRay.js +2 -0
  81. package/dist/utils/horizontalRay.js.map +7 -0
  82. package/dist/utils/hull.js +2 -0
  83. package/dist/utils/hull.js.map +7 -0
  84. package/dist/utils/initSunlight.js +2 -0
  85. package/dist/utils/initSunlight.js.map +7 -0
  86. package/dist/utils/initTerrain.js +2 -0
  87. package/dist/utils/initTerrain.js.map +7 -0
  88. package/dist/utils/initTraffic.js +40 -0
  89. package/dist/utils/initTraffic.js.map +7 -0
  90. package/dist/utils/initWalk.js +2 -0
  91. package/dist/utils/initWalk.js.map +7 -0
  92. package/dist/utils/intersectMeshes.js +2 -0
  93. package/dist/utils/intersectMeshes.js.map +7 -0
  94. package/dist/utils/isClockWise.js +2 -0
  95. package/dist/utils/isClockWise.js.map +7 -0
  96. package/dist/utils/lampPostGeometry.js +2 -0
  97. package/dist/utils/lampPostGeometry.js.map +7 -0
  98. package/dist/utils/lightGeometry.js +2 -0
  99. package/dist/utils/lightGeometry.js.map +7 -0
  100. package/dist/utils/lightGrid.js +2 -0
  101. package/dist/utils/lightGrid.js.map +7 -0
  102. package/dist/utils/limbs.js +2 -0
  103. package/dist/utils/limbs.js.map +7 -0
  104. package/dist/utils/loadModel.js +2 -0
  105. package/dist/utils/loadModel.js.map +7 -0
  106. package/dist/utils/loadSource.js +2 -0
  107. package/dist/utils/loadSource.js.map +7 -0
  108. package/dist/utils/loadTerrain.js +2 -0
  109. package/dist/utils/loadTerrain.js.map +7 -0
  110. package/dist/utils/mapCamera.js +2 -0
  111. package/dist/utils/mapCamera.js.map +7 -0
  112. package/dist/utils/materialShaders.js +211 -0
  113. package/dist/utils/materialShaders.js.map +7 -0
  114. package/dist/utils/mirror.js +2 -0
  115. package/dist/utils/mirror.js.map +7 -0
  116. package/dist/utils/moonPosition.js +2 -0
  117. package/dist/utils/moonPosition.js.map +7 -0
  118. package/dist/utils/moves.js +2 -0
  119. package/dist/utils/moves.js.map +7 -0
  120. package/dist/utils/nativeEvents.js +2 -0
  121. package/dist/utils/nativeEvents.js.map +7 -0
  122. package/dist/utils/nativeGeometry.js +2 -0
  123. package/dist/utils/nativeGeometry.js.map +7 -0
  124. package/dist/utils/nativeLayer.js +2 -0
  125. package/dist/utils/nativeLayer.js.map +7 -0
  126. package/dist/utils/nodeMatrix.js +2 -0
  127. package/dist/utils/nodeMatrix.js.map +7 -0
  128. package/dist/utils/onAdd3DLayer.js +2 -0
  129. package/dist/utils/onAdd3DLayer.js.map +7 -0
  130. package/dist/utils/onAddSun.js +2 -0
  131. package/dist/utils/onAddSun.js.map +7 -0
  132. package/dist/utils/onClick.js +2 -0
  133. package/dist/utils/onClick.js.map +7 -0
  134. package/dist/utils/onMapChange.js +2 -0
  135. package/dist/utils/onMapChange.js.map +7 -0
  136. package/dist/utils/onPMTileAdd.js +2 -0
  137. package/dist/utils/onPMTileAdd.js.map +7 -0
  138. package/dist/utils/onPMTileRemove.js +2 -0
  139. package/dist/utils/onPMTileRemove.js.map +7 -0
  140. package/dist/utils/onPointerLeave.js +2 -0
  141. package/dist/utils/onPointerLeave.js.map +7 -0
  142. package/dist/utils/onPointerMove.js +2 -0
  143. package/dist/utils/onPointerMove.js.map +7 -0
  144. package/dist/utils/onRemove3DLayer.js +2 -0
  145. package/dist/utils/onRemove3DLayer.js.map +7 -0
  146. package/dist/utils/onRemoveSun.js +2 -0
  147. package/dist/utils/onRemoveSun.js.map +7 -0
  148. package/dist/utils/onTerrainAdd.js +2 -0
  149. package/dist/utils/onTerrainAdd.js.map +7 -0
  150. package/dist/utils/onTerrainChange.js +2 -0
  151. package/dist/utils/onTerrainChange.js.map +7 -0
  152. package/dist/utils/onTerrainRemove.js +2 -0
  153. package/dist/utils/onTerrainRemove.js.map +7 -0
  154. package/dist/utils/onZoomAnim.js +2 -0
  155. package/dist/utils/onZoomAnim.js.map +7 -0
  156. package/dist/utils/paints.js +2 -0
  157. package/dist/utils/paints.js.map +7 -0
  158. package/dist/utils/parseColor.js +2 -0
  159. package/dist/utils/parseColor.js.map +7 -0
  160. package/dist/utils/parts.js +2 -0
  161. package/dist/utils/parts.js.map +7 -0
  162. package/dist/utils/projectCelestialBody.js +2 -0
  163. package/dist/utils/projectCelestialBody.js.map +7 -0
  164. package/dist/utils/pump.js +2 -0
  165. package/dist/utils/pump.js.map +7 -0
  166. package/dist/utils/rasterTiles.js +2 -0
  167. package/dist/utils/rasterTiles.js.map +7 -0
  168. package/dist/utils/raycast.js +2 -0
  169. package/dist/utils/raycast.js.map +7 -0
  170. package/dist/utils/read.js +2 -0
  171. package/dist/utils/read.js.map +7 -0
  172. package/dist/utils/readAccessor.js +2 -0
  173. package/dist/utils/readAccessor.js.map +7 -0
  174. package/dist/utils/releaseArea.js +2 -0
  175. package/dist/utils/releaseArea.js.map +7 -0
  176. package/dist/utils/removeRasterTile.js +2 -0
  177. package/dist/utils/removeRasterTile.js.map +7 -0
  178. package/dist/utils/render.js +15 -0
  179. package/dist/utils/render.js.map +7 -0
  180. package/dist/utils/renderSunlight.js +13 -0
  181. package/dist/utils/renderSunlight.js.map +7 -0
  182. package/dist/utils/renderers.js +2 -0
  183. package/dist/utils/renderers.js.map +7 -0
  184. package/dist/utils/resizeSunlight.js +2 -0
  185. package/dist/utils/resizeSunlight.js.map +7 -0
  186. package/dist/utils/roofCoverage.js +2 -0
  187. package/dist/utils/roofCoverage.js.map +7 -0
  188. package/dist/utils/routeGeometry.js +2 -0
  189. package/dist/utils/routeGeometry.js.map +7 -0
  190. package/dist/utils/scheduledTrips.js +2 -0
  191. package/dist/utils/scheduledTrips.js.map +7 -0
  192. package/dist/utils/setGeoJSONData.js +2 -0
  193. package/dist/utils/setGeoJSONData.js.map +7 -0
  194. package/dist/utils/setHighlight.js +2 -0
  195. package/dist/utils/setHighlight.js.map +7 -0
  196. package/dist/utils/setPMTileOpacity.js +2 -0
  197. package/dist/utils/setPMTileOpacity.js.map +7 -0
  198. package/dist/utils/setPMTileZIndex.js +2 -0
  199. package/dist/utils/setPMTileZIndex.js.map +7 -0
  200. package/dist/utils/setParent.js +2 -0
  201. package/dist/utils/setParent.js.map +7 -0
  202. package/dist/utils/setTerrainHeight.js +2 -0
  203. package/dist/utils/setTerrainHeight.js.map +7 -0
  204. package/dist/utils/setVertexColor.js +2 -0
  205. package/dist/utils/setVertexColor.js.map +7 -0
  206. package/dist/utils/showFeature.js +2 -0
  207. package/dist/utils/showFeature.js.map +7 -0
  208. package/dist/utils/sizes.js +2 -0
  209. package/dist/utils/sizes.js.map +7 -0
  210. package/dist/utils/skin.js +2 -0
  211. package/dist/utils/skin.js.map +7 -0
  212. package/dist/utils/solarPosition.js +2 -0
  213. package/dist/utils/solarPosition.js.map +7 -0
  214. package/dist/utils/sortMeshes.js +2 -0
  215. package/dist/utils/sortMeshes.js.map +7 -0
  216. package/dist/utils/speed.js +2 -0
  217. package/dist/utils/speed.js.map +7 -0
  218. package/dist/utils/startZoom.js +2 -0
  219. package/dist/utils/startZoom.js.map +7 -0
  220. package/dist/utils/taillight.js +2 -0
  221. package/dist/utils/taillight.js.map +7 -0
  222. package/dist/utils/terrainAtlas.js +2 -0
  223. package/dist/utils/terrainAtlas.js.map +7 -0
  224. package/dist/utils/terrainElevation.js +2 -0
  225. package/dist/utils/terrainElevation.js.map +7 -0
  226. package/dist/utils/terrainGrid.js +2 -0
  227. package/dist/utils/terrainGrid.js.map +7 -0
  228. package/dist/utils/textureSampler.js +2 -0
  229. package/dist/utils/textureSampler.js.map +7 -0
  230. package/dist/utils/tileId.js +2 -0
  231. package/dist/utils/tileId.js.map +7 -0
  232. package/dist/utils/toLanes.js +2 -0
  233. package/dist/utils/toLanes.js.map +7 -0
  234. package/dist/utils/toSRGB.js +2 -0
  235. package/dist/utils/toSRGB.js.map +7 -0
  236. package/dist/utils/tooltip.js +3 -0
  237. package/dist/utils/tooltip.js.map +7 -0
  238. package/dist/utils/traffic.js +2 -0
  239. package/dist/utils/traffic.js.map +7 -0
  240. package/dist/utils/traverse.js +2 -0
  241. package/dist/utils/traverse.js.map +7 -0
  242. package/dist/utils/treeGeometry.js +2 -0
  243. package/dist/utils/treeGeometry.js.map +7 -0
  244. package/dist/utils/triangulate.js +2 -0
  245. package/dist/utils/triangulate.js.map +7 -0
  246. package/dist/utils/tripsAt.js +2 -0
  247. package/dist/utils/tripsAt.js.map +7 -0
  248. package/dist/utils/types.js +2 -0
  249. package/dist/utils/types.js.map +7 -0
  250. package/dist/utils/underEntry.js +2 -0
  251. package/dist/utils/underEntry.js.map +7 -0
  252. package/dist/utils/update.js +2 -0
  253. package/dist/utils/update.js.map +7 -0
  254. package/dist/utils/updateArea.js +2 -0
  255. package/dist/utils/updateArea.js.map +7 -0
  256. package/dist/utils/updateCamera.js +2 -0
  257. package/dist/utils/updateCamera.js.map +7 -0
  258. package/dist/utils/updatePointLights.js +2 -0
  259. package/dist/utils/updatePointLights.js.map +7 -0
  260. package/dist/utils/updateWorldMatrix.js +2 -0
  261. package/dist/utils/updateWorldMatrix.js.map +7 -0
  262. package/dist/utils/vehicleOffsets.js +2 -0
  263. package/dist/utils/vehicleOffsets.js.map +7 -0
  264. package/dist/utils/vehicles.js +2 -0
  265. package/dist/utils/vehicles.js.map +7 -0
  266. package/dist/utils/vertexNormals.js +2 -0
  267. package/dist/utils/vertexNormals.js.map +7 -0
  268. package/dist/utils/walk.js +2 -0
  269. package/dist/utils/walk.js.map +7 -0
  270. package/dist/utils/white.js +2 -0
  271. package/dist/utils/white.js.map +7 -0
  272. package/dist/utils/worldLights.js +2 -0
  273. package/dist/utils/worldLights.js.map +7 -0
  274. package/dist/utils/wrap.js +2 -0
  275. package/dist/utils/wrap.js.map +7 -0
  276. package/package.json +43 -4
  277. package/src/index.js +397 -0
  278. package/src/utils/CELL.js +4 -0
  279. package/src/utils/addBridges.js +66 -0
  280. package/src/utils/addRasterTile.js +112 -0
  281. package/src/utils/along.js +9 -0
  282. package/src/utils/atmosphere.js +20 -0
  283. package/src/utils/attach.js +255 -0
  284. package/src/utils/bindSunlight.js +12 -0
  285. package/src/utils/box.js +1 -0
  286. package/src/utils/bridgeElevation.js +18 -0
  287. package/src/utils/build.js +20 -0
  288. package/src/utils/cameraControls.js +287 -0
  289. package/src/utils/channel.js +4 -0
  290. package/src/utils/collider.js +62 -0
  291. package/src/utils/colliders.js +2 -0
  292. package/src/utils/computeBounds.js +17 -0
  293. package/src/utils/conformModelToTerrain.js +69 -0
  294. package/src/utils/createMesh.js +31 -0
  295. package/src/utils/createProgram.js +92 -0
  296. package/src/utils/decodeDirectory.js +40 -0
  297. package/src/utils/decodeHeader.js +15 -0
  298. package/src/utils/decodeModel.js +43 -0
  299. package/src/utils/decompress.js +5 -0
  300. package/src/utils/destroyTexture.js +7 -0
  301. package/src/utils/disposeMesh.js +13 -0
  302. package/src/utils/drawGeometry.js +122 -0
  303. package/src/utils/elevationWGSL.js +27 -0
  304. package/src/utils/emptyNode.js +9 -0
  305. package/src/utils/endZoom.js +15 -0
  306. package/src/utils/findFeature.js +49 -0
  307. package/src/utils/geometry.js +2 -0
  308. package/src/utils/getElevation.js +10 -0
  309. package/src/utils/getHeader.js +9 -0
  310. package/src/utils/getZxy.js +76 -0
  311. package/src/utils/glass.js +1 -0
  312. package/src/utils/headlight.js +1 -0
  313. package/src/utils/hit.js +41 -0
  314. package/src/utils/horizontalPosition.js +16 -0
  315. package/src/utils/horizontalRay.js +12 -0
  316. package/src/utils/hull.js +1 -0
  317. package/src/utils/initSunlight.js +9 -0
  318. package/src/utils/initTerrain.js +19 -0
  319. package/src/utils/initTraffic.js +93 -0
  320. package/src/utils/initWalk.js +72 -0
  321. package/src/utils/intersectMeshes.js +121 -0
  322. package/src/utils/isClockWise.js +12 -0
  323. package/src/utils/lampPostGeometry.js +26 -0
  324. package/src/utils/lightGeometry.js +22 -0
  325. package/src/utils/lightGrid.js +50 -0
  326. package/src/utils/limbs.js +9 -0
  327. package/src/utils/loadModel.js +217 -0
  328. package/src/utils/loadSource.js +17 -0
  329. package/src/utils/loadTerrain.js +65 -0
  330. package/src/utils/mapCamera.js +432 -0
  331. package/src/utils/materialShaders.js +243 -0
  332. package/src/utils/mirror.js +6 -0
  333. package/src/utils/moonPosition.js +17 -0
  334. package/src/utils/moves.js +11 -0
  335. package/src/utils/nativeEvents.js +77 -0
  336. package/src/utils/nativeGeometry.js +131 -0
  337. package/src/utils/nativeLayer.js +317 -0
  338. package/src/utils/nodeMatrix.js +22 -0
  339. package/src/utils/onAdd3DLayer.js +31 -0
  340. package/src/utils/onAddSun.js +147 -0
  341. package/src/utils/onClick.js +13 -0
  342. package/src/utils/onMapChange.js +16 -0
  343. package/src/utils/onPMTileAdd.js +15 -0
  344. package/src/utils/onPMTileRemove.js +8 -0
  345. package/src/utils/onPointerLeave.js +11 -0
  346. package/src/utils/onPointerMove.js +15 -0
  347. package/src/utils/onRemove3DLayer.js +78 -0
  348. package/src/utils/onRemoveSun.js +3 -0
  349. package/src/utils/onTerrainAdd.js +18 -0
  350. package/src/utils/onTerrainChange.js +13 -0
  351. package/src/utils/onTerrainRemove.js +40 -0
  352. package/src/utils/onZoomAnim.js +14 -0
  353. package/src/utils/paints.js +10 -0
  354. package/src/utils/parseColor.js +42 -0
  355. package/src/utils/parts.js +16 -0
  356. package/src/utils/projectCelestialBody.js +13 -0
  357. package/src/utils/pump.js +226 -0
  358. package/src/utils/rasterTiles.js +285 -0
  359. package/src/utils/raycast.js +60 -0
  360. package/src/utils/read.js +29 -0
  361. package/src/utils/readAccessor.js +68 -0
  362. package/src/utils/releaseArea.js +34 -0
  363. package/src/utils/removeRasterTile.js +13 -0
  364. package/src/utils/render.js +406 -0
  365. package/src/utils/renderSunlight.js +170 -0
  366. package/src/utils/renderers.js +2 -0
  367. package/src/utils/resizeSunlight.js +15 -0
  368. package/src/utils/roofCoverage.js +47 -0
  369. package/src/utils/routeGeometry.js +22 -0
  370. package/src/utils/scheduledTrips.js +29 -0
  371. package/src/utils/setGeoJSONData.js +11 -0
  372. package/src/utils/setHighlight.js +13 -0
  373. package/src/utils/setPMTileOpacity.js +7 -0
  374. package/src/utils/setPMTileZIndex.js +7 -0
  375. package/src/utils/setParent.js +7 -0
  376. package/src/utils/setTerrainHeight.js +10 -0
  377. package/src/utils/setVertexColor.js +14 -0
  378. package/src/utils/showFeature.js +27 -0
  379. package/src/utils/sizes.js +1 -0
  380. package/src/utils/skin.js +2 -0
  381. package/src/utils/solarPosition.js +17 -0
  382. package/src/utils/sortMeshes.js +12 -0
  383. package/src/utils/speed.js +3 -0
  384. package/src/utils/startZoom.js +5 -0
  385. package/src/utils/taillight.js +1 -0
  386. package/src/utils/terrainAtlas.js +21 -0
  387. package/src/utils/terrainElevation.js +20 -0
  388. package/src/utils/terrainGrid.js +23 -0
  389. package/src/utils/textureSampler.js +10 -0
  390. package/src/utils/tileId.js +18 -0
  391. package/src/utils/toLanes.js +7 -0
  392. package/src/utils/toSRGB.js +1 -0
  393. package/src/utils/tooltip.js +6 -0
  394. package/src/utils/traffic.js +315 -0
  395. package/src/utils/traverse.js +6 -0
  396. package/src/utils/treeGeometry.js +45 -0
  397. package/src/utils/triangulate.js +100 -0
  398. package/src/utils/tripsAt.js +16 -0
  399. package/src/utils/types.js +8 -0
  400. package/src/utils/underEntry.js +17 -0
  401. package/src/utils/update.js +18 -0
  402. package/src/utils/updateArea.js +40 -0
  403. package/src/utils/updateCamera.js +32 -0
  404. package/src/utils/updatePointLights.js +38 -0
  405. package/src/utils/updateWorldMatrix.js +47 -0
  406. package/src/utils/vehicleOffsets.js +8 -0
  407. package/src/utils/vehicles.js +65 -0
  408. package/src/utils/vertexNormals.js +30 -0
  409. package/src/utils/walk.js +187 -0
  410. package/src/utils/white.js +1 -0
  411. package/src/utils/worldLights.js +25 -0
  412. package/src/utils/wrap.js +1 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/onPMTileAdd.js"],
4
+ "sourcesContent": ["import { attach } from './attach.js';\nimport { setRasterTerrain, updateRasterTiles } from './rasterTiles.js';\n\nexport function onPMTileAdd(backend, map) {\n if (!backend.location) backend.location = map.getCenter();\n const attached = attach(backend, map);\n attached.then(() => {\n backend._added.resolve();\n setRasterTerrain(backend, map._terrain3D);\n })\n .catch(error => backend.fire('error', { error }));\n Promise.all([attached, backend.ready]).then(() => {\n if (backend._map === map && map.hasLayer(backend)) updateRasterTiles(backend);\n }).catch(error => backend.fire('error', { error }));\n}\n"],
5
+ "mappings": "AAAA,OAAS,UAAAA,MAAc,cACvB,OAAS,oBAAAC,EAAkB,qBAAAC,MAAyB,mBAE7C,SAASC,EAAYC,EAASC,EAAK,CACnCD,EAAQ,WAAUA,EAAQ,SAAWC,EAAI,UAAU,GACxD,MAAMC,EAAWN,EAAOI,EAASC,CAAG,EACpCC,EAAS,KAAK,IAAM,CAClBF,EAAQ,OAAO,QAAQ,EACvBH,EAAiBG,EAASC,EAAI,UAAU,CAC1C,CAAC,EACE,MAAME,GAASH,EAAQ,KAAK,QAAS,CAAE,MAAAG,CAAM,CAAC,CAAC,EAClD,QAAQ,IAAI,CAACD,EAAUF,EAAQ,KAAK,CAAC,EAAE,KAAK,IAAM,CAC5CA,EAAQ,OAASC,GAAOA,EAAI,SAASD,CAAO,GAAGF,EAAkBE,CAAO,CAC9E,CAAC,EAAE,MAAMG,GAASH,EAAQ,KAAK,QAAS,CAAE,MAAAG,CAAM,CAAC,CAAC,CACpD",
6
+ "names": ["attach", "setRasterTerrain", "updateRasterTiles", "onPMTileAdd", "backend", "map", "attached", "error"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{releaseRasterTiles as r}from"./rasterTiles.js";import{onRemove3DLayer as i}from"./onRemove3DLayer.js";function l(e,o){r(e),e._terrain3D=null,i(e,o)}export{l as onPMTileRemove};
2
+ //# sourceMappingURL=onPMTileRemove.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/onPMTileRemove.js"],
4
+ "sourcesContent": ["import { releaseRasterTiles } from './rasterTiles.js';\nimport { onRemove3DLayer } from './onRemove3DLayer.js';\n\nexport function onPMTileRemove(backend, map) {\n releaseRasterTiles(backend);\n backend._terrain3D = null;\n onRemove3DLayer(backend, map);\n}\n"],
5
+ "mappings": "AAAA,OAAS,sBAAAA,MAA0B,mBACnC,OAAS,mBAAAC,MAAuB,uBAEzB,SAASC,EAAeC,EAASC,EAAK,CAC3CJ,EAAmBG,CAAO,EAC1BA,EAAQ,WAAa,KACrBF,EAAgBE,EAASC,CAAG,CAC9B",
6
+ "names": ["releaseRasterTiles", "onRemove3DLayer", "onPMTileRemove", "backend", "map"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{setHighlight as o}from"./setHighlight.js";import{showFeature as t}from"./showFeature.js";function n(e){e.hoveredFeature=null,o(e,null),t(e,null),e.fire("featurehover",{feature:null})}export{n as onPointerLeave};
2
+ //# sourceMappingURL=onPointerLeave.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/onPointerLeave.js"],
4
+ "sourcesContent": ["import { setHighlight } from './setHighlight.js';\nimport { showFeature } from './showFeature.js';\n\n/** Clear hover, highlight and tooltip without retaining a selected feature. */\n\nexport function onPointerLeave(layer) {\n layer.hoveredFeature = null;\n setHighlight(layer, null);\n showFeature(layer, null);\n layer.fire('featurehover', { feature: null });\n}\n"],
5
+ "mappings": "AAAA,OAAS,gBAAAA,MAAoB,oBAC7B,OAAS,eAAAC,MAAmB,mBAIrB,SAASC,EAAeC,EAAO,CACpCA,EAAM,eAAiB,KACvBH,EAAaG,EAAO,IAAI,EACxBF,EAAYE,EAAO,IAAI,EACvBA,EAAM,KAAK,eAAgB,CAAE,QAAS,IAAK,CAAC,CAC9C",
6
+ "names": ["setHighlight", "showFeature", "onPointerLeave", "layer"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{findFeature as r}from"./findFeature.js";import{setHighlight as t}from"./setHighlight.js";import{showFeature as i}from"./showFeature.js";function m(e,o){e.hoveredFeature=r(e,o),t(e,e.hoveredFeature),i(e,e.hoveredFeature,o),e.fire("featurehover",{feature:e.hoveredFeature,originalEvent:o})}export{m as onPointerMove};
2
+ //# sourceMappingURL=onPointerMove.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/onPointerMove.js"],
4
+ "sourcesContent": ["import { findFeature } from './findFeature.js';\nimport { setHighlight } from './setHighlight.js';\nimport { showFeature } from './showFeature.js';\n\n/** Hover is transient; featurehover also reports misses with feature:null. */\n\nexport function onPointerMove(layer, event) {\n layer.hoveredFeature = findFeature(layer, event);\n setHighlight(layer, layer.hoveredFeature);\n showFeature(layer, layer.hoveredFeature, event);\n layer.fire('featurehover', {\n feature: layer.hoveredFeature,\n originalEvent: event\n });\n}\n"],
5
+ "mappings": "AAAA,OAAS,eAAAA,MAAmB,mBAC5B,OAAS,gBAAAC,MAAoB,oBAC7B,OAAS,eAAAC,MAAmB,mBAIrB,SAASC,EAAcC,EAAOC,EAAO,CAC1CD,EAAM,eAAiBJ,EAAYI,EAAOC,CAAK,EAC/CJ,EAAaG,EAAOA,EAAM,cAAc,EACxCF,EAAYE,EAAOA,EAAM,eAAgBC,CAAK,EAC9CD,EAAM,KAAK,eAAgB,CACzB,QAASA,EAAM,eACf,cAAeC,CACjB,CAAC,CACH",
6
+ "names": ["findFeature", "setHighlight", "showFeature", "onPointerMove", "layer", "event"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import*as u from"./destroyTexture.js";import*as i from"./endZoom.js";import*as l from"./onMapChange.js";import*as _ from"./onPointerLeave.js";import*as m from"./onZoomAnim.js";import*as f from"./releaseArea.js";import{setParent as y}from"./setParent.js";import*as n from"./startZoom.js";import*as a from"./update.js";function z(e,r){e._added=Promise.withResolvers(),e.container&&(_.onPointerLeave(e),L.DomEvent.off(e.container,e._pointerEvents),e.container=null);for(const o of e._areas.values())f.releaseArea(e,o);e._areas.clear(),e._tooltip?.remove(),e._tooltip=null,(e.url||e._geojson)&&f.updateStatus(e,!1);const s=e._shared;if(s){if(y(e.root,null),s._layers.delete(e),s===e)if(r.off("move zoom rotate pitch resize viewreset layeradd layerremove",l.onMapChange,e),r.off("zoomstart",n.startZoom,e),r.off("zoomanim",m.onZoomAnim,e),r.off("zoomend",i.endZoom,e),cancelAnimationFrame(e._frame),e._frame=null,e._queued=!1,e._layers.size){const o=e._layers.values().next().value;for(const t of["_layers","_sceneOrigin","_size","_zoomLevel","_zoomTransitions","_zoomView","_cursor","_roofRaster"])o[t]=e[t],delete e[t];for(const t of o._layers)t._shared=o;L.Layer._renderers.set(r,o),r.on("move zoom rotate pitch resize viewreset layeradd layerremove",l.onMapChange,o),r.on("zoomstart",n.startZoom,o),r.on("zoomanim",m.onZoomAnim,o),r.on("zoomend",i.endZoom,o),a.update(o)}else{e._roofRaster&&u.destroyTexture(e,e._roofRaster.texture.texture),e._roofRaster=null;for(const t of e._zoomTransitions?.keys()||[])t.play();e._zoomTransitions=null,e._zoomView=null,delete r._cameraView,r.getContainer().classList.remove("leaflet-camera-zoom");const o=e.renderer;o.canvas.remove(),o.device.queue.onSubmittedWorkDone().then(()=>{o.depthTexture?.destroy(),o.roofFallbackTexture?.texture?.destroy(),o.uniformBuffer?.destroy(),o.sunlight?.texture?.destroy(),o.sunlight?.buffer?.destroy(),o.sunlight?.lights?.destroy(),o.device.destroy()},t=>{e.fire("error",{error:t}),o.device.destroy()}),L.Layer._renderers.delete(r);for(const t of["_layers","_sceneOrigin","_size","_zoomLevel","_cursor"])delete e[t]}else a.update(s);e._shared=e.renderer=e.scene=e.camera=null}}export{z as onRemove3DLayer};
2
+ //# sourceMappingURL=onRemove3DLayer.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/onRemove3DLayer.js"],
4
+ "sourcesContent": ["import * as destroyTexture from './destroyTexture.js';\nimport * as endZoom from './endZoom.js';\nimport * as onMapChange from './onMapChange.js';\nimport * as onPointerLeave from './onPointerLeave.js';\nimport * as onZoomAnim from './onZoomAnim.js';\nimport * as releaseArea from './releaseArea.js';\nimport { setParent } from './setParent.js';\nimport * as startZoom from './startZoom.js';\nimport * as update from './update.js';\n\n/** Release source meshes/UI; retain manually added objects and model CPU data. */\nexport function onRemove3DLayer(backend, map) {\n backend._added = Promise.withResolvers();\n if (backend.container) {\n onPointerLeave.onPointerLeave(backend);\n L.DomEvent.off(backend.container, backend._pointerEvents);\n backend.container = null;\n }\n for (const area of backend._areas.values()) releaseArea.releaseArea(backend, area);\n backend._areas.clear();\n backend._tooltip?.remove();\n backend._tooltip = null;\n if (backend.url || backend._geojson) releaseArea.updateStatus(backend, false);\n const shared = backend._shared;\n if (!shared) return;\n setParent(backend.root, null);\n shared._layers.delete(backend);\n if (shared === backend) {\n map.off('move zoom rotate pitch resize viewreset layeradd layerremove', onMapChange.onMapChange, backend);\n map.off('zoomstart', startZoom.startZoom, backend);\n map.off('zoomanim', onZoomAnim.onZoomAnim, backend);\n map.off('zoomend', endZoom.endZoom, backend);\n cancelAnimationFrame(backend._frame);\n backend._frame = null;\n backend._queued = false;\n if (backend._layers.size) {\n // Keep the original scene origin and GPU resources when ownership changes.\n const next = backend._layers.values().next().value;\n for (const key of ['_layers', '_sceneOrigin', '_size', '_zoomLevel', '_zoomTransitions', '_zoomView', '_cursor', '_roofRaster']) {\n next[key] = backend[key];\n delete backend[key];\n }\n for (const layer of next._layers) layer._shared = next;\n L.Layer._renderers.set(map, next);\n map.on('move zoom rotate pitch resize viewreset layeradd layerremove', onMapChange.onMapChange, next);\n map.on('zoomstart', startZoom.startZoom, next);\n map.on('zoomanim', onZoomAnim.onZoomAnim, next);\n map.on('zoomend', endZoom.endZoom, next);\n update.update(next);\n } else {\n if (backend._roofRaster) destroyTexture.destroyTexture(backend, backend._roofRaster.texture.texture);\n backend._roofRaster = null;\n for (const animation of backend._zoomTransitions?.keys() || []) animation.play();\n backend._zoomTransitions = null;\n backend._zoomView = null;\n delete map._cameraView;\n map.getContainer().classList.remove('leaflet-camera-zoom');\n const renderer = backend.renderer;\n renderer.canvas.remove();\n renderer.device.queue.onSubmittedWorkDone()\n .then(() => {\n renderer.depthTexture?.destroy();\n renderer.roofFallbackTexture?.texture?.destroy();\n renderer.uniformBuffer?.destroy();\n renderer.sunlight?.texture?.destroy();\n renderer.sunlight?.buffer?.destroy();\n renderer.sunlight?.lights?.destroy();\n renderer.device.destroy();\n }, error => {\n backend.fire('error', { error });\n renderer.device.destroy();\n });\n L.Layer._renderers.delete(map);\n for (const key of ['_layers', '_sceneOrigin', '_size', '_zoomLevel', '_cursor']) delete backend[key];\n }\n } else update.update(shared);\n backend._shared = backend.renderer = backend.scene = backend.camera = null;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["destroyTexture", "endZoom", "onMapChange", "onPointerLeave", "onZoomAnim", "releaseArea", "setParent", "startZoom", "update", "onRemove3DLayer", "backend", "map", "area", "shared", "next", "key", "layer", "animation", "renderer", "error"]
7
+ }
@@ -0,0 +1,2 @@
1
+ function e(o){o.control.remove()}export{e as onRemoveSun};
2
+ //# sourceMappingURL=onRemoveSun.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/onRemoveSun.js"],
4
+ "sourcesContent": ["export function onRemoveSun(layer) {\n layer.control.remove();\n}\n"],
5
+ "mappings": "AAAO,SAASA,EAAYC,EAAO,CACjCA,EAAM,QAAQ,OAAO,CACvB",
6
+ "names": ["onRemoveSun", "layer"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{loadTerrain as o}from"./loadTerrain.js";import{setRasterTerrain as t}from"./rasterTiles.js";import{onAdd3DLayer as n}from"./onAdd3DLayer.js";function s(r,e){if(e._terrain3D&&e._terrain3D!==r)throw new Error("Only one terrain layer can be active per map");e._terrain3D=r,n(r,e),r._terrainPromise=r.root?o(r):new Promise(i=>r.once("ready",()=>o(r).then(i),r)),e.eachLayer(i=>{i._type==="pmtiles"&&t(i,r)}),e.fire("terrainchange")}export{s as onTerrainAdd};
2
+ //# sourceMappingURL=onTerrainAdd.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/onTerrainAdd.js"],
4
+ "sourcesContent": ["import { loadTerrain } from \"./loadTerrain.js\";\nimport { setRasterTerrain } from \"./rasterTiles.js\";\nimport { onAdd3DLayer } from './onAdd3DLayer.js';\n\nexport function onTerrainAdd(backend, map) {\n if (map._terrain3D && map._terrain3D !== backend) {\n throw new Error('Only one terrain layer can be active per map');\n }\n map._terrain3D = backend;\n onAdd3DLayer(backend, map);\n backend._terrainPromise = backend.root\n ? loadTerrain(backend)\n : new Promise(resolve => backend.once('ready', () => loadTerrain(backend).then(resolve), backend));\n map.eachLayer(layer => {\n if (layer._type === 'pmtiles') setRasterTerrain(layer, backend);\n });\n map.fire('terrainchange');\n}\n"],
5
+ "mappings": "AAAA,OAAS,eAAAA,MAAmB,mBAC5B,OAAS,oBAAAC,MAAwB,mBACjC,OAAS,gBAAAC,MAAoB,oBAEtB,SAASC,EAAaC,EAASC,EAAK,CACzC,GAAIA,EAAI,YAAcA,EAAI,aAAeD,EACvC,MAAM,IAAI,MAAM,8CAA8C,EAEhEC,EAAI,WAAaD,EACjBF,EAAaE,EAASC,CAAG,EACzBD,EAAQ,gBAAkBA,EAAQ,KAC9BJ,EAAYI,CAAO,EACnB,IAAI,QAAQE,GAAWF,EAAQ,KAAK,QAAS,IAAMJ,EAAYI,CAAO,EAAE,KAAKE,CAAO,EAAGF,CAAO,CAAC,EACnGC,EAAI,UAAUE,GAAS,CACjBA,EAAM,QAAU,WAAWN,EAAiBM,EAAOH,CAAO,CAChE,CAAC,EACDC,EAAI,KAAK,eAAe,CAC1B",
6
+ "names": ["loadTerrain", "setRasterTerrain", "onAdd3DLayer", "onTerrainAdd", "backend", "map", "resolve", "layer"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{releaseArea as e}from"./releaseArea.js";import{updateArea as o}from"./updateArea.js";function f(r){if(r._map){for(const a of r._areas.values())e(r,a);r._areas.clear(),o(r)}}export{f as onTerrainChange};
2
+ //# sourceMappingURL=onTerrainChange.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/onTerrainChange.js"],
4
+ "sourcesContent": ["import { releaseArea } from \"./releaseArea.js\";\nimport { updateArea } from \"./updateArea.js\";\n\n/** GeoJSON source areas: loading, building and releasing. */\n\nexport function onTerrainChange(layer) {\n if (!layer._map) return;\n for (const area of layer._areas.values()) {\n releaseArea(layer, area);\n }\n layer._areas.clear();\n updateArea(layer);\n}\n"],
5
+ "mappings": "AAAA,OAAS,eAAAA,MAAmB,mBAC5B,OAAS,cAAAC,MAAkB,kBAIpB,SAASC,EAAgBC,EAAO,CACrC,GAAKA,EAAM,KACX,WAAWC,KAAQD,EAAM,OAAO,OAAO,EACrCH,EAAYG,EAAOC,CAAI,EAEzBD,EAAM,OAAO,MAAM,EACnBF,EAAWE,CAAK,EAClB",
6
+ "names": ["releaseArea", "updateArea", "onTerrainChange", "layer", "area"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{destroyTexture as t}from"./destroyTexture.js";import{conformModelToTerrain as n}from"./conformModelToTerrain.js";import{disposeMesh as s}from"./disposeMesh.js";import{setRasterTerrain as f}from"./rasterTiles.js";import{removeRasterTile as _}from"./removeRasterTile.js";import{setTerrainHeight as m}from"./setTerrainHeight.js";import{onRemove3DLayer as u}from"./onRemove3DLayer.js";function p(r,i){r._terrainController?.abort(),r._terrainLoading=!1,r._terrainReady=!1,i.eachLayer(e=>{e._type==="pmtiles"&&f(e,null)});for(const e of r._rasterTiles.keys())_(r,e);i._terrain3D===r&&delete i._terrain3D;for(const e of Object.values(i._layers))n(e,null),m(e);i.fire("terrainchange"),r._terrainTiles.clear(),r._terrainOriginElevation=0,r._terrainPromise=null,r._rasterProgram&&r._rasterProgram.pipelineCache.clear(),r._rasterProgram=null,r._dem&&t(r,r._dem.texture),r._dem=null;for(const e of r._terrainGrids?.values()||[])for(const o of Object.values(e))t(r,o.buffer);r._terrainGrids=null,r._bridges=null,s(r,r._bridgeMesh),r._bridgeMesh=null,u(r,i)}export{p as onTerrainRemove};
2
+ //# sourceMappingURL=onTerrainRemove.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/onTerrainRemove.js"],
4
+ "sourcesContent": ["import { destroyTexture } from './destroyTexture.js';\nimport { conformModelToTerrain } from './conformModelToTerrain.js';\nimport { disposeMesh } from './disposeMesh.js';\nimport { setRasterTerrain } from './rasterTiles.js';\nimport { removeRasterTile } from './removeRasterTile.js';\nimport { setTerrainHeight } from './setTerrainHeight.js';\nimport { onRemove3DLayer } from './onRemove3DLayer.js';\n\nexport function onTerrainRemove(layer, map) {\n layer._terrainController?.abort();\n layer._terrainLoading = false;\n layer._terrainReady = false;\n map.eachLayer(layer => {\n if (layer._type === 'pmtiles') setRasterTerrain(layer, null);\n });\n for (const tile of layer._rasterTiles.keys()) removeRasterTile(layer, tile);\n if (map._terrain3D === layer) delete map._terrain3D;\n for (const l of Object.values(map._layers)) {\n conformModelToTerrain(l, null);\n setTerrainHeight(l);\n }\n map.fire('terrainchange');\n layer._terrainTiles.clear();\n layer._terrainOriginElevation = 0;\n layer._terrainPromise = null;\n if (layer._rasterProgram) {\n layer._rasterProgram.pipelineCache.clear();\n }\n layer._rasterProgram = null;\n if (layer._dem) destroyTexture(layer, layer._dem.texture);\n layer._dem = null;\n for (const grid of layer._terrainGrids?.values() || []) {\n for (const attribute of Object.values(grid)) destroyTexture(layer, attribute.buffer);\n }\n layer._terrainGrids = null;\n layer._bridges = null;\n disposeMesh(layer, layer._bridgeMesh);\n layer._bridgeMesh = null;\n onRemove3DLayer(layer, map);\n}\n"],
5
+ "mappings": "AAAA,OAAS,kBAAAA,MAAsB,sBAC/B,OAAS,yBAAAC,MAA6B,6BACtC,OAAS,eAAAC,MAAmB,mBAC5B,OAAS,oBAAAC,MAAwB,mBACjC,OAAS,oBAAAC,MAAwB,wBACjC,OAAS,oBAAAC,MAAwB,wBACjC,OAAS,mBAAAC,MAAuB,uBAEzB,SAASC,EAAgBC,EAAOC,EAAK,CAC1CD,EAAM,oBAAoB,MAAM,EAChCA,EAAM,gBAAkB,GACxBA,EAAM,cAAgB,GACtBC,EAAI,UAAUD,GAAS,CACjBA,EAAM,QAAU,WAAWL,EAAiBK,EAAO,IAAI,CAC7D,CAAC,EACD,UAAWE,KAAQF,EAAM,aAAa,KAAK,EAAGJ,EAAiBI,EAAOE,CAAI,EACtED,EAAI,aAAeD,GAAO,OAAOC,EAAI,WACzC,UAAWE,KAAK,OAAO,OAAOF,EAAI,OAAO,EACvCR,EAAsBU,EAAG,IAAI,EAC7BN,EAAiBM,CAAC,EAEpBF,EAAI,KAAK,eAAe,EACxBD,EAAM,cAAc,MAAM,EAC1BA,EAAM,wBAA0B,EAChCA,EAAM,gBAAkB,KACpBA,EAAM,gBACRA,EAAM,eAAe,cAAc,MAAM,EAE3CA,EAAM,eAAiB,KACnBA,EAAM,MAAMR,EAAeQ,EAAOA,EAAM,KAAK,OAAO,EACxDA,EAAM,KAAO,KACb,UAAWI,KAAQJ,EAAM,eAAe,OAAO,GAAK,CAAC,EACnD,UAAWK,KAAa,OAAO,OAAOD,CAAI,EAAGZ,EAAeQ,EAAOK,EAAU,MAAM,EAErFL,EAAM,cAAgB,KACtBA,EAAM,SAAW,KACjBN,EAAYM,EAAOA,EAAM,WAAW,EACpCA,EAAM,YAAc,KACpBF,EAAgBE,EAAOC,CAAG,CAC5B",
6
+ "names": ["destroyTexture", "conformModelToTerrain", "disposeMesh", "setRasterTerrain", "removeRasterTile", "setTerrainHeight", "onRemove3DLayer", "onTerrainRemove", "layer", "map", "tile", "l", "grid", "attribute"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{render as e}from"./render.js";function i(o){const t=this._map;o&&!this._zoomView&&(this._zoomView={from:t.getCenter(),zoom:t.getZoom(),to:o.center,targetZoom:o.zoom,start:performance.now()},t.getContainer().classList.add("leaflet-camera-zoom")),queueMicrotask(()=>{this._shared===this&&this.renderer&&e(this)})}export{i as onZoomAnim};
2
+ //# sourceMappingURL=onZoomAnim.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/onZoomAnim.js"],
4
+ "sourcesContent": ["import { render } from \"./render.js\";\n\n\nexport function onZoomAnim(event) {\n const map = this._map;\n if (event && !this._zoomView) {\n this._zoomView = { from: map.getCenter(), zoom: map.getZoom(), to: event.center,\n targetZoom: event.zoom, start: performance.now() };\n map.getContainer().classList.add('leaflet-camera-zoom');\n }\n queueMicrotask(() => {\n if (this._shared === this && this.renderer) render(this);\n });\n}\n"],
5
+ "mappings": "AAAA,OAAS,UAAAA,MAAc,cAGhB,SAASC,EAAWC,EAAO,CAChC,MAAMC,EAAM,KAAK,KACbD,GAAS,CAAC,KAAK,YACjB,KAAK,UAAY,CAAE,KAAMC,EAAI,UAAU,EAAG,KAAMA,EAAI,QAAQ,EAAG,GAAID,EAAM,OACvE,WAAYA,EAAM,KAAM,MAAO,YAAY,IAAI,CAAE,EACnDC,EAAI,aAAa,EAAE,UAAU,IAAI,qBAAqB,GAExD,eAAe,IAAM,CACf,KAAK,UAAY,MAAQ,KAAK,UAAUH,EAAO,IAAI,CACzD,CAAC,CACH",
6
+ "names": ["render", "onZoomAnim", "event", "map"]
7
+ }
@@ -0,0 +1,2 @@
1
+ const t=[[.86,.86,.88],[.1,.1,.12],[.5,.53,.57],[.65,.1,.08],[.12,.25,.55],[.85,.7,.15]];export{t as paints};
2
+ //# sourceMappingURL=paints.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/paints.js"],
4
+ "sourcesContent": ["// Built-in vehicles for the 'traffic' type. Models are [ring of [x, z], bottom, top, rgb, topRing?] convex prisms in metres;\n// forward is -z, right is +x. `topRing` (same length as `ring`) tapers the prism; rgb components above 1 are self-lit lamps.\nexport const paints = [\n [0.86, 0.86, 0.88],\n [0.1, 0.1, 0.12],\n [0.5, 0.53, 0.57],\n [0.65, 0.1, 0.08],\n [0.12, 0.25, 0.55],\n [0.85, 0.7, 0.15]\n];\n"],
5
+ "mappings": "AAEO,MAAMA,EAAS,CACpB,CAAC,IAAM,IAAM,GAAI,EACjB,CAAC,GAAK,GAAK,GAAI,EACf,CAAC,GAAK,IAAM,GAAI,EAChB,CAAC,IAAM,GAAK,GAAI,EAChB,CAAC,IAAM,IAAM,GAAI,EACjB,CAAC,IAAM,GAAK,GAAI,CAClB",
6
+ "names": ["paints"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{toSRGB as n}from"./toSRGB.js";import{channel as c}from"./channel.js";function g(t){if(t&&typeof t=="object"&&"h"in t){const o=t.s*Math.min(t.l,1-t.l);return{r:n(c(0,t.h,t.l,o)),g:n(c(8,t.h,t.l,o)),b:n(c(4,t.h,t.l,o))}}if(t&&typeof t=="object"&&"r"in t)return t;if(typeof t=="number")return{r:(t>>16&255)/255,g:(t>>8&255)/255,b:(t&255)/255};if(typeof t!="string"||!CSS.supports("color",t))throw new Error("Invalid 3D color");const r=document.createElement("canvas").getContext("2d");r.fillStyle=t,r.fillRect(0,0,1,1);const[i,f,p]=r.getImageData(0,0,1,1).data;return{r:i/255,g:f/255,b:p/255}}export{g as parseColor};
2
+ //# sourceMappingURL=parseColor.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/parseColor.js"],
4
+ "sourcesContent": ["import { toSRGB } from \"./toSRGB.js\";\nimport { channel } from \"./channel.js\";\n\n/**\n * HSL inputs are linear-space to preserve the original building styling.\n * Numeric/CSS/RGB inputs are already sRGB; CSS alpha is not used for extrusion.\n * @param {number|string|Object} value 0xRRGGBB, CSS color, {r,g,b}, or {h,s,l} in 0..1.\n * @returns {Object} sRGB {r,g,b} components in 0..1.\n */\n\nexport function parseColor(value) {\n if (value && typeof value === 'object' && 'h' in value) {\n const a = value.s * Math.min(value.l, 1 - value.l);\n return {\n r: toSRGB(channel(0, value.h, value.l, a)),\n g: toSRGB(channel(8, value.h, value.l, a)),\n b: toSRGB(channel(4, value.h, value.l, a))\n };\n }\n if (value && typeof value === 'object' && 'r' in value) {\n return value;\n }\n if (typeof value === 'number') {\n return {\n r: (value >> 16 & 255) / 255,\n g: (value >> 8 & 255) / 255,\n b: (value & 255) / 255,\n };\n }\n if (typeof value !== 'string' || !CSS.supports('color', value)) {\n throw new Error('Invalid 3D color');\n }\n const context = document.createElement('canvas').getContext('2d');\n context.fillStyle = value;\n context.fillRect(0, 0, 1, 1);\n const [r, g, b] = context.getImageData(0, 0, 1, 1).data;\n return {\n r: r / 255,\n g: g / 255,\n b: b / 255\n };\n}\n"],
5
+ "mappings": "AAAA,OAAS,UAAAA,MAAc,cACvB,OAAS,WAAAC,MAAe,eASjB,SAASC,EAAWC,EAAO,CAChC,GAAIA,GAAS,OAAOA,GAAU,UAAY,MAAOA,EAAO,CACtD,MAAMC,EAAID,EAAM,EAAI,KAAK,IAAIA,EAAM,EAAG,EAAIA,EAAM,CAAC,EACjD,MAAO,CACL,EAAGH,EAAOC,EAAQ,EAAGE,EAAM,EAAGA,EAAM,EAAGC,CAAC,CAAC,EACzC,EAAGJ,EAAOC,EAAQ,EAAGE,EAAM,EAAGA,EAAM,EAAGC,CAAC,CAAC,EACzC,EAAGJ,EAAOC,EAAQ,EAAGE,EAAM,EAAGA,EAAM,EAAGC,CAAC,CAAC,CAC3C,CACF,CACA,GAAID,GAAS,OAAOA,GAAU,UAAY,MAAOA,EAC/C,OAAOA,EAET,GAAI,OAAOA,GAAU,SACnB,MAAO,CACL,GAAIA,GAAS,GAAK,KAAO,IACzB,GAAIA,GAAS,EAAI,KAAO,IACxB,GAAIA,EAAQ,KAAO,GACrB,EAEF,GAAI,OAAOA,GAAU,UAAY,CAAC,IAAI,SAAS,QAASA,CAAK,EAC3D,MAAM,IAAI,MAAM,kBAAkB,EAEpC,MAAME,EAAU,SAAS,cAAc,QAAQ,EAAE,WAAW,IAAI,EAChEA,EAAQ,UAAYF,EACpBE,EAAQ,SAAS,EAAG,EAAG,EAAG,CAAC,EAC3B,KAAM,CAACC,EAAGC,EAAGC,CAAC,EAAIH,EAAQ,aAAa,EAAG,EAAG,EAAG,CAAC,EAAE,KACnD,MAAO,CACL,EAAGC,EAAI,IACP,EAAGC,EAAI,IACP,EAAGC,EAAI,GACT,CACF",
6
+ "names": ["toSRGB", "channel", "parseColor", "value", "a", "context", "r", "g", "b"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{box as r}from"./box.js";import{trousers as s,shirt as m,skin as o,dark as t}from"./skin.js";const a={body:[[r(-.17,.17,-.1,.1),.82,.95,s],[r(-.19,.19,-.11,.11),.95,1.44,m],[r(-.05,.05,-.05,.05),1.44,1.5,o],[r(-.1,.1,-.11,.1),1.5,1.72,o],[r(-.105,.105,-.06,.115),1.58,1.77,t],[r(-.105,.105,-.115,-.06),1.7,1.77,t]],leg:[[r(-.07,.07,-.07,.07),-.82,0,s],[r(-.07,.07,-.17,.07),-.9,-.82,t]],arm:[[r(-.05,.05,-.05,.05),-.55,0,m],[r(-.045,.045,-.045,.045),-.66,-.55,o]]};export{a as parts};
2
+ //# sourceMappingURL=parts.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/parts.js"],
4
+ "sourcesContent": ["import { box } from \"./box.js\";\nimport { trousers, shirt, skin, dark } from \"./skin.js\";\n\n\nexport const parts = {\n body: [\n [box(-0.17, 0.17, -0.1, 0.1), 0.82, 0.95, trousers],\n [box(-0.19, 0.19, -0.11, 0.11), 0.95, 1.44, shirt],\n [box(-0.05, 0.05, -0.05, 0.05), 1.44, 1.5, skin],\n [box(-0.1, 0.1, -0.11, 0.1), 1.5, 1.72, skin],\n [box(-0.105, 0.105, -0.06, 0.115), 1.58, 1.77, dark],\n [box(-0.105, 0.105, -0.115, -0.06), 1.7, 1.77, dark],\n ],\n leg: [[box(-0.07, 0.07, -0.07, 0.07), -0.82, 0, trousers], [box(-0.07, 0.07, -0.17, 0.07), -0.9, -0.82, dark]],\n arm: [[box(-0.05, 0.05, -0.05, 0.05), -0.55, 0, shirt], [box(-0.045, 0.045, -0.045, 0.045), -0.66, -0.55, skin]],\n};\n"],
5
+ "mappings": "AAAA,OAAS,OAAAA,MAAW,WACpB,OAAS,YAAAC,EAAU,SAAAC,EAAO,QAAAC,EAAM,QAAAC,MAAY,YAGrC,MAAMC,EAAQ,CACnB,KAAM,CACJ,CAACL,EAAI,KAAO,IAAM,IAAM,EAAG,EAAG,IAAM,IAAMC,CAAQ,EAClD,CAACD,EAAI,KAAO,IAAM,KAAO,GAAI,EAAG,IAAM,KAAME,CAAK,EACjD,CAACF,EAAI,KAAO,IAAM,KAAO,GAAI,EAAG,KAAM,IAAKG,CAAI,EAC/C,CAACH,EAAI,IAAM,GAAK,KAAO,EAAG,EAAG,IAAK,KAAMG,CAAI,EAC5C,CAACH,EAAI,MAAQ,KAAO,KAAO,IAAK,EAAG,KAAM,KAAMI,CAAI,EACnD,CAACJ,EAAI,MAAQ,KAAO,MAAQ,IAAK,EAAG,IAAK,KAAMI,CAAI,CACrD,EACA,IAAK,CAAC,CAACJ,EAAI,KAAO,IAAM,KAAO,GAAI,EAAG,KAAO,EAAGC,CAAQ,EAAG,CAACD,EAAI,KAAO,IAAM,KAAO,GAAI,EAAG,IAAM,KAAOI,CAAI,CAAC,EAC7G,IAAK,CAAC,CAACJ,EAAI,KAAO,IAAM,KAAO,GAAI,EAAG,KAAO,EAAGE,CAAK,EAAG,CAACF,EAAI,MAAQ,KAAO,MAAQ,IAAK,EAAG,KAAO,KAAOG,CAAI,CAAC,CACjH",
6
+ "names": ["box", "trousers", "shirt", "skin", "dark", "parts"]
7
+ }
@@ -0,0 +1,2 @@
1
+ function l(c,s,t,o){const[M,h,a]=c,n=-M*Math.sin(o)*Math.sin(t)-h*Math.cos(t)-a*Math.cos(o)*Math.sin(t);return n>0?{left:s.x/2+s.y*1.5*(M*Math.cos(o)-a*Math.sin(o))/n,top:s.y/2-s.y*1.5*(-M*Math.sin(o)*Math.cos(t)+h*Math.sin(t)-a*Math.cos(o)*Math.cos(t))/n}:null}export{l as projectCelestialBody};
2
+ //# sourceMappingURL=projectCelestialBody.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/projectCelestialBody.js"],
4
+ "sourcesContent": ["/** Perspective projection of a celestial direction; null when behind the camera. */\n\nexport function projectCelestialBody(dir, size, pitch, bearing) {\n const [x, y, z] = dir;\n const forward = -x * Math.sin(bearing) * Math.sin(pitch) - y * Math.cos(pitch) - z * Math.cos(bearing) * Math.sin(pitch);\n if (forward > 0) {\n return {\n left: size.x / 2 + size.y * 1.5 * (x * Math.cos(bearing) - z * Math.sin(bearing)) / forward,\n top: size.y / 2 - size.y * 1.5 * (-x * Math.sin(bearing) * Math.cos(pitch) + y * Math.sin(pitch) - z * Math.cos(bearing) * Math.cos(pitch)) / forward\n };\n }\n return null;\n}\n"],
5
+ "mappings": "AAEO,SAASA,EAAqBC,EAAKC,EAAMC,EAAOC,EAAS,CAC9D,KAAM,CAACC,EAAGC,EAAGC,CAAC,EAAIN,EACZO,EAAU,CAACH,EAAI,KAAK,IAAID,CAAO,EAAI,KAAK,IAAID,CAAK,EAAIG,EAAI,KAAK,IAAIH,CAAK,EAAII,EAAI,KAAK,IAAIH,CAAO,EAAI,KAAK,IAAID,CAAK,EACvH,OAAIK,EAAU,EACL,CACL,KAAMN,EAAK,EAAI,EAAIA,EAAK,EAAI,KAAOG,EAAI,KAAK,IAAID,CAAO,EAAIG,EAAI,KAAK,IAAIH,CAAO,GAAKI,EACpF,IAAMN,EAAK,EAAI,EAAIA,EAAK,EAAI,KAAO,CAACG,EAAI,KAAK,IAAID,CAAO,EAAI,KAAK,IAAID,CAAK,EAAIG,EAAI,KAAK,IAAIH,CAAK,EAAII,EAAI,KAAK,IAAIH,CAAO,EAAI,KAAK,IAAID,CAAK,GAAKK,CACjJ,EAEK,IACT",
6
+ "names": ["projectCelestialBody", "dir", "size", "pitch", "bearing", "x", "y", "z", "forward"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{emptyNode as et}from"./emptyNode.js";import{isClockWise as ot}from"./isClockWise.js";import{lampPostGeometry as rt}from"./lampPostGeometry.js";import{lightGeometry as it}from"./lightGeometry.js";import{parseColor as nt}from"./parseColor.js";import{treeGeometry as st}from"./treeGeometry.js";import{triangulate as at}from"./triangulate.js";import{createProgram as ut}from"./createProgram.js";import{updateStatus as ft}from"./releaseArea.js";import{loadSource as ct}from"./loadSource.js";import{setParent as lt}from"./setParent.js";import{update as dt}from"./update.js";import{getElevation as H}from"./getElevation.js";function gt(K,m=K._map){const J=m&&L.Layer._renderers.get(m);if(!J)return;const q=[...J._layers].filter(t=>Number.isFinite(t._inflight)&&t._areas&&(t.url||t._geojson)),Q=q.flatMap(t=>[...t._areas.values()].filter(e=>!e.started&&!e.request.signal.aborted).map(e=>{const l=e.coords&&m.project(m.getCenter(),e.coords.z).divideBy(256);return{layer:t,area:e,distance:l?Math.hypot(e.coords.x+.5-l.x,e.coords.y+.5-l.y)/2**e.coords.z:0}})).sort((t,e)=>t.distance-e.distance);let T=q.reduce((t,e)=>t+e._inflight,0);for(const{layer:t,area:e}of Q){if(T>=4)break;t._inflight>=2||(e.started=!0,t._inflight++,T++,(async()=>{try{if(await new Promise(requestAnimationFrame),await m._terrain3D?._terrainPromise,e.request.signal.aborted)return;const l=e.coords,z=await ct(t,e);if(e.request.signal.aborted)return;if(z?.type!=="FeatureCollection"||!Array.isArray(z.features))throw new Error("Invalid GeoJSON response");if(t._geojson&&typeof t.options.style!="function")throw new Error("style must be a function");const Z=z.features,E=[],U=[],k=[],R=[],A=[],$=[],V=new Set;let D=0;const I=m.options.crs,j=I.project(t.location),O=Math.cos(t.location.lat*Math.PI/180),B=r=>r.ground||0,F=(r,o,c,v,f,h,i,a,u,d)=>{const g=c.x-r.x,P=v-o,S=r.y-c.y,p=f.x-r.x,y=h-o,n=r.y-f.y;if((P*n-S*y)*i+(S*p-g*n)*a+(g*y-P*p)*u<0){const s=c,w=v;c=f,v=h,f=s,h=w}E.push(r.x,o+B(r),-r.y,c.x,v+B(c),-c.y,f.x,h+B(f),-f.y),U.push(i,a,u,i,a,u,i,a,u),k.push(d.r,d.g,d.b,d.r,d.g,d.b,d.r,d.g,d.b),t.options.nightLight&&R.push(...r.uv,...c.uv,...f.uv)};let W=performance.now()+4;for(const r of Z){if(e.request.signal.aborted)return;if(performance.now()>=W){if(await new Promise(requestAnimationFrame),e.request.signal.aborted)return;W=performance.now()+4}const o=r?.geometry,c=o?.type==="Point";if(t.options.nightLight&&!c)throw new Error("Night lights require Point geometry");const v=o?.type==="Polygon"?[o.coordinates]:o?.type==="MultiPolygon"?o.coordinates:null;if(!v&&!c)throw new Error("Unsupported GeoJSON geometry");const[f,h]=(c?o.coordinates:v[0]?.[0]?.[0])??[];if(!Number.isFinite(f)||!Number.isFinite(h))throw new Error("Invalid GeoJSON coordinates");if(l){const p=m.project(new L.LatLng(h,f),l.z);if(Math.floor(p.x/256)!==l.x||Math.floor(p.y/256)!==l.y)continue}const i=t.options.style(r);if(i===null){D++;continue}if(!i||typeof i!="object")throw new Error("style must return an extrusion style or null");const{top:a,bottom:u=0,color:d=14267276}=i;if(!Number.isFinite(a)||!Number.isFinite(u)||u<0||a<=u)throw new Error("Invalid extrusion heights: expected top > bottom >= 0");const g=nt(d),P=E.length/3;if(c){const p=I.project(new L.LatLng(h,f)),y=m._terrain3D?H(m._terrain3D,[h,f]):void 0,n={x:(p.x-j.x)*O,y:(p.y-j.y)*O,ground:Number.isFinite(y)&&Number.isFinite(t.root.position[1])?y-t.root.position[1]:0};if(t.options.nightLight){if(!Number.isFinite(i.lightFlux)||i.lightFlux<=0)throw new Error("Invalid light flux");const s=r.properties?.cod_ouvrag||`${f},${h}`;i.poleRadius>0&&!V.has(s)&&(rt(n,i,F),V.add(s)),it(n,i,F),$.push({position:[n.x,n.ground+a,-n.y],radius:Math.hypot(a,i.lightRadius),color:[g.r,g.g,g.b],flux:i.lightFlux})}else st(n,i,F)}for(const p of v||[]){if(!p.length)throw new Error("Empty GeoJSON polygon");const y=p.map(s=>{if(s.length<4)throw new Error("Invalid GeoJSON polygon ring");return s.slice(0,-1).map(([w,b])=>{if(!Number.isFinite(w)||!Number.isFinite(b))throw new Error("Invalid GeoJSON coordinates");const _=I.project(new L.LatLng(b,w)),x=t._map._terrain3D?H(t._map._terrain3D,[b,w]):void 0;return{x:(_.x-j.x)*O,y:(_.y-j.y)*O,ground:Number.isFinite(x)&&Number.isFinite(t.root.position[1])?x-t.root.position[1]:0}})}),n=y.flat();for(const[s,w,b]of at(y[0],y.slice(1)))F(n[s],a,n[w],a,n[b],a,0,1,0,g),u>0&&F(n[s],u,n[w],u,n[b],u,0,-1,0,g);y.forEach((s,w)=>{const b=ot(s)===(w===0)?-1:1;for(let _=0;_<s.length;_++){const x=s[_],N=s[(_+1)%s.length],C=Math.hypot(N.x-x.x,N.y-x.y);if(!C)continue;const X=b*(N.y-x.y)/C,Y=b*(N.x-x.x)/C;F(x,u,N,u,N,a,X,0,Y,g),F(x,u,N,a,x,a,X,0,Y,g)}})}const S=E.length/3;A.push({id:r.id??r.properties?.objectid??JSON.stringify(o),properties:r.properties,baseColor:g,faceStart:P/3,faceEnd:S/3,vertexStart:P,vertexEnd:S})}if(!E.length){Object.assign(e,{mesh:null,buildings:0,skipped:D,done:!0});return}const G=t.renderer.device,M={position:{size:3,data:new Float32Array(E)},normal:{size:3,data:new Float32Array(U)},color:{size:3,data:new Float32Array(k)}};t.options.nightLight&&(M.uv={size:2,data:new Float32Array(R)});for(const[r,o]of Object.entries(M))o.count=o.data.length/o.size,o.buffer=G.createBuffer({size:Math.max(4,o.data.byteLength),usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST}),G.queue.writeBuffer(o.buffer,0,o.data);const tt={device:G,attributes:M,drawRange:{start:0,count:M.position.count}};Object.assign(e,{mesh:{...et(),device:G,geometry:tt,program:ut(t,{vertexColors:!0,roofTexture:!!t.options.roofTexture,...t.options.nightLight?{nightLight:!0,alphaMode:"BLEND",doubleSided:!0}:{}}),id:L.Layer._nextId++,renderOrder:0,fadeDuration:250,extras:{featureFaces:A,lights:$}},buildings:A.length,skipped:D,done:!0}),lt(e.mesh,t.root),dt(t)}catch(l){if(e.request.signal.aborted)return;e.error=l.message,t.fire("error",{error:l})}})().finally(()=>{t._inflight--,gt(t,m)}))}for(const t of q)ft(t)}export{gt as pump};
2
+ //# sourceMappingURL=pump.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/pump.js"],
4
+ "sourcesContent": ["import { emptyNode } from \"./emptyNode.js\";\nimport { isClockWise } from \"./isClockWise.js\";\nimport { lampPostGeometry } from \"./lampPostGeometry.js\";\nimport { lightGeometry } from \"./lightGeometry.js\";\nimport { parseColor } from \"./parseColor.js\";\nimport { treeGeometry } from \"./treeGeometry.js\";\nimport { triangulate } from \"./triangulate.js\";\nimport { createProgram } from './createProgram.js';\nimport { updateStatus } from \"./releaseArea.js\";\nimport { loadSource } from './loadSource.js';\nimport { setParent } from './setParent.js';\nimport { update } from './update.js';\nimport { getElevation } from \"./getElevation.js\";\n\n/** Share four load/build slots across source layers, nearest ground blocks first. */\n\nexport function pump(backend, map = backend._map) {\n // Meshes need the shared renderer; _attach() re-runs _updateArea() once it exists.\n const shared = map && L.Layer._renderers.get(map);\n if (!shared) return;\n const layers = [...shared._layers].filter(layer =>\n Number.isFinite(layer._inflight) && layer._areas && (layer.url || layer._geojson));\n const pending = layers.flatMap(layer => [...layer._areas.values()]\n .filter(area => !area.started && !area.request.signal.aborted)\n .map(area => {\n const center = area.coords && map.project(map.getCenter(), area.coords.z).divideBy(256);\n return { layer, area, distance: center\n ? Math.hypot(area.coords.x + 0.5 - center.x, area.coords.y + 0.5 - center.y) / 2 ** area.coords.z : 0 };\n })).sort((a, b) => a.distance - b.distance);\n let inflight = layers.reduce((sum, layer) => sum + layer._inflight, 0);\n for (const { layer: backend, area } of pending) {\n if (inflight >= 4) break;\n if (backend._inflight >= 2) continue;\n area.started = true;\n backend._inflight++;\n inflight++;\n (async () => {\n try {\n // Let ground requests start first, and avoid rebuilding flat geometry when the DEM arrives.\n await new Promise(requestAnimationFrame);\n await map._terrain3D?._terrainPromise;\n if (area.request.signal.aborted) return;\n const coords = area.coords;\n const data = await loadSource(backend, area);\n if (area.request.signal.aborted) return;\n if (data?.type !== 'FeatureCollection' || !Array.isArray(data.features)) {\n throw new Error('Invalid GeoJSON response');\n }\n if (backend._geojson && typeof backend.options.style !== 'function') {\n throw new Error('style must be a function');\n }\n const features = data.features;\n const positions = [], normals = [], colors = [], uvs = [], featureFaces = [], lights = [];\n const supports = new Set();\n let skipped = 0;\n const crs = map.options.crs;\n const origin = crs.project(backend.location);\n const metres = Math.cos(backend.location.lat * Math.PI / 180);\n const groundOffset = point => point.ground || 0;\n const addTriangle = (a, ah, b, bh, c, ch, nx, ny, nz, color) => {\n const ux = b.x - a.x, uy = bh - ah, uz = a.y - b.y;\n const vx = c.x - a.x, vy = ch - ah, vz = a.y - c.y;\n // Orient the triangle to its intended outward normal after flipping north to -z.\n if ((uy * vz - uz * vy) * nx + (uz * vx - ux * vz) * ny + (ux * vy - uy * vx) * nz < 0) {\n const point = b, height = bh;\n b = c; bh = ch; c = point; ch = height;\n }\n positions.push(a.x, ah + groundOffset(a), -a.y,\n b.x, bh + groundOffset(b), -b.y,\n c.x, ch + groundOffset(c), -c.y);\n normals.push(nx, ny, nz, nx, ny, nz, nx, ny, nz);\n colors.push(color.r, color.g, color.b, color.r, color.g, color.b, color.r, color.g, color.b);\n if (backend.options.nightLight) uvs.push(...a.uv, ...b.uv, ...c.uv);\n };\n let deadline = performance.now() + 4;\n for (const feature of features) {\n if (area.request.signal.aborted) return;\n if (performance.now() >= deadline) {\n await new Promise(requestAnimationFrame);\n if (area.request.signal.aborted) return;\n deadline = performance.now() + 4;\n }\n const geometry = feature?.geometry;\n const isTree = geometry?.type === 'Point';\n if (backend.options.nightLight && !isTree) throw new Error('Night lights require Point geometry');\n const polygons = geometry?.type === 'Polygon' ? [geometry.coordinates] : geometry?.type === 'MultiPolygon' ? geometry.coordinates : null;\n if (!polygons && !isTree) throw new Error('Unsupported GeoJSON geometry');\n const [lon, lat] = (isTree ? geometry.coordinates : polygons[0]?.[0]?.[0]) ?? [];\n if (!Number.isFinite(lon) || !Number.isFinite(lat)) throw new Error('Invalid GeoJSON coordinates');\n if (coords) {\n const anchor = map.project(new L.LatLng(lat, lon), coords.z);\n // Overlapping archive blocks may contain the same polygon; its first vertex owns it.\n if (Math.floor(anchor.x / 256) !== coords.x || Math.floor(anchor.y / 256) !== coords.y) continue;\n }\n const style = backend.options.style(feature);\n if (style === null) {\n skipped++;\n continue;\n }\n if (!style || typeof style !== 'object') throw new Error('style must return an extrusion style or null');\n const { top, bottom = 0, color = 0xd9b38c } = style;\n if (!Number.isFinite(top) || !Number.isFinite(bottom) || bottom < 0 || top <= bottom) {\n throw new Error('Invalid extrusion heights: expected top > bottom >= 0');\n }\n const baseColor = parseColor(color);\n const vertexStart = positions.length / 3;\n if (isTree) {\n const point = crs.project(new L.LatLng(lat, lon));\n const elevation = map._terrain3D ? getElevation(map._terrain3D, [lat, lon]) : undefined;\n const projected = {\n x: (point.x - origin.x) * metres, y: (point.y - origin.y) * metres,\n ground: Number.isFinite(elevation) && Number.isFinite(backend.root.position[1])\n ? elevation - backend.root.position[1] : 0,\n };\n if (backend.options.nightLight) {\n if (!Number.isFinite(style.lightFlux) || style.lightFlux <= 0) throw new Error('Invalid light flux');\n const support = feature.properties?.cod_ouvrag || `${lon},${lat}`;\n if (style.poleRadius > 0 && !supports.has(support)) {\n lampPostGeometry(projected, style, addTriangle);\n supports.add(support);\n }\n lightGeometry(projected, style, addTriangle);\n lights.push({\n position: [projected.x, projected.ground + top, -projected.y],\n radius: Math.hypot(top, style.lightRadius), color: [baseColor.r, baseColor.g, baseColor.b],\n flux: style.lightFlux,\n });\n } else treeGeometry(projected, style, addTriangle);\n }\n for (const rings of polygons || []) {\n if (!rings.length) throw new Error('Empty GeoJSON polygon');\n const paths = rings.map(ring => {\n if (ring.length < 4) throw new Error('Invalid GeoJSON polygon ring');\n return ring.slice(0, -1).map(([lng, lat]) => {\n if (!Number.isFinite(lng) || !Number.isFinite(lat)) throw new Error('Invalid GeoJSON coordinates');\n const point = crs.project(new L.LatLng(lat, lng));\n const elevation = backend._map._terrain3D ? getElevation(backend._map._terrain3D, [lat, lng]) : undefined;\n return {\n x: (point.x - origin.x) * metres,\n y: (point.y - origin.y) * metres,\n ground: Number.isFinite(elevation) && Number.isFinite(backend.root.position[1])\n ? elevation - backend.root.position[1] : 0,\n };\n });\n });\n const points = paths.flat();\n for (const [a, b, c] of triangulate(paths[0], paths.slice(1))) {\n addTriangle(points[a], top, points[b], top, points[c], top, 0, 1, 0, baseColor);\n if (bottom > 0) addTriangle(points[a], bottom, points[b], bottom, points[c], bottom, 0, -1, 0, baseColor);\n }\n paths.forEach((path, index) => {\n // Interior walls face into the courtyard; exterior walls face away from the building.\n const sign = isClockWise(path) === (index === 0) ? -1 : 1;\n for (let i = 0; i < path.length; i++) {\n const a = path[i], b = path[(i + 1) % path.length];\n const length = Math.hypot(b.x - a.x, b.y - a.y);\n if (!length) continue;\n const nx = sign * (b.y - a.y) / length, nz = sign * (b.x - a.x) / length;\n addTriangle(a, bottom, b, bottom, b, top, nx, 0, nz, baseColor);\n addTriangle(a, bottom, b, top, a, top, nx, 0, nz, baseColor);\n }\n });\n }\n const vertexEnd = positions.length / 3;\n featureFaces.push({\n id: feature.id ?? feature.properties?.objectid ?? JSON.stringify(geometry),\n properties: feature.properties, baseColor,\n faceStart: vertexStart / 3, faceEnd: vertexEnd / 3, vertexStart, vertexEnd,\n });\n }\n if (!positions.length) {\n Object.assign(area, { mesh: null, buildings: 0, skipped, done: true });\n return;\n }\n const device = backend.renderer.device;\n const attributes = {\n position: { size: 3, data: new Float32Array(positions) },\n normal: { size: 3, data: new Float32Array(normals) },\n color: { size: 3, data: new Float32Array(colors) },\n };\n if (backend.options.nightLight) attributes.uv = { size: 2, data: new Float32Array(uvs) };\n for (const [name, attribute] of Object.entries(attributes)) {\n attribute.count = attribute.data.length / attribute.size;\n attribute.buffer = device.createBuffer({\n size: Math.max(4, attribute.data.byteLength),\n usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n });\n device.queue.writeBuffer(attribute.buffer, 0, attribute.data);\n }\n const meshGeometry = {\n device,\n attributes,\n drawRange: { start: 0, count: attributes.position.count },\n };\n Object.assign(area, {\n mesh: {\n ...emptyNode(),\n device,\n geometry: meshGeometry,\n program: createProgram(backend, {\n vertexColors: true, roofTexture: Boolean(backend.options.roofTexture),\n ...(backend.options.nightLight ? { nightLight: true, alphaMode: 'BLEND', doubleSided: true } : {})\n }),\n id: L.Layer._nextId++,\n renderOrder: 0,\n fadeDuration: 250,\n extras: { featureFaces, lights },\n },\n buildings: featureFaces.length,\n skipped,\n done: true\n });\n setParent(area.mesh, backend.root);\n update(backend);\n } catch (error) {\n if (area.request.signal.aborted) return;\n area.error = error.message;\n backend.fire('error', { error });\n }\n })().finally(() => {\n backend._inflight--;\n pump(backend, map);\n });\n }\n for (const layer of layers) updateStatus(layer);\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["emptyNode", "isClockWise", "lampPostGeometry", "lightGeometry", "parseColor", "treeGeometry", "triangulate", "createProgram", "updateStatus", "loadSource", "setParent", "update", "getElevation", "pump", "backend", "map", "shared", "layers", "layer", "pending", "area", "center", "a", "b", "inflight", "sum", "coords", "data", "features", "positions", "normals", "colors", "uvs", "featureFaces", "lights", "supports", "skipped", "crs", "origin", "metres", "groundOffset", "point", "addTriangle", "ah", "bh", "c", "ch", "nx", "ny", "nz", "color", "ux", "uy", "uz", "vx", "vy", "vz", "height", "deadline", "feature", "geometry", "isTree", "polygons", "lon", "lat", "anchor", "style", "top", "bottom", "baseColor", "vertexStart", "elevation", "projected", "support", "rings", "paths", "ring", "lng", "points", "path", "index", "sign", "i", "length", "vertexEnd", "device", "attributes", "name", "attribute", "meshGeometry", "error"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{addRasterTile as D}from"./addRasterTile.js";import{createProgram as U}from"./createProgram.js";import{destroyTexture as z}from"./destroyTexture.js";import{removeRasterTile as M}from"./removeRasterTile.js";import{setParent as c}from"./setParent.js";import{update as x}from"./update.js";const u=256,T=6;function q(r){const e=r._map;if(!e||!r._shared||!r.header)return;const t=Math.max(r.header.minZoom??0,Math.min(Math.round(e.getZoom()),r.options.maxZoom,r.options.maxNativeZoom));r._tileZoom=t;const o=e.getBounds(),i=e.project(o.getNorthWest(),t).divideBy(u).floor(),s=e.project(o.getSouthEast(),t).divideBy(u).floor(),m=r.header.maxLat===void 0||r.header.minLon===void 0?new L.Point(0,0):e.project([r.header.maxLat,r.header.minLon],t).divideBy(u).floor(),a=r.header.minLat===void 0||r.header.maxLon===void 0?new L.Point(2**t-1,2**t-1):e.project([r.header.minLat,r.header.maxLon],t).divideBy(u).floor(),n=e.project(e.getCenter(),t).divideBy(u).floor(),p=new Map;for(let l=Math.max(0,i.x,m.x,n.x-T);l<=Math.min(2**t-1,s.x,a.x,n.x+T);l++)for(let f=Math.max(0,i.y,m.y,n.y-T);f<=Math.min(2**t-1,s.y,a.y,n.y+T);f++)p.set(`${t}/${l}/${f}`,{z:t,x:l,y:f});r._wantedRasterTiles=new Set(p.keys());const h=new Map,g=Math.max(r.header.minZoom??0,t-2),y=2**(t-g);if(g<t)for(const[l,f]of p){if(r._rasterTiles.get(l)?.done)continue;const _={z:g,x:Math.floor(f.x/y),y:Math.floor(f.y/y)};h.set(`${_.z}/${_.x}/${_.y}`,_)}const w=new Map([...h,...p]);for(const[l,f]of r._rasterTiles)!w.has(l)&&!f.done&&d(r,f);for(const[l,f]of w){if(r._rasterTiles.has(l))continue;const _={coords:f,request:new AbortController,done:!1};r._rasterTiles.set(l,_)}v(r),R(r)}function v(r){const e=r._map;if(!e)return;const t=e.project(e.getCenter(),0).divideBy(u),o=[...r._rasterTiles.values()].filter(s=>!s.started&&!s.request.signal.aborted),i=({coords:s})=>Math.hypot((s.x+.5)/2**s.z-t.x,(s.y+.5)/2**s.z-t.y);o.sort((s,m)=>s.coords.z-m.coords.z||i(s)-i(m));for(const s of o){if(r._loadingTiles>=4)break;A(r,s)}}function S(r){for(const e of r._rasterTiles.values())d(r,e);if(r._rasterProgram?.pipelineCache.clear(),r._rasterProgram=null,r._rasterGeometry){for(const e of Object.values(r._rasterGeometry.attributes))z(r,e.buffer);r._rasterGeometry=null}}function j(r,e){if(r._terrain3D!==e){for(const t of r._rasterTiles.values())r._terrain3D&&M(r._terrain3D,t),t.mesh&&(t.mesh.visible=!0,c(t.mesh,r.root));if(r._terrain3D=e||null,e)for(const t of r._rasterTiles.values())t.done&&P(r,t.coords,t)}}function P(r,e,t){r._terrain3D&&t.done&&!t.request.signal.aborted&&r._rasterTiles.get(`${e.z}/${e.x}/${e.y}`)===t&&D(r._terrain3D,r,e,t).catch(o=>r.fire("tileerror",{tile:t,coords:e,error:o}))}function O(r,e){for(const t of r._rasterTiles.values()){t.mesh&&(t.mesh.opacity=e);const o=r._terrain3D?._rasterTiles.get(t);o&&(o.opacity=e)}x(r)}function C(r,e){for(const t of r._rasterTiles.values()){t.mesh&&(t.mesh.renderOrder=e);const o=r._terrain3D?._rasterTiles.get(t);o&&(o.renderOrder=e)}x(r)}function F(){return new L.Point(u,u)}function A(r,e){e.started=!0;const t=r._loadingTiles===0;return r._loadingTiles++,r.fire("tileloadstart",{tile:e,coords:e.coords}),t&&r.fire("loading"),Promise.resolve(r.ready).then(()=>r.options.archive.getZxy(e.coords.z,e.coords.x,e.coords.y,e.request.signal)).then(async o=>{if(!e.request.signal.aborted){if(!o)throw new Error(`Tile ${e.coords.z}/${e.coords.x}/${e.coords.y} is not in the offline archive`);try{e.image=await createImageBitmap(new Blob([o.data]))}catch{throw new Error(`Unable to decode tile ${e.coords.z}/${e.coords.x}/${e.coords.y}`)}if(e.request.signal.aborted){e.image.close(),e.image=null;return}$(r,e),e.loadedAt=performance.now(),e.done=!0,r._rasterVersion=(r._rasterVersion||0)+1,P(r,e.coords,e),r.fire("tileload",{tile:e,coords:e.coords}),x(r)}}).catch(o=>{e.request.signal.aborted||(e.error=o.message,r._rasterVersion=(r._rasterVersion||0)+1,r.fire("tileerror",{tile:e,coords:e.coords,error:o}),r.fire("error",{error:o,coords:e.coords}))}).finally(()=>{r._loadingTiles--,r._map&&(v(r),R(r),r._loadingTiles||r.fire("load"),x(r))})}function $(r,e){const t=r.renderer.device,o={device:t,texture:t.createTexture({size:[e.image.width,e.image.height],format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),sampler:t.createSampler({addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge",magFilter:"linear",minFilter:"linear"}),image:e.image,format:"rgba8unorm",srgb:!1,uploaded:null};r._rasterProgram||(r._rasterProgram=U(r,{baseTexture:o,unlit:!0,alphaMode:"BLEND"})),r._rasterGeometry||(r._rasterGeometry=B(t));const{coords:i}=e,s=r._map.options.crs,m=s.project(r.location),a=Math.cos(r.location.lat*Math.PI/180),n=s.scale(i.z),p=s.transformation.untransform(new L.Point(i.x*u,i.y*u),n),h=s.transformation.untransform(new L.Point((i.x+1)*u,(i.y+1)*u),n),g=(h.x-p.x)*a,y=-(h.y-p.y)*a;e.texture=o,e.mesh={position:[(p.x-m.x)*a,0,-(p.y-m.y)*a],rotation:[0,0,0],scale:[g,1,y],worldMatrix:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],children:[],visible:!0,device:t,geometry:r._rasterGeometry,program:r._rasterProgram,texture:o,opacity:r.options.opacity,id:L.Layer._nextId++,renderOrder:r.options.zIndex||0,tile:e,fadeDuration:250,ground:!0},c(e.mesh,r.root)}function B(r){const e={position:{size:3,data:new Float32Array([0,0,0,1,0,0,0,0,1,1,0,1])},normal:{size:3,data:new Float32Array([0,1,0,0,1,0,0,1,0,0,1,0])},uv:{size:2,data:new Float32Array([0,0,1,0,0,1,1,1])},index:{data:new Uint16Array([0,2,1,1,2,3])}};for(const[t,o]of Object.entries(e))o.count=o.data.length/(o.size||1),o.indexFormat="uint16",o.buffer=r.createBuffer({size:o.data.byteLength,usage:t==="index"?GPUBufferUsage.INDEX|GPUBufferUsage.COPY_DST:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST}),r.queue.writeBuffer(o.buffer,0,o.data);return{device:r,attributes:e,drawRange:{start:0,count:e.index.count}}}function d(r,e){const t=`${e.coords.z}/${e.coords.x}/${e.coords.y}`;r._rasterTiles.get(t)===e&&(r._rasterTiles.delete(t),r._rasterVersion=(r._rasterVersion||0)+1,e.request.abort(),r._terrain3D&&M(r._terrain3D,e),e.mesh&&c(e.mesh,null),e.texture&&z(r,e.texture.texture),e.image?.close(),r.fire("tileunload",{tile:e,coords:e.coords}),x(r))}function R(r){const e=r._wantedRasterTiles,t=performance.now();if(r._pruneVersion===r._rasterVersion&&r._pruneWanted===e&&t<r._pruneAfter)return Number.isFinite(r._pruneAfter);r._pruneVersion=r._rasterVersion,r._pruneWanted=e,r._pruneAfter=1/0;const o=[...e].filter(i=>{const s=r._rasterTiles.get(i);return s?.done&&t-s.loadedAt<250&&(r._pruneAfter=Math.min(r._pruneAfter,s.loadedAt+250)),!s?.done||t-s.loadedAt<250}).map(i=>{const[s,m,a]=i.split("/").map(Number);return{z:s,x:m,y:a}});for(const[i,s]of r._rasterTiles){if(e.has(i))continue;o.some(a=>{const n=Math.min(a.z,s.coords.z);return Math.floor(a.x/2**(a.z-n))===Math.floor(s.coords.x/2**(s.coords.z-n))&&Math.floor(a.y/2**(a.z-n))===Math.floor(s.coords.y/2**(s.coords.z-n))})||d(r,s)}return Number.isFinite(r._pruneAfter)}export{F as getRasterTileSize,R as pruneRasterTiles,P as registerTerrainTile,S as releaseRasterTiles,O as setRasterOpacity,j as setRasterTerrain,C as setRasterZIndex,q as updateRasterTiles};
2
+ //# sourceMappingURL=rasterTiles.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/rasterTiles.js"],
4
+ "sourcesContent": ["import { addRasterTile } from './addRasterTile.js';\r\nimport { createProgram } from './createProgram.js';\r\nimport { destroyTexture } from './destroyTexture.js';\r\nimport { removeRasterTile } from './removeRasterTile.js';\r\nimport { setParent } from './setParent.js';\r\nimport { update } from './update.js';\r\n\r\nconst TILE_SIZE = 256;\r\n// ponytail: cap horizon views at 169 tiles; raise the radius if extreme pitches need more.\r\nconst TILE_RADIUS = 6;\r\n\r\nexport function updateRasterTiles(backend) {\r\n const map = backend._map;\r\n if (!map || !backend._shared || !backend.header) return;\r\n\r\n const zoom = Math.max(backend.header.minZoom ?? 0, Math.min(\r\n Math.round(map.getZoom()),\r\n backend.options.maxZoom,\r\n backend.options.maxNativeZoom\r\n ));\r\n backend._tileZoom = zoom;\r\n const bounds = map.getBounds();\r\n const northWest = map.project(bounds.getNorthWest(), zoom).divideBy(TILE_SIZE).floor();\r\n const southEast = map.project(bounds.getSouthEast(), zoom).divideBy(TILE_SIZE).floor();\r\n const archiveNorthWest = backend.header.maxLat === undefined || backend.header.minLon === undefined\r\n ? new L.Point(0, 0)\r\n : map.project([backend.header.maxLat, backend.header.minLon], zoom).divideBy(TILE_SIZE).floor();\r\n const archiveSouthEast = backend.header.minLat === undefined || backend.header.maxLon === undefined\r\n ? new L.Point(2 ** zoom - 1, 2 ** zoom - 1)\r\n : map.project([backend.header.minLat, backend.header.maxLon], zoom).divideBy(TILE_SIZE).floor();\r\n const center = map.project(map.getCenter(), zoom).divideBy(TILE_SIZE).floor();\r\n const wanted = new Map();\r\n for (let x = Math.max(0, northWest.x, archiveNorthWest.x, center.x - TILE_RADIUS);\r\n x <= Math.min(2 ** zoom - 1, southEast.x, archiveSouthEast.x, center.x + TILE_RADIUS); x++) {\r\n for (let y = Math.max(0, northWest.y, archiveNorthWest.y, center.y - TILE_RADIUS);\r\n y <= Math.min(2 ** zoom - 1, southEast.y, archiveSouthEast.y, center.y + TILE_RADIUS); y++) {\r\n wanted.set(`${zoom}/${x}/${y}`, { z: zoom, x, y });\r\n }\r\n }\r\n backend._wantedRasterTiles = new Set(wanted.keys());\r\n const coverage = new Map();\r\n const parentZoom = Math.max(backend.header.minZoom ?? 0, zoom - 2), factor = 2 ** (zoom - parentZoom);\r\n if (parentZoom < zoom) {\r\n for (const [key, coords] of wanted) {\r\n if (backend._rasterTiles.get(key)?.done) continue;\r\n const parent = { z: parentZoom, x: Math.floor(coords.x / factor), y: Math.floor(coords.y / factor) };\r\n coverage.set(`${parent.z}/${parent.x}/${parent.y}`, parent);\r\n }\r\n }\r\n const required = new Map([...coverage, ...wanted]);\r\n for (const [key, tile] of backend._rasterTiles) {\r\n if (!required.has(key) && !tile.done) releaseRasterTile(backend, tile);\r\n }\r\n for (const [key, coords] of required) {\r\n if (backend._rasterTiles.has(key)) continue;\r\n const tile = { coords, request: new AbortController(), done: false };\r\n backend._rasterTiles.set(key, tile);\r\n }\r\n pumpRasterTiles(backend);\r\n pruneRasterTiles(backend);\r\n}\r\n\r\nfunction pumpRasterTiles(backend) {\r\n const map = backend._map;\r\n if (!map) return;\r\n const center = map.project(map.getCenter(), 0).divideBy(TILE_SIZE);\r\n const pending = [...backend._rasterTiles.values()].filter(tile => !tile.started && !tile.request.signal.aborted);\r\n const distance = ({ coords }) => Math.hypot((coords.x + 0.5) / 2 ** coords.z - center.x,\r\n (coords.y + 0.5) / 2 ** coords.z - center.y);\r\n pending.sort((a, b) => a.coords.z - b.coords.z || distance(a) - distance(b));\r\n for (const tile of pending) {\r\n if (backend._loadingTiles >= 4) break;\r\n loadRasterTile(backend, tile);\r\n }\r\n}\r\n\r\nexport function releaseRasterTiles(backend) {\r\n for (const tile of backend._rasterTiles.values()) releaseRasterTile(backend, tile);\r\n backend._rasterProgram?.pipelineCache.clear();\r\n backend._rasterProgram = null;\r\n if (backend._rasterGeometry) {\r\n for (const attribute of Object.values(backend._rasterGeometry.attributes)) {\r\n destroyTexture(backend, attribute.buffer);\r\n }\r\n backend._rasterGeometry = null;\r\n }\r\n}\r\n\r\nexport function setRasterTerrain(backend, terrain) {\r\n if (backend._terrain3D === terrain) return;\r\n for (const tile of backend._rasterTiles.values()) {\r\n if(backend._terrain3D) removeRasterTile(backend._terrain3D, tile);\r\n if (tile.mesh) {\r\n tile.mesh.visible = true;\r\n setParent(tile.mesh, backend.root);\r\n }\r\n }\r\n backend._terrain3D = terrain || null;\r\n if (terrain) {\r\n for (const tile of backend._rasterTiles.values()) {\r\n if (tile.done) registerTerrainTile(backend, tile.coords, tile);\r\n }\r\n }\r\n}\r\n\r\nexport function registerTerrainTile(backend, coords, tile) {\r\n if (backend._terrain3D && tile.done && !tile.request.signal.aborted &&\r\n backend._rasterTiles.get(`${coords.z}/${coords.x}/${coords.y}`) === tile) {\r\n addRasterTile(backend._terrain3D, backend, coords, tile)\r\n .catch(error => backend.fire('tileerror', { tile, coords, error }));\r\n }\r\n}\r\n\r\nexport function setRasterOpacity(backend, opacity) {\r\n for (const tile of backend._rasterTiles.values()) {\r\n if (tile.mesh) tile.mesh.opacity = opacity;\r\n const terrainMesh = backend._terrain3D?._rasterTiles.get(tile);\r\n if (terrainMesh) terrainMesh.opacity = opacity;\r\n }\r\n update(backend);\r\n}\r\n\r\nexport function setRasterZIndex(backend, zIndex) {\r\n for (const tile of backend._rasterTiles.values()) {\r\n if (tile.mesh) tile.mesh.renderOrder = zIndex;\r\n const terrainMesh = backend._terrain3D?._rasterTiles.get(tile);\r\n if (terrainMesh) terrainMesh.renderOrder = zIndex;\r\n }\r\n update(backend);\r\n}\r\n\r\nexport function getRasterTileSize() {\r\n return new L.Point(TILE_SIZE, TILE_SIZE);\r\n}\r\n\r\nfunction loadRasterTile(backend, tile) {\r\n tile.started = true;\r\n const first = backend._loadingTiles === 0;\r\n backend._loadingTiles++;\r\n backend.fire('tileloadstart', { tile, coords: tile.coords });\r\n if (first) backend.fire('loading');\r\n return Promise.resolve(backend.ready).then(() => backend.options.archive.getZxy(\r\n tile.coords.z, tile.coords.x, tile.coords.y, tile.request.signal\r\n )).then(async result => {\r\n if (tile.request.signal.aborted) return;\r\n if (!result) throw new Error(`Tile ${tile.coords.z}/${tile.coords.x}/${tile.coords.y} is not in the offline archive`);\r\n try {\r\n tile.image = await createImageBitmap(new Blob([result.data]));\r\n } catch {\r\n throw new Error(`Unable to decode tile ${tile.coords.z}/${tile.coords.x}/${tile.coords.y}`);\r\n }\r\n if (tile.request.signal.aborted) {\r\n tile.image.close();\r\n tile.image = null;\r\n return;\r\n }\r\n createRasterMesh(backend, tile);\r\n tile.loadedAt = performance.now();\r\n tile.done = true;\r\n backend._rasterVersion = (backend._rasterVersion || 0) + 1;\r\n registerTerrainTile(backend, tile.coords, tile);\r\n backend.fire('tileload', { tile, coords: tile.coords });\r\n update(backend);\r\n }).catch(error => {\r\n if (tile.request.signal.aborted) return;\r\n tile.error = error.message;\r\n backend._rasterVersion = (backend._rasterVersion || 0) + 1;\r\n backend.fire('tileerror', { tile, coords: tile.coords, error });\r\n backend.fire('error', { error, coords: tile.coords });\r\n }).finally(() => {\r\n backend._loadingTiles--;\r\n if (backend._map) {\r\n pumpRasterTiles(backend);\r\n pruneRasterTiles(backend);\r\n if (!backend._loadingTiles) backend.fire('load');\r\n update(backend);\r\n }\r\n });\r\n}\r\n\r\nfunction createRasterMesh(backend, tile) {\r\n const device = backend.renderer.device;\r\n const texture = {\r\n device,\r\n texture: device.createTexture({\r\n size: [tile.image.width, tile.image.height],\r\n format: 'rgba8unorm',\r\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,\r\n }),\r\n sampler: device.createSampler({ addressModeU: 'clamp-to-edge', addressModeV: 'clamp-to-edge',\r\n magFilter: 'linear', minFilter: 'linear' }),\r\n image: tile.image, format: 'rgba8unorm', srgb: false, uploaded: null,\r\n };\r\n if (!backend._rasterProgram) {\r\n backend._rasterProgram = createProgram(backend, {\r\n baseTexture: texture, unlit: true, alphaMode: 'BLEND',\r\n });\r\n }\r\n if (!backend._rasterGeometry) backend._rasterGeometry = createGeometry(device);\r\n const { coords } = tile;\r\n const crs = backend._map.options.crs;\r\n const origin = crs.project(backend.location);\r\n const metres = Math.cos(backend.location.lat * Math.PI / 180);\r\n const scale = crs.scale(coords.z);\r\n const corner = crs.transformation.untransform(new L.Point(coords.x * TILE_SIZE, coords.y * TILE_SIZE), scale);\r\n const opposite = crs.transformation.untransform(new L.Point((coords.x + 1) * TILE_SIZE, (coords.y + 1) * TILE_SIZE), scale);\r\n const sizeX = (opposite.x - corner.x) * metres;\r\n const sizeZ = -(opposite.y - corner.y) * metres;\r\n tile.texture = texture;\r\n tile.mesh = {\r\n position: [(corner.x - origin.x) * metres, 0, -(corner.y - origin.y) * metres],\r\n rotation: [0, 0, 0],\r\n scale: [sizeX, 1, sizeZ],\r\n worldMatrix: [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],\r\n children: [], visible: true, device, geometry: backend._rasterGeometry,\r\n program: backend._rasterProgram, texture,\r\n opacity: backend.options.opacity, id: L.Layer._nextId++,\r\n renderOrder: backend.options.zIndex || 0, tile, fadeDuration: 250, ground: true,\r\n };\r\n setParent(tile.mesh, backend.root);\r\n}\r\n\r\nfunction createGeometry(device) {\r\n const attributes = {\r\n position: { size: 3, data: new Float32Array([0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1]) },\r\n normal: { size: 3, data: new Float32Array([0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0]) },\r\n uv: { size: 2, data: new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]) },\r\n index: { data: new Uint16Array([0, 2, 1, 1, 2, 3]) },\r\n };\r\n for (const [name, attribute] of Object.entries(attributes)) {\r\n attribute.count = attribute.data.length / (attribute.size || 1);\r\n attribute.indexFormat = 'uint16';\r\n attribute.buffer = device.createBuffer({\r\n size: attribute.data.byteLength,\r\n usage: name === 'index' ? GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST\r\n : GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\r\n });\r\n device.queue.writeBuffer(attribute.buffer, 0, attribute.data);\r\n }\r\n return { device, attributes, drawRange: { start: 0, count: attributes.index.count } };\r\n}\r\n\r\nfunction releaseRasterTile(backend, tile) {\r\n const key = `${tile.coords.z}/${tile.coords.x}/${tile.coords.y}`;\r\n if (backend._rasterTiles.get(key) !== tile) return;\r\n backend._rasterTiles.delete(key);\r\n backend._rasterVersion = (backend._rasterVersion || 0) + 1;\r\n tile.request.abort();\r\n if(backend._terrain3D) removeRasterTile(backend._terrain3D, tile);\r\n if (tile.mesh) setParent(tile.mesh, null);\r\n if (tile.texture) destroyTexture(backend, tile.texture.texture);\r\n tile.image?.close();\r\n backend.fire('tileunload', { tile, coords: tile.coords });\r\n update(backend);\r\n}\r\n\r\nexport function pruneRasterTiles(backend) {\r\n const wanted = backend._wantedRasterTiles;\r\n const now = performance.now();\r\n if (backend._pruneVersion === backend._rasterVersion && backend._pruneWanted === wanted &&\r\n now < backend._pruneAfter) return Number.isFinite(backend._pruneAfter);\r\n backend._pruneVersion = backend._rasterVersion;\r\n backend._pruneWanted = wanted;\r\n backend._pruneAfter = Infinity;\r\n const pending = [...wanted].filter(key => {\r\n const tile = backend._rasterTiles.get(key);\r\n if (tile?.done && now - tile.loadedAt < 250) {\r\n backend._pruneAfter = Math.min(backend._pruneAfter, tile.loadedAt + 250);\r\n }\r\n return !tile?.done || now - tile.loadedAt < 250;\r\n }).map(key => {\r\n const [z, x, y] = key.split('/').map(Number);\r\n return { z, x, y };\r\n });\r\n for (const [key, tile] of backend._rasterTiles) {\r\n if (wanted.has(key)) continue;\r\n const overlaps = pending.some(coords => {\r\n const zoom = Math.min(coords.z, tile.coords.z);\r\n return Math.floor(coords.x / 2 ** (coords.z - zoom)) === Math.floor(tile.coords.x / 2 ** (tile.coords.z - zoom)) &&\r\n Math.floor(coords.y / 2 ** (coords.z - zoom)) === Math.floor(tile.coords.y / 2 ** (tile.coords.z - zoom));\r\n });\r\n if (!overlaps) releaseRasterTile(backend, tile);\r\n }\r\n return Number.isFinite(backend._pruneAfter);\r\n}\r\n"],
5
+ "mappings": "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",
6
+ "names": ["addRasterTile", "createProgram", "destroyTexture", "removeRasterTile", "setParent", "update", "TILE_SIZE", "TILE_RADIUS", "updateRasterTiles", "backend", "map", "zoom", "bounds", "northWest", "southEast", "archiveNorthWest", "archiveSouthEast", "center", "wanted", "x", "y", "coverage", "parentZoom", "factor", "key", "coords", "parent", "required", "tile", "releaseRasterTile", "pumpRasterTiles", "pruneRasterTiles", "pending", "distance", "a", "b", "loadRasterTile", "releaseRasterTiles", "attribute", "setRasterTerrain", "terrain", "registerTerrainTile", "error", "setRasterOpacity", "opacity", "terrainMesh", "setRasterZIndex", "zIndex", "getRasterTileSize", "first", "result", "createRasterMesh", "device", "texture", "createGeometry", "crs", "origin", "metres", "scale", "corner", "opposite", "sizeX", "sizeZ", "attributes", "name", "now", "z"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{intersectMeshes as f}from"./intersectMeshes.js";import{traverse as u}from"./traverse.js";import{updateCamera as g}from"./updateCamera.js";import{updateWorldMatrix as l}from"./updateWorldMatrix.js";function C(r,c,y=r.root.children,p=!0){if(!r.renderer)return[];r._beforeRaycast?.();const i=r._map.getContainer().getBoundingClientRect();l(r.scene),g(r.camera);const m=new DOMMatrix(r.camera.projectionViewMatrix).inverse();if(![...m.toFloat64Array()].every(Number.isFinite))throw new Error("Singular 3D transform");r.raycaster.origin[0]=r.camera.position[0],r.raycaster.origin[1]=r.camera.position[1],r.raycaster.origin[2]=r.camera.position[2];const t=new DOMPoint((c.clientX-i.left)/i.width*2-1,-((c.clientY-i.top)/i.height)*2+1,0,1).matrixTransform(m),a=[t.x/t.w,t.y/t.w,t.z/t.w];r.raycaster.direction[0]=a[0]-r.raycaster.origin[0],r.raycaster.direction[1]=a[1]-r.raycaster.origin[1],r.raycaster.direction[2]=a[2]-r.raycaster.origin[2];const s=Math.hypot(...r.raycaster.direction)||1;r.raycaster.direction[0]/=s,r.raycaster.direction[1]/=s,r.raycaster.direction[2]/=s;const n=[];for(const e of y)p?u(e,o=>{if(!o.visible)return!0;o.geometry&&o._appearance!==0&&n.push(o)}):e.geometry&&e.visible&&e._appearance!==0&&n.push(e);return f(r.raycaster,n,r.renderer.uniformData?.[55])}export{C as raycast};
2
+ //# sourceMappingURL=raycast.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/raycast.js"],
4
+ "sourcesContent": ["import { intersectMeshes } from './intersectMeshes.js';\nimport { traverse } from './traverse.js';\nimport { updateCamera } from './updateCamera.js';\nimport { updateWorldMatrix } from './updateWorldMatrix.js';\n\n/** Raycasting, hover/click highlight and tooltips. */\n/**\n * Finds the objects under a mouse or pointer event, nearest first.\n *\n * @param {MouseEvent} event\n * @param {Object[]} [objects] Defaults to this layer's root children, not all map layers.\n * @param {boolean} [recursive] Also test the descendants of `objects`.\n * @returns {Object[]} Nearest hit per mesh: object, shared-world point/distance and triangle faceIndex.\n */\n\nexport function raycast(backend, event, objects = backend.root.children, recursive = true) {\n if (!backend.renderer) {\n return [];\n }\n backend._beforeRaycast?.();\n const rect = backend._map.getContainer().getBoundingClientRect();\n updateWorldMatrix(backend.scene);\n updateCamera(backend.camera);\n // Unproject the mouse (-1..1) into a world-space ray from the camera.\n const inverseCamera = new DOMMatrix(backend.camera.projectionViewMatrix).inverse();\n const inverseCameraValues = inverseCamera.toFloat64Array();\n if (![...inverseCameraValues].every(Number.isFinite)) {\n throw new Error('Singular 3D transform');\n }\n backend.raycaster.origin[0] = backend.camera.position[0];\n backend.raycaster.origin[1] = backend.camera.position[1];\n backend.raycaster.origin[2] = backend.camera.position[2];\n const unprojected = new DOMPoint(\n ((event.clientX - rect.left) / rect.width) * 2 - 1,\n -((event.clientY - rect.top) / rect.height) * 2 + 1,\n 0,\n 1\n ).matrixTransform(inverseCamera);\n const end = [\n unprojected.x / unprojected.w,\n unprojected.y / unprojected.w,\n unprojected.z / unprojected.w\n ];\n backend.raycaster.direction[0] = end[0] - backend.raycaster.origin[0];\n backend.raycaster.direction[1] = end[1] - backend.raycaster.origin[1];\n backend.raycaster.direction[2] = end[2] - backend.raycaster.origin[2];\n const rayLength = Math.hypot(...backend.raycaster.direction) || 1;\n backend.raycaster.direction[0] /= rayLength;\n backend.raycaster.direction[1] /= rayLength;\n backend.raycaster.direction[2] /= rayLength;\n const meshes = [];\n for (const object of objects) {\n if (recursive) traverse(object, mesh => {\n if (!mesh.visible) return true;\n if (mesh.geometry && mesh._appearance !== 0) meshes.push(mesh);\n });\n else if (object.geometry && object.visible && object._appearance !== 0) meshes.push(object);\n }\n return intersectMeshes(backend.raycaster, meshes, backend.renderer.uniformData?.[55]);\n}\n"],
5
+ "mappings": "AAAA,OAAS,mBAAAA,MAAuB,uBAChC,OAAS,YAAAC,MAAgB,gBACzB,OAAS,gBAAAC,MAAoB,oBAC7B,OAAS,qBAAAC,MAAyB,yBAY3B,SAASC,EAAQC,EAASC,EAAOC,EAAUF,EAAQ,KAAK,SAAUG,EAAY,GAAM,CACzF,GAAI,CAACH,EAAQ,SACX,MAAO,CAAC,EAEVA,EAAQ,iBAAiB,EACzB,MAAMI,EAAOJ,EAAQ,KAAK,aAAa,EAAE,sBAAsB,EAC/DF,EAAkBE,EAAQ,KAAK,EAC/BH,EAAaG,EAAQ,MAAM,EAE3B,MAAMK,EAAgB,IAAI,UAAUL,EAAQ,OAAO,oBAAoB,EAAE,QAAQ,EAEjF,GAAI,CAAC,CAAC,GADsBK,EAAc,eAAe,CAC7B,EAAE,MAAM,OAAO,QAAQ,EACjD,MAAM,IAAI,MAAM,uBAAuB,EAEzCL,EAAQ,UAAU,OAAO,CAAC,EAAIA,EAAQ,OAAO,SAAS,CAAC,EACvDA,EAAQ,UAAU,OAAO,CAAC,EAAIA,EAAQ,OAAO,SAAS,CAAC,EACvDA,EAAQ,UAAU,OAAO,CAAC,EAAIA,EAAQ,OAAO,SAAS,CAAC,EACvD,MAAMM,EAAc,IAAI,UACpBL,EAAM,QAAUG,EAAK,MAAQA,EAAK,MAAS,EAAI,EACjD,GAAGH,EAAM,QAAUG,EAAK,KAAOA,EAAK,QAAU,EAAI,EAClD,EACA,CACF,EAAE,gBAAgBC,CAAa,EACzBE,EAAM,CACVD,EAAY,EAAIA,EAAY,EAC5BA,EAAY,EAAIA,EAAY,EAC5BA,EAAY,EAAIA,EAAY,CAC9B,EACAN,EAAQ,UAAU,UAAU,CAAC,EAAIO,EAAI,CAAC,EAAIP,EAAQ,UAAU,OAAO,CAAC,EACpEA,EAAQ,UAAU,UAAU,CAAC,EAAIO,EAAI,CAAC,EAAIP,EAAQ,UAAU,OAAO,CAAC,EACpEA,EAAQ,UAAU,UAAU,CAAC,EAAIO,EAAI,CAAC,EAAIP,EAAQ,UAAU,OAAO,CAAC,EACpE,MAAMQ,EAAY,KAAK,MAAM,GAAGR,EAAQ,UAAU,SAAS,GAAK,EAChEA,EAAQ,UAAU,UAAU,CAAC,GAAKQ,EAClCR,EAAQ,UAAU,UAAU,CAAC,GAAKQ,EAClCR,EAAQ,UAAU,UAAU,CAAC,GAAKQ,EAClC,MAAMC,EAAS,CAAC,EAChB,UAAWC,KAAUR,EACfC,EAAWP,EAASc,EAAQC,GAAQ,CACtC,GAAI,CAACA,EAAK,QAAS,MAAO,GACtBA,EAAK,UAAYA,EAAK,cAAgB,GAAGF,EAAO,KAAKE,CAAI,CAC/D,CAAC,EACQD,EAAO,UAAYA,EAAO,SAAWA,EAAO,cAAgB,GAAGD,EAAO,KAAKC,CAAM,EAE5F,OAAOf,EAAgBK,EAAQ,UAAWS,EAAQT,EAAQ,SAAS,cAAc,EAAE,CAAC,CACtF",
6
+ "names": ["intersectMeshes", "traverse", "updateCamera", "updateWorldMatrix", "raycast", "backend", "event", "objects", "recursive", "rect", "inverseCamera", "unprojected", "end", "rayLength", "meshes", "object", "mesh"]
7
+ }
@@ -0,0 +1,2 @@
1
+ async function o(t,e,r,n){if(n?.throwIfAborted(),!Number.isSafeInteger(e)||!Number.isSafeInteger(r)||e<0||r<=0||!Number.isSafeInteger(e+r))throw new Error("Invalid PMTiles byte range");const a=await fetch(t.url,{headers:{Range:`bytes=${e}-${e+r-1}`},signal:n});if(!a.ok)throw new Error(`Unable to read PMTiles: HTTP ${a.status}`);const s=a.headers.get("ETag");if(t._etag&&s!==t._etag)throw new Error("PMTiles archive changed; recreate the layer");s&&(t._etag=s);let i=await a.arrayBuffer();if(a.status===200)i=i.slice(e,e+r);else if(a.status!==206||!a.headers.get("Content-Range")?.startsWith(`bytes ${e}-${e+r-1}/`))throw new Error("Invalid PMTiles range response");if(i.byteLength!==r)throw new Error("Truncated PMTiles range");return i}export{o as read};
2
+ //# sourceMappingURL=read.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/read.js"],
4
+ "sourcesContent": ["export async function read(backend, offset, length, signal) {\r\n signal?.throwIfAborted();\r\n if (!Number.isSafeInteger(offset) || !Number.isSafeInteger(length) ||\r\n offset < 0 || length <= 0 || !Number.isSafeInteger(offset + length)) {\r\n throw new Error('Invalid PMTiles byte range');\r\n }\r\n const response = await fetch(backend.url, {\r\n headers: { Range: `bytes=${offset}-${offset + length - 1}` }, signal,\r\n });\r\n if (!response.ok) {\r\n throw new Error(`Unable to read PMTiles: HTTP ${response.status}`);\r\n }\r\n const etag = response.headers.get('ETag');\r\n if (backend._etag && etag !== backend._etag) {\r\n throw new Error('PMTiles archive changed; recreate the layer');\r\n }\r\n if (etag) backend._etag = etag;\r\n let data = await response.arrayBuffer();\r\n if (response.status === 200) {\r\n data = data.slice(offset, offset + length);\r\n } else if (response.status !== 206 ||\r\n !response.headers.get('Content-Range')?.startsWith(`bytes ${offset}-${offset + length - 1}/`)) {\r\n throw new Error('Invalid PMTiles range response');\r\n }\r\n if (data.byteLength !== length) {\r\n throw new Error('Truncated PMTiles range');\r\n }\r\n return data;\r\n}\r\n"],
5
+ "mappings": "AAAA,eAAsBA,EAAKC,EAASC,EAAQC,EAAQC,EAAQ,CAE1D,GADAA,GAAQ,eAAe,EACnB,CAAC,OAAO,cAAcF,CAAM,GAAK,CAAC,OAAO,cAAcC,CAAM,GAC/DD,EAAS,GAAKC,GAAU,GAAK,CAAC,OAAO,cAAcD,EAASC,CAAM,EAClE,MAAM,IAAI,MAAM,4BAA4B,EAE9C,MAAME,EAAW,MAAM,MAAMJ,EAAQ,IAAK,CACxC,QAAS,CAAE,MAAO,SAASC,CAAM,IAAIA,EAASC,EAAS,CAAC,EAAG,EAAG,OAAAC,CAChE,CAAC,EACD,GAAI,CAACC,EAAS,GACZ,MAAM,IAAI,MAAM,gCAAgCA,EAAS,MAAM,EAAE,EAEnE,MAAMC,EAAOD,EAAS,QAAQ,IAAI,MAAM,EACxC,GAAIJ,EAAQ,OAASK,IAASL,EAAQ,MACpC,MAAM,IAAI,MAAM,6CAA6C,EAE3DK,IAAML,EAAQ,MAAQK,GAC1B,IAAIC,EAAO,MAAMF,EAAS,YAAY,EACtC,GAAIA,EAAS,SAAW,IACtBE,EAAOA,EAAK,MAAML,EAAQA,EAASC,CAAM,UAChCE,EAAS,SAAW,KAC7B,CAACA,EAAS,QAAQ,IAAI,eAAe,GAAG,WAAW,SAASH,CAAM,IAAIA,EAASC,EAAS,CAAC,GAAG,EAC5F,MAAM,IAAI,MAAM,gCAAgC,EAElD,GAAII,EAAK,aAAeJ,EACtB,MAAM,IAAI,MAAM,yBAAyB,EAE3C,OAAOI,CACT",
6
+ "names": ["read", "backend", "offset", "length", "signal", "response", "etag", "data"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{types as d}from"./types.js";import{sizes as g}from"./sizes.js";function v(c,T){const r=c.accessors[T],f=d[r.componentType],t=g[r.type];if(!f||!t||!Number.isInteger(r.count)||r.count<0)throw new Error("Invalid glTF accessor");const o=new f(r.count*t),l=(e,n,a,i,b)=>{const s=c.bufferViews[e],y=f.BYTES_PER_ELEMENT,w=c.buffers[s.buffer].binary;if(i||=t*y,!w||i<t*y||n<0||(s.byteOffset||0)+s.byteLength>w.byteLength||(a-1)*i+t*y+n>s.byteLength)throw new Error("glTF accessor outside buffer view");for(let u=0;u<a;u++){const p=new f(w.slice((s.byteOffset||0)+n+u*i,(s.byteOffset||0)+n+u*i+t*y));o.set(p,b(u)*t)}};if(r.bufferView!==void 0&&l(r.bufferView,r.byteOffset||0,r.count,c.bufferViews[r.bufferView].byteStride,e=>e),r.sparse){const e=r.sparse,n=d[e.indices.componentType];if(![Uint8Array,Uint16Array,Uint32Array].includes(n))throw new Error("Invalid sparse glTF indices");const a=c.bufferViews[e.indices.bufferView],i=(a.byteOffset||0)+(e.indices.byteOffset||0);if(e.count>r.count||(e.indices.byteOffset||0)+e.count*n.BYTES_PER_ELEMENT>a.byteLength)throw new Error("Invalid sparse glTF indices");const b=new n(c.buffers[a.buffer].binary.slice(i,i+e.count*n.BYTES_PER_ELEMENT));l(e.values.bufferView,e.values.byteOffset||0,e.count,0,s=>{if(b[s]>=r.count)throw new Error("Invalid sparse glTF index");return b[s]})}if(r.componentType===5126)return{data:o,size:t};const E=new Float32Array(o.length);for(let e=0;e<o.length;e++)E[e]=r.normalized?Math.max(-1,o[e]/(f===Int8Array?127:f===Int16Array?32767:f===Uint8Array?255:f===Uint32Array?4294967295:65535)):o[e];return{data:E,size:t,indices:o}}export{v as readAccessor};
2
+ //# sourceMappingURL=readAccessor.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/readAccessor.js"],
4
+ "sourcesContent": ["import { types } from \"./types.js\";\nimport { sizes } from \"./sizes.js\";\n\n/** Decode packed, interleaved, normalized or sparse glTF accessor data. */\n\nexport function readAccessor(description, index) {\n const spec = description.accessors[index], Type = types[spec.componentType], size = sizes[spec.type];\n if (!Type || !size || !Number.isInteger(spec.count) || spec.count < 0) {\n throw new Error('Invalid glTF accessor');\n }\n const data = new Type(spec.count * size);\n // The destination callback is sequential for base data and sparse-indexed for overrides.\n const read = (viewIndex, offset, count, stride, output) => {\n const view = description.bufferViews[viewIndex], bytes = Type.BYTES_PER_ELEMENT;\n const buffer = description.buffers[view.buffer].binary;\n stride ||= size * bytes;\n if (!buffer || stride < size * bytes || offset < 0 ||\n (view.byteOffset || 0) + view.byteLength > buffer.byteLength ||\n (count - 1) * stride + size * bytes + offset > view.byteLength) throw new Error('glTF accessor outside buffer view');\n for (let i = 0; i < count; i++) {\n const values = new Type(buffer.slice((view.byteOffset || 0) + offset + i * stride,\n (view.byteOffset || 0) + offset + i * stride + size * bytes));\n data.set(values, output(i) * size);\n }\n };\n if (spec.bufferView !== undefined) {\n read(\n spec.bufferView,\n spec.byteOffset || 0,\n spec.count,\n description.bufferViews[spec.bufferView].byteStride,\n i => i\n );\n }\n if (spec.sparse) {\n const sparse = spec.sparse, Index = types[sparse.indices.componentType];\n if (![Uint8Array, Uint16Array, Uint32Array].includes(Index)) {\n throw new Error('Invalid sparse glTF indices');\n }\n const view = description.bufferViews[sparse.indices.bufferView];\n const offset = (view.byteOffset || 0) + (sparse.indices.byteOffset || 0);\n if (sparse.count > spec.count || (sparse.indices.byteOffset || 0) + sparse.count * Index.BYTES_PER_ELEMENT > view.byteLength) {\n throw new Error('Invalid sparse glTF indices');\n }\n const indices = new Index(description.buffers[view.buffer].binary.slice(offset, offset + sparse.count * Index.BYTES_PER_ELEMENT));\n read(\n sparse.values.bufferView,\n sparse.values.byteOffset || 0,\n sparse.count,\n 0,\n i => {\n if (indices[i] >= spec.count) throw new Error('Invalid sparse glTF index');\n return indices[i];\n }\n );\n }\n if (spec.componentType === 5126) {\n return { data, size };\n }\n const normalized = new Float32Array(data.length);\n // Normalization is a glTF accessor rule, not sRGB conversion; indices stay integers.\n for (let i = 0; i < data.length; i++) {\n normalized[i] = spec.normalized\n ? Math.max(-1, data[i] / (Type === Int8Array ? 127 : Type === Int16Array ? 32767 : Type === Uint8Array ? 255 : Type === Uint32Array ? 4294967295 : 65535))\n : data[i];\n }\n return { data: normalized, size, indices: data };\n}\n"],
5
+ "mappings": "AAAA,OAAS,SAAAA,MAAa,aACtB,OAAS,SAAAC,MAAa,aAIf,SAASC,EAAaC,EAAaC,EAAO,CAC/C,MAAMC,EAAOF,EAAY,UAAUC,CAAK,EAAGE,EAAON,EAAMK,EAAK,aAAa,EAAGE,EAAON,EAAMI,EAAK,IAAI,EACnG,GAAI,CAACC,GAAQ,CAACC,GAAQ,CAAC,OAAO,UAAUF,EAAK,KAAK,GAAKA,EAAK,MAAQ,EAClE,MAAM,IAAI,MAAM,uBAAuB,EAEzC,MAAMG,EAAO,IAAIF,EAAKD,EAAK,MAAQE,CAAI,EAEjCE,EAAO,CAACC,EAAWC,EAAQC,EAAOC,EAAQC,IAAW,CACzD,MAAMC,EAAOZ,EAAY,YAAYO,CAAS,EAAGM,EAAQV,EAAK,kBACxDW,EAASd,EAAY,QAAQY,EAAK,MAAM,EAAE,OAEhD,GADAF,IAAWN,EAAOS,EACd,CAACC,GAAUJ,EAASN,EAAOS,GAASL,EAAS,IAC9CI,EAAK,YAAc,GAAKA,EAAK,WAAaE,EAAO,aACjDL,EAAQ,GAAKC,EAASN,EAAOS,EAAQL,EAASI,EAAK,WAAY,MAAM,IAAI,MAAM,mCAAmC,EACrH,QAASG,EAAI,EAAGA,EAAIN,EAAOM,IAAK,CAC9B,MAAMC,EAAS,IAAIb,EAAKW,EAAO,OAAOF,EAAK,YAAc,GAAKJ,EAASO,EAAIL,GACxEE,EAAK,YAAc,GAAKJ,EAASO,EAAIL,EAASN,EAAOS,CAAK,CAAC,EAC9DR,EAAK,IAAIW,EAAQL,EAAOI,CAAC,EAAIX,CAAI,CACnC,CACF,EAUA,GATIF,EAAK,aAAe,QACtBI,EACEJ,EAAK,WACLA,EAAK,YAAc,EACnBA,EAAK,MACLF,EAAY,YAAYE,EAAK,UAAU,EAAE,WACzCa,GAAKA,CACP,EAEEb,EAAK,OAAQ,CACf,MAAMe,EAASf,EAAK,OAAQgB,EAAQrB,EAAMoB,EAAO,QAAQ,aAAa,EACtE,GAAI,CAAC,CAAC,WAAY,YAAa,WAAW,EAAE,SAASC,CAAK,EACxD,MAAM,IAAI,MAAM,6BAA6B,EAE/C,MAAMN,EAAOZ,EAAY,YAAYiB,EAAO,QAAQ,UAAU,EACxDT,GAAUI,EAAK,YAAc,IAAMK,EAAO,QAAQ,YAAc,GACtE,GAAIA,EAAO,MAAQf,EAAK,QAAUe,EAAO,QAAQ,YAAc,GAAKA,EAAO,MAAQC,EAAM,kBAAoBN,EAAK,WAChH,MAAM,IAAI,MAAM,6BAA6B,EAE/C,MAAMO,EAAU,IAAID,EAAMlB,EAAY,QAAQY,EAAK,MAAM,EAAE,OAAO,MAAMJ,EAAQA,EAASS,EAAO,MAAQC,EAAM,iBAAiB,CAAC,EAChIZ,EACEW,EAAO,OAAO,WACdA,EAAO,OAAO,YAAc,EAC5BA,EAAO,MACP,EACAF,GAAK,CACH,GAAII,EAAQJ,CAAC,GAAKb,EAAK,MAAO,MAAM,IAAI,MAAM,2BAA2B,EACzE,OAAOiB,EAAQJ,CAAC,CAClB,CACF,CACF,CACA,GAAIb,EAAK,gBAAkB,KACzB,MAAO,CAAE,KAAAG,EAAM,KAAAD,CAAK,EAEtB,MAAMgB,EAAa,IAAI,aAAaf,EAAK,MAAM,EAE/C,QAASU,EAAI,EAAGA,EAAIV,EAAK,OAAQU,IAC/BK,EAAWL,CAAC,EAAIb,EAAK,WACjB,KAAK,IAAI,GAAIG,EAAKU,CAAC,GAAKZ,IAAS,UAAY,IAAMA,IAAS,WAAa,MAAQA,IAAS,WAAa,IAAMA,IAAS,YAAc,WAAa,MAAM,EACvJE,EAAKU,CAAC,EAEZ,MAAO,CAAE,KAAMK,EAAY,KAAAhB,EAAM,QAASC,CAAK,CACjD",
6
+ "names": ["types", "sizes", "readAccessor", "description", "index", "spec", "Type", "size", "data", "read", "viewIndex", "offset", "count", "stride", "output", "view", "bytes", "buffer", "i", "values", "sparse", "Index", "indices", "normalized"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{setHighlight as s}from"./setHighlight.js";import{showFeature as i}from"./showFeature.js";import{setParent as p}from"./setParent.js";import{update as u}from"./update.js";function n(e,r){if(r.request.abort(),r.mesh){e.highlightedFeature?.mesh===r.mesh&&(s(e,null),e.hoveredFeature=null,i(e,null)),p(r.mesh,null),u(e);const t=r.mesh.geometry;for(const o of Object.values(t.attributes))o.buffer.destroy();r.mesh.program.pipelineCache.clear()}}function g(e,r=!0){const t={enabled:r,loaded:0,skipped:0,pending:0,errors:[]};for(const o of e._areas.values())o.error?t.errors.push(o.error):o.done||t.pending++,t.loaded+=o.buildings??0,t.skipped+=o.skipped??0;e.fire("progress",t)}export{n as releaseArea,g as updateStatus};
2
+ //# sourceMappingURL=releaseArea.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/releaseArea.js"],
4
+ "sourcesContent": ["import { setHighlight } from './setHighlight.js';\nimport { showFeature } from './showFeature.js';\nimport { setParent } from './setParent.js';\nimport { update } from './update.js';\n\n/** Cancel pending work and dispose this block's GPU data, including any hover highlight. */\n\nexport function releaseArea(backend, area) {\n area.request.abort();\n if (area.mesh) {\n if (backend.highlightedFeature?.mesh === area.mesh) {\n setHighlight(backend, null);\n backend.hoveredFeature = null;\n showFeature(backend, null);\n }\n setParent(area.mesh, null);\n update(backend);\n const geometry = area.mesh.geometry;\n for (const attribute of Object.values(geometry.attributes)) attribute.buffer.destroy();\n area.mesh.program.pipelineCache.clear();\n }\n}\n/** Emit a snapshot for consumers; ready does not wait for all neighborhood tasks. */\n\nexport function updateStatus(backend, enabled = true) {\n const progress = { enabled, loaded: 0, skipped: 0, pending: 0, errors: [] };\n for (const area of backend._areas.values()) {\n if (area.error) progress.errors.push(area.error);\n else if (!area.done) progress.pending++;\n progress.loaded += area.buildings ?? 0;\n progress.skipped += area.skipped ?? 0;\n }\n backend.fire('progress', progress);\n}\n"],
5
+ "mappings": "AAAA,OAAS,gBAAAA,MAAoB,oBAC7B,OAAS,eAAAC,MAAmB,mBAC5B,OAAS,aAAAC,MAAiB,iBAC1B,OAAS,UAAAC,MAAc,cAIhB,SAASC,EAAYC,EAASC,EAAM,CAEzC,GADAA,EAAK,QAAQ,MAAM,EACfA,EAAK,KAAM,CACTD,EAAQ,oBAAoB,OAASC,EAAK,OAC5CN,EAAaK,EAAS,IAAI,EAC1BA,EAAQ,eAAiB,KACzBJ,EAAYI,EAAS,IAAI,GAE3BH,EAAUI,EAAK,KAAM,IAAI,EACzBH,EAAOE,CAAO,EACd,MAAME,EAAWD,EAAK,KAAK,SAC3B,UAAWE,KAAa,OAAO,OAAOD,EAAS,UAAU,EAAGC,EAAU,OAAO,QAAQ,EACrFF,EAAK,KAAK,QAAQ,cAAc,MAAM,CACxC,CACF,CAGO,SAASG,EAAaJ,EAASK,EAAU,GAAM,CACpD,MAAMC,EAAW,CAAE,QAAAD,EAAS,OAAQ,EAAG,QAAS,EAAG,QAAS,EAAG,OAAQ,CAAC,CAAE,EAC1E,UAAWJ,KAAQD,EAAQ,OAAO,OAAO,EACnCC,EAAK,MAAOK,EAAS,OAAO,KAAKL,EAAK,KAAK,EACrCA,EAAK,MAAMK,EAAS,UAC9BA,EAAS,QAAUL,EAAK,WAAa,EACrCK,EAAS,SAAWL,EAAK,SAAW,EAEtCD,EAAQ,KAAK,WAAYM,CAAQ,CACnC",
6
+ "names": ["setHighlight", "showFeature", "setParent", "update", "releaseArea", "backend", "area", "geometry", "attribute", "updateStatus", "enabled", "progress"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{destroyTexture as o}from"./destroyTexture.js";import{setParent as s}from"./setParent.js";import{update as u}from"./update.js";function f(e,r){e._terrainRequest?.abort();const t=e._rasterTiles.get(r);t&&(s(t,null),u(e),t.texture!==r.texture&&o(e,t.texture.texture),e._rasterTiles.delete(r))}export{f as removeRasterTile};
2
+ //# sourceMappingURL=removeRasterTile.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/removeRasterTile.js"],
4
+ "sourcesContent": ["import { destroyTexture } from './destroyTexture.js';\nimport { setParent } from './setParent.js';\nimport { update } from './update.js';\n\nexport function removeRasterTile(layer, tile) {\n layer._terrainRequest?.abort();\n const mesh = layer._rasterTiles.get(tile);\n if (!mesh) return;\n setParent(mesh, null);\n update(layer);\n if (mesh.texture !== tile.texture) destroyTexture(layer, mesh.texture.texture);\n layer._rasterTiles.delete(tile);\n}\n"],
5
+ "mappings": "AAAA,OAAS,kBAAAA,MAAsB,sBAC/B,OAAS,aAAAC,MAAiB,iBAC1B,OAAS,UAAAC,MAAc,cAEhB,SAASC,EAAiBC,EAAOC,EAAM,CAC5CD,EAAM,iBAAiB,MAAM,EAC7B,MAAME,EAAOF,EAAM,aAAa,IAAIC,CAAI,EACnCC,IACLL,EAAUK,EAAM,IAAI,EACpBJ,EAAOE,CAAK,EACRE,EAAK,UAAYD,EAAK,SAASL,EAAeI,EAAOE,EAAK,QAAQ,OAAO,EAC7EF,EAAM,aAAa,OAAOC,CAAI,EAChC",
6
+ "names": ["destroyTexture", "setParent", "update", "removeRasterTile", "layer", "tile", "mesh"]
7
+ }
@@ -0,0 +1,15 @@
1
+ import{computeBounds as me}from"./computeBounds.js";import{traverse as b}from"./traverse.js";import{updateCamera as ge}from"./updateCamera.js";import{updateWorldMatrix as ue}from"./updateWorldMatrix.js";import{destroyTexture as Z}from"./destroyTexture.js";import{drawGeometry as k}from"./drawGeometry.js";import{updatePointLights as de}from"./updatePointLights.js";import{renderSunlight as xe}from"./renderSunlight.js";import{sortMeshes as he}from"./sortMeshes.js";import{update as ye}from"./update.js";import{getRasterTileSize as fe,pruneRasterTiles as Me}from"./rasterTiles.js";import{getElevation as _e}from"./getElevation.js";import{roofCoverage as ve}from"./roofCoverage.js";function Ae(t){if(cancelAnimationFrame(t._frame),t._frame=null,t._shared!==t||!t.renderer)return;const s=t._map,w=performance.now();let E=!1;const g=s.getSize();if(!g.x||!g.y)return;if(s._animatingZoom){t._zoomTransitions||=new Map;for(const e of s.getContainer().getAnimations({subtree:!0})){if(!(e instanceof CSSTransition)||e.transitionProperty!=="transform"||!e.effect.target.classList.contains("leaflet-zoom-animated")||t._zoomTransitions.has(e))continue;const r=e.currentTime||0;e.pause(),t._zoomTransitions.set(e,{start:w,time:r})}for(const[e,{start:r,time:a}]of t._zoomTransitions)e.currentTime=Math.min(e.effect.getComputedTiming().endTime,a+w-r);if(t._zoomView){const e=t._zoomView,a=[...t._zoomTransitions.keys()].find(D=>D.effect.target===s._proxy)?.effect.getComputedTiming().progress??Math.min(1,(w-e.start)/250),f=s.getZoomScale(e.targetZoom,e.zoom),l=1+(f-1)*a,u=s.project(e.from,e.zoom),x=s.project(e.to,e.zoom);s._cameraView={zoom:s.getScaleZoom(l,e.zoom),center:s.unproject(u.add(x.subtract(u).multiplyBy(f*a/l)),e.zoom)},s._updateCameraOverlays()}}(!t._size||!t._size.equals(g))&&(t.renderer.width=g.x,t.renderer.height=g.y,t.renderer.canvas.width=Math.round(g.x*t.renderer.dpr),t.renderer.canvas.height=Math.round(g.y*t.renderer.dpr),t.renderer.canvas.style.width=`${g.x}px`,t.renderer.canvas.style.height=`${g.y}px`,t.renderer.depthTexture&&Z(t,t.renderer.depthTexture),t.renderer.depthTexture=t.renderer.device.createTexture({size:[t.renderer.canvas.width,t.renderer.canvas.height],format:"depth24plus",usage:GPUTextureUsage.RENDER_ATTACHMENT}),t._size=g);const q=s._cameraView?.zoom??s.getZoom(),ee=s._cameraView?.center??s.getCenter(),$=s.options.crs.scale(q)/(4007501668557849e-8*Math.cos(t._sceneOrigin.lat*Math.PI/180)),te=s.project(ee,q).subtract(s.project(t._sceneOrigin,q)),C=g.y*1.5/$,P=[te.x/$,(s._terrain3D?_e(s._terrain3D,ee):void 0)??0,te.y/$],B=s.getPitch()*Math.PI/180,F=s.getBearing()*Math.PI/180,c=t.camera;c.fov=2*Math.atan(1/3)*180/Math.PI,c.aspect=g.x/g.y,c.near=Math.max(.1,C/1e4),c.far=Math.max(1e4,C*10),c.position[0]=P[0]+Math.sin(F)*Math.sin(B)*C,c.position[1]=P[1]+Math.cos(B)*C,c.position[2]=P[2]+Math.cos(F)*Math.sin(B)*C,c.up[0]=-Math.sin(F)*Math.cos(B),c.up[1]=Math.sin(B),c.up[2]=-Math.cos(F)*Math.cos(B),c.target[0]=P[0],c.target[1]=P[1],c.target[2]=P[2],ge(c),ue(t.scene);for(const e of t._layers)e._beforeRender?.();const _=s._sunlight,R=new DOMPoint(..._?.direction||[-300,500,300],0).matrixTransform(new DOMMatrix(c.viewMatrix)),Y=Math.hypot(R.x,R.y,R.z)||1,ce=[R.x/Y,R.y/Y,R.z/Y],S=new DOMPoint(0,1,0,0).matrixTransform(new DOMMatrix(c.viewMatrix)),H=Math.hypot(S.x,S.y,S.z)||1,le=[S.x/H,S.y/H,S.z/H],o=c.projectionViewMatrix,i=[[o[3]+o[0],o[7]+o[4],o[11]+o[8],o[15]+o[12]],[o[3]-o[0],o[7]-o[4],o[11]-o[8],o[15]-o[12]],[o[3]+o[1],o[7]+o[5],o[11]+o[9],o[15]+o[13]],[o[3]-o[1],o[7]-o[5],o[11]-o[9],o[15]-o[13]],[o[2],o[6],o[10],o[14]],[o[3]-o[2],o[7]-o[6],o[11]-o[10],o[15]-o[14]]],U=[Math.hypot(i[0][0],i[0][1],i[0][2]),Math.hypot(i[1][0],i[1][1],i[1][2]),Math.hypot(i[2][0],i[2][1],i[2][2]),Math.hypot(i[3][0],i[3][1],i[3][2]),Math.hypot(i[4][0],i[4][1],i[4][2]),Math.hypot(i[5][0],i[5][1],i[5][2])];ue(t.scene),b(t.scene,e=>{if(!e.visible)return!0;if(e.geometry){e.geometry.bounds||me(e.geometry);const r=e.geometry.bounds,a=e.worldMatrix,f=r.center,l=a[0]*f[0]+a[4]*f[1]+a[8]*f[2]+a[12],u=a[1]*f[0]+a[5]*f[1]+a[9]*f[2]+a[13],x=a[2]*f[0]+a[6]*f[1]+a[10]*f[2]+a[14],D=o[2]*l+o[6]*u+o[10]*x+o[14],h=o[3]*l+o[7]*u+o[11]*x+o[15];e._sortDepth=D/h;const m=r.radius*Math.max(Math.hypot(a[0],a[1],a[2]),Math.hypot(a[4],a[5],a[6]),Math.hypot(a[8],a[9],a[10]));if(e._visibleInFrame=i[0][0]*l+i[0][1]*u+i[0][2]*x+i[0][3]>=-m*U[0]&&i[1][0]*l+i[1][1]*u+i[1][2]*x+i[1][3]>=-m*U[1]&&i[2][0]*l+i[2][1]*u+i[2][2]*x+i[2][3]>=-m*U[2]&&i[3][0]*l+i[3][1]*u+i[3][2]*x+i[3][3]>=-m*U[3]&&i[4][0]*l+i[4][1]*u+i[4][2]*x+i[4][3]>=-m*U[4]&&i[5][0]*l+i[5][1]*u+i[5][2]*x+i[5][3]>=-m*U[5],!e._visibleInFrame)return}});const n=t.renderer;let z=[];if([...t._layers].some(e=>e.options.roofTexture)){z=Object.values(s._layers).filter(r=>r._type==="pmtiles"&&r._rasterTiles&&r.options.opacity>0);const e=z.map(r=>`${L.Util.stamp(r)}:${r._rasterVersion||0}:${r.options.opacity}:${r.options.zIndex}`).join("|");if(!t._roofRaster||t._roofRaster.signature!==e&&(!z.some(r=>r._loadingTiles)||w-t._roofRaster.updatedAt>=50)){const r=z.flatMap(p=>[...p._rasterTiles.values()].filter(d=>d.done&&!d.request.signal.aborted&&d.image).map(d=>({tile:d,layer:p}))),a=r.length?Math.max(...r.map(({tile:p})=>p.coords.z)):s.getZoom(),f=new L.Bounds;for(const{tile:{coords:p},layer:d}of r){const j=fe().multiplyBy(s.getZoomScale(a,p.z));f.extend(new L.Point(p.x,p.y).scaleBy(j)),f.extend(new L.Point(p.x+1,p.y+1).scaleBy(j))}const l=f.min||s.project(t._sceneOrigin,a),u=f.isValid()?f.getSize():new L.Point(1,1),D=Math.min(1,4096/Math.max(u.x,u.y)),h=Math.max(1,Math.ceil(u.x*D)),m=Math.max(1,Math.ceil(u.y*D)),re=s.project(t._sceneOrigin,a),oe=s.options.crs.scale(a)/(4007501668557849e-8*Math.cos(t._sceneOrigin.lat*Math.PI/180)),G=new DOMMatrix;G.m11=oe/u.x,G.m33=oe/u.y,G.m41=(re.x-l.x)/u.x,G.m43=(re.y-l.y)/u.y;const v=t._roofRaster?.texture;v&&(v.width!==h||v.height!==m)&&(Z(t,v.texture),v.texture=n.device.createTexture({size:[h,m],format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),v.width=h,v.height=m),t._roofRaster={signature:e,updatedAt:w,matrix:Array.from(G.toFloat64Array()),texture:v||{device:n.device,texture:n.device.createTexture({size:[h,m],format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),sampler:n.device.createSampler({addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}),samplerOptions:{addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"},image:null,width:h,height:m,format:"rgba8unorm",srgb:!1,flipY:!1,uploaded:null}};const M=n.device;if(!n.roofBlit){const p=M.createShaderModule({code:`
2
+ @group(0) @binding(0) var source: texture_2d<f32>;
3
+ @group(0) @binding(1) var sourceSampler: sampler;
4
+ @group(0) @binding(2) var<uniform> opacity: f32;
5
+ struct Varyings { @builtin(position) position: vec4f, @location(0) uv: vec2f };
6
+ @vertex fn vertexMain(@builtin(vertex_index) index: u32) -> Varyings {
7
+ let uv = vec2f(f32(index & 1u), f32(index >> 1u));
8
+ return Varyings(vec4f(uv.x * 2.0 - 1.0, 1.0 - uv.y * 2.0, 0.0, 1.0), uv);
9
+ }
10
+ @fragment fn fragmentMain(input: Varyings) -> @location(0) vec4f {
11
+ let color = textureSample(source, sourceSampler, input.uv);
12
+ return vec4f(color.rgb, color.a * opacity);
13
+ }
14
+ `});n.roofBlit={pipeline:M.createRenderPipeline({layout:"auto",vertex:{module:p,entryPoint:"vertexMain"},fragment:{module:p,entryPoint:"fragmentMain",targets:[{format:"rgba8unorm",blend:{color:{srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha",operation:"add"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"}}}]},primitive:{topology:"triangle-strip"}}),sampler:M.createSampler({magFilter:"linear",minFilter:"linear"})}}const X=new Float32Array(Math.max(1,r.length)*64),J=M.createBuffer({size:X.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),ie=M.createCommandEncoder(),A=ie.beginRenderPass({colorAttachments:[{view:t._roofRaster.texture.texture.createView(),clearValue:{r:0,g:0,b:0,a:0},loadOp:"clear",storeOp:"store"}]});A.setPipeline(n.roofBlit.pipeline),r.sort((p,d)=>(p.layer.options.zIndex||0)-(d.layer.options.zIndex||0)||p.tile.coords.z-d.tile.coords.z);for(const[p,{tile:d,layer:j}]of r.entries()){const{coords:K,image:pe}=d,T=d.texture;T.uploaded!==T.image&&(M.queue.copyExternalImageToTexture({source:pe},{texture:T.texture},[T.texture.width,T.texture.height]),T.uploaded=T.image),X[p*64]=j.options.opacity;const Q=fe().multiplyBy(s.getZoomScale(a,K.z)),ae=new L.Point(K.x,K.y).scaleBy(Q).subtract(l),ne=ae.x*h/u.x,se=ae.y*m/u.y;A.setViewport(ne,se,Math.min(Q.x*h/u.x,h-ne),Math.min(Q.y*m/u.y,m-se),0,1),A.setBindGroup(0,M.createBindGroup({layout:n.roofBlit.pipeline.getBindGroupLayout(0),entries:[{binding:0,resource:T.texture.createView()},{binding:1,resource:n.roofBlit.sampler},{binding:2,resource:{buffer:J,offset:p*256,size:4}}]})),A.draw(4)}A.end(),M.queue.writeBuffer(J,0,X),M.queue.submit([ie.finish()]),J.destroy()}}else t._roofRaster&&(Z(t,t._roofRaster.texture.texture),t._roofRaster=null);const V=[];b(t.scene,e=>{if(!e.visible)return!0;if(!(!e.geometry||!e._visibleInFrame)){if(e.program.uniforms.roofTexture&&!z.length&&(e._roofRevealed=!0),e.program.uniforms.roofTexture&&!e._roofRevealed&&z.length){if(e._roofCoverageSignature!==t._roofRaster?.signature&&(e._roofCoverageSignature=t._roofRaster?.signature,e._roofCovered=ve(e,t,z)),!e._roofCovered){e._appearance=0;return}e._roofRevealed=!0}if(e.fadeDuration){e.fadeStart??=e.tile?.loadedAt??w;const r=Math.min(1,(w-e.fadeStart)/e.fadeDuration);e._appearance=r*r*(3-2*r),E||=r<1}V.push(e)}}),he(V);const W=n.device.createCommandEncoder(),I=[];if(_?.altitude>=3)for(const e of t._layers)e._type!=="terrain"&&b(e.root,r=>{if(!r.visible)return!0;r.geometry&&!r.tile&&r._appearance!==0&&!r.program.nightLight&&r.program.depthTest!==!1&&I.push(r)});(!n.uniformBuffer||n.uniformBuffer.size<(V.length*2+I.length+1)*256)&&(n.uniformBuffer&&Z(t,n.uniformBuffer),n.uniformBuffer=n.device.createBuffer({size:Math.max(64,V.length*4+I.length*2)*256,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),n.uniformData=new Float32Array(n.uniformBuffer.size/4));const y=n.uniformData;y.set(c.viewMatrix,0),y.set(c.projectionMatrix,16),y.set(t._roofRaster?.matrix||[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],32),y.set(ce,48),y[51]=_&&_.altitude<=0?0:1,y.set(le,52);const N=_?Math.max(0,Math.min(1,(3-_.altitude)/9)):0;y[55]=N*N*(3-2*N),y.set(_?.tint||[1,1,1],56),y[59]=0,N>0&&de(t),n.uniformSlot=1,xe(t,W,I,_);const O=W.beginRenderPass({colorAttachments:[{view:n.context.getCurrentTexture().createView(),clearValue:{r:0,g:0,b:0,a:0},loadOp:"clear",storeOp:"store"}],depthStencilAttachment:{view:n.depthTexture.createView(),depthClearValue:1,depthLoadOp:"clear",depthStoreOp:"store"}});O.setViewport(0,0,n.canvas.width,n.canvas.height,0,1),O.setBindGroup(1,n.sunlight.bindGroup);for(const e of V){const r=e.worldMatrix;e.texture&&(e.program.uniforms.baseTexture.value=e.texture,e.program.uniforms.opacity.value=e.opacity);const a=e.program.uniforms;a.roofTexture&&(a.roofTexture.value=t._roofRaster?.texture||n.roofFallbackTexture);const f=r[0]*(r[5]*r[10]-r[6]*r[9])-r[4]*(r[1]*r[10]-r[2]*r[9])+r[8]*(r[1]*r[6]-r[2]*r[5]);if(!Number.isFinite(f)||f===0)throw new Error("Singular 3D transform");const l=f<0?"cw":"ccw",u=e.program;u.transparent&&u._layerMaterial.doubleSided&&!e._nativeSource?(k(t,e,O,"front",l),k(t,e,O,"back",l)):k(t,e,O,u.cullMode,l)}O.end(),n.device.queue.writeBuffer(n.uniformBuffer,0,n.uniformData,0,n.uniformSlot*64),n.device.queue.submit([W.finish()]);for(const e of t._layers)e._wantedRasterTiles&&(E=Me(e)||E);(s._animatingZoom||E)&&ye(t)}export{Ae as render};
15
+ //# sourceMappingURL=render.js.map