diff --git a/CLAUDE.md b/CLAUDE.md
index b97cbc7..e4d686a 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -73,7 +73,6 @@ schaefflerautomat/
│ │ ├── blender_render.py # Entry point (68 lines), delegates to _blender_*.py submodules
│ │ ├── export_step_to_gltf.py # OCC/GMSH STEP → GLB tessellation
│ │ ├── export_step_to_usd.py # OCC STEP → USD canonical scene
-│ │ ├── export_gltf.py # Blender: materials, seams, sharp edges on GLB
│ │ ├── import_usd.py # Blender: USD import + primvar restoration
│ │ ├── still_render.py # Blender still render
│ │ └── turntable_render.py # Blender turntable animation
diff --git a/backend/app/core/process_steps.py b/backend/app/core/process_steps.py
index 245e6c6..6a7267f 100644
--- a/backend/app/core/process_steps.py
+++ b/backend/app/core/process_steps.py
@@ -27,8 +27,7 @@ class StepName(StrEnum):
BLENDER_TURNTABLE = "blender_turntable"
OUTPUT_SAVE = "output_save"
- # ── GLB / asset export ────────────────────────────────────────────
- EXPORT_GLB_GEOMETRY = "export_glb_geometry"
+ # ── Asset export ──────────────────────────────────────────────────
EXPORT_BLEND = "export_blend"
# ── STL cache ────────────────────────────────────────────────────
diff --git a/backend/app/domains/media/models.py b/backend/app/domains/media/models.py
index c58c012..0f62c35 100644
--- a/backend/app/domains/media/models.py
+++ b/backend/app/domains/media/models.py
@@ -14,8 +14,8 @@ class MediaAssetType(str, enum.Enum):
turntable = "turntable"
stl_low = "stl_low"
stl_high = "stl_high"
- gltf_geometry = "gltf_geometry" # DEPRECATED: use usd_master — viewer GLB auto-generated as part of USD pipeline
- gltf_production = "gltf_production" # DEPRECATED: use usd_master — high-quality production GLB superseded by USD master
+ gltf_geometry = "gltf_geometry"
+ gltf_production = "gltf_production" # LEGACY — kept for ORM compatibility with existing DB rows, no longer generated
blend_production = "blend_production"
usd_master = "usd_master"
diff --git a/backend/app/domains/media/router.py b/backend/app/domains/media/router.py
index 00b6749..1d65fe7 100644
--- a/backend/app/domains/media/router.py
+++ b/backend/app/domains/media/router.py
@@ -142,7 +142,6 @@ async def browse_media_assets(
# Apply filters
_TECHNICAL_TYPES = (
MediaAssetType.gltf_geometry,
- MediaAssetType.gltf_production,
MediaAssetType.blend_production,
MediaAssetType.stl_low,
MediaAssetType.stl_high,
diff --git a/backend/app/domains/rendering/tasks.py b/backend/app/domains/rendering/tasks.py
index 52f9a7d..c84a5e7 100644
--- a/backend/app/domains/rendering/tasks.py
+++ b/backend/app/domains/rendering/tasks.py
@@ -506,52 +506,6 @@ def render_order_line_still_task(self, order_line_id: str, **params) -> dict:
raise self.retry(exc=exc, countdown=30)
-@celery_app.task(
- bind=True,
- name="app.domains.rendering.tasks.export_gltf_for_order_line_task",
- queue="asset_pipeline",
- max_retries=1,
-)
-def export_gltf_for_order_line_task(self, order_line_id: str) -> dict:
- """Export a geometry GLB directly from STEP via OCC (no STL intermediary).
-
- Publishes a MediaAsset with asset_type='gltf_geometry'.
- """
- import os
- import subprocess
- import sys
-
- step_path_str, cad_file_id = _resolve_step_path_for_order_line(order_line_id)
- if not step_path_str:
- raise RuntimeError(f"Cannot resolve STEP path for order_line {order_line_id}")
-
- step = Path(step_path_str)
- output_path = step.parent / f"{step.stem}_geometry.glb"
- scripts_dir = Path(os.environ.get("RENDER_SCRIPTS_DIR", "/render-scripts"))
- occ_script = scripts_dir / "export_step_to_gltf.py"
-
- if not occ_script.exists():
- raise RuntimeError(f"export_step_to_gltf.py not found at {occ_script}")
-
- try:
- cmd = [
- sys.executable, str(occ_script),
- "--step_path", str(step),
- "--output_path", str(output_path),
- ]
- result = subprocess.run(cmd, capture_output=True, text=True, timeout=120)
- if result.returncode != 0:
- raise RuntimeError(
- f"export_step_to_gltf.py exited {result.returncode}:\n{result.stderr[-500:]}"
- )
- publish_asset.delay(order_line_id, "gltf_geometry", str(output_path))
- logger.info("export_gltf_for_order_line_task completed via OCC: %s", output_path.name)
- return {"glb_path": str(output_path), "method": "occ"}
- except Exception as exc:
- logger.error("export_gltf_for_order_line_task failed for %s: %s", order_line_id, exc)
- raise self.retry(exc=exc, countdown=15)
-
-
@celery_app.task(
bind=True,
name="app.domains.rendering.tasks.export_blend_for_order_line_task",
diff --git a/backend/app/domains/rendering/workflow_builder.py b/backend/app/domains/rendering/workflow_builder.py
index 336e50f..1672fbe 100644
--- a/backend/app/domains/rendering/workflow_builder.py
+++ b/backend/app/domains/rendering/workflow_builder.py
@@ -64,23 +64,16 @@ def _build_multi_angle(order_line_id: str, params: dict):
def _build_still_with_exports(order_line_id: str, params: dict):
- """Still render + parallel GLB exports (geometry + production quality).
+ """Still render + .blend export.
Pipeline:
- render_order_line_still_task → group(
- export_gltf_for_order_line_task,
- export_blend_for_order_line_task,
- )
+ render_order_line_still_task → export_blend_for_order_line_task
"""
from app.domains.rendering.tasks import (
render_order_line_still_task,
- export_gltf_for_order_line_task,
export_blend_for_order_line_task,
)
return chain(
render_order_line_still_task.si(order_line_id, **params),
- group(
- export_gltf_for_order_line_task.si(order_line_id),
- export_blend_for_order_line_task.si(order_line_id),
- ),
+ export_blend_for_order_line_task.si(order_line_id),
)
diff --git a/backend/app/domains/rendering/workflow_executor.py b/backend/app/domains/rendering/workflow_executor.py
index 632ff47..f2f630e 100644
--- a/backend/app/domains/rendering/workflow_executor.py
+++ b/backend/app/domains/rendering/workflow_executor.py
@@ -45,8 +45,7 @@ STEP_TASK_MAP: dict[StepName, str] = {
# ── Order line stills & turntables ──────────────────────────────────
StepName.BLENDER_STILL: "app.domains.rendering.tasks.render_order_line_still_task",
StepName.BLENDER_TURNTABLE: "app.domains.rendering.tasks.render_turntable_task",
- # ── GLB / asset export ───────────────────────────────────────────────
- StepName.EXPORT_GLB_GEOMETRY: "app.domains.rendering.tasks.export_gltf_for_order_line_task",
+ # ── Asset export ─────────────────────────────────────────────────────
StepName.EXPORT_BLEND: "app.domains.rendering.tasks.export_blend_for_order_line_task",
# ── Steps without a dedicated standalone task (no mapping) ───────────
# StepName.GLB_BBOX — computed inline inside process_step_file
diff --git a/backend/app/domains/rendering/workflow_router.py b/backend/app/domains/rendering/workflow_router.py
index f8be3a5..e9fd447 100644
--- a/backend/app/domains/rendering/workflow_router.py
+++ b/backend/app/domains/rendering/workflow_router.py
@@ -51,7 +51,6 @@ _STEP_CATEGORIES: dict[StepName, StepCategory] = {
StepName.BLENDER_STILL: "rendering",
StepName.BLENDER_TURNTABLE: "rendering",
StepName.OUTPUT_SAVE: "output",
- StepName.EXPORT_GLB_GEOMETRY: "output",
StepName.EXPORT_BLEND: "output",
StepName.STL_CACHE_GENERATE: "processing",
StepName.NOTIFY: "output",
@@ -72,7 +71,6 @@ _STEP_DESCRIPTIONS: dict[StepName, str] = {
StepName.BLENDER_STILL: "Render a production still image (PNG) via Blender HTTP micro-service",
StepName.BLENDER_TURNTABLE: "Render all turntable animation frames via Blender HTTP micro-service",
StepName.OUTPUT_SAVE: "Upload the rendered output file to storage and create a MediaAsset record",
- StepName.EXPORT_GLB_GEOMETRY: "Export a geometry-only GLB for the 3-D viewer (no materials)",
StepName.EXPORT_BLEND: "Save the production .blend file as a downloadable MediaAsset",
StepName.STL_CACHE_GENERATE: "Convert STEP → STL (low + high quality) and cache next to the STEP file",
StepName.NOTIFY: "Emit a user notification via the audit-log notification channel",
diff --git a/backend/tests/domains/test_rendering_service.py b/backend/tests/domains/test_rendering_service.py
index 2bd6e47..e932774 100644
--- a/backend/tests/domains/test_rendering_service.py
+++ b/backend/tests/domains/test_rendering_service.py
@@ -102,11 +102,6 @@ def test_render_order_line_still_task_importable():
assert render_order_line_still_task.queue == "asset_pipeline"
-def test_export_gltf_for_order_line_task_importable():
- from app.domains.rendering.tasks import export_gltf_for_order_line_task
- assert export_gltf_for_order_line_task.queue == "asset_pipeline"
-
-
def test_export_blend_for_order_line_task_importable():
from app.domains.rendering.tasks import export_blend_for_order_line_task
assert export_blend_for_order_line_task.queue == "asset_pipeline"
diff --git a/frontend/src/api/media.ts b/frontend/src/api/media.ts
index 47154f3..ca7609c 100644
--- a/frontend/src/api/media.ts
+++ b/frontend/src/api/media.ts
@@ -7,7 +7,6 @@ export type MediaAssetType =
| 'stl_low'
| 'stl_high'
| 'gltf_geometry'
- | 'gltf_production'
| 'usd_master'
| 'blend_production'
diff --git a/frontend/src/pages/Admin.tsx b/frontend/src/pages/Admin.tsx
index acd0802..44a503a 100644
--- a/frontend/src/pages/Admin.tsx
+++ b/frontend/src/pages/Admin.tsx
@@ -1454,7 +1454,7 @@ export default function AdminPage() {
Tessellation Quality
- OCC mesh precision for GLB export. Lower values = finer mesh + larger files + slower export.
+ Controls how STEP geometry is converted to triangle meshes. These settings affect both the 3D viewer and Blender renders.
+
+ {/* Explanation of deflection parameters */}
+
+
How deflection values work
+
+
+
Linear deflection (mm)
+
Maximum allowed distance between the original curved surface and the generated triangles. A value of 0.1 mm means no triangle edge can deviate more than 0.1 mm from the true surface. Lower values produce smoother curves but more triangles.
+
+
+
Angular deflection (rad)
+
Maximum angle between adjacent triangle normals. Controls how finely curved regions are subdivided. A value of 0.1 rad (~6°) means neighboring triangles can differ by at most ~6°. Primarily affects small fillets and tight curvatures.