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

added node traversal interface

Location:
trunk/VUT/GtpVisibility
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/VUT/GtpVisibility/include/CoherentHierarchicalCullingManager.h

    r147 r155  
    1515public: 
    1616        CoherentHierarchicalCullingManager(); 
     17        /** Constructor taking the assumed visibility into account, i.e., the estimation 
     18                for how many frames the current visibility is considered to be valid 
     19        */ 
     20        CoherentHierarchicalCullingManager(const unsigned int assumedVisibility); 
     21 
    1722        void RenderScene(); 
    18         /** Sets assumed visibility which is a an estimation for e  
    19                 how many frames the visibility is considered to be valied 
     23        /** Sets assumed visibility (i.e., an estimation for  
     24                how many frames the visibility is considered to be valid). 
    2025                @param assumedVisibility indicates for how many frames the  
    2126                same visibility is be assumed. 
     
    3237 
    3338        unsigned int mAssumedVisibility; 
     39         
     40        /** Skip query for this node. 
     41        */ 
     42        void SkipQuery(HierarchyNode *node); 
     43 
     44 
    3445        /** Threshold for rand function to return positive result with respect to 
    3546                mAssumedVisibility. 
  • trunk/VUT/GtpVisibility/include/HierarchyInterface.h

    r154 r155  
    44#include "DistanceQueue.h" 
    55#include "VisibilityMesh.h" 
     6#include <stack> 
    67 
    78namespace GtpVisibility { 
     
    1314typedef std::pair<HierarchyNode *, OcclusionQuery *> QueryPair; 
    1415typedef std::queue<QueryPair> QueryQueue; 
     16typedef std::stack<HierarchyNode *> TraversalStack; 
    1517 
    1618/**     Class which implements a hierarchy interface for a scene hierarchy. 
     
    2830        */ 
    2931    virtual bool IsLeaf(HierarchyNode *node) const = 0; 
    30         /** Traverses the given node.  
     32        /** Traverses and renders the given node.  
    3133                @param node the hierarchy node 
    3234        */ 
    33         virtual void TraverseNode(HierarchyNode *node) = 0; 
     35        virtual void TraverseAndRenderNode(HierarchyNode *node) = 0; 
    3436        /** Renders current hierarchy node. 
    3537                @param node current hierarchy node to be rendered 
     
    4951                @param root the hierarchy root 
    5052        */ 
    51         void SetSceneRoot(HierarchyNode *root); 
     53        void SetHierarchyRoot(HierarchyNode *root); 
    5254    /** Get the root of the scene hierarchy. 
    5355                @return the hierarchy root 
    5456        */ 
    55         HierarchyNode *GetSceneRoot() const; 
    56         /** Sets the scene root and initialises this scene traverser for a traversal. 
    57                 @param root current scene root 
    58                 @remark initialises some parameters, and also the statistics. 
    59         */ 
    60         void InitFrame(HierarchyNode *root); 
     57        HierarchyNode *GetHierarchyRoot() const; 
     58        /** Sets the scene root and initialises this hierarchy interface for a traversal. 
     59                @param frontToBack  
     60                        if traversal is initialised for front-to-back rendering or 
     61                        simple traversal of the nodes. 
     62                @remark also resets the statistics evaluated in the last traversal 
     63        */ 
     64        void InitTraversal(bool frontToBack = true); 
    6165        /** Returns current frame id. 
    6266                @returns frame id 
    6367        */ 
    6468        unsigned int GetFrameId() const; 
    65         /** Returns the current distance queue. 
    66                 @returns current distance queue 
     69        /** Returns a pointer to the distance queue. 
     70                @returns current distance queue. 
     71                @remark the distance queue stores hierarchy nodes in a front-to-back order 
    6772        */ 
    6873        DistanceQueue *GetQueue(); 
     
    112117        */ 
    113118        unsigned int GetNumRenderedNodes(); 
    114         /** Optimization when issuing occlusion test: test is done with actual geometry  
    115                 rather than the bounding box 
    116                 @param useOptimization if the optimization should be used 
    117         */ 
    118         void SetUseOptimization(bool useOptimization); 
     119                 
    119120        //bool mIsShadowPass; 
    120121 
     
    137138        virtual GtpVisibility::OcclusionQuery *IssueOcclusionQuery(GtpVisibility::Mesh *mesh) = 0; 
    138139 
    139         /** Returns geometry of hierarchy node.  
    140         */ 
    141         virtual void GetGeometry(GtpVisibility::HierarchyNode *node,     
     140        /** Returns the geometry of a given hierarchy node.  
     141                @param node the hierarchy node containing the geometry 
     142                @param geometryList geometry is returned in this list 
     143                @param includeChildren if the geometry of the children should be taken into account 
     144        */ 
     145        virtual void GetNodeGeometryList(GtpVisibility::HierarchyNode *node,     
    142146                                                         GeometryList *geometryList,  
    143147                                                         bool includeChildren) = 0; 
     
    154158        */ 
    155159        virtual int GetNodeId(HierarchyNode *node) = 0; 
     160 
     161        /** This is an optimization when issuing the occlusion test.  
     162                The test is done with actual geometry rather than the bounding  
     163                box of leave nodes previously marked as visible 
     164                @param testGeometry if this optimization should be used 
     165                @remark this option is only useful for the coherent hierarchical culling algorithm 
     166        */ 
     167        void TestGeometryForVisibleLeaves(bool testGeometry); 
     168 
     169        /**  
     170                Traverses hierarchy and returns next node. 
     171                @returns next node in hierarchy. 
     172        */ 
     173        virtual HierarchyNode *GetNextNode() = 0; 
     174 
    156175protected: 
    157          
    158         bool mUseOptimization; 
     176        /// chc optimization for testing geometry of leaves instead of bounding box 
     177        bool mTestGeometryForVisibleLeaves; 
     178 
    159179        unsigned int mFrameId; 
    160180 
    161181        int mCurrentTestIdx; 
    162182         
    163         //--- statistics 
     183        /// number of traversed nodes 
    164184        unsigned int mNumTraversedNodes; 
    165  
     185        /// the distance queue used for rendering of nodes in front to back order. 
    166186        DistanceQueue *mDistanceQueue; 
    167         HierarchyNode *mSceneRoot; 
    168         HierarchyNode *mPreviousNode; 
     187        /// internal structure for traversal 
     188        TraversalStack *mTraversalStack; 
     189 
     190        /// the root of the hierarchy 
     191        HierarchyNode *mHierarchyRoot; 
     192         
     193        // buffer for a node pointer 
     194        HierarchyNode *mSavedNode; 
    169195 
    170196        std::vector<HierarchyNode *> mRenderedNodes; 
    171197}; 
    172198} // namespace GtpVisibility 
     199 
    173200#endif // GtpVisisibilityHierarchyInterface_H 
  • trunk/VUT/GtpVisibility/include/VisibilityManager.h

    r146 r155  
    5252        void SetVisibilityCullingThreshold(unsigned int threshold); 
    5353 
    54         /** Determines if optimization for coherent hierarchical culling is used. 
    55         */ 
    56         void SetUseChcOptimization(bool useOptimization); 
    5754        /** Indicates for how long a frame is considered to be visible. 
    5855                @param assumedVisibility estimation for how long visibility is assumed to be valid. 
     56                @remark this option is only valid for the coherent hierarchical culling algorithm 
    5957        */ 
    60         void SetAssumedVisibility(unsigned int assumedVisibility); 
     58        void SetAssumedVisibilityForChc(unsigned int assumedVisibility); 
     59         
    6160        /** Sets pointer to a query manager.  
    6261        */ 
     
    7574 
    7675        unsigned int mVisibilityThreshold; 
    77         unsigned int mAssumedVisibility; 
     76        unsigned int mAssumedVisibilityForChc; 
    7877}; 
    7978} // namespace GtpVisibility 
  • 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.