Skip to content

Commit 3392d94

Browse files
TMHSDigitalclaude
andcommitted
feat(showcase): add desk-lamp (household)
This is the first piece in the household category, a game-ready balanced-arm architect's lamp in the Anglepoise pattern. A three-tier cast base is lofted as one shell from rounded-square loops, with a badge on the front riser. A swivel turret sits on a bearing washer and carries a yoke. Two parallelogram arm sections (0.32 and 0.36 m pin to pin) each have two parallel rods ending in eye bosses. Three knuckles have cast bosses at every pin station, seven through-pins, and knurled tension knobs on the base, elbow and shade pins. Three close-wound springs hang by looped ends on cross bars. The domed enamel shade has a white reflector, a wired rolled rim, a chrome band and a push switch, and a lamp glows in a screw cap on a bakelite socket. A flex drapes from the shade down both sections into the base, and a mains cable crosses the desk to a two-pin plug. Six materials: enamel, plated steel, bulb, rubber, reflector, bakelite. Blender: E:\Blender-Developer-Tools\.scratch\5.2\blender-5.2.1-windows-x64\blender.exe reports "Blender 5.2.1 LTS". 4.5 LTS and 5.1 are left to CI (not run locally). Recomputed budgets (5.2.1): - 30110 tris (band 29000-31500); LOD1 0.5000, LOD2 0.2200 - 6 materials: enamel 3972, steel 9210, bulb 348, rubber 1508, reflector 622, bakelite 384 faces - UVs in 0..1, overlap 0; AABB 0.7252 x 0.3606 x 0.4421 m, zmin 0 - collider 713 tris (ceiling 760); bake FINISHED; glTF 2229360 B - hygiene all 0, including coplanar cross-shell pairs. The first run measured 7987 pairs: boss, eye and pin caps of neighbouring stations on shared planes, and mirrored cheeks sharing rim planes. Stations are now staggered 0.3 mm, the far cheek is 0.4 mm smaller, and equal coaxial parts are turned half a facet apart. - joint pins: 7 pins, 23 eyes and bosses (3,3,4,4,3,3,3), worst axis offset 0.000 mm (band 0.3 mm), tilt 0, all spanned - springs: 3 coils, 6 loops, 4 bars, worst loop-to-bar-axis 0.000 mm (band 0.6 mm), every coil runs into 2 loops - stance: 11.76 kg, mass centre at x 0.0504, 39.6 mm inside the base footprint (floor 25 mm); base 0.180 m square; arms 0.320/0.360 m - 1 connected component (78 shells) - two default runs print identical measurements Falsifiers (flag -> measured -> exit): - --skip-decimate -> LOD1 ratio 1.0000 -> 9 - --stray-vert -> loose_v 1 -> 15 - --lift-z -> zmin 0.05000 -> 16 - --offset-pin -> elbow pin axis offset 0.00250 m -> 17 - --unhook-spring -> loop 0.01000 m off its bar -> 18 - --hollow-base -> 3.22 kg, centre x 0.184, margin -0.094 m -> 19 - --unscrew-bulb -> 2 components -> 20 The envelope was unchanged under every falsifier (identical AABB). --hollow-base (30974 tris) and --unhook-spring (29790) stay inside the triangle band. Render: render_hero.py wrote the hero and preview. Framing: fill x 0.775, y 0.844, margins 0.072-0.125. Asset-quality floors pass (edge90 0.038); a violation is remapped to exit 21. The normal bake is wired into the bakelite: baked into the enamel, the thin cheek plates' UV cells bled a bright arc onto the head knuckle in the hero. Asset sheet (docs/gallery/asset-sheets/desk-lamp.webp): it is not the least-designed object in the lineup. It reads at once as an Anglepoise, with visible springs, knuckles, knobs, a lit shade and a plugged cable, and it has more modelled structure than the hydrant. Weak point: the panel fits the cable and plug too, so the lamp is small in its tile and the knurling and bosses are below panel resolution. Contact sheet: luma 0.210 against calibration 0.237-0.243 (slightly dark); stage 0.191 against 0.192-0.252 (at the low edge); warm wedge +0.057 against +0.092/+0.105 and -0.144 (cooler than two members: the pool sits low on the wall behind the shade); saturation 0.303 against 0.153-0.237 (the red enamel). Thumbnail legibility is good. Subject fill is 0.775 horizontal, 0.844 vertical. Also updated: README, CLAUDE.md and ROADMAP counts and entries, the asset_sheet.py SELECT row, catalog.json, plugin.json and the regenerated gallery. build_gallery, check_site_links (94 pages, 0 failures), check_falsifier_targets, check_exit_code_readme, check_engine_id and check_gallery_images all pass. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1 parent 3711b62 commit 3392d94

