首页 > 代码库 > HiDot3Bump

HiDot3Bump

  • Desc

增加了对DragLook的处理。

  • 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:    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{private:    std::map<Ogre::String, Ogre::StringVector> mPossiblities;    Ogre::SceneNode *mObjectNode;    Ogre::SceneNode *mLightPivot1;    Ogre::SceneNode *mLightPivot2;    bool mMoveLights;	MyGUI::ComboBoxPtr mMeshMenu;	MyGUI::ComboBoxPtr mMaterialMenu;public:    bool frameRenderingQueued(const Ogre::FrameEvent &evt)    {        mLightPivot1->roll(Ogre::Degree(evt.timeSinceLastFrame * 30));        return cApplication::frameRenderingQueued(evt);    }     void setupModels()    {        Ogre::StringVector matNames;        matNames.push_back("Examples/BumpMapping/MultiLight");        mPossiblities["ogrehead.mesh"] = matNames;        for(std::map<Ogre::String, Ogre::StringVector>::iterator iter =             mPossiblities.begin(); iter != mPossiblities.end(); iter++)        {            Ogre::MeshPtr mesh = Ogre::MeshManager::getSingleton().load(                iter->first, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,                Ogre::HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY);            unsigned short src, dest;            if(!mesh->suggestTangentVectorBuildParams(Ogre::VES_TANGENT, src, dest))            {                mesh->buildTangentVectors(Ogre::VES_TANGENT, src, dest);            }            Ogre::Entity *ent = mSceneMgr->createEntity(mesh->getName(), mesh->getName());            ent->setMaterialName(iter->second.front());            mObjectNode->attachObject(ent);        }     }     void setupLights()    {        mSceneMgr->setAmbientLight(Ogre::ColourValue::Black);        mLightPivot1 = mSceneMgr->getRootSceneNode()->createChildSceneNode();        Ogre::Light *l;        Ogre::BillboardSet *bbs;        l = mSceneMgr->createLight();        l->setPosition(200, 0, 0);        l->setDiffuseColour(1, 1, 1);        l->setSpecularColour(1, 1, 1);        bbs = mSceneMgr->createBillboardSet();        bbs->setMaterialName("Examples/Flare");        bbs->createBillboard(200, 0, 0)->setColour(Ogre::ColourValue::White);        mLightPivot1->attachObject(l);        mLightPivot1->attachObject(bbs);    } 	void setupControls()	{	}	      void notifyLight1Click(MyGUI::WidgetPtr sender)    {		MyGUI::ButtonPtr Light1 = sender->castType<MyGUI::Button>(false);		bool isSelected = Light1->getStateSelected();		Light1->setStateSelected(!isSelected);		Ogre::SceneNode::ObjectIterator iter = mLightPivot1->getAttachedObjectIterator();		while(iter.hasMoreElements())		{			Ogre::MovableObject *o = iter.getNext();			o->setVisible(!isSelected);		}    }    void createScene()    {        // MyGUI        mPlatform = new MyGUI::OgrePlatform();        mPlatform->initialise(mWindow, mSceneMgr);        mGUI = new MyGUI::Gui();        mGUI->initialise();		MyGUI::LayoutManager::getInstance().load("HiDot3Bump.layout");		MyGUI::ButtonPtr Light1 = MyGUI::Gui::getInstance().findWidget<MyGUI::Button>("Light1");		Light1->eventMouseButtonClick += MyGUI::newDelegate(this, &cMyApplication::notifyLight1Click);		mMeshMenu = MyGUI::Gui::getInstance().findWidget<MyGUI::ComboBox>("Mesh");		mMaterialMenu = MyGUI::Gui::getInstance().findWidget<MyGUI::ComboBox>("Material");        mObjectNode= mSceneMgr->getRootSceneNode()->createChildSceneNode();        setupModels();        setupLights();        mCamera->setPosition(0, 0, 500);#if OGRE_PLATFORM != OGRE_PLATFORM_APPLE_IOS        setDragLook(true);#endif        //Ogre::Entity *ent = mSceneMgr->createEntity("sinbad", "sinbad.mesh");        //mSceneMgr->getRootSceneNode()->attachObject(ent);    }};  int main(){    cMyApplication App;    App.go();    return 0;}

  

HiDot3Bump