build-region-admission-index.mjs 1.4 KB

1234567891011121314151617
  1. // Index-only enhancement: actual preview bounds for admission, assets unchanged.
  2. import assert from 'node:assert/strict'
  3. import {readFileSync,writeFileSync,mkdirSync,existsSync} from 'node:fs'
  4. import {resolve,join,relative} from 'node:path'
  5. 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')
  6. assert.ok(!existsSync(out))
  7. const m=JSON.parse(readFileSync(join(base,'manifest.json'))),coarse=JSON.parse(readFileSync(join(base,'coarse-tileset.json')))
  8. for(const r of m.regions){
  9. const path=resolve(base,r.url),tree=JSON.parse(readFileSync(path));assert.equal(tree.root.children.length,r.previewCount)
  10. r.admissionBounds=tree.root.children.map(t=>t.boundingVolume)
  11. r.url=relative(out,path).replaceAll('\\','/')
  12. }
  13. for(const r of m.coarseRecords)r.uri=relative(out,resolve(base,r.uri)).replaceAll('\\','/')
  14. for(const t of coarse.root.children)t.content.uri=relative(out,resolve(base,t.content.uri)).replaceAll('\\','/')
  15. m.assetBase='city-regions-v6';m.policy+=' Actual preview-content bounds drive visible-distance admission, not broad region sphere.'
  16. mkdirSync(out);writeFileSync(join(out,'manifest.json'),JSON.stringify(m,null,2));writeFileSync(join(out,'coarse-tileset.json'),JSON.stringify(coarse))
  17. console.log(JSON.stringify({out,regions:m.regions.length,admissionBounds:m.regions.reduce((s,r)=>s+r.admissionBounds.length,0),geometryChanged:false,texturesChanged:false}))