@loaders.gl/tile-converter 4.0.0-alpha.9 → 4.0.0-beta.1

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 (300) hide show
  1. package/bin/i3s-server.js +4 -0
  2. package/bin/slpk-extractor.js +4 -0
  3. package/dist/3d-tiles-converter/3d-tiles-converter.d.ts +5 -5
  4. package/dist/3d-tiles-converter/3d-tiles-converter.d.ts.map +1 -1
  5. package/dist/3d-tiles-converter/helpers/b3dm-converter.d.ts +10 -5
  6. package/dist/3d-tiles-converter/helpers/b3dm-converter.d.ts.map +1 -1
  7. package/dist/3d-tiles-converter/helpers/load-i3s.d.ts +10 -0
  8. package/dist/3d-tiles-converter/helpers/load-i3s.d.ts.map +1 -0
  9. package/dist/3d-tiles-converter/helpers/texture-atlas.d.ts +2 -1
  10. package/dist/3d-tiles-converter/helpers/texture-atlas.d.ts.map +1 -1
  11. package/dist/converter.min.js +172 -103
  12. package/dist/deps-installer/deps-installer.d.ts +3 -2
  13. package/dist/deps-installer/deps-installer.d.ts.map +1 -1
  14. package/dist/dist.min.js +32715 -32567
  15. package/dist/es5/3d-tiles-converter/3d-tiles-converter.js +97 -117
  16. package/dist/es5/3d-tiles-converter/3d-tiles-converter.js.map +1 -1
  17. package/dist/es5/3d-tiles-converter/helpers/b3dm-converter.js +24 -22
  18. package/dist/es5/3d-tiles-converter/helpers/b3dm-converter.js.map +1 -1
  19. package/dist/es5/3d-tiles-converter/helpers/load-i3s.js +63 -0
  20. package/dist/es5/3d-tiles-converter/helpers/load-i3s.js.map +1 -0
  21. package/dist/es5/3d-tiles-converter/helpers/texture-atlas.js.map +1 -1
  22. package/dist/es5/converter-cli.js +25 -65
  23. package/dist/es5/converter-cli.js.map +1 -1
  24. package/dist/es5/deps-installer/deps-installer.js +113 -39
  25. package/dist/es5/deps-installer/deps-installer.js.map +1 -1
  26. package/dist/es5/i3s-converter/helpers/batch-ids-extensions.js +45 -15
  27. package/dist/es5/i3s-converter/helpers/batch-ids-extensions.js.map +1 -1
  28. package/dist/es5/i3s-converter/helpers/coordinate-converter.js.map +1 -1
  29. package/dist/es5/i3s-converter/helpers/feature-attributes.js +8 -18
  30. package/dist/es5/i3s-converter/helpers/feature-attributes.js.map +1 -1
  31. package/dist/es5/i3s-converter/helpers/geometry-attributes.js +83 -43
  32. package/dist/es5/i3s-converter/helpers/geometry-attributes.js.map +1 -1
  33. package/dist/es5/i3s-converter/helpers/geometry-converter.js +100 -102
  34. package/dist/es5/i3s-converter/helpers/geometry-converter.js.map +1 -1
  35. package/dist/es5/i3s-converter/helpers/gltf-attributes.js.map +1 -1
  36. package/dist/es5/i3s-converter/helpers/load-3d-tiles.js +70 -4
  37. package/dist/es5/i3s-converter/helpers/load-3d-tiles.js.map +1 -1
  38. package/dist/es5/i3s-converter/helpers/node-index-document.js +3 -2
  39. package/dist/es5/i3s-converter/helpers/node-index-document.js.map +1 -1
  40. package/dist/es5/i3s-converter/helpers/preprocess-3d-tiles.js +47 -12
  41. package/dist/es5/i3s-converter/helpers/preprocess-3d-tiles.js.map +1 -1
  42. package/dist/es5/i3s-converter/i3s-converter.js +187 -174
  43. package/dist/es5/i3s-converter/i3s-converter.js.map +1 -1
  44. package/dist/es5/i3s-converter/types.js +11 -11
  45. package/dist/es5/i3s-converter/types.js.map +1 -1
  46. package/dist/es5/i3s-server/README.md +46 -2
  47. package/dist/es5/i3s-server/app.js +23 -15
  48. package/dist/es5/i3s-server/app.js.map +1 -1
  49. package/dist/es5/i3s-server/bin/www.js +33 -0
  50. package/dist/es5/i3s-server/bin/www.js.map +1 -0
  51. package/dist/es5/i3s-server/controllers/index-controller.js +23 -22
  52. package/dist/es5/i3s-server/controllers/index-controller.js.map +1 -1
  53. package/dist/es5/i3s-server/controllers/slpk-controller.js +35 -38
  54. package/dist/es5/i3s-server/controllers/slpk-controller.js.map +1 -1
  55. package/dist/es5/i3s-server/routes/index.js +2 -2
  56. package/dist/es5/i3s-server/routes/index.js.map +1 -1
  57. package/dist/es5/i3s-server/routes/slpk-router.js +14 -13
  58. package/dist/es5/i3s-server/routes/slpk-router.js.map +1 -1
  59. package/dist/es5/i3s-server/utils/create-scene-server.js +7 -4
  60. package/dist/es5/i3s-server/utils/create-scene-server.js.map +1 -1
  61. package/dist/es5/i3s-server/utils/server-utils.js +49 -0
  62. package/dist/es5/i3s-server/utils/server-utils.js.map +1 -0
  63. package/dist/es5/lib/utils/cli-utils.js +57 -0
  64. package/dist/es5/lib/utils/cli-utils.js.map +1 -0
  65. package/dist/es5/lib/utils/compress-util.js +1 -1
  66. package/dist/es5/lib/utils/compress-util.js.map +1 -1
  67. package/dist/es5/lib/utils/lod-conversion-utils.js +10 -4
  68. package/dist/es5/lib/utils/lod-conversion-utils.js.map +1 -1
  69. package/dist/es5/pgm-loader.js +11 -3
  70. package/dist/es5/pgm-loader.js.map +1 -1
  71. package/dist/es5/slpk-extractor/slpk-extractor.js +171 -0
  72. package/dist/es5/slpk-extractor/slpk-extractor.js.map +1 -0
  73. package/dist/es5/slpk-extractor-cli.js +117 -0
  74. package/dist/es5/slpk-extractor-cli.js.map +1 -0
  75. package/dist/esm/3d-tiles-converter/3d-tiles-converter.js +51 -58
  76. package/dist/esm/3d-tiles-converter/3d-tiles-converter.js.map +1 -1
  77. package/dist/esm/3d-tiles-converter/helpers/b3dm-converter.js +12 -11
  78. package/dist/esm/3d-tiles-converter/helpers/b3dm-converter.js.map +1 -1
  79. package/dist/esm/3d-tiles-converter/helpers/load-i3s.js +32 -0
  80. package/dist/esm/3d-tiles-converter/helpers/load-i3s.js.map +1 -0
  81. package/dist/esm/3d-tiles-converter/helpers/texture-atlas.js.map +1 -1
  82. package/dist/esm/converter-cli.js +8 -48
  83. package/dist/esm/converter-cli.js.map +1 -1
  84. package/dist/esm/deps-installer/deps-installer.js +38 -12
  85. package/dist/esm/deps-installer/deps-installer.js.map +1 -1
  86. package/dist/esm/i3s-converter/helpers/batch-ids-extensions.js +28 -11
  87. package/dist/esm/i3s-converter/helpers/batch-ids-extensions.js.map +1 -1
  88. package/dist/esm/i3s-converter/helpers/coordinate-converter.js.map +1 -1
  89. package/dist/esm/i3s-converter/helpers/feature-attributes.js +10 -8
  90. package/dist/esm/i3s-converter/helpers/feature-attributes.js.map +1 -1
  91. package/dist/esm/i3s-converter/helpers/geometry-attributes.js +77 -34
  92. package/dist/esm/i3s-converter/helpers/geometry-attributes.js.map +1 -1
  93. package/dist/esm/i3s-converter/helpers/geometry-converter.js +60 -61
  94. package/dist/esm/i3s-converter/helpers/geometry-converter.js.map +1 -1
  95. package/dist/esm/i3s-converter/helpers/gltf-attributes.js.map +1 -1
  96. package/dist/esm/i3s-converter/helpers/load-3d-tiles.js +33 -4
  97. package/dist/esm/i3s-converter/helpers/load-3d-tiles.js.map +1 -1
  98. package/dist/esm/i3s-converter/helpers/node-index-document.js +2 -1
  99. package/dist/esm/i3s-converter/helpers/node-index-document.js.map +1 -1
  100. package/dist/esm/i3s-converter/helpers/preprocess-3d-tiles.js +37 -12
  101. package/dist/esm/i3s-converter/helpers/preprocess-3d-tiles.js.map +1 -1
  102. package/dist/esm/i3s-converter/i3s-converter.js +101 -73
  103. package/dist/esm/i3s-converter/i3s-converter.js.map +1 -1
  104. package/dist/esm/i3s-converter/types.js +9 -9
  105. package/dist/esm/i3s-converter/types.js.map +1 -1
  106. package/dist/esm/i3s-server/README.md +46 -2
  107. package/dist/esm/i3s-server/app.js +13 -11
  108. package/dist/esm/i3s-server/app.js.map +1 -1
  109. package/dist/esm/i3s-server/bin/i3s-server.min.js +516 -0
  110. package/dist/esm/i3s-server/bin/www.js +30 -0
  111. package/dist/esm/i3s-server/bin/www.js.map +1 -0
  112. package/dist/esm/i3s-server/controllers/index-controller.js +4 -7
  113. package/dist/esm/i3s-server/controllers/index-controller.js.map +1 -1
  114. package/dist/esm/i3s-server/controllers/slpk-controller.js +9 -26
  115. package/dist/esm/i3s-server/controllers/slpk-controller.js.map +1 -1
  116. package/dist/esm/i3s-server/routes/index.js +1 -1
  117. package/dist/esm/i3s-server/routes/index.js.map +1 -1
  118. package/dist/esm/i3s-server/routes/slpk-router.js +5 -11
  119. package/dist/esm/i3s-server/routes/slpk-router.js.map +1 -1
  120. package/dist/esm/i3s-server/utils/create-scene-server.js +2 -5
  121. package/dist/esm/i3s-server/utils/create-scene-server.js.map +1 -1
  122. package/dist/esm/i3s-server/utils/server-utils.js +40 -0
  123. package/dist/esm/i3s-server/utils/server-utils.js.map +1 -0
  124. package/dist/esm/lib/utils/cli-utils.js +47 -0
  125. package/dist/esm/lib/utils/cli-utils.js.map +1 -0
  126. package/dist/esm/lib/utils/compress-util.js +1 -1
  127. package/dist/esm/lib/utils/compress-util.js.map +1 -1
  128. package/dist/esm/lib/utils/lod-conversion-utils.js +6 -4
  129. package/dist/esm/lib/utils/lod-conversion-utils.js.map +1 -1
  130. package/dist/esm/pgm-loader.js +7 -4
  131. package/dist/esm/pgm-loader.js.map +1 -1
  132. package/dist/esm/slpk-extractor/slpk-extractor.js +63 -0
  133. package/dist/esm/slpk-extractor/slpk-extractor.js.map +1 -0
  134. package/dist/esm/slpk-extractor-cli.js +74 -0
  135. package/dist/esm/slpk-extractor-cli.js.map +1 -0
  136. package/dist/i3s-converter/helpers/batch-ids-extensions.d.ts +15 -2
  137. package/dist/i3s-converter/helpers/batch-ids-extensions.d.ts.map +1 -1
  138. package/dist/i3s-converter/helpers/coordinate-converter.d.ts +1 -2
  139. package/dist/i3s-converter/helpers/coordinate-converter.d.ts.map +1 -1
  140. package/dist/i3s-converter/helpers/feature-attributes.d.ts +8 -8
  141. package/dist/i3s-converter/helpers/feature-attributes.d.ts.map +1 -1
  142. package/dist/i3s-converter/helpers/geometry-attributes.d.ts.map +1 -1
  143. package/dist/i3s-converter/helpers/geometry-converter.d.ts +9 -9
  144. package/dist/i3s-converter/helpers/geometry-converter.d.ts.map +1 -1
  145. package/dist/i3s-converter/helpers/gltf-attributes.d.ts +3 -3
  146. package/dist/i3s-converter/helpers/gltf-attributes.d.ts.map +1 -1
  147. package/dist/i3s-converter/helpers/load-3d-tiles.d.ts +15 -0
  148. package/dist/i3s-converter/helpers/load-3d-tiles.d.ts.map +1 -1
  149. package/dist/i3s-converter/helpers/node-index-document.d.ts.map +1 -1
  150. package/dist/i3s-converter/helpers/preprocess-3d-tiles.d.ts +4 -5
  151. package/dist/i3s-converter/helpers/preprocess-3d-tiles.d.ts.map +1 -1
  152. package/dist/i3s-converter/i3s-converter.d.ts +3 -2
  153. package/dist/i3s-converter/i3s-converter.d.ts.map +1 -1
  154. package/dist/i3s-converter/types.d.ts +48 -7
  155. package/dist/i3s-converter/types.d.ts.map +1 -1
  156. package/dist/i3s-server/app.d.ts +1 -2
  157. package/dist/i3s-server/app.d.ts.map +1 -1
  158. package/dist/i3s-server/bin/www.d.ts +3 -0
  159. package/dist/i3s-server/bin/www.d.ts.map +1 -0
  160. package/dist/i3s-server/controllers/index-controller.d.ts +6 -1
  161. package/dist/i3s-server/controllers/index-controller.d.ts.map +1 -1
  162. package/dist/i3s-server/controllers/slpk-controller.d.ts +13 -2
  163. package/dist/i3s-server/controllers/slpk-controller.d.ts.map +1 -1
  164. package/dist/i3s-server/routes/index.d.ts +1 -2
  165. package/dist/i3s-server/routes/index.d.ts.map +1 -1
  166. package/dist/i3s-server/routes/slpk-router.d.ts +2 -2
  167. package/dist/i3s-server/routes/slpk-router.d.ts.map +1 -1
  168. package/dist/i3s-server/utils/create-scene-server.d.ts +11 -5
  169. package/dist/i3s-server/utils/create-scene-server.d.ts.map +1 -1
  170. package/dist/i3s-server/utils/server-utils.d.ts +24 -0
  171. package/dist/i3s-server/utils/server-utils.d.ts.map +1 -0
  172. package/dist/lib/utils/cli-utils.d.ts +34 -0
  173. package/dist/lib/utils/cli-utils.d.ts.map +1 -0
  174. package/dist/lib/utils/lod-conversion-utils.d.ts +2 -2
  175. package/dist/lib/utils/lod-conversion-utils.d.ts.map +1 -1
  176. package/dist/pgm-loader.d.ts +9 -2
  177. package/dist/pgm-loader.d.ts.map +1 -1
  178. package/dist/slpk-extractor/slpk-extractor.d.ts +23 -0
  179. package/dist/slpk-extractor/slpk-extractor.d.ts.map +1 -0
  180. package/dist/slpk-extractor-cli.d.ts +17 -0
  181. package/dist/slpk-extractor-cli.d.ts.map +1 -0
  182. package/dist/slpk-extractor.min.js +189 -0
  183. package/package.json +27 -21
  184. package/src/3d-tiles-converter/3d-tiles-converter.ts +65 -69
  185. package/src/3d-tiles-converter/helpers/b3dm-converter.ts +23 -19
  186. package/src/3d-tiles-converter/helpers/load-i3s.ts +52 -0
  187. package/src/3d-tiles-converter/helpers/texture-atlas.ts +6 -2
  188. package/src/converter-cli.ts +16 -74
  189. package/src/deps-installer/deps-installer.ts +56 -11
  190. package/src/i3s-converter/helpers/batch-ids-extensions.ts +77 -32
  191. package/src/i3s-converter/helpers/coordinate-converter.ts +1 -2
  192. package/src/i3s-converter/helpers/feature-attributes.ts +23 -18
  193. package/src/i3s-converter/helpers/geometry-attributes.ts +81 -44
  194. package/src/i3s-converter/helpers/geometry-converter.ts +149 -126
  195. package/src/i3s-converter/helpers/gltf-attributes.ts +9 -10
  196. package/src/i3s-converter/helpers/load-3d-tiles.ts +61 -5
  197. package/src/i3s-converter/helpers/node-index-document.ts +5 -1
  198. package/src/i3s-converter/helpers/preprocess-3d-tiles.ts +70 -21
  199. package/src/i3s-converter/i3s-converter.ts +145 -73
  200. package/src/i3s-converter/types.ts +49 -7
  201. package/src/i3s-server/README.md +46 -2
  202. package/src/i3s-server/{app.js → app.ts} +11 -9
  203. package/src/i3s-server/bin/www.ts +38 -0
  204. package/src/i3s-server/controllers/{index-controller.js → index-controller.ts} +10 -9
  205. package/src/i3s-server/controllers/slpk-controller.ts +32 -0
  206. package/src/i3s-server/routes/{index.js → index.ts} +2 -1
  207. package/src/i3s-server/routes/{slpk-router.js → slpk-router.ts} +5 -10
  208. package/src/i3s-server/utils/create-scene-server.ts +20 -0
  209. package/src/i3s-server/utils/server-utils.ts +70 -0
  210. package/src/lib/utils/cli-utils.ts +78 -0
  211. package/src/lib/utils/compress-util.ts +1 -1
  212. package/src/lib/utils/lod-conversion-utils.ts +10 -6
  213. package/src/pgm-loader.ts +15 -7
  214. package/src/slpk-extractor/slpk-extractor.ts +101 -0
  215. package/src/slpk-extractor-cli.ts +128 -0
  216. package/dist/3d-tiles-attributes-worker.d.ts +0 -28
  217. package/dist/3d-tiles-attributes-worker.d.ts.map +0 -1
  218. package/dist/3d-tiles-attributes-worker.js +0 -3
  219. package/dist/3d-tiles-attributes-worker.js.map +0 -7
  220. package/dist/3d-tiles-converter/3d-tiles-converter.js +0 -288
  221. package/dist/3d-tiles-converter/helpers/b3dm-converter.js +0 -269
  222. package/dist/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js +0 -23
  223. package/dist/3d-tiles-converter/helpers/texture-atlas.js +0 -52
  224. package/dist/3d-tiles-converter/json-templates/tileset.js +0 -43
  225. package/dist/bundle.js +0 -5
  226. package/dist/constants.js +0 -4
  227. package/dist/converter-cli.js +0 -280
  228. package/dist/deps-installer/deps-installer.js +0 -63
  229. package/dist/es5/3d-tiles-attributes-worker.js +0 -25
  230. package/dist/es5/3d-tiles-attributes-worker.js.map +0 -1
  231. package/dist/es5/i3s-attributes-worker.js +0 -25
  232. package/dist/es5/i3s-attributes-worker.js.map +0 -1
  233. package/dist/es5/i3s-server/bin/www +0 -102
  234. package/dist/es5/workers/3d-tiles-attributes-worker.js +0 -28
  235. package/dist/es5/workers/3d-tiles-attributes-worker.js.map +0 -1
  236. package/dist/es5/workers/i3s-attributes-worker.js +0 -30
  237. package/dist/es5/workers/i3s-attributes-worker.js.map +0 -1
  238. package/dist/esm/3d-tiles-attributes-worker.js +0 -16
  239. package/dist/esm/3d-tiles-attributes-worker.js.map +0 -1
  240. package/dist/esm/i3s-attributes-worker.js +0 -16
  241. package/dist/esm/i3s-attributes-worker.js.map +0 -1
  242. package/dist/esm/i3s-server/bin/www +0 -102
  243. package/dist/esm/workers/3d-tiles-attributes-worker.js +0 -8
  244. package/dist/esm/workers/3d-tiles-attributes-worker.js.map +0 -1
  245. package/dist/esm/workers/i3s-attributes-worker.js +0 -7
  246. package/dist/esm/workers/i3s-attributes-worker.js.map +0 -1
  247. package/dist/i3s-attributes-worker.d.ts +0 -45
  248. package/dist/i3s-attributes-worker.d.ts.map +0 -1
  249. package/dist/i3s-attributes-worker.js +0 -9
  250. package/dist/i3s-attributes-worker.js.map +0 -7
  251. package/dist/i3s-converter/helpers/batch-ids-extensions.js +0 -138
  252. package/dist/i3s-converter/helpers/coordinate-converter.js +0 -123
  253. package/dist/i3s-converter/helpers/create-scene-server-path.js +0 -28
  254. package/dist/i3s-converter/helpers/feature-attributes.js +0 -216
  255. package/dist/i3s-converter/helpers/geometry-attributes.js +0 -202
  256. package/dist/i3s-converter/helpers/geometry-converter.js +0 -1225
  257. package/dist/i3s-converter/helpers/gltf-attributes.js +0 -128
  258. package/dist/i3s-converter/helpers/load-3d-tiles.js +0 -53
  259. package/dist/i3s-converter/helpers/node-debug.js +0 -120
  260. package/dist/i3s-converter/helpers/node-index-document.js +0 -268
  261. package/dist/i3s-converter/helpers/node-pages.js +0 -316
  262. package/dist/i3s-converter/helpers/preprocess-3d-tiles.js +0 -76
  263. package/dist/i3s-converter/helpers/tileset-traversal.js +0 -29
  264. package/dist/i3s-converter/i3s-converter.js +0 -911
  265. package/dist/i3s-converter/json-templates/geometry-definitions.js +0 -87
  266. package/dist/i3s-converter/json-templates/layers.js +0 -139
  267. package/dist/i3s-converter/json-templates/metadata.js +0 -25
  268. package/dist/i3s-converter/json-templates/node.js +0 -89
  269. package/dist/i3s-converter/json-templates/scene-server.js +0 -31
  270. package/dist/i3s-converter/json-templates/shared-resources.js +0 -129
  271. package/dist/i3s-converter/json-templates/store.js +0 -103
  272. package/dist/i3s-converter/types.js +0 -17
  273. package/dist/i3s-server/app.js +0 -22
  274. package/dist/i3s-server/controllers/index-controller.js +0 -23
  275. package/dist/i3s-server/controllers/slpk-controller.js +0 -32
  276. package/dist/i3s-server/routes/index.js +0 -16
  277. package/dist/i3s-server/routes/slpk-router.js +0 -33
  278. package/dist/i3s-server/utils/create-scene-server.js +0 -14
  279. package/dist/index.js +0 -10
  280. package/dist/lib/utils/compress-util.js +0 -257
  281. package/dist/lib/utils/file-utils.js +0 -139
  282. package/dist/lib/utils/geometry-utils.js +0 -18
  283. package/dist/lib/utils/lod-conversion-utils.js +0 -76
  284. package/dist/lib/utils/queue.js +0 -18
  285. package/dist/lib/utils/statistic-utills.js +0 -64
  286. package/dist/lib/utils/write-queue.js +0 -80
  287. package/dist/pgm-loader.js +0 -24
  288. package/dist/workers/3d-tiles-attributes-worker.d.ts +0 -2
  289. package/dist/workers/3d-tiles-attributes-worker.d.ts.map +0 -1
  290. package/dist/workers/3d-tiles-attributes-worker.js +0 -9
  291. package/dist/workers/i3s-attributes-worker.d.ts +0 -2
  292. package/dist/workers/i3s-attributes-worker.d.ts.map +0 -1
  293. package/dist/workers/i3s-attributes-worker.js +0 -5
  294. package/src/3d-tiles-attributes-worker.ts +0 -43
  295. package/src/i3s-attributes-worker.ts +0 -59
  296. package/src/i3s-server/bin/www +0 -102
  297. package/src/i3s-server/controllers/slpk-controller.js +0 -38
  298. package/src/i3s-server/utils/create-scene-server.js +0 -15
  299. package/src/workers/3d-tiles-attributes-worker.ts +0 -6
  300. package/src/workers/i3s-attributes-worker.ts +0 -7
