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

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