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

Revision 1054, 11.1 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
31bool HighQuality = false;
32float causize = 7;
33float cauintens = 40;
34
35// Listener class for frame updates
36class RaytraceDemoListener : public ExampleFrameListener
37{
38protected:
39        SceneNode* goldSphereNode;
40        SceneNode* silverSphereNode;
41        SceneNode* copperSphereNode;
42        SceneNode* aluSphereNode;
43        SceneNode* lightNode;
44        unsigned long framecount;
45       
46public:
47    RaytraceDemoListener(RenderWindow* window, Camera* maincam,SceneNode* lightNode,
48                                                                                                                                SceneNode* goldSphereNode,
49                                                                                                                                SceneNode* silverSphereNode,
50                                                                                                                                SceneNode* copperSphereNode,
51                                                                                                                                SceneNode* aluSphereNode)
52        :ExampleFrameListener(window, maincam)
53                                 
54    {
55                framecount = 0;
56                this->goldSphereNode = goldSphereNode;
57                this->silverSphereNode = silverSphereNode;
58                this->copperSphereNode = copperSphereNode;
59                this->aluSphereNode = aluSphereNode;
60                this->lightNode = lightNode;
61    }
62        bool processUnbufferedKeyInput(const FrameEvent& evt)
63    {
64                MaterialPtr mat = MaterialManager::getSingleton().getByName("GameTools/Cau");
65                GpuProgramParameters* Vparams = mat->getTechnique(0)->getPass(0)->getVertexProgramParameters().getPointer();
66                GpuProgramParameters* Fparams = mat->getTechnique(0)->getPass(0)->getFragmentProgramParameters().getPointer();
67               
68                if (mInputDevice->isKeyDown(KC_SUBTRACT))
69        {
70                        cauintens -= 0.5;
71                        cauintens = std::max(cauintens, 1.0f);
72                        float intensity = pow( cauintens / 100.0f, 2 );
73                        Fparams->setNamedConstant("CauSpriteIntens", intensity);                       
74                }
75                if (mInputDevice->isKeyDown(KC_ADD))
76        {
77                        cauintens += 0.5;
78                        cauintens = std::min(cauintens, 100.0f);
79                        float intensity = pow( cauintens / 100.0f, 2 );
80                        Fparams->setNamedConstant("CauSpriteIntens", intensity);                               
81                }
82                if (mInputDevice->isKeyDown(KC_MULTIPLY))
83        {
84                        causize = std::max(causize - 0.1, 0.0);
85                        Vparams->setNamedConstant("CauSpriteSize", causize);                   
86                }
87                if (mInputDevice->isKeyDown(KC_DIVIDE))
88        {
89                        causize = causize + 0.1;
90                        Vparams->setNamedConstant("CauSpriteSize", causize);                   
91                }
92
93                return ExampleFrameListener::processUnbufferedKeyInput(evt);
94        }
95    bool frameStarted(const FrameEvent& evt)
96    {
97                static bool first = true;
98                if(first)
99                {
100                        MaterialPtr mat = MaterialManager::getSingleton().getByName("GameTools/Cau");
101                        GpuProgramParameters* Vparams = mat->getTechnique(0)->getPass(0)->getVertexProgramParameters().getPointer();
102                        GpuProgramParameters* Fparams = mat->getTechnique(0)->getPass(0)->getFragmentProgramParameters().getPointer();
103                        float intensity = pow( cauintens / 100.0f, 2 );
104                        Fparams->setNamedConstant("CauSpriteIntens", intensity);                       
105                        Vparams->setNamedConstant("CauSpriteSize", causize);
106                        first = false;
107                }
108
109                lightNode->setPosition( 100.0 * Vector3(cos(-(float)framecount/500.0),2.0,sin(-(float)framecount/500.0)));
110                //lightNode->setDirection(-lightNode->getPosition());
111               
112                goldSphereNode->setPosition(   100.0 *
113                                                                Vector3(
114                                                                                cos((float)framecount/700.0),
115                                                                                1.0,
116                                                                                sin((float)framecount/700.0)));
117                silverSphereNode->setPosition( 100.0 *
118                                                                Vector3(
119                                                                                cos((float)framecount/700.0 + Math::PI / 2.0),
120                                                                                1.0,
121                                                                                sin((float)framecount/700.0 + Math::PI / 2.0)));
122                copperSphereNode->setPosition( 100.0 *
123                                                                Vector3(
124                                                                                cos((float)framecount/700.0 + Math::PI ),
125                                                                                1.0,
126                                                                                sin((float)framecount/700.0 + Math::PI)));
127                aluSphereNode->setPosition(    100.0 *
128                                                                Vector3(
129                                                                                cos((float)framecount/700.0 + 3 * Math::PI / 2.0),
130                                                                                1.0,
131                                                                                sin((float)framecount/700.0+ 3 * Math::PI / 2.0)));
132               
133                bool result = ExampleFrameListener::frameStarted(evt);
134       framecount++;
135      return result;     
136    }
137
138       
139
140};
141
142/** Application class */
143class RaytraceDemoApplication : public ExampleApplication
144{
145
146public:
147        virtual void go(void)
148    {
149        if (!setup())
150            return;
151
152        renderScene();
153               
154        // clean up
155        destroyScene();
156    }
157
158
159protected:
160        SceneNode* kupolaNode;
161        SceneNode* mainLightNode;
162        SceneNode* goldSphereNode;
163        SceneNode* silverSphereNode;
164        SceneNode* copperSphereNode;
165        SceneNode* aluSphereNode;
166
167void renderScene(){
168               
169                mWindow->resetStatistics();
170                while(true){           
171
172                       
173                        #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32           
174                        // Pump events on Win32
175                MSG  msg;
176                        while( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
177                        {
178                                TranslateMessage( &msg );
179                                DispatchMessage( &msg );
180                        }
181                       
182                        #endif
183                       
184                        if(!mRoot->_fireFrameStarted()){
185                                break;
186                        }
187                        unsigned long framenum = mRoot->getCurrentFrameNumber();
188                       
189                        OgreIlluminationManager::getSingleton().update(framenum, mWindow);
190                       
191                        //mRoot->renderOneFrame();
192                        mRoot->_updateAllRenderTargets();
193
194                        mRoot->_fireFrameEnded();       
195                       
196                }
197        }
198
199        void createPostproc()
200        {
201                CompositorManager::getSingleton().addCompositor(mWindow->getViewport(0),
202                                                                                                                "GameTools/Glow");
203                CompositorManager::getSingleton().setCompositorEnabled(mWindow->getViewport(0),
204                                                                                                                "GameTools/Glow", true);
205/*
206                CompositorManager::getSingleton().addCompositor(mWindow->getViewport(0),
207                                                                                                                "GameTools/ToneMap");
208                CompositorManager::getSingleton().setCompositorEnabled(mWindow->getViewport(0),
209                                                                                                                "GameTools/ToneMap", true);*/
210        }
211   
212
213        void createScene(void)
214    {
215
216                createPostproc();
217               
218                OgreIlluminationManager::getSingleton().setMainCamera(mCamera);
219                OgreIlluminationManager::getSingleton().setMainViewport(mWindow->getViewport(0));
220               
221                if(! HighQuality)
222                        OgreIlluminationManager::getSingleton().setMaxJoinRadius(420);
223                else
224                        OgreIlluminationManager::getSingleton().setMaxJoinRadius(0.1);
225
226
227                Root::getSingleton()._setCurrentSceneManager(mSceneMgr);
228                mCamera->setPosition(0,100,240);
229                mCamera->setFOVy(Radian(Degree(80)));
230                //mCamera->setFarClipDistance(1000);
231                // Set ambient light
232        mSceneMgr->setAmbientLight(ColourValue(1, 1, 1));
233
234                // Skybox
235        mSceneMgr->setSkyBox(true, "Examples/MorningSkyBox");
236
237                SceneNode* rootNode = mSceneMgr->getRootSceneNode();
238
239     
240                //init objects
241                Entity* kupola = mSceneMgr->createEntity("kupola", "kupola.mesh");
242                Entity* athene = mSceneMgr->createEntity("athene", "head.mesh");
243                Entity* goldSphere = mSceneMgr->createEntity("goldSphere", "head.mesh");
244                Entity* silverSphere = mSceneMgr->createEntity("silverSphere", "head.mesh");
245                Entity* copperSphere = mSceneMgr->createEntity("copperSphere", "head.mesh");
246                Entity* aluSphere = mSceneMgr->createEntity("aluSphere", "head.mesh");
247
248                kupola->setCastShadows(false);
249                //lod
250                //MeshPtr amesh = athene->getMesh();
251                //Mesh::LodDistanceList distances;
252                //distances.push_back(1);
253                //distances.push_back(2);
254                //distances.push_back(3);
255                //distances.push_back(4);
256                ////distances.push_back(5);
257                //amesh->generateLodLevels(distances,ProgressiveMesh::VertexReductionQuota::VRQ_PROPORTIONAL,0.6);
258                //athene->setMeshLodBias(50000.0,0);
259                //tangents
260                //amesh->buildTangentVectors(0,1);
261                MeshPtr kmesh = kupola->getMesh();
262                kmesh->buildTangentVectors(0,1);
263               
264                //init nodes
265                kupolaNode = rootNode->createChildSceneNode( "kupola" );
266                kupolaNode->rotate(Vector3(0,1,0),Radian(Degree(90)));
267                kupolaNode->attachObject( kupola );
268                kupolaNode->scale(25,21,25);           
269                //kupolaNode->scale(2,2,2);             
270                //kupolaNode->setPosition(0,100,0);
271                SceneNode* atheneNode = rootNode->createChildSceneNode("athene");
272                atheneNode->attachObject(athene);
273                //atheneNode->setScale(3.5,5.5,5.5);
274                atheneNode->setScale(4,4,4);
275                //atheneNode->setScale(0.5,0.5,0.5);
276                AxisAlignedBox bbox = athene->getBoundingBox();
277                atheneNode->setPosition(0, 100,0);
278               
279
280                goldSphereNode = rootNode->createChildSceneNode( "goldSphere" );
281                //goldSphereNode->scale(0.3,0.3,0.3);
282                goldSphereNode->scale(2,2,2);
283                silverSphereNode = rootNode->createChildSceneNode( "silverSphere" );
284                //silverSphereNode->scale(0.3,0.3,0.3);
285                silverSphereNode->scale(2,2,2);
286                copperSphereNode = rootNode->createChildSceneNode( "copperSphere" );
287                //copperSphereNode->scale(0.3,0.3,0.3);
288                copperSphereNode->scale(2,2,2);
289                aluSphereNode = rootNode->createChildSceneNode( "aluSphere" );
290                //aluSphereNode->scale(0.3,0.3,0.3);
291                aluSphereNode->scale(2,2,2);
292
293                goldSphereNode->attachObject(goldSphere);
294                silverSphereNode->attachObject(silverSphere);
295                aluSphereNode->attachObject(aluSphere);
296                copperSphereNode->attachObject(copperSphere);
297
298                goldSphereNode->_updateBounds();
299                silverSphereNode->_updateBounds();
300                aluSphereNode->_updateBounds();
301                copperSphereNode->_updateBounds();
302
303                kupolaNode->_updateBounds();
304                atheneNode->_updateBounds();
305
306                //Init lights
307                Light* mainLight = mSceneMgr->createLight("MainLight");
308                mainLight->setType(Light::LT_POINT);
309        mainLight->setDiffuseColour(ColourValue::White);
310                mainLight->setSpecularColour(ColourValue::White);
311                mainLightNode = rootNode->createChildSceneNode();
312                mainLightNode->setPosition(0,0,0);             
313                mainLight->setPosition(mainLightNode->getWorldPosition());
314                mainLightNode->attachObject(mainLight);         
315
316                aluSphere->setMaterialName("EnvMetals/Alu");
317                copperSphere->setMaterialName("EnvMetals/Copper");
318               
319                {
320                        Material* oldmat = (Material*) MaterialManager::getSingleton().getByName("EnvMetals/Gold").getPointer();
321                        Material* newmat = oldmat->clone("gold1").getPointer();
322                        Material* newmat2 = oldmat->clone("gold2").getPointer();
323
324                        goldSphere->setMaterialName(newmat->getName());
325                        silverSphere->setMaterialName(newmat2->getName());
326                }
327
328                Material* oldmat = (Material*) MaterialManager::getSingleton().getByName("GameTools/CubeMap/Localized").getPointer();
329                Material* newmat = oldmat->clone("zazi").getPointer();
330
331                athene->setMaterialName(newmat->getName());
332                //athene->setMaterialName("GameTools/CubeMap/Diffuse");
333               
334                OgreIlluminationManager::getSingleton().initTechniques();
335               
336               
337   }
338
339        void createFrameListener(void)
340    {
341                // This is where we instantiate our own frame listener
342                mFrameListener= new RaytraceDemoListener(mWindow,
343                                                                                        mCamera,
344                                                                                        mainLightNode,
345                                                                                        goldSphereNode,
346                                                                                        silverSphereNode,
347                                                                                        copperSphereNode,
348                                                                                        aluSphereNode);
349        mRoot->addFrameListener(mFrameListener);
350                //mRoot->addFrameListener(&OgreIlluminationManager::getSingleton());
351
352    }
353
354};
355
Note: See TracBrowser for help on using the repository browser.