From 14f293882cf1f02b9bb0031a7929563a8852fc5b Mon Sep 17 00:00:00 2001 From: greye Date: Fri, 17 Aug 2012 16:42:42 +0400 Subject: [PATCH 1/2] still resolving --- apps/openmw/mwinput/inputmanagerimp.cpp | 14 +++++++++----- apps/openmw/mwinput/inputmanagerimp.hpp | 3 +++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/apps/openmw/mwinput/inputmanagerimp.cpp b/apps/openmw/mwinput/inputmanagerimp.cpp index 91ef6722c6..292e4c2e95 100644 --- a/apps/openmw/mwinput/inputmanagerimp.cpp +++ b/apps/openmw/mwinput/inputmanagerimp.cpp @@ -45,6 +45,7 @@ namespace MWInput , mUISensitivity (Settings::Manager::getFloat("ui sensitivity", "Input")) , mCameraYMultiplier (Settings::Manager::getFloat("camera y multiplier", "Input")) , mUIYMultiplier (Settings::Manager::getFloat("ui y multiplier", "Input")) + , mPreviewPOVDelay(0.f) { Ogre::RenderWindow* window = ogre.getWindow (); size_t windowHnd; @@ -243,12 +244,12 @@ namespace MWInput else if (actionIsActive(A_Crouch)) mPlayer.setUpDown (-1); else - player.setUpDown (0); + mPlayer.setUpDown (0); if (mControlSwitch["playerviewswitch"]) { - if (poller.isDown(A_TogglePOV)) { + if (actionIsActive(A_TogglePOV)) { if (mPreviewPOVDelay <= 0.5 && - (mPreviewPOVDelay += duration) > 0.5) + (mPreviewPOVDelay += dt) > 0.5) { mPreviewPOVDelay = 1.f; MWBase::Environment::get().getWorld()->togglePreviewMode(true); @@ -258,7 +259,7 @@ namespace MWInput //disable preview mode MWBase::Environment::get().getWorld()->togglePreviewMode(false); } else if (mPreviewPOVDelay > 0.f) { - togglePOV(); + MWBase::Environment::get().getWorld()->togglePOV(); } mPreviewPOVDelay = 0.f; } @@ -329,7 +330,7 @@ namespace MWInput mPlayer.setUpDown(0); } else if (sw == "playerjumping" && !value) { /// \fixme maybe crouching at this time - player.setUpDown(0); + mPlayer.setUpDown(0); } else if (sw == "vanitymode") { MWBase::Environment::get().getWorld()->allowVanityMode(value); } else if (sw == "playerlooking") { @@ -552,6 +553,7 @@ namespace MWInput defaultKeyBindings[A_Journal] = OIS::KC_J; defaultKeyBindings[A_Rest] = OIS::KC_T; defaultKeyBindings[A_GameMenu] = OIS::KC_ESCAPE; + defaultKeyBindings[A_TogglePOV] = OIS::KC_TAB; std::map defaultMouseButtonBindings; defaultMouseButtonBindings[A_Inventory] = OIS::MB_Right; @@ -601,6 +603,7 @@ namespace MWInput descriptions[A_Journal] = "sJournal"; descriptions[A_Rest] = "sRestKey"; descriptions[A_Inventory] = "sInventory"; + descriptions[A_TogglePOV] = "Toggle POV"; if (descriptions[action] == "") return ""; // not configurable @@ -631,6 +634,7 @@ namespace MWInput ret.push_back(A_MoveLeft); ret.push_back(A_MoveRight); ret.push_back(A_Crouch); + ret.push_back(A_TogglePOV); ret.push_back(A_Activate); ret.push_back(A_ToggleWeapon); ret.push_back(A_ToggleSpell); diff --git a/apps/openmw/mwinput/inputmanagerimp.hpp b/apps/openmw/mwinput/inputmanagerimp.hpp index 72d0b5d678..d199344a33 100644 --- a/apps/openmw/mwinput/inputmanagerimp.hpp +++ b/apps/openmw/mwinput/inputmanagerimp.hpp @@ -139,6 +139,7 @@ namespace MWInput float mUISensitivity; float mCameraYMultiplier; float mUIYMultiplier; + float mPreviewPOVDelay; bool mMouseLookEnabled; bool mGuiCursorEnabled; @@ -207,6 +208,8 @@ namespace MWInput A_ToggleWalk, //Toggle Walking/Running A_Crouch, + A_TogglePOV, + A_QuickSave, A_QuickLoad, A_QuickMenu, From b8e56d61d3592d8304699dc7d1ded378eeb76220 Mon Sep 17 00:00:00 2001 From: greye Date: Sat, 18 Aug 2012 01:31:57 +0400 Subject: [PATCH 2/2] update camera code, add idle time --- apps/openmw/mwinput/inputmanagerimp.cpp | 40 +++++++++++++++++++++++++ apps/openmw/mwinput/inputmanagerimp.hpp | 6 ++-- apps/openmw/mwrender/player.cpp | 32 ++++++++++---------- apps/openmw/mwrender/player.hpp | 5 ++-- 4 files changed, 63 insertions(+), 20 deletions(-) diff --git a/apps/openmw/mwinput/inputmanagerimp.cpp b/apps/openmw/mwinput/inputmanagerimp.cpp index 292e4c2e95..e4522e593e 100644 --- a/apps/openmw/mwinput/inputmanagerimp.cpp +++ b/apps/openmw/mwinput/inputmanagerimp.cpp @@ -46,6 +46,7 @@ namespace MWInput , mCameraYMultiplier (Settings::Manager::getFloat("camera y multiplier", "Input")) , mUIYMultiplier (Settings::Manager::getFloat("ui y multiplier", "Input")) , mPreviewPOVDelay(0.f) + , mTimeIdle(0.f) { Ogre::RenderWindow* window = ogre.getWindow (); size_t windowHnd; @@ -164,24 +165,30 @@ namespace MWInput toggleConsole (); break; case A_Activate: + resetIdleTime(); activate(); break; case A_Journal: toggleJournal (); break; case A_AutoMove: + resetIdleTime(); toggleAutoMove (); break; case A_ToggleSneak: /// \todo implement + resetIdleTime(); break; case A_ToggleWalk: + resetIdleTime(); toggleWalking (); break; case A_ToggleWeapon: + resetIdleTime(); toggleWeapon (); break; case A_ToggleSpell: + resetIdleTime(); toggleSpell (); break; } @@ -265,6 +272,18 @@ namespace MWInput } } } + if (actionIsActive(A_MoveForward) || + actionIsActive(A_MoveBackward) || + actionIsActive(A_MoveLeft) || + actionIsActive(A_MoveRight) || + actionIsActive(A_Jump) || + actionIsActive(A_Crouch) || + actionIsActive(A_TogglePOV)) + { + resetIdleTime(); + } else { + updateIdleTime(dt); + } } void InputManager::setDragDrop(bool dragDrop) @@ -402,6 +421,8 @@ namespace MWInput if (mMouseLookEnabled) { + resetIdleTime(); + float x = arg.state.X.rel * mCameraSensitivity * 0.2; float y = arg.state.Y.rel * mCameraSensitivity * 0.2 * (mInvertY ? -1 : 1) * mUIYMultiplier; @@ -528,6 +549,25 @@ namespace MWInput Ogre::Root::getSingleton().queueEndRendering (); } + void InputManager::resetIdleTime() + { + if (mTimeIdle < 0) { + MWBase::Environment::get().getWorld()->toggleVanityMode(false, false); + } + mTimeIdle = 0.f; + } + + void InputManager::updateIdleTime(float dt) + { + if (mTimeIdle >= 0.f) { + mTimeIdle += dt; + } + if (mTimeIdle > 30.f) { + MWBase::Environment::get().getWorld()->toggleVanityMode(true, false); + mTimeIdle = -1.f; + } + } + bool InputManager::actionIsActive (int id) { return mInputCtrl->getChannel (id)->getValue () == 1; diff --git a/apps/openmw/mwinput/inputmanagerimp.hpp b/apps/openmw/mwinput/inputmanagerimp.hpp index d199344a33..d1fb472c94 100644 --- a/apps/openmw/mwinput/inputmanagerimp.hpp +++ b/apps/openmw/mwinput/inputmanagerimp.hpp @@ -83,7 +83,6 @@ namespace MWInput virtual void enableDetectingBindingMode (int action); virtual void resetToDefaultBindings(); - public: virtual bool keyPressed( const OIS::KeyEvent &arg ); virtual bool keyReleased( const OIS::KeyEvent &arg ); @@ -140,6 +139,7 @@ namespace MWInput float mCameraYMultiplier; float mUIYMultiplier; float mPreviewPOVDelay; + float mTimeIdle; bool mMouseLookEnabled; bool mGuiCursorEnabled; @@ -149,10 +149,12 @@ namespace MWInput std::map mControlSwitch; - private: void adjustMouseRegion(int width, int height); + void resetIdleTime(); + void updateIdleTime(float dt); + private: void toggleMainMenu(); void toggleSpell(); diff --git a/apps/openmw/mwrender/player.cpp b/apps/openmw/mwrender/player.cpp index 3bbb569076..98cb1695e2 100644 --- a/apps/openmw/mwrender/player.cpp +++ b/apps/openmw/mwrender/player.cpp @@ -2,7 +2,6 @@ #include #include -#include #include "../mwbase/environment.hpp" #include "../mwbase/soundmanager.hpp" @@ -38,9 +37,6 @@ namespace MWRender bool Player::rotate(const Ogre::Vector3 &rot, bool adjust) { - mUpdates = 0; - mTimeIdle = 0.f; - if (mVanity.enabled) { toggleVanityMode(false); } @@ -120,13 +116,6 @@ namespace MWRender void Player::update(float duration) { Ogre::Vector3 pos = mPlayerNode->getPosition(); - if (!mVanity.enabled) { - ++mUpdates; - mTimeIdle += duration; - if (mTimeIdle > 30.f) { - toggleVanityMode(true); - } - } if (mAnimation) { mAnimation->runAnimation(duration); } @@ -145,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); } @@ -176,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); @@ -201,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); @@ -357,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); + } + } } diff --git a/apps/openmw/mwrender/player.hpp b/apps/openmw/mwrender/player.hpp index 5bc32fffe0..8dd313b7fa 100644 --- a/apps/openmw/mwrender/player.hpp +++ b/apps/openmw/mwrender/player.hpp @@ -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);