Skip to content

Commit 70f0cc3

Browse files
TMHSDigitalclaude
andcommitted
fix(showcase):
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent 4cf523d commit 70f0cc3

4 files changed

Lines changed: 226 additions & 167 deletions

File tree

-190 Bytes
Loading

‎showcase/moka-pot/README.md‎

Lines changed: 98 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
# moka-pot
22

3-
![A polished eight-sided aluminium moka pot: a tapered boiler under a collector that flares back out, a faceted lid with a black bakelite knob, a pinched spout, and a curved black bakelite handle on a riveted bracket, a brass safety valve on the boiler](preview.webp)
3+
![A polished eight-sided aluminium moka pot pinched to an hourglass waist with a proud grip band at the joint, a V-beak spout, a faceted lid with a black bakelite knob and a hinge knuckle, a black bakelite D handle on a fin, and a brass safety valve on the boiler](preview.webp)
44

5-
A three-cup stovetop moka pot: a tapered eight-flat boiler, a collector
6-
that flares back out from the waist, a faceted lid under a bakelite
7-
knob, a pinched pour spout, a bakelite handle on a riveted bracket, and a
8-
brass safety valve. **A showcase piece, not an example** — it witnesses
9-
no API contract. It asserts that generated geometry meets declared asset
10-
budgets, recomputed from the finished mesh.
5+
A three-cup Moka Express-pattern stovetop pot: an eight-flat boiler that
6+
flares out to its foot, a collector that flares out to its rim, both
7+
pinching to the screw joint where the collector's threaded skirt stands
8+
proud as a grip band, a V beak pinched from the rim, a faceted lid on a
9+
hinge knuckle under a bakelite knob, a bakelite D handle rooted in a
10+
riveted fin, and a brass safety valve. **A showcase piece, not an
11+
example** — it witnesses no API contract. It asserts that generated
12+
geometry meets declared asset budgets, recomputed from the finished mesh.
1113

1214
## What it composes
1315

1416
| Shipped content | Used for |
1517
| --- | --- |
16-
| `skills/mesh-editing-and-bmesh` | eight-flat lathes, a swept handle, wedges and plates, all in one `bmesh`; bevel pinned to a material slot |
18+
| `skills/mesh-editing-and-bmesh` | eight-flat lathes, a swept handle, a prism beak and plates, all in one `bmesh`; bevel pinned to a material slot |
1719
| `skills/procedural-materials-and-shaders` | brushed aluminium, glossy bakelite, brass |
1820
| `skills/bake-high-to-low` | Cycles tangent-space normal bake, high onto low |
1921
| `skills/engine-export-presets` | Unity glTF (`export_yup=True`) |
@@ -52,7 +54,7 @@ off the generated vertices:
5254
`--odd-facet` pushes one flat of the collector's mid ring 2.5 mm out and
5355
exits 19 on the spread (1.97 mm measured, with the AABB unchanged).
5456
`--lean-pot` shears the pot 4 mm over its height and exits 19 on the
55-
plumb line (3.41 mm measured, spread untouched).
57+
plumb line (3.28 mm measured, spread untouched).
5658

5759
## Budgets
5860

@@ -63,60 +65,74 @@ both).
6365

