Skip to content

Commit 819420e

Browse files
TMHSDigitalclaude
andauthored
fix: hitching-post, hand-pump, shader-node-group and driver-wave quality pass (#236)
* fix: hitching-post quality pass, iron bands wrap the post The bands were sized inside the post and only the chamfered corners showed, as black slits; they now wrap it 6.5 mm proud (band seat, exit 18, --sunk-bands). Per-piece wood, rusted iron, 60 m stage, sorted bevel input, temp glb removed. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> * fix: hand-pump quality pass, cast iron instead of chrome No geometric defect found. The iron read as chrome (metallic 1.0, roughness 0.38); it is now painted cast iron with dark rust. Per-piece wood, 60 m stage, sorted bevel input, temp glb removed. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> * fix: shader-node-group presentation, standard view on the house stage Render path only: Standard view transform, dark stage, softer key, camera aimed at the spheres. Contract and exit codes unchanged on 4.5.11, 5.1.2 and 5.2.1. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> * fix: driver-wave presentation, a raised camera so the wave reads Render path only: the camera looks down 18 degrees so the column tops and shadows read as a wave. Contract and exit codes unchanged on 4.5.11, 5.1.2 and 5.2.1. Also regenerates the gallery index for all four items. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> * docs: showcase conventions for wrapped bands, iron finish and stage size From the hitching-post and hand-pump passes. Co-Authored-By: Claude Opus 5.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.5 (1M context) <noreply@anthropic.com>
1 parent e18a165 commit 819420e

29 files changed

Lines changed: 818 additions & 123 deletions

‎README.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,9 +124,9 @@ Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](show
124124
<a href="showcase/wheelbarrow/"><img src="showcase/wheelbarrow/preview.webp" width="24%" alt="Wheelbarrow: a wooden tray with walls of stacked boards and iron straps, a spoked wheel, rear legs, and handles on a dark studio floor" /></a>
125125
<a href="showcase/anvil/"><img src="showcase/anvil/preview.webp" width="24%" alt="Anvil: a London-pattern anvil on a hooped timber stump on a dark studio floor" /></a>
126126
<a href="showcase/water-trough/"><img src="showcase/water-trough/preview.webp" width="24%" alt="Water trough: a watertight wooden trough with plank ends, contained water, and trestle legs on a dark studio floor" /></a>
127-
<a href="showcase/hitching-post/"><img src="showcase/hitching-post/preview.webp" width="24%" alt="Hitching post: a square timber post with a pyramidal cap, cross-arm, iron bands, and two hitching rings on a dark studio floor" /></a>
127+
<a href="showcase/hitching-post/"><img src="showcase/hitching-post/preview.webp" width="24%" alt="Hitching post: a square timber post with a pyramidal cap, cross-arm, iron bands wrapped around it, and two hitching rings on a dark studio floor" /></a>
128128
<a href="showcase/grindstone/"><img src="showcase/grindstone/preview.webp" width="24%" alt="Grindstone: a stone wheel on a timber A-frame with an iron axle, hubs, crank, and tray on a dark studio floor" /></a>
129-
<a href="showcase/hand-pump/"><img src="showcase/hand-pump/preview.webp" width="24%" alt="Hand pump: a cast-iron village pump on a wooden plinth with a spout and handle on a dark studio floor" /></a>
129+
<a href="showcase/hand-pump/"><img src="showcase/hand-pump/preview.webp" width="24%" alt="Hand pump: a matte black cast-iron village pump on a stepped wooden plinth with a spout and handle on a dark studio floor" /></a>
130130
<a href="showcase/signpost/"><img src="showcase/signpost/preview.webp" width="24%" alt="Signpost: a timber post with two painted fingerboards, iron straps, and a pyramidal cap on a dark studio floor" /></a>
131131
<a href="showcase/chopping-block/"><img src="showcase/chopping-block/preview.webp" width="24%" alt="Chopping block: a bark-sided log round with growth rings and drying checks on its sawn top, a riveted iron hoop, and a felling axe buried in the top, on a dark studio floor" /></a>
132132
<a href="showcase/wooden-bucket/"><img src="showcase/wooden-bucket/preview.webp" width="24%" alt="Wooden bucket: a coopered pail with a three-strand rope bail through iron ear rings and chord-lofted iron hoops on a dark studio floor" /></a>
@@ -169,7 +169,7 @@ Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](show
169169

170170
[`water-trough`](showcase/water-trough/) — procedural watertight water trough on a timber stand through the same pipeline. Falsifier `--skip-decimate` exits 9.
171171

172-
[`hitching-post`](showcase/hitching-post/) — procedural timber hitching post with a cross-arm and iron rings through the same pipeline. Falsifier `--skip-decimate` exits 9.
172+
[`hitching-post`](showcase/hitching-post/) — procedural timber hitching post with a cross-arm, wrapped iron bands and iron rings through the same pipeline. Falsifiers `--skip-decimate` exits 9, `--sunk-bands` exits 18.
173173

174174
[`grindstone`](showcase/grindstone/) — procedural grindstone on a timber trestle with iron axle and crank through the same pipeline. Falsifier `--skip-decimate` exits 9.
175175

@@ -645,7 +645,7 @@ A slotted-actions Z-rotation turntable keyed through the cross-version channelba
645645
</tr>
646646
<tr>
647647
<td width="46%" valign="middle">
648-
<a href="examples/driver-wave/"><img src="examples/driver-wave/preview.webp" alt="Driver wave: sixteen orange columns whose heights form a sine skyline on a dark studio floor, each driven by a driver_namespace function" /></a>
648+
<a href="examples/driver-wave/"><img src="examples/driver-wave/preview.webp" alt="Driver wave: sixteen orange columns seen from above whose heights form a sine wave on a dark studio floor, each driven by a driver_namespace function" /></a>
649649
</td>
650650
<td valign="middle">
651651

8.34 KB
Loading
-528 Bytes
Loading
1.32 KB
Loading
2.83 KB
Loading
15.7 KB
Loading
-406 Bytes
Loading
482 Bytes
Loading
13.6 KB
Loading

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

Lines changed: 11 additions & 7 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/driver-wave-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 row of orange bars whose heights rise and fall in a wave, low in the middle and tall at both ends." />
19+
<meta property="og:image:alt" content="A row of orange bars seen from above, their heights rising and falling in a wave, low in the middle and tall at both ends, each casting a shadow on the floor." />
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="driver-wave — Examples — Blender Developer Tools" />
2323
<meta name="twitter:description" content="A driver_namespace function driving sixteen column heights through SCRIPTED drivers — the sine skyline is entirely driver-evaluated." />
2424
<meta name="twitter:image" content="https://tmhsdigital.github.io/Blender-Developer-Tools/gallery/assets/driver-wave-hero.webp" />
25-
<meta name="twitter:image:alt" content="A row of orange bars whose heights rise and fall in a wave, low in the middle and tall at both ends." />
25+
<meta name="twitter:image:alt" content="A row of orange bars seen from above, their heights rising and falling in a wave, low in the middle and tall at both ends, each casting a shadow on the floor." />
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;
@@ -268,8 +268,8 @@ <h1>driver-wave</h1>
268268
<p>A driver_namespace function driving sixteen column heights through SCRIPTED drivers — the sine skyline is entirely driver-evaluated.</p>
269269
</header>
270270
<main id="main">
271-
<button class="detail-hero" id="heroZoom" type="button" aria-label="View full size: A row of orange bars whose heights rise and fall in a wave, low in the middle and tall at both ends.">
272-
<img src="../assets/driver-wave-hero.webp" alt="A row of orange bars whose heights rise and fall in a wave, low in the middle and tall at both ends." width="1280" height="720" />
271+
<button class="detail-hero" id="heroZoom" type="button" aria-label="View full size: A row of orange bars seen from above, their heights rising and falling in a wave, low in the middle and tall at both ends, each casting a shadow on the floor.">
272+
<img src="../assets/driver-wave-hero.webp" alt="A row of orange bars seen from above, their heights rising and falling in a wave, low in the middle and tall at both ends, each casting a shadow on the floor." width="1280" height="720" />
273273
</button>
274274
<p class="zoom-hint">Rendered headless by the example itself — click to zoom.</p>
275275
<div class="callout"><span class="tag">witnesses</span> Driven values appear after a view-layer update in two places that must agree: the evaluated copy and the original datablock the animation system flushes for display.</div>
@@ -281,6 +281,8 @@ <h1>driver-wave</h1>
281281
<p>A runnable example that drives sixteen column heights from a custom function registered in <code>bpy.app.driver_namespace</code> — the pattern from <a href="https://github.com/TMHSDigital/Blender-Developer-Tools/tree/main/skills/drivers-and-app-handlers/SKILL.md"><code>drivers-and-app-handlers</code></a>. Each column gets a SCRIPTED driver on Z scale whose expression calls <code>wave_scale(i)</code>, producing a sine skyline.</p>
282282
<p><strong>What it witnesses:</strong> the driver evaluation contract. Driven values appear only after a view-layer update, and they land in <strong>two</strong> places that must agree: the depsgraph-evaluated copy (<code>evaluated_get(dg).scale</code>) and the original datablock, which the animation system flushes for display. The check asserts both against the closed-form profile.</p>
283283
<p>Note for real add-ons: <code>driver_namespace</code> entries do <strong>not</strong> persist in <code>.blend</code> files — re-register them from a <code>load_post</code> handler, or every driver that calls them fails on file open. Headless, registering before driver creation (as here) is enough.</p>
284+
<h2>Staging</h2>
285+
<p>The camera is raised to look down about 18 degrees, so the column tops and their shadows read as a wave. From nearly level (86 degrees) the skyline flattened into a bar chart. Render path only.</p>
284286
<h2>Run</h2>
285287
<pre><code># Cheap correctness check (no render) — the CI check:
286288
blender --background --python driver_wave.py --
@@ -457,8 +459,10 @@ <h2>Source</h2>
457459
<span class="c"># the frame with a small margin -- the skyline must not clip</span>
458460
cam_data = bpy.data.cameras.new(<span class="s">&quot;Cam&quot;</span>); cam_data.lens = <span class="n">42.0</span>
459461
cam = bpy.data.objects.new(<span class="s">&quot;Cam&quot;</span>, cam_data)
460-
cam.location = (<span class="n">0.0</span>, -<span class="n">15.0</span>, <span class="n">2.0</span>)
461-
cam.rotation_euler = (math.radians(<span class="n">86</span>), <span class="n">0.0</span>, <span class="n">0.0</span>)
462+
<span class="c"># raised so the column tops and their shadows read as a wave; from</span>
463+
<span class="c"># nearly level (86 deg) it flattened into a bar chart</span>
464+
cam.location = (<span class="n">0.0</span>, -<span class="n">14.2</span>, <span class="n">5.6</span>)
465+
cam.rotation_euler = (math.radians(<span class="n">72</span>), <span class="n">0.0</span>, <span class="n">0.0</span>)
462466
scene.collection.objects.link(cam)
463467
scene.camera = cam
464468

@@ -528,7 +532,7 @@ <h2>Source</h2>
528532
</main>
529533
<dialog class="lightbox" id="lightbox" aria-label="Full-size render">
530534
<button class="lightbox-close" type="button" autofocus>Close</button>
531-
<img src="../assets/driver-wave-hero.webp" alt="A row of orange bars whose heights rise and fall in a wave, low in the middle and tall at both ends." />
535+
<img src="../assets/driver-wave-hero.webp" alt="A row of orange bars seen from above, their heights rising and falling in a wave, low in the middle and tall at both ends, each casting a shadow on the floor." />
532536
</dialog>
533537
<footer>
534538
<div class="statusbar">

0 commit comments

Comments
 (0)