Skip to content

Commit 7371433

Browse files
authored
fix: final gallery quality run — hero-material redesigns for bmesh-gear, gn-sdf-remesh, depsgraph-export (#66)
* fix: give bmesh-gear a machined-brass hero material with concentric turning marks * fix: rake gn-sdf-remesh with a low key so the SDF facets glint * fix: redesign depsgraph-export with one teal hero material on both silhouettes
1 parent 15ebadb commit 7371433

16 files changed

Lines changed: 96 additions & 42 deletions

File tree

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ non-destructive path.
176176
<table>
177177
<tr>
178178
<td width="46%" valign="middle">
179-
<a href="examples/bmesh-gear/"><img src="examples/bmesh-gear/preview.webp" alt="Bmesh gear: a machined steel 14-tooth gear at a three-quarter angle on a dark studio floor" /></a>
179+
<a href="examples/bmesh-gear/"><img src="examples/bmesh-gear/preview.webp" alt="Bmesh gear: a machined brass 14-tooth gear with concentric turning marks catching the light, tilted at a three-quarter angle on a dark studio floor" /></a>
180180
</td>
181181
<td valign="middle">
182182

@@ -251,7 +251,7 @@ semver on LTS builds (`"4.5.11 LTS"`), and that a Mesh reference dies at
251251
</tr>
252252
<tr>
253253
<td width="46%" valign="middle">
254-
<a href="examples/depsgraph-export/"><img src="examples/depsgraph-export/preview.webp" alt="Depsgraph-evaluated export: a matte graphite base cube beside its glossy green subdivision-surface evaluated form on a dark studio floor" /></a>
254+
<a href="examples/depsgraph-export/"><img src="examples/depsgraph-export/preview.webp" alt="Depsgraph-evaluated export: a teal base cube beside the smooth teal sphere of its subdivision-surface evaluated form - one shared material, two silhouettes - on a dark studio floor with a warm light pool behind" /></a>
255255
</td>
256256
<td valign="middle">
257257

23.4 KB
Loading
1.69 KB
Loading
470 Bytes
Loading

docs/gallery/bmesh-gear/index.html

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -295,15 +295,31 @@ <h2>Source</h2>
295295
scene = bpy.context.scene
296296
<span class="k">for</span> poly <span class="k">in</span> obj.data.polygons:
297297
poly.use_smooth = <span class="k">False</span> <span class="c"># crisp machined facets</span>
298-
mat = bpy.data.materials.new(<span class="s">&quot;Steel&quot;</span>)
298+
<span class="c"># machined brass: a flat metal face lit by area lights renders as one</span>
299+
<span class="c"># featureless gradient, so the finish carries the design — concentric</span>
300+
<span class="c"># turning marks (a RINGS wave driving roughness) break the face into</span>
301+
<span class="c"># rings that each catch the key at a different angle</span>
302+
mat = bpy.data.materials.new(<span class="s">&quot;MachinedBrass&quot;</span>)
299303
mat.use_nodes = <span class="k">True</span>
300-
bsdf = mat.node_tree.nodes[<span class="s">&quot;Principled BSDF&quot;</span>]
301-
bsdf.inputs[<span class="s">&quot;Base Color&quot;</span>].default_value = (<span class="n">0.75</span>, <span class="n">0.77</span>, <span class="n">0.8</span>, <span class="n">1.0</span>)
304+
nt = mat.node_tree
305+
bsdf = nt.nodes[<span class="s">&quot;Principled BSDF&quot;</span>]
306+
bsdf.inputs[<span class="s">&quot;Base Color&quot;</span>].default_value = (<span class="n">0.72</span>, <span class="n">0.44</span>, <span class="n">0.16</span>, <span class="n">1.0</span>)
302307
bsdf.inputs[<span class="s">&quot;Metallic&quot;</span>].default_value = <span class="n">1.0</span>
303-
bsdf.inputs[<span class="s">&quot;Roughness&quot;</span>].default_value = <span class="n">0.45</span>
308+
rings = nt.nodes.new(<span class="s">&quot;ShaderNodeTexWave&quot;</span>)
309+
rings.wave_type = <span class="s">&#x27;RINGS&#x27;</span>
310+
rings.rings_direction = <span class="s">&#x27;SPHERICAL&#x27;</span> <span class="c"># concentric from center, not X-axis bands</span>
311+
rings.inputs[<span class="s">&quot;Scale&quot;</span>].default_value = <span class="n">16.0</span>
312+
rings.inputs[<span class="s">&quot;Distortion&quot;</span>].default_value = <span class="n">0.5</span>
313+
rough = nt.nodes.new(<span class="s">&quot;ShaderNodeMapRange&quot;</span>)
314+
rough.inputs[<span class="s">&quot;From Min&quot;</span>].default_value = <span class="n">0.0</span>
315+
rough.inputs[<span class="s">&quot;From Max&quot;</span>].default_value = <span class="n">1.0</span>
316+
rough.inputs[<span class="s">&quot;To Min&quot;</span>].default_value = <span class="n">0.14</span>
317+
rough.inputs[<span class="s">&quot;To Max&quot;</span>].default_value = <span class="n">0.36</span>
318+
nt.links.new(rings.outputs[<span class="s">&quot;Fac&quot;</span>], rough.inputs[<span class="s">&quot;Value&quot;</span>])
319+
nt.links.new(rough.outputs[<span class="s">&quot;Result&quot;</span>], bsdf.inputs[<span class="s">&quot;Roughness&quot;</span>])
304320
obj.data.materials.append(mat)
305321
obj.location = (<span class="n">0.0</span>, <span class="n">0.0</span>, <span class="n">0.85</span>)
306-
obj.rotation_euler = (math.radians(<span class="n">38</span>), <span class="n">0.0</span>, math.radians(<span class="n">22</span>))
322+
obj.rotation_euler = (math.radians(<span class="n">46</span>), <span class="n">0.0</span>, math.radians(<span class="n">22</span>))
307323

308324
floor_me = bpy.data.meshes.new(<span class="s">&quot;Floor&quot;</span>)
309325
bm = bmesh.new()
@@ -341,9 +357,11 @@ <h2>Source</h2>
341357

342358
<span class="c"># metals live on reflections: soft warm key, restrained cool fill, and the</span>
343359
<span class="c"># warm wedge raking the back wall (docs/VISUAL-STYLE.md)</span>
344-
light(<span class="s">&quot;Key&quot;</span>, (-<span class="n">3.5</span>, -<span class="n">4.5</span>, <span class="n">5.5</span>), <span class="n">700.0</span>, <span class="n">6.0</span>, (<span class="n">1.0</span>, <span class="n">0.96</span>, <span class="n">0.9</span>), (<span class="n">48</span>, <span class="n">0</span>, -<span class="n">35</span>))
345-
light(<span class="s">&quot;Fill&quot;</span>, (<span class="n">5.0</span>, -<span class="n">3.5</span>, <span class="n">2.5</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">65</span>, <span class="n">0</span>, <span class="n">50</span>))
360+
light(<span class="s">&quot;Key&quot;</span>, (-<span class="n">3.5</span>, -<span class="n">4.5</span>, <span class="n">5.5</span>), <span class="n">550.0</span>, <span class="n">4.5</span>, (<span class="n">1.0</span>, <span class="n">0.96</span>, <span class="n">0.9</span>), (<span class="n">48</span>, <span class="n">0</span>, -<span class="n">35</span>))
361+
light(<span class="s">&quot;Fill&quot;</span>, (<span class="n">5.0</span>, -<span class="n">3.5</span>, <span class="n">2.5</span>), <span class="n">130.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">65</span>, <span class="n">0</span>, <span class="n">50</span>))
346362
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">380.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>))
363+
<span class="c"># a small hot glint: brass needs one crisp specular streak to read machined</span>
364+
light(<span class="s">&quot;Glint&quot;</span>, (<span class="n">1.8</span>, -<span class="n">5.2</span>, <span class="n">6.2</span>), <span class="n">900.0</span>, <span class="n">0.9</span>, (<span class="n">1.0</span>, <span class="n">0.9</span>, <span class="n">0.7</span>), (<span class="n">40</span>, <span class="n">0</span>, <span class="n">18</span>))
347365

348366
cam_data = bpy.data.cameras.new(<span class="s">&quot;Cam&quot;</span>)
349367
cam_data.lens = <span class="n">55.0</span>
566 KB
Loading
492 KB
Loading
497 KB
Loading

docs/gallery/depsgraph-export/index.html

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -287,11 +287,18 @@ <h2>Source</h2>
287287
<span class="s">&quot;&quot;&quot;Base cube beside its evaluated form — the two counts the check compares.&quot;&quot;&quot;</span>
288288
scene = bpy.context.scene
289289

290+
<span class="c"># one hero material on BOTH objects: the two silhouettes share a color so</span>
291+
<span class="c"># the only visible difference is the thing the check measures — base-mesh</span>
292+
<span class="c"># geometry versus the depsgraph-evaluated subsurf</span>
293+
hero = principled(<span class="s">&quot;Teal&quot;</span>, (<span class="n">0.012</span>, <span class="n">0.30</span>, <span class="n">0.34</span>, <span class="n">1.0</span>), <span class="n">0.0</span>, <span class="n">0.2</span>)
294+
290295
<span class="c"># left: the base mesh, modifier-free (a plain copy of the datablock)</span>
291296
base_obj = bpy.data.objects.new(<span class="s">&quot;Base&quot;</span>, obj.data.copy())
292297
base_obj.location = (-<span class="n">1.7</span>, <span class="n">0.0</span>, <span class="n">1.0</span>)
293-
base_obj.data.materials.append(
294-
principled(<span class="s">&quot;Graphite&quot;</span>, (<span class="n">0.09</span>, <span class="n">0.10</span>, <span class="n">0.12</span>, <span class="n">1.0</span>), <span class="n">0.0</span>, <span class="n">0.55</span>))
298+
<span class="c"># turned off camera-parallel so the key rakes the front face into a</span>
299+
<span class="c"># gradient instead of one flat tone</span>
300+
base_obj.rotation_euler = (<span class="n">0.0</span>, <span class="n">0.0</span>, math.radians(<span class="n">32</span>))
301+
base_obj.data.materials.append(hero)
295302
bpy.context.collection.objects.link(base_obj)
296303

297304
<span class="c"># right: the SUBSURF object — what the depsgraph evaluates and the OBJ ships.</span>
@@ -302,8 +309,7 @@ <h2>Source</h2>
302309
bottom = min(v.co.z <span class="k">for</span> v <span class="k">in</span> em.vertices)
303310
obj.evaluated_get(dg).to_mesh_clear()
304311
obj.location = (<span class="n">1.8</span>, <span class="n">0.0</span>, -bottom)
305-
obj.data.materials.append(
306-
principled(<span class="s">&quot;EvalGreen&quot;</span>, (<span class="n">0.03</span>, <span class="n">0.32</span>, <span class="n">0.10</span>, <span class="n">1.0</span>), <span class="n">0.0</span>, <span class="n">0.15</span>))
312+
obj.data.materials.append(hero)
307313
<span class="k">for</span> poly <span class="k">in</span> obj.data.polygons:
308314
poly.use_smooth = <span class="k">True</span>
309315

@@ -345,10 +351,10 @@ <h2>Source</h2>
345351
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">380.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>))
346352

347353
cam_data = bpy.data.cameras.new(<span class="s">&quot;Cam&quot;</span>)
348-
cam_data.lens = <span class="n">46.0</span>
354+
cam_data.lens = <span class="n">50.0</span>
349355
cam = bpy.data.objects.new(<span class="s">&quot;Cam&quot;</span>, cam_data)
350-
cam.location = (<span class="n">0.0</span>, -<span class="n">8.2</span>, <span class="n">2.7</span>)
351-
cam.rotation_euler = (math.radians(<span class="n">78</span>), <span class="n">0.0</span>, <span class="n">0.0</span>)
356+
cam.location = (<span class="n">0.0</span>, -<span class="n">7.4</span>, <span class="n">3.0</span>)
357+
cam.rotation_euler = (math.radians(<span class="n">76</span>), <span class="n">0.0</span>, <span class="n">0.0</span>)
352358
scene.collection.objects.link(cam)
353359
scene.camera = cam
354360

docs/gallery/gn-sdf-remesh/index.html

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -252,8 +252,8 @@ <h2>Source</h2>
252252
p.use_smooth = <span class="k">True</span>
253253
mat = bpy.data.materials.new(<span class="s">&quot;Ceramic&quot;</span>); mat.use_nodes = <span class="k">True</span>
254254
b = mat.node_tree.nodes.get(<span class="s">&#x27;Principled BSDF&#x27;</span>)
255-
b.inputs[<span class="s">&#x27;Base Color&#x27;</span>].default_value = (<span class="n">0.42</span>, <span class="n">0.028</span>, <span class="n">0.045</span>, <span class="n">1</span>) <span class="c"># crimson ceramic</span>
256-
b.inputs[<span class="s">&#x27;Roughness&#x27;</span>].default_value = <span class="n">0.22</span>
255+
b.inputs[<span class="s">&#x27;Base Color&#x27;</span>].default_value = (<span class="n">0.45</span>, <span class="n">0.025</span>, <span class="n">0.05</span>, <span class="n">1</span>) <span class="c"># crimson ceramic</span>
256+
b.inputs[<span class="s">&#x27;Roughness&#x27;</span>].default_value = <span class="n">0.16</span> <span class="c"># glossy: the SDF facets read by their glints</span>
257257
obj.data.materials.append(mat)
258258
<span class="k">return</span> obj
259259

@@ -275,12 +275,15 @@ <h2>Source</h2>
275275
wall.rotation_euler = (<span class="n">1.5708</span>, <span class="n">0</span>, <span class="n">0</span>); bpy.context.collection.objects.link(wall)
276276
w = bpy.data.worlds.new(<span class="s">&quot;W&quot;</span>); w.use_nodes = <span class="k">True</span>
277277
w.node_tree.nodes[<span class="s">&quot;Background&quot;</span>].inputs[<span class="n">0</span>].default_value = (<span class="n">0.02</span>, <span class="n">0.021</span>, <span class="n">0.025</span>, <span class="n">1</span>); sc.world = w
278-
aim = bpy.data.objects.new(<span class="s">&quot;Aim&quot;</span>, <span class="k">None</span>); aim.location = (<span class="n">0</span>, <span class="n">0</span>, <span class="n">0.55</span>); bpy.context.collection.objects.link(aim)
279-
cam = bpy.data.objects.new(<span class="s">&quot;cam&quot;</span>, bpy.data.cameras.new(<span class="s">&quot;cam&quot;</span>)); cam.location = (<span class="n">0</span>, -<span class="n">6.5</span>, <span class="n">2.2</span>)
278+
aim = bpy.data.objects.new(<span class="s">&quot;Aim&quot;</span>, <span class="k">None</span>); aim.location = (<span class="n">0</span>, <span class="n">0</span>, <span class="n">0.5</span>); bpy.context.collection.objects.link(aim)
279+
<span class="c"># off-axis and low: the remesh facets are the API evidence, and they only</span>
280+
<span class="c"># read when a raking key skims them from the side</span>
281+
cam = bpy.data.objects.new(<span class="s">&quot;cam&quot;</span>, bpy.data.cameras.new(<span class="s">&quot;cam&quot;</span>)); cam.location = (<span class="n">2.6</span>, -<span class="n">5.2</span>, <span class="n">1.5</span>)
280282
bpy.context.collection.objects.link(cam); sc.camera = cam
281283
c = cam.constraints.new(<span class="s">&#x27;TRACK_TO&#x27;</span>); c.target = aim; c.track_axis = <span class="s">&#x27;TRACK_NEGATIVE_Z&#x27;</span>; c.up_axis = <span class="s">&#x27;UP_Y&#x27;</span>
282-
<span class="c"># shaped warm key, faint cool fill (docs/VISUAL-STYLE.md)</span>
283-
<span class="k">for</span> nm, loc, en, sz, col <span class="k">in</span> [(<span class="s">&quot;K&quot;</span>, (-<span class="n">4</span>, -<span class="n">5</span>, <span class="n">7</span>), <span class="n">650</span>, <span class="n">4.5</span>, (<span class="n">1.0</span>, <span class="n">0.96</span>, <span class="n">0.9</span>)),
284+
<span class="c"># low raking warm key so every facet catches a distinct glint, faint cool</span>
285+
<span class="c"># fill (docs/VISUAL-STYLE.md)</span>
286+
<span class="k">for</span> nm, loc, en, sz, col <span class="k">in</span> [(<span class="s">&quot;K&quot;</span>, (-<span class="n">5</span>, -<span class="n">3.5</span>, <span class="n">2.8</span>), <span class="n">480</span>, <span class="n">3.0</span>, (<span class="n">1.0</span>, <span class="n">0.96</span>, <span class="n">0.9</span>)),
284287
(<span class="s">&quot;F2&quot;</span>, (<span class="n">5</span>, -<span class="n">4</span>, <span class="n">2</span>), <span class="n">110</span>, <span class="n">7.0</span>, (<span class="n">0.75</span>, <span class="n">0.85</span>, <span class="n">1.0</span>))]:
285288
ld = bpy.data.lights.new(nm, <span class="s">&#x27;AREA&#x27;</span>); ld.energy = en; ld.size = sz; ld.color = col
286289
lo = bpy.data.objects.new(nm, ld); lo.location = loc; bpy.context.collection.objects.link(lo)

0 commit comments

Comments
 (0)