Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified docs/gallery/assets/bmesh-gear-hero.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/gallery/assets/depsgraph-export-hero.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/gallery/assets/gn-sdf-remesh-hero.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/gallery/assets/turntable-hero.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
17 changes: 10 additions & 7 deletions docs/gallery/bmesh-gear/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -315,8 +315,8 @@ <h2>Source</h2>
fmat = bpy.data.materials.new(<span class="s">&quot;Studio&quot;</span>)
fmat.use_nodes = <span class="k">True</span>
fb = fmat.node_tree.nodes[<span class="s">&quot;Principled BSDF&quot;</span>]
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>)
fb.inputs[<span class="s">&quot;Roughness&quot;</span>].default_value = <span class="n">0.5</span>
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>)
fb.inputs[<span class="s">&quot;Roughness&quot;</span>].default_value = <span class="n">0.7</span>
floor_me.materials.append(fmat)
floor = bpy.data.objects.new(<span class="s">&quot;Floor&quot;</span>, floor_me)
scene.collection.objects.link(floor)
Expand All @@ -328,7 +328,7 @@ <h2>Source</h2>
world = bpy.data.worlds.new(<span class="s">&quot;World&quot;</span>)
world.use_nodes = <span class="k">True</span>
<span class="c"># metals reflect the environment: keep a faint cool ambient so flanks never go black</span>
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>)
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>)
scene.world = world

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

<span class="c"># metals live on reflections: big soft key, strong cool fill, warm rim kept low</span>
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>))
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>))
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>))
<span class="c"># metals live on reflections: soft warm key, restrained cool fill, and the</span>
<span class="c"># warm wedge raking the back wall (docs/VISUAL-STYLE.md)</span>
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>))
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>))
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>))

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

Expand Down
8 changes: 4 additions & 4 deletions docs/gallery/depsgraph-export/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,7 @@ <h2>Source</h2>
base_obj = bpy.data.objects.new(<span class="s">&quot;Base&quot;</span>, obj.data.copy())
base_obj.location = (-<span class="n">1.7</span>, <span class="n">0.0</span>, <span class="n">1.0</span>)
base_obj.data.materials.append(
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>))
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>))
bpy.context.collection.objects.link(base_obj)

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

cam_data = bpy.data.cameras.new(<span class="s">&quot;Cam&quot;</span>)
cam_data.lens = <span class="n">42.0</span>
cam_data.lens = <span class="n">46.0</span>
cam = bpy.data.objects.new(<span class="s">&quot;Cam&quot;</span>, cam_data)
cam.location = (<span class="n">0.0</span>, -<span class="n">9.0</span>, <span class="n">3.1</span>)
cam.rotation_euler = (math.radians(<span class="n">76</span>), <span class="n">0.0</span>, <span class="n">0.0</span>)
cam.location = (<span class="n">0.0</span>, -<span class="n">8.2</span>, <span class="n">2.7</span>)
cam.rotation_euler = (math.radians(<span class="n">78</span>), <span class="n">0.0</span>, <span class="n">0.0</span>)
scene.collection.objects.link(cam)
scene.camera = cam

Expand Down
21 changes: 13 additions & 8 deletions docs/gallery/gn-sdf-remesh/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ <h2>Source</h2>
blender --background --python gn_sdf_remesh.py -- --output r.png # also render the result
blender --background --python gn_sdf_remesh.py -- --output r.png --engine cycles # GPU-less
&quot;&quot;&quot;</span>
<span class="k">import</span> bpy, sys, os, argparse
<span class="k">import</span> bpy, sys, os, math, argparse

<span class="k">def</span> get_eevee_engine_id():
<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>
Expand Down Expand Up @@ -267,25 +267,28 @@ <h2>Source</h2>
bm.free()
fmat = bpy.data.materials.new(<span class="s">&quot;Studio&quot;</span>); fmat.use_nodes = <span class="k">True</span>
fb = fmat.node_tree.nodes.get(<span class="s">&#x27;Principled BSDF&#x27;</span>)
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>
fb.inputs[<span class="s">&#x27;Roughness&#x27;</span>].default_value = <span class="n">0.55</span>
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>
fb.inputs[<span class="s">&#x27;Roughness&#x27;</span>].default_value = <span class="n">0.7</span>
fme.materials.append(fmat)
floor = bpy.data.objects.new(<span class="s">&quot;Floor&quot;</span>, fme); bpy.context.collection.objects.link(floor)
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>)
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)
w = bpy.data.worlds.new(<span class="s">&quot;W&quot;</span>); w.use_nodes = <span class="k">True</span>
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
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
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)
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>)
bpy.context.collection.objects.link(cam); sc.camera = cam
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>
<span class="c"># key, cool fill, warm rim</span>
<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>)),
(<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>)),
(<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>))]:
<span class="c"># shaped warm key, faint cool fill (docs/VISUAL-STYLE.md)</span>
<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>)),
(<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>))]:
ld = bpy.data.lights.new(nm, <span class="s">&#x27;AREA&#x27;</span>); ld.energy = en; ld.size = sz; ld.color = col
lo = bpy.data.objects.new(nm, ld); lo.location = loc; bpy.context.collection.objects.link(lo)
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>
<span class="c"># warm wedge raking the back wall, aimed past the torus at the wall</span>
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>)
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>)
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)
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()
<span class="k">if</span> sc.render.engine == <span class="s">&#x27;CYCLES&#x27;</span>:
<span class="k">try</span>: sc.cycles.samples = <span class="n">32</span>
Expand All @@ -295,6 +298,8 @@ <h2>Source</h2>
<span class="k">except</span> Exception: <span class="k">pass</span>
sc.render.resolution_x = <span class="n">1280</span>; sc.render.resolution_y = <span class="n">720</span>
sc.render.image_settings.file_format = <span class="s">&#x27;PNG&#x27;</span>; sc.render.filepath = path
<span class="c"># AgX would wash the crimson toward brick (docs/VISUAL-STYLE.md)</span>
sc.view_settings.view_transform = <span class="s">&#x27;Standard&#x27;</span>
bpy.ops.render.render(write_still=<span class="k">True</span>)
<span class="k">return</span> os.path.exists(path) <span class="k">and</span> os.path.getsize(path) &gt; <span class="n">0</span>

