Skip to content

Commit 75e750d

Browse files
TMHSDigitalclaude
andcommitted
docs(gallery): regenerate pages and contact sheets for round-three redesigns
Rebuilds docs/gallery for swatch-grid, turntable, light-link-studio, image-pixels-testcard, attribute-domain-shear, street-lantern, hand-pump, anvil, campfire, water-trough, watchtower, fence-kit, wooden-ladder and hitching-post, and recomposites their contact sheets. Drops 'mirroring its staves' from the water-trough alt, since the committed hero shows no visible reflection. check_site_links: 91 pages, 2599 internal references, 0 failures. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1 parent e178446 commit 75e750d

34 files changed

Lines changed: 2064 additions & 321 deletions

File tree

‎docs/gallery/anvil/index.html‎

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

‎docs/gallery/attribute-domain-shear/index.html‎

Lines changed: 200 additions & 26 deletions
Large diffs are not rendered by default.

‎docs/gallery/campfire/index.html‎

Lines changed: 214 additions & 15 deletions
Large diffs are not rendered by default.

‎docs/gallery/color-attribute-wheel/index.html‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1335,7 +1335,7 @@ <h3><a href="../custom-normals-shade/">custom-normals-shade</a></h3>
13351335
</article>
13361336
<article class="card mini">
13371337
<a class="card-media" href="../attribute-domain-shear/" tabindex="-1" aria-hidden="true">
1338-
<img src="../assets/attribute-domain-shear-hero.webp" alt="Two striped patio parasols labelled CORNER and POINT: the left has crisp crimson and cream stripes, the right has stripes smeared pink along the seams and a front panel turned cream." width="1280" height="720" loading="lazy" decoding="async" />
1338+
<img src="../assets/attribute-domain-shear-hero.webp" alt="Two patio parasols on a terracotta paver deck behind CORNER and POINT slate placards: the left has crisp crimson and cream stripes, the right has its stripes smeared pink." width="1280" height="720" loading="lazy" decoding="async" />
13391339
</a>
13401340
<div class="card-body">
13411341
<h3><a href="../attribute-domain-shear/">attribute-domain-shear</a></h3>

‎docs/gallery/compositor-glare/index.html‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1152,7 +1152,7 @@ <h2 id="related-h">Related</h2>
11521152
<div class="related-grid">
11531153
<article class="card mini">
11541154
<a class="card-media" href="../swatch-grid/" tabindex="-1" aria-hidden="true">
1155-
<img src="../assets/swatch-grid-hero.webp" alt="Six material spheres on graphite plinths in two tiers: mirror gold, brushed copper and red behind; blue, a glowing orange emissive globe and matte white in front." width="1280" height="720" loading="lazy" decoding="async" />
1155+
<img src="../assets/swatch-grid-hero.webp" alt="Six material spheres in gunmetal collars on a two-tier walnut riser, each over an engraved brass plaque: gold, copper, red plastic behind; blue plastic, emissive, white rough in front." width="1280" height="720" loading="lazy" decoding="async" />
11561156
</a>
11571157
<div class="card-body">
11581158
<h3><a href="../swatch-grid/">swatch-grid</a></h3>
@@ -1170,7 +1170,7 @@ <h3><a href="../text-version-stamp/">text-version-stamp</a></h3>
11701170
</article>
11711171
<article class="card mini">
11721172
<a class="card-media" href="../image-pixels-testcard/" tabindex="-1" aria-hidden="true">
1173-
<img src="../assets/image-pixels-testcard-hero.webp" alt="A monitor showing a colour-bar test card with a black circle and a greyscale strip." width="1280" height="720" loading="lazy" decoding="async" />
1173+
<img src="../assets/image-pixels-testcard-hero.webp" alt="A hooded broadcast reference monitor on a walnut desk showing a colour-bar test card with a black circle, a greyscale ramp and a PLUGE row." width="1280" height="720" loading="lazy" decoding="async" />
11741174
</a>
11751175
<div class="card-body">
11761176
<h3><a href="../image-pixels-testcard/">image-pixels-testcard</a></h3>

‎docs/gallery/custom-normals-shade/index.html‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2320,7 +2320,7 @@ <h3><a href="../color-attribute-wheel/">color-attribute-wheel</a></h3>
23202320
</article>
23212321
<article class="card mini">
23222322
<a class="card-media" href="../attribute-domain-shear/" tabindex="-1" aria-hidden="true">
2323-
<img src="../assets/attribute-domain-shear-hero.webp" alt="Two striped patio parasols labelled CORNER and POINT: the left has crisp crimson and cream stripes, the right has stripes smeared pink along the seams and a front panel turned cream." width="1280" height="720" loading="lazy" decoding="async" />
2323+
<img src="../assets/attribute-domain-shear-hero.webp" alt="Two patio parasols on a terracotta paver deck behind CORNER and POINT slate placards: the left has crisp crimson and cream stripes, the right has its stripes smeared pink." width="1280" height="720" loading="lazy" decoding="async" />
23242324
</a>
23252325
<div class="card-body">
23262326
<h3><a href="../attribute-domain-shear/">attribute-domain-shear</a></h3>

‎docs/gallery/damped-track-aim/index.html‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1317,7 +1317,7 @@ <h2 id="related-h">Related</h2>
13171317
<div class="related-grid">
13181318
<article class="card mini">
13191319
<a class="card-media" href="../turntable/" tabindex="-1" aria-hidden="true">
1320-
<img src="../assets/turntable-hero.webp" alt="A smooth copper monkey head (Suzanne) turned three-quarters on a black turntable with a brushed metal platter." width="1280" height="720" loading="lazy" decoding="async" />
1320+
<img src="../assets/turntable-hero.webp" alt="A copper Suzanne turned three-quarters on a lathed display turntable: vented motor base with a status lamp, a steel platter ticked every keyed frame, and an amber arrow on the mat." width="1280" height="720" loading="lazy" decoding="async" />
13211321
</a>
13221322
<div class="card-body">
13231323
<h3><a href="../turntable/">turntable</a></h3>

‎docs/gallery/driver-wave/index.html‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1188,7 +1188,7 @@ <h2 id="related-h">Related</h2>
11881188
<div class="related-grid">
11891189
<article class="card mini">
11901190
<a class="card-media" href="../turntable/" tabindex="-1" aria-hidden="true">
1191-
<img src="../assets/turntable-hero.webp" alt="A smooth copper monkey head (Suzanne) turned three-quarters on a black turntable with a brushed metal platter." width="1280" height="720" loading="lazy" decoding="async" />
1191+
<img src="../assets/turntable-hero.webp" alt="A copper Suzanne turned three-quarters on a lathed display turntable: vented motor base with a status lamp, a steel platter ticked every keyed frame, and an amber arrow on the mat." width="1280" height="720" loading="lazy" decoding="async" />
11921192
</a>
11931193
<div class="card-body">
11941194
<h3><a href="../turntable/">turntable</a></h3>

‎docs/gallery/fence-kit/index.html‎

