s&box/field-guide
the symptom, in your words

"Decimating AI meshes without wrecking them"

✓ verified on engine 26.07lane: Getting art inposted
▸ SYMPTOM
  • Scene hitching / huge triangle counts with "only" mid-poly AI props.
  • After decimation, thin features (umbrella domes, wheels) collapse into junk.
  • Re-exported mesh compiles untextured even though the albedo still exists.
▸ CAUSE

AI-generator deliveries often cap every asset at ~7–12k tris regardless of screen size. The worst offender is usually the most-instanced asset, not the densest file:

snippet
11.4k grass tuft × ~1150 instances ≈ 13M scene tris

Collapse decimation preserves painted UVs fine — silhouette is the failure mode. Thin/curved features die below ~2k tris; high-instance scatter clumps tolerate aggressive cuts because faceting is invisible at their screen size.

Scripted OBJ export with export_materials=False drops usemtl as well as the .mtl, so vmdl remaps miss and the mesh compiles untextured.

▸ FIX
  1. Census before tooling: for each asset, compute tris × instance_count. Budget by screen size × instances, not file size alone.
  2. Decimate (collapse) with budgets weighted by category. Verify with a textured before/after render on one complex prop before batching.
  3. After export, grep for usemtl and vt . If usemtl is missing, inject usemtl <name> before the first f line — prefer injection over re-enabling material export (which can write a stray .mtl into a delivery folder).
  4. Keep the both-names material remap in the vmdl pointed at the existing painted albedo vmat.

Rough guidance (tune per art direction):

Asset roleDecimation tolerance
Scatter / ground clutter (high instance)Aggressive
Hero / mid-ground props with thin silhouettesConservative — stop when dome/wheel edges break
▸ WHY IT WORKS

GPU cost tracks transformed triangles in the frame, so instance count multiplies as hard as mesh density. UV-preserving collapse keeps the AI bake readable; visual failure is geometric (silhouette), which is why a textured screenshot beats a raw tri count as the acceptance test. Preserving usemtl keeps ModelDoc's material group name aligned with your remap keys.

Verified on engine 26.07 — seen in a real project.
s&box moves fast; an undated fix is a liability. Spot a stale detail?