Ignore:
Timestamp:
05/03/06 01:13:24 (19 years ago)
Author:
mattausch
Message:

added filter to online stuff (not fully working, too slow
)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • GTP/trunk/Lib/Vis/OnlineCullingCHC/OGRE/src/OgreVisibilityOctreeSceneManager.cpp

    r870 r880  
    4545mIsHierarchicalCulling(false), 
    4646mViewCellsLoaded(false), 
     47mUseViewCells(false), 
     48mUseVisibilityFilter(false), 
    4749mCurrentViewCell(NULL), 
    48 mOldViewCell(NULL), 
    49 mUseViewCells(false) 
     50mElementaryViewCell(NULL) 
    5051{ 
    5152        mHierarchyInterface = new OctreeHierarchyInterface(this, mDestRenderSystem); 
     
    9192        OGRE_DELETE(mHierarchyInterface); 
    9293        CLEAR_CONTAINER(mObjects); 
     94        OGRE_DELETE(mCurrentViewCell); 
    9395} 
    9496//----------------------------------------------------------------------- 
     
    514516        if (key == "UseViewCells") 
    515517        {  
    516                 if (mViewCellsLoaded) 
    517                 { 
    518                         mUseViewCells = *static_cast<const bool *>(val); 
    519                          
    520                         if (mUseViewCells) 
    521                         { 
    522                                 SetObjectsVisible(false); 
    523                                 mCurrentViewCell = mOldViewCell = NULL; 
    524                         } 
    525                         else 
    526                         { 
    527                                 SetObjectsVisible(true); 
    528                         } 
    529                 } 
    530  
    531                 return true; 
    532         } 
     518                mUseViewCells = *static_cast<const bool *>(val); 
     519 
     520                // reset view cell 
     521                OGRE_DELETE(mCurrentViewCell); 
     522                if (mUseViewCells) 
     523                        mCurrentViewCell =  mViewCellsManager->GenerateViewCell(); 
     524                mElementaryViewCell = NULL; 
     525                // if using view cells, all objects are set to false initially 
     526                SetObjectsVisible(!mUseViewCells); 
     527                 
     528                return true; 
     529        } 
     530        if (key == "UseVisibilityFilter") 
     531        { 
     532                mUseVisibilityFilter = *static_cast<const bool *>(val); 
     533                // set null =>recomputation of the pvs 
     534        mElementaryViewCell = NULL; 
     535                return true; 
     536        } 
     537 
    533538        return VisibilityOptionsManager(mVisibilityManager, mHierarchyInterface). 
    534539                setOption(key, val) || OctreeSceneManager::setOption(key, val); 
     
    864869                        // Also render any objects which have receive shadows disabled 
    865870                        OctreeSceneManager::renderObjects(pPriorityGrp->_getSolidPassesNoShadow(), true); 
    866                  
    867                         /*std::stringstream d;  
     871#if 0            
     872                        std::stringstream d;  
    868873                        d << " solid size: " << (int)pPriorityGrp->_getSolidPasses().size() 
    869874                                << " solid no shadow size: " << (int)pPriorityGrp->_getSolidPassesNoShadow().size() 
    870875                                << "difspec size: " << (int)pPriorityGrp->_getSolidPassesDiffuseSpecular().size() 
    871876                                << " decal size: " << (int)pPriorityGrp->_getSolidPassesDecal().size(); 
    872                         LogManager::getSingleton().logMessage(d.str());*/ 
     877                        LogManager::getSingleton().logMessage(d.str()); 
     878#endif 
    873879                } 
    874880        } 
     
    10271033void VisibilityOctreeSceneManager::applyViewCellPvs(GtpVisibilityPreprocessor::ViewCell *vc,  
    10281034                                                                                                        const bool load) 
    1029 {       GtpVisibilityPreprocessor::Debug << "here9 " << endl; 
    1030         // NOTE: should not happen, rather apply view cell representing unbounded space then 
    1031         if (!vc) return; 
     1035{       // NOTE: should not happen, rather apply view cell representing unbounded space then 
     1036        if (!vc)  
     1037        {        
     1038                // set everything visible for savety 
     1039                SetObjectsVisible(true); 
     1040 
     1041                return; 
     1042        } 
    10321043 
    10331044        GtpVisibilityPreprocessor::ObjectPvsMap::const_iterator oit, 
     
    10411052                OgreMeshInstance *omi = dynamic_cast<OgreMeshInstance*>((*oit).first); 
    10421053                omi->GetMesh()->setVisible(load); 
    1043                 GtpVisibilityPreprocessor::Debug << "here45 " << omi->GetId() << endl; 
     1054                //GtpVisibilityPreprocessor::Debug << "here45 " << omi->GetId() << endl; 
    10441055        } 
    10451056} 
     
    10481059{ 
    10491060        // for OGRE 1.2 
    1050 #ifdef OGRE12 
    1051         MovableObjectIterator mit = getMovableObjectIterator("Entity"); 
    1052 #else 
     1061//#ifdef OGRE12 
     1062        //MovableObjectIterator mit = getMovableObjectIterator("Entity"); 
     1063#if 0 
    10531064        EntityIterator eit = getEntityIterator(); 
    10541065 
     
    10601071        } 
    10611072 
     1073#else 
     1074        GtpVisibilityPreprocessor::ObjectContainer::iterator it, it_end = mObjects.end(); 
     1075 
     1076        for (it = mObjects.begin(); it != it_end; ++ it) 
     1077        { 
     1078                OgreMeshInstance *omi = static_cast<OgreMeshInstance *>(*it); 
     1079                Entity *ent = omi->GetMesh(); 
     1080                ent->setVisible(visible); 
     1081        } 
    10621082#endif 
    10631083} 
     
    10891109void VisibilityOctreeSceneManager::updatePvs(Camera *cam) 
    10901110{ 
    1091         Ogre::LogManager::getSingleton().logMessage("here196"); 
    10921111        if (mViewCellsLoaded && mUseViewCells) 
    10931112        { 
    1094                 GtpVisibilityPreprocessor::ViewCell *vc =  
    1095                         mViewCellsManager->GetViewCell(OgreTypeConverter::ConvertFromOgre(cam->getDerivedPosition())); 
    1096  
    1097                 std::stringstream d; d << "pos " << cam->getDerivedPosition() << "vc: " << vc; 
    1098                 Ogre::LogManager::getSingleton().logMessage(d.str()); 
    1099  
    1100                 // view cell changed => unload old objects and load new objects 
    1101                 if (vc != mCurrentViewCell) 
    1102                 { 
    1103                         //-- unload old pvs 
    1104                         if (mOldViewCell) 
    1105                         { 
    1106                                 const bool load = false; 
    1107  
    1108                                 applyViewCellPvs(mOldViewCell, load); 
    1109                                 Ogre::LogManager::getSingleton().logMessage("here16"); 
    1110                         } 
    1111  
    1112                         mOldViewCell = mCurrentViewCell; 
    1113  
    1114                         //-- load new pvs 
    1115                         mCurrentViewCell = vc; 
    1116                         const bool load = true; 
    1117  
    1118                         applyViewCellPvs(mCurrentViewCell, load); 
    1119                         Ogre::LogManager::getSingleton().logMessage("here106"); 
    1120                 } 
     1113                const GtpVisibilityPreprocessor::Vector3 viewPoint =  
     1114                        OgreTypeConverter::ConvertFromOgre(cam->getDerivedPosition()); 
     1115 
     1116                GtpVisibilityPreprocessor::ViewCell *newElementary =  
     1117                        mViewCellsManager->GetViewCell(viewPoint); 
     1118 
     1119                // elementary view cell did not change => apply same pvs 
     1120                if (mElementaryViewCell == newElementary) 
     1121                        return; 
     1122 
     1123                mElementaryViewCell = newElementary; 
     1124 
     1125                //-- unload old pvs 
     1126                applyViewCellPvs(mCurrentViewCell, false); 
     1127 
     1128 
     1129                //-- the new view cell 
     1130                 
     1131                GtpVisibilityPreprocessor::ViewCell *viewCell; 
     1132 
     1133                 
     1134                if (mUseVisibilityFilter) 
     1135                { 
     1136                        //-- compute new filtered cell 
     1137                        GtpVisibilityPreprocessor::PrVs prvs; 
     1138                        mViewCellsManager->GetPrVS(viewPoint, prvs); 
     1139                        viewCell = prvs.mViewCell; 
     1140                } 
     1141                else 
     1142                { 
     1143                        viewCell = newElementary; 
     1144                } 
     1145                         
     1146                //-- load new pvs 
     1147                applyViewCellPvs(viewCell, true); 
     1148 
     1149                // store pvs 
     1150                mCurrentViewCell->SetPvs(viewCell->GetPvs()); 
     1151 
     1152                // delete merge tree of filtered view cell 
     1153                if (mUseVisibilityFilter) 
     1154                        mViewCellsManager->DeleteLocalMergeTree(viewCell); 
    11211155        } 
    11221156} 
Note: See TracChangeset for help on using the changeset viewer.