Skip to content

Commit d262c2a

Browse files
TMHSDigitalclaude
andcommitted
docs(gallery): regenerate pages and contact sheets for the final redesign batch
Rebuilds docs/gallery for custom-normals-shade, degenerate-bevel-weld, driver-wave, wave-displace, usd-export-evaluation-mode, cross-version-property-delete, color-attribute-wheel, gn-zone-iterate and gn-socket-rename. Recomposites their contact sheets against the current calibration tiles. Shortens the degenerate-bevel-weld and cross-version-property-delete alts to fit the 200-character gallery gate. check_site_links: 91 pages, 2592 internal references, 0 failures. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1 parent b9ccd9c commit d262c2a

29 files changed

Lines changed: 2254 additions & 448 deletions

File tree

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1620,7 +1620,7 @@ <h3><a href="../vertex-color-ao/">vertex-color-ao</a></h3>
16201620
</article>
16211621
<article class="card mini">
16221622
<a class="card-media" href="../color-attribute-wheel/" tabindex="-1" aria-hidden="true">
1623-
<img src="../assets/color-attribute-wheel-hero.webp" alt="A board painted with a full hue wheel that fades to white at the centre, leaning on a dark plinth." width="1280" height="720" loading="lazy" decoding="async" />
1623+
<img src="../assets/color-attribute-wheel-hero.webp" alt="A domed ceramic plate glazed with a full hue wheel that fades to white at the centre, ringed in a brass bezel and standing on a walnut easel." width="1280" height="720" loading="lazy" decoding="async" />
16241624
</a>
16251625
<div class="card-body">
16261626
<h3><a href="../color-attribute-wheel/">color-attribute-wheel</a></h3>
@@ -1629,7 +1629,7 @@ <h3><a href="../color-attribute-wheel/">color-attribute-wheel</a></h3>
16291629
</article>
16301630
<article class="card mini">
16311631
<a class="card-media" href="../custom-normals-shade/" tabindex="-1" aria-hidden="true">
1632-
<img src="../assets/custom-normals-shade-hero.webp" alt="Three olive jerry cans with X-pressed panels, triple handles and red-sealed spouts: faceted flat, glossy-smeared smooth-everywhere, and crisp by-angle with its sharp edges traced in thin cyan lines." width="1280" height="720" loading="lazy" decoding="async" />
1632+
<img src="../assets/custom-normals-shade-hero.webp" alt="Three olive jerry cans with X-pressed panels, triple handles and red-sealed spouts: faceted flat, glossy-smeared smooth-everywhere, and crisp by-angle with its sharp edges traced in thin amber lines." width="1280" height="720" loading="lazy" decoding="async" />
16331633
</a>
16341634
<div class="card-body">
16351635
<h3><a href="../custom-normals-shade/">custom-normals-shade</a></h3>

‎docs/gallery/bake-normal-high-to-low/index.html‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1573,7 +1573,7 @@ <h2 id="related-h">Related</h2>
15731573
<div class="related-grid">
15741574
<article class="card mini">
15751575
<a class="card-media" href="../wave-displace/" tabindex="-1" aria-hidden="true">
1576-
<img src="../assets/wave-displace-hero.webp" alt="A blue tile whose top is a grid displaced into rolling sine-wave hills, standing on a dark studio floor." width="1280" height="720" loading="lazy" decoding="async" />
1576+
<img src="../assets/wave-displace-hero.webp" alt="A cast bronze tile in a walnut frame whose top is a grid displaced into rolling sine-wave crests, polished on the peaks with green verdigris pooled in the troughs." width="1280" height="720" loading="lazy" decoding="async" />
15771577
</a>
15781578
<div class="card-body">
15791579
<h3><a href="../wave-displace/">wave-displace</a></h3>

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

Lines changed: 296 additions & 92 deletions
Large diffs are not rendered by default.

‎docs/gallery/cross-version-property-delete/index.html‎

Lines changed: 293 additions & 115 deletions
Large diffs are not rendered by default.

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

