Skip to content

Commit 2e37948

Browse files
TMHSDigitalclaude
andcommitted
fix(showcase): model hand-pump as a cast village pump with a hooped bucket
Two lighting-and-paint passes left the pump the plainest object in its asset sheet: a smooth two-step column on a box. This pass changes the model. - The lower barrel is one turned shell: a moulded foot stepping onto the flange, the barrel, and a cast boss where the spout joins. Every radius follows r_lo, so --skinny-col still thins it. - The upper barrel has eight raised flutes and is socketed through a moulded collar. - The head gets a domed cap and a ball finial. - The nozzle gets a rolled drip lip. - The handle's tail runs past the fulcrum to a counterweight ball. - The grip is a turned lathe shape instead of a plain cylinder. - A coopered bucket (16 flat-shaded staves, two iron hoops) stands on the ground under the spout, clear of the plinth. The spout reach grows 0.13 -> 0.17 m so the nozzle falls inside the bucket mouth. - New budget, "bucket under the spout": exactly one bucket; the nozzle axis plus lip radius sits inside the mouth by >= 0.015 m; bucket zmin 0; the bucket stands >= 0.004 m clear of the plinth (BVH). New falsifier --shift-bucket exits 20. That check runs before the AABB check so the falsifier lands on its own budget. - The flange classifier now also requires a shell centred on the column axis. Otherwise the bucket's lower hoop reads as a flange and would mask --float-flange. - The collider source turns the bucket at 8 staves with no hoops. At 16 staves the hull ran to 267 triangles, past Unity's 255 convex-collider limit; now it is 205, under the unchanged 220 ceiling. Budgets, before -> after (justified in the README): - base tris 1064 -> 2412; ceiling 2200 -> 2600 - outer AABB (0.610, 0.382, 1.052) -> (0.610, 0.521, 1.055) (bucket, finial) - column radius 0.06200 -> 0.06800 (moulded foot; tolerance 0.008 unchanged) - collider 114 -> 205 (ceiling 220 unchanged) - metal / wood faces 564 / 144 -> 1134 / 332 - spout gap 0.00239; bucket catch 0.01900; bucket clear 0.02200 Evidence (live, local): - .scratch/blender-5.2.1-windows-x64/blender.exe (Blender 5.2.1 LTS) and .scratch/blender-4.5.11-windows-x64/blender.exe (Blender 4.5.11 LTS): default exit 0. Counts are identical except LOD2 (0.2181 / 0.2197, in band). - tests/check_falsifier_targets.py --run on both binaries: all 7 hand-pump falsifiers land (--skip-decimate 9, --stray-vert 15, --lift-z 16, --float-spout 17, --float-flange 18, --skinny-col 19, --shift-bucket 20). The static check passes. --shift-bucket measured: catch -0.10100. - Framing on both versions: fill y 0.844, margins l 0.353 r 0.412 b 0.072 t 0.083. - Contact sheet: luma 0.254, stage 0.240, warmth -0.100, saturation 0.159. - Asset sheet (docs/gallery/asset-sheets/hand-pump.webp): the pump is no longer the least-designed object. It carries more parts than the hydrant or the well. - 5.1.2 was not re-run. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1 parent 3f51dde commit 2e37948

8 files changed

Lines changed: 301 additions & 36 deletions

File tree

