Skip to content

feat(showcase): add brazier - #253

Merged
TMHSDigital merged 1 commit into
mainfrom
feat/showcase-brazier
Sep 25, 2026
Merged

TMHSDigital merged 1 commit into
mainfrom
feat/showcase-brazier

Conversation

@TMHSDigital

Copy link
Copy Markdown
Owner

Adds showcase/brazier: a spun-iron fire bowl with a rolled rim on three forged legs, holding a bed of ash and a heap of 36 broken, glowing charcoal lumps. Each leg is one sweep from the bowl wall to a curled foot.

Selection: it is the first unclaimed candidate in the ROADMAP pool now that grain-sacks has shipped. It is a prop, so it goes in showcase. There were no open PRs; the only feat/showcase-* ref is already-merged work.

Binaries (all local, .scratch/):

  • blender-4.5.11-windows-x64, reports Blender 4.5.11 LTS
  • blender-5.1.2-windows-x64, reports Blender 5.1.2
  • blender-5.2.1-windows-x64, reports Blender 5.2.1 LTS

The budget that matters: tip angle (exit 19)

A brazier holds burning coals, so it must not tip when knocked. Legs tucked in under the bowl still reach the floor and still fit the bowl's bounding box, so no envelope check can see the difference.

The piece recomputes stability from the mesh:

  • Mass centre: signed tetrahedra over every closed shell, each weighted by its material's density (iron 7850, coal 500, ash 600 kg/m³).
  • Support polygon: the plan hull of the leg vertices on the floor.
  • Tip angle: atan(d_edge / z_com).

Default: 51.9 kg, mass centre on the axis at 0.466 m, 154 mm inside the support edge, 18.30° against a 13° floor. --tuck-legs brings the feet in to 0.15 m of the axis while they still ground and the envelope is unchanged. It exits 19 at 10.23°, with every other budget passing. live-run-proven

Falsifiers: exit codes per binary (live-run-proven)

default --skip-decimate --stray-vert --lift-z --float-foot --short-legs --float-coals --overfill --tuck-legs --pile-coals --uniform-coals --output
4.5.11 0 9 15 16 16 17 18 18 19 20 21 —
5.1.2 0 9 15 16 16 17 18 18 19 20 21 —
5.2.1 0 9 15 16 16 17 18 18 19 20 21 0
Flag Target budget Measured Exit
--skip-decimate LOD1 ratio 1.0000 9
--stray-vert hygiene loose_v 1 15
--lift-z grounded zmin 0.050 16
--float-foot named feet worst 0.012 16
--short-legs leg-to-bowl bite −10.0 mm 17
--float-coals coal seat −13.9 to −23.3 mm 18
--overfill freeboard 8.3 mm (floor 30) 18
--tuck-legs tip angle 10.23° (floor 13°) 19
--pile-coals coal interpenetration 40 pairs 20
--uniform-coals coal size spread 1.198 (floor 1.35) 21

Envelope: every falsifier leaves the AABB unchanged. live-run-proven

Checks run locally

  • tests/check_falsifier_targets.py: static check passes. --run <BLENDER> --only brazier passes all 10 on each of the three binaries. live-run-proven

  • tests/smoke/run_example.py --forbid-skip: [PASS] brazier on 4.5.11, 5.1.2 and 5.2.1. live-run-proven

  • Other local checks:

    • check_exit_code_readme, check_import_export_rules, check_engine_id, check_gallery_images, test_harness
    • the inline validate-manifest and validate-counts jobs, run in a clean worktree (31 showcase pieces)

    All pass. live-run-proven

  • Determinism: every budget value is byte-identical across 4.5.11, 5.1.2 and 5.2.1, including both LOD counts. The only difference is the glTF byte count: 450936 on 5.2.1 against 450940 on the others, which is exporter metadata. There is no RNG. Check-only wall-clock is about 2.0–2.4 s. live-run-proven

  • Ecosystem drift check is a remote action, so it is CI-proven only. The 4.5 / 5.1 / 5.2 smoke jobs are CI-proven on this PR.

