Curve asset: build your own easing curve and use it on animation keys and Lerp #247

Closed
opened 2026-09-27 15:24:46 +02:00 by meleki · 1 comment
Owner

Ein neuer Asset-Typ Curve: eine selbst gebaute Easing-Kurve, die man überall dort auswählen kann, wo heute eine fertige Ease gewählt wird.

Warum

Heute gibt es nur die eingebauten Kurven: Linear, Step und die Penner-Kurven (Sine … Bounce) mit In/Out/In-out am Animation-Key (easedShare in src/core/model/animation.ts), am Lerp-Node (#246) nur Linear/In/Out/In-out. Eigene Bewegungen wie „erst überschießen, dann zweimal nachfedern“ lassen sich damit nicht bauen.

Asset

  • Neuer Typ curve, Label „Curve“, nicht platzierbar (wie Palette oder Animation). Erscheint im +-Menü des Asset-Panels.
  • Inhalt: eine Liste von Punkten (t, v). t läuft von 0 bis 1, erster Punkt fest bei t = 0, letzter fest bei t = 1. v ist frei, darf also auch unter 0 oder über 1 gehen (Überschießen wie Back/Elastic).
  • Jeder Punkt kann Bezier-Handles haben, wie bei Vector art: ohne Handle ist das Segment eine Gerade, mit Handle eine Kurve. Ein Handle allein reicht für eine Kurve.
  • Ein neues Curve-Asset startet als Gerade von (0, 0) nach (1, 1), also linear.

Eigener Tab

  • Der Curve-Tab zeigt die Kurve in einem Diagramm: t waagrecht, v senkrecht, mit Hilfslinien bei 0 und 1.
  • Punkte setzen (Klick auf die Kurve oder freie Fläche), verschieben, löschen. Die zwei Endpunkte lassen sich nur senkrecht verschieben und nicht löschen.
  • Handles ziehen, wie im Vector-art-Editor. Handle entfernen macht das Segment wieder gerade.
  • Punkte dürfen sich in t nicht überholen: Die Kurve muss für jedes t genau einen Wert haben. Handles werden in t auf den Bereich zwischen den Nachbarpunkten geklemmt, sonst würde die Kurve rückwärts laufen.
  • Optional: Vorlagen zum Start (die eingebauten Eases als Ausgangspunkt) und eine kleine Vorschau, die einen Punkt entlang der Kurve laufen lässt.
  • Undo für jeden Schritt, wie in den anderen Editoren.

Verwendung

  • Animation-Key: Im Inspector des Keys gibt es neben den eingebauten Kurven die Wahl „Curve“ mit einem Asset-Picker. Gespeichert wird die Asset-Id am Key. easedShare wertet dann die Kurve aus.
  • Lerp-Node: Beim Parameter Ease ebenfalls „Curve“ mit Asset-Picker. t bleibt auf 0…1 begrenzt, das Ergebnis darf über b hinaus gehen, wenn die Kurve überschießt.
  • Auswertung: Zu einem t wird auf der Bezier-Kurve der passende Wert gesucht (Bezier nach t auflösen, z. B. per Newton/Bisektion wie bei CSS cubic-bezier). Das ist eine reine Funktion in src/core/model/, gemeinsam für Editor-Vorschau, Animation und Graph.
  • Fehlendes Asset: Ist die gewählte Kurve gelöscht, fällt der Key bzw. der Node auf Linear zurück und meldet das im Inspector bzw. als Problem am Node.
  • Löschen einer Curve, die noch benutzt wird: gleiche Warnung wie bei anderen referenzierten Assets.

Tests

  • Unit: Auswertung der Kurve (Gerade = linear, Endpunkte exakt, Überschießen, Handles geklemmt), Laden/Speichern, fehlendes Asset → linear.
  • e2e: Curve anlegen, im Tab Punkt setzen und Handle ziehen (echte Maus), am Animation-Key und am Lerp auswählen, Wert gegen die gerechnete Kurve prüfen.
  • Wiki: neue Seite oder Abschnitt zu Curve, Einträge bei Animations und Behaviors (Lerp).
Ein neuer Asset-Typ **Curve**: eine selbst gebaute Easing-Kurve, die man überall dort auswählen kann, wo heute eine fertige Ease gewählt wird. ## Warum Heute gibt es nur die eingebauten Kurven: Linear, Step und die Penner-Kurven (Sine … Bounce) mit In/Out/In-out am Animation-Key (`easedShare` in `src/core/model/animation.ts`), am `Lerp`-Node (#246) nur Linear/In/Out/In-out. Eigene Bewegungen wie „erst überschießen, dann zweimal nachfedern“ lassen sich damit nicht bauen. ## Asset - Neuer Typ `curve`, Label „Curve“, nicht platzierbar (wie Palette oder Animation). Erscheint im `+`-Menü des Asset-Panels. - Inhalt: eine Liste von Punkten `(t, v)`. `t` läuft von 0 bis 1, erster Punkt fest bei `t = 0`, letzter fest bei `t = 1`. `v` ist frei, darf also auch unter 0 oder über 1 gehen (Überschießen wie Back/Elastic). - Jeder Punkt kann Bezier-Handles haben, **wie bei Vector art**: ohne Handle ist das Segment eine Gerade, mit Handle eine Kurve. Ein Handle allein reicht für eine Kurve. - Ein neues Curve-Asset startet als Gerade von (0, 0) nach (1, 1), also linear. ## Eigener Tab - Der Curve-Tab zeigt die Kurve in einem Diagramm: `t` waagrecht, `v` senkrecht, mit Hilfslinien bei 0 und 1. - Punkte setzen (Klick auf die Kurve oder freie Fläche), verschieben, löschen. Die zwei Endpunkte lassen sich nur senkrecht verschieben und nicht löschen. - Handles ziehen, wie im Vector-art-Editor. Handle entfernen macht das Segment wieder gerade. - Punkte dürfen sich in `t` nicht überholen: Die Kurve muss für jedes `t` genau einen Wert haben. Handles werden in `t` auf den Bereich zwischen den Nachbarpunkten geklemmt, sonst würde die Kurve rückwärts laufen. - Optional: Vorlagen zum Start (die eingebauten Eases als Ausgangspunkt) und eine kleine Vorschau, die einen Punkt entlang der Kurve laufen lässt. - Undo für jeden Schritt, wie in den anderen Editoren. ## Verwendung - **Animation-Key:** Im Inspector des Keys gibt es neben den eingebauten Kurven die Wahl „Curve“ mit einem Asset-Picker. Gespeichert wird die Asset-Id am Key. `easedShare` wertet dann die Kurve aus. - **Lerp-Node:** Beim Parameter *Ease* ebenfalls „Curve“ mit Asset-Picker. `t` bleibt auf 0…1 begrenzt, das Ergebnis darf über `b` hinaus gehen, wenn die Kurve überschießt. - **Auswertung:** Zu einem `t` wird auf der Bezier-Kurve der passende Wert gesucht (Bezier nach `t` auflösen, z. B. per Newton/Bisektion wie bei CSS `cubic-bezier`). Das ist eine reine Funktion in `src/core/model/`, gemeinsam für Editor-Vorschau, Animation und Graph. - **Fehlendes Asset:** Ist die gewählte Kurve gelöscht, fällt der Key bzw. der Node auf Linear zurück und meldet das im Inspector bzw. als Problem am Node. - **Löschen einer Curve**, die noch benutzt wird: gleiche Warnung wie bei anderen referenzierten Assets. ## Tests - Unit: Auswertung der Kurve (Gerade = linear, Endpunkte exakt, Überschießen, Handles geklemmt), Laden/Speichern, fehlendes Asset → linear. - e2e: Curve anlegen, im Tab Punkt setzen und Handle ziehen (echte Maus), am Animation-Key und am Lerp auswählen, Wert gegen die gerechnete Kurve prüfen. - Wiki: neue Seite oder Abschnitt zu *Curve*, Einträge bei *Animations* und *Behaviors* (Lerp).
admin added this to the Development project 2026-09-27 15:28:12 +02:00
admin moved this to Next in Development on 2026-09-27 15:28:14 +02:00
Author
Owner

Umgesetzt in 393b8ec, inklusive Vorlagen und Vorschau.

Was es gibt

  • Asset-Typ Curve (im +-Menü, Gruppe Curves). Eine neue Kurve ist die Gerade von (0, 0) nach (1, 1).
  • Curve-Tab: Klick auf die Linie setzt einen Punkt und erhält die Form, Klick auf freie Fläche setzt ihn dort. Punkte und Griffe ziehen, Doppelklick oder Delete löscht, Alt-Klick schaltet rund/gerade, „Point: …“ wie bei Vector art. Jeder Schritt ist ein Undo-Schritt.
  • Ein Wert pro t: Endpunkte fest bei t 0 und 1 (nur senkrecht), Punkte überholen sich nicht, Griffe werden entlang ihrer Richtung gekürzt. Gilt auch beim Laden einer von Hand bearbeiteten Datei.
  • Vorlagen: alle 30 eingebauten Eases plus Linear, mit Suchfeld, höchstens 0,4 % Abweichung, 2 bis 33 Punkte.
  • Vorschau: Ein Punkt läuft die Kurve entlang, ein zweiter zeigt nur den Wert. Preview hält sie an.
  • Animation-Key: Easing → Curve mit Kurven-Auswahl. Lerp: Ease → Curve, das Ergebnis darf über b hinausschießen.
  • Fehlende Kurve: läuft linear, Inspector und Node melden es, die Löschwarnung nennt die Zahl der Keys und Lerp-Nodes.

Code: src/core/model/curve.ts (Auswertung, Regeln), curvePresets.ts, src/editor/curve/ (Tab).

Tests

  • ./check.sh → 180 Files, 2612 Tests, CHECK EXIT 0
  • GM_STEPS=1-6,25,53 → ALL PASSED, 309 Checks
  • Neues e2e-Modul 53 mit 13 Checks, alle mit echter Maus. Die Sollwerte rechnet der Test mit einer eigenen Bezier-Auswertung nach.
  • Gegenproben greifen: ohne Bezier-Auswertung (4 Unit-Tests fallen), ohne Griffbegrenzung (2), Key findet Kurve nicht, Klick setzt keinen Punkt, Griff-Zug verschiebt den Punkt (jeweils Checks rot).

Wiki: neue Seite Curves, dazu Animations, Behaviors, Architecture, Development (b0318cd).

Umgesetzt in 393b8ec, inklusive Vorlagen und Vorschau. **Was es gibt** - Asset-Typ **Curve** (im `+`-Menü, Gruppe *Curves*). Eine neue Kurve ist die Gerade von (0, 0) nach (1, 1). - **Curve-Tab:** Klick auf die Linie setzt einen Punkt und erhält die Form, Klick auf freie Fläche setzt ihn dort. Punkte und Griffe ziehen, Doppelklick oder Delete löscht, Alt-Klick schaltet rund/gerade, „Point: …“ wie bei Vector art. Jeder Schritt ist ein Undo-Schritt. - **Ein Wert pro t:** Endpunkte fest bei t 0 und 1 (nur senkrecht), Punkte überholen sich nicht, Griffe werden entlang ihrer Richtung gekürzt. Gilt auch beim Laden einer von Hand bearbeiteten Datei. - **Vorlagen:** alle 30 eingebauten Eases plus Linear, mit Suchfeld, höchstens 0,4 % Abweichung, 2 bis 33 Punkte. - **Vorschau:** Ein Punkt läuft die Kurve entlang, ein zweiter zeigt nur den Wert. **Preview** hält sie an. - **Animation-Key:** *Easing → Curve* mit Kurven-Auswahl. **Lerp:** *Ease → Curve*, das Ergebnis darf über `b` hinausschießen. - **Fehlende Kurve:** läuft linear, Inspector und Node melden es, die Löschwarnung nennt die Zahl der Keys und Lerp-Nodes. **Code:** `src/core/model/curve.ts` (Auswertung, Regeln), `curvePresets.ts`, `src/editor/curve/` (Tab). **Tests** - `./check.sh` → 180 Files, 2612 Tests, `CHECK EXIT 0` - `GM_STEPS=1-6,25,53` → ALL PASSED, 309 Checks - Neues e2e-Modul 53 mit 13 Checks, alle mit echter Maus. Die Sollwerte rechnet der Test mit einer eigenen Bezier-Auswertung nach. - Gegenproben greifen: ohne Bezier-Auswertung (4 Unit-Tests fallen), ohne Griffbegrenzung (2), Key findet Kurve nicht, Klick setzt keinen Punkt, Griff-Zug verschiebt den Punkt (jeweils Checks rot). **Wiki:** neue Seite [Curves](https://git.nockal.com/meleki/game-maker/wiki/Curves), dazu *Animations*, *Behaviors*, *Architecture*, *Development* (b0318cd).
admin moved this to Done in Development on 2026-09-27 22:17:23 +02:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#247