@loaders.gl/gltf 4.0.0-alpha.18 → 4.0.0-alpha.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/dist.min.js CHANGED
@@ -120,32 +120,33 @@
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[library]) {
136
- return modules[library];
136
+ if (modules[libraryName]) {
137
+ return modules[libraryName];
137
138
  }
138
139
  if (!isBrowser2) {
139
- return `modules/${moduleName}/dist/libs/${library}`;
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/${library}`;
144
+ return `${options.CDN}/${moduleName}@${VERSION3}/dist/libs/${libraryName}`;
144
145
  }
145
146
  if (isWorker) {
146
- return `../src/libs/${library}`;
147
+ return `../src/libs/${libraryName}`;
147
148
  }
148
- return `modules/${moduleName}/src/libs/${library}`;
149
+ return `modules/${moduleName}/src/libs/${libraryName}`;
149
150
  }
150
151
  async function loadLibraryFromFile(libraryUrl) {
151
152
  if (libraryUrl.endsWith("wasm")) {
@@ -865,8 +866,8 @@
865
866
  let BASIS = null;
866
867
  let wasmBinary = null;
867
868
  [BASIS, wasmBinary] = await Promise.all([
868
- await loadLibrary("basis_transcoder.js", "textures", options),
869
- await loadLibrary("basis_transcoder.wasm", "textures", options)
869
+ await loadLibrary(BASIS_EXTERNAL_LIBRARIES.TRANSCODER, "textures", options),
870
+ await loadLibrary(BASIS_EXTERNAL_LIBRARIES.TRANSCODER_WASM, "textures", options)
870
871
  ]);
871
872
  BASIS = BASIS || globalThis.BASIS;
872
873
  return await initializeBasisTranscoderModule(BASIS, wasmBinary);
@@ -896,8 +897,8 @@
896
897
  let BASIS_ENCODER = null;
897
898
  let wasmBinary = null;
898
899
  [BASIS_ENCODER, wasmBinary] = await Promise.all([
899
- await loadLibrary(BASIS_CDN_ENCODER_JS, "textures", options),
900
- await loadLibrary(BASIS_CDN_ENCODER_WASM, "textures", options)
900
+ await loadLibrary(BASIS_EXTERNAL_LIBRARIES.ENCODER, "textures", options),
901
+ await loadLibrary(BASIS_EXTERNAL_LIBRARIES.ENCODER_WASM, "textures", options)
901
902
  ]);
902
903
  BASIS_ENCODER = BASIS_ENCODER || globalThis.BASIS;
903
904
  return await initializeBasisEncoderModule(BASIS_ENCODER, wasmBinary);
@@ -915,13 +916,16 @@
915
916
  });
916
917
  });
917
918
  }
918
- var VERSION6, BASIS_CDN_ENCODER_WASM, BASIS_CDN_ENCODER_JS, loadBasisTranscoderPromise, loadBasisEncoderPromise;
919
+ var BASIS_EXTERNAL_LIBRARIES, loadBasisTranscoderPromise, loadBasisEncoderPromise;
919
920
  var init_basis_module_loader = __esm({
920
921
  "../textures/src/lib/parsers/basis-module-loader.ts"() {
921
922
  init_src();
922
- VERSION6 = typeof __VERSION__ !== "undefined" ? __VERSION__ : "beta";
923
- BASIS_CDN_ENCODER_WASM = `https://unpkg.com/@loaders.gl/textures@${VERSION6}/dist/libs/basis_encoder.wasm`;
924
- BASIS_CDN_ENCODER_JS = `https://unpkg.com/@loaders.gl/textures@${VERSION6}/dist/libs/basis_encoder.js`;
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
+ };
925
929
  }
926
930
  });
927
931
 
@@ -2170,7 +2174,7 @@
2170
2174
  });
2171
2175
  async function decode2(gltfData, options) {
2172
2176
  const scenegraph = new GLTFScenegraph(gltfData);
2173
- if (!options?.gltf?.decompressMeshes) {
2177
+ if (!options?.gltf?.decompressMeshes || !options.gltf?.loadBuffers) {
2174
2178
  return;
2175
2179
  }
2176
2180
  const promises = [];
@@ -2271,10 +2275,10 @@
2271
2275
  });
2272
2276
 
2273
2277
  // ../draco/src/lib/utils/version.ts
2274
- var VERSION7;
2278
+ var VERSION6;
2275
2279
  var init_version5 = __esm({
2276
2280
  "../draco/src/lib/utils/version.ts"() {
2277
- VERSION7 = typeof __VERSION__ !== "undefined" ? __VERSION__ : "latest";
2281
+ VERSION6 = typeof __VERSION__ !== "undefined" ? __VERSION__ : "latest";
2278
2282
  }
2279
2283
  });
2280
2284
 
@@ -2295,7 +2299,7 @@
2295
2299
  name: "Draco",
2296
2300
  id: "draco",
2297
2301
  module: "draco",
2298
- version: VERSION7,
2302
+ version: VERSION6,
2299
2303
  worker: true,
2300
2304
  extensions: ["drc"],
2301
2305
  mimeTypes: ["application/octet-stream"],
@@ -2811,13 +2815,13 @@
2811
2815
  let wasmBinary;
2812
2816
  switch (options.draco && options.draco.decoderType) {
2813
2817
  case "js":
2814
- DracoDecoderModule = await loadLibrary(DRACO_JS_DECODER_URL, "draco", options);
2818
+ DracoDecoderModule = await loadLibrary(DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER], "draco", options, DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER);
2815
2819
  break;
2816
2820
  case "wasm":
2817
2821
  default:
2818
2822
  [DracoDecoderModule, wasmBinary] = await Promise.all([
2819
- await loadLibrary(DRACO_WASM_WRAPPER_URL, "draco", options),
2820
- await loadLibrary(DRACO_WASM_DECODER_URL, "draco", options)
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)
2821
2825
  ]);
2822
2826
  }
2823
2827
  DracoDecoderModule = DracoDecoderModule || globalThis.DracoDecoderModule;
@@ -2835,17 +2839,25 @@
2835
2839
  });
2836
2840
  });
2837
2841
  }
