source: GTP/trunk/App/Demos/Vis/HillyTerrain/OGRE/TerrainFrameListener.cpp @ 1268

Revision 1268, 54.2 KB checked in by mattausch, 18 years ago (diff)
RevLine 
[115]1#include <OgreNoMemoryMacros.h>
2#include <CEGUI/CEGUI.h>
3#include <../CEGUIRenderer/include/OgreCEGUIRenderer.h>
4#include <../CEGUIRenderer/include/OgreCEGUIResourceProvider.h>
5#include <../CEGUIRenderer/include/OgreCEGUITexture.h>
6#include <OgreMemoryMacros.h>
[133]7#include "TerrainFrameListener.h"
[130]8#include "OgrePlatformQueryManager.h"
9#include "VisibilityInfo.h"
[154]10#include "OgreOcclusionQueriesQueryManager.h"
[160]11#include "TestCullingTerrainApplication.h"
[723]12#include <string>
[154]13
[173]14//-- captions for overlays
15String TerrainFrameListener::msAlgorithmCaptions[] =
[115]16{
[175]17        "Coherent Hierarchical Culling",
[135]18        "View Frustum Culling",
[175]19        "Stop and Wait Culling"
[115]20};
21
[723]22//-- captions for overlays
23String TerrainFrameListener::msApprevAlgorithmCaptions[] =
24{
25        "CHC",
26        "VFC",
27        "SWC"
28};
29
30
[173]31String TerrainFrameListener::msQueryTypeCaptions[] =
[135]32{
[154]33        "from camera",
34        "from viewpoint"
[135]35};
[115]36
[173]37String TerrainFrameListener::msQueryRelativeVisCaptions[] =
[154]38{
39        "visible pixels",
40        "relative visibility"
41};
42
[173]43String TerrainFrameListener::msQueryMethodCaptions[] =
[154]44{
45        "occlusion queries",
46        "item buffer"
47};
48
[173]49Real TerrainFrameListener::msObjectTerrainOffsets[] =
[160]50{
51        0,
[183]52        -0.1,
[175]53        //7,
[160]54        0
55};
[173]56
57Real TerrainFrameListener::msObjectScales[] =
[160]58{
[345]59        0.07,
[175]60        0.03,
61        //0.1,
[346]62        0.03
[160]63};
[161]64
[173]65String TerrainFrameListener::msObjectCaptions[] =
66{
67        "robot",
[679]68        "athene",
[937]69        "natFX_Tree1_LOD2",
[173]70        //"tree2",
71        //"HongKong_Tower",
72        "ninja"
73        //"ogrehead"
74};
75
76// output file for frame info
77const char* frames_out_filename = "frame.out";
78// output file for object positions / orientations
79const char* objects_out_filename = "objects.out";
[254]80       
81std::ofstream video_out("video.lst");
[173]82
[924]83// if we are recording a demo
84static const bool DEMO_HACK = false;
85
[115]86//-----------------------------------------------------------------------
[133]87TerrainFrameListener::TerrainFrameListener(RenderWindow* win, Camera* cam,
[115]88                                                                           SceneManager *sceneManager,
89                                                                           CEGUI::Renderer *renderer,
90                                                                           TerrainContentGenerator *sceneGenerator,
91                                                                           Camera *vizCamera,
[121]92                                                                           SceneNode *camNode,
[160]93                                                                           Light *sunLight,
94                                                                           TestCullingTerrainApplication *app):
[115]95mCamera(cam),
96mWindow(win),
97mNumScreenShots(0),
[120]98mTimeDelay(0),
[115]99mSceneDetailIndex(0),
100mMoveScale(0.0f),
101mRotScale(0.0f),
102mTranslateVector(Vector3::ZERO),
103mAniso(1),
104mFiltering(TFO_BILINEAR),
105mGUIRenderer(renderer),
106mSceneMgr(sceneManager),
107mCurrentObject(NULL),
108mTerrainContentGenerator(sceneGenerator),
109mVisibilityThreshold(0),
[146]110mAssumedVisibility(0),
[867]111#if 1
[130]112mCurrentAlgorithm(GtpVisibility::VisibilityEnvironment::COHERENT_HIERARCHICAL_CULLING),
[723]113#else
114mCurrentAlgorithm(GtpVisibility::VisibilityEnvironment::FRUSTUM_CULLING),
[924]115//mCurrentAlgorithm(GtpVisibility::VisibilityEnvironment::STOP_AND_WAIT_CULLING),
[723]116#endif
[115]117mNodeVizMode(NODEVIZ_NONE),
[723]118mVizCameraHeight(Real(4000.0)),
[115]119mCamNode(camNode),
120mAppState(WALKTHROUGH),
121mCurrentFrame(0),
[160]122mReplayTimeElapsed(0),
[115]123mRotateSpeed(72),
[120]124mMoveSpeed(50),
125mVizCamera(vizCamera),
126mStatsOn(true),
127mShutdownRequested(false),
128mLMouseDown(false),
129mRMouseDown(false),
130mShowOctree(false),
131mUseDepthPass(false),
[175]132mTestGeometryForVisibleLeaves(false),
[120]133mShowVisualization(false),
134mCullCamera(false),
[254]135mRecordFrames(false),
[139]136mShowShadows(false),
[120]137mShowHelp(false),
138mDisplayCameraDetails(false),
[121]139mVisualizeCulledNodes(false),
[133]140mSunLight(sunLight),
[135]141mShiftPressed(false),
[151]142mShowQueryStats(false),
143mQueryManager(NULL),
[155]144mVisibilityManager(NULL),
145mDelayedQueriesIssued(0.0),
[159]146mDelayedTraversedNodes(0.0),
[160]147mCurrentObjectType(0),
[161]148mApplication(app),
[164]149mUseAnimation(false),
[174]150mDeleteObjects(false),
151mUseItemBuffer(false),
[254]152mItemBufferMode(GtpVisibility::QueryManager::PATCH_VISIBILITY),
153mRecordVideo(false),
154mPureRenderTimeFps(0.0),
155mNumVideoFrames(0),
[723]156mPrecomputedFps(0),
157mRecordDemo(false),
158mSavePrecomputedFps(false),
159mUseBufferedInputMouse(false),
[901]160mVizScale(25),
161mUseViewCells(false),
[937]162mViewCellsLoaded(false),
[901]163mUseVisibilityFilter(false)
[115]164{
[130]165        //mInputDevice = PlatformManager::getSingleton().createInputReader();
166        //mInputDevice->initialise(win, true, true);
[135]167
[130]168        mEventProcessor = new EventProcessor();
169       
170        mEventProcessor->initialise(win);
171        mEventProcessor->startProcessingEvents();
[120]172        mEventProcessor->addMouseListener(this);
[115]173        mEventProcessor->addMouseMotionListener(this);
[133]174        mEventProcessor->addKeyListener(this);
[115]175
[160]176        mInputDevice = mEventProcessor->getInputReader();       
[130]177
[417]178        mInputDevice->setBufferedInput(true, mUseBufferedInputMouse);
179
[115]180        // create ray query executor, used to place objects in terrain
181        mRayQueryExecutor = new RayQueryExecutor(mSceneMgr);
182       
[160]183        //-- overlays
[723]184       
[160]185        mDebugOverlay = OverlayManager::getSingleton().getByName("Core/DebugOverlay");
[120]186        mHelpOverlay = OverlayManager::getSingleton().getByName("Example/Visibility/HelpOverlay");
[135]187        mQueryOverlay = OverlayManager::getSingleton().getByName("Example/Visibility/QueryOverlay");
[160]188        mCullStatsOverlay = OverlayManager::getSingleton().getByName("Example/Visibility/CullStatsOverlay");
[115]189
[723]190        String ext = "Example/Visibility/";
[146]191
[723]192        //-- overlays
[932]193   
[924]194        initVisStatsOverlay(); // visibility stats overlay
195        initHelpOverlay();     // help overlay
196        initQueryOverlay();    // visibility query stats overlay
197       
198        // show stats overlays
199        if (!DEMO_HACK)
[932]200        {
[724]201                showStats(true);
[932]202        }
[924]203        else
[932]204        {
205                mMyStatsOverlay = OverlayManager::getSingleton().getByName("Example/Visibility/MyStatsOverlay");
206                mMyStatsAlgorithmInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/MyAlgorithmInfo");
207                mMyStatsAlgorithmInfo->setCaption("");
208       
209                const int top = 10;
210                mMyStatsAlgorithmInfo->setTop(top);
211
212                char str[100]; sprintf(str,": %d", 0);
213                mMyStatsFpsInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/MyFpsInfo");
214                mMyStatsFpsInfo->setCaption(str);
215
[924]216                mMyStatsOverlay->show();
[932]217        }
[723]218
[945]219        // loading overlay
220
221        mLoadingOverlay = OverlayManager::getSingleton().getByName("Example/Visibility/LoadingOverlay");
222        mMyLoadingInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/Loading/MyLoadingInfo");
223        mMyLoadingInfo->setCaption("loading view cells ...");
224       
225        /*const int top = 10;
226                mMyStatsAlgorithmInfo->setTop(top);
227
228                char str[100]; sprintf(str,": %d", 0);
229                mMyStatsFpsInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/MyFpsInfo");
230                mMyStatsFpsInfo->setCaption(str);*/
231
232        mLoadingOverlay->hide();
233
[901]234        // note: larger magnification for terrain to show single objects
[866]235        if (TestCullingTerrainApplication::msShowHillyTerrain)
236                mVizScale = 25;
237        else
238                mVizScale = 1;
239
[723]240        // the scale factor for the visualized bounding boxes
241        mSceneMgr->setOption("NodeVizScale", &mVizScale);
[924]242               
243        //-- set culling algorithm type
[115]244        setAlgorithm(mCurrentAlgorithm);
245
246        // set scene manager options
[187]247        setTestGeometryForVisibleLeaves(mTestGeometryForVisibleLeaves);
[120]248
[115]249        mSceneMgr->setOption("UseDepthPass", &mUseDepthPass);
[120]250       
[115]251        mSceneMgr->setOption("ShowOctree", &mShowOctree);
252        mSceneMgr->setOption("CullCamera", &mCullCamera);
[139]253        mSceneMgr->setOption("PrepareVisualization", &mShowVisualization);
[723]254       
[160]255        setObjectType(mCurrentObjectType);
256
[254]257        // initialise timer
258        mTimer = Root::getSingleton().getTimer();
259        mTimeFrameEnded = mTimeFrameStarted = mTimer->getMilliseconds();
260       
[924]261        if (0 && (mSceneMgr->getSceneNode("robot Entity1Node")->
262                getAttachedObject(0)->getMovableType() == "Entity"))
[867]263                Ogre::LogManager::getSingleton().logMessage("found entity");
[924]264
265        // init view cell parameters
[901]266        mSceneMgr->setOption("UseViewCells", &mUseViewCells);
267        mSceneMgr->setOption("UseVisibilityFilter", &mUseVisibilityFilter);
268
[147]269        // reset statistics
[259]270        mWalkthroughStats.Reset();
[924]271
[723]272}
[115]273//-----------------------------------------------------------------------
[723]274void TerrainFrameListener::switchMouseMode()
275{
276        mUseBufferedInputMouse = !mUseBufferedInputMouse;
277        mInputDevice->setBufferedInput(true, mUseBufferedInputMouse);
278
279        if (!mUseBufferedInputMouse)
280                CEGUI::MouseCursor::getSingleton().hide();
281        else
282                CEGUI::MouseCursor::getSingleton().show();
283}
284//-----------------------------------------------------------------------
[133]285TerrainFrameListener::~TerrainFrameListener()
[115]286{
[187]287        OGRE_DELETE(mRayQueryExecutor);
288        OGRE_DELETE(mEventProcessor);
289        OGRE_DELETE(mQueryManager);
[115]290}
291//-----------------------------------------------------------------------
[133]292void TerrainFrameListener::mouseMoved(MouseEvent *e)
[115]293{
294        // Update CEGUI with the mouse motion
295    CEGUI::System::getSingleton().injectMouseMove(e->getRelX() *
296                mGUIRenderer->getWidth(), e->getRelY() * mGUIRenderer->getHeight());
297}
298//-----------------------------------------------------------------------
[133]299void TerrainFrameListener::mousePressed(MouseEvent* e)
[115]300{
[417]301        // Left mouse button down
302        if (e->getButtonID() & InputEvent::BUTTON0_MASK)
303        {
304                CEGUI::MouseCursor::getSingleton().hide();
[115]305
[417]306                // Setup the ray scene query
307                Ray mouseRay = mCamera->getCameraToViewportRay(e->getX(), e->getY());
[115]308                 
[417]309                //Vector3 queryResult; mRayQueryExecutor->executeRayQuery(&queryResult, mouseRay);
310                Real val = Math::RangeRandom(0, 360); // random rotation
[164]311
[417]312                // get results, create a node/entity on the position
[418]313                mCurrentObject =
314                        mTerrainContentGenerator->GenerateSceneObject(mouseRay.getOrigin(),
315                                                                                                                  Vector3(val, 0, 0),
316                                                                                                                  msObjectCaptions[mCurrentObjectType]);
[115]317               
[417]318                mLMouseDown = true;
319        }
320        // Right mouse button down
321        /*else if (e->getButtonID() & InputEvent::BUTTON1_MASK)
322        {
[115]323         CEGUI::MouseCursor::getSingleton().hide();
324         mRMouseDown = true;
[417]325        }*/
[161]326}
[115]327//-----------------------------------------------------------------------
[161]328void TerrainFrameListener::mouseDragDropped(MouseEvent* e)
329{
330        // Left mouse button up
331    if (e->getButtonID() & InputEvent::BUTTON0_MASK)
332    {
333                CEGUI::MouseCursor::getSingleton().show();
334               
335            mLMouseDown = false;
336    }
337    // Right mouse button up
338    else if (e->getButtonID() & InputEvent::BUTTON1_MASK)
339    {
340        CEGUI::MouseCursor::getSingleton().show();
341
342                mRMouseDown = false;
343    }
344}
345//-----------------------------------------------------------------------
[133]346void TerrainFrameListener::mouseReleased(MouseEvent* e)
[115]347{
348    // Left mouse button up
349    if (e->getButtonID() & InputEvent::BUTTON0_MASK)
350    {
351                CEGUI::MouseCursor::getSingleton().show();
[161]352               
353                // start animation: only robot has animation phases
354                if (mCurrentObject && (mCurrentObjectType == TestCullingTerrainApplication::ROBOT))
355                {
356                        // HACK: not neccesary the last element
357                        Entity *ent = mTerrainContentGenerator->GetGeneratedEntities()->back();
358                        EntityState *entState = new EntityState(ent, EntityState::MOVING, Math::RangeRandom(0.5, 1.5));
359                        mApplication->getEntityStates().push_back(entState);
360                }
361
362            mLMouseDown = false;
[115]363    }
364    // Right mouse button up
365    else if (e->getButtonID() & InputEvent::BUTTON1_MASK)
366    {
[161]367        CEGUI::MouseCursor::getSingleton().show();
368
[115]369        mRMouseDown = false;
370    }
371}
372//-----------------------------------------------------------------------
[133]373void TerrainFrameListener::mouseDragged(MouseEvent *e)
[417]374{
375        // If we are dragging the left mouse button.             
376        if (mLMouseDown)
377    {
378                if (!mCurrentObject)
379                        return;
[161]380
[417]381                Vector3 queryResult;
382                Ray mouseRay = mCamera->getCameraToViewportRay(e->getX(), e->getY());
[115]383
[417]384                if (mRayQueryExecutor->executeRayQuery(&queryResult, mouseRay))
385                {
386                        // apply offset so object is ON terrain
387                        queryResult.y += msObjectTerrainOffsets[mCurrentObjectType];
388                        mCurrentObject->setPosition(queryResult);
389                }
390        }
[115]391}
392//-----------------------------------------------------------------------
[133]393bool TerrainFrameListener::frameStarted(const FrameEvent &evt)
[115]394{
395        if (mWindow->isClosed())
[130]396        {
[115]397        return false;
[130]398        }
[161]399       
[164]400        if (mDeleteObjects)
401        {
402                mApplication->deleteEntityStates();
403                mTerrainContentGenerator->RemoveGeneratedObjects();
404                mDeleteObjects = false;
405        }
406
[161]407        if (mUseAnimation) // update animations
408        {
409                mApplication->updateAnimations(evt.timeSinceLastFrame);
410        }
[115]411
[161]412        if (mDisplayCameraDetails)  // Print camera details
413    {       
[139]414        mWindow->setDebugText("P: " + StringConverter::toString(mCamera->getDerivedPosition()) +
415                        " " + "O: " + StringConverter::toString(mCamera->getDerivedOrientation()));
416    }
[122]417
[130]418        //-- setup what is needed for immediate mouse/key movement
419        if (mTimeDelay >= 0)
420        {
421                mTimeDelay -= evt.timeSinceLastFrame;
422        }
[160]423       
[130]424        // If this is the first frame, pick a speed
425        if (evt.timeSinceLastFrame == 0)
426        {
427                mMoveScale = 1;
428                mRotScale = 0.1;
429        }
430        // Otherwise scale movement units by time passed since last frame
431        else
432        {
433                // Move about 100 units per second,
434                mMoveScale = mMoveSpeed * evt.timeSinceLastFrame;
435                // Take about 10 seconds for full rotation
436                mRotScale = mRotateSpeed * evt.timeSinceLastFrame;
437        }
[115]438
[130]439        mRotX = 0;
440        mRotY = 0;
441        mTranslateVector = Vector3::ZERO;
[115]442
[130]443        if (!processUnbufferedKeyInput(evt))
444        {
445                return false;
446        }
[417]447        if (!mUseBufferedInputMouse)
448        {
449                if (!processUnbufferedMouseInput(evt))
450                {       
451                        return false;   
452                }
453        }
[133]454
[254]455        //-- set parameters for visualization
[130]456        if (mShowVisualization)
457        {
[115]458                // important for visualization => draw octree bounding boxes
459                mSceneMgr->setOption("ShowOctree", &mShowVisualization);
[130]460               
[254]461                //-- setup visualization camera
[115]462
463                mVizCamera->setPosition(0, 0, 0);
464                mVizCamera->setOrientation(Quaternion::IDENTITY);
465
466                Vector3 camPos = mCamNode->getPosition();
467                mVizCamera->setPosition(camPos.x, mVizCameraHeight, camPos.z);
468
469                // point down -Z axis
470                mVizCamera->pitch(Radian(Degree(270.0)));
[130]471
[115]472                // rotation arounnd X axis
473                mVizCamera->yaw(Math::ATan2(-mCamera->getDerivedDirection().x,
474                        -mCamera->getDerivedDirection().z));
475               
476                // move by a constant so view plane is on bottom of viewport
477                mVizCamera->moveRelative(Vector3(0, 800, 0));
478        }
[254]479        else
480        {
481                // frame start time
482                mTimeFrameStarted = mTimer->getMilliseconds();
483                //Ogre::LogManager::getSingleton().logMessage("Frame started");
484        }
[115]485
[130]486        //-- set application state
[115]487        switch (mAppState)
488        {
489        case REPLAY:
[254]490                /// set the current camera data to loaded frame information
[115]491                setCurrentFrameInfo(evt.timeSinceLastFrame);
[723]492
493                // HACK for demo: save new frame rates for different methods on the
494                // same walkthrough
495                if (mSavePrecomputedFps)
496                {
497                        addFrameInfo(mPrecomputedFpsFrameInfo, mCamNode, evt.timeSinceLastFrame);
498                }
499
[115]500                break;
501        case WALKTHROUGH:
[254]502                //-- recording the camera settings per frame
503                if (mRecordFrames)
[115]504                {
[254]505                        addFrameInfo(mFrameInfo, mCamNode, evt.timeSinceLastFrame);
[115]506                        // print recording message
507                        mWindow->setDebugText("Recording frame " +
[723]508                                StringConverter::toString((int)mFrameInfo.size() - 1));
[115]509                }       
[133]510                // move camera according to input
[130]511                moveCamera();
[161]512
[133]513                // clamp camera so we always walk along the terrain
[866]514                if (TestCullingTerrainApplication::msShowHillyTerrain)
515                {
516                        mApplication->Clamp2Terrain(mCamNode, 5);
517                }
518                else
519                {
520                        mApplication->Clamp2FloorPlane();
521                }
522
[133]523                break;
[130]524
[115]525        default:
526                break;
527        };     
[130]528
[115]529        return true;
530}
531//-----------------------------------------------------------------------
[673]532void TerrainFrameListener::applyVisibilityQuery(bool fromPoint,
533                                                                                                bool relativeVisibility,
[154]534                                                                                                bool useItemBuffer)
[130]535{
[174]536        int itemBufferMode = useItemBuffer ? mItemBufferMode : 0;
537       
[175]538        int queryModes = 0;
539        queryModes |= GtpVisibility::QueryManager::PATCH_VISIBILITY;
[174]540        queryModes |= GtpVisibility::QueryManager::GEOMETRY_VISIBILITY;
541        queryModes |= GtpVisibility::QueryManager::NODE_VISIBILITY;
[924]542
543        // no visibility manager available => no visibility scene manager, return
[932]544        GtpVisibility::VisibilityManager *visManager = NULL;
[175]545       
[924]546        if (!mSceneMgr->getOption("VisibilityManager", visManager))
547                return;
548
[932]549        GtpVisibility::HierarchyInterface *hierarchyInterface = NULL;
[924]550        if (!mSceneMgr->getOption("HierarchyInterface", hierarchyInterface))
551                return;
552
553        mQueryManager = new OcclusionQueriesQueryManager(hierarchyInterface,
[175]554                        mWindow->getViewport(0), queryModes, itemBufferMode);
[174]555
[171]556        //mQueryManager = new PlatformQueryManager(sm->GetHierarchyInterface(), mWindow->getViewport(0), false);
[151]557
[924]558
559        visManager->SetQueryManager(mQueryManager);
560
[316]561        GtpVisibility::NodeInfoContainer visibleNodes;
562        GtpVisibility::MeshInfoContainer visibleGeometry;
563        GtpVisibility::PatchInfoContainer visiblePatches;
[130]564
[171]565
[133]566        if (fromPoint)
567        {
[1238]568                mQueryManager->
[140]569                        ComputeFromPointVisibility(mCamNode->getPosition(), &visibleNodes,
[159]570                                                                           &visibleGeometry, &visiblePatches, relativeVisibility);
[133]571        }
572        else
573        {
[151]574                mQueryManager->ComputeCameraVisibility(*mCamera,
[159]575                            &visibleNodes, &visibleGeometry, &visiblePatches, relativeVisibility);
[133]576        }
[171]577               
578        std::stringstream d;
[175]579        d << "Query mode: " << queryModes << ", "
580          << msQueryTypeCaptions[fromPoint ?  1 : 0].c_str() << " "
[173]581          << msQueryRelativeVisCaptions[relativeVisibility ? 1 : 0].c_str() << " "
582      << msQueryMethodCaptions[useItemBuffer ? 1 : 0].c_str();
[171]583        LogManager::getSingleton().logMessage(d.str());
[130]584
[171]585
[159]586        float averageNodeVis = 0, averageGeometryVis = 0, averagePatchVis = 0;
587        int geomSize = 0, nodesSize = 0, patchSize = 0;
[135]588
[924]589        ///////////////////////////////////////////////////////////////////////////
590        //-- apply queries on geometry level
591
[316]592        GtpVisibility::MeshInfoContainer::iterator geomIt, geomIt_end = visibleGeometry.end();
[141]593
594        for (geomIt = visibleGeometry.begin(); geomIt != geomIt_end; ++geomIt)
[130]595        {
[151]596                // add if not 0
597                if ((*geomIt).GetVisiblePixels())
598                {
599                        float vis = relativeVisibility ?
600                                (*geomIt).ComputeRelativeVisibility() : (float)(*geomIt).GetVisiblePixels();
601       
602                        averageGeometryVis += vis;
[171]603                        ++ geomSize;
[151]604                       
[171]605                        std::stringstream d;
[316]606                        d << "Geometry " << geomSize << " id: " << (*geomIt).GetSource()->getSubEntity(0)->getId()
[171]607                          << " visibility: "  << (*geomIt).GetVisiblePixels() << ", " << (*geomIt).GetProjectedPixels();
[151]608                        LogManager::getSingleton().logMessage(d.str());
609                }
[130]610        }
[141]611
[924]612
613
614        ///////////////////////////////////////////////////////////////////////////
615        //-- apply queries on node level
616
617
[316]618        GtpVisibility::NodeInfoContainer::iterator nodesIt, nodesIt_end = visibleNodes.end();
[141]619
620        for (nodesIt = visibleNodes.begin(); nodesIt != nodesIt_end; ++nodesIt)
[130]621        {
[151]622                // add if not 0
623                if ((*nodesIt).GetVisiblePixels())
624                {
625                        float vis = relativeVisibility ?
626                                (*nodesIt).ComputeRelativeVisibility() : (float)(*nodesIt).GetVisiblePixels();
[145]627               
[151]628                        averageNodeVis += vis;
[171]629                        ++ nodesSize;
[151]630
[158]631                        std::stringstream d; d << "Node visibility: " << vis;
[151]632                        LogManager::getSingleton().logMessage(d.str());
633                }       
[130]634        }
635
[924]636
637        ///////////////////////////////////////////////////////////////////////////
638        //-- apply queries on patch level
639
640
[316]641        GtpVisibility::PatchInfoContainer::iterator patchIt, patchIt_end = visiblePatches.end();
[159]642
[171]643        for (patchIt = visiblePatches.begin(); patchIt != patchIt_end; ++ patchIt)
[159]644        {
645                // add if not 0
646                if ((*patchIt).GetVisiblePixels())
647                {
648                        float vis = relativeVisibility ?
649                                (*patchIt).ComputeRelativeVisibility() : (float)(*patchIt).GetVisiblePixels();
650               
651                        averagePatchVis += vis;
[171]652                        ++ patchSize;
[159]653
654                        std::stringstream d; d << "Patch visibility: " << vis;
655                        LogManager::getSingleton().logMessage(d.str());
656                }       
657        }
658
[924]659        ///////////////////////////////////////////////////////////////
660        //-- update visibility queries stats
661
[151]662        if (nodesSize)
663                averageNodeVis /= (float)nodesSize;
664        if (geomSize)
665                averageGeometryVis /= (float)geomSize;
[159]666        if (patchSize)
667                averagePatchVis /= (float)patchSize;
[135]668
[924]669
[135]670    try
671        {
[154]672                char str[100];
673               
674                sprintf(str, ": %s, %s, %s",
[173]675                                msQueryTypeCaptions[fromPoint ?  1 : 0].c_str(),
676                                msQueryRelativeVisCaptions[relativeVisibility ? 1 : 0].c_str(),
677                                msQueryMethodCaptions[useItemBuffer ? 1 : 0].c_str());
[135]678
679                mQueryTypeInfo->setCaption(str);
680
[153]681                sprintf(str, ": %d", (int)nodesSize);
[135]682                mQueryVisibleNodesInfo->setCaption(str);
683       
[153]684                sprintf(str,": %d", (int)geomSize);
[135]685                mQueryVisibleGeometryInfo->setCaption(str);
686               
[159]687                sprintf(str,": %d", (int)patchSize);
688                mQueryVisiblePatchInfo->setCaption(str);
689
[135]690                sprintf(str,": %3.3f", averageNodeVis);
691                mQueryNodeVisibilityInfo->setCaption(str);
692
693                sprintf(str,": %3.3f", averageGeometryVis);
694                mQueryGeometryVisibilityInfo->setCaption(str);
[159]695
696                sprintf(str,": %3.3f", averagePatchVis);
697                mQueryPatchVisibilityInfo->setCaption(str);
[135]698        }
699        catch (...)
700        {
701                // ignore
702        }
703
704        // show the results
[160]705        if (!mShowQueryStats && !mShowHelp)
[135]706        {
707                mQueryOverlay->show();
708                mShowQueryStats = true;
709        }
[151]710
711        delete mQueryManager;
[130]712}
[115]713
[417]714
715bool TerrainFrameListener::processUnbufferedMouseInput(const FrameEvent& evt)
716{
717        /* Rotation factors, may not be used if the second mouse button is pressed. */
718
719    /* If the second mouse button is pressed, then the mouse movement results in
720       sliding the camera, otherwise we rotate. */
721    if (mInputDevice->getMouseButton(1))
722    {
723                mTranslateVector.x += mInputDevice->getMouseRelativeX() * 0.13;
724                mTranslateVector.y -= mInputDevice->getMouseRelativeY() * 0.13;
725        }
726        else
727        {
728                mRotX = Degree(-mInputDevice->getMouseRelativeX() * 0.13);
729                mRotY = Degree(-mInputDevice->getMouseRelativeY() * 0.13);
730        }
731
732        return true;
733}
[115]734//-----------------------------------------------------------------------
[133]735bool TerrainFrameListener::frameEnded(const FrameEvent& evt)
[115]736{
737        if (mShutdownRequested)
738                return false;
739
[254]740        // timer end time
741        if (!mShowVisualization)
742        {
743                mTimeFrameEnded = mTimer->getMilliseconds();
744        }
745
[120]746    updateStats();
[115]747
[254]748        if (mRecordVideo) // record current frame
749        {
750                takeVideoFrame(video_out);
751        }
[1256]752
[160]753        //-- IMPORTANT: must be set, otherwise terrain is not rendered correctly
754        mSceneMgr->endFrame();
755
[254]756        if (mTimeDelay <= 0) // simulates approx. one second
[160]757                mTimeDelay = 1.0;
758
[115]759        return true;
760}
761//-----------------------------------------------------------------------
[133]762void TerrainFrameListener::moveCamera()
[115]763{
764        // move node rather than camera so orientation is right in the visualization
[421]765        mCamNode->yaw(mRotX, Ogre::Node::TS_WORLD);
766        //mCamNode->rotate(Vector3(0,1,0), mRotX, Ogre::Node::TS_WORLD);
[115]767        mCamNode->pitch(mRotY);
[421]768
[115]769        mCamNode->translate(mCamNode->getLocalAxes(), mTranslateVector);
770}
771//-----------------------------------------------------------------------
[723]772void TerrainFrameListener::writeFrames(const std::string filename,
773                                                                           const FrameInfoContainer &frameInfo) const
[115]774{
[723]775        std::ofstream ofstr(filename.c_str());
[115]776        std::vector<frame_info>::const_iterator it, it_end;
[723]777        it_end = frameInfo.end();
[115]778
[723]779        int i = 0;
780
781        for (it = frameInfo.begin(); it < it_end; ++ it, ++ i)
[115]782        {
783                ofstr << StringConverter::toString((*it).position) << " "
[130]784                          << StringConverter::toString((*it).orientation) << " "
[254]785                          << StringConverter::toString((*it).timeElapsed) << " "
786                          << StringConverter::toString((*it).fps) << "\n";
[115]787        }
[254]788
[723]789        std::stringstream d; d << "saved " << i << " frames to file " << filename;
790        Ogre::LogManager::getSingleton().logMessage(d.str());
791
[254]792        ofstr.close();
793}
[115]794//-----------------------------------------------------------------------
[723]795void TerrainFrameListener::loadFrames(const std::string filename, 
796                                                                          FrameInfoContainer &frameInfo)
[115]797{
[723]798        std::ifstream ifstr(filename.c_str());
[115]799        char line[256];
800        frame_info info;
801
802        // reset current values
[723]803        frameInfo.clear();
804       
[115]805        mCurrentFrame = 0;
[723]806        int i = 0;
[115]807        while (!ifstr.eof())
808        {
809                ifstr.getline(line, 256);
[254]810                sscanf(line, "%f %f %f %f %f %f %f %f %f", &info.position.x, &info.position.y, &info.position.z,
[135]811                           &info.orientation.w, &info.orientation.x, &info.orientation.y, &info.orientation.z,
[254]812                           &info.timeElapsed, &info.fps);
[115]813               
814                mFrameInfo.push_back(info);
815               
[140]816                // std::stringstream d; d << StringConverter::toString(info.position) << " " << StringConverter::toString(info.orientation);
817                // LogManager::getSingleton().logMessage(d.str());
[723]818                ++ i;
[115]819        }
[723]820       
821        std::stringstream d;
822        d << "loaded " << i << " frames from file " << filename;
823        Ogre::LogManager::getSingleton().logMessage(d.str());
824
[115]825        ifstr.close();
826}
827//-----------------------------------------------------------------------
[133]828void TerrainFrameListener::nextAppState()
[115]829{
830        mCurrentFrame = 0;
[254]831        int lastState = mAppState;
[115]832
[254]833        // transition to the next state
834        mAppState = (mAppState + 1) % STATE_NUM;
835
[723]836        // if last state was replay state: post process
[254]837        if (lastState == REPLAY)
[115]838        {
[254]839        // reset debug text
[115]840                mWindow->setDebugText("");
[254]841                               
[723]842                // hack for producing demo:
843                // we produced precomputed fps during the last replay =>
844                // save them to file
845                if (mSavePrecomputedFps) //!mPrecomputedFpsFrameInfo.empty())
846                {
847                        std::string filename = msApprevAlgorithmCaptions[mCurrentAlgorithm] + "_frames.out";
[254]848
[723]849                        writeFrames(filename, mPrecomputedFpsFrameInfo);
850                        mPrecomputedFpsFrameInfo.clear();
851                }
852
[115]853                std::stringstream d;
[723]854                mWalkthroughStats.Print(d, msApprevAlgorithmCaptions[mCurrentAlgorithm]);
[115]855               
856                LogManager::getSingleton().logMessage(d.str());
857        }
858       
[723]859        //-- replay recorded walkthrough
[115]860        if (mAppState == REPLAY)
861        {
[723]862                // no standard recording during replay
863                mRecordFrames = false;
[115]864
[723]865                // no stats information
866                mWindow->setDebugText("");
867
868                // clear previous walktrough
869                mFrameInfo.clear();
870
871                std::string filename;
872               
873                // if recording demo,
874                // we use precomputed fps which corresponds to current method,
875                // e.g., for chc we load precomputed chc fps from disc.
876                if (mRecordDemo)
[115]877                {
[723]878                        filename = msApprevAlgorithmCaptions[mCurrentAlgorithm] + "_frames.out";
[115]879                }
[723]880                else // standard filename
881                {
882                        filename = frames_out_filename;
883                }
884
885                //-- load recorded walkthrough from disk
886                loadFrames(filename, mFrameInfo);
[254]887               
[723]888               
889                // if there are still no recorded frames,
890                // no walkthrough was recorded => set next state
891                if (mFrameInfo.empty())
[115]892                {
893                        nextAppState();
894                }
[723]895                else // actual replay
[115]896                {
897                        mWindow->setDebugText("Replay");
898                       
[723]899                        // reset, because we measure fps stats during walkthrough
900                        // (warning: average fps broken)
[115]901                        mWindow->resetStatistics();
[259]902                        mWalkthroughStats.Reset();
[115]903
904                        //-- initialise frame data
[160]905                        mReplayTimeElapsed = 0;
[115]906
907                        mCamNode->setPosition(mFrameInfo[0].position);
908                        mCamNode->setOrientation(mFrameInfo[0].orientation);
909                }
910        }
911
912}
913//-----------------------------------------------------------------------
[133]914void TerrainFrameListener::toggleRecord()
[115]915{
[254]916        mRecordFrames = !mRecordFrames;
[115]917
[254]918        if (mRecordFrames)
919        {
920                // starting new recording => clear old frame info
[115]921                mFrameInfo.clear();
[254]922        }
[723]923        else // recording just ended => write frame info to file
[254]924        {
[723]925                writeFrames(frames_out_filename, mFrameInfo);
[115]926                mWindow->setDebugText("");
[254]927        }
[115]928}
929//-----------------------------------------------------------------------
[133]930void TerrainFrameListener::changeThreshold(int incr)
[115]931{
932        mVisibilityThreshold += incr;
[254]933
934        if (mVisibilityThreshold < 0)
935        {
936                mVisibilityThreshold = 0;
937        }
938
[115]939        char str[100]; sprintf(str,": %d", mVisibilityThreshold);
940
941        mSceneMgr->setOption("Threshold", &mVisibilityThreshold);
942        mThresholdInfo->setCaption(str);
943}
944//-----------------------------------------------------------------------
[146]945void TerrainFrameListener::changeAssumedVisibility(int incr)
946{
947        mAssumedVisibility += incr;
[254]948
949        if (mAssumedVisibility < 0)
950        {       
951                mAssumedVisibility = 0;
952        }
953
[146]954        char str[100]; sprintf(str,": %d", mAssumedVisibility);
955
956        mSceneMgr->setOption("AssumedVisibility", &mAssumedVisibility);
957        mAssumedVisibilityInfo->setCaption(str);
958}
959//-----------------------------------------------------------------------
[723]960void TerrainFrameListener::changeVizScale(const int incr)
961{
962        mVizScale += incr;
963
964        if (mVizScale < 1)
965        {       
966                mVizScale = 1;
967        }
968
969        mSceneMgr->setOption("NodeVizScale", &mVizScale);
970}
971
972//-----------------------------------------------------------------------
[133]973void TerrainFrameListener::zoomVizCamera(int zoom)
[115]974{
[723]975        mVizCameraHeight += zoom;
976
977        if(mVizCameraHeight < 0)
978                mVizCameraHeight = 0;
[115]979}
980//-----------------------------------------------------------------------
[133]981void TerrainFrameListener::nextAlgorithm()
[115]982{
983        mCurrentAlgorithm = (mCurrentAlgorithm + 1) %
[254]984                GtpVisibility::VisibilityEnvironment::NUM_CULLING_MANAGERS;
[115]985        setAlgorithm(mCurrentAlgorithm);
986}
987//-----------------------------------------------------------------------
[160]988void TerrainFrameListener::setObjectType(int objectType)
989{
[254]990        if (mCurrentObjectType >= 3) // TODO: define a constant
[160]991                mCurrentObjectType = 0;
992
993        // parameters for new object
[173]994        mTerrainContentGenerator->SetOffset(msObjectTerrainOffsets[mCurrentObjectType]);
995        Real scale = msObjectScales[mCurrentObjectType];
[160]996        mTerrainContentGenerator->SetScale(Vector3(scale, scale, scale));
997
[173]998        mCurrentObjectTypeInfo->setCaption(": " + msObjectCaptions[mCurrentObjectType]);
[160]999}
1000//-----------------------------------------------------------------------
[133]1001void TerrainFrameListener::setAlgorithm(int algorithm)
[115]1002{
[173]1003        mAlgorithmInfo->setCaption(": " + msAlgorithmCaptions[mCurrentAlgorithm]);
[115]1004        mSceneMgr->setOption("Algorithm", &mCurrentAlgorithm);
[945]1005
1006        if (1)
1007        {
1008                std::stringstream d; d << "algorithm: " << msAlgorithmCaptions[mCurrentAlgorithm];
1009                Ogre::LogManager::getSingleton().logMessage(d.str());
1010        }
[115]1011}
1012//-----------------------------------------------------------------------
[133]1013void TerrainFrameListener::updateStats()
[115]1014{
1015        unsigned int opt = 0;
1016        char str[100];
1017       
[147]1018        static String currFpsString = "Current FPS: ";
1019        static String avgFpsString = "Average FPS: ";
1020        static String bestFpsString = "Best FPS: ";
1021        static String worstFpsString = "Worst FPS: ";
1022        static String trisString = "Triangle Count: ";
[115]1023
[723]1024        int currentFps;
[254]1025       
[723]1026        // HACK for demo: use precomputed FPS instead of real FPS
1027        if (mRecordDemo)
1028        {
1029                currentFps = mPrecomputedFps;
1030        }
1031        else
1032        {
1033                currentFps = mWindow->getStatistics().lastFPS;
1034        }
1035
[254]1036#if 0
1037        // HACK: take pure rendering time, only measures the render call
1038        long pureRenderTime = mTimeFrameEnded - mTimeFrameStarted;
1039
1040        if (pureRenderTime)
1041        {
1042                mPureRenderTimeFps = 1000.0 / (float) pureRenderTime;
1043        }
1044        currentFps = mPureRenderRenderTimeFps;
1045        //std::stringstream d; d << "Pure render time fps: " << mPureRenderTimeFps << "\n";
1046        //Ogre::LogManager::getSingleton().logMessage(d.str());
1047#endif
1048       
[259]1049        unsigned int nodeInfo[3];
1050    mSceneMgr->getOption("NumRenderedNodes", nodeInfo);
1051        mSceneMgr->getOption("NumQueryCulledNodes", nodeInfo+1);
1052        mSceneMgr->getOption("NumFrustumCulledNodes", nodeInfo+2);
1053
1054
[723]1055        mWalkthroughStats.UpdateFrame(currentFps,
1056                                                                  mWindow->getBestFPS(),
1057                                                                  mWindow->getWorstFPS(),
1058                                                                  (int)mWindow->getTriangleCount(),
1059                                                                  nodeInfo[0],
1060                                                                  nodeInfo[1],
1061                                                                  nodeInfo[2]);
[259]1062
[160]1063        // HACK: compute average fps ourselfs, because ogre avg. fps is wrong
1064        // TODO: update only once per second
[259]1065        float avgFps = (float)mWalkthroughStats.mAccFps / (float)(mWalkthroughStats.mFrameCount);
1066       
1067
[115]1068        // update stats when necessary
[135]1069    try
1070        {
[115]1071                OverlayElement* guiAvg = OverlayManager::getSingleton().getOverlayElement("Core/AverageFps");
1072                OverlayElement* guiCurr = OverlayManager::getSingleton().getOverlayElement("Core/CurrFps");
1073                OverlayElement* guiBest = OverlayManager::getSingleton().getOverlayElement("Core/BestFps");
1074                OverlayElement* guiWorst = OverlayManager::getSingleton().getOverlayElement("Core/WorstFps");
1075
1076                const RenderTarget::FrameStats& stats = mWindow->getStatistics();
1077
[254]1078                // HACK: take newly computed avg. fps instead of Ogre avg fps and update only once per second
1079                if (mTimeDelay < 0)
[161]1080                {               
[160]1081                        guiAvg->setCaption(avgFpsString + StringConverter::toString(avgFps) + " ms");
[254]1082                        //guiCurr->setCaption(currFpsString + StringConverter::toString(currentFps));
[161]1083                }
[723]1084
[924]1085                if (0)
1086                {
1087                        std::stringstream d;
1088                        d << "fps: " << StringConverter::toString(currentFps) << ", "
1089                          << "avg fps: " << StringConverter::toString(avgFps);
1090                        LogManager::getSingleton().logMessage(d.str());
1091                }
[723]1092
[254]1093                //guiAvg->setCaption(avgFps + StringConverter::toString(stats.avgFPS));
1094                guiCurr->setCaption(currFpsString + StringConverter::toString(currentFps));
1095               
[343]1096                //std::stringstream d; d << "frame rate :" << stats.lastFPS;
1097                //Ogre::LogManager::getSingleton().logMessage(d.str());
[161]1098
[147]1099                guiBest->setCaption(bestFpsString + StringConverter::toString(stats.bestFPS)
[723]1100                                                        + " " + StringConverter::toString(stats.bestFrameTime) + " ms");
[147]1101                guiWorst->setCaption(worstFpsString + StringConverter::toString(stats.worstFPS)
[723]1102                                                         + " " + StringConverter::toString(stats.worstFrameTime) + " ms");
[115]1103
1104                OverlayElement* guiTris = OverlayManager::getSingleton().getOverlayElement("Core/NumTris");
[147]1105        guiTris->setCaption(trisString + StringConverter::toString(stats.triangleCount));
[259]1106               
1107                //LogManager::getSingleton().logMessage(StringConverter::toString(stats.triangleCount));
[115]1108
1109                OverlayElement* guiDbg = OverlayManager::getSingleton().getOverlayElement("Core/DebugText");
1110                guiDbg->setCaption(mWindow->getDebugText());
1111
[259]1112
[115]1113                //-- culling stats
[1256]1114
[115]1115                mSceneMgr->getOption("NumFrustumCulledNodes", &opt); sprintf(str,": %d", opt);
1116                mFrustumCulledNodesInfo->setCaption(str);
[155]1117
[115]1118                mSceneMgr->getOption("NumQueryCulledNodes", &opt); sprintf(str,": %d", opt);
1119                mQueryCulledNodesInfo->setCaption(str);
1120       
1121                mSceneMgr->getOption("NumHierarchyNodes", &opt); sprintf(str,": %d", opt);
1122                mHierarchyNodesInfo->setCaption(str);
1123
1124                mSceneMgr->getOption("NumRenderedNodes", &opt); sprintf(str,": %d", opt);
1125                mRenderedNodesInfo->setCaption(str);
1126
1127                sprintf(str,": %d", mTerrainContentGenerator->GetObjectCount());
[160]1128                mObjectsCountInfo->setCaption(str);
[155]1129
[160]1130                // take old value into account in order to create no sudden changes
[155]1131                mSceneMgr->getOption("NumQueriesIssued", &opt);
[723]1132                mDelayedQueriesIssued = mDelayedQueriesIssued * 0.8 + (float)opt * 0.2f;
[155]1133                sprintf(str,": %d", (int)mDelayedQueriesIssued);
[160]1134                mQueriesIssuedInfo->setCaption(str);
[155]1135
1136                mSceneMgr->getOption("NumTraversedNodes", &opt);
[723]1137                mDelayedTraversedNodes = mDelayedTraversedNodes * 0.8 + (float)opt * 0.2f;
[155]1138                sprintf(str,": %d", (int)mDelayedTraversedNodes);
[160]1139                mTraversedNodesInfo->setCaption(str);
[155]1140
[1256]1141                if (mRecordVideo)
1142                {
1143                        // update stats for demo
1144                        mMyStatsAlgorithmInfo->setCaption(msApprevAlgorithmCaptions[mCurrentAlgorithm]);
1145                        sprintf(str,": %d", (int)currentFps);
1146                        mMyStatsFpsInfo->setCaption(str);
1147                }
[723]1148
[115]1149        }
[135]1150        catch (...)
[115]1151        {
[135]1152                // ignore
[115]1153        }
1154}
1155//-----------------------------------------------------------------------
[187]1156void TerrainFrameListener::setTestGeometryForVisibleLeaves(bool testGeometryForVisibleLeaves)
[115]1157{
[155]1158        mSceneMgr->setOption("TestGeometryForVisibleLeaves", &mTestGeometryForVisibleLeaves);
[133]1159       
[160]1160        /* disable optimization which tests geometry instead of aabb
1161         * for "delayed" rendering of transparents (i.e., render transparents after all the solids)
1162         * because otherwise visible transparents could be skipped
1163         */
[155]1164        bool delayedRendering = !mTestGeometryForVisibleLeaves;
1165
[115]1166        mSceneMgr->setOption("DelayRenderTransparents", &delayedRendering);
1167
[155]1168        if (mTestGeometryForVisibleLeaves)
[133]1169        {
[155]1170                mTestGeometryForVisibleLeavesInfo->setCaption(": true");
[133]1171        }
[115]1172        else
[133]1173        {
[155]1174                mTestGeometryForVisibleLeavesInfo->setCaption(": false");
[133]1175        }
[115]1176}
1177//-----------------------------------------------------------------------
[133]1178void TerrainFrameListener::toggleShowOctree()
[115]1179{
1180        mShowOctree = !mShowOctree;
1181
1182        mSceneMgr->setOption("ShowOctree", &mShowOctree);
1183}
1184//-----------------------------------------------------------------------
[901]1185void TerrainFrameListener::toggleUseViewCells()
[1268]1186{LogManager::getSingleton().logMessage("here52");
[937]1187        // HACK: no view cells for hilly terrain
1188        if (mApplication->msShowHillyTerrain)
1189                return;
[1268]1190LogManager::getSingleton().logMessage("here533");
[901]1191        mUseViewCells = !mUseViewCells;
[937]1192
1193        // load on demand
1194        if (mUseViewCells && !mViewCellsLoaded)
1195        {
[945]1196                mLoadingOverlay->show();
1197
1198                // call once to load view cell loading overlay
1199                mWindow->update();
[1268]1200                LogManager::getSingleton().logMessage("here5");
[937]1201                mViewCellsLoaded = mApplication->LoadViewCells(mApplication->mViewCellsFilename);
[945]1202               
[973]1203                if (!mViewCellsLoaded)
1204                {
1205                        std::stringstream d;
1206                        d << "loading view cells failed";
[1268]1207                        LogManager::getSingleton().logMessage("here7");
[973]1208                        LogManager::getSingleton().logMessage(d.str());
1209                }
1210
[1268]1211                LogManager::getSingleton().logMessage("here82");
[945]1212                mLoadingOverlay->hide();
[937]1213        }
1214
[945]1215        if (mUseViewCells)
1216                mViewCellsInfo->setCaption(": on");
1217        else
1218                mViewCellsInfo->setCaption(": off");
1219
[901]1220        mSceneMgr->setOption("UseViewCells", &mUseViewCells);
1221}
1222//-----------------------------------------------------------------------
1223void TerrainFrameListener::toggleUseVisibilityFilter()
1224{
1225        mUseVisibilityFilter = !mUseVisibilityFilter;
1226        mSceneMgr->setOption("UseVisibilityFilter", &mUseVisibilityFilter);
1227}
1228//-----------------------------------------------------------------------
[133]1229void TerrainFrameListener::toggleUseDepthPass()
[115]1230{
1231        mUseDepthPass = !mUseDepthPass;
1232
1233        mSceneMgr->setOption("UseDepthPass", &mUseDepthPass);
1234       
1235        if (mUseDepthPass)
[120]1236        {
[115]1237                mUseDepthPassInfo->setCaption(": true");
[120]1238        }
[115]1239        else
[120]1240        {
[115]1241                mUseDepthPassInfo->setCaption(": false");
[120]1242        }
[115]1243}
1244//-----------------------------------------------------------------------
[133]1245void TerrainFrameListener::toggleShowViz()
[115]1246{
[139]1247        mVisualizeCulledNodes = mShowVisualization = !mShowVisualization;
1248       
[115]1249        // create viewport with priority VIZ_VIEWPORT_Z_ORDER:
1250        // will be rendered over standard viewport
1251        if (mShowVisualization)
1252        {       
1253                Viewport *vizvp = mWindow->addViewport(mVizCamera,
1254                        VIZ_VIEWPORT_Z_ORDER, 0.6, 0.6, 0.4, 0.4);
1255                               
1256                vizvp->setBackgroundColour(ColourValue(0.0, 0.3, 0.2, 1));
1257
1258                vizvp->setOverlaysEnabled(false);
1259                // Alter the camera aspect ratio to match the viewport
1260        mVizCamera->setAspectRatio(Real(vizvp->getActualWidth()) /
[139]1261                                                                   Real(vizvp->getActualHeight()));
[115]1262               
1263                mSceneMgr->setOption("VisualizeCulledNodes", &mVisualizeCulledNodes);
1264                //vizvp->setClearEveryFrame(false);
1265
1266                // Create a skyplane (for visualization background)
1267                /*
1268                Plane plane;
1269                plane.d = -1000;
1270                plane.normal = Vector3::UNIT_Y;
1271                mSceneMgr->setSkyPlane(true, plane, "Examples/TransparentTest", 4000, 75, false);
1272                */
1273        }
1274        else
1275        {
[139]1276                // remove visualization viewport
[115]1277                mWindow->removeViewport(VIZ_VIEWPORT_Z_ORDER);
[139]1278
1279                // octree bounding boxes are shown for visualization purpose, reset now
[115]1280                mSceneMgr->setOption("ShowOctree", &mShowOctree);
1281        }
1282}
1283//-----------------------------------------------------------------------
[139]1284void TerrainFrameListener::toggleShowShadows()
[115]1285{
[139]1286        mShowShadows = !mShowShadows;
[115]1287
[139]1288        mSunLight->setCastShadows(mShowShadows);
[115]1289
[139]1290        if (mShowShadows)
[115]1291        {
1292                mSceneMgr->setShadowTechnique(SHADOWTYPE_TEXTURE_MODULATIVE);
[139]1293                //mSceneMgr->setShadowTechnique(SHADOWTYPE_STENCIL_MODULATIVE);
1294                //mSceneMgr->setShadowTechnique(SHADOWTYPE_STENCIL_ADDITIVE);           
[115]1295        }
1296        else
1297        {
1298                mSceneMgr->setShadowTechnique(SHADOWTYPE_NONE);
1299        }
1300
1301}
1302//-----------------------------------------------------------------------
[133]1303void TerrainFrameListener::nextNodeVizMode()
[115]1304{
1305        mNodeVizMode = (mNodeVizMode + 1) % NODEVIZ_MODES_NUM;
1306
[120]1307        bool renderNodesForViz = (mNodeVizMode == NODEVIZ_RENDER_NODES) ||
1308                (mNodeVizMode == NODEVIZ_RENDER_NODES_AND_CONTENT);
[115]1309        bool renderNodesContentForViz = (mNodeVizMode == NODEVIZ_RENDER_NODES_AND_CONTENT);
1310        //bool renderNodesContentForViz = mNodeVizMode == NODEVIZ_RENDER_GEOMETRY;
1311
1312        mSceneMgr->setOption("RenderNodesForViz", &renderNodesForViz);
1313        mSceneMgr->setOption("RenderNodesContentForViz", &renderNodesContentForViz);
1314}
1315//-----------------------------------------------------------------------
[133]1316void TerrainFrameListener::keyPressed(KeyEvent* e)
[115]1317{
[160]1318        // hide exact visibility query overlay
1319        if (mShowQueryStats)
1320        {
1321                mQueryOverlay->hide();
1322                mShowQueryStats = false;
1323        }
1324
[133]1325        switch(e->getKey())
1326        {
1327        case KC_ESCAPE:
[115]1328                mShutdownRequested = true;
1329                e->consume();
1330                return;
[133]1331
1332        case KC_SPACE:
1333                nextAlgorithm();
1334                break;
1335       
[159]1336    case KC_F:
[133]1337                nextFilter();
1338                break;
1339        case KC_R:
1340                nextSceneDetailLevel();
1341                break;
1342        case KC_P:
1343                toggleDisplayCameraDetails();
1344                break;
[155]1345        case KC_G:
[187]1346                mTestGeometryForVisibleLeaves = !mTestGeometryForVisibleLeaves;
1347                setTestGeometryForVisibleLeaves(mTestGeometryForVisibleLeaves);
[133]1348                break;
1349        case KC_T:
1350                toggleShowOctree();
1351                break;
1352        case KC_X:
1353                toggleUseDepthPass();
1354                break;
[421]1355        case KC_H:
[139]1356                toggleShowShadows();
[133]1357                break;
1358
[159]1359        case KC_I:
1360                mUseItemBuffer = !mUseItemBuffer;
1361                break;
1362
1363        case KC_C:
[174]1364
1365                if (mItemBufferMode != GtpVisibility::QueryManager::GEOMETRY_VISIBILITY)
1366                        mItemBufferMode = GtpVisibility::QueryManager::GEOMETRY_VISIBILITY;
1367                else
1368                        mItemBufferMode = GtpVisibility::QueryManager::PATCH_VISIBILITY;
1369
[159]1370                break;
1371
[133]1372        case KC_SUBTRACT:
1373                changeThreshold(-10);
1374                break;
1375        case KC_ADD:
1376                changeThreshold(10);
1377                break;
1378
1379        //-- visualization
1380        case KC_1:
1381                toggleShowViz();
1382                break;
1383        case KC_2:
1384                nextNodeVizMode();
1385                break;
1386
1387        case KC_F2:
[254]1388                mStatsOn = !mStatsOn;
1389                showStats(mStatsOn);
[133]1390                break;
1391        case KC_F3:
1392                nextAppState();
1393                break;
1394        case KC_F4:
1395                toggleRecord();
1396                break;
[956]1397#if USE_PERFHUD
1398        case KC_F1:
1399                toggleShowHelp();
1400                break;
1401
[133]1402        case KC_F5:
[160]1403                applyVisibilityQuery(false, mShiftPressed, mUseItemBuffer);
[133]1404                break;
[956]1405
[133]1406        case KC_F6:
[160]1407                applyVisibilityQuery(true, mShiftPressed, mUseItemBuffer);
[133]1408                break;
[159]1409       
[160]1410        case KC_F7:
[945]1411                setObjectType(++ mCurrentObjectType);
[160]1412                break;
[956]1413        #endif
[160]1414        case KC_F8:
1415                mApplication->generateScene(500, mCurrentObjectType);
1416                break;
[161]1417        case KC_F9:
[164]1418                mUseAnimation = !mUseAnimation;
[161]1419                break;
[254]1420
1421        case KC_F10:
1422                mRecordVideo = !mRecordVideo;
1423                       
[133]1424        case KC_F11:
[164]1425                takeScreenshot();
[133]1426                break;
[956]1427        case KC_7:
[133]1428                mTerrainContentGenerator->WriteObjects(objects_out_filename);
1429                break;
[146]1430        case KC_8:
[945]1431                changeAssumedVisibility(-5);
1432        //      changeAssumedVisibility(-500);
[146]1433                break;
1434        case KC_9:
[945]1435        //      changeAssumedVisibility(500);
1436                changeAssumedVisibility(5);
[146]1437                break;
[133]1438        case KC_LSHIFT:
[135]1439                mShiftPressed = true;
[133]1440                break;
[160]1441        case KC_DELETE:
[164]1442                mDeleteObjects = true;
[160]1443                break;
[723]1444        case KC_M: // hack for recording demo using precomputed fps
1445                mRecordDemo = !mRecordDemo;
[254]1446                break;
[723]1447    case KC_E: // hack for recording demo using precomputed fps
1448                mSavePrecomputedFps = !mSavePrecomputedFps;
1449                break;
[417]1450        case KC_O:
1451                switchMouseMode();
1452                break;
[901]1453        case KC_V:
1454                toggleUseViewCells();
1455                break;
1456        case KC_Q:
1457                toggleUseVisibilityFilter();
1458                break;
[133]1459        //KEY_PRESSED(KC_F3, 0.3, writeFrames());
1460        //KEY_PRESSED(KC_F4, 0.3, loadFrames());
1461        default:
1462                break;
[115]1463        }
1464
1465        CEGUI::System::getSingleton().injectKeyDown(e->getKey());
1466        CEGUI::System::getSingleton().injectChar(e->getKeyChar());
1467        e->consume();
1468}
1469//-----------------------------------------------------------------------
[133]1470void TerrainFrameListener::keyReleased(KeyEvent* e)
[115]1471{
[135]1472        if (e->getKey() == KC_LSHIFT)
1473        {
1474                mShiftPressed = false;
1475        }
1476       
[115]1477        CEGUI::System::getSingleton().injectKeyUp(e->getKey());
1478        e->consume();
1479}
1480//-----------------------------------------------------------------------
[133]1481void TerrainFrameListener::keyClicked(KeyEvent* e)
[115]1482{
1483        // Do nothing
1484        e->consume();
1485}
1486//-----------------------------------------------------------------------
[723]1487void TerrainFrameListener::addFrameInfo(FrameInfoContainer &frameInfos,
1488                                                                                SceneNode *camNode,
1489                                                                                Real timeElapsed)
[115]1490{
1491        frame_info info;
[254]1492
[115]1493        info.orientation = mCamNode->getOrientation();
1494        info.position = mCamNode->getPosition();
1495        info.timeElapsed = timeElapsed;
[254]1496        info.fps = mWindow->getStatistics().lastFPS;
[115]1497
[254]1498        frameInfos.push_back(info);
[115]1499}
1500//-----------------------------------------------------------------------
[723]1501void TerrainFrameListener::setCurrentFrameInfo(const Real timeElapsed)
[115]1502{
1503        //-- find current frame relative to elapsed frame time         
[160]1504        mReplayTimeElapsed -= timeElapsed;
[254]1505       
[160]1506        while ((mReplayTimeElapsed <= 0) && (mCurrentFrame < (int)mFrameInfo.size() - 1))
[115]1507        {
[160]1508                mReplayTimeElapsed += mFrameInfo[mCurrentFrame ++].timeElapsed;
[115]1509        }
1510
[254]1511
1512        // TODO: crashes here if recording / replaying on the same time!!
[723]1513        const frame_info new_frame = mFrameInfo[mCurrentFrame];
1514        const frame_info old_frame = mFrameInfo[mCurrentFrame - 1];
[115]1515               
1516        //-- interpolate frames
1517        Real factor = 1;
1518
1519        if (old_frame.timeElapsed > 0)
[133]1520        {
[160]1521                factor = mReplayTimeElapsed / old_frame.timeElapsed;
[133]1522        }
[115]1523
[723]1524        const Vector3 camPos = old_frame.position + factor
[133]1525                * (new_frame.position - old_frame.position);
[254]1526
1527        // interpolate the orientation
[723]1528        const Quaternion camOrienation =
1529                Quaternion::Slerp(factor, old_frame.orientation, new_frame.orientation, true);
[115]1530
[723]1531        // HACK for demo: interpolate precomputed fps
1532        mPrecomputedFps = old_frame.fps + factor * (new_frame.fps - old_frame.fps);
[254]1533
[115]1534        mCamNode->setPosition(camPos);
1535        mCamNode->setOrientation(camOrienation);
1536       
[254]1537        // stop replaying after one full walkthrough
[115]1538        if (mCurrentFrame == (int)mFrameInfo.size() - 1)
1539        {
1540                nextAppState();
1541        }
1542}
1543//-----------------------------------------------------------------------   
[133]1544bool TerrainFrameListener::processUnbufferedKeyInput(const FrameEvent& evt)
[115]1545{
[135]1546        bool cursorPressed = false;
1547       
[120]1548        /* Move camera forward by keypress. */
[421]1549    if (mInputDevice->isKeyDown(KC_UP) || mInputDevice->isKeyDown(KC_W))
[120]1550        {
1551                mTranslateVector.z = -mMoveScale;
[135]1552                cursorPressed = true;
[120]1553        }
[115]1554    /* Move camera backward by keypress. */
[421]1555    if (mInputDevice->isKeyDown(KC_DOWN) || mInputDevice->isKeyDown(KC_S))
[115]1556    {
[120]1557                mTranslateVector.z = mMoveScale;
[135]1558                cursorPressed = true;
[115]1559    }
1560
[421]1561        if (mInputDevice->isKeyDown(KC_A))
1562        {
1563                mTranslateVector.x -= mMoveScale;
1564                mTranslateVector.y += mMoveScale;
1565
1566                cursorPressed = true;
1567        }
1568
1569        if (mInputDevice->isKeyDown(KC_D))
1570        {
1571                mTranslateVector.x += mMoveScale;
1572                mTranslateVector.y -= mMoveScale;
1573
1574                cursorPressed = true;
1575        }
1576
[115]1577    if (mInputDevice->isKeyDown(KC_RIGHT))
1578    {
1579        mCamNode->yaw(-mRotScale);
[135]1580                cursorPressed = true;
[115]1581    }
[421]1582
[115]1583    if (mInputDevice->isKeyDown(KC_LEFT))
1584    {
1585        mCamNode->yaw(mRotScale);
[135]1586                cursorPressed = true;
[115]1587    }
[133]1588        // visualization camera
1589        if (mInputDevice->isKeyDown(KC_3))
1590        {
1591                zoomVizCamera(50);
1592        }
1593        if (mInputDevice->isKeyDown(KC_4))
1594        {
1595                zoomVizCamera(-50);
1596        }
[115]1597
[723]1598        if (mInputDevice->isKeyDown(KC_5))
1599        {
1600                changeVizScale(-1);
1601        }
1602
1603        if (mInputDevice->isKeyDown(KC_6))
1604        {
1605                changeVizScale(1);
1606        }
1607
[135]1608        // show the results
1609        if (cursorPressed && mShowQueryStats)
1610        {
1611                mQueryOverlay->hide();
1612                mShowQueryStats = false;
1613        }
[115]1614
1615    // Return true to continue rendering
1616    return true;
1617}
1618//-----------------------------------------------------------------------
[133]1619void TerrainFrameListener::nextFilter()
[120]1620{
[133]1621        switch (mFiltering)
[120]1622        {
1623        case TFO_BILINEAR:
1624                mFiltering = TFO_TRILINEAR;
1625                mAniso = 1;
1626                break;
1627        case TFO_TRILINEAR:
1628                mFiltering = TFO_ANISOTROPIC;
1629                mAniso = 8;
1630                break;
1631        case TFO_ANISOTROPIC:
1632                mFiltering = TFO_BILINEAR;
1633                mAniso = 1;
1634                break;
1635        default:
1636                break;
1637        }
1638
1639    MaterialManager::getSingleton().setDefaultTextureFiltering(mFiltering);
1640    MaterialManager::getSingleton().setDefaultAnisotropy(mAniso);
1641
[133]1642        // reload stats
[120]1643    showStats(mStatsOn);
1644}
1645//-----------------------------------------------------------------------
[133]1646void TerrainFrameListener::nextSceneDetailLevel()
[120]1647{
[901]1648#if OGRE_103
[133]1649        mSceneDetailIndex = (mSceneDetailIndex + 1) % 3;
1650        switch (mSceneDetailIndex)
[120]1651        {
[133]1652                case 0:
1653                        mCamera->setDetailLevel(SDL_SOLID);
1654                        break;
1655                case 1:
1656                        mCamera->setDetailLevel(SDL_WIREFRAME);
1657                        break;
1658                case 2:
1659                        mCamera->setDetailLevel(SDL_POINTS);
1660                        break;
[120]1661        }
[901]1662#endif
[120]1663}
1664//-----------------------------------------------------------------------
[254]1665void TerrainFrameListener::takeVideoFrame(std::ofstream &ofstr)
1666{
1667        char name[50];
1668
1669        sprintf(name, "frame_%05d.tga", ++mNumVideoFrames);
1670    mWindow->writeContentsToFile(name);
1671    //mWindow->setDebugText(String("Wrote ") + name);
1672
1673        ofstr << name << "\n";
1674}
1675//-----------------------------------------------------------------------
[164]1676void TerrainFrameListener::takeScreenshot()
[120]1677{
[254]1678        char name[50];
1679
1680        sprintf(name, "screenshot_%05d.png", ++mNumScreenShots);
1681    mWindow->writeContentsToFile(name);
1682    //mWindow->setDebugText(String("Wrote ") + name);
[120]1683}
1684//-----------------------------------------------------------------------
[133]1685void TerrainFrameListener::toggleDisplayCameraDetails()
[120]1686{
1687        mDisplayCameraDetails = !mDisplayCameraDetails;
1688       
1689    if (!mDisplayCameraDetails)
[133]1690        {
[120]1691                mWindow->setDebugText("");
[115]1692        }
1693}
[120]1694//-----------------------------------------------------------------------
[133]1695void TerrainFrameListener::showStats(bool show)
[115]1696{
[120]1697        if (mDebugOverlay && mCullStatsOverlay)
[115]1698        {
1699                if (show)
1700                {
1701                        mDebugOverlay->show();
[120]1702                        mCullStatsOverlay->show();
[115]1703                }
1704                else
1705                {
1706                        mDebugOverlay->hide();
[120]1707                        mCullStatsOverlay->hide();
[115]1708                }
1709        }
1710}
1711
[120]1712//-----------------------------------------------------------------------
[133]1713void TerrainFrameListener::toggleShowHelp()
[120]1714{
1715        mShowHelp = !mShowHelp;
[115]1716
[120]1717        if (mShowHelp)
1718        {
1719                mHelpOverlay->show();
1720        }
1721        else
1722        {
1723                mHelpOverlay->hide();
1724        }
[160]1725}
1726//-----------------------------------------------------------------------
1727void TerrainFrameListener::initOverlayElement(OverlayElement **elInfo, String ext,
1728                                                                                          String name, int top, String caption)
1729{
1730        OverlayElement *el =
1731                OverlayManager::getSingleton().getOverlayElement(ext + name);
1732
1733        (*elInfo) = OverlayManager::getSingleton().getOverlayElement(ext + name + "Info");
1734        (*elInfo)->setCaption(caption);
1735
1736        el->setTop(top);
1737        (*elInfo)->setTop(top);
1738}
1739//-----------------------------------------------------------------------
1740void TerrainFrameListener::initHelpOverlayElement(String name, int top)
1741{
1742        OverlayElement *el = OverlayManager::getSingleton().getOverlayElement(
1743                "Example/Visibility/Help/" + name);
1744
1745        el->setTop(top);
1746}
1747//-----------------------------------------------------------------------
1748void TerrainFrameListener::initHelpOverlay()
1749{
1750        const int vert_space = 15;
1751        int top = 30;
1752
1753        initHelpOverlayElement("ShowHelp", top); top += vert_space;
1754        initHelpOverlayElement("Stats", top); top += vert_space;
1755        initHelpOverlayElement("AppState", top); top += vert_space;
1756        initHelpOverlayElement("Recorded", top); top += vert_space;
[161]1757        initHelpOverlayElement("Animation", top); top += vert_space;
[254]1758        initHelpOverlayElement("Video", top); top += vert_space;
[160]1759        initHelpOverlayElement("Screenshots", top); top += vert_space;
1760        initHelpOverlayElement("WriteOut", top); top += vert_space;
1761
[254]1762
[160]1763        top +=vert_space;
1764        initHelpOverlayElement("SceneDetail", top); top += vert_space;
1765        initHelpOverlayElement("DisplayCameraDetails", top); top += vert_space;
1766        initHelpOverlayElement("DisplayOctree", top); top += vert_space;
1767        initHelpOverlayElement("UseShadows", top); top += vert_space;
1768        initHelpOverlayElement("Filter", top); top += vert_space;
1769
1770        //-- visualization
1771        top += vert_space;
1772        initHelpOverlayElement("VizSection", top); top += vert_space;
1773        initHelpOverlayElement("Viz", top); top += vert_space;
1774        initHelpOverlayElement("NextVizMode", top); top += vert_space;
1775        initHelpOverlayElement("ZoomViz", top); top += vert_space;
1776
1777
1778        //-- visibility queries
1779        top += vert_space;
1780        initHelpOverlayElement("VisQuery", top); top += vert_space;
1781        initHelpOverlayElement("FromCameraQuery", top); top += vert_space;
1782        initHelpOverlayElement("FromPointQuery", top); top += vert_space;
1783        initHelpOverlayElement("QueryType", top); top += vert_space;
1784        initHelpOverlayElement("QueryTarget", top); top += vert_space;
1785
1786        //-- object generation
1787        top += vert_space;
1788        initHelpOverlayElement("SceneObjects", top); top += vert_space;
[418]1789        initHelpOverlayElement("PlaceObjects", top); top += vert_space;
[160]1790        initHelpOverlayElement("GenerateObjects", top); top += vert_space;
1791        initHelpOverlayElement("RemoveObjects", top); top += vert_space;
1792        initHelpOverlayElement("DropObject", top); top += vert_space;
1793
1794        OverlayElement *helpPanel = OverlayManager::getSingleton().getOverlayElement(
1795                "Example/Visibility/Help/HelpPanel");
1796
1797        helpPanel->setHeight(top + 10);
1798}
1799//-----------------------------------------------------------------------
1800void TerrainFrameListener::initVisStatsOverlay()
1801{
1802        const int border_height = 10;
1803        const int vert_space = 15;
1804
1805        //-- visibility culling stats overlay
1806        int top = border_height;
1807
1808        String ext = "Example/Visibility/";
1809       
1810        initOverlayElement(&mAlgorithmInfo, ext, "Algorithm", top,
[173]1811                ": " + msAlgorithmCaptions[mCurrentAlgorithm]); top += vert_space;
[160]1812
1813        initOverlayElement(&mThresholdInfo, ext, "Threshold", top, ": 0"); top += vert_space;
1814        initOverlayElement(&mTestGeometryForVisibleLeavesInfo, ext,
1815                "TestGeometryForVisibleLeaves", top, ": true"); top += vert_space;
1816        initOverlayElement(&mUseDepthPassInfo, ext, "UseDepthPass", top, ": false"); top += vert_space;
1817        initOverlayElement(&mAssumedVisibilityInfo, ext, "AssumedVisibility", top, ": 0"); top += vert_space;
1818        initOverlayElement(&mCurrentObjectTypeInfo, ext, "CurrentObjectType", top, ": "); top += vert_space;
[945]1819        initOverlayElement(&mViewCellsInfo, ext, "ViewCells", top, ": "); top += vert_space;
[161]1820        //initOverlayElement(&mHelpInfo, ext, "Help", top, ": "); top += vert_space;
[160]1821
1822        OverlayElement *optionsPanel = OverlayManager::getSingleton().
1823                getOverlayElement("Example/Visibility/VisibilityPanel");
1824
1825        optionsPanel->setHeight(top + border_height);
1826
1827        top = border_height;
1828        //ext = "Example/Visibility/";
1829        initOverlayElement(&mFrustumCulledNodesInfo, ext, "FrustumCulledNodes", top, ": 0"); top += vert_space;
1830        initOverlayElement(&mQueryCulledNodesInfo, ext, "QueryCulledNodes", top, ": 0"); top += vert_space;
1831        initOverlayElement(&mTraversedNodesInfo, ext, "TraversedNodes", top, ": 0"); top += vert_space;
1832        initOverlayElement(&mHierarchyNodesInfo, ext, "HierarchyNodes", top, ": 0"); top += vert_space;
1833        initOverlayElement(&mRenderedNodesInfo, ext, "RenderedNodes", top, ": 0"); top += vert_space;
1834        initOverlayElement(&mObjectsCountInfo, ext, "ObjectsCount", top, ": 0"); top += vert_space;
1835        initOverlayElement(&mQueriesIssuedInfo, ext, "QueriesIssued", top, ": 0"); top += vert_space;
1836
1837        OverlayElement *visPanel = OverlayManager::getSingleton().
1838                getOverlayElement("Example/Visibility/VisibilityStatsPanel");
1839
1840        visPanel->setHeight(top + border_height);
1841}
1842//-----------------------------------------------------------------------
1843void TerrainFrameListener::initQueryOverlay()
1844{
1845        const int border_height = 10;
1846        const int vert_space = 15;
1847
1848        //-- visibility culling stats overlay
1849        int top = border_height + 25;
1850
1851        String ext = "Example/Visibility/Query/";
1852           
1853        initOverlayElement(&mQueryTypeInfo , ext, "QueryType", top,     ": 0"); top += vert_space;
[171]1854       
1855        initOverlayElement(&mQueryVisibleNodesInfo , ext, "VisibleNodes", top,  ": 0"); top += vert_space;
[160]1856        initOverlayElement(&mQueryVisibleGeometryInfo , ext, "VisibleGeometry", top,    ": 0"); top += vert_space;
1857        initOverlayElement(&mQueryVisiblePatchInfo , ext, "VisiblePatches", top,        ": 0"); top += vert_space;
[171]1858       
[160]1859        initOverlayElement(&mQueryNodeVisibilityInfo , ext, "NodeVisibility", top,      ": 0"); top += vert_space;
1860        initOverlayElement(&mQueryGeometryVisibilityInfo , ext, "GeometryVisibility", top,      ": 0"); top += vert_space;
1861        initOverlayElement(&mQueryPatchVisibilityInfo , ext, "PatchVisibility", top,    ": 0"); top += vert_space;
1862
1863
1864        OverlayElement *queryPanel = OverlayManager::getSingleton().
1865                getOverlayElement("Example/Visibility/Query/QueryPanel");
1866
1867        queryPanel->setHeight(top + border_height);
[343]1868}
Note: See TracBrowser for help on using the repository browser.