Skip to content

Commit 9283488

Browse files
TMHSDigitalclaude
andauthored
fix: stone-archway, gn-zone-iterate and coincident-vert-weld quality pass (#228)
* fix(showcase): stone-archway quality pass — mortar in every joint, stone that reads as stone Every joint was air: courses floated 7 mm apart and voussoirs 9.7 mm, with daylight through each. Mortar beds and wedges are now sized from the two blocks they join, recessed behind the faces and biting into both, and a mortar-contact budget asserts each of the 18 overlaps exactly two stones (exit 18, --short-mortar). classify skips mortar. The streaky noise mix that read as wood grain is replaced by an isotropic stone shader with a seeded per-block tone. 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): gn-zone-iterate still is centred, frontal and no longer blown out Render path only. The check, its assertions and exit codes are unchanged. docs/gallery/index.html also carries the stone-archway card alt from the previous commit, since both regenerate in one build. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com> * docs(examples): coincident-vert-weld README states who hits it and what catches it, re-verified on 5.1 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 filled mortar joints and stone surfaces 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 56e3127 commit 9283488

16 files changed

Lines changed: 723 additions & 154 deletions

File tree

2.34 KB
Loading
308 Bytes
Loading
-28.7 KB
Loading
1.05 KB
Loading

‎docs/gallery/gn-zone-iterate/index.html‎

Lines changed: 38 additions & 9 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/gn-zone-iterate-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="Four ochre cubes in a row from a Repeat zone beside a vertical stack of six cyan cubes from a For Each zone." />
19+
<meta property="og:image:alt" content="Four brass cubes evenly spaced in a row from a Repeat zone beside a vertical stack of six cyan cubes from a For Each zone." />
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="gn-zone-iterate — Examples — Blender Developer Tools" />
2323
<meta name="twitter:description" content="Repeat Zone and For Each Element only iterate after pair_with_output. Evaluated cube counts follow 8 times (1+N) and 8 times P, not tree structure." />
2424
<meta name="twitter:image" content="https://tmhsdigital.github.io/Blender-Developer-Tools/gallery/assets/gn-zone-iterate-hero.webp" />
25-
<meta name="twitter:image:alt" content="Four ochre cubes in a row from a Repeat zone beside a vertical stack of six cyan cubes from a For Each zone." />
25+
<meta name="twitter:image:alt" content="Four brass cubes evenly spaced in a row from a Repeat zone beside a vertical stack of six cyan cubes from a For Each zone." />
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>gn-zone-iterate</h1>
268268
<p>Repeat Zone and For Each Element only iterate after pair_with_output. Evaluated cube counts follow 8 times (1+N) and 8 times P, not tree structure.</p>
269269
</header>
270270
<main id="main">
271-
<button class="detail-hero" id="heroZoom" type="button" aria-label="View full size: Four ochre cubes in a row from a Repeat zone beside a vertical stack of six cyan cubes from a For Each zone.">
272-
<img src="../assets/gn-zone-iterate-hero.webp" alt="Four ochre cubes in a row from a Repeat zone beside a vertical stack of six cyan cubes from a For Each zone." width="1280" height="720" />
271+
<button class="detail-hero" id="heroZoom" type="button" aria-label="View full size: Four brass cubes evenly spaced in a row from a Repeat zone beside a vertical stack of six cyan cubes from a For Each zone.">
272+
<img src="../assets/gn-zone-iterate-hero.webp" alt="Four brass cubes evenly spaced in a row from a Repeat zone beside a vertical stack of six cyan cubes from a For Each zone." 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> Repeat 32/24 verts/faces with X-centers at k*1.2; For Each 48/36 with Z-centers at i*0.6+0.21. Unpaired evaluates empty; For Each main Geometry passthrough is 6 verts.</div>
@@ -601,6 +601,19 @@ <h2>Source</h2>
601601
<span class="k">return</span> <span class="s">&quot;BLENDER_EEVEE&quot;</span> <span class="k">if</span> bpy.app.version &gt;= (<span class="n">5</span>, <span class="n">0</span>, <span class="n">0</span>) <span class="k">else</span> <span class="s">&quot;BLENDER_EEVEE_NEXT&quot;</span>
602602

603603