Lines changed: 85 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@
1616
<meta property="og:image" content="https://tmhsdigital.github.io/Blender-Developer-Tools/gallery/assets/fence-kit-hero.webp" />
1717
<meta property="og:image:width" content="1280" />
1818
<meta property="og:image:height" content="720" />
19-
<meta property="og:image:alt" content="A run of three weathered post-and-rail fence sections on a packed-earth strip, joined post to post at the tile pitch, each with a diagonal board brace and dark iron bands." />
19+
<meta property="og:image:alt" content="A weathered post-and-rail fence run of three sections on a packed-earth strip, one capped post at each joint, each bay with a diagonal board brace and dark iron bands." />
2020
<meta property="og:site_name" content="Blender Developer Tools" />
2121
<meta name="twitter:card" content="summary_large_image" />
2222
<meta name="twitter:title" content="fence-kit — Showcase — Blender Developer Tools" />
2323
<meta name="twitter:description" content="A procedural post-and-rail fence section that fits its 1.60 m tile, with one-shell iron bands and a board brace housed in both posts, through UVs, bake, LOD, collider, and Unity glTF, asserting recomputed budgets rather than an API contract." />
2424
<meta name="twitter:image" content="https://tmhsdigital.github.io/Blender-Developer-Tools/gallery/assets/fence-kit-hero.webp" />
25-
<meta name="twitter:image:alt" content="A run of three weathered post-and-rail fence sections on a packed-earth strip, joined post to post at the tile pitch, each with a diagonal board brace and dark iron bands." />
25+
<meta name="twitter:image:alt" content="A weathered post-and-rail fence run of three sections on a packed-earth strip, one capped post at each joint, each bay with a diagonal board brace and dark iron bands." />
2626
<style>
2727
/* fonts are deployed by the landing build (docs/fonts/) */
2828
@font-face { font-family: 'Barlow Condensed'; font-weight: 600; font-display: swap;
@@ -351,8 +351,8 @@ <h1>fence-kit</h1>
351351
</header>
352352
<main id="main">
353353
<nav class="pager" aria-label="Showcase pieces"><a rel="prev" href="../terrain-scatter/" aria-label="Previous showcase piece: terrain-scatter"><span aria-hidden="true">&larr;</span> terrain-scatter</a><span class="pager-pos hud">9 of 36 showcase pieces<span class="pager-keys"> &middot; <kbd>&larr;</kbd><kbd>&rarr;</kbd></span></span><a rel="next" href="../watchtower/" aria-label="Next showcase piece: watchtower">watchtower <span aria-hidden="true">&rarr;</span></a></nav>
354-
<button class="detail-hero" id="heroZoom" type="button" aria-label="View full size: A run of three weathered post-and-rail fence sections on a packed-earth strip, joined post to post at the tile pitch, each with a diagonal board brace and dark iron bands.">
355-
<img src="../assets/fence-kit-hero.webp" alt="A run of three weathered post-and-rail fence sections on a packed-earth strip, joined post to post at the tile pitch, each with a diagonal board brace and dark iron bands." width="1280" height="720" fetchpriority="high" />
354+
<button class="detail-hero" id="heroZoom" type="button" aria-label="View full size: A weathered post-and-rail fence run of three sections on a packed-earth strip, one capped post at each joint, each bay with a diagonal board brace and dark iron bands.">
355+
<img src="../assets/fence-kit-hero.webp" alt="A weathered post-and-rail fence run of three sections on a packed-earth strip, one capped post at each joint, each bay with a diagonal board brace and dark iron bands." width="1280" height="720" fetchpriority="high" />
356356
</button>
357357
<p class="zoom-hint">Rendered headless by the showcase piece itself — click to zoom.</p>
358358
<div class="callout"><span class="tag">witnesses</span> Recomputed: 1012 tris, two materials with 116 metal and 390 wood faces, UVs in 0..1 with zero AABB overlap, outer AABB 1.596×0.134×1.232 m inside the 1.60 m tile, grounded zmin, 2 iron shoes, brace housed 12 mm in both posts and bearing 2 mm on the middle rail, rail-to-post gap 0.93 mm, rail span 1.362 m, LOD ratios in band (5.2 COLLAPSE leaner on LOD2), convex collider 24 tris, hygiene all zero, non-empty glTF. --skip-decimate exits 9; --stray-vert 15; --lift-z/--short-shoes 16; --short-brace 17; --gap-rails 18; --long-rails 19; --float-brace 20; --wide-tile 21.</div>
@@ -364,7 +364,7 @@ <h1>fence-kit</h1>
364364
<section class="detail-section md">
365365
<p>A showcase piece, not an example. A procedural post-and-rail fence section (two posts, pyramidal caps, three rails, a kickboard, a board brace, iron shoes and U-bands), then the shipped pipeline: unique-cell UVs, a Cycles high-to-low normal bake, an LOD chain, a convex collider and a Unity glTF export.</p>
366366
<p>Posts, rails, kick, brace and bands share named stations (<code>POST_XS</code>, <code>RAIL_ZS</code>, <code>SHOE_H</code>). The post stations come from the tile. The outer faces of the iron bands sit <code>KIT_CLEAR</code> (2 mm) inside the tile edge, so copies placed at the 1.60 m pitch meet band to band without interpenetrating or sharing a plane. Each band is one shell, mitred at the corners. A rail band is a U open toward the span, with its arms stopped inside the post&#x27;s inner face. The brace is a board with plumb-cut ends, face-nailed to the middle rail and housed 12 mm into both posts. It clears the bottom rail at the left post and the top rail at the right one. Rails and kick tenon into the post volume.</p>
367-
<p><strong>Hero.</strong> The still shows the kit doing its job: three linked duplicates of the one checked mesh at the 1.60 m pitch, so every joint in the picture is the tile fit the budgets assert — the paired posts meet band to band, <code>KIT_CLEAR</code> apart. The run stands in a render-only packed-earth strip, and the wood weathers in broad silver-grey patches (object-space noise) over the per-member tone and grain. The strip and the duplicates are staging; the asset sheet judges the single <code>FenceLow</code> section.</p>
367+
<p><strong>Hero.</strong> The still shows a three-section run that reads as one fence, with one post at each joint. The leading section is the checked <code>FenceLow</code> mesh. Each follow-on section is a render-only copy with its first post group (post, cap, shoe and bands, found as mesh shells) removed, stepped at the post pitch <code>2·HX</code>. Its rails and brace then tenon into the previous section&#x27;s trailing post. Placed whole at the 1.60 m tile pitch, the sections meet band to band, which is the tile fit the budgets assert, but every joint shows a doubled post. The earlier hero did exactly that. The run stands in a render-only packed-earth strip, and the wood weathers in broad silver-grey patches (object-space noise) over the per-member tone and grain. The strip and the trimmed copies are staging; the asset sheet judges the single <code>FenceLow</code> section.</p>
368368
<p>It asserts <strong>budget conformance</strong> of the generated result. It does not witness an API contract. &quot;It rendered without error&quot; is not a check. This piece does not re-witness the <code>modular-kit-snap</code> snap contract.</p>
369369
<p><strong>Composes</strong> skills <code>mesh-editing-and-bmesh</code>, <code>bake-high-to-low</code>, <code>depsgraph-and-evaluated-data</code>, <code>engine-export-presets</code>, and snippets <code>bake_normal_high_to_low.py</code>, <code>setup_bake_target_image.py</code>, <code>lod_chain.py</code> / <code>decimate_to_budget.py</code>, <code>convex_hull_collider.py</code>, <code>export_preset_unity.py</code> (helpers copied, not imported as a package). Hygiene combinatorics match <code>examples/mesh-hygiene-audit</code> (copied, not imported).</p>
370370
<p>Intended size: 1.60 m tile, 1.14 m posts, 0.11 m post stock. Outer AABB 1.596 × 0.134 × 1.232 m.</p>
@@ -404,9 +404,9 @@ <h2 id="exit-codes">Exit codes<a class="anchor" href="#exit-codes" aria-label="L
404404
<h2>Source</h2>
405405
<div class="src-meta">
406406
<code>showcase/fence-kit/fence_kit.py</code>
407-
<span>1453 lines &middot; <a href="https://github.com/TMHSDigital/Blender-Developer-Tools/tree/main/showcase/fence-kit/fence_kit.py">View on GitHub &rarr;</a></span>
407+
<span>1487 lines &middot; <a href="https://github.com/TMHSDigital/Blender-Developer-Tools/tree/main/showcase/fence-kit/fence_kit.py">View on GitHub &rarr;</a></span>
408408
</div>
409-
<div class="code" data-lines="1453">
409+
<div class="code" data-lines="1487">
410410
<pre class="gutter" aria-hidden="true">1
411411
2
412412
3
@@ -1859,7 +1859,41 @@ <h2>Source</h2>
18591859
1450
18601860
1451
18611861
1452
1862-
1453</pre><pre class="code-lines"><span class="s">&quot;&quot;&quot;Game-ready post-and-rail fence kit — a showcase piece, not an example.
1862+
1453
1863+
1454
1864+
1455
1865+
1456
1866+
1457
1867+
1458
1868+
1459
1869+
1460
1870+
1461
1871+
1462
1872+
1463
1873+
1464
1874+
1465
1875+
1466
1876+
1467
1877+
1468
1878+
1469
1879+
1470
1880+
1471
1881+
1472
1882+
1473
1883+
1474
1884+
1475
1885+
1476
1886+
1477
1887+
1478
1888+
1479
1889+
1480
1890+
1481
1891+
1482
1892+
1483
1893+
1484
1894+
1485
1895+
1486
1896+
1487</pre><pre class="code-lines"><span class="s">&quot;&quot;&quot;Game-ready post-and-rail fence kit — a showcase piece, not an example.
18631897

18641898
Asserts budget conformance of a tiling timber fence section after
18651899
composing shipped pipeline pieces: bmesh construction, UVs, two
@@ -3123,19 +3157,53 @@ <h2>Source</h2>
31233157
ob.hide_render = <span class="k">True</span>
31243158
ob.hide_viewport = <span class="k">True</span>
31253159

3126-
<span class="c"># The hero is the kit doing its job: three sections at the tile pitch,</span>
3127-
<span class="c"># linked duplicates of the one checked mesh, so every joint in the</span>
3128-
<span class="c"># picture is the tile fit the check asserts (posts meet band to band,</span>
3129-
<span class="c"># KIT_CLEAR apart). A run parent carries the yaw; level on the floor,</span>
3130-
<span class="c"># since an X tilt sinks one face of the shoes.</span>
3160+
<span class="c"># The hero is a run that reads as one fence, not three panels parked end</span>
3161+
<span class="c"># to end: the leading section is the checked mesh itself, and each</span>
3162+
<span class="c"># follow-on section is a render-only copy of it with its first post</span>
3163+
<span class="c"># group (post, cap, shoe and bands, found as mesh shells) removed,</span>
3164+
<span class="c"># stepped at the post pitch 2*HX so its rails and brace tenon into the</span>
3165+
<span class="c"># previous section&#x27;s trailing post - one post per joint. Placed at the</span>
3166+
<span class="c"># 1.60 m tile pitch instead, whole sections meet band to band (the tile</span>
3167+
<span class="c"># fit the check asserts) but every joint shows a doubled post. A run</span>
3168+
<span class="c"># parent carries the yaw; level on the floor, since an X tilt sinks one</span>
3169+
<span class="c"># face of the shoes.</span>
31313170
run = bpy.data.objects.new(<span class="s">&quot;FenceRun&quot;</span>, <span class="k">None</span>)
31323171
scene.collection.objects.link(run)
31333172
run.rotation_euler.z = math.radians(-<span class="n">24.0</span>)
3173+
follow_me = low.data.copy()
3174+
follow_me.name = <span class="s">f&quot;</span>{low.name}<span class="s">.Follow</span><span class="s">&quot;</span>
3175+
bm = bmesh.new()
3176+
<span class="k">try</span>:
3177+
bm.from_mesh(follow_me)
3178+
post_edge = POST_XS[<span class="n">0</span>] + POST_W / <span class="n">2.0</span> + IRON_T + <span class="n">0.002</span>
3179+
seen = set()
3180+
doomed = []
3181+
<span class="k">for</span> v <span class="k">in</span> bm.verts:
3182+
<span class="k">if</span> v <span class="k">in</span> seen:
3183+
<span class="k">continue</span>
3184+
group, stack = [], [v]
3185+
seen.add(v)
3186+
<span class="k">while</span> stack:
3187+
cur = stack.pop()
3188+
group.append(cur)
3189+
<span class="k">for</span> e <span class="k">in</span> cur.link_edges:
3190+
o = e.other_vert(cur)
3191+
<span class="k">if</span> o <span class="k">not</span> <span class="k">in</span> seen:
3192+
seen.add(o)
3193+
stack.append(o)
3194+
<span class="k">if</span> max(g.co.x <span class="k">for</span> g <span class="k">in</span> group) &lt; post_edge:
3195+
doomed.extend(group)
3196+
bmesh.ops.delete(bm, geom=doomed, context=<span class="s">&quot;VERTS&quot;</span>)
3197+
bm.to_mesh(follow_me)
3198+
<span class="k">finally</span>:
3199+
bm.free()
3200+
pitch = <span class="n">2.0</span> * POST_XS[<span class="n">1</span>]
31343201
sections = [low]
3135-
<span class="k">for</span> i <span class="k">in</span> (-<span class="n">1</span>, <span class="n">1</span>):
3136-
dup = bpy.data.objects.new(<span class="s">f&quot;</span>{low.name}<span class="s">.Run</span>{i:<span class="s">+d</span>}<span class="s">&quot;</span>, low.data)
3202+
low.location.x = -pitch
3203+
<span class="k">for</span> i <span class="k">in</span> (<span class="n">0</span>, <span class="n">1</span>):
3204+
dup = bpy.data.objects.new(<span class="s">f&quot;</span>{low.name}<span class="s">.Run</span>{i}<span class="s">&quot;</span>, follow_me)
31373205
scene.collection.objects.link(dup)
3138-
dup.location.x = i * TILE
3206+
dup.location.x = i * pitch
31393207
sections.append(dup)
31403208
<span class="k">for</span> ob <span class="k">in</span> sections:
31413209
ob.parent = run
@@ -3351,7 +3419,7 @@ <h3><a href="../wooden-barrel/">wooden-barrel</a></h3>
33513419
</main>
33523420
<dialog class="lightbox" id="lightbox" aria-label="Full-size render">
33533421
<button class="lightbox-close" type="button" autofocus>Close</button>
3354-
<img src="../assets/fence-kit-hero.webp" alt="A run of three weathered post-and-rail fence sections on a packed-earth strip, joined post to post at the tile pitch, each with a diagonal board brace and dark iron bands." />
3422+
<img src="../assets/fence-kit-hero.webp" alt="A weathered post-and-rail fence run of three sections on a packed-earth strip, one capped post at each joint, each bay with a diagonal board brace and dark iron bands." />
33553423
</dialog>
33563424
<footer>
33573425
<div class="statusbar">

0 commit comments

Comments
 (0)