@loaders.gl/tile-converter 3.3.0-alpha.7 → 3.3.0

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