forked from teamnwah/openmw-tes3coop
Merge remote-tracking branch 'greye/player_control'
Conflicts: apps/openmw/mwrender/player.cpp
This commit is contained in:
commit
d1656b2f5d
6 changed files with 78 additions and 28 deletions
|
@ -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;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue