Skip to content

Commit 481183e

Browse files
TMHSDigitalclaude
andcommitted
fix(examples): gate every use_nodes = True on bpy.app.version < (5, 0, 0)
5.x deprecates use_nodes on materials, worlds, lights and scenes (removal in 6.0), and creates their node trees without it. Measured on 5.2.1: use_nodes defaults to True and node_tree exists for all four; on 4.5.14 it defaults to False and node_tree is None. 532 ungated assignments in 136 scripts were teaching the deprecated call, including the bmesh-gear anatomy every new example copies. A codemod now wraps each one in 'if bpy.app.version < (5, 0, 0):', and splits the 11 one-line 'x = new(...); x.use_nodes = True' forms. tests/check_example_rules.py rejects an ungated .use_nodes = True in examples/, showcase/, templates/ and snippets/. A probe file without the gate fails it. Verified: - smoke catalog happy paths on 5.2.1: 150 PASS; - bmesh-gear, turntable and the anvil showcase rendered with --output --engine cycles on 5.2.1 and 4.5.14: exit 0, no use_nodes deprecation warnings. compositor-glare also claimed scene.use_nodes = True raises on 5.x. On 5.2.1 it only warns; scene.node_tree is what is gone. Closes #471 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
1 parent b6c34d9 commit 481183e

139 files changed

