@loaders.gl/gltf 3.3.0-alpha.2 → 3.3.0-alpha.4

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
@@ -5169,7 +5169,7 @@
5169
5169
  metallicFactor: 1,
5170
5170
  roughnessFactor: 1
5171
5171
  };
5172
- const textureId = material.values?.tex || material.values?.texture2d_0;
5172
+ const textureId = material.values?.tex || material.values?.texture2d_0 || material.values?.diffuseTex;
5173
5173
  const textureIndex = json.textures.findIndex((texture) => texture.id === textureId);
5174
5174
  if (textureIndex !== -1) {
5175
5175
  material.pbrMetallicRoughness.baseColorTexture = { index: textureIndex };
@@ -5712,10 +5712,13 @@
5712
5712
  async function loadImage(gltf, image, index, options, context) {
5713
5713
  const { fetch: fetch2, parse: parse4 } = context;
5714
5714
  let arrayBuffer;
5715
- if (image.uri) {
5715
+ if (image.uri && !image.hasOwnProperty("bufferView")) {
5716
5716
  const uri = resolveUrl(image.uri, options);
5717
5717
  const response = await fetch2(uri);
5718
5718
  arrayBuffer = await response.arrayBuffer();
5719
+ image.bufferView = {
5720
+ data: arrayBuffer
5721
+ };
5719
5722
  }
5720
5723
  if (Number.isFinite(image.bufferView)) {
5721
5724
  const array = getTypedArrayForBufferView(gltf.json, gltf.buffers, image.bufferView);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA;;AACA;;AAGA;;AACA;;AAGA;;AACA","sourcesContent":["/* eslint-disable camelcase, indent */\nexport type {GLB} from './lib/types/glb-types';\nexport type {\n GLTF,\n GLTFAccessor,\n GLTFBuffer,\n GLTFBufferView,\n GLTFMeshPrimitive,\n GLTFMesh,\n GLTFNode,\n GLTFMaterial,\n GLTFSampler,\n GLTFScene,\n GLTFSkin,\n GLTFTexture,\n GLTFImage,\n GLTFPostprocessed,\n GLTFNodePostprocessed,\n GLTFMaterialPostprocessed,\n GLTFImagePostprocessed,\n // The following extensions are handled by the GLTFLoader and removed from the parsed glTF (disable via options.gltf.excludeExtensions)\n GLTF_KHR_binary_glTF,\n GLTF_KHR_draco_mesh_compression,\n GLTF_KHR_texture_basisu,\n GLTF_EXT_meshopt_compression,\n GLTF_EXT_texture_webp,\n GLTF_EXT_feature_metadata\n} from './lib/types/gltf-types';\n\n// glTF loader/writer definition objects\nexport {GLTFLoader} from './gltf-loader';\nexport {GLTFWriter} from './gltf-writer';\n\n// GLB Loader & Writer (for custom formats that want to leverage the GLB binary \"envelope\")\nexport {GLBLoader} from './glb-loader';\nexport {GLBWriter} from './glb-writer';\n\n// glTF Data Access Helper Class\nexport {default as GLTFScenegraph} from './lib/api/gltf-scenegraph';\nexport {postProcessGLTF} from './lib/api/post-process-gltf';\nexport type {Mesh} from './lib/types/gltf-json-schema';\nexport type {GLTFObject} from './lib/types/gltf-types';\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA;;AACA;;AAGA;;AACA;;AAGA;;AACA","sourcesContent":["/* eslint-disable camelcase, indent */\nexport type {GLB} from './lib/types/glb-types';\nexport type {\n GLTF,\n GLTFAccessor,\n GLTFBuffer,\n GLTFBufferView,\n GLTFMeshPrimitive,\n GLTFMesh,\n GLTFNode,\n GLTFMaterial,\n GLTFSampler,\n GLTFScene,\n GLTFSkin,\n GLTFTexture,\n GLTFImage,\n GLTFPostprocessed,\n GLTFAccessorPostprocessed,\n GLTFNodePostprocessed,\n GLTFMaterialPostprocessed,\n GLTFMeshPostprocessed,\n GLTFMeshPrimitivePostprocessed,\n GLTFImagePostprocessed,\n GLTFTexturePostprocessed,\n // The following extensions are handled by the GLTFLoader and removed from the parsed glTF (disable via options.gltf.excludeExtensions)\n GLTF_KHR_binary_glTF,\n GLTF_KHR_draco_mesh_compression,\n GLTF_KHR_texture_basisu,\n GLTF_EXT_meshopt_compression,\n GLTF_EXT_texture_webp,\n GLTF_EXT_feature_metadata\n} from './lib/types/gltf-types';\n\n// glTF loader/writer definition objects\nexport {GLTFLoader} from './gltf-loader';\nexport {GLTFWriter} from './gltf-writer';\n\n// GLB Loader & Writer (for custom formats that want to leverage the GLB binary \"envelope\")\nexport {GLBLoader} from './glb-loader';\nexport {GLBWriter} from './glb-writer';\n\n// glTF Data Access Helper Class\nexport {default as GLTFScenegraph} from './lib/api/gltf-scenegraph';\nexport {postProcessGLTF} from './lib/api/post-process-gltf';\nexport type {Mesh} from './lib/types/gltf-json-schema';\nexport type {GLTFObject} from './lib/types/gltf-types';\nexport type {Node, Accessor, Image} from './lib/types/gltf-postprocessed-schema';\n"],"file":"index.js"}
@@ -354,7 +354,7 @@ var GLTFV1Normalizer = function () {
354
354
 
355
355
  try {
356
356
  var _loop = function _loop() {
357
- var _material$values, _material$values2;
357
+ var _material$values, _material$values2, _material$values3;
358
358
 
359
359
  var material = _step8.value;
360
360
  material.pbrMetallicRoughness = {
@@ -362,7 +362,7 @@ var GLTFV1Normalizer = function () {
362
362
  metallicFactor: 1,
363
363
  roughnessFactor: 1
364
364
  };
365
- var textureId = ((_material$values = material.values) === null || _material$values === void 0 ? void 0 : _material$values.tex) || ((_material$values2 = material.values) === null || _material$values2 === void 0 ? void 0 : _material$values2.texture2d_0);
365
+ var textureId = ((_material$values = material.values) === null || _material$values === void 0 ? void 0 : _material$values.tex) || ((_material$values2 = material.values) === null || _material$values2 === void 0 ? void 0 : _material$values2.texture2d_0) || ((_material$values3 = material.values) === null || _material$values3 === void 0 ? void 0 : _material$values3.diffuseTex);
366
366
  var textureIndex = json.textures.findIndex(function (texture) {
367
367
  return texture.id === textureId;
368
368
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/api/normalize-gltf-v1.ts"],"names":["GLTF_ARRAYS","accessors","animations","buffers","bufferViews","images","materials","meshes","nodes","samplers","scenes","skins","textures","GLTF_KEYS","accessor","buffer","bufferView","image","material","mesh","node","sampler","scene","skin","texture","GLTFV1Normalizer","gltf","options","json","asset","version","undefined","console","warn","normalize","Error","_addAsset","_convertTopLevelObjectsToArrays","KHR_binary_glTF","preprocess","_convertObjectIdsToArrayIndices","_updateObjects","_updateMaterial","generator","arrayName","_convertTopLevelObjectToArray","mapName","objectMap","Array","isArray","id","object","index","length","push","idToIndexMap","_convertIdsToIndices","_convertIdToIndex","_convertTextureIds","_convertMeshIds","_convertNodeIds","_convertSceneIds","source","primitives","primitive","attributes","indices","attributeName","children","map","child","topLevelArrayName","key","Number","isFinite","type","pbrMetallicRoughness","baseColorFactor","metallicFactor","roughnessFactor","textureId","values","tex","texture2d_0","textureIndex","findIndex","baseColorTexture","normalizeGLTFV1"],"mappings":"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","sourcesContent":["/* eslint-disable camelcase */\nimport * as KHR_binary_glTF from '../extensions/KHR_binary_gltf';\n\n// Binary format changes (mainly implemented by GLBLoader)\n// https://github.com/KhronosGroup/glTF/tree/master/extensions/1.0/Khronos/KHR_binary_glTF\n\n// JSON format changes:\n// https://github.com/khronosgroup/gltf/issues/605\n\n// - [x] Top-level JSON objects are arrays now\n// - [ ] Removed indirection from animation: sampler now refers directly to accessors, #712\n// - [ ] material.parameter.value and technique.parameter.value must be an array, #690\n// - [ ] Node can have only one mesh #821\n// - [ ] Added reqs on JSON encoding\n// - [ ] Added reqs on binary data alignment #802 (comment)\n\n// Additions:\n// - [ ] Added accessor.normalized, #691, #706\n// - [ ] Added glExtensionsUsed property and 5125 (UNSIGNED_INT) accessor.componentType value, #619\n// - [ ] Added extensionsRequired property, #720, #721\n// - [ ] Added \"STEP\" as valid animation.sampler.interpolation value, #712\n\n// Removals:\n// - [x] Removed buffer.type, #786, #629\n// - [ ] Removed revision number from profile.version, #709\n// - [ ] Removed technique.functions.scissor and removed 3089 (SCISSOR_TEST) as a valid value for technique.states.enable, #681\n// - [ ] Techniques, programs, and shaders were moved out to KHR_technique_webgl extension.\n\n// Other edits:\n// - [x] asset is now required, #642\n// - [ ] buffer.byteLength and bufferView.byteLength are now required, #560.\n// - [ ] accessor.min and accessor.max are now required, #593, and clarified that the JSON value and binary data must be the same, #628.\n// - [ ] Clarified animation.sampler and animation.channel restrictions, #712\n// - [ ] skin.inverseBindMatrices is now optional, #461.\n// - [ ] Attribute parameters can't have a value defined in the technique or parameter, #563 (comment).\n// - [ ] Only TEXCOORD and COLOR attribute semantics can be written in the form [semantic]_[set_index], #563 (comment).\n// - [ ] TEXCOORD and COLOR attribute semantics must be written in the form [semantic]_[set_index], e.g., just TEXCOORD should be TEXCOORD_0, and just COLOR should be COLOR_0, #649\n// - [ ] camera.perspective.aspectRatio and camera.perspective.yfov must now be > 0, not >= 0, #563 (comment).\n// - [ ] Application-specific parameter semantics must start with an underscore, e.g., _TEMPERATURE and _SIMULATION_TIME, #563 (comment).\n// - [ ] Properties in technique.parameters must be defined in technique.uniforms or technique.attributes,\n\n// #563 (comment).\n// - [ ] technique.parameter.count can only be defined when the semantic is JOINTMATRIX or an application-specific semantic is used. It can never be defined for attribute parameters; only uniforms, d2f6945\n// - [ ] technique.parameter.semantic is required when the parameter is an attribute, 28e113d\n// - [ ] Mesh-only models are allowed, e.g., without materials, #642\n// - [ ] Skeleton hierarchies (nodes containing jointName) must be separated from non-skeleton hierarchies., #647\n// - [ ] technique.states.functions.blendColor and technique.states.functions.depthRange parameters now must match WebGL function min/max, #707\n\nconst GLTF_ARRAYS = {\n accessors: 'accessor',\n animations: 'animation',\n buffers: 'buffer',\n bufferViews: 'bufferView',\n images: 'image',\n materials: 'material',\n meshes: 'mesh',\n nodes: 'node',\n samplers: 'sampler',\n scenes: 'scene',\n skins: 'skin',\n textures: 'texture'\n};\n\nconst GLTF_KEYS = {\n accessor: 'accessors',\n animations: 'animation',\n buffer: 'buffers',\n bufferView: 'bufferViews',\n image: 'images',\n material: 'materials',\n mesh: 'meshes',\n node: 'nodes',\n sampler: 'samplers',\n scene: 'scenes',\n skin: 'skins',\n texture: 'textures'\n};\n\n/**\n * Converts (normalizes) glTF v1 to v2\n */\nclass GLTFV1Normalizer {\n idToIndexMap = {\n animations: {},\n accessors: {},\n buffers: {},\n bufferViews: {},\n images: {},\n materials: {},\n meshes: {},\n nodes: {},\n samplers: {},\n scenes: {},\n skins: {},\n textures: {}\n };\n\n json;\n\n // constructor() {}\n\n /**\n * Convert (normalize) glTF < 2.0 to glTF 2.0\n * @param gltf - object with json and binChunks\n * @param options\n * @param options normalize Whether to actually normalize\n */\n normalize(gltf, options) {\n this.json = gltf.json;\n const json = gltf.json;\n\n // Check version\n switch (json.asset && json.asset.version) {\n // We are converting to v2 format. Return if there is nothing to do\n case '2.0':\n return;\n\n // This class is written to convert 1.0\n case undefined:\n case '1.0':\n break;\n\n default:\n // eslint-disable-next-line no-undef, no-console\n console.warn(`glTF: Unknown version ${json.asset.version}`);\n return;\n }\n\n if (!options.normalize) {\n // We are still missing a few conversion tricks, remove once addressed\n throw new Error('glTF v1 is not supported.');\n }\n\n // eslint-disable-next-line no-undef, no-console\n console.warn('Converting glTF v1 to glTF v2 format. This is experimental and may fail.');\n\n this._addAsset(json);\n\n // In glTF2 top-level fields are Arrays not Object maps\n this._convertTopLevelObjectsToArrays(json);\n\n // Extract bufferView indices for images\n // (this extension needs to be invoked early in the normalization process)\n // TODO can this be handled by standard extension processing instead of called explicitly?\n KHR_binary_glTF.preprocess(gltf);\n\n // Convert object references from ids to indices\n this._convertObjectIdsToArrayIndices(json);\n\n this._updateObjects(json);\n\n this._updateMaterial(json);\n }\n\n // asset is now required, #642 https://github.com/KhronosGroup/glTF/issues/639\n _addAsset(json) {\n json.asset = json.asset || {};\n // We are normalizing to glTF v2, so change version to \"2.0\"\n json.asset.version = '2.0';\n json.asset.generator = json.asset.generator || 'Normalized to glTF 2.0 by loaders.gl';\n }\n\n _convertTopLevelObjectsToArrays(json) {\n // TODO check that all arrays are covered\n for (const arrayName in GLTF_ARRAYS) {\n this._convertTopLevelObjectToArray(json, arrayName);\n }\n }\n\n /** Convert one top level object to array */\n _convertTopLevelObjectToArray(json, mapName) {\n const objectMap = json[mapName];\n if (!objectMap || Array.isArray(objectMap)) {\n return;\n }\n\n // Rewrite the top-level field as an array\n json[mapName] = [];\n // Copy the map key into object.id\n for (const id in objectMap) {\n const object = objectMap[id];\n object.id = object.id || id; // Mutates the loaded object\n const index = json[mapName].length;\n json[mapName].push(object);\n this.idToIndexMap[mapName][id] = index;\n }\n }\n\n /** Go through all objects in all top-level arrays and replace ids with indices */\n _convertObjectIdsToArrayIndices(json) {\n for (const arrayName in GLTF_ARRAYS) {\n this._convertIdsToIndices(json, arrayName);\n }\n if ('scene' in json) {\n json.scene = this._convertIdToIndex(json.scene, 'scene');\n }\n\n // Convert any index references that are not using array names\n\n // texture.source (image)\n for (const texture of json.textures) {\n this._convertTextureIds(texture);\n }\n for (const mesh of json.meshes) {\n this._convertMeshIds(mesh);\n }\n for (const node of json.nodes) {\n this._convertNodeIds(node);\n }\n for (const node of json.scenes) {\n this._convertSceneIds(node);\n }\n }\n\n _convertTextureIds(texture) {\n if (texture.source) {\n texture.source = this._convertIdToIndex(texture.source, 'image');\n }\n }\n\n _convertMeshIds(mesh) {\n for (const primitive of mesh.primitives) {\n const {attributes, indices, material} = primitive;\n for (const attributeName in attributes) {\n attributes[attributeName] = this._convertIdToIndex(attributes[attributeName], 'accessor');\n }\n if (indices) {\n primitive.indices = this._convertIdToIndex(indices, 'accessor');\n }\n if (material) {\n primitive.material = this._convertIdToIndex(material, 'material');\n }\n }\n }\n\n _convertNodeIds(node) {\n if (node.children) {\n node.children = node.children.map((child) => this._convertIdToIndex(child, 'node'));\n }\n if (node.meshes) {\n node.meshes = node.meshes.map((mesh) => this._convertIdToIndex(mesh, 'mesh'));\n }\n }\n\n _convertSceneIds(scene) {\n if (scene.nodes) {\n scene.nodes = scene.nodes.map((node) => this._convertIdToIndex(node, 'node'));\n }\n }\n\n /** Go through all objects in a top-level array and replace ids with indices */\n _convertIdsToIndices(json, topLevelArrayName) {\n if (!json[topLevelArrayName]) {\n console.warn(`gltf v1: json doesn't contain attribute ${topLevelArrayName}`); // eslint-disable-line no-console, no-undef\n json[topLevelArrayName] = [];\n }\n for (const object of json[topLevelArrayName]) {\n for (const key in object) {\n const id = object[key];\n const index = this._convertIdToIndex(id, key);\n object[key] = index;\n }\n }\n }\n\n _convertIdToIndex(id, key) {\n const arrayName = GLTF_KEYS[key];\n if (arrayName in this.idToIndexMap) {\n const index = this.idToIndexMap[arrayName][id];\n if (!Number.isFinite(index)) {\n throw new Error(`gltf v1: failed to resolve ${key} with id ${id}`);\n }\n return index;\n }\n return id;\n }\n\n /**\n *\n * @param {*} json\n */\n _updateObjects(json) {\n for (const buffer of this.json.buffers) {\n // - [x] Removed buffer.type, #786, #629\n delete buffer.type;\n }\n }\n\n /**\n * Update material (set pbrMetallicRoughness)\n * @param {*} json\n */\n _updateMaterial(json) {\n for (const material of json.materials) {\n material.pbrMetallicRoughness = {\n baseColorFactor: [1, 1, 1, 1],\n metallicFactor: 1,\n roughnessFactor: 1\n };\n\n const textureId = material.values?.tex || material.values?.texture2d_0;\n const textureIndex = json.textures.findIndex((texture) => texture.id === textureId);\n if (textureIndex !== -1) {\n material.pbrMetallicRoughness.baseColorTexture = {index: textureIndex};\n }\n }\n }\n}\n\nexport function normalizeGLTFV1(gltf, options = {}) {\n return new GLTFV1Normalizer().normalize(gltf, options);\n}\n"],"file":"normalize-gltf-v1.js"}
1
+ {"version":3,"sources":["../../../../src/lib/api/normalize-gltf-v1.ts"],"names":["GLTF_ARRAYS","accessors","animations","buffers","bufferViews","images","materials","meshes","nodes","samplers","scenes","skins","textures","GLTF_KEYS","accessor","buffer","bufferView","image","material","mesh","node","sampler","scene","skin","texture","GLTFV1Normalizer","gltf","options","json","asset","version","undefined","console","warn","normalize","Error","_addAsset","_convertTopLevelObjectsToArrays","KHR_binary_glTF","preprocess","_convertObjectIdsToArrayIndices","_updateObjects","_updateMaterial","generator","arrayName","_convertTopLevelObjectToArray","mapName","objectMap","Array","isArray","id","object","index","length","push","idToIndexMap","_convertIdsToIndices","_convertIdToIndex","_convertTextureIds","_convertMeshIds","_convertNodeIds","_convertSceneIds","source","primitives","primitive","attributes","indices","attributeName","children","map","child","topLevelArrayName","key","Number","isFinite","type","pbrMetallicRoughness","baseColorFactor","metallicFactor","roughnessFactor","textureId","values","tex","texture2d_0","diffuseTex","textureIndex","findIndex","baseColorTexture","normalizeGLTFV1"],"mappings":"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","sourcesContent":["/* eslint-disable camelcase */\nimport * as KHR_binary_glTF from '../extensions/KHR_binary_gltf';\n\n// Binary format changes (mainly implemented by GLBLoader)\n// https://github.com/KhronosGroup/glTF/tree/master/extensions/1.0/Khronos/KHR_binary_glTF\n\n// JSON format changes:\n// https://github.com/khronosgroup/gltf/issues/605\n\n// - [x] Top-level JSON objects are arrays now\n// - [ ] Removed indirection from animation: sampler now refers directly to accessors, #712\n// - [ ] material.parameter.value and technique.parameter.value must be an array, #690\n// - [ ] Node can have only one mesh #821\n// - [ ] Added reqs on JSON encoding\n// - [ ] Added reqs on binary data alignment #802 (comment)\n\n// Additions:\n// - [ ] Added accessor.normalized, #691, #706\n// - [ ] Added glExtensionsUsed property and 5125 (UNSIGNED_INT) accessor.componentType value, #619\n// - [ ] Added extensionsRequired property, #720, #721\n// - [ ] Added \"STEP\" as valid animation.sampler.interpolation value, #712\n\n// Removals:\n// - [x] Removed buffer.type, #786, #629\n// - [ ] Removed revision number from profile.version, #709\n// - [ ] Removed technique.functions.scissor and removed 3089 (SCISSOR_TEST) as a valid value for technique.states.enable, #681\n// - [ ] Techniques, programs, and shaders were moved out to KHR_technique_webgl extension.\n\n// Other edits:\n// - [x] asset is now required, #642\n// - [ ] buffer.byteLength and bufferView.byteLength are now required, #560.\n// - [ ] accessor.min and accessor.max are now required, #593, and clarified that the JSON value and binary data must be the same, #628.\n// - [ ] Clarified animation.sampler and animation.channel restrictions, #712\n// - [ ] skin.inverseBindMatrices is now optional, #461.\n// - [ ] Attribute parameters can't have a value defined in the technique or parameter, #563 (comment).\n// - [ ] Only TEXCOORD and COLOR attribute semantics can be written in the form [semantic]_[set_index], #563 (comment).\n// - [ ] TEXCOORD and COLOR attribute semantics must be written in the form [semantic]_[set_index], e.g., just TEXCOORD should be TEXCOORD_0, and just COLOR should be COLOR_0, #649\n// - [ ] camera.perspective.aspectRatio and camera.perspective.yfov must now be > 0, not >= 0, #563 (comment).\n// - [ ] Application-specific parameter semantics must start with an underscore, e.g., _TEMPERATURE and _SIMULATION_TIME, #563 (comment).\n// - [ ] Properties in technique.parameters must be defined in technique.uniforms or technique.attributes,\n\n// #563 (comment).\n// - [ ] technique.parameter.count can only be defined when the semantic is JOINTMATRIX or an application-specific semantic is used. It can never be defined for attribute parameters; only uniforms, d2f6945\n// - [ ] technique.parameter.semantic is required when the parameter is an attribute, 28e113d\n// - [ ] Mesh-only models are allowed, e.g., without materials, #642\n// - [ ] Skeleton hierarchies (nodes containing jointName) must be separated from non-skeleton hierarchies., #647\n// - [ ] technique.states.functions.blendColor and technique.states.functions.depthRange parameters now must match WebGL function min/max, #707\n\nconst GLTF_ARRAYS = {\n accessors: 'accessor',\n animations: 'animation',\n buffers: 'buffer',\n bufferViews: 'bufferView',\n images: 'image',\n materials: 'material',\n meshes: 'mesh',\n nodes: 'node',\n samplers: 'sampler',\n scenes: 'scene',\n skins: 'skin',\n textures: 'texture'\n};\n\nconst GLTF_KEYS = {\n accessor: 'accessors',\n animations: 'animation',\n buffer: 'buffers',\n bufferView: 'bufferViews',\n image: 'images',\n material: 'materials',\n mesh: 'meshes',\n node: 'nodes',\n sampler: 'samplers',\n scene: 'scenes',\n skin: 'skins',\n texture: 'textures'\n};\n\n/**\n * Converts (normalizes) glTF v1 to v2\n */\nclass GLTFV1Normalizer {\n idToIndexMap = {\n animations: {},\n accessors: {},\n buffers: {},\n bufferViews: {},\n images: {},\n materials: {},\n meshes: {},\n nodes: {},\n samplers: {},\n scenes: {},\n skins: {},\n textures: {}\n };\n\n json;\n\n // constructor() {}\n\n /**\n * Convert (normalize) glTF < 2.0 to glTF 2.0\n * @param gltf - object with json and binChunks\n * @param options\n * @param options normalize Whether to actually normalize\n */\n normalize(gltf, options) {\n this.json = gltf.json;\n const json = gltf.json;\n\n // Check version\n switch (json.asset && json.asset.version) {\n // We are converting to v2 format. Return if there is nothing to do\n case '2.0':\n return;\n\n // This class is written to convert 1.0\n case undefined:\n case '1.0':\n break;\n\n default:\n // eslint-disable-next-line no-undef, no-console\n console.warn(`glTF: Unknown version ${json.asset.version}`);\n return;\n }\n\n if (!options.normalize) {\n // We are still missing a few conversion tricks, remove once addressed\n throw new Error('glTF v1 is not supported.');\n }\n\n // eslint-disable-next-line no-undef, no-console\n console.warn('Converting glTF v1 to glTF v2 format. This is experimental and may fail.');\n\n this._addAsset(json);\n\n // In glTF2 top-level fields are Arrays not Object maps\n this._convertTopLevelObjectsToArrays(json);\n\n // Extract bufferView indices for images\n // (this extension needs to be invoked early in the normalization process)\n // TODO can this be handled by standard extension processing instead of called explicitly?\n KHR_binary_glTF.preprocess(gltf);\n\n // Convert object references from ids to indices\n this._convertObjectIdsToArrayIndices(json);\n\n this._updateObjects(json);\n\n this._updateMaterial(json);\n }\n\n // asset is now required, #642 https://github.com/KhronosGroup/glTF/issues/639\n _addAsset(json) {\n json.asset = json.asset || {};\n // We are normalizing to glTF v2, so change version to \"2.0\"\n json.asset.version = '2.0';\n json.asset.generator = json.asset.generator || 'Normalized to glTF 2.0 by loaders.gl';\n }\n\n _convertTopLevelObjectsToArrays(json) {\n // TODO check that all arrays are covered\n for (const arrayName in GLTF_ARRAYS) {\n this._convertTopLevelObjectToArray(json, arrayName);\n }\n }\n\n /** Convert one top level object to array */\n _convertTopLevelObjectToArray(json, mapName) {\n const objectMap = json[mapName];\n if (!objectMap || Array.isArray(objectMap)) {\n return;\n }\n\n // Rewrite the top-level field as an array\n json[mapName] = [];\n // Copy the map key into object.id\n for (const id in objectMap) {\n const object = objectMap[id];\n object.id = object.id || id; // Mutates the loaded object\n const index = json[mapName].length;\n json[mapName].push(object);\n this.idToIndexMap[mapName][id] = index;\n }\n }\n\n /** Go through all objects in all top-level arrays and replace ids with indices */\n _convertObjectIdsToArrayIndices(json) {\n for (const arrayName in GLTF_ARRAYS) {\n this._convertIdsToIndices(json, arrayName);\n }\n if ('scene' in json) {\n json.scene = this._convertIdToIndex(json.scene, 'scene');\n }\n\n // Convert any index references that are not using array names\n\n // texture.source (image)\n for (const texture of json.textures) {\n this._convertTextureIds(texture);\n }\n for (const mesh of json.meshes) {\n this._convertMeshIds(mesh);\n }\n for (const node of json.nodes) {\n this._convertNodeIds(node);\n }\n for (const node of json.scenes) {\n this._convertSceneIds(node);\n }\n }\n\n _convertTextureIds(texture) {\n if (texture.source) {\n texture.source = this._convertIdToIndex(texture.source, 'image');\n }\n }\n\n _convertMeshIds(mesh) {\n for (const primitive of mesh.primitives) {\n const {attributes, indices, material} = primitive;\n for (const attributeName in attributes) {\n attributes[attributeName] = this._convertIdToIndex(attributes[attributeName], 'accessor');\n }\n if (indices) {\n primitive.indices = this._convertIdToIndex(indices, 'accessor');\n }\n if (material) {\n primitive.material = this._convertIdToIndex(material, 'material');\n }\n }\n }\n\n _convertNodeIds(node) {\n if (node.children) {\n node.children = node.children.map((child) => this._convertIdToIndex(child, 'node'));\n }\n if (node.meshes) {\n node.meshes = node.meshes.map((mesh) => this._convertIdToIndex(mesh, 'mesh'));\n }\n }\n\n _convertSceneIds(scene) {\n if (scene.nodes) {\n scene.nodes = scene.nodes.map((node) => this._convertIdToIndex(node, 'node'));\n }\n }\n\n /** Go through all objects in a top-level array and replace ids with indices */\n _convertIdsToIndices(json, topLevelArrayName) {\n if (!json[topLevelArrayName]) {\n console.warn(`gltf v1: json doesn't contain attribute ${topLevelArrayName}`); // eslint-disable-line no-console, no-undef\n json[topLevelArrayName] = [];\n }\n for (const object of json[topLevelArrayName]) {\n for (const key in object) {\n const id = object[key];\n const index = this._convertIdToIndex(id, key);\n object[key] = index;\n }\n }\n }\n\n _convertIdToIndex(id, key) {\n const arrayName = GLTF_KEYS[key];\n if (arrayName in this.idToIndexMap) {\n const index = this.idToIndexMap[arrayName][id];\n if (!Number.isFinite(index)) {\n throw new Error(`gltf v1: failed to resolve ${key} with id ${id}`);\n }\n return index;\n }\n return id;\n }\n\n /**\n *\n * @param {*} json\n */\n _updateObjects(json) {\n for (const buffer of this.json.buffers) {\n // - [x] Removed buffer.type, #786, #629\n delete buffer.type;\n }\n }\n\n /**\n * Update material (set pbrMetallicRoughness)\n * @param {*} json\n */\n _updateMaterial(json) {\n for (const material of json.materials) {\n material.pbrMetallicRoughness = {\n baseColorFactor: [1, 1, 1, 1],\n metallicFactor: 1,\n roughnessFactor: 1\n };\n\n const textureId =\n material.values?.tex || material.values?.texture2d_0 || material.values?.diffuseTex;\n const textureIndex = json.textures.findIndex((texture) => texture.id === textureId);\n if (textureIndex !== -1) {\n material.pbrMetallicRoughness.baseColorTexture = {index: textureIndex};\n }\n }\n }\n}\n\nexport function normalizeGLTFV1(gltf, options = {}) {\n return new GLTFV1Normalizer().normalize(gltf, options);\n}\n"],"file":"normalize-gltf-v1.js"}
@@ -304,8 +304,8 @@ function _loadImage() {
304
304
  case 0:
305
305
  fetch = context.fetch, parse = context.parse;
306
306
 
307
- if (!image.uri) {
308
- _context4.next = 9;
307
+ if (!(image.uri && !image.hasOwnProperty('bufferView'))) {
308
+ _context4.next = 10;
309
309
  break;
310
310
  }
311
311
 
@@ -320,15 +320,18 @@ function _loadImage() {
320
320
 
321
321
  case 8:
322
322
  arrayBuffer = _context4.sent;
323
+ image.bufferView = {
324
+ data: arrayBuffer
325
+ };
323
326
 
324
- case 9:
327
+ case 10:
325
328
  if (Number.isFinite(image.bufferView)) {
326
329
  array = (0, _getTypedArray.getTypedArrayForBufferView)(gltf.json, gltf.buffers, image.bufferView);
327
330
  arrayBuffer = (0, _loaderUtils.sliceArrayBuffer)(array.buffer, array.byteOffset, array.byteLength);
328
331
  }
329
332
 
330
333
  (0, _assert.assert)(arrayBuffer, 'glTF image has no data');
331
- _context4.next = 13;
334
+ _context4.next = 14;
332
335
  return parse(arrayBuffer, [_images.ImageLoader, _textures.BasisLoader], {
333
336
  mimeType: image.mimeType,
334
337
  basis: options.basis || {
@@ -336,7 +339,7 @@ function _loadImage() {
336
339
  }
337
340
  }, context);
338
341
 
339
- case 13:
342
+ case 14:
340
343
  parsedImage = _context4.sent;
341
344
 
342
345
  if (parsedImage && parsedImage[0]) {
@@ -352,7 +355,7 @@ function _loadImage() {
352
355
  gltf.images = gltf.images || [];
353
356
  gltf.images[index] = parsedImage;
354
357
 
355
- case 17:
358
+ case 18:
356
359
  case "end":
357
360
  return _context4.stop();
358
361
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/parsers/parse-gltf.ts"],"names":["isGLTF","arrayBuffer","options","byteOffset","parseGLTF","gltf","arrayBufferOrString","context","parseGLTFContainerSync","normalize","promises","loadBuffers","json","buffers","loadImages","promise","push","Promise","all","postProcess","data","uri","baseUri","ArrayBuffer","textDecoder","TextDecoder","decode","glb","type","_glb","Array","length","fill","header","hasBinChunk","binChunks","byteLength","images","i","buffer","fetch","response","imageIndices","getReferencesImageIndices","imageIndex","loadImage","Set","textures","texture","source","undefined","add","from","sort","image","index","parse","Number","isFinite","bufferView","array","ImageLoader","BasisLoader","mimeType","basis","format","parsedImage","compressed","mipmaps","width","height"],"mappings":"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","sourcesContent":["/* eslint-disable camelcase, max-statements, no-restricted-globals */\nimport type {LoaderContext} from '@loaders.gl/loader-utils';\nimport {BasisLoader, selectSupportedBasisFormat} from '@loaders.gl/textures';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\nimport type {GLB} from '../types/glb-types';\nimport type {GLTFWithBuffers} from '../types/gltf-types';\n\nimport {ImageLoader} from '@loaders.gl/images';\nimport {parseJSON, sliceArrayBuffer} from '@loaders.gl/loader-utils';\nimport {assert} from '../utils/assert';\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';\nimport {postProcessGLTF} from '../api/post-process-gltf';\nimport parseGLBSync, {isGLB} from './parse-glb';\n\nexport type GLTFParseOptions = {\n normalize?: boolean;\n loadImages?: boolean;\n loadBuffers?: boolean;\n decompressMeshes?: boolean;\n postProcess?: boolean;\n excludeExtensions?: string[];\n};\n\n// export type GLTFOptions = {\n// gltf?: GLTFParseOptions;\n// };\n\nexport function isGLTF(arrayBuffer, options?): 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) {\n parseGLTFContainerSync(gltf, arrayBufferOrString, byteOffset, options);\n\n normalizeGLTFV1(gltf, {normalize: options?.gltf?.normalize});\n\n preprocessExtensions(gltf, options, context);\n\n const promises: Promise<any>[] = [];\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 if (options?.gltf?.loadImages) {\n const promise = loadImages(gltf, options, context);\n promises.push(promise);\n }\n\n const promise = decodeExtensions(gltf, options, context);\n promises.push(promise);\n\n // Parallelize image loading and buffer loading/extension decoding\n await Promise.all(promises);\n\n // Post processing resolves indices to objects, buffers\n return options?.gltf?.postProcess ? postProcessGLTF(gltf, options) : gltf;\n}\n\n// `data` - can be ArrayBuffer (GLB), ArrayBuffer (Binary JSON), String (JSON), or Object (parsed JSON)\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) {\n const uri = resolveUrl(image.uri, options);\n const response = await fetch(uri);\n arrayBuffer = await response.arrayBuffer();\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"],"file":"parse-gltf.js"}
1
+ {"version":3,"sources":["../../../../src/lib/parsers/parse-gltf.ts"],"names":["isGLTF","arrayBuffer","options","byteOffset","parseGLTF","gltf","arrayBufferOrString","context","parseGLTFContainerSync","normalize","promises","loadBuffers","json","buffers","loadImages","promise","push","Promise","all","postProcess","data","uri","baseUri","ArrayBuffer","textDecoder","TextDecoder","decode","glb","type","_glb","Array","length","fill","header","hasBinChunk","binChunks","byteLength","images","i","buffer","fetch","response","imageIndices","getReferencesImageIndices","imageIndex","loadImage","Set","textures","texture","source","undefined","add","from","sort","image","index","parse","hasOwnProperty","bufferView","Number","isFinite","array","ImageLoader","BasisLoader","mimeType","basis","format","parsedImage","compressed","mipmaps","width","height"],"mappings":"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","sourcesContent":["/* eslint-disable camelcase, max-statements, no-restricted-globals */\nimport type {LoaderContext} from '@loaders.gl/loader-utils';\nimport {BasisLoader, selectSupportedBasisFormat} from '@loaders.gl/textures';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\nimport type {GLB} from '../types/glb-types';\nimport type {GLTFWithBuffers} from '../types/gltf-types';\n\nimport {ImageLoader} from '@loaders.gl/images';\nimport {parseJSON, sliceArrayBuffer} from '@loaders.gl/loader-utils';\nimport {assert} from '../utils/assert';\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';\nimport {postProcessGLTF} from '../api/post-process-gltf';\nimport parseGLBSync, {isGLB} from './parse-glb';\n\nexport type GLTFParseOptions = {\n normalize?: boolean;\n loadImages?: boolean;\n loadBuffers?: boolean;\n decompressMeshes?: boolean;\n postProcess?: boolean;\n excludeExtensions?: string[];\n};\n\n// export type GLTFOptions = {\n// gltf?: GLTFParseOptions;\n// };\n\nexport function isGLTF(arrayBuffer, options?): 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) {\n parseGLTFContainerSync(gltf, arrayBufferOrString, byteOffset, options);\n\n normalizeGLTFV1(gltf, {normalize: options?.gltf?.normalize});\n\n preprocessExtensions(gltf, options, context);\n\n const promises: Promise<any>[] = [];\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 if (options?.gltf?.loadImages) {\n const promise = loadImages(gltf, options, context);\n promises.push(promise);\n }\n\n const promise = decodeExtensions(gltf, options, context);\n promises.push(promise);\n\n // Parallelize image loading and buffer loading/extension decoding\n await Promise.all(promises);\n\n // Post processing resolves indices to objects, buffers\n return options?.gltf?.postProcess ? postProcessGLTF(gltf, options) : gltf;\n}\n\n// `data` - can be ArrayBuffer (GLB), ArrayBuffer (Binary JSON), String (JSON), or Object (parsed JSON)\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"],"file":"parse-gltf.js"}
@@ -4,6 +4,6 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.VERSION = void 0;
7
- var VERSION = typeof "3.3.0-alpha.2" !== 'undefined' ? "3.3.0-alpha.2" : 'latest';
7
+ var VERSION = typeof "3.3.0-alpha.4" !== 'undefined' ? "3.3.0-alpha.4" : 'latest';
8
8
  exports.VERSION = VERSION;
9
9
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts"],"names":["GLTFLoader","GLTFWriter","GLBLoader","GLBWriter","default","GLTFScenegraph","postProcessGLTF"],"mappings":"AA8BA,SAAQA,UAAR,QAAyB,eAAzB;AACA,SAAQC,UAAR,QAAyB,eAAzB;AAGA,SAAQC,SAAR,QAAwB,cAAxB;AACA,SAAQC,SAAR,QAAwB,cAAxB;AAGA,SAAQC,OAAO,IAAIC,cAAnB,QAAwC,2BAAxC;AACA,SAAQC,eAAR,QAA8B,6BAA9B","sourcesContent":["/* eslint-disable camelcase, indent */\nexport type {GLB} from './lib/types/glb-types';\nexport type {\n GLTF,\n GLTFAccessor,\n GLTFBuffer,\n GLTFBufferView,\n GLTFMeshPrimitive,\n GLTFMesh,\n GLTFNode,\n GLTFMaterial,\n GLTFSampler,\n GLTFScene,\n GLTFSkin,\n GLTFTexture,\n GLTFImage,\n GLTFPostprocessed,\n GLTFNodePostprocessed,\n GLTFMaterialPostprocessed,\n GLTFImagePostprocessed,\n // The following extensions are handled by the GLTFLoader and removed from the parsed glTF (disable via options.gltf.excludeExtensions)\n GLTF_KHR_binary_glTF,\n GLTF_KHR_draco_mesh_compression,\n GLTF_KHR_texture_basisu,\n GLTF_EXT_meshopt_compression,\n GLTF_EXT_texture_webp,\n GLTF_EXT_feature_metadata\n} from './lib/types/gltf-types';\n\n// glTF loader/writer definition objects\nexport {GLTFLoader} from './gltf-loader';\nexport {GLTFWriter} from './gltf-writer';\n\n// GLB Loader & Writer (for custom formats that want to leverage the GLB binary \"envelope\")\nexport {GLBLoader} from './glb-loader';\nexport {GLBWriter} from './glb-writer';\n\n// glTF Data Access Helper Class\nexport {default as GLTFScenegraph} from './lib/api/gltf-scenegraph';\nexport {postProcessGLTF} from './lib/api/post-process-gltf';\nexport type {Mesh} from './lib/types/gltf-json-schema';\nexport type {GLTFObject} from './lib/types/gltf-types';\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../../src/index.ts"],"names":["GLTFLoader","GLTFWriter","GLBLoader","GLBWriter","default","GLTFScenegraph","postProcessGLTF"],"mappings":"AAkCA,SAAQA,UAAR,QAAyB,eAAzB;AACA,SAAQC,UAAR,QAAyB,eAAzB;AAGA,SAAQC,SAAR,QAAwB,cAAxB;AACA,SAAQC,SAAR,QAAwB,cAAxB;AAGA,SAAQC,OAAO,IAAIC,cAAnB,QAAwC,2BAAxC;AACA,SAAQC,eAAR,QAA8B,6BAA9B","sourcesContent":["/* eslint-disable camelcase, indent */\nexport type {GLB} from './lib/types/glb-types';\nexport type {\n GLTF,\n GLTFAccessor,\n GLTFBuffer,\n GLTFBufferView,\n GLTFMeshPrimitive,\n GLTFMesh,\n GLTFNode,\n GLTFMaterial,\n GLTFSampler,\n GLTFScene,\n GLTFSkin,\n GLTFTexture,\n GLTFImage,\n GLTFPostprocessed,\n GLTFAccessorPostprocessed,\n GLTFNodePostprocessed,\n GLTFMaterialPostprocessed,\n GLTFMeshPostprocessed,\n GLTFMeshPrimitivePostprocessed,\n GLTFImagePostprocessed,\n GLTFTexturePostprocessed,\n // The following extensions are handled by the GLTFLoader and removed from the parsed glTF (disable via options.gltf.excludeExtensions)\n GLTF_KHR_binary_glTF,\n GLTF_KHR_draco_mesh_compression,\n GLTF_KHR_texture_basisu,\n GLTF_EXT_meshopt_compression,\n GLTF_EXT_texture_webp,\n GLTF_EXT_feature_metadata\n} from './lib/types/gltf-types';\n\n// glTF loader/writer definition objects\nexport {GLTFLoader} from './gltf-loader';\nexport {GLTFWriter} from './gltf-writer';\n\n// GLB Loader & Writer (for custom formats that want to leverage the GLB binary \"envelope\")\nexport {GLBLoader} from './glb-loader';\nexport {GLBWriter} from './glb-writer';\n\n// glTF Data Access Helper Class\nexport {default as GLTFScenegraph} from './lib/api/gltf-scenegraph';\nexport {postProcessGLTF} from './lib/api/post-process-gltf';\nexport type {Mesh} from './lib/types/gltf-json-schema';\nexport type {GLTFObject} from './lib/types/gltf-types';\nexport type {Node, Accessor, Image} from './lib/types/gltf-postprocessed-schema';\n"],"file":"index.js"}
@@ -226,14 +226,14 @@ class GLTFV1Normalizer {
226
226
 
227
227
  _updateMaterial(json) {
228
228
  for (const material of json.materials) {
229
- var _material$values, _material$values2;
229
+ var _material$values, _material$values2, _material$values3;
230
230
 
231
231
  material.pbrMetallicRoughness = {
232
232
  baseColorFactor: [1, 1, 1, 1],
233
233
  metallicFactor: 1,
234
234
  roughnessFactor: 1
235
235
  };
236
- const textureId = ((_material$values = material.values) === null || _material$values === void 0 ? void 0 : _material$values.tex) || ((_material$values2 = material.values) === null || _material$values2 === void 0 ? void 0 : _material$values2.texture2d_0);
236
+ const textureId = ((_material$values = material.values) === null || _material$values === void 0 ? void 0 : _material$values.tex) || ((_material$values2 = material.values) === null || _material$values2 === void 0 ? void 0 : _material$values2.texture2d_0) || ((_material$values3 = material.values) === null || _material$values3 === void 0 ? void 0 : _material$values3.diffuseTex);
237
237
  const textureIndex = json.textures.findIndex(texture => texture.id === textureId);
238
238
 
239
239
  if (textureIndex !== -1) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/api/normalize-gltf-v1.ts"],"names":["KHR_binary_glTF","GLTF_ARRAYS","accessors","animations","buffers","bufferViews","images","materials","meshes","nodes","samplers","scenes","skins","textures","GLTF_KEYS","accessor","buffer","bufferView","image","material","mesh","node","sampler","scene","skin","texture","GLTFV1Normalizer","normalize","gltf","options","json","asset","version","undefined","console","warn","Error","_addAsset","_convertTopLevelObjectsToArrays","preprocess","_convertObjectIdsToArrayIndices","_updateObjects","_updateMaterial","generator","arrayName","_convertTopLevelObjectToArray","mapName","objectMap","Array","isArray","id","object","index","length","push","idToIndexMap","_convertIdsToIndices","_convertIdToIndex","_convertTextureIds","_convertMeshIds","_convertNodeIds","_convertSceneIds","source","primitive","primitives","attributes","indices","attributeName","children","map","child","topLevelArrayName","key","Number","isFinite","type","pbrMetallicRoughness","baseColorFactor","metallicFactor","roughnessFactor","textureId","values","tex","texture2d_0","textureIndex","findIndex","baseColorTexture","normalizeGLTFV1"],"mappings":"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","sourcesContent":["/* eslint-disable camelcase */\nimport * as KHR_binary_glTF from '../extensions/KHR_binary_gltf';\n\n// Binary format changes (mainly implemented by GLBLoader)\n// https://github.com/KhronosGroup/glTF/tree/master/extensions/1.0/Khronos/KHR_binary_glTF\n\n// JSON format changes:\n// https://github.com/khronosgroup/gltf/issues/605\n\n// - [x] Top-level JSON objects are arrays now\n// - [ ] Removed indirection from animation: sampler now refers directly to accessors, #712\n// - [ ] material.parameter.value and technique.parameter.value must be an array, #690\n// - [ ] Node can have only one mesh #821\n// - [ ] Added reqs on JSON encoding\n// - [ ] Added reqs on binary data alignment #802 (comment)\n\n// Additions:\n// - [ ] Added accessor.normalized, #691, #706\n// - [ ] Added glExtensionsUsed property and 5125 (UNSIGNED_INT) accessor.componentType value, #619\n// - [ ] Added extensionsRequired property, #720, #721\n// - [ ] Added \"STEP\" as valid animation.sampler.interpolation value, #712\n\n// Removals:\n// - [x] Removed buffer.type, #786, #629\n// - [ ] Removed revision number from profile.version, #709\n// - [ ] Removed technique.functions.scissor and removed 3089 (SCISSOR_TEST) as a valid value for technique.states.enable, #681\n// - [ ] Techniques, programs, and shaders were moved out to KHR_technique_webgl extension.\n\n// Other edits:\n// - [x] asset is now required, #642\n// - [ ] buffer.byteLength and bufferView.byteLength are now required, #560.\n// - [ ] accessor.min and accessor.max are now required, #593, and clarified that the JSON value and binary data must be the same, #628.\n// - [ ] Clarified animation.sampler and animation.channel restrictions, #712\n// - [ ] skin.inverseBindMatrices is now optional, #461.\n// - [ ] Attribute parameters can't have a value defined in the technique or parameter, #563 (comment).\n// - [ ] Only TEXCOORD and COLOR attribute semantics can be written in the form [semantic]_[set_index], #563 (comment).\n// - [ ] TEXCOORD and COLOR attribute semantics must be written in the form [semantic]_[set_index], e.g., just TEXCOORD should be TEXCOORD_0, and just COLOR should be COLOR_0, #649\n// - [ ] camera.perspective.aspectRatio and camera.perspective.yfov must now be > 0, not >= 0, #563 (comment).\n// - [ ] Application-specific parameter semantics must start with an underscore, e.g., _TEMPERATURE and _SIMULATION_TIME, #563 (comment).\n// - [ ] Properties in technique.parameters must be defined in technique.uniforms or technique.attributes,\n\n// #563 (comment).\n// - [ ] technique.parameter.count can only be defined when the semantic is JOINTMATRIX or an application-specific semantic is used. It can never be defined for attribute parameters; only uniforms, d2f6945\n// - [ ] technique.parameter.semantic is required when the parameter is an attribute, 28e113d\n// - [ ] Mesh-only models are allowed, e.g., without materials, #642\n// - [ ] Skeleton hierarchies (nodes containing jointName) must be separated from non-skeleton hierarchies., #647\n// - [ ] technique.states.functions.blendColor and technique.states.functions.depthRange parameters now must match WebGL function min/max, #707\n\nconst GLTF_ARRAYS = {\n accessors: 'accessor',\n animations: 'animation',\n buffers: 'buffer',\n bufferViews: 'bufferView',\n images: 'image',\n materials: 'material',\n meshes: 'mesh',\n nodes: 'node',\n samplers: 'sampler',\n scenes: 'scene',\n skins: 'skin',\n textures: 'texture'\n};\n\nconst GLTF_KEYS = {\n accessor: 'accessors',\n animations: 'animation',\n buffer: 'buffers',\n bufferView: 'bufferViews',\n image: 'images',\n material: 'materials',\n mesh: 'meshes',\n node: 'nodes',\n sampler: 'samplers',\n scene: 'scenes',\n skin: 'skins',\n texture: 'textures'\n};\n\n/**\n * Converts (normalizes) glTF v1 to v2\n */\nclass GLTFV1Normalizer {\n idToIndexMap = {\n animations: {},\n accessors: {},\n buffers: {},\n bufferViews: {},\n images: {},\n materials: {},\n meshes: {},\n nodes: {},\n samplers: {},\n scenes: {},\n skins: {},\n textures: {}\n };\n\n json;\n\n // constructor() {}\n\n /**\n * Convert (normalize) glTF < 2.0 to glTF 2.0\n * @param gltf - object with json and binChunks\n * @param options\n * @param options normalize Whether to actually normalize\n */\n normalize(gltf, options) {\n this.json = gltf.json;\n const json = gltf.json;\n\n // Check version\n switch (json.asset && json.asset.version) {\n // We are converting to v2 format. Return if there is nothing to do\n case '2.0':\n return;\n\n // This class is written to convert 1.0\n case undefined:\n case '1.0':\n break;\n\n default:\n // eslint-disable-next-line no-undef, no-console\n console.warn(`glTF: Unknown version ${json.asset.version}`);\n return;\n }\n\n if (!options.normalize) {\n // We are still missing a few conversion tricks, remove once addressed\n throw new Error('glTF v1 is not supported.');\n }\n\n // eslint-disable-next-line no-undef, no-console\n console.warn('Converting glTF v1 to glTF v2 format. This is experimental and may fail.');\n\n this._addAsset(json);\n\n // In glTF2 top-level fields are Arrays not Object maps\n this._convertTopLevelObjectsToArrays(json);\n\n // Extract bufferView indices for images\n // (this extension needs to be invoked early in the normalization process)\n // TODO can this be handled by standard extension processing instead of called explicitly?\n KHR_binary_glTF.preprocess(gltf);\n\n // Convert object references from ids to indices\n this._convertObjectIdsToArrayIndices(json);\n\n this._updateObjects(json);\n\n this._updateMaterial(json);\n }\n\n // asset is now required, #642 https://github.com/KhronosGroup/glTF/issues/639\n _addAsset(json) {\n json.asset = json.asset || {};\n // We are normalizing to glTF v2, so change version to \"2.0\"\n json.asset.version = '2.0';\n json.asset.generator = json.asset.generator || 'Normalized to glTF 2.0 by loaders.gl';\n }\n\n _convertTopLevelObjectsToArrays(json) {\n // TODO check that all arrays are covered\n for (const arrayName in GLTF_ARRAYS) {\n this._convertTopLevelObjectToArray(json, arrayName);\n }\n }\n\n /** Convert one top level object to array */\n _convertTopLevelObjectToArray(json, mapName) {\n const objectMap = json[mapName];\n if (!objectMap || Array.isArray(objectMap)) {\n return;\n }\n\n // Rewrite the top-level field as an array\n json[mapName] = [];\n // Copy the map key into object.id\n for (const id in objectMap) {\n const object = objectMap[id];\n object.id = object.id || id; // Mutates the loaded object\n const index = json[mapName].length;\n json[mapName].push(object);\n this.idToIndexMap[mapName][id] = index;\n }\n }\n\n /** Go through all objects in all top-level arrays and replace ids with indices */\n _convertObjectIdsToArrayIndices(json) {\n for (const arrayName in GLTF_ARRAYS) {\n this._convertIdsToIndices(json, arrayName);\n }\n if ('scene' in json) {\n json.scene = this._convertIdToIndex(json.scene, 'scene');\n }\n\n // Convert any index references that are not using array names\n\n // texture.source (image)\n for (const texture of json.textures) {\n this._convertTextureIds(texture);\n }\n for (const mesh of json.meshes) {\n this._convertMeshIds(mesh);\n }\n for (const node of json.nodes) {\n this._convertNodeIds(node);\n }\n for (const node of json.scenes) {\n this._convertSceneIds(node);\n }\n }\n\n _convertTextureIds(texture) {\n if (texture.source) {\n texture.source = this._convertIdToIndex(texture.source, 'image');\n }\n }\n\n _convertMeshIds(mesh) {\n for (const primitive of mesh.primitives) {\n const {attributes, indices, material} = primitive;\n for (const attributeName in attributes) {\n attributes[attributeName] = this._convertIdToIndex(attributes[attributeName], 'accessor');\n }\n if (indices) {\n primitive.indices = this._convertIdToIndex(indices, 'accessor');\n }\n if (material) {\n primitive.material = this._convertIdToIndex(material, 'material');\n }\n }\n }\n\n _convertNodeIds(node) {\n if (node.children) {\n node.children = node.children.map((child) => this._convertIdToIndex(child, 'node'));\n }\n if (node.meshes) {\n node.meshes = node.meshes.map((mesh) => this._convertIdToIndex(mesh, 'mesh'));\n }\n }\n\n _convertSceneIds(scene) {\n if (scene.nodes) {\n scene.nodes = scene.nodes.map((node) => this._convertIdToIndex(node, 'node'));\n }\n }\n\n /** Go through all objects in a top-level array and replace ids with indices */\n _convertIdsToIndices(json, topLevelArrayName) {\n if (!json[topLevelArrayName]) {\n console.warn(`gltf v1: json doesn't contain attribute ${topLevelArrayName}`); // eslint-disable-line no-console, no-undef\n json[topLevelArrayName] = [];\n }\n for (const object of json[topLevelArrayName]) {\n for (const key in object) {\n const id = object[key];\n const index = this._convertIdToIndex(id, key);\n object[key] = index;\n }\n }\n }\n\n _convertIdToIndex(id, key) {\n const arrayName = GLTF_KEYS[key];\n if (arrayName in this.idToIndexMap) {\n const index = this.idToIndexMap[arrayName][id];\n if (!Number.isFinite(index)) {\n throw new Error(`gltf v1: failed to resolve ${key} with id ${id}`);\n }\n return index;\n }\n return id;\n }\n\n /**\n *\n * @param {*} json\n */\n _updateObjects(json) {\n for (const buffer of this.json.buffers) {\n // - [x] Removed buffer.type, #786, #629\n delete buffer.type;\n }\n }\n\n /**\n * Update material (set pbrMetallicRoughness)\n * @param {*} json\n */\n _updateMaterial(json) {\n for (const material of json.materials) {\n material.pbrMetallicRoughness = {\n baseColorFactor: [1, 1, 1, 1],\n metallicFactor: 1,\n roughnessFactor: 1\n };\n\n const textureId = material.values?.tex || material.values?.texture2d_0;\n const textureIndex = json.textures.findIndex((texture) => texture.id === textureId);\n if (textureIndex !== -1) {\n material.pbrMetallicRoughness.baseColorTexture = {index: textureIndex};\n }\n }\n }\n}\n\nexport function normalizeGLTFV1(gltf, options = {}) {\n return new GLTFV1Normalizer().normalize(gltf, options);\n}\n"],"file":"normalize-gltf-v1.js"}
1
+ {"version":3,"sources":["../../../../src/lib/api/normalize-gltf-v1.ts"],"names":["KHR_binary_glTF","GLTF_ARRAYS","accessors","animations","buffers","bufferViews","images","materials","meshes","nodes","samplers","scenes","skins","textures","GLTF_KEYS","accessor","buffer","bufferView","image","material","mesh","node","sampler","scene","skin","texture","GLTFV1Normalizer","normalize","gltf","options","json","asset","version","undefined","console","warn","Error","_addAsset","_convertTopLevelObjectsToArrays","preprocess","_convertObjectIdsToArrayIndices","_updateObjects","_updateMaterial","generator","arrayName","_convertTopLevelObjectToArray","mapName","objectMap","Array","isArray","id","object","index","length","push","idToIndexMap","_convertIdsToIndices","_convertIdToIndex","_convertTextureIds","_convertMeshIds","_convertNodeIds","_convertSceneIds","source","primitive","primitives","attributes","indices","attributeName","children","map","child","topLevelArrayName","key","Number","isFinite","type","pbrMetallicRoughness","baseColorFactor","metallicFactor","roughnessFactor","textureId","values","tex","texture2d_0","diffuseTex","textureIndex","findIndex","baseColorTexture","normalizeGLTFV1"],"mappings":"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","sourcesContent":["/* eslint-disable camelcase */\nimport * as KHR_binary_glTF from '../extensions/KHR_binary_gltf';\n\n// Binary format changes (mainly implemented by GLBLoader)\n// https://github.com/KhronosGroup/glTF/tree/master/extensions/1.0/Khronos/KHR_binary_glTF\n\n// JSON format changes:\n// https://github.com/khronosgroup/gltf/issues/605\n\n// - [x] Top-level JSON objects are arrays now\n// - [ ] Removed indirection from animation: sampler now refers directly to accessors, #712\n// - [ ] material.parameter.value and technique.parameter.value must be an array, #690\n// - [ ] Node can have only one mesh #821\n// - [ ] Added reqs on JSON encoding\n// - [ ] Added reqs on binary data alignment #802 (comment)\n\n// Additions:\n// - [ ] Added accessor.normalized, #691, #706\n// - [ ] Added glExtensionsUsed property and 5125 (UNSIGNED_INT) accessor.componentType value, #619\n// - [ ] Added extensionsRequired property, #720, #721\n// - [ ] Added \"STEP\" as valid animation.sampler.interpolation value, #712\n\n// Removals:\n// - [x] Removed buffer.type, #786, #629\n// - [ ] Removed revision number from profile.version, #709\n// - [ ] Removed technique.functions.scissor and removed 3089 (SCISSOR_TEST) as a valid value for technique.states.enable, #681\n// - [ ] Techniques, programs, and shaders were moved out to KHR_technique_webgl extension.\n\n// Other edits:\n// - [x] asset is now required, #642\n// - [ ] buffer.byteLength and bufferView.byteLength are now required, #560.\n// - [ ] accessor.min and accessor.max are now required, #593, and clarified that the JSON value and binary data must be the same, #628.\n// - [ ] Clarified animation.sampler and animation.channel restrictions, #712\n// - [ ] skin.inverseBindMatrices is now optional, #461.\n// - [ ] Attribute parameters can't have a value defined in the technique or parameter, #563 (comment).\n// - [ ] Only TEXCOORD and COLOR attribute semantics can be written in the form [semantic]_[set_index], #563 (comment).\n// - [ ] TEXCOORD and COLOR attribute semantics must be written in the form [semantic]_[set_index], e.g., just TEXCOORD should be TEXCOORD_0, and just COLOR should be COLOR_0, #649\n// - [ ] camera.perspective.aspectRatio and camera.perspective.yfov must now be > 0, not >= 0, #563 (comment).\n// - [ ] Application-specific parameter semantics must start with an underscore, e.g., _TEMPERATURE and _SIMULATION_TIME, #563 (comment).\n// - [ ] Properties in technique.parameters must be defined in technique.uniforms or technique.attributes,\n\n// #563 (comment).\n// - [ ] technique.parameter.count can only be defined when the semantic is JOINTMATRIX or an application-specific semantic is used. It can never be defined for attribute parameters; only uniforms, d2f6945\n// - [ ] technique.parameter.semantic is required when the parameter is an attribute, 28e113d\n// - [ ] Mesh-only models are allowed, e.g., without materials, #642\n// - [ ] Skeleton hierarchies (nodes containing jointName) must be separated from non-skeleton hierarchies., #647\n// - [ ] technique.states.functions.blendColor and technique.states.functions.depthRange parameters now must match WebGL function min/max, #707\n\nconst GLTF_ARRAYS = {\n accessors: 'accessor',\n animations: 'animation',\n buffers: 'buffer',\n bufferViews: 'bufferView',\n images: 'image',\n materials: 'material',\n meshes: 'mesh',\n nodes: 'node',\n samplers: 'sampler',\n scenes: 'scene',\n skins: 'skin',\n textures: 'texture'\n};\n\nconst GLTF_KEYS = {\n accessor: 'accessors',\n animations: 'animation',\n buffer: 'buffers',\n bufferView: 'bufferViews',\n image: 'images',\n material: 'materials',\n mesh: 'meshes',\n node: 'nodes',\n sampler: 'samplers',\n scene: 'scenes',\n skin: 'skins',\n texture: 'textures'\n};\n\n/**\n * Converts (normalizes) glTF v1 to v2\n */\nclass GLTFV1Normalizer {\n idToIndexMap = {\n animations: {},\n accessors: {},\n buffers: {},\n bufferViews: {},\n images: {},\n materials: {},\n meshes: {},\n nodes: {},\n samplers: {},\n scenes: {},\n skins: {},\n textures: {}\n };\n\n json;\n\n // constructor() {}\n\n /**\n * Convert (normalize) glTF < 2.0 to glTF 2.0\n * @param gltf - object with json and binChunks\n * @param options\n * @param options normalize Whether to actually normalize\n */\n normalize(gltf, options) {\n this.json = gltf.json;\n const json = gltf.json;\n\n // Check version\n switch (json.asset && json.asset.version) {\n // We are converting to v2 format. Return if there is nothing to do\n case '2.0':\n return;\n\n // This class is written to convert 1.0\n case undefined:\n case '1.0':\n break;\n\n default:\n // eslint-disable-next-line no-undef, no-console\n console.warn(`glTF: Unknown version ${json.asset.version}`);\n return;\n }\n\n if (!options.normalize) {\n // We are still missing a few conversion tricks, remove once addressed\n throw new Error('glTF v1 is not supported.');\n }\n\n // eslint-disable-next-line no-undef, no-console\n console.warn('Converting glTF v1 to glTF v2 format. This is experimental and may fail.');\n\n this._addAsset(json);\n\n // In glTF2 top-level fields are Arrays not Object maps\n this._convertTopLevelObjectsToArrays(json);\n\n // Extract bufferView indices for images\n // (this extension needs to be invoked early in the normalization process)\n // TODO can this be handled by standard extension processing instead of called explicitly?\n KHR_binary_glTF.preprocess(gltf);\n\n // Convert object references from ids to indices\n this._convertObjectIdsToArrayIndices(json);\n\n this._updateObjects(json);\n\n this._updateMaterial(json);\n }\n\n // asset is now required, #642 https://github.com/KhronosGroup/glTF/issues/639\n _addAsset(json) {\n json.asset = json.asset || {};\n // We are normalizing to glTF v2, so change version to \"2.0\"\n json.asset.version = '2.0';\n json.asset.generator = json.asset.generator || 'Normalized to glTF 2.0 by loaders.gl';\n }\n\n _convertTopLevelObjectsToArrays(json) {\n // TODO check that all arrays are covered\n for (const arrayName in GLTF_ARRAYS) {\n this._convertTopLevelObjectToArray(json, arrayName);\n }\n }\n\n /** Convert one top level object to array */\n _convertTopLevelObjectToArray(json, mapName) {\n const objectMap = json[mapName];\n if (!objectMap || Array.isArray(objectMap)) {\n return;\n }\n\n // Rewrite the top-level field as an array\n json[mapName] = [];\n // Copy the map key into object.id\n for (const id in objectMap) {\n const object = objectMap[id];\n object.id = object.id || id; // Mutates the loaded object\n const index = json[mapName].length;\n json[mapName].push(object);\n this.idToIndexMap[mapName][id] = index;\n }\n }\n\n /** Go through all objects in all top-level arrays and replace ids with indices */\n _convertObjectIdsToArrayIndices(json) {\n for (const arrayName in GLTF_ARRAYS) {\n this._convertIdsToIndices(json, arrayName);\n }\n if ('scene' in json) {\n json.scene = this._convertIdToIndex(json.scene, 'scene');\n }\n\n // Convert any index references that are not using array names\n\n // texture.source (image)\n for (const texture of json.textures) {\n this._convertTextureIds(texture);\n }\n for (const mesh of json.meshes) {\n this._convertMeshIds(mesh);\n }\n for (const node of json.nodes) {\n this._convertNodeIds(node);\n }\n for (const node of json.scenes) {\n this._convertSceneIds(node);\n }\n }\n\n _convertTextureIds(texture) {\n if (texture.source) {\n texture.source = this._convertIdToIndex(texture.source, 'image');\n }\n }\n\n _convertMeshIds(mesh) {\n for (const primitive of mesh.primitives) {\n const {attributes, indices, material} = primitive;\n for (const attributeName in attributes) {\n attributes[attributeName] = this._convertIdToIndex(attributes[attributeName], 'accessor');\n }\n if (indices) {\n primitive.indices = this._convertIdToIndex(indices, 'accessor');\n }\n if (material) {\n primitive.material = this._convertIdToIndex(material, 'material');\n }\n }\n }\n\n _convertNodeIds(node) {\n if (node.children) {\n node.children = node.children.map((child) => this._convertIdToIndex(child, 'node'));\n }\n if (node.meshes) {\n node.meshes = node.meshes.map((mesh) => this._convertIdToIndex(mesh, 'mesh'));\n }\n }\n\n _convertSceneIds(scene) {\n if (scene.nodes) {\n scene.nodes = scene.nodes.map((node) => this._convertIdToIndex(node, 'node'));\n }\n }\n\n /** Go through all objects in a top-level array and replace ids with indices */\n _convertIdsToIndices(json, topLevelArrayName) {\n if (!json[topLevelArrayName]) {\n console.warn(`gltf v1: json doesn't contain attribute ${topLevelArrayName}`); // eslint-disable-line no-console, no-undef\n json[topLevelArrayName] = [];\n }\n for (const object of json[topLevelArrayName]) {\n for (const key in object) {\n const id = object[key];\n const index = this._convertIdToIndex(id, key);\n object[key] = index;\n }\n }\n }\n\n _convertIdToIndex(id, key) {\n const arrayName = GLTF_KEYS[key];\n if (arrayName in this.idToIndexMap) {\n const index = this.idToIndexMap[arrayName][id];\n if (!Number.isFinite(index)) {\n throw new Error(`gltf v1: failed to resolve ${key} with id ${id}`);\n }\n return index;\n }\n return id;\n }\n\n /**\n *\n * @param {*} json\n */\n _updateObjects(json) {\n for (const buffer of this.json.buffers) {\n // - [x] Removed buffer.type, #786, #629\n delete buffer.type;\n }\n }\n\n /**\n * Update material (set pbrMetallicRoughness)\n * @param {*} json\n */\n _updateMaterial(json) {\n for (const material of json.materials) {\n material.pbrMetallicRoughness = {\n baseColorFactor: [1, 1, 1, 1],\n metallicFactor: 1,\n roughnessFactor: 1\n };\n\n const textureId =\n material.values?.tex || material.values?.texture2d_0 || material.values?.diffuseTex;\n const textureIndex = json.textures.findIndex((texture) => texture.id === textureId);\n if (textureIndex !== -1) {\n material.pbrMetallicRoughness.baseColorTexture = {index: textureIndex};\n }\n }\n }\n}\n\nexport function normalizeGLTFV1(gltf, options = {}) {\n return new GLTFV1Normalizer().normalize(gltf, options);\n}\n"],"file":"normalize-gltf-v1.js"}
@@ -141,10 +141,13 @@ async function loadImage(gltf, image, index, options, context) {
141
141
  } = context;
142
142
  let arrayBuffer;
143
143
 
144
- if (image.uri) {
144
+ if (image.uri && !image.hasOwnProperty('bufferView')) {
145
145
  const uri = resolveUrl(image.uri, options);
146
146
  const response = await fetch(uri);
147
147
  arrayBuffer = await response.arrayBuffer();
148
+ image.bufferView = {
149
+ data: arrayBuffer
150
+ };
148
151
  }
149
152
 
150
153
  if (Number.isFinite(image.bufferView)) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/parsers/parse-gltf.ts"],"names":["BasisLoader","selectSupportedBasisFormat","ImageLoader","parseJSON","sliceArrayBuffer","assert","resolveUrl","getTypedArrayForBufferView","preprocessExtensions","decodeExtensions","normalizeGLTFV1","postProcessGLTF","parseGLBSync","isGLB","isGLTF","arrayBuffer","options","byteOffset","parseGLTF","gltf","arrayBufferOrString","context","parseGLTFContainerSync","normalize","promises","loadBuffers","json","buffers","loadImages","promise","push","Promise","all","postProcess","data","uri","baseUri","ArrayBuffer","textDecoder","TextDecoder","decode","glb","type","_glb","Array","length","fill","header","hasBinChunk","binChunks","byteLength","images","i","buffer","fetch","response","imageIndices","getReferencesImageIndices","imageIndex","loadImage","Set","textures","texture","source","undefined","add","from","sort","image","index","parse","Number","isFinite","bufferView","array","parsedImage","mimeType","basis","format","compressed","mipmaps","width","height"],"mappings":"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","sourcesContent":["/* eslint-disable camelcase, max-statements, no-restricted-globals */\nimport type {LoaderContext} from '@loaders.gl/loader-utils';\nimport {BasisLoader, selectSupportedBasisFormat} from '@loaders.gl/textures';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\nimport type {GLB} from '../types/glb-types';\nimport type {GLTFWithBuffers} from '../types/gltf-types';\n\nimport {ImageLoader} from '@loaders.gl/images';\nimport {parseJSON, sliceArrayBuffer} from '@loaders.gl/loader-utils';\nimport {assert} from '../utils/assert';\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';\nimport {postProcessGLTF} from '../api/post-process-gltf';\nimport parseGLBSync, {isGLB} from './parse-glb';\n\nexport type GLTFParseOptions = {\n normalize?: boolean;\n loadImages?: boolean;\n loadBuffers?: boolean;\n decompressMeshes?: boolean;\n postProcess?: boolean;\n excludeExtensions?: string[];\n};\n\n// export type GLTFOptions = {\n// gltf?: GLTFParseOptions;\n// };\n\nexport function isGLTF(arrayBuffer, options?): 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) {\n parseGLTFContainerSync(gltf, arrayBufferOrString, byteOffset, options);\n\n normalizeGLTFV1(gltf, {normalize: options?.gltf?.normalize});\n\n preprocessExtensions(gltf, options, context);\n\n const promises: Promise<any>[] = [];\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 if (options?.gltf?.loadImages) {\n const promise = loadImages(gltf, options, context);\n promises.push(promise);\n }\n\n const promise = decodeExtensions(gltf, options, context);\n promises.push(promise);\n\n // Parallelize image loading and buffer loading/extension decoding\n await Promise.all(promises);\n\n // Post processing resolves indices to objects, buffers\n return options?.gltf?.postProcess ? postProcessGLTF(gltf, options) : gltf;\n}\n\n// `data` - can be ArrayBuffer (GLB), ArrayBuffer (Binary JSON), String (JSON), or Object (parsed JSON)\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) {\n const uri = resolveUrl(image.uri, options);\n const response = await fetch(uri);\n arrayBuffer = await response.arrayBuffer();\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"],"file":"parse-gltf.js"}
1
+ {"version":3,"sources":["../../../../src/lib/parsers/parse-gltf.ts"],"names":["BasisLoader","selectSupportedBasisFormat","ImageLoader","parseJSON","sliceArrayBuffer","assert","resolveUrl","getTypedArrayForBufferView","preprocessExtensions","decodeExtensions","normalizeGLTFV1","postProcessGLTF","parseGLBSync","isGLB","isGLTF","arrayBuffer","options","byteOffset","parseGLTF","gltf","arrayBufferOrString","context","parseGLTFContainerSync","normalize","promises","loadBuffers","json","buffers","loadImages","promise","push","Promise","all","postProcess","data","uri","baseUri","ArrayBuffer","textDecoder","TextDecoder","decode","glb","type","_glb","Array","length","fill","header","hasBinChunk","binChunks","byteLength","images","i","buffer","fetch","response","imageIndices","getReferencesImageIndices","imageIndex","loadImage","Set","textures","texture","source","undefined","add","from","sort","image","index","parse","hasOwnProperty","bufferView","Number","isFinite","array","parsedImage","mimeType","basis","format","compressed","mipmaps","width","height"],"mappings":"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","sourcesContent":["/* eslint-disable camelcase, max-statements, no-restricted-globals */\nimport type {LoaderContext} from '@loaders.gl/loader-utils';\nimport {BasisLoader, selectSupportedBasisFormat} from '@loaders.gl/textures';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\nimport type {GLB} from '../types/glb-types';\nimport type {GLTFWithBuffers} from '../types/gltf-types';\n\nimport {ImageLoader} from '@loaders.gl/images';\nimport {parseJSON, sliceArrayBuffer} from '@loaders.gl/loader-utils';\nimport {assert} from '../utils/assert';\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';\nimport {postProcessGLTF} from '../api/post-process-gltf';\nimport parseGLBSync, {isGLB} from './parse-glb';\n\nexport type GLTFParseOptions = {\n normalize?: boolean;\n loadImages?: boolean;\n loadBuffers?: boolean;\n decompressMeshes?: boolean;\n postProcess?: boolean;\n excludeExtensions?: string[];\n};\n\n// export type GLTFOptions = {\n// gltf?: GLTFParseOptions;\n// };\n\nexport function isGLTF(arrayBuffer, options?): 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) {\n parseGLTFContainerSync(gltf, arrayBufferOrString, byteOffset, options);\n\n normalizeGLTFV1(gltf, {normalize: options?.gltf?.normalize});\n\n preprocessExtensions(gltf, options, context);\n\n const promises: Promise<any>[] = [];\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 if (options?.gltf?.loadImages) {\n const promise = loadImages(gltf, options, context);\n promises.push(promise);\n }\n\n const promise = decodeExtensions(gltf, options, context);\n promises.push(promise);\n\n // Parallelize image loading and buffer loading/extension decoding\n await Promise.all(promises);\n\n // Post processing resolves indices to objects, buffers\n return options?.gltf?.postProcess ? postProcessGLTF(gltf, options) : gltf;\n}\n\n// `data` - can be ArrayBuffer (GLB), ArrayBuffer (Binary JSON), String (JSON), or Object (parsed JSON)\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"],"file":"parse-gltf.js"}
@@ -1,2 +1,2 @@
1
- export const VERSION = typeof "3.3.0-alpha.2" !== 'undefined' ? "3.3.0-alpha.2" : 'latest';
1
+ export const VERSION = typeof "3.3.0-alpha.4" !== 'undefined' ? "3.3.0-alpha.4" : 'latest';
2
2
  //# sourceMappingURL=version.js.map
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export type { GLB } from './lib/types/glb-types';
2
- export type { GLTF, GLTFAccessor, GLTFBuffer, GLTFBufferView, GLTFMeshPrimitive, GLTFMesh, GLTFNode, GLTFMaterial, GLTFSampler, GLTFScene, GLTFSkin, GLTFTexture, GLTFImage, GLTFPostprocessed, GLTFNodePostprocessed, GLTFMaterialPostprocessed, GLTFImagePostprocessed, GLTF_KHR_binary_glTF, GLTF_KHR_draco_mesh_compression, GLTF_KHR_texture_basisu, GLTF_EXT_meshopt_compression, GLTF_EXT_texture_webp, GLTF_EXT_feature_metadata } from './lib/types/gltf-types';
2
+ export type { GLTF, GLTFAccessor, GLTFBuffer, GLTFBufferView, GLTFMeshPrimitive, GLTFMesh, GLTFNode, GLTFMaterial, GLTFSampler, GLTFScene, GLTFSkin, GLTFTexture, GLTFImage, GLTFPostprocessed, GLTFAccessorPostprocessed, GLTFNodePostprocessed, GLTFMaterialPostprocessed, GLTFMeshPostprocessed, GLTFMeshPrimitivePostprocessed, GLTFImagePostprocessed, GLTFTexturePostprocessed, GLTF_KHR_binary_glTF, GLTF_KHR_draco_mesh_compression, GLTF_KHR_texture_basisu, GLTF_EXT_meshopt_compression, GLTF_EXT_texture_webp, GLTF_EXT_feature_metadata } from './lib/types/gltf-types';
3
3
  export { GLTFLoader } from './gltf-loader';
4
4
  export { GLTFWriter } from './gltf-writer';
5
5
  export { GLBLoader } from './glb-loader';
@@ -8,4 +8,5 @@ export { default as GLTFScenegraph } from './lib/api/gltf-scenegraph';
8
8
  export { postProcessGLTF } from './lib/api/post-process-gltf';
9
9
  export type { Mesh } from './lib/types/gltf-json-schema';
10
10
  export type { GLTFObject } from './lib/types/gltf-types';
11
+ export type { Node, Accessor, Image } from './lib/types/gltf-postprocessed-schema';
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAC,GAAG,EAAC,MAAM,uBAAuB,CAAC;AAC/C,YAAY,EACV,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,SAAS,EACT,QAAQ,EACR,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,qBAAqB,EACrB,yBAAyB,EACzB,sBAAsB,EAEtB,oBAAoB,EACpB,+BAA+B,EAC/B,uBAAuB,EACvB,4BAA4B,EAC5B,qBAAqB,EACrB,yBAAyB,EAC1B,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAC;AACzC,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAC;AAGzC,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AACvC,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAC,OAAO,IAAI,cAAc,EAAC,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAC,eAAe,EAAC,MAAM,6BAA6B,CAAC;AAC5D,YAAY,EAAC,IAAI,EAAC,MAAM,8BAA8B,CAAC;AACvD,YAAY,EAAC,UAAU,EAAC,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAC,GAAG,EAAC,MAAM,uBAAuB,CAAC;AAC/C,YAAY,EACV,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,SAAS,EACT,QAAQ,EACR,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,yBAAyB,EACzB,qBAAqB,EACrB,yBAAyB,EACzB,qBAAqB,EACrB,8BAA8B,EAC9B,sBAAsB,EACtB,wBAAwB,EAExB,oBAAoB,EACpB,+BAA+B,EAC/B,uBAAuB,EACvB,4BAA4B,EAC5B,qBAAqB,EACrB,yBAAyB,EAC1B,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAC;AACzC,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAC;AAGzC,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AACvC,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAC,OAAO,IAAI,cAAc,EAAC,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAC,eAAe,EAAC,MAAM,6BAA6B,CAAC;AAC5D,YAAY,EAAC,IAAI,EAAC,MAAM,8BAA8B,CAAC;AACvD,YAAY,EAAC,UAAU,EAAC,MAAM,wBAAwB,CAAC;AACvD,YAAY,EAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAC,MAAM,uCAAuC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"normalize-gltf-v1.d.ts","sourceRoot":"","sources":["../../../src/lib/api/normalize-gltf-v1.ts"],"names":[],"mappings":"AAqTA,wBAAgB,eAAe,CAAC,IAAI,KAAA,EAAE,OAAO,KAAK,QAEjD"}
1
+ {"version":3,"file":"normalize-gltf-v1.d.ts","sourceRoot":"","sources":["../../../src/lib/api/normalize-gltf-v1.ts"],"names":[],"mappings":"AAsTA,wBAAgB,eAAe,CAAC,IAAI,KAAA,EAAE,OAAO,KAAK,QAEjD"}
@@ -281,7 +281,7 @@ class GLTFV1Normalizer {
281
281
  metallicFactor: 1,
282
282
  roughnessFactor: 1
283
283
  };
284
- const textureId = material.values?.tex || material.values?.texture2d_0;
284
+ const textureId = material.values?.tex || material.values?.texture2d_0 || material.values?.diffuseTex;
285
285
  const textureIndex = json.textures.findIndex((texture) => texture.id === textureId);
286
286
  if (textureIndex !== -1) {
287
287
  material.pbrMetallicRoughness.baseColorTexture = { index: textureIndex };
@@ -167,10 +167,13 @@ function getReferencesImageIndices(gltf) {
167
167
  async function loadImage(gltf, image, index, options, context) {
168
168
  const { fetch, parse } = context;
169
169
  let arrayBuffer;
170
- if (image.uri) {
170
+ if (image.uri && !image.hasOwnProperty('bufferView')) {
171
171
  const uri = (0, resolve_url_1.resolveUrl)(image.uri, options);
172
172
  const response = await fetch(uri);
173
173
  arrayBuffer = await response.arrayBuffer();
174
+ image.bufferView = {
175
+ data: arrayBuffer
176
+ };
174
177
  }
175
178
  if (Number.isFinite(image.bufferView)) {
176
179
  const array = (0, get_typed_array_1.getTypedArrayForBufferView)(gltf.json, gltf.buffers, image.bufferView);
@@ -1,6 +1,6 @@
1
1
  import type { GLTF, Accessor as GLTFAccessor, Buffer as GLTFBuffer, BufferView as GLTFBufferView, MeshPrimitive as GLTFMeshPrimitive, Mesh as GLTFMesh, Node as GLTFNode, Material as GLTFMaterial, Sampler as GLTFSampler, Scene as GLTFScene, Skin as GLTFSkin, Texture as GLTFTexture, Image as GLTFImage, GLTF_KHR_binary_glTF, GLTF_KHR_draco_mesh_compression, GLTF_KHR_texture_basisu, GLTF_EXT_meshopt_compression, GLTF_EXT_texture_webp, GLTF_EXT_feature_metadata } from './gltf-json-schema';
2
- import type { GLTF as GLTFPostprocessed, Accessor as GLTFAccessorPostprocessed, Image as GLTFImagePostprocessed, Mesh as GLTFMeshPostprocessed, Material as GLTFMaterialPostprocessed, Node as GLTFNodePostprocessed, Texture as GLTFTexturePostprocessed } from './gltf-postprocessed-schema';
3
- export type { GLTF, GLTFAccessor, GLTFBuffer, GLTFBufferView, GLTFMeshPrimitive, GLTFMesh, GLTFNode, GLTFMaterial, GLTFSampler, GLTFScene, GLTFSkin, GLTFTexture, GLTFImage, GLTF_KHR_binary_glTF, GLTF_KHR_draco_mesh_compression, GLTF_KHR_texture_basisu, GLTF_EXT_meshopt_compression, GLTF_EXT_texture_webp, GLTFPostprocessed, GLTFAccessorPostprocessed, GLTFImagePostprocessed, GLTFNodePostprocessed, GLTFMeshPostprocessed, GLTFMaterialPostprocessed, GLTFTexturePostprocessed, GLTF_EXT_feature_metadata };
2
+ import type { GLTF as GLTFPostprocessed, Accessor as GLTFAccessorPostprocessed, Image as GLTFImagePostprocessed, Mesh as GLTFMeshPostprocessed, MeshPrimitive as GLTFMeshPrimitivePostprocessed, Material as GLTFMaterialPostprocessed, Node as GLTFNodePostprocessed, Texture as GLTFTexturePostprocessed } from './gltf-postprocessed-schema';
3
+ export type { GLTF, GLTFAccessor, GLTFBuffer, GLTFBufferView, GLTFMeshPrimitive, GLTFMesh, GLTFNode, GLTFMaterial, GLTFSampler, GLTFScene, GLTFSkin, GLTFTexture, GLTFImage, GLTF_KHR_binary_glTF, GLTF_KHR_draco_mesh_compression, GLTF_KHR_texture_basisu, GLTF_EXT_meshopt_compression, GLTF_EXT_texture_webp, GLTFPostprocessed, GLTFAccessorPostprocessed, GLTFImagePostprocessed, GLTFNodePostprocessed, GLTFMeshPostprocessed, GLTFMeshPrimitivePostprocessed, GLTFMaterialPostprocessed, GLTFTexturePostprocessed, GLTF_EXT_feature_metadata };
4
4
  export declare type GLTFObject = GLTFAccessor | GLTFBuffer | GLTFBufferView | GLTFMeshPrimitive | GLTFMesh | GLTFNode | GLTFMaterial | GLTFSampler | GLTFScene | GLTFSkin | GLTFTexture | GLTFImage;
5
5
  export declare type GLTFWithBuffers = {
6
6
  json: GLTF;
@@ -1 +1 @@
1
- {"version":3,"file":"gltf-types.d.ts","sourceRoot":"","sources":["../../../src/lib/types/gltf-types.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,IAAI,EACJ,QAAQ,IAAI,YAAY,EACxB,MAAM,IAAI,UAAU,EACpB,UAAU,IAAI,cAAc,EAC5B,aAAa,IAAI,iBAAiB,EAClC,IAAI,IAAI,QAAQ,EAChB,IAAI,IAAI,QAAQ,EAChB,QAAQ,IAAI,YAAY,EACxB,OAAO,IAAI,WAAW,EACtB,KAAK,IAAI,SAAS,EAClB,IAAI,IAAI,QAAQ,EAChB,OAAO,IAAI,WAAW,EACtB,KAAK,IAAI,SAAS,EAClB,oBAAoB,EACpB,+BAA+B,EAC/B,uBAAuB,EACvB,4BAA4B,EAC5B,qBAAqB,EACrB,yBAAyB,EAC1B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EACV,IAAI,IAAI,iBAAiB,EACzB,QAAQ,IAAI,yBAAyB,EACrC,KAAK,IAAI,sBAAsB,EAC/B,IAAI,IAAI,qBAAqB,EAC7B,QAAQ,IAAI,yBAAyB,EACrC,IAAI,IAAI,qBAAqB,EAC7B,OAAO,IAAI,wBAAwB,EACpC,MAAM,6BAA6B,CAAC;AAErC,YAAY,EACV,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,SAAS,EACT,QAAQ,EACR,WAAW,EACX,SAAS,EACT,oBAAoB,EACpB,+BAA+B,EAC/B,uBAAuB,EACvB,4BAA4B,EAC5B,qBAAqB,EACrB,iBAAiB,EACjB,yBAAyB,EACzB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,EAC1B,CAAC;AAEF,oBAAY,UAAU,GAClB,YAAY,GACZ,UAAU,GACV,cAAc,GACd,iBAAiB,GACjB,QAAQ,GACR,QAAQ,GACR,YAAY,GACZ,WAAW,GACX,SAAS,GACT,QAAQ,GACR,WAAW,GACX,SAAS,CAAC;AAEd,oBAAY,eAAe,GAAG;IAC5B,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,GAAG,EAAE,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;CAChB,CAAC"}
1
+ {"version":3,"file":"gltf-types.d.ts","sourceRoot":"","sources":["../../../src/lib/types/gltf-types.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,IAAI,EACJ,QAAQ,IAAI,YAAY,EACxB,MAAM,IAAI,UAAU,EACpB,UAAU,IAAI,cAAc,EAC5B,aAAa,IAAI,iBAAiB,EAClC,IAAI,IAAI,QAAQ,EAChB,IAAI,IAAI,QAAQ,EAChB,QAAQ,IAAI,YAAY,EACxB,OAAO,IAAI,WAAW,EACtB,KAAK,IAAI,SAAS,EAClB,IAAI,IAAI,QAAQ,EAChB,OAAO,IAAI,WAAW,EACtB,KAAK,IAAI,SAAS,EAClB,oBAAoB,EACpB,+BAA+B,EAC/B,uBAAuB,EACvB,4BAA4B,EAC5B,qBAAqB,EACrB,yBAAyB,EAC1B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EACV,IAAI,IAAI,iBAAiB,EACzB,QAAQ,IAAI,yBAAyB,EACrC,KAAK,IAAI,sBAAsB,EAC/B,IAAI,IAAI,qBAAqB,EAC7B,aAAa,IAAI,8BAA8B,EAC/C,QAAQ,IAAI,yBAAyB,EACrC,IAAI,IAAI,qBAAqB,EAC7B,OAAO,IAAI,wBAAwB,EACpC,MAAM,6BAA6B,CAAC;AAErC,YAAY,EACV,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,SAAS,EACT,QAAQ,EACR,WAAW,EACX,SAAS,EACT,oBAAoB,EACpB,+BAA+B,EAC/B,uBAAuB,EACvB,4BAA4B,EAC5B,qBAAqB,EACrB,iBAAiB,EACjB,yBAAyB,EACzB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,8BAA8B,EAC9B,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,EAC1B,CAAC;AAEF,oBAAY,UAAU,GAClB,YAAY,GACZ,UAAU,GACV,cAAc,GACd,iBAAiB,GACjB,QAAQ,GACR,QAAQ,GACR,YAAY,GACZ,WAAW,GACX,SAAS,GACT,QAAQ,GACR,WAAW,GACX,SAAS,CAAC;AAEd,oBAAY,eAAe,GAAG;IAC5B,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,GAAG,EAAE,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;CAChB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loaders.gl/gltf",
3
- "version": "3.3.0-alpha.2",
3
+ "version": "3.3.0-alpha.4",
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": "3.3.0-alpha.2",
38
- "@loaders.gl/images": "3.3.0-alpha.2",
39
- "@loaders.gl/loader-utils": "3.3.0-alpha.2",
40
- "@loaders.gl/textures": "3.3.0-alpha.2",
37
+ "@loaders.gl/draco": "3.3.0-alpha.4",
38
+ "@loaders.gl/images": "3.3.0-alpha.4",
39
+ "@loaders.gl/loader-utils": "3.3.0-alpha.4",
40
+ "@loaders.gl/textures": "3.3.0-alpha.4",
41
41
  "@math.gl/core": "^3.5.1"
42
42
  },
43
- "gitHead": "628f1f0eed0f14b50ccff4c561023acf6e0657e6"
43
+ "gitHead": "d1c524fd3cb9296ecd1bf7d185765c4f6aaef6a1"
44
44
  }
package/src/index.ts CHANGED
@@ -15,9 +15,13 @@ export type {
15
15
  GLTFTexture,
16
16
  GLTFImage,
17
17
  GLTFPostprocessed,
18
+ GLTFAccessorPostprocessed,
18
19
  GLTFNodePostprocessed,
19
20
  GLTFMaterialPostprocessed,
21
+ GLTFMeshPostprocessed,
22
+ GLTFMeshPrimitivePostprocessed,
20
23
  GLTFImagePostprocessed,
24
+ GLTFTexturePostprocessed,
21
25
  // The following extensions are handled by the GLTFLoader and removed from the parsed glTF (disable via options.gltf.excludeExtensions)
22
26
  GLTF_KHR_binary_glTF,
23
27
  GLTF_KHR_draco_mesh_compression,
@@ -40,3 +44,4 @@ export {default as GLTFScenegraph} from './lib/api/gltf-scenegraph';
40
44
  export {postProcessGLTF} from './lib/api/post-process-gltf';
41
45
  export type {Mesh} from './lib/types/gltf-json-schema';
42
46
  export type {GLTFObject} from './lib/types/gltf-types';
47
+ export type {Node, Accessor, Image} from './lib/types/gltf-postprocessed-schema';
@@ -298,7 +298,8 @@ class GLTFV1Normalizer {
298
298
  roughnessFactor: 1
299
299
  };
300
300
 
301
- const textureId = material.values?.tex || material.values?.texture2d_0;
301
+ const textureId =
302
+ material.values?.tex || material.values?.texture2d_0 || material.values?.diffuseTex;
302
303
  const textureIndex = json.textures.findIndex((texture) => texture.id === textureId);
303
304
  if (textureIndex !== -1) {
304
305
  material.pbrMetallicRoughness.baseColorTexture = {index: textureIndex};
@@ -201,10 +201,13 @@ async function loadImage(
201
201
 
202
202
  let arrayBuffer;
203
203
 
204
- if (image.uri) {
204
+ if (image.uri && !image.hasOwnProperty('bufferView')) {
205
205
  const uri = resolveUrl(image.uri, options);
206
206
  const response = await fetch(uri);
207
207
  arrayBuffer = await response.arrayBuffer();
208
+ image.bufferView = {
209
+ data: arrayBuffer
210
+ };
208
211
  }
209
212
 
210
213
  if (Number.isFinite(image.bufferView)) {
@@ -28,6 +28,7 @@ import type {
28
28
  Accessor as GLTFAccessorPostprocessed,
29
29
  Image as GLTFImagePostprocessed,
30
30
  Mesh as GLTFMeshPostprocessed,
31
+ MeshPrimitive as GLTFMeshPrimitivePostprocessed,
31
32
  Material as GLTFMaterialPostprocessed,
32
33
  Node as GLTFNodePostprocessed,
33
34
  Texture as GLTFTexturePostprocessed
@@ -57,6 +58,7 @@ export type {
57
58
  GLTFImagePostprocessed,
58
59
  GLTFNodePostprocessed,
59
60
  GLTFMeshPostprocessed,
61
+ GLTFMeshPrimitivePostprocessed,
60
62
  GLTFMaterialPostprocessed,
61
63
  GLTFTexturePostprocessed,
62
64
  GLTF_EXT_feature_metadata