| 1234567891011121314151617181920212223242526272829303132333435363738 |
- // Installed Cesium BaseTraversal over configured preview/fine hierarchy, injected readiness.
- import assert from 'node:assert/strict'
- import {readFileSync,writeFileSync} from 'node:fs'
- import {resolve,join,dirname} from 'node:path'
- import {Matrix4,Cartesian3,BoundingSphere,PerspectiveFrustum,Intersect} from 'cesium'
- import Traversal from '../../node_modules/@cesium/engine/Source/Scene/Cesium3DTilesetTraversal.js'
- import Base from '../../node_modules/@cesium/engine/Source/Scene/Cesium3DTilesetBaseTraversal.js'
- import Refine from '../../node_modules/@cesium/engine/Source/Scene/Cesium3DTileRefine.js'
- const root=resolve('tools/city-massing/city/cad-bim/city-regions-v7'),manifest=JSON.parse(readFileSync(join(root,'manifest.json'))),poses=JSON.parse(readFileSync('.scratch/cockpit-shell-panel-layout/verify/artifacts/t35/admission-pose-sweep-v7.json')).samples
- let number=0,allFineSelections=0,allPendingFallbacks=0
- const results=[],original=Traversal.selectTile
- Traversal.selectTile=t=>t.tileset._selectedTiles.push(t)
- try{for(const pose of poses.filter(p=>p.heading===0)){
- const p=pose.cameraECEF,position=new Cartesian3(...p.position),frustum=new PerspectiveFrustum({fov:Math.PI/3,aspectRatio:1440/810,near:1,far:14000}),volume=frustum.computeCullingVolume(position,new Cartesian3(...p.direction),new Cartesian3(...p.up));void frustum.projectionMatrix
- for(const id of pose.newRegions){
- const record=manifest.regions.find(r=>r.id===id),path=resolve(root,record.url),tree=JSON.parse(readFileSync(path)),transform=Matrix4.fromArray(tree.root.transform)
- const ts={_requestedTiles:[],_selectedTiles:[],_selectedTilesToStyle:[],_emptyTiles:[],memoryAdjustedScreenSpaceError:96,debugFreezeFrame:false,loadSiblings:true,hasMixedContent:false,hasExtension(){return false},_minimumPriority:{distance:Infinity,depth:Infinity,foveatedFactor:Infinity,reverseScreenSpaceError:Infinity},_maximumPriority:{distance:0,depth:0,foveatedFactor:0,reverseScreenSpaceError:0},_statistics:{visited:0},_cache:{touch(){}},_cullRequestsWhileMoving:false}
- let available=new Set()
- function make(json,parent){const v=json.boundingVolume,b=v.box,s=v.sphere||[...b.slice(0,3),Math.hypot(...b.slice(3))];assert.ok(s);const sphere=new BoundingSphere(Matrix4.multiplyByPoint(transform,new Cartesian3(...s.slice(0,3)),new Cartesian3()),s[3]),uri=json.content?.uri,level=!uri?'empty':record.previewContentUrls.includes(uri)?'preview':'fine'
- const t={tileset:ts,parent,children:[],refine:Refine.REPLACE,level,uri,hasRenderableContent:!!uri,hasEmptyContent:!uri,contentExpired:false,_depth:parent?parent._depth+1:0,_visible:true,_inRequestVolume:true,_distanceToCamera:1,_foveatedFactor:0,_priorityReverseScreenSpaceError:0,_selectedFrame:-1,
- get isVisible(){return this._visible&&this._inRequestVolume},getScreenSpaceError(){return this._screenSpaceError},updateExpiration(){},updatePriority(){},content:{featurePropertiesDirty:false},contentVisibility(){return 1},
- updateVisibility(){this._distanceToCamera=Math.max(.01,Cartesian3.distance(position,sphere.center)-sphere.radius);this._screenSpaceError=json.geometricError*810/(this._distanceToCamera*frustum.sseDenominator);this._visible=volume.computeVisibility(sphere)!==Intersect.OUTSIDE;this.contentAvailable=!!uri&&available.has(level);this.hasUnloadedRenderableContent=!!uri&&!this.contentAvailable}}
- t.children=(json.children||[]).map(c=>make(c,t));return t
- }
- ts.root=make(tree.root,null)
- function run(levels){available=new Set(levels);Base.selectTiles(ts,{frameNumber:++number,camera:{timeSinceMoved:1,positionWCDeltaMagnitude:0,positionWCDeltaMagnitudeLastFrame:0}});const tally=list=>list.reduce((a,t)=>{a[t.level]++;return a},{empty:0,preview:0,fine:0});assert.ok(ts._requestedTiles.filter(t=>t.uri).length<=record.contentCount);return{availableLevels:levels,selected:tally(ts._selectedTiles),requested:tally(ts._requestedTiles)}}
- const waiting=run(['preview']),ready=run(['preview','fine']),evicted=run(['preview'])
- assert.deepEqual(evicted.selected,waiting.selected,'fine loss returns same visible fallback')
- assert.ok(waiting.selected.preview>0,'admitted region has selected preview fallback with fine pending')
- assert.equal(waiting.selected.fine,0)
- allFineSelections+=ready.selected.fine;allPendingFallbacks+=waiting.selected.preview
- results.push({heading:pose.heading,pitch:pose.pitch,range:pose.range,region:id,contentBudget:record.contentCount,waiting,ready,evicted})
- }
- }
- assert.ok(allFineSelections>0,'actual near SSE must select finest leaves when loaded')
- const report={passed:true,actualCesiumBaseTraversal:true,injectedReadiness:true,samples:results,totalFineSelections:allFineSelections,totalPendingPreviewFallbacks:allPendingFallbacks,requestsSent:false,glbDecoded:false,renderingValidated:false,fpsValidated:false,scope:'same recorded-pose assumptions as admission sweep; preview/fine pending-ready-evicted traversal with real index'}
- writeFileSync(process.argv[2]||'.scratch/cockpit-shell-panel-layout/verify/artifacts/t35/region-fine-traversal-v7.json',JSON.stringify(report,null,2));console.log(JSON.stringify({passed:true,samples:results.length,totalFineSelections:allFineSelections,totalPendingPreviewFallbacks:allPendingFallbacks,renderingValidated:false}))
- }finally{Traversal.selectTile=original}
|