@loaders.gl/tile-converter 4.0.0-beta.2 → 4.0.0-beta.3

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 (288) hide show
  1. package/dist/{esm/3d-tiles-converter → 3d-tiles-converter}/3d-tiles-converter.js +31 -32
  2. package/dist/3d-tiles-converter/3d-tiles-converter.js.map +1 -0
  3. package/dist/{esm/3d-tiles-converter → 3d-tiles-converter}/helpers/b3dm-converter.js +5 -6
  4. package/dist/3d-tiles-converter/helpers/b3dm-converter.js.map +1 -0
  5. package/dist/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js.map +1 -0
  6. package/dist/3d-tiles-converter/helpers/load-i3s.js.map +1 -0
  7. package/dist/3d-tiles-converter/helpers/texture-atlas.js.map +1 -0
  8. package/dist/3d-tiles-converter/json-templates/tileset.js.map +1 -0
  9. package/dist/constants.js.map +1 -0
  10. package/dist/{esm/converter-cli.js → converter-cli.js} +37 -15
  11. package/dist/converter-cli.js.map +1 -0
  12. package/dist/converter.min.js +496 -328
  13. package/dist/{esm/deps-installer → deps-installer}/deps-installer.js +3 -3
  14. package/dist/deps-installer/deps-installer.js.map +1 -0
  15. package/dist/esm/i3s-server/bin/i3s-server.min.js +786 -428
  16. package/dist/{esm/i3s-converter → i3s-converter}/helpers/batch-ids-extensions.js +2 -2
  17. package/dist/i3s-converter/helpers/batch-ids-extensions.js.map +1 -0
  18. package/dist/i3s-converter/helpers/coordinate-converter.js.map +1 -0
  19. package/dist/{esm/i3s-converter → i3s-converter}/helpers/create-scene-server-path.js +2 -2
  20. package/dist/i3s-converter/helpers/create-scene-server-path.js.map +1 -0
  21. package/dist/{esm/i3s-converter → i3s-converter}/helpers/feature-attributes.js +1 -1
  22. package/dist/i3s-converter/helpers/feature-attributes.js.map +1 -0
  23. package/dist/i3s-converter/helpers/geometry-attributes.js.map +1 -0
  24. package/dist/{esm/i3s-converter → i3s-converter}/helpers/geometry-converter.js +11 -11
  25. package/dist/i3s-converter/helpers/geometry-converter.js.map +1 -0
  26. package/dist/i3s-converter/helpers/gltf-attributes.js.map +1 -0
  27. package/dist/{esm/i3s-converter → i3s-converter}/helpers/load-3d-tiles.js +1 -1
  28. package/dist/i3s-converter/helpers/load-3d-tiles.js.map +1 -0
  29. package/dist/{esm/i3s-converter → i3s-converter}/helpers/node-debug.js +2 -2
  30. package/dist/i3s-converter/helpers/node-debug.js.map +1 -0
  31. package/dist/{esm/i3s-converter → i3s-converter}/helpers/node-index-document.js +14 -15
  32. package/dist/i3s-converter/helpers/node-index-document.js.map +1 -0
  33. package/dist/{esm/i3s-converter → i3s-converter}/helpers/node-pages.js +13 -14
  34. package/dist/i3s-converter/helpers/node-pages.js.map +1 -0
  35. package/dist/{esm/i3s-converter → i3s-converter}/helpers/preprocess-3d-tiles.js +1 -1
  36. package/dist/i3s-converter/helpers/preprocess-3d-tiles.js.map +1 -0
  37. package/dist/i3s-converter/helpers/tileset-traversal.js.map +1 -0
  38. package/dist/i3s-converter/i3s-converter.d.ts +6 -0
  39. package/dist/i3s-converter/i3s-converter.d.ts.map +1 -1
  40. package/dist/{esm/i3s-converter → i3s-converter}/i3s-converter.js +120 -111
  41. package/dist/i3s-converter/i3s-converter.js.map +1 -0
  42. package/dist/i3s-converter/json-templates/geometry-definitions.js.map +1 -0
  43. package/dist/{esm/i3s-converter → i3s-converter}/json-templates/layers.js +1 -1
  44. package/dist/i3s-converter/json-templates/layers.js.map +1 -0
  45. package/dist/i3s-converter/json-templates/metadata.js.map +1 -0
  46. package/dist/i3s-converter/json-templates/node.js.map +1 -0
  47. package/dist/i3s-converter/json-templates/scene-server.js.map +1 -0
  48. package/dist/{esm/i3s-converter → i3s-converter}/json-templates/shared-resources.js +2 -2
  49. package/dist/i3s-converter/json-templates/shared-resources.js.map +1 -0
  50. package/dist/i3s-converter/json-templates/store.js.map +1 -0
  51. package/dist/i3s-converter/types.js.map +1 -0
  52. package/dist/{esm/i3s-server → i3s-server}/app.js +1 -1
  53. package/dist/i3s-server/app.js.map +1 -0
  54. package/dist/{esm/i3s-server → i3s-server}/bin/www.js +4 -4
  55. package/dist/i3s-server/bin/www.js.map +1 -0
  56. package/dist/{esm/i3s-server → i3s-server}/controllers/index-controller.js +1 -1
  57. package/dist/i3s-server/controllers/index-controller.js.map +1 -0
  58. package/dist/i3s-server/controllers/slpk-controller.d.ts +2 -3
  59. package/dist/i3s-server/controllers/slpk-controller.d.ts.map +1 -1
  60. package/dist/i3s-server/controllers/slpk-controller.js +19 -0
  61. package/dist/i3s-server/controllers/slpk-controller.js.map +1 -0
  62. package/dist/i3s-server/routes/index.js.map +1 -0
  63. package/dist/{esm/i3s-server → i3s-server}/routes/slpk-router.js +2 -2
  64. package/dist/i3s-server/routes/slpk-router.js.map +1 -0
  65. package/dist/i3s-server/utils/create-scene-server.js.map +1 -0
  66. package/dist/{esm/i3s-server → i3s-server}/utils/server-utils.js +5 -5
  67. package/dist/i3s-server/utils/server-utils.js.map +1 -0
  68. package/dist/index.cjs +5129 -0
  69. package/dist/index.js +3 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/{esm/lib → lib}/utils/cli-utils.js +2 -2
  72. package/dist/lib/utils/cli-utils.js.map +1 -0
  73. package/dist/{esm/lib → lib}/utils/compress-util.js +15 -15
  74. package/dist/lib/utils/compress-util.js.map +1 -0
  75. package/dist/{esm/lib → lib}/utils/file-utils.js +5 -5
  76. package/dist/lib/utils/file-utils.js.map +1 -0
  77. package/dist/lib/utils/geometry-utils.js.map +1 -0
  78. package/dist/lib/utils/lod-conversion-utils.js.map +1 -0
  79. package/dist/lib/utils/queue.js.map +1 -0
  80. package/dist/lib/utils/statistic-utills.d.js +2 -0
  81. package/dist/lib/utils/statistic-utills.d.js.map +1 -0
  82. package/dist/{esm/lib → lib}/utils/statistic-utills.js +6 -6
  83. package/dist/lib/utils/statistic-utills.js.map +1 -0
  84. package/dist/{esm/lib → lib}/utils/write-queue.js +6 -7
  85. package/dist/lib/utils/write-queue.js.map +1 -0
  86. package/dist/{esm/pgm-loader.js → pgm-loader.js} +1 -1
  87. package/dist/pgm-loader.js.map +1 -0
  88. package/dist/{esm/slpk-extractor → slpk-extractor}/slpk-extractor.js +4 -4
  89. package/dist/slpk-extractor/slpk-extractor.js.map +1 -0
  90. package/dist/{esm/slpk-extractor-cli.js → slpk-extractor-cli.js} +6 -6
  91. package/dist/slpk-extractor-cli.js.map +1 -0
  92. package/dist/slpk-extractor.min.js +279 -133
  93. package/package.json +29 -22
  94. package/src/converter-cli.ts +32 -14
  95. package/src/i3s-converter/i3s-converter.ts +44 -30
  96. package/src/i3s-server/controllers/slpk-controller.ts +12 -10
  97. package/src/slpk-extractor/slpk-extractor.ts +1 -1
  98. package/dist/bundle.d.ts +0 -2
  99. package/dist/bundle.d.ts.map +0 -1
  100. package/dist/dist.min.js +0 -64291
  101. package/dist/es5/3d-tiles-converter/3d-tiles-converter.js +0 -447
  102. package/dist/es5/3d-tiles-converter/3d-tiles-converter.js.map +0 -1
  103. package/dist/es5/3d-tiles-converter/helpers/b3dm-converter.js +0 -295
  104. package/dist/es5/3d-tiles-converter/helpers/b3dm-converter.js.map +0 -1
  105. package/dist/es5/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js +0 -18
  106. package/dist/es5/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js.map +0 -1
  107. package/dist/es5/3d-tiles-converter/helpers/load-i3s.js +0 -63
  108. package/dist/es5/3d-tiles-converter/helpers/load-i3s.js.map +0 -1
  109. package/dist/es5/3d-tiles-converter/helpers/texture-atlas.js +0 -33
  110. package/dist/es5/3d-tiles-converter/helpers/texture-atlas.js.map +0 -1
  111. package/dist/es5/3d-tiles-converter/json-templates/tileset.js +0 -61
  112. package/dist/es5/3d-tiles-converter/json-templates/tileset.js.map +0 -1
  113. package/dist/es5/bundle.js +0 -6
  114. package/dist/es5/bundle.js.map +0 -1
  115. package/dist/es5/constants.js +0 -9
  116. package/dist/es5/constants.js.map +0 -1
  117. package/dist/es5/converter-cli.js +0 -249
  118. package/dist/es5/converter-cli.js.map +0 -1
  119. package/dist/es5/deps-installer/deps-installer.js +0 -198
  120. package/dist/es5/deps-installer/deps-installer.js.map +0 -1
  121. package/dist/es5/i3s-converter/helpers/batch-ids-extensions.js +0 -146
  122. package/dist/es5/i3s-converter/helpers/batch-ids-extensions.js.map +0 -1
  123. package/dist/es5/i3s-converter/helpers/coordinate-converter.js +0 -89
  124. package/dist/es5/i3s-converter/helpers/coordinate-converter.js.map +0 -1
  125. package/dist/es5/i3s-converter/helpers/create-scene-server-path.js +0 -41
  126. package/dist/es5/i3s-converter/helpers/create-scene-server-path.js.map +0 -1
  127. package/dist/es5/i3s-converter/helpers/feature-attributes.js +0 -164
  128. package/dist/es5/i3s-converter/helpers/feature-attributes.js.map +0 -1
  129. package/dist/es5/i3s-converter/helpers/geometry-attributes.js +0 -253
  130. package/dist/es5/i3s-converter/helpers/geometry-attributes.js.map +0 -1
  131. package/dist/es5/i3s-converter/helpers/geometry-converter.js +0 -1190
  132. package/dist/es5/i3s-converter/helpers/geometry-converter.js.map +0 -1
  133. package/dist/es5/i3s-converter/helpers/gltf-attributes.js +0 -113
  134. package/dist/es5/i3s-converter/helpers/gltf-attributes.js.map +0 -1
  135. package/dist/es5/i3s-converter/helpers/load-3d-tiles.js +0 -148
  136. package/dist/es5/i3s-converter/helpers/load-3d-tiles.js.map +0 -1
  137. package/dist/es5/i3s-converter/helpers/node-debug.js +0 -76
  138. package/dist/es5/i3s-converter/helpers/node-debug.js.map +0 -1
  139. package/dist/es5/i3s-converter/helpers/node-index-document.js +0 -522
  140. package/dist/es5/i3s-converter/helpers/node-index-document.js.map +0 -1
  141. package/dist/es5/i3s-converter/helpers/node-pages.js +0 -519
  142. package/dist/es5/i3s-converter/helpers/node-pages.js.map +0 -1
  143. package/dist/es5/i3s-converter/helpers/preprocess-3d-tiles.js +0 -146
  144. package/dist/es5/i3s-converter/helpers/preprocess-3d-tiles.js.map +0 -1
  145. package/dist/es5/i3s-converter/helpers/tileset-traversal.js +0 -82
  146. package/dist/es5/i3s-converter/helpers/tileset-traversal.js.map +0 -1
  147. package/dist/es5/i3s-converter/i3s-converter.js +0 -1554
  148. package/dist/es5/i3s-converter/i3s-converter.js.map +0 -1
  149. package/dist/es5/i3s-converter/json-templates/geometry-definitions.js +0 -107
  150. package/dist/es5/i3s-converter/json-templates/geometry-definitions.js.map +0 -1
  151. package/dist/es5/i3s-converter/json-templates/layers.js +0 -163
  152. package/dist/es5/i3s-converter/json-templates/layers.js.map +0 -1
  153. package/dist/es5/i3s-converter/json-templates/metadata.js +0 -31
  154. package/dist/es5/i3s-converter/json-templates/metadata.js.map +0 -1
  155. package/dist/es5/i3s-converter/json-templates/node.js +0 -99
  156. package/dist/es5/i3s-converter/json-templates/node.js.map +0 -1
  157. package/dist/es5/i3s-converter/json-templates/scene-server.js +0 -39
  158. package/dist/es5/i3s-converter/json-templates/scene-server.js.map +0 -1
  159. package/dist/es5/i3s-converter/json-templates/shared-resources.js +0 -173
  160. package/dist/es5/i3s-converter/json-templates/shared-resources.js.map +0 -1
  161. package/dist/es5/i3s-converter/json-templates/store.js +0 -107
  162. package/dist/es5/i3s-converter/json-templates/store.js.map +0 -1
  163. package/dist/es5/i3s-converter/types.js +0 -18
  164. package/dist/es5/i3s-converter/types.js.map +0 -1
  165. package/dist/es5/i3s-server/app.js +0 -35
  166. package/dist/es5/i3s-server/app.js.map +0 -1
  167. package/dist/es5/i3s-server/bin/www.js +0 -33
  168. package/dist/es5/i3s-server/bin/www.js.map +0 -1
  169. package/dist/es5/i3s-server/controllers/index-controller.js +0 -56
  170. package/dist/es5/i3s-server/controllers/index-controller.js.map +0 -1
  171. package/dist/es5/i3s-server/controllers/slpk-controller.js +0 -81
  172. package/dist/es5/i3s-server/controllers/slpk-controller.js.map +0 -1
  173. package/dist/es5/i3s-server/routes/index.js +0 -37
  174. package/dist/es5/i3s-server/routes/index.js.map +0 -1
  175. package/dist/es5/i3s-server/routes/slpk-router.js +0 -72
  176. package/dist/es5/i3s-server/routes/slpk-router.js.map +0 -1
  177. package/dist/es5/i3s-server/utils/create-scene-server.js +0 -20
  178. package/dist/es5/i3s-server/utils/create-scene-server.js.map +0 -1
  179. package/dist/es5/i3s-server/utils/server-utils.js +0 -49
  180. package/dist/es5/i3s-server/utils/server-utils.js.map +0 -1
  181. package/dist/es5/index.js +0 -21
  182. package/dist/es5/index.js.map +0 -1
  183. package/dist/es5/lib/utils/cli-utils.js +0 -57
  184. package/dist/es5/lib/utils/cli-utils.js.map +0 -1
  185. package/dist/es5/lib/utils/compress-util.js +0 -346
  186. package/dist/es5/lib/utils/compress-util.js.map +0 -1
  187. package/dist/es5/lib/utils/file-utils.js +0 -208
  188. package/dist/es5/lib/utils/file-utils.js.map +0 -1
  189. package/dist/es5/lib/utils/geometry-utils.js +0 -15
  190. package/dist/es5/lib/utils/geometry-utils.js.map +0 -1
  191. package/dist/es5/lib/utils/lod-conversion-utils.js +0 -50
  192. package/dist/es5/lib/utils/lod-conversion-utils.js.map +0 -1
  193. package/dist/es5/lib/utils/queue.js +0 -47
  194. package/dist/es5/lib/utils/queue.js.map +0 -1
  195. package/dist/es5/lib/utils/statistic-utills.d.ts +0 -25
  196. package/dist/es5/lib/utils/statistic-utills.js +0 -147
  197. package/dist/es5/lib/utils/statistic-utills.js.map +0 -1
  198. package/dist/es5/lib/utils/write-queue.js +0 -214
  199. package/dist/es5/lib/utils/write-queue.js.map +0 -1
  200. package/dist/es5/pgm-loader.js +0 -49
  201. package/dist/es5/pgm-loader.js.map +0 -1
  202. package/dist/es5/slpk-extractor/slpk-extractor.js +0 -171
  203. package/dist/es5/slpk-extractor/slpk-extractor.js.map +0 -1
  204. package/dist/es5/slpk-extractor-cli.js +0 -117
  205. package/dist/es5/slpk-extractor-cli.js.map +0 -1
  206. package/dist/esm/3d-tiles-converter/3d-tiles-converter.js.map +0 -1
  207. package/dist/esm/3d-tiles-converter/helpers/b3dm-converter.js.map +0 -1
  208. package/dist/esm/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js.map +0 -1
  209. package/dist/esm/3d-tiles-converter/helpers/load-i3s.js.map +0 -1
  210. package/dist/esm/3d-tiles-converter/helpers/texture-atlas.js.map +0 -1
  211. package/dist/esm/3d-tiles-converter/json-templates/tileset.js.map +0 -1
  212. package/dist/esm/bundle.js +0 -4
  213. package/dist/esm/bundle.js.map +0 -1
  214. package/dist/esm/constants.js.map +0 -1
  215. package/dist/esm/converter-cli.js.map +0 -1
  216. package/dist/esm/deps-installer/deps-installer.js.map +0 -1
  217. package/dist/esm/i3s-converter/helpers/batch-ids-extensions.js.map +0 -1
  218. package/dist/esm/i3s-converter/helpers/coordinate-converter.js.map +0 -1
  219. package/dist/esm/i3s-converter/helpers/create-scene-server-path.js.map +0 -1
  220. package/dist/esm/i3s-converter/helpers/feature-attributes.js.map +0 -1
  221. package/dist/esm/i3s-converter/helpers/geometry-attributes.js.map +0 -1
  222. package/dist/esm/i3s-converter/helpers/geometry-converter.js.map +0 -1
  223. package/dist/esm/i3s-converter/helpers/gltf-attributes.js.map +0 -1
  224. package/dist/esm/i3s-converter/helpers/load-3d-tiles.js.map +0 -1
  225. package/dist/esm/i3s-converter/helpers/node-debug.js.map +0 -1
  226. package/dist/esm/i3s-converter/helpers/node-index-document.js.map +0 -1
  227. package/dist/esm/i3s-converter/helpers/node-pages.js.map +0 -1
  228. package/dist/esm/i3s-converter/helpers/preprocess-3d-tiles.js.map +0 -1
  229. package/dist/esm/i3s-converter/helpers/tileset-traversal.js.map +0 -1
  230. package/dist/esm/i3s-converter/i3s-converter.js.map +0 -1
  231. package/dist/esm/i3s-converter/json-templates/geometry-definitions.js.map +0 -1
  232. package/dist/esm/i3s-converter/json-templates/layers.js.map +0 -1
  233. package/dist/esm/i3s-converter/json-templates/metadata.js.map +0 -1
  234. package/dist/esm/i3s-converter/json-templates/node.js.map +0 -1
  235. package/dist/esm/i3s-converter/json-templates/scene-server.js.map +0 -1
  236. package/dist/esm/i3s-converter/json-templates/shared-resources.js.map +0 -1
  237. package/dist/esm/i3s-converter/json-templates/store.js.map +0 -1
  238. package/dist/esm/i3s-converter/types.js.map +0 -1
  239. package/dist/esm/i3s-server/README.md +0 -63
  240. package/dist/esm/i3s-server/app.js.map +0 -1
  241. package/dist/esm/i3s-server/bin/www.js.map +0 -1
  242. package/dist/esm/i3s-server/certs/cert.pem +0 -19
  243. package/dist/esm/i3s-server/certs/key.pem +0 -27
  244. package/dist/esm/i3s-server/controllers/index-controller.js.map +0 -1
  245. package/dist/esm/i3s-server/controllers/slpk-controller.js +0 -19
  246. package/dist/esm/i3s-server/controllers/slpk-controller.js.map +0 -1
  247. package/dist/esm/i3s-server/routes/index.js.map +0 -1
  248. package/dist/esm/i3s-server/routes/slpk-router.js.map +0 -1
  249. package/dist/esm/i3s-server/utils/create-scene-server.js.map +0 -1
  250. package/dist/esm/i3s-server/utils/server-utils.js.map +0 -1
  251. package/dist/esm/index.js +0 -3
  252. package/dist/esm/index.js.map +0 -1
  253. package/dist/esm/lib/utils/cli-utils.js.map +0 -1
  254. package/dist/esm/lib/utils/compress-util.js.map +0 -1
  255. package/dist/esm/lib/utils/file-utils.js.map +0 -1
  256. package/dist/esm/lib/utils/geometry-utils.js.map +0 -1
  257. package/dist/esm/lib/utils/lod-conversion-utils.js.map +0 -1
  258. package/dist/esm/lib/utils/queue.js.map +0 -1
  259. package/dist/esm/lib/utils/statistic-utills.d.ts +0 -25
  260. package/dist/esm/lib/utils/statistic-utills.js.map +0 -1
  261. package/dist/esm/lib/utils/write-queue.js.map +0 -1
  262. package/dist/esm/pgm-loader.js.map +0 -1
  263. package/dist/esm/slpk-extractor/slpk-extractor.js.map +0 -1
  264. package/dist/esm/slpk-extractor-cli.js.map +0 -1
  265. package/src/bundle.ts +0 -4
  266. /package/dist/{esm/3d-tiles-converter → 3d-tiles-converter}/helpers/i3s-obb-to-3d-tiles-obb.js +0 -0
  267. /package/dist/{esm/3d-tiles-converter → 3d-tiles-converter}/helpers/load-i3s.js +0 -0
  268. /package/dist/{esm/3d-tiles-converter → 3d-tiles-converter}/helpers/texture-atlas.js +0 -0
  269. /package/dist/{esm/3d-tiles-converter → 3d-tiles-converter}/json-templates/tileset.js +0 -0
  270. /package/dist/{esm/constants.js → constants.js} +0 -0
  271. /package/dist/{esm/i3s-converter → i3s-converter}/helpers/coordinate-converter.js +0 -0
  272. /package/dist/{esm/i3s-converter → i3s-converter}/helpers/geometry-attributes.js +0 -0
  273. /package/dist/{esm/i3s-converter → i3s-converter}/helpers/gltf-attributes.js +0 -0
  274. /package/dist/{esm/i3s-converter → i3s-converter}/helpers/tileset-traversal.js +0 -0
  275. /package/dist/{esm/i3s-converter → i3s-converter}/json-templates/geometry-definitions.js +0 -0
  276. /package/dist/{esm/i3s-converter → i3s-converter}/json-templates/metadata.js +0 -0
  277. /package/dist/{esm/i3s-converter → i3s-converter}/json-templates/node.js +0 -0
  278. /package/dist/{esm/i3s-converter → i3s-converter}/json-templates/scene-server.js +0 -0
  279. /package/dist/{esm/i3s-converter → i3s-converter}/json-templates/store.js +0 -0
  280. /package/dist/{esm/i3s-converter → i3s-converter}/types.js +0 -0
  281. /package/dist/{es5/i3s-server → i3s-server}/README.md +0 -0
  282. /package/dist/{es5/i3s-server → i3s-server}/certs/cert.pem +0 -0
  283. /package/dist/{es5/i3s-server → i3s-server}/certs/key.pem +0 -0
  284. /package/dist/{esm/i3s-server → i3s-server}/routes/index.js +0 -0
  285. /package/dist/{esm/i3s-server → i3s-server}/utils/create-scene-server.js +0 -0
  286. /package/dist/{esm/lib → lib}/utils/geometry-utils.js +0 -0
  287. /package/dist/{esm/lib → lib}/utils/lod-conversion-utils.js +0 -0
  288. /package/dist/{esm/lib → lib}/utils/queue.js +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"coordinate-converter.js","names":["Matrix3","Quaternion","Vector3","Ellipsoid","OrientedBoundingBox","makeOrientedBoundingBoxFromPoints","makeBoundingSphereFromPoints","BoundingSphere","createBoundingVolumes","sourceBoundingVolume","geoidHeightModel","radius","halfSize","quaternion","cartographicCenter","WGS84","cartesianToCartographic","center","getHeight","len","fromMatrix3","normalize","mbs","obb","createBoundingVolumesFromGeometry","cartesianPositions","positionVectors","convertPositionsToVectors","geometryObb","geometryMbs","mbsCenter","obbCenter","positions","result","i","length","positionVector","push","convertBoundingVolumeToI3SFullExtent","boundingVolume","sphere","getBoundingSphere","vertexMax","vertexMin","xmin","Math","min","xmax","max","ymin","ymax","zmin","zmax","createObbFromMbs","halfAxex"],"sources":["../../../../src/i3s-converter/helpers/coordinate-converter.ts"],"sourcesContent":["import type {BoundingVolumes, FullExtent, Mbs, Obb} from '@loaders.gl/i3s';\n\nimport {Matrix3, Quaternion, Vector3} from '@math.gl/core';\nimport {Ellipsoid} from '@math.gl/geospatial';\nimport {\n OrientedBoundingBox,\n makeOrientedBoundingBoxFromPoints,\n makeBoundingSphereFromPoints,\n BoundingSphere\n} from '@math.gl/culling';\nimport {Geoid} from '@math.gl/geoid';\n\n/**\n * Create bounding volumes object from tile and geoid height model.\n * @param sourceBoundingVolume - initialized bounding volume of the source tile\n * @param geoidHeightModel - instance of Geoid class that converts elevation from geoidal to ellipsoidal and back\n * @returns - Bounding volumes object\n */\nexport function createBoundingVolumes(\n sourceBoundingVolume: OrientedBoundingBox | BoundingSphere,\n geoidHeightModel: Geoid\n): BoundingVolumes {\n let radius;\n let halfSize;\n let quaternion;\n\n const cartographicCenter = Ellipsoid.WGS84.cartesianToCartographic(\n sourceBoundingVolume.center,\n new Vector3()\n );\n cartographicCenter[2] =\n cartographicCenter[2] -\n geoidHeightModel.getHeight(cartographicCenter[1], cartographicCenter[0]);\n if (sourceBoundingVolume instanceof OrientedBoundingBox) {\n halfSize = sourceBoundingVolume.halfSize;\n radius = new Vector3(halfSize[0], halfSize[1], halfSize[2]).len();\n quaternion = sourceBoundingVolume.quaternion;\n } else {\n radius = sourceBoundingVolume.radius;\n halfSize = [radius, radius, radius];\n quaternion = new Quaternion()\n .fromMatrix3(new Matrix3([halfSize[0], 0, 0, 0, halfSize[1], 0, 0, 0, halfSize[2]]))\n .normalize();\n }\n\n return {\n mbs: [cartographicCenter[0], cartographicCenter[1], cartographicCenter[2], radius],\n obb: {\n center: [cartographicCenter[0], cartographicCenter[1], cartographicCenter[2]],\n halfSize,\n quaternion\n }\n };\n}\n\n/**\n * Generates bounding volumes from geometry positions\n * @param cartesianPositions\n * @param geoidHeightModel\n */\nexport function createBoundingVolumesFromGeometry(\n cartesianPositions: Float32Array,\n geoidHeightModel: Geoid\n): {mbs: Mbs; obb: Obb} {\n const positionVectors = convertPositionsToVectors(cartesianPositions);\n\n const geometryObb = makeOrientedBoundingBoxFromPoints(positionVectors);\n const geometryMbs = makeBoundingSphereFromPoints(positionVectors);\n\n let mbsCenter = Ellipsoid.WGS84.cartesianToCartographic(geometryMbs.center, new Vector3());\n let obbCenter = Ellipsoid.WGS84.cartesianToCartographic(geometryObb.center, new Vector3());\n\n mbsCenter[2] = mbsCenter[2] - geoidHeightModel.getHeight(mbsCenter[1], mbsCenter[0]);\n obbCenter[2] = obbCenter[2] - geoidHeightModel.getHeight(obbCenter[1], obbCenter[0]);\n\n return {\n mbs: [mbsCenter[0], mbsCenter[1], mbsCenter[2], geometryMbs.radius],\n obb: {\n center: obbCenter,\n halfSize: geometryObb.halfSize,\n quaternion: geometryObb.quaternion\n }\n };\n}\n\n/**\n * Create array of posisitons where each vertex is vector\n * @param {array} positions\n * @returns {Vector3[]}\n */\nexport function convertPositionsToVectors(positions: Float32Array): Vector3[] {\n const result: Vector3[] = [];\n\n for (let i = 0; i < positions.length; i += 3) {\n // TODO: (perf) new Vector3 is not optimal but required in `makeOrientedBoundingBoxFromPoints`.\n // modify `makeOrientedBoundingBoxFromPoints` to use scratch vectors\n const positionVector = new Vector3([positions[i], positions[i + 1], positions[i + 2]]);\n result.push(positionVector);\n }\n\n return result;\n}\n\n/**\n * Convert common coordinate to fullExtent https://github.com/Esri/i3s-spec/blob/master/docs/1.8/fullExtent.cmn.md\n * @param boundingVolume\n * @returns - fullExtent object\n */\nexport function convertBoundingVolumeToI3SFullExtent(\n boundingVolume: OrientedBoundingBox | BoundingSphere\n): FullExtent {\n let sphere: BoundingSphere;\n if (boundingVolume instanceof BoundingSphere) {\n sphere = boundingVolume;\n } else {\n sphere = boundingVolume.getBoundingSphere();\n }\n const center: Vector3 = sphere.center;\n const radius: number = sphere.radius;\n const vertexMax = Ellipsoid.WGS84.cartesianToCartographic(\n new Vector3(center[0] + radius, center[1] + radius, center[2] + radius),\n new Vector3()\n );\n const vertexMin = Ellipsoid.WGS84.cartesianToCartographic(\n new Vector3(center[0] - radius, center[1] - radius, center[2] - radius),\n new Vector3()\n );\n\n // Converter sometimes returns min values that are bigger then max,\n // so we should check and take bigger value from max and smaller for nim\n return {\n xmin: Math.min(vertexMin[0], vertexMax[0]),\n xmax: Math.max(vertexMin[0], vertexMax[0]),\n ymin: Math.min(vertexMin[1], vertexMax[1]),\n ymax: Math.max(vertexMin[1], vertexMax[1]),\n zmin: Math.min(vertexMin[2], vertexMax[2]),\n zmax: Math.max(vertexMin[2], vertexMax[2])\n };\n}\n\n/**\n * Creates oriented boundinb box from mbs.\n * @param mbs - Minimum Bounding Sphere\n * @returns - Oriented Bounding Box\n */\nexport function createObbFromMbs(mbs: Mbs): Obb {\n const radius = mbs[3];\n const center = new Vector3(mbs[0], mbs[1], mbs[2]);\n const halfAxex = new Matrix3([radius, 0, 0, 0, radius, 0, 0, 0, radius]);\n return new OrientedBoundingBox(center, halfAxex);\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-scene-server-path.js","names":["v4","uuidv4","transform","join","SCENE_SERVER","sceneServerTemplate","writeFile","createSceneServerPath","layerName","layers0","rootPath","sceneServerData","serviceItemId","replace","sceneServer","nodePagePath","JSON","stringify"],"sources":["../../../../src/i3s-converter/helpers/create-scene-server-path.ts"],"sourcesContent":["import type {SceneLayer3D} from '@loaders.gl/i3s';\nimport {v4 as uuidv4} from 'uuid';\nimport transform from 'json-map-transform';\nimport {join} from 'path';\n\nimport {SCENE_SERVER as sceneServerTemplate} from '../json-templates/scene-server';\nimport {writeFile} from '../../lib/utils/file-utils';\n\n/**\n * Form and save sceneServer meta data into a file\n * @param layerName - layer name to display\n * @param layers0 - layer object embedded into sceneServer meta data\n * @param rootPath - root path of new converted tileset\n */\nexport async function createSceneServerPath(\n layerName: string,\n layers0: SceneLayer3D,\n rootPath: string\n): Promise<void> {\n const sceneServerData = {\n serviceItemId: uuidv4().replace(/-/gi, ''),\n layerName,\n layers0\n };\n\n const sceneServer = transform(sceneServerData, sceneServerTemplate());\n const nodePagePath = join(rootPath, 'SceneServer');\n await writeFile(nodePagePath, JSON.stringify(sceneServer));\n}\n"],"mappings":"AACA,SAAQA,EAAE,IAAIC,MAAM,QAAO,MAAM;AACjC,OAAOC,SAAS,MAAM,oBAAoB;AAC1C,SAAQC,IAAI,QAAO,MAAM;AAEzB,SAAQC,YAAY,IAAIC,mBAAmB,QAAO,gCAAgC;AAClF,SAAQC,SAAS,QAAO,4BAA4B;AAQpD,OAAO,eAAeC,qBAAqBA,CACzCC,SAAiB,EACjBC,OAAqB,EACrBC,QAAgB,EACD;EACf,MAAMC,eAAe,GAAG;IACtBC,aAAa,EAAEX,MAAM,CAAC,CAAC,CAACY,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IAC1CL,SAAS;IACTC;EACF,CAAC;EAED,MAAMK,WAAW,GAAGZ,SAAS,CAACS,eAAe,EAAEN,mBAAmB,CAAC,CAAC,CAAC;EACrE,MAAMU,YAAY,GAAGZ,IAAI,CAACO,QAAQ,EAAE,aAAa,CAAC;EAClD,MAAMJ,SAAS,CAACS,YAAY,EAAEC,IAAI,CAACC,SAAS,CAACH,WAAW,CAAC,CAAC;AAC5D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"feature-attributes.js","names":["flattenPropertyTableByFeatureIds","featureIdsMap","propertyTable","resultPropertyTable","propertyName","properties","getPropertiesByFeatureIds","resultProperties","featureIdKey","property","push","checkPropertiesLength","featureIds","needFlatten","attribute","Object","values","length","STRING_TYPE","SHORT_INT_TYPE","DOUBLE_TYPE","OBJECT_ID_TYPE","getAttributeType","key","Number","isInteger","createdStorageAttribute","attributeIndex","attributeType","storageAttribute","concat","name","ordering","header","valueType","attributeValues","valuesPerElement","setupIdAttribute","setupStringAttribute","setupDoubleAttribute","getFieldAttributeType","createFieldAttribute","fieldAttributeType","type","alias","createPopupInfo","title","mediaInfos","fieldInfos","popupElements","expressionInfos","fieldName","visible","isEditable","label","unshift","encoding","attributeByteCounts"],"sources":["../../../../src/i3s-converter/helpers/feature-attributes.ts"],"sourcesContent":["import type {FeatureTableJson} from '@loaders.gl/3d-tiles';\nimport {\n Attribute,\n AttributeStorageInfo,\n ESRIField,\n Field,\n FieldInfo,\n PopupInfo\n} from '@loaders.gl/i3s';\n\n/**\n * Takes attributes from property table based on featureIdsMap.\n * If there is no property value for particular featureId (index) the property will be null.\n * Example:\n * Initial data:\n * OBJECTID: {0: 0, 3: 33, 4: 333}\n * component: ['Windows', 'Frames', 'Wall', 'Roof', 'Skylight']\n * Result:\n * OBJECTID: [0, 33, 333]\n * component: ['Windows', 'Roof', 'Skylight']\n * @param featureIdsMap\n * @param propertyTable\n */\nexport function flattenPropertyTableByFeatureIds(\n featureIdsMap: Record<string, number>,\n propertyTable: FeatureTableJson\n): FeatureTableJson {\n const resultPropertyTable: FeatureTableJson = {};\n for (const propertyName in propertyTable) {\n const properties = propertyTable[propertyName];\n resultPropertyTable[propertyName] = getPropertiesByFeatureIds(properties, featureIdsMap);\n }\n\n return resultPropertyTable;\n}\n\n/**\n * Getting properties by featureId index\n * @param properties\n * @param featureIdsMap\n */\nfunction getPropertiesByFeatureIds(\n properties: unknown[],\n featureIdsMap: Record<string, number>\n): unknown[] {\n const resultProperties: unknown[] = [];\n\n if (properties) {\n for (const featureIdKey in featureIdsMap) {\n const property = properties[featureIdKey] || null;\n resultProperties.push(property);\n }\n }\n\n return resultProperties;\n}\n\n/**\n * Check that all attributes in propertyTable have the same length as FeatureIds.\n * If there are differencies between lengths we should flatten property table based on exiesting featureIds.\n * @param featureIds\n * @param propertyTable\n * @returns\n */\nexport function checkPropertiesLength(\n featureIds: number[],\n propertyTable: FeatureTableJson\n): boolean {\n let needFlatten = false;\n\n for (const attribute of Object.values(propertyTable)) {\n if (!featureIds || !attribute || featureIds.length !== attribute.length) {\n needFlatten = true;\n }\n }\n\n return needFlatten;\n}\n\n/** String data type name for feature attributes */\nconst STRING_TYPE = 'string';\n/** Integer data type name for feature attributes */\nconst SHORT_INT_TYPE = 'Int32';\n/** Double data type name for feature attributes */\nconst DOUBLE_TYPE = 'double';\n/** Type of attribute that is linked with feature ids */\nconst OBJECT_ID_TYPE = 'OBJECTID';\n/**\n * Get the attribute type for attributeStorageInfo https://github.com/Esri/i3s-spec/blob/master/docs/1.7/attributeStorageInfo.cmn.md\n * @param key - attribute's key\n * @param attribute - attribute taken from propertyTable\n */\nexport function getAttributeType(key: string, attribute: unknown): string {\n if (key === OBJECT_ID_TYPE) {\n return OBJECT_ID_TYPE;\n }\n if (typeof attribute === STRING_TYPE || typeof attribute === 'bigint') {\n return STRING_TYPE;\n } else if (typeof attribute === 'number') {\n return Number.isInteger(attribute) ? SHORT_INT_TYPE : DOUBLE_TYPE;\n }\n return STRING_TYPE;\n}\n\n/**\n * Generate storage attribute for map segmentation.\n * @param attributeIndex - order index of attribute (f_0, f_1 ...).\n * @param key - attribute key from propertyTable.\n * @param attributeType - attribute type.\n * @return Updated storageAttribute.\n */\nexport function createdStorageAttribute(\n attributeIndex: number,\n key: string,\n attributeType: Attribute\n): AttributeStorageInfo {\n const storageAttribute = {\n key: `f_${attributeIndex}`,\n name: key,\n ordering: ['attributeValues'],\n header: [{property: 'count', valueType: 'UInt32'}],\n attributeValues: {valueType: 'Int32', valuesPerElement: 1}\n };\n\n switch (attributeType) {\n case OBJECT_ID_TYPE:\n setupIdAttribute(storageAttribute);\n break;\n case STRING_TYPE:\n setupStringAttribute(storageAttribute);\n break;\n case DOUBLE_TYPE:\n setupDoubleAttribute(storageAttribute);\n break;\n case SHORT_INT_TYPE:\n break;\n default:\n setupStringAttribute(storageAttribute);\n }\n\n return storageAttribute;\n}\n\n/**\n * Find and return attribute type based on key form propertyTable.\n * @param attributeType\n */\nexport function getFieldAttributeType(attributeType: Attribute): ESRIField {\n switch (attributeType) {\n case OBJECT_ID_TYPE:\n return 'esriFieldTypeOID';\n case STRING_TYPE:\n return 'esriFieldTypeString';\n case SHORT_INT_TYPE:\n return 'esriFieldTypeInteger';\n case DOUBLE_TYPE:\n return 'esriFieldTypeDouble';\n default:\n return 'esriFieldTypeString';\n }\n}\n\n/**\n * Setup field attribute for map segmentation.\n * @param key - attribute for map segmentation.\n * @param fieldAttributeType - esri attribute type ('esriFieldTypeString' or 'esriFieldTypeOID').\n */\nexport function createFieldAttribute(key: string, fieldAttributeType: ESRIField): Field {\n return {\n name: key,\n type: fieldAttributeType,\n alias: key\n };\n}\n\n/**\n * Generate popup info to show metadata on the map.\n * @param propertyTable - table data with OBJECTID.\n * @return data for correct rendering of popup.\n */\nexport function createPopupInfo(propertyTable: FeatureTableJson): PopupInfo {\n const title = '{OBJECTID}';\n const mediaInfos = [];\n const fieldInfos: FieldInfo[] = [];\n const popupElements: {\n fieldInfos: FieldInfo[];\n type: string;\n }[] = [];\n const expressionInfos = [];\n\n for (const key in propertyTable) {\n fieldInfos.push({\n fieldName: key,\n visible: true,\n isEditable: false,\n label: key\n });\n }\n popupElements.push({\n fieldInfos,\n type: 'fields'\n });\n\n return {\n title,\n mediaInfos,\n popupElements,\n fieldInfos,\n expressionInfos\n };\n}\n\n/**\n * Setup storage attribute as string.\n * @param storageAttribute - attribute for map segmentation.\n */\nfunction setupStringAttribute(storageAttribute: AttributeStorageInfo): void {\n // @ts-expect-error\n storageAttribute.ordering.unshift('attributeByteCounts');\n storageAttribute.header.push({property: 'attributeValuesByteCount', valueType: 'UInt32'});\n storageAttribute.attributeValues = {\n valueType: 'String',\n encoding: 'UTF-8',\n valuesPerElement: 1\n };\n storageAttribute.attributeByteCounts = {\n valueType: 'UInt32',\n valuesPerElement: 1\n };\n}\n\n/**\n * Setup Id attribute for map segmentation.\n * @param storageAttribute - attribute for map segmentation .\n */\nfunction setupIdAttribute(storageAttribute: AttributeStorageInfo): void {\n storageAttribute.attributeValues = {\n valueType: 'Oid32',\n valuesPerElement: 1\n };\n}\n\n/**\n * Setup double attribute for map segmentation.\n * @param storageAttribute - attribute for map segmentation .\n */\nfunction setupDoubleAttribute(storageAttribute: AttributeStorageInfo): void {\n storageAttribute.attributeValues = {\n valueType: 'Float64',\n valuesPerElement: 1\n };\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"geometry-attributes.js","names":["concatenateTypedArrays","VALUES_PER_VERTEX","POSITIONS_AND_NORMALS_PER_TRIANGLE","generateAttributes","attributes","positions","normals","texCoords","colors","uvRegions","featureIndices","triangleCount","length","faceRange","Uint32Array","featureIds","featureCount","data","calculateFaceRangesAndFeaturesCount","attributeObjects","makeAttributeObjects","unifiedAttributeObjectsByFeatureIds","unifyObjectsByFeatureId","groupedAttributes","groupAttributesAndRangesByFeatureId","rangeIndex","featureIndex","currentFeatureId","getFrequentValue","slice","faceRangeList","uniqueFeatureIds","index","newFeatureId","includes","push","values","map","mostFrequentValue","maxCount","value","groupedData","positionsList","Float32Array","normalsList","colorsList","Uint8Array","texCoordsList","uvRegionsList","Uint16Array","positionsOffset","normalsOffset","colorsOffset","uvRegionsOffset","texCoordsOffset","startIndex","endIndex","positionsCount","getSliceAttributeCount","normalsCount","colorsCount","uvRegionsCount","texCoordsCount","featureId","subarray","attributeName","itemsPerVertex4","texCoordsPerVertex","trianglesCount","vertexCount","sortedData","groupedMetadata","existingObject","find","obj","uniqueObjects","metatada","concatenateAttributes","unifiedObjects","firstAttributeObject","range","objIndex","sum","currentAttributesObject","groupedObject","positionGroups","_ref","normalGroups","_ref2","colorGroups","_ref3","texCoordGroups","_ref4","uvRegionGroups","_ref5"],"sources":["../../../../src/i3s-converter/helpers/geometry-attributes.ts"],"sourcesContent":["import type {\n GeometryAttributes,\n ConvertedAttributes,\n GroupedByFeatureIdAttributes,\n GroupedAttributes\n} from '../types';\nimport {concatenateTypedArrays} from '@loaders.gl/loader-utils';\n\nconst VALUES_PER_VERTEX = 3;\nconst POSITIONS_AND_NORMALS_PER_TRIANGLE = 9;\n\n/**\n * Generate geometry attributes with faceRange and featureCount\n * @param attributes\n * @returns attirbutes with featureCount, featureIds and changed faceRange.\n */\nexport function generateAttributes(attributes: ConvertedAttributes): GeometryAttributes {\n const {positions, normals, texCoords, colors, uvRegions, featureIndices} = attributes;\n const triangleCount = positions.length / POSITIONS_AND_NORMALS_PER_TRIANGLE;\n\n if (!featureIndices.length) {\n return {\n faceRange: new Uint32Array([0, triangleCount - 1]),\n featureIds: [0],\n featureCount: 1,\n positions,\n normals,\n texCoords,\n colors,\n uvRegions\n };\n }\n\n const data = calculateFaceRangesAndFeaturesCount(featureIndices);\n const attributeObjects = makeAttributeObjects({...data, ...attributes});\n const unifiedAttributeObjectsByFeatureIds = unifyObjectsByFeatureId(attributeObjects);\n const groupedAttributes = groupAttributesAndRangesByFeatureId(\n unifiedAttributeObjectsByFeatureIds,\n data.featureCount\n );\n return groupedAttributes;\n}\n\n/**\n * Calculates face Ranges and feature count based on featureIndices.\n * @param featureIndices\n * @returns Object with featureCount, reordered attributes and changed faceRange.\n */\nfunction calculateFaceRangesAndFeaturesCount(featureIndices: number[]): {\n faceRange: Uint32Array;\n featureCount: number;\n featureIds: number[];\n} {\n let rangeIndex = 1;\n let featureIndex = 1;\n let currentFeatureId = getFrequentValue(featureIndices.slice(0, VALUES_PER_VERTEX));\n const faceRangeList: any[] = [];\n const featureIds: any[] = [];\n const uniqueFeatureIds = [currentFeatureId];\n\n faceRangeList[0] = 0;\n featureIds[0] = currentFeatureId;\n\n for (let index = VALUES_PER_VERTEX; index < featureIndices.length; index += VALUES_PER_VERTEX) {\n const newFeatureId = getFrequentValue(featureIndices.slice(index, index + VALUES_PER_VERTEX));\n if (currentFeatureId !== newFeatureId) {\n faceRangeList[rangeIndex] = index / VALUES_PER_VERTEX - 1;\n faceRangeList[rangeIndex + 1] = index / VALUES_PER_VERTEX;\n featureIds[featureIndex] = newFeatureId;\n\n if (!uniqueFeatureIds.includes(newFeatureId)) {\n uniqueFeatureIds.push(newFeatureId);\n }\n\n rangeIndex += 2;\n featureIndex += 1;\n }\n currentFeatureId = newFeatureId;\n }\n\n faceRangeList[rangeIndex] = featureIndices.length / VALUES_PER_VERTEX - 1;\n\n const faceRange = new Uint32Array(faceRangeList);\n const featureCount = uniqueFeatureIds.length;\n\n return {faceRange, featureCount, featureIds};\n}\n\n/**\n * Find most frequent value to avoid situation where one vertex can be part of multiple features (objects).\n * @param values\n */\nfunction getFrequentValue(values: number[]): number {\n const map: {[key: number]: number} = {};\n\n let mostFrequentValue = values[0];\n let maxCount = 1;\n\n for (const value of values) {\n // Save item and it's frequency count to the map.\n map[value] = (map[value] || 0) + 1;\n // Find max count of frequency.\n maxCount = maxCount > map[value] ? maxCount : map[value];\n // Find the most frequent value.\n mostFrequentValue = maxCount > map[value] ? mostFrequentValue : value;\n }\n\n return mostFrequentValue;\n}\n\n/**\n * Generate list of attribute object grouped by feature ids.\n * @param attributes\n * @returns sorted list of attribute objects.\n */\nfunction makeAttributeObjects(attributes: GeometryAttributes): GroupedByFeatureIdAttributes[] {\n const {\n featureIds,\n positions,\n normals,\n colors,\n uvRegions,\n texCoords,\n faceRange = new Uint32Array(0)\n } = attributes;\n const groupedData: GroupedByFeatureIdAttributes[] = [];\n\n let positionsList = new Float32Array(positions);\n let normalsList = new Float32Array(normals);\n let colorsList = new Uint8Array(colors);\n let texCoordsList = new Float32Array(texCoords);\n let uvRegionsList = new Uint16Array(uvRegions);\n let positionsOffset = 0;\n let normalsOffset = 0;\n let colorsOffset = 0;\n let uvRegionsOffset = 0;\n let texCoordsOffset = 0;\n\n for (let index = 0; index < featureIds.length; index++) {\n const startIndex = faceRange[index * 2];\n const endIndex = faceRange[index * 2 + 1];\n\n const positionsCount = getSliceAttributeCount('positions', startIndex, endIndex);\n const normalsCount = getSliceAttributeCount('normals', startIndex, endIndex);\n const colorsCount = getSliceAttributeCount('colors', startIndex, endIndex);\n const uvRegionsCount = getSliceAttributeCount('uvRegions', startIndex, endIndex);\n const texCoordsCount = getSliceAttributeCount('texCoords', startIndex, endIndex);\n\n groupedData.push({\n featureId: featureIds[index],\n positions: positionsList.subarray(positionsOffset, positionsOffset + positionsCount),\n normals: normalsList.subarray(normalsOffset, normalsOffset + normalsCount),\n colors: colorsList.subarray(colorsOffset, colorsOffset + colorsCount),\n uvRegions: uvRegionsList.subarray(uvRegionsOffset, uvRegionsOffset + uvRegionsCount),\n texCoords: texCoordsList.subarray(texCoordsOffset, texCoordsOffset + texCoordsCount)\n });\n\n positionsOffset += positionsCount;\n normalsOffset += normalsCount;\n colorsOffset += colorsCount;\n uvRegionsOffset += uvRegionsCount;\n texCoordsOffset += texCoordsCount;\n }\n\n return groupedData;\n}\n\n/**\n * Generate sliced count for generating attribute objects depends on attribute name and range.\n * @param attributeName\n * @param startIndex\n * @param endIndex\n * @returns sliced count\n */\nfunction getSliceAttributeCount(\n attributeName: string,\n startIndex: number,\n endIndex: number\n): number {\n const itemsPerVertex4 = 4;\n const texCoordsPerVertex = 2;\n\n const trianglesCount = endIndex - startIndex + 1;\n const vertexCount = trianglesCount * 3;\n\n switch (attributeName) {\n case 'positions':\n case 'normals':\n return trianglesCount * POSITIONS_AND_NORMALS_PER_TRIANGLE;\n case 'colors':\n case 'uvRegions':\n return vertexCount * itemsPerVertex4;\n case 'texCoords':\n return vertexCount * texCoordsPerVertex;\n default:\n return 0;\n }\n}\n\n/**\n * Generates unique object list depends on feature ids and concantenate their attributes.\n * @param sortedData\n * @returns unique list of objects\n */\nfunction unifyObjectsByFeatureId(\n sortedData: GroupedByFeatureIdAttributes[]\n): GroupedByFeatureIdAttributes[] {\n const groupedMetadata: {\n featureId: number;\n attributes: GroupedByFeatureIdAttributes[];\n }[] = [];\n for (const data of sortedData) {\n const existingObject = groupedMetadata.find((obj) => obj.featureId === data.featureId);\n if (existingObject) {\n existingObject.attributes.push(data);\n } else {\n groupedMetadata.push({\n featureId: data.featureId,\n attributes: [data]\n });\n }\n }\n\n const uniqueObjects: GroupedByFeatureIdAttributes[] = [];\n for (const metatada of groupedMetadata) {\n const attributes = concatenateAttributes(metatada.attributes);\n\n uniqueObjects.push({\n featureId: metatada.featureId,\n ...attributes\n });\n }\n\n return uniqueObjects;\n}\n\n/**\n * Generates attribute objects with new faceRange and reordered attributes.\n * @param unifiedObjects\n * @returns generated attributes with new faceRange.\n */\nfunction groupAttributesAndRangesByFeatureId(\n unifiedObjects: GroupedByFeatureIdAttributes[],\n featureCount: number\n): GeometryAttributes {\n const firstAttributeObject = unifiedObjects[0];\n const featureIds = [firstAttributeObject.featureId || 0];\n const range = [0];\n\n let objIndex = 0;\n let sum = 0;\n\n for (let index = 1; index < unifiedObjects.length; index++) {\n const currentAttributesObject = unifiedObjects[index];\n featureIds.push(currentAttributesObject.featureId || 0);\n\n const groupedObject = unifiedObjects[objIndex];\n range.push(groupedObject.positions.length / POSITIONS_AND_NORMALS_PER_TRIANGLE - 1 + sum);\n range.push(groupedObject.positions.length / POSITIONS_AND_NORMALS_PER_TRIANGLE + sum);\n\n sum += groupedObject.positions.length / POSITIONS_AND_NORMALS_PER_TRIANGLE;\n objIndex += 1;\n }\n\n const attributes = concatenateAttributes(unifiedObjects);\n\n range.push(attributes.positions.length / POSITIONS_AND_NORMALS_PER_TRIANGLE - 1);\n\n const faceRange = new Uint32Array(range);\n return {faceRange, featureIds, featureCount, ...attributes};\n}\n\n/**\n * Concatenate attributes typed arrays\n * @param attributes - grouped by featureId typed arrays\n * @returns - concatenated typed array list\n */\nfunction concatenateAttributes(attributes: GroupedByFeatureIdAttributes[]): GroupedAttributes {\n const positionGroups = attributes.map(({positions}) => positions);\n const positions =\n positionGroups.length > 1 ? concatenateTypedArrays(...positionGroups) : positionGroups[0];\n\n const normalGroups = attributes.map(({normals}) => normals);\n const normals =\n normalGroups.length > 1 ? concatenateTypedArrays(...normalGroups) : normalGroups[0];\n\n const colorGroups = attributes.map(({colors}) => colors);\n const colors = colorGroups.length > 1 ? concatenateTypedArrays(...colorGroups) : colorGroups[0];\n\n const texCoordGroups = attributes.map(({texCoords}) => texCoords);\n const texCoords =\n texCoordGroups.length > 1 ? concatenateTypedArrays(...texCoordGroups) : texCoordGroups[0];\n\n const uvRegionGroups = attributes.map(({uvRegions}) => uvRegions);\n const uvRegions =\n uvRegionGroups.length > 1 ? concatenateTypedArrays(...uvRegionGroups) : uvRegionGroups[0];\n return {\n positions,\n normals,\n colors,\n texCoords,\n uvRegions\n };\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"geometry-converter.js","names":["Vector3","Matrix4","Vector4","Ellipsoid","DracoWriterWorker","assert","encode","concatenateArrayBuffers","concatenateTypedArrays","md5","v4","uuidv4","generateAttributes","createBoundingVolumesFromGeometry","prepareDataForAttributesConversion","getTextureByMetadataClass","handleBatchIdsExtensions","checkPropertiesLength","flattenPropertyTableByFeatureIds","GL","generateSyntheticIndices","EXT_FEATURE_METADATA","EXT_STRUCTURAL_METADATA","getPropertyTableFromExtFeatureMetadata","getPropertyTableFromExtStructuralMetadata","DEFAULT_ROUGHNESS_FACTOR","DEFAULT_METALLIC_FACTOR","VALUES_PER_VERTEX","VALUES_PER_TEX_COORD","VALUES_PER_COLOR_ELEMENT","STRING_TYPE","SHORT_INT_TYPE","DOUBLE_TYPE","OBJECT_ID_TYPE","BATCHED_ID_POSSIBLE_ATTRIBUTE_NAMES","scratchVector","convertB3dmToI3sGeometry","tileContent","tileTransform","tileBoundingVolume","addNodeToNodePage","propertyTable","featuresHashArray","attributeStorageInfo","draco","generateBoundingVolumes","shouldMergeMaterials","geoidHeightModel","libraries","metadataClass","_tileContent$gltf","useCartesianPositions","materialAndTextureList","convertMaterials","gltf","materials","dataForAttributesConversion","featureTexture","convertedAttributesMap","convertAttributes","_generateBoundingVolumesFromGeometry","result","materialAndTexture","originarMaterialId","mergedMaterials","originalMaterialId","has","convertedAttributes","get","material","texture","nodeId","push","_makeNodeResources","length","attributes","values","boundingVolumes","positions","cartographicOrigin","obb","center","index","vertex","subarray","WGS84","cartesianToCartographic","Array","from","getHeight","subtract","set","_ref","_tileContent$gltf2","vertexCount","faceRange","featureIds","normals","colors","uvRegions","texCoords","featureCount","featureIdsMap","makeFeatureIdsUnique","featureIndices","header","Uint32Array","typedFeatureIds","generateBigUint64Array","fileBuffer","Uint8Array","buffer","ArrayBuffer","compressedGeometry","generateCompressedGeometry","Float32Array","convertPropertyTableToAttributeBuffers","geometry","hasUvRegions","Boolean","sharedResources","getSharedResources","meshMaterial","attributesData","nodes","images","cartesianModelMatrix","attributesMap","Map","Uint16Array","featureIndicesGroups","mergedMaterial","convertNodes","undefined","attrKey","keys","delete","reduce","acc","value","concat","matrix","arguments","node","convertNode","getCompositeTransformationMatrix","transformationMatrix","nodeMatrix","rotation","scale","translation","multiplyRight","translate","rotateXYZ","mesh","convertMesh","children","primitive","primitives","outputAttributes","materialUvRegion","_outputAttributes","_outputAttributes$mer","id","find","_ref2","_primitive$material","uvRegion","mode","TRIANGLES","TRIANGLE_STRIP","indices","normalizeIndices","transformVertexArray","vertices","POSITION","attributeSpecificTransformation","transformVertexPositions","NORMAL","transformVertexNormals","flattenTexCoords","TEXCOORD_0","flattenColors","COLOR_0","createUvRegion","flattenBatchIds","getBatchIds","_primitive$indices","TypedArrayConstructor","constructor","newIndices","triangleIndex","currentTriangle","slice","i","reverse","args","newVertices","coordIndex","vertexVector","x","y","z","calleeArgs","transform","transformAsVector","newTexCoords","fill","texCoord","colorsAttribute","components","newColors","colorIndex","color","colorUint8","j","batchedIds","newBatchIds","batchIds","possibleBatchIdAttributeName","sourceMaterials","sourceMaterial","convertMaterial","mergeAllMaterials","newMaterial","splice","mergedIndices","mergeMaterials","_newMaterial$mergedMa","_newMaterial$mergedMa2","newWidth","accum","_ref3","textureSize","width","newHeight","_ref4","Math","max","height","currentX","aTextureMetadata","newX","BYTES_PER_ELEMENT","image","getDefaultMaterial","material1","material2","_material1$texture","_material2$texture","bufferView","buffer1","Buffer","data","buffer2","joinImages","sharpData","direction","toFormat","mimeType","toBuffer","error","console","log","pbrMetallicRoughness","baseColorTexture","textureSetDefinitionId","_sourceMaterial$emiss","_sourceMaterial$pbrMe","_sourceMaterial$pbrMe2","_sourceMaterial$pbrMe3","doubleSided","emissiveFactor","map","c","round","alphaMode","convertAlphaMode","roughnessFactor","metallicFactor","source","emissiveTexture","Number","isFinite","_sourceMaterial$pbrMe4","baseColorFactor","gltfAlphaMode","gltfMaterials","i3sResources","materialDefinitionInfos","gltfMaterial","materialDefinitionInfo","textureDefinitionInfo","convertGLTFMaterialToI3sSharedResources","textureDefinitionInfos","_gltfMaterial$pbrMeta","extractSharedResourcesTextureInfo","colorFactor","extractSharedResourcesMaterialInfo","matDielectricColorComponent","black","unitVector","dielectricSpecular","baseColorVector","firstOperand","multiply","diffuse","lerp","specular","params","toArray","renderMode","_texture$source","_texture$source2","_texture$source3","_texture$source4","encoding","generateImageId","size","_texture$source5","levelCountOfTexture","indexOfLevel","indexOfTextureInStore","zerosCount","toString","rightHalf","repeat","shiftedLevelCountOfTexture","shiftedIndexOfLevel","shiftedWidth","shiftedHeight","leftHalf","imageId","BigInt","batchTable","replaceMap","getFeaturesReplaceMap","replaceIndicesByUnique","featureMap","oldFeatureId","uniqueFeatureId","getOrCreateUniqueFeatureId","generateStringFromBatchTableByIndex","str","key","batchTableStr","hash","includes","indexOf","indicesArray","attributeBuffers","needFlattenPropertyTable","properties","propertyTableWithObjectIds","OBJECTID","propertyName","type","getAttributeType","attributeBuffer","generateAttributeBuffer","generateShortIntegerAttributeBuffer","generateDoubleAttributeBuffer","generateStringAttributeBuffer","attribute","attr","name","JSON","stringify","attributeValues","valueType","count","valuesArray","padding","Float64Array","batchAttributes","stringCountArray","totalNumberOfBytes","stringSizesArray","stringBufferArray","currentString","String","currentStringBuffer","currentStringSize","totalBytes","BigUint64Array","featureIndex","generateFeatureIndexAttribute","compressedAttributes","attributesMetadata","Int32Array","options","reuseWorkers","_nodeWorkers","modules","useLocalLibraries","method","workerUrl","orderedFeatureIndices","fillIndex","startIndex","endIndex","getPropertyTable","batchTableJson","extensionName","extension","getPropertyTableExtension","_tileContent$gltf3","_tileContent$gltf5","_tileContent$gltf5$ex","extensionsWithPropertyTables","extensionsUsed","extensionItem","_tileContent$gltf4","extensions"],"sources":["../../../../src/i3s-converter/helpers/geometry-converter.ts"],"sourcesContent":["import type {FeatureTableJson, Tiles3DTileContent} from '@loaders.gl/3d-tiles';\nimport type {\n GLTFAccessorPostprocessed,\n GLTFMaterialPostprocessed,\n GLTFNodePostprocessed,\n GLTFMeshPrimitivePostprocessed,\n GLTFMeshPostprocessed,\n GLTFTexturePostprocessed,\n GLTF_EXT_feature_metadata_GLTF,\n GLTF_EXT_structural_metadata_GLTF\n} from '@loaders.gl/gltf';\n\nimport {Vector3, Matrix4, Vector4} from '@math.gl/core';\nimport {Ellipsoid} from '@math.gl/geospatial';\n\nimport {DracoWriterWorker} from '@loaders.gl/draco';\nimport {assert, encode} from '@loaders.gl/core';\nimport {concatenateArrayBuffers, concatenateTypedArrays} from '@loaders.gl/loader-utils';\nimport md5 from 'md5';\nimport {v4 as uuidv4} from 'uuid';\nimport {generateAttributes} from './geometry-attributes';\nimport {createBoundingVolumesFromGeometry} from './coordinate-converter';\nimport {\n ConvertedAttributes,\n I3SConvertedResources,\n I3SMaterialWithTexture,\n MergedMaterial,\n SharedResourcesArrays\n} from '../types';\nimport {\n AttributeStorageInfo,\n I3SMaterialDefinition,\n MaterialDefinitionInfo,\n TextureDefinitionInfo\n} from '@loaders.gl/i3s';\nimport {NumberArray, TypedArray} from '@loaders.gl/loader-utils';\nimport {Geoid} from '@math.gl/geoid';\nimport {prepareDataForAttributesConversion} from './gltf-attributes';\nimport {getTextureByMetadataClass, handleBatchIdsExtensions} from './batch-ids-extensions';\nimport {checkPropertiesLength, flattenPropertyTableByFeatureIds} from './feature-attributes';\nimport {GL} from '@loaders.gl/math';\n\n/*\n At the moment of writing the type TypedArrayConstructor is not exported in '@math.gl/types'.\n So the following import is replaced with the local import\n import type {TypedArrayConstructor} from '@math.gl/types'; \n*/\nimport type {GLTFAttributesData, TextureImageProperties, TypedArrayConstructor} from '../types';\nimport {generateSyntheticIndices} from '../../lib/utils/geometry-utils';\nimport {BoundingSphere, OrientedBoundingBox} from '@math.gl/culling';\n\nimport {\n EXT_FEATURE_METADATA,\n EXT_STRUCTURAL_METADATA,\n getPropertyTableFromExtFeatureMetadata,\n getPropertyTableFromExtStructuralMetadata\n} from '@loaders.gl/gltf';\n\n// Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.7/pbrMetallicRoughness.cmn.md\nconst DEFAULT_ROUGHNESS_FACTOR = 1;\nconst DEFAULT_METALLIC_FACTOR = 1;\n\nconst VALUES_PER_VERTEX = 3;\nconst VALUES_PER_TEX_COORD = 2;\nconst VALUES_PER_COLOR_ELEMENT = 4;\n\nconst STRING_TYPE = 'string';\nconst SHORT_INT_TYPE = 'Int32';\nconst DOUBLE_TYPE = 'Float64';\nconst OBJECT_ID_TYPE = 'Oid32';\n/*\n * 'CUSTOM_ATTRIBUTE_2' - Attribute name which includes batch info and used by New York map.\n * _BATCHID - Default attribute name which includes batch info.\n * BATCHID - Legacy attribute name which includes batch info.\n */\nconst BATCHED_ID_POSSIBLE_ATTRIBUTE_NAMES = ['CUSTOM_ATTRIBUTE_2', '_BATCHID', 'BATCHID'];\n\nlet scratchVector = new Vector3();\n\n/**\n * Convert binary data from b3dm file to i3s resources\n *\n * @param tileContent - 3d tile content\n * @param tileTransform - transformation matrix of the tile, calculated recursively multiplying\n * transform of all parent tiles and transform of the current tile\n * @param tileBoundingVolume - initialized bounding volume of the source tile\n * @param addNodeToNodePage - function to add new node to node pages\n * @param propertyTable - batch table (corresponding to feature attributes data)\n * @param featuresHashArray - hash array of features that is needed to not to mix up same features in parent and child nodes\n * @param attributeStorageInfo - attributes metadata from 3DSceneLayer json\n * @param draco - is converter should create draco compressed geometry\n * @param generateBoundingVolumes - is converter should create accurate bounding voulmes from geometry attributes\n * @param shouldMergeMaterials - Try to merge similar materials to be able to merge meshes into one node\n * @param geoidHeightModel - model to convert elevation from elipsoidal to geoid\n * @param libraries - dynamicaly loaded 3rd-party libraries\n * @param metadataClass `- user selected feature metadata class name`\n * @returns Array of node resources to create one or more i3s nodes\n */\nexport default async function convertB3dmToI3sGeometry(\n tileContent: Tiles3DTileContent,\n tileTransform: Matrix4,\n tileBoundingVolume: OrientedBoundingBox | BoundingSphere,\n addNodeToNodePage: () => Promise<number>,\n propertyTable: FeatureTableJson | null,\n featuresHashArray: string[],\n attributeStorageInfo: AttributeStorageInfo[] | undefined,\n draco: boolean,\n generateBoundingVolumes: boolean,\n shouldMergeMaterials: boolean,\n geoidHeightModel: Geoid,\n libraries: Record<string, string>,\n metadataClass?: string\n): Promise<I3SConvertedResources[] | null> {\n const useCartesianPositions = generateBoundingVolumes;\n const materialAndTextureList: I3SMaterialWithTexture[] = await convertMaterials(\n tileContent.gltf?.materials,\n shouldMergeMaterials\n );\n\n const dataForAttributesConversion = prepareDataForAttributesConversion(\n tileContent,\n tileTransform,\n tileBoundingVolume\n );\n const featureTexture = getTextureByMetadataClass(tileContent, metadataClass);\n const convertedAttributesMap: Map<string, ConvertedAttributes> = await convertAttributes(\n dataForAttributesConversion,\n materialAndTextureList,\n useCartesianPositions,\n featureTexture\n );\n /** Usage of worker here brings more overhead than advantage */\n // const convertedAttributesMap: Map<string, ConvertedAttributes> =\n // await transformI3SAttributesOnWorker(dataForAttributesConversion, {\n // reuseWorkers: true,\n // _nodeWorkers: true,\n // useCartesianPositions,\n // source: workerSource.I3SAttributes\n // });\n\n if (generateBoundingVolumes) {\n _generateBoundingVolumesFromGeometry(convertedAttributesMap, geoidHeightModel);\n }\n\n const result: I3SConvertedResources[] = [];\n for (const materialAndTexture of materialAndTextureList) {\n const originarMaterialId = materialAndTexture.mergedMaterials[0].originalMaterialId;\n if (!convertedAttributesMap.has(originarMaterialId)) {\n continue; // eslint-disable-line no-continue\n }\n const convertedAttributes = convertedAttributesMap.get(originarMaterialId);\n if (!convertedAttributes) {\n continue;\n }\n const {material, texture} = materialAndTexture;\n const nodeId = await addNodeToNodePage();\n result.push(\n await _makeNodeResources({\n convertedAttributes,\n material,\n texture,\n tileContent,\n nodeId,\n featuresHashArray,\n propertyTable,\n attributeStorageInfo,\n draco,\n libraries\n })\n );\n }\n\n if (!result.length) {\n return null;\n }\n return result;\n}\n\n/**\n * Create bounding volumes based on positions\n * @param convertedAttributesMap - geometry attributes map\n * @param geoidHeightModel - geoid height model to convert elevation from elipsoidal to geoid\n */\nfunction _generateBoundingVolumesFromGeometry(\n convertedAttributesMap: Map<string, ConvertedAttributes>,\n geoidHeightModel: Geoid\n) {\n for (const attributes of convertedAttributesMap.values()) {\n const boundingVolumes = createBoundingVolumesFromGeometry(\n attributes.positions,\n geoidHeightModel\n );\n\n attributes.boundingVolumes = boundingVolumes;\n const cartographicOrigin = boundingVolumes.obb.center;\n\n for (let index = 0; index < attributes.positions.length; index += VALUES_PER_VERTEX) {\n const vertex = attributes.positions.subarray(index, index + VALUES_PER_VERTEX);\n Ellipsoid.WGS84.cartesianToCartographic(Array.from(vertex), scratchVector);\n scratchVector[2] =\n scratchVector[2] - geoidHeightModel.getHeight(scratchVector[1], scratchVector[0]);\n scratchVector = scratchVector.subtract(cartographicOrigin);\n attributes.positions.set(scratchVector, index);\n }\n }\n}\n\n/**\n *\n * @param params\n * @param params.convertedAttributes - Converted geometry attributes\n * @param params.material - I3S PBR-like material definition\n * @param params.texture - texture content\n * @param params.tileContent - 3DTiles decoded content\n * @param params.nodeId - new node ID\n * @param params.featuresHashArray - hash array of features that is needed to not to mix up same features in parent and child nodes\n * @param params.propertyTable - batch table (corresponding to feature attributes data)\n * @param params.attributeStorageInfo - attributes metadata from 3DSceneLayer json\n * @param params.draco - is converter should create draco compressed geometry\n * @param libraries - dynamicaly loaded 3rd-party libraries\n * @returns Array of I3S node resources\n */\nasync function _makeNodeResources({\n convertedAttributes,\n material,\n texture,\n tileContent,\n nodeId,\n featuresHashArray,\n propertyTable,\n attributeStorageInfo,\n draco,\n libraries\n}: {\n convertedAttributes: ConvertedAttributes;\n material: I3SMaterialDefinition;\n texture?: {};\n tileContent: Tiles3DTileContent;\n nodeId: number;\n featuresHashArray: string[];\n propertyTable: FeatureTableJson | null;\n attributeStorageInfo?: AttributeStorageInfo[];\n draco: boolean;\n libraries: Record<string, string>;\n}): Promise<I3SConvertedResources> {\n const boundingVolumes = convertedAttributes.boundingVolumes;\n const vertexCount = convertedAttributes.positions.length / VALUES_PER_VERTEX;\n const {faceRange, featureIds, positions, normals, colors, uvRegions, texCoords, featureCount} =\n generateAttributes(convertedAttributes);\n\n let featureIdsMap: Record<string, number> = {};\n if (propertyTable) {\n /**\n * 3DTiles has featureIndices unique only for one tile.\n * In I3S featureIds are unique layer-wide. We create featureIds from all feature properties.\n * If 3DTiles features has equal set of properties they are considered as same feature in I3S.\n */\n featureIdsMap = makeFeatureIdsUnique(\n featureIds,\n convertedAttributes.featureIndices,\n featuresHashArray,\n propertyTable\n );\n }\n\n const header = new Uint32Array(2);\n const typedFeatureIds = generateBigUint64Array(featureIds);\n\n header.set([vertexCount, featureCount], 0);\n const fileBuffer = new Uint8Array(\n concatenateArrayBuffers(\n header.buffer,\n positions.buffer,\n normals.buffer,\n texture ? texCoords.buffer : new ArrayBuffer(0),\n colors.buffer,\n uvRegions,\n typedFeatureIds.buffer,\n faceRange.buffer\n )\n );\n const compressedGeometry = draco\n ? generateCompressedGeometry(\n vertexCount,\n convertedAttributes,\n {\n positions,\n normals,\n texCoords: texture ? texCoords : new Float32Array(0),\n colors,\n uvRegions,\n featureIds,\n faceRange\n },\n libraries\n )\n : null;\n\n let attributes: ArrayBuffer[] = [];\n\n if (attributeStorageInfo && propertyTable) {\n attributes = convertPropertyTableToAttributeBuffers(\n featureIds,\n featureIdsMap,\n propertyTable,\n attributeStorageInfo\n );\n }\n\n return {\n nodeId,\n geometry: fileBuffer,\n compressedGeometry,\n texture,\n hasUvRegions: Boolean(uvRegions.length),\n sharedResources: getSharedResources(tileContent.gltf?.materials || [], nodeId),\n meshMaterial: material,\n vertexCount,\n attributes,\n featureCount,\n boundingVolumes\n };\n}\n\n/**\n * Convert attributes from the gltf nodes tree to i3s plain geometry\n * @param attributesData - geometry attributes from gltf\n * @param materialAndTextureList - array of data about materials and textures of the content\n * @param useCartesianPositions - convert positions to absolute cartesian coordinates instead of cartographic offsets.\n * Cartesian coordinates will be required for creating bounding voulmest from geometry positions\n * @param featureTexture - feature texture key\n * @returns map of converted geometry attributes\n */\nexport async function convertAttributes(\n attributesData: GLTFAttributesData,\n materialAndTextureList: I3SMaterialWithTexture[],\n useCartesianPositions: boolean,\n featureTexture: string | null\n): Promise<Map<string, ConvertedAttributes>> {\n const {nodes, images, cartographicOrigin, cartesianModelMatrix} = attributesData;\n const attributesMap = new Map<string, ConvertedAttributes>();\n\n for (const materialAndTexture of materialAndTextureList) {\n const attributes = {\n positions: new Float32Array(0),\n normals: new Float32Array(0),\n texCoords: new Float32Array(0),\n colors: new Uint8Array(0),\n uvRegions: new Uint16Array(0),\n featureIndicesGroups: [],\n featureIndices: [],\n boundingVolumes: null,\n mergedMaterials: materialAndTexture.mergedMaterials\n };\n for (const mergedMaterial of materialAndTexture.mergedMaterials) {\n attributesMap.set(mergedMaterial.originalMaterialId, attributes);\n }\n }\n\n convertNodes(\n nodes,\n images,\n cartographicOrigin,\n cartesianModelMatrix,\n attributesMap,\n useCartesianPositions,\n undefined,\n featureTexture\n );\n\n for (const attrKey of attributesMap.keys()) {\n const attributes = attributesMap.get(attrKey);\n if (!attributes) {\n continue;\n }\n if (attributes.positions.length === 0) {\n attributesMap.delete(attrKey);\n continue; // eslint-disable-line no-continue\n }\n if (attributes.featureIndicesGroups) {\n attributes.featureIndices = attributes.featureIndicesGroups.reduce((acc, value) =>\n acc.concat(value)\n );\n delete attributes.featureIndicesGroups;\n }\n }\n\n return attributesMap;\n}\n\n/**\n * glTF has hierarchical structure of nodes. This function converts nodes starting from those which are in gltf scene object.\n * The goal is applying tranformation matrix for all children. Functions \"convertNodes\" and \"convertNode\" work together recursively.\n * @param nodes - gltf nodes array\n * @param images - gltf images array\n * @param cartographicOrigin - cartographic origin of bounding volume\n * @param cartesianModelMatrix - cartesian model matrix to convert coordinates to cartographic\n * @param attributesMap - for recursive concatenation of attributes\n * @param useCartesianPositions - convert positions to absolute cartesian coordinates instead of cartographic offsets.\n * Cartesian coordinates will be required for creating bounding voulmest from geometry positions\n * @param matrix - transformation matrix - cumulative transformation matrix formed from all parent node matrices\n * @param featureTexture - feature texture key\n * @returns {void}\n */\nfunction convertNodes(\n nodes: GLTFNodePostprocessed[],\n images: (TextureImageProperties | null)[],\n cartographicOrigin: Vector3,\n cartesianModelMatrix: Matrix4,\n attributesMap: Map<string, ConvertedAttributes>,\n useCartesianPositions: boolean,\n matrix: Matrix4 = new Matrix4([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),\n featureTexture: string | null\n) {\n if (nodes) {\n for (const node of nodes) {\n convertNode(\n node,\n images,\n cartographicOrigin,\n cartesianModelMatrix,\n attributesMap,\n useCartesianPositions,\n matrix,\n featureTexture\n );\n }\n }\n}\n\n/**\n * Generate transformation matrix for node\n * Aapply all gltf transformations to initial transformation matrix.\n * @param node\n * @param matrix\n */\nfunction getCompositeTransformationMatrix(node: GLTFNodePostprocessed, matrix: Matrix4) {\n let transformationMatrix = matrix;\n\n const {matrix: nodeMatrix, rotation, scale, translation} = node;\n\n if (nodeMatrix) {\n transformationMatrix = matrix.multiplyRight(nodeMatrix);\n }\n\n if (translation) {\n transformationMatrix = transformationMatrix.translate(translation);\n }\n\n if (rotation) {\n transformationMatrix = transformationMatrix.rotateXYZ(rotation);\n }\n\n if (scale) {\n transformationMatrix = transformationMatrix.scale(scale);\n }\n\n return transformationMatrix;\n}\n\n/**\n * Convert all primitives of node and all children nodes\n * @param node - gltf node\n * @param images - gltf images array\n * @param cartographicOrigin - cartographic origin of bounding volume\n * @param cartesianModelMatrix - cartesian model matrix to convert coordinates to cartographic\n * @param attributesMap Map<{positions: Float32Array, normals: Float32Array, texCoords: Float32Array, colors: Uint8Array, featureIndices: Array}> - for recursive concatenation of\n * attributes\n * @param useCartesianPositions - convert positions to absolute cartesian coordinates instead of cartographic offsets.\n * Cartesian coordinates will be required for creating bounding voulmest from geometry positions\n * @param matrix - transformation matrix - cumulative transformation matrix formed from all parent node matrices\n * @param featureTexture - feature texture key\n */\nfunction convertNode(\n node: GLTFNodePostprocessed,\n images: (TextureImageProperties | null)[],\n cartographicOrigin: Vector3,\n cartesianModelMatrix: Matrix4,\n attributesMap: Map<string, ConvertedAttributes>,\n useCartesianPositions,\n matrix = new Matrix4([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),\n featureTexture: string | null\n) {\n const transformationMatrix = getCompositeTransformationMatrix(node, matrix);\n\n const mesh = node.mesh;\n\n if (mesh) {\n convertMesh(\n mesh,\n images,\n cartographicOrigin,\n cartesianModelMatrix,\n attributesMap,\n useCartesianPositions,\n transformationMatrix,\n featureTexture\n );\n }\n\n convertNodes(\n node.children || [],\n images,\n cartographicOrigin,\n cartesianModelMatrix,\n attributesMap,\n useCartesianPositions,\n transformationMatrix,\n featureTexture\n );\n}\n\n/**\n * Convert all primitives of the mesh\n * @param mesh - gltf mesh data\n * @param images - gltf images array\n * @param cartographicOrigin - cartographic origin of bounding volume\n * @param cartesianModelMatrix - cartesian model matrix to convert coordinates to cartographic\n * @param attributesMap Map<{positions: Float32Array, normals: Float32Array, texCoords: Float32Array, colors: Uint8Array, featureIndices: Array}> - for recursive concatenation of\n * attributes\n * @param useCartesianPositions - convert positions to absolute cartesian coordinates instead of cartographic offsets.\n * Cartesian coordinates will be required for creating bounding voulmest from geometry positions\n * @param attributesMap Map<{positions: Float32Array, normals: Float32Array, texCoords: Float32Array, colors: Uint8Array, featureIndices: Array}> - for recursive concatenation of\n * attributes\n * @param matrix - transformation matrix - cumulative transformation matrix formed from all parent node matrices\n * @param featureTexture - feature texture key\n */\nfunction convertMesh(\n mesh: GLTFMeshPostprocessed,\n images: (TextureImageProperties | null)[],\n cartographicOrigin: Vector3,\n cartesianModelMatrix: Matrix4,\n attributesMap: Map<string, ConvertedAttributes>,\n useCartesianPositions = false,\n matrix = new Matrix4([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),\n featureTexture: string | null\n) {\n for (const primitive of mesh.primitives) {\n let outputAttributes: ConvertedAttributes | null | undefined = null;\n let materialUvRegion: Uint16Array | undefined;\n if (primitive.material) {\n outputAttributes = attributesMap.get(primitive.material.id);\n materialUvRegion = outputAttributes?.mergedMaterials.find(\n ({originalMaterialId}) => originalMaterialId === primitive.material?.id\n )?.uvRegion;\n } else if (attributesMap.has('default')) {\n outputAttributes = attributesMap.get('default');\n }\n assert(outputAttributes !== null, 'Primitive - material mapping failed');\n // Per the spec https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#_mesh_primitive_mode\n // GL.TRIANGLES is default. So in case `mode` is `undefined`, it is 'TRIANGLES'\n assert(\n primitive.mode === undefined ||\n primitive.mode === GL.TRIANGLES ||\n primitive.mode === GL.TRIANGLE_STRIP,\n `Primitive - unsupported mode ${primitive.mode}`\n );\n const attributes = primitive.attributes;\n if (!outputAttributes) {\n continue;\n }\n\n const indices = normalizeIndices(primitive);\n outputAttributes.positions = concatenateTypedArrays(\n outputAttributes.positions,\n transformVertexArray({\n vertices: attributes.POSITION.value,\n cartographicOrigin,\n cartesianModelMatrix,\n nodeMatrix: matrix,\n indices,\n attributeSpecificTransformation: transformVertexPositions,\n useCartesianPositions\n })\n );\n outputAttributes.normals = concatenateTypedArrays(\n outputAttributes.normals,\n transformVertexArray({\n vertices: attributes.NORMAL && attributes.NORMAL.value,\n cartographicOrigin,\n cartesianModelMatrix,\n nodeMatrix: matrix,\n indices,\n attributeSpecificTransformation: transformVertexNormals,\n useCartesianPositions: false\n })\n );\n outputAttributes.texCoords = concatenateTypedArrays(\n outputAttributes.texCoords,\n flattenTexCoords(attributes.TEXCOORD_0 && attributes.TEXCOORD_0.value, indices)\n );\n\n outputAttributes.colors = concatenateTypedArrays(\n outputAttributes.colors,\n flattenColors(attributes.COLOR_0, indices)\n );\n\n if (materialUvRegion) {\n outputAttributes.uvRegions = concatenateTypedArrays(\n outputAttributes.uvRegions,\n createUvRegion(materialUvRegion, indices)\n );\n }\n\n outputAttributes.featureIndicesGroups = outputAttributes.featureIndicesGroups || [];\n outputAttributes.featureIndicesGroups.push(\n flattenBatchIds(getBatchIds(attributes, primitive, images, featureTexture), indices)\n );\n }\n}\n/**\n * Converts TRIANGLE-STRIPS to independent TRIANGLES\n * @param primitive - the primitive to get the indices from\n * @returns indices of vertices of the independent triangles\n */\nfunction normalizeIndices(primitive: GLTFMeshPrimitivePostprocessed): TypedArray {\n let indices: TypedArray | undefined = primitive.indices?.value;\n if (!indices) {\n const positions = primitive.attributes.POSITION.value;\n return generateSyntheticIndices(positions.length / VALUES_PER_VERTEX);\n }\n\n if (indices && primitive.mode === GL.TRIANGLE_STRIP) {\n /*\n TRIANGLE_STRIP geometry contains n+2 vertices for n triangles;\n TRIANGLE geometry contains n*3 vertices for n triangles.\n The conversion from TRIANGLE_STRIP to TRIANGLE implies duplicating adjacent vertices.\n */\n const TypedArrayConstructor = indices.constructor as TypedArrayConstructor;\n const newIndices = new TypedArrayConstructor((indices.length - 2) * 3);\n\n // Copy the first triangle indices with no modification like [i0, i1, i2, ...] -> [i0, i1, i2, ...]\n let triangleIndex = 0;\n let currentTriangle = indices.slice(0, 3);\n newIndices.set(currentTriangle, 0);\n\n // The rest triangle indices are being taken from strips using the following logic:\n // [i1, i2, i3, i4, i5, i6, ...] -> [i3, i2, i1, i2, i3, i4, i5, i4, i3, i4, i5, i6, ...]\n for (let i = 1; i + 2 < indices.length; i++) {\n triangleIndex += 3;\n currentTriangle = indices.slice(i, i + 3);\n if (i % 2 === 0) {\n newIndices.set(currentTriangle, triangleIndex);\n } else {\n // The following \"reverce\" is necessary to calculate normals correctly\n newIndices.set(currentTriangle.reverse(), triangleIndex);\n }\n }\n indices = newIndices;\n }\n return indices as TypedArray;\n}\n\n/**\n * Convert vertices attributes (POSITIONS or NORMALS) to i3s compatible format\n * @param args\n * @param args.vertices - gltf primitive POSITION or NORMAL attribute\n * @param args.cartographicOrigin - cartographic origin coordinates\n * @param args.cartesianModelMatrix - a cartesian model matrix to transform coordnates from cartesian to cartographic format\n * @param args.nodeMatrix - a gltf node transformation matrix - cumulative transformation matrix formed from all parent node matrices\n * @param args.indices - gltf primitive indices\n * @param args.attributeSpecificTransformation - function to do attribute - specific transformations\n * @param args.useCartesianPositions - use coordinates as it is.\n * @returns\n */\nfunction transformVertexArray(args: {\n vertices: TypedArray;\n cartographicOrigin: number[];\n cartesianModelMatrix: number[];\n nodeMatrix: Matrix4;\n indices: TypedArray;\n attributeSpecificTransformation: Function;\n useCartesianPositions: boolean;\n}): Float32Array {\n const {vertices, indices, attributeSpecificTransformation} = args;\n const newVertices = new Float32Array(indices.length * VALUES_PER_VERTEX);\n if (!vertices) {\n return newVertices;\n }\n for (let i = 0; i < indices.length; i++) {\n const coordIndex = indices[i] * VALUES_PER_VERTEX;\n const vertex = vertices.subarray(coordIndex, coordIndex + VALUES_PER_VERTEX);\n let vertexVector = new Vector3(Array.from(vertex));\n\n vertexVector = attributeSpecificTransformation(vertexVector, args);\n\n newVertices[i * VALUES_PER_VERTEX] = vertexVector.x;\n newVertices[i * VALUES_PER_VERTEX + 1] = vertexVector.y;\n newVertices[i * VALUES_PER_VERTEX + 2] = vertexVector.z;\n }\n return newVertices;\n}\n\n/**\n * Trasform positions vector with the attribute specific transformations\n * @param vertexVector - source positions vector to transform\n * @param calleeArgs\n * @param calleeArgs.cartesianModelMatrix - a cartesian model matrix to transform coordnates from cartesian to cartographic format\n * @param calleeArgs.cartographicOrigin - cartographic origin coordinates\n * @param calleeArgs.nodeMatrix - a gltf node transformation matrix - cumulative transformation matrix formed from all parent node matrices\n * @param calleeArgs.useCartesianPositions - use coordinates as it is.\n * @returns transformed positions vector\n */\nfunction transformVertexPositions(vertexVector, calleeArgs): number[] {\n const {cartesianModelMatrix, cartographicOrigin, nodeMatrix, useCartesianPositions} = calleeArgs;\n\n if (nodeMatrix) {\n vertexVector = vertexVector.transform(nodeMatrix);\n }\n\n vertexVector = vertexVector.transform(cartesianModelMatrix);\n\n if (useCartesianPositions) {\n return vertexVector;\n }\n\n Ellipsoid.WGS84.cartesianToCartographic(\n [vertexVector[0], vertexVector[1], vertexVector[2]],\n vertexVector\n );\n vertexVector = vertexVector.subtract(cartographicOrigin);\n return vertexVector;\n}\n\n/**\n * Trasform normals vector with the attribute specific transformations\n * @param vertexVector - source normals vector to transform\n * @param calleeArgs\n * @param calleeArgs.cartesianModelMatrix - a cartesian model matrix to transform coordnates from cartesian to cartographic format\n * @param calleeArgs.nodeMatrix - a gltf node transformation matrix - cumulative transformation matrix formed from all parent node matrices\n * @returns transformed normals vector\n */\nfunction transformVertexNormals(vertexVector, calleeArgs): number[] {\n const {cartesianModelMatrix, nodeMatrix} = calleeArgs;\n\n if (nodeMatrix) {\n vertexVector = vertexVector.transformAsVector(nodeMatrix);\n }\n\n vertexVector = vertexVector.transformAsVector(cartesianModelMatrix);\n return vertexVector;\n}\n\n/**\n * Convert uv0 (texture coordinates) from coords based on indices to plain arrays, compatible with i3s\n * @param texCoords - gltf primitive TEXCOORD_0 attribute\n * @param indices - gltf primitive indices\n * @returns flattened texture coordinates\n */\nfunction flattenTexCoords(texCoords: TypedArray, indices: TypedArray): Float32Array {\n const newTexCoords = new Float32Array(indices.length * VALUES_PER_TEX_COORD);\n if (!texCoords) {\n // We need dummy UV0s because it is required in 1.6\n // https://github.com/Esri/i3s-spec/blob/master/docs/1.6/vertexAttribute.cmn.md\n newTexCoords.fill(1);\n return newTexCoords;\n }\n for (let i = 0; i < indices.length; i++) {\n const coordIndex = indices[i] * VALUES_PER_TEX_COORD;\n const texCoord = texCoords.subarray(coordIndex, coordIndex + VALUES_PER_TEX_COORD);\n newTexCoords[i * VALUES_PER_TEX_COORD] = texCoord[0];\n newTexCoords[i * VALUES_PER_TEX_COORD + 1] = texCoord[1];\n }\n return newTexCoords;\n}\n\n/**\n * Convert color from COLOR_0 based on indices to plain arrays, compatible with i3s\n * @param colorsAttribute - gltf primitive COLOR_0 attribute\n * @param indices - gltf primitive indices\n * @returns flattened colors attribute\n */\nfunction flattenColors(\n colorsAttribute: GLTFAccessorPostprocessed,\n indices: TypedArray\n): Uint8Array {\n const components = colorsAttribute?.components || VALUES_PER_COLOR_ELEMENT;\n const newColors = new Uint8Array(indices.length * components);\n if (!colorsAttribute) {\n // Vertex color multiplies by material color so it must be normalized 1 by default\n newColors.fill(255);\n return newColors;\n }\n const colors = colorsAttribute.value;\n for (let i = 0; i < indices.length; i++) {\n const colorIndex = indices[i] * components;\n const color = colors.subarray(colorIndex, colorIndex + components);\n const colorUint8 = new Uint8Array(components);\n for (let j = 0; j < color.length; j++) {\n colorUint8[j] = color[j] * 255;\n }\n newColors.set(colorUint8, i * components);\n }\n return newColors;\n}\n\n/**\n * Create per-vertex uv-region array\n * @param materialUvRegion - uv-region fragment for a single vertex\n * @param indices - geometry indices data\n * @returns - uv-region array\n */\nfunction createUvRegion(materialUvRegion: Uint16Array, indices: TypedArray): Uint16Array {\n const result = new Uint16Array(indices.length * 4);\n for (let i = 0; i < result.length; i += 4) {\n result.set(materialUvRegion, i);\n }\n return result;\n}\n\n/**\n * Flatten batchedIds list based on indices to right ordered array, compatible with i3s\n * @param batchedIds - gltf primitive\n * @param indices - gltf primitive indices\n * @returns flattened batch ids\n */\nfunction flattenBatchIds(batchedIds: NumberArray, indices: TypedArray): number[] {\n if (!batchedIds.length || !indices.length) {\n return [];\n }\n const newBatchIds: number[] = [];\n for (let i = 0; i < indices.length; i++) {\n const coordIndex = indices[i];\n newBatchIds.push(batchedIds[coordIndex]);\n }\n return newBatchIds;\n}\n\n/**\n * Get batchIds for featureIds creation\n * @param attributes - gltf accessors\n * @param primitive - gltf primitive data\n * @param images - gltf texture images\n * @param featureTexture - feature texture key\n * @return batch IDs\n */\nfunction getBatchIds(\n attributes: {\n [key: string]: GLTFAccessorPostprocessed;\n },\n primitive: GLTFMeshPrimitivePostprocessed,\n images: (TextureImageProperties | null)[],\n featureTexture: string | null\n): NumberArray {\n const batchIds: NumberArray = handleBatchIdsExtensions(\n attributes,\n primitive,\n images,\n featureTexture\n );\n\n if (batchIds.length) {\n return batchIds;\n }\n\n for (let index = 0; index < BATCHED_ID_POSSIBLE_ATTRIBUTE_NAMES.length; index++) {\n const possibleBatchIdAttributeName = BATCHED_ID_POSSIBLE_ATTRIBUTE_NAMES[index];\n if (\n attributes[possibleBatchIdAttributeName] &&\n attributes[possibleBatchIdAttributeName].value\n ) {\n return attributes[possibleBatchIdAttributeName].value;\n }\n }\n\n return [];\n}\n\n/**\n * Convert GLTF material to I3S material definitions and textures\n * @param sourceMaterials Source GLTF materials\n * @param shouldMergeMaterials - if true - the converter will try to merge similar materials\n * to be able to merge primitives having those materials\n * @returns Array of Couples I3SMaterialDefinition + texture content\n */\nasync function convertMaterials(\n sourceMaterials: GLTFMaterialPostprocessed[] = [],\n shouldMergeMaterials: boolean\n): Promise<I3SMaterialWithTexture[]> {\n let materials: I3SMaterialWithTexture[] = [];\n for (const sourceMaterial of sourceMaterials) {\n materials.push(convertMaterial(sourceMaterial));\n }\n\n if (shouldMergeMaterials) {\n materials = await mergeAllMaterials(materials);\n }\n\n return materials;\n}\n\n/**\n * Merge materials when possible\n * @param materials materials array\n * @returns merged materials array\n */\nasync function mergeAllMaterials(\n materials: I3SMaterialWithTexture[]\n): Promise<I3SMaterialWithTexture[]> {\n const result: I3SMaterialWithTexture[] = [];\n while (materials.length > 0) {\n let newMaterial = materials.splice(0, 1)[0];\n const mergedIndices: number[] = [];\n for (let i = 0; i < materials.length; i++) {\n const material = materials[i];\n if (\n (newMaterial.texture && material.texture) ||\n (!newMaterial.texture && !material.texture)\n ) {\n newMaterial = await mergeMaterials(newMaterial, material);\n mergedIndices.push(i);\n }\n }\n if (newMaterial.texture && mergedIndices.length) {\n const newWidth = newMaterial.mergedMaterials?.reduce(\n (accum, {textureSize}) => accum + (textureSize?.width || 0),\n 0\n );\n const newHeight = newMaterial.mergedMaterials?.reduce(\n (accum, {textureSize}) => Math.max(accum, textureSize?.height || 0),\n 0\n );\n let currentX = -1;\n for (const aTextureMetadata of newMaterial.mergedMaterials) {\n if (aTextureMetadata.textureSize) {\n const newX =\n currentX +\n 1 +\n (aTextureMetadata.textureSize.width / newWidth) *\n 2 ** (Uint16Array.BYTES_PER_ELEMENT * 8) -\n 1;\n aTextureMetadata.uvRegion = new Uint16Array([\n currentX + 1,\n 0,\n newX,\n (aTextureMetadata.textureSize.height / newHeight) *\n 2 ** (Uint16Array.BYTES_PER_ELEMENT * 8) -\n 1\n ]);\n currentX = newX;\n }\n }\n\n newMaterial.texture.image.width = newWidth;\n newMaterial.texture.image.height = newHeight;\n }\n for (const index of mergedIndices.reverse()) {\n materials.splice(index, 1);\n }\n result.push(newMaterial);\n }\n\n if (!result.length) {\n result.push({\n material: getDefaultMaterial(),\n mergedMaterials: [{originalMaterialId: 'default'}]\n });\n }\n return result;\n}\n\n/**\n * Merge 2 materials including texture\n * @param material1\n * @param material2\n * @returns\n */\nasync function mergeMaterials(\n material1: I3SMaterialWithTexture,\n material2: I3SMaterialWithTexture\n): Promise<I3SMaterialWithTexture> {\n if (\n material1.texture?.bufferView &&\n material2.texture?.bufferView &&\n material1.mergedMaterials &&\n material2.mergedMaterials\n ) {\n const buffer1 = Buffer.from(material1.texture.bufferView.data);\n const buffer2 = Buffer.from(material2.texture.bufferView.data);\n try {\n // @ts-ignore\n const {joinImages} = await import('join-images');\n const sharpData = await joinImages([buffer1, buffer2], {direction: 'horizontal'});\n material1.texture.bufferView.data = await sharpData\n .toFormat(material1.texture.mimeType === 'image/png' ? 'png' : 'jpeg')\n .toBuffer();\n } catch (error) {\n console.log(\n 'Join images into a texture atlas has failed. Consider usage `--split-nodes` option. (See documentation https://loaders.gl/modules/tile-converter/docs/cli-reference/tile-converter)'\n );\n throw error;\n }\n // @ts-ignore\n material1.material.pbrMetallicRoughness.baseColorTexture.textureSetDefinitionId = 1;\n }\n material1.mergedMaterials = material1.mergedMaterials.concat(material2.mergedMaterials);\n return material1;\n}\n\n/**\n * Convert texture and material from gltf 2.0 material object\n * @param sourceMaterial - material object\n * @returns I3S material definition and texture\n */\nfunction convertMaterial(sourceMaterial: GLTFMaterialPostprocessed): I3SMaterialWithTexture {\n const material: I3SMaterialDefinition = {\n doubleSided: sourceMaterial.doubleSided,\n emissiveFactor: sourceMaterial.emissiveFactor?.map((c) => Math.round(c * 255)) as [\n number,\n number,\n number\n ],\n // It is in upper case in GLTF: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#alpha-coverage\n // But it is in lower case in I3S: https://github.com/Esri/i3s-spec/blob/master/docs/1.7/materialDefinitions.cmn.md\n alphaMode: convertAlphaMode(sourceMaterial.alphaMode),\n pbrMetallicRoughness: {\n roughnessFactor:\n sourceMaterial?.pbrMetallicRoughness?.roughnessFactor || DEFAULT_ROUGHNESS_FACTOR,\n metallicFactor:\n sourceMaterial?.pbrMetallicRoughness?.metallicFactor || DEFAULT_METALLIC_FACTOR\n }\n };\n\n let texture;\n if (sourceMaterial?.pbrMetallicRoughness?.baseColorTexture) {\n texture = sourceMaterial.pbrMetallicRoughness.baseColorTexture.texture.source;\n material.pbrMetallicRoughness.baseColorTexture = {\n textureSetDefinitionId: 0\n };\n } else if (sourceMaterial.emissiveTexture) {\n texture = sourceMaterial.emissiveTexture.texture.source;\n // ArcGIS webscene doesn't show emissiveTexture but shows baseColorTexture\n material.pbrMetallicRoughness.baseColorTexture = {\n textureSetDefinitionId: 0\n };\n }\n\n sourceMaterial.id = Number.isFinite(sourceMaterial.id) ? sourceMaterial.id : uuidv4();\n let mergedMaterials: MergedMaterial[] = [{originalMaterialId: sourceMaterial.id}];\n if (!texture) {\n // Should use default baseColorFactor if it is not present in source material\n // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#reference-pbrmetallicroughness\n const baseColorFactor = sourceMaterial?.pbrMetallicRoughness?.baseColorFactor;\n material.pbrMetallicRoughness.baseColorFactor =\n ((baseColorFactor && baseColorFactor.map((c) => Math.round(c * 255))) as [\n number,\n number,\n number,\n number\n ]) || undefined;\n } else {\n mergedMaterials[0].textureSize = {width: texture.image.width, height: texture.image.height};\n }\n\n return {material, texture, mergedMaterials};\n}\n\n/**\n * Converts from `alphaMode` material property from GLTF to I3S format\n * @param gltfAlphaMode glTF material `alphaMode` property\n * @returns I3SMaterialDefinition.alphaMode property\n */\nfunction convertAlphaMode(\n gltfAlphaMode?: 'OPAQUE' | 'MASK' | 'BLEND' | string\n): 'opaque' | 'mask' | 'blend' {\n switch (gltfAlphaMode) {\n case 'OPAQUE':\n return 'opaque';\n case 'MASK':\n return 'mask';\n case 'BLEND':\n return 'blend';\n default:\n return 'opaque';\n }\n}\n\n/**\n * Form default I3SMaterialDefinition\n * @returns I3S material definition\n */\nfunction getDefaultMaterial(): I3SMaterialDefinition {\n return {\n alphaMode: 'opaque',\n pbrMetallicRoughness: {\n metallicFactor: 1,\n roughnessFactor: 1\n }\n };\n}\n\n/**\n * Form \"sharedResources\" from gltf materials array\n * @param gltfMaterials - GLTF materials array\n * @param nodeId - I3S node ID\n * @returns {materialDefinitionInfos: Object[], textureDefinitionInfos: Object[]} -\n * 2 arrays in format of i3s sharedResources data https://github.com/Esri/i3s-spec/blob/master/docs/1.7/sharedResource.cmn.md\n */\nfunction getSharedResources(\n gltfMaterials: GLTFMaterialPostprocessed[],\n nodeId: number\n): SharedResourcesArrays {\n const i3sResources: SharedResourcesArrays = {};\n\n if (!gltfMaterials || !gltfMaterials.length) {\n return i3sResources;\n }\n\n i3sResources.materialDefinitionInfos = [];\n for (const gltfMaterial of gltfMaterials) {\n const {materialDefinitionInfo, textureDefinitionInfo} = convertGLTFMaterialToI3sSharedResources(\n gltfMaterial,\n nodeId\n );\n i3sResources.materialDefinitionInfos.push(materialDefinitionInfo);\n if (textureDefinitionInfo) {\n i3sResources.textureDefinitionInfos = i3sResources.textureDefinitionInfos || [];\n i3sResources.textureDefinitionInfos.push(textureDefinitionInfo);\n }\n }\n return i3sResources;\n}\n\n/**\n * Convert gltf material into I3S sharedResources data\n * @param gltfMaterial - gltf material data\n * @param nodeId - I3S node ID\n * @returns - Couple {materialDefinitionInfo, textureDefinitionInfo} extracted from gltf material data\n */\nfunction convertGLTFMaterialToI3sSharedResources(\n gltfMaterial: GLTFMaterialPostprocessed,\n nodeId: number\n): {\n materialDefinitionInfo: MaterialDefinitionInfo;\n textureDefinitionInfo: TextureDefinitionInfo | null;\n} {\n const texture =\n gltfMaterial?.pbrMetallicRoughness?.baseColorTexture || gltfMaterial.emissiveTexture;\n let textureDefinitionInfo: TextureDefinitionInfo | null = null;\n if (texture) {\n textureDefinitionInfo = extractSharedResourcesTextureInfo(texture.texture, nodeId);\n }\n const {baseColorFactor, metallicFactor} = gltfMaterial?.pbrMetallicRoughness || {};\n let colorFactor = baseColorFactor;\n // If alpha channel is 0 try to get emissive factor from gltf material.\n if ((!baseColorFactor || baseColorFactor[3] === 0) && gltfMaterial.emissiveFactor) {\n colorFactor = gltfMaterial.emissiveFactor;\n colorFactor[3] = colorFactor[3] || 1;\n }\n\n return {\n materialDefinitionInfo: extractSharedResourcesMaterialInfo(\n colorFactor || [1, 1, 1, 1],\n metallicFactor\n ),\n textureDefinitionInfo\n };\n}\n\n/**\n * Form \"materialDefinition\" which is part of \"sharedResouces\"\n * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#materials\n * See formulas in appendix \"Appendix B: BRDF Implementation\":\n * const dielectricSpecular = rgb(0.04, 0.04, 0.04)\n * const black = rgb(0, 0, 0)\n * cdiff = lerp(baseColor.rgb * (1 - dielectricSpecular.r), black, metallic)\n * F0 = lerp(dieletricSpecular, baseColor.rgb, metallic)\n *\n * Assumption: F0 - specular in i3s (\"specular reflection\" <-> \"reflectance value at normal incidence\")\n * cdiff - diffuse in i3s (\"Diffuse color\" <-> \"'c' diffuse\" (c means color?))\n * @param baseColorFactor - RGBA color in 0..1 format\n * @param metallicFactor - \"metallicFactor\" attribute of gltf material object\n * @returns material definition info for I3S shared resource\n */\nfunction extractSharedResourcesMaterialInfo(\n baseColorFactor: number[],\n metallicFactor: number = 1\n): MaterialDefinitionInfo {\n const matDielectricColorComponent = 0.04 / 255; // Color from rgb (255) to 0..1 resolution\n // All color resolutions are 0..1\n const black = new Vector4(0, 0, 0, 1);\n const unitVector = new Vector4(1, 1, 1, 1);\n const dielectricSpecular = new Vector4(\n matDielectricColorComponent,\n matDielectricColorComponent,\n matDielectricColorComponent,\n 0\n );\n const baseColorVector = new Vector4(baseColorFactor);\n // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material\n // Formulas for Cdiff & F0\n const firstOperand = unitVector.subtract(dielectricSpecular).multiply(baseColorVector);\n const diffuse = firstOperand.lerp(firstOperand, black, metallicFactor);\n dielectricSpecular[3] = 1;\n const specular = dielectricSpecular.lerp(dielectricSpecular, baseColorVector, metallicFactor);\n return {\n params: {\n // @ts-expect-error NumericArray\n diffuse: diffuse.toArray(),\n // @ts-expect-error NumericArray\n specular: specular.toArray(),\n renderMode: 'solid'\n }\n };\n}\n\n/**\n * Form \"textureDefinition\" which is part of \"sharedResouces\"\n * @param texture - texture image info\n * @param nodeId - I3S node ID\n * @returns texture definition infor for shared resource\n */\nfunction extractSharedResourcesTextureInfo(\n texture: GLTFTexturePostprocessed,\n nodeId: number\n): TextureDefinitionInfo {\n return {\n encoding: texture?.source?.mimeType ? [texture.source.mimeType] : undefined,\n images: [\n {\n // 'i3s' has just size which is width of the image. Images are supposed to be square.\n // https://github.com/Esri/i3s-spec/blob/master/docs/1.7/image.cmn.md\n id: generateImageId(texture, nodeId),\n size: texture.source?.image.width,\n length: texture.source?.image.data.length ? [texture.source?.image.data.length] : undefined\n }\n ]\n };\n}\n\n/**\n * Formula for calculating imageId:\n * https://github.com/Esri/i3s-spec/blob/0a6366a9249b831db8436c322f8d27521e86cf07/format/Indexed%203d%20Scene%20Layer%20Format%20Specification.md#generating-image-ids\n * @param texture - texture image info\n * @param nodeId - I3S node ID\n * @returns calculate image ID according to the spec\n */\nfunction generateImageId(texture: GLTFTexturePostprocessed, nodeId: number) {\n const {width, height} = texture.source?.image || {};\n if (!width || !height) {\n return '';\n }\n const levelCountOfTexture = 1;\n const indexOfLevel = 0;\n const indexOfTextureInStore = nodeId + 1;\n\n const zerosCount = 32 - indexOfTextureInStore.toString(2).length;\n const rightHalf = '0'.repeat(zerosCount).concat(indexOfTextureInStore.toString(2));\n\n const shiftedLevelCountOfTexture = levelCountOfTexture << 28;\n const shiftedIndexOfLevel = indexOfLevel << 24;\n const shiftedWidth = (width - 1) << 12;\n const shiftedHeight = (height - 1) << 0;\n\n const leftHalf = shiftedLevelCountOfTexture + shiftedIndexOfLevel + shiftedWidth + shiftedHeight;\n const imageId = BigInt(`0b${leftHalf.toString(2)}${rightHalf}`);\n return imageId.toString();\n}\n\n/**\n * Make all feature ids unique through all nodes in layout.\n * @param featureIds\n * @param featureIndices\n * @param featuresHashArray\n * @param batchTable\n * @returns propertyTable indices to map featureIds\n */\nfunction makeFeatureIdsUnique(\n featureIds: number[],\n featureIndices: number[],\n featuresHashArray: string[],\n batchTable: {[key: string]: any}\n): Record<string, number> {\n const replaceMap = getFeaturesReplaceMap(featureIds, batchTable, featuresHashArray);\n replaceIndicesByUnique(featureIndices, replaceMap);\n replaceIndicesByUnique(featureIds, replaceMap);\n return replaceMap;\n}\n\n/**\n * Generate replace map to make featureIds unique.\n * @param featureIds\n * @param batchTable\n * @param featuresHashArray\n * @returns\n */\nfunction getFeaturesReplaceMap(\n featureIds: any[],\n batchTable: object,\n featuresHashArray: any[]\n): Record<string, number> {\n const featureMap: Record<string, number> = {};\n\n for (let index = 0; index < featureIds.length; index++) {\n const oldFeatureId = featureIds[index];\n const uniqueFeatureId = getOrCreateUniqueFeatureId(index, batchTable, featuresHashArray);\n featureMap[oldFeatureId.toString()] = uniqueFeatureId;\n }\n\n return featureMap;\n}\n\n/**\n * Generates string for unique batch id creation.\n * @param batchTable\n * @param index\n * @returns\n */\nfunction generateStringFromBatchTableByIndex(batchTable: object, index: number): string {\n let str = '';\n for (const key in batchTable) {\n str += batchTable[key][index];\n }\n return str;\n}\n\n/**\n * Return already exited featureId or creates and returns new to support unique feature ids throw nodes.\n * @param index\n * @param batchTable\n * @param featuresHashArray\n * @returns\n */\nfunction getOrCreateUniqueFeatureId(\n index: number,\n batchTable: object,\n featuresHashArray: any[]\n): number {\n const batchTableStr = generateStringFromBatchTableByIndex(batchTable, index);\n const hash = md5(batchTableStr);\n\n if (featuresHashArray.includes(hash)) {\n return featuresHashArray.indexOf(hash);\n }\n return featuresHashArray.push(hash) - 1;\n}\n\n/**\n * Do replacement of indices for making them unique through all nodes.\n * @param indicesArray\n * @param featureMap\n * @returns\n */\nfunction replaceIndicesByUnique(indicesArray: number[], featureMap: Record<string, number>) {\n for (let index = 0; index < indicesArray.length; index++) {\n indicesArray[index] = featureMap[indicesArray[index]];\n }\n}\n\n/**\n * Convert property table data to attribute buffers.\n * @param featureIds\n * @param propertyTable - table with metadata for particular feature.\n * @param attributeStorageInfo\n * @returns - Array of file buffers.\n */\nfunction convertPropertyTableToAttributeBuffers(\n featureIds: number[],\n featureIdsMap: Record<string, number>,\n propertyTable: FeatureTableJson,\n attributeStorageInfo: AttributeStorageInfo[]\n): any[] {\n const attributeBuffers: ArrayBuffer[] = [];\n\n const needFlattenPropertyTable = checkPropertiesLength(featureIds, propertyTable);\n const properties = needFlattenPropertyTable\n ? flattenPropertyTableByFeatureIds(featureIdsMap, propertyTable)\n : propertyTable;\n\n const propertyTableWithObjectIds = {\n OBJECTID: featureIds,\n ...properties\n };\n\n for (const propertyName in propertyTableWithObjectIds) {\n const type = getAttributeType(propertyName, attributeStorageInfo);\n if (type) {\n const value = propertyTableWithObjectIds[propertyName];\n const attributeBuffer = generateAttributeBuffer(type, value);\n\n attributeBuffers.push(attributeBuffer);\n }\n }\n\n return attributeBuffers;\n}\n\n/**\n * Generates attribute buffer based on attribute type\n * @param type\n * @param value\n */\nfunction generateAttributeBuffer(type: string, value: any): ArrayBuffer {\n let attributeBuffer: ArrayBuffer;\n\n switch (type) {\n case OBJECT_ID_TYPE:\n case SHORT_INT_TYPE:\n attributeBuffer = generateShortIntegerAttributeBuffer(value);\n break;\n case DOUBLE_TYPE:\n attributeBuffer = generateDoubleAttributeBuffer(value);\n break;\n case STRING_TYPE:\n attributeBuffer = generateStringAttributeBuffer(value);\n break;\n default:\n attributeBuffer = generateStringAttributeBuffer(value);\n }\n\n return attributeBuffer;\n}\n\n/**\n * Return attribute type.\n * @param key\n * @param attributeStorageInfo\n * @returns attribute type.\n */\nfunction getAttributeType(key: string, attributeStorageInfo: any[]): string {\n const attribute = attributeStorageInfo.find((attr) => attr.name === key);\n if (!attribute) {\n console.error(\n `attribute is null, key=${key}, attributeStorageInfo=${JSON.stringify(\n attributeStorageInfo,\n null,\n 2\n )}`\n );\n return '';\n }\n if (!attribute.attributeValues) {\n console.error(`attributeValues is null, attribute=${attribute}`);\n return '';\n }\n return attribute.attributeValues.valueType;\n}\n\n/**\n * Convert short integer to attribute arrayBuffer.\n * @param featureIds\n * @returns - Buffer with objectId data.\n */\nfunction generateShortIntegerAttributeBuffer(featureIds: any[]): ArrayBuffer {\n const count = new Uint32Array([featureIds.length]);\n const valuesArray = new Uint32Array(featureIds);\n return concatenateArrayBuffers(count.buffer, valuesArray.buffer);\n}\n\n/**\n * Convert double to attribute arrayBuffer.\n * @param featureIds\n * @returns - Buffer with objectId data.\n */\nfunction generateDoubleAttributeBuffer(featureIds: any[]): ArrayBuffer {\n const count = new Uint32Array([featureIds.length]);\n const padding = new Uint8Array(4);\n const valuesArray = new Float64Array(featureIds);\n\n return concatenateArrayBuffers(count.buffer, padding.buffer, valuesArray.buffer);\n}\n\n/**\n * Convert batch table attributes to array buffer with batch table data.\n * @param batchAttributes\n * @returns - Buffer with batch table data.\n */\nfunction generateStringAttributeBuffer(batchAttributes: any[]): ArrayBuffer {\n const stringCountArray = new Uint32Array([batchAttributes.length]);\n let totalNumberOfBytes = 0;\n const stringSizesArray = new Uint32Array(batchAttributes.length);\n const stringBufferArray: ArrayBuffer[] = [];\n\n for (let index = 0; index < batchAttributes.length; index++) {\n const currentString = `${String(batchAttributes[index])}\\0`;\n const currentStringBuffer = Buffer.from(currentString);\n const currentStringSize = currentStringBuffer.length;\n totalNumberOfBytes += currentStringSize;\n stringSizesArray[index] = currentStringSize;\n stringBufferArray.push(currentStringBuffer);\n }\n\n const totalBytes = new Uint32Array([totalNumberOfBytes]);\n\n return concatenateArrayBuffers(\n stringCountArray.buffer,\n totalBytes.buffer,\n stringSizesArray.buffer,\n ...stringBufferArray\n );\n}\n\n/**\n * Convert featureIds to BigUint64Array.\n * @param featureIds\n * @returns - Array of feature ids in BigUint64 format.\n */\nfunction generateBigUint64Array(featureIds: any[]): BigUint64Array {\n const typedFeatureIds = new BigUint64Array(featureIds.length);\n for (let index = 0; index < featureIds.length; index++) {\n typedFeatureIds[index] = BigInt(featureIds[index]);\n }\n return typedFeatureIds;\n}\n\n/**\n * Generates draco compressed geometry\n * @param vertexCount\n * @param convertedAttributes - get rid of this argument here\n * @param attributes - geometry attributes to compress\n * @param libraries - dynamicaly loaded 3rd-party libraries\n * @returns - Compressed geometry.\n */\nasync function generateCompressedGeometry(\n vertexCount: number,\n convertedAttributes: Record<string, any>,\n attributes: Record<string, any>,\n libraries: Record<string, string>\n): Promise<ArrayBuffer> {\n const {positions, normals, texCoords, colors, uvRegions, featureIds, faceRange} = attributes;\n const indices = new Uint32Array(vertexCount);\n\n for (let index = 0; index < indices.length; index++) {\n indices.set([index], index);\n }\n\n const featureIndices = new Uint32Array(\n convertedAttributes.featureIndices.length ? convertedAttributes.featureIndices : vertexCount\n );\n\n const featureIndex = generateFeatureIndexAttribute(featureIndices, faceRange);\n\n const compressedAttributes: {\n positions: TypedArray;\n normals: TypedArray;\n colors: TypedArray;\n 'feature-index': TypedArray;\n texCoords?: TypedArray;\n 'uv-region'?: TypedArray;\n } = {\n positions,\n normals,\n colors,\n 'feature-index': featureIndex\n };\n\n if (texCoords.length) {\n compressedAttributes.texCoords = texCoords;\n }\n\n const attributesMetadata = {\n 'feature-index': {\n 'i3s-attribute-type': 'feature-index',\n 'i3s-feature-ids': new Int32Array(featureIds)\n }\n };\n\n if (uvRegions.length) {\n compressedAttributes['uv-region'] = uvRegions;\n attributesMetadata['uv-region'] = {\n 'i3s-attribute-type': 'uv-region'\n };\n }\n\n return encode({attributes: compressedAttributes, indices}, DracoWriterWorker, {\n ...DracoWriterWorker.options,\n reuseWorkers: true,\n _nodeWorkers: true,\n modules: libraries,\n useLocalLibraries: true,\n draco: {\n method: 'MESH_SEQUENTIAL_ENCODING',\n attributesMetadata\n },\n ['draco-writer']: {\n // We need to load local fs workers because nodejs can't load workers from the Internet\n workerUrl: './modules/draco/dist/draco-writer-worker-node.js'\n }\n });\n}\n\n/**\n * Generates ordered feature indices based on face range\n * @param featureIndex\n * @param faceRange\n * @returns\n */\nfunction generateFeatureIndexAttribute(\n featureIndex: Uint32Array,\n faceRange: Uint32Array\n): Uint32Array {\n const orderedFeatureIndices = new Uint32Array(featureIndex.length);\n let fillIndex = 0;\n let startIndex = 0;\n\n for (let index = 1; index < faceRange.length; index += 2) {\n const endIndex = (faceRange[index] + 1) * VALUES_PER_VERTEX;\n\n orderedFeatureIndices.fill(fillIndex, startIndex, endIndex);\n\n fillIndex++;\n startIndex = endIndex + 1;\n }\n\n return orderedFeatureIndices;\n}\n\n/**\n * Find property table in tile\n * For example it can be batchTable for b3dm files or property table in gLTF extension.\n * @param tileContent - 3DTiles tile content\n * @param metadataClass - user selected feature metadata class name\n * @return batch table from b3dm / feature properties from EXT_FEATURE_METADATA or EXT_STRUCTURAL_METADATA.\n */\nexport function getPropertyTable(\n tileContent: Tiles3DTileContent | null,\n metadataClass?: string\n): FeatureTableJson | null {\n if (!tileContent) {\n return null;\n }\n let propertyTable: FeatureTableJson | null;\n const batchTableJson = tileContent.batchTableJson;\n\n if (batchTableJson) {\n return batchTableJson;\n }\n\n const {extensionName, extension} = getPropertyTableExtension(tileContent);\n\n switch (extensionName) {\n case EXT_STRUCTURAL_METADATA: {\n propertyTable = getPropertyTableFromExtStructuralMetadata(\n extension as GLTF_EXT_structural_metadata_GLTF,\n metadataClass\n );\n return propertyTable;\n }\n case EXT_FEATURE_METADATA: {\n propertyTable = getPropertyTableFromExtFeatureMetadata(\n extension as GLTF_EXT_feature_metadata_GLTF,\n metadataClass\n );\n return propertyTable;\n }\n default:\n return null;\n }\n}\n\n/**\n * Check extensions which can be with property table inside.\n * @param tileContent - 3DTiles tile content\n */\nfunction getPropertyTableExtension(tileContent: Tiles3DTileContent): {\n extensionName: null | string;\n extension: string | GLTF_EXT_feature_metadata_GLTF | GLTF_EXT_structural_metadata_GLTF | null;\n} {\n const extensionsWithPropertyTables = [EXT_FEATURE_METADATA, EXT_STRUCTURAL_METADATA];\n const extensionsUsed = tileContent?.gltf?.extensionsUsed;\n\n if (!extensionsUsed) {\n return {extensionName: null, extension: null};\n }\n\n let extensionName: string = '';\n for (const extensionItem of tileContent?.gltf?.extensionsUsed || []) {\n if (extensionsWithPropertyTables.includes(extensionItem)) {\n extensionName = extensionItem;\n /*\n It returns the first extension containing the property table.\n We assume that there can be only one extension containing the property table:\n either EXT_FEATURE_METADATA, which is a depricated extension,\n or EXT_STRUCTURAL_METADATA.\n */\n break;\n }\n }\n\n if (!extensionName) {\n return {extensionName: null, extension: null};\n }\n\n const extension = tileContent?.gltf?.extensions?.[extensionName] as\n | string // EXT_mesh_features doesn't have global metadata\n | GLTF_EXT_feature_metadata_GLTF\n | GLTF_EXT_structural_metadata_GLTF;\n\n return {extensionName, extension};\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"gltf-attributes.js","names":["Matrix4","Vector3","Ellipsoid","prepareDataForAttributesConversion","tileContent","tileTransform","boundingVolume","_tileContent$gltf","_tileContent$gltf$sce","_tileContent$gltf2","_tileContent$gltf2$sc","_tileContent$gltf2$sc2","_tileContent$gltf3","_tileContent$gltf4","_tileContent$gltf4$im","nodes","gltf","scene","scenes","images","map","imageObject","_imageObject$image","image","compressed","_imageObject$image2","data","dataCopy","Uint8Array","length","set","height","width","components","mimeType","prepareNodes","cartographicOrigin","modelMatrix","cartesianModelMatrix","calculateTransformProps","getB3DMAttributesWithoutBufferView","attributes","attributesWithoutBufferView","attributeName","value","rtcCenter","gltfUpAxis","center","translate","rotationY","rotateX","Math","PI","multiplyRight","rotationX","rotateY","cartesianOrigin","WGS84","cartesianToCartographic","index","node","mesh","_node$mesh","primitives","primitive","_primitive$indices","_primitive$material","_primitive$material2","indices","material","id","uniqueId","children"],"sources":["../../../../src/i3s-converter/helpers/gltf-attributes.ts"],"sourcesContent":["import type {Tiles3DTileContent} from '@loaders.gl/3d-tiles';\nimport type {GLTFAccessorPostprocessed, GLTFNodePostprocessed} from '@loaders.gl/gltf';\nimport {Matrix4, TypedArray, Vector3} from '@math.gl/core';\nimport {BoundingSphere, OrientedBoundingBox} from '@math.gl/culling';\nimport {Ellipsoid} from '@math.gl/geospatial';\nimport {GLTFAttributesData} from '../types';\n\n/**\n * Prepare attributes for conversion to avoid binary data breaking in worker thread.\n * @param tileContent - 3DTiles tile content\n * @param tileTransform - transformation matrix of the tile, calculated recursively multiplying\n * transform of all parent tiles and transform of the current tile\n * @param boundingVolume - initialized bounding volume of the source tile\n * @returns 3DTiles content data, prepared for conversion\n */\nexport function prepareDataForAttributesConversion(\n tileContent: Tiles3DTileContent,\n tileTransform: Matrix4,\n boundingVolume: OrientedBoundingBox | BoundingSphere\n): GLTFAttributesData {\n let nodes =\n tileContent.gltf?.scene?.nodes ||\n tileContent.gltf?.scenes?.[0]?.nodes ||\n tileContent.gltf?.nodes ||\n [];\n\n const images =\n tileContent.gltf?.images?.map((imageObject) => {\n // Need data only for uncompressed images because we can't get batchIds from compressed textures.\n if (imageObject?.image?.compressed) {\n return null;\n } else {\n const data = imageObject?.image?.data;\n const dataCopy = new Uint8Array(data.length);\n dataCopy.set(data);\n return {\n data: dataCopy,\n compressed: false,\n height: imageObject.image.height,\n width: imageObject.image.width,\n components: imageObject.image.components,\n mimeType: imageObject.mimeType\n };\n }\n }) || [];\n\n prepareNodes(nodes);\n\n const {cartographicOrigin, modelMatrix: cartesianModelMatrix} = calculateTransformProps(\n tileContent,\n tileTransform,\n boundingVolume\n );\n\n return {\n nodes,\n images,\n cartographicOrigin,\n cartesianModelMatrix\n };\n}\n\n/**\n * Keep only values for glTF attributes to pass data to worker thread.\n * @param attributes - geometry attributes\n * @returns attributes with only `value` item\n */\nfunction getB3DMAttributesWithoutBufferView(\n attributes: Record<string, GLTFAccessorPostprocessed>\n): Record<string, {value: TypedArray}> {\n const attributesWithoutBufferView: Record<string, {value: TypedArray}> = {};\n\n for (const attributeName in attributes) {\n attributesWithoutBufferView[attributeName] = {\n value: attributes[attributeName].value\n };\n }\n\n return attributesWithoutBufferView;\n}\n\n/**\n * Calculate transformation properties to transform vertex attributes (POSITION, NORMAL, etc.)\n * from METER_OFFSET coorditantes to LNGLAT_OFFSET coordinates\n * @param tileContent - 3DTiles tile content\n * @param tileTransform - transformation matrix of the tile, calculated recursively multiplying\n * transform of all parent tiles and transform of the current tile\n * @param boundingVolume - initialized bounding volume of the source tile\n * @returns modelMatrix - transformation matrix to transform coordinates to cartographic coordinates\n * cartographicOrigin - tile origin coordinates to calculate offsets\n */\nexport function calculateTransformProps(\n tileContent: Tiles3DTileContent,\n tileTransform: Matrix4,\n boundingVolume: OrientedBoundingBox | BoundingSphere\n): {modelMatrix: Matrix4; cartographicOrigin: Vector3} {\n const {rtcCenter, gltfUpAxis} = tileContent;\n const {center} = boundingVolume;\n\n let modelMatrix = new Matrix4(tileTransform);\n\n // Translate if appropriate\n if (rtcCenter) {\n modelMatrix.translate(rtcCenter);\n }\n\n // glTF models need to be rotated from Y to Z up\n // https://github.com/AnalyticalGraphicsInc/3d-tiles/tree/master/specification#y-up-to-z-up\n switch (gltfUpAxis) {\n case 'Z':\n break;\n case 'Y':\n const rotationY = new Matrix4().rotateX(Math.PI / 2);\n modelMatrix = modelMatrix.multiplyRight(rotationY);\n break;\n case 'X':\n const rotationX = new Matrix4().rotateY(-Math.PI / 2);\n modelMatrix = modelMatrix.multiplyRight(rotationX);\n break;\n default:\n break;\n }\n\n const cartesianOrigin = new Vector3(center);\n const cartographicOrigin = Ellipsoid.WGS84.cartesianToCartographic(\n cartesianOrigin,\n new Vector3()\n );\n return {modelMatrix, cartographicOrigin};\n}\n\n/**\n * Traverse all nodes to replace all sensible data with copy to avoid data corruption in worker.\n * @param nodes\n */\nfunction prepareNodes(nodes: GLTFNodePostprocessed[]): void {\n for (let index = 0; index < nodes.length; index++) {\n const node = nodes[index] as any;\n\n if (node.mesh) {\n nodes[index] = {\n ...node,\n mesh: {\n ...node.mesh,\n primitives: node.mesh?.primitives.map((primitive) => ({\n ...primitive,\n indices: {value: primitive?.indices?.value},\n attributes: getB3DMAttributesWithoutBufferView(primitive.attributes),\n material: {\n id: primitive?.material?.id,\n uniqueId: primitive?.material?.uniqueId\n }\n }))\n }\n };\n }\n\n if (node.children) {\n prepareNodes(node.children);\n }\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
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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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"node-debug.js","names":["OrientedBoundingBox","BoundingSphere","Vector3","Ellipsoid","CUBE_POSITIONS","Float32Array","validateNodeBoundingVolumes","node","_node$parentNode","_node$parentNode2","parentNode","obb","mbs","tileWarnings","validateObb","validateMbs","_node$parentNode3","parentObb","createBoundingBoxFromTileObb","tileVertices","getTileObbVertices","isTileObbInsideParentObb","isAllVerticesInsideBoundingVolume","title","concat","id","push","tileMbs","createBoundingSphereFromTileMbs","parentMbs","distanceBetweenCenters","center","distanceTo","radius","_node$parentNode4","halfSize","quaternion","fromCenterHalfSizeQuaternion","positions","obbCenterCartesian","WGS84","cartographicToCartesian","vertices","i","length","positionsVector","rotatedPositions","transformByQuaternion","add","boundingVolume","isVerticesInsideObb","index","point","cartographicPoint","cartesianToCartographic","distance"],"sources":["../../../../src/i3s-converter/helpers/node-debug.ts"],"sourcesContent":["import type {Mbs, Node3DIndexDocument, Obb} from '@loaders.gl/i3s';\nimport {OrientedBoundingBox, BoundingSphere} from '@math.gl/culling';\nimport {Vector3} from '@math.gl/core';\nimport {Ellipsoid} from '@math.gl/geospatial';\n\n// prettier-ignore\nconst CUBE_POSITIONS = new Float32Array([\n -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1,\n -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, -1,\n -1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1,\n -1, -1, -1, 1, -1, -1, 1, -1, 1, -1, -1, 1,\n 1, -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1,\n -1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1\n]);\n\n// TODO Unite Tile validation logic in i3s-17-and-debug with this code.\n\n/**\n * Do validation of bounding volumes for particular node.\n * Generates special warnings if there are some issues.\n * @param node\n */\nexport function validateNodeBoundingVolumes(node: Node3DIndexDocument): string[] {\n if (!node?.parentNode?.obb || !node?.parentNode?.mbs) {\n return [];\n }\n\n const tileWarnings: string[] = [];\n\n validateObb(tileWarnings, node);\n validateMbs(tileWarnings, node);\n\n return tileWarnings;\n}\n\n/**\n * Check if child Obb fit into parent Obb.\n * @param tileWarnings\n * @param node\n */\nfunction validateObb(tileWarnings: string[], node: Node3DIndexDocument): void {\n // @ts-expect-error\n const parentObb = createBoundingBoxFromTileObb(node.parentNode.obb);\n const tileVertices = getTileObbVertices(node);\n const isTileObbInsideParentObb = isAllVerticesInsideBoundingVolume(parentObb, tileVertices);\n\n if (isTileObbInsideParentObb) {\n return;\n }\n\n const title = `OBB of Tile (${node.id}) doesn't fit into Parent (${node.parentNode?.id}) tile OBB`;\n tileWarnings.push(title);\n}\n\n/**\n * Check if child Mbs fit into parent Mbs.\n * @param tileWarnings\n * @param node\n */\nfunction validateMbs(tileWarnings: string[], node: Node3DIndexDocument): void {\n // @ts-expect-error\n const tileMbs = createBoundingSphereFromTileMbs(node.mbs);\n // @ts-expect-error\n const parentMbs = createBoundingSphereFromTileMbs(node.parentNode.mbs);\n const distanceBetweenCenters = tileMbs.center.distanceTo(parentMbs.center);\n\n if (distanceBetweenCenters + tileMbs.radius > parentMbs.radius) {\n const title = `MBS of Tile (${node.id}) doesn't fit into Parent (${node.parentNode?.id}) tile MBS`;\n tileWarnings.push(title);\n }\n}\n\n/**\n * Generates bounding sphere from mbs\n * @param mbs\n */\nfunction createBoundingSphereFromTileMbs(mbs: Mbs): BoundingSphere {\n return new BoundingSphere([mbs[0], mbs[1], mbs[2]], mbs[3]);\n}\n\n/**\n * Generates oriented bounding box from tile obb\n * @param obb\n * @returns\n */\nfunction createBoundingBoxFromTileObb(obb: Obb): OrientedBoundingBox {\n const {center, halfSize, quaternion} = obb;\n return new OrientedBoundingBox().fromCenterHalfSizeQuaternion(center, halfSize, quaternion);\n}\n\n/**\n * Get vertices fromnode obb\n * TODO check if Obb generates properly\n * @param node\n */\nfunction getTileObbVertices(node: Node3DIndexDocument): number[] {\n // @ts-expect-error\n const halfSize = node.obb.halfSize;\n const positions = CUBE_POSITIONS;\n // @ts-expect-error\n const obbCenterCartesian = Ellipsoid.WGS84.cartographicToCartesian(node.obb.center);\n\n let vertices = [];\n\n for (let i = 0; i < positions.length; i += 3) {\n const positionsVector = new Vector3(\n (positions[i] *= halfSize[0]),\n (positions[i + 1] *= halfSize[1]),\n (positions[i + 2] *= halfSize[2])\n );\n const rotatedPositions = positionsVector\n // @ts-expect-error\n .transformByQuaternion(node.obb.quaternion)\n .add(obbCenterCartesian);\n // @ts-expect-error\n vertices = vertices.concat(rotatedPositions);\n }\n\n return vertices;\n}\n\n/**\n * Check if all vertices inside bounding volume\n * @param boundingVolume\n * @param positions\n */\nfunction isAllVerticesInsideBoundingVolume(\n boundingVolume: OrientedBoundingBox,\n positions: number[]\n): boolean {\n let isVerticesInsideObb = true;\n\n for (let index = 0; index < positions.length / 3; index += 3) {\n const point = [positions[index], positions[index + 1], positions[index + 2]];\n const cartographicPoint = Ellipsoid.WGS84.cartesianToCartographic(point);\n\n const distance = boundingVolume.distanceTo(cartographicPoint);\n\n if (distance > 0) {\n isVerticesInsideObb = false;\n break;\n }\n }\n\n return isVerticesInsideObb;\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
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 +0,0 @@
1
- {"version":3,"file":"node-pages.js","names":["join","transform","METADATA","metadataTemplate","isFileExists","openJson","NodePages","constructor","writeFileFunc","nodesPerPage","converter","_defineProperty","nodesCounter","nodePages","nodes","writeFile","length","useWriteFunction","func","getNodePageFileName","nodePageId","filePath","fileName","options","slpk","layers0Path","concat","toString","loadNodePage","fullName","console","log","getPageIndexByNodeId","id","Math","floor","getPageByNodeId","pageIndex","instantNodeWriting","getNodeById","nodePage","nodeIndex","addChildRelation","parentId","childId","_parentNode$children","undefined","parentNode","children","push","saveNode","node","index","currentNodePage","updateResourceInMesh","nodePageIndex","nodeToUpdate","updateAll","nodePageStr","JSON","stringify","writeQueue","enqueue","archiveKey","writePromise","compressList","saveMetadata","metadata","nodeCount","compress","save","entries","slpkPath","nodePagePath","mesh","isFinite","geometry","resource","data","Object","assign","updateMaterialByNodeId","materialId","material","definition","updateVertexCountByNodeId","vertexCount","updateNodeAttributeByNodeId","attribute","updateFeatureCountByNodeId","featureCount","updateTexelCountHintByNodeId","texelCountHint"],"sources":["../../../../src/i3s-converter/helpers/node-pages.ts"],"sourcesContent":["import {join} from 'path';\nimport transform from 'json-map-transform';\nimport {METADATA as metadataTemplate} from '../json-templates/metadata';\nimport {NodeInPage} from '@loaders.gl/i3s';\nimport {isFileExists, openJson} from '../../lib/utils/file-utils';\nimport I3SConverter from '../i3s-converter';\n\n/**\n * class NodePages - wrapper of nodePages array\n *\n * @example\n * import {writeFile} from './helpers/write-file';\n *\n * // create an instance of the class\n * const nodePages = new NodePages(writeFile, HARDCODED_NODES_PER_PAGE);\n * ...\n * // push root node\n * const parent = await nodePages.push({\n lodThreshold: HARDCODED_MAX_SCREEN_THRESHOLD_SQ,\n obb: coordinates.obb,\n children: []\n });\n * ...\n * // push node with parent relation\n * const nodeInPage = {\n lodThreshold: HARDCODED_MAX_SCREEN_THRESHOLD_SQ,\n obb: coordinates.obb,\n children: [],\n mesh: {\n geometry: {\n definition: 0\n }\n }\n };\n * const node = await this.nodePages.push(nodeInPage, parent.index);\n * ...\n * // save all the nodePages in the end of pushing all the nodes\n * await this.nodePages.save(layers0path);\n */\nexport default class NodePages {\n readonly nodesPerPage: number;\n nodesCounter: number;\n writeFile: (...args) => Promise<null | string>;\n converter: I3SConverter;\n readonly nodePages: {nodes: NodeInPage[]}[];\n readonly length: number = 0;\n\n /**\n * @constructs\n * Create a nodePages instance.\n * @param writeFileFunc - function to save one nodePage into a file\n * @param nodesPerPage - length limit for one nodePage. An additional nodePage is created when this limit is met\n */\n constructor(writeFileFunc, nodesPerPage, converter: I3SConverter) {\n this.nodesPerPage = nodesPerPage;\n this.nodesCounter = 0;\n // @ts-expect-error\n this.nodePages = [{}];\n this.nodePages[0].nodes = [];\n this.writeFile = writeFileFunc;\n this.converter = converter;\n this.length = 0;\n }\n\n /**\n * Setup function to save node pages\n * @param func - function which should be used to save node pages\n */\n useWriteFunction(func: (...args) => Promise<null | string>): void {\n this.writeFile = func;\n }\n\n /**\n * Get file path and file name of the node page with the particular id\n * @param nodePageId - node page id\n * @returns file path and file name\n */\n private getNodePageFileName(nodePageId): {filePath: string; fileName: string} {\n let filePath;\n let fileName;\n if (this.converter.options.slpk) {\n filePath = join(this.converter.layers0Path, 'nodepages');\n fileName = `${nodePageId.toString()}.json`;\n } else {\n filePath = join(this.converter.layers0Path, 'nodepages', nodePageId.toString());\n fileName = 'index.json';\n }\n return {filePath, fileName};\n }\n\n /**\n * Load node page from a file on the disk\n * @param nodePageId - node page id\n * @returns - node page data\n */\n private async loadNodePage(nodePageId: number): Promise<{nodes: NodeInPage[]}> {\n const {filePath, fileName} = this.getNodePageFileName(nodePageId);\n const fullName = join(filePath, fileName);\n if (await isFileExists(fullName)) {\n console.log(`load ${fullName}.`); // eslint-disable-line\n return (await openJson(filePath, fileName)) as {nodes: NodeInPage[]};\n } else {\n return {nodes: []};\n }\n }\n\n /**\n * Get nodepage id by node id\n * @param id node id\n * @returns node page id\n */\n private getPageIndexByNodeId(id: number): number {\n return Math.floor(id / this.nodesPerPage);\n }\n\n /**\n * Get node page data by node id\n * @param id node id\n * @returns node page data\n */\n private async getPageByNodeId(id: number): Promise<{nodes: NodeInPage[]}> {\n const pageIndex = this.getPageIndexByNodeId(id);\n if (this.converter.options.instantNodeWriting) {\n return await this.loadNodePage(pageIndex);\n }\n return this.nodePages[pageIndex];\n }\n\n /**\n * Get the node by its end-to-end index\n * @param id - end-to-end index of the node\n * @return the node object\n */\n async getNodeById(id: number, nodePage?: {nodes: NodeInPage[]}): Promise<NodeInPage> {\n const nodeIndex = id % this.nodesPerPage;\n nodePage = nodePage || (await this.getPageByNodeId(id));\n return nodePage.nodes[nodeIndex];\n }\n\n /**\n * Add a child id into the parent node.children array\n * @param parentId - end-to-end parent node index\n * @param childId - end-to-end child node index\n */\n private async addChildRelation(parentId: number | undefined, childId: number): Promise<void> {\n if (parentId === null || parentId === undefined) {\n return;\n }\n const parentNode = await this.getNodeById(parentId);\n parentNode.children?.push(childId);\n await this.saveNode(parentNode);\n }\n\n /**\n * Put new node in nodePages array\n * @param node - node object\n * @param parentId - index of parent node\n * @return\n */\n async push(node: NodeInPage, parentId?: number): Promise<NodeInPage> {\n node.index = this.nodesCounter++;\n if (!this.converter.options.instantNodeWriting) {\n let currentNodePage = this.nodePages[this.nodePages.length - 1];\n if (currentNodePage.nodes.length === this.nodesPerPage) {\n currentNodePage = {nodes: []};\n this.nodePages.push(currentNodePage);\n }\n currentNodePage.nodes.push(node);\n }\n await this.addChildRelation(parentId, node.index);\n NodePages.updateResourceInMesh(node);\n await this.saveNode(node);\n return node;\n }\n\n /**\n * Save node to the file on the disk\n * @param node - node data\n */\n async saveNode(node: NodeInPage): Promise<void> {\n if (!this.converter.options.instantNodeWriting) {\n return;\n } else {\n const nodePageIndex = this.getPageIndexByNodeId(node.index);\n const nodePage = await this.getPageByNodeId(node.index);\n const {filePath, fileName} = this.getNodePageFileName(nodePageIndex);\n const nodeToUpdate = await this.getNodeById(node.index, nodePage);\n if (nodeToUpdate) {\n NodePages.updateAll(nodeToUpdate, node);\n } else {\n nodePage.nodes.push(node);\n }\n const nodePageStr = JSON.stringify(nodePage);\n if (this.converter.options.slpk) {\n await this.converter.writeQueue.enqueue(\n {\n archiveKey: `nodePages/${nodePageIndex.toString()}.json.gz`,\n writePromise: () =>\n this.writeFile(filePath, nodePageStr, fileName, true, this.converter.compressList)\n },\n true\n );\n } else {\n await this.converter.writeQueue.enqueue(\n {\n writePromise: () => this.writeFile(filePath, nodePageStr)\n },\n true\n );\n }\n }\n }\n\n /**\n * Save metadata file (for slpk only)\n */\n async saveMetadata(): Promise<void> {\n const metadata = transform({nodeCount: this.nodesCounter}, metadataTemplate());\n const compress = false;\n await this.converter.writeQueue.enqueue({\n archiveKey: 'metadata.json',\n writePromise: () =>\n this.writeFile(\n this.converter.layers0Path,\n JSON.stringify(metadata),\n 'metadata.json',\n compress\n )\n });\n }\n\n /**\n * Save all the node pages\n * Run this method when all nodes is pushed in nodePages\n */\n async save(): Promise<void> {\n if (this.converter.options.instantNodeWriting) {\n await this.saveMetadata();\n return;\n }\n if (this.converter.options.slpk) {\n for (const [index, nodePage] of this.nodePages.entries()) {\n const nodePageStr = JSON.stringify(nodePage);\n const slpkPath = join(this.converter.layers0Path, 'nodepages');\n await this.converter.writeQueue.enqueue({\n archiveKey: `nodePages/${index.toString()}.json.gz`,\n writePromise: () => this.writeFile(slpkPath, nodePageStr, `${index.toString()}.json`)\n });\n }\n await this.saveMetadata();\n } else {\n for (const [index, nodePage] of this.nodePages.entries()) {\n const nodePageStr = JSON.stringify(nodePage);\n const nodePagePath = join(this.converter.layers0Path, 'nodepages', index.toString());\n await this.converter.writeQueue.enqueue({\n writePromise: () => this.writeFile(nodePagePath, nodePageStr)\n });\n }\n }\n }\n\n /**\n * Update resource index in node.mesh object\n * @param node - node object\n */\n static updateResourceInMesh(node: NodeInPage): void {\n if (node.mesh && isFinite(node.index)) {\n node.mesh.geometry.resource = node.index;\n }\n }\n\n /**\n * Update all fields in the node excluding id\n * @param node - node object\n * @param data - NodeInPage data to replace original data\n */\n static updateAll(node: NodeInPage, data: NodeInPage): NodeInPage {\n Object.assign(node, data, {index: node.index});\n NodePages.updateResourceInMesh(node);\n return node;\n }\n\n /**\n * Update material in node.mesh object by node id\n * @param id - end-to-end index of the node\n * @param materialId - id from scene layer materialDefinitions\n */\n static updateMaterialByNodeId(node: NodeInPage, materialId: number): void {\n if (!node.mesh) {\n return;\n }\n node.mesh.material = {\n definition: materialId,\n resource: node.index\n };\n }\n\n /**\n * Update vertexCount in node.mesh.geometry object by node id\n * @param id - end-to-end index of the node\n * @param vertexCount - vertex count for particular node\n */\n static updateVertexCountByNodeId(node: NodeInPage, vertexCount: number): void {\n if (!node.mesh) {\n return;\n }\n node.mesh.geometry.vertexCount = vertexCount;\n }\n\n /**\n * Update resource in node.mesh.attribute object by node id\n * @param node - node object\n */\n static updateNodeAttributeByNodeId(node: NodeInPage): void {\n if (!node.mesh || !node.index) {\n return;\n }\n node.mesh.attribute.resource = node.index;\n }\n\n /**\n * Update featureCount in node.mesh.geometry object by node id\n * @param node - node object\n * @param featureCount - features count of the node\n */\n static updateFeatureCountByNodeId(node: NodeInPage, featureCount: number): void {\n if (!node.mesh) {\n return;\n }\n node.mesh.geometry.featureCount = featureCount;\n }\n\n /**\n * Update texelCountHint in node.mesh.material object by node id\n * @param node - node object\n * @param texelCountHint - texelCountHint of particular node\n */\n static updateTexelCountHintByNodeId(node: NodeInPage, texelCountHint: number): void {\n if (!node.mesh || !node.mesh.material) {\n return;\n }\n node.mesh.material.texelCountHint = texelCountHint;\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
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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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tileset-traversal.js","names":["traverseDatasetWith","tile","traversalProps","processTile","postprocessTile","maxDepth","level","arguments","length","undefined","processResults","newTraversalProps","push","childTile","children"],"sources":["../../../../src/i3s-converter/helpers/tileset-traversal.ts"],"sourcesContent":["import {Tiles3DTileJSONPostprocessed} from '@loaders.gl/3d-tiles';\nimport {NodeIndexDocument} from './node-index-document';\nimport {Matrix4} from '@math.gl/core';\n\n/** Traversal props for the conversion stage */\nexport type TraversalConversionProps = {\n /** Transformation matrix for the specific tile */\n transform: Matrix4;\n /** Parent nodes of the converted tile. Multiple nodes can be if one tile is converted to multiple nodes*/\n parentNodes: NodeIndexDocument[];\n};\n\n/**\n * Travesal of 3DTile tiles tree with making specific actions with each tile\n * @param tile - 3DTiles tile JSON metadata\n * @param traversalProps - traversal props used to pass data through recursive calls\n * @param processTile - callback to make some actions with the current tile\n * @param postprocessTile - callback to make some action after processing of the current tile and all the subtree\n * @param maxDepth - max recursive calls number the travesal function will do. If not set, the traversal function will\n * go through all the tree.\n * This value is used to limit the convertion with only partial number of levels of the tileset\n * @param level - counter to keep recursive calls number of the tiles tree. This value used to be able to break\n * traversal at the some level of the tree\n * @returns void\n */\nexport const traverseDatasetWith = async <TProps>(\n tile: Tiles3DTileJSONPostprocessed,\n traversalProps: TProps,\n processTile: (tile: Tiles3DTileJSONPostprocessed, traversalProps: TProps) => Promise<TProps>,\n postprocessTile?: (processResults: TProps[], currentTraversalProps: TProps) => Promise<void>,\n maxDepth?: number,\n level = 0\n): Promise<void> => {\n if (maxDepth && level > maxDepth) {\n return;\n }\n const processResults: TProps[] = [];\n const newTraversalProps: TProps = await processTile(tile, traversalProps);\n processResults.push(newTraversalProps);\n for (const childTile of tile.children) {\n await traverseDatasetWith(\n childTile,\n newTraversalProps,\n processTile,\n postprocessTile,\n maxDepth,\n level + 1\n );\n }\n postprocessTile && (await postprocessTile(processResults, traversalProps));\n};\n"],"mappings":"AAyBA,OAAO,MAAMA,mBAAmB,GAAG,eAAAA,CACjCC,IAAkC,EAClCC,cAAsB,EACtBC,WAA4F,EAC5FC,eAA4F,EAC5FC,QAAiB,EAEC;EAAA,IADlBC,KAAK,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC;EAET,IAAIF,QAAQ,IAAIC,KAAK,GAAGD,QAAQ,EAAE;IAChC;EACF;EACA,MAAMK,cAAwB,GAAG,EAAE;EACnC,MAAMC,iBAAyB,GAAG,MAAMR,WAAW,CAACF,IAAI,EAAEC,cAAc,CAAC;EACzEQ,cAAc,CAACE,IAAI,CAACD,iBAAiB,CAAC;EACtC,KAAK,MAAME,SAAS,IAAIZ,IAAI,CAACa,QAAQ,EAAE;IACrC,MAAMd,mBAAmB,CACvBa,SAAS,EACTF,iBAAiB,EACjBR,WAAW,EACXC,eAAe,EACfC,QAAQ,EACRC,KAAK,GAAG,CACV,CAAC;EACH;EACAF,eAAe,KAAK,MAAMA,eAAe,CAACM,cAAc,EAAER,cAAc,CAAC,CAAC;AAC5E,CAAC"}