Merge remote-tracking branch 'greye/player_control'

Conflicts:
	apps/openmw/mwrender/player.cpp
This commit is contained in:
Marc Zinnschlag 2012-08-18 13:38:54 +02:00
commit d1656b2f5d
6 changed files with 78 additions and 28 deletions

View file

@ -31,6 +31,8 @@ namespace MWBase
virtual void setDragDrop(bool dragDrop) = 0; virtual void setDragDrop(bool dragDrop) = 0;
virtual void toggleControlSwitch (const std::string& sw, bool value) = 0; virtual void toggleControlSwitch (const std::string& sw, bool value) = 0;
virtual void resetIdleTime() = 0;
}; };
} }

View file

@ -92,6 +92,7 @@ namespace MWInput
std::map<std::string, bool> mControlSwitch; std::map<std::string, bool> mControlSwitch;
float mPreviewPOVDelay; float mPreviewPOVDelay;
float mTimeIdle;
/* InputImpl Methods */ /* InputImpl Methods */
public: public:
@ -99,11 +100,34 @@ public:
{ {
input.adjustMouseClippingSize(width, height); input.adjustMouseClippingSize(width, height);
} }
void resetIdleTime()
{
if (mTimeIdle < 0) {
MWBase::Environment::get().getWorld()->toggleVanityMode(false, false);
}
mTimeIdle = 0.f;
}
private: private:
void updateIdleTime(float dt)
{
if (mTimeIdle >= 0.f) {
mTimeIdle += dt;
}
if (mTimeIdle > 30.f && !windows.isGuiMode()) {
MWBase::Environment::get().getWorld()->toggleVanityMode(true, false);
mTimeIdle = -1.f;
}
}
void toggleSpell() void toggleSpell()
{ {
if (windows.isGuiMode()) return; if (windows.isGuiMode()) return;
resetIdleTime();
MWMechanics::DrawState_ state = player.getDrawState(); MWMechanics::DrawState_ state = player.getDrawState();
if (state == MWMechanics::DrawState_Weapon || state == MWMechanics::DrawState_Nothing) if (state == MWMechanics::DrawState_Weapon || state == MWMechanics::DrawState_Nothing)
{ {
@ -121,6 +145,8 @@ private:
{ {
if (windows.isGuiMode()) return; if (windows.isGuiMode()) return;
resetIdleTime();
MWMechanics::DrawState_ state = player.getDrawState(); MWMechanics::DrawState_ state = player.getDrawState();
if (state == MWMechanics::DrawState_Spell || state == MWMechanics::DrawState_Nothing) if (state == MWMechanics::DrawState_Spell || state == MWMechanics::DrawState_Nothing)
{ {
@ -200,18 +226,26 @@ private:
void activate() void activate()
{ {
resetIdleTime();
mEngine.activate(); mEngine.activate();
} }
void toggleAutoMove() void toggleAutoMove()
{ {
if (windows.isGuiMode()) return; if (windows.isGuiMode()) return;
resetIdleTime();
player.setAutoMove (!player.getAutoMove()); player.setAutoMove (!player.getAutoMove());
} }
void toggleWalking() void toggleWalking()
{ {
if (windows.isGuiMode()) return; if (windows.isGuiMode()) return;
resetIdleTime();
player.toggleRunning(); player.toggleRunning();
} }
@ -243,7 +277,8 @@ private:
windows(_windows), windows(_windows),
mEngine (engine), mEngine (engine),
mDragDrop(false), mDragDrop(false),
mPreviewPOVDelay(0.f) mPreviewPOVDelay(0.f),
mTimeIdle(0.f)
{ {
using namespace OEngine::Input; using namespace OEngine::Input;
using namespace OEngine::Render; using namespace OEngine::Render;
@ -426,6 +461,19 @@ private:
} }
} }
} }
// Idle time update despite of control switches
if (poller.isDown(A_MoveLeft) ||
poller.isDown(A_MoveRight) ||
poller.isDown(A_MoveForward) ||
poller.isDown(A_MoveBackward) ||
poller.isDown(A_Jump) ||
poller.isDown(A_Crouch) ||
poller.isDown(A_TogglePOV))
{
resetIdleTime();
} else {
updateIdleTime(duration);
}
} }
// Switch between gui modes. Besides controlling the Gui windows // Switch between gui modes. Besides controlling the Gui windows
@ -440,6 +488,8 @@ private:
// Enable GUI events // Enable GUI events
guiEvents->enabled = true; guiEvents->enabled = true;
resetIdleTime();
} }
else else
{ {
@ -472,11 +522,6 @@ private:
mControlSwitch[sw] = value; mControlSwitch[sw] = value;
} }
bool getControlSwitch(const std::string &sw)
{
return mControlSwitch[sw];
}
void togglePOV() void togglePOV()
{ {
MWBase::Environment::get().getWorld()->togglePOV(); MWBase::Environment::get().getWorld()->togglePOV();
@ -536,8 +581,8 @@ private:
impl->toggleControlSwitch(sw, value); impl->toggleControlSwitch(sw, value);
} }
bool MWInputManager::getControlSwitch(const std::string &sw) void MWInputManager::resetIdleTime()
{ {
return impl->getControlSwitch(sw); impl->resetIdleTime();
} }
} }

