@loaders.gl/tile-converter 4.2.0-alpha.4 → 4.2.0-alpha.6

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 (192) hide show
  1. package/dist/3d-tiles-converter/3d-tiles-converter.d.ts +4 -4
  2. package/dist/3d-tiles-converter/3d-tiles-converter.d.ts.map +1 -1
  3. package/dist/3d-tiles-converter/3d-tiles-converter.js +349 -293
  4. package/dist/3d-tiles-converter/helpers/b3dm-converter.d.ts.map +1 -1
  5. package/dist/3d-tiles-converter/helpers/b3dm-converter.js +261 -200
  6. package/dist/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js +14 -5
  7. package/dist/3d-tiles-converter/helpers/load-i3s.d.ts.map +1 -1
  8. package/dist/3d-tiles-converter/helpers/load-i3s.js +83 -77
  9. package/dist/3d-tiles-converter/helpers/texture-atlas.js +44 -21
  10. package/dist/3d-tiles-converter/json-templates/tileset.js +32 -33
  11. package/dist/constants.js +0 -1
  12. package/dist/converter-cli.js +257 -234
  13. package/dist/converter.min.cjs +95 -105
  14. package/dist/deps-installer/deps-installer.d.ts.map +1 -1
  15. package/dist/deps-installer/deps-installer.js +78 -59
  16. package/dist/i3s-converter/helpers/attribute-metadata-info.js +210 -153
  17. package/dist/i3s-converter/helpers/batch-ids-extensions.d.ts +1 -1
  18. package/dist/i3s-converter/helpers/batch-ids-extensions.d.ts.map +1 -1
  19. package/dist/i3s-converter/helpers/batch-ids-extensions.js +146 -103
  20. package/dist/i3s-converter/helpers/coordinate-converter.js +100 -65
  21. package/dist/i3s-converter/helpers/create-scene-server-path.js +14 -9
  22. package/dist/i3s-converter/helpers/feature-attributes.d.ts.map +1 -1
  23. package/dist/i3s-converter/helpers/feature-attributes.js +170 -105
  24. package/dist/i3s-converter/helpers/geometry-attributes.d.ts +1 -1
  25. package/dist/i3s-converter/helpers/geometry-attributes.d.ts.map +1 -1
  26. package/dist/i3s-converter/helpers/geometry-attributes.js +205 -212
  27. package/dist/i3s-converter/helpers/geometry-converter.d.ts +17 -3
  28. package/dist/i3s-converter/helpers/geometry-converter.d.ts.map +1 -1
  29. package/dist/i3s-converter/helpers/geometry-converter.js +1189 -830
  30. package/dist/i3s-converter/helpers/gltf-attributes.d.ts +1 -1
  31. package/dist/i3s-converter/helpers/gltf-attributes.d.ts.map +1 -1
  32. package/dist/i3s-converter/helpers/gltf-attributes.js +109 -97
  33. package/dist/i3s-converter/helpers/load-3d-tiles.js +103 -66
  34. package/dist/i3s-converter/helpers/node-debug.js +98 -54
  35. package/dist/i3s-converter/helpers/node-index-document.d.ts +11 -4
  36. package/dist/i3s-converter/helpers/node-index-document.d.ts.map +1 -1
  37. package/dist/i3s-converter/helpers/node-index-document.js +255 -177
  38. package/dist/i3s-converter/helpers/node-pages.d.ts +1 -1
  39. package/dist/i3s-converter/helpers/node-pages.d.ts.map +1 -1
  40. package/dist/i3s-converter/helpers/node-pages.js +299 -193
  41. package/dist/i3s-converter/helpers/preprocess-3d-tiles.d.ts +1 -1
  42. package/dist/i3s-converter/helpers/preprocess-3d-tiles.d.ts.map +1 -1
  43. package/dist/i3s-converter/helpers/preprocess-3d-tiles.js +92 -60
  44. package/dist/i3s-converter/helpers/progress.d.ts.map +1 -1
  45. package/dist/i3s-converter/helpers/progress.js +139 -83
  46. package/dist/i3s-converter/helpers/tileset-traversal.d.ts +9 -2
  47. package/dist/i3s-converter/helpers/tileset-traversal.d.ts.map +1 -1
  48. package/dist/i3s-converter/helpers/tileset-traversal.js +33 -13
  49. package/dist/i3s-converter/i3s-converter.d.ts +7 -7
  50. package/dist/i3s-converter/i3s-converter.d.ts.map +1 -1
  51. package/dist/i3s-converter/i3s-converter.js +1165 -895
  52. package/dist/i3s-converter/json-templates/geometry-definitions.js +70 -79
  53. package/dist/i3s-converter/json-templates/layers.js +120 -121
  54. package/dist/i3s-converter/json-templates/metadata.js +19 -20
  55. package/dist/i3s-converter/json-templates/node.js +73 -71
  56. package/dist/i3s-converter/json-templates/scene-server.js +25 -26
  57. package/dist/i3s-converter/json-templates/shared-resources.js +107 -108
  58. package/dist/i3s-converter/json-templates/store.js +96 -94
  59. package/dist/i3s-converter/types.js +35 -23
  60. package/dist/i3s-server/app.js +15 -12
  61. package/dist/i3s-server/bin/i3s-server.min.cjs +69 -69
  62. package/dist/i3s-server/bin/www.js +16 -7
  63. package/dist/i3s-server/controllers/index-controller.js +18 -15
  64. package/dist/i3s-server/controllers/slpk-controller.d.ts.map +1 -1
  65. package/dist/i3s-server/controllers/slpk-controller.js +24 -11
  66. package/dist/i3s-server/routes/index.js +13 -9
  67. package/dist/i3s-server/routes/slpk-router.d.ts.map +1 -1
  68. package/dist/i3s-server/routes/slpk-router.js +26 -19
  69. package/dist/i3s-server/utils/create-scene-server.js +15 -10
  70. package/dist/i3s-server/utils/server-utils.d.ts.map +1 -1
  71. package/dist/i3s-server/utils/server-utils.js +52 -32
  72. package/dist/index.cjs +616 -967
  73. package/dist/index.cjs.map +7 -0
  74. package/dist/index.d.ts +2 -2
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +0 -1
  77. package/dist/lib/json-schemas/conversion-dump-json-schema.js +243 -421
  78. package/dist/lib/utils/cli-utils.d.ts.map +1 -1
  79. package/dist/lib/utils/cli-utils.js +65 -36
  80. package/dist/lib/utils/compress-util.js +20 -15
  81. package/dist/lib/utils/conversion-dump.d.ts +10 -2
  82. package/dist/lib/utils/conversion-dump.d.ts.map +1 -1
  83. package/dist/lib/utils/conversion-dump.js +242 -197
  84. package/dist/lib/utils/file-utils.d.ts +1 -1
  85. package/dist/lib/utils/file-utils.d.ts.map +1 -1
  86. package/dist/lib/utils/file-utils.js +120 -74
  87. package/dist/lib/utils/geometry-utils.js +13 -7
  88. package/dist/lib/utils/lod-conversion-utils.js +65 -33
  89. package/dist/lib/utils/queue.js +12 -13
  90. package/dist/lib/utils/statistic-utills.d.ts +6 -23
  91. package/dist/lib/utils/statistic-utills.d.ts.map +1 -1
  92. package/dist/lib/utils/statistic-utills.js +58 -55
  93. package/dist/lib/utils/write-queue.d.ts +2 -2
  94. package/dist/lib/utils/write-queue.d.ts.map +1 -1
  95. package/dist/lib/utils/write-queue.js +72 -86
  96. package/dist/pgm-loader.js +17 -13
  97. package/dist/slpk-extractor/slpk-extractor.d.ts.map +1 -1
  98. package/dist/slpk-extractor/slpk-extractor.js +60 -50
  99. package/dist/slpk-extractor-cli.d.ts.map +1 -1
  100. package/dist/slpk-extractor-cli.js +90 -59
  101. package/dist/slpk-extractor.min.cjs +1 -1
  102. package/package.json +27 -26
  103. package/src/3d-tiles-converter/3d-tiles-converter.ts +21 -10
  104. package/src/3d-tiles-converter/helpers/b3dm-converter.ts +1 -0
  105. package/src/3d-tiles-converter/helpers/load-i3s.ts +3 -27
  106. package/src/converter-cli.ts +4 -2
  107. package/src/deps-installer/deps-installer.ts +7 -0
  108. package/src/i3s-converter/helpers/attribute-metadata-info.ts +1 -1
  109. package/src/i3s-converter/helpers/batch-ids-extensions.ts +3 -1
  110. package/src/i3s-converter/helpers/coordinate-converter.ts +2 -2
  111. package/src/i3s-converter/helpers/feature-attributes.ts +5 -2
  112. package/src/i3s-converter/helpers/geometry-attributes.ts +6 -5
  113. package/src/i3s-converter/helpers/geometry-converter.ts +118 -72
  114. package/src/i3s-converter/helpers/gltf-attributes.ts +12 -13
  115. package/src/i3s-converter/helpers/node-index-document.ts +18 -10
  116. package/src/i3s-converter/helpers/node-pages.ts +27 -29
  117. package/src/i3s-converter/helpers/preprocess-3d-tiles.ts +1 -0
  118. package/src/i3s-converter/helpers/progress.ts +1 -0
  119. package/src/i3s-converter/helpers/tileset-traversal.ts +22 -13
  120. package/src/i3s-converter/i3s-converter.ts +173 -114
  121. package/src/i3s-converter/json-templates/node.ts +1 -1
  122. package/src/i3s-server/bin/www.ts +6 -4
  123. package/src/i3s-server/controllers/slpk-controller.ts +4 -2
  124. package/src/i3s-server/routes/index.ts +10 -7
  125. package/src/i3s-server/routes/slpk-router.ts +22 -16
  126. package/src/i3s-server/utils/server-utils.ts +6 -4
  127. package/src/lib/utils/cli-utils.ts +2 -0
  128. package/src/lib/utils/conversion-dump.ts +35 -20
  129. package/src/lib/utils/file-utils.ts +11 -11
  130. package/src/lib/utils/statistic-utills.ts +5 -6
  131. package/src/lib/utils/write-queue.ts +2 -2
  132. package/src/slpk-extractor/slpk-extractor.ts +2 -1
  133. package/src/slpk-extractor-cli.ts +16 -8
  134. package/dist/3d-tiles-converter/3d-tiles-converter.js.map +0 -1
  135. package/dist/3d-tiles-converter/helpers/b3dm-converter.js.map +0 -1
  136. package/dist/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js.map +0 -1
  137. package/dist/3d-tiles-converter/helpers/load-i3s.js.map +0 -1
  138. package/dist/3d-tiles-converter/helpers/texture-atlas.js.map +0 -1
  139. package/dist/3d-tiles-converter/json-templates/tileset.js.map +0 -1
  140. package/dist/constants.js.map +0 -1
  141. package/dist/converter-cli.js.map +0 -1
  142. package/dist/deps-installer/deps-installer.js.map +0 -1
  143. package/dist/i3s-converter/helpers/attribute-metadata-info.js.map +0 -1
  144. package/dist/i3s-converter/helpers/batch-ids-extensions.js.map +0 -1
  145. package/dist/i3s-converter/helpers/coordinate-converter.js.map +0 -1
  146. package/dist/i3s-converter/helpers/create-scene-server-path.js.map +0 -1
  147. package/dist/i3s-converter/helpers/feature-attributes.js.map +0 -1
  148. package/dist/i3s-converter/helpers/geometry-attributes.js.map +0 -1
  149. package/dist/i3s-converter/helpers/geometry-converter.js.map +0 -1
  150. package/dist/i3s-converter/helpers/gltf-attributes.js.map +0 -1
  151. package/dist/i3s-converter/helpers/load-3d-tiles.js.map +0 -1
  152. package/dist/i3s-converter/helpers/node-debug.js.map +0 -1
  153. package/dist/i3s-converter/helpers/node-index-document.js.map +0 -1
  154. package/dist/i3s-converter/helpers/node-pages.js.map +0 -1
  155. package/dist/i3s-converter/helpers/preprocess-3d-tiles.js.map +0 -1
  156. package/dist/i3s-converter/helpers/progress.js.map +0 -1
  157. package/dist/i3s-converter/helpers/tileset-traversal.js.map +0 -1
  158. package/dist/i3s-converter/i3s-converter.js.map +0 -1
  159. package/dist/i3s-converter/json-templates/geometry-definitions.js.map +0 -1
  160. package/dist/i3s-converter/json-templates/layers.js.map +0 -1
  161. package/dist/i3s-converter/json-templates/metadata.js.map +0 -1
  162. package/dist/i3s-converter/json-templates/node.js.map +0 -1
  163. package/dist/i3s-converter/json-templates/scene-server.js.map +0 -1
  164. package/dist/i3s-converter/json-templates/shared-resources.js.map +0 -1
  165. package/dist/i3s-converter/json-templates/store.js.map +0 -1
  166. package/dist/i3s-converter/types.js.map +0 -1
  167. package/dist/i3s-server/README.md +0 -63
  168. package/dist/i3s-server/app.js.map +0 -1
  169. package/dist/i3s-server/bin/www.js.map +0 -1
  170. package/dist/i3s-server/certs/cert.pem +0 -19
  171. package/dist/i3s-server/certs/key.pem +0 -27
  172. package/dist/i3s-server/controllers/index-controller.js.map +0 -1
  173. package/dist/i3s-server/controllers/slpk-controller.js.map +0 -1
  174. package/dist/i3s-server/routes/index.js.map +0 -1
  175. package/dist/i3s-server/routes/slpk-router.js.map +0 -1
  176. package/dist/i3s-server/utils/create-scene-server.js.map +0 -1
  177. package/dist/i3s-server/utils/server-utils.js.map +0 -1
  178. package/dist/index.js.map +0 -1
  179. package/dist/lib/json-schemas/conversion-dump-json-schema.js.map +0 -1
  180. package/dist/lib/utils/cli-utils.js.map +0 -1
  181. package/dist/lib/utils/compress-util.js.map +0 -1
  182. package/dist/lib/utils/conversion-dump.js.map +0 -1
  183. package/dist/lib/utils/file-utils.js.map +0 -1
  184. package/dist/lib/utils/geometry-utils.js.map +0 -1
  185. package/dist/lib/utils/lod-conversion-utils.js.map +0 -1
  186. package/dist/lib/utils/queue.js.map +0 -1
  187. package/dist/lib/utils/statistic-utills.js.map +0 -1
  188. package/dist/lib/utils/write-queue.js.map +0 -1
  189. package/dist/pgm-loader.js.map +0 -1
  190. package/dist/slpk-extractor/slpk-extractor.js.map +0 -1
  191. package/dist/slpk-extractor-cli.js.map +0 -1
  192. package/src/lib/utils/statistic-utills.d.ts +0 -25
