diff --git a/render-worker/scripts/export_step_to_gltf.py b/render-worker/scripts/export_step_to_gltf.py index e8fdd15..e26013c 100644 --- a/render-worker/scripts/export_step_to_gltf.py +++ b/render-worker/scripts/export_step_to_gltf.py @@ -307,8 +307,13 @@ def _tessellate_with_gmsh(shape, linear_deflection: float, angular_deflection: f try: BRepTools.Write_s(shape, brep_path) + import os as _os + n_threads = min(_os.cpu_count() or 1, 16) # cap at 16 — sweet spot on benchmark gmsh.initialize() gmsh.option.setNumber("General.Terminal", 0) # suppress console output + gmsh.option.setNumber("General.NumThreads", n_threads) # enable OpenMP parallelism + gmsh.option.setNumber("Mesh.MaxNumThreads1D", n_threads) # parallel edge meshing + gmsh.option.setNumber("Mesh.MaxNumThreads2D", n_threads) # parallel surface meshing gmsh.option.setNumber("Mesh.Algorithm", 6) # Frontal-Delaunay 2D gmsh.option.setNumber("Mesh.RecombineAll", 0) # keep triangles (no quads) # CharacteristicLength controls edge length target in mm @@ -424,6 +429,7 @@ def _tessellate_with_gmsh(shape, linear_deflection: float, angular_deflection: f f"GMSH tessellation: {n_faces_gmsh} faces meshed, " f"{n_faces_fallback} BRepMesh fallback, " f"{n_triangles_total} triangles total" + f" (threads={n_threads})" )