// 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}