From 3c32385e17f878e72a631d976cf3ae17fb8a6cef Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Wed, 16 Jan 2013 15:00:06 -0800 Subject: [PATCH] Avoid trying to animate things that don't have animations --- apps/openmw/mwmechanics/character.cpp | 7 +++++-- apps/openmw/mwrender/animation.cpp | 17 +++++++++++++++++ apps/openmw/mwrender/animation.hpp | 2 ++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index 5bf468ffbf..47288b0c1e 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -29,7 +29,7 @@ namespace MWMechanics CharacterController::CharacterController(const MWWorld::Ptr &ptr, MWRender::Animation *anim, CharacterState state) : mPtr(ptr), mAnimation(anim), mState(state) { - if(!mAnimation) + if(!mAnimation || mAnimation->getAnimationCount() == 0) return; mAnimation->setController(this); @@ -47,7 +47,7 @@ CharacterController::CharacterController(const MWWorld::Ptr &ptr, MWRender::Anim CharacterController::CharacterController(const CharacterController &rhs) : mPtr(rhs.mPtr), mAnimation(rhs.mAnimation), mState(rhs.mState) { - if(!mAnimation) + if(!mAnimation || mAnimation->getAnimationCount() == 0) return; /* We've been copied. Update the animation with the new controller. */ mAnimation->setController(this); @@ -68,6 +68,9 @@ void CharacterController::markerEvent(const std::string &evt) void CharacterController::setState(CharacterState state) { mState = state; + + if(!mAnimation || mAnimation->getAnimationCount() == 0) + return; switch(mState) { case CharState_Idle: diff --git a/apps/openmw/mwrender/animation.cpp b/apps/openmw/mwrender/animation.cpp index 9784198457..66d64f9d46 100644 --- a/apps/openmw/mwrender/animation.cpp +++ b/apps/openmw/mwrender/animation.cpp @@ -98,6 +98,23 @@ void Animation::createEntityList(Ogre::SceneNode *node, const std::string &model } +int Animation::getAnimationCount() +{ + int num = 0; + if(mEntityList.mSkelBase) + { + Ogre::AnimationStateSet *as = mEntityList.mSkelBase->getAllAnimationStates(); + Ogre::AnimationStateIterator ai = as->getAnimationStateIterator(); + while(ai.hasMoreElements()) + { + num++; + ai.moveNext(); + } + } + return num; +} + + void Animation::setController(MWMechanics::CharacterController *controller) { mController = controller; diff --git a/apps/openmw/mwrender/animation.hpp b/apps/openmw/mwrender/animation.hpp index 43cce0c028..0e5c7e66ee 100644 --- a/apps/openmw/mwrender/animation.hpp +++ b/apps/openmw/mwrender/animation.hpp @@ -66,6 +66,8 @@ public: virtual ~Animation(); void setController(MWMechanics::CharacterController *controller); + int getAnimationCount(); + void playGroup(std::string groupname, int mode, int loops); void skipAnim(); virtual void runAnimation(float timepassed);