Skip to content

Commit e6a0d68

Browse files
TMHSDigitalclaude
andcommitted
fix(showcase): remodel iron-cauldron (chain, forged head, casting band, feet, cast-iron finish)
The #202 asset sheet read iron-cauldron as the least-designed object in its lineup: a smooth near-black pot on a bare rod under a turned wooden ball. Model (still 2 materials, all budgets kept): - a five-link chain (interlocked, alternating planes) replaces the hanging rod - a forged iron tripod head replaces the turned wooden crown - a raised casting band at the belly and three splayed stub feet on the pot - cast-iron material: the wear noise goes through a contrast ramp, so rust reads as blotches rather than a uniform tint, plus fine sand-cast pitting (render only) hook_bail_join now takes the lowest small iron shell as the hook; the chain links are small iron shells too but only meet each other. --float-hook still moves the hook and still lands on 17. Budgets (identical on 4.5.11, 5.1.2, 5.2.1): base 4180 tris (ceiling 4200), LOD1 0.5000 / LOD2 0.2196, collider 252 (<= 280), 2 materials (144 wood / 2116 metal faces), AABB unchanged, hygiene clean, pot clearance 0.0528. The first trim landed at 4192, and --short-legs's 12-tri shim then tripped the triangle budget (4) before the support check (16). The band was cut to 26 segments instead of widening the band. Proof (local .scratch Blender): all 8 README falsifiers land on their declared exits on 5.2.1 and 4.5.11 (check_falsifier_targets --run --only iron-cauldron); framing fill 0.750 ok; aq_ok. Hero, 640 card and preview regenerated with scripts/render_hero.py; contact sheet luma 0.1785 / stage 0.1715 (was 0.1767 / 0.1715, so the darker-than- calibration stage predates this change); asset sheet rebuilt: the pot now carries rust, band, bail and chain. Thin tripod still the sparsest silhouette in the lineup; judged a pass. Gallery alt text updated. Refs #345 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent fe0bd2f commit e6a0d68

10 files changed

Lines changed: 94 additions & 40 deletions

File tree

534 Bytes
Loading
220 Bytes
Loading
922 Bytes
Loading
2.45 KB
Loading

‎docs/gallery/index.html‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1099,7 +1099,7 @@ <h2><a class="stretch" href="tavern-stool/">Tavern Stool</a></h2>
10991099
</article>
11001100
<article class="card" data-tags="mesh export showcase" data-kind="showcase" data-category="village" data-name="iron-cauldron" data-search="iron cauldron iron-cauldron a procedural hanging iron cauldron with a round-bellied pot, a bail threaded through flat ear rings, and a timber tripod through uvs, bake, lod, collider, and unity gltf, asserting recomputed budgets rather than an api contract. mesh export showcase village">
11011101
<div class="card-media">
1102-
<img src="assets/iron-cauldron-hero-640.webp" srcset="assets/iron-cauldron-hero-640.webp 640w, assets/iron-cauldron-hero.webp 1280w" sizes="(min-width: 900px) 340px, (min-width: 560px) 50vw, 100vw" alt="A round-bellied black iron cauldron hanging by its bail from a tripod of wooden poles." width="1280" height="720" loading="lazy" decoding="async" />
1102+
<img src="assets/iron-cauldron-hero-640.webp" srcset="assets/iron-cauldron-hero-640.webp 640w, assets/iron-cauldron-hero.webp 1280w" sizes="(min-width: 900px) 340px, (min-width: 560px) 50vw, 100vw" alt="A rust-blotched cast-iron cauldron with a raised belly band, hanging by its bail and a short chain from a forged iron head atop a tripod of wooden poles." width="1280" height="720" loading="lazy" decoding="async" />
11031103
</div>
11041104
<div class="card-body">
11051105
<h2><a class="stretch" href="iron-cauldron/">Iron Cauldron</a></h2>

