@loaders.gl/3d-tiles 4.0.0-alpha.5 → 4.0.0-alpha.6

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 (313) hide show
  1. package/dist/bundle.js +2 -2
  2. package/dist/cesium-ion-loader.d.ts.map +1 -1
  3. package/dist/cesium-ion-loader.js +37 -32
  4. package/dist/dist.min.js +3850 -1551
  5. package/dist/es5/bundle.js +6 -0
  6. package/dist/es5/bundle.js.map +1 -0
  7. package/dist/es5/cesium-ion-loader.js +77 -0
  8. package/dist/es5/cesium-ion-loader.js.map +1 -0
  9. package/dist/es5/index.js +63 -0
  10. package/dist/es5/index.js.map +1 -0
  11. package/dist/es5/lib/classes/helpers/tile-3d-accessor-utils.js +114 -0
  12. package/dist/es5/lib/classes/helpers/tile-3d-accessor-utils.js.map +1 -0
  13. package/dist/es5/lib/classes/tile-3d-batch-table-hierarchy.js +180 -0
  14. package/dist/es5/lib/classes/tile-3d-batch-table-hierarchy.js.map +1 -0
  15. package/dist/es5/lib/classes/tile-3d-batch-table.js +285 -0
  16. package/dist/es5/lib/classes/tile-3d-batch-table.js.map +1 -0
  17. package/dist/es5/lib/classes/tile-3d-feature-table.js +97 -0
  18. package/dist/es5/lib/classes/tile-3d-feature-table.js.map +1 -0
  19. package/dist/es5/lib/constants.js +32 -0
  20. package/dist/es5/lib/constants.js.map +1 -0
  21. package/dist/es5/lib/encoders/encode-3d-tile-batched-model.js +49 -0
  22. package/dist/es5/lib/encoders/encode-3d-tile-batched-model.js.map +1 -0
  23. package/dist/es5/lib/encoders/encode-3d-tile-composite.js +30 -0
  24. package/dist/es5/lib/encoders/encode-3d-tile-composite.js.map +1 -0
  25. package/dist/es5/lib/encoders/encode-3d-tile-instanced-model.js +47 -0
  26. package/dist/es5/lib/encoders/encode-3d-tile-instanced-model.js.map +1 -0
  27. package/dist/es5/lib/encoders/encode-3d-tile-point-cloud.js +48 -0
  28. package/dist/es5/lib/encoders/encode-3d-tile-point-cloud.js.map +1 -0
  29. package/dist/es5/lib/encoders/encode-3d-tile.js +35 -0
  30. package/dist/es5/lib/encoders/encode-3d-tile.js.map +1 -0
  31. package/dist/es5/lib/encoders/helpers/encode-3d-tile-header.js +35 -0
  32. package/dist/es5/lib/encoders/helpers/encode-3d-tile-header.js.map +1 -0
  33. package/dist/es5/lib/ion/ion.js +170 -0
  34. package/dist/es5/lib/ion/ion.js.map +1 -0
  35. package/dist/es5/lib/parsers/helpers/normalize-3d-tile-colors.js +64 -0
  36. package/dist/es5/lib/parsers/helpers/normalize-3d-tile-colors.js.map +1 -0
  37. package/dist/es5/lib/parsers/helpers/normalize-3d-tile-normals.js +32 -0
  38. package/dist/es5/lib/parsers/helpers/normalize-3d-tile-normals.js.map +1 -0
  39. package/dist/es5/lib/parsers/helpers/normalize-3d-tile-positions.js +32 -0
  40. package/dist/es5/lib/parsers/helpers/normalize-3d-tile-positions.js.map +1 -0
  41. package/dist/es5/lib/parsers/helpers/parse-3d-implicit-tiles.js +280 -0
  42. package/dist/es5/lib/parsers/helpers/parse-3d-implicit-tiles.js.map +1 -0
  43. package/dist/es5/lib/parsers/helpers/parse-3d-tile-gltf-view.js +96 -0
  44. package/dist/es5/lib/parsers/helpers/parse-3d-tile-gltf-view.js.map +1 -0
  45. package/dist/es5/lib/parsers/helpers/parse-3d-tile-header.js +22 -0
  46. package/dist/es5/lib/parsers/helpers/parse-3d-tile-header.js.map +1 -0
  47. package/dist/es5/lib/parsers/helpers/parse-3d-tile-subtree.js +145 -0
  48. package/dist/es5/lib/parsers/helpers/parse-3d-tile-subtree.js.map +1 -0
  49. package/dist/es5/lib/parsers/helpers/parse-3d-tile-tables.js +85 -0
  50. package/dist/es5/lib/parsers/helpers/parse-3d-tile-tables.js.map +1 -0
  51. package/dist/es5/lib/parsers/helpers/parse-utils.js +28 -0
  52. package/dist/es5/lib/parsers/helpers/parse-utils.js.map +1 -0
  53. package/dist/es5/lib/parsers/parse-3d-tile-batched-model.js +51 -0
  54. package/dist/es5/lib/parsers/parse-3d-tile-batched-model.js.map +1 -0
  55. package/dist/es5/lib/parsers/parse-3d-tile-composite.js +48 -0
  56. package/dist/es5/lib/parsers/parse-3d-tile-composite.js.map +1 -0
  57. package/dist/es5/lib/parsers/parse-3d-tile-gltf.js +35 -0
  58. package/dist/es5/lib/parsers/parse-3d-tile-gltf.js.map +1 -0
  59. package/dist/es5/lib/parsers/parse-3d-tile-header.js +271 -0
  60. package/dist/es5/lib/parsers/parse-3d-tile-header.js.map +1 -0
  61. package/dist/es5/lib/parsers/parse-3d-tile-instanced-model.js +172 -0
  62. package/dist/es5/lib/parsers/parse-3d-tile-instanced-model.js.map +1 -0
  63. package/dist/es5/lib/parsers/parse-3d-tile-point-cloud.js +271 -0
  64. package/dist/es5/lib/parsers/parse-3d-tile-point-cloud.js.map +1 -0
  65. package/dist/es5/lib/parsers/parse-3d-tile.js +74 -0
  66. package/dist/es5/lib/parsers/parse-3d-tile.js.map +1 -0
  67. package/dist/es5/lib/utils/obb/s2-corners-to-obb.js +30 -0
  68. package/dist/es5/lib/utils/obb/s2-corners-to-obb.js.map +1 -0
  69. package/dist/es5/lib/utils/s2/converters/s2-to-boundary.js +44 -0
  70. package/dist/es5/lib/utils/s2/converters/s2-to-boundary.js.map +1 -0
  71. package/dist/es5/lib/utils/s2/converters/s2-to-obb-points.js +30 -0
  72. package/dist/es5/lib/utils/s2/converters/s2-to-obb-points.js.map +1 -0
  73. package/dist/es5/lib/utils/s2/converters/s2-to-region.js +52 -0
  74. package/dist/es5/lib/utils/s2/converters/s2-to-region.js.map +1 -0
  75. package/dist/es5/lib/utils/s2/index.js +90 -0
  76. package/dist/es5/lib/utils/s2/index.js.map +1 -0
  77. package/dist/es5/lib/utils/s2/s2-geometry-functions.js +19 -0
  78. package/dist/es5/lib/utils/s2/s2-geometry-functions.js.map +1 -0
  79. package/dist/es5/lib/utils/s2/s2-token-functions.js +41 -0
  80. package/dist/es5/lib/utils/s2/s2-token-functions.js.map +1 -0
  81. package/dist/es5/lib/utils/s2/s2geometry/s2-cell-utils.js +22 -0
  82. package/dist/es5/lib/utils/s2/s2geometry/s2-cell-utils.js.map +1 -0
  83. package/dist/es5/lib/utils/s2/s2geometry/s2-geometry.js +207 -0
  84. package/dist/es5/lib/utils/s2/s2geometry/s2-geometry.js.map +1 -0
  85. package/dist/es5/lib/utils/version.js +9 -0
  86. package/dist/es5/lib/utils/version.js.map +1 -0
  87. package/dist/es5/tile-3d-subtree-loader.js +22 -0
  88. package/dist/es5/tile-3d-subtree-loader.js.map +1 -0
  89. package/dist/es5/tile-3d-writer.js +26 -0
  90. package/dist/es5/tile-3d-writer.js.map +1 -0
  91. package/dist/es5/tiles-3d-loader.js +134 -0
  92. package/dist/es5/tiles-3d-loader.js.map +1 -0
  93. package/dist/es5/types.js +2 -0
  94. package/dist/es5/types.js.map +1 -0
  95. package/dist/esm/bundle.js +4 -0
  96. package/dist/esm/bundle.js.map +1 -0
  97. package/dist/esm/cesium-ion-loader.js +36 -0
  98. package/dist/esm/cesium-ion-loader.js.map +1 -0
  99. package/dist/esm/index.js +9 -0
  100. package/dist/esm/index.js.map +1 -0
  101. package/dist/esm/lib/classes/helpers/tile-3d-accessor-utils.js +96 -0
  102. package/dist/esm/lib/classes/helpers/tile-3d-accessor-utils.js.map +1 -0
  103. package/dist/esm/lib/classes/tile-3d-batch-table-hierarchy.js +171 -0
  104. package/dist/esm/lib/classes/tile-3d-batch-table-hierarchy.js.map +1 -0
  105. package/dist/esm/lib/classes/tile-3d-batch-table.js +231 -0
  106. package/dist/esm/lib/classes/tile-3d-batch-table.js.map +1 -0
  107. package/dist/esm/lib/classes/tile-3d-feature-table.js +70 -0
  108. package/dist/esm/lib/classes/tile-3d-feature-table.js.map +1 -0
  109. package/dist/esm/lib/constants.js +22 -0
  110. package/dist/esm/lib/constants.js.map +1 -0
  111. package/dist/esm/lib/encoders/encode-3d-tile-batched-model.js +40 -0
  112. package/dist/esm/lib/encoders/encode-3d-tile-batched-model.js.map +1 -0
  113. package/dist/esm/lib/encoders/encode-3d-tile-composite.js +21 -0
  114. package/dist/esm/lib/encoders/encode-3d-tile-composite.js.map +1 -0
  115. package/dist/esm/lib/encoders/encode-3d-tile-instanced-model.js +36 -0
  116. package/dist/esm/lib/encoders/encode-3d-tile-instanced-model.js.map +1 -0
  117. package/dist/esm/lib/encoders/encode-3d-tile-point-cloud.js +39 -0
  118. package/dist/esm/lib/encoders/encode-3d-tile-point-cloud.js.map +1 -0
  119. package/dist/esm/lib/encoders/encode-3d-tile.js +29 -0
  120. package/dist/esm/lib/encoders/encode-3d-tile.js.map +1 -0
  121. package/dist/esm/lib/encoders/helpers/encode-3d-tile-header.js +28 -0
  122. package/dist/esm/lib/encoders/helpers/encode-3d-tile-header.js.map +1 -0
  123. package/dist/esm/lib/ion/ion.js +70 -0
  124. package/dist/esm/lib/ion/ion.js.map +1 -0
  125. package/dist/esm/lib/parsers/helpers/normalize-3d-tile-colors.js +58 -0
  126. package/dist/esm/lib/parsers/helpers/normalize-3d-tile-colors.js.map +1 -0
  127. package/dist/esm/lib/parsers/helpers/normalize-3d-tile-normals.js +26 -0
  128. package/dist/esm/lib/parsers/helpers/normalize-3d-tile-normals.js.map +1 -0
  129. package/dist/esm/lib/parsers/helpers/normalize-3d-tile-positions.js +26 -0
  130. package/dist/esm/lib/parsers/helpers/normalize-3d-tile-positions.js.map +1 -0
  131. package/dist/esm/lib/parsers/helpers/parse-3d-implicit-tiles.js +241 -0
  132. package/dist/esm/lib/parsers/helpers/parse-3d-implicit-tiles.js.map +1 -0
  133. package/dist/esm/lib/parsers/helpers/parse-3d-tile-gltf-view.js +59 -0
  134. package/dist/esm/lib/parsers/helpers/parse-3d-tile-gltf-view.js.map +1 -0
  135. package/dist/esm/lib/parsers/helpers/parse-3d-tile-header.js +16 -0
  136. package/dist/esm/lib/parsers/helpers/parse-3d-tile-header.js.map +1 -0
  137. package/dist/esm/lib/parsers/helpers/parse-3d-tile-subtree.js +67 -0
  138. package/dist/esm/lib/parsers/helpers/parse-3d-tile-subtree.js.map +1 -0
  139. package/dist/esm/lib/parsers/helpers/parse-3d-tile-tables.js +80 -0
  140. package/dist/esm/lib/parsers/helpers/parse-3d-tile-tables.js.map +1 -0
  141. package/dist/esm/lib/parsers/helpers/parse-utils.js +20 -0
  142. package/dist/esm/lib/parsers/helpers/parse-utils.js.map +1 -0
  143. package/dist/esm/lib/parsers/parse-3d-tile-batched-model.js +25 -0
  144. package/dist/esm/lib/parsers/parse-3d-tile-batched-model.js.map +1 -0
  145. package/dist/esm/lib/parsers/parse-3d-tile-composite.js +15 -0
  146. package/dist/esm/lib/parsers/parse-3d-tile-composite.js.map +1 -0
  147. package/dist/esm/lib/parsers/parse-3d-tile-gltf.js +10 -0
  148. package/dist/esm/lib/parsers/parse-3d-tile-gltf.js.map +1 -0
  149. package/dist/esm/lib/parsers/parse-3d-tile-header.js +164 -0
  150. package/dist/esm/lib/parsers/parse-3d-tile-header.js.map +1 -0
  151. package/dist/esm/lib/parsers/parse-3d-tile-instanced-model.js +147 -0
  152. package/dist/{lib → esm/lib}/parsers/parse-3d-tile-instanced-model.js.map +1 -1
  153. package/dist/esm/lib/parsers/parse-3d-tile-point-cloud.js +211 -0
  154. package/dist/esm/lib/parsers/parse-3d-tile-point-cloud.js.map +1 -0
  155. package/dist/esm/lib/parsers/parse-3d-tile.js +30 -0
  156. package/dist/esm/lib/parsers/parse-3d-tile.js.map +1 -0
  157. package/dist/esm/lib/utils/obb/s2-corners-to-obb.js +23 -0
  158. package/dist/esm/lib/utils/obb/s2-corners-to-obb.js.map +1 -0
  159. package/dist/esm/lib/utils/s2/converters/s2-to-boundary.js +40 -0
  160. package/dist/esm/lib/utils/s2/converters/s2-to-boundary.js.map +1 -0
  161. package/dist/esm/lib/utils/s2/converters/s2-to-obb-points.js +24 -0
  162. package/dist/esm/lib/utils/s2/converters/s2-to-obb-points.js.map +1 -0
  163. package/dist/esm/lib/utils/s2/converters/s2-to-region.js +42 -0
  164. package/dist/esm/lib/utils/s2/converters/s2-to-region.js.map +1 -0
  165. package/dist/esm/lib/utils/s2/index.js +7 -0
  166. package/dist/esm/lib/utils/s2/index.js.map +1 -0
  167. package/dist/esm/lib/utils/s2/s2-geometry-functions.js +12 -0
  168. package/dist/esm/lib/utils/s2/s2-geometry-functions.js.map +1 -0
  169. package/dist/esm/lib/utils/s2/s2-token-functions.js +32 -0
  170. package/dist/esm/lib/utils/s2/s2-token-functions.js.map +1 -0
  171. package/dist/esm/lib/utils/s2/s2geometry/s2-cell-utils.js +15 -0
  172. package/dist/esm/lib/utils/s2/s2geometry/s2-cell-utils.js.map +1 -0
  173. package/dist/esm/lib/utils/s2/s2geometry/s2-geometry.js +186 -0
  174. package/dist/esm/lib/utils/s2/s2geometry/s2-geometry.js.map +1 -0
  175. package/dist/esm/lib/utils/version.js +2 -0
  176. package/dist/esm/lib/utils/version.js.map +1 -0
  177. package/dist/esm/tile-3d-subtree-loader.js +14 -0
  178. package/dist/esm/tile-3d-subtree-loader.js.map +1 -0
  179. package/dist/esm/tile-3d-writer.js +19 -0
  180. package/dist/esm/tile-3d-writer.js.map +1 -0
  181. package/dist/esm/tiles-3d-loader.js +64 -0
  182. package/dist/esm/tiles-3d-loader.js.map +1 -0
  183. package/dist/esm/types.js +2 -0
  184. package/dist/esm/types.js.map +1 -0
  185. package/dist/index.d.ts +1 -1
  186. package/dist/index.d.ts.map +1 -1
  187. package/dist/index.js +26 -9
  188. package/dist/lib/classes/helpers/tile-3d-accessor-utils.d.ts +1 -1
  189. package/dist/lib/classes/helpers/tile-3d-accessor-utils.js +106 -89
  190. package/dist/lib/classes/tile-3d-batch-table-hierarchy.js +184 -202
  191. package/dist/lib/classes/tile-3d-batch-table.d.ts +1 -1
  192. package/dist/lib/classes/tile-3d-batch-table.js +223 -282
  193. package/dist/lib/classes/tile-3d-feature-table.js +64 -86
  194. package/dist/lib/constants.js +23 -19
  195. package/dist/lib/encoders/encode-3d-tile-batched-model.js +45 -45
  196. package/dist/lib/encoders/encode-3d-tile-composite.js +23 -24
  197. package/dist/lib/encoders/encode-3d-tile-instanced-model.js +37 -37
  198. package/dist/lib/encoders/encode-3d-tile-point-cloud.js +36 -38
  199. package/dist/lib/encoders/encode-3d-tile.js +30 -32
  200. package/dist/lib/encoders/helpers/encode-3d-tile-header.js +28 -29
  201. package/dist/lib/ion/ion.js +60 -69
  202. package/dist/lib/parsers/helpers/normalize-3d-tile-colors.js +60 -62
  203. package/dist/lib/parsers/helpers/normalize-3d-tile-normals.js +26 -26
  204. package/dist/lib/parsers/helpers/normalize-3d-tile-positions.js +39 -28
  205. package/dist/lib/parsers/helpers/parse-3d-implicit-tiles.d.ts +11 -0
  206. package/dist/lib/parsers/helpers/parse-3d-implicit-tiles.d.ts.map +1 -1
  207. package/dist/lib/parsers/helpers/parse-3d-implicit-tiles.js +247 -203
  208. package/dist/lib/parsers/helpers/parse-3d-tile-gltf-view.js +82 -63
  209. package/dist/lib/parsers/helpers/parse-3d-tile-header.js +26 -15
  210. package/dist/lib/parsers/helpers/parse-3d-tile-subtree.d.ts +2 -1
  211. package/dist/lib/parsers/helpers/parse-3d-tile-subtree.d.ts.map +1 -1
  212. package/dist/lib/parsers/helpers/parse-3d-tile-subtree.js +98 -58
  213. package/dist/lib/parsers/helpers/parse-3d-tile-tables.js +84 -80
  214. package/dist/lib/parsers/helpers/parse-utils.js +29 -16
  215. package/dist/lib/parsers/parse-3d-tile-batched-model.js +30 -26
  216. package/dist/lib/parsers/parse-3d-tile-composite.js +25 -16
  217. package/dist/lib/parsers/parse-3d-tile-gltf.d.ts +1 -1
  218. package/dist/lib/parsers/parse-3d-tile-gltf.d.ts.map +1 -1
  219. package/dist/lib/parsers/parse-3d-tile-gltf.js +17 -9
  220. package/dist/lib/parsers/parse-3d-tile-header.d.ts +5 -4
  221. package/dist/lib/parsers/parse-3d-tile-header.d.ts.map +1 -1
  222. package/dist/lib/parsers/parse-3d-tile-header.js +166 -138
  223. package/dist/lib/parsers/parse-3d-tile-instanced-model.js +179 -170
  224. package/dist/lib/parsers/parse-3d-tile-point-cloud.js +350 -184
  225. package/dist/lib/parsers/parse-3d-tile.js +36 -31
  226. package/dist/lib/utils/obb/s2-corners-to-obb.d.ts +15 -0
  227. package/dist/lib/utils/obb/s2-corners-to-obb.d.ts.map +1 -0
  228. package/dist/lib/utils/obb/s2-corners-to-obb.js +37 -0
  229. package/dist/lib/utils/s2/converters/s2-to-boundary.d.ts +9 -0
  230. package/dist/lib/utils/s2/converters/s2-to-boundary.d.ts.map +1 -0
  231. package/dist/lib/utils/s2/converters/s2-to-boundary.js +61 -0
  232. package/dist/lib/utils/s2/converters/s2-to-obb-points.d.ts +15 -0
  233. package/dist/lib/utils/s2/converters/s2-to-obb-points.d.ts.map +1 -0
  234. package/dist/lib/utils/s2/converters/s2-to-obb-points.js +36 -0
  235. package/dist/lib/utils/s2/converters/s2-to-region.d.ts +13 -0
  236. package/dist/lib/utils/s2/converters/s2-to-region.d.ts.map +1 -0
  237. package/dist/lib/utils/s2/converters/s2-to-region.js +59 -0
  238. package/dist/lib/utils/s2/index.d.ts +8 -0
  239. package/dist/lib/utils/s2/index.d.ts.map +1 -0
  240. package/dist/lib/utils/s2/index.js +23 -0
  241. package/dist/lib/utils/s2/s2-geometry-functions.d.ts +14 -0
  242. package/dist/lib/utils/s2/s2-geometry-functions.d.ts.map +1 -0
  243. package/dist/lib/utils/s2/s2-geometry-functions.js +29 -0
  244. package/dist/lib/utils/s2/s2-token-functions.d.ts +23 -0
  245. package/dist/lib/utils/s2/s2-token-functions.d.ts.map +1 -0
  246. package/dist/lib/utils/s2/s2-token-functions.js +68 -0
  247. package/dist/lib/utils/s2/s2geometry/s2-cell-utils.d.ts +14 -0
  248. package/dist/lib/utils/s2/s2geometry/s2-cell-utils.d.ts.map +1 -0
  249. package/dist/lib/utils/s2/s2geometry/s2-cell-utils.js +32 -0
  250. package/dist/lib/utils/s2/s2geometry/s2-geometry.d.ts +52 -0
  251. package/dist/lib/utils/s2/s2geometry/s2-geometry.d.ts.map +1 -0
  252. package/dist/lib/utils/s2/s2geometry/s2-geometry.js +260 -0
  253. package/dist/lib/utils/version.js +7 -2
  254. package/dist/tile-3d-subtree-loader.js +22 -13
  255. package/dist/tile-3d-writer.js +24 -17
  256. package/dist/tiles-3d-loader.d.ts.map +1 -1
  257. package/dist/tiles-3d-loader.js +63 -69
  258. package/dist/types.d.ts +28 -15
  259. package/dist/types.d.ts.map +1 -1
  260. package/dist/types.js +2 -2
  261. package/package.json +12 -11
  262. package/src/cesium-ion-loader.ts +1 -0
  263. package/src/index.ts +1 -1
  264. package/src/lib/parsers/helpers/parse-3d-implicit-tiles.ts +104 -27
  265. package/src/lib/parsers/helpers/parse-3d-tile-subtree.ts +50 -7
  266. package/src/lib/parsers/parse-3d-tile-header.ts +91 -23
  267. package/src/lib/utils/obb/s2-corners-to-obb.ts +51 -0
  268. package/src/lib/utils/s2/converters/s2-to-boundary.ts +67 -0
  269. package/src/lib/utils/s2/converters/s2-to-obb-points.ts +46 -0
  270. package/src/lib/utils/s2/converters/s2-to-region.ts +69 -0
  271. package/src/lib/utils/s2/index.ts +17 -0
  272. package/src/lib/utils/s2/s2-geometry-functions.ts +28 -0
  273. package/src/lib/utils/s2/s2-token-functions.ts +67 -0
  274. package/src/lib/utils/s2/s2geometry/s2-cell-utils.ts +33 -0
  275. package/src/lib/utils/s2/s2geometry/s2-geometry.ts +296 -0
  276. package/src/tiles-3d-loader.ts +2 -16
  277. package/src/types.ts +20 -5
  278. package/dist/bundle.js.map +0 -1
  279. package/dist/cesium-ion-loader.js.map +0 -1
  280. package/dist/index.js.map +0 -1
  281. package/dist/lib/classes/helpers/tile-3d-accessor-utils.js.map +0 -1
  282. package/dist/lib/classes/tile-3d-batch-table-hierarchy.js.map +0 -1
  283. package/dist/lib/classes/tile-3d-batch-table.js.map +0 -1
  284. package/dist/lib/classes/tile-3d-feature-table.js.map +0 -1
  285. package/dist/lib/constants.js.map +0 -1
  286. package/dist/lib/encoders/encode-3d-tile-batched-model.js.map +0 -1
  287. package/dist/lib/encoders/encode-3d-tile-composite.js.map +0 -1
  288. package/dist/lib/encoders/encode-3d-tile-instanced-model.js.map +0 -1
  289. package/dist/lib/encoders/encode-3d-tile-point-cloud.js.map +0 -1
  290. package/dist/lib/encoders/encode-3d-tile.js.map +0 -1
  291. package/dist/lib/encoders/helpers/encode-3d-tile-header.js.map +0 -1
  292. package/dist/lib/ion/ion.js.map +0 -1
  293. package/dist/lib/parsers/helpers/normalize-3d-tile-colors.js.map +0 -1
  294. package/dist/lib/parsers/helpers/normalize-3d-tile-normals.js.map +0 -1
  295. package/dist/lib/parsers/helpers/normalize-3d-tile-positions.js.map +0 -1
  296. package/dist/lib/parsers/helpers/parse-3d-implicit-tiles.js.map +0 -1
  297. package/dist/lib/parsers/helpers/parse-3d-tile-gltf-view.js.map +0 -1
  298. package/dist/lib/parsers/helpers/parse-3d-tile-header.js.map +0 -1
  299. package/dist/lib/parsers/helpers/parse-3d-tile-subtree.js.map +0 -1
  300. package/dist/lib/parsers/helpers/parse-3d-tile-tables.js.map +0 -1
  301. package/dist/lib/parsers/helpers/parse-utils.js.map +0 -1
  302. package/dist/lib/parsers/parse-3d-tile-batched-model.js.map +0 -1
  303. package/dist/lib/parsers/parse-3d-tile-composite.js.map +0 -1
  304. package/dist/lib/parsers/parse-3d-tile-gltf.js.map +0 -1
  305. package/dist/lib/parsers/parse-3d-tile-header.js.map +0 -1
  306. package/dist/lib/parsers/parse-3d-tile-point-cloud.js.map +0 -1
  307. package/dist/lib/parsers/parse-3d-tile.js.map +0 -1
  308. package/dist/lib/utils/version.js.map +0 -1
  309. package/dist/tile-3d-subtree-loader.js.map +0 -1
  310. package/dist/tile-3d-writer.js.map +0 -1
  311. package/dist/tiles-3d-loader.js.map +0 -1
  312. package/dist/types.js.map +0 -1
  313. /package/src/lib/parsers/{parse-3d-tile-gltf.js → parse-3d-tile-gltf.ts} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loaders.gl/3d-tiles",
3
- "version": "4.0.0-alpha.5",
3
+ "version": "4.0.0-alpha.6",
4
4
  "description": "3D Tiles, an open standard for streaming massive heterogeneous 3D geospatial datasets.",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -21,8 +21,8 @@
21
21
  "pointcloud"
22
22
  ],
23
23
  "types": "dist/index.d.ts",
24
- "main": "dist/index.js",
25
- "module": "dist/index.js",
24
+ "main": "dist/es5/index.js",
25
+ "module": "dist/esm/index.js",
26
26
  "sideEffects": false,
27
27
  "files": [
28
28
  "src",
@@ -34,16 +34,17 @@
34
34
  "build-bundle": "esbuild src/bundle.ts --bundle --outfile=dist/dist.min.js"
35
35
  },
36
36
  "dependencies": {
37
- "@loaders.gl/draco": "4.0.0-alpha.5",
38
- "@loaders.gl/gltf": "4.0.0-alpha.5",
39
- "@loaders.gl/loader-utils": "4.0.0-alpha.5",
40
- "@loaders.gl/math": "4.0.0-alpha.5",
41
- "@loaders.gl/tiles": "4.0.0-alpha.5",
37
+ "@loaders.gl/draco": "4.0.0-alpha.6",
38
+ "@loaders.gl/gltf": "4.0.0-alpha.6",
39
+ "@loaders.gl/loader-utils": "4.0.0-alpha.6",
40
+ "@loaders.gl/math": "4.0.0-alpha.6",
41
+ "@loaders.gl/tiles": "4.0.0-alpha.6",
42
42
  "@math.gl/core": "^3.5.1",
43
- "@math.gl/geospatial": "^3.5.1"
43
+ "@math.gl/geospatial": "^3.5.1",
44
+ "long": "^5.2.1"
44
45
  },
