Repository navigation
v1.8.0
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_singlewas callingnormals_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-objectFix Geometrynormal recalculation (gated behind theRecalculate Normalstoggle) 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 Fixaway from the 3D Print Toolbox (see Changed). The smears were a downstream artifact of the Toolbox'sclean_non_manifoldoperator tearing UV islands apart on thin-shell meshes; with the default changed toFill 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_limitedpre-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 withuse_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
Passessetting 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 hitstart_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 Seamstoggle on the Decimate step, default on. A temporaryAIOPT_Seam_Protectvertex 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 withinvert_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-Passtoggle on the Decimate step, default on, with aPlanar Angleslider (default 5 deg). Runs a DECIMATE modifier inDISSOLVE(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'sdelimit={'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-Passto preserve it. Fix Manifoldboolean replaced withManifold Fixenum (Off/Fill Holes/3D Print Toolbox, defaultFill Holes). The 3D Print Toolbox'sclean_non_manifoldoperator 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 hadFix Manifoldon migrate toFill Holes(not3D Print Toolbox); users who want the Toolbox can re-select it.Protect UV Seamsnow 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 applieddissolve_limitedfirst (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). TheDissolve Anglesetting is removed; thePlanar Pre-Pass(governed byPlanar Angle) covers flat-region merging.