@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.
- package/dist/3d-tiles-attributes-worker.d.ts +3 -3
- package/dist/3d-tiles-attributes-worker.d.ts.map +1 -1
- package/dist/3d-tiles-attributes-worker.js +2 -3
- package/dist/3d-tiles-attributes-worker.js.map +3 -3
- package/dist/3d-tiles-converter/3d-tiles-converter.d.ts +8 -0
- package/dist/3d-tiles-converter/3d-tiles-converter.d.ts.map +1 -1
- package/dist/3d-tiles-converter/3d-tiles-converter.js +57 -43
- package/dist/3d-tiles-converter/helpers/b3dm-converter.d.ts +5 -5
- package/dist/3d-tiles-converter/helpers/b3dm-converter.d.ts.map +1 -1
- package/dist/3d-tiles-converter/helpers/b3dm-converter.js +21 -17
- package/dist/converter-cli.js +43 -8
- package/dist/converter.min.js +24 -21
- package/dist/deps-installer/deps-installer.d.ts +5 -1
- package/dist/deps-installer/deps-installer.d.ts.map +1 -1
- package/dist/deps-installer/deps-installer.js +29 -1
- package/dist/dist.min.js +58405 -61237
- package/dist/es5/3d-tiles-attributes-worker.js +4 -7
- package/dist/es5/3d-tiles-attributes-worker.js.map +1 -1
- package/dist/es5/3d-tiles-converter/3d-tiles-converter.js +125 -210
- package/dist/es5/3d-tiles-converter/3d-tiles-converter.js.map +1 -1
- package/dist/es5/3d-tiles-converter/helpers/b3dm-converter.js +53 -85
- package/dist/es5/3d-tiles-converter/helpers/b3dm-converter.js.map +1 -1
- package/dist/es5/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js +0 -8
- package/dist/es5/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js.map +1 -1
- package/dist/es5/3d-tiles-converter/helpers/texture-atlas.js +0 -5
- package/dist/es5/3d-tiles-converter/helpers/texture-atlas.js.map +1 -1
- package/dist/es5/3d-tiles-converter/json-templates/tileset.js +0 -6
- package/dist/es5/3d-tiles-converter/json-templates/tileset.js.map +1 -1
- package/dist/es5/bundle.js +0 -1
- package/dist/es5/bundle.js.map +1 -1
- package/dist/es5/constants.js.map +1 -1
- package/dist/es5/converter-cli.js +50 -60
- package/dist/es5/converter-cli.js.map +1 -1
- package/dist/es5/deps-installer/deps-installer.js +73 -28
- package/dist/es5/deps-installer/deps-installer.js.map +1 -1
- package/dist/es5/i3s-attributes-worker.js +3 -6
- package/dist/es5/i3s-attributes-worker.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/batch-ids-extensions.js +124 -0
- package/dist/es5/i3s-converter/helpers/batch-ids-extensions.js.map +1 -0
- package/dist/es5/i3s-converter/helpers/coordinate-converter.js +2 -19
- package/dist/es5/i3s-converter/helpers/coordinate-converter.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/create-scene-server-path.js +0 -11
- package/dist/es5/i3s-converter/helpers/create-scene-server-path.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/feature-attributes.js +184 -0
- package/dist/es5/i3s-converter/helpers/feature-attributes.js.map +1 -0
- package/dist/es5/i3s-converter/helpers/geometry-attributes.js +60 -51
- package/dist/es5/i3s-converter/helpers/geometry-attributes.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/geometry-converter.js +516 -356
- package/dist/es5/i3s-converter/helpers/geometry-converter.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/gltf-attributes.js +57 -43
- package/dist/es5/i3s-converter/helpers/gltf-attributes.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/node-debug.js +4 -23
- package/dist/es5/i3s-converter/helpers/node-debug.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/node-index-document.js +507 -0
- package/dist/es5/i3s-converter/helpers/node-index-document.js.map +1 -0
- package/dist/es5/i3s-converter/helpers/node-pages.js +462 -208
- package/dist/es5/i3s-converter/helpers/node-pages.js.map +1 -1
- package/dist/es5/i3s-converter/i3s-converter.js +722 -1153
- 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 -107
- package/dist/es5/i3s-converter/json-templates/layers.js.map +1 -1
- package/dist/es5/i3s-converter/json-templates/metadata.js +0 -2
- package/dist/es5/i3s-converter/json-templates/metadata.js.map +1 -1
- package/dist/es5/i3s-converter/json-templates/node.js +2 -12
- package/dist/es5/i3s-converter/json-templates/node.js.map +1 -1
- package/dist/es5/i3s-converter/json-templates/scene-server.js +0 -2
- package/dist/es5/i3s-converter/json-templates/scene-server.js.map +1 -1
- package/dist/es5/i3s-converter/json-templates/shared-resources.js +9 -32
- package/dist/es5/i3s-converter/json-templates/shared-resources.js.map +1 -1
- package/dist/es5/i3s-converter/json-templates/store.js.map +1 -1
- package/dist/es5/i3s-converter/types.js.map +1 -1
- package/dist/es5/i3s-server/app.js +0 -5
- package/dist/es5/i3s-server/app.js.map +1 -1
- package/dist/es5/i3s-server/controllers/index-controller.js +0 -16
- package/dist/es5/i3s-server/controllers/index-controller.js.map +1 -1
- package/dist/es5/i3s-server/routes/index.js +1 -10
- package/dist/es5/i3s-server/routes/index.js.map +1 -1
- package/dist/es5/index.js +0 -3
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/lib/utils/compress-util.js +19 -74
- package/dist/es5/lib/utils/compress-util.js.map +1 -1
- package/dist/es5/lib/utils/file-utils.js +103 -47
- package/dist/es5/lib/utils/file-utils.js.map +1 -1
- package/dist/es5/lib/utils/lod-conversion-utils.js +0 -7
- package/dist/es5/lib/utils/lod-conversion-utils.js.map +1 -1
- package/dist/es5/lib/utils/queue.js +0 -14
- package/dist/es5/lib/utils/queue.js.map +1 -1
- package/dist/es5/lib/utils/statistic-utills.js +1 -46
- package/dist/es5/lib/utils/statistic-utills.js.map +1 -1
- package/dist/es5/lib/utils/write-queue.js +41 -82
- package/dist/es5/lib/utils/write-queue.js.map +1 -1
- package/dist/es5/pgm-loader.js +1 -8
- package/dist/es5/pgm-loader.js.map +1 -1
- package/dist/es5/workers/3d-tiles-attributes-worker.js +2 -9
- package/dist/es5/workers/3d-tiles-attributes-worker.js.map +1 -1
- package/dist/es5/workers/i3s-attributes-worker.js +2 -10
- package/dist/es5/workers/i3s-attributes-worker.js.map +1 -1
- package/dist/esm/3d-tiles-attributes-worker.js +4 -2
- package/dist/esm/3d-tiles-attributes-worker.js.map +1 -1
- package/dist/esm/3d-tiles-converter/3d-tiles-converter.js +60 -77
- package/dist/esm/3d-tiles-converter/3d-tiles-converter.js.map +1 -1
- package/dist/esm/3d-tiles-converter/helpers/b3dm-converter.js +29 -50
- package/dist/esm/3d-tiles-converter/helpers/b3dm-converter.js.map +1 -1
- package/dist/esm/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js +1 -0
- package/dist/esm/3d-tiles-converter/helpers/i3s-obb-to-3d-tiles-obb.js.map +1 -1
- package/dist/esm/3d-tiles-converter/helpers/texture-atlas.js +1 -4
- package/dist/esm/3d-tiles-converter/helpers/texture-atlas.js.map +1 -1
- package/dist/esm/3d-tiles-converter/json-templates/tileset.js +0 -3
- package/dist/esm/3d-tiles-converter/json-templates/tileset.js.map +1 -1
- package/dist/esm/bundle.js +1 -1
- package/dist/esm/bundle.js.map +1 -1
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/converter-cli.js +46 -40
- package/dist/esm/converter-cli.js.map +1 -1
- package/dist/esm/deps-installer/deps-installer.js +30 -4
- package/dist/esm/deps-installer/deps-installer.js.map +1 -1
- package/dist/esm/i3s-attributes-worker.js +3 -1
- package/dist/esm/i3s-attributes-worker.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/batch-ids-extensions.js +113 -0
- package/dist/esm/i3s-converter/helpers/batch-ids-extensions.js.map +1 -0
- package/dist/esm/i3s-converter/helpers/coordinate-converter.js +5 -6
- package/dist/esm/i3s-converter/helpers/coordinate-converter.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/create-scene-server-path.js +1 -0
- package/dist/esm/i3s-converter/helpers/create-scene-server-path.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/feature-attributes.js +158 -0
- package/dist/esm/i3s-converter/helpers/feature-attributes.js.map +1 -0
- package/dist/esm/i3s-converter/helpers/geometry-attributes.js +39 -33
- package/dist/esm/i3s-converter/helpers/geometry-attributes.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/geometry-converter.js +295 -196
- package/dist/esm/i3s-converter/helpers/geometry-converter.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/gltf-attributes.js +59 -34
- package/dist/esm/i3s-converter/helpers/gltf-attributes.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/node-debug.js +3 -13
- package/dist/esm/i3s-converter/helpers/node-debug.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/node-index-document.js +197 -0
- package/dist/esm/i3s-converter/helpers/node-index-document.js.map +1 -0
- package/dist/esm/i3s-converter/helpers/node-pages.js +161 -87
- package/dist/esm/i3s-converter/helpers/node-pages.js.map +1 -1
- package/dist/esm/i3s-converter/i3s-converter.js +216 -491
- 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 -95
- package/dist/esm/i3s-converter/json-templates/layers.js.map +1 -1
- package/dist/esm/i3s-converter/json-templates/metadata.js.map +1 -1
- package/dist/esm/i3s-converter/json-templates/node.js +0 -4
- package/dist/esm/i3s-converter/json-templates/node.js.map +1 -1
- package/dist/esm/i3s-converter/json-templates/scene-server.js.map +1 -1
- package/dist/esm/i3s-converter/json-templates/shared-resources.js +3 -15
- package/dist/esm/i3s-converter/json-templates/shared-resources.js.map +1 -1
- package/dist/esm/i3s-converter/json-templates/store.js.map +1 -1
- package/dist/esm/i3s-converter/types.js.map +1 -1
- package/dist/esm/i3s-server/app.js +0 -5
- package/dist/esm/i3s-server/app.js.map +1 -1
- package/dist/esm/i3s-server/controllers/index-controller.js +0 -5
- package/dist/esm/i3s-server/controllers/index-controller.js.map +1 -1
- package/dist/esm/i3s-server/routes/index.js +0 -3
- package/dist/esm/i3s-server/routes/index.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/utils/compress-util.js +19 -12
- package/dist/esm/lib/utils/compress-util.js.map +1 -1
- package/dist/esm/lib/utils/file-utils.js +54 -11
- package/dist/esm/lib/utils/file-utils.js.map +1 -1
- package/dist/esm/lib/utils/lod-conversion-utils.js +2 -6
- package/dist/esm/lib/utils/lod-conversion-utils.js.map +1 -1
- package/dist/esm/lib/utils/queue.js +0 -4
- package/dist/esm/lib/utils/queue.js.map +1 -1
- package/dist/esm/lib/utils/statistic-utills.js +0 -11
- package/dist/esm/lib/utils/statistic-utills.js.map +1 -1
- package/dist/esm/lib/utils/write-queue.js +27 -38
- package/dist/esm/lib/utils/write-queue.js.map +1 -1
- package/dist/esm/pgm-loader.js +3 -1
- package/dist/esm/pgm-loader.js.map +1 -1
- package/dist/esm/workers/3d-tiles-attributes-worker.js +4 -1
- package/dist/esm/workers/3d-tiles-attributes-worker.js.map +1 -1
- package/dist/esm/workers/i3s-attributes-worker.js +4 -1
- package/dist/esm/workers/i3s-attributes-worker.js.map +1 -1
- package/dist/i3s-attributes-worker.d.ts +7 -3
- package/dist/i3s-attributes-worker.d.ts.map +1 -1
- package/dist/i3s-attributes-worker.js +2 -3
- package/dist/i3s-attributes-worker.js.map +3 -3
- package/dist/i3s-converter/helpers/batch-ids-extensions.d.ts +11 -0
- package/dist/i3s-converter/helpers/batch-ids-extensions.d.ts.map +1 -0
- package/dist/i3s-converter/helpers/batch-ids-extensions.js +141 -0
- package/dist/i3s-converter/helpers/coordinate-converter.d.ts +2 -2
- package/dist/i3s-converter/helpers/coordinate-converter.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/feature-attributes.d.ts +56 -0
- package/dist/i3s-converter/helpers/feature-attributes.d.ts.map +1 -0
- package/dist/i3s-converter/helpers/feature-attributes.js +216 -0
- package/dist/i3s-converter/helpers/geometry-attributes.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/geometry-attributes.js +42 -17
- package/dist/i3s-converter/helpers/geometry-converter.d.ts +18 -6
- package/dist/i3s-converter/helpers/geometry-converter.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/geometry-converter.js +349 -99
- package/dist/i3s-converter/helpers/gltf-attributes.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/gltf-attributes.js +53 -21
- package/dist/i3s-converter/helpers/node-index-document.d.ts +91 -0
- package/dist/i3s-converter/helpers/node-index-document.d.ts.map +1 -0
- package/dist/i3s-converter/helpers/node-index-document.js +242 -0
- package/dist/i3s-converter/helpers/node-pages.d.ts +81 -42
- package/dist/i3s-converter/helpers/node-pages.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/node-pages.js +200 -92
- package/dist/i3s-converter/i3s-converter.d.ts +52 -108
- package/dist/i3s-converter/i3s-converter.d.ts.map +1 -1
- package/dist/i3s-converter/i3s-converter.js +218 -403
- 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 +38 -8
- 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 +19 -3
- package/dist/lib/utils/write-queue.d.ts.map +1 -1
- package/dist/lib/utils/write-queue.js +21 -16
- package/dist/pgm-loader.d.ts.map +1 -1
- package/dist/pgm-loader.js +2 -1
- package/dist/workers/3d-tiles-attributes-worker.js +1 -1
- package/dist/workers/i3s-attributes-worker.js +1 -1
- package/package.json +18 -16
- package/src/3d-tiles-attributes-worker.ts +1 -1
- package/src/3d-tiles-converter/3d-tiles-converter.ts +71 -55
- package/src/3d-tiles-converter/helpers/b3dm-converter.ts +25 -18
- package/src/converter-cli.ts +54 -8
- package/src/deps-installer/deps-installer.ts +38 -2
- package/src/i3s-attributes-worker.ts +5 -1
- package/src/i3s-converter/helpers/batch-ids-extensions.ts +206 -0
- package/src/i3s-converter/helpers/coordinate-converter.ts +2 -2
- package/src/i3s-converter/helpers/feature-attributes.ts +247 -0
- package/src/i3s-converter/helpers/geometry-attributes.ts +46 -18
- package/src/i3s-converter/helpers/geometry-converter.ts +423 -111
- package/src/i3s-converter/helpers/gltf-attributes.ts +59 -24
- package/src/i3s-converter/helpers/node-index-document.ts +306 -0
- package/src/i3s-converter/helpers/node-pages.ts +222 -109
- package/src/i3s-converter/i3s-converter.ts +264 -487
- 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 +33 -2
- package/src/lib/utils/file-utils.ts +62 -7
- package/src/lib/utils/write-queue.ts +42 -19
- package/src/pgm-loader.ts +2 -2
- package/src/workers/3d-tiles-attributes-worker.ts +1 -1
- package/src/workers/i3s-attributes-worker.ts +2 -1
|
@@ -11,30 +11,22 @@ import { convertScreenThresholdToGeometricError } from '../lib/utils/lod-convers
|
|
|
11
11
|
import { writeFile, removeDir } from '../lib/utils/file-utils';
|
|
12
12
|
import { calculateFilesSize, timeConverter } from '../lib/utils/statistic-utills';
|
|
13
13
|
import { TILESET as tilesetTemplate } from './json-templates/tileset';
|
|
14
|
-
import B3dmConverter from './helpers/b3dm-converter';
|
|
15
14
|
import { createObbFromMbs } from '../i3s-converter/helpers/coordinate-converter';
|
|
16
|
-
import { Tile3dAttributesWorker } from '../3d-tiles-attributes-worker';
|
|
15
|
+
import { Tile3dAttributesWorker, transform3DTilesAttributesOnWorker } from '../3d-tiles-attributes-worker';
|
|
17
16
|
import { getWorkerURL, WorkerFarm } from '@loaders.gl/worker-utils';
|
|
18
17
|
import { BROWSER_ERROR_MESSAGE } from '../constants';
|
|
19
18
|
const I3S = 'I3S';
|
|
19
|
+
|
|
20
20
|
export default class Tiles3DConverter {
|
|
21
21
|
constructor() {
|
|
22
22
|
_defineProperty(this, "options", void 0);
|
|
23
|
-
|
|
24
23
|
_defineProperty(this, "tilesetPath", void 0);
|
|
25
|
-
|
|
26
24
|
_defineProperty(this, "vertexCounter", void 0);
|
|
27
|
-
|
|
28
25
|
_defineProperty(this, "conversionStartTime", void 0);
|
|
29
|
-
|
|
30
26
|
_defineProperty(this, "geoidHeightModel", void 0);
|
|
31
|
-
|
|
32
27
|
_defineProperty(this, "sourceTileset", void 0);
|
|
33
|
-
|
|
34
28
|
_defineProperty(this, "attributeStorageInfo", void 0);
|
|
35
|
-
|
|
36
29
|
_defineProperty(this, "workerSource", {});
|
|
37
|
-
|
|
38
30
|
this.options = {};
|
|
39
31
|
this.tilesetPath = '';
|
|
40
32
|
this.vertexCounter = 0;
|
|
@@ -50,7 +42,6 @@ export default class Tiles3DConverter {
|
|
|
50
42
|
console.log(BROWSER_ERROR_MESSAGE);
|
|
51
43
|
return BROWSER_ERROR_MESSAGE;
|
|
52
44
|
}
|
|
53
|
-
|
|
54
45
|
const {
|
|
55
46
|
inputUrl,
|
|
56
47
|
outputPath,
|
|
@@ -65,10 +56,16 @@ export default class Tiles3DConverter {
|
|
|
65
56
|
console.log('Loading egm file...');
|
|
66
57
|
this.geoidHeightModel = await load(egmFilePath, PGMLoader);
|
|
67
58
|
console.log('Loading egm file completed!');
|
|
59
|
+
|
|
68
60
|
await this.loadWorkers();
|
|
69
61
|
const sourceTilesetJson = await load(inputUrl, I3SLoader, {});
|
|
70
62
|
this.sourceTileset = new Tileset3D(sourceTilesetJson, {
|
|
71
63
|
loadOptions: {
|
|
64
|
+
_nodeWorkers: true,
|
|
65
|
+
reuseWorkers: true,
|
|
66
|
+
'i3s-content-nodejs': {
|
|
67
|
+
workerUrl: './modules/i3s/dist/i3s-content-nodejs-worker.js'
|
|
68
|
+
},
|
|
72
69
|
i3s: {
|
|
73
70
|
coordinateSystem: COORDINATE_SYSTEM.LNGLAT_OFFSETS,
|
|
74
71
|
decodeTextures: false
|
|
@@ -77,18 +74,15 @@ export default class Tiles3DConverter {
|
|
|
77
74
|
});
|
|
78
75
|
await this.sourceTileset.tilesetInitializationPromise;
|
|
79
76
|
const rootNode = this.sourceTileset.root;
|
|
80
|
-
|
|
81
77
|
if (!rootNode.header.obb) {
|
|
82
78
|
rootNode.header.obb = createObbFromMbs(rootNode.header.mbs);
|
|
83
79
|
}
|
|
84
|
-
|
|
85
80
|
this.tilesetPath = join("".concat(outputPath), "".concat(tilesetName));
|
|
86
81
|
this.attributeStorageInfo = sourceTilesetJson.attributeStorageInfo;
|
|
87
|
-
|
|
88
82
|
try {
|
|
89
83
|
await removeDir(this.tilesetPath);
|
|
90
|
-
} catch (e) {
|
|
91
|
-
|
|
84
|
+
} catch (e) {
|
|
85
|
+
}
|
|
92
86
|
const rootTile = {
|
|
93
87
|
boundingVolume: {
|
|
94
88
|
box: i3sObbTo3dTilesObb(rootNode.header.obb, this.geoidHeightModel)
|
|
@@ -101,7 +95,6 @@ export default class Tiles3DConverter {
|
|
|
101
95
|
root: rootTile
|
|
102
96
|
}, tilesetTemplate());
|
|
103
97
|
await writeFile(this.tilesetPath, JSON.stringify(tileset), 'tileset.json');
|
|
104
|
-
|
|
105
98
|
this._finishConversion({
|
|
106
99
|
slpk: false,
|
|
107
100
|
outputPath,
|
|
@@ -112,60 +105,62 @@ export default class Tiles3DConverter {
|
|
|
112
105
|
workerFarm.destroy();
|
|
113
106
|
}
|
|
114
107
|
|
|
108
|
+
async convertChildNode(parentSourceNode, parentNode, level, childNodeInfo) {
|
|
109
|
+
const sourceChild = await this._loadChildNode(parentSourceNode, childNodeInfo);
|
|
110
|
+
parentSourceNode.children.push(sourceChild);
|
|
111
|
+
if (sourceChild.contentUrl) {
|
|
112
|
+
var _sourceChild$header;
|
|
113
|
+
await this.sourceTileset._loadTile(sourceChild);
|
|
114
|
+
this.vertexCounter += sourceChild.content.vertexCount;
|
|
115
|
+
let featureAttributes = null;
|
|
116
|
+
if (this.attributeStorageInfo) {
|
|
117
|
+
featureAttributes = await this._loadChildAttributes(sourceChild, this.attributeStorageInfo);
|
|
118
|
+
}
|
|
119
|
+
if (!sourceChild.header.obb) {
|
|
120
|
+
sourceChild.header.obb = createObbFromMbs(sourceChild.header.mbs);
|
|
121
|
+
}
|
|
122
|
+
const boundingVolume = {
|
|
123
|
+
box: i3sObbTo3dTilesObb(sourceChild.header.obb, this.geoidHeightModel)
|
|
124
|
+
};
|
|
125
|
+
const child = {
|
|
126
|
+
boundingVolume,
|
|
127
|
+
geometricError: convertScreenThresholdToGeometricError(sourceChild),
|
|
128
|
+
children: []
|
|
129
|
+
};
|
|
130
|
+
const i3sAttributesData = {
|
|
131
|
+
tileContent: sourceChild.content,
|
|
132
|
+
textureFormat: sourceChild === null || sourceChild === void 0 ? void 0 : (_sourceChild$header = sourceChild.header) === null || _sourceChild$header === void 0 ? void 0 : _sourceChild$header.textureFormat
|
|
133
|
+
};
|
|
134
|
+
const b3dm = await transform3DTilesAttributesOnWorker(i3sAttributesData, {
|
|
135
|
+
source: this.workerSource.tile3dWorkerSource,
|
|
136
|
+
featureAttributes
|
|
137
|
+
});
|
|
138
|
+
child.content = {
|
|
139
|
+
uri: "".concat(sourceChild.id, ".b3dm"),
|
|
140
|
+
boundingVolume
|
|
141
|
+
};
|
|
142
|
+
await writeFile(this.tilesetPath, new Uint8Array(b3dm), "".concat(sourceChild.id, ".b3dm"));
|
|
143
|
+
parentNode.children.push(child);
|
|
144
|
+
sourceChild.unloadContent();
|
|
145
|
+
await this._addChildren(sourceChild, child, level + 1);
|
|
146
|
+
} else {
|
|
147
|
+
await this._addChildren(sourceChild, parentNode, level + 1);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
115
151
|
async _addChildren(parentSourceNode, parentNode, level) {
|
|
116
152
|
if (this.options.maxDepth && level > this.options.maxDepth) {
|
|
117
153
|
return;
|
|
118
154
|
}
|
|
119
|
-
|
|
155
|
+
const promises = [];
|
|
120
156
|
for (const childNodeInfo of parentSourceNode.header.children || []) {
|
|
121
|
-
|
|
122
|
-
parentSourceNode.children.push(sourceChild);
|
|
123
|
-
|
|
124
|
-
if (sourceChild.contentUrl) {
|
|
125
|
-
var _sourceChild$header;
|
|
126
|
-
|
|
127
|
-
await this.sourceTileset._loadTile(sourceChild);
|
|
128
|
-
this.vertexCounter += sourceChild.content.vertexCount;
|
|
129
|
-
let featureAttributes = null;
|
|
130
|
-
|
|
131
|
-
if (this.attributeStorageInfo) {
|
|
132
|
-
featureAttributes = await this._loadChildAttributes(sourceChild, this.attributeStorageInfo);
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
if (!sourceChild.header.obb) {
|
|
136
|
-
sourceChild.header.obb = createObbFromMbs(sourceChild.header.mbs);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
const boundingVolume = {
|
|
140
|
-
box: i3sObbTo3dTilesObb(sourceChild.header.obb, this.geoidHeightModel)
|
|
141
|
-
};
|
|
142
|
-
const child = {
|
|
143
|
-
boundingVolume,
|
|
144
|
-
geometricError: convertScreenThresholdToGeometricError(sourceChild),
|
|
145
|
-
children: []
|
|
146
|
-
};
|
|
147
|
-
const i3sAttributesData = {
|
|
148
|
-
tileContent: sourceChild.content,
|
|
149
|
-
textureFormat: sourceChild === null || sourceChild === void 0 ? void 0 : (_sourceChild$header = sourceChild.header) === null || _sourceChild$header === void 0 ? void 0 : _sourceChild$header.textureFormat
|
|
150
|
-
};
|
|
151
|
-
const b3dm = await new B3dmConverter().convert(i3sAttributesData, featureAttributes);
|
|
152
|
-
child.content = {
|
|
153
|
-
uri: "".concat(sourceChild.id, ".b3dm"),
|
|
154
|
-
boundingVolume
|
|
155
|
-
};
|
|
156
|
-
await writeFile(this.tilesetPath, new Uint8Array(b3dm), "".concat(sourceChild.id, ".b3dm"));
|
|
157
|
-
parentNode.children.push(child);
|
|
158
|
-
sourceChild.unloadContent();
|
|
159
|
-
await this._addChildren(sourceChild, child, level + 1);
|
|
160
|
-
} else {
|
|
161
|
-
await this._addChildren(sourceChild, parentNode, level + 1);
|
|
162
|
-
}
|
|
157
|
+
promises.push(this.convertChildNode(parentSourceNode, parentNode, level, childNodeInfo));
|
|
163
158
|
}
|
|
159
|
+
await Promise.all(promises);
|
|
164
160
|
}
|
|
165
161
|
|
|
166
162
|
async _loadChildNode(parentNode, childNodeInfo) {
|
|
167
163
|
let header;
|
|
168
|
-
|
|
169
164
|
if (this.sourceTileset.tileset.nodePages) {
|
|
170
165
|
console.log("Node conversion: ".concat(childNodeInfo.id));
|
|
171
166
|
header = await this.sourceTileset.tileset.nodePagesTile.formTileFromNodePages(childNodeInfo.id);
|
|
@@ -173,11 +168,10 @@ export default class Tiles3DConverter {
|
|
|
173
168
|
const {
|
|
174
169
|
loader
|
|
175
170
|
} = this.sourceTileset;
|
|
176
|
-
|
|
177
171
|
const nodeUrl = this._relativeUrlToFullUrl(parentNode.url, childNodeInfo.href);
|
|
178
|
-
|
|
179
172
|
const options = {
|
|
180
|
-
i3s: {
|
|
173
|
+
i3s: {
|
|
174
|
+
...this.sourceTileset.loadOptions,
|
|
181
175
|
isTileHeader: true,
|
|
182
176
|
loadContent: false
|
|
183
177
|
}
|
|
@@ -185,28 +179,23 @@ export default class Tiles3DConverter {
|
|
|
185
179
|
console.log("Node conversion: ".concat(nodeUrl));
|
|
186
180
|
header = await load(nodeUrl, loader, options);
|
|
187
181
|
}
|
|
188
|
-
|
|
189
182
|
return new Tile3D(this.sourceTileset, header, parentNode);
|
|
190
183
|
}
|
|
191
184
|
|
|
192
185
|
_relativeUrlToFullUrl(baseUrl, relativeUrl) {
|
|
193
186
|
let resultArray = baseUrl.split('/');
|
|
194
187
|
const relativeUrlArray = relativeUrl.split('/');
|
|
195
|
-
|
|
196
188
|
for (const folder of relativeUrlArray) {
|
|
197
189
|
switch (folder) {
|
|
198
190
|
case '.':
|
|
199
191
|
continue;
|
|
200
|
-
|
|
201
192
|
case '..':
|
|
202
193
|
resultArray = resultArray.slice(0, -1);
|
|
203
194
|
break;
|
|
204
|
-
|
|
205
195
|
default:
|
|
206
196
|
resultArray.push(folder);
|
|
207
197
|
}
|
|
208
198
|
}
|
|
209
|
-
|
|
210
199
|
return resultArray.join('/');
|
|
211
200
|
}
|
|
212
201
|
|
|
@@ -215,7 +204,6 @@ export default class Tiles3DConverter {
|
|
|
215
204
|
const {
|
|
216
205
|
attributeUrls
|
|
217
206
|
} = sourceChild.header;
|
|
218
|
-
|
|
219
207
|
for (let index = 0; index < attributeUrls.length; index++) {
|
|
220
208
|
const inputUrl = attributeUrls[index];
|
|
221
209
|
const attribute = attributeStorageInfo[index];
|
|
@@ -225,11 +213,8 @@ export default class Tiles3DConverter {
|
|
|
225
213
|
};
|
|
226
214
|
promises.push(load(inputUrl, I3SAttributeLoader, options));
|
|
227
215
|
}
|
|
228
|
-
|
|
229
216
|
const attributesList = await Promise.all(promises);
|
|
230
|
-
|
|
231
217
|
this._replaceNestedArrays(attributesList);
|
|
232
|
-
|
|
233
218
|
return Object.assign({}, ...attributesList);
|
|
234
219
|
}
|
|
235
220
|
|
|
@@ -239,14 +224,12 @@ export default class Tiles3DConverter {
|
|
|
239
224
|
} else if (attribute.objectIds) {
|
|
240
225
|
return 'Oid32';
|
|
241
226
|
}
|
|
242
|
-
|
|
243
227
|
return '';
|
|
244
228
|
}
|
|
245
229
|
|
|
246
230
|
_replaceNestedArrays(attributesList) {
|
|
247
231
|
for (let index = 0; index < attributesList.length; index++) {
|
|
248
232
|
const attributeObject = attributesList[index];
|
|
249
|
-
|
|
250
233
|
for (const key in attributeObject) {
|
|
251
234
|
attributeObject[key] = Array.from(attributeObject[key]);
|
|
252
235
|
}
|
|
@@ -267,13 +250,13 @@ export default class Tiles3DConverter {
|
|
|
267
250
|
|
|
268
251
|
async loadWorkers() {
|
|
269
252
|
console.log("Loading workers source...");
|
|
270
|
-
const tile3dAttributesWorkerUrl = getWorkerURL(Tile3dAttributesWorker, {
|
|
253
|
+
const tile3dAttributesWorkerUrl = getWorkerURL(Tile3dAttributesWorker, {
|
|
254
|
+
...getLoaderOptions()
|
|
271
255
|
});
|
|
272
256
|
const sourceResponse = await fetchFile(tile3dAttributesWorkerUrl);
|
|
273
257
|
const source = await sourceResponse.text();
|
|
274
258
|
this.workerSource.tile3dWorkerSource = source;
|
|
275
259
|
console.log("Loading workers source completed!");
|
|
276
260
|
}
|
|
277
|
-
|
|
278
261
|
}
|
|
279
262
|
//# sourceMappingURL=3d-tiles-converter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/3d-tiles-converter/3d-tiles-converter.ts"],"names":["join","process","transform","fetchFile","getLoaderOptions","load","isBrowser","I3SLoader","I3SAttributeLoader","COORDINATE_SYSTEM","Tileset3D","Tile3D","PGMLoader","i3sObbTo3dTilesObb","convertScreenThresholdToGeometricError","writeFile","removeDir","calculateFilesSize","timeConverter","TILESET","tilesetTemplate","B3dmConverter","createObbFromMbs","Tile3dAttributesWorker","getWorkerURL","WorkerFarm","BROWSER_ERROR_MESSAGE","I3S","Tiles3DConverter","constructor","options","tilesetPath","vertexCounter","conversionStartTime","geoidHeightModel","sourceTileset","attributeStorageInfo","workerSource","convert","console","log","inputUrl","outputPath","tilesetName","maxDepth","egmFilePath","hrtime","loadWorkers","sourceTilesetJson","loadOptions","i3s","coordinateSystem","LNGLAT_OFFSETS","decodeTextures","tilesetInitializationPromise","rootNode","root","header","obb","mbs","e","rootTile","boundingVolume","box","geometricError","children","_addChildren","tileset","JSON","stringify","_finishConversion","slpk","workerFarm","getWorkerFarm","destroy","parentSourceNode","parentNode","level","childNodeInfo","sourceChild","_loadChildNode","push","contentUrl","_loadTile","content","vertexCount","featureAttributes","_loadChildAttributes","child","i3sAttributesData","tileContent","textureFormat","b3dm","uri","id","Uint8Array","unloadContent","nodePages","nodePagesTile","formTileFromNodePages","loader","nodeUrl","_relativeUrlToFullUrl","url","href","isTileHeader","loadContent","baseUrl","relativeUrl","resultArray","split","relativeUrlArray","folder","slice","promises","attributeUrls","index","length","attribute","attributeName","name","attributeType","_getAttributeType","attributesList","Promise","all","_replaceNestedArrays","Object","assign","attributeValues","valueType","objectIds","attributeObject","key","Array","from","params","filesSize","diff","conversionTime","tile3dAttributesWorkerUrl","sourceResponse","source","text","tile3dWorkerSource"],"mappings":"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","sourcesContent":["import type {AttributeStorageInfo, FeatureAttribute, NodeReference} from '@loaders.gl/i3s';\nimport type {Node3D} from '@loaders.gl/3d-tiles';\n\nimport {join} from 'path';\nimport process from 'process';\nimport transform from 'json-map-transform';\nimport {fetchFile, getLoaderOptions, load, isBrowser} from '@loaders.gl/core';\nimport {I3SLoader, I3SAttributeLoader, COORDINATE_SYSTEM} from '@loaders.gl/i3s';\nimport {Tileset3D, Tile3D} from '@loaders.gl/tiles';\nimport {Geoid} from '@math.gl/geoid';\n\nimport {PGMLoader} from '../pgm-loader';\nimport {i3sObbTo3dTilesObb} from './helpers/i3s-obb-to-3d-tiles-obb';\nimport {convertScreenThresholdToGeometricError} from '../lib/utils/lod-conversion-utils';\nimport {writeFile, removeDir} from '../lib/utils/file-utils';\nimport {calculateFilesSize, timeConverter} from '../lib/utils/statistic-utills';\nimport {TILESET as tilesetTemplate} from './json-templates/tileset';\nimport B3dmConverter from './helpers/b3dm-converter';\nimport {createObbFromMbs} from '../i3s-converter/helpers/coordinate-converter';\nimport {\n I3SAttributesData,\n Tile3dAttributesWorker\n /*transform3DTilesAttributesOnWorker*/\n} from '../3d-tiles-attributes-worker';\nimport {getWorkerURL, WorkerFarm} from '@loaders.gl/worker-utils';\nimport {BROWSER_ERROR_MESSAGE} from '../constants';\n\nconst I3S = 'I3S';\n\n/**\n * Converter from i3s to 3d-tiles\n */\nexport default class Tiles3DConverter {\n options: any;\n tilesetPath: string;\n vertexCounter: number;\n conversionStartTime: [number, number];\n geoidHeightModel: Geoid | null;\n sourceTileset: Tileset3D | null;\n attributeStorageInfo: AttributeStorageInfo | null;\n workerSource: {[key: string]: string} = {};\n\n constructor() {\n this.options = {};\n this.tilesetPath = '';\n this.vertexCounter = 0;\n this.conversionStartTime = [0, 0];\n this.geoidHeightModel = null;\n this.sourceTileset = null;\n this.attributeStorageInfo = null;\n this.workerSource = {};\n }\n\n /**\n * Convert i3s format data to 3dTiles\n * @param options\n * @param options.inputUrl the url to read the tileset from\n * @param options.outputPath the output filename\n * @param options.tilesetName the output name of the tileset\n * @param options.egmFilePath location of *.pgm file to convert heights from ellipsoidal to gravity-related format\n * @param options.maxDepth The max tree depth of conversion\n */\n public async convert(options: {\n inputUrl: string;\n outputPath: string;\n tilesetName: string;\n maxDepth?: number;\n egmFilePath: string;\n }): Promise<any> {\n if (isBrowser) {\n console.log(BROWSER_ERROR_MESSAGE);\n return BROWSER_ERROR_MESSAGE;\n }\n const {inputUrl, outputPath, tilesetName, maxDepth, egmFilePath} = options;\n this.conversionStartTime = process.hrtime();\n this.options = {maxDepth};\n\n console.log('Loading egm file...'); // eslint-disable-line\n this.geoidHeightModel = await load(egmFilePath, PGMLoader);\n console.log('Loading egm file completed!'); // eslint-disable-line\n\n await this.loadWorkers();\n\n const sourceTilesetJson = await load(inputUrl, I3SLoader, {});\n\n this.sourceTileset = new Tileset3D(sourceTilesetJson, {\n loadOptions: {\n i3s: {coordinateSystem: COORDINATE_SYSTEM.LNGLAT_OFFSETS, decodeTextures: false}\n }\n });\n\n await this.sourceTileset.tilesetInitializationPromise;\n const rootNode = this.sourceTileset.root!;\n if (!rootNode.header.obb) {\n rootNode.header.obb = createObbFromMbs(rootNode.header.mbs);\n }\n\n this.tilesetPath = join(`${outputPath}`, `${tilesetName}`);\n this.attributeStorageInfo = sourceTilesetJson.attributeStorageInfo;\n // Removing the tilesetPath needed to exclude erroneous files after conversion\n try {\n await removeDir(this.tilesetPath);\n } catch (e) {\n // do nothing\n }\n\n const rootTile: Node3D = {\n boundingVolume: {\n box: i3sObbTo3dTilesObb(rootNode.header.obb, this.geoidHeightModel)\n },\n geometricError: convertScreenThresholdToGeometricError(rootNode),\n children: []\n };\n\n await this._addChildren(rootNode, rootTile, 1);\n\n const tileset = transform({root: rootTile}, tilesetTemplate());\n await writeFile(this.tilesetPath, JSON.stringify(tileset), 'tileset.json');\n\n this._finishConversion({slpk: false, outputPath, tilesetName});\n\n // Clean up worker pools\n const workerFarm = WorkerFarm.getWorkerFarm({});\n workerFarm.destroy();\n }\n\n /**\n * The recursive function of traversal of a nodes tree\n * @param parentSourceNode the parent node tile object (@loaders.gl/tiles/Tile3D)\n * @param parentNode object in resulting tileset\n * @param level a current level of a tree depth\n */\n private async _addChildren(\n parentSourceNode: Tile3D,\n parentNode: Node3D,\n level: number\n ): Promise<void> {\n if (this.options.maxDepth && level > this.options.maxDepth) {\n return;\n }\n for (const childNodeInfo of parentSourceNode.header.children || []) {\n const sourceChild = await this._loadChildNode(parentSourceNode, childNodeInfo);\n parentSourceNode.children.push(sourceChild);\n if (sourceChild.contentUrl) {\n await this.sourceTileset!._loadTile(sourceChild);\n this.vertexCounter += sourceChild.content.vertexCount;\n\n let featureAttributes: FeatureAttribute | null = null;\n if (this.attributeStorageInfo) {\n featureAttributes = await this._loadChildAttributes(\n sourceChild,\n this.attributeStorageInfo\n );\n }\n\n if (!sourceChild.header.obb) {\n sourceChild.header.obb = createObbFromMbs(sourceChild.header.mbs);\n }\n\n const boundingVolume = {\n box: i3sObbTo3dTilesObb(sourceChild.header.obb, this.geoidHeightModel)\n };\n const child: Node3D = {\n boundingVolume,\n geometricError: convertScreenThresholdToGeometricError(sourceChild),\n children: []\n };\n\n const i3sAttributesData: I3SAttributesData = {\n tileContent: sourceChild.content,\n textureFormat: sourceChild?.header?.textureFormat\n };\n\n // TODO Uncomment when 3d-tiles-attributes-worker will be published on CDN.\n // const b3dm = await transform3DTilesAttributesOnWorker(i3sAttributesData, {\n // source: this.workerSource.tile3dWorkerSource,\n // featureAttributes\n // });\n\n const b3dm = await new B3dmConverter().convert(i3sAttributesData, featureAttributes);\n\n child.content = {\n uri: `${sourceChild.id}.b3dm`,\n boundingVolume\n };\n await writeFile(this.tilesetPath, new Uint8Array(b3dm), `${sourceChild.id}.b3dm`);\n parentNode.children.push(child);\n\n sourceChild.unloadContent();\n await this._addChildren(sourceChild, child, level + 1);\n } else {\n await this._addChildren(sourceChild, parentNode, level + 1);\n }\n }\n }\n\n /**\n * Load a child node having information from the node header\n * @param parentNode a parent node tile object (@loaders.gl/tiles/Tile3D)\n * @param childNodeInfo child information from 3DNodeIndexDocument\n * (https://github.com/Esri/i3s-spec/blob/master/docs/1.7/nodeReference.cmn.md)\n */\n private async _loadChildNode(parentNode: Tile3D, childNodeInfo: NodeReference): Promise<Tile3D> {\n let header;\n if (this.sourceTileset!.tileset.nodePages) {\n console.log(`Node conversion: ${childNodeInfo.id}`); // eslint-disable-line no-console,no-undef\n header = await this.sourceTileset!.tileset.nodePagesTile.formTileFromNodePages(\n childNodeInfo.id\n );\n } else {\n const {loader} = this.sourceTileset!;\n const nodeUrl = this._relativeUrlToFullUrl(parentNode.url, childNodeInfo.href!);\n // load metadata\n const options = {\n i3s: {\n ...this.sourceTileset!.loadOptions,\n isTileHeader: true,\n loadContent: false\n }\n };\n\n console.log(`Node conversion: ${nodeUrl}`); // eslint-disable-line no-console,no-undef\n header = await load(nodeUrl, loader, options);\n }\n return new Tile3D(this.sourceTileset!, header, parentNode);\n }\n\n /**\n * Make an url of a resource from its relative url having the base url\n * @param baseUrl the base url. A resulting url will be related from this url\n * @param relativeUrl a realtive url of a resource\n */\n private _relativeUrlToFullUrl(baseUrl: string, relativeUrl: string): string {\n let resultArray = baseUrl.split('/');\n const relativeUrlArray = relativeUrl.split('/');\n for (const folder of relativeUrlArray) {\n switch (folder) {\n case '.':\n continue; // eslint-disable-line no-continue\n case '..':\n resultArray = resultArray.slice(0, -1);\n break;\n default:\n resultArray.push(folder);\n }\n }\n return resultArray.join('/');\n }\n\n /**\n * Do loading all attributes related to particular node.\n * @param sourceChild\n * @param attributeStorageInfo\n * @returns Promise of attributes object.\n */\n private async _loadChildAttributes(\n sourceChild: Tile3D,\n attributeStorageInfo: AttributeStorageInfo\n ): Promise<FeatureAttribute> {\n const promises: any[] = [];\n const {attributeUrls} = sourceChild.header;\n\n for (let index = 0; index < attributeUrls.length; index++) {\n const inputUrl = attributeUrls[index];\n const attribute = attributeStorageInfo[index];\n const options = {\n attributeName: attribute.name,\n attributeType: this._getAttributeType(attribute)\n };\n\n promises.push(load(inputUrl, I3SAttributeLoader, options));\n }\n const attributesList = await Promise.all(promises);\n this._replaceNestedArrays(attributesList);\n return Object.assign({}, ...attributesList);\n }\n\n /**\n * Returns attribute type for loading attributes\n * @param attribute\n * Workaround for I3S v1.6. There is no attribute.attributeValues.valueType field in attribute.\n * There is an 'Oid32' type if attribute has objectIds property.\n * Doc: https://github.com/Esri/i3s-spec/blob/master/docs/1.6/attributeStorageInfo.cmn.md\n */\n private _getAttributeType(attribute: AttributeStorageInfo): string {\n if (attribute.attributeValues) {\n return attribute.attributeValues.valueType;\n } else if (attribute.objectIds) {\n return 'Oid32';\n }\n return '';\n }\n\n /**\n * Make simple arrays from attribute typed arrays.\n * @param attributesList\n */\n private _replaceNestedArrays(attributesList: FeatureAttribute[]): void {\n for (let index = 0; index < attributesList.length; index++) {\n const attributeObject = attributesList[index];\n\n for (const key in attributeObject) {\n attributeObject[key] = Array.from(attributeObject[key]);\n }\n }\n }\n\n /**\n * Print statistics in the end of conversion\n * @param params - output files data\n */\n private async _finishConversion(params: {\n slpk: boolean;\n outputPath: string;\n tilesetName: string;\n }): Promise<void> {\n const filesSize = await calculateFilesSize(params);\n const diff = process.hrtime(this.conversionStartTime);\n const conversionTime = timeConverter(diff);\n\n console.log(`------------------------------------------------`); // eslint-disable-line\n console.log(`Finish conversion of ${I3S}`); // eslint-disable-line\n console.log(`Total conversion time: ${conversionTime}`); // eslint-disable-line\n console.log(`Vertex count: `, this.vertexCounter); // eslint-disable-line\n console.log(`File(s) size: `, filesSize, ' bytes'); // eslint-disable-line\n console.log(`------------------------------------------------`); // eslint-disable-line\n }\n\n private async loadWorkers(): Promise<void> {\n console.log(`Loading workers source...`); // eslint-disable-line no-undef, no-console\n const tile3dAttributesWorkerUrl = getWorkerURL(Tile3dAttributesWorker, {...getLoaderOptions()});\n const sourceResponse = await fetchFile(tile3dAttributesWorkerUrl);\n const source = await sourceResponse.text();\n\n this.workerSource.tile3dWorkerSource = source;\n console.log(`Loading workers source completed!`); // eslint-disable-line no-undef, no-console\n }\n}\n"],"file":"3d-tiles-converter.js"}
|
|
1
|
+
{"version":3,"file":"3d-tiles-converter.js","names":["join","process","transform","fetchFile","getLoaderOptions","load","isBrowser","I3SLoader","I3SAttributeLoader","COORDINATE_SYSTEM","Tileset3D","Tile3D","PGMLoader","i3sObbTo3dTilesObb","convertScreenThresholdToGeometricError","writeFile","removeDir","calculateFilesSize","timeConverter","TILESET","tilesetTemplate","createObbFromMbs","Tile3dAttributesWorker","transform3DTilesAttributesOnWorker","getWorkerURL","WorkerFarm","BROWSER_ERROR_MESSAGE","I3S","Tiles3DConverter","constructor","options","tilesetPath","vertexCounter","conversionStartTime","geoidHeightModel","sourceTileset","attributeStorageInfo","workerSource","convert","console","log","inputUrl","outputPath","tilesetName","maxDepth","egmFilePath","hrtime","loadWorkers","sourceTilesetJson","loadOptions","_nodeWorkers","reuseWorkers","workerUrl","i3s","coordinateSystem","LNGLAT_OFFSETS","decodeTextures","tilesetInitializationPromise","rootNode","root","header","obb","mbs","e","rootTile","boundingVolume","box","geometricError","children","_addChildren","tileset","JSON","stringify","_finishConversion","slpk","workerFarm","getWorkerFarm","destroy","convertChildNode","parentSourceNode","parentNode","level","childNodeInfo","sourceChild","_loadChildNode","push","contentUrl","_loadTile","content","vertexCount","featureAttributes","_loadChildAttributes","child","i3sAttributesData","tileContent","textureFormat","b3dm","source","tile3dWorkerSource","uri","id","Uint8Array","unloadContent","promises","Promise","all","nodePages","nodePagesTile","formTileFromNodePages","loader","nodeUrl","_relativeUrlToFullUrl","url","href","isTileHeader","loadContent","baseUrl","relativeUrl","resultArray","split","relativeUrlArray","folder","slice","attributeUrls","index","length","attribute","attributeName","name","attributeType","_getAttributeType","attributesList","_replaceNestedArrays","Object","assign","attributeValues","valueType","objectIds","attributeObject","key","Array","from","params","filesSize","diff","conversionTime","tile3dAttributesWorkerUrl","sourceResponse","text"],"sources":["../../../src/3d-tiles-converter/3d-tiles-converter.ts"],"sourcesContent":["import type {AttributeStorageInfo, FeatureAttribute, NodeReference} from '@loaders.gl/i3s';\nimport type {Node3D} from '@loaders.gl/3d-tiles';\n\nimport {join} from 'path';\nimport process from 'process';\nimport transform from 'json-map-transform';\nimport {fetchFile, getLoaderOptions, load, isBrowser} from '@loaders.gl/core';\nimport {I3SLoader, I3SAttributeLoader, COORDINATE_SYSTEM} from '@loaders.gl/i3s';\nimport {Tileset3D, Tile3D} from '@loaders.gl/tiles';\nimport {Geoid} from '@math.gl/geoid';\n\nimport {PGMLoader} from '../pgm-loader';\nimport {i3sObbTo3dTilesObb} from './helpers/i3s-obb-to-3d-tiles-obb';\nimport {convertScreenThresholdToGeometricError} from '../lib/utils/lod-conversion-utils';\nimport {writeFile, removeDir} from '../lib/utils/file-utils';\nimport {calculateFilesSize, timeConverter} from '../lib/utils/statistic-utills';\nimport {TILESET as tilesetTemplate} from './json-templates/tileset';\nimport {createObbFromMbs} from '../i3s-converter/helpers/coordinate-converter';\nimport {\n I3SAttributesData,\n Tile3dAttributesWorker,\n transform3DTilesAttributesOnWorker\n} from '../3d-tiles-attributes-worker';\nimport {getWorkerURL, WorkerFarm} from '@loaders.gl/worker-utils';\nimport {BROWSER_ERROR_MESSAGE} from '../constants';\n\nconst I3S = 'I3S';\n\n/**\n * Converter from i3s to 3d-tiles\n */\nexport default class Tiles3DConverter {\n options: any;\n tilesetPath: string;\n vertexCounter: number;\n conversionStartTime: [number, number];\n geoidHeightModel: Geoid | null;\n sourceTileset: Tileset3D | null;\n attributeStorageInfo: AttributeStorageInfo | null;\n workerSource: {[key: string]: string} = {};\n\n constructor() {\n this.options = {};\n this.tilesetPath = '';\n this.vertexCounter = 0;\n this.conversionStartTime = [0, 0];\n this.geoidHeightModel = null;\n this.sourceTileset = null;\n this.attributeStorageInfo = null;\n this.workerSource = {};\n }\n\n /**\n * Convert i3s format data to 3dTiles\n * @param options\n * @param options.inputUrl the url to read the tileset from\n * @param options.outputPath the output filename\n * @param options.tilesetName the output name of the tileset\n * @param options.egmFilePath location of *.pgm file to convert heights from ellipsoidal to gravity-related format\n * @param options.maxDepth The max tree depth of conversion\n */\n public async convert(options: {\n inputUrl: string;\n outputPath: string;\n tilesetName: string;\n maxDepth?: number;\n egmFilePath: string;\n }): Promise<any> {\n if (isBrowser) {\n console.log(BROWSER_ERROR_MESSAGE);\n return BROWSER_ERROR_MESSAGE;\n }\n const {inputUrl, outputPath, tilesetName, maxDepth, egmFilePath} = options;\n this.conversionStartTime = process.hrtime();\n this.options = {maxDepth};\n\n console.log('Loading egm file...'); // eslint-disable-line\n this.geoidHeightModel = await load(egmFilePath, PGMLoader);\n console.log('Loading egm file completed!'); // eslint-disable-line\n\n await this.loadWorkers();\n\n const sourceTilesetJson = await load(inputUrl, I3SLoader, {});\n\n this.sourceTileset = new Tileset3D(sourceTilesetJson, {\n loadOptions: {\n _nodeWorkers: true,\n reuseWorkers: true,\n 'i3s-content-nodejs': {\n workerUrl: './modules/i3s/dist/i3s-content-nodejs-worker.js'\n },\n i3s: {coordinateSystem: COORDINATE_SYSTEM.LNGLAT_OFFSETS, decodeTextures: false}\n }\n });\n\n await this.sourceTileset.tilesetInitializationPromise;\n const rootNode = this.sourceTileset.root!;\n if (!rootNode.header.obb) {\n rootNode.header.obb = createObbFromMbs(rootNode.header.mbs);\n }\n\n this.tilesetPath = join(`${outputPath}`, `${tilesetName}`);\n this.attributeStorageInfo = sourceTilesetJson.attributeStorageInfo;\n // Removing the tilesetPath needed to exclude erroneous files after conversion\n try {\n await removeDir(this.tilesetPath);\n } catch (e) {\n // do nothing\n }\n\n const rootTile: Node3D = {\n boundingVolume: {\n box: i3sObbTo3dTilesObb(rootNode.header.obb, this.geoidHeightModel)\n },\n geometricError: convertScreenThresholdToGeometricError(rootNode),\n children: []\n };\n\n await this._addChildren(rootNode, rootTile, 1);\n\n const tileset = transform({root: rootTile}, tilesetTemplate());\n await writeFile(this.tilesetPath, JSON.stringify(tileset), 'tileset.json');\n\n this._finishConversion({slpk: false, outputPath, tilesetName});\n\n // Clean up worker pools\n const workerFarm = WorkerFarm.getWorkerFarm({});\n workerFarm.destroy();\n }\n\n /**\n * Convert particular I3S Node\n * @param parentSourceNode the parent node tile object (@loaders.gl/tiles/Tile3D)\n * @param parentNode object in resulting tileset\n * @param level a current level of a tree depth\n * @param childNodeInfo child node to convert\n */\n private async convertChildNode(\n parentSourceNode: Tile3D,\n parentNode: Node3D,\n level: number,\n childNodeInfo: NodeReference\n ): Promise<void> {\n const sourceChild = await this._loadChildNode(parentSourceNode, childNodeInfo);\n parentSourceNode.children.push(sourceChild);\n if (sourceChild.contentUrl) {\n await this.sourceTileset!._loadTile(sourceChild);\n this.vertexCounter += sourceChild.content.vertexCount;\n\n let featureAttributes: FeatureAttribute | null = null;\n if (this.attributeStorageInfo) {\n featureAttributes = await this._loadChildAttributes(sourceChild, this.attributeStorageInfo);\n }\n\n if (!sourceChild.header.obb) {\n sourceChild.header.obb = createObbFromMbs(sourceChild.header.mbs);\n }\n\n const boundingVolume = {\n box: i3sObbTo3dTilesObb(sourceChild.header.obb, this.geoidHeightModel)\n };\n const child: Node3D = {\n boundingVolume,\n geometricError: convertScreenThresholdToGeometricError(sourceChild),\n children: []\n };\n\n const i3sAttributesData: I3SAttributesData = {\n tileContent: sourceChild.content,\n textureFormat: sourceChild?.header?.textureFormat\n };\n\n const b3dm = await transform3DTilesAttributesOnWorker(i3sAttributesData, {\n source: this.workerSource.tile3dWorkerSource,\n featureAttributes\n });\n\n child.content = {\n uri: `${sourceChild.id}.b3dm`,\n boundingVolume\n };\n await writeFile(this.tilesetPath, new Uint8Array(b3dm), `${sourceChild.id}.b3dm`);\n parentNode.children.push(child);\n\n sourceChild.unloadContent();\n await this._addChildren(sourceChild, child, level + 1);\n } else {\n await this._addChildren(sourceChild, parentNode, level + 1);\n }\n }\n\n /**\n * The recursive function of traversal of a nodes tree\n * @param parentSourceNode the parent node tile object (@loaders.gl/tiles/Tile3D)\n * @param parentNode object in resulting tileset\n * @param level a current level of a tree depth\n */\n private async _addChildren(\n parentSourceNode: Tile3D,\n parentNode: Node3D,\n level: number\n ): Promise<void> {\n if (this.options.maxDepth && level > this.options.maxDepth) {\n return;\n }\n const promises: Promise<void>[] = [];\n for (const childNodeInfo of parentSourceNode.header.children || []) {\n promises.push(this.convertChildNode(parentSourceNode, parentNode, level, childNodeInfo));\n }\n await Promise.all(promises);\n }\n\n /**\n * Load a child node having information from the node header\n * @param parentNode a parent node tile object (@loaders.gl/tiles/Tile3D)\n * @param childNodeInfo child information from 3DNodeIndexDocument\n * (https://github.com/Esri/i3s-spec/blob/master/docs/1.7/nodeReference.cmn.md)\n */\n private async _loadChildNode(parentNode: Tile3D, childNodeInfo: NodeReference): Promise<Tile3D> {\n let header;\n if (this.sourceTileset!.tileset.nodePages) {\n console.log(`Node conversion: ${childNodeInfo.id}`); // eslint-disable-line no-console,no-undef\n header = await this.sourceTileset!.tileset.nodePagesTile.formTileFromNodePages(\n childNodeInfo.id\n );\n } else {\n const {loader} = this.sourceTileset!;\n const nodeUrl = this._relativeUrlToFullUrl(parentNode.url, childNodeInfo.href!);\n // load metadata\n const options = {\n i3s: {\n ...this.sourceTileset!.loadOptions,\n isTileHeader: true,\n loadContent: false\n }\n };\n\n console.log(`Node conversion: ${nodeUrl}`); // eslint-disable-line no-console,no-undef\n header = await load(nodeUrl, loader, options);\n }\n return new Tile3D(this.sourceTileset!, header, parentNode);\n }\n\n /**\n * Make an url of a resource from its relative url having the base url\n * @param baseUrl the base url. A resulting url will be related from this url\n * @param relativeUrl a realtive url of a resource\n */\n private _relativeUrlToFullUrl(baseUrl: string, relativeUrl: string): string {\n let resultArray = baseUrl.split('/');\n const relativeUrlArray = relativeUrl.split('/');\n for (const folder of relativeUrlArray) {\n switch (folder) {\n case '.':\n continue; // eslint-disable-line no-continue\n case '..':\n resultArray = resultArray.slice(0, -1);\n break;\n default:\n resultArray.push(folder);\n }\n }\n return resultArray.join('/');\n }\n\n /**\n * Do loading all attributes related to particular node.\n * @param sourceChild\n * @param attributeStorageInfo\n * @returns Promise of attributes object.\n */\n private async _loadChildAttributes(\n sourceChild: Tile3D,\n attributeStorageInfo: AttributeStorageInfo\n ): Promise<FeatureAttribute> {\n const promises: any[] = [];\n const {attributeUrls} = sourceChild.header;\n\n for (let index = 0; index < attributeUrls.length; index++) {\n const inputUrl = attributeUrls[index];\n const attribute = attributeStorageInfo[index];\n const options = {\n attributeName: attribute.name,\n attributeType: this._getAttributeType(attribute)\n };\n\n promises.push(load(inputUrl, I3SAttributeLoader, options));\n }\n const attributesList = await Promise.all(promises);\n this._replaceNestedArrays(attributesList);\n return Object.assign({}, ...attributesList);\n }\n\n /**\n * Returns attribute type for loading attributes\n * @param attribute\n * Workaround for I3S v1.6. There is no attribute.attributeValues.valueType field in attribute.\n * There is an 'Oid32' type if attribute has objectIds property.\n * Doc: https://github.com/Esri/i3s-spec/blob/master/docs/1.6/attributeStorageInfo.cmn.md\n */\n private _getAttributeType(attribute: AttributeStorageInfo): string {\n if (attribute.attributeValues) {\n return attribute.attributeValues.valueType;\n } else if (attribute.objectIds) {\n return 'Oid32';\n }\n return '';\n }\n\n /**\n * Make simple arrays from attribute typed arrays.\n * @param attributesList\n */\n private _replaceNestedArrays(attributesList: FeatureAttribute[]): void {\n for (let index = 0; index < attributesList.length; index++) {\n const attributeObject = attributesList[index];\n\n for (const key in attributeObject) {\n attributeObject[key] = Array.from(attributeObject[key]);\n }\n }\n }\n\n /**\n * Print statistics in the end of conversion\n * @param params - output files data\n */\n private async _finishConversion(params: {\n slpk: boolean;\n outputPath: string;\n tilesetName: string;\n }): Promise<void> {\n const filesSize = await calculateFilesSize(params);\n const diff = process.hrtime(this.conversionStartTime);\n const conversionTime = timeConverter(diff);\n\n console.log(`------------------------------------------------`); // eslint-disable-line\n console.log(`Finish conversion of ${I3S}`); // eslint-disable-line\n console.log(`Total conversion time: ${conversionTime}`); // eslint-disable-line\n console.log(`Vertex count: `, this.vertexCounter); // eslint-disable-line\n console.log(`File(s) size: `, filesSize, ' bytes'); // eslint-disable-line\n console.log(`------------------------------------------------`); // eslint-disable-line\n }\n\n private async loadWorkers(): Promise<void> {\n console.log(`Loading workers source...`); // eslint-disable-line no-undef, no-console\n const tile3dAttributesWorkerUrl = getWorkerURL(Tile3dAttributesWorker, {...getLoaderOptions()});\n const sourceResponse = await fetchFile(tile3dAttributesWorkerUrl);\n const source = await sourceResponse.text();\n\n this.workerSource.tile3dWorkerSource = source;\n console.log(`Loading workers source completed!`); // eslint-disable-line no-undef, no-console\n }\n}\n"],"mappings":"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"}
|
|
@@ -7,15 +7,15 @@ import { Ellipsoid } from '@math.gl/geospatial';
|
|
|
7
7
|
import { convertTextureAtlas } from './texture-atlas';
|
|
8
8
|
const Z_UP_TO_Y_UP_MATRIX = new Matrix4([1, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1]);
|
|
9
9
|
const scratchVector = new Vector3();
|
|
10
|
+
|
|
10
11
|
export default class B3dmConverter {
|
|
11
12
|
constructor() {
|
|
12
13
|
_defineProperty(this, "rtcCenter", void 0);
|
|
13
|
-
|
|
14
14
|
_defineProperty(this, "i3sTile", void 0);
|
|
15
15
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const gltf = await this.buildGltf(i3sAttributesData);
|
|
16
|
+
async convert(i3sAttributesData) {
|
|
17
|
+
let featureAttributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
|
18
|
+
const gltf = await this.buildGltf(i3sAttributesData, featureAttributes);
|
|
19
19
|
const b3dm = encodeSync({
|
|
20
20
|
gltfEncoded: new Uint8Array(gltf),
|
|
21
21
|
type: 'b3dm',
|
|
@@ -25,7 +25,7 @@ export default class B3dmConverter {
|
|
|
25
25
|
return b3dm;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
async buildGltf(i3sAttributesData) {
|
|
28
|
+
async buildGltf(i3sAttributesData, featureAttributes) {
|
|
29
29
|
const {
|
|
30
30
|
tileContent,
|
|
31
31
|
textureFormat
|
|
@@ -40,34 +40,26 @@ export default class B3dmConverter {
|
|
|
40
40
|
} = tileContent;
|
|
41
41
|
const gltfBuilder = new GLTFScenegraph();
|
|
42
42
|
const textureIndex = await this._addI3sTextureToGltf(tileContent, textureFormat, gltfBuilder);
|
|
43
|
-
|
|
44
43
|
const pbrMaterialInfo = this._convertI3sMaterialToGltfMaterial(material, textureIndex);
|
|
45
|
-
|
|
46
44
|
const materialIndex = gltfBuilder.addMaterial(pbrMaterialInfo);
|
|
47
45
|
const positions = attributes.positions;
|
|
48
46
|
const positionsValue = positions.value;
|
|
49
|
-
|
|
50
47
|
if (attributes.uvRegions && attributes.texCoords) {
|
|
51
48
|
attributes.texCoords.value = convertTextureAtlas(attributes.texCoords.value, attributes.uvRegions.value);
|
|
52
49
|
}
|
|
53
|
-
|
|
54
50
|
attributes.positions.value = this._normalizePositions(positionsValue, cartesianOrigin, cartographicOrigin, modelMatrix);
|
|
55
|
-
|
|
51
|
+
this._createBatchIds(tileContent, featureAttributes);
|
|
56
52
|
if (attributes.normals && !this._checkNormals(attributes.normals.value)) {
|
|
57
53
|
delete attributes.normals;
|
|
58
54
|
}
|
|
59
|
-
|
|
60
55
|
const indices = originalIndices || this._generateSynteticIndices(positionsValue.length / positions.size);
|
|
61
|
-
|
|
62
56
|
const meshIndex = gltfBuilder.addMesh({
|
|
63
57
|
attributes,
|
|
64
58
|
indices,
|
|
65
59
|
material: materialIndex,
|
|
66
60
|
mode: 4
|
|
67
61
|
});
|
|
68
|
-
|
|
69
62
|
const transformMatrix = this._generateTransformMatrix(cartesianOrigin);
|
|
70
|
-
|
|
71
63
|
const nodeIndex = gltfBuilder.addNode({
|
|
72
64
|
meshIndex,
|
|
73
65
|
matrix: transformMatrix
|
|
@@ -89,27 +81,22 @@ export default class B3dmConverter {
|
|
|
89
81
|
} = tileContent;
|
|
90
82
|
let textureIndex = null;
|
|
91
83
|
let selectedTexture = texture;
|
|
92
|
-
|
|
93
84
|
if (!texture && material) {
|
|
94
85
|
selectedTexture = material.pbrMetallicRoughness && material.pbrMetallicRoughness.baseColorTexture && material.pbrMetallicRoughness.baseColorTexture.texture.source.image;
|
|
95
86
|
}
|
|
96
|
-
|
|
97
87
|
if (selectedTexture) {
|
|
98
88
|
const mimeType = this._deduceMimeTypeFromFormat(textureFormat);
|
|
99
|
-
|
|
100
89
|
const imageIndex = gltfBuilder.addImage(selectedTexture, mimeType);
|
|
101
90
|
textureIndex = gltfBuilder.addTexture({
|
|
102
91
|
imageIndex
|
|
103
92
|
});
|
|
104
93
|
delete attributes.colors;
|
|
105
94
|
}
|
|
106
|
-
|
|
107
95
|
return textureIndex;
|
|
108
96
|
}
|
|
109
97
|
|
|
110
98
|
_normalizePositions(positionsValue, cartesianOrigin, cartographicOrigin, modelMatrix) {
|
|
111
99
|
const newPositionsValue = new Float32Array(positionsValue.length);
|
|
112
|
-
|
|
113
100
|
for (let index = 0; index < positionsValue.length; index += 3) {
|
|
114
101
|
const vertex = positionsValue.subarray(index, index + 3);
|
|
115
102
|
const cartesianOriginVector = new Vector3(cartesianOrigin);
|
|
@@ -118,7 +105,6 @@ export default class B3dmConverter {
|
|
|
118
105
|
vertexVector = scratchVector.subtract(cartesianOriginVector);
|
|
119
106
|
newPositionsValue.set(vertexVector, index);
|
|
120
107
|
}
|
|
121
|
-
|
|
122
108
|
return newPositionsValue;
|
|
123
109
|
}
|
|
124
110
|
|
|
@@ -128,30 +114,33 @@ export default class B3dmConverter {
|
|
|
128
114
|
return result;
|
|
129
115
|
}
|
|
130
116
|
|
|
131
|
-
|
|
132
|
-
const
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
batchId.fill(currentBatchId, fromIndex, untilPosition);
|
|
141
|
-
rangeIndex += 2;
|
|
142
|
-
currentBatchId += 1;
|
|
117
|
+
_createBatchIds(i3sContent, featureAttributes) {
|
|
118
|
+
const {
|
|
119
|
+
featureIds
|
|
120
|
+
} = i3sContent;
|
|
121
|
+
const {
|
|
122
|
+
OBJECTID: objectIds
|
|
123
|
+
} = featureAttributes || {};
|
|
124
|
+
if (!featureIds || !objectIds) {
|
|
125
|
+
return;
|
|
143
126
|
}
|
|
144
|
-
|
|
145
|
-
|
|
127
|
+
for (let i = 0; i < featureIds.length; i++) {
|
|
128
|
+
const featureId = featureIds[i];
|
|
129
|
+
const batchId = objectIds.indexOf(featureId);
|
|
130
|
+
featureIds[i] = batchId;
|
|
131
|
+
}
|
|
132
|
+
i3sContent.attributes._BATCHID = {
|
|
133
|
+
size: 1,
|
|
134
|
+
byteOffset: 0,
|
|
135
|
+
value: featureIds
|
|
136
|
+
};
|
|
146
137
|
}
|
|
147
138
|
|
|
148
139
|
_generateSynteticIndices(vertexCount) {
|
|
149
140
|
const result = new Uint32Array(vertexCount);
|
|
150
|
-
|
|
151
141
|
for (let index = 0; index < vertexCount; index++) {
|
|
152
142
|
result.set([index], index);
|
|
153
143
|
}
|
|
154
|
-
|
|
155
144
|
return result;
|
|
156
145
|
}
|
|
157
146
|
|
|
@@ -159,13 +148,10 @@ export default class B3dmConverter {
|
|
|
159
148
|
switch (format) {
|
|
160
149
|
case 'jpg':
|
|
161
150
|
return 'image/jpeg';
|
|
162
|
-
|
|
163
151
|
case 'png':
|
|
164
152
|
return 'image/png';
|
|
165
|
-
|
|
166
153
|
case 'ktx2':
|
|
167
154
|
return 'image/ktx2';
|
|
168
|
-
|
|
169
155
|
default:
|
|
170
156
|
console.warn("Unexpected texture format in I3S: ".concat(format));
|
|
171
157
|
return 'image/jpeg';
|
|
@@ -174,7 +160,6 @@ export default class B3dmConverter {
|
|
|
174
160
|
|
|
175
161
|
_convertI3sMaterialToGltfMaterial(material, textureIndex) {
|
|
176
162
|
const isTextureIndexExists = textureIndex !== null;
|
|
177
|
-
|
|
178
163
|
if (!material) {
|
|
179
164
|
material = {
|
|
180
165
|
alphaMode: 'OPAQUE',
|
|
@@ -184,7 +169,6 @@ export default class B3dmConverter {
|
|
|
184
169
|
roughnessFactor: 1
|
|
185
170
|
}
|
|
186
171
|
};
|
|
187
|
-
|
|
188
172
|
if (isTextureIndexExists) {
|
|
189
173
|
material.pbrMetallicRoughness.baseColorTexture = {
|
|
190
174
|
index: textureIndex,
|
|
@@ -193,23 +177,21 @@ export default class B3dmConverter {
|
|
|
193
177
|
} else {
|
|
194
178
|
material.pbrMetallicRoughness.baseColorFactor = [1, 1, 1, 1];
|
|
195
179
|
}
|
|
196
|
-
|
|
197
180
|
return material;
|
|
198
181
|
}
|
|
199
|
-
|
|
200
182
|
if (textureIndex !== null) {
|
|
201
183
|
material = this._setGltfTexture(material, textureIndex);
|
|
202
184
|
}
|
|
203
|
-
|
|
204
185
|
return material;
|
|
205
186
|
}
|
|
206
187
|
|
|
207
188
|
_setGltfTexture(materialDefinition, textureIndex) {
|
|
208
|
-
const material = {
|
|
209
|
-
|
|
189
|
+
const material = {
|
|
190
|
+
...materialDefinition,
|
|
191
|
+
pbrMetallicRoughness: {
|
|
192
|
+
...materialDefinition.pbrMetallicRoughness
|
|
210
193
|
}
|
|
211
194
|
};
|
|
212
|
-
|
|
213
195
|
if (materialDefinition.pbrMetallicRoughness && materialDefinition.pbrMetallicRoughness.baseColorTexture) {
|
|
214
196
|
material.pbrMetallicRoughness.baseColorTexture = {
|
|
215
197
|
index: textureIndex,
|
|
@@ -236,7 +218,6 @@ export default class B3dmConverter {
|
|
|
236
218
|
texCoord: 0
|
|
237
219
|
};
|
|
238
220
|
}
|
|
239
|
-
|
|
240
221
|
return material;
|
|
241
222
|
}
|
|
242
223
|
|
|
@@ -244,7 +225,6 @@ export default class B3dmConverter {
|
|
|
244
225
|
if (!attributes) {
|
|
245
226
|
return 0;
|
|
246
227
|
}
|
|
247
|
-
|
|
248
228
|
const firstKey = Object.keys(attributes)[0];
|
|
249
229
|
return firstKey ? attributes[firstKey].length : 0;
|
|
250
230
|
}
|
|
@@ -252,6 +232,5 @@ export default class B3dmConverter {
|
|
|
252
232
|
_checkNormals(normals) {
|
|
253
233
|
return normals.find(value => value);
|
|
254
234
|
}
|
|
255
|
-
|
|
256
235
|
}
|
|
257
236
|
//# sourceMappingURL=b3dm-converter.js.map
|