604+
<span class="k">def</span> _node_materials(ob):
605+
<span class="s">&quot;&quot;&quot;Materials the object&#x27;s Geometry Nodes tree assigns (Set Material nodes).&quot;&quot;&quot;</span>
606+
out = []
607+
<span class="k">for</span> md <span class="k">in</span> ob.modifiers:
608+
<span class="k">if</span> md.type == <span class="s">&quot;NODES&quot;</span> <span class="k">and</span> md.node_group <span class="k">is</span> <span class="k">not</span> <span class="k">None</span>:
609+
<span class="k">for</span> node <span class="k">in</span> md.node_group.nodes:
610+
<span class="k">if</span> node.bl_idname == <span class="s">&quot;GeometryNodeSetMaterial&quot;</span>:
611+
mat = node.inputs[<span class="s">&quot;Material&quot;</span>].default_value
612+
<span class="k">if</span> mat <span class="k">is</span> <span class="k">not</span> <span class="k">None</span> <span class="k">and</span> mat <span class="k">not</span> <span class="k">in</span> out:
613+
out.append(mat)
614+
<span class="k">return</span> out
615+
616+
604617
<span class="k">def</span> render_still(rpt, fee, path, engine):
605618
scene = bpy.context.scene
606619

@@ -640,16 +653,32 @@ <h2>Source</h2>
640653
light(<span class="s">&quot;Key&quot;</span>, (-<span class="n">4.0</span>, -<span class="n">5.0</span>, <span class="n">6.0</span>), <span class="n">520.0</span>, <span class="n">5.0</span>, (<span class="n">1.0</span>, <span class="n">0.96</span>, <span class="n">0.9</span>), (<span class="n">46</span>, <span class="n">0</span>, -<span class="n">35</span>))
641654
light(<span class="s">&quot;Fill&quot;</span>, (<span class="n">5.0</span>, -<span class="n">3.5</span>, <span class="n">3.0</span>), <span class="n">160.0</span>, <span class="n">9.0</span>, (<span class="n">0.75</span>, <span class="n">0.85</span>, <span class="n">1.0</span>), (<span class="n">62</span>, <span class="n">0</span>, <span class="n">50</span>))
642655
light(<span class="s">&quot;Wedge&quot;</span>, (<span class="n">2.5</span>, <span class="n">5.5</span>, <span class="n">4.0</span>), <span class="n">360.0</span>, <span class="n">6.0</span>, (<span class="n">1.0</span>, <span class="n">0.76</span>, <span class="n">0.5</span>), (-<span class="n">68</span>, <span class="n">0</span>, <span class="n">190</span>))
643-
light(<span class="s">&quot;Glint&quot;</span>, (<span class="n">0.4</span>, -<span class="n">5.2</span>, <span class="n">5.5</span>), <span class="n">700.0</span>, <span class="n">0.9</span>, (<span class="n">1.0</span>, <span class="n">0.92</span>, <span class="n">0.75</span>), (<span class="n">42</span>, <span class="n">0</span>, <span class="n">8</span>))
644-
656+
<span class="c"># Broad, not a 0.9 m spot: the small Glint blew the top tower cube out</span>
657+
<span class="c"># to near-white cyan, the brightest thing in frame by a wide margin.</span>
658+
light(<span class="s">&quot;Glint&quot;</span>, (<span class="n">0.4</span>, -<span class="n">5.2</span>, <span class="n">5.5</span>), <span class="n">300.0</span>, <span class="n">3.0</span>, (<span class="n">1.0</span>, <span class="n">0.92</span>, <span class="n">0.75</span>), (<span class="n">42</span>, <span class="n">0</span>, <span class="n">8</span>))
659+
<span class="c"># Rim from behind so the cube silhouettes separate from the dark wall.</span>
660+
light(<span class="s">&quot;Rim&quot;</span>, (-<span class="n">1.0</span>, <span class="n">4.5</span>, <span class="n">4.5</span>), <span class="n">260.0</span>, <span class="n">4.0</span>, (<span class="n">0.70</span>, <span class="n">0.82</span>, <span class="n">1.0</span>), (-<span class="n">50</span>, <span class="n">0</span>, <span class="n">180</span>))
661+
662+
<span class="c"># Presentation only: the check never reads materials. 0.85 metallic in a</span>
663+
<span class="c"># near-black world reflected near-black, and the brass read as mustard</span>
664+
<span class="c"># card. Less metal and a warmer, brighter base let the key shape it.</span>
665+
<span class="k">for</span> ob, rough, metal <span class="k">in</span> ((rpt, <span class="n">0.42</span>, <span class="n">0.55</span>), (fee, <span class="n">0.38</span>, <span class="n">0.10</span>)):
666+
<span class="k">for</span> mat <span class="k">in</span> _node_materials(ob):
667+
bsdf = mat.node_tree.nodes.get(<span class="s">&quot;Principled BSDF&quot;</span>)
668+
<span class="k">if</span> bsdf <span class="k">is</span> <span class="k">not</span> <span class="k">None</span>:
669+
bsdf.inputs[<span class="s">&quot;Metallic&quot;</span>].default_value = metal
670+
bsdf.inputs[<span class="s">&quot;Roughness&quot;</span>].default_value = rough
671+
672+
<span class="c"># Centred on the pair and more frontal: from (6.6, -9.3) the repeat row</span>
673+
<span class="c"># foreshortened into a diagonal and the tower hugged the right edge.</span>
645674
aim = bpy.data.objects.new(<span class="s">&quot;Aim&quot;</span>, <span class="k">None</span>)
646-
aim.location = (<span class="n">0.0</span>, <span class="n">0.0</span>, <span class="n">1.50</span>)
675+
aim.location = (-<span class="n">0.10</span>, <span class="n">0.0</span>, <span class="n">1.62</span>)
647676
aim.hide_render = <span class="k">True</span>
648677
scene.collection.objects.link(aim)
649678
cam_data = bpy.data.cameras.new(<span class="s">&quot;Cam&quot;</span>)
650679
cam_data.lens = <span class="n">50.0</span>
651680
cam = bpy.data.objects.new(<span class="s">&quot;Cam&quot;</span>, cam_data)
652-
cam.location = (<span class="n">6.6</span>, -<span class="n">9.3</span>, <span class="n">3.55</span>)
681+
cam.location = (<span class="n">2.7</span>, -<span class="n">10.6</span>, <span class="n">3.1</span>)
653682
scene.collection.objects.link(cam)
654683
scene.camera = cam
655684
track = cam.constraints.new(<span class="s">&quot;TRACK_TO&quot;</span>)
@@ -731,7 +760,7 @@ <h2>Source</h2>
731760
</main>
732761
<dialog class="lightbox" id="lightbox" aria-label="Full-size render">
733762
<button class="lightbox-close" type="button" autofocus>Close</button>
734-
<img src="../assets/gn-zone-iterate-hero.webp" alt="Four ochre cubes in a row from a Repeat zone beside a vertical stack of six cyan cubes from a For Each zone." />
763+
<img src="../assets/gn-zone-iterate-hero.webp" alt="Four brass cubes evenly spaced in a row from a Repeat zone beside a vertical stack of six cyan cubes from a For Each zone." />
735764
</dialog>
736765
<footer>
737766
<div class="statusbar">

