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

Revision 160, 10.1 KB checked in by mattausch, 19 years ago (diff)

added animation

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
17String currentObjectCaptions[] =
18{
19        "robot",
20        "athene",
21        "ninja"
22        //"ogrehead"
23};
24
25/*********************************************************/
26/*      TestCullingTerrainApplication implementation     */
27/*********************************************************/
28
29
30TestCullingTerrainApplication::TestCullingTerrainApplication():
31mTerrainContentGenerator(NULL)
32{
33}
34//-----------------------------------------------------------------------
35TestCullingTerrainApplication::~TestCullingTerrainApplication()
36{
37        if (mTerrainContentGenerator)
38        {
39                delete mTerrainContentGenerator;
40                mTerrainContentGenerator = NULL;
41        }
42}
43//-----------------------------------------------------------------------
44void TestCullingTerrainApplication::createCamera()
45{
46        // create the camera
47        mCamera = mSceneMgr->createCamera("PlayerCam");
48       
49        /** set a nice viewpoint
50        *       we use a camera node here and apply all transformations on it instead
51        *       of applying all transformations directly to the camera
52        *       because then the camera is displayed correctly in the visualization
53        */
54        mCamNode = mSceneMgr->getRootSceneNode()->
55                createChildSceneNode("CamNode1", Vector3(707, 5000, 528));
56        //mCamera->setPosition(707, 5000, 528);
57        mCamNode->setOrientation(Quaternion(-0.3486, 0.0122, 0.9365, 0.0329));
58        mCamNode->attachObject(mCamera);
59
60        //-- create visualization camera
61        mVizCamera = mSceneMgr->createCamera("VizCam");
62        mVizCamera->setPosition(mCamNode->getPosition());
63
64        mVizCamera->setNearClipDistance(1);
65        mCamera->setNearClipDistance(1);
66
67        // infinite far plane?
68        if (mRoot->getRenderSystem()->getCapabilities()->hasCapability(RSC_INFINITE_FAR_PLANE))
69        {
70                mVizCamera->setFarClipDistance(0);
71                mCamera->setFarClipDistance(0);
72        }
73        else
74        {
75                 mVizCamera->setFarClipDistance(20000);
76                 mCamera->setFarClipDistance(20000);
77        }       
78}
79
80//-----------------------------------------------------------------------
81bool TestCullingTerrainApplication::setup()
82{
83        bool carryOn = ExampleApplication::setup();
84
85        if (carryOn)
86                createRenderTargetListener();
87
88        return carryOn;
89}
90//-----------------------------------------------------------------------
91void TestCullingTerrainApplication::createRenderTargetListener()
92{
93        mWindow->addListener(new VisualizationRenderTargetListener(mSceneMgr));
94}
95//-----------------------------------------------------------------------
96void TestCullingTerrainApplication::createScene()
97{
98        // Set ambient light
99        mAmbientLight = ColourValue(0.5, 0.5, 0.5);
100        mSceneMgr->setAmbientLight(mAmbientLight);
101       
102        //-- create light
103        mSunLight = mSceneMgr->createLight("SunLight");
104        mSunLight->setType(Light::LT_DIRECTIONAL);
105        //mSunLight->setType(Light::LT_SPOTLIGHT);
106        //mSunLight->setSpotlightRange(Degree(30), Degree(50));
107
108    mSunLight->setPosition(707, 2000, 500);
109        mSunLight->setCastShadows(true);
110
111        // set light angle not too sharp, otherwise shadows textures will be broken
112        Vector3 dir(0.5, 1, 0.5);
113        dir.normalise();
114        mSunLight->setDirection(dir);
115        //mSunLight->setDirection(Vector3::NEGATIVE_UNIT_Y);
116        mSunLight->setDiffuseColour(1, 1, 1);
117        mSunLight->setSpecularColour(1, 1, 1);
118
119        // -- Fog
120        // NB it's VERY important to set this before calling setWorldGeometry
121        // because the vertex program picked will be different
122        ColourValue fadeColour(0.93, 0.86, 0.76);
123        mWindow->getViewport(0)->setBackgroundColour(fadeColour);
124        //mSceneMgr->setFog( FOG_LINEAR, fadeColour, .001, 500, 1000);
125       
126        // Create a skybox
127        mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox", 5000, false);
128       
129        std::string terrain_cfg("terrain.cfg");
130#if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
131        terrain_cfg = mResourcePath + terrain_cfg;
132#endif
133        mSceneMgr->setWorldGeometry(terrain_cfg);
134       
135        //-- CEGUI setup
136        setupGui();
137
138        /* // occluder plane to test visibility
139        Plane plane; plane.normal = Vector3::UNIT_Y;    plane.d = -60;
140        MeshManager::getSingleton().createPlane("Myplane",
141                ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane,
142                5000,5000,100,100,true,1,5,5,Vector3::UNIT_Z);
143        Entity* pPlaneEnt = mSceneMgr->createEntity( "plane", "Myplane" );
144        pPlaneEnt->setMaterialName("Examples/Rockwall");
145        pPlaneEnt->setCastShadows(true);
146        mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(pPlaneEnt); */
147
148        mSceneMgr->setShadowTextureSettings(1024, 2);
149        mSceneMgr->setShadowColour(ColourValue(0.5, 0.5, 0.5));
150   
151
152        //-- terrain content setup
153
154        // HACK: necessary to call once before the content creation for
155        // terrain initialisation
156        mSceneMgr->_renderScene(mCamera, mWindow->getViewport(0), true);
157
158        mTerrainContentGenerator = new TerrainContentGenerator(mSceneMgr);
159       
160        // if no objects in file, we generate new objects
161        if (!mTerrainContentGenerator->LoadObjects("objects.out"))
162        {
163                // to provide much occlusion,
164                // height is restricted to 50 => no objects appear on peaks
165                mTerrainContentGenerator->SetMaxPos(Vector3(3000.0f, 50.0f, 3000.0f));
166                mTerrainContentGenerator->SetOffset(0);
167
168                // the objects are generated randomly distributed over the terrain
169                generateScene(1500, 0);
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::generateScene(int num, int objectType)
178{
179        mTerrainContentGenerator->GenerateScene(num, currentObjectCaptions[objectType]);
180
181        if (objectType != 0) // from our objects, only robot has animation phases
182                return;
183
184        EntityList *entList = mTerrainContentGenerator->GetGeneratedEntities();
185
186        //-- add animation state for new robots (located at the end of the list)
187        for (int i = entList->size() - num; i < entList->size(); ++i)
188        {
189                Entity *ent = (*entList)[i];
190                AnimationState *st = ent->getAnimationState("Idle");
191                st->setEnabled(true);
192                st->setLoop(true);
193
194                mAnimationStates.push_back(st);
195                mAnimationSpeed.push_back(Math::RangeRandom(0.5, 1.5));
196        }
197}
198//-----------------------------------------------------------------------
199std::vector<AnimationState *> &TestCullingTerrainApplication::getAnimationStates()
200{
201        return mAnimationStates;
202}
203//-----------------------------------------------------------------------
204std::vector<Real> &TestCullingTerrainApplication::getAnimationSpeed()
205{
206        return mAnimationSpeed;
207}
208//-----------------------------------------------------------------------
209void TestCullingTerrainApplication::setupGui()
210{
211         mGUIRenderer = new CEGUI::OgreCEGUIRenderer(mWindow, Ogre::RENDER_QUEUE_OVERLAY,
212                 false, 3000, ST_EXTERIOR_CLOSE);
213     mGUISystem = new CEGUI::System(mGUIRenderer);
214
215         // Mouse
216     CEGUI::SchemeManager::getSingleton().loadScheme((CEGUI::utf8*)"TaharezLook.scheme");
217     CEGUI::MouseCursor::getSingleton().setImage("TaharezLook", "MouseArrow");
218         mGUISystem->setDefaultMouseCursor((CEGUI::utf8*)"TaharezLook",
219                                                                           (CEGUI::utf8*)"MouseArrow");
220
221         CEGUI::MouseCursor::getSingleton().show();
222}
223//-----------------------------------------------------------------------
224void TestCullingTerrainApplication::createFrameListener()
225{
226        mTerrainFrameListener = new TerrainFrameListener(mWindow, mCamera, mSceneMgr,
227                mGUIRenderer, mTerrainContentGenerator, mVizCamera, mCamNode, mSunLight, this);
228       
229        mRoot->addFrameListener(mTerrainFrameListener);
230}
231//-----------------------------------------------------------------------
232String TestCullingTerrainApplication::getCurrentObjectCaption(int id)
233{
234        return currentObjectCaptions[id];
235}
236//-----------------------------------------------------------------------
237void TestCullingTerrainApplication::chooseSceneManager()
238{
239        mSceneMgr = mRoot->getSceneManager(ST_EXTERIOR_CLOSE);
240}
241/**************************************************************/
242/*      VisualizationRenderTargetListener implementation      */
243/**************************************************************/
244//-----------------------------------------------------------------------
245VisualizationRenderTargetListener::VisualizationRenderTargetListener(SceneManager *sceneMgr)
246:RenderTargetListener(), mSceneMgr(sceneMgr)
247{
248}
249//-----------------------------------------------------------------------
250void VisualizationRenderTargetListener::preViewportUpdate(const RenderTargetViewportEvent &evt)
251{
252        // visualization viewport
253        const bool showViz = evt.source->getZOrder() == VIZ_VIEWPORT_Z_ORDER;
254        const bool nShowViz = !showViz;
255
256        mSavedShadowTechnique = mSceneMgr->getShadowTechnique();
257        mSavedAmbientLight = mSceneMgr->getAmbientLight();
258
259        // -- ambient light must be full for visualization, shadows disabled
260    if (showViz)
261        {
262                mSceneMgr->setAmbientLight(ColourValue(1, 1, 1));
263                mSceneMgr->setShadowTechnique(SHADOWTYPE_NONE);
264        }
265       
266    mSceneMgr->setOption("PrepareVisualization", &showViz);
267        mSceneMgr->setOption("SkyBoxEnabled", &nShowViz);
268        //mSceneMgr->setOption("SkyPlaneEnabled", &showViz);
269       
270        RenderTargetListener::preViewportUpdate(evt);
271}
272//-----------------------------------------------------------------------
273void VisualizationRenderTargetListener::postRenderTargetUpdate(const RenderTargetEvent &evt)
274{
275        // reset values
276        mSceneMgr->setShadowTechnique(mSavedShadowTechnique);
277        mSceneMgr->setAmbientLight(mSavedAmbientLight);
278       
279        RenderTargetListener::postRenderTargetUpdate(evt);
280}
281//-----------------------------------------------------------------------
282INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
283{
284    // Create application object
285    TestCullingTerrainApplication app;
286
287        try
288        {
289        app.go();
290    }
291        catch( Ogre::Exception& e )
292        {
293        MessageBox( NULL, e.getFullDescription().c_str(),
294                        "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
295    }   
296
297    return 0;
298}
Note: See TracBrowser for help on using the repository browser.