apply method

bool apply(
  1. Skeleton skeleton
)

Implementation

bool apply(Skeleton skeleton) {
  if (animationsChanged) _animationsChanged();

  final List<Event?> events = this.events;
  final List<TrackEntry?> tracks = this.tracks;
  bool applied = false;

  final int n = tracks.length;
  for (int i = 0; i < n; i++) {
    final TrackEntry? current = tracks[i];
    if (current == null || current.delay > 0) continue;
    applied = true;
    final MixPose currentPose =
        i == 0 ? MixPose.current : MixPose.currentLayered;

    // Apply mixing from entries first.
    double mix = current.alpha;
    if (current.mixingFrom != null) {
      mix *= applyMixingFrom(current, skeleton, currentPose);
    } else if (current.trackTime >= current.trackEnd &&
        current.next == null) {
      mix = 0.0;
    }

    // Apply current entry.
    final double animationLast = current.animationLast,
        animationTime = current.getAnimationTime();
    final int timelineCount = current.animation!.timelines.length;
    final List<Timeline> timelines = current.animation!.timelines;
    if (mix == 1) {
      for (int ii = 0; ii < timelineCount; ii++) {
        timelines[ii].apply(skeleton, animationLast, animationTime, events,
            1.0, MixPose.setup, MixDirection.mixIn);
      }
    } else {
      final Int32List timelineData = Int32List.fromList(current.timelineData);

      final bool firstFrame = current.timelinesRotation.isEmpty;
      if (firstFrame) {
        current.timelinesRotation = ArrayUtils.copyWithNewArraySize(
            current.timelinesRotation, timelineCount << 1, double.infinity);
      }
      final Float32List timelinesRotation =
          Float32List.fromList(current.timelinesRotation);

      for (int ii = 0; ii < timelineCount; ii++) {
        final Timeline timeline = timelines[ii];
        final MixPose pose = timelineData[ii] >= AnimationState.first
            ? MixPose.setup
            : currentPose;
        if (timeline is RotateTimeline) {
          applyRotateTimeline(timeline, skeleton, animationTime, mix, pose,
              timelinesRotation, ii << 1, firstFrame);
        } else {
          timeline.apply(skeleton, animationLast, animationTime, events, mix,
              pose, MixDirection.mixIn);
        }
      }
    }
    queueEvents(current, animationTime);
    events.length = 0;
    current
      ..nextAnimationLast = animationTime
      ..nextTrackLast = current.trackTime;
  }

  queue.drain();
  return applied;
}