leaflet-city-mapper 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (472) hide show
  1. package/README.md +15 -13
  2. package/cucumber.mjs +4 -0
  3. package/dist/leaflet-city-mapper.js +1 -1
  4. package/dist/leaflet-city-mapper.js.map +4 -4
  5. package/dist/utils/CELL.js +2 -0
  6. package/dist/utils/CELL.js.map +7 -0
  7. package/dist/utils/addBridges.js +2 -0
  8. package/dist/utils/addBridges.js.map +7 -0
  9. package/dist/utils/addRasterTile.js +2 -0
  10. package/dist/utils/addRasterTile.js.map +7 -0
  11. package/dist/utils/along.js +2 -0
  12. package/dist/utils/along.js.map +7 -0
  13. package/dist/utils/atmosphere.js +2 -0
  14. package/dist/utils/atmosphere.js.map +7 -0
  15. package/dist/utils/attach.js +2 -0
  16. package/dist/utils/attach.js.map +7 -0
  17. package/dist/utils/bindSunlight.js +2 -0
  18. package/dist/utils/bindSunlight.js.map +7 -0
  19. package/dist/utils/box.js +2 -0
  20. package/dist/utils/box.js.map +7 -0
  21. package/dist/utils/bridgeElevation.js +2 -0
  22. package/dist/utils/bridgeElevation.js.map +7 -0
  23. package/dist/utils/build.js +2 -0
  24. package/dist/utils/build.js.map +7 -0
  25. package/dist/utils/cameraControls.js +2 -0
  26. package/dist/utils/cameraControls.js.map +7 -0
  27. package/dist/utils/channel.js +2 -0
  28. package/dist/utils/channel.js.map +7 -0
  29. package/dist/utils/collider.js +2 -0
  30. package/dist/utils/collider.js.map +7 -0
  31. package/dist/utils/colliders.js +2 -0
  32. package/dist/utils/colliders.js.map +7 -0
  33. package/dist/utils/computeBounds.js +2 -0
  34. package/dist/utils/computeBounds.js.map +7 -0
  35. package/dist/utils/conformModelToTerrain.js +2 -0
  36. package/dist/utils/conformModelToTerrain.js.map +7 -0
  37. package/dist/utils/createMesh.js +2 -0
  38. package/dist/utils/createMesh.js.map +7 -0
  39. package/dist/utils/createProgram.js +3 -0
  40. package/dist/utils/createProgram.js.map +7 -0
  41. package/dist/utils/decodeDirectory.js +2 -0
  42. package/dist/utils/decodeDirectory.js.map +7 -0
  43. package/dist/utils/decodeHeader.js +2 -0
  44. package/dist/utils/decodeHeader.js.map +7 -0
  45. package/dist/utils/decodeModel.js +2 -0
  46. package/dist/utils/decodeModel.js.map +7 -0
  47. package/dist/utils/decompress.js +2 -0
  48. package/dist/utils/decompress.js.map +7 -0
  49. package/dist/utils/destroyTexture.js +2 -0
  50. package/dist/utils/destroyTexture.js.map +7 -0
  51. package/dist/utils/disposeMesh.js +2 -0
  52. package/dist/utils/disposeMesh.js.map +7 -0
  53. package/dist/utils/drawGeometry.js +2 -0
  54. package/dist/utils/drawGeometry.js.map +7 -0
  55. package/dist/utils/elevationWGSL.js +24 -0
  56. package/dist/utils/elevationWGSL.js.map +7 -0
  57. package/dist/utils/emptyNode.js +2 -0
  58. package/dist/utils/emptyNode.js.map +7 -0
  59. package/dist/utils/endZoom.js +2 -0
  60. package/dist/utils/endZoom.js.map +7 -0
  61. package/dist/utils/findFeature.js +2 -0
  62. package/dist/utils/findFeature.js.map +7 -0
  63. package/dist/utils/geometry.js +0 -1
  64. package/dist/utils/geometry.js.map +4 -4
  65. package/dist/utils/getElevation.js +2 -0
  66. package/dist/utils/getElevation.js.map +7 -0
  67. package/dist/utils/getHeader.js +2 -0
  68. package/dist/utils/getHeader.js.map +7 -0
  69. package/dist/utils/getZxy.js +2 -0
  70. package/dist/utils/getZxy.js.map +7 -0
  71. package/dist/utils/glass.js +2 -0
  72. package/dist/utils/glass.js.map +7 -0
  73. package/dist/utils/headlight.js +2 -0
  74. package/dist/utils/headlight.js.map +7 -0
  75. package/dist/utils/hit.js +2 -0
  76. package/dist/utils/hit.js.map +7 -0
  77. package/dist/utils/horizontalPosition.js +2 -0
  78. package/dist/utils/horizontalPosition.js.map +7 -0
  79. package/dist/utils/horizontalRay.js +2 -0
  80. package/dist/utils/horizontalRay.js.map +7 -0
  81. package/dist/utils/hull.js +2 -0
  82. package/dist/utils/hull.js.map +7 -0
  83. package/dist/utils/initSunlight.js +2 -0
  84. package/dist/utils/initSunlight.js.map +7 -0
  85. package/dist/utils/initTerrain.js +2 -0
  86. package/dist/utils/initTerrain.js.map +7 -0
  87. package/dist/utils/initTraffic.js +40 -0
  88. package/dist/utils/initTraffic.js.map +7 -0
  89. package/dist/utils/initWalk.js +2 -0
  90. package/dist/utils/initWalk.js.map +7 -0
  91. package/dist/utils/intersectMeshes.js +2 -0
  92. package/dist/utils/intersectMeshes.js.map +7 -0
  93. package/dist/utils/isClockWise.js +2 -0
  94. package/dist/utils/isClockWise.js.map +7 -0
  95. package/dist/utils/lampPostGeometry.js +2 -0
  96. package/dist/utils/lampPostGeometry.js.map +7 -0
  97. package/dist/utils/lightGeometry.js +2 -0
  98. package/dist/utils/lightGeometry.js.map +7 -0
  99. package/dist/utils/lightGrid.js +2 -0
  100. package/dist/utils/lightGrid.js.map +7 -0
  101. package/dist/utils/limbs.js +2 -0
  102. package/dist/utils/limbs.js.map +7 -0
  103. package/dist/utils/loadModel.js +2 -0
  104. package/dist/utils/loadModel.js.map +7 -0
  105. package/dist/utils/loadSource.js +2 -0
  106. package/dist/utils/loadSource.js.map +7 -0
  107. package/dist/utils/loadTerrain.js +2 -0
  108. package/dist/utils/loadTerrain.js.map +7 -0
  109. package/dist/utils/mapCamera.js +2 -0
  110. package/dist/utils/mapCamera.js.map +7 -0
  111. package/dist/utils/{shaders.js → materialShaders.js} +16 -8
  112. package/dist/utils/materialShaders.js.map +7 -0
  113. package/dist/utils/mirror.js +2 -0
  114. package/dist/utils/mirror.js.map +7 -0
  115. package/dist/utils/moonPosition.js +2 -0
  116. package/dist/utils/moonPosition.js.map +7 -0
  117. package/dist/utils/moves.js +2 -0
  118. package/dist/utils/moves.js.map +7 -0
  119. package/dist/utils/nativeEvents.js +2 -0
  120. package/dist/utils/nativeEvents.js.map +7 -0
  121. package/dist/utils/nativeGeometry.js +2 -0
  122. package/dist/utils/nativeGeometry.js.map +7 -0
  123. package/dist/utils/nativeLayer.js +2 -0
  124. package/dist/utils/nativeLayer.js.map +7 -0
  125. package/dist/utils/nodeMatrix.js +2 -0
  126. package/dist/utils/nodeMatrix.js.map +7 -0
  127. package/dist/utils/onAdd3DLayer.js +2 -0
  128. package/dist/utils/onAdd3DLayer.js.map +7 -0
  129. package/dist/utils/onAddSun.js +2 -0
  130. package/dist/utils/onAddSun.js.map +7 -0
  131. package/dist/utils/onClick.js +2 -0
  132. package/dist/utils/onClick.js.map +7 -0
  133. package/dist/utils/onMapChange.js +2 -0
  134. package/dist/utils/onMapChange.js.map +7 -0
  135. package/dist/utils/onPMTileAdd.js +2 -0
  136. package/dist/utils/onPMTileAdd.js.map +7 -0
  137. package/dist/utils/onPMTileRemove.js +2 -0
  138. package/dist/utils/onPMTileRemove.js.map +7 -0
  139. package/dist/utils/onPointerLeave.js +2 -0
  140. package/dist/utils/onPointerLeave.js.map +7 -0
  141. package/dist/utils/onPointerMove.js +2 -0
  142. package/dist/utils/onPointerMove.js.map +7 -0
  143. package/dist/utils/onRemove3DLayer.js +2 -0
  144. package/dist/utils/onRemove3DLayer.js.map +7 -0
  145. package/dist/utils/onRemoveSun.js +2 -0
  146. package/dist/utils/onRemoveSun.js.map +7 -0
  147. package/dist/utils/onTerrainAdd.js +2 -0
  148. package/dist/utils/onTerrainAdd.js.map +7 -0
  149. package/dist/utils/onTerrainChange.js +2 -0
  150. package/dist/utils/onTerrainChange.js.map +7 -0
  151. package/dist/utils/onTerrainRemove.js +2 -0
  152. package/dist/utils/onTerrainRemove.js.map +7 -0
  153. package/dist/utils/onZoomAnim.js +2 -0
  154. package/dist/utils/onZoomAnim.js.map +7 -0
  155. package/dist/utils/paints.js +2 -0
  156. package/dist/utils/paints.js.map +7 -0
  157. package/dist/utils/parseColor.js +2 -0
  158. package/dist/utils/parseColor.js.map +7 -0
  159. package/dist/utils/parts.js +2 -0
  160. package/dist/utils/parts.js.map +7 -0
  161. package/dist/utils/projectCelestialBody.js +2 -0
  162. package/dist/utils/projectCelestialBody.js.map +7 -0
  163. package/dist/utils/pump.js +2 -0
  164. package/dist/utils/pump.js.map +7 -0
  165. package/dist/utils/rasterTiles.js +2 -0
  166. package/dist/utils/rasterTiles.js.map +7 -0
  167. package/dist/utils/raycast.js +2 -0
  168. package/dist/utils/raycast.js.map +7 -0
  169. package/dist/utils/read.js +2 -0
  170. package/dist/utils/read.js.map +7 -0
  171. package/dist/utils/readAccessor.js +2 -0
  172. package/dist/utils/readAccessor.js.map +7 -0
  173. package/dist/utils/releaseArea.js +2 -0
  174. package/dist/utils/releaseArea.js.map +7 -0
  175. package/dist/utils/removeRasterTile.js +2 -0
  176. package/dist/utils/removeRasterTile.js.map +7 -0
  177. package/dist/utils/render.js +15 -0
  178. package/dist/utils/render.js.map +7 -0
  179. package/dist/utils/renderSunlight.js +13 -0
  180. package/dist/utils/renderSunlight.js.map +7 -0
  181. package/dist/utils/renderers.js +2 -0
  182. package/dist/utils/renderers.js.map +7 -0
  183. package/dist/utils/resizeSunlight.js +2 -0
  184. package/dist/utils/resizeSunlight.js.map +7 -0
  185. package/dist/utils/roofCoverage.js +2 -0
  186. package/dist/utils/roofCoverage.js.map +7 -0
  187. package/dist/utils/routeGeometry.js +2 -0
  188. package/dist/utils/routeGeometry.js.map +7 -0
  189. package/dist/utils/scheduledTrips.js +2 -0
  190. package/dist/utils/scheduledTrips.js.map +7 -0
  191. package/dist/utils/setGeoJSONData.js +2 -0
  192. package/dist/utils/setGeoJSONData.js.map +7 -0
  193. package/dist/utils/setHighlight.js +2 -0
  194. package/dist/utils/setHighlight.js.map +7 -0
  195. package/dist/utils/setPMTileOpacity.js +2 -0
  196. package/dist/utils/setPMTileOpacity.js.map +7 -0
  197. package/dist/utils/setPMTileZIndex.js +2 -0
  198. package/dist/utils/setPMTileZIndex.js.map +7 -0
  199. package/dist/utils/setParent.js +2 -0
  200. package/dist/utils/setParent.js.map +7 -0
  201. package/dist/utils/setTerrainHeight.js +2 -0
  202. package/dist/utils/setTerrainHeight.js.map +7 -0
  203. package/dist/utils/setVertexColor.js +2 -0
  204. package/dist/utils/setVertexColor.js.map +7 -0
  205. package/dist/utils/showFeature.js +2 -0
  206. package/dist/utils/showFeature.js.map +7 -0
  207. package/dist/utils/sizes.js +2 -0
  208. package/dist/utils/sizes.js.map +7 -0
  209. package/dist/utils/skin.js +2 -0
  210. package/dist/utils/skin.js.map +7 -0
  211. package/dist/utils/solarPosition.js +2 -0
  212. package/dist/utils/solarPosition.js.map +7 -0
  213. package/dist/utils/sortMeshes.js +2 -0
  214. package/dist/utils/sortMeshes.js.map +7 -0
  215. package/dist/utils/speed.js +2 -0
  216. package/dist/utils/speed.js.map +7 -0
  217. package/dist/utils/startZoom.js +2 -0
  218. package/dist/utils/startZoom.js.map +7 -0
  219. package/dist/utils/taillight.js +2 -0
  220. package/dist/utils/taillight.js.map +7 -0
  221. package/dist/utils/terrainAtlas.js +2 -0
  222. package/dist/utils/terrainAtlas.js.map +7 -0
  223. package/dist/utils/terrainElevation.js +2 -0
  224. package/dist/utils/terrainElevation.js.map +7 -0
  225. package/dist/utils/terrainGrid.js +2 -0
  226. package/dist/utils/terrainGrid.js.map +7 -0
  227. package/dist/utils/textureSampler.js +2 -0
  228. package/dist/utils/textureSampler.js.map +7 -0
  229. package/dist/utils/tileId.js +2 -0
  230. package/dist/utils/tileId.js.map +7 -0
  231. package/dist/utils/toLanes.js +2 -0
  232. package/dist/utils/toLanes.js.map +7 -0
  233. package/dist/utils/toSRGB.js +2 -0
  234. package/dist/utils/toSRGB.js.map +7 -0
  235. package/dist/utils/tooltip.js +3 -0
  236. package/dist/utils/tooltip.js.map +7 -0
  237. package/dist/utils/traffic.js +1 -1
  238. package/dist/utils/traffic.js.map +3 -3
  239. package/dist/utils/traverse.js +2 -0
  240. package/dist/utils/traverse.js.map +7 -0
  241. package/dist/utils/treeGeometry.js +2 -0
  242. package/dist/utils/treeGeometry.js.map +7 -0
  243. package/dist/utils/triangulate.js +2 -0
  244. package/dist/utils/triangulate.js.map +7 -0
  245. package/dist/utils/tripsAt.js +2 -0
  246. package/dist/utils/tripsAt.js.map +7 -0
  247. package/dist/utils/types.js +2 -0
  248. package/dist/utils/types.js.map +7 -0
  249. package/dist/utils/underEntry.js +2 -0
  250. package/dist/utils/underEntry.js.map +7 -0
  251. package/dist/utils/update.js +2 -0
  252. package/dist/utils/update.js.map +7 -0
  253. package/dist/utils/updateArea.js +2 -0
  254. package/dist/utils/updateArea.js.map +7 -0
  255. package/dist/utils/updateCamera.js +2 -0
  256. package/dist/utils/updateCamera.js.map +7 -0
  257. package/dist/utils/updatePointLights.js +2 -0
  258. package/dist/utils/updatePointLights.js.map +7 -0
  259. package/dist/utils/updateWorldMatrix.js +2 -0
  260. package/dist/utils/updateWorldMatrix.js.map +7 -0
  261. package/dist/utils/vehicleOffsets.js +2 -0
  262. package/dist/utils/vehicleOffsets.js.map +7 -0
  263. package/dist/utils/vehicles.js +1 -1
  264. package/dist/utils/vehicles.js.map +3 -3
  265. package/dist/utils/vertexNormals.js +2 -0
  266. package/dist/utils/vertexNormals.js.map +7 -0
  267. package/dist/utils/walk.js +1 -1
  268. package/dist/utils/walk.js.map +3 -3
  269. package/dist/utils/white.js +2 -0
  270. package/dist/utils/white.js.map +7 -0
  271. package/dist/utils/worldLights.js +2 -0
  272. package/dist/utils/worldLights.js.map +7 -0
  273. package/dist/utils/wrap.js +2 -0
  274. package/dist/utils/wrap.js.map +7 -0
  275. package/package.json +2 -4
  276. package/src/index.js +365 -50
  277. package/src/utils/CELL.js +4 -0
  278. package/src/utils/addBridges.js +66 -0
  279. package/src/utils/addRasterTile.js +112 -0
  280. package/src/utils/along.js +9 -0
  281. package/src/utils/atmosphere.js +20 -0
  282. package/src/utils/attach.js +255 -0
  283. package/src/utils/bindSunlight.js +12 -0
  284. package/src/utils/box.js +1 -0
  285. package/src/utils/bridgeElevation.js +18 -0
  286. package/src/utils/build.js +20 -0
  287. package/src/utils/cameraControls.js +287 -0
  288. package/src/utils/channel.js +4 -0
  289. package/src/utils/collider.js +62 -0
  290. package/src/utils/colliders.js +2 -0
  291. package/src/utils/computeBounds.js +17 -0
  292. package/src/utils/conformModelToTerrain.js +69 -0
  293. package/src/utils/createMesh.js +31 -0
  294. package/src/utils/createProgram.js +92 -0
  295. package/src/utils/decodeDirectory.js +40 -0
  296. package/src/utils/decodeHeader.js +15 -0
  297. package/src/utils/decodeModel.js +43 -0
  298. package/src/utils/decompress.js +5 -0
  299. package/src/utils/destroyTexture.js +7 -0
  300. package/src/utils/disposeMesh.js +13 -0
  301. package/src/utils/drawGeometry.js +122 -0
  302. package/src/utils/elevationWGSL.js +27 -0
  303. package/src/utils/emptyNode.js +9 -0
  304. package/src/utils/endZoom.js +15 -0
  305. package/src/utils/findFeature.js +49 -0
  306. package/src/utils/geometry.js +0 -254
  307. package/src/utils/getElevation.js +10 -0
  308. package/src/utils/getHeader.js +9 -0
  309. package/src/utils/getZxy.js +76 -0
  310. package/src/utils/glass.js +1 -0
  311. package/src/utils/headlight.js +1 -0
  312. package/src/utils/hit.js +41 -0
  313. package/src/utils/horizontalPosition.js +16 -0
  314. package/src/utils/horizontalRay.js +12 -0
  315. package/src/utils/hull.js +1 -0
  316. package/src/utils/initSunlight.js +9 -0
  317. package/src/utils/initTerrain.js +19 -0
  318. package/src/utils/initTraffic.js +93 -0
  319. package/src/utils/initWalk.js +72 -0
  320. package/src/utils/{picking.js → intersectMeshes.js} +121 -119
  321. package/src/utils/isClockWise.js +12 -0
  322. package/src/utils/lampPostGeometry.js +26 -0
  323. package/src/utils/lightGeometry.js +22 -0
  324. package/src/utils/{lighting.js → lightGrid.js} +50 -51
  325. package/src/utils/limbs.js +9 -0
  326. package/src/{scene/model.js → utils/loadModel.js} +37 -24
  327. package/src/utils/loadSource.js +17 -0
  328. package/src/utils/loadTerrain.js +65 -0
  329. package/src/utils/mapCamera.js +432 -0
  330. package/src/utils/{shaders.js → materialShaders.js} +243 -237
  331. package/src/utils/mirror.js +6 -0
  332. package/src/utils/moonPosition.js +17 -0
  333. package/src/utils/moves.js +11 -0
  334. package/src/utils/nativeEvents.js +77 -0
  335. package/src/utils/nativeGeometry.js +131 -0
  336. package/src/utils/nativeLayer.js +317 -0
  337. package/src/utils/nodeMatrix.js +22 -0
  338. package/src/utils/onAdd3DLayer.js +31 -0
  339. package/src/utils/onAddSun.js +147 -0
  340. package/src/utils/onClick.js +13 -0
  341. package/src/utils/onMapChange.js +16 -0
  342. package/src/utils/onPMTileAdd.js +15 -0
  343. package/src/utils/onPMTileRemove.js +8 -0
  344. package/src/utils/onPointerLeave.js +11 -0
  345. package/src/utils/onPointerMove.js +15 -0
  346. package/src/utils/onRemove3DLayer.js +78 -0
  347. package/src/utils/onRemoveSun.js +3 -0
  348. package/src/utils/onTerrainAdd.js +18 -0
  349. package/src/utils/onTerrainChange.js +13 -0
  350. package/src/utils/onTerrainRemove.js +40 -0
  351. package/src/utils/onZoomAnim.js +14 -0
  352. package/src/utils/paints.js +10 -0
  353. package/src/utils/parseColor.js +42 -0
  354. package/src/utils/parts.js +16 -0
  355. package/src/utils/projectCelestialBody.js +13 -0
  356. package/src/{scene/sources.js → utils/pump.js} +59 -98
  357. package/src/utils/rasterTiles.js +285 -0
  358. package/src/utils/raycast.js +60 -0
  359. package/src/utils/read.js +29 -0
  360. package/src/utils/readAccessor.js +68 -0
  361. package/src/utils/releaseArea.js +34 -0
  362. package/src/utils/removeRasterTile.js +13 -0
  363. package/src/{scene → utils}/render.js +112 -173
  364. package/src/utils/renderSunlight.js +170 -0
  365. package/src/utils/renderers.js +2 -0
  366. package/src/utils/resizeSunlight.js +15 -0
  367. package/src/utils/roofCoverage.js +47 -0
  368. package/src/utils/routeGeometry.js +22 -0
  369. package/src/utils/scheduledTrips.js +29 -0
  370. package/src/utils/setGeoJSONData.js +11 -0
  371. package/src/utils/setHighlight.js +13 -0
  372. package/src/utils/setPMTileOpacity.js +7 -0
  373. package/src/utils/setPMTileZIndex.js +7 -0
  374. package/src/utils/setParent.js +7 -0
  375. package/src/utils/setTerrainHeight.js +10 -0
  376. package/src/utils/setVertexColor.js +14 -0
  377. package/src/utils/showFeature.js +27 -0
  378. package/src/utils/sizes.js +1 -0
  379. package/src/utils/skin.js +2 -0
  380. package/src/utils/solarPosition.js +17 -0
  381. package/src/utils/sortMeshes.js +12 -0
  382. package/src/utils/speed.js +3 -0
  383. package/src/utils/startZoom.js +5 -0
  384. package/src/utils/taillight.js +1 -0
  385. package/src/utils/terrainAtlas.js +21 -0
  386. package/src/utils/terrainElevation.js +20 -0
  387. package/src/utils/terrainGrid.js +23 -0
  388. package/src/utils/textureSampler.js +10 -0
  389. package/src/utils/tileId.js +18 -0
  390. package/src/utils/toLanes.js +7 -0
  391. package/src/utils/toSRGB.js +1 -0
  392. package/src/utils/tooltip.js +6 -0
  393. package/src/utils/traffic.js +310 -85
  394. package/src/utils/traverse.js +6 -0
  395. package/src/utils/treeGeometry.js +45 -0
  396. package/src/utils/triangulate.js +100 -0
  397. package/src/utils/tripsAt.js +16 -0
  398. package/src/utils/types.js +8 -0
  399. package/src/utils/{control.js → underEntry.js} +1 -2
  400. package/src/utils/update.js +18 -0
  401. package/src/utils/updateArea.js +40 -0
  402. package/src/utils/updateCamera.js +32 -0
  403. package/src/utils/updatePointLights.js +38 -0
  404. package/src/utils/updateWorldMatrix.js +47 -0
  405. package/src/utils/vehicleOffsets.js +8 -0
  406. package/src/utils/vehicles.js +65 -69
  407. package/src/utils/vertexNormals.js +30 -0
  408. package/src/utils/walk.js +181 -66
  409. package/src/utils/white.js +1 -0
  410. package/src/utils/worldLights.js +25 -0
  411. package/src/utils/wrap.js +1 -0
  412. package/dist/scene/gpu.js +0 -3
  413. package/dist/scene/gpu.js.map +0 -7
  414. package/dist/scene/lighting.js +0 -9
  415. package/dist/scene/lighting.js.map +0 -7
  416. package/dist/scene/model.js +0 -2
  417. package/dist/scene/model.js.map +0 -7
  418. package/dist/scene/picking.js +0 -2
  419. package/dist/scene/picking.js.map +0 -7
  420. package/dist/scene/pmtiles.js +0 -2
  421. package/dist/scene/pmtiles.js.map +0 -7
  422. package/dist/scene/render.js +0 -15
  423. package/dist/scene/render.js.map +0 -7
  424. package/dist/scene/sources.js +0 -2
  425. package/dist/scene/sources.js.map +0 -7
  426. package/dist/types/3d.js +0 -2
  427. package/dist/types/3d.js.map +0 -7
  428. package/dist/types/geojson.js +0 -2
  429. package/dist/types/geojson.js.map +0 -7
  430. package/dist/types/pmtiles.js +0 -2
  431. package/dist/types/pmtiles.js.map +0 -7
  432. package/dist/types/sunlight.js +0 -2
  433. package/dist/types/sunlight.js.map +0 -7
  434. package/dist/types/terrain.js +0 -24
  435. package/dist/types/terrain.js.map +0 -7
  436. package/dist/types/traffic.js +0 -41
  437. package/dist/types/traffic.js.map +0 -7
  438. package/dist/types/walk.js +0 -2
  439. package/dist/types/walk.js.map +0 -7
  440. package/dist/utils/control.js +0 -2
  441. package/dist/utils/control.js.map +0 -7
  442. package/dist/utils/lighting.js +0 -2
  443. package/dist/utils/lighting.js.map +0 -7
  444. package/dist/utils/model.js +0 -2
  445. package/dist/utils/model.js.map +0 -7
  446. package/dist/utils/picking.js +0 -2
  447. package/dist/utils/picking.js.map +0 -7
  448. package/dist/utils/pmtiles.js +0 -2
  449. package/dist/utils/pmtiles.js.map +0 -7
  450. package/dist/utils/scene.js +0 -2
  451. package/dist/utils/scene.js.map +0 -7
  452. package/dist/utils/shaders.js.map +0 -7
  453. package/dist/utils/sun.js +0 -2
  454. package/dist/utils/sun.js.map +0 -7
  455. package/dist/utils/terrain.js +0 -2
  456. package/dist/utils/terrain.js.map +0 -7
  457. package/src/scene/gpu.js +0 -438
  458. package/src/scene/lighting.js +0 -193
  459. package/src/scene/picking.js +0 -150
  460. package/src/scene/pmtiles.js +0 -94
  461. package/src/types/3d.js +0 -337
  462. package/src/types/geojson.js +0 -42
  463. package/src/types/pmtiles.js +0 -143
  464. package/src/types/sunlight.js +0 -142
  465. package/src/types/terrain.js +0 -331
  466. package/src/types/traffic.js +0 -356
  467. package/src/types/walk.js +0 -219
  468. package/src/utils/model.js +0 -178
  469. package/src/utils/pmtiles.js +0 -79
  470. package/src/utils/scene.js +0 -102
  471. package/src/utils/sun.js +0 -71
  472. package/src/utils/terrain.js +0 -78
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/loadTerrain.js"],
4
+ "sourcesContent": ["import { addBridges } from './addBridges.js';\nimport { conformModelToTerrain } from './conformModelToTerrain.js';\nimport { getElevation } from './getElevation.js';\nimport { setTerrainHeight } from './setTerrainHeight.js';\nimport { update } from './update.js';\n\n\nexport async function loadTerrain(backend) {\n if (backend._terrainLoading || !backend._map) return;\n backend._terrainLoading = true;\n backend._terrainReady = false;\n const controller = backend._terrainController = new AbortController();\n try {\n if (!backend.terrainSource) throw new Error('Terrain layer requires a PMTiles elevation archive');\n const archive = backend._terrainArchive = new L.Layer({ source: { type: 'pmtiles', url: backend.terrainSource } });\n await archive.ready;\n const header = archive.header;\n if (header.tileType !== 0 || header.minZoom !== header.maxZoom) {\n throw new Error('Expected a single-zoom Float32 PMTiles terrain archive');\n }\n backend._terrainZoom = header.maxZoom;\n const map = backend._map;\n const northwest = map.project([header.maxLat, header.minLon], backend._terrainZoom).divideBy(256).floor();\n const southeast = map.project([header.minLat, header.maxLon], backend._terrainZoom).divideBy(256).floor();\n backend._terrainBounds = new L.Bounds(northwest, southeast);\n const tiles = [];\n for (let x = northwest.x; x <= southeast.x; x++) {\n for (let y = northwest.y; y <= southeast.y; y++) tiles.push({ z: backend._terrainZoom, x, y });\n }\n const center = map.project(map.getCenter(), backend._terrainZoom).divideBy(256);\n tiles.sort((a, b) => Math.hypot(a.x + 0.5 - center.x, a.y + 0.5 - center.y) -\n Math.hypot(b.x + 0.5 - center.x, b.y + 0.5 - center.y));\n let next = 0;\n await Promise.all(Array.from({ length: Math.min(4, tiles.length) }, async () => {\n while (next < tiles.length) {\n controller.signal.throwIfAborted();\n const coords = tiles[next++];\n const result = await archive.getZxy(coords.z, coords.x, coords.y, controller.signal);\n if (!result || result.data.byteLength !== 256 * 256 * 4) {\n throw new Error(`Missing or invalid Float32 terrain tile ${coords.z}/${coords.x}/${coords.y}`);\n }\n backend._terrainTiles.set(`${coords.x}/${coords.y}`, new Float32Array(result.data));\n }\n }));\n const bridges = backend.options.bridges && await fetch(backend.options.bridges, { signal: controller.signal })\n .then(response => { if (!response.ok) throw new Error(`Bridges: HTTP ${response.status}`); return response.json(); });\n if (controller.signal.aborted || backend._map !== map) return;\n backend._terrainReady = true;\n backend._terrainOriginElevation = getElevation(backend, backend.location) ?? 0;\n for (const layer of Object.values(map._layers)) {\n setTerrainHeight(layer);\n conformModelToTerrain(layer, backend);\n }\n if (bridges) addBridges(backend, bridges);\n map.fire('terrainchange');\n update(backend);\n backend.fire('terrainready');\n return true;\n } catch (error) {\n if (!controller.signal.aborted) backend.fire('error', { error });\n return false;\n } finally {\n backend._terrainLoading = false;\n }\n}\n"],
5
+ "mappings": "AAAA,OAAS,cAAAA,MAAkB,kBAC3B,OAAS,yBAAAC,MAA6B,6BACtC,OAAS,gBAAAC,MAAoB,oBAC7B,OAAS,oBAAAC,MAAwB,wBACjC,OAAS,UAAAC,MAAc,cAGvB,eAAsBC,EAAYC,EAAS,CACzC,GAAIA,EAAQ,iBAAmB,CAACA,EAAQ,KAAM,OAC9CA,EAAQ,gBAAkB,GAC1BA,EAAQ,cAAgB,GACxB,MAAMC,EAAaD,EAAQ,mBAAqB,IAAI,gBACpD,GAAI,CACF,GAAI,CAACA,EAAQ,cAAe,MAAM,IAAI,MAAM,oDAAoD,EAChG,MAAME,EAAUF,EAAQ,gBAAkB,IAAI,EAAE,MAAM,CAAE,OAAQ,CAAE,KAAM,UAAW,IAAKA,EAAQ,aAAc,CAAE,CAAC,EACjH,MAAME,EAAQ,MACd,MAAMC,EAASD,EAAQ,OACvB,GAAIC,EAAO,WAAa,GAAKA,EAAO,UAAYA,EAAO,QACrD,MAAM,IAAI,MAAM,wDAAwD,EAE1EH,EAAQ,aAAeG,EAAO,QAC9B,MAAMC,EAAMJ,EAAQ,KACdK,EAAYD,EAAI,QAAQ,CAACD,EAAO,OAAQA,EAAO,MAAM,EAAGH,EAAQ,YAAY,EAAE,SAAS,GAAG,EAAE,MAAM,EAClGM,EAAYF,EAAI,QAAQ,CAACD,EAAO,OAAQA,EAAO,MAAM,EAAGH,EAAQ,YAAY,EAAE,SAAS,GAAG,EAAE,MAAM,EACxGA,EAAQ,eAAiB,IAAI,EAAE,OAAOK,EAAWC,CAAS,EAC1D,MAAMC,EAAQ,CAAC,EACf,QAASC,EAAIH,EAAU,EAAGG,GAAKF,EAAU,EAAGE,IAC1C,QAASC,EAAIJ,EAAU,EAAGI,GAAKH,EAAU,EAAGG,IAAKF,EAAM,KAAK,CAAE,EAAGP,EAAQ,aAAc,EAAAQ,EAAG,EAAAC,CAAE,CAAC,EAE/F,MAAMC,EAASN,EAAI,QAAQA,EAAI,UAAU,EAAGJ,EAAQ,YAAY,EAAE,SAAS,GAAG,EAC9EO,EAAM,KAAK,CAACI,EAAGC,IAAM,KAAK,MAAMD,EAAE,EAAI,GAAMD,EAAO,EAAGC,EAAE,EAAI,GAAMD,EAAO,CAAC,EACxE,KAAK,MAAME,EAAE,EAAI,GAAMF,EAAO,EAAGE,EAAE,EAAI,GAAMF,EAAO,CAAC,CAAC,EACxD,IAAIG,EAAO,EACX,MAAM,QAAQ,IAAI,MAAM,KAAK,CAAE,OAAQ,KAAK,IAAI,EAAGN,EAAM,MAAM,CAAE,EAAG,SAAY,CAC9E,KAAOM,EAAON,EAAM,QAAQ,CAC1BN,EAAW,OAAO,eAAe,EACjC,MAAMa,EAASP,EAAMM,GAAM,EACrBE,EAAS,MAAMb,EAAQ,OAAOY,EAAO,EAAGA,EAAO,EAAGA,EAAO,EAAGb,EAAW,MAAM,EACnF,GAAI,CAACc,GAAUA,EAAO,KAAK,aAAe,IAAM,IAAM,EACpD,MAAM,IAAI,MAAM,2CAA2CD,EAAO,CAAC,IAAIA,EAAO,CAAC,IAAIA,EAAO,CAAC,EAAE,EAE/Fd,EAAQ,cAAc,IAAI,GAAGc,EAAO,CAAC,IAAIA,EAAO,CAAC,GAAI,IAAI,aAAaC,EAAO,IAAI,CAAC,CACpF,CACF,CAAC,CAAC,EACF,MAAMC,EAAUhB,EAAQ,QAAQ,SAAW,MAAM,MAAMA,EAAQ,QAAQ,QAAS,CAAE,OAAQC,EAAW,MAAO,CAAC,EAC1G,KAAKgB,GAAY,CAAE,GAAI,CAACA,EAAS,GAAI,MAAM,IAAI,MAAM,iBAAiBA,EAAS,MAAM,EAAE,EAAG,OAAOA,EAAS,KAAK,CAAG,CAAC,EACtH,GAAIhB,EAAW,OAAO,SAAWD,EAAQ,OAASI,EAAK,OACvDJ,EAAQ,cAAgB,GACxBA,EAAQ,wBAA0BJ,EAAaI,EAASA,EAAQ,QAAQ,GAAK,EAC7E,UAAWkB,KAAS,OAAO,OAAOd,EAAI,OAAO,EAC3CP,EAAiBqB,CAAK,EACtBvB,EAAsBuB,EAAOlB,CAAO,EAEtC,OAAIgB,GAAStB,EAAWM,EAASgB,CAAO,EACxCZ,EAAI,KAAK,eAAe,EACxBN,EAAOE,CAAO,EACdA,EAAQ,KAAK,cAAc,EACpB,EACT,OAASmB,EAAO,CACd,OAAKlB,EAAW,OAAO,SAASD,EAAQ,KAAK,QAAS,CAAE,MAAAmB,CAAM,CAAC,EACxD,EACT,QAAE,CACAnB,EAAQ,gBAAkB,EAC5B,CACF",
6
+ "names": ["addBridges", "conformModelToTerrain", "getElevation", "setTerrainHeight", "update", "loadTerrain", "backend", "controller", "archive", "header", "map", "northwest", "southeast", "tiles", "x", "y", "center", "a", "b", "next", "coords", "result", "bridges", "response", "layer", "error"]
7
+ }
@@ -0,0 +1,2 @@
1
+ const l=Object.defineProperties({},Object.getOwnPropertyDescriptors(L.Map.prototype)),T=Math.PI/180,m=t=>Array.isArray(t)?new L.Point(t[0],t[1]):new L.Point(t.x,t.y);L.Map.mergeOptions({rotate:!0,bearing:0,pitch:0,pitchMaxDistance:3,rotateControl:!0,shiftKeyRotate:!0,pitchDrag:!0,touchRotate:!1,touchPitch:!1,compassBearing:!1});function G(t){const e=t.getBearing()*T,i=t.getPitch()*T;return[Math.cos(e),Math.sin(e),Math.cos(i),Math.sin(i)]}function M(t,e,i=!1,n=!1){const o=t.getSize().divideBy(2),a=t.getSize().y*1.5;if(!a)return m(e);const[s,r,h,c]=G(t),g=m(e).subtract(o);if(i){const y=t.getSize().y*t.options.pitchMaxDistance,B=h*a+c*g.y;let _=B>0?g.y*a/B:-y;n&&(_=Math.max(-y,Math.min(y,_)));const x=g.x*(a-c*_)/a;return new L.Point(s*x+r*_,-r*x+s*_).add(o)}const d=s*g.x-r*g.y,p=r*g.x+s*g.y,f=a/(a-c*p);return new L.Point(d*f,h*p*f).add(o)}function I(t,e){return t.layerPointToContainerPoint(e).subtract(t._getMapPanePos())}function E(t,e,i=!1){const n=t._cameraView;if(!n)return e;const o=t.getSize().divideBy(2),a=t.getZoomScale(n.zoom),s=t.project(t.getCenter(),n.zoom).subtract(t.project(n.center,n.zoom));return i?e.subtract(o).subtract(s).divideBy(a).add(o):e.subtract(o).multiplyBy(a).add(s).add(o)}function F(t,e=[0,0]){const i=m(e).divideBy(2),n=t.getSize().subtract(i);return new L.Bounds([[i.x,i.y],[n.x,i.y],[i.x,n.y],[n.x,n.y]].map(o=>M(t,o,!0,!0)))}function $(t,e,i={}){e=e.getBounds?e.getBounds():e instanceof L.LatLngBounds?e:new L.LatLngBounds(e);const n=t.getZoom()??0,o=t.getSize().divideBy(2),a=t.getSize().y*1.5,s=m(i.paddingTopLeft||i.padding||[0,0]).subtract(o),r=o.subtract(m(i.paddingBottomRight||i.padding||[0,0])),[h,c,g,d]=G(t),p=t.getSize().y*t.options.pitchMaxDistance,f=u=>g*a+d*u>0?Math.max(-p,Math.min(p,u*a/(g*a+d*u))):-p,y=f(s.y),B=f(r.y),_=t.project(e.getNorthWest(),n).add(t.project(e.getSouthEast(),n)).divideBy(2),x=[e.getNorthWest(),e.getNorthEast(),e.getSouthWest(),e.getSouthEast()].map(u=>{const S=t.project(u,n).subtract(_);return new L.Point(h*S.x-c*S.y,c*S.x+h*S.y)}),C=Math.min(...x.map(u=>u.y)),O=Math.max(...x.map(u=>u.y)),k=s.x*d/a,j=r.x*d/a,w=j-k,z=Math.min(...x.map(u=>u.x+k*u.y)),D=Math.max(...x.map(u=>u.x+j*u.y)),q=Math.min((B-y)/(O-C),(r.x-s.x-w*y)/(D-z-w*C));let P=t.getScaleZoom(q,n);const Z=t.options.zoomSnap;if(Z&&(P=Math.floor(Math.round(P/(Z/100))/100)*Z),P=Math.max(t.getMinZoom(),Math.min(t.getMaxZoom(),i.maxZoom??1/0,P)),!Number.isFinite(P))return{center:e.getCenter(),zoom:P};const b=t.getZoomScale(P,n),U=O*b-B,N=C*b-y,V=Math.max(U,w?(b*(D-z)-r.x+s.x)/w:U),A=(Math.min(N,V)+N)/2,R=(b*(z+D)-s.x-r.x-(k+j)*A)/2,H=_.add(new L.Point(h*R+c*A,-c*R+h*A).divideBy(b));return{center:t.unproject(H,n),zoom:P}}function W(){const t=this.getSize().y,e=this.getPitch()*T,i=t*this.options.pitchMaxDistance,n=t*1.5,o=t/2-i*Math.cos(e)*n/(n+Math.sin(e)*i);o>0&&!this._pitchSky&&(this._pitchSky=L.DomUtil.create("div","leaflet-pitch-sky",this.getContainer()),this._pitchSky.setAttribute("aria-hidden","true"),this._pitchSky.style.cssText="position:absolute;inset:0 0 auto;height:0;z-index:0;pointer-events:none;background:var(--leaflet-sky-background,linear-gradient(#9ec5e8,#dfe9f0))"),this._pitchSky&&(this._pitchSky.style.height=`${Math.max(0,Math.ceil(o))}px`,this._pitchSky.style.display=o>0?"":"none")}L.Map.include({getBearing(){return this._cameraBearing??0},getPitch(){return this._cameraPitch??0},_stopPitchBearingAnimation(){return cancelAnimationFrame(this._cameraFrame),this._cameraFrame=null,this},_setPitchAndBearing(t,e){if(!Number.isFinite(t)||!Number.isFinite(e))throw new TypeError("Camera angles must be finite numbers");const i=this.getPitch(),n=this.getBearing();return this._cameraPitch=Math.max(0,Math.min(85,t)),this._cameraBearing=(e%360+360)%360,this._loaded&&(W.call(this),n!==this.getBearing()&&this.fire("rotate",{bearing:this.getBearing()}),i!==this.getPitch()&&this.fire("pitch",{pitch:this.getPitch()})),this},_animateCamera(t,e,i={}){if(cancelAnimationFrame(this._cameraFrame),!Number.isFinite(t)||!Number.isFinite(e))throw new TypeError("Camera angles must be finite numbers");if(!i.animate||matchMedia("(prefers-reduced-motion: reduce)").matches)return this._setPitchAndBearing(t,e);const n=i.duration??.3;if(!Number.isFinite(n)||n<0)throw new TypeError("Camera duration must be nonnegative");const o=performance.now(),a=this.getPitch(),s=this.getBearing(),r=((e-s)%360+540)%360-180,h=c=>{const g=n?Math.min(1,(c-o)/(n*1e3)):1,d=1-(1-g)**3;this._setPitchAndBearing(a+(Math.max(0,Math.min(85,t))-a)*d,s+r*d),g<1&&(this._cameraFrame=requestAnimationFrame(h))};return this._cameraFrame=requestAnimationFrame(h),this},setBearing(t,e){return this._animateCamera(this.getPitch(),t,e)},setPitch(t,e){return this._animateCamera(t,this.getBearing(),e)},resetNorth(t={animate:!0}){return this.setBearing(0,t)},resetNorthPitch(t={animate:!0}){return this._animateCamera(0,0,t)},layerPointToContainerPoint(t){return M(this,E(this,l.layerPointToContainerPoint.call(this,t)))},containerPointToLayerPoint(t){return l.containerPointToLayerPoint.call(this,E(this,M(this,t,!0),!0))},_getCenterLayerPoint(){return l.containerPointToLayerPoint.call(this,this.getSize().divideBy(2))},_updateCameraOverlays(){for(const t of Object.values(this._layers))t instanceof L.Marker?t.update():(t instanceof L.Popup||t instanceof L.Tooltip)&&t._updatePosition()},panBy(t,e){const i=this.getSize().divideBy(2),n=i.subtract(M(this,i.subtract(m(t)),!0));return l.panBy.call(this,n,e)},setZoomAround(t,e,i){if(!this.getPitch()&&!this.getBearing())return l.setZoomAround.call(this,t,e,i);e=this._limitZoom(e);const n=this.getZoomScale(e),o=this.getSize().divideBy(2),a=t instanceof L.Point?t:this.latLngToContainerPoint(t),s=this.containerPointToLayerPoint(o),r=this.containerPointToLayerPoint(a),h=s.add(r.subtract(s).multiplyBy(1-1/n));return this.setView(this.layerPointToLatLng(h),e,{zoom:i})},panInside(t,e={}){if(!this.getPitch()&&!this.getBearing())return l.panInside.call(this,t,e);const i=m(e.paddingTopLeft||e.padding||[0,0]),n=this.getSize().subtract(m(e.paddingBottomRight||e.padding||[0,0])),o=this.latLngToContainerPoint(t),a=new L.Point(Math.max(i.x,Math.min(n.x,o.x)),Math.max(i.y,Math.min(n.y,o.y)));if(a.equals(o))return this;const s=this.latLngToLayerPoint(t).subtract(this.containerPointToLayerPoint(a));return this.panTo(this.unproject(this.project(this.getCenter()).add(s)),e)},_limitCenter(t,e,i){if(!i||!this._loaded||!this.getPitch()&&!this.getBearing())return l._limitCenter.call(this,t,e,i);const n=this.getSize().divideBy(2),o=F(this),a=this.project(t,e),s=new L.Bounds(a.add(o.min.subtract(n)),a.add(o.max.subtract(n))),r=this._getBoundsOffset(s,i,e);return Math.abs(r.x)<=1&&Math.abs(r.y)<=1?t:this.unproject(a.add(r),e)},_limitOffset(t,e){if(!e||!this.getPitch()&&!this.getBearing())return l._limitOffset.call(this,t,e);const i=this.getSize().divideBy(2),n=i.subtract(M(this,i.subtract(t),!0)),o=this.project(this.getCenter()),a=this.project(this._limitCenter(this.unproject(o.add(n)),this.getZoom(),e));return i.subtract(M(this,i.subtract(a.subtract(o))))},_getBoundsCenterZoom(t,e){return this.getPitch()||this.getBearing()?$(this,t,e):l._getBoundsCenterZoom.call(this,t,e)},getBoundsZoom(t,e,i){if(!this.getPitch()&&!this.getBearing())return l.getBoundsZoom.call(this,t,e,i);if(!e)return $(this,t,{padding:m(i||[0,0]).divideBy(2)}).zoom;t=t instanceof L.LatLngBounds?t:new L.LatLngBounds(t);const n=F(this,i).getSize(),o=this.project(t.getSouthEast()).subtract(this.project(t.getNorthWest())),a=this.getScaleZoom(Math.max(n.x/o.x,n.y/o.y)),s=this.options.zoomSnap;return Math.max(this.getMinZoom(),Math.min(this.getMaxZoom(),s?Math.ceil(a/s)*s:a))},_tryAnimatedPan(t,e){const i=this._getCenterOffset(t)._trunc();return e?.animate!==!0&&!this.getSize().contains(i)?!1:(l.panBy.call(this,i,e),!0)},getBounds(){if(!this.getPitch()&&!this.getBearing())return l.getBounds.call(this);const t=F(this),e=new L.LatLngBounds;for(const i of[t.min,t.max]){const n=l.containerPointToLayerPoint.call(this,E(this,i,!0));e.extend(this.layerPointToLatLng(n))}return e}}),L.Map.addInitHook(function(){if(!document.getElementById("leaflet-camera-zoom-style")){const t=document.createElement("style");t.id="leaflet-camera-zoom-style",t.textContent=[".leaflet-marker-icon",".leaflet-marker-shadow",".leaflet-popup",".leaflet-tooltip"].map(e=>`.leaflet-camera-zoom ${e}`).join(",")+"{transition:none!important}",document.head.append(t)}this._setPitchAndBearing(this.options.pitch,this.options.bearing),this.on("load resize pitch",W),this.on("rotate pitch",()=>{this.options.maxBounds&&this._panInsideMaxBounds()}),this.once("unload",()=>{cancelAnimationFrame(this._cameraFrame),this._pitchSky?.remove()}),this.whenReady(()=>{const t=this.dragging?._draggable;if(!t)return;const e=()=>{if(!this.getPitch()&&!this.getBearing())return;const i=this.getSize().divideBy(2),n=t._newPos.subtract(t._startPos),o=i.subtract(M(this,i.subtract(n),!0));t._newPos=t._startPos.add(o)};t.on("predrag",e),this.once("unload",()=>t.off("predrag",e))}),(this.options.rotate||this.options.trackContainerMutation)&&(this.cameraReady=import("./cameraControls.js").then(({cameraControls:t})=>{this._container?._leaflet_id&&t(this)}),this.cameraReady.catch(t=>this.fire("error",{error:t})))});const v=Object.defineProperties({},Object.getOwnPropertyDescriptors(L.Marker.prototype));L.Marker.mergeOptions({rotation:0,rotateWithView:!1,keepUpright:!1,scale:1}),L.Marker.include({setIcon(t){t instanceof L.DivIcon||(t.options.crossOrigin||=!0);const e=v.setIcon.call(this,t);return this._map&&!(t instanceof L.DivIcon)&&this._initNativeGPU(this._map),e},setRotation(t){if(!Number.isFinite(t))throw new TypeError("Marker rotation must be finite");return this.options.rotation=t,this.update(),this._nativeGPU?.refresh?.(),this},_cameraIconPoint(t,e){let i=this.options.rotation+(this.options.rotateWithView?this._map.getBearing()*T:0);this.options.keepUpright&&Math.cos(i)<0&&(i+=Math.PI);const n=this.options.scale;return new L.Point((t*Math.cos(i)-e*Math.sin(i))*n,(t*Math.sin(i)+e*Math.cos(i))*n)},getEvents(){return{...v.getEvents.call(this),rotate:this.update,pitch:this.update,move:this.update}},_setPos(t){v._setPos.call(this,I(this._map,t));for(const[e,i]of[[this._icon,"iconAnchor"],[this._shadow,"shadowAnchor"]]){if(!e)continue;const n=this._cameraIconPoint(1,0),o=this.options.icon.options,a=o[i]||o.iconAnchor;e.style.transformOrigin=a?`${a.x??a[0]}px ${a.y??a[1]}px`:"center",e.style.transform+=` rotate(${Math.atan2(n.y,n.x)}rad) scale(${this.options.scale})`}},_updateZIndex(t){v._updateZIndex.call(this,t);const e=this._cameraZIndexOffset!==t;this._cameraZIndexOffset=t,e&&this._nativeGPU?.refresh?.()},_initInteraction(){const t=v._initInteraction.call(this);return K.call(this),t}});function K(){if(!this.dragging||this.dragging._cameraDrag)return;const t=this.dragging,e=t._onDrag,i=t._adjustPan;t._onDrag=function(o){const a=this._marker._map,s=L.DomUtil.getPosition(this._marker._icon).add(a._getMapPanePos()),r=a.containerPointToLayerPoint(s),h=this._marker._icon;L.DomUtil.setPosition(h,r),e.call(this,o),this._marker._setPos(r)},t._adjustPan=function(o){const a=this._marker,s=a._map;if(!s.getPitch()&&!s.getBearing())return i.call(this,o);const r=L.DomUtil.getPosition(a._icon).add(s._getMapPanePos()),h=s.getSize(),c=m(a.options.autoPanPadding),g=a.options.autoPanSpeed,d=new L.Point((Math.max(0,r.x-h.x+c.x)-Math.max(0,c.x-r.x))/Math.max(1,c.x)*g,(Math.max(0,r.y-h.y+c.y)-Math.max(0,c.y-r.y))/Math.max(1,c.y)*g);if(!d.x&&!d.y)return;const p=s._getMapPanePos();s.panBy(d,{animate:!1});const f=p.subtract(s._getMapPanePos());this._draggable._newPos._add(f),this._draggable._startPos._add(f),L.DomUtil.setPosition(a._icon,this._draggable._newPos),this._onDrag(o),this._panRequest=requestAnimationFrame(()=>this._adjustPan(o))},t.enabled()&&(t._draggable.off("drag",e,t),t._draggable.on("drag",t._onDrag,t)),t._cameraDrag=!0}for(const t of[L.Popup,L.Tooltip]){const e=t.prototype.getEvents;t.include({getEvents(){return{...e.call(this),rotate:this._updatePosition,pitch:this._updatePosition,move:this._updatePosition}}})}const X=L.Popup.prototype._updatePosition,Y=L.Popup.prototype._adjustPan;L.Popup.include({_adjustPan(){const t=this._map;if(!t.getPitch()&&!t.getBearing())return Y.call(this);if(!this.options.autoPan)return;if(t._panAnim&&t._panAnim.stop(),this._autopanning){this._autopanning=!1;return}const e=this._container.getBoundingClientRect(),i=t.getContainer().getBoundingClientRect(),n=m(this.options.autoPanPaddingTopLeft||this.options.autoPanPadding),o=t.getSize().subtract(m(this.options.autoPanPaddingBottomRight||this.options.autoPanPadding)),a=e.left-i.left,s=e.top-i.top,r=e.right-i.left,h=e.bottom-i.top,c=Math.min(0,a-n.x)||Math.max(0,r-o.x),g=Math.min(0,s-n.y)||Math.max(0,h-o.y);if(!c&&!g)return;this.options.keepInView&&(this._autopanning=!0);const d=t.latLngToContainerPoint(this._latlng).subtract(new L.Point(c,g)),p=t.latLngToLayerPoint(this._latlng).subtract(t.containerPointToLayerPoint(d));t.fire("autopanstart"),t.panTo(t.unproject(t.project(t.getCenter()).add(p)))},_updatePosition(){if(X.call(this),!this._map)return;const t=this._map.latLngToLayerPoint(this._latlng),e=I(this._map,t).subtract(t);this._zoomAnimated?L.DomUtil.setPosition(this._container,L.DomUtil.getPosition(this._container).add(e)):(this._container.style.left=`${this._containerLeft+e.x}px`,this._container.style.bottom=`${this._containerBottom-e.y}px`)}});const J=L.Tooltip.prototype._setPosition;L.Tooltip.include({_setPosition(t){J.call(this,t);const e=I(this._map,t).subtract(t);L.DomUtil.setPosition(this._container,L.DomUtil.getPosition(this._container).add(e))}});const Q=L.GridLayer.prototype._getTiledPixelBounds,tt=L.GridLayer.prototype.getEvents;L.GridLayer.include({getEvents(){const t=tt.call(this);return this._cameraGridUpdate||=L.Util.throttle(this._onMoveEnd,this.options.updateInterval,this),{...t,rotate:this._cameraGridUpdate,pitch:this._cameraGridUpdate}},_getTiledPixelBounds(t){if(!this._map.getBearing()&&!this._map.getPitch())return Q.call(this,t);const e=this._map.getBounds();return new L.Bounds(this._map.project(e.getNorthWest(),this._tileZoom),this._map.project(e.getSouthEast(),this._tileZoom))}});
2
+ //# sourceMappingURL=mapCamera.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/mapCamera.js"],
4
+ "sourcesContent": ["const mapMethods = Object.defineProperties({}, Object.getOwnPropertyDescriptors(L.Map.prototype));\r\nconst radians = Math.PI / 180;\r\nconst pointOf = point => Array.isArray(point) ? new L.Point(point[0], point[1]) : new L.Point(point.x, point.y);\r\n\r\nL.Map.mergeOptions({\r\n rotate: true, bearing: 0, pitch: 0, pitchMaxDistance: 3,\r\n rotateControl: true, shiftKeyRotate: true, pitchDrag: true,\r\n touchRotate: false, touchPitch: false, compassBearing: false,\r\n});\r\n\r\nfunction angles(map) {\r\n const bearing = map.getBearing() * radians, pitch = map.getPitch() * radians;\r\n return [Math.cos(bearing), Math.sin(bearing), Math.cos(pitch), Math.sin(pitch)];\r\n}\r\n\r\n// Ground coordinates only: the GPU camera handles elevated geometry, never CSS transforms.\r\nfunction project(map, point, inverse = false, limit = false) {\r\n const half = map.getSize().divideBy(2), distance = map.getSize().y * 1.5;\r\n if (!distance) return pointOf(point);\r\n const [cos, sin, tilt, rise] = angles(map);\r\n const p = pointOf(point).subtract(half);\r\n if (inverse) {\r\n const far = map.getSize().y * map.options.pitchMaxDistance;\r\n const denominator = tilt * distance + rise * p.y;\r\n let v = denominator > 0 ? p.y * distance / denominator : -far;\r\n if (limit) v = Math.max(-far, Math.min(far, v));\r\n const u = p.x * (distance - rise * v) / distance;\r\n return new L.Point(cos * u + sin * v, -sin * u + cos * v).add(half);\r\n }\r\n const u = cos * p.x - sin * p.y, v = sin * p.x + cos * p.y;\r\n const scale = distance / (distance - rise * v);\r\n return new L.Point(u * scale, tilt * v * scale).add(half);\r\n}\r\n\r\nfunction displayPoint(map, point) {\r\n return map.layerPointToContainerPoint(point).subtract(map._getMapPanePos());\r\n}\r\n\r\nfunction animationPoint(map, point, inverse = false) {\r\n const view = map._cameraView;\r\n if (!view) return point;\r\n const half = map.getSize().divideBy(2), scale = map.getZoomScale(view.zoom);\r\n const shift = map.project(map.getCenter(), view.zoom).subtract(map.project(view.center, view.zoom));\r\n return inverse ? point.subtract(half).subtract(shift).divideBy(scale).add(half) :\r\n point.subtract(half).multiplyBy(scale).add(shift).add(half);\r\n}\r\n\r\nfunction groundBounds(map, padding = [0, 0]) {\r\n const min = pointOf(padding).divideBy(2), max = map.getSize().subtract(min);\r\n return new L.Bounds([[min.x, min.y], [max.x, min.y], [min.x, max.y], [max.x, max.y]]\r\n .map(point => project(map, point, true, true)));\r\n}\r\n\r\nfunction fitCameraBounds(map, bounds, options = {}) {\r\n bounds = bounds.getBounds ? bounds.getBounds() : bounds instanceof L.LatLngBounds ? bounds : new L.LatLngBounds(bounds);\r\n const zoom = map.getZoom() ?? 0, half = map.getSize().divideBy(2), distance = map.getSize().y * 1.5;\r\n const min = pointOf(options.paddingTopLeft || options.padding || [0, 0]).subtract(half);\r\n const max = half.subtract(pointOf(options.paddingBottomRight || options.padding || [0, 0]));\r\n const [cos, sin, tilt, rise] = angles(map);\r\n const far = map.getSize().y * map.options.pitchMaxDistance;\r\n const vertical = y => tilt * distance + rise * y > 0\r\n ? Math.max(-far, Math.min(far, y * distance / (tilt * distance + rise * y))) : -far;\r\n const top = vertical(min.y), bottom = vertical(max.y);\r\n const origin = map.project(bounds.getNorthWest(), zoom).add(map.project(bounds.getSouthEast(), zoom)).divideBy(2);\r\n const points = [bounds.getNorthWest(), bounds.getNorthEast(), bounds.getSouthWest(), bounds.getSouthEast()]\r\n .map(latlng => {\r\n const p = map.project(latlng, zoom).subtract(origin);\r\n return new L.Point(cos * p.x - sin * p.y, sin * p.x + cos * p.y);\r\n });\r\n const low = Math.min(...points.map(p => p.y)), high = Math.max(...points.map(p => p.y));\r\n const leftSlope = min.x * rise / distance, rightSlope = max.x * rise / distance;\r\n const slope = rightSlope - leftSlope;\r\n const left = Math.min(...points.map(p => p.x + leftSlope * p.y));\r\n const right = Math.max(...points.map(p => p.x + rightSlope * p.y));\r\n // Perspective viewport edges are straight lines on the ground: fit all four corners, not their screen midpoint.\r\n const scale = Math.min((bottom - top) / (high - low),\r\n (max.x - min.x - slope * top) / (right - left - slope * low));\r\n let target = map.getScaleZoom(scale, zoom);\r\n const snap = map.options.zoomSnap;\r\n if (snap) target = Math.floor(Math.round(target / (snap / 100)) / 100) * snap;\r\n target = Math.max(map.getMinZoom(), Math.min(map.getMaxZoom(), options.maxZoom ?? Infinity, target));\r\n if (!Number.isFinite(target)) return { center: bounds.getCenter(), zoom: target };\r\n const actual = map.getZoomScale(target, zoom);\r\n const vMin = high * actual - bottom, vMax = low * actual - top;\r\n const v = Math.max(vMin, slope ? (actual * (right - left) - max.x + min.x) / slope : vMin);\r\n const centerY = (Math.min(vMax, v) + vMax) / 2;\r\n const centerX = (actual * (left + right) - min.x - max.x - (leftSlope + rightSlope) * centerY) / 2;\r\n const center = origin.add(new L.Point(cos * centerX + sin * centerY, -sin * centerX + cos * centerY).divideBy(actual));\r\n return { center: map.unproject(center, zoom), zoom: target };\r\n}\r\n\r\nfunction updateSky() {\r\n const height = this.getSize().y, pitch = this.getPitch() * radians;\r\n const far = height * this.options.pitchMaxDistance, distance = height * 1.5;\r\n const top = height / 2 - far * Math.cos(pitch) * distance / (distance + Math.sin(pitch) * far);\r\n if (top > 0 && !this._pitchSky) {\r\n this._pitchSky = L.DomUtil.create('div', 'leaflet-pitch-sky', this.getContainer());\r\n this._pitchSky.setAttribute('aria-hidden', 'true');\r\n this._pitchSky.style.cssText = 'position:absolute;inset:0 0 auto;height:0;z-index:0;pointer-events:none;background:var(--leaflet-sky-background,linear-gradient(#9ec5e8,#dfe9f0))';\r\n }\r\n if (this._pitchSky) {\r\n this._pitchSky.style.height = `${Math.max(0, Math.ceil(top))}px`;\r\n this._pitchSky.style.display = top > 0 ? '' : 'none';\r\n }\r\n}\r\n\r\nL.Map.include({\r\n getBearing() { return this._cameraBearing ?? 0; },\r\n getPitch() { return this._cameraPitch ?? 0; },\r\n _stopPitchBearingAnimation() {\r\n cancelAnimationFrame(this._cameraFrame);\r\n this._cameraFrame = null;\r\n return this;\r\n },\r\n _setPitchAndBearing(pitch, bearing) {\r\n if (!Number.isFinite(pitch) || !Number.isFinite(bearing)) throw new TypeError('Camera angles must be finite numbers');\r\n const previousPitch = this.getPitch(), previousBearing = this.getBearing();\r\n this._cameraPitch = Math.max(0, Math.min(85, pitch));\r\n this._cameraBearing = ((bearing % 360) + 360) % 360;\r\n if (this._loaded) {\r\n updateSky.call(this);\r\n if (previousBearing !== this.getBearing()) this.fire('rotate', { bearing: this.getBearing() });\r\n if (previousPitch !== this.getPitch()) this.fire('pitch', { pitch: this.getPitch() });\r\n }\r\n return this;\r\n },\r\n _animateCamera(pitch, bearing, options = {}) {\r\n cancelAnimationFrame(this._cameraFrame);\r\n if (!Number.isFinite(pitch) || !Number.isFinite(bearing)) throw new TypeError('Camera angles must be finite numbers');\r\n if (!options.animate || matchMedia('(prefers-reduced-motion: reduce)').matches) {\r\n return this._setPitchAndBearing(pitch, bearing);\r\n }\r\n const duration = options.duration ?? 0.3;\r\n if (!Number.isFinite(duration) || duration < 0) throw new TypeError('Camera duration must be nonnegative');\r\n const start = performance.now(), fromPitch = this.getPitch(), fromBearing = this.getBearing();\r\n const delta = ((bearing - fromBearing) % 360 + 540) % 360 - 180;\r\n const frame = now => {\r\n const progress = duration ? Math.min(1, (now - start) / (duration * 1000)) : 1;\r\n const eased = 1 - (1 - progress) ** 3;\r\n this._setPitchAndBearing(fromPitch + (Math.max(0, Math.min(85, pitch)) - fromPitch) * eased,\r\n fromBearing + delta * eased);\r\n if (progress < 1) this._cameraFrame = requestAnimationFrame(frame);\r\n };\r\n this._cameraFrame = requestAnimationFrame(frame);\r\n return this;\r\n },\r\n setBearing(bearing, options) { return this._animateCamera(this.getPitch(), bearing, options); },\r\n setPitch(pitch, options) { return this._animateCamera(pitch, this.getBearing(), options); },\r\n resetNorth(options = { animate: true }) { return this.setBearing(0, options); },\r\n resetNorthPitch(options = { animate: true }) { return this._animateCamera(0, 0, options); },\r\n layerPointToContainerPoint(point) {\r\n return project(this, animationPoint(this, mapMethods.layerPointToContainerPoint.call(this, point)));\r\n },\r\n containerPointToLayerPoint(point) {\r\n return mapMethods.containerPointToLayerPoint.call(this, animationPoint(this, project(this, point, true), true));\r\n },\r\n _getCenterLayerPoint() {\r\n return mapMethods.containerPointToLayerPoint.call(this, this.getSize().divideBy(2));\r\n },\r\n _updateCameraOverlays() {\r\n for (const layer of Object.values(this._layers)) {\r\n if (layer instanceof L.Marker) layer.update();\r\n else if (layer instanceof L.Popup || layer instanceof L.Tooltip) layer._updatePosition();\r\n }\r\n },\r\n panBy(offset, options) {\r\n const half = this.getSize().divideBy(2);\r\n const ground = half.subtract(project(this, half.subtract(pointOf(offset)), true));\r\n return mapMethods.panBy.call(this, ground, options);\r\n },\r\n setZoomAround(latlng, zoom, options) {\r\n if (!this.getPitch() && !this.getBearing()) return mapMethods.setZoomAround.call(this, latlng, zoom, options);\r\n zoom = this._limitZoom(zoom);\r\n const scale = this.getZoomScale(zoom), half = this.getSize().divideBy(2);\r\n const screen = latlng instanceof L.Point ? latlng : this.latLngToContainerPoint(latlng);\r\n const center = this.containerPointToLayerPoint(half), anchor = this.containerPointToLayerPoint(screen);\r\n const next = center.add(anchor.subtract(center).multiplyBy(1 - 1 / scale));\r\n return this.setView(this.layerPointToLatLng(next), zoom, { zoom: options });\r\n },\r\n panInside(latlng, options = {}) {\r\n if (!this.getPitch() && !this.getBearing()) return mapMethods.panInside.call(this, latlng, options);\r\n const min = pointOf(options.paddingTopLeft || options.padding || [0, 0]);\r\n const max = this.getSize().subtract(pointOf(options.paddingBottomRight || options.padding || [0, 0]));\r\n const screen = this.latLngToContainerPoint(latlng);\r\n const safe = new L.Point(Math.max(min.x, Math.min(max.x, screen.x)),\r\n Math.max(min.y, Math.min(max.y, screen.y)));\r\n if (safe.equals(screen)) return this;\r\n const delta = this.latLngToLayerPoint(latlng).subtract(this.containerPointToLayerPoint(safe));\r\n return this.panTo(this.unproject(this.project(this.getCenter()).add(delta)), options);\r\n },\r\n _limitCenter(center, zoom, bounds) {\r\n if (!bounds || !this._loaded || !this.getPitch() && !this.getBearing()) {\r\n return mapMethods._limitCenter.call(this, center, zoom, bounds);\r\n }\r\n const half = this.getSize().divideBy(2), footprint = groundBounds(this), point = this.project(center, zoom);\r\n const view = new L.Bounds(point.add(footprint.min.subtract(half)), point.add(footprint.max.subtract(half)));\r\n const offset = this._getBoundsOffset(view, bounds, zoom);\r\n return Math.abs(offset.x) <= 1 && Math.abs(offset.y) <= 1 ? center : this.unproject(point.add(offset), zoom);\r\n },\r\n _limitOffset(offset, bounds) {\r\n if (!bounds || !this.getPitch() && !this.getBearing()) return mapMethods._limitOffset.call(this, offset, bounds);\r\n const half = this.getSize().divideBy(2), ground = half.subtract(project(this, half.subtract(offset), true));\r\n const center = this.project(this.getCenter());\r\n const limited = this.project(this._limitCenter(this.unproject(center.add(ground)), this.getZoom(), bounds));\r\n return half.subtract(project(this, half.subtract(limited.subtract(center))));\r\n },\r\n _getBoundsCenterZoom(bounds, options) {\r\n return this.getPitch() || this.getBearing() ? fitCameraBounds(this, bounds, options) :\r\n mapMethods._getBoundsCenterZoom.call(this, bounds, options);\r\n },\r\n getBoundsZoom(bounds, inside, padding) {\r\n if (!this.getPitch() && !this.getBearing()) return mapMethods.getBoundsZoom.call(this, bounds, inside, padding);\r\n if (!inside) return fitCameraBounds(this, bounds, { padding: pointOf(padding || [0, 0]).divideBy(2) }).zoom;\r\n bounds = bounds instanceof L.LatLngBounds ? bounds : new L.LatLngBounds(bounds);\r\n const footprint = groundBounds(this, padding).getSize(), size = this.project(bounds.getSouthEast()).subtract(this.project(bounds.getNorthWest()));\r\n const zoom = this.getScaleZoom(Math.max(footprint.x / size.x, footprint.y / size.y));\r\n const snap = this.options.zoomSnap;\r\n return Math.max(this.getMinZoom(), Math.min(this.getMaxZoom(), snap ? Math.ceil(zoom / snap) * snap : zoom));\r\n },\r\n _tryAnimatedPan(center, options) {\r\n // Leaflet's geographic recentering already supplies ground pixels, not screen pixels.\r\n const offset = this._getCenterOffset(center)._trunc();\r\n if (options?.animate !== true && !this.getSize().contains(offset)) return false;\r\n mapMethods.panBy.call(this, offset, options);\r\n return true;\r\n },\r\n getBounds() {\r\n if (!this.getPitch() && !this.getBearing()) return mapMethods.getBounds.call(this);\r\n const footprint = groundBounds(this), bounds = new L.LatLngBounds();\r\n for (const point of [footprint.min, footprint.max]) {\r\n const raw = mapMethods.containerPointToLayerPoint.call(this, animationPoint(this, point, true));\r\n bounds.extend(this.layerPointToLatLng(raw));\r\n }\r\n return bounds;\r\n },\r\n});\r\n\r\nL.Map.addInitHook(function () {\r\n if (!document.getElementById('leaflet-camera-zoom-style')) {\r\n const style = document.createElement('style');\r\n style.id = 'leaflet-camera-zoom-style';\r\n style.textContent = ['.leaflet-marker-icon', '.leaflet-marker-shadow', '.leaflet-popup', '.leaflet-tooltip']\r\n .map(selector => `.leaflet-camera-zoom ${selector}`).join(',') + '{transition:none!important}';\r\n document.head.append(style);\r\n }\r\n this._setPitchAndBearing(this.options.pitch, this.options.bearing);\r\n this.on('load resize pitch', updateSky);\r\n this.on('rotate pitch', () => {\r\n if (this.options.maxBounds) this._panInsideMaxBounds();\r\n });\r\n this.once('unload', () => {\r\n cancelAnimationFrame(this._cameraFrame);\r\n this._pitchSky?.remove();\r\n });\r\n this.whenReady(() => {\r\n const draggable = this.dragging?._draggable;\r\n if (!draggable) return;\r\n const pan = () => {\r\n if (!this.getPitch() && !this.getBearing()) return;\r\n const half = this.getSize().divideBy(2), delta = draggable._newPos.subtract(draggable._startPos);\r\n const ground = half.subtract(project(this, half.subtract(delta), true));\r\n draggable._newPos = draggable._startPos.add(ground);\r\n };\r\n draggable.on('predrag', pan);\r\n this.once('unload', () => draggable.off('predrag', pan));\r\n });\r\n if (this.options.rotate || this.options.trackContainerMutation) {\r\n this.cameraReady = import('./cameraControls.js').then(({ cameraControls }) => {\r\n if (!this._container?._leaflet_id) return;\r\n cameraControls(this);\r\n });\r\n this.cameraReady.catch(error => this.fire('error', { error }));\r\n }\r\n});\r\n\r\nconst markerMethods = Object.defineProperties({}, Object.getOwnPropertyDescriptors(L.Marker.prototype));\r\nL.Marker.mergeOptions({ rotation: 0, rotateWithView: false, keepUpright: false, scale: 1 });\r\nL.Marker.include({\r\n setIcon(icon) {\r\n if (!(icon instanceof L.DivIcon)) icon.options.crossOrigin ||= true;\r\n const result = markerMethods.setIcon.call(this, icon);\r\n if (this._map && !(icon instanceof L.DivIcon)) this._initNativeGPU(this._map);\r\n return result;\r\n },\r\n setRotation(rotation) {\r\n if (!Number.isFinite(rotation)) throw new TypeError('Marker rotation must be finite');\r\n this.options.rotation = rotation;\r\n this.update();\r\n this._nativeGPU?.refresh?.();\r\n return this;\r\n },\r\n _cameraIconPoint(x, y) {\r\n let rotation = this.options.rotation + (this.options.rotateWithView ? this._map.getBearing() * radians : 0);\r\n if (this.options.keepUpright && Math.cos(rotation) < 0) rotation += Math.PI;\r\n const scale = this.options.scale;\r\n return new L.Point((x * Math.cos(rotation) - y * Math.sin(rotation)) * scale,\r\n (x * Math.sin(rotation) + y * Math.cos(rotation)) * scale);\r\n },\r\n getEvents() {\r\n return { ...markerMethods.getEvents.call(this), rotate: this.update, pitch: this.update, move: this.update };\r\n },\r\n _setPos(point) {\r\n markerMethods._setPos.call(this, displayPoint(this._map, point));\r\n for (const [element, key] of [[this._icon, 'iconAnchor'], [this._shadow, 'shadowAnchor']]) {\r\n if (!element) continue;\r\n const direction = this._cameraIconPoint(1, 0), options = this.options.icon.options;\r\n const anchor = options[key] || options.iconAnchor;\r\n element.style.transformOrigin = anchor ? `${anchor.x ?? anchor[0]}px ${anchor.y ?? anchor[1]}px` : 'center';\r\n element.style.transform += ` rotate(${Math.atan2(direction.y, direction.x)}rad) scale(${this.options.scale})`;\r\n }\r\n },\r\n _updateZIndex(offset) {\r\n markerMethods._updateZIndex.call(this, offset);\r\n const changed = this._cameraZIndexOffset !== offset;\r\n this._cameraZIndexOffset = offset;\r\n if (changed) this._nativeGPU?.refresh?.();\r\n },\r\n _initInteraction() {\r\n const result = markerMethods._initInteraction.call(this);\r\n cameraMarkerDrag.call(this);\r\n return result;\r\n },\r\n});\r\n\r\n// Keep Leaflet's focusable marker and its drag events; only translate its screen position back to ground.\r\nfunction cameraMarkerDrag() {\r\n if (!this.dragging || this.dragging._cameraDrag) return;\r\n const drag = this.dragging, original = drag._onDrag, adjustPan = drag._adjustPan;\r\n drag._onDrag = function (event) {\r\n const map = this._marker._map;\r\n const screen = L.DomUtil.getPosition(this._marker._icon).add(map._getMapPanePos());\r\n const point = map.containerPointToLayerPoint(screen);\r\n const icon = this._marker._icon;\r\n L.DomUtil.setPosition(icon, point);\r\n original.call(this, event);\r\n this._marker._setPos(point);\r\n };\r\n drag._adjustPan = function (event) {\r\n const marker = this._marker, map = marker._map;\r\n if (!map.getPitch() && !map.getBearing()) return adjustPan.call(this, event);\r\n const screen = L.DomUtil.getPosition(marker._icon).add(map._getMapPanePos());\r\n const size = map.getSize(), padding = pointOf(marker.options.autoPanPadding);\r\n const speed = marker.options.autoPanSpeed;\r\n const movement = new L.Point(\r\n (Math.max(0, screen.x - size.x + padding.x) - Math.max(0, padding.x - screen.x)) / Math.max(1, padding.x) * speed,\r\n (Math.max(0, screen.y - size.y + padding.y) - Math.max(0, padding.y - screen.y)) / Math.max(1, padding.y) * speed);\r\n if (!movement.x && !movement.y) return;\r\n const pane = map._getMapPanePos();\r\n map.panBy(movement, { animate: false });\r\n const shift = pane.subtract(map._getMapPanePos());\r\n this._draggable._newPos._add(shift);\r\n this._draggable._startPos._add(shift);\r\n L.DomUtil.setPosition(marker._icon, this._draggable._newPos);\r\n this._onDrag(event);\r\n this._panRequest = requestAnimationFrame(() => this._adjustPan(event));\r\n };\r\n // The handler may already be enabled and listening with its original method.\r\n const enabled = drag.enabled();\r\n if (enabled) {\r\n drag._draggable.off('drag', original, drag);\r\n drag._draggable.on('drag', drag._onDrag, drag);\r\n }\r\n drag._cameraDrag = true;\r\n}\r\n\r\nfor (const Class of [L.Popup, L.Tooltip]) {\r\n const events = Class.prototype.getEvents;\r\n Class.include({\r\n getEvents() {\r\n return { ...events.call(this), rotate: this._updatePosition, pitch: this._updatePosition, move: this._updatePosition };\r\n },\r\n });\r\n}\r\nconst popupPosition = L.Popup.prototype._updatePosition;\r\nconst popupPan = L.Popup.prototype._adjustPan;\r\nL.Popup.include({\r\n _adjustPan() {\r\n const map = this._map;\r\n if (!map.getPitch() && !map.getBearing()) return popupPan.call(this);\r\n if (!this.options.autoPan) return;\r\n if (map._panAnim) map._panAnim.stop();\r\n if (this._autopanning) { this._autopanning = false; return; }\r\n const rect = this._container.getBoundingClientRect(), container = map.getContainer().getBoundingClientRect();\r\n const min = pointOf(this.options.autoPanPaddingTopLeft || this.options.autoPanPadding);\r\n const max = map.getSize().subtract(pointOf(this.options.autoPanPaddingBottomRight || this.options.autoPanPadding));\r\n const left = rect.left - container.left, top = rect.top - container.top;\r\n const right = rect.right - container.left, bottom = rect.bottom - container.top;\r\n const dx = Math.min(0, left - min.x) || Math.max(0, right - max.x);\r\n const dy = Math.min(0, top - min.y) || Math.max(0, bottom - max.y);\r\n if (!dx && !dy) return;\r\n if (this.options.keepInView) this._autopanning = true;\r\n const screen = map.latLngToContainerPoint(this._latlng).subtract(new L.Point(dx, dy));\r\n const delta = map.latLngToLayerPoint(this._latlng).subtract(map.containerPointToLayerPoint(screen));\r\n map.fire('autopanstart');\r\n map.panTo(map.unproject(map.project(map.getCenter()).add(delta)));\r\n },\r\n _updatePosition() {\r\n popupPosition.call(this);\r\n if (!this._map) return;\r\n const point = this._map.latLngToLayerPoint(this._latlng), delta = displayPoint(this._map, point).subtract(point);\r\n if (this._zoomAnimated) {\r\n L.DomUtil.setPosition(this._container, L.DomUtil.getPosition(this._container).add(delta));\r\n } else {\r\n this._container.style.left = `${this._containerLeft + delta.x}px`;\r\n this._container.style.bottom = `${this._containerBottom - delta.y}px`;\r\n }\r\n },\r\n});\r\nconst tooltipPosition = L.Tooltip.prototype._setPosition;\r\nL.Tooltip.include({\r\n _setPosition(point) {\r\n tooltipPosition.call(this, point);\r\n const delta = displayPoint(this._map, point).subtract(point);\r\n L.DomUtil.setPosition(this._container, L.DomUtil.getPosition(this._container).add(delta));\r\n },\r\n});\r\n\r\nconst tiledBounds = L.GridLayer.prototype._getTiledPixelBounds;\r\nconst gridEvents = L.GridLayer.prototype.getEvents;\r\nL.GridLayer.include({\r\n getEvents() {\r\n const events = gridEvents.call(this);\r\n this._cameraGridUpdate ||= L.Util.throttle(this._onMoveEnd, this.options.updateInterval, this);\r\n return { ...events, rotate: this._cameraGridUpdate, pitch: this._cameraGridUpdate };\r\n },\r\n _getTiledPixelBounds(center) {\r\n if (!this._map.getBearing() && !this._map.getPitch()) return tiledBounds.call(this, center);\r\n const bounds = this._map.getBounds();\r\n return new L.Bounds(this._map.project(bounds.getNorthWest(), this._tileZoom),\r\n this._map.project(bounds.getSouthEast(), this._tileZoom));\r\n },\r\n});\r\n"],
5
+ "mappings": "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",
6
+ "names": ["mapMethods", "radians", "pointOf", "point", "angles", "map", "bearing", "pitch", "project", "inverse", "limit", "half", "distance", "cos", "sin", "tilt", "rise", "p", "far", "denominator", "v", "u", "scale", "displayPoint", "animationPoint", "view", "shift", "groundBounds", "padding", "min", "max", "fitCameraBounds", "bounds", "options", "zoom", "vertical", "y", "top", "bottom", "origin", "points", "latlng", "low", "high", "leftSlope", "rightSlope", "slope", "left", "right", "target", "snap", "actual", "vMin", "vMax", "centerY", "centerX", "center", "updateSky", "height", "previousPitch", "previousBearing", "duration", "start", "fromPitch", "fromBearing", "delta", "frame", "now", "progress", "eased", "layer", "offset", "ground", "screen", "anchor", "next", "safe", "footprint", "limited", "inside", "size", "raw", "style", "selector", "draggable", "pan", "cameraControls", "error", "markerMethods", "icon", "result", "rotation", "x", "element", "key", "direction", "changed", "cameraMarkerDrag", "drag", "original", "adjustPan", "event", "marker", "speed", "movement", "pane", "Class", "events", "popupPosition", "popupPan", "rect", "container", "dx", "dy", "tooltipPosition", "tiledBounds", "gridEvents"]
7
+ }
@@ -1,4 +1,4 @@
1
- function T(e={},t=!1,x=""){const n=!!e.baseTexture,l=!!e.metalTexture,c=!!e.emissiveTexture,u=!!e.occlusionTexture,o=!!e.roofTexture,s=!!e.terrain,i=n||l||c||u||e.nightLight,p=`
1
+ function T(e={},t=!1,m=""){const a=!!e.baseTexture,l=!!e.metalTexture,c=!!e.emissiveTexture,u=!!e.occlusionTexture,o=!!e.roofTexture,s=!!e.terrain,i=a||l||c||u||e.nightLight,x=`
2
2
  struct Mesh {
3
3
  worldMatrix: mat4x4<f32>,
4
4
  baseColor: vec4<f32>,
@@ -19,7 +19,7 @@ function T(e={},t=!1,x=""){const n=!!e.baseTexture,l=!!e.metalTexture,c=!!e.emis
19
19
  @group(0) @binding(1) var<uniform> frame: Frame;
20
20
  struct Solar { matrix: mat4x4<f32>, params: vec4<f32> };
21
21
  @group(1) @binding(0) var<uniform> solar: Solar;
22
- ${s?`@group(0) @binding(2) var dem: texture_2d<f32>;${x}`:""}
22
+ ${s?`@group(0) @binding(2) var dem: texture_2d<f32>;${m}`:""}
23
23
  struct VertexInput {
24
24
  @location(0) position: vec3<f32>,
25
25
  @location(1) normal: vec3<f32>,
@@ -62,8 +62,8 @@ function T(e={},t=!1,x=""){const n=!!e.baseTexture,l=!!e.metalTexture,c=!!e.emis
62
62
  output.position = frame.projectionMatrix * viewPosition;
63
63
  return output;
64
64
  }
65
- `,v=[];let a=3;const r=(f,$)=>{if(!$)return"";v.push({name:f,texture:a,sampler:a+1});const m=a;return a+=2,`@group(0) @binding(${m}) var ${f}: texture_2d<f32>;
66
- @group(0) @binding(${m+1}) var ${f}Sampler: sampler;`},g=r("baseTexture",n),d=r("metalTexture",l),h=r("emissiveTexture",c),w=r("occlusionTexture",u),b=r("roofTexture",o),y=`
65
+ `,v=[];let n=3;const r=(f,$)=>{if(!$)return"";v.push({name:f,texture:n,sampler:n+1});const p=n;return n+=2,`@group(0) @binding(${p}) var ${f}: texture_2d<f32>;
66
+ @group(0) @binding(${p+1}) var ${f}Sampler: sampler;`},g=r("baseTexture",a),d=r("metalTexture",l),h=r("emissiveTexture",c),w=r("occlusionTexture",u),b=r("roofTexture",o),y=`
67
67
  struct Mesh {
68
68
  worldMatrix: mat4x4<f32>,
69
69
  baseColor: vec4<f32>,
@@ -92,6 +92,7 @@ function T(e={},t=!1,x=""){const n=!!e.baseTexture,l=!!e.metalTexture,c=!!e.emis
92
92
  @group(1) @binding(3) var<storage, read> lightGrid: array<vec4<f32>>;
93
93
  ${g}${d}${h}${w}${b}
94
94
  struct FragmentInput {
95
+ @builtin(position) position: vec4<f32>,
95
96
  @location(0) color: vec3<f32>,
96
97
  @location(1) normal: vec3<f32>,
97
98
  @location(2) viewPosition: vec3<f32>,
@@ -135,12 +136,18 @@ function T(e={},t=!1,x=""){const n=!!e.baseTexture,l=!!e.metalTexture,c=!!e.emis
135
136
  }
136
137
  return light * frame.skyDirection.w;
137
138
  }
139
+ fn appearance(position: vec2<f32>) {
140
+ // Screen-door dissolve keeps opaque depth writes and avoids sorting whole buildings as glass.
141
+ let noise = fract(52.9829189 * fract(dot(floor(position), vec2<f32>(0.06711056, 0.00583715))));
142
+ if (u.highlight.w < 1.0 && noise >= u.highlight.w) { discard; }
143
+ }
138
144
  @fragment fn fragmentMain(input: FragmentInput, @builtin(front_facing) frontFacing: bool) -> @location(0) vec4<f32> {
139
145
  ${e.nightLight?`
140
146
  if (input.uv.x <= 2.0) {
141
147
  let radial = max(0.0, 1.0 - dot(input.uv, input.uv));
142
148
  let alpha = radial * radial * frame.skyDirection.w * 0.65;
143
149
  if (alpha < 0.005) { discard; }
150
+ appearance(input.position.xy);
144
151
  return vec4<f32>(input.color, alpha);
145
152
  }
146
153
  `:""}
@@ -148,11 +155,11 @@ function T(e={},t=!1,x=""){const n=!!e.baseTexture,l=!!e.metalTexture,c=!!e.emis
148
155
  let worldNormal = normalize(transpose(mat3x3<f32>(frame.viewMatrix[0].xyz, frame.viewMatrix[1].xyz, frame.viewMatrix[2].xyz)) * normalize(input.normal)) * select(-1.0, 1.0, frontFacing);
149
156
  let artificial = localLighting(input.worldPosition, worldNormal);
150
157
  ${e.unlit?`
151
- let rasterTexel = textureSample(baseTexture, baseTextureSampler, input.uv);
158
+ let rasterTexel = ${a?"textureSample(baseTexture, baseTextureSampler, input.uv)":"vec4<f32>(input.color, 1.0)"};
152
159
  return vec4<f32>(toSRGB(toLinear(rasterTexel.rgb) * (frame.atmosphereTint.rgb * (0.55 + 0.45 * sunlight) + artificial)), ${e.alphaMode==="BLEND"?"u.material.z * rasterTexel.a":"1.0"});
153
160
  `:`
154
161
  var normal = normalize(input.normal) * select(-1.0, 1.0, frontFacing);
155
- let texel = ${n?"textureSample(baseTexture, baseTextureSampler, input.uv)":"vec4<f32>(1.0)"};
162
+ let texel = ${a?"textureSample(baseTexture, baseTextureSampler, input.uv)":"vec4<f32>(1.0)"};
156
163
  let alpha = u.material.z * texel.a;
157
164
  ${e.alphaMode==="MASK"?"if (alpha < u.material.w) { discard; }":""}
158
165
  ${e.alphaMode==="BLEND"?"if (alpha < 0.01) { discard; }":""}
@@ -196,8 +203,9 @@ function T(e={},t=!1,x=""){const n=!!e.baseTexture,l=!!e.metalTexture,c=!!e.emis
196
203
  (diffuse + specular) * nl * toLinear(vec3<f32>(1.0, 0.937, 0.835)) * 3.0 + glow;
197
204
  ${e.vertexColors?"color = base * (ambient + toLinear(vec3<f32>(1.0, 0.937, 0.835)) * (3.0 / PI) * nl) + glow;":""}
198
205
  color = (color - glow) * frame.atmosphereTint.rgb + base * artificial * (1.0 - metal * 0.5) + glow;
206
+ appearance(input.position.xy);
199
207
  return vec4<f32>(toSRGB(color), ${e.alphaMode==="BLEND"?"alpha":"1.0"});
200
208
  `}
201
209
  }
202
- `;return{vertex:p,fragment:y,bindings:v,textured:i,hasTerrain:s}}export{T as materialShaders};
203
- //# sourceMappingURL=shaders.js.map
210
+ `;return{vertex:x,fragment:y,bindings:v,textured:i,hasTerrain:s}}export{T as materialShaders};
211
+ //# sourceMappingURL=materialShaders.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/materialShaders.js"],
4
+ "sourcesContent": ["/** Material WGSL and texture bindings, without a GPU device or Leaflet layer. */\nexport function materialShaders(material = {}, sparkle = false, elevationWGSL = '') {\n const hasBase = Boolean(material.baseTexture);\n const hasMetal = Boolean(material.metalTexture);\n const hasEmissive = Boolean(material.emissiveTexture);\n const hasOcclusion = Boolean(material.occlusionTexture);\n const hasRoof = Boolean(material.roofTexture);\n const hasTerrain = Boolean(material.terrain);\n const textured = hasBase || hasMetal || hasEmissive || hasOcclusion || material.nightLight;\n const vertex = `\n struct Mesh {\n worldMatrix: mat4x4<f32>,\n baseColor: vec4<f32>,\n material: vec4<f32>,\n emissive: vec4<f32>,\n terrain: vec4<f32>,\n highlight: vec4<f32>,\n };\n struct Frame {\n viewMatrix: mat4x4<f32>,\n projectionMatrix: mat4x4<f32>,\n roofMatrix: mat4x4<f32>,\n lightDirection: vec4<f32>,\n skyDirection: vec4<f32>,\n atmosphereTint: vec4<f32>,\n };\n @group(0) @binding(0) var<uniform> u: Mesh;\n @group(0) @binding(1) var<uniform> frame: Frame;\n struct Solar { matrix: mat4x4<f32>, params: vec4<f32> };\n @group(1) @binding(0) var<uniform> solar: Solar;\n ${hasTerrain ? `@group(0) @binding(2) var dem: texture_2d<f32>;${elevationWGSL}` : ''}\n struct VertexInput {\n @location(0) position: vec3<f32>,\n @location(1) normal: vec3<f32>,\n ${material.vertexColors ? '@location(2) color: vec3<f32>,' : ''}\n ${textured ? '@location(3) uv: vec2<f32>,' : ''}\n };\n struct VertexOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) color: vec3<f32>,\n @location(1) normal: vec3<f32>,\n @location(2) viewPosition: vec3<f32>,\n @location(6) shadowPosition: vec4<f32>,\n @location(7) worldPosition: vec3<f32>,\n ${sparkle ? '@location(8) localPosition: vec3<f32>,' : ''}\n ${textured ? '@location(3) uv: vec2<f32>,' : ''}\n ${hasRoof ? '@location(4) roofUv: vec2<f32>, @location(5) roof: f32,' : ''}\n };\n @vertex fn vertexMain(input: VertexInput, @builtin(vertex_index) vertexIndex: u32) -> VertexOutput {\n var output: VertexOutput;\n var position = input.position;\n ${hasTerrain ? 'position.y = elevation(u.terrain.xy + input.uv * u.terrain.z, u.terrain.w) - u.terrain.w;' : ''}\n let highlighted = f32(vertexIndex) >= u.highlight.x && f32(vertexIndex) < u.highlight.y;\n output.color = ${material.vertexColors\n ? 'select(input.color, vec3<f32>(72.0 / 255.0, 217.0 / 255.0, 1.0), highlighted)'\n : 'u.baseColor.rgb'};\n // Inverse-transpose from cofactors; the camera view matrix is orthonormal.\n let m = mat3x3<f32>(u.worldMatrix[0].xyz, u.worldMatrix[1].xyz, u.worldMatrix[2].xyz);\n let normal = (cross(m[1], m[2]) * input.normal.x + cross(m[2], m[0]) * input.normal.y +\n cross(m[0], m[1]) * input.normal.z) / determinant(m);\n output.normal = (frame.viewMatrix * vec4<f32>(normal, 0.0)).xyz;\n let world = u.worldMatrix * vec4<f32>(position, 1.0);\n output.shadowPosition = solar.matrix * world;\n output.worldPosition = world.xyz / world.w;\n ${sparkle ? 'output.localPosition = input.position;' : ''}\n let viewPosition = frame.viewMatrix * world;\n output.viewPosition = viewPosition.xyz;\n ${textured ? 'output.uv = input.uv;' : ''}\n ${hasRoof ? `\n output.roofUv = (frame.roofMatrix * world).xz;\n output.roof = select(0.0, 1.0, input.normal.y >= 0.5 && !highlighted);\n ` : ''}\n output.position = frame.projectionMatrix * viewPosition;\n return output;\n }\n `;\n const bindings = [];\n let binding = 3;\n const textureBinding = (name, enabled) => {\n if (!enabled) return '';\n bindings.push({ name, texture: binding, sampler: binding + 1 });\n const current = binding;\n binding += 2;\n return `@group(0) @binding(${current}) var ${name}: texture_2d<f32>;\n @group(0) @binding(${current + 1}) var ${name}Sampler: sampler;`;\n };\n const baseBinding = textureBinding('baseTexture', hasBase);\n const metalBinding = textureBinding('metalTexture', hasMetal);\n const emissiveBinding = textureBinding('emissiveTexture', hasEmissive);\n const occlusionBinding = textureBinding('occlusionTexture', hasOcclusion);\n const roofBinding = textureBinding('roofTexture', hasRoof);\n const fragment = `\n struct Mesh {\n worldMatrix: mat4x4<f32>,\n baseColor: vec4<f32>,\n material: vec4<f32>,\n emissive: vec4<f32>,\n terrain: vec4<f32>,\n highlight: vec4<f32>,\n };\n struct Frame {\n viewMatrix: mat4x4<f32>,\n projectionMatrix: mat4x4<f32>,\n roofMatrix: mat4x4<f32>,\n lightDirection: vec4<f32>,\n skyDirection: vec4<f32>,\n atmosphereTint: vec4<f32>,\n };\n struct Solar {\n matrix: mat4x4<f32>,\n params: vec4<f32>,\n };\n @group(0) @binding(0) var<uniform> u: Mesh;\n @group(0) @binding(1) var<uniform> frame: Frame;\n @group(1) @binding(0) var<uniform> solar: Solar;\n @group(1) @binding(1) var shadowTexture: texture_depth_2d;\n @group(1) @binding(2) var shadowSampler: sampler_comparison;\n @group(1) @binding(3) var<storage, read> lightGrid: array<vec4<f32>>;\n ${baseBinding}${metalBinding}${emissiveBinding}${occlusionBinding}${roofBinding}\n struct FragmentInput {\n @builtin(position) position: vec4<f32>,\n @location(0) color: vec3<f32>,\n @location(1) normal: vec3<f32>,\n @location(2) viewPosition: vec3<f32>,\n @location(6) shadowPosition: vec4<f32>,\n @location(7) worldPosition: vec3<f32>,\n ${sparkle ? '@location(8) localPosition: vec3<f32>,' : ''}\n ${textured ? '@location(3) uv: vec2<f32>,' : ''}\n ${hasRoof ? '@location(4) roofUv: vec2<f32>, @location(5) roof: f32,' : ''}\n };\n const PI: f32 = 3.14159265;\n fn toLinear(c: vec3<f32>) -> vec3<f32> {\n return select(c / 12.92, pow((c + vec3<f32>(0.055)) / 1.055, vec3<f32>(2.4)), c >= vec3<f32>(0.04045));\n }\n fn toSRGB(c: vec3<f32>) -> vec3<f32> {\n return select(c * 12.92, 1.055 * pow(max(c, vec3<f32>(0.0)), vec3<f32>(1.0 / 2.4)) - vec3<f32>(0.055), c >= vec3<f32>(0.0031308));\n }\n fn sunVisibility(position: vec4<f32>) -> f32 {\n let p = position.xyz / position.w;\n let uv = vec2<f32>(p.x * 0.5 + 0.5, 0.5 - p.y * 0.5);\n if (solar.params.x < 0.5 || any(uv < vec2<f32>(0.0)) || any(uv > vec2<f32>(1.0)) || p.z < 0.0 || p.z > 1.0) {\n return 1.0;\n }\n return textureSampleCompareLevel(shadowTexture, shadowSampler, uv, p.z - 0.0003);\n }\n fn localLighting(position: vec3<f32>, normal: vec3<f32>) -> vec3<f32> {\n if (frame.skyDirection.w <= 0.0 || lightGrid[0].w < 1.0) { return vec3<f32>(0.0); }\n let cell = vec2<i32>(floor((position.xz - lightGrid[0].xy) / lightGrid[0].z));\n if (any(cell < vec2<i32>(0)) || cell.x >= i32(lightGrid[0].w) || cell.y >= i32(lightGrid[1].x)) {\n return vec3<f32>(0.0);\n }\n let header = lightGrid[2u + u32(cell.y) * u32(lightGrid[0].w) + u32(cell.x)];\n var light = vec3<f32>(0.0);\n for (var i = 0u; i < u32(header.y); i++) {\n let source = lightGrid[u32(header.x) + i * 2u];\n let colour = lightGrid[u32(header.x) + i * 2u + 1u];\n let delta = source.xyz - position;\n let distance2 = max(dot(delta, delta), 1.0);\n let falloff = max(0.0, 1.0 - distance2 / (source.w * source.w));\n let lambert = max(0.0, dot(normal, delta / sqrt(distance2)));\n light += toLinear(colour.rgb) * colour.w * lambert * falloff * falloff / distance2;\n }\n return light * frame.skyDirection.w;\n }\n fn appearance(position: vec2<f32>) {\n // Screen-door dissolve keeps opaque depth writes and avoids sorting whole buildings as glass.\n let noise = fract(52.9829189 * fract(dot(floor(position), vec2<f32>(0.06711056, 0.00583715))));\n if (u.highlight.w < 1.0 && noise >= u.highlight.w) { discard; }\n }\n @fragment fn fragmentMain(input: FragmentInput, @builtin(front_facing) frontFacing: bool) -> @location(0) vec4<f32> {\n ${material.nightLight ? `\n if (input.uv.x <= 2.0) {\n let radial = max(0.0, 1.0 - dot(input.uv, input.uv));\n let alpha = radial * radial * frame.skyDirection.w * 0.65;\n if (alpha < 0.005) { discard; }\n appearance(input.position.xy);\n return vec4<f32>(input.color, alpha);\n }\n ` : ''}\n let sunlight = sunVisibility(input.shadowPosition);\n let worldNormal = normalize(transpose(mat3x3<f32>(frame.viewMatrix[0].xyz, frame.viewMatrix[1].xyz, frame.viewMatrix[2].xyz)) * normalize(input.normal)) * select(-1.0, 1.0, frontFacing);\n let artificial = localLighting(input.worldPosition, worldNormal);\n ${material.unlit ? `\n let rasterTexel = ${hasBase ? 'textureSample(baseTexture, baseTextureSampler, input.uv)' : 'vec4<f32>(input.color, 1.0)'};\n return vec4<f32>(toSRGB(toLinear(rasterTexel.rgb) * (frame.atmosphereTint.rgb * (0.55 + 0.45 * sunlight) + artificial)), ${material.alphaMode === 'BLEND' ? 'u.material.z * rasterTexel.a' : '1.0'});\n ` : `\n var normal = normalize(input.normal) * select(-1.0, 1.0, frontFacing);\n let texel = ${hasBase ? 'textureSample(baseTexture, baseTextureSampler, input.uv)' : 'vec4<f32>(1.0)'};\n let alpha = u.material.z * texel.a;\n ${material.alphaMode === 'MASK' ? 'if (alpha < u.material.w) { discard; }' : ''}\n ${material.alphaMode === 'BLEND' ? 'if (alpha < 0.01) { discard; }' : ''}\n var base = ${material.vertexColors ? 'toLinear(min(input.color, vec3<f32>(1.0)))' : 'input.color'} *\n ${material.baseTexture?.srgb ? 'texel.rgb' : 'toLinear(texel.rgb)'};\n ${hasRoof ? `\n if (input.roof > 0.5 && all(input.roofUv >= vec2<f32>(0.0)) &&\n all(input.roofUv <= vec2<f32>(1.0))) {\n let roof = textureSampleLevel(roofTexture, roofTextureSampler, input.roofUv, 0.0);\n base = mix(base, toLinear(roof.rgb), roof.a);\n }\n ` : ''}\n let mr = ${hasMetal ? 'textureSample(metalTexture, metalTextureSampler, input.uv)' : 'vec4<f32>(1.0)'};\n let metal = clamp(u.material.x * mr.b, 0.0, 1.0);\n let rough = clamp(u.material.y * mr.g, 0.08, 1.0);\n let view = normalize(-input.viewPosition);\n let halfVector = normalize(view + frame.lightDirection.xyz);\n let nl = max(dot(normal, frame.lightDirection.xyz), 0.0) * frame.lightDirection.w * sunlight;\n let nv = max(dot(normal, view), 0.001);\n let nh = max(dot(normal, halfVector), 0.0);\n let vh = max(dot(view, halfVector), 0.0);\n let a2 = pow(rough, 4.0);\n let d = a2 / max(PI * pow(nh * nh * (a2 - 1.0) + 1.0, 2.0), 0.0001);\n let gv = nl * sqrt(nv * nv * (1.0 - a2) + a2);\n let gl = nv * sqrt(nl * nl * (1.0 - a2) + a2);\n let visibility = 0.5 / max(gv + gl, 0.0001);\n let f0 = mix(vec3<f32>(0.04), base, metal);\n let fresnel = f0 + (1.0 - f0) * pow(1.0 - vh, 5.0);\n let specular = d * visibility * fresnel;\n let diffuse = (1.0 - metal) * base / PI;\n let sky = dot(normal, frame.skyDirection.xyz) * 0.5 + 0.5;\n let ambient = mix(toLinear(vec3<f32>(0.455, 0.412, 0.322)), vec3<f32>(1.0), sky) * (2.0 / PI);\n let ao = ${hasOcclusion ? 'mix(1.0, textureSample(occlusionTexture, occlusionTextureSampler, input.uv).r, u.emissive.w)' : '1.0'};\n ${sparkle ? `\n let lattice = (fract(input.localPosition / 2.5) - 0.5) * 2.5;\n let pointGlow = (1.0 - smoothstep(0.16, 0.42, length(lattice))) * u.highlight.z;\n ` : ''}\n // Vertex colour components above 1 are self-lit (e.g. vehicle lamps): dim by day, bright at night.\n let glow = ${sparkle ? 'vec3<f32>(3.0, 2.6, 1.8) * pointGlow +' : ''}${material.vertexColors\n ? ' max(input.color - vec3<f32>(1.0), vec3<f32>(0.0)) * (0.3 + 5.0 * frame.skyDirection.w) +' : ''} u.emissive.rgb * ${hasEmissive\n ? material.emissiveTexture.srgb\n ? 'textureSample(emissiveTexture, emissiveTextureSampler, input.uv).rgb'\n : 'toLinear(textureSample(emissiveTexture, emissiveTextureSampler, input.uv).rgb)'\n : 'vec3<f32>(1.0)'};\n var color = ambient * base * (1.0 - metal) * ao +\n (diffuse + specular) * nl * toLinear(vec3<f32>(1.0, 0.937, 0.835)) * 3.0 + glow;\n ${material.vertexColors ? 'color = base * (ambient + toLinear(vec3<f32>(1.0, 0.937, 0.835)) * (3.0 / PI) * nl) + glow;' : ''}\n color = (color - glow) * frame.atmosphereTint.rgb + base * artificial * (1.0 - metal * 0.5) + glow;\n appearance(input.position.xy);\n return vec4<f32>(toSRGB(color), ${material.alphaMode === 'BLEND' ? 'alpha' : '1.0'});\n `}\n }\n `;\n return { vertex, fragment, bindings, textured, hasTerrain };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["materialShaders", "material", "sparkle", "elevationWGSL", "hasBase", "hasMetal", "hasEmissive", "hasOcclusion", "hasRoof", "hasTerrain", "textured", "vertex", "bindings", "binding", "textureBinding", "name", "enabled", "current", "baseBinding", "metalBinding", "emissiveBinding", "occlusionBinding", "roofBinding", "fragment"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{box as t}from"./box.js";const c=(o,r,m,i,...p)=>[[t(o,r,m,i),...p],[t(-r,-o,m,i),...p]];export{c as mirror};
2
+ //# sourceMappingURL=mirror.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/mirror.js"],
4
+ "sourcesContent": ["import { box } from \"./box.js\";\n\nexport const mirror = (x0, x1, z0, z1, ...rest) => [\n [box(x0, x1, z0, z1), ...rest],\n [box(-x1, -x0, z0, z1), ...rest]\n];\n"],
5
+ "mappings": "AAAA,OAAS,OAAAA,MAAW,WAEb,MAAMC,EAAS,CAACC,EAAIC,EAAIC,EAAIC,KAAOC,IAAS,CACjD,CAACN,EAAIE,EAAIC,EAAIC,EAAIC,CAAE,EAAG,GAAGC,CAAI,EAC7B,CAACN,EAAI,CAACG,EAAI,CAACD,EAAIE,EAAIC,CAAE,EAAG,GAAGC,CAAI,CACjC",
6
+ "names": ["box", "mirror", "x0", "x1", "z0", "z1", "rest"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{solarPosition as u}from"./solarPosition.js";import{horizontalPosition as l}from"./horizontalPosition.js";function f(i,h,M){u(i,h,M);const t=Math.PI/180,n=new Date(i).getTime()/864e5-10957.5,c=(134.963+13.064993*n)*t,a=(218.316+13.176396*n+6.289*Math.sin(c))*t,o=5.128*Math.sin((93.272+13.22935*n)*t)*t,s=23.4397*t,r=Math.cos(o)*Math.cos(a),e=Math.cos(o)*Math.sin(a)*Math.cos(s)-Math.sin(o)*Math.sin(s),m=Math.cos(o)*Math.sin(a)*Math.sin(s)+Math.sin(o)*Math.cos(s);return l(n,h,M,Math.atan2(e,r),Math.asin(m))}export{f as moonPosition};
2
+ //# sourceMappingURL=moonPosition.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/moonPosition.js"],
4
+ "sourcesContent": ["import { solarPosition } from \"./solarPosition.js\";\nimport { horizontalPosition } from \"./horizontalPosition.js\";\n\n// Low-precision geocentric lunar orbit; no parallax or atmospheric refraction.\n\nexport function moonPosition(date, lat, lng) {\n solarPosition(date, lat, lng);\n const rad = Math.PI / 180, d = new Date(date).getTime() / 86400000 - 10957.5;\n const anomaly = (134.963 + 13.064993 * d) * rad;\n const longitude = (218.316 + 13.176396 * d + 6.289 * Math.sin(anomaly)) * rad;\n const latitude = 5.128 * Math.sin((93.272 + 13.229350 * d) * rad) * rad;\n const obliquity = 23.4397 * rad;\n const x = Math.cos(latitude) * Math.cos(longitude);\n const y = Math.cos(latitude) * Math.sin(longitude) * Math.cos(obliquity) - Math.sin(latitude) * Math.sin(obliquity);\n const z = Math.cos(latitude) * Math.sin(longitude) * Math.sin(obliquity) + Math.sin(latitude) * Math.cos(obliquity);\n return horizontalPosition(d, lat, lng, Math.atan2(y, x), Math.asin(z));\n}\n"],
5
+ "mappings": "AAAA,OAAS,iBAAAA,MAAqB,qBAC9B,OAAS,sBAAAC,MAA0B,0BAI5B,SAASC,EAAaC,EAAMC,EAAKC,EAAK,CAC3CL,EAAcG,EAAMC,EAAKC,CAAG,EAC5B,MAAMC,EAAM,KAAK,GAAK,IAAKC,EAAI,IAAI,KAAKJ,CAAI,EAAE,QAAQ,EAAI,MAAW,QAC/DK,GAAW,QAAU,UAAYD,GAAKD,EACtCG,GAAa,QAAU,UAAYF,EAAI,MAAQ,KAAK,IAAIC,CAAO,GAAKF,EACpEI,EAAW,MAAQ,KAAK,KAAK,OAAS,SAAYH,GAAKD,CAAG,EAAIA,EAC9DK,EAAY,QAAUL,EACtBM,EAAI,KAAK,IAAIF,CAAQ,EAAI,KAAK,IAAID,CAAS,EAC3CI,EAAI,KAAK,IAAIH,CAAQ,EAAI,KAAK,IAAID,CAAS,EAAI,KAAK,IAAIE,CAAS,EAAI,KAAK,IAAID,CAAQ,EAAI,KAAK,IAAIC,CAAS,EAC5GG,EAAI,KAAK,IAAIJ,CAAQ,EAAI,KAAK,IAAID,CAAS,EAAI,KAAK,IAAIE,CAAS,EAAI,KAAK,IAAID,CAAQ,EAAI,KAAK,IAAIC,CAAS,EAClH,OAAOV,EAAmBM,EAAGH,EAAKC,EAAK,KAAK,MAAMQ,EAAGD,CAAC,EAAG,KAAK,KAAKE,CAAC,CAAC,CACvE",
6
+ "names": ["solarPosition", "horizontalPosition", "moonPosition", "date", "lat", "lng", "rad", "d", "anomaly", "longitude", "latitude", "obliquity", "x", "y", "z"]
7
+ }
@@ -0,0 +1,2 @@
1
+ const r={KeyW:[1,0],ArrowUp:[1,0],KeyS:[-1,0],ArrowDown:[-1,0],KeyD:[0,1],ArrowRight:[0,1],KeyA:[0,-1],ArrowLeft:[0,-1]};export{r as moves};
2
+ //# sourceMappingURL=moves.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/moves.js"],
4
+ "sourcesContent": ["// W/S (\u2191/\u2193) run forward/back along the heading, A/D (\u2190/\u2192) turn: [forward, turn].\nexport const moves = {\n KeyW: [1, 0],\n ArrowUp: [1, 0],\n KeyS: [-1, 0],\n ArrowDown: [-1, 0],\n KeyD: [0, 1],\n ArrowRight: [0, 1],\n KeyA: [0, -1],\n ArrowLeft: [0, -1]\n};\n"],
5
+ "mappings": "AACO,MAAMA,EAAQ,CACnB,KAAM,CAAC,EAAG,CAAC,EACX,QAAS,CAAC,EAAG,CAAC,EACd,KAAM,CAAC,GAAI,CAAC,EACZ,UAAW,CAAC,GAAI,CAAC,EACjB,KAAM,CAAC,EAAG,CAAC,EACX,WAAY,CAAC,EAAG,CAAC,EACjB,KAAM,CAAC,EAAG,EAAE,EACZ,UAAW,CAAC,EAAG,EAAE,CACnB",
6
+ "names": ["moves"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{raycast as k}from"./raycast.js";const h=new WeakMap;function b(a){const{map:e}=a;let o=h.get(e);if(!o){o={states:new Set,hovered:null};const u=L.version.startsWith("2"),d=u?"pointermove":"mousemove",c=u?"pointerout":"mouseout",E=u?"pointerover":"mouseover",p=Object.getOwnPropertyDescriptor(e,"_fireDOMEvent"),s=e._fireDOMEvent,f=function(n,r=n.type,v){const g=L.Layer._renderers.get(e);if(!g?.renderer||v||!["click","preclick","dblclick","contextmenu","mousedown","mouseup","mousemove","mouseover","mouseout","pointerdown","pointerup","pointermove","pointerover","pointerout"].includes(r))return s.call(this,n,r,v);const O=n.target,M=O instanceof Element&&O.closest(".leaflet-marker-icon,.leaflet-popup,.leaflet-tooltip,.leaflet-control");if(M&&o.hovered&&(r===d||r===c)&&(s.call(e,n,c,[o.hovered]),o.hovered=null,e.getContainer().style.cursor=""),M||r===d&&(e.dragging?.moving()||e._animatingZoom))return s.call(this,n,r,v);const m=[];if(r!==c)for(const l of o.states){const{source:i}=l;i instanceof L.Marker||i.options.interactive===!1||!(i instanceof L.Path)&&!i.options.interactive||m.push(...l.meshes.values())}const _=m.length?k(g,n,m,!1):[];_.sort((l,i)=>i.object.renderOrder-l.object.renderOrder||l.distance-i.distance);let t=_[0]?.object._nativeSource||null;return(r==="click"||r==="preclick")&&t&&e._draggableMoved(t)&&(t=null),(r===d||r===c)&&o.hovered!==t&&(o.hovered&&s.call(e,n,c,[o.hovered]),o.hovered=t,t&&s.call(e,n,E,[t]),e.getContainer().style.cursor=t?"pointer":""),s.call(this,n,r,t?[t]:void 0)};o.handle=f,o.restore=()=>{e._fireDOMEvent===f&&(p?Object.defineProperty(e,"_fireDOMEvent",p):delete e._fireDOMEvent)},h.set(e,o),e._fireDOMEvent=f}return o.states.add(a),()=>{o.states.delete(a),o.hovered===a.source&&(o.hovered=null,e.getContainer().style.cursor=""),!o.states.size&&(o.restore(),h.delete(e))}}export{b as nativeEvents};
2
+ //# sourceMappingURL=nativeEvents.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/nativeEvents.js"],
4
+ "sourcesContent": ["import { raycast } from './raycast.js';\r\n\r\nconst maps = new WeakMap();\r\n\r\n/** One GPU hit test per map event, rather than one invisible SVG path per feature. */\r\nexport function nativeEvents(state) {\r\n const { map } = state;\r\n let context = maps.get(map);\r\n if (!context) {\r\n context = { states: new Set(), hovered: null };\r\n const pointer = L.version.startsWith('2');\r\n const move = pointer ? 'pointermove' : 'mousemove', out = pointer ? 'pointerout' : 'mouseout';\r\n const over = pointer ? 'pointerover' : 'mouseover';\r\n const descriptor = Object.getOwnPropertyDescriptor(map, '_fireDOMEvent');\r\n const fireDOMEvent = map._fireDOMEvent;\r\n const handle = function (event, type = event.type, targets) {\r\n const owner = L.Layer._renderers.get(map);\r\n if (!owner?.renderer || targets || !['click', 'preclick', 'dblclick', 'contextmenu',\r\n 'mousedown', 'mouseup', 'mousemove', 'mouseover', 'mouseout',\r\n 'pointerdown', 'pointerup', 'pointermove', 'pointerover', 'pointerout'].includes(type)) {\r\n return fireDOMEvent.call(this, event, type, targets);\r\n }\r\n const target = event.target;\r\n const dom = target instanceof Element &&\r\n target.closest('.leaflet-marker-icon,.leaflet-popup,.leaflet-tooltip,.leaflet-control');\r\n if (dom && context.hovered && (type === move || type === out)) {\r\n fireDOMEvent.call(map, event, out, [context.hovered]);\r\n context.hovered = null;\r\n map.getContainer().style.cursor = '';\r\n }\r\n if (dom || type === move && (map.dragging?.moving() || map._animatingZoom)) {\r\n return fireDOMEvent.call(this, event, type, targets);\r\n }\r\n const meshes = [];\r\n if (type !== out) {\r\n for (const candidate of context.states) {\r\n const { source } = candidate;\r\n if (source instanceof L.Marker || source.options.interactive === false ||\r\n !(source instanceof L.Path) && !source.options.interactive) continue;\r\n meshes.push(...candidate.meshes.values());\r\n }\r\n }\r\n const hits = meshes.length ? raycast(owner, event, meshes, false) : [];\r\n hits.sort((a, b) => b.object.renderOrder - a.object.renderOrder || a.distance - b.distance);\r\n let source = hits[0]?.object._nativeSource || null;\r\n if ((type === 'click' || type === 'preclick') && source && map._draggableMoved(source)) source = null;\r\n if (type === move || type === out) {\r\n if (context.hovered !== source) {\r\n if (context.hovered) fireDOMEvent.call(map, event, out, [context.hovered]);\r\n context.hovered = source;\r\n if (source) fireDOMEvent.call(map, event, over, [source]);\r\n map.getContainer().style.cursor = source ? 'pointer' : '';\r\n }\r\n }\r\n return fireDOMEvent.call(this, event, type, source ? [source] : undefined);\r\n };\r\n context.handle = handle;\r\n context.restore = () => {\r\n if (map._fireDOMEvent !== handle) return;\r\n if (descriptor) Object.defineProperty(map, '_fireDOMEvent', descriptor);\r\n else delete map._fireDOMEvent;\r\n };\r\n maps.set(map, context);\r\n map._fireDOMEvent = handle;\r\n }\r\n context.states.add(state);\r\n return () => {\r\n context.states.delete(state);\r\n if (context.hovered === state.source) {\r\n context.hovered = null;\r\n map.getContainer().style.cursor = '';\r\n }\r\n if (context.states.size) return;\r\n context.restore();\r\n maps.delete(map);\r\n };\r\n}\r\n"],
5
+ "mappings": "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",
6
+ "names": ["raycast", "maps", "nativeEvents", "state", "map", "context", "pointer", "move", "out", "over", "descriptor", "fireDOMEvent", "handle", "event", "type", "targets", "owner", "target", "dom", "meshes", "candidate", "source", "hits", "a", "b"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{triangulate as C}from"./triangulate.js";function O(d,b,I){const j=[],g=[],c=d.options,M=(e,o,a,r)=>e.push(...I(o),...I(a),...I(r)),v=(e,o,a,r=o)=>{if(!(o>0)||!(r>0))return;const l=Math.max(12,Math.min(128,Math.ceil(Math.PI*Math.sqrt(o))));for(let i=0;i<l;i++){const n=t=>new L.Point(e.x+o*Math.cos(t*2*Math.PI/l),e.y+r*Math.sin(t*2*Math.PI/l));M(a,e,n(i),n(i+1))}},m=Number(c.weight)||0,h=(Array.isArray(c.dashArray)?c.dashArray:String(c.dashArray||"").trim().split(/[ ,]+/)).map(Number);if(h.some(e=>!Number.isFinite(e)||e<0))throw new Error("Invalid Leaflet dashArray");h.every(e=>e===0)&&(h.length=0),h.length%2&&h.push(...h);const k=(e,o)=>{if(!c.stroke||m<=0||e.length<2)return;const a=m/2,r=(n,t,x,u)=>{const f=n.distanceTo(t);if(!f)return;const y=t.subtract(n).divideBy(f),s=new L.Point(-y.y*a,y.x*a);c.lineCap==="square"&&(x&&(n=n.subtract(y.multiplyBy(a))),u&&(t=t.add(y.multiplyBy(a)))),M(g,n.add(s),n.subtract(s),t.add(s)),M(g,t.add(s),n.subtract(s),t.subtract(s)),c.lineCap==="round"&&(x&&v(n,a,g),u&&v(t,a,g))};let l=Number(c.dashOffset)||0;const i=h.reduce((n,t)=>n+t,0);for(let n=0;n<e.length-(o?0:1);n++){const t=e[n],x=e[(n+1)%e.length],u=t.distanceTo(x);if(h.length){let f=0;for(;f<u;){let y=((l+f)%i+i)%i,s=0;for(;y>=h[s];)y-=h[s++];const p=Math.min(u,f+h[s]-y);if(s%2===0){const P=x.subtract(t).divideBy(u);r(t.add(P.multiplyBy(f)),t.add(P.multiplyBy(p)),!0,!0)}f=p}}else if(r(t,x,!o&&n===0,!o&&n===e.length-2),o||n>0)if(c.lineJoin==="round")v(t,a,g);else{const f=t.subtract(e[(n+e.length-1)%e.length]),y=Math.hypot(f.x,f.y);if(y&&u){const s=f.divideBy(y),p=x.subtract(t).divideBy(u),P=s.x*p.y-s.y*p.x>0?-1:1,w=new L.Point(-s.y*P,s.x*P),B=new L.Point(-p.y*P,p.x*P),_=t.add(w.multiplyBy(a)),N=t.add(B.multiplyBy(a)),q=1+w.x*B.x+w.y*B.y,A=q>0?w.add(B).multiplyBy(a/q):null;M(g,_,t,N),c.lineJoin==="miter"&&A&&Math.hypot(A.x,A.y)<=a*4&&M(g,_,t.add(A),N)}}l+=u}};if(d instanceof L.CircleMarker){const e=b.project(d.getLatLng());let o=d.getRadius(),a=o;if(d instanceof L.Circle){d._project();const i=d._point.add(b.getPixelOrigin());e.x=i.x,e.y=i.y,o=d._radius,a=d._radiusY||o}c.fill&&v(e,o,j,a);const r=Math.max(12,Math.min(128,Math.ceil(Math.PI*Math.sqrt(Math.max(o,a))))),l=(i,n=0)=>{const t=i*Math.PI*2/r;return new L.Point(e.x+Math.max(0,o+n)*Math.cos(t),e.y+Math.max(0,a+n)*Math.sin(t))};if(h.length)k(Array.from({length:r},(i,n)=>l(n)),!0);else if(c.stroke&&m>0)for(let i=0;i<r;i++)M(g,l(i,m/2),l(i,-m/2),l(i+1,m/2)),M(g,l(i+1,m/2),l(i,-m/2),l(i+1,-m/2))}else{const e=d instanceof L.Polygon,o=r=>{const l=r.map(i=>i.map(n=>b.project(n)));if(e&&c.fill&&l[0]?.length>=3){const i=l.filter(t=>t.length>=3),n=i.flat();for(const t of C(i[0],i.slice(1)))M(j,n[t[0]],n[t[1]],n[t[2]])}for(const i of l)k(i,e)},a=r=>{if(r.length)if(r[0]instanceof L.LatLng)o([r]);else if(e&&r[0][0]instanceof L.LatLng)o(r);else for(const l of r)a(l)};a(d.getLatLngs())}return{fill:j,stroke:g}}export{O as nativeGeometry};
2
+ //# sourceMappingURL=nativeGeometry.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/nativeGeometry.js"],
4
+ "sourcesContent": ["import { triangulate } from './triangulate.js';\r\n\r\n/** Leaflet paths become flat triangles; pixel-sized strokes are rebuilt on zoom. */\r\nexport function nativeGeometry(source, map, point) {\r\n const fill = [], stroke = [], options = source.options;\r\n const triangle = (target, a, b, c) => target.push(...point(a), ...point(b), ...point(c));\r\n const disk = (center, radius, target, radiusY = radius) => {\r\n if (!(radius > 0) || !(radiusY > 0)) return;\r\n const count = Math.max(12, Math.min(128, Math.ceil(Math.PI * Math.sqrt(radius))));\r\n for (let i = 0; i < count; i++) {\r\n const at = index => new L.Point(center.x + radius * Math.cos(index * 2 * Math.PI / count),\r\n center.y + radiusY * Math.sin(index * 2 * Math.PI / count));\r\n triangle(target, center, at(i), at(i + 1));\r\n }\r\n };\r\n const width = Number(options.weight) || 0;\r\n const dash = (Array.isArray(options.dashArray) ? options.dashArray :\r\n String(options.dashArray || '').trim().split(/[ ,]+/)).map(Number);\r\n if (dash.some(value => !Number.isFinite(value) || value < 0)) throw new Error('Invalid Leaflet dashArray');\r\n if (dash.every(value => value === 0)) dash.length = 0;\r\n if (dash.length % 2) dash.push(...dash);\r\n const line = (points, closed) => {\r\n if (!options.stroke || width <= 0 || points.length < 2) return;\r\n const radius = width / 2;\r\n const segment = (a, b, startCap, endCap) => {\r\n const length = a.distanceTo(b);\r\n if (!length) return;\r\n const direction = b.subtract(a).divideBy(length);\r\n const normal = new L.Point(-direction.y * radius, direction.x * radius);\r\n if (options.lineCap === 'square') {\r\n if (startCap) a = a.subtract(direction.multiplyBy(radius));\r\n if (endCap) b = b.add(direction.multiplyBy(radius));\r\n }\r\n triangle(stroke, a.add(normal), a.subtract(normal), b.add(normal));\r\n triangle(stroke, b.add(normal), a.subtract(normal), b.subtract(normal));\r\n if (options.lineCap === 'round') {\r\n if (startCap) disk(a, radius, stroke);\r\n if (endCap) disk(b, radius, stroke);\r\n }\r\n };\r\n let distance = Number(options.dashOffset) || 0;\r\n const period = dash.reduce((sum, value) => sum + value, 0);\r\n for (let i = 0; i < points.length - (closed ? 0 : 1); i++) {\r\n const a = points[i], b = points[(i + 1) % points.length], length = a.distanceTo(b);\r\n if (!dash.length) {\r\n segment(a, b, !closed && i === 0, !closed && i === points.length - 2);\r\n if (closed || i > 0) {\r\n if (options.lineJoin === 'round') disk(a, radius, stroke);\r\n else {\r\n const previous = a.subtract(points[(i + points.length - 1) % points.length]);\r\n const previousLength = Math.hypot(previous.x, previous.y);\r\n if (previousLength && length) {\r\n const incoming = previous.divideBy(previousLength);\r\n const outgoing = b.subtract(a).divideBy(length);\r\n const side = incoming.x * outgoing.y - incoming.y * outgoing.x > 0 ? -1 : 1;\r\n const n1 = new L.Point(-incoming.y * side, incoming.x * side);\r\n const n2 = new L.Point(-outgoing.y * side, outgoing.x * side);\r\n const from = a.add(n1.multiplyBy(radius)), to = a.add(n2.multiplyBy(radius));\r\n const denominator = 1 + n1.x * n2.x + n1.y * n2.y;\r\n const miter = denominator > 0 ? n1.add(n2).multiplyBy(radius / denominator) : null;\r\n triangle(stroke, from, a, to);\r\n if (options.lineJoin === 'miter' && miter && Math.hypot(miter.x, miter.y) <= radius * 4) {\r\n triangle(stroke, from, a.add(miter), to);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n let offset = 0;\r\n while (offset < length) {\r\n let phase = ((distance + offset) % period + period) % period, index = 0;\r\n while (phase >= dash[index]) phase -= dash[index++];\r\n const end = Math.min(length, offset + dash[index] - phase);\r\n if (index % 2 === 0) {\r\n const delta = b.subtract(a).divideBy(length);\r\n segment(a.add(delta.multiplyBy(offset)), a.add(delta.multiplyBy(end)), true, true);\r\n }\r\n offset = end;\r\n }\r\n }\r\n distance += length;\r\n }\r\n };\r\n if (source instanceof L.CircleMarker) {\r\n const center = map.project(source.getLatLng());\r\n let radius = source.getRadius(), radiusY = radius;\r\n if (source instanceof L.Circle) {\r\n source._project();\r\n const projected = source._point.add(map.getPixelOrigin());\r\n center.x = projected.x;\r\n center.y = projected.y;\r\n radius = source._radius;\r\n radiusY = source._radiusY || radius;\r\n }\r\n if (options.fill) disk(center, radius, fill, radiusY);\r\n const count = Math.max(12, Math.min(128, Math.ceil(Math.PI * Math.sqrt(Math.max(radius, radiusY)))));\r\n const at = (index, offset = 0) => {\r\n const angle = index * Math.PI * 2 / count;\r\n return new L.Point(center.x + Math.max(0, radius + offset) * Math.cos(angle),\r\n center.y + Math.max(0, radiusY + offset) * Math.sin(angle));\r\n };\r\n if (dash.length) line(Array.from({ length: count }, (_, index) => at(index)), true);\r\n else if (options.stroke && width > 0) {\r\n for (let i = 0; i < count; i++) {\r\n triangle(stroke, at(i, width / 2), at(i, -width / 2), at(i + 1, width / 2));\r\n triangle(stroke, at(i + 1, width / 2), at(i, -width / 2), at(i + 1, -width / 2));\r\n }\r\n }\r\n } else {\r\n const closed = source instanceof L.Polygon;\r\n const polygon = rings => {\r\n const projected = rings.map(ring => ring.map(latlng => map.project(latlng)));\r\n if (closed && options.fill && projected[0]?.length >= 3) {\r\n const valid = projected.filter(ring => ring.length >= 3);\r\n const vertices = valid.flat();\r\n for (const indices of triangulate(valid[0], valid.slice(1))) {\r\n triangle(fill, vertices[indices[0]], vertices[indices[1]], vertices[indices[2]]);\r\n }\r\n }\r\n for (const ring of projected) line(ring, closed);\r\n };\r\n const visit = coordinates => {\r\n if (!coordinates.length) return;\r\n if (coordinates[0] instanceof L.LatLng) polygon([coordinates]);\r\n else if (closed && coordinates[0][0] instanceof L.LatLng) polygon(coordinates);\r\n else for (const child of coordinates) visit(child);\r\n };\r\n visit(source.getLatLngs());\r\n }\r\n return { fill, stroke };\r\n}\r\n"],
5
+ "mappings": "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",
6
+ "names": ["triangulate", "nativeGeometry", "source", "map", "point", "fill", "stroke", "options", "triangle", "target", "a", "b", "c", "disk", "center", "radius", "radiusY", "count", "at", "index", "width", "dash", "value", "line", "points", "closed", "segment", "startCap", "endCap", "length", "direction", "normal", "distance", "period", "sum", "i", "offset", "phase", "end", "delta", "previous", "previousLength", "incoming", "outgoing", "side", "n1", "n2", "from", "to", "denominator", "miter", "projected", "angle", "_", "polygon", "rings", "ring", "latlng", "valid", "vertices", "indices", "visit", "coordinates", "child"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{createMesh as re}from"./createMesh.js";import{destroyTexture as P}from"./destroyTexture.js";import{disposeMesh as I}from"./disposeMesh.js";import{nativeGeometry as oe}from"./nativeGeometry.js";import{nativeEvents as ne}from"./nativeEvents.js";import{parseColor as se}from"./parseColor.js";import{update as k}from"./update.js";async function me(f){const{source:r,map:d}=f,s=f.backend=new L.Layer({source:{type:"3d"}}),p=f.meshes=new Map,u=new Map,H=new Map,v=new Set;d._nativeGPUOrder||=0,d._nativeGPUBack||=0;let U=!0,M=!0,T=!1,_=++d._nativeGPUOrder,F;const y=r instanceof L.Marker,Y=Number(getComputedStyle(r.getPane()).zIndex)||0,z=()=>r._nativeGPU===f&&d.hasLayer(r),m=()=>{U=!0,M=!0,T=!1,f.hide();const e=[r._icon,r._shadow,r._image];for(const t of v)e.includes(t)||(t.removeEventListener("load",m),t.removeEventListener("error",G),v.delete(t));for(const t of e)!(t instanceof HTMLImageElement)||v.has(t)||(v.add(t),t.addEventListener("load",m),t.addEventListener("error",G));s._shared&&k(s)},G=()=>r.fire("error",{error:new Error("Unable to load native layer image")});f.refresh=m,f.reorder=e=>{_=e?++d._nativeGPUOrder:--d._nativeGPUBack,m()};const W=()=>{M=!0,s._shared&&k(s)},R="load tileload tileunload move drag";r.on(R,m),d.on("zoomend",m),y&&d.on("move zoom rotate pitch resize viewreset",W);const J=ne(f);for(const e of["setLatLng","setLatLngs","addLatLng","setRadius","setStyle","redraw","setIcon","setUrl","setBounds","setOpacity","setZIndex","setZIndexOffset","bringToFront","bringToBack"]){if(typeof r[e]!="function")continue;const t=Object.getOwnPropertyDescriptor(r,e),o=r[e];H.set(e,t),r[e]=function(...i){const a=o.apply(this,i);if((e==="bringToFront"||e==="bringToBack")&&this instanceof L.GridLayer){const l=Object.values(d._layers).filter(c=>c!==this&&c instanceof L.GridLayer&&c.getPane()===this.getPane()).map(c=>c.options.zIndex||0),n=e==="bringToFront"?Math.max(...l)+1:Math.min(...l)-1;Number.isFinite(n)&&this.setZIndex(n)}return e==="bringToFront"&&(_=++d._nativeGPUOrder),e==="bringToBack"&&(_=--d._nativeGPUBack),m(),a}}f.dispose=()=>{r.off(R,m),d.off("zoomend",m),y&&d.off("move zoom rotate pitch resize viewreset",W),J(),f.refresh=f.reorder=null;for(const[e,t]of H)t?Object.defineProperty(r,e,t):delete r[e];for(const e of p.values())I(s,e);p.clear();for(const e of u.values())P(s,e.texture);u.clear();for(const e of v)e.removeEventListener("load",m),e.removeEventListener("error",G);s._beforeRender=null,s.remove()};const K=new Promise((e,t)=>{s.once("ready",e),s.once("error",({error:o})=>t(o))});if(s.on("error",({error:e})=>r.fire("error",{error:e})),m(),s.addTo(d),await K.catch(e=>{throw f.dispose(),e}),!z())return r;const S=e=>{const t=d.options.crs,o=t.project(s.location),i=t.project(e),a=Math.cos(s.location.lat*Math.PI/180);return[(i.x-o.x)*a,0,-(i.y-o.y)*a]},$=e=>S(d.unproject(e)),q=(e,t,o)=>{e.program.uniforms.baseColor.value=t,e.program.uniforms.opacity.value=o,r instanceof L.GridLayer&&(e.opacity=o);const i=y?r._zIndex+(r._cameraZIndexOffset||0):r.options.zIndex;e.renderOrder=Y*1e6+(i||0)*1e3+_,e._nativeSource=r,e._nativeUsed=!0},A=(e,t,o,i,a,l)=>{if(!t.length)return;let n=p.get(e);const c={position:t,normal:t.map((h,w)=>w%3===1?1:0),...l?{uv:l}:{}};if(!n||n.geometry.attributes.position.data.length!==t.length||n.program.uniforms.baseTexture?.value!==a)n&&I(s,n),n=re(s,c,{vertexColors:!1,color:o,opacity:i,unlit:!0,alphaMode:"BLEND",...a?{baseTexture:a}:{}},0,r instanceof L.GridLayer?F:void 0),r instanceof L.GridLayer&&(F||=n.program,n.texture=a),p.set(e,n);else{const h=n.geometry.attributes.position;h.data.set(t),h.needsUpdate=!0,n.geometry.bounds=null}return q(n,o,i),n},ee=(e,t)=>{if(!(t instanceof HTMLImageElement)&&!(t instanceof HTMLCanvasElement))throw new Error("WebGPU native raster layers require image or canvas tiles");let o=u.get(e);const i=t.currentSrc||t.src;if(!o||o.image!==t||o.url!==i){if(o){const c=p.get(e);c&&I(s,c),p.delete(e),P(s,o.texture),u.delete(e)}const a=t.naturalWidth||t.width,l=t.naturalHeight||t.height;if(!a||!l)return;const{device:n}=s.renderer;if(o={device:n,image:t,url:i,format:"rgba8unorm",uploaded:null,texture:n.createTexture({size:[a,l],format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),sampler:n.createSampler({minFilter:"linear",magFilter:"linear"})},u.set(e,o),t instanceof HTMLCanvasElement)o.pending=!0,createImageBitmap(t).then(c=>{try{if(!z()||u.get(e)!==o)return;n.queue.copyExternalImageToTexture({source:c},{texture:o.texture},[a,l]),o.uploaded=t,o.pending=!1,m()}finally{c.close()}}).catch(c=>{T=!0,r.fire("error",{error:c})});else{try{n.queue.copyExternalImageToTexture({source:t},{texture:o.texture},[a,l])}catch(c){throw o.texture.destroy(),u.delete(e),c}o.uploaded=t}}return o.used=!0,o.uploaded===t?o:void 0},D=(e,t,o,i)=>{const a=ee(e,t);if(!a)return;const l=[0,2,1,1,2,3];return A(e,l.flatMap(n=>o[n]),[1,1,1],i,a,l.flatMap(n=>[[0,0],[1,0],[0,1],[1,1]][n]))},Z=e=>[e.getNorthWest(),e.getNorthEast(),e.getSouthWest(),e.getSouthEast()].map(S),V=()=>{if(!(!z()||!s.renderer||T)&&!(!U&&(!y||!M))){U=!1,M=!1;for(const e of p.values())e._nativeUsed=!1;for(const e of u.values())e.used=!1;if(r instanceof L.GridLayer)for(const[e,t]of Object.entries(r._tiles||{})){if(!t.loaded||t.el instanceof HTMLImageElement&&!t.el.naturalWidth)continue;const o=(r.options.opacity??1)*(t._gpuOpacity??1),i=u.get(e);let a=p.get(e);if(a&&i?.image===t.el&&i.url===(t.el.currentSrc||t.el.src))i.used=!0,q(a,[1,1,1],o);else{const[l,n]=r._tileCoordsToNwSe(t.coords);a=D(e,t.el,Z(new L.LatLngBounds(l,n)),o)}a&&(a.renderOrder+=t.coords.z/100)}else if(r instanceof L.ImageOverlay)r._image?.complete&&r._image.naturalWidth&&D("image",r._image,Z(r.getBounds()),r.options.opacity??1);else if(y)for(const[e,t]of[["shadow",r._shadow],["icon",r._icon]]){if(!(t instanceof HTMLImageElement)||!t.complete||!t.naturalWidth)continue;const i=new DOMPoint(...S(r.getLatLng()),1).matrixTransform(new DOMMatrix(s.root.worldMatrix)).matrixTransform(new DOMMatrix(s.camera.projectionViewMatrix)),a=new DOMMatrix(s.camera.projectionViewMatrix).inverse(),l=new DOMMatrix(s.root.worldMatrix).inverse(),n=r.options.icon.options,c=d.getSize(),h=n[e==="shadow"?"shadowSize":"iconSize"]||[t.naturalWidth,t.naturalHeight],w=h.x??h[0],B=h.y??h[1],E=e==="shadow"&&n.shadowAnchor||n.iconAnchor||[Math.floor(w/2),Math.floor(B/2)],g=new L.Point((i.x/i.w+1)*c.x/2,(1-i.y/i.w)*c.y/2),O=g.x-(E.x??E[0]),b=g.y-(E.y??E[1]),te=[[O,b],[O+w,b],[O,b+B],[O+w,b+B]].map(([C,N])=>{const X=r._cameraIconPoint(C-g.x,N-g.y);C=g.x+X.x,N=g.y+X.y;const x=new DOMPoint(C/c.x*2-1,1-N/c.y*2,i.z/i.w,1).matrixTransform(a),j=new DOMPoint(x.x/x.w,x.y/x.w,x.z/x.w,1).matrixTransform(l);return[j.x,j.y,j.z]}),Q=D(e,t,te,r.options.opacity??1);e==="shadow"&&Q&&(Q.renderOrder-=100*1e6)}else{const{fill:e,stroke:t}=oe(r,d,$);for(const[o,i,a,l]of[["fill",e,r.options.fillColor||r.options.color,r.options.fillOpacity],["stroke",t,r.options.color,r.options.opacity]]){if(!i.length)continue;const{r:n,g:c,b:h}=se(a);A(o,i,[n,c,h],l??1)}}for(const[e,t]of p){if(t._nativeUsed)continue;I(s,t),p.delete(e);const o=u.get(e);o&&P(s,o.texture),u.delete(e)}for(const[e,t]of u)t.used||(P(s,t.texture),u.delete(e))}};s._beforeRender=()=>{try{V()}catch(e){T=!0,r.fire("error",{error:e})}};try{V()}catch(e){throw f.dispose(),e}return k(s),r}export{me as nativeLayer};
2
+ //# sourceMappingURL=nativeLayer.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/nativeLayer.js"],
4
+ "sourcesContent": ["import { createMesh } from './createMesh.js';\r\nimport { destroyTexture } from './destroyTexture.js';\r\nimport { disposeMesh } from './disposeMesh.js';\r\nimport { nativeGeometry } from './nativeGeometry.js';\r\nimport { nativeEvents } from './nativeEvents.js';\r\nimport { parseColor } from './parseColor.js';\r\nimport { update } from './update.js';\r\n\r\n/** Render from coordinates and detached raster sources; only accessible marker controls remain DOM. */\r\nexport async function nativeLayer(state) {\r\n const { source, map } = state;\r\n const backend = state.backend = new L.Layer({ source: { type: '3d' } });\r\n const meshes = state.meshes = new Map(), textures = new Map(), methods = new Map();\r\n const images = new Set();\r\n map._nativeGPUOrder ||= 0;\r\n map._nativeGPUBack ||= 0;\r\n let dirty = true, viewDirty = true, failed = false, order = ++map._nativeGPUOrder, rasterProgram;\r\n const marker = source instanceof L.Marker;\r\n const paneOrder = Number(getComputedStyle(source.getPane()).zIndex) || 0;\r\n const current = () => source._nativeGPU === state && map.hasLayer(source);\r\n const refresh = () => {\r\n dirty = true;\r\n viewDirty = true;\r\n failed = false;\r\n state.hide();\r\n const activeImages = [source._icon, source._shadow, source._image];\r\n for (const image of images) {\r\n if (activeImages.includes(image)) continue;\r\n image.removeEventListener('load', refresh);\r\n image.removeEventListener('error', imageError);\r\n images.delete(image);\r\n }\r\n for (const image of activeImages) {\r\n if (!(image instanceof HTMLImageElement) || images.has(image)) continue;\r\n images.add(image);\r\n image.addEventListener('load', refresh);\r\n image.addEventListener('error', imageError);\r\n }\r\n if (backend._shared) update(backend);\r\n };\r\n const imageError = () => source.fire('error', { error: new Error('Unable to load native layer image') });\r\n state.refresh = refresh;\r\n state.reorder = front => {\r\n order = front ? ++map._nativeGPUOrder : --map._nativeGPUBack;\r\n refresh();\r\n };\r\n const view = () => {\r\n viewDirty = true;\r\n if (backend._shared) update(backend);\r\n };\r\n const events = 'load tileload tileunload move drag';\r\n source.on(events, refresh);\r\n // Panning and camera changes never retriangulate paths or re-upload tile geometry.\r\n map.on('zoomend', refresh);\r\n if (marker) map.on('move zoom rotate pitch resize viewreset', view);\r\n const removeEvents = nativeEvents(state);\r\n for (const name of ['setLatLng', 'setLatLngs', 'addLatLng', 'setRadius', 'setStyle', 'redraw',\r\n 'setIcon', 'setUrl', 'setBounds', 'setOpacity', 'setZIndex', 'setZIndexOffset', 'bringToFront', 'bringToBack']) {\r\n if (typeof source[name] !== 'function') continue;\r\n const own = Object.getOwnPropertyDescriptor(source, name), original = source[name];\r\n methods.set(name, own);\r\n source[name] = function (...args) {\r\n const result = original.apply(this, args);\r\n if ((name === 'bringToFront' || name === 'bringToBack') && this instanceof L.GridLayer) {\r\n const indices = Object.values(map._layers).filter(layer => layer !== this &&\r\n layer instanceof L.GridLayer && layer.getPane() === this.getPane()).map(layer => layer.options.zIndex || 0);\r\n const edge = name === 'bringToFront' ? Math.max(...indices) + 1 : Math.min(...indices) - 1;\r\n if (Number.isFinite(edge)) this.setZIndex(edge);\r\n }\r\n if (name === 'bringToFront') order = ++map._nativeGPUOrder;\r\n if (name === 'bringToBack') order = --map._nativeGPUBack;\r\n refresh();\r\n return result;\r\n };\r\n }\r\n state.dispose = () => {\r\n source.off(events, refresh);\r\n map.off('zoomend', refresh);\r\n if (marker) map.off('move zoom rotate pitch resize viewreset', view);\r\n removeEvents();\r\n state.refresh = state.reorder = null;\r\n for (const [name, descriptor] of methods) {\r\n if (descriptor) Object.defineProperty(source, name, descriptor);\r\n else delete source[name];\r\n }\r\n for (const mesh of meshes.values()) disposeMesh(backend, mesh);\r\n meshes.clear();\r\n for (const texture of textures.values()) destroyTexture(backend, texture.texture);\r\n textures.clear();\r\n for (const image of images) {\r\n image.removeEventListener('load', refresh);\r\n image.removeEventListener('error', imageError);\r\n }\r\n backend._beforeRender = null;\r\n backend.remove();\r\n };\r\n const ready = new Promise((resolve, reject) => {\r\n backend.once('ready', resolve);\r\n backend.once('error', ({ error }) => reject(error));\r\n });\r\n backend.on('error', ({ error }) => source.fire('error', { error }));\r\n refresh();\r\n backend.addTo(map);\r\n await ready.catch(error => {\r\n state.dispose();\r\n throw error;\r\n });\r\n if (!current()) return source;\r\n\r\n const local = latlng => {\r\n const crs = map.options.crs, origin = crs.project(backend.location), p = crs.project(latlng);\r\n const metres = Math.cos(backend.location.lat * Math.PI / 180);\r\n return [(p.x - origin.x) * metres, 0, -(p.y - origin.y) * metres];\r\n };\r\n const pixel = p => local(map.unproject(p));\r\n const styleMesh = (mesh, color, opacity) => {\r\n mesh.program.uniforms.baseColor.value = color;\r\n mesh.program.uniforms.opacity.value = opacity;\r\n if (source instanceof L.GridLayer) mesh.opacity = opacity;\r\n const zIndex = marker ? source._zIndex + (source._cameraZIndexOffset || 0) : source.options.zIndex;\r\n mesh.renderOrder = paneOrder * 1e6 + (zIndex || 0) * 1000 + order;\r\n mesh._nativeSource = source;\r\n mesh._nativeUsed = true;\r\n };\r\n const put = (key, position, color, opacity, texture, uv) => {\r\n if (!position.length) return;\r\n let mesh = meshes.get(key);\r\n const data = {\r\n position, normal: position.map((_, index) => index % 3 === 1 ? 1 : 0),\r\n ...(uv ? { uv } : {}),\r\n };\r\n if (!mesh || mesh.geometry.attributes.position.data.length !== position.length ||\r\n mesh.program.uniforms.baseTexture?.value !== texture) {\r\n if (mesh) disposeMesh(backend, mesh);\r\n mesh = createMesh(backend, data, {\r\n vertexColors: false, color, opacity, unlit: true, alphaMode: 'BLEND',\r\n ...(texture ? { baseTexture: texture } : {}),\r\n }, 0, source instanceof L.GridLayer ? rasterProgram : undefined);\r\n if (source instanceof L.GridLayer) {\r\n rasterProgram ||= mesh.program;\r\n mesh.texture = texture;\r\n }\r\n meshes.set(key, mesh);\r\n } else {\r\n const attribute = mesh.geometry.attributes.position;\r\n attribute.data.set(position);\r\n attribute.needsUpdate = true;\r\n mesh.geometry.bounds = null;\r\n }\r\n styleMesh(mesh, color, opacity);\r\n return mesh;\r\n };\r\n const textureFor = (key, image) => {\r\n if (!(image instanceof HTMLImageElement) && !(image instanceof HTMLCanvasElement)) {\r\n throw new Error('WebGPU native raster layers require image or canvas tiles');\r\n }\r\n let texture = textures.get(key);\r\n const url = image.currentSrc || image.src;\r\n if (!texture || texture.image !== image || texture.url !== url) {\r\n if (texture) {\r\n const mesh = meshes.get(key);\r\n if (mesh) disposeMesh(backend, mesh);\r\n meshes.delete(key);\r\n destroyTexture(backend, texture.texture);\r\n textures.delete(key);\r\n }\r\n const width = image.naturalWidth || image.width, height = image.naturalHeight || image.height;\r\n if (!width || !height) return;\r\n const { device } = backend.renderer;\r\n texture = {\r\n device, image, url, format: 'rgba8unorm', uploaded: null,\r\n texture: device.createTexture({\r\n size: [width, height], format: 'rgba8unorm',\r\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,\r\n }),\r\n sampler: device.createSampler({ minFilter: 'linear', magFilter: 'linear' }),\r\n };\r\n textures.set(key, texture);\r\n if (image instanceof HTMLCanvasElement) {\r\n texture.pending = true;\r\n // Snapshot asynchronously: copying a GPU-backed 2D canvas directly forces a blocking readback in Chromium.\r\n createImageBitmap(image).then(bitmap => {\r\n try {\r\n if (!current() || textures.get(key) !== texture) return;\r\n device.queue.copyExternalImageToTexture({ source: bitmap }, { texture: texture.texture }, [width, height]);\r\n texture.uploaded = image;\r\n texture.pending = false;\r\n refresh();\r\n } finally {\r\n bitmap.close();\r\n }\r\n }).catch(error => {\r\n failed = true;\r\n source.fire('error', { error });\r\n });\r\n } else {\r\n // CORS/security failures reject ready or emit error on the owning native layer.\r\n try {\r\n device.queue.copyExternalImageToTexture({ source: image }, { texture: texture.texture }, [width, height]);\r\n } catch (error) {\r\n texture.texture.destroy();\r\n textures.delete(key);\r\n throw error;\r\n }\r\n texture.uploaded = image;\r\n }\r\n }\r\n texture.used = true;\r\n return texture.uploaded === image ? texture : undefined;\r\n };\r\n const quad = (key, image, corners, opacity) => {\r\n const texture = textureFor(key, image);\r\n if (!texture) return;\r\n const indices = [0, 2, 1, 1, 2, 3];\r\n return put(key, indices.flatMap(i => corners[i]), [1, 1, 1], opacity, texture,\r\n indices.flatMap(i => [[0, 0], [1, 0], [0, 1], [1, 1]][i]));\r\n };\r\n const boundsQuad = bounds => [\r\n bounds.getNorthWest(), bounds.getNorthEast(), bounds.getSouthWest(), bounds.getSouthEast(),\r\n ].map(local);\r\n const synchronize = () => {\r\n if (!current() || !backend.renderer || failed) return;\r\n if (!dirty && (!marker || !viewDirty)) return;\r\n dirty = false;\r\n viewDirty = false;\r\n for (const mesh of meshes.values()) mesh._nativeUsed = false;\r\n for (const texture of textures.values()) texture.used = false;\r\n if (source instanceof L.GridLayer) {\r\n for (const [key, tile] of Object.entries(source._tiles || {})) {\r\n if (!tile.loaded || tile.el instanceof HTMLImageElement && !tile.el.naturalWidth) continue;\r\n const opacity = (source.options.opacity ?? 1) * (tile._gpuOpacity ?? 1);\r\n const retained = textures.get(key);\r\n let mesh = meshes.get(key);\r\n if (mesh && retained?.image === tile.el && retained.url === (tile.el.currentSrc || tile.el.src)) {\r\n retained.used = true;\r\n styleMesh(mesh, [1, 1, 1], opacity);\r\n } else {\r\n const [nw, se] = source._tileCoordsToNwSe(tile.coords);\r\n mesh = quad(key, tile.el, boundsQuad(new L.LatLngBounds(nw, se)), opacity);\r\n }\r\n if (mesh) mesh.renderOrder += tile.coords.z / 100;\r\n }\r\n } else if (source instanceof L.ImageOverlay) {\r\n if (source._image?.complete && source._image.naturalWidth) {\r\n quad('image', source._image, boundsQuad(source.getBounds()), source.options.opacity ?? 1);\r\n }\r\n } else if (marker) {\r\n for (const [key, image] of [['shadow', source._shadow], ['icon', source._icon]]) {\r\n if (!(image instanceof HTMLImageElement) || !image.complete || !image.naturalWidth) continue;\r\n const world = new DOMPoint(...local(source.getLatLng()), 1)\r\n .matrixTransform(new DOMMatrix(backend.root.worldMatrix));\r\n const clip = world.matrixTransform(new DOMMatrix(backend.camera.projectionViewMatrix));\r\n const inverse = new DOMMatrix(backend.camera.projectionViewMatrix).inverse();\r\n const toLocal = new DOMMatrix(backend.root.worldMatrix).inverse();\r\n const options = source.options.icon.options, size = map.getSize();\r\n const dimensions = options[key === 'shadow' ? 'shadowSize' : 'iconSize'] ||\r\n [image.naturalWidth, image.naturalHeight];\r\n const width = dimensions.x ?? dimensions[0], height = dimensions.y ?? dimensions[1];\r\n const anchor = (key === 'shadow' && options.shadowAnchor) ||\r\n options.iconAnchor || [Math.floor(width / 2), Math.floor(height / 2)];\r\n const center = new L.Point((clip.x / clip.w + 1) * size.x / 2, (1 - clip.y / clip.w) * size.y / 2);\r\n const left = center.x - (anchor.x ?? anchor[0]), top = center.y - (anchor.y ?? anchor[1]);\r\n const corners = [[left, top], [left + width, top],\r\n [left, top + height], [left + width, top + height]].map(([x, y]) => {\r\n const offset = source._cameraIconPoint(x - center.x, y - center.y);\r\n x = center.x + offset.x; y = center.y + offset.y;\r\n const p = new DOMPoint(x / size.x * 2 - 1,\r\n 1 - y / size.y * 2, clip.z / clip.w, 1).matrixTransform(inverse);\r\n const result = new DOMPoint(p.x / p.w, p.y / p.w, p.z / p.w, 1).matrixTransform(toLocal);\r\n return [result.x, result.y, result.z];\r\n });\r\n const mesh = quad(key, image, corners, source.options.opacity ?? 1);\r\n if (key === 'shadow' && mesh) mesh.renderOrder -= 100 * 1e6;\r\n }\r\n } else {\r\n const { fill, stroke } = nativeGeometry(source, map, pixel);\r\n for (const [key, positions, color, opacity] of [\r\n ['fill', fill, source.options.fillColor || source.options.color, source.options.fillOpacity],\r\n ['stroke', stroke, source.options.color, source.options.opacity],\r\n ]) {\r\n if (!positions.length) continue;\r\n const { r, g, b } = parseColor(color);\r\n put(key, positions, [r, g, b], opacity ?? 1);\r\n }\r\n }\r\n for (const [key, mesh] of meshes) {\r\n if (mesh._nativeUsed) continue;\r\n disposeMesh(backend, mesh);\r\n meshes.delete(key);\r\n const texture = textures.get(key);\r\n if (texture) destroyTexture(backend, texture.texture);\r\n textures.delete(key);\r\n }\r\n for (const [key, texture] of textures) {\r\n if (texture.used) continue;\r\n destroyTexture(backend, texture.texture);\r\n textures.delete(key);\r\n }\r\n };\r\n backend._beforeRender = () => {\r\n try {\r\n synchronize();\r\n } catch (error) {\r\n failed = true;\r\n source.fire('error', { error });\r\n }\r\n };\r\n // ponytail: tessellate pixel-width strokes on zoomend; use shader extrusion for continuous zoom at scale.\r\n try {\r\n synchronize();\r\n } catch (error) {\r\n state.dispose();\r\n throw error;\r\n }\r\n update(backend);\r\n return source;\r\n}\r\n"],
5
+ "mappings": "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",
6
+ "names": ["createMesh", "destroyTexture", "disposeMesh", "nativeGeometry", "nativeEvents", "parseColor", "update", "nativeLayer", "state", "source", "map", "backend", "meshes", "textures", "methods", "images", "dirty", "viewDirty", "failed", "order", "rasterProgram", "marker", "paneOrder", "current", "refresh", "activeImages", "image", "imageError", "front", "view", "events", "removeEvents", "name", "own", "original", "args", "result", "indices", "layer", "edge", "descriptor", "mesh", "texture", "ready", "resolve", "reject", "error", "local", "latlng", "crs", "origin", "p", "metres", "pixel", "styleMesh", "color", "opacity", "zIndex", "put", "key", "position", "uv", "data", "_", "index", "attribute", "textureFor", "url", "width", "height", "device", "bitmap", "quad", "corners", "i", "boundsQuad", "bounds", "synchronize", "tile", "retained", "nw", "se", "clip", "inverse", "toLocal", "options", "size", "dimensions", "anchor", "center", "left", "top", "x", "y", "offset", "fill", "stroke", "positions", "r", "g", "b"]
7
+ }
@@ -0,0 +1,2 @@
1
+ function m(o){if(o.matrix)return Array.from(o.matrix);const[r,t,n,a]=o.rotation||[0,0,0,1],[i,x,f]=o.scale||[1,1,1];return[(1-2*(t*t+n*n))*i,2*(r*t+n*a)*i,2*(r*n-t*a)*i,0,2*(r*t-n*a)*x,(1-2*(r*r+n*n))*x,2*(t*n+r*a)*x,0,2*(r*n+t*a)*f,2*(t*n-r*a)*f,(1-2*(r*r+t*t))*f,0,...o.translation||[0,0,0],1]}export{m as nodeMatrix};
2
+ //# sourceMappingURL=nodeMatrix.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/nodeMatrix.js"],
4
+ "sourcesContent": ["/** glTF quaternion/translation/scale to a column-major matrix. */\n\nexport function nodeMatrix(spec) {\n if (spec.matrix) return Array.from(spec.matrix);\n // glTF stores quaternions [x,y,z,w]; convert directly to a scaled column-major matrix.\n const [x, y, z, w] = spec.rotation || [0, 0, 0, 1], [sx, sy, sz] = spec.scale || [1, 1, 1];\n return [\n (1 - 2 * (y * y + z * z)) * sx,\n 2 * (x * y + z * w) * sx,\n 2 * (x * z - y * w) * sx,\n 0,\n 2 * (x * y - z * w) * sy,\n (1 - 2 * (x * x + z * z)) * sy,\n 2 * (y * z + x * w) * sy, 0,\n 2 * (x * z + y * w) * sz,\n 2 * (y * z - x * w) * sz,\n (1 - 2 * (x * x + y * y)) * sz,\n 0,\n ...(spec.translation || [0, 0, 0]),\n 1,\n ];\n}\n"],
5
+ "mappings": "AAEO,SAASA,EAAWC,EAAM,CAC/B,GAAIA,EAAK,OAAQ,OAAO,MAAM,KAAKA,EAAK,MAAM,EAE9C,KAAM,CAACC,EAAGC,EAAGC,EAAGC,CAAC,EAAIJ,EAAK,UAAY,CAAC,EAAG,EAAG,EAAG,CAAC,EAAG,CAACK,EAAIC,EAAIC,CAAE,EAAIP,EAAK,OAAS,CAAC,EAAG,EAAG,CAAC,EACzF,MAAO,EACJ,EAAI,GAAKE,EAAIA,EAAIC,EAAIA,IAAME,EAC5B,GAAKJ,EAAIC,EAAIC,EAAIC,GAAKC,EACtB,GAAKJ,EAAIE,EAAID,EAAIE,GAAKC,EACtB,EACA,GAAKJ,EAAIC,EAAIC,EAAIC,GAAKE,GACrB,EAAI,GAAKL,EAAIA,EAAIE,EAAIA,IAAMG,EAC5B,GAAKJ,EAAIC,EAAIF,EAAIG,GAAKE,EAAI,EAC1B,GAAKL,EAAIE,EAAID,EAAIE,GAAKG,EACtB,GAAKL,EAAIC,EAAIF,EAAIG,GAAKG,GACrB,EAAI,GAAKN,EAAIA,EAAIC,EAAIA,IAAMK,EAC5B,EACA,GAAIP,EAAK,aAAe,CAAC,EAAG,EAAG,CAAC,EAChC,CACF,CACF",
6
+ "names": ["nodeMatrix", "spec", "x", "y", "z", "w", "sx", "sy", "sz"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import*as r from"./attach.js";import*as e from"./onClick.js";import*as l from"./onPointerLeave.js";import*as p from"./onPointerMove.js";function n(o,i){if(!o.location){const t=i.getCenter();o.location=new L.LatLng(t.lat,t.lng)}(o.url||o._geojson||o.options.tooltip||o.modelUrl)&&(o.container=i.getContainer(),o._pointerEvents||={mousemove:t=>p.onPointerMove(o,t),click:t=>e.onClick(o,t),mouseleave:()=>l.onPointerLeave(o)},o.options.tooltip&&(o._tooltip=L.DomUtil.create("div","leaflet-3d-tooltip",o.container),o._tooltip.hidden=!0,o._tooltip.setAttribute("role","tooltip"),o._tooltip.setAttribute("aria-live","polite"),o._tooltip.style.cssText="position:absolute;z-index:600;max-width:220px;padding:10px 12px;border:1px solid #6b5140;border-radius:6px;background:#fffaf0;box-shadow:0 3px 12px #0005;color:#30251d;font:13px/1.45 sans-serif;pointer-events:none"),L.DomEvent.on(o.container,o._pointerEvents)),o.root&&r.attach(o,i).then(()=>o._added.resolve(),t=>o.fire("error",{error:t}))}export{n as onAdd3DLayer};
2
+ //# sourceMappingURL=onAdd3DLayer.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/onAdd3DLayer.js"],
4
+ "sourcesContent": ["import * as attach from './attach.js';\nimport * as onClick from './onClick.js';\nimport * as onPointerLeave from './onPointerLeave.js';\nimport * as onPointerMove from './onPointerMove.js';\n\n/** Attach interaction immediately; initialization may finish before or after onAdd. */\nexport function onAdd3DLayer(backend, map) {\n if (!backend.location) {\n const center = map.getCenter();\n backend.location = new L.LatLng(center.lat, center.lng);\n }\n if (backend.url || backend._geojson || backend.options.tooltip || backend.modelUrl) {\n backend.container = map.getContainer();\n backend._pointerEvents ||= {\n mousemove: event => onPointerMove.onPointerMove(backend, event),\n click: event => onClick.onClick(backend, event),\n mouseleave: () => onPointerLeave.onPointerLeave(backend),\n };\n if (backend.options.tooltip) {\n backend._tooltip = L.DomUtil.create('div', 'leaflet-3d-tooltip', backend.container);\n backend._tooltip.hidden = true;\n backend._tooltip.setAttribute('role', 'tooltip');\n backend._tooltip.setAttribute('aria-live', 'polite');\n backend._tooltip.style.cssText = 'position:absolute;z-index:600;max-width:220px;padding:10px 12px;border:1px solid #6b5140;border-radius:6px;background:#fffaf0;box-shadow:0 3px 12px #0005;color:#30251d;font:13px/1.45 sans-serif;pointer-events:none';\n }\n L.DomEvent.on(backend.container, backend._pointerEvents);\n }\n if (backend.root) {\n attach.attach(backend, map).then(() => backend._added.resolve(), error => backend.fire('error', { error }));\n }\n}\n"],
5
+ "mappings": "AAAA,UAAYA,MAAY,cACxB,UAAYC,MAAa,eACzB,UAAYC,MAAoB,sBAChC,UAAYC,MAAmB,qBAGxB,SAASC,EAAaC,EAASC,EAAK,CACzC,GAAI,CAACD,EAAQ,SAAU,CACrB,MAAME,EAASD,EAAI,UAAU,EAC7BD,EAAQ,SAAW,IAAI,EAAE,OAAOE,EAAO,IAAKA,EAAO,GAAG,CACxD,EACIF,EAAQ,KAAOA,EAAQ,UAAYA,EAAQ,QAAQ,SAAWA,EAAQ,YACxEA,EAAQ,UAAYC,EAAI,aAAa,EACrCD,EAAQ,iBAAmB,CACzB,UAAWG,GAASL,EAAc,cAAcE,EAASG,CAAK,EAC9D,MAAOA,GAASP,EAAQ,QAAQI,EAASG,CAAK,EAC9C,WAAY,IAAMN,EAAe,eAAeG,CAAO,CACzD,EACIA,EAAQ,QAAQ,UAClBA,EAAQ,SAAW,EAAE,QAAQ,OAAO,MAAO,qBAAsBA,EAAQ,SAAS,EAClFA,EAAQ,SAAS,OAAS,GAC1BA,EAAQ,SAAS,aAAa,OAAQ,SAAS,EAC/CA,EAAQ,SAAS,aAAa,YAAa,QAAQ,EACnDA,EAAQ,SAAS,MAAM,QAAU,yNAEnC,EAAE,SAAS,GAAGA,EAAQ,UAAWA,EAAQ,cAAc,GAErDA,EAAQ,MACVL,EAAO,OAAOK,EAASC,CAAG,EAAE,KAAK,IAAMD,EAAQ,OAAO,QAAQ,EAAGI,GAASJ,EAAQ,KAAK,QAAS,CAAE,MAAAI,CAAM,CAAC,CAAC,CAE9G",
6
+ "names": ["attach", "onClick", "onPointerLeave", "onPointerMove", "onAdd3DLayer", "backend", "map", "center", "event", "error"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{underEntry as D}from"./underEntry.js";import{update as P}from"./update.js";import{atmosphere as A}from"./atmosphere.js";import{moonPosition as U}from"./moonPosition.js";import{projectCelestialBody as N}from"./projectCelestialBody.js";import{solarPosition as _}from"./solarPosition.js";function B(a,t){if(!a.control){const e=new L.Control({position:"bottomright"});e.live=!0;let r,s,g,l,w;const k=t.getContainer().style.getPropertyValue("--leaflet-sky-background"),T="position:absolute;width:18px;height:18px;border-radius:50%;transform:translate(-50%,-50%);pointer-events:none;",m=L.DomUtil.create("div","sunlight-sun"),f=L.DomUtil.create("div","sunlight-moon");m.style.cssText=T+"background:#fff3bd;box-shadow:0 0 18px 7px #ffd27699;",f.style.cssText=T+"background:#dce5f2;box-shadow:0 0 10px 2px #cbdcff55;",m.setAttribute("role","img"),m.setAttribute("aria-label","Sun"),f.setAttribute("role","img"),f.setAttribute("aria-label","Moon");const c=()=>{const o=t._sunlight,n=t._pitchSky;o?t.getContainer().style.setProperty("--leaflet-sky-background",o.background):k?t.getContainer().style.setProperty("--leaflet-sky-background",k):t.getContainer().style.removeProperty("--leaflet-sky-background");const i=t.getSize(),p=t.getPitch()*Math.PI/180,E=t.getBearing()*Math.PI/180;for(const[u,v]of[[m,o],[f,o?.moon]]){if(u.hidden=!0,!n||!v||v.altitude<=0||!o)continue;u.parentNode!==n&&n.append(u);const S=N(v.direction,i,p,E);if(!S)continue;const{left:y,top:C}=S;u.hidden=y<0||y>i.x||C<0||C>n.clientHeight||n.style.display==="none",u.style.left=`${y}px`,u.style.top=`${C}px`}},x=()=>{const o=L.Layer._renderers.get(t);o&&P(o)},d=()=>{try{e.live&&(e.time=new Date);const o=e.time.toISOString();r.value=o.slice(0,10),s.value=String(e.time.getUTCHours()*60+e.time.getUTCMinutes()),g.textContent=`${o.slice(11,16)} UTC${e.live?" \xB7 now":""}`;const n=t.getCenter(),i=t._sunlight=_(e.time,n.lat,n.lng);Object.assign(i,A(i.altitude)),i.moon=U(e.time,n.lat,n.lng),l.textContent=i.altitude<=0?"Night \xB7 no direct sunlight":i.altitude<3?"Low sun \xB7 shadows paused":`Sun altitude ${i.altitude.toFixed(1)}\xB0`,t.fire("simulationtimechange",{time:new Date(e.time),live:e.live}),c(),x()}catch(o){delete t._sunlight,c(),x(),l.textContent=`Error: ${o.message}`,console.error("Solar simulation",o)}};e.onAdd=()=>{const o=L.DomUtil.create("div","sunlight-control");o.style.cssText="color:#222;width:min(200px,calc(100vw - 60px));font:12px/1.4 sans-serif;",r=document.createElement("input"),r.type="date",r.style.cssText="width:100%;box-sizing:border-box;",r.setAttribute("aria-label","Solar date (UTC)"),s=document.createElement("input"),s.type="range",s.style.cssText="width:100%;box-sizing:border-box;margin:10px 0 4px;cursor:pointer;",s.min="0",s.max="1439",s.step="1",s.setAttribute("aria-label","Time of day (UTC)"),g=document.createElement("output"),g.style.cssText="font-weight:bold;font-variant-numeric:tabular-nums;",g.setAttribute("aria-live","off");const n=document.createElement("button");n.type="button",n.textContent="Now",n.onclick=()=>{e.live=!0,d()};const i=document.createElement("div");i.className="sunlight-time",i.style.cssText="display:flex;justify-content:space-between;align-items:center;",i.append(g,n),l=document.createElement("div"),l.className="sunlight-status",l.style.marginTop="5px",l.setAttribute("role","status");const p=document.createElement("small");return p.style.color="#555",p.textContent="Indicative \xB7 loaded geometry only. Streetlight illumination is estimated, not measured lux.",o.append(r,s,i,l,p),r.onchange=s.oninput=()=>{if(e.live=!1,!r.value||!r.validity.valid){e.time=new Date(NaN),t.fire("simulationtimechange",{time:null,live:!1}),delete t._sunlight,c(),x(),l.textContent="Error: choose a valid solar date";return}e.time=new Date(`${r.value}T00:00:00Z`),e.time.setUTCMinutes(Number(s.value)),d()},L.DomEvent.disableClickPropagation(o),L.DomEvent.disableScrollPropagation(o),d(),w=setInterval(()=>{e.live&&d()},6e4),t.on("moveend",d),t.on("move rotate pitch resize",c),o},e.onRemove=()=>{clearInterval(w),t.fire("simulationtimechange",{time:null,live:!1}),t.off("moveend",d),t.off("move rotate pitch resize",c),delete t._sunlight,c(),m.remove(),f.remove(),x()},a.control=e}a.control._map||a.control.addTo(t);const b=a.control.getContainer(),h=D(a,b);b.classList.toggle("leaflet-control",!h),b.classList.toggle("leaflet-bar",!h),Object.assign(b.style,h?{background:"",padding:"2px 0 6px 20px",margin:"0"}:{background:"#fff",padding:"8px",margin:""})}export{B as onAddSun};
2
+ //# sourceMappingURL=onAddSun.js.map