Ignore:
Timestamp:
06/18/08 20:42:06 (16 years ago)
Author:
mattausch
Message:

implemented multiqueries, but still buggy version

File:
1 edited

Legend:

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

    r2772 r2773  
    1616{ 
    1717        // wait until result available 
    18         int visiblePixels = query->GetQueryResult(); 
    19  
    20         int visible = visiblePixels > mVisibilityThreshold; 
     18        const int visible = query->GetQueryResult() > mVisibilityThreshold; 
    2119 
    2220        BvhNode *node = query->GetFrontNode(); 
     
    2624                // node was previously invisible 
    2725                if (!node->IsVisible()) 
     26                { 
     27                        // reset flag 
     28                        node->SetTimesTestedInvisible(0); 
    2829                        node->SetAssumedVisibleFrameId(mFrameId + mAssumedVisibleFrames); 
     30                } 
    2931                else 
    3032                        // randomize first invokation 
     
    3638        else 
    3739        { 
     40                node->IncTimesTestedInvisible(); 
    3841                ++ mStats.mNumQueryCulledNodes; 
    3942        } 
     
    5861                                 
    5962                                OcclusionQuery *query = IssueOcclusionQuery(node, true); 
     63 
    6064                                mQueryQueue.push(query); 
    6165                                resultAvailable = mQueryQueue.front()->ResultAvailable(); 
     
    9498                                        // identify nodes that we cannot skip queries for 
    9599                                        const bool testFeasible = (!wasVisible || (node->IsVirtualLeaf() && (node->GetAssumedVisibleFrameId() <= mFrameId))); 
     100 
     101                                        // node was not recently tested => reset flag  
     102                                        if (node->GetLastVisitedFrame() != mFrameId - 1) 
     103                                                node->SetTimesTestedInvisible(0); 
    96104 
    97105                                        // update node's visited flag 
     
    176184 
    177185 
     186OcclusionQuery * CHCPlusPlusTraverser::GetNextMultiQuery(BvhNodeQueue &iqueue) 
     187{ 
     188        OcclusionQuery *query = mQueryHandler.RequestQuery(); 
     189 
     190        float pFail = 1.0f;  
     191        float maxBatchVal = 0.0f; 
     192        float newPBatch = 1.0f; 
     193        float newBatchVal; 
     194 
     195        // issue next query 
     196        while (!iqueue.empty()) 
     197        { 
     198                BvhNode *node = iqueue.front(); 
     199                newPBatch *= mVisibilityPredictor.GetProbability(node); 
     200 
     201                if (query->GetNodes().empty()) 
     202                        newBatchVal = 1.0f; 
     203                else 
     204                { 
     205                        int newSize = query->GetSize() + 1; 
     206                        newBatchVal = newSize / (1.0f + (1.0f - newPBatch) * newSize); 
     207                } 
     208 
     209                if (newBatchVal <= maxBatchVal) 
     210                        break; 
     211 
     212                iqueue.pop(); 
     213                query->AddNode(node); 
     214 
     215                maxBatchVal = newBatchVal; 
     216        } 
     217 
     218        IssueOcclusionQuery(*query, false); 
     219 
     220        return query; 
     221} 
     222 
     223 
    178224void CHCPlusPlusTraverser::IssueMultiQueries() 
    179225{ 
     
    191237                BvhNode *node = mIQueue.front(); 
    192238                mIQueue.pop(); 
    193  
    194                 OcclusionQuery *query = IssueOcclusionQuery(node, false); 
     239                OcclusionQuery *query = GetNextMultiQuery(mIQueue); 
     240                //OcclusionQuery *query = IssueOcclusionQuery(node); 
     241 
    195242                mQueryQueue.push(query); 
    196243        } 
Note: See TracChangeset for help on using the changeset viewer.