Ignore:
Timestamp:
05/16/05 20:22:32 (19 years ago)
Author:
mattausch
Message:

added visualization for octree culling
camera in terrainexample is now attached to camera node => can see correct camera
in visualization

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/VUT/work/TestCullingTerrain/TestCullingTerrainApplication.cpp

    r99 r100  
    1313#include <OgreMemoryMacros.h> 
    1414 
    15 #include "Ogre.h" 
     15#include <Ogre.h> 
     16#include "OgreReferenceAppLayer.h" 
     17//#include "OgreRefAppWorld.h" 
    1618#include "TestCullingTerrainApplication.h" 
    1719 
     
    1921#include <windows.h> 
    2022 
     23#define VIZ_VIEWPORT_Z_ORDER 10 
    2124 
    2225/*******************************************************/ 
    2326/*     TestCullingTerrainApplication implementation    */ 
    2427/*******************************************************/ 
     28 
     29//----------------------------------------------------------------------- 
    2530TestCullingTerrainApplication::~TestCullingTerrainApplication() 
    2631{ 
     
    3338{ 
    3439        // create the camera 
    35         mCamera = mSceneMgr->createCamera("PlayerCam"); 
    36          
    37         // set a nice viewpoint 
    38         mCamera->setPosition(707, 2500, 528); 
    39         mCamera->setOrientation(Quaternion(-0.3486, 0.0122, 0.9365, 0.0329)); 
    40          
    41         //--create visualization camera 
    42         mVisualizationCamera = mSceneMgr->createCamera("VizCam"); 
    43         mVisualizationCamera->setPosition(mCamera->getPosition()); 
    44         mVisualizationCamera->setOrientation(mCamera->getOrientation()); 
    45  
    46         mVisualizationCamera->setNearClipDistance(1); 
     40        mCamera = mSceneMgr->createCamera("CullCamera"); 
     41         
     42        /** set a nice viewpoint 
     43        *       we use a camera node here and apply all transformations on it instead 
     44        *       of applying all transformations directly to the camera 
     45        *       because then the camera is displayed correctly in the visualization 
     46        */ 
     47         
     48        mCamNode = mSceneMgr->getRootSceneNode()->createChildSceneNode( 
     49                "CamNode1", Vector3(707, 5000, 528)); 
     50        //mCamera->setPosition(707, 5000, 528); 
     51        mCamNode->setOrientation(Quaternion(-0.3486, 0.0122, 0.9365, 0.0329)); 
     52         
     53        mCamNode->attachObject(mCamera); 
     54 
     55        //-- create visualization camera 
     56        mVizCamera = mSceneMgr->createCamera("VizCam"); 
     57        mVizCamera->setPosition(mCamNode->getPosition()); 
     58 
     59        mVizCamera->setNearClipDistance(1); 
    4760        mCamera->setNearClipDistance(1); 
    4861 
     
    5063        if (mRoot->getRenderSystem()->getCapabilities()->hasCapability(RSC_INFINITE_FAR_PLANE)) 
    5164        { 
    52                 mVisualizationCamera->setFarClipDistance(0); 
     65                mVizCamera->setFarClipDistance(0); 
    5366                mCamera->setFarClipDistance(0); 
    5467        } 
    5568        else 
    5669        { 
    57                  mVisualizationCamera->setFarClipDistance(1000); 
     70                 mVizCamera->setFarClipDistance(1000); 
    5871                 mCamera->setFarClipDistance(1000); 
    5972        }        
     
    8497        // Accept default settings: point light, white diffuse, just set position 
    8598        // NB I could attach the light to a SceneNode if I wanted it to move automatically with 
    86         //  other objects, but I don't 
     99        // other objects, but I don't 
    87100        l->setPosition(20,80,50); 
    88101 
     
    95108         
    96109        // Create a skybox 
    97     mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox", 3500, false); 
     110        mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox", 7000, false); 
    98111        //mSceneMgr->setSkyDome( true, "Examples/CloudySky", 5, 8, 500, false ); 
    99112 
     
    104117        mSceneMgr->setWorldGeometry(terrain_cfg); 
    105118         
    106         // CEGUI setup 
     119        //-- CEGUI setup 
    107120        setupGui(); 
     121 
     122        //-- terrain content setup 
     123 
    108124        // HACK: necessary to call once before the content creation for 
    109125        // terrain initialisation 
     
    138154{ 
    139155        mFrameListener= new MouseQueryListener(mWindow, mCamera, mSceneMgr,  
    140                 mGUIRenderer, mTerrainContentGenerator, mVisualizationCamera); 
     156                mGUIRenderer, mTerrainContentGenerator, mVizCamera, mCamNode); 
    141157        mFrameListener->showDebugOverlay(true); 
    142158        mRoot->addFrameListener(mFrameListener); 
     
    155171                                                                           CEGUI::Renderer *renderer, 
    156172                                                                           TerrainContentGenerator *sceneGenerator, 
    157                                                                            Camera *vizCamera):  
     173                                                                           Camera *vizCamera, 
     174                                                                           SceneNode *camNode):  
    158175ExampleFrameListener(win, cam, false, true),  
    159176mGUIRenderer(renderer),  
     
    169186mUseVisibilityCulling(true), 
    170187mUseOptimization(true), 
    171 mVisualizationCamera(vizCamera) 
     188mVizCamera(vizCamera), 
     189mShowVisualization(false), 
     190mVizCameraHeight(Real(2500.0)), 
     191mCamNode(camNode), 
     192mCullCamera(true) 
    172193{ 
    173194        // Reduce move speed 
     
    213234        mSceneMgr->setOption("UseVisibilityCulling", &mUseVisibilityCulling); 
    214235        mSceneMgr->setOption("ShowOctree", &mShowOctree); 
     236        mSceneMgr->setOption("CullCamera", &mCullCamera); 
    215237         
    216238    pOver->show(); 
    217239}  
    218240//----------------------------------------------------------------------- 
    219 MouseQueryListener::~MouseQueryListener( ) 
     241MouseQueryListener::~MouseQueryListener() 
    220242{ 
    221243        delete mRayQueryExecutor; 
    222244} 
    223245//----------------------------------------------------------------------- 
    224 void MouseQueryListener::mouseMoved (MouseEvent *e) 
     246void MouseQueryListener::mouseMoved(MouseEvent *e) 
    225247{ 
    226248        // Update CEGUI with the mouse motion 
    227     CEGUI::System::getSingleton().injectMouseMove(e->getRelX() * mGUIRenderer->getWidth(),  
    228                 e->getRelY() * mGUIRenderer->getHeight()); 
     249    CEGUI::System::getSingleton().injectMouseMove(e->getRelX() *  
     250                mGUIRenderer->getWidth(), e->getRelY() * mGUIRenderer->getHeight()); 
    229251} 
    230252//----------------------------------------------------------------------- 
     
    252274         CEGUI::MouseCursor::getSingleton().hide(); 
    253275         mRMouseDown = true; 
    254      } // else if 
     276     } 
    255277} // mousePressed 
    256278//----------------------------------------------------------------------- 
     
    279301                 Ray mouseRay = mCamera->getCameraToViewportRay(e->getX(), e->getY()); 
    280302 
    281                  if(mRayQueryExecutor->executeRayQuery(&queryResult, mouseRay)) 
     303                 if (mRayQueryExecutor->executeRayQuery(&queryResult, mouseRay)) 
    282304                 { 
    283                          if(mCurrentObject) 
     305                         if (mCurrentObject) 
     306                         { 
    284307                                 mCurrentObject->setPosition(queryResult); 
     308                         } 
    285309                 } 
    286310     } 
     
    288312         if (mRMouseDown) 
    289313         { 
    290                  mCamera->yaw( -e->getRelX() * mRotateSpeed ); 
    291                  mCamera->pitch( -e->getRelY() * mRotateSpeed ); 
     314                 //mCamera->yaw(-e->getRelX() * mRotateSpeed); 
     315                 //mCamera->pitch(-e->getRelY() * mRotateSpeed); 
     316                 mCamNode->yaw(-e->getRelX() * mRotateSpeed); 
     317                 mCamNode->pitch(-e->getRelY() * mRotateSpeed); 
    292318         } 
    293319} 
     
    295321bool MouseQueryListener::frameStarted(const FrameEvent &evt) 
    296322{ 
    297         clamp2Terrain(mCamera); 
    298         clamp2Terrain(mVisualizationCamera); 
     323        clamp2Terrain(); 
     324 
     325        if (mShowVisualization) 
     326        { 
     327                // important for visualization => draw octree bounding boxes 
     328                mSceneMgr->setOption("ShowOctree", &mShowVisualization); 
     329 
     330                // -- setup visualization camera 
     331                mVizCamera->setPosition(0, 0, 0); 
     332                mVizCamera->setOrientation(Quaternion::IDENTITY); 
     333 
     334                Vector3 camPos = mCamNode->getPosition(); 
     335                mVizCamera->setPosition(camPos.x, mVizCameraHeight, camPos.z); 
     336 
     337                // Point down -Z axis 
     338                mVizCamera->pitch(Radian(Degree(270.0))); 
     339         
     340                // Rotation arounnd X axis 
     341                mVizCamera->yaw(Math::ATan2(-mCamera->getDerivedDirection().x,  
     342                        -mCamera->getDerivedDirection().z)); 
     343        } 
    299344 
    300345        return ExampleFrameListener::frameStarted(evt); 
    301346} 
    302 void MouseQueryListener::clamp2Terrain(Camera *cam) 
     347//----------------------------------------------------------------------- 
     348void MouseQueryListener::clamp2Terrain() 
    303349{ 
    304350        // clamp to terrain 
    305         Vector3 camPos = cam->getPosition(); 
     351        Vector3 camPos = mCamNode->getPosition(); 
    306352        Vector3 queryResult; 
    307353 
    308         if(mRayQueryExecutor->executeRayQuery(&queryResult,  
     354        if (mRayQueryExecutor->executeRayQuery(&queryResult,  
    309355                        Vector3(camPos.x, 5000.0f, camPos.z), Vector3::NEGATIVE_UNIT_Y)) 
    310356        { 
    311                 cam->setPosition(cam->getPosition().x, queryResult.y + 10,  
    312                         cam->getPosition().z); 
     357                mCamNode->setPosition(camPos.x, queryResult.y + 10, camPos.z); 
    313358        } 
    314359} 
     
    324369    KEY_PRESSED(KC_SPACE, 0.3, nextAlgorithm()); 
    325370 
    326         KEY_PRESSED(KC_SUBTRACT, 0, changeThreshold(-10)); 
    327         KEY_PRESSED(KC_ADD, 0, changeThreshold(10)); 
    328371        KEY_PRESSED(KC_O, 0.3, toggleUseOptimization()); 
    329         KEY_PRESSED(KC_Y, 0.3, toggleShowOctree()); 
     372        KEY_PRESSED(KC_E, 0.3, toggleShowOctree()); 
    330373        KEY_PRESSED(KC_C, 0.3, toggleUseVisibilityCulling()); 
    331374        KEY_PRESSED(KC_V, 0.3, toggleShowViz()); 
    332         KEY_PRESSED(KC_X, 0.3, FixVizCamera()); 
     375 
     376        if (!mShowVisualization) 
     377        { 
     378                KEY_PRESSED(KC_SUBTRACT, 0, changeThreshold(-10)); 
     379                KEY_PRESSED(KC_ADD, 0, changeThreshold(10)); 
     380        } 
     381        else 
     382        { 
     383                KEY_PRESSED(KC_SUBTRACT, 0, zoomVizCamera(50)); 
     384                KEY_PRESSED(KC_ADD, 0, zoomVizCamera(-50)); 
     385        } 
    333386 
    334387        updateStats(); 
    335         //if(mWindow->getViewport(1))   mWindow->getViewport(1)->update(); 
    336  
    337     return ExampleFrameListener::frameStarted(evt) && ExampleFrameListener::frameEnded(evt);         
     388 
     389        return ExampleFrameListener::frameStarted(evt) && ExampleFrameListener::frameEnded(evt); 
     390} 
     391void MouseQueryListener::moveCamera() 
     392{ 
     393        mCamNode->yaw(mRotX); 
     394        mCamNode->pitch(mRotY); 
     395        mCamNode->translate(mCamNode->getLocalAxes(), mTranslateVector); 
    338396} 
    339397//----------------------------------------------------------------------- 
     
    349407} 
    350408//----------------------------------------------------------------------- 
     409bool MouseQueryListener::processUnbufferedKeyInput(const FrameEvent& evt) 
     410{     
     411        if (mInputDevice->isKeyDown(KC_RIGHT)) 
     412        { 
     413                mCamNode->yaw(-mRotScale); 
     414                return true; 
     415        } 
     416        if (mInputDevice->isKeyDown(KC_LEFT)) 
     417        { 
     418                mCamNode->yaw(mRotScale); 
     419                return true; 
     420        } 
     421 
     422        return ExampleFrameListener::processUnbufferedKeyInput(evt); 
     423} 
     424//----------------------------------------------------------------------- 
     425void MouseQueryListener::zoomVizCamera(int zoom) 
     426{ 
     427        mVizCameraHeight += zoom;  
     428        if(mVizCameraHeight < 0) mVizCameraHeight = 0; 
     429} 
     430//----------------------------------------------------------------------- 
    351431void MouseQueryListener::nextAlgorithm() 
    352432{ 
     
    396476        mSceneMgr->setOption("UseOptimization", &mUseOptimization); 
    397477 
    398         if(mUseOptimization) 
     478        if (mUseOptimization) 
    399479                mUseOptimizationInfo->setCaption(": true"); 
    400480        else 
     
    420500        mShowVisualization = !mShowVisualization; 
    421501 
    422         // create viewport with priority 10: will be rendered over standard viewport 
    423         if(mShowVisualization) 
     502        // create viewport with priority VIZ_VIEWPORT_Z_ORDER:  
     503        // will be rendered over standard viewport 
     504        if (mShowVisualization) 
    424505        {        
    425                 mWindow->addViewport(mVisualizationCamera, 10, 0.5, 0.5, 1, 1); 
    426                 mWindow->getViewport(1)->setClearEveryFrame(true); 
     506                Viewport *vizvp = mWindow->addViewport(mVizCamera,  
     507                        VIZ_VIEWPORT_Z_ORDER, 0.6, 0, 0.4, 0.4); 
     508                                 
     509                vizvp->setBackgroundColour(ColourValue(0.0, 0.3, 0.2, 1)); 
     510 
     511                vizvp->setOverlaysEnabled(false); 
     512                // Alter the camera aspect ratio to match the viewport 
     513        mVizCamera->setAspectRatio(Real(vizvp->getActualWidth()) /  
     514                        Real(vizvp->getActualHeight())); 
     515 
     516                //vizvp->setClearEveryFrame(false); 
     517 
     518                // Create a skyplane (for visualization) 
     519                /*Plane plane; 
     520                plane.d = 1000; 
     521                plane.normal = Vector3::UNIT_Y; 
     522                mSceneMgr->setSkyPlane( true, plane, "Examples/MyTransparentTest", 4000, 75, true);*/ 
     523                 
    427524        } 
    428525        else 
    429526        { 
    430                 mWindow->removeViewport(10); 
    431         } 
    432 } 
    433 //----------------------------------------------------------------------- 
    434 void MouseQueryListener::FixVizCamera() 
    435 { 
    436         mVisualizationCamera->setPosition(mCamera->getPosition()); 
    437         mVisualizationCamera->setOrientation(mCamera->getOrientation()); 
    438         clamp2Terrain(mVisualizationCamera); 
    439 } 
    440  
     527                mWindow->removeViewport(VIZ_VIEWPORT_Z_ORDER); 
     528                // if octree was enabled for visualization purpose 
     529                mSceneMgr->setOption("ShowOctree", &mShowOctree); 
     530        } 
     531} 
    441532//----------------------------------------------------------------------- 
    442533void MouseQueryListener::keyPressed(KeyEvent* e) 
     
    475566void VisualizationRenderTargetListener::preViewportUpdate(const RenderTargetViewportEvent &evt) 
    476567{ 
    477         const bool b = evt.source->getZOrder() == 10; // visualization viewport 
    478                          
    479         mSceneMgr->setOption("ShowVisualization", &b); 
     568        const bool showViz = evt.source->getZOrder() == VIZ_VIEWPORT_Z_ORDER; // visualization viewport 
     569        const bool nShowViz = !showViz; 
     570 
     571    mSceneMgr->setOption("ShowVisualization", &showViz); 
     572        mSceneMgr->setOption("SkyBoxEnabled", &nShowViz); 
     573        //mSceneMgr->setOption("SkyPlaneEnabled", &showViz); 
    480574         
    481575        RenderTargetListener::preViewportUpdate(evt); 
Note: See TracChangeset for help on using the changeset viewer.