@loaders.gl/tiles 4.5.3 → 5.0.0-alpha.10

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 (295) hide show
  1. package/LICENSE +14 -3
  2. package/README.md +136 -1
  3. package/dist/dist.dev.js +22570 -4947
  4. package/dist/dist.min.js +3 -1
  5. package/dist/image-set.d.ts +94 -0
  6. package/dist/image-set.d.ts.map +1 -0
  7. package/dist/image-set.js +243 -0
  8. package/dist/image-set.js.map +1 -0
  9. package/dist/index.cjs +10171 -2117
  10. package/dist/index.cjs.map +3 -4
  11. package/dist/index.d.ts +50 -9
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +28 -8
  14. package/dist/index.js.map +1 -1
  15. package/dist/point-cloud/point-cloud-tile.d.ts +47 -0
  16. package/dist/point-cloud/point-cloud-tile.d.ts.map +1 -0
  17. package/dist/point-cloud/point-cloud-tile.js +70 -0
  18. package/dist/point-cloud/point-cloud-tile.js.map +1 -0
  19. package/dist/point-cloud/point-cloud-tileset.d.ts +135 -0
  20. package/dist/point-cloud/point-cloud-tileset.d.ts.map +1 -0
  21. package/dist/point-cloud/point-cloud-tileset.js +549 -0
  22. package/dist/point-cloud/point-cloud-tileset.js.map +1 -0
  23. package/dist/point-cloud/types.d.ts +81 -0
  24. package/dist/point-cloud/types.d.ts.map +1 -0
  25. package/dist/point-cloud/types.js +5 -0
  26. package/dist/point-cloud/types.js.map +1 -0
  27. package/dist/raster-set.d.ts +124 -0
  28. package/dist/raster-set.d.ts.map +1 -0
  29. package/dist/raster-set.js +348 -0
  30. package/dist/raster-set.js.map +1 -0
  31. package/dist/spatial/format-spatial-reference.d.ts +68 -0
  32. package/dist/spatial/format-spatial-reference.d.ts.map +1 -0
  33. package/dist/spatial/format-spatial-reference.js +291 -0
  34. package/dist/spatial/format-spatial-reference.js.map +1 -0
  35. package/dist/spatial/get-spatial-coordinate-frame.d.ts +20 -0
  36. package/dist/spatial/get-spatial-coordinate-frame.d.ts.map +1 -0
  37. package/dist/spatial/get-spatial-coordinate-frame.js +139 -0
  38. package/dist/spatial/get-spatial-coordinate-frame.js.map +1 -0
  39. package/dist/spatial/i3s-elevation.d.ts +20 -0
  40. package/dist/spatial/i3s-elevation.d.ts.map +1 -0
  41. package/dist/spatial/i3s-elevation.js +90 -0
  42. package/dist/spatial/i3s-elevation.js.map +1 -0
  43. package/dist/spatial/i3s-spatial-transformer.d.ts +189 -0
  44. package/dist/spatial/i3s-spatial-transformer.d.ts.map +1 -0
  45. package/dist/spatial/i3s-spatial-transformer.js +686 -0
  46. package/dist/spatial/i3s-spatial-transformer.js.map +1 -0
  47. package/dist/spatial/normalize-crs-identifier.d.ts +15 -0
  48. package/dist/spatial/normalize-crs-identifier.d.ts.map +1 -0
  49. package/dist/spatial/normalize-crs-identifier.js +22 -0
  50. package/dist/spatial/normalize-crs-identifier.js.map +1 -0
  51. package/dist/spatial/spatial-coordinate-transformer.d.ts +52 -0
  52. package/dist/spatial/spatial-coordinate-transformer.d.ts.map +1 -0
  53. package/dist/spatial/spatial-coordinate-transformer.js +295 -0
  54. package/dist/spatial/spatial-coordinate-transformer.js.map +1 -0
  55. package/dist/spatial/spatial-resource-registry.d.ts +44 -0
  56. package/dist/spatial/spatial-resource-registry.d.ts.map +1 -0
  57. package/dist/spatial/spatial-resource-registry.js +67 -0
  58. package/dist/spatial/spatial-resource-registry.js.map +1 -0
  59. package/dist/spatial/spatial-types.d.ts +190 -0
  60. package/dist/spatial/spatial-types.d.ts.map +1 -0
  61. package/dist/spatial/spatial-types.js +192 -0
  62. package/dist/spatial/spatial-types.js.map +1 -0
  63. package/dist/spatial/tiles-3d-spatial-transformer.d.ts +32 -0
  64. package/dist/spatial/tiles-3d-spatial-transformer.d.ts.map +1 -0
  65. package/dist/spatial/tiles-3d-spatial-transformer.js +175 -0
  66. package/dist/spatial/tiles-3d-spatial-transformer.js.map +1 -0
  67. package/dist/tileset-2d/adapter.d.ts +37 -0
  68. package/dist/tileset-2d/adapter.d.ts.map +1 -0
  69. package/dist/tileset-2d/adapter.js +5 -0
  70. package/dist/tileset-2d/adapter.js.map +1 -0
  71. package/dist/tileset-2d/index.d.ts +7 -0
  72. package/dist/tileset-2d/index.d.ts.map +1 -0
  73. package/dist/tileset-2d/index.js +6 -0
  74. package/dist/tileset-2d/index.js.map +1 -0
  75. package/dist/tileset-2d/tile-2d-header.d.ts +68 -0
  76. package/dist/tileset-2d/tile-2d-header.d.ts.map +1 -0
  77. package/dist/tileset-2d/tile-2d-header.js +181 -0
  78. package/dist/tileset-2d/tile-2d-header.js.map +1 -0
  79. package/dist/tileset-2d/tileset-2d.d.ts +200 -0
  80. package/dist/tileset-2d/tileset-2d.d.ts.map +1 -0
  81. package/dist/tileset-2d/tileset-2d.js +532 -0
  82. package/dist/tileset-2d/tileset-2d.js.map +1 -0
  83. package/dist/tileset-2d/types.d.ts +44 -0
  84. package/dist/tileset-2d/types.d.ts.map +1 -0
  85. package/dist/tileset-2d/types.js +5 -0
  86. package/dist/tileset-2d/types.js.map +1 -0
  87. package/dist/tileset-2d.d.ts +2 -0
  88. package/dist/tileset-2d.d.ts.map +1 -0
  89. package/dist/tileset-2d.js +5 -0
  90. package/dist/tileset-2d.js.map +1 -0
  91. package/dist/tileset-3d/common/indexed-archive-tileset-source.d.ts +60 -0
  92. package/dist/tileset-3d/common/indexed-archive-tileset-source.d.ts.map +1 -0
  93. package/dist/tileset-3d/common/indexed-archive-tileset-source.js +130 -0
  94. package/dist/tileset-3d/common/indexed-archive-tileset-source.js.map +1 -0
  95. package/dist/tileset-3d/common/tile-3d-contracts.d.ts +63 -0
  96. package/dist/tileset-3d/common/tile-3d-contracts.d.ts.map +1 -0
  97. package/dist/tileset-3d/common/tile-3d-contracts.js +51 -0
  98. package/dist/tileset-3d/common/tile-3d-contracts.js.map +1 -0
  99. package/dist/tileset-3d/common/tile-3d.d.ts +410 -0
  100. package/dist/tileset-3d/common/tile-3d.d.ts.map +1 -0
  101. package/dist/tileset-3d/common/tile-3d.js +1056 -0
  102. package/dist/tileset-3d/common/tile-3d.js.map +1 -0
  103. package/dist/tileset-3d/common/tileset-3d.d.ts +360 -0
  104. package/dist/tileset-3d/common/tileset-3d.d.ts.map +1 -0
  105. package/dist/tileset-3d/common/tileset-3d.js +846 -0
  106. package/dist/tileset-3d/common/tileset-3d.js.map +1 -0
  107. package/dist/tileset-3d/common/tileset-cache.d.ts +29 -0
  108. package/dist/tileset-3d/common/tileset-cache.d.ts.map +1 -0
  109. package/dist/{tileset → tileset-3d/common}/tileset-cache.js +12 -4
  110. package/dist/tileset-3d/common/tileset-cache.js.map +1 -0
  111. package/dist/tileset-3d/common/tileset-content-traversal.d.ts +37 -0
  112. package/dist/tileset-3d/common/tileset-content-traversal.d.ts.map +1 -0
  113. package/dist/tileset-3d/common/tileset-content-traversal.js +80 -0
  114. package/dist/tileset-3d/common/tileset-content-traversal.js.map +1 -0
  115. package/dist/tileset-3d/common/tileset-observability.d.ts +60 -0
  116. package/dist/tileset-3d/common/tileset-observability.d.ts.map +1 -0
  117. package/dist/tileset-3d/common/tileset-observability.js +39 -0
  118. package/dist/tileset-3d/common/tileset-observability.js.map +1 -0
  119. package/dist/tileset-3d/common/tileset-source.d.ts +228 -0
  120. package/dist/tileset-3d/common/tileset-source.d.ts.map +1 -0
  121. package/dist/tileset-3d/common/tileset-source.js +17 -0
  122. package/dist/tileset-3d/common/tileset-source.js.map +1 -0
  123. package/dist/{tileset → tileset-3d/common}/tileset-traverser.d.ts +35 -3
  124. package/dist/tileset-3d/common/tileset-traverser.d.ts.map +1 -0
  125. package/dist/{tileset → tileset-3d/common}/tileset-traverser.js +61 -13
  126. package/dist/tileset-3d/common/tileset-traverser.js.map +1 -0
  127. package/dist/tileset-3d/format-3d-tiles/implicit-tiling.d.ts +182 -0
  128. package/dist/tileset-3d/format-3d-tiles/implicit-tiling.d.ts.map +1 -0
  129. package/dist/tileset-3d/format-3d-tiles/implicit-tiling.js +681 -0
  130. package/dist/tileset-3d/format-3d-tiles/implicit-tiling.js.map +1 -0
  131. package/dist/tileset-3d/format-3d-tiles/tiles-3d-source.d.ts +221 -0
  132. package/dist/tileset-3d/format-3d-tiles/tiles-3d-source.d.ts.map +1 -0
  133. package/dist/tileset-3d/format-3d-tiles/tiles-3d-source.js +770 -0
  134. package/dist/tileset-3d/format-3d-tiles/tiles-3d-source.js.map +1 -0
  135. package/dist/tileset-3d/format-3d-tiles/tileset-3d-traverser.d.ts +110 -0
  136. package/dist/tileset-3d/format-3d-tiles/tileset-3d-traverser.d.ts.map +1 -0
  137. package/dist/tileset-3d/format-3d-tiles/tileset-3d-traverser.js +331 -0
  138. package/dist/tileset-3d/format-3d-tiles/tileset-3d-traverser.js.map +1 -0
  139. package/dist/tileset-3d/format-i3s/i3s-pending-tiles-register.d.ts.map +1 -0
  140. package/dist/{tileset → tileset-3d}/format-i3s/i3s-pending-tiles-register.js +3 -0
  141. package/dist/tileset-3d/format-i3s/i3s-pending-tiles-register.js.map +1 -0
  142. package/dist/tileset-3d/format-i3s/i3s-source.d.ts +116 -0
  143. package/dist/tileset-3d/format-i3s/i3s-source.d.ts.map +1 -0
  144. package/dist/tileset-3d/format-i3s/i3s-source.js +450 -0
  145. package/dist/tileset-3d/format-i3s/i3s-source.js.map +1 -0
  146. package/dist/tileset-3d/format-i3s/i3s-tile-manager.d.ts.map +1 -0
  147. package/dist/{tileset → tileset-3d}/format-i3s/i3s-tile-manager.js +5 -2
  148. package/dist/tileset-3d/format-i3s/i3s-tile-manager.js.map +1 -0
  149. package/dist/{tileset → tileset-3d}/format-i3s/i3s-tileset-traverser.d.ts +2 -2
  150. package/dist/tileset-3d/format-i3s/i3s-tileset-traverser.d.ts.map +1 -0
  151. package/dist/{tileset → tileset-3d}/format-i3s/i3s-tileset-traverser.js +17 -23
  152. package/dist/tileset-3d/format-i3s/i3s-tileset-traverser.js.map +1 -0
  153. package/dist/{tileset → tileset-3d}/helpers/3d-tiles-options.d.ts +1 -1
  154. package/dist/tileset-3d/helpers/3d-tiles-options.d.ts.map +1 -0
  155. package/dist/{tileset → tileset-3d}/helpers/3d-tiles-options.js +3 -0
  156. package/dist/tileset-3d/helpers/3d-tiles-options.js.map +1 -0
  157. package/dist/{tileset → tileset-3d}/helpers/bounding-volume.d.ts +7 -3
  158. package/dist/tileset-3d/helpers/bounding-volume.d.ts.map +1 -0
  159. package/dist/{tileset → tileset-3d}/helpers/bounding-volume.js +20 -91
  160. package/dist/tileset-3d/helpers/bounding-volume.js.map +1 -0
  161. package/dist/tileset-3d/helpers/frame-state.d.ts +93 -0
  162. package/dist/tileset-3d/helpers/frame-state.d.ts.map +1 -0
  163. package/dist/{tileset → tileset-3d}/helpers/frame-state.js +92 -10
  164. package/dist/tileset-3d/helpers/frame-state.js.map +1 -0
  165. package/dist/{tileset → tileset-3d}/helpers/i3s-lod.d.ts +1 -1
  166. package/dist/tileset-3d/helpers/i3s-lod.d.ts.map +1 -0
  167. package/dist/{tileset → tileset-3d}/helpers/i3s-lod.js +21 -9
  168. package/dist/tileset-3d/helpers/i3s-lod.js.map +1 -0
  169. package/dist/tileset-3d/helpers/s2-bounding-volume.d.ts +17 -0
  170. package/dist/tileset-3d/helpers/s2-bounding-volume.d.ts.map +1 -0
  171. package/dist/tileset-3d/helpers/s2-bounding-volume.js +20 -0
  172. package/dist/tileset-3d/helpers/s2-bounding-volume.js.map +1 -0
  173. package/dist/tileset-3d/helpers/tiles-3d-lod.d.ts +72 -0
  174. package/dist/tileset-3d/helpers/tiles-3d-lod.d.ts.map +1 -0
  175. package/dist/tileset-3d/helpers/tiles-3d-lod.js +257 -0
  176. package/dist/tileset-3d/helpers/tiles-3d-lod.js.map +1 -0
  177. package/dist/tileset-3d/helpers/tiles-3d-request-priority.d.ts +134 -0
  178. package/dist/tileset-3d/helpers/tiles-3d-request-priority.d.ts.map +1 -0
  179. package/dist/tileset-3d/helpers/tiles-3d-request-priority.js +179 -0
  180. package/dist/tileset-3d/helpers/tiles-3d-request-priority.js.map +1 -0
  181. package/dist/{tileset → tileset-3d}/helpers/transform-utils.d.ts +1 -1
  182. package/dist/tileset-3d/helpers/transform-utils.d.ts.map +1 -0
  183. package/dist/tileset-3d/helpers/transform-utils.js.map +1 -0
  184. package/dist/tileset-3d/helpers/zoom.d.ts.map +1 -0
  185. package/dist/tileset-3d/helpers/zoom.js.map +1 -0
  186. package/dist/types.d.ts +14 -0
  187. package/dist/types.d.ts.map +1 -1
  188. package/dist/types.js +3 -0
  189. package/dist/types.js.map +1 -1
  190. package/dist/utils/doubly-linked-list.d.ts.map +1 -1
  191. package/dist/utils/doubly-linked-list.js +1 -0
  192. package/dist/utils/doubly-linked-list.js.map +1 -1
  193. package/dist/utils/managed-array.d.ts.map +1 -1
  194. package/dist/utils/managed-array.js +1 -0
  195. package/dist/utils/managed-array.js.map +1 -1
  196. package/package.json +12 -9
  197. package/src/image-set.ts +328 -0
  198. package/src/index.ts +157 -9
  199. package/src/point-cloud/point-cloud-tile.ts +80 -0
  200. package/src/point-cloud/point-cloud-tileset.ts +767 -0
  201. package/src/point-cloud/types.ts +99 -0
  202. package/src/raster-set.ts +504 -0
  203. package/src/spatial/format-spatial-reference.ts +385 -0
  204. package/src/spatial/get-spatial-coordinate-frame.ts +169 -0
  205. package/src/spatial/i3s-elevation.ts +96 -0
  206. package/src/spatial/i3s-spatial-transformer.ts +957 -0
  207. package/src/spatial/normalize-crs-identifier.ts +26 -0
  208. package/src/spatial/spatial-coordinate-transformer.ts +376 -0
  209. package/src/spatial/spatial-resource-registry.ts +79 -0
  210. package/src/spatial/spatial-types.ts +422 -0
  211. package/src/spatial/tiles-3d-spatial-transformer.ts +206 -0
  212. package/src/tileset-2d/adapter.ts +46 -0
  213. package/src/tileset-2d/index.ts +33 -0
  214. package/src/tileset-2d/tile-2d-header.ts +224 -0
  215. package/src/tileset-2d/tileset-2d.ts +715 -0
  216. package/src/tileset-2d/types.ts +39 -0
  217. package/src/tileset-2d.ts +5 -0
  218. package/src/tileset-3d/common/indexed-archive-tileset-source.ts +205 -0
  219. package/src/tileset-3d/common/tile-3d-contracts.ts +115 -0
  220. package/src/tileset-3d/common/tile-3d.ts +1310 -0
  221. package/src/tileset-3d/common/tileset-3d.ts +1166 -0
  222. package/src/{tileset → tileset-3d/common}/tileset-cache.ts +16 -8
  223. package/src/tileset-3d/common/tileset-content-traversal.ts +114 -0
  224. package/src/tileset-3d/common/tileset-observability.ts +100 -0
  225. package/src/tileset-3d/common/tileset-source.ts +284 -0
  226. package/src/{tileset → tileset-3d/common}/tileset-traverser.ts +74 -14
  227. package/src/tileset-3d/format-3d-tiles/implicit-tiling.ts +1059 -0
  228. package/src/tileset-3d/format-3d-tiles/tiles-3d-source.ts +1025 -0
  229. package/src/tileset-3d/format-3d-tiles/tileset-3d-traverser.ts +379 -0
  230. package/src/{tileset → tileset-3d}/format-i3s/i3s-pending-tiles-register.ts +4 -0
  231. package/src/tileset-3d/format-i3s/i3s-source.ts +557 -0
  232. package/src/{tileset → tileset-3d}/format-i3s/i3s-tile-manager.ts +6 -2
  233. package/src/{tileset → tileset-3d}/format-i3s/i3s-tileset-traverser.ts +20 -24
  234. package/src/{tileset → tileset-3d}/helpers/3d-tiles-options.ts +5 -1
  235. package/src/{tileset → tileset-3d}/helpers/bounding-volume.ts +31 -114
  236. package/src/tileset-3d/helpers/frame-state.ts +322 -0
  237. package/src/{tileset → tileset-3d}/helpers/i3s-lod.ts +24 -10
  238. package/src/tileset-3d/helpers/s2-bounding-volume.ts +35 -0
  239. package/src/tileset-3d/helpers/tiles-3d-lod.ts +370 -0
  240. package/src/tileset-3d/helpers/tiles-3d-request-priority.ts +301 -0
  241. package/src/{tileset → tileset-3d}/helpers/transform-utils.ts +1 -1
  242. package/src/types.ts +18 -0
  243. package/src/utils/doubly-linked-list.ts +2 -0
  244. package/src/utils/managed-array.ts +2 -0
  245. package/dist/tileset/format-3d-tiles/tileset-3d-traverser.d.ts +0 -7
  246. package/dist/tileset/format-3d-tiles/tileset-3d-traverser.d.ts.map +0 -1
  247. package/dist/tileset/format-3d-tiles/tileset-3d-traverser.js +0 -53
  248. package/dist/tileset/format-3d-tiles/tileset-3d-traverser.js.map +0 -1
  249. package/dist/tileset/format-i3s/i3s-pending-tiles-register.d.ts.map +0 -1
  250. package/dist/tileset/format-i3s/i3s-pending-tiles-register.js.map +0 -1
  251. package/dist/tileset/format-i3s/i3s-tile-manager.d.ts.map +0 -1
  252. package/dist/tileset/format-i3s/i3s-tile-manager.js.map +0 -1
  253. package/dist/tileset/format-i3s/i3s-tileset-traverser.d.ts.map +0 -1
  254. package/dist/tileset/format-i3s/i3s-tileset-traverser.js.map +0 -1
  255. package/dist/tileset/helpers/3d-tiles-options.d.ts.map +0 -1
  256. package/dist/tileset/helpers/3d-tiles-options.js.map +0 -1
  257. package/dist/tileset/helpers/bounding-volume.d.ts.map +0 -1
  258. package/dist/tileset/helpers/bounding-volume.js.map +0 -1
  259. package/dist/tileset/helpers/frame-state.d.ts +0 -28
  260. package/dist/tileset/helpers/frame-state.d.ts.map +0 -1
  261. package/dist/tileset/helpers/frame-state.js.map +0 -1
  262. package/dist/tileset/helpers/i3s-lod.d.ts.map +0 -1
  263. package/dist/tileset/helpers/i3s-lod.js.map +0 -1
  264. package/dist/tileset/helpers/tiles-3d-lod.d.ts +0 -8
  265. package/dist/tileset/helpers/tiles-3d-lod.d.ts.map +0 -1
  266. package/dist/tileset/helpers/tiles-3d-lod.js +0 -113
  267. package/dist/tileset/helpers/tiles-3d-lod.js.map +0 -1
  268. package/dist/tileset/helpers/transform-utils.d.ts.map +0 -1
  269. package/dist/tileset/helpers/transform-utils.js.map +0 -1
  270. package/dist/tileset/helpers/zoom.d.ts.map +0 -1
  271. package/dist/tileset/helpers/zoom.js.map +0 -1
  272. package/dist/tileset/tile-3d.d.ts +0 -230
  273. package/dist/tileset/tile-3d.d.ts.map +0 -1
  274. package/dist/tileset/tile-3d.js +0 -631
  275. package/dist/tileset/tile-3d.js.map +0 -1
  276. package/dist/tileset/tileset-3d.d.ts +0 -284
  277. package/dist/tileset/tileset-3d.d.ts.map +0 -1
  278. package/dist/tileset/tileset-3d.js +0 -814
  279. package/dist/tileset/tileset-3d.js.map +0 -1
  280. package/dist/tileset/tileset-cache.d.ts +0 -19
  281. package/dist/tileset/tileset-cache.d.ts.map +0 -1
  282. package/dist/tileset/tileset-cache.js.map +0 -1
  283. package/dist/tileset/tileset-traverser.d.ts.map +0 -1
  284. package/dist/tileset/tileset-traverser.js.map +0 -1
  285. package/src/tileset/format-3d-tiles/tileset-3d-traverser.ts +0 -63
  286. package/src/tileset/helpers/frame-state.ts +0 -183
  287. package/src/tileset/helpers/tiles-3d-lod.ts +0 -149
  288. package/src/tileset/tile-3d.ts +0 -788
  289. package/src/tileset/tileset-3d.ts +0 -1037
  290. /package/dist/{tileset → tileset-3d}/format-i3s/i3s-pending-tiles-register.d.ts +0 -0
  291. /package/dist/{tileset → tileset-3d}/format-i3s/i3s-tile-manager.d.ts +0 -0
  292. /package/dist/{tileset → tileset-3d}/helpers/transform-utils.js +0 -0
  293. /package/dist/{tileset → tileset-3d}/helpers/zoom.d.ts +0 -0
  294. /package/dist/{tileset → tileset-3d}/helpers/zoom.js +0 -0
  295. /package/src/{tileset → tileset-3d}/helpers/zoom.ts +0 -0
