Skip to content

Commit 44ca4bb

Browse files
TMHSDigitalclaude
andauthored
fix: shipping-crate, shape-key-blend and vse-linear-modifiers quality pass (#231)
* fix(showcase): shipping-crate quality pass — one-shell nailed straps, handles on a board Each strap was two unbevelled boxes flush on the post; it is now one chamfered L-section biting into the post, nailed (seat budget, exit 18, --float-nails). Handle mounting plates straddled an end-board gap; the handle now snaps to the nearest board's centre and a budget asserts each plate sits inside one board (exit 20, --straddle-handle). Per-plank tone and grain. The temp glTF export is removed after measuring. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> * fix(examples): shape-key-blend still cages the checked block with its key endpoints Render path only. The check, its assertions and exit codes are unchanged. docs/gallery/index.html also carries the shipping-crate card alt. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> * docs(examples): vse-linear-modifiers names Strip, not the nonexistent Sequence type Docstring and README only; assertions and exit codes unchanged. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> * docs(showcase): convention for fixtures mounted on one board 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 c0b6678 commit 44ca4bb

17 files changed

Lines changed: 906 additions & 125 deletions

File tree

9.72 KB
Loading
2.99 KB
Loading
52.9 KB
Loading
988 Bytes
Loading

‎docs/gallery/index.html‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -464,7 +464,7 @@ <h2><a href="gn-modifier-inputs/">gn-modifier-inputs</a></h2>
464464
</article>
465465
<article class="card" data-tags="mesh shape-keys">
466466
<a class="card-media" href="shape-key-blend/" tabindex="-1" aria-hidden="true">
467-
<img src="assets/shape-key-blend-hero.webp" alt="Three purple boxes flaring wider at the top by increasing amounts, from a plain cube to a strong flare." loading="lazy" decoding="async" />
467+
<img src="assets/shape-key-blend-hero.webp" alt="Three purple boxes flaring wider at the top by increasing amounts; the rightmost sits inside a pale wire cage of its full shape key, halfway to it." loading="lazy" decoding="async" />
468468
</a>
469469
<div class="card-body">
470470
<h2><a href="shape-key-blend/">shape-key-blend</a></h2>
@@ -904,7 +904,7 @@ <h2><a href="gn-socket-rename/">gn-socket-rename</a></h2>
904904
</article>
905905
<article class="card" data-tags="mesh export showcase">
906906
<a class="card-media" href="shipping-crate/" tabindex="-1" aria-hidden="true">
907-
<img src="assets/shipping-crate-hero.webp" alt="A wooden shipping crate with dark corner posts, horizontal planks and a metal handle." loading="lazy" decoding="async" />
907+
<img src="assets/shipping-crate-hero.webp" alt="A grained wooden shipping crate with nailed iron corner straps, horizontal planks and a metal bail handle mounted on one end board." loading="lazy" decoding="async" />
908908
</a>
909909
<div class="card-body">
910910
<h2><a href="shipping-crate/">shipping-crate</a></h2>

‎docs/gallery/shape-key-blend/index.html‎

Lines changed: 34 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/shape-key-blend-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="Three purple boxes flaring wider at the top by increasing amounts, from a plain cube to a strong flare." />
19+
<meta property="og:image:alt" content="Three purple boxes flaring wider at the top by increasing amounts; the rightmost sits inside a pale wire cage of its full shape key, halfway to it." />
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="shape-key-blend — Examples — Blender Developer Tools" />
2323
<meta name="twitter:description" content="A relative Tall shape key that lifts and flares the top face — authored via shape_key_add / key_blocks / .value — read back from the depsgraph-evaluated mesh." />
2424
<meta name="twitter:image" content="https://tmhsdigital.github.io/Blender-Developer-Tools/gallery/assets/shape-key-blend-hero.webp" />
25-
<meta name="twitter:image:alt" content="Three purple boxes flaring wider at the top by increasing amounts, from a plain cube to a strong flare." />
25+
<meta name="twitter:image:alt" content="Three purple boxes flaring wider at the top by increasing amounts; the rightmost sits inside a pale wire cage of its full shape key, halfway to it." />
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>shape-key-blend</h1>
268268
<p>A relative Tall shape key that lifts and flares the top face — authored via shape_key_add / key_blocks / .value — read back from the depsgraph-evaluated mesh.</p>
269269
</header>
270270
<main id="main">
271-
<button class="detail-hero" id="heroZoom" type="button" aria-label="View full size: Three purple boxes flaring wider at the top by increasing amounts, from a plain cube to a strong flare.">
272-
<img src="../assets/shape-key-blend-hero.webp" alt="Three purple boxes flaring wider at the top by increasing amounts, from a plain cube to a strong flare." width="1280" height="720" />
271+
<button class="detail-hero" id="heroZoom" type="button" aria-label="View full size: Three purple boxes flaring wider at the top by increasing amounts; the rightmost sits inside a pale wire cage of its full shape key, halfway to it.">
272+
<img src="../assets/shape-key-blend-hero.webp" alt="Three purple boxes flaring wider at the top by increasing amounts; the rightmost sits inside a pale wire cage of its full shape key, halfway to it." 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> Shape keys do not rewrite mesh.vertices: every evaluated vert matches basis + value × (key − basis), including the flared top half-extent.</div>
@@ -460,6 +460,30 @@ <h2>Source</h2>
460460
ob.rotation_euler = (<span class="n">0.0</span>, <span class="n">0.0</span>, math.radians(<span class="n">28</span>))
461461
blocks.append(ob)
462462

463+
<span class="c"># Endpoint cages on the checked block: its Basis and its full Tall key as</span>
464+
<span class="c"># pale wireframes, so the solid visibly sits halfway between the two —</span>
465+
<span class="c"># the closed-form blend the check asserts, not just &quot;a taller box&quot;.</span>
466+
<span class="c"># Render-only copies with their own key value; `obj` is untouched.</span>
467+
cage_mat = bpy.data.materials.new(<span class="s">&quot;Cage&quot;</span>)
468+
cage_mat.use_nodes = <span class="k">True</span>
469+
cbsdf = cage_mat.node_tree.nodes[<span class="s">&quot;Principled BSDF&quot;</span>]
470+
cbsdf.inputs[<span class="s">&quot;Base Color&quot;</span>].default_value = (<span class="n">0.92</span>, <span class="n">0.84</span>, <span class="n">1.0</span>, <span class="n">1.0</span>)
471+
cbsdf.inputs[<span class="s">&quot;Roughness&quot;</span>].default_value = <span class="n">0.4</span>
472+
cages = []
473+
<span class="k">for</span> end <span class="k">in</span> (<span class="n">0.0</span>, <span class="n">1.0</span>):
474+
me = obj.data.copy()
475+
me.materials.clear()
476+
me.materials.append(cage_mat)
477+
me.shape_keys.key_blocks[<span class="s">&quot;Tall&quot;</span>].value = end
478+
cage = bpy.data.objects.new(<span class="s">f&quot;</span><span class="s">Cage_</span>{end}<span class="s">&quot;</span>, me)
479+
cage.location = obj.location
480+
cage.rotation_euler = obj.rotation_euler
481+
wire = cage.modifiers.new(<span class="s">&quot;cage&quot;</span>, <span class="s">&quot;WIREFRAME&quot;</span>)
482+
wire.thickness = <span class="n">0.02</span>
483+
wire.use_even_offset = <span class="k">True</span>
484+
bpy.context.collection.objects.link(cage)
485+
cages.append(cage)
486+
463487
floor_me = bpy.data.meshes.new(<span class="s">&quot;Floor&quot;</span>)
464488
bm = bmesh.new()
465489
<span class="k">try</span>:
@@ -487,7 +511,9 @@ <h2>Source</h2>
487511

488512
world_top = HALF + EXPECT_TOP_Z
489513
aim = bpy.data.objects.new(<span class="s">&quot;Aim&quot;</span>, <span class="k">None</span>)
490-
aim.location = (<span class="n">0.0</span>, <span class="n">0.0</span>, world_top / <span class="n">2</span>)
514+
<span class="c"># Aimed above the checked block&#x27;s middle: the full-key cage over it is</span>
515+
<span class="c"># taller than any solid, and centring on the solids clipped it.</span>
516+
aim.location = (<span class="n">0.35</span>, <span class="n">0.0</span>, world_top * <span class="n">0.62</span>)
491517
scene.collection.objects.link(aim)
492518

493519
<span class="k">def</span> light(name, loc, energy, size, col):
@@ -520,7 +546,8 @@ <h2>Source</h2>
520546
cam_data = bpy.data.cameras.new(<span class="s">&quot;Cam&quot;</span>)
521547
cam_data.lens = <span class="n">50.0</span>
522548
cam = bpy.data.objects.new(<span class="s">&quot;Cam&quot;</span>, cam_data)
523-
cam.location = (<span class="n">0.0</span>, -<span class="n">8.8</span>, <span class="n">2.05</span>)
549+
<span class="c"># Pulled back so the full-key cage on the right block stays in frame.</span>
550+
cam.location = (<span class="n">0.35</span>, -<span class="n">10.4</span>, <span class="n">2.5</span>)
524551
scene.collection.objects.link(cam)
525552
scene.camera = cam
526553
track = cam.constraints.new(<span class="s">&#x27;TRACK_TO&#x27;</span>)
@@ -581,7 +608,7 @@ <h2>Source</h2>
581608
</main>
582609
<dialog class="lightbox" id="lightbox" aria-label="Full-size render">
583610
<button class="lightbox-close" type="button" autofocus>Close</button>
584-
<img src="../assets/shape-key-blend-hero.webp" alt="Three purple boxes flaring wider at the top by increasing amounts, from a plain cube to a strong flare." />
611+
<img src="../assets/shape-key-blend-hero.webp" alt="Three purple boxes flaring wider at the top by increasing amounts; the rightmost sits inside a pale wire cage of its full shape key, halfway to it." />
585612
</dialog>
586613
<footer>
587614
<div class="statusbar">

0 commit comments

Comments
 (0)