UNPKG

@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 • 3.02 kB
import {Logger,Document}from'@gltf-transform/core';import {mergeDocuments,dedup,flatten,weld,join,unpartition,simplify,draco,prune}from'@gltf-transform/functions';import {Box3,Vector3}from'three';import {assignFeatureIdToTexCoord2}from'../functions/assignFeatureIdToTexCoord2.js';import {assignFeatureIds}from'../functions/assignFeaturesIds.js';import {mergeTextures}from'../functions/mergeTextures.js';import {MeshoptSimplifier}from'meshoptimizer';import A from'proj4';import {compressBasisUniversal}from'../functions/compressBasisUniversal.js';import {getTextures}from'../functions/getTextures.js';import {getIO}from'./io.js';Logger.DEFAULT_INSTANCE=new Logger(Logger.Verbosity.SILENT);const v="+proj=longlat +datum=WGS84 +no_defs +type=crs",z="+proj=geocent +datum=WGS84 +units=m +no_defs +type=crs",S=A(z,v);function U(i){return i?o=>{const[f,w,m]=S.inverse([o.data.minX,o.data.minY,o.data.minHeight]),[n,a,s]=S.inverse([o.data.maxX,o.data.maxY,o.data.maxHeight]),d=new Box3(new Vector3(f,w,m),new Vector3(n,a,s)),e=new Vector3;return d.getSize(e),e.x*e.y*e.z>i}:()=>true}async function it(i,o,f,w){if(i.length===0)return null;const m=await getIO(),n=new Box3;i.forEach(t=>{n.expandByPoint(new Vector3(t.data.minX,t.data.minY,t.data.minHeight)),n.expandByPoint(new Vector3(t.data.maxX,t.data.maxY,t.data.maxHeight));});const a=i.filter(U(f));if(a.length===0)return {localBBox:n,document:new Document};const s=await o.get("SELECT doc, isInstanced, transformationMatrix, refId FROM data WHERE name = ?",[a[0].data.name]);if(!s)throw new Error(`No CityObject found with name "${a[0].data.name}"`);const d=s.doc;if(!d)throw new Error(`CityObject with name "${a[0].data.name}" has no associated document!`);const e=await m.readBinary(new Uint8Array(d));await getTextures(e,o),assignFeatureIdToTexCoord2(e,0);for(let t=1;t<a.length;t++){const u=a[t],h=await o.get("SELECT doc, isInstanced, transformationMatrix, refId from data WHERE name = ?",[u.data.name]);if(!h)throw new Error(`No CityObject found with name "${u.data.name}"`);const x=h.doc;if(!x)throw new Error(`CityObject with name "${u.data.name}" has no associated document!`);n.union(new Box3(new Vector3(a[t].data.minX,a[t].data.minY,a[t].data.minHeight),new Vector3(a[t].data.maxX,a[t].data.maxY,a[t].data.maxHeight)));const c=await m.readBinary(x);await getTextures(c,o),assignFeatureIdToTexCoord2(c,t);const T=mergeDocuments(e,c),b=e.getRoot().listScenes()[0],C=T.get(c.getRoot().listScenes()[0]),y=e.createNode().setName("SceneB");for(const B of C.listChildren())y.addChild(B);b.addChild(y),C.dispose();}return await mergeTextures(e,w),await e.transform(dedup(),flatten(),weld({}),join({}),unpartition(),simplify({simplifier:MeshoptSimplifier,ratio:0,error:.001}),draco({})),await compressBasisUniversal(e),await assignFeatureIds(e,a.map(t=>t.data.name),a.map(t=>t.data.attributes)),await e.transform(prune()),{document:e,localBBox:n}}export{it as generateDocument};//# sourceMappingURL=generateDocument.js.map //# sourceMappingURL=generateDocument.js.map