Skip to content

Commit 33bb510

Browse files
fix(showcase): anvil and campfire visual quality pass (#178)
* fix(showcase): rebuild anvil as London-pattern iron on a coopered stump The old piece stacked beveled boxes with glued nubs as holes and a twisted horn. One slotted face, oval rings, and stave-chord hoops are durable; per-coordinate nudges are not. Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Co-authored-by: Cursor <cursoragent@cursor.com> * fix(showcase): rebuild campfire with seated courses and a kissing teepee The old ring floated a mortar gap between identical boxes and ended the tripod at one point. Shared-Z courses and an overshooting apex ring are durable; per-log coordinate nudges are not. 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 cec4ca9 commit 33bb510

12 files changed

Lines changed: 3092 additions & 1167 deletions

File tree

‎docs/gallery/anvil/index.html‎

Lines changed: 853 additions & 329 deletions
Large diffs are not rendered by default.
17.6 KB
Loading
8.89 KB
Loading

‎docs/gallery/campfire/index.html‎

Lines changed: 640 additions & 243 deletions
Large diffs are not rendered by default.

‎docs/gallery/index.html‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -925,7 +925,7 @@ <h2><a href="wooden-barrel/">wooden-barrel</a></h2>
925925
<div class="card-body">
926926
<h2><a href="campfire/">campfire</a></h2>
927927
<p class="teaches">A procedural campfire through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.</p>
928-
<p class="witnesses"><span class="tag">witnesses</span> Recomputed: 3616 tris, three materials with 100 wood and 48 ash faces, UVs in 0..1 with zero AABB overlap, outer AABB 0.789×0.789×0.410 m, LOD ratios in band, convex collider 254 tris, non-empty glTF. --skip-decimate exits 9 on the LOD1 ratio budget.</p>
928+
<p class="witnesses"><span class="tag">witnesses</span> Recomputed: 2200 tris, three materials with 216 wood, 48 ash and 1304 stone faces, UVs in 0..1 with zero AABB overlap, outer AABB 0.807×0.808×0.404 m, LOD ratios in band, convex collider 198 tris, hygiene 0, 14 grounded bottom stones, teepee kiss 0.00001 m, course seat 0, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z/--short-stones 16; --float-logs 17; --gap-courses 18.</p>
929929
<a class="card-link" href="campfire/">View example <span aria-hidden="true">&rarr;</span></a>
930930
</div>
931931
</article>
@@ -1035,7 +1035,7 @@ <h2><a href="wheelbarrow/">wheelbarrow</a></h2>
10351035
<div class="card-body">
10361036
<h2><a href="anvil/">anvil</a></h2>
10371037
<p class="teaches">A procedural blacksmith anvil on a timber stump through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.</p>
1038-
<p class="witnesses"><span class="tag">witnesses</span> Recomputed: 6616 tris, two materials with 2616 metal faces, UVs in 0..1 with zero AABB overlap, outer AABB 0.772×0.419×0.662 m, LOD ratios in band, convex collider 190 tris, non-empty glTF. --skip-decimate exits 9 on the LOD1 ratio budget.</p>
1038+
<p class="witnesses"><span class="tag">witnesses</span> Recomputed: 2988 tris, two materials with 1040 wood and 822 metal faces, UVs in 0..1 with zero AABB overlap, outer AABB 0.621×0.414×0.489 m, LOD ratios in band, convex collider 134 tris, hygiene 0, 16 grounded staves, hoop bite 0.003 m, foot-on-head gap 0.003 m, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z/--short-staves 16; --float-anvil 17; --round-band 18.</p>
10391039
<a class="card-link" href="anvil/">View example <span aria-hidden="true">&rarr;</span></a>
10401040
</div>
10411041
</article>

‎showcase/anvil/README.md‎

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

33
A showcase piece, not an example. Procedural London-pattern anvil on a
4-
timber stump (horn, face, heel, waist, iron hoops) then the shipped
4+
coopered timber stump (16 jittered staves, chord-lofted iron hoops, a
5+
sawn head, spreading foot, pinched waist, one slotted face with hardy
6+
and pritchel through-holes, oval-lofted horn) then the shipped
57
pipeline: unique-cell UVs, Cycles high-to-low normal bake, LOD chain,
68
convex collider, Unity glTF export.
79

10+
The face is one `add_slotted_slab` so hardy/pritchel are real holes in
11+
a single shell, not nubs glued onto stacked boxes. Hoops evaluate the
12+
same `host_outer_r` chord as the stave flats. `--round-band` is the
13+
falsifier: a circle of `radius_at(z)` instead of the chord.
14+
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.
1017

@@ -21,39 +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 | 6450–6800 | 6616 / 6616 / 6616 |
31+
| Base triangles | 2500–4500 | 2988 / 2988 / 2988 |
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.2198 / 0.2198 / 0.2198 |
27-
| Materials | exactly 2 distinct, ≥24 metal faces | 2 slots, 628 wood, 2616 metal |
33+
| LOD2 ratio | 0.10–0.35 of base | 0.2195 / 0.2195 / 0.2195 |
34+
| Materials | exactly 2 distinct; ≥400 wood, ≥400 metal faces | 2 slots; 1040 / 822 |
2835
| UVs | in `0..1`, AABB overlap ≤ 1e-5 | in range, overlap 0 |
29-
| Outer AABB | (0.772, 0.419, 0.662) m ± 0.01 | (0.7720, 0.4183, 0.6618), zmin 0 |
30-
| Collider tris | ≤ 220 | 190 |
31-
| Export | written, size > 0 | 474984 / 474984 / 474972 bytes |
36+
| Outer AABB | (0.621, 0.414, 0.489) m ± 0.015 | (0.6210, 0.4137, 0.4890), zmin 0 |
37+
| Collider tris | ≤ 280 | 134 |
38+
| Export | written, size > 0 | 244052 / 244052 / 244036 bytes |
39+
40+
Base triangles dropped from **6616 to 2988** in the quality pass:
41+
overlapping face boxes and a beveled superellipse horn became one
42+
slotted slab plus a circular oval loft. Hidden coincident faces were
43+
the waste.
44+
45+
DECIMATE COLLAPSE triangle counts are **not** identical across series —
46+
the gate is a ratio band, not an exact count. Bake pixels are
47+
stochastic; the gate is `has_data` plus operator `FINISHED`, not
48+
byte-identity. Stave-width jitter uses fixed seed 17. Export byte counts
49+
differ by 16 B on 5.2.1 (glTF serializer), not a gated axis.
50+
51+
### Hygiene
52+
53+
Recomputed from the generated mesh, not asserted about the script.
54+
55+
| Axis | Declared | Measured (all three) |
56+
| --- | --- | --- |
57+
| Non-manifold edges | 0 | 0 |
58+
| Loose verts / edges | 0 / 0 | 0 / 0 |
59+
| Doubles merged at 1e-5 | 0 | 0 |
60+
| Zero-area faces | 0 | 0 |
61+
| N-gons | 0 | 0 |
62+
| Coplanar disjoint face pairs | 0 | 0 |
63+
| Grounded: `zmin` | within 1e-4 of 0 | 0.0000 |
64+
| Named supports: 16 staves | each `zmin` ≤ 0.001 | 16, stave_z 0.00000 |
65+
| Body plan | 0.621 m long × 0.180 m high ± 0.05 | 0.6210 × 0.1800 |
66+
67+
### Joint fit and seat
68+
69+
| Axis | Declared | Measured (all three) |
70+
| --- | --- | --- |
71+
| Foot-on-head BVH gap | ≤ 0.006 m | 0.00300 |
72+
| Hoop bite (host r − inner hoop r) | 0.0012–0.008 m | 0.00300 |
73+
74+
### Falsifiers
3275

33-
DECIMATE COLLAPSE triangle counts are **not** identical across series in
34-
general — the gate is a ratio band, not an exact count. On this mesh LOD
35-
ratios matched across 4.5.11 / 5.1.2 / 5.2.1. Bake pixels are stochastic;
36-
the gate is `has_data` plus operator `FINISHED`, not byte-identity.
37-
Construction uses no RNG. Export byte counts differ by 12 B on 5.2.1
38-
(glTF serializer), not a gated axis.
76+
Each violates one named budget. All six were run on 4.5.11, 5.1.2 and
77+
5.2.1 and returned the same code on each.
3978

40-
`--skip-decimate` skips the LOD DECIMATE stage so LOD1 ratio is 1.0 and
41-
exit 9 fires. That is the named budget the falsifier violates.
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-staves` | named stave supports at Z=0 | 16 |
85+
| `--float-anvil` | foot-on-head gap | 17 |
86+
| `--round-band` | hoop bite band | 18 |
4287

4388
## Run
4489

4590
```bash
4691
blender --background --python anvil.py --
4792
blender --background --python anvil.py -- --skip-decimate
93+
blender --background --python anvil.py -- --stray-vert
94+
blender --background --python anvil.py -- --lift-z
95+
blender --background --python anvil.py -- --short-staves
96+
blender --background --python anvil.py -- --float-anvil
97+
blender --background --python anvil.py -- --round-band
4898
blender --background --python anvil.py -- --output anvil.png
4999
```
50100

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

53103
## Exit codes
54104

55105
File-local. `9` is a valid check code. `10` is reserved for
56-
`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.
57108

58109
| Code | Meaning |
59110
| --- | --- |
@@ -62,7 +113,7 @@ File-local. `9` is a valid check code. `10` is reserved for
62113
| 2 | argparse / usage |
63114
| 3 | Mesh did not build / no UV layer |
64115
| 4 | Base triangle count outside range |
65-
| 5 | Material count ≠ 2 distinct slots, or wood/metal faces missing |
116+
| 5 | Material count ≠ 2 distinct slots, or a face-count floor missed |
66117
| 6 | UVs outside 0..1 |
67118
| 7 | UV AABB overlap above tolerance |
68119
| 8 | World AABB off declared outer size |
@@ -72,3 +123,8 @@ File-local. `9` is a valid check code. `10` is reserved for
72123
| 12 | Bake did not finish or image has no data |
73124
| 13 | Export file missing or empty |
74125
| 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 stave floats |
128+
| 17 | Joint fit: foot-on-head gap (`--float-anvil`) |
129+
| 18 | Seat: hoop bite band (`--round-band`) |
130+
| 19 | Body length or height off the stated real-world size |

0 commit comments

Comments
 (0)