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 {Extension}from'@gltf-transform/core';import {MeshFeatures,FeatureId,FeatureIdTexture}from'./MeshFeatures.js';function F(l,f){return l==f?null:l}const d="EXT_mesh_features";class T extends Extension{constructor(){super(...arguments);this.extensionName=d;}createMeshFeatures(){return new MeshFeatures(this.document.getGraph())}createFeatureId(){return new FeatureId(this.document.getGraph())}createFeatureIdTexture(){return new FeatureIdTexture(this.document.getGraph())}read(r){return (r.jsonDoc.json.meshes||[]).forEach((n,s)=>{(n.primitives||[]).forEach((i,u)=>{this.readPrimitive(r,s,i,u);});}),this}readPrimitive(r,t,e,n){if(!e.extensions?.[d])return;const s=this.createMeshFeatures(),i=e.extensions[d].featureIds;for(const a of i){const c=this.createFeatureId();this.readFeatureId(r,c,a),s.addFeatureId(c);}r.meshes[t].listPrimitives()[n].setExtension(d,s);}readFeatureId(r,t,e){t.setFeatureCount(e.featureCount),e.nullFeatureId!==void 0&&t.setNullFeatureId(e.nullFeatureId),e.label!==void 0&&t.setLabel(e.label),e.attribute!==void 0&&t.setAttribute(e.attribute);const n=e.texture;if(n!==void 0){const s=this.createFeatureIdTexture();this.readFeatureIdTexture(r,s,n),t.setTexture(s);}if(e.propertyTable!==void 0){const o=this.document.getRoot().getExtension("EXT_structural_metadata");if(o){const u=o.listPropertyTables()[e.propertyTable];t.setPropertyTable(u);}else throw new Error(`${d}: No EXT_structural_metadata definition for looking up property tables`)}}readFeatureIdTexture(r,t,e){const s=r.jsonDoc.json.textures||[];e.channels&&t.setChannels(e.channels);const o=s[e.index].source;if(o!==void 0){const i=r.textures[o];t.setTexture(i);const u=t.getTextureInfo();u&&r.setTextureInfo(u,e);}}write(r){const e=r.jsonDoc.json.meshes;if(!e)return this;for(const n of this.document.getRoot().listMeshes()){const s=r.meshIndexMap.get(n);if(s===void 0)continue;const o=e[s];n.listPrimitives().forEach((i,u)=>{const a=o.primitives[u];this.writePrimitive(r,i,a);});}return this}writePrimitive(r,t,e){const n=t.getExtension(d);if(!n)return;const s={featureIds:[]};n.listFeatureIds().forEach(o=>{const i=this.createFeatureIdDef(r,o);s.featureIds.push(i);}),e.extensions=e.extensions||{},e.extensions[d]=s;}createFeatureIdDef(r,t){let e;const n=t.getTexture();if(n){const u=n.getTexture(),a=n.getTextureInfo();if(u&&a){const c=r.createTextureInfoDef(u,a);e={channels:F(n.getChannels(),[0])??void 0,index:c.index,texCoord:c.texCoord};}}let s;const o=t.getPropertyTable();if(o!==null){const a=this.document.getRoot().getExtension("EXT_structural_metadata");if(a)s=a.listPropertyTables().indexOf(o);else throw new Error(`${d}: No EXT_structural_metadata definition for looking up property table index`)}return {featureCount:t.getFeatureCount(),nullFeatureId:t.getNullFeatureId()??void 0,label:t.getLabel()??void 0,attribute:t.getAttribute()??void 0,texture:e,propertyTable:s}}}T.EXTENSION_NAME=d;export{T as EXTMeshFeatures};//# sourceMappingURL=EXTMeshFeatures.js.map //# sourceMappingURL=EXTMeshFeatures.js.map