source: GTP/trunk/App/Demos/Illum/Ogre/src/ReflectionTest/include/ReflectionTest.h @ 1860

Revision 1860, 14.0 KB checked in by szirmay, 18 years ago (diff)
Line 
1
2
3
4/*
5-----------------------------------------------------------------------------
6This source file is part of OGRE
7    (Object-oriented Graphics Rendering Engine)
8For the latest info, see http://www.ogre3d.org/
9
10Copyright (c) 2000-2005 The OGRE Team
11Also see acknowledgements in Readme.html
12
13You may use this sample code for anything you like, it is not covered by the
14LGPL like the rest of the engine.
15-----------------------------------------------------------------------------
16*/
17
18/**
19    \file
20        Lighting.h
21    \brief
22        Shows lighting support in OGRE. Also demonstrates the use of billboards
23        and controllers for automatic time-relative behaviour.
24*/
25
26
27#include "ExampleApplication.h"
28#include "OgreIlluminationManager.h"
29#include "SpriteParticleRenderer.h"
30#include "FrameCapture.h"
31
32int scene = 1;
33FrameCapture* capture;
34
35bool multiplebounce = true;
36
37// Listener class for frame updates
38class RaytraceDemoListener : public ExampleFrameListener
39{
40protected:
41        unsigned long framecount;
42        SceneNode* objectNode;
43       
44public:
45    RaytraceDemoListener(RenderWindow* window, Camera* maincam, SceneNode* objectNode)
46        :ExampleFrameListener(window, maincam)
47                                 
48    {
49                this->mMoveSpeed = 0.1;
50                framecount = 0;         
51                this->objectNode = objectNode;         
52               
53    }
54
55        void moveCamera()
56    {/*
57           mCamera->yaw(mRotX);
58       mCamera->pitch(mRotY);
59       mCamera->moveRelative(mTranslateVector);*/
60
61                mCamera->getParentSceneNode()->yaw(mRotX, Node::TransformSpace::TS_WORLD);
62                mCamera->getParentSceneNode()->pitch(mRotY, Node::TransformSpace::TS_LOCAL);
63                mCamera->getParentSceneNode()->translate(mTranslateVector, Node::TransformSpace::TS_LOCAL);
64               
65    }
66
67        bool processUnbufferedKeyInput(const FrameEvent& evt)
68    {
69                static float lastTime = 0.0;
70                float thisTime = (float) Root::getSingleton().getTimer()->getMilliseconds() / 1000.0f;
71                float elapsed = thisTime - lastTime;
72                float move = elapsed * 0.25;
73                float rotate = 80.0 * move;
74
75                if (mInputDevice->isKeyDown(KC_UP))
76        {
77                        objectNode->translate(0,0,move);
78        }
79                if (mInputDevice->isKeyDown(KC_MULTIPLY))
80        {
81                        //objectNode->scale(1.1,1.1,1.1);
82                        objectNode->rotate(Vector3(0,0,1), Degree(rotate));
83                       
84        }
85                if (mInputDevice->isKeyDown(KC_DIVIDE))
86        {
87                        //objectNode->scale(1.0/1.1,1.0/1.1,1.0/1.1);
88                        objectNode->rotate(Vector3(1,0,0), Degree(rotate));
89                       
90        }
91                if (mInputDevice->isKeyDown(KC_ADD))
92        {
93                        objectNode->rotate(Vector3(0,1,0), Degree(rotate));
94        }
95                if (mInputDevice->isKeyDown(KC_HOME))
96        {
97                        objectNode->translate(0,move,0);
98        }
99                if (mInputDevice->isKeyDown(KC_END))
100        {
101                        objectNode->translate(0,-move,0);
102        }
103                if (mInputDevice->isKeyDown(KC_DOWN))
104        {
105                        objectNode->translate(0,0,-move);
106        }
107                if (mInputDevice->isKeyDown(KC_RIGHT))
108        {
109                        objectNode->translate(-move,0,0);
110        }
111                if (mInputDevice->isKeyDown(KC_LEFT))
112        {
113                        objectNode->translate(move,0,0);
114        }
115
116                if (mInputDevice->isKeyDown(KC_A))
117        {
118            // Move camera left
119            mTranslateVector.x = -mMoveScale;
120        }
121
122        if (mInputDevice->isKeyDown(KC_D))
123        {
124            // Move camera RIGHT
125            mTranslateVector.x = mMoveScale;
126        }
127
128        /* Move camera forward by keypress. */
129        if ( mInputDevice->isKeyDown(KC_W) )
130        {
131            mTranslateVector.z = -mMoveScale;
132        }
133               
134        /* Move camera backward by keypress. */
135        if (mInputDevice->isKeyDown(KC_S) )
136        {
137            mTranslateVector.z = mMoveScale;
138        }
139
140        if (mInputDevice->isKeyDown(KC_PGUP))
141        {
142            // Move camera up
143            mTranslateVector.y = mMoveScale;
144        }
145
146        if (mInputDevice->isKeyDown(KC_PGDOWN))
147        {
148            // Move camera down
149            mTranslateVector.y = -mMoveScale;
150        }
151                if (mInputDevice->isKeyDown(KC_N) && mTimeUntilNextToggle <= 0)
152        {
153                        capture->playEvent();
154            mTimeUntilNextToggle = 1;
155        }
156                if (mInputDevice->isKeyDown(KC_B) && mTimeUntilNextToggle <= 0)
157        {
158                        capture->recordEvent();
159            mTimeUntilNextToggle = 1;
160        }
161                if (mInputDevice->isKeyDown(KC_M) && mTimeUntilNextToggle <= 0)
162        {
163                        capture->setSaving();
164                        capture->playEvent();
165            mTimeUntilNextToggle = 1;
166        }
167                if (mInputDevice->isKeyDown(KC_V) && mTimeUntilNextToggle <= 0)
168        {
169                        multiplebounce = ! multiplebounce;
170                        if(multiplebounce)
171                        {
172                                MaterialPtr mat = MaterialManager::getSingleton().getByName("MetalTeapotMultipleBounce");
173                                mat->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->setNamedConstant("SingleBounce", 0.0f);
174                        }
175                        else
176                        {
177                                MaterialPtr mat = MaterialManager::getSingleton().getByName("MetalTeapotMultipleBounce");
178                                mat->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->setNamedConstant("SingleBounce", 1.0f);
179                        }
180
181            mTimeUntilNextToggle = 1;
182        }
183
184        if( mInputDevice->isKeyDown( KC_ESCAPE) )
185        {           
186            return false;
187        }
188
189                // see if switching is on, and you want to toggle
190        if (mInputTypeSwitchingOn && mInputDevice->isKeyDown(KC_M) && mTimeUntilNextToggle <= 0)
191        {
192                        switchMouseMode();
193            mTimeUntilNextToggle = 1;
194        }
195
196        if (mInputTypeSwitchingOn && mInputDevice->isKeyDown(KC_K) && mTimeUntilNextToggle <= 0)
197        {
198                        // must be going from immediate keyboard to buffered keyboard
199                        switchKeyMode();
200            mTimeUntilNextToggle = 1;
201        }
202        if (mInputDevice->isKeyDown(KC_F) && mTimeUntilNextToggle <= 0)
203        {
204            mStatsOn = !mStatsOn;
205            showDebugOverlay(mStatsOn);
206
207            mTimeUntilNextToggle = 1;
208        }
209       
210        if (mInputDevice->isKeyDown(KC_SYSRQ) && mTimeUntilNextToggle <= 0)
211        {
212                        char tmp[20];
213                        sprintf(tmp, "screenshot_%d.png", ++mNumScreenShots);
214            mWindow->writeContentsToFile(tmp);
215            mTimeUntilNextToggle = 0.5;
216                        mWindow->setDebugText(String("Wrote ") + tmp);
217        }
218               
219                static bool displayCameraDetails = false;
220        if (mInputDevice->isKeyDown(KC_P) && mTimeUntilNextToggle <= 0)
221        {
222            displayCameraDetails = !displayCameraDetails;
223            mTimeUntilNextToggle = 0.5;
224            if (!displayCameraDetails)
225                mWindow->setDebugText("");
226        }
227        if (displayCameraDetails)
228        {
229            // Print camera details
230            mWindow->setDebugText("P: " + StringConverter::toString(mCamera->getDerivedPosition()) + " " +
231                "O: " + StringConverter::toString(mCamera->getDerivedOrientation()));
232        }
233        lastTime = thisTime;
234        // Return true to continue rendering
235        return true;
236        }
237    bool frameStarted(const FrameEvent& evt)
238    {
239                bool result = ExampleFrameListener::frameStarted(evt);
240                framecount++;
241                return result;     
242    }
243};
244
245/** Application class */
246class RaytraceDemoApplication : public ExampleApplication
247{
248
249public:
250
251
252protected:
253
254        SceneNode* objectNode;
255
256    void createCamera(void)
257    {
258        // Create the camera
259        mCamera = mSceneMgr->createCamera("PlayerCam");
260               
261                SceneNode* camNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("mainCameraNode");
262                camNode->attachObject(mCamera);
263       //camNode->setPosition(Vector3(0,1,0));
264        // Position it at 500 in Z direction
265        //mCamera->setPosition(Vector3(0,0,500));
266        // Look back along -Z
267        //mCamera->lookAt(Vector3(0,0,-300));
268        mCamera->setNearClipDistance(5);
269
270    }
271
272        void createScene(void)
273    {
274
275                OgreIlluminationManager::getSingleton().setMainCamera(mCamera);
276                OgreIlluminationManager::getSingleton().setMainViewport(mWindow->getViewport(0));
277               
278                OgreIlluminationManager::getSingleton().setMaxJoinRadius(420);         
279
280                Root::getSingleton()._setCurrentSceneManager(mSceneMgr);
281
282                mCamera->setFOVy(Radian(Degree(80 * 3.0 / 4.0)));
283                mCamera->setFarClipDistance(200);
284                mCamera->setNearClipDistance(0.1);
285
286                SceneNode* cn = mCamera->getParentSceneNode();
287
288                OgreIlluminationManager::getSingleton().setFocusingSM(false);
289           OgreIlluminationManager::getSingleton().setShadowMapSize(512);
290           OgreIlluminationManager::getSingleton().setBlurShadowMap(true);
291           OgreIlluminationManager::getSingleton().setShadowMapMaterialName("GameTools/ShadowMapDistance");
292            mSceneMgr->setAmbientLight(ColourValue(0.505 * 0.2, 0.897 * 0.2, 0.914 * 0.2));
293               
294                capture  = new FrameCapture(mWindow);
295                if(scene == 1) createScene1();
296                if(scene == 2) createScene2();
297
298                OgreIlluminationManager::getSingleton().initTechniques();
299        }
300   void createScene1(void)
301    {
302        SceneNode* rootNode = mSceneMgr->getRootSceneNode();
303               
304                mCamera->setPosition(0.532,1.232,1.529);
305                mCamera->lookAt(Vector3(0,1.2,0.0));
306               
307                Entity* object = mSceneMgr->createEntity("object", "teapot.mesh");
308                object->setMaterialName("MetalTeapotMultipleBounce");
309                objectNode = rootNode->createChildSceneNode("objectNode");
310                objectNode->attachObject(object);
311                objectNode->scale(0.5,0.5,0.5);
312                //objectNode->scale(0.005,0.005,0.005);
313                objectNode->setPosition(0,1.2,0);
314                objectNode->_updateBounds();
315
316                capture->addAnimableNode(objectNode);
317                capture->addAnimableNode(mCamera->getParentSceneNode());
318               
319                Entity* room = mSceneMgr->createEntity("scene", "difflab.mesh");
320                //room->setMaterialName("GameTools/Phong");
321                SceneNode* roomNode = rootNode->createChildSceneNode();
322                roomNode->attachObject(room);
323                roomNode->_updateBounds();             
324
325                mSceneMgr->setShadowTechnique(SHADOWTYPE_NONE);
326                Light* redLight1 = mSceneMgr->createLight("RedLight1");
327                redLight1->setType(Light::LT_POINT);
328                redLight1->setCastShadows(false);
329        redLight1->setDiffuseColour(ColourValue(1,0.055, 0.0));
330                redLight1->setPowerScale(1.6);
331                SceneNode* redLightNode1 = rootNode->createChildSceneNode();
332                redLightNode1->setPosition(0.05,2.361,-1.07);
333                redLightNode1->attachObject(redLight1);
334
335                Light* greenLight1 = mSceneMgr->createLight("GreenLight1");
336                greenLight1->setType(Light::LT_POINT);
337                greenLight1->setCastShadows(false);
338        greenLight1->setDiffuseColour(ColourValue(0.362,0.783, 0.685));
339                greenLight1->setPowerScale(2.0);
340                SceneNode* greenLightNode1 = rootNode->createChildSceneNode();
341                greenLightNode1->setPosition(1.312,1.313,0);
342                greenLightNode1->attachObject(greenLight1);
343
344                Light* mainBlueLight = mSceneMgr->createLight("MainBlueLight");
345                mainBlueLight->setType(Light::LT_SPOTLIGHT);
346                mainBlueLight->setCastShadows(true);
347        mainBlueLight->setDiffuseColour(ColourValue(0.395,0.766, 1.0));
348                mainBlueLight->setPowerScale(5.0);
349                mainBlueLight->setSpotlightRange(Degree(0),Degree(160));
350                mainBlueLight->setAttenuation(2.5, 0, 1, 0);
351                SceneNode* mainBlueLightNode = rootNode->createChildSceneNode();
352                mainBlueLightNode->setPosition(-0.546,2.095,1.035);
353                //mainBlueLightNode->rotate(Vector3::UNIT_X, Degree(161.396));
354                //mainBlueLightNode->rotate(Vector3::UNIT_Y, Degree(53.955));
355                //mainBlueLightNode->rotate(Vector3::UNIT_Z, Degree(-145.065));
356                mainBlueLight->setDirection(-1.5,-2.0,1.0);
357                mainBlueLightNode->attachObject(mainBlueLight);
358   }
359
360        void createScene2(void)
361    {
362        SceneNode* rootNode = mSceneMgr->getRootSceneNode();
363               
364                Entity* object = mSceneMgr->createEntity("object", "athene.mesh");
365                object->setMaterialName("MetalTeapotMultipleBounce");
366                objectNode = rootNode->createChildSceneNode();
367                objectNode->attachObject(object);
368                //objectNode->scale(0.5,0.5,0.5);
369                objectNode->scale(0.005,0.005,0.005);
370                objectNode->setPosition(0,1.2,0);
371                objectNode->_updateBounds();
372
373                Entity* room = mSceneMgr->createEntity("scene", "difflab.mesh");
374                //room->setMaterialName("GameTools/Phong");
375                SceneNode* roomNode = rootNode->createChildSceneNode();
376                roomNode->attachObject(room);
377                roomNode->_updateBounds();             
378
379                mSceneMgr->setShadowTechnique(SHADOWTYPE_NONE);
380                Light* redLight1 = mSceneMgr->createLight("RedLight1");
381                redLight1->setType(Light::LT_POINT);
382                redLight1->setCastShadows(false);
383        redLight1->setDiffuseColour(ColourValue(1,0.055, 0.0));
384                redLight1->setPowerScale(1.6);
385                SceneNode* redLightNode1 = rootNode->createChildSceneNode();
386                redLightNode1->setPosition(0.05,2.361,-1.07);
387                redLightNode1->attachObject(redLight1);
388
389                Light* greenLight1 = mSceneMgr->createLight("GreenLight1");
390                greenLight1->setType(Light::LT_POINT);
391                greenLight1->setCastShadows(false);
392        greenLight1->setDiffuseColour(ColourValue(0.362,0.783, 0.685));
393                greenLight1->setPowerScale(2.0);
394                SceneNode* greenLightNode1 = rootNode->createChildSceneNode();
395                greenLightNode1->setPosition(1.312,1.313,0);
396                greenLightNode1->attachObject(greenLight1);
397
398                Light* mainBlueLight = mSceneMgr->createLight("MainBlueLight");
399                mainBlueLight->setType(Light::LT_SPOTLIGHT);
400                mainBlueLight->setCastShadows(true);
401        mainBlueLight->setDiffuseColour(ColourValue(0.395,0.766, 1.0));
402                mainBlueLight->setPowerScale(5.0);
403                mainBlueLight->setSpotlightRange(Degree(0),Degree(160));
404                mainBlueLight->setAttenuation(2.5, 0, 1, 0);
405                SceneNode* mainBlueLightNode = rootNode->createChildSceneNode();
406                mainBlueLightNode->setPosition(-0.546,2.095,1.035);
407                //mainBlueLightNode->rotate(Vector3::UNIT_X, Degree(161.396));
408                //mainBlueLightNode->rotate(Vector3::UNIT_Y, Degree(53.955));
409                //mainBlueLightNode->rotate(Vector3::UNIT_Z, Degree(-145.065));
410                mainBlueLight->setDirection(-1.5,-2.0,1.0);
411                mainBlueLightNode->attachObject(mainBlueLight);
412   }
413
414        void createFrameListener(void)
415    {
416                // This is where we instantiate our own frame listener
417                mFrameListener= new RaytraceDemoListener(mWindow, mCamera, objectNode);
418                mFrameListener->setPriority(1);
419                OgreIlluminationManager::getSingleton().setPriority(3);
420                capture->setPriority(2);
421        mRoot->addFrameListener(capture);
422                mRoot->addFrameListener(mFrameListener);
423                mRoot->addFrameListener(&OgreIlluminationManager::getSingleton());
424
425    }
426
427};
428
Note: See TracBrowser for help on using the repository browser.