53 files changed

Lines changed: 6198 additions & 85 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.cursor-plugin/plugin.json‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@
176176
"showcase/bookshelf",
177177
"showcase/book-trolley",
178178
"showcase/basketball-hoop",
179-
"showcase/pine-tree"
179+
"showcase/pine-tree",
180+
"showcase/desk-lamp"
180181
]
181182
}

‎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, 60 total (+ gallery.json)
25-
showcase/<name>/ - Budget-conformance props, 38 pieces, each with a gallery `category` (sibling of examples/; see showcase/README.md § Categories)
25+
showcase/<name>/ - Budget-conformance props, 39 pieces, each with a gallery `category` (sibling of examples/; see showcase/README.md § Categories)
2626
scripts/build_gallery.py - Regenerates docs/gallery/ from examples/gallery.json + showcase/gallery.json
2727
scripts/site/ - Vendored landing-page build (Jinja2); tokens.css is the shared palette
2828
tests/check_site_links.py - Internal link/anchor/alt gate over the built site (docs/)

‎README.md‎

Lines changed: 6 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>60 examples</strong> &nbsp;&bull;&nbsp; <strong>38 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>60 examples</strong> &nbsp;&bull;&nbsp; <strong>39 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, 60 examples, and 38 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, 60 examples, and 39 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>38 showcase pieces</strong> — click to expand the preview grid</summary>
109+
<summary><strong>39 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 stencilled PORT ROYAL and NO 17, with iron corner brackets and an end handle, on a dark studio floor, warm wedge on the back wall" /></a>
@@ -147,6 +147,7 @@ Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](show
147147
<a href="showcase/book-trolley/"><img src="showcase/book-trolley/preview.webp" width="24%" alt="Book trolley: a double-sided wooden library book truck on four casters, two sloped troughs of hardbacks leaning back spines out and loose books stacked on its deck, on a dark studio floor" /></a>
148148
<a href="showcase/basketball-hoop/"><img src="showcase/basketball-hoop/preview.webp" width="24%" alt="Basketball hoop: an outdoor in-ground goal with a padded steel gooseneck pole, a framed backboard with a red shooter's square, an orange rim and a white corded net, on a dark studio floor" /></a>
149149
<a href="showcase/pine-tree/"><img src="showcase/pine-tree/preview.webp" width="24%" alt="Pine tree: a 7 m Scots pine with a red-barked trunk on a flared, rooted base and ten tiers of drooping branches carrying spiky needled shoots, on a dark studio floor" /></a>
150+
<a href="showcase/desk-lamp/"><img src="showcase/desk-lamp/preview.webp" width="24%" alt="Desk lamp: a red balanced-arm lamp with a stepped base, parallel-rod arms, chrome springs and knurled knobs, and a domed shade glowing around its bulb, on a dark studio floor" /></a>
150151
</p>
151152

152153
[`shipping-crate`](showcase/shipping-crate/) — procedural crate through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets. Falsifier `--skip-decimate` exits 9.
@@ -221,6 +222,8 @@ Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](show
221222

222223
[`pine-tree`](showcase/pine-tree/) — the first `nature` piece: procedural Scots pine (buttressed trunk from root flare to leader, ten seeded whorls of crooked limbs, faceted needled shoots, dead stubs, hanging cones), whose every limb's seat in the bark, whorl spacing, trunk plumb and crown balance are recomputed from the mesh, through the same pipeline. Falsifiers `--float-branches` exits 17, `--lean-crown` 19, `--bunch-whorls` 20.
223224

225+
[`desk-lamp`](showcase/desk-lamp/) — the first `household` piece: procedural balanced-arm desk lamp (stepped cast base, two parallelogram arm sections pinned through knuckle bosses, three tension springs hung on cross bars, domed shade with reflector and lamp, draped flex and plugged cable), whose every joint pin coaxial through the eyes it joins, every spring end seated on its bar, and mass centre over the base footprint are recomputed from the mesh, through the same pipeline. Falsifiers `--offset-pin` exits 17, `--unhook-spring` 18, `--hollow-base` 19, `--unscrew-bulb` 20.
226+
224227
</details>
225228

226229
## Examples

‎ROADMAP.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ Not committed; target list for the next content version. (v0.3.0 shipped the smo
158158
- Showcase pieces above this line are category `village`. Candidates for the other categories (`showcase/README.md` § Categories):
159159
- **Sports:** ~~basketball hoop (pole, backboard, rim, hung net)~~ **SHIPPED** as `showcase/basketball-hoop/` — gooseneck pole on a bolted anchor plate, braced framed board with painted square, regulation rim, twelve-loop net hung on the rim hooks; `--drop-net` exits 18 on the loops threaded through the hooks while the envelope holds, `--tilt-rim` 19 on rim height/size/level, `--skip-decimate` 9 on the LOD1 ratio band; soccer goal (tube frame, netting), tennis net on posts, weight rack with plates and dumbbells; alternates bowling pins and ball, skateboard
160160
- **Nature:** ~~pine tree (trunk, tiered branch whorls)~~ **SHIPPED** as `showcase/pine-tree/` — buttressed trunk with surface roots, ten seeded whorls of limbs seated in the bark, faceted needled shoots, dead stubs and cones; `--float-branches` exits 17 on the branch seat, `--lean-crown` 19 on trunk plumb, `--bunch-whorls` 20 on whorl spacing, while the envelope holds; boulder cluster, fallen log with fungus, tree stump with mushrooms; alternates flowering shrub, cattail reeds
161-
- **Household:** articulated desk lamp, office chair (five-star base, casters), kitchen stool, mini fridge; alternates floor fan, laundry basket
161+
- **Household:** ~~articulated desk lamp~~ **SHIPPED** as `showcase/desk-lamp/` — stepped cast base, parallelogram arm sections pinned through knuckle bosses, three springs hung on cross bars, domed shade with reflector, lamp, flex and plugged cable; `--offset-pin` exits 17 on the pins coaxial with their eyes, `--unhook-spring` 18 on the spring ends seated on their bars, `--hollow-base` 19 on the mass centre over the base footprint, while the envelope holds; office chair (five-star base, casters), kitchen stool, mini fridge; alternates floor fan, laundry basket
162162
- **Vehicles:** traffic cone and barrier set, quad drone, hover bike, sci-fi cargo loader; alternates sci-fi supply crate
163163
- `persistent` app-handler witness — handlers registered without `@bpy.app.handlers.persistent` are dropped by `wm.read_homefile`/file load while persistent ones survive; assert the registered-handler set before and after a reload (silent loss AI code hits)
164164
- Link vs append witness — `bpy.data.libraries.load(link=True)` yields a linked, non-editable datablock (`library` set, `is_editable` False) while append yields a local copy; write a temp .blend with `bpy.data.libraries.write`, then assert both paths

‎docs/gallery/anvil/index.html‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ <h1>anvil</h1>
358358
<p>A procedural blacksmith anvil on a timber stump through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract.</p>
359359
</header>
360360
<main id="main">
361-
<nav class="pager" aria-label="Showcase pieces"><a rel="prev" href="../wheelbarrow/" aria-label="Previous showcase piece: wheelbarrow"><span aria-hidden="true">&larr;</span> wheelbarrow</a><span class="pager-pos hud">14 of 38 showcase pieces<span class="pager-keys"> &middot; <kbd>&larr;</kbd><kbd>&rarr;</kbd></span></span><a rel="next" href="../water-trough/" aria-label="Next showcase piece: water-trough">water-trough <span aria-hidden="true">&rarr;</span></a></nav>
361+
<nav class="pager" aria-label="Showcase pieces"><a rel="prev" href="../wheelbarrow/" aria-label="Previous showcase piece: wheelbarrow"><span aria-hidden="true">&larr;</span> wheelbarrow</a><span class="pager-pos hud">14 of 39 showcase pieces<span class="pager-keys"> &middot; <kbd>&larr;</kbd><kbd>&rarr;</kbd></span></span><a rel="next" href="../water-trough/" aria-label="Next showcase piece: water-trough">water-trough <span aria-hidden="true">&rarr;</span></a></nav>
362362
<button class="detail-hero" id="heroZoom" type="button" aria-label="View full size: A forged-steel anvil with a hammer-polished face and a flared, squared waist on a hooped timber stump, a cross-peen hammer on the floor and forge light on its flank.">
363363
<img src="../assets/anvil-hero.webp" alt="A forged-steel anvil with a hammer-polished face and a flared, squared waist on a hooped timber stump, a cross-peen hammer on the floor and forge light on its flank." width="1280" height="720" fetchpriority="high" />
364364
</button>
@@ -3716,7 +3716,7 @@ <h3><a href="../wooden-barrel/">wooden-barrel</a></h3>
37163716
</article>
37173717
</div>
37183718
</section>
3719-
<nav class="pager pager-foot" aria-label="Showcase pieces"><a rel="prev" href="../wheelbarrow/" aria-label="Previous showcase piece: wheelbarrow"><span aria-hidden="true">&larr;</span> wheelbarrow</a><span class="pager-pos hud">14 of 38 showcase pieces</span><a rel="next" href="../water-trough/" aria-label="Next showcase piece: water-trough">water-trough <span aria-hidden="true">&rarr;</span></a></nav>
3719+
<nav class="pager pager-foot" aria-label="Showcase pieces"><a rel="prev" href="../wheelbarrow/" aria-label="Previous showcase piece: wheelbarrow"><span aria-hidden="true">&larr;</span> wheelbarrow</a><span class="pager-pos hud">14 of 39 showcase pieces</span><a rel="next" href="../water-trough/" aria-label="Next showcase piece: water-trough">water-trough <span aria-hidden="true">&rarr;</span></a></nav>
37203720
</main>
37213721
<dialog class="lightbox" id="lightbox" aria-label="Full-size render">
37223722
<button class="lightbox-close" type="button" autofocus>Close</button>

‎docs/gallery/apothecary-shelf/index.html‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ <h1>apothecary-shelf</h1>
358358
<p>A procedural apothecary shelf — housed shelves, gallery rails, a drawer bank and an arched crest, stocked with fifteen lathed bottles, flasks and glazed jars, each corked or lidded and labelled — carried through UVs, bake, LOD, convex collider, and Unity glTF, asserting recomputed budgets rather than an API contract.</p>
359359
</header>
360360
<main id="main">
361-
<nav class="pager" aria-label="Showcase pieces"><a rel="prev" href="../brazier/" aria-label="Previous showcase piece: brazier"><span aria-hidden="true">&larr;</span> brazier</a><span class="pager-pos hud">32 of 38 showcase pieces<span class="pager-keys"> &middot; <kbd>&larr;</kbd><kbd>&rarr;</kbd></span></span><a rel="next" href="../wooden-yoke/" aria-label="Next showcase piece: wooden-yoke">wooden-yoke <span aria-hidden="true">&rarr;</span></a></nav>
361+
<nav class="pager" aria-label="Showcase pieces"><a rel="prev" href="../brazier/" aria-label="Previous showcase piece: brazier"><span aria-hidden="true">&larr;</span> brazier</a><span class="pager-pos hud">32 of 39 showcase pieces<span class="pager-keys"> &middot; <kbd>&larr;</kbd><kbd>&rarr;</kbd></span></span><a rel="next" href="../wooden-yoke/" aria-label="Next showcase piece: wooden-yoke">wooden-yoke <span aria-hidden="true">&rarr;</span></a></nav>
362362
<button class="detail-hero" id="heroZoom" type="button" aria-label="View full size: A stained wooden shelf with an arched crest, gallery rails and three brass-knobbed drawers, stocked with labelled glass bottles and flasks and cream and blue glazed jars.">
363363
<img src="../assets/apothecary-shelf-hero.webp" alt="A stained wooden shelf with an arched crest, gallery rails and three brass-knobbed drawers, stocked with labelled glass bottles and flasks and cream and blue glazed jars." width="1280" height="720" fetchpriority="high" />
364364
</button>
@@ -3733,7 +3733,7 @@ <h3><a href="../wooden-barrel/">wooden-barrel</a></h3>
37333733
</article>
37343734
</div>
37353735
</section>
3736-
<nav class="pager pager-foot" aria-label="Showcase pieces"><a rel="prev" href="../brazier/" aria-label="Previous showcase piece: brazier"><span aria-hidden="true">&larr;</span> brazier</a><span class="pager-pos hud">32 of 38 showcase pieces</span><a rel="next" href="../wooden-yoke/" aria-label="Next showcase piece: wooden-yoke">wooden-yoke <span aria-hidden="true">&rarr;</span></a></nav>
3736+
<nav class="pager pager-foot" aria-label="Showcase pieces"><a rel="prev" href="../brazier/" aria-label="Previous showcase piece: brazier"><span aria-hidden="true">&larr;</span> brazier</a><span class="pager-pos hud">32 of 39 showcase pieces</span><a rel="next" href="../wooden-yoke/" aria-label="Next showcase piece: wooden-yoke">wooden-yoke <span aria-hidden="true">&rarr;</span></a></nav>
37373737
</main>
37383738
<dialog class="lightbox" id="lightbox" aria-label="Full-size render">
37393739
<button class="lightbox-close" type="button" autofocus>Close</button>
57.3 KB
Loading
34.6 KB
Loading

‎docs/gallery/basketball-hoop/index.html‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ <h1>basketball-hoop</h1>
358358
<p>A procedural in-ground basketball goal — one-sweep gooseneck pole, braced framed backboard, regulation rim on a bolted flange and a twelve-loop tapered net hung on the rim hooks — through UVs, bake, LOD, convex collider, and Unity glTF, asserting recomputed budgets rather than an API contract.</p>
359359
</header>
360360
<main id="main">
361-
<nav class="pager" aria-label="Showcase pieces"><a rel="prev" href="../book-trolley/" aria-label="Previous showcase piece: book-trolley"><span aria-hidden="true">&larr;</span> book-trolley</a><span class="pager-pos hud">37 of 38 showcase pieces<span class="pager-keys"> &middot; <kbd>&larr;</kbd><kbd>&rarr;</kbd></span></span><a rel="next" href="../pine-tree/" aria-label="Next showcase piece: pine-tree">pine-tree <span aria-hidden="true">&rarr;</span></a></nav>
361+
<nav class="pager" aria-label="Showcase pieces"><a rel="prev" href="../book-trolley/" aria-label="Previous showcase piece: book-trolley"><span aria-hidden="true">&larr;</span> book-trolley</a><span class="pager-pos hud">37 of 39 showcase pieces<span class="pager-keys"> &middot; <kbd>&larr;</kbd><kbd>&rarr;</kbd></span></span><a rel="next" href="../pine-tree/" aria-label="Next showcase piece: pine-tree">pine-tree <span aria-hidden="true">&rarr;</span></a></nav>
362362
<button class="detail-hero" id="heroZoom" type="button" aria-label="View full size: An outdoor basketball goal: padded steel gooseneck pole on a bolted plate, braced framed backboard with a red shooter&#x27;s square, an orange rim and a white corded net.">
363363
<img src="../assets/basketball-hoop-hero.webp" alt="An outdoor basketball goal: padded steel gooseneck pole on a bolted plate, braced framed backboard with a red shooter&#x27;s square, an orange rim and a white corded net." width="1280" height="720" fetchpriority="high" />
364364
</button>
@@ -3403,7 +3403,7 @@ <h3><a href="../wooden-barrel/">wooden-barrel</a></h3>
34033403
</article>
34043404
</div>
34053405
</section>
3406-
<nav class="pager pager-foot" aria-label="Showcase pieces"><a rel="prev" href="../book-trolley/" aria-label="Previous showcase piece: book-trolley"><span aria-hidden="true">&larr;</span> book-trolley</a><span class="pager-pos hud">37 of 38 showcase pieces</span><a rel="next" href="../pine-tree/" aria-label="Next showcase piece: pine-tree">pine-tree <span aria-hidden="true">&rarr;</span></a></nav>
3406+
<nav class="pager pager-foot" aria-label="Showcase pieces"><a rel="prev" href="../book-trolley/" aria-label="Previous showcase piece: book-trolley"><span aria-hidden="true">&larr;</span> book-trolley</a><span class="pager-pos hud">37 of 39 showcase pieces</span><a rel="next" href="../pine-tree/" aria-label="Next showcase piece: pine-tree">pine-tree <span aria-hidden="true">&rarr;</span></a></nav>
34073407
</main>
34083408
<dialog class="lightbox" id="lightbox" aria-label="Full-size render">
34093409
<button class="lightbox-close" type="button" autofocus>Close</button>

0 commit comments

Comments
 (0)