leaflet-city-mapper 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (472) hide show
  1. package/README.md +15 -13
  2. package/cucumber.mjs +4 -0
  3. package/dist/leaflet-city-mapper.js +1 -1
  4. package/dist/leaflet-city-mapper.js.map +4 -4
  5. package/dist/utils/CELL.js +2 -0
  6. package/dist/utils/CELL.js.map +7 -0
  7. package/dist/utils/addBridges.js +2 -0
  8. package/dist/utils/addBridges.js.map +7 -0
  9. package/dist/utils/addRasterTile.js +2 -0
  10. package/dist/utils/addRasterTile.js.map +7 -0
  11. package/dist/utils/along.js +2 -0
  12. package/dist/utils/along.js.map +7 -0
  13. package/dist/utils/atmosphere.js +2 -0
  14. package/dist/utils/atmosphere.js.map +7 -0
  15. package/dist/utils/attach.js +2 -0
  16. package/dist/utils/attach.js.map +7 -0
  17. package/dist/utils/bindSunlight.js +2 -0
  18. package/dist/utils/bindSunlight.js.map +7 -0
  19. package/dist/utils/box.js +2 -0
  20. package/dist/utils/box.js.map +7 -0
  21. package/dist/utils/bridgeElevation.js +2 -0
  22. package/dist/utils/bridgeElevation.js.map +7 -0
  23. package/dist/utils/build.js +2 -0
  24. package/dist/utils/build.js.map +7 -0
  25. package/dist/utils/cameraControls.js +2 -0
  26. package/dist/utils/cameraControls.js.map +7 -0
  27. package/dist/utils/channel.js +2 -0
  28. package/dist/utils/channel.js.map +7 -0
  29. package/dist/utils/collider.js +2 -0
  30. package/dist/utils/collider.js.map +7 -0
  31. package/dist/utils/colliders.js +2 -0
  32. package/dist/utils/colliders.js.map +7 -0
  33. package/dist/utils/computeBounds.js +2 -0
  34. package/dist/utils/computeBounds.js.map +7 -0
  35. package/dist/utils/conformModelToTerrain.js +2 -0
  36. package/dist/utils/conformModelToTerrain.js.map +7 -0
  37. package/dist/utils/createMesh.js +2 -0
  38. package/dist/utils/createMesh.js.map +7 -0
  39. package/dist/utils/createProgram.js +3 -0
  40. package/dist/utils/createProgram.js.map +7 -0
  41. package/dist/utils/decodeDirectory.js +2 -0
  42. package/dist/utils/decodeDirectory.js.map +7 -0
  43. package/dist/utils/decodeHeader.js +2 -0
  44. package/dist/utils/decodeHeader.js.map +7 -0
  45. package/dist/utils/decodeModel.js +2 -0
  46. package/dist/utils/decodeModel.js.map +7 -0
  47. package/dist/utils/decompress.js +2 -0
  48. package/dist/utils/decompress.js.map +7 -0
  49. package/dist/utils/destroyTexture.js +2 -0
  50. package/dist/utils/destroyTexture.js.map +7 -0
  51. package/dist/utils/disposeMesh.js +2 -0
  52. package/dist/utils/disposeMesh.js.map +7 -0
  53. package/dist/utils/drawGeometry.js +2 -0
  54. package/dist/utils/drawGeometry.js.map +7 -0
  55. package/dist/utils/elevationWGSL.js +24 -0
  56. package/dist/utils/elevationWGSL.js.map +7 -0
  57. package/dist/utils/emptyNode.js +2 -0
  58. package/dist/utils/emptyNode.js.map +7 -0
  59. package/dist/utils/endZoom.js +2 -0
  60. package/dist/utils/endZoom.js.map +7 -0
  61. package/dist/utils/findFeature.js +2 -0
  62. package/dist/utils/findFeature.js.map +7 -0
  63. package/dist/utils/geometry.js +0 -1
  64. package/dist/utils/geometry.js.map +4 -4
  65. package/dist/utils/getElevation.js +2 -0
  66. package/dist/utils/getElevation.js.map +7 -0
  67. package/dist/utils/getHeader.js +2 -0
  68. package/dist/utils/getHeader.js.map +7 -0
  69. package/dist/utils/getZxy.js +2 -0
  70. package/dist/utils/getZxy.js.map +7 -0
  71. package/dist/utils/glass.js +2 -0
  72. package/dist/utils/glass.js.map +7 -0
  73. package/dist/utils/headlight.js +2 -0
  74. package/dist/utils/headlight.js.map +7 -0
  75. package/dist/utils/hit.js +2 -0
  76. package/dist/utils/hit.js.map +7 -0
  77. package/dist/utils/horizontalPosition.js +2 -0
  78. package/dist/utils/horizontalPosition.js.map +7 -0
  79. package/dist/utils/horizontalRay.js +2 -0
  80. package/dist/utils/horizontalRay.js.map +7 -0
  81. package/dist/utils/hull.js +2 -0
  82. package/dist/utils/hull.js.map +7 -0
  83. package/dist/utils/initSunlight.js +2 -0
  84. package/dist/utils/initSunlight.js.map +7 -0
  85. package/dist/utils/initTerrain.js +2 -0
  86. package/dist/utils/initTerrain.js.map +7 -0
  87. package/dist/utils/initTraffic.js +40 -0
  88. package/dist/utils/initTraffic.js.map +7 -0
  89. package/dist/utils/initWalk.js +2 -0
  90. package/dist/utils/initWalk.js.map +7 -0
  91. package/dist/utils/intersectMeshes.js +2 -0
  92. package/dist/utils/intersectMeshes.js.map +7 -0
  93. package/dist/utils/isClockWise.js +2 -0
  94. package/dist/utils/isClockWise.js.map +7 -0
  95. package/dist/utils/lampPostGeometry.js +2 -0
  96. package/dist/utils/lampPostGeometry.js.map +7 -0
  97. package/dist/utils/lightGeometry.js +2 -0
  98. package/dist/utils/lightGeometry.js.map +7 -0
  99. package/dist/utils/lightGrid.js +2 -0
  100. package/dist/utils/lightGrid.js.map +7 -0
  101. package/dist/utils/limbs.js +2 -0
  102. package/dist/utils/limbs.js.map +7 -0
  103. package/dist/utils/loadModel.js +2 -0
  104. package/dist/utils/loadModel.js.map +7 -0
  105. package/dist/utils/loadSource.js +2 -0
  106. package/dist/utils/loadSource.js.map +7 -0
  107. package/dist/utils/loadTerrain.js +2 -0
  108. package/dist/utils/loadTerrain.js.map +7 -0
  109. package/dist/utils/mapCamera.js +2 -0
  110. package/dist/utils/mapCamera.js.map +7 -0
  111. package/dist/utils/{shaders.js → materialShaders.js} +16 -8
  112. package/dist/utils/materialShaders.js.map +7 -0
  113. package/dist/utils/mirror.js +2 -0
  114. package/dist/utils/mirror.js.map +7 -0
  115. package/dist/utils/moonPosition.js +2 -0
  116. package/dist/utils/moonPosition.js.map +7 -0
  117. package/dist/utils/moves.js +2 -0
  118. package/dist/utils/moves.js.map +7 -0
  119. package/dist/utils/nativeEvents.js +2 -0
  120. package/dist/utils/nativeEvents.js.map +7 -0
  121. package/dist/utils/nativeGeometry.js +2 -0
  122. package/dist/utils/nativeGeometry.js.map +7 -0
  123. package/dist/utils/nativeLayer.js +2 -0
  124. package/dist/utils/nativeLayer.js.map +7 -0
  125. package/dist/utils/nodeMatrix.js +2 -0
  126. package/dist/utils/nodeMatrix.js.map +7 -0
  127. package/dist/utils/onAdd3DLayer.js +2 -0
  128. package/dist/utils/onAdd3DLayer.js.map +7 -0
  129. package/dist/utils/onAddSun.js +2 -0
  130. package/dist/utils/onAddSun.js.map +7 -0
  131. package/dist/utils/onClick.js +2 -0
  132. package/dist/utils/onClick.js.map +7 -0
  133. package/dist/utils/onMapChange.js +2 -0
  134. package/dist/utils/onMapChange.js.map +7 -0
  135. package/dist/utils/onPMTileAdd.js +2 -0
  136. package/dist/utils/onPMTileAdd.js.map +7 -0
  137. package/dist/utils/onPMTileRemove.js +2 -0
  138. package/dist/utils/onPMTileRemove.js.map +7 -0
  139. package/dist/utils/onPointerLeave.js +2 -0
  140. package/dist/utils/onPointerLeave.js.map +7 -0
  141. package/dist/utils/onPointerMove.js +2 -0
  142. package/dist/utils/onPointerMove.js.map +7 -0
  143. package/dist/utils/onRemove3DLayer.js +2 -0
  144. package/dist/utils/onRemove3DLayer.js.map +7 -0
  145. package/dist/utils/onRemoveSun.js +2 -0
  146. package/dist/utils/onRemoveSun.js.map +7 -0
  147. package/dist/utils/onTerrainAdd.js +2 -0
  148. package/dist/utils/onTerrainAdd.js.map +7 -0
  149. package/dist/utils/onTerrainChange.js +2 -0
  150. package/dist/utils/onTerrainChange.js.map +7 -0
  151. package/dist/utils/onTerrainRemove.js +2 -0
  152. package/dist/utils/onTerrainRemove.js.map +7 -0
  153. package/dist/utils/onZoomAnim.js +2 -0
  154. package/dist/utils/onZoomAnim.js.map +7 -0
  155. package/dist/utils/paints.js +2 -0
  156. package/dist/utils/paints.js.map +7 -0
  157. package/dist/utils/parseColor.js +2 -0
  158. package/dist/utils/parseColor.js.map +7 -0
  159. package/dist/utils/parts.js +2 -0
  160. package/dist/utils/parts.js.map +7 -0
  161. package/dist/utils/projectCelestialBody.js +2 -0
  162. package/dist/utils/projectCelestialBody.js.map +7 -0
  163. package/dist/utils/pump.js +2 -0
  164. package/dist/utils/pump.js.map +7 -0
  165. package/dist/utils/rasterTiles.js +2 -0
  166. package/dist/utils/rasterTiles.js.map +7 -0
  167. package/dist/utils/raycast.js +2 -0
  168. package/dist/utils/raycast.js.map +7 -0
  169. package/dist/utils/read.js +2 -0
  170. package/dist/utils/read.js.map +7 -0
  171. package/dist/utils/readAccessor.js +2 -0
  172. package/dist/utils/readAccessor.js.map +7 -0
  173. package/dist/utils/releaseArea.js +2 -0
  174. package/dist/utils/releaseArea.js.map +7 -0
  175. package/dist/utils/removeRasterTile.js +2 -0
  176. package/dist/utils/removeRasterTile.js.map +7 -0
  177. package/dist/utils/render.js +15 -0
  178. package/dist/utils/render.js.map +7 -0
  179. package/dist/utils/renderSunlight.js +13 -0
  180. package/dist/utils/renderSunlight.js.map +7 -0
  181. package/dist/utils/renderers.js +2 -0
  182. package/dist/utils/renderers.js.map +7 -0
  183. package/dist/utils/resizeSunlight.js +2 -0
  184. package/dist/utils/resizeSunlight.js.map +7 -0
  185. package/dist/utils/roofCoverage.js +2 -0
  186. package/dist/utils/roofCoverage.js.map +7 -0
  187. package/dist/utils/routeGeometry.js +2 -0
  188. package/dist/utils/routeGeometry.js.map +7 -0
  189. package/dist/utils/scheduledTrips.js +2 -0
  190. package/dist/utils/scheduledTrips.js.map +7 -0
  191. package/dist/utils/setGeoJSONData.js +2 -0
  192. package/dist/utils/setGeoJSONData.js.map +7 -0
  193. package/dist/utils/setHighlight.js +2 -0
  194. package/dist/utils/setHighlight.js.map +7 -0
  195. package/dist/utils/setPMTileOpacity.js +2 -0
  196. package/dist/utils/setPMTileOpacity.js.map +7 -0
  197. package/dist/utils/setPMTileZIndex.js +2 -0
  198. package/dist/utils/setPMTileZIndex.js.map +7 -0
  199. package/dist/utils/setParent.js +2 -0
  200. package/dist/utils/setParent.js.map +7 -0
  201. package/dist/utils/setTerrainHeight.js +2 -0
  202. package/dist/utils/setTerrainHeight.js.map +7 -0
  203. package/dist/utils/setVertexColor.js +2 -0
  204. package/dist/utils/setVertexColor.js.map +7 -0
  205. package/dist/utils/showFeature.js +2 -0
  206. package/dist/utils/showFeature.js.map +7 -0
  207. package/dist/utils/sizes.js +2 -0
  208. package/dist/utils/sizes.js.map +7 -0
  209. package/dist/utils/skin.js +2 -0
  210. package/dist/utils/skin.js.map +7 -0
  211. package/dist/utils/solarPosition.js +2 -0
  212. package/dist/utils/solarPosition.js.map +7 -0
  213. package/dist/utils/sortMeshes.js +2 -0
  214. package/dist/utils/sortMeshes.js.map +7 -0
  215. package/dist/utils/speed.js +2 -0
  216. package/dist/utils/speed.js.map +7 -0
  217. package/dist/utils/startZoom.js +2 -0
  218. package/dist/utils/startZoom.js.map +7 -0
  219. package/dist/utils/taillight.js +2 -0
  220. package/dist/utils/taillight.js.map +7 -0
  221. package/dist/utils/terrainAtlas.js +2 -0
  222. package/dist/utils/terrainAtlas.js.map +7 -0
  223. package/dist/utils/terrainElevation.js +2 -0
  224. package/dist/utils/terrainElevation.js.map +7 -0
  225. package/dist/utils/terrainGrid.js +2 -0
  226. package/dist/utils/terrainGrid.js.map +7 -0
  227. package/dist/utils/textureSampler.js +2 -0
  228. package/dist/utils/textureSampler.js.map +7 -0
  229. package/dist/utils/tileId.js +2 -0
  230. package/dist/utils/tileId.js.map +7 -0
  231. package/dist/utils/toLanes.js +2 -0
  232. package/dist/utils/toLanes.js.map +7 -0
  233. package/dist/utils/toSRGB.js +2 -0
  234. package/dist/utils/toSRGB.js.map +7 -0
  235. package/dist/utils/tooltip.js +3 -0
  236. package/dist/utils/tooltip.js.map +7 -0
  237. package/dist/utils/traffic.js +1 -1
  238. package/dist/utils/traffic.js.map +3 -3
  239. package/dist/utils/traverse.js +2 -0
  240. package/dist/utils/traverse.js.map +7 -0
  241. package/dist/utils/treeGeometry.js +2 -0
  242. package/dist/utils/treeGeometry.js.map +7 -0
  243. package/dist/utils/triangulate.js +2 -0
  244. package/dist/utils/triangulate.js.map +7 -0
  245. package/dist/utils/tripsAt.js +2 -0
  246. package/dist/utils/tripsAt.js.map +7 -0
  247. package/dist/utils/types.js +2 -0
  248. package/dist/utils/types.js.map +7 -0
  249. package/dist/utils/underEntry.js +2 -0
  250. package/dist/utils/underEntry.js.map +7 -0
  251. package/dist/utils/update.js +2 -0
  252. package/dist/utils/update.js.map +7 -0
  253. package/dist/utils/updateArea.js +2 -0
  254. package/dist/utils/updateArea.js.map +7 -0
  255. package/dist/utils/updateCamera.js +2 -0
  256. package/dist/utils/updateCamera.js.map +7 -0
  257. package/dist/utils/updatePointLights.js +2 -0
  258. package/dist/utils/updatePointLights.js.map +7 -0
  259. package/dist/utils/updateWorldMatrix.js +2 -0
  260. package/dist/utils/updateWorldMatrix.js.map +7 -0
  261. package/dist/utils/vehicleOffsets.js +2 -0
  262. package/dist/utils/vehicleOffsets.js.map +7 -0
  263. package/dist/utils/vehicles.js +1 -1
  264. package/dist/utils/vehicles.js.map +3 -3
  265. package/dist/utils/vertexNormals.js +2 -0
  266. package/dist/utils/vertexNormals.js.map +7 -0
  267. package/dist/utils/walk.js +1 -1
  268. package/dist/utils/walk.js.map +3 -3
  269. package/dist/utils/white.js +2 -0
  270. package/dist/utils/white.js.map +7 -0
  271. package/dist/utils/worldLights.js +2 -0
  272. package/dist/utils/worldLights.js.map +7 -0
  273. package/dist/utils/wrap.js +2 -0
  274. package/dist/utils/wrap.js.map +7 -0
  275. package/package.json +2 -4
  276. package/src/index.js +365 -50
  277. package/src/utils/CELL.js +4 -0
  278. package/src/utils/addBridges.js +66 -0
  279. package/src/utils/addRasterTile.js +112 -0
  280. package/src/utils/along.js +9 -0
  281. package/src/utils/atmosphere.js +20 -0
  282. package/src/utils/attach.js +255 -0
  283. package/src/utils/bindSunlight.js +12 -0
  284. package/src/utils/box.js +1 -0
  285. package/src/utils/bridgeElevation.js +18 -0
  286. package/src/utils/build.js +20 -0
  287. package/src/utils/cameraControls.js +287 -0
  288. package/src/utils/channel.js +4 -0
  289. package/src/utils/collider.js +62 -0
  290. package/src/utils/colliders.js +2 -0
  291. package/src/utils/computeBounds.js +17 -0
  292. package/src/utils/conformModelToTerrain.js +69 -0
  293. package/src/utils/createMesh.js +31 -0
  294. package/src/utils/createProgram.js +92 -0
  295. package/src/utils/decodeDirectory.js +40 -0
  296. package/src/utils/decodeHeader.js +15 -0
  297. package/src/utils/decodeModel.js +43 -0
  298. package/src/utils/decompress.js +5 -0
  299. package/src/utils/destroyTexture.js +7 -0
  300. package/src/utils/disposeMesh.js +13 -0
  301. package/src/utils/drawGeometry.js +122 -0
  302. package/src/utils/elevationWGSL.js +27 -0
  303. package/src/utils/emptyNode.js +9 -0
  304. package/src/utils/endZoom.js +15 -0
  305. package/src/utils/findFeature.js +49 -0
  306. package/src/utils/geometry.js +0 -254
  307. package/src/utils/getElevation.js +10 -0
  308. package/src/utils/getHeader.js +9 -0
  309. package/src/utils/getZxy.js +76 -0
  310. package/src/utils/glass.js +1 -0
  311. package/src/utils/headlight.js +1 -0
  312. package/src/utils/hit.js +41 -0
  313. package/src/utils/horizontalPosition.js +16 -0
  314. package/src/utils/horizontalRay.js +12 -0
  315. package/src/utils/hull.js +1 -0
  316. package/src/utils/initSunlight.js +9 -0
  317. package/src/utils/initTerrain.js +19 -0
  318. package/src/utils/initTraffic.js +93 -0
  319. package/src/utils/initWalk.js +72 -0
  320. package/src/utils/{picking.js → intersectMeshes.js} +121 -119
  321. package/src/utils/isClockWise.js +12 -0
  322. package/src/utils/lampPostGeometry.js +26 -0
  323. package/src/utils/lightGeometry.js +22 -0
  324. package/src/utils/{lighting.js → lightGrid.js} +50 -51
  325. package/src/utils/limbs.js +9 -0
  326. package/src/{scene/model.js → utils/loadModel.js} +37 -24
  327. package/src/utils/loadSource.js +17 -0
  328. package/src/utils/loadTerrain.js +65 -0
  329. package/src/utils/mapCamera.js +432 -0
  330. package/src/utils/{shaders.js → materialShaders.js} +243 -237
  331. package/src/utils/mirror.js +6 -0
  332. package/src/utils/moonPosition.js +17 -0
  333. package/src/utils/moves.js +11 -0
  334. package/src/utils/nativeEvents.js +77 -0
  335. package/src/utils/nativeGeometry.js +131 -0
  336. package/src/utils/nativeLayer.js +317 -0
  337. package/src/utils/nodeMatrix.js +22 -0
  338. package/src/utils/onAdd3DLayer.js +31 -0
  339. package/src/utils/onAddSun.js +147 -0
  340. package/src/utils/onClick.js +13 -0
  341. package/src/utils/onMapChange.js +16 -0
  342. package/src/utils/onPMTileAdd.js +15 -0
  343. package/src/utils/onPMTileRemove.js +8 -0
  344. package/src/utils/onPointerLeave.js +11 -0
  345. package/src/utils/onPointerMove.js +15 -0
  346. package/src/utils/onRemove3DLayer.js +78 -0
  347. package/src/utils/onRemoveSun.js +3 -0
  348. package/src/utils/onTerrainAdd.js +18 -0
  349. package/src/utils/onTerrainChange.js +13 -0
  350. package/src/utils/onTerrainRemove.js +40 -0
  351. package/src/utils/onZoomAnim.js +14 -0
  352. package/src/utils/paints.js +10 -0
  353. package/src/utils/parseColor.js +42 -0
  354. package/src/utils/parts.js +16 -0
  355. package/src/utils/projectCelestialBody.js +13 -0
  356. package/src/{scene/sources.js → utils/pump.js} +59 -98
  357. package/src/utils/rasterTiles.js +285 -0
  358. package/src/utils/raycast.js +60 -0
  359. package/src/utils/read.js +29 -0
  360. package/src/utils/readAccessor.js +68 -0
  361. package/src/utils/releaseArea.js +34 -0
  362. package/src/utils/removeRasterTile.js +13 -0
  363. package/src/{scene → utils}/render.js +112 -173
  364. package/src/utils/renderSunlight.js +170 -0
  365. package/src/utils/renderers.js +2 -0
  366. package/src/utils/resizeSunlight.js +15 -0
  367. package/src/utils/roofCoverage.js +47 -0
  368. package/src/utils/routeGeometry.js +22 -0
  369. package/src/utils/scheduledTrips.js +29 -0
  370. package/src/utils/setGeoJSONData.js +11 -0
  371. package/src/utils/setHighlight.js +13 -0
  372. package/src/utils/setPMTileOpacity.js +7 -0
  373. package/src/utils/setPMTileZIndex.js +7 -0
  374. package/src/utils/setParent.js +7 -0
  375. package/src/utils/setTerrainHeight.js +10 -0
  376. package/src/utils/setVertexColor.js +14 -0
  377. package/src/utils/showFeature.js +27 -0
  378. package/src/utils/sizes.js +1 -0
  379. package/src/utils/skin.js +2 -0
  380. package/src/utils/solarPosition.js +17 -0
  381. package/src/utils/sortMeshes.js +12 -0
  382. package/src/utils/speed.js +3 -0
  383. package/src/utils/startZoom.js +5 -0
  384. package/src/utils/taillight.js +1 -0
  385. package/src/utils/terrainAtlas.js +21 -0
  386. package/src/utils/terrainElevation.js +20 -0
  387. package/src/utils/terrainGrid.js +23 -0
  388. package/src/utils/textureSampler.js +10 -0
  389. package/src/utils/tileId.js +18 -0
  390. package/src/utils/toLanes.js +7 -0
  391. package/src/utils/toSRGB.js +1 -0
  392. package/src/utils/tooltip.js +6 -0
  393. package/src/utils/traffic.js +310 -85
  394. package/src/utils/traverse.js +6 -0
  395. package/src/utils/treeGeometry.js +45 -0
  396. package/src/utils/triangulate.js +100 -0
  397. package/src/utils/tripsAt.js +16 -0
  398. package/src/utils/types.js +8 -0
  399. package/src/utils/{control.js → underEntry.js} +1 -2
  400. package/src/utils/update.js +18 -0
  401. package/src/utils/updateArea.js +40 -0
  402. package/src/utils/updateCamera.js +32 -0
  403. package/src/utils/updatePointLights.js +38 -0
  404. package/src/utils/updateWorldMatrix.js +47 -0
  405. package/src/utils/vehicleOffsets.js +8 -0
  406. package/src/utils/vehicles.js +65 -69
  407. package/src/utils/vertexNormals.js +30 -0
  408. package/src/utils/walk.js +181 -66
  409. package/src/utils/white.js +1 -0
  410. package/src/utils/worldLights.js +25 -0
  411. package/src/utils/wrap.js +1 -0
  412. package/dist/scene/gpu.js +0 -3
  413. package/dist/scene/gpu.js.map +0 -7
  414. package/dist/scene/lighting.js +0 -9
  415. package/dist/scene/lighting.js.map +0 -7
  416. package/dist/scene/model.js +0 -2
  417. package/dist/scene/model.js.map +0 -7
  418. package/dist/scene/picking.js +0 -2
  419. package/dist/scene/picking.js.map +0 -7
  420. package/dist/scene/pmtiles.js +0 -2
  421. package/dist/scene/pmtiles.js.map +0 -7
  422. package/dist/scene/render.js +0 -15
  423. package/dist/scene/render.js.map +0 -7
  424. package/dist/scene/sources.js +0 -2
  425. package/dist/scene/sources.js.map +0 -7
  426. package/dist/types/3d.js +0 -2
  427. package/dist/types/3d.js.map +0 -7
  428. package/dist/types/geojson.js +0 -2
  429. package/dist/types/geojson.js.map +0 -7
  430. package/dist/types/pmtiles.js +0 -2
  431. package/dist/types/pmtiles.js.map +0 -7
  432. package/dist/types/sunlight.js +0 -2
  433. package/dist/types/sunlight.js.map +0 -7
  434. package/dist/types/terrain.js +0 -24
  435. package/dist/types/terrain.js.map +0 -7
  436. package/dist/types/traffic.js +0 -41
  437. package/dist/types/traffic.js.map +0 -7
  438. package/dist/types/walk.js +0 -2
  439. package/dist/types/walk.js.map +0 -7
  440. package/dist/utils/control.js +0 -2
  441. package/dist/utils/control.js.map +0 -7
  442. package/dist/utils/lighting.js +0 -2
  443. package/dist/utils/lighting.js.map +0 -7
  444. package/dist/utils/model.js +0 -2
  445. package/dist/utils/model.js.map +0 -7
  446. package/dist/utils/picking.js +0 -2
  447. package/dist/utils/picking.js.map +0 -7
  448. package/dist/utils/pmtiles.js +0 -2
  449. package/dist/utils/pmtiles.js.map +0 -7
  450. package/dist/utils/scene.js +0 -2
  451. package/dist/utils/scene.js.map +0 -7
  452. package/dist/utils/shaders.js.map +0 -7
  453. package/dist/utils/sun.js +0 -2
  454. package/dist/utils/sun.js.map +0 -7
  455. package/dist/utils/terrain.js +0 -2
  456. package/dist/utils/terrain.js.map +0 -7
  457. package/src/scene/gpu.js +0 -438
  458. package/src/scene/lighting.js +0 -193
  459. package/src/scene/picking.js +0 -150
  460. package/src/scene/pmtiles.js +0 -94
  461. package/src/types/3d.js +0 -337
  462. package/src/types/geojson.js +0 -42
  463. package/src/types/pmtiles.js +0 -143
  464. package/src/types/sunlight.js +0 -142
  465. package/src/types/terrain.js +0 -331
  466. package/src/types/traffic.js +0 -356
  467. package/src/types/walk.js +0 -219
  468. package/src/utils/model.js +0 -178
  469. package/src/utils/pmtiles.js +0 -79
  470. package/src/utils/scene.js +0 -102
  471. package/src/utils/sun.js +0 -71
  472. package/src/utils/terrain.js +0 -78
