subclip static method

AnimationClip subclip(
  1. AnimationClip sourceClip,
  2. String name,
  3. int startFrame,
  4. int endFrame, {
  5. int fps = 30,
})

Creates a new clip, containing only the segment of the original clip between the given frames.

Implementation

static AnimationClip subclip(AnimationClip sourceClip, String name, int startFrame, int endFrame, {int fps = 30}) {
  final clip = sourceClip.clone();

  clip.name = name;

  final List<KeyframeTrack> tracks = [];

  for (int i = 0; i < clip.tracks.length; ++i) {
    final track = clip.tracks[i];
    final valueSize = track.getValueSize();

    final List<num> times = [];
    final List<num> values = [];

    for (int j = 0; j < track.times.length; ++j) {
      final frame = track.times[j] * fps;

      if (frame < startFrame || frame >= endFrame) continue;

      times.add(track.times[j]);

      for (int k = 0; k < valueSize; ++k) {
        values.add(track.values[j * valueSize + k]);
      }
    }

    if (times.isEmpty) continue;

    track.times = times;//AnimationUtils.convertArray(times, track.times.runtimeType.toString());
    track.values = values;//AnimationUtils.convertArray(values, track.values.runtimeType.toString());

    tracks.add(track);
  }

  clip.tracks = tracks;

  // find minimum .times value across all tracks in the trimmed clip

  double minStartTime = double.infinity;

  for (int i = 0; i < clip.tracks.length; ++i) {
    if (minStartTime > clip.tracks[i].times[0]) {
      minStartTime = clip.tracks[i].times[0].toDouble();
    }
  }

  // shift all tracks such that clip begins at t=0

  for (int i = 0; i < clip.tracks.length; ++i) {
    clip.tracks[i].shift(-1 * minStartTime);
  }

  clip.resetDuration();

  return clip;
}