Skip to content

Commit ce8a017

Browse files
TMHSDigitalclaude
andcommitted
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>
1 parent 03e5f8a commit ce8a017

13 files changed

Lines changed: 3021 additions & 9 deletions

File tree

‎.cursor-plugin/plugin.json‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@
164164
"showcase/iron-cauldron",
165165
"showcase/wooden-ladder",
166166
"showcase/hay-bale",
167-
"showcase/crate-stack"
167+
"showcase/crate-stack",
168+
"showcase/stone-archway"
168169
]
169170
}

‎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, 27 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: 4 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>27 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 27 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>27 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>
@@ -136,6 +136,7 @@ Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](show
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>
138138
<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>
139140
</p>
140141

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

‎docs/gallery/crate-stack/index.html‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1629,7 +1629,7 @@ <h2>Source</h2>
16291629
light(<span class="s">&quot;Rim&quot;</span>, (-<span class="n">1.5</span>, <span class="n">3.4</span>, <span class="n">2.6</span>), <span class="n">320.0</span>, <span class="n">3.0</span>, (<span class="n">0.60</span>, <span class="n">0.78</span>, <span class="n">1.00</span>), (-<span class="n">64</span>, <span class="n">0</span>, <span class="n">200</span>))
16301630
<span class="c"># Wedge sits between the subject and the wall so the pool lands on the</span>
16311631
<span class="c"># backdrop, not across the crates.</span>
1632-
light(<span class="s">&quot;Wedge&quot;</span>, (<span class="n">1.2</span>, <span class="n">2.7</span>, <span class="n">2.3</span>), <span class="n">380.0</span>, <span class="n">7.0</span>, (<span class="n">1.0</span>, <span class="n">0.76</span>, <span class="n">0.50</span>), (-<span class="n">92</span>, <span class="n">0</span>, <span class="n">196</span>))
1632+
light(<span class="s">&quot;Wedge&quot;</span>, (<span class="n">1.1</span>, <span class="n">4.3</span>, <span class="n">1.95</span>), <span class="n">560.0</span>, <span class="n">6.0</span>, (<span class="n">1.0</span>, <span class="n">0.72</span>, <span class="n">0.40</span>), (-<span class="n">94</span>, <span class="n">0</span>, <span class="n">194</span>))
16331633

16341634
cam_data = bpy.data.cameras.new(<span class="s">&quot;Cam&quot;</span>)
16351635
cam_data.lens = <span class="n">52.0</span>

‎docs/gallery/index.html‎

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ <h1>Examples and Showcase</h1>
272272
autocomplete="off" spellcheck="false" aria-label="Search examples and showcase pieces" />
273273
<button class="q-clear" id="qClear" type="button" aria-label="Clear search" hidden>&times;</button>
274274
</div>
275-
<span class="count" id="count" role="status" aria-live="polite">51 examples, 27 showcase pieces</span>
275+
<span class="count" id="count" role="status" aria-live="polite">51 examples, 28 showcase pieces</span>
276276
<div class="density" role="group" aria-label="Card density">
277277
<button class="density-btn" data-density="compact" type="button" aria-pressed="false">Compact</button>
278278
<button class="density-btn" data-density="detailed" type="button" aria-pressed="false">Detailed</button>
@@ -1182,6 +1182,17 @@ <h2><a href="crate-stack/">crate-stack</a></h2>
11821182
<a class="card-link" href="crate-stack/">View showcase piece <span aria-hidden="true">&rarr;</span></a>
11831183
</div>
11841184
</article>
1185+
<article class="card" data-tags="mesh export showcase">
1186+
<a class="card-media" href="stone-archway/" aria-label="stone-archway showcase piece detail page">
1187+
<img src="assets/stone-archway-hero.webp" alt="stone-archway — A procedural masonry archway — coursed piers, projecting imposts, nine voussoirs and a proud keystone — carried through UVs, bake, LOD, collider, and Unity…" loading="lazy" decoding="async" />
1188+
</a>
1189+
<div class="card-body">
1190+
<h2><a href="stone-archway/">stone-archway</a></h2>
1191+
<p class="teaches">A procedural masonry archway — coursed piers, projecting imposts, nine voussoirs and a proud keystone — carried through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.</p>
1192+
<p class="witnesses"><span class="tag">witnesses</span> Recomputed: 924 tris, two materials with 182 dressed and 364 ashlar faces re-stamped after the chamfer, UVs in 0..1 with zero AABB overlap, outer AABB 1.644×0.510×2.057 m, clear opening 1.203 m, zmin 0, hygiene 0 including zero coplanar disjoint pairs, both piers grounded, the springing joint an overlap, all eight mortar joints at 9.70 mm inside the 6–17 mm band, and every intrados vertex within 0.97 mm of the declared 0.60 m radius over 178°. --off-circle exits 19 on the circle fit; --wide-mortar exits 18 on the joint band.</p>
1193+
<a class="card-link" href="stone-archway/">View showcase piece <span aria-hidden="true">&rarr;</span></a>
1194+
</div>
1195+
</article>
11851196
</div>
11861197
<p class="noresults" id="noResults" hidden>Nothing matches the current filters.
11871198
<button class="chip" id="resetFilters" type="button">Clear search and tags</button></p>
@@ -1211,7 +1222,7 @@ <h2><a href="crate-stack/">crate-stack</a></h2>
12111222
var tagsToggle = document.getElementById('tagsToggle');
12121223
var toTop = document.getElementById('toTop');
12131224
var total = cards.length;
1214-
var COUNT_LABEL = '51 examples, 27 showcase pieces';
1225+
var COUNT_LABEL = '51 examples, 28 showcase pieces';
12151226
var LS_KEY = 'bdt-gallery-density';
12161227
var reduced = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
12171228

0 commit comments

Comments
 (0)