Changeset 2764 for GTP/trunk/App/Demos/Vis/CHC_revisited/CHCTraverser.cpp
- Timestamp:
- 06/17/08 03:47:02 (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GTP/trunk/App/Demos/Vis/CHC_revisited/CHCTraverser.cpp
r2755 r2764 1 1 #include "CHCTraverser.h" 2 #include "SceneEntity.h" 3 2 4 3 5 namespace CHCDemo … … 17 19 void CHCTraverser::Render() 18 20 { 19 #if 0 21 mStats.Reset(); 22 mRenderState->mTexturesEnabled = false; 23 EnqueueNode(mBvh->GetRoot()); 24 20 25 QueryQueue queryQueue; 21 26 … … 24 29 { 25 30 while (!queryQueue.empty() && 26 ( ResultAvailable(queryQueue.front()) || mDistanceQueue.empty()))31 (queryQueue.front()->ResultAvailable() || mDistanceQueue.empty())) 27 32 { 28 HierarchyNode *node= queryQueue.front();33 OcclusionQuery *query = queryQueue.front(); 29 34 queryQueue.pop(); 30 35 31 36 // wait until result available 32 int visiblePixels = GetOcclusionQueryResult(node);37 int visiblePixels = query->GetQueryResult(); 33 38 34 if (visiblePixels > mVisibilityThreshold)39 if (visiblePixels > mVisibilityThreshold) 35 40 { 36 PullUpVisibility(node); 41 BvhNode *node = query->GetFrontNode(); 42 43 mBvh->MakeParentsVisible(node); 37 44 TraverseNode(node); 38 45 } 39 46 else 40 47 { 41 mNumQueryCulledNodes ++;48 ++ mStats.mNumQueryCulledNodes; 42 49 } 43 50 } … … 46 53 if (!mDistanceQueue.empty()) 47 54 { 48 HierarchyNode *node = mDistanceQueue.top(); 49 55 BvhNode *node = mDistanceQueue.top(); 50 56 mDistanceQueue.pop(); 51 57 52 mNumTraversedNodes ++; 53 54 bool intersects; 55 56 if (InsideViewFrustum(node, intersects)) 58 if (mBvh->IsWithinViewFrustum(node)) 57 59 { 58 60 // for near plane intersecting bounding box possible 59 61 // wrong results => skip occlusion query 60 if (intersects)62 if (IntersectsNearPlane(node)) 61 63 { 62 64 // update node's visited flag 63 node->SetLastVisited (mFrameID);65 node->SetLastVisitedFrame(mFrameID); 64 66 node->SetVisible(true); 65 PullUpVisibility(node); 67 mBvh->MakeParentsVisible(node); 68 66 69 TraverseNode(node); 67 70 } … … 69 72 { 70 73 // identify previously visible nodes 71 bool wasVisible = node->Visible() && (node->LastVisited() == mFrameID - 1);74 const bool wasVisible = node->IsVisible() && (node->GetLastVisitedFrame() == mFrameID - 1); 72 75 73 76 // identify nodes that we cannot skip queries for 74 bool leafOrWasInvisible = (node->LastVisited() != mFrameID) && (!wasVisible || node->IsLeaf()); 77 const bool leafOrWasInvisible = 78 (node->GetLastVisitedFrame() != mFrameID) && (!wasVisible || node->IsVirtualLeaf()); 75 79 76 80 // reset node's visibility classification … … 78 82 79 83 // update node's visited flag 80 node->SetLastVisited (mFrameID);84 node->SetLastVisitedFrame(mFrameID); 81 85 82 86 // skip testing previously visible interior nodes 83 if (leafOrWasInvisible)87 if (leafOrWasInvisible) 84 88 { 85 IssueOcclusionQuery(node, wasVisible);86 queryQueue.push( node);89 OcclusionQuery *query = IssueOcclusionQuery(node, wasVisible); 90 queryQueue.push(query); 87 91 } 88 92 89 93 // always traverse a node if it was visible 90 if (wasVisible)94 if (wasVisible) 91 95 TraverseNode(node); 92 96 } … … 95 99 { 96 100 // for stats 97 mNumFrustumCulledNodes ++;101 ++ mStats.mNumFrustumCulledNodes; 98 102 } 99 103 } 100 104 } 101 #endif102 105 } 103 106
Note: See TracChangeset
for help on using the changeset viewer.