@loaders.gl/gltf 3.3.0-alpha.1 → 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.
Files changed (201) hide show
  1. package/dist/dist.min.js +236 -148
  2. package/dist/es5/bundle.js +0 -1
  3. package/dist/es5/bundle.js.map +1 -1
  4. package/dist/es5/glb-loader.js +2 -13
  5. package/dist/es5/glb-loader.js.map +1 -1
  6. package/dist/es5/glb-writer.js +3 -6
  7. package/dist/es5/glb-writer.js.map +1 -1
  8. package/dist/es5/gltf-loader.js +11 -23
  9. package/dist/es5/gltf-loader.js.map +1 -1
  10. package/dist/es5/gltf-writer.js +2 -5
  11. package/dist/es5/gltf-writer.js.map +1 -1
  12. package/dist/es5/index.js +10 -17
  13. package/dist/es5/index.js.map +1 -1
  14. package/dist/es5/lib/api/gltf-extensions.js +15 -47
  15. package/dist/es5/lib/api/gltf-extensions.js.map +1 -1
  16. package/dist/es5/lib/api/gltf-scenegraph.js +128 -96
  17. package/dist/es5/lib/api/gltf-scenegraph.js.map +1 -1
  18. package/dist/es5/lib/api/normalize-gltf-v1.js +34 -72
  19. package/dist/es5/lib/api/normalize-gltf-v1.js.map +1 -1
  20. package/dist/es5/lib/api/post-process-gltf.js +26 -89
  21. package/dist/es5/lib/api/post-process-gltf.js.map +1 -1
  22. package/dist/es5/lib/encoders/encode-glb.js +10 -8
  23. package/dist/es5/lib/encoders/encode-glb.js.map +1 -1
  24. package/dist/es5/lib/encoders/encode-gltf.js +3 -6
  25. package/dist/es5/lib/encoders/encode-gltf.js.map +1 -1
  26. package/dist/es5/lib/extensions/EXT_meshopt_compression.js +2 -28
  27. package/dist/es5/lib/extensions/EXT_meshopt_compression.js.map +1 -1
  28. package/dist/es5/lib/extensions/EXT_texture_webp.js +5 -18
  29. package/dist/es5/lib/extensions/EXT_texture_webp.js.map +1 -1
  30. package/dist/es5/lib/extensions/KHR_binary_gltf.js +5 -12
  31. package/dist/es5/lib/extensions/KHR_binary_gltf.js.map +1 -1
  32. package/dist/es5/lib/extensions/KHR_draco_mesh_compression.js +11 -79
  33. package/dist/es5/lib/extensions/KHR_draco_mesh_compression.js.map +1 -1
  34. package/dist/es5/lib/extensions/KHR_texture_basisu.js +5 -14
  35. package/dist/es5/lib/extensions/KHR_texture_basisu.js.map +1 -1
  36. package/dist/es5/lib/extensions/KHR_texture_transform.js +17 -72
  37. package/dist/es5/lib/extensions/KHR_texture_transform.js.map +1 -1
  38. package/dist/es5/lib/extensions/deprecated/EXT_feature_metadata.js +110 -0
  39. package/dist/es5/lib/extensions/deprecated/EXT_feature_metadata.js.map +1 -0
  40. package/dist/es5/lib/extensions/deprecated/KHR_lights_punctual.js +0 -24
  41. package/dist/es5/lib/extensions/deprecated/KHR_lights_punctual.js.map +1 -1
  42. package/dist/es5/lib/extensions/deprecated/KHR_materials_unlit.js +3 -20
  43. package/dist/es5/lib/extensions/deprecated/KHR_materials_unlit.js.map +1 -1
  44. package/dist/es5/lib/extensions/deprecated/KHR_techniques_webgl.js +12 -29
  45. package/dist/es5/lib/extensions/deprecated/KHR_techniques_webgl.js.map +1 -1
  46. package/dist/es5/lib/gltf-utils/get-typed-array.js +1 -1
  47. package/dist/es5/lib/gltf-utils/get-typed-array.js.map +1 -1
  48. package/dist/es5/lib/gltf-utils/gltf-attribute-utils.js +5 -17
  49. package/dist/es5/lib/gltf-utils/gltf-attribute-utils.js.map +1 -1
  50. package/dist/es5/lib/gltf-utils/gltf-constants.js +3 -4
  51. package/dist/es5/lib/gltf-utils/gltf-constants.js.map +1 -1
  52. package/dist/es5/lib/gltf-utils/gltf-utils.js +1 -8
  53. package/dist/es5/lib/gltf-utils/gltf-utils.js.map +1 -1
  54. package/dist/es5/lib/gltf-utils/resolve-url.js +0 -5
  55. package/dist/es5/lib/gltf-utils/resolve-url.js.map +1 -1
  56. package/dist/es5/lib/parsers/parse-glb.js +11 -17
  57. package/dist/es5/lib/parsers/parse-glb.js.map +1 -1
  58. package/dist/es5/lib/parsers/parse-gltf.js +21 -79
  59. package/dist/es5/lib/parsers/parse-gltf.js.map +1 -1
  60. package/dist/es5/lib/types/glb-types.js.map +1 -1
  61. package/dist/es5/lib/types/gltf-json-schema.js.map +1 -1
  62. package/dist/es5/lib/types/gltf-postprocessed-schema.js.map +1 -1
  63. package/dist/es5/lib/types/gltf-types.js.map +1 -1
  64. package/dist/es5/lib/utils/assert.js +0 -1
  65. package/dist/es5/lib/utils/assert.js.map +1 -1
  66. package/dist/es5/lib/utils/version.js +1 -1
  67. package/dist/es5/lib/utils/version.js.map +1 -1
  68. package/dist/es5/meshopt/meshopt-decoder.js +10 -47
  69. package/dist/es5/meshopt/meshopt-decoder.js.map +1 -1
  70. package/dist/es5/webp/webp.js +3 -19
  71. package/dist/es5/webp/webp.js.map +1 -1
  72. package/dist/esm/bundle.js +1 -1
  73. package/dist/esm/bundle.js.map +1 -1
  74. package/dist/esm/glb-loader.js +0 -1
  75. package/dist/esm/glb-loader.js.map +1 -1
  76. package/dist/esm/glb-writer.js +3 -1
  77. package/dist/esm/glb-writer.js.map +1 -1
  78. package/dist/esm/gltf-loader.js +9 -3
  79. package/dist/esm/gltf-loader.js.map +1 -1
  80. package/dist/esm/gltf-writer.js +3 -2
  81. package/dist/esm/gltf-writer.js.map +1 -1
  82. package/dist/esm/index.js +4 -0
  83. package/dist/esm/index.js.map +1 -1
  84. package/dist/esm/lib/api/gltf-extensions.js +17 -9
  85. package/dist/esm/lib/api/gltf-extensions.js.map +1 -1
  86. package/dist/esm/lib/api/gltf-scenegraph.js +40 -68
  87. package/dist/esm/lib/api/gltf-scenegraph.js.map +1 -1
  88. package/dist/esm/lib/api/normalize-gltf-v1.js +5 -36
  89. package/dist/esm/lib/api/normalize-gltf-v1.js.map +1 -1
  90. package/dist/esm/lib/api/post-process-gltf.js +26 -93
  91. package/dist/esm/lib/api/post-process-gltf.js.map +1 -1
  92. package/dist/esm/lib/encoders/encode-glb.js +9 -2
  93. package/dist/esm/lib/encoders/encode-glb.js.map +1 -1
  94. package/dist/esm/lib/encoders/encode-gltf.js +6 -4
  95. package/dist/esm/lib/encoders/encode-gltf.js.map +1 -1
  96. package/dist/esm/lib/extensions/EXT_meshopt_compression.js +5 -6
  97. package/dist/esm/lib/extensions/EXT_meshopt_compression.js.map +1 -1
  98. package/dist/esm/lib/extensions/EXT_texture_webp.js +4 -6
  99. package/dist/esm/lib/extensions/EXT_texture_webp.js.map +1 -1
  100. package/dist/esm/lib/extensions/KHR_binary_gltf.js +3 -2
  101. package/dist/esm/lib/extensions/KHR_binary_gltf.js.map +1 -1
  102. package/dist/esm/lib/extensions/KHR_draco_mesh_compression.js +18 -17
  103. package/dist/esm/lib/extensions/KHR_draco_mesh_compression.js.map +1 -1
  104. package/dist/esm/lib/extensions/KHR_texture_basisu.js +4 -3
  105. package/dist/esm/lib/extensions/KHR_texture_basisu.js.map +1 -1
  106. package/dist/esm/lib/extensions/KHR_texture_transform.js +8 -34
  107. package/dist/esm/lib/extensions/KHR_texture_transform.js.map +1 -1
  108. package/dist/esm/lib/extensions/deprecated/EXT_feature_metadata.js +84 -0
  109. package/dist/esm/lib/extensions/deprecated/EXT_feature_metadata.js.map +1 -0
  110. package/dist/esm/lib/extensions/deprecated/KHR_lights_punctual.js +4 -4
  111. package/dist/esm/lib/extensions/deprecated/KHR_lights_punctual.js.map +1 -1
  112. package/dist/esm/lib/extensions/deprecated/KHR_materials_unlit.js +4 -3
  113. package/dist/esm/lib/extensions/deprecated/KHR_materials_unlit.js.map +1 -1
  114. package/dist/esm/lib/extensions/deprecated/KHR_techniques_webgl.js +10 -9
  115. package/dist/esm/lib/extensions/deprecated/KHR_techniques_webgl.js.map +1 -1
  116. package/dist/esm/lib/gltf-utils/get-typed-array.js +4 -0
  117. package/dist/esm/lib/gltf-utils/get-typed-array.js.map +1 -1
  118. package/dist/esm/lib/gltf-utils/gltf-attribute-utils.js +7 -11
  119. package/dist/esm/lib/gltf-utils/gltf-attribute-utils.js.map +1 -1
  120. package/dist/esm/lib/gltf-utils/gltf-constants.js +1 -0
  121. package/dist/esm/lib/gltf-utils/gltf-constants.js.map +1 -1
  122. package/dist/esm/lib/gltf-utils/gltf-utils.js +0 -2
  123. package/dist/esm/lib/gltf-utils/gltf-utils.js.map +1 -1
  124. package/dist/esm/lib/gltf-utils/resolve-url.js +1 -4
  125. package/dist/esm/lib/gltf-utils/resolve-url.js.map +1 -1
  126. package/dist/esm/lib/parsers/parse-glb.js +19 -16
  127. package/dist/esm/lib/parsers/parse-glb.js.map +1 -1
  128. package/dist/esm/lib/parsers/parse-gltf.js +15 -17
  129. package/dist/esm/lib/parsers/parse-gltf.js.map +1 -1
  130. package/dist/esm/lib/types/glb-types.js.map +1 -1
  131. package/dist/esm/lib/types/gltf-json-schema.js.map +1 -1
  132. package/dist/esm/lib/types/gltf-postprocessed-schema.js.map +1 -1
  133. package/dist/esm/lib/types/gltf-types.js.map +1 -1
  134. package/dist/esm/lib/utils/assert.js +1 -0
  135. package/dist/esm/lib/utils/assert.js.map +1 -1
  136. package/dist/esm/lib/utils/version.js +2 -1
  137. package/dist/esm/lib/utils/version.js.map +1 -1
  138. package/dist/esm/meshopt/meshopt-decoder.js +11 -15
  139. package/dist/esm/meshopt/meshopt-decoder.js.map +1 -1
  140. package/dist/esm/webp/webp.js +3 -5
  141. package/dist/esm/webp/webp.js.map +1 -1
  142. package/dist/glb-loader.d.ts +1 -1
  143. package/dist/glb-loader.d.ts.map +1 -1
  144. package/dist/gltf-loader.d.ts +1 -1
  145. package/dist/gltf-loader.d.ts.map +1 -1
  146. package/dist/gltf-writer.d.ts +1 -1
  147. package/dist/gltf-writer.d.ts.map +1 -1
  148. package/dist/index.d.ts +2 -1
  149. package/dist/index.d.ts.map +1 -1
  150. package/dist/lib/api/gltf-extensions.d.ts +1 -1
  151. package/dist/lib/api/gltf-extensions.d.ts.map +1 -1
  152. package/dist/lib/api/gltf-extensions.js +8 -2
  153. package/dist/lib/api/gltf-scenegraph.d.ts +5 -11
  154. package/dist/lib/api/gltf-scenegraph.d.ts.map +1 -1
  155. package/dist/lib/api/gltf-scenegraph.js +13 -0
  156. package/dist/lib/api/normalize-gltf-v1.d.ts.map +1 -1
  157. package/dist/lib/api/normalize-gltf-v1.js +6 -2
  158. package/dist/lib/extensions/EXT_meshopt_compression.js +1 -1
  159. package/dist/lib/extensions/EXT_texture_webp.d.ts.map +1 -1
  160. package/dist/lib/extensions/EXT_texture_webp.js +1 -0
  161. package/dist/lib/extensions/KHR_binary_gltf.js +1 -1
  162. package/dist/lib/extensions/KHR_draco_mesh_compression.js +1 -1
  163. package/dist/lib/extensions/KHR_texture_basisu.d.ts.map +1 -1
  164. package/dist/lib/extensions/KHR_texture_basisu.js +1 -0
  165. package/dist/lib/extensions/deprecated/EXT_feature_metadata.d.ts +6 -0
  166. package/dist/lib/extensions/deprecated/EXT_feature_metadata.d.ts.map +1 -0
  167. package/dist/lib/extensions/deprecated/EXT_feature_metadata.js +118 -0
  168. package/dist/lib/extensions/deprecated/KHR_materials_unlit.js +2 -2
  169. package/dist/lib/extensions/deprecated/KHR_techniques_webgl.d.ts.map +1 -1
  170. package/dist/lib/extensions/deprecated/KHR_techniques_webgl.js +1 -0
  171. package/dist/lib/parsers/parse-glb.d.ts +1 -1
  172. package/dist/lib/parsers/parse-glb.d.ts.map +1 -1
  173. package/dist/lib/parsers/parse-gltf.d.ts +1 -1
  174. package/dist/lib/parsers/parse-gltf.d.ts.map +1 -1
  175. package/dist/lib/parsers/parse-gltf.js +9 -2
  176. package/dist/lib/types/glb-types.d.ts +2 -2
  177. package/dist/lib/types/glb-types.d.ts.map +1 -1
  178. package/dist/lib/types/gltf-json-schema.d.ts +394 -9
  179. package/dist/lib/types/gltf-json-schema.d.ts.map +1 -1
  180. package/dist/lib/types/gltf-postprocessed-schema.d.ts +1 -1
  181. package/dist/lib/types/gltf-postprocessed-schema.d.ts.map +1 -1
  182. package/dist/lib/types/gltf-types.d.ts +8 -5
  183. package/dist/lib/types/gltf-types.d.ts.map +1 -1
  184. package/dist/webp/webp.d.ts +1 -1
  185. package/dist/webp/webp.d.ts.map +1 -1
  186. package/package.json +6 -6
  187. package/src/index.ts +7 -1
  188. package/src/lib/api/gltf-extensions.ts +3 -1
  189. package/src/lib/api/gltf-scenegraph.ts +21 -12
  190. package/src/lib/api/normalize-gltf-v1.ts +2 -1
  191. package/src/lib/extensions/EXT_meshopt_compression.ts +1 -1
  192. package/src/lib/extensions/EXT_texture_webp.ts +1 -0
  193. package/src/lib/extensions/KHR_binary_gltf.ts +1 -1
  194. package/src/lib/extensions/KHR_draco_mesh_compression.ts +1 -1
  195. package/src/lib/extensions/KHR_texture_basisu.ts +1 -0
  196. package/src/lib/extensions/deprecated/EXT_feature_metadata.ts +163 -0
  197. package/src/lib/extensions/deprecated/KHR_materials_unlit.ts +3 -3
  198. package/src/lib/extensions/deprecated/KHR_techniques_webgl.ts +1 -0
  199. package/src/lib/parsers/parse-gltf.ts +4 -1
  200. package/src/lib/types/gltf-json-schema.ts +432 -3
  201. package/src/lib/types/gltf-types.ts +9 -2
