source: GTP/trunk/App/Demos/Illum/Ogre/src/GameToolsRaytraceDemo/include/GameToolsRaytraceDemo.h @ 2175

Revision 2175, 10.7 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#include "SpriteParticleRenderer.h"
30
31float causize = 10;
32float cauintens = 1;
33
34// Listener class for frame updates
35class RaytraceDemoListener : public ExampleFrameListener
36{
37protected:
38        SceneNode* goldSphereNode;
39        SceneNode* silverSphereNode;
40        SceneNode* copperSphereNode;
41        SceneNode* aluSphereNode;
42        SceneNode* centerSphereNode;
43        SceneNode* lightNode;
44        Light* light;
45        unsigned long framecount;
46       
47public:
48    RaytraceDemoListener(RenderWindow* window, Camera* maincam,SceneNode* lightNode,
49                                                                                                                                SceneNode* goldSphereNode,
50                                                                                                                                SceneNode* silverSphereNode,
51                                                                                                                                SceneNode* copperSphereNode,
52                                                                                                                                SceneNode* aluSphereNode,
53                                                                                                                                SceneNode* centerSphereNode,
54                                                                                                                                Light* light)
55        :ExampleFrameListener(window, maincam)
56                                 
57    {
58                framecount = 0;
59                this->goldSphereNode = goldSphereNode;
60                this->silverSphereNode = silverSphereNode;
61                this->copperSphereNode = copperSphereNode;
62                this->aluSphereNode = aluSphereNode;
63                this->centerSphereNode = centerSphereNode;
64                this->lightNode = lightNode;
65                this->light = light;
66    }
67        bool processUnbufferedKeyInput(const FrameEvent& evt)
68    {
69        /*      MaterialPtr mat = MaterialManager::getSingleton().getByName("GTP/Caustic/CauCube_PointSpritecenterHead_SE_0_clone");
70                GpuProgramParameters* Vparams = mat->getTechnique(0)->getPass(0)->getVertexProgramParameters().getPointer();
71                GpuProgramParameters* Fparams = mat->getTechnique(0)->getPass(0)->getFragmentProgramParameters().getPointer();
72               
73                if (mInputDevice->isKeyDown(KC_SUBTRACT))
74        {
75                        cauintens -= 0.5;
76                        cauintens = std::max(cauintens, 1.0f);
77                        float intensity = cauintens;
78                        float causticColor[] = {1.0, 1.0, 1.0, intensity};
79                        Fparams->setNamedConstant("CausticColor", causticColor, 4);                             
80                }
81                if (mInputDevice->isKeyDown(KC_ADD))
82        {
83                        cauintens += 0.5;
84                        cauintens = std::min(cauintens, 100.0f);
85                        float intensity = pow( cauintens / 100.0f, 2 );
86                        float causticColor[] = {1.0, 1.0, 1.0, intensity};
87                        Fparams->setNamedConstant("CausticColor", causticColor, 4);                                     
88                }
89                if (mInputDevice->isKeyDown(KC_MULTIPLY))
90        {
91                        causize = std::max(causize - 0.1, 0.0);
92                        Vparams->setNamedConstant("CauSpriteSize", causize);                   
93                }
94                if (mInputDevice->isKeyDown(KC_DIVIDE))
95        {
96                        causize = causize + 0.1;
97                        Vparams->setNamedConstant("CauSpriteSize", causize);                   
98                }
99        */
100                return ExampleFrameListener::processUnbufferedKeyInput(evt);
101        }
102    bool frameStarted(const FrameEvent& evt)
103    {
104                static bool first = true;
105                if(first)
106                {
107/*                      MaterialPtr mat = MaterialManager::getSingleton().getByName("GTP/Caustic/CauCube_PointSpritecenterHead_SE_0_clone");
108                        GpuProgramParameters* Vparams = mat->getTechnique(0)->getPass(0)->getVertexProgramParameters().getPointer();
109                        GpuProgramParameters* Fparams = mat->getTechnique(0)->getPass(0)->getFragmentProgramParameters().getPointer();
110                        float intensity = cauintens;
111                        float causticColor[] = {1.0, 1.0, 1.0, intensity};
112                        Fparams->setNamedConstant("CausticColor", causticColor, 4);                     
113                        Vparams->setNamedConstant("CauSpriteSize", causize);
114                        first = false;*/
115                }
116
117                lightNode->setPosition( 100.0 * Vector3(cos(-(float)framecount/500.0),2.0,sin(-(float)framecount/500.0)));
118                light->setDirection(Vector3(0,100,0)-lightNode->getPosition());
119               
120                goldSphereNode->setPosition(   100.0 *
121                                                                Vector3(
122                                                                                cos((float)framecount/700.0),
123                                                                                1.0,
124                                                                                sin((float)framecount/700.0)));
125                silverSphereNode->setPosition( 100.0 *
126                                                                Vector3(
127                                                                                cos((float)framecount/700.0 + Math::PI / 2.0),
128                                                                                1.0,
129                                                                                sin((float)framecount/700.0 + Math::PI / 2.0)));
130                copperSphereNode->setPosition( 100.0 *
131                                                                Vector3(
132                                                                                cos((float)framecount/700.0 + Math::PI ),
133                                                                                1.0,
134                                                                                sin((float)framecount/700.0 + Math::PI)));
135                aluSphereNode->setPosition(    100.0 *
136                                                                Vector3(
137                                                                                cos((float)framecount/700.0 + 3 * Math::PI / 2.0),
138                                                                                1.0,
139                                                                                sin((float)framecount/700.0+ 3 * Math::PI / 2.0)));
140               
141                bool result = ExampleFrameListener::frameStarted(evt);
142       framecount++;
143      return result;     
144    }
145
146       
147
148};
149
150/** Application class */
151class RaytraceDemoApplication : public ExampleApplication
152{
153
154public:
155
156
157protected:
158        SceneNode* kupolaNode;
159        SceneNode* mainLightNode;
160        SceneNode* goldSphereNode;
161        SceneNode* silverSphereNode;
162        SceneNode* copperSphereNode;
163        SceneNode* aluSphereNode;
164        SceneNode* centerSphereNode;
165        Light* mainLight;
166
167
168        void loadResources(void)
169        {
170                // Initialise, parse scripts etc
171                ResourceGroupManager::getSingleton().initialiseResourceGroup("Bootstrap");
172                ResourceGroupManager::getSingleton().initialiseResourceGroup("General");
173                ResourceGroupManager::getSingleton().initialiseResourceGroup("GTP_Basic");
174                ResourceGroupManager::getSingleton().initialiseResourceGroup("PostProc");
175                ResourceGroupManager::getSingleton().initialiseResourceGroup("GTP_EnvMap");
176                ResourceGroupManager::getSingleton().initialiseResourceGroup("GTP_Caustic");
177        }
178
179        void createPostproc()
180        {               
181                CompositorManager::getSingleton().addCompositor(mWindow->getViewport(0),
182                                                                                                                "GTP/PostProc/Glow");
183                CompositorManager::getSingleton().setCompositorEnabled(mWindow->getViewport(0),
184                                                                                                                "GTP/PostProc/Glow", true);
185
186                CompositorManager::getSingleton().addCompositor(mWindow->getViewport(0),
187                                                                                                                "GTP/PostProc/ToneMap");
188                CompositorManager::getSingleton().setCompositorEnabled(mWindow->getViewport(0),
189                                                                                                                "GTP/PostProc/ToneMap", true);                 
190        }
191   
192        void chooseSceneManager()
193        {
194                mSceneMgr = mRoot->createSceneManager("OctreeSceneManager");
195                //mSceneMgr = mRoot->createSceneManager("OcclusionCullingSceneManager");
196        }
197
198        void createScene(void)
199    {
200                createPostproc();
201               
202                OgreIlluminationManager::getSingleton().setMainCamera(mCamera);
203                OgreIlluminationManager::getSingleton().setMainViewport(mWindow->getViewport(0));
204               
205                OgreIlluminationManager::getSingleton().setMaxJoinRadius(1000);         
206
207                Root::getSingleton()._setCurrentSceneManager(mSceneMgr);
208
209                mCamera->setPosition(0,100,240);
210                mCamera->setFOVy(Radian(Degree(80)));
211                //mCamera->setFarClipDistance(1000);
212                // Set ambient light
213        mSceneMgr->setAmbientLight(ColourValue(1, 1, 1));
214
215                // Skybox
216        mSceneMgr->setSkyBox(true, "Examples/MorningSkyBox");
217
218                SceneNode* rootNode = mSceneMgr->getRootSceneNode();
219
220     
221                //init objects
222                Entity* kupola = mSceneMgr->createEntity("kupola", "kupola.mesh");
223       
224                Entity* centerHead = mSceneMgr->createEntity("centerHead", "head.mesh");
225                Entity* goldHead = mSceneMgr->createEntity("goldHead", "head.mesh");
226                Entity* silverHead = mSceneMgr->createEntity("silverHeade", "head.mesh");
227                Entity* copperHead = mSceneMgr->createEntity("copperHead", "head.mesh");
228                Entity* aluHead = mSceneMgr->createEntity("aluHead", "head.mesh");
229
230                kupola->setCastShadows(false);
231               
232                MeshPtr kmesh = kupola->getMesh();
233                kmesh->buildTangentVectors(0,1);
234               
235                //init nodes
236                kupolaNode = rootNode->createChildSceneNode( "kupola" );
237                kupolaNode->rotate(Vector3(0,1,0),Radian(Degree(90)));
238                kupolaNode->attachObject( kupola );
239                kupolaNode->scale(25,21,25);           
240                //kupolaNode->scale(2,2,2);             
241                //kupolaNode->setPosition(0,100,0);
242
243                centerSphereNode = rootNode->createChildSceneNode("centerSphere");
244                centerSphereNode->setPosition(0, 100,0);
245                centerSphereNode->attachObject(centerHead);
246                centerSphereNode->setScale(3.2, 3.2, 3.2);
247               
248                goldSphereNode = rootNode->createChildSceneNode( "goldSphere" );
249                goldSphereNode->scale(2.4, 2.4, 2.4);
250                goldSphereNode->attachObject(goldHead);
251               
252                silverSphereNode = rootNode->createChildSceneNode( "silverSphere" );
253                silverSphereNode->scale(2.4, 2.4, 2.4);
254                silverSphereNode->attachObject(silverHead);
255               
256                aluSphereNode = rootNode->createChildSceneNode( "aluSphere" );
257                aluSphereNode->scale(2.4, 2.4, 2.4);
258                aluSphereNode->attachObject(aluHead);
259               
260                copperSphereNode = rootNode->createChildSceneNode( "copperSphere" );
261                copperSphereNode->scale(2.4, 2.4, 2.4);
262                copperSphereNode->attachObject(copperHead);
263               
264                goldSphereNode->_updateBounds();
265                silverSphereNode->_updateBounds();
266                aluSphereNode->_updateBounds();
267                copperSphereNode->_updateBounds();
268
269               
270                kupolaNode->_updateBounds();
271                centerSphereNode->_updateBounds();
272               
273                //Init lights
274                mainLight = mSceneMgr->createLight("MainLight");
275                mainLight->setType(Light::LT_POINT);
276        mainLight->setDiffuseColour(ColourValue::White);
277                mainLight->setSpecularColour(ColourValue::White);
278                //mainLight->setSpotlightRange(Radian(Degree(175)),Radian(Degree(180)));
279                mainLightNode = rootNode->createChildSceneNode();
280                mainLightNode->setPosition(0,0,0);             
281                mainLight->setPosition(mainLightNode->getWorldPosition());
282                mainLightNode->attachObject(mainLight);         
283                BillboardSet* bbs = mSceneMgr->createBillboardSet("bb", 1);
284                bbs->setDefaultDimensions(10,10);
285                bbs->createBillboard(Vector3::ZERO, ColourValue::White);
286                bbs->setMaterialName("Flare");
287                mainLightNode->attachObject(bbs);
288               
289               
290                aluHead->setMaterialName("GTP/EnvMap/Alu");
291                copperHead->setMaterialName("GTP/EnvMap/Copper");
292                goldHead->setMaterialName("GTP/EnvMap/Gold");
293                silverHead->setMaterialName("GTP/EnvMap/Silver");
294                centerHead->setMaterialName("GTP/Caustic/Glass_PointSprite");
295
296                OgreIlluminationManager::getSingleton().initTechniques();       
297   }
298
299        void createFrameListener(void)
300    {
301                // This is where we instantiate our own frame listener
302                mFrameListener= new RaytraceDemoListener(mWindow,
303                                                                                        mCamera,
304                                                                                        mainLightNode,
305                                                                                        goldSphereNode,
306                                                                                        silverSphereNode,
307                                                                                        copperSphereNode,
308                                                                                        aluSphereNode,
309                                                                                        centerSphereNode,
310                                                                                        mainLight);
311                mFrameListener->setPriority(1);
312                OgreIlluminationManager::getSingleton().setPriority(2);
313                mRoot->addFrameListener(mFrameListener);
314                mRoot->addFrameListener(&OgreIlluminationManager::getSingleton());
315
316    }
317
318};
319
Note: See TracBrowser for help on using the repository browser.