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

Revision 2025, 12.9 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 = 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 loadResources(void)
185        {
186                // Initialise, parse scripts etc
187                ResourceGroupManager::getSingleton().initialiseResourceGroup("Bootstrap");
188                ResourceGroupManager::getSingleton().initialiseResourceGroup("General");
189                ResourceGroupManager::getSingleton().initialiseResourceGroup("PostProc");
190        }
191
192        void createPostproc()
193        {               
194                CompositorManager::getSingleton().addCompositor(mWindow->getViewport(0),
195                                                                                                                "GTP/PostProc/Glow");
196                CompositorManager::getSingleton().setCompositorEnabled(mWindow->getViewport(0),
197                                                                                                                "GTP/PostProc/Glow", true);
198
199                CompositorManager::getSingleton().addCompositor(mWindow->getViewport(0),
200                                                                                                                "GTP/PostProc/ToneMap");
201                CompositorManager::getSingleton().setCompositorEnabled(mWindow->getViewport(0),
202                                                                                                                "GTP/PostProc/ToneMap", true);         
203        }
204   
205
206        void createScene(void)
207    {
208
209                //createPostproc();
210               
211                OgreIlluminationManager::getSingleton().setMainCamera(mCamera);
212                OgreIlluminationManager::getSingleton().setMainViewport(mWindow->getViewport(0));
213               
214                OgreIlluminationManager::getSingleton().setMaxJoinRadius(420);         
215
216                Root::getSingleton()._setCurrentSceneManager(mSceneMgr);
217
218                mCamera->setPosition(0,100,240);
219                mCamera->setFOVy(Radian(Degree(80)));
220                //mCamera->setFarClipDistance(1000);
221                // Set ambient light
222        mSceneMgr->setAmbientLight(ColourValue(1, 1, 1));
223
224                // Skybox
225        mSceneMgr->setSkyBox(true, "Examples/MorningSkyBox");
226
227                SceneNode* rootNode = mSceneMgr->getRootSceneNode();
228
229     
230                //init objects
231                Entity* kupola = mSceneMgr->createEntity("kupola", "kupola.mesh");
232       
233                Entity* centerHead = mSceneMgr->createEntity("centerHead", "head.mesh");
234                Entity* goldHead = mSceneMgr->createEntity("goldHead", "head.mesh");
235                Entity* silverHead = mSceneMgr->createEntity("silverHeade", "head.mesh");
236                Entity* copperHead = mSceneMgr->createEntity("copperHead", "head.mesh");
237                Entity* aluHead = mSceneMgr->createEntity("aluHead", "head.mesh");
238
239                Entity* centerSphere = mSceneMgr->createEntity("centerSphere", "sphere.mesh");
240                Entity* goldSphere = mSceneMgr->createEntity("goldSphere", "sphere.mesh");
241                Entity* silverSphere = mSceneMgr->createEntity("silverSphere", "sphere.mesh");
242                Entity* copperSphere = mSceneMgr->createEntity("copperSphere", "sphere.mesh");
243                Entity* aluSphere = mSceneMgr->createEntity("aluSphere", "sphere.mesh");
244
245
246
247                kupola->setCastShadows(false);
248                //lod
249                //MeshPtr amesh = athene->getMesh();
250                //Mesh::LodDistanceList distances;
251                //distances.push_back(1);
252                //distances.push_back(2);
253                //distances.push_back(3);
254                //distances.push_back(4);
255                ////distances.push_back(5);
256                //amesh->generateLodLevels(distances,ProgressiveMesh::VertexReductionQuota::VRQ_PROPORTIONAL,0.6);
257                //athene->setMeshLodBias(50000.0,0);
258                //tangents
259                //amesh->buildTangentVectors(0,1);
260                MeshPtr kmesh = kupola->getMesh();
261                kmesh->buildTangentVectors(0,1);
262               
263                //init nodes
264                kupolaNode = rootNode->createChildSceneNode( "kupola" );
265                kupolaNode->rotate(Vector3(0,1,0),Radian(Degree(90)));
266                kupolaNode->attachObject( kupola );
267                kupolaNode->scale(25,21,25);           
268                //kupolaNode->scale(2,2,2);             
269                //kupolaNode->setPosition(0,100,0);
270
271                centerSphereNode = rootNode->createChildSceneNode("centerSphere");
272                SceneNode* centerHeadNode = centerSphereNode->createChildSceneNode("centerHead");
273                centerSphereNode->setPosition(0, 100,0);
274                centerHeadNode->attachObject(centerHead);
275                centerSphereNode->attachObject(centerSphere);
276                centerSphereNode->setScale(0.4,0.4,0.4);
277                centerHeadNode->setScale(8,8,8);               
278                centerHeadNode->setVisible(false, false);
279               
280
281                goldSphereNode = rootNode->createChildSceneNode( "goldSphere" );
282                SceneNode* goldHeadNode = goldSphereNode->createChildSceneNode( "goldHead" );
283                goldSphereNode->scale(0.3,0.3,0.3);
284                goldHeadNode->setScale(8,8,8);
285                goldHeadNode->setVisible(false, false);
286
287                silverSphereNode = rootNode->createChildSceneNode( "silverSphere" );
288                SceneNode* silverHeadNode = silverSphereNode->createChildSceneNode( "silverHead" );
289                silverSphereNode->scale(0.3,0.3,0.3);
290                silverHeadNode->setScale(8,8,8);
291                silverHeadNode->setVisible(false, false);
292
293                aluSphereNode = rootNode->createChildSceneNode( "aluSphere" );
294                SceneNode* aluHeadNode = aluSphereNode->createChildSceneNode( "aluHead" );
295                aluSphereNode->scale(0.3,0.3,0.3);
296                aluHeadNode->setScale(8,8,8);
297                aluHeadNode->setVisible(false, false);
298
299                copperSphereNode = rootNode->createChildSceneNode( "copperSphere" );
300                SceneNode* copperHeadNode = copperSphereNode->createChildSceneNode( "copperHead" );
301                copperSphereNode->scale(0.3,0.3,0.3);
302                copperHeadNode->setScale(8,8,8);
303                copperHeadNode->setVisible(false, false);
304               
305
306                goldSphereNode->attachObject(goldSphere);
307                silverSphereNode->attachObject(silverSphere);
308                aluSphereNode->attachObject(aluSphere);
309                copperSphereNode->attachObject(copperSphere);
310               
311                goldHeadNode->attachObject(goldHead);
312                silverHeadNode->attachObject(silverHead);
313                aluHeadNode->attachObject(aluHead);
314                copperHeadNode->attachObject(copperHead);
315       
316
317                goldSphereNode->_updateBounds();
318                silverSphereNode->_updateBounds();
319                aluSphereNode->_updateBounds();
320                copperSphereNode->_updateBounds();
321
322                goldHeadNode->_updateBounds();
323                silverHeadNode->_updateBounds();
324                aluHeadNode->_updateBounds();
325                copperHeadNode->_updateBounds();
326
327                kupolaNode->_updateBounds();
328                centerSphereNode->_updateBounds();
329                centerHeadNode->_updateBounds();
330
331                //Init lights
332                mainLight = mSceneMgr->createLight("MainLight");
333                mainLight->setType(Light::LT_POINT);
334        mainLight->setDiffuseColour(ColourValue::White);
335                mainLight->setSpecularColour(ColourValue::White);
336                //mainLight->setSpotlightRange(Radian(Degree(175)),Radian(Degree(180)));
337                mainLightNode = rootNode->createChildSceneNode();
338                mainLightNode->setPosition(0,0,0);             
339                mainLight->setPosition(mainLightNode->getWorldPosition());
340                mainLightNode->attachObject(mainLight);         
341                BillboardSet* bbs = mSceneMgr->createBillboardSet("bb", 1);
342                bbs->setDefaultDimensions(10,10);
343                bbs->createBillboard(Vector3::ZERO, ColourValue::White);
344                bbs->setMaterialName("Flare");
345                mainLightNode->attachObject(bbs);
346               
347                silverSphere->setMaterialName("EnvMetals/Silver");
348                copperSphere->setMaterialName("EnvMetals/Copper");
349                goldSphere->setMaterialName("EnvMetals/Gold");
350                aluSphere->setMaterialName("EnvMetals/Alu");
351
352                aluHead->setMaterialName("EnvMetals/Alu");
353                copperHead->setMaterialName("EnvMetals/Copper");
354                goldHead->setMaterialName("EnvMetals/Gold");
355                silverHead->setMaterialName("EnvMetals/Silver");
356                       
357
358                centerSphere->setMaterialName("GameTools/CausticGlass");
359                centerHead->setMaterialName("GameTools/CausticGlass");
360               
361                OgreIlluminationManager::getSingleton().initTechniques();
362               
363               
364   }
365
366        void createFrameListener(void)
367    {
368                // This is where we instantiate our own frame listener
369                mFrameListener= new RaytraceDemoListener(mWindow,
370                                                                                        mCamera,
371                                                                                        mainLightNode,
372                                                                                        goldSphereNode,
373                                                                                        silverSphereNode,
374                                                                                        copperSphereNode,
375                                                                                        aluSphereNode,
376                                                                                        centerSphereNode,
377                                                                                        mainLight);
378                mFrameListener->setPriority(1);
379                OgreIlluminationManager::getSingleton().setPriority(2);
380                mRoot->addFrameListener(mFrameListener);
381                mRoot->addFrameListener(&OgreIlluminationManager::getSingleton());
382
383    }
384
385};
386
Note: See TracBrowser for help on using the repository browser.