Fix cycles (live-run-proven unless marked)

  • Coal count. --overfill, --pile-coals and --uniform-coals first exited 4 or 5 (triangle band, face floor) instead of 18 / 20 / 21. The packer placed as many coals as fit, so every falsifier that changed the space changed the count. I fixed the model rather than the bands: the heap is a fixed N_COALS = 36, and the uniform draw is one size at which the whole heap still fits.
  • Coplanar pair. The coplanar budget found 1 cross-shell pair: two buried underside triangles on neighbouring lumps, 0.2° apart in normal and 0.04 mm in plane. Each lump now tumbles a closed-form few degrees, and the count is 0.
  • Stale face references. A dict keyed by BMFace answered for the wrong face after create_icosphere(subdivisions=2) reallocated faces (a KeyError on a dead vertex). UV islands now live in a face int layer, with provisional UVs in the loop layer.
  • Draft renders. These changes were judged by eye: inspection-only
    • The fire light blew the ash out white, so it is now dimmer and further away, and the ash is darker.
    • The coals were sparse, so they are now packed by each lump's own plan radius.
    • The crack glow was an even honeycomb, so it is now noise-masked.
    • The house wedge landed on the back wall (warmth −0.002). It is now a soft spot aimed at the floor behind the legs.

Visual gates

Contact sheet: docs/gallery/contact-sheets/brazier-contact-sheet.webp

criterion brazier calibration verdict
mean luminance 0.2192 0.151–0.302 in band
stage darkness 0.2352 0.145–0.236 in band
wedge warmth +0.108 −0.43 … +0.37 warm
saturation 0.174 0.144–0.231 in band
subject fill 0.794 tall — passes the framing gate, min margin 0.094
thumbnail legibility — — a glowing bowl on three legs reads at tile size

Asset sheet: docs/gallery/asset-sheets/brazier.webp. Verdict: passes.

  • Rendered alone under neutral light, it shows rusted, rough iron (not chrome), a rolled rim, forged scroll feet and a glowing heap.
  • It sits with the hydrant and jerry can, above the rocket and arm.
  • The helper's fixed camera runs the front leg off the panel's bottom edge; that is its framing rule, not the model.

inspection-only

Close-ups (clay leg joint, feet, heap, underside, rim, side): the legs enter the bowl underside cleanly, and the toes curl as forged scrolls. There is no z-fight speckle and no faceting on the spun bowl. Coals still show some ash between elongated lumps, which I accepted. inspection-only

The hero was rendered on 5.2.1 through scripts/render_hero.py, and build_gallery.py was run last. I read the generated alt text and witness callout in docs/gallery/index.html and docs/gallery/brazier/index.html. inspection-only

🤖 Generated with Claude Code

A brazier was the next unclaimed showcase candidate. What an envelope
check cannot see on it is whether it would tip when knocked: legs tucked
in under the bowl still reach the floor and still fit its bounding box.
The piece recomputes a density-weighted mass centre from the closed
shells and the support polygon from the feet on the floor, and asserts
the tip angle; --tuck-legs exits 19 at 10.2 degrees while every other
budget passes.

Also asserts the legs bite the bowl, the coals sit in the ash below the
rim without interpenetrating and vary in size, each with a falsifier
proven on 4.5.11, 5.1.2 and 5.2.1.

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 25, 2026
@github-actions github-actions Bot added showcase Budget-conformance props under showcase/ documentation Improvements or additions to documentation labels Sep 25, 2026
@TMHSDigital
TMHSDigital merged commit 35aa8fb into main Sep 25, 2026
14 checks passed
@TMHSDigital
TMHSDigital deleted the feat/showcase-brazier branch September 25, 2026 19:43
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. showcase Budget-conformance props under showcase/

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant