/* ----------------------------------------------------------------------------- This source file is part of OGRE (Object-oriented Graphics Rendering Engine) For the latest info, see http://www.ogre3d.org/ Copyright (c) 2000-2005 The OGRE Team Also see acknowledgements in Readme.html You may use this sample code for anything you like, it is not covered by the LGPL like the rest of the engine. ----------------------------------------------------------------------------- */ /** \file Lighting.h \brief Shows lighting support in OGRE. Also demonstrates the use of billboards and controllers for automatic time-relative behaviour. */ #include "ExampleApplication.h" #include "OgreIlluminationManager.h" #include "SpriteParticleRenderer.h" bool visibilitySM = false; int scene = 1; // Listener class for frame updates class ParticleDemoFrameListener : public ExampleFrameListener { protected: SceneNode* lightNode; public: ParticleDemoFrameListener(RenderWindow* window, Camera* maincam, SceneNode* lightNode) :ExampleFrameListener(window, maincam) { this->lightNode = lightNode; } bool frameStarted(const FrameEvent& evt) { bool result = ExampleFrameListener::frameStarted(evt); if(scene == 1) { Timer* timer = Root::getSingleton().getTimer(); float t = (float) timer->getMilliseconds() / 2000.0; float r = 150; lightNode->setPosition( r * sin(t), r * sin(5 * t) + 200 , r * cos(t)); } return result; } }; /** Application class */ class ParticleDemoApplication : public ExampleApplication { public: protected: SceneNode* kupolaNode; SceneNode* mainLightNode; void loadResources(void) { // Initialise, parse scripts etc ResourceGroupManager::getSingleton().initialiseResourceGroup("Bootstrap"); ResourceGroupManager::getSingleton().initialiseResourceGroup("General"); ResourceGroupManager::getSingleton().initialiseResourceGroup("GTP_Basic"); //ResourceGroupManager::getSingleton().initialiseResourceGroup("PostProc"); ResourceGroupManager::getSingleton().initialiseResourceGroup("GTP_Basic"); ResourceGroupManager::getSingleton().initialiseResourceGroup("GTP_Particles"); } void createPostproc() { CompositorManager::getSingleton().addCompositor(mWindow->getViewport(0), "GTP/PostProc/Glow"); CompositorManager::getSingleton().setCompositorEnabled(mWindow->getViewport(0), "GTP/PostProc/Glow", true); CompositorManager::getSingleton().addCompositor(mWindow->getViewport(0), "GTP/PostProc/ToneMap"); CompositorManager::getSingleton().setCompositorEnabled(mWindow->getViewport(0), "GTP/PostProc/ToneMap", true); } void chooseSceneManager() { if(visibilitySM) mSceneMgr = mRoot->createSceneManager("OcclusionCullingSceneManager"); else { if(scene == 1) mSceneMgr = mRoot->createSceneManager("OctreeSceneManager"); else if(scene == 2) mSceneMgr = mRoot->createSceneManager("TerrainSceneManager"); } } void createScene(void) { OgreIlluminationManager::getSingleton().setMainCamera(mCamera); OgreIlluminationManager::getSingleton().setMainViewport(mWindow->getViewport(0)); Root::getSingleton()._setCurrentSceneManager(mSceneMgr); mCamera->setFOVy(Radian(Degree(80))); mCamera->setFarClipDistance(5000); // Set ambient light mSceneMgr->setAmbientLight(ColourValue(1, 1, 1)); // Skybox mSceneMgr->setSkyBox(true, "Examples/EveningSkyBox", 10); //OgreIlluminationManager::getSingleton().createGlobalRun(ILLUMRUN_PHASE_TEXTURE); //OgreIlluminationManager::getSingleton().updateGlobalRun(ILLUMRUN_PHASE_TEXTURE, 1); //OgreIlluminationManager::getSingleton().savePhaseTextureToFile("phase.dds"); if(scene == 1) createScene1(); else if(scene == 2) createScene2(); OgreIlluminationManager::getSingleton().initTechniques(); } void createScene1() { std::string occlusion_cfg("OcclusionCulling.cfg"); if(visibilitySM) mSceneMgr->setWorldGeometry(occlusion_cfg); mCamera->setPosition(0,150,100); mCamera->setDirection(0,0,-1); SceneNode* rootNode = mSceneMgr->getRootSceneNode(); Entity* head = mSceneMgr->createEntity("head", "athene.mesh"); SceneNode* headNode = rootNode->createChildSceneNode("head"); head->setMaterialName("GameTools/Standard"); headNode->attachObject(head); //headNode->setScale(1.5,1.5,1.5); AxisAlignedBox bbox = head->getBoundingBox(); headNode->setPosition(0,80,20); headNode->_updateBounds(); ParticleSystem* pSys1 = mSceneMgr->createParticleSystem("psys1", "GTP/HPS/Smoke_Large"); //ParticleSystem* pSys1 = mSceneMgr->createParticleSystem("psys1", "GTP/Smoke_Large"); pSys1->setKeepParticlesInLocalSpace(false); SceneNode *pSysNode = rootNode->createChildSceneNode("psys1"); pSysNode->attachObject(pSys1); pSysNode->setPosition(0,0,0); //Init lights Light* mainLight = mSceneMgr->createLight("MainLight"); mainLight->setType(Light::LT_POINT); mainLight->setDiffuseColour(ColourValue::White); mainLight->setSpecularColour(ColourValue::White); mainLightNode = rootNode->createChildSceneNode(); mainLightNode->setPosition(0,500,0); mainLight->setPosition(mainLightNode->getWorldPosition()); mainLightNode->attachObject(mainLight); BillboardSet* bbs = mSceneMgr->createBillboardSet("bb", 1); bbs->createBillboard(Vector3::ZERO, ColourValue::White); bbs->setMaterialName("Flare"); mainLightNode->attachObject(bbs); } void createScene2() { mCamera->setPosition(0,150,100); mCamera->setDirection(0,0,-1); SceneNode* rootNode = mSceneMgr->getRootSceneNode(); if(visibilitySM) { std::string terrain_cfg("VisTerrain.cfg"); mSceneMgr -> setWorldGeometry( terrain_cfg ); } else { std::string terrain_cfg("terrain.cfg"); mSceneMgr -> setWorldGeometry( terrain_cfg ); } ParticleSystem* pSys1 = mSceneMgr->createParticleSystem("psys1", "GTP/HPS/Smoke_Large"); pSys1->setKeepParticlesInLocalSpace(false); SceneNode *pSysNode = rootNode->createChildSceneNode("psys1"); pSysNode->attachObject(pSys1); pSysNode->setPosition(600,-50,600); //Init lights Light* mainLight = mSceneMgr->createLight("MainLight"); mainLight->setType(Light::LT_POINT); mainLight->setDiffuseColour(ColourValue::White); mainLight->setSpecularColour(ColourValue::White); mainLightNode = rootNode->createChildSceneNode(); mainLightNode->setPosition(0,500,0); mainLight->setPosition(mainLightNode->getWorldPosition()); mainLightNode->attachObject(mainLight); BillboardSet* bbs = mSceneMgr->createBillboardSet("bb", 1); bbs->createBillboard(Vector3::ZERO, ColourValue::White); bbs->setMaterialName("Flare"); mainLightNode->attachObject(bbs); } void createFrameListener(void) { // This is where we instantiate our own frame listener mFrameListener= new ParticleDemoFrameListener(mWindow, mCamera , mainLightNode); mFrameListener->setPriority(2); OgreIlluminationManager::getSingleton().setPriority(10); mRoot->addFrameListener(mFrameListener); mRoot->addFrameListener(&OgreIlluminationManager::getSingleton()); } };