@loaders.gl/gltf 4.0.0-alpha.17 → 4.0.0-alpha.19
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 +71 -43
- package/dist/es5/lib/extensions/EXT_meshopt_compression.js +2 -2
- package/dist/es5/lib/extensions/EXT_meshopt_compression.js.map +1 -1
- package/dist/es5/lib/extensions/KHR_texture_transform.js +2 -1
- package/dist/es5/lib/extensions/KHR_texture_transform.js.map +1 -1
- package/dist/es5/lib/parsers/parse-gltf.js +5 -2
- package/dist/es5/lib/parsers/parse-gltf.js.map +1 -1
- package/dist/es5/lib/utils/version.js +1 -1
- package/dist/esm/lib/extensions/EXT_meshopt_compression.js +2 -2
- package/dist/esm/lib/extensions/EXT_meshopt_compression.js.map +1 -1
- package/dist/esm/lib/extensions/KHR_texture_transform.js +2 -1
- package/dist/esm/lib/extensions/KHR_texture_transform.js.map +1 -1
- package/dist/esm/lib/parsers/parse-gltf.js +1 -0
- package/dist/esm/lib/parsers/parse-gltf.js.map +1 -1
- package/dist/esm/lib/utils/version.js +1 -1
- package/dist/lib/extensions/EXT_meshopt_compression.js +1 -1
- package/dist/lib/extensions/KHR_texture_transform.js +1 -1
- package/dist/lib/parsers/parse-gltf.js +5 -1
- package/package.json +6 -6
- package/src/lib/extensions/EXT_meshopt_compression.ts +1 -1
- package/src/lib/extensions/KHR_texture_transform.ts +1 -1
- package/src/lib/parsers/parse-gltf.ts +5 -1
package/dist/dist.min.js
CHANGED
|
@@ -120,37 +120,37 @@
|
|
|
120
120
|
});
|
|
121
121
|
|
|
122
122
|
// ../worker-utils/src/lib/library-utils/library-utils.ts
|
|
123
|
-
async function loadLibrary(libraryUrl, moduleName = null, options = {}) {
|
|
123
|
+
async function loadLibrary(libraryUrl, moduleName = null, options = {}, libraryName = null) {
|
|
124
124
|
if (moduleName) {
|
|
125
|
-
libraryUrl = getLibraryUrl(libraryUrl, moduleName, options);
|
|
125
|
+
libraryUrl = getLibraryUrl(libraryUrl, moduleName, options, libraryName);
|
|
126
126
|
}
|
|
127
127
|
loadLibraryPromises[libraryUrl] = loadLibraryPromises[libraryUrl] || loadLibraryFromFile(libraryUrl);
|
|
128
128
|
return await loadLibraryPromises[libraryUrl];
|
|
129
129
|
}
|
|
130
|
-
function getLibraryUrl(library, moduleName, options) {
|
|
131
|
-
if (library.startsWith("http")) {
|
|
130
|
+
function getLibraryUrl(library, moduleName, options = {}, libraryName = null) {
|
|
131
|
+
if (!options.useLocalLibraries && library.startsWith("http")) {
|
|
132
132
|
return library;
|
|
133
133
|
}
|
|
134
|
+
libraryName = libraryName || library;
|
|
134
135
|
const modules = options.modules || {};
|
|
135
|
-
if (modules[
|
|
136
|
-
return modules[
|
|
136
|
+
if (modules[libraryName]) {
|
|
137
|
+
return modules[libraryName];
|
|
137
138
|
}
|
|
138
139
|
if (!isBrowser2) {
|
|
139
|
-
return `modules/${moduleName}/dist/libs/${
|
|
140
|
+
return `modules/${moduleName}/dist/libs/${libraryName}`;
|
|
140
141
|
}
|
|
141
142
|
if (options.CDN) {
|
|
142
143
|
assert2(options.CDN.startsWith("http"));
|
|
143
|
-
return `${options.CDN}/${moduleName}@${VERSION3}/dist/libs/${
|
|
144
|
+
return `${options.CDN}/${moduleName}@${VERSION3}/dist/libs/${libraryName}`;
|
|
144
145
|
}
|
|
145
146
|
if (isWorker) {
|
|
146
|
-
return `../src/libs/${
|
|
147
|
+
return `../src/libs/${libraryName}`;
|
|
147
148
|
}
|
|
148
|
-
return `modules/${moduleName}/src/libs/${
|
|
149
|
+
return `modules/${moduleName}/src/libs/${libraryName}`;
|
|
149
150
|
}
|
|
150
151
|
async function loadLibraryFromFile(libraryUrl) {
|
|
151
152
|
if (libraryUrl.endsWith("wasm")) {
|
|
152
|
-
|
|
153
|
-
return await response2.arrayBuffer();
|
|
153
|
+
return await loadAsArrayBuffer(libraryUrl);
|
|
154
154
|
}
|
|
155
155
|
if (!isBrowser2) {
|
|
156
156
|
try {
|
|
@@ -162,8 +162,7 @@
|
|
|
162
162
|
if (isWorker) {
|
|
163
163
|
return importScripts(libraryUrl);
|
|
164
164
|
}
|
|
165
|
-
const
|
|
166
|
-
const scriptSource = await response.text();
|
|
165
|
+
const scriptSource = await loadAsText(libraryUrl);
|
|
167
166
|
return loadLibraryFromString(scriptSource, libraryUrl);
|
|
168
167
|
}
|
|
169
168
|
function loadLibraryFromString(scriptSource, id) {
|
|
@@ -184,6 +183,20 @@
|
|
|
184
183
|
document.body.appendChild(script);
|
|
185
184
|
return null;
|
|
186
185
|
}
|
|
186
|
+
async function loadAsArrayBuffer(url) {
|
|
187
|
+
if (!node.readFileAsArrayBuffer || url.startsWith("http")) {
|
|
188
|
+
const response = await fetch(url);
|
|
189
|
+
return await response.arrayBuffer();
|
|
190
|
+
}
|
|
191
|
+
return await node.readFileAsArrayBuffer(url);
|
|
192
|
+
}
|
|
193
|
+
async function loadAsText(url) {
|
|
194
|
+
if (!node.readFileAsText || url.startsWith("http")) {
|
|
195
|
+
const response = await fetch(url);
|
|
196
|
+
return await response.text();
|
|
197
|
+
}
|
|
198
|
+
return await node.readFileAsText(url);
|
|
199
|
+
}
|
|
187
200
|
var node, LATEST, VERSION3, loadLibraryPromises;
|
|
188
201
|
var init_library_utils = __esm({
|
|
189
202
|
"../worker-utils/src/lib/library-utils/library-utils.ts"() {
|
|
@@ -841,25 +854,25 @@
|
|
|
841
854
|
});
|
|
842
855
|
|
|
843
856
|
// ../textures/src/lib/parsers/basis-module-loader.ts
|
|
844
|
-
async function
|
|
857
|
+
async function loadBasisTranscoderModule(options) {
|
|
845
858
|
const modules = options.modules || {};
|
|
846
859
|
if (modules.basis) {
|
|
847
860
|
return modules.basis;
|
|
848
861
|
}
|
|
849
|
-
loadBasisTranscoderPromise = loadBasisTranscoderPromise ||
|
|
862
|
+
loadBasisTranscoderPromise = loadBasisTranscoderPromise || loadBasisTranscoder(options);
|
|
850
863
|
return await loadBasisTranscoderPromise;
|
|
851
864
|
}
|
|
852
|
-
async function
|
|
865
|
+
async function loadBasisTranscoder(options) {
|
|
853
866
|
let BASIS = null;
|
|
854
867
|
let wasmBinary = null;
|
|
855
868
|
[BASIS, wasmBinary] = await Promise.all([
|
|
856
|
-
await loadLibrary(
|
|
857
|
-
await loadLibrary(
|
|
869
|
+
await loadLibrary(BASIS_EXTERNAL_LIBRARIES.TRANSCODER, "textures", options),
|
|
870
|
+
await loadLibrary(BASIS_EXTERNAL_LIBRARIES.TRANSCODER_WASM, "textures", options)
|
|
858
871
|
]);
|
|
859
872
|
BASIS = BASIS || globalThis.BASIS;
|
|
860
|
-
return await
|
|
873
|
+
return await initializeBasisTranscoderModule(BASIS, wasmBinary);
|
|
861
874
|
}
|
|
862
|
-
function
|
|
875
|
+
function initializeBasisTranscoderModule(BasisModule, wasmBinary) {
|
|
863
876
|
const options = {};
|
|
864
877
|
if (wasmBinary) {
|
|
865
878
|
options.wasmBinary = wasmBinary;
|
|
@@ -884,8 +897,8 @@
|
|
|
884
897
|
let BASIS_ENCODER = null;
|
|
885
898
|
let wasmBinary = null;
|
|
886
899
|
[BASIS_ENCODER, wasmBinary] = await Promise.all([
|
|
887
|
-
await loadLibrary(
|
|
888
|
-
await loadLibrary(
|
|
900
|
+
await loadLibrary(BASIS_EXTERNAL_LIBRARIES.ENCODER, "textures", options),
|
|
901
|
+
await loadLibrary(BASIS_EXTERNAL_LIBRARIES.ENCODER_WASM, "textures", options)
|
|
889
902
|
]);
|
|
890
903
|
BASIS_ENCODER = BASIS_ENCODER || globalThis.BASIS;
|
|
891
904
|
return await initializeBasisEncoderModule(BASIS_ENCODER, wasmBinary);
|
|
@@ -903,13 +916,16 @@
|
|
|
903
916
|
});
|
|
904
917
|
});
|
|
905
918
|
}
|
|
906
|
-
var
|
|
919
|
+
var BASIS_EXTERNAL_LIBRARIES, loadBasisTranscoderPromise, loadBasisEncoderPromise;
|
|
907
920
|
var init_basis_module_loader = __esm({
|
|
908
921
|
"../textures/src/lib/parsers/basis-module-loader.ts"() {
|
|
909
922
|
init_src();
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
923
|
+
BASIS_EXTERNAL_LIBRARIES = {
|
|
924
|
+
TRANSCODER: "basis_transcoder.js",
|
|
925
|
+
TRANSCODER_WASM: "basis_transcoder.wasm",
|
|
926
|
+
ENCODER: "basis_encoder.js",
|
|
927
|
+
ENCODER_WASM: "basis_encoder.wasm"
|
|
928
|
+
};
|
|
913
929
|
}
|
|
914
930
|
});
|
|
915
931
|
|
|
@@ -1081,7 +1097,7 @@
|
|
|
1081
1097
|
const fileConstructors = await loadBasisEncoderModule(options);
|
|
1082
1098
|
return parseKTX2File(fileConstructors.KTX2File, data, options);
|
|
1083
1099
|
}
|
|
1084
|
-
const { BasisFile } = await
|
|
1100
|
+
const { BasisFile } = await loadBasisTranscoderModule(options);
|
|
1085
1101
|
return parseBasisFile(BasisFile, data, options);
|
|
1086
1102
|
}
|
|
1087
1103
|
switch (options.basis.module) {
|
|
@@ -1096,7 +1112,7 @@
|
|
|
1096
1112
|
}
|
|
1097
1113
|
case "transcoder":
|
|
1098
1114
|
default:
|
|
1099
|
-
const { BasisFile } = await
|
|
1115
|
+
const { BasisFile } = await loadBasisTranscoderModule(options);
|
|
1100
1116
|
return parseBasisFile(BasisFile, data, options);
|
|
1101
1117
|
}
|
|
1102
1118
|
}
|
|
@@ -2158,7 +2174,7 @@
|
|
|
2158
2174
|
});
|
|
2159
2175
|
async function decode2(gltfData, options) {
|
|
2160
2176
|
const scenegraph = new GLTFScenegraph(gltfData);
|
|
2161
|
-
if (!options?.gltf?.decompressMeshes) {
|
|
2177
|
+
if (!options?.gltf?.decompressMeshes || !options.gltf?.loadBuffers) {
|
|
2162
2178
|
return;
|
|
2163
2179
|
}
|
|
2164
2180
|
const promises = [];
|
|
@@ -2259,10 +2275,10 @@
|
|
|
2259
2275
|
});
|
|
2260
2276
|
|
|
2261
2277
|
// ../draco/src/lib/utils/version.ts
|
|
2262
|
-
var
|
|
2278
|
+
var VERSION6;
|
|
2263
2279
|
var init_version5 = __esm({
|
|
2264
2280
|
"../draco/src/lib/utils/version.ts"() {
|
|
2265
|
-
|
|
2281
|
+
VERSION6 = typeof __VERSION__ !== "undefined" ? __VERSION__ : "latest";
|
|
2266
2282
|
}
|
|
2267
2283
|
});
|
|
2268
2284
|
|
|
@@ -2283,7 +2299,7 @@
|
|
|
2283
2299
|
name: "Draco",
|
|
2284
2300
|
id: "draco",
|
|
2285
2301
|
module: "draco",
|
|
2286
|
-
version:
|
|
2302
|
+
version: VERSION6,
|
|
2287
2303
|
worker: true,
|
|
2288
2304
|
extensions: ["drc"],
|
|
2289
2305
|
mimeTypes: ["application/octet-stream"],
|
|
@@ -2799,13 +2815,13 @@
|
|
|
2799
2815
|
let wasmBinary;
|
|
2800
2816
|
switch (options.draco && options.draco.decoderType) {
|
|
2801
2817
|
case "js":
|
|
2802
|
-
DracoDecoderModule = await loadLibrary(
|
|
2818
|
+
DracoDecoderModule = await loadLibrary(DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER], "draco", options, DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER);
|
|
2803
2819
|
break;
|
|
2804
2820
|
case "wasm":
|
|
2805
2821
|
default:
|
|
2806
2822
|
[DracoDecoderModule, wasmBinary] = await Promise.all([
|
|
2807
|
-
await loadLibrary(
|
|
2808
|
-
await loadLibrary(
|
|
2823
|
+
await loadLibrary(DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER], "draco", options, DRACO_EXTERNAL_LIBRARIES.DECODER),
|
|
2824
|
+
await loadLibrary(DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER_WASM], "draco", options, DRACO_EXTERNAL_LIBRARIES.DECODER_WASM)
|
|
2809
2825
|
]);
|
|
2810
2826
|
}
|
|
2811
2827
|
DracoDecoderModule = DracoDecoderModule || globalThis.DracoDecoderModule;
|
|
@@ -2823,17 +2839,25 @@
|
|
|
2823
2839
|
});
|
|
2824
2840
|
});
|
|
2825
2841
|
}
|
|
2826
|
-
var DRACO_DECODER_VERSION, DRACO_ENCODER_VERSION, STATIC_DECODER_URL,
|
|
2842
|
+
var DRACO_DECODER_VERSION, DRACO_ENCODER_VERSION, STATIC_DECODER_URL, DRACO_EXTERNAL_LIBRARIES, DRACO_EXTERNAL_LIBRARY_URLS, loadDecoderPromise;
|
|
2827
2843
|
var init_draco_module_loader = __esm({
|
|
2828
2844
|
"../draco/src/lib/draco-module-loader.ts"() {
|
|
2829
2845
|
init_src();
|
|
2830
2846
|
DRACO_DECODER_VERSION = "1.5.5";
|
|
2831
2847
|
DRACO_ENCODER_VERSION = "1.4.1";
|
|
2832
2848
|
STATIC_DECODER_URL = `https://www.gstatic.com/draco/versioned/decoders/${DRACO_DECODER_VERSION}`;
|
|
2833
|
-
|
|
2834
|
-
|
|
2835
|
-
|
|
2836
|
-
|
|
2849
|
+
DRACO_EXTERNAL_LIBRARIES = {
|
|
2850
|
+
DECODER: "draco_wasm_wrapper.js",
|
|
2851
|
+
DECODER_WASM: "draco_decoder.wasm",
|
|
2852
|
+
FALLBACK_DECODER: "draco_decoder.js",
|
|
2853
|
+
ENCODER: "draco_encoder.js"
|
|
2854
|
+
};
|
|
2855
|
+
DRACO_EXTERNAL_LIBRARY_URLS = {
|
|
2856
|
+
[DRACO_EXTERNAL_LIBRARIES.DECODER]: `${STATIC_DECODER_URL}/${DRACO_EXTERNAL_LIBRARIES.DECODER}`,
|
|
2857
|
+
[DRACO_EXTERNAL_LIBRARIES.DECODER_WASM]: `${STATIC_DECODER_URL}/${DRACO_EXTERNAL_LIBRARIES.DECODER_WASM}`,
|
|
2858
|
+
[DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER]: `${STATIC_DECODER_URL}/${DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER}`,
|
|
2859
|
+
[DRACO_EXTERNAL_LIBRARIES.ENCODER]: `https://raw.githubusercontent.com/google/draco/${DRACO_ENCODER_VERSION}/javascript/${DRACO_EXTERNAL_LIBRARIES.ENCODER}`
|
|
2860
|
+
};
|
|
2837
2861
|
}
|
|
2838
2862
|
});
|
|
2839
2863
|
|
|
@@ -4221,7 +4245,7 @@
|
|
|
4221
4245
|
async function decode4(gltfData, options) {
|
|
4222
4246
|
const gltfScenegraph = new GLTFScenegraph(gltfData);
|
|
4223
4247
|
const hasExtension = gltfScenegraph.hasExtension(EXT_MESHOPT_TRANSFORM);
|
|
4224
|
-
if (!hasExtension) {
|
|
4248
|
+
if (!hasExtension || !options.gltf?.loadBuffers) {
|
|
4225
4249
|
return;
|
|
4226
4250
|
}
|
|
4227
4251
|
const materials = gltfData.json.materials || [];
|
|
@@ -5121,7 +5145,11 @@
|
|
|
5121
5145
|
arrayBuffer = sliceArrayBuffer(array.buffer, array.byteOffset, array.byteLength);
|
|
5122
5146
|
}
|
|
5123
5147
|
assert3(arrayBuffer, "glTF image has no data");
|
|
5124
|
-
let parsedImage = await parse4(arrayBuffer, [ImageLoader, BasisLoader], {
|
|
5148
|
+
let parsedImage = await parse4(arrayBuffer, [ImageLoader, BasisLoader], {
|
|
5149
|
+
...options,
|
|
5150
|
+
mimeType: image.mimeType,
|
|
5151
|
+
basis: options.basis || { format: selectSupportedBasisFormat() }
|
|
5152
|
+
}, context);
|
|
5125
5153
|
if (parsedImage && parsedImage[0]) {
|
|
5126
5154
|
parsedImage = {
|
|
5127
5155
|
compressed: true,
|
|
@@ -25,13 +25,13 @@ function decode(_x, _x2) {
|
|
|
25
25
|
}
|
|
26
26
|
function _decode() {
|
|
27
27
|
_decode = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee(gltfData, options) {
|
|
28
|
-
var _options$gltf;
|
|
28
|
+
var _options$gltf, _options$gltf2;
|
|
29
29
|
var scenegraph, promises, _iterator, _step, bufferViewIndex;
|
|
30
30
|
return _regenerator.default.wrap(function _callee$(_context) {
|
|
31
31
|
while (1) switch (_context.prev = _context.next) {
|
|
32
32
|
case 0:
|
|
33
33
|
scenegraph = new _gltfScenegraph.GLTFScenegraph(gltfData);
|
|
34
|
-
if (options !== null && options !== void 0 && (_options$gltf = options.gltf) !== null && _options$gltf !== void 0 && _options$gltf.decompressMeshes) {
|
|
34
|
+
if (!(!(options !== null && options !== void 0 && (_options$gltf = options.gltf) !== null && _options$gltf !== void 0 && _options$gltf.decompressMeshes) || !((_options$gltf2 = options.gltf) !== null && _options$gltf2 !== void 0 && _options$gltf2.loadBuffers))) {
|
|
35
35
|
_context.next = 3;
|
|
36
36
|
break;
|
|
37
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EXT_meshopt_compression.js","names":["_gltfScenegraph","require","_meshoptDecoder","_createForOfIteratorHelper","o","allowArrayLike","it","Symbol","iterator","Array","isArray","_unsupportedIterableToArray","length","i","F","s","n","done","value","e","_e","f","TypeError","normalCompletion","didErr","err","call","step","next","_e2","return","minLen","_arrayLikeToArray","Object","prototype","toString","slice","constructor","name","from","test","arr","len","arr2","DEFAULT_MESHOPT_OPTIONS","byteOffset","filter","EXT_MESHOPT_COMPRESSION","exports","decode","_x","_x2","_decode","apply","arguments","_asyncToGenerator2","default","_regenerator","mark","_callee","gltfData","options","_options$gltf","scenegraph","promises","_iterator","_step","bufferViewIndex","wrap","_callee$","_context","prev","GLTFScenegraph","gltf","decompressMeshes","abrupt","json","bufferViews","push","decodeMeshoptBufferView","Promise","all","removeExtension","stop","_x3","_x4","_decodeMeshoptBufferView","_callee2","bufferView","meshoptExtension","_meshoptExtension$byt","_meshoptExtension$byt2","byteLength","byteStride","count","mode","_meshoptExtension$fil","bufferIndex","buffer","source","result","_callee2$","_context2","getObjectExtension","buffers","Uint8Array","arrayBuffer","meshoptDecodeGltfBuffer","removeObjectExtension"],"sources":["../../../../src/lib/extensions/EXT_meshopt_compression.ts"],"sourcesContent":["/* eslint-disable camelcase */\nimport type {GLTF, GLTFBufferView, GLTF_EXT_meshopt_compression} from '../types/gltf-json-schema';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\nimport {GLTFScenegraph} from '../api/gltf-scenegraph';\nimport {meshoptDecodeGltfBuffer} from '../../meshopt/meshopt-decoder';\n\n// @ts-ignore\n// eslint-disable-next-line\nconst DEFAULT_MESHOPT_OPTIONS = {\n byteOffset: 0,\n filter: 'NONE'\n};\n\n/** Extension name */\nconst EXT_MESHOPT_COMPRESSION = 'EXT_meshopt_compression';\n\nexport const name = EXT_MESHOPT_COMPRESSION;\n\nexport async function decode(gltfData: {json: GLTF}, options: GLTFLoaderOptions) {\n const scenegraph = new GLTFScenegraph(gltfData);\n\n if (!options?.gltf?.decompressMeshes) {\n return;\n }\n\n const promises: Promise<any>[] = [];\n for (const bufferViewIndex of gltfData.json.bufferViews || []) {\n promises.push(decodeMeshoptBufferView(scenegraph, bufferViewIndex));\n }\n\n // Decompress meshes in parallel\n await Promise.all(promises);\n\n // We have now decompressed all primitives, so remove the top-level extension\n scenegraph.removeExtension(EXT_MESHOPT_COMPRESSION);\n}\n\n/** Decode one meshopt buffer view */\nasync function decodeMeshoptBufferView(\n scenegraph: GLTFScenegraph,\n bufferView: GLTFBufferView\n): Promise<void> {\n const meshoptExtension = scenegraph.getObjectExtension<GLTF_EXT_meshopt_compression>(\n bufferView,\n EXT_MESHOPT_COMPRESSION\n );\n if (meshoptExtension) {\n const {\n byteOffset = 0,\n byteLength = 0,\n byteStride,\n count,\n mode,\n filter = 'NONE',\n buffer: bufferIndex\n } = meshoptExtension;\n const buffer = scenegraph.gltf.buffers[bufferIndex];\n\n const source = new Uint8Array(buffer.arrayBuffer, buffer.byteOffset + byteOffset, byteLength);\n const result = new Uint8Array(\n scenegraph.gltf.buffers[bufferView.buffer].arrayBuffer,\n bufferView.byteOffset,\n bufferView.byteLength\n );\n await meshoptDecodeGltfBuffer(result, count, byteStride, source, mode, filter);\n scenegraph.removeObjectExtension(bufferView, EXT_MESHOPT_COMPRESSION);\n }\n}\n"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"EXT_meshopt_compression.js","names":["_gltfScenegraph","require","_meshoptDecoder","_createForOfIteratorHelper","o","allowArrayLike","it","Symbol","iterator","Array","isArray","_unsupportedIterableToArray","length","i","F","s","n","done","value","e","_e","f","TypeError","normalCompletion","didErr","err","call","step","next","_e2","return","minLen","_arrayLikeToArray","Object","prototype","toString","slice","constructor","name","from","test","arr","len","arr2","DEFAULT_MESHOPT_OPTIONS","byteOffset","filter","EXT_MESHOPT_COMPRESSION","exports","decode","_x","_x2","_decode","apply","arguments","_asyncToGenerator2","default","_regenerator","mark","_callee","gltfData","options","_options$gltf","_options$gltf2","scenegraph","promises","_iterator","_step","bufferViewIndex","wrap","_callee$","_context","prev","GLTFScenegraph","gltf","decompressMeshes","loadBuffers","abrupt","json","bufferViews","push","decodeMeshoptBufferView","Promise","all","removeExtension","stop","_x3","_x4","_decodeMeshoptBufferView","_callee2","bufferView","meshoptExtension","_meshoptExtension$byt","_meshoptExtension$byt2","byteLength","byteStride","count","mode","_meshoptExtension$fil","bufferIndex","buffer","source","result","_callee2$","_context2","getObjectExtension","buffers","Uint8Array","arrayBuffer","meshoptDecodeGltfBuffer","removeObjectExtension"],"sources":["../../../../src/lib/extensions/EXT_meshopt_compression.ts"],"sourcesContent":["/* eslint-disable camelcase */\nimport type {GLTF, GLTFBufferView, GLTF_EXT_meshopt_compression} from '../types/gltf-json-schema';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\nimport {GLTFScenegraph} from '../api/gltf-scenegraph';\nimport {meshoptDecodeGltfBuffer} from '../../meshopt/meshopt-decoder';\n\n// @ts-ignore\n// eslint-disable-next-line\nconst DEFAULT_MESHOPT_OPTIONS = {\n byteOffset: 0,\n filter: 'NONE'\n};\n\n/** Extension name */\nconst EXT_MESHOPT_COMPRESSION = 'EXT_meshopt_compression';\n\nexport const name = EXT_MESHOPT_COMPRESSION;\n\nexport async function decode(gltfData: {json: GLTF}, options: GLTFLoaderOptions) {\n const scenegraph = new GLTFScenegraph(gltfData);\n\n if (!options?.gltf?.decompressMeshes || !options.gltf?.loadBuffers) {\n return;\n }\n\n const promises: Promise<any>[] = [];\n for (const bufferViewIndex of gltfData.json.bufferViews || []) {\n promises.push(decodeMeshoptBufferView(scenegraph, bufferViewIndex));\n }\n\n // Decompress meshes in parallel\n await Promise.all(promises);\n\n // We have now decompressed all primitives, so remove the top-level extension\n scenegraph.removeExtension(EXT_MESHOPT_COMPRESSION);\n}\n\n/** Decode one meshopt buffer view */\nasync function decodeMeshoptBufferView(\n scenegraph: GLTFScenegraph,\n bufferView: GLTFBufferView\n): Promise<void> {\n const meshoptExtension = scenegraph.getObjectExtension<GLTF_EXT_meshopt_compression>(\n bufferView,\n EXT_MESHOPT_COMPRESSION\n );\n if (meshoptExtension) {\n const {\n byteOffset = 0,\n byteLength = 0,\n byteStride,\n count,\n mode,\n filter = 'NONE',\n buffer: bufferIndex\n } = meshoptExtension;\n const buffer = scenegraph.gltf.buffers[bufferIndex];\n\n const source = new Uint8Array(buffer.arrayBuffer, buffer.byteOffset + byteOffset, byteLength);\n const result = new Uint8Array(\n scenegraph.gltf.buffers[bufferView.buffer].arrayBuffer,\n bufferView.byteOffset,\n bufferView.byteLength\n );\n await meshoptDecodeGltfBuffer(result, count, byteStride, source, mode, filter);\n scenegraph.removeObjectExtension(bufferView, EXT_MESHOPT_COMPRESSION);\n }\n}\n"],"mappings":"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"}
|
|
@@ -28,13 +28,14 @@ function decode(_x, _x2) {
|
|
|
28
28
|
}
|
|
29
29
|
function _decode() {
|
|
30
30
|
_decode = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee(gltfData, options) {
|
|
31
|
+
var _options$gltf;
|
|
31
32
|
var gltfScenegraph, hasExtension, materials, i;
|
|
32
33
|
return _regenerator.default.wrap(function _callee$(_context) {
|
|
33
34
|
while (1) switch (_context.prev = _context.next) {
|
|
34
35
|
case 0:
|
|
35
36
|
gltfScenegraph = new _gltfScenegraph.GLTFScenegraph(gltfData);
|
|
36
37
|
hasExtension = gltfScenegraph.hasExtension(EXT_MESHOPT_TRANSFORM);
|
|
37
|
-
if (hasExtension) {
|
|
38
|
+
if (!(!hasExtension || !((_options$gltf = options.gltf) !== null && _options$gltf !== void 0 && _options$gltf.loadBuffers))) {
|
|
38
39
|
_context.next = 4;
|
|
39
40
|
break;
|
|
40
41
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KHR_texture_transform.js","names":["_core","require","_gltfUtils","_gltfConstants","_gltfScenegraph","_createForOfIteratorHelper","o","allowArrayLike","it","Symbol","iterator","Array","isArray","_unsupportedIterableToArray","length","i","F","s","n","done","value","e","_e","f","TypeError","normalCompletion","didErr","err","call","step","next","_e2","return","minLen","_arrayLikeToArray","Object","prototype","toString","slice","constructor","name","from","test","arr","len","arr2","EXT_MESHOPT_TRANSFORM","exports","scratchVector","Vector3","scratchRotationMatrix","Matrix3","scratchScaleMatrix","decode","_x","_x2","_decode","apply","arguments","_asyncToGenerator2","default","_regenerator","mark","_callee","gltfData","options","gltfScenegraph","hasExtension","materials","wrap","_callee$","_context","prev","GLTFScenegraph","abrupt","json","transformTexCoords","stop","materialIndex","_gltfData$json$materi","_material$pbrMetallic","_material$pbrMetallic2","processedTexCoords","material","baseColorTexture","pbrMetallicRoughness","transformPrimitives","emisiveTexture","emissiveTexture","normalTexture","occlusionTexture","metallicRoughnessTexture","texture","transformParameters","getTransformParameters","meshes","_iterator","_step","mesh","_iterator2","primitives","_step2","primitive","Number","isFinite","transformPrimitive","_texture$extensions","textureInfo","extensions","_texture$texCoord","texCoord","originalTexCoord","_textureInfo$texCoord","isProcessed","findIndex","_ref","_ref2","_slicedToArray2","original","newTexCoord","matrix","makeTransformationMatrix","push","texCoordAccessor","attributes","concat","_gltfData$json$access","accessor","accessors","bufferView","_gltfData$json$buffer","bufferViews","_gltfData$buffers$buf","buffers","buffer","arrayBuffer","bufferByteOffset","byteOffset","_getAccessorArrayType","getAccessorArrayTypeAndLength","ArrayType","bytes","BYTES","componentType","components","COMPONENTS","type","elementAddressScale","byteStride","result","Float32Array","count","uv","set","transformByMatrix3","updateGltf","createAttribute","newTexCoordArray","byteLength","originalAccessor","extensionData","_extensionData$offset","offset","_extensionData$rotati","rotation","_extensionData$scale","scale","translationMatrix","rotationMatrix","Math","cos","sin","scaleMatrix","multiplyRight"],"sources":["../../../../src/lib/extensions/KHR_texture_transform.ts"],"sourcesContent":["/**\n * https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_texture_transform/README.md\n */\n\nimport {Vector3, Matrix3} from '@math.gl/core';\nimport type {GLTFWithBuffers} from '../types/gltf-types';\nimport type {\n GLTFMeshPrimitive,\n GLTFAccessor,\n GLTFBufferView,\n GLTFMaterialNormalTextureInfo,\n GLTFMaterialOcclusionTextureInfo,\n GLTFTextureInfo\n} from '../types/gltf-json-schema';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\n\nimport {getAccessorArrayTypeAndLength} from '../gltf-utils/gltf-utils';\nimport {BYTES, COMPONENTS} from '../gltf-utils/gltf-constants';\nimport {} from '../types/gltf-json-schema';\nimport {GLTFScenegraph} from '../api/gltf-scenegraph';\n\n/** Extension name */\nconst EXT_MESHOPT_TRANSFORM = 'KHR_texture_transform';\n\nexport const name = EXT_MESHOPT_TRANSFORM;\n\nconst scratchVector = new Vector3();\nconst scratchRotationMatrix = new Matrix3();\nconst scratchScaleMatrix = new Matrix3();\n\n/** Extension textureInfo https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_texture_transform#gltf-schema-updates */\ntype TextureInfo = {\n /** The offset of the UV coordinate origin as a factor of the texture dimensions. */\n offset?: [number, number];\n /** Rotate the UVs by this many radians counter-clockwise around the origin. This is equivalent to a similar rotation of the image clockwise. */\n rotation?: number;\n /** The scale factor applied to the components of the UV coordinates. */\n scale?: [number, number];\n /** Overrides the textureInfo texCoord value if supplied, and if this extension is supported. */\n texCoord?: number;\n};\n/** Intersection of all GLTF textures */\ntype CompoundGLTFTextureInfo = GLTFTextureInfo &\n GLTFMaterialNormalTextureInfo &\n GLTFMaterialOcclusionTextureInfo;\n/** Parameters for TEXCOORD transformation */\ntype TransformParameters = {\n /** Original texCoord value https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html#_textureinfo_texcoord */\n originalTexCoord: number;\n /** New texCoord value from extension https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_texture_transform#gltf-schema-updates */\n texCoord: number;\n /** Transformation matrix */\n matrix: Matrix3;\n};\n\n/**\n * The extension entry to process the transformation\n * @param gltfData gltf buffers and json\n * @param options GLTFLoader options\n */\nexport async function decode(gltfData: GLTFWithBuffers, options: GLTFLoaderOptions) {\n const gltfScenegraph = new GLTFScenegraph(gltfData);\n const hasExtension = gltfScenegraph.hasExtension(EXT_MESHOPT_TRANSFORM);\n if (!hasExtension) {\n return;\n }\n const materials = gltfData.json.materials || [];\n for (let i = 0; i < materials.length; i++) {\n transformTexCoords(i, gltfData);\n }\n}\n\n/**\n * Transform TEXCOORD by material\n * @param materialIndex processing material index\n * @param gltfData gltf buffers and json\n */\nfunction transformTexCoords(materialIndex: number, gltfData: GLTFWithBuffers): void {\n // Save processed texCoords in order no to process the same twice\n const processedTexCoords: [number, number][] = [];\n const material = gltfData.json.materials?.[materialIndex];\n const baseColorTexture = material?.pbrMetallicRoughness?.baseColorTexture;\n if (baseColorTexture) {\n transformPrimitives(gltfData, materialIndex, baseColorTexture, processedTexCoords);\n }\n const emisiveTexture = material?.emissiveTexture;\n if (emisiveTexture) {\n transformPrimitives(gltfData, materialIndex, emisiveTexture, processedTexCoords);\n }\n const normalTexture = material?.normalTexture;\n if (normalTexture) {\n transformPrimitives(gltfData, materialIndex, normalTexture, processedTexCoords);\n }\n const occlusionTexture = material?.occlusionTexture;\n if (occlusionTexture) {\n transformPrimitives(gltfData, materialIndex, occlusionTexture, processedTexCoords);\n }\n const metallicRoughnessTexture = material?.pbrMetallicRoughness?.metallicRoughnessTexture;\n if (metallicRoughnessTexture) {\n transformPrimitives(gltfData, materialIndex, metallicRoughnessTexture, processedTexCoords);\n }\n}\n\n/**\n * Transform primitives of the particular material\n * @param gltfData gltf data\n * @param materialIndex primitives with this material will be transformed\n * @param texture texture object\n * @param processedTexCoords storage to save already processed texCoords\n */\nfunction transformPrimitives(\n gltfData: GLTFWithBuffers,\n materialIndex: number,\n texture: CompoundGLTFTextureInfo,\n processedTexCoords: [number, number][]\n) {\n const transformParameters = getTransformParameters(texture, processedTexCoords);\n if (!transformParameters) {\n return;\n }\n const meshes = gltfData.json.meshes || [];\n for (const mesh of meshes) {\n for (const primitive of mesh.primitives) {\n const material = primitive.material;\n if (Number.isFinite(material) && materialIndex === material) {\n transformPrimitive(gltfData, primitive, transformParameters);\n }\n }\n }\n}\n\n/**\n * Get parameters for TEXCOORD transformation\n * @param texture texture object\n * @param processedTexCoords storage to save already processed texCoords\n * @returns texCoord couple and transformation matrix\n */\nfunction getTransformParameters(\n texture: CompoundGLTFTextureInfo,\n processedTexCoords: [number, number][]\n): TransformParameters | null {\n const textureInfo = texture.extensions?.[EXT_MESHOPT_TRANSFORM];\n const {texCoord: originalTexCoord = 0} = texture;\n // If texCoord is not set in the extension, original attribute data will be replaced\n const {texCoord = originalTexCoord} = textureInfo;\n // Make sure that couple [originalTexCoord, extensionTexCoord] is not processed twice\n const isProcessed =\n processedTexCoords.findIndex(\n ([original, newTexCoord]) => original === originalTexCoord && newTexCoord === texCoord\n ) !== -1;\n if (!isProcessed) {\n const matrix = makeTransformationMatrix(textureInfo);\n if (originalTexCoord !== texCoord) {\n texture.texCoord = texCoord;\n }\n processedTexCoords.push([originalTexCoord, texCoord]);\n return {originalTexCoord, texCoord, matrix};\n }\n return null;\n}\n\n/**\n * Transform `TEXCOORD_0` attribute in the primitive\n * @param gltfData gltf data\n * @param primitive primitive object\n * @param transformParameters texCoord couple and transformation matrix\n */\nfunction transformPrimitive(\n gltfData: GLTFWithBuffers,\n primitive: GLTFMeshPrimitive,\n transformParameters: TransformParameters\n) {\n const {originalTexCoord, texCoord, matrix} = transformParameters;\n const texCoordAccessor = primitive.attributes[`TEXCOORD_${originalTexCoord}`];\n if (Number.isFinite(texCoordAccessor)) {\n // Get accessor of the `TEXCOORD_0` attribute\n const accessor = gltfData.json.accessors?.[texCoordAccessor];\n if (accessor && accessor.bufferView) {\n // Get `bufferView` of the `accessor`\n const bufferView = gltfData.json.bufferViews?.[accessor.bufferView];\n if (bufferView) {\n // Get `arrayBuffer` the `bufferView` look at\n const {arrayBuffer, byteOffset: bufferByteOffset} = gltfData.buffers[bufferView.buffer];\n // Resulting byteOffset is sum of the buffer, accessor and bufferView byte offsets\n const byteOffset =\n (bufferByteOffset || 0) + (accessor.byteOffset || 0) + (bufferView.byteOffset || 0);\n // Deduce TypedArray type and its length from `accessor` and `bufferView` data\n const {ArrayType, length} = getAccessorArrayTypeAndLength(accessor, bufferView);\n // Number of bytes each component occupies\n const bytes = BYTES[accessor.componentType];\n // Number of components. For the `TEXCOORD_0` with `VEC2` type, it must return 2\n const components = COMPONENTS[accessor.type];\n // Multiplier to calculate the address of the `TEXCOORD_0` element in the arrayBuffer\n const elementAddressScale = bufferView.byteStride || bytes * components;\n // Data transform to Float32Array\n const result = new Float32Array(length);\n for (let i = 0; i < accessor.count; i++) {\n // Take [u, v] couple from the arrayBuffer\n const uv = new ArrayType(arrayBuffer, byteOffset + i * elementAddressScale, 2);\n // Set and transform Vector3 per https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_texture_transform#overview\n scratchVector.set(uv[0], uv[1], 1);\n scratchVector.transformByMatrix3(matrix);\n // Save result in Float32Array\n result.set([scratchVector[0], scratchVector[1]], i * components);\n }\n // If texCoord the same, replace gltf structural data\n if (originalTexCoord === texCoord) {\n updateGltf(accessor, bufferView, gltfData.buffers, result);\n } else {\n // If texCoord change, create new attribute\n createAttribute(texCoord, accessor, primitive, gltfData, result);\n }\n }\n }\n }\n}\n\n/**\n * Update GLTF structural objects with new data as we create new `Float32Array` for `TEXCOORD_0`.\n * @param accessor accessor to change\n * @param bufferView bufferView to change\n * @param buffers binary buffers\n * @param newTexcoordArray typed array with data after transformation\n */\nfunction updateGltf(\n accessor: GLTFAccessor,\n bufferView: GLTFBufferView,\n buffers: {arrayBuffer: ArrayBuffer; byteOffset: number; byteLength: number}[],\n newTexCoordArray: Float32Array\n): void {\n accessor.componentType = 5126;\n buffers.push({\n arrayBuffer: newTexCoordArray.buffer,\n byteOffset: 0,\n byteLength: newTexCoordArray.buffer.byteLength\n });\n bufferView.buffer = buffers.length - 1;\n bufferView.byteLength = newTexCoordArray.buffer.byteLength;\n bufferView.byteOffset = 0;\n delete bufferView.byteStride;\n}\n\n/**\n *\n * @param newTexCoord new `texCoord` value\n * @param originalAccessor original accessor object, that store data before transformation\n * @param primitive primitive object\n * @param gltfData gltf data\n * @param newTexCoordArray typed array with data after transformation\n * @returns\n */\nfunction createAttribute(\n newTexCoord: number,\n originalAccessor: GLTFAccessor,\n primitive: GLTFMeshPrimitive,\n gltfData: GLTFWithBuffers,\n newTexCoordArray: Float32Array\n) {\n gltfData.buffers.push({\n arrayBuffer: newTexCoordArray.buffer,\n byteOffset: 0,\n byteLength: newTexCoordArray.buffer.byteLength\n });\n const bufferViews = gltfData.json.bufferViews;\n if (!bufferViews) {\n return;\n }\n bufferViews.push({\n buffer: gltfData.buffers.length - 1,\n byteLength: newTexCoordArray.buffer.byteLength,\n byteOffset: 0\n });\n const accessors = gltfData.json.accessors;\n if (!accessors) {\n return;\n }\n accessors.push({\n bufferView: bufferViews?.length - 1,\n byteOffset: 0,\n componentType: 5126,\n count: originalAccessor.count,\n type: 'VEC2'\n });\n primitive.attributes[`TEXCOORD_${newTexCoord}`] = accessors.length - 1;\n}\n\n/**\n * Construct transformation matrix from the extension data (transition, rotation, scale)\n * @param extensionData extension data\n * @returns transformation matrix\n */\nfunction makeTransformationMatrix(extensionData: TextureInfo): Matrix3 {\n const {offset = [0, 0], rotation = 0, scale = [1, 1]} = extensionData;\n const translationMatrix = new Matrix3().set(1, 0, 0, 0, 1, 0, offset[0], offset[1], 1);\n const rotationMatrix = scratchRotationMatrix.set(\n Math.cos(rotation),\n Math.sin(rotation),\n 0,\n -Math.sin(rotation),\n Math.cos(rotation),\n 0,\n 0,\n 0,\n 1\n );\n const scaleMatrix = scratchScaleMatrix.set(scale[0], 0, 0, 0, scale[1], 0, 0, 0, 1);\n return translationMatrix.multiplyRight(rotationMatrix).multiplyRight(scaleMatrix);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"KHR_texture_transform.js","names":["_core","require","_gltfUtils","_gltfConstants","_gltfScenegraph","_createForOfIteratorHelper","o","allowArrayLike","it","Symbol","iterator","Array","isArray","_unsupportedIterableToArray","length","i","F","s","n","done","value","e","_e","f","TypeError","normalCompletion","didErr","err","call","step","next","_e2","return","minLen","_arrayLikeToArray","Object","prototype","toString","slice","constructor","name","from","test","arr","len","arr2","EXT_MESHOPT_TRANSFORM","exports","scratchVector","Vector3","scratchRotationMatrix","Matrix3","scratchScaleMatrix","decode","_x","_x2","_decode","apply","arguments","_asyncToGenerator2","default","_regenerator","mark","_callee","gltfData","options","_options$gltf","gltfScenegraph","hasExtension","materials","wrap","_callee$","_context","prev","GLTFScenegraph","gltf","loadBuffers","abrupt","json","transformTexCoords","stop","materialIndex","_gltfData$json$materi","_material$pbrMetallic","_material$pbrMetallic2","processedTexCoords","material","baseColorTexture","pbrMetallicRoughness","transformPrimitives","emisiveTexture","emissiveTexture","normalTexture","occlusionTexture","metallicRoughnessTexture","texture","transformParameters","getTransformParameters","meshes","_iterator","_step","mesh","_iterator2","primitives","_step2","primitive","Number","isFinite","transformPrimitive","_texture$extensions","textureInfo","extensions","_texture$texCoord","texCoord","originalTexCoord","_textureInfo$texCoord","isProcessed","findIndex","_ref","_ref2","_slicedToArray2","original","newTexCoord","matrix","makeTransformationMatrix","push","texCoordAccessor","attributes","concat","_gltfData$json$access","accessor","accessors","bufferView","_gltfData$json$buffer","bufferViews","_gltfData$buffers$buf","buffers","buffer","arrayBuffer","bufferByteOffset","byteOffset","_getAccessorArrayType","getAccessorArrayTypeAndLength","ArrayType","bytes","BYTES","componentType","components","COMPONENTS","type","elementAddressScale","byteStride","result","Float32Array","count","uv","set","transformByMatrix3","updateGltf","createAttribute","newTexCoordArray","byteLength","originalAccessor","extensionData","_extensionData$offset","offset","_extensionData$rotati","rotation","_extensionData$scale","scale","translationMatrix","rotationMatrix","Math","cos","sin","scaleMatrix","multiplyRight"],"sources":["../../../../src/lib/extensions/KHR_texture_transform.ts"],"sourcesContent":["/**\n * https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_texture_transform/README.md\n */\n\nimport {Vector3, Matrix3} from '@math.gl/core';\nimport type {GLTFWithBuffers} from '../types/gltf-types';\nimport type {\n GLTFMeshPrimitive,\n GLTFAccessor,\n GLTFBufferView,\n GLTFMaterialNormalTextureInfo,\n GLTFMaterialOcclusionTextureInfo,\n GLTFTextureInfo\n} from '../types/gltf-json-schema';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\n\nimport {getAccessorArrayTypeAndLength} from '../gltf-utils/gltf-utils';\nimport {BYTES, COMPONENTS} from '../gltf-utils/gltf-constants';\nimport {} from '../types/gltf-json-schema';\nimport {GLTFScenegraph} from '../api/gltf-scenegraph';\n\n/** Extension name */\nconst EXT_MESHOPT_TRANSFORM = 'KHR_texture_transform';\n\nexport const name = EXT_MESHOPT_TRANSFORM;\n\nconst scratchVector = new Vector3();\nconst scratchRotationMatrix = new Matrix3();\nconst scratchScaleMatrix = new Matrix3();\n\n/** Extension textureInfo https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_texture_transform#gltf-schema-updates */\ntype TextureInfo = {\n /** The offset of the UV coordinate origin as a factor of the texture dimensions. */\n offset?: [number, number];\n /** Rotate the UVs by this many radians counter-clockwise around the origin. This is equivalent to a similar rotation of the image clockwise. */\n rotation?: number;\n /** The scale factor applied to the components of the UV coordinates. */\n scale?: [number, number];\n /** Overrides the textureInfo texCoord value if supplied, and if this extension is supported. */\n texCoord?: number;\n};\n/** Intersection of all GLTF textures */\ntype CompoundGLTFTextureInfo = GLTFTextureInfo &\n GLTFMaterialNormalTextureInfo &\n GLTFMaterialOcclusionTextureInfo;\n/** Parameters for TEXCOORD transformation */\ntype TransformParameters = {\n /** Original texCoord value https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html#_textureinfo_texcoord */\n originalTexCoord: number;\n /** New texCoord value from extension https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_texture_transform#gltf-schema-updates */\n texCoord: number;\n /** Transformation matrix */\n matrix: Matrix3;\n};\n\n/**\n * The extension entry to process the transformation\n * @param gltfData gltf buffers and json\n * @param options GLTFLoader options\n */\nexport async function decode(gltfData: GLTFWithBuffers, options: GLTFLoaderOptions) {\n const gltfScenegraph = new GLTFScenegraph(gltfData);\n const hasExtension = gltfScenegraph.hasExtension(EXT_MESHOPT_TRANSFORM);\n if (!hasExtension || !options.gltf?.loadBuffers) {\n return;\n }\n const materials = gltfData.json.materials || [];\n for (let i = 0; i < materials.length; i++) {\n transformTexCoords(i, gltfData);\n }\n}\n\n/**\n * Transform TEXCOORD by material\n * @param materialIndex processing material index\n * @param gltfData gltf buffers and json\n */\nfunction transformTexCoords(materialIndex: number, gltfData: GLTFWithBuffers): void {\n // Save processed texCoords in order no to process the same twice\n const processedTexCoords: [number, number][] = [];\n const material = gltfData.json.materials?.[materialIndex];\n const baseColorTexture = material?.pbrMetallicRoughness?.baseColorTexture;\n if (baseColorTexture) {\n transformPrimitives(gltfData, materialIndex, baseColorTexture, processedTexCoords);\n }\n const emisiveTexture = material?.emissiveTexture;\n if (emisiveTexture) {\n transformPrimitives(gltfData, materialIndex, emisiveTexture, processedTexCoords);\n }\n const normalTexture = material?.normalTexture;\n if (normalTexture) {\n transformPrimitives(gltfData, materialIndex, normalTexture, processedTexCoords);\n }\n const occlusionTexture = material?.occlusionTexture;\n if (occlusionTexture) {\n transformPrimitives(gltfData, materialIndex, occlusionTexture, processedTexCoords);\n }\n const metallicRoughnessTexture = material?.pbrMetallicRoughness?.metallicRoughnessTexture;\n if (metallicRoughnessTexture) {\n transformPrimitives(gltfData, materialIndex, metallicRoughnessTexture, processedTexCoords);\n }\n}\n\n/**\n * Transform primitives of the particular material\n * @param gltfData gltf data\n * @param materialIndex primitives with this material will be transformed\n * @param texture texture object\n * @param processedTexCoords storage to save already processed texCoords\n */\nfunction transformPrimitives(\n gltfData: GLTFWithBuffers,\n materialIndex: number,\n texture: CompoundGLTFTextureInfo,\n processedTexCoords: [number, number][]\n) {\n const transformParameters = getTransformParameters(texture, processedTexCoords);\n if (!transformParameters) {\n return;\n }\n const meshes = gltfData.json.meshes || [];\n for (const mesh of meshes) {\n for (const primitive of mesh.primitives) {\n const material = primitive.material;\n if (Number.isFinite(material) && materialIndex === material) {\n transformPrimitive(gltfData, primitive, transformParameters);\n }\n }\n }\n}\n\n/**\n * Get parameters for TEXCOORD transformation\n * @param texture texture object\n * @param processedTexCoords storage to save already processed texCoords\n * @returns texCoord couple and transformation matrix\n */\nfunction getTransformParameters(\n texture: CompoundGLTFTextureInfo,\n processedTexCoords: [number, number][]\n): TransformParameters | null {\n const textureInfo = texture.extensions?.[EXT_MESHOPT_TRANSFORM];\n const {texCoord: originalTexCoord = 0} = texture;\n // If texCoord is not set in the extension, original attribute data will be replaced\n const {texCoord = originalTexCoord} = textureInfo;\n // Make sure that couple [originalTexCoord, extensionTexCoord] is not processed twice\n const isProcessed =\n processedTexCoords.findIndex(\n ([original, newTexCoord]) => original === originalTexCoord && newTexCoord === texCoord\n ) !== -1;\n if (!isProcessed) {\n const matrix = makeTransformationMatrix(textureInfo);\n if (originalTexCoord !== texCoord) {\n texture.texCoord = texCoord;\n }\n processedTexCoords.push([originalTexCoord, texCoord]);\n return {originalTexCoord, texCoord, matrix};\n }\n return null;\n}\n\n/**\n * Transform `TEXCOORD_0` attribute in the primitive\n * @param gltfData gltf data\n * @param primitive primitive object\n * @param transformParameters texCoord couple and transformation matrix\n */\nfunction transformPrimitive(\n gltfData: GLTFWithBuffers,\n primitive: GLTFMeshPrimitive,\n transformParameters: TransformParameters\n) {\n const {originalTexCoord, texCoord, matrix} = transformParameters;\n const texCoordAccessor = primitive.attributes[`TEXCOORD_${originalTexCoord}`];\n if (Number.isFinite(texCoordAccessor)) {\n // Get accessor of the `TEXCOORD_0` attribute\n const accessor = gltfData.json.accessors?.[texCoordAccessor];\n if (accessor && accessor.bufferView) {\n // Get `bufferView` of the `accessor`\n const bufferView = gltfData.json.bufferViews?.[accessor.bufferView];\n if (bufferView) {\n // Get `arrayBuffer` the `bufferView` look at\n const {arrayBuffer, byteOffset: bufferByteOffset} = gltfData.buffers[bufferView.buffer];\n // Resulting byteOffset is sum of the buffer, accessor and bufferView byte offsets\n const byteOffset =\n (bufferByteOffset || 0) + (accessor.byteOffset || 0) + (bufferView.byteOffset || 0);\n // Deduce TypedArray type and its length from `accessor` and `bufferView` data\n const {ArrayType, length} = getAccessorArrayTypeAndLength(accessor, bufferView);\n // Number of bytes each component occupies\n const bytes = BYTES[accessor.componentType];\n // Number of components. For the `TEXCOORD_0` with `VEC2` type, it must return 2\n const components = COMPONENTS[accessor.type];\n // Multiplier to calculate the address of the `TEXCOORD_0` element in the arrayBuffer\n const elementAddressScale = bufferView.byteStride || bytes * components;\n // Data transform to Float32Array\n const result = new Float32Array(length);\n for (let i = 0; i < accessor.count; i++) {\n // Take [u, v] couple from the arrayBuffer\n const uv = new ArrayType(arrayBuffer, byteOffset + i * elementAddressScale, 2);\n // Set and transform Vector3 per https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_texture_transform#overview\n scratchVector.set(uv[0], uv[1], 1);\n scratchVector.transformByMatrix3(matrix);\n // Save result in Float32Array\n result.set([scratchVector[0], scratchVector[1]], i * components);\n }\n // If texCoord the same, replace gltf structural data\n if (originalTexCoord === texCoord) {\n updateGltf(accessor, bufferView, gltfData.buffers, result);\n } else {\n // If texCoord change, create new attribute\n createAttribute(texCoord, accessor, primitive, gltfData, result);\n }\n }\n }\n }\n}\n\n/**\n * Update GLTF structural objects with new data as we create new `Float32Array` for `TEXCOORD_0`.\n * @param accessor accessor to change\n * @param bufferView bufferView to change\n * @param buffers binary buffers\n * @param newTexcoordArray typed array with data after transformation\n */\nfunction updateGltf(\n accessor: GLTFAccessor,\n bufferView: GLTFBufferView,\n buffers: {arrayBuffer: ArrayBuffer; byteOffset: number; byteLength: number}[],\n newTexCoordArray: Float32Array\n): void {\n accessor.componentType = 5126;\n buffers.push({\n arrayBuffer: newTexCoordArray.buffer,\n byteOffset: 0,\n byteLength: newTexCoordArray.buffer.byteLength\n });\n bufferView.buffer = buffers.length - 1;\n bufferView.byteLength = newTexCoordArray.buffer.byteLength;\n bufferView.byteOffset = 0;\n delete bufferView.byteStride;\n}\n\n/**\n *\n * @param newTexCoord new `texCoord` value\n * @param originalAccessor original accessor object, that store data before transformation\n * @param primitive primitive object\n * @param gltfData gltf data\n * @param newTexCoordArray typed array with data after transformation\n * @returns\n */\nfunction createAttribute(\n newTexCoord: number,\n originalAccessor: GLTFAccessor,\n primitive: GLTFMeshPrimitive,\n gltfData: GLTFWithBuffers,\n newTexCoordArray: Float32Array\n) {\n gltfData.buffers.push({\n arrayBuffer: newTexCoordArray.buffer,\n byteOffset: 0,\n byteLength: newTexCoordArray.buffer.byteLength\n });\n const bufferViews = gltfData.json.bufferViews;\n if (!bufferViews) {\n return;\n }\n bufferViews.push({\n buffer: gltfData.buffers.length - 1,\n byteLength: newTexCoordArray.buffer.byteLength,\n byteOffset: 0\n });\n const accessors = gltfData.json.accessors;\n if (!accessors) {\n return;\n }\n accessors.push({\n bufferView: bufferViews?.length - 1,\n byteOffset: 0,\n componentType: 5126,\n count: originalAccessor.count,\n type: 'VEC2'\n });\n primitive.attributes[`TEXCOORD_${newTexCoord}`] = accessors.length - 1;\n}\n\n/**\n * Construct transformation matrix from the extension data (transition, rotation, scale)\n * @param extensionData extension data\n * @returns transformation matrix\n */\nfunction makeTransformationMatrix(extensionData: TextureInfo): Matrix3 {\n const {offset = [0, 0], rotation = 0, scale = [1, 1]} = extensionData;\n const translationMatrix = new Matrix3().set(1, 0, 0, 0, 1, 0, offset[0], offset[1], 1);\n const rotationMatrix = scratchRotationMatrix.set(\n Math.cos(rotation),\n Math.sin(rotation),\n 0,\n -Math.sin(rotation),\n Math.cos(rotation),\n 0,\n 0,\n 0,\n 1\n );\n const scaleMatrix = scratchScaleMatrix.set(scale[0], 0, 0, 0, scale[1], 0, 0, 0, 1);\n return translationMatrix.multiplyRight(rotationMatrix).multiplyRight(scaleMatrix);\n}\n"],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
exports.isGLTF = isGLTF;
|
|
8
8
|
exports.parseGLTF = parseGLTF;
|
|
9
9
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
10
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
10
11
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
11
12
|
var _loaderUtils = require("@loaders.gl/loader-utils");
|
|
12
13
|
var _images = require("@loaders.gl/images");
|
|
@@ -17,6 +18,8 @@ var _resolveUrl = require("../gltf-utils/resolve-url");
|
|
|
17
18
|
var _getTypedArray = require("../gltf-utils/get-typed-array");
|
|
18
19
|
var _gltfExtensions = require("../api/gltf-extensions");
|
|
19
20
|
var _normalizeGltfV = require("../api/normalize-gltf-v1");
|
|
21
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
22
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
20
23
|
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
21
24
|
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
22
25
|
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
@@ -250,12 +253,12 @@ function _loadImage() {
|
|
|
250
253
|
}
|
|
251
254
|
(0, _assert.assert)(arrayBuffer, 'glTF image has no data');
|
|
252
255
|
_context4.next = 14;
|
|
253
|
-
return parse(arrayBuffer, [_images.ImageLoader, _textures.BasisLoader], {
|
|
256
|
+
return parse(arrayBuffer, [_images.ImageLoader, _textures.BasisLoader], _objectSpread(_objectSpread({}, options), {}, {
|
|
254
257
|
mimeType: image.mimeType,
|
|
255
258
|
basis: options.basis || {
|
|
256
259
|
format: (0, _textures.selectSupportedBasisFormat)()
|
|
257
260
|
}
|
|
258
|
-
}, context);
|
|
261
|
+
}), context);
|
|
259
262
|
case 14:
|
|
260
263
|
parsedImage = _context4.sent;
|
|
261
264
|
if (parsedImage && parsedImage[0]) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-gltf.js","names":["_loaderUtils","require","_images","_textures","_assert","_parseGlb","_resolveUrl","_getTypedArray","_gltfExtensions","_normalizeGltfV","_createForOfIteratorHelper","o","allowArrayLike","it","Symbol","iterator","Array","isArray","_unsupportedIterableToArray","length","i","F","s","n","done","value","e","_e","f","TypeError","normalCompletion","didErr","err","call","step","next","_e2","return","minLen","_arrayLikeToArray","Object","prototype","toString","slice","constructor","name","from","test","arr","len","arr2","isGLTF","arrayBuffer","options","byteOffset","isGLB","parseGLTF","_x","_x2","_parseGLTF","apply","arguments","_asyncToGenerator2","default","_regenerator","mark","_callee","gltf","arrayBufferOrString","_options$gltf","_options$gltf2","_options$gltf3","context","_args","wrap","_callee$","_context","prev","undefined","parseGLTFContainerSync","normalizeGLTFV1","normalize","preprocessExtensions","loadBuffers","json","buffers","loadImages","decodeExtensions","abrupt","stop","data","uri","baseUri","ArrayBuffer","textDecoder","TextDecoder","decode","parseJSON","glb","parseGLBSync","assert","type","concat","_glb","fill","header","hasBinChunk","binChunks","byteLength","images","_x3","_x4","_x5","_loadBuffers","_callee2","buffer","_context$fetch","_response$arrayBuffer","fetch","response","_callee2$","_context2","resolveUrl","sent","_x6","_x7","_x8","_loadImages","_callee3","imageIndices","promises","_iterator2","_step2","imageIndex","_callee3$","_context3","getReferencesImageIndices","push","loadImage","Promise","all","Set","textures","_iterator","_step","texture","source","add","sort","_x9","_x10","_x11","_x12","_x13","_loadImage","_callee4","image","index","parse","array","parsedImage","_callee4$","_context4","hasOwnProperty","bufferView","Number","isFinite","getTypedArrayForBufferView","sliceArrayBuffer","ImageLoader","BasisLoader","mimeType","basis","format","selectSupportedBasisFormat","compressed","mipmaps","width","height"],"sources":["../../../../src/lib/parsers/parse-gltf.ts"],"sourcesContent":["/* eslint-disable camelcase, max-statements, no-restricted-globals */\nimport type {LoaderContext} from '@loaders.gl/loader-utils';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\nimport type {GLTFWithBuffers} from '../types/gltf-types';\nimport type {GLB} from '../types/glb-types';\nimport type {ParseGLBOptions} from './parse-glb';\n\nimport {parseJSON, sliceArrayBuffer} from '@loaders.gl/loader-utils';\nimport {ImageLoader} from '@loaders.gl/images';\nimport {BasisLoader, selectSupportedBasisFormat} from '@loaders.gl/textures';\n\nimport {assert} from '../utils/assert';\nimport {isGLB, parseGLBSync} from './parse-glb';\nimport {resolveUrl} from '../gltf-utils/resolve-url';\nimport {getTypedArrayForBufferView} from '../gltf-utils/get-typed-array';\nimport {preprocessExtensions, decodeExtensions} from '../api/gltf-extensions';\nimport {normalizeGLTFV1} from '../api/normalize-gltf-v1';\n\n/** */\nexport type ParseGLTFOptions = ParseGLBOptions & {\n normalize?: boolean;\n loadImages?: boolean;\n loadBuffers?: boolean;\n decompressMeshes?: boolean;\n excludeExtensions?: string[];\n\n /** @deprecated not supported in v4. `postProcessGLTF()` must be called by the application */\n postProcess?: false;\n};\n\n/** Check if an array buffer appears to contain GLTF data */\nexport function isGLTF(arrayBuffer: ArrayBuffer, options?: ParseGLTFOptions): boolean {\n const byteOffset = 0;\n return isGLB(arrayBuffer, byteOffset, options);\n}\n\nexport async function parseGLTF(\n gltf: GLTFWithBuffers,\n arrayBufferOrString,\n byteOffset = 0,\n options: GLTFLoaderOptions,\n context: LoaderContext\n): Promise<GLTFWithBuffers> {\n parseGLTFContainerSync(gltf, arrayBufferOrString, byteOffset, options);\n\n normalizeGLTFV1(gltf, {normalize: options?.gltf?.normalize});\n\n preprocessExtensions(gltf, options, context);\n\n // Load linked buffers asynchronously and decodes base64 buffers in parallel\n if (options?.gltf?.loadBuffers && gltf.json.buffers) {\n await loadBuffers(gltf, options, context);\n }\n\n // loadImages and decodeExtensions should not be running in parallel, because\n // decodeExtensions uses data from images taken during the loadImages call.\n if (options?.gltf?.loadImages) {\n await loadImages(gltf, options, context);\n }\n\n await decodeExtensions(gltf, options, context);\n\n return gltf;\n}\n\n/**\n *\n * @param gltf\n * @param data - can be ArrayBuffer (GLB), ArrayBuffer (Binary JSON), String (JSON), or Object (parsed JSON)\n * @param byteOffset\n * @param options\n */\nfunction parseGLTFContainerSync(gltf, data, byteOffset, options) {\n // Initialize gltf container\n if (options.uri) {\n gltf.baseUri = options.uri;\n }\n\n // If data is binary and starting with magic bytes, assume binary JSON text, convert to string\n if (data instanceof ArrayBuffer && !isGLB(data, byteOffset, options)) {\n const textDecoder = new TextDecoder();\n data = textDecoder.decode(data);\n }\n\n if (typeof data === 'string') {\n // If string, try to parse as JSON\n gltf.json = parseJSON(data);\n } else if (data instanceof ArrayBuffer) {\n // If still ArrayBuffer, parse as GLB container\n const glb: GLB = {} as GLB;\n byteOffset = parseGLBSync(glb, data, byteOffset, options.glb);\n\n assert(glb.type === 'glTF', `Invalid GLB magic string ${glb.type}`);\n\n gltf._glb = glb;\n gltf.json = glb.json;\n } else {\n assert(false, 'GLTF: must be ArrayBuffer or string');\n }\n\n // Populate buffers\n // Create an external buffers array to hold binary data\n const buffers = gltf.json.buffers || [];\n gltf.buffers = new Array(buffers.length).fill(null);\n\n // Populates JSON and some bin chunk info\n if (gltf._glb && gltf._glb.header.hasBinChunk) {\n const {binChunks} = gltf._glb;\n gltf.buffers[0] = {\n arrayBuffer: binChunks[0].arrayBuffer,\n byteOffset: binChunks[0].byteOffset,\n byteLength: binChunks[0].byteLength\n };\n\n // TODO - this modifies JSON and is a post processing thing\n // gltf.json.buffers[0].data = gltf.buffers[0].arrayBuffer;\n // gltf.json.buffers[0].byteOffset = gltf.buffers[0].byteOffset;\n }\n\n // Populate images\n const images = gltf.json.images || [];\n gltf.images = new Array(images.length).fill({});\n}\n\n/** Asynchronously fetch and parse buffers, store in buffers array outside of json\n * TODO - traverse gltf and determine which buffers are actually needed\n */\nasync function loadBuffers(gltf: GLTFWithBuffers, options, context: LoaderContext) {\n // TODO\n const buffers = gltf.json.buffers || [];\n for (let i = 0; i < buffers.length; ++i) {\n const buffer = buffers[i];\n if (buffer.uri) {\n const {fetch} = context;\n assert(fetch);\n\n const uri = resolveUrl(buffer.uri, options);\n const response = await context?.fetch?.(uri);\n const arrayBuffer = await response?.arrayBuffer?.();\n\n gltf.buffers[i] = {\n arrayBuffer,\n byteOffset: 0,\n byteLength: arrayBuffer.byteLength\n };\n\n delete buffer.uri;\n } else if (gltf.buffers[i] === null) {\n gltf.buffers[i] = {\n arrayBuffer: new ArrayBuffer(buffer.byteLength),\n byteOffset: 0,\n byteLength: buffer.byteLength\n };\n }\n }\n}\n\n/**\n * Loads all images\n * TODO - traverse gltf and determine which images are actually needed\n * @param gltf\n * @param options\n * @param context\n * @returns\n */\nasync function loadImages(gltf: GLTFWithBuffers, options, context: LoaderContext) {\n const imageIndices = getReferencesImageIndices(gltf);\n\n const images = gltf.json.images || [];\n\n const promises: Promise<any>[] = [];\n for (const imageIndex of imageIndices) {\n promises.push(loadImage(gltf, images[imageIndex], imageIndex, options, context));\n }\n\n return await Promise.all(promises);\n}\n\n/** Make sure we only load images that are actually referenced by textures */\nfunction getReferencesImageIndices(gltf: GLTFWithBuffers): number[] {\n const imageIndices = new Set<number>();\n\n const textures = gltf.json.textures || [];\n for (const texture of textures) {\n if (texture.source !== undefined) {\n imageIndices.add(texture.source);\n }\n }\n\n return Array.from(imageIndices).sort();\n}\n\n/** Asynchronously fetches and parses one image, store in images array outside of json */\nasync function loadImage(\n gltf: GLTFWithBuffers,\n image,\n index: number,\n options,\n context: LoaderContext\n) {\n const {fetch, parse} = context;\n\n let arrayBuffer;\n\n if (image.uri && !image.hasOwnProperty('bufferView')) {\n const uri = resolveUrl(image.uri, options);\n const response = await fetch(uri);\n arrayBuffer = await response.arrayBuffer();\n image.bufferView = {\n data: arrayBuffer\n };\n }\n\n if (Number.isFinite(image.bufferView)) {\n const array = getTypedArrayForBufferView(gltf.json, gltf.buffers, image.bufferView);\n arrayBuffer = sliceArrayBuffer(array.buffer, array.byteOffset, array.byteLength);\n }\n\n assert(arrayBuffer, 'glTF image has no data');\n\n // Call `parse`\n let parsedImage = await parse(\n arrayBuffer,\n [ImageLoader, BasisLoader],\n {mimeType: image.mimeType, basis: options.basis || {format: selectSupportedBasisFormat()}},\n context\n );\n\n if (parsedImage && parsedImage[0]) {\n parsedImage = {\n compressed: true,\n mipmaps: false,\n width: parsedImage[0].width,\n height: parsedImage[0].height,\n data: parsedImage[0]\n };\n }\n // TODO making sure ImageLoader is overridable by using array of loaders\n // const parsedImage = await parse(arrayBuffer, [ImageLoader]);\n\n // Store the loaded image\n gltf.images = gltf.images || [];\n gltf.images[index] = parsedImage;\n}\n"],"mappings":";;;;;;;;;;AAOA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA;AAEA,IAAAG,OAAA,GAAAH,OAAA;AACA,IAAAI,SAAA,GAAAJ,OAAA;AACA,IAAAK,WAAA,GAAAL,OAAA;AACA,IAAAM,cAAA,GAAAN,OAAA;AACA,IAAAO,eAAA,GAAAP,OAAA;AACA,IAAAQ,eAAA,GAAAR,OAAA;AAAyD,SAAAS,2BAAAC,CAAA,EAAAC,cAAA,QAAAC,EAAA,UAAAC,MAAA,oBAAAH,CAAA,CAAAG,MAAA,CAAAC,QAAA,KAAAJ,CAAA,qBAAAE,EAAA,QAAAG,KAAA,CAAAC,OAAA,CAAAN,CAAA,MAAAE,EAAA,GAAAK,2BAAA,CAAAP,CAAA,MAAAC,cAAA,IAAAD,CAAA,WAAAA,CAAA,CAAAQ,MAAA,qBAAAN,EAAA,EAAAF,CAAA,GAAAE,EAAA,MAAAO,CAAA,UAAAC,CAAA,YAAAA,EAAA,eAAAC,CAAA,EAAAD,CAAA,EAAAE,CAAA,WAAAA,EAAA,QAAAH,CAAA,IAAAT,CAAA,CAAAQ,MAAA,WAAAK,IAAA,mBAAAA,IAAA,SAAAC,KAAA,EAAAd,CAAA,CAAAS,CAAA,UAAAM,CAAA,WAAAA,EAAAC,EAAA,UAAAA,EAAA,KAAAC,CAAA,EAAAP,CAAA,gBAAAQ,SAAA,iJAAAC,gBAAA,SAAAC,MAAA,UAAAC,GAAA,WAAAV,CAAA,WAAAA,EAAA,IAAAT,EAAA,GAAAA,EAAA,CAAAoB,IAAA,CAAAtB,CAAA,MAAAY,CAAA,WAAAA,EAAA,QAAAW,IAAA,GAAArB,EAAA,CAAAsB,IAAA,IAAAL,gBAAA,GAAAI,IAAA,CAAAV,IAAA,SAAAU,IAAA,KAAAR,CAAA,WAAAA,EAAAU,GAAA,IAAAL,MAAA,SAAAC,GAAA,GAAAI,GAAA,KAAAR,CAAA,WAAAA,EAAA,eAAAE,gBAAA,IAAAjB,EAAA,CAAAwB,MAAA,UAAAxB,EAAA,CAAAwB,MAAA,oBAAAN,MAAA,QAAAC,GAAA;AAAA,SAAAd,4BAAAP,CAAA,EAAA2B,MAAA,SAAA3B,CAAA,qBAAAA,CAAA,sBAAA4B,iBAAA,CAAA5B,CAAA,EAAA2B,MAAA,OAAAf,CAAA,GAAAiB,MAAA,CAAAC,SAAA,CAAAC,QAAA,CAAAT,IAAA,CAAAtB,CAAA,EAAAgC,KAAA,aAAApB,CAAA,iBAAAZ,CAAA,CAAAiC,WAAA,EAAArB,CAAA,GAAAZ,CAAA,CAAAiC,WAAA,CAAAC,IAAA,MAAAtB,CAAA,cAAAA,CAAA,mBAAAP,KAAA,CAAA8B,IAAA,CAAAnC,CAAA,OAAAY,CAAA,+DAAAwB,IAAA,CAAAxB,CAAA,UAAAgB,iBAAA,CAAA5B,CAAA,EAAA2B,MAAA;AAAA,SAAAC,kBAAAS,GAAA,EAAAC,GAAA,QAAAA,GAAA,YAAAA,GAAA,GAAAD,GAAA,CAAA7B,MAAA,EAAA8B,GAAA,GAAAD,GAAA,CAAA7B,MAAA,WAAAC,CAAA,MAAA8B,IAAA,OAAAlC,KAAA,CAAAiC,GAAA,GAAA7B,CAAA,GAAA6B,GAAA,EAAA7B,CAAA,IAAA8B,IAAA,CAAA9B,CAAA,IAAA4B,GAAA,CAAA5B,CAAA,UAAA8B,IAAA;AAelD,SAASC,MAAMA,CAACC,WAAwB,EAAEC,OAA0B,EAAW;EACpF,IAAMC,UAAU,GAAG,CAAC;EACpB,OAAO,IAAAC,eAAK,EAACH,WAAW,EAAEE,UAAU,EAAED,OAAO,CAAC;AAChD;AAAC,SAEqBG,SAASA,CAAAC,EAAA,EAAAC,GAAA;EAAA,OAAAC,UAAA,CAAAC,KAAA,OAAAC,SAAA;AAAA;AAAA,SAAAF,WAAA;EAAAA,UAAA,OAAAG,kBAAA,CAAAC,OAAA,EAAAC,YAAA,CAAAD,OAAA,CAAAE,IAAA,CAAxB,SAAAC,QACLC,IAAqB,EACrBC,mBAAmB;IAAA,IAAAC,aAAA,EAAAC,cAAA,EAAAC,cAAA;IAAA,IAAAjB,UAAA;MAAAD,OAAA;MAAAmB,OAAA;MAAAC,KAAA,GAAAZ,SAAA;IAAA,OAAAG,YAAA,CAAAD,OAAA,CAAAW,IAAA,UAAAC,SAAAC,QAAA;MAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAzC,IAAA;QAAA;UACnBmB,UAAU,GAAAmB,KAAA,CAAAtD,MAAA,QAAAsD,KAAA,QAAAK,SAAA,GAAAL,KAAA,MAAG,CAAC;UACdpB,OAA0B,GAAAoB,KAAA,CAAAtD,MAAA,OAAAsD,KAAA,MAAAK,SAAA;UAC1BN,OAAsB,GAAAC,KAAA,CAAAtD,MAAA,OAAAsD,KAAA,MAAAK,SAAA;UAEtBC,sBAAsB,CAACZ,IAAI,EAAEC,mBAAmB,EAAEd,UAAU,EAAED,OAAO,CAAC;UAEtE,IAAA2B,+BAAe,EAACb,IAAI,EAAE;YAACc,SAAS,EAAE5B,OAAO,aAAPA,OAAO,wBAAAgB,aAAA,GAAPhB,OAAO,CAAEc,IAAI,cAAAE,aAAA,uBAAbA,aAAA,CAAeY;UAAS,CAAC,CAAC;UAE5D,IAAAC,oCAAoB,EAACf,IAAI,EAAEd,OAAO,EAAEmB,OAAO,CAAC;UAAC,MAGzCnB,OAAO,aAAPA,OAAO,gBAAAiB,cAAA,GAAPjB,OAAO,CAAEc,IAAI,cAAAG,cAAA,eAAbA,cAAA,CAAea,WAAW,IAAIhB,IAAI,CAACiB,IAAI,CAACC,OAAO;YAAAT,QAAA,CAAAzC,IAAA;YAAA;UAAA;UAAAyC,QAAA,CAAAzC,IAAA;UAAA,OAC3CgD,WAAW,CAAChB,IAAI,EAAEd,OAAO,EAAEmB,OAAO,CAAC;QAAA;UAAA,MAKvCnB,OAAO,aAAPA,OAAO,gBAAAkB,cAAA,GAAPlB,OAAO,CAAEc,IAAI,cAAAI,cAAA,eAAbA,cAAA,CAAee,UAAU;YAAAV,QAAA,CAAAzC,IAAA;YAAA;UAAA;UAAAyC,QAAA,CAAAzC,IAAA;UAAA,OACrBmD,UAAU,CAACnB,IAAI,EAAEd,OAAO,EAAEmB,OAAO,CAAC;QAAA;UAAAI,QAAA,CAAAzC,IAAA;UAAA,OAGpC,IAAAoD,gCAAgB,EAACpB,IAAI,EAAEd,OAAO,EAAEmB,OAAO,CAAC;QAAA;UAAA,OAAAI,QAAA,CAAAY,MAAA,WAEvCrB,IAAI;QAAA;QAAA;UAAA,OAAAS,QAAA,CAAAa,IAAA;MAAA;IAAA,GAAAvB,OAAA;EAAA,CACZ;EAAA,OAAAP,UAAA,CAAAC,KAAA,OAAAC,SAAA;AAAA;AASD,SAASkB,sBAAsBA,CAACZ,IAAI,EAAEuB,IAAI,EAAEpC,UAAU,EAAED,OAAO,EAAE;EAE/D,IAAIA,OAAO,CAACsC,GAAG,EAAE;IACfxB,IAAI,CAACyB,OAAO,GAAGvC,OAAO,CAACsC,GAAG;EAC5B;EAGA,IAAID,IAAI,YAAYG,WAAW,IAAI,CAAC,IAAAtC,eAAK,EAACmC,IAAI,EAAEpC,UAAU,EAAED,OAAO,CAAC,EAAE;IACpE,IAAMyC,WAAW,GAAG,IAAIC,WAAW,CAAC,CAAC;IACrCL,IAAI,GAAGI,WAAW,CAACE,MAAM,CAACN,IAAI,CAAC;EACjC;EAEA,IAAI,OAAOA,IAAI,KAAK,QAAQ,EAAE;IAE5BvB,IAAI,CAACiB,IAAI,GAAG,IAAAa,sBAAS,EAACP,IAAI,CAAC;EAC7B,CAAC,MAAM,IAAIA,IAAI,YAAYG,WAAW,EAAE;IAEtC,IAAMK,GAAQ,GAAG,CAAC,CAAQ;IAC1B5C,UAAU,GAAG,IAAA6C,sBAAY,EAACD,GAAG,EAAER,IAAI,EAAEpC,UAAU,EAAED,OAAO,CAAC6C,GAAG,CAAC;IAE7D,IAAAE,cAAM,EAACF,GAAG,CAACG,IAAI,KAAK,MAAM,8BAAAC,MAAA,CAA8BJ,GAAG,CAACG,IAAI,CAAE,CAAC;IAEnElC,IAAI,CAACoC,IAAI,GAAGL,GAAG;IACf/B,IAAI,CAACiB,IAAI,GAAGc,GAAG,CAACd,IAAI;EACtB,CAAC,MAAM;IACL,IAAAgB,cAAM,EAAC,KAAK,EAAE,qCAAqC,CAAC;EACtD;EAIA,IAAMf,OAAO,GAAGlB,IAAI,CAACiB,IAAI,CAACC,OAAO,IAAI,EAAE;EACvClB,IAAI,CAACkB,OAAO,GAAG,IAAIrE,KAAK,CAACqE,OAAO,CAAClE,MAAM,CAAC,CAACqF,IAAI,CAAC,IAAI,CAAC;EAGnD,IAAIrC,IAAI,CAACoC,IAAI,IAAIpC,IAAI,CAACoC,IAAI,CAACE,MAAM,CAACC,WAAW,EAAE;IAC7C,IAAOC,SAAS,GAAIxC,IAAI,CAACoC,IAAI,CAAtBI,SAAS;IAChBxC,IAAI,CAACkB,OAAO,CAAC,CAAC,CAAC,GAAG;MAChBjC,WAAW,EAAEuD,SAAS,CAAC,CAAC,CAAC,CAACvD,WAAW;MACrCE,UAAU,EAAEqD,SAAS,CAAC,CAAC,CAAC,CAACrD,UAAU;MACnCsD,UAAU,EAAED,SAAS,CAAC,CAAC,CAAC,CAACC;IAC3B,CAAC;EAKH;EAGA,IAAMC,MAAM,GAAG1C,IAAI,CAACiB,IAAI,CAACyB,MAAM,IAAI,EAAE;EACrC1C,IAAI,CAAC0C,MAAM,GAAG,IAAI7F,KAAK,CAAC6F,MAAM,CAAC1F,MAAM,CAAC,CAACqF,IAAI,CAAC,CAAC,CAAC,CAAC;AACjD;AAAC,SAKcrB,WAAWA,CAAA2B,GAAA,EAAAC,GAAA,EAAAC,GAAA;EAAA,OAAAC,YAAA,CAAArD,KAAA,OAAAC,SAAA;AAAA;AAAA,SAAAoD,aAAA;EAAAA,YAAA,OAAAnD,kBAAA,CAAAC,OAAA,EAAAC,YAAA,CAAAD,OAAA,CAAAE,IAAA,CAA1B,SAAAiD,SAA2B/C,IAAqB,EAAEd,OAAO,EAAEmB,OAAsB;IAAA,IAAAa,OAAA,EAAAjE,CAAA,EAAA+F,MAAA,EAAAC,cAAA,EAAAC,qBAAA,EAAAC,KAAA,EAAA3B,GAAA,EAAA4B,QAAA,EAAAnE,WAAA;IAAA,OAAAY,YAAA,CAAAD,OAAA,CAAAW,IAAA,UAAA8C,UAAAC,SAAA;MAAA,kBAAAA,SAAA,CAAA5C,IAAA,GAAA4C,SAAA,CAAAtF,IAAA;QAAA;UAEzEkD,OAAO,GAAGlB,IAAI,CAACiB,IAAI,CAACC,OAAO,IAAI,EAAE;UAC9BjE,CAAC,GAAG,CAAC;QAAA;UAAA,MAAEA,CAAC,GAAGiE,OAAO,CAAClE,MAAM;YAAAsG,SAAA,CAAAtF,IAAA;YAAA;UAAA;UAC1BgF,MAAM,GAAG9B,OAAO,CAACjE,CAAC,CAAC;UAAA,KACrB+F,MAAM,CAACxB,GAAG;YAAA8B,SAAA,CAAAtF,IAAA;YAAA;UAAA;UACLmF,KAAK,GAAI9C,OAAO,CAAhB8C,KAAK;UACZ,IAAAlB,cAAM,EAACkB,KAAK,CAAC;UAEP3B,GAAG,GAAG,IAAA+B,sBAAU,EAACP,MAAM,CAACxB,GAAG,EAAEtC,OAAO,CAAC;UAAAoE,SAAA,CAAAtF,IAAA;UAAA,OACpBqC,OAAO,aAAPA,OAAO,wBAAA4C,cAAA,GAAP5C,OAAO,CAAE8C,KAAK,cAAAF,cAAA,uBAAdA,cAAA,CAAAnF,IAAA,CAAAuC,OAAO,EAAUmB,GAAG,CAAC;QAAA;UAAtC4B,QAAQ,GAAAE,SAAA,CAAAE,IAAA;UAAAF,SAAA,CAAAtF,IAAA;UAAA,OACYoF,QAAQ,aAARA,QAAQ,wBAAAF,qBAAA,GAARE,QAAQ,CAAEnE,WAAW,cAAAiE,qBAAA,uBAArBA,qBAAA,CAAApF,IAAA,CAAAsF,QAAwB,CAAC;QAAA;UAA7CnE,WAAW,GAAAqE,SAAA,CAAAE,IAAA;UAEjBxD,IAAI,CAACkB,OAAO,CAACjE,CAAC,CAAC,GAAG;YAChBgC,WAAW,EAAXA,WAAW;YACXE,UAAU,EAAE,CAAC;YACbsD,UAAU,EAAExD,WAAW,CAACwD;UAC1B,CAAC;UAED,OAAOO,MAAM,CAACxB,GAAG;UAAC8B,SAAA,CAAAtF,IAAA;UAAA;QAAA;UACb,IAAIgC,IAAI,CAACkB,OAAO,CAACjE,CAAC,CAAC,KAAK,IAAI,EAAE;YACnC+C,IAAI,CAACkB,OAAO,CAACjE,CAAC,CAAC,GAAG;cAChBgC,WAAW,EAAE,IAAIyC,WAAW,CAACsB,MAAM,CAACP,UAAU,CAAC;cAC/CtD,UAAU,EAAE,CAAC;cACbsD,UAAU,EAAEO,MAAM,CAACP;YACrB,CAAC;UACH;QAAC;UAvBiC,EAAExF,CAAC;UAAAqG,SAAA,CAAAtF,IAAA;UAAA;QAAA;QAAA;UAAA,OAAAsF,SAAA,CAAAhC,IAAA;MAAA;IAAA,GAAAyB,QAAA;EAAA,CAyBxC;EAAA,OAAAD,YAAA,CAAArD,KAAA,OAAAC,SAAA;AAAA;AAAA,SAUcyB,UAAUA,CAAAsC,GAAA,EAAAC,GAAA,EAAAC,GAAA;EAAA,OAAAC,WAAA,CAAAnE,KAAA,OAAAC,SAAA;AAAA;AAAA,SAAAkE,YAAA;EAAAA,WAAA,OAAAjE,kBAAA,CAAAC,OAAA,EAAAC,YAAA,CAAAD,OAAA,CAAAE,IAAA,CAAzB,SAAA+D,SAA0B7D,IAAqB,EAAEd,OAAO,EAAEmB,OAAsB;IAAA,IAAAyD,YAAA,EAAApB,MAAA,EAAAqB,QAAA,EAAAC,UAAA,EAAAC,MAAA,EAAAC,UAAA;IAAA,OAAArE,YAAA,CAAAD,OAAA,CAAAW,IAAA,UAAA4D,UAAAC,SAAA;MAAA,kBAAAA,SAAA,CAAA1D,IAAA,GAAA0D,SAAA,CAAApG,IAAA;QAAA;UACxE8F,YAAY,GAAGO,yBAAyB,CAACrE,IAAI,CAAC;UAE9C0C,MAAM,GAAG1C,IAAI,CAACiB,IAAI,CAACyB,MAAM,IAAI,EAAE;UAE/BqB,QAAwB,GAAG,EAAE;UAAAC,UAAA,GAAAzH,0BAAA,CACVuH,YAAY;UAAA;YAArC,KAAAE,UAAA,CAAA7G,CAAA,MAAA8G,MAAA,GAAAD,UAAA,CAAA5G,CAAA,IAAAC,IAAA,GAAuC;cAA5B6G,UAAU,GAAAD,MAAA,CAAA3G,KAAA;cACnByG,QAAQ,CAACO,IAAI,CAACC,SAAS,CAACvE,IAAI,EAAE0C,MAAM,CAACwB,UAAU,CAAC,EAAEA,UAAU,EAAEhF,OAAO,EAAEmB,OAAO,CAAC,CAAC;YAClF;UAAC,SAAAxC,GAAA;YAAAmG,UAAA,CAAAzG,CAAA,CAAAM,GAAA;UAAA;YAAAmG,UAAA,CAAAvG,CAAA;UAAA;UAAA2G,SAAA,CAAApG,IAAA;UAAA,OAEYwG,OAAO,CAACC,GAAG,CAACV,QAAQ,CAAC;QAAA;UAAA,OAAAK,SAAA,CAAA/C,MAAA,WAAA+C,SAAA,CAAAZ,IAAA;QAAA;QAAA;UAAA,OAAAY,SAAA,CAAA9C,IAAA;MAAA;IAAA,GAAAuC,QAAA;EAAA,CACnC;EAAA,OAAAD,WAAA,CAAAnE,KAAA,OAAAC,SAAA;AAAA;AAGD,SAAS2E,yBAAyBA,CAACrE,IAAqB,EAAY;EAClE,IAAM8D,YAAY,GAAG,IAAIY,GAAG,CAAS,CAAC;EAEtC,IAAMC,QAAQ,GAAG3E,IAAI,CAACiB,IAAI,CAAC0D,QAAQ,IAAI,EAAE;EAAC,IAAAC,SAAA,GAAArI,0BAAA,CACpBoI,QAAQ;IAAAE,KAAA;EAAA;IAA9B,KAAAD,SAAA,CAAAzH,CAAA,MAAA0H,KAAA,GAAAD,SAAA,CAAAxH,CAAA,IAAAC,IAAA,GAAgC;MAAA,IAArByH,OAAO,GAAAD,KAAA,CAAAvH,KAAA;MAChB,IAAIwH,OAAO,CAACC,MAAM,KAAKpE,SAAS,EAAE;QAChCmD,YAAY,CAACkB,GAAG,CAACF,OAAO,CAACC,MAAM,CAAC;MAClC;IACF;EAAC,SAAAlH,GAAA;IAAA+G,SAAA,CAAArH,CAAA,CAAAM,GAAA;EAAA;IAAA+G,SAAA,CAAAnH,CAAA;EAAA;EAED,OAAOZ,KAAK,CAAC8B,IAAI,CAACmF,YAAY,CAAC,CAACmB,IAAI,CAAC,CAAC;AACxC;AAAC,SAGcV,SAASA,CAAAW,GAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA;EAAA,OAAAC,UAAA,CAAA9F,KAAA,OAAAC,SAAA;AAAA;AAAA,SAAA6F,WAAA;EAAAA,UAAA,OAAA5F,kBAAA,CAAAC,OAAA,EAAAC,YAAA,CAAAD,OAAA,CAAAE,IAAA,CAAxB,SAAA0F,SACExF,IAAqB,EACrByF,KAAK,EACLC,KAAa,EACbxG,OAAO,EACPmB,OAAsB;IAAA,IAAA8C,KAAA,EAAAwC,KAAA,EAAA1G,WAAA,EAAAuC,GAAA,EAAA4B,QAAA,EAAAwC,KAAA,EAAAC,WAAA;IAAA,OAAAhG,YAAA,CAAAD,OAAA,CAAAW,IAAA,UAAAuF,UAAAC,SAAA;MAAA,kBAAAA,SAAA,CAAArF,IAAA,GAAAqF,SAAA,CAAA/H,IAAA;QAAA;UAEfmF,KAAK,GAAW9C,OAAO,CAAvB8C,KAAK,EAAEwC,KAAK,GAAItF,OAAO,CAAhBsF,KAAK;UAAA,MAIfF,KAAK,CAACjE,GAAG,IAAI,CAACiE,KAAK,CAACO,cAAc,CAAC,YAAY,CAAC;YAAAD,SAAA,CAAA/H,IAAA;YAAA;UAAA;UAC5CwD,GAAG,GAAG,IAAA+B,sBAAU,EAACkC,KAAK,CAACjE,GAAG,EAAEtC,OAAO,CAAC;UAAA6G,SAAA,CAAA/H,IAAA;UAAA,OACnBmF,KAAK,CAAC3B,GAAG,CAAC;QAAA;UAA3B4B,QAAQ,GAAA2C,SAAA,CAAAvC,IAAA;UAAAuC,SAAA,CAAA/H,IAAA;UAAA,OACMoF,QAAQ,CAACnE,WAAW,CAAC,CAAC;QAAA;UAA1CA,WAAW,GAAA8G,SAAA,CAAAvC,IAAA;UACXiC,KAAK,CAACQ,UAAU,GAAG;YACjB1E,IAAI,EAAEtC;UACR,CAAC;QAAC;UAGJ,IAAIiH,MAAM,CAACC,QAAQ,CAACV,KAAK,CAACQ,UAAU,CAAC,EAAE;YAC/BL,KAAK,GAAG,IAAAQ,yCAA0B,EAACpG,IAAI,CAACiB,IAAI,EAAEjB,IAAI,CAACkB,OAAO,EAAEuE,KAAK,CAACQ,UAAU,CAAC;YACnFhH,WAAW,GAAG,IAAAoH,6BAAgB,EAACT,KAAK,CAAC5C,MAAM,EAAE4C,KAAK,CAACzG,UAAU,EAAEyG,KAAK,CAACnD,UAAU,CAAC;UAClF;UAEA,IAAAR,cAAM,EAAChD,WAAW,EAAE,wBAAwB,CAAC;UAAC8G,SAAA,CAAA/H,IAAA;UAAA,OAGtB2H,KAAK,CAC3B1G,WAAW,EACX,CAACqH,mBAAW,EAAEC,qBAAW,CAAC,EAC1B;YAACC,QAAQ,EAAEf,KAAK,CAACe,QAAQ;YAAEC,KAAK,EAAEvH,OAAO,CAACuH,KAAK,IAAI;cAACC,MAAM,EAAE,IAAAC,oCAA0B,EAAC;YAAC;UAAC,CAAC,EAC1FtG,OACF,CAAC;QAAA;UALGwF,WAAW,GAAAE,SAAA,CAAAvC,IAAA;UAOf,IAAIqC,WAAW,IAAIA,WAAW,CAAC,CAAC,CAAC,EAAE;YACjCA,WAAW,GAAG;cACZe,UAAU,EAAE,IAAI;cAChBC,OAAO,EAAE,KAAK;cACdC,KAAK,EAAEjB,WAAW,CAAC,CAAC,CAAC,CAACiB,KAAK;cAC3BC,MAAM,EAAElB,WAAW,CAAC,CAAC,CAAC,CAACkB,MAAM;cAC7BxF,IAAI,EAAEsE,WAAW,CAAC,CAAC;YACrB,CAAC;UACH;UAKA7F,IAAI,CAAC0C,MAAM,GAAG1C,IAAI,CAAC0C,MAAM,IAAI,EAAE;UAC/B1C,IAAI,CAAC0C,MAAM,CAACgD,KAAK,CAAC,GAAGG,WAAW;QAAC;QAAA;UAAA,OAAAE,SAAA,CAAAzE,IAAA;MAAA;IAAA,GAAAkE,QAAA;EAAA,CAClC;EAAA,OAAAD,UAAA,CAAA9F,KAAA,OAAAC,SAAA;AAAA"}
|
|
1
|
+
{"version":3,"file":"parse-gltf.js","names":["_loaderUtils","require","_images","_textures","_assert","_parseGlb","_resolveUrl","_getTypedArray","_gltfExtensions","_normalizeGltfV","ownKeys","object","enumerableOnly","keys","Object","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","target","i","arguments","length","source","forEach","key","_defineProperty2","default","getOwnPropertyDescriptors","defineProperties","defineProperty","_createForOfIteratorHelper","o","allowArrayLike","it","Symbol","iterator","Array","isArray","_unsupportedIterableToArray","F","s","n","done","value","e","_e","f","TypeError","normalCompletion","didErr","err","call","step","next","_e2","return","minLen","_arrayLikeToArray","prototype","toString","slice","constructor","name","from","test","arr","len","arr2","isGLTF","arrayBuffer","options","byteOffset","isGLB","parseGLTF","_x","_x2","_parseGLTF","_asyncToGenerator2","_regenerator","mark","_callee","gltf","arrayBufferOrString","_options$gltf","_options$gltf2","_options$gltf3","context","_args","wrap","_callee$","_context","prev","undefined","parseGLTFContainerSync","normalizeGLTFV1","normalize","preprocessExtensions","loadBuffers","json","buffers","loadImages","decodeExtensions","abrupt","stop","data","uri","baseUri","ArrayBuffer","textDecoder","TextDecoder","decode","parseJSON","glb","parseGLBSync","assert","type","concat","_glb","fill","header","hasBinChunk","binChunks","byteLength","images","_x3","_x4","_x5","_loadBuffers","_callee2","buffer","_context$fetch","_response$arrayBuffer","fetch","response","_callee2$","_context2","resolveUrl","sent","_x6","_x7","_x8","_loadImages","_callee3","imageIndices","promises","_iterator2","_step2","imageIndex","_callee3$","_context3","getReferencesImageIndices","loadImage","Promise","all","Set","textures","_iterator","_step","texture","add","sort","_x9","_x10","_x11","_x12","_x13","_loadImage","_callee4","image","index","parse","array","parsedImage","_callee4$","_context4","hasOwnProperty","bufferView","Number","isFinite","getTypedArrayForBufferView","sliceArrayBuffer","ImageLoader","BasisLoader","mimeType","basis","format","selectSupportedBasisFormat","compressed","mipmaps","width","height"],"sources":["../../../../src/lib/parsers/parse-gltf.ts"],"sourcesContent":["/* eslint-disable camelcase, max-statements, no-restricted-globals */\nimport type {LoaderContext} from '@loaders.gl/loader-utils';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\nimport type {GLTFWithBuffers} from '../types/gltf-types';\nimport type {GLB} from '../types/glb-types';\nimport type {ParseGLBOptions} from './parse-glb';\n\nimport {parseJSON, sliceArrayBuffer} from '@loaders.gl/loader-utils';\nimport {ImageLoader} from '@loaders.gl/images';\nimport {BasisLoader, selectSupportedBasisFormat} from '@loaders.gl/textures';\n\nimport {assert} from '../utils/assert';\nimport {isGLB, parseGLBSync} from './parse-glb';\nimport {resolveUrl} from '../gltf-utils/resolve-url';\nimport {getTypedArrayForBufferView} from '../gltf-utils/get-typed-array';\nimport {preprocessExtensions, decodeExtensions} from '../api/gltf-extensions';\nimport {normalizeGLTFV1} from '../api/normalize-gltf-v1';\n\n/** */\nexport type ParseGLTFOptions = ParseGLBOptions & {\n normalize?: boolean;\n loadImages?: boolean;\n loadBuffers?: boolean;\n decompressMeshes?: boolean;\n excludeExtensions?: string[];\n\n /** @deprecated not supported in v4. `postProcessGLTF()` must be called by the application */\n postProcess?: false;\n};\n\n/** Check if an array buffer appears to contain GLTF data */\nexport function isGLTF(arrayBuffer: ArrayBuffer, options?: ParseGLTFOptions): boolean {\n const byteOffset = 0;\n return isGLB(arrayBuffer, byteOffset, options);\n}\n\nexport async function parseGLTF(\n gltf: GLTFWithBuffers,\n arrayBufferOrString,\n byteOffset = 0,\n options: GLTFLoaderOptions,\n context: LoaderContext\n): Promise<GLTFWithBuffers> {\n parseGLTFContainerSync(gltf, arrayBufferOrString, byteOffset, options);\n\n normalizeGLTFV1(gltf, {normalize: options?.gltf?.normalize});\n\n preprocessExtensions(gltf, options, context);\n\n // Load linked buffers asynchronously and decodes base64 buffers in parallel\n if (options?.gltf?.loadBuffers && gltf.json.buffers) {\n await loadBuffers(gltf, options, context);\n }\n\n // loadImages and decodeExtensions should not be running in parallel, because\n // decodeExtensions uses data from images taken during the loadImages call.\n if (options?.gltf?.loadImages) {\n await loadImages(gltf, options, context);\n }\n\n await decodeExtensions(gltf, options, context);\n\n return gltf;\n}\n\n/**\n *\n * @param gltf\n * @param data - can be ArrayBuffer (GLB), ArrayBuffer (Binary JSON), String (JSON), or Object (parsed JSON)\n * @param byteOffset\n * @param options\n */\nfunction parseGLTFContainerSync(gltf, data, byteOffset, options) {\n // Initialize gltf container\n if (options.uri) {\n gltf.baseUri = options.uri;\n }\n\n // If data is binary and starting with magic bytes, assume binary JSON text, convert to string\n if (data instanceof ArrayBuffer && !isGLB(data, byteOffset, options)) {\n const textDecoder = new TextDecoder();\n data = textDecoder.decode(data);\n }\n\n if (typeof data === 'string') {\n // If string, try to parse as JSON\n gltf.json = parseJSON(data);\n } else if (data instanceof ArrayBuffer) {\n // If still ArrayBuffer, parse as GLB container\n const glb: GLB = {} as GLB;\n byteOffset = parseGLBSync(glb, data, byteOffset, options.glb);\n\n assert(glb.type === 'glTF', `Invalid GLB magic string ${glb.type}`);\n\n gltf._glb = glb;\n gltf.json = glb.json;\n } else {\n assert(false, 'GLTF: must be ArrayBuffer or string');\n }\n\n // Populate buffers\n // Create an external buffers array to hold binary data\n const buffers = gltf.json.buffers || [];\n gltf.buffers = new Array(buffers.length).fill(null);\n\n // Populates JSON and some bin chunk info\n if (gltf._glb && gltf._glb.header.hasBinChunk) {\n const {binChunks} = gltf._glb;\n gltf.buffers[0] = {\n arrayBuffer: binChunks[0].arrayBuffer,\n byteOffset: binChunks[0].byteOffset,\n byteLength: binChunks[0].byteLength\n };\n\n // TODO - this modifies JSON and is a post processing thing\n // gltf.json.buffers[0].data = gltf.buffers[0].arrayBuffer;\n // gltf.json.buffers[0].byteOffset = gltf.buffers[0].byteOffset;\n }\n\n // Populate images\n const images = gltf.json.images || [];\n gltf.images = new Array(images.length).fill({});\n}\n\n/** Asynchronously fetch and parse buffers, store in buffers array outside of json\n * TODO - traverse gltf and determine which buffers are actually needed\n */\nasync function loadBuffers(gltf: GLTFWithBuffers, options, context: LoaderContext) {\n // TODO\n const buffers = gltf.json.buffers || [];\n for (let i = 0; i < buffers.length; ++i) {\n const buffer = buffers[i];\n if (buffer.uri) {\n const {fetch} = context;\n assert(fetch);\n\n const uri = resolveUrl(buffer.uri, options);\n const response = await context?.fetch?.(uri);\n const arrayBuffer = await response?.arrayBuffer?.();\n\n gltf.buffers[i] = {\n arrayBuffer,\n byteOffset: 0,\n byteLength: arrayBuffer.byteLength\n };\n\n delete buffer.uri;\n } else if (gltf.buffers[i] === null) {\n gltf.buffers[i] = {\n arrayBuffer: new ArrayBuffer(buffer.byteLength),\n byteOffset: 0,\n byteLength: buffer.byteLength\n };\n }\n }\n}\n\n/**\n * Loads all images\n * TODO - traverse gltf and determine which images are actually needed\n * @param gltf\n * @param options\n * @param context\n * @returns\n */\nasync function loadImages(gltf: GLTFWithBuffers, options, context: LoaderContext) {\n const imageIndices = getReferencesImageIndices(gltf);\n\n const images = gltf.json.images || [];\n\n const promises: Promise<any>[] = [];\n for (const imageIndex of imageIndices) {\n promises.push(loadImage(gltf, images[imageIndex], imageIndex, options, context));\n }\n\n return await Promise.all(promises);\n}\n\n/** Make sure we only load images that are actually referenced by textures */\nfunction getReferencesImageIndices(gltf: GLTFWithBuffers): number[] {\n const imageIndices = new Set<number>();\n\n const textures = gltf.json.textures || [];\n for (const texture of textures) {\n if (texture.source !== undefined) {\n imageIndices.add(texture.source);\n }\n }\n\n return Array.from(imageIndices).sort();\n}\n\n/** Asynchronously fetches and parses one image, store in images array outside of json */\nasync function loadImage(\n gltf: GLTFWithBuffers,\n image,\n index: number,\n options,\n context: LoaderContext\n) {\n const {fetch, parse} = context;\n\n let arrayBuffer;\n\n if (image.uri && !image.hasOwnProperty('bufferView')) {\n const uri = resolveUrl(image.uri, options);\n const response = await fetch(uri);\n arrayBuffer = await response.arrayBuffer();\n image.bufferView = {\n data: arrayBuffer\n };\n }\n\n if (Number.isFinite(image.bufferView)) {\n const array = getTypedArrayForBufferView(gltf.json, gltf.buffers, image.bufferView);\n arrayBuffer = sliceArrayBuffer(array.buffer, array.byteOffset, array.byteLength);\n }\n\n assert(arrayBuffer, 'glTF image has no data');\n\n // Call `parse`\n let parsedImage = await parse(\n arrayBuffer,\n [ImageLoader, BasisLoader],\n {\n ...options,\n mimeType: image.mimeType,\n basis: options.basis || {format: selectSupportedBasisFormat()}\n },\n context\n );\n\n if (parsedImage && parsedImage[0]) {\n parsedImage = {\n compressed: true,\n mipmaps: false,\n width: parsedImage[0].width,\n height: parsedImage[0].height,\n data: parsedImage[0]\n };\n }\n // TODO making sure ImageLoader is overridable by using array of loaders\n // const parsedImage = await parse(arrayBuffer, [ImageLoader]);\n\n // Store the loaded image\n gltf.images = gltf.images || [];\n gltf.images[index] = parsedImage;\n}\n"],"mappings":"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"}
|
|
@@ -4,6 +4,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.VERSION = void 0;
|
|
7
|
-
var VERSION = typeof "4.0.0-alpha.
|
|
7
|
+
var VERSION = typeof "4.0.0-alpha.19" !== 'undefined' ? "4.0.0-alpha.19" : 'latest';
|
|
8
8
|
exports.VERSION = VERSION;
|
|
9
9
|
//# sourceMappingURL=version.js.map
|
|
@@ -7,9 +7,9 @@ const DEFAULT_MESHOPT_OPTIONS = {
|
|
|
7
7
|
const EXT_MESHOPT_COMPRESSION = 'EXT_meshopt_compression';
|
|
8
8
|
export const name = EXT_MESHOPT_COMPRESSION;
|
|
9
9
|
export async function decode(gltfData, options) {
|
|
10
|
-
var _options$gltf;
|
|
10
|
+
var _options$gltf, _options$gltf2;
|
|
11
11
|
const scenegraph = new GLTFScenegraph(gltfData);
|
|
12
|
-
if (!(options !== null && options !== void 0 && (_options$gltf = options.gltf) !== null && _options$gltf !== void 0 && _options$gltf.decompressMeshes)) {
|
|
12
|
+
if (!(options !== null && options !== void 0 && (_options$gltf = options.gltf) !== null && _options$gltf !== void 0 && _options$gltf.decompressMeshes) || !((_options$gltf2 = options.gltf) !== null && _options$gltf2 !== void 0 && _options$gltf2.loadBuffers)) {
|
|
13
13
|
return;
|
|
14
14
|
}
|
|
15
15
|
const promises = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EXT_meshopt_compression.js","names":["GLTFScenegraph","meshoptDecodeGltfBuffer","DEFAULT_MESHOPT_OPTIONS","byteOffset","filter","EXT_MESHOPT_COMPRESSION","name","decode","gltfData","options","_options$gltf","scenegraph","gltf","decompressMeshes","promises","bufferViewIndex","json","bufferViews","push","decodeMeshoptBufferView","Promise","all","removeExtension","bufferView","meshoptExtension","getObjectExtension","byteLength","byteStride","count","mode","buffer","bufferIndex","buffers","source","Uint8Array","arrayBuffer","result","removeObjectExtension"],"sources":["../../../../src/lib/extensions/EXT_meshopt_compression.ts"],"sourcesContent":["/* eslint-disable camelcase */\nimport type {GLTF, GLTFBufferView, GLTF_EXT_meshopt_compression} from '../types/gltf-json-schema';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\nimport {GLTFScenegraph} from '../api/gltf-scenegraph';\nimport {meshoptDecodeGltfBuffer} from '../../meshopt/meshopt-decoder';\n\n// @ts-ignore\n// eslint-disable-next-line\nconst DEFAULT_MESHOPT_OPTIONS = {\n byteOffset: 0,\n filter: 'NONE'\n};\n\n/** Extension name */\nconst EXT_MESHOPT_COMPRESSION = 'EXT_meshopt_compression';\n\nexport const name = EXT_MESHOPT_COMPRESSION;\n\nexport async function decode(gltfData: {json: GLTF}, options: GLTFLoaderOptions) {\n const scenegraph = new GLTFScenegraph(gltfData);\n\n if (!options?.gltf?.decompressMeshes) {\n return;\n }\n\n const promises: Promise<any>[] = [];\n for (const bufferViewIndex of gltfData.json.bufferViews || []) {\n promises.push(decodeMeshoptBufferView(scenegraph, bufferViewIndex));\n }\n\n // Decompress meshes in parallel\n await Promise.all(promises);\n\n // We have now decompressed all primitives, so remove the top-level extension\n scenegraph.removeExtension(EXT_MESHOPT_COMPRESSION);\n}\n\n/** Decode one meshopt buffer view */\nasync function decodeMeshoptBufferView(\n scenegraph: GLTFScenegraph,\n bufferView: GLTFBufferView\n): Promise<void> {\n const meshoptExtension = scenegraph.getObjectExtension<GLTF_EXT_meshopt_compression>(\n bufferView,\n EXT_MESHOPT_COMPRESSION\n );\n if (meshoptExtension) {\n const {\n byteOffset = 0,\n byteLength = 0,\n byteStride,\n count,\n mode,\n filter = 'NONE',\n buffer: bufferIndex\n } = meshoptExtension;\n const buffer = scenegraph.gltf.buffers[bufferIndex];\n\n const source = new Uint8Array(buffer.arrayBuffer, buffer.byteOffset + byteOffset, byteLength);\n const result = new Uint8Array(\n scenegraph.gltf.buffers[bufferView.buffer].arrayBuffer,\n bufferView.byteOffset,\n bufferView.byteLength\n );\n await meshoptDecodeGltfBuffer(result, count, byteStride, source, mode, filter);\n scenegraph.removeObjectExtension(bufferView, EXT_MESHOPT_COMPRESSION);\n }\n}\n"],"mappings":"AAGA,SAAQA,cAAc,QAAO,wBAAwB;AACrD,SAAQC,uBAAuB,QAAO,+BAA+B;AAIrE,MAAMC,uBAAuB,GAAG;EAC9BC,UAAU,EAAE,CAAC;EACbC,MAAM,EAAE;AACV,CAAC;AAGD,MAAMC,uBAAuB,GAAG,yBAAyB;AAEzD,OAAO,MAAMC,IAAI,GAAGD,uBAAuB;AAE3C,OAAO,eAAeE,MAAMA,CAACC,QAAsB,EAAEC,OAA0B,EAAE;EAAA,IAAAC,aAAA;EAC/E,MAAMC,UAAU,GAAG,
|
|
1
|
+
{"version":3,"file":"EXT_meshopt_compression.js","names":["GLTFScenegraph","meshoptDecodeGltfBuffer","DEFAULT_MESHOPT_OPTIONS","byteOffset","filter","EXT_MESHOPT_COMPRESSION","name","decode","gltfData","options","_options$gltf","_options$gltf2","scenegraph","gltf","decompressMeshes","loadBuffers","promises","bufferViewIndex","json","bufferViews","push","decodeMeshoptBufferView","Promise","all","removeExtension","bufferView","meshoptExtension","getObjectExtension","byteLength","byteStride","count","mode","buffer","bufferIndex","buffers","source","Uint8Array","arrayBuffer","result","removeObjectExtension"],"sources":["../../../../src/lib/extensions/EXT_meshopt_compression.ts"],"sourcesContent":["/* eslint-disable camelcase */\nimport type {GLTF, GLTFBufferView, GLTF_EXT_meshopt_compression} from '../types/gltf-json-schema';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\nimport {GLTFScenegraph} from '../api/gltf-scenegraph';\nimport {meshoptDecodeGltfBuffer} from '../../meshopt/meshopt-decoder';\n\n// @ts-ignore\n// eslint-disable-next-line\nconst DEFAULT_MESHOPT_OPTIONS = {\n byteOffset: 0,\n filter: 'NONE'\n};\n\n/** Extension name */\nconst EXT_MESHOPT_COMPRESSION = 'EXT_meshopt_compression';\n\nexport const name = EXT_MESHOPT_COMPRESSION;\n\nexport async function decode(gltfData: {json: GLTF}, options: GLTFLoaderOptions) {\n const scenegraph = new GLTFScenegraph(gltfData);\n\n if (!options?.gltf?.decompressMeshes || !options.gltf?.loadBuffers) {\n return;\n }\n\n const promises: Promise<any>[] = [];\n for (const bufferViewIndex of gltfData.json.bufferViews || []) {\n promises.push(decodeMeshoptBufferView(scenegraph, bufferViewIndex));\n }\n\n // Decompress meshes in parallel\n await Promise.all(promises);\n\n // We have now decompressed all primitives, so remove the top-level extension\n scenegraph.removeExtension(EXT_MESHOPT_COMPRESSION);\n}\n\n/** Decode one meshopt buffer view */\nasync function decodeMeshoptBufferView(\n scenegraph: GLTFScenegraph,\n bufferView: GLTFBufferView\n): Promise<void> {\n const meshoptExtension = scenegraph.getObjectExtension<GLTF_EXT_meshopt_compression>(\n bufferView,\n EXT_MESHOPT_COMPRESSION\n );\n if (meshoptExtension) {\n const {\n byteOffset = 0,\n byteLength = 0,\n byteStride,\n count,\n mode,\n filter = 'NONE',\n buffer: bufferIndex\n } = meshoptExtension;\n const buffer = scenegraph.gltf.buffers[bufferIndex];\n\n const source = new Uint8Array(buffer.arrayBuffer, buffer.byteOffset + byteOffset, byteLength);\n const result = new Uint8Array(\n scenegraph.gltf.buffers[bufferView.buffer].arrayBuffer,\n bufferView.byteOffset,\n bufferView.byteLength\n );\n await meshoptDecodeGltfBuffer(result, count, byteStride, source, mode, filter);\n scenegraph.removeObjectExtension(bufferView, EXT_MESHOPT_COMPRESSION);\n }\n}\n"],"mappings":"AAGA,SAAQA,cAAc,QAAO,wBAAwB;AACrD,SAAQC,uBAAuB,QAAO,+BAA+B;AAIrE,MAAMC,uBAAuB,GAAG;EAC9BC,UAAU,EAAE,CAAC;EACbC,MAAM,EAAE;AACV,CAAC;AAGD,MAAMC,uBAAuB,GAAG,yBAAyB;AAEzD,OAAO,MAAMC,IAAI,GAAGD,uBAAuB;AAE3C,OAAO,eAAeE,MAAMA,CAACC,QAAsB,EAAEC,OAA0B,EAAE;EAAA,IAAAC,aAAA,EAAAC,cAAA;EAC/E,MAAMC,UAAU,GAAG,IAAIZ,cAAc,CAACQ,QAAQ,CAAC;EAE/C,IAAI,EAACC,OAAO,aAAPA,OAAO,gBAAAC,aAAA,GAAPD,OAAO,CAAEI,IAAI,cAAAH,aAAA,eAAbA,aAAA,CAAeI,gBAAgB,KAAI,GAAAH,cAAA,GAACF,OAAO,CAACI,IAAI,cAAAF,cAAA,eAAZA,cAAA,CAAcI,WAAW,GAAE;IAClE;EACF;EAEA,MAAMC,QAAwB,GAAG,EAAE;EACnC,KAAK,MAAMC,eAAe,IAAIT,QAAQ,CAACU,IAAI,CAACC,WAAW,IAAI,EAAE,EAAE;IAC7DH,QAAQ,CAACI,IAAI,CAACC,uBAAuB,CAACT,UAAU,EAAEK,eAAe,CAAC,CAAC;EACrE;EAGA,MAAMK,OAAO,CAACC,GAAG,CAACP,QAAQ,CAAC;EAG3BJ,UAAU,CAACY,eAAe,CAACnB,uBAAuB,CAAC;AACrD;AAGA,eAAegB,uBAAuBA,CACpCT,UAA0B,EAC1Ba,UAA0B,EACX;EACf,MAAMC,gBAAgB,GAAGd,UAAU,CAACe,kBAAkB,CACpDF,UAAU,EACVpB,uBACF,CAAC;EACD,IAAIqB,gBAAgB,EAAE;IACpB,MAAM;MACJvB,UAAU,GAAG,CAAC;MACdyB,UAAU,GAAG,CAAC;MACdC,UAAU;MACVC,KAAK;MACLC,IAAI;MACJ3B,MAAM,GAAG,MAAM;MACf4B,MAAM,EAAEC;IACV,CAAC,GAAGP,gBAAgB;IACpB,MAAMM,MAAM,GAAGpB,UAAU,CAACC,IAAI,CAACqB,OAAO,CAACD,WAAW,CAAC;IAEnD,MAAME,MAAM,GAAG,IAAIC,UAAU,CAACJ,MAAM,CAACK,WAAW,EAAEL,MAAM,CAAC7B,UAAU,GAAGA,UAAU,EAAEyB,UAAU,CAAC;IAC7F,MAAMU,MAAM,GAAG,IAAIF,UAAU,CAC3BxB,UAAU,CAACC,IAAI,CAACqB,OAAO,CAACT,UAAU,CAACO,MAAM,CAAC,CAACK,WAAW,EACtDZ,UAAU,CAACtB,UAAU,EACrBsB,UAAU,CAACG,UACb,CAAC;IACD,MAAM3B,uBAAuB,CAACqC,MAAM,EAAER,KAAK,EAAED,UAAU,EAAEM,MAAM,EAAEJ,IAAI,EAAE3B,MAAM,CAAC;IAC9EQ,UAAU,CAAC2B,qBAAqB,CAACd,UAAU,EAAEpB,uBAAuB,CAAC;EACvE;AACF"}
|
|
@@ -9,9 +9,10 @@ const scratchVector = new Vector3();
|
|
|
9
9
|
const scratchRotationMatrix = new Matrix3();
|
|
10
10
|
const scratchScaleMatrix = new Matrix3();
|
|
11
11
|
export async function decode(gltfData, options) {
|
|
12
|
+
var _options$gltf;
|
|
12
13
|
const gltfScenegraph = new GLTFScenegraph(gltfData);
|
|
13
14
|
const hasExtension = gltfScenegraph.hasExtension(EXT_MESHOPT_TRANSFORM);
|
|
14
|
-
if (!hasExtension) {
|
|
15
|
+
if (!hasExtension || !((_options$gltf = options.gltf) !== null && _options$gltf !== void 0 && _options$gltf.loadBuffers)) {
|
|
15
16
|
return;
|
|
16
17
|
}
|
|
17
18
|
const materials = gltfData.json.materials || [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KHR_texture_transform.js","names":["Vector3","Matrix3","getAccessorArrayTypeAndLength","BYTES","COMPONENTS","GLTFScenegraph","EXT_MESHOPT_TRANSFORM","name","scratchVector","scratchRotationMatrix","scratchScaleMatrix","decode","gltfData","options","gltfScenegraph","hasExtension","materials","json","i","length","transformTexCoords","materialIndex","_gltfData$json$materi","_material$pbrMetallic","_material$pbrMetallic2","processedTexCoords","material","baseColorTexture","pbrMetallicRoughness","transformPrimitives","emisiveTexture","emissiveTexture","normalTexture","occlusionTexture","metallicRoughnessTexture","texture","transformParameters","getTransformParameters","meshes","mesh","primitive","primitives","Number","isFinite","transformPrimitive","_texture$extensions","textureInfo","extensions","texCoord","originalTexCoord","isProcessed","findIndex","_ref","original","newTexCoord","matrix","makeTransformationMatrix","push","texCoordAccessor","attributes","concat","_gltfData$json$access","accessor","accessors","bufferView","_gltfData$json$buffer","bufferViews","arrayBuffer","byteOffset","bufferByteOffset","buffers","buffer","ArrayType","bytes","componentType","components","type","elementAddressScale","byteStride","result","Float32Array","count","uv","set","transformByMatrix3","updateGltf","createAttribute","newTexCoordArray","byteLength","originalAccessor","extensionData","offset","rotation","scale","translationMatrix","rotationMatrix","Math","cos","sin","scaleMatrix","multiplyRight"],"sources":["../../../../src/lib/extensions/KHR_texture_transform.ts"],"sourcesContent":["/**\n * https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_texture_transform/README.md\n */\n\nimport {Vector3, Matrix3} from '@math.gl/core';\nimport type {GLTFWithBuffers} from '../types/gltf-types';\nimport type {\n GLTFMeshPrimitive,\n GLTFAccessor,\n GLTFBufferView,\n GLTFMaterialNormalTextureInfo,\n GLTFMaterialOcclusionTextureInfo,\n GLTFTextureInfo\n} from '../types/gltf-json-schema';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\n\nimport {getAccessorArrayTypeAndLength} from '../gltf-utils/gltf-utils';\nimport {BYTES, COMPONENTS} from '../gltf-utils/gltf-constants';\nimport {} from '../types/gltf-json-schema';\nimport {GLTFScenegraph} from '../api/gltf-scenegraph';\n\n/** Extension name */\nconst EXT_MESHOPT_TRANSFORM = 'KHR_texture_transform';\n\nexport const name = EXT_MESHOPT_TRANSFORM;\n\nconst scratchVector = new Vector3();\nconst scratchRotationMatrix = new Matrix3();\nconst scratchScaleMatrix = new Matrix3();\n\n/** Extension textureInfo https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_texture_transform#gltf-schema-updates */\ntype TextureInfo = {\n /** The offset of the UV coordinate origin as a factor of the texture dimensions. */\n offset?: [number, number];\n /** Rotate the UVs by this many radians counter-clockwise around the origin. This is equivalent to a similar rotation of the image clockwise. */\n rotation?: number;\n /** The scale factor applied to the components of the UV coordinates. */\n scale?: [number, number];\n /** Overrides the textureInfo texCoord value if supplied, and if this extension is supported. */\n texCoord?: number;\n};\n/** Intersection of all GLTF textures */\ntype CompoundGLTFTextureInfo = GLTFTextureInfo &\n GLTFMaterialNormalTextureInfo &\n GLTFMaterialOcclusionTextureInfo;\n/** Parameters for TEXCOORD transformation */\ntype TransformParameters = {\n /** Original texCoord value https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html#_textureinfo_texcoord */\n originalTexCoord: number;\n /** New texCoord value from extension https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_texture_transform#gltf-schema-updates */\n texCoord: number;\n /** Transformation matrix */\n matrix: Matrix3;\n};\n\n/**\n * The extension entry to process the transformation\n * @param gltfData gltf buffers and json\n * @param options GLTFLoader options\n */\nexport async function decode(gltfData: GLTFWithBuffers, options: GLTFLoaderOptions) {\n const gltfScenegraph = new GLTFScenegraph(gltfData);\n const hasExtension = gltfScenegraph.hasExtension(EXT_MESHOPT_TRANSFORM);\n if (!hasExtension) {\n return;\n }\n const materials = gltfData.json.materials || [];\n for (let i = 0; i < materials.length; i++) {\n transformTexCoords(i, gltfData);\n }\n}\n\n/**\n * Transform TEXCOORD by material\n * @param materialIndex processing material index\n * @param gltfData gltf buffers and json\n */\nfunction transformTexCoords(materialIndex: number, gltfData: GLTFWithBuffers): void {\n // Save processed texCoords in order no to process the same twice\n const processedTexCoords: [number, number][] = [];\n const material = gltfData.json.materials?.[materialIndex];\n const baseColorTexture = material?.pbrMetallicRoughness?.baseColorTexture;\n if (baseColorTexture) {\n transformPrimitives(gltfData, materialIndex, baseColorTexture, processedTexCoords);\n }\n const emisiveTexture = material?.emissiveTexture;\n if (emisiveTexture) {\n transformPrimitives(gltfData, materialIndex, emisiveTexture, processedTexCoords);\n }\n const normalTexture = material?.normalTexture;\n if (normalTexture) {\n transformPrimitives(gltfData, materialIndex, normalTexture, processedTexCoords);\n }\n const occlusionTexture = material?.occlusionTexture;\n if (occlusionTexture) {\n transformPrimitives(gltfData, materialIndex, occlusionTexture, processedTexCoords);\n }\n const metallicRoughnessTexture = material?.pbrMetallicRoughness?.metallicRoughnessTexture;\n if (metallicRoughnessTexture) {\n transformPrimitives(gltfData, materialIndex, metallicRoughnessTexture, processedTexCoords);\n }\n}\n\n/**\n * Transform primitives of the particular material\n * @param gltfData gltf data\n * @param materialIndex primitives with this material will be transformed\n * @param texture texture object\n * @param processedTexCoords storage to save already processed texCoords\n */\nfunction transformPrimitives(\n gltfData: GLTFWithBuffers,\n materialIndex: number,\n texture: CompoundGLTFTextureInfo,\n processedTexCoords: [number, number][]\n) {\n const transformParameters = getTransformParameters(texture, processedTexCoords);\n if (!transformParameters) {\n return;\n }\n const meshes = gltfData.json.meshes || [];\n for (const mesh of meshes) {\n for (const primitive of mesh.primitives) {\n const material = primitive.material;\n if (Number.isFinite(material) && materialIndex === material) {\n transformPrimitive(gltfData, primitive, transformParameters);\n }\n }\n }\n}\n\n/**\n * Get parameters for TEXCOORD transformation\n * @param texture texture object\n * @param processedTexCoords storage to save already processed texCoords\n * @returns texCoord couple and transformation matrix\n */\nfunction getTransformParameters(\n texture: CompoundGLTFTextureInfo,\n processedTexCoords: [number, number][]\n): TransformParameters | null {\n const textureInfo = texture.extensions?.[EXT_MESHOPT_TRANSFORM];\n const {texCoord: originalTexCoord = 0} = texture;\n // If texCoord is not set in the extension, original attribute data will be replaced\n const {texCoord = originalTexCoord} = textureInfo;\n // Make sure that couple [originalTexCoord, extensionTexCoord] is not processed twice\n const isProcessed =\n processedTexCoords.findIndex(\n ([original, newTexCoord]) => original === originalTexCoord && newTexCoord === texCoord\n ) !== -1;\n if (!isProcessed) {\n const matrix = makeTransformationMatrix(textureInfo);\n if (originalTexCoord !== texCoord) {\n texture.texCoord = texCoord;\n }\n processedTexCoords.push([originalTexCoord, texCoord]);\n return {originalTexCoord, texCoord, matrix};\n }\n return null;\n}\n\n/**\n * Transform `TEXCOORD_0` attribute in the primitive\n * @param gltfData gltf data\n * @param primitive primitive object\n * @param transformParameters texCoord couple and transformation matrix\n */\nfunction transformPrimitive(\n gltfData: GLTFWithBuffers,\n primitive: GLTFMeshPrimitive,\n transformParameters: TransformParameters\n) {\n const {originalTexCoord, texCoord, matrix} = transformParameters;\n const texCoordAccessor = primitive.attributes[`TEXCOORD_${originalTexCoord}`];\n if (Number.isFinite(texCoordAccessor)) {\n // Get accessor of the `TEXCOORD_0` attribute\n const accessor = gltfData.json.accessors?.[texCoordAccessor];\n if (accessor && accessor.bufferView) {\n // Get `bufferView` of the `accessor`\n const bufferView = gltfData.json.bufferViews?.[accessor.bufferView];\n if (bufferView) {\n // Get `arrayBuffer` the `bufferView` look at\n const {arrayBuffer, byteOffset: bufferByteOffset} = gltfData.buffers[bufferView.buffer];\n // Resulting byteOffset is sum of the buffer, accessor and bufferView byte offsets\n const byteOffset =\n (bufferByteOffset || 0) + (accessor.byteOffset || 0) + (bufferView.byteOffset || 0);\n // Deduce TypedArray type and its length from `accessor` and `bufferView` data\n const {ArrayType, length} = getAccessorArrayTypeAndLength(accessor, bufferView);\n // Number of bytes each component occupies\n const bytes = BYTES[accessor.componentType];\n // Number of components. For the `TEXCOORD_0` with `VEC2` type, it must return 2\n const components = COMPONENTS[accessor.type];\n // Multiplier to calculate the address of the `TEXCOORD_0` element in the arrayBuffer\n const elementAddressScale = bufferView.byteStride || bytes * components;\n // Data transform to Float32Array\n const result = new Float32Array(length);\n for (let i = 0; i < accessor.count; i++) {\n // Take [u, v] couple from the arrayBuffer\n const uv = new ArrayType(arrayBuffer, byteOffset + i * elementAddressScale, 2);\n // Set and transform Vector3 per https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_texture_transform#overview\n scratchVector.set(uv[0], uv[1], 1);\n scratchVector.transformByMatrix3(matrix);\n // Save result in Float32Array\n result.set([scratchVector[0], scratchVector[1]], i * components);\n }\n // If texCoord the same, replace gltf structural data\n if (originalTexCoord === texCoord) {\n updateGltf(accessor, bufferView, gltfData.buffers, result);\n } else {\n // If texCoord change, create new attribute\n createAttribute(texCoord, accessor, primitive, gltfData, result);\n }\n }\n }\n }\n}\n\n/**\n * Update GLTF structural objects with new data as we create new `Float32Array` for `TEXCOORD_0`.\n * @param accessor accessor to change\n * @param bufferView bufferView to change\n * @param buffers binary buffers\n * @param newTexcoordArray typed array with data after transformation\n */\nfunction updateGltf(\n accessor: GLTFAccessor,\n bufferView: GLTFBufferView,\n buffers: {arrayBuffer: ArrayBuffer; byteOffset: number; byteLength: number}[],\n newTexCoordArray: Float32Array\n): void {\n accessor.componentType = 5126;\n buffers.push({\n arrayBuffer: newTexCoordArray.buffer,\n byteOffset: 0,\n byteLength: newTexCoordArray.buffer.byteLength\n });\n bufferView.buffer = buffers.length - 1;\n bufferView.byteLength = newTexCoordArray.buffer.byteLength;\n bufferView.byteOffset = 0;\n delete bufferView.byteStride;\n}\n\n/**\n *\n * @param newTexCoord new `texCoord` value\n * @param originalAccessor original accessor object, that store data before transformation\n * @param primitive primitive object\n * @param gltfData gltf data\n * @param newTexCoordArray typed array with data after transformation\n * @returns\n */\nfunction createAttribute(\n newTexCoord: number,\n originalAccessor: GLTFAccessor,\n primitive: GLTFMeshPrimitive,\n gltfData: GLTFWithBuffers,\n newTexCoordArray: Float32Array\n) {\n gltfData.buffers.push({\n arrayBuffer: newTexCoordArray.buffer,\n byteOffset: 0,\n byteLength: newTexCoordArray.buffer.byteLength\n });\n const bufferViews = gltfData.json.bufferViews;\n if (!bufferViews) {\n return;\n }\n bufferViews.push({\n buffer: gltfData.buffers.length - 1,\n byteLength: newTexCoordArray.buffer.byteLength,\n byteOffset: 0\n });\n const accessors = gltfData.json.accessors;\n if (!accessors) {\n return;\n }\n accessors.push({\n bufferView: bufferViews?.length - 1,\n byteOffset: 0,\n componentType: 5126,\n count: originalAccessor.count,\n type: 'VEC2'\n });\n primitive.attributes[`TEXCOORD_${newTexCoord}`] = accessors.length - 1;\n}\n\n/**\n * Construct transformation matrix from the extension data (transition, rotation, scale)\n * @param extensionData extension data\n * @returns transformation matrix\n */\nfunction makeTransformationMatrix(extensionData: TextureInfo): Matrix3 {\n const {offset = [0, 0], rotation = 0, scale = [1, 1]} = extensionData;\n const translationMatrix = new Matrix3().set(1, 0, 0, 0, 1, 0, offset[0], offset[1], 1);\n const rotationMatrix = scratchRotationMatrix.set(\n Math.cos(rotation),\n Math.sin(rotation),\n 0,\n -Math.sin(rotation),\n Math.cos(rotation),\n 0,\n 0,\n 0,\n 1\n );\n const scaleMatrix = scratchScaleMatrix.set(scale[0], 0, 0, 0, scale[1], 0, 0, 0, 1);\n return translationMatrix.multiplyRight(rotationMatrix).multiplyRight(scaleMatrix);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"KHR_texture_transform.js","names":["Vector3","Matrix3","getAccessorArrayTypeAndLength","BYTES","COMPONENTS","GLTFScenegraph","EXT_MESHOPT_TRANSFORM","name","scratchVector","scratchRotationMatrix","scratchScaleMatrix","decode","gltfData","options","_options$gltf","gltfScenegraph","hasExtension","gltf","loadBuffers","materials","json","i","length","transformTexCoords","materialIndex","_gltfData$json$materi","_material$pbrMetallic","_material$pbrMetallic2","processedTexCoords","material","baseColorTexture","pbrMetallicRoughness","transformPrimitives","emisiveTexture","emissiveTexture","normalTexture","occlusionTexture","metallicRoughnessTexture","texture","transformParameters","getTransformParameters","meshes","mesh","primitive","primitives","Number","isFinite","transformPrimitive","_texture$extensions","textureInfo","extensions","texCoord","originalTexCoord","isProcessed","findIndex","_ref","original","newTexCoord","matrix","makeTransformationMatrix","push","texCoordAccessor","attributes","concat","_gltfData$json$access","accessor","accessors","bufferView","_gltfData$json$buffer","bufferViews","arrayBuffer","byteOffset","bufferByteOffset","buffers","buffer","ArrayType","bytes","componentType","components","type","elementAddressScale","byteStride","result","Float32Array","count","uv","set","transformByMatrix3","updateGltf","createAttribute","newTexCoordArray","byteLength","originalAccessor","extensionData","offset","rotation","scale","translationMatrix","rotationMatrix","Math","cos","sin","scaleMatrix","multiplyRight"],"sources":["../../../../src/lib/extensions/KHR_texture_transform.ts"],"sourcesContent":["/**\n * https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_texture_transform/README.md\n */\n\nimport {Vector3, Matrix3} from '@math.gl/core';\nimport type {GLTFWithBuffers} from '../types/gltf-types';\nimport type {\n GLTFMeshPrimitive,\n GLTFAccessor,\n GLTFBufferView,\n GLTFMaterialNormalTextureInfo,\n GLTFMaterialOcclusionTextureInfo,\n GLTFTextureInfo\n} from '../types/gltf-json-schema';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\n\nimport {getAccessorArrayTypeAndLength} from '../gltf-utils/gltf-utils';\nimport {BYTES, COMPONENTS} from '../gltf-utils/gltf-constants';\nimport {} from '../types/gltf-json-schema';\nimport {GLTFScenegraph} from '../api/gltf-scenegraph';\n\n/** Extension name */\nconst EXT_MESHOPT_TRANSFORM = 'KHR_texture_transform';\n\nexport const name = EXT_MESHOPT_TRANSFORM;\n\nconst scratchVector = new Vector3();\nconst scratchRotationMatrix = new Matrix3();\nconst scratchScaleMatrix = new Matrix3();\n\n/** Extension textureInfo https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_texture_transform#gltf-schema-updates */\ntype TextureInfo = {\n /** The offset of the UV coordinate origin as a factor of the texture dimensions. */\n offset?: [number, number];\n /** Rotate the UVs by this many radians counter-clockwise around the origin. This is equivalent to a similar rotation of the image clockwise. */\n rotation?: number;\n /** The scale factor applied to the components of the UV coordinates. */\n scale?: [number, number];\n /** Overrides the textureInfo texCoord value if supplied, and if this extension is supported. */\n texCoord?: number;\n};\n/** Intersection of all GLTF textures */\ntype CompoundGLTFTextureInfo = GLTFTextureInfo &\n GLTFMaterialNormalTextureInfo &\n GLTFMaterialOcclusionTextureInfo;\n/** Parameters for TEXCOORD transformation */\ntype TransformParameters = {\n /** Original texCoord value https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html#_textureinfo_texcoord */\n originalTexCoord: number;\n /** New texCoord value from extension https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_texture_transform#gltf-schema-updates */\n texCoord: number;\n /** Transformation matrix */\n matrix: Matrix3;\n};\n\n/**\n * The extension entry to process the transformation\n * @param gltfData gltf buffers and json\n * @param options GLTFLoader options\n */\nexport async function decode(gltfData: GLTFWithBuffers, options: GLTFLoaderOptions) {\n const gltfScenegraph = new GLTFScenegraph(gltfData);\n const hasExtension = gltfScenegraph.hasExtension(EXT_MESHOPT_TRANSFORM);\n if (!hasExtension || !options.gltf?.loadBuffers) {\n return;\n }\n const materials = gltfData.json.materials || [];\n for (let i = 0; i < materials.length; i++) {\n transformTexCoords(i, gltfData);\n }\n}\n\n/**\n * Transform TEXCOORD by material\n * @param materialIndex processing material index\n * @param gltfData gltf buffers and json\n */\nfunction transformTexCoords(materialIndex: number, gltfData: GLTFWithBuffers): void {\n // Save processed texCoords in order no to process the same twice\n const processedTexCoords: [number, number][] = [];\n const material = gltfData.json.materials?.[materialIndex];\n const baseColorTexture = material?.pbrMetallicRoughness?.baseColorTexture;\n if (baseColorTexture) {\n transformPrimitives(gltfData, materialIndex, baseColorTexture, processedTexCoords);\n }\n const emisiveTexture = material?.emissiveTexture;\n if (emisiveTexture) {\n transformPrimitives(gltfData, materialIndex, emisiveTexture, processedTexCoords);\n }\n const normalTexture = material?.normalTexture;\n if (normalTexture) {\n transformPrimitives(gltfData, materialIndex, normalTexture, processedTexCoords);\n }\n const occlusionTexture = material?.occlusionTexture;\n if (occlusionTexture) {\n transformPrimitives(gltfData, materialIndex, occlusionTexture, processedTexCoords);\n }\n const metallicRoughnessTexture = material?.pbrMetallicRoughness?.metallicRoughnessTexture;\n if (metallicRoughnessTexture) {\n transformPrimitives(gltfData, materialIndex, metallicRoughnessTexture, processedTexCoords);\n }\n}\n\n/**\n * Transform primitives of the particular material\n * @param gltfData gltf data\n * @param materialIndex primitives with this material will be transformed\n * @param texture texture object\n * @param processedTexCoords storage to save already processed texCoords\n */\nfunction transformPrimitives(\n gltfData: GLTFWithBuffers,\n materialIndex: number,\n texture: CompoundGLTFTextureInfo,\n processedTexCoords: [number, number][]\n) {\n const transformParameters = getTransformParameters(texture, processedTexCoords);\n if (!transformParameters) {\n return;\n }\n const meshes = gltfData.json.meshes || [];\n for (const mesh of meshes) {\n for (const primitive of mesh.primitives) {\n const material = primitive.material;\n if (Number.isFinite(material) && materialIndex === material) {\n transformPrimitive(gltfData, primitive, transformParameters);\n }\n }\n }\n}\n\n/**\n * Get parameters for TEXCOORD transformation\n * @param texture texture object\n * @param processedTexCoords storage to save already processed texCoords\n * @returns texCoord couple and transformation matrix\n */\nfunction getTransformParameters(\n texture: CompoundGLTFTextureInfo,\n processedTexCoords: [number, number][]\n): TransformParameters | null {\n const textureInfo = texture.extensions?.[EXT_MESHOPT_TRANSFORM];\n const {texCoord: originalTexCoord = 0} = texture;\n // If texCoord is not set in the extension, original attribute data will be replaced\n const {texCoord = originalTexCoord} = textureInfo;\n // Make sure that couple [originalTexCoord, extensionTexCoord] is not processed twice\n const isProcessed =\n processedTexCoords.findIndex(\n ([original, newTexCoord]) => original === originalTexCoord && newTexCoord === texCoord\n ) !== -1;\n if (!isProcessed) {\n const matrix = makeTransformationMatrix(textureInfo);\n if (originalTexCoord !== texCoord) {\n texture.texCoord = texCoord;\n }\n processedTexCoords.push([originalTexCoord, texCoord]);\n return {originalTexCoord, texCoord, matrix};\n }\n return null;\n}\n\n/**\n * Transform `TEXCOORD_0` attribute in the primitive\n * @param gltfData gltf data\n * @param primitive primitive object\n * @param transformParameters texCoord couple and transformation matrix\n */\nfunction transformPrimitive(\n gltfData: GLTFWithBuffers,\n primitive: GLTFMeshPrimitive,\n transformParameters: TransformParameters\n) {\n const {originalTexCoord, texCoord, matrix} = transformParameters;\n const texCoordAccessor = primitive.attributes[`TEXCOORD_${originalTexCoord}`];\n if (Number.isFinite(texCoordAccessor)) {\n // Get accessor of the `TEXCOORD_0` attribute\n const accessor = gltfData.json.accessors?.[texCoordAccessor];\n if (accessor && accessor.bufferView) {\n // Get `bufferView` of the `accessor`\n const bufferView = gltfData.json.bufferViews?.[accessor.bufferView];\n if (bufferView) {\n // Get `arrayBuffer` the `bufferView` look at\n const {arrayBuffer, byteOffset: bufferByteOffset} = gltfData.buffers[bufferView.buffer];\n // Resulting byteOffset is sum of the buffer, accessor and bufferView byte offsets\n const byteOffset =\n (bufferByteOffset || 0) + (accessor.byteOffset || 0) + (bufferView.byteOffset || 0);\n // Deduce TypedArray type and its length from `accessor` and `bufferView` data\n const {ArrayType, length} = getAccessorArrayTypeAndLength(accessor, bufferView);\n // Number of bytes each component occupies\n const bytes = BYTES[accessor.componentType];\n // Number of components. For the `TEXCOORD_0` with `VEC2` type, it must return 2\n const components = COMPONENTS[accessor.type];\n // Multiplier to calculate the address of the `TEXCOORD_0` element in the arrayBuffer\n const elementAddressScale = bufferView.byteStride || bytes * components;\n // Data transform to Float32Array\n const result = new Float32Array(length);\n for (let i = 0; i < accessor.count; i++) {\n // Take [u, v] couple from the arrayBuffer\n const uv = new ArrayType(arrayBuffer, byteOffset + i * elementAddressScale, 2);\n // Set and transform Vector3 per https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_texture_transform#overview\n scratchVector.set(uv[0], uv[1], 1);\n scratchVector.transformByMatrix3(matrix);\n // Save result in Float32Array\n result.set([scratchVector[0], scratchVector[1]], i * components);\n }\n // If texCoord the same, replace gltf structural data\n if (originalTexCoord === texCoord) {\n updateGltf(accessor, bufferView, gltfData.buffers, result);\n } else {\n // If texCoord change, create new attribute\n createAttribute(texCoord, accessor, primitive, gltfData, result);\n }\n }\n }\n }\n}\n\n/**\n * Update GLTF structural objects with new data as we create new `Float32Array` for `TEXCOORD_0`.\n * @param accessor accessor to change\n * @param bufferView bufferView to change\n * @param buffers binary buffers\n * @param newTexcoordArray typed array with data after transformation\n */\nfunction updateGltf(\n accessor: GLTFAccessor,\n bufferView: GLTFBufferView,\n buffers: {arrayBuffer: ArrayBuffer; byteOffset: number; byteLength: number}[],\n newTexCoordArray: Float32Array\n): void {\n accessor.componentType = 5126;\n buffers.push({\n arrayBuffer: newTexCoordArray.buffer,\n byteOffset: 0,\n byteLength: newTexCoordArray.buffer.byteLength\n });\n bufferView.buffer = buffers.length - 1;\n bufferView.byteLength = newTexCoordArray.buffer.byteLength;\n bufferView.byteOffset = 0;\n delete bufferView.byteStride;\n}\n\n/**\n *\n * @param newTexCoord new `texCoord` value\n * @param originalAccessor original accessor object, that store data before transformation\n * @param primitive primitive object\n * @param gltfData gltf data\n * @param newTexCoordArray typed array with data after transformation\n * @returns\n */\nfunction createAttribute(\n newTexCoord: number,\n originalAccessor: GLTFAccessor,\n primitive: GLTFMeshPrimitive,\n gltfData: GLTFWithBuffers,\n newTexCoordArray: Float32Array\n) {\n gltfData.buffers.push({\n arrayBuffer: newTexCoordArray.buffer,\n byteOffset: 0,\n byteLength: newTexCoordArray.buffer.byteLength\n });\n const bufferViews = gltfData.json.bufferViews;\n if (!bufferViews) {\n return;\n }\n bufferViews.push({\n buffer: gltfData.buffers.length - 1,\n byteLength: newTexCoordArray.buffer.byteLength,\n byteOffset: 0\n });\n const accessors = gltfData.json.accessors;\n if (!accessors) {\n return;\n }\n accessors.push({\n bufferView: bufferViews?.length - 1,\n byteOffset: 0,\n componentType: 5126,\n count: originalAccessor.count,\n type: 'VEC2'\n });\n primitive.attributes[`TEXCOORD_${newTexCoord}`] = accessors.length - 1;\n}\n\n/**\n * Construct transformation matrix from the extension data (transition, rotation, scale)\n * @param extensionData extension data\n * @returns transformation matrix\n */\nfunction makeTransformationMatrix(extensionData: TextureInfo): Matrix3 {\n const {offset = [0, 0], rotation = 0, scale = [1, 1]} = extensionData;\n const translationMatrix = new Matrix3().set(1, 0, 0, 0, 1, 0, offset[0], offset[1], 1);\n const rotationMatrix = scratchRotationMatrix.set(\n Math.cos(rotation),\n Math.sin(rotation),\n 0,\n -Math.sin(rotation),\n Math.cos(rotation),\n 0,\n 0,\n 0,\n 1\n );\n const scaleMatrix = scratchScaleMatrix.set(scale[0], 0, 0, 0, scale[1], 0, 0, 0, 1);\n return translationMatrix.multiplyRight(rotationMatrix).multiplyRight(scaleMatrix);\n}\n"],"mappings":"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"}
|
|
@@ -131,6 +131,7 @@ async function loadImage(gltf, image, index, options, context) {
|
|
|
131
131
|
}
|
|
132
132
|
assert(arrayBuffer, 'glTF image has no data');
|
|
133
133
|
let parsedImage = await parse(arrayBuffer, [ImageLoader, BasisLoader], {
|
|
134
|
+
...options,
|
|
134
135
|
mimeType: image.mimeType,
|
|
135
136
|
basis: options.basis || {
|
|
136
137
|
format: selectSupportedBasisFormat()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-gltf.js","names":["parseJSON","sliceArrayBuffer","ImageLoader","BasisLoader","selectSupportedBasisFormat","assert","isGLB","parseGLBSync","resolveUrl","getTypedArrayForBufferView","preprocessExtensions","decodeExtensions","normalizeGLTFV1","isGLTF","arrayBuffer","options","byteOffset","parseGLTF","gltf","arrayBufferOrString","_options$gltf","_options$gltf2","_options$gltf3","arguments","length","undefined","context","parseGLTFContainerSync","normalize","loadBuffers","json","buffers","loadImages","data","uri","baseUri","ArrayBuffer","textDecoder","TextDecoder","decode","glb","type","concat","_glb","Array","fill","header","hasBinChunk","binChunks","byteLength","images","i","buffer","_context$fetch","_response$arrayBuffer","fetch","response","call","imageIndices","getReferencesImageIndices","promises","imageIndex","push","loadImage","Promise","all","Set","textures","texture","source","add","from","sort","image","index","parse","hasOwnProperty","bufferView","Number","isFinite","array","parsedImage","mimeType","basis","format","compressed","mipmaps","width","height"],"sources":["../../../../src/lib/parsers/parse-gltf.ts"],"sourcesContent":["/* eslint-disable camelcase, max-statements, no-restricted-globals */\nimport type {LoaderContext} from '@loaders.gl/loader-utils';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\nimport type {GLTFWithBuffers} from '../types/gltf-types';\nimport type {GLB} from '../types/glb-types';\nimport type {ParseGLBOptions} from './parse-glb';\n\nimport {parseJSON, sliceArrayBuffer} from '@loaders.gl/loader-utils';\nimport {ImageLoader} from '@loaders.gl/images';\nimport {BasisLoader, selectSupportedBasisFormat} from '@loaders.gl/textures';\n\nimport {assert} from '../utils/assert';\nimport {isGLB, parseGLBSync} from './parse-glb';\nimport {resolveUrl} from '../gltf-utils/resolve-url';\nimport {getTypedArrayForBufferView} from '../gltf-utils/get-typed-array';\nimport {preprocessExtensions, decodeExtensions} from '../api/gltf-extensions';\nimport {normalizeGLTFV1} from '../api/normalize-gltf-v1';\n\n/** */\nexport type ParseGLTFOptions = ParseGLBOptions & {\n normalize?: boolean;\n loadImages?: boolean;\n loadBuffers?: boolean;\n decompressMeshes?: boolean;\n excludeExtensions?: string[];\n\n /** @deprecated not supported in v4. `postProcessGLTF()` must be called by the application */\n postProcess?: false;\n};\n\n/** Check if an array buffer appears to contain GLTF data */\nexport function isGLTF(arrayBuffer: ArrayBuffer, options?: ParseGLTFOptions): boolean {\n const byteOffset = 0;\n return isGLB(arrayBuffer, byteOffset, options);\n}\n\nexport async function parseGLTF(\n gltf: GLTFWithBuffers,\n arrayBufferOrString,\n byteOffset = 0,\n options: GLTFLoaderOptions,\n context: LoaderContext\n): Promise<GLTFWithBuffers> {\n parseGLTFContainerSync(gltf, arrayBufferOrString, byteOffset, options);\n\n normalizeGLTFV1(gltf, {normalize: options?.gltf?.normalize});\n\n preprocessExtensions(gltf, options, context);\n\n // Load linked buffers asynchronously and decodes base64 buffers in parallel\n if (options?.gltf?.loadBuffers && gltf.json.buffers) {\n await loadBuffers(gltf, options, context);\n }\n\n // loadImages and decodeExtensions should not be running in parallel, because\n // decodeExtensions uses data from images taken during the loadImages call.\n if (options?.gltf?.loadImages) {\n await loadImages(gltf, options, context);\n }\n\n await decodeExtensions(gltf, options, context);\n\n return gltf;\n}\n\n/**\n *\n * @param gltf\n * @param data - can be ArrayBuffer (GLB), ArrayBuffer (Binary JSON), String (JSON), or Object (parsed JSON)\n * @param byteOffset\n * @param options\n */\nfunction parseGLTFContainerSync(gltf, data, byteOffset, options) {\n // Initialize gltf container\n if (options.uri) {\n gltf.baseUri = options.uri;\n }\n\n // If data is binary and starting with magic bytes, assume binary JSON text, convert to string\n if (data instanceof ArrayBuffer && !isGLB(data, byteOffset, options)) {\n const textDecoder = new TextDecoder();\n data = textDecoder.decode(data);\n }\n\n if (typeof data === 'string') {\n // If string, try to parse as JSON\n gltf.json = parseJSON(data);\n } else if (data instanceof ArrayBuffer) {\n // If still ArrayBuffer, parse as GLB container\n const glb: GLB = {} as GLB;\n byteOffset = parseGLBSync(glb, data, byteOffset, options.glb);\n\n assert(glb.type === 'glTF', `Invalid GLB magic string ${glb.type}`);\n\n gltf._glb = glb;\n gltf.json = glb.json;\n } else {\n assert(false, 'GLTF: must be ArrayBuffer or string');\n }\n\n // Populate buffers\n // Create an external buffers array to hold binary data\n const buffers = gltf.json.buffers || [];\n gltf.buffers = new Array(buffers.length).fill(null);\n\n // Populates JSON and some bin chunk info\n if (gltf._glb && gltf._glb.header.hasBinChunk) {\n const {binChunks} = gltf._glb;\n gltf.buffers[0] = {\n arrayBuffer: binChunks[0].arrayBuffer,\n byteOffset: binChunks[0].byteOffset,\n byteLength: binChunks[0].byteLength\n };\n\n // TODO - this modifies JSON and is a post processing thing\n // gltf.json.buffers[0].data = gltf.buffers[0].arrayBuffer;\n // gltf.json.buffers[0].byteOffset = gltf.buffers[0].byteOffset;\n }\n\n // Populate images\n const images = gltf.json.images || [];\n gltf.images = new Array(images.length).fill({});\n}\n\n/** Asynchronously fetch and parse buffers, store in buffers array outside of json\n * TODO - traverse gltf and determine which buffers are actually needed\n */\nasync function loadBuffers(gltf: GLTFWithBuffers, options, context: LoaderContext) {\n // TODO\n const buffers = gltf.json.buffers || [];\n for (let i = 0; i < buffers.length; ++i) {\n const buffer = buffers[i];\n if (buffer.uri) {\n const {fetch} = context;\n assert(fetch);\n\n const uri = resolveUrl(buffer.uri, options);\n const response = await context?.fetch?.(uri);\n const arrayBuffer = await response?.arrayBuffer?.();\n\n gltf.buffers[i] = {\n arrayBuffer,\n byteOffset: 0,\n byteLength: arrayBuffer.byteLength\n };\n\n delete buffer.uri;\n } else if (gltf.buffers[i] === null) {\n gltf.buffers[i] = {\n arrayBuffer: new ArrayBuffer(buffer.byteLength),\n byteOffset: 0,\n byteLength: buffer.byteLength\n };\n }\n }\n}\n\n/**\n * Loads all images\n * TODO - traverse gltf and determine which images are actually needed\n * @param gltf\n * @param options\n * @param context\n * @returns\n */\nasync function loadImages(gltf: GLTFWithBuffers, options, context: LoaderContext) {\n const imageIndices = getReferencesImageIndices(gltf);\n\n const images = gltf.json.images || [];\n\n const promises: Promise<any>[] = [];\n for (const imageIndex of imageIndices) {\n promises.push(loadImage(gltf, images[imageIndex], imageIndex, options, context));\n }\n\n return await Promise.all(promises);\n}\n\n/** Make sure we only load images that are actually referenced by textures */\nfunction getReferencesImageIndices(gltf: GLTFWithBuffers): number[] {\n const imageIndices = new Set<number>();\n\n const textures = gltf.json.textures || [];\n for (const texture of textures) {\n if (texture.source !== undefined) {\n imageIndices.add(texture.source);\n }\n }\n\n return Array.from(imageIndices).sort();\n}\n\n/** Asynchronously fetches and parses one image, store in images array outside of json */\nasync function loadImage(\n gltf: GLTFWithBuffers,\n image,\n index: number,\n options,\n context: LoaderContext\n) {\n const {fetch, parse} = context;\n\n let arrayBuffer;\n\n if (image.uri && !image.hasOwnProperty('bufferView')) {\n const uri = resolveUrl(image.uri, options);\n const response = await fetch(uri);\n arrayBuffer = await response.arrayBuffer();\n image.bufferView = {\n data: arrayBuffer\n };\n }\n\n if (Number.isFinite(image.bufferView)) {\n const array = getTypedArrayForBufferView(gltf.json, gltf.buffers, image.bufferView);\n arrayBuffer = sliceArrayBuffer(array.buffer, array.byteOffset, array.byteLength);\n }\n\n assert(arrayBuffer, 'glTF image has no data');\n\n // Call `parse`\n let parsedImage = await parse(\n arrayBuffer,\n [ImageLoader, BasisLoader],\n {mimeType: image.mimeType, basis: options.basis || {format: selectSupportedBasisFormat()}},\n context\n );\n\n if (parsedImage && parsedImage[0]) {\n parsedImage = {\n compressed: true,\n mipmaps: false,\n width: parsedImage[0].width,\n height: parsedImage[0].height,\n data: parsedImage[0]\n };\n }\n // TODO making sure ImageLoader is overridable by using array of loaders\n // const parsedImage = await parse(arrayBuffer, [ImageLoader]);\n\n // Store the loaded image\n gltf.images = gltf.images || [];\n gltf.images[index] = parsedImage;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parse-gltf.js","names":["parseJSON","sliceArrayBuffer","ImageLoader","BasisLoader","selectSupportedBasisFormat","assert","isGLB","parseGLBSync","resolveUrl","getTypedArrayForBufferView","preprocessExtensions","decodeExtensions","normalizeGLTFV1","isGLTF","arrayBuffer","options","byteOffset","parseGLTF","gltf","arrayBufferOrString","_options$gltf","_options$gltf2","_options$gltf3","arguments","length","undefined","context","parseGLTFContainerSync","normalize","loadBuffers","json","buffers","loadImages","data","uri","baseUri","ArrayBuffer","textDecoder","TextDecoder","decode","glb","type","concat","_glb","Array","fill","header","hasBinChunk","binChunks","byteLength","images","i","buffer","_context$fetch","_response$arrayBuffer","fetch","response","call","imageIndices","getReferencesImageIndices","promises","imageIndex","push","loadImage","Promise","all","Set","textures","texture","source","add","from","sort","image","index","parse","hasOwnProperty","bufferView","Number","isFinite","array","parsedImage","mimeType","basis","format","compressed","mipmaps","width","height"],"sources":["../../../../src/lib/parsers/parse-gltf.ts"],"sourcesContent":["/* eslint-disable camelcase, max-statements, no-restricted-globals */\nimport type {LoaderContext} from '@loaders.gl/loader-utils';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\nimport type {GLTFWithBuffers} from '../types/gltf-types';\nimport type {GLB} from '../types/glb-types';\nimport type {ParseGLBOptions} from './parse-glb';\n\nimport {parseJSON, sliceArrayBuffer} from '@loaders.gl/loader-utils';\nimport {ImageLoader} from '@loaders.gl/images';\nimport {BasisLoader, selectSupportedBasisFormat} from '@loaders.gl/textures';\n\nimport {assert} from '../utils/assert';\nimport {isGLB, parseGLBSync} from './parse-glb';\nimport {resolveUrl} from '../gltf-utils/resolve-url';\nimport {getTypedArrayForBufferView} from '../gltf-utils/get-typed-array';\nimport {preprocessExtensions, decodeExtensions} from '../api/gltf-extensions';\nimport {normalizeGLTFV1} from '../api/normalize-gltf-v1';\n\n/** */\nexport type ParseGLTFOptions = ParseGLBOptions & {\n normalize?: boolean;\n loadImages?: boolean;\n loadBuffers?: boolean;\n decompressMeshes?: boolean;\n excludeExtensions?: string[];\n\n /** @deprecated not supported in v4. `postProcessGLTF()` must be called by the application */\n postProcess?: false;\n};\n\n/** Check if an array buffer appears to contain GLTF data */\nexport function isGLTF(arrayBuffer: ArrayBuffer, options?: ParseGLTFOptions): boolean {\n const byteOffset = 0;\n return isGLB(arrayBuffer, byteOffset, options);\n}\n\nexport async function parseGLTF(\n gltf: GLTFWithBuffers,\n arrayBufferOrString,\n byteOffset = 0,\n options: GLTFLoaderOptions,\n context: LoaderContext\n): Promise<GLTFWithBuffers> {\n parseGLTFContainerSync(gltf, arrayBufferOrString, byteOffset, options);\n\n normalizeGLTFV1(gltf, {normalize: options?.gltf?.normalize});\n\n preprocessExtensions(gltf, options, context);\n\n // Load linked buffers asynchronously and decodes base64 buffers in parallel\n if (options?.gltf?.loadBuffers && gltf.json.buffers) {\n await loadBuffers(gltf, options, context);\n }\n\n // loadImages and decodeExtensions should not be running in parallel, because\n // decodeExtensions uses data from images taken during the loadImages call.\n if (options?.gltf?.loadImages) {\n await loadImages(gltf, options, context);\n }\n\n await decodeExtensions(gltf, options, context);\n\n return gltf;\n}\n\n/**\n *\n * @param gltf\n * @param data - can be ArrayBuffer (GLB), ArrayBuffer (Binary JSON), String (JSON), or Object (parsed JSON)\n * @param byteOffset\n * @param options\n */\nfunction parseGLTFContainerSync(gltf, data, byteOffset, options) {\n // Initialize gltf container\n if (options.uri) {\n gltf.baseUri = options.uri;\n }\n\n // If data is binary and starting with magic bytes, assume binary JSON text, convert to string\n if (data instanceof ArrayBuffer && !isGLB(data, byteOffset, options)) {\n const textDecoder = new TextDecoder();\n data = textDecoder.decode(data);\n }\n\n if (typeof data === 'string') {\n // If string, try to parse as JSON\n gltf.json = parseJSON(data);\n } else if (data instanceof ArrayBuffer) {\n // If still ArrayBuffer, parse as GLB container\n const glb: GLB = {} as GLB;\n byteOffset = parseGLBSync(glb, data, byteOffset, options.glb);\n\n assert(glb.type === 'glTF', `Invalid GLB magic string ${glb.type}`);\n\n gltf._glb = glb;\n gltf.json = glb.json;\n } else {\n assert(false, 'GLTF: must be ArrayBuffer or string');\n }\n\n // Populate buffers\n // Create an external buffers array to hold binary data\n const buffers = gltf.json.buffers || [];\n gltf.buffers = new Array(buffers.length).fill(null);\n\n // Populates JSON and some bin chunk info\n if (gltf._glb && gltf._glb.header.hasBinChunk) {\n const {binChunks} = gltf._glb;\n gltf.buffers[0] = {\n arrayBuffer: binChunks[0].arrayBuffer,\n byteOffset: binChunks[0].byteOffset,\n byteLength: binChunks[0].byteLength\n };\n\n // TODO - this modifies JSON and is a post processing thing\n // gltf.json.buffers[0].data = gltf.buffers[0].arrayBuffer;\n // gltf.json.buffers[0].byteOffset = gltf.buffers[0].byteOffset;\n }\n\n // Populate images\n const images = gltf.json.images || [];\n gltf.images = new Array(images.length).fill({});\n}\n\n/** Asynchronously fetch and parse buffers, store in buffers array outside of json\n * TODO - traverse gltf and determine which buffers are actually needed\n */\nasync function loadBuffers(gltf: GLTFWithBuffers, options, context: LoaderContext) {\n // TODO\n const buffers = gltf.json.buffers || [];\n for (let i = 0; i < buffers.length; ++i) {\n const buffer = buffers[i];\n if (buffer.uri) {\n const {fetch} = context;\n assert(fetch);\n\n const uri = resolveUrl(buffer.uri, options);\n const response = await context?.fetch?.(uri);\n const arrayBuffer = await response?.arrayBuffer?.();\n\n gltf.buffers[i] = {\n arrayBuffer,\n byteOffset: 0,\n byteLength: arrayBuffer.byteLength\n };\n\n delete buffer.uri;\n } else if (gltf.buffers[i] === null) {\n gltf.buffers[i] = {\n arrayBuffer: new ArrayBuffer(buffer.byteLength),\n byteOffset: 0,\n byteLength: buffer.byteLength\n };\n }\n }\n}\n\n/**\n * Loads all images\n * TODO - traverse gltf and determine which images are actually needed\n * @param gltf\n * @param options\n * @param context\n * @returns\n */\nasync function loadImages(gltf: GLTFWithBuffers, options, context: LoaderContext) {\n const imageIndices = getReferencesImageIndices(gltf);\n\n const images = gltf.json.images || [];\n\n const promises: Promise<any>[] = [];\n for (const imageIndex of imageIndices) {\n promises.push(loadImage(gltf, images[imageIndex], imageIndex, options, context));\n }\n\n return await Promise.all(promises);\n}\n\n/** Make sure we only load images that are actually referenced by textures */\nfunction getReferencesImageIndices(gltf: GLTFWithBuffers): number[] {\n const imageIndices = new Set<number>();\n\n const textures = gltf.json.textures || [];\n for (const texture of textures) {\n if (texture.source !== undefined) {\n imageIndices.add(texture.source);\n }\n }\n\n return Array.from(imageIndices).sort();\n}\n\n/** Asynchronously fetches and parses one image, store in images array outside of json */\nasync function loadImage(\n gltf: GLTFWithBuffers,\n image,\n index: number,\n options,\n context: LoaderContext\n) {\n const {fetch, parse} = context;\n\n let arrayBuffer;\n\n if (image.uri && !image.hasOwnProperty('bufferView')) {\n const uri = resolveUrl(image.uri, options);\n const response = await fetch(uri);\n arrayBuffer = await response.arrayBuffer();\n image.bufferView = {\n data: arrayBuffer\n };\n }\n\n if (Number.isFinite(image.bufferView)) {\n const array = getTypedArrayForBufferView(gltf.json, gltf.buffers, image.bufferView);\n arrayBuffer = sliceArrayBuffer(array.buffer, array.byteOffset, array.byteLength);\n }\n\n assert(arrayBuffer, 'glTF image has no data');\n\n // Call `parse`\n let parsedImage = await parse(\n arrayBuffer,\n [ImageLoader, BasisLoader],\n {\n ...options,\n mimeType: image.mimeType,\n basis: options.basis || {format: selectSupportedBasisFormat()}\n },\n context\n );\n\n if (parsedImage && parsedImage[0]) {\n parsedImage = {\n compressed: true,\n mipmaps: false,\n width: parsedImage[0].width,\n height: parsedImage[0].height,\n data: parsedImage[0]\n };\n }\n // TODO making sure ImageLoader is overridable by using array of loaders\n // const parsedImage = await parse(arrayBuffer, [ImageLoader]);\n\n // Store the loaded image\n gltf.images = gltf.images || [];\n gltf.images[index] = parsedImage;\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const VERSION = typeof "4.0.0-alpha.
|
|
1
|
+
export const VERSION = typeof "4.0.0-alpha.19" !== 'undefined' ? "4.0.0-alpha.19" : 'latest';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
|
@@ -14,7 +14,7 @@ const EXT_MESHOPT_COMPRESSION = 'EXT_meshopt_compression';
|
|
|
14
14
|
exports.name = EXT_MESHOPT_COMPRESSION;
|
|
15
15
|
async function decode(gltfData, options) {
|
|
16
16
|
const scenegraph = new gltf_scenegraph_1.GLTFScenegraph(gltfData);
|
|
17
|
-
if (!options?.gltf?.decompressMeshes) {
|
|
17
|
+
if (!options?.gltf?.decompressMeshes || !options.gltf?.loadBuffers) {
|
|
18
18
|
return;
|
|
19
19
|
}
|
|
20
20
|
const promises = [];
|
|
@@ -22,7 +22,7 @@ const scratchScaleMatrix = new core_1.Matrix3();
|
|
|
22
22
|
async function decode(gltfData, options) {
|
|
23
23
|
const gltfScenegraph = new gltf_scenegraph_1.GLTFScenegraph(gltfData);
|
|
24
24
|
const hasExtension = gltfScenegraph.hasExtension(EXT_MESHOPT_TRANSFORM);
|
|
25
|
-
if (!hasExtension) {
|
|
25
|
+
if (!hasExtension || !options.gltf?.loadBuffers) {
|
|
26
26
|
return;
|
|
27
27
|
}
|
|
28
28
|
const materials = gltfData.json.materials || [];
|
|
@@ -161,7 +161,11 @@ async function loadImage(gltf, image, index, options, context) {
|
|
|
161
161
|
}
|
|
162
162
|
(0, assert_1.assert)(arrayBuffer, 'glTF image has no data');
|
|
163
163
|
// Call `parse`
|
|
164
|
-
let parsedImage = await parse(arrayBuffer, [images_1.ImageLoader, textures_1.BasisLoader], {
|
|
164
|
+
let parsedImage = await parse(arrayBuffer, [images_1.ImageLoader, textures_1.BasisLoader], {
|
|
165
|
+
...options,
|
|
166
|
+
mimeType: image.mimeType,
|
|
167
|
+
basis: options.basis || { format: (0, textures_1.selectSupportedBasisFormat)() }
|
|
168
|
+
}, context);
|
|
165
169
|
if (parsedImage && parsedImage[0]) {
|
|
166
170
|
parsedImage = {
|
|
167
171
|
compressed: true,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loaders.gl/gltf",
|
|
3
|
-
"version": "4.0.0-alpha.
|
|
3
|
+
"version": "4.0.0-alpha.19",
|
|
4
4
|
"description": "Framework-independent loader for the glTF format",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
@@ -34,11 +34,11 @@
|
|
|
34
34
|
"build-bundle": "esbuild src/bundle.ts --bundle --outfile=dist/dist.min.js"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@loaders.gl/draco": "4.0.0-alpha.
|
|
38
|
-
"@loaders.gl/images": "4.0.0-alpha.
|
|
39
|
-
"@loaders.gl/loader-utils": "4.0.0-alpha.
|
|
40
|
-
"@loaders.gl/textures": "4.0.0-alpha.
|
|
37
|
+
"@loaders.gl/draco": "4.0.0-alpha.19",
|
|
38
|
+
"@loaders.gl/images": "4.0.0-alpha.19",
|
|
39
|
+
"@loaders.gl/loader-utils": "4.0.0-alpha.19",
|
|
40
|
+
"@loaders.gl/textures": "4.0.0-alpha.19",
|
|
41
41
|
"@math.gl/core": "^3.5.1"
|
|
42
42
|
},
|
|
43
|
-
"gitHead": "
|
|
43
|
+
"gitHead": "2ca50ec4e1d312c124eb7c93c60ab6fd17ee833e"
|
|
44
44
|
}
|
|
@@ -19,7 +19,7 @@ export const name = EXT_MESHOPT_COMPRESSION;
|
|
|
19
19
|
export async function decode(gltfData: {json: GLTF}, options: GLTFLoaderOptions) {
|
|
20
20
|
const scenegraph = new GLTFScenegraph(gltfData);
|
|
21
21
|
|
|
22
|
-
if (!options?.gltf?.decompressMeshes) {
|
|
22
|
+
if (!options?.gltf?.decompressMeshes || !options.gltf?.loadBuffers) {
|
|
23
23
|
return;
|
|
24
24
|
}
|
|
25
25
|
|
|
@@ -61,7 +61,7 @@ type TransformParameters = {
|
|
|
61
61
|
export async function decode(gltfData: GLTFWithBuffers, options: GLTFLoaderOptions) {
|
|
62
62
|
const gltfScenegraph = new GLTFScenegraph(gltfData);
|
|
63
63
|
const hasExtension = gltfScenegraph.hasExtension(EXT_MESHOPT_TRANSFORM);
|
|
64
|
-
if (!hasExtension) {
|
|
64
|
+
if (!hasExtension || !options.gltf?.loadBuffers) {
|
|
65
65
|
return;
|
|
66
66
|
}
|
|
67
67
|
const materials = gltfData.json.materials || [];
|
|
@@ -222,7 +222,11 @@ async function loadImage(
|
|
|
222
222
|
let parsedImage = await parse(
|
|
223
223
|
arrayBuffer,
|
|
224
224
|
[ImageLoader, BasisLoader],
|
|
225
|
-
{
|
|
225
|
+
{
|
|
226
|
+
...options,
|
|
227
|
+
mimeType: image.mimeType,
|
|
228
|
+
basis: options.basis || {format: selectSupportedBasisFormat()}
|
|
229
|
+
},
|
|
226
230
|
context
|
|
227
231
|
);
|
|
228
232
|
|