@vctrl/hooks
Version:
vctrl/hooks is a React hooks package designed to simplify 3D model loading and management within React applications. It's part of the vectreal-core ecosystem and is primarily used in the vctrl/viewer React component and the official website application.
2 lines (1 loc) • 1.81 kB
JavaScript
;const y=require("jszip"),u=require("file-saver"),d=require("./GLTFExporter-BmLF430n.cjs"),l=t=>{const r=atob(t.split(",")[1]),s=t.split(",")[0].split(":")[1].split(";")[0],n=new ArrayBuffer(r.length),o=new Uint8Array(n);for(let e=0;e<r.length;e++)o[e]=r.charCodeAt(e);return new Blob([n],{type:s})};function g(t,r){var n;const s=(n=t.split(".").pop())==null?void 0:n.split("?")[0];return s&&s!==t?s:r&&r.split("/").pop()||"png"}function b(t){return(t==null?void 0:t.split(".").shift())||"scene"}const x=(t,r,s)=>{r.forEach((n,o)=>{const e=t[n.source];if(!e.uri)return;const a=g(e.uri,e.mimeType),i=`${n.name||`texture_${o}`}.${a}`;if(e.data instanceof ArrayBuffer||e.data instanceof Uint8Array){const c=e.data instanceof Uint8Array?e.data.buffer:e.data,p=new Uint8Array(c);s.file(i,p,{binary:!0})}else if(e.uri.startsWith("data:")){const c=l(e.uri);s.file(i,c,{binary:!0})}else console.warn(`Image at index ${o} has unsupported data format`)})},A=(t,r,s)=>{t.forEach((n,o)=>{const e=`${s}.bin`;if(n instanceof ArrayBuffer){const a=new Uint8Array(n);r.file(e,a,{binary:!0})}else if(n.uri){const a=l(n.uri);r.file(e,a,{binary:!0})}else console.warn(`Buffer at index ${o} is not an ArrayBuffer or does not have a URI`)})},h=(t,r)=>{const s=new y;s.file(`${r}.gltf`,JSON.stringify(t,null,2)),t.buffers&&A(t.buffers,s,r),t.images&&t.textures&&x(t.images,t.textures,s),s.generateAsync({type:"blob"}).then(n=>{u.saveAs(n,`${r}.zip`)})},m=(t,r)=>({handleGltfExport:(n,o)=>{const e=n==null?void 0:n.model;if(!e){console.error("Scene not initialized");return}const a=new d.GLTFExporter,f={binary:o,includeCustomExtensions:!0};a.parse(e,i=>{const c=b(n.name);i instanceof ArrayBuffer?(u.saveAs(new Blob([i]),`${c}.glb`),t&&t()):(h(i,c),t&&t())},i=>{console.error(i),r&&r(i)},f)}});exports.useExportModel=m;