From 0e6e141fd484609ea95c748661e5342ee5dfc8a5 Mon Sep 17 00:00:00 2001 From: greye Date: Fri, 17 Aug 2012 13:23:02 +0400 Subject: [PATCH] camera control related script instructions --- apps/openmw/mwbase/world.hpp | 1 + apps/openmw/mwinput/inputmanagerimp.cpp | 23 +++++++++++++--------- apps/openmw/mwinput/inputmanagerimp.hpp | 3 ++- apps/openmw/mwrender/player.cpp | 24 +++++++++++++++-------- apps/openmw/mwrender/player.hpp | 4 +++- apps/openmw/mwrender/renderingmanager.hpp | 4 ++++ apps/openmw/mwworld/worldimp.hpp | 4 ++++ 7 files changed, 44 insertions(+), 19 deletions(-) diff --git a/apps/openmw/mwbase/world.hpp b/apps/openmw/mwbase/world.hpp index fbc57b487..9c801cbff 100644 --- a/apps/openmw/mwbase/world.hpp +++ b/apps/openmw/mwbase/world.hpp @@ -253,6 +253,7 @@ namespace MWBase virtual void togglePreviewMode(bool enable) = 0; virtual bool toggleVanityMode(bool enable, bool force) = 0; virtual void allowVanityMode(bool allow) = 0; + virtual void togglePlayerLooking(bool enable) = 0; virtual void renderPlayer() = 0; }; diff --git a/apps/openmw/mwinput/inputmanagerimp.cpp b/apps/openmw/mwinput/inputmanagerimp.cpp index 51c77e68e..df0a42996 100644 --- a/apps/openmw/mwinput/inputmanagerimp.cpp +++ b/apps/openmw/mwinput/inputmanagerimp.cpp @@ -443,10 +443,7 @@ private: } else { - // Start mouse-looking again if allowed. - if (mControlSwitch["playerlooking"]) { - mouse->enable(); - } + mouse->enable(); // Disable GUI events guiEvents->enabled = false; @@ -467,16 +464,19 @@ private: } else if (sw == "playerjumping" && !value) { /// \fixme maybe crouching at this time player.setUpDown(0); + } else if (sw == "vanitymode") { + MWBase::Environment::get().getWorld()->allowVanityMode(value); } else if (sw == "playerlooking") { - if (value) { - mouse->enable(); - } else { - mouse->disable(); - } + MWBase::Environment::get().getWorld()->togglePlayerLooking(value); } mControlSwitch[sw] = value; } + bool getControlSwitch(std::string sw) + { + return mControlSwitch[sw]; + } + void togglePOV() { MWBase::Environment::get().getWorld()->togglePOV(); @@ -535,4 +535,9 @@ private: { impl->toggleControlSwitch(sw, value); } + + bool MWInputManager::getControlSwitch(std::string sw) + { + return impl->getControlSwitch(sw); + } } diff --git a/apps/openmw/mwinput/inputmanagerimp.hpp b/apps/openmw/mwinput/inputmanagerimp.hpp index 70436e207..eff2236d4 100644 --- a/apps/openmw/mwinput/inputmanagerimp.hpp +++ b/apps/openmw/mwinput/inputmanagerimp.hpp @@ -60,7 +60,8 @@ namespace MWInput virtual void setDragDrop(bool dragDrop); - virtual void toggleControlSwitch (const std::string& sw, bool value); + void toggleControlSwitch(std::string sw, bool value); + bool getControlSwitch(std::string sw); }; } #endif diff --git a/apps/openmw/mwrender/player.cpp b/apps/openmw/mwrender/player.cpp index f85e949d0..3bbb56907 100644 --- a/apps/openmw/mwrender/player.cpp +++ b/apps/openmw/mwrender/player.cpp @@ -11,7 +11,6 @@ #include "../mwworld/refdata.hpp" #include "npcanimation.hpp" -#include namespace MWRender { @@ -21,6 +20,7 @@ namespace MWRender mCameraNode(mPlayerNode->createChildSceneNode()), mFirstPersonView(true), mPreviewMode(false), + mFreeLook(true), mHeight(128.f), mCameraDistance(300.f), mDistanceAdjusted(false) @@ -49,18 +49,21 @@ namespace MWRender /// \note rotate player on forced vanity if (mVanity.forced) { - float diff = (adjust) ? rot.z : mMainCam.yaw - rot.z; + if (mFreeLook) { + float diff = (adjust) ? rot.z : mMainCam.yaw - rot.z; - mVanity.enabled = false; - rotateCamera(rot, adjust); - mVanity.enabled = true; - - compensateYaw(diff); + mVanity.enabled = false; + rotateCamera(rot, adjust); + mVanity.enabled = true; + compensateYaw(diff); + } trueRot.z = 0.f; } - rotateCamera(trueRot, adjust); + if (mFreeLook || mVanity.enabled || mPreviewMode) { + rotateCamera(trueRot, adjust); + } /// \note if vanity mode is forced by TVM then rotate player return (!mVanity.enabled && !mPreviewMode) || mVanity.forced; @@ -349,4 +352,9 @@ namespace MWRender Ogre::Vector3::UNIT_X); mCameraNode->setOrientation(zr * xr); } + + void Player::togglePlayerLooking(bool enable) + { + mFreeLook = enable; + } } diff --git a/apps/openmw/mwrender/player.hpp b/apps/openmw/mwrender/player.hpp index 3f419889a..5bc32fffe 100644 --- a/apps/openmw/mwrender/player.hpp +++ b/apps/openmw/mwrender/player.hpp @@ -29,12 +29,12 @@ namespace MWRender Ogre::SceneNode *mPlayerNode; Ogre::SceneNode *mCameraNode; - Ogre::SceneNode *mVanityNode; NpcAnimation *mAnimation; bool mFirstPersonView; bool mPreviewMode; + bool mFreeLook; struct { bool enabled, allowed, forced; @@ -106,6 +106,8 @@ namespace MWRender Ogre::Vector3 getPosition(); void getSightAngles(float &pitch, float &yaw); + + void togglePlayerLooking(bool enable); }; } diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index 170083556..17a4d5280 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -72,6 +72,10 @@ class RenderingManager: private RenderingInterface, public Ogre::WindowEventList mPlayer->allowVanityMode(allow); } + virtual void togglePlayerLooking(bool enable) { + mPlayer->togglePlayerLooking(enable); + } + void getPlayerData(Ogre::Vector3 &eyepos, float &pitch, float &yaw); void attachCameraTo(const MWWorld::Ptr &ptr); diff --git a/apps/openmw/mwworld/worldimp.hpp b/apps/openmw/mwworld/worldimp.hpp index 717c43cfa..51216e3a5 100644 --- a/apps/openmw/mwworld/worldimp.hpp +++ b/apps/openmw/mwworld/worldimp.hpp @@ -293,6 +293,10 @@ namespace MWWorld mRendering->allowVanityMode(allow); } + virtual void togglePlayerLooking(bool enable) { + mRendering->togglePlayerLooking(enable); + } + virtual void renderPlayer(); }; }