@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 • 2.58 kB
JavaScript
import {Grid2D}from'../grid2d/index.js';import {Box2,Vector2}from'three';import c from'path';import {ChildProcessPool}from'../lib/ChildProcessPool.js';import {fork}from'child_process';async function y(B,i){const o=await i.acquire();let m=null,t=null;const s=new Promise((e,n)=>{m=e,t=n;});return o.on("message",e=>{m(e);let n=false;e||(n=true),e&&e.heapUsed>500*1024*1024&&(n=true),i.release(o,n);}),o.on("exit",(e,n)=>{e!==0&&t(new Error(`Worker exited with code ${e}, signal ${n}`)),i.release(o,true);}),o.on("error",e=>{t(e),i.release(o,true);}),o.send(B),s}async function I(B,i,o,m){const t=new ChildProcessPool(()=>fork(c.join(import.meta.dirname,"generateDocumentWorker.js")),1),s=[],e=crypto.randomUUID(),n=c.resolve(c.join(i,`${e}_lod2.glb`));s.push(n);const r=await y({cells:B,databasePath:o,hasAlphaEnabled:m,minVolume:.5,resizeFactor:1/32,file:n},t);if(r===null)return null;let f={boundingVolume:{region:[r.localBBox.min.x,r.localBBox.min.y,r.localBBox.max.x,r.localBBox.max.y,r.localBBox.min.z,r.localBBox.max.z]},geometricError:20,refine:"REPLACE",content:{uri:`${e}_lod2.glb`},children:[]};const p=new Grid2D(new Box2(new Vector2(r.localBBox.min.x,r.localBBox.min.y),new Vector2(r.localBBox.max.x,r.localBBox.max.y)),1e-4);B.forEach(u=>p.add(u.x,u.y,u.data));for(const u of p.cells){const g=crypto.randomUUID(),w=c.resolve(c.join(i,`${g}_lod1.glb`));s.push(w);const l=await y({cells:u,databasePath:o,hasAlphaEnabled:m,minVolume:.1,resizeFactor:1/4,file:w},t);if(l===null)continue;const k={boundingVolume:{region:[l.localBBox.min.x,l.localBBox.min.y,l.localBBox.max.x,l.localBBox.max.y,l.localBBox.min.z,l.localBBox.max.z]},geometricError:5,refine:"REPLACE",content:{uri:`${g}_lod1.glb`},children:[]};f.children.push(k);const D=new Grid2D(new Box2(new Vector2(l.localBBox.min.x,l.localBBox.min.y),new Vector2(l.localBBox.max.x,l.localBBox.max.y)),5e-5);u.forEach(x=>D.add(x.x,x.y,x.data));for(const x of D.cells){const h=crypto.randomUUID(),W=c.resolve(c.join(i,`${h}_lod0.glb`));s.push(W);const a=await y({cells:x,databasePath:o,hasAlphaEnabled:m,minVolume:void 0,resizeFactor:1,file:W},t);a!==null&&k.children.push({boundingVolume:{region:[a.localBBox.min.x,a.localBBox.min.y,a.localBBox.max.x,a.localBBox.max.y,a.localBBox.min.z,a.localBBox.max.z]},geometricError:0,refine:"REPLACE",content:{uri:`${h}_lod0.glb`}});}}return {tile:{boundingVolume:f.boundingVolume,geometricError:50,refine:"ADD",children:[f]},files:s,heapUsed:process.memoryUsage().heapUsed}}export{I as generateCell};//# sourceMappingURL=generateCell.js.map
//# sourceMappingURL=generateCell.js.map