/* ----------------------------------------------------------------------------- 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" float causize = 10; float cauintens = 40; // Listener class for frame updates class RaytraceDemoListener : public ExampleFrameListener { protected: SceneNode* goldSphereNode; SceneNode* silverSphereNode; SceneNode* copperSphereNode; SceneNode* aluSphereNode; SceneNode* centerSphereNode; SceneNode* lightNode; Light* light; unsigned long framecount; public: RaytraceDemoListener(RenderWindow* window, Camera* maincam,SceneNode* lightNode, SceneNode* goldSphereNode, SceneNode* silverSphereNode, SceneNode* copperSphereNode, SceneNode* aluSphereNode, SceneNode* centerSphereNode, Light* light) :ExampleFrameListener(window, maincam) { framecount = 0; this->goldSphereNode = goldSphereNode; this->silverSphereNode = silverSphereNode; this->copperSphereNode = copperSphereNode; this->aluSphereNode = aluSphereNode; this->centerSphereNode = centerSphereNode; this->lightNode = lightNode; this->light = light; } bool processUnbufferedKeyInput(const FrameEvent& evt) {/* MaterialPtr mat = MaterialManager::getSingleton().getByName("GameTools/Cauathene_SE_0_clone"); GpuProgramParameters* Vparams = mat->getTechnique(0)->getPass(0)->getVertexProgramParameters().getPointer(); GpuProgramParameters* Fparams = mat->getTechnique(0)->getPass(0)->getFragmentProgramParameters().getPointer(); if (mInputDevice->isKeyDown(KC_SUBTRACT)) { cauintens -= 0.5; cauintens = std::max(cauintens, 1.0f); float intensity = pow( cauintens / 100.0f, 2 ); Fparams->setNamedConstant("CauSpriteIntens", intensity); } if (mInputDevice->isKeyDown(KC_ADD)) { cauintens += 0.5; cauintens = std::min(cauintens, 100.0f); float intensity = pow( cauintens / 100.0f, 2 ); Fparams->setNamedConstant("CauSpriteIntens", intensity); } if (mInputDevice->isKeyDown(KC_MULTIPLY)) { causize = std::max(causize - 0.1, 0.0); Vparams->setNamedConstant("CauSpriteSize", causize); } if (mInputDevice->isKeyDown(KC_DIVIDE)) { causize = causize + 0.1; Vparams->setNamedConstant("CauSpriteSize", causize); } */ if (mInputDevice->isKeyDown(KC_SPACE)) { mTimeUntilNextToggle = 2; static bool first = true; first = !first; goldSphereNode->setVisible(first,true); goldSphereNode->setVisible(!first,false); aluSphereNode->setVisible(first,true); aluSphereNode->setVisible(!first,false); silverSphereNode->setVisible(first,true); silverSphereNode->setVisible(!first,false); copperSphereNode->setVisible(first,true); copperSphereNode->setVisible(!first,false); centerSphereNode->setVisible(first,true); centerSphereNode->setVisible(!first,false); } return ExampleFrameListener::processUnbufferedKeyInput(evt); } bool frameStarted(const FrameEvent& evt) { static bool first = true; /* if(first) { MaterialPtr mat = MaterialManager::getSingleton().getByName("GameTools/Cauathene_SE_0_clone"); GpuProgramParameters* Vparams = mat->getTechnique(0)->getPass(0)->getVertexProgramParameters().getPointer(); GpuProgramParameters* Fparams = mat->getTechnique(0)->getPass(0)->getFragmentProgramParameters().getPointer(); float intensity = pow( cauintens / 100.0f, 2 ); Fparams->setNamedConstant("CauSpriteIntens", intensity); Vparams->setNamedConstant("CauSpriteSize", causize); first = false; }*/ lightNode->setPosition( 100.0 * Vector3(cos(-(float)framecount/500.0),2.0,sin(-(float)framecount/500.0))); light->setDirection(Vector3(0,100,0)-lightNode->getPosition()); goldSphereNode->setPosition( 100.0 * Vector3( cos((float)framecount/700.0), 1.0, sin((float)framecount/700.0))); silverSphereNode->setPosition( 100.0 * Vector3( cos((float)framecount/700.0 + Math::PI / 2.0), 1.0, sin((float)framecount/700.0 + Math::PI / 2.0))); copperSphereNode->setPosition( 100.0 * Vector3( cos((float)framecount/700.0 + Math::PI ), 1.0, sin((float)framecount/700.0 + Math::PI))); aluSphereNode->setPosition( 100.0 * Vector3( cos((float)framecount/700.0 + 3 * Math::PI / 2.0), 1.0, sin((float)framecount/700.0+ 3 * Math::PI / 2.0))); bool result = ExampleFrameListener::frameStarted(evt); framecount++; return result; } }; /** Application class */ class RaytraceDemoApplication : public ExampleApplication { public: protected: SceneNode* kupolaNode; SceneNode* mainLightNode; SceneNode* goldSphereNode; SceneNode* silverSphereNode; SceneNode* copperSphereNode; SceneNode* aluSphereNode; SceneNode* centerSphereNode; Light* mainLight; void createPostproc() { CompositorManager::getSingleton().addCompositor(mWindow->getViewport(0), "GameTools/Glow"); CompositorManager::getSingleton().setCompositorEnabled(mWindow->getViewport(0), "GameTools/Glow", true); /* CompositorManager::getSingleton().addCompositor(mWindow->getViewport(0), "GameTools/ToneMap"); CompositorManager::getSingleton().setCompositorEnabled(mWindow->getViewport(0), "GameTools/ToneMap", true);*/ } void createScene(void) { //createPostproc(); OgreIlluminationManager::getSingleton().setMainCamera(mCamera); OgreIlluminationManager::getSingleton().setMainViewport(mWindow->getViewport(0)); OgreIlluminationManager::getSingleton().setMaxJoinRadius(420); Root::getSingleton()._setCurrentSceneManager(mSceneMgr); mCamera->setPosition(0,100,240); mCamera->setFOVy(Radian(Degree(80))); //mCamera->setFarClipDistance(1000); // Set ambient light mSceneMgr->setAmbientLight(ColourValue(1, 1, 1)); // Skybox mSceneMgr->setSkyBox(true, "Examples/MorningSkyBox"); SceneNode* rootNode = mSceneMgr->getRootSceneNode(); //init objects Entity* kupola = mSceneMgr->createEntity("kupola", "kupola.mesh"); Entity* centerHead = mSceneMgr->createEntity("centerHead", "head.mesh"); Entity* goldHead = mSceneMgr->createEntity("goldHead", "head.mesh"); Entity* silverHead = mSceneMgr->createEntity("silverHeade", "head.mesh"); Entity* copperHead = mSceneMgr->createEntity("copperHead", "head.mesh"); Entity* aluHead = mSceneMgr->createEntity("aluHead", "head.mesh"); Entity* centerSphere = mSceneMgr->createEntity("centerSphere", "sphere.mesh"); Entity* goldSphere = mSceneMgr->createEntity("goldSphere", "sphere.mesh"); Entity* silverSphere = mSceneMgr->createEntity("silverSphere", "sphere.mesh"); Entity* copperSphere = mSceneMgr->createEntity("copperSphere", "sphere.mesh"); Entity* aluSphere = mSceneMgr->createEntity("aluSphere", "sphere.mesh"); kupola->setCastShadows(false); //lod //MeshPtr amesh = athene->getMesh(); //Mesh::LodDistanceList distances; //distances.push_back(1); //distances.push_back(2); //distances.push_back(3); //distances.push_back(4); ////distances.push_back(5); //amesh->generateLodLevels(distances,ProgressiveMesh::VertexReductionQuota::VRQ_PROPORTIONAL,0.6); //athene->setMeshLodBias(50000.0,0); //tangents //amesh->buildTangentVectors(0,1); MeshPtr kmesh = kupola->getMesh(); kmesh->buildTangentVectors(0,1); //init nodes kupolaNode = rootNode->createChildSceneNode( "kupola" ); kupolaNode->rotate(Vector3(0,1,0),Radian(Degree(90))); kupolaNode->attachObject( kupola ); kupolaNode->scale(25,21,25); //kupolaNode->scale(2,2,2); //kupolaNode->setPosition(0,100,0); centerSphereNode = rootNode->createChildSceneNode("centerSphere"); SceneNode* centerHeadNode = centerSphereNode->createChildSceneNode("centerHead"); centerSphereNode->setPosition(0, 100,0); centerHeadNode->attachObject(centerHead); centerSphereNode->attachObject(centerSphere); centerSphereNode->setScale(0.4,0.4,0.4); centerHeadNode->setScale(8,8,8); centerHeadNode->setVisible(false, false); goldSphereNode = rootNode->createChildSceneNode( "goldSphere" ); SceneNode* goldHeadNode = goldSphereNode->createChildSceneNode( "goldHead" ); goldSphereNode->scale(0.3,0.3,0.3); goldHeadNode->setScale(8,8,8); goldHeadNode->setVisible(false, false); silverSphereNode = rootNode->createChildSceneNode( "silverSphere" ); SceneNode* silverHeadNode = silverSphereNode->createChildSceneNode( "silverHead" ); silverSphereNode->scale(0.3,0.3,0.3); silverHeadNode->setScale(8,8,8); silverHeadNode->setVisible(false, false); aluSphereNode = rootNode->createChildSceneNode( "aluSphere" ); SceneNode* aluHeadNode = aluSphereNode->createChildSceneNode( "aluHead" ); aluSphereNode->scale(0.3,0.3,0.3); aluHeadNode->setScale(8,8,8); aluHeadNode->setVisible(false, false); copperSphereNode = rootNode->createChildSceneNode( "copperSphere" ); SceneNode* copperHeadNode = copperSphereNode->createChildSceneNode( "copperHead" ); copperSphereNode->scale(0.3,0.3,0.3); copperHeadNode->setScale(8,8,8); copperHeadNode->setVisible(false, false); goldSphereNode->attachObject(goldSphere); silverSphereNode->attachObject(silverSphere); aluSphereNode->attachObject(aluSphere); copperSphereNode->attachObject(copperSphere); goldHeadNode->attachObject(goldHead); silverHeadNode->attachObject(silverHead); aluHeadNode->attachObject(aluHead); copperHeadNode->attachObject(copperHead); goldSphereNode->_updateBounds(); silverSphereNode->_updateBounds(); aluSphereNode->_updateBounds(); copperSphereNode->_updateBounds(); goldHeadNode->_updateBounds(); silverHeadNode->_updateBounds(); aluHeadNode->_updateBounds(); copperHeadNode->_updateBounds(); kupolaNode->_updateBounds(); centerSphereNode->_updateBounds(); centerHeadNode->_updateBounds(); //Init lights mainLight = mSceneMgr->createLight("MainLight"); mainLight->setType(Light::LT_POINT); mainLight->setDiffuseColour(ColourValue::White); mainLight->setSpecularColour(ColourValue::White); //mainLight->setSpotlightRange(Radian(Degree(175)),Radian(Degree(180))); mainLightNode = rootNode->createChildSceneNode(); mainLightNode->setPosition(0,0,0); mainLight->setPosition(mainLightNode->getWorldPosition()); mainLightNode->attachObject(mainLight); BillboardSet* bbs = mSceneMgr->createBillboardSet("bb", 1); bbs->setDefaultDimensions(10,10); bbs->createBillboard(Vector3::ZERO, ColourValue::White); bbs->setMaterialName("Flare"); mainLightNode->attachObject(bbs); silverSphere->setMaterialName("EnvMetals/Silver"); copperSphere->setMaterialName("EnvMetals/Copper"); goldSphere->setMaterialName("EnvMetals/Gold"); aluSphere->setMaterialName("EnvMetals/Alu"); aluHead->setMaterialName("EnvMetals/Alu"); copperHead->setMaterialName("EnvMetals/Copper"); goldHead->setMaterialName("EnvMetals/Gold"); silverHead->setMaterialName("EnvMetals/Silver"); centerSphere->setMaterialName("GameTools/CausticGlass"); centerHead->setMaterialName("GameTools/CausticGlass"); OgreIlluminationManager::getSingleton().initTechniques(); } void createFrameListener(void) { // This is where we instantiate our own frame listener mFrameListener= new RaytraceDemoListener(mWindow, mCamera, mainLightNode, goldSphereNode, silverSphereNode, copperSphereNode, aluSphereNode, centerSphereNode, mainLight); mFrameListener->setPriority(1); OgreIlluminationManager::getSingleton().setPriority(2); mRoot->addFrameListener(mFrameListener); mRoot->addFrameListener(&OgreIlluminationManager::getSingleton()); } };