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

Revision 2057, 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#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
193        void createScene(void)
194    {
195
196                //createPostproc();
197               
198                OgreIlluminationManager::getSingleton().setMainCamera(mCamera);
199                OgreIlluminationManager::getSingleton().setMainViewport(mWindow->getViewport(0));
200               
201                OgreIlluminationManager::getSingleton().setMaxJoinRadius(1000);         
202
203                Root::getSingleton()._setCurrentSceneManager(mSceneMgr);
204
205                mCamera->setPosition(0,100,240);
206                mCamera->setFOVy(Radian(Degree(80)));
207                //mCamera->setFarClipDistance(1000);
208                // Set ambient light
209        mSceneMgr->setAmbientLight(ColourValue(1, 1, 1));
210
211                // Skybox
212        mSceneMgr->setSkyBox(true, "Examples/MorningSkyBox");
213
214                SceneNode* rootNode = mSceneMgr->getRootSceneNode();
215
216     
217                //init objects
218                Entity* kupola = mSceneMgr->createEntity("kupola", "kupola.mesh");
219       
220                Entity* centerHead = mSceneMgr->createEntity("centerHead", "head.mesh");
221                Entity* goldHead = mSceneMgr->createEntity("goldHead", "head.mesh");
222                Entity* silverHead = mSceneMgr->createEntity("silverHeade", "head.mesh");
223                Entity* copperHead = mSceneMgr->createEntity("copperHead", "head.mesh");
224                Entity* aluHead = mSceneMgr->createEntity("aluHead", "head.mesh");
225
226                kupola->setCastShadows(false);
227               
228                MeshPtr kmesh = kupola->getMesh();
229                kmesh->buildTangentVectors(0,1);
230               
231                //init nodes
232                kupolaNode = rootNode->createChildSceneNode( "kupola" );
233                kupolaNode->rotate(Vector3(0,1,0),Radian(Degree(90)));
234                kupolaNode->attachObject( kupola );
235                kupolaNode->scale(25,21,25);           
236                //kupolaNode->scale(2,2,2);             
237                //kupolaNode->setPosition(0,100,0);
238
239                centerSphereNode = rootNode->createChildSceneNode("centerSphere");
240                centerSphereNode->setPosition(0, 100,0);
241                centerSphereNode->attachObject(centerHead);
242                centerSphereNode->setScale(3.2, 3.2, 3.2);
243               
244                goldSphereNode = rootNode->createChildSceneNode( "goldSphere" );
245                goldSphereNode->scale(2.4, 2.4, 2.4);
246                goldSphereNode->attachObject(goldHead);
247               
248                silverSphereNode = rootNode->createChildSceneNode( "silverSphere" );
249                silverSphereNode->scale(2.4, 2.4, 2.4);
250                silverSphereNode->attachObject(silverHead);
251               
252                aluSphereNode = rootNode->createChildSceneNode( "aluSphere" );
253                aluSphereNode->scale(2.4, 2.4, 2.4);
254                aluSphereNode->attachObject(aluHead);
255               
256                copperSphereNode = rootNode->createChildSceneNode( "copperSphere" );
257                copperSphereNode->scale(2.4, 2.4, 2.4);
258                copperSphereNode->attachObject(copperHead);
259               
260                goldSphereNode->_updateBounds();
261                silverSphereNode->_updateBounds();
262                aluSphereNode->_updateBounds();
263                copperSphereNode->_updateBounds();
264
265               
266                kupolaNode->_updateBounds();
267                centerSphereNode->_updateBounds();
268               
269                //Init lights
270                mainLight = mSceneMgr->createLight("MainLight");
271                mainLight->setType(Light::LT_POINT);
272        mainLight->setDiffuseColour(ColourValue::White);
273                mainLight->setSpecularColour(ColourValue::White);
274                //mainLight->setSpotlightRange(Radian(Degree(175)),Radian(Degree(180)));
275                mainLightNode = rootNode->createChildSceneNode();
276                mainLightNode->setPosition(0,0,0);             
277                mainLight->setPosition(mainLightNode->getWorldPosition());
278                mainLightNode->attachObject(mainLight);         
279                BillboardSet* bbs = mSceneMgr->createBillboardSet("bb", 1);
280                bbs->setDefaultDimensions(10,10);
281                bbs->createBillboard(Vector3::ZERO, ColourValue::White);
282                bbs->setMaterialName("Flare");
283                mainLightNode->attachObject(bbs);
284               
285               
286                aluHead->setMaterialName("GTP/EnvMap/Alu");
287                copperHead->setMaterialName("GTP/EnvMap/Copper");
288                goldHead->setMaterialName("GTP/EnvMap/Gold");
289                silverHead->setMaterialName("GTP/EnvMap/Silver");
290                centerHead->setMaterialName("GTP/Caustic/Glass");
291
292                /*aluHead->setVisible(false);
293                copperHead->setVisible(false);
294                goldHead->setVisible(false);
295                silverHead->setVisible(false);
296                centerHead->setVisible(false);*/
297
298                OgreIlluminationManager::getSingleton().initTechniques();       
299   }
300
301        void createFrameListener(void)
302    {
303                // This is where we instantiate our own frame listener
304                mFrameListener= new RaytraceDemoListener(mWindow,
305                                                                                        mCamera,
306                                                                                        mainLightNode,
307                                                                                        goldSphereNode,
308                                                                                        silverSphereNode,
309                                                                                        copperSphereNode,
310                                                                                        aluSphereNode,
311                                                                                        centerSphereNode,
312                                                                                        mainLight);
313                mFrameListener->setPriority(1);
314                OgreIlluminationManager::getSingleton().setPriority(2);
315                mRoot->addFrameListener(mFrameListener);
316                mRoot->addFrameListener(&OgreIlluminationManager::getSingleton());
317
318    }
319
320};
321
Note: See TracBrowser for help on using the repository browser.