@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.
Files changed (107) hide show
  1. package/bin/converter.js +1 -1
  2. package/dist/constants.d.ts +2 -0
  3. package/dist/constants.d.ts.map +1 -1
  4. package/dist/constants.js +3 -1
  5. package/dist/converter-cli.js +10 -2
  6. package/dist/converter.min.js +172 -103
  7. package/dist/deps-installer/deps-installer.d.ts +3 -2
  8. package/dist/deps-installer/deps-installer.d.ts.map +1 -1
  9. package/dist/deps-installer/deps-installer.js +36 -10
  10. package/dist/dist.min.js +226 -151
  11. package/dist/es5/constants.js +5 -1
  12. package/dist/es5/constants.js.map +1 -1
  13. package/dist/es5/converter-cli.js +7 -2
  14. package/dist/es5/converter-cli.js.map +1 -1
  15. package/dist/es5/deps-installer/deps-installer.js +112 -38
  16. package/dist/es5/deps-installer/deps-installer.js.map +1 -1
  17. package/dist/es5/i3s-converter/helpers/batch-ids-extensions.js +21 -8
  18. package/dist/es5/i3s-converter/helpers/batch-ids-extensions.js.map +1 -1
  19. package/dist/es5/i3s-converter/helpers/geometry-attributes.js +7 -6
  20. package/dist/es5/i3s-converter/helpers/geometry-attributes.js.map +1 -1
  21. package/dist/es5/i3s-converter/helpers/geometry-converter.js +78 -67
  22. package/dist/es5/i3s-converter/helpers/geometry-converter.js.map +1 -1
  23. package/dist/es5/i3s-converter/helpers/preprocess-3d-tiles.js +38 -9
  24. package/dist/es5/i3s-converter/helpers/preprocess-3d-tiles.js.map +1 -1
  25. package/dist/es5/i3s-converter/i3s-converter.js +86 -99
  26. package/dist/es5/i3s-converter/i3s-converter.js.map +1 -1
  27. package/dist/es5/i3s-converter/types.js +11 -11
  28. package/dist/es5/i3s-converter/types.js.map +1 -1
  29. package/dist/es5/i3s-server/controllers/slpk-controller.js +1 -1
  30. package/dist/es5/i3s-server/controllers/slpk-controller.js.map +1 -1
  31. package/dist/es5/index.js +3 -3
  32. package/dist/es5/index.js.map +1 -1
  33. package/dist/es5/pgm-loader.js +1 -1
  34. package/dist/es5/slpk-extractor/helpers/{file-handle-provider.js → file-handle-file.js} +9 -9
  35. package/dist/es5/slpk-extractor/helpers/file-handle-file.js.map +1 -0
  36. package/dist/es5/slpk-extractor/slpk-extractor.js +5 -5
  37. package/dist/es5/slpk-extractor/slpk-extractor.js.map +1 -1
  38. package/dist/esm/constants.js +2 -0
  39. package/dist/esm/constants.js.map +1 -1
  40. package/dist/esm/converter-cli.js +7 -2
  41. package/dist/esm/converter-cli.js.map +1 -1
  42. package/dist/esm/deps-installer/deps-installer.js +37 -11
  43. package/dist/esm/deps-installer/deps-installer.js.map +1 -1
  44. package/dist/esm/i3s-converter/helpers/batch-ids-extensions.js +18 -6
  45. package/dist/esm/i3s-converter/helpers/batch-ids-extensions.js.map +1 -1
  46. package/dist/esm/i3s-converter/helpers/geometry-attributes.js +7 -6
  47. package/dist/esm/i3s-converter/helpers/geometry-attributes.js.map +1 -1
  48. package/dist/esm/i3s-converter/helpers/geometry-converter.js +37 -25
  49. package/dist/esm/i3s-converter/helpers/geometry-converter.js.map +1 -1
  50. package/dist/esm/i3s-converter/helpers/preprocess-3d-tiles.js +28 -9
  51. package/dist/esm/i3s-converter/helpers/preprocess-3d-tiles.js.map +1 -1
  52. package/dist/esm/i3s-converter/i3s-converter.js +49 -36
  53. package/dist/esm/i3s-converter/i3s-converter.js.map +1 -1
  54. package/dist/esm/i3s-converter/types.js +9 -9
  55. package/dist/esm/i3s-converter/types.js.map +1 -1
  56. package/dist/esm/i3s-server/bin/i3s-server.min.js +71 -71
  57. package/dist/esm/i3s-server/controllers/slpk-controller.js +2 -2
  58. package/dist/esm/i3s-server/controllers/slpk-controller.js.map +1 -1
  59. package/dist/esm/index.js +1 -1
  60. package/dist/esm/index.js.map +1 -1
  61. package/dist/esm/pgm-loader.js +1 -1
  62. package/dist/esm/slpk-extractor/helpers/{file-handle-provider.js → file-handle-file.js} +3 -3
  63. package/dist/esm/slpk-extractor/helpers/file-handle-file.js.map +1 -0
  64. package/dist/esm/slpk-extractor/slpk-extractor.js +3 -3
  65. package/dist/esm/slpk-extractor/slpk-extractor.js.map +1 -1
  66. package/dist/i3s-converter/helpers/batch-ids-extensions.d.ts +11 -1
  67. package/dist/i3s-converter/helpers/batch-ids-extensions.d.ts.map +1 -1
  68. package/dist/i3s-converter/helpers/batch-ids-extensions.js +33 -13
  69. package/dist/i3s-converter/helpers/geometry-attributes.js +7 -6
  70. package/dist/i3s-converter/helpers/geometry-converter.d.ts +7 -6
  71. package/dist/i3s-converter/helpers/geometry-converter.d.ts.map +1 -1
  72. package/dist/i3s-converter/helpers/geometry-converter.js +59 -47
  73. package/dist/i3s-converter/helpers/preprocess-3d-tiles.d.ts +2 -2
  74. package/dist/i3s-converter/helpers/preprocess-3d-tiles.d.ts.map +1 -1
  75. package/dist/i3s-converter/helpers/preprocess-3d-tiles.js +39 -14
  76. package/dist/i3s-converter/i3s-converter.d.ts +2 -1
  77. package/dist/i3s-converter/i3s-converter.d.ts.map +1 -1
  78. package/dist/i3s-converter/i3s-converter.js +49 -31
  79. package/dist/i3s-converter/types.d.ts +4 -2
  80. package/dist/i3s-converter/types.d.ts.map +1 -1
  81. package/dist/i3s-converter/types.js +11 -11
  82. package/dist/i3s-server/controllers/slpk-controller.js +1 -1
  83. package/dist/index.d.ts +1 -1
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +3 -3
  86. package/dist/slpk-extractor/helpers/{file-handle-provider.d.ts → file-handle-file.d.ts} +5 -5
  87. package/dist/slpk-extractor/helpers/file-handle-file.d.ts.map +1 -0
  88. package/dist/slpk-extractor/helpers/{file-handle-provider.js → file-handle-file.js} +5 -5
  89. package/dist/slpk-extractor/slpk-extractor.js +5 -5
  90. package/dist/slpk-extractor.min.js +32 -32
  91. package/package.json +15 -14
  92. package/src/constants.ts +3 -0
  93. package/src/converter-cli.ts +9 -2
  94. package/src/deps-installer/deps-installer.ts +55 -10
  95. package/src/i3s-converter/helpers/batch-ids-extensions.ts +39 -12
  96. package/src/i3s-converter/helpers/geometry-attributes.ts +15 -8
  97. package/src/i3s-converter/helpers/geometry-converter.ts +84 -48
  98. package/src/i3s-converter/helpers/preprocess-3d-tiles.ts +48 -18
  99. package/src/i3s-converter/i3s-converter.ts +65 -39
  100. package/src/i3s-converter/types.ts +4 -2
  101. package/src/i3s-server/controllers/slpk-controller.ts +2 -2
  102. package/src/index.ts +1 -1
  103. package/src/slpk-extractor/helpers/{file-handle-provider.ts → file-handle-file.ts} +5 -5
  104. package/src/slpk-extractor/slpk-extractor.ts +3 -3
  105. package/dist/es5/slpk-extractor/helpers/file-handle-provider.js.map +0 -1
  106. package/dist/esm/slpk-extractor/helpers/file-handle-provider.js.map +0 -1
  107. 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.18",
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.18",
49
- "@loaders.gl/crypto": "4.0.0-alpha.18",
50
- "@loaders.gl/draco": "4.0.0-alpha.18",
51
- "@loaders.gl/gltf": "4.0.0-alpha.18",
52
- "@loaders.gl/i3s": "4.0.0-alpha.18",
53
- "@loaders.gl/images": "4.0.0-alpha.18",
54
- "@loaders.gl/loader-utils": "4.0.0-alpha.18",
55
- "@loaders.gl/polyfills": "4.0.0-alpha.18",
56
- "@loaders.gl/textures": "4.0.0-alpha.18",
57
- "@loaders.gl/tiles": "4.0.0-alpha.18",
58
- "@loaders.gl/worker-utils": "4.0.0-alpha.18",
59
- "@loaders.gl/zip": "4.0.0-alpha.18",
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": "7bc633f46560f661bdd46cf1015ea27b3694ebce",
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
@@ -1,2 +1,5 @@
1
1
  export const BROWSER_ERROR_MESSAGE =
