Ignore:
Timestamp:
04/23/07 16:19:30 (18 years ago)
Author:
mattausch
Message:

implemented part of rendering estimation of wimmer et al. for view space / object space subdivision.
warning: not working with undersampling estimation + local visibility based subdivision.

Location:
GTP/trunk/Lib/Vis/OnlineCullingCHC/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • GTP/trunk/Lib/Vis/OnlineCullingCHC/src/CoherentHierarchicalCullingManager.cpp

    r2306 r2332  
    3333        while (!mHierarchyInterface->GetQueue()->empty() || !queryQueue.empty()) 
    3434        { 
    35                 bool resultAvailable = false; 
    36  
     35                ////////// 
    3736                //-- only wait for result if there are no nodes to process 
    3837                while (!queryQueue.empty() &&  
    39                                 queryQueue.front().second->GetQueryResult(visiblePixels,  
    40                                 mHierarchyInterface->GetQueue()->empty())) 
     38                           (NodeInvalid(queryQueue.front().first) || 
     39                            queryQueue.front().second->GetQueryResult( 
     40                                             visiblePixels, mHierarchyInterface->GetQueue()->empty()))) 
    4141                { 
    4242                        HierarchyNode *node = queryQueue.front().first; 
    43                          
    4443                        queryQueue.pop(); 
    45                          
     44 
     45                        // parent was tested invisible => remove children from queue 
     46                        if (NodeInvalid(node)) 
     47                        { 
     48                                //CullingLogManager::GetSingleton()->LogMessage("skipping this node"); 
     49                                continue; 
     50                        } 
     51                        // tested visible 
    4652                        if (visiblePixels > mVisibilityThreshold) 
    4753                        { 
    48                                 // in case geometry is in omterior node: ensure that we only traverse once 
     54                                // in case geometry is in interior node: ensure that we only traverse once 
    4955                                if (!mHierarchyInterface->IsNodeVisible(node)) 
    5056                                { 
     
    5864                                mHierarchyInterface->SetNodeVisible(node, false); 
    5965 
    60                                 ++ mNumQueryCulledNodes; 
     66                ++ mNumQueryCulledNodes; 
    6167                                 
    6268                                if (mVisualizeCulledNodes) 
     
    6571                                } 
    6672                        } 
     73                         
     74                        // update node's visited flag 
     75                        mHierarchyInterface->SetLastVisited(node, mHierarchyInterface->GetFrameId());    
    6776                } 
    6877                 
     
    7382                        mHierarchyInterface->GetQueue()->pop(); 
    7483                                 
     84                        // parent was tested invisible => remove children from queue 
     85                        if (NodeInvalid(node)) 
     86                        { 
     87                                //CullingLogManager::GetSingleton()->LogMessage("skipping this node"); 
     88                                continue; 
     89                        } 
     90 
    7591                        bool intersects = false; 
    7692 
     
    96112                                 
    97113                                // if we assume node to be visible in this frame => skip query  
    98                                 bool skipQuery = wasVisible && (mAssumedVisibility > 0) &&  
    99                                         DecideVisible(node) && mHierarchyInterface->HasGeometry(node); 
     114                                const bool skipQuery = wasVisible &&  
     115                                                           (mAssumedVisibility > 0) &&  
     116                                                                           DecideVisible(node) &&  
     117                                                                           mHierarchyInterface->HasGeometry(node); 
    100118 
    101119                                if (skipQuery) 
     
    113131                                mHierarchyInterface->SetNodeVisible(node, wasVisible && issueQuery); 
    114132 
    115                                 // update node's visited flag 
    116                                 mHierarchyInterface->SetLastVisited(node, mHierarchyInterface->GetFrameId()); 
    117                                  
    118133                                // skip testing previously visible nodes without geometry 
    119134                                if (issueQuery) 
     
    124139                                                IssueNodeOcclusionQuery(node, wasVisible))); 
    125140                                } 
    126                                  
     141                                else 
     142                                { 
     143                                        // update node's visited flag 
     144                                        mHierarchyInterface->SetLastVisited(node, mHierarchyInterface->GetFrameId()); 
     145                                } 
     146 
    127147                                // always traverse a node if it was visible 
    128148                                if (wasVisible) 
     
    164184        mHierarchyInterface->TraverseNode(node); 
    165185} 
    166  
     186//----------------------------------------------------------------------- 
     187bool CoherentHierarchicalCullingManager::NodeInvalid(HierarchyNode *node) const 
     188{ 
     189        // parent was tested invisible in this frame 
     190        HierarchyNode *parent = mHierarchyInterface->GetParent(node); 
     191    return  
     192                parent &&  
     193                (mHierarchyInterface->LastVisited(node) == mHierarchyInterface->GetFrameId()) &&  
     194                !mHierarchyInterface->IsNodeVisible(parent); 
     195} 
    167196} // namespace GtpVisibility 
  • GTP/trunk/Lib/Vis/OnlineCullingCHC/src/RandomUpdateCullingManager.cpp

    r2306 r2332  
    105105                        else 
    106106                        { 
    107                                 // identify previously visible nodes 
    108                                 const bool wasVisible = mHierarchyInterface->IsNodeVisible(node) &&  
    109                                         (mHierarchyInterface->LastVisited(node) == mHierarchyInterface->GetFrameId() - 1); 
    110                                  
    111                                 // if we assume node to be visible in this frame => skip query  
    112                                 const bool skipQuery = wasVisible && (mAssumedVisibility > 0) &&  
    113                                         DecideVisible(node) && mHierarchyInterface->HasGeometry(node); 
    114  
    115                                 if (skipQuery) 
    116                                 { 
    117                                         SkipQuery(node); 
    118                                         continue; 
    119                                 } 
    120                                                                  
     107                                 
    121108                                if (mHierarchyInterface->IsNodeFullyVisible(node)) 
    122109                                { 
     
    162149                                } 
    163150 
     151                                // identify previously visible nodes 
     152                                const bool wasVisible = mHierarchyInterface->IsNodeVisible(node) &&  
     153                                        (mHierarchyInterface->LastVisited(node) == mHierarchyInterface->GetFrameId() - 1); 
     154                                         
     155 
     156                                // if we assume node to be visible in this frame => skip query  
     157                                const bool skipQuery = wasVisible && (mAssumedVisibility > 0) &&  
     158                                        DecideVisible(node) && mHierarchyInterface->HasGeometry(node); 
     159 
     160                                if (skipQuery) 
     161                                { 
     162                                        SkipQuery(node); 
     163                                        continue; 
     164                                } 
     165                                                         
    164166                // identify nodes that we cannot skip queries for 
    165167                                // geometry not only in leaves => test for renderable geometry 
Note: See TracChangeset for help on using the changeset viewer.