@@ -1,6 +1,7 @@
1
+ import { Tiles3DArchiveFileSystem } from '@loaders.gl/3d-tiles';
1
2
  import { load } from '@loaders.gl/core';
2
3
  export const loadNestedTileset = async (sourceTileset, sourceTile, tilesetLoadOptions) => {
3
- const isTileset = sourceTile.type === 'json';
4
+ const isTileset = isNestedTileset(sourceTile);
4
5
  if (!sourceTileset || !sourceTile.contentUrl || !isTileset) {
5
6
  return;
6
7
  }
@@ -11,13 +12,13 @@ export const loadNestedTileset = async (sourceTileset, sourceTile, tilesetLoadOp
11
12
  assetGltfUpAxis: sourceTileset.asset && sourceTileset.asset.gltfUpAxis || 'Y'
12
13
  }
13
14
  };
14
- const tileContent = await load(sourceTile.contentUrl, sourceTileset.loader, loadOptions);
15
+ const tileContent = await loadFromArchive(sourceTile.contentUrl, sourceTileset.loader, loadOptions);
15
16
  if (tileContent.root) {
16
17
  sourceTile.children = [tileContent.root];
17
18
  }
18
19
  };
19
20
  export const loadTile3DContent = async (sourceTileset, sourceTile, tilesetLoadOptions) => {
20
- const isTileset = sourceTile.type === 'json';
21
+ const isTileset = isNestedTileset(sourceTile);
21
22
  if (!sourceTileset || !sourceTile.contentUrl || isTileset) {
22
23
  return null;
23
24
  }
@@ -29,7 +30,35 @@ export const loadTile3DContent = async (sourceTileset, sourceTile, tilesetLoadOp
29
30
  assetGltfUpAxis: sourceTileset.asset && sourceTileset.asset.gltfUpAxis || 'Y'
30
31
  }
31
32
  };
