@loaders.gl/tile-converter 3.2.12 → 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 (251) 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 +43 -8
  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 +58405 -61237
  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 +50 -60
  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 +124 -0
  39. package/dist/es5/i3s-converter/helpers/batch-ids-extensions.js.map +1 -0
  40. package/dist/es5/i3s-converter/helpers/coordinate-converter.js +2 -19
  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 +516 -356
  49. package/dist/es5/i3s-converter/helpers/geometry-converter.js.map +1 -1
  50. package/dist/es5/i3s-converter/helpers/gltf-attributes.js +57 -43
  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 +462 -208
  57. package/dist/es5/i3s-converter/helpers/node-pages.js.map +1 -1
  58. package/dist/es5/i3s-converter/i3s-converter.js +722 -1153
  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 +41 -82
  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 +46 -40
  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 +113 -0
  122. package/dist/esm/i3s-converter/helpers/batch-ids-extensions.js.map +1 -0
  123. package/dist/esm/i3s-converter/helpers/coordinate-converter.js +5 -6
  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 +295 -196
  132. package/dist/esm/i3s-converter/helpers/geometry-converter.js.map +1 -1
  133. package/dist/esm/i3s-converter/helpers/gltf-attributes.js +59 -34
  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 +216 -491
  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 +27 -38
  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 +11 -0
  185. package/dist/i3s-converter/helpers/batch-ids-extensions.d.ts.map +1 -0
  186. package/dist/i3s-converter/helpers/batch-ids-extensions.js +141 -0
  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/feature-attributes.d.ts +56 -0
  190. package/dist/i3s-converter/helpers/feature-attributes.d.ts.map +1 -0
  191. package/dist/i3s-converter/helpers/feature-attributes.js +216 -0
  192. package/dist/i3s-converter/helpers/geometry-attributes.d.ts.map +1 -1
  193. package/dist/i3s-converter/helpers/geometry-attributes.js +42 -17
  194. package/dist/i3s-converter/helpers/geometry-converter.d.ts +18 -6
  195. package/dist/i3s-converter/helpers/geometry-converter.d.ts.map +1 -1
  196. package/dist/i3s-converter/helpers/geometry-converter.js +349 -99
  197. package/dist/i3s-converter/helpers/gltf-attributes.d.ts.map +1 -1
  198. package/dist/i3s-converter/helpers/gltf-attributes.js +53 -21
  199. package/dist/i3s-converter/helpers/node-index-document.d.ts +91 -0
  200. package/dist/i3s-converter/helpers/node-index-document.d.ts.map +1 -0
  201. package/dist/i3s-converter/helpers/node-index-document.js +242 -0
  202. package/dist/i3s-converter/helpers/node-pages.d.ts +81 -42
  203. package/dist/i3s-converter/helpers/node-pages.d.ts.map +1 -1
  204. package/dist/i3s-converter/helpers/node-pages.js +200 -92
  205. package/dist/i3s-converter/i3s-converter.d.ts +52 -108
  206. package/dist/i3s-converter/i3s-converter.d.ts.map +1 -1
  207. package/dist/i3s-converter/i3s-converter.js +218 -403
  208. package/dist/i3s-converter/json-templates/geometry-definitions.d.ts +7 -0
  209. package/dist/i3s-converter/json-templates/geometry-definitions.d.ts.map +1 -0
  210. package/dist/i3s-converter/json-templates/geometry-definitions.js +87 -0
  211. package/dist/i3s-converter/json-templates/layers.d.ts +1 -30
  212. package/dist/i3s-converter/json-templates/layers.d.ts.map +1 -1
  213. package/dist/i3s-converter/json-templates/layers.js +2 -86
  214. package/dist/i3s-converter/json-templates/shared-resources.js +3 -3
  215. package/dist/i3s-converter/types.d.ts +38 -8
  216. package/dist/i3s-converter/types.d.ts.map +1 -1
  217. package/dist/lib/utils/file-utils.d.ts +17 -1
  218. package/dist/lib/utils/file-utils.d.ts.map +1 -1
  219. package/dist/lib/utils/file-utils.js +64 -7
  220. package/dist/lib/utils/write-queue.d.ts +19 -3
  221. package/dist/lib/utils/write-queue.d.ts.map +1 -1
  222. package/dist/lib/utils/write-queue.js +21 -16
  223. package/dist/pgm-loader.d.ts.map +1 -1
  224. package/dist/pgm-loader.js +2 -1
  225. package/dist/workers/3d-tiles-attributes-worker.js +1 -1
  226. package/dist/workers/i3s-attributes-worker.js +1 -1
  227. package/package.json +18 -16
  228. package/src/3d-tiles-attributes-worker.ts +1 -1
  229. package/src/3d-tiles-converter/3d-tiles-converter.ts +71 -55
  230. package/src/3d-tiles-converter/helpers/b3dm-converter.ts +25 -18
  231. package/src/converter-cli.ts +54 -8
  232. package/src/deps-installer/deps-installer.ts +38 -2
  233. package/src/i3s-attributes-worker.ts +5 -1
  234. package/src/i3s-converter/helpers/batch-ids-extensions.ts +206 -0
  235. package/src/i3s-converter/helpers/coordinate-converter.ts +2 -2
  236. package/src/i3s-converter/helpers/feature-attributes.ts +247 -0
  237. package/src/i3s-converter/helpers/geometry-attributes.ts +46 -18
  238. package/src/i3s-converter/helpers/geometry-converter.ts +423 -111
  239. package/src/i3s-converter/helpers/gltf-attributes.ts +59 -24
  240. package/src/i3s-converter/helpers/node-index-document.ts +306 -0
  241. package/src/i3s-converter/helpers/node-pages.ts +222 -109
  242. package/src/i3s-converter/i3s-converter.ts +264 -487
  243. package/src/i3s-converter/json-templates/geometry-definitions.ts +83 -0
  244. package/src/i3s-converter/json-templates/layers.ts +2 -91
  245. package/src/i3s-converter/json-templates/shared-resources.ts +3 -3
  246. package/src/i3s-converter/types.ts +33 -2
  247. package/src/lib/utils/file-utils.ts +62 -7
  248. package/src/lib/utils/write-queue.ts +42 -19
  249. package/src/pgm-loader.ts +2 -2
  250. package/src/workers/3d-tiles-attributes-worker.ts +1 -1
  251. package/src/workers/i3s-attributes-worker.ts +2 -1
