@loaders.gl/tile-converter 3.3.0-alpha.8 → 3.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/3d-tiles-attributes-worker.js +2 -2
- package/dist/3d-tiles-attributes-worker.js.map +3 -3
- package/dist/converter-cli.js +14 -2
- package/dist/converter.min.js +22 -22
- package/dist/deps-installer/deps-installer.d.ts.map +1 -1
- package/dist/deps-installer/deps-installer.js +8 -0
- package/dist/dist.min.js +1167 -848
- package/dist/es5/3d-tiles-attributes-worker.js +1 -1
- package/dist/es5/3d-tiles-attributes-worker.js.map +1 -1
- package/dist/es5/converter-cli.js +14 -2
- package/dist/es5/converter-cli.js.map +1 -1
- package/dist/es5/deps-installer/deps-installer.js +13 -2
- package/dist/es5/deps-installer/deps-installer.js.map +1 -1
- package/dist/es5/i3s-attributes-worker.js +1 -1
- package/dist/es5/i3s-attributes-worker.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/batch-ids-extensions.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/geometry-attributes.js +16 -7
- package/dist/es5/i3s-converter/helpers/geometry-attributes.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/geometry-converter.js +363 -113
- package/dist/es5/i3s-converter/helpers/geometry-converter.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/gltf-attributes.js +6 -11
- package/dist/es5/i3s-converter/helpers/gltf-attributes.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/node-index-document.js +517 -0
- package/dist/es5/i3s-converter/helpers/node-index-document.js.map +1 -0
- package/dist/es5/i3s-converter/helpers/node-pages.js +455 -173
- package/dist/es5/i3s-converter/helpers/node-pages.js.map +1 -1
- package/dist/es5/i3s-converter/i3s-converter.js +549 -618
- package/dist/es5/i3s-converter/i3s-converter.js.map +1 -1
- package/dist/es5/i3s-converter/json-templates/geometry-definitions.js +107 -0
- package/dist/es5/i3s-converter/json-templates/geometry-definitions.js.map +1 -0
- package/dist/es5/i3s-converter/json-templates/layers.js +2 -93
- package/dist/es5/i3s-converter/json-templates/layers.js.map +1 -1
- package/dist/es5/i3s-converter/json-templates/shared-resources.js +3 -3
- package/dist/es5/i3s-converter/json-templates/shared-resources.js.map +1 -1
- package/dist/es5/i3s-converter/types.js.map +1 -1
- package/dist/es5/lib/utils/file-utils.js +93 -9
- package/dist/es5/lib/utils/file-utils.js.map +1 -1
- package/dist/es5/lib/utils/write-queue.js +38 -25
- package/dist/es5/lib/utils/write-queue.js.map +1 -1
- package/dist/es5/pgm-loader.js +1 -1
- package/dist/es5/pgm-loader.js.map +1 -1
- package/dist/es5/workers/i3s-attributes-worker.js +1 -1
- package/dist/es5/workers/i3s-attributes-worker.js.map +1 -1
- package/dist/esm/3d-tiles-attributes-worker.js +1 -1
- package/dist/esm/3d-tiles-attributes-worker.js.map +1 -1
- package/dist/esm/converter-cli.js +14 -2
- package/dist/esm/converter-cli.js.map +1 -1
- package/dist/esm/deps-installer/deps-installer.js +9 -1
- package/dist/esm/deps-installer/deps-installer.js.map +1 -1
- package/dist/esm/i3s-attributes-worker.js +1 -1
- package/dist/esm/i3s-attributes-worker.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/batch-ids-extensions.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/geometry-attributes.js +16 -7
- package/dist/esm/i3s-converter/helpers/geometry-attributes.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/geometry-converter.js +150 -40
- package/dist/esm/i3s-converter/helpers/geometry-converter.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/gltf-attributes.js +6 -9
- package/dist/esm/i3s-converter/helpers/gltf-attributes.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/node-index-document.js +202 -0
- package/dist/esm/i3s-converter/helpers/node-index-document.js.map +1 -0
- package/dist/esm/i3s-converter/helpers/node-pages.js +162 -76
- package/dist/esm/i3s-converter/helpers/node-pages.js.map +1 -1
- package/dist/esm/i3s-converter/i3s-converter.js +115 -220
- package/dist/esm/i3s-converter/i3s-converter.js.map +1 -1
- package/dist/esm/i3s-converter/json-templates/geometry-definitions.js +89 -0
- package/dist/esm/i3s-converter/json-templates/geometry-definitions.js.map +1 -0
- package/dist/esm/i3s-converter/json-templates/layers.js +2 -85
- package/dist/esm/i3s-converter/json-templates/layers.js.map +1 -1
- package/dist/esm/i3s-converter/json-templates/shared-resources.js +3 -3
- package/dist/esm/i3s-converter/json-templates/shared-resources.js.map +1 -1
- package/dist/esm/i3s-converter/types.js.map +1 -1
- package/dist/esm/lib/utils/file-utils.js +44 -3
- package/dist/esm/lib/utils/file-utils.js.map +1 -1
- package/dist/esm/lib/utils/write-queue.js +19 -10
- package/dist/esm/lib/utils/write-queue.js.map +1 -1
- package/dist/esm/pgm-loader.js +1 -1
- package/dist/esm/pgm-loader.js.map +1 -1
- package/dist/esm/workers/i3s-attributes-worker.js +1 -1
- package/dist/esm/workers/i3s-attributes-worker.js.map +1 -1
- package/dist/i3s-attributes-worker.js +2 -2
- package/dist/i3s-attributes-worker.js.map +2 -2
- package/dist/i3s-converter/helpers/batch-ids-extensions.d.ts +3 -3
- package/dist/i3s-converter/helpers/batch-ids-extensions.js +3 -3
- package/dist/i3s-converter/helpers/geometry-attributes.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/geometry-attributes.js +16 -10
- package/dist/i3s-converter/helpers/geometry-converter.d.ts +8 -4
- package/dist/i3s-converter/helpers/geometry-converter.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/geometry-converter.js +200 -44
- package/dist/i3s-converter/helpers/gltf-attributes.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/gltf-attributes.js +2 -3
- package/dist/i3s-converter/helpers/node-index-document.d.ts +95 -0
- package/dist/i3s-converter/helpers/node-index-document.d.ts.map +1 -0
- package/dist/i3s-converter/helpers/node-index-document.js +250 -0
- package/dist/i3s-converter/helpers/node-pages.d.ts +78 -43
- package/dist/i3s-converter/helpers/node-pages.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/node-pages.js +194 -93
- package/dist/i3s-converter/i3s-converter.d.ts +33 -58
- package/dist/i3s-converter/i3s-converter.d.ts.map +1 -1
- package/dist/i3s-converter/i3s-converter.js +122 -233
- package/dist/i3s-converter/json-templates/geometry-definitions.d.ts +7 -0
- package/dist/i3s-converter/json-templates/geometry-definitions.d.ts.map +1 -0
- package/dist/i3s-converter/json-templates/geometry-definitions.js +87 -0
- package/dist/i3s-converter/json-templates/layers.d.ts +1 -30
- package/dist/i3s-converter/json-templates/layers.d.ts.map +1 -1
- package/dist/i3s-converter/json-templates/layers.js +2 -86
- package/dist/i3s-converter/json-templates/shared-resources.js +3 -3
- package/dist/i3s-converter/types.d.ts +28 -2
- package/dist/i3s-converter/types.d.ts.map +1 -1
- package/dist/lib/utils/file-utils.d.ts +17 -1
- package/dist/lib/utils/file-utils.d.ts.map +1 -1
- package/dist/lib/utils/file-utils.js +64 -7
- package/dist/lib/utils/write-queue.d.ts +18 -2
- package/dist/lib/utils/write-queue.d.ts.map +1 -1
- package/dist/lib/utils/write-queue.js +18 -12
- package/dist/workers/i3s-attributes-worker.js +1 -1
- package/package.json +25 -20
- package/src/converter-cli.ts +22 -2
- package/src/deps-installer/deps-installer.ts +9 -0
- package/src/i3s-converter/helpers/batch-ids-extensions.ts +3 -3
- package/src/i3s-converter/helpers/geometry-attributes.ts +16 -11
- package/src/i3s-converter/helpers/geometry-converter.ts +217 -48
- package/src/i3s-converter/helpers/gltf-attributes.ts +2 -3
- package/src/i3s-converter/helpers/node-index-document.ts +315 -0
- package/src/i3s-converter/helpers/node-pages.ts +215 -110
- package/src/i3s-converter/i3s-converter.ts +170 -312
- package/src/i3s-converter/json-templates/geometry-definitions.ts +83 -0
- package/src/i3s-converter/json-templates/layers.ts +2 -91
- package/src/i3s-converter/json-templates/shared-resources.ts +3 -3
- package/src/i3s-converter/types.ts +29 -2
- package/src/lib/utils/file-utils.ts +62 -7
- package/src/lib/utils/write-queue.ts +36 -15
- 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
|
|
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
|
|
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
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
312
|
+
* @param node - node object
|
|
122
313
|
*/
|
|
123
|
-
updateNodeAttributeByNodeId(
|
|
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
|
|
323
|
+
* @param node - node object
|
|
134
324
|
* @param featureCount - features count of the node
|
|
135
325
|
*/
|
|
136
|
-
updateFeatureCountByNodeId(
|
|
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
|
|
335
|
+
* @param node - node object
|
|
147
336
|
* @param texelCountHint - texelCountHint of particular node
|
|
148
337
|
*/
|
|
149
|
-
updateTexelCountHintByNodeId(
|
|
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
|
}
|