Files
dusk/.claude/animation.md
T
2026-06-18 14:59:21 -05:00

2.3 KiB

Animation System

Source: src/dusk/animation/

Lightweight keyframe-based value interpolation using fixed-point math throughout.


Easing (animation/easing.h)

easingApply(type, t) applies an easing function to a normalized time value t ∈ [0, FIXED_ONE] and returns the eased value in the same range.

All functions are also callable directly:

fixed_t t = FIXED(0.5f);
fixed_t out = easingApply(EASING_IN_OUT_CUBIC, t);

Available easing types (all in easingtype_t):

Enum value Curve
EASING_LINEAR straight line
EASING_IN_SINE / OUT / IN_OUT sinusoidal
EASING_IN_QUAD / OUT / IN_OUT quadratic
EASING_IN_CUBIC / OUT / IN_OUT cubic
EASING_IN_QUART / OUT / IN_OUT quartic
EASING_IN_BACK / OUT / IN_OUT overshoots slightly

EASING_FUNCTIONS[EASING_COUNT] is a table of easingfn_t function pointers for when you need to pick an easing at runtime without a switch.


Keyframes (animation/keyframe.h)

typedef struct {
  fixed_t time;          // time point this keyframe is at
  fixed_t value;         // output value at this time
  easingtype_t easing;   // easing to apply when interpolating toward the NEXT keyframe
} keyframe_t;

Keyframe arrays should be sorted ascending by time.


Animation (animation/animation.h)

animation_t wraps a keyframe array and provides value lookup:

keyframe_t frames[] = {
  { FIXED(0.0f), FIXED(0.0f), EASING_LINEAR },
  { FIXED(1.0f), FIXED(1.0f), EASING_IN_OUT_CUBIC },
  { FIXED(2.0f), FIXED(0.0f), EASING_LINEAR },
};

animation_t anim;
animationInit(&anim, frames, 3);

fixed_t value = animationGetValue(&anim, FIXED(0.75f));   // interpolated

animationGetValue finds the surrounding keyframes for the given time, computes the local t within that segment, applies the keyframe's easing, and linearly interpolates between the two keyframe values.

The animation does not own the keyframe array — it holds a pointer. Pass a static or long-lived array.


Usage in the engine

Entity animations (entityanim_t) do NOT use this system — they use a simple countdown timer (animTime) and a state enum. The animation_t system is intended for property animation: UI transitions, camera easing, visual effects, anything that needs a time → value curve.