‎docs/gallery/iron-cauldron/index.html‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<meta property="og:image:alt" content="Four renders from the examples gallery: a red low-poly hatchback, a soccer ball, gold spikes aimed at a glowing sphere, and two spheres on pedestals labelled linked and unlinked" />
2020
<meta name="twitter:card" content="summary_large_image" />
2121
<meta name="twitter:image" content="https://tmhsdigital.github.io/Blender-Developer-Tools/gallery/assets/iron-cauldron-hero.webp" />
22-
<meta name="twitter:image:alt" content="A round-bellied black iron cauldron hanging by its bail from a tripod of wooden poles." />
22+
<meta name="twitter:image:alt" content="A rust-blotched cast-iron cauldron with a raised belly band, hanging by its bail and a short chain from a forged iron head atop a tripod of wooden poles." />
2323
<meta property="og:site_name" content="Blender Developer Tools" />
2424
<meta name="twitter:title" content="Iron Cauldron (iron-cauldron) — Showcase — Blender Developer Tools" />
2525
<meta name="twitter:description" content="A procedural hanging iron cauldron with a round-bellied pot, a bail threaded through flat ear rings, and a timber tripod through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract." />
@@ -49,8 +49,8 @@ <h1>Iron Cauldron</h1>
4949
</header>
5050
<main id="main">
5151
<nav class="pager" aria-label="Showcase pieces"><a rel="prev" href="../tavern-stool/" aria-label="Previous showcase piece: tavern-stool"><span aria-hidden="true">&larr;</span> tavern-stool</a><span class="pager-pos hud">24 of 76 showcase pieces<span class="pager-keys"> &middot; <kbd>&larr;</kbd><kbd>&rarr;</kbd></span></span><a rel="next" href="../wooden-ladder/" aria-label="Next showcase piece: wooden-ladder">wooden-ladder <span aria-hidden="true">&rarr;</span></a></nav>
52-
<button class="detail-hero" id="heroZoom" type="button" aria-label="View full size: A round-bellied black iron cauldron hanging by its bail from a tripod of wooden poles.">
53-
<img src="../assets/iron-cauldron-hero.webp" alt="A round-bellied black iron cauldron hanging by its bail from a tripod of wooden poles." width="1280" height="720" fetchpriority="high" />
52+
<button class="detail-hero" id="heroZoom" type="button" aria-label="View full size: A rust-blotched cast-iron cauldron with a raised belly band, hanging by its bail and a short chain from a forged iron head atop a tripod of wooden poles.">
53+
<img src="../assets/iron-cauldron-hero.webp" alt="A rust-blotched cast-iron cauldron with a raised belly band, hanging by its bail and a short chain from a forged iron head atop a tripod of wooden poles." width="1280" height="720" fetchpriority="high" />
5454
</button>
5555
<p class="zoom-hint">Rendered headless by the showcase piece itself. Select it to enlarge.</p>
5656
<div class="callout"><span class="tag">witnesses</span> Recomputed: 3664 tris, two materials with 224 wood and 1768 metal faces, UVs in 0..1 with zero AABB overlap, outer AABB 0.987×0.961×0.860 m, pot–leg clearance 0.053 m, pot base radius 0.075 m, 3 coaxial ferrules at zmin 0, ferrule bite −0.00185 m, hook-bail join 0, bail threads both ear rings, mesh hygiene all zero, LOD ratios in band, convex collider 246 tris, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z/--short-legs 16; --float-hook/--edge-on-ears 17; --pipe-ferrule 18; --pointed-pot 19.</div>
@@ -62,19 +62,19 @@ <h1>Iron Cauldron</h1>
6262
</div>
6363
<nav class="jumpnav" aria-label="On this page"><span class="tag">jump to</span> <a href="#run">Run</a> <a href="#exit-codes">Exit codes</a> <a href="#source">Source</a> <a href="#related">Related</a></nav>
6464
<section class="detail-section md">
65-
<p>A showcase piece, not an example. Procedural hanging cauldron (a round-bellied iron pot on a small flat base with a rolled rim, a pipe bail threaded through flat ear rings, timber tripod tenoned into a turned crown, iron ferrule cups coaxial with the poles) then the shipped pipeline: unique-cell UVs, Cycles high-to-low normal bake, LOD chain, convex collider, Unity glTF export.</p>
65+
<p>A showcase piece, not an example. Procedural hanging cauldron (a round-bellied cast-iron pot with a rolled rim, a raised casting band at the belly and three stub feet, a pipe bail threaded through flat ear rings and hung by a five-link chain, a timber tripod seated in a forged iron head, iron ferrule cups coaxial with the poles) then the shipped pipeline: unique-cell UVs, Cycles high-to-low normal bake, LOD chain, convex collider, Unity glTF export.</p>
6666
<p>Ferrules are lofted along the pole axis and shifted so the downhill rim sits at Z=0. A world-Z bucket lets a leaning pole slice the lip. <code>ferrule_bite</code> is measured in that same frame, and only samples wood inside the cup&#x27;s own axis span — a pole hovering above the well cannot fake a seat.</p>
6767
<p>It asserts <strong>budget conformance</strong> of the generated result. It does not witness an API contract. &quot;It rendered without error&quot; is not a check.</p>
6868
<p><strong>Composes</strong> skills <code>mesh-editing-and-bmesh</code>, <code>bake-high-to-low</code>, <code>depsgraph-and-evaluated-data</code>, <code>engine-export-presets</code>, and snippets <code>bake_normal_high_to_low.py</code>, <code>setup_bake_target_image.py</code>, <code>lod_chain.py</code> / <code>decimate_to_budget.py</code>, <code>convex_hull_collider.py</code>, <code>export_preset_unity.py</code> (helpers copied, not imported as a package).</p>
6969
<h2 id="budgets">Budgets<a class="anchor" href="#budgets" aria-label="Link to this section">#</a></h2>
7070
<p>Declared as named constants; every gate <strong>recomputes</strong> from the mesh, materials, UVs, evaluated LOD, collider, or export file.</p>
71-
<div class="table-wrap"><table><thead><tr><th scope="col">Axis</th><th scope="col">Declared</th><th scope="col">Measured (4.5.11 / 5.1.2 / 5.2.1)</th></tr></thead><tbody><tr><td>Base triangles</td><td>2800–4200</td><td>3664 / 3664 / 3664</td></tr><tr><td>LOD1 ratio</td><td>0.32–0.62 of base</td><td>0.5000 / 0.5000 / 0.5000</td></tr><tr><td>LOD2 ratio</td><td>0.10–0.35 of base</td><td>0.2200 / 0.2200 / 0.2200</td></tr><tr><td>Materials</td><td>exactly 2 distinct; ≥80 wood, ≥200 metal faces</td><td>2 slots; 224 / 1768</td></tr><tr><td>UVs</td><td>in <code>0..1</code>, AABB overlap ≤ 1e-5</td><td>in range, overlap 0</td></tr><tr><td>Outer AABB</td><td>(0.987, 0.961, 0.860) m ± 0.015</td><td>(0.9866, 0.9605, 0.8600), zmin 0</td></tr><tr><td>Collider tris</td><td>≤ 280</td><td>246</td></tr><tr><td>Export</td><td>written, size &gt; 0</td><td>287380 / 287380 / 287368 bytes</td></tr></tbody></table></div>
72-
<p>Base triangles rose from <strong>3388 to 3664</strong> in the quality pass: coaxial ferrule cups and a dual-wall lathe with a rolled rim replaced the old cone-tripod / overlapping-torus construction.</p>
71+
<div class="table-wrap"><table><thead><tr><th scope="col">Axis</th><th scope="col">Declared</th><th scope="col">Measured (4.5.11 / 5.1.2 / 5.2.1)</th></tr></thead><tbody><tr><td>Base triangles</td><td>2800–4200</td><td>4180 / 4180 / 4180</td></tr><tr><td>LOD1 ratio</td><td>0.32–0.62 of base</td><td>0.5000 / 0.5000 / 0.5000</td></tr><tr><td>LOD2 ratio</td><td>0.10–0.35 of base</td><td>0.2196 / 0.2196 / 0.2196</td></tr><tr><td>Materials</td><td>exactly 2 distinct; ≥80 wood, ≥200 metal faces</td><td>2 slots; 144 / 2116</td></tr><tr><td>UVs</td><td>in <code>0..1</code>, AABB overlap ≤ 1e-5</td><td>in range, overlap 0</td></tr><tr><td>Outer AABB</td><td>(0.987, 0.961, 0.860) m ± 0.015</td><td>(0.9866, 0.9605, 0.8600), zmin 0</td></tr><tr><td>Collider tris</td><td>≤ 280</td><td>252</td></tr><tr><td>Export</td><td>written, size &gt; 0</td><td>324056 / 324056 / 324044 bytes</td></tr></tbody></table></div>
72+
<p>Base triangles rose from <strong>3388 to 3664</strong> in the quality pass: coaxial ferrule cups and a dual-wall lathe with a rolled rim replaced the old cone-tripod / overlapping-torus construction. The #345 remodel (the asset sheet read it as the least-designed object in the lineup) took it to <strong>4180</strong>: a five-link chain replaced the bare hanging rod, a forged iron head replaced the turned wooden crown, and the pot gained a casting band and three stub feet. The iron material breaks its rust into blotches and adds fine sand-cast pitting. 4180 leaves 20 triangles under the ceiling, enough for <code>--short-legs</code>&#x27;s 12-triangle shim to still land on the support check (16), not the triangle budget (4).</p>
7373
<h3 id="hygiene">Hygiene<a class="anchor" href="#hygiene" aria-label="Link to this section">#</a></h3>
7474
<p>Recomputed from the generated mesh, not asserted about the script.</p>
7575
<div class="table-wrap"><table><thead><tr><th scope="col">Axis</th><th scope="col">Declared</th><th scope="col">Measured (all three)</th></tr></thead><tbody><tr><td>Non-manifold edges</td><td>0</td><td>0</td></tr><tr><td>Loose verts / edges</td><td>0 / 0</td><td>0 / 0</td></tr><tr><td>Doubles merged at 1e-5</td><td>0</td><td>0</td></tr><tr><td>Zero-area faces</td><td>0</td><td>0</td></tr><tr><td>N-gons</td><td>0</td><td>0</td></tr><tr><td>Coplanar disjoint face pairs</td><td>0</td><td>0</td></tr><tr><td>Grounded: <code>zmin</code></td><td>within 1e-4 of 0</td><td>0.0000</td></tr><tr><td>Named supports: 3 ferrules</td><td>each <code>zmin</code> ≤ 1e-3</td><td>3, cup_z 0.00000</td></tr><tr><td>Pot size</td><td>0.355 m dia × 0.334 m high ± 0.04</td><td>0.3600 × 0.3340</td></tr><tr><td><strong>Pot form</strong></td><td>base radius ≥ 0.05 m; widest point in the lower 60%</td><td>0.0750; at 0.420 of the height</td></tr><tr><td>Pot–leg clearance</td><td>≥ 0.04 m</td><td>0.0528</td></tr></tbody></table></div>
7676
<h3 id="joint-fit-and-seat">Joint fit and seat<a class="anchor" href="#joint-fit-and-seat" aria-label="Link to this section">#</a></h3>
77-
<div class="table-wrap"><table><thead><tr><th scope="col">Axis</th><th scope="col">Declared</th><th scope="col">Measured (all three)</th></tr></thead><tbody><tr><td>Hook-bail BVH gap</td><td>≤ 0.010 m</td><td>0.00000</td></tr><tr><td><strong>Bail through the ears</strong></td><td>2 rings; 0 ring vertices inside the bail; bail within the hole (&lt; 0.0135 m of the ring centre)</td><td>2; 0; 0.00641</td></tr><tr><td>Ferrule bite (pole r − inner wall, pole frame)</td><td>−0.006–0.000 m</td><td>−0.00185</td></tr></tbody></table></div>
77+
<div class="table-wrap"><table><thead><tr><th scope="col">Axis</th><th scope="col">Declared</th><th scope="col">Measured (all three)</th></tr></thead><tbody><tr><td>Hook-bail BVH gap (the hook is the lowest small iron shell; the chain links above it only meet each other)</td><td>≤ 0.010 m</td><td>0.00000</td></tr><tr><td><strong>Bail through the ears</strong></td><td>2 rings; 0 ring vertices inside the bail; bail within the hole (&lt; 0.0135 m of the ring centre)</td><td>2; 0; 0.00641</td></tr><tr><td>Ferrule bite (pole r − inner wall, pole frame)</td><td>−0.006–0.000 m</td><td>−0.00185</td></tr></tbody></table></div>
7878
<p>DECIMATE COLLAPSE triangle counts are <strong>not</strong> identical across series — the gate is a ratio band, not an exact count. Bake pixels are stochastic; the gate is <code>has_data</code> plus operator <code>FINISHED</code>, not byte-identity. Construction is closed-form; the only RNG is the seeded per-pole wood tone. Export byte counts differ on 5.2.1 (glTF serializer), not a gated axis.</p>
7979
<h3 id="pot-ears-and-surface">Pot, ears and surface<a class="anchor" href="#pot-ears-and-surface" aria-label="Link to this section">#</a></h3>
8080
<p>The pot was a quadratic profile from a 28 mm tip: an onion that ran to a point. It is now a superellipse belly from a 75 mm flat base out to 0.180 m at 0.42 of the height, then a rounded shoulder in to a 0.128 m mouth. The inner wall is offset along the profile&#x27;s normal, not sideways, so it keeps its thickness where the wall runs nearly flat. <strong>Pot form</strong> asserts it; <code>--pointed-pot</code> restores the old profile (base 0.028 m, widest at 0.727 of the height) and exits 19.</p>
@@ -142,7 +142,7 @@ <h3><a class="stretch" href="../wooden-barrel/">Wooden Barrel</a></h3>
142142
</main>
143143
<dialog class="lightbox" id="lightbox" aria-label="Full-size render">
144144
<div class="lightbox-bar"><button class="lightbox-close" id="lightboxNative" type="button" aria-pressed="false">Actual size</button><button class="lightbox-close" id="lightboxClose" type="button" autofocus>Close</button></div>
145-
<img src="../assets/iron-cauldron-hero.webp" alt="A round-bellied black iron cauldron hanging by its bail from a tripod of wooden poles." />
145+
<img src="../assets/iron-cauldron-hero.webp" alt="A rust-blotched cast-iron cauldron with a raised belly band, hanging by its bail and a short chain from a forged iron head atop a tripod of wooden poles." />
146146
</dialog>
147147
<footer class="site-footer">
148148
<div class="site-footer-inner">

‎showcase/gallery.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@
337337
"dir": "showcase/iron-cauldron",
338338
"category": "village",
339339
"teaches": "A procedural hanging iron cauldron with a round-bellied pot, a bail threaded through flat ear rings, and a timber tripod through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.",
340-
"alt": "A round-bellied black iron cauldron hanging by its bail from a tripod of wooden poles.",
340+
"alt": "A rust-blotched cast-iron cauldron with a raised belly band, hanging by its bail and a short chain from a forged iron head atop a tripod of wooden poles.",
341341
"witnessesFix": "Recomputed: 3664 tris, two materials with 224 wood and 1768 metal faces, UVs in 0..1 with zero AABB overlap, outer AABB 0.987×0.961×0.860 m, pot–leg clearance 0.053 m, pot base radius 0.075 m, 3 coaxial ferrules at zmin 0, ferrule bite −0.00185 m, hook-bail join 0, bail threads both ear rings, mesh hygiene all zero, LOD ratios in band, convex collider 246 tris, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z/--short-legs 16; --float-hook/--edge-on-ears 17; --pipe-ferrule 18; --pointed-pot 19.",
342342
"hero": "docs/gallery/assets/iron-cauldron-hero.webp",
343343
"preview": "showcase/iron-cauldron/preview.webp",

‎showcase/iron-cauldron/README.md‎

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
# Iron cauldron
22

33
A showcase piece, not an example. Procedural hanging cauldron (a
4-
round-bellied iron pot on a small flat base with a rolled rim, a pipe
5-
bail threaded through flat ear rings, timber
6-
tripod tenoned into a turned crown, iron ferrule cups coaxial with the
7-
poles) then the shipped pipeline: unique-cell UVs, Cycles high-to-low
4+
round-bellied cast-iron pot with a rolled rim, a raised casting band at
5+
the belly and three stub feet, a pipe bail threaded through flat ear
6+
rings and hung by a five-link chain, a timber tripod seated in a forged
7+
iron head, iron ferrule cups coaxial with the poles) then the shipped pipeline: unique-cell UVs, Cycles high-to-low
88
normal bake, LOD chain, convex collider, Unity glTF export.
99

1010
Ferrules are lofted along the pole axis and shifted so the downhill rim
@@ -29,18 +29,25 @@ materials, UVs, evaluated LOD, collider, or export file.
2929

3030
| Axis | Declared | Measured (4.5.11 / 5.1.2 / 5.2.1) |
3131
| --- | --- | --- |
32-
| Base triangles | 2800–4200 | 3664 / 3664 / 3664 |
32+
| Base triangles | 2800–4200 | 4180 / 4180 / 4180 |
3333
| LOD1 ratio | 0.32–0.62 of base | 0.5000 / 0.5000 / 0.5000 |
34-
| LOD2 ratio | 0.10–0.35 of base | 0.2200 / 0.2200 / 0.2200 |
35-
| Materials | exactly 2 distinct; ≥80 wood, ≥200 metal faces | 2 slots; 224 / 1768 |
34+
| LOD2 ratio | 0.10–0.35 of base | 0.2196 / 0.2196 / 0.2196 |
35+
| Materials | exactly 2 distinct; ≥80 wood, ≥200 metal faces | 2 slots; 144 / 2116 |
3636
| UVs | in `0..1`, AABB overlap ≤ 1e-5 | in range, overlap 0 |
3737
| Outer AABB | (0.987, 0.961, 0.860) m ± 0.015 | (0.9866, 0.9605, 0.8600), zmin 0 |
38-
| Collider tris | ≤ 280 | 246 |
39-
| Export | written, size > 0 | 287380 / 287380 / 287368 bytes |
38+
| Collider tris | ≤ 280 | 252 |
39+
| Export | written, size > 0 | 324056 / 324056 / 324044 bytes |
4040

4141
Base triangles rose from **3388 to 3664** in the quality pass: coaxial
4242
ferrule cups and a dual-wall lathe with a rolled rim replaced the old
43-
cone-tripod / overlapping-torus construction.
43+
cone-tripod / overlapping-torus construction. The #345 remodel (the asset
44+
sheet read it as the least-designed object in the lineup) took it to
45+
**4180**: a five-link chain replaced the bare hanging rod, a forged iron
46+
head replaced the turned wooden crown, and the pot gained a casting band
47+
and three stub feet. The iron material breaks its rust into blotches and
48+
adds fine sand-cast pitting. 4180 leaves 20 triangles under the ceiling,
49+
enough for `--short-legs`'s 12-triangle shim to still land on the support
50+
check (16), not the triangle budget (4).
4451

4552
### Hygiene
4653

@@ -64,7 +71,7 @@ Recomputed from the generated mesh, not asserted about the script.
6471

6572
| Axis | Declared | Measured (all three) |
6673
| --- | --- | --- |
67-
| Hook-bail BVH gap | ≤ 0.010 m | 0.00000 |
74+
| Hook-bail BVH gap (the hook is the lowest small iron shell; the chain links above it only meet each other) | ≤ 0.010 m | 0.00000 |
6875
| **Bail through the ears** | 2 rings; 0 ring vertices inside the bail; bail within the hole (< 0.0135 m of the ring centre) | 2; 0; 0.00641 |
6976
| Ferrule bite (pole r − inner wall, pole frame) | −0.006–0.000 m | −0.00185 |
7077

0 commit comments

Comments
 (0)