diff --git a/apps/openmw/mwrender/npcanimation.cpp b/apps/openmw/mwrender/npcanimation.cpp index 28f039cf19..13b5971e2a 100644 --- a/apps/openmw/mwrender/npcanimation.cpp +++ b/apps/openmw/mwrender/npcanimation.cpp @@ -101,7 +101,11 @@ void NpcAnimation::setViewMode(NpcAnimation::ViewMode viewMode) { assert(viewMode != VM_HeadOnly); mViewMode = viewMode; + rebuild(); +} +void NpcAnimation::rebuild() +{ updateNpcBase(); MWBase::Environment::get().getMechanicsManager()->forceStateUpdate(mPtr); diff --git a/apps/openmw/mwrender/npcanimation.hpp b/apps/openmw/mwrender/npcanimation.hpp index ccc2c9aa09..24205acafd 100644 --- a/apps/openmw/mwrender/npcanimation.hpp +++ b/apps/openmw/mwrender/npcanimation.hpp @@ -88,6 +88,9 @@ public: void setViewMode(ViewMode viewMode); void updateParts(bool forceupdate = false); + + /// Rebuilds the NPC, updating their root model, animation sources, and equipment. + void rebuild(); }; } diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index bc5d0ef203..f3e5188005 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -312,6 +312,24 @@ void RenderingManager::updatePlayerPtr(const MWWorld::Ptr &ptr) mCamera->attachTo(ptr); } +void RenderingManager::rebuildPtr(const MWWorld::Ptr &ptr) +{ + NpcAnimation *anim = NULL; + if(ptr.getRefData().getHandle() == "player") + anim = mPlayerAnimation; + else if(MWWorld::Class::get(ptr).isActor()) + anim = dynamic_cast(mActors.getAnimation(ptr)); + if(anim) + { + anim->rebuild(); + if(mCamera->getHandle() == ptr.getRefData().getHandle()) + { + mCamera->attachTo(ptr); + mCamera->setAnimation(anim); + } + } +} + void RenderingManager::update (float duration, bool paused) { MWBase::World *world = MWBase::Environment::get().getWorld(); diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index 8b55d90bfc..17cdfff4ae 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -131,6 +131,10 @@ public: /// Specifies an updated Ptr object for the player (used on cell change). void updatePlayerPtr(const MWWorld::Ptr &ptr); + /// Currently for NPCs only. Rebuilds the NPC, updating their root model, animation sources, + /// and equipment. + void rebuildPtr(const MWWorld::Ptr &ptr); + void update (float duration, bool paused); void setAmbientColour(const Ogre::ColourValue& colour); diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index caedcc734f..3b76beb433 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -1919,6 +1919,8 @@ namespace MWWorld windowManager->unsetForceHide(MWGui::GW_Magic); } } + + mRendering->rebuildPtr(actor); } }