Skip to content

feat(showcase): add grain-sacks - #252

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

TMHSDigital merged 1 commit into
mainfrom
feat/showcase-grain-sacks

Conversation

@TMHSDigital

Copy link
Copy Markdown
Owner

Adds showcase/grain-sacks, a pile of three burlap grain sacks. Two stand and one lies slumped in front. Each is gathered at the neck under a two-turn twine tie with a pleated crown, settled onto a flat base, and pressed into its neighbour.

Selection: it is the first unclaimed candidate in the ROADMAP pool now that rope-bridge has shipped. It is a prop, so it goes in showcase. There were no open PRs; the only feat/showcase-* refs are 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: contact patch (exit 19)

A sack full of grain settles onto a flat patch. An egg-bottomed sack still touches the floor at one vertex, so both zmin and the per-sack support gate pass it. The check sums, per sack, the area of faces lying flat on the floor.

  • Default: 0.035 / 0.099 / 0.117 m², against a 0.012 floor.
  • --round-bottom: keeps the same sink and fold height and every sack's single lowest point on the floor. It exits 19 with every patch at 0 while zmin and the supports pass. live-run-proven

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

default --skip-decimate --stray-vert --lift-z --float-sack --slip-tie --loose-tie --part-sacks --round-bottom --high-belly --output
4.5.11 0 9 15 16 16 17 18 18 19 19 —
5.1.2 0 9 15 16 16 17 18 18 19 19 —
5.2.1 0 9 15 16 16 17 18 18 19 19 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-sack named supports worst 0.012 16
--slip-tie tie in the neck waist margin −13.4 to −44.6 mm (need ≥ +8) 17
--loose-tie tie seat band −1.67 mm 18
--part-sacks press between sacks −4.0 mm 18
--round-bottom contact patch 0 m² × 3 19
--high-belly settled belly 0.535–0.586 of the body (max 0.42) 19

Envelope: every falsifier stays inside the 20 mm BBOX_TOL. The worst cases are --high-belly at −16.2 mm in Y and --part-sacks at +15.5 mm in Y. live-run-proven

Checks run locally

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

  • tests/smoke/run_example.py --forbid-skip: [PASS] grain-sacks 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 (30 showcase pieces)

    All pass. live-run-proven

  • Determinism: every measured line is byte-identical across 4.5.11, 5.1.2 and 5.2.1, including both LOD counts and the glTF byte count. The piece uses no RNG at all. Check-only wall-clock is about 1.7–2.1 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.

Findings the budgets and inspection forced

  • Coplanar pairs. The coplanar budget counted 2 cross-shell pairs: a twine face lay parallel to the cloth face it hugs, one column over. The tie turns now sit a quarter step off the body's columns, and the count is 0.
  • Waist measure. The first waist measure (narrowest axial bin) read 32.6 mm off on the lying sack, whose rings straddle bins. It was replaced by a local-minimum test: the host under the tie must be ≥ 8 mm narrower than 40 mm either side. The probe band was widened to ±12 mm after an empty band read as radius 0.
  • Collider. The per-sack hull sampled in shell traversal order (1336 tris). It now strides rings and columns in build order and comes to 376 tris.
  • Draft render, round 1:
    • The 6 mm weave aliased into moiré, so the period is now 12 mm with a softer bump.
    • The stripes sat on the standing sacks' hidden face, so each sack now has a front and the cloth coordinate is centred on it. inspection-only

Visual gates

Contact sheet: docs/gallery/contact-sheets/grain-sacks-contact-sheet.webp

criterion grain-sacks calibration verdict
mean luminance 0.2513 0.151–0.302 in band
stage darkness 0.2282 0.145–0.236 in band
wedge warmth +0.185 −0.43 … +0.37 warm
saturation 0.123 0.144–0.231 just under the set; in line with the timber/cloth showcase peers (0.09–0.136)
subject fill 0.789 tall — passes the framing gate, min margin 0.072
thumbnail legibility — — three tied sacks read at tile size

Asset sheet: docs/gallery/asset-sheets/grain-sacks.webp. Verdict: passes. Rendered alone under neutral light, the pile carries more than the rocket or the arm: weave, pleated crowns, twine ties and stripes. It sits level with the hydrant. The helper's standard camera clips the lying sack's base at the panel edge; that is the helper's framing rule, not the model. inspection-only

Close-ups (neck ties, sack-to-sack press, ground contact, back, top, and a clay pass of each): the ties hug the pleated necks, the bases sit flat, and the press reads as a clean seam. There is no z-fight speckle and no faceting on the bodies. The crown tip is slightly pointed, which I judged acceptable. 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/grain-sacks/index.html. inspection-only

🤖 Generated with Claude Code

Grain sacks were the next unclaimed showcase candidate. What an envelope
check cannot see on a sack is whether it has settled: an egg-bottomed
sack still touches the floor at its lowest vertex, so zmin and the
per-sack support gate both pass it. The piece sums the flat-on-floor face
area under each sack, and --round-bottom exits 19 with every patch at 0
while zmin and the supports still pass.

Also asserts each twine tie sits in its neck's waist, bites the cloth by
a banded depth, and that the sacks press into one another and carry their
belly low, 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 0c08b89 into main Sep 25, 2026
14 checks passed
@TMHSDigital
TMHSDigital deleted the feat/showcase-grain-sacks branch September 25, 2026 19:01
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