Expand Down
8 changes: 5 additions & 3 deletions docs/gallery/turntable/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -235,8 +235,7 @@ <h2>Source</h2>
bpy.ops.wm.read_factory_settings(use_empty=<span class="k">True</span>)
bpy.ops.mesh.primitive_monkey_add(location=(<span class="n">0</span>, <span class="n">0</span>, <span class="n">1.0</span>))
obj = bpy.context.active_object
<span class="k">for</span> p <span class="k">in</span> obj.data.polygons:
p.use_smooth = <span class="k">True</span>
obj.data.shade_smooth()
mat = bpy.data.materials.new(<span class="s">&quot;M&quot;</span>); mat.use_nodes = <span class="k">True</span>
b = mat.node_tree.nodes.get(<span class="s">&#x27;Principled BSDF&#x27;</span>)
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>)
Expand Down Expand Up @@ -309,7 +308,10 @@ <h2>Source</h2>
<span class="k">else</span>:
<span class="k">try</span>: sc.eevee.taa_render_samples = <span class="n">16</span>
<span class="k">except</span> Exception: <span class="k">pass</span>
sc.frame_set(FRAMES // <span class="n">4</span>)
<span class="c"># pin the still to a deliberate pose: frame 4 is ~31 degrees of turn, a</span>
<span class="c"># three-quarter view where ears and brow read instantly as Suzanne. An</span>
<span class="c"># arbitrary turntable frame can land face-away and read as broken geometry.</span>
sc.frame_set(<span class="n">4</span>)
sc.render.resolution_x = <span class="n">1280</span>; sc.render.resolution_y = <span class="n">720</span>
sc.render.image_settings.file_format = <span class="s">&#x27;PNG&#x27;</span>; sc.render.filepath = path
<span class="c"># AgX would wash the copper toward beige (docs/VISUAL-STYLE.md)</span>
Expand Down
17 changes: 10 additions & 7 deletions examples/bmesh-gear/bmesh_gear.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,8 +113,8 @@ def render_still(obj, path, engine):
fmat = bpy.data.materials.new("Studio")
fmat.use_nodes = True
fb = fmat.node_tree.nodes["Principled BSDF"]
fb.inputs["Base Color"].default_value = (0.055, 0.06, 0.07, 1.0)
fb.inputs["Roughness"].default_value = 0.5
fb.inputs["Base Color"].default_value = (0.03, 0.032, 0.037, 1.0)
fb.inputs["Roughness"].default_value = 0.7
floor_me.materials.append(fmat)
floor = bpy.data.objects.new("Floor", floor_me)
scene.collection.objects.link(floor)
Expand All @@ -126,7 +126,7 @@ def render_still(obj, path, engine):
world = bpy.data.worlds.new("World")
world.use_nodes = True
# metals reflect the environment: keep a faint cool ambient so flanks never go black
world.node_tree.nodes["Background"].inputs["Color"].default_value = (0.035, 0.04, 0.05, 1.0)
world.node_tree.nodes["Background"].inputs["Color"].default_value = (0.02, 0.022, 0.028, 1.0)
scene.world = world

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

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

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

Expand Down
Binary file modified examples/bmesh-gear/preview.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 4 additions & 4 deletions examples/depsgraph-export/depsgraph_export.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ def render_still(obj, path, engine):
base_obj = bpy.data.objects.new("Base", obj.data.copy())
base_obj.location = (-1.7, 0.0, 1.0)
base_obj.data.materials.append(
principled("Graphite", (0.16, 0.17, 0.19, 1.0), 0.0, 0.7))
principled("Graphite", (0.09, 0.10, 0.12, 1.0), 0.0, 0.55))
bpy.context.collection.objects.link(base_obj)

# right: the SUBSURF object — what the depsgraph evaluates and the OBJ ships.
Expand Down Expand Up @@ -140,10 +140,10 @@ def light(name, loc, energy, size, col, rot):
light("Wedge", (2.5, 5.5, 4.0), 380.0, 6.0, (1.0, 0.76, 0.5), (-68, 0, 190))

cam_data = bpy.data.cameras.new("Cam")
cam_data.lens = 42.0
cam_data.lens = 46.0
cam = bpy.data.objects.new("Cam", cam_data)
cam.location = (0.0, -9.0, 3.1)
cam.rotation_euler = (math.radians(76), 0.0, 0.0)
cam.location = (0.0, -8.2, 2.7)
cam.rotation_euler = (math.radians(78), 0.0, 0.0)
scene.collection.objects.link(cam)
scene.camera = cam

Expand Down
Binary file modified examples/depsgraph-export/preview.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading