From 971074fedd281bf201bc8496f7e623bab57abcda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hartmut=20N=C3=B6renberg?= Date: Wed, 22 Jul 2026 07:12:30 +0200 Subject: [PATCH] =?UTF-8?q?docs:=20learnings=20erfasst=20=E2=80=94=20cinem?= =?UTF-8?q?atic=20render=20pipeline=20fixes=202026-07-21?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drei Bugs aus Cinematic-Render-Session dokumentiert: - is_cinematic immer False wegen Invocation-Override-Filter - usd_path.exists() auf str (fehlender str→Path-Cast in turntable/cinematic) - NameError stdout/stderr in cinematic error path Co-Authored-By: Claude Sonnet 4.6 --- LEARNINGS.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/LEARNINGS.md b/LEARNINGS.md index 81df155..56de2aa 100644 --- a/LEARNINGS.md +++ b/LEARNINGS.md @@ -515,3 +515,9 @@ Wenn ein Render-Job gecancelt wird, läuft Blender weiter. Wenn er fertig ist, s ### 2026-07-21 | Architektur | Cinematic-Render ist ausschließlich Legacy-Pfad — kein Graph-Node Es gibt keinen `BLENDER_CINEMATIC`-Node im Workflow-Graph-System. Cinematic-Renders laufen ausschließlich über den Legacy-Pfad (`render_order_line_task`), ausgelöst durch `output_type.render_settings.cinematic=true`. Für einen Cinematic-Output-Type darf deshalb kein `workflow_definition_id` gesetzt sein — sonst wird der Job als Graph-Workflow geroutet, der keinen Cinematic-Node hat und leer bleibt. + +### 2026-07-21 | Render-Pipeline | `is_cinematic` immer False wegen Invocation-Override-Filter +`workflow_runtime_services.py` las `is_cinematic` aus dem bereits gefilterten `render_settings`-Dict. `resolve_output_type_invocation_overrides` entfernt aber alle Keys die nicht in `_STATIC_RENDER_OVERRIDE_KEYS` oder `_ANIMATION_OVERRIDE_KEYS` stehen — `cinematic` ist in keiner dieser Listen. Ergebnis: `is_cinematic=False` immer, Cinematic-Jobs liefen auf den Turntable-Pfad. **Lösung:** `is_cinematic` direkt aus `output_type.render_settings.get("cinematic")` lesen statt aus dem gefilterten Dict. + +### 2026-07-21 | Render-Pipeline | `usd_path.exists()` auf str in turntable und cinematic render functions +`render_turntable_to_file` und `render_cinematic_to_file` in `render_blender.py` riefen `.exists()` auf `usd_path` auf, ohne zu prüfen ob es ein `str` oder `Path` ist. Das Invocation-Dataclass speichert `usd_path` als `str | None`. `render_still_to_file` hatte den `isinstance(usd_path, str)` → `Path`-Cast bereits (Zeilen 300–301), die anderen beiden Funktionen nicht. **Lösung:** Denselben Cast (`if isinstance(usd_path, str) and usd_path.strip(): usd_path = Path(usd_path)`) vor dem `usd_path.exists()`-Check in turntable und cinematic ergänzt.