@@ -1,12 +1,10 @@
1
- import type {WriteQueueItem} from '../../lib/utils/write-queue';
2
-
3
1
  import {join} from 'path';
4
2
  import transform from 'json-map-transform';
5
3
  import {METADATA as metadataTemplate} from '../json-templates/metadata';
6
4
  import {NodeInPage} from '@loaders.gl/i3s';
7
- import WriteQueue from '../../lib/utils/write-queue';
5
+ import {isFileExists, openJson} from '../../lib/utils/file-utils';
6
+ import I3SConverter from '../i3s-converter';
8
7
 
9
- // @ts-nocheck
10
8
  /**
11
9
  * class NodePages - wrapper of nodePages array
12
10
  *
@@ -17,7 +15,7 @@ import WriteQueue from '../../lib/utils/write-queue';
17
15
  * const nodePages = new NodePages(writeFile, HARDCODED_NODES_PER_PAGE);
18
16
  * ...
19
17
  * // push root node
20
- * const parentId = nodePages.push({
18
+ * const parent = await nodePages.push({
21
19
  lodThreshold: HARDCODED_MAX_SCREEN_THRESHOLD_SQ,
22
20
  obb: coordinates.obb,
23
21
  children: []
@@ -34,7 +32,7 @@ import WriteQueue from '../../lib/utils/write-queue';
34
32
  }
35
33
  }
36
34
  };
37
- * const nodeId = this.nodePages.push(nodeInPage, parentId);
35
+ * const node = await this.nodePages.push(nodeInPage, parent.index);
38
36
  * ...
39
37
  * // save all the nodePages in the end of pushing all the nodes
40
38
  * await this.nodePages.save(layers0path);
@@ -42,8 +40,10 @@ import WriteQueue from '../../lib/utils/write-queue';
42
40
  export default class NodePages {
43
41
  readonly nodesPerPage: number;
44
42
  nodesCounter: number;
45
- writeFile: Function;
43
+ writeFile: (...args) => Promise<null | string>;
44
+ converter: I3SConverter;
46
45
  readonly nodePages: {nodes: NodeInPage[]}[];
46
+ readonly length: number = 0;
47
47
 
48
48
  /**
49
49
  * @constructs
@@ -51,99 +51,90 @@ export default class NodePages {
51
51
  * @param writeFileFunc - function to save one nodePage into a file
52
52
  * @param nodesPerPage - length limit for one nodePage. An additional nodePage is created when this limit is met
53
53
  */
