Skip to content

Commit b495655

Browse files
TMHSDigitalclaude
andcommitted
fix(showcase): model street-lantern as a fluted, scrolled cast-iron lamp
Earlier passes changed only lighting and materials; the model was still a plain octagonal post and a bare box cage, the plainest object in its asset sheet. Changes to the geometry: - tapered column with 10 concave flutes (lands at the declared post radius, so the post-size budget still reads 0.10 m) and a second brass collar - a lamplighter's ladder bar through the neck, with ball ends - two wrought C-scrolls welded into the arm's underside - a forged hook ring around the arm at the lantern station - a brass eave band, base tray and drip finial on the lantern New budget: scroll weld. Each of exactly two arm scrolls must sit inside the arm by >= 0.004 m (signed depth, the same measure as the brace bite). The new falsifier --float-scroll drops the scrolls 0.03 m and exits 21. The base-triangle band moved from 3000-3800 to 4200-5200 around the new count, with the justification recorded in the script and README. The hero yaw is now 90 degrees (HERO_YAW_DEG) so the arm reaches across both the hero and the asset-sheet camera; at -28 degrees it pointed down the sheet camera's axis. Construction hazard found and recorded: a 0.008 m flute depth puts a groove vertex exactly on the arm root's cap centre, remove_doubles fuses post and arm, and joint_audit then finds neither. 0.006 m is used. Evidence (live runs, 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 on both; base_tris 4726 (was 3338), LOD ratios 0.4998/0.2179 (5.2.1) and 0.4998/0.2196 (4.5.11), faces metal/glass/brass 2162/24/341, bbox unchanged (0.300, 0.786, 1.287), collider 108 <= 120, hygiene all 0, scroll_weld 0.01709, brace bites 0.01327/0.01282. - Falsifiers, identical on both versions: --skip-decimate 9, --stray-vert 15, --lift-z 16, --float-brace 17, --sink-arm 18, --rake-post 19, --shallow-brace 20, --float-scroll 21 (weld -0.00873). tests/check_falsifier_targets.py static + --run --only street-lantern pass on both binaries. - Framing (4.5.11 --output): fill y 0.844, margins l .356 r .384 b .039 t .117. - Contact sheet: luma 0.196 / stage 0.183 / warmth +0.015 / sat 0.107. - Asset sheet (docs/gallery/asset-sheets/street-lantern.webp): the lamp now reads in full profile, with the lantern, scrolls, collars and ladder bar legible. It is not the least-designed object (the hydrant is simpler). - 5.1.2 was not run. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1 parent 2e37948 commit b495655

8 files changed

Lines changed: 305 additions & 38 deletions

File tree

‎README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](show
114114
<a href="showcase/wooden-barrel/"><img src="showcase/wooden-barrel/preview.webp" width="24%" alt="Wooden barrel: a 20-stave wine-cask with a head of four boards, chord-lofted iron hoops, and a bung on a dark studio floor" /></a>
115115
<a href="showcase/campfire/"><img src="showcase/campfire/preview.webp" width="24%" alt="Campfire: a two-course ring of warm, soot-dark fieldstones around a tripod of charring logs over ember-cracked coals on a dark studio floor, warm wedge on the back wall" /></a>
116116
<a href="showcase/market-stall/"><img src="showcase/market-stall/preview.webp" width="24%" alt="Market stall: a grained timber frame with post feet, diagonal side braces, slatted counter, rafters, and a striped canvas awning on a dark studio floor, warm wedge on the back wall" /></a>
117-
<a href="showcase/street-lantern/"><img src="showcase/street-lantern/preview.webp" width="24%" alt="Street lantern: an iron post with aged brass collars, a knee brace tenoned into post and arm, and a lit muntined amber cage glowing onto the post on a dark studio floor" /></a>
117+
<a href="showcase/street-lantern/"><img src="showcase/street-lantern/preview.webp" width="24%" alt="Street lantern: a cast-iron lamp post with a fluted column, brass collars, a ladder bar and a scrolled, braced arm, its banded lantern lit amber from inside" /></a>
118118
<a href="showcase/treasure-chest/"><img src="showcase/treasure-chest/preview.webp" width="24%" alt="Treasure chest: a slatted wooden chest with iron bands, corner brackets, and an open lid on a dark studio floor" /></a>
119119
<a href="showcase/terrain-scatter/"><img src="showcase/terrain-scatter/preview.webp" width="24%" alt="Terrain scatter: a Geometry Nodes hill tile of patchy grass over dark earth, nine faceted stones sunk into it among grass tufts and pebbles, on a dark studio floor" /></a>
120120
<a href="showcase/fence-kit/"><img src="showcase/fence-kit/preview.webp" width="24%" alt="Fence kit: a run of three weathered post-and-rail sections on a packed-earth strip sharing one post at each joint, with pyramidal caps, diagonal board braces, and iron bands" /></a>
2.26 KB
Loading
2.2 KB
Loading
776 Bytes
Loading

‎showcase/gallery.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@
7676
"name": "street-lantern",
7777
"dir": "showcase/street-lantern",
7878
"teaches": "A procedural hanging street lantern through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.",
79-
"alt": "A black iron street lamp post with aged brass collars and a knee brace, its hanging lantern lit from inside so the amber panes glow onto the post and floor.",
79+
"alt": "A cast-iron street lamp: fluted post with brass collars and a ladder bar, a braced arm with wrought scrolls, and a banded brass lantern lit amber from inside.",
8080
"witnessesFix": "Recomputed: 3338 tris, three materials with 1530 metal, 24 glass and 209 brass faces, UVs in 0..1 with zero AABB overlap, outer AABB 0.300×0.786×1.287 m, zmin 0, hygiene 0, brace BVH gap 0, brace ends 13 mm into the post and the arm, hanger-roof gap −1 mm, post 0.100×1.120 m plumb 0, LOD ratios in band (5.2 COLLAPSE 2 tris leaner on LOD2), convex collider 78 tris, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z 16; --float-brace 17; --sink-arm 18; --rake-post 19; --shallow-brace 20.",
8181
"hero": "docs/gallery/assets/street-lantern-hero.webp",
8282
"preview": "showcase/street-lantern/preview.webp",

‎showcase/street-lantern/README.md‎

Lines changed: 46 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
# Street lantern
22

33
A showcase piece, not an example. Procedural hanging street lantern
4-
(stepped iron foot, tapered octagonal post, brass collars, braced arm,
5-
muntined cage with amber panes, square pyramidal brass roof and finial)
4+
(stepped iron foot, tapered cast-iron column with ten flutes, two brass
5+
collars, a lamplighter's ladder bar with ball ends, a braced arm hung with
6+
two wrought C-scrolls and a forged hook ring, a muntined cage with amber
7+
panes between a brass eave band and base tray, square pyramidal brass roof,
8+
finial and drip)
69
then the shipped pipeline: unique-cell UVs, Cycles high-to-low normal
710
bake, LOD chain, convex collider, Unity glTF export.
811

@@ -24,11 +27,26 @@ the arm's centre-line side, and the brace-bite budget below asserts
2427
that each end is actually inside its host. Brass is aged and rougher
2528
(it was bright polished gold at roughness 0.28).
2629

30+
The model was the plainest in its asset sheet: a plain octagonal post and a
31+
bare box cage. The column is now fluted (`POST_FLUTES` channels,
32+
`FLUTE_DEPTH` deep, lands at the declared post radius so the post-size
33+
budget still reads 0.10 m) and broken by two collars; a ladder bar with ball
34+
ends passes through the neck; two C-scrolls weld into the arm's underside
35+
(each kept under 0.10 m on Y so the brace classifier never claims one); a
36+
hook ring rings the arm at the lantern station; and the cage gains a brass
37+
eave band, a base tray and a drip finial. Base triangles rose from 3338 to
38+
4726 and the band was re-declared around the new model (below). One
39+
construction hazard is recorded in the script: a 0.008 m flute depth puts a
40+
groove vertex exactly on the arm root's cap centre, `remove_doubles` fuses
41+
post and arm into one shell, and the joint audit then finds neither.
42+
2743
The hero is lit from inside: a shadowless warm point light sits at the
2844
centroid of the glass faces and the panes emit at 1.6, so the lantern
2945
throws its glow onto the post, arm and floor. The camera is closer and
3046
lower on a 40 mm lens; the first hero left the lantern small in an
31-
empty frame. Render path only; geometry and budgets are unchanged.
47+
empty frame. The hero yaws the piece `HERO_YAW_DEG` (90) so the arm reaches
48+
across both the hero camera and the asset-sheet camera; at the old −28°
49+
it pointed down the sheet camera's axis and the lantern read end-on.
3250

3351
It asserts **budget conformance** of the generated result. It does not
3452
witness an API contract. "It rendered without error" is not a check.
@@ -41,32 +59,36 @@ witness an API contract. "It rendered without error" is not a check.
4159
Hygiene combinatorics match `examples/mesh-hygiene-audit` (copied, not
4260
imported).
4361

44-
Intended size: 0.30 m square foot, 1.12 m octagonal post (0.10 m across
45-
at the base), 0.50 m arm, 0.24 × 0.30 m cage; outer AABB
62+
Intended size: 0.30 m square foot, 1.12 m fluted post (0.10 m across the
63+
lands at the base), 0.50 m arm, 0.24 × 0.30 m cage; outer AABB
4664
0.300 × 0.786 × 1.287 m.
4765

4866
## Budgets
4967

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

53-
| Axis | Declared | Measured (4.5.11 / 5.1.2 / 5.2.1) |
71+
| Axis | Declared | Measured (4.5.11 / 5.2.1) |
5472
| --- | --- | --- |
55-
| Base triangles | 3000–3800 | 3338 / 3338 / 3338 |
56-
| LOD1 ratio | 0.32–0.62 of base | 0.4997 / 0.4997 / 0.4997 |
57-
| LOD2 ratio | 0.10–0.35 of base | 0.2199 / 0.2199 / 0.2193 |
58-
| Materials | exactly 3 distinct; ≥200 metal, ≥8 glass, ≥24 brass | 3 slots; 1530 / 24 / 209 |
73+
| Base triangles | 4200–5200 | 4726 / 4726 |
74+
| LOD1 ratio | 0.32–0.62 of base | 0.4998 / 0.4998 |
75+
| LOD2 ratio | 0.10–0.35 of base | 0.2196 / 0.2179 |
76+
| Materials | exactly 3 distinct; ≥200 metal, ≥8 glass, ≥24 brass | 3 slots; 2162 / 24 / 341 |
5977
| UVs | in `0..1`, AABB overlap ≤ 1e-5 | in range, overlap 0 |
6078
| Outer AABB | (0.300, 0.786, 1.287) m ± 0.01 | (0.3000, 0.7860, 1.2874), zmin 0 |
61-
| Collider tris | ≤ 120 | 78 |
62-
| Export | written, size > 0, removed after measuring | 251016 / 251016 / 251000 bytes |
79+
| Collider tris | ≤ 120 | 108 |
80+
| Export | written, size > 0, removed after measuring | 355288 / 355272 bytes |
6381

64-
Base triangles dropped from **3520 to 3338** in the quality pass: the
65-
open 4-gon cone roof became a closed square pyramid, cage crossings
66-
stopped sharing vertices, and a pane rebate replaced coplanar glass.
82+
Base triangles dropped from **3520 to 3338** in the first quality pass
83+
(closed square-pyramid roof, unshared cage crossings, pane rebate), then
84+
rose to **4726** when the model gained its column flutes, second collar,
85+
ladder bar, arm scrolls, hook ring, eave band, base tray and drip. The band
86+
moved from 3000–3800 to 4200–5200, the same ~±10 % slack around the
87+
measured count. The 5.1.2 column was dropped with this change: the new
88+
model was measured on 4.5.11 and 5.2.1 only.
6789

6890
DECIMATE COLLAPSE triangle counts are **not** identical across series —
69-
5.2.1 is 2 tris leaner on LOD2. The gate is a ratio band, not an exact
91+
5.2.1 is 8 tris leaner on LOD2. The gate is a ratio band, not an exact
7092
count. Bake pixels are stochastic; the gate is `has_data` plus operator
7193
`FINISHED`, not byte-identity. Construction uses no RNG. Export byte
7294
counts differ by 16 B on 5.2.1 (glTF serializer), not a gated axis.
@@ -95,11 +117,12 @@ Recomputed from the generated mesh, not asserted about the script.
95117
| Brace bite: deepest brace vertex inside the post / inside the arm (signed distance to the host shell) | ≥ 0.004 m each | 0.01305 / 0.01282 |
96118
| Arm underside vs roof peak | ≥ 0.008 m clearance | 0.05300 |
97119
| Hanger-to-roof BVH gap | ≤ 0.004 m | −0.00100 |
120+
| Scroll weld: deepest vertex of each of the 2 arm scrolls inside the arm | ≥ 0.004 m each, exactly 2 scrolls | 0.01709 |
98121

99122
### Falsifiers
100123

101-
Each violates one named budget. Every falsifier was run on 4.5.11,
102-
5.1.2 and 5.2.1 and returned the same code on each.
124+
Each violates one named budget. After the model change every falsifier
125+
was re-run on 4.5.11 and 5.2.1 and returned the same code on each.
103126

104127
| Flag | Budget violated | Exit |
105128
| --- | --- | --- |
@@ -109,7 +132,8 @@ Each violates one named budget. Every falsifier was run on 4.5.11,
109132
| `--float-brace` | brace-to-arm BVH gap | 17 |
110133
| `--sink-arm` | arm-over-roof clearance | 18 |
111134
| `--rake-post` | post plumb | 19 |
112-
| `--shallow-brace` | brace bite (the first build's ends: −0.00593 m into the post, 0.00000 m into the arm) | 20 |
135+
| `--shallow-brace` | brace bite (the first build's ends: −0.00638 m into the post, 0.00000 m into the arm) | 20 |
136+
| `--float-scroll` | scroll weld (scrolls dropped 0.03 m: −0.00873 m) | 21 |
113137

114138
`--sink-arm` lowers only the arm. Hang-station `hang_z` stays at post
115139
top so the cage does not follow, which is what lets the clearance budget
@@ -129,6 +153,7 @@ blender --background --python street_lantern.py -- --float-brace
129153
blender --background --python street_lantern.py -- --sink-arm
130154
blender --background --python street_lantern.py -- --rake-post
131155
blender --background --python street_lantern.py -- --shallow-brace
156+
blender --background --python street_lantern.py -- --float-scroll
132157
blender --background --python street_lantern.py -- --output lantern.png
133158
```
134159

@@ -138,7 +163,7 @@ Smoke passes no flags.
138163

139164
File-local. `9` is a valid check code. `10` is reserved for
140165
`gallery_framing.check_framing` on the `--output` path. `15`–`19` are the
141-
hygiene and joint-fit family; `20` is file-local.
166+
hygiene and joint-fit family; `20`–`21` are file-local.
142167

143168
| Code | Meaning |
144169
| --- | --- |
@@ -163,3 +188,4 @@ hygiene and joint-fit family; `20` is file-local.
163188
| 18 | Seat: arm-roof clearance or hanger-roof gap (`--sink-arm`) |
164189
| 19 | Post plumb or post size off the stated real-world size (`--rake-post`) |
165190
| 20 | Brace bite: a brace end not inside the post or the arm (`--shallow-brace`) |
191+
| 21 | Scroll weld: an arm scroll not welded into the arm, or not exactly two (`--float-scroll`) |
2.32 KB
Loading

0 commit comments

Comments
 (0)