Ignore:
Timestamp:
04/19/05 09:12:55 (20 years ago)
Author:
mattausch
Message:
 
Location:
trunk/VUT/OcclusionCullingSceneManager
Files:
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/VUT/OcclusionCullingSceneManager/TestCulling/TestCullingApplication.cpp

    r44 r51  
    2020#include "windows.h" 
    2121 
    22 //RaySceneQuery* mRaySceneQuery = 0; 
    2322 
    2423/***********************************************/ 
    2524/* TestCullingApplication implementation       */ 
    2625/***********************************************/ 
    27 /*TestCullingApplication::~TestCullingApplication() 
    28 { 
    29         delete mRaySceneQuery; 
    30 }*/ 
    31 //----------------------------------------------------------------------- 
    32 void TestCullingApplication::createCamera( void ) 
     26TestCullingApplication::~TestCullingApplication() 
     27{ 
     28} 
     29//----------------------------------------------------------------------- 
     30/*void TestCullingApplication::createCamera( void ) 
    3331{ 
    3432        // Create the camera 
     
    4240    mCamera->setNearClipDistance( 1 ); 
    4341    mCamera->setFarClipDistance( 1000 ); 
    44 } 
     42}*/ 
    4543//----------------------------------------------------------------------- 
    4644void TestCullingApplication::createScene(void) 
    4745{ 
    48         Plane waterPlane; 
    4946        // Set ambient light 
    5047        mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5)); 
     
    5249        // Create a light 
    5350        Light* l = mSceneMgr->createLight("MainLight"); 
    54         // Accept default settings: point light, white diffuse, just set position 
    55         // NB I could attach the light to a SceneNode if I wanted it to move automatically with 
    56         //  other objects, but I don't 
    57         l->setPosition(20,80,50); 
    58  
    59         // --Fog 
    60         // NB it's VERY important to set this before calling setWorldGeometry  
    61         // because the vertex program picked will be different 
    62         ColourValue fadeColour(0.93, 0.86, 0.76); 
    63         //mSceneMgr->setFog( FOG_LINEAR, fadeColour, .001, 500, 1000); 
    64     //mSceneMgr->setFog( FOG_EXP, fadeColour, 0.005 ); 
    65  
     51        //l->setPosition(20,80,50); 
     52 
     53        mMinTranslation = Vector3(-70.0f, -70.0f, 0.0f); 
     54        mMaxTranslation = Vector3(70.0f, 70.0f, 600.0f); 
     55 
     56        mMinAngle = Vector3(0, 0, 0); 
     57        mMaxAngle = Vector3(360, 360, 360); 
     58 
     59        /* 
    6660        mWindow->getViewport(0)->setBackgroundColour(fadeColour); 
    6761 
     62        Entity *ogreHeadEnt = mSceneMgr->createEntity("head", "ogrehead.mesh"); 
     63        mOgreHead = mSceneMgr->getRootSceneNode()->createChildSceneNode( "OgreHeadNode" ); 
     64        mOgreHead->attachObject(ogreHeadEnt); 
     65        */ 
     66        generateScene(4); 
    6867        // Create a skybox 
    69     //mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox", 500, false); 
    70         //mSceneMgr->setSkyDome( true, "Examples/CloudySky", 5, 8, 500, false ); 
    71  
    72         std::string terrain_cfg("terrain.cfg"); 
    73 #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE 
    74         terrain_cfg = mResourcePath + terrain_cfg; 
    75 #endif 
    76         mSceneMgr -> setWorldGeometry( terrain_cfg ); 
    77         // Infinite far plane? 
    78         if (mRoot->getRenderSystem()->getCapabilities()->hasCapability(RSC_INFINITE_FAR_PLANE)) 
    79         { 
    80                 mCamera->setFarClipDistance(0); 
    81         } 
    82  
    83 /*      // Define the required skyplane 
    84         Plane plane; 
    85         // 5000 world units from the camera 
    86         plane.d = 5000; 
    87         // Above the camera, facing down 
    88         plane.normal = -Vector3::UNIT_Y; 
    89         // Create the plane 10000 units wide, tile the texture 3 times 
    90     mSceneMgr->setSkyPlane(true, plane, "Examples/SpaceSkyPlane",10000,3);*/ 
    91  
    92         // Set a nice viewpoint 
    93         mCamera->setPosition(707,2500,528); 
    94         mCamera->setOrientation(Quaternion(-0.3486, 0.0122, 0.9365, 0.0329)); 
    95  
    96         //mRaySceneQuery = mSceneMgr->createRayQuery( 
    97         //      Ray(mCamera->getPosition(), Vector3::NEGATIVE_UNIT_Y)); 
    98  
    99         /*Entity *robotEnt = mSceneMgr->createEntity( "Robot", "robot.mesh" ); 
    100         SceneNode *robotNode = mSceneMgr->getRootSceneNode()->createChildSceneNode( "RobotNode", Vector3( 750, 25, 600 )); 
    101         robotNode->attachObject( robotEnt ); 
    102         robotNode->scale( .3, .3, .3 ); 
    103         robotNode->yaw( Degree( 160 ) ); 
    104  
    105         Entity *ogreEnt = mSceneMgr->createEntity( "Ogre", "ogrehead.mesh" ); 
    106     SceneNode *ogreNode = mSceneMgr->getRootSceneNode()->createChildSceneNode( "Ogre", Vector3( 800, 50, 830 ) ); 
    107     ogreNode->attachObject( ogreEnt ); 
    108         ogreNode->scale(.2,.2,.2); 
    109         ogreNode->yaw( Degree( 20 ) ); 
    110  
    111         Entity *ogreEnt2 = mSceneMgr->createEntity( "Ogre2", "ogrehead.mesh" ); 
    112     SceneNode *ogreNode2 = mSceneMgr->getRootSceneNode()->createChildSceneNode( "Ogre2", Vector3( 700, 50, 730 ) ); 
    113     ogreNode2->attachObject( ogreEnt2 ); 
    114         ogreNode2->scale(.05,.05,.05); 
    115         ogreNode->yaw( Degree( 40 ) );*/ 
     68    //mSceneMgr->setSkyBox(true, "Examples/CloudyNoonSkyBox", 1000, false); 
     69    ColourValue fadeColour(0.3, 0.9, 0.5); 
     70        mWindow->getViewport(0)->setBackgroundColour(fadeColour); 
    11671 
    11772        // CEGUI setup 
     
    14297void TestCullingApplication::chooseSceneManager(void) 
    14398{ 
    144     //mSceneMgr = mRoot->getSceneManager(ST_GENERIC); 
    145         mSceneMgr = mRoot->getSceneManager(ST_EXTERIOR_CLOSE); 
    146 } 
    147  
     99    mSceneMgr = mRoot->getSceneManager(ST_GENERIC); 
     100} 
     101//----------------------------------------------------------------------- 
     102void TestCullingApplication::generateSceneObject(const Vector3 &translationRatio,  
     103                                                                                                 const Vector3 &rotationRatio, const int idx, const String& entName) 
     104{ 
     105        Vector3 rotation = mMinAngle + rotationRatio * (mMaxAngle - mMinAngle); 
     106        Vector3 translation = mMinTranslation + translationRatio * (mMaxTranslation - mMinTranslation); 
     107 
     108        char name[16]; 
     109    sprintf( name, "object%d", idx ); 
     110 
     111    Entity *ent = mSceneMgr->createEntity( name, entName ); 
     112        SceneNode *node = mSceneMgr->getRootSceneNode()->createChildSceneNode( String(name) + "Node", translation); 
     113        node->attachObject(ent); 
     114        node->scale(0.1,0.1,0.1); 
     115 
     116        node->yaw(Degree(rotation.x)); 
     117    node->pitch(Degree(rotation.y)); 
     118        node->roll(Degree(rotation.z)); 
     119} 
     120//----------------------------------------------------------------------- 
     121void TestCullingApplication::generateScene( int numObjects ) 
     122{ 
     123        srand (time (0)); 
     124         
     125        Vector3 rotationRatio; 
     126        Vector3 translationRatio; 
     127 
     128        for(int i=0; i < numObjects; i++) 
     129        { 
     130                rotationRatio.x = rand() / (float) RAND_MAX; 
     131                rotationRatio.y = rand() / (float) RAND_MAX; 
     132                rotationRatio.z = rand() / (float) RAND_MAX; 
     133 
     134                translationRatio.x = rand() / (float) RAND_MAX; 
     135                translationRatio.y = rand() / (float) RAND_MAX; 
     136                translationRatio.z = rand() / (float) RAND_MAX; 
     137 
     138                generateSceneObject(translationRatio, rotationRatio, i, "sphere.mesh"); 
     139        } 
     140} 
    148141/***********************************************/ 
    149142/* MouseQueryListener implementation           */ 
     
    156149 
    157150        // Setup default variables 
    158         mCurrentObject = NULL; 
     151        //mOgreHead = NULL; 
    159152        mLMouseDown = false; 
    160153        mRMouseDown = false; 
     
    173166        mEventProcessor->addKeyListener(this); 
    174167 
    175         mRaySceneQuery = mSceneMgr->createRayQuery( Ray() ); 
    176  
    177168        // show overlay 
    178169        Overlay* pOver = OverlayManager::getSingleton().getByName("Example/OcclusionCullingDemoOverlay");  
     
    199190MouseQueryListener::~MouseQueryListener( ) 
    200191{ 
    201         delete mRaySceneQuery; 
    202192} 
    203193//----------------------------------------------------------------------- 
     
    213203     if (e->getButtonID() & InputEvent::BUTTON0_MASK) 
    214204     { 
    215                  CEGUI::MouseCursor::getSingleton().hide( ); 
    216  
    217                  // Setup the ray scene query 
    218          Ray mouseRay = mCamera->getCameraToViewportRay( e->getX(), e->getY() ); 
    219          mRaySceneQuery->setRay( mouseRay ); 
    220  
    221          // Execute query 
    222          RaySceneQueryResult &result = mRaySceneQuery->execute(); 
    223          RaySceneQueryResult::iterator itr = result.begin( ); 
    224  
    225          // Get results, create a node/entity on the position 
    226          if ( itr != result.end() && itr->worldFragment ) 
    227          { 
    228                          char name[16]; 
    229              sprintf( name, "Robot%d", mCount++ ); 
    230  
    231              Entity *ent = mSceneMgr->createEntity( name, "robot.mesh" ); 
    232              mCurrentObject = mSceneMgr->getRootSceneNode( )->createChildSceneNode( String(name) + "Node", itr->worldFragment->singleIntersection ); 
    233              mCurrentObject->attachObject( ent ); 
    234              mCurrentObject->setScale( 0.1f, 0.1f, 0.1f ); 
    235          } 
    236  
    237          mLMouseDown = true;  
     205                mLMouseDown = true;  
    238206     } 
    239207     // Right mouse button down 
     
    267235         if ( mLMouseDown ) 
    268236     { 
    269                  Ray mouseRay = mCamera->getCameraToViewportRay( e->getX(), e->getY() ); 
    270                  mRaySceneQuery->setRay( mouseRay ); 
    271  
    272                  RaySceneQueryResult &result = mRaySceneQuery->execute(); 
    273                  RaySceneQueryResult::iterator itr = result.begin( ); 
    274  
    275                  if ( itr != result.end() && itr->worldFragment ) 
    276                  { 
    277                          mCurrentObject->setPosition( itr->worldFragment->singleIntersection ); 
    278                  }  
     237                 
    279238     } 
    280239         // If we are dragging the right mouse button. 
     
    287246//----------------------------------------------------------------------- 
    288247bool MouseQueryListener::frameStarted(const FrameEvent &evt) 
    289 { 
    290         // clamp to terrain 
    291         Vector3 camPos = mCamera->getPosition( ); 
    292     Ray cameraRay( Vector3(camPos.x, 5000.0f, camPos.z), Vector3::NEGATIVE_UNIT_Y ); 
    293     mRaySceneQuery->setRay( cameraRay ); 
    294  
    295     // Perform the scene query 
    296     RaySceneQueryResult &queryResult = mRaySceneQuery->execute(); 
    297     RaySceneQueryResult::iterator it = queryResult.begin( ); 
    298  
    299         if (it != queryResult.end() && it->worldFragment) 
    300         { 
    301                 SceneQuery::WorldFragment* wf = it->worldFragment; 
    302  
    303                 mCamera->setPosition(mCamera->getPosition().x, wf->singleIntersection.y + 10,  
    304                         mCamera->getPosition().z); 
    305         } 
    306           
     248{         
    307249        return ExampleFrameListener::frameStarted(evt); 
    308250} 
  • trunk/VUT/OcclusionCullingSceneManager/TestCulling/TestCullingApplication.h

    r44 r51  
    7979        OverlayElement *mHierarchyNodesInfo; 
    8080        OverlayElement *mSceneNodesInfo; 
    81  
    82         SceneNode *mCurrentObject;         // The newly created object 
    83         int mCount;                        // The number of robots on the screen 
    84         RaySceneQuery *mRaySceneQuery;     // The ray scene query pointer 
    8581}; 
    8682 
     
    9591        void createFrameListener(void); 
    9692        void setupGui(void); 
    97         virtual void createCamera(void); 
     93        /** generates a the scene hierarchy with random values  
     94        @param number of objects to generate 
     95        */ 
     96        void generateScene(int numObjects); 
     97 
     98        /** generates a new scene object  
     99        @param tranlationRatio ratio between minimal and maximal possible translation 
     100        @param rotationRatio ratio between minimal and maximal possible rotation 
     101        @idx the index of the new object 
     102        @entName the name of the object entity 
     103        */ 
     104        void generateSceneObject(const Vector3 &translationRatio, const Vector3 &rotationRatio,  
     105                                                         const int idx, const String &entName); 
     106 
     107        //virtual void createCamera(void); 
    98108 
    99109        CEGUI::OgreCEGUIRenderer *mGUIRenderer; 
    100110        CEGUI::System *mGUISystem; 
     111 
     112        Vector3 mMinTranslation; 
     113        Vector3 mMaxTranslation; 
     114 
     115        Vector3 mMinAngle; 
     116        Vector3 mMaxAngle; 
    101117 
    102118private: 
  • trunk/VUT/OcclusionCullingSceneManager/TestCullingTerrain/TestCullingTerrainApplication.cpp

    r48 r51  
    4646void TestCullingTerrainApplication::createScene(void) 
    4747{ 
    48         Plane waterPlane; 
    4948        // Set ambient light 
    5049        mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5)); 
     
    6160        // because the vertex program picked will be different 
    6261        ColourValue fadeColour(0.93, 0.86, 0.76); 
     62        mWindow->getViewport(0)->setBackgroundColour(fadeColour); 
    6363        //mSceneMgr->setFog( FOG_LINEAR, fadeColour, .001, 500, 1000); 
    6464    //mSceneMgr->setFog( FOG_EXP, fadeColour, 0.005 ); 
    6565 
    66         mWindow->getViewport(0)->setBackgroundColour(fadeColour); 
     66         
    6767 
    6868        // Create a skybox 
    6969    //mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox", 500, false); 
    7070        //mSceneMgr->setSkyDome( true, "Examples/CloudySky", 5, 8, 500, false ); 
     71 
     72        /*      // Define the required skyplane 
     73        Plane plane; 
     74        // 5000 world units from the camera 
     75        plane.d = 5000; 
     76        // Above the camera, facing down 
     77        plane.normal = -Vector3::UNIT_Y; 
     78        // Create the plane 10000 units wide, tile the texture 3 times 
     79    mSceneMgr->setSkyPlane(true, plane, "Examples/SpaceSkyPlane",10000,3);*/ 
    7180 
    7281        std::string terrain_cfg("terrain.cfg"); 
     
    8190        } 
    8291 
    83 /*      // Define the required skyplane 
    84         Plane plane; 
    85         // 5000 world units from the camera 
    86         plane.d = 5000; 
    87         // Above the camera, facing down 
    88         plane.normal = -Vector3::UNIT_Y; 
    89         // Create the plane 10000 units wide, tile the texture 3 times 
    90     mSceneMgr->setSkyPlane(true, plane, "Examples/SpaceSkyPlane",10000,3);*/ 
    91  
    9292        // Set a nice viewpoint 
    9393        mCamera->setPosition(707,2500,528); 
    9494        mCamera->setOrientation(Quaternion(-0.3486, 0.0122, 0.9365, 0.0329)); 
    9595 
    96         //mRaySceneQuery = mSceneMgr->createRayQuery( 
    97         //      Ray(mCamera->getPosition(), Vector3::NEGATIVE_UNIT_Y)); 
    98  
    99         /*Entity *robotEnt = mSceneMgr->createEntity( "Robot", "robot.mesh" ); 
     96        /* 
     97        Entity *robotEnt = mSceneMgr->createEntity( "Robot", "robot.mesh" ); 
    10098        SceneNode *robotNode = mSceneMgr->getRootSceneNode()->createChildSceneNode( "RobotNode", Vector3( 750, 25, 600 )); 
    10199        robotNode->attachObject( robotEnt ); 
  • trunk/VUT/OcclusionCullingSceneManager/include/OgreOcclusionCullingOctreeSceneManager.h

    r48 r51  
    4242                bool getOptionKeys( StringVector &refKeys ); 
    4343 
    44                 /** Renders one octant of an octree, i.e., renders current octant 
    45                         node and does not traverse deeper into the tree. 
    46                         @remark Note that OctreeNode instances are NOT part of the octree  
    47                         hierarchy, instead one octant of an Octree contains many OctreeNode instances. 
    48                         @param octree the octree to be rendered 
    49                         @param cam current camera 
    50                 */ 
    51                 void _renderOctant(Camera* cam, Octree *octree); 
    52  
    5344        protected: 
    5445                /** Recursively counts octree size (i.e., number of octree instances) 
  • trunk/VUT/OcclusionCullingSceneManager/include/OgreOcclusionCullingSceneTraverser.h

    r42 r51  
    170170                unsigned int mNumFrustumCulledNodes; 
    171171                unsigned int mNumRenderedGeometry; 
     172                unsigned int mNumRenderedNodes; 
    172173 
    173174        private: 
  • trunk/VUT/OcclusionCullingSceneManager/include/OgreOcclusionCullingTerrainSceneManager.h

    r48 r51  
    4444                bool getOptionKeys( StringVector &refKeys ); 
    4545 
    46                 /** Renders one octant of an octree, i.e., renders current octant 
    47                         node and does not traverse deeper into the tree. 
    48                         @remark Note that OctreeNode instances are NOT part of the octree  
    49                         hierarchy, instead one octant of an Octree contains many OctreeNode instances. 
    50                         @param octree the octree to be rendered 
    51                         @param cam current camera 
    52                 */ 
    53                 void _renderOctant(Camera* cam, Octree *octree); 
    54  
    5546        protected: 
    5647 
  • trunk/VUT/OcclusionCullingSceneManager/include/OgreSolidHalfBoundingBox.h

    r26 r51  
    1515        class SolidHalfBoundingBox : public WireBoundingBox 
    1616        { 
     17        public: 
     18 
     19                SolidHalfBoundingBox(bool isFirstHalf); 
     20                void setupBoundingBox(const AxisAlignedBox& aabb); 
     21                /** Override this method to prevent parent transforms (rotation,translation,scale) 
     22                and to make it public. 
     23        */ 
     24                void getWorldTransforms( Matrix4* xform ) const; 
     25 
    1726    protected: 
    1827        
    1928        /** Builds the wireframe line list. 
     29                @param the axis aligned bounding box for setting up the list. 
    2030        */ 
    2131                void setupBoundingBoxVertices(const AxisAlignedBox& aab); 
    22                  
    23         public: 
    24                  
    25                 bool mIsFirstHalf; 
    26                 void setupBoundingBox(const AxisAlignedBox& aabb); 
    27                 SolidHalfBoundingBox(bool isFirstHalf); 
     32 
     33                bool mIsFirstHalf;       
    2834        }; 
    2935 
  • trunk/VUT/OcclusionCullingSceneManager/src/OgreOcclusionCullingOctreeSceneManager.cpp

    r45 r51  
    1616                //mDisplayNodes = true; 
    1717                //mShowBoundingBoxes = true; 
    18                 //mShowBoxes = true; 
     18                mShowBoxes = true; 
    1919                mMaxDepth = 20; 
    2020        } 
     
    5757                // must be empty because objects are found and rendered in an interleaved fashion 
    5858                // in _renderVisibibleObjects  
    59                 //char *msg = "now finding visible objects\n"; OutputDebugString(msg); 
    6059        } 
    6160        //----------------------------------------------------------------------- 
     
    9291                return mOcclusionCullingOctreeSceneTraverser->getOptionKeys ( refKeys ) || OctreeSceneManager::getOptionKeys( refKeys ); 
    9392        } 
    94         //----------------------------------------------------------------------- 
    95         void OcclusionCullingOctreeSceneManager::_renderOctant(Camera *cam, Octree *octant) 
    96         { 
    97                 //Add stuff to be rendered; 
    98         NodeList::iterator it = octant->mNodes.begin(); 
    99           
    100         while(it != octant->mNodes.end()) 
    101         { 
    102             OctreeNode *sn = *it; 
    103  
    104             mNumObjects++; 
    105  
    106                         // check bounding box visibility of scene nodes 
    107                         if (cam->isVisible(sn->_getWorldAABB())) 
    108                         { 
    109                                 sn->_addToRenderQueue(cam, getRenderQueue(), false); 
    110                                 //node->_findVisibleObjects(cam, getRenderQueue(), false, mDisplayNodes, false); 
    111                                 mVisible.push_back(sn); 
    112  
    113                                 if (mDisplayNodes) 
    114                                         getRenderQueue()->addRenderable(sn); 
    115  
    116                                 // check if the scene manager or this node wants the bounding box shown. 
    117                                 if (sn->getShowBoundingBox() || mShowBoundingBoxes) 
    118                                         sn->_addBoundingBoxToQueue(getRenderQueue()); 
    119  
    120                                 if (mShowBoxes) 
    121                                         getRenderQueue()->addRenderable(octant->getWireBoundingBox()); 
    122                         } 
    123             ++it; 
    124         } 
    125  
    126                 SceneManager::_renderVisibleObjects(); 
    127          
    128                 // delete all rendered objects from renderqueue 
    129                 _deleteRenderedQueueGroups(); 
    130         } 
    13193}        
  • trunk/VUT/OcclusionCullingSceneManager/src/OgreOcclusionCullingOctreeSceneTraverser.cpp

    r48 r51  
    2828                { 
    2929                        Octree *nextChild = octant->mChildren[(i & 4) >> 2][(i & 2) >> 1][i & 1]; 
    30                  
     30 
     31                        /*char msg[100]; 
     32                        sprintf(msg, "node number: %d %d %d\n", (i & 4) >> 2, (i & 2) >> 1, i & 1); 
     33                        OutputDebugString(msg);*/ 
     34 
    3135                        if(nextChild) 
    3236                                mOctreeDistanceQueue->push(nextChild); 
     
    4448         
    4549                        // interesting for visualization purpose 
    46                         //TODO: octree->setNodeVisible(false); 
     50                        octant->setOctreeVisible(false); 
    4751                        octant->_getCullBounds(&box); 
    4852                         
     
    8185                        bool intersects = false; 
    8286 
    83                         //if(vis == OctreeCamera::NONE) 
    8487                        if(!cam->isVisible(box, intersects)) 
    8588                        { 
     
    100103                        // wait if result not available 
    101104                        query->pullOcclusionQuery(&visiblePixels); 
    102                          
     105//visiblePixels = 1; 
    103106                        // node visible 
    104107                        if(visiblePixels > mVisibilityThreshold) 
     
    108111                        else 
    109112                        { 
     113                                char msg[100]; 
     114                                Vector3 min = box.getMinimum(); 
     115                                Vector3 max = box.getMaximum(); 
     116 
     117                                sprintf(msg, "culling box: %3.3f %3.3f %3.3f %3.3f %3.3f %3.3f\n", min.x, min.y, min.z, max.x, max.y, max.z); 
     118                                OutputDebugString(msg); 
     119 
    110120                                mNumQueryCulledNodes ++; 
    111121                        } 
     
    133143                                unsigned int visiblePixels; 
    134144                                query->pullOcclusionQuery(&visiblePixels); 
    135  
     145//visiblePixels = 1; 
    136146                                if(visiblePixels > mVisibilityThreshold) 
    137147                                { 
     
    164174                                if(intersects) 
    165175                                { 
    166                                         // update node's visited flag 
     176                                        // update octant's visited flag 
    167177                                        octant->setLastVisited(mFrameId); 
    168178                                        pullUpVisibility(cam, octant);                   
     
    174184                                // identify previously visible nodes 
    175185                                bool wasVisible = octant->isOctreeVisible() && (octant->lastVisited() == mFrameId - 1); 
    176                                          
     186                                 
     187                                /* char msg[100]; 
     188                                if(wasVisible) sprintf(msg, "yes, was visible, %d\n", mFrameId); 
     189                                else sprintf(msg, "no was invisible, %d\n", mFrameId); 
     190                                OutputDebugString(msg);*/ 
     191 
    177192                                // identify nodes that we cannot skip queries for 
    178193                                bool leafOrWasInvisible = !wasVisible || isLeaf(octant); 
     
    196211                                        traverseOctant(cam, octant); 
    197212                                } 
    198                                 else 
    199                                 { 
    200                                         mNumFrustumCulledNodes ++; 
    201                                 } 
    202213                        } 
    203214                } 
     
    218229        void OcclusionCullingOctreeSceneTraverser::renderOctant( Camera *cam, Octree *octant ) 
    219230        { 
    220                 //if(octant->numNodes() > 0) 
     231                if(octant->numNodes() == 0) return; 
    221232                if(octant->lastVisited() != octant->lastRendered()) 
    222233                { 
    223                         //setRenderingMode(MODE_RENDER); 
     234                        //TODO: does nothing useful 
     235                        setRenderingMode(MODE_RENDER); 
     236                        mNumRenderedNodes ++; 
    224237 
    225238                        octant->setLastRendered(octant->lastVisited()); 
    226                         ((OcclusionCullingOctreeSceneManager *)mSceneManager)->_renderOctant(cam, octant); 
    227                 } 
    228                 else OutputDebugString("already rendered"); 
     239                        ((OctreeSceneManager *)mSceneManager)->_renderOctant(cam, octant); 
     240                } 
     241                //else OutputDebugString("already rendered"); 
    229242        } 
    230243        //----------------------------------------------------------------------- 
  • trunk/VUT/OcclusionCullingSceneManager/src/OgreOcclusionCullingSceneManagerDll.cpp

    r48 r51  
    3434namespace Ogre { 
    3535 
    36    // OcclusionCullingDotSceneManager *occlusionDotPlugin; 
     36        // OcclusionCullingDotSceneManager *occlusionDotPlugin; 
    3737        OcclusionCullingOctreeSceneManager *occlusionOctreePlugin; 
    3838        OcclusionCullingTerrainSceneManager *occlusionTerrainPlugin; 
     
    5454                Root::getSingleton().setSceneManager( ST_GENERIC, occlusionOctreePlugin ); 
    5555                Root::getSingleton().setSceneManager( ST_EXTERIOR_CLOSE, occlusionTerrainPlugin ); 
    56                  
    57                 // MessageBox( NULL, "myplugin registered", "this is my plugin", MB_OK | MB_ICONERROR | MB_TASKMODAL); 
    5856    } 
    5957    extern "C" void dllStopPlugin(void) 
  • trunk/VUT/OcclusionCullingSceneManager/src/OgreOcclusionCullingSceneTraverser.cpp

    r44 r51  
    1616        mQueryMode(MODE_RENDER), mNumSceneNodes(0), mCurrentAlgorithm(RENDER_COHERENT), 
    1717        mNumQueries(0), mNumTraversedNodes(0), mNumQueryCulledNodes(0), mNumFrustumCulledNodes(0),  
    18         mNumRenderedGeometry(0), mSceneManager(sm), mRenderSystem(rsys), mSceneRoot(NULL) 
     18        mNumRenderedNodes(0),mNumRenderedGeometry(0), mSceneManager(sm), mRenderSystem(rsys), mSceneRoot(NULL) 
    1919        {                
    2020                mHalfBoundingBox[0] = mHalfBoundingBox[1] = 0; 
     
    3939                mNumFrustumCulledNodes = 0; 
    4040                mNumRenderedGeometry = 0; 
    41                  
     41                mNumRenderedNodes = 0; 
     42 
    4243                mCurrentTestIdx = 0; 
    4344 
    4445                initDistanceQueue(cam); 
    4546 
    46 //mCurrentAlgorithm = RENDER_CULL_FRUSTUM; 
     47                //deleteQueries(); 
     48                //char *msg = "deleting queries\n"; OutputDebugString(msg); 
     49        //for(unsigned int i=0; i < 1000; i++) 
     50                //mOcclusionQueries.push_back(mRenderSystem->createHardwareOcclusionQuery()); 
     51            //mCurrentAlgorithm = RENDER_CULL_FRUSTUM; 
     52 
    4753                switch(mCurrentAlgorithm) 
    4854                { 
     
    5460                                break; 
    5561                        case RENDER_COHERENT: 
    56                                 //renderCoherentWithQueue(cam); 
    57 renderStopAndWait(cam); 
     62                                renderCoherentWithQueue(cam); 
    5863                                break; 
    5964                        default: 
     
    209214                        // wait if result not available 
    210215                        query->pullOcclusionQuery(&visiblePixels); 
    211                                  
     216         
    212217                        // node visible 
    213218                        if(visiblePixels > mVisibilityThreshold) 
     
    229234                // TODO: in rendervisibleobjects, the rendermode is changed by ogre itself => change this!! 
    230235                 
    231                 //setRenderingMode(MODE_QUERY); 
    232                 setRenderingMode(MODE_RENDER); 
     236                setRenderingMode(MODE_QUERY); 
     237                //setRenderingMode(MODE_RENDER); 
    233238 
    234239                // get next available test id 
     
    251256                //{ 
    252257                        bool enabled = (mode == MODE_RENDER); 
    253                          
     258//if(mode == MODE_QUERY){ 
    254259                        mRenderSystem->_setColourBufferWriteEnabled(enabled,  
    255260                                enabled, enabled, enabled); 
    256261                        mRenderSystem->_setDepthBufferWriteEnabled(enabled); 
    257262                        mRenderSystem->setLightingEnabled(enabled); 
    258  
     263//} 
    259264                        mQueryMode = mode; 
    260265                //} 
     
    346351        void OcclusionCullingSceneTraverser::deleteQueries( void ) 
    347352        { 
    348                 for(unsigned int i=0; i < (unsigned int)mOcclusionQueries.size(); i++) 
     353                for(unsigned int i=0; i < (unsigned int)mOcclusionQueries.size(); ++i) 
    349354                        delete mOcclusionQueries[i]; 
    350355 
     
    357362                for(int half = 0; half < 2; half ++) 
    358363                { 
    359                         //static Matrix4 xform[256]; 
    360                         //TODO: this should be full boudning box 
     364                        static Matrix4 xform[256]; 
     365                        //TODO: this should be full bounding box 
    361366                        SolidHalfBoundingBox *halfbox = getSolidHalfBoundingBox(half); 
    362367                        halfbox->setupBoundingBox(*box); 
    363  
    364                         mRenderSystem->_setWorldMatrix(Matrix4::IDENTITY); 
    365368                         
     369                        //mRenderSystem->_setWorldMatrix(Matrix4::IDENTITY); 
     370                        // Set world transformation 
     371                        /*halfbox->getWorldTransforms(xform); 
     372 
     373                        int numMatrices = halfbox->getNumWorldTransforms(); 
     374                        if (numMatrices > 1) 
     375                        { 
     376                                mRenderSystem->_setWorldMatrices(xform, numMatrices); 
     377                        } 
     378                        else 
     379                        { 
     380                                mRenderSystem->_setWorldMatrix(*xform); 
     381                        } 
     382                        mRenderSystem->setClipPlanes(halfbox->getClipPlanes()); 
     383 
    366384                        static RenderOperation ro; 
    367385 
     
    369387                        halfbox->getRenderOperation(ro); 
    370388                        ro.srcRenderable = halfbox;  
    371                         mRenderSystem->_render(ro); 
    372  
    373                         //mSceneManager->renderSingleObject(getSolidHalfBoundingBox(half),  
    374                         //      getSolidHalfBoundingBox(half)->getTechnique()->getPass(0), false); 
     389                        mRenderSystem->_render(ro);*/ 
     390 
     391                        mSceneManager->myrenderSingleObject(getSolidHalfBoundingBox(half),  
     392                                getSolidHalfBoundingBox(half)->getTechnique()->getPass(0), false); 
    375393                } 
    376394        } 
     
    410428                { 
    411429                        mOcclusionQueries.push_back(mRenderSystem->createHardwareOcclusionQuery()); 
     430                        //char *msg = "creating query!!\n"; OutputDebugString(msg); 
    412431                } 
    413432                 
  • trunk/VUT/OcclusionCullingSceneManager/src/OgreOcclusionCullingTerrainSceneManager.cpp

    r48 r51  
    1818                //mDisplayNodes = true; 
    1919                //mShowBoundingBoxes = true; 
    20                 //mShowBoxes = true; 
     20                mShowBoxes = true; 
    2121                mMaxDepth = 20; 
    2222        } 
     
    9595        } 
    9696        //----------------------------------------------------------------------- 
    97         void OcclusionCullingTerrainSceneManager::_renderOctant(Camera *cam, Octree *octant) 
    98         { 
    99                 //Add stuff to be rendered; 
    100         NodeList::iterator it = octant->mNodes.begin(); 
    101           
    102         while(it != octant->mNodes.end()) 
    103         { 
    104             OctreeNode *sn = *it; 
    105  
    106             mNumObjects++; 
    107  
    108                         // check bounding box visibility of scene nodes 
    109                         if (cam->isVisible(sn->_getWorldAABB())) 
    110                         { 
    111                                 sn->_addToRenderQueue(cam, getRenderQueue(), false); 
    112                                 //node->_findVisibleObjects(cam, getRenderQueue(), false, mDisplayNodes, false); 
    113                                 mVisible.push_back(sn); 
    114  
    115                                 if (mDisplayNodes) 
    116                                         getRenderQueue()->addRenderable(sn); 
    117  
    118                                 // check if the scene manager or this node wants the bounding box shown. 
    119                                 if (sn->getShowBoundingBox() || mShowBoundingBoxes) 
    120                                         sn->_addBoundingBoxToQueue(getRenderQueue()); 
    121  
    122                                 if (mShowBoxes) 
    123                                         getRenderQueue()->addRenderable(octant->getWireBoundingBox()); 
    124                         } 
    125             ++it; 
    126         } 
    127  
    128                 SceneManager::_renderVisibleObjects(); 
    129          
    130                 // delete all rendered objects from renderqueue 
    131                 _deleteRenderedQueueGroups(); 
    132         } 
    133         //----------------------------------------------------------------------- 
    13497        /*unsigned int OcclusionCullingTerrainSceneManager::countNumOctrees(Octree *root) 
    13598        { 
  • trunk/VUT/OcclusionCullingSceneManager/src/OgreSolidHalfBoundingBox.cpp

    r26 r51  
    8989                setBoundingBox(aabb); 
    9090        } 
     91        // Override this method to prevent parent transforms (rotation,translation,scale) 
     92    void SolidHalfBoundingBox::getWorldTransforms( Matrix4* xform ) const 
     93    { 
     94                // return identity matrix to prevent parent transforms 
     95        *xform = Matrix4::IDENTITY; 
     96    } 
    9197} 
    9298 
Note: See TracChangeset for help on using the changeset viewer.