EaseInOut und SmoothStep sind falsch benannt #31

Open
opened 2026-04-17 04:28:24 +00:00 by sebastian · 0 comments
Owner

Problem: EaseInOut und SmoothStep sind aktuell als periodische Funktionen implementiert (basierend auf sin(t)). Der Name impliziert eine Einmal-Übergangs-Kurve [0→1], das Verhalten ist aber eine Dauerschleife. Das führt zu falschen Erwartungen und Bugs sobald One-Shot-Animationen (Issue #29) genutzt werden.
Aktuelle Implementierung (falsch für den Namen):

case CurveType::EaseInOut: {
    float x = 0.5f + 0.5f * std::sin(t);  // ← periodisch!
    return offset + amplitude * (1.0f - std::cos(x * M_PI));
}

Lösung – zwei getrennte Konzepte:

enum class CurveType {
    Sine,           // periodisch, unverändert
    Triangle,       // periodisch, unverändert
    SmoothSine,     // war: SmoothStep  – periodisch geglättet (umbenennen)
    EaseIn,         // NEU: t^2, für One-Shot
    EaseOut,        // NEU: 1-(1-t)^2, für One-Shot
    EaseInOut,      // FIXFIX: smoothstep(0,1,t) – echter Übergang 0→1
    Constant
};

// EaseInOut korrekt:

case CurveType::EaseInOut: {
    float x = std::clamp(t, 0.f, 1.f);   // t ist normierte Zeit (0–1)
    return offset + amplitude * (x * x * (3.f - 2.f * x));  // smoothstep
}

AnimationSystem normiert t bei One-Shot-Tracks auf [0, 1] bevor es an curve.evaluate() übergeben wird:

float t = (track.duration > 0.f)
    ? track.localTime / track.duration  // normiert: 0→1
    : track.localTime;                  // absolut: für Periodic-Kurven

Acceptance Criteria:

  • SmoothStep in SmoothSine umbenannt – bisheriges Verhalten bleibt
  • EaseInOut gibt bei t=0 → 0 und t=1 → amplitude zurück
  • EaseIn, EaseOut als neue Kurventypen vorhanden
  • Bestehende Verwendungen (BuildingFactory, ProducingSystem) compilieren und verhalten sich gleich (beide nutzen Sine – nicht betroffen)
  • Unit Tests für alle Kurventypen an den Grenzwerten
Problem: EaseInOut und SmoothStep sind aktuell als periodische Funktionen implementiert (basierend auf sin(t)). Der Name impliziert eine Einmal-Übergangs-Kurve [0→1], das Verhalten ist aber eine Dauerschleife. Das führt zu falschen Erwartungen und Bugs sobald One-Shot-Animationen (Issue #29) genutzt werden. Aktuelle Implementierung (falsch für den Namen): ``` case CurveType::EaseInOut: { float x = 0.5f + 0.5f * std::sin(t); // ← periodisch! return offset + amplitude * (1.0f - std::cos(x * M_PI)); } ``` Lösung – zwei getrennte Konzepte: ``` enum class CurveType { Sine, // periodisch, unverändert Triangle, // periodisch, unverändert SmoothSine, // war: SmoothStep – periodisch geglättet (umbenennen) EaseIn, // NEU: t^2, für One-Shot EaseOut, // NEU: 1-(1-t)^2, für One-Shot EaseInOut, // FIXFIX: smoothstep(0,1,t) – echter Übergang 0→1 Constant }; ``` // EaseInOut korrekt: ``` case CurveType::EaseInOut: { float x = std::clamp(t, 0.f, 1.f); // t ist normierte Zeit (0–1) return offset + amplitude * (x * x * (3.f - 2.f * x)); // smoothstep } ``` AnimationSystem normiert t bei One-Shot-Tracks auf [0, 1] bevor es an curve.evaluate() übergeben wird: ``` float t = (track.duration > 0.f) ? track.localTime / track.duration // normiert: 0→1 : track.localTime; // absolut: für Periodic-Kurven ``` Acceptance Criteria: - SmoothStep in SmoothSine umbenannt – bisheriges Verhalten bleibt - EaseInOut gibt bei t=0 → 0 und t=1 → amplitude zurück - EaseIn, EaseOut als neue Kurventypen vorhanden - Bestehende Verwendungen (BuildingFactory, ProducingSystem) compilieren und verhalten sich gleich (beide nutzen Sine – nicht betroffen) - Unit Tests für alle Kurventypen an den Grenzwerten
sebastian added this to the Animationsystem milestone 2026-04-17 04:28:24 +00:00
sebastian added the
refactoring
engine
labels 2026-04-17 04:28:24 +00:00
sebastian added this to the Dicewars project 2026-04-17 04:28:24 +00:00
sebastian added a new dependency 2026-04-17 04:34:43 +00:00
Sign in to join this conversation.
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Blocks
#32 Sequenzierte Animation
sebastian/Dicewars-Siedler
Reference: sebastian/Dicewars-Siedler#31
No description provided.