@loaders.gl/3d-tiles 4.0.0-alpha.1 → 4.0.0-alpha.11

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 (393) hide show
  1. package/dist/bundle.d.ts +2 -0
  2. package/dist/bundle.d.ts.map +1 -0
  3. package/dist/bundle.js +2 -2
  4. package/dist/cesium-ion-loader.d.ts +6 -0
  5. package/dist/cesium-ion-loader.d.ts.map +1 -0
  6. package/dist/cesium-ion-loader.js +37 -32
  7. package/dist/dist.min.js +14805 -0
  8. package/dist/es5/bundle.js +6 -0
  9. package/dist/es5/bundle.js.map +1 -0
  10. package/dist/es5/cesium-ion-loader.js +77 -0
  11. package/dist/es5/cesium-ion-loader.js.map +1 -0
  12. package/dist/es5/index.js +63 -0
  13. package/dist/es5/index.js.map +1 -0
  14. package/dist/es5/lib/classes/helpers/tile-3d-accessor-utils.js +114 -0
  15. package/dist/es5/lib/classes/helpers/tile-3d-accessor-utils.js.map +1 -0
  16. package/dist/es5/lib/classes/tile-3d-batch-table-hierarchy.js +180 -0
  17. package/dist/es5/lib/classes/tile-3d-batch-table-hierarchy.js.map +1 -0
  18. package/dist/es5/lib/classes/tile-3d-batch-table.js +285 -0
  19. package/dist/es5/lib/classes/tile-3d-batch-table.js.map +1 -0
  20. package/dist/es5/lib/classes/tile-3d-feature-table.js +97 -0
  21. package/dist/es5/lib/classes/tile-3d-feature-table.js.map +1 -0
  22. package/dist/es5/lib/constants.js +32 -0
  23. package/dist/es5/lib/constants.js.map +1 -0
  24. package/dist/es5/lib/encoders/encode-3d-tile-batched-model.js +49 -0
  25. package/dist/es5/lib/encoders/encode-3d-tile-batched-model.js.map +1 -0
  26. package/dist/es5/lib/encoders/encode-3d-tile-composite.js +30 -0
  27. package/dist/es5/lib/encoders/encode-3d-tile-composite.js.map +1 -0
  28. package/dist/es5/lib/encoders/encode-3d-tile-instanced-model.js +47 -0
  29. package/dist/es5/lib/encoders/encode-3d-tile-instanced-model.js.map +1 -0
  30. package/dist/es5/lib/encoders/encode-3d-tile-point-cloud.js +48 -0
  31. package/dist/es5/lib/encoders/encode-3d-tile-point-cloud.js.map +1 -0
  32. package/dist/es5/lib/encoders/encode-3d-tile.js +35 -0
  33. package/dist/es5/lib/encoders/encode-3d-tile.js.map +1 -0
  34. package/dist/es5/lib/encoders/helpers/encode-3d-tile-header.js +35 -0
  35. package/dist/es5/lib/encoders/helpers/encode-3d-tile-header.js.map +1 -0
  36. package/dist/es5/lib/ion/ion.js +170 -0
  37. package/dist/es5/lib/ion/ion.js.map +1 -0
  38. package/dist/es5/lib/parsers/helpers/normalize-3d-tile-colors.js +65 -0
  39. package/dist/es5/lib/parsers/helpers/normalize-3d-tile-colors.js.map +1 -0
  40. package/dist/es5/lib/parsers/helpers/normalize-3d-tile-normals.js +32 -0
  41. package/dist/es5/lib/parsers/helpers/normalize-3d-tile-normals.js.map +1 -0
  42. package/dist/es5/lib/parsers/helpers/normalize-3d-tile-positions.js +32 -0
  43. package/dist/es5/lib/parsers/helpers/normalize-3d-tile-positions.js.map +1 -0
  44. package/dist/es5/lib/parsers/helpers/parse-3d-implicit-tiles.js +280 -0
  45. package/dist/es5/lib/parsers/helpers/parse-3d-implicit-tiles.js.map +1 -0
  46. package/dist/es5/lib/parsers/helpers/parse-3d-tile-gltf-view.js +110 -0
  47. package/dist/es5/lib/parsers/helpers/parse-3d-tile-gltf-view.js.map +1 -0
  48. package/dist/es5/lib/parsers/helpers/parse-3d-tile-header.js +22 -0
  49. package/dist/es5/lib/parsers/helpers/parse-3d-tile-header.js.map +1 -0
  50. package/dist/es5/lib/parsers/helpers/parse-3d-tile-subtree.js +145 -0
  51. package/dist/es5/lib/parsers/helpers/parse-3d-tile-subtree.js.map +1 -0
  52. package/dist/es5/lib/parsers/helpers/parse-3d-tile-tables.js +85 -0
  53. package/dist/es5/lib/parsers/helpers/parse-3d-tile-tables.js.map +1 -0
  54. package/dist/es5/lib/parsers/helpers/parse-utils.js +28 -0
  55. package/dist/es5/lib/parsers/helpers/parse-utils.js.map +1 -0
  56. package/dist/es5/lib/parsers/parse-3d-tile-batched-model.js +51 -0
  57. package/dist/es5/lib/parsers/parse-3d-tile-batched-model.js.map +1 -0
  58. package/dist/es5/lib/parsers/parse-3d-tile-composite.js +48 -0
  59. package/dist/es5/lib/parsers/parse-3d-tile-composite.js.map +1 -0
  60. package/dist/es5/lib/parsers/parse-3d-tile-gltf.js +52 -0
  61. package/dist/es5/lib/parsers/parse-3d-tile-gltf.js.map +1 -0
  62. package/dist/es5/lib/parsers/parse-3d-tile-header.js +289 -0
  63. package/dist/es5/lib/parsers/parse-3d-tile-header.js.map +1 -0
  64. package/dist/es5/lib/parsers/parse-3d-tile-instanced-model.js +163 -0
  65. package/dist/es5/lib/parsers/parse-3d-tile-instanced-model.js.map +1 -0
  66. package/dist/es5/lib/parsers/parse-3d-tile-point-cloud.js +295 -0
  67. package/dist/es5/lib/parsers/parse-3d-tile-point-cloud.js.map +1 -0
  68. package/dist/es5/lib/parsers/parse-3d-tile.js +74 -0
  69. package/dist/es5/lib/parsers/parse-3d-tile.js.map +1 -0
  70. package/dist/es5/lib/utils/obb/s2-corners-to-obb.js +30 -0
  71. package/dist/es5/lib/utils/obb/s2-corners-to-obb.js.map +1 -0
  72. package/dist/es5/lib/utils/s2/converters/s2-to-boundary.js +44 -0
  73. package/dist/es5/lib/utils/s2/converters/s2-to-boundary.js.map +1 -0
  74. package/dist/es5/lib/utils/s2/converters/s2-to-obb-points.js +30 -0
  75. package/dist/es5/lib/utils/s2/converters/s2-to-obb-points.js.map +1 -0
  76. package/dist/es5/lib/utils/s2/converters/s2-to-region.js +52 -0
  77. package/dist/es5/lib/utils/s2/converters/s2-to-region.js.map +1 -0
  78. package/dist/es5/lib/utils/s2/index.js +90 -0
  79. package/dist/es5/lib/utils/s2/index.js.map +1 -0
  80. package/dist/es5/lib/utils/s2/s2-geometry-functions.js +19 -0
  81. package/dist/es5/lib/utils/s2/s2-geometry-functions.js.map +1 -0
  82. package/dist/es5/lib/utils/s2/s2-token-functions.js +41 -0
  83. package/dist/es5/lib/utils/s2/s2-token-functions.js.map +1 -0
  84. package/dist/es5/lib/utils/s2/s2geometry/s2-cell-utils.js +22 -0
  85. package/dist/es5/lib/utils/s2/s2geometry/s2-cell-utils.js.map +1 -0
  86. package/dist/es5/lib/utils/s2/s2geometry/s2-geometry.js +207 -0
  87. package/dist/es5/lib/utils/s2/s2geometry/s2-geometry.js.map +1 -0
  88. package/dist/es5/lib/utils/version.js +9 -0
  89. package/dist/es5/lib/utils/version.js.map +1 -0
  90. package/dist/es5/tile-3d-subtree-loader.js +22 -0
  91. package/dist/es5/tile-3d-subtree-loader.js.map +1 -0
  92. package/dist/es5/tile-3d-writer.js +26 -0
  93. package/dist/es5/tile-3d-writer.js.map +1 -0
  94. package/dist/es5/tiles-3d-loader.js +133 -0
  95. package/dist/es5/tiles-3d-loader.js.map +1 -0
  96. package/dist/es5/types.js +2 -0
  97. package/dist/es5/types.js.map +1 -0
  98. package/dist/esm/bundle.js +4 -0
  99. package/dist/esm/bundle.js.map +1 -0
  100. package/dist/esm/cesium-ion-loader.js +36 -0
  101. package/dist/esm/cesium-ion-loader.js.map +1 -0
  102. package/dist/esm/index.js +9 -0
  103. package/dist/esm/index.js.map +1 -0
  104. package/dist/esm/lib/classes/helpers/tile-3d-accessor-utils.js +96 -0
  105. package/dist/esm/lib/classes/helpers/tile-3d-accessor-utils.js.map +1 -0
  106. package/dist/esm/lib/classes/tile-3d-batch-table-hierarchy.js +171 -0
  107. package/dist/esm/lib/classes/tile-3d-batch-table-hierarchy.js.map +1 -0
  108. package/dist/esm/lib/classes/tile-3d-batch-table.js +231 -0
  109. package/dist/esm/lib/classes/tile-3d-batch-table.js.map +1 -0
  110. package/dist/esm/lib/classes/tile-3d-feature-table.js +70 -0
  111. package/dist/esm/lib/classes/tile-3d-feature-table.js.map +1 -0
  112. package/dist/esm/lib/constants.js +22 -0
  113. package/dist/esm/lib/constants.js.map +1 -0
  114. package/dist/esm/lib/encoders/encode-3d-tile-batched-model.js +40 -0
  115. package/dist/esm/lib/encoders/encode-3d-tile-batched-model.js.map +1 -0
  116. package/dist/esm/lib/encoders/encode-3d-tile-composite.js +21 -0
  117. package/dist/esm/lib/encoders/encode-3d-tile-composite.js.map +1 -0
  118. package/dist/esm/lib/encoders/encode-3d-tile-instanced-model.js +36 -0
  119. package/dist/esm/lib/encoders/encode-3d-tile-instanced-model.js.map +1 -0
  120. package/dist/esm/lib/encoders/encode-3d-tile-point-cloud.js +39 -0
  121. package/dist/esm/lib/encoders/encode-3d-tile-point-cloud.js.map +1 -0
  122. package/dist/esm/lib/encoders/encode-3d-tile.js +29 -0
  123. package/dist/esm/lib/encoders/encode-3d-tile.js.map +1 -0
  124. package/dist/esm/lib/encoders/helpers/encode-3d-tile-header.js +28 -0
  125. package/dist/esm/lib/encoders/helpers/encode-3d-tile-header.js.map +1 -0
  126. package/dist/esm/lib/ion/ion.js +70 -0
  127. package/dist/esm/lib/ion/ion.js.map +1 -0
  128. package/dist/esm/lib/parsers/helpers/normalize-3d-tile-colors.js +58 -0
  129. package/dist/esm/lib/parsers/helpers/normalize-3d-tile-colors.js.map +1 -0
  130. package/{src → dist/esm}/lib/parsers/helpers/normalize-3d-tile-normals.js +5 -10
  131. package/dist/esm/lib/parsers/helpers/normalize-3d-tile-normals.js.map +1 -0
  132. package/dist/esm/lib/parsers/helpers/normalize-3d-tile-positions.js +26 -0
  133. package/dist/esm/lib/parsers/helpers/normalize-3d-tile-positions.js.map +1 -0
  134. package/dist/esm/lib/parsers/helpers/parse-3d-implicit-tiles.js +241 -0
  135. package/dist/esm/lib/parsers/helpers/parse-3d-implicit-tiles.js.map +1 -0
  136. package/dist/esm/lib/parsers/helpers/parse-3d-tile-gltf-view.js +67 -0
  137. package/dist/esm/lib/parsers/helpers/parse-3d-tile-gltf-view.js.map +1 -0
  138. package/dist/esm/lib/parsers/helpers/parse-3d-tile-header.js +16 -0
  139. package/dist/esm/lib/parsers/helpers/parse-3d-tile-header.js.map +1 -0
  140. package/dist/esm/lib/parsers/helpers/parse-3d-tile-subtree.js +67 -0
  141. package/dist/esm/lib/parsers/helpers/parse-3d-tile-subtree.js.map +1 -0
  142. package/dist/esm/lib/parsers/helpers/parse-3d-tile-tables.js +80 -0
  143. package/dist/esm/lib/parsers/helpers/parse-3d-tile-tables.js.map +1 -0
  144. package/dist/esm/lib/parsers/helpers/parse-utils.js +20 -0
  145. package/dist/esm/lib/parsers/helpers/parse-utils.js.map +1 -0
  146. package/dist/esm/lib/parsers/parse-3d-tile-batched-model.js +25 -0
  147. package/dist/esm/lib/parsers/parse-3d-tile-batched-model.js.map +1 -0
  148. package/dist/esm/lib/parsers/parse-3d-tile-composite.js +15 -0
  149. package/dist/esm/lib/parsers/parse-3d-tile-composite.js.map +1 -0
  150. package/dist/esm/lib/parsers/parse-3d-tile-gltf.js +20 -0
  151. package/dist/esm/lib/parsers/parse-3d-tile-gltf.js.map +1 -0
  152. package/dist/esm/lib/parsers/parse-3d-tile-header.js +181 -0
  153. package/dist/esm/lib/parsers/parse-3d-tile-header.js.map +1 -0
  154. package/dist/esm/lib/parsers/parse-3d-tile-instanced-model.js +138 -0
  155. package/dist/esm/lib/parsers/parse-3d-tile-instanced-model.js.map +1 -0
  156. package/dist/esm/lib/parsers/parse-3d-tile-point-cloud.js +232 -0
  157. package/dist/esm/lib/parsers/parse-3d-tile-point-cloud.js.map +1 -0
  158. package/dist/esm/lib/parsers/parse-3d-tile.js +30 -0
  159. package/dist/esm/lib/parsers/parse-3d-tile.js.map +1 -0
  160. package/dist/esm/lib/utils/obb/s2-corners-to-obb.js +23 -0
  161. package/dist/esm/lib/utils/obb/s2-corners-to-obb.js.map +1 -0
  162. package/dist/esm/lib/utils/s2/converters/s2-to-boundary.js +40 -0
  163. package/dist/esm/lib/utils/s2/converters/s2-to-boundary.js.map +1 -0
  164. package/dist/esm/lib/utils/s2/converters/s2-to-obb-points.js +24 -0
  165. package/dist/esm/lib/utils/s2/converters/s2-to-obb-points.js.map +1 -0
  166. package/dist/esm/lib/utils/s2/converters/s2-to-region.js +42 -0
  167. package/dist/esm/lib/utils/s2/converters/s2-to-region.js.map +1 -0
  168. package/dist/esm/lib/utils/s2/index.js +7 -0
  169. package/dist/esm/lib/utils/s2/index.js.map +1 -0
  170. package/dist/esm/lib/utils/s2/s2-geometry-functions.js +12 -0
  171. package/dist/esm/lib/utils/s2/s2-geometry-functions.js.map +1 -0
  172. package/dist/esm/lib/utils/s2/s2-token-functions.js +32 -0
  173. package/dist/esm/lib/utils/s2/s2-token-functions.js.map +1 -0
  174. package/dist/esm/lib/utils/s2/s2geometry/s2-cell-utils.js +15 -0
  175. package/dist/esm/lib/utils/s2/s2geometry/s2-cell-utils.js.map +1 -0
  176. package/dist/esm/lib/utils/s2/s2geometry/s2-geometry.js +186 -0
  177. package/dist/esm/lib/utils/s2/s2geometry/s2-geometry.js.map +1 -0
  178. package/dist/esm/lib/utils/version.js +2 -0
  179. package/dist/esm/lib/utils/version.js.map +1 -0
  180. package/dist/esm/tile-3d-subtree-loader.js +14 -0
  181. package/dist/esm/tile-3d-subtree-loader.js.map +1 -0
  182. package/dist/esm/tile-3d-writer.js +19 -0
  183. package/dist/esm/tile-3d-writer.js.map +1 -0
  184. package/dist/esm/tiles-3d-loader.js +68 -0
  185. package/dist/esm/tiles-3d-loader.js.map +1 -0
  186. package/dist/esm/types.js +2 -0
  187. package/dist/esm/types.js.map +1 -0
  188. package/dist/index.d.ts +11 -0
  189. package/dist/index.d.ts.map +1 -0
  190. package/dist/index.js +26 -8
  191. package/dist/lib/classes/helpers/tile-3d-accessor-utils.d.ts +8 -0
  192. package/dist/lib/classes/helpers/tile-3d-accessor-utils.d.ts.map +1 -0
  193. package/dist/lib/classes/helpers/tile-3d-accessor-utils.js +106 -89
  194. package/dist/lib/classes/tile-3d-batch-table-hierarchy.d.ts +10 -0
  195. package/dist/lib/classes/tile-3d-batch-table-hierarchy.d.ts.map +1 -0
  196. package/dist/lib/classes/tile-3d-batch-table-hierarchy.js +184 -202
  197. package/dist/lib/classes/tile-3d-batch-table.d.ts +34 -0
  198. package/dist/lib/classes/tile-3d-batch-table.d.ts.map +1 -0
  199. package/dist/lib/classes/tile-3d-batch-table.js +223 -267
  200. package/dist/lib/classes/tile-3d-feature-table.d.ts +15 -0
  201. package/dist/lib/classes/tile-3d-feature-table.d.ts.map +1 -0
  202. package/dist/lib/classes/tile-3d-feature-table.js +64 -79
  203. package/dist/lib/constants.d.ts +22 -0
  204. package/dist/lib/constants.d.ts.map +1 -0
  205. package/dist/lib/constants.js +23 -18
  206. package/dist/lib/encoders/encode-3d-tile-batched-model.d.ts +2 -0
  207. package/dist/lib/encoders/encode-3d-tile-batched-model.d.ts.map +1 -0
  208. package/dist/lib/encoders/encode-3d-tile-batched-model.js +45 -45
  209. package/dist/lib/encoders/encode-3d-tile-composite.d.ts +2 -0
  210. package/dist/lib/encoders/encode-3d-tile-composite.d.ts.map +1 -0
  211. package/dist/lib/encoders/encode-3d-tile-composite.js +23 -24
  212. package/dist/lib/encoders/encode-3d-tile-instanced-model.d.ts +2 -0
  213. package/dist/lib/encoders/encode-3d-tile-instanced-model.d.ts.map +1 -0
  214. package/dist/lib/encoders/encode-3d-tile-instanced-model.js +37 -37
  215. package/dist/lib/encoders/encode-3d-tile-point-cloud.d.ts +2 -0
  216. package/dist/lib/encoders/encode-3d-tile-point-cloud.d.ts.map +1 -0
  217. package/dist/lib/encoders/encode-3d-tile-point-cloud.js +36 -38
  218. package/dist/lib/encoders/encode-3d-tile.d.ts +2 -0
  219. package/dist/lib/encoders/encode-3d-tile.d.ts.map +1 -0
  220. package/dist/lib/encoders/encode-3d-tile.js +30 -32
  221. package/dist/lib/encoders/helpers/encode-3d-tile-header.d.ts +3 -0
  222. package/dist/lib/encoders/helpers/encode-3d-tile-header.d.ts.map +1 -0
  223. package/dist/lib/encoders/helpers/encode-3d-tile-header.js +28 -29
  224. package/dist/lib/ion/ion.d.ts +4 -0
  225. package/dist/lib/ion/ion.d.ts.map +1 -0
  226. package/dist/lib/ion/ion.js +60 -69
  227. package/dist/lib/parsers/helpers/normalize-3d-tile-colors.d.ts +9 -0
  228. package/dist/lib/parsers/helpers/normalize-3d-tile-colors.d.ts.map +1 -0
  229. package/dist/lib/parsers/helpers/normalize-3d-tile-colors.js +60 -62
  230. package/dist/lib/parsers/helpers/normalize-3d-tile-normals.d.ts +7 -0
  231. package/dist/lib/parsers/helpers/normalize-3d-tile-normals.d.ts.map +1 -0
  232. package/dist/lib/parsers/helpers/normalize-3d-tile-normals.js +26 -26
  233. package/dist/lib/parsers/helpers/normalize-3d-tile-positions.d.ts +2 -0
  234. package/dist/lib/parsers/helpers/normalize-3d-tile-positions.d.ts.map +1 -0
  235. package/dist/lib/parsers/helpers/normalize-3d-tile-positions.js +39 -28
  236. package/dist/lib/parsers/helpers/parse-3d-implicit-tiles.d.ts +57 -0
  237. package/dist/lib/parsers/helpers/parse-3d-implicit-tiles.d.ts.map +1 -0
  238. package/dist/lib/parsers/helpers/parse-3d-implicit-tiles.js +266 -0
  239. package/dist/lib/parsers/helpers/parse-3d-tile-gltf-view.d.ts +10 -0
  240. package/dist/lib/parsers/helpers/parse-3d-tile-gltf-view.d.ts.map +1 -0
  241. package/dist/lib/parsers/helpers/parse-3d-tile-gltf-view.js +90 -63
  242. package/dist/lib/parsers/helpers/parse-3d-tile-header.d.ts +3 -0
  243. package/dist/lib/parsers/helpers/parse-3d-tile-header.d.ts.map +1 -0
  244. package/dist/lib/parsers/helpers/parse-3d-tile-header.js +26 -15
  245. package/dist/lib/parsers/helpers/parse-3d-tile-subtree.d.ts +10 -0
  246. package/dist/lib/parsers/helpers/parse-3d-tile-subtree.d.ts.map +1 -0
  247. package/dist/lib/parsers/helpers/parse-3d-tile-subtree.js +104 -0
  248. package/dist/lib/parsers/helpers/parse-3d-tile-tables.d.ts +5 -0
  249. package/dist/lib/parsers/helpers/parse-3d-tile-tables.d.ts.map +1 -0
  250. package/dist/lib/parsers/helpers/parse-3d-tile-tables.js +85 -81
  251. package/dist/lib/parsers/helpers/parse-utils.d.ts +4 -0
  252. package/dist/lib/parsers/helpers/parse-utils.d.ts.map +1 -0
  253. package/dist/lib/parsers/helpers/parse-utils.js +29 -16
  254. package/dist/lib/parsers/parse-3d-tile-batched-model.d.ts +5 -0
  255. package/dist/lib/parsers/parse-3d-tile-batched-model.d.ts.map +1 -0
  256. package/dist/lib/parsers/parse-3d-tile-batched-model.js +30 -26
  257. package/dist/lib/parsers/parse-3d-tile-composite.d.ts +8 -0
  258. package/dist/lib/parsers/parse-3d-tile-composite.d.ts.map +1 -0
  259. package/dist/lib/parsers/parse-3d-tile-composite.js +23 -16
  260. package/dist/lib/parsers/parse-3d-tile-gltf.d.ts +5 -0
  261. package/dist/lib/parsers/parse-3d-tile-gltf.d.ts.map +1 -0
  262. package/dist/lib/parsers/parse-3d-tile-gltf.js +28 -0
  263. package/dist/lib/parsers/parse-3d-tile-header.d.ts +20 -0
  264. package/dist/lib/parsers/parse-3d-tile-header.d.ts.map +1 -0
  265. package/dist/lib/parsers/parse-3d-tile-header.js +186 -71
  266. package/dist/lib/parsers/parse-3d-tile-instanced-model.d.ts +5 -0
  267. package/dist/lib/parsers/parse-3d-tile-instanced-model.d.ts.map +1 -0
  268. package/dist/lib/parsers/parse-3d-tile-instanced-model.js +165 -170
  269. package/dist/lib/parsers/parse-3d-tile-point-cloud.d.ts +6 -0
  270. package/dist/lib/parsers/parse-3d-tile-point-cloud.d.ts.map +1 -0
  271. package/dist/lib/parsers/parse-3d-tile-point-cloud.js +372 -184
  272. package/dist/lib/parsers/parse-3d-tile.d.ts +5 -0
  273. package/dist/lib/parsers/parse-3d-tile.d.ts.map +1 -0
  274. package/dist/lib/parsers/parse-3d-tile.js +32 -27
  275. package/dist/lib/utils/obb/s2-corners-to-obb.d.ts +15 -0
  276. package/dist/lib/utils/obb/s2-corners-to-obb.d.ts.map +1 -0
  277. package/dist/lib/utils/obb/s2-corners-to-obb.js +37 -0
  278. package/dist/lib/utils/s2/converters/s2-to-boundary.d.ts +9 -0
  279. package/dist/lib/utils/s2/converters/s2-to-boundary.d.ts.map +1 -0
  280. package/dist/lib/utils/s2/converters/s2-to-boundary.js +61 -0
  281. package/dist/lib/utils/s2/converters/s2-to-obb-points.d.ts +15 -0
  282. package/dist/lib/utils/s2/converters/s2-to-obb-points.d.ts.map +1 -0
  283. package/dist/lib/utils/s2/converters/s2-to-obb-points.js +36 -0
  284. package/dist/lib/utils/s2/converters/s2-to-region.d.ts +13 -0
  285. package/dist/lib/utils/s2/converters/s2-to-region.d.ts.map +1 -0
  286. package/dist/lib/utils/s2/converters/s2-to-region.js +59 -0
  287. package/dist/lib/utils/s2/index.d.ts +8 -0
  288. package/dist/lib/utils/s2/index.d.ts.map +1 -0
  289. package/dist/lib/utils/s2/index.js +23 -0
  290. package/dist/lib/utils/s2/s2-geometry-functions.d.ts +14 -0
  291. package/dist/lib/utils/s2/s2-geometry-functions.d.ts.map +1 -0
  292. package/dist/lib/utils/s2/s2-geometry-functions.js +29 -0
  293. package/dist/lib/utils/s2/s2-token-functions.d.ts +23 -0
  294. package/dist/lib/utils/s2/s2-token-functions.d.ts.map +1 -0
  295. package/dist/lib/utils/s2/s2-token-functions.js +68 -0
  296. package/dist/lib/utils/s2/s2geometry/s2-cell-utils.d.ts +14 -0
  297. package/dist/lib/utils/s2/s2geometry/s2-cell-utils.d.ts.map +1 -0
  298. package/dist/lib/utils/s2/s2geometry/s2-cell-utils.js +32 -0
  299. package/dist/lib/utils/s2/s2geometry/s2-geometry.d.ts +52 -0
  300. package/dist/lib/utils/s2/s2geometry/s2-geometry.d.ts.map +1 -0
  301. package/dist/lib/utils/s2/s2geometry/s2-geometry.js +260 -0
  302. package/dist/lib/utils/version.d.ts +2 -0
  303. package/dist/lib/utils/version.d.ts.map +1 -0
  304. package/dist/lib/utils/version.js +7 -2
  305. package/dist/tile-3d-subtree-loader.d.ts +7 -0
  306. package/dist/tile-3d-subtree-loader.d.ts.map +1 -0
  307. package/dist/tile-3d-subtree-loader.js +23 -0
  308. package/dist/tile-3d-writer.d.ts +6 -0
  309. package/dist/tile-3d-writer.d.ts.map +1 -0
  310. package/dist/tile-3d-writer.js +24 -17
  311. package/dist/tiles-3d-loader.d.ts +20 -0
  312. package/dist/tiles-3d-loader.d.ts.map +1 -0
  313. package/dist/tiles-3d-loader.js +69 -65
  314. package/dist/types.d.ts +335 -0
  315. package/dist/types.d.ts.map +1 -0
  316. package/dist/types.js +2 -2
  317. package/package.json +14 -13
  318. package/src/cesium-ion-loader.ts +1 -0
  319. package/src/index.ts +13 -1
  320. package/src/lib/classes/{tile-3d-batch-table.js → tile-3d-batch-table.ts} +14 -4
  321. package/src/lib/classes/{tile-3d-feature-table.js → tile-3d-feature-table.ts} +5 -2
  322. package/src/lib/{constants.js → constants.ts} +2 -1
  323. package/src/lib/parsers/helpers/{normalize-3d-tile-colors.js → normalize-3d-tile-colors.ts} +10 -4
  324. package/src/lib/parsers/helpers/normalize-3d-tile-normals.ts +35 -0
  325. package/src/lib/parsers/helpers/parse-3d-implicit-tiles.ts +396 -0
  326. package/src/lib/parsers/helpers/{parse-3d-tile-gltf-view.js → parse-3d-tile-gltf-view.ts} +40 -16
  327. package/src/lib/parsers/helpers/{parse-3d-tile-header.js → parse-3d-tile-header.ts} +7 -1
  328. package/src/lib/parsers/helpers/parse-3d-tile-subtree.ts +148 -0
  329. package/src/lib/parsers/helpers/{parse-3d-tile-tables.js → parse-3d-tile-tables.ts} +33 -12
  330. package/src/lib/parsers/{parse-3d-tile-batched-model.js → parse-3d-tile-batched-model.ts} +18 -3
  331. package/src/lib/parsers/{parse-3d-tile-composite.js → parse-3d-tile-composite.ts} +20 -8
  332. package/src/lib/parsers/parse-3d-tile-gltf.ts +33 -0
  333. package/src/lib/parsers/parse-3d-tile-header.ts +253 -0
  334. package/src/lib/parsers/{parse-3d-tile-instanced-model.js → parse-3d-tile-instanced-model.ts} +41 -30
  335. package/src/lib/parsers/{parse-3d-tile-point-cloud.js → parse-3d-tile-point-cloud.ts} +73 -14
  336. package/src/lib/parsers/{parse-3d-tile.js → parse-3d-tile.ts} +14 -1
  337. package/src/lib/utils/obb/s2-corners-to-obb.ts +51 -0
  338. package/src/lib/utils/s2/converters/s2-to-boundary.ts +67 -0
  339. package/src/lib/utils/s2/converters/s2-to-obb-points.ts +46 -0
  340. package/src/lib/utils/s2/converters/s2-to-region.ts +69 -0
  341. package/src/lib/utils/s2/index.ts +17 -0
  342. package/src/lib/utils/s2/s2-geometry-functions.ts +28 -0
  343. package/src/lib/utils/s2/s2-token-functions.ts +67 -0
  344. package/src/lib/utils/s2/s2geometry/s2-cell-utils.ts +33 -0
  345. package/src/lib/utils/s2/s2geometry/s2-geometry.ts +296 -0
  346. package/src/tile-3d-subtree-loader.ts +19 -0
  347. package/src/tiles-3d-loader.ts +68 -37
  348. package/src/types.ts +321 -13
  349. package/dist/bundle.js.map +0 -1
  350. package/dist/cesium-ion-loader.js.map +0 -1
  351. package/dist/index.js.map +0 -1
  352. package/dist/lib/classes/helpers/tile-3d-accessor-utils.js.map +0 -1
  353. package/dist/lib/classes/tile-3d-batch-table-hierarchy.js.map +0 -1
  354. package/dist/lib/classes/tile-3d-batch-table.js.map +0 -1
  355. package/dist/lib/classes/tile-3d-feature-table.js.map +0 -1
  356. package/dist/lib/constants.js.map +0 -1
  357. package/dist/lib/encoders/encode-3d-tile-batched-model.js.map +0 -1
  358. package/dist/lib/encoders/encode-3d-tile-composite.js.map +0 -1
  359. package/dist/lib/encoders/encode-3d-tile-instanced-model.js.map +0 -1
  360. package/dist/lib/encoders/encode-3d-tile-point-cloud.js.map +0 -1
  361. package/dist/lib/encoders/encode-3d-tile.js.map +0 -1
  362. package/dist/lib/encoders/helpers/encode-3d-tile-header.js.map +0 -1
  363. package/dist/lib/ion/ion.js.map +0 -1
  364. package/dist/lib/parsers/helpers/normalize-3d-tile-colors.js.map +0 -1
  365. package/dist/lib/parsers/helpers/normalize-3d-tile-normals.js.map +0 -1
  366. package/dist/lib/parsers/helpers/normalize-3d-tile-positions.js.map +0 -1
  367. package/dist/lib/parsers/helpers/parse-3d-tile-gltf-view.js.map +0 -1
  368. package/dist/lib/parsers/helpers/parse-3d-tile-header.js.map +0 -1
  369. package/dist/lib/parsers/helpers/parse-3d-tile-tables.js.map +0 -1
  370. package/dist/lib/parsers/helpers/parse-utils.js.map +0 -1
  371. package/dist/lib/parsers/parse-3d-tile-batched-model.js.map +0 -1
  372. package/dist/lib/parsers/parse-3d-tile-composite.js.map +0 -1
  373. package/dist/lib/parsers/parse-3d-tile-header.js.map +0 -1
  374. package/dist/lib/parsers/parse-3d-tile-instanced-model.js.map +0 -1
  375. package/dist/lib/parsers/parse-3d-tile-point-cloud.js.map +0 -1
  376. package/dist/lib/parsers/parse-3d-tile.js.map +0 -1
  377. package/dist/lib/utils/version.js.map +0 -1
  378. package/dist/tile-3d-writer.js.map +0 -1
  379. package/dist/tiles-3d-loader.js.map +0 -1
  380. package/dist/types.js.map +0 -1
  381. package/src/lib/parsers/parse-3d-tile-header.js +0 -69
  382. /package/src/lib/classes/helpers/{tile-3d-accessor-utils.js → tile-3d-accessor-utils.ts} +0 -0
  383. /package/src/lib/classes/{tile-3d-batch-table-hierarchy.js → tile-3d-batch-table-hierarchy.ts} +0 -0
  384. /package/src/lib/encoders/{encode-3d-tile-batched-model.js → encode-3d-tile-batched-model.ts} +0 -0
  385. /package/src/lib/encoders/{encode-3d-tile-composite.js → encode-3d-tile-composite.ts} +0 -0
  386. /package/src/lib/encoders/{encode-3d-tile-instanced-model.js → encode-3d-tile-instanced-model.ts} +0 -0
  387. /package/src/lib/encoders/{encode-3d-tile-point-cloud.js → encode-3d-tile-point-cloud.ts} +0 -0
  388. /package/src/lib/encoders/{encode-3d-tile.js → encode-3d-tile.ts} +0 -0
  389. /package/src/lib/encoders/helpers/{encode-3d-tile-header.js → encode-3d-tile-header.ts} +0 -0
  390. /package/src/lib/ion/{ion.js → ion.ts} +0 -0
  391. /package/src/lib/parsers/helpers/{normalize-3d-tile-positions.js → normalize-3d-tile-positions.ts} +0 -0
  392. /package/src/lib/parsers/helpers/{parse-utils.js → parse-utils.ts} +0 -0
  393. /package/src/lib/utils/{version.js → version.ts} +0 -0
