Iron Cauldron

showcase/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.

Rendered headless by the showcase piece itself. Select it to enlarge.

witnesses Recomputed: 4180 tris, two materials with 144 wood and 2116 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 under a five-link chain, bail threads both ear rings, mesh hygiene all zero, LOD ratios in band, convex collider 196 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.

category Village

tags mesh export showcase

blender --background --python showcase/iron-cauldron/iron_cauldron.py --

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.

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. ferrule_bite is measured in that same frame, and only samples wood inside the cup's own axis span — a pole hovering above the well cannot fake a seat.

It asserts budget conformance of the generated result. It does not witness an API contract. "It rendered without error" is not a check.

Composes skills mesh-editing-and-bmesh, bake-high-to-low, depsgraph-and-evaluated-data, engine-export-presets, and snippets bake_normal_high_to_low.py, setup_bake_target_image.py, lod_chain.py / decimate_to_budget.py, convex_hull_collider.py, export_preset_unity.py (helpers copied, not imported as a package).

Budgets#

Declared as named constants; every gate recomputes from the mesh, materials, UVs, evaluated LOD, collider, or export file.

AxisDeclaredMeasured (4.5.11 / 5.1.2 / 5.2.1)
Base triangles2800–42004180 / 4180 / 4180
LOD1 ratio0.32–0.62 of base0.5000 / 0.5000 / 0.5000
LOD2 ratio0.10–0.35 of base0.2196 / 0.2196 / 0.2196
Materialsexactly 2 distinct; ≥80 wood, ≥200 metal faces2 slots; 144 / 2116
UVsin 0..1, AABB overlap ≤ 1e-5in range, overlap 0
Outer AABB(0.987, 0.961, 0.860) m ± 0.015(0.9866, 0.9605, 0.8600), zmin 0
Collider tris≤ 280196
Exportwritten, size > 0320368 / 320368 / 320364 bytes (4.5.11 / 5.1.2 / 5.2.1)

Base triangles rose from 3388 to 3664 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 4180: 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 --short-legs's 12-triangle shim to still land on the support check (16), not the triangle budget (4).

Hygiene#

Recomputed from the generated mesh, not asserted about the script.

AxisDeclaredMeasured (all three)
Non-manifold edges00
Loose verts / edges0 / 00 / 0
Doubles merged at 1e-500
Zero-area faces00
N-gons00
Coplanar disjoint face pairs00
Grounded: zminwithin 1e-4 of 00.0000
Named supports: 3 ferruleseach zmin ≤ 1e-33, cup_z 0.00000
Pot size0.355 m dia × 0.334 m high ± 0.040.3600 × 0.3340
Pot formbase radius ≥ 0.05 m; widest point in the lower 60%0.0750; at 0.420 of the height
Pot–leg clearance≥ 0.04 m0.0528

Joint fit and seat#

AxisDeclaredMeasured (all three)
Hook-bail BVH gap (the hook is the lowest small iron shell; the chain links above it only meet each other)≤ 0.010 m0.00000
Bail through the ears2 rings; 0 ring vertices inside the bail; bail within the hole (< 0.0135 m of the ring centre)2; 0; 0.00641
Ferrule bite (pole r − inner wall, pole frame)−0.006–0.000 m−0.00185

DECIMATE COLLAPSE triangle counts are not identical across series — the gate is a ratio band, not an exact count. Bake pixels are stochastic; the gate is has_data plus operator FINISHED, 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.

Pot, ears and surface#

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's normal, not sideways, so it keeps its thickness where the wall runs nearly flat. Pot form asserts it; --pointed-pot restores the old profile (base 0.028 m, widest at 0.727 of the height) and exits 19.

The ear rings stood in the bail's own XZ plane, so the bail ran through the ring's tube rather than its hole, and its ends hung into the pot's mouth. The rings now lie flat, bite 2 mm into the rim's outer edge, and the bail (vertical where it passes) threads them. Past each ear the bail is mirrored about the ring, so its ends hook outward. Bail through the ears asserts it; --edge-on-ears restores the old rings (36 ring vertices inside the bail) and exits 17.

Cast iron is near-black and rough with rust in the pores; each pole has its own tone and grain along its axis. The temp .glb is removed after its size is measured.

Falsifiers#

Each violates one named budget. All nine were run on 4.5.11, 5.1.2 and 5.2.1 and returned the same code on each.

FlagBudget violatedExit
--skip-decimateLOD1 ratio band9
--stray-vertloose vertex count is 015
--lift-zbounding box zmin is 016
--short-legsnamed ferrule supports at Z=016
--float-hookhook-bail gap17
--pipe-ferruleferrule bite (pole starts above the well)18
--pointed-potpot form19
--edge-on-earsbail through the ears17

Run#

blender --background --python iron_cauldron.py --
blender --background --python iron_cauldron.py -- --skip-decimate
blender --background --python iron_cauldron.py -- --stray-vert
blender --background --python iron_cauldron.py -- --lift-z
blender --background --python iron_cauldron.py -- --short-legs
blender --background --python iron_cauldron.py -- --float-hook
blender --background --python iron_cauldron.py -- --pipe-ferrule
blender --background --python iron_cauldron.py -- --pointed-pot
blender --background --python iron_cauldron.py -- --edge-on-ears
blender --background --python iron_cauldron.py -- --output cauldron.png

Smoke passes no flags.

Exit codes#

File-local. 9 is a valid check code. 10 is reserved for gallery_framing.check_framing on the --output path. 15–19 are the hygiene and joint-fit family.

CodeMeaning
0Success
1Uncaught exception (FATAL wrapper)
2argparse / usage
3Mesh did not build / no UV layer / pot clips tripod
4Base triangle count outside range
5Material count ≠ 2 distinct slots, or a face-count floor missed
6UVs outside 0..1
7UV AABB overlap above tolerance
8World AABB off declared outer size
9LOD ratio band (--skip-decimate lands here)
10Framing gate (render path only)
11Collider triangle count above ceiling
12Bake did not finish or image has no data
13Export file missing or empty
14--output produced no file
15Mesh hygiene: loose, non-manifold, zero-area, doubles, n-gons, z-fight
16Not grounded: bounding box zmin off 0, or a named ferrule floats
17Joint fit: hook-bail gap, or the bail not threading the ear rings
18Seat: ferrule bite band
19Pot diameter or height off the stated real-world size, or pot form (base radius, belly height)
20Gallery asset-quality violation (render path; the floors' 11 is remapped here)

Source

showcase/iron-cauldron/iron_cauldron.py View the script on GitHub →
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.