@loaders.gl/tile-converter 4.0.0-alpha.18 → 4.0.0-alpha.20
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/bin/converter.js +1 -1
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +3 -1
- package/dist/converter-cli.js +10 -2
- package/dist/converter.min.js +172 -103
- package/dist/deps-installer/deps-installer.d.ts +3 -2
- package/dist/deps-installer/deps-installer.d.ts.map +1 -1
- package/dist/deps-installer/deps-installer.js +36 -10
- package/dist/dist.min.js +226 -151
- package/dist/es5/constants.js +5 -1
- package/dist/es5/constants.js.map +1 -1
- package/dist/es5/converter-cli.js +7 -2
- package/dist/es5/converter-cli.js.map +1 -1
- package/dist/es5/deps-installer/deps-installer.js +112 -38
- package/dist/es5/deps-installer/deps-installer.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/batch-ids-extensions.js +21 -8
- package/dist/es5/i3s-converter/helpers/batch-ids-extensions.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/geometry-attributes.js +7 -6
- package/dist/es5/i3s-converter/helpers/geometry-attributes.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/geometry-converter.js +78 -67
- package/dist/es5/i3s-converter/helpers/geometry-converter.js.map +1 -1
- package/dist/es5/i3s-converter/helpers/preprocess-3d-tiles.js +38 -9
- package/dist/es5/i3s-converter/helpers/preprocess-3d-tiles.js.map +1 -1
- package/dist/es5/i3s-converter/i3s-converter.js +86 -99
- package/dist/es5/i3s-converter/i3s-converter.js.map +1 -1
- package/dist/es5/i3s-converter/types.js +11 -11
- package/dist/es5/i3s-converter/types.js.map +1 -1
- package/dist/es5/i3s-server/controllers/slpk-controller.js +1 -1
- package/dist/es5/i3s-server/controllers/slpk-controller.js.map +1 -1
- package/dist/es5/index.js +3 -3
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/pgm-loader.js +1 -1
- package/dist/es5/slpk-extractor/helpers/{file-handle-provider.js → file-handle-file.js} +9 -9
- package/dist/es5/slpk-extractor/helpers/file-handle-file.js.map +1 -0
- package/dist/es5/slpk-extractor/slpk-extractor.js +5 -5
- package/dist/es5/slpk-extractor/slpk-extractor.js.map +1 -1
- package/dist/esm/constants.js +2 -0
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/converter-cli.js +7 -2
- package/dist/esm/converter-cli.js.map +1 -1
- package/dist/esm/deps-installer/deps-installer.js +37 -11
- package/dist/esm/deps-installer/deps-installer.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/batch-ids-extensions.js +18 -6
- package/dist/esm/i3s-converter/helpers/batch-ids-extensions.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/geometry-attributes.js +7 -6
- package/dist/esm/i3s-converter/helpers/geometry-attributes.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/geometry-converter.js +37 -25
- package/dist/esm/i3s-converter/helpers/geometry-converter.js.map +1 -1
- package/dist/esm/i3s-converter/helpers/preprocess-3d-tiles.js +28 -9
- package/dist/esm/i3s-converter/helpers/preprocess-3d-tiles.js.map +1 -1
- package/dist/esm/i3s-converter/i3s-converter.js +49 -36
- package/dist/esm/i3s-converter/i3s-converter.js.map +1 -1
- package/dist/esm/i3s-converter/types.js +9 -9
- package/dist/esm/i3s-converter/types.js.map +1 -1
- package/dist/esm/i3s-server/bin/i3s-server.min.js +71 -71
- package/dist/esm/i3s-server/controllers/slpk-controller.js +2 -2
- package/dist/esm/i3s-server/controllers/slpk-controller.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/pgm-loader.js +1 -1
- package/dist/esm/slpk-extractor/helpers/{file-handle-provider.js → file-handle-file.js} +3 -3
- package/dist/esm/slpk-extractor/helpers/file-handle-file.js.map +1 -0
- package/dist/esm/slpk-extractor/slpk-extractor.js +3 -3
- package/dist/esm/slpk-extractor/slpk-extractor.js.map +1 -1
- package/dist/i3s-converter/helpers/batch-ids-extensions.d.ts +11 -1
- package/dist/i3s-converter/helpers/batch-ids-extensions.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/batch-ids-extensions.js +33 -13
- package/dist/i3s-converter/helpers/geometry-attributes.js +7 -6
- package/dist/i3s-converter/helpers/geometry-converter.d.ts +7 -6
- package/dist/i3s-converter/helpers/geometry-converter.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/geometry-converter.js +59 -47
- package/dist/i3s-converter/helpers/preprocess-3d-tiles.d.ts +2 -2
- package/dist/i3s-converter/helpers/preprocess-3d-tiles.d.ts.map +1 -1
- package/dist/i3s-converter/helpers/preprocess-3d-tiles.js +39 -14
- package/dist/i3s-converter/i3s-converter.d.ts +2 -1
- package/dist/i3s-converter/i3s-converter.d.ts.map +1 -1
- package/dist/i3s-converter/i3s-converter.js +49 -31
- package/dist/i3s-converter/types.d.ts +4 -2
- package/dist/i3s-converter/types.d.ts.map +1 -1
- package/dist/i3s-converter/types.js +11 -11
- package/dist/i3s-server/controllers/slpk-controller.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/slpk-extractor/helpers/{file-handle-provider.d.ts → file-handle-file.d.ts} +5 -5
- package/dist/slpk-extractor/helpers/file-handle-file.d.ts.map +1 -0
- package/dist/slpk-extractor/helpers/{file-handle-provider.js → file-handle-file.js} +5 -5
- package/dist/slpk-extractor/slpk-extractor.js +5 -5
- package/dist/slpk-extractor.min.js +32 -32
- package/package.json +15 -14
- package/src/constants.ts +3 -0
- package/src/converter-cli.ts +9 -2
- package/src/deps-installer/deps-installer.ts +55 -10
- package/src/i3s-converter/helpers/batch-ids-extensions.ts +39 -12
- package/src/i3s-converter/helpers/geometry-attributes.ts +15 -8
- package/src/i3s-converter/helpers/geometry-converter.ts +84 -48
- package/src/i3s-converter/helpers/preprocess-3d-tiles.ts +48 -18
- package/src/i3s-converter/i3s-converter.ts +65 -39
- package/src/i3s-converter/types.ts +4 -2
- package/src/i3s-server/controllers/slpk-controller.ts +2 -2
- package/src/index.ts +1 -1
- package/src/slpk-extractor/helpers/{file-handle-provider.ts → file-handle-file.ts} +5 -5
- package/src/slpk-extractor/slpk-extractor.ts +3 -3
- package/dist/es5/slpk-extractor/helpers/file-handle-provider.js.map +0 -1
- package/dist/esm/slpk-extractor/helpers/file-handle-provider.js.map +0 -1
- package/dist/slpk-extractor/helpers/file-handle-provider.d.ts.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loaders.gl/tile-converter",
|
|
3
|
-
"version": "4.0.0-alpha.
|
|
3
|
+
"version": "4.0.0-alpha.20",
|
|
4
4
|
"description": "Converter",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
@@ -45,18 +45,18 @@
|
|
|
45
45
|
"build-i3s-server-bundle": "esbuild src/i3s-server/bin/www.ts --outfile=dist/esm/i3s-server/bin/i3s-server.min.js --platform=node --target=esnext,node14 --external:join-images --minify --bundle --define:__VERSION__=\\\"$npm_package_version\\\""
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"@loaders.gl/3d-tiles": "4.0.0-alpha.
|
|
49
|
-
"@loaders.gl/crypto": "4.0.0-alpha.
|
|
50
|
-
"@loaders.gl/draco": "4.0.0-alpha.
|
|
51
|
-
"@loaders.gl/gltf": "4.0.0-alpha.
|
|
52
|
-
"@loaders.gl/i3s": "4.0.0-alpha.
|
|
53
|
-
"@loaders.gl/images": "4.0.0-alpha.
|
|
54
|
-
"@loaders.gl/loader-utils": "4.0.0-alpha.
|
|
55
|
-
"@loaders.gl/polyfills": "4.0.0-alpha.
|
|
56
|
-
"@loaders.gl/textures": "4.0.0-alpha.
|
|
57
|
-
"@loaders.gl/tiles": "4.0.0-alpha.
|
|
58
|
-
"@loaders.gl/worker-utils": "4.0.0-alpha.
|
|
59
|
-
"@loaders.gl/zip": "4.0.0-alpha.
|
|
48
|
+
"@loaders.gl/3d-tiles": "4.0.0-alpha.20",
|
|
49
|
+
"@loaders.gl/crypto": "4.0.0-alpha.20",
|
|
50
|
+
"@loaders.gl/draco": "4.0.0-alpha.20",
|
|
51
|
+
"@loaders.gl/gltf": "4.0.0-alpha.20",
|
|
52
|
+
"@loaders.gl/i3s": "4.0.0-alpha.20",
|
|
53
|
+
"@loaders.gl/images": "4.0.0-alpha.20",
|
|
54
|
+
"@loaders.gl/loader-utils": "4.0.0-alpha.20",
|
|
55
|
+
"@loaders.gl/polyfills": "4.0.0-alpha.20",
|
|
56
|
+
"@loaders.gl/textures": "4.0.0-alpha.20",
|
|
57
|
+
"@loaders.gl/tiles": "4.0.0-alpha.20",
|
|
58
|
+
"@loaders.gl/worker-utils": "4.0.0-alpha.20",
|
|
59
|
+
"@loaders.gl/zip": "4.0.0-alpha.20",
|
|
60
60
|
"@math.gl/core": "^3.5.1",
|
|
61
61
|
"@math.gl/culling": "^3.5.1",
|
|
62
62
|
"@math.gl/geoid": "^3.5.1",
|
|
@@ -66,6 +66,7 @@
|
|
|
66
66
|
"crypt": "^0.0.2",
|
|
67
67
|
"debug": "~4.3.4",
|
|
68
68
|
"express": "~4.18.2",
|
|
69
|
+
"inquirer": "^8.0.0",
|
|
69
70
|
"json-map-transform": "^1.2.6",
|
|
70
71
|
"jszip": "^3.5.0",
|
|
71
72
|
"md5": "^2.3.0",
|
|
@@ -79,7 +80,7 @@
|
|
|
79
80
|
"join-images": "^1.1.3",
|
|
80
81
|
"sharp": "^0.31.3"
|
|
81
82
|
},
|
|
82
|
-
"gitHead": "
|
|
83
|
+
"gitHead": "ac122e83102657c38207d59c631a5ce4e7aa46bd",
|
|
83
84
|
"devDependencies": {
|
|
84
85
|
"@types/express": "^4.17.17",
|
|
85
86
|
"@types/node": "^20.4.2"
|
package/src/constants.ts
CHANGED
package/src/converter-cli.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/* eslint-disable no-console */
|
|
2
2
|
import '@loaders.gl/polyfills';
|
|
3
3
|
import {join} from 'path';
|
|
4
|
+
import inquirer from 'inquirer';
|
|
4
5
|
import {I3SConverter, Tiles3DConverter} from '@loaders.gl/tile-converter';
|
|
5
6
|
import {DepsInstaller} from './deps-installer/deps-installer';
|
|
6
7
|
import {
|
|
@@ -49,6 +50,8 @@ type TileConversionOptions = {
|
|
|
49
50
|
maxDepth?: number;
|
|
50
51
|
/** 3DTiles->I3S only. Whether the converter generates *.slpk (Scene Layer Package) I3S output file */
|
|
51
52
|
slpk: boolean;
|
|
53
|
+
/** Feature metadata class from EXT_FEATURE_METADATA or EXT_STRUCTURAL_METADATA extensions */
|
|
54
|
+
metadataClass?: string;
|
|
52
55
|
};
|
|
53
56
|
|
|
54
57
|
/* During validation we check that particular options are defined so they can't be undefined */
|
|
@@ -132,8 +135,9 @@ function printHelp(): void {
|
|
|
132
135
|
console.log(
|
|
133
136
|
'--generate-textures [Enable KTX2 textures generation if only one of (JPG, PNG) texture is provided or generate JPG texture if only KTX2 is provided]'
|
|
134
137
|
);
|
|
138
|
+
console.log('--generate-bounding-volumes [Generate obb and mbs bounding volumes from geometry]');
|
|
135
139
|
console.log(
|
|
136
|
-
'--
|
|
140
|
+
'--metadata-class [One of the list of feature metadata classes, detected by converter on "analyze" stage, default: not set]'
|
|
137
141
|
);
|
|
138
142
|
console.log('--validate [Enable validation]');
|
|
139
143
|
process.exit(0); // eslint-disable-line
|
|
@@ -175,7 +179,8 @@ async function convert(options: ValidatedTileConversionOptions) {
|
|
|
175
179
|
generateTextures: options.generateTextures,
|
|
176
180
|
generateBoundingVolumes: options.generateBoundingVolumes,
|
|
177
181
|
validate: options.validate,
|
|
178
|
-
instantNodeWriting: options.instantNodeWriting
|
|
182
|
+
instantNodeWriting: options.instantNodeWriting,
|
|
183
|
+
inquirer
|
|
179
184
|
});
|
|
180
185
|
break;
|
|
181
186
|
default:
|
|
@@ -292,6 +297,8 @@ function parseOptions(args: string[]): TileConversionOptions {
|
|
|
292
297
|
case '--generate-bounding-volumes':
|
|
293
298
|
opts.generateBoundingVolumes = getBooleanValue(index, args);
|
|
294
299
|
break;
|
|
300
|
+
case '--metadata-class':
|
|
301
|
+
opts.metadataClass = getStringValue(index, args);
|
|
295
302
|
case '--help':
|
|
296
303
|
printHelp();
|
|
297
304
|
break;
|
|
@@ -3,6 +3,8 @@ import {ZipLoader} from '@loaders.gl/zip';
|
|
|
3
3
|
import {writeFile} from '../lib/utils/file-utils';
|
|
4
4
|
import {join} from 'path';
|
|
5
5
|
import {ChildProcessProxy} from '@loaders.gl/worker-utils';
|
|
6
|
+
import {DRACO_EXTERNAL_LIBRARIES, DRACO_EXTERNAL_LIBRARY_URLS} from '@loaders.gl/draco';
|
|
7
|
+
import {BASIS_EXTERNAL_LIBRARIES} from '@loaders.gl/textures';
|
|
6
8
|
|
|
7
9
|
// @ts-ignore TS2304: Cannot find name '__VERSION__'.
|
|
8
10
|
const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'beta';
|
|
@@ -23,7 +25,7 @@ export class DepsInstaller {
|
|
|
23
25
|
* This path is '' by default and is not used by tile-converter.
|
|
24
26
|
* It is used in tests to prevent rewriting actual workers during tests running
|
|
25
27
|
*/
|
|
26
|
-
async install(path: string = ''
|
|
28
|
+
async install(path: string = ''): Promise<void> {
|
|
27
29
|
console.log('Installing "EGM2008-5" model...'); // eslint-disable-line no-console
|
|
28
30
|
const fileMap = await load(PGM_LINK, ZipLoader, {});
|
|
29
31
|
|
|
@@ -34,14 +36,47 @@ export class DepsInstaller {
|
|
|
34
36
|
|
|
35
37
|
await writeFile(depsPath, new Uint8Array(fileMap['geoids/egm2008-5.pgm']), 'egm2008-5.pgm');
|
|
36
38
|
|
|
37
|
-
console.log('Installing "I3S Content Loader worker
|
|
38
|
-
await this.
|
|
39
|
+
console.log('Installing "I3S Content Loader" worker'); // eslint-disable-line no-console
|
|
40
|
+
await this.installFromNpm('i3s', 'i3s-content-worker-node.js');
|
|
39
41
|
|
|
40
|
-
console.log('Installing "Draco Loader worker
|
|
41
|
-
await this.
|
|
42
|
+
console.log('Installing "Draco Loader" worker'); // eslint-disable-line no-console
|
|
43
|
+
await this.installFromNpm('draco', 'draco-worker-node.js');
|
|
42
44
|
|
|
43
|
-
console.log('Installing "
|
|
44
|
-
await this.
|
|
45
|
+
console.log('Installing "Draco Writer" worker'); // eslint-disable-line no-console
|
|
46
|
+
await this.installFromNpm('draco', 'draco-writer-worker-node.js');
|
|
47
|
+
|
|
48
|
+
console.log('Installing "Basis Loader" worker'); // eslint-disable-line no-console
|
|
49
|
+
await this.installFromNpm('textures', 'basis-worker-node.js');
|
|
50
|
+
|
|
51
|
+
console.log('Installing "KTX2 Basis Writer" worker'); // eslint-disable-line no-console
|
|
52
|
+
await this.installFromNpm('textures', 'ktx2-basis-writer-worker-node.js');
|
|
53
|
+
|
|
54
|
+
console.log('Installing "Draco decoder" library'); // eslint-disable-line no-console
|
|
55
|
+
await this.installFromUrl(
|
|
56
|
+
DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER],
|
|
57
|
+
'draco',
|
|
58
|
+
DRACO_EXTERNAL_LIBRARIES.DECODER
|
|
59
|
+
);
|
|
60
|
+
await this.installFromUrl(
|
|
61
|
+
DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER_WASM],
|
|
62
|
+
'draco',
|
|
63
|
+
DRACO_EXTERNAL_LIBRARIES.DECODER_WASM
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
console.log('Installing "Draco encoder" library'); // eslint-disable-line no-console
|
|
67
|
+
await this.installFromUrl(
|
|
68
|
+
DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.ENCODER],
|
|
69
|
+
'draco',
|
|
70
|
+
DRACO_EXTERNAL_LIBRARIES.ENCODER
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
console.log('Installing "Basis transcoder" library'); // eslint-disable-line no-console
|
|
74
|
+
await this.installFromNpm('textures', BASIS_EXTERNAL_LIBRARIES.TRANSCODER, 'libs');
|
|
75
|
+
await this.installFromNpm('textures', BASIS_EXTERNAL_LIBRARIES.TRANSCODER_WASM, 'libs');
|
|
76
|
+
|
|
77
|
+
console.log('Installing "Basis encoder" library'); // eslint-disable-line no-console
|
|
78
|
+
await this.installFromNpm('textures', BASIS_EXTERNAL_LIBRARIES.ENCODER, 'libs');
|
|
79
|
+
await this.installFromNpm('textures', BASIS_EXTERNAL_LIBRARIES.ENCODER_WASM, 'libs');
|
|
45
80
|
|
|
46
81
|
console.log('Installing "join-images" npm package');
|
|
47
82
|
const childProcess = new ChildProcessProxy();
|
|
@@ -58,15 +93,25 @@ export class DepsInstaller {
|
|
|
58
93
|
console.log('All dependencies were installed succesfully.'); // eslint-disable-line no-console
|
|
59
94
|
}
|
|
60
95
|
|
|
61
|
-
private async
|
|
96
|
+
private async installFromNpm(module: string, name: string, extraPath: string = '') {
|
|
62
97
|
const fileResponse = await fetchFile(
|
|
63
|
-
`https://unpkg.com/@loaders.gl/${module}@${VERSION}/dist/${name}`
|
|
98
|
+
`https://unpkg.com/@loaders.gl/${module}@${VERSION}/dist/${extraPath}/${name}`
|
|
64
99
|
);
|
|
65
100
|
const fileData = await fileResponse.arrayBuffer();
|
|
66
101
|
if (!fileData) {
|
|
67
102
|
return;
|
|
68
103
|
}
|
|
69
|
-
const path = join(process.cwd(),
|
|
104
|
+
const path = join(process.cwd(), 'modules', module, 'dist', extraPath);
|
|
105
|
+
await writeFile(path, fileData, name);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
private async installFromUrl(url: string, module: string, name: string) {
|
|
109
|
+
const fileResponse = await fetchFile(url);
|
|
110
|
+
const fileData = await fileResponse.arrayBuffer();
|
|
111
|
+
if (!fileData) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const path = join(process.cwd(), 'modules', module, 'dist', 'libs');
|
|
70
115
|
await writeFile(path, fileData, name);
|
|
71
116
|
}
|
|
72
117
|
}
|
|
@@ -2,26 +2,54 @@ import {GLTFAccessorPostprocessed, GLTFMeshPrimitivePostprocessed} from '@loader
|
|
|
2
2
|
import type {NumericArray} from '@loaders.gl/loader-utils';
|
|
3
3
|
import type {
|
|
4
4
|
GLTF_EXT_feature_metadata_FeatureIdTexture,
|
|
5
|
+
GLTF_EXT_feature_metadata_GLTF,
|
|
5
6
|
GLTF_EXT_feature_metadata_Primitive
|
|
6
7
|
} from '@loaders.gl/gltf';
|
|
7
8
|
import {TypedArray} from '@math.gl/core';
|
|
8
9
|
import {TextureImageProperties} from '../types';
|
|
10
|
+
import {EXT_FEATURE_METADATA, EXT_MESH_FEATURES} from '../../constants';
|
|
11
|
+
import {Tiles3DTileContent} from '@loaders.gl/3d-tiles';
|
|
9
12
|
|
|
10
|
-
|
|
11
|
-
|
|
13
|
+
/**
|
|
14
|
+
* Get featureTexture by metadataClass
|
|
15
|
+
* @param tileContent - 3d tile content
|
|
16
|
+
* @param metadataClass - user selected feature metadata class name
|
|
17
|
+
* @returns featureTexture key
|
|
18
|
+
*/
|
|
19
|
+
export function getTextureByMetadataClass(
|
|
20
|
+
tileContent: Tiles3DTileContent,
|
|
21
|
+
metadataClass?: string
|
|
22
|
+
): string | null {
|
|
23
|
+
const extFeatureMetadata = tileContent.gltf?.extensions?.[
|
|
24
|
+
EXT_FEATURE_METADATA
|
|
25
|
+
] as GLTF_EXT_feature_metadata_GLTF;
|
|
26
|
+
if (!extFeatureMetadata?.featureTextures) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
for (const textureKey in extFeatureMetadata.featureTextures) {
|
|
30
|
+
const texture = extFeatureMetadata.featureTextures[textureKey];
|
|
31
|
+
if (texture.class === metadataClass) {
|
|
32
|
+
return textureKey;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
12
37
|
|
|
13
38
|
/**
|
|
14
39
|
* Getting batchIds from 3DTilesNext extensions.
|
|
15
40
|
* @param attributes - gltf accessors
|
|
16
41
|
* @param primitive - gltf primitive data
|
|
17
42
|
* @param images - gltf texture images
|
|
43
|
+
* @param featureTexture - feature texture key
|
|
44
|
+
* @return array of batch IDs
|
|
18
45
|
*/
|
|
19
46
|
export function handleBatchIdsExtensions(
|
|
20
47
|
attributes: {
|
|
21
48
|
[key: string]: GLTFAccessorPostprocessed;
|
|
22
49
|
},
|
|
23
50
|
primitive: GLTFMeshPrimitivePostprocessed,
|
|
24
|
-
images: (TextureImageProperties | null)[]
|
|
51
|
+
images: (TextureImageProperties | null)[],
|
|
52
|
+
featureTexture: string | null
|
|
25
53
|
): NumericArray {
|
|
26
54
|
const extensions = primitive?.extensions;
|
|
27
55
|
|
|
@@ -35,7 +63,8 @@ export function handleBatchIdsExtensions(
|
|
|
35
63
|
return handleExtFeatureMetadataExtension(
|
|
36
64
|
attributes,
|
|
37
65
|
extensionData as GLTF_EXT_feature_metadata_Primitive,
|
|
38
|
-
images
|
|
66
|
+
images,
|
|
67
|
+
featureTexture
|
|
39
68
|
);
|
|
40
69
|
case EXT_MESH_FEATURES:
|
|
41
70
|
console.warn('EXT_mesh_features extension is not supported yet');
|
|
@@ -51,16 +80,18 @@ export function handleBatchIdsExtensions(
|
|
|
51
80
|
/**
|
|
52
81
|
* Get batchIds from EXT_feature_metadata extension.
|
|
53
82
|
* Docs - https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_feature_metadata
|
|
54
|
-
* @param attributes
|
|
55
|
-
* @param extFeatureMetadata
|
|
56
|
-
* @param textures
|
|
83
|
+
* @param attributes - glTF attributes
|
|
84
|
+
* @param extFeatureMetadata - primitive-level EXT_FEATURE_METADATA extension data
|
|
85
|
+
* @param textures - texture images
|
|
86
|
+
* @param featureTexture - feature texture key
|
|
57
87
|
*/
|
|
58
88
|
function handleExtFeatureMetadataExtension(
|
|
59
89
|
attributes: {
|
|
60
90
|
[key: string]: GLTFAccessorPostprocessed;
|
|
61
91
|
},
|
|
62
92
|
extFeatureMetadata: GLTF_EXT_feature_metadata_Primitive,
|
|
63
|
-
images: (TextureImageProperties | null)[]
|
|
93
|
+
images: (TextureImageProperties | null)[],
|
|
94
|
+
featureTexture: string | null
|
|
64
95
|
): NumericArray {
|
|
65
96
|
// Take only first extension object to get batchIds attribute name.
|
|
66
97
|
const featureIdAttribute = extFeatureMetadata?.featureIdAttributes?.[0];
|
|
@@ -93,10 +124,6 @@ function handleExtFeatureMetadataExtension(
|
|
|
93
124
|
return generateBatchIdsFromTexture(featureIdTexture, textureCoordinates, images);
|
|
94
125
|
}
|
|
95
126
|
|
|
96
|
-
// Take only first extension texture to get batchIds from the root EXT_feature_metadata object.
|
|
97
|
-
const featureTexture =
|
|
98
|
-
extFeatureMetadata?.featureTextures && extFeatureMetadata?.featureTextures[0];
|
|
99
|
-
|
|
100
127
|
if (featureTexture) {
|
|
101
128
|
const batchIdsAttribute = attributes[featureTexture];
|
|
102
129
|
return batchIdsAttribute.value;
|
|
@@ -199,19 +199,26 @@ function unifyObjectsByFeatureId(
|
|
|
199
199
|
|
|
200
200
|
for (let index = 0; index < sortedData.length; index++) {
|
|
201
201
|
const currentObject = sortedData[index];
|
|
202
|
-
const
|
|
202
|
+
const existingObject = uniqueObjects.find((obj) => obj.featureId === currentObject.featureId);
|
|
203
203
|
|
|
204
|
-
if (
|
|
205
|
-
|
|
206
|
-
|
|
204
|
+
if (existingObject) {
|
|
205
|
+
existingObject.positions = concatenateTypedArrays(
|
|
206
|
+
existingObject.positions,
|
|
207
207
|
currentObject.positions
|
|
208
208
|
);
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
209
|
+
existingObject.normals = concatenateTypedArrays(
|
|
210
|
+
existingObject.normals,
|
|
211
|
+
currentObject.normals
|
|
212
|
+
);
|
|
213
|
+
existingObject.colors = concatenateTypedArrays(existingObject.colors, currentObject.colors);
|
|
214
|
+
existingObject.texCoords = concatenateTypedArrays(
|
|
215
|
+
existingObject.texCoords,
|
|
213
216
|
currentObject.texCoords
|
|
214
217
|
);
|
|
218
|
+
existingObject.uvRegions = concatenateTypedArrays(
|
|
219
|
+
existingObject.uvRegions,
|
|
220
|
+
currentObject.uvRegions
|
|
221
|
+
);
|
|
215
222
|
} else {
|
|
216
223
|
uniqueObjects.push(currentObject);
|
|
217
224
|
}
|