/// <summary>Set the current animation. Any queued animations are cleared.</summary> public TrackEntry SetAnimation (int trackIndex, Animation animation, bool loop) { TrackEntry entry = new TrackEntry(); entry.animation = animation; entry.loop = loop; entry.time = 0; entry.endTime = animation.Duration; SetCurrent(trackIndex, entry); return entry; }
/// <summary>Adds an animation to be played delay seconds after the current or last queued animation.</summary> /// <param name="delay">May be <= 0 to use duration of previous animation minus any mix duration plus the negative delay.</param> public TrackEntry AddAnimation (int trackIndex, Animation animation, bool loop, float delay) { TrackEntry entry = new TrackEntry(); entry.animation = animation; entry.loop = loop; entry.time = 0; entry.endTime = animation.Duration; TrackEntry last = ExpandToIndex(trackIndex); if (last != null) { while (last.next != null) last = last.next; last.next = entry; } else tracks[trackIndex] = entry; if (delay <= 0) { if (last != null) delay += last.endTime - data.GetMix(last.animation, animation); else delay = 0; } entry.delay = delay; return entry; }
private void SetCurrent (int index, TrackEntry entry) { TrackEntry current = ExpandToIndex(index); if (current != null) { TrackEntry previous = current.previous; current.previous = null; current.OnEnd(this, index); if (End != null) End(this, new StartEndArgs(index)); entry.mixDuration = data.GetMix(current.animation, entry.animation); if (entry.mixDuration > 0) { entry.mixTime = 0; // If a mix is in progress, mix from the closest animation. if (previous != null && current.mixTime / current.mixDuration < 0.5f) entry.previous = previous; else entry.previous = current; } } tracks[index] = entry; entry.OnStart(this, index); if (Start != null) Start(this, new StartEndArgs(index)); }