Animation Rework #97

Closed
opened 2026-09-16 19:20:38 +02:00 by admin · 2 comments

Anstelle vom jetzigen Animationssystem sollte man nicht einfach nur Sprites/Frames reindroppen können, sondern man hat eine komplette Timeline.

Add Button öffnet einen Dialog:

  • Dort kann man Zeilen hinzufügen: man wählt ein asset aus.
  • Ist das asset eine scene/container gibt es ein weiteres dropdown wo man ein object der ausgewählten scene/container auswählen kann (gleicher/ähnlicher selector wie bei scene object parent auswahl). ist aber optional, ansonsten gilt das asset selbst ohne child.
  • Dann gibt es ein weiteres dropdown bei dem man von der aktuellen auswahl (asset + optionalen child) ein property auswählen kann

somit gibt es eine zeile in der man keyframes setzen kann. interpolation ist vorerst linear. man kann pro frame ein keyframe setzen.

Stelle so viele Fragen wie möglich bevor wir loslegen.

Anstelle vom jetzigen Animationssystem sollte man nicht einfach nur Sprites/Frames reindroppen können, sondern man hat eine komplette Timeline. Add Button öffnet einen Dialog: - Dort kann man Zeilen hinzufügen: man wählt ein asset aus. - Ist das asset eine scene/container gibt es ein weiteres dropdown wo man ein object der ausgewählten scene/container auswählen kann (gleicher/ähnlicher selector wie bei scene object parent auswahl). ist aber optional, ansonsten gilt das asset selbst ohne child. - Dann gibt es ein weiteres dropdown bei dem man von der aktuellen auswahl (asset + optionalen child) ein property auswählen kann somit gibt es eine zeile in der man keyframes setzen kann. interpolation ist vorerst linear. man kann pro frame ein keyframe setzen. Stelle so viele Fragen wie möglich bevor wir loslegen.
admin added this to the Development project 2026-09-16 19:20:38 +02:00
admin moved this to Next in Development on 2026-09-16 19:20:40 +02:00
Owner

Entscheidungen aus der Planung (2026-09-16)

Fragenkatalog im Chat beantwortet, hier festgehalten, damit die Begründungen beim Issue stehen.

A · Grundmodell

  1. Ersetzt das bisherige Bildfolge-System. Die Bildfolge wird eine Zeile auf texture, deren Keys springen.
  2. Ein Wurzel-Asset je Animation (Sprite, Text, Container, Scene). Jede Zeile zielt auf die Wurzel selbst oder ein Objekt darin. Abgespielt wird auf einem Objekt; jede Instanz spielt unabhängig.
  3. Nodes Play animation, Stop animation, Pause animation; On animation finished bleibt. Kein Autoplay.
  4. Die Länge ergibt sich aus dem letzten Key (über alle Zeilen); der letzte Key zählt selbst als Frame (Keys auf 0–9 = 10 Frames). Eine Pause am Ende ist ein letzter Key mit demselben Wert.
  5. fps und playback bleiben. Keys liegen auf ganzen Frames, abgespielt wird zwischen den Frames interpoliert — 10 fps heißt 10 Frames = 1 s und läuft trotzdem flüssig.

B · Zeilen und Properties

  1. v1: Schema-Properties von Objekten (Transform, color, texture, enabled, …). Behavior-Variablen und Shader-Parameter später.
  2. Nicht überblendbare Werte (Boolean, Text, Texture, Choice) sind erlaubt und springen; der Wert hält bis zum nächsten Key.
  3. Farbe: linear über RGB.
  4. Rotation: wie eine normale Zahl (350 → 10 läuft rückwärts über 340°), damit volle Umdrehungen möglich bleiben.
  5. Kindauswahl über den ganzen Baum; der Inhalt eines platzierten Containers in einer Scene nicht in v1.
  6. Ziel + Property höchstens einmal je Animation.
  7. Gelöschtes Ziel: Zeile bleibt als „missing“, Keys bleiben, beim Abspielen übersprungen.

