@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.
- package/dist/dist.min.js +236 -148
- package/dist/es5/bundle.js +0 -1
- package/dist/es5/bundle.js.map +1 -1
- package/dist/es5/glb-loader.js +2 -13
- package/dist/es5/glb-loader.js.map +1 -1
- package/dist/es5/glb-writer.js +3 -6
- package/dist/es5/glb-writer.js.map +1 -1
- package/dist/es5/gltf-loader.js +11 -23
- package/dist/es5/gltf-loader.js.map +1 -1
- package/dist/es5/gltf-writer.js +2 -5
- package/dist/es5/gltf-writer.js.map +1 -1
- package/dist/es5/index.js +10 -17
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/lib/api/gltf-extensions.js +15 -47
- package/dist/es5/lib/api/gltf-extensions.js.map +1 -1
- package/dist/es5/lib/api/gltf-scenegraph.js +128 -96
- package/dist/es5/lib/api/gltf-scenegraph.js.map +1 -1
- package/dist/es5/lib/api/normalize-gltf-v1.js +34 -72
- package/dist/es5/lib/api/normalize-gltf-v1.js.map +1 -1
- package/dist/es5/lib/api/post-process-gltf.js +26 -89
- package/dist/es5/lib/api/post-process-gltf.js.map +1 -1
- package/dist/es5/lib/encoders/encode-glb.js +10 -8
- package/dist/es5/lib/encoders/encode-glb.js.map +1 -1
- package/dist/es5/lib/encoders/encode-gltf.js +3 -6
- package/dist/es5/lib/encoders/encode-gltf.js.map +1 -1
- package/dist/es5/lib/extensions/EXT_meshopt_compression.js +2 -28
- package/dist/es5/lib/extensions/EXT_meshopt_compression.js.map +1 -1
- package/dist/es5/lib/extensions/EXT_texture_webp.js +5 -18
- package/dist/es5/lib/extensions/EXT_texture_webp.js.map +1 -1
- package/dist/es5/lib/extensions/KHR_binary_gltf.js +5 -12
- package/dist/es5/lib/extensions/KHR_binary_gltf.js.map +1 -1
- package/dist/es5/lib/extensions/KHR_draco_mesh_compression.js +11 -79
- package/dist/es5/lib/extensions/KHR_draco_mesh_compression.js.map +1 -1
- package/dist/es5/lib/extensions/KHR_texture_basisu.js +5 -14
- package/dist/es5/lib/extensions/KHR_texture_basisu.js.map +1 -1
- package/dist/es5/lib/extensions/KHR_texture_transform.js +17 -72
- package/dist/es5/lib/extensions/KHR_texture_transform.js.map +1 -1
- package/dist/es5/lib/extensions/deprecated/EXT_feature_metadata.js +110 -0
- package/dist/es5/lib/extensions/deprecated/EXT_feature_metadata.js.map +1 -0
- package/dist/es5/lib/extensions/deprecated/KHR_lights_punctual.js +0 -24
- package/dist/es5/lib/extensions/deprecated/KHR_lights_punctual.js.map +1 -1
- package/dist/es5/lib/extensions/deprecated/KHR_materials_unlit.js +3 -20
- package/dist/es5/lib/extensions/deprecated/KHR_materials_unlit.js.map +1 -1
- package/dist/es5/lib/extensions/deprecated/KHR_techniques_webgl.js +12 -29
- package/dist/es5/lib/extensions/deprecated/KHR_techniques_webgl.js.map +1 -1
- package/dist/es5/lib/gltf-utils/get-typed-array.js +1 -1
- package/dist/es5/lib/gltf-utils/get-typed-array.js.map +1 -1
- package/dist/es5/lib/gltf-utils/gltf-attribute-utils.js +5 -17
- package/dist/es5/lib/gltf-utils/gltf-attribute-utils.js.map +1 -1
- package/dist/es5/lib/gltf-utils/gltf-constants.js +3 -4
- package/dist/es5/lib/gltf-utils/gltf-constants.js.map +1 -1
- package/dist/es5/lib/gltf-utils/gltf-utils.js +1 -8
- package/dist/es5/lib/gltf-utils/gltf-utils.js.map +1 -1
- package/dist/es5/lib/gltf-utils/resolve-url.js +0 -5
- package/dist/es5/lib/gltf-utils/resolve-url.js.map +1 -1
- package/dist/es5/lib/parsers/parse-glb.js +11 -17
- package/dist/es5/lib/parsers/parse-glb.js.map +1 -1
- package/dist/es5/lib/parsers/parse-gltf.js +21 -79
- package/dist/es5/lib/parsers/parse-gltf.js.map +1 -1
- package/dist/es5/lib/types/glb-types.js.map +1 -1
- package/dist/es5/lib/types/gltf-json-schema.js.map +1 -1
- package/dist/es5/lib/types/gltf-postprocessed-schema.js.map +1 -1
- package/dist/es5/lib/types/gltf-types.js.map +1 -1
- package/dist/es5/lib/utils/assert.js +0 -1
- package/dist/es5/lib/utils/assert.js.map +1 -1
- package/dist/es5/lib/utils/version.js +1 -1
- package/dist/es5/lib/utils/version.js.map +1 -1
- package/dist/es5/meshopt/meshopt-decoder.js +10 -47
- package/dist/es5/meshopt/meshopt-decoder.js.map +1 -1
- package/dist/es5/webp/webp.js +3 -19
- package/dist/es5/webp/webp.js.map +1 -1
- package/dist/esm/bundle.js +1 -1
- package/dist/esm/bundle.js.map +1 -1
- package/dist/esm/glb-loader.js +0 -1
- package/dist/esm/glb-loader.js.map +1 -1
- package/dist/esm/glb-writer.js +3 -1
- package/dist/esm/glb-writer.js.map +1 -1
- package/dist/esm/gltf-loader.js +9 -3
- package/dist/esm/gltf-loader.js.map +1 -1
- package/dist/esm/gltf-writer.js +3 -2
- package/dist/esm/gltf-writer.js.map +1 -1
- package/dist/esm/index.js +4 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/api/gltf-extensions.js +17 -9
- package/dist/esm/lib/api/gltf-extensions.js.map +1 -1
- package/dist/esm/lib/api/gltf-scenegraph.js +40 -68
- package/dist/esm/lib/api/gltf-scenegraph.js.map +1 -1
- package/dist/esm/lib/api/normalize-gltf-v1.js +5 -36
- package/dist/esm/lib/api/normalize-gltf-v1.js.map +1 -1
- package/dist/esm/lib/api/post-process-gltf.js +26 -93
- package/dist/esm/lib/api/post-process-gltf.js.map +1 -1
- package/dist/esm/lib/encoders/encode-glb.js +9 -2
- package/dist/esm/lib/encoders/encode-glb.js.map +1 -1
- package/dist/esm/lib/encoders/encode-gltf.js +6 -4
- package/dist/esm/lib/encoders/encode-gltf.js.map +1 -1
- package/dist/esm/lib/extensions/EXT_meshopt_compression.js +5 -6
- package/dist/esm/lib/extensions/EXT_meshopt_compression.js.map +1 -1
- package/dist/esm/lib/extensions/EXT_texture_webp.js +4 -6
- package/dist/esm/lib/extensions/EXT_texture_webp.js.map +1 -1
- package/dist/esm/lib/extensions/KHR_binary_gltf.js +3 -2
- package/dist/esm/lib/extensions/KHR_binary_gltf.js.map +1 -1
- package/dist/esm/lib/extensions/KHR_draco_mesh_compression.js +18 -17
- package/dist/esm/lib/extensions/KHR_draco_mesh_compression.js.map +1 -1
- package/dist/esm/lib/extensions/KHR_texture_basisu.js +4 -3
- package/dist/esm/lib/extensions/KHR_texture_basisu.js.map +1 -1
- package/dist/esm/lib/extensions/KHR_texture_transform.js +8 -34
- package/dist/esm/lib/extensions/KHR_texture_transform.js.map +1 -1
- package/dist/esm/lib/extensions/deprecated/EXT_feature_metadata.js +84 -0
- package/dist/esm/lib/extensions/deprecated/EXT_feature_metadata.js.map +1 -0
- package/dist/esm/lib/extensions/deprecated/KHR_lights_punctual.js +4 -4
- package/dist/esm/lib/extensions/deprecated/KHR_lights_punctual.js.map +1 -1
- package/dist/esm/lib/extensions/deprecated/KHR_materials_unlit.js +4 -3
- package/dist/esm/lib/extensions/deprecated/KHR_materials_unlit.js.map +1 -1
- package/dist/esm/lib/extensions/deprecated/KHR_techniques_webgl.js +10 -9
- package/dist/esm/lib/extensions/deprecated/KHR_techniques_webgl.js.map +1 -1
- package/dist/esm/lib/gltf-utils/get-typed-array.js +4 -0
- package/dist/esm/lib/gltf-utils/get-typed-array.js.map +1 -1
- package/dist/esm/lib/gltf-utils/gltf-attribute-utils.js +7 -11
- package/dist/esm/lib/gltf-utils/gltf-attribute-utils.js.map +1 -1
- package/dist/esm/lib/gltf-utils/gltf-constants.js +1 -0
- package/dist/esm/lib/gltf-utils/gltf-constants.js.map +1 -1
- package/dist/esm/lib/gltf-utils/gltf-utils.js +0 -2
- package/dist/esm/lib/gltf-utils/gltf-utils.js.map +1 -1
- package/dist/esm/lib/gltf-utils/resolve-url.js +1 -4
- package/dist/esm/lib/gltf-utils/resolve-url.js.map +1 -1
- package/dist/esm/lib/parsers/parse-glb.js +19 -16
- package/dist/esm/lib/parsers/parse-glb.js.map +1 -1
- package/dist/esm/lib/parsers/parse-gltf.js +15 -17
- package/dist/esm/lib/parsers/parse-gltf.js.map +1 -1
- package/dist/esm/lib/types/glb-types.js.map +1 -1
- package/dist/esm/lib/types/gltf-json-schema.js.map +1 -1
- package/dist/esm/lib/types/gltf-postprocessed-schema.js.map +1 -1
- package/dist/esm/lib/types/gltf-types.js.map +1 -1
- package/dist/esm/lib/utils/assert.js +1 -0
- package/dist/esm/lib/utils/assert.js.map +1 -1
- package/dist/esm/lib/utils/version.js +2 -1
- package/dist/esm/lib/utils/version.js.map +1 -1
- package/dist/esm/meshopt/meshopt-decoder.js +11 -15
- package/dist/esm/meshopt/meshopt-decoder.js.map +1 -1
- package/dist/esm/webp/webp.js +3 -5
- package/dist/esm/webp/webp.js.map +1 -1
- package/dist/glb-loader.d.ts +1 -1
- package/dist/glb-loader.d.ts.map +1 -1
- package/dist/gltf-loader.d.ts +1 -1
- package/dist/gltf-loader.d.ts.map +1 -1
- package/dist/gltf-writer.d.ts +1 -1
- package/dist/gltf-writer.d.ts.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/lib/api/gltf-extensions.d.ts +1 -1
- package/dist/lib/api/gltf-extensions.d.ts.map +1 -1
- package/dist/lib/api/gltf-extensions.js +8 -2
- package/dist/lib/api/gltf-scenegraph.d.ts +5 -11
- package/dist/lib/api/gltf-scenegraph.d.ts.map +1 -1
- package/dist/lib/api/gltf-scenegraph.js +13 -0
- package/dist/lib/api/normalize-gltf-v1.d.ts.map +1 -1
- package/dist/lib/api/normalize-gltf-v1.js +6 -2
- package/dist/lib/extensions/EXT_meshopt_compression.js +1 -1
- package/dist/lib/extensions/EXT_texture_webp.d.ts.map +1 -1
- package/dist/lib/extensions/EXT_texture_webp.js +1 -0
- package/dist/lib/extensions/KHR_binary_gltf.js +1 -1
- package/dist/lib/extensions/KHR_draco_mesh_compression.js +1 -1
- package/dist/lib/extensions/KHR_texture_basisu.d.ts.map +1 -1
- package/dist/lib/extensions/KHR_texture_basisu.js +1 -0
- package/dist/lib/extensions/deprecated/EXT_feature_metadata.d.ts +6 -0
- package/dist/lib/extensions/deprecated/EXT_feature_metadata.d.ts.map +1 -0
- package/dist/lib/extensions/deprecated/EXT_feature_metadata.js +118 -0
- package/dist/lib/extensions/deprecated/KHR_materials_unlit.js +2 -2
- package/dist/lib/extensions/deprecated/KHR_techniques_webgl.d.ts.map +1 -1
- package/dist/lib/extensions/deprecated/KHR_techniques_webgl.js +1 -0
- package/dist/lib/parsers/parse-glb.d.ts +1 -1
- package/dist/lib/parsers/parse-glb.d.ts.map +1 -1
- package/dist/lib/parsers/parse-gltf.d.ts +1 -1
- package/dist/lib/parsers/parse-gltf.d.ts.map +1 -1
- package/dist/lib/parsers/parse-gltf.js +9 -2
- package/dist/lib/types/glb-types.d.ts +2 -2
- package/dist/lib/types/glb-types.d.ts.map +1 -1
- package/dist/lib/types/gltf-json-schema.d.ts +394 -9
- package/dist/lib/types/gltf-json-schema.d.ts.map +1 -1
- package/dist/lib/types/gltf-postprocessed-schema.d.ts +1 -1
- package/dist/lib/types/gltf-postprocessed-schema.d.ts.map +1 -1
- package/dist/lib/types/gltf-types.d.ts +8 -5
- package/dist/lib/types/gltf-types.d.ts.map +1 -1
- package/dist/webp/webp.d.ts +1 -1
- package/dist/webp/webp.d.ts.map +1 -1
- package/package.json +6 -6
- package/src/index.ts +7 -1
- package/src/lib/api/gltf-extensions.ts +3 -1
- package/src/lib/api/gltf-scenegraph.ts +21 -12
- package/src/lib/api/normalize-gltf-v1.ts +2 -1
- package/src/lib/extensions/EXT_meshopt_compression.ts +1 -1
- package/src/lib/extensions/EXT_texture_webp.ts +1 -0
- package/src/lib/extensions/KHR_binary_gltf.ts +1 -1
- package/src/lib/extensions/KHR_draco_mesh_compression.ts +1 -1
- package/src/lib/extensions/KHR_texture_basisu.ts +1 -0
- package/src/lib/extensions/deprecated/EXT_feature_metadata.ts +163 -0
- package/src/lib/extensions/deprecated/KHR_materials_unlit.ts +3 -3
- package/src/lib/extensions/deprecated/KHR_techniques_webgl.ts +1 -0
- package/src/lib/parsers/parse-gltf.ts +4 -1
- package/src/lib/types/gltf-json-schema.ts +432 -3
- 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):
|
|
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]:
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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) {
|
|
@@ -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)) {
|