Skip to content

fix: wall-torch, tavern-stool and vertex-color-ao quality pass - #241

Merged
TMHSDigital merged 4 commits into
mainfrom
fix/quality-pass-torch-stool-vcao
Sep 24, 2026
Merged

TMHSDigital merged 4 commits into
mainfrom
fix/quality-pass-torch-stool-vcao

Conversation

@TMHSDigital

Copy link
Copy Markdown
Owner

Quality pass: three items (two showcase pieces, one gallery example). Everything below comes from live runs on .scratch/blender-{4.5.11,5.1.2,5.2.1}-windows-x64/blender.exe, which report 4.5.11 LTS / 5.1.2 / 5.2.1 LTS, unless it is labelled inspection. Baselines were taken on the pristine tree before any edit.

Picks.

  • Track A: wall-torch and tavern-stool, two of the last four showcase pieces with only the old-era pass.
  • Track B: vertex-color-ao, which the last run's report flagged as dark and muddy. swatch-grid was the other candidate. Its flat orange sphere is its emission swatch, which is the contract, so it was left alone.
  • Track C: none. Every pathology and sidecar example has been reviewed.

A: showcase/wall-torch

Took 3 inspection rounds.

  • Round 1 rebuilt the sconce.
  • Round 2 darkened the stone and fixed my inspection registry, whose joint shots had pointed at a removed constant.
  • The hero pass then re-framed the camera, and trimmed the wedge light to bring luma back inside the band.

Defects

  1. The wall plate was buried in the masonry (ortho_back, round 0 hero). It was seated on the backing slab, 4 mm behind the face of the stones laid over it, so only the four bolt heads showed. The plate-to-plaque gap budget passed because the plate still touched the slab.
  2. It was not a torch (ortho_left, ortho_back, three_quarter_b, hero). It was a flame on a solid frustum cup, and the haft was a 26 mm stub hidden by the flame. It read as a brazier.
  3. The arm drooped 20 mm from plate to cup (ortho_left).
  4. The flames were three faceted cones that rendered as pale traffic cones (three_quarter_b).
  5. The stone and the grout were one flat grey, so the courses barely read (three_quarter_b). The iron was metallic 0.88, roughness 0.38.
  6. Hero: 14 m stage. Temp .glb leak. Stone bevel input unsorted.

Fixes, and why each is structural

  • 1: The plate's seat is derived from the proudest face, stone_face_y() − PLATE_BITE. It follows the stone depth if that changes.
  • 2: The sconce is rebuilt on one axis that leans 15° out from the wall:
    • an open, walled cup, with a floor thick enough that its four horizontal planes sit at least 2.5 mm apart (the first try measured 8 z-fight pairs between the haft foot and the floor);
    • a drip boss under the cup;
    • a 0.20 m haft standing on the cup floor;
    • a pitch wrap, as a new fifth material slot with its own face floor.
  • 3: The cup's mid-height is defined as the arm's height, so the arm is level by construction.
  • 4: Lathed teardrop flames, which always stand upright and are seated in the wrap.
  • 5: Seeded per-stone tone with a darker mortar tone on the backing slab, isotropic mottling and speckle roughness. Dark rusted iron.
  • 6: 60 m stage. Export deleted after it is measured. Bevel input sorted. The camera was moved back to fit the taller silhouette, because the framing gate caught it touching the top edge.

New budgets, identical on all three binaries:

Budget Band Measured
Arm level (exit 20): arm shell's long axis vs horizontal ≤ 1.0° 0.000°
Plate seat (exit 21): plate front proud of the facing stones / plate back into their face ≥ 0.008 / 0.001–0.005 m 0.01300 / 0.00300
Bake texel density (exit 22): smallest UV cell in baked texels ≥ 12 px 27.71 (1024 px)

The plate-to-stone gap (18) now measures to any stone shell, not only the slab. It reads 0.00057.

Triangles: 1528 → 2004 (band re-fitted from 1400–1700 to 1800–2250). Envelope 0.304 × 0.293 × 0.424 → 0.304 × 0.322 × 0.485 m. Collider 60 → 116. Hygiene all zero, z-fight 0. Same-binary deterministic: two full matrix runs printed identical default measurements.

Falsifiers, identical on all three binaries:

  • --droop-arm → 20 (9.580°).
  • --sink-plate → 21 (proud −0.00400, seat 0.02000).
  • --low-bake → 22 (6.93 px).

Existing exit codes, before → after, identical on all three: default 0→0, --skip-decimate 9→9, --stray-vert 15→15, --lift-z 16→16, --float-arm 17→17, --float-plate 18→18, --skinny-plaque 19→19.

--float-plate first landed on 17. It dragged the arm root off with the plate, and the shortened arm fell below the arm classifier. The arm root now stays at the seated plate.

Hero: check_framing without deviation= passes (fill y 0.733). Contact sheet: docs/gallery/contact-sheets/wall-torch-contact-sheet.webp. Luma 0.299 (band 0.151–0.305; the first relit hero measured 0.310 and the wedge was trimmed), stage 0.267, warmth +0.432, saturation 0.266.

A: showcase/tavern-stool

Took 1 inspection round on the geometry. A second fix came from the hero itself.

Defects

  1. No leg stood in its ferrule (joint_foot0–3, ground_contact). Each leg ended 3 mm above a vertical, bottomless ring on the floor, with a 1 mm air gap around the foot, lopsided on the splayed legs. The old "ferrule bite" band of −0.005..0 m was measuring that gap.
  2. All four stretchers sat at one height, so their tenons met inside each leg (ortho_*).
  3. One flat brown on every member, and bright chrome ferrules (0.50 grey, metallic 1.0, roughness 0.32).
  4. Dark slivers on the legs above the ferrules (hero crop only). They are not in the inspection renders, which carry no normal map. The cause was bake density: about 1,700 UV cells in a 256 px bake is about 6 px per cell, and the render's bilinear lookup reads the next cell's normals across the border. A 60 mm cage extrusion made it worse.
  5. Hero: 14 m stage. Temp .glb leak.

Fixes

  • 1: Each foot is now a stack:

    • a ferrule sleeve lofted on the leg's own axis, its inner radius a named grip (1.2 mm) inside the leg's end radius;
    • the sleeve's raked bottom rim buried 6 mm in a level, chamfered iron tread, centred where the leg axis crosses the tread's top;
    • the leg end inside the sleeve, 4 mm above the tread along its axis.

    All of it is derived from the leg's own stations, per the "level sole on a raked leg" convention.

  • 2: The front-back and side stretchers sit at STRETCH_T and STRETCH_T2.

  • 3: Per-member wood tone and grain; dark rusted iron.

  • 4: A 1024 px bake with a 10 mm cage, locked in as a budget.

  • 5: 60 m stage. Export deleted after it is measured.

New or changed budgets, identical on all three binaries:

Budget Band Measured
Ferrule grip (exit 18, replaces the clearance band): leg radius where the sleeve wraps it, less the sleeve's inner radius, radially about the leg's principal axis; 4 sleeves 0.0006–0.0025 m 0.00120
Foot stack (exit 20): leg end above tread top / sleeve bottom buried below it; 4 legs, 4 treads ≥ 0.0005 / ≥ 0.001 m 0.00113 / 0.00943
Bake texel density (exit 21) ≥ 12 px 22.43 (1024 px)

Triangles: 2528 → 3040 (band re-fitted from 2300–3200 to 2750–3350). Collider 396 → 468. Hygiene all zero. Same-binary deterministic.

Falsifiers, identical on all three binaries:

  • --pipe-ferrule → 18 (grip −0.00011).
    • It now keeps the treads. On the first try it dropped them and landed on 4, the triangle band.
  • --sink-legs → 20 (leg above tread −0.00887).
    • On the first try it landed on 18. The grip was a nearest-face signed distance, which misreads points in an open sleeve's hollow (+0.0155); it is now radial about the leg's axis.
  • --low-bake → 21 (5.61 px).