Lines changed: 21 additions & 15 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/custom-normals-shade-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 olive jerry cans with X-pressed panels, triple handles and red-sealed spouts: faceted flat, glossy-smeared smooth-everywhere, and crisp by-angle with its sharp edges traced in thin cyan lines." />
19+
<meta property="og:image:alt" content="Three olive jerry cans with X-pressed panels, triple handles and red-sealed spouts: faceted flat, glossy-smeared smooth-everywhere, and crisp by-angle with its sharp edges traced in thin amber lines." />
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="custom-normals-shade — Examples — Blender Developer Tools" />
2323
<meta name="twitter:description" content="A jerry can prop shaded three ways to prove the post-4.1 shading contract: hard edges are mesh data, landing exactly where the dihedral crosses. Face smooth flags plus a sharp_edge attribute, verified against an independently recomputed dihedral test, and per-loop custom normals surviving depsgraph evaluation within their int16 storage quantization (3.904e-05 over 8196 loops, not float-exact)." />
2424
<meta name="twitter:image" content="https://tmhsdigital.github.io/Blender-Developer-Tools/gallery/assets/custom-normals-shade-hero.webp" />
25-
<meta name="twitter:image:alt" content="Three olive jerry cans with X-pressed panels, triple handles and red-sealed spouts: faceted flat, glossy-smeared smooth-everywhere, and crisp by-angle with its sharp edges traced in thin cyan lines." />
25+
<meta name="twitter:image:alt" content="Three olive jerry cans with X-pressed panels, triple handles and red-sealed spouts: faceted flat, glossy-smeared smooth-everywhere, and crisp by-angle with its sharp edges traced in thin amber lines." />
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>custom-normals-shade</h1>
351351
</header>
352352
<main id="main">
353353
<nav class="pager" aria-label="Examples"><a rel="prev" href="../collision-hull-proxy/" aria-label="Previous example: collision-hull-proxy"><span aria-hidden="true">&larr;</span> collision-hull-proxy</a><span class="pager-pos hud">34 of 52 examples<span class="pager-keys"> &middot; <kbd>&larr;</kbd><kbd>&rarr;</kbd></span></span><a rel="next" href="../sky-texture-sun-elevation/" aria-label="Next example: sky-texture-sun-elevation">sky-texture-sun-elevation <span aria-hidden="true">&rarr;</span></a></nav>
354-
<button class="detail-hero" id="heroZoom" type="button" aria-label="View full size: Three olive jerry cans with X-pressed panels, triple handles and red-sealed spouts: faceted flat, glossy-smeared smooth-everywhere, and crisp by-angle with its sharp edges traced in thin cyan lines.">
355-
<img src="../assets/custom-normals-shade-hero.webp" alt="Three olive jerry cans with X-pressed panels, triple handles and red-sealed spouts: faceted flat, glossy-smeared smooth-everywhere, and crisp by-angle with its sharp edges traced in thin cyan lines." width="1280" height="720" fetchpriority="high" />
354+
<button class="detail-hero" id="heroZoom" type="button" aria-label="View full size: Three olive jerry cans with X-pressed panels, triple handles and red-sealed spouts: faceted flat, glossy-smeared smooth-everywhere, and crisp by-angle with its sharp edges traced in thin amber lines.">
355+
<img src="../assets/custom-normals-shade-hero.webp" alt="Three olive jerry cans with X-pressed panels, triple handles and red-sealed spouts: faceted flat, glossy-smeared smooth-everywhere, and crisp by-angle with its sharp edges traced in thin amber lines." width="1280" height="720" fetchpriority="high" />
356356
</button>
357357
<p class="zoom-hint">Rendered headless by the example itself — click to zoom.</p>
358358
<div class="callout"><span class="tag">witnesses</span> use_auto_smooth, use_custom_normals and calc_normals are AttributeError on BOTH 4.5 LTS and 5.1 - AI code still emits them. The legacy shade_auto_smooth operator CANCELS headless on 4.5 (asset load never finishes; mesh untouched; no exception) while 5.1 FINISHES with the Smooth by Angle NODES modifier. By-angle sharp sets match the independent dihedral recompute exactly (1304 of 4738 edges over 3 meshes).</div>
@@ -369,7 +369,7 @@ <h1>custom-normals-shade</h1>
369369
<ul><li><strong>The legacy shading API is gone — on both supported versions.</strong> <code>use_auto_smooth</code>, <code>use_custom_normals</code>, and <code>calc_normals</code> are AttributeError on 4.5 LTS <em>and</em> 5.1. AI-generated Blender code still emits <code>mesh.use_auto_smooth = True</code> constantly; any script carrying that habit dies immediately, and this check keeps it dead.</li><li><strong>Shade-by-angle is exact.</strong> <code>mesh.set_sharp_from_angle(30°)</code> (which also sets the face smooth flags — probed on both versions) marks sharp exactly the edges whose <em>independently recomputed</em> dihedral angle crosses the threshold: Shell 1144 of 4098 edges, Handle 32 of 368, Neck 128 of 272 (1304 of 4738) — an exact set match, not a count approximation.</li><li><strong>The evaluated shading matches the attribute&#x27;s promise.</strong> Through depsgraph evaluation, loop normals across a smooth edge are welded (deviation 0.0, tol 1e-3) and loop normals across a sharp edge are split by the dihedral (angle error 1.898e-03 rad, tol 5e-3 — the curved side band and the panels&#x27; rounded wall corners average a fan whose facets step at most 22.5 and 10 deg), all unit length (err 1.0e-07).</li><li><strong>Custom split normals survive depsgraph evaluation</strong> — with a quantization budget, not float precision: <code>normals_split_custom_set</code> stores per-loop normals in int16, so an 8196-loop round-trip reads back within <strong>3.904e-05</strong> (tol 2e-4), unit length within 1.7e-07. Asserting float-exact custom normals is a real bug this check catches. Each corner requests its face normal tilted 20 deg toward the corner bisector. The pattern matters: Blender&#x27;s lnor encoder merges requests within one fan that sit closer than ~0.81 deg and snaps an in-plane angle under 0.81 deg to zero. On this shell an index-swept pattern measured the merge (1.38e-02) and a 144-direction cycle hit the snap on 13 corners (9.1e-03). Neither is storage precision, so the check keeps clear of both.</li><li><strong>The divergence: the legacy <code>shade_auto_smooth</code> OPERATOR is a version-split trap.</strong> It builds the Smooth-by-Angle node-group modifier from a bundled asset. Headless on <strong>4.5 LTS the asset load never finishes</strong>: the op returns <code>{&#x27;CANCELLED&#x27;}</code> — no exception — and the mesh stays <strong>untouched</strong> (measured: 0 smooth faces, 0 modifiers). Any script that ignores the return set ships flat shading and never knows. On <strong>5.1</strong> it FINISHES and adds the <code>Smooth by Angle</code> NODES modifier. The portable path is the data API above, version-gated here explicitly.</li></ul>
370370
<p><strong>What each check catches on failure:</strong> author/audit threshold drift (probe: sharp marks applied at 20° but audited at 30°, exit 5, 48 extra edges on the shell); the two halves of the contract out of sync (probe: <code>sharp_edge</code> set but face smooth flags lost, exit 6, smooth-edge loops split by 3.902e-01); float-exactness assumed of custom normals (probe: tolerance 1e-6, exit 7, measured 3.904e-05); and any future version that resurrects the legacy API or changes the operator&#x27;s headless behavior (exit 3/8). The render path adds the Layer 1 gates: framing (exit 10) and asset quality (exit 11).</p>
371371
<p><strong>Version witness:</strong> every value above is identical on Blender 4.5.11 LTS, 5.1.2 and 5.2.1 LTS except the <code>shade_auto_smooth</code> operator behavior, which is asserted per version (CANCELLED + untouched on 4.5, FINISHED + NODES modifier on 5.1 and 5.2).</p>
372-
<p>The render shows three fresh builds of the same can, one per shading treatment. Left, flat: the side-band corners, cap and handle break into facets. Middle, smooth-everywhere (the shade-smooth-and-forget AI habit): the flat fields smear into gradients and the pressed panels go pillowy. Right, by-angle (the contract): crisp creases and smooth rounds, with the <code>sharp_edge</code> attribute read back from the mesh and traced as thin cyan lines, so the viewer sees exactly which edges the data marked hard. A low strip light makes the highlight shapes diverge between the three.</p>
372+
<p>The render shows three fresh builds of the same can, one per shading treatment. Left, flat: the side-band corners, cap and handle break into facets. Middle, smooth-everywhere (the shade-smooth-and-forget AI habit): the flat fields smear into gradients and the pressed panels go pillowy. Right, by-angle (the contract): crisp creases and smooth rounds, with the <code>sharp_edge</code> attribute read back from the mesh and traced as thin amber drafting lines (low emission, no bloom halo), so the viewer sees exactly which edges the data marked hard. A low strip light makes the highlight shapes diverge between the three.</p>
373373
<h2 id="run">Run<a class="anchor" href="#run" aria-label="Link to this section">#</a></h2>
374374
<pre><code># Cheap correctness check (no render) — the CI check:
375375
blender --background --python custom_normals_shade.py --
@@ -389,9 +389,9 @@ <h2 id="exit-codes">Exit codes<a class="anchor" href="#exit-codes" aria-label="L
389389
<h2>Source</h2>
390390
<div class="src-meta">
391391
<code>examples/custom-normals-shade/custom_normals_shade.py</code>
392-
<span>953 lines &middot; <a href="https://github.com/TMHSDigital/Blender-Developer-Tools/tree/main/examples/custom-normals-shade/custom_normals_shade.py">View on GitHub &rarr;</a></span>
392+
<span>956 lines &middot; <a href="https://github.com/TMHSDigital/Blender-Developer-Tools/tree/main/examples/custom-normals-shade/custom_normals_shade.py">View on GitHub &rarr;</a></span>
393393
</div>
394-
<div class="code" data-lines="953">
394+
<div class="code" data-lines="956">
395395
<pre class="gutter" aria-hidden="true">1
396396
2
397397
3
@@ -1344,7 +1344,10 @@ <h2>Source</h2>
13441344
950
13451345
951
13461346
952
1347-
953</pre><pre class="code-lines"><span class="s">&quot;&quot;&quot;A jerry can prop shaded three ways — a runnable example.
1347+
953
1348+
954
1349+
955
1350+
956</pre><pre class="code-lines"><span class="s">&quot;&quot;&quot;A jerry can prop shaded three ways — a runnable example.
13481351

13491352
Witnesses the shading contract a game prop&#x27;s silhouette depends on (engines
13501353
generally, FiveM/GTA-style prop workflows specifically): which edges read
@@ -2103,7 +2106,7 @@ <h2>Source</h2>
21032106
me.set_sharp_from_angle(angle=ANGLE)
21042107

21052108

2106-
<span class="k">def</span> sharp_edge_overlay(parts, name, radius=<span class="n">0.0026</span>):
2109+
<span class="k">def</span> sharp_edge_overlay(parts, name, radius=<span class="n">0.0019</span>):
21072110
<span class="s">&quot;&quot;&quot;Thin tubes along every edge the `sharp_edge` attribute marks — the
21082111
contract&#x27;s own output drawn onto the by-angle can, read back from the
21092112
mesh rather than recomputed.&quot;&quot;&quot;</span>
@@ -2161,12 +2164,15 @@ <h2>Source</h2>
21612164
variants[mode] = built
21622165
hero = [o <span class="k">for</span> objs <span class="k">in</span> variants.values() <span class="k">for</span> o <span class="k">in</span> objs]
21632166
edges = sharp_edge_overlay(variants[<span class="s">&quot;byangle&quot;</span>], <span class="s">&quot;SharpEdgeOverlay&quot;</span>)
2164-
glow = bpy.data.materials.new(<span class="s">&quot;SharpEdgeGlow&quot;</span>)
2167+
<span class="c"># a drafting line, not a glow: warm amber ink with just enough emission</span>
2168+
<span class="c"># to stay legible on the shadow side of the can, no bloom halo</span>
2169+
glow = bpy.data.materials.new(<span class="s">&quot;SharpEdgeInk&quot;</span>)
21652170
glow.use_nodes = <span class="k">True</span>
21662171
gb = glow.node_tree.nodes[<span class="s">&quot;Principled BSDF&quot;</span>]
2167-
gb.inputs[<span class="s">&quot;Base Color&quot;</span>].default_value = (<span class="n">0.35</span>, <span class="n">0.85</span>, <span class="n">1.0</span>, <span class="n">1.0</span>)
2168-
gb.inputs[<span class="s">&quot;Emission Color&quot;</span>].default_value = (<span class="n">0.35</span>, <span class="n">0.85</span>, <span class="n">1.0</span>, <span class="n">1.0</span>)
2169-
gb.inputs[<span class="s">&quot;Emission Strength&quot;</span>].default_value = <span class="n">1.0</span>
2172+
gb.inputs[<span class="s">&quot;Base Color&quot;</span>].default_value = (<span class="n">0.85</span>, <span class="n">0.40</span>, <span class="n">0.06</span>, <span class="n">1.0</span>)
2173+
gb.inputs[<span class="s">&quot;Roughness&quot;</span>].default_value = <span class="n">0.6</span>
2174+
gb.inputs[<span class="s">&quot;Emission Color&quot;</span>].default_value = (<span class="n">1.0</span>, <span class="n">0.50</span>, <span class="n">0.08</span>, <span class="n">1.0</span>)
2175+
gb.inputs[<span class="s">&quot;Emission Strength&quot;</span>].default_value = <span class="n">0.25</span>
21702176
edges.data.materials.append(glow)
21712177
edges.location = variants[<span class="s">&quot;byangle&quot;</span>][<span class="n">0</span>].location
21722178
edges.rotation_euler = variants[<span class="s">&quot;byangle&quot;</span>][<span class="n">0</span>].rotation_euler
@@ -2305,7 +2311,7 @@ <h2 id="related-h">Related</h2>
23052311
<div class="related-grid">
23062312
<article class="card mini">
23072313
<a class="card-media" href="../color-attribute-wheel/" tabindex="-1" aria-hidden="true">
2308-
<img src="../assets/color-attribute-wheel-hero.webp" alt="A board painted with a full hue wheel that fades to white at the centre, leaning on a dark plinth." width="1280" height="720" loading="lazy" decoding="async" />
2314+
<img src="../assets/color-attribute-wheel-hero.webp" alt="A domed ceramic plate glazed with a full hue wheel that fades to white at the centre, ringed in a brass bezel and standing on a walnut easel." width="1280" height="720" loading="lazy" decoding="async" />
23092315
</a>
23102316
<div class="card-body">
23112317
<h3><a href="../color-attribute-wheel/">color-attribute-wheel</a></h3>
@@ -2336,7 +2342,7 @@ <h3><a href="../vertex-color-ao/">vertex-color-ao</a></h3>
23362342
</main>
23372343
<dialog class="lightbox" id="lightbox" aria-label="Full-size render">
23382344
<button class="lightbox-close" type="button" autofocus>Close</button>
2339-
<img src="../assets/custom-normals-shade-hero.webp" alt="Three olive jerry cans with X-pressed panels, triple handles and red-sealed spouts: faceted flat, glossy-smeared smooth-everywhere, and crisp by-angle with its sharp edges traced in thin cyan lines." />
2345+
<img src="../assets/custom-normals-shade-hero.webp" alt="Three olive jerry cans with X-pressed panels, triple handles and red-sealed spouts: faceted flat, glossy-smeared smooth-everywhere, and crisp by-angle with its sharp edges traced in thin amber lines." />
23402346
</dialog>
23412347
<footer>
23422348
<div class="statusbar">

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1326,11 +1326,11 @@ <h3><a href="../turntable/">turntable</a></h3>
13261326
</article>
13271327
<article class="card mini">
13281328
<a class="card-media" href="../driver-wave/" tabindex="-1" aria-hidden="true">
1329-
<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" loading="lazy" decoding="async" />
1329+
<img src="../assets/driver-wave-hero.webp" alt="A small pipe-organ facade: sixteen brass pipes on a walnut windchest in front of a dark walnut case, their tops rising and falling in a sine wave, tall at both ends and short in the middle." width="1280" height="720" loading="lazy" decoding="async" />
13301330
</a>
13311331
<div class="card-body">
13321332
<h3><a href="../driver-wave/">driver-wave</a></h3>
1333-
<p>A driver_namespace function driving sixteen column heights through SCRIPTED drivers — the sine skyline is entirely driver-evaluated.</p>
1333+
<p>A driver_namespace function driving sixteen organ-pipe heights through SCRIPTED drivers — the sine skyline of the pipe tops is entirely driver-evaluated.</p>
13341334
</div>
13351335
</article>
13361336
</div>

0 commit comments

Comments
 (0)