update method

void update(
  1. double delta
)

Implementation

void update(double delta) {
  delta *= timeScale;
  final List<TrackEntry?> tracks = this.tracks;

  final int n = tracks.length;
  for (int i = 0; i < n; i++) {
    final TrackEntry? current = tracks[i];
    if (current == null) continue;

    current
      ..animationLast = current.nextAnimationLast
      ..trackLast = current.nextTrackLast;

    double currentDelta = delta * current.timeScale;

    if (current.delay > 0) {
      current.delay = current.delay - currentDelta;
      if (current.delay > 0) continue;
      currentDelta = -current.delay;
      current.delay = 0.0;
    }

    TrackEntry? next = current.next;
    if (next != null) {
      // When the next entry's delay is passed, change to the next entry, preserving leftover time.
      final double nextTime = current.trackLast - next.delay;
      if (nextTime >= 0) {
        next
          ..delay = 0.0
          ..trackTime = nextTime + delta * next.timeScale;
        current.trackTime = current.trackTime + currentDelta;
        setCurrent(i, next, true);
        while (next!.mixingFrom != null) {
          next.mixTime = next.mixTime + currentDelta;
          next = next.mixingFrom;
        }
        continue;
      }
    } else if (current.trackLast >= current.trackEnd &&
        current.mixingFrom == null) {
      tracks[i] = null;
      queue.end(current);
      disposeNext(current);
      continue;
    }
    if (current.mixingFrom != null && updateMixingFrom(current, delta)) {
      // End mixing from entries once all have completed.
      TrackEntry? from = current.mixingFrom;
      current.mixingFrom = null;
      while (from != null) {
        queue.end(from);
        from = from.mixingFrom;
      }
    }

    current.trackTime = current.trackTime + currentDelta;
  }

  queue.drain();
}