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

Revision 1856, 13.9 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->setPosition(0,1,0);         
283                mCamera->setFOVy(Radian(Degree(80)));
284                mCamera->setFarClipDistance(200);
285                mCamera->setNearClipDistance(0.1);
286
287                SceneNode* cn = mCamera->getParentSceneNode();
288
289                OgreIlluminationManager::getSingleton().setFocusingSM(false);
290           OgreIlluminationManager::getSingleton().setShadowMapSize(512);
291           OgreIlluminationManager::getSingleton().setBlurShadowMap(true);
292           OgreIlluminationManager::getSingleton().setShadowMapMaterialName("GameTools/ShadowMapDistance");
293            mSceneMgr->setAmbientLight(ColourValue(0.505 * 0.2, 0.897 * 0.2, 0.914 * 0.2));
294               
295                capture  = new FrameCapture(mWindow);
296                if(scene == 1) createScene1();
297                if(scene == 2) createScene2();
298
299                OgreIlluminationManager::getSingleton().initTechniques();
300        }
301   void createScene1(void)
302    {
303        SceneNode* rootNode = mSceneMgr->getRootSceneNode();
304               
305                Entity* object = mSceneMgr->createEntity("object", "teapot.mesh");
306                object->setMaterialName("MetalTeapotMultipleBounce");
307                objectNode = rootNode->createChildSceneNode("objectNode");
308                objectNode->attachObject(object);
309                objectNode->scale(0.5,0.5,0.5);
310                //objectNode->scale(0.005,0.005,0.005);
311                objectNode->setPosition(0,1.2,0);
312                objectNode->_updateBounds();
313
314                capture->addAnimableNode(objectNode);
315                capture->addAnimableNode(mCamera->getParentSceneNode());
316               
317                Entity* room = mSceneMgr->createEntity("scene", "difflab.mesh");
318                //room->setMaterialName("GameTools/Phong");
319                SceneNode* roomNode = rootNode->createChildSceneNode();
320                roomNode->attachObject(room);
321                roomNode->_updateBounds();             
322
323                mSceneMgr->setShadowTechnique(SHADOWTYPE_NONE);
324                Light* redLight1 = mSceneMgr->createLight("RedLight1");
325                redLight1->setType(Light::LT_POINT);
326                redLight1->setCastShadows(false);
327        redLight1->setDiffuseColour(ColourValue(1,0.055, 0.0));
328                redLight1->setPowerScale(1.6);
329                SceneNode* redLightNode1 = rootNode->createChildSceneNode();
330                redLightNode1->setPosition(0.05,2.361,-1.07);
331                redLightNode1->attachObject(redLight1);
332
333                Light* greenLight1 = mSceneMgr->createLight("GreenLight1");
334                greenLight1->setType(Light::LT_POINT);
335                greenLight1->setCastShadows(false);
336        greenLight1->setDiffuseColour(ColourValue(0.362,0.783, 0.685));
337                greenLight1->setPowerScale(2.0);
338                SceneNode* greenLightNode1 = rootNode->createChildSceneNode();
339                greenLightNode1->setPosition(1.312,1.313,0);
340                greenLightNode1->attachObject(greenLight1);
341
342                Light* mainBlueLight = mSceneMgr->createLight("MainBlueLight");
343                mainBlueLight->setType(Light::LT_SPOTLIGHT);
344                mainBlueLight->setCastShadows(true);
345        mainBlueLight->setDiffuseColour(ColourValue(0.395,0.766, 1.0));
346                mainBlueLight->setPowerScale(5.0);
347                mainBlueLight->setSpotlightRange(Degree(0),Degree(160));
348                mainBlueLight->setAttenuation(2.5, 0, 1, 0);
349                SceneNode* mainBlueLightNode = rootNode->createChildSceneNode();
350                mainBlueLightNode->setPosition(-0.546,2.095,1.035);
351                //mainBlueLightNode->rotate(Vector3::UNIT_X, Degree(161.396));
352                //mainBlueLightNode->rotate(Vector3::UNIT_Y, Degree(53.955));
353                //mainBlueLightNode->rotate(Vector3::UNIT_Z, Degree(-145.065));
354                mainBlueLight->setDirection(-1.5,-2.0,1.0);
355                mainBlueLightNode->attachObject(mainBlueLight);
356   }
357
358        void createScene2(void)
359    {
360        SceneNode* rootNode = mSceneMgr->getRootSceneNode();
361               
362                Entity* object = mSceneMgr->createEntity("object", "athene.mesh");
363                object->setMaterialName("MetalTeapotMultipleBounce");
364                objectNode = rootNode->createChildSceneNode();
365                objectNode->attachObject(object);
366                //objectNode->scale(0.5,0.5,0.5);
367                objectNode->scale(0.005,0.005,0.005);
368                objectNode->setPosition(0,1.2,0);
369                objectNode->_updateBounds();
370
371                Entity* room = mSceneMgr->createEntity("scene", "difflab.mesh");
372                //room->setMaterialName("GameTools/Phong");
373                SceneNode* roomNode = rootNode->createChildSceneNode();
374                roomNode->attachObject(room);
375                roomNode->_updateBounds();             
376
377                mSceneMgr->setShadowTechnique(SHADOWTYPE_NONE);
378                Light* redLight1 = mSceneMgr->createLight("RedLight1");
379                redLight1->setType(Light::LT_POINT);
380                redLight1->setCastShadows(false);
381        redLight1->setDiffuseColour(ColourValue(1,0.055, 0.0));
382                redLight1->setPowerScale(1.6);
383                SceneNode* redLightNode1 = rootNode->createChildSceneNode();
384                redLightNode1->setPosition(0.05,2.361,-1.07);
385                redLightNode1->attachObject(redLight1);
386
387                Light* greenLight1 = mSceneMgr->createLight("GreenLight1");
388                greenLight1->setType(Light::LT_POINT);
389                greenLight1->setCastShadows(false);
390        greenLight1->setDiffuseColour(ColourValue(0.362,0.783, 0.685));
391                greenLight1->setPowerScale(2.0);
392                SceneNode* greenLightNode1 = rootNode->createChildSceneNode();
393                greenLightNode1->setPosition(1.312,1.313,0);
394                greenLightNode1->attachObject(greenLight1);
395
396                Light* mainBlueLight = mSceneMgr->createLight("MainBlueLight");
397                mainBlueLight->setType(Light::LT_SPOTLIGHT);
398                mainBlueLight->setCastShadows(true);
399        mainBlueLight->setDiffuseColour(ColourValue(0.395,0.766, 1.0));
400                mainBlueLight->setPowerScale(5.0);
401                mainBlueLight->setSpotlightRange(Degree(0),Degree(160));
402                mainBlueLight->setAttenuation(2.5, 0, 1, 0);
403                SceneNode* mainBlueLightNode = rootNode->createChildSceneNode();
404                mainBlueLightNode->setPosition(-0.546,2.095,1.035);
405                //mainBlueLightNode->rotate(Vector3::UNIT_X, Degree(161.396));
406                //mainBlueLightNode->rotate(Vector3::UNIT_Y, Degree(53.955));
407                //mainBlueLightNode->rotate(Vector3::UNIT_Z, Degree(-145.065));
408                mainBlueLight->setDirection(-1.5,-2.0,1.0);
409                mainBlueLightNode->attachObject(mainBlueLight);
410   }
411
412        void createFrameListener(void)
413    {
414                // This is where we instantiate our own frame listener
415                mFrameListener= new RaytraceDemoListener(mWindow, mCamera, objectNode);
416                mFrameListener->setPriority(1);
417                OgreIlluminationManager::getSingleton().setPriority(3);
418                capture->setPriority(2);
419        mRoot->addFrameListener(capture);
420                mRoot->addFrameListener(mFrameListener);
421                mRoot->addFrameListener(&OgreIlluminationManager::getSingleton());
422
423    }
424
425};
426
Note: See TracBrowser for help on using the repository browser.