Show DopeEntrada.h syntax highlighted
#ifndef __DopeEntrada_H__
#define __DopeEntrada_H__
#include "Dope.h"
#include "OgreException.h"
#include <OIS/OIS.h>
using namespace Ogre;
namespace Dope {
class Entrada: public FrameListener
{
private:
void updateStats(void)
{
static String currFps = "Current FPS: ";
static String avgFps = "Average FPS: ";
static String bestFps = "Best FPS: ";
static String worstFps = "Worst FPS: ";
static String tris = "Triangle Count: ";
// update stats when necessary
OverlayElement* guiAvg = OverlayManager::getSingleton().getOverlayElement("Core/AverageFps");
OverlayElement* guiCurr = OverlayManager::getSingleton().getOverlayElement("Core/CurrFps");
OverlayElement* guiBest = OverlayManager::getSingleton().getOverlayElement("Core/BestFps");
OverlayElement* guiWorst = OverlayManager::getSingleton().getOverlayElement("Core/WorstFps");
guiAvg->setCaption(avgFps + StringConverter::toString(mWindow->getAverageFPS()));
guiCurr->setCaption(currFps + StringConverter::toString(mWindow->getLastFPS()));
guiBest->setCaption(bestFps + StringConverter::toString(mWindow->getBestFPS())
+" "+StringConverter::toString(mWindow->getBestFrameTime())+" ms");
guiWorst->setCaption(worstFps + StringConverter::toString(mWindow->getWorstFPS())
+" "+StringConverter::toString(mWindow->getWorstFrameTime())+" ms");
OverlayElement* guiTris = OverlayManager::getSingleton().getOverlayElement("Core/NumTris");
guiTris->setCaption(tris + StringConverter::toString(mWindow->getTriangleCount()));
OverlayElement* guiDbg = OverlayManager::getSingleton().getOverlayElement("Core/DebugText");
guiDbg->setCaption(mDebugText);
}
public:
// Constructor takes a RenderWindow because it uses that to determine input context
Entrada(RenderWindow* win, Camara* cam, bool bufferedKeys = false, bool bufferedMouse = false)
{
using namespace OIS;
ParamList pl;
size_t windowHnd = 0;
std::ostringstream windowHndStr;
win->getCustomAttribute("WINDOW", &windowHnd);
windowHndStr << windowHnd;
pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
mInputManager = InputManager::createInputSystem( pl );
//Create all devices (We only catch joystick exceptions here, as, most people have Key/Mouse)
mKeyboard = static_cast<Keyboard*>(mInputManager->createInputObject( OISKeyboard, bufferedKeys ));
mMouse = static_cast<Mouse*>(mInputManager->createInputObject( OISMouse, bufferedMouse ));
unsigned int width, height, depth;
int left, top;
win->getMetrics(width, height, depth, left, top);
//Set Mouse Region.. if window resizes, we should alter this to reflect as well
const MouseState &ms = mMouse->getMouseState();
ms.width = width;
ms.height = height;
mCamera = cam;
mWindow = win;
mStatsOn = true;
mNumScreenShots = 0;
mTimeUntilNextToggle = 0;
showDebugOverlay(true);
mDebugText = "Press SPACE to throw the ball";
}
virtual ~Entrada()
{
if(mInputManager)
{
mInputManager->destroyInputObject(mMouse);
mInputManager->destroyInputObject(mKeyboard);
OIS::InputManager::destroyInputSystem(mInputManager);
mInputManager = 0;
}
}
bool processUnbufferedKeyInput(const FrameEvent& evt)
{
using namespace OIS;
if(mKeyboard->isKeyDown(KC_A))
mTranslateVector.x = -mMoveScale; // Move camera left
if(mKeyboard->isKeyDown(KC_D))
mTranslateVector.x = mMoveScale; // Move camera RIGHT
if(mKeyboard->isKeyDown(KC_UP) || mKeyboard->isKeyDown(KC_W) )
mTranslateVector.z = -mMoveScale; // Move camera forward
if(mKeyboard->isKeyDown(KC_DOWN) || mKeyboard->isKeyDown(KC_S) )
mTranslateVector.z = mMoveScale; // Move camera backward
if(mKeyboard->isKeyDown(KC_PGUP))
mTranslateVector.y = mMoveScale; // Move camera up
if(mKeyboard->isKeyDown(KC_PGDOWN))
mTranslateVector.y = -mMoveScale; // Move camera down
if(mKeyboard->isKeyDown(KC_RIGHT))
mCamera->yaw(-mRotScale);
if(mKeyboard->isKeyDown(KC_LEFT))
mCamera->yaw(mRotScale);
if( mKeyboard->isKeyDown(KC_ESCAPE) || mKeyboard->isKeyDown(KC_Q) )
return false;
if( mKeyboard->isKeyDown(KC_F) && mTimeUntilNextToggle <= 0 )
{
mStatsOn = !mStatsOn;
showDebugOverlay(mStatsOn);
mTimeUntilNextToggle = 1;
}
if(mKeyboard->isKeyDown(KC_SYSRQ) && mTimeUntilNextToggle <= 0)
{
std::ostringstream ss;
ss << "screenshot_" << ++mNumScreenShots << ".png";
mWindow->writeContentsToFile(ss.str());
mTimeUntilNextToggle = 0.5;
mDebugText = "Saved: " + ss.str();
}
// Return true to continue rendering
return true;
}
bool processUnbufferedMouseInput(const FrameEvent& evt)
{
using namespace OIS;
// Rotation factors, may not be used if the second mouse button is pressed
// 2nd mouse button - slide, otherwise rotate
const MouseState &ms = mMouse->getMouseState();
if( ms.buttonDown( MB_Right ) )
{
mTranslateVector.x += ms.X.rel * 0.13;
mTranslateVector.y -= ms.Y.rel * 0.13;
}
else
{
mRotX = Degree(-ms.X.rel * 0.13);
mRotY = Degree(-ms.Y.rel * 0.13);
}
return true;
}
void moveCamera()
{
// Make all the changes to the camera
// Note that YAW direction is around a fixed axis (freelook style) rather than a natural YAW (e.g. airplane)
mCamera->yaw(mRotX);
mCamera->pitch(mRotY);
mCamera->translate(mTranslateVector);
}
void showDebugOverlay(bool show)
{
Overlay* o = OverlayManager::getSingleton().getByName("Core/DebugOverlay");
if (!o)
OGRE_EXCEPT( Exception::ERR_ITEM_NOT_FOUND, "Could not find overlay Core/DebugOverlay",
"showDebugOverlay" );
if (show)
o->show();
else
o->hide();
}
// Override frameEnded event
bool frameEnded(const FrameEvent& evt)
{
mMouse->capture();
mKeyboard->capture();
if( !mMouse->buffered() || !mKeyboard->buffered() )
{
// one of the input modes is immediate, so setup what is needed for immediate mouse/key movement
if (mTimeUntilNextToggle >= 0)
mTimeUntilNextToggle -= evt.timeSinceLastFrame;
// If this is the first frame, pick a speed
if (evt.timeSinceLastFrame == 0)
{
mMoveScale = 0.5;
mRotScale = 0.1;
}
// Otherwise scale movement units by time passed since last frame
else
{
// Move about 50 units per second,
mMoveScale = 50.0 * evt.timeSinceLastFrame;
// Take about 10 seconds for full rotation
mRotScale = Degree(36 * evt.timeSinceLastFrame);
}
mRotX = 0;
mRotY = 0;
mTranslateVector = Vector3::ZERO;
}
//Check to see which device is not buffered, and handle it
if( !mKeyboard->buffered() )
if( processUnbufferedKeyInput(evt) == false )
return false;
if( !mMouse->buffered() )
if( processUnbufferedMouseInput(evt) == false )
return false;
if( !mMouse->buffered() || !mKeyboard->buffered() )
moveCamera();
// Perform simulation step
Escena::getSingleton().simulationStep(evt.timeSinceLastFrame);
updateStats();
return true;
}
protected:
OIS::Mouse *mMouse;
OIS::Keyboard *mKeyboard;
OIS::InputManager *mInputManager;
Camara* mCamera;
Vector3 mTranslateVector;
RenderWindow* mWindow;
bool mStatsOn;
unsigned int mNumScreenShots;
float mMoveScale;
Radian mRotScale;
// just to stop toggles flipping too fast
Real mTimeUntilNextToggle ;
Radian mRotX, mRotY;
std::string mDebugText;
};
}
#endif
See more files for this project here