source: GTP/trunk/App/Demos/Illum/Ogre/src/CausticTest/include/CausticTest.h @ 2344

Revision 2344, 10.6 KB checked in by szirmay, 17 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
30float causize = 10;
31float cauintens = 40;
32
33class RaytraceDemoApplication;
34
35// Listener class for frame updates
36class RaytraceDemoListener : public ExampleFrameListener
37{
38protected:
39       
40        Light* light;
41        SceneNode* lightNode;
42        SceneNode* sphereNode;
43        unsigned long framecount;
44        RaytraceDemoApplication* app;
45       
46public:
47    RaytraceDemoListener(RenderWindow* window, Camera* maincam,SceneNode* lightNode, SceneNode* sphereNode, Light* l, RaytraceDemoApplication* app)
48        :ExampleFrameListener(window, maincam)
49                                 
50    {
51                framecount = 0;
52                this->sphereNode = sphereNode;
53                this->lightNode = lightNode;
54                light = l;
55                this->app = app;
56    }
57        void setAttr(SceneNode* lightNode, SceneNode* sphereNode, Light* l)
58        {
59                this->sphereNode = sphereNode;
60                this->lightNode = lightNode;
61                light = l;             
62        }
63        bool processUnbufferedKeyInput(const FrameEvent& evt)
64    {
65                if (mInputDevice->isKeyDown(KC_SUBTRACT))
66        {
67                        Vector3 lPos = lightNode->getPosition();
68                        Vector3 lDir = sphereNode->getPosition() - lPos;
69                        lDir.normalise();
70                        lPos -= lDir;
71                        lightNode->setPosition(lPos);
72                        light->setDirection(lDir);
73                }
74                if (mInputDevice->isKeyDown(KC_ADD))
75        {
76                       
77                        Vector3 lPos = lightNode->getPosition();
78                        Vector3 lDir = sphereNode->getPosition() - lPos;
79                        lDir.normalise();
80                        lPos += lDir;
81                        lightNode->setPosition(lPos);
82                        light->setDirection(lDir);
83                }
84                if (mInputDevice->isKeyDown(KC_MULTIPLY))
85        {
86                        Vector3 lPos = lightNode->getPosition();
87                        Vector3 lDir = sphereNode->getPosition() - lPos;
88                        lDir.normalise();
89                        Vector3 right = lDir.crossProduct(Vector3(0,1,0));
90                        Vector3 up = lDir.crossProduct(right);
91                        lPos += up,
92                        lightNode->setPosition(lPos);
93                        light->setDirection(lDir);
94                }
95                if (mInputDevice->isKeyDown(KC_DIVIDE))
96        {
97                        Vector3 lPos = lightNode->getPosition();
98                        Vector3 lDir = sphereNode->getPosition() - lPos;
99                        lDir.normalise();
100                        Vector3 right = lDir.crossProduct(Vector3(0,1,0));
101                        Vector3 up = lDir.crossProduct(right);
102                        lPos -= up,                     
103                        lightNode->setPosition(lPos);
104                        light->setDirection(lDir);
105                               
106                }
107                if (mInputDevice->isKeyDown(KC_HOME))
108        {
109                        Vector3 lPos = lightNode->getPosition();
110                        Vector3 lDir = sphereNode->getPosition() - lPos;
111                        lDir.normalise();
112                        Vector3 right = lDir.crossProduct(Vector3(0,1,0));
113                        Vector3 up = lDir.crossProduct(right);
114                        lPos += right,
115                        lightNode->setPosition(lPos);
116                        light->setDirection(lDir);
117                }
118                if (mInputDevice->isKeyDown(KC_END))
119        {
120                        Vector3 lPos = lightNode->getPosition();
121                        Vector3 lDir = sphereNode->getPosition() - lPos;
122                        lDir.normalise();
123                        Vector3 right = lDir.crossProduct(Vector3(0,1,0));
124                        Vector3 up = lDir.crossProduct(right);
125                        lPos -= right,                 
126                        lightNode->setPosition(lPos);
127                        light->setDirection(lDir);
128                               
129                }
130                return ExampleFrameListener::processUnbufferedKeyInput(evt);
131        }
132   
133        bool frameStarted(const FrameEvent& evt);
134       
135
136};
137
138/** Application class */
139class RaytraceDemoApplication : public ExampleApplication
140{
141
142public:
143        void LoadRes()
144        {
145                setupResources();
146               
147                MaterialManager::getSingleton().initialise();
148               
149                ResourceGroupManager::getSingleton().initialiseResourceGroup("Bootstrap");
150                ResourceGroupManager::getSingleton().initialiseResourceGroup("General");
151                ResourceGroupManager::getSingleton().initialiseResourceGroup("GTP_Basic");
152                ResourceGroupManager::getSingleton().initialiseResourceGroup("PostProc");
153                ResourceGroupManager::getSingleton().initialiseResourceGroup("GTP_EnvMap");
154                ResourceGroupManager::getSingleton().initialiseResourceGroup("GTP_Caustic");
155
156                ResourceGroupManager::getSingleton().loadResourceGroup("Bootstrap");
157                ResourceGroupManager::getSingleton().loadResourceGroup("General");
158                ResourceGroupManager::getSingleton().loadResourceGroup("GTP_Basic");
159                ResourceGroupManager::getSingleton().loadResourceGroup("PostProc");
160                ResourceGroupManager::getSingleton().loadResourceGroup("GTP_EnvMap");
161                ResourceGroupManager::getSingleton().loadResourceGroup("GTP_Caustic");
162
163        }
164        void setupScene()
165        {
166                // Skybox
167        mSceneMgr->setSkyBox(true, "Examples/EveningSkyBox");
168
169                SceneNode* rootNode = mSceneMgr->getRootSceneNode();
170
171        Entity* sphere = mSceneMgr->createEntity("sphere", "head.mesh");
172               
173        //      Material* mat = (Material*) MaterialManager::getSingleton().getByName("GTP/Caustic/Glass").getPointer();
174        //      Material* newMat = mat->clone(mat->getName() + "_new").getPointer();
175
176                sphere->setMaterialName("GTP/Caustic/Glass");
177                sphereNode = rootNode->createChildSceneNode();
178                //sphereNode->setScale(0.1, 0.1, 0.1);//sphere
179                sphereNode->setPosition(0, 50, 0);
180                sphereNode->attachObject(sphere);
181                sphereNode->_updateBounds();
182
183                Entity* room = mSceneMgr->createEntity("room", "atlascube.mesh");
184        //      mat = (Material*) MaterialManager::getSingleton().getByName("TestPlane").getPointer();
185        //      newMat = mat->clone(mat->getName() + "_new").getPointer();
186
187                room->setMaterialName("TestPlane");
188                SceneNode *roomNode = rootNode->createChildSceneNode();
189                //roomNode->setScale(0.1, 0.1, 0.1);
190                roomNode->setPosition(0, 50, 0);
191                roomNode->attachObject(room);
192               
193
194                Light* mainLight = mSceneMgr->createLight("MainLight");
195                light = mainLight;
196                mainLight->setType(Light::LT_POINT);
197        mainLight->setDiffuseColour(ColourValue::White);
198                mainLight->setSpecularColour(ColourValue::White);
199                mainLightNode = rootNode->createChildSceneNode();
200                mainLightNode->setPosition(100,100,0);
201                //mainLight->setPosition(mainLightNode->getWorldPosition());
202                mainLightNode->attachObject(mainLight);
203                BillboardSet* bbs = mSceneMgr->createBillboardSet("bb", 1);
204                bbs->setDefaultDimensions(10,10);
205                bbs->createBillboard(Vector3::ZERO, ColourValue::White);
206                bbs->setMaterialName("Flare");
207                mainLightNode->attachObject(bbs);
208
209                //createPlane("ground", "TestPlane", Vector3(0,0,0), Vector2(500,500));
210                OgreIlluminationManager::getSingleton().initTechniques();
211
212                OgreIlluminationManager::getSingleton().setPriority(2);
213        mRoot->addFrameListener(&OgreIlluminationManager::getSingleton());             
214        }
215        setFrameListenerAttr()
216        {
217                ((RaytraceDemoListener*) mFrameListener)->setAttr(mainLightNode, sphereNode, light);
218        }
219        void clearResources(void)
220        {
221                ResourceGroupManager::getSingleton().destroyResourceGroup("Bootstrap");
222                ResourceGroupManager::getSingleton().destroyResourceGroup("General");
223                ResourceGroupManager::getSingleton().destroyResourceGroup("GTP_Basic");
224                ResourceGroupManager::getSingleton().destroyResourceGroup("PostProc");
225                ResourceGroupManager::getSingleton().destroyResourceGroup("GTP_EnvMap");
226                ResourceGroupManager::getSingleton().destroyResourceGroup("GTP_Caustic");
227
228
229        }
230
231protected:
232        SceneNode* mainLightNode;
233        SceneNode* sphereNode;
234       
235        void chooseSceneManager()
236        {
237                //mSceneMgr = mRoot->createSceneManager("OctreeSceneManager");
238                mSceneMgr = mRoot->createSceneManager("OcclusionCullingSceneManager");
239        }
240
241        void loadResources(void)
242        {
243                // Initialise, parse scripts etc
244                ResourceGroupManager::getSingleton().initialiseResourceGroup("Bootstrap");
245                ResourceGroupManager::getSingleton().initialiseResourceGroup("General");
246                ResourceGroupManager::getSingleton().initialiseResourceGroup("GTP_Basic");
247                ResourceGroupManager::getSingleton().initialiseResourceGroup("PostProc");
248                ResourceGroupManager::getSingleton().initialiseResourceGroup("GTP_EnvMap");
249                ResourceGroupManager::getSingleton().initialiseResourceGroup("GTP_Caustic");
250        }
251
252        void createPostproc()
253        {               
254                CompositorManager::getSingleton().addCompositor(mWindow->getViewport(0),
255                                                                                                                "GTP/PostProc/Glow");
256                CompositorManager::getSingleton().setCompositorEnabled(mWindow->getViewport(0),
257                                                                                                                "GTP/PostProc/Glow", true);
258
259                CompositorManager::getSingleton().addCompositor(mWindow->getViewport(0),
260                                                                                                                "GTP/PostProc/ToneMap");
261                CompositorManager::getSingleton().setCompositorEnabled(mWindow->getViewport(0),
262                                                                                                                "GTP/PostProc/ToneMap", true);         
263        }
264   
265        Light* light;
266        void createScene(void)
267    {
268                std::string occlusion_cfg("OcclusionCulling.cfg");
269                mSceneMgr->setWorldGeometry(occlusion_cfg);
270
271                //createPostproc();
272                OgreIlluminationManager::getSingleton().setBlurShadowMap(true);
273                OgreIlluminationManager::getSingleton().setUseLISPSM(false);
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,100,240);
283                mCamera->setFOVy(Radian(Degree(80)));
284                //mCamera->setFarClipDistance(1000);
285                // Set ambient light
286        mSceneMgr->setAmbientLight(ColourValue(1, 1, 1));
287
288                setupScene();
289         }
290
291       
292   void createPlane(Ogre::String _name, Ogre::String _material, Ogre::Vector3 _pos, Ogre::Vector2 _size, Ogre::Vector2 _subdivisions = Ogre::Vector2(1,1)) {
293               
294           Plane _plane;
295        _plane.normal = Vector3::UNIT_Y;
296        _plane.d = 0;
297
298
299        MeshManager::getSingleton().createPlane(_name + ".plane",
300            ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
301            _plane,_size.x,_size.y,1,1,true,1,_subdivisions.x,_subdivisions.y,Vector3::UNIT_Z);
302       
303                Entity *_entity = mSceneMgr->createEntity(_name + ".entity", _name + ".plane");
304        _entity->setMaterialName(_material);
305
306                SceneNode* _node = mSceneMgr->getRootSceneNode()->createChildSceneNode(_name + ".node");
307                _node->attachObject(_entity);
308                _node->setPosition(_pos);
309        }
310
311
312
313        void createFrameListener(void)
314    {
315                // This is where we instantiate our own frame listener
316                mFrameListener= new RaytraceDemoListener(mWindow,
317                                                                                        mCamera,
318                                                                                        mainLightNode,
319                                                                                        sphereNode,
320                                                                                        light,
321                                                                                        this
322                                                                                        );
323                mFrameListener->setPriority(1);
324                mRoot->addFrameListener(mFrameListener);
325       
326    }
327
328};
329
330
331
332
333
334
Note: See TracBrowser for help on using the repository browser.