@loaders.gl/tile-converter 3.3.0-alpha.1 → 3.3.0-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. package/dist/3d-tiles-attributes-worker.d.ts +3 -3
  2. package/dist/3d-tiles-attributes-worker.d.ts.map +1 -1
  3. package/dist/3d-tiles-attributes-worker.js +2 -3
  4. package/dist/3d-tiles-attributes-worker.js.map +3 -3
  5. package/dist/3d-tiles-converter/3d-tiles-converter.d.ts +8 -0
  6. package/dist/3d-tiles-converter/3d-tiles-converter.d.ts.map +1 -1
  7. package/dist/3d-tiles-converter/3d-tiles-converter.js +57 -43
  8. package/dist/3d-tiles-converter/helpers/b3dm-converter.d.ts +5 -5
  9. package/dist/3d-tiles-converter/helpers/b3dm-converter.d.ts.map +1 -1
  10. package/dist/3d-tiles-converter/helpers/b3dm-converter.js +21 -17
  11. package/dist/converter-cli.js +29 -4
  12. package/dist/converter.min.js +24 -21
  13. package/dist/deps-installer/deps-installer.d.ts +5 -1
  14. package/dist/deps-installer/deps-installer.d.ts.map +1 -1
  15. package/dist/deps-installer/deps-installer.js +29 -1
  16. package/dist/dist.min.js +61034 -64112
  17. package/dist/es5/3d-tiles-attributes-worker.js +4 -7
  18. package/dist/es5/3d-tiles-attributes-worker.js.map +1 -1
  19. package/dist/es5/3d-tiles-converter/3d-tiles-converter.js +125 -210
  20. package/dist/es5/3d-tiles-converter/3d-tiles-converter.js.map +1 -1
  21. package/dist/es5/3d-tiles-converter/helpers/b3dm-converter.js +53 -85
  22. package/dist/es5/3d-tiles-converter/helpers/b3dm-converter.js.map +1 -1
  23. package/dist/es5/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js +0 -8
  24. package/dist/es5/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js.map +1 -1
  25. package/dist/es5/3d-tiles-converter/helpers/texture-atlas.js +0 -5
  26. package/dist/es5/3d-tiles-converter/helpers/texture-atlas.js.map +1 -1
  27. package/dist/es5/3d-tiles-converter/json-templates/tileset.js +0 -6
  28. package/dist/es5/3d-tiles-converter/json-templates/tileset.js.map +1 -1
  29. package/dist/es5/bundle.js +0 -1
  30. package/dist/es5/bundle.js.map +1 -1
  31. package/dist/es5/constants.js.map +1 -1
  32. package/dist/es5/converter-cli.js +25 -58
  33. package/dist/es5/converter-cli.js.map +1 -1
  34. package/dist/es5/deps-installer/deps-installer.js +73 -28
  35. package/dist/es5/deps-installer/deps-installer.js.map +1 -1
  36. package/dist/es5/i3s-attributes-worker.js +3 -6
  37. package/dist/es5/i3s-attributes-worker.js.map +1 -1
  38. package/dist/es5/i3s-converter/helpers/batch-ids-extensions.js +18 -29
  39. package/dist/es5/i3s-converter/helpers/batch-ids-extensions.js.map +1 -1
  40. package/dist/es5/i3s-converter/helpers/coordinate-converter.js +8 -25
  41. package/dist/es5/i3s-converter/helpers/coordinate-converter.js.map +1 -1
  42. package/dist/es5/i3s-converter/helpers/create-scene-server-path.js +0 -11
  43. package/dist/es5/i3s-converter/helpers/create-scene-server-path.js.map +1 -1
  44. package/dist/es5/i3s-converter/helpers/feature-attributes.js +184 -0
  45. package/dist/es5/i3s-converter/helpers/feature-attributes.js.map +1 -0
  46. package/dist/es5/i3s-converter/helpers/geometry-attributes.js +60 -51
  47. package/dist/es5/i3s-converter/helpers/geometry-attributes.js.map +1 -1
  48. package/dist/es5/i3s-converter/helpers/geometry-converter.js +504 -350
  49. package/dist/es5/i3s-converter/helpers/geometry-converter.js.map +1 -1
  50. package/dist/es5/i3s-converter/helpers/gltf-attributes.js +57 -57
  51. package/dist/es5/i3s-converter/helpers/gltf-attributes.js.map +1 -1
  52. package/dist/es5/i3s-converter/helpers/node-debug.js +4 -23
  53. package/dist/es5/i3s-converter/helpers/node-debug.js.map +1 -1
  54. package/dist/es5/i3s-converter/helpers/node-index-document.js +507 -0
  55. package/dist/es5/i3s-converter/helpers/node-index-document.js.map +1 -0
  56. package/dist/es5/i3s-converter/helpers/node-pages.js +478 -168
  57. package/dist/es5/i3s-converter/helpers/node-pages.js.map +1 -1
  58. package/dist/es5/i3s-converter/i3s-converter.js +794 -1125
  59. package/dist/es5/i3s-converter/i3s-converter.js.map +1 -1
  60. package/dist/es5/i3s-converter/json-templates/geometry-definitions.js +107 -0
  61. package/dist/es5/i3s-converter/json-templates/geometry-definitions.js.map +1 -0
  62. package/dist/es5/i3s-converter/json-templates/layers.js +2 -107
  63. package/dist/es5/i3s-converter/json-templates/layers.js.map +1 -1
  64. package/dist/es5/i3s-converter/json-templates/metadata.js +0 -2
  65. package/dist/es5/i3s-converter/json-templates/metadata.js.map +1 -1
  66. package/dist/es5/i3s-converter/json-templates/node.js +2 -12
  67. package/dist/es5/i3s-converter/json-templates/node.js.map +1 -1
  68. package/dist/es5/i3s-converter/json-templates/scene-server.js +0 -2
  69. package/dist/es5/i3s-converter/json-templates/scene-server.js.map +1 -1
  70. package/dist/es5/i3s-converter/json-templates/shared-resources.js +9 -32
  71. package/dist/es5/i3s-converter/json-templates/shared-resources.js.map +1 -1
  72. package/dist/es5/i3s-converter/json-templates/store.js.map +1 -1
  73. package/dist/es5/i3s-converter/types.js.map +1 -1
  74. package/dist/es5/i3s-server/app.js +0 -5
  75. package/dist/es5/i3s-server/app.js.map +1 -1
  76. package/dist/es5/i3s-server/controllers/index-controller.js +0 -16
  77. package/dist/es5/i3s-server/controllers/index-controller.js.map +1 -1
  78. package/dist/es5/i3s-server/routes/index.js +1 -10
  79. package/dist/es5/i3s-server/routes/index.js.map +1 -1
  80. package/dist/es5/index.js +0 -3
  81. package/dist/es5/index.js.map +1 -1
  82. package/dist/es5/lib/utils/compress-util.js +19 -74
  83. package/dist/es5/lib/utils/compress-util.js.map +1 -1
  84. package/dist/es5/lib/utils/file-utils.js +103 -47
  85. package/dist/es5/lib/utils/file-utils.js.map +1 -1
  86. package/dist/es5/lib/utils/lod-conversion-utils.js +0 -7
  87. package/dist/es5/lib/utils/lod-conversion-utils.js.map +1 -1
  88. package/dist/es5/lib/utils/queue.js +0 -14
  89. package/dist/es5/lib/utils/queue.js.map +1 -1
  90. package/dist/es5/lib/utils/statistic-utills.js +1 -46
  91. package/dist/es5/lib/utils/statistic-utills.js.map +1 -1
  92. package/dist/es5/lib/utils/write-queue.js +86 -87
  93. package/dist/es5/lib/utils/write-queue.js.map +1 -1
  94. package/dist/es5/pgm-loader.js +1 -8
  95. package/dist/es5/pgm-loader.js.map +1 -1
  96. package/dist/es5/workers/3d-tiles-attributes-worker.js +2 -9
  97. package/dist/es5/workers/3d-tiles-attributes-worker.js.map +1 -1
  98. package/dist/es5/workers/i3s-attributes-worker.js +2 -10
  99. package/dist/es5/workers/i3s-attributes-worker.js.map +1 -1
  100. package/dist/esm/3d-tiles-attributes-worker.js +4 -2
  101. package/dist/esm/3d-tiles-attributes-worker.js.map +1 -1
  102. package/dist/esm/3d-tiles-converter/3d-tiles-converter.js +60 -77
  103. package/dist/esm/3d-tiles-converter/3d-tiles-converter.js.map +1 -1
  104. package/dist/esm/3d-tiles-converter/helpers/b3dm-converter.js +29 -50
  105. package/dist/esm/3d-tiles-converter/helpers/b3dm-converter.js.map +1 -1
  106. package/dist/esm/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js +1 -0
  107. package/dist/esm/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js.map +1 -1
  108. package/dist/esm/3d-tiles-converter/helpers/texture-atlas.js +1 -4
  109. package/dist/esm/3d-tiles-converter/helpers/texture-atlas.js.map +1 -1
  110. package/dist/esm/3d-tiles-converter/json-templates/tileset.js +0 -3
  111. package/dist/esm/3d-tiles-converter/json-templates/tileset.js.map +1 -1
  112. package/dist/esm/bundle.js +1 -1
  113. package/dist/esm/bundle.js.map +1 -1
  114. package/dist/esm/constants.js.map +1 -1
  115. package/dist/esm/converter-cli.js +26 -43
  116. package/dist/esm/converter-cli.js.map +1 -1
  117. package/dist/esm/deps-installer/deps-installer.js +30 -4
  118. package/dist/esm/deps-installer/deps-installer.js.map +1 -1
  119. package/dist/esm/i3s-attributes-worker.js +3 -1
  120. package/dist/esm/i3s-attributes-worker.js.map +1 -1
  121. package/dist/esm/i3s-converter/helpers/batch-ids-extensions.js +20 -24
  122. package/dist/esm/i3s-converter/helpers/batch-ids-extensions.js.map +1 -1
  123. package/dist/esm/i3s-converter/helpers/coordinate-converter.js +11 -12
  124. package/dist/esm/i3s-converter/helpers/coordinate-converter.js.map +1 -1
  125. package/dist/esm/i3s-converter/helpers/create-scene-server-path.js +1 -0
  126. package/dist/esm/i3s-converter/helpers/create-scene-server-path.js.map +1 -1
  127. package/dist/esm/i3s-converter/helpers/feature-attributes.js +158 -0
  128. package/dist/esm/i3s-converter/helpers/feature-attributes.js.map +1 -0
  129. package/dist/esm/i3s-converter/helpers/geometry-attributes.js +39 -33
  130. package/dist/esm/i3s-converter/helpers/geometry-attributes.js.map +1 -1
  131. package/dist/esm/i3s-converter/helpers/geometry-converter.js +286 -192
  132. package/dist/esm/i3s-converter/helpers/geometry-converter.js.map +1 -1
  133. package/dist/esm/i3s-converter/helpers/gltf-attributes.js +59 -48
  134. package/dist/esm/i3s-converter/helpers/gltf-attributes.js.map +1 -1
  135. package/dist/esm/i3s-converter/helpers/node-debug.js +3 -13
  136. package/dist/esm/i3s-converter/helpers/node-debug.js.map +1 -1
  137. package/dist/esm/i3s-converter/helpers/node-index-document.js +197 -0
  138. package/dist/esm/i3s-converter/helpers/node-index-document.js.map +1 -0
  139. package/dist/esm/i3s-converter/helpers/node-pages.js +161 -87
  140. package/dist/esm/i3s-converter/helpers/node-pages.js.map +1 -1
  141. package/dist/esm/i3s-converter/i3s-converter.js +235 -508
  142. package/dist/esm/i3s-converter/i3s-converter.js.map +1 -1
  143. package/dist/esm/i3s-converter/json-templates/geometry-definitions.js +89 -0
  144. package/dist/esm/i3s-converter/json-templates/geometry-definitions.js.map +1 -0
  145. package/dist/esm/i3s-converter/json-templates/layers.js +2 -95
  146. package/dist/esm/i3s-converter/json-templates/layers.js.map +1 -1
  147. package/dist/esm/i3s-converter/json-templates/metadata.js.map +1 -1
  148. package/dist/esm/i3s-converter/json-templates/node.js +0 -4
  149. package/dist/esm/i3s-converter/json-templates/node.js.map +1 -1
  150. package/dist/esm/i3s-converter/json-templates/scene-server.js.map +1 -1
  151. package/dist/esm/i3s-converter/json-templates/shared-resources.js +3 -15
  152. package/dist/esm/i3s-converter/json-templates/shared-resources.js.map +1 -1
  153. package/dist/esm/i3s-converter/json-templates/store.js.map +1 -1
  154. package/dist/esm/i3s-converter/types.js.map +1 -1
  155. package/dist/esm/i3s-server/app.js +0 -5
  156. package/dist/esm/i3s-server/app.js.map +1 -1
  157. package/dist/esm/i3s-server/controllers/index-controller.js +0 -5
  158. package/dist/esm/i3s-server/controllers/index-controller.js.map +1 -1
  159. package/dist/esm/i3s-server/routes/index.js +0 -3
  160. package/dist/esm/i3s-server/routes/index.js.map +1 -1
  161. package/dist/esm/index.js.map +1 -1
  162. package/dist/esm/lib/utils/compress-util.js +19 -12
  163. package/dist/esm/lib/utils/compress-util.js.map +1 -1
  164. package/dist/esm/lib/utils/file-utils.js +54 -11
  165. package/dist/esm/lib/utils/file-utils.js.map +1 -1
  166. package/dist/esm/lib/utils/lod-conversion-utils.js +2 -6
  167. package/dist/esm/lib/utils/lod-conversion-utils.js.map +1 -1
  168. package/dist/esm/lib/utils/queue.js +0 -4
  169. package/dist/esm/lib/utils/queue.js.map +1 -1
  170. package/dist/esm/lib/utils/statistic-utills.js +0 -11
  171. package/dist/esm/lib/utils/statistic-utills.js.map +1 -1
  172. package/dist/esm/lib/utils/write-queue.js +29 -28
  173. package/dist/esm/lib/utils/write-queue.js.map +1 -1
  174. package/dist/esm/pgm-loader.js +3 -1
  175. package/dist/esm/pgm-loader.js.map +1 -1
  176. package/dist/esm/workers/3d-tiles-attributes-worker.js +4 -1
  177. package/dist/esm/workers/3d-tiles-attributes-worker.js.map +1 -1
  178. package/dist/esm/workers/i3s-attributes-worker.js +4 -1
  179. package/dist/esm/workers/i3s-attributes-worker.js.map +1 -1
  180. package/dist/i3s-attributes-worker.d.ts +7 -3
  181. package/dist/i3s-attributes-worker.d.ts.map +1 -1
  182. package/dist/i3s-attributes-worker.js +2 -3
  183. package/dist/i3s-attributes-worker.js.map +3 -3
  184. package/dist/i3s-converter/helpers/batch-ids-extensions.d.ts +5 -6
  185. package/dist/i3s-converter/helpers/batch-ids-extensions.d.ts.map +1 -1
  186. package/dist/i3s-converter/helpers/batch-ids-extensions.js +18 -4
  187. package/dist/i3s-converter/helpers/coordinate-converter.d.ts +2 -2
  188. package/dist/i3s-converter/helpers/coordinate-converter.d.ts.map +1 -1
  189. package/dist/i3s-converter/helpers/coordinate-converter.js +8 -6
  190. package/dist/i3s-converter/helpers/feature-attributes.d.ts +56 -0
  191. package/dist/i3s-converter/helpers/feature-attributes.d.ts.map +1 -0
  192. package/dist/i3s-converter/helpers/feature-attributes.js +216 -0
  193. package/dist/i3s-converter/helpers/geometry-attributes.d.ts.map +1 -1
  194. package/dist/i3s-converter/helpers/geometry-attributes.js +42 -17
  195. package/dist/i3s-converter/helpers/geometry-converter.d.ts +18 -6
  196. package/dist/i3s-converter/helpers/geometry-converter.d.ts.map +1 -1
  197. package/dist/i3s-converter/helpers/geometry-converter.js +337 -92
  198. package/dist/i3s-converter/helpers/gltf-attributes.d.ts.map +1 -1
  199. package/dist/i3s-converter/helpers/gltf-attributes.js +51 -32
  200. package/dist/i3s-converter/helpers/node-index-document.d.ts +91 -0
  201. package/dist/i3s-converter/helpers/node-index-document.d.ts.map +1 -0
  202. package/dist/i3s-converter/helpers/node-index-document.js +242 -0
  203. package/dist/i3s-converter/helpers/node-pages.d.ts +81 -42
  204. package/dist/i3s-converter/helpers/node-pages.d.ts.map +1 -1
  205. package/dist/i3s-converter/helpers/node-pages.js +200 -92
  206. package/dist/i3s-converter/i3s-converter.d.ts +52 -108
  207. package/dist/i3s-converter/i3s-converter.d.ts.map +1 -1
  208. package/dist/i3s-converter/i3s-converter.js +234 -420
  209. package/dist/i3s-converter/json-templates/geometry-definitions.d.ts +7 -0
  210. package/dist/i3s-converter/json-templates/geometry-definitions.d.ts.map +1 -0
  211. package/dist/i3s-converter/json-templates/geometry-definitions.js +87 -0
  212. package/dist/i3s-converter/json-templates/layers.d.ts +1 -30
  213. package/dist/i3s-converter/json-templates/layers.d.ts.map +1 -1
  214. package/dist/i3s-converter/json-templates/layers.js +2 -86
  215. package/dist/i3s-converter/json-templates/shared-resources.js +3 -3
  216. package/dist/i3s-converter/types.d.ts +37 -55
  217. package/dist/i3s-converter/types.d.ts.map +1 -1
  218. package/dist/lib/utils/file-utils.d.ts +17 -1
  219. package/dist/lib/utils/file-utils.d.ts.map +1 -1
  220. package/dist/lib/utils/file-utils.js +64 -7
  221. package/dist/lib/utils/write-queue.d.ts +19 -2
  222. package/dist/lib/utils/write-queue.d.ts.map +1 -1
  223. package/dist/lib/utils/write-queue.js +26 -7
  224. package/dist/pgm-loader.d.ts.map +1 -1
  225. package/dist/pgm-loader.js +2 -1
  226. package/dist/workers/3d-tiles-attributes-worker.js +1 -1
  227. package/dist/workers/i3s-attributes-worker.js +1 -1
  228. package/package.json +18 -16
  229. package/src/3d-tiles-attributes-worker.ts +1 -1
  230. package/src/3d-tiles-converter/3d-tiles-converter.ts +71 -55
  231. package/src/3d-tiles-converter/helpers/b3dm-converter.ts +25 -18
  232. package/src/converter-cli.ts +38 -4
  233. package/src/deps-installer/deps-installer.ts +38 -2
  234. package/src/i3s-attributes-worker.ts +5 -1
  235. package/src/i3s-converter/helpers/batch-ids-extensions.ts +38 -14
  236. package/src/i3s-converter/helpers/coordinate-converter.ts +10 -8
  237. package/src/i3s-converter/helpers/feature-attributes.ts +247 -0
  238. package/src/i3s-converter/helpers/geometry-attributes.ts +46 -18
  239. package/src/i3s-converter/helpers/geometry-converter.ts +405 -108
  240. package/src/i3s-converter/helpers/gltf-attributes.ts +55 -35
  241. package/src/i3s-converter/helpers/node-index-document.ts +306 -0
  242. package/src/i3s-converter/helpers/node-pages.ts +222 -109
  243. package/src/i3s-converter/i3s-converter.ts +279 -499
  244. package/src/i3s-converter/json-templates/geometry-definitions.ts +83 -0
  245. package/src/i3s-converter/json-templates/layers.ts +2 -91
  246. package/src/i3s-converter/json-templates/shared-resources.ts +3 -3
  247. package/src/i3s-converter/types.ts +31 -51
  248. package/src/lib/utils/file-utils.ts +62 -7
  249. package/src/lib/utils/write-queue.ts +43 -10
  250. package/src/pgm-loader.ts +2 -2
  251. package/src/workers/3d-tiles-attributes-worker.ts +1 -1
  252. package/src/workers/i3s-attributes-worker.ts +2 -1
@@ -1,9 +1,9 @@
1
1
  import type {B3DMContent} from '@loaders.gl/3d-tiles';
2
- import type {Accessor} from 'modules/gltf/src/lib/types/gltf-postprocessed-schema';
2
+ import type {GLTFAccessorPostprocessed, GLTFNodePostprocessed} from '@loaders.gl/gltf';
3
3
  import type {B3DMAttributesData} from '../../i3s-attributes-worker';
4
4
 
5
5
  type AttributesObject = {
6
- [k: string]: Accessor;
6
+ [k: string]: GLTFAccessorPostprocessed;
7
7
  };
8
8
 
9
9
  /**
@@ -28,7 +28,6 @@ function getB3DMAttributesWithoutBufferView(attributes: AttributesObject): Attri
28
28
  * @returns
29
29
  */
30
30
  export function prepareDataForAttributesConversion(tileContent: B3DMContent): B3DMAttributesData {
31
- const gltfMaterials = tileContent.gltf?.materials?.map((material) => ({id: material.id}));
32
31
  let nodes =
33
32
  tileContent.gltf?.scene?.nodes ||
34
33
  tileContent.gltf?.scenes?.[0]?.nodes ||
@@ -38,46 +37,67 @@ export function prepareDataForAttributesConversion(tileContent: B3DMContent): B3
38
37
  const images =
39
38
  tileContent.gltf?.images?.map((imageObject) => {
40
39
  // Need data only for uncompressed images because we can't get batchIds from compressed textures.
41
- const data = imageObject?.image?.compressed ? null : imageObject?.image?.data.subarray();
42
- return {
43
- data,
44
- compressed: Boolean(imageObject?.image?.compressed),
45
- height: imageObject.image.height,
46
- width: imageObject.image.width,
47
- components: imageObject.image.components,
48
- mimeType: imageObject.mimeType
49
- };
40
+ if (imageObject?.image?.compressed) {
41
+ return {
42
+ data: null,
43
+ compressed: true
44
+ };
45
+ } else {
46
+ const data = imageObject?.image?.data;
47
+ const dataCopy = new Uint8Array(data.length);
48
+ dataCopy.set(data);
49
+ return {
50
+ data: dataCopy,
51
+ compressed: false,
52
+ height: imageObject.image.height,
53
+ width: imageObject.image.width,
54
+ components: imageObject.image.components,
55
+ mimeType: imageObject.mimeType
56
+ };
57
+ }
50
58
  }) || [];
51
59
 
52
- const prepearedNodes = nodes.map((node) => {
53
- if (!node.mesh) {
54
- return node;
55
- }
56
-
57
- return {
58
- ...node,
59
- images,
60
- mesh: {
61
- ...node.mesh,
62
- primitives: node.mesh?.primitives.map((primitive) => ({
63
- ...primitive,
64
- indices: {value: primitive?.indices?.value},
65
- attributes: getB3DMAttributesWithoutBufferView(primitive.attributes),
66
- material: {
67
- id: primitive?.material?.id
68
- }
69
- }))
70
- }
71
- };
72
- });
60
+ prepareNodes(nodes);
73
61
 
74
62
  const cartographicOrigin = tileContent.cartographicOrigin;
75
63
  const cartesianModelMatrix = tileContent.cartesianModelMatrix;
76
64
 
77
65
  return {
78
- gltfMaterials,
79
- nodes: prepearedNodes,
66
+ nodes,
67
+ images,
80
68
  cartographicOrigin,
81
69
  cartesianModelMatrix
82
70
  };
83
71
  }