32
- const tileContent = await load(sourceTile.contentUrl, sourceTileset.loader, loadOptions);
33
+ const tileContent = await loadFromArchive(sourceTile.contentUrl, sourceTileset.loader, loadOptions);
33
34
  return tileContent;
34
35
  };
36
+ export async function loadFromArchive(url, loader, loadOptions) {
37
+ const tz3UrlParts = url.split('.3tz');
38
+ let filename;
39
+ if (tz3UrlParts.length === 1) {
40
+ filename = null;
41
+ } else if (tz3UrlParts.length === 2) {
42
+ filename = tz3UrlParts[1].slice(1);
43
+ if (filename === '') {
44
+ filename = 'tileset.json';
45
+ }
46
+ } else {
47
+ throw new Error('Unexpected URL format');
48
+ }
49
+ if (filename) {
50
+ const tz3Path = "".concat(tz3UrlParts[0], ".3tz");
51
+ const fileSystem = new Tiles3DArchiveFileSystem(tz3Path);
52
+ const content = await load(filename, loader, {
53
+ ...loadOptions,
54
+ fetch: fileSystem.fetch.bind(fileSystem)
55
+ });
56
+ await fileSystem.destroy();
57
+ return content;
58
+ }
59
+ return await load(url, loader, loadOptions);
60
+ }
61
+ export function isNestedTileset(tile) {
62
+ return (tile === null || tile === void 0 ? void 0 : tile.type) === 'json' || (tile === null || tile === void 0 ? void 0 : tile.type) === '3tz';
63
+ }
35
64
  //# sourceMappingURL=load-3d-tiles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"load-3d-tiles.js","names":["load","loadNestedTileset","sourceTileset","sourceTile","tilesetLoadOptions","isTileset","type","contentUrl","loadOptions","loader","id","assetGltfUpAxis","asset","gltfUpAxis","tileContent","root","children","loadTile3DContent"],"sources":["../../../../src/i3s-converter/helpers/load-3d-tiles.ts"],"sourcesContent":["import type {\n Tiles3DLoaderOptions,\n Tiles3DTileContent,\n Tiles3DTileJSONPostprocessed,\n Tiles3DTilesetJSONPostprocessed\n} from '@loaders.gl/3d-tiles';\nimport {load} from '@loaders.gl/core';\n\n/**\n * Load nested 3DTiles tileset. If the sourceTile is not nested tileset - do nothing\n * @param sourceTileset - source root tileset JSON\n * @param sourceTile - source tile JSON that is supposed to has link to nested tileset\n * @param tilesetLoadOptions - load options for Tiles3DLoader\n * @returns nothing\n */\nexport const loadNestedTileset = async (\n sourceTileset: Tiles3DTilesetJSONPostprocessed | null,\n sourceTile: Tiles3DTileJSONPostprocessed,\n tilesetLoadOptions: Tiles3DLoaderOptions\n): Promise<void> => {\n const isTileset = sourceTile.type === 'json';\n if (!sourceTileset || !sourceTile.contentUrl || !isTileset) {\n return;\n }\n\n const loadOptions = {\n ...tilesetLoadOptions,\n [sourceTileset.loader.id]: {\n isTileset,\n assetGltfUpAxis: (sourceTileset.asset && sourceTileset.asset.gltfUpAxis) || 'Y'\n }\n };\n const tileContent = await load(sourceTile.contentUrl, sourceTileset.loader, loadOptions);\n\n if (tileContent.root) {\n sourceTile.children = [tileContent.root];\n }\n};\n\n/**\n * Load 3DTiles tile content, that includes glTF object\n * @param sourceTileset - source root tileset JSON\n * @param sourceTile - source tile JSON that has link to content data\n * @param tilesetLoadOptions - load options for Tiles3DLoader\n * @returns - 3DTiles tile content or null\n */\nexport const loadTile3DContent = async (\n sourceTileset: Tiles3DTilesetJSONPostprocessed | null,\n sourceTile: Tiles3DTileJSONPostprocessed,\n tilesetLoadOptions: Tiles3DLoaderOptions\n): Promise<Tiles3DTileContent | null> => {\n const isTileset = sourceTile.type === 'json';\n if (!sourceTileset || !sourceTile.contentUrl || isTileset) {\n return null;\n }\n\n const loadOptions = {\n ...tilesetLoadOptions,\n [sourceTileset.loader.id]: {\n ...(tilesetLoadOptions[sourceTileset.loader.id] || {}),\n isTileset,\n assetGltfUpAxis: (sourceTileset.asset && sourceTileset.asset.gltfUpAxis) || 'Y'\n }\n };\n const tileContent = await load(sourceTile.contentUrl, sourceTileset.loader, loadOptions);\n\n return tileContent;\n};\n"],"mappings":"AAMA,SAAQA,IAAI,QAAO,kBAAkB;AASrC,OAAO,MAAMC,iBAAiB,GAAG,MAAAA,CAC/BC,aAAqD,EACrDC,UAAwC,EACxCC,kBAAwC,KACtB;EAClB,MAAMC,SAAS,GAAGF,UAAU,CAACG,IAAI,KAAK,MAAM;EAC5C,IAAI,CAACJ,aAAa,IAAI,CAACC,UAAU,CAACI,UAAU,IAAI,CAACF,SAAS,EAAE;IAC1D;EACF;EAEA,MAAMG,WAAW,GAAG;IAClB,GAAGJ,kBAAkB;IACrB,CAACF,aAAa,CAACO,MAAM,CAACC,EAAE,GAAG;MACzBL,SAAS;MACTM,eAAe,EAAGT,aAAa,CAACU,KAAK,IAAIV,aAAa,CAACU,KAAK,CAACC,UAAU,IAAK;IAC9E;EACF,CAAC;EACD,MAAMC,WAAW,GAAG,MAAMd,IAAI,CAACG,UAAU,CAACI,UAAU,EAAEL,aAAa,CAACO,MAAM,EAAED,WAAW,CAAC;EAExF,IAAIM,WAAW,CAACC,IAAI,EAAE;IACpBZ,UAAU,CAACa,QAAQ,GAAG,CAACF,WAAW,CAACC,IAAI,CAAC;EAC1C;AACF,CAAC;AASD,OAAO,MAAME,iBAAiB,GAAG,MAAAA,CAC/Bf,aAAqD,EACrDC,UAAwC,EACxCC,kBAAwC,KACD;EACvC,MAAMC,SAAS,GAAGF,UAAU,CAACG,IAAI,KAAK,MAAM;EAC5C,IAAI,CAACJ,aAAa,IAAI,CAACC,UAAU,CAACI,UAAU,IAAIF,SAAS,EAAE;IACzD,OAAO,IAAI;EACb;EAEA,MAAMG,WAAW,GAAG;IAClB,GAAGJ,kBAAkB;IACrB,CAACF,aAAa,CAACO,MAAM,CAACC,EAAE,GAAG;MACzB,IAAIN,kBAAkB,CAACF,aAAa,CAACO,MAAM,CAACC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;MACtDL,SAAS;MACTM,eAAe,EAAGT,aAAa,CAACU,KAAK,IAAIV,aAAa,CAACU,KAAK,CAACC,UAAU,IAAK;IAC9E;EACF,CAAC;EACD,MAAMC,WAAW,GAAG,MAAMd,IAAI,CAACG,UAAU,CAACI,UAAU,EAAEL,aAAa,CAACO,MAAM,EAAED,WAAW,CAAC;EAExF,OAAOM,WAAW;AACpB,CAAC"}