Existing exit codes, before → after, identical on all three: default 0→0, --skip-decimate 9→9, --stray-vert 15→15, --lift-z 16→16, --short-legs 16→16, --float-stretchers 17→17, --pipe-ferrule 18→18.

Hero: framing passes. Contact sheet: docs/gallery/contact-sheets/tavern-stool-contact-sheet.webp. Luma 0.182, stage 0.190, warmth +0.050.

B: examples/vertex-color-ao

Inspection (hero, clay, wireframe, close-ups of the apron, windlass and bucket):

  • The geometry holds up in clay.
  • The well is the asset the check bakes and measures, so it was not touched. The apron joints and the stepped base course are that asset.
  • The render was cold.
    • Blue fill and rim lit the whole stage: stage luma 0.243, brighter than every calibration stage, and warmth +0.008.
    • The warm wedge grazed floor the camera barely saw, and left a hard-edged patch on the back wall.

Presentation changes (render path only):

  • Fill and rim are near neutral and weaker.
  • The wedge is aimed from above at a named floor point behind the well, as the hero camera sees it (WEDGE_AT / WEDGE_POOL).
  • Energy trim. The first aimed version measured luma 0.328, above the band, and was trimmed.
  • Result: luma 0.274, stage 0.244, warmth +0.023.
  • README notes the rig change.

Contract unchanged. The bake, the checks and the exit codes are untouched. Before → after, identical on all three binaries: default 0 → 0, --falsify 0 → 0. --falsify renders the inverted-bake variant and exits 0 by design. Framing and asset-quality gates pass on the new hero.

Contact sheet: docs/gallery/contact-sheets/vertex-color-ao-contact-sheet.webp.

Also

  • showcase/README.md gains three conventions:
    • A fixture is bolted to the face it is seen on
    • A ferrule grips the leg on the leg's axis
    • Bake texels per UV cell
  • Gallery teaches, alt and witnessesFix text and the root README alts are updated. The gallery is regenerated, and the generated <img alt> was read back. The build rejected the first torch alt at 204 characters; it now fits the 200 limit.
  • tests/check_falsifier_targets.py: passed, 214 falsifiers across 28 pieces.
  • Not done:

🤖 Generated with Claude Code

TMHSDigital and others added 4 commits September 24, 2026 07:16
…real torch

The plate sat on the backing slab behind the stones with only its bolts
showing, and the "torch" was a flame on a solid cup. The plate now seats
on the stone face (exit 21), a level arm (exit 20) carries an open cup
holding a leaning haft with a pitch wrap and upright flames, mortar and
stones take separate tones, and the bake density is a budget (exit 22).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
Every leg ended 3 mm above an open vertical ring on the floor. Each foot is
now a sleeve on the leg's axis gripping it (exit 18, measured radially)
over a level tread (exit 20), stretchers are staggered, members take their
own wood tone, and a 1024 px bake with a texel budget (exit 21) removes the
dark slivers the 256 px bake left on the legs.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
Render path only. The blue fill and rim lit the stage cold and the wedge
grazed floor the camera barely saw; the rig is now near neutral with the
wedge pooled behind the well. Bake, checks and exit codes unchanged.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
…ake texels

Also refreshes the gallery cards and root README alts for the restaged
stills and regenerates docs/gallery.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.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 24, 2026
@github-actions github-actions Bot added examples Runnable smoke-gated examples under examples/ showcase Budget-conformance props under showcase/ documentation Improvements or additions to documentation labels Sep 24, 2026
@TMHSDigital
TMHSDigital merged commit eca1d96 into main Sep 24, 2026
14 checks passed
@TMHSDigital
TMHSDigital deleted the fix/quality-pass-torch-stool-vcao branch September 24, 2026 11:24
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 examples Runnable smoke-gated examples under examples/ 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. showcase Budget-conformance props under showcase/

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant