- Timestamp:
- 06/17/08 15:20:32 (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GTP/trunk/App/Demos/Vis/CHC_revisited/CHCPlusPlusTraverser.cpp
r2755 r2767 4 4 { 5 5 6 CHCPlusPlusTraverser::CHCPlusPlusTraverser() : RenderTraverser()6 CHCPlusPlusTraverser::CHCPlusPlusTraverser() 7 7 { 8 8 } 9 9 10 10 11 CHCPlusPlusTraverser::~CHCPlusPlusTraverser()11 void CHCPlusPlusTraverser::Traverse() 12 12 { 13 //DelQueries(); 14 } 13 //-- PART 1: process finished occlusion queries 14 while (!mDistanceQueue.empty() || !mQueryQueue.empty()) 15 { 16 while (!mQueryQueue.empty() && 17 (mQueryQueue.front()->ResultAvailable() || mDistanceQueue.empty())) 18 { 19 OcclusionQuery *query = mQueryQueue.front(); 20 mQueryQueue.pop(); 21 22 // wait until result available 23 int visiblePixels = query->GetQueryResult(); 15 24 25 if (visiblePixels > mVisibilityThreshold) 26 { 27 BvhNode *node = query->GetFrontNode(); 16 28 17 void CHCPlusPlusTraverser::Render() 18 { 29 mBvh->MakeParentsVisible(node); 30 TraverseNode(node); 31 } 32 else 33 { 34 ++ mStats.mNumQueryCulledNodes; 35 } 36 } 37 38 //-- PART 2: hierarchical traversal 39 if (!mDistanceQueue.empty()) 40 { 41 BvhNode *node = mDistanceQueue.top(); 42 mDistanceQueue.pop(); 43 44 if (mBvh->IsWithinViewFrustum(node)) 45 { 46 // for near plane intersecting bounding box possible 47 // wrong results => skip occlusion query 48 if (IntersectsNearPlane(node)) 49 { 50 // update node's visited flag 51 node->SetLastVisitedFrame(mFrameId); 52 node->SetVisible(true); 53 mBvh->MakeParentsVisible(node); 54 55 TraverseNode(node); 56 } 57 else 58 { 59 // identify previously visible nodes 60 const bool wasVisible = node->IsVisible() && (node->GetLastVisitedFrame() == mFrameId - 1); 61 62 // identify nodes that we cannot skip queries for 63 const bool leafOrWasInvisible = 64 (node->GetLastVisitedFrame() != mFrameId) && (!wasVisible || node->IsVirtualLeaf()); 65 66 // reset node's visibility classification 67 node->SetVisible(false); 68 69 // update node's visited flag 70 node->SetLastVisitedFrame(mFrameId); 71 72 // skip testing previously visible interior nodes 73 if (leafOrWasInvisible) 74 { 75 OcclusionQuery *query = IssueOcclusionQuery(node, wasVisible); 76 mQueryQueue.push(query); 77 } 78 79 // always traverse a node if it was visible 80 if (wasVisible) 81 TraverseNode(node); 82 } 83 } 84 else 85 { 86 // for stats 87 ++ mStats.mNumFrustumCulledNodes; 88 } 89 } 90 } 19 91 } 20 92
Note: See TracChangeset
for help on using the changeset viewer.