Ignore:
Timestamp:
06/19/08 04:34:20 (16 years ago)
Author:
mattausch
Message:
 
File:
1 edited

Legend:

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

    r2774 r2776  
    44using namespace std; 
    55 
    6 namespace CHCDemo 
     6namespace CHCDemoEngine 
    77{ 
    88 
     
    1818        const int visible = query->GetQueryResult() > mVisibilityThreshold; 
    1919 
    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); 
    3066                } 
    3167                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        } 
    4575} 
    4676 
     
    5181        while (!mDistanceQueue.empty() || !mQueryQueue.empty()) 
    5282        { 
    53                 bool resultAvailable; 
     83                bool resultAvailable = false; 
    5484                while (!mQueryQueue.empty() &&  
    5585                           (mDistanceQueue.empty() || (resultAvailable = mQueryQueue.front()->ResultAvailable()))) 
     
    119149                                                } 
    120150                                        } 
     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                                        } 
    121163                                         
    122164                                        // always traverse a node if it was previously visible 
     
    202244                if (query->GetNodes().empty()) 
    203245                { 
     246                        // single node will anever cause a wasted query 
    204247                        newBatchVal = 1.0f; 
    205248                } 
     
    219262        } 
    220263 
     264        //cout <<"size: " << query->GetSize() << endl; 
    221265        IssueOcclusionQuery(*query, false); 
    222266 
     
    227271void CHCPlusPlusTraverser::IssueMultiQueries() 
    228272{ 
    229         if (0 && mUseRenderQueue) 
    230         { 
    231                 if (mRenderState->SetState(RenderState::RENDER)) 
    232                         ++ mStats.mNumStateChanges; 
    233          
    234                 mRenderQueue.Render(); 
    235                 mRenderQueue.Clear(); 
    236         } 
    237  
    238273        while (!mIQueue.empty()) 
    239274        { 
    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                } 
    245287 
    246288                mQueryQueue.push(query); 
Note: See TracChangeset for help on using the changeset viewer.