2838
- var DRACO_DECODER_VERSION, DRACO_ENCODER_VERSION, STATIC_DECODER_URL, DRACO_JS_DECODER_URL, DRACO_WASM_WRAPPER_URL, DRACO_WASM_DECODER_URL, DRACO_ENCODER_URL, loadDecoderPromise;
2842
+ var DRACO_DECODER_VERSION, DRACO_ENCODER_VERSION, STATIC_DECODER_URL, DRACO_EXTERNAL_LIBRARIES, DRACO_EXTERNAL_LIBRARY_URLS, loadDecoderPromise;
2839
2843
  var init_draco_module_loader = __esm({
2840
2844
  "../draco/src/lib/draco-module-loader.ts"() {
2841
2845
  init_src();
2842
2846
  DRACO_DECODER_VERSION = "1.5.5";
2843
2847
  DRACO_ENCODER_VERSION = "1.4.1";
2844
2848
  STATIC_DECODER_URL = `https://www.gstatic.com/draco/versioned/decoders/${DRACO_DECODER_VERSION}`;
2845
- DRACO_JS_DECODER_URL = `${STATIC_DECODER_URL}/draco_decoder.js`;
2846
- DRACO_WASM_WRAPPER_URL = `${STATIC_DECODER_URL}/draco_wasm_wrapper.js`;
2847
- DRACO_WASM_DECODER_URL = `${STATIC_DECODER_URL}/draco_decoder.wasm`;
2848
- DRACO_ENCODER_URL = `https://raw.githubusercontent.com/google/draco/${DRACO_ENCODER_VERSION}/javascript/draco_encoder.js`;
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
+ };
2849
2861
  }
2850
2862
  });
2851
2863
 
