From c1e9a86996ea4595ccdfc218c788bbd465c9fe21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hartmut=20N=C3=B6renberg?= Date: Sat, 7 Mar 2026 14:10:45 +0100 Subject: [PATCH] fix(gltf): route generate_gltf_geometry_task through Blender for materials + sharp edges MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace trimesh-only GLB export with Blender headless pipeline using export_gltf.py. The viewer GLB and downloadable GLB now receive: - Material substitution via the Schaeffler asset library (.blend) - OCC-derived sharp edge data (sharp_edge_midpoints from mesh_attributes) marked as Blender sharp edges before export Material map is resolved via resolve_material_map() to convert aliases (e.g. "Steel--Stahl" → "SCHAEFFLER_010101_Steel-Bare") before passing to Blender. Old gltf_geometry MediaAsset is replaced on each run to avoid stale records accumulating. Trimesh kept as fallback if Blender binary unavailable. Co-Authored-By: Claude Sonnet 4.6 --- LEARNINGS.md | 5 ++ backend/app/tasks/step_tasks.py | 154 +++++++++++++++++++++++--------- 2 files changed, 119 insertions(+), 40 deletions(-) diff --git a/LEARNINGS.md b/LEARNINGS.md index d8bc64e..b4e1994 100644 --- a/LEARNINGS.md +++ b/LEARNINGS.md @@ -436,6 +436,11 @@ SQLAlchemy `Enum(create_type=False)` funktioniert nicht zuverlässig mit asyncpg --- +### 2026-03-07 | GLB Export | Trimesh kennt keine Materialien — Blender-Pipeline ist Pflicht +**Problem:** `generate_gltf_geometry_task` nutzte trimesh für STL→GLB. Trimesh ist eine reine Geometrie-Bibliothek: keine Material-Bibliotheken, kein OCC-Kantenmarking, kein Asset-Library-Support. Das erzeugte graue, facettierte GLB-Dateien ohne Materialien. +**Lösung:** Task auf Blender headless (`export_gltf.py`) umgestellt. Übergibt: `material_map` (via `resolve_material_map()` aus `cad_part_materials`), `sharp_edges_json` (aus `mesh_attributes.sharp_edge_midpoints`), `asset_library_blend` (via `get_material_library_path()`). Trimesh nur noch als Fallback wenn Blender nicht verfügbar. +**Fehler:** Der Blender-Script (`export_gltf.py`) war schon fertig implementiert — aber `generate_gltf_geometry_task` hat ihn nie aufgerufen. Skript vorhanden ≠ Skript verdrahtet. Immer prüfen ob ein Script auch von der richtigen Stelle aufgerufen wird. + ### 2026-03-07 | Frontend | `` kann keine Auth-Header senden — useAuthBlob Hook nötig **Problem:** `` schickt keine `Authorization`-Header → 401 → `imgError=true` → graues Icon in der Media Library. Betrifft alle Browser-nativen Elemente (``, `