mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-11-04 00:26:39 +00:00 
			
		
		
		
	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 toggleControlSwitch (const std::string& sw, bool value) = 0;
 | 
			
		||||
 | 
			
		||||
            virtual void resetIdleTime() = 0;
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -92,6 +92,7 @@ namespace MWInput
 | 
			
		|||
    std::map<std::string, bool> mControlSwitch;
 | 
			
		||||
 | 
			
		||||
    float mPreviewPOVDelay;
 | 
			
		||||
    float mTimeIdle;
 | 
			
		||||
 | 
			
		||||
   /* InputImpl Methods */
 | 
			
		||||
public:
 | 
			
		||||
| 
						 | 
				
			
			@ -99,11 +100,34 @@ public:
 | 
			
		|||
    {
 | 
			
		||||
        input.adjustMouseClippingSize(width, height);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void resetIdleTime()
 | 
			
		||||
    {
 | 
			
		||||
        if (mTimeIdle < 0) {
 | 
			
		||||
            MWBase::Environment::get().getWorld()->toggleVanityMode(false, false);
 | 
			
		||||
        }
 | 
			
		||||
        mTimeIdle = 0.f;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
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()
 | 
			
		||||
    {
 | 
			
		||||
        if (windows.isGuiMode()) return;
 | 
			
		||||
 | 
			
		||||
        resetIdleTime();
 | 
			
		||||
 | 
			
		||||
        MWMechanics::DrawState_ state = player.getDrawState();
 | 
			
		||||
        if (state == MWMechanics::DrawState_Weapon || state == MWMechanics::DrawState_Nothing)
 | 
			
		||||
        {
 | 
			
		||||
| 
						 | 
				
			
			@ -121,6 +145,8 @@ private:
 | 
			
		|||
    {
 | 
			
		||||
        if (windows.isGuiMode()) return;
 | 
			
		||||
 | 
			
		||||
        resetIdleTime();
 | 
			
		||||
 | 
			
		||||
        MWMechanics::DrawState_ state = player.getDrawState();
 | 
			
		||||
        if (state == MWMechanics::DrawState_Spell || state == MWMechanics::DrawState_Nothing)
 | 
			
		||||
        {
 | 
			
		||||
| 
						 | 
				
			
			@ -200,18 +226,26 @@ private:
 | 
			
		|||
 | 
			
		||||
    void activate()
 | 
			
		||||
    {
 | 
			
		||||
        resetIdleTime();
 | 
			
		||||
 | 
			
		||||
        mEngine.activate();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void toggleAutoMove()
 | 
			
		||||
    {
 | 
			
		||||
        if (windows.isGuiMode()) return;
 | 
			
		||||
        
 | 
			
		||||
        resetIdleTime();
 | 
			
		||||
 | 
			
		||||
        player.setAutoMove (!player.getAutoMove());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void toggleWalking()
 | 
			
		||||
    {
 | 
			
		||||
        if (windows.isGuiMode()) return;
 | 
			
		||||
 | 
			
		||||
        resetIdleTime();
 | 
			
		||||
 | 
			
		||||
        player.toggleRunning();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -243,7 +277,8 @@ private:
 | 
			
		|||
        windows(_windows),
 | 
			
		||||
        mEngine (engine),
 | 
			
		||||
        mDragDrop(false),
 | 
			
		||||
        mPreviewPOVDelay(0.f)
 | 
			
		||||
        mPreviewPOVDelay(0.f),
 | 
			
		||||
        mTimeIdle(0.f)
 | 
			
		||||
    {
 | 
			
		||||
      using namespace OEngine::Input;
 | 
			
		||||
      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
 | 
			
		||||
| 
						 | 
				
			
			@ -440,6 +488,8 @@ private:
 | 
			
		|||
 | 
			
		||||
          // Enable GUI events
 | 
			
		||||
          guiEvents->enabled = true;
 | 
			
		||||
          
 | 
			
		||||
          resetIdleTime();
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
        {
 | 
			
		||||
| 
						 | 
				
			
			@ -472,11 +522,6 @@ private:
 | 
			
		|||
        mControlSwitch[sw] = value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool getControlSwitch(const std::string &sw)
 | 
			
		||||
    {
 | 
			
		||||
        return mControlSwitch[sw];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void togglePOV()
 | 
			
		||||
    {
 | 
			
		||||
        MWBase::Environment::get().getWorld()->togglePOV();
 | 
			
		||||
| 
						 | 
				
			
			@ -536,8 +581,8 @@ private:
 | 
			
		|||
        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);
 | 
			
		||||
 | 
			
		||||
    void toggleControlSwitch(const std::string &sw, bool value);
 | 
			
		||||
    bool getControlSwitch(const std::string &sw);
 | 
			
		||||
 | 
			
		||||
    void resetIdleTime();
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,7 @@
 | 
			
		|||
#include "mouselookevent.hpp"
 | 
			
		||||
 | 
			
		||||
#include "../mwbase/environment.hpp"
 | 
			
		||||
#include "../mwbase/inputmanager.hpp"
 | 
			
		||||
#include "../mwbase/world.hpp"
 | 
			
		||||
 | 
			
		||||
#include "../mwworld/player.hpp"
 | 
			
		||||
| 
						 | 
				
			
			@ -17,6 +18,7 @@ void MouseLookEvent::event(Type type, int index, const void *p)
 | 
			
		|||
    if (type != EV_MouseMove || mDisabled) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    MWBase::Environment::get().getInputManager()->resetIdleTime();
 | 
			
		||||
 | 
			
		||||
    MouseEvent *arg = (MouseEvent*)(p);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,6 @@
 | 
			
		|||
 | 
			
		||||
#include <OgreSceneNode.h>
 | 
			
		||||
#include <OgreCamera.h>
 | 
			
		||||
#include <OgreRay.h>
 | 
			
		||||
 | 
			
		||||
#include "../mwbase/environment.hpp"
 | 
			
		||||
#include "../mwbase/windowmanager.hpp"
 | 
			
		||||
| 
						 | 
				
			
			@ -39,9 +38,6 @@ namespace MWRender
 | 
			
		|||
    
 | 
			
		||||
    bool Player::rotate(const Ogre::Vector3 &rot, bool adjust)
 | 
			
		||||
    {
 | 
			
		||||
        mUpdates = 0;
 | 
			
		||||
        mTimeIdle = 0.f;
 | 
			
		||||
 | 
			
		||||
        if (mVanity.enabled) {
 | 
			
		||||
            toggleVanityMode(false);
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -120,14 +116,6 @@ namespace MWRender
 | 
			
		|||
 | 
			
		||||
    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) {
 | 
			
		||||
            mAnimation->runAnimation(duration);
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -146,10 +134,10 @@ namespace MWRender
 | 
			
		|||
        mFirstPersonView = !mFirstPersonView;
 | 
			
		||||
        if (mFirstPersonView) {
 | 
			
		||||
            mCamera->setPosition(0.f, 0.f, 0.f);
 | 
			
		||||
            mCameraNode->setPosition(0.f, 0.f, 128.f);
 | 
			
		||||
            setLowHeight(false);
 | 
			
		||||
        } else {
 | 
			
		||||
            mCamera->setPosition(0.f, 0.f, mCameraDistance);
 | 
			
		||||
            mCameraNode->setPosition(0.f, 0.f, 104.f);
 | 
			
		||||
            setLowHeight(true);
 | 
			
		||||
        }
 | 
			
		||||
        mPlayerNode->setVisible(!mFirstPersonView, false);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -177,15 +165,17 @@ namespace MWRender
 | 
			
		|||
        float offset = mPreviewCam.offset;
 | 
			
		||||
        Ogre::Vector3 rot(0.f, 0.f, 0.f);
 | 
			
		||||
        if (mVanity.enabled) {
 | 
			
		||||
            mPlayerNode->setVisible(true, false);
 | 
			
		||||
            rot.x = Ogre::Degree(-30.f).valueRadians();
 | 
			
		||||
            mMainCam.offset = mCamera->getPosition().z;
 | 
			
		||||
 | 
			
		||||
            mPlayerNode->setVisible(true, false);
 | 
			
		||||
            setLowHeight(true);
 | 
			
		||||
        } else {
 | 
			
		||||
            rot.x = getPitch();
 | 
			
		||||
            offset = mMainCam.offset;
 | 
			
		||||
 | 
			
		||||
            mPlayerNode->setVisible(!mFirstPersonView, false);
 | 
			
		||||
            setLowHeight(!mFirstPersonView);
 | 
			
		||||
        }
 | 
			
		||||
        rot.z = getYaw();
 | 
			
		||||
        mCamera->setPosition(0.f, 0.f, offset);
 | 
			
		||||
| 
						 | 
				
			
			@ -202,15 +192,17 @@ namespace MWRender
 | 
			
		|||
        mPreviewMode = enable;
 | 
			
		||||
        float offset = mCamera->getPosition().z;
 | 
			
		||||
        if (mPreviewMode) {
 | 
			
		||||
            mPlayerNode->setVisible(true, false);
 | 
			
		||||
            mMainCam.offset = offset;
 | 
			
		||||
            offset = mPreviewCam.offset;
 | 
			
		||||
 | 
			
		||||
            mPlayerNode->setVisible(true, false);
 | 
			
		||||
            setLowHeight(true);
 | 
			
		||||
        } else {
 | 
			
		||||
            mPreviewCam.offset = offset;
 | 
			
		||||
            offset = mMainCam.offset;
 | 
			
		||||
 | 
			
		||||
            mPlayerNode->setVisible(!mFirstPersonView, false);
 | 
			
		||||
            setLowHeight(!mFirstPersonView);
 | 
			
		||||
        }
 | 
			
		||||
        mCamera->setPosition(0.f, 0.f, offset);
 | 
			
		||||
        rotateCamera(Ogre::Vector3(getPitch(), 0.f, getYaw()), false);
 | 
			
		||||
| 
						 | 
				
			
			@ -358,4 +350,13 @@ namespace MWRender
 | 
			
		|||
    {
 | 
			
		||||
        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;
 | 
			
		||||
 | 
			
		||||
        float mTimeIdle;
 | 
			
		||||
        int mUpdates;
 | 
			
		||||
 | 
			
		||||
        /// Updates sound manager listener data
 | 
			
		||||
        void updateListener();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -61,6 +58,8 @@ namespace MWRender
 | 
			
		|||
 | 
			
		||||
        void compensateYaw(float diff);
 | 
			
		||||
 | 
			
		||||
        void setLowHeight(bool low = true);
 | 
			
		||||
 | 
			
		||||
    public:
 | 
			
		||||
 | 
			
		||||
        Player (Ogre::Camera *camera, Ogre::SceneNode* mNode);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue