Changeset 2558


Ignore:
Timestamp:
10/22/07 18:19:15 (17 years ago)
Author:
mattausch
Message:
 
Location:
GTP/trunk/Lib/Vis/OnlineCullingCHC
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • GTP/trunk/Lib/Vis/OnlineCullingCHC/OGRE/include/OgrePlatformHierarchyInterface.h

    r2555 r2558  
    146146        virtual void TraverseNode2(GtpVisibility::HierarchyNode *node) {}; 
    147147         
     148        virtual GtpVisibility::OcclusionQuery *IssueMultiQuery( 
     149                                                                                        const GtpVisibility::HierarchyNodeContainer &nodes); 
     150 
    148151protected: 
    149152 
  • GTP/trunk/Lib/Vis/OnlineCullingCHC/OGRE/include/OgreVisibilityPredictor.h

    r2557 r2558  
    1515{ 
    1616public: 
    17      
     17 
     18        VisibilityPredictor(); 
     19 
    1820        void HandleProbablyVisibleObjects(GtpVisibilityPreprocessor::ViewCell *vc); 
    1921        void UpdateVisibility(GtpVisibilityPreprocessor::ViewCell *vc); 
    2022 
    21         VisibilityPredictor(); 
     23        void IssueMultiQuery(const vector<Entity *> &mEntities); 
     24 
    2225 
    2326protected: 
    2427 
    25         GtpVisibility::HierarchyNodeContainer mNodeBuffer; 
     28        GtpVisibility::HierarchyNodeContainer mEntityBuffer; 
    2629}; 
    2730 
  • GTP/trunk/Lib/Vis/OnlineCullingCHC/OGRE/src/OgrePlatformHierarchyInterface.cpp

    r2556 r2558  
    302302        return mTestGeometryBounds; 
    303303} 
     304//----------------------------------------------------------------------- 
     305GtpVisibility::OcclusionQuery *PlatformHierarchyInterface::IssueMultiQuery( 
     306                                                                                        const GtpVisibility::HierarchyNodeContainer &nodes) 
     307{ 
     308        // get next available test id 
     309        GtpVisibility::OcclusionQuery *query = GetNextOcclusionQuery(); 
     310 
     311        //-- the actual query test 
     312        query->BeginQuery();     
     313 
     314        GtpVisibility::HierarchyNodeContainer::const_iterator nit, nit_end = nodes.end(); 
     315 
     316        mIsBoundingBoxQuery = true; 
     317 
     318        for (nit = nodes.begin(); nit != nodes.end(); ++ nit) 
     319        { 
     320                // this information is used e.g., by the scene graph, because the bounding box 
     321                // must be treated differently to the scene geometry during rendering 
     322                RenderBoundingBox(GetBoundingBox(*nit)); 
     323        }        
     324         
     325        mIsBoundingBoxQuery = false; 
     326 
     327        query->EndQuery(); 
     328 
     329        return query; 
     330} 
    304331 
    305332} // namespace Ogre 
  • GTP/trunk/Lib/Vis/OnlineCullingCHC/OGRE/src/OgreVisibilityPredictor.cpp

    r2557 r2558  
    99namespace Ogre 
    1010{ 
     11        struct EntityQuery 
     12        { 
     13                GtpVisibility::OcclusionQuery *mQuery; 
     14                vector<Entity *> mEntities; 
     15        }; 
     16 
     17        typedef std::queue<EntityQuery> EntityQueryQueue; 
     18 
    1119        VisibilityPredictor::VisibilityPredictor() 
    1220        { 
     
    1523        void VisibilityPredictor::HandleProbablyVisibleObjects(GtpVisibilityPreprocessor::ViewCell *vc) 
    1624        { 
    17                 GtpVisibility::QueryQueue queryQueue; 
    18                 GtpVisibility::HierarchyNodeContainer invisibleNodes; 
     25                EntityQueryQueue queryQueue; 
     26                vector<Entity *> invisibleEntities; 
    1927 
    2028                // use multiqueries for the objects that are probably invisible 
     
    3745                        { 
    3846                                // collect entities for multiqueries 
    39                                 //invisibleNodes.push_back(node); 
     47                                invisibleEntities.push_back(*eit); 
    4048 
    41                                 if ((int)invisibleNodes.size() >= maxInvisibleNodesSize) 
     49                                if ((int)invisibleEntities.size() >= maxInvisibleNodesSize) 
    4250                                { 
    4351                                        // issue the batched queries 
    44                                         //IssueBatchedQuery(invisibleNodes); 
     52                                        IssueMultiQuery(invisibleEntities); 
     53                                        invisibleEntities.clear(); 
    4554                                } 
    4655                        } 
     
    5261 
    5362                        // fetch multiquery result 
    54                         queryQueue.front().second->GetQueryResult(visiblePixels, false); 
     63                        queryQueue.front().mQuery->GetQueryResult(visiblePixels, false); 
    5564 
    56                         // collect nodes assoziated with current multiquery 
    57                         GtpVisibility::HierarchyNode *node = queryQueue.front().first; 
     65                        size_t n = queryQueue.front().mEntities.size(); 
    5866 
    5967                        // tested visible 
    6068                        if (visiblePixels > 0) 
    6169                        { 
    62                                 // render nodes 
    63                                  
    64                                 // we have to store and test individual nodes later 
    65                                 mNodeBuffer.push_back(node); 
     70                                // render nodes assoziated with current multiquery 
     71                                for (size_t i = 0; i < n; ++ i) 
     72                                { 
     73                                        Entity *ent = queryQueue.front().mEntities[i]; 
     74                                        // render entity 
     75 
     76                                        // we have to store the entity and test it individually later 
     77                                        mEntityBuffer.push_back(ent); 
     78                                } 
    6679                        } 
    6780 
     
    7386        void VisibilityPredictor::UpdateVisibility(GtpVisibilityPreprocessor::ViewCell *vc) 
    7487        { 
    75                 GtpVisibility::HierarchyNodeContainer::const_iterator nit, nit_end = mNodeBuffer.end(); 
     88                GtpVisibility::HierarchyNodeContainer::const_iterator nit, nit_end = mEntityBuffer.end(); 
    7689 
    7790                // test individual nodes 
    78                 for (nit = mNodeBuffer.begin(); nit != nit_end; ++ nit) 
     91                for (nit = mEntityBuffer.begin(); nit != nit_end; ++ nit) 
    7992                { 
    8093 
     
    8295 
    8396                // fetch query results, update PVS of view cell 
    84                 for (nit = mNodeBuffer.begin(); nit != nit_end; ++ nit) 
     97                for (nit = mEntityBuffer.begin(); nit != nit_end; ++ nit) 
    8598                { 
    8699 
    87100                } 
    88101 
    89                 mNodeBuffer.clear(); 
     102                mEntityBuffer.clear(); 
     103        } 
     104 
     105         
     106        void VisibilityPredictor::IssueMultiQuery(const vector<Entity *> &mEntities) 
     107        { 
    90108        } 
    91109} 
  • GTP/trunk/Lib/Vis/OnlineCullingCHC/include/HierarchyInterface.h

    r2555 r2558  
    2121 
    2222typedef std::vector<HierarchyNode *> HierarchyNodeContainer; 
     23 
     24 
     25class MultiQuery 
     26{ 
     27        OcclusionQuery *mQuery; 
     28        HierarchyNodeContainer *mNodes; 
     29}; 
     30 
    2331 
    2432 
Note: See TracChangeset for help on using the changeset viewer.