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

Revision 1712, 12.6 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
31float causize = 10;
32float cauintens = 40;
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("GameTools/Cauathene_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 = pow( cauintens / 100.0f, 2 );
78                        Fparams->setNamedConstant("CauSpriteIntens", intensity);                       
79                }
80                if (mInputDevice->isKeyDown(KC_ADD))
81        {
82                        cauintens += 0.5;
83                        cauintens = std::min(cauintens, 100.0f);
84                        float intensity = pow( cauintens / 100.0f, 2 );
85                        Fparams->setNamedConstant("CauSpriteIntens", intensity);                               
86                }
87                if (mInputDevice->isKeyDown(KC_MULTIPLY))
88        {
89                        causize = std::max(causize - 0.1, 0.0);
90                        Vparams->setNamedConstant("CauSpriteSize", causize);                   
91                }
92                if (mInputDevice->isKeyDown(KC_DIVIDE))
93        {
94                        causize = causize + 0.1;
95                        Vparams->setNamedConstant("CauSpriteSize", causize);                   
96                }
97        */
98                if (mInputDevice->isKeyDown(KC_SPACE))
99        {
100                        mTimeUntilNextToggle = 2;
101                        static bool first = true;
102                        first = !first;
103                        goldSphereNode->setVisible(first,true);
104                        goldSphereNode->setVisible(!first,false);
105                        aluSphereNode->setVisible(first,true);
106                        aluSphereNode->setVisible(!first,false);
107                        silverSphereNode->setVisible(first,true);
108                        silverSphereNode->setVisible(!first,false);
109                        copperSphereNode->setVisible(first,true);
110                        copperSphereNode->setVisible(!first,false);
111                        centerSphereNode->setVisible(first,true);
112                        centerSphereNode->setVisible(!first,false);
113                       
114               
115                }
116
117                return ExampleFrameListener::processUnbufferedKeyInput(evt);
118        }
119    bool frameStarted(const FrameEvent& evt)
120    {
121                static bool first = true;
122        /*      if(first)
123                {
124                        MaterialPtr mat = MaterialManager::getSingleton().getByName("GameTools/Cauathene_SE_0_clone");
125                        GpuProgramParameters* Vparams = mat->getTechnique(0)->getPass(0)->getVertexProgramParameters().getPointer();
126                        GpuProgramParameters* Fparams = mat->getTechnique(0)->getPass(0)->getFragmentProgramParameters().getPointer();
127                        float intensity = pow( cauintens / 100.0f, 2 );
128                        Fparams->setNamedConstant("CauSpriteIntens", intensity);                       
129                        Vparams->setNamedConstant("CauSpriteSize", causize);
130                        first = false;
131                }*/
132
133                lightNode->setPosition( 100.0 * Vector3(cos(-(float)framecount/500.0),2.0,sin(-(float)framecount/500.0)));
134                light->setDirection(Vector3(0,100,0)-lightNode->getPosition());
135               
136                goldSphereNode->setPosition(   100.0 *
137                                                                Vector3(
138                                                                                cos((float)framecount/700.0),
139                                                                                1.0,
140                                                                                sin((float)framecount/700.0)));
141                silverSphereNode->setPosition( 100.0 *
142                                                                Vector3(
143                                                                                cos((float)framecount/700.0 + Math::PI / 2.0),
144                                                                                1.0,
145                                                                                sin((float)framecount/700.0 + Math::PI / 2.0)));
146                copperSphereNode->setPosition( 100.0 *
147                                                                Vector3(
148                                                                                cos((float)framecount/700.0 + Math::PI ),
149                                                                                1.0,
150                                                                                sin((float)framecount/700.0 + Math::PI)));
151                aluSphereNode->setPosition(    100.0 *
152                                                                Vector3(
153                                                                                cos((float)framecount/700.0 + 3 * Math::PI / 2.0),
154                                                                                1.0,
155                                                                                sin((float)framecount/700.0+ 3 * Math::PI / 2.0)));
156               
157                bool result = ExampleFrameListener::frameStarted(evt);
158       framecount++;
159      return result;     
160    }
161
162       
163
164};
165
166/** Application class */
167class RaytraceDemoApplication : public ExampleApplication
168{
169
170public:
171
172
173protected:
174        SceneNode* kupolaNode;
175        SceneNode* mainLightNode;
176        SceneNode* goldSphereNode;
177        SceneNode* silverSphereNode;
178        SceneNode* copperSphereNode;
179        SceneNode* aluSphereNode;
180        SceneNode* centerSphereNode;
181        Light* mainLight;
182
183
184        void createPostproc()
185        {
186                CompositorManager::getSingleton().addCompositor(mWindow->getViewport(0),
187                                                                                                                "GameTools/Glow");
188                CompositorManager::getSingleton().setCompositorEnabled(mWindow->getViewport(0),
189                                                                                                                "GameTools/Glow", true);
190/*
191                CompositorManager::getSingleton().addCompositor(mWindow->getViewport(0),
192                                                                                                                "GameTools/ToneMap");
193                CompositorManager::getSingleton().setCompositorEnabled(mWindow->getViewport(0),
194                                                                                                                "GameTools/ToneMap", true);*/
195        }
196   
197
198        void createScene(void)
199    {
200
201                //createPostproc();
202               
203                OgreIlluminationManager::getSingleton().setMainCamera(mCamera);
204                OgreIlluminationManager::getSingleton().setMainViewport(mWindow->getViewport(0));
205               
206                OgreIlluminationManager::getSingleton().setMaxJoinRadius(420);         
207
208                Root::getSingleton()._setCurrentSceneManager(mSceneMgr);
209
210                mCamera->setPosition(0,100,240);
211                mCamera->setFOVy(Radian(Degree(80)));
212                //mCamera->setFarClipDistance(1000);
213                // Set ambient light
214        mSceneMgr->setAmbientLight(ColourValue(1, 1, 1));
215
216                // Skybox
217        mSceneMgr->setSkyBox(true, "Examples/MorningSkyBox");
218
219                SceneNode* rootNode = mSceneMgr->getRootSceneNode();
220
221     
222                //init objects
223                Entity* kupola = mSceneMgr->createEntity("kupola", "kupola.mesh");
224       
225                Entity* centerHead = mSceneMgr->createEntity("centerHead", "head.mesh");
226                Entity* goldHead = mSceneMgr->createEntity("goldHead", "head.mesh");
227                Entity* silverHead = mSceneMgr->createEntity("silverHeade", "head.mesh");
228                Entity* copperHead = mSceneMgr->createEntity("copperHead", "head.mesh");
229                Entity* aluHead = mSceneMgr->createEntity("aluHead", "head.mesh");
230
231                Entity* centerSphere = mSceneMgr->createEntity("centerSphere", "sphere.mesh");
232                Entity* goldSphere = mSceneMgr->createEntity("goldSphere", "sphere.mesh");
233                Entity* silverSphere = mSceneMgr->createEntity("silverSphere", "sphere.mesh");
234                Entity* copperSphere = mSceneMgr->createEntity("copperSphere", "sphere.mesh");
235                Entity* aluSphere = mSceneMgr->createEntity("aluSphere", "sphere.mesh");
236
237
238
239                kupola->setCastShadows(false);
240                //lod
241                //MeshPtr amesh = athene->getMesh();
242                //Mesh::LodDistanceList distances;
243                //distances.push_back(1);
244                //distances.push_back(2);
245                //distances.push_back(3);
246                //distances.push_back(4);
247                ////distances.push_back(5);
248                //amesh->generateLodLevels(distances,ProgressiveMesh::VertexReductionQuota::VRQ_PROPORTIONAL,0.6);
249                //athene->setMeshLodBias(50000.0,0);
250                //tangents
251                //amesh->buildTangentVectors(0,1);
252                MeshPtr kmesh = kupola->getMesh();
253                kmesh->buildTangentVectors(0,1);
254               
255                //init nodes
256                kupolaNode = rootNode->createChildSceneNode( "kupola" );
257                kupolaNode->rotate(Vector3(0,1,0),Radian(Degree(90)));
258                kupolaNode->attachObject( kupola );
259                kupolaNode->scale(25,21,25);           
260                //kupolaNode->scale(2,2,2);             
261                //kupolaNode->setPosition(0,100,0);
262
263                centerSphereNode = rootNode->createChildSceneNode("centerSphere");
264                SceneNode* centerHeadNode = centerSphereNode->createChildSceneNode("centerHead");
265                centerSphereNode->setPosition(0, 100,0);
266                centerHeadNode->attachObject(centerHead);
267                centerSphereNode->attachObject(centerSphere);
268                centerSphereNode->setScale(0.4,0.4,0.4);
269                centerHeadNode->setScale(8,8,8);               
270                centerHeadNode->setVisible(false, false);
271               
272
273                goldSphereNode = rootNode->createChildSceneNode( "goldSphere" );
274                SceneNode* goldHeadNode = goldSphereNode->createChildSceneNode( "goldHead" );
275                goldSphereNode->scale(0.3,0.3,0.3);
276                goldHeadNode->setScale(8,8,8);
277                goldHeadNode->setVisible(false, false);
278
279                silverSphereNode = rootNode->createChildSceneNode( "silverSphere" );
280                SceneNode* silverHeadNode = silverSphereNode->createChildSceneNode( "silverHead" );
281                silverSphereNode->scale(0.3,0.3,0.3);
282                silverHeadNode->setScale(8,8,8);
283                silverHeadNode->setVisible(false, false);
284
285                aluSphereNode = rootNode->createChildSceneNode( "aluSphere" );
286                SceneNode* aluHeadNode = aluSphereNode->createChildSceneNode( "aluHead" );
287                aluSphereNode->scale(0.3,0.3,0.3);
288                aluHeadNode->setScale(8,8,8);
289                aluHeadNode->setVisible(false, false);
290
291                copperSphereNode = rootNode->createChildSceneNode( "copperSphere" );
292                SceneNode* copperHeadNode = copperSphereNode->createChildSceneNode( "copperHead" );
293                copperSphereNode->scale(0.3,0.3,0.3);
294                copperHeadNode->setScale(8,8,8);
295                copperHeadNode->setVisible(false, false);
296               
297
298                goldSphereNode->attachObject(goldSphere);
299                silverSphereNode->attachObject(silverSphere);
300                aluSphereNode->attachObject(aluSphere);
301                copperSphereNode->attachObject(copperSphere);
302               
303                goldHeadNode->attachObject(goldHead);
304                silverHeadNode->attachObject(silverHead);
305                aluHeadNode->attachObject(aluHead);
306                copperHeadNode->attachObject(copperHead);
307       
308
309                goldSphereNode->_updateBounds();
310                silverSphereNode->_updateBounds();
311                aluSphereNode->_updateBounds();
312                copperSphereNode->_updateBounds();
313
314                goldHeadNode->_updateBounds();
315                silverHeadNode->_updateBounds();
316                aluHeadNode->_updateBounds();
317                copperHeadNode->_updateBounds();
318
319                kupolaNode->_updateBounds();
320                centerSphereNode->_updateBounds();
321                centerHeadNode->_updateBounds();
322
323                //Init lights
324                mainLight = mSceneMgr->createLight("MainLight");
325                mainLight->setType(Light::LT_POINT);
326        mainLight->setDiffuseColour(ColourValue::White);
327                mainLight->setSpecularColour(ColourValue::White);
328                //mainLight->setSpotlightRange(Radian(Degree(175)),Radian(Degree(180)));
329                mainLightNode = rootNode->createChildSceneNode();
330                mainLightNode->setPosition(0,0,0);             
331                mainLight->setPosition(mainLightNode->getWorldPosition());
332                mainLightNode->attachObject(mainLight);         
333                BillboardSet* bbs = mSceneMgr->createBillboardSet("bb", 1);
334                bbs->setDefaultDimensions(10,10);
335                bbs->createBillboard(Vector3::ZERO, ColourValue::White);
336                bbs->setMaterialName("Flare");
337                mainLightNode->attachObject(bbs);
338               
339                silverSphere->setMaterialName("EnvMetals/Silver");
340                copperSphere->setMaterialName("EnvMetals/Copper");
341                goldSphere->setMaterialName("EnvMetals/Gold");
342                aluSphere->setMaterialName("EnvMetals/Alu");
343
344                aluHead->setMaterialName("EnvMetals/Alu");
345                copperHead->setMaterialName("EnvMetals/Copper");
346                goldHead->setMaterialName("EnvMetals/Gold");
347                silverHead->setMaterialName("EnvMetals/Silver");
348                       
349
350                centerSphere->setMaterialName("GameTools/CausticGlass");
351                centerHead->setMaterialName("GameTools/CausticGlass");
352               
353                OgreIlluminationManager::getSingleton().initTechniques();
354               
355               
356   }
357
358        void createFrameListener(void)
359    {
360                // This is where we instantiate our own frame listener
361                mFrameListener= new RaytraceDemoListener(mWindow,
362                                                                                        mCamera,
363                                                                                        mainLightNode,
364                                                                                        goldSphereNode,
365                                                                                        silverSphereNode,
366                                                                                        copperSphereNode,
367                                                                                        aluSphereNode,
368                                                                                        centerSphereNode,
369                                                                                        mainLight);
370                mFrameListener->setPriority(1);
371                OgreIlluminationManager::getSingleton().setPriority(2);
372                mRoot->addFrameListener(mFrameListener);
373                mRoot->addFrameListener(&OgreIlluminationManager::getSingleton());
374
375    }
376
377};
378
Note: See TracBrowser for help on using the repository browser.