@@ -1,119 +1,121 @@
1
- import { computeBounds } from './geometry.js';
2
-
3
- /** Nearest triangle hit per mesh, sorted by world-space distance. */
4
- export function intersectMeshes(ray, meshes, night = 0) {
5
- const hits = [],
6
- a = [0, 0, 0],
7
- b = [0, 0, 0],
8
- c = [0, 0, 0],
9
- sub = (a, b) => a.map((v, i) => v - b[i]),
10
- cross = (a, b) => [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]],
11
- dot = (a, b) => a.reduce((sum, v, i) => sum + v * b[i], 0);
12
- for (const mesh of meshes) {
13
- // Test in mesh-local space; compare distances only after returning to shared world space.
14
- const inverse = new DOMMatrix(mesh.worldMatrix).inverse();
15
- const inverseValues = inverse.toFloat64Array();
16
- if (![...inverseValues].every(Number.isFinite)) {
17
- throw new Error('Singular 3D transform');
18
- }
19
- const localOrigin = new DOMPoint(...ray.origin, 1).matrixTransform(inverse);
20
- const origin = [
21
- localOrigin.x / localOrigin.w,
22
- localOrigin.y / localOrigin.w,
23
- localOrigin.z / localOrigin.w
24
- ];
25
- const localDirection = new DOMPoint(...ray.direction, 0).matrixTransform(inverse);
26
- const direction = [
27
- localDirection.x,
28
- localDirection.y,
29
- localDirection.z
30
- ];
31
- const directionLength = Math.hypot(...direction) || 1;
32
- direction[0] /= directionLength; direction[1] /= directionLength; direction[2] /= directionLength;
33
- // AABB slab test reuses the same local ray as the triangle test.
34
- if (!mesh.geometry.bounds) {
35
- computeBounds(mesh.geometry);
36
- }
37
- let near = 0, far = Infinity;
38
- for (let i = 0; i < 3; i++) {
39
- if (Math.abs(direction[i]) < 1e-12) {
40
- if (origin[i] < mesh.geometry.bounds.min[i] || origin[i] > mesh.geometry.bounds.max[i]) {
41
- far = -Infinity;
42
- break;
43
- }
44
- } else {
45
- const a = (mesh.geometry.bounds.min[i] - origin[i]) / direction[i],
46
- b = (mesh.geometry.bounds.max[i] - origin[i]) / direction[i];
47
- near = Math.max(near, Math.min(a, b));
48
- far = Math.min(far, Math.max(a, b));
49
- }
50
- }
51
- if (far < near) {
52
- continue;
53
- }
54
- const { position, index } = mesh.geometry.attributes;
55
- let closest = Infinity, faceIndex;
56
- for (let i = 0; i < (index?.count || position.count); i += 3) {
57
- const ai = (index ? index.data[i] : i) * position.size;
58
- const bi = (index ? index.data[i + 1] : i + 1) * position.size;
59
- const ci = (index ? index.data[i + 2] : i + 2) * position.size;
60
- a[0] = position.data[ai];
61
- a[1] = position.data[ai + 1];
62
- a[2] = position.data[ai + 2];
63
- b[0] = position.data[bi];
64
- b[1] = position.data[bi + 1];
65
- b[2] = position.data[bi + 2];
66
- c[0] = position.data[ci];
67
- c[1] = position.data[ci + 1];
68
- c[2] = position.data[ci + 2];
69
- // Moller-Trumbore: barycentric triangle coordinates and local ray distance.
70
- const e = sub(b, a),
71
- f = sub(c, a),
72
- p = cross(direction, f),
73
- det = dot(e, p);
74
- if (mesh.program.cullFace !== null ? det < 1e-9 : Math.abs(det) < 1e-9) {
75
- continue;
76
- }
77
- const t = sub(origin, a),
78
- u = dot(t, p) / det;
79
- if (u < 0 || u > 1) {
80
- continue;
81
- }
82
- const q = cross(t, e),
83
- v = dot(direction, q) / det;
84
- if (v < 0 || u + v > 1) {
85
- continue;
86
- }
87
- if (mesh.program.nightLight) {
88
- const uv = mesh.geometry.attributes.uv.data;
89
- const ids = index ? [index.data[i], index.data[i + 1], index.data[i + 2]] : [i, i + 1, i + 2];
90
- const x = uv[ids[0] * 2] * (1 - u - v) + uv[ids[1] * 2] * u + uv[ids[2] * 2] * v;
91
- const y = uv[ids[0] * 2 + 1] * (1 - u - v) + uv[ids[1] * 2 + 1] * u + uv[ids[2] * 2 + 1] * v;
92
- if (x <= 2 && (!night || x * x + y * y > 0.9)) continue;
93
- }
94
- const distance = dot(f, q) / det;
95
- if (distance > 0 && distance < closest) {
96
- closest = distance; faceIndex = i / 3;
97
- }
98
- }
99
- if (faceIndex === undefined) continue;
100
- const point = new DOMPoint(
101
- direction[0] * closest + origin[0],
102
- direction[1] * closest + origin[1],
103
- direction[2] * closest + origin[2],
104
- 1
105
- ).matrixTransform(new DOMMatrix(mesh.worldMatrix));
106
- const worldPoint = [point.x / point.w, point.y / point.w, point.z / point.w];
107
- hits.push({
108
- faceIndex,
109
- object: mesh,
110
- point: worldPoint,
111
- distance: Math.hypot(
112
- worldPoint[0] - ray.origin[0],
113
- worldPoint[1] - ray.origin[1],
114
- worldPoint[2] - ray.origin[2]
115
- )
116
- });
117
- }
118
- return hits.sort((a, b) => a.distance - b.distance);
119
- }
1
+ import { computeBounds } from "./computeBounds.js";
2
+
3
+ const sub = (a, b) => a.map((v, i) => v - b[i]);
4
+ const cross = (a, b) => [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];
5
+ const dot = (a, b) => a.reduce((sum, v, i) => sum + v * b[i], 0);
6
+
7
+ /** Nearest triangle hit per mesh, sorted by world-space distance. */
8
+
9
+ export function intersectMeshes(ray, meshes, night = 0) {
10
+ const hits = [],
11
+ a = [0, 0, 0],
12
+ b = [0, 0, 0],
13
+ c = [0, 0, 0];
14
+ for (const mesh of meshes) {
15
+ // Test in mesh-local space; compare distances only after returning to shared world space.
16
+ const inverse = new DOMMatrix(mesh.worldMatrix).inverse();
17
+ const inverseValues = inverse.toFloat64Array();
18
+ if (![...inverseValues].every(Number.isFinite)) {
19
+ throw new Error('Singular 3D transform');
20
+ }
21
+ const localOrigin = new DOMPoint(...ray.origin, 1).matrixTransform(inverse);
22
+ const origin = [
23
+ localOrigin.x / localOrigin.w,
24
+ localOrigin.y / localOrigin.w,
25
+ localOrigin.z / localOrigin.w
26
+ ];
27
+ const localDirection = new DOMPoint(...ray.direction, 0).matrixTransform(inverse);
28
+ const direction = [
29
+ localDirection.x,
30
+ localDirection.y,
31
+ localDirection.z
32
+ ];
33
+ const directionLength = Math.hypot(...direction) || 1;
34
+ direction[0] /= directionLength;
35
+ direction[1] /= directionLength;
36
+ direction[2] /= directionLength;
37
+ // AABB slab test reuses the same local ray as the triangle test.
38
+ if (!mesh.geometry.bounds) {
39
+ computeBounds(mesh.geometry);
40
+ }
41
+ let near = 0, far = Infinity;
42
+ for (let i = 0; i < 3; i++) {
43
+ if (Math.abs(direction[i]) < 1e-12) {
44
+ if (origin[i] < mesh.geometry.bounds.min[i] || origin[i] > mesh.geometry.bounds.max[i]) {
45
+ far = -Infinity;
46
+ break;
47
+ }
48
+ } else {
49
+ const a = (mesh.geometry.bounds.min[i] - origin[i]) / direction[i], b = (mesh.geometry.bounds.max[i] - origin[i]) / direction[i];
50
+ near = Math.max(near, Math.min(a, b));
51
+ far = Math.min(far, Math.max(a, b));
52
+ }
53
+ }
54
+ if (far < near) {
55
+ continue;
56
+ }
57
+ const { position, index } = mesh.geometry.attributes;
58
+ let closest = Infinity, faceIndex;
59
+ for (let i = 0; i < (index?.count || position.count); i += 3) {
60
+ const ai = (index ? index.data[i] : i) * position.size;
61
+ const bi = (index ? index.data[i + 1] : i + 1) * position.size;
62
+ const ci = (index ? index.data[i + 2] : i + 2) * position.size;
63
+ a[0] = position.data[ai];
64
+ a[1] = position.data[ai + 1];
65
+ a[2] = position.data[ai + 2];
66
+ b[0] = position.data[bi];
67
+ b[1] = position.data[bi + 1];
68
+ b[2] = position.data[bi + 2];
69
+ c[0] = position.data[ci];
70
+ c[1] = position.data[ci + 1];
71
+ c[2] = position.data[ci + 2];
72
+ // Moller-Trumbore: barycentric triangle coordinates and local ray distance.
73
+ const e = sub(b, a),
74
+ f = sub(c, a),
75
+ p = cross(direction, f),
76
+ det = dot(e, p);
77
+ if (mesh.program.cullMode === 'none' || mesh.program.cullFace === null
78
+ ? Math.abs(det) < 1e-9 : det < 1e-9) {
79
+ continue;
80
+ }
81
+ const t = sub(origin, a), u = dot(t, p) / det;
82
+ if (u < 0 || u > 1) {
83
+ continue;
84
+ }
85
+ const q = cross(t, e), v = dot(direction, q) / det;
86
+ if (v < 0 || u + v > 1) {
87
+ continue;
88
+ }
89
+ if (mesh.program.nightLight) {
90
+ const uv = mesh.geometry.attributes.uv.data;
91
+ const ids = index ? [index.data[i], index.data[i + 1], index.data[i + 2]] : [i, i + 1, i + 2];
92
+ const x = uv[ids[0] * 2] * (1 - u - v) + uv[ids[1] * 2] * u + uv[ids[2] * 2] * v;
93
+ const y = uv[ids[0] * 2 + 1] * (1 - u - v) + uv[ids[1] * 2 + 1] * u + uv[ids[2] * 2 + 1] * v;
94
+ if (x <= 2 && (!night || x * x + y * y > 0.9)) continue;
95
+ }
96
+ const distance = dot(f, q) / det;
97
+ if (distance > 0 && distance < closest) {
98
+ closest = distance; faceIndex = i / 3;
99
+ }
100
+ }
101
+ if (faceIndex === undefined) continue;
102
+ const point = new DOMPoint(
103
+ direction[0] * closest + origin[0],
104
+ direction[1] * closest + origin[1],
105
+ direction[2] * closest + origin[2],
106
+ 1
107
+ ).matrixTransform(new DOMMatrix(mesh.worldMatrix));
108
+ const worldPoint = [point.x / point.w, point.y / point.w, point.z / point.w];
109
+ hits.push({
110
+ faceIndex,
111
+ object: mesh,
112
+ point: worldPoint,
113
+ distance: Math.hypot(
114
+ worldPoint[0] - ray.origin[0],
115
+ worldPoint[1] - ray.origin[1],
116
+ worldPoint[2] - ray.origin[2]
117
+ )
118
+ });
119
+ }
120
+ return hits.sort((a, b) => a.distance - b.distance);
121
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @returns {boolean} Whether the `{x, y}` points are in clockwise order.
3
+ */
4
+
5
+ export function isClockWise(points) {
6
+ let area = 0;
7
+ for (let i = 0; i < points.length; i++) {
8
+ const a = points[i], b = points[(i + 1) % points.length];
9
+ area += a.x * b.y - b.x * a.y;
10
+ }
11
+ return area < 0;
12
+ }
@@ -0,0 +1,26 @@
1
+ import { parseColor } from "./parseColor.js";
2
+
3
+ /** Schematic support and lamp head; wall-mounted fixtures do not get an invented pole. */
4
+
5
+ export function lampPostGeometry(point, style, addTriangle) {
6
+ const color = parseColor(0x50565a), radius = style.poleRadius;
7
+ if (!Number.isFinite(radius) || radius <= 0) {
8
+ throw new Error('Invalid lamp pole radius');
9
+ }
10
+ const ring = r => Array.from({ length: 6 }, (_, i) => ({
11
+ x: point.x + Math.cos(i * Math.PI / 3) * r,
12
+ y: point.y + Math.sin(i * Math.PI / 3) * r, ground: point.ground, uv: [3, 3],
13
+ }));
14
+ const center = { ...point, uv: [3, 3] };
15
+ for (const [r, low, high] of [[radius, 0, style.top], [radius * 2.5, style.top - 0.25, style.top + 0.15]]) {
16
+ const points = ring(r);
17
+ for (let i = 0; i < 6; i++) {
18
+ const a = points[i], b = points[(i + 1) % 6], angle = (i + 0.5) * Math.PI / 3;
19
+ const nx = Math.cos(angle), nz = -Math.sin(angle);
20
+ addTriangle(a, low, b, low, b, high, nx, 0, nz, color);
21
+ addTriangle(a, low, b, high, a, high, nx, 0, nz, color);
22
+ addTriangle(center, high, a, high, b, high, 0, 1, 0, color);
23
+ addTriangle(center, low, b, low, a, low, 0, -1, 0, color);
24
+ }
25
+ }
26
+ }
@@ -0,0 +1,22 @@
1
+ import { parseColor } from "./parseColor.js";
2
+
3
+ /** Three crossed emitter discs; illumination itself is evaluated on receiving surfaces. */
4
+
5
+ export function lightGeometry(point, style, addTriangle) {
6
+ if (!Number.isFinite(style.lightRadius) || style.lightRadius <= 0) throw new Error('Invalid light radius');
7
+ const color = parseColor(style.color);
8
+ const quad = (a, b, c, d, height, normal) => {
9
+ addTriangle(a, height, b, height, c, height, ...normal, color);
10
+ addTriangle(a, height, c, height, d, height, ...normal, color);
11
+ };
12
+ const r = 0.65;
13
+ const emitter = (u, v, axis) => ({
14
+ x: point.x + (axis === 2 ? 0 : u * r),
15
+ y: point.y + (axis === 1 ? 0 : axis === 2 ? u * r : v * r),
16
+ ground: point.ground + (axis === 0 ? 0 : v * r), uv: [u, v],
17
+ });
18
+ for (let axis = 0; axis < 3; axis++) {
19
+ quad(emitter(-1, -1, axis), emitter(1, -1, axis), emitter(1, 1, axis), emitter(-1, 1, axis),
20
+ style.top, axis === 0 ? [0, 1, 0] : axis === 1 ? [0, 0, 1] : [1, 0, 0]);
21
+ }
22
+ }
@@ -1,51 +1,50 @@
1
- /** Pack world-space point lights into the shader's spatial grid. */
2
- export function lightGrid(packed, maxBytes) {
3
- const count = packed.reduce((sum, values) => sum + values.length / 8, 0), cellSize = 32;
4
- let data = new Float32Array(8);
5
- if (count) {
6
- let minX = Infinity, minZ = Infinity, maxX = -Infinity, maxZ = -Infinity;
7
- for (const values of packed) for (let i = 0; i < values.length; i += 8) {
8
- minX = Math.min(minX, values[i] - values[i + 3]); maxX = Math.max(maxX, values[i] + values[i + 3]);
9
- minZ = Math.min(minZ, values[i + 2] - values[i + 3]); maxZ = Math.max(maxZ, values[i + 2] + values[i + 3]);
10
- }
11
- const columns = Math.ceil((maxX - minX) / cellSize) + 1, rows = Math.ceil((maxZ - minZ) / cellSize) + 1;
12
- const each = callback => {
13
- for (const values of packed) for (let i = 0; i < values.length; i += 8) {
14
- const radius = values[i + 3], x = values[i] - minX, z = values[i + 2] - minZ;
15
- for (let y = Math.floor((z - radius) / cellSize); y <= Math.floor((z + radius) / cellSize); y++) {
16
- for (let c = Math.floor((x - radius) / cellSize); c <= Math.floor((x + radius) / cellSize); c++) callback(y * columns + c, values, i);
17
- }
18
- }
19
- };
20
- // Counting sort: count the lights of each cell, then fill each cell's slice.
21
- const counts = new Uint32Array(columns * rows), next = new Uint32Array(columns * rows);
22
- each(key => counts[key]++);
23
- const entries = counts.reduce((sum, value) => sum + value, 0);
24
- const length = (2 + columns * rows + entries * 2) * 4;
25
- if (length * 4 > maxBytes) throw new Error('Streetlight grid exceeds GPU storage limit');
26
- data = new Float32Array(length);
27
- data.set([minX, minZ, cellSize, columns, rows, count, 0, 0]);
28
- let offset = 2 + columns * rows;
29
- for (let key = 0; key < counts.length; key++) if (counts[key]) {
30
- data[(2 + key) * 4] = next[key] = offset;
31
- data[(2 + key) * 4 + 1] = counts[key];
32
- offset += counts[key] * 2;
33
- }
34
- each((key, values, i) => {
35
- for (let j = 0, o = next[key] * 4; j < 8; j++) data[o + j] = values[i + j];
36
- next[key] += 2;
37
- });
38
- }
39
- return { data, count };
40
- }
41
-
42
- /** World-space [x, y, z, radius, r, g, b, intensity] for one mesh's point lights. */
43
- export function worldLights(lights, m) {
44
- const values = new Float32Array(lights.length * 8);
45
- lights.forEach(({ position: [x, y, z], radius, color, flux }, i) => {
46
- const w = m[3] * x + m[7] * y + m[11] * z + m[15];
47
- values.set([(m[0] * x + m[4] * y + m[8] * z + m[12]) / w, (m[1] * x + m[5] * y + m[9] * z + m[13]) / w,
48
- (m[2] * x + m[6] * y + m[10] * z + m[14]) / w, radius, ...color, flux / (4 * Math.PI) * 0.03], i * 8);
49
- });
50
- return values;
51
- }
1
+ /** Pack world-space point lights into the shader's spatial grid. */
2
+ export function lightGrid(packed, maxBytes) {
3
+ const count = packed.reduce((sum, values) => sum + values.length / 8, 0), cellSize = 32;
4
+ let data = new Float32Array(8);
5
+ if (count) {
6
+ let minX = Infinity, minZ = Infinity, maxX = -Infinity, maxZ = -Infinity;
7
+ for (const values of packed) for (let i = 0; i < values.length; i += 8) {
8
+ minX = Math.min(minX, values[i] - values[i + 3]);
9
+ maxX = Math.max(maxX, values[i] + values[i + 3]);
10
+ minZ = Math.min(minZ, values[i + 2] - values[i + 3]);
11
+ maxZ = Math.max(maxZ, values[i + 2] + values[i + 3]);
12
+ }
13
+ const columns = Math.ceil((maxX - minX) / cellSize) + 1,
14
+ rows = Math.ceil((maxZ - minZ) / cellSize) + 1;
15
+ const each = callback => {
16
+ for (const values of packed) for (let i = 0; i < values.length; i += 8) {
17
+ const radius = values[i + 3],
18
+ x = values[i] - minX,
19
+ z = values[i + 2] - minZ;
20
+ for (let y = Math.floor((z - radius) / cellSize); y <= Math.floor((z + radius) / cellSize); y++) {
21
+ for (let c = Math.floor((x - radius) / cellSize); c <= Math.floor((x + radius) / cellSize); c++) {
22
+ callback(y * columns + c, values, i);
23
+ }
24
+ }
25
+ }
26
+ };
27
+ // Counting sort: count the lights of each cell, then fill each cell's slice.
28
+ const counts = new Uint32Array(columns * rows),
29
+ next = new Uint32Array(columns * rows);
30
+ each(key => counts[key]++);
31
+ const entries = counts.reduce((sum, value) => sum + value, 0);
32
+ const length = (2 + columns * rows + entries * 2) * 4;
33
+ if (length * 4 > maxBytes) {
34
+ throw new Error('Streetlight grid exceeds GPU storage limit');
35
+ }
36
+ data = new Float32Array(length);
37
+ data.set([minX, minZ, cellSize, columns, rows, count, 0, 0]);
38
+ let offset = 2 + columns * rows;
39
+ for (let key = 0; key < counts.length; key++) if (counts[key]) {
40
+ data[(2 + key) * 4] = next[key] = offset;
41
+ data[(2 + key) * 4 + 1] = counts[key];
42
+ offset += counts[key] * 2;
43
+ }
44
+ each((key, values, i) => {
45
+ for (let j = 0, o = next[key] * 4; j < 8; j++) data[o + j] = values[i + j];
46
+ next[key] += 2;
47
+ });
48
+ }
49
+ return { data, count };
50
+ }
@@ -0,0 +1,9 @@
1
+ // [part, pivot x, pivot y, swing sign]
2
+
3
+ export const limbs = [
4
+ ['body', 0, 0, 0],
5
+ ['leg', -0.09, 0.9, 1],
6
+ ['leg', 0.09, 0.9, -1],
7
+ ['arm', -0.25, 1.42, -1],
8
+ ['arm', 0.25, 1.42, 1]
9
+ ];
@@ -1,11 +1,19 @@
1
- import { decodeModel, readAccessor, nodeMatrix, vertexNormals, textureSampler } from '../utils/model.js';
2
- import { emptyNode, setParent } from '../utils/scene.js';
1
+ import { decodeModel } from './decodeModel.js';
2
+ import { emptyNode } from './emptyNode.js';
3
+ import { nodeMatrix } from './nodeMatrix.js';
4
+ import { readAccessor } from './readAccessor.js';
5
+ import { setParent } from './setParent.js';
6
+ import { textureSampler } from './textureSampler.js';
7
+ import { vertexNormals } from './vertexNormals.js';
8
+ import { createProgram } from './createProgram.js';
9
+ import { conformModelToTerrain } from './conformModelToTerrain.js';
3
10
 
4
11
  /** glTF/GLB model loading. */
5
12
  /** Load the configured GLB/glTF (static triangles) under `root`; GPU resources need attachment. */
13
+
6
14
  export async function loadModel(backend) {
7
15
  await backend._added.promise;
8
- const url = new URL(backend.modelUrl, document.baseURI).href;
16
+ const url = new URL(backend.modelUrl, document.baseURI).href;
9
17
  const response = await fetch(url);
10
18
  if (!response.ok) {
11
19
  throw new Error(`Unable to load model: HTTP ${response.status}`);
@@ -13,7 +21,7 @@ export async function loadModel(backend) {
13
21
  const data = await response.arrayBuffer();
14
22
  const description = decodeModel(data);
15
23
  const directory = new URL('.', url).href;
16
- await Promise.all((description.buffers || []).map(async buffer => {
24
+ await Promise.all((description.buffers || []).map(async (buffer) => {
17
25
  if (buffer.binary) {
18
26
  return;
19
27
  }
@@ -24,7 +32,7 @@ export async function loadModel(backend) {
24
32
  buffer.binary = await response.arrayBuffer();
25
33
  }));
26
34
  await backend._added.promise;
27
- const images = await Promise.all((description.images || []).map(async image => {
35
+ const images = await Promise.all((description.images || []).map(async (image) => {
28
36
  let blob;
29
37
  if (image.bufferView !== undefined) {
30
38
  const view = description.bufferViews[image.bufferView];
@@ -39,6 +47,7 @@ export async function loadModel(backend) {
39
47
  // Preserve straight alpha and raw samples; GPU sRGB formats do color decoding.
40
48
  return createImageBitmap(blob, { premultiplyAlpha: 'none', colorSpaceConversion: 'none' });
41
49
  }));
50
+ await backend._map?._terrain3D?._terrainPromise;
42
51
  const textures = new Map();
43
52
  const textureFor = (reference, color = false) => {
44
53
  if (!reference) return null;
@@ -66,7 +75,7 @@ export async function loadModel(backend) {
66
75
  format,
67
76
  srgb: color,
68
77
  image,
69
- flipY: false,
78
+ flipY: false,
70
79
  uploaded: null,
71
80
  });
72
81
  }
@@ -76,19 +85,19 @@ export async function loadModel(backend) {
76
85
  const materials = (description.materials || []).map(material => {
77
86
  const pbr = material.pbrMetallicRoughness || {};
78
87
  return {
79
- color: (pbr.baseColorFactor || [1, 1, 1, 1]).slice(0, 3),
80
- opacity: pbr.baseColorFactor?.[3] ?? 1,
81
- metallic: pbr.metallicFactor ?? 1,
82
- roughness: pbr.roughnessFactor ?? 1,
83
- baseTexture: textureFor(pbr.baseColorTexture, true),
84
- metalTexture: textureFor(pbr.metallicRoughnessTexture),
85
- emissiveTexture: textureFor(material.emissiveTexture, true),
86
- occlusionTexture: textureFor(material.occlusionTexture),
87
- emissive: material.emissiveFactor || [0, 0, 0],
88
+ color: (pbr.baseColorFactor || [1, 1, 1, 1]).slice(0, 3),
89
+ opacity: pbr.baseColorFactor?.[3] ?? 1,
90
+ metallic: pbr.metallicFactor ?? 1,
91
+ roughness: pbr.roughnessFactor ?? 1,
92
+ baseTexture: textureFor(pbr.baseColorTexture, true),
93
+ metalTexture: textureFor(pbr.metallicRoughnessTexture),
94
+ emissiveTexture: textureFor(material.emissiveTexture, true),
95
+ occlusionTexture: textureFor(material.occlusionTexture),
96
+ emissive: material.emissiveFactor || [0, 0, 0],
88
97
  occlusionStrength: material.occlusionTexture?.strength ?? 1,
89
- alphaMode: material.alphaMode || 'OPAQUE',
90
- alphaCutoff: material.alphaCutoff ?? 0.5,
91
- doubleSided: material.doubleSided,
98
+ alphaMode: backend.options.alphaMode || material.alphaMode || 'OPAQUE',
99
+ alphaCutoff: material.alphaCutoff ?? 0.5,
100
+ doubleSided: material.doubleSided,
92
101
  };
93
102
  });
94
103
  let nodes;
@@ -102,7 +111,7 @@ export async function loadModel(backend) {
102
111
  active.add(index);
103
112
  const group = {
104
113
  ...emptyNode(),
105
- name: spec.name
114
+ name: spec.name
106
115
  };
107
116
  group.matrix = nodeMatrix(spec);
108
117
  if (spec.mesh !== undefined) {
@@ -130,7 +139,7 @@ export async function loadModel(backend) {
130
139
  if ([style.baseTexture, style.metalTexture, style.emissiveTexture, style.occlusionTexture].some(Boolean) && !attributes.uv) {
131
140
  throw new Error('Textured model mesh requires UV coordinates');
132
141
  }
133
- const program = backend._createProgram(style);
142
+ const program = createProgram(backend, style);
134
143
  resources.push(program);
135
144
  const device = backend.renderer.device;
136
145
  if (attributes.index?.data instanceof Uint8Array) {
@@ -159,7 +168,8 @@ export async function loadModel(backend) {
159
168
  device,
160
169
  geometry,
161
170
  program,
162
- id: L.Layer.types['3d']._nextId++,
171
+ fadeDuration: 250,
172
+ id: L.Layer._nextId++,
163
173
  renderOrder: 0
164
174
  };
165
175
  mesh.name = description.meshes[spec.mesh].name; mesh.extras = spec.extras || {};
@@ -179,15 +189,17 @@ export async function loadModel(backend) {
179
189
  for (const resource of resources) {
180
190
  if (resource.attributes) {
181
191
  for (const attribute of Object.values(resource.attributes)) attribute.buffer.destroy();
182
- } else backend._removeProgram(resource);
192
+ } else {
193
+ resource.pipelineCache.clear();
194
+ }
183
195
  }
184
196
  throw error;
185
197
  }
186
198
  }
187
199
  const model = {
188
200
  ...emptyNode(),
189
- id: url,
190
- extras: description.extras || {},
201
+ id: url,
202
+ extras: description.extras || {},
191
203
  };
192
204
  if (!nodes.length) throw new Error('Expected a glTF model with a non-empty scene');
193
205
  for (const node of nodes) setParent(node, model);
@@ -201,4 +213,5 @@ export async function loadModel(backend) {
201
213
  backend.model.scale[0] = x; backend.model.scale[1] = y; backend.model.scale[2] = z;
202
214
  }
203
215
  setParent(backend.model, backend.root);
216
+ conformModelToTerrain(backend, backend._map?._terrain3D);
204
217
  }
@@ -0,0 +1,17 @@
1
+ import { getZxy } from './getZxy.js';
2
+
3
+ export async function loadSource(backend, area) {
4
+ if (backend._geojson) {
5
+ const { data, url } = backend.options;
6
+ if (data !== undefined && url) throw new Error('GeoJSON source requires either data or url');
7
+ if (data !== undefined) return data;
8
+ if (!url) throw new Error('GeoJSON source requires either data or url');
9
+ const response = await fetch(new URL(url, document.baseURI), { signal: area.request.signal });
10
+ if (!response.ok) throw new Error(`Unable to load GeoJSON: HTTP ${response.status}`);
11
+ return response.json();
12
+ }
13
+ const result = await getZxy(backend, area.coords.z, area.coords.x, area.coords.y, area.request.signal);
14
+ return result
15
+ ? JSON.parse(new TextDecoder().decode(result.data))
16
+ : { type: 'FeatureCollection', features: [] };
17
+ }