‎docs/gallery/index.html‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -871,7 +871,7 @@ <h2><a href="usd-export-evaluation-mode/">usd-export-evaluation-mode</a></h2>
871871
</article>
872872
<article class="card" data-tags="geometry-nodes">
873873
<a class="card-media" href="gn-zone-iterate/" tabindex="-1" aria-hidden="true">
874-
<img src="assets/gn-zone-iterate-hero.webp" alt="Four ochre cubes in a row from a Repeat zone beside a vertical stack of six cyan cubes from a For Each zone." loading="lazy" decoding="async" />
874+
<img src="assets/gn-zone-iterate-hero.webp" alt="Four brass cubes evenly spaced in a row from a Repeat zone beside a vertical stack of six cyan cubes from a For Each zone." loading="lazy" decoding="async" />
875875
</a>
876876
<div class="card-body">
877877
<h2><a href="gn-zone-iterate/">gn-zone-iterate</a></h2>
@@ -1201,7 +1201,7 @@ <h2><a href="crate-stack/">crate-stack</a></h2>
12011201
</article>
12021202
<article class="card" data-tags="mesh export showcase">
12031203
<a class="card-media" href="stone-archway/" tabindex="-1" aria-hidden="true">
1204-
<img src="assets/stone-archway-hero.webp" alt="A freestanding stone archway of coursed piers and a semicircular arch with a keystone." loading="lazy" decoding="async" />
1204+
<img src="assets/stone-archway-hero.webp" alt="A freestanding grey stone archway of coursed piers and a semicircular arch with a keystone, laid in pale recessed mortar joints." loading="lazy" decoding="async" />
12051205
</a>
12061206
<div class="card-body">
12071207
<h2><a href="stone-archway/">stone-archway</a></h2>

0 commit comments

Comments
 (0)