From 75131e6a4862d602b5e12a1010bd68467ef86f9b Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Thu, 8 Aug 2013 17:16:24 -0700 Subject: [PATCH] Rebuild the actor after switching between werewolf forms --- apps/openmw/mwrender/npcanimation.cpp | 4 ++++ apps/openmw/mwrender/npcanimation.hpp | 3 +++ apps/openmw/mwrender/renderingmanager.cpp | 18 ++++++++++++++++++ apps/openmw/mwrender/renderingmanager.hpp | 4 ++++ apps/openmw/mwworld/worldimp.cpp | 2 ++ 5 files changed, 31 insertions(+) diff --git a/apps/openmw/mwrender/npcanimation.cpp b/apps/openmw/mwrender/npcanimation.cpp index 28f039cf1..13b5971e2 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 ccc2c9aa0..24205acaf 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 bc5d0ef20..f3e518800 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 8b55d90bf..17cdfff4a 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 caedcc734..3b76beb43 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); } }