1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-03-03 16:39:41 +00:00

Store the AnimSource in the animation state

This commit is contained in:
Chris Robinson 2013-05-10 15:27:29 -07:00
parent 58efce5008
commit 8a9b0eb5f7
2 changed files with 7 additions and 8 deletions

View file

@ -55,7 +55,6 @@ Animation::Animation(const MWWorld::Ptr &ptr)
, mAnimVelocity(0.0f) , mAnimVelocity(0.0f)
, mAnimSpeedMult(1.0f) , mAnimSpeedMult(1.0f)
{ {
mSource = NULL;
mAnimationValuePtr.bind(OGRE_NEW AnimationValue(this)); mAnimationValuePtr.bind(OGRE_NEW AnimationValue(this));
} }
@ -196,7 +195,6 @@ void Animation::clearAnimSources()
{ {
mStates.clear(); mStates.clear();
mSource = NULL;
mAnimationName.empty(); mAnimationName.empty();
mNonAccumCtrl = NULL; mNonAccumCtrl = NULL;
@ -506,12 +504,12 @@ bool Animation::play(const std::string &groupname, const std::string &start, con
continue; continue;
foundanim = true; foundanim = true;
state.mSource = &*iter;
state.mLoopCount = loops; state.mLoopCount = loops;
state.mPlaying = true; state.mPlaying = true;
mStates[groupname] = state; mStates[groupname] = state;
// FIXME // FIXME
mSource = &*iter;
mAnimationName = groupname; mAnimationName = groupname;
mNonAccumCtrl = nonaccumctrl; mNonAccumCtrl = nonaccumctrl;
@ -592,10 +590,11 @@ Ogre::Vector3 Animation::runAnimation(float duration)
for(size_t i = 0;i < mObjectRoot.mControllers.size();i++) for(size_t i = 0;i < mObjectRoot.mControllers.size();i++)
mObjectRoot.mControllers[i].update(); mObjectRoot.mControllers[i].update();
if(mSource) if(!mAnimationName.empty() && (stateiter=mStates.find(mAnimationName)) != mStates.end())
{ {
for(size_t i = 0;i < mSource->mControllers.size();i++) AnimSource *src = stateiter->second.mSource;
mSource->mControllers[i].update(); for(size_t i = 0;i < src->mControllers.size();i++)
src->mControllers[i].update();
} }
if(mSkelBase) if(mSkelBase)

View file

@ -36,6 +36,7 @@ protected:
typedef std::vector<AnimSource> AnimSourceList; typedef std::vector<AnimSource> AnimSourceList;
struct AnimState { struct AnimState {
AnimSource *mSource;
NifOgre::TextKeyMap::const_iterator mStartKey; NifOgre::TextKeyMap::const_iterator mStartKey;
NifOgre::TextKeyMap::const_iterator mLoopStartKey; NifOgre::TextKeyMap::const_iterator mLoopStartKey;
NifOgre::TextKeyMap::const_iterator mStopKey; NifOgre::TextKeyMap::const_iterator mStopKey;
@ -46,7 +47,7 @@ protected:
bool mPlaying; bool mPlaying;
size_t mLoopCount; size_t mLoopCount;
AnimState() : mTime(0.0f), mPlaying(false), mLoopCount(0) AnimState() : mSource(NULL), mTime(0.0f), mPlaying(false), mLoopCount(0)
{ } { }
}; };
typedef std::map<std::string,AnimState> AnimStateMap; typedef std::map<std::string,AnimState> AnimStateMap;
@ -69,7 +70,6 @@ protected:
AnimStateMap mStates; AnimStateMap mStates;
// Note: One per animation group (lower body, upper body, left arm, etc). // Note: One per animation group (lower body, upper body, left arm, etc).
AnimSource *mSource;
std::string mAnimationName; std::string mAnimationName;
Ogre::SharedPtr<AnimationValue> mAnimationValuePtr; Ogre::SharedPtr<AnimationValue> mAnimationValuePtr;