Skip to content

Commit 1c9c022

Browse files
fix(showcase): market-stall and watchtower visual quality pass (#179)
* fix(showcase): rebuild market stall with wrap plinths and a seated awning Capped foot cubes and counter-leg pads z-fought at Z=0, and braces punched the counter. Wrap plates and a post-bay brace plane 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 watchtower with a closed shake roof and planted stiles Incomplete courses left a wood U through the eave, and shoes lifted after the zmin snap. A solid cone plus post-snap collars are durable; per-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 0529f96 commit 1c9c022

12 files changed

Lines changed: 2539 additions & 650 deletions

File tree

-1.78 KB
Loading
-9.89 KB
Loading

‎docs/gallery/index.html‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -936,7 +936,7 @@ <h2><a href="campfire/">campfire</a></h2>
936936
<div class="card-body">
937937
<h2><a href="market-stall/">market-stall</a></h2>
938938
<p class="teaches">A procedural timber market stall through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.</p>
939-
<p class="witnesses"><span class="tag">witnesses</span> Recomputed: 4404 tris, three materials with 48 faces per awning stripe slot, UVs in 0..1 with zero AABB overlap, outer AABB 1.392×0.966×1.743 m, LOD ratios in band, convex collider 46 tris, non-empty glTF. --skip-decimate exits 9 on the LOD1 ratio budget.</p>
939+
<p class="witnesses"><span class="tag">witnesses</span> Recomputed: 4324 tris, three materials with 34 faces per awning stripe slot, UVs in 0..1 with zero AABB overlap, outer AABB 1.389×1.011×1.740 m, grounded zmin, 4 wrap feet, brace-counter overlap 0, awning seat 4 mm, post plumb 0, LOD ratios in band, convex collider 58 tris, non-empty glTF. Hygiene all zero. --skip-decimate exits 9; --stray-vert 15; --lift-z/--short-feet 16; --low-brace 17; --float-awning 18; --rake-posts 19.</p>
940940
<a class="card-link" href="market-stall/">View example <span aria-hidden="true">&rarr;</span></a>
941941
</div>
942942
</article>
@@ -991,7 +991,7 @@ <h2><a href="fence-kit/">fence-kit</a></h2>
991991
<div class="card-body">
992992
<h2><a href="watchtower/">watchtower</a></h2>
993993
<p class="teaches">A procedural timber watchtower through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.</p>
994-
<p class="witnesses"><span class="tag">witnesses</span> Recomputed: 5220 tris, three materials with 84 metal and 126 roof faces, UVs in 0..1 with zero AABB overlap, outer AABB 1.434×1.434×1.982 m, LOD ratios in band, convex collider 56 tris, non-empty glTF. --skip-decimate exits 9 on the LOD1 ratio budget.</p>
994+
<p class="witnesses"><span class="tag">witnesses</span> Recomputed: 6408 tris, three materials with 300 metal and 126 roof faces, UVs in 0..1 with zero AABB overlap, outer AABB 1.594×1.594×2.973 m, grounded zmin, 4 iron shoes, rail engage 18 mm, collar standoff 2 mm, post plumb 0, LOD ratios in band (5.2 COLLAPSE leaner on LOD2), convex collider 150 tris, non-empty glTF. Hygiene all zero. --skip-decimate exits 9; --stray-vert 15; --lift-z/--short-shoes 16; --short-rails 17; --float-band 18; --rake-posts 19.</p>
995995
<a class="card-link" href="watchtower/">View example <span aria-hidden="true">&rarr;</span></a>
996996
</div>
997997
</article>

‎docs/gallery/market-stall/index.html‎

Lines changed: 630 additions & 163 deletions
Large diffs are not rendered by default.

‎docs/gallery/watchtower/index.html‎

Lines changed: 586 additions & 150 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
@@ -57,7 +57,7 @@
5757
"name": "market-stall",
5858
"dir": "showcase/market-stall",
5959
"teaches": "A procedural timber market stall through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.",
60-
"witnessesFix": "Recomputed: 4404 tris, three materials with 48 faces per awning stripe slot, UVs in 0..1 with zero AABB overlap, outer AABB 1.392×0.966×1.743 m, LOD ratios in band, convex collider 46 tris, non-empty glTF. --skip-decimate exits 9 on the LOD1 ratio budget.",
60+
"witnessesFix": "Recomputed: 4324 tris, three materials with 34 faces per awning stripe slot, UVs in 0..1 with zero AABB overlap, outer AABB 1.389×1.011×1.740 m, grounded zmin, 4 wrap feet, brace-counter overlap 0, awning seat 4 mm, post plumb 0, LOD ratios in band, convex collider 58 tris, non-empty glTF. Hygiene all zero. --skip-decimate exits 9; --stray-vert 15; --lift-z/--short-feet 16; --low-brace 17; --float-awning 18; --rake-posts 19.",
6161
"hero": "docs/gallery/assets/market-stall-hero.webp",
6262
"preview": "showcase/market-stall/preview.webp",
6363
"tags": [
@@ -117,7 +117,7 @@
117117
"name": "watchtower",
118118
"dir": "showcase/watchtower",
119119
"teaches": "A procedural timber watchtower through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.",
120-
"witnessesFix": "Recomputed: 5220 tris, three materials with 84 metal and 126 roof faces, UVs in 0..1 with zero AABB overlap, outer AABB 1.434×1.434×1.982 m, LOD ratios in band, convex collider 56 tris, non-empty glTF. --skip-decimate exits 9 on the LOD1 ratio budget.",
120+
"witnessesFix": "Recomputed: 6408 tris, three materials with 300 metal and 126 roof faces, UVs in 0..1 with zero AABB overlap, outer AABB 1.594×1.594×2.973 m, grounded zmin, 4 iron shoes, rail engage 18 mm, collar standoff 2 mm, post plumb 0, LOD ratios in band (5.2 COLLAPSE leaner on LOD2), convex collider 150 tris, non-empty glTF. Hygiene all zero. --skip-decimate exits 9; --stray-vert 15; --lift-z/--short-shoes 16; --short-rails 17; --float-band 18; --rake-posts 19.",
121121
"hero": "docs/gallery/assets/watchtower-hero.webp",
122122
"preview": "showcase/watchtower/preview.webp",
123123
"tags": [

‎showcase/market-stall/README.md‎

Lines changed: 74 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
# Market stall
22

3-
A showcase piece, not an example. Procedural timber stall (posts with feet,
4-
slanted rafters, slatted counter and shelf, back-wall planks, eave fascia,
5-
striped awning and valance) then the shipped pipeline: unique-cell UVs,
6-
Cycles high-to-low normal bake, LOD chain, convex collider, Unity glTF
7-
export.
3+
A showcase piece, not an example. Procedural timber stall (corner posts
4+
with wrap plinths, slatted counter and shelf, back-wall planks, side
5+
braces that sit in the post bay, striped awning with a front roller and
6+
hanging valance) then the shipped pipeline: unique-cell UVs, Cycles
7+
high-to-low normal bake, LOD chain, convex collider, Unity glTF export.
8+
9+
The old piece used capped foot cubes coplanar with the post bottoms and
10+
counter-leg pads coplanar with the legs, which z-fought at Z=0. Wrap
11+
plates stand off the post; counter legs go to Z=0 without a second
12+
bottom face.
813

914
It asserts **budget conformance** of the generated result. It does not
1015
witness an API contract. "It rendered without error" is not a check.
@@ -22,38 +27,82 @@ materials, UVs, evaluated LOD, collider, or export file.
2227

2328
| Axis | Declared | Measured (4.5.11 / 5.1.2 / 5.2.1) |
2429
| --- | --- | --- |
25-
| Base triangles | 4280–4550 | 4404 / 4404 / 4404 |
30+
| Base triangles | 3900–5200 | 4324 / 4324 / 4324 |
2631
| LOD1 ratio | 0.32–0.62 of base | 0.5000 / 0.5000 / 0.5000 |
27-
| LOD2 ratio | 0.10–0.35 of base | 0.2198 / 0.2198 / 0.2198 |
28-
| Materials | exactly 3 distinct, ≥16 faces per stripe slot | 3 slots, 48 / 48 stripe faces |
32+
| LOD2 ratio | 0.10–0.35 of base | 0.2197 / 0.2197 / 0.2197 |
33+
| Materials | exactly 3 distinct; ≥16 faces per stripe slot | 3 slots; 34 / 34 stripe faces |
2934
| UVs | in `0..1`, AABB overlap ≤ 1e-5 | in range, overlap 0 |
30-
| Outer AABB | (1.392, 0.966, 1.743) m ± 0.01 | (1.3915, 0.9659, 1.7430), zmin 0 |
31-
| Collider tris | ≤ 80 | 46 |
32-
| Export | written, size > 0 | 316748 / 316748 / 316724 bytes |
35+
| Outer AABB | (1.389, 1.011, 1.740) m ± 0.01 | (1.3892, 1.0107, 1.7402), zmin 0 |
36+
| Collider tris | ≤ 80 | 58 |
37+
| Export | written, size > 0 | 312752 / 312752 / 312728 bytes |
38+
39+
### Hygiene
40+
41+
Recomputed from the generated mesh, not asserted about the script.
3342

34-
DECIMATE COLLAPSE triangle counts are **not** guaranteed identical across
35-
series — the gate is a ratio band, not an exact count. This mesh happened
36-
to match on 4.5.11 / 5.1.2 / 5.2.1. Bake pixels are stochastic; the gate
37-
is `has_data` plus operator `FINISHED`, not byte-identity. Construction
38-
uses no RNG. glTF byte size differs by a few bytes across series.
43+
| Axis | Declared | Measured (all three) |
44+
| --- | --- | --- |
45+
| Non-manifold edges | 0 | 0 |
46+
| Loose verts / edges | 0 / 0 | 0 / 0 |
47+
| Doubles merged at 1e-5 | 0 | 0 |
48+
| Zero-area faces | 0 | 0 |
49+
| N-gons | 0 | 0 |
50+
| Coplanar disjoint face pairs | 0 | 0 |
51+
| Grounded: `zmin` | within 1e-4 of 0 | 0.0000 |
52+
| Named supports: 4 wrap feet | each `zmin` ≤ 1e-3 | 4, foot_z 0.00000 |
53+
| Frame plan | 1.36 × 0.92 m ± 0.04 | 1.3600 × 0.9200 |
54+
55+
### Joint fit and seat
3956

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.
57+
| Axis | Declared | Measured (all three) |
58+
| --- | --- | --- |
59+
| Brace-vs-counter overlap | ≤ 1e-6 m³ | 0.000000 |
60+
| Header-post tenon engage | ≥ 0.4 × tenon | 0.0595 |
61+
| Awning-on-header seat | −0.002–0.010 m | 0.00378 |
62+
| Post plumb (XY drift) | ≤ 0.008 m | 0.00000 |
63+
64+
DECIMATE COLLAPSE triangle counts are **not** identical across series —
65+
the gate is a ratio band, not an exact count. Bake pixels are
66+
stochastic; the gate is `has_data` plus operator `FINISHED`, not
67+
byte-identity. Construction uses no RNG. Export byte counts differ by
68+
24 B on 5.2.1 (glTF serializer), not a gated axis.
69+
70+
### Falsifiers
71+
72+
Each violates one named budget. All eight were run on 4.5.11, 5.1.2 and
73+
5.2.1 and returned the same code on each.
74+
75+
| Flag | Budget violated | Exit |
76+
| --- | --- | --- |
77+
| `--skip-decimate` | LOD1 ratio band | 9 |
78+
| `--stray-vert` | loose vertex count is 0 | 15 |
79+
| `--lift-z` | bounding box `zmin` is 0 | 16 |
80+
| `--short-feet` | named wrap-foot supports at Z=0 | 16 |
81+
| `--low-brace` | brace-vs-counter overlap | 17 |
82+
| `--float-awning` | awning-on-header seat | 18 |
83+
| `--rake-posts` | post plumb | 19 |
4284

4385
## Run
4486

4587
```bash
4688
blender --background --python market_stall.py --
4789
blender --background --python market_stall.py -- --skip-decimate
90+
blender --background --python market_stall.py -- --stray-vert
91+
blender --background --python market_stall.py -- --lift-z
92+
blender --background --python market_stall.py -- --short-feet
93+
blender --background --python market_stall.py -- --low-brace
94+
blender --background --python market_stall.py -- --float-awning
95+
blender --background --python market_stall.py -- --rake-posts
4896
blender --background --python market_stall.py -- --output stall.png
4997
```
5098

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

53101
## Exit codes
54102

55103
File-local. `9` is a valid check code. `10` is reserved for
56-
`gallery_framing.check_framing` on the `--output` path.
104+
`gallery_framing.check_framing` on the `--output` path. `15`–`19` are the
105+
hygiene and joint-fit family.
57106

58107
| Code | Meaning |
59108
| --- | --- |
@@ -72,3 +121,8 @@ File-local. `9` is a valid check code. `10` is reserved for
72121
| 12 | Bake did not finish or image has no data |
73122
| 13 | Export file missing or empty |
74123
| 14 | `--output` produced no file |
124+
| 15 | Mesh hygiene: loose, non-manifold, zero-area, doubles, n-gons, z-fight |
125+
| 16 | Not grounded: bounding box `zmin` off 0, or a named wrap foot floats |
126+
| 17 | Joint fit: brace occupying the counter volume |
127+
| 18 | Seat: awning-on-header gap |
128+
| 19 | Post plumb or frame plan off the stated real-world size |

0 commit comments

Comments
 (0)