/* ----------------------------------------------------------------------------- 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" #include "FrameCapture.h" int scene = 1; FrameCapture* capture; // Listener class for frame updates class RaytraceDemoListener : public ExampleFrameListener { protected: unsigned long framecount; SceneNode* objectNode; public: RaytraceDemoListener(RenderWindow* window, Camera* maincam, SceneNode* objectNode) :ExampleFrameListener(window, maincam) { this->mMoveSpeed = 0.5; 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 objmove = 0.01; if (mInputDevice->isKeyDown(KC_UP)) { objectNode->translate(0,0,objmove); } if (mInputDevice->isKeyDown(KC_MULTIPLY)) { //objectNode->scale(1.1,1.1,1.1); objectNode->rotate(Vector3(0,0,1), Degree(10)); 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(10)); mTimeUntilNextToggle = 1; } if (mInputDevice->isKeyDown(KC_ADD)) { objectNode->rotate(Vector3(0,1,0), Degree(10)); } if (mInputDevice->isKeyDown(KC_HOME)) { objectNode->translate(0,objmove,0); } if (mInputDevice->isKeyDown(KC_END)) { objectNode->translate(0,-objmove,0); } if (mInputDevice->isKeyDown(KC_DOWN)) { objectNode->translate(0,0,-objmove); } if (mInputDevice->isKeyDown(KC_RIGHT)) { objectNode->translate(-objmove,0,0); } if (mInputDevice->isKeyDown(KC_LEFT)) { objectNode->translate(objmove,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_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; } 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_SYSRQ) && mTimeUntilNextToggle <= 0) { char tmp[20]; sprintf(tmp, "screenshot_%d.png", ++mNumScreenShots); mWindow->writeContentsToFile(tmp); mTimeUntilNextToggle = 0.5; mWindow->setDebugText(String("Wrote ") + tmp); } 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())); } // Return true to continue rendering return true; } bool frameStarted(const FrameEvent& evt) { bool result = ExampleFrameListener::frameStarted(evt); framecount++; return result; } }; /** Application class */ class RaytraceDemoApplication : public ExampleApplication { public: protected: SceneNode* objectNode; 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) { 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); SceneNode* cn = mCamera->getParentSceneNode(); OgreIlluminationManager::getSingleton().setFocusingSM(false); OgreIlluminationManager::getSingleton().setShadowMapSize(512); OgreIlluminationManager::getSingleton().setBlurShadowMap(true); OgreIlluminationManager::getSingleton().setShadowMapMaterialName("GameTools/ShadowMapDistance"); mSceneMgr->setAmbientLight(ColourValue(0.505 * 0.2, 0.897 * 0.2, 0.914 * 0.2)); capture = new FrameCapture(mWindow); if(scene == 1) createScene1(); if(scene == 2) createScene2(); OgreIlluminationManager::getSingleton().initTechniques(); } void createScene1(void) { SceneNode* rootNode = mSceneMgr->getRootSceneNode(); Entity* object = mSceneMgr->createEntity("object", "teapot.mesh"); object->setMaterialName("MetalTeapotMultipleBounce"); objectNode = rootNode->createChildSceneNode(); objectNode->attachObject(object); objectNode->scale(0.5,0.5,0.5); //objectNode->scale(0.005,0.005,0.005); objectNode->setPosition(0,1.2,0); objectNode->_updateBounds(); capture->addAnimableNode(mCamera->getParentSceneNode()); Entity* room = mSceneMgr->createEntity("scene", "difflab.mesh"); //room->setMaterialName("GameTools/Phong"); SceneNode* roomNode = rootNode->createChildSceneNode(); roomNode->attachObject(room); roomNode->_updateBounds(); 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); 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); 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->setSpotlightRange(Degree(0),Degree(160)); mainBlueLight->setAttenuation(2.5, 0, 1, 0); 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); } void createScene2(void) { SceneNode* rootNode = mSceneMgr->getRootSceneNode(); Entity* object = mSceneMgr->createEntity("object", "athene.mesh"); object->setMaterialName("MetalTeapotMultipleBounce"); objectNode = rootNode->createChildSceneNode(); objectNode->attachObject(object); //objectNode->scale(0.5,0.5,0.5); objectNode->scale(0.005,0.005,0.005); objectNode->setPosition(0,1.2,0); objectNode->_updateBounds(); Entity* room = mSceneMgr->createEntity("scene", "difflab.mesh"); //room->setMaterialName("GameTools/Phong"); SceneNode* roomNode = rootNode->createChildSceneNode(); roomNode->attachObject(room); roomNode->_updateBounds(); 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); 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); 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->setSpotlightRange(Degree(0),Degree(160)); mainBlueLight->setAttenuation(2.5, 0, 1, 0); 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); } void createFrameListener(void) { // This is where we instantiate our own frame listener mFrameListener= new RaytraceDemoListener(mWindow, mCamera, objectNode); mFrameListener->setPriority(1); OgreIlluminationManager::getSingleton().setPriority(3); capture->setPriority(2); mRoot->addFrameListener(capture); mRoot->addFrameListener(mFrameListener); mRoot->addFrameListener(&OgreIlluminationManager::getSingleton()); } };