package/src/index.ts CHANGED
@@ -15,15 +15,20 @@ export type {
15
15
  GLTFTexture,
16
16
  GLTFImage,
17
17
  GLTFPostprocessed,
18
+ GLTFAccessorPostprocessed,
18
19
  GLTFNodePostprocessed,
19
20
  GLTFMaterialPostprocessed,
21
+ GLTFMeshPostprocessed,
22
+ GLTFMeshPrimitivePostprocessed,
20
23
  GLTFImagePostprocessed,
24
+ GLTFTexturePostprocessed,
21
25
  // The following extensions are handled by the GLTFLoader and removed from the parsed glTF (disable via options.gltf.excludeExtensions)
22
26
  GLTF_KHR_binary_glTF,
23
27
  GLTF_KHR_draco_mesh_compression,
24
28
  GLTF_KHR_texture_basisu,
25
29
  GLTF_EXT_meshopt_compression,
26
- GLTF_EXT_texture_webp
30
+ GLTF_EXT_texture_webp,
31
+ GLTF_EXT_feature_metadata
27
32
  } from './lib/types/gltf-types';
28
33
 
29
34
  // glTF loader/writer definition objects
@@ -39,3 +44,4 @@ export {default as GLTFScenegraph} from './lib/api/gltf-scenegraph';
39
44
  export {postProcessGLTF} from './lib/api/post-process-gltf';