@@ -1,19 +1,23 @@
1
+ import { Matrix4 } from '@math.gl/core';
1
2
  import { BoundingSphere, OrientedBoundingBox } from '@math.gl/culling';
2
3
  /**
3
4
  * Create a bounding volume from the tile's bounding volume header.
4
5
  * @param {Object} boundingVolumeHeader The tile's bounding volume header.
5
- * @param {Matrix4} transform The transform to apply to the bounding volume.
6
+ * @param {Matrix4} transform The current computed tile transform, including application transforms.
6
7
  * @param [result] The object onto which to store the result.
8
+ * @param initialTransform The accumulated JSON tile transform, excluded from region transforms.
9
+ * Defaults to transform so callers without application transforms keep geospatial regions fixed.
7
10
  * @returns The modified result parameter or a new TileBoundingVolume instance if none was provided.
8
11
  */
9
- export declare function createBoundingVolume(boundingVolumeHeader: any, transform: any, result?: any): any;
12
+ export declare function createBoundingVolume(boundingVolumeHeader: any, transform: Matrix4, result?: any, initialTransform?: Matrix4): any;
10
13
  /** [min, max] each in [longitude, latitude, altitude] */
11
14
  export type CartographicBounds = [min: number[], max: number[]];
12
15
  /**
13
16
  * Calculate the cartographic bounding box the tile's bounding volume.
14
17
  * @param {Object} boundingVolumeHeader The tile's bounding volume header.
15
18
  * @param {BoundingVolume} boundingVolume The bounding volume.
19
+ * @param isRegionTransformed Whether application transforms moved the region from its JSON bounds.
16
20
  * @returns {CartographicBounds}
17
21
  */
