Ignore:
Timestamp:
06/18/08 14:38:45 (16 years ago)
Author:
mattausch
Message:

chc++ still problems

File:
1 edited

Legend:

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

    r2767 r2770  
    11#include "CHCPlusPlusTraverser.h" 
     2#include "RenderState.h" 
     3 
    24 
    35namespace CHCDemo 
     
    1719                           (mQueryQueue.front()->ResultAvailable() || mDistanceQueue.empty())) 
    1820                { 
    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(); 
    2425 
    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()) 
    2643                        { 
    27                                 BvhNode *node = query->GetFrontNode(); 
     44                                BvhNode *node = mVQueue.front(); 
     45                                mVQueue.pop(); 
    2846 
    29                                 mBvh->MakeParentsVisible(node); 
    30                                 TraverseNode(node); 
    31                         } 
    32                         else 
    33                         { 
    34                                 ++ mStats.mNumQueryCulledNodes; 
     47                                OcclusionQuery *query = IssueOcclusionQuery(node, true); 
     48                                mQueryQueue.push(query); 
    3549                        } 
    3650                }        
     
    6175                                         
    6276                                        // 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                                                  
    6879 
    6980                                        // update node's visited flag 
     
    7182                                         
    7283                                        // skip testing previously visible interior nodes 
    73                                         if (leafOrWasInvisible) 
     84                                        if (testFeasible) 
    7485                                        { 
    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                                                } 
    7797                                        } 
    7898                                         
    79                                         // always traverse a node if it was visible 
     99                                        // always traverse a node if it was previously visible 
    80100                                        if (wasVisible) 
    81101                                                TraverseNode(node); 
     
    88108                        } 
    89109                } 
     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                } 
    90149        } 
    91150} 
    92151 
     152 
     153 
     154void CHCPlusPlusTraverser::QueryPreviouslyInvisibleNodes(BvhNode *node) 
     155{ 
     156        mIQueue.push(node); 
     157 
     158        if (mIQueue.size() > 50) 
     159        { 
     160                IssueMultiQueries(); 
     161        } 
    93162} 
     163 
     164 
     165void 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.