@loaders.gl/gltf 3.2.12 → 3.3.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dist.min.js +1499 -45
- 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 +16 -46
- 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 +32 -70
- 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 +238 -0
- package/dist/es5/lib/extensions/KHR_texture_transform.js.map +1 -0
- 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 +5 -3
- 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 +20 -78
- 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 +18 -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 +3 -34
- 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 +192 -0
- package/dist/esm/lib/extensions/KHR_texture_transform.js.map +1 -0
- 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 +3 -2
- 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 +14 -16
- 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 +6 -1
- package/dist/lib/api/gltf-extensions.d.ts.map +1 -1
- package/dist/lib/api/gltf-extensions.js +10 -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.js +5 -1
- 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/KHR_texture_transform.d.ts +13 -0
- package/dist/lib/extensions/KHR_texture_transform.d.ts.map +1 -0
- package/dist/lib/extensions/KHR_texture_transform.js +230 -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/gltf-utils/gltf-constants.d.ts +17 -0
- package/dist/lib/gltf-utils/gltf-constants.d.ts.map +1 -1
- package/dist/lib/gltf-utils/gltf-constants.js +5 -5
- 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 +8 -1
- 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 +396 -11
- 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 +7 -6
- package/src/index.ts +7 -1
- package/src/lib/api/gltf-extensions.ts +13 -2
- package/src/lib/api/gltf-scenegraph.ts +21 -12
- 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/KHR_texture_transform.ts +305 -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/gltf-utils/gltf-constants.ts +2 -2
- package/src/lib/parsers/parse-gltf.ts +3 -0
- package/src/lib/types/gltf-json-schema.ts +434 -5
- package/src/lib/types/gltf-types.ts +9 -2
|
@@ -11,15 +11,14 @@ const DEFAULT_GLTF_JSON = {
|
|
|
11
11
|
buffers: []
|
|
12
12
|
};
|
|
13
13
|
export default class GLTFScenegraph {
|
|
14
|
+
|
|
14
15
|
constructor(gltf) {
|
|
15
16
|
_defineProperty(this, "gltf", void 0);
|
|
16
|
-
|
|
17
17
|
_defineProperty(this, "sourceBuffers", void 0);
|
|
18
|
-
|
|
19
18
|
_defineProperty(this, "byteLength", void 0);
|
|
20
|
-
|
|
21
19
|
this.gltf = gltf || {
|
|
22
|
-
json: {
|
|
20
|
+
json: {
|
|
21
|
+
...DEFAULT_GLTF_JSON
|
|
23
22
|
},
|
|
24
23
|
buffers: []
|
|
25
24
|
};
|
|
@@ -35,61 +34,51 @@ export default class GLTFScenegraph {
|
|
|
35
34
|
get json() {
|
|
36
35
|
return this.gltf.json;
|
|
37
36
|
}
|
|
38
|
-
|
|
39
37
|
getApplicationData(key) {
|
|
40
38
|
const data = this.json[key];
|
|
41
39
|
return data;
|
|
42
40
|
}
|
|
43
|
-
|
|
44
41
|
getExtraData(key) {
|
|
45
42
|
const extras = this.json.extras || {};
|
|
46
43
|
return extras[key];
|
|
47
44
|
}
|
|
48
|
-
|
|
49
45
|
getExtension(extensionName) {
|
|
50
46
|
const isExtension = this.getUsedExtensions().find(name => name === extensionName);
|
|
51
47
|
const extensions = this.json.extensions || {};
|
|
52
48
|
return isExtension ? extensions[extensionName] || true : null;
|
|
53
49
|
}
|
|
54
|
-
|
|
55
50
|
getRequiredExtension(extensionName) {
|
|
56
51
|
const isRequired = this.getRequiredExtensions().find(name => name === extensionName);
|
|
57
52
|
return isRequired ? this.getExtension(extensionName) : null;
|
|
58
53
|
}
|
|
59
|
-
|
|
60
54
|
getRequiredExtensions() {
|
|
61
55
|
return this.json.extensionsRequired || [];
|
|
62
56
|
}
|
|
63
|
-
|
|
64
57
|
getUsedExtensions() {
|
|
65
58
|
return this.json.extensionsUsed || [];
|
|
66
59
|
}
|
|
67
|
-
|
|
60
|
+
getRemovedExtensions() {
|
|
61
|
+
return this.json.extensionsRemoved || [];
|
|
62
|
+
}
|
|
68
63
|
getObjectExtension(object, extensionName) {
|
|
69
64
|
const extensions = object.extensions || {};
|
|
70
65
|
return extensions[extensionName];
|
|
71
66
|
}
|
|
72
|
-
|
|
73
67
|
getScene(index) {
|
|
74
68
|
return this.getObject('scenes', index);
|
|
75
69
|
}
|
|
76
|
-
|
|
77
70
|
getNode(index) {
|
|
78
71
|
return this.getObject('nodes', index);
|
|
79
72
|
}
|
|
80
|
-
|
|
81
73
|
getSkin(index) {
|
|
82
74
|
return this.getObject('skins', index);
|
|
83
75
|
}
|
|
84
|
-
|
|
85
76
|
getMesh(index) {
|
|
86
77
|
return this.getObject('meshes', index);
|
|
87
78
|
}
|
|
88
|
-
|
|
89
79
|
getMaterial(index) {
|
|
90
80
|
return this.getObject('materials', index);
|
|
91
81
|
}
|
|
92
|
-
|
|
93
82
|
getAccessor(index) {
|
|
94
83
|
return this.getObject('accessors', index);
|
|
95
84
|
}
|
|
@@ -97,30 +86,23 @@ export default class GLTFScenegraph {
|
|
|
97
86
|
getTexture(index) {
|
|
98
87
|
return this.getObject('textures', index);
|
|
99
88
|
}
|
|
100
|
-
|
|
101
89
|
getSampler(index) {
|
|
102
90
|
return this.getObject('samplers', index);
|
|
103
91
|
}
|
|
104
|
-
|
|
105
92
|
getImage(index) {
|
|
106
93
|
return this.getObject('images', index);
|
|
107
94
|
}
|
|
108
|
-
|
|
109
95
|
getBufferView(index) {
|
|
110
96
|
return this.getObject('bufferViews', index);
|
|
111
97
|
}
|
|
112
|
-
|
|
113
98
|
getBuffer(index) {
|
|
114
99
|
return this.getObject('buffers', index);
|
|
115
100
|
}
|
|
116
|
-
|
|
117
101
|
getObject(array, index) {
|
|
118
102
|
if (typeof index === 'object') {
|
|
119
103
|
return index;
|
|
120
104
|
}
|
|
121
|
-
|
|
122
105
|
const object = this.json[array] && this.json[array][index];
|
|
123
|
-
|
|
124
106
|
if (!object) {
|
|
125
107
|
throw new Error("glTF file error: Could not find ".concat(array, "[").concat(index, "]"));
|
|
126
108
|
}
|
|
@@ -131,8 +113,10 @@ export default class GLTFScenegraph {
|
|
|
131
113
|
getTypedArrayForBufferView(bufferView) {
|
|
132
114
|
bufferView = this.getBufferView(bufferView);
|
|
133
115
|
const bufferIndex = bufferView.buffer;
|
|
116
|
+
|
|
134
117
|
const binChunk = this.gltf.buffers[bufferIndex];
|
|
135
118
|
assert(binChunk);
|
|
119
|
+
|
|
136
120
|
const byteOffset = (bufferView.byteOffset || 0) + binChunk.byteOffset;
|
|
137
121
|
return new Uint8Array(binChunk.arrayBuffer, byteOffset, bufferView.byteLength);
|
|
138
122
|
}
|
|
@@ -142,6 +126,7 @@ export default class GLTFScenegraph {
|
|
|
142
126
|
const bufferView = this.getBufferView(accessor.bufferView);
|
|
143
127
|
const buffer = this.getBuffer(bufferView.buffer);
|
|
144
128
|
const arrayBuffer = buffer.data;
|
|
129
|
+
|
|
145
130
|
const {
|
|
146
131
|
ArrayType,
|
|
147
132
|
length
|
|
@@ -169,14 +154,12 @@ export default class GLTFScenegraph {
|
|
|
169
154
|
this.json.extras[key] = data;
|
|
170
155
|
return this;
|
|
171
156
|
}
|
|
172
|
-
|
|
173
157
|
addObjectExtension(object, extensionName, data) {
|
|
174
158
|
object.extensions = object.extensions || {};
|
|
175
159
|
object.extensions[extensionName] = data;
|
|
176
160
|
this.registerUsedExtension(extensionName);
|
|
177
161
|
return this;
|
|
178
162
|
}
|
|
179
|
-
|
|
180
163
|
setObjectExtension(object, extensionName, data) {
|
|
181
164
|
const extensions = object.extensions || {};
|
|
182
165
|
extensions[extensionName] = data;
|
|
@@ -189,7 +172,8 @@ export default class GLTFScenegraph {
|
|
|
189
172
|
return extension;
|
|
190
173
|
}
|
|
191
174
|
|
|
192
|
-
addExtension(extensionName
|
|
175
|
+
addExtension(extensionName) {
|
|
176
|
+
let extensionData = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
193
177
|
assert(extensionData);
|
|
194
178
|
this.json.extensions = this.json.extensions || {};
|
|
195
179
|
this.json.extensions[extensionName] = extensionData;
|
|
@@ -197,7 +181,8 @@ export default class GLTFScenegraph {
|
|
|
197
181
|
return extensionData;
|
|
198
182
|
}
|
|
199
183
|
|
|
200
|
-
addRequiredExtension(extensionName
|
|
184
|
+
addRequiredExtension(extensionName) {
|
|
185
|
+
let extensionData = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
201
186
|
assert(extensionData);
|
|
202
187
|
this.addExtension(extensionName, extensionData);
|
|
203
188
|
this.registerRequiredExtension(extensionName);
|
|
@@ -206,7 +191,6 @@ export default class GLTFScenegraph {
|
|
|
206
191
|
|
|
207
192
|
registerUsedExtension(extensionName) {
|
|
208
193
|
this.json.extensionsUsed = this.json.extensionsUsed || [];
|
|
209
|
-
|
|
210
194
|
if (!this.json.extensionsUsed.find(ext => ext === extensionName)) {
|
|
211
195
|
this.json.extensionsUsed.push(extensionName);
|
|
212
196
|
}
|
|
@@ -215,24 +199,31 @@ export default class GLTFScenegraph {
|
|
|
215
199
|
registerRequiredExtension(extensionName) {
|
|
216
200
|
this.registerUsedExtension(extensionName);
|
|
217
201
|
this.json.extensionsRequired = this.json.extensionsRequired || [];
|
|
218
|
-
|
|
219
202
|
if (!this.json.extensionsRequired.find(ext => ext === extensionName)) {
|
|
220
203
|
this.json.extensionsRequired.push(extensionName);
|
|
221
204
|
}
|
|
222
205
|
}
|
|
223
206
|
|
|
224
207
|
removeExtension(extensionName) {
|
|
208
|
+
if (!this.getExtension(extensionName)) {
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
225
211
|
if (this.json.extensionsRequired) {
|
|
226
212
|
this._removeStringFromArray(this.json.extensionsRequired, extensionName);
|
|
227
213
|
}
|
|
228
|
-
|
|
229
214
|
if (this.json.extensionsUsed) {
|
|
230
215
|
this._removeStringFromArray(this.json.extensionsUsed, extensionName);
|
|
231
216
|
}
|
|
232
|
-
|
|
233
217
|
if (this.json.extensions) {
|
|
234
218
|
delete this.json.extensions[extensionName];
|
|
235
219
|
}
|
|
220
|
+
if (!Array.isArray(this.json.extensionsRemoved)) {
|
|
221
|
+
this.json.extensionsRemoved = [];
|
|
222
|
+
}
|
|
223
|
+
const extensionsRemoved = this.json.extensionsRemoved;
|
|
224
|
+
if (!extensionsRemoved.includes(extensionName)) {
|
|
225
|
+
extensionsRemoved.push(extensionName);
|
|
226
|
+
}
|
|
236
227
|
}
|
|
237
228
|
|
|
238
229
|
setDefaultScene(sceneIndex) {
|
|
@@ -259,11 +250,9 @@ export default class GLTFScenegraph {
|
|
|
259
250
|
const nodeData = {
|
|
260
251
|
mesh: meshIndex
|
|
261
252
|
};
|
|
262
|
-
|
|
263
253
|
if (matrix) {
|
|
264
254
|
nodeData.matrix = matrix;
|
|
265
255
|
}
|
|
266
|
-
|
|
267
256
|
this.json.nodes.push(nodeData);
|
|
268
257
|
return this.json.nodes.length - 1;
|
|
269
258
|
}
|
|
@@ -275,40 +264,33 @@ export default class GLTFScenegraph {
|
|
|
275
264
|
material,
|
|
276
265
|
mode = 4
|
|
277
266
|
} = mesh;
|
|
278
|
-
|
|
279
267
|
const accessors = this._addAttributes(attributes);
|
|
280
|
-
|
|
281
268
|
const glTFMesh = {
|
|
282
269
|
primitives: [{
|
|
283
270
|
attributes: accessors,
|
|
284
271
|
mode
|
|
285
272
|
}]
|
|
286
273
|
};
|
|
287
|
-
|
|
288
274
|
if (indices) {
|
|
289
275
|
const indicesAccessor = this._addIndices(indices);
|
|
290
|
-
|
|
291
276
|
glTFMesh.primitives[0].indices = indicesAccessor;
|
|
292
277
|
}
|
|
293
|
-
|
|
294
278
|
if (Number.isFinite(material)) {
|
|
295
279
|
glTFMesh.primitives[0].material = material;
|
|
296
280
|
}
|
|
297
|
-
|
|
298
281
|
this.json.meshes = this.json.meshes || [];
|
|
299
282
|
this.json.meshes.push(glTFMesh);
|
|
300
283
|
return this.json.meshes.length - 1;
|
|
301
284
|
}
|
|
302
|
-
|
|
303
285
|
addPointCloud(attributes) {
|
|
304
286
|
const accessorIndices = this._addAttributes(attributes);
|
|
305
|
-
|
|
306
287
|
const glTFMesh = {
|
|
307
288
|
primitives: [{
|
|
308
289
|
attributes: accessorIndices,
|
|
309
290
|
mode: 0
|
|
310
291
|
}]
|
|
311
292
|
};
|
|
293
|
+
|
|
312
294
|
this.json.meshes = this.json.meshes || [];
|
|
313
295
|
this.json.meshes.push(glTFMesh);
|
|
314
296
|
return this.json.meshes.length - 1;
|
|
@@ -330,6 +312,7 @@ export default class GLTFScenegraph {
|
|
|
330
312
|
addBufferView(buffer) {
|
|
331
313
|
const byteLength = buffer.byteLength;
|
|
332
314
|
assert(Number.isFinite(byteLength));
|
|
315
|
+
|
|
333
316
|
this.sourceBuffers = this.sourceBuffers || [];
|
|
334
317
|
this.sourceBuffers.push(buffer);
|
|
335
318
|
const glTFBufferView = {
|
|
@@ -337,7 +320,9 @@ export default class GLTFScenegraph {
|
|
|
337
320
|
byteOffset: this.byteLength,
|
|
338
321
|
byteLength
|
|
339
322
|
};
|
|
323
|
+
|
|
340
324
|
this.byteLength += padToNBytes(byteLength, 4);
|
|
325
|
+
|
|
341
326
|
this.json.bufferViews = this.json.bufferViews || [];
|
|
342
327
|
this.json.bufferViews.push(glTFBufferView);
|
|
343
328
|
return this.json.bufferViews.length - 1;
|
|
@@ -357,19 +342,18 @@ export default class GLTFScenegraph {
|
|
|
357
342
|
return this.json.accessors.length - 1;
|
|
358
343
|
}
|
|
359
344
|
|
|
360
|
-
addBinaryBuffer(sourceBuffer
|
|
361
|
-
|
|
362
|
-
|
|
345
|
+
addBinaryBuffer(sourceBuffer) {
|
|
346
|
+
let accessor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
|
|
347
|
+
size: 3
|
|
348
|
+
};
|
|
363
349
|
const bufferViewIndex = this.addBufferView(sourceBuffer);
|
|
364
350
|
let minMax = {
|
|
365
351
|
min: accessor.min,
|
|
366
352
|
max: accessor.max
|
|
367
353
|
};
|
|
368
|
-
|
|
369
354
|
if (!minMax.min || !minMax.max) {
|
|
370
355
|
minMax = this._getAccessorMinMax(sourceBuffer, accessor.size);
|
|
371
356
|
}
|
|
372
|
-
|
|
373
357
|
const accessorDefaults = {
|
|
374
358
|
size: accessor.size,
|
|
375
359
|
componentType: getComponentTypeFromArray(sourceBuffer),
|
|
@@ -400,13 +384,13 @@ export default class GLTFScenegraph {
|
|
|
400
384
|
|
|
401
385
|
createBinaryChunk() {
|
|
402
386
|
var _this$json, _this$json$buffers;
|
|
403
|
-
|
|
404
387
|
this.gltf.buffers = [];
|
|
388
|
+
|
|
405
389
|
const totalByteLength = this.byteLength;
|
|
406
390
|
const arrayBuffer = new ArrayBuffer(totalByteLength);
|
|
407
391
|
const targetArray = new Uint8Array(arrayBuffer);
|
|
408
|
-
let dstByteOffset = 0;
|
|
409
392
|
|
|
393
|
+
let dstByteOffset = 0;
|
|
410
394
|
for (const sourceBuffer of this.sourceBuffers || []) {
|
|
411
395
|
dstByteOffset = copyToArray(sourceBuffer, targetArray, dstByteOffset);
|
|
412
396
|
}
|
|
@@ -420,15 +404,14 @@ export default class GLTFScenegraph {
|
|
|
420
404
|
}
|
|
421
405
|
|
|
422
406
|
this.gltf.binary = arrayBuffer;
|
|
407
|
+
|
|
423
408
|
this.sourceBuffers = [arrayBuffer];
|
|
424
409
|
}
|
|
425
410
|
|
|
426
411
|
_removeStringFromArray(array, string) {
|
|
427
412
|
let found = true;
|
|
428
|
-
|
|
429
413
|
while (found) {
|
|
430
414
|
const index = array.indexOf(string);
|
|
431
|
-
|
|
432
415
|
if (index > -1) {
|
|
433
416
|
array.splice(index, 1);
|
|
434
417
|
} else {
|
|
@@ -437,18 +420,15 @@ export default class GLTFScenegraph {
|
|
|
437
420
|
}
|
|
438
421
|
}
|
|
439
422
|
|
|
440
|
-
_addAttributes(
|
|
423
|
+
_addAttributes() {
|
|
424
|
+
let attributes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
441
425
|
const result = {};
|
|
442
|
-
|
|
443
426
|
for (const attributeKey in attributes) {
|
|
444
427
|
const attributeData = attributes[attributeKey];
|
|
445
|
-
|
|
446
428
|
const attrName = this._getGltfAttributeName(attributeKey);
|
|
447
|
-
|
|
448
429
|
const accessor = this.addBinaryBuffer(attributeData.value, attributeData);
|
|
449
430
|
result[attrName] = accessor;
|
|
450
431
|
}
|
|
451
|
-
|
|
452
432
|
return result;
|
|
453
433
|
}
|
|
454
434
|
|
|
@@ -464,19 +444,15 @@ export default class GLTFScenegraph {
|
|
|
464
444
|
case 'positions':
|
|
465
445
|
case 'vertices':
|
|
466
446
|
return 'POSITION';
|
|
467
|
-
|
|
468
447
|
case 'normal':
|
|
469
448
|
case 'normals':
|
|
470
449
|
return 'NORMAL';
|
|
471
|
-
|
|
472
450
|
case 'color':
|
|
473
451
|
case 'colors':
|
|
474
452
|
return 'COLOR_0';
|
|
475
|
-
|
|
476
453
|
case 'texcoord':
|
|
477
454
|
case 'texcoords':
|
|
478
455
|
return 'TEXCOORD_0';
|
|
479
|
-
|
|
480
456
|
default:
|
|
481
457
|
return attributeName;
|
|
482
458
|
}
|
|
@@ -487,29 +463,25 @@ export default class GLTFScenegraph {
|
|
|
487
463
|
min: null,
|
|
488
464
|
max: null
|
|
489
465
|
};
|
|
490
|
-
|
|
491
466
|
if (buffer.length < size) {
|
|
492
467
|
return result;
|
|
493
468
|
}
|
|
494
|
-
|
|
495
469
|
result.min = [];
|
|
496
470
|
result.max = [];
|
|
497
471
|
const initValues = buffer.subarray(0, size);
|
|
498
|
-
|
|
499
472
|
for (const value of initValues) {
|
|
500
473
|
result.min.push(value);
|
|
501
474
|
result.max.push(value);
|
|
502
475
|
}
|
|
503
|
-
|
|
504
476
|
for (let index = size; index < buffer.length; index += size) {
|
|
505
477
|
for (let componentIndex = 0; componentIndex < size; componentIndex++) {
|
|
506
|
-
result.min[0 + componentIndex] = Math.min(
|
|
507
|
-
result.
|
|
478
|
+
result.min[0 + componentIndex] = Math.min(
|
|
479
|
+
result.min[0 + componentIndex], buffer[index + componentIndex]);
|
|
480
|
+
result.max[0 + componentIndex] = Math.max(
|
|
481
|
+
result.max[0 + componentIndex], buffer[index + componentIndex]);
|
|
508
482
|
}
|
|
509
483
|
}
|
|
510
|
-
|
|
511
484
|
return result;
|
|
512
485
|
}
|
|
513
|
-
|
|
514
486
|
}
|
|
515
487
|
//# sourceMappingURL=gltf-scenegraph.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/api/gltf-scenegraph.ts"],"names":["getBinaryImageMetadata","padToNBytes","copyToArray","assert","getAccessorArrayTypeAndLength","getAccessorTypeFromSize","getComponentTypeFromArray","DEFAULT_GLTF_JSON","asset","version","generator","buffers","GLTFScenegraph","constructor","gltf","json","sourceBuffers","byteLength","getApplicationData","key","data","getExtraData","extras","getExtension","extensionName","isExtension","getUsedExtensions","find","name","extensions","getRequiredExtension","isRequired","getRequiredExtensions","extensionsRequired","extensionsUsed","getObjectExtension","object","getScene","index","getObject","getNode","getSkin","getMesh","getMaterial","getAccessor","getTexture","getSampler","getImage","getBufferView","getBuffer","array","Error","getTypedArrayForBufferView","bufferView","bufferIndex","buffer","binChunk","byteOffset","Uint8Array","arrayBuffer","getTypedArrayForAccessor","accessor","ArrayType","length","getTypedArrayForImageData","image","addApplicationData","addExtraData","addObjectExtension","registerUsedExtension","setObjectExtension","removeObjectExtension","extension","addExtension","extensionData","addRequiredExtension","registerRequiredExtension","ext","push","removeExtension","_removeStringFromArray","setDefaultScene","sceneIndex","scene","addScene","nodeIndices","scenes","nodes","addNode","node","meshIndex","matrix","nodeData","mesh","addMesh","attributes","indices","material","mode","accessors","_addAttributes","glTFMesh","primitives","indicesAccessor","_addIndices","Number","isFinite","meshes","addPointCloud","accessorIndices","addImage","imageData","mimeTypeOpt","metadata","mimeType","bufferViewIndex","addBufferView","glTFImage","images","glTFBufferView","bufferViews","addAccessor","glTFAccessor","type","size","componentType","count","max","min","addBinaryBuffer","sourceBuffer","minMax","_getAccessorMinMax","accessorDefaults","Math","round","Object","assign","addTexture","texture","imageIndex","glTFTexture","source","textures","addMaterial","pbrMaterialInfo","materials","createBinaryChunk","totalByteLength","ArrayBuffer","targetArray","dstByteOffset","binary","string","found","indexOf","splice","result","attributeKey","attributeData","attrName","_getGltfAttributeName","value","attributeName","toLowerCase","initValues","subarray","componentIndex"],"mappings":"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","sourcesContent":["import type {\n GLTF,\n GLTFScene,\n GLTFNode,\n GLTFMesh,\n GLTFSkin,\n GLTFMaterial,\n GLTFAccessor,\n GLTFSampler,\n GLTFTexture,\n GLTFImage,\n GLTFBuffer,\n GLTFBufferView\n} from '../types/gltf-types';\n\nimport {getBinaryImageMetadata} from '@loaders.gl/images';\nimport {padToNBytes, copyToArray} from '@loaders.gl/loader-utils';\nimport {assert} from '../utils/assert';\nimport {\n getAccessorArrayTypeAndLength,\n getAccessorTypeFromSize,\n getComponentTypeFromArray\n} from '../gltf-utils/gltf-utils';\n\ntype GLTFWithBuffers = {\n json: GLTF;\n buffers: any[];\n binary?: ArrayBuffer;\n};\n\nconst DEFAULT_GLTF_JSON: GLTF = {\n asset: {\n version: '2.0',\n generator: 'loaders.gl'\n },\n buffers: []\n};\n\ntype Extension = {[key: string]: any};\n/**\n * Class for structured access to GLTF data\n */\nexport default class GLTFScenegraph {\n // internal\n gltf: GLTFWithBuffers;\n sourceBuffers: any[];\n byteLength: number;\n\n constructor(gltf?: {json: GLTF; buffers?: any[]}) {\n // @ts-ignore\n this.gltf = gltf || {\n json: {...DEFAULT_GLTF_JSON},\n buffers: []\n };\n this.sourceBuffers = [];\n this.byteLength = 0;\n\n // Initialize buffers\n if (this.gltf.buffers && this.gltf.buffers[0]) {\n this.byteLength = this.gltf.buffers[0].byteLength;\n this.sourceBuffers = [this.gltf.buffers[0]];\n }\n }\n\n // Accessors\n\n get json(): GLTF {\n return this.gltf.json;\n }\n\n getApplicationData(key: string): {[key: string]: any} {\n // TODO - Data is already unpacked by GLBParser\n const data = this.json[key];\n return data;\n }\n\n getExtraData(key: string): {[key: string]: any} {\n // TODO - Data is already unpacked by GLBParser\n const extras = this.json.extras || {};\n return extras[key];\n }\n\n getExtension<T = Extension>(extensionName: string): T | null {\n const isExtension = this.getUsedExtensions().find((name) => name === extensionName);\n const extensions = this.json.extensions || {};\n return isExtension ? extensions[extensionName] || true : null;\n }\n\n getRequiredExtension<T = Extension>(extensionName: string): T | null {\n const isRequired = this.getRequiredExtensions().find((name) => name === extensionName);\n return isRequired ? this.getExtension(extensionName) : null;\n }\n\n getRequiredExtensions(): string[] {\n return this.json.extensionsRequired || [];\n }\n\n getUsedExtensions(): string[] {\n return this.json.extensionsUsed || [];\n }\n\n getObjectExtension<T = Extension>(object: {[key: string]: any}, extensionName: string): T | null {\n const extensions = object.extensions || {};\n return extensions[extensionName];\n }\n\n getScene(index: number): GLTFScene {\n return this.getObject('scenes', index) as GLTFScene;\n }\n\n getNode(index: number): GLTFNode {\n return this.getObject('nodes', index) as GLTFNode;\n }\n\n getSkin(index: number): GLTFSkin {\n return this.getObject('skins', index) as GLTFSkin;\n }\n\n getMesh(index: number): GLTFMesh {\n return this.getObject('meshes', index) as GLTFMesh;\n }\n\n getMaterial(index: number): GLTFMaterial {\n return this.getObject('materials', index) as GLTFMaterial;\n }\n\n getAccessor(index: number): GLTFAccessor {\n return this.getObject('accessors', index) as GLTFAccessor;\n }\n\n // getCamera(index: number): object | null {\n // return null; // TODO: fix thi: object as null;\n // }\n\n getTexture(index: number): GLTFTexture {\n return this.getObject('textures', index) as GLTFTexture;\n }\n\n getSampler(index: number): GLTFSampler {\n return this.getObject('samplers', index) as GLTFSampler;\n }\n\n getImage(index: number): GLTFImage {\n return this.getObject('images', index) as GLTFImage;\n }\n\n getBufferView(index: number | object): GLTFBufferView {\n return this.getObject('bufferViews', index) as GLTFBufferView;\n }\n\n getBuffer(index: number): GLTFBuffer {\n return this.getObject('buffers', index) as GLTFBuffer;\n }\n\n getObject(array: string, index: number | object): object {\n // check if already resolved\n if (typeof index === 'object') {\n return index;\n }\n const object = this.json[array] && this.json[array][index];\n if (!object) {\n throw new Error(`glTF file error: Could not find ${array}[${index}]`); // eslint-disable-line\n }\n return object;\n }\n\n /**\n * Accepts buffer view index or buffer view object\n * @returns a `Uint8Array`\n */\n getTypedArrayForBufferView(bufferView: number | object): Uint8Array {\n bufferView = this.getBufferView(bufferView);\n // @ts-ignore\n const bufferIndex = bufferView.buffer;\n\n // Get hold of the arrayBuffer\n // const buffer = this.getBuffer(bufferIndex);\n const binChunk = this.gltf.buffers[bufferIndex];\n assert(binChunk);\n\n // @ts-ignore\n const byteOffset = (bufferView.byteOffset || 0) + binChunk.byteOffset;\n // @ts-ignore\n return new Uint8Array(binChunk.arrayBuffer, byteOffset, bufferView.byteLength);\n }\n\n /** Accepts accessor index or accessor object\n * @returns a typed array with type that matches the types\n */\n getTypedArrayForAccessor(accessor: number | object): any {\n // @ts-ignore\n accessor = this.getAccessor(accessor);\n // @ts-ignore\n const bufferView = this.getBufferView(accessor.bufferView);\n const buffer = this.getBuffer(bufferView.buffer);\n // @ts-ignore\n const arrayBuffer = buffer.data;\n\n // Create a new typed array as a view into the combined buffer\n const {ArrayType, length} = getAccessorArrayTypeAndLength(accessor, bufferView);\n // @ts-ignore\n const byteOffset = bufferView.byteOffset + accessor.byteOffset;\n return new ArrayType(arrayBuffer, byteOffset, length);\n }\n\n /** accepts accessor index or accessor object\n * returns a `Uint8Array`\n */\n getTypedArrayForImageData(image: number | object): Uint8Array {\n // @ts-ignore\n image = this.getAccessor(image);\n // @ts-ignore\n const bufferView = this.getBufferView(image.bufferView);\n const buffer = this.getBuffer(bufferView.buffer);\n // @ts-ignore\n const arrayBuffer = buffer.data;\n\n const byteOffset = bufferView.byteOffset || 0;\n return new Uint8Array(arrayBuffer, byteOffset, bufferView.byteLength);\n }\n\n // MODIFERS\n\n /**\n * Add an extra application-defined key to the top-level data structure\n */\n addApplicationData(key: string, data: object): GLTFScenegraph {\n this.json[key] = data;\n return this;\n }\n\n /**\n * `extras` - Standard GLTF field for storing application specific data\n */\n addExtraData(key: string, data: object): GLTFScenegraph {\n this.json.extras = this.json.extras || {};\n this.json.extras[key] = data;\n return this;\n }\n\n addObjectExtension(object: object, extensionName: string, data: object): GLTFScenegraph {\n // @ts-ignore\n object.extensions = object.extensions || {};\n // TODO - clobber or merge?\n // @ts-ignore\n object.extensions[extensionName] = data;\n this.registerUsedExtension(extensionName);\n return this;\n }\n\n setObjectExtension(object: object, extensionName: string, data: object): void {\n // @ts-ignore\n const extensions = object.extensions || {};\n extensions[extensionName] = data;\n // TODO - add to usedExtensions...\n }\n\n removeObjectExtension(object: object, extensionName: string): object {\n // @ts-ignore\n const extensions = object.extensions || {};\n const extension = extensions[extensionName];\n delete extensions[extensionName];\n return extension;\n }\n\n /**\n * Add to standard GLTF top level extension object, mark as used\n */\n addExtension(extensionName: string, extensionData: object = {}): object {\n assert(extensionData);\n this.json.extensions = this.json.extensions || {};\n this.json.extensions[extensionName] = extensionData;\n this.registerUsedExtension(extensionName);\n return extensionData;\n }\n\n /**\n * Standard GLTF top level extension object, mark as used and required\n */\n addRequiredExtension(extensionName, extensionData: object = {}): object {\n assert(extensionData);\n this.addExtension(extensionName, extensionData);\n this.registerRequiredExtension(extensionName);\n return extensionData;\n }\n\n /**\n * Add extensionName to list of used extensions\n */\n registerUsedExtension(extensionName: string): void {\n this.json.extensionsUsed = this.json.extensionsUsed || [];\n if (!this.json.extensionsUsed.find((ext) => ext === extensionName)) {\n this.json.extensionsUsed.push(extensionName);\n }\n }\n\n /**\n * Add extensionName to list of required extensions\n */\n registerRequiredExtension(extensionName: string): void {\n this.registerUsedExtension(extensionName);\n this.json.extensionsRequired = this.json.extensionsRequired || [];\n if (!this.json.extensionsRequired.find((ext) => ext === extensionName)) {\n this.json.extensionsRequired.push(extensionName);\n }\n }\n\n /**\n * Removes an extension from the top-level list\n */\n removeExtension(extensionName: string): void {\n if (this.json.extensionsRequired) {\n this._removeStringFromArray(this.json.extensionsRequired, extensionName);\n }\n if (this.json.extensionsUsed) {\n this._removeStringFromArray(this.json.extensionsUsed, extensionName);\n }\n if (this.json.extensions) {\n delete this.json.extensions[extensionName];\n }\n }\n\n /**\n * Set default scene which is to be displayed at load time\n */\n setDefaultScene(sceneIndex: number): void {\n this.json.scene = sceneIndex;\n }\n\n /**\n * @todo: add more properties for scene initialization:\n * name`, `extensions`, `extras`\n * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#reference-scene\n */\n addScene(scene: {nodeIndices: number[]}): number {\n const {nodeIndices} = scene;\n this.json.scenes = this.json.scenes || [];\n this.json.scenes.push({nodes: nodeIndices});\n return this.json.scenes.length - 1;\n }\n\n /**\n * @todo: add more properties for node initialization:\n * `name`, `extensions`, `extras`, `camera`, `children`, `skin`, `rotation`, `scale`, `translation`, `weights`\n * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#node\n */\n addNode(node: {meshIndex: number; matrix?: number[]}): number {\n const {meshIndex, matrix} = node;\n this.json.nodes = this.json.nodes || [];\n const nodeData = {mesh: meshIndex};\n if (matrix) {\n // @ts-ignore\n nodeData.matrix = matrix;\n }\n this.json.nodes.push(nodeData);\n return this.json.nodes.length - 1;\n }\n\n /** Adds a mesh to the json part */\n addMesh(mesh: {attributes: object; indices?: object; material?: number; mode?: number}): number {\n const {attributes, indices, material, mode = 4} = mesh;\n const accessors = this._addAttributes(attributes);\n\n const glTFMesh = {\n primitives: [\n {\n attributes: accessors,\n mode\n }\n ]\n };\n\n if (indices) {\n const indicesAccessor = this._addIndices(indices);\n // @ts-ignore\n glTFMesh.primitives[0].indices = indicesAccessor;\n }\n\n if (Number.isFinite(material)) {\n // @ts-ignore\n glTFMesh.primitives[0].material = material;\n }\n\n this.json.meshes = this.json.meshes || [];\n this.json.meshes.push(glTFMesh);\n return this.json.meshes.length - 1;\n }\n\n addPointCloud(attributes: object): number {\n // @ts-ignore\n const accessorIndices = this._addAttributes(attributes);\n\n const glTFMesh = {\n primitives: [\n {\n attributes: accessorIndices,\n mode: 0 // GL.POINTS\n }\n ]\n };\n\n this.json.meshes = this.json.meshes || [];\n this.json.meshes.push(glTFMesh);\n return this.json.meshes.length - 1;\n }\n\n /**\n * Adds a binary image. Builds glTF \"JSON metadata\" and saves buffer reference\n * Buffer will be copied into BIN chunk during \"pack\"\n * Currently encodes as glTF image\n * @param imageData\n * @param mimeType\n */\n addImage(imageData: any, mimeTypeOpt?: string): number {\n // If image is referencing a bufferView instead of URI, mimeType must be defined:\n // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#images\n // \"a reference to a bufferView; in that case mimeType must be defined.\"\n const metadata = getBinaryImageMetadata(imageData);\n const mimeType = mimeTypeOpt || metadata?.mimeType;\n\n const bufferViewIndex = this.addBufferView(imageData);\n\n const glTFImage = {\n bufferView: bufferViewIndex,\n mimeType\n };\n\n this.json.images = this.json.images || [];\n this.json.images.push(glTFImage);\n return this.json.images.length - 1;\n }\n\n /**\n * Add one untyped source buffer, create a matching glTF `bufferView`, and return its index\n * @param buffer\n */\n addBufferView(buffer: any): number {\n const byteLength = buffer.byteLength;\n assert(Number.isFinite(byteLength));\n\n // Add this buffer to the list of buffers to be written to the body.\n this.sourceBuffers = this.sourceBuffers || [];\n this.sourceBuffers.push(buffer);\n\n const glTFBufferView = {\n buffer: 0,\n // Write offset from the start of the binary body\n byteOffset: this.byteLength,\n byteLength\n };\n\n // We've now added the contents to the body, so update the total length\n // Every sub-chunk needs to be 4-byte align ed\n this.byteLength += padToNBytes(byteLength, 4);\n\n // Add a bufferView indicating start and length of this binary sub-chunk\n this.json.bufferViews = this.json.bufferViews || [];\n this.json.bufferViews.push(glTFBufferView);\n return this.json.bufferViews.length - 1;\n }\n\n /**\n * Adds an accessor to a bufferView\n * @param bufferViewIndex\n * @param accessor\n */\n addAccessor(bufferViewIndex: number, accessor: object): number {\n const glTFAccessor = {\n bufferView: bufferViewIndex,\n // @ts-ignore\n type: getAccessorTypeFromSize(accessor.size),\n // @ts-ignore\n componentType: accessor.componentType,\n // @ts-ignore\n count: accessor.count,\n // @ts-ignore\n max: accessor.max,\n // @ts-ignore\n min: accessor.min\n };\n\n this.json.accessors = this.json.accessors || [];\n this.json.accessors.push(glTFAccessor);\n return this.json.accessors.length - 1;\n }\n\n /**\n * Add a binary buffer. Builds glTF \"JSON metadata\" and saves buffer reference\n * Buffer will be copied into BIN chunk during \"pack\"\n * Currently encodes buffers as glTF accessors, but this could be optimized\n * @param sourceBuffer\n * @param accessor\n */\n addBinaryBuffer(sourceBuffer: any, accessor: object = {size: 3}): number {\n const bufferViewIndex = this.addBufferView(sourceBuffer);\n // @ts-ignore\n let minMax = {min: accessor.min, max: accessor.max};\n if (!minMax.min || !minMax.max) {\n // @ts-ignore\n minMax = this._getAccessorMinMax(sourceBuffer, accessor.size);\n }\n\n const accessorDefaults = {\n // @ts-ignore\n size: accessor.size,\n componentType: getComponentTypeFromArray(sourceBuffer),\n // @ts-ignore\n count: Math.round(sourceBuffer.length / accessor.size),\n min: minMax.min,\n max: minMax.max\n };\n\n return this.addAccessor(bufferViewIndex, Object.assign(accessorDefaults, accessor));\n }\n\n /**\n * Adds a texture to the json part\n * @todo: add more properties for texture initialization\n * `sampler`, `name`, `extensions`, `extras`\n * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#texture\n */\n addTexture(texture: {imageIndex: number}): number {\n const {imageIndex} = texture;\n const glTFTexture = {\n source: imageIndex\n };\n\n this.json.textures = this.json.textures || [];\n this.json.textures.push(glTFTexture);\n return this.json.textures.length - 1;\n }\n\n /** Adds a material to the json part */\n addMaterial(pbrMaterialInfo: Object): number {\n this.json.materials = this.json.materials || [];\n this.json.materials.push(pbrMaterialInfo);\n return this.json.materials.length - 1;\n }\n\n /** Pack the binary chunk */\n createBinaryChunk(): void {\n // Encoder expects this array undefined or empty\n this.gltf.buffers = [];\n\n // Allocate total array\n const totalByteLength = this.byteLength;\n const arrayBuffer = new ArrayBuffer(totalByteLength);\n const targetArray = new Uint8Array(arrayBuffer);\n\n // Copy each array into\n let dstByteOffset = 0;\n for (const sourceBuffer of this.sourceBuffers || []) {\n dstByteOffset = copyToArray(sourceBuffer, targetArray, dstByteOffset);\n }\n\n // Update the glTF BIN CHUNK byte length\n if (this.json?.buffers?.[0]) {\n this.json.buffers[0].byteLength = totalByteLength;\n } else {\n this.json.buffers = [{byteLength: totalByteLength}];\n }\n\n // Save generated arrayBuffer\n this.gltf.binary = arrayBuffer;\n\n // Put arrayBuffer to sourceBuffers for possible additional writing data in the chunk\n this.sourceBuffers = [arrayBuffer];\n }\n\n // PRIVATE\n\n _removeStringFromArray(array, string) {\n let found = true;\n while (found) {\n const index = array.indexOf(string);\n if (index > -1) {\n array.splice(index, 1);\n } else {\n found = false;\n }\n }\n }\n\n /**\n * Add attributes to buffers and create `attributes` object which is part of `mesh`\n */\n _addAttributes(attributes = {}) {\n const result = {};\n for (const attributeKey in attributes) {\n const attributeData = attributes[attributeKey];\n const attrName = this._getGltfAttributeName(attributeKey);\n const accessor = this.addBinaryBuffer(attributeData.value, attributeData);\n result[attrName] = accessor;\n }\n return result;\n }\n\n /**\n * Add indices to buffers\n */\n _addIndices(indices) {\n return this.addBinaryBuffer(indices, {size: 1});\n }\n\n /**\n * Deduce gltf specific attribue name from input attribute name\n */\n _getGltfAttributeName(attributeName) {\n switch (attributeName.toLowerCase()) {\n case 'position':\n case 'positions':\n case 'vertices':\n return 'POSITION';\n case 'normal':\n case 'normals':\n return 'NORMAL';\n case 'color':\n case 'colors':\n return 'COLOR_0';\n case 'texcoord':\n case 'texcoords':\n return 'TEXCOORD_0';\n default:\n return attributeName;\n }\n }\n\n /**\n * Calculate `min` and `max` arrays of accessor according to spec:\n * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#reference-accessor\n */\n _getAccessorMinMax(buffer, size) {\n const result = {min: null, max: null};\n if (buffer.length < size) {\n return result;\n }\n // @ts-ignore\n result.min = [];\n // @ts-ignore\n result.max = [];\n const initValues = buffer.subarray(0, size);\n for (const value of initValues) {\n // @ts-ignore\n result.min.push(value);\n // @ts-ignore\n result.max.push(value);\n }\n\n for (let index = size; index < buffer.length; index += size) {\n for (let componentIndex = 0; componentIndex < size; componentIndex++) {\n // @ts-ignore\n result.min[0 + componentIndex] = Math.min(\n // @ts-ignore\n result.min[0 + componentIndex],\n buffer[index + componentIndex]\n );\n // @ts-ignore\n result.max[0 + componentIndex] = Math.max(\n // @ts-ignore\n result.max[0 + componentIndex],\n buffer[index + componentIndex]\n );\n }\n }\n return result;\n }\n}\n"],"file":"gltf-scenegraph.js"}
|
|
1
|
+
{"version":3,"file":"gltf-scenegraph.js","names":["getBinaryImageMetadata","padToNBytes","copyToArray","assert","getAccessorArrayTypeAndLength","getAccessorTypeFromSize","getComponentTypeFromArray","DEFAULT_GLTF_JSON","asset","version","generator","buffers","GLTFScenegraph","constructor","gltf","json","sourceBuffers","byteLength","getApplicationData","key","data","getExtraData","extras","getExtension","extensionName","isExtension","getUsedExtensions","find","name","extensions","getRequiredExtension","isRequired","getRequiredExtensions","extensionsRequired","extensionsUsed","getRemovedExtensions","extensionsRemoved","getObjectExtension","object","getScene","index","getObject","getNode","getSkin","getMesh","getMaterial","getAccessor","getTexture","getSampler","getImage","getBufferView","getBuffer","array","Error","getTypedArrayForBufferView","bufferView","bufferIndex","buffer","binChunk","byteOffset","Uint8Array","arrayBuffer","getTypedArrayForAccessor","accessor","ArrayType","length","getTypedArrayForImageData","image","addApplicationData","addExtraData","addObjectExtension","registerUsedExtension","setObjectExtension","removeObjectExtension","extension","addExtension","extensionData","addRequiredExtension","registerRequiredExtension","ext","push","removeExtension","_removeStringFromArray","Array","isArray","includes","setDefaultScene","sceneIndex","scene","addScene","nodeIndices","scenes","nodes","addNode","node","meshIndex","matrix","nodeData","mesh","addMesh","attributes","indices","material","mode","accessors","_addAttributes","glTFMesh","primitives","indicesAccessor","_addIndices","Number","isFinite","meshes","addPointCloud","accessorIndices","addImage","imageData","mimeTypeOpt","metadata","mimeType","bufferViewIndex","addBufferView","glTFImage","images","glTFBufferView","bufferViews","addAccessor","glTFAccessor","type","size","componentType","count","max","min","addBinaryBuffer","sourceBuffer","minMax","_getAccessorMinMax","accessorDefaults","Math","round","Object","assign","addTexture","texture","imageIndex","glTFTexture","source","textures","addMaterial","pbrMaterialInfo","materials","createBinaryChunk","totalByteLength","ArrayBuffer","targetArray","dstByteOffset","binary","string","found","indexOf","splice","result","attributeKey","attributeData","attrName","_getGltfAttributeName","value","attributeName","toLowerCase","initValues","subarray","componentIndex"],"sources":["../../../../src/lib/api/gltf-scenegraph.ts"],"sourcesContent":["import type {\n GLTF,\n GLTFScene,\n GLTFNode,\n GLTFMesh,\n GLTFSkin,\n GLTFMaterial,\n GLTFAccessor,\n GLTFSampler,\n GLTFTexture,\n GLTFImage,\n GLTFBuffer,\n GLTFBufferView,\n GLTFWithBuffers\n} from '../types/gltf-types';\n\nimport {getBinaryImageMetadata} from '@loaders.gl/images';\nimport {padToNBytes, copyToArray} from '@loaders.gl/loader-utils';\nimport {assert} from '../utils/assert';\nimport {\n getAccessorArrayTypeAndLength,\n getAccessorTypeFromSize,\n getComponentTypeFromArray\n} from '../gltf-utils/gltf-utils';\n\nconst DEFAULT_GLTF_JSON: GLTF = {\n asset: {\n version: '2.0',\n generator: 'loaders.gl'\n },\n buffers: []\n};\n\ntype Extension = {[key: string]: any};\n/**\n * Class for structured access to GLTF data\n */\nexport default class GLTFScenegraph {\n // internal\n gltf: GLTFWithBuffers;\n sourceBuffers: any[];\n byteLength: number;\n\n constructor(gltf?: {json: GLTF; buffers?: any[]}) {\n // @ts-ignore\n this.gltf = gltf || {\n json: {...DEFAULT_GLTF_JSON},\n buffers: []\n };\n this.sourceBuffers = [];\n this.byteLength = 0;\n\n // Initialize buffers\n if (this.gltf.buffers && this.gltf.buffers[0]) {\n this.byteLength = this.gltf.buffers[0].byteLength;\n this.sourceBuffers = [this.gltf.buffers[0]];\n }\n }\n\n // Accessors\n\n get json(): GLTF {\n return this.gltf.json;\n }\n\n getApplicationData(key: string): unknown {\n // TODO - Data is already unpacked by GLBParser\n const data = this.json[key];\n return data;\n }\n\n getExtraData(key: string): {[key: string]: unknown} {\n // TODO - Data is already unpacked by GLBParser\n const extras = this.json.extras || {};\n return extras[key];\n }\n\n getExtension<T = Extension>(extensionName: string): T | null {\n const isExtension = this.getUsedExtensions().find((name) => name === extensionName);\n const extensions = this.json.extensions || {};\n return isExtension ? extensions[extensionName] || true : null;\n }\n\n getRequiredExtension<T = Extension>(extensionName: string): T | null {\n const isRequired = this.getRequiredExtensions().find((name) => name === extensionName);\n return isRequired ? this.getExtension(extensionName) : null;\n }\n\n getRequiredExtensions(): string[] {\n return this.json.extensionsRequired || [];\n }\n\n getUsedExtensions(): string[] {\n return this.json.extensionsUsed || [];\n }\n\n getRemovedExtensions(): string[] {\n return (this.json.extensionsRemoved || []) as string[];\n }\n\n getObjectExtension<T = Extension>(object: {[key: string]: any}, extensionName: string): T | null {\n const extensions = object.extensions || {};\n return extensions[extensionName];\n }\n\n getScene(index: number): GLTFScene {\n return this.getObject('scenes', index) as GLTFScene;\n }\n\n getNode(index: number): GLTFNode {\n return this.getObject('nodes', index) as GLTFNode;\n }\n\n getSkin(index: number): GLTFSkin {\n return this.getObject('skins', index) as GLTFSkin;\n }\n\n getMesh(index: number): GLTFMesh {\n return this.getObject('meshes', index) as GLTFMesh;\n }\n\n getMaterial(index: number): GLTFMaterial {\n return this.getObject('materials', index) as GLTFMaterial;\n }\n\n getAccessor(index: number): GLTFAccessor {\n return this.getObject('accessors', index) as GLTFAccessor;\n }\n\n // getCamera(index: number): object | null {\n // return null; // TODO: fix thi: object as null;\n // }\n\n getTexture(index: number): GLTFTexture {\n return this.getObject('textures', index) as GLTFTexture;\n }\n\n getSampler(index: number): GLTFSampler {\n return this.getObject('samplers', index) as GLTFSampler;\n }\n\n getImage(index: number): GLTFImage {\n return this.getObject('images', index) as GLTFImage;\n }\n\n getBufferView(index: number | object): GLTFBufferView {\n return this.getObject('bufferViews', index) as GLTFBufferView;\n }\n\n getBuffer(index: number): GLTFBuffer {\n return this.getObject('buffers', index) as GLTFBuffer;\n }\n\n getObject(array: string, index: number | object): object {\n // check if already resolved\n if (typeof index === 'object') {\n return index;\n }\n const object = this.json[array] && (this.json[array] as {}[])[index];\n if (!object) {\n throw new Error(`glTF file error: Could not find ${array}[${index}]`); // eslint-disable-line\n }\n return object;\n }\n\n /**\n * Accepts buffer view index or buffer view object\n * @returns a `Uint8Array`\n */\n getTypedArrayForBufferView(bufferView: number | object): Uint8Array {\n bufferView = this.getBufferView(bufferView);\n // @ts-ignore\n const bufferIndex = bufferView.buffer;\n\n // Get hold of the arrayBuffer\n // const buffer = this.getBuffer(bufferIndex);\n const binChunk = this.gltf.buffers[bufferIndex];\n assert(binChunk);\n\n // @ts-ignore\n const byteOffset = (bufferView.byteOffset || 0) + binChunk.byteOffset;\n // @ts-ignore\n return new Uint8Array(binChunk.arrayBuffer, byteOffset, bufferView.byteLength);\n }\n\n /** Accepts accessor index or accessor object\n * @returns a typed array with type that matches the types\n */\n getTypedArrayForAccessor(accessor: number | object): any {\n // @ts-ignore\n accessor = this.getAccessor(accessor);\n // @ts-ignore\n const bufferView = this.getBufferView(accessor.bufferView);\n const buffer = this.getBuffer(bufferView.buffer);\n // @ts-ignore\n const arrayBuffer = buffer.data;\n\n // Create a new typed array as a view into the combined buffer\n const {ArrayType, length} = getAccessorArrayTypeAndLength(accessor, bufferView);\n // @ts-ignore\n const byteOffset = bufferView.byteOffset + accessor.byteOffset;\n return new ArrayType(arrayBuffer, byteOffset, length);\n }\n\n /** accepts accessor index or accessor object\n * returns a `Uint8Array`\n */\n getTypedArrayForImageData(image: number | object): Uint8Array {\n // @ts-ignore\n image = this.getAccessor(image);\n // @ts-ignore\n const bufferView = this.getBufferView(image.bufferView);\n const buffer = this.getBuffer(bufferView.buffer);\n // @ts-ignore\n const arrayBuffer = buffer.data;\n\n const byteOffset = bufferView.byteOffset || 0;\n return new Uint8Array(arrayBuffer, byteOffset, bufferView.byteLength);\n }\n\n // MODIFERS\n\n /**\n * Add an extra application-defined key to the top-level data structure\n */\n addApplicationData(key: string, data: object): GLTFScenegraph {\n this.json[key] = data;\n return this;\n }\n\n /**\n * `extras` - Standard GLTF field for storing application specific data\n */\n addExtraData(key: string, data: object): GLTFScenegraph {\n this.json.extras = this.json.extras || {};\n (this.json.extras as Record<string, unknown>)[key] = data;\n return this;\n }\n\n addObjectExtension(object: object, extensionName: string, data: object): GLTFScenegraph {\n // @ts-ignore\n object.extensions = object.extensions || {};\n // TODO - clobber or merge?\n // @ts-ignore\n object.extensions[extensionName] = data;\n this.registerUsedExtension(extensionName);\n return this;\n }\n\n setObjectExtension(object: object, extensionName: string, data: object): void {\n // @ts-ignore\n const extensions = object.extensions || {};\n extensions[extensionName] = data;\n // TODO - add to usedExtensions...\n }\n\n removeObjectExtension(object: object, extensionName: string): object {\n // @ts-ignore\n const extensions = object.extensions || {};\n const extension = extensions[extensionName];\n delete extensions[extensionName];\n return extension;\n }\n\n /**\n * Add to standard GLTF top level extension object, mark as used\n */\n addExtension(extensionName: string, extensionData: object = {}): object {\n assert(extensionData);\n this.json.extensions = this.json.extensions || {};\n (this.json.extensions as Record<string, unknown>)[extensionName] = extensionData;\n this.registerUsedExtension(extensionName);\n return extensionData;\n }\n\n /**\n * Standard GLTF top level extension object, mark as used and required\n */\n addRequiredExtension(extensionName, extensionData: object = {}): object {\n assert(extensionData);\n this.addExtension(extensionName, extensionData);\n this.registerRequiredExtension(extensionName);\n return extensionData;\n }\n\n /**\n * Add extensionName to list of used extensions\n */\n registerUsedExtension(extensionName: string): void {\n this.json.extensionsUsed = this.json.extensionsUsed || [];\n if (!this.json.extensionsUsed.find((ext) => ext === extensionName)) {\n this.json.extensionsUsed.push(extensionName);\n }\n }\n\n /**\n * Add extensionName to list of required extensions\n */\n registerRequiredExtension(extensionName: string): void {\n this.registerUsedExtension(extensionName);\n this.json.extensionsRequired = this.json.extensionsRequired || [];\n if (!this.json.extensionsRequired.find((ext) => ext === extensionName)) {\n this.json.extensionsRequired.push(extensionName);\n }\n }\n\n /**\n * Removes an extension from the top-level list\n */\n removeExtension(extensionName: string): void {\n if (!this.getExtension(extensionName)) {\n return;\n }\n if (this.json.extensionsRequired) {\n this._removeStringFromArray(this.json.extensionsRequired, extensionName);\n }\n if (this.json.extensionsUsed) {\n this._removeStringFromArray(this.json.extensionsUsed, extensionName);\n }\n if (this.json.extensions) {\n delete this.json.extensions[extensionName];\n }\n if (!Array.isArray(this.json.extensionsRemoved)) {\n this.json.extensionsRemoved = [];\n }\n const extensionsRemoved = this.json.extensionsRemoved as string[];\n if (!extensionsRemoved.includes(extensionName)) {\n extensionsRemoved.push(extensionName);\n }\n }\n\n /**\n * Set default scene which is to be displayed at load time\n */\n setDefaultScene(sceneIndex: number): void {\n this.json.scene = sceneIndex;\n }\n\n /**\n * @todo: add more properties for scene initialization:\n * name`, `extensions`, `extras`\n * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#reference-scene\n */\n addScene(scene: {nodeIndices: number[]}): number {\n const {nodeIndices} = scene;\n this.json.scenes = this.json.scenes || [];\n this.json.scenes.push({nodes: nodeIndices});\n return this.json.scenes.length - 1;\n }\n\n /**\n * @todo: add more properties for node initialization:\n * `name`, `extensions`, `extras`, `camera`, `children`, `skin`, `rotation`, `scale`, `translation`, `weights`\n * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#node\n */\n addNode(node: {meshIndex: number; matrix?: number[]}): number {\n const {meshIndex, matrix} = node;\n this.json.nodes = this.json.nodes || [];\n const nodeData = {mesh: meshIndex};\n if (matrix) {\n // @ts-ignore\n nodeData.matrix = matrix;\n }\n this.json.nodes.push(nodeData);\n return this.json.nodes.length - 1;\n }\n\n /** Adds a mesh to the json part */\n addMesh(mesh: {attributes: object; indices?: object; material?: number; mode?: number}): number {\n const {attributes, indices, material, mode = 4} = mesh;\n const accessors = this._addAttributes(attributes);\n\n const glTFMesh = {\n primitives: [\n {\n attributes: accessors,\n mode\n }\n ]\n };\n\n if (indices) {\n const indicesAccessor = this._addIndices(indices);\n // @ts-ignore\n glTFMesh.primitives[0].indices = indicesAccessor;\n }\n\n if (Number.isFinite(material)) {\n // @ts-ignore\n glTFMesh.primitives[0].material = material;\n }\n\n this.json.meshes = this.json.meshes || [];\n this.json.meshes.push(glTFMesh);\n return this.json.meshes.length - 1;\n }\n\n addPointCloud(attributes: object): number {\n // @ts-ignore\n const accessorIndices = this._addAttributes(attributes);\n\n const glTFMesh = {\n primitives: [\n {\n attributes: accessorIndices,\n mode: 0 // GL.POINTS\n }\n ]\n };\n\n this.json.meshes = this.json.meshes || [];\n this.json.meshes.push(glTFMesh);\n return this.json.meshes.length - 1;\n }\n\n /**\n * Adds a binary image. Builds glTF \"JSON metadata\" and saves buffer reference\n * Buffer will be copied into BIN chunk during \"pack\"\n * Currently encodes as glTF image\n * @param imageData\n * @param mimeType\n */\n addImage(imageData: any, mimeTypeOpt?: string): number {\n // If image is referencing a bufferView instead of URI, mimeType must be defined:\n // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#images\n // \"a reference to a bufferView; in that case mimeType must be defined.\"\n const metadata = getBinaryImageMetadata(imageData);\n const mimeType = mimeTypeOpt || metadata?.mimeType;\n\n const bufferViewIndex = this.addBufferView(imageData);\n\n const glTFImage = {\n bufferView: bufferViewIndex,\n mimeType\n };\n\n this.json.images = this.json.images || [];\n this.json.images.push(glTFImage);\n return this.json.images.length - 1;\n }\n\n /**\n * Add one untyped source buffer, create a matching glTF `bufferView`, and return its index\n * @param buffer\n */\n addBufferView(buffer: any): number {\n const byteLength = buffer.byteLength;\n assert(Number.isFinite(byteLength));\n\n // Add this buffer to the list of buffers to be written to the body.\n this.sourceBuffers = this.sourceBuffers || [];\n this.sourceBuffers.push(buffer);\n\n const glTFBufferView = {\n buffer: 0,\n // Write offset from the start of the binary body\n byteOffset: this.byteLength,\n byteLength\n };\n\n // We've now added the contents to the body, so update the total length\n // Every sub-chunk needs to be 4-byte align ed\n this.byteLength += padToNBytes(byteLength, 4);\n\n // Add a bufferView indicating start and length of this binary sub-chunk\n this.json.bufferViews = this.json.bufferViews || [];\n this.json.bufferViews.push(glTFBufferView);\n return this.json.bufferViews.length - 1;\n }\n\n /**\n * Adds an accessor to a bufferView\n * @param bufferViewIndex\n * @param accessor\n */\n addAccessor(bufferViewIndex: number, accessor: object): number {\n const glTFAccessor = {\n bufferView: bufferViewIndex,\n // @ts-ignore\n type: getAccessorTypeFromSize(accessor.size),\n // @ts-ignore\n componentType: accessor.componentType,\n // @ts-ignore\n count: accessor.count,\n // @ts-ignore\n max: accessor.max,\n // @ts-ignore\n min: accessor.min\n };\n\n this.json.accessors = this.json.accessors || [];\n this.json.accessors.push(glTFAccessor);\n return this.json.accessors.length - 1;\n }\n\n /**\n * Add a binary buffer. Builds glTF \"JSON metadata\" and saves buffer reference\n * Buffer will be copied into BIN chunk during \"pack\"\n * Currently encodes buffers as glTF accessors, but this could be optimized\n * @param sourceBuffer\n * @param accessor\n */\n addBinaryBuffer(sourceBuffer: any, accessor: object = {size: 3}): number {\n const bufferViewIndex = this.addBufferView(sourceBuffer);\n // @ts-ignore\n let minMax = {min: accessor.min, max: accessor.max};\n if (!minMax.min || !minMax.max) {\n // @ts-ignore\n minMax = this._getAccessorMinMax(sourceBuffer, accessor.size);\n }\n\n const accessorDefaults = {\n // @ts-ignore\n size: accessor.size,\n componentType: getComponentTypeFromArray(sourceBuffer),\n // @ts-ignore\n count: Math.round(sourceBuffer.length / accessor.size),\n min: minMax.min,\n max: minMax.max\n };\n\n return this.addAccessor(bufferViewIndex, Object.assign(accessorDefaults, accessor));\n }\n\n /**\n * Adds a texture to the json part\n * @todo: add more properties for texture initialization\n * `sampler`, `name`, `extensions`, `extras`\n * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#texture\n */\n addTexture(texture: {imageIndex: number}): number {\n const {imageIndex} = texture;\n const glTFTexture = {\n source: imageIndex\n };\n\n this.json.textures = this.json.textures || [];\n this.json.textures.push(glTFTexture);\n return this.json.textures.length - 1;\n }\n\n /** Adds a material to the json part */\n addMaterial(pbrMaterialInfo: Object): number {\n this.json.materials = this.json.materials || [];\n this.json.materials.push(pbrMaterialInfo);\n return this.json.materials.length - 1;\n }\n\n /** Pack the binary chunk */\n createBinaryChunk(): void {\n // Encoder expects this array undefined or empty\n this.gltf.buffers = [];\n\n // Allocate total array\n const totalByteLength = this.byteLength;\n const arrayBuffer = new ArrayBuffer(totalByteLength);\n const targetArray = new Uint8Array(arrayBuffer);\n\n // Copy each array into\n let dstByteOffset = 0;\n for (const sourceBuffer of this.sourceBuffers || []) {\n dstByteOffset = copyToArray(sourceBuffer, targetArray, dstByteOffset);\n }\n\n // Update the glTF BIN CHUNK byte length\n if (this.json?.buffers?.[0]) {\n this.json.buffers[0].byteLength = totalByteLength;\n } else {\n this.json.buffers = [{byteLength: totalByteLength}];\n }\n\n // Save generated arrayBuffer\n this.gltf.binary = arrayBuffer;\n\n // Put arrayBuffer to sourceBuffers for possible additional writing data in the chunk\n this.sourceBuffers = [arrayBuffer];\n }\n\n // PRIVATE\n\n _removeStringFromArray(array, string) {\n let found = true;\n while (found) {\n const index = array.indexOf(string);\n if (index > -1) {\n array.splice(index, 1);\n } else {\n found = false;\n }\n }\n }\n\n /**\n * Add attributes to buffers and create `attributes` object which is part of `mesh`\n */\n _addAttributes(attributes = {}) {\n const result = {};\n for (const attributeKey in attributes) {\n const attributeData = attributes[attributeKey];\n const attrName = this._getGltfAttributeName(attributeKey);\n const accessor = this.addBinaryBuffer(attributeData.value, attributeData);\n result[attrName] = accessor;\n }\n return result;\n }\n\n /**\n * Add indices to buffers\n */\n _addIndices(indices) {\n return this.addBinaryBuffer(indices, {size: 1});\n }\n\n /**\n * Deduce gltf specific attribue name from input attribute name\n */\n _getGltfAttributeName(attributeName) {\n switch (attributeName.toLowerCase()) {\n case 'position':\n case 'positions':\n case 'vertices':\n return 'POSITION';\n case 'normal':\n case 'normals':\n return 'NORMAL';\n case 'color':\n case 'colors':\n return 'COLOR_0';\n case 'texcoord':\n case 'texcoords':\n return 'TEXCOORD_0';\n default:\n return attributeName;\n }\n }\n\n /**\n * Calculate `min` and `max` arrays of accessor according to spec:\n * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#reference-accessor\n */\n _getAccessorMinMax(buffer, size) {\n const result = {min: null, max: null};\n if (buffer.length < size) {\n return result;\n }\n // @ts-ignore\n result.min = [];\n // @ts-ignore\n result.max = [];\n const initValues = buffer.subarray(0, size);\n for (const value of initValues) {\n // @ts-ignore\n result.min.push(value);\n // @ts-ignore\n result.max.push(value);\n }\n\n for (let index = size; index < buffer.length; index += size) {\n for (let componentIndex = 0; componentIndex < size; componentIndex++) {\n // @ts-ignore\n result.min[0 + componentIndex] = Math.min(\n // @ts-ignore\n result.min[0 + componentIndex],\n buffer[index + componentIndex]\n );\n // @ts-ignore\n result.max[0 + componentIndex] = Math.max(\n // @ts-ignore\n result.max[0 + componentIndex],\n buffer[index + componentIndex]\n );\n }\n }\n return result;\n }\n}\n"],"mappings":"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"}
|