Skip to content

Commit 0cc8197

Browse files
TMHSDigitalclaude
andauthored
feat: add crate-stack and stone-archway showcase pieces (#199)
* feat: add crate-stack showcase piece Three shipping crates stacked, built by one generator called three times with a per-instance seed. The subject is reuse with variation: the seed drives yaw and plank widths so the crates read as three of the same design rather than one model pasted three times, and the README says plainly that true instancing and per-instance geometry variation are mutually exclusive. Budgets recomputed from the finished mesh, measured before they were written: 4380 tris, 2 materials with 216 iron and 2436 timber faces, UVs in 0..1 with zero overlap, outer AABB 0.658x0.524x0.704 m, each crate's own footprint 0.585x0.425 m in its own frame, three ground runners at z=0, both crate-to-crate seats overlapping, LOD ratios in band, 202-tri collider, non-empty glTF, and hygiene zero across loose/non-manifold/zero-area/ doubles/n-gons/coplanar-disjoint. Six falsifiers, each breaking one named budget, all proven on 4.5.11, 5.1.2 and 5.2.1 with identical exit codes: --skip-decimate 9, --stray-vert 15, --lift-z 16, --short-skids 16, --float-stack 18, --same-seed 20. Three findings the budgets forced, all documented in the README: - Shape filters had to move to principal axes. Every part is axis-aligned in its crate's frame then rotated about Z, so a world-AABB filter measures the rotated box: a 0.554 m board yawed 0.09 rad reports 0.061 m of depth instead of 0.013 m, and every thickness-keyed filter matched nothing. - Stack levels had to be clustered from the runners the mesh actually has. Binning against the declared pitch put a lid on the wrong level as soon as a falsifier shifted a crate, and the seat budget then compared a crate against itself. - find_doubles caught two real joints, not false positives: the corner straps sat flush with the post corner, and the lid rested exactly on the rail top. Both now bite into their host. Falsifiers were also retuned so each fails on its own budget rather than on an earlier check: the stray vertex sits inside the silhouette, --short-skids floats one of three runners so the AABB still grounds, and --same-seed collapses only the design stream while placement stays per-instance so the footprint is unchanged. LOD2 is the one value that differs across versions (878 tris on 5.2, 934 on 4.5 and 5.1) — DECIMATE COLLAPSE, which is why the gate is a ratio band. Adds ~1.0 s to smoke on 4.5/5.1 and ~1.2 s on 5.2. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> * fix: warm the crate-stack wedge pool Building the contact sheet against the pinned calibration set (armature-bend, damped-track-aim, bmesh-gear) showed the wedge reading as a cool grey band rather than the warm pool the house style calls for. Move it closer to the backdrop, raise it to 560 W, and shift its colour to (1.0, 0.72, 0.40). Lighting only — no geometry, no budget, no assertion, no exit code changes. Mean luminance 0.2185, inside the calibration band [0.1722, 0.3048]. Hero and preview re-rendered; contact sheet committed under docs/gallery/contact-sheets/. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> * feat: add stone-archway showcase piece A freestanding masonry arch: two coursed piers, projecting imposts, nine voussoirs turning a semicircle, and a keystone standing proud at the crown. The headline budget is the one an arch can fail invisibly. Nine wedge blocks laid in a row are still nine wedge blocks; what makes them an arch is that their intrados vertices sit on a circle. The piece recomputes that circle from vertex positions rather than from the angles the generator used, and asserts every intrados vertex lands within 4 mm of the declared 0.60 m radius over an arc of at least 168 degrees. Measured: 0.97 mm over 178.0 degrees. Other budgets, all recomputed: 924 tris, two materials with 182 dressed and 364 ashlar faces, UVs in 0..1 with zero overlap, outer AABB 1.644x0.510x2.057 m, clear opening 1.203 m, both piers grounded, the springing joint an overlap, all eight mortar joints at 9.70 mm inside a 6-17 mm band, 168-tri collider, non-empty glTF, and hygiene zero across loose/non-manifold/zero-area/doubles/n-gons/coplanar-disjoint. Seven falsifiers, each breaking one named budget, all proven on 4.5.11, 5.1.2 and 5.2.1 with identical exit codes: --skip-decimate 9, --stray-vert 15, --lift-z 16, --float-pier 16, --sink-keystone 17, --wide-mortar 18, --off-circle 19. Four findings the budgets forced, all documented in the README: - bmesh.ops.bevel gives every face it creates material_index 0. Chamfering nineteen blocks left 30 faces on the dressed slot and moved 464 to ashlar; the slot count and the distinct-material check both still passed. Only the per-material face floor caught it. Materials are now re-stamped per block after the bevel. - The impost landed exactly on the top course — same footprint, same plane, coincident face centres. It now sits on its own mortar bed. - BVHTree.find_nearest is unsigned, so a voussoir seated inside the pier head reported a 5.4 mm gap where there was none. Joint gaps now test overlap first. - Joint gaps need measuring both ways: the keystone's radial faces are wider in Y than its neighbours', so every keystone vertex on the joint lies outside the neighbour and read 33 mm instead of 9.7 mm. Three falsifiers needed the model changed rather than the budget loosened. --sink-keystone originally shrank the Y bounding box and tripped the AABB gate, so imposts were added to own the envelope — correct masonry the arch was missing. --off-circle began as --flat-arch, which is 0.62 m shorter and also fails on the bounding box, proving nothing about the circle fit. --float-pier tripped the z-fight budget because the impost was pinned to an absolute height while its courses rose into it. LOD2 is the one value that differs across versions (196 tris on 5.2, 202 on 4.5 and 5.1) — DECIMATE COLLAPSE, which is why the gate is a ratio band. Adds ~0.82 s to smoke on 4.5, ~0.85 s on 5.1, ~0.98 s on 5.2. All 28 showcase pieces together run in 20.9 s on 5.2.1. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> * docs: sync the showcase candidate pool Mark crate-stack and stone-archway shipped, and restock the pool with four subjects identified while building them: rope bridge, grain sacks, brazier, apothecary shelf. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> --------- Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 parent 0718120 commit 0cc8197

19 files changed

Lines changed: 6398 additions & 8 deletions

File tree

‎.cursor-plugin/plugin.json‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,8 @@
163163
"showcase/tavern-stool",
164164
"showcase/iron-cauldron",
165165
"showcase/wooden-ladder",
166-
"showcase/hay-bale"
166+
"showcase/hay-bale",
167+
"showcase/crate-stack",
168+
"showcase/stone-archway"
167169
]
168170
}

‎CLAUDE.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ rules/<rule-name>.mdc - Anti-pattern rules, 9 total
2222
templates/<template-name>/ - Starter projects, 3 total
2323
snippets/<snippet-name>.py - Standalone code patterns, 27 total
2424
examples/<name>/ - Runnable smoke-gated examples, 59 total (+ gallery.json)
25-
showcase/<name>/ - Budget-conformance props, 26 pieces (sibling of examples/; see showcase/README.md)
25+
showcase/<name>/ - Budget-conformance props, 28 pieces (sibling of examples/; see showcase/README.md)
2626
scripts/build_gallery.py - Regenerates docs/gallery/ from examples/gallery.json + showcase/gallery.json
2727
scripts/site/ - Vendored landing-page build (Jinja2)
2828
docs/gallery/ - Committed generated gallery pages + hero renders

‎README.md‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
</p>
1919

2020
<p align="center">
21-
<strong>16 skills</strong> &nbsp;&bull;&nbsp; <strong>9 rules</strong> &nbsp;&bull;&nbsp; <strong>3 templates</strong> &nbsp;&bull;&nbsp; <strong>27 snippets</strong> &nbsp;&bull;&nbsp; <strong>59 examples</strong> &nbsp;&bull;&nbsp; <strong>26 showcase pieces</strong>
21+
<strong>16 skills</strong> &nbsp;&bull;&nbsp; <strong>9 rules</strong> &nbsp;&bull;&nbsp; <strong>3 templates</strong> &nbsp;&bull;&nbsp; <strong>27 snippets</strong> &nbsp;&bull;&nbsp; <strong>59 examples</strong> &nbsp;&bull;&nbsp; <strong>28 showcase pieces</strong>
2222
</p>
2323

2424
<p align="center">
@@ -37,7 +37,7 @@
3737

3838
## Overview
3939

40-
This repository ships **16 skills, 9 rules, 3 templates, 27 snippets, 59 examples, and 26 showcase pieces** for Blender Python development targeting Blender 5.2 LTS (current stable) with Blender 4.5 LTS fallback support. Blender 5.1 is prior stable.
40+
This repository ships **16 skills, 9 rules, 3 templates, 27 snippets, 59 examples, and 28 showcase pieces** for Blender Python development targeting Blender 5.2 LTS (current stable) with Blender 4.5 LTS fallback support. Blender 5.1 is prior stable.
4141

4242
The content is consumed by AI coding agents reading these files directly from a checkout — **there is no MCP server in this repository, and none is required**. Cursor applies `rules/*.mdc` automatically wherever their scope globs match and takes skills by name in chat; Claude Code reads `skills/` and `rules/` from the project workspace, or from this repo kept as a referenced checkout. Any agent that can read files in a workspace can use it the same way. There is no build step for the content — edit the Markdown and Python files directly.
4343

