source: trunk/VUT/work/TestCullingTerrain/TestCullingTerrainApplication.cpp @ 109

Revision 109, 27.0 KB checked in by mattausch, 19 years ago (diff)

start to add shadows to demo

RevLine 
[61]1/**
2    \file
3        TestCullingTerrainApplication.cpp
4    \brief
[74]5        Tests the visibility culling algorithm
[61]6*/
7
8#include <OgreNoMemoryMacros.h>
9#include <CEGUI/CEGUI.h>
10#include <../CEGUIRenderer/include/OgreCEGUIRenderer.h>
11#include <../CEGUIRenderer/include/OgreCEGUIResourceProvider.h>
12#include <../CEGUIRenderer/include/OgreCEGUITexture.h>
13#include <OgreMemoryMacros.h>
14
[100]15#include <Ogre.h>
16#include "OgreReferenceAppLayer.h"
17//#include "OgreRefAppWorld.h"
[61]18#include "TestCullingTerrainApplication.h"
19
20#define WIN32_LEAN_AND_MEAN
[94]21#include <windows.h>
[61]22
[100]23#define VIZ_VIEWPORT_Z_ORDER 10
[61]24
[107]25const char* frame_outfile = "frame.out";
26const char* objects_outfile = "objects.out";
27
[80]28/*******************************************************/
29/*     TestCullingTerrainApplication implementation    */
30/*******************************************************/
[100]31
32//-----------------------------------------------------------------------
[61]33TestCullingTerrainApplication::~TestCullingTerrainApplication()
34{
[93]35        if(mTerrainContentGenerator)
36                delete mTerrainContentGenerator;
[99]37        //if(mRenderTargetListener)     delete mRenderTargetListener;
[61]38}
39//-----------------------------------------------------------------------
[93]40void TestCullingTerrainApplication::createCamera()
[61]41{
[99]42        // create the camera
[103]43        mCamera = mSceneMgr->createCamera("PlayerCam");
[93]44       
[100]45        /** set a nice viewpoint
46        *       we use a camera node here and apply all transformations on it instead
47        *       of applying all transformations directly to the camera
48        *       because then the camera is displayed correctly in the visualization
49        */
50        mCamNode = mSceneMgr->getRootSceneNode()->createChildSceneNode(
51                "CamNode1", Vector3(707, 5000, 528));
52        //mCamera->setPosition(707, 5000, 528);
53        mCamNode->setOrientation(Quaternion(-0.3486, 0.0122, 0.9365, 0.0329));
54       
55        mCamNode->attachObject(mCamera);
[61]56
[100]57        //-- create visualization camera
58        mVizCamera = mSceneMgr->createCamera("VizCam");
59        mVizCamera->setPosition(mCamNode->getPosition());
60
61        mVizCamera->setNearClipDistance(1);
[93]62        mCamera->setNearClipDistance(1);
[61]63
[99]64        // infinite far plane?
[93]65        if (mRoot->getRenderSystem()->getCapabilities()->hasCapability(RSC_INFINITE_FAR_PLANE))
66        {
[100]67                mVizCamera->setFarClipDistance(0);
[93]68                mCamera->setFarClipDistance(0);
69        }
70        else
71        {
[104]72                 mVizCamera->setFarClipDistance(20000);
73                 mCamera->setFarClipDistance(20000);
[99]74        }       
[61]75}
[99]76
[61]77//-----------------------------------------------------------------------
[99]78bool TestCullingTerrainApplication::setup()
79{
80        bool result = ExampleApplication::setup();
81
82        createRenderTargetListener();
83
84        return result;
85}
86//-----------------------------------------------------------------------
87void TestCullingTerrainApplication::createRenderTargetListener()
88{
89        mWindow->addListener(new VisualizationRenderTargetListener(mSceneMgr));
90}
91//-----------------------------------------------------------------------
[75]92void TestCullingTerrainApplication::createScene()
[61]93{
94        // Set ambient light
95        mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));
96       
97        // Create a light
98        Light* l = mSceneMgr->createLight("MainLight");
99        // Accept default settings: point light, white diffuse, just set position
100        // NB I could attach the light to a SceneNode if I wanted it to move automatically with
[100]101        // other objects, but I don't
[61]102        l->setPosition(20,80,50);
103
104        // --Fog
105        // NB it's VERY important to set this before calling setWorldGeometry
106        // because the vertex program picked will be different
107        ColourValue fadeColour(0.93, 0.86, 0.76);
108        mWindow->getViewport(0)->setBackgroundColour(fadeColour);
109        //mSceneMgr->setFog( FOG_LINEAR, fadeColour, .001, 500, 1000);
[94]110       
[61]111        // Create a skybox
[103]112        mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox", 5000, false);
113       
[61]114        std::string terrain_cfg("terrain.cfg");
115#if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
116        terrain_cfg = mResourcePath + terrain_cfg;
117#endif
[74]118        mSceneMgr->setWorldGeometry(terrain_cfg);
[75]119       
[100]120        //-- CEGUI setup
[61]121        setupGui();
[100]122
123        //-- terrain content setup
124
[80]125        // HACK: necessary to call once before the content creation for
126        // terrain initialisation
127        mSceneMgr->_renderScene(mCamera, mWindow->getViewport(0), true);
[74]128
[82]129        mTerrainContentGenerator = new TerrainContentGenerator(mSceneMgr);
[103]130
[107]131        // if no objects file generate yourself
[109]132        //if (!mTerrainContentGenerator->LoadObjects("objects.out"))
133        //{
[107]134                // the objects are generated on the whole terrain
135                // height is restricted to 50, so no objects appear on peaks
136                // => there is much occlusion
137                mTerrainContentGenerator->SetMaxPos(Vector3(3000.0f, 50.0f, 3000.0f));
138                mTerrainContentGenerator->GenerateScene(1500, "robot");
139                //      mTerrainContentGenerator->GenerateScene(500, "ninja");
[109]140        //}
[86]141
[84]142        // no limitations needed anymore: the user can set
143        // objects also on peaks of terrain
[107]144        mTerrainContentGenerator->SetMaxPos(Vector3(3000.0f, 5000.0f, 3000.0f));
[109]145
146        //-- create light
147        mSunLight = mSceneMgr->createLight("SunLight");
148        mSunLight->setType(Light::LT_SPOTLIGHT);
149    mSunLight->setPosition(1000,1250,500);
150        mSunLight->setSpotlightRange(Degree(30), Degree(50));
151
152    Vector3 dir;
153    dir = -mSunLight->getPosition();
154        dir.normalise();
155        mSunLight->setDirection(dir);
156        mSunLight->setDiffuseColour(0.35, 0.35, 0.38);
157        mSunLight->setSpecularColour(0.9, 0.9, 1);
158
159         mSunLight->setCastShadows(true);
[61]160}
161//-----------------------------------------------------------------------
[80]162void TestCullingTerrainApplication::setupGui()
[61]163{
[75]164         mGUIRenderer = new CEGUI::OgreCEGUIRenderer(mWindow, Ogre::RENDER_QUEUE_OVERLAY,
165                 false, 3000, ST_EXTERIOR_CLOSE);
[61]166     mGUISystem = new CEGUI::System(mGUIRenderer);
167
168         // Mouse
169     CEGUI::SchemeManager::getSingleton().loadScheme((CEGUI::utf8*)"TaharezLook.scheme");
170     CEGUI::MouseCursor::getSingleton().setImage("TaharezLook", "MouseArrow");
171         mGUISystem->setDefaultMouseCursor(
172                (CEGUI::utf8*)"TaharezLook", (CEGUI::utf8*)"MouseArrow");
173
[75]174         CEGUI::MouseCursor::getSingleton().show();
[61]175}
176//-----------------------------------------------------------------------
[80]177void TestCullingTerrainApplication::createFrameListener()
[61]178{
[80]179        mFrameListener= new MouseQueryListener(mWindow, mCamera, mSceneMgr,
[100]180                mGUIRenderer, mTerrainContentGenerator, mVizCamera, mCamNode);
[61]181        mFrameListener->showDebugOverlay(true);
182        mRoot->addFrameListener(mFrameListener);
183}
184//-----------------------------------------------------------------------
[80]185void TestCullingTerrainApplication::chooseSceneManager()
[61]186{
187        mSceneMgr = mRoot->getSceneManager(ST_EXTERIOR_CLOSE);
188}
189/***********************************************/
[80]190/*      MouseQueryListener implementation      */
[61]191/***********************************************/
192//-----------------------------------------------------------------------
[75]193MouseQueryListener::MouseQueryListener(RenderWindow* win, Camera* cam,
194                                                                           SceneManager *sceneManager,
[80]195                                                                           CEGUI::Renderer *renderer,
[93]196                                                                           TerrainContentGenerator *sceneGenerator,
[100]197                                                                           Camera *vizCamera,
198                                                                           SceneNode *camNode):
[86]199ExampleFrameListener(win, cam, false, true),
200mGUIRenderer(renderer),
201mShutdownRequested(false),
202mLMouseDown(false),
203mRMouseDown(false),
204mSceneMgr(sceneManager),
205mCurrentObject(NULL),
206mTerrainContentGenerator(sceneGenerator),
207mVisibilityThreshold(0),
[87]208mCurrentAlgorithm(GtpVisibility::VisibilityEnvironment::COHERENT_HIERARCHICAL_CULLING),
[93]209mShowOctree(false),
[99]210mUseVisibilityCulling(true),
[94]211mUseOptimization(true),
[100]212mVizCamera(vizCamera),
213mShowVisualization(false),
[103]214mRenderNodesForViz(false),
[100]215mVizCameraHeight(Real(2500.0)),
216mCamNode(camNode),
[104]217mCullCamera(false),
[107]218mAppState(WALKTHROUGH),
219mCurrentFrame(0),
220mRecord(false),
221mTimeElapsed(0)
[61]222{
[86]223        // Reduce move speed
[61]224        mMoveSpeed = 50;
225        mRotateSpeed *= 2;
226   
227        // Register this so that we get mouse events.
228        mEventProcessor->addMouseListener(this);
229        mEventProcessor->addMouseMotionListener(this);
230        mEventProcessor->addKeyListener(this);
231
[74]232        mRayQueryExecutor = new RayQueryExecutor(mSceneMgr);
[75]233       
[61]234        // show overlay
235        Overlay* pOver = OverlayManager::getSingleton().getByName("Example/VisibilityDemoOverlay");
236
[74]237        mAlgorithmInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/AlgorithmInfo");
238        mThresholdInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/ThresholdInfo");
[84]239       
[74]240        mFrustumCulledNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/FrustumCulledNodesInfo");
241        mQueryCulledNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/QueryCulledNodesInfo");
242    mTraversedNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/TraversedNodesInfo");
243        mHierarchyNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/HierarchyNodesInfo");
244        mRenderedNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/RenderedNodesInfo");
[87]245        mObjectsInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/ObjectsInfo");
[86]246        mUseOptimizationInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/UseOptimizationInfo");
[87]247        mQueriesIssuedInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/QueriesIssuedInfo");
248       
[61]249        mAlgorithmInfo->setCaption(": " + mCurrentAlgorithmCaptions[mCurrentAlgorithm]);
250        mThresholdInfo->setCaption(": 0");
251        mFrustumCulledNodesInfo->setCaption(": 0");
252        mQueryCulledNodesInfo->setCaption(": 0");
253        mTraversedNodesInfo->setCaption(": 0");
254        mHierarchyNodesInfo->setCaption(": 0");
255        mRenderedNodesInfo->setCaption(": 0");
[87]256        mObjectsInfo->setCaption(": 0");
[86]257        mUseOptimizationInfo->setCaption(": true");
[87]258        mQueriesIssuedInfo->setCaption(": 0");
[84]259
[85]260        setAlgorithm(mCurrentAlgorithm);
261
[93]262        mSceneMgr->setOption("UseOptimization", &mUseOptimization);
[99]263        mSceneMgr->setOption("UseVisibilityCulling", &mUseVisibilityCulling);
[93]264        mSceneMgr->setOption("ShowOctree", &mShowOctree);
[100]265        mSceneMgr->setOption("CullCamera", &mCullCamera);
[103]266        mSceneMgr->setOption("ShowVisualization", &mShowVisualization);
267        mSceneMgr->setOption("RenderNodesForViz", &mRenderNodesForViz);
268
269        pOver->show();
[61]270}
271//-----------------------------------------------------------------------
[100]272MouseQueryListener::~MouseQueryListener()
[61]273{
[74]274        delete mRayQueryExecutor;
[61]275}
276//-----------------------------------------------------------------------
[100]277void MouseQueryListener::mouseMoved(MouseEvent *e)
[61]278{
279        // Update CEGUI with the mouse motion
[100]280    CEGUI::System::getSingleton().injectMouseMove(e->getRelX() *
281                mGUIRenderer->getWidth(), e->getRelY() * mGUIRenderer->getHeight());
[61]282}
283//-----------------------------------------------------------------------
284void MouseQueryListener::mousePressed(MouseEvent* e)
285{
286     // Left mouse button down
287     if (e->getButtonID() & InputEvent::BUTTON0_MASK)
288     {
[76]289                 CEGUI::MouseCursor::getSingleton().hide();
[61]290
291                 // Setup the ray scene query
[80]292         Ray mouseRay = mCamera->getCameraToViewportRay(e->getX(), e->getY());
[74]293   
294                 Vector3 queryResult;
[80]295                 
296                 // Get results, create a node/entity on the position
[82]297                 mCurrentObject = mTerrainContentGenerator->GenerateSceneObject(
[107]298                         mouseRay.getOrigin(), Vector3(0,0,0), "robot.mesh");
[80]299               
[61]300         mLMouseDown = true;
301     }
302     // Right mouse button down
303     else if (e->getButtonID() & InputEvent::BUTTON1_MASK)
304     {
[75]305         CEGUI::MouseCursor::getSingleton().hide();
[61]306         mRMouseDown = true;
[100]307     }
[61]308} // mousePressed
[99]309//-----------------------------------------------------------------------
[61]310void MouseQueryListener::mouseReleased(MouseEvent* e)
311{
312    // Left mouse button up
313    if (e->getButtonID() & InputEvent::BUTTON0_MASK)
314    {
[75]315                CEGUI::MouseCursor::getSingleton().show();
[61]316        mLMouseDown = false;
317    }
318    // Right mouse button up
319    else if (e->getButtonID() & InputEvent::BUTTON1_MASK)
320    {
[75]321        CEGUI::MouseCursor::getSingleton().show();
[61]322        mRMouseDown = false;
323    }
324}
325//-----------------------------------------------------------------------
[75]326void MouseQueryListener::mouseDragged(MouseEvent *e)
[61]327 {
328         // If we are dragging the left mouse button.           
[75]329         if (mLMouseDown)
[61]330     {
[74]331                 Vector3 queryResult;
332                 Ray mouseRay = mCamera->getCameraToViewportRay(e->getX(), e->getY());
[61]333
[100]334                 if (mRayQueryExecutor->executeRayQuery(&queryResult, mouseRay))
[61]335                 {
[100]336                         if (mCurrentObject)
337                         {
[80]338                                 mCurrentObject->setPosition(queryResult);
[100]339                         }
[74]340                 }
[61]341     }
342         // If we are dragging the right mouse button.
[75]343         if (mRMouseDown)
[61]344         {
[100]345                 //mCamera->yaw(-e->getRelX() * mRotateSpeed);
346                 //mCamera->pitch(-e->getRelY() * mRotateSpeed);
347                 mCamNode->yaw(-e->getRelX() * mRotateSpeed);
348                 mCamNode->pitch(-e->getRelY() * mRotateSpeed);
[61]349         }
350}
351//-----------------------------------------------------------------------
[105]352bool MouseQueryListener::frameStarted(const FrameEvent &evt)
[104]353{
[107]354        switch (mAppState)
[104]355        {
[106]356        case REPLAY:
[107]357                setCurrentFrameInfo(evt.timeSinceLastFrame);
[106]358                break;
359        case WALKTHROUGH:
[107]360                if (mRecord)
361                {
362                        addFrameInfo(mCamNode, evt.timeSinceLastFrame);
363                        // print recording message
364                        mWindow->setDebugText("Recording frame " +
365                                StringConverter::toString(mFrameInfo.size() - 1));
366                }       
367       
[105]368                Clamp2Terrain();
[106]369                break;
370        default:
371                break;
[107]372        };     
[105]373       
[100]374        if (mShowVisualization)
375        {
376                // important for visualization => draw octree bounding boxes
377                mSceneMgr->setOption("ShowOctree", &mShowVisualization);
[103]378                // also render geometry?
379                mSceneMgr->setOption("RenderNodesForViz", &mRenderNodesForViz);
[100]380
381                // -- setup visualization camera
382                mVizCamera->setPosition(0, 0, 0);
383                mVizCamera->setOrientation(Quaternion::IDENTITY);
384
385                Vector3 camPos = mCamNode->getPosition();
386                mVizCamera->setPosition(camPos.x, mVizCameraHeight, camPos.z);
387
[107]388                // point down -Z axis
[100]389                mVizCamera->pitch(Radian(Degree(270.0)));
390       
[107]391                // rotation arounnd X axis
[100]392                mVizCamera->yaw(Math::ATan2(-mCamera->getDerivedDirection().x,
393                        -mCamera->getDerivedDirection().z));
[104]394               
[107]395                // move by a constant so view plane is on bottom of viewport
[104]396                mVizCamera->moveRelative(Vector3(0, 800, 0));
[100]397        }
398
[94]399        return ExampleFrameListener::frameStarted(evt);
400}
[100]401//-----------------------------------------------------------------------
[104]402void MouseQueryListener::Clamp2Terrain()
[94]403{
[61]404        // clamp to terrain
[100]405        Vector3 camPos = mCamNode->getPosition();
[74]406        Vector3 queryResult;
[61]407
[100]408        if (mRayQueryExecutor->executeRayQuery(&queryResult,
[94]409                        Vector3(camPos.x, 5000.0f, camPos.z), Vector3::NEGATIVE_UNIT_Y))
[93]410        {
[100]411                mCamNode->setPosition(camPos.x, queryResult.y + 10, camPos.z);
[93]412        }
[61]413}
414//-----------------------------------------------------------------------
415bool MouseQueryListener::frameEnded(const FrameEvent& evt)
416{
417        if (mShutdownRequested)
418                return false;
419
420    if (timeDelay >= 0)
421        timeDelay -= evt.timeSinceLastFrame;
422
[107]423        KEY_PRESSED(KC_SPACE, 0.3, nextAlgorithm());
[61]424
[86]425        KEY_PRESSED(KC_O, 0.3, toggleUseOptimization());
[103]426        KEY_PRESSED(KC_T, 0.3, toggleShowOctree());
[99]427        KEY_PRESSED(KC_C, 0.3, toggleUseVisibilityCulling());
[103]428        KEY_PRESSED(KC_1, 0.3, toggleShowViz());
429        KEY_PRESSED(KC_2, 0.3, toggleRenderNodesForViz());
[107]430       
[104]431        KEY_PRESSED(KC_SUBTRACT, 0, changeThreshold(-10));
432        KEY_PRESSED(KC_ADD, 0, changeThreshold(10));
[107]433       
[104]434        KEY_PRESSED(KC_3, 0, zoomVizCamera(50));
435        KEY_PRESSED(KC_4, 0, zoomVizCamera(-50));
[107]436
437        KEY_PRESSED(KC_F1, 0.3, nextAppState());
438        KEY_PRESSED(KC_F2, 0.3, toggleRecord());
439        KEY_PRESSED(KC_F3, 0.3, mTerrainContentGenerator->WriteObjects(objects_outfile));
440        //KEY_PRESSED(KC_F3, 0.3, writeFrames());
441        //KEY_PRESSED(KC_F4, 0.3, loadFrames());
442
[87]443        updateStats();
[61]444
[107]445        //return ExampleFrameListener::frameStarted(evt) && ExampleFrameListener::frameEnded(evt);
446        return ExampleFrameListener::frameEnded(evt);
[61]447}
[107]448//-----------------------------------------------------------------------
[100]449void MouseQueryListener::moveCamera()
450{
451        mCamNode->yaw(mRotX);
452        mCamNode->pitch(mRotY);
453        mCamNode->translate(mCamNode->getLocalAxes(), mTranslateVector);
454}
[61]455//-----------------------------------------------------------------------
[107]456void MouseQueryListener::writeFrames()
457{
458        std::ofstream ofstr(frame_outfile);
459       
460        std::vector<frame_info>::const_iterator it, it_end;
461
462        it_end = mFrameInfo.end();
463        for(it = mFrameInfo.begin(); it < it_end; ++it)
464        {
465                ofstr << StringConverter::toString((*it).position) << " "
466                        << StringConverter::toString((*it).orientation) << " "
467                        << StringConverter::toString((*it).timeElapsed) << "\n";
468        }
469        ofstr.close();
470}
471//-----------------------------------------------------------------------
472void MouseQueryListener::loadFrames()
473{
474        std::ifstream ifstr(frame_outfile);
475        char line[256];
476        frame_info info;
477
478        // reset current values
479        mFrameInfo.clear();
480        mCurrentFrame = 0;
481       
482        while (!ifstr.eof())
483        {
484                ifstr.getline(line, 256);
485                sscanf(line, "%f %f %f %f %f %f %f %f", &info.position.x, &info.position.y, &info.position.z,
486                                &info.orientation.w, &info.orientation.x, &info.orientation.y, &info.orientation.z,
487                                &info.timeElapsed);
488               
489                mFrameInfo.push_back(info);
490               
491                /*
492                std::stringstream d;
493                d << StringConverter::toString(info.position) << " " << StringConverter::toString(info.orientation);
494                LogManager::getSingleton().logMessage(d.str());
495                */
496        }
497        ifstr.close();
498}
499//-----------------------------------------------------------------------
500void MouseQueryListener::setAppState(int state)
501{
502        mAppState = state;
503}
504//-----------------------------------------------------------------------
505void MouseQueryListener::nextAppState()
506{
507        mCurrentFrame = 0;
508
509        // if last state was replay state
510        if (mAppState == REPLAY)
511        {
512                // reset debug text and write frame info to file
513                mWindow->setDebugText("");
514                writeFrames();
515               
516                //-- write out stats
517                std::stringstream d;
518                d << "Algorithm: " << mCurrentAlgorithmCaptions[mCurrentAlgorithm] << "\n"
519                  << "avg. FPS: " << mWindow->getAverageFPS() << "\n"
520                  << "best FPS: " << mWindow->getBestFPS() << "\n"
521                  << "worst FPS: " << mWindow->getWorstFPS() << "\n"
522                  << "best frame time: " <<     mWindow->getBestFrameTime() << "\n"
523                  << "worst frame time: " << mWindow->getWorstFrameTime();
524               
525                LogManager::getSingleton().logMessage(d.str());
526        }
527       
528        //-- set the next státe
529        mAppState = (mAppState + 1) % STATE_NUM;
530
531        // replay recorded walkthrough
532        if (mAppState == REPLAY)
533        {
534                // no recording during replay
535                mRecord = false;
536
537                // load recorded walkthrough
538                if (mFrameInfo.size() == 0)
539                {
540                        loadFrames();
541                }
542
543                // if there are no recorded frames => set next state
544                if (mFrameInfo.size() == 0)
545                {
546                        nextAppState();
547                }
548                else
549                {
550                        mWindow->setDebugText("Replay");
551                       
552                        // reset, because we measure fps stats during walkthrough
553                        mWindow->resetStatistics();
554
555                        //-- initialise frame data
556                        mTimeElapsed = 0;
557
558                        mCamNode->setPosition(mFrameInfo[0].position);
559                        mCamNode->setOrientation(mFrameInfo[0].orientation);
560                }
561        }
562
563}
564//-----------------------------------------------------------------------
565void MouseQueryListener::toggleRecord()
566{
567        mRecord = !mRecord;
568
569        // clear previous camera path
570        if (mRecord)
571                mFrameInfo.clear();
572        else
573                mWindow->setDebugText("");
574}
575//-----------------------------------------------------------------------
[61]576void MouseQueryListener::changeThreshold(int incr)
577{
[85]578        mVisibilityThreshold += incr;
579        if(mVisibilityThreshold < 0) mVisibilityThreshold = 0;
[61]580       
[85]581        char str[100]; sprintf(str,": %d", mVisibilityThreshold);
[61]582
[85]583        mSceneMgr->setOption("Threshold", &mVisibilityThreshold);
[61]584        mThresholdInfo->setCaption(str);
585}
586//-----------------------------------------------------------------------
[100]587bool MouseQueryListener::processUnbufferedKeyInput(const FrameEvent& evt)
588{   
589        if (mInputDevice->isKeyDown(KC_RIGHT))
590        {
591                mCamNode->yaw(-mRotScale);
592                return true;
593        }
594        if (mInputDevice->isKeyDown(KC_LEFT))
595        {
596                mCamNode->yaw(mRotScale);
597                return true;
598        }
599
600        return ExampleFrameListener::processUnbufferedKeyInput(evt);
601}
602//-----------------------------------------------------------------------
603void MouseQueryListener::zoomVizCamera(int zoom)
604{
605        mVizCameraHeight += zoom;
606        if(mVizCameraHeight < 0) mVizCameraHeight = 0;
607}
608//-----------------------------------------------------------------------
[85]609void MouseQueryListener::nextAlgorithm()
[61]610{
[107]611        mCurrentAlgorithm = (mCurrentAlgorithm + 1) %
[74]612                GtpVisibility::VisibilityEnvironment::NUM_CULLING_MANAGERS,
[61]613
[85]614        setAlgorithm(mCurrentAlgorithm);
615}
616//-----------------------------------------------------------------------
617void MouseQueryListener::setAlgorithm(int algorithm)
618{
[61]619        mAlgorithmInfo->setCaption(": " + mCurrentAlgorithmCaptions[mCurrentAlgorithm]);
620        mSceneMgr->setOption("Algorithm", &mCurrentAlgorithm);
621}
622//-----------------------------------------------------------------------
[87]623void MouseQueryListener::updateStats()
[61]624{
625        unsigned int opt = 0;
626        char str[100];
627       
628        mSceneMgr->getOption("NumFrustumCulledNodes", &opt); sprintf(str,": %d", opt);
629        mFrustumCulledNodesInfo->setCaption(str);
630       
[87]631        mSceneMgr->getOption("NumQueriesIssued", &opt); sprintf(str,": %d", opt);
632        mQueriesIssuedInfo->setCaption(str);
633       
[61]634        mSceneMgr->getOption("NumQueryCulledNodes", &opt); sprintf(str,": %d", opt);
635        mQueryCulledNodesInfo->setCaption(str);
636       
637        mSceneMgr->getOption("NumTraversedNodes", &opt); sprintf(str,": %d", opt);
638        mTraversedNodesInfo->setCaption(str);
639
[74]640        mSceneMgr->getOption("NumHierarchyNodes", &opt); sprintf(str,": %d", opt);
[61]641        mHierarchyNodesInfo->setCaption(str);
642
643        mSceneMgr->getOption("NumRenderedNodes", &opt); sprintf(str,": %d", opt);
644        mRenderedNodesInfo->setCaption(str);
[84]645
646        sprintf(str,": %d", mTerrainContentGenerator->GetObjectCount());
[87]647        mObjectsInfo->setCaption(str);
[61]648}
649//-----------------------------------------------------------------------
[86]650void MouseQueryListener::toggleUseOptimization()
651{
652        mUseOptimization = !mUseOptimization;
653
654        mSceneMgr->setOption("UseOptimization", &mUseOptimization);
655
[100]656        if (mUseOptimization)
[86]657                mUseOptimizationInfo->setCaption(": true");
658        else
659                mUseOptimizationInfo->setCaption(": false");
660}
661//-----------------------------------------------------------------------
662void MouseQueryListener::toggleShowOctree()
663{
664        mShowOctree = !mShowOctree;
665
666        mSceneMgr->setOption("ShowOctree", &mShowOctree);
667}
668//-----------------------------------------------------------------------
[99]669void MouseQueryListener::toggleUseVisibilityCulling()
[87]670{
[99]671        mUseVisibilityCulling = !mUseVisibilityCulling;
[87]672
[99]673        mSceneMgr->setOption("UseVisibilityCulling", &mUseVisibilityCulling);
[87]674}
675//-----------------------------------------------------------------------
[99]676void MouseQueryListener::toggleShowViz()
[93]677{
[99]678        mShowVisualization = !mShowVisualization;
[94]679
[100]680        // create viewport with priority VIZ_VIEWPORT_Z_ORDER:
681        // will be rendered over standard viewport
682        if (mShowVisualization)
[94]683        {       
[100]684                Viewport *vizvp = mWindow->addViewport(mVizCamera,
[103]685                        VIZ_VIEWPORT_Z_ORDER, 0.6, 0.6, 0.4, 0.4);
[100]686                               
687                vizvp->setBackgroundColour(ColourValue(0.0, 0.3, 0.2, 1));
688
689                vizvp->setOverlaysEnabled(false);
690                // Alter the camera aspect ratio to match the viewport
691        mVizCamera->setAspectRatio(Real(vizvp->getActualWidth()) /
692                        Real(vizvp->getActualHeight()));
693                //vizvp->setClearEveryFrame(false);
694
[104]695                // Create a skyplane (for visualization background)
696                /*
697                Plane plane;
698                plane.d = -1000;
[100]699                plane.normal = Vector3::UNIT_Y;
[104]700                mSceneMgr->setSkyPlane(true, plane, "Examples/TransparentTest", 4000, 75, false);
[103]701                */
[104]702               
[94]703        }
704        else
[99]705        {
[100]706                mWindow->removeViewport(VIZ_VIEWPORT_Z_ORDER);
707                // if octree was enabled for visualization purpose
708                mSceneMgr->setOption("ShowOctree", &mShowOctree);
[99]709        }
[93]710}
711//-----------------------------------------------------------------------
[103]712void MouseQueryListener::toggleRenderNodesForViz()
713{
714        mRenderNodesForViz = !mRenderNodesForViz;
715
716        mSceneMgr->setOption("RenderNodesForViz", &mRenderNodesForViz);
717}
718//-----------------------------------------------------------------------
[61]719void MouseQueryListener::keyPressed(KeyEvent* e)
720{
721        if(e->getKey() == KC_ESCAPE)
722    {
723                mShutdownRequested = true;
724                e->consume();
725                return;
726        }
727
728        CEGUI::System::getSingleton().injectKeyDown(e->getKey());
729        CEGUI::System::getSingleton().injectChar(e->getKeyChar());
730        e->consume();
731}
732//-----------------------------------------------------------------------
733void MouseQueryListener::keyReleased(KeyEvent* e)
734{
735        CEGUI::System::getSingleton().injectKeyUp(e->getKey());
736        e->consume();
737}
738//-----------------------------------------------------------------------
739void MouseQueryListener::keyClicked(KeyEvent* e)
740{
741        // Do nothing
742        e->consume();
743}
[106]744//-----------------------------------------------------------------------
[107]745void MouseQueryListener::addFrameInfo(SceneNode *camNode, Real timeElapsed)
[106]746{
747        frame_info info;
748        info.orientation = mCamNode->getOrientation();
749        info.position = mCamNode->getPosition();
[107]750        info.timeElapsed = timeElapsed;
751
752        mFrameInfo.push_back(info);
[106]753}
754//-----------------------------------------------------------------------
[107]755void MouseQueryListener::setCurrentFrameInfo(Real timeElapsed)
[106]756{
[108]757        //-- find current frame relative to elapsed frame time         
[107]758        mTimeElapsed -= timeElapsed;
759
760        while ((mTimeElapsed <= 0) && (mCurrentFrame < (int)mFrameInfo.size() - 1))
761        {
762                mTimeElapsed += mFrameInfo[mCurrentFrame ++].timeElapsed;
763        }
764
765        frame_info new_frame = mFrameInfo[mCurrentFrame];
766        frame_info old_frame = mFrameInfo[mCurrentFrame - 1];
767               
768        //-- interpolate frames
769        Real factor = 1;
770
771        if (old_frame.timeElapsed > 0)
772                factor = mTimeElapsed / old_frame.timeElapsed;
773
774        Vector3 camPos = old_frame.position + factor * (new_frame.position - old_frame.position);
775        Quaternion camOrienation = Quaternion::Slerp(factor, old_frame.orientation,
776                new_frame.orientation, true);
777
778        mCamNode->setPosition(camPos);
779        mCamNode->setOrientation(camOrienation);
[108]780       
[107]781        // stop replay after a full walkthrough
782        if (mCurrentFrame == (int)mFrameInfo.size() - 1)
783        {
784                nextAppState();
785        }
[106]786}
787
[99]788/**************************************************************/
789/*      VisualizationRenderTargetListener implementation      */
790/**************************************************************/
[107]791//-----------------------------------------------------------------------
[99]792VisualizationRenderTargetListener::VisualizationRenderTargetListener(SceneManager *sceneMgr)
793:RenderTargetListener(), mSceneMgr(sceneMgr)
794{
795}
[61]796//-----------------------------------------------------------------------
[99]797void VisualizationRenderTargetListener::preViewportUpdate(const RenderTargetViewportEvent &evt)
798{
[100]799        const bool showViz = evt.source->getZOrder() == VIZ_VIEWPORT_Z_ORDER; // visualization viewport
800        const bool nShowViz = !showViz;
801
802    mSceneMgr->setOption("ShowVisualization", &showViz);
803        mSceneMgr->setOption("SkyBoxEnabled", &nShowViz);
804        //mSceneMgr->setOption("SkyPlaneEnabled", &showViz);
[99]805       
806        RenderTargetListener::preViewportUpdate(evt);
807}
808//-----------------------------------------------------------------------
809void VisualizationRenderTargetListener::postRenderTargetUpdate(const RenderTargetEvent &evt)
810{
811        RenderTargetListener::postRenderTargetUpdate(evt);
812}
813//-----------------------------------------------------------------------
[61]814INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
815{
816    // Create application object
817    TestCullingTerrainApplication app;
818
819        try
820        {
821        app.go();
822    }
823        catch( Ogre::Exception& e )
824        {
[75]825        MessageBox( NULL, e.getFullDescription().c_str(),
826                        "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
[61]827    }   
828
829    return 0;
830}
Note: See TracBrowser for help on using the repository browser.