6466
| Budget | Band | Measured |
6567
| --- | --- | --- |
66-
| Base triangles | 950–1250 | 1092 |
68+
| Base triangles | 1200–1400 | 1300 |
6769
| LOD1 ratio | 0.32–0.62 | 0.5000 |
68-
| LOD2 ratio | 0.10–0.35 | 0.2179 |
70+
| LOD2 ratio | 0.10–0.35 | 0.2185 |
6971
| Material slots | exactly 3, distinct | 3 |
70-
| Aluminium / bakelite / brass faces | ≥ 160 / 210 / 150 | 190 / 244 / 180 |
71-
| UV bounds | inside 0..1 | (0.0023, 0.0023)–(0.9977, 0.9977) |
72+
| Aluminium / bakelite / brass faces | ≥ 160 / 280 / 100 | 197 / 388 / 124 |
73+
| UV bounds | inside 0..1 | (0.0025, 0.0025)–(0.9975, 0.9975) |
7274
| UV AABB overlap | ≤ 1e-5 | 0.000000 |
73-
| Outer AABB | 0.1665 × 0.0928 × 0.1522 m ± 0.006 | 0.1665 × 0.0928 × 0.1522 |
74-
| Collider triangles | ≤ 200 | 170 (two hulls) |
75+
| Outer AABB | 0.1327 × 0.0832 × 0.1600 m ± 0.006 | 0.1327 × 0.0832 × 0.1600 |
76+
| Collider triangles | ≤ 200 | 154 (two hulls) |
7577
| Normal bake | `{'FINISHED'}` with image data | `{'FINISHED'}`, `has_data=True` |
76-
| glTF export | file written, non-empty | ~72 kB |
78+
| glTF export | file written, non-empty | ~78 kB |
7779
| Hygiene | all zero | loose 0/0, non-manifold 0, zero-area 0, doubles 0, n-gons 0, coplanar cross-shell pairs 0 |
7880
| Grounded AABB | \|zmin\| ≤ 1e-4, boiler zmin ≤ 1e-4 | 0.00000 |
79-
| Shells | exactly 11, none unclassified | 11 |
81+
| Shells | exactly 10, none unclassified | 10 |
8082
| Collector seat on the boiler | 2.5–4.5 mm | 3.50 mm |
81-
| Handle bite into the bracket | 1.0–3.0 mm, per root vertex | 1.71–1.80 mm |
82-
| Knob bite into the lid | 1.0–3.0 mm | 2.00 mm |
83-
| Lid seat on the collector | 1.0–3.0 mm | 1.50 mm |
84-
| Spout bite and reach | base 0.9–3.0 mm into the wall; tip 10–15 mm beyond it | 1.50 mm; 12.50 mm |
85-
| Bracket bite | 0.9–3.0 mm into the wall | 1.50 mm |
86-
| Hinge bite | 1.5–5.0 mm into the collector | 3.10 mm |
87-
| Fasteners (valve, two rivets) | bite 0.8–2.5 mm, proud ≥ 1.2 mm | valve 1.60 / 4.60; rivets 1.20 / 1.80 |
88-
| Real size: foot, collector, height | 92.8 / 91.2 / 152.2 mm ± 3 | 92.8 / 91.2 / 152.2 |
83+
| Handle bite into the fin | 1.0–3.0 mm, each of the two roots | 2.50 mm, both roots |
84+
| Knob bite into the lid | 1.0–3.0 mm | 1.80 mm |
85+
| Lid seat on the collector | 1.0–3.0 mm | 1.80 mm |
86+
| Spout bite and reach | base 0.9–3.0 mm into the wall; tip 10–15 mm beyond it | 1.50 mm; 12.41 mm |
87+
| Fin bite | 0.9–3.0 mm into the wall | 1.50 mm |
88+
| Hinge bite | 1.5–5.0 mm into the collector | 2.63 mm |
89+
| Fasteners (valve, one rivet) | bite 0.8–2.5 mm, proud ≥ 1.2 mm | valve 1.60 / 4.60; rivet 1.20 / 1.80 |
90+
| Real size: foot, collector, height | 83.2 / 80.2 / 160.0 mm ± 3 | 83.2 / 80.2 / 160.0 |
8991
| Plumb | ≤ 0.8 mm | 0.000 mm |
9092
| Eight-fold spread | ≤ 0.2 mm | 0.000 mm |
9193

92-
Real-world size: 92.8 mm across the foot flats, 91.2 mm across the
93-
collector, 152.2 mm to the top of the knob, about 166 mm from the spout
94-
tip to the handle end. It is a three-cup Bialetti-pattern pot.
94+
Real-world size: a three-cup Moka Express is listed at 16.0 cm tall and
95+
9.0 cm across the base point to point, which is 83.2 mm across its
96+
flats. The collector rim is read off product photos at 0.96 of the foot,
97+
80.2 mm across its flats. The waist at the joint is 0.76 of the foot.
98+
Spout tip to handle is about 133 mm.
9599

