From 852aa214cc6562c6f259277fa350f99be8167906 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Wed, 16 Jan 2013 21:16:22 -0800 Subject: [PATCH] Store the available animation names in the character controller --- apps/openmw/mwmechanics/character.cpp | 16 ++++++++++------ apps/openmw/mwmechanics/character.hpp | 2 ++ apps/openmw/mwrender/animation.cpp | 11 ++++------- apps/openmw/mwrender/animation.hpp | 2 +- 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index 8786c42e1..c347312c2 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -32,10 +32,13 @@ namespace MWMechanics CharacterController::CharacterController(const MWWorld::Ptr &ptr, MWRender::Animation *anim, CharacterState state) : mPtr(ptr), mAnimation(anim), mState(state) { - if(mAnimation && mAnimation->getAnimationCount() == 0) + if(mAnimation) + mAnimNames = mAnimation->getAnimationNames(); + if(mAnimNames.size() == 0) + { mAnimation = NULL; - if(!mAnimation) return; + } mAnimation->setController(this); switch(mState) @@ -52,9 +55,10 @@ CharacterController::CharacterController(const MWWorld::Ptr &ptr, MWRender::Anim } CharacterController::CharacterController(const CharacterController &rhs) - : mPtr(rhs.mPtr), mAnimation(rhs.mAnimation), mState(rhs.mState) + : mPtr(rhs.mPtr), mAnimation(rhs.mAnimation), mAnimNames(rhs.mAnimNames) + , mState(rhs.mState) { - if(!mAnimation) + if(mAnimNames.size() == 0) return; /* We've been copied. Update the animation with the new controller. */ mAnimation->setController(this); @@ -82,7 +86,7 @@ Ogre::Vector3 CharacterController::update(float duration) void CharacterController::playGroup(const std::string &groupname, int mode, int count) { // set mState = CharState_Idle? - if(mAnimation) + if(std::find(mAnimNames.begin(), mAnimNames.end(), groupname) != mAnimNames.end()) mAnimation->playGroup(groupname, mode, count); } @@ -97,7 +101,7 @@ void CharacterController::setState(CharacterState state) { mState = state; - if(!mAnimation) + if(mAnimNames.size() == 0) return; switch(mState) { diff --git a/apps/openmw/mwmechanics/character.hpp b/apps/openmw/mwmechanics/character.hpp index 9070cbe29..c29c39acd 100644 --- a/apps/openmw/mwmechanics/character.hpp +++ b/apps/openmw/mwmechanics/character.hpp @@ -21,6 +21,8 @@ class CharacterController MWWorld::Ptr mPtr; MWRender::Animation *mAnimation; + std::vector mAnimNames; + std::string mCurrentGroup; CharacterState mState; diff --git a/apps/openmw/mwrender/animation.cpp b/apps/openmw/mwrender/animation.cpp index 30532b624..1d628aefa 100644 --- a/apps/openmw/mwrender/animation.cpp +++ b/apps/openmw/mwrender/animation.cpp @@ -98,20 +98,17 @@ void Animation::createEntityList(Ogre::SceneNode *node, const std::string &model } -int Animation::getAnimationCount() +std::vector Animation::getAnimationNames() { - int num = 0; + std::vector anims; if(mEntityList.mSkelBase) { Ogre::AnimationStateSet *as = mEntityList.mSkelBase->getAllAnimationStates(); Ogre::AnimationStateIterator ai = as->getAnimationStateIterator(); while(ai.hasMoreElements()) - { - num++; - ai.moveNext(); - } + anims.push_back(ai.getNext()->getAnimationName()); } - return num; + return anims; } diff --git a/apps/openmw/mwrender/animation.hpp b/apps/openmw/mwrender/animation.hpp index 0e5c7e66e..3afe32a4b 100644 --- a/apps/openmw/mwrender/animation.hpp +++ b/apps/openmw/mwrender/animation.hpp @@ -66,7 +66,7 @@ public: virtual ~Animation(); void setController(MWMechanics::CharacterController *controller); - int getAnimationCount(); + std::vector getAnimationNames(); void playGroup(std::string groupname, int mode, int loops); void skipAnim();