예제 #1
0
        public void Update(float delta)
        {
            delta *= timeScale;
            for (int i = 0; i < tracks.Count; i++)
            {
                TrackEntry current = tracks[i];
                if (current == null)
                {
                    continue;
                }

                float trackDelta = delta * current.timeScale;
                float time       = current.time + trackDelta;
                float endTime    = current.endTime;

                current.time = time;
                if (current.previous != null)
                {
                    current.previous.time += trackDelta;
                    current.mixTime       += trackDelta;
                }

                // Check if completed the animation or a loop iteration.
                if (current.loop
                    ? (current.lastTime % endTime > time % endTime)
                    : (current.lastTime < endTime && time >= endTime))
                {
                    var count = (int)(time / endTime);
                    current.OnComplete(this, i, count);
                    if (Complete != null)
                    {
                        Complete(this, i, count);
                    }
                }

                TrackEntry next = current.next;
                if (next != null)
                {
                    next.time = current.lastTime - next.delay;
                    if (next.time >= 0)
                    {
                        SetCurrent(i, next);
                    }
                }
                else
                {
                    // End non-looping animation when it reaches its end time and there is no next entry.
                    if (!current.loop && current.lastTime >= current.endTime)
                    {
                        ClearTrack(i);
                    }
                }
            }
        }
예제 #2
0
        public void Drain()
        {
            if (drainDisabled)
            {
                return;
            }
            drainDisabled = true;

            var            entries      = this.eventQueueEntries;
            var            entriesItems = entries.Items;
            AnimationState state        = this.state;

            for (int i = 0, n = entries.Count; i < n; i++)
            {
                var        queueEntry = entriesItems[i];
                TrackEntry trackEntry = queueEntry.entry;

                switch (queueEntry.type)
                {
                case EventType.Start:
                    trackEntry.OnStart();
                    state.OnStart(trackEntry);
                    break;

                case EventType.Interrupt:
                    trackEntry.OnInterrupt();
                    state.OnInterrupt(trackEntry);
                    break;

                case EventType.End:
                    trackEntry.OnEnd();
                    state.OnEnd(trackEntry);
                    goto case EventType.Dispose;                     // Fall through. (C#)

                case EventType.Dispose:
                    trackEntry.OnDispose();
                    state.OnDispose(trackEntry);
                    break;

                case EventType.Complete:
                    trackEntry.OnComplete();
                    state.OnComplete(trackEntry);
                    break;

                case EventType.Event:
                    trackEntry.OnEvent(queueEntry.e);
                    state.OnEvent(trackEntry, queueEntry.e);
                    break;
                }
            }
            eventQueueEntries.Clear();

            drainDisabled = false;
        }
예제 #3
0
        internal void Drain()
        {
            if (drainDisabled)
            {
                return;
            }
            drainDisabled = true;
            List <EventQueueEntry> list           = eventQueueEntries;
            AnimationState         animationState = state;

            for (int i = 0; i < list.Count; i++)
            {
                EventQueueEntry eventQueueEntry = list[i];
                TrackEntry      entry           = eventQueueEntry.entry;
                switch (eventQueueEntry.type)
                {
                case EventType.Start:
                    entry.OnStart();
                    animationState.OnStart(entry);
                    break;

                case EventType.Interrupt:
                    entry.OnInterrupt();
                    animationState.OnInterrupt(entry);
                    break;

                case EventType.End:
                    entry.OnEnd();
                    animationState.OnEnd(entry);
                    goto case EventType.Dispose;

                case EventType.Dispose:
                    entry.OnDispose();
                    animationState.OnDispose(entry);
                    trackEntryPool.Free(entry);
                    break;

                case EventType.Complete:
                    entry.OnComplete();
                    animationState.OnComplete(entry);
                    break;

                case EventType.Event:
                    entry.OnEvent(eventQueueEntry.e);
                    animationState.OnEvent(entry, eventQueueEntry.e);
                    break;
                }
            }
            eventQueueEntries.Clear();
            drainDisabled = false;
        }
예제 #4
0
 public void Update(float delta)
 {
     delta *= this.timeScale;
     for (int i = 0; i < this.tracks.Count; i++)
     {
         TrackEntry trackEntry = this.tracks.Items[i];
         if (trackEntry != null)
         {
             float num     = delta * trackEntry.timeScale;
             float num2    = trackEntry.time + num;
             float endTime = trackEntry.endTime;
             trackEntry.time = num2;
             if (trackEntry.previous != null)
             {
                 trackEntry.previous.time += num;
                 trackEntry.mixTime       += num;
             }
             if ((!trackEntry.loop) ? (trackEntry.lastTime < endTime && num2 >= endTime) : (trackEntry.lastTime % endTime > num2 % endTime))
             {
                 int loopCount = (int)(num2 / endTime);
                 trackEntry.OnComplete(this, i, loopCount);
                 if (this.Complete != null)
                 {
                     this.Complete(this, i, loopCount);
                 }
             }
             TrackEntry next = trackEntry.next;
             if (next != null)
             {
                 next.time = trackEntry.lastTime - next.delay;
                 if (next.time >= 0f)
                 {
                     this.SetCurrent(i, next);
                 }
             }
             else if (!trackEntry.loop && trackEntry.lastTime >= trackEntry.endTime)
             {
                 this.ClearTrack(i);
             }
         }
     }
 }
예제 #5
0
        internal void Drain()
        {
            if (!this.drainDisabled)
            {
                this.drainDisabled = true;
                List <EventQueueEntry> eventQueueEntries = this.eventQueueEntries;
                AnimationState         state             = this.state;
                for (int i = 0; i < eventQueueEntries.Count; i++)
                {
                    EventQueueEntry entry  = eventQueueEntries[i];
                    TrackEntry      entry2 = entry.entry;
                    switch (entry.type)
                    {
                    case EventType.Start:
                    {
                        entry2.OnStart();
                        state.OnStart(entry2);
                        continue;
                    }

                    case EventType.Interrupt:
                    {
                        entry2.OnInterrupt();
                        state.OnInterrupt(entry2);
                        continue;
                    }

                    case EventType.End:
                        entry2.OnEnd();
                        state.OnEnd(entry2);
                        break;

                    case EventType.Dispose:
                        break;

                    case EventType.Complete:
                        goto Label_00C3;

                    case EventType.Event:
                        goto Label_00D7;

                    default:
                    {
                        continue;
                    }
                    }
                    entry2.OnDispose();
                    state.OnDispose(entry2);
                    this.trackEntryPool.Free(entry2);
                    continue;
Label_00C3:
                    entry2.OnComplete();
                    state.OnComplete(entry2);
                    continue;
Label_00D7:
                    entry2.OnEvent(entry.e);
                    state.OnEvent(entry2, entry.e);
                }
                this.eventQueueEntries.Clear();
                this.drainDisabled = false;
            }
        }