@@ -2,204 +2,310 @@ import { join } from 'path';
2
2
  import transform from 'json-map-transform';
3
3
  import { METADATA as metadataTemplate } from "../json-templates/metadata.js";
4
4
  import { isFileExists, openJson } from "../../lib/utils/file-utils.js";
5
- export default class NodePages {
6
- constructor(writeFileFunc, nodesPerPage, converter) {
7
- this.nodesPerPage = void 0;
8
- this.nodesCounter = void 0;
9
- this.writeFile = void 0;
10
- this.converter = void 0;
11
- this.nodePages = void 0;
12
- this.length = 0;
13
- this.nodesPerPage = nodesPerPage;
14
- this.nodesCounter = 0;
15
- this.nodePages = [{}];
16
- this.nodePages[0].nodes = [];
17
- this.writeFile = writeFileFunc;
18
- this.converter = converter;
19
- this.length = 0;
20
- }
21
- useWriteFunction(func) {
22
- this.writeFile = func;
23
- }
24
- getNodePageFileName(nodePageId) {
25
- let filePath;
26
- let fileName;
27
- if (this.converter.options.slpk) {
28
- filePath = join(this.converter.layers0Path, 'nodepages');
29
- fileName = `${nodePageId.toString()}.json`;
30
- } else {
31
- filePath = join(this.converter.layers0Path, 'nodepages', nodePageId.toString());
32
- fileName = 'index.json';
33
- }
34
- return {
35
- filePath,
36
- fileName
37
- };
38
- }
39
- async loadNodePage(nodePageId) {
40
- const {
41
- filePath,
42
- fileName
43
- } = this.getNodePageFileName(nodePageId);
44
- const fullName = join(filePath, fileName);
45
- if (await isFileExists(fullName)) {
46
- console.log(`load ${fullName}.`);
47
- return await openJson(filePath, fileName);
48
- } else {
49
- return {
50
- nodes: []
51
- };
52
- }
53
- }
54
- getPageIndexByNodeId(id) {
55
- return Math.floor(id / this.nodesPerPage);
56
- }
57
- async getPageByNodeId(id) {
58
- const pageIndex = this.getPageIndexByNodeId(id);
59
- if (this.converter.options.instantNodeWriting) {
60
- return await this.loadNodePage(pageIndex);
61
- }
62
- return this.nodePages[pageIndex];
63
- }
64
- async getNodeById(id, nodePage) {
65
- const nodeIndex = id % this.nodesPerPage;
66
- nodePage = nodePage || (await this.getPageByNodeId(id));
67
- return nodePage.nodes[nodeIndex];
68
- }
69
- async addChildRelation(parentId, childId) {
70
- var _parentNode$children;
71
- if (parentId === null || parentId === undefined) {
72
- return;
73
- }
74
- const parentNode = await this.getNodeById(parentId);
75
- (_parentNode$children = parentNode.children) === null || _parentNode$children === void 0 ? void 0 : _parentNode$children.push(childId);
76
- await this.saveNode(parentNode);
77
- }
78
- async push(node, parentId) {
79
- node.index = this.nodesCounter++;
80
- if (!this.converter.options.instantNodeWriting) {
81
- let currentNodePage = this.nodePages[this.nodePages.length - 1];
82
- if (currentNodePage.nodes.length === this.nodesPerPage) {
83
- currentNodePage = {
84
- nodes: []
85
- };
86
- this.nodePages.push(currentNodePage);
87
- }
88
- currentNodePage.nodes.push(node);
89
- }
90
- await this.addChildRelation(parentId, node.index);
91
- NodePages.updateResourceInMesh(node);
92
- await this.saveNode(node);
93
- return node;
94
- }
95
- async saveNode(node) {
96
- if (!this.converter.options.instantNodeWriting) {
97
- return;
98
- } else {
99
- const nodePageIndex = this.getPageIndexByNodeId(node.index);
100
- const nodePage = await this.getPageByNodeId(node.index);
101
- const {
102
- filePath,
103
- fileName
104
- } = this.getNodePageFileName(nodePageIndex);
105
- const nodeToUpdate = await this.getNodeById(node.index, nodePage);
106
- if (nodeToUpdate) {
107
- NodePages.updateAll(nodeToUpdate, node);
108
- } else {
109
- nodePage.nodes.push(node);
110
- }
111
- const nodePageStr = JSON.stringify(nodePage);
112
- if (this.converter.options.slpk) {
113
- await this.converter.writeQueue.enqueue({
114
- archiveKey: `nodePages/${nodePageIndex.toString()}.json.gz`,
115
- writePromise: () => this.writeFile(filePath, nodePageStr, fileName, true, this.converter.compressList)
116
- }, true);
117
- } else {
118
- await this.converter.writeQueue.enqueue({
119
- writePromise: () => this.writeFile(filePath, nodePageStr)
120
- }, true);
121
- }
122
- }
123
- }
124
- async saveMetadata() {
125
- const metadata = transform({
126
- nodeCount: this.nodesCounter
127
- }, metadataTemplate());
128
- const compress = false;
129
- await this.converter.writeQueue.enqueue({
130
- archiveKey: 'metadata.json',
131
- writePromise: () => this.writeFile(this.converter.layers0Path, JSON.stringify(metadata), 'metadata.json', compress)
5
+ /**
6
+ * class NodePages - wrapper of nodePages array
7
+ *
8
+ * @example
9
+ * import {writeFile} from './helpers/write-file';
10
+ *
11
+ * // create an instance of the class
12
+ * const nodePages = new NodePages(writeFile, HARDCODED_NODES_PER_PAGE);
13
+ * ...
14
+ * // push root node
15
+ * const parent = await nodePages.push({
16
+ lodThreshold: HARDCODED_MAX_SCREEN_THRESHOLD_SQ,
17
+ obb: coordinates.obb,
18
+ children: []
132
19
  });
133
- }
134
- async save() {
135
- if (this.converter.options.instantNodeWriting) {
136
- await this.saveMetadata();
137
- return;
138
- }
139
- if (this.converter.options.slpk) {
140
- for (const [index, nodePage] of this.nodePages.entries()) {
141
- const nodePageStr = JSON.stringify(nodePage);
142
- const slpkPath = join(this.converter.layers0Path, 'nodepages');
143
- await this.converter.writeQueue.enqueue({
144
- archiveKey: `nodePages/${index.toString()}.json.gz`,
145
- writePromise: () => this.writeFile(slpkPath, nodePageStr, `${index.toString()}.json`)
146
- });
20
+ * ...
21
+ * // push node with parent relation
22
+ * const nodeInPage = {
23
+ lodThreshold: HARDCODED_MAX_SCREEN_THRESHOLD_SQ,
24
+ obb: coordinates.obb,
25
+ children: [],
26
+ mesh: {
27
+ geometry: {
28
+ definition: 0
29
+ }
147
30
  }
148
- await this.saveMetadata();
149
- } else {
150
- for (const [index, nodePage] of this.nodePages.entries()) {
31
+ };
32
+ * const node = await this.nodePages.push(nodeInPage, parent.index);
33
+ * ...
34
+ * // save all the nodePages in the end of pushing all the nodes
35
+ * await this.nodePages.save(layers0path);
36
+ */
37
+ export default class NodePages {
38
+ nodesPerPage;
39
+ nodesCounter;
40
+ writeFile;
41
+ converter;
42
+ nodePages;
43
+ length = 0;
44
+ /**
45
+ * @constructs
46
+ * Create a nodePages instance.
47
+ * @param writeFileFunc - function to save one nodePage into a file
48
+ * @param nodesPerPage - length limit for one nodePage. An additional nodePage is created when this limit is met
49
+ */
50
+ constructor(writeFileFunc, nodesPerPage, converter) {
51
+ this.nodesPerPage = nodesPerPage;
52
+ this.nodesCounter = 0;
53
+ // @ts-expect-error
54
+ this.nodePages = [{}];
55
+ this.nodePages[0].nodes = [];
56
+ this.writeFile = writeFileFunc;
57
+ this.converter = converter;
58
+ this.length = 0;
59
+ }
60
+ /**
61
+ * Setup function to save node pages
62
+ * @param func - function which should be used to save node pages
63
+ */
64
+ useWriteFunction(func) {
65
+ this.writeFile = func;
66
+ }
67
+ /**
68
+ * Get file path and file name of the node page with the particular id
69
+ * @param nodePageId - node page id
70
+ * @returns file path and file name
71
+ */
72
+ getNodePageFileName(nodePageId) {
73
+ let filePath;
74
+ let fileName;
75
+ if (this.converter.options.slpk) {
76
+ filePath = join(this.converter.layers0Path, 'nodepages');
77
+ fileName = `${nodePageId.toString()}.json`;
78
+ }
79
+ else {
80
+ filePath = join(this.converter.layers0Path, 'nodepages', nodePageId.toString());
81
+ fileName = 'index.json';
82
+ }
83
+ return { filePath, fileName };
84
+ }
85
+ /**
86
+ * Load node page from a file on the disk
87
+ * @param nodePageId - node page id
88
+ * @returns - node page data
89
+ */
90
+ async loadNodePage(nodePageId) {
91
+ const { filePath, fileName } = this.getNodePageFileName(nodePageId);
92
+ const fullName = join(filePath, fileName);
93
+ if (await isFileExists(fullName)) {
94
+ console.log(`load ${fullName}.`); // eslint-disable-line
95
+ return (await openJson(filePath, fileName));
96
+ }
97
+ return { nodes: [] };
98
+ }
99
+ /**
100
+ * Get nodepage id by node id
101
+ * @param id node id
102
+ * @returns node page id
103
+ */
104
+ getPageIndexByNodeId(id) {
105
+ return Math.floor(id / this.nodesPerPage);
106
+ }
107
+ /**
108
+ * Get node page data by node id
109
+ * @param id node id
110
+ * @returns node page data
111
+ */
112
+ async getPageByNodeId(id) {
113
+ const pageIndex = this.getPageIndexByNodeId(id);
114
+ if (this.converter.options.instantNodeWriting) {
115
+ return await this.loadNodePage(pageIndex);
116
+ }
117
+ return this.nodePages[pageIndex];
118
+ }
119
+ /**
120
+ * Get the node by its end-to-end index
121
+ * @param id - end-to-end index of the node
122
+ * @return the node object
123
+ */
124
+ async getNodeById(id, nodePage) {
125
+ const nodeIndex = id % this.nodesPerPage;
126
+ nodePage = nodePage || (await this.getPageByNodeId(id));
127
+ return nodePage.nodes[nodeIndex];
128
+ }
129
+ /**
130
+ * Add a child id into the parent node.children array
131
+ * @param parentId - end-to-end parent node index
132
+ * @param childId - end-to-end child node index
133
+ */
134
+ async addChildRelation(parentId, childId) {
135
+ if (parentId === null || parentId === undefined) {
136
+ return;
137
+ }
138
+ const parentNode = await this.getNodeById(parentId);
139
+ parentNode.children?.push(childId);
140
+ await this.saveNode(parentNode);
141
+ }
142
+ /**
143
+ * Put new node in nodePages array
144
+ * @param node - node object
145
+ * @param parentId - index of parent node
146
+ * @return
147
+ */
148
+ async push(node, parentId) {
149
+ node.index = this.nodesCounter++;
150
+ if (!this.converter.options.instantNodeWriting) {
151
+ let currentNodePage = this.nodePages[this.nodePages.length - 1];
152
+ if (currentNodePage.nodes.length === this.nodesPerPage) {
153
+ currentNodePage = { nodes: [] };
154
+ this.nodePages.push(currentNodePage);
155
+ }
156
+ currentNodePage.nodes.push(node);
157
+ }
158
+ await this.addChildRelation(parentId, node.index);
159
+ NodePages.updateResourceInMesh(node);
160
+ await this.saveNode(node);
161
+ return node;
162
+ }
163
+ /**
164
+ * Save node to the file on the disk
165
+ * @param node - node data
166
+ */
167
+ async saveNode(node) {
168
+ if (!this.converter.options.instantNodeWriting) {
169
+ return;
170
+ }
171
+ const nodePageIndex = this.getPageIndexByNodeId(node.index);
172
+ const nodePage = await this.getPageByNodeId(node.index);
173
+ const { filePath, fileName } = this.getNodePageFileName(nodePageIndex);
174
+ const nodeToUpdate = await this.getNodeById(node.index, nodePage);
175
+ if (nodeToUpdate) {
176
+ NodePages.updateAll(nodeToUpdate, node);
177
+ }
178
+ else {
179
+ nodePage.nodes.push(node);
180
+ }
151
181
  const nodePageStr = JSON.stringify(nodePage);
152
- const nodePagePath = join(this.converter.layers0Path, 'nodepages', index.toString());
182
+ if (this.converter.options.slpk) {
183
+ await this.converter.writeQueue.enqueue({
184
+ archiveKey: `nodePages/${nodePageIndex.toString()}.json.gz`,
185
+ writePromise: () => this.writeFile(filePath, nodePageStr, fileName, true, this.converter.compressList)
186
+ }, true);
187
+ }
188
+ else {
189
+ await this.converter.writeQueue.enqueue({
190
+ writePromise: () => this.writeFile(filePath, nodePageStr)
191
+ }, true);
192
+ }
193
+ }
194
+ /**
195
+ * Save metadata file (for slpk only)
196
+ */
197
+ async saveMetadata() {
198
+ const metadata = transform({ nodeCount: this.nodesCounter }, metadataTemplate());
199
+ const compress = false;
153
200
  await this.converter.writeQueue.enqueue({
154
- writePromise: () => this.writeFile(nodePagePath, nodePageStr)
201
+ archiveKey: 'metadata.json',
202
+ writePromise: () => this.writeFile(this.converter.layers0Path, JSON.stringify(metadata), 'metadata.json', compress)
155
203
  });
156
- }
157
204
  }
158
- }
159
- static updateResourceInMesh(node) {
160
- if (node.mesh && isFinite(node.index)) {
161
- node.mesh.geometry.resource = node.index;
205
+ /**
206
+ * Save all the node pages
207
+ * Run this method when all nodes is pushed in nodePages
208
+ */
209
+ async save() {
210
+ if (this.converter.options.instantNodeWriting) {
211
+ await this.saveMetadata();
212
+ return;
213
+ }
214
+ if (this.converter.options.slpk) {
215
+ for (const [index, nodePage] of this.nodePages.entries()) {
216
+ const nodePageStr = JSON.stringify(nodePage);
217
+ const slpkPath = join(this.converter.layers0Path, 'nodepages');
218
+ await this.converter.writeQueue.enqueue({
219
+ archiveKey: `nodePages/${index.toString()}.json.gz`,
220
+ writePromise: () => this.writeFile(slpkPath, nodePageStr, `${index.toString()}.json`)
221
+ });
222
+ }
223
+ await this.saveMetadata();
224
+ }
225
+ else {
226
+ for (const [index, nodePage] of this.nodePages.entries()) {
227
+ const nodePageStr = JSON.stringify(nodePage);
228
+ const nodePagePath = join(this.converter.layers0Path, 'nodepages', index.toString());
229
+ await this.converter.writeQueue.enqueue({
230
+ writePromise: () => this.writeFile(nodePagePath, nodePageStr)
231
+ });
232
+ }
233
+ }
234
+ }
235
+ /**
236
+ * Update resource index in node.mesh object
237
+ * @param node - node object
238
+ */
239
+ static updateResourceInMesh(node) {
240
+ if (node.mesh && isFinite(node.index)) {
241
+ node.mesh.geometry.resource = node.index;
242
+ }
243
+ }
244
+ /**
245
+ * Update all fields in the node excluding id
246
+ * @param node - node object
247
+ * @param data - NodeInPage data to replace original data
248
+ */
249
+ static updateAll(node, data) {
250
+ Object.assign(node, data, { index: node.index });
251
+ NodePages.updateResourceInMesh(node);
252
+ return node;
253
+ }
254
+ /**
255
+ * Update material in node.mesh object by node id
256
+ * @param id - end-to-end index of the node
257
+ * @param materialId - id from scene layer materialDefinitions
258
+ */
259
+ static updateMaterialByNodeId(node, materialId) {
260
+ if (!node.mesh) {
261
+ return;
262
+ }
263
+ node.mesh.material = {
264
+ definition: materialId,
265
+ resource: node.index
266
+ };
267
+ }
268
+ /**
269
+ * Update vertexCount in node.mesh.geometry object by node id
270
+ * @param id - end-to-end index of the node
271
+ * @param vertexCount - vertex count for particular node
272
+ */
273
+ static updateVertexCountByNodeId(node, vertexCount) {
274
+ if (!node.mesh) {
275
+ return;
276
+ }
277
+ node.mesh.geometry.vertexCount = vertexCount;
278
+ }
279
+ /**
280
+ * Update resource in node.mesh.attribute object by node id
281
+ * @param node - node object
282
+ */
283
+ static updateNodeAttributeByNodeId(node) {
284
+ if (!node.mesh || !node.index) {
285
+ return;
286
+ }
287
+ node.mesh.attribute.resource = node.index;
288
+ }
289
+ /**
290
+ * Update featureCount in node.mesh.geometry object by node id
291
+ * @param node - node object
292
+ * @param featureCount - features count of the node
293
+ */
294
+ static updateFeatureCountByNodeId(node, featureCount) {
295
+ if (!node.mesh) {
296
+ return;
297
+ }
298
+ node.mesh.geometry.featureCount = featureCount;
299
+ }
300
+ /**
301
+ * Update texelCountHint in node.mesh.material object by node id
302
+ * @param node - node object
303
+ * @param texelCountHint - texelCountHint of particular node
304
+ */
305
+ static updateTexelCountHintByNodeId(node, texelCountHint) {
306
+ if (!node.mesh || !node.mesh.material) {
307
+ return;
308
+ }
309
+ node.mesh.material.texelCountHint = texelCountHint;
162
310
  }
163
- }
164
- static updateAll(node, data) {
165
- Object.assign(node, data, {
166
- index: node.index
167
- });
168
- NodePages.updateResourceInMesh(node);
169
- return node;
170
- }
171
- static updateMaterialByNodeId(node, materialId) {
172
- if (!node.mesh) {
173
- return;
174
- }
175
- node.mesh.material = {
176
- definition: materialId,
177
- resource: node.index
178
- };
179
- }
180
- static updateVertexCountByNodeId(node, vertexCount) {
181
- if (!node.mesh) {
182
- return;
183
- }
184
- node.mesh.geometry.vertexCount = vertexCount;
185
- }
186
- static updateNodeAttributeByNodeId(node) {
187
- if (!node.mesh || !node.index) {
188
- return;
189
- }
190
- node.mesh.attribute.resource = node.index;
191
- }
192
- static updateFeatureCountByNodeId(node, featureCount) {
193
- if (!node.mesh) {
194
- return;
195
- }
196
- node.mesh.geometry.featureCount = featureCount;
197
- }
198
- static updateTexelCountHintByNodeId(node, texelCountHint) {
199
- if (!node.mesh || !node.mesh.material) {
200
- return;
201
- }
202
- node.mesh.material.texelCountHint = texelCountHint;
203
- }
204
311
  }
205
- //# sourceMappingURL=node-pages.js.map
@@ -1,5 +1,5 @@
1
1
  import { Tiles3DTileContent } from '@loaders.gl/3d-tiles';
2
- import { GLTFPrimitiveModeString, PreprocessData } from '../types';
2
+ import { GLTFPrimitiveModeString, PreprocessData } from "../types.js";
3
3
  /**
4
4
  * glTF primitive modes
5
5
  * @see https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#_mesh_primitive_mode
@@ -1 +1 @@
1
- {"version":3,"file":"preprocess-3d-tiles.d.ts","sourceRoot":"","sources":["../../../src/i3s-converter/helpers/preprocess-3d-tiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAC,uBAAuB,EAAE,cAAc,EAAC,MAAM,UAAU,CAAC;AAWjE;;;GAGG;AACH,eAAO,MAAM,oBAAoB,2BAQhC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,gBAChB,kBAAkB,GAAG,IAAI,KACrC,QAAQ,cAAc,CAuBxB,CAAC;AAwDF;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,YAAa,cAAc,WAAW,cAAc,KAAG,IAUtF,CAAC"}
1
+ {"version":3,"file":"preprocess-3d-tiles.d.ts","sourceRoot":"","sources":["../../../src/i3s-converter/helpers/preprocess-3d-tiles.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAC,uBAAuB,EAAE,cAAc,EAAC,oBAAiB;AAWjE;;;GAGG;AACH,eAAO,MAAM,oBAAoB,2BAQhC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,gBAChB,kBAAkB,GAAG,IAAI,KACrC,QAAQ,cAAc,CAuBxB,CAAC;AAwDF;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,YAAa,cAAc,WAAW,cAAc,KAAG,IAUtF,CAAC"}
@@ -2,72 +2,104 @@ import { GLTFPrimitiveModeString } from "../types.js";
2
2
  import { EXT_STRUCTURAL_METADATA, GLTFLoader } from '@loaders.gl/gltf';
3
3
  import { parse } from '@loaders.gl/core';
4
4
  import { EXT_FEATURE_METADATA } from '@loaders.gl/gltf';
5
- export const GLTF_PRIMITIVE_MODES = [GLTFPrimitiveModeString.POINTS, GLTFPrimitiveModeString.LINES, GLTFPrimitiveModeString.LINE_LOOP, GLTFPrimitiveModeString.LINE_STRIP, GLTFPrimitiveModeString.TRIANGLES, GLTFPrimitiveModeString.TRIANGLE_STRIP, GLTFPrimitiveModeString.TRIANGLE_FAN];
6
- export const analyzeTileContent = async tileContent => {
7
- const defaultResult = {
8
- meshTopologyTypes: new Set(),
9
- metadataClasses: new Set()
10
- };
11
- if (!(tileContent !== null && tileContent !== void 0 && tileContent.gltfArrayBuffer)) {
12
- return defaultResult;
13
- }
14
- const gltfData = await parse(tileContent.gltfArrayBuffer, GLTFLoader, {
15
- gltf: {
16
- normalize: false,
17
- loadBuffers: false,
18
- loadImages: false,
19
- decompressMeshes: false
5
+ /**
6
+ * glTF primitive modes
7
+ * @see https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#_mesh_primitive_mode
8
+ */
9
+ export const GLTF_PRIMITIVE_MODES = [
10
+ GLTFPrimitiveModeString.POINTS, // 0
11
+ GLTFPrimitiveModeString.LINES, // 1
12
+ GLTFPrimitiveModeString.LINE_LOOP, // 2
13
+ GLTFPrimitiveModeString.LINE_STRIP, // 3
14
+ GLTFPrimitiveModeString.TRIANGLES, // 4
15
+ GLTFPrimitiveModeString.TRIANGLE_STRIP, // 5
16
+ GLTFPrimitiveModeString.TRIANGLE_FAN // 6
17
+ ];
18
+ /**
19
+ * Analyze tile content. This function is used during preprocess stage of
20
+ * conversion
21
+ * @param tileContent - 3DTiles tile content ArrayBuffer
22
+ * @returns
23
+ */
24
+ export const analyzeTileContent = async (tileContent) => {
25
+ const defaultResult = {
26
+ meshTopologyTypes: new Set(),
27
+ metadataClasses: new Set()
28
+ };
29
+ if (!tileContent?.gltfArrayBuffer) {
30
+ return defaultResult;
20
31
  }
21
- });
22
- const gltf = gltfData.json;
23
- if (!gltf) {
24
- return defaultResult;
25
- }
26
- const meshTopologyTypes = getMeshTypesFromGLTF(gltf);
27
- const metadataClasses = getMetadataClassesFromGLTF(gltf);
28
- return {
29
- meshTopologyTypes,
30
- metadataClasses
31
- };
32
+ const gltfData = await parse(tileContent.gltfArrayBuffer, GLTFLoader, {
33
+ gltf: { normalize: false, loadBuffers: false, loadImages: false, decompressMeshes: false }
34
+ });
35
+ const gltf = gltfData.json;
36
+ if (!gltf) {
37
+ return defaultResult;
38
+ }
39
+ const meshTopologyTypes = getMeshTypesFromGLTF(gltf);
40
+ const metadataClasses = getMetadataClassesFromGLTF(gltf);
41
+ return {
42
+ meshTopologyTypes,
43
+ metadataClasses
44
+ };
32
45
  };
33
- const getMeshTypesFromGLTF = gltfJson => {
34
- const result = new Set();
35
- for (const mesh of gltfJson.meshes || []) {
36
- for (const primitive of mesh.primitives) {
37
- let {
38
- mode
39
- } = primitive;
40
- if (typeof mode !== 'number') {
41
- mode = 4;
42
- }
43
- result.add(GLTF_PRIMITIVE_MODES[mode]);
46
+ /**
47
+ * Get mesh topology types that the glb content has
48
+ * @param gltfJson - JSON part of GLB content
49
+ * @returns array of mesh types found
50
+ */
51
+ const getMeshTypesFromGLTF = (gltfJson) => {
52
+ const result = new Set();
53
+ for (const mesh of gltfJson.meshes || []) {
54
+ for (const primitive of mesh.primitives) {
55
+ let { mode } = primitive;
56
+ if (typeof mode !== 'number') {
57
+ mode = 4; // Default is 4 - TRIANGLES
58
+ }
59
+ result.add(GLTF_PRIMITIVE_MODES[mode]);
60
+ }
44
61
  }
45
- }
46
- return result;
62
+ return result;
47
63
  };
48
- const getMetadataClassesFromGLTF = gltfJson => {
49
- var _gltfJson$extensions, _gltfJson$extensions$, _gltfJson$extensions$2, _gltfJson$extensions2, _gltfJson$extensions3, _gltfJson$extensions4;
50
- const result = new Set();
51
- const extFeatureMetadataClasses = (_gltfJson$extensions = gltfJson.extensions) === null || _gltfJson$extensions === void 0 ? void 0 : (_gltfJson$extensions$ = _gltfJson$extensions[EXT_FEATURE_METADATA]) === null || _gltfJson$extensions$ === void 0 ? void 0 : (_gltfJson$extensions$2 = _gltfJson$extensions$.schema) === null || _gltfJson$extensions$2 === void 0 ? void 0 : _gltfJson$extensions$2.classes;
52
- if (extFeatureMetadataClasses) {
53
- for (const classKey of Object.keys(extFeatureMetadataClasses)) {
54
- result.add(classKey);
64
+ /**
65
+ * Get feature metadata classes from glTF
66
+ * The tileset might contain multiple metadata classes provided by EXT_feature_metadata and EXT_structural_metadata extensions.
67
+ * Every class is a set of properties. But I3S can consume only one set of properties.
68
+ * On the pre-process we collect all classes from the tileset in order to show the prompt to select one class for conversion to I3S.
69
+ * @param gltfJson - JSON part of GLB content
70
+ * @returns array of classes
71
+ */
72
+ const getMetadataClassesFromGLTF = (gltfJson) => {
73
+ const result = new Set();
74
+ // Try to parse from EXT_feature_metadata
75
+ const extFeatureMetadataClasses = gltfJson.extensions?.[EXT_FEATURE_METADATA]?.schema?.classes;
76
+ if (extFeatureMetadataClasses) {
77
+ for (const classKey of Object.keys(extFeatureMetadataClasses)) {
78
+ result.add(classKey);
79
+ }
55
80
  }
56
- }
57
- const extStructuralMetadataClasses = (_gltfJson$extensions2 = gltfJson.extensions) === null || _gltfJson$extensions2 === void 0 ? void 0 : (_gltfJson$extensions3 = _gltfJson$extensions2[EXT_STRUCTURAL_METADATA]) === null || _gltfJson$extensions3 === void 0 ? void 0 : (_gltfJson$extensions4 = _gltfJson$extensions3.schema) === null || _gltfJson$extensions4 === void 0 ? void 0 : _gltfJson$extensions4.classes;
58
- if (extStructuralMetadataClasses) {
59
- for (const classKey of Object.keys(extStructuralMetadataClasses)) {
60
- result.add(classKey);
81
+ // Try to parse from EXT_structural_metadata
82
+ const extStructuralMetadataClasses = gltfJson.extensions?.[EXT_STRUCTURAL_METADATA]?.schema?.classes;
83
+ if (extStructuralMetadataClasses) {
84
+ for (const classKey of Object.keys(extStructuralMetadataClasses)) {
85
+ result.add(classKey);
86
+ }
61
87
  }
62
- }
63
- return result;
88
+ return result;
64
89
  };
90
+ /**
91
+ * Merge object2 into object1
92
+ * @param object1
93
+ * @param object2
94
+ * @returns nothing
95
+ */
65
96
  export const mergePreprocessData = (object1, object2) => {
66
- for (const type of object2.meshTopologyTypes) {
67
- object1.meshTopologyTypes.add(type);
68
- }
69
- for (const metadataClass of object2.metadataClasses) {
70
- object1.metadataClasses.add(metadataClass);
71
- }
97
+ // Merge topology mesh types info
98
+ for (const type of object2.meshTopologyTypes) {
99
+ object1.meshTopologyTypes.add(type);
100
+ }
101
+ // Merge feature metadata classes
102
+ for (const metadataClass of object2.metadataClasses) {
103
+ object1.metadataClasses.add(metadataClass);
104
+ }
72
105
  };
73
- //# sourceMappingURL=preprocess-3d-tiles.js.map