diff --git a/package.json b/package.json index 304deb230778ec0b7706ee87923c80602c3b083e..739858c319d5cdff09d4d41539a1b57032496d2b 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "event-target-shim": "^3.0.1", "form-urlencoded": "^2.0.4", "jsonschema": "^1.2.2", + "jszip": "^3.1.5", "moving-average": "^1.0.0", "naf-janus-adapter": "^0.10.1", "networked-aframe": "https://github.com/mozillareality/networked-aframe#mr-social-client/master", diff --git a/src/components/media-loader.js b/src/components/media-loader.js index ef8ea23cc33f5fb077bddf8ce6d0f269b6d04a36..d760eedc4d9f4be26975c29c0d5c210504d3e40d 100644 --- a/src/components/media-loader.js +++ b/src/components/media-loader.js @@ -1,3 +1,5 @@ +import JSZip from "jszip"; + import { getBox, getScaleCoefficient } from "../utils/auto-box-collider"; import { resolveFarsparkUrl } from "../utils/media-utils"; @@ -68,6 +70,24 @@ AFRAME.registerComponent("media-loader", { this.el.setAttribute("image-plus", { src: raw, contentType }); this.el.setAttribute("position-at-box-shape-border", { target: ".delete-button", dirs: ["forward", "back"] }); } else if (contentType.startsWith("model/gltf") || url.endsWith(".gltf") || url.endsWith(".glb")) { + let gltfUrl = raw; + if (contentType === "model/gltf+zip") { + gltfUrl = await fetch(raw) + .then(r => r.blob()) + .then(JSZip.loadAsync) + .then(async zip => { + const gltf = 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({})); + gltf.buffers && gltf.buffers.forEach(b => (b.uri = fileMap[b.uri])); + gltf.images && gltf.images.forEach(i => (i.uri = fileMap[i.uri])); + return URL.createObjectURL(new Blob([JSON.stringify(gltf, null, 2)], { type: "text/plain" })); + }); + } this.el.addEventListener( "model-loaded", () => { @@ -78,7 +98,7 @@ AFRAME.registerComponent("media-loader", { ); this.el.addEventListener("model-error", this.onError, { once: true }); this.el.setAttribute("gltf-model-plus", { - src: raw, + src: gltfUrl, basePath: THREE.LoaderUtils.extractUrlBase(origin), inflate: true }); diff --git a/yarn.lock b/yarn.lock index 851eb8c6bd036a9379611f077e1d70b6b711b7e9..47d375cb40c05ae307db19b061b8e907f9cd399f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2028,6 +2028,10 @@ core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0: version "2.5.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" +core-js@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.3.0.tgz#fab83fbb0b2d8dc85fa636c4b9d34c75420c6d65" + core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -2632,6 +2636,10 @@ es6-iterator@~2.0.3: es5-ext "^0.10.35" es6-symbol "^3.1.1" +es6-promise@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.0.2.tgz#010d5858423a5f118979665f46486a95c6ee2bb6" + es6-symbol@^3.1.1, es6-symbol@~3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" @@ -3844,6 +3852,10 @@ ignore@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.2.tgz#0a8dd228947ec78c2d7f736b1642a9f7317c1905" +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + import-local@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" @@ -4412,6 +4424,16 @@ jsx-ast-utils@^2.0.1: dependencies: array-includes "^3.0.3" +jszip@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.1.5.tgz#e3c2a6c6d706ac6e603314036d43cd40beefdf37" + dependencies: + core-js "~2.3.0" + es6-promise "~3.0.2" + lie "~3.1.0" + pako "~1.0.2" + readable-stream "~2.0.6" + keyv@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373" @@ -4455,6 +4477,12 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +lie@~3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" + dependencies: + immediate "~3.0.5" + listr-silent-renderer@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" @@ -5448,7 +5476,7 @@ p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" -pako@~1.0.5: +pako@~1.0.2, pako@~1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" @@ -5724,6 +5752,10 @@ process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" @@ -5974,6 +6006,17 @@ readable-stream@1.1: isarray "0.0.1" string_decoder "~0.10.x" +readable-stream@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + readdirp@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"