Ignore:
Timestamp:
05/02/06 10:26:43 (19 years ago)
Author:
mattausch
Message:

added pvs

Location:
GTP/trunk/Lib/Vis/OnlineCullingCHC/OGRE
Files:
2 added
3 edited

Legend:

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

    r868 r870  
    123123        /** Finds object corresponding to this bounding box in the scene. 
    124124        */ 
    125         MovableObject *FindCorrespondingObject(const AxisAlignedBox &box); 
     125        Entity *FindCorrespondingObject(const AxisAlignedBox &box); 
    126126 
    127127        /** Identifies objects in the scene and gives them unique ids that 
     
    129129        */ 
    130130        void IdentifyObjects(GtpVisibilityPreprocessor::ObjectContainer &objects); 
     131 
     132        /** Loads / unloads pvs of the view cell to set the visibility in the scene. 
     133        */ 
     134        void applyViewCellPvs(GtpVisibilityPreprocessor::ViewCell *vc, const bool load); 
     135 
     136        /** updates pvs in current frame. 
     137        */ 
     138        void updatePvs(Camera *cam); 
     139 
     140        /** Sets all objects invisible. 
     141        */ 
     142        void SetObjectsVisible(const bool visible); 
    131143 
    132144        /// the interface to the scene hierarchy. 
     
    183195        bool mViewCellsLoaded; 
    184196        GtpVisibilityPreprocessor::ViewCellsManager *mViewCellsManager; 
     197 
     198        /** Used to assign Ogre meshes to view cell entries. 
     199        */ 
     200        GtpVisibilityPreprocessor::ObjectContainer mObjects; 
     201 
     202        GtpVisibilityPreprocessor::ViewCell *mOldViewCell; 
     203        GtpVisibilityPreprocessor::ViewCell *mCurrentViewCell; 
     204 
     205        /** If view cells are used. 
     206        */ 
     207        bool mUseViewCells; 
    185208}; 
    186209 
  • GTP/trunk/Lib/Vis/OnlineCullingCHC/OGRE/src/OgreVisibilityOctreeSceneManager.cpp

    r868 r870  
    1515#include <OgreConfigFile.h> 
    1616#include "OgreTypeConverter.h" 
     17#include "OgreMeshInstance.h" 
     18#include "common.h" 
    1719 
    1820// normal terrain rendering 
     
    4244mExecuteVertexProgramForAllPasses(true), 
    4345mIsHierarchicalCulling(false), 
    44 mViewCellsLoaded(false) 
     46mViewCellsLoaded(false), 
     47mCurrentViewCell(NULL), 
     48mOldViewCell(NULL), 
     49mUseViewCells(false) 
    4550{ 
    4651        mHierarchyInterface = new OctreeHierarchyInterface(this, mDestRenderSystem); 
     
    8590{ 
    8691        OGRE_DELETE(mHierarchyInterface); 
     92        CLEAR_CONTAINER(mObjects); 
    8793} 
    8894//----------------------------------------------------------------------- 
     
    127133    } 
    128134        // add bounding boxes of rendered objects 
     135        if (0) 
    129136        for (BoxList::iterator it = mBoxes.begin(); it != mBoxes.end(); ++it) 
    130137{ 
     
    145152                        { 
    146153                                // render the leaf nodes 
    147                                 if (((*it)->numAttachedObjects() > 0) && ((*it)->numChildren() == 0) &&  
    148                                          (*it)->getAttachedObject(0)->getMovableType() == "Entity") 
     154                                if ((*it)->numAttachedObjects() &&  
     155                                        !(*it)->numChildren() &&  
     156                                        ((*it)->getAttachedObject(0)->getMovableType() == "Entity") && 
     157                                        (*it)->getAttachedObject(0)->isVisible()) 
    149158                                { 
    150159                                        getRenderQueue()->addRenderable((*it)); 
    151                                         std::stringstream d; 
    152                                         d << "here 223 " <<  (*it)->getAttachedObject(0)->getWorldBoundingBox(); 
    153                                         Ogre::LogManager::getSingleton().logMessage(d.str()); 
    154160                                } 
    155  
    156                                 // addbounding boxes instead of node itself 
    157                                 //(*it)->_addBoundingBoxToQueue(getRenderQueue()); 
    158161                        } 
    159162                        // add renderables itself 
     
    247250                return; 
    248251        } 
     252         
    249253 
    250254        //-- show visible scene nodes and octree bounding boxes from last frame 
     
    265269                        OctreeSceneManager::_findVisibleObjects(cam, onlyShadowCasters); 
    266270                } 
     271 
    267272                // only shadow casters will be rendered in shadow texture pass 
    268273                if (0) mHierarchyInterface->SetOnlyShadowCasters(onlyShadowCasters); 
     274 
     275 
     276                //-- apply view cell pvs 
     277                updatePvs(cam); 
    269278        } 
    270279         
     
    311320        else //-- the hierarchical culling algorithm 
    312321        {        
    313                 // this is also called in TerrainSceneManager: really 
    314                 // nexessary? 
     322                // this is also called in TerrainSceneManager: really necessary? 
    315323                //mDestRenderSystem -> setLightingEnabled(false); 
    316324 
     
    498506                if (!mViewCellsLoaded) 
    499507                { 
    500                         LoadViewCells(""); 
    501                         mViewCellsLoaded = true; 
    502                 } 
    503  
    504                 return true; 
    505         } 
    506  
     508                        LoadViewCells(static_cast<const char *>(val)); 
     509                        mViewCellsLoaded = true;         
     510                } 
     511 
     512                return true; 
     513        } 
     514        if (key == "UseViewCells") 
     515        {  
     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        } 
    507533        return VisibilityOptionsManager(mVisibilityManager, mHierarchyInterface). 
    508534                setOption(key, val) || OctreeSceneManager::setOption(key, val); 
     
    876902   } 
    877903} 
    878 //----------------------------------------------------------------------- 
    879 MovableObject *VisibilityOctreeSceneManager::FindCorrespondingObject(const AxisAlignedBox &box) 
     904 
     905inline static AxisAlignedBox EnlargeBox(const AxisAlignedBox &box) 
     906{ 
     907        const float eps = 1e-3f; 
     908        const Vector3 veps(eps, eps, eps); 
     909        Vector3 max = box.getMaximum(); 
     910        Vector3 min = box.getMinimum(); 
     911 
     912        return AxisAlignedBox(min - veps, max + veps); 
     913} 
     914//----------------------------------------------------------------------- 
     915Entity *VisibilityOctreeSceneManager::FindCorrespondingObject(const AxisAlignedBox &box) 
    880916{ 
    881917        list<SceneNode *> sceneNodeList; 
    882  
    883         findNodesIn(box, sceneNodeList, NULL); 
    884         std::stringstream d;  
    885         d << "\n*******************"; 
    886         Ogre::LogManager::getSingleton().logMessage(d.str()); 
     918        AxisAlignedBox mybox = EnlargeBox(box); 
     919        //AxisAlignedBox dummy(Vector3(-50000, -50000, -50000), Vector3(50000, 50000, 50000)); 
     920         
     921        // get intersecting scene nodes 
     922        findNodesIn(mybox, sceneNodeList, NULL); 
     923         
     924 
    887925        list<SceneNode *>::const_iterator sit, sit_end = sceneNodeList.end(); 
    888926 
    889         float overlap = GtpVisibilityPreprocessor::Limits::Small; 
    890  
    891          
    892         d << "here23 " << box; 
    893         Ogre::LogManager::getSingleton().logMessage(d.str()); 
    894  
    895         MovableObject *bestFittingObj = NULL; 
     927        float overlap = 0;//GtpVisibilityPreprocessor::Limits::Small; 
     928 
     929        Entity *bestFittingObj = NULL; 
    896930        float bestFit = overlap; 
    897931 
     
    908942        while (oit.hasMoreElements()) 
    909943                { 
    910                          MovableObject *mo = oit.getNext(); 
    911                          const AxisAlignedBox bbox = mo->getWorldBoundingBox(true); 
    912                          
    913                          overlap = RatioOfOverlap(OgreTypeConverter::ConvertFromOgre(box), 
    914                                                                           OgreTypeConverter::ConvertFromOgre(bbox)); 
     944                        MovableObject *mo = oit.getNext(); 
     945 
     946                        // we are only interested in scene entities 
     947                        if (mo->getMovableType() != "Entity") 
     948                        { 
     949                                continue; 
     950                        } 
     951                          
     952                        const AxisAlignedBox bbox = EnlargeBox(mo->getWorldBoundingBox()); 
     953                                         
     954 
     955                        // compute measure how much aabbs overlap 
     956                        overlap = RatioOfOverlap(OgreTypeConverter::ConvertFromOgre(mybox), 
     957                                                                         OgreTypeConverter::ConvertFromOgre(bbox)); 
     958         
    915959                         if (overlap > bestFit) 
    916960                         { 
    917961                                 bestFit = overlap; 
    918                                  bestFittingObj = mo; 
    919                                 d << "new bestfit " << bestFit << endl;Ogre::LogManager::getSingleton().logMessage(d.str()); 
    920                                  // perfect fit => object found 
     962                         
     963                                 bestFittingObj = static_cast<Entity *>(mo); 
     964 
     965                                 // perfect fit => object found, eraly exit 
    921966                                 if (overlap >= thresh) 
    922                                  { 
    923                                          std::stringstream d2;  
    924          
    925                         d2 << "!!best fit " << bestFittingObj->getWorldBoundingBox(true); 
    926         Ogre::LogManager::getSingleton().logMessage(d2.str()); 
    927                                         return bestFittingObj; 
    928                                         } 
     967                                         return bestFittingObj;                          
    929968                         } 
    930969                } 
    931970        } 
    932971 
    933         std::stringstream d2;  
    934         if (bestFittingObj) 
    935         { 
    936                 d2 << "best fit " << bestFittingObj->getWorldBoundingBox(true); 
    937         } 
    938         else 
    939         { 
    940                 d2 << "warning, no best fitting objects"; 
    941         } 
    942  
    943         Ogre::LogManager::getSingleton().logMessage(d2.str()); 
     972        if (0) 
     973        { 
     974                std::stringstream d;  
     975                if (bestFittingObj) 
     976                        d << "best fit: " << bestFit;      
     977                else 
     978                        d << "warning, objects do not fit\n" << box; 
     979         
     980                Ogre::LogManager::getSingleton().logMessage(d.str()); 
     981        } 
    944982 
    945983        return bestFittingObj; 
     
    948986void VisibilityOctreeSceneManager::LoadViewCells(string filename) 
    949987{ 
    950         GtpVisibilityPreprocessor::ObjectContainer objects; 
     988        // the objects are set to invisible a prioriy 
     989        SetObjectsVisible(false); 
     990 
    951991        // identify the corresponding Ogre meshes using the bounding boxes 
    952         IdentifyObjects(objects); 
     992        IdentifyObjects(mObjects); 
    953993 
    954994        // load the view cells assigning the found objects to the pvss 
    955         //mViewCellsManager->LoadViewCells(filename, &objects); 
     995        mViewCellsManager =  
     996                GtpVisibilityPreprocessor::ViewCellsManager::LoadViewCells(filename, &mObjects); 
     997 
     998        std::stringstream d; 
     999        d << "view cells loaded" << endl; 
     1000        Ogre::LogManager::getSingleton().logMessage(d.str()); 
    9561001} 
    9571002//----------------------------------------------------------------------- 
     
    9701015                  const GtpVisibilityPreprocessor::AxisAlignedBox3 box = (*iit).second; 
    9711016                  const AxisAlignedBox currentBox = OgreTypeConverter::ConvertToOgre(box); 
    972                    
    973                   MovableObject *mo = FindCorrespondingObject(currentBox); 
    974  
    975                   //objects.push_back(mi); 
    976         } 
    977 } 
    978  
     1017                  
     1018                  Entity *ent = FindCorrespondingObject(currentBox); 
     1019 
     1020                  // create new mesh instance 
     1021                  OgreMeshInstance *omi = new OgreMeshInstance(ent); 
     1022                  omi->SetId((*iit).first); 
     1023                  objects.push_back(omi); 
     1024        } 
     1025} 
    9791026//------------------------------------------------------------------------- 
    980 void VisibilityOctreeSceneManager::loadVisibilityConfig(const String& filename) 
    981 { 
    982         /// Set up the options 
     1027void VisibilityOctreeSceneManager::applyViewCellPvs(GtpVisibilityPreprocessor::ViewCell *vc,  
     1028                                                                                                        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; 
     1032 
     1033        GtpVisibilityPreprocessor::ObjectPvsMap::const_iterator oit, 
     1034                        oit_end = vc->GetPvs().mEntries.end(); 
     1035 
     1036        //-- PVS of view cell 
     1037        for (oit = vc->GetPvs().mEntries.begin(); oit != oit_end; ++ oit) 
     1038        { 
     1039                if (!(*oit).first) continue; 
     1040 
     1041                OgreMeshInstance *omi = dynamic_cast<OgreMeshInstance*>((*oit).first); 
     1042                omi->GetMesh()->setVisible(load); 
     1043                GtpVisibilityPreprocessor::Debug << "here45 " << omi->GetId() << endl; 
     1044        } 
     1045} 
     1046//------------------------------------------------------------------------- 
     1047void VisibilityOctreeSceneManager::SetObjectsVisible(const bool visible) 
     1048{ 
     1049        // for OGRE 1.2 
     1050#ifdef OGRE12 
     1051        MovableObjectIterator mit = getMovableObjectIterator("Entity"); 
     1052#else 
     1053        EntityIterator eit = getEntityIterator(); 
     1054 
     1055        // set all objects to invisible (initially); 
     1056        while (eit.hasMoreElements()) 
     1057        { 
     1058                Entity *ent = eit.getNext(); 
     1059                ent->setVisible(visible); 
     1060        } 
     1061 
     1062#endif 
     1063} 
     1064//------------------------------------------------------------------------- 
     1065void VisibilityOctreeSceneManager::loadVisibilityConfig(const String &filename) 
     1066{ 
     1067        // TODO matt 
     1068        // Set up the options 
    9831069        ConfigFile config; 
    9841070        String val; 
     
    10001086        } 
    10011087} 
     1088//------------------------------------------------------------------------- 
     1089void VisibilityOctreeSceneManager::updatePvs(Camera *cam) 
     1090{ 
     1091        Ogre::LogManager::getSingleton().logMessage("here196"); 
     1092        if (mViewCellsLoaded && mUseViewCells) 
     1093        { 
     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                } 
     1121        } 
     1122} 
     1123 
    10021124}  // namespace Ogre 
  • GTP/trunk/Lib/Vis/OnlineCullingCHC/OGRE/src/OgreVisibilitySceneManagerDll.cpp

    r657 r870  
    4949{ 
    5050        visEnv = new GtpVisibility::VisibilityEnvironment(); 
     51        visEnv->LoadEnvironment("vienna_simple.env"); 
    5152        visManager = new GtpVisibility::VisibilityManager(visEnv); 
    5253 
Note: See TracChangeset for help on using the changeset viewer.