45
46
  "peerDependencies": {
46
- "@loaders.gl/core": "4.0.0-alpha.4"
47
+ "@loaders.gl/core": "4.0.0-alpha.5"
47
48
  },
48
- "gitHead": "7a71a54bdf1ddf985cc3af3db90b82e7fa97d025"
49
+ "gitHead": "acc1985050dfaa0f1f0c066f8da5bce7454a046c"
49
50
  }
@@ -33,6 +33,7 @@ export const CesiumIonLoader: LoaderWithParser = {
33
33
  },
34
34
  options: {
35
35
  'cesium-ion': {
36
+ // @ts-expect-error
36
37
  ...Tiles3DLoader.options['3d-tiles'],
37
38
  accessToken: null
38
39
  }
package/src/index.ts CHANGED
@@ -13,4 +13,4 @@ export {default as Tile3DBatchTable} from './lib/classes/tile-3d-batch-table';
13
13
  // EXPERIMENTAL
14
14
  export {TILE3D_TYPE} from './lib/constants';
15
15
  export {getIonTilesetMetadata as _getIonTilesetMetadata} from './lib/ion/ion';
16
- export type {BatchTableJson, B3DMContent, Node3D} from './types';
16
+ export type {FeatureTableJson, B3DMContent, Node3D, ImplicitTilingExtension} from './types';
@@ -2,6 +2,11 @@ import type {Availability, BoundingVolume, Subtree} from '../../../types';
2
2
  import {Tile3DSubtreeLoader} from '../../../tile-3d-subtree-loader';
3
3
  import {load} from '@loaders.gl/core';
4
4
 
5
+ import {getS2CellIdFromToken, getS2ChildCellId, getS2TokenFromCellId} from '../../utils/s2/index';
6
+ import type {S2VolumeInfo} from '../../utils/obb/s2-corners-to-obb';
7
+ import {convertS2BoundingVolumetoOBB} from '../../utils/obb/s2-corners-to-obb';
8
+ import Long from 'long';
9
+
5
10
  const QUADTREE_DEVISION_COUNT = 4;
6
11
  const OCTREE_DEVISION_COUNT = 8;
7
12
 
@@ -10,6 +15,59 @@ const SUBDIVISION_COUNT_MAP = {
10
15
  OCTREE: OCTREE_DEVISION_COUNT
11
16
  };
12
17
 
18
+ /**
19
+ * S2VolumeBox is an extention of BoundingVolume of type "box"
20
+ */
21
+ export type S2VolumeBox = {
22
+ /** BoundingVolume of type "box" has the "box" field. S2VolumeBox contains it as well. */
23
+ box: number[];
24
+ /** s2VolumeInfo provides additional info about the box - specifically the token, min and max height */
25
+ s2VolumeInfo: S2VolumeInfo;
26
+ };
27
+
28
+ function getChildS2VolumeBox(
29
+ s2VolumeBox: S2VolumeBox | undefined,
30
+ index: number,
31
+ subdivisionScheme: string
32
+ ): S2VolumeBox | undefined {
33
+ if (s2VolumeBox?.box) {
34
+ // Check if the BoundingVolume is of type "box"
35
+ const cellId: Long = getS2CellIdFromToken(s2VolumeBox.s2VolumeInfo.token);
36
+ const childCellId = getS2ChildCellId(cellId, index);
37
+ const childToken = getS2TokenFromCellId(childCellId);
38
+
39
+ // Clone object. Note, s2VolumeInfo is a plain object that doesn't contain any nested object.
40
+ // So, we can use the Spread Operator to make a shallow copy of the object.
41
+ const s2ChildVolumeInfo: S2VolumeInfo = {...s2VolumeBox.s2VolumeInfo};
42
+ s2ChildVolumeInfo.token = childToken; // replace the token with the child's one
43
+
44
+ // In case of QUADTREE the sizeZ should NOT be changed!
45
+ // https://portal.ogc.org/files/102132
46
+ // A quadtree divides space only on the x and y dimensions.
47
+ // It divides each tile into 4 smaller tiles where the x and y dimensions are halved.
48
+ // The quadtree z minimum and maximum remain unchanged.
49
+ switch (subdivisionScheme) {
50
+ case 'OCTREE':
51
+ const s2VolumeInfo: S2VolumeInfo = s2VolumeBox.s2VolumeInfo;
52
+ const delta = s2VolumeInfo.maximumHeight - s2VolumeInfo.minimumHeight;
53
+ const sizeZ: number = delta / 2.0; // It's a next level (a child)
54
+ const midZ: number = s2VolumeInfo.minimumHeight + delta / 2.0;
55
+ s2VolumeInfo.minimumHeight = midZ - sizeZ;
56
+ s2VolumeInfo.maximumHeight = midZ + sizeZ;
57
+ break;
58
+ default:
59
+ break;
60
+ }
61
+ const box = convertS2BoundingVolumetoOBB(s2ChildVolumeInfo);
62
+ const childS2VolumeBox: S2VolumeBox = {
63
+ box,
64
+ s2VolumeInfo: s2ChildVolumeInfo
65
+ };
66
+ return childS2VolumeBox;
67
+ }
68
+ return undefined;
69
+ }
70
+
13
71
  /**
14
72
  * Recursively parse implicit tiles tree
15
73
  * Spec - https://github.com/CesiumGS/3d-tiles/tree/main/extensions/3DTILES_implicit_tiling
@@ -30,6 +88,7 @@ export async function parseImplicitTiles(params: {
30
88
  childIndex?: number;
31
89
  level?: number;
32
90
  globalData?: {level: number; mortonIndex: number; x: number; y: number; z: number};
91
+ s2VolumeBox?: S2VolumeBox;
33
92
  }) {
34
93
  const {
35
94
  options,
@@ -46,7 +105,8 @@ export async function parseImplicitTiles(params: {
46
105
  x: 0,
47
106
  y: 0,
48
107
  z: 0
49
- }
108
+ },
109
+ s2VolumeBox
50
110
  } = params;
51
111
  let {subtree, level = 0} = params;
52
112
  const {
@@ -75,15 +135,6 @@ export async function parseImplicitTiles(params: {
75
135
  let childTileY = concatBits(parentData.y, childY);
76
136
  let childTileZ = concatBits(parentData.z, childZ);
77
137
 
78
- // TODO Remove after real implicit tileset will be tested.
79
- // Degug data
80
- // tile.level = level + globalData.level;
81
- // tile.x = concatBits(globalData.x, childTileX);
82
- // tile.y = concatBits(globalData.y, childTileY);
83
- // tile.z = concatBits(globalData.z, childTileZ);
84
- // tile.mortonIndex = childTileMortonIndex;
85
- // End of debug data
86
-
87
138
  let isChildSubtreeAvailable = false;
88
139
 
89
140
  if (level + 1 > subtreeLevels) {
@@ -138,19 +189,33 @@ export async function parseImplicitTiles(params: {
138
189
  const pData = {mortonIndex: childTileMortonIndex, x: childTileX, y: childTileY, z: childTileZ};
139
190
 
140
191
  for (let index = 0; index < childrenPerTile; index++) {
141
- const currentTile = await parseImplicitTiles({
192
+ const childS2VolumeBox: S2VolumeBox | undefined = getChildS2VolumeBox(
193
+ s2VolumeBox,
194
+ index,
195
+ subdivisionScheme
196
+ );
197
+
198
+ // Recursive calling...
199
+ const childTileParsed = await parseImplicitTiles({
142
200
  subtree,
143
201
  options,
144
202
  parentData: pData,
145
203
  childIndex: index,
146
204
  level: childTileLevel,
147
- globalData
205
+ globalData,
206
+ s2VolumeBox: childS2VolumeBox
148
207
  });
149
208
 
150
- if (currentTile.contentUrl || currentTile.children.length) {
209
+ if (childTileParsed.contentUrl || childTileParsed.children.length) {
151
210
  const globalLevel = lev + 1;
152
211
  const childCoordinates = {childTileX, childTileY, childTileZ};
153
- const formattedTile = formatTileData(currentTile, globalLevel, childCoordinates, options);
212
+ const formattedTile = formatTileData(
213
+ childTileParsed,
214
+ globalLevel,
215
+ childCoordinates,
216
+ options,
217
+ s2VolumeBox
218
+ );
154
219
  // @ts-ignore
155
220
  tile.children.push(formattedTile);
156
221
  }
@@ -183,7 +248,8 @@ function formatTileData(
183
248
  tile,
184
249
  level: number,
185
250
  childCoordinates: {childTileX: number; childTileY: number; childTileZ: number},
186
- options: any
251
+ options: any,
252
+ s2VolumeBox?: S2VolumeBox
187
253
  ) {
188
254
  const {
189
255
  basePath,
@@ -196,9 +262,14 @@ function formatTileData(
196
262
  } = options;
197
263
  const uri = tile.contentUrl && tile.contentUrl.replace(`${basePath}/`, '');
198
264
  const lodMetricValue = rootLodMetricValue / 2 ** level;
199
- const boundingVolume = calculateBoundingVolumeForChildTile(
265
+
266
+ const boundingVolume: BoundingVolume = s2VolumeBox?.box
267
+ ? {box: s2VolumeBox.box}
268
+ : rootBoundingVolume;
269
+
270
+ const boundingVolumeForChildTile = calculateBoundingVolumeForChildTile(
200
271
  level,
201
- rootBoundingVolume,
272
+ boundingVolume,
202
273
  childCoordinates
203
274
  );
204
275
 
@@ -211,12 +282,9 @@ function formatTileData(
211
282
  type: getTileType(tile),
212
283
  lodMetricType,
213
284
  lodMetricValue,
214
- boundingVolume
215
- // Temp debug values. Remove when real implicit tileset will be tested.
216
- // x: tile.x,
217
- // y: tile.y,
218
- // z: tile.z,
219
- // level: tile.level
285
+ geometricError: lodMetricValue,
286
+ transform: tile.transform,
287
+ boundingVolume: boundingVolumeForChildTile
220
288
  };
221
289
  }
222
290
 
@@ -231,7 +299,7 @@ function calculateBoundingVolumeForChildTile(
231
299
  level: number,
232
300
  rootBoundingVolume: BoundingVolume,
233
301
  childCoordinates: {childTileX: number; childTileY: number; childTileZ: number}
234
- ): BoundingVolume | null {
302
+ ): BoundingVolume {
235
303
  if (rootBoundingVolume.region) {
236
304
  const {childTileX, childTileY, childTileZ} = childCoordinates;
237
305
  const [west, south, east, north, minimumHeight, maximumHeight] = rootBoundingVolume.region;
@@ -239,6 +307,13 @@ function calculateBoundingVolumeForChildTile(
239
307
 
240
308
  const sizeX = (east - west) / boundingVolumesCount;
241
309
  const sizeY = (north - south) / boundingVolumesCount;
310
+
311
+ // TODO : Why is the subdivisionScheme not being checked here?
312
+
313
+ // In case of QUADTREE the sizeZ should NOT be changed!
314
+ // https://portal.ogc.org/files/102132
315
+ // A quadtree divides space only on the x and y dimensions. It divides each tile into 4 smaller tiles where the x and y dimensions are halved. The quadtree z minimum and maximum remain unchanged.
316
+
242
317
  const sizeZ = (maximumHeight - minimumHeight) / boundingVolumesCount;
243
318
 
244
319
  const [childWest, childEast] = [west + sizeX * childTileX, west + sizeX * (childTileX + 1)];
@@ -253,9 +328,11 @@ function calculateBoundingVolumeForChildTile(
253
328
  };
254
329
  }
255
330
 
256
- // eslint-disable-next-line no-console
257
- console.warn('Unsupported bounding volume type: ', rootBoundingVolume);
258
- return null;
331
+ if (rootBoundingVolume.box) {
332
+ return rootBoundingVolume;
333
+ }
334
+
335
+ throw new Error(`Unsupported bounding volume type ${rootBoundingVolume}`);
259
336
  }
260
337
 
261
338
  /**
@@ -1,5 +1,5 @@
1
1
  import type {Subtree, ExplicitBitstream} from '../../../types';
2
- import {fetchFile} from '@loaders.gl/core';
2
+ import type {LoaderContext, LoaderOptions} from '@loaders.gl/loader-utils';
3
3
 
4
4
  const SUBTREE_FILE_MAGIC = 0x74627573;
5
5
  const SUBTREE_FILE_VERSION = 1;
@@ -11,7 +11,11 @@ const SUBTREE_FILE_VERSION = 1;
11
11
  * @returns
12
12
  */
13
13
  // eslint-disable-next-line max-statements
14
- export default async function parse3DTilesSubtree(data: ArrayBuffer): Promise<Subtree> {
14
+ export default async function parse3DTilesSubtree(
15
+ data: ArrayBuffer,
16
+ options: LoaderOptions | undefined,
17
+ context: LoaderContext | undefined
18
+ ): Promise<Subtree> {
15
19
  const magic = new Uint32Array(data.slice(0, 4));
16
20
 
17
21
  if (magic[0] !== SUBTREE_FILE_MAGIC) {
@@ -42,7 +46,8 @@ export default async function parse3DTilesSubtree(data: ArrayBuffer): Promise<Su
42
46
  subtree.tileAvailability.explicitBitstream = await getExplicitBitstream(
43
47
  subtree,
44
48
  'tileAvailability',
45
- internalBinaryBuffer
49
+ internalBinaryBuffer,
50
+ context
46
51
  );
47
52
  }
48
53
 
@@ -50,7 +55,8 @@ export default async function parse3DTilesSubtree(data: ArrayBuffer): Promise<Su
50
55
  subtree.contentAvailability.explicitBitstream = await getExplicitBitstream(
51
56
  subtree,
52
57
  'contentAvailability',
53
- internalBinaryBuffer
58
+ internalBinaryBuffer,
59
+ context
54
60
  );
55
61
  }
56
62
 
@@ -58,13 +64,40 @@ export default async function parse3DTilesSubtree(data: ArrayBuffer): Promise<Su
58
64
  subtree.childSubtreeAvailability.explicitBitstream = await getExplicitBitstream(
59
65
  subtree,
60
66
  'childSubtreeAvailability',
61
- internalBinaryBuffer
67
+ internalBinaryBuffer,
68
+ context
62
69
  );
63
70
  }
64
71
 
65
72
  return subtree;
66
73
  }