View file

@ -61,7 +61,8 @@ namespace MWInput
virtual void setDragDrop(bool dragDrop); virtual void setDragDrop(bool dragDrop);
void toggleControlSwitch(const std::string &sw, bool value); void toggleControlSwitch(const std::string &sw, bool value);
bool getControlSwitch(const std::string &sw);
void resetIdleTime();
}; };
} }
#endif #endif

View file

@ -1,6 +1,7 @@
#include "mouselookevent.hpp" #include "mouselookevent.hpp"
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/inputmanager.hpp"
#include "../mwbase/world.hpp" #include "../mwbase/world.hpp"
#include "../mwworld/player.hpp" #include "../mwworld/player.hpp"
@ -17,6 +18,7 @@ void MouseLookEvent::event(Type type, int index, const void *p)
if (type != EV_MouseMove || mDisabled) { if (type != EV_MouseMove || mDisabled) {
return; return;
} }
MWBase::Environment::get().getInputManager()->resetIdleTime();
MouseEvent *arg = (MouseEvent*)(p); MouseEvent *arg = (MouseEvent*)(p);

View file

@ -2,7 +2,6 @@
#include <OgreSceneNode.h> #include <OgreSceneNode.h>
#include <OgreCamera.h> #include <OgreCamera.h>
#include <OgreRay.h>
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/windowmanager.hpp" #include "../mwbase/windowmanager.hpp"
@ -39,9 +38,6 @@ namespace MWRender
bool Player::rotate(const Ogre::Vector3 &rot, bool adjust) bool Player::rotate(const Ogre::Vector3 &rot, bool adjust)
{ {
mUpdates = 0;
mTimeIdle = 0.f;
if (mVanity.enabled) { if (mVanity.enabled) {
toggleVanityMode(false); toggleVanityMode(false);
} }
@ -120,14 +116,6 @@ namespace MWRender
void Player::update(float duration) void Player::update(float duration)
{ {
bool isGuiMode = MWBase::Environment::get().getWindowManager ()->isGuiMode();
if (!mVanity.enabled && !isGuiMode) {
++mUpdates;
mTimeIdle += duration;
if (mTimeIdle > 30.f) {
toggleVanityMode(true);
}
}
if (mAnimation) { if (mAnimation) {
mAnimation->runAnimation(duration); mAnimation->runAnimation(duration);
} }
@ -146,10 +134,10 @@ namespace MWRender
mFirstPersonView = !mFirstPersonView; mFirstPersonView = !mFirstPersonView;
if (mFirstPersonView) { if (mFirstPersonView) {
mCamera->setPosition(0.f, 0.f, 0.f); mCamera->setPosition(0.f, 0.f, 0.f);
mCameraNode->setPosition(0.f, 0.f, 128.f); setLowHeight(false);
} else { } else {
mCamera->setPosition(0.f, 0.f, mCameraDistance); mCamera->setPosition(0.f, 0.f, mCameraDistance);
mCameraNode->setPosition(0.f, 0.f, 104.f); setLowHeight(true);
} }
mPlayerNode->setVisible(!mFirstPersonView, false); mPlayerNode->setVisible(!mFirstPersonView, false);
} }
@ -177,15 +165,17 @@ namespace MWRender
float offset = mPreviewCam.offset; float offset = mPreviewCam.offset;
Ogre::Vector3 rot(0.f, 0.f, 0.f); Ogre::Vector3 rot(0.f, 0.f, 0.f);
if (mVanity.enabled) { if (mVanity.enabled) {
mPlayerNode->setVisible(true, false);
rot.x = Ogre::Degree(-30.f).valueRadians(); rot.x = Ogre::Degree(-30.f).valueRadians();
mMainCam.offset = mCamera->getPosition().z; mMainCam.offset = mCamera->getPosition().z;
mPlayerNode->setVisible(true, false);
setLowHeight(true);
} else { } else {
rot.x = getPitch(); rot.x = getPitch();
offset = mMainCam.offset; offset = mMainCam.offset;
mPlayerNode->setVisible(!mFirstPersonView, false); mPlayerNode->setVisible(!mFirstPersonView, false);
setLowHeight(!mFirstPersonView);
} }
rot.z = getYaw(); rot.z = getYaw();
mCamera->setPosition(0.f, 0.f, offset); mCamera->setPosition(0.f, 0.f, offset);
@ -202,15 +192,17 @@ namespace MWRender
mPreviewMode = enable; mPreviewMode = enable;
float offset = mCamera->getPosition().z; float offset = mCamera->getPosition().z;
if (mPreviewMode) { if (mPreviewMode) {
mPlayerNode->setVisible(true, false);
mMainCam.offset = offset; mMainCam.offset = offset;
offset = mPreviewCam.offset; offset = mPreviewCam.offset;
mPlayerNode->setVisible(true, false);
setLowHeight(true);
} else { } else {
mPreviewCam.offset = offset; mPreviewCam.offset = offset;
offset = mMainCam.offset; offset = mMainCam.offset;
mPlayerNode->setVisible(!mFirstPersonView, false); mPlayerNode->setVisible(!mFirstPersonView, false);
setLowHeight(!mFirstPersonView);
} }
mCamera->setPosition(0.f, 0.f, offset); mCamera->setPosition(0.f, 0.f, offset);
rotateCamera(Ogre::Vector3(getPitch(), 0.f, getYaw()), false); rotateCamera(Ogre::Vector3(getPitch(), 0.f, getYaw()), false);
@ -358,4 +350,13 @@ namespace MWRender
{ {
mFreeLook = enable; mFreeLook = enable;
} }
void Player::setLowHeight(bool low)
{
if (low) {
mCameraNode->setPosition(0.f, 0.f, mHeight * 0.85);
} else {
mCameraNode->setPosition(0.f, 0.f, mHeight);
}
}
} }

View file

@ -45,9 +45,6 @@ namespace MWRender
bool mDistanceAdjusted; bool mDistanceAdjusted;
float mTimeIdle;
int mUpdates;
/// Updates sound manager listener data /// Updates sound manager listener data
void updateListener(); void updateListener();
@ -61,6 +58,8 @@ namespace MWRender
void compensateYaw(float diff); void compensateYaw(float diff);
void setLowHeight(bool low = true);
public: public:
Player (Ogre::Camera *camera, Ogre::SceneNode* mNode); Player (Ogre::Camera *camera, Ogre::SceneNode* mNode);