@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.
2 lines • 1.41 kB
JavaScript
import {Box2,Vector2}from'three';import D from'sharp';async function E(A){const w=A.getRoot(),d=[];for(const m of w.listScenes())m.traverse(e=>d.push(e));const l=new Map;for(const m of d){const e=m.getMesh();if(e)for(const o of e.listPrimitives()){const i=o.getAttribute("TEXCOORD_0")?.getArray(),n=o.getMaterial();if(!i||!n)continue;const r=new Box2,c=new Vector2;for(let t=0;t<i.length;)c.set(i[t++],i[t++]),r.expandByPoint(c);if(!l.has(n.getName()))l.set(n.getName(),{primitives:[o],bbox:r});else {const t=l.get(n.getName());t.primitives.push(o),t.bbox.union(r);}}}for(const{primitives:m,bbox:e}of l.values()){const o=new Vector2;e.getSize(o);let h=null,i=0,n=0,r=0,c=0;for(const t of m){const x=t.getMaterial();if(!x)continue;const v=x.getBaseColorTexture();if(!v)continue;const y=v.getImage();if(!y)continue;const[f,u]=v.getSize();h||(i=Math.ceil(f*o.x),n=Math.ceil(u*o.y),c=Math.floor(f*e.min.x),r=Math.floor(u*e.min.y),h=(await D(y,{limitInputPixels:false}).extract({width:i,height:n,left:c,top:r}).toFormat("png").toArray())[0]);const b=t.getAttribute("TEXCOORD_0");if(!b)continue;const s=b.getArray();if(!s)continue;const g=[1,1],p=[0,0];g[0]=f/i,g[1]=u/n,p[0]=c/f,p[1]=r/u;for(let a=0;a<s.length;a+=2){const B=s[a],N=s[a+1];s[a]=B*g[0]+p[0],s[a+1]=N*g[1]+p[1];}b.setArray(s),t.setMaterial(x);}}}export{E as compressUvs};//# sourceMappingURL=compressUvs.js.map
//# sourceMappingURL=compressUvs.js.map