54
- constructor(writeFileFunc, nodesPerPage) {
54
+ constructor(writeFileFunc, nodesPerPage, converter: I3SConverter) {
55
55
  this.nodesPerPage = nodesPerPage;
56
56
  this.nodesCounter = 0;
57
57
  // @ts-expect-error
58
58
  this.nodePages = [{}];
59
59
  this.nodePages[0].nodes = [];
60
60
  this.writeFile = writeFileFunc;
61
+ this.converter = converter;
62
+ this.length = 0;
61
63
  }
62
64
 
63
65
  /**
64
66
  * Setup function to save node pages
65
67
  * @param func - function which should be used to save node pages
66
68
  */
67
- useWriteFunction(func: Function): void {
69
+ useWriteFunction(func: (...args) => Promise<null | string>): void {
68
70
  this.writeFile = func;
69
71
  }
70
72
 
71
73
  /**
72
- * Get the node by its end-to-end index
73
- * @param id - end-to-end index of the node
74
- * @return the node object
74
+ * Get file path and file name of the node page with the particular id
75
+ * @param nodePageId - node page id
76
+ * @returns file path and file name
75
77
  */
76
- getNodeById(id: number): NodeInPage {
77
- const pageIndex = Math.floor(id / this.nodesPerPage);
78
- const nodeIndex = id % this.nodesPerPage;
79
- return this.nodePages[pageIndex].nodes[nodeIndex];
80
- }
81
-
82
- /**
83
- * Update material in node.mesh object by node id
84
- * @param id - end-to-end index of the node
85
- * @param materialId - id from scene layer materialDefinitions
86
- */
87
- updateMaterialByNodeId(id: number, materialId: number): void {
88
- const node = this.getNodeById(id);
89
- if (!node.mesh) {
90
- return;
78
+ private getNodePageFileName(nodePageId): {filePath: string; fileName: string} {
79
+ let filePath;
80
+ let fileName;
81
+ if (this.converter.options.slpk) {
82
+ filePath = join(this.converter.layers0Path, 'nodepages');
83
+ fileName = `${nodePageId.toString()}.json`;
84
+ } else {
85
+ filePath = join(this.converter.layers0Path, 'nodepages', nodePageId.toString());
86
+ fileName = 'index.json';
91
87
  }
92
- node.mesh.material = {
93
- definition: materialId,
94
- resource: node.index
95
- };
88
+ return {filePath, fileName};
96
89
  }
97
90
 
98
91
  /**
99
- * Update vertexCount in node.mesh.geometry object by node id
100
- * @param id - end-to-end index of the node
101
- * @param vertexCount - vertex count for particular node
92
+ * Load node page from a file on the disk
93
+ * @param nodePageId - node page id
94
+ * @returns - node page data
102
95
  */
103
- updateVertexCountByNodeId(id: number, vertexCount: number): void {
104
- const node = this.getNodeById(id);
105
- if (!node.mesh) {
106
- return;
96
+ private async loadNodePage(nodePageId: number): Promise<{nodes: NodeInPage[]}> {
97
+ const {filePath, fileName} = this.getNodePageFileName(nodePageId);
98
+ const fullName = join(filePath, fileName);
99
+ if (await isFileExists(fullName)) {
100
+ console.log(`load ${fullName}.`); // eslint-disable-line
101
+ return (await openJson(filePath, fileName)) as {nodes: NodeInPage[]};
102
+ } else {
103
+ return {nodes: []};
107
104
  }
108
- node.mesh.geometry.vertexCount = vertexCount;
109
105
  }
110
106
 
111
107
  /**
112
- * Update resource in node.mesh.attribute object by node id
113
- * @param id - end-to-end index of the node
108
+ * Get nodepage id by node id
109
+ * @param id node id
110
+ * @returns node page id
114
111
  */
115
- updateNodeAttributeByNodeId(id: number): void {
116
- const node = this.getNodeById(id);
117
- if (!node.mesh) {
118
- return;
119
- }
120
- node.mesh.attribute.resource = node.index;
112
+ private getPageIndexByNodeId(id: number): number {
113
+ return Math.floor(id / this.nodesPerPage);
121
114
  }
122
115
 
123
116
  /**
124
- * Update featureCount in node.mesh.geometry object by node id
125
- * @param id - end-to-end index of the node
126
- * @param featureCount - features count of the node
117
+ * Get node page data by node id
118
+ * @param id node id
119
+ * @returns node page data
127
120
  */
128
- updateFeatureCountByNodeId(id: number, featureCount: number): void {
129
- const node = this.getNodeById(id);
130
- if (!node.mesh) {
131
- return;
121
+ private async getPageByNodeId(id: number): Promise<{nodes: NodeInPage[]}> {
122
+ const pageIndex = this.getPageIndexByNodeId(id);
123
+ if (this.converter.options.instantNodeWriting) {
124
+ return await this.loadNodePage(pageIndex);
132
125
  }
133
- node.mesh.geometry.featureCount = featureCount;
126
+ return this.nodePages[pageIndex];
134
127
  }
135
128
 
136
129
  /**
137
- * Update texelCountHint in node.mesh.material object by node id
130
+ * Get the node by its end-to-end index
138
131
  * @param id - end-to-end index of the node
139
- * @param texelCountHint - texelCountHint of particular node
132
+ * @return the node object
140
133
  */
141
- updateTexelCountHintByNodeId(id: number, texelCountHint: number): void {
142
- const node = this.getNodeById(id);
143
- if (!node.mesh || !node.mesh.material) {
144
- return;
145
- }
146
- node.mesh.material.texelCountHint = texelCountHint;
134
+ async getNodeById(id: number, nodePage?: {nodes: NodeInPage[]}): Promise<NodeInPage> {
135
+ const nodeIndex = id % this.nodesPerPage;
136
+ nodePage = nodePage || (await this.getPageByNodeId(id));
137
+ return nodePage.nodes[nodeIndex];
147
138
  }
148
139
 
149
140
  /**
@@ -151,81 +142,203 @@ export default class NodePages {
151
142
  * @param parentId - end-to-end parent node index
152
143
  * @param childId - end-to-end child node index
153
144
  */
154
- addChildRelation(parentId: number | undefined, childId: number): void {
145
+ private async addChildRelation(parentId: number | undefined, childId: number): Promise<void> {
155
146
  if (parentId === null || parentId === undefined) {
156
147
  return;
157
148
  }
158
- const parentNode = this.getNodeById(parentId);
149
+ const parentNode = await this.getNodeById(parentId);
159
150
  parentNode.children?.push(childId);
151
+ await this.saveNode(parentNode);
160
152
  }
161
153
 
162
154
  /**
163
- * Update resource index in node.mesh object
155
+ * Put new node in nodePages array
164
156
  * @param node - node object
157
+ * @param parentId - index of parent node
158
+ * @return
165
159
  */
166
- updateResourceInMesh(node: NodeInPage): void {
167
- if (node.mesh) {
168
- node.mesh.geometry.resource = node.index;
160
+ async push(node: NodeInPage, parentId?: number): Promise<NodeInPage> {
161
+ node.index = this.nodesCounter++;
162
+ if (!this.converter.options.instantNodeWriting) {
163
+ let currentNodePage = this.nodePages[this.nodePages.length - 1];
164
+ if (currentNodePage.nodes.length === this.nodesPerPage) {
165
+ currentNodePage = {nodes: []};
166
+ this.nodePages.push(currentNodePage);
167
+ }
168
+ currentNodePage.nodes.push(node);
169
169
  }
170
+ await this.addChildRelation(parentId, node.index);
171
+ NodePages.updateResourceInMesh(node);
172
+ await this.saveNode(node);
173
+ return node;
170
174
  }
171
175
 
172
176
  /**
173
- * Put new node in nodePages array
174
- * @param node - node object
175
- * @param parentId - index of parent node
176
- * @return
177
+ * Save node to the file on the disk
178
+ * @param node - node data
177
179
  */
178
- push(node: NodeInPage, parentId?: number): number {
179
- let currentNodePage = this.nodePages[this.nodePages.length - 1];
180
- if (currentNodePage.nodes.length === this.nodesPerPage) {
181
- currentNodePage = {nodes: []};
182
- this.nodePages.push(currentNodePage);
180
+ async saveNode(node: NodeInPage): Promise<void> {
181
+ if (!this.converter.options.instantNodeWriting) {
182
+ return;
183
+ } else {
184
+ const nodePageIndex = this.getPageIndexByNodeId(node.index);
185
+ const nodePage = await this.getPageByNodeId(node.index);
186
+ const {filePath, fileName} = this.getNodePageFileName(nodePageIndex);
187
+ const nodeToUpdate = await this.getNodeById(node.index, nodePage);
188
+ if (nodeToUpdate) {
189
+ NodePages.updateAll(nodeToUpdate, node);
190
+ } else {
191
+ nodePage.nodes.push(node);
192
+ }
193
+ const nodePageStr = JSON.stringify(nodePage);
194
+ if (this.converter.options.slpk) {
195
+ await this.converter.writeQueue.enqueue(
196
+ {
197
+ archiveKey: `nodePages/${nodePageIndex.toString()}.json.gz`,
198
+ writePromise: () =>
199
+ this.writeFile(filePath, nodePageStr, fileName, true, this.converter.compressList)
200
+ },
201
+ true
202
+ );
203
+ } else {
204
+ await this.converter.writeQueue.enqueue(
205
+ {
206
+ writePromise: () => this.writeFile(filePath, nodePageStr)
207
+ },
208
+ true
209
+ );
210
+ }
183
211
  }
184
- node.index = this.nodesCounter++;
185
- currentNodePage.nodes.push(node);
186
- this.addChildRelation(parentId, node.index);
187
- this.updateResourceInMesh(node);
188
- return node.index;
212
+ }
213
+
214
+ /**
215
+ * Save metadata file (for slpk only)
216
+ */
217
+ async saveMetadata(): Promise<void> {
218
+ const metadata = transform({nodeCount: this.nodesCounter}, metadataTemplate());
219
+ const compress = false;
220
+ await this.converter.writeQueue.enqueue({
221
+ archiveKey: 'metadata.json',
222
+ writePromise: () =>
223
+ this.writeFile(
224
+ this.converter.layers0Path,
225
+ JSON.stringify(metadata),
226
+ 'metadata.json',
227
+ compress
228
+ )
229
+ });
189
230
  }
190
231
 
191
232
  /**
192
233
  * Save all the node pages
193
234
  * Run this method when all nodes is pushed in nodePages
194
- * @param layers0Path - path of layer
195
- * @param writeQueue - write queue that controlls files write concurrency
196
- * @param slpk
197
- */
198
- async save(
199
- layers0Path: string,
200
- writeQueue: WriteQueue<WriteQueueItem>,
201
- slpk: boolean = false
202
- ): Promise<void> {
203
- if (slpk) {
235
+ */
236
+ async save(): Promise<void> {
237
+ if (this.converter.options.instantNodeWriting) {
238
+ await this.saveMetadata();
239
+ return;
240
+ }
241
+ if (this.converter.options.slpk) {
204
242
  for (const [index, nodePage] of this.nodePages.entries()) {
205
243
  const nodePageStr = JSON.stringify(nodePage);
206
- const slpkPath = join(layers0Path, 'nodepages');
207
- await writeQueue.enqueue({
244
+ const slpkPath = join(this.converter.layers0Path, 'nodepages');
245
+ await this.converter.writeQueue.enqueue({
208
246
  archiveKey: `nodePages/${index.toString()}.json.gz`,
209
- writePromise: this.writeFile(slpkPath, nodePageStr, `${index.toString()}.json`)
247
+ writePromise: () => this.writeFile(slpkPath, nodePageStr, `${index.toString()}.json`)
210
248
  });
211
249
  }
212
- const metadata = transform({nodeCount: this.nodesCounter}, metadataTemplate());
213
- const compress = false;
214
- await writeQueue.enqueue({
215
- archiveKey: 'metadata.json',
216
- writePromise: this.writeFile(
217
- layers0Path,
218
- JSON.stringify(metadata),
219
- 'metadata.json',
220
- compress
221
- )
222
- });
250
+ await this.saveMetadata();
223
251
  } else {
224
252
  for (const [index, nodePage] of this.nodePages.entries()) {
225
253
  const nodePageStr = JSON.stringify(nodePage);
226
- const nodePagePath = join(layers0Path, 'nodepages', index.toString());
227
- await writeQueue.enqueue({writePromise: this.writeFile(nodePagePath, nodePageStr)});
254
+ const nodePagePath = join(this.converter.layers0Path, 'nodepages', index.toString());
255
+ await this.converter.writeQueue.enqueue({
256
+ writePromise: () => this.writeFile(nodePagePath, nodePageStr)
257
+ });
228
258
  }
229
259
  }
230
260
  }
261
+
262
+ /**
263
+ * Update resource index in node.mesh object
264
+ * @param node - node object
265
+ */
266
+ static updateResourceInMesh(node: NodeInPage): void {
267
+ if (node.mesh && isFinite(node.index)) {
268
+ node.mesh.geometry.resource = node.index;
269
+ }
270
+ }
271
+
272
+ /**
273
+ * Update all fields in the node excluding id
274
+ * @param node - node object
275
+ * @param data - NodeInPage data to replace original data
276
+ */
277
+ static updateAll(node: NodeInPage, data: NodeInPage): NodeInPage {
278
+ Object.assign(node, data, {index: node.index});
279
+ NodePages.updateResourceInMesh(node);
280
+ return node;
281
+ }
282
+
283
+ /**
284
+ * Update material in node.mesh object by node id
285
+ * @param id - end-to-end index of the node
286
+ * @param materialId - id from scene layer materialDefinitions
287
+ */
288
+ static updateMaterialByNodeId(node: NodeInPage, materialId: number): void {
289
+ if (!node.mesh) {
290
+ return;
291
+ }
292
+ node.mesh.material = {
293
+ definition: materialId,
294
+ resource: node.index
295
+ };
296
+ }
297
+
298
+ /**
299
+ * Update vertexCount in node.mesh.geometry object by node id
300
+ * @param id - end-to-end index of the node
301
+ * @param vertexCount - vertex count for particular node
302
+ */
303
+ static updateVertexCountByNodeId(node: NodeInPage, vertexCount: number): void {
304
+ if (!node.mesh) {
305
+ return;
306
+ }
307
+ node.mesh.geometry.vertexCount = vertexCount;
308
+ }
309
+
310
+ /**
311
+ * Update resource in node.mesh.attribute object by node id
312
+ * @param node - node object
313
+ */
314
+ static updateNodeAttributeByNodeId(node: NodeInPage): void {
315
+ if (!node.mesh || !node.index) {
316
+ return;
317
+ }
318
+ node.mesh.attribute.resource = node.index;
319
+ }
320
+
321
+ /**
322
+ * Update featureCount in node.mesh.geometry object by node id
323
+ * @param node - node object
324
+ * @param featureCount - features count of the node
325
+ */
326
+ static updateFeatureCountByNodeId(node: NodeInPage, featureCount: number): void {
327
+ if (!node.mesh) {
328
+ return;
329
+ }
330
+ node.mesh.geometry.featureCount = featureCount;
331
+ }
332
+
333
+ /**
334
+ * Update texelCountHint in node.mesh.material object by node id
335
+ * @param node - node object
336
+ * @param texelCountHint - texelCountHint of particular node
337
+ */
338
+ static updateTexelCountHintByNodeId(node: NodeInPage, texelCountHint: number): void {
339
+ if (!node.mesh || !node.mesh.material) {
340
+ return;
341
+ }
342
+ node.mesh.material.texelCountHint = texelCountHint;
343
+ }
231
344
  }