Ejemplo n.º 1
0
  void AnimationScheduler::update(double time)
  {
    for(auto& pair : mAnimationGroups)
    {
      for(auto& anim : pair.second.mAnimations)
      {

        AnimationQueue& queue = mAnimationQueues[anim.first];
        if(!anim.second.getEnabled() && !isQueued(anim.first, anim.second))
          continue;

        anim.second.update(time);
        if(anim.second.isEnding() || anim.second.hasEnded())
        {
          if(!isQueued(anim.first, anim.second))
            continue;

          // ended limited animation, remove from queue
          queue.pop();
          if(!queue.empty())
          {
            queue.front().start();
          }
          else if(!mCurrentAnimation.empty())
          {
            play(mCurrentAnimation);
          }
        }
      }
    }
  }
void RuntimeStateMachine::postEvent( Object* a_pObject, Event* a_pEvent )
{
    o_error(false, "not implemented");
    if(NOT(isQueued(a_pObject, a_pEvent)))
    {
        //if(a_pObject->testNativeFlags(eNativeFlag_UpdatingStateMachine))
        {
            int32& ptr = *reinterpret_cast<int32*>(reinterpret_cast<byte*>(a_pObject)+m_uiEventQueuePointerOffset);
            o_assert(ptr < eEventQueueSize);
            (*reinterpret_cast<Event***>(reinterpret_cast<byte*>(a_pObject)+m_uiEventQueueOffset))[++ptr] = a_pEvent;
        }
        //else
        {
            dispatchEvent(a_pObject, a_pEvent);
            static_cast<RuntimeTrack*>(m_Tracks[0])->solveTransitions(a_pObject);
        }
    }
}