2
2
  'Tile converter does not work in browser, only in node js environment';
3
+
4
+ export const EXT_MESH_FEATURES = 'EXT_mesh_features';
5
+ export const EXT_FEATURE_METADATA = 'EXT_feature_metadata';
@@ -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
- '--generate-bounding-volumes [Will generate obb and mbs bounding volumes from geometry]'
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 = '', workersPath: string = ''): Promise<void> {
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"'); // eslint-disable-line no-console
38
- await this.installWorker('i3s', 'i3s-content-worker-node.js', workersPath);
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"'); // eslint-disable-line no-console
41
- await this.installWorker('draco', 'draco-worker-node.js', workersPath);
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 "Basis Loader worker"'); // eslint-disable-line no-console
44
- await this.installWorker('textures', 'basis-worker-node.js', workersPath);
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 installWorker(module: string, name: string, extraPath: string) {
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(), extraPath, 'modules', module, 'dist');
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
- const EXT_MESH_FEATURES = 'EXT_mesh_features';
11
- const EXT_FEATURE_METADATA = 'EXT_feature_metadata';
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 existedObject = uniqueObjects.find((obj) => obj.featureId === currentObject.featureId);
202
+ const existingObject = uniqueObjects.find((obj) => obj.featureId === currentObject.featureId);
203
203
 
204
- if (existedObject) {
205
- existedObject.positions = concatenateTypedArrays(
206
- existedObject.positions,
204
+ if (existingObject) {
205
+ existingObject.positions = concatenateTypedArrays(
206
+ existingObject.positions,
207
207
  currentObject.positions
208
208
  );
209
- existedObject.normals = concatenateTypedArrays(existedObject.normals, currentObject.normals);
210
- existedObject.colors = concatenateTypedArrays(existedObject.colors, currentObject.colors);
211
- existedObject.texCoords = concatenateTypedArrays(
212
- existedObject.texCoords,
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
  }