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

Revision 121, 8.8 KB checked in by mattausch, 19 years ago (diff)
Line 
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>
7
8#include <Ogre.h>
9//#include "OgreReferenceAppLayer.h"
10//#include "OgreRefAppWorld.h"
11#include "TestCullingTerrainApplication.h"
12
13
14#define WIN32_LEAN_AND_MEAN
15#include <windows.h>
16
17/*******************************************************/
18/*     TestCullingTerrainApplication implementation    */
19/*******************************************************/
20
21//-----------------------------------------------------------------------
22TestCullingTerrainApplication::~TestCullingTerrainApplication()
23{
24        if(mTerrainContentGenerator)
25                delete mTerrainContentGenerator;
26        //if(mRenderTargetListener)     delete mRenderTargetListener;
27}
28//-----------------------------------------------------------------------
29void TestCullingTerrainApplication::createCamera()
30{
31        // create the camera
32        mCamera = mSceneMgr->createCamera("PlayerCam");
33       
34        /** set a nice viewpoint
35        *       we use a camera node here and apply all transformations on it instead
36        *       of applying all transformations directly to the camera
37        *       because then the camera is displayed correctly in the visualization
38        */
39        mCamNode = mSceneMgr->getRootSceneNode()->createChildSceneNode(
40                "CamNode1", Vector3(707, 5000, 528));
41        //mCamera->setPosition(707, 5000, 528);
42        mCamNode->setOrientation(Quaternion(-0.3486, 0.0122, 0.9365, 0.0329));
43        mCamNode->attachObject(mCamera);
44
45        //-- create visualization camera
46        mVizCamera = mSceneMgr->createCamera("VizCam");
47        mVizCamera->setPosition(mCamNode->getPosition());
48
49        mVizCamera->setNearClipDistance(1);
50        mCamera->setNearClipDistance(1);
51
52        // infinite far plane?
53        if (mRoot->getRenderSystem()->getCapabilities()->hasCapability(RSC_INFINITE_FAR_PLANE))
54        {
55                mVizCamera->setFarClipDistance(0);
56                mCamera->setFarClipDistance(0);
57        }
58        else
59        {
60                 mVizCamera->setFarClipDistance(20000);
61                 mCamera->setFarClipDistance(20000);
62        }       
63}
64
65//-----------------------------------------------------------------------
66bool TestCullingTerrainApplication::setup()
67{
68        bool result = ExampleApplication::setup();
69
70        createRenderTargetListener();
71
72        return result;
73}
74//-----------------------------------------------------------------------
75void TestCullingTerrainApplication::createRenderTargetListener()
76{
77        mWindow->addListener(new VisualizationRenderTargetListener(mSceneMgr));
78}
79//-----------------------------------------------------------------------
80void TestCullingTerrainApplication::createScene()
81{
82        // Set ambient light
83        mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));
84       
85        //-- create light
86        mSunLight = mSceneMgr->createLight("SunLight");
87        mSunLight->setType(Light::LT_DIRECTIONAL);
88        //mSunLight->setType(Light::LT_SPOTLIGHT);
89        //mSunLight->setSpotlightRange(Degree(30), Degree(50));
90
91    mSunLight->setPosition(707, 2000, 500);
92        mSunLight->setCastShadows(true);
93
94        Vector3 dir(0.5, 1, 0.5);
95        dir.normalise();
96        mSunLight->setDirection(dir);
97        //mSunLight->setDirection(Vector3::NEGATIVE_UNIT_Y);
98
99        mSunLight->setDiffuseColour(1, 1, 1);
100        mSunLight->setSpecularColour(1, 1, 1);
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        // Floor plane
122        /*
123        Plane plane;
124        plane.normal = Vector3::UNIT_Y;
125        plane.d = -60;
126        MeshManager::getSingleton().createPlane("Myplane",
127                ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane,
128                5000,5000,100,100,true,1,5,5,Vector3::UNIT_Z);
129        Entity* pPlaneEnt = mSceneMgr->createEntity( "plane", "Myplane" );
130        pPlaneEnt->setMaterialName("Examples/Rockwall");
131        pPlaneEnt->setCastShadows(true);
132        mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(pPlaneEnt);
133        */
134
135        if (mRoot->getRenderSystem()->getCapabilities()->hasCapability(RSC_HWRENDER_TO_TEXTURE))
136    {
137                // In D3D, use a 1024x1024 shadow texture
138                mSceneMgr->setShadowTextureSettings(1024, 2);
139        }
140        else
141        {
142                // Use 512x512 texture in GL since we can't go higher than the window res
143                mSceneMgr->setShadowTextureSettings(512, 2);
144        }
145        //mSceneMgr->setShadowColour(ColourValue(0, 0, 0));
146        mSceneMgr->setShadowColour(ColourValue(0.5, 0.5, 0.5));
147    // mSceneMgr->setShowDebugShadows(true);
148
149
150        //-- terrain content setup
151
152        // HACK: necessary to call once before the content creation for
153        // terrain initialisation
154        mSceneMgr->_renderScene(mCamera, mWindow->getViewport(0), true);
155
156        mTerrainContentGenerator = new TerrainContentGenerator(mSceneMgr);
157       
158        // if no objects file generate yourself
159        if (!mTerrainContentGenerator->LoadObjects("objects.out"))
160        {
161                // height is restricted to 50, so no objects appear on peaks
162                // => there is much occlusion
163                mTerrainContentGenerator->SetMaxPos(Vector3(3000.0f, 50.0f, 3000.0f));
164                mTerrainContentGenerator->SetOffset(0);
165
166                // the objects are generated on the whole terrain
167                mTerrainContentGenerator->GenerateScene(1500, "robot");
168                //mTerrainContentGenerator->GenerateScene(1500, "athene");
169                //mTerrainContentGenerator->GenerateScene(500, "ninja");
170        }
171
172        // no limitations needed anymore: the user can set
173        // objects also on peaks of terrain
174        mTerrainContentGenerator->SetMaxPos(Vector3(3000.0f, 5000.0f, 3000.0f));
175}
176//-----------------------------------------------------------------------
177void TestCullingTerrainApplication::setupGui()
178{
179         mGUIRenderer = new CEGUI::OgreCEGUIRenderer(mWindow, Ogre::RENDER_QUEUE_OVERLAY,
180                 false, 3000, ST_EXTERIOR_CLOSE);
181     mGUISystem = new CEGUI::System(mGUIRenderer);
182
183         // Mouse
184     CEGUI::SchemeManager::getSingleton().loadScheme((CEGUI::utf8*)"TaharezLook.scheme");
185     CEGUI::MouseCursor::getSingleton().setImage("TaharezLook", "MouseArrow");
186         mGUISystem->setDefaultMouseCursor(
187                (CEGUI::utf8*)"TaharezLook", (CEGUI::utf8*)"MouseArrow");
188
189         CEGUI::MouseCursor::getSingleton().show();
190}
191//-----------------------------------------------------------------------
192void TestCullingTerrainApplication::createFrameListener()
193{
194        mTerrainFrameListener = new TerrainMouseQueryListener(mWindow, mCamera, mSceneMgr,
195                mGUIRenderer, mTerrainContentGenerator, mVizCamera, mCamNode, mSunLight);
196       
197        mRoot->addFrameListener(mTerrainFrameListener);
198}
199//-----------------------------------------------------------------------
200void TestCullingTerrainApplication::chooseSceneManager()
201{
202        mSceneMgr = mRoot->getSceneManager(ST_EXTERIOR_CLOSE);
203}
204
205
206/**************************************************************/
207/*      VisualizationRenderTargetListener implementation      */
208/**************************************************************/
209//-----------------------------------------------------------------------
210VisualizationRenderTargetListener::VisualizationRenderTargetListener(SceneManager *sceneMgr)
211:RenderTargetListener(), mSceneMgr(sceneMgr)
212{
213}
214//-----------------------------------------------------------------------
215void VisualizationRenderTargetListener::preViewportUpdate(const RenderTargetViewportEvent &evt)
216{
217        const bool showViz = evt.source->getZOrder() == VIZ_VIEWPORT_Z_ORDER; // visualization viewport
218        const bool nShowViz = !showViz;
219
220        // ambient light must be full for visualization
221    if (showViz)
222        {
223                mSceneMgr->setAmbientLight(ColourValue(1, 1, 1));
224        }
225        else
226        {
227                mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));
228        }
229
230    mSceneMgr->setOption("ShowVisualization", &showViz);
231        mSceneMgr->setOption("SkyBoxEnabled", &nShowViz);
232        //mSceneMgr->setOption("SkyPlaneEnabled", &showViz);
233       
234        RenderTargetListener::preViewportUpdate(evt);
235}
236//-----------------------------------------------------------------------
237void VisualizationRenderTargetListener::postRenderTargetUpdate(const RenderTargetEvent &evt)
238{
239        RenderTargetListener::postRenderTargetUpdate(evt);
240}
241//-----------------------------------------------------------------------
242INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
243{
244    // Create application object
245    TestCullingTerrainApplication app;
246
247        try
248        {
249        app.go();
250    }
251        catch( Ogre::Exception& e )
252        {
253        MessageBox( NULL, e.getFullDescription().c_str(),
254                        "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
255    }   
256
257    return 0;
258}
Note: See TracBrowser for help on using the repository browser.