67
74
 
75
+ /**
76
+ * Get url for bitstream downloading
77
+ * @param bitstreamRelativeUri
78
+ * @param baseUri
79
+ * @returns
80
+ */
81
+ function resolveBufferUri(bitstreamRelativeUri: string, basePath: string): string {
82
+ const hasProtocol = basePath.startsWith('http');
83
+
84
+ if (hasProtocol) {
85
+ const resolvedUri = new URL(bitstreamRelativeUri, basePath);
86
+ return decodeURI(resolvedUri.toString());
87
+ }
88
+
89
+ /**
90
+ * Adding http protocol only for new URL constructor usage.
91
+ * It allows to resolve relative paths like ../../example with basePath.
92
+ */
93
+ const basePathWithProtocol = `http://${basePath}`;
94
+ const resolvedUri = new URL(bitstreamRelativeUri, basePathWithProtocol);
95
+ /**
96
+ * Drop protocol and use just relative path.
97
+ */
98
+ return `/${resolvedUri.host}${resolvedUri.pathname}`;
99
+ }
100
+
68
101
  /**
69
102
  * Get explicit bitstream for subtree availability data.
70
103
  * @param subtree
@@ -74,15 +107,25 @@ export default async function parse3DTilesSubtree(data: ArrayBuffer): Promise<Su
74
107
  async function getExplicitBitstream(
75
108
  subtree: Subtree,
76
109
  name: string,
77
- internalBinaryBuffer: ArrayBuffer
110
+ internalBinaryBuffer: ArrayBuffer,
111
+ context: LoaderContext | undefined
78
112
  ): Promise<ExplicitBitstream> {
79
113
  const bufferViewIndex = subtree[name].bufferView;
80
114
  const bufferView = subtree.bufferViews[bufferViewIndex];
81
115
  const buffer = subtree.buffers[bufferView.buffer];
82
116
 
117
+ if (!context?.url || !context.fetch) {
118
+ throw new Error('Url is not provided');
119
+ }
120
+
121
+ if (!context.fetch) {
122
+ throw new Error('fetch is not provided');
123
+ }
124
+
83
125
  // External bitstream loading
84
126
  if (buffer.uri) {
85
- const response = await fetchFile(buffer.uri);
127
+ const bufferUri = resolveBufferUri(buffer.uri, context?.url);
128
+ const response = await context.fetch(bufferUri);
86
129
  const data = await response.arrayBuffer();
87
130
  // Return view of bitstream.
88
131
  return new Uint8Array(data, bufferView.byteOffset, bufferView.byteLength);
@@ -1,8 +1,12 @@
1
+ import type {LoaderOptions} from '@loaders.gl/loader-utils';
1
2
  import {Tile3DSubtreeLoader} from '../../tile-3d-subtree-loader';
2
3
  import {load} from '@loaders.gl/core';
3
- import {Tileset3D, LOD_METRIC_TYPE, TILE_REFINEMENT, TILE_TYPE} from '@loaders.gl/tiles';
4
- import {Subtree} from '../../types';
4
+ import {Tileset3D, LOD_METRIC_TYPE, TILE_REFINEMENT, TILE_TYPE, Tile3D} from '@loaders.gl/tiles';
5
+ import {ImplicitTilingExtension, Subtree} from '../../types';
6
+ import type {S2VolumeBox} from './helpers/parse-3d-implicit-tiles';
5
7
  import {parseImplicitTiles, replaceContentUrlTemplate} from './helpers/parse-3d-implicit-tiles';
8
+ import type {S2VolumeInfo} from '../utils/obb/s2-corners-to-obb';
9
+ import {convertS2BoundingVolumetoOBB} from '../utils/obb/s2-corners-to-obb';
6
10
 
7
11
  function getTileType(tile) {
8
12
  if (!tile.contentUrl) {
@@ -37,13 +41,27 @@ function getRefine(refine) {
37
41
  }
38
42
  }
39
43
 
44
+ function resolveUri(uri, basePath) {
45
+ // url scheme per RFC3986
46
+ const urlSchemeRegex = /^[a-z][0-9a-z+.-]*:/i;
47
+
48
+ if (urlSchemeRegex.test(basePath)) {
49
+ const url = new URL(uri, `${basePath}/`);
50
+ return decodeURI(url.toString());
51
+ } else if (uri.startsWith('/')) {
52
+ return uri;
53
+ }
54
+
55
+ return `${basePath}/${uri}`;
56
+ }
57
+
40
58
  export function normalizeTileData(tile, options) {
41
59
  if (!tile) {
42
60
  return null;
43
61
  }
44
62
  if (tile.content) {
45
63
  const contentUri = tile.content.uri || tile.content.url;
46
- tile.contentUrl = `${options.basePath}/${contentUri}`;
64
+ tile.contentUrl = resolveUri(contentUri, options.basePath);
47
65
  }
48
66
  tile.id = tile.contentUrl;
49
67
  tile.lodMetricType = LOD_METRIC_TYPE.GEOMETRIC_ERROR;
@@ -56,9 +74,24 @@ export function normalizeTileData(tile, options) {
56
74
  }
57
75
 
58
76
  // normalize tile headers
59
- export function normalizeTileHeaders(tileset) {
77
+ export async function normalizeTileHeaders(
78
+ tileset: Tileset3D,
79
+ options: LoaderOptions
80
+ ): Promise<Tileset3D> {
60
81
  const basePath = tileset.basePath;
61
- const root = normalizeTileData(tileset.root, tileset);
82
+ let root: Tileset3D;
83
+
84
+ const rootImplicitTilingExtension = getImplicitTilingExtensionData(tileset?.root);
85
+ if (rootImplicitTilingExtension && tileset.root) {
86
+ root = await normalizeImplicitTileHeaders(
87
+ tileset.root,
88
+ tileset,
89
+ rootImplicitTilingExtension,
90
+ options
91
+ );
92
+ } else {
93
+ root = normalizeTileData(tileset.root, tileset);
94
+ }
62
95
 
63
96
  const stack: any[] = [];
64
97
  stack.push(root);
@@ -66,8 +99,19 @@ export function normalizeTileHeaders(tileset) {
66
99
  while (stack.length > 0) {
67
100
  const tile = stack.pop() || {};
68
101
  const children = tile.children || [];
69
- for (const childHeader of children) {
70
- normalizeTileData(childHeader, {basePath});
102
+ for (let childHeader of children) {
103
+ const childImplicitTilingExtension = getImplicitTilingExtensionData(childHeader);
104
+ if (childImplicitTilingExtension) {
105
+ childHeader = await normalizeImplicitTileHeaders(
106
+ childHeader,
107
+ tileset,
108
+ childImplicitTilingExtension,
109
+ options
110
+ );
111
+ } else {
112
+ normalizeTileData(childHeader, {basePath});
113
+ }
114
+
71
115
  stack.push(childHeader);
72
116
  }
73
117
  }
@@ -80,29 +124,38 @@ export function normalizeTileHeaders(tileset) {
80
124
  * TODO Check if Tile3D class can be a return type here.
81
125
  * @param tileset
82
126
  */
