Ignore:
Timestamp:
04/12/05 18:32:32 (20 years ago)
Author:
mattausch
Message:

implementation for terrain + octree scenemanager

Location:
trunk/VUT/OcclusionCullingSceneManager
Files:
4 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/VUT/OcclusionCullingSceneManager/TestCulling/TestCulling.vcproj

    r33 r44  
    122122                        UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"> 
    123123                        <File 
     124                                RelativePath=".\TerrainContentGenerator.cpp"> 
     125                        </File> 
     126                        <File 
    124127                                RelativePath=".\TestCullingApplication.cpp"> 
    125128                        </File> 
     
    129132                        Filter="h;hpp;hxx;hm;inl;inc;xsd" 
    130133                        UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"> 
     134                        <File 
     135                                RelativePath=".\TerrainContentGenerator.h"> 
     136                        </File> 
    131137                        <File 
    132138                                RelativePath=".\TestCullingApplication.h"> 
  • trunk/VUT/OcclusionCullingSceneManager/TestCulling/TestCullingApplication.cpp

    r42 r44  
    2020#include "windows.h" 
    2121 
    22 RaySceneQuery* raySceneQuery = 0; 
     22//RaySceneQuery* mRaySceneQuery = 0; 
    2323 
    2424/***********************************************/ 
    2525/* TestCullingApplication implementation       */ 
    2626/***********************************************/ 
    27 TestCullingApplication::~TestCullingApplication() 
    28 { 
    29         delete raySceneQuery; 
    30 } 
     27/*TestCullingApplication::~TestCullingApplication() 
     28{ 
     29        delete mRaySceneQuery; 
     30}*/ 
    3131//----------------------------------------------------------------------- 
    3232void TestCullingApplication::createCamera( void ) 
     
    5757        l->setPosition(20,80,50); 
    5858 
    59         // Fog 
     59        // --Fog 
    6060        // NB it's VERY important to set this before calling setWorldGeometry  
    6161        // because the vertex program picked will be different 
     
    6666        mWindow->getViewport(0)->setBackgroundColour(fadeColour); 
    6767 
    68          // Create a skybox 
    69      //mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox", 500, false); 
    70          //mSceneMgr->setSkyDome( true, "Examples/CloudySky", 5, 8, 500, false ); 
     68        // Create a skybox 
     69    //mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox", 500, false); 
     70        //mSceneMgr->setSkyDome( true, "Examples/CloudySky", 5, 8, 500, false ); 
    7171 
    7272        std::string terrain_cfg("terrain.cfg"); 
     
    9494        mCamera->setOrientation(Quaternion(-0.3486, 0.0122, 0.9365, 0.0329)); 
    9595 
    96         raySceneQuery = mSceneMgr->createRayQuery( 
    97         Ray(mCamera->getPosition(), Vector3::NEGATIVE_UNIT_Y)); 
    98  
    99         Entity *robotEnt = mSceneMgr->createEntity( "Robot", "robot.mesh" ); 
     96        //mRaySceneQuery = mSceneMgr->createRayQuery( 
     97        //      Ray(mCamera->getPosition(), Vector3::NEGATIVE_UNIT_Y)); 
     98 
     99        /*Entity *robotEnt = mSceneMgr->createEntity( "Robot", "robot.mesh" ); 
    100100        SceneNode *robotNode = mSceneMgr->getRootSceneNode()->createChildSceneNode( "RobotNode", Vector3( 750, 25, 600 )); 
    101101        robotNode->attachObject( robotEnt ); 
     
    113113    ogreNode2->attachObject( ogreEnt2 ); 
    114114        ogreNode2->scale(.05,.05,.05); 
    115         ogreNode->yaw( Degree( 40 ) ); 
     115        ogreNode->yaw( Degree( 40 ) );*/ 
    116116 
    117117        // CEGUI setup 
     
    131131 
    132132         CEGUI::MouseCursor::getSingleton().show( ); 
    133       
    134         /* CEGUI::Window* sheet =  
    135             CEGUI::WindowManager::getSingleton().loadWindowLayout( 
    136                 (CEGUI::utf8*)"ogregui.layout");  
    137  
    138      mGUISystem->setGUISheet(sheet);*/ 
    139133} 
    140134//----------------------------------------------------------------------- 
     
    155149/* MouseQueryListener implementation           */ 
    156150/***********************************************/ 
    157  
    158151//----------------------------------------------------------------------- 
    159152MouseQueryListener::MouseQueryListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, CEGUI::Renderer *renderer) 
     
    163156 
    164157        // Setup default variables 
    165 //      mCurrentObject = NULL; 
     158        mCurrentObject = NULL; 
    166159        mLMouseDown = false; 
    167160        mRMouseDown = false; 
     
    180173        mEventProcessor->addKeyListener(this); 
    181174 
     175        mRaySceneQuery = mSceneMgr->createRayQuery( Ray() ); 
     176 
    182177        // show overlay 
    183178        Overlay* pOver = OverlayManager::getSingleton().getByName("Example/OcclusionCullingDemoOverlay");  
     
    200195 
    201196    pOver->show(); 
    202 } // MouseQueryListener 
     197}  
     198//----------------------------------------------------------------------- 
     199MouseQueryListener::~MouseQueryListener( ) 
     200{ 
     201        delete mRaySceneQuery; 
     202} 
    203203//----------------------------------------------------------------------- 
    204204void MouseQueryListener::mouseMoved (MouseEvent *e) 
     
    214214     { 
    215215                 CEGUI::MouseCursor::getSingleton().hide( ); 
    216                  mLMouseDown = true; 
    217      } // if 
     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;  
     238     } 
    218239     // Right mouse button down 
    219240     else if (e->getButtonID() & InputEvent::BUTTON1_MASK) 
     
    243264void MouseQueryListener::mouseDragged (MouseEvent *e) 
    244265 { 
    245          /* 
    246          // If we are dragging the left mouse button.     
     266         // If we are dragging the left mouse button.             
    247267         if ( mLMouseDown ) 
    248          { 
    249                 mShipNode->translate(-e->getRelX() * 200, -e->getRelY() * 200, 0.0); 
     268     { 
     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                 }  
    250279     } 
    251          */ 
    252           
    253280         // If we are dragging the right mouse button. 
    254281         if ( mRMouseDown ) 
     
    262289{ 
    263290        // clamp to terrain 
    264         static Ray updateRay; 
    265         updateRay.setOrigin(mCamera->getPosition()); 
    266         updateRay.setDirection(Vector3::NEGATIVE_UNIT_Y); 
    267         raySceneQuery->setRay(updateRay); 
    268         RaySceneQueryResult& qryResult = raySceneQuery->execute(); 
    269         RaySceneQueryResult::iterator i = qryResult.begin(); 
    270           
    271         if (i != qryResult.end() && i->worldFragment) 
     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) 
    272300        { 
    273                 SceneQuery::WorldFragment* wf = i->worldFragment; 
    274                 mCamera->setPosition(mCamera->getPosition().x,  
    275                         i->worldFragment->singleIntersection.y + 10,  
     301                SceneQuery::WorldFragment* wf = it->worldFragment; 
     302 
     303                mCamera->setPosition(mCamera->getPosition().x, wf->singleIntersection.y + 10,  
    276304                        mCamera->getPosition().z); 
    277305        } 
     
    290318    KEY_PRESSED(KC_SPACE, 0.3, changeAlgorithm()); 
    291319 
    292         KEY_PRESSED(KC_SUBTRACT, 0.3, changeThreshold(-10)); 
     320        KEY_PRESSED(KC_SUBTRACT, 0, changeThreshold(-10)); 
    293321        KEY_PRESSED(KC_ADD, 0, changeThreshold(10)); 
    294322        //KEY_PRESSED(KC_T, 1, change); 
  • trunk/VUT/OcclusionCullingSceneManager/TestCulling/TestCullingApplication.h

    r42 r44  
    55#include "CEGUIForwardRefs.h" 
    66#include "ExampleApplication.h" 
    7 //#include "OgreOcclusionCullingSceneManager.h" 
    87#include "OgreOcclusionCullingSceneTraverser.h" 
    98 
     
    3231 
    3332 
    34     ~MouseQueryListener( ) 
    35     { 
    36     } 
     33    ~MouseQueryListener( ); 
    3734 
    3835        bool frameStarted(const FrameEvent& evt); 
     
    8279        OverlayElement *mHierarchyNodesInfo; 
    8380        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 
    8485}; 
    8586 
     
    8889{ 
    8990public: 
    90         ~TestCullingApplication(); 
     91        //~TestCullingApplication(); 
    9192 
    9293protected: 
     
    101102private: 
    102103        void chooseSceneManager(void); 
    103  
    104         //Entity* mShip; 
    105         //SceneNode* mShipNode; 
    106104}; 
    107105 
  • trunk/VUT/OcclusionCullingSceneManager/src/OgreOcclusionCullingDotSceneManager.cpp

    r42 r44  
    55#include "OgreCamera.h" 
    66#include "OgreHardwareOcclusionQuery.h" 
    7 //#include "OgreWireBoundingBox.h" 
    87#include "OgreSolidHalfBoundingBox.h" 
    98 
  • trunk/VUT/OcclusionCullingSceneManager/src/OgreOcclusionCullingSceneTraverser.cpp

    r42 r44  
    44#include "OgreCamera.h" 
    55#include "OgreHardwareOcclusionQuery.h" 
    6 //#include "OgreWireBoundingBox.h" 
    76#include "OgreSolidHalfBoundingBox.h" 
    87 
     
    5554                                break; 
    5655                        case RENDER_COHERENT: 
    57                                 renderCoherentWithQueue(cam); 
     56                                //renderCoherentWithQueue(cam); 
     57renderStopAndWait(cam); 
    5858                                break; 
    5959                        default: 
     
    228228                // change state so the bounding box gets not actually rendered on the screen 
    229229                // TODO: in rendervisibleobjects, the rendermode is changed by ogre itself => change this!! 
    230                 setRenderingMode(MODE_QUERY); 
    231                 //setRenderingMode(MODE_RENDER); 
     230                 
     231                //setRenderingMode(MODE_QUERY); 
     232                setRenderingMode(MODE_RENDER); 
    232233 
    233234                // get next available test id 
     
    247248        {        
    248249                // avoid unnecessary state changes 
    249                 if(mode != mQueryMode) 
    250                 { 
     250                //if(mode != mQueryMode) 
     251                //{ 
    251252                        bool enabled = (mode == MODE_RENDER); 
    252253                         
     
    257258 
    258259                        mQueryMode = mode; 
    259                 } 
     260                //} 
    260261        } 
    261262        //----------------------------------------------------------------------- 
  • trunk/VUT/OcclusionCullingSceneManager/src/OgreOcclusionCullingTerrainSceneManager.cpp

    r42 r44  
    55#include "OgreCamera.h" 
    66#include "OgreHardwareOcclusionQuery.h" 
    7 //#include "OgreWireBoundingBox.h" 
    87#include "OgreSolidHalfBoundingBox.h" 
    98 
     
    1918                //mDisplayNodes = true; 
    2019                //mShowBoundingBoxes = true; 
    21                 mShowBoxes = true; 
    22                 //mMaxDepth = 20; 
     20                //mShowBoxes = true; 
     21                mMaxDepth = 20; 
    2322        } 
    2423        //----------------------------------------------------------------------- 
     
    6665        { 
    6766                //char *msg = "now updating scenegraph\n"; OutputDebugString(msg); 
     67                //mOcclusionCullingTerrainSceneTraverser->preprocess(); 
     68 
    6869        mOcclusionCullingTerrainSceneTraverser->setNumSceneNodes((int)mSceneNodes.size()); 
    6970                mOcclusionCullingTerrainSceneTraverser->setRenderSystem(mDestRenderSystem); 
    70         //mOcclusionCullingTerrainSceneTraverser->preprocess(); 
     71         
    7172                mOcclusionCullingTerrainSceneTraverser->setNumOctreeNodes(mNumOctreeNodes); 
    7273 
     
    99100        NodeList::iterator it = octant->mNodes.begin(); 
    100101          
    101         while ( it != octant->mNodes.end() ) 
     102        while(it != octant->mNodes.end()) 
    102103        { 
    103104            OctreeNode *sn = *it; 
     
    106107 
    107108                        // check bounding box visibility of scene nodes 
    108                         if( cam->isVisible( sn->_getWorldAABB() ) ) 
     109                        if (cam->isVisible(sn->_getWorldAABB())) 
    109110                        { 
    110                                 sn->_addToRenderQueue(cam, getRenderQueue(), false ); 
     111                                sn->_addToRenderQueue(cam, getRenderQueue(), false); 
    111112                                //node->_findVisibleObjects(cam, getRenderQueue(), false, mDisplayNodes, false); 
    112                                 mVisible.push_back( sn ); 
     113                                mVisible.push_back(sn); 
    113114 
    114                                 if ( mDisplayNodes ) 
    115                                         getRenderQueue()->addRenderable( sn ); 
     115                                if (mDisplayNodes) 
     116                                        getRenderQueue()->addRenderable(sn); 
    116117 
    117118                                // check if the scene manager or this node wants the bounding box shown. 
     
    119120                                        sn->_addBoundingBoxToQueue(getRenderQueue()); 
    120121 
    121                                 if ( mShowBoxes ) 
     122                                if (mShowBoxes) 
    122123                                        getRenderQueue()->addRenderable(octant->getWireBoundingBox()); 
    123124                        } 
  • trunk/VUT/OcclusionCullingSceneManager/src/OgreOcclusionCullingTerrainSceneTraverser.cpp

    r42 r44  
    2323         
    2424                // if we come across some renderable geometry => render it 
    25                 if(octant->numNodes() > 0) 
    26                 { 
    27                         renderOctant(cam, octant); 
    28                 } 
    29  
     25                renderOctant(cam, octant); 
     26                 
    3027                for(int i=0; i<8; i++) 
    3128                { 
     
    9087                                continue; 
    9188                        } 
    92                         // if intersects near plane => skip occlusion query because wrong results possible 
     89                        //if intersects near plane => skip occlusion query because wrong results possible 
    9390                        if(intersects) 
    9491                        { 
     
    212209                { 
    213210                        // if we come across some renderable geometry => render it 
    214                         if(octant->numNodes() > 0) 
    215                         { 
    216                                 renderOctant(cam, octant); 
    217                         } 
    218  
     211                        renderOctant(cam, octant); 
     212                         
    219213                        octant->setOctreeVisible(true); 
    220214                        octant = octant->getParent(); 
     
    224218        void OcclusionCullingTerrainSceneTraverser::renderOctant( Camera *cam, Octree *octant ) 
    225219        { 
     220                //if(octant->numNodes() > 0) 
    226221                if(octant->lastVisited() != octant->lastRendered()) 
    227222                { 
    228                         setRenderingMode(MODE_RENDER); 
     223                        //setRenderingMode(MODE_RENDER); 
    229224 
    230225                        octant->setLastRendered(octant->lastVisited()); 
Note: See TracChangeset for help on using the changeset viewer.