@@ -4233,7 +4245,7 @@
4233
4245
  async function decode4(gltfData, options) {
4234
4246
  const gltfScenegraph = new GLTFScenegraph(gltfData);
4235
4247
  const hasExtension = gltfScenegraph.hasExtension(EXT_MESHOPT_TRANSFORM);
4236
- if (!hasExtension) {
4248
+ if (!hasExtension || !options.gltf?.loadBuffers) {
4237
4249
  return;
4238
4250
  }
4239
4251
  const materials = gltfData.json.materials || [];
@@ -5133,7 +5145,11 @@
5133
5145
  arrayBuffer = sliceArrayBuffer(array.buffer, array.byteOffset, array.byteLength);
5134
5146
  }
5135
5147
  assert3(arrayBuffer, "glTF image has no data");
5136
- let parsedImage = await parse4(arrayBuffer, [ImageLoader, BasisLoader], { mimeType: image.mimeType, basis: options.basis || { format: selectSupportedBasisFormat() } }, context);
5148
+ let parsedImage = await parse4(arrayBuffer, [ImageLoader, BasisLoader], {
5149
+ ...options,
5150
+ mimeType: image.mimeType,
5151
+ basis: options.basis || { format: selectSupportedBasisFormat() }
5152
+ }, context);
5137
5153
  if (parsedImage && parsedImage[0]) {
5138
5154
  parsedImage = {
5139
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":"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"}
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":";;;;;;;;;;;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,QAAAC,MAAA,EAAAC,cAAA,QAAAC,IAAA,GAAAC,MAAA,CAAAD,IAAA,CAAAF,MAAA,OAAAG,MAAA,CAAAC,qBAAA,QAAAC,OAAA,GAAAF,MAAA,CAAAC,qBAAA,CAAAJ,MAAA,GAAAC,cAAA,KAAAI,OAAA,GAAAA,OAAA,CAAAC,MAAA,WAAAC,GAAA,WAAAJ,MAAA,CAAAK,wBAAA,CAAAR,MAAA,EAAAO,GAAA,EAAAE,UAAA,OAAAP,IAAA,CAAAQ,IAAA,CAAAC,KAAA,CAAAT,IAAA,EAAAG,OAAA,YAAAH,IAAA;AAAA,SAAAU,cAAAC,MAAA,aAAAC,CAAA,MAAAA,CAAA,GAAAC,SAAA,CAAAC,MAAA,EAAAF,CAAA,UAAAG,MAAA,WAAAF,SAAA,CAAAD,CAAA,IAAAC,SAAA,CAAAD,CAAA,QAAAA,CAAA,OAAAf,OAAA,CAAAI,MAAA,CAAAc,MAAA,OAAAC,OAAA,WAAAC,GAAA,QAAAC,gBAAA,CAAAC,OAAA,EAAAR,MAAA,EAAAM,GAAA,EAAAF,MAAA,CAAAE,GAAA,SAAAhB,MAAA,CAAAmB,yBAAA,GAAAnB,MAAA,CAAAoB,gBAAA,CAAAV,MAAA,EAAAV,MAAA,CAAAmB,yBAAA,CAAAL,MAAA,KAAAlB,OAAA,CAAAI,MAAA,CAAAc,MAAA,GAAAC,OAAA,WAAAC,GAAA,IAAAhB,MAAA,CAAAqB,cAAA,CAAAX,MAAA,EAAAM,GAAA,EAAAhB,MAAA,CAAAK,wBAAA,CAAAS,MAAA,EAAAE,GAAA,iBAAAN,MAAA;AAAA,SAAAY,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,CAAAV,MAAA,qBAAAY,EAAA,EAAAF,CAAA,GAAAE,EAAA,MAAAd,CAAA,UAAAoB,CAAA,YAAAA,EAAA,eAAAC,CAAA,EAAAD,CAAA,EAAAE,CAAA,WAAAA,EAAA,QAAAtB,CAAA,IAAAY,CAAA,CAAAV,MAAA,WAAAqB,IAAA,mBAAAA,IAAA,SAAAC,KAAA,EAAAZ,CAAA,CAAAZ,CAAA,UAAAyB,CAAA,WAAAA,EAAAC,EAAA,UAAAA,EAAA,KAAAC,CAAA,EAAAP,CAAA,gBAAAQ,SAAA,iJAAAC,gBAAA,SAAAC,MAAA,UAAAC,GAAA,WAAAV,CAAA,WAAAA,EAAA,IAAAP,EAAA,GAAAA,EAAA,CAAAkB,IAAA,CAAApB,CAAA,MAAAU,CAAA,WAAAA,EAAA,QAAAW,IAAA,GAAAnB,EAAA,CAAAoB,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,IAAAf,EAAA,CAAAsB,MAAA,UAAAtB,EAAA,CAAAsB,MAAA,oBAAAN,MAAA,QAAAC,GAAA;AAAA,SAAAZ,4BAAAP,CAAA,EAAAyB,MAAA,SAAAzB,CAAA,qBAAAA,CAAA,sBAAA0B,iBAAA,CAAA1B,CAAA,EAAAyB,MAAA,OAAAf,CAAA,GAAAjC,MAAA,CAAAkD,SAAA,CAAAC,QAAA,CAAAR,IAAA,CAAApB,CAAA,EAAA6B,KAAA,aAAAnB,CAAA,iBAAAV,CAAA,CAAA8B,WAAA,EAAApB,CAAA,GAAAV,CAAA,CAAA8B,WAAA,CAAAC,IAAA,MAAArB,CAAA,cAAAA,CAAA,mBAAAL,KAAA,CAAA2B,IAAA,CAAAhC,CAAA,OAAAU,CAAA,+DAAAuB,IAAA,CAAAvB,CAAA,UAAAgB,iBAAA,CAAA1B,CAAA,EAAAyB,MAAA;AAAA,SAAAC,kBAAAQ,GAAA,EAAAC,GAAA,QAAAA,GAAA,YAAAA,GAAA,GAAAD,GAAA,CAAA5C,MAAA,EAAA6C,GAAA,GAAAD,GAAA,CAAA5C,MAAA,WAAAF,CAAA,MAAAgD,IAAA,OAAA/B,KAAA,CAAA8B,GAAA,GAAA/C,CAAA,GAAA+C,GAAA,EAAA/C,CAAA,IAAAgD,IAAA,CAAAhD,CAAA,IAAA8C,GAAA,CAAA9C,CAAA,UAAAgD,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,CAAA5D,KAAA,OAAAI,SAAA;AAAA;AAAA,SAAAwD,WAAA;EAAAA,UAAA,OAAAC,kBAAA,CAAAnD,OAAA,EAAAoD,YAAA,CAAApD,OAAA,CAAAqD,IAAA,CAAxB,SAAAC,QACLC,IAAqB,EACrBC,mBAAmB;IAAA,IAAAC,aAAA,EAAAC,cAAA,EAAAC,cAAA;IAAA,IAAAd,UAAA;MAAAD,OAAA;MAAAgB,OAAA;MAAAC,KAAA,GAAAnE,SAAA;IAAA,OAAA0D,YAAA,CAAApD,OAAA,CAAA8D,IAAA,UAAAC,SAAAC,QAAA;MAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAArC,IAAA;QAAA;UACnBkB,UAAU,GAAAgB,KAAA,CAAAlE,MAAA,QAAAkE,KAAA,QAAAK,SAAA,GAAAL,KAAA,MAAG,CAAC;UACdjB,OAA0B,GAAAiB,KAAA,CAAAlE,MAAA,OAAAkE,KAAA,MAAAK,SAAA;UAC1BN,OAAsB,GAAAC,KAAA,CAAAlE,MAAA,OAAAkE,KAAA,MAAAK,SAAA;UAEtBC,sBAAsB,CAACZ,IAAI,EAAEC,mBAAmB,EAAEX,UAAU,EAAED,OAAO,CAAC;UAEtE,IAAAwB,+BAAe,EAACb,IAAI,EAAE;YAACc,SAAS,EAAEzB,OAAO,aAAPA,OAAO,wBAAAa,aAAA,GAAPb,OAAO,CAAEW,IAAI,cAAAE,aAAA,uBAAbA,aAAA,CAAeY;UAAS,CAAC,CAAC;UAE5D,IAAAC,oCAAoB,EAACf,IAAI,EAAEX,OAAO,EAAEgB,OAAO,CAAC;UAAC,MAGzChB,OAAO,aAAPA,OAAO,gBAAAc,cAAA,GAAPd,OAAO,CAAEW,IAAI,cAAAG,cAAA,eAAbA,cAAA,CAAea,WAAW,IAAIhB,IAAI,CAACiB,IAAI,CAACC,OAAO;YAAAT,QAAA,CAAArC,IAAA;YAAA;UAAA;UAAAqC,QAAA,CAAArC,IAAA;UAAA,OAC3C4C,WAAW,CAAChB,IAAI,EAAEX,OAAO,EAAEgB,OAAO,CAAC;QAAA;UAAA,MAKvChB,OAAO,aAAPA,OAAO,gBAAAe,cAAA,GAAPf,OAAO,CAAEW,IAAI,cAAAI,cAAA,eAAbA,cAAA,CAAee,UAAU;YAAAV,QAAA,CAAArC,IAAA;YAAA;UAAA;UAAAqC,QAAA,CAAArC,IAAA;UAAA,OACrB+C,UAAU,CAACnB,IAAI,EAAEX,OAAO,EAAEgB,OAAO,CAAC;QAAA;UAAAI,QAAA,CAAArC,IAAA;UAAA,OAGpC,IAAAgD,gCAAgB,EAACpB,IAAI,EAAEX,OAAO,EAAEgB,OAAO,CAAC;QAAA;UAAA,OAAAI,QAAA,CAAAY,MAAA,WAEvCrB,IAAI;QAAA;QAAA;UAAA,OAAAS,QAAA,CAAAa,IAAA;MAAA;IAAA,GAAAvB,OAAA;EAAA,CACZ;EAAA,OAAAJ,UAAA,CAAA5D,KAAA,OAAAI,SAAA;AAAA;AASD,SAASyE,sBAAsBA,CAACZ,IAAI,EAAEuB,IAAI,EAAEjC,UAAU,EAAED,OAAO,EAAE;EAE/D,IAAIA,OAAO,CAACmC,GAAG,EAAE;IACfxB,IAAI,CAACyB,OAAO,GAAGpC,OAAO,CAACmC,GAAG;EAC5B;EAGA,IAAID,IAAI,YAAYG,WAAW,IAAI,CAAC,IAAAnC,eAAK,EAACgC,IAAI,EAAEjC,UAAU,EAAED,OAAO,CAAC,EAAE;IACpE,IAAMsC,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;IAC1BzC,UAAU,GAAG,IAAA0C,sBAAY,EAACD,GAAG,EAAER,IAAI,EAAEjC,UAAU,EAAED,OAAO,CAAC0C,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,IAAI/D,KAAK,CAAC+D,OAAO,CAAC9E,MAAM,CAAC,CAACiG,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;MAChB9B,WAAW,EAAEoD,SAAS,CAAC,CAAC,CAAC,CAACpD,WAAW;MACrCE,UAAU,EAAEkD,SAAS,CAAC,CAAC,CAAC,CAAClD,UAAU;MACnCmD,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,IAAIvF,KAAK,CAACuF,MAAM,CAACtG,MAAM,CAAC,CAACiG,IAAI,CAAC,CAAC,CAAC,CAAC;AACjD;AAAC,SAKcrB,WAAWA,CAAA2B,GAAA,EAAAC,GAAA,EAAAC,GAAA;EAAA,OAAAC,YAAA,CAAA/G,KAAA,OAAAI,SAAA;AAAA;AAAA,SAAA2G,aAAA;EAAAA,YAAA,OAAAlD,kBAAA,CAAAnD,OAAA,EAAAoD,YAAA,CAAApD,OAAA,CAAAqD,IAAA,CAA1B,SAAAiD,SAA2B/C,IAAqB,EAAEX,OAAO,EAAEgB,OAAsB;IAAA,IAAAa,OAAA,EAAAhF,CAAA,EAAA8G,MAAA,EAAAC,cAAA,EAAAC,qBAAA,EAAAC,KAAA,EAAA3B,GAAA,EAAA4B,QAAA,EAAAhE,WAAA;IAAA,OAAAS,YAAA,CAAApD,OAAA,CAAA8D,IAAA,UAAA8C,UAAAC,SAAA;MAAA,kBAAAA,SAAA,CAAA5C,IAAA,GAAA4C,SAAA,CAAAlF,IAAA;QAAA;UAEzE8C,OAAO,GAAGlB,IAAI,CAACiB,IAAI,CAACC,OAAO,IAAI,EAAE;UAC9BhF,CAAC,GAAG,CAAC;QAAA;UAAA,MAAEA,CAAC,GAAGgF,OAAO,CAAC9E,MAAM;YAAAkH,SAAA,CAAAlF,IAAA;YAAA;UAAA;UAC1B4E,MAAM,GAAG9B,OAAO,CAAChF,CAAC,CAAC;UAAA,KACrB8G,MAAM,CAACxB,GAAG;YAAA8B,SAAA,CAAAlF,IAAA;YAAA;UAAA;UACL+E,KAAK,GAAI9C,OAAO,CAAhB8C,KAAK;UACZ,IAAAlB,cAAM,EAACkB,KAAK,CAAC;UAEP3B,GAAG,GAAG,IAAA+B,sBAAU,EAACP,MAAM,CAACxB,GAAG,EAAEnC,OAAO,CAAC;UAAAiE,SAAA,CAAAlF,IAAA;UAAA,OACpBiC,OAAO,aAAPA,OAAO,wBAAA4C,cAAA,GAAP5C,OAAO,CAAE8C,KAAK,cAAAF,cAAA,uBAAdA,cAAA,CAAA/E,IAAA,CAAAmC,OAAO,EAAUmB,GAAG,CAAC;QAAA;UAAtC4B,QAAQ,GAAAE,SAAA,CAAAE,IAAA;UAAAF,SAAA,CAAAlF,IAAA;UAAA,OACYgF,QAAQ,aAARA,QAAQ,wBAAAF,qBAAA,GAARE,QAAQ,CAAEhE,WAAW,cAAA8D,qBAAA,uBAArBA,qBAAA,CAAAhF,IAAA,CAAAkF,QAAwB,CAAC;QAAA;UAA7ChE,WAAW,GAAAkE,SAAA,CAAAE,IAAA;UAEjBxD,IAAI,CAACkB,OAAO,CAAChF,CAAC,CAAC,GAAG;YAChBkD,WAAW,EAAXA,WAAW;YACXE,UAAU,EAAE,CAAC;YACbmD,UAAU,EAAErD,WAAW,CAACqD;UAC1B,CAAC;UAED,OAAOO,MAAM,CAACxB,GAAG;UAAC8B,SAAA,CAAAlF,IAAA;UAAA;QAAA;UACb,IAAI4B,IAAI,CAACkB,OAAO,CAAChF,CAAC,CAAC,KAAK,IAAI,EAAE;YACnC8D,IAAI,CAACkB,OAAO,CAAChF,CAAC,CAAC,GAAG;cAChBkD,WAAW,EAAE,IAAIsC,WAAW,CAACsB,MAAM,CAACP,UAAU,CAAC;cAC/CnD,UAAU,EAAE,CAAC;cACbmD,UAAU,EAAEO,MAAM,CAACP;YACrB,CAAC;UACH;QAAC;UAvBiC,EAAEvG,CAAC;UAAAoH,SAAA,CAAAlF,IAAA;UAAA;QAAA;QAAA;UAAA,OAAAkF,SAAA,CAAAhC,IAAA;MAAA;IAAA,GAAAyB,QAAA;EAAA,CAyBxC;EAAA,OAAAD,YAAA,CAAA/G,KAAA,OAAAI,SAAA;AAAA;AAAA,SAUcgF,UAAUA,CAAAsC,GAAA,EAAAC,GAAA,EAAAC,GAAA;EAAA,OAAAC,WAAA,CAAA7H,KAAA,OAAAI,SAAA;AAAA;AAAA,SAAAyH,YAAA;EAAAA,WAAA,OAAAhE,kBAAA,CAAAnD,OAAA,EAAAoD,YAAA,CAAApD,OAAA,CAAAqD,IAAA,CAAzB,SAAA+D,SAA0B7D,IAAqB,EAAEX,OAAO,EAAEgB,OAAsB;IAAA,IAAAyD,YAAA,EAAApB,MAAA,EAAAqB,QAAA,EAAAC,UAAA,EAAAC,MAAA,EAAAC,UAAA;IAAA,OAAArE,YAAA,CAAApD,OAAA,CAAA8D,IAAA,UAAA4D,UAAAC,SAAA;MAAA,kBAAAA,SAAA,CAAA1D,IAAA,GAAA0D,SAAA,CAAAhG,IAAA;QAAA;UACxE0F,YAAY,GAAGO,yBAAyB,CAACrE,IAAI,CAAC;UAE9C0C,MAAM,GAAG1C,IAAI,CAACiB,IAAI,CAACyB,MAAM,IAAI,EAAE;UAE/BqB,QAAwB,GAAG,EAAE;UAAAC,UAAA,GAAAnH,0BAAA,CACViH,YAAY;UAAA;YAArC,KAAAE,UAAA,CAAAzG,CAAA,MAAA0G,MAAA,GAAAD,UAAA,CAAAxG,CAAA,IAAAC,IAAA,GAAuC;cAA5ByG,UAAU,GAAAD,MAAA,CAAAvG,KAAA;cACnBqG,QAAQ,CAACjI,IAAI,CAACwI,SAAS,CAACtE,IAAI,EAAE0C,MAAM,CAACwB,UAAU,CAAC,EAAEA,UAAU,EAAE7E,OAAO,EAAEgB,OAAO,CAAC,CAAC;YAClF;UAAC,SAAApC,GAAA;YAAA+F,UAAA,CAAArG,CAAA,CAAAM,GAAA;UAAA;YAAA+F,UAAA,CAAAnG,CAAA;UAAA;UAAAuG,SAAA,CAAAhG,IAAA;UAAA,OAEYmG,OAAO,CAACC,GAAG,CAACT,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,CAAA7H,KAAA,OAAAI,SAAA;AAAA;AAGD,SAASkI,yBAAyBA,CAACrE,IAAqB,EAAY;EAClE,IAAM8D,YAAY,GAAG,IAAIW,GAAG,CAAS,CAAC;EAEtC,IAAMC,QAAQ,GAAG1E,IAAI,CAACiB,IAAI,CAACyD,QAAQ,IAAI,EAAE;EAAC,IAAAC,SAAA,GAAA9H,0BAAA,CACpB6H,QAAQ;IAAAE,KAAA;EAAA;IAA9B,KAAAD,SAAA,CAAApH,CAAA,MAAAqH,KAAA,GAAAD,SAAA,CAAAnH,CAAA,IAAAC,IAAA,GAAgC;MAAA,IAArBoH,OAAO,GAAAD,KAAA,CAAAlH,KAAA;MAChB,IAAImH,OAAO,CAACxI,MAAM,KAAKsE,SAAS,EAAE;QAChCmD,YAAY,CAACgB,GAAG,CAACD,OAAO,CAACxI,MAAM,CAAC;MAClC;IACF;EAAC,SAAA4B,GAAA;IAAA0G,SAAA,CAAAhH,CAAA,CAAAM,GAAA;EAAA;IAAA0G,SAAA,CAAA9G,CAAA;EAAA;EAED,OAAOV,KAAK,CAAC2B,IAAI,CAACgF,YAAY,CAAC,CAACiB,IAAI,CAAC,CAAC;AACxC;AAAC,SAGcT,SAASA,CAAAU,GAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA,EAAAC,IAAA;EAAA,OAAAC,UAAA,CAAAtJ,KAAA,OAAAI,SAAA;AAAA;AAAA,SAAAkJ,WAAA;EAAAA,UAAA,OAAAzF,kBAAA,CAAAnD,OAAA,EAAAoD,YAAA,CAAApD,OAAA,CAAAqD,IAAA,CAAxB,SAAAwF,SACEtF,IAAqB,EACrBuF,KAAK,EACLC,KAAa,EACbnG,OAAO,EACPgB,OAAsB;IAAA,IAAA8C,KAAA,EAAAsC,KAAA,EAAArG,WAAA,EAAAoC,GAAA,EAAA4B,QAAA,EAAAsC,KAAA,EAAAC,WAAA;IAAA,OAAA9F,YAAA,CAAApD,OAAA,CAAA8D,IAAA,UAAAqF,UAAAC,SAAA;MAAA,kBAAAA,SAAA,CAAAnF,IAAA,GAAAmF,SAAA,CAAAzH,IAAA;QAAA;UAEf+E,KAAK,GAAW9C,OAAO,CAAvB8C,KAAK,EAAEsC,KAAK,GAAIpF,OAAO,CAAhBoF,KAAK;UAAA,MAIfF,KAAK,CAAC/D,GAAG,IAAI,CAAC+D,KAAK,CAACO,cAAc,CAAC,YAAY,CAAC;YAAAD,SAAA,CAAAzH,IAAA;YAAA;UAAA;UAC5CoD,GAAG,GAAG,IAAA+B,sBAAU,EAACgC,KAAK,CAAC/D,GAAG,EAAEnC,OAAO,CAAC;UAAAwG,SAAA,CAAAzH,IAAA;UAAA,OACnB+E,KAAK,CAAC3B,GAAG,CAAC;QAAA;UAA3B4B,QAAQ,GAAAyC,SAAA,CAAArC,IAAA;UAAAqC,SAAA,CAAAzH,IAAA;UAAA,OACMgF,QAAQ,CAAChE,WAAW,CAAC,CAAC;QAAA;UAA1CA,WAAW,GAAAyG,SAAA,CAAArC,IAAA;UACX+B,KAAK,CAACQ,UAAU,GAAG;YACjBxE,IAAI,EAAEnC;UACR,CAAC;QAAC;UAGJ,IAAI4G,MAAM,CAACC,QAAQ,CAACV,KAAK,CAACQ,UAAU,CAAC,EAAE;YAC/BL,KAAK,GAAG,IAAAQ,yCAA0B,EAAClG,IAAI,CAACiB,IAAI,EAAEjB,IAAI,CAACkB,OAAO,EAAEqE,KAAK,CAACQ,UAAU,CAAC;YACnF3G,WAAW,GAAG,IAAA+G,6BAAgB,EAACT,KAAK,CAAC1C,MAAM,EAAE0C,KAAK,CAACpG,UAAU,EAAEoG,KAAK,CAACjD,UAAU,CAAC;UAClF;UAEA,IAAAR,cAAM,EAAC7C,WAAW,EAAE,wBAAwB,CAAC;UAACyG,SAAA,CAAAzH,IAAA;UAAA,OAGtBqH,KAAK,CAC3BrG,WAAW,EACX,CAACgH,mBAAW,EAAEC,qBAAW,CAAC,EAAArK,aAAA,CAAAA,aAAA,KAErBqD,OAAO;YACViH,QAAQ,EAAEf,KAAK,CAACe,QAAQ;YACxBC,KAAK,EAAElH,OAAO,CAACkH,KAAK,IAAI;cAACC,MAAM,EAAE,IAAAC,oCAA0B,EAAC;YAAC;UAAC,IAEhEpG,OACF,CAAC;QAAA;UATGsF,WAAW,GAAAE,SAAA,CAAArC,IAAA;UAWf,IAAImC,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;cAC7BtF,IAAI,EAAEoE,WAAW,CAAC,CAAC;YACrB,CAAC;UACH;UAKA3F,IAAI,CAAC0C,MAAM,GAAG1C,IAAI,CAAC0C,MAAM,IAAI,EAAE;UAC/B1C,IAAI,CAAC0C,MAAM,CAAC8C,KAAK,CAAC,GAAGG,WAAW;QAAC;QAAA;UAAA,OAAAE,SAAA,CAAAvE,IAAA;MAAA;IAAA,GAAAgE,QAAA;EAAA,CAClC;EAAA,OAAAD,UAAA,CAAAtJ,KAAA,OAAAI,SAAA;AAAA"}
@@ -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.18" !== 'undefined' ? "4.0.0-alpha.18" : 'latest';
7
+ var VERSION = typeof "4.0.0-alpha.20" !== 'undefined' ? "4.0.0-alpha.20" : '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,IAAIX,cAAc,CAACQ,QAAQ,CAAC;EAE/C,IAAI,EAACC,OAAO,aAAPA,OAAO,gBAAAC,aAAA,GAAPD,OAAO,CAAEG,IAAI,cAAAF,aAAA,eAAbA,aAAA,CAAeG,gBAAgB,GAAE;IACpC;EACF;EAEA,MAAMC,QAAwB,GAAG,EAAE;EACnC,KAAK,MAAMC,eAAe,IAAIP,QAAQ,CAACQ,IAAI,CAACC,WAAW,IAAI,EAAE,EAAE;IAC7DH,QAAQ,CAACI,IAAI,CAACC,uBAAuB,CAACR,UAAU,EAAEI,eAAe,CAAC,CAAC;EACrE;EAGA,MAAMK,OAAO,CAACC,GAAG,CAACP,QAAQ,CAAC;EAG3BH,UAAU,CAACW,eAAe,CAACjB,uBAAuB,CAAC;AACrD;AAGA,eAAec,uBAAuBA,CACpCR,UAA0B,EAC1BY,UAA0B,EACX;EACf,MAAMC,gBAAgB,GAAGb,UAAU,CAACc,kBAAkB,CACpDF,UAAU,EACVlB,uBACF,CAAC;EACD,IAAImB,gBAAgB,EAAE;IACpB,MAAM;MACJrB,UAAU,GAAG,CAAC;MACduB,UAAU,GAAG,CAAC;MACdC,UAAU;MACVC,KAAK;MACLC,IAAI;MACJzB,MAAM,GAAG,MAAM;MACf0B,MAAM,EAAEC;IACV,CAAC,GAAGP,gBAAgB;IACpB,MAAMM,MAAM,GAAGnB,UAAU,CAACC,IAAI,CAACoB,OAAO,CAACD,WAAW,CAAC;IAEnD,MAAME,MAAM,GAAG,IAAIC,UAAU,CAACJ,MAAM,CAACK,WAAW,EAAEL,MAAM,CAAC3B,UAAU,GAAGA,UAAU,EAAEuB,UAAU,CAAC;IAC7F,MAAMU,MAAM,GAAG,IAAIF,UAAU,CAC3BvB,UAAU,CAACC,IAAI,CAACoB,OAAO,CAACT,UAAU,CAACO,MAAM,CAAC,CAACK,WAAW,EACtDZ,UAAU,CAACpB,UAAU,EACrBoB,UAAU,CAACG,UACb,CAAC;IACD,MAAMzB,uBAAuB,CAACmC,MAAM,EAAER,KAAK,EAAED,UAAU,EAAEM,MAAM,EAAEJ,IAAI,EAAEzB,MAAM,CAAC;IAC9EO,UAAU,CAAC0B,qBAAqB,CAACd,UAAU,EAAElB,uBAAuB,CAAC;EACvE;AACF"}
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":"AAOA,SAAQA,SAAS,EAAEC,gBAAgB,QAAO,0BAA0B;AACpE,SAAQC,WAAW,QAAO,oBAAoB;AAC9C,SAAQC,WAAW,EAAEC,0BAA0B,QAAO,sBAAsB;AAE5E,SAAQC,MAAM,QAAO,iBAAiB;AACtC,SAAQC,KAAK,EAAEC,YAAY,QAAO,aAAa;AAC/C,SAAQC,UAAU,QAAO,2BAA2B;AACpD,SAAQC,0BAA0B,QAAO,+BAA+B;AACxE,SAAQC,oBAAoB,EAAEC,gBAAgB,QAAO,wBAAwB;AAC7E,SAAQC,eAAe,QAAO,0BAA0B;AAexD,OAAO,SAASC,MAAMA,CAACC,WAAwB,EAAEC,OAA0B,EAAW;EACpF,MAAMC,UAAU,GAAG,CAAC;EACpB,OAAOV,KAAK,CAACQ,WAAW,EAAEE,UAAU,EAAED,OAAO,CAAC;AAChD;AAEA,OAAO,eAAeE,SAASA,CAC7BC,IAAqB,EACrBC,mBAAmB,EAIO;EAAA,IAAAC,aAAA,EAAAC,cAAA,EAAAC,cAAA;EAAA,IAH1BN,UAAU,GAAAO,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC;EAAA,IACdR,OAA0B,GAAAQ,SAAA,CAAAC,MAAA,OAAAD,SAAA,MAAAE,SAAA;EAAA,IAC1BC,OAAsB,GAAAH,SAAA,CAAAC,MAAA,OAAAD,SAAA,MAAAE,SAAA;EAEtBE,sBAAsB,CAACT,IAAI,EAAEC,mBAAmB,EAAEH,UAAU,EAAED,OAAO,CAAC;EAEtEH,eAAe,CAACM,IAAI,EAAE;IAACU,SAAS,EAAEb,OAAO,aAAPA,OAAO,wBAAAK,aAAA,GAAPL,OAAO,CAAEG,IAAI,cAAAE,aAAA,uBAAbA,aAAA,CAAeQ;EAAS,CAAC,CAAC;EAE5DlB,oBAAoB,CAACQ,IAAI,EAAEH,OAAO,EAAEW,OAAO,CAAC;EAG5C,IAAIX,OAAO,aAAPA,OAAO,gBAAAM,cAAA,GAAPN,OAAO,CAAEG,IAAI,cAAAG,cAAA,eAAbA,cAAA,CAAeQ,WAAW,IAAIX,IAAI,CAACY,IAAI,CAACC,OAAO,EAAE;IACnD,MAAMF,WAAW,CAACX,IAAI,EAAEH,OAAO,EAAEW,OAAO,CAAC;EAC3C;EAIA,IAAIX,OAAO,aAAPA,OAAO,gBAAAO,cAAA,GAAPP,OAAO,CAAEG,IAAI,cAAAI,cAAA,eAAbA,cAAA,CAAeU,UAAU,EAAE;IAC7B,MAAMA,UAAU,CAACd,IAAI,EAAEH,OAAO,EAAEW,OAAO,CAAC;EAC1C;EAEA,MAAMf,gBAAgB,CAACO,IAAI,EAAEH,OAAO,EAAEW,OAAO,CAAC;EAE9C,OAAOR,IAAI;AACb;AASA,SAASS,sBAAsBA,CAACT,IAAI,EAAEe,IAAI,EAAEjB,UAAU,EAAED,OAAO,EAAE;EAE/D,IAAIA,OAAO,CAACmB,GAAG,EAAE;IACfhB,IAAI,CAACiB,OAAO,GAAGpB,OAAO,CAACmB,GAAG;EAC5B;EAGA,IAAID,IAAI,YAAYG,WAAW,IAAI,CAAC9B,KAAK,CAAC2B,IAAI,EAAEjB,UAAU,EAAED,OAAO,CAAC,EAAE;IACpE,MAAMsB,WAAW,GAAG,IAAIC,WAAW,CAAC,CAAC;IACrCL,IAAI,GAAGI,WAAW,CAACE,MAAM,CAACN,IAAI,CAAC;EACjC;EAEA,IAAI,OAAOA,IAAI,KAAK,QAAQ,EAAE;IAE5Bf,IAAI,CAACY,IAAI,GAAG9B,SAAS,CAACiC,IAAI,CAAC;EAC7B,CAAC,MAAM,IAAIA,IAAI,YAAYG,WAAW,EAAE;IAEtC,MAAMI,GAAQ,GAAG,CAAC,CAAQ;IAC1BxB,UAAU,GAAGT,YAAY,CAACiC,GAAG,EAAEP,IAAI,EAAEjB,UAAU,EAAED,OAAO,CAACyB,GAAG,CAAC;IAE7DnC,MAAM,CAACmC,GAAG,CAACC,IAAI,KAAK,MAAM,8BAAAC,MAAA,CAA8BF,GAAG,CAACC,IAAI,CAAE,CAAC;IAEnEvB,IAAI,CAACyB,IAAI,GAAGH,GAAG;IACftB,IAAI,CAACY,IAAI,GAAGU,GAAG,CAACV,IAAI;EACtB,CAAC,MAAM;IACLzB,MAAM,CAAC,KAAK,EAAE,qCAAqC,CAAC;EACtD;EAIA,MAAM0B,OAAO,GAAGb,IAAI,CAACY,IAAI,CAACC,OAAO,IAAI,EAAE;EACvCb,IAAI,CAACa,OAAO,GAAG,IAAIa,KAAK,CAACb,OAAO,CAACP,MAAM,CAAC,CAACqB,IAAI,CAAC,IAAI,CAAC;EAGnD,IAAI3B,IAAI,CAACyB,IAAI,IAAIzB,IAAI,CAACyB,IAAI,CAACG,MAAM,CAACC,WAAW,EAAE;IAC7C,MAAM;MAACC;IAAS,CAAC,GAAG9B,IAAI,CAACyB,IAAI;IAC7BzB,IAAI,CAACa,OAAO,CAAC,CAAC,CAAC,GAAG;MAChBjB,WAAW,EAAEkC,SAAS,CAAC,CAAC,CAAC,CAAClC,WAAW;MACrCE,UAAU,EAAEgC,SAAS,CAAC,CAAC,CAAC,CAAChC,UAAU;MACnCiC,UAAU,EAAED,SAAS,CAAC,CAAC,CAAC,CAACC;IAC3B,CAAC;EAKH;EAGA,MAAMC,MAAM,GAAGhC,IAAI,CAACY,IAAI,CAACoB,MAAM,IAAI,EAAE;EACrChC,IAAI,CAACgC,MAAM,GAAG,IAAIN,KAAK,CAACM,MAAM,CAAC1B,MAAM,CAAC,CAACqB,IAAI,CAAC,CAAC,CAAC,CAAC;AACjD;AAKA,eAAehB,WAAWA,CAACX,IAAqB,EAAEH,OAAO,EAAEW,OAAsB,EAAE;EAEjF,MAAMK,OAAO,GAAGb,IAAI,CAACY,IAAI,CAACC,OAAO,IAAI,EAAE;EACvC,KAAK,IAAIoB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGpB,OAAO,CAACP,MAAM,EAAE,EAAE2B,CAAC,EAAE;IACvC,MAAMC,MAAM,GAAGrB,OAAO,CAACoB,CAAC,CAAC;IACzB,IAAIC,MAAM,CAAClB,GAAG,EAAE;MAAA,IAAAmB,cAAA,EAAAC,qBAAA;MACd,MAAM;QAACC;MAAK,CAAC,GAAG7B,OAAO;MACvBrB,MAAM,CAACkD,KAAK,CAAC;MAEb,MAAMrB,GAAG,GAAG1B,UAAU,CAAC4C,MAAM,CAAClB,GAAG,EAAEnB,OAAO,CAAC;MAC3C,MAAMyC,QAAQ,GAAG,OAAM9B,OAAO,aAAPA,OAAO,wBAAA2B,cAAA,GAAP3B,OAAO,CAAE6B,KAAK,cAAAF,cAAA,uBAAdA,cAAA,CAAAI,IAAA,CAAA/B,OAAO,EAAUQ,GAAG,CAAC;MAC5C,MAAMpB,WAAW,GAAG,OAAM0C,QAAQ,aAARA,QAAQ,wBAAAF,qBAAA,GAARE,QAAQ,CAAE1C,WAAW,cAAAwC,qBAAA,uBAArBA,qBAAA,CAAAG,IAAA,CAAAD,QAAwB,CAAC;MAEnDtC,IAAI,CAACa,OAAO,CAACoB,CAAC,CAAC,GAAG;QAChBrC,WAAW;QACXE,UAAU,EAAE,CAAC;QACbiC,UAAU,EAAEnC,WAAW,CAACmC;MAC1B,CAAC;MAED,OAAOG,MAAM,CAAClB,GAAG;IACnB,CAAC,MAAM,IAAIhB,IAAI,CAACa,OAAO,CAACoB,CAAC,CAAC,KAAK,IAAI,EAAE;MACnCjC,IAAI,CAACa,OAAO,CAACoB,CAAC,CAAC,GAAG;QAChBrC,WAAW,EAAE,IAAIsB,WAAW,CAACgB,MAAM,CAACH,UAAU,CAAC;QAC/CjC,UAAU,EAAE,CAAC;QACbiC,UAAU,EAAEG,MAAM,CAACH;MACrB,CAAC;IACH;EACF;AACF;AAUA,eAAejB,UAAUA,CAACd,IAAqB,EAAEH,OAAO,EAAEW,OAAsB,EAAE;EAChF,MAAMgC,YAAY,GAAGC,yBAAyB,CAACzC,IAAI,CAAC;EAEpD,MAAMgC,MAAM,GAAGhC,IAAI,CAACY,IAAI,CAACoB,MAAM,IAAI,EAAE;EAErC,MAAMU,QAAwB,GAAG,EAAE;EACnC,KAAK,MAAMC,UAAU,IAAIH,YAAY,EAAE;IACrCE,QAAQ,CAACE,IAAI,CAACC,SAAS,CAAC7C,IAAI,EAAEgC,MAAM,CAACW,UAAU,CAAC,EAAEA,UAAU,EAAE9C,OAAO,EAAEW,OAAO,CAAC,CAAC;EAClF;EAEA,OAAO,MAAMsC,OAAO,CAACC,GAAG,CAACL,QAAQ,CAAC;AACpC;AAGA,SAASD,yBAAyBA,CAACzC,IAAqB,EAAY;EAClE,MAAMwC,YAAY,GAAG,IAAIQ,GAAG,CAAS,CAAC;EAEtC,MAAMC,QAAQ,GAAGjD,IAAI,CAACY,IAAI,CAACqC,QAAQ,IAAI,EAAE;EACzC,KAAK,MAAMC,OAAO,IAAID,QAAQ,EAAE;IAC9B,IAAIC,OAAO,CAACC,MAAM,KAAK5C,SAAS,EAAE;MAChCiC,YAAY,CAACY,GAAG,CAACF,OAAO,CAACC,MAAM,CAAC;IAClC;EACF;EAEA,OAAOzB,KAAK,CAAC2B,IAAI,CAACb,YAAY,CAAC,CAACc,IAAI,CAAC,CAAC;AACxC;AAGA,eAAeT,SAASA,CACtB7C,IAAqB,EACrBuD,KAAK,EACLC,KAAa,EACb3D,OAAO,EACPW,OAAsB,EACtB;EACA,MAAM;IAAC6B,KAAK;IAAEoB;EAAK,CAAC,GAAGjD,OAAO;EAE9B,IAAIZ,WAAW;EAEf,IAAI2D,KAAK,CAACvC,GAAG,IAAI,CAACuC,KAAK,CAACG,cAAc,CAAC,YAAY,CAAC,EAAE;IACpD,MAAM1C,GAAG,GAAG1B,UAAU,CAACiE,KAAK,CAACvC,GAAG,EAAEnB,OAAO,CAAC;IAC1C,MAAMyC,QAAQ,GAAG,MAAMD,KAAK,CAACrB,GAAG,CAAC;IACjCpB,WAAW,GAAG,MAAM0C,QAAQ,CAAC1C,WAAW,CAAC,CAAC;IAC1C2D,KAAK,CAACI,UAAU,GAAG;MACjB5C,IAAI,EAAEnB;IACR,CAAC;EACH;EAEA,IAAIgE,MAAM,CAACC,QAAQ,CAACN,KAAK,CAACI,UAAU,CAAC,EAAE;IACrC,MAAMG,KAAK,GAAGvE,0BAA0B,CAACS,IAAI,CAACY,IAAI,EAAEZ,IAAI,CAACa,OAAO,EAAE0C,KAAK,CAACI,UAAU,CAAC;IACnF/D,WAAW,GAAGb,gBAAgB,CAAC+E,KAAK,CAAC5B,MAAM,EAAE4B,KAAK,CAAChE,UAAU,EAAEgE,KAAK,CAAC/B,UAAU,CAAC;EAClF;EAEA5C,MAAM,CAACS,WAAW,EAAE,wBAAwB,CAAC;EAG7C,IAAImE,WAAW,GAAG,MAAMN,KAAK,CAC3B7D,WAAW,EACX,CAACZ,WAAW,EAAEC,WAAW,CAAC,EAC1B;IAAC+E,QAAQ,EAAET,KAAK,CAACS,QAAQ;IAAEC,KAAK,EAAEpE,OAAO,CAACoE,KAAK,IAAI;MAACC,MAAM,EAAEhF,0BAA0B,CAAC;IAAC;EAAC,CAAC,EAC1FsB,OACF,CAAC;EAED,IAAIuD,WAAW,IAAIA,WAAW,CAAC,CAAC,CAAC,EAAE;IACjCA,WAAW,GAAG;MACZI,UAAU,EAAE,IAAI;MAChBC,OAAO,EAAE,KAAK;MACdC,KAAK,EAAEN,WAAW,CAAC,CAAC,CAAC,CAACM,KAAK;MAC3BC,MAAM,EAAEP,WAAW,CAAC,CAAC,CAAC,CAACO,MAAM;MAC7BvD,IAAI,EAAEgD,WAAW,CAAC,CAAC;IACrB,CAAC;EACH;EAKA/D,IAAI,CAACgC,MAAM,GAAGhC,IAAI,CAACgC,MAAM,IAAI,EAAE;EAC/BhC,IAAI,CAACgC,MAAM,CAACwB,KAAK,CAAC,GAAGO,WAAW;AAClC"}
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.18" !== 'undefined' ? "4.0.0-alpha.18" : 'latest';
1
+ export const VERSION = typeof "4.0.0-alpha.20" !== 'undefined' ? "4.0.0-alpha.20" : '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], { mimeType: image.mimeType, basis: options.basis || { format: (0, textures_1.selectSupportedBasisFormat)() } }, context);
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.18",
3
+ "version": "4.0.0-alpha.20",
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.18",
38
- "@loaders.gl/images": "4.0.0-alpha.18",
39
- "@loaders.gl/loader-utils": "4.0.0-alpha.18",
40
- "@loaders.gl/textures": "4.0.0-alpha.18",
37
+ "@loaders.gl/draco": "4.0.0-alpha.20",
38
+ "@loaders.gl/images": "4.0.0-alpha.20",
39
+ "@loaders.gl/loader-utils": "4.0.0-alpha.20",
40
+ "@loaders.gl/textures": "4.0.0-alpha.20",
41
41
  "@math.gl/core": "^3.5.1"
42
42
  },
43
- "gitHead": "7bc633f46560f661bdd46cf1015ea27b3694ebce"
43
+ "gitHead": "ac122e83102657c38207d59c631a5ce4e7aa46bd"
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
- {mimeType: image.mimeType, basis: options.basis || {format: selectSupportedBasisFormat()}},
225
+ {
226
+ ...options,
227
+ mimeType: image.mimeType,
228
+ basis: options.basis || {format: selectSupportedBasisFormat()}
229
+ },
226
230
  context
227
231
  );
228
232