83
- export async function normalizeImplicitTileHeaders(tileset: Tileset3D) {
84
- if (!tileset.root) {
85
- return null;
86
- }
87
-
127
+ export async function normalizeImplicitTileHeaders(
128
+ tile: Tile3D,
129
+ tileset: Tileset3D,
130
+ implicitTilingExtension: ImplicitTilingExtension,
131
+ options: LoaderOptions
132
+ ) {
88
133
  const basePath = tileset.basePath;
89
- const implicitTilingExtension = tileset.root.extensions['3DTILES_implicit_tiling'];
90
134
  const {
91
135
  subdivisionScheme,
92
136
  maximumLevel,
93
137
  subtreeLevels,
94
138
  subtrees: {uri: subtreesUriTemplate}
95
139
  } = implicitTilingExtension;
96
- const subtreeUrl = replaceContentUrlTemplate(subtreesUriTemplate, 0, 0, 0, 0);
97
- const rootSubtreeUrl = `${basePath}/${subtreeUrl}`;
98
- const rootSubtree = await load(rootSubtreeUrl, Tile3DSubtreeLoader);
99
- const contentUrlTemplate = `${basePath}/${tileset.root.content.uri}`;
100
- const refine = tileset.root.refine;
140
+ const replacedUrlTemplate = replaceContentUrlTemplate(subtreesUriTemplate, 0, 0, 0, 0);
141
+ const subtreeUrl = resolveUri(replacedUrlTemplate, basePath);
142
+ const subtree = await load(subtreeUrl, Tile3DSubtreeLoader, options);
143
+ const contentUrlTemplate = resolveUri(tile.content.uri, basePath);
144
+ const refine = tileset?.root?.refine;
101
145
  // @ts-ignore
102
- const rootLodMetricValue = tileset.root.geometricError;
103
- const rootBoundingVolume = tileset.root.boundingVolume;
146
+ const rootLodMetricValue = tile.geometricError;
147
+
148
+ // Replace tile.boundingVolume with the the bounding volume specified by the extensions['3DTILES_bounding_volume_S2']
149
+ const s2VolumeInfo: S2VolumeInfo = tile.boundingVolume.extensions?.['3DTILES_bounding_volume_S2'];
150
+ if (s2VolumeInfo) {
151
+ const box = convertS2BoundingVolumetoOBB(s2VolumeInfo);
152
+ const s2VolumeBox: S2VolumeBox = {box, s2VolumeInfo};
153
+ tile.boundingVolume = s2VolumeBox;
154
+ }
155
+
156
+ const rootBoundingVolume = tile.boundingVolume;
104
157
 
105
- const options = {
158
+ const implicitOptions = {
106
159
  contentUrlTemplate,
107
160
  subtreesUriTemplate,
108
161
  subdivisionScheme,
@@ -117,7 +170,7 @@ export async function normalizeImplicitTileHeaders(tileset: Tileset3D) {
117
170
  getRefine
118
171
  };
119
172
 
120
- return await normalizeImplicitTileData(tileset.root, rootSubtree, options);
173
+ return await normalizeImplicitTileData(tile, subtree, implicitOptions);
121
174
  }
122
175
 
123
176
  /**
@@ -136,7 +189,11 @@ export async function normalizeImplicitTileData(tile, rootSubtree: Subtree, opti
136
189
  tile.lodMetricValue = tile.geometricError;
137
190
  tile.transformMatrix = tile.transform;
138
191
 
139
- const {children, contentUrl} = await parseImplicitTiles({subtree: rootSubtree, options});
192
+ const {children, contentUrl} = await parseImplicitTiles({
193
+ subtree: rootSubtree,
194
+ options,
195
+ s2VolumeBox: tile
196
+ });
140
197
 
141
198
  if (contentUrl) {
142
199
  tile.contentUrl = contentUrl;
@@ -150,3 +207,14 @@ export async function normalizeImplicitTileData(tile, rootSubtree: Subtree, opti
150
207
 
151
208
  return tile;
152
209
  }
210
+
211
+ /**
212
+ * Implicit Tiling data can be in 3DTILES_implicit_tiling for 3DTiles v.Next or directly in implicitTiling object for 3DTiles v1.1.
213
+ * Spec 3DTiles v.Next - https://github.com/CesiumGS/3d-tiles/tree/main/extensions/3DTILES_implicit_tiling
214
+ * Spec 3DTiles v.1.1 - https://github.com/CesiumGS/3d-tiles/tree/draft-1.1/specification/ImplicitTiling
215
+ * @param tile
216
+ * @returns
217
+ */
218
+ function getImplicitTilingExtensionData(tile: Tile3D | null): ImplicitTilingExtension {
219
+ return tile?.extensions?.['3DTILES_implicit_tiling'] || tile?.implicitTiling;
220
+ }
@@ -0,0 +1,51 @@
1
+ import {Vector3} from '@math.gl/core';
2
+ import {OrientedBoundingBox, makeOrientedBoundingBoxFromPoints} from '@math.gl/culling';
3
+
4
+ import type {S2HeightInfo} from '../../utils/s2/index';
5
+ import {getS2OrientedBoundingBoxCornerPoints} from '../../utils/s2/index';
6
+
7
+ import {getS2LngLat} from '../../utils/s2/index';
8
+ import {Ellipsoid} from '@math.gl/geospatial';
9
+
10
+ export type S2VolumeInfo = {
11
+ /** S2 key or token */
12
+ token: string;
13
+ /** minimum height in meters */
14
+ minimumHeight: number;
15
+ /** maximum height in meters */
16
+ maximumHeight: number;
17
+ };
18
+
19
+ /**
20
+ * Converts S2VolumeInfo to OrientedBoundingBox
21
+ * @param {S2VolumeInfo} s2VolumeInfo - s2 volume to convert
22
+ * @returns Oriented Bounding Box of type Box
23
+ */
24
+ export function convertS2BoundingVolumetoOBB(s2VolumeInfo: S2VolumeInfo): number[] {
25
+ const token: string = s2VolumeInfo.token;
26
+ const heightInfo: S2HeightInfo = {
27
+ minimumHeight: s2VolumeInfo.minimumHeight,
28
+ maximumHeight: s2VolumeInfo.maximumHeight
29
+ };
30
+
31
+ const corners: Vector3[] = getS2OrientedBoundingBoxCornerPoints(token, heightInfo);
32
+
33
+ // Add a point that doesn't allow the box dive under the Earth
34
+
35
+ const center = getS2LngLat(token);
36
+ const centerLng: number = center[0];
37
+ const centerLat: number = center[1];
38
+ const point = Ellipsoid.WGS84.cartographicToCartesian([
39
+ centerLng,
40
+ centerLat,
41
+ heightInfo.maximumHeight
42
+ ]);
43
+ const centerPointAdditional = new Vector3(point[0], point[1], point[2]);
44
+ corners.push(centerPointAdditional);
45
+
46
+ // corners should be an array of Vector3 (XYZ)
47
+ const obb: OrientedBoundingBox = makeOrientedBoundingBoxFromPoints(corners);
48
+ const box: number[] = [...obb.center, ...obb.halfAxes];
49
+
50
+ return box;
51
+ }