@@ -0,0 +1,396 @@
1
+ import type {Availability, Tile3DBoundingVolume, Subtree} from '../../../types';
2
+ import {Tile3DSubtreeLoader} from '../../../tile-3d-subtree-loader';
3
+ import {load} from '@loaders.gl/core';
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
+
10
+ const QUADTREE_DEVISION_COUNT = 4;
11
+ const OCTREE_DEVISION_COUNT = 8;
12
+
13
+ const SUBDIVISION_COUNT_MAP = {
14
+ QUADTREE: QUADTREE_DEVISION_COUNT,
15
+ OCTREE: OCTREE_DEVISION_COUNT
16
+ };
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
+
71
+ /**
72
+ * Recursively parse implicit tiles tree
73
+ * Spec - https://github.com/CesiumGS/3d-tiles/tree/main/extensions/3DTILES_implicit_tiling
74
+ * TODO Check out do we able to use Tile3D class as return type here.
75
+ * @param subtree
76
+ * @param lodMetricValue
77
+ * @param options
78
+ * @param parentData
79
+ * @param childIndex
80
+ * @param level
81
+ * @param globalData
82
+ */
83
+ // eslint-disable-next-line max-statements
84
+ export async function parseImplicitTiles(params: {
85
+ subtree: Subtree;
86
+ options: any;
87
+ parentData?: {mortonIndex: number; x: number; y: number; z: number};
88
+ childIndex?: number;
89
+ level?: number;
90
+ globalData?: {level: number; mortonIndex: number; x: number; y: number; z: number};
91
+ s2VolumeBox?: S2VolumeBox;
92
+ }) {
93
+ const {
94
+ options,
95
+ parentData = {
96
+ mortonIndex: 0,
97
+ x: 0,
98
+ y: 0,
99
+ z: 0
100
+ },
101
+ childIndex = 0,
102
+ globalData = {
103
+ level: 0,
104
+ mortonIndex: 0,
105
+ x: 0,
106
+ y: 0,
107
+ z: 0
108
+ },
109
+ s2VolumeBox
110
+ } = params;
111
+ let {subtree, level = 0} = params;
112
+ const {
113
+ subdivisionScheme,
114
+ subtreeLevels,
115
+ maximumLevel,
116
+ contentUrlTemplate,
117
+ subtreesUriTemplate,
118
+ basePath
119
+ } = options;
120
+
121
+ const tile = {children: [], lodMetricValue: 0, contentUrl: ''};
122
+
123
+ const childrenPerTile = SUBDIVISION_COUNT_MAP[subdivisionScheme];
124
+
125
+ const childX = childIndex & 0b01;
126
+ const childY = (childIndex >> 1) & 0b01;
127
+ const childZ = (childIndex >> 2) & 0b01;
128
+
129
+ const levelOffset = (childrenPerTile ** level - 1) / (childrenPerTile - 1);
130
+ let childTileMortonIndex = concatBits(parentData.mortonIndex, childIndex);
131
+ let tileAvailabilityIndex = levelOffset + childTileMortonIndex;
132
+
133
+ // Local tile coordinates
134
+ let childTileX = concatBits(parentData.x, childX);
135
+ let childTileY = concatBits(parentData.y, childY);
136
+ let childTileZ = concatBits(parentData.z, childZ);
137
+
138
+ let isChildSubtreeAvailable = false;
139
+
140
+ if (level + 1 > subtreeLevels) {
141
+ isChildSubtreeAvailable = getAvailabilityResult(
142
+ subtree.childSubtreeAvailability,
143
+ childTileMortonIndex
144
+ );
145
+ }
146
+
147
+ const x = concatBits(globalData.x, childTileX);
148
+ const y = concatBits(globalData.y, childTileY);
149
+ const z = concatBits(globalData.z, childTileZ);
150
+ const lev = level + globalData.level;
151
+
152
+ if (isChildSubtreeAvailable) {
153
+ const subtreePath = `${basePath}/${subtreesUriTemplate}`;
154
+ const childSubtreeUrl = replaceContentUrlTemplate(subtreePath, lev, x, y, z);
155
+ const childSubtree = await load(childSubtreeUrl, Tile3DSubtreeLoader);
156
+
157
+ subtree = childSubtree;
158
+
159
+ globalData.mortonIndex = childTileMortonIndex;
160
+ globalData.x = childTileX;
161
+ globalData.y = childTileY;
162
+ globalData.z = childTileZ;
163
+ globalData.level = level;
164
+
165
+ childTileMortonIndex = 0;
166
+ tileAvailabilityIndex = 0;
167
+ childTileX = 0;
168
+ childTileY = 0;
169
+ childTileZ = 0;
170
+ level = 0;
171
+ }
172
+
173
+ const isTileAvailable = getAvailabilityResult(subtree.tileAvailability, tileAvailabilityIndex);
174
+
175
+ if (!isTileAvailable || level > maximumLevel) {
176
+ return tile;
177
+ }
178
+
179
+ const isContentAvailable = getAvailabilityResult(
180
+ subtree.contentAvailability,
181
+ tileAvailabilityIndex
182
+ );
183
+
184
+ if (isContentAvailable) {
185
+ tile.contentUrl = replaceContentUrlTemplate(contentUrlTemplate, lev, x, y, z);
186
+ }
187
+
188
+ const childTileLevel = level + 1;
189
+ const pData = {mortonIndex: childTileMortonIndex, x: childTileX, y: childTileY, z: childTileZ};
190
+
191
+ for (let index = 0; index < childrenPerTile; index++) {
192
+ const childS2VolumeBox: S2VolumeBox | undefined = getChildS2VolumeBox(
193
+ s2VolumeBox,
194
+ index,
195
+ subdivisionScheme
196
+ );
197
+
198
+ // Recursive calling...
199
+ const childTileParsed = await parseImplicitTiles({
200
+ subtree,
201
+ options,
202
+ parentData: pData,
203
+ childIndex: index,
204
+ level: childTileLevel,
205
+ globalData,
206
+ s2VolumeBox: childS2VolumeBox
207
+ });
208
+
209
+ if (childTileParsed.contentUrl || childTileParsed.children.length) {
210
+ const globalLevel = lev + 1;
211
+ const childCoordinates = {childTileX, childTileY, childTileZ};
212
+ const formattedTile = formatTileData(
213
+ childTileParsed,
214
+ globalLevel,
215
+ childCoordinates,
216
+ options,
217
+ s2VolumeBox
218
+ );
219
+ // @ts-ignore
220
+ tile.children.push(formattedTile);
221
+ }
222
+ }
223
+
224
+ return tile;
225
+ }
226
+
227
+ function getAvailabilityResult(availabilityData: Availability, index: number): boolean {
228
+ if ('constant' in availabilityData) {
229
+ return Boolean(availabilityData.constant);
230
+ }
231
+
232
+ if (availabilityData.explicitBitstream) {
233
+ return getBooleanValueFromBitstream(index, availabilityData.explicitBitstream);
234
+ }
235
+
236
+ return false;
237
+ }
238
+
239
+ /**
240
+ * Do formatting of implicit tile data.
241
+ * TODO Check out do we able to use Tile3D class as type here.
242
+ * @param tile
243
+ * @param lodMetricValue
244
+ * @param options
245
+ * @returns
246
+ */
247
+ function formatTileData(
248
+ tile,
249
+ level: number,
250
+ childCoordinates: {childTileX: number; childTileY: number; childTileZ: number},
251
+ options: any,
252
+ s2VolumeBox?: S2VolumeBox
253
+ ) {
254
+ const {
255
+ basePath,
256
+ refine,
257
+ getRefine,
258
+ lodMetricType,
259
+ getTileType,
260
+ rootLodMetricValue,
261
+ rootBoundingVolume
262
+ } = options;
263
+ const uri = tile.contentUrl && tile.contentUrl.replace(`${basePath}/`, '');
264
+ const lodMetricValue = rootLodMetricValue / 2 ** level;
265
+
266
+ const boundingVolume: Tile3DBoundingVolume = s2VolumeBox?.box
267
+ ? {box: s2VolumeBox.box}
268
+ : rootBoundingVolume;
269
+
270
+ const boundingVolumeForChildTile = calculateBoundingVolumeForChildTile(
271
+ level,
272
+ boundingVolume,
273
+ childCoordinates
274
+ );
275
+
276
+ return {
277
+ children: tile.children,
278
+ contentUrl: tile.contentUrl,
279
+ content: {uri},
280
+ id: tile.contentUrl,
281
+ refine: getRefine(refine),
282
+ type: getTileType(tile),
283
+ lodMetricType,
284
+ lodMetricValue,
285
+ geometricError: lodMetricValue,
286
+ transform: tile.transform,
287
+ boundingVolume: boundingVolumeForChildTile
288
+ };
289
+ }
290
+
291
+ /**
292
+ * Calculate child bounding volume.
293
+ * Spec - https://github.com/CesiumGS/3d-tiles/tree/main/extensions/3DTILES_implicit_tiling#subdivision-rules
294
+ * @param level
295
+ * @param rootBoundingVolume
296
+ * @param childCoordinates
297
+ */
298
+ function calculateBoundingVolumeForChildTile(
299
+ level: number,
300
+ rootBoundingVolume: Tile3DBoundingVolume,
301
+ childCoordinates: {childTileX: number; childTileY: number; childTileZ: number}
302
+ ): Tile3DBoundingVolume {
303
+ if (rootBoundingVolume.region) {
304
+ const {childTileX, childTileY, childTileZ} = childCoordinates;
305
+ const [west, south, east, north, minimumHeight, maximumHeight] = rootBoundingVolume.region;
306
+ const boundingVolumesCount = 2 ** level;
307
+
308
+ const sizeX = (east - west) / boundingVolumesCount;
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
+
317
+ const sizeZ = (maximumHeight - minimumHeight) / boundingVolumesCount;
318
+
319
+ const [childWest, childEast] = [west + sizeX * childTileX, west + sizeX * (childTileX + 1)];
320
+ const [childSouth, childNorth] = [south + sizeY * childTileY, south + sizeY * (childTileY + 1)];
321
+ const [childMinimumHeight, childMaximumHeight] = [
322
+ minimumHeight + sizeZ * childTileZ,
323
+ minimumHeight + sizeZ * (childTileZ + 1)
324
+ ];
325
+
326
+ return {
327
+ region: [childWest, childSouth, childEast, childNorth, childMinimumHeight, childMaximumHeight]
328
+ };
329
+ }
330
+
331
+ if (rootBoundingVolume.box) {
332
+ return rootBoundingVolume;
333
+ }
334
+
335
+ throw new Error(`Unsupported bounding volume type ${rootBoundingVolume}`);
336
+ }
337
+
338
+ /**
339
+ * Do binary concatenation
340
+ * @param first
341
+ * @param second
342
+ */
343
+ function concatBits(first: number, second: number): number {
344
+ return parseInt(first.toString(2) + second.toString(2), 2);
345
+ }
346
+
347
+ /**
348
+ * Replace implicit tile content url with real coordinates.
349
+ * @param templateUrl
350
+ * @param level
351
+ * @param x
352
+ * @param y
353
+ * @param z
354
+ */
355
+ export function replaceContentUrlTemplate(
356
+ templateUrl: string,
357
+ level: number,
358
+ x: number,
359
+ y: number,
360
+ z: number
361
+ ): string {
362
+ const mapUrl = generateMapUrl({level, x, y, z});
363
+ return templateUrl.replace(/{level}|{x}|{y}|{z}/gi, (matched) => mapUrl[matched]);
364
+ }
365
+
366
+ /**
367
+ * Get Map object for content url generation
368
+ * @param items
369
+ */
370
+ function generateMapUrl(items: {[key: string]: number}): {[key: string]: string} {
371
+ const mapUrl = {};
372
+
373
+ for (const key in items) {
374
+ mapUrl[`{${key}}`] = items[key];
375
+ }
376
+ return mapUrl;
377
+ }
378
+
379
+ /**
380
+ * Get boolean value from bistream by index
381
+ * A boolean value is encoded as a single bit, either 0 (false) or 1 (true).
382
+ * Multiple boolean values are packed tightly in the same buffer.
383
+ * These buffers of tightly-packed bits are sometimes referred to as bitstreams.
384
+ * Spec - https://github.com/CesiumGS/3d-tiles/tree/implicit-revisions/specification/Metadata#booleans
385
+ * @param availabilitiIndex
386
+ */
387
+ function getBooleanValueFromBitstream(
388
+ availabilityIndex: number,
389
+ availabilityBuffer: Uint8Array
390
+ ): boolean {
391
+ const byteIndex = Math.floor(availabilityIndex / 8);
392
+ const bitIndex = availabilityIndex % 8;
393
+ const bitValue = (availabilityBuffer[byteIndex] >> bitIndex) & 1;
394
+
395
+ return bitValue === 1;
396
+ }
@@ -7,29 +7,36 @@
7
7
  // - Do we add an option to control this?
