source: GTP/trunk/App/Demos/Illum/Ogre/src/Moria/include/Moria.h @ 2418

Revision 2418, 16.7 KB checked in by szirmay, 17 years ago (diff)
Line 
1/*
2-----------------------------------------------------------------------------
3This source file is part of OGRE
4    (Object-oriented Graphics Rendering Engine)
5For the latest info, see http://www.ogre3d.org/
6
7Copyright (c) 2000-2005 The OGRE Team
8Also see acknowledgements in Readme.html
9
10You may use this sample code for anything you like, it is not covered by the
11LGPL like the rest of the engine.
12-----------------------------------------------------------------------------
13*/
14
15/**
16    \file
17        Lighting.h
18    \brief
19        Shows lighting support in OGRE. Also demonstrates the use of billboards
20        and controllers for automatic time-relative behaviour.
21*/
22
23
24#include "ExampleApplication.h"
25#include "OgreIlluminationManager.h"
26#include "NXOgre.h"
27#include "SceneSerializer.h"
28#include "FPSPlayer.h"
29
30AnimationState* mAnimState = 0;
31bool cullCamera = true;
32Body *throwSphere = 0;
33Scene* NXScene = 0;
34FPSPlayer* gFPSPlayer;
35
36bool PP_glowON = true;
37bool PP_tonemapON = true;
38bool PP_dofON = true;
39
40Real lightpower = 32.0;
41Real glowCut = 50.6;
42Real glowTimeBlur = 0.6;
43Real glowStrech = 1.8;
44Real glowCombine = 0.5;
45// Listener class for frame updates
46class MoriaDemoFrameListener : public ExampleFrameListener
47{
48protected:
49       
50        unsigned long framecount;
51        SceneNode* mainLightNode;
52        Light* light;
53        SceneNode* sysNode;
54       
55public:
56    MoriaDemoFrameListener(RenderWindow* window, Camera* maincam, SceneNode* lightNode, Light* l, SceneNode* sysNode)
57        :ExampleFrameListener(window, maincam)
58                                 
59    {
60                mainLightNode = lightNode;
61                light = l;
62                framecount = 0;
63                mMoveSpeed /= 50.0;
64                this->sysNode = sysNode;
65
66    }
67
68    bool frameStarted(const FrameEvent& evt)
69    {   
70                float thisTime = (float) Root::getSingleton().getTimer()->getMilliseconds() / 2000.0f;
71                thisTime= 0;
72                //mainLightNode->setPosition(Vector3(2*cos(thisTime), 2, 2 * sin(thisTime)) + Vector3(5, 0, 5));
73                Vector3 pos = light->getDerivedPosition();
74                pos.normalise();
75                pos *= -1;
76                //light->setDirection( pos);
77               
78                framecount++;
79         
80//          mAnimState->addTime(evt.timeSinceLastFrame * 1.0); 
81               
82
83                //sysNode->setPosition(mCamera->getPosition() - Vector3(0,1.5,0));
84                //sysNode->setPosition(FPSPlayer::thePlayer->getPosition() - Vector3(0,1.5,0));
85
86        return ExampleFrameListener::frameStarted(evt);     
87    }
88
89        bool processUnbufferedKeyInput(const FrameEvent& evt)
90    {
91                gFPSPlayer->processKeyInputs(mInputDevice);
92               
93                if (mInputDevice->isKeyDown(KC_ADD) && mTimeUntilNextToggle <= 0)
94                {
95                        if (mInputDevice->isKeyDown(KC_RSHIFT))
96                                lightpower /= 1.2;
97                        else
98                                lightpower *= 1.2;
99                        light->setPowerScale(lightpower);
100                        mTimeUntilNextToggle = 0.2;
101                                mWindow->setDebugText(String("LightPower ") + StringConverter::toString(lightpower));
102                }
103                if (mInputDevice->isKeyDown(KC_SUBTRACT) && mTimeUntilNextToggle <= 0)
104                {
105                        if (mInputDevice->isKeyDown(KC_RSHIFT))
106                                glowCut /= 1.2;
107                        else
108                                glowCut *= 1.2;
109                        Ogre::Material* m = (Ogre::Material*) MaterialManager::getSingleton().getByName("GTP/Moria/PostProc/GlowCut").getPointer();
110                        m->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->setNamedConstant("cutValue",glowCut);
111                        mTimeUntilNextToggle = 0.2;
112                        mWindow->setDebugText(String("GlowCut ") + StringConverter::toString(glowCut));
113                }
114                if (mInputDevice->isKeyDown(KC_MULTIPLY) && mTimeUntilNextToggle <= 0)
115                {
116                        if (mInputDevice->isKeyDown(KC_RSHIFT))
117                                glowTimeBlur /= 1.2;
118                        else
119                                glowTimeBlur *= 1.2;
120                        Ogre::Material* m = (Ogre::Material*) MaterialManager::getSingleton().getByName("GTP/Moria/PostProc/GlowCut").getPointer();
121                        m->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->setNamedConstant("timeBlur", glowTimeBlur);
122                        mTimeUntilNextToggle = 0.2;
123                        mWindow->setDebugText(String("GlowTimeBlur ") + StringConverter::toString(glowTimeBlur));
124                }
125                if (mInputDevice->isKeyDown(KC_M))
126                {
127                        if (mInputDevice->isKeyDown(KC_RSHIFT))
128                                glowStrech -= 0.01;
129                        else
130                                glowStrech += 0.01;
131                        Ogre::Material* m = (Ogre::Material*) MaterialManager::getSingleton().getByName("GTP/Moria/PostProc/GlowBlurH").getPointer();
132                        m->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->setNamedConstant("Stretch", glowStrech);
133                        m = (Ogre::Material*) MaterialManager::getSingleton().getByName("GTP/Moria/PostProc/GlowBlurV").getPointer();
134                        m->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->setNamedConstant("Stretch", glowStrech);
135                        mWindow->setDebugText(String("GlowStretch ") + StringConverter::toString(glowStrech));
136                }
137                if (mInputDevice->isKeyDown(KC_N))
138                {
139                        if (mInputDevice->isKeyDown(KC_RSHIFT))
140                                glowCombine -= 0.01;
141                        else
142                                glowCombine += 0.01;
143                        Ogre::Material* m = (Ogre::Material*) MaterialManager::getSingleton().getByName("GTP/Moria/GlowFinalCombine").getPointer();
144                        m->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->setNamedConstant("weight2", glowCombine);
145                        mTimeUntilNextToggle = 0.2;
146                        mWindow->setDebugText(String("GlowCombine ") + StringConverter::toString(glowCombine));
147                }
148
149                if (mInputDevice->isKeyDown(KC_3) && mTimeUntilNextToggle <= 0)
150                {
151                        PP_glowON = !PP_glowON;
152                        CompositorManager::getSingleton().setCompositorEnabled(mWindow->getViewport(0),
153                                                                                                                "GTP/Moria/PostProc/Glow", PP_glowON);
154                        mTimeUntilNextToggle = 0.2;
155                }
156                if (mInputDevice->isKeyDown(KC_4) && mTimeUntilNextToggle <= 0)
157                {
158                        PP_tonemapON = !PP_tonemapON;
159
160                        CompositorManager::getSingleton().setCompositorEnabled(mWindow->getViewport(0),
161                                                                                                                "GTP/PostProc/ToneMap", PP_tonemapON);
162                       
163                        mTimeUntilNextToggle = 0.2;
164                }
165                if (mInputDevice->isKeyDown(KC_5) && mTimeUntilNextToggle <= 0)
166                {
167                        PP_dofON = !PP_dofON;
168                        CompositorManager::getSingleton().setCompositorEnabled(mWindow->getViewport(0),
169                                                                                                                "GTP/Moria/PostProc/DoF", PP_dofON);
170                        mTimeUntilNextToggle = 0.2;
171                }
172
173                if (mInputDevice->isKeyDown(KC_I))
174                {
175                        light->getParentSceneNode()->setPosition(
176                                light->getParentSceneNode()->getPosition()
177                                + Vector3(0.2,0,0));
178                }
179                if (mInputDevice->isKeyDown(KC_K))
180                {
181                        light->getParentSceneNode()->setPosition(
182                                light->getParentSceneNode()->getPosition()
183                                + Vector3(-0.2,0,0));
184                }
185                if (mInputDevice->isKeyDown(KC_J))
186                {
187                        light->getParentSceneNode()->setPosition(
188                                light->getParentSceneNode()->getPosition()
189                                + Vector3(0,0,0.2));
190                }
191                if (mInputDevice->isKeyDown(KC_L))
192                {
193                        light->getParentSceneNode()->setPosition(
194                                light->getParentSceneNode()->getPosition()
195                                + Vector3(0,0,-0.2));
196                }
197               
198       
199               
200        //      return ExampleFrameListener::processUnbufferedKeyInput(evt);
201
202                if( mInputDevice->isKeyDown( KC_ESCAPE) )
203        {           
204            return false;
205        }
206                if (mInputDevice->isKeyDown(KC_F) && mTimeUntilNextToggle <= 0)
207        {
208            mStatsOn = !mStatsOn;
209            showDebugOverlay(mStatsOn);
210
211            mTimeUntilNextToggle = 1;
212        }
213                if (mInputDevice->isKeyDown(KC_SYSRQ) && mTimeUntilNextToggle <= 0)
214        {
215                        char tmp[20];
216                        sprintf(tmp, "screenshot_%d.png", ++mNumScreenShots);
217            mWindow->writeContentsToFile(tmp);
218            mTimeUntilNextToggle = 0.5;
219                        mWindow->setDebugText(String("Wrote ") + tmp);
220        }
221                return true;
222        }
223
224        bool processUnbufferedMouseInput(const FrameEvent& evt)
225        {
226                gFPSPlayer->processMouseInputs(mInputDevice);
227//              return ExampleFrameListener::processUnbufferedMouseInput(evt);
228                return true;
229        }
230};
231
232/** Application class */
233class MoriaDemoApplication : public ExampleApplication
234{
235
236
237
238
239protected:
240        SceneNode* kupolaNode;
241        SceneNode* mainLightNode;
242        Light* mainLight;
243        SceneNode *pSysNode;
244       
245        void loadResources(void)
246        {
247                // Initialise, parse scripts etc
248                ResourceGroupManager::getSingleton().initialiseResourceGroup("Bootstrap");
249                ResourceGroupManager::getSingleton().initialiseResourceGroup("GTP_Basic");
250                ResourceGroupManager::getSingleton().initialiseResourceGroup("General");
251                ResourceGroupManager::getSingleton().initialiseResourceGroup("GTP_EnvMap");
252                ResourceGroupManager::getSingleton().initialiseResourceGroup("PostProc");
253                ResourceGroupManager::getSingleton().initialiseResourceGroup("GTP_Particles");
254                ResourceGroupManager::getSingleton().initialiseResourceGroup("GTP_PathMap");
255                ResourceGroupManager::getSingleton().initialiseResourceGroup("GTP_Moria");             
256                //ResourceGroupManager::getSingleton().initialiseResourceGroup("GTP_Caustic");
257        }
258
259        void createPostproc()
260        {               
261               
262                CompositorManager::getSingleton().addCompositor(mWindow->getViewport(0),
263                                                                                                                "GTP/Moria/PostProc/DoF");
264                CompositorManager::getSingleton().setCompositorEnabled(mWindow->getViewport(0),
265                                                                                                                "GTP/Moria/PostProc/DoF", true);
266
267                CompositorManager::getSingleton().addCompositor(mWindow->getViewport(0),
268                                                                                                                "GTP/Moria/PostProc/Glow");
269                CompositorManager::getSingleton().setCompositorEnabled(mWindow->getViewport(0),
270                                                                                                                "GTP/Moria/PostProc/Glow", true);
271
272               
273                        CompositorManager::getSingleton().addCompositor(mWindow->getViewport(0),
274                                                                                                                "GTP/PostProc/ToneMap");
275                CompositorManager::getSingleton().setCompositorEnabled(mWindow->getViewport(0),
276                                                                                                                "GTP/PostProc/ToneMap", true); 
277
278
279
280       
281               
282
283                /*
284                CompositorManager::getSingleton().addCompositor(mWindow->getViewport(0),
285                                                                                                                "GTP/PostProc/MotionBlur");
286                CompositorManager::getSingleton().setCompositorEnabled(mWindow->getViewport(0),
287                                                                                                                "GTP/PostProc/MotionBlur", true);       */
288               
289        }
290   
291        void chooseSceneManager()
292        {
293                mSceneMgr = mRoot->createSceneManager("OctreeSceneManager");
294                //mSceneMgr = mRoot->createSceneManager("OcclusionCullingSceneManager");
295        }
296
297        void createScene(void) ///TOWERS
298    {
299                std::string occlusion_cfg("OcclusionCulling.cfg");
300                //mSceneMgr->setWorldGeometry(occlusion_cfg);
301               
302                createPostproc();
303
304                OgreIlluminationManager::getSingleton().setMainCamera(mCamera);
305                OgreIlluminationManager::getSingleton().setMainViewport(mWindow->getViewport(0));
306                 OgreIlluminationManager::getSingleton().setFocusingSM(false);
307           OgreIlluminationManager::getSingleton().setShadowMapSize(128);
308           OgreIlluminationManager::getSingleton().setBlurShadowMap(true);
309           OgreIlluminationManager::getSingleton().setShadowMapMaterialName(Light::LT_SPOTLIGHT, "GTP/Basic/Distance_Normalized");//GameTools/ShadowMapDistance
310           OgreIlluminationManager::getSingleton().setShadowMapMaterialName(Light::LT_POINT, "GTP/Basic/Distance_Normalized");
311           OgreIlluminationManager::getSingleton().setUseLISPSM(false);
312           OgreIlluminationManager::getSingleton().joinSharedRuns(false);
313                               
314                Root::getSingleton()._setCurrentSceneManager(mSceneMgr);
315                //mCamera->setPosition(-20,3,0);
316                //mCamera->setPosition(0,100,0);
317                //mCamera->lookAt(0,-1,0);
318                mCamera->setFOVy(Radian(Degree(100)));
319                mCamera->setNearClipDistance(0.001);
320                mCamera->setFarClipDistance(150);
321                // Set ambient light
322        mSceneMgr->setAmbientLight(ColourValue(0.1, 0.1, 0.1));
323                mSceneMgr->setSkyBox(true, "Examples/EveningSkyBox", 500);
324               
325                SceneNode* rootNode = mSceneMgr->getRootSceneNode();
326               
327                SceneSerializer s(mSceneMgr);
328                DataStreamPtr inputStream;                             
329                inputStream = ResourceGroupManager::getSingleton().openResource("moria.level"); //towers2.level
330                World* NXWorld = new World("FrameListener: no, log: html");
331                NXWorld->getPhysXDriver()->createFrameListener(25);
332                NXScene = NXWorld->createScene("Main", mSceneMgr, "gravity: yes, floor: no");
333                s.setScene(NXScene);
334                s.setWorld(NXWorld);
335                s.parseScript(inputStream, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
336                s.parseEntryPoints("prmEntryPoints.text");
337
338                NXScene->createActor("FakeFloor", new CubeShape(100,2,100), Vector3(0,-1,0), "static: yes");
339               
340/*
341                Body* b = NXScene->createBody("ize",
342                                                        "sphere.mesh",
343                                                        new SphereShape(0.5f),
344                                                        Vector3(5,0,5),
345                                                        "mass: 10");
346                b->getNode()->setScale(0.005,0.005,0.005);
347                b->setGlobalPosition(Vector3(5,10,5));*/
348
349/*
350           ParticleSystem* pSys1 = mSceneMgr->createParticleSystem("psys1", "GTP/Moria/Smoke_Large");
351           pSys1->setKeepParticlesInLocalSpace(false);
352           SceneNode *pSysNode = rootNode->createChildSceneNode("psys1");
353           pSysNode->attachObject(pSys1);
354           pSysNode->setPosition(-40,-1,-15);*/
355               
356           /*Entity* object = mSceneMgr->createEntity("object", "head.mesh");
357                object->setMaterialName("GTP/Caustic/Glass");
358                SceneNode* objectNode = rootNode->createChildSceneNode();
359                objectNode->attachObject(object);
360                objectNode->scale(0.1,0.1,0.1);
361                objectNode->rotate(Vector3(0,1,0),Radian(0.2));
362                objectNode->setPosition(-30,2.0,-5);
363                objectNode->_updateBounds();*/
364                       
365                //createPlane("p","groundmaterial",Vector3(0,-0.3,0),Vector2(150,150));
366
367                mainLight = mSceneMgr->createLight("MainLight");
368                mainLight->setType(Light::LT_POINT);
369                mainLight->setCastShadows(true);
370        mainLight->setDiffuseColour(ColourValue::White);
371                mainLight->setSpecularColour(ColourValue::White);
372                mainLightNode = rootNode->createChildSceneNode();
373               
374                mainLightNode->setPosition(15,5,15);           
375                mainLight->setPowerScale(165);
376                //mainLight->setDirection(1,0, 0);
377                mainLightNode->attachObject(mainLight);
378                //mainLight->setSpotlightRange(Degree(0),Degree(120));
379                mainLight->setAttenuation(200.0, 0, 0, 1);
380/*
381                Light* blueLight = mSceneMgr->createLight("blueLight");
382                blueLight->setType(Light::LT_POINT);
383                blueLight->setCastShadows(true);
384                blueLight->setDiffuseColour(ColourValue(0.45,0.75,0.8));
385                blueLight->setPowerScale(30);
386                blueLight->setAttenuation(40.0, 0, 4, 0);
387                SceneNode* blueLightNode = rootNode->createChildSceneNode();
388                blueLightNode->setPosition(15,10,15);
389                blueLightNode->attachObject(blueLight);*/
390               
391                Vector4 v = mainLight->getAs4DVector();
392
393                BillboardSet* bbs = mSceneMgr->createBillboardSet("bb", 1);
394                bbs->setDefaultDimensions(0.3, 0.3);
395                bbs->createBillboard(Vector3::ZERO, ColourValue::White);
396                bbs->setMaterialName("Flare");
397                mainLightNode->attachObject(bbs);
398
399                /*    Entity* ent = mSceneMgr->createEntity("troll", "troll.mesh");
400                        ent->setCastShadows(true);
401            // Add entity to the scene node
402            SceneNode *trollNode = mSceneMgr->getRootSceneNode()->createChildSceneNode( Vector3(5,0,5));
403                        trollNode->attachObject(ent);
404                        trollNode->setScale(0.05,0.05,0.05);
405            mAnimState = ent->getAnimationState("stand");
406            mAnimState->setEnabled(true);*/
407
408                PlayerCharacter::frameListenerPriority = 20;
409                gFPSPlayer = new FPSPlayer(NXScene, mSceneMgr, Vector3(0.5, 1.8, 0.3), Vector3(5, 10, 15), 1.6, mCamera, false);
410                gFPSPlayer->addPlayerMesh("FPSarm.mesh", 0.02, true);
411                gFPSPlayer->addWeaponModel("sword.mesh", "joint28");
412
413                PlayerCharacter* troll = new PlayerCharacter("troll1", NXScene, mSceneMgr, Vector3(1.5, 3.0, 1.2), Vector3(15, 10, 15), false);
414                troll->addPlayerMesh("troll.mesh", 0.05, false);
415/*
416                for(float i = 0; i< 7; i++)
417                {
418                        float size = 0.5;
419                        ActorParams ac;
420                        ac.setToDefault();
421                        ac.mass = 1.0;
422                        ac.nodescale = size;
423                        Body* b = NXScene->createBody("cube.mesh",
424                                                                new CubeShape(size, size, size),
425                                                                Vector3(3,size/2.0 + i * 5.0,3),
426                                                                ac);
427                        b->setCharacterCollisionGroup(NX_CHARACTER_COL_GROUP_PUSHABLE);
428                }
429        */
430         /*  ParticleSystem* pSys1 = mSceneMgr->createParticleSystem("psys1", "MoriaDust");
431           pSys1->setKeepParticlesInLocalSpace(true);
432           pSysNode = rootNode->createChildSceneNode("psys1");
433           pSysNode->attachObject(pSys1);
434           pSysNode->setPosition(0,0,0);*/
435
436
437                OgreIlluminationManager::getSingleton().initTechniques();
438   }
439       
440        void createPlane(Ogre::String _name, Ogre::String _material, Ogre::Vector3 _pos, Ogre::Vector2 _size, Ogre::Vector2 _subdivisions = Ogre::Vector2(1,1))
441        {
442                Plane _plane;
443        _plane.normal = Vector3::UNIT_Y;
444        _plane.d = 0;
445
446
447        MeshManager::getSingleton().createPlane(_name + ".plane",
448            ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
449            _plane,_size.x,_size.y,1,1,true,1,_subdivisions.x,_subdivisions.y,Vector3::UNIT_Z);
450       
451                Entity *_entity = mSceneMgr->createEntity(_name + ".entity", _name + ".plane");
452        _entity->setMaterialName(_material);
453
454                SceneNode* _node = mSceneMgr->getRootSceneNode()->createChildSceneNode(_name + ".node");
455                _node->attachObject(_entity);
456                _node->setPosition(_pos);
457
458        }
459
460        void createFrameListener(void)
461    {
462                // This is where we instantiate our own frame listener
463                mFrameListener= new MoriaDemoFrameListener(mWindow,
464                        mCamera, mainLightNode, mainLight, pSysNode     );
465        mFrameListener->setPriority(10);       
466                mRoot->addFrameListener(mFrameListener);
467//              gFPSPlayer->setPriority(20);
468//              mRoot->addFrameListener(gFPSPlayer);
469                OgreIlluminationManager::getSingleton().setPriority(40);
470            mRoot->addFrameListener(&OgreIlluminationManager::getSingleton());
471         
472    }
473
474};
475
Note: See TracBrowser for help on using the repository browser.