// Index-only enhancement: actual preview bounds for admission, assets unchanged. import assert from 'node:assert/strict' import {readFileSync,writeFileSync,mkdirSync,existsSync} from 'node:fs' import {resolve,join,relative} from 'node:path' const base=resolve('tools/city-massing/city/cad-bim/city-regions-v6'),out=resolve(process.argv[2]||'tools/city-massing/city/cad-bim/city-regions-v7') assert.ok(!existsSync(out)) const m=JSON.parse(readFileSync(join(base,'manifest.json'))),coarse=JSON.parse(readFileSync(join(base,'coarse-tileset.json'))) for(const r of m.regions){ const path=resolve(base,r.url),tree=JSON.parse(readFileSync(path));assert.equal(tree.root.children.length,r.previewCount) r.admissionBounds=tree.root.children.map(t=>t.boundingVolume) r.url=relative(out,path).replaceAll('\\','/') } for(const r of m.coarseRecords)r.uri=relative(out,resolve(base,r.uri)).replaceAll('\\','/') for(const t of coarse.root.children)t.content.uri=relative(out,resolve(base,t.content.uri)).replaceAll('\\','/') m.assetBase='city-regions-v6';m.policy+=' Actual preview-content bounds drive visible-distance admission, not broad region sphere.' mkdirSync(out);writeFileSync(join(out,'manifest.json'),JSON.stringify(m,null,2));writeFileSync(join(out,'coarse-tileset.json'),JSON.stringify(coarse)) console.log(JSON.stringify({out,regions:m.regions.length,admissionBounds:m.regions.reduce((s,r)=>s+r.admissionBounds.length,0),geometryChanged:false,texturesChanged:false}))