Lines changed: 1114 additions & 538 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎docs/gallery/compositor-glare/index.html‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ <h1>Compositor Glare</h1>
6161
</div>
6262
<nav class="jumpnav" aria-label="On this page"><span class="tag">jump to</span> <a href="#run">Run</a> <a href="#exit-codes">Exit codes</a> <a href="#source">Source</a> <a href="#related">Related</a></nav>
6363
<section class="detail-section md">
64-
<p>A runnable example that puts bloom where it actually lives: the compositor. Three emissive rings are rendered, then a <code>Glare</code> (Fog Glow) node fed by <code>Render Layers</code> grows the halo — wired through <code>scene.compositing_node_group</code> on Blender 5.x and through <code>scene.node_tree</code> on 4.x, because the 5.0 compositor rewrite removed the scene-level tree entirely (<code>scene.use_nodes = True</code> now raises <code>AttributeError</code>).</p>
64+
<p>A runnable example that puts bloom where it actually lives: the compositor. Three emissive rings are rendered, then a <code>Glare</code> (Fog Glow) node fed by <code>Render Layers</code> grows the halo — wired through <code>scene.compositing_node_group</code> on Blender 5.x and through <code>scene.node_tree</code> on 4.x, because the 5.0 compositor rewrite removed the scene-level tree entirely (<code>scene.node_tree</code> now raises <code>AttributeError</code>; <code>scene.use_nodes</code> survives only as a deprecated flag, removal in 6.0).</p>
6565
<p>The Glare node changed shape with it: on 4.x it takes legacy enum properties (<code>glare_type=&#x27;FOG_GLOW&#x27;</code>, <code>quality=&#x27;HIGH&#x27;</code>, <code>size=6</code>), while on 5.x the same choices are menu/float <strong>input sockets</strong> (<code>inputs[&#x27;Type&#x27;].default_value = &#x27;Fog Glow&#x27;</code>). The 4.x <code>threshold</code> property is a dead shim — the real threshold is the <code>Threshold</code> input socket on both versions. And EEVEE has no <code>use_bloom</code> toggle on either version (removed in 4.2): bloom is a compositor node, period.</p>
6666
<p><strong>What it witnesses:</strong> the halo is the compositor&#x27;s output, proven with pixels. The check renders the scene twice at 96×54 (single-sample Cycles, noise-free) — once with <code>use_compositing</code> on, once off — and samples a column of pixels above the middle ring&#x27;s silhouette via <code>world_to_camera_view</code>. With the compositor on, the halo luminance just outside the silhouette is far above zero and falls off strictly with distance (the Fog Glow kernel signature); with it off, those same pixels are exactly zero. The structural check pins the wiring (<code>Render Layers → Glare → output</code>), the version-correct tree plumbing, and the absence of any EEVEE bloom toggle.</p>
6767
<h2 id="run">Run<a class="anchor" href="#run" aria-label="Link to this section">#</a></h2>

‎examples/armature-bend/armature_bend.py‎

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,8 @@ def render_still(rigs, path, engine):
252252

253253
def principled(name, base, rough, metal=0.0, noise=None):
254254
m = bpy.data.materials.new(name)
255-
m.use_nodes = True
255+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
256+
m.use_nodes = True
256257
b = m.node_tree.nodes["Principled BSDF"]
257258
b.inputs["Base Color"].default_value = (*base, 1.0)
258259
b.inputs["Roughness"].default_value = rough
@@ -276,7 +277,8 @@ def principled(name, base, rough, metal=0.0, noise=None):
276277
# the hose: bone tint on the rib crests, dark rubber down in the valleys,
277278
# so the weight bands the LBS check asserts still read as colour
278279
hose = bpy.data.materials.new("WeightBands")
279-
hose.use_nodes = True
280+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
281+
hose.use_nodes = True
280282
nt = hose.node_tree
281283
bsdf = nt.nodes["Principled BSDF"]
282284
tint = nt.nodes.new("ShaderNodeAttribute")
@@ -361,7 +363,8 @@ def flange(x):
361363
finally:
362364
bm.free()
363365
fmat = bpy.data.materials.new("Studio")
364-
fmat.use_nodes = True
366+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
367+
fmat.use_nodes = True
365368
fb = fmat.node_tree.nodes["Principled BSDF"]
366369
fb.inputs["Base Color"].default_value = (0.03, 0.032, 0.037, 1.0)
367370
fb.inputs["Roughness"].default_value = 0.7
@@ -374,7 +377,8 @@ def flange(x):
374377
scene.collection.objects.link(wall)
375378

376379
world = bpy.data.worlds.new("World")
377-
world.use_nodes = True
380+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
381+
world.use_nodes = True
378382
world.node_tree.nodes["Background"].inputs["Color"].default_value = (0.02, 0.021, 0.025, 1.0)
379383
scene.world = world
380384

‎examples/attribute-domain-shear/attribute_domain_shear.py‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,8 @@ def make_attr_material(name, attr_name):
192192
"""Canopy fabric: base color read straight from the color attribute.
193193
Fully matte (flat color data carries no specular line, VISUAL-STYLE)."""
194194
mat = bpy.data.materials.new(name)
195-
mat.use_nodes = True
195+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
196+
mat.use_nodes = True
196197
nt = mat.node_tree
197198
bsdf = nt.nodes["Principled BSDF"]
198199
spec = bsdf.inputs.get("Specular IOR Level")
@@ -208,7 +209,8 @@ def make_attr_material(name, attr_name):
208209

209210
def make_material(name, rgb, rough=0.45, metallic=0.35):
210211
mat = bpy.data.materials.new(name)
211-
mat.use_nodes = True
212+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
213+
mat.use_nodes = True
212214
b = mat.node_tree.nodes["Principled BSDF"]
213215
b.inputs["Base Color"].default_value = (*rgb, 1.0)
214216
b.inputs["Roughness"].default_value = rough
@@ -552,7 +554,8 @@ def build_studio(sc):
552554
sc.collection.objects.link(wall)
553555

554556
world = bpy.data.worlds.new("World")
555-
world.use_nodes = True
557+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
558+
world.use_nodes = True
556559
world.node_tree.nodes["Background"].inputs["Color"].default_value = (
557560
0.02, 0.021, 0.025, 1.0,
558561
)

‎examples/bake-normal-high-to-low/bake_normal_high_to_low.py‎

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,8 @@ def setup_bake_target(obj, name, size=BAKE_RES):
157157
img = bpy.data.images.new(name, size, size, alpha=True, float_buffer=False)
158158
img.colorspace_settings.name = "Non-Color"
159159
mat = bpy.data.materials.new(name + "Mat")
160-
mat.use_nodes = True
160+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
161+
mat.use_nodes = True
161162
nodes = mat.node_tree.nodes
162163
tex = nodes.new("ShaderNodeTexImage")
163164
tex.image = img
@@ -388,7 +389,8 @@ def make_map_card(image, name="BakeCard"):
388389
finally:
389390
bm.free()
390391
mat = bpy.data.materials.new(name + "Mat")
391-
mat.use_nodes = True
392+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
393+
mat.use_nodes = True
392394
nodes = mat.node_tree.nodes
393395
links = mat.node_tree.links
394396
nodes.clear()
@@ -446,7 +448,8 @@ def seat_on_plinth(ob, name):
446448
finally:
447449
bm.free()
448450
pmat = bpy.data.materials.new(name + "Mat")
449-
pmat.use_nodes = True
451+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
452+
pmat.use_nodes = True
450453
paint_principled(pmat, (0.045, 0.042, 0.04, 1.0), 0.0, 0.55)
451454
slab.materials.append(pmat)
452455
plinth = bpy.data.objects.new(name, slab)
@@ -462,7 +465,8 @@ def make_label(text, loc, name):
462465
cu.align_x, cu.align_y = "CENTER", "CENTER"
463466
cu.extrude = 0.004
464467
lm = bpy.data.materials.new(name + "Mat")
465-
lm.use_nodes = True
468+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
469+
lm.use_nodes = True
466470
b = paint_principled(lm, (0.62, 0.60, 0.56, 1.0), 0.0, 0.5)
467471
b.inputs["Emission Color"].default_value = (0.9, 0.86, 0.78, 1.0)
468472
b.inputs["Emission Strength"].default_value = 0.35
@@ -490,11 +494,13 @@ def render_still(high, low, mat, tex, path, engine):
490494
# The solidify rim is the plate's edge, not baked surface: give it plain
491495
# bronze. Wearing the map, it sampled the UV border and rendered ragged.
492496
rim = bpy.data.materials.new("BronzeRim")
493-
rim.use_nodes = True
497+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
498+
rim.use_nodes = True
494499
bronze(rim)
495500
low.data.materials.append(rim)
496501
src = bpy.data.materials.new("BronzeSource")
497-
src.use_nodes = True
502+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
503+
src.use_nodes = True
498504
bronze(src)
499505
high.data.materials.clear()
500506
high.data.materials.append(src)
@@ -522,7 +528,8 @@ def render_still(high, low, mat, tex, path, engine):
522528
finally:
523529
bm.free()
524530
fmat = bpy.data.materials.new("Floor")
525-
fmat.use_nodes = True
531+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
532+
fmat.use_nodes = True
526533
fb = fmat.node_tree.nodes["Principled BSDF"]
527534
fb.inputs["Base Color"].default_value = (0.03, 0.032, 0.037, 1.0)
528535
fb.inputs["Roughness"].default_value = 0.7
@@ -535,7 +542,8 @@ def render_still(high, low, mat, tex, path, engine):
535542
scene.collection.objects.link(wall)
536543

537544
world = bpy.data.worlds.new("World")
538-
world.use_nodes = True
545+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
546+
world.use_nodes = True
539547
world.node_tree.nodes["Background"].inputs["Color"].default_value = (
540548
0.02,
541549
0.021,

‎examples/bmesh-gear/bmesh_gear.py‎

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ def machined_brass():
119119
the geometry wherever the gear is posed.
120120
"""
121121
mat = bpy.data.materials.new("MachinedBrass")
122-
mat.use_nodes = True
122+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
123+
mat.use_nodes = True
123124
nt = mat.node_tree
124125
nodes, links = nt.nodes, nt.links
125126
bsdf = nodes["Principled BSDF"]
@@ -244,7 +245,8 @@ def box(bm, lo, hi):
244245

245246
def principled(name, base, rough, metal=0.0, noise=None, coat=0.0):
246247
mat = bpy.data.materials.new(name)
247-
mat.use_nodes = True
248+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
249+
mat.use_nodes = True
248250
nt = mat.node_tree
249251
b = nt.nodes["Principled BSDF"]
250252
b.inputs["Base Color"].default_value = (*base, 1.0)
@@ -434,7 +436,8 @@ def plinth(bm):
434436
finally:
435437
bm.free()
436438
fmat = bpy.data.materials.new("Studio")
437-
fmat.use_nodes = True
439+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
440+
fmat.use_nodes = True
438441
fb = fmat.node_tree.nodes["Principled BSDF"]
439442
fb.inputs["Base Color"].default_value = (0.03, 0.032, 0.037, 1.0)
440443
fb.inputs["Roughness"].default_value = 0.7
@@ -447,7 +450,8 @@ def plinth(bm):
447450
scene.collection.objects.link(wall)
448451

449452
world = bpy.data.worlds.new("World")
450-
world.use_nodes = True
453+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
454+
world.use_nodes = True
451455
# metals reflect the environment: keep a faint cool ambient so flanks never go black
452456
world.node_tree.nodes["Background"].inputs["Color"].default_value = (0.02, 0.022, 0.028, 1.0)
453457
scene.world = world

‎examples/boolean-exact-volume/boolean_exact_volume.py‎

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,8 @@ def principled(name, base, rough, metal=0.0, coat=0.0, coat_rough=0.1, rough_var
191191
"""A designed Principled material. *rough_var* adds a low-frequency
192192
roughness drift (no fine noise: on metal that reads as glitter)."""
193193
mat = bpy.data.materials.new(name)
194-
mat.use_nodes = True
194+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
195+
mat.use_nodes = True
195196
nt = mat.node_tree
196197
b = nt.nodes["Principled BSDF"]
197198
b.inputs["Base Color"].default_value = (*base, 1.0)
@@ -215,7 +216,8 @@ def principled(name, base, rough, metal=0.0, coat=0.0, coat_rough=0.1, rough_var
215216
def ghost_glass(name, tint):
216217
"""Frosted, faintly tinted glass for an operand volume the result lost."""
217218
mat = bpy.data.materials.new(name)
218-
mat.use_nodes = True
219+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
220+
mat.use_nodes = True
219221
b = mat.node_tree.nodes["Principled BSDF"]
220222
b.inputs["Base Color"].default_value = (*tint, 1.0)
221223
b.inputs["Roughness"].default_value = 0.22
@@ -229,7 +231,8 @@ def walnut_material():
229231
bands mixed between two walnut tones, a soft blotch layer, a light bump,
230232
and a satin coat that does not mirror the scene."""
231233
mat = bpy.data.materials.new("Walnut")
232-
mat.use_nodes = True
234+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
235+
mat.use_nodes = True
233236
nt = mat.node_tree
234237
b = nt.nodes["Principled BSDF"]
235238
coord = nt.nodes.new("ShaderNodeTexCoord")
@@ -420,7 +423,8 @@ def add(name, me, mat, mw=None):
420423
finally:
421424
bm.free()
422425
fmat = bpy.data.materials.new("Studio")
423-
fmat.use_nodes = True
426+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
427+
fmat.use_nodes = True
424428
fb = fmat.node_tree.nodes["Principled BSDF"]
425429
fb.inputs["Base Color"].default_value = (0.03, 0.032, 0.037, 1.0)
426430
fb.inputs["Roughness"].default_value = 0.7
@@ -434,7 +438,8 @@ def add(name, me, mat, mw=None):
434438
scene.collection.objects.link(wall)
435439

436440
world = bpy.data.worlds.new("World")
437-
world.use_nodes = True
441+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
442+
world.use_nodes = True
438443
world.node_tree.nodes["Background"].inputs["Color"].default_value = (0.02, 0.021, 0.025, 1.0)
439444
scene.world = world
440445

‎examples/car-mirror-symmetry/car_mirror_symmetry.py‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -592,7 +592,8 @@ def eevee_engine_id():
592592
def _finish_materials():
593593
def principled(name):
594594
m = bpy.data.materials[name]
595-
m.use_nodes = True
595+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
596+
m.use_nodes = True
596597
return m.node_tree.nodes["Principled BSDF"]
597598
p = principled("Paint")
598599
# candy red over a faint metallic base, under a glassy clear coat: the coat
@@ -774,7 +775,8 @@ def render_still(objs, path, engine):
774775
finally:
775776
bm.free()
776777
fmat = bpy.data.materials.new("Studio")
777-
fmat.use_nodes = True
778+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
779+
fmat.use_nodes = True
778780
fb = fmat.node_tree.nodes["Principled BSDF"]
779781
fb.inputs["Base Color"].default_value = (0.03, 0.032, 0.037, 1.0)
780782
fb.inputs["Roughness"].default_value = 0.7
@@ -787,7 +789,8 @@ def render_still(objs, path, engine):
787789
scene.collection.objects.link(wall)
788790

789791
world = bpy.data.worlds.new("World")
790-
world.use_nodes = True
792+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
793+
world.use_nodes = True
791794
world.node_tree.nodes["Background"].inputs["Color"].default_value = (0.02, 0.021, 0.025, 1.0)
792795
scene.world = world
793796

‎examples/collision-hull-proxy/collision_hull_proxy.py‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,8 @@ def lathe_object(name, profile, segments, inflate=1.0):
197197

198198
def make_material(name, color, metallic, roughness):
199199
mat = bpy.data.materials.new(name)
200-
mat.use_nodes = True
200+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
201+
mat.use_nodes = True
201202
bsdf = mat.node_tree.nodes["Principled BSDF"]
202203
bsdf.inputs["Base Color"].default_value = (*color, 1.0)
203204
bsdf.inputs["Metallic"].default_value = metallic
@@ -393,7 +394,8 @@ def render_still(groups, pieces, path, engine):
393394
# translucent shell: Transparent mixed over Principled works identically
394395
# in EEVEE and Cycles without touching blend-method RNA (renamed in 4.2)
395396
shell = bpy.data.materials.new("HullShell")
396-
shell.use_nodes = True
397+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
398+
shell.use_nodes = True
397399
nt = shell.node_tree
398400
nt.nodes.clear()
399401
out = nt.nodes.new("ShaderNodeOutputMaterial")
@@ -440,7 +442,8 @@ def render_still(groups, pieces, path, engine):
440442
scene.collection.objects.link(wall)
441443

442444
world = bpy.data.worlds.new("World")
443-
world.use_nodes = True
445+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
446+
world.use_nodes = True
444447
world.node_tree.nodes["Background"].inputs["Color"].default_value = (0.02, 0.021, 0.025, 1.0)
445448
scene.world = world
446449

‎examples/color-attribute-wheel/color_attribute_wheel.py‎

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,8 @@ def eevee_engine_id():
165165

166166
def build_material():
167167
mat = bpy.data.materials.new("Wheel")
168-
mat.use_nodes = True
168+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
169+
mat.use_nodes = True
169170
nt = mat.node_tree
170171
bsdf = nt.nodes["Principled BSDF"]
171172
attr_node = nt.nodes.new('ShaderNodeAttribute')
@@ -228,7 +229,8 @@ def _beam(bm, p0, p1, w, d):
228229

229230
def _mat(name, base, rough, metal=0.0, noise=None, coat=0.0):
230231
m = bpy.data.materials.new(name)
231-
m.use_nodes = True
232+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
233+
m.use_nodes = True
232234
nt = m.node_tree
233235
b = nt.nodes["Principled BSDF"]
234236
b.inputs["Base Color"].default_value = (*base, 1.0)
@@ -357,7 +359,8 @@ def plane_y(z):
357359
finally:
358360
bm.free()
359361
fmat = bpy.data.materials.new("Studio")
360-
fmat.use_nodes = True
362+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
363+
fmat.use_nodes = True
361364
fb = fmat.node_tree.nodes["Principled BSDF"]
362365
fb.inputs["Base Color"].default_value = (0.03, 0.032, 0.037, 1.0)
363366
fb.inputs["Roughness"].default_value = 0.7
@@ -370,7 +373,8 @@ def plane_y(z):
370373
scene.collection.objects.link(wall)
371374

372375
world = bpy.data.worlds.new("World")
373-
world.use_nodes = True
376+
if bpy.app.version < (5, 0, 0): # use_nodes is deprecated on 5.x (removed in 6.0)
377+
world.use_nodes = True
374378
world.node_tree.nodes["Background"].inputs["Color"].default_value = (0.02, 0.021, 0.025, 1.0)
375379
scene.world = world
376380

‎examples/compositor-glare/README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ A runnable example that puts bloom where it actually lives: the compositor. Thre
44
emissive rings are rendered, then a `Glare` (Fog Glow) node fed by `Render Layers`
55
grows the halo — wired through `scene.compositing_node_group` on Blender 5.x and
66
through `scene.node_tree` on 4.x, because the 5.0 compositor rewrite removed the
7-
scene-level tree entirely (`scene.use_nodes = True` now raises `AttributeError`).
7+
scene-level tree entirely (`scene.node_tree` now raises `AttributeError`; `scene.use_nodes` survives only as a deprecated flag, removal in 6.0).
88

99
The Glare node changed shape with it: on 4.x it takes legacy enum properties
1010
(`glare_type='FOG_GLOW'`, `quality='HIGH'`, `size=6`), while on 5.x the same

0 commit comments

Comments
 (0)