Ignore:
Timestamp:
07/05/05 18:35:47 (19 years ago)
Author:
mattausch
Message:

added node traversal interface

Location:
trunk/VUT/GtpVisibility/src
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/VUT/GtpVisibility/src/CoherentHierarchicalCullingManager.cpp

    r148 r155  
    55 
    66//----------------------------------------------------------------------- 
    7 CoherentHierarchicalCullingManager:: CoherentHierarchicalCullingManager(): 
    8 mAssumedVisibility(0), mThreshold(0) 
     7CoherentHierarchicalCullingManager::CoherentHierarchicalCullingManager() 
    98{ 
    10         // initialise random generator because of assumed visibility 
     9        SetAssumedVisibility(0); 
     10        // initialise random generator in case we use assumed visibility 
     11        srand(time(NULL)); 
     12} 
     13//----------------------------------------------------------------------- 
     14CoherentHierarchicalCullingManager::CoherentHierarchicalCullingManager(const unsigned int  
     15                                                                                                                                                assumedVisibility) 
     16{ 
     17        SetAssumedVisibility(assumedVisibility); 
     18        // initialise random generator in case we use assumed visibility 
    1119        srand(time(NULL)); 
    1220} 
     
    3240                        { 
    3341                                mHierarchyInterface->PullUpVisibility(node); 
    34                                 mHierarchyInterface->TraverseNode(node); 
     42                                mHierarchyInterface->TraverseAndRenderNode(node); 
    3543                        } 
    3644                        else 
    3745                        {        
    38                                 mNumQueryCulledNodes ++; 
     46                                ++ mNumQueryCulledNodes; 
    3947                                 
    4048                                if(mVisualizeCulledNodes) 
     
    6270                                } 
    6371                        } 
     72                        // -- if node intersects near plane, skip query because wrong results possible 
     73                        else if (intersects) 
     74                        { 
     75                                SkipQuery(node); 
     76                        } 
    6477                        else 
    6578                        { 
     
    6780                                bool wasVisible = mHierarchyInterface->IsNodeVisible(node) &&  
    6881                                        (mHierarchyInterface->LastVisited(node) == mHierarchyInterface->GetFrameId() - 1); 
    69  
    70                                 // if node is assumed to be visible in this frame => skip query 
    71                                 // if intersects near plane => also skip query because wrong results possible 
    72                                 bool assumeVisible = intersects || 
    73                                         (wasVisible && (mAssumedVisibility > 0) &&  
    74                                          mHierarchyInterface->HasGeometry(node) && DecideVisible(node));         
    75  
    76                                 if (assumeVisible) 
     82                                         
     83                                // if we assume node to be visible in this frame => skip query  
     84                                if (wasVisible && (mAssumedVisibility > 0) &&  DecideVisible(node))// && mHierarchyInterface->HasGeometry(node)) 
    7785                                { 
    78                                         // update node's visited flag 
    79                                         mHierarchyInterface->SetLastVisited(node, mHierarchyInterface->GetFrameId()); 
    80  
    81                                         mHierarchyInterface->PullUpVisibility(node);                     
    82                                         mHierarchyInterface->TraverseNode(node); 
     86                                        SkipQuery(node); 
    8387 
    8488                                        continue; 
     
    107111                                if (wasVisible) 
    108112                                { 
    109                                         mHierarchyInterface->TraverseNode(node); 
     113                                        mHierarchyInterface->TraverseAndRenderNode(node); 
    110114                                } 
    111115                        } 
     
    129133bool CoherentHierarchicalCullingManager::DecideVisible(HierarchyNode *node) const 
    130134{ 
    131         /*bool result = rand() < mThreshold; 
    132         std::stringstream d; d << "Assumed vis: " << mAssumedVisibility << ", result: " << result; 
     135        /*bool result = rand() < mThreshold; std::stringstream d; d << "Assumed vis: " << mAssumedVisibility << ", result: " << result; 
    133136        Ogre::LogManager::getSingleton().logMessage(d.str()); return result;*/ 
    134137         
    135138        return rand() < mThreshold; 
    136139} 
     140//----------------------------------------------------------------------- 
     141void CoherentHierarchicalCullingManager::SkipQuery(HierarchyNode *node) 
     142{ 
     143        // -- set node to be visible in this frame, then traverse it 
     144        mHierarchyInterface->SetLastVisited(node, mHierarchyInterface->GetFrameId()); 
     145 
     146        mHierarchyInterface->PullUpVisibility(node);                     
     147        mHierarchyInterface->TraverseAndRenderNode(node); 
     148} 
     149 
    137150} // namespace GtpVisibility 
  • trunk/VUT/GtpVisibility/src/DummyQueryManager.cpp

    r144 r155  
    1313                                             bool relativeVisibility) 
    1414  { 
    15           visibleNodes->push_back(NodeInfo(mHierarchyInterface->GetSceneRoot(), 0, 0)); 
     15          visibleNodes->push_back(NodeInfo(mHierarchyInterface->GetHierarchyRoot(), 0, 0)); 
    1616     
    1717//      HierarchyInterface::MeshIterator *mi = 
     
    3131                                                bool relativeVisibility) 
    3232  { 
    33           visibleNodes->push_back(NodeInfo(mHierarchyInterface->GetSceneRoot(), 0, 0)); 
     33          visibleNodes->push_back(NodeInfo(mHierarchyInterface->GetHierarchyRoot(), 0, 0)); 
    3434     
    3535//      HierarchyInterface::MeshIterator *mi = 
  • trunk/VUT/GtpVisibility/src/FrustumCullingManager.cpp

    r147 r155  
    2828                {                
    2929                        mHierarchyInterface->SetNodeVisible(node, true); 
    30                         mHierarchyInterface->TraverseNode(node); 
     30                        mHierarchyInterface->TraverseAndRenderNode(node); 
    3131                } 
    3232        } 
  • trunk/VUT/GtpVisibility/src/HierarchyInterface.cpp

    r130 r155  
    77//----------------------------------------------------------------------- 
    88HierarchyInterface::HierarchyInterface():  
    9 mFrameId(0), mNumTraversedNodes(0), mSceneRoot(0),  
    10 mPreviousNode(0), mCurrentTestIdx(0), mUseOptimization(false) 
    11 //, mIsShadowPass(false) 
     9mFrameId(0), mNumTraversedNodes(0), mHierarchyRoot(NULL),  
     10mSavedNode(NULL), mCurrentTestIdx(0), mTestGeometryForVisibleLeaves(false) 
    1211{        
    1312        mDistanceQueue = new DistanceQueue(GreaterDistance<HierarchyNode *>(this)); 
     13        mTraversalStack = new std::stack<HierarchyNode *>; 
    1414} 
    1515//----------------------------------------------------------------------- 
     
    1717{                
    1818        delete mDistanceQueue; 
     19        delete mTraversalStack; 
    1920} 
    2021//----------------------------------------------------------------------- 
    21 void HierarchyInterface::SetSceneRoot(HierarchyNode *root) 
     22void HierarchyInterface::SetHierarchyRoot(HierarchyNode *root) 
    2223{ 
    23         mSceneRoot = root; 
     24        mHierarchyRoot = root; 
    2425} 
    2526//----------------------------------------------------------------------- 
    26 void HierarchyInterface::InitFrame(HierarchyNode *root) 
     27void HierarchyInterface::InitTraversal(bool frontToBack) 
    2728{ 
    28         ++ mFrameId; 
    29         mCurrentTestIdx = 0; 
    30         mNumTraversedNodes = 0; 
    31         mRenderedNodes.clear(); 
     29        // initialise for front-to-back rendering 
     30        if (frontToBack) 
     31        { 
     32                ++ mFrameId; 
     33                mCurrentTestIdx = 0; 
     34                mNumTraversedNodes = 0; 
     35                mRenderedNodes.clear(); 
    3236 
    33         SetSceneRoot(root); 
    34         mDistanceQueue->push(mSceneRoot); 
     37                mDistanceQueue->push(mHierarchyRoot); 
     38        } 
     39        else 
     40        {       // initialise for simple node traversal 
     41                mTraversalStack->push(mHierarchyRoot); 
     42        } 
    3543} 
    3644//----------------------------------------------------------------------- 
     
    5159} 
    5260//----------------------------------------------------------------------- 
    53 HierarchyNode *HierarchyInterface::GetSceneRoot() const  
     61HierarchyNode *HierarchyInterface::GetHierarchyRoot() const 
    5462{ 
    55         return mSceneRoot; 
     63        return mHierarchyRoot; 
    5664} 
    5765//----------------------------------------------------------------------- 
     
    6674} 
    6775//----------------------------------------------------------------------- 
    68 void HierarchyInterface::SetUseOptimization(bool useOptimization) 
     76void HierarchyInterface::TestGeometryForVisibleLeaves(bool testGeometry) 
    6977{ 
    70         mUseOptimization = useOptimization; 
     78        mTestGeometryForVisibleLeaves = testGeometry; 
    7179} 
    7280//----------------------------------------------------------------------- 
     
    7583        return &mRenderedNodes; 
    7684} 
    77  
    7885} // namespace GtpVisibility 
  • trunk/VUT/GtpVisibility/src/StopAndWaitCullingManager.cpp

    r139 r155  
    2727                        } 
    2828                } 
     29                // if intersects near plane => skip occlusion query because wrong results possible 
     30                else if (intersects) 
     31                { 
     32                        mHierarchyInterface->SetNodeVisible(node, true); 
     33                        mHierarchyInterface->TraverseAndRenderNode(node); 
     34                } 
    2935                else 
    3036                { 
    31                         // if intersects near plane => skip occlusion query because wrong results possible 
    32                         if (intersects) 
    33                         { 
    34                     mHierarchyInterface->SetNodeVisible(node, true); 
    35                                 mHierarchyInterface->TraverseNode(node); 
    36                                 continue; 
    37                         } 
    3837 
    3938                        ++ mNumQueriesIssued; 
     
    4645                        if (visiblePixels > mVisibilityThreshold) 
    4746                        { 
    48                                 mHierarchyInterface->TraverseNode(node); 
     47                                mHierarchyInterface->TraverseAndRenderNode(node); 
    4948                        } 
    5049                        else 
  • trunk/VUT/GtpVisibility/src/VisibilityManager.cpp

    r153 r155  
    1414mPreprocessingManager(new DummyPreprocessingManager(NULL)), 
    1515mVisibilityEnvironment(visEnvironment), 
    16 mAssumedVisibility(0) 
     16mAssumedVisibilityForChc(0) 
    1717{ 
    1818        SetCullingManager(VisibilityEnvironment::COHERENT_HIERARCHICAL_CULLING); 
     
    2727} 
    2828//----------------------------------------------------------------------- 
    29 void VisibilityManager::SetCullingManager( 
    30         VisibilityEnvironment::CullingManagerType ocmType) 
     29void VisibilityManager::SetCullingManager(VisibilityEnvironment:: 
     30                                                                                  CullingManagerType ocmType) 
    3131{ 
    3232        // change only if necessary 
     
    3838                        delete mCullingManager; 
    3939                } 
     40 
    4041                mCullingManagerType = ocmType; 
    4142                 
     
    4748 
    4849                case VisibilityEnvironment::COHERENT_HIERARCHICAL_CULLING: 
    49                         mCullingManager = new CoherentHierarchicalCullingManager(); 
    50                         dynamic_cast<CoherentHierarchicalCullingManager *>(mCullingManager)-> 
    51                                 SetAssumedVisibility(mAssumedVisibility); 
     50                        mCullingManager = new CoherentHierarchicalCullingManager(mAssumedVisibilityForChc); 
    5251                        break; 
    5352 
     
    9897} 
    9998//----------------------------------------------------------------------- 
    100 void VisibilityManager::SetAssumedVisibility(unsigned int assumedVisibility) 
     99void VisibilityManager::SetAssumedVisibilityForChc(unsigned int assumedVisibility)  
     100                                                                          
    101101{ 
    102         mAssumedVisibility = assumedVisibility; 
     102        mAssumedVisibilityForChc = assumedVisibility; 
    103103 
     104        // in case we currently use chc 
    104105        if (VisibilityManager::GetCullingManagerType() ==  
    105106                VisibilityEnvironment::COHERENT_HIERARCHICAL_CULLING) 
    106107        { 
    107108                dynamic_cast<CoherentHierarchicalCullingManager *>(mCullingManager)-> 
    108                                 SetAssumedVisibility(mAssumedVisibility); 
     109                                SetAssumedVisibility(assumedVisibility); 
    109110        } 
    110111} 
     112 
     113 
    111114} // namespace GtpVisibility 
Note: See TracChangeset for help on using the changeset viewer.