- Timestamp:
- 06/18/08 14:38:45 (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GTP/trunk/App/Demos/Vis/CHC_revisited/CHCPlusPlusTraverser.cpp
r2767 r2770 1 1 #include "CHCPlusPlusTraverser.h" 2 #include "RenderState.h" 3 2 4 3 5 namespace CHCDemo … … 17 19 (mQueryQueue.front()->ResultAvailable() || mDistanceQueue.empty())) 18 20 { 19 OcclusionQuery *query = mQueryQueue.front(); 20 mQueryQueue.pop(); 21 22 // wait until result available 23 int visiblePixels = query->GetQueryResult(); 21 if (mQueryQueue.front()->ResultAvailable()) 22 { 23 OcclusionQuery *query = mQueryQueue.front(); 24 mQueryQueue.pop(); 24 25 25 if (visiblePixels > mVisibilityThreshold) 26 // wait until result available 27 int visiblePixels = query->GetQueryResult(); 28 29 if (visiblePixels > mVisibilityThreshold) 30 { 31 BvhNode *node = query->GetFrontNode(); 32 33 node->SetVisible(true); 34 mBvh->MakeParentsVisible(node); 35 TraverseNode(node); 36 } 37 else 38 { 39 ++ mStats.mNumQueryCulledNodes; 40 } 41 } 42 else if (!mVQueue.empty()) 26 43 { 27 BvhNode *node = query->GetFrontNode(); 44 BvhNode *node = mVQueue.front(); 45 mVQueue.pop(); 28 46 29 mBvh->MakeParentsVisible(node); 30 TraverseNode(node); 31 } 32 else 33 { 34 ++ mStats.mNumQueryCulledNodes; 47 OcclusionQuery *query = IssueOcclusionQuery(node, true); 48 mQueryQueue.push(query); 35 49 } 36 50 } … … 61 75 62 76 // 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); 77 const bool testFeasible = (!wasVisible || (node->IsVirtualLeaf() /*&& (node->GetAssumedVisibleFrameId() <= mFrameId)*/)); 78 68 79 69 80 // update node's visited flag … … 71 82 72 83 // skip testing previously visible interior nodes 73 if ( leafOrWasInvisible)84 if (testFeasible) 74 85 { 75 OcclusionQuery *query = IssueOcclusionQuery(node, wasVisible); 76 mQueryQueue.push(query); 86 // reset node's visibility classification 87 node->SetVisible(false); 88 89 if (!wasVisible) 90 { 91 QueryPreviouslyInvisibleNodes(node); 92 } 93 else 94 { 95 mVQueue.push(node); 96 } 77 97 } 78 98 79 // always traverse a node if it was visible99 // always traverse a node if it was previously visible 80 100 if (wasVisible) 81 101 TraverseNode(node); … … 88 108 } 89 109 } 110 111 if (mDistanceQueue.empty()) 112 { 113 // issue remaining multiqueries 114 IssueMultiQueries(); 115 } 116 } 117 118 ////////////// 119 //-- issue remaining previously visible node queries 120 121 while (!mVQueue.empty()) 122 { 123 BvhNode *node = mVQueue.front(); 124 mVQueue.pop(); 125 126 OcclusionQuery *query = IssueOcclusionQuery(node, true); 127 mQueryQueue.push(query); 128 } 129 130 while (!mQueryQueue.empty()) 131 { 132 OcclusionQuery *query = mQueryQueue.front(); 133 mQueryQueue.pop(); 134 135 // wait until result available 136 int visiblePixels = query->GetQueryResult(); 137 138 if (visiblePixels > mVisibilityThreshold) 139 { 140 BvhNode *node = query->GetFrontNode(); 141 142 node->SetVisible(true); 143 mBvh->MakeParentsVisible(node); 144 } 145 else 146 { 147 ++ mStats.mNumQueryCulledNodes; 148 } 90 149 } 91 150 } 92 151 152 153 154 void CHCPlusPlusTraverser::QueryPreviouslyInvisibleNodes(BvhNode *node) 155 { 156 mIQueue.push(node); 157 158 if (mIQueue.size() > 50) 159 { 160 IssueMultiQueries(); 161 } 93 162 } 163 164 165 void CHCPlusPlusTraverser::IssueMultiQueries() 166 { 167 if (0 && mUseRenderQueue) 168 { 169 if (mRenderState->SetState(RenderState::RENDER)) 170 ++ mStats.mNumStateChanges; 171 172 mRenderQueue.Render(); 173 mRenderQueue.Clear(); 174 } 175 176 while (!mIQueue.empty()) 177 { 178 BvhNode *node = mIQueue.front(); 179 mIQueue.pop(); 180 181 OcclusionQuery *query = IssueOcclusionQuery(node, false); 182 mQueryQueue.push(query); 183 } 184 } 185 186 187 }
Note: See TracChangeset
for help on using the changeset viewer.