00001 #include "ogreviewer.h"
00002
00003 using namespace Ogre;
00004
00005
00006 OgreViewer::OgreViewer()
00007 {
00008 rotSpeed = 15;
00009 rolling = false;
00010 yawing = true;
00011 pitching = false;
00012 toggle = 0;
00013 }
00014
00015 OgreViewer::~OgreViewer()
00016 {
00017 if(camListener) delete camListener;
00018 }
00019
00021
00030 void OgreViewer::createScene(void)
00031 {
00032 LogManager::getSingleton().logMessage("***Loading Scene***");
00033 LogManager::getSingleton().logMessage("Setting ambient light and shadows");
00034 mSceneMgr->setAmbientLight(ColourValue(0.2, 0.2, 0.2));
00035 mSceneMgr->setShadowTechnique(SHADOWTYPE_STENCIL_ADDITIVE);
00036 Light *l = mSceneMgr->createLight("SpotLight1");
00037 l->setType(Light::LT_SPOTLIGHT);
00038 l->setDiffuseColour( ColourValue(1.0, 0.5, 0.5) );
00039 l->setSpecularColour( ColourValue(1.0, 0.5, 0.5) );
00040 l->setPosition( Vector3(-100, 200, 0) );
00041 l->setDirection( Vector3(1, -1, 0) );
00042 l->setSpotlightRange(Degree(15), Degree(45), 1);
00043 l->setVisible(true);
00044
00045 l = mSceneMgr->createLight("SpotLight2");
00046 l->setType(Light::LT_SPOTLIGHT);
00047 l->setDiffuseColour( ColourValue(0.5, 1.0, 0.5) );
00048 l->setSpecularColour( ColourValue(0.5, 1.0, 0.5) );
00049 l->setPosition( Vector3(100, 200, 0) );
00050 l->setDirection( Vector3(-1, -1, 0) );
00051 l->setSpotlightRange(Degree(15), Degree(45), 1);
00052 l->setVisible(true);
00053
00054 l = mSceneMgr->createLight("SpotLight3");
00055 l->setType(Light::LT_SPOTLIGHT);
00056 l->setDiffuseColour( ColourValue(0.5, 0.5, 1.0) );
00057 l->setSpecularColour( ColourValue(0.5, 0.5, 1.0) );
00058 l->setPosition( Vector3(0, 200, -100) );
00059 l->setDirection( Vector3(0, -1, 1) );
00060 l->setSpotlightRange(Degree(15), Degree(45), 1);
00061 l->setVisible(true);
00062
00063
00064 LogManager::getSingleton().logMessage("Creating a \"ground\" plane");
00065 Plane plane(Vector3::UNIT_Y, 0);
00066 MeshManager::getSingleton().createPlane("ground", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane,
00067 1500, 1500, 20, 20, true, 1, 5, 5, Vector3::UNIT_Z);
00068 Entity *ent = mSceneMgr->createEntity("GroundEnt","ground");
00069 mSceneMgr->getRootSceneNode()->createChildSceneNode("GroundNode")->attachObject(ent);
00070 ent->setMaterialName("Ground");
00071 ent->setCastShadows(false);
00072
00073
00074 LogManager::getSingleton().logMessage("Setting default camera position");
00075 mSceneMgr->getSceneNode("CameraNode")->translate( Vector3(0,20,-500) );
00076 mSceneMgr->getSceneNode("CameraNode")->yaw(Degree(180), Node::TS_LOCAL);
00077 mSceneMgr->getSceneNode("CameraNode")->pitch( Degree(15), Node::TS_LOCAL );
00078
00079
00080 LogManager::getSingleton().logMessage("Creating a skybox");
00081 mSceneMgr->setSkyBox(true,"SkyBox",5000);
00082
00083
00084 LogManager::getSingleton().logMessage("Loading example mesh");
00085 ent = mSceneMgr->createEntity("ExampleEnt","example.mesh");
00086 ent->setCastShadows(true);
00087 mSceneMgr->getRootSceneNode()->createChildSceneNode("ExampleNode")->attachObject(ent);
00088 mSceneMgr->getSceneNode("ExampleNode")->translate(0, 50, 0);
00089 mSceneMgr->getSceneNode("ExampleNode")->yaw(Degree(180), Node::TS_LOCAL);
00090
00091
00092 LogManager::getSingleton().logMessage("Loading the information Overlay");
00093 OverlayManager& omgr = OverlayManager::getSingleton();
00094 Overlay *mLoadOverlay = (Overlay*)omgr.getByName("Overlays/Info");
00095 mLoadOverlay->show();
00096 }
00097
00098 void OgreViewer::createFrameListener(void)
00099 {
00100 camListener = new CameraListener(mSceneMgr, mCamera, mKeyboard, mMouse);
00101
00102 mRoot->addFrameListener(this);
00103 mRoot->addFrameListener(camListener);
00104 }
00105
00107
00115 bool OgreViewer::frameStarted(const FrameEvent &evt)
00116 {
00117 mKeyboard->capture();
00118
00119 toggle -= evt.timeSinceLastFrame;
00120
00121 if(mKeyboard->isKeyDown(OIS::KC_ESCAPE)) return false;
00122 if(mKeyboard->isKeyDown(OIS::KC_1) && toggle <= 0){ yawing == false ? yawing = true : yawing = false; toggle = 0.5; }
00123 if(mKeyboard->isKeyDown(OIS::KC_2) && toggle <= 0){ rolling == false ? rolling = true : rolling = false; toggle = 0.5; }
00124 if(mKeyboard->isKeyDown(OIS::KC_3) && toggle <= 0){ pitching == false ? pitching = true : pitching = false; toggle = 0.5; }
00125
00126 const RenderTarget::FrameStats &stats = mWindow->getStatistics();
00127 setFps(stats.avgFPS);
00128
00129
00130 if(yawing)
00131 mSceneMgr->getSceneNode("ExampleNode")->yaw( Degree(rotSpeed) * evt.timeSinceLastFrame, Node::TS_LOCAL);
00132 if(rolling)
00133 mSceneMgr->getSceneNode("ExampleNode")->roll( Degree(rotSpeed) * evt.timeSinceLastFrame, Node::TS_LOCAL);
00134 if(pitching)
00135 mSceneMgr->getSceneNode("ExampleNode")->pitch( Degree(rotSpeed) * evt.timeSinceLastFrame, Node::TS_LOCAL);
00136 return true;
00137 }
00138
00139 void OgreViewer::setFps(Real avgFps)
00140 {
00141 OverlayManager *ovm = OverlayManager::getSingletonPtr();
00142 OverlayElement *pTxt = static_cast<OverlayElement*>(ovm->getOverlayElement("FPS"));
00143 pTxt->setCaption(String("FPS:")+StringConverter::toString(avgFps));
00144 }