UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 2.49 kB
import{isNone as e}from"../../../../core/maybe.js";import{getBasisTranscoder as t}from"../../../../libs/basisu/BasisU.js";import{TextureFormat as n}from"../../../../libs/basisu/TextureFormat.js";import{CompressedTextureFormat as r,PixelFormat as s,TextureSamplingMode as i}from"../../../webgl/enums.js";import{Texture as a}from"../../../webgl/Texture.js";import{getBytesPerElementFormat as o}from"../../../webgl/Util.js";let g=null,l=null;async function c(){return e(l)&&(l=t(),g=await l),l}function u(t,n){if(e(g))return t.byteLength;const r=new g.BasisFile(new Uint8Array(t)),s=T(r)?E(r.getNumLevels(0),r.getHasAlpha(),r.getImageWidth(0,0),r.getImageHeight(0,0),n):0;return r.close(),r.delete(),s}function m(t,n){if(e(g))return t.byteLength;const r=new g.KTX2File(new Uint8Array(t)),s=_(r)?E(r.getLevels(),r.getHasAlpha(),r.getWidth(),r.getHeight(),n):0;return r.close(),r.delete(),s}function E(e,t,n,s,i){const a=o(t?r.COMPRESSED_RGBA8_ETC2_EAC:r.COMPRESSED_RGB8_ETC2),g=i&&e>1?(4**e-1)/(3*4**(e-1)):1;return Math.ceil(n*s*a*g)}function T(e){return e.getNumImages()>=1&&!e.isUASTC()}function _(e){return e.getFaces()>=1&&e.isETC1S()}async function h(t,n,r){e(g)&&(g=await c());const s=new g.BasisFile(new Uint8Array(r));if(!T(s))return null;s.startTranscoding();const i=p(t,n,s.getNumLevels(0),s.getHasAlpha(),s.getImageWidth(0,0),s.getImageHeight(0,0),((e,t)=>s.getImageTranscodedSizeInBytes(0,e,t)),((e,t,n)=>s.transcodeImage(n,0,e,t,0,0)));return s.close(),s.delete(),i}async function A(t,n,r){e(g)&&(g=await c());const s=new g.KTX2File(new Uint8Array(r));if(!_(s))return null;s.startTranscoding();const i=p(t,n,s.getLevels(),s.getHasAlpha(),s.getWidth(),s.getHeight(),((e,t)=>s.getImageTranscodedSizeInBytes(e,0,0,t)),((e,t,n)=>s.transcodeImage(n,e,0,0,t,0,-1,-1)));return s.close(),s.delete(),i}function p(e,t,o,g,l,c,u,m){const{compressedTextureETC:E,compressedTextureS3TC:T}=e.capabilities,[_,h]=E?g?[n.ETC2_RGBA,r.COMPRESSED_RGBA8_ETC2_EAC]:[n.ETC1_RGB,r.COMPRESSED_RGB8_ETC2]:T?g?[n.BC3_RGBA,r.COMPRESSED_RGBA_S3TC_DXT5_EXT]:[n.BC1_RGB,r.COMPRESSED_RGB_S3TC_DXT1_EXT]:[n.RGBA32,s.RGBA],A=t.hasMipmap?o:Math.min(1,o),p=[];for(let n=0;n<A;n++)p.push(new Uint8Array(u(n,_))),m(n,_,p[n]);const C=p.length>1,d=C?i.LINEAR_MIPMAP_LINEAR:i.LINEAR,R={...t,samplingMode:d,hasMipmap:C,internalFormat:h,width:l,height:c};return new a(e,R,{type:"compressed",levels:p})}export{h as createTextureBasis,A as createTextureKTX2,u as estimateMemoryBasis,m as estimateMemoryKTX2,c as loadBasis};