‎README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](show
126126
<a href="showcase/water-trough/"><img src="showcase/water-trough/preview.webp" width="24%" alt="Water trough: a watertight wooden trough with plank ends, rippled water, rust-streaked iron straps and trestle legs on a dark studio floor" /></a>
127127
<a href="showcase/hitching-post/"><img src="showcase/hitching-post/preview.webp" width="24%" alt="Hitching post: a square timber post with a pyramidal cap, a cross-arm on two knee braces with iron end caps, iron bands wrapped around it, two hitching rings and a nailed horseshoe on a dark studio floor" /></a>
128128
<a href="showcase/grindstone/"><img src="showcase/grindstone/preview.webp" width="24%" alt="Grindstone: a sandstone wheel dipping into a water-filled trough on a timber A-frame, with iron axle, hubs and a crank turned toward the viewer, on a dark studio floor" /></a>
129-
<a href="showcase/hand-pump/"><img src="showcase/hand-pump/preview.webp" width="24%" alt="Hand pump: a green-enamelled cast-iron village pump on a stepped wooden plinth with a spout and handle on a dark studio floor" /></a>
129+
<a href="showcase/hand-pump/"><img src="showcase/hand-pump/preview.webp" width="24%" alt="Hand pump: a green-enamelled cast-iron village pump with a fluted barrel, ball finial and counterweighted handle on a stepped wooden plinth, a hooped wooden bucket under its spout" /></a>
130130
<a href="showcase/signpost/"><img src="showcase/signpost/preview.webp" width="24%" alt="Signpost: a timber crossroads post with three painted fingerboards lettered MILLBROOK 2, OAKHAM 5 and FORD 1, iron straps, and a pyramidal cap on a dark studio floor" /></a>
131131
<a href="showcase/chopping-block/"><img src="showcase/chopping-block/preview.webp" width="24%" alt="Chopping block: a bark-sided log round with growth rings and drying checks on its sawn top, a riveted iron hoop, a felling axe buried in the top, and split billets and chips at its foot, on a dark studio floor" /></a>
132132
<a href="showcase/wooden-bucket/"><img src="showcase/wooden-bucket/preview.webp" width="24%" alt="Wooden bucket: a coopered pail with a three-strand rope bail through iron ear rings and chord-lofted iron hoops on a dark studio floor" /></a>
608 Bytes
Loading
2.86 KB
Loading
1.21 KB
Loading

‎showcase/gallery.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@
234234
"name": "hand-pump",
235235
"dir": "showcase/hand-pump",
236236
"teaches": "A procedural village hand pump whose gooseneck is a 6-gon tube from the lower-column radius, through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.",
237-
"alt": "A green-enamelled cast-iron village hand pump, rust worn at its edges, with a curved spout and lever handle on a stepped wooden plinth.",
237+
"alt": "A green-enamelled cast-iron village pump with a fluted barrel, ball finial and counterweighted handle on a wooden plinth, a hooped bucket under its spout.",
238238
"witnessesFix": "Recomputed: 1064 tris, two materials with 564 metal and 144 wood faces, UVs in 0..1 with zero AABB overlap, outer AABB 0.610×0.382×1.052 m, grounded zmin, spout-to-column gap 2.7 mm, flange-to-plinth gap 6.0 mm, column radius 62 mm, LOD ratios in band, convex collider 114 tris, hygiene all zero, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z 16; --float-spout 17; --float-flange 18; --skinny-col 19.",
239239
"hero": "docs/gallery/assets/hand-pump-hero.webp",
240240
"preview": "showcase/hand-pump/preview.webp",

‎showcase/hand-pump/README.md‎

Lines changed: 49 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
# Hand pump
22

33
A showcase piece, not an example. Procedural cast-iron village hand
4-
pump (stepped wooden plinth, two-diameter column, 6-gon gooseneck
5-
tube from the lower-column radius, stuffing-box head, handle, wooden
6-
grip) then the shipped pipeline: unique-cell UVs, Cycles high-to-low
4+
pump (stepped wooden plinth, a turned lower barrel with a moulded foot and
5+
a cast spout boss, a fluted upper barrel socketed through a moulded
6+
collar, 6-gon gooseneck tube from the lower-column radius, a stuffing-box
7+
head under a domed cap and ball finial, a handle whose tail runs past the
8+
fulcrum to a counterweight ball, a turned wooden grip, and a coopered
9+
bucket with two iron hoops on the ground under the spout) then the
10+
shipped pipeline: unique-cell UVs, Cycles high-to-low
711
normal bake, LOD chain, convex collider, Unity glTF export.
812

913
The column stays on the origin; only zmin is snapped. The gooseneck is
@@ -22,26 +26,47 @@ witness an API contract. "It rendered without error" is not a check.
2226
Hygiene combinatorics match `examples/mesh-hygiene-audit` (copied, not
2327
imported).
2428

25-
Intended size: ~1.05 m village pump, 0.34 m plinth, 0.76 m column;
26-
outer AABB 0.610 × 0.382 × 1.052 m.
29+
Intended size: ~1.05 m village pump, 0.34 m plinth, 0.76 m column,
30+
0.15 m bucket; outer AABB 0.610 × 0.521 × 1.055 m.
2731

2832
## Budgets
2933

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

33-
| Axis | Declared | Measured (4.5.11 / 5.1.2 / 5.2.1) |
37+
| Axis | Declared | Measured (4.5.11 / 5.2.1; 5.1.2 not re-run after the model pass) |
3438
| --- | --- | --- |
35-
| Base triangles | 900–2200 | 1064 / 1064 / 1064 |
36-
| LOD1 ratio | 0.32–0.62 of base | 0.5000 / 0.5000 / 0.5000 |
37-
| LOD2 ratio | 0.10–0.35 of base | 0.2199 / 0.2199 / 0.2162 |
38-
| Materials | exactly 2 distinct, ≥48 metal, ≥24 wood | 2 slots, 564 metal / 144 wood |
39+
| Base triangles | 900–2600 | 2412 / 2412 |
40+
| LOD1 ratio | 0.32–0.62 of base | 0.5000 / 0.5000 |
41+
| LOD2 ratio | 0.10–0.35 of base | 0.2197 / 0.2181 |
42+
| Materials | exactly 2 distinct, ≥48 metal, ≥24 wood | 2 slots, 1134 metal / 332 wood |
3943
| UVs | in `0..1`, AABB overlap ≤ 1e-5 | in range, overlap 0 |
40-
| Outer AABB | (0.610, 0.382, 1.052) m ± 0.015 | (0.6100, 0.3820, 1.0520), zmin 0 |
41-
| Collider tris | ≤ 220 | 114 |
42-
| Export | written, size > 0 | 97304 / 97304 / 97296 bytes |
43-
44-
Base triangles dropped from **1164 to 1064** in the quality pass: seven
44+
| Outer AABB | (0.610, 0.521, 1.055) m ± 0.015 | (0.6100, 0.5210, 1.0545), zmin 0 |
45+
| Collider tris | ≤ 220 (source turns the bucket at 8 staves, no hoops) | 205 |
46+
| Export | written, size > 0 | 202576 bytes (5.2.1) |
47+
48+
The model pass took the pump from **1064 to 2412** triangles and raised
49+
the ceiling **2200 → 2600**. Two lighting-and-paint passes had left it the
50+
plainest object in its asset sheet: a smooth two-step column on a box. It
51+
now carries the cast detail a village pump has: a turned lower barrel with
52+
a moulded foot and a spout boss, eight flutes on the upper barrel, a
53+
moulded collar at the socket, a domed cap and ball finial on the head, a
54+
rolled drip lip on the nozzle, a counterweighted tail on the handle, and a
55+
turned grip. A coopered bucket with two iron hoops stands under the spout,
56+
clear of the plinth. The spout's reach grew 0.13 → 0.17 m (`SPOUT_R`) so
57+
the nozzle clears the plinth and falls inside the bucket mouth. The outer
58+
AABB grew in y (0.382 → 0.521 m) for the bucket and in z (1.052 → 1.055 m)
59+
for the finial. The collider stays under its 220 ceiling because its
60+
source turns the bucket at 8 staves without hoops (`BUCKET_PROXY_SEGS`); at
61+
16 staves the hull ran to 267, past Unity's 255 convex-collider limit. The
62+
foot (0.068 m) and spout boss (0.067 m) stay within `COL_R_TOL` of
63+
`COL_R_LO`, so the column-radius budget still reads the barrel. The flange
64+
classifier now also requires a shell centred on the column axis: the
65+
bucket's lower hoop is as wide and as low as the flange, and would
66+
otherwise mask `--float-flange`. The new **bucket** budget gets its own
67+
falsifier, `--shift-bucket` (exit 20).
68+
69+
Earlier, base triangles dropped from **1164 to 1064** in the quality pass: seven
4570
sausage cylinders became one gooseneck tube, and the wood grip is no
4671
longer beveled with the plinth. Outer AABB is 0.610 × 0.382 × 1.052 m
4772
(was 0.610 × 0.364 × 1.049 m).
@@ -88,14 +113,15 @@ Recomputed from the generated mesh, not asserted about the script.
88113

89114
| Axis | Declared | Measured (all three) |
90115
| --- | --- | --- |
91-
| Spout-to-column BVH gap | ≤ 0.008 m | 0.00272 |
116+
| Spout-to-column BVH gap | ≤ 0.008 m | 0.00239 |
92117
| Flange-to-plinth BVH gap | ≤ 0.008 m | 0.00600 |
93-
| Lower-column radius vs `COL_R_LO` | ± 0.008 m | 0.06200 |
118+
| Lower-column radius vs `COL_R_LO` | ± 0.008 m (widest barrel shell, the moulded foot) | 0.06800 |
119+
| **Bucket under the spout** | one bucket; nozzle (axis + lip radius) inside the mouth by ≥ 0.015 m; bucket zmin within 1e-4 of 0; ≥ 0.004 m clear of the plinth | catch 0.01900; zmin 0; clear 0.02200 |
94120

95121
### Falsifiers
96122

97-
Each violates one named budget. All were run on 4.5.11, 5.1.2 and 5.2.1
98-
and returned the same code on each.
123+
Each violates one named budget. All were run on 4.5.11 and 5.2.1 after the
124+
model pass and returned the same code on each (5.1.2 not re-run).
99125

100126
| Flag | Budget violated | Exit |
101127
| --- | --- | --- |
@@ -105,6 +131,7 @@ and returned the same code on each.
105131
| `--float-spout` | spout-to-column BVH gap | 17 |
106132
| `--float-flange` | flange-to-plinth BVH gap | 18 |
107133
| `--skinny-col` | lower-column radius | 19 |
134+
| `--shift-bucket` | bucket under the spout | 20 |
108135

109136
## Run
110137

@@ -116,6 +143,7 @@ blender --background --python hand_pump.py -- --lift-z
116143
blender --background --python hand_pump.py -- --float-spout
117144
blender --background --python hand_pump.py -- --float-flange
118145
blender --background --python hand_pump.py -- --skinny-col
146+
blender --background --python hand_pump.py -- --shift-bucket
119147
blender --background --python hand_pump.py -- --output hand-pump.png
120148
```
121149

@@ -124,7 +152,7 @@ Smoke passes no flags.
124152
## Exit codes
125153

126154
File-local. `9` is a valid check code. `10` is reserved for
127-
`gallery_framing.check_framing` on the `--output` path. `15`–`19` are the
155+
`gallery_framing.check_framing` on the `--output` path. `15`–`20` are the
128156
hygiene and joint-fit family.
129157

130158
| Code | Meaning |
@@ -149,3 +177,4 @@ hygiene and joint-fit family.
149177
| 17 | Spout-to-column gap (`--float-spout`) |
150178
| 18 | Flange-to-plinth gap (`--float-flange`) |
151179
| 19 | Column radius (`--skinny-col`) |
180+
| 20 | Bucket under the spout (`--shift-bucket`) |

0 commit comments

Comments
 (0)