Post-Effekte über Action::SetPost statt Engine-Zustand

Die PostChain lag als engine::post im Kern, nur damit die Konsole
`post` durch den exec-Trichter schalten konnte — Zustand, der allein
das Render-Frontend angeht und nichts mit der Simulation zu tun hat.

Jetzt kennt der Kern Post-Effekte nur als deferred Action (wie
play_sound): das `post <name> on|off`-Verb queued Action::SetPost,
die Session reicht sie als take_post()-Queue durch, das Fenster wendet
sie auf seine eigene PostChain an. Damit schalten Trigger und Ink-Tags
Effekte, die vorher nur der Konsolenbefehl erreichte.

- engine/post.rs entfällt; PostChain wandert nach render::post
- Session verliert das post-Feld, bekommt pending_post + take_post
- der `post`-Konsolenbefehl ist ein Shim wie `mode`; Ketten-Listing
  und nackter Toggle fallen weg (letzterer bewusst, vgl. 8bee832)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0196AM4UyAJEXVtPvp5DdKr8
This commit is contained in:
irrlicht
2026-09-01 22:47:32 +02:00
co-authored by Claude Sonnet 5
parent b3d08d4a8c
commit 247f7ef9fe
8 changed files with 170 additions and 142 deletions
+17 -5
View File
@@ -45,10 +45,6 @@ const EYE_SMOOTH_TAU: f32 = 0.06;
const EYE_MAX_LAG: f32 = 0.6;
pub fn run(mut session: Session) {
// Post-Effekte anmelden: die Kette gehört dem Renderer, geschaltet wird
// sie über denselben exec-Trichter wie alles andere (`post`).
for (name, on) in post::effects() { session.post.register(name, on); }
// Init-Signal feuern, bevor das Fenster steht (kann bereits einen
// Dialog öffnen — dann startet die Welt eben pausiert).
for line in session.start() { println!("{line}"); }
@@ -242,6 +238,9 @@ struct App {
/// melden, nicht jeden Klick).
audio: Option<audio::Audio>,
sfx_cache: HashMap<String, Option<audio::Sound>>,
/// Post-Effekt-Kette (Renderer-Zustand, nicht im Kern). Pro Frame aus
/// `session.take_post()` nachgeführt, dann an `gpu.frame`.
post: post::PostChain,
}
impl App {
@@ -271,6 +270,10 @@ impl App {
fonts,
audio,
sfx_cache: HashMap::new(),
// Die Post-Kette gehört dem Renderer, nicht dem Kern: geschaltet
// wird sie über `Action::SetPost` (Trigger/Ink/Konsole), die die
// Session als `take_post`-Queue durchreicht.
post: post::PostChain::defaults(),
}
}
@@ -437,6 +440,15 @@ impl App {
}
}
// Post-Effekt-Schaltungen (SetPost-Actions von Trigger/Ink/Konsole)
// auf die eigene Kette anwenden; unbekannter Name wird gemeldet, wie
// ein fehlendes WAV bei play_sound.
for (name, on) in self.session.take_post() {
if !self.post.set(&name, on) {
eprintln!("[post] unbekannter Effekt {name:?}");
}
}
// Am Boden gleitet die Augenhöhe sanft nach (siehe EYE_SMOOTH_TAU); in
// der Luft und außerhalb des Spiels folgt sie exakt.
let target_eye = self.session.player.pos[1] + player::EYE_HEIGHT;
@@ -494,7 +506,7 @@ impl App {
}
if let Some(gpu) = &mut self.gpu {
gpu.frame(&view, &screen.ui, &self.session.post);
gpu.frame(&view, &screen.ui, &self.post);
}
}
}