apply method
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;
}