/* ----------------------------------------------------------------------------- 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 "FrameCapture.h" FrameCapture* capture; int scene = 3; int currentmaterial = 3; String materials[] = {"GTP/Diffuse/Point2Point", "GTP/Diffuse/Disc2Point", "GTP/Diffuse/Poly2Point", "GTP/Glossy/Disc2Point"}; // Listener class for frame updates class RaytraceDemoListener : public ExampleFrameListener { protected: SceneNode* objectNode; unsigned long framecount; public: RaytraceDemoListener(RenderWindow* window, Camera* maincam, SceneNode* objectNode) :ExampleFrameListener(window, maincam) { this->mMoveSpeed = 2.0; framecount = 0; this->objectNode = objectNode; } void moveCamera() {/* mCamera->yaw(mRotX); mCamera->pitch(mRotY); mCamera->moveRelative(mTranslateVector);*/ mCamera->getParentSceneNode()->yaw(mRotX, Node::TransformSpace::TS_WORLD); mCamera->getParentSceneNode()->pitch(mRotY, Node::TransformSpace::TS_LOCAL); mCamera->getParentSceneNode()->translate(mTranslateVector, Node::TransformSpace::TS_LOCAL); } bool processUnbufferedKeyInput(const FrameEvent& evt) { static float lastTime = 0.0; float thisTime = (float) Root::getSingleton().getTimer()->getMilliseconds() / 1000.0f; float elapsed = thisTime - lastTime; float move = elapsed * 0.25; float rotate = 80.0 * move; if (mInputDevice->isKeyDown(KC_UP)) { objectNode->translate(0,0,move); } if (mInputDevice->isKeyDown(KC_MULTIPLY)) { //objectNode->scale(1.1,1.1,1.1); objectNode->rotate(Vector3(0,0,1), Degree(rotate)); mTimeUntilNextToggle = 1; } if (mInputDevice->isKeyDown(KC_DIVIDE)) { //objectNode->scale(1.0/1.1,1.0/1.1,1.0/1.1); objectNode->rotate(Vector3(1,0,0), Degree(rotate)); mTimeUntilNextToggle = 1; } if (mInputDevice->isKeyDown(KC_ADD)) { objectNode->rotate(Vector3(0,1,0), Degree(rotate)); } if (mInputDevice->isKeyDown(KC_HOME)) { objectNode->translate(0,move,0); } if (mInputDevice->isKeyDown(KC_END)) { objectNode->translate(0,-move,0); } if (mInputDevice->isKeyDown(KC_DOWN)) { objectNode->translate(0,0,-move); } if (mInputDevice->isKeyDown(KC_RIGHT)) { objectNode->translate(move,0,0); } if (mInputDevice->isKeyDown(KC_LEFT)) { objectNode->translate(-move,0,0); } if (mInputDevice->isKeyDown(KC_A)) { // Move camera left mTranslateVector.x = -mMoveScale; } if (mInputDevice->isKeyDown(KC_D)) { // Move camera RIGHT mTranslateVector.x = mMoveScale; } /* Move camera forward by keypress. */ if ( mInputDevice->isKeyDown(KC_W) ) { mTranslateVector.z = -mMoveScale; } /* Move camera backward by keypress. */ if (mInputDevice->isKeyDown(KC_S) ) { mTranslateVector.z = mMoveScale; } if (mInputDevice->isKeyDown(KC_PGUP)) { // Move camera up mTranslateVector.y = mMoveScale; } if (mInputDevice->isKeyDown(KC_PGDOWN)) { // Move camera down mTranslateVector.y = -mMoveScale; } if( mInputDevice->isKeyDown( KC_ESCAPE) ) { return false; } // see if switching is on, and you want to toggle if (mInputTypeSwitchingOn && mInputDevice->isKeyDown(KC_M) && mTimeUntilNextToggle <= 0) { switchMouseMode(); mTimeUntilNextToggle = 1; } if (mInputTypeSwitchingOn && mInputDevice->isKeyDown(KC_K) && mTimeUntilNextToggle <= 0) { // must be going from immediate keyboard to buffered keyboard switchKeyMode(); mTimeUntilNextToggle = 1; } if (mInputDevice->isKeyDown(KC_F) && mTimeUntilNextToggle <= 0) { mStatsOn = !mStatsOn; showDebugOverlay(mStatsOn); mTimeUntilNextToggle = 1; } if (mInputDevice->isKeyDown(KC_T) && mTimeUntilNextToggle <= 0) { switch(mFiltering) { case TFO_BILINEAR: mFiltering = TFO_TRILINEAR; mAniso = 1; break; case TFO_TRILINEAR: mFiltering = TFO_ANISOTROPIC; mAniso = 8; break; case TFO_ANISOTROPIC: mFiltering = TFO_BILINEAR; mAniso = 1; break; default: break; } MaterialManager::getSingleton().setDefaultTextureFiltering(mFiltering); MaterialManager::getSingleton().setDefaultAnisotropy(mAniso); showDebugOverlay(mStatsOn); mTimeUntilNextToggle = 1; } if (mInputDevice->isKeyDown(KC_SYSRQ) && mTimeUntilNextToggle <= 0) { char tmp[20]; sprintf(tmp, "screenshot_%d.png", ++mNumScreenShots); mWindow->writeContentsToFile(tmp); mTimeUntilNextToggle = 0.5; mWindow->setDebugText(String("Wrote ") + tmp); } if (mInputDevice->isKeyDown(KC_R) && mTimeUntilNextToggle <=0) { mSceneDetailIndex = (mSceneDetailIndex+1)%3 ; switch(mSceneDetailIndex) { case 0 : mCamera->setPolygonMode(PM_SOLID) ; break ; case 1 : mCamera->setPolygonMode(PM_WIREFRAME) ; break ; case 2 : mCamera->setPolygonMode(PM_POINTS) ; break ; } mTimeUntilNextToggle = 0.5; } static bool displayCameraDetails = false; if (mInputDevice->isKeyDown(KC_P) && mTimeUntilNextToggle <= 0) { displayCameraDetails = !displayCameraDetails; mTimeUntilNextToggle = 0.5; if (!displayCameraDetails) mWindow->setDebugText(""); } if (displayCameraDetails) { // Print camera details mWindow->setDebugText("P: " + StringConverter::toString(mCamera->getDerivedPosition()) + " " + "O: " + StringConverter::toString(mCamera->getDerivedOrientation())); } if (mInputDevice->isKeyDown(KC_N) && mTimeUntilNextToggle <= 0) { capture->playEvent(); mTimeUntilNextToggle = 1; } if (mInputDevice->isKeyDown(KC_B) && mTimeUntilNextToggle <= 0) { capture->recordEvent(); mTimeUntilNextToggle = 1; } if (mInputDevice->isKeyDown(KC_M) && mTimeUntilNextToggle <= 0) { capture->setSaving(); capture->playEvent(); mTimeUntilNextToggle = 1; } lastTime = thisTime; // Return true to continue rendering return true; } bool frameStarted(const FrameEvent& evt) { static bool first = true; // lightNode->setPosition( 100.0 * Vector3(cos(-(float)framecount/500.0),2.0,sin(-(float)framecount/500.0))); bool result = ExampleFrameListener::frameStarted(evt); framecount++; return result; } }; class FloorRenderTargetListener : public RenderTargetListener { public: Entity* scene; FloorRenderTargetListener(Entity* scene) { this->scene = scene; } void preRenderTargetUpdate(const RenderTargetEvent& evt) { scene->getSubEntity(0)->setVisible(false); scene->getSubEntity(17)->setVisible(false); scene->getSubEntity(35)->setVisible(false); scene->getSubEntity(52)->setVisible(false); } void postRenderTargetUpdate(const RenderTargetEvent& evt) { scene->getSubEntity(0)->setVisible(true); scene->getSubEntity(17)->setVisible(true); scene->getSubEntity(35)->setVisible(true); scene->getSubEntity(52)->setVisible(true); } }; class CeilRenderTargetListener : public RenderTargetListener { public: Entity* scene; CeilRenderTargetListener(Entity* scene) { this->scene = scene; } void preRenderTargetUpdate(const RenderTargetEvent& evt) { scene->getSubEntity(1)->setVisible(false); scene->getSubEntity(18)->setVisible(false); scene->getSubEntity(36)->setVisible(false); scene->getSubEntity(53)->setVisible(false); } void postRenderTargetUpdate(const RenderTargetEvent& evt) { scene->getSubEntity(1)->setVisible(true); scene->getSubEntity(18)->setVisible(true); scene->getSubEntity(36)->setVisible(true); scene->getSubEntity(53)->setVisible(true); } }; class ReflectionCameraFrameListener : public FrameListener { public: Camera* floorReflCam; Camera* ceilReflCam; Camera* mainCamera; ReflectionCameraFrameListener(Camera* floorcam, Camera* ceilCam, Camera* mainCam) { floorReflCam = floorcam; ceilReflCam = ceilCam; mainCamera = mainCam; } bool frameStarted(const FrameEvent& evt) { floorReflCam->setOrientation(mainCamera->getOrientation()); floorReflCam->setPosition(mainCamera->getPosition()); // ceilReflCam->setOrientation(mainCamera->getOrientation()); // ceilReflCam->setPosition(mainCamera->getPosition()); return true; } }; /** Application class */ class RaytraceDemoApplication : public ExampleApplication { public: protected: SceneNode* objectNode; void loadResources(void) { // Initialise, parse scripts etc ResourceGroupManager::getSingleton().initialiseResourceGroup("Bootstrap"); ResourceGroupManager::getSingleton().initialiseResourceGroup("General"); ResourceGroupManager::getSingleton().initialiseResourceGroup("PostProc"); ResourceGroupManager::getSingleton().initialiseResourceGroup("GTP_Basic"); //ResourceGroupManager::getSingleton().initialiseResourceGroup("GTP_Diffuse_Simple"); ResourceGroupManager::getSingleton().initialiseResourceGroup("GTP_Diffuse"); } 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() { mSceneMgr = mRoot->createSceneManager("OctreeSceneManager"); //mSceneMgr = mRoot->createSceneManager("OcclusionCullingSceneManager"); } void createCamera(void) { // Create the camera mCamera = mSceneMgr->createCamera("PlayerCam"); SceneNode* camNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("mainCameraNode"); camNode->attachObject(mCamera); //camNode->setPosition(Vector3(0,1,0)); // Position it at 500 in Z direction //mCamera->setPosition(Vector3(0,0,500)); // Look back along -Z //mCamera->lookAt(Vector3(0,0,-300)); mCamera->setNearClipDistance(5); } void createScene(void) { //std::string occlusion_cfg("OcclusionCulling.cfg"); //mSceneMgr->setWorldGeometry(occlusion_cfg); //createPostproc(); OgreIlluminationManager::getSingleton().setMainCamera(mCamera); OgreIlluminationManager::getSingleton().setMainViewport(mWindow->getViewport(0)); OgreIlluminationManager::getSingleton().setMaxJoinRadius(420); Root::getSingleton()._setCurrentSceneManager(mSceneMgr); //mCamera->setPosition(0,1,0); mCamera->setFOVy(Radian(Degree(80))); mCamera->setFarClipDistance(200); mCamera->setNearClipDistance(0.1); capture = new FrameCapture(mWindow); createScene1(); OgreIlluminationManager::getSingleton().initTechniques(); } void createScene1() { OgreIlluminationManager::getSingleton().setFocusingSM(false); OgreIlluminationManager::getSingleton().setShadowMapSize(512); OgreIlluminationManager::getSingleton().setBlurShadowMap(true); OgreIlluminationManager::getSingleton().setShadowMapMaterialName("GTP/Basic/Distance_Normalized");//GameTools/ShadowMapDistance mSceneMgr->setAmbientLight(ColourValue(0.505 * 0.2, 0.897 * 0.2, 0.914 * 0.2)); SceneNode* rootNode = mSceneMgr->getRootSceneNode(); Entity* object = mSceneMgr->createEntity("object", "buddha.mesh"); object->setMaterialName(materials[currentmaterial]); objectNode = rootNode->createChildSceneNode(); objectNode->attachObject(object); objectNode->scale(0.4,0.4,0.4); objectNode->rotate(Vector3(0,1,0),Radian(Math::PI)); objectNode->setPosition(0,1,0); objectNode->_updateBounds(); Entity* room = mSceneMgr->createEntity("scene", "difflab.mesh"); //room->setMaterialName("GameTools/Phong"); SceneNode* roomNode = rootNode->createChildSceneNode(); roomNode->attachObject(room); roomNode->_updateBounds(); capture->addAnimableNode(objectNode); capture->addAnimableNode(mCamera->getParentSceneNode()); mSceneMgr->setShadowTechnique(SHADOWTYPE_NONE); Light* redLight1 = mSceneMgr->createLight("RedLight1"); redLight1->setType(Light::LT_POINT); redLight1->setCastShadows(false); redLight1->setDiffuseColour(ColourValue(1,0.055, 0.0)); redLight1->setPowerScale(1.6); //redLight1->setPowerScale(0.6); redLight1->setAttenuation(20, 0, 0, 3); SceneNode* redLightNode1 = rootNode->createChildSceneNode(); redLightNode1->setPosition(0.05,2.361,-1.07); redLightNode1->attachObject(redLight1); Light* greenLight1 = mSceneMgr->createLight("GreenLight1"); greenLight1->setType(Light::LT_POINT); greenLight1->setCastShadows(false); greenLight1->setDiffuseColour(ColourValue(0.362,0.783, 0.685)); greenLight1->setPowerScale(2.0); greenLight1->setAttenuation(20, 0, 0, 3); //greenLight1->setPowerScale(1.0); SceneNode* greenLightNode1 = rootNode->createChildSceneNode(); greenLightNode1->setPosition(1.312,1.313,0); greenLightNode1->attachObject(greenLight1); Light* mainBlueLight = mSceneMgr->createLight("MainBlueLight"); mainBlueLight->setType(Light::LT_SPOTLIGHT); mainBlueLight->setCastShadows(true); mainBlueLight->setDiffuseColour(ColourValue(0.395,0.766, 1.0)); mainBlueLight->setPowerScale(5.0); //mainBlueLight->setPowerScale(2.0); mainBlueLight->setSpotlightRange(Degree(0),Degree(160)); mainBlueLight->setAttenuation(2.5, 0, 0, 3); //mainBlueLight->setAttenuation(20, 0, 0, 1); SceneNode* mainBlueLightNode = rootNode->createChildSceneNode(); mainBlueLightNode->setPosition(-0.546,2.095,1.035); //mainBlueLightNode->rotate(Vector3::UNIT_X, Degree(161.396)); //mainBlueLightNode->rotate(Vector3::UNIT_Y, Degree(53.955)); //mainBlueLightNode->rotate(Vector3::UNIT_Z, Degree(-145.065)); mainBlueLight->setDirection(-1.5,-2.0,1.0); mainBlueLightNode->attachObject(mainBlueLight); /* Light* blueLight1 = mSceneMgr->createLight("BlueLight1"); blueLight1->setType(Light::LT_SPOTLIGHT); blueLight1->setCastShadows(false); blueLight1->setDiffuseColour(ColourValue(0.395,0.766, 1.0)); blueLight1->setPowerScale(0.7); blueLight1->setSpotlightRange(Degree(20),Degree(90)); SceneNode* blueLightNode = rootNode->createChildSceneNode(); blueLightNode->setPosition(-0.9,2.095,0.185); //blueLightNode->rotate(Vector3::UNIT_X, Degree(148.785)); //blueLightNode->rotate(Vector3::UNIT_Y, Degree(39.001)); //blueLightNode->rotate(Vector3::UNIT_Z, Degree(-154.304)); blueLight1->setDirection(-1.5,-2.0,1.0); blueLightNode->attachObject(blueLight1); Light* blueLight2 = mSceneMgr->createLight("BlueLight2"); blueLight2->setType(Light::LT_SPOTLIGHT); blueLight2->setCastShadows(false); blueLight2->setDiffuseColour(ColourValue(0.395,0.766, 1.0)); blueLight2->setPowerScale(0.7); blueLight2->setSpotlightRange(Degree(20),Degree(90)); SceneNode* blueLightNode2 = rootNode->createChildSceneNode(); blueLightNode2->setPosition(0.091,2.095,1.556); //blueLightNode2->rotate(Vector3::UNIT_X, Degree(-112.941)); //blueLightNode2->rotate(Vector3::UNIT_Y, Degree(68.432)); //blueLightNode2->rotate(Vector3::UNIT_Z, Degree(-66.441)); blueLight2->setDirection(-1.5,-2.0,1.0); blueLightNode2->attachObject(blueLight2); */ } void createPlane(Ogre::String _name, Ogre::String _material, Ogre::Vector3 _pos, Ogre::Vector2 _size, Ogre::Vector2 _subdivisions = Ogre::Vector2(1,1)) { Plane _plane; _plane.normal = Vector3::UNIT_Y; _plane.d = 0; MeshManager::getSingleton().createPlane(_name + ".plane", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, _plane,_size.x,_size.y,1,1,true,1,_subdivisions.x,_subdivisions.y,Vector3::UNIT_Z); Entity *_entity = mSceneMgr->createEntity(_name + ".entity", _name + ".plane"); _entity->setMaterialName(_material); SceneNode* _node = mSceneMgr->getRootSceneNode()->createChildSceneNode(_name + ".node"); _node->attachObject(_entity); _node->setPosition(_pos); } void createFrameListener(void) { // This is where we instantiate our own frame listener mFrameListener= new RaytraceDemoListener(mWindow, mCamera, objectNode ); mFrameListener->setPriority(1); OgreIlluminationManager::getSingleton().setPriority(10); capture->setPriority(6); mRoot->addFrameListener(capture); mRoot->addFrameListener(&OgreIlluminationManager::getSingleton()); mRoot->addFrameListener(mFrameListener); } };