72
+
73
+ /**
74
+ * Traverse all nodes to replace all sensible data with copy to avoid data corruption in worker.
75
+ * @param nodes
76
+ */
77
+ function prepareNodes(nodes: GLTFNodePostprocessed[]): void {
78
+ for (let index = 0; index < nodes.length; index++) {
79
+ const node = nodes[index] as any;
80
+
81
+ if (node.mesh) {
82
+ nodes[index] = {
83
+ ...node,
84
+ mesh: {
85
+ ...node.mesh,
86
+ primitives: node.mesh?.primitives.map((primitive) => ({
87
+ ...primitive,
88
+ indices: {value: primitive?.indices?.value},
89
+ attributes: getB3DMAttributesWithoutBufferView(primitive.attributes),
90
+ material: {
91
+ id: primitive?.material?.id,
92
+ uniqueId: primitive?.material?.uniqueId
93
+ }
94
+ }))
95
+ }
96
+ };
97
+ }
98
+
99
+ if (node.children) {
100
+ prepareNodes(node.children);
101
+ }
102
+ }
103
+ }
@@ -0,0 +1,306 @@
1
+ import {join} from 'path';
2
+ import {
3
+ BoundingVolumes,
4
+ LodSelection,
5
+ Node3DIndexDocument,
6
+ NodeInPage,
7
+ NodeReference
8
+ } from '@loaders.gl/i3s';
9
+ import transform from 'json-map-transform';
10
+ import {v4 as uuidv4} from 'uuid';
11
+ import {openJson, writeFile, writeFileForSlpk} from '../../lib/utils/file-utils';
12
+ import I3SConverter from '../i3s-converter';
13
+ import {NODE as nodeTemplate} from '../json-templates/node';
14
+ import {I3SConvertedResources} from '../types';
15
+
16
+ /**
17
+ * Wrapper for https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md data
18
+ * The class allows working with 3DNodeIndexDocument in 2 modes:
19
+ * in memory: the data is stored in `data` field
20
+ * 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
21
+ */
22
+ export class NodeIndexDocument {
23
+ /** Node id */
24
+ public id: string;
25
+ /** Id in node pages */
26
+ public inPageId: number;
27
+ /** 3DNodeIndexDocument data */
28
+ public data: Node3DIndexDocument | null = null;
29
+ /** children */
30
+ public children: NodeIndexDocument[] = [];
31
+ /** converter instance */
32
+ private converter: I3SConverter;
33
+
34
+ /**
35
+ * Constructor
36
+ * @param id - id of the node in node pages
37
+ * @param converter - converter instance
38
+ */
39
+ constructor(id: number, converter: I3SConverter) {
40
+ this.inPageId = id;
41
+ this.id = id === 0 ? 'root' : id.toString();
42
+ this.converter = converter;
43
+ }
44
+
45
+ /**
46
+ * Add Node3DIndexDocument data to the node
47
+ * @param data Node3DIndexDocument data
48
+ * @returns this NodeIndexDocument instance (to recurring with constructor)
49
+ */
50
+ public async addData(data: Node3DIndexDocument): Promise<NodeIndexDocument> {
51
+ if (this.converter.options.instantNodeWriting) {
52
+ await this.write(data);
53
+ } else {
54
+ this.data = data;
55
+ }
56
+ return this;
57
+ }
58
+
59
+ /**
60
+ * Add child node references
61
+ * @param childNodes - child NodeIndexDocument instances
62
+ */
63
+ public async addChildren(childNodes: NodeIndexDocument[]): Promise<void> {
64
+ const newChildren: NodeReference[] = [];
65
+ for (const node of childNodes) {
66
+ const nodeData = await node.load();
67
+ newChildren.push({
68
+ id: node.id,
69
+ href: `../${node.id}`,
70
+ obb: nodeData.obb,
71
+ mbs: nodeData.mbs
72
+ });
73
+ }
74
+ this.children = this.children.concat(childNodes);
75
+
76
+ let data: Node3DIndexDocument | null = this.data;
77
+ if (this.converter.options.instantNodeWriting) {
78
+ data = (await this.load()) as Node3DIndexDocument;
79
+ }
80
+ if (data) {
81
+ data.children = data.children ?? [];
82
+ data.children = data.children.concat(newChildren);
83
+ }
84
+ if (this.converter.options.instantNodeWriting && data) {
85
+ await this.write(data);
86
+ }
87
+ }
88
+
89
+ /**
90
+ * Add neighbors to child nodes of this node
91
+ */
92
+ public async addNeighbors(): Promise<void> {
93
+ const nodeData = await this.load();
94
+ for (const childNode of this.children) {
95
+ const childNodeData = await childNode.load();
96
+ childNodeData.neighbors = childNodeData.neighbors ?? [];
97
+
98
+ // Don't do large amount of "neightbors" to avoid big memory consumption
99
+ if (Number(nodeData?.children?.length) < 1000) {
100
+ for (const neighbor of nodeData.children || []) {
101
+ if (childNode.id === neighbor.id) {
102
+ continue; // eslint-disable-line
103
+ }
104
+
105
+ childNodeData.neighbors.push({...neighbor});
106
+ }
107
+ } else {
108
+ // eslint-disable-next-line no-console, no-undef
109
+ console.warn(
110
+ `Node ${childNode.id}: neighbors attribute is omited because of large number of neigbors`
111
+ );
112
+ delete childNodeData.neighbors;
113
+ }
114
+
115
+ if (this.converter.options.instantNodeWriting && childNodeData) {
116
+ await childNode.write(childNodeData);
117
+ }
118
+ childNode.save();
119
+ }
120
+ }
121
+
122
+ /** Save 3DNodeIndexDocument in file on disk */
123
+ public async save(): Promise<void> {
124
+ if (this.data) {
125
+ await this.write(this.data);
126
+ }
127
+ }
128
+
129
+ /**
130
+ * Write 3DNodeIndexDocument https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md
131
+ * @param node - Node3DIndexDocument object
132
+ */
133
+ private async write(node: Node3DIndexDocument): Promise<void> {
134
+ const path = join(this.converter.layers0Path, 'nodes', this.id);
135
+ if (this.converter.options.slpk) {
136
+ await this.converter.writeQueue.enqueue(
137
+ {
138
+ archiveKey: `nodes/${this.id}/3dNodeIndexDocument.json.gz`,
139
+ writePromise: () =>
140
+ writeFileForSlpk(
141
+ path,
142
+ JSON.stringify(node),
143
+ '3dNodeIndexDocument.json',
144
+ true,
145
+ this.converter.compressList
146
+ )
147
+ },
148
+ true
149
+ );
150
+ } else {
151
+ await this.converter.writeQueue.enqueue(
152
+ {writePromise: () => writeFile(path, JSON.stringify(node))},
153
+ true
154
+ );
155
+ }
156
+ }
157
+
158
+ /**
159
+ * Load 3DNodeIndexDocument data from file on disk
160
+ * @returns 3DNodeIndexDocument object
161
+ */
162
+ private async load(): Promise<Node3DIndexDocument> {
163
+ if (this.data) {
164
+ return this.data;
165
+ }
166
+ const path = this.id;
167
+ const parentNodePath = join(this.converter.layers0Path, 'nodes', path);
168
+ let parentNodeFileName = 'index.json';
169
+ if (this.converter.options.slpk) {
170
+ parentNodeFileName = '3dNodeIndexDocument.json';
171
+ }
172
+ return (await openJson(parentNodePath, parentNodeFileName)) as Node3DIndexDocument;
173
+ }
174
+
175
+ /**
176
+ * Create root node of the tree
177
+ * @param boundingVolumes - MBS and OOB bounding volumes data
178
+ * @param converter - I3SConverter instance
179
+ * @returns instance of NodeIndexDocument
180
+ */
181
+ static async createRootNode(
182
+ boundingVolumes: BoundingVolumes,
183
+ converter: I3SConverter
184
+ ): Promise<NodeIndexDocument> {
185
+ const rootData = NodeIndexDocument.createRootNodeIndexDocument(boundingVolumes);
186
+ const rootNode = await new NodeIndexDocument(0, converter).addData(rootData);
187
+ return rootNode;
188
+ }
189
+
190
+ /**
191
+ * Create NodeIndexDocument instance
192
+ * @param parentNode - parent NodeIndexDocument
193
+ * @param boundingVolumes - MBS and OOB bounding volumes data
194
+ * @param lodSelection - LOD metrics data
195
+ * @param nodeInPage - node data in node pages
196
+ * @param resources - resources extracted from gltf/b3dm file
197
+ * @param converter - I3SConverter instance
198
+ * @returns NodeIndexDocument instance
199
+ */
200
+ static async createNode(
201
+ parentNode: NodeIndexDocument,
202
+ boundingVolumes: BoundingVolumes,
203
+ lodSelection: LodSelection[],
204
+ nodeInPage: NodeInPage,
205
+ resources: I3SConvertedResources,
206
+ converter: I3SConverter
207
+ ): Promise<NodeIndexDocument> {
208
+ const data = await NodeIndexDocument.createNodeIndexDocument(
209
+ parentNode,
210
+ boundingVolumes,
211
+ lodSelection,
212
+ nodeInPage,
213
+ resources
214
+ );
215
+ const node = await new NodeIndexDocument(nodeInPage.index, converter).addData(data);
216
+ return node;
217
+ }
218
+
219
+ /**
220
+ * Form 3DNodeIndexDocument data for the root node
221
+ * @param boundingVolumes - mbs and obb data about node's bounding volume
222
+ * @return 3DNodeIndexDocument data https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md
223
+ */
224
+ static createRootNodeIndexDocument(boundingVolumes: BoundingVolumes): Node3DIndexDocument {
225
+ const root0data = {
226
+ version: `{${uuidv4().toUpperCase()}}`,
227
+ id: 'root',
228
+ level: 0,
229
+ lodSelection: [
230
+ {
231
+ metricType: 'maxScreenThresholdSQ',
232
+ maxError: 0
233
+ },
234
+ {
235
+ metricType: 'maxScreenThreshold',
236
+ maxError: 0
237
+ }
238
+ ],
239
+ ...boundingVolumes,
240
+ children: []
241
+ };
242
+ return transform(root0data, nodeTemplate());
243
+ }
244
+
245
+ /**
246
+ * Create a new Node3DIndexDocument
247
+ * @param parentNode - 3DNodeIndexDocument https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md object of the parent node
248
+ * @param boundingVolumes - Bounding volumes
249
+ * @param lodSelection - Level of Details (LOD) metrics
250
+ * @param nodeInPage - corresponding node object in a node page
251
+ * @param resources - the node resources data
252
+ * @param resources.texture - texture image
253
+ * @param resources.attributes - feature attributes
254
+ * @return 3DNodeIndexDocument https://github.com/Esri/i3s-spec/blob/master/docs/1.7/3DNodeIndexDocument.cmn.md object
255
+ */
256
+ static async createNodeIndexDocument(
257
+ parentNode: NodeIndexDocument,
258
+ boundingVolumes: BoundingVolumes,
259
+ lodSelection: LodSelection[],
260
+ nodeInPage: NodeInPage,
261
+ resources: I3SConvertedResources
262
+ ): Promise<Node3DIndexDocument> {
263
+ const {texture, attributes} = resources;
264
+ const nodeId = nodeInPage.index!;
265
+ const parentNodeData = await parentNode.load();
266
+ const nodeData = {
267
+ version: parentNodeData.version,
268
+ id: nodeId.toString(),
269
+ level: parentNodeData.level! + 1,
270
+ ...boundingVolumes,
271
+ lodSelection,
272
+ parentNode: {
273
+ id: parentNode.id,
274
+ href: `../${parentNode.id}`,
275
+ mbs: parentNodeData.mbs,
276
+ obb: parentNodeData.obb
277
+ },
278
+ children: [],
279
+ neighbors: []
280
+ };
281
+ const node = transform(nodeData, nodeTemplate());
282
+
283
+ if (nodeInPage.mesh) {
284
+ node.geometryData = [{href: './geometries/0'}];
285
+ node.sharedResource = {href: './shared'};
286
+
287
+ if (texture) {
288
+ node.textureData = [{href: './textures/0'}, {href: './textures/1'}];
289
+ }
290
+
291
+ if (
292
+ attributes &&
293
+ attributes.length &&
294
+ parentNode.converter.layers0?.attributeStorageInfo?.length
295
+ ) {
296
+ node.attributeData = [];
297
+ for (let index = 0; index < attributes.length; index++) {
298
+ const folderName = parentNode.converter.layers0.attributeStorageInfo[index].key;
299
+ node.attributeData.push({href: `./attributes/${folderName}/0`});
300
+ }
301
+ }
302
+ }
303
+
304
+ return node;
305
+ }
306
+ }