@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.14 kB
JavaScript
import {KHRTextureBasisu}from'@gltf-transform/extensions';import d from'child_process';import {readFile,rm}from'fs/promises';import $ from'sharp';import {temporaryWrite}from'tempy';async function R(a){const b=a.getRoot();a.createExtension(KHRTextureBasisu).setRequired(true);const f=[];for(const n of b.listScenes())n.traverse(o=>f.push(o));for(const n of f){const o=n.getMesh();if(o)for(const x of o.listPrimitives()){const c=x.getMaterial();if(!c)continue;const s=c.getBaseColorTexture();if(!s)continue;const l=s.getImage();if(!l)continue;const g=await $(l,{limitInputPixels:false}).toFormat("png").toArray(),m=await temporaryWrite(g[0],{extension:"png"}),i=process.platform,e=process.arch;let t;switch(i){case "linux":if(e==="arm64"){t=import.meta.resolve("@gpu-tex-enc/basis/bin/linux-arm64/basisu").replace("file://","");break}if(e==="x64"){t=import.meta.resolve("@gpu-tex-enc/basis/bin/linux-x64/basisu").replace("file://","");break}throw new Error(`No matching basisu bin found for ${i} ${e}.`);case "win32":if(e==="x64"){t=import.meta.resolve("@gpu-tex-enc/basis/bin/win32-x64/basisu.exe").replace("file:///","");break}throw new Error(`No matching basisu bin found for ${i} ${e}.`);case "darwin":if(e==="arm64"){t=import.meta.resolve("@gpu-tex-enc/basis/bin/darwin-arm64/basisu").replace("file://","");break}if(e==="x64"){t=import.meta.resolve("@gpu-tex-enc/basis/bin/darwin-x64/basisu").replace("file://","");break}throw new Error(`No matching basisu bin found for ${i} ${e}.`);default:throw new Error(`No matching basisu bin found for ${i} ${e}.`)}try{const r=`${m}.ktx2`;if(d.spawnSync(t,["-file",m,"-output_file",r,"-uastc_level","4","-uastc_rdo_l","0.75","-q","255","-ktx2"],{stdio:["ignore","ignore","inherit"]}).status!==0)throw new Error("Unexpected error in basisu!");const w=await readFile(r),u=a.createTexture(s.getName());s.dispose(),u.setImage(w),u.setMimeType("image/ktx2"),c.setBaseColorTexture(u),await rm(r);}catch(r){throw console.error(JSON.stringify(r)),r}await rm(m);}}}
export{R as compressBasisUniversal};//# sourceMappingURL=compressBasisUniversal.js.map
//# sourceMappingURL=compressBasisUniversal.js.map