96100
## Construction
97101

98102
- **Body.** Boiler, collector and lid are eight-flat lathes from
99103
`(apothem, z)` profiles: the distance from the axis to the middle of a
100104
flat, which is what a ruler across the pot reads. Vertices every 45°
101-
offset by 22.5° put a flat square on each axis, so the handle bracket
102-
and spout each sit on a flat. Every edge over 30° is chamfered 0.7 mm,
103-
which includes the 45° ridge between flats, so the ridges catch light.
105+
offset by 22.5° put a flat square on each axis, so the fin and the
106+
spout each sit on a flat. The boiler flares from a 63.6 mm neck to an
107+
83.2 mm foot; the collector from a 65.2 mm waist to an 80.2 mm rim. Its
108+
bottom 9 mm is a vertical skirt 67.6 mm across, 2.0 mm proud of the
109+
boiler's neck and 1.2 mm proud of its own waist: the grip band. Every edge over 30°
110+
is chamfered 0.7 mm, which includes the 45° ridge between flats, so the
111+
ridges catch light.
104112
- **Joints are tenoned, not stood.** The collector's floor sits 3.5 mm
105-
below the boiler's top plane (the boiler's neck runs up inside it); the
106-
lid sits 1.5 mm below the collector's top plane; the knob is driven
107-
2 mm into the lid. Nothing lands on a shared plane.
108-
- **Spout.** A wedge on the −x flat, 28 mm wide at the wall and 10 mm at
109-
the tip, its base vertices computed per corner from the collector's own
110-
wall function and driven 1.5 mm in.
111-
- **Bracket.** A plate on the +x flat built the same way, so it follows
112-
the wall's 5.6° rake, with two brass rivets above and below the handle.
113-
The handle's root is driven 2 mm into it.
114-
- **Handle.** A swept bakelite blade: ten rings of a twelve-point rounded
115-
rectangle along a cubic Bézier in the XZ plane, thicker mid-span than
116-
at either end, smooth-shaded with end caps hard and chamfered 1.2 mm.
117-
- **Fasteners.** Rivets and the valve are small turned heads aimed down
118-
the host's normal (the bracket's rake, the boiler's taper). Their
119-
seat is read back as height above the host's own nearest face.
113+
below the boiler's top plane (the boiler's neck runs up inside the
114+
skirt); the lid sits 1.8 mm below the collector's top plane; the knob
115+
is driven 1.8 mm into the lid. Nothing lands on a shared plane.
116+
- **Spout.** A triangular prism on the −x flat: its base spans 30 mm of
117+
the flat and is driven 1.5 mm into the wall per vertex from the
118+
collector's own wall function; its apex is one vertical edge 12.4 mm
119+
out. The underside sweeps 21 mm down the wall to the base, and the lip
120+
rises 1.2 mm from the rim to the tip, so it reads as a V pinched out of
121+
the rim rather than a block stuck to it.
122+
- **Fin.** A 22 mm plate on the +x flat built the same way, so it
123+
follows the collector's 7° flare from the waist almost to the rim. One
124+
brass rivet sits in the opening of the D.
125+
- **Handle.** A bakelite D in the XZ plane: twenty-two rings of a
126+
twelve-point rounded rectangle along a superellipse half (exponent
127+
0.55, 34 mm out from the fin, 41 mm between roots), slim at the roots
128+
and fuller through the grip. Both roots leave the fin horizontally and
129+
each root cap is cut parallel to the fin's raked face, 2.5 mm inside
130+
it.
131+
- **Hinge.** An aluminium knuckle on top of the fin, through the
132+
collector's rim and the lid's edge.
133+
- **Fasteners.** The rivet and the valve are small turned heads aimed
134+
down the host's normal (the fin's rake, the boiler's taper). Their seat
135+
is read back as height above the host's own nearest face.
120136
- **Shading.** Aluminium is flat-shaded, because the faceting is the
121137
object. Bakelite and brass are turned or swept and smooth-shaded with
122138
every edge over 35° hard.
@@ -128,14 +144,26 @@ tip to the handle end. It is a three-cup Bialetti-pattern pot.
128144
the failure was a sunk spout, not a floating one. It now lifts the base
129145
outward by 4 mm and leaves the tip where it was, so only the bite fails
130146
and the reach stays in its band.
131-
- **Handle bite measured the chamfer, not the root.** The root's rays
132-
were cast from every vertex within 1.5 mm of the root plane, which
133-
includes the chamfer ring 1.2 mm out; that ring is seated only 0.8 mm
134-
and tripped the band on a correct model. The root cap ring alone is
135-
now measured.
136-
- **Collider hit its ceiling by 6 triangles** when the spout was widened
137-
for the silhouette; the hull's planar-dissolve angle went from 6° to 9°
138-
rather than the ceiling being raised (206 → 170 triangles).
147+
- **The first pass was not a Moka Express.** It was 152 mm tall with a
148+
100 mm foot, its waist pinched to only 0.81 of the foot, the handle a
149+
horn curving up off a bracket, and the spout a blunt block. Every
150+
budget passed. The quality pass took the size from retailer listings,
151+
pinched the waist to 0.76, added the grip band, and replaced the horn
152+
with a two-root D and the block with a V beak.
153+
- **Two rivets on one fin are a coplanar pair.** The D's opening leaves
154+
room for rivets only 8.5 mm apart. On one raked plane with centres
155+
closer than the 20 mm window, their caps counted as 200 cross-shell
156+
coplanar pairs. The fin now carries one rivet, as the real one carries
157+
one screw.
158+
- **The fin rakes further than it is thick.** Splitting the fin's
159+
vertices into inner and outer by world x put the outer face's low
160+
corners on the inner side, and its bite read −4.5 mm on a correct
161+
model. The split is now by signed distance off the collector's own
162+
surface.
163+
- **A D handle has two roots.** Measuring the vertices nearest the
164+
pot in x saw only the lower root, because the wall flares out with
165+
height. Each half of the D is now read on its own, from the handle
166+
vertices inside the fin, and a root with none inside is a float.
139167