C · Werte zur Laufzeit

  1. Vor dem ersten / nach dem letzten Key gilt der erste / letzte Wert; ein einzelner Key ist konstant.
  2. Absolut, mit Schalter „relativ“ pro Zeile (Versatz zum Wert beim Start).
  3. Nach Stop/Ende bleibt der letzte Wert stehen (Once (hold)); zusätzlich Once (reset), das zum Ausgangswert zurückspringt.
  4. Setzt ein Behavior dieselbe Property, gewinnt das Behavior (es schreibt im Frame zuletzt).
  5. Mehrere Animationen gleichzeitig erlaubt; bei gleicher Property gewinnt die zuletzt gestartete.

D · Editor

  1. Vorschau des Wurzel-Assets im Animation-Tab, darunter die Timeline.
  2. Doppelklick in eine Zelle setzt einen Key mit dem dort geltenden Wert; Wert im Inspector bei ausgewähltem Key. Kein Aufnahme-Modus.
  3. v1: auswählen, Gummiband, verschieben, löschen, Undo. Kopieren/Einfügen später.
  4. Playhead zum Scrubben, Play/Pause, horizontaler Zoom. Kein Loop-Bereich.
  5. Ziel einer Zeile nachträglich änderbar (Keys bleiben), nur auf eine Property derselben Art.
  6. Nichts einklappen: jede Zeile eine Zeile, kein Gruppieren.
  7. Keine Kurvenansicht in v1.

E · Umfang

  1. Interpolation pro Key als optionales Feld im Format (fehlt = linear).
  2. Keine Events auf der Timeline in v1 (eigenes Issue).
  3. Drei Teile nacheinander: (a) Modell + Laufzeit + Nodes, (b) Timeline-Editor, (c) Vorschau im Tab. Je Teil nur Gate + Unit-Tests, keine vollen e2e; committen, Push erst zum Schluss.

Stand

Teil (a) ist gebaut (193378e, lokal, nicht gepusht): Modell mit Wurzel-Asset, Zeilen und Keys; Kommandos mit Undo (Wurzel, Zeile anlegen/entfernen/umhängen, relativ, Key setzen/verschieben/löschen); Player am Objekt; die drei Nodes; alter Weg „Sprite trägt Animation über texture“ entfernt. tests/core/animation.test.ts neu mit 26 Tests, Gate 1149 grün.

Zwei Punkte dabei selbst entschieden: die eigenen Properties einer Scene (backgroundColor) sind in v1 nicht animierbar, nur ihre Objekte; die drei Play-Nodes brauchen ein verbundenes object wie Destroy/Emit.

Noch offen vor dem Push: der Animation-Tab ist ein Platzhalter (→ Teil b), das Actor-Demo (seed-actor/smoke-actor) baut noch auf dem alten Modell auf und wird mit (b) auf Play animation umgestellt, e2e-Modul 25 ist auf einen Kurz-Check reduziert.

