/** * Add a segment to the animation's queue. * * @param durationMillis * Time in milliseconds for the entire animation * @param cuePoints * List of relative time points at which to change to the next * segment * @param keyFrames * List of segment values for target */ public void enqueue(int durationMillis, float[] cuePoints, List<AnimationInstance.KeyFrame[]> keyFrames) { enqueue(new AnimationInstance(durationMillis, cuePoints, keyFrames)); }
float scaled_duration = durationMillis / Math.abs(animation.getSpeed()); Collection<OutputDeviceInterface> targets = animation.getTargets(); if (keyFrames.size() == 0 || keyFrames.get(0).length != targets.size()) { throw new IllegalArgumentException("keyFrames length (" + keyFrames.get(0).length Logger.info("Segment={}", Integer.valueOf(segment)); long time = 0; time += animation.getPeriodMs(); long seg_duration = cuePointsMillis[segment] - cuePointsMillis[segment - 1]; while (time < seg_duration) { for (int tgt = 0; tgt < targets.size(); tgt++) { EasingFunction kf_ef = keyFrames.get(segment-1)[tgt].getEasingFunction(); EasingFunction easing_func = kf_ef == null ? animation.getEasingFunction() : kf_ef; tgt_values[tgt] = easing_func.ease(time, begin.getValue(), delta, seg_duration); time += animation.getPeriodMs();