Skip to content

Keyframes

Creating a custom keyframe

Extend Keyframe and implement createMenu(), which returns the popup UI shown when the user clicks the keyframe in the editor:

java
public class MyKeyframe extends Keyframe {

    public float myValue;

    public MyKeyframe(int tick, CutsceneLayer layer) {
        super(tick, layer);
    }

    @Override
    public KeyframeMenu<?> createMenu() {
        return new MyKeyframeMenu(this);
    }
}

Implement KeyframeMenu<MyKeyframe> to define the editor UI for this keyframe. You need to implement getContentHeight, renderContent, applyChanges, and initContent.

Interpolating between keyframes

Use findSegment on your layer to get the two keyframes around the current tick, along with Catmull-Rom control points:

java
List<MyKeyframe> sorted = getSortedKeyframes(MyKeyframe.class);
KeyframeSegment<MyKeyframe> seg = findSegment(sorted, tick);

if (seg != null) {
    double t = Interpolation.applyEasing(EasingType.SMOOTH, seg.rawT());
    double value = Interpolation.catmullRom(
        seg.p0().myValue,
        seg.from().myValue,
        seg.to().myValue,
        seg.p3().myValue,
        t
    );
    // apply value
}

Easing

EasingType controls the interpolation curve applied to the normalized t in [0, 1]:

  • LINEAR - constant speed
  • EASE_IN - starts slow, accelerates
  • EASE_OUT - starts fast, decelerates
  • SMOOTH - ease in and out

Interpolation utilities

java
// apply an easing curve to t in [0, 1]
double t2 = Interpolation.applyEasing(EasingType.SMOOTH, t);

// standard lerp
double v = Interpolation.lerp(a, b, t);

// angular lerp (handles 0 to 360 wrap)
double angle = Interpolation.lerpAngle(fromDeg, toDeg, t);

// Catmull-Rom (4 control points)
double v = Interpolation.catmullRom(p0, p1, p2, p3, t);