140168
## Conventions walked
141169

@@ -147,14 +175,14 @@ Every convention in `showcase/README.md`, and whether it applies here.
147175
| Falsifier fails the budget it targets | yes | table below |
148176
| Hygiene incl. cross-shell coplanar | yes | exit 15; `--flush-joint` is the coplanar falsifier |
149177
| Named supports | no | one support (the boiler's foot) |
150-
| Joint-fit budgets | yes | shell count, collector seat, handle bite (exit 17) |
151-
| Fasteners aimed down the host normal | yes | rivets and valve (`--float-valve`, exit 18) |
152-
| Seat conformance | yes | knob, lid, spout, bracket, hinge, fasteners (exit 18) |
178+
| Joint-fit budgets | yes | shell count, collector seat, both handle roots (exit 17) |
179+
| Fasteners aimed down the host normal | yes | rivet and valve (`--float-valve`, exit 18) |
180+
| Seat conformance | yes | knob, lid, spout, fin, hinge, fasteners (exit 18) |
153181
| A member is tenoned into its seat, never stood on it | yes | collector, lid, knob, handle |
154182
| Plumb and real-world size | yes | exit 19; plumb, three sizes in metres |
155-
| Mirrored assemblies | no | the two rivets are not a paired budget |
183+
| Mirrored assemblies | no | nothing is paired |
156184
| Even shaping terms | n/a | no shaping function; profiles are piecewise linear |
157-
| Edge treatment: no right angles | yes | 0.7 mm chamfer on every aluminium edge over 30°; the asset-quality right-angle fraction is 0.059 |
185+
| Edge treatment: no right angles | yes | 0.7 mm chamfer on every aluminium edge over 30°; the asset-quality right-angle fraction is 0.044 |
158186
| One substance, one slot | yes | aluminium, bakelite, brass |
159187
| Shading is part of the model | yes | see Construction |
160188
| Chamfer n-gon caps, then triangulate | yes | every cap |
@@ -173,13 +201,13 @@ were not available locally and are unverified.
173201
| --- | --- | --- | --- |
174202
| `--skip-decimate` | LOD1 ratio | drops the DECIMATE modifiers, LOD1 ratio goes to 1.0000 | 9 |
175203
| `--stray-vert` | mesh hygiene | adds one loose vertex on the axis | 15 |
176-
| `--flush-joint` | coplanar cross-shell pairs | drops the boiler's top plane onto the collector's floor plane; 9 pairs | 15 |
204+
| `--flush-joint` | coplanar cross-shell pairs | drops the boiler's top plane onto the collector's floor plane; 6 pairs | 15 |
177205
| `--lift-z` | grounded zmin | lifts the whole mesh 20 mm | 16 |
178-
| `--short-handle` | handle bite | starts the handle root 3 mm outside the bracket; −3.1 mm | 17 |
179-
| `--float-knob` | knob bite | lifts the knob 4 mm; −2.0 mm | 18 |
206+
| `--short-handle` | handle bite | stops both handle roots 3 mm outside the fin; no root vertex inside it | 17 |
207+
| `--float-knob` | knob bite | lifts the knob 4 mm; −2.2 mm | 18 |
180208
| `--float-spout` | spout bite | lifts the spout's base 4 mm off the wall, tip fixed; −2.5 mm | 18 |
181209
| `--float-valve` | fastener seat | lifts the valve 3 mm off its flat; −1.4 mm | 18 |
182-
| `--lean-pot` | plumb | shears the pot 4 mm over its height; 3.41 mm drift | 19 |
210+
| `--lean-pot` | plumb | shears the pot 4 mm over its height; 3.28 mm drift | 19 |
183211
| `--odd-facet` | eight-fold spread | pushes one mid-ring flat 2.5 mm out; 1.97 mm spread | 19 |
184212

185213
## Exit codes
@@ -209,7 +237,7 @@ collider ceiling), both on the render path only.
209237
| 15 | Mesh hygiene (`--stray-vert`, `--flush-joint`) |
210238
| 16 | Grounded zmin (`--lift-z`) |
211239
| 17 | Shell count, collector seat, or handle bite (`--short-handle`) |
212-
| 18 | Knob, lid, spout, bracket, hinge or fastener seat (`--float-knob`, `--float-spout`, `--float-valve`) |
240+
| 18 | Knob, lid, spout, fin, hinge or fastener seat (`--float-knob`, `--float-spout`, `--float-valve`) |
213241
| 19 | Real-world size, plumb, or eight-fold spread (`--lean-pot`, `--odd-facet`) |
214242
| 21 | Asset-quality gate (`examples/gallery_asset_quality.py`, render path only) |
215243

@@ -237,9 +265,9 @@ Measured on 5.2.1 only. 4.5 and 5.1 are unverified locally.
237265

238266
| Value | 5.2.1 |
239267
| --- | --- |
240-
| Base triangles | 1092 |
241-
| LOD1 / LOD2 tris | 546 / 238 |
242-
| Face counts (aluminium / bakelite / brass) | 190 / 244 / 180 |
243-
| Outer AABB | 0.1665 × 0.0928 × 0.1522 |
244-
| Collider tris | 170 |
245-
| glTF bytes | 72148 |
268+
| Base triangles | 1300 |
269+
| LOD1 / LOD2 tris | 650 / 284 |
270+
| Face counts (aluminium / bakelite / brass) | 197 / 388 / 124 |
271+
| Outer AABB | 0.1327 × 0.0832 × 0.1600 |
272+
| Collider tris | 154 |
273+
| glTF bytes | 77860 |

0 commit comments

Comments
 (0)