18
- export declare function getCartographicBounds(boundingVolumeHeader: any, boundingVolume: OrientedBoundingBox | BoundingSphere): CartographicBounds;
22
+ export declare function getCartographicBounds(boundingVolumeHeader: any, boundingVolume: OrientedBoundingBox | BoundingSphere, isRegionTransformed?: boolean): CartographicBounds;
19
23
  //# sourceMappingURL=bounding-volume.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bounding-volume.d.ts","sourceRoot":"","sources":["../../../src/tileset-3d/helpers/bounding-volume.ts"],"names":[],"mappings":"AAMA,OAAO,EAA+B,OAAO,EAAU,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAC,cAAc,EAAE,mBAAmB,EAAC,MAAM,kBAAkB,CAAC;AAkBrE;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,oBAAoB,KAAA,EACpB,SAAS,EAAE,OAAO,EAClB,MAAM,CAAC,KAAA,EACP,gBAAgB,GAAE,OAAmB,OA8BtC;AAED,yDAAyD;AACzD,MAAM,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;AAEhE;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,oBAAoB,KAAA,EACpB,cAAc,EAAE,mBAAmB,GAAG,cAAc,EACpD,mBAAmB,UAAQ,GAC1B,kBAAkB,CAuBpB"}
@@ -1,9 +1,10 @@
1
+ // SPDX-License-Identifier: Apache-2.0
1
2
  // This file is derived from the Cesium code base under Apache 2 license
