Skip to content

Commit 7a732f3

Browse files
fix(showcase): iron-cauldron and shipping-crate visual quality pass (#176)
* fix(showcase): lock iron-cauldron coaxial ferrules as hygiene budgets World-Z cups let leaning poles slice the lip. Coaxial shoes plus pole-axis bite keep the joint closed without a magic offset. Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Co-authored-by: Cursor <cursoragent@cursor.com> * fix(showcase): lock shipping-crate tenons and filleted handles as hygiene budgets Posts hung over a skid cave and 90-degree handle lofts sat on the plates. Shared post/skid planes and quarter-circle bails close those joints without magic offsets. Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Co-authored-by: Cursor <cursoragent@cursor.com> --------- Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent b464203 commit 7a732f3

12 files changed

Lines changed: 3152 additions & 848 deletions

File tree

13.6 KB
Loading
21.6 KB
Loading

‎docs/gallery/index.html‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -892,7 +892,7 @@ <h2><a href="gn-socket-rename/">gn-socket-rename</a></h2>
892892
<div class="card-body">
893893
<h2><a href="shipping-crate/">shipping-crate</a></h2>
894894
<p class="teaches">A procedural shipping crate through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.</p>
895-
<p class="witnesses"><span class="tag">witnesses</span> Recomputed: 624 tris, two materials with 132 metal faces, UVs in 0..1 with zero AABB overlap, outer AABB 1.352×0.856×0.748 m, LOD ratios in band (5.2 COLLAPSE more aggressive), convex collider 36 tris, non-empty glTF. --skip-decimate exits 9 on the LOD1 ratio budget.</p>
895+
<p class="witnesses"><span class="tag">witnesses</span> Recomputed: 2508 tris, two materials with 1170 wood and 280 metal faces, UVs in 0..1 with zero AABB overlap, outer AABB 1.146×0.726×0.612 m, grounded zmin, 3 skids, handle-end and slat-post join 0, mesh hygiene all zero, LOD ratios in band (5.2 COLLAPSE leaner on LOD2), convex collider 76 tris, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z/--short-skids 16; --float-handle 17; --omit-slats 18.</p>
896896
<a class="card-link" href="shipping-crate/">View example <span aria-hidden="true">&rarr;</span></a>
897897
</div>
898898
</article>
@@ -1145,7 +1145,7 @@ <h2><a href="tavern-stool/">tavern-stool</a></h2>
11451145
<div class="card-body">
11461146
<h2><a href="iron-cauldron/">iron-cauldron</a></h2>
11471147
<p class="teaches">A procedural hanging iron cauldron with a bulged open pot, bail, and timber tripod through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.</p>
1148-
<p class="witnesses"><span class="tag">witnesses</span> Recomputed: 3388 tris, two materials with 450 wood and 1198 metal faces, UVs in 0..1 with zero AABB overlap, outer AABB 1.013×0.986×0.827 m, pot–leg clearance 0.051 m, LOD ratios in band (5.2 COLLAPSE 8 tris leaner on LOD2), convex collider 98 tris, non-empty glTF. --skip-decimate exits 9 on the LOD1 ratio budget.</p>
1148+
<p class="witnesses"><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.046 m, 3 coaxial ferrules at zmin 0, ferrule bite −0.00185 m, hook-bail join 0, mesh hygiene all zero, LOD ratios in band, convex collider 250 tris, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z/--short-legs 16; --float-hook 17; --pipe-ferrule 18.</p>
11491149
<a class="card-link" href="iron-cauldron/">View example <span aria-hidden="true">&rarr;</span></a>
11501150
</div>
11511151
</article>

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

Lines changed: 787 additions & 251 deletions
Large diffs are not rendered by default.

‎docs/gallery/shipping-crate/index.html‎

Lines changed: 734 additions & 159 deletions
Large diffs are not rendered by default.

‎showcase/gallery.json‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"name": "shipping-crate",
1010
"dir": "showcase/shipping-crate",
1111
"teaches": "A procedural shipping crate through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.",
12-
"witnessesFix": "Recomputed: 624 tris, two materials with 132 metal faces, UVs in 0..1 with zero AABB overlap, outer AABB 1.352×0.856×0.748 m, LOD ratios in band (5.2 COLLAPSE more aggressive), convex collider 36 tris, non-empty glTF. --skip-decimate exits 9 on the LOD1 ratio budget.",
12+
"witnessesFix": "Recomputed: 2508 tris, two materials with 1170 wood and 280 metal faces, UVs in 0..1 with zero AABB overlap, outer AABB 1.146×0.726×0.612 m, grounded zmin, 3 skids, handle-end and slat-post join 0, mesh hygiene all zero, LOD ratios in band (5.2 COLLAPSE leaner on LOD2), convex collider 76 tris, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z/--short-skids 16; --float-handle 17; --omit-slats 18.",
1313
"hero": "docs/gallery/assets/shipping-crate-hero.webp",
1414
"preview": "showcase/shipping-crate/preview.webp",
1515
"tags": [
@@ -285,7 +285,7 @@
285285
"name": "iron-cauldron",
286286
"dir": "showcase/iron-cauldron",
287287
"teaches": "A procedural hanging iron cauldron with a bulged open pot, bail, and timber tripod through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.",
288-
"witnessesFix": "Recomputed: 3388 tris, two materials with 450 wood and 1198 metal faces, UVs in 0..1 with zero AABB overlap, outer AABB 1.013×0.986×0.827 m, pot–leg clearance 0.051 m, LOD ratios in band (5.2 COLLAPSE 8 tris leaner on LOD2), convex collider 98 tris, non-empty glTF. --skip-decimate exits 9 on the LOD1 ratio budget.",
288+
"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.046 m, 3 coaxial ferrules at zmin 0, ferrule bite −0.00185 m, hook-bail join 0, mesh hygiene all zero, LOD ratios in band, convex collider 250 tris, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z/--short-legs 16; --float-hook 17; --pipe-ferrule 18.",
289289
"hero": "docs/gallery/assets/iron-cauldron-hero.webp",
290290
"preview": "showcase/iron-cauldron/preview.webp",
291291
"tags": [

‎showcase/iron-cauldron/README.md‎

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

3-
A showcase piece, not an example. Procedural hanging cauldron (bulged
4-
iron pot with an open mouth, bail, timber tripod) then the shipped
5-
pipeline: unique-cell UVs, Cycles high-to-low normal bake, LOD chain,
6-
convex collider, Unity glTF export.
3+
A showcase piece, not an example. Procedural hanging cauldron (lathed
4+
iron pot with a rolled rim, pipe bail through vertical ear rings, timber
5+
tripod tenoned into a turned crown, iron ferrule cups coaxial with the
6+
poles) then the shipped pipeline: unique-cell UVs, Cycles high-to-low
7+
normal bake, LOD chain, convex collider, Unity glTF export.
8+
9+
Ferrules are lofted along the pole axis and shifted so the downhill rim
10+
sits at Z=0. A world-Z bucket lets a leaning pole slice the lip.
11+
`ferrule_bite` is measured in that same frame, and only samples wood
12+
inside the cup's own axis span — a pole hovering above the well cannot
13+
fake a seat.
714

815
It asserts **budget conformance** of the generated result. It does not
916
witness an API contract. "It rendered without error" is not a check.
@@ -21,41 +28,83 @@ materials, UVs, evaluated LOD, collider, or export file.
2128

2229
| Axis | Declared | Measured (4.5.11 / 5.1.2 / 5.2.1) |
2330
| --- | --- | --- |
24-
| Base triangles | 3280–3520 | 3388 / 3388 / 3388 |
31+
| Base triangles | 2800–4200 | 3664 / 3664 / 3664 |
2532
| LOD1 ratio | 0.32–0.62 of base | 0.5000 / 0.5000 / 0.5000 |
26-
| LOD2 ratio | 0.10–0.35 of base | 0.2196 / 0.2196 / 0.2172 |
27-
| Materials | exactly 2 distinct, ≥12 wood, ≥24 metal | 2 slots, 450 wood, 1198 metal |
33+
| LOD2 ratio | 0.10–0.35 of base | 0.2200 / 0.2200 / 0.2200 |
34+
| Materials | exactly 2 distinct; ≥80 wood, ≥200 metal faces | 2 slots; 224 / 1768 |
2835
| UVs | in `0..1`, AABB overlap ≤ 1e-5 | in range, overlap 0 |
29-
| Outer AABB | (1.013, 0.986, 0.827) m ± 0.01 | (1.0128, 0.9865, 0.8271), zmin 0.002 |
30-
| Pot–leg clearance | ≥ 0.04 m (recomputed vs pole axes) | 0.0513 / 0.0513 / 0.0513 |
31-
| Collider tris | ≤ 200 | 98 |
32-
| Export | written, size > 0 | 245060 / 245060 / 245044 bytes |
36+
| Outer AABB | (0.987, 0.961, 0.860) m ± 0.015 | (0.9866, 0.9605, 0.8600), zmin 0 |
37+
| Collider tris | ≤ 280 | 250 |
38+
| Export | written, size > 0 | 287916 / 287916 / 287904 bytes |
39+
40+
Base triangles rose from **3388 to 3664** in the quality pass: coaxial
41+
ferrule cups and a dual-wall lathe with a rolled rim replaced the old
42+
cone-tripod / overlapping-torus construction.
43+
44+
### Hygiene
45+
46+
Recomputed from the generated mesh, not asserted about the script.
47+
48+
| Axis | Declared | Measured (all three) |
49+
| --- | --- | --- |
50+
| Non-manifold edges | 0 | 0 |
51+
| Loose verts / edges | 0 / 0 | 0 / 0 |
52+
| Doubles merged at 1e-5 | 0 | 0 |
53+
| Zero-area faces | 0 | 0 |
54+
| N-gons | 0 | 0 |
55+
| Coplanar disjoint face pairs | 0 | 0 |
56+
| Grounded: `zmin` | within 1e-4 of 0 | 0.0000 |
57+
| Named supports: 3 ferrules | each `zmin` ≤ 1e-3 | 3, cup_z 0.00000 |
58+
| Pot size | 0.355 m dia × 0.334 m high ± 0.04 | 0.3545 × 0.3340 |
59+
| Pot–leg clearance | ≥ 0.04 m | 0.0464 |
60+
61+
### Joint fit and seat
62+
63+
| Axis | Declared | Measured (all three) |
64+
| --- | --- | --- |
65+
| Hook-bail BVH gap | ≤ 0.010 m | 0.00000 |
66+
| Ferrule bite (pole r − inner wall, pole frame) | −0.006–0.000 m | −0.00185 |
3367

3468
DECIMATE COLLAPSE triangle counts are **not** identical across series —
35-
5.2.1 is 8 tris leaner on LOD2. The gate is a ratio band, not an exact
36-
count. Bake pixels are stochastic; the gate is `has_data` plus operator
37-
`FINISHED`, not byte-identity. Construction uses no RNG. Export byte
38-
counts differ by 16 B on 5.2.1 (glTF serializer), not a gated axis.
39-
The pot–leg clearance is recomputed from shell verts vs the three pole
40-
axes; clipping exits 3.
69+
the gate is a ratio band, not an exact count. Bake pixels are
70+
stochastic; the gate is `has_data` plus operator `FINISHED`, not
71+
byte-identity. Construction uses no RNG. Export byte counts differ by
72+
12 B on 5.2.1 (glTF serializer), not a gated axis.
4173

42-
`--skip-decimate` skips the LOD DECIMATE stage so LOD1 ratio is 1.0 and
43-
exit 9 fires. That is the named budget the falsifier violates.
74+
### Falsifiers
75+
76+
Each violates one named budget. All seven were run on 4.5.11, 5.1.2 and
77+
5.2.1 and returned the same code on each.
78+
79+
| Flag | Budget violated | Exit |
80+
| --- | --- | --- |
81+
| `--skip-decimate` | LOD1 ratio band | 9 |
82+
| `--stray-vert` | loose vertex count is 0 | 15 |
83+
| `--lift-z` | bounding box `zmin` is 0 | 16 |
84+
| `--short-legs` | named ferrule supports at Z=0 | 16 |
85+
| `--float-hook` | hook-bail gap | 17 |
86+
| `--pipe-ferrule` | ferrule bite (pole starts above the well) | 18 |
4487

4588
## Run
4689

4790
```bash
4891
blender --background --python iron_cauldron.py --
4992
blender --background --python iron_cauldron.py -- --skip-decimate
93+
blender --background --python iron_cauldron.py -- --stray-vert
94+
blender --background --python iron_cauldron.py -- --lift-z
95+
blender --background --python iron_cauldron.py -- --short-legs
96+
blender --background --python iron_cauldron.py -- --float-hook
97+
blender --background --python iron_cauldron.py -- --pipe-ferrule
5098
blender --background --python iron_cauldron.py -- --output cauldron.png
5199
```
52100

53-
Smoke does not pass `--output` or `--skip-decimate`.
101+
Smoke passes no flags.
54102

55103
## Exit codes
56104

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

60109
| Code | Meaning |
61110
| --- | --- |
@@ -64,7 +113,7 @@ File-local. `9` is a valid check code. `10` is reserved for
64113
| 2 | argparse / usage |
65114
| 3 | Mesh did not build / no UV layer / pot clips tripod |
66115
| 4 | Base triangle count outside range |
67-
| 5 | Material count ≠ 2 distinct slots, or wood/metal faces missing |
116+
| 5 | Material count ≠ 2 distinct slots, or a face-count floor missed |
68117
| 6 | UVs outside 0..1 |
69118
| 7 | UV AABB overlap above tolerance |
70119
| 8 | World AABB off declared outer size |
@@ -74,3 +123,8 @@ File-local. `9` is a valid check code. `10` is reserved for
74123
| 12 | Bake did not finish or image has no data |
75124
| 13 | Export file missing or empty |
76125
| 14 | `--output` produced no file |
126+
| 15 | Mesh hygiene: loose, non-manifold, zero-area, doubles, n-gons, z-fight |
127+
| 16 | Not grounded: bounding box `zmin` off 0, or a named ferrule floats |
128+
| 17 | Joint fit: hook-bail gap |
129+
| 18 | Seat: ferrule bite band |
130+
| 19 | Pot diameter or height off the stated real-world size |

0 commit comments

Comments
 (0)