@@ -106,7 +106,7 @@ per-script exit-code model, are in
106106
Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](showcase/README.md).
107107

108108
<details>
109-
<summary><strong>26 showcase pieces</strong> — click to expand the preview grid</summary>
109+
<summary><strong>28 showcase pieces</strong> — click to expand the preview grid</summary>
110110

111111
<p align="center">
112112
<a href="showcase/shipping-crate/"><img src="showcase/shipping-crate/preview.webp" width="24%" alt="Shipping crate: a wooden slat crate with iron corner brackets on a dark studio floor, warm wedge on the back wall" /></a>
@@ -135,6 +135,8 @@ Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](show
135135
<a href="showcase/iron-cauldron/"><img src="showcase/iron-cauldron/preview.webp" width="24%" alt="Iron cauldron: a bulged iron pot hanging from a timber tripod on a dark studio floor" /></a>
136136
<a href="showcase/wooden-ladder/"><img src="showcase/wooden-ladder/preview.webp" width="24%" alt="Wooden ladder: a raked timber ladder with six rungs and iron shoes on a dark studio floor" /></a>
137137
<a href="showcase/hay-bale/"><img src="showcase/hay-bale/preview.webp" width="24%" alt="Hay bale: a bound straw bale with two sisal twine belts on a dark studio floor" /></a>
138+
<a href="showcase/crate-stack/"><img src="showcase/crate-stack/preview.webp" width="24%" alt="Crate stack: three slatted shipping crates stacked and yawed, each with iron corner straps and runners, on a dark studio floor" /></a>
139+
<a href="showcase/stone-archway/"><img src="showcase/stone-archway/preview.webp" width="24%" alt="Stone archway: a semicircular masonry arch with coursed piers, projecting imposts, nine voussoirs and a proud keystone, on a dark studio floor" /></a>
138140
</p>
139141

140142
[`shipping-crate`](showcase/shipping-crate/) — procedural crate through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets. Falsifier `--skip-decimate` exits 9.

‎ROADMAP.md‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,12 @@ Not committed; target list for the next content version. (v0.3.0 shipped the smo
131131
- ~~Cast-iron cooking cauldron on a tripod as a game-prop showcase piece~~ **SHIPPED** as `showcase/iron-cauldron/` — bulged open pot, bail, timber tripod, hook; `--skip-decimate` exits 9 on the LOD1 ratio band
132132
- ~~Wooden ladder (rungs, stiles, iron shoes) as a game-prop showcase piece~~ **SHIPPED** as `showcase/wooden-ladder/` — raked stiles, six rungs, iron shoes and straps; `--skip-decimate` exits 9 on the LOD1 ratio band
133133
- ~~Bound hay bale as a game-prop showcase piece~~ **SHIPPED** as `showcase/hay-bale/` — bevelled loaf, end nap, two sisal twine belts; `--skip-decimate` exits 9 on the LOD1 ratio band
134+
- ~~Stack of shipping crates as a game-prop showcase piece~~ **SHIPPED** as `showcase/crate-stack/` — one generator called three times with a per-instance seed driving yaw and plank widths, crates seated on the lid below; `--same-seed` exits 20 on the per-instance variation budget, `--float-stack` exits 18 on the seat
135+
- ~~Keystone archway with voussoirs as a game-prop showcase piece~~ **SHIPPED** as `showcase/stone-archway/` — coursed piers, projecting imposts, nine voussoirs, proud keystone; the intrados circle fit is recomputed from vertex positions and `--off-circle` exits 19 on it while leaving every other budget passing
136+
- Rope bridge (planks, rope rails, sag between anchors) as a game-prop showcase piece
137+
- Grain sacks (cloth sacks, some slumped, tied necks) as a game-prop showcase piece
138+
- Brazier (iron bowl on legs, coals, ash) as a game-prop showcase piece
139+
- Apothecary shelf (shelf unit, bottles and jars of varied form) as a game-prop showcase piece
134140
- Wooden yoke (oxbow, iron rings) as a game-prop showcase piece
135141
- Butter churn (staved tub, lid, dasher) as a game-prop showcase piece
136142
- ~~Small modular kit showcase on recognizable geometry (`modular-kit-snap` contract)~~ **SHIPPED** as `showcase/fence-kit/` — tiling post-and-rail section (AABB X is the tile width; does not re-witness the snap contract); `--skip-decimate` exits 9 on the LOD1 ratio band
24.8 KB
Loading
16.9 KB
Loading
53.4 KB
Loading
50.1 KB
Loading

0 commit comments

Comments
 (0)