| 12345678910111213141516171819202122232425262728293031323334353637383940 |
- import assert from 'node:assert/strict'
- import { readFileSync, existsSync } from 'node:fs'
- import { resolve, join } from 'node:path'
- const dir = resolve(process.argv[2] || 'tools/city-massing/city/cad-bim/instanced-coarse-pilot-v1')
- const report = JSON.parse(readFileSync(join(dir, 'manifest.json'), 'utf8'))
- const tree = JSON.parse(readFileSync(join(dir, 'tileset.json'), 'utf8'))
- assert.equal(report.candidateOnly, true)
- assert.equal(report.buildings, 13)
- assert.equal(tree.root.children.length, report.records.length)
- const ids = new Set(), files = new Set()
- let instances = 0, bytes = 0
- for (const record of report.records) {
- assert.equal(record.buildingIds.length, new Set(record.buildingIds).size)
- for (const id of record.buildingIds) { assert.ok(!ids.has(id), `duplicate ${id}`); ids.add(id) }
- const path = join(dir, record.uri), glb = readFileSync(path)
- assert.ok(!files.has(record.uri)); files.add(record.uri); assert.equal(glb.length, record.bytes); bytes += glb.length
- assert.equal(glb.toString('ascii', 0, 4), 'glTF'); assert.equal(glb.readUInt32LE(4), 2); assert.equal(glb.readUInt32LE(8), glb.length)
- const jsonLength = glb.readUInt32LE(12), json = JSON.parse(glb.toString('utf8', 20, 20 + jsonLength))
- assert.deepEqual(json.extensionsRequired, ['EXT_mesh_gpu_instancing'])
- assert.equal(json.nodes[0].children.length, json.nodes.length - 1)
- let extensionNodes = 0
- for (const node of json.nodes.slice(1)) {
- const ext = node.extensions?.EXT_mesh_gpu_instancing
- if (!ext) continue
- extensionNodes++
- const attrs = ext.attributes
- assert.ok(Number.isInteger(attrs.TRANSLATION) && Number.isInteger(attrs.ROTATION) && Number.isInteger(attrs.SCALE))
- const count = json.accessors[attrs.TRANSLATION].count
- assert.equal(json.accessors[attrs.ROTATION].count, count)
- assert.equal(json.accessors[attrs.SCALE].count, count)
- assert.equal(node.extras.buildingIds.length, count)
- instances += count
- }
- assert.ok(extensionNodes > 0)
- assert.ok(json.extensionsUsed.includes('EXT_mesh_gpu_instancing'))
- assert.ok(json.meshes.length > 0)
- assert.ok(json.images === undefined)
- }
- assert.equal(ids.size, 13); assert.equal(instances, report.records.reduce((n, r) => n + r.instanceCount, 0)); assert.equal(bytes, report.records.reduce((n, r) => n + r.bytes, 0))
- console.log(JSON.stringify({ passed: true, buildings: ids.size, files: files.size, instances, bytes, caveat: 'offline GLB structure only; no Cesium traversal or FPS validation' }))
|