1# llimphi-anim23*Read this in English: [README.md](README.md).*
45Máquina de estados de animación, estilo Rive, **clip-agnóstica**.
67Es el escalón sobre el playback lineal: en vez de "reproduce esta animación",
8modela "según estos *inputs*, en qué estado estoy y a cuál transiciono, con
9qué *blend*". Es lo que vuelve una animación *interactiva* (hover, progreso,
10triggers) en lugar de un loop fijo.
1112## Por qué clip-agnóstico1314El núcleo **no sabe de Lottie ni de vello**. Un clip es un `ClipId` (u32)
15con una duración conocida; la máquina secuencia y mezcla clips por id y
16tiempo, y emite un `RenderFrame` que dice *qué* renderizar (clip primario +
17un clip entrante con su mezcla 0..1 durante una transición). El consumidor
18mapea `ClipId → asset` y pinta. Hoy ese consumidor es `llimphi-lottie`;
19mañana puede ser un rig de huesos nativo o un tween de `llimphi-motion` — el
20mismo motor de estados sirve a todos.
2122## Modelo (espejo del de Rive)2324- **Inputs**: `bool`, `number`, `trigger` (los triggers se consumen en cada
25 `advance`).
26- **Estado**: un clip con velocidad y loop, más sus transiciones salientes.
27- **Transición**: destino + condiciones (AND) sobre inputs + duración de
28 blend. Las transiciones *any-state* se evalúan sin importar el estado
29 actual (típico para "fire trigger → ir a X desde donde sea").
30- **Condición**: `bool == v`, `number <cmp> v`, `trigger disparado`, o
31 `clip terminó` (para "cuando la animación acaba, pasa a la siguiente").
3233## Bucle3435El consumidor empuja inputs (`Instance::set_bool` etc.), llama
36`Instance::advance` con el `dt` del frame, y pinta `Instance::render_frame`.
37Encaja directo en el bucle Elm de Llimphi vía `Handle::spawn_periodic`.
3839---
4041Parte de **llimphi** — ver [llimphi](../LEEME.md).
Máquina de estados de animación, estilo Rive, clip-agnóstica.
Es el escalón sobre el playback lineal: en vez de "reproduce esta animación",
modela "según estos inputs, en qué estado estoy y a cuál transiciono, con
qué blend". Es lo que vuelve una animación interactiva (hover, progreso,
triggers) en lugar de un loop fijo.
Por qué clip-agnóstico
El núcleo no sabe de Lottie ni de vello. Un clip es un ClipId (u32)
con una duración conocida; la máquina secuencia y mezcla clips por id y
tiempo, y emite un RenderFrame que dice qué renderizar (clip primario +
un clip entrante con su mezcla 0..1 durante una transición). El consumidor
mapea ClipId → asset y pinta. Hoy ese consumidor es llimphi-lottie;
mañana puede ser un rig de huesos nativo o un tween de llimphi-motion — el
mismo motor de estados sirve a todos.
Modelo (espejo del de Rive)
Inputs: bool, number, trigger (los triggers se consumen en cada
advance).
Estado: un clip con velocidad y loop, más sus transiciones salientes.
Transición: destino + condiciones (AND) sobre inputs + duración de
blend. Las transiciones any-state se evalúan sin importar el estado
actual (típico para "fire trigger → ir a X desde donde sea").
Condición: bool == v, number <cmp> v, trigger disparado, o
clip terminó (para "cuando la animación acaba, pasa a la siguiente").
Bucle
El consumidor empuja inputs (Instance::set_bool etc.), llama
Instance::advance con el dt del frame, y pinta Instance::render_frame.
Encaja directo en el bucle Elm de Llimphi vía Handle::spawn_periodic.