2
3
  // See LICENSE.md and https://github.com/AnalyticalGraphicsInc/cesium/blob/master/LICENSE.md
3
4
  /* eslint-disable */
4
5
  import { Quaternion, Vector3, Matrix3, Matrix4, degrees } from '@math.gl/core';
5
6
  import { BoundingSphere, OrientedBoundingBox } from '@math.gl/culling';
6
- import { Ellipsoid } from '@math.gl/geospatial';
7
+ import { Ellipsoid, makeOBBFromRegion } from '@math.gl/geospatial';
7
8
  import { assert } from '@loaders.gl/loader-utils';
8
9
  // const scratchProjectedBoundingSphere = new BoundingSphere();
9
10
  function defined(x) {
@@ -12,31 +13,36 @@ function defined(x) {
12
13
  // const scratchMatrix = new Matrix3();
13
14
  const scratchPoint = new Vector3();
14
15
  const scratchScale = new Vector3();
15
- const scratchNorthWest = new Vector3();
16
- const scratchSouthEast = new Vector3();
17
- const scratchCenter = new Vector3();
18
- const scratchXAxis = new Vector3();
19
- const scratchYAxis = new Vector3();
20
- const scratchZAxis = new Vector3();
16
+ const identityTransform = new Matrix4();
21
17
  // const scratchRectangle = new Rectangle();
22
18
  // const scratchOrientedBoundingBox = new OrientedBoundingBox();
23
19
  // const scratchTransform = new Matrix4();
24
20
  /**
25
21
  * Create a bounding volume from the tile's bounding volume header.
26
22
  * @param {Object} boundingVolumeHeader The tile's bounding volume header.
27
- * @param {Matrix4} transform The transform to apply to the bounding volume.
23
+ * @param {Matrix4} transform The current computed tile transform, including application transforms.
28
24
  * @param [result] The object onto which to store the result.
25
+ * @param initialTransform The accumulated JSON tile transform, excluded from region transforms.
26
+ * Defaults to transform so callers without application transforms keep geospatial regions fixed.
29
27
  * @returns The modified result parameter or a new TileBoundingVolume instance if none was provided.
30
28
  */
31
- export function createBoundingVolume(boundingVolumeHeader, transform, result) {
29
+ export function createBoundingVolume(boundingVolumeHeader, transform, result, initialTransform = transform) {
32
30
  assert(boundingVolumeHeader, '3D Tile: boundingVolume must be defined');
33
31
  // boundingVolume schema:
34
32
  // https://github.com/AnalyticalGraphicsInc/3d-tiles/blob/master/specification/schema/boundingVolume.schema.json
35
33
  if (boundingVolumeHeader.box) {
36
- return createBox(boundingVolumeHeader.box, transform, result);
34
+ // S2 cells and regions are geospatially anchored. Their conservative ECEF boxes are already
35
+ // world-space volumes and must not receive the tile/node transform a second time.
36
+ const boxTransform = boundingVolumeHeader.s2VolumeInfo ? identityTransform : transform;
37
+ return createBox(boundingVolumeHeader.box, boxTransform, result);
37
38
  }
38
39
  if (boundingVolumeHeader.region) {
39
- return createObbFromRegion(boundingVolumeHeader.region);
40
+ const boundingVolume = makeOBBFromRegion(boundingVolumeHeader.region);
41
+ // Regions are already in world coordinates. Apply only the change from the JSON transform.
42
+ const regionTransform = transform.equals(initialTransform)
43
+ ? identityTransform
44
+ : transform.clone().multiplyRight(initialTransform.clone().invert());
45
+ return createBox([...boundingVolume.center, ...boundingVolume.halfAxes], regionTransform, result);
40
46
  }
41
47
  if (boundingVolumeHeader.sphere) {
42
48
  return createSphere(boundingVolumeHeader.sphere, transform, result);
@@ -47,12 +53,13 @@ export function createBoundingVolume(boundingVolumeHeader, transform, result) {
47
53
  * Calculate the cartographic bounding box the tile's bounding volume.
48
54
  * @param {Object} boundingVolumeHeader The tile's bounding volume header.
49
55
  * @param {BoundingVolume} boundingVolume The bounding volume.
56
+ * @param isRegionTransformed Whether application transforms moved the region from its JSON bounds.
50
57
  * @returns {CartographicBounds}
51
58
  */
52
- export function getCartographicBounds(boundingVolumeHeader, boundingVolume) {
59
+ export function getCartographicBounds(boundingVolumeHeader, boundingVolume, isRegionTransformed = false) {
53
60
  // boundingVolume schema:
54
61
  // https://github.com/AnalyticalGraphicsInc/3d-tiles/blob/master/specification/schema/boundingVolume.schema.json
55
- if (boundingVolumeHeader.box) {
62
+ if (boundingVolumeHeader.box || (boundingVolumeHeader.region && isRegionTransformed)) {
56
63
  return orientedBoundingBoxToCartographicBounds(boundingVolume);
57
64
  }
58
65
  if (boundingVolumeHeader.region) {
@@ -125,60 +132,6 @@ function createBox(box, transform, result) {
125
132
  }
126
133
  return new OrientedBoundingBox(center, halfAxes);
127
134
  }
128
- /*
129
- function createBoxFromTransformedRegion(region, transform, initialTransform, result) {
130
- const rectangle = Rectangle.unpack(region, 0, scratchRectangle);
131
- const minimumHeight = region[4];
132
- const maximumHeight = region[5];
133
-
134
- const orientedBoundingBox = OrientedBoundingBox.fromRectangle(
135
- rectangle,
136
- minimumHeight,
137
- maximumHeight,
138
- Ellipsoid.WGS84,
139
- scratchOrientedBoundingBox
140
- );
141
- const center = orientedBoundingBox.center;
142
- const halfAxes = orientedBoundingBox.halfAxes;
143
-
144
- // A region bounding volume is not transformed by the transform in the tileset JSON,
145
- // but may be transformed by additional transforms applied in Cesium.
146
- // This is why the transform is calculated as the difference between the initial transform and the current transform.
147
- transform = Matrix4.multiplyTransformation(
148
- transform,
149
- Matrix4.inverseTransformation(initialTransform, scratchTransform),
150
- scratchTransform
151
- );
152
- center = Matrix4.multiplyByPoint(transform, center, center);
153
- const rotationScale = Matrix4.getRotation(transform, scratchMatrix);
154
- halfAxes = Matrix3.multiply(rotationScale, halfAxes, halfAxes);
155
-
156
- if (defined(result) && result instanceof TileOrientedBoundingBox) {
157
- result.update(center, halfAxes);
158
- return result;
159
- }
160
-
161
- return new TileOrientedBoundingBox(center, halfAxes);
162
- }
163
-
164
- function createRegion(region, transform, initialTransform, result) {
165
- if (!Matrix4.equalsEpsilon(transform, initialTransform, CesiumMath.EPSILON8)) {
166
- return createBoxFromTransformedRegion(region, transform, initialTransform, result);
167
- }
168
-
169
- if (defined(result)) {
170
- return result;
171
- }
172
-
173
- const rectangleRegion = Rectangle.unpack(region, 0, scratchRectangle);
174
-
175
- return new TileBoundingRegion({
176
- rectangle: rectangleRegion,
177
- minimumHeight: region[4],
178
- maximumHeight: region[5]
179
- });
180
- }
181
- */
182
135
  function createSphere(sphere, transform, result) {
183
136
  // Find the transformed center
184
137
  const center = new Vector3(sphere[0], sphere[1], sphere[2]);
@@ -193,30 +146,6 @@ function createSphere(sphere, transform, result) {
193
146
  }
194
147
  return new BoundingSphere(center, radius);
195
148
  }
196
- /**
197
- * Create OrientedBoundingBox instance from region 3D tiles bounding volume
198
- * @param region - region 3D tiles bounding volume
199
- * @returns OrientedBoundingBox instance
200
- */
201
- function createObbFromRegion(region) {
202
- // [west, south, east, north, minimum height, maximum height]
203
- // Latitudes and longitudes are in the WGS 84 datum as defined in EPSG 4979 and are in radians.
204
- // Heights are in meters above (or below) the WGS 84 ellipsoid.
205
- const [west, south, east, north, minHeight, maxHeight] = region;
206
- const northWest = Ellipsoid.WGS84.cartographicToCartesian([degrees(west), degrees(north), minHeight], scratchNorthWest);
207
- const southEast = Ellipsoid.WGS84.cartographicToCartesian([degrees(east), degrees(south), maxHeight], scratchSouthEast);
208
- const centerInCartesian = new Vector3().addVectors(northWest, southEast).multiplyByScalar(0.5);
209
- Ellipsoid.WGS84.cartesianToCartographic(centerInCartesian, scratchCenter);
210
- Ellipsoid.WGS84.cartographicToCartesian([degrees(east), scratchCenter[1], scratchCenter[2]], scratchXAxis);
211
- Ellipsoid.WGS84.cartographicToCartesian([scratchCenter[0], degrees(north), scratchCenter[2]], scratchYAxis);
212
- Ellipsoid.WGS84.cartographicToCartesian([scratchCenter[0], scratchCenter[1], maxHeight], scratchZAxis);
213
- return createBox([
214
- ...centerInCartesian,
215
- ...scratchXAxis.subtract(centerInCartesian),
216
- ...scratchYAxis.subtract(centerInCartesian),
217
- ...scratchZAxis.subtract(centerInCartesian)
218
- ], new Matrix4());
219
- }
220
149
  /**
221
150
  * Convert a bounding volume defined by OrientedBoundingBox to cartographic bounds
222
151
  * @returns {CartographicBounds}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bounding-volume.js","sourceRoot":"","sources":["../../../src/tileset-3d/helpers/bounding-volume.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ import type { Tile3D } from "../common/tile-3d.js";
2
+ import { Vector3 } from '@math.gl/core';
3
+ import { CullingVolume, Plane } from '@math.gl/culling';
4
+ import { GeospatialViewport } from "../../types.js";
5
+ export type FrameState = {
6
+ camera: {
7
+ /** Camera position in WGS84 Cartesian meters. */
8
+ position: number[];
9
+ /** Normalized camera direction in WGS84 Cartesian coordinates. */
10
+ direction: number[];
11
+ /** Normalized camera up direction in WGS84 Cartesian coordinates. */
12
+ up: number[];
13
+ /** Camera position as `[longitude, latitude, height]`, with height in meters. */
14
+ cartographicPosition: [number, number, number];
15
+ /** Perspective vertical field of view in radians. */
16
+ verticalFieldOfView: number;
17
+ /** Elapsed seconds since camera position or direction last changed. */
18
+ timeSinceMovement: number;
19
+ };
20
+ viewport: GeospatialViewport;
21
+ topDownViewport: GeospatialViewport;
22
+ height: number;
23
+ cullingVolume: CullingVolume;
24
+ /** Optional world-space clipping planes applied to render-content culling. */
25
+ clippingPlanes?: Plane[];
26
+ frameNumber: number;
27
+ /** Perspective projection factor: twice the tangent of half the vertical field of view. */
28
+ sseDenominator: number;
29
+ /** View-dependent density used by perspective dynamic screen-space error for this traversal. */
30
+ dynamicScreenSpaceErrorDensity: number;
31
+ };
32
+ /** Optional camera and projection measurements supplied when constructing a frame state. */
33
+ export type GetFrameStateOptions = {
34
+ /** Elapsed seconds since camera position or direction last changed. */
35
+ timeSinceCameraMovement?: number;
36
+ };
37
+ /** Camera pose and timestamp retained between traversal frames. */
38
+ export type CameraMotionState = {
39
+ /** Last observed Earth-centered, Earth-fixed camera position. */
40
+ position: number[];
41
+ /** Last observed normalized Earth-centered, Earth-fixed camera direction. */
42
+ direction: number[];
43
+ /** Timestamp in milliseconds of the last observed pose change. */
44
+ lastMovementTime: number;
45
+ };
46
+ /** Updated camera state and elapsed stationary time for a traversal frame. */
47
+ export type CameraMotionUpdate = {
48
+ /** Camera pose to retain for the next traversal. */
49
+ state: CameraMotionState;
50
+ /** Elapsed seconds since the camera pose last changed. */
51
+ timeSinceMovement: number;
52
+ };
53
+ /**
54
+ * Extracts a frame state appropriate for tile culling from a structural deck.gl viewport.
55
+ *
56
+ * The viewport must describe the render camera, including its elevation. Geographic heights
57
+ * returned by `unprojectPosition` are used directly; adding a terrain offset only to traversal
58
+ * would make visibility, camera distances, and screen-space error disagree with rendering.
59
+ *
60
+ * `options.timeSinceCameraMovement` can be supplied by a caller that retains camera pose across
61
+ * calls. It defaults to a stationary camera so standalone callers do not defer requests.
62
+ *
63
+ * @param viewport - Geospatial viewport supplying camera and projection measurements.
64
+ * @param frameNumber - Current tileset traversal frame number.
65
+ * @param options - Additional camera and projection measurements for traversal.
66
+ * @returns Frame state used for visibility, SSE, and request-priority calculations.
67
+ */
68
+ export declare function getFrameState(viewport: GeospatialViewport, frameNumber: number, options?: GetFrameStateOptions): FrameState;
69
+ /**
70
+ * Updates retained camera motion state and calculates how long the current pose has been stable.
71
+ *
72
+ * The first observation is treated as stationary so initial tileset loading is never delayed.
73
+ * Position and direction are both compared because orbiting in place changes request relevance
74
+ * without necessarily changing the viewport's camera position.
75
+ *
76
+ * @param previousState - Pose retained from the preceding traversal for this viewport.
77
+ * @param position - Current Earth-centered, Earth-fixed camera position.
78
+ * @param direction - Current normalized Earth-centered, Earth-fixed camera direction.
79
+ * @param currentTime - Current monotonic-enough wall-clock time in milliseconds.
80
+ * @returns Updated pose and elapsed stationary time.
81
+ */
82
+ export declare function updateCameraMotionState(previousState: CameraMotionState | undefined, position: number[] | Vector3, direction: number[] | Vector3, currentTime: number): CameraMotionUpdate;
83
+ /**
84
+ * Limit `tiles` array length with `maximumTilesSelected` number.
85
+ * The criteria for this filtering is distance of a tile center
86
+ * to the `frameState.viewport`'s longitude and latitude
87
+ * @param tiles - tiles array to filter
88
+ * @param frameState - frameState to calculate distances
89
+ * @param maximumTilesSelected - maximal amount of tiles in the output array
90
+ * @returns new tiles array
91
+ */
92
+ export declare function limitSelectedTiles(tiles: Tile3D[], frameState: FrameState, maximumTilesSelected: number): [Tile3D[], Tile3D[]];
93
+ //# sourceMappingURL=frame-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame-state.d.ts","sourceRoot":"","sources":["../../../src/tileset-3d/helpers/frame-state.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,MAAM,EAAC,6BAA0B;AAC9C,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AACtC,OAAO,EAAC,aAAa,EAAE,KAAK,EAAC,MAAM,kBAAkB,CAAC;AAEtD,OAAO,EAAC,kBAAkB,EAAW,uBAAoB;AAEzD,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE;QACN,iDAAiD;QACjD,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,kEAAkE;QAClE,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,qEAAqE;QACrE,EAAE,EAAE,MAAM,EAAE,CAAC;QACb,iFAAiF;QACjF,oBAAoB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/C,qDAAqD;QACrD,mBAAmB,EAAE,MAAM,CAAC;QAC5B,uEAAuE;QACvE,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,eAAe,EAAE,kBAAkB,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,aAAa,CAAC;IAC7B,8EAA8E;IAC9E,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,2FAA2F;IAC3F,cAAc,EAAE,MAAM,CAAC;IACvB,gGAAgG;IAChG,8BAA8B,EAAE,MAAM,CAAC;CACxC,CAAC;AAEF,4FAA4F;AAC5F,MAAM,MAAM,oBAAoB,GAAG;IACjC,uEAAuE;IACvE,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC,CAAC;AAEF,mEAAmE;AACnE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,iEAAiE;IACjE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,6EAA6E;IAC7E,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,kEAAkE;IAClE,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,8EAA8E;AAC9E,MAAM,MAAM,kBAAkB,GAAG;IAC/B,oDAAoD;IACpD,KAAK,EAAE,iBAAiB,CAAC;IACzB,0DAA0D;IAC1D,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC;AAeF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,kBAAkB,EAC5B,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,oBAAyB,GACjC,UAAU,CAqFZ;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,iBAAiB,GAAG,SAAS,EAC5C,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,EAC5B,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,EAC7B,WAAW,EAAE,MAAM,GAClB,kBAAkB,CA6BpB;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,EAAE,UAAU,EACtB,oBAAoB,EAAE,MAAM,GAC3B,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAyBtB"}
@@ -1,8 +1,13 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
1
4
  import { Vector3 } from '@math.gl/core';
2
5
  import { CullingVolume, Plane } from '@math.gl/culling';
3
6
  import { Ellipsoid } from '@math.gl/geospatial';
4
7
  const scratchVector = new Vector3();
5
8
  const scratchPosition = new Vector3();
9
+ const CAMERA_POSITION_EPSILON = 1e-5;
10
+ const CAMERA_DIRECTION_EPSILON = 1e-7;
6
11
  const cullingVolume = new CullingVolume([
7
12
  new Plane(),
8
13
  new Plane(),
@@ -11,12 +16,26 @@ const cullingVolume = new CullingVolume([
11
16
  new Plane(),
12
17
  new Plane()
13
18
  ]);
14
- // Extracts a frame state appropriate for tile culling from a deck.gl viewport
15
- // TODO - this could likely be generalized and merged back into deck.gl for other culling scenarios
16
- export function getFrameState(viewport, frameNumber) {
19
+ /**
20
+ * Extracts a frame state appropriate for tile culling from a structural deck.gl viewport.
21
+ *
22
+ * The viewport must describe the render camera, including its elevation. Geographic heights
23
+ * returned by `unprojectPosition` are used directly; adding a terrain offset only to traversal
24
+ * would make visibility, camera distances, and screen-space error disagree with rendering.
25
+ *
26
+ * `options.timeSinceCameraMovement` can be supplied by a caller that retains camera pose across
27
+ * calls. It defaults to a stationary camera so standalone callers do not defer requests.
28
+ *
29
+ * @param viewport - Geospatial viewport supplying camera and projection measurements.
30
+ * @param frameNumber - Current tileset traversal frame number.
31
+ * @param options - Additional camera and projection measurements for traversal.
32
+ * @returns Frame state used for visibility, SSE, and request-priority calculations.
33
+ */
34
+ export function getFrameState(viewport, frameNumber, options = {}) {
17
35
  // Traverse and and request. Update _selectedTiles so that we know what to render.
18
36
  // Traverse and and request. Update _selectedTiles so that we know what to render.
19
- const { cameraDirection, cameraUp, height } = viewport;
37
+ const { cameraUp, height } = viewport;
38
+ const cameraDirection = viewport.cameraDirection;
20
39
  const { metersPerUnit } = viewport.distanceScales;
21
40
  // TODO - Ellipsoid.eastNorthUpToFixedFrame() breaks on raw array, create a Vector.
22
41
  // TODO - Ellipsoid.eastNorthUpToFixedFrame() takes a cartesian, is that intuitive?
@@ -25,15 +44,32 @@ export function getFrameState(viewport, frameNumber) {
25
44
  const cameraPositionCartographic = viewport.unprojectPosition(viewport.cameraPosition);
26
45
  const cameraPositionCartesian = Ellipsoid.WGS84.cartographicToCartesian(cameraPositionCartographic, new Vector3());
27
46
  // These should still be normalized as the transform has scale 1 (goes from meters to meters)
28
- const cameraDirectionCartesian = new Vector3(
29
- // @ts-ignore
30
- enuToFixedTransform.transformAsVector(new Vector3(cameraDirection).scale(metersPerUnit))).normalize();
47
+ let cameraDirectionCartesian;
48
+ if (cameraDirection) {
49
+ cameraDirectionCartesian = new Vector3(
50
+ // @ts-ignore
51
+ enuToFixedTransform.transformAsVector(new Vector3(cameraDirection).scale(metersPerUnit))).normalize();
52
+ }
53
+ else {
54
+ // Concrete deck.gl viewports do not expose the legacy structural cameraDirection field.
55
+ // The near-plane center is on the view axis, so its world-space direction is equivalent and
56
+ // works for perspective foveation without coupling loaders.gl to deck.gl internals.
57
+ // getFrustumPlanes is required by traversal but omitted from the minimal structural Viewport
58
+ // type for compatibility with existing application-side declarations.
59
+ // @ts-expect-error Runtime geospatial viewports provide getFrustumPlanes.
60
+ const nearPlane = viewport.getFrustumPlanes().near;
61
+ const nearCenterCommon = closestPointOnPlane(nearPlane, viewport.cameraPosition);
62
+ const nearCenterCartesian = worldToCartesian(viewport, nearCenterCommon);
63
+ cameraDirectionCartesian = new Vector3(nearCenterCartesian)
64
+ .subtract(cameraPositionCartesian)
65
+ .normalize();
66
+ }
31
67
  const cameraUpCartesian = new Vector3(
32
68
  // @ts-ignore
33
69
  enuToFixedTransform.transformAsVector(new Vector3(cameraUp).scale(metersPerUnit))).normalize();
34
70
  commonSpacePlanesToWGS84(viewport);
35
71
  const ViewportClass = viewport.constructor;
36
- const { longitude, latitude, width, bearing, zoom } = viewport;
72
+ const { longitude, latitude, width, bearing, zoom, position } = viewport;
37
73
  // @ts-ignore
38
74
  const topDownViewport = new ViewportClass({
39
75
  longitude,
@@ -42,21 +78,67 @@ export function getFrameState(viewport, frameNumber) {
42
78
  width,
43
79
  bearing,
44
80
  zoom,
81
+ position,
45
82
  pitch: 0
46
83
  });
84
+ const verticalFieldOfView = Number.isFinite(viewport.fovy) && Number(viewport.fovy) > 0 && Number(viewport.fovy) < 180
85
+ ? (Number(viewport.fovy) * Math.PI) / 180
86
+ : Math.PI / 3;
47
87
  // TODO: make a file/class for frameState and document what needs to be attached to this so that traversal can function
48
88
  return {
49
89
  camera: {
50
90
  position: cameraPositionCartesian,
51
91
  direction: cameraDirectionCartesian,
52
- up: cameraUpCartesian
92
+ up: cameraUpCartesian,
93
+ cartographicPosition: cameraPositionCartographic,
94
+ verticalFieldOfView,
95
+ timeSinceMovement: options.timeSinceCameraMovement ?? Number.POSITIVE_INFINITY
53
96
  },
54
97
  viewport,
55
98
  topDownViewport,
56
99
  height,
57
100
  cullingVolume,
101
+ clippingPlanes: viewport.clippingPlanes,
58
102
  frameNumber, // TODO: This can be the same between updates, what number is unique for between updates?
59
- sseDenominator: 1.15 // Assumes fovy = 60 degrees
103
+ sseDenominator: 2 * Math.tan(verticalFieldOfView / 2),
104
+ // Tileset3D fills this immediately before traversal because it depends on the root volume.
105
+ dynamicScreenSpaceErrorDensity: 0
106
+ };
107
+ }
108
+ /**
109
+ * Updates retained camera motion state and calculates how long the current pose has been stable.
110
+ *
111
+ * The first observation is treated as stationary so initial tileset loading is never delayed.
112
+ * Position and direction are both compared because orbiting in place changes request relevance
113
+ * without necessarily changing the viewport's camera position.
114
+ *
115
+ * @param previousState - Pose retained from the preceding traversal for this viewport.
116
+ * @param position - Current Earth-centered, Earth-fixed camera position.
117
+ * @param direction - Current normalized Earth-centered, Earth-fixed camera direction.
118
+ * @param currentTime - Current monotonic-enough wall-clock time in milliseconds.
119
+ * @returns Updated pose and elapsed stationary time.
120
+ */
121
+ export function updateCameraMotionState(previousState, position, direction, currentTime) {
122
+ const positionArray = Array.from(position);
123
+ const directionArray = Array.from(direction);
124
+ const positionChanged = previousState
125
+ ? positionArray.length !== previousState.position.length ||
126
+ positionArray.some((value, index) => Math.abs(value - previousState.position[index]) > CAMERA_POSITION_EPSILON)
127
+ : false;
128
+ const directionChanged = previousState
129
+ ? directionArray.length !== previousState.direction.length ||
130
+ directionArray.some((value, index) => Math.abs(value - previousState.direction[index]) > CAMERA_DIRECTION_EPSILON)
131
+ : false;
132
+ const lastMovementTime = positionChanged || directionChanged
133
+ ? currentTime
134
+ : (previousState?.lastMovementTime ?? Number.NEGATIVE_INFINITY);
135
+ return {
136
+ state: {
137
+ position: positionArray,
138
+ direction: directionArray,
139
+ lastMovementTime
140
+ },
141
+ timeSinceMovement: Math.max((currentTime - lastMovementTime) / 1000, 0)
60
142
  };
61
143
  }
62
144
  /**
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame-state.js","sourceRoot":"","sources":["../../../src/tileset-3d/helpers/frame-state.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,+BAA+B;AAC/B,oCAAoC;AAGpC,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AACtC,OAAO,EAAC,aAAa,EAAE,KAAK,EAAC,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAuD9C,MAAM,aAAa,GAAG,IAAI,OAAO,EAAE,CAAC;AACpC,MAAM,eAAe,GAAG,IAAI,OAAO,EAAE,CAAC;AACtC,MAAM,uBAAuB,GAAG,IAAI,CAAC;AACrC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AACtC,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC;IACtC,IAAI,KAAK,EAAE;IACX,IAAI,KAAK,EAAE;IACX,IAAI,KAAK,EAAE;IACX,IAAI,KAAK,EAAE;IACX,IAAI,KAAK,EAAE;IACX,IAAI,KAAK,EAAE;CACZ,CAAC,CAAC;AAEH;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,aAAa,CAC3B,QAA4B,EAC5B,WAAmB,EACnB,UAAgC,EAAE;IAElC,kFAAkF;IAClF,kFAAkF;IAClF,MAAM,EAAC,QAAQ,EAAE,MAAM,EAAC,GAAG,QAAQ,CAAC;IACpC,MAAM,eAAe,GAAG,QAAQ,CAAC,eAAuC,CAAC;IACzE,MAAM,EAAC,aAAa,EAAC,GAAG,QAAQ,CAAC,cAAc,CAAC;IAEhD,mFAAmF;IACnF,mFAAmF;IACnF,MAAM,uBAAuB,GAAG,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5E,MAAM,mBAAmB,GAAG,SAAS,CAAC,KAAK,CAAC,uBAAuB,CAAC,uBAAuB,CAAC,CAAC;IAE7F,MAAM,0BAA0B,GAAG,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IACvF,MAAM,uBAAuB,GAAG,SAAS,CAAC,KAAK,CAAC,uBAAuB,CACrE,0BAA0B,EAC1B,IAAI,OAAO,EAAE,CACd,CAAC;IAEF,6FAA6F;IAC7F,IAAI,wBAAiC,CAAC;IACtC,IAAI,eAAe,EAAE,CAAC;QACpB,wBAAwB,GAAG,IAAI,OAAO;QACpC,aAAa;QACb,mBAAmB,CAAC,iBAAiB,CAAC,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CACzF,CAAC,SAAS,EAAE,CAAC;IAChB,CAAC;SAAM,CAAC;QACN,wFAAwF;QACxF,4FAA4F;QAC5F,oFAAoF;QACpF,6FAA6F;QAC7F,sEAAsE;QACtE,0EAA0E;QAC1E,MAAM,SAAS,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC;QACnD,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,SAAS,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;QACjF,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;QACzE,wBAAwB,GAAG,IAAI,OAAO,CAAC,mBAAmB,CAAC;aACxD,QAAQ,CAAC,uBAAuB,CAAC;aACjC,SAAS,EAAE,CAAC;IACjB,CAAC;IACD,MAAM,iBAAiB,GAAG,IAAI,OAAO;IACnC,aAAa;IACb,mBAAmB,CAAC,iBAAiB,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAClF,CAAC,SAAS,EAAE,CAAC;IAEd,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IAEnC,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,CAAC;IAC3C,MAAM,EAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAC,GAAG,QAAQ,CAAC;IACvE,aAAa;IACb,MAAM,eAAe,GAAG,IAAI,aAAa,CAAC;QACxC,SAAS;QACT,QAAQ;QACR,MAAM;QACN,KAAK;QACL,OAAO;QACP,IAAI;QACJ,QAAQ;QACR,KAAK,EAAE,CAAC;KACT,CAAC,CAAC;IAEH,MAAM,mBAAmB,GACvB,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG;QACxF,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG;QACzC,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IAElB,uHAAuH;IACvH,OAAO;QACL,MAAM,EAAE;YACN,QAAQ,EAAE,uBAAuB;YACjC,SAAS,EAAE,wBAAwB;YACnC,EAAE,EAAE,iBAAiB;YACrB,oBAAoB,EAAE,0BAA0B;YAChD,mBAAmB;YACnB,iBAAiB,EAAE,OAAO,CAAC,uBAAuB,IAAI,MAAM,CAAC,iBAAiB;SAC/E;QACD,QAAQ;QACR,eAAe;QACf,MAAM;QACN,aAAa;QACb,cAAc,EAAE,QAAQ,CAAC,cAAc;QACvC,WAAW,EAAE,yFAAyF;QACtG,cAAc,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB,GAAG,CAAC,CAAC;QACrD,2FAA2F;QAC3F,8BAA8B,EAAE,CAAC;KAClC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,uBAAuB,CACrC,aAA4C,EAC5C,QAA4B,EAC5B,SAA6B,EAC7B,WAAmB;IAEnB,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,eAAe,GAAG,aAAa;QACnC,CAAC,CAAC,aAAa,CAAC,MAAM,KAAK,aAAa,CAAC,QAAQ,CAAC,MAAM;YACtD,aAAa,CAAC,IAAI,CAChB,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,uBAAuB,CAC5F;QACH,CAAC,CAAC,KAAK,CAAC;IACV,MAAM,gBAAgB,GAAG,aAAa;QACpC,CAAC,CAAC,cAAc,CAAC,MAAM,KAAK,aAAa,CAAC,SAAS,CAAC,MAAM;YACxD,cAAc,CAAC,IAAI,CACjB,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CACf,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,wBAAwB,CAC9E;QACH,CAAC,CAAC,KAAK,CAAC;IACV,MAAM,gBAAgB,GACpB,eAAe,IAAI,gBAAgB;QACjC,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,CAAC,aAAa,EAAE,gBAAgB,IAAI,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAEpE,OAAO;QACL,KAAK,EAAE;YACL,QAAQ,EAAE,aAAa;YACvB,SAAS,EAAE,cAAc;YACzB,gBAAgB;SACjB;QACD,iBAAiB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,GAAG,gBAAgB,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;KACxE,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAe,EACf,UAAsB,EACtB,oBAA4B;IAE5B,IAAI,oBAAoB,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,oBAAoB,EAAE,CAAC;QACvE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACrB,CAAC;IACD,yFAAyF;IACzF,MAAM,MAAM,GAAuB,EAAE,CAAC;IACtC,MAAM,EAAC,SAAS,EAAE,iBAAiB,EAAE,QAAQ,EAAE,gBAAgB,EAAC,GAAG,UAAU,CAAC,QAAQ,CAAC;IACvF,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5C,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,GAAG,QAAQ,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC,CAAC;QACtE,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IACjC,CAAC;IACD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,oBAAoB,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,eAAe,GAAa,EAAE,CAAC;IACrC,KAAK,IAAI,CAAC,GAAG,oBAAoB,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChE,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,wBAAwB,CAAC,QAAQ;IACxC,gDAAgD;IAChD,MAAM,aAAa,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAC;IAElD,iCAAiC;IACjC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC1F,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IACzE,MAAM,eAAe,GAAG,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;IAE7F,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,eAAe,CACvC,mBAAmB,EACnB,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAClE,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACnB,SAAS,CAAC,kCAAkC;QAC9C,CAAC;QACD,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,SAAS,GAAG,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,EAAE,eAAe,CAAC,CAAC;QAChF,MAAM,YAAY,GAAG,gBAAgB,CAAC,QAAQ,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;QAE5E,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,eAAe,CACvC,YAAY;QACZ,8EAA8E;QAC9E,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAC/D,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAA0C,EAC1C,QAA4B,EAC5B,MAAe,IAAI,OAAO,EAAE;IAE5B,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACjD,GAAG;SACA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;SAClB,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,aAAa,CAAC;SACrC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACjB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,gBAAgB,CACvB,QAAkB,EAClB,KAAyB,EACzB,MAAe,IAAI,OAAO,EAAE;IAE5B,MAAM,eAAe,GAAG,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC1D,OAAO,SAAS,CAAC,KAAK,CAAC,uBAAuB,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;AACvE,CAAC"}
@@ -1,4 +1,4 @@
1
- import { Tile3D } from "../tile-3d.js";
1
+ import { Tile3D } from "../common/tile-3d.js";
2
2
  import { FrameState } from "./frame-state.js";
3
3
  /**
4
4
  * For the maxScreenThreshold error metric, maxError means that you should replace the node with it's children
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i3s-lod.d.ts","sourceRoot":"","sources":["../../../src/tileset-3d/helpers/i3s-lod.ts"],"names":[],"mappings":"AAMA,OAAO,EAAC,MAAM,EAAC,6BAA0B;AACzC,OAAO,EAAC,UAAU,EAAC,yBAAsB;AAUzC;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CA2BzF;AAED;;;;;GAKG;AAEH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,MAAM,CA8C/E"}
@@ -20,20 +20,31 @@ const cartesianToEnuMatrix = new Matrix4();
20
20
  * @returns
21
21
  */
22
22
  export function getLodStatus(tile, frameState) {
23
- if (tile.lodMetricValue === 0 || isNaN(tile.lodMetricValue)) {
23
+ if (tile.lodMetricValue === 0 || Number.isNaN(tile.lodMetricValue)) {
24
24
  return 'DIG';
25
25
  }
26
26
  const screenSize = 2 * getProjectedRadius(tile, frameState);
27
27
  if (screenSize < 2) {
28
28
  return 'OUT';
29
29
  }
30
- if (!tile.header.children || screenSize <= tile.lodMetricValue) {
30
+ if (!tile.header.children) {
31
31
  return 'DRAW';
32
32
  }
33
- else if (tile.header.children) {
34
- return 'DIG';
33
+ switch (tile.lodMetricType) {
34
+ case 'screenSpaceRelative': {
35
+ const viewportHeight = frameState.topDownViewport.height || 1;
36
+ return screenSize / viewportHeight <= tile.lodMetricValue ? 'DRAW' : 'DIG';
37
+ }
38
+ case 'distanceRangeFromDefaultCamera':
39
+ return tile.distanceToTile(frameState) >= tile.lodMetricValue ? 'DRAW' : 'DIG';
40
+ case 'maxScreenThresholdSQ': {
41
+ const diameterThreshold = Math.sqrt(tile.lodMetricValue / (Math.PI * 0.25));
42
+ return screenSize <= diameterThreshold ? 'DRAW' : 'DIG';
43
+ }
44
+ case 'maxScreenThreshold':
45
+ default:
46
+ return screenSize <= tile.lodMetricValue ? 'DRAW' : 'DIG';
35
47
  }
36
- return 'OUT';
37
48
  }
38
49
  /**
39
50
  * Calculate size of MBS radius projected on the screen plane
@@ -44,10 +55,11 @@ export function getLodStatus(tile, frameState) {
44
55
  // eslint-disable-next-line max-statements
45
56
  export function getProjectedRadius(tile, frameState) {
46
57
  const { topDownViewport: viewport } = frameState;
47
- const mbsLat = tile.header.mbs[1];
48
- const mbsLon = tile.header.mbs[0];
49
- const mbsZ = tile.header.mbs[2];
50
- const mbsR = tile.header.mbs[3];
58
+ const mbs = tile.header.i3sLodMbs || tile.header.mbs;
59
+ const mbsLat = mbs[1];
60
+ const mbsLon = mbs[0];
61
+ const mbsZ = mbs[2];
62
+ const mbsR = mbs[3];
51
63
  const mbsCenterCartesian = [...tile.boundingVolume.center];
52
64
  const cameraPositionCartographic = viewport.unprojectPosition(viewport.cameraPosition);
53
65
  Ellipsoid.WGS84.cartographicToCartesian(cameraPositionCartographic, cameraPositionCartesian);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i3s-lod.js","sourceRoot":"","sources":["../../../src/tileset-3d/helpers/i3s-lod.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /** Serialized S2 cell metadata used by 3D Tiles bounding-volume extensions. */
2
+ export type S2VolumeInfo = {
3
+ /** S2 key or token. */
4
+ token: string;
5
+ /** Minimum height in meters. */
6
+ minimumHeight: number;
7
+ /** Maximum height in meters. */
8
+ maximumHeight: number;
9
+ };
10
+ /**
11
+ * Converts an S2 cell and its vertical range to the runtime oriented-box representation.
12
+ *
13
+ * @param s2VolumeInfo - S2 cell token and height range.
14
+ * @returns A twelve-component center/half-axis oriented bounding box.
15
+ */
16
+ export declare function convertS2BoundingVolumeToOBB(s2VolumeInfo: S2VolumeInfo): number[];
17
+ //# sourceMappingURL=s2-bounding-volume.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s2-bounding-volume.d.ts","sourceRoot":"","sources":["../../../src/tileset-3d/helpers/s2-bounding-volume.ts"],"names":[],"mappings":"AAUA,+EAA+E;AAC/E,MAAM,MAAM,YAAY,GAAG;IACzB,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,gCAAgC;IAChC,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,YAAY,EAAE,YAAY,GAAG,MAAM,EAAE,CAQjF"}
@@ -0,0 +1,20 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright vis.gl contributors
4
+ // TypeScript's legacy `node` resolution does not inspect package `exports`, but this public
5
+ // subpath is resolved by the package at runtime and avoids loading unrelated DGGS decoders.
6
+ // @ts-expect-error Conditional package subpath exports require a modern module resolver.
7
+ import { getS2Bounds } from '@math.gl/dggs/s2';
8
+ import { Ellipsoid, makeOBBFromRegion } from '@math.gl/geospatial';
9
+ /**
10
+ * Converts an S2 cell and its vertical range to the runtime oriented-box representation.
11
+ *
12
+ * @param s2VolumeInfo - S2 cell token and height range.
13
+ * @returns A twelve-component center/half-axis oriented bounding box.
14
+ */
15
+ export function convertS2BoundingVolumeToOBB(s2VolumeInfo) {
16
+ const [[west, south], [east, north]] = getS2Bounds(s2VolumeInfo.token);
17
+ const orientedBoundingBox = makeOBBFromRegion([west, south, east, north, s2VolumeInfo.minimumHeight, s2VolumeInfo.maximumHeight], Ellipsoid.WGS84, { units: 'degrees' });
18
+ return [...orientedBoundingBox.center, ...orientedBoundingBox.halfAxes];
19
+ }
20
+ //# sourceMappingURL=s2-bounding-volume.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s2-bounding-volume.js","sourceRoot":"","sources":["../../../src/tileset-3d/helpers/s2-bounding-volume.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,+BAA+B;AAC/B,gCAAgC;AAEhC,4FAA4F;AAC5F,4FAA4F;AAC5F,yFAAyF;AACzF,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAC,SAAS,EAAE,iBAAiB,EAAC,MAAM,qBAAqB,CAAC;AAYjE;;;;;GAKG;AACH,MAAM,UAAU,4BAA4B,CAAC,YAA0B;IACrE,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,GAAG,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,mBAAmB,GAAG,iBAAiB,CAC3C,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,CAAC,aAAa,EAAE,YAAY,CAAC,aAAa,CAAC,EAClF,SAAS,CAAC,KAAK,EACf,EAAC,KAAK,EAAE,SAAS,EAAC,CACnB,CAAC;IACF,OAAO,CAAC,GAAG,mBAAmB,CAAC,MAAM,EAAE,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;AAC1E,CAAC"}