diff --git a/src/components/gltf-model-plus.js b/src/components/gltf-model-plus.js index f51a2d9abe626ba9cfe7d9e05cea605e84bd480c..a2116b932398e691e22c7fc2aa96108de5567195 100644 --- a/src/components/gltf-model-plus.js +++ b/src/components/gltf-model-plus.js @@ -197,25 +197,28 @@ function getFilesFromSketchfabZip(src) { } function cachedLoadGLTF(src, basePath, contentType, preferredTechnique, onProgress) { - // Load the gltf model from the cache if it exists. if (!GLTFCache[src]) { GLTFCache[src] = new Promise(async (resolve, reject) => { - let gltfUrl = src; - let onLoad = resolve; - if (contentType === "model/gltf+zip") { - const fileMap = await getFilesFromSketchfabZip(src); - gltfUrl = fileMap["scene.gtlf"]; - onLoad = model => { - // The GLTF is now cached as a THREE object, we can get rid of the original blobs - Object.keys(fileMap).forEach(URL.revokeObjectURL); - resolve(model); - }; - } + try { + let gltfUrl = src; + let onLoad = resolve; + if (contentType === "model/gltf+zip") { + const fileMap = await getFilesFromSketchfabZip(src); + gltfUrl = fileMap["scene.gtlf"]; + onLoad = model => { + // The GLTF is now cached as a THREE object, we can get rid of the original blobs + Object.keys(fileMap).forEach(URL.revokeObjectURL); + resolve(model); + }; + } - const gltfLoader = new THREE.GLTFLoader(); - gltfLoader.path = basePath; - gltfLoader.preferredTechnique = preferredTechnique; - gltfLoader.load(gltfUrl, onLoad, onProgress, reject); + const gltfLoader = new THREE.GLTFLoader(); + gltfLoader.path = basePath; + gltfLoader.preferredTechnique = preferredTechnique; + gltfLoader.load(gltfUrl, onLoad, onProgress, reject); + } catch (e) { + reject(e); + } }); } return GLTFCache[src].then(cloneGltf); diff --git a/src/utils/media-utils.js b/src/utils/media-utils.js index 112996db1208849474e490043784cfeff0479c12..7d699d172b74d8582741132bd2e28c44d2b4c959 100644 --- a/src/utils/media-utils.js +++ b/src/utils/media-utils.js @@ -18,7 +18,7 @@ export const resolveFarsparkUrl = async url => { headers: { "Content-Type": "application/json" }, body: JSON.stringify({ media: { url } }) }).then(r => r.json()); - // farsparkCache.set(url, resolved); + farsparkCache.set(url, resolved); return resolved; }; diff --git a/src/workers/sketchfab-zip.worker.js b/src/workers/sketchfab-zip.worker.js index 2ba952fb6c932b25da9514f9f298bbb97c9b9721..2bfadd0e1949d751ab029701a41e09bd69853035 100644 --- a/src/workers/sketchfab-zip.worker.js +++ b/src/workers/sketchfab-zip.worker.js @@ -6,13 +6,14 @@ async function fetchZipAndGetBlobs(src) { .then(JSZip.loadAsync); // Rewrite any url refferences in the GLTF to blob urls + const fileMap = {}; + const files = Object.values(zip.files); + const fileBlobs = await Promise.all(files.map(f => f.async("blob"))); + for (let i = 0; i < fileBlobs.length; i++) { + fileMap[files[i].name] = URL.createObjectURL(fileBlobs[i]); + } + const gltfJson = JSON.parse(await zip.file("scene.gltf").async("text")); - const fileMap = await Object.values(zip.files).reduce(async (prev, file) => { - if (file.name === "scene.gltf") return prev; - const out = await prev; - out[file.name] = URL.createObjectURL(await file.async("blob")); - return out; - }, Promise.resolve({})); gltfJson.buffers && gltfJson.buffers.forEach(b => (b.uri = fileMap[b.uri])); gltfJson.images && gltfJson.images.forEach(i => (i.uri = fileMap[i.uri])); @@ -26,6 +27,6 @@ self.onmessage = async e => { const fileMap = await fetchZipAndGetBlobs(e.data); self.postMessage([true, fileMap]); } catch (e) { - self.postMessage([false, e]); + self.postMessage([false, e.message]); } };