1
+ {"version":3,"file":"load-3d-tiles.js","names":["Tiles3DArchiveFileSystem","load","loadNestedTileset","sourceTileset","sourceTile","tilesetLoadOptions","isTileset","isNestedTileset","contentUrl","loadOptions","loader","id","assetGltfUpAxis","asset","gltfUpAxis","tileContent","loadFromArchive","root","children","loadTile3DContent","url","tz3UrlParts","split","filename","length","slice","Error","tz3Path","concat","fileSystem","content","fetch","bind","destroy","tile","type"],"sources":["../../../../src/i3s-converter/helpers/load-3d-tiles.ts"],"sourcesContent":["import type {\n Tiles3DLoaderOptions,\n Tiles3DTileContent,\n Tiles3DTileJSONPostprocessed,\n Tiles3DTilesetJSONPostprocessed\n} from '@loaders.gl/3d-tiles';\nimport {Tiles3DArchiveFileSystem} from '@loaders.gl/3d-tiles';\nimport {LoaderWithParser, load} from '@loaders.gl/core';\n\n/**\n * Load nested 3DTiles tileset. If the sourceTile is not nested tileset - do nothing\n * @param sourceTileset - source root tileset JSON\n * @param sourceTile - source tile JSON that is supposed to has link to nested tileset\n * @param tilesetLoadOptions - load options for Tiles3DLoader\n * @returns nothing\n */\nexport const loadNestedTileset = async (\n sourceTileset: Tiles3DTilesetJSONPostprocessed | null,\n sourceTile: Tiles3DTileJSONPostprocessed,\n tilesetLoadOptions: Tiles3DLoaderOptions\n): Promise<void> => {\n const isTileset = isNestedTileset(sourceTile);\n if (!sourceTileset || !sourceTile.contentUrl || !isTileset) {\n return;\n }\n\n const loadOptions = {\n ...tilesetLoadOptions,\n [sourceTileset.loader.id]: {\n isTileset,\n assetGltfUpAxis: (sourceTileset.asset && sourceTileset.asset.gltfUpAxis) || 'Y'\n }\n };\n const tileContent = await loadFromArchive(\n sourceTile.contentUrl,\n sourceTileset.loader,\n loadOptions\n );\n\n if (tileContent.root) {\n sourceTile.children = [tileContent.root];\n }\n};\n\n/**\n * Load 3DTiles tile content, that includes glTF object\n * @param sourceTileset - source root tileset JSON\n * @param sourceTile - source tile JSON that has link to content data\n * @param tilesetLoadOptions - load options for Tiles3DLoader\n * @returns - 3DTiles tile content or null\n */\nexport const loadTile3DContent = async (\n sourceTileset: Tiles3DTilesetJSONPostprocessed | null,\n sourceTile: Tiles3DTileJSONPostprocessed,\n tilesetLoadOptions: Tiles3DLoaderOptions\n): Promise<Tiles3DTileContent | null> => {\n const isTileset = isNestedTileset(sourceTile);\n if (!sourceTileset || !sourceTile.contentUrl || isTileset) {\n return null;\n }\n\n const loadOptions = {\n ...tilesetLoadOptions,\n [sourceTileset.loader.id]: {\n ...(tilesetLoadOptions[sourceTileset.loader.id] || {}),\n isTileset,\n assetGltfUpAxis: (sourceTileset.asset && sourceTileset.asset.gltfUpAxis) || 'Y'\n }\n };\n const tileContent = await loadFromArchive(\n sourceTile.contentUrl,\n sourceTileset.loader,\n loadOptions\n );\n\n return tileContent;\n};\n\n/**\n * Load a resource with load options and .3tz format support\n * @param url - resource URL\n * @param loader - loader to parse data (Tiles3DLoader / CesiumIonLoader)\n * @param loadOptions - 3d-tiles loader options\n * @returns 3d-tiles resource\n */\nexport async function loadFromArchive(\n url: string,\n loader: LoaderWithParser,\n loadOptions: Tiles3DLoaderOptions\n) {\n const tz3UrlParts = url.split('.3tz');\n let filename: string | null;\n // No '.3tz'. The file will be loaded with global fetch function\n if (tz3UrlParts.length === 1) {\n filename = null;\n } else if (tz3UrlParts.length === 2) {\n filename = tz3UrlParts[1].slice(1);\n if (filename === '') {\n filename = 'tileset.json';\n }\n } else {\n throw new Error('Unexpected URL format');\n }\n if (filename) {\n const tz3Path = `${tz3UrlParts[0]}.3tz`;\n const fileSystem = new Tiles3DArchiveFileSystem(tz3Path);\n const content = await load(filename, loader, {\n ...loadOptions,\n fetch: fileSystem.fetch.bind(fileSystem)\n });\n await fileSystem.destroy();\n return content;\n }\n return await load(url, loader, loadOptions);\n}\n\n/**\n * Check if tile is nested tileset\n * @param tile - 3DTiles header data\n * @returns true if tile is nested tileset\n */\nexport function isNestedTileset(tile: Tiles3DTileJSONPostprocessed) {\n return tile?.type === 'json' || tile?.type === '3tz';\n}\n"],"mappings":"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"}
@@ -187,7 +187,8 @@ export class NodeIndexDocument {
187
187
  }
