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

Revision 103, 20.8 KB checked in by mattausch, 19 years ago (diff)

fixed bug with shadow maps

Line 
1/**
2    \file
3        TestCullingTerrainApplication.cpp
4    \brief
5        Tests the visibility culling algorithm
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
15#include <Ogre.h>
16#include "OgreReferenceAppLayer.h"
17//#include "OgreRefAppWorld.h"
18#include "TestCullingTerrainApplication.h"
19
20#define WIN32_LEAN_AND_MEAN
21#include <windows.h>
22
23#define VIZ_VIEWPORT_Z_ORDER 10
24
25/*******************************************************/
26/*     TestCullingTerrainApplication implementation    */
27/*******************************************************/
28
29//-----------------------------------------------------------------------
30TestCullingTerrainApplication::~TestCullingTerrainApplication()
31{
32        if(mTerrainContentGenerator)
33                delete mTerrainContentGenerator;
34        //if(mRenderTargetListener)     delete mRenderTargetListener;
35}
36//-----------------------------------------------------------------------
37void TestCullingTerrainApplication::createCamera()
38{
39        // create the camera
40        mCamera = mSceneMgr->createCamera("PlayerCam");
41       
42        /** set a nice viewpoint
43        *       we use a camera node here and apply all transformations on it instead
44        *       of applying all transformations directly to the camera
45        *       because then the camera is displayed correctly in the visualization
46        */
47       
48        mCamNode = mSceneMgr->getRootSceneNode()->createChildSceneNode(
49                "CamNode1", Vector3(707, 5000, 528));
50        //mCamera->setPosition(707, 5000, 528);
51        mCamNode->setOrientation(Quaternion(-0.3486, 0.0122, 0.9365, 0.0329));
52       
53        mCamNode->attachObject(mCamera);
54
55        //-- create visualization camera
56        mVizCamera = mSceneMgr->createCamera("VizCam");
57        mVizCamera->setPosition(mCamNode->getPosition());
58
59        mVizCamera->setNearClipDistance(1);
60        mCamera->setNearClipDistance(1);
61
62        // infinite far plane?
63        if (mRoot->getRenderSystem()->getCapabilities()->hasCapability(RSC_INFINITE_FAR_PLANE))
64        {
65                mVizCamera->setFarClipDistance(0);
66                mCamera->setFarClipDistance(0);
67        }
68        else
69        {
70                 mVizCamera->setFarClipDistance(1000);
71                 mCamera->setFarClipDistance(1000);
72        }       
73}
74
75//-----------------------------------------------------------------------
76bool TestCullingTerrainApplication::setup()
77{
78        bool result = ExampleApplication::setup();
79
80        createRenderTargetListener();
81
82        return result;
83}
84//-----------------------------------------------------------------------
85void TestCullingTerrainApplication::createRenderTargetListener()
86{
87        mWindow->addListener(new VisualizationRenderTargetListener(mSceneMgr));
88}
89//-----------------------------------------------------------------------
90void TestCullingTerrainApplication::createScene()
91{
92        // Set ambient light
93        mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));
94       
95        // Create a light
96        Light* l = mSceneMgr->createLight("MainLight");
97        // Accept default settings: point light, white diffuse, just set position
98        // NB I could attach the light to a SceneNode if I wanted it to move automatically with
99        // other objects, but I don't
100        l->setPosition(20,80,50);
101
102        // --Fog
103        // NB it's VERY important to set this before calling setWorldGeometry
104        // because the vertex program picked will be different
105        ColourValue fadeColour(0.93, 0.86, 0.76);
106        mWindow->getViewport(0)->setBackgroundColour(fadeColour);
107        //mSceneMgr->setFog( FOG_LINEAR, fadeColour, .001, 500, 1000);
108       
109        // Create a skybox
110        mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox", 5000, false);
111       
112        std::string terrain_cfg("terrain.cfg");
113#if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
114        terrain_cfg = mResourcePath + terrain_cfg;
115#endif
116        mSceneMgr->setWorldGeometry(terrain_cfg);
117       
118        //-- CEGUI setup
119        setupGui();
120
121        //-- terrain content setup
122
123        // HACK: necessary to call once before the content creation for
124        // terrain initialisation
125        mSceneMgr->_renderScene(mCamera, mWindow->getViewport(0), true);
126
127        mTerrainContentGenerator = new TerrainContentGenerator(mSceneMgr);
128        mTerrainContentGenerator->SetMaxPos(Vector3(3000.0f, 5000.0f, 3000.0f));
129
130        mTerrainContentGenerator->GenerateScene(1500, "robot.mesh");
131//      mTerrainContentGenerator->GenerateScene(500, "ninja.mesh");
132
133        // no limitations needed anymore: the user can set
134        // objects also on peaks of terrain
135        mTerrainContentGenerator->SetMaxHeight(5000);
136}
137//-----------------------------------------------------------------------
138void TestCullingTerrainApplication::setupGui()
139{
140         mGUIRenderer = new CEGUI::OgreCEGUIRenderer(mWindow, Ogre::RENDER_QUEUE_OVERLAY,
141                 false, 3000, ST_EXTERIOR_CLOSE);
142     mGUISystem = new CEGUI::System(mGUIRenderer);
143
144         // Mouse
145     CEGUI::SchemeManager::getSingleton().loadScheme((CEGUI::utf8*)"TaharezLook.scheme");
146     CEGUI::MouseCursor::getSingleton().setImage("TaharezLook", "MouseArrow");
147         mGUISystem->setDefaultMouseCursor(
148                (CEGUI::utf8*)"TaharezLook", (CEGUI::utf8*)"MouseArrow");
149
150         CEGUI::MouseCursor::getSingleton().show();
151}
152//-----------------------------------------------------------------------
153void TestCullingTerrainApplication::createFrameListener()
154{
155        mFrameListener= new MouseQueryListener(mWindow, mCamera, mSceneMgr,
156                mGUIRenderer, mTerrainContentGenerator, mVizCamera, mCamNode);
157        mFrameListener->showDebugOverlay(true);
158        mRoot->addFrameListener(mFrameListener);
159}
160//-----------------------------------------------------------------------
161void TestCullingTerrainApplication::chooseSceneManager()
162{
163        mSceneMgr = mRoot->getSceneManager(ST_EXTERIOR_CLOSE);
164}
165/***********************************************/
166/*      MouseQueryListener implementation      */
167/***********************************************/
168//-----------------------------------------------------------------------
169MouseQueryListener::MouseQueryListener(RenderWindow* win, Camera* cam,
170                                                                           SceneManager *sceneManager,
171                                                                           CEGUI::Renderer *renderer,
172                                                                           TerrainContentGenerator *sceneGenerator,
173                                                                           Camera *vizCamera,
174                                                                           SceneNode *camNode):
175ExampleFrameListener(win, cam, false, true),
176mGUIRenderer(renderer),
177mShutdownRequested(false),
178mLMouseDown(false),
179mRMouseDown(false),
180mSceneMgr(sceneManager),
181mCurrentObject(NULL),
182mTerrainContentGenerator(sceneGenerator),
183mVisibilityThreshold(0),
184mCurrentAlgorithm(GtpVisibility::VisibilityEnvironment::COHERENT_HIERARCHICAL_CULLING),
185mShowOctree(false),
186mUseVisibilityCulling(true),
187mUseOptimization(true),
188mVizCamera(vizCamera),
189mShowVisualization(false),
190mRenderNodesForViz(false),
191mVizCameraHeight(Real(2500.0)),
192mCamNode(camNode),
193mCullCamera(false)
194{
195        // Reduce move speed
196        mMoveSpeed = 50;
197        mRotateSpeed *= 2;
198   
199        // Register this so that we get mouse events.
200        mEventProcessor->addMouseListener(this);
201        mEventProcessor->addMouseMotionListener(this);
202        mEventProcessor->addKeyListener(this);
203
204        mRayQueryExecutor = new RayQueryExecutor(mSceneMgr);
205       
206        // show overlay
207        Overlay* pOver = OverlayManager::getSingleton().getByName("Example/VisibilityDemoOverlay");
208
209        mAlgorithmInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/AlgorithmInfo");
210        mThresholdInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/ThresholdInfo");
211       
212        mFrustumCulledNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/FrustumCulledNodesInfo");
213        mQueryCulledNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/QueryCulledNodesInfo");
214    mTraversedNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/TraversedNodesInfo");
215        mHierarchyNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/HierarchyNodesInfo");
216        mRenderedNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/RenderedNodesInfo");
217        mObjectsInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/ObjectsInfo");
218        mUseOptimizationInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/UseOptimizationInfo");
219        mQueriesIssuedInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/QueriesIssuedInfo");
220       
221        mAlgorithmInfo->setCaption(": " + mCurrentAlgorithmCaptions[mCurrentAlgorithm]);
222        mThresholdInfo->setCaption(": 0");
223        mFrustumCulledNodesInfo->setCaption(": 0");
224        mQueryCulledNodesInfo->setCaption(": 0");
225        mTraversedNodesInfo->setCaption(": 0");
226        mHierarchyNodesInfo->setCaption(": 0");
227        mRenderedNodesInfo->setCaption(": 0");
228        mObjectsInfo->setCaption(": 0");
229        mUseOptimizationInfo->setCaption(": true");
230        mQueriesIssuedInfo->setCaption(": 0");
231
232        setAlgorithm(mCurrentAlgorithm);
233
234        mSceneMgr->setOption("UseOptimization", &mUseOptimization);
235        mSceneMgr->setOption("UseVisibilityCulling", &mUseVisibilityCulling);
236        mSceneMgr->setOption("ShowOctree", &mShowOctree);
237        mSceneMgr->setOption("CullCamera", &mCullCamera);
238        mSceneMgr->setOption("ShowVisualization", &mShowVisualization);
239        mSceneMgr->setOption("RenderNodesForViz", &mRenderNodesForViz);
240
241        pOver->show();
242}
243//-----------------------------------------------------------------------
244MouseQueryListener::~MouseQueryListener()
245{
246        delete mRayQueryExecutor;
247}
248//-----------------------------------------------------------------------
249void MouseQueryListener::mouseMoved(MouseEvent *e)
250{
251        // Update CEGUI with the mouse motion
252    CEGUI::System::getSingleton().injectMouseMove(e->getRelX() *
253                mGUIRenderer->getWidth(), e->getRelY() * mGUIRenderer->getHeight());
254}
255//-----------------------------------------------------------------------
256void MouseQueryListener::mousePressed(MouseEvent* e)
257{
258     // Left mouse button down
259     if (e->getButtonID() & InputEvent::BUTTON0_MASK)
260     {
261                 CEGUI::MouseCursor::getSingleton().hide();
262
263                 // Setup the ray scene query
264         Ray mouseRay = mCamera->getCameraToViewportRay(e->getX(), e->getY());
265   
266                 Vector3 queryResult;
267                 
268                 // Get results, create a node/entity on the position
269                 mCurrentObject = mTerrainContentGenerator->GenerateSceneObject(
270                         mouseRay.getOrigin(), mouseRay.getDirection(), "robot.mesh");
271               
272         mLMouseDown = true;
273     }
274     // Right mouse button down
275     else if (e->getButtonID() & InputEvent::BUTTON1_MASK)
276     {
277         CEGUI::MouseCursor::getSingleton().hide();
278         mRMouseDown = true;
279     }
280} // mousePressed
281//-----------------------------------------------------------------------
282void MouseQueryListener::mouseReleased(MouseEvent* e)
283{
284    // Left mouse button up
285    if (e->getButtonID() & InputEvent::BUTTON0_MASK)
286    {
287                CEGUI::MouseCursor::getSingleton().show();
288        mLMouseDown = false;
289    }
290    // Right mouse button up
291    else if (e->getButtonID() & InputEvent::BUTTON1_MASK)
292    {
293        CEGUI::MouseCursor::getSingleton().show();
294        mRMouseDown = false;
295    }
296}
297//-----------------------------------------------------------------------
298void MouseQueryListener::mouseDragged(MouseEvent *e)
299 {
300         // If we are dragging the left mouse button.           
301         if (mLMouseDown)
302     {
303                 Vector3 queryResult;
304                 Ray mouseRay = mCamera->getCameraToViewportRay(e->getX(), e->getY());
305
306                 if (mRayQueryExecutor->executeRayQuery(&queryResult, mouseRay))
307                 {
308                         if (mCurrentObject)
309                         {
310                                 mCurrentObject->setPosition(queryResult);
311                         }
312                 }
313     }
314         // If we are dragging the right mouse button.
315         if (mRMouseDown)
316         {
317                 //mCamera->yaw(-e->getRelX() * mRotateSpeed);
318                 //mCamera->pitch(-e->getRelY() * mRotateSpeed);
319                 mCamNode->yaw(-e->getRelX() * mRotateSpeed);
320                 mCamNode->pitch(-e->getRelY() * mRotateSpeed);
321         }
322}
323//-----------------------------------------------------------------------
324bool MouseQueryListener::frameStarted(const FrameEvent &evt)
325{
326        clamp2Terrain();
327
328        if (mShowVisualization)
329        {
330                // important for visualization => draw octree bounding boxes
331                mSceneMgr->setOption("ShowOctree", &mShowVisualization);
332                // also render geometry?
333                mSceneMgr->setOption("RenderNodesForViz", &mRenderNodesForViz);
334
335                // -- setup visualization camera
336                mVizCamera->setPosition(0, 0, 0);
337                mVizCamera->setOrientation(Quaternion::IDENTITY);
338
339                Vector3 camPos = mCamNode->getPosition();
340                mVizCamera->setPosition(camPos.x, mVizCameraHeight, camPos.z);
341
342                // Point down -Z axis
343                mVizCamera->pitch(Radian(Degree(270.0)));
344       
345                // Rotation arounnd X axis
346                mVizCamera->yaw(Math::ATan2(-mCamera->getDerivedDirection().x,
347                        -mCamera->getDerivedDirection().z));
348        }
349
350        return ExampleFrameListener::frameStarted(evt);
351}
352//-----------------------------------------------------------------------
353void MouseQueryListener::clamp2Terrain()
354{
355        // clamp to terrain
356        Vector3 camPos = mCamNode->getPosition();
357        Vector3 queryResult;
358
359        if (mRayQueryExecutor->executeRayQuery(&queryResult,
360                        Vector3(camPos.x, 5000.0f, camPos.z), Vector3::NEGATIVE_UNIT_Y))
361        {
362                mCamNode->setPosition(camPos.x, queryResult.y + 10, camPos.z);
363        }
364}
365//-----------------------------------------------------------------------
366bool MouseQueryListener::frameEnded(const FrameEvent& evt)
367{
368        if (mShutdownRequested)
369                return false;
370
371    if (timeDelay >= 0)
372        timeDelay -= evt.timeSinceLastFrame;
373
374    KEY_PRESSED(KC_SPACE, 0.3, nextAlgorithm());
375
376        KEY_PRESSED(KC_O, 0.3, toggleUseOptimization());
377        KEY_PRESSED(KC_T, 0.3, toggleShowOctree());
378        KEY_PRESSED(KC_C, 0.3, toggleUseVisibilityCulling());
379        KEY_PRESSED(KC_1, 0.3, toggleShowViz());
380        KEY_PRESSED(KC_2, 0.3, toggleRenderNodesForViz());
381
382        if (!mShowVisualization)
383        {
384                KEY_PRESSED(KC_SUBTRACT, 0, changeThreshold(-10));
385                KEY_PRESSED(KC_ADD, 0, changeThreshold(10));
386        }
387        else
388        {
389                KEY_PRESSED(KC_SUBTRACT, 0, zoomVizCamera(50));
390                KEY_PRESSED(KC_ADD, 0, zoomVizCamera(-50));
391        }
392
393        updateStats();
394
395        return ExampleFrameListener::frameStarted(evt) && ExampleFrameListener::frameEnded(evt);
396}
397void MouseQueryListener::moveCamera()
398{
399        mCamNode->yaw(mRotX);
400        mCamNode->pitch(mRotY);
401        mCamNode->translate(mCamNode->getLocalAxes(), mTranslateVector);
402}
403//-----------------------------------------------------------------------
404void MouseQueryListener::changeThreshold(int incr)
405{
406        mVisibilityThreshold += incr;
407        if(mVisibilityThreshold < 0) mVisibilityThreshold = 0;
408       
409        char str[100]; sprintf(str,": %d", mVisibilityThreshold);
410
411        mSceneMgr->setOption("Threshold", &mVisibilityThreshold);
412        mThresholdInfo->setCaption(str);
413}
414//-----------------------------------------------------------------------
415bool MouseQueryListener::processUnbufferedKeyInput(const FrameEvent& evt)
416{   
417        if (mInputDevice->isKeyDown(KC_RIGHT))
418        {
419                mCamNode->yaw(-mRotScale);
420                return true;
421        }
422        if (mInputDevice->isKeyDown(KC_LEFT))
423        {
424                mCamNode->yaw(mRotScale);
425                return true;
426        }
427
428        return ExampleFrameListener::processUnbufferedKeyInput(evt);
429}
430//-----------------------------------------------------------------------
431void MouseQueryListener::zoomVizCamera(int zoom)
432{
433        mVizCameraHeight += zoom;
434        if(mVizCameraHeight < 0) mVizCameraHeight = 0;
435}
436//-----------------------------------------------------------------------
437void MouseQueryListener::nextAlgorithm()
438{
439        mCurrentAlgorithm = ++mCurrentAlgorithm %
440                GtpVisibility::VisibilityEnvironment::NUM_CULLING_MANAGERS,
441
442        setAlgorithm(mCurrentAlgorithm);
443}
444//-----------------------------------------------------------------------
445void MouseQueryListener::setAlgorithm(int algorithm)
446{
447        mAlgorithmInfo->setCaption(": " + mCurrentAlgorithmCaptions[mCurrentAlgorithm]);
448        mSceneMgr->setOption("Algorithm", &mCurrentAlgorithm);
449}
450//-----------------------------------------------------------------------
451void MouseQueryListener::updateStats()
452{
453        unsigned int opt = 0;
454        char str[100];
455       
456        mSceneMgr->getOption("NumFrustumCulledNodes", &opt); sprintf(str,": %d", opt);
457        mFrustumCulledNodesInfo->setCaption(str);
458       
459        mSceneMgr->getOption("NumQueriesIssued", &opt); sprintf(str,": %d", opt);
460        mQueriesIssuedInfo->setCaption(str);
461       
462        mSceneMgr->getOption("NumQueryCulledNodes", &opt); sprintf(str,": %d", opt);
463        mQueryCulledNodesInfo->setCaption(str);
464       
465        mSceneMgr->getOption("NumTraversedNodes", &opt); sprintf(str,": %d", opt);
466        mTraversedNodesInfo->setCaption(str);
467
468        mSceneMgr->getOption("NumHierarchyNodes", &opt); sprintf(str,": %d", opt);
469        mHierarchyNodesInfo->setCaption(str);
470
471        mSceneMgr->getOption("NumRenderedNodes", &opt); sprintf(str,": %d", opt);
472        mRenderedNodesInfo->setCaption(str);
473
474        sprintf(str,": %d", mTerrainContentGenerator->GetObjectCount());
475        mObjectsInfo->setCaption(str);
476}
477//-----------------------------------------------------------------------
478void MouseQueryListener::toggleUseOptimization()
479{
480        mUseOptimization = !mUseOptimization;
481
482        mSceneMgr->setOption("UseOptimization", &mUseOptimization);
483
484        if (mUseOptimization)
485                mUseOptimizationInfo->setCaption(": true");
486        else
487                mUseOptimizationInfo->setCaption(": false");
488}
489//-----------------------------------------------------------------------
490void MouseQueryListener::toggleShowOctree()
491{
492        mShowOctree = !mShowOctree;
493
494        mSceneMgr->setOption("ShowOctree", &mShowOctree);
495}
496//-----------------------------------------------------------------------
497void MouseQueryListener::toggleUseVisibilityCulling()
498{
499        mUseVisibilityCulling = !mUseVisibilityCulling;
500
501        mSceneMgr->setOption("UseVisibilityCulling", &mUseVisibilityCulling);
502}
503//-----------------------------------------------------------------------
504void MouseQueryListener::toggleShowViz()
505{
506        mShowVisualization = !mShowVisualization;
507
508        // create viewport with priority VIZ_VIEWPORT_Z_ORDER:
509        // will be rendered over standard viewport
510        if (mShowVisualization)
511        {       
512                Viewport *vizvp = mWindow->addViewport(mVizCamera,
513                        VIZ_VIEWPORT_Z_ORDER, 0.6, 0.6, 0.4, 0.4);
514                               
515                vizvp->setBackgroundColour(ColourValue(0.0, 0.3, 0.2, 1));
516
517                vizvp->setOverlaysEnabled(false);
518                // Alter the camera aspect ratio to match the viewport
519        mVizCamera->setAspectRatio(Real(vizvp->getActualWidth()) /
520                        Real(vizvp->getActualHeight()));
521                //vizvp->setClearEveryFrame(false);
522
523                // Create a skyplane (for visualization)
524                /*Plane plane;
525                plane.d = 1000;
526                plane.normal = Vector3::UNIT_Y;
527                mSceneMgr->setSkyPlane( true, plane, "Examples/Rockwall", 4000, 75, false);
528                */
529        }
530        else
531        {
532                mWindow->removeViewport(VIZ_VIEWPORT_Z_ORDER);
533                // if octree was enabled for visualization purpose
534                mSceneMgr->setOption("ShowOctree", &mShowOctree);
535        }
536}
537//-----------------------------------------------------------------------
538void MouseQueryListener::toggleRenderNodesForViz()
539{
540        mRenderNodesForViz = !mRenderNodesForViz;
541
542        mSceneMgr->setOption("RenderNodesForViz", &mRenderNodesForViz);
543}
544//-----------------------------------------------------------------------
545void MouseQueryListener::keyPressed(KeyEvent* e)
546{
547        if(e->getKey() == KC_ESCAPE)
548    {
549                mShutdownRequested = true;
550                e->consume();
551                return;
552        }
553
554        CEGUI::System::getSingleton().injectKeyDown(e->getKey());
555        CEGUI::System::getSingleton().injectChar(e->getKeyChar());
556        e->consume();
557}
558//-----------------------------------------------------------------------
559void MouseQueryListener::keyReleased(KeyEvent* e)
560{
561        CEGUI::System::getSingleton().injectKeyUp(e->getKey());
562        e->consume();
563}
564//-----------------------------------------------------------------------
565void MouseQueryListener::keyClicked(KeyEvent* e)
566{
567        // Do nothing
568        e->consume();
569}
570/**************************************************************/
571/*      VisualizationRenderTargetListener implementation      */
572/**************************************************************/
573VisualizationRenderTargetListener::VisualizationRenderTargetListener(SceneManager *sceneMgr)
574:RenderTargetListener(), mSceneMgr(sceneMgr)
575{
576}
577//-----------------------------------------------------------------------
578void VisualizationRenderTargetListener::preViewportUpdate(const RenderTargetViewportEvent &evt)
579{
580        const bool showViz = evt.source->getZOrder() == VIZ_VIEWPORT_Z_ORDER; // visualization viewport
581        const bool nShowViz = !showViz;
582
583    mSceneMgr->setOption("ShowVisualization", &showViz);
584        mSceneMgr->setOption("SkyBoxEnabled", &nShowViz);
585        //mSceneMgr->setOption("SkyPlaneEnabled", &showViz);
586       
587        RenderTargetListener::preViewportUpdate(evt);
588}
589//-----------------------------------------------------------------------
590void VisualizationRenderTargetListener::postRenderTargetUpdate(const RenderTargetEvent &evt)
591{
592        RenderTargetListener::postRenderTargetUpdate(evt);
593}
594//-----------------------------------------------------------------------
595INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
596{
597    // Create application object
598    TestCullingTerrainApplication app;
599
600        try
601        {
602        app.go();
603    }
604        catch( Ogre::Exception& e )
605        {
606        MessageBox( NULL, e.getFullDescription().c_str(),
607                        "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
608    }   
609
610    return 0;
611}
Note: See TracBrowser for help on using the repository browser.