Ignore:
Timestamp:
06/16/05 18:13:33 (19 years ago)
Author:
mattausch
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/VUT/Ogre/src/OgrePlatformQueryManager.cpp

    r134 r135  
    2525                            bool relativeVisibility) 
    2626{ 
    27         if (relativeVisibility) 
    28                 LogManager::getSingleton().logMessage("relative"); 
    29         else 
    30                 LogManager::getSingleton().logMessage("absolute"); 
    31  
    3227        // we need access to the scene manager and the rendersystem 
    3328        PlatformHierarchyInterface *pfHierarchyInterface =  
     
    3934        Camera *pCam = const_cast<Camera *>(&camera);  
    4035 
     36        bool overlayEnabled = mViewport->getOverlaysEnabled(); 
     37        mViewport->setOverlaysEnabled(false); 
    4138        pfHierarchyInterface->GetSceneManager()->_renderScene(pCam, mViewport, false); 
    4239 
     
    5350        GtpVisibility::GeometryList geometryList; 
    5451         
    55         GtpVisibility::HierarchyNodeList::const_iterator nodeIt, nodeIt_end = nodeList->end(); 
     52        GtpVisibility::HierarchyNodeList::iterator nodeIt, nodeIt_end = nodeList->end(); 
    5653        // geometry list has still do be built 
    5754        GtpVisibility::GeometryList::iterator geometryIt, geometryIt_end; 
    5855 
     56        // to obtain the correct number of projected pixels, depth write must be disabled 
     57 
     58        bool enableDepthWrite = false; 
     59        // this option must be provided by the scene manager 
     60        pfHierarchyInterface->GetSceneManager()->setOption("DepthWrite", &enableDepthWrite); 
     61 
     62        /* relative visiblity: 
     63                1) get visible pixels count of objects 
     64                2) clear frame buffer 
     65                3) get projected visible pixels count: 
     66                   test all objects again without depth write (set as option in scene manager) 
     67                4) calculate ratio between visible vs. projected pixels 
     68        */ 
    5969        // for relative visibility we need 2 rendering passes 
    6070        int n = relativeVisibility ? 2 : 1; 
     
    6373        { 
    6474                //-- queries for hierarchy nodes 
    65                 for (nodeIt = nodeList->begin(); nodeIt != nodeIt_end; ++nodeIt) 
     75                for (nodeIt = nodeList->begin(); nodeIt != nodeIt_end; ++nodeIt)                 
    6676                { 
    6777                        // TODO: DELETE QUERIES FROM PREVIOUS RENDER 
     
    6979                         
    7080                        // store geometry of the hierarchy node in a geometry list (only once!) 
    71                         if (i == n - 2) 
     81                        if (i == 0) 
    7282                        { 
    7383                                mHierarchyInterface->GetGeometry(*nodeIt, &geometryList, false); 
     
    8393                } 
    8494 
    85                 // --- relative visiblity 
    86                 /*  
    87                         1) get visible pixels count of objects 
    88                         2) clear frame buffer 
    89                         3) get projected visible pixels count: 
    90                            test all objects again without depth write (set as option in scene manager) 
    91                         4) calculate ratio between visible vs. projected pixels 
    92                 */ 
    93                 if (i == n - 2) // if relativeVisibility, between first and second loop 
    94                 { 
    95                         pfHierarchyInterface->GetRenderSystem()->clearFrameBuffer(FBT_COLOUR | FBT_DEPTH); 
    96                 } 
    97  
    98                 // to obtain the correct number of projected pixels, depth write must be disabled 
    99                 bool enableDepthWrite = (i != n - 2); 
    100  
    101                 // this option must be provided by the scene manager 
    102                 pfHierarchyInterface->GetSceneManager()->setOption("DepthWrite", &enableDepthWrite); 
     95         
     96                pfHierarchyInterface->GetRenderSystem()->clearFrameBuffer(FBT_DEPTH); 
    10397        } 
    10498 
     99        enableDepthWrite = true; 
     100        // this option must be provided by the scene manager 
     101        pfHierarchyInterface->GetSceneManager()->setOption("DepthWrite", &enableDepthWrite); 
     102         
     103        mViewport->setOverlaysEnabled(overlayEnabled); 
    105104 
    106105        //---- collect results 
    107         unsigned int visiblePixels; 
     106        unsigned int visiblePixels = 0; 
    108107 
    109108        GtpVisibility::QueryList::iterator visQueryIt, projQueryIt; 
     
    111110        visQueryIt = queryList[0].begin(); 
    112111        projQueryIt = queryList[1].begin(); 
     112 
    113113         
    114114        for (nodeIt = nodeList->begin(); nodeIt != nodeIt_end; ++nodeIt) 
    115115        { 
    116116                (*visQueryIt)->GetQueryResult(visiblePixels, true); 
    117  
     117         
     118                 
    118119                float vis = (float)visiblePixels; 
    119120 
     
    121122                { 
    122123                        (*projQueryIt)->GetQueryResult(visiblePixels, true); 
    123                         std::stringstream d; d << "relativ " << visiblePixels; 
    124                         LogManager::getSingleton().logMessage(d.str()); 
    125  
     124         
    126125                        if (visiblePixels > 0) 
    127126                        {                                
     
    132131 
    133132                ++visQueryIt; 
    134  
     133                 
    135134                // leave nodes with visibilty 0 in queue:  
    136135                // happens if node is intersected by near plane 
     
    141140        geometryIt_end = geometryList.end(); 
    142141         
    143         /*for (geometryIt = geometryList.begin(); geometryIt != geometryIt_end; ++geometryIt) 
     142        for (geometryIt = geometryList.begin(); geometryIt != geometryIt_end; ++geometryIt) 
    144143        { 
    145                 (*absQueryIt)->GetQueryResult(visiblePixels, true); 
     144                (*visQueryIt)->GetQueryResult(visiblePixels, true); 
     145                 
    146146 
    147147                float vis = (float)visiblePixels; 
     
    150150                if (relativeVisibility) 
    151151                { 
    152                         (*relQueryIt)->GetQueryResult(visiblePixels, true); 
     152                        (*projQueryIt)->GetQueryResult(visiblePixels, true); 
    153153 
    154154                        if (visiblePixels) 
     
    156156                                vis /= (float) visiblePixels; 
    157157                        } 
    158                         ++relQueryIt; 
     158                        ++projQueryIt; 
    159159                } 
    160160 
    161                 ++absQueryIt; 
     161                ++visQueryIt; 
    162162 
    163163                // approximate depth ordering during rendering =>  
     
    167167                        visibleGeometry->push_back(GtpVisibility::MeshInfo(*geometryIt, vis)); 
    168168                } 
    169         }*/ 
     169        } 
    170170 
    171171} 
     
    176176                               bool relativeVisibility) 
    177177{ 
    178          visibleNodes->push_back(GtpVisibility::NodeInfo(mHierarchyInterface->GetSceneRoot(), 1.0f)); 
     178         
    179179} 
    180180//----------------------------------------------------------------------- 
Note: See TracChangeset for help on using the changeset viewer.