188
188
  if (attributes && attributes.length && (_parentNode$converter = parentNode.converter.layers0) !== null && _parentNode$converter !== void 0 && (_parentNode$converter2 = _parentNode$converter.attributeStorageInfo) !== null && _parentNode$converter2 !== void 0 && _parentNode$converter2.length) {
189
189
  node.attributeData = [];
190
- for (let index = 0; index < attributes.length; index++) {
190
+ const minimumLength = attributes.length < parentNode.converter.layers0.attributeStorageInfo.length ? attributes.length : parentNode.converter.layers0.attributeStorageInfo.length;
191
+ for (let index = 0; index < minimumLength; index++) {
191
192
  const folderName = parentNode.converter.layers0.attributeStorageInfo[index].key;
192
193
  node.attributeData.push({
193
194
  href: "./attributes/".concat(folderName, "/0")
@@ -1 +1 @@
1
- {"version":3,"file":"node-index-document.js","names":["join","transform","v4","uuidv4","openJson","writeFile","writeFileForSlpk","NODE","nodeTemplate","NodeIndexDocument","finalized","_finalized","constructor","id","converter","_defineProperty","inPageId","toString","addData","data","options","instantNodeWriting","write","addChildren","childNodes","newChildren","node","nodeData","load","push","href","concat","obb","mbs","children","_data$children","addNeighbors","childNode","_childNodeData$neighb","_nodeData$children","childNodeData","neighbors","Number","length","neighbor","console","warn","save","finalize","child","flush","path","layers0Path","slpk","writeQueue","enqueue","archiveKey","writePromise","JSON","stringify","compressList","parentNodePath","parentNodeFileName","createRootNode","boundingVolumes","rootData","createRootNodeIndexDocument","rootNode","createNode","parentNode","lodSelection","nodeInPage","resources","createNodeIndexDocument","index","root0data","version","toUpperCase","level","metricType","maxError","texture","attributes","nodeId","parentNodeData","mesh","_parentNode$converter","_parentNode$converter2","geometryData","sharedResource","textureData","layers0","attributeStorageInfo","attributeData","folderName","key"],"sources":["../../../../src/i3s-converter/helpers/node-index-document.ts"],"sourcesContent":["import {join} from 'path';\nimport {\n BoundingVolumes,\n LodSelection,\n Node3DIndexDocument,\n NodeInPage,\n NodeReference\n} from '@loaders.gl/i3s';\nimport transform from 'json-map-transform';\nimport {v4 as uuidv4} from 'uuid';\nimport {openJson, writeFile, writeFileForSlpk} from '../../lib/utils/file-utils';\nimport I3SConverter from '../i3s-converter';\nimport {NODE as nodeTemplate} from '../json-templates/node';\nimport {I3SConvertedResources} from '../types';\n\n/**\n * Wrapper for https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md data\n * The class allows working with 3DNodeIndexDocument in 2 modes:\n * in memory: the data is stored in `data` field\n * on disk: the data is written on disk in a file. The file can be rewritten when new childrend or neighbors have to be added\n */\nexport class NodeIndexDocument {\n /** Node id */\n public id: string;\n /** Id in node pages */\n public inPageId: number;\n /** 3DNodeIndexDocument data */\n public data: Node3DIndexDocument | null = null;\n /** children */\n public children: NodeIndexDocument[] = [];\n /** converter instance */\n private converter: I3SConverter;\n\n /**\n * Finalized property. It means that all child nodes are saved and their data\n * is unloaded\n */\n private _finalized: boolean = false;\n get finalized(): boolean {\n return this._finalized;\n }\n\n /**\n * Constructor\n * @param id - id of the node in node pages\n * @param converter - converter instance\n */\n constructor(id: number, converter: I3SConverter) {\n this.inPageId = id;\n this.id = id === 0 ? 'root' : id.toString();\n this.converter = converter;\n }\n\n /**\n * Add Node3DIndexDocument data to the node\n * @param data Node3DIndexDocument data\n * @returns this NodeIndexDocument instance (to recurring with constructor)\n */\n public async addData(data: Node3DIndexDocument): Promise<NodeIndexDocument> {\n if (this.converter.options.instantNodeWriting) {\n await this.write(data);\n } else {\n this.data = data;\n }\n return this;\n }\n\n /**\n * Add child node references\n * @param childNodes - child NodeIndexDocument instances\n */\n public async addChildren(childNodes: NodeIndexDocument[]): Promise<void> {\n const newChildren: NodeReference[] = [];\n for (const node of childNodes) {\n const nodeData = await node.load();\n newChildren.push({\n id: node.id,\n href: `../${node.id}`,\n obb: nodeData.obb,\n mbs: nodeData.mbs\n });\n }\n this.children = this.children.concat(childNodes);\n\n let data: Node3DIndexDocument | null = this.data;\n if (this.converter.options.instantNodeWriting) {\n data = (await this.load()) as Node3DIndexDocument;\n }\n if (data) {\n data.children = data.children ?? [];\n data.children = data.children.concat(newChildren);\n }\n if (this.converter.options.instantNodeWriting && data) {\n await this.write(data);\n }\n }\n\n /**\n * Add neighbors to child nodes of this node\n */\n public async addNeighbors(): Promise<void> {\n if (this.finalized) {\n return;\n }\n const nodeData = await this.load();\n for (const childNode of this.children) {\n const childNodeData = await childNode.load();\n childNodeData.neighbors = childNodeData.neighbors ?? [];\n\n // Don't do large amount of \"neightbors\" to avoid big memory consumption\n if (Number(nodeData?.children?.length) < 1000) {\n for (const neighbor of nodeData.children || []) {\n if (childNode.id === neighbor.id) {\n continue; // eslint-disable-line\n }\n\n childNodeData.neighbors.push({...neighbor});\n }\n } else {\n // eslint-disable-next-line no-console, no-undef\n console.warn(\n `Node ${childNode.id}: neighbors attribute is omited because of large number of neigbors`\n );\n delete childNodeData.neighbors;\n }\n\n if (this.converter.options.instantNodeWriting && childNodeData) {\n await childNode.write(childNodeData);\n }\n await childNode.save();\n }\n // The save after adding neighbors is the last one. Finalize the the node\n this.finalize();\n }\n\n /** Save 3DNodeIndexDocument in file on disk */\n public async save(): Promise<void> {\n if (this.data) {\n await this.write(this.data);\n }\n }\n\n /** Finalize the node */\n private finalize(): void {\n this._finalized = true;\n for (const child of this.children) {\n child.flush();\n }\n }\n\n /**\n * Write 3DNodeIndexDocument https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md\n * @param node - Node3DIndexDocument object\n */\n private async write(node: Node3DIndexDocument): Promise<void> {\n const path = join(this.converter.layers0Path, 'nodes', this.id);\n if (this.converter.options.slpk) {\n await this.converter.writeQueue.enqueue(\n {\n archiveKey: `nodes/${this.id}/3dNodeIndexDocument.json.gz`,\n writePromise: () =>\n writeFileForSlpk(\n path,\n JSON.stringify(node),\n '3dNodeIndexDocument.json',\n true,\n this.converter.compressList\n )\n },\n true\n );\n } else {\n await this.converter.writeQueue.enqueue(\n {writePromise: () => writeFile(path, JSON.stringify(node))},\n true\n );\n }\n }\n\n /**\n * Load 3DNodeIndexDocument data from file on disk\n * @returns 3DNodeIndexDocument object\n */\n private async load(): Promise<Node3DIndexDocument> {\n if (this.data) {\n return this.data;\n }\n const path = this.id;\n const parentNodePath = join(this.converter.layers0Path, 'nodes', path);\n let parentNodeFileName = 'index.json';\n if (this.converter.options.slpk) {\n parentNodeFileName = '3dNodeIndexDocument.json';\n }\n return (await openJson(parentNodePath, parentNodeFileName)) as Node3DIndexDocument;\n }\n\n /**\n * Unload the Node data\n */\n private flush(): void {\n this.data = null;\n }\n\n /**\n * Create root node of the tree\n * @param boundingVolumes - MBS and OOB bounding volumes data\n * @param converter - I3SConverter instance\n * @returns instance of NodeIndexDocument\n */\n static async createRootNode(\n boundingVolumes: BoundingVolumes,\n converter: I3SConverter\n ): Promise<NodeIndexDocument> {\n const rootData = NodeIndexDocument.createRootNodeIndexDocument(boundingVolumes);\n const rootNode = await new NodeIndexDocument(0, converter).addData(rootData);\n return rootNode;\n }\n\n /**\n * Create NodeIndexDocument instance\n * @param parentNode - parent NodeIndexDocument\n * @param boundingVolumes - MBS and OOB bounding volumes data\n * @param lodSelection - LOD metrics data\n * @param nodeInPage - node data in node pages\n * @param resources - resources extracted from gltf/b3dm file\n * @param converter - I3SConverter instance\n * @returns NodeIndexDocument instance\n */\n static async createNode(\n parentNode: NodeIndexDocument,\n boundingVolumes: BoundingVolumes,\n lodSelection: LodSelection[],\n nodeInPage: NodeInPage,\n resources: I3SConvertedResources,\n converter: I3SConverter\n ): Promise<NodeIndexDocument> {\n const data = await NodeIndexDocument.createNodeIndexDocument(\n parentNode,\n boundingVolumes,\n lodSelection,\n nodeInPage,\n resources\n );\n const node = await new NodeIndexDocument(nodeInPage.index, converter).addData(data);\n return node;\n }\n\n /**\n * Form 3DNodeIndexDocument data for the root node\n * @param boundingVolumes - mbs and obb data about node's bounding volume\n * @return 3DNodeIndexDocument data https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md\n */\n static createRootNodeIndexDocument(boundingVolumes: BoundingVolumes): Node3DIndexDocument {\n const root0data = {\n version: `{${uuidv4().toUpperCase()}}`,\n id: 'root',\n level: 0,\n lodSelection: [\n {\n metricType: 'maxScreenThresholdSQ',\n maxError: 0\n },\n {\n metricType: 'maxScreenThreshold',\n maxError: 0\n }\n ],\n ...boundingVolumes,\n children: []\n };\n return transform(root0data, nodeTemplate());\n }\n\n /**\n * Create a new Node3DIndexDocument\n * @param parentNode - 3DNodeIndexDocument https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md object of the parent node\n * @param boundingVolumes - Bounding volumes\n * @param lodSelection - Level of Details (LOD) metrics\n * @param nodeInPage - corresponding node object in a node page\n * @param resources - the node resources data\n * @param resources.texture - texture image\n * @param resources.attributes - feature attributes\n * @return 3DNodeIndexDocument https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md object\n */\n static async createNodeIndexDocument(\n parentNode: NodeIndexDocument,\n boundingVolumes: BoundingVolumes,\n lodSelection: LodSelection[],\n nodeInPage: NodeInPage,\n resources: I3SConvertedResources\n ): Promise<Node3DIndexDocument> {\n const {texture, attributes} = resources;\n const nodeId = nodeInPage.index!;\n const parentNodeData = await parentNode.load();\n const nodeData = {\n version: parentNodeData.version,\n id: nodeId.toString(),\n level: parentNodeData.level! + 1,\n ...boundingVolumes,\n lodSelection,\n parentNode: {\n id: parentNode.id,\n href: `../${parentNode.id}`,\n mbs: parentNodeData.mbs,\n obb: parentNodeData.obb\n },\n children: [],\n neighbors: []\n };\n const node = transform(nodeData, nodeTemplate());\n\n if (nodeInPage.mesh) {\n node.geometryData = [{href: './geometries/0'}];\n node.sharedResource = {href: './shared'};\n\n if (texture) {\n node.textureData = [{href: './textures/0'}, {href: './textures/1'}];\n }\n\n if (\n attributes &&\n attributes.length &&\n parentNode.converter.layers0?.attributeStorageInfo?.length\n ) {\n node.attributeData = [];\n for (let index = 0; index < attributes.length; index++) {\n const folderName = parentNode.converter.layers0.attributeStorageInfo[index].key;\n node.attributeData.push({href: `./attributes/${folderName}/0`});\n }\n }\n }\n\n return node;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"node-index-document.js","names":["join","transform","v4","uuidv4","openJson","writeFile","writeFileForSlpk","NODE","nodeTemplate","NodeIndexDocument","finalized","_finalized","constructor","id","converter","_defineProperty","inPageId","toString","addData","data","options","instantNodeWriting","write","addChildren","childNodes","newChildren","node","nodeData","load","push","href","concat","obb","mbs","children","_data$children","addNeighbors","childNode","_childNodeData$neighb","_nodeData$children","childNodeData","neighbors","Number","length","neighbor","console","warn","save","finalize","child","flush","path","layers0Path","slpk","writeQueue","enqueue","archiveKey","writePromise","JSON","stringify","compressList","parentNodePath","parentNodeFileName","createRootNode","boundingVolumes","rootData","createRootNodeIndexDocument","rootNode","createNode","parentNode","lodSelection","nodeInPage","resources","createNodeIndexDocument","index","root0data","version","toUpperCase","level","metricType","maxError","texture","attributes","nodeId","parentNodeData","mesh","_parentNode$converter","_parentNode$converter2","geometryData","sharedResource","textureData","layers0","attributeStorageInfo","attributeData","minimumLength","folderName","key"],"sources":["../../../../src/i3s-converter/helpers/node-index-document.ts"],"sourcesContent":["import {join} from 'path';\nimport {\n BoundingVolumes,\n LodSelection,\n Node3DIndexDocument,\n NodeInPage,\n NodeReference\n} from '@loaders.gl/i3s';\nimport transform from 'json-map-transform';\nimport {v4 as uuidv4} from 'uuid';\nimport {openJson, writeFile, writeFileForSlpk} from '../../lib/utils/file-utils';\nimport I3SConverter from '../i3s-converter';\nimport {NODE as nodeTemplate} from '../json-templates/node';\nimport {I3SConvertedResources} from '../types';\n\n/**\n * Wrapper for https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md data\n * The class allows working with 3DNodeIndexDocument in 2 modes:\n * in memory: the data is stored in `data` field\n * on disk: the data is written on disk in a file. The file can be rewritten when new childrend or neighbors have to be added\n */\nexport class NodeIndexDocument {\n /** Node id */\n public id: string;\n /** Id in node pages */\n public inPageId: number;\n /** 3DNodeIndexDocument data */\n public data: Node3DIndexDocument | null = null;\n /** children */\n public children: NodeIndexDocument[] = [];\n /** converter instance */\n private converter: I3SConverter;\n\n /**\n * Finalized property. It means that all child nodes are saved and their data\n * is unloaded\n */\n private _finalized: boolean = false;\n get finalized(): boolean {\n return this._finalized;\n }\n\n /**\n * Constructor\n * @param id - id of the node in node pages\n * @param converter - converter instance\n */\n constructor(id: number, converter: I3SConverter) {\n this.inPageId = id;\n this.id = id === 0 ? 'root' : id.toString();\n this.converter = converter;\n }\n\n /**\n * Add Node3DIndexDocument data to the node\n * @param data Node3DIndexDocument data\n * @returns this NodeIndexDocument instance (to recurring with constructor)\n */\n public async addData(data: Node3DIndexDocument): Promise<NodeIndexDocument> {\n if (this.converter.options.instantNodeWriting) {\n await this.write(data);\n } else {\n this.data = data;\n }\n return this;\n }\n\n /**\n * Add child node references\n * @param childNodes - child NodeIndexDocument instances\n */\n public async addChildren(childNodes: NodeIndexDocument[]): Promise<void> {\n const newChildren: NodeReference[] = [];\n for (const node of childNodes) {\n const nodeData = await node.load();\n newChildren.push({\n id: node.id,\n href: `../${node.id}`,\n obb: nodeData.obb,\n mbs: nodeData.mbs\n });\n }\n this.children = this.children.concat(childNodes);\n\n let data: Node3DIndexDocument | null = this.data;\n if (this.converter.options.instantNodeWriting) {\n data = (await this.load()) as Node3DIndexDocument;\n }\n if (data) {\n data.children = data.children ?? [];\n data.children = data.children.concat(newChildren);\n }\n if (this.converter.options.instantNodeWriting && data) {\n await this.write(data);\n }\n }\n\n /**\n * Add neighbors to child nodes of this node\n */\n public async addNeighbors(): Promise<void> {\n if (this.finalized) {\n return;\n }\n const nodeData = await this.load();\n for (const childNode of this.children) {\n const childNodeData = await childNode.load();\n childNodeData.neighbors = childNodeData.neighbors ?? [];\n\n // Don't do large amount of \"neightbors\" to avoid big memory consumption\n if (Number(nodeData?.children?.length) < 1000) {\n for (const neighbor of nodeData.children || []) {\n if (childNode.id === neighbor.id) {\n continue; // eslint-disable-line\n }\n\n childNodeData.neighbors.push({...neighbor});\n }\n } else {\n // eslint-disable-next-line no-console, no-undef\n console.warn(\n `Node ${childNode.id}: neighbors attribute is omited because of large number of neigbors`\n );\n delete childNodeData.neighbors;\n }\n\n if (this.converter.options.instantNodeWriting && childNodeData) {\n await childNode.write(childNodeData);\n }\n await childNode.save();\n }\n // The save after adding neighbors is the last one. Finalize the the node\n this.finalize();\n }\n\n /** Save 3DNodeIndexDocument in file on disk */\n public async save(): Promise<void> {\n if (this.data) {\n await this.write(this.data);\n }\n }\n\n /** Finalize the node */\n private finalize(): void {\n this._finalized = true;\n for (const child of this.children) {\n child.flush();\n }\n }\n\n /**\n * Write 3DNodeIndexDocument https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md\n * @param node - Node3DIndexDocument object\n */\n private async write(node: Node3DIndexDocument): Promise<void> {\n const path = join(this.converter.layers0Path, 'nodes', this.id);\n if (this.converter.options.slpk) {\n await this.converter.writeQueue.enqueue(\n {\n archiveKey: `nodes/${this.id}/3dNodeIndexDocument.json.gz`,\n writePromise: () =>\n writeFileForSlpk(\n path,\n JSON.stringify(node),\n '3dNodeIndexDocument.json',\n true,\n this.converter.compressList\n )\n },\n true\n );\n } else {\n await this.converter.writeQueue.enqueue(\n {writePromise: () => writeFile(path, JSON.stringify(node))},\n true\n );\n }\n }\n\n /**\n * Load 3DNodeIndexDocument data from file on disk\n * @returns 3DNodeIndexDocument object\n */\n private async load(): Promise<Node3DIndexDocument> {\n if (this.data) {\n return this.data;\n }\n const path = this.id;\n const parentNodePath = join(this.converter.layers0Path, 'nodes', path);\n let parentNodeFileName = 'index.json';\n if (this.converter.options.slpk) {\n parentNodeFileName = '3dNodeIndexDocument.json';\n }\n return (await openJson(parentNodePath, parentNodeFileName)) as Node3DIndexDocument;\n }\n\n /**\n * Unload the Node data\n */\n private flush(): void {\n this.data = null;\n }\n\n /**\n * Create root node of the tree\n * @param boundingVolumes - MBS and OOB bounding volumes data\n * @param converter - I3SConverter instance\n * @returns instance of NodeIndexDocument\n */\n static async createRootNode(\n boundingVolumes: BoundingVolumes,\n converter: I3SConverter\n ): Promise<NodeIndexDocument> {\n const rootData = NodeIndexDocument.createRootNodeIndexDocument(boundingVolumes);\n const rootNode = await new NodeIndexDocument(0, converter).addData(rootData);\n return rootNode;\n }\n\n /**\n * Create NodeIndexDocument instance\n * @param parentNode - parent NodeIndexDocument\n * @param boundingVolumes - MBS and OOB bounding volumes data\n * @param lodSelection - LOD metrics data\n * @param nodeInPage - node data in node pages\n * @param resources - resources extracted from gltf/b3dm file\n * @param converter - I3SConverter instance\n * @returns NodeIndexDocument instance\n */\n static async createNode(\n parentNode: NodeIndexDocument,\n boundingVolumes: BoundingVolumes,\n lodSelection: LodSelection[],\n nodeInPage: NodeInPage,\n resources: I3SConvertedResources,\n converter: I3SConverter\n ): Promise<NodeIndexDocument> {\n const data = await NodeIndexDocument.createNodeIndexDocument(\n parentNode,\n boundingVolumes,\n lodSelection,\n nodeInPage,\n resources\n );\n const node = await new NodeIndexDocument(nodeInPage.index, converter).addData(data);\n return node;\n }\n\n /**\n * Form 3DNodeIndexDocument data for the root node\n * @param boundingVolumes - mbs and obb data about node's bounding volume\n * @return 3DNodeIndexDocument data https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md\n */\n static createRootNodeIndexDocument(boundingVolumes: BoundingVolumes): Node3DIndexDocument {\n const root0data = {\n version: `{${uuidv4().toUpperCase()}}`,\n id: 'root',\n level: 0,\n lodSelection: [\n {\n metricType: 'maxScreenThresholdSQ',\n maxError: 0\n },\n {\n metricType: 'maxScreenThreshold',\n maxError: 0\n }\n ],\n ...boundingVolumes,\n children: []\n };\n return transform(root0data, nodeTemplate());\n }\n\n /**\n * Create a new Node3DIndexDocument\n * @param parentNode - 3DNodeIndexDocument https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md object of the parent node\n * @param boundingVolumes - Bounding volumes\n * @param lodSelection - Level of Details (LOD) metrics\n * @param nodeInPage - corresponding node object in a node page\n * @param resources - the node resources data\n * @param resources.texture - texture image\n * @param resources.attributes - feature attributes\n * @return 3DNodeIndexDocument https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md object\n */\n static async createNodeIndexDocument(\n parentNode: NodeIndexDocument,\n boundingVolumes: BoundingVolumes,\n lodSelection: LodSelection[],\n nodeInPage: NodeInPage,\n resources: I3SConvertedResources\n ): Promise<Node3DIndexDocument> {\n const {texture, attributes} = resources;\n const nodeId = nodeInPage.index!;\n const parentNodeData = await parentNode.load();\n const nodeData = {\n version: parentNodeData.version,\n id: nodeId.toString(),\n level: parentNodeData.level! + 1,\n ...boundingVolumes,\n lodSelection,\n parentNode: {\n id: parentNode.id,\n href: `../${parentNode.id}`,\n mbs: parentNodeData.mbs,\n obb: parentNodeData.obb\n },\n children: [],\n neighbors: []\n };\n const node = transform(nodeData, nodeTemplate());\n\n if (nodeInPage.mesh) {\n node.geometryData = [{href: './geometries/0'}];\n node.sharedResource = {href: './shared'};\n\n if (texture) {\n node.textureData = [{href: './textures/0'}, {href: './textures/1'}];\n }\n\n if (\n attributes &&\n attributes.length &&\n parentNode.converter.layers0?.attributeStorageInfo?.length\n ) {\n node.attributeData = [];\n const minimumLength =\n attributes.length < parentNode.converter.layers0.attributeStorageInfo.length\n ? attributes.length\n : parentNode.converter.layers0.attributeStorageInfo.length;\n for (let index = 0; index < minimumLength; index++) {\n const folderName = parentNode.converter.layers0.attributeStorageInfo[index].key;\n node.attributeData.push({href: `./attributes/${folderName}/0`});\n }\n }\n }\n\n return node;\n }\n}\n"],"mappings":"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"}
@@ -1,13 +1,15 @@
1
- import { GltfPrimitiveModeString } from '../types';
2
- import { GLTFLoader } from '@loaders.gl/gltf';
1
+ import { GLTFPrimitiveModeString } from '../types';
2
+ import { EXT_STRUCTURAL_METADATA, GLTFLoader } from '@loaders.gl/gltf';
3
3
  import { parse } from '@loaders.gl/core';
4
- export const GLTF_PRIMITIVE_MODES = [GltfPrimitiveModeString.POINTS, GltfPrimitiveModeString.LINES, GltfPrimitiveModeString.LINE_LOOP, GltfPrimitiveModeString.LINE_STRIP, GltfPrimitiveModeString.TRIANGLES, GltfPrimitiveModeString.TRIANGLE_STRIP, GltfPrimitiveModeString.TRIANGLE_FAN];
5
- export const analyzeTileContent = async (tile, tileContent) => {
6
- const result = {
7
- meshTopologyTypes: new Set()
4
+ import { EXT_FEATURE_METADATA } from '@loaders.gl/gltf';
5
+ export const GLTF_PRIMITIVE_MODES = [GLTFPrimitiveModeString.POINTS, GLTFPrimitiveModeString.LINES, GLTFPrimitiveModeString.LINE_LOOP, GLTFPrimitiveModeString.LINE_STRIP, GLTFPrimitiveModeString.TRIANGLES, GLTFPrimitiveModeString.TRIANGLE_STRIP, GLTFPrimitiveModeString.TRIANGLE_FAN];
6
+ export const analyzeTileContent = async tileContent => {
7
+ const defaultResult = {
8
+ meshTopologyTypes: new Set(),
9
+ metadataClasses: new Set()
8
10
  };
9
11
  if (!(tileContent !== null && tileContent !== void 0 && tileContent.gltfArrayBuffer)) {
10
- return result;
12
+ return defaultResult;
11
13
  }
12
14
  const gltfData = await parse(tileContent.gltfArrayBuffer, GLTFLoader, {
13
15
  gltf: {
@@ -19,13 +21,16 @@ export const analyzeTileContent = async (tile, tileContent) => {
19
21
  });
20
22
  const gltf = gltfData.json;
21
23
  if (!gltf) {
22
- return result;
24
+ return defaultResult;
23
25
  }
24
- const meshTypes = getMeshTypesFromGltf(gltf);
25
- result.meshTopologyTypes = meshTypes;
26
- return result;
26
+ const meshTopologyTypes = getMeshTypesFromGLTF(gltf);
27
+ const metadataClasses = getMetadataClassesFromGLTF(gltf);
28
+ return {
29
+ meshTopologyTypes,
30
+ metadataClasses
31
+ };
27
32
  };
28
- const getMeshTypesFromGltf = gltfJson => {
33
+ const getMeshTypesFromGLTF = gltfJson => {
29
34
  const result = new Set();
30
35
  for (const mesh of gltfJson.meshes || []) {
31
36
  for (const primitive of mesh.primitives) {
@@ -40,9 +45,29 @@ const getMeshTypesFromGltf = gltfJson => {
40
45
  }
41
46
  return result;
42
47
  };
48
+ const getMetadataClassesFromGLTF = gltfJson => {
49
+ var _gltfJson$extensions, _gltfJson$extensions$, _gltfJson$extensions$2, _gltfJson$extensions2, _gltfJson$extensions3, _gltfJson$extensions4;
50
+ const result = new Set();
51
+ const extFeatureMetadataClasses = (_gltfJson$extensions = gltfJson.extensions) === null || _gltfJson$extensions === void 0 ? void 0 : (_gltfJson$extensions$ = _gltfJson$extensions[EXT_FEATURE_METADATA]) === null || _gltfJson$extensions$ === void 0 ? void 0 : (_gltfJson$extensions$2 = _gltfJson$extensions$.schema) === null || _gltfJson$extensions$2 === void 0 ? void 0 : _gltfJson$extensions$2.classes;
52
+ if (extFeatureMetadataClasses) {
53
+ for (const classKey of Object.keys(extFeatureMetadataClasses)) {
54
+ result.add(classKey);
55
+ }
56
+ }
57
+ const extStructuralMetadataClasses = (_gltfJson$extensions2 = gltfJson.extensions) === null || _gltfJson$extensions2 === void 0 ? void 0 : (_gltfJson$extensions3 = _gltfJson$extensions2[EXT_STRUCTURAL_METADATA]) === null || _gltfJson$extensions3 === void 0 ? void 0 : (_gltfJson$extensions4 = _gltfJson$extensions3.schema) === null || _gltfJson$extensions4 === void 0 ? void 0 : _gltfJson$extensions4.classes;
58
+ if (extStructuralMetadataClasses) {
59
+ for (const classKey of Object.keys(extStructuralMetadataClasses)) {
60
+ result.add(classKey);
61
+ }
62
+ }
63
+ return result;
64
+ };
43
65
  export const mergePreprocessData = (object1, object2) => {
44
66
  for (const type of object2.meshTopologyTypes) {
45
67
  object1.meshTopologyTypes.add(type);
46
68
  }
69
+ for (const metadataClass of object2.metadataClasses) {
70
+ object1.metadataClasses.add(metadataClass);
71
+ }
47
72
  };
48
73
  //# sourceMappingURL=preprocess-3d-tiles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"preprocess-3d-tiles.js","names":["GltfPrimitiveModeString","GLTFLoader","parse","GLTF_PRIMITIVE_MODES","POINTS","LINES","LINE_LOOP","LINE_STRIP","TRIANGLES","TRIANGLE_STRIP","TRIANGLE_FAN","analyzeTileContent","tile","tileContent","result","meshTopologyTypes","Set","gltfArrayBuffer","gltfData","gltf","normalize","loadBuffers","loadImages","decompressMeshes","json","meshTypes","getMeshTypesFromGltf","gltfJson","mesh","meshes","primitive","primitives","mode","add","mergePreprocessData","object1","object2","type"],"sources":["../../../../src/i3s-converter/helpers/preprocess-3d-tiles.ts"],"sourcesContent":["import {Tiles3DTileContent, Tiles3DTileJSONPostprocessed} from '@loaders.gl/3d-tiles';\nimport {GltfPrimitiveModeString, PreprocessData} from '../types';\nimport {GLTF, GLTFLoader} from '@loaders.gl/gltf';\nimport {parse} from '@loaders.gl/core';\n\n/**\n * glTF primitive modes\n * @see https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#_mesh_primitive_mode\n */\nexport const GLTF_PRIMITIVE_MODES = [\n GltfPrimitiveModeString.POINTS, // 0\n GltfPrimitiveModeString.LINES, // 1\n GltfPrimitiveModeString.LINE_LOOP, // 2\n GltfPrimitiveModeString.LINE_STRIP, // 3\n GltfPrimitiveModeString.TRIANGLES, // 4\n GltfPrimitiveModeString.TRIANGLE_STRIP, // 5\n GltfPrimitiveModeString.TRIANGLE_FAN // 6\n];\n\n/**\n * Analyze tile content. This function is used during preprocess stage of\n * conversion\n * @param tile - 3DTiles tile JSON metadata\n * @param tileContent - 3DTiles tile content ArrayBuffer\n * @returns\n */\nexport const analyzeTileContent = async (\n tile: Tiles3DTileJSONPostprocessed,\n tileContent: Tiles3DTileContent | null\n): Promise<PreprocessData> => {\n const result: PreprocessData = {\n meshTopologyTypes: new Set()\n };\n if (!tileContent?.gltfArrayBuffer) {\n return result;\n }\n\n const gltfData = await parse(tileContent.gltfArrayBuffer, GLTFLoader, {\n gltf: {normalize: false, loadBuffers: false, loadImages: false, decompressMeshes: false}\n });\n const gltf = gltfData.json;\n\n if (!gltf) {\n return result;\n }\n const meshTypes = getMeshTypesFromGltf(gltf);\n result.meshTopologyTypes = meshTypes;\n return result;\n};\n\n/**\n * Get mesh topology types that the glb content has\n * @param gltfJson - JSON part of GLB content\n * @returns array of mesh types found\n */\nconst getMeshTypesFromGltf = (gltfJson: GLTF): Set<GltfPrimitiveModeString> => {\n const result: Set<GltfPrimitiveModeString> = new Set();\n for (const mesh of gltfJson.meshes || []) {\n for (const primitive of mesh.primitives) {\n let {mode} = primitive;\n if (typeof mode !== 'number') {\n mode = 4; // Default is 4 - TRIANGLES\n }\n result.add(GLTF_PRIMITIVE_MODES[mode]);\n }\n }\n return result;\n};\n\n/**\n * Merge object2 into object1\n * @param object1\n * @param object2\n * @returns nothing\n */\nexport const mergePreprocessData = (object1: PreprocessData, object2: PreprocessData): void => {\n // Merge topology mesh types info\n for (const type of object2.meshTopologyTypes) {\n object1.meshTopologyTypes.add(type);\n }\n};\n"],"mappings":"AACA,SAAQA,uBAAuB,QAAuB,UAAU;AAChE,SAAcC,UAAU,QAAO,kBAAkB;AACjD,SAAQC,KAAK,QAAO,kBAAkB;AAMtC,OAAO,MAAMC,oBAAoB,GAAG,CAClCH,uBAAuB,CAACI,MAAM,EAC9BJ,uBAAuB,CAACK,KAAK,EAC7BL,uBAAuB,CAACM,SAAS,EACjCN,uBAAuB,CAACO,UAAU,EAClCP,uBAAuB,CAACQ,SAAS,EACjCR,uBAAuB,CAACS,cAAc,EACtCT,uBAAuB,CAACU,YAAY,CACrC;AASD,OAAO,MAAMC,kBAAkB,GAAG,MAAAA,CAChCC,IAAkC,EAClCC,WAAsC,KACV;EAC5B,MAAMC,MAAsB,GAAG;IAC7BC,iBAAiB,EAAE,IAAIC,GAAG,CAAC;EAC7B,CAAC;EACD,IAAI,EAACH,WAAW,aAAXA,WAAW,eAAXA,WAAW,CAAEI,eAAe,GAAE;IACjC,OAAOH,MAAM;EACf;EAEA,MAAMI,QAAQ,GAAG,MAAMhB,KAAK,CAACW,WAAW,CAACI,eAAe,EAAEhB,UAAU,EAAE;IACpEkB,IAAI,EAAE;MAACC,SAAS,EAAE,KAAK;MAAEC,WAAW,EAAE,KAAK;MAAEC,UAAU,EAAE,KAAK;MAAEC,gBAAgB,EAAE;IAAK;EACzF,CAAC,CAAC;EACF,MAAMJ,IAAI,GAAGD,QAAQ,CAACM,IAAI;EAE1B,IAAI,CAACL,IAAI,EAAE;IACT,OAAOL,MAAM;EACf;EACA,MAAMW,SAAS,GAAGC,oBAAoB,CAACP,IAAI,CAAC;EAC5CL,MAAM,CAACC,iBAAiB,GAAGU,SAAS;EACpC,OAAOX,MAAM;AACf,CAAC;AAOD,MAAMY,oBAAoB,GAAIC,QAAc,IAAmC;EAC7E,MAAMb,MAAoC,GAAG,IAAIE,GAAG,CAAC,CAAC;EACtD,KAAK,MAAMY,IAAI,IAAID,QAAQ,CAACE,MAAM,IAAI,EAAE,EAAE;IACxC,KAAK,MAAMC,SAAS,IAAIF,IAAI,CAACG,UAAU,EAAE;MACvC,IAAI;QAACC;MAAI,CAAC,GAAGF,SAAS;MACtB,IAAI,OAAOE,IAAI,KAAK,QAAQ,EAAE;QAC5BA,IAAI,GAAG,CAAC;MACV;MACAlB,MAAM,CAACmB,GAAG,CAAC9B,oBAAoB,CAAC6B,IAAI,CAAC,CAAC;IACxC;EACF;EACA,OAAOlB,MAAM;AACf,CAAC;AAQD,OAAO,MAAMoB,mBAAmB,GAAGA,CAACC,OAAuB,EAAEC,OAAuB,KAAW;EAE7F,KAAK,MAAMC,IAAI,IAAID,OAAO,CAACrB,iBAAiB,EAAE;IAC5CoB,OAAO,CAACpB,iBAAiB,CAACkB,GAAG,CAACI,IAAI,CAAC;EACrC;AACF,CAAC"}
1
+ {"version":3,"file":"preprocess-3d-tiles.js","names":["GLTFPrimitiveModeString","EXT_STRUCTURAL_METADATA","GLTFLoader","parse","EXT_FEATURE_METADATA","GLTF_PRIMITIVE_MODES","POINTS","LINES","LINE_LOOP","LINE_STRIP","TRIANGLES","TRIANGLE_STRIP","TRIANGLE_FAN","analyzeTileContent","tileContent","defaultResult","meshTopologyTypes","Set","metadataClasses","gltfArrayBuffer","gltfData","gltf","normalize","loadBuffers","loadImages","decompressMeshes","json","getMeshTypesFromGLTF","getMetadataClassesFromGLTF","gltfJson","result","mesh","meshes","primitive","primitives","mode","add","_gltfJson$extensions","_gltfJson$extensions$","_gltfJson$extensions$2","_gltfJson$extensions2","_gltfJson$extensions3","_gltfJson$extensions4","extFeatureMetadataClasses","extensions","schema","classes","classKey","Object","keys","extStructuralMetadataClasses","mergePreprocessData","object1","object2","type","metadataClass"],"sources":["../../../../src/i3s-converter/helpers/preprocess-3d-tiles.ts"],"sourcesContent":["import {Tiles3DTileContent} from '@loaders.gl/3d-tiles';\nimport {GLTFPrimitiveModeString, PreprocessData} from '../types';\nimport {\n EXT_STRUCTURAL_METADATA,\n GLTF,\n GLTFLoader,\n GLTF_EXT_feature_metadata_GLTF,\n GLTF_EXT_structural_metadata_GLTF\n} from '@loaders.gl/gltf';\nimport {parse} from '@loaders.gl/core';\nimport {EXT_FEATURE_METADATA} from '@loaders.gl/gltf';\n\n/**\n * glTF primitive modes\n * @see https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#_mesh_primitive_mode\n */\nexport const GLTF_PRIMITIVE_MODES = [\n GLTFPrimitiveModeString.POINTS, // 0\n GLTFPrimitiveModeString.LINES, // 1\n GLTFPrimitiveModeString.LINE_LOOP, // 2\n GLTFPrimitiveModeString.LINE_STRIP, // 3\n GLTFPrimitiveModeString.TRIANGLES, // 4\n GLTFPrimitiveModeString.TRIANGLE_STRIP, // 5\n GLTFPrimitiveModeString.TRIANGLE_FAN // 6\n];\n\n/**\n * Analyze tile content. This function is used during preprocess stage of\n * conversion\n * @param tileContent - 3DTiles tile content ArrayBuffer\n * @returns\n */\nexport const analyzeTileContent = async (\n tileContent: Tiles3DTileContent | null\n): Promise<PreprocessData> => {\n const defaultResult = {\n meshTopologyTypes: new Set<GLTFPrimitiveModeString>(),\n metadataClasses: new Set<string>()\n };\n if (!tileContent?.gltfArrayBuffer) {\n return defaultResult;\n }\n\n const gltfData = await parse(tileContent.gltfArrayBuffer, GLTFLoader, {\n gltf: {normalize: false, loadBuffers: false, loadImages: false, decompressMeshes: false}\n });\n const gltf = gltfData.json;\n\n if (!gltf) {\n return defaultResult;\n }\n const meshTopologyTypes = getMeshTypesFromGLTF(gltf);\n const metadataClasses = getMetadataClassesFromGLTF(gltf);\n return {\n meshTopologyTypes,\n metadataClasses\n };\n};\n\n/**\n * Get mesh topology types that the glb content has\n * @param gltfJson - JSON part of GLB content\n * @returns array of mesh types found\n */\nconst getMeshTypesFromGLTF = (gltfJson: GLTF): Set<GLTFPrimitiveModeString> => {\n const result: Set<GLTFPrimitiveModeString> = new Set();\n for (const mesh of gltfJson.meshes || []) {\n for (const primitive of mesh.primitives) {\n let {mode} = primitive;\n if (typeof mode !== 'number') {\n mode = 4; // Default is 4 - TRIANGLES\n }\n result.add(GLTF_PRIMITIVE_MODES[mode]);\n }\n }\n return result;\n};\n\n/**\n * Get feature metadata classes from glTF\n * The tileset might contain multiple metadata classes provided by EXT_feature_metadata and EXT_structural_metadata extensions.\n * Every class is a set of properties. But I3S can consume only one set of properties.\n * On the pre-process we collect all classes from the tileset in order to show the prompt to select one class for conversion to I3S.\n * @param gltfJson - JSON part of GLB content\n * @returns array of classes\n */\nconst getMetadataClassesFromGLTF = (gltfJson: GLTF): Set<string> => {\n const result: Set<string> = new Set();\n\n // Try to parse from EXT_feature_metadata\n const extFeatureMetadataClasses = (\n gltfJson.extensions?.[EXT_FEATURE_METADATA] as GLTF_EXT_feature_metadata_GLTF\n )?.schema?.classes;\n\n if (extFeatureMetadataClasses) {\n for (const classKey of Object.keys(extFeatureMetadataClasses)) {\n result.add(classKey);\n }\n }\n\n // Try to parse from EXT_structural_metadata\n const extStructuralMetadataClasses = (\n gltfJson.extensions?.[EXT_STRUCTURAL_METADATA] as GLTF_EXT_structural_metadata_GLTF\n )?.schema?.classes;\n if (extStructuralMetadataClasses) {\n for (const classKey of Object.keys(extStructuralMetadataClasses)) {\n result.add(classKey);\n }\n }\n\n return result;\n};\n\n/**\n * Merge object2 into object1\n * @param object1\n * @param object2\n * @returns nothing\n */\nexport const mergePreprocessData = (object1: PreprocessData, object2: PreprocessData): void => {\n // Merge topology mesh types info\n for (const type of object2.meshTopologyTypes) {\n object1.meshTopologyTypes.add(type);\n }\n\n // Merge feature metadata classes\n for (const metadataClass of object2.metadataClasses) {\n object1.metadataClasses.add(metadataClass);\n }\n};\n"],"mappings":"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"}