码迷,mamicode.com
首页 > 其他好文 > 详细

HiDot3Bump

时间:2014-08-27 12:55:37      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   os   io   for   ar   2014   

bubuko.com,布布扣

  • 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

标签:des   style   blog   http   os   io   for   ar   2014   

原文地址:http://www.cnblogs.com/mynamepfd/p/3938610.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!