apply method

  1. @override
void apply(
  1. Skeleton skeleton,
  2. double lastTime,
  3. double time,
  4. List<Event?> events,
  5. double alpha,
  6. MixPose pose,
  7. MixDirection direction
)
override

Implementation

@override
void apply(Skeleton skeleton, double lastTime, double time,
    List<Event?> events, double alpha, MixPose pose, MixDirection direction) {
  final Bone bone = skeleton.bones[boneIndex];
  final Float32List frames = this.frames;
  if (time < frames[0]) {
    if (pose == MixPose.setup) {
      bone
        ..scaleX = bone.data.scaleX
        ..scaleY = bone.data.scaleY;
    } else if (pose == MixPose.current) {
      bone
        ..scaleX += (bone.data.scaleX - bone.scaleX) * alpha
        ..scaleY += (bone.data.scaleY - bone.scaleY) * alpha;
    }
    return;
  }

  double x = 0.0, y = 0.0;
  if (time >= frames[frames.length - TranslateTimeline.entries]) {
    // Time is after last frame.
    x = frames[frames.length + TranslateTimeline.prevX] * bone.data.scaleX;
    y = frames[frames.length + TranslateTimeline.prevY] * bone.data.scaleY;
  } else {
    // Interpolate between the previous frame and the current frame.
    final int frame =
        Animation.binarySearch(frames, time, TranslateTimeline.entries);
    x = frames[frame + TranslateTimeline.prevX];
    y = frames[frame + TranslateTimeline.prevY];
    final double frameTime = frames[frame];
    final double percent = getCurvePercent(
        frame ~/ TranslateTimeline.entries - 1,
        1 -
            (time - frameTime) /
                (frames[frame + TranslateTimeline.prevTime] - frameTime));

    x = (x + (frames[frame + TranslateTimeline.x] - x) * percent) *
        bone.data.scaleX;
    y = (y + (frames[frame + TranslateTimeline.y] - y) * percent) *
        bone.data.scaleY;
  }
  if (alpha == 1) {
    bone
      ..scaleX = x
      ..scaleY = y;
  } else {
    double bx = 0.0, by = 0.0;
    if (pose == MixPose.setup) {
      bx = bone.data.scaleX;
      by = bone.data.scaleY;
    } else {
      bx = bone.scaleX;
      by = bone.scaleY;
    }
    // Mixing out uses sign of setup or current pose, else use sign of key.
    if (direction == MixDirection.mixOut) {
      x = x.abs() * MathUtils.signum(bx);
      y = y.abs() * MathUtils.signum(by);
    } else {
      bx = bx.abs() * MathUtils.signum(x);
      by = by.abs() * MathUtils.signum(y);
    }
    bone
      ..scaleX = bx + (x - bx) * alpha
      ..scaleY = by + (y - by) * alpha;
  }
}