diff --git a/apps/openmw/mwrender/animation.cpp b/apps/openmw/mwrender/animation.cpp index 286da2bc13..2d3b5942d0 100644 --- a/apps/openmw/mwrender/animation.cpp +++ b/apps/openmw/mwrender/animation.cpp @@ -45,6 +45,7 @@ void Animation::destroyObjectList(Ogre::SceneManager *sceneMgr, NifOgre::ObjectL Animation::Animation(const MWWorld::Ptr &ptr) : mPtr(ptr) + , mCamera(NULL) , mInsert(NULL) , mSkelBase(NULL) , mAccumRoot(NULL) diff --git a/apps/openmw/mwrender/animation.hpp b/apps/openmw/mwrender/animation.hpp index 9fd4a606c6..050aa925ae 100644 --- a/apps/openmw/mwrender/animation.hpp +++ b/apps/openmw/mwrender/animation.hpp @@ -11,6 +11,7 @@ namespace MWRender { +class Camera; class Animation { @@ -80,6 +81,7 @@ protected: typedef std::map AnimStateMap; MWWorld::Ptr mPtr; + Camera *mCamera; Ogre::SceneNode *mInsert; Ogre::Entity *mSkelBase; @@ -210,6 +212,9 @@ public: virtual void showWeapons(bool showWeapon); + void setCamera(Camera *cam) + { mCamera = cam; } + Ogre::Node *getNode(const std::string &name); }; diff --git a/apps/openmw/mwrender/camera.cpp b/apps/openmw/mwrender/camera.cpp index e71e694f96..42c78f7531 100644 --- a/apps/openmw/mwrender/camera.cpp +++ b/apps/openmw/mwrender/camera.cpp @@ -283,10 +283,14 @@ namespace MWRender // If we're switching to a new NpcAnimation, ensure the old one is // using a normal view mode if(mAnimation && mAnimation != anim) + { mAnimation->setViewMode(NpcAnimation::VM_Normal); + mAnimation->setCamera(NULL); + } mAnimation = anim; mAnimation->setViewMode(isFirstPerson() ? NpcAnimation::VM_FirstPerson : NpcAnimation::VM_Normal); + mAnimation->setCamera(this); } void Camera::setHeight(float height) diff --git a/apps/openmw/mwrender/npcanimation.cpp b/apps/openmw/mwrender/npcanimation.cpp index b905a8bdce..dbefb8b3c5 100644 --- a/apps/openmw/mwrender/npcanimation.cpp +++ b/apps/openmw/mwrender/npcanimation.cpp @@ -14,6 +14,7 @@ #include "../mwbase/mechanicsmanager.hpp" #include "renderconst.hpp" +#include "camera.hpp" namespace MWRender @@ -415,6 +416,13 @@ Ogre::Vector3 NpcAnimation::runAnimation(float timepassed) Ogre::Vector3 ret = Animation::runAnimation(timepassed); Ogre::SkeletonInstance *baseinst = mSkelBase->getSkeleton(); + if(mViewMode == VM_FirstPerson && mCamera) + { + float pitch = mCamera->getPitch(); + Ogre::Node *node = baseinst->getBone("Bip01 Neck"); + node->pitch(Ogre::Radian(pitch*0.75f), Ogre::Node::TS_WORLD); + } + for(size_t i = 0;i < sPartListSize;i++) { Ogre::Entity *ent = mObjectParts[i].mSkelBase;