- Timestamp:
- 06/19/08 04:34:20 (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GTP/trunk/App/Demos/Vis/CHC_revisited/CHCPlusPlusTraverser.cpp
r2774 r2776 4 4 using namespace std; 5 5 6 namespace CHCDemo 6 namespace CHCDemoEngine 7 7 { 8 8 … … 18 18 const int visible = query->GetQueryResult() > mVisibilityThreshold; 19 19 20 BvhNode *node = query->GetFrontNode(); 21 22 if (visible) 23 { 24 // node was previously invisible 25 if (!node->IsVisible()) 26 { 27 // reset flag 28 node->SetTimesTestedInvisible(0); 29 node->SetAssumedVisibleFrameId(mFrameId + mAssumedVisibleFrames); 20 // multiquery 21 if (query->GetSize() > 1) 22 { 23 // failed query: query individual nodes 24 if (visible) 25 { 26 for (size_t i = 0; i < query->GetSize(); ++ i) 27 { 28 BvhNode *node = query->GetNodes()[i]; 29 OcclusionQuery *q = IssueOcclusionQuery(node, false); 30 mQueryQueue.push(q); 31 } 32 } 33 else // query successful: update classifications 34 { 35 for (size_t i = 0; i < query->GetSize(); ++ i) 36 { 37 BvhNode *node = query->GetNodes()[i]; 38 node->IncTimesTestedInvisible(); 39 node->SetVisible(false); 40 } 41 42 mStats.mNumQueryCulledNodes += query->GetSize(); 43 } 44 } 45 else // single query 46 { 47 BvhNode *node = query->GetFrontNode(); 48 49 // failed query: query individual nodes 50 if (visible) 51 { 52 // node was previously invisible 53 if (!node->IsVisible()) 54 { 55 // reset flag 56 node->SetTimesTestedInvisible(0); 57 node->SetAssumedVisibleFrameId(mFrameId + mAssumedVisibleFrames); 58 } 59 else 60 { // randomize first invokation 61 node->SetAssumedVisibleFrameId(mFrameId + Random(mAssumedVisibleFrames + 1)); 62 } 63 64 mBvh->MakeParentsVisible(node); 65 TraverseNode(node); 30 66 } 31 67 else 32 // randomize first invokation 33 node->SetAssumedVisibleFrameId(mFrameId + Random(mAssumedVisibleFrames + 1)); 34 35 mBvh->MakeParentsVisible(node); 36 TraverseNode(node); 37 } 38 else 39 { 40 node->IncTimesTestedInvisible(); 41 ++ mStats.mNumQueryCulledNodes; 42 } 43 44 node->SetVisible(visible); 68 { 69 node->IncTimesTestedInvisible(); 70 ++ mStats.mNumQueryCulledNodes; 71 } 72 73 node->SetVisible(visible); 74 } 45 75 } 46 76 … … 51 81 while (!mDistanceQueue.empty() || !mQueryQueue.empty()) 52 82 { 53 bool resultAvailable ;83 bool resultAvailable = false; 54 84 while (!mQueryQueue.empty() && 55 85 (mDistanceQueue.empty() || (resultAvailable = mQueryQueue.front()->ResultAvailable()))) … … 119 149 } 120 150 } 151 else 152 { 153 if (node->IsVirtualLeaf()) 154 { 155 node->SetVisible(true); 156 mBvh->MakeParentsVisible(node); 157 } 158 else // reset visibility classification 159 { 160 node->SetVisible(false); 161 } 162 } 121 163 122 164 // always traverse a node if it was previously visible … … 202 244 if (query->GetNodes().empty()) 203 245 { 246 // single node will anever cause a wasted query 204 247 newBatchVal = 1.0f; 205 248 } … … 219 262 } 220 263 264 //cout <<"size: " << query->GetSize() << endl; 221 265 IssueOcclusionQuery(*query, false); 222 266 … … 227 271 void CHCPlusPlusTraverser::IssueMultiQueries() 228 272 { 229 if (0 && mUseRenderQueue)230 {231 if (mRenderState->SetState(RenderState::RENDER))232 ++ mStats.mNumStateChanges;233 234 mRenderQueue.Render();235 mRenderQueue.Clear();236 }237 238 273 while (!mIQueue.empty()) 239 274 { 240 BvhNode *node = mIQueue.front(); 241 mIQueue.pop(); 242 243 OcclusionQuery *query = GetNextMultiQuery(mIQueue); 244 //OcclusionQuery *query = IssueOcclusionQuery(node); 275 OcclusionQuery *query; 276 277 if (mUseMultiQueries) 278 { 279 query = GetNextMultiQuery(mIQueue); 280 } 281 else 282 { 283 BvhNode *node = mIQueue.front(); 284 mIQueue.pop(); 285 query = IssueOcclusionQuery(node, false); 286 } 245 287 246 288 mQueryQueue.push(query);
Note: See TracChangeset
for help on using the changeset viewer.