8
8
  // - Also, should we have hard dependency on gltf module or use injection or auto-discovery for gltf parser?
9
9
 
10
- import {GLTFLoader} from '@loaders.gl/gltf';
11
- import {sliceArrayBuffer} from '@loaders.gl/loader-utils';
10
+ import {GLTFLoader, postProcessGLTF, _getMemoryUsageGLTF} from '@loaders.gl/gltf';
11
+ import {LoaderContext, sliceArrayBuffer} from '@loaders.gl/loader-utils';
12
+ import {Tiles3DTileContent} from '../../../types';
13
+ import {Tiles3DLoaderOptions} from '../../../tiles-3d-loader';
12
14
 
13
15
  export const GLTF_FORMAT = {
14
16
  URI: 0,
15
17
  EMBEDDED: 1
16
18
  };
17
19
 
18
- export function parse3DTileGLTFViewSync(tile, arrayBuffer, byteOffset, options) {
20
+ export function parse3DTileGLTFViewSync(
21
+ tile: Tiles3DTileContent,
22
+ arrayBuffer: ArrayBuffer,
23
+ byteOffset: number,
24
+ options: Tiles3DLoaderOptions | undefined
25
+ ) {
19
26
  // Set flags
20
27
  // glTF models need to be rotated from Y to Z up
21
28
  // https://github.com/AnalyticalGraphicsInc/3d-tiles/tree/master/specification#y-up-to-z-up
22
29
  tile.rotateYtoZ = true;
23
30
 
24
31
  // Assume glTF consumes rest of tile
25
- const gltfByteLength = tile.byteOffset + tile.byteLength - byteOffset;
32
+ const gltfByteLength = (tile.byteOffset || 0) + (tile.byteLength || 0) - byteOffset;
26
33
  if (gltfByteLength === 0) {
27
34
  throw new Error('glTF byte length must be greater than 0.');
28
35
  }
29
36
 
30
37
  // Save gltf up axis
31
38
  tile.gltfUpAxis =
32
- options['3d-tiles'] && options['3d-tiles'].assetGltfUpAxis
39
+ options?.['3d-tiles'] && options['3d-tiles'].assetGltfUpAxis
33
40
  ? options['3d-tiles'].assetGltfUpAxis
34
41
  : 'Y';
35
42
 
@@ -50,23 +57,34 @@ export function parse3DTileGLTFViewSync(tile, arrayBuffer, byteOffset, options)
50
57
  }
51
58
 
52
59
  // Entire tile is consumed
53
- return tile.byteOffset + tile.byteLength;
60
+ return (tile.byteOffset || 0) + (tile.byteLength || 0);
54
61
  }