40
45
  export type {Mesh} from './lib/types/gltf-json-schema';
41
46
  export type {GLTFObject} from './lib/types/gltf-types';
47
+ export type {Node, Accessor, Image} from './lib/types/gltf-postprocessed-schema';
@@ -16,6 +16,7 @@ import * as KHR_texture_transform from '../extensions/KHR_texture_transform';
16
16
  import * as KHR_lights_punctual from '../extensions/deprecated/KHR_lights_punctual';
17
17
  import * as KHR_materials_unlit from '../extensions/deprecated/KHR_materials_unlit';
18
18
  import * as KHR_techniques_webgl from '../extensions/deprecated/KHR_techniques_webgl';
19
+ import * as EXT_feature_metadata from '../extensions/deprecated/EXT_feature_metadata';
19
20
 
20
21
  // Vendor extensions
21
22
 
@@ -52,7 +53,8 @@ export const EXTENSIONS: GLTFExtensionPlugin[] = [
52
53
  KHR_lights_punctual,
53
54
  KHR_materials_unlit,
54
55
  KHR_techniques_webgl,
55
- KHR_texture_transform
56
+ KHR_texture_transform,
57
+ EXT_feature_metadata
56
58
  ];
57
59
 
58
60
  /** Call before any resource loading starts */
@@ -10,7 +10,8 @@ import type {
10
10
  GLTFTexture,
11
11
  GLTFImage,
12
12
  GLTFBuffer,
13
- GLTFBufferView
13
+ GLTFBufferView,
14
+ GLTFWithBuffers
14
15
  } from '../types/gltf-types';
