Skip to content

Commit 39ef779

Browse files
TMHSDigitalclaude
andauthored
fix: wooden-ladder, wheelbarrow, curve-bevel-arc and sky-texture-sun-elevation quality pass (#235)
* fix: wooden-ladder quality pass, even rung pitch and a wall to lean on Rung heights were jittered up to 18 mm; they now sit at one pitch (rung pitch, exit 19, --drift-rungs). Per-piece wood, rusted iron, bevel inputs sorted so face order is stable run to run, temp glb removed. The hero leans the ladder against a render-only wall section. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> * fix: wheelbarrow quality pass, tray walls built from boards Side and front walls are two boards with a 2 mm seam (wall boards, exit 17, --wide-seams); the audits take a wall as the union of its boards. The boards are paid for by skipping bevels on buried and underside tray edges, so the triangle ceiling holds. Per-board wood, rusted iron, sorted bevel inputs, 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: curve-bevel-arc presentation, both caps facing the camera Render path only: the camera looks along the direction both capped ends face, so the witness (use_fill_caps) shows twice. 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: sky-texture-sun-elevation presentation, the sky lights the jar Render path only: a pale glaze and dimmed studio lights let the sky, the variable under test, light the jar, so the two elevations differ. The committed hero had drifted from the code. Zenith probe values 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 functional spacing, board walls and operator input order From the wooden-ladder and wheelbarrow 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 a491f23 commit 39ef779

29 files changed

Lines changed: 1225 additions & 194 deletions

‎README.md‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](show
121121
<a href="showcase/watchtower/"><img src="showcase/watchtower/preview.webp" width="24%" alt="Watchtower: a timber lookout with X-braces, hatch ladder, plank platform, and a coursed shake roof on a dark studio floor" /></a>
122122
<a href="showcase/cart/"><img src="showcase/cart/preview.webp" width="24%" alt="Cart: a two-wheel wooden cart with spoked wheels, slatted bed, and shafts on a dark studio floor" /></a>
123123
<a href="showcase/park-bench/"><img src="showcase/park-bench/preview.webp" width="24%" alt="Park bench: a wrought-iron bench with scrolled legs and wooden slats on a dark studio floor" /></a>
124-
<a href="showcase/wheelbarrow/"><img src="showcase/wheelbarrow/preview.webp" width="24%" alt="Wheelbarrow: a staved wooden tray with iron straps, a spoked wheel, rear legs, and handles on a dark studio floor" /></a>
124+
<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>
127127
<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>
@@ -133,7 +133,7 @@ Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](show
133133
<a href="showcase/wall-torch/"><img src="showcase/wall-torch/preview.webp" width="24%" alt="Wall torch: a dressed stone plaque with an iron sconce, wooden haft, and flame on a dark studio floor" /></a>
134134
<a href="showcase/tavern-stool/"><img src="showcase/tavern-stool/preview.webp" width="24%" alt="Tavern stool: a round wooden seat on turned splayed legs with stretchers and iron ferrules on a dark studio floor" /></a>
135135
<a href="showcase/iron-cauldron/"><img src="showcase/iron-cauldron/preview.webp" width="24%" alt="Iron cauldron: a round-bellied cast-iron pot hanging by its bail from a timber tripod on a dark studio floor" /></a>
136-
<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>
136+
<a href="showcase/wooden-ladder/"><img src="showcase/wooden-ladder/preview.webp" width="24%" alt="Wooden ladder: a raked timber ladder with six evenly spaced rungs and iron shoes, leaning against a dark wall section" /></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>
139139
<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>
@@ -163,7 +163,7 @@ Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](show
163163

164164
[`park-bench`](showcase/park-bench/) — procedural wrought-iron park bench with scrolled legs and slatted seat through the same pipeline. Falsifier `--skip-decimate` exits 9.
165165

166-
[`wheelbarrow`](showcase/wheelbarrow/) — procedural staved wheelbarrow with a spoked wheel, iron straps, legs, and handles through the same pipeline. Falsifier `--skip-decimate` exits 9.
166+
[`wheelbarrow`](showcase/wheelbarrow/) — procedural wheelbarrow with board-built tray walls, a spoked wheel, iron straps, legs, and handles through the same pipeline. Falsifiers `--skip-decimate` exits 9, `--wide-seams` exits 17.
167167

168168
[`anvil`](showcase/anvil/) — procedural London-pattern anvil on a timber stump through the same pipeline. Falsifier `--skip-decimate` exits 9.
169169

@@ -187,7 +187,7 @@ Budget-conformance props. Not examples. Conventions: [`showcase/README.md`](show
187187

188188
[`iron-cauldron`](showcase/iron-cauldron/) — procedural round-bellied iron cauldron on a timber tripod through the same pipeline. Falsifiers `--skip-decimate` exits 9, `--pointed-pot` exits 19.
189189

190-
[`wooden-ladder`](showcase/wooden-ladder/) — procedural timber ladder with raked stiles, rungs, and iron shoes through the same pipeline. Falsifier `--skip-decimate` exits 9.
190+
[`wooden-ladder`](showcase/wooden-ladder/) — procedural timber ladder with raked stiles, evenly pitched rungs, and iron shoes through the same pipeline. Falsifiers `--skip-decimate` exits 9, `--drift-rungs` exits 19.
191191

192192
[`hay-bale`](showcase/hay-bale/) — procedural bound hay bale with sisal twine through the same pipeline. Falsifier `--skip-decimate` exits 9.
193193

@@ -307,7 +307,7 @@ byte images stay straight 8-bit. Also witnesses `EXR color_mode='RGB'` dropping
307307
</tr>
308308
<tr>
309309
<td width="46%" valign="middle">
310-
<a href="examples/sky-texture-sun-elevation/"><img src="examples/sky-texture-sun-elevation/preview.webp" alt="Sky texture sun elevation: terracotta jar diptych on a dark floor — left panel low sun at 8 degrees with a deep blue zenith and warm horizon limb, right panel high sun at 55 degrees with a brighter cyan sky, proving ShaderNodeTexSky sun_elevation" /></a>
310+
<a href="examples/sky-texture-sun-elevation/"><img src="examples/sky-texture-sun-elevation/preview.webp" alt="Sky texture sun elevation: pale glazed jar diptych on a dark floor — left panel low sun at 8 degrees, the jar dim twilight blue under a deep blue zenith, right panel high sun at 55 degrees, the jar bright under a pale daylight sky" /></a>
311311
</td>
312312
<td valign="middle">
313313

@@ -389,7 +389,7 @@ A relative Tall shape key that lifts and flares the top face — authored throug
389389
</tr>
390390
<tr>
391391
<td width="46%" valign="middle">
392-
<a href="examples/curve-bevel-arc/"><img src="examples/curve-bevel-arc/preview.webp" alt="Curve bevel arc: a rose beveled Bezier semicircle tube resting on a dark studio floor" /></a>
392+
<a href="examples/curve-bevel-arc/"><img src="examples/curve-bevel-arc/preview.webp" alt="Curve bevel arc: a rose beveled Bezier semicircle tube resting on a dark studio floor, both filled end caps facing the camera" /></a>
393393
</td>
394394
<td valign="middle">
395395

2.49 KB
Loading
-3.67 KB
Loading
608 Bytes
Loading
8.47 KB
Loading
13.7 KB
Loading
28.7 KB
Loading
744 Bytes
Loading
1.25 KB
Loading

‎docs/gallery/curve-bevel-arc/index.html‎

Lines changed: 11 additions & 8 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/curve-bevel-arc-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 magenta beveled curve tube sweeping in an arc across a dark floor, with a capped end." />
19+
<meta property="og:image:alt" content="A magenta beveled curve tube lying in a semicircle on a dark floor, both filled end caps facing the camera." />
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="curve-bevel-arc — Examples — Blender Developer Tools" />
2323
<meta name="twitter:description" content="A beveled Bezier semicircle authored on bpy.types.Curve — splines.new(&#x27;BEZIER&#x27;), bezier_points, bevel_depth, use_fill_caps — so the curve renders as a solid tube without a prior mesh conversion." />
2424
<meta name="twitter:image" content="https://tmhsdigital.github.io/Blender-Developer-Tools/gallery/assets/curve-bevel-arc-hero.webp" />
25-
<meta name="twitter:image:alt" content="A magenta beveled curve tube sweeping in an arc across a dark floor, with a capped end." />
25+
<meta name="twitter:image:alt" content="A magenta beveled curve tube lying in a semicircle on a dark floor, both filled end caps facing the camera." />
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>curve-bevel-arc</h1>
268268
<p>A beveled Bezier semicircle authored on bpy.types.Curve — splines.new(&#x27;BEZIER&#x27;), bezier_points, bevel_depth, use_fill_caps — so the curve renders as a solid tube without a prior mesh conversion.</p>
269269
</header>
270270
<main id="main">
271-
<button class="detail-hero" id="heroZoom" type="button" aria-label="View full size: A magenta beveled curve tube sweeping in an arc across a dark floor, with a capped end.">
272-
<img src="../assets/curve-bevel-arc-hero.webp" alt="A magenta beveled curve tube sweeping in an arc across a dark floor, with a capped end." width="1280" height="720" />
271+
<button class="detail-hero" id="heroZoom" type="button" aria-label="View full size: A magenta beveled curve tube lying in a semicircle on a dark floor, both filled end caps facing the camera.">
272+
<img src="../assets/curve-bevel-arc-hero.webp" alt="A magenta beveled curve tube lying in a semicircle on a dark floor, both filled end caps facing the camera." 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> Curve tubes are curve datablocks: eight Bezier points, bevel_depth == 0.15, filled caps, and the evaluated mesh has deterministic topology (1044 verts, 1028 faces) resting on the floor.</div>
@@ -280,6 +280,7 @@ <h1>curve-bevel-arc</h1>
280280
<section class="detail-section md">
281281
<p>A runnable example that builds a beveled Bezier semicircle entirely through the curve data API — <code>splines.new(&#x27;BEZIER&#x27;)</code>, per-point <code>bezier_points</code>, <code>bevel_depth</code>, and <code>use_fill_caps</code> — so the curve renders as a solid tube without a prior mesh conversion.</p>
282282
<p><strong>What it witnesses:</strong> renderable curve tubes are curve datablocks, not meshes. The check asserts eight Bezier points, <code>bevel_depth == 0.15</code>, <code>use_fill_caps</code>, and that the depsgraph-evaluated mesh has the deterministic topology (1044 verts, 1028 faces for these resolution settings) with a Z span that rests on the floor (<code>[0, 2 × bevel]</code>) and an X span of <code>2 × radius + 2 × bevel</code>.</p>
283+
<p>Staging: both ends of the semicircle face −Y, so the still looks from −Y and shows both filled caps (<code>use_fill_caps</code>, the witness) face-on, with the arc sweeping behind them. The old angle showed one cap and the other end edge-on. The cap&#x27;s 12-sided outline is the pinned tessellation (<code>bevel_resolution</code> 4, locked by the 1044-vertex gate), not a presentation choice.</p>
283284
<h2>Run</h2>
284285
<pre><code># Cheap correctness check (no render) — the CI check:
285286
blender --background --python curve_bevel_arc.py --
@@ -434,7 +435,9 @@ <h2>Source</h2>
434435
bsdf.inputs[<span class="s">&quot;Base Color&quot;</span>].default_value = (<span class="n">0.95</span>, <span class="n">0.10</span>, <span class="n">0.38</span>, <span class="n">1.0</span>) <span class="c"># rose</span>
435436
bsdf.inputs[<span class="s">&quot;Roughness&quot;</span>].default_value = <span class="n">0.24</span>
436437
obj.data.materials.append(mat)
437-
obj.rotation_euler = (<span class="n">0.0</span>, <span class="n">0.0</span>, math.radians(-<span class="n">18</span>))
438+
<span class="c"># both capped ends face -Y with the arc unrotated, so the camera on -Y</span>
439+
<span class="c"># sees the two caps (the witness) face-on and the arc sweeping behind</span>
440+
obj.rotation_euler = (<span class="n">0.0</span>, <span class="n">0.0</span>, math.radians(-<span class="n">8</span>))
438441

439442
floor_me = bpy.data.meshes.new(<span class="s">&quot;Floor&quot;</span>)
440443
bm = bmesh.new()
@@ -462,7 +465,7 @@ <h2>Source</h2>
462465
scene.world = world
463466

464467
aim = bpy.data.objects.new(<span class="s">&quot;Aim&quot;</span>, <span class="k">None</span>)
465-
aim.location = (<span class="n">0.0</span>, <span class="n">0.35</span>, BEVEL)
468+
aim.location = (<span class="n">0.0</span>, <span class="n">0.55</span>, BEVEL)
466469
scene.collection.objects.link(aim)
467470

468471
<span class="k">def</span> light(name, loc, energy, size, col):
@@ -494,7 +497,7 @@ <h2>Source</h2>
494497
cam_data = bpy.data.cameras.new(<span class="s">&quot;Cam&quot;</span>)
495498
cam_data.lens = <span class="n">50.0</span>
496499
cam = bpy.data.objects.new(<span class="s">&quot;Cam&quot;</span>, cam_data)
497-
cam.location = (<span class="n">2.55</span>, -<span class="n">3.62</span>, <span class="n">1.78</span>)
500+
cam.location = (<span class="n">1.1</span>, -<span class="n">4.3</span>, <span class="n">2.55</span>)
498501
scene.collection.objects.link(cam)
499502
scene.camera = cam
500503
track = cam.constraints.new(<span class="s">&#x27;TRACK_TO&#x27;</span>)
@@ -569,7 +572,7 @@ <h2>Source</h2>
569572
</main>
570573
<dialog class="lightbox" id="lightbox" aria-label="Full-size render">
571574
<button class="lightbox-close" type="button" autofocus>Close</button>
572-
<img src="../assets/curve-bevel-arc-hero.webp" alt="A magenta beveled curve tube sweeping in an arc across a dark floor, with a capped end." />
575+
<img src="../assets/curve-bevel-arc-hero.webp" alt="A magenta beveled curve tube lying in a semicircle on a dark floor, both filled end caps facing the camera." />
573576
</dialog>
574577
<footer>
575578
<div class="statusbar">

0 commit comments

Comments
 (0)