## Entscheidungen aus der Planung (2026-09-16) Fragenkatalog im Chat beantwortet, hier festgehalten, damit die Begründungen beim Issue stehen. ### A · Grundmodell 1. **Ersetzt** das bisherige Bildfolge-System. Die Bildfolge wird eine Zeile auf `texture`, deren Keys springen. 2. **Ein Wurzel-Asset je Animation** (Sprite, Text, Container, Scene). Jede Zeile zielt auf die Wurzel selbst oder ein Objekt darin. Abgespielt wird auf einem Objekt; jede Instanz spielt unabhängig. 3. Nodes `Play animation`, `Stop animation`, `Pause animation`; `On animation finished` bleibt. **Kein Autoplay.** 4. **Die Länge ergibt sich aus dem letzten Key** (über alle Zeilen); der letzte Key zählt selbst als Frame (Keys auf 0–9 = 10 Frames). Eine Pause am Ende ist ein letzter Key mit demselben Wert. 5. `fps` und `playback` bleiben. Keys liegen auf ganzen Frames, **abgespielt wird zwischen den Frames interpoliert** — 10 fps heißt 10 Frames = 1 s und läuft trotzdem flüssig. ### B · Zeilen und Properties 6. v1: Schema-Properties von Objekten (Transform, `color`, `texture`, `enabled`, …). Behavior-Variablen und Shader-Parameter später. 7. Nicht überblendbare Werte (Boolean, Text, Texture, Choice) sind erlaubt und **springen**; der Wert hält bis zum nächsten Key. 8. Farbe: linear über RGB. 9. Rotation: wie eine normale Zahl (350 → 10 läuft rückwärts über 340°), damit volle Umdrehungen möglich bleiben. 10. Kindauswahl über den ganzen Baum; der Inhalt eines *platzierten* Containers in einer Scene nicht in v1. 11. Ziel + Property höchstens einmal je Animation. 12. Gelöschtes Ziel: Zeile bleibt als „missing“, Keys bleiben, beim Abspielen übersprungen. ### C · Werte zur Laufzeit 13. Vor dem ersten / nach dem letzten Key gilt der erste / letzte Wert; ein einzelner Key ist konstant. 14. Absolut, **mit Schalter „relativ“ pro Zeile** (Versatz zum Wert beim Start). 15. Nach Stop/Ende bleibt der letzte Wert stehen (`Once (hold)`); **zusätzlich `Once (reset)`**, das zum Ausgangswert zurückspringt. 16. Setzt ein Behavior dieselbe Property, gewinnt das Behavior (es schreibt im Frame zuletzt). 17. Mehrere Animationen gleichzeitig erlaubt; bei gleicher Property gewinnt die zuletzt gestartete. ### D · Editor 18. Vorschau des Wurzel-Assets im Animation-Tab, darunter die Timeline. 19. **Doppelklick** in eine Zelle setzt einen Key mit dem dort geltenden Wert; Wert im Inspector bei ausgewähltem Key. Kein Aufnahme-Modus. 20. v1: auswählen, Gummiband, verschieben, löschen, Undo. Kopieren/Einfügen später. 21. Playhead zum Scrubben, Play/Pause, horizontaler Zoom. Kein Loop-Bereich. 22. Ziel einer Zeile nachträglich änderbar (Keys bleiben), nur auf eine Property derselben Art. 23. **Nichts einklappen: jede Zeile eine Zeile**, kein Gruppieren. 24. Keine Kurvenansicht in v1. ### E · Umfang 25. Interpolation pro Key als optionales Feld im Format (fehlt = linear). 26. Keine Events auf der Timeline in v1 (eigenes Issue). 27. Drei Teile nacheinander: **(a)** Modell + Laufzeit + Nodes, **(b)** Timeline-Editor, **(c)** Vorschau im Tab. Je Teil nur Gate + Unit-Tests, keine vollen e2e; committen, Push erst zum Schluss. ### Stand **Teil (a) ist gebaut** (`193378e`, lokal, nicht gepusht): Modell mit Wurzel-Asset, Zeilen und Keys; Kommandos mit Undo (Wurzel, Zeile anlegen/entfernen/umhängen, relativ, Key setzen/verschieben/löschen); Player am Objekt; die drei Nodes; alter Weg „Sprite trägt Animation über `texture`“ entfernt. `tests/core/animation.test.ts` neu mit 26 Tests, Gate 1149 grün. Zwei Punkte dabei selbst entschieden: die eigenen Properties einer Scene (`backgroundColor`) sind in v1 nicht animierbar, nur ihre Objekte; die drei Play-Nodes brauchen ein verbundenes `object` wie `Destroy`/`Emit`. Noch offen vor dem Push: der Animation-Tab ist ein Platzhalter (→ Teil b), das Actor-Demo (`seed-actor`/`smoke-actor`) baut noch auf dem alten Modell auf und wird mit (b) auf `Play animation` umgestellt, e2e-Modul 25 ist auf einen Kurz-Check reduziert.
Owner

