Ignore:
Timestamp:
06/18/08 17:33:16 (16 years ago)
Author:
mattausch
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • GTP/trunk/App/Demos/Vis/CHC_revisited/CHCPlusPlusTraverser.cpp

    r2770 r2771  
    22#include "RenderState.h" 
    33 
     4using namespace std; 
    45 
    56namespace CHCDemo 
    67{ 
    78 
    8 CHCPlusPlusTraverser::CHCPlusPlusTraverser()  
     9 
     10CHCPlusPlusTraverser::CHCPlusPlusTraverser() 
    911{ 
    1012} 
     
    1618        while (!mDistanceQueue.empty() || !mQueryQueue.empty()) 
    1719        { 
     20                bool resultAvailable; 
    1821                while (!mQueryQueue.empty() &&  
    19                            (mQueryQueue.front()->ResultAvailable() || mDistanceQueue.empty())) 
    20                 { 
    21                         if (mQueryQueue.front()->ResultAvailable()) 
    22                         { 
    23                                 OcclusionQuery *query = mQueryQueue.front(); 
    24                                 mQueryQueue.pop(); 
    25  
    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()) 
     22                           (mDistanceQueue.empty() || (resultAvailable = mQueryQueue.front()->ResultAvailable()))) 
     23                { 
     24                        while (!resultAvailable && !mVQueue.empty()) 
    4325                        { 
    4426                                BvhNode *node = mVQueue.front(); 
    4527                                mVQueue.pop(); 
    46  
     28                                 
    4729                                OcclusionQuery *query = IssueOcclusionQuery(node, true); 
    4830                                mQueryQueue.push(query); 
     31                                resultAvailable = mQueryQueue.front()->ResultAvailable(); 
     32                        } 
     33                         
     34                        OcclusionQuery *query = mQueryQueue.front(); 
     35                        mQueryQueue.pop(); 
     36 
     37                        // wait until result available 
     38                        int visiblePixels = query->GetQueryResult(); 
     39 
     40                        if (visiblePixels > mVisibilityThreshold) 
     41                        { 
     42                                BvhNode *node = query->GetFrontNode(); 
     43 
     44                                node->SetVisible(true); 
     45                                mBvh->MakeParentsVisible(node); 
     46                                TraverseNode(node); 
     47                        } 
     48                        else 
     49                        { 
     50                                ++ mStats.mNumQueryCulledNodes; 
    4951                        } 
    5052                }        
     
    7577                                         
    7678                                        // identify nodes that we cannot skip queries for 
    77                                         const bool testFeasible = (!wasVisible || (node->IsVirtualLeaf() /*&& (node->GetAssumedVisibleFrameId() <= mFrameId)*/)); 
     79                                        const bool testFeasible = (!wasVisible || (node->IsVirtualLeaf() && (node->GetAssumedVisibleFrameId() <= mFrameId))); 
    7880                                                  
    7981 
     
    109111                } 
    110112 
     113                // distance queue empty: feed the remaining multiqueries to 
     114                // be able to proceed traversal 
    111115                if (mDistanceQueue.empty()) 
    112116                { 
    113                         // issue remaining multiqueries 
    114117                        IssueMultiQueries(); 
    115118                } 
     119        } 
     120 
     121        // render the rest of the objects 
     122        if (mUseRenderQueue) 
     123        { 
     124                if (mRenderState->SetState(RenderState::RENDER)) 
     125                        ++ mStats.mNumStateChanges; 
     126 
     127                mRenderQueue.Render(); 
     128                mRenderQueue.Clear(); 
    116129        } 
    117130 
     
    156169        mIQueue.push(node); 
    157170 
    158         if (mIQueue.size() > 50) 
     171        if (mIQueue.size() > mMaxBatchSize) 
    159172        { 
    160173                IssueMultiQueries(); 
Note: See TracChangeset for help on using the changeset viewer.