15
16
 
16
17
  import {getBinaryImageMetadata} from '@loaders.gl/images';
@@ -22,12 +23,6 @@ import {
22
23
  getComponentTypeFromArray
23
24
  } from '../gltf-utils/gltf-utils';
24
25
 
25
- type GLTFWithBuffers = {
26
- json: GLTF;
27
- buffers: any[];
28
- binary?: ArrayBuffer;
29
- };
30
-
31
26
  const DEFAULT_GLTF_JSON: GLTF = {
32
27
  asset: {
33
28
  version: '2.0',
@@ -68,13 +63,13 @@ export default class GLTFScenegraph {
68
63
  return this.gltf.json;
69
64
  }
70
65
 
71
- getApplicationData(key: string): {[key: string]: any} {
66
+ getApplicationData(key: string): unknown {
72
67
  // TODO - Data is already unpacked by GLBParser
73
68
  const data = this.json[key];
74
69
  return data;
75
70
  }
76
71
 
77
- getExtraData(key: string): {[key: string]: any} {
72
+ getExtraData(key: string): {[key: string]: unknown} {
78
73
  // TODO - Data is already unpacked by GLBParser
79
74
  const extras = this.json.extras || {};
80
75
  return extras[key];
@@ -99,6 +94,10 @@ export default class GLTFScenegraph {
99
94
  return this.json.extensionsUsed || [];
100
95
  }
101
96
 
97
+ getRemovedExtensions(): string[] {
98
+ return (this.json.extensionsRemoved || []) as string[];
99
+ }
100
+
102
101
  getObjectExtension<T = Extension>(object: {[key: string]: any}, extensionName: string): T | null {
103
102
  const extensions = object.extensions || {};
104
103
  return extensions[extensionName];
@@ -157,7 +156,7 @@ export default class GLTFScenegraph {
157
156
  if (typeof index === 'object') {
158
157
  return index;
159
158
  }
160
- const object = this.json[array] && this.json[array][index];
159
+ const object = this.json[array] && (this.json[array] as {}[])[index];
161
160
  if (!object) {
162
161
  throw new Error(`glTF file error: Could not find ${array}[${index}]`); // eslint-disable-line
163
162
  }
@@ -234,7 +233,7 @@ export default class GLTFScenegraph {
234
233
  */
235
234
  addExtraData(key: string, data: object): GLTFScenegraph {
236
235
  this.json.extras = this.json.extras || {};
237
- this.json.extras[key] = data;
236
+ (this.json.extras as Record<string, unknown>)[key] = data;
238
237
  return this;
239
238
  }
240
239
 
@@ -269,7 +268,7 @@ export default class GLTFScenegraph {
269
268
  addExtension(extensionName: string, extensionData: object = {}): object {
270
269
  assert(extensionData);
271
270
  this.json.extensions = this.json.extensions || {};
272
- this.json.extensions[extensionName] = extensionData;
271
+ (this.json.extensions as Record<string, unknown>)[extensionName] = extensionData;
273
272
  this.registerUsedExtension(extensionName);
274
273
  return extensionData;
275
274
  }
@@ -309,6 +308,9 @@ export default class GLTFScenegraph {
309
308
  * Removes an extension from the top-level list
310
309
  */
311
310
  removeExtension(extensionName: string): void {
311
+ if (!this.getExtension(extensionName)) {
312
+ return;
313
+ }
312
314
  if (this.json.extensionsRequired) {
313
315
  this._removeStringFromArray(this.json.extensionsRequired, extensionName);
314
316
  }
@@ -318,6 +320,13 @@ export default class GLTFScenegraph {
318
320
  if (this.json.extensions) {
319
321
  delete this.json.extensions[extensionName];
320
322
  }
323
+ if (!Array.isArray(this.json.extensionsRemoved)) {
324
+ this.json.extensionsRemoved = [];
325
+ }
326
+ const extensionsRemoved = this.json.extensionsRemoved as string[];
327
+ if (!extensionsRemoved.includes(extensionName)) {
328
+ extensionsRemoved.push(extensionName);
329
+ }
321
330
  }
322
331
 
323
332
  /**
@@ -298,7 +298,8 @@ class GLTFV1Normalizer {
298
298
  roughnessFactor: 1
299
299
  };
300
300
 
301
- const textureId = material.values?.tex || material.values?.texture2d_0;
301
+ const textureId =
302
+ material.values?.tex || material.values?.texture2d_0 || material.values?.diffuseTex;
302
303
  const textureIndex = json.textures.findIndex((texture) => texture.id === textureId);
303
304
  if (textureIndex !== -1) {
304
305
  material.pbrMetallicRoughness.baseColorTexture = {index: textureIndex};
@@ -31,7 +31,7 @@ export async function decode(gltfData: {json: GLTF}, options: GLTFLoaderOptions)
31
31
  // Decompress meshes in parallel
32
32
  await Promise.all(promises);
33
33
 
34
- // We have now decompressed all primitives, so remove the top-level extensions
34
+ // We have now decompressed all primitives, so remove the top-level extension
35
35
  scenegraph.removeExtension(EXT_MESHOPT_COMPRESSION);
36
36
  }
37
37
 
@@ -35,6 +35,7 @@ export function preprocess(gltfData: {json: GLTF}, options: GLTFLoaderOptions):
35
35
  EXT_TEXTURE_WEBP
36
36
  );
37
37
  if (extension) {
38
+ // TODO - if multiple texture extensions are present which one wins?
38
39
  texture.source = extension.source;
39
40
  }
40
41
  scenegraph.removeObjectExtension(texture, EXT_TEXTURE_WEBP);
@@ -40,7 +40,7 @@ export function preprocess(gltfData: {json: GLTF}): void {
40
40
  delete json.buffers[0].uri;
41
41
  }
42
42
 
43
- // Remove the top-level extension as it has now been removed from all nodes
43
+ // Remove the top-level extension as it has now been processed
44
44
  gltfScenegraph.removeExtension(KHR_BINARY_GLTF);
45
45
  }
46
46
 
@@ -56,7 +56,7 @@ export async function decode(
56
56
  // Decompress meshes in parallel
57
57
  await Promise.all(promises);
58
58
 
59
- // We have now decompressed all primitives, so remove the top-level extensions
59
+ // We have now decompressed all primitives, so remove the top-level extension
60
60
  scenegraph.removeExtension(KHR_DRACO_MESH_COMPRESSION);
61
61
  }
62
62
 
@@ -26,6 +26,7 @@ export function preprocess(gltfData: {json: GLTF}, options: GLTFLoaderOptions):
26
26
  KHR_TEXTURE_BASISU
27
27
  );
28
28
  if (extension) {
29
+ // TODO - if multiple texture extensions are present which one wins?
29
30
  texture.source = extension.source;
30
31
  }
31
32
  scene.removeObjectExtension(texture, KHR_TEXTURE_BASISU);
@@ -0,0 +1,163 @@
1
+ /* eslint-disable camelcase */
2
+ import type {GLTF} from '../../types/gltf-types';
3
+
4
+ import GLTFScenegraph from '../../api/gltf-scenegraph';
5
+ import {
6
+ ClassProperty,
7
+ EXT_feature_metadata_class_object,
8
+ EXT_feature_metadata_feature_table,
9
+ FeatureTableProperty,
10
+ GLTF_EXT_feature_metadata
11
+ } from '../../types/gltf-json-schema';
12
+
13
+ /** Extension name */
14
+ const EXT_FEATURE_METADATA = 'EXT_feature_metadata';
15
+
16
+ export const name = EXT_FEATURE_METADATA;
17
+
18
+ export async function decode(gltfData: {json: GLTF}): Promise<void> {
19
+ const scenegraph = new GLTFScenegraph(gltfData);
20
+ decodeExtFeatureMetadata(scenegraph);
21
+ }
22
+
23
+ /**
24
+ * Decodes feature metadata from extension
25
+ * @param scenegraph
26
+ */
27
+ function decodeExtFeatureMetadata(scenegraph: GLTFScenegraph): void {
28
+ const extension: GLTF_EXT_feature_metadata | null = scenegraph.getExtension(EXT_FEATURE_METADATA);
29
+ const schemaClasses = extension?.schema?.classes;
30
+ const featureTables = extension?.featureTables;
31
+ const featureTextures = extension?.featureTextures;
32
+
33
+ if (featureTextures) {
34
+ /*
35
+ * TODO add support for featureTextures
36
+ * Spec - https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_feature_metadata#feature-textures
37
+ */
38
+ // eslint-disable-next-line no-console
39
+ console.warn('featureTextures is not yet supported in the "EXT_feature_metadata" extension.');
40
+ }
41
+
42
+ if (schemaClasses && featureTables) {
43
+ for (const schemaName in schemaClasses) {
44
+ const schemaClass = schemaClasses[schemaName];
45
+ const featureTable = findFeatureTableByName(featureTables, schemaName);
46
+
47
+ if (featureTable) {
48
+ handleFeatureTableProperties(scenegraph, featureTable, schemaClass);
49
+ }
50
+ }
51
+ }
52
+ }
53
+
54
+ /**
55
+ * Navigate throw all properies in feature table and gets properties data.
56
+ * @param scenegraph
57
+ * @param featureTable
58
+ * @param schemaClass
59
+ */
60
+ function handleFeatureTableProperties(
61
+ scenegraph: GLTFScenegraph,
62
+ featureTable: EXT_feature_metadata_feature_table,
63
+ schemaClass: EXT_feature_metadata_class_object
64
+ ): void {
65
+ for (const propertyName in schemaClass.properties) {
66
+ const schemaProperty = schemaClass.properties[propertyName];
67
+ const featureTableProperty = featureTable?.properties?.[propertyName];
68
+ const numberOfFeatures = featureTable.count;
69
+
70
+ if (featureTableProperty) {
71
+ const data = getPropertyDataFromBinarySource(
72
+ scenegraph,
73
+ schemaProperty,
74
+ numberOfFeatures,
75
+ featureTableProperty
76
+ );
77
+ featureTableProperty.data = data;
78
+ }
79
+ }
80
+ }
81
+
82
+ /**
83
+ * Decode properties from binary sourse based on property type.
84
+ * @param scenegraph
85
+ * @param schemaProperty
86
+ * @param numberOfFeatures
87
+ * @param featureTableProperty
88
+ */
89
+ function getPropertyDataFromBinarySource(
90
+ scenegraph: GLTFScenegraph,
91
+ schemaProperty: ClassProperty,
92
+ numberOfFeatures: number,
93
+ featureTableProperty: FeatureTableProperty
94
+ ): Uint8Array | string[] {
95
+ const bufferView = featureTableProperty.bufferView;
96
+ // TODO think maybe we shouldn't get data only in Uint8Array format.
97
+ let data: Uint8Array | string[] = scenegraph.getTypedArrayForBufferView(bufferView);
98
+
99
+ switch (schemaProperty.type) {
100
+ case 'STRING': {
101
+ // stringOffsetBufferView should be available for string type.
102
+ const stringOffsetBufferView = featureTableProperty.stringOffsetBufferView!;
103
+ const offsetsData = scenegraph.getTypedArrayForBufferView(stringOffsetBufferView);
104
+ data = getStringAttributes(data, offsetsData, numberOfFeatures);
105
+ break;
106
+ }
107
+ default:
108
+ }
109
+
110
+ return data;
111
+ }
112
+
113
+ /**
114
+ * Find the feature table by class name.
115
+ * @param featureTables
116
+ * @param schemaClassName
117
+ */
118
+ function findFeatureTableByName(
119
+ featureTables: {[key: string]: EXT_feature_metadata_feature_table},
120
+ schemaClassName: string
121
+ ): EXT_feature_metadata_feature_table | null {
122
+ for (const featureTableName in featureTables) {
123
+ const featureTable = featureTables[featureTableName];
124
+
125
+ if (featureTable.class === schemaClassName) {
126
+ return featureTable;
127
+ }
128
+ }
129
+
130
+ return null;
131
+ }
132
+
133
+ /**
134
+ * Getting string attributes from binary data.
135
+ * Spec - https://github.com/CesiumGS/3d-tiles/tree/main/specification/Metadata#strings
136
+ * @param data
137
+ * @param offsetsData
138
+ * @param stringsCount
139
+ */
140
+ function getStringAttributes(
141
+ data: Uint8Array,
142
+ offsetsData: Uint8Array,
143
+ stringsCount: number
144
+ ): string[] {
145
+ const stringsArray: string[] = [];
146
+ const textDecoder = new TextDecoder('utf8');
147
+
148
+ let stringOffset = 0;
149
+ const bytesPerStringSize = 4;
150
+
151
+ for (let index = 0; index < stringsCount; index++) {
152
+ // TODO check if it is multiplication on bytesPerStringSize is valid operation?
153
+ const stringByteSize =
154
+ offsetsData[(index + 1) * bytesPerStringSize] - offsetsData[index * bytesPerStringSize];
155
+ const stringData = data.subarray(stringOffset, stringByteSize + stringOffset);
156
+ const stringAttribute = textDecoder.decode(stringData);
157
+
158
+ stringsArray.push(stringAttribute);
159
+ stringOffset += stringByteSize;
160
+ }
161
+
162
+ return stringsArray;
163
+ }
@@ -13,9 +13,6 @@ export async function decode(gltfData: {json: GLTF}): Promise<void> {
13
13
  const gltfScenegraph = new GLTFScenegraph(gltfData);
14
14
  const {json} = gltfScenegraph;
15
15
 
16
- // Remove the top-level extension
17
- gltfScenegraph.removeExtension(KHR_MATERIALS_UNLIT);
18
-
19
16
  // Any nodes that have the extension, add lights field pointing to light object
20
17
  // and remove the extension
21
18
  for (const material of json.materials || []) {
@@ -26,6 +23,9 @@ export async function decode(gltfData: {json: GLTF}): Promise<void> {
26
23
  }
27
24
  gltfScenegraph.removeObjectExtension(material, KHR_MATERIALS_UNLIT);
28
25
  }
26
+
27
+ // Remove the top-level extension
28
+ gltfScenegraph.removeExtension(KHR_MATERIALS_UNLIT);
29
29
  }
30
30
 
31
31
  export function encode(gltfData) {
@@ -33,6 +33,7 @@ export async function decode(gltfData: {json: GLTF}): Promise<void> {
33
33
  gltfScenegraph.removeObjectExtension(material, KHR_TECHNIQUES_WEBGL);
34
34
  }
35
35
 
36
+ // Remove the top-level extension
36
37
  gltfScenegraph.removeExtension(KHR_TECHNIQUES_WEBGL);
37
38
  }
38
39
  }
@@ -201,10 +201,13 @@ async function loadImage(
201
201
 
202
202
  let arrayBuffer;
203
203
 
204
- if (image.uri) {
204
+ if (image.uri && !image.hasOwnProperty('bufferView')) {
205
205
  const uri = resolveUrl(image.uri, options);
206
206
  const response = await fetch(uri);
207
207
  arrayBuffer = await response.arrayBuffer();
208
+ image.bufferView = {
209
+ data: arrayBuffer
210
+ };
208
211
  }
209
212
 
210
213
  if (Number.isFinite(image.bufferView)) {