Skip to content

v1.8.0

Choose a tag to compare

@github-actions github-actions released this 20 Apr 21:36
· 13 commits to main since this release
5e45973

Highlight: Multi-pass decimate with UV seam protection and planar pre-pass — dramatically better silhouette and texture preservation at aggressive reduction ratios.

Fixed

  • Thin-shell meshes (draped covers, cloth, single-layer surfaces) no longer render with black "holes" after decimation. The post-decimate cleanup in decimate_single was calling normals_make_consistent(inside=False), which flood-fills face winding from a seed face. On thin-shell geometry the concept of "outside" is undefined, so the algorithm flipped whole face islands inside-out; those islands then rendered as back-faces (black under the GLB exporter's default material). The call was added in 1.7.0 as a defensive cleanup, but COLLAPSE decimation preserves input winding, so there was nothing for it to fix. Removed. Existing per-object Fix Geometry normal recalculation (gated behind the Recalculate Normals toggle) is unchanged and still runs before decimation on whole input where the flood-fill has a much better chance of seeding correctly.
  • Black texture smears on fragmented-UV meshes after decimation are eliminated by defaulting Manifold Fix away from the 3D Print Toolbox (see Changed). The smears were a downstream artifact of the Toolbox's clean_non_manifold operator tearing UV islands apart on thin-shell meshes; with the default changed to Fill Holes, they no longer appear.
  • Multi-pass decimate at aggressive ratios no longer overshoots the face-count estimate. Running 3 passes at ratio 0.05 previously produced ~76k faces against a UI estimate of ~57k because the dissolve_limited pre-pass created n-gons that the COLLAPSE modifier re-triangulated, growing the face count on pass 1. The new flow triangulates up front, runs the planar DISSOLVE as a pre-pass (unweighted, so it can collapse flat regions that the seam-protection bias would otherwise freeze), then runs COLLAPSE with use_collapse_triangulate=False. The per-pass ratio is computed from the post-pre-pass face count so the planar reduction doesn't compound with the requested ratio. Multi-pass COLLAPSE no longer stalls after pass 1 on fragmented-UV meshes because seam-protected vertices are now strongly biased (weight 0.5) rather than hard-immune (which weight 1.0 effectively produced in Blender's solver).

Added

  • Passes setting on the Decimate step (1–5, default 1). Splits COLLAPSE decimation into N iterations so the quadric solver recomputes its error field between passes. Per-pass ratio is computed after the planar pre-pass to solve for the reduction needed to hit start_faces * ratio, so the planar dissolve and the requested ratio don't compound. For the same final face count, higher pass counts preserve silhouette and texture detail noticeably better at aggressive ratios (e.g. 3 passes reaching 0.1 produces a much smoother result than a single pass at 0.1). Default of 1 keeps existing behavior unchanged.
  • Protect UV Seams toggle on the Decimate step, default on. A temporary AIOPT_Seam_Protect vertex group weights UV island boundary vertices (and their one-ring neighbors) at 0.5 and all other vertices at 0.1; each COLLAPSE decimate modifier references the group with invert_vertex_group=True, biasing the quadric solver ~5x against collapsing seam-adjacent vertices. Mesh topology stays fully connected — this is a numerical cost bias, not a hard constraint. Weight 0.5 (rather than 1.0) is deliberate: weight 1.0 causes Blender's solver to treat the vertex as uncollapsible, stalling multi-pass COLLAPSE on fragmented-UV meshes where most vertices end up protected. The group is removed after decimation so the exported mesh stays clean.
  • Planar Pre-Pass toggle on the Decimate step, default on, with a Planar Angle slider (default 5 deg). Runs a DECIMATE modifier in DISSOLVE (planar) mode before the COLLAPSE loop, merging adjacent near-coplanar faces into n-gons. Dramatically reduces triangle count in flat regions — cylinder tops, flat panels, ground planes — without touching curved surfaces. UV island boundaries are preserved natively via the modifier's delimit={'UV'} setting. Running DISSOLVE before COLLAPSE is load-bearing: it's unweighted, so it eats flat regions that the seam-protection bias would otherwise lock COLLAPSE out of. Disable if your mesh has subtle curvature that should not be flattened.

Changed

  • Decimate step now runs a planar pre-pass by default (see above). On AI-generated meshes with large flat regions this produces noticeably lower final face counts and eliminates the radial fan artifact; on meshes with subtle curvature you may want to disable Planar Pre-Pass to preserve it.
  • Fix Manifold boolean replaced with Manifold Fix enum (Off / Fill Holes / 3D Print Toolbox, default Fill Holes). The 3D Print Toolbox's clean_non_manifold operator deletes geometry around non-manifold edges to produce a watertight solid, which damages thin-shell AI meshes (draped covers, cloth, single-layer surfaces) — every boundary edge on a thin shell is non-manifold by design, so the operator eats ring after ring of faces. Toolbox is now an explicit opt-in rather than the automatic preference. Saved configs that had Fix Manifold on migrate to Fill Holes (not 3D Print Toolbox); users who want the Toolbox can re-select it.
  • Protect UV Seams now defaults on. The earlier "off" default was based on a misdiagnosis (seam protection was blamed for texture damage that actually came from the 3D Print Toolbox). Saved configs that had it off are force-migrated to on.
  • Dependency status label for the 3D Print Toolbox removed from the main panel. The plugin is now named only inside the Manifold Fix radio row — users who don't care about it see it simply as a disabled option.
  • Decimate step now triangulates the input up front and runs COLLAPSE with use_collapse_triangulate=False. The previous flow applied dissolve_limited first (which produced n-gons) and then let each COLLAPSE pass re-triangulate, inflating the face count on pass 1 and making multi-pass at aggressive ratios overshoot the UI estimate (see Fixed). The Dissolve Angle setting is removed; the Planar Pre-Pass (governed by Planar Angle) covers flat-region merging.