Gebaut in vier Commits, alle gepusht:

  • 193378e Teil (a): Modell (Wurzel-Asset, Zeilen mit Ziel/Property/relativ/Keys, interpolation am Key vorgesehen), vier Playback-Arten (loop, once, once-reset, pingpong), Kommandos mit Undo, Player am Objekt, Nodes Play/Pause/Stop animation; das alte „Sprite trägt Animation über texture“ ist entfernt.
  • 5af0a1c Teil (b), Timeline-Editor (#98).
  • 4ed2edd Nachtrag aus dem Actor-Demo: Animation ist ein verdrahtbarer Wert (Literal, $animation in Listen, Port an den drei Nodes); Play auf eine laufende Animation spult nicht zurück, macht sie aber wieder zur Gewinnerin. Actor-Demo läuft über einen Play animation mit ItemAt(walk, facing), smoke-actor → 21 Checks.
  • 89c46c3 Teil (c), Vorschau im Tab (#99).

Die Entscheidungen 1–27 stehen in Kommentar 726. Abweichend davon gebaut: keine Autoplay-Property (3), Länge = letzter Key + 1 Frame (4), Playhead läuft fraktional zwischen den Frames (5), Doppelklick setzt den Key (19), keine Gruppierung (23).

Wiki: Animations.md neu geschrieben, dazu Architecture.md, Keyboard.md, Home.md, Behaviors.md.

CI auf 35c8788: Task 68 gate → CHECK EXIT 0 (92 Files, 1180 Tests), Task 69 suite → ALL PASSED – 928 checks, Smokes 24 / 19 / 21. Die erste Suite auf 89c46c3 (Task 67) war rot an genau einem Check: e2e 21d zählt die Arten der Kind-Tabelle auf und kannte animation noch nicht, nachgezogen in 35c8788. Die Check-Summe fällt von 960 auf 928, weil Modul 25 bis #110 ein Rumpf mit 5 Checks ist.

Folge-Issues: #101 Easing, #102 Kopieren/Einfügen/Frames, #103 Record, #104 Behavior-Variablen/Shader-Parameter, #105 Laufzeit-Steuerung, #106 Crossfade, #107 Timeline-Komfort, #108 Kurvenansicht (held-back), #109 Zielreichweite, #110 e2e-Schritt für Timeline und Vorschau.

Gebaut in vier Commits, alle gepusht: - `193378e` Teil (a): Modell (Wurzel-Asset, Zeilen mit Ziel/Property/relativ/Keys, `interpolation` am Key vorgesehen), vier Playback-Arten (`loop`, `once`, `once-reset`, `pingpong`), Kommandos mit Undo, Player am Objekt, Nodes `Play`/`Pause`/`Stop animation`; das alte „Sprite trägt Animation über `texture`“ ist entfernt. - `5af0a1c` Teil (b), Timeline-Editor (#98). - `4ed2edd` Nachtrag aus dem Actor-Demo: Animation ist ein verdrahtbarer Wert (Literal, `$animation` in Listen, Port an den drei Nodes); `Play` auf eine laufende Animation spult nicht zurück, macht sie aber wieder zur Gewinnerin. Actor-Demo läuft über einen `Play animation` mit `ItemAt(walk, facing)`, `smoke-actor` → 21 Checks. - `89c46c3` Teil (c), Vorschau im Tab (#99). Die Entscheidungen 1–27 stehen in Kommentar 726. Abweichend davon gebaut: keine Autoplay-Property (3), Länge = letzter Key + 1 Frame (4), Playhead läuft fraktional zwischen den Frames (5), Doppelklick setzt den Key (19), keine Gruppierung (23). Wiki: `Animations.md` neu geschrieben, dazu `Architecture.md`, `Keyboard.md`, `Home.md`, `Behaviors.md`. **CI auf `35c8788`:** Task 68 `gate` → `CHECK EXIT 0` (92 Files, 1180 Tests), Task 69 `suite` → `ALL PASSED – 928 checks`, Smokes 24 / 19 / 21. Die erste Suite auf `89c46c3` (Task 67) war rot an genau einem Check: e2e 21d zählt die Arten der Kind-Tabelle auf und kannte `animation` noch nicht, nachgezogen in `35c8788`. Die Check-Summe fällt von 960 auf 928, weil Modul 25 bis #110 ein Rumpf mit 5 Checks ist. **Folge-Issues:** #101 Easing, #102 Kopieren/Einfügen/Frames, #103 Record, #104 Behavior-Variablen/Shader-Parameter, #105 Laufzeit-Steuerung, #106 Crossfade, #107 Timeline-Komfort, #108 Kurvenansicht (held-back), #109 Zielreichweite, #110 e2e-Schritt für Timeline und Vorschau.
admin moved this to Done in Development on 2026-09-17 06:33:03 +02:00
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#97