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

HiBSP

时间:2014-08-25 16:47:34      阅读:179      评论:0      收藏:0      [点我收藏+]

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

bubuko.com,布布扣

  • 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_MANAUAL
};

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_MANAUAL && style == CS_MANAUAL)
	{
		mCamera->setAutoTracking(false);
		manualStop();
	}
}

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 cAppFrameListener : public Ogre::FrameListener, public OIS::KeyListener, public OIS::MouseListener
{
private:
	cCameraManager		*mCameraMgr;
    OIS::InputManager   *mInputMgr;
    OIS::Keyboard       *mKeyboard;
    OIS::Mouse          *mMouse;

public:
	cAppFrameListener(Ogre::RenderWindow *win, cCameraManager *camMgr);

    bool frameStarted(const Ogre::FrameEvent &evt);
    bool frameRenderingQueued(const Ogre::FrameEvent &evt);
    bool frameEnded(const Ogre::FrameEvent &evt);

	bool keyPressed(const OIS::KeyEvent &arg);
    bool keyReleased(const OIS::KeyEvent &arg);
 
    bool mouseMoved(const OIS::MouseEvent &arg);
    bool mousePressed(const OIS::MouseEvent &arg, OIS::MouseButtonID id);
    bool mouseReleased(const OIS::MouseEvent &arg, OIS::MouseButtonID id);
};

class cApplication
{
protected:
    MyGUI::Gui          *mGUI;
    MyGUI::OgrePlatform *mPlatform;
 
    Ogre::Root          *mRoot;
    Ogre::RenderWindow  *mWindow;
    Ogre::SceneManager  *mSceneMgr;
	Ogre::Camera		*mCamera;
	cCameraManager		*mCameraMgr;

public:
    virtual void setupResources();
	virtual void setupView();
	virtual void loadResources();
    virtual void createScene() {}

    bool setup();
    void go();
};

  

  • System.cpp
/***************************************************
    ©2014 Pf_D. All rights reserved.
***************************************************/
#include "System.h"

cAppFrameListener::cAppFrameListener(Ogre::RenderWindow *win, cCameraManager *camMgr)
{
	mCameraMgr = camMgr;
    OIS::ParamList parameters;
    unsigned int windowHandle = 0;
    std::ostringstream windowHandleString;
    win->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 = win->getWidth();
    mouseState.height = win->getHeight();
    mMouse->setEventCallback(this);
}
 
bool cAppFrameListener::frameStarted(const Ogre::FrameEvent &evt)
{
    mKeyboard->capture();
    mMouse->capture();
    return true;
}
 
bool cAppFrameListener::frameRenderingQueued(const Ogre::FrameEvent &evt)
{
	mCameraMgr->frameRenderingQueued(evt);
    return true;
}
 
bool cAppFrameListener::frameEnded(const Ogre::FrameEvent &evt)
{
    return true;
}

bool cAppFrameListener::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 cAppFrameListener::keyReleased(const OIS::KeyEvent &arg)
{
    MyGUI::InputManager::getInstance().injectKeyRelease(MyGUI::KeyCode::Enum(arg.key));
	mCameraMgr->injectKeyUp(arg);
    // ...
    return true;
}
 
bool cAppFrameListener::mouseMoved( const OIS::MouseEvent &arg )
{
    MyGUI::InputManager::getInstance().injectMouseMove(
        arg.state.X.abs, arg.state.Y.abs, arg.state.Z.abs);
	mCameraMgr->injectMouseMove(arg);
    // ...
    return true;
}
 
bool cAppFrameListener::mousePressed( const OIS::MouseEvent &arg, OIS::MouseButtonID id )
{
    MyGUI::InputManager::getInstance().injectMousePress(
        arg.state.X.abs, arg.state.Y.abs, MyGUI::MouseButton::Enum(id));
	mCameraMgr->injectMouseDown(arg, id);
    // ...
    return true;
}
 
bool cAppFrameListener::mouseReleased( const OIS::MouseEvent &arg, OIS::MouseButtonID id )
{
    MyGUI::InputManager::getInstance().injectMouseRelease(
        arg.state.X.abs, arg.state.Y.abs, MyGUI::MouseButton::Enum(id));
	mCameraMgr->injectMouseUp(arg, id);
    // ...
    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::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);
	ShowCursor(false);
    // Choose scene manager
    mSceneMgr = mRoot->createSceneManager("BspSceneManager");
	setupView();
    // Load resources
    loadResources();
    // Create scene
    createScene();
    // Create frame listener
	mRoot->addFrameListener(new cAppFrameListener(mWindow, mCameraMgr));
    return true;
}
 
void cApplication::go()
{
    if(!setup())
        return;
    mRoot->startRendering();
}

  

  • Main.cpp
/***************************************************
    ©2014 Pf_D. All rights reserved.
***************************************************/
#include "System.h"
 
class cMyApplication : public cApplication
{
private:
	Ogre::String mArchive, mMap;

public:
	void setupResources()
	{
		cApplication::setupResources();
    Ogre::ConfigFile cf;
#if OGRE_DEBUG_MODE
    cf.load("quakemap_d.cfg");
#else
    cf.load("quakemap.cfg");
#endif
		mArchive = cf.getSetting("Archive");
		mMap = cf.getSetting("Map");
		Ogre::ResourceGroupManager::getSingleton().addResourceLocation(mArchive, "Zip",
			Ogre::ResourceGroupManager::getSingleton().getWorldResourceGroupName(), true);
	}

	void setupView()
	{
		cApplication::setupView();
		mCamera->setNearClipDistance(4);
		mCamera->setFarClipDistance(1000);
		Ogre::ViewPoint vp = mSceneMgr->getSuggestedViewpoint(true);
		mCamera->setFixedYawAxis(true, Ogre::Vector3::UNIT_Z);
		mCamera->pitch(Ogre::Degree(90));
		mCamera->setPosition(vp.position);
		mCamera->rotate(vp.orientation);
	}

	void loadResources()
	{
		cApplication::loadResources();
		Ogre::ResourceGroupManager &rgm = Ogre::ResourceGroupManager::getSingleton();
		rgm.linkWorldGeometryToResourceGroup(rgm.getWorldResourceGroupName(), mMap, mSceneMgr);
		rgm.loadResourceGroup(rgm.getWorldResourceGroupName(), false);
	}

    void createScene()
    {
        // MyGUI
        mPlatform = new MyGUI::OgrePlatform();
        mPlatform->initialise(mWindow, mSceneMgr);
        mGUI = new MyGUI::Gui();
        mGUI->initialise();
        /*MyGUI::ButtonPtr button = mGUI->createWidget<MyGUI::Button>
            ("Button", 10, 10, 300, 26, MyGUI::Align::Default, "Main");
        button->setCaption("exit");
        button->eventMouseButtonClick += MyGUI::newDelegate(this, &cMyApplication::notifyExitClick);
        */mSceneMgr->setAmbientLight(Ogre::ColourValue::White);
        //Ogre::Entity *ent = mSceneMgr->createEntity("Sinbad", "Sinbad.mesh");
        //mSceneMgr->getRootSceneNode()->attachObject(ent);
    }

    void notifyExitClick(MyGUI::WidgetPtr sender)
    {
        exit(0);
    }
};
 
int main()
{
    cMyApplication App;
    App.go();
    return 0;
}

  

HiBSP

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

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

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