@csi-foxbyte/cityjson-to-3d-tiles
Version:
A Node.js library that converts CityJSON files into Cesium 3D Tiles—complete with automatic texture atlas packing, Basis compression, three LOD levels, and customizable threading.
3 lines • 2.13 kB
JavaScript
import {KHRTextureBasisu}from'@gltf-transform/extensions';import h from'child_process';import {readFile,rm}from'fs/promises';import v from'sharp';import {temporaryFile}from'tempy';async function M(a){const b=a.getRoot();a.createExtension(KHRTextureBasisu).setRequired(true);const m=[];for(const n of b.listScenes())n.traverse(i=>m.push(i));for(const n of m){const i=n.getMesh();if(i)for(const x of i.listPrimitives()){const c=x.getMaterial();if(!c)continue;const o=c.getBaseColorTexture();if(!o)continue;const f=o.getImage();if(!f)continue;const s=temporaryFile({extension:"png"});try{await v(f,{limitInputPixels:!1}).toFormat("png").toFile(s);const t=process.platform,e=process.arch;let r;switch(t){case "linux":if(e==="arm64"){r=import.meta.resolve("@gpu-tex-enc/basis/bin/linux-arm64/basisu").replace("file://","");break}if(e==="x64"){r=import.meta.resolve("@gpu-tex-enc/basis/bin/linux-x64/basisu").replace("file://","");break}throw new Error(`No matching basisu bin found for ${t} ${e}.`);case "win32":if(e==="x64"){r=import.meta.resolve("@gpu-tex-enc/basis/bin/win32-x64/basisu.exe").replace("file:///","");break}throw new Error(`No matching basisu bin found for ${t} ${e}.`);case "darwin":if(e==="arm64"){r=import.meta.resolve("@gpu-tex-enc/basis/bin/darwin-arm64/basisu").replace("file://","");break}if(e==="x64"){r=import.meta.resolve("@gpu-tex-enc/basis/bin/darwin-x64/basisu").replace("file://","");break}throw new Error(`No matching basisu bin found for ${t} ${e}.`);default:throw new Error(`No matching basisu bin found for ${t} ${e}.`)}const u=`${s}.ktx2`;if(h.spawnSync(r,["-file",s,"-output_file",u,"-uastc","-uastc_level","1","-uastc_rdo_l","1","-ktx2"],{stdio:["ignore","ignore","inherit"]}).status!==0)throw new Error("Unexpected error in basisu!");const g=await readFile(u),l=a.createTexture(o.getName());o.dispose(),l.setImage(g),l.setMimeType("image/ktx2"),c.setBaseColorTexture(l),await rm(u);}catch(t){throw console.error(JSON.stringify(t)),t}finally{await rm(s);}}}}
export{M as compressBasisUniversal};//# sourceMappingURL=compressBasisUniversal.js.map
//# sourceMappingURL=compressBasisUniversal.js.map