- Graphics.h
-
/*************************************************** ©2014 Pf_D. All rights reserved. ***************************************************/ #pragma once #include "OGRE\Ogre.h" #include "OIS\OIS.h" enum CameraStyle { CS_FREELOOK, CS_ORBIT, CS_MANUAL }; class cCameraManager { private: Ogre::Camera *mCamera; CameraStyle mStyle; Ogre::SceneNode *mTarget; bool mOrbiting; bool mZooming; Ogre::Real mTopSpeed; Ogre::Vector3 mVelocity; bool mGoingForward; bool mGoingBack; bool mGoingLeft; bool mGoingRight; bool mGoingUp; bool mGoingDown; bool mFastMove; public: cCameraManager(Ogre::Camera *cam); void setCamera(Ogre::Camera *cam); Ogre::Camera *getCamera(); void manualStop(); void setStyle(CameraStyle style); CameraStyle getStyle(); void setYawPitchDist(Ogre::Radian yaw, Ogre::Radian pitch, Ogre::Real dist); void setTarget(Ogre::SceneNode *target); Ogre::SceneNode *getTarget(); void setTopSpeed(Ogre::Real topSpeed); Ogre::Real getTopSpeed(); bool frameRenderingQueued(const Ogre::FrameEvent& evt); // Processes key press for free-look style movement. void injectKeyDown(const OIS::KeyEvent &evt); void injectKeyUp(const OIS::KeyEvent &evt); // Processes mouse movement differently for each style. void injectMouseMove(const OIS::MouseEvent &evt); // Processes mouse presses. Only applies for orbit style. // Left button is for orbiting, and right button is for zooming. void injectMouseDown(const OIS::MouseEvent &evt, OIS::MouseButtonID id); void injectMouseUp(const OIS::MouseEvent &evt, OIS::MouseButtonID id); };
- Graphics.cpp
-
/*************************************************** ©2014 Pf_D. All rights reserved. ***************************************************/ #include "Graphics.h" cCameraManager::cCameraManager(Ogre::Camera *cam) :mCamera(0), mStyle(CameraStyle::CS_FREELOOK), mTarget(0), mOrbiting(false), mZooming(false), mTopSpeed(150), mVelocity(Ogre::Vector3::ZERO), mGoingForward(false), mGoingBack(false), mGoingLeft(false), mGoingRight(false), mGoingUp(false), mGoingDown(false), mFastMove(false) { setCamera(cam); setStyle(CS_FREELOOK); } void cCameraManager::setCamera(Ogre::Camera *cam) { mCamera = cam; } Ogre::Camera *cCameraManager::getCamera() { return mCamera; } void cCameraManager::setYawPitchDist(Ogre::Radian yaw, Ogre::Radian pitch, Ogre::Real dist) { mCamera->setPosition(mTarget->_getDerivedPosition()); mCamera->setOrientation(mTarget->_getDerivedOrientation()); mCamera->yaw(yaw); mCamera->pitch(pitch); mCamera->moveRelative(Ogre::Vector3(0, 0, dist)); } void cCameraManager::setTarget(Ogre::SceneNode *target) { if(target != mTarget) { mTarget = target; if(target) { setYawPitchDist(Ogre::Degree(0), Ogre::Degree(15), 150); mCamera->setAutoTracking(true, mTarget); } else mCamera->setAutoTracking(false); } } Ogre::SceneNode *cCameraManager::getTarget() { return mTarget; } void cCameraManager::manualStop() { if(mStyle == CS_FREELOOK) { mVelocity = Ogre::Vector3::ZERO; mGoingForward = false; mGoingBack = false; mGoingLeft = false; mGoingRight = false; mGoingUp = false; mGoingDown = false; } } void cCameraManager::setStyle(CameraStyle style) { if(mStyle != CS_ORBIT && style == CS_ORBIT) { setTarget(mTarget ? mTarget : mCamera->getSceneManager()->getRootSceneNode()); mCamera->setFixedYawAxis(true); manualStop(); setYawPitchDist(Ogre::Degree(0), Ogre::Degree(15), 150); } else if(mStyle != CS_FREELOOK && style == CS_FREELOOK) { mCamera->setAutoTracking(false); mCamera->setFixedYawAxis(true); } else if(mStyle != CS_MANUAL && style == CS_MANUAL) { mCamera->setAutoTracking(false); manualStop(); } mStyle = style; } CameraStyle cCameraManager::getStyle() { return mStyle; } void cCameraManager::setTopSpeed(Ogre::Real topSpeed) { mTopSpeed = topSpeed; } Ogre::Real cCameraManager::getTopSpeed() { return mTopSpeed; } bool cCameraManager::frameRenderingQueued(const Ogre::FrameEvent& evt) { if (mStyle == CS_FREELOOK) { // build our acceleration vector based on keyboard input composite Ogre::Vector3 accel = Ogre::Vector3::ZERO; if (mGoingForward) accel += mCamera->getDirection(); if (mGoingBack) accel -= mCamera->getDirection(); if (mGoingRight) accel += mCamera->getRight(); if (mGoingLeft) accel -= mCamera->getRight(); if (mGoingUp) accel += mCamera->getUp(); if (mGoingDown) accel -= mCamera->getUp(); // if accelerating, try to reach top speed in a certain time Ogre::Real topSpeed = mFastMove ? mTopSpeed * 20 : mTopSpeed; if (accel.squaredLength() != 0) { accel.normalise(); mVelocity += accel * topSpeed * evt.timeSinceLastFrame * 10; } // if not accelerating, try to stop in a certain time else mVelocity -= mVelocity * evt.timeSinceLastFrame * 10; Ogre::Real tooSmall = std::numeric_limits<Ogre::Real>::epsilon(); // keep camera velocity below top speed and above epsilon if (mVelocity.squaredLength() > topSpeed * topSpeed) { mVelocity.normalise(); mVelocity *= topSpeed; } else if (mVelocity.squaredLength() < tooSmall * tooSmall) mVelocity = Ogre::Vector3::ZERO; if (mVelocity != Ogre::Vector3::ZERO) mCamera->move(mVelocity * evt.timeSinceLastFrame); } return true; } void cCameraManager::injectKeyDown(const OIS::KeyEvent &evt) { if(mStyle != CS_FREELOOK) return; if (evt.key == OIS::KC_W || evt.key == OIS::KC_UP) mGoingForward = true; else if (evt.key == OIS::KC_S || evt.key == OIS::KC_DOWN) mGoingBack = true; else if (evt.key == OIS::KC_A || evt.key == OIS::KC_LEFT) mGoingLeft = true; else if (evt.key == OIS::KC_D || evt.key == OIS::KC_RIGHT) mGoingRight = true; else if (evt.key == OIS::KC_PGUP) mGoingUp = true; else if (evt.key == OIS::KC_PGDOWN) mGoingDown = true; else if (evt.key == OIS::KC_LSHIFT) mFastMove = true; } void cCameraManager::injectKeyUp(const OIS::KeyEvent &evt) { if(mStyle != CS_FREELOOK) return; if (evt.key == OIS::KC_W || evt.key == OIS::KC_UP) mGoingForward = false; else if (evt.key == OIS::KC_S || evt.key == OIS::KC_DOWN) mGoingBack = false; else if (evt.key == OIS::KC_A || evt.key == OIS::KC_LEFT) mGoingLeft = false; else if (evt.key == OIS::KC_D || evt.key == OIS::KC_RIGHT) mGoingRight = false; else if (evt.key == OIS::KC_PGUP) mGoingUp = false; else if (evt.key == OIS::KC_PGDOWN) mGoingDown = false; else if (evt.key == OIS::KC_LSHIFT) mFastMove = false; } void cCameraManager::injectMouseMove(const OIS::MouseEvent &evt) { if (mStyle == CS_ORBIT) { Ogre::Real dist = (mCamera->getPosition() - mTarget->_getDerivedPosition()).length(); if (mOrbiting) // yaw around the target, and pitch locally { mCamera->setPosition(mTarget->_getDerivedPosition()); mCamera->yaw(Ogre::Degree(-evt.state.X.rel * 0.25f)); mCamera->pitch(Ogre::Degree(-evt.state.Y.rel * 0.25f)); mCamera->moveRelative(Ogre::Vector3(0, 0, dist)); // don‘t let the camera go over the top or around the bottom of the target } else if (mZooming) // move the camera toward or away from the target { // the further the camera is, the faster it moves mCamera->moveRelative(Ogre::Vector3(0, 0, evt.state.Y.rel * 0.004f * dist)); } else if (evt.state.Z.rel != 0) // move the camera toward or away from the target { // the further the camera is, the faster it moves mCamera->moveRelative(Ogre::Vector3(0, 0, -evt.state.Z.rel * 0.0008f * dist)); } } else if (mStyle == CS_FREELOOK) { mCamera->yaw(Ogre::Degree(-evt.state.X.rel * 0.15f)); mCamera->pitch(Ogre::Degree(-evt.state.Y.rel * 0.15f)); } } void cCameraManager::injectMouseDown(const OIS::MouseEvent &evt, OIS::MouseButtonID id) { if (mStyle == CS_ORBIT) { if (id == OIS::MB_Left) mOrbiting = true; else if (id == OIS::MB_Right) mZooming = true; } } void cCameraManager::injectMouseUp(const OIS::MouseEvent &evt, OIS::MouseButtonID id) { if (mStyle == CS_ORBIT) { if (id == OIS::MB_Left) mOrbiting = false; else if (id == OIS::MB_Right) mZooming = false; } }
- System.h
-
/*************************************************** ©2014 Pf_D. All rights reserved. ***************************************************/ #pragma once #include "Graphics.h" #include "OGRE\Ogre.h" #include "OIS\OIS.h" #include "MyGUI.h" #include "MyGUI_OgrePlatform.h" class cApplication : public Ogre::FrameListener, public OIS::KeyListener, public OIS::MouseListener { protected: MyGUI::Gui *mGUI; MyGUI::OgrePlatform *mPlatform; Ogre::Root *mRoot; Ogre::RenderWindow *mWindow; Ogre::SceneManager *mSceneMgr; Ogre::Camera *mCamera; cCameraManager *mCameraMgr; OIS::InputManager *mInputMgr; OIS::Keyboard *mKeyboard; OIS::Mouse *mMouse; bool mDragLook; public: cApplication() :mDragLook(false) { } virtual bool frameStarted(const Ogre::FrameEvent &evt); virtual bool frameRenderingQueued(const Ogre::FrameEvent &evt); virtual bool frameEnded(const Ogre::FrameEvent &evt); virtual bool keyPressed(const OIS::KeyEvent &arg); virtual bool keyReleased(const OIS::KeyEvent &arg); virtual bool mouseMoved(const OIS::MouseEvent &arg); virtual bool mousePressed(const OIS::MouseEvent &arg, OIS::MouseButtonID id); virtual bool mouseReleased(const OIS::MouseEvent &arg, OIS::MouseButtonID id); virtual void setupResources(); virtual void createInput(); virtual void chooseSceneMgr(); virtual void setupView(); virtual void loadResources(); virtual void createScene() {} bool setup(); void go(); void setDragLook(bool enabled); };
- System.cpp
-
/*************************************************** ©2014 Pf_D. All rights reserved. ***************************************************/ #include "System.h" bool cApplication::frameStarted(const Ogre::FrameEvent &evt) { mKeyboard->capture(); mMouse->capture(); return true; } bool cApplication::frameRenderingQueued(const Ogre::FrameEvent &evt) { mCameraMgr->frameRenderingQueued(evt); return true; } bool cApplication::frameEnded(const Ogre::FrameEvent &evt) { return true; } bool cApplication::keyPressed(const OIS::KeyEvent &arg) { if(arg.key == OIS::KC_ESCAPE) exit(0); MyGUI::InputManager::getInstance().injectKeyPress( MyGUI::KeyCode::Enum(arg.key), arg.text); mCameraMgr->injectKeyDown(arg); // ... return true; } bool cApplication::keyReleased(const OIS::KeyEvent &arg) { MyGUI::InputManager::getInstance().injectKeyRelease(MyGUI::KeyCode::Enum(arg.key)); mCameraMgr->injectKeyUp(arg); // ... return true; } bool cApplication::mouseMoved( const OIS::MouseEvent &arg ) { bool ret = MyGUI::InputManager::getInstance().injectMouseMove( arg.state.X.abs, arg.state.Y.abs, arg.state.Z.abs); if(!ret) mCameraMgr->injectMouseMove(arg); // ... return true; } bool cApplication::mousePressed( const OIS::MouseEvent &arg, OIS::MouseButtonID id ) { bool ret = MyGUI::InputManager::getInstance().injectMousePress( arg.state.X.abs, arg.state.Y.abs, MyGUI::MouseButton::Enum(id)); if(!ret) mCameraMgr->injectMouseDown(arg, id); if(mDragLook && id == OIS::MB_Left) { mCameraMgr->setStyle(CS_FREELOOK); MyGUI::Gui::getInstance().hidePointer(); } // ... return true; } bool cApplication::mouseReleased( const OIS::MouseEvent &arg, OIS::MouseButtonID id ) { bool ret = MyGUI::InputManager::getInstance().injectMouseRelease( arg.state.X.abs, arg.state.Y.abs, MyGUI::MouseButton::Enum(id)); if(!ret) mCameraMgr->injectMouseUp(arg, id); if(mDragLook && id == OIS::MB_Left) { mCameraMgr->setStyle(CS_MANUAL); MyGUI::Gui::getInstance().showPointer(); } // ... return true; } void cApplication::setupResources() { Ogre::ConfigFile cf; #if OGRE_DEBUG_MODE cf.load("resources_d.cfg"); #else cf.load("resources.cfg"); #endif Ogre::ConfigFile::SectionIterator secIter = cf.getSectionIterator(); Ogre::String secName, typeName, archName; while(secIter.hasMoreElements()) { secName = secIter.peekNextKey(); Ogre::ConfigFile::SettingsMultiMap *settings = secIter.getNext(); Ogre::ConfigFile::SettingsMultiMap::iterator i; for(i=settings->begin(); i!=settings->end(); i++) { typeName = i->first; archName = i->second; Ogre::ResourceGroupManager::getSingleton().addResourceLocation( archName, typeName, secName); } } } void cApplication::createInput() { OIS::ParamList parameters; unsigned int windowHandle = 0; std::ostringstream windowHandleString; mWindow->getCustomAttribute("WINDOW", &windowHandle); windowHandleString << windowHandle; parameters.insert(std::make_pair("WINDOW", windowHandleString.str())); parameters.insert(std::make_pair("w32_mouse", std::string("DISCL_FOREGROUND"))); parameters.insert(std::make_pair("w32_mouse", std::string("DISCL_NONEXCLUSIVE"))); mInputMgr = OIS::InputManager::createInputSystem(parameters); mKeyboard = static_cast<OIS::Keyboard*>(mInputMgr->createInputObject(OIS::OISKeyboard, true)); mKeyboard->setEventCallback(this); mMouse = static_cast<OIS::Mouse*>(mInputMgr->createInputObject(OIS::OISMouse, true)); const OIS::MouseState &mouseState = mMouse->getMouseState(); mouseState.width = mWindow->getWidth(); mouseState.height = mWindow->getHeight(); mMouse->setEventCallback(this); } void cApplication::chooseSceneMgr() { mSceneMgr = mRoot->createSceneManager(Ogre::ST_GENERIC); } void cApplication::setupView() { // Create camera mCamera = mSceneMgr->createCamera("Camera"); mCamera->setPosition(Ogre::Vector3(0, 0, 50)); mCamera->lookAt(Ogre::Vector3(0, 0, -300)); mCamera->setNearClipDistance(5); mCameraMgr = new cCameraManager(mCamera); // Create viewports Ogre::Viewport *vp = mWindow->addViewport(mCamera); vp->setBackgroundColour(Ogre::ColourValue(0, 0, 0)); mCamera->setAspectRatio(Ogre::Real(vp->getActualWidth())/Ogre::Real(vp->getActualHeight())); } void cApplication::loadResources() { Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); } bool cApplication::setup() { #ifndef OGRE_STATIC_LIB #if OGRE_DEBUG_MODE mRoot = OGRE_NEW Ogre::Root("plugins_d.cfg"); #else mRoot = OGRE_NEW Ogre::Root("plugins.cfg"); #endif #endif setupResources(); if(!mRoot->showConfigDialog()) return false; mWindow = mRoot->initialise(true); createInput(); ShowCursor(false); chooseSceneMgr(); setupView(); loadResources(); createScene(); mRoot->addFrameListener(this); return true; } void cApplication::go() { if(!setup()) return; mRoot->startRendering(); } void cApplication::setDragLook(bool enabled) { if(enabled) { mCameraMgr->setStyle(CS_MANUAL); mDragLook = true; } else { mCameraMgr->setStyle(CS_FREELOOK); mDragLook = false; } }
- Main.cpp
-
/*************************************************** ©2014 Pf_D. All rights reserved. ***************************************************/ #include "System.h" class cMyApplication : public cApplication { public: void createScene() { // MyGUI mPlatform = new MyGUI::OgrePlatform(); mPlatform->initialise(mWindow, mSceneMgr); mGUI = new MyGUI::Gui(); mGUI->initialise(); setDragLook(true); mSceneMgr->setAmbientLight(Ogre::ColourValue::White); //Ogre::Plane plane(Ogre::Vector3::UNIT_Y, -10); //Ogre::MeshManager::getSingleton().createPlane("plane", // Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane, // 1500,1500,200,200,true,1,5,5,Ogre::Vector3::UNIT_Z); //Ogre::Entity* ent = mSceneMgr->createEntity("GrassPlane", "plane"); //mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent); //ent->setMaterialName("Examples/GrassFloor"); //Ogre::Light* light = mSceneMgr->createLight("Light1"); //light->setType(Ogre::Light::LT_DIRECTIONAL); //light->setDirection(Ogre::Vector3(1,-1,0)); //Ogre::ManualObject* manual = mSceneMgr->createManualObject("grass"); //manual->begin("Examples/GrassBlades", Ogre::RenderOperation::OT_TRIANGLE_LIST); ////First triangle //manual->position(5.0, 0.0, 0.0); //manual->textureCoord(0,1); //manual->position(-5.0, 10.0, 0.0); //manual->textureCoord(1,0); //manual->position(-5.0, 0.0, 0.0); //manual->textureCoord(1,1); ////Second triangle //manual->position(5.0, 0.0, 0.0); //manual->textureCoord(0,1); //manual->position(5.0, 10.0, 0.0); //manual->textureCoord(0,0); //manual->position(-5.0, 10.0, 0.0); //manual->textureCoord(1,0); ////third triangle //manual->position(2.5, 0.0, 4.3); //manual->textureCoord(0,1); //manual->position(-2.5, 10.0, -4.3); //manual->textureCoord(1,0); //manual->position(-2.0, 0.0, -4.3); //manual->textureCoord(1,1); ////forth triangle //manual->position(2.5, 0.0, 4.3); //manual->textureCoord(0,1); //manual->position(2.5, 10.0, 4.3); //manual->textureCoord(0,0); //manual->position(-2.5, 10.0, -4.3); //manual->textureCoord(1,0); ////fifth triangle //manual->position(2.5, 0.0, -4.3); //manual->textureCoord(0,1); //manual->position(-2.5, 10.0, 4.3); //manual->textureCoord(1,0); //manual->position(-2.0, 0.0, 4.3); //manual->textureCoord(1,1); ////sixth triangle //manual->position(2.5, 0.0, -4.3); //manual->textureCoord(0,1); //manual->position(2.5, 10.0, -4.3); //manual->textureCoord(0,0); //manual->position(-2.5, 10.0, 4.3); //manual->textureCoord(1,0); //manual->end(); //manual->convertToMesh("BladesOfGrass"); // for(int i=0;i<50;i++) // { // for(int j=0;j<50;j++) // { // Ogre::Entity * ent = mSceneMgr->createEntity("BladesOfGrass"); // Ogre::SceneNode* node = mSceneMgr->getRootSceneNode()->createChildSceneNode(Ogre::Vector3(i*3,-10,j*3)); // node->attachObject(ent); // } // } Ogre::Plane plane(Ogre::Vector3::UNIT_Y, -10); Ogre::MeshManager::getSingleton().createPlane("plane", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane, 1500,1500,200,200,true,1,5,5,Ogre::Vector3::UNIT_Z); Ogre::Entity* ent = mSceneMgr->createEntity("GrassPlane", "plane"); mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent); ent->setMaterialName("Examples/GrassFloor"); Ogre::Light* light = mSceneMgr->createLight("Light1"); light->setType(Ogre::Light::LT_DIRECTIONAL); light->setDirection(Ogre::Vector3(1,-1,0)); Ogre::ManualObject* manual = mSceneMgr->createManualObject("grass"); manual->begin("Examples/GrassBlades", Ogre::RenderOperation::OT_TRIANGLE_LIST); manual->position(5.0, 0.0, 0.0); manual->textureCoord(0,1); manual->position(-5.0, 10.0, 0.0); manual->textureCoord(1,0); manual->position(-5.0, 0.0, 0.0); manual->textureCoord(1,1); manual->position(5.0, 10.0, 0.0); manual->textureCoord(0,0); manual->position(2.5, 0.0, 4.3); manual->textureCoord(0,1); manual->position(-2.5, 10.0, -4.3); manual->textureCoord(1,0); manual->position(-2.0, 0.0, -4.3); manual->textureCoord(1,1); manual->position(2.5, 10.0, 4.3); manual->textureCoord(0,0); manual->position(2.5, 0.0, -4.3); manual->textureCoord(0,1); manual->position(-2.5, 10.0, 4.3); manual->textureCoord(1,0); manual->position(-2.0, 0.0, 4.3); manual->textureCoord(1,1); manual->position(2.5, 10.0, -4.3); manual->textureCoord(0,0); manual->index(0); manual->index(1); manual->index(2); manual->index(0); manual->index(3); manual->index(1); manual->index(4); manual->index(5); manual->index(6); manual->index(4); manual->index(7); manual->index(5); manual->index(8); manual->index(9); manual->index(10); manual->index(8); manual->index(11); manual->index(9); manual->end(); manual->convertToMesh("BladesOfGrass"); Ogre::StaticGeometry* field = mSceneMgr->createStaticGeometry("FieldOfGrass"); for(int i=0;i<50;i++) { for(int j=0;j<50;j++) { Ogre::Entity * ent = mSceneMgr->createEntity("BladesOfGrass"); field->addEntity(ent,Ogre::Vector3(i*3,-10,j*3)); } } field->build(); } }; int main() { cMyApplication App; App.go(); return 0; }
时间: 2024-11-08 22:59:22