Skip to content

Commit 10ecb07

Browse files
authored
fix: complete the gallery quality pass — turntable regression, three old-era restages (#65)
* fix: pin turntable still to a readable three-quarter Suzanne pose (regression from #62) * fix: restage gn-sdf-remesh to the gallery visual style (incorrect PASS in #62) * fix: restage bmesh-gear so the steel material its script specifies actually renders (incorrect PASS in #62) * fix: deepen depsgraph-export base-cube contrast and tighten framing
1 parent 1ac2458 commit 10ecb07

16 files changed

Lines changed: 64 additions & 44 deletions

File tree

-3.92 KB
Loading
272 Bytes
Loading
-14.4 KB
Loading
4.99 KB
Loading

docs/gallery/bmesh-gear/index.html

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -315,8 +315,8 @@ <h2>Source</h2>
315315
fmat = bpy.data.materials.new(<span class="s">&quot;Studio&quot;</span>)
316316
fmat.use_nodes = <span class="k">True</span>
317317
fb = fmat.node_tree.nodes[<span class="s">&quot;Principled BSDF&quot;</span>]
318-
fb.inputs[<span class="s">&quot;Base Color&quot;</span>].default_value = (<span class="n">0.055</span>, <span class="n">0.06</span>, <span class="n">0.07</span>, <span class="n">1.0</span>)
319-
fb.inputs[<span class="s">&quot;Roughness&quot;</span>].default_value = <span class="n">0.5</span>
318+
fb.inputs[<span class="s">&quot;Base Color&quot;</span>].default_value = (<span class="n">0.03</span>, <span class="n">0.032</span>, <span class="n">0.037</span>, <span class="n">1.0</span>)
319+
fb.inputs[<span class="s">&quot;Roughness&quot;</span>].default_value = <span class="n">0.7</span>
320320
floor_me.materials.append(fmat)
321321
floor = bpy.data.objects.new(<span class="s">&quot;Floor&quot;</span>, floor_me)
322322
scene.collection.objects.link(floor)
@@ -328,7 +328,7 @@ <h2>Source</h2>
328328
world = bpy.data.worlds.new(<span class="s">&quot;World&quot;</span>)
329329
world.use_nodes = <span class="k">True</span>
330330
<span class="c"># metals reflect the environment: keep a faint cool ambient so flanks never go black</span>
331-
world.node_tree.nodes[<span class="s">&quot;Background&quot;</span>].inputs[<span class="s">&quot;Color&quot;</span>].default_value = (<span class="n">0.035</span>, <span class="n">0.04</span>, <span class="n">0.05</span>, <span class="n">1.0</span>)
331+
world.node_tree.nodes[<span class="s">&quot;Background&quot;</span>].inputs[<span class="s">&quot;Color&quot;</span>].default_value = (<span class="n">0.02</span>, <span class="n">0.022</span>, <span class="n">0.028</span>, <span class="n">1.0</span>)
332332
scene.world = world
333333

334334
<span class="k">def</span> light(name, loc, energy, size, col, rot):
@@ -339,10 +339,11 @@ <h2>Source</h2>
339339
ob.rotation_euler = tuple(math.radians(a) <span class="k">for</span> a <span class="k">in</span> rot)
340340
scene.collection.objects.link(ob)
341341

342-
<span class="c"># metals live on reflections: big soft key, strong cool fill, warm rim kept low</span>
343-
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">1400.0</span>, <span class="n">7.0</span>, (<span class="n">1.0</span>, <span class="n">0.98</span>, <span class="n">0.94</span>), (<span class="n">48</span>, <span class="n">0</span>, -<span class="n">35</span>))
344-
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">600.0</span>, <span class="n">9.0</span>, (<span class="n">0.8</span>, <span class="n">0.87</span>, <span class="n">1.0</span>), (<span class="n">65</span>, <span class="n">0</span>, <span class="n">50</span>))
345-
light(<span class="s">&quot;Rim&quot;</span>, (<span class="n">1.5</span>, <span class="n">4.5</span>, <span class="n">2.2</span>), <span class="n">700.0</span>, <span class="n">4.0</span>, (<span class="n">1.0</span>, <span class="n">0.7</span>, <span class="n">0.4</span>), (-<span class="n">82</span>, <span class="n">0</span>, <span class="n">165</span>))
342+
<span class="c"># metals live on reflections: soft warm key, restrained cool fill, and the</span>
343+
<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>))
346+
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>))
346347

347348
cam_data = bpy.data.cameras.new(<span class="s">&quot;Cam&quot;</span>)
348349
cam_data.lens = <span class="n">55.0</span>
@@ -364,6 +365,8 @@ <h2>Source</h2>
364365
scene.render.resolution_y = <span class="n">720</span>
365366
scene.render.image_settings.file_format = <span class="s">&#x27;PNG&#x27;</span>
366367
scene.render.filepath = path
368+
<span class="c"># AgX would flatten the steel toward chalk (docs/VISUAL-STYLE.md)</span>
369+
scene.view_settings.view_transform = <span class="s">&#x27;Standard&#x27;</span>
367370
bpy.ops.render.render(write_still=<span class="k">True</span>)
368371
<span class="k">return</span> os.path.exists(path) <span class="k">and</span> os.path.getsize(path) &gt; <span class="n">0</span>
369372

docs/gallery/depsgraph-export/index.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ <h2>Source</h2>
291291
base_obj = bpy.data.objects.new(<span class="s">&quot;Base&quot;</span>, obj.data.copy())
292292
base_obj.location = (-<span class="n">1.7</span>, <span class="n">0.0</span>, <span class="n">1.0</span>)
293293
base_obj.data.materials.append(
294-
principled(<span class="s">&quot;Graphite&quot;</span>, (<span class="n">0.16</span>, <span class="n">0.17</span>, <span class="n">0.19</span>, <span class="n">1.0</span>), <span class="n">0.0</span>, <span class="n">0.7</span>))
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>))
295295
bpy.context.collection.objects.link(base_obj)
296296

297297
<span class="c"># right: the SUBSURF object — what the depsgraph evaluates and the OBJ ships.</span>
@@ -345,10 +345,10 @@ <h2>Source</h2>
345345
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>))
346346

347347
cam_data = bpy.data.cameras.new(<span class="s">&quot;Cam&quot;</span>)
348-
cam_data.lens = <span class="n">42.0</span>
348+
cam_data.lens = <span class="n">46.0</span>
349349
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">9.0</span>, <span class="n">3.1</span>)
351-
cam.rotation_euler = (math.radians(<span class="n">76</span>), <span class="n">0.0</span>, <span class="n">0.0</span>)
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>)
352352
scene.collection.objects.link(cam)
353353
scene.camera = cam
354354

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

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ <h2>Source</h2>
217217
blender --background --python gn_sdf_remesh.py -- --output r.png # also render the result
218218
blender --background --python gn_sdf_remesh.py -- --output r.png --engine cycles # GPU-less
219219
&quot;&quot;&quot;</span>
220-
<span class="k">import</span> bpy, sys, os, argparse
220+
<span class="k">import</span> bpy, sys, os, math, argparse
221221

222222
<span class="k">def</span> get_eevee_engine_id():
223223
<span class="k">return</span> <span class="s">&#x27;BLENDER_EEVEE&#x27;</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">&#x27;BLENDER_EEVEE_NEXT&#x27;</span>
@@ -267,25 +267,28 @@ <h2>Source</h2>
267267
bm.free()
268268
fmat = bpy.data.materials.new(<span class="s">&quot;Studio&quot;</span>); fmat.use_nodes = <span class="k">True</span>
269269
fb = fmat.node_tree.nodes.get(<span class="s">&#x27;Principled BSDF&#x27;</span>)
270-
fb.inputs[<span class="s">&#x27;Base Color&#x27;</span>].default_value = (<span class="n">0.055</span>, <span class="n">0.06</span>, <span class="n">0.07</span>, <span class="n">1</span>) <span class="c"># dark graphite studio</span>
271-
fb.inputs[<span class="s">&#x27;Roughness&#x27;</span>].default_value = <span class="n">0.55</span>
270+
fb.inputs[<span class="s">&#x27;Base Color&#x27;</span>].default_value = (<span class="n">0.03</span>, <span class="n">0.032</span>, <span class="n">0.037</span>, <span class="n">1</span>) <span class="c"># dark staged studio</span>
271+
fb.inputs[<span class="s">&#x27;Roughness&#x27;</span>].default_value = <span class="n">0.7</span>
272272
fme.materials.append(fmat)
273273
floor = bpy.data.objects.new(<span class="s">&quot;Floor&quot;</span>, fme); bpy.context.collection.objects.link(floor)
274274
wall = bpy.data.objects.new(<span class="s">&quot;Wall&quot;</span>, fme.copy()); wall.location = (<span class="n">0</span>, <span class="n">9.0</span>, <span class="n">0</span>)
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>
277-
w.node_tree.nodes[<span class="s">&quot;Background&quot;</span>].inputs[<span class="n">0</span>].default_value = (<span class="n">0.01</span>, <span class="n">0.011</span>, <span class="n">0.014</span>, <span class="n">1</span>); sc.world = w
277+
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
278278
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)
279279
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>)
280280
bpy.context.collection.objects.link(cam); sc.camera = cam
281281
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"># key, cool fill, warm rim</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">1100</span>, <span class="n">5.0</span>, (<span class="n">1.0</span>, <span class="n">0.98</span>, <span class="n">0.95</span>)),
284-
(<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">220</span>, <span class="n">7.0</span>, (<span class="n">0.85</span>, <span class="n">0.9</span>, <span class="n">1.0</span>)),
285-
(<span class="s">&quot;R&quot;</span>, (<span class="n">2.5</span>, <span class="n">6</span>, <span class="n">4</span>), <span class="n">700</span>, <span class="n">3.0</span>, (<span class="n">1.0</span>, <span class="n">0.72</span>, <span class="n">0.45</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="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>))]:
286285
ld = bpy.data.lights.new(nm, <span class="s">&#x27;AREA&#x27;</span>); ld.energy = en; ld.size = sz; ld.color = col
287286
lo = bpy.data.objects.new(nm, ld); lo.location = loc; bpy.context.collection.objects.link(lo)
288287
lc = lo.constraints.new(<span class="s">&#x27;TRACK_TO&#x27;</span>); lc.target = aim; lc.track_axis = <span class="s">&#x27;TRACK_NEGATIVE_Z&#x27;</span>; lc.up_axis = <span class="s">&#x27;UP_Y&#x27;</span>
288+
<span class="c"># warm wedge raking the back wall, aimed past the torus at the wall</span>
289+
wd = bpy.data.lights.new(<span class="s">&quot;Wedge&quot;</span>, <span class="s">&#x27;AREA&#x27;</span>); wd.energy = <span class="n">380</span>; wd.size = <span class="n">6.0</span>; wd.color = (<span class="n">1.0</span>, <span class="n">0.76</span>, <span class="n">0.5</span>)
290+
wo = bpy.data.objects.new(<span class="s">&quot;Wedge&quot;</span>, wd); wo.location = (<span class="n">2.5</span>, <span class="n">5.5</span>, <span class="n">4.0</span>)
291+
wo.rotation_euler = (math.radians(-<span class="n">68</span>), <span class="n">0</span>, math.radians(<span class="n">190</span>)); bpy.context.collection.objects.link(wo)
289292
sc.render.engine = <span class="s">&#x27;CYCLES&#x27;</span> <span class="k">if</span> engine == <span class="s">&#x27;cycles&#x27;</span> <span class="k">else</span> get_eevee_engine_id()
290293
<span class="k">if</span> sc.render.engine == <span class="s">&#x27;CYCLES&#x27;</span>:
291294
<span class="k">try</span>: sc.cycles.samples = <span class="n">32</span>
@@ -295,6 +298,8 @@ <h2>Source</h2>
295298
<span class="k">except</span> Exception: <span class="k">pass</span>
296299
sc.render.resolution_x = <span class="n">1280</span>; sc.render.resolution_y = <span class="n">720</span>
297300
sc.render.image_settings.file_format = <span class="s">&#x27;PNG&#x27;</span>; sc.render.filepath = path
301+
<span class="c"># AgX would wash the crimson toward brick (docs/VISUAL-STYLE.md)</span>
302+
sc.view_settings.view_transform = <span class="s">&#x27;Standard&#x27;</span>
298303
bpy.ops.render.render(write_still=<span class="k">True</span>)
299304
<span class="k">return</span> os.path.exists(path) <span class="k">and</span> os.path.getsize(path) &gt; <span class="n">0</span>
300305

docs/gallery/turntable/index.html

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -235,8 +235,7 @@ <h2>Source</h2>
235235
bpy.ops.wm.read_factory_settings(use_empty=<span class="k">True</span>)
236236
bpy.ops.mesh.primitive_monkey_add(location=(<span class="n">0</span>, <span class="n">0</span>, <span class="n">1.0</span>))
237237
obj = bpy.context.active_object
238-
<span class="k">for</span> p <span class="k">in</span> obj.data.polygons:
239-
p.use_smooth = <span class="k">True</span>
238+
obj.data.shade_smooth()
240239
mat = bpy.data.materials.new(<span class="s">&quot;M&quot;</span>); mat.use_nodes = <span class="k">True</span>
241240
b = mat.node_tree.nodes.get(<span class="s">&#x27;Principled BSDF&#x27;</span>)
242241
b.inputs[<span class="s">&#x27;Base Color&#x27;</span>].default_value = (<span class="n">0.85</span>, <span class="n">0.35</span>, <span class="n">0.10</span>, <span class="n">1</span>)
@@ -309,7 +308,10 @@ <h2>Source</h2>
309308
<span class="k">else</span>:
310309
<span class="k">try</span>: sc.eevee.taa_render_samples = <span class="n">16</span>
311310
<span class="k">except</span> Exception: <span class="k">pass</span>
312-
sc.frame_set(FRAMES // <span class="n">4</span>)
311+
<span class="c"># pin the still to a deliberate pose: frame 4 is ~31 degrees of turn, a</span>
312+
<span class="c"># three-quarter view where ears and brow read instantly as Suzanne. An</span>
313+
<span class="c"># arbitrary turntable frame can land face-away and read as broken geometry.</span>
314+
sc.frame_set(<span class="n">4</span>)
313315
sc.render.resolution_x = <span class="n">1280</span>; sc.render.resolution_y = <span class="n">720</span>
314316
sc.render.image_settings.file_format = <span class="s">&#x27;PNG&#x27;</span>; sc.render.filepath = path
315317
<span class="c"># AgX would wash the copper toward beige (docs/VISUAL-STYLE.md)</span>

examples/bmesh-gear/bmesh_gear.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,8 @@ def render_still(obj, path, engine):
113113
fmat = bpy.data.materials.new("Studio")
114114
fmat.use_nodes = True
115115
fb = fmat.node_tree.nodes["Principled BSDF"]
116-
fb.inputs["Base Color"].default_value = (0.055, 0.06, 0.07, 1.0)
117-
fb.inputs["Roughness"].default_value = 0.5
116+
fb.inputs["Base Color"].default_value = (0.03, 0.032, 0.037, 1.0)
117+
fb.inputs["Roughness"].default_value = 0.7
118118
floor_me.materials.append(fmat)
119119
floor = bpy.data.objects.new("Floor", floor_me)
120120
scene.collection.objects.link(floor)
@@ -126,7 +126,7 @@ def render_still(obj, path, engine):
126126
world = bpy.data.worlds.new("World")
127127
world.use_nodes = True
128128
# metals reflect the environment: keep a faint cool ambient so flanks never go black
129-
world.node_tree.nodes["Background"].inputs["Color"].default_value = (0.035, 0.04, 0.05, 1.0)
129+
world.node_tree.nodes["Background"].inputs["Color"].default_value = (0.02, 0.022, 0.028, 1.0)
130130
scene.world = world
131131

132132
def light(name, loc, energy, size, col, rot):
@@ -137,10 +137,11 @@ def light(name, loc, energy, size, col, rot):
137137
ob.rotation_euler = tuple(math.radians(a) for a in rot)
138138
scene.collection.objects.link(ob)
139139

140-
# metals live on reflections: big soft key, strong cool fill, warm rim kept low
141-
light("Key", (-3.5, -4.5, 5.5), 1400.0, 7.0, (1.0, 0.98, 0.94), (48, 0, -35))
142-
light("Fill", (5.0, -3.5, 2.5), 600.0, 9.0, (0.8, 0.87, 1.0), (65, 0, 50))
143-
light("Rim", (1.5, 4.5, 2.2), 700.0, 4.0, (1.0, 0.7, 0.4), (-82, 0, 165))
140+
# metals live on reflections: soft warm key, restrained cool fill, and the
141+
# warm wedge raking the back wall (docs/VISUAL-STYLE.md)
142+
light("Key", (-3.5, -4.5, 5.5), 700.0, 6.0, (1.0, 0.96, 0.9), (48, 0, -35))
143+
light("Fill", (5.0, -3.5, 2.5), 160.0, 9.0, (0.75, 0.85, 1.0), (65, 0, 50))
144+
light("Wedge", (2.5, 5.5, 4.0), 380.0, 6.0, (1.0, 0.76, 0.5), (-68, 0, 190))
144145

145146
cam_data = bpy.data.cameras.new("Cam")
146147
cam_data.lens = 55.0
@@ -162,6 +163,8 @@ def light(name, loc, energy, size, col, rot):
162163
scene.render.resolution_y = 720
163164
scene.render.image_settings.file_format = 'PNG'
164165
scene.render.filepath = path
166+
# AgX would flatten the steel toward chalk (docs/VISUAL-STYLE.md)
167+
scene.view_settings.view_transform = 'Standard'
165168
bpy.ops.render.render(write_still=True)
166169
return os.path.exists(path) and os.path.getsize(path) > 0
167170

examples/bmesh-gear/preview.webp

-3.19 KB
Loading

0 commit comments

Comments
 (0)