Changeset 143


Ignore:
Timestamp:
06/21/05 18:14:30 (20 years ago)
Author:
mattausch
Message:

updated visibility queries

Location:
trunk/VUT
Files:
8 edited

Legend:

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

    r65 r143  
    2525                            InfoContainer<NodeInfo> *visibleNodes, 
    2626                            InfoContainer<MeshInfo> *visibleGeometry, 
    27                             bool relativeVisibility = false 
     27                            bool projectedPixels = false 
    2828                            ); 
    2929     
     
    3535                               InfoContainer<NodeInfo> *visibleNodes, 
    3636                               InfoContainer<MeshInfo> *visibleGeometry, 
    37                                bool relativeVisibility = false 
     37                               bool projectedPixels = false 
    3838                               ); 
    3939     
  • trunk/VUT/GtpVisibility/include/QueryManager.h

    r130 r143  
    4141        If NULL no visible meshes are not evaluated. 
    4242 
    43         @param relativeVisibility If true the visibility member for 
     43        @param projectedPixels If true the visibility member for 
    4444        NodeInfo and MeshInfo represent relative visibility; i.e. the number of visible 
    4545        pixels divided by the the number of projected pixels. 
     
    5151                            InfoContainer<NodeInfo> *visibleNodes, 
    5252                            InfoContainer<MeshInfo> *visibleGeometry, 
    53                             bool relativeVisibility = false 
     53                            bool projectedPixels = false 
    5454                            ) = 0; 
    5555     
     
    6262                               InfoContainer<NodeInfo> *visibleNodes, 
    6363                               InfoContainer<MeshInfo> *visibleGeometry, 
    64                                bool relativeVisibility = false 
     64                               bool projectedPixels = false 
    6565                               ) = 0; 
    6666     
  • trunk/VUT/GtpVisibility/include/VisibilityInfo.h

    r141 r143  
    1414{ 
    1515public: 
    16     NodeInfo(HierarchyNode *node,const float v): mNode(node), mVisibility(v) {} 
     16    NodeInfo(HierarchyNode *node, const int projectedPixels, const int visiblePixels):  
     17        mNode(node)//, mProjectedPixels(projectedPixels), mVisiblePixels(visiblePixels)  
     18        {} 
    1719 
    18         float GetVisibility() const {return mVisibility;} 
    19         void SetVisibility(float vis) { mVisibility = vis;} 
    20         bool operator<(const NodeInfo& rhs) const {return mNode < rhs.mNode;} 
    21         //bool operator>(const NodeInfo& rhs) const {return mNode > rhs.mNode;} 
    22         //bool operator==(const NodeInfo& rhs) const {return mNode == rhs.mNode;} 
     20        int GetVisiblePixels() const {return mVisiblePixels;} 
     21        int GetProjectedPixels() const {return mProjectedPixels;} 
     22 
     23        void SetVisiblePixels(int vis) {mVisiblePixels = vis;} 
     24        void SetProjectedPixels(int vis) {mProjectedPixels = vis;} 
     25 
     26        void SetNode(HierarchyNode *node) {mNode = node;} 
     27        HierarchyNode *GetNode() const {return mNode;} 
     28 
     29        //bool operator<(const NodeInfo& rhs) const {return mNode < rhs.mNode;} 
    2330 
    2431protected: 
     
    2633    /** pointer to the scene node */ 
    2734    HierarchyNode *mNode; 
    28     /** node visibility can either be a number of visible pixels or relative 
    29         number of visible pixels (if the hardware queries will provide the 
    30         total number of ratsterized pixels */ 
    31     float mVisibility; 
     35     
     36    int mVisiblePixels; 
     37        int mProjectedPixels; 
    3238}; 
    3339   
     
    3743{ 
    3844public: 
    39         MeshInfo(Mesh *mesh, const float v): mMesh(mesh), mVisibility(v) {} 
     45        MeshInfo(Mesh *mesh,  const int projectedPixels, const int visiblePixels):  
     46        mMesh(mesh), mProjectedPixels(projectedPixels), mVisiblePixels(visiblePixels)  
     47        {} 
    4048 
    41         float GetVisibility() const {return mVisibility;} 
    42         void SetVisibility(float vis) { mVisibility = vis;} 
     49        int GetVisiblePixels() const {return mVisiblePixels;} 
     50        int GetProjectedPixels() const {return mProjectedPixels;} 
     51 
     52        void SetVisiblePixels(float vis) { mVisiblePixels = vis;} 
     53        void SetProjectedPixels(float vis) { mProjectedPixels = vis;} 
     54 
     55        Mesh *GetMesh() const {return mMesh;} 
     56        void SetMesh(Mesh *mesh) {mMesh = mesh;} 
    4357 
    4458        bool operator<(const MeshInfo& rhs) const {return mMesh < rhs.mMesh;} 
     
    5165        */ 
    5266    Mesh *mMesh; 
    53     /** Node visibility can either be a number of visible pixels or relative 
    54         number of visible pixels (if the hardware queries will provide the 
    55         total number of ratsterized pixels. 
    56         */ 
    57     float mVisibility; 
     67   
     68    int mVisiblePixels; 
     69        int mProjectedPixels; 
    5870}; 
    5971   
    6072//TODO: this define shall be replaced by template typedef 
    61 //#define InfoContainer std::vector 
    62 #define InfoContainer std::set 
     73#define InfoContainer std::vector 
     74//#define InfoContainer std::set 
    6375}; 
    6476 
  • trunk/VUT/GtpVisibility/src/DummyQueryManager.cpp

    r141 r143  
    1111                                             InfoContainer<NodeInfo> *visibleNodes, 
    1212                                             InfoContainer<MeshInfo> *visibleGeometry, 
    13                                              bool relativeVisibility 
     13                                             bool projectedPixels 
    1414                                             ) 
    1515  { 
    16           visibleNodes->insert(NodeInfo(mHierarchyInterface->GetSceneRoot(), 1.0f)); 
     16          visibleNodes->push_back(NodeInfo(mHierarchyInterface->GetSceneRoot(), 0, 0)); 
    1717     
    1818//      HierarchyInterface::MeshIterator *mi = 
     
    3030                                                InfoContainer<NodeInfo> *visibleNodes, 
    3131                                                InfoContainer<MeshInfo> *visibleGeometry, 
    32                                                 bool relativeVisibility 
     32                                                bool projectedPixels 
    3333                                                ) 
    3434  { 
    35           visibleNodes->insert(NodeInfo(mHierarchyInterface->GetSceneRoot(), 1.0f)); 
     35          visibleNodes->push_back(NodeInfo(mHierarchyInterface->GetSceneRoot(), 0, 0)); 
    3636     
    3737//      HierarchyInterface::MeshIterator *mi = 
  • trunk/VUT/Ogre/include/OgrePlatformQueryManager.h

    r140 r143  
    3131        If NULL no visible meshes are not evaluated. 
    3232 
    33         @param relativeVisibility If true the visibility member for 
     33        @param projectedPixels If true the visibility member for 
    3434        NodeInfo and MeshInfo represent relative visibility; i.e. the number of visible 
    3535        pixels divided by the the number of projected pixels. 
     
    4141                            InfoContainer<GtpVisibility::NodeInfo> *visibleNodes, 
    4242                            InfoContainer<GtpVisibility::MeshInfo> *visibleGeometry, 
    43                             bool relativeVisibility = false 
     43                            bool projectedPixels = false 
    4444                            ); 
    4545     
     
    5252                               InfoContainer<GtpVisibility::NodeInfo> *visibleNodes, 
    5353                               InfoContainer<GtpVisibility::MeshInfo> *visibleGeometry, 
    54                                bool relativeVisibility = false 
     54                               bool projectedPixels = false 
    5555                               ); 
    5656     
  • trunk/VUT/Ogre/src/OgrePlatformQueryManager.cpp

    r141 r143  
    2323                            InfoContainer<GtpVisibility::NodeInfo> *visibleNodes, 
    2424                            InfoContainer<GtpVisibility::MeshInfo> *visibleGeometry, 
    25                             bool relativeVisibility) 
     25                            bool projectedPixels) 
    2626{ 
    2727        // we need access to the scene manager and the rendersystem 
     
    6868        */ 
    6969        // for relative visibility we need 2 rendering passes 
    70         int n = relativeVisibility ? 2 : 1; 
     70        int n = projectedPixels ? 2 : 1; 
    7171         
    7272        for (int i=0; i<n; ++i) 
     
    118118                (*visQueryIt)->GetQueryResult(visiblePixels, true); 
    119119         
    120                 float vis = (float)visiblePixels; 
    121                 bool isVisible = visiblePixels > 0; 
    122  
    123                 if (relativeVisibility) 
     120                int visiblePixels = visiblePixels; 
     121                int projectedPixels = 0; 
     122 
     123                if (projectedPixels) 
    124124                { 
    125125                        (*projQueryIt)->GetQueryResult(visiblePixels, true); 
    126126         
    127                         if (visiblePixels > 0) 
    128                         {                                
    129                                 vis /= (float) visiblePixels; 
    130                         } 
     127                        mProjectedPixels = visiblePixels; 
     128                 
    131129                        ++projQueryIt; 
    132130                } 
     
    136134                // nodes with visibilty 0 in queue:  
    137135                // happens if node is intersected by near plane 
    138                 if (isVisible) 
    139                 { 
    140                         insertNode = visibleNodes->insert(GtpVisibility::NodeInfo(*nodeIt, vis)); 
    141  
    142                         if (!insertNode.second) // element already in list 
    143                         { 
    144                                 //LogManager::getSingleton().logMessage("element already in list"); 
    145                 (*insertNode.first).SetVisibility((*insertNode.first).GetVisibility() + vis); 
    146  
    147                                 if (relativeVisibility) // relative visibility between zero and one 
    148                                 { 
    149                                         (*insertNode.first).SetVisibility((*insertNode.first).GetVisibility() * 0.5); 
    150                                 } 
    151                         } 
     136                if (visiblePixels > 0) 
     137                { 
     138                        visibleNodes->push_back(GtpVisibility::NodeInfo(*nodeIt, visiblePixels, projectedPixels)); 
    152139                } 
    153140        } 
     
    160147                (*visQueryIt)->GetQueryResult(visiblePixels, true); 
    161148                 
    162  
    163                 float vis = (float)visiblePixels; 
    164                 bool isVisible = visiblePixels > 0; 
    165                  
    166                 if (relativeVisibility) 
     149                int visiblePixels = visiblePixels; 
     150                int projectedPixels = 0; 
     151 
     152                if (projectedPixels) 
    167153                { 
    168154                        (*projQueryIt)->GetQueryResult(visiblePixels, true); 
    169155 
    170                         if (visiblePixels) 
    171                         { 
    172                                 vis /= (float) visiblePixels; 
    173                         } 
     156                        mProjectedPixels = visiblePixels; 
     157 
    174158                        ++projQueryIt; 
    175159                } 
     
    181165                if (isVisible) 
    182166                {                         
    183                         insertGeom = visibleGeometry->insert(GtpVisibility::MeshInfo(*geometryIt, vis)); 
    184                         if (!insertGeom.second) // element already in list 
    185                         { 
    186                                 //LogManager::getSingleton().logMessage("element already in list"); 
    187                 (*insertGeom.first).SetVisibility((*insertGeom.first).GetVisibility() + vis); 
    188  
    189                                 if (relativeVisibility) // relative visibility between zero and one 
    190                                 { 
    191                                         (*insertGeom.first).SetVisibility((*insertGeom.first).GetVisibility() * 0.5); 
    192                                 } 
    193                         } 
    194                 } 
    195         } 
    196  
     167                        visibleGeometry->push_back(GtpVisibility::MeshInfo(*geometryIt,visiblePixels, projectedPixels)); 
     168                } 
     169        } 
     170 
     171} 
     172//----------------------------------------------------------------------- 
     173inline bool nodeinfo_eq(const GtpVisibility::NodeInfo &info1, const GtpVisibility::NodeInfo &info2)  
     174{  
     175        return info1.GetNode() == info2.GetNode();  
     176} 
     177//----------------------------------------------------------------------- 
     178inline bool meshinfo_eq(const GtpVisibility::MeshInfo &info1, const GtpVisibility::MeshInfo &info2)  
     179{  
     180        return info1.GetMesh() == info2.GetMesh();  
    197181} 
    198182//----------------------------------------------------------------------- 
     
    200184                               InfoContainer<GtpVisibility::NodeInfo> *visibleNodes, 
    201185                               InfoContainer<GtpVisibility::MeshInfo> *visibleGeometry, 
    202                                bool relativeVisibility) 
     186                               bool projectedPixels) 
    203187{ 
    204188        SceneManager *sm = dynamic_cast<PlatformHierarchyInterface *>(mHierarchyInterface)->GetSceneManager(); 
     
    237221                LogManager::getSingleton().logMessage(d.str()); 
    238222 
    239                 ComputeCameraVisibility(*cam, visibleNodes, visibleGeometry, relativeVisibility); 
    240                             
     223                ComputeCameraVisibility(*cam, visibleNodes, visibleGeometry, projectedPixels); 
     224                 
    241225                //mViewport->getTarget()->update(); for(int j=0; j<10000000; j++)       printf("HAAHHAHAHAHAH"); 
    242226 
     
    248232        } 
    249233         
    250  
    251234        // reset camera 
    252235        mViewport->setCamera(savedCam); 
     236 
     237        // --- single out duplicates 
     238 
     239        // before duplicates can be deleted we have to add up visibility 
     240 
     241        // --- visible nodes 
     242        sort(visibleNodes->begin(), visibleNodes->end()); 
     243        InfoContainer<GtpVisibility::NodeInfo>::iterator visibleNodesIt, 
     244                visibleNodesIt_end = visibleNodes->end(); 
     245         
     246        GtpVisibility::NodeInfo *nodeInfo = NULL; 
     247 
     248        for (visibleNodesIt = visibleNodes->begin(); visibleNodesIt != visibleNodesIt_end;  
     249                ++visibleNodesIt); 
     250        { 
     251                if (!nodeInfo || (nodeInfo->GetNode() != (*visibleNodesIt).GetNode())) 
     252                { 
     253                        nodeInfo = &(*visibleNodesIt); 
     254                } 
     255                else 
     256                { 
     257                        // add visibility 
     258                        nodeInfo->SetVisibility(nodeInfo->GetVisiblePixels() +  
     259                                (*visibleNodesIt).GetVisiblePixels()); 
     260                } 
     261 
     262        } 
     263         
     264        // now delete duplicates 
     265        visibleNodes->erase( std::unique(visibleNodes->begin(),  
     266                visibleNodes->end(), nodeinfo_eq), visibleNodes->end()); 
     267 
     268        // --- visible geometry 
     269        sort(visibleGeometry->begin(), visibleGeometry->end()); 
     270        InfoContainer<GtpVisibility::MeshInfo>::iterator visibleGeomIt, 
     271                visibleGeomIt_end = visibleGeometry->end(); 
     272 
     273        GtpVisibility::MeshInfo *geomInfo = NULL; 
     274 
     275        for (visibleGeomIt = visibleGeometry->begin(); visibleGeomIt != visibleGeomIt_end;  
     276                ++visibleGeomIt); 
     277        { 
     278                if (!geomInfo || (geomInfo->GetMesh() != (*visibleGeomIt).GetMesh())) 
     279                { 
     280                        geomInfo = &(*visibleGeomIt); 
     281                } 
     282                else // info points to equal mesh 
     283                { 
     284                        // add visibility 
     285                        geomInfo->SetVisibility(geomInfo->GetVisiblePixels() +  
     286                                (*visibleGeomIt).GetVisiblePixels()); 
     287                } 
     288        } 
     289 
     290        // now delete duplicates 
     291        visibleGeometry->erase(std::unique(visibleGeometry->begin(),  
     292                visibleGeometry->end(), meshinfo_eq), visibleGeometry->end()); 
     293         
    253294} 
    254295//----------------------------------------------------------------------- 
  • trunk/VUT/work/TestCullingTerrain/TerrainFrameListener.cpp

    r141 r143  
    353353} 
    354354//----------------------------------------------------------------------- 
    355 void TerrainFrameListener::ApplyVisibilityQuery(bool fromPoint, bool relativeVisibility) 
     355void TerrainFrameListener::ApplyVisibilityQuery(bool fromPoint, bool projectedPixels) 
    356356{ 
    357357        InfoContainer<GtpVisibility::NodeInfo> visibleNodes; 
     
    362362                mVisibilityManager->GetQueryManager()-> 
    363363                        ComputeFromPointVisibility(mCamNode->getPosition(), &visibleNodes,  
    364                                                                            &visibleGeometry, relativeVisibility); 
     364                                                                           &visibleGeometry, projectedPixels); 
    365365        } 
    366366        else 
    367367        { 
    368368                mVisibilityManager->GetQueryManager()->ComputeCameraVisibility(*mCamera, 
    369                             &visibleNodes, &visibleGeometry, relativeVisibility); 
     369                            &visibleNodes, &visibleGeometry, projectedPixels); 
    370370        } 
    371371 
     
    377377        for (geomIt = visibleGeometry.begin(); geomIt != geomIt_end; ++geomIt) 
    378378        { 
    379                 averageGeometryVis += (*geomIt).GetVisibility(); 
    380  
    381                 std::stringstream d; d << "Geometry visibility: " << (*geomIt).GetVisibility(); 
     379                averageGeometryVis += (*geomIt).GetVisiblePixels(); 
     380 
     381                std::stringstream d; d << "Geometry visibility: " << (*geomIt).GetVisiblePixels(); 
    382382                LogManager::getSingleton().logMessage(d.str()); 
    383383        } 
     
    387387        for (nodesIt = visibleNodes.begin(); nodesIt != nodesIt_end; ++nodesIt) 
    388388        { 
    389                 averageNodeVis += (*nodesIt).GetVisibility(); 
    390  
    391                 std::stringstream d; d << "Node visibility: " << (*nodesIt).GetVisibility(); 
     389                averageNodeVis += (*nodesIt).GetVisiblePixels(); 
     390 
     391                std::stringstream d; d << "Node visibility: " << (*nodesIt).GetVisiblePixels(); 
    392392                LogManager::getSingleton().logMessage(d.str()); 
    393393        } 
     
    405405                //-- visibility queries stats 
    406406                int idx = fromPoint ?  1 : 0; 
    407                 idx += relativeVisibility ? 2 : 0; 
     407                idx += projectedPixels ? 2 : 0; 
    408408 
    409409                sprintf(str, ": %s", queryTypeCaptions[idx].c_str());  
  • trunk/VUT/work/TestCullingTerrain/TerrainFrameListener.h

    r139 r143  
    117117                and their visibility information. 
    118118                @param fromnPoint if query should be from point or from camera 
    119                 @param relativeVisibility if query should return number of visible pixels or the ratio 
     119                @param projectedPixels if query should return number of visible pixels or the ratio 
    120120                visible pixels / projected pixels. 
    121121        */ 
    122         void ApplyVisibilityQuery(bool fromPoint, bool relativeVisibility); 
     122        void ApplyVisibilityQuery(bool fromPoint, bool projectedPixels); 
    123123 
    124124        void toggleShowQueryStats(); 
Note: See TracChangeset for help on using the changeset viewer.