| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- #include "Base.h"
- #include "AnimationController.h"
- #include "Game.h"
- #include "Curve.h"
- namespace gameplay
- {
- AnimationController::AnimationController()
- : _state(IDLE), _animations(NULL)
- {
- }
- AnimationController::~AnimationController()
- {
- destroyAllAnimations();
- }
- Animation* AnimationController::createAnimation(const char* id, AnimationTarget* target, int propertyId, unsigned int keyCount, unsigned long* keyTimes, float* keyValues, Curve::InterpolationType type)
- {
- assert(type != Curve::BEZIER && type != Curve::HERMITE);
- assert(id && keyCount >= 2 && keyTimes && keyValues);
- Animation* animation = getAnimation(id);
- if (animation != NULL)
- return NULL;
- animation = new Animation(id, target, propertyId, keyCount, keyTimes, keyValues, type);
- addAnimation(animation);
- target->addAnimation(animation);
- return animation;
- }
- Animation* AnimationController::createAnimation(const char* id, AnimationTarget* target, int propertyId, unsigned int keyCount, unsigned long* keyTimes, float* keyValues, float* keyInValue, float* keyOutValue, Curve::InterpolationType type)
- {
- assert(id && keyCount >= 2 && keyTimes && keyValues && keyInValue && keyOutValue);
- Animation* animation = getAnimation(id);
- if (animation != NULL)
- return NULL;
-
- animation = new Animation(id, target, propertyId, keyCount, keyTimes, keyValues, keyInValue, keyOutValue, type);
- addAnimation(animation);
- target->addAnimation(animation);
- return animation;
- }
- Animation* AnimationController::createAnimationFromTo(const char* id, AnimationTarget* target, int propertyId, float* from, float* to, Curve::InterpolationType type, unsigned long duration)
- {
- const unsigned int propertyComponentCount = target->getAnimationPropertyComponentCount(propertyId);
- float* keyValues = new float[2 * propertyComponentCount];
- memcpy(keyValues, from, sizeof(float) * propertyComponentCount);
- memcpy(keyValues + propertyComponentCount, to, sizeof(float) * propertyComponentCount);
- unsigned long* keyTimes = new unsigned long[2];
- keyTimes[0] = 0;
- keyTimes[1] = duration;
- Animation* animation = createAnimation(id, target, propertyId, 2, keyTimes, keyValues, type);
- SAFE_DELETE_ARRAY(keyTimes);
-
- return animation;
- }
- Animation* AnimationController::createAnimationFromBy(const char* id, AnimationTarget* target, int propertyId, float* from, float* by, Curve::InterpolationType type, unsigned long duration)
- {
- const unsigned int propertyComponentCount = target->getAnimationPropertyComponentCount(propertyId);
- float* keyValues = new float[2 * propertyComponentCount];
- memcpy(keyValues, from, sizeof(float) * propertyComponentCount);
- memcpy(keyValues + propertyComponentCount, by, sizeof(float) * propertyComponentCount);
- unsigned long* keyTimes = new unsigned long[2];
- keyTimes[0] = 0;
- keyTimes[1] = duration;
- Animation* animation = createAnimation(id, target, propertyId, 2, keyTimes, keyValues, type);
- SAFE_DELETE_ARRAY(keyTimes);
- return animation;
- }
- Animation* AnimationController::getAnimation(const char* id) const
- {
- unsigned int animationCount = _animations.size();
- for (unsigned int i = 0; i < animationCount; i++)
- {
- if (_animations.at(i)->_id.compare(id) == 0)
- {
- return _animations.at(i);
- }
- }
- return NULL;
- }
- void AnimationController::stopAllAnimations()
- {
- std::list<AnimationClip*>::iterator clipIter = _runningClips.begin();
- while (clipIter != _runningClips.end())
- {
- AnimationClip* clip = *clipIter;
- clip->_isPlaying = false;
- clip->onEnd();
- clipIter = _runningClips.erase(clipIter);
- SAFE_RELEASE(clip);
- }
- _runningClips.clear();
- _state = IDLE;
- }
- AnimationController::State AnimationController::getState() const
- {
- return _state;
- }
- void AnimationController::initialize()
- {
- _state = IDLE;
- }
- void AnimationController::finalize()
- {
- _state = PAUSED;
- }
- void AnimationController::resume()
- {
- if (_runningClips.empty())
- _state = IDLE;
- else
- _state = RUNNING;
- }
- void AnimationController::pause()
- {
- _state = PAUSED;
- }
- void AnimationController::schedule(AnimationClip* clip)
- {
- if (_runningClips.empty())
- {
- _state = RUNNING;
- }
-
- if (clip->_isPlaying)
- {
- _runningClips.remove(clip);
- clip->_isPlaying = false;
- clip->onEnd();
- }
- else
- {
- clip->addRef();
- }
- _runningClips.push_back(clip);
- }
- void AnimationController::unschedule(AnimationClip* clip)
- {
- if (clip->_isPlaying)
- {
- _runningClips.remove(clip);
- SAFE_RELEASE(clip);
- }
- if (_runningClips.empty())
- _state = IDLE;
- }
- void AnimationController::update(long elapsedTime)
- {
- if (_state != RUNNING)
- return;
- std::list<AnimationClip*>::iterator clipIter = _runningClips.begin();
- unsigned int clipCount = 0;
- while (clipIter != _runningClips.end())
- {
- AnimationClip* clip = (*clipIter);
- if (clip->update(elapsedTime))
- {
- clipIter = _runningClips.erase(clipIter);
- SAFE_RELEASE(clip);
- }
- else
- {
- clipIter++;
- }
- clipCount++;
- }
-
- if (_runningClips.empty())
- _state = IDLE;
- }
- void AnimationController::addAnimation(Animation* animation)
- {
- _animations.push_back(animation);
- }
- void AnimationController::destroyAnimation(Animation* animation)
- {
- std::vector<Animation*>::iterator itr = _animations.begin();
- while (itr != _animations.end())
- {
- if (animation == *itr)
- {
- _animations.erase(itr);
- return;
- }
- itr++;
- }
- }
- void AnimationController::destroyAllAnimations()
- {
- stopAllAnimations();
- std::vector<Animation*>::iterator itr = _animations.begin();
-
- while (itr != _animations.end())
- {
- Animation* animation = *itr;
- SAFE_RELEASE(animation);
- itr++;
- }
- _animations.clear();
- }
- }
|