Skip to content

fix: showcase quality pass — stone-well and cart - #171

Merged
TMHSDigital merged 3 commits into
mainfrom
showcase/well-cart-quality-pass
Sep 16, 2026
Merged

TMHSDigital merged 3 commits into
mainfrom
showcase/well-cart-quality-pass

Conversation

@TMHSDigital

Copy link
Copy Markdown
Owner

Showcase visual quality pass: stone-well + cart

Second quality pass under the showcase visual-quality procedure (first was #170, hay-bale + hitching-post). Both pieces went from "passes budgets" to "actually looks right" via an inspection-sheet review: six orthos, two material three-quarter views, clay pass, wireframe overlay, joint close-ups, and a ground-contact close-up, all rendered headless on 5.2.1 into .scratch/ (untracked).

stone-well

Defects found (view that revealed each)

  1. Curb floated ~2.5 cm above the top masonry course — visible daylight ring; front ortho + curb-rim close-up.
  2. Windlass stubs ended buried inside the posts — the axle never visibly entered its bearings; windlass-post close-up.
  3. Crank was a capped stub — no arm, no grip, unreadable as a windlass crank; three-quarter material view.
  4. Roof peak was an open pit — shingle courses met at a hole; top ortho + peak close-up.
  5. Bucket was sealed shut (capped cone) and its hoops ignored the wall taper — three-quarter + bucket close-up.
  6. Bail handle floated off the bucket rim — legs touched nothing; bucket close-up.
  7. Rope ended above the handle, attached to nothing — rope-bucket close-up.
  8. Every stone identical — instant CG read in all views.
  9. Flat single-color materials, no roughness variation or wear — material three-quarter.
  10. Razor edges on all woodwork — clay pass.
  11. N-gon caps on every cone primitive — wireframe overlay.

Generator changes (structural, not nudges)

  • Curb Z is now derived from MASONRY_TOP (computed from course count × course height), so the curb seats on the masonry no matter how the dimensions change.
  • Windlass length extended to pass through both posts and protrude; posts carry real bearing holes by construction.
  • Crank rebuilt as an arm + grip assembly off the windlass end.
  • Peak cap added at the roof apex, derived from the roof geometry.
  • Bucket rebuilt as a manifold open vessel: tapered inner/outer walls, rim ring, floor slab; hoops placed from the taper function so they sit on the wall at their Z.
  • Bail handle legs pinned at the rim radius; rope terminated at the bail bar.
  • Deterministic per-stone width/radial jitter via a fixed-seed hash01 (no RNG state; identical across reruns — verified).
  • Small bevels on structural wood (posts, beam, fascia); cap_tris=True on all cone primitives (n-gons now 0).
  • Fascia corner joints changed from exact butt joints to an embedded overlap, eliminating 56 doubled vertices at the corners.
  • All three materials gained noise-textured roughness/color variation and edge wear.
  • Slot assignment rewritten to be index-preserving. obj.data.materials.clear() resets every polygon.material_index to 0 on 5.2.1 — the piece rendered single-material while the slot-count check still passed. The new per-material face-floor budgets (exit 5) catch this class permanently.

New hygiene budgets (measured 4.5.11 / 5.1.2 / 5.2.1)

Budget Declared Measured
Hygiene (loose V/E, non-manifold, zero-area, doubles @1e-5, n-gons) all 0 0 / 0 / 0 on every axis
Grounded zmin |zmin| ≤ 1e-4 0.0000 / 0.0000 / 0.0000
Material-island BVH gap (stone↔wood, metal↔wood) ≤ 0.008 m 0.00000 all pairs, all binaries
Material face floors stone ≥ 3000, wood ≥ 600, metal ≥ 100 met on all binaries

Exit codes (4.5.11 / 5.1.2 / 5.2.1)

  • default: 0 / 0 / 0
  • --skip-decimate: 9 / 9 / 9 (violates the LOD1 ratio band)
  • --lift-z: 16 / 16 / 16 (violates the grounded-zmin budget)

Triangles

Base 8388 → 9380 (crank, peak cap, open bucket, bevels); collider 230 → 306 (ceiling raised 260 → 320 accordingly). LOD2 0.2198 of base on all three series.

Rounds

Two: round 1 found the eleven defects above; round 2 verified every fix on a fresh sheet.

cart

Defects found (view that revealed each)

  1. Axle interpenetrated the bed floor — bottom ortho + axle-bed close-up.
  2. Shafts poked through the bed floor — bed-interior close-up.
  3. Corner plates buried inside the wall corners, invisible — top ortho + bed-interior close-up.
  4. Shaft straps floated, aligned to nothing — shaft-root close-up.
  5. Back wall same height as side walls — no tailgate read; side ortho.
  6. Wheels were torus-profiled — round pipe treads instead of flat iron tyres; wheel close-up + clay pass.
  7. Spokes floated at both ends — hub-spoke close-up.
  8. Flat single-color materials — material three-quarter.
  9. N-gon caps on cylinder primitives — wireframe overlay.

Generator changes (structural, not nudges)

  • Bed Z is now derived from the axle: bolsters (real beams) sit on the axle and carry the bed, so the axle can never intersect the floor regardless of dimension edits.
  • Shafts dropped to run beside the bed edge and angle down to hitch height; straps aligned to the bed bottom plane.
  • Corner plates moved onto the bed top at the corners.
  • Back wall rebuilt as a lower tailgate (TAILGATE_H); side and front walls flush at WALL_H.
  • Wheels rebuilt with add_ring: flat-tread wooden felloes and flat iron tyres; spokes embedded into hub and felloe at both ends.
  • Noise/wear variation on both materials; cap_tris=True everywhere (n-gons now 0).

New hygiene budgets (measured 4.5.11 / 5.1.2 / 5.2.1)

Budget Declared Measured
Hygiene (loose V/E, non-manifold, zero-area, doubles @1e-5, n-gons) all 0 0 / 0 / 0 on every axis
Grounded zmin |zmin| ≤ 1e-4 0.0000 / 0.0000 / 0.0000
Material-island BVH gap (metal↔wood) ≤ 0.008 m 0.00000 on all binaries
Material face floors metal ≥ 24, wood ≥ 800 met on all binaries

Exit codes (4.5.11 / 5.1.2 / 5.2.1)

  • default: 0 / 0 / 0
  • --skip-decimate: 9 / 9 / 9 (violates the LOD1 ratio band)
  • --lift-z: 16 / 16 / 16 (violates the grounded-zmin budget)

Triangles

Base 2572 → 2600; collider 306 → 122 (the hull no longer contains the interpenetrating shafts/axle geometry). LOD2 is 0.2200 on 4.5.11/5.1.2 and 0.2154 on 5.2.1 — the ratio band absorbs the cross-series DECIMATE difference, as documented.

Rounds

Two: round 1 found the nine defects above; round 2 verified every fix on a fresh sheet.

Convention change

showcase/README.md gains the material face-floor convention: every declared material asserts a named minimum polygon count recomputed from polygon.material_index, and slot assignment must be index-preserving (never materials.clear() + rebuild, which wipes indices to 0 on some versions while the slot count still passes). Existing hygiene/grounded/gap conventions already covered the rest of this pass.

Evidence notes

  • All exit codes and measured values above are from live headless runs on .scratch/blender-4.5.11-windows-x64, .scratch/blender-5.1.2-windows-x64, and .scratch/blender-5.2.1-windows-x64 (binary-reported versions).
  • Determinism: stone-well default run twice on 5.2.1, measured lines byte-identical.
  • Heroes re-rendered on 5.2.1; check_framing passes both (well: fill 0.861, min margin 0.033; cart: fill 0.806, min margin 0.044). No deviation= used.
  • Gallery regenerated via scripts/build_gallery.py; generated HTML for both detail pages and the index cards read back and verified (witness strings, alt text, × entities). The rebuild also picks up stale iron-cauldron detail-page drift whose README landed without a gallery regen.
  • Inspection sheets live in .scratch/inspect/ (untracked, per procedure).

TMHSDigital and others added 3 commits September 15, 2026 21:21
Quality pass on the stone-well generator after an inspection-sheet
review found the curb floating above the masonry, windlass stubs buried
in the posts, a crank that was a capped stub, an open pit at the roof
peak, a sealed bucket with hoops that ignored the taper, a bail handle
floating off the rim, and a rope that ended above the handle.

Structural fixes in the generator: curb Z derived from the masonry top,
windlass lengthened to pass through both posts, a real crank arm and
grip, a peak cap, a manifold open bucket with tapered walls and hoops
that follow it, bail legs pinned at the rim, rope terminated at the
bail bar. Deterministic per-stone jitter, bevels on structural wood,
noise/wear on all three materials, cap_tris everywhere to kill n-gons.

New budgets: hygiene (loose/non-manifold/zero-area/doubles/ngons all
zero, exit 15), grounded zmin (exit 16, --lift-z falsifier), BVH
material-island gaps (exit 17), per-material face floors (exit 5) that
catch the materials.clear() index-wipe class. Slot assignment is now
index-preserving. Hero re-rendered; framing gate passes.

Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Quality pass on the cart generator after an inspection-sheet review
found the axle interpenetrating the bed floor, shafts poking through
the bed, corner plates buried inside the wall corners, shaft straps
floating off the bed, inconsistent wall heights, torus-profile wheels
with round pipe treads, and spokes floating at both ends.

Structural fixes in the generator: bed Z derived from the axle top via
real bolster beams, shafts dropped to run beside the bed edge and angle
down, corner plates moved onto the bed top, straps aligned to the bed
bottom, a lower tailgate, flat-tread felloes and iron tyres built as
rings, spokes embedded at hub and felloe. Noise/wear on both materials,
cap_tris everywhere to kill n-gons.

New budgets: hygiene (loose/non-manifold/zero-area/doubles/ngons all
zero, exit 15), grounded zmin (exit 16, --lift-z falsifier), BVH
metal-wood gap (exit 17), wood face floor (exit 5). Hero re-rendered;
framing gate passes.

Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Adds the material face-floor convention to the showcase README: every
declared material asserts a named minimum polygon count recomputed from
polygon.material_index, which catches the slot-assignment wipe class
(materials.clear() resets material_index to 0 on some versions while
the slot count still passes). Slot assignment must be index-preserving.

Refreshes the stone-well and cart witness strings in
showcase/gallery.json for the quality-pass numbers and regenerates
docs/gallery. The regeneration also picks up iron-cauldron detail-page
drift whose README landed without a gallery rebuild.

Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@TMHSDigital TMHSDigital added the needs-5.1 Opt-in Blender 5.1 smoke on this PR. Default matrix stays 4.5 + 5.2. Auto-label will not apply this. label Sep 16, 2026
@github-actions github-actions Bot added the documentation Improvements or additions to documentation label Sep 16, 2026
@TMHSDigital
TMHSDigital merged commit bc0ac6c into main Sep 16, 2026
13 checks passed
@TMHSDigital
TMHSDigital deleted the showcase/well-cart-quality-pass branch September 16, 2026 01:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation needs-5.1 Opt-in Blender 5.1 smoke on this PR. Default matrix stays 4.5 + 5.2. Auto-label will not apply this.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant