00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00034 #include "../SO3Animation/SO3SequenceAnimation.h"
00035 #include "../SO3Animation/SO3SequenceAnimationTrack.h"
00036 #include "../SO3SceneGraph/SO3Skeleton.h"
00037
00038 namespace SO3
00039 {
00040
00041 SSequenceAnimation::SSequenceAnimation(SScene* scene, std::string animationName, unsigned short id) : SAnim(scene, animationName, 0, id, SAnim::SO3_SEQUENCE_ANIM)
00042 {
00043 ogreAnimation = mScene->GetOgreScenePointer()->createAnimation(animationName, 0.0f);
00044 ogreAnimationState = mScene->GetOgreScenePointer()->createAnimationState(animationName);
00045 mLastPos = 0.0f;
00046 }
00047
00048 SSequenceAnimation::SSequenceAnimation() : SAnim(0, "", 0, 0, SO3_UNKNOWN_ANIM)
00049 {
00050
00051 }
00052
00053 SSequenceAnimation::~SSequenceAnimation()
00054 {
00055 if (mScene->GetOgreScenePointer()->hasAnimationState(name))
00056 mScene->GetOgreScenePointer()->destroyAnimationState(name);
00057 ogreAnimationState = 0;
00058 if (mScene->GetOgreScenePointer()->hasAnimation(name))
00059 mScene->GetOgreScenePointer()->destroyAnimation(name);
00060 }
00061
00062 SAnimTrack* SSequenceAnimation::CreateAnimationTrackImpl(std::string newAnimationTrackName)
00063 {
00064 return new SSequenceAnimationTrack(newAnimationTrackName, this, 0);
00065 }
00066
00067 Ogre::AnimationState* SSequenceAnimation::_GetOgreAnimationState()
00068 {
00069 return ogreAnimationState;
00070 }
00071
00072 void SSequenceAnimation::SetTimePosition(float timePosition)
00073 {
00074 if (_GetOgreAnimationState())
00075 _GetOgreAnimationState()->setTimePosition(timePosition);
00076
00077
00078 if (GetEnable())
00079 {
00080 SAnimTrackList::iterator iAnimationTrack = animationTrackList.begin();
00081 while (iAnimationTrack != animationTrackList.end())
00082 {
00083 (*iAnimationTrack)->Update(timePosition);
00084 iAnimationTrack++;
00085 }
00086
00087
00088 }
00089
00090 mLastPos = timePosition;
00091 }
00092
00093 void SSequenceAnimation::SetEnable(bool enable)
00094 {
00095 if (ogreAnimationState)
00096 ogreAnimationState->setEnabled(enable);
00097
00098 SetPaused(!enable);
00099
00100 const SAnimTrackList animationTrackCopy = animationTrackList;
00101 SAnimTrackList::const_iterator iAnimationTrack = animationTrackCopy.begin();
00102 while (iAnimationTrack != animationTrackCopy.end())
00103 {
00104 static_cast<SSequenceAnimationTrack*>(*iAnimationTrack)->EnableTrackKeys(enable);
00105 iAnimationTrack++;
00106 }
00107 }
00108
00109 void SSequenceAnimation::UpdateAnimationLength()
00110 {
00111 float length = 0.0f;
00112 const SAnimTrackList animationTrackCopy = animationTrackList;
00113 SAnimTrackList::const_iterator iAnimationTrack = animationTrackCopy.begin();
00114 while (iAnimationTrack != animationTrackCopy.end())
00115 {
00116 if (static_cast<SSequenceAnimationTrack*>(*iAnimationTrack)->GetLength() > length)
00117 length = static_cast<SSequenceAnimationTrack*>(*iAnimationTrack)->GetLength();
00118
00119 iAnimationTrack++;
00120 }
00121 SetLength(length);
00122 }
00123
00124
00125 float SSequenceAnimation::GetLastPos()
00126 {
00127 return mLastPos;
00128 }
00129
00130
00131 void SSequenceAnimation::_UpdateImpl(const Ogre::FrameEvent &evt)
00132 {
00133
00134 Ogre::Real maxtime = (evt.timeSinceLastFrame <= 0.016f) ? evt.timeSinceLastFrame : (evt.timeSinceLastFrame * 0.016f / evt.timeSinceLastFrame);
00135
00136 if (SkipFrame())
00137 AddTime((float)evt.timeSinceLastFrame * GetSpeed());
00138 else
00139 AddTime(maxtime * GetSpeed());
00140
00141 float currentPos = GetTimePosition();
00142
00143 SAnimTrackList::iterator iAnimationTrack = animationTrackList.begin();
00144 while (iAnimationTrack != animationTrackList.end())
00145 {
00146 (*iAnimationTrack)->Update(GetTimePosition());
00147 iAnimationTrack++;
00148 }
00149
00150 mLastPos = currentPos;
00151 }
00152
00153 }