@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 4.3 kB
JavaScript
function e(){const e=0,t=1,r=2,s=3,n=8,a=9,i=10,o=11,l=12,c=13,u=14,d=16,f={astc:i,dxt:r,etc1:e,etc2:e,pvr:n,atc:o,none:u},g={astc:i,dxt:s,etc1:d,etc2:t,pvr:a,atc:l,none:d},h=21,m=22,w=23,p=8,v=10,y=26,A=27,b=28,$=29,T=30,G=7,I=3,U=5,F=(f,g)=>{switch(f){case e:return g.formats.etc1?h:m;case t:return w;case r:return p;case s:return v;case n:return y;case a:return A;case i:return b;case o:return $;case l:return T;case c:return G;case u:return I;case d:return U}},S=e=>{const t=function(e,t){const r=e*(2/255)-1,s=t*(2/255)-1,n=Math.sqrt(1-Math.min(1,r*r+s*s));return Math.max(0,Math.min(255,Math.floor(.5*(n+1)*255)))};for(let r=0;r<e.length;r+=4){const s=e[r+3],n=e[r+1];e[r+0]=s,e[r+2]=t(s,n),e[r+3]=255}return e},z=e=>{const t=new Uint16Array(e.length/4);for(let r=0;r<e.length;r+=4){const s=e[r+0],n=e[r+1],a=e[r+2];t[r/4]=(248&s)<<8|(252&n)<<3|a>>3}return t},E=()=>"undefined"!=typeof performance?performance.now():0;let M,B,D;const x=(e,t,r)=>{if(r){if(e.formats.astc)return"astc"}else if(t){if(e.formats.etc2)return"etc2"}else if(e.formats.etc1||e.formats.etc2)return"etc1";return(t=>{for(let r=0;r<t.length;++r){const s=t[r];if(e.formats[s])return s}return"none"})(t?D:B)},C=(c,u,d,f)=>{switch(d){case e:case t:return!0;case r:case s:return!(3&c||3&u);case n:case a:return((e,t)=>!(e&e-1||t&t-1))(c,u)&&(c===u||f);case i:case o:case l:return!0}return!1},H=(e,t,r)=>r.isKTX2?((e,t,r)=>{if(!M.KTX2File)throw new Error("Basis transcoder module does not include support for KTX2.");const s=E(),n=new M.KTX2File(new Uint8Array(t)),a=n.getWidth(),i=n.getHeight(),o=n.getLevels(),l=!!n.getHasAlpha(),h=n.isUASTC&&n.isUASTC();if(!a||!i||!o)throw n.close(),n.delete(),new Error(`Invalid image dimensions url=${e} width=${a} height=${i} levels=${o}`);const m=x(r.deviceDetails,l,h),w=!!r.isGGGR&&"pvr"===m;let p,v;if(w?p=c:(p=l?g[m]:f[m],C(a,i,p,r.deviceDetails.webgl2)||(p=l?c:u)),!n.startTranscoding())throw n.close(),n.delete(),new Error(`Failed to start transcoding url=${e}`);const y=[];for(let t=0;t<o;++t){const r=n.getImageTranscodedSizeInBytes(t,0,0,p),s=new Uint8Array(r);if(!n.transcodeImage(s,t,0,0,p,0,-1,-1))throw n.close(),n.delete(),new Error(`Failed to transcode image url=${e}`);const a=p===u||p===d;y.push(a?new Uint16Array(s.buffer):s)}if(n.close(),n.delete(),w)for(p=u,v=0;v<y.length;++v)y[v]=z(S(y[v]));return{format:F(p,r.deviceDetails),width:a,height:i,levels:y,cubemap:!1,transcodeTime:E()-s,url:e,unswizzledGGGR:w}})(e,t,r):((e,t,r)=>{const s=E(),n=new M.BasisFile(new Uint8Array(t)),a=n.getImageWidth(0,0),i=n.getImageHeight(0,0),o=n.getNumImages(),l=n.getNumLevels(0),h=!!n.getHasAlpha(),m=n.isUASTC&&n.isUASTC();if(!(a&&i&&o&&l))throw n.close(),n.delete(),new Error(`Invalid image dimensions url=${e} width=${a} height=${i} images=${o} levels=${l}`);const w=x(r.deviceDetails,h,m),p=!!r.isGGGR&&"pvr"===w;let v,y;if(p?v=c:(v=h?g[w]:f[w],C(a,i,v,r.deviceDetails.webgl2)||(v=h?c:u)),!n.startTranscoding())throw n.close(),n.delete(),new Error(`Failed to start transcoding url=${e}`);const A=[];for(let t=0;t<l;++t){const r=n.getImageTranscodedSizeInBytes(0,t,v),s=new Uint8Array(r);if(!n.transcodeImage(s,0,t,v,0,0)){if(t!==l-1||r!==A[t-1].buffer.byteLength)throw n.close(),n.delete(),new Error(`Failed to transcode image url=${e}`);s.set(new Uint8Array(A[t-1].buffer)),console.warn(`Failed to transcode last mipmap level, using previous level instead url=${e}`)}const a=v===u||v===d;A.push(a?new Uint16Array(s.buffer):s)}if(n.close(),n.delete(),p)for(v=u,y=0;y<A.length;++y)A[y]=z(S(A[y]));return{format:F(v,r.deviceDetails),width:a,height:i,levels:A,cubemap:!1,transcodeTime:E()-s,url:e,unswizzledGGGR:p}})(e,t,r),K=(e,t,r)=>{try{const s=H(e,t,r);s.levels=s.levels.map((e=>e.buffer)),self.postMessage({url:e,data:s},s.levels)}catch(t){self.postMessage({url:e,err:t},null)}},R=[];self.onmessage=e=>{const t=e.data;switch(t.type){case"init":r=t.config,s=()=>{for(let e=0;e<R.length;++e)K(R[e].url,R[e].data,R[e].options);R.length=0},self.BASIS(r.module?{instantiateWasm:(e,t)=>(WebAssembly.instantiate(r.module,e).then((e=>{t(e)})).catch((e=>{console.error(`instantiate failed + ${e}`)})),{})}:null).then((e=>{e.initializeBasis(),M=e,B=r.rgbPriority,D=r.rgbaPriority,s(null)}));break;case"transcode":M?K(t.url,t.data,t.options):R.push(t)}var r,s}}export{e as BasisWorker};