55
62
 
56
- export async function extractGLTF(tile, gltfFormat, options, context) {
57
- const tile3DOptions = options['3d-tiles'] || {};
63
+ export async function extractGLTF(
64
+ tile: Tiles3DTileContent,
65
+ gltfFormat: number,
66
+ options?: Tiles3DLoaderOptions,
67
+ context?: LoaderContext
68
+ ): Promise<void> {
69
+ const tile3DOptions = options?.['3d-tiles'] || {};
58
70
 
59
71
  extractGLTFBufferOrURL(tile, gltfFormat, options);
60
72
 
61
73
  if (tile3DOptions.loadGLTF) {
74
+ if (!context) {
75
+ return;
76
+ }
62
77
  const {parse, fetch} = context;
63
78
  if (tile.gltfUrl) {
64
- tile.gltfArrayBuffer = await fetch(tile.gltfUrl, options);
79
+ const response = await fetch(tile.gltfUrl, options);
80
+ tile.gltfArrayBuffer = await response.arrayBuffer();
65
81
  tile.gltfByteOffset = 0;
66
82
  }
67
83
  if (tile.gltfArrayBuffer) {
68
84
  // TODO - Should handle byteOffset... However, not used now...
69
- tile.gltf = await parse(tile.gltfArrayBuffer, GLTFLoader, options, context);
85
+ const gltfWithBuffers = await parse(tile.gltfArrayBuffer, GLTFLoader, options, context);
86
+ tile.gltf = postProcessGLTF(gltfWithBuffers);
87
+ tile.gpuMemoryUsageInBytes = _getMemoryUsageGLTF(tile.gltf);
70
88
  delete tile.gltfArrayBuffer;
71
89
  delete tile.gltfByteOffset;
72
90
  delete tile.gltfByteLength;
@@ -74,15 +92,21 @@ export async function extractGLTF(tile, gltfFormat, options, context) {
74
92
  }
75
93
  }
76
94
 
77
- function extractGLTFBufferOrURL(tile, gltfFormat, options) {
95
+ function extractGLTFBufferOrURL(
96
+ tile: Tiles3DTileContent,
97
+ gltfFormat: number,
98
+ options: Tiles3DLoaderOptions | undefined
99
+ ) {
78
100
  switch (gltfFormat) {
79
101
  case GLTF_FORMAT.URI:
80
102
  // We need to remove padding from the end of the model URL in case this tile was part of a composite tile.
81
103
  // This removes all white space and null characters from the end of the string.
82
- const gltfUrlBytes = new Uint8Array(tile.gltfArrayBuffer, tile.gltfByteOffset);
83
- const textDecoder = new TextDecoder();
84
- const gltfUrl = textDecoder.decode(gltfUrlBytes);
85
- tile.gltfUrl = gltfUrl.replace(/[\s\0]+$/, '');
104
+ if (tile.gltfArrayBuffer) {
105
+ const gltfUrlBytes = new Uint8Array(tile.gltfArrayBuffer, tile.gltfByteOffset);
106
+ const textDecoder = new TextDecoder();
107
+ const gltfUrl = textDecoder.decode(gltfUrlBytes);
108
+ tile.gltfUrl = gltfUrl.replace(/[\s\0]+$/, '');
109
+ }
86
110
  delete tile.gltfArrayBuffer;
87
111
  delete tile.gltfByteOffset;
88
112
  delete tile.gltfByteLength;
@@ -90,6 +114,6 @@ function extractGLTFBufferOrURL(tile, gltfFormat, options) {
90
114
  case GLTF_FORMAT.EMBEDDED:
91
115
  break;
92
116
  default:
93
- throw new Error(`b3dm: Illegal glTF format field`);
117
+ throw new Error('b3dm: Illegal glTF format field');
94
118
  }
95
119
  }
@@ -1,6 +1,8 @@
1
1
  // This file is derived from the Cesium code base under Apache 2 license
2
2
  // See LICENSE.md and https://github.com/AnalyticalGraphicsInc/cesium/blob/master/LICENSE.md
3
3
 
4
+ import {Tiles3DTileContent} from '../../../types';
5
+
4
6
  const SIZEOF_UINT32 = 4;
5
7
 
6
8
  /* PARSE FIXED HEADER:
@@ -10,7 +12,11 @@ Populates
10
12
  version,
11
13
  byteLength
12
14
  */
13
- export function parse3DTileHeaderSync(tile, arrayBuffer, byteOffset = 0) {
15
+ export function parse3DTileHeaderSync(
16
+ tile: Tiles3DTileContent,
17
+ arrayBuffer: ArrayBuffer,
18
+ byteOffset: number = 0
19
+ ) {
14
20
  const view = new DataView(arrayBuffer);
15
21
 
16
22
  tile.magic = view.getUint32(byteOffset, true);
@@ -0,0 +1,148 @@
1
+ import type {Subtree, ExplicitBitstream} from '../../../types';
2
+ import type {LoaderContext, LoaderOptions} from '@loaders.gl/loader-utils';
3
+
4
+ const SUBTREE_FILE_MAGIC = 0x74627573;
5
+ const SUBTREE_FILE_VERSION = 1;
6
+
7
+ /**
8
+ * Parse subtree file
9
+ * Spec - https://github.com/CesiumGS/3d-tiles/tree/main/extensions/3DTILES_implicit_tiling#subtree-file-format
10
+ * @param data
11
+ * @returns
12
+ */
13
+ // eslint-disable-next-line max-statements
14
+ export default async function parse3DTilesSubtree(
15
+ data: ArrayBuffer,
16
+ options: LoaderOptions | undefined,
17
+ context: LoaderContext | undefined
18
+ ): Promise<Subtree> {
19
+ const magic = new Uint32Array(data.slice(0, 4));
20
+
21
+ if (magic[0] !== SUBTREE_FILE_MAGIC) {
22
+ throw new Error('Wrong subtree file magic number');
23
+ }
24
+
25
+ const version = new Uint32Array(data.slice(4, 8));
26
+
27
+ if (version[0] !== SUBTREE_FILE_VERSION) {
28
+ throw new Error('Wrong subtree file verson, must be 1');
29
+ }
30
+
31
+ const jsonByteLength = parseUint64Value(data.slice(8, 16));
32
+ const stringAttribute = new Uint8Array(data, 24, jsonByteLength);
33
+
34
+ const textDecoder = new TextDecoder('utf8');
35
+ const string = textDecoder.decode(stringAttribute);
36
+ const subtree = JSON.parse(string);
37
+
38
+ const binaryByteLength = parseUint64Value(data.slice(16, 24));
39
+ let internalBinaryBuffer = new ArrayBuffer(0);
40
+
41
+ if (binaryByteLength) {
42
+ internalBinaryBuffer = data.slice(24 + jsonByteLength);
43
+ }
44
+
45
+ if ('bufferView' in subtree.tileAvailability) {
46
+ subtree.tileAvailability.explicitBitstream = await getExplicitBitstream(
47
+ subtree,
48
+ 'tileAvailability',
49
+ internalBinaryBuffer,
50
+ context
51
+ );
52
+ }
53
+
54
+ if ('bufferView' in subtree.contentAvailability) {
55
+ subtree.contentAvailability.explicitBitstream = await getExplicitBitstream(
56
+ subtree,
57
+ 'contentAvailability',
58
+ internalBinaryBuffer,
59
+ context
60
+ );
61
+ }
62
+
63
+ if ('bufferView' in subtree.childSubtreeAvailability) {
64
+ subtree.childSubtreeAvailability.explicitBitstream = await getExplicitBitstream(
65
+ subtree,
66
+ 'childSubtreeAvailability',
67
+ internalBinaryBuffer,
68
+ context
69
+ );
70
+ }
71
+
72
+ return subtree;
73
+ }
74
+
75
+ /**
76
+ * Get url for bitstream downloading
77
+ * @param bitstreamRelativeUri
78
+ * @param basePath
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
+
101
+ /**
102
+ * Get explicit bitstream for subtree availability data.
103
+ * @param subtree
104
+ * @param name
105
+ * @param internalBinaryBuffer
106
+ */
107
+ async function getExplicitBitstream(
108
+ subtree: Subtree,
109
+ name: string,
110
+ internalBinaryBuffer: ArrayBuffer,
111
+ context: LoaderContext | undefined
112
+ ): Promise<ExplicitBitstream> {
113
+ const bufferViewIndex = subtree[name].bufferView;
114
+ const bufferView = subtree.bufferViews[bufferViewIndex];
115
+ const buffer = subtree.buffers[bufferView.buffer];
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
+
125
+ // External bitstream loading
126
+ if (buffer.uri) {
127
+ const bufferUri = resolveBufferUri(buffer.uri, context?.url);
128
+ const response = await context.fetch(bufferUri);
129
+ const data = await response.arrayBuffer();
130
+ // Return view of bitstream.
131
+ return new Uint8Array(data, bufferView.byteOffset, bufferView.byteLength);
132
+ }
133
+ // Return view of bitstream.
134
+ return new Uint8Array(internalBinaryBuffer, bufferView.byteOffset, bufferView.byteLength);
135
+ }
136
+
137
+ /**
138
+ * Parse buffer to return uint64 value
139
+ * @param buffer
140
+ * @returns 64-bit value until precision is lost after Number.MAX_SAFE_INTEGER
141
+ */
142
+ function parseUint64Value(buffer: ArrayBuffer): number {
143
+ const dataView = new DataView(buffer);
144
+ const left = dataView.getUint32(0, true);
145
+ const right = dataView.getUint32(4, true);
146
+ // combine the two 32-bit values
147
+ return left + 2 ** 32 * right;
148
+ }