expre-gen/blender/3.4/scripts/addons/amaranth/render/samples_scene.py
2025-10-17 09:47:23 +08:00

135 lines
4.4 KiB
Python

# SPDX-License-Identifier: GPL-2.0-or-later
"""
Cycles: Samples per Scene
When working in production, it's often more convenient to do lighting and
compositing in different scenes (so you can later append the comp scene
to bring together nodes, settings, lamps, RenderLayers).
This would lead to work with more than one scene. When doing render tests
you want to know at a glance how many samples the other scenes have,
without manually switching. This is the idea behind the feature.
Find it on the Sampling panel, on Render properties.
Developed during Caminandes Open Movie Project
"""
import bpy
from amaranth import utils
from bpy.props import (
BoolProperty,
IntProperty,
)
def render_cycles_scene_samples(self, context):
layout = self.layout
scene = context.scene
render = scene.render
if utils.cycles_exists():
cscene = scene.cycles
list_sampling = scene.amaranth_cycles_list_sampling
# List Samples
#if (len(scene.render.layers) > 1) or (len(bpy.data.scenes) > 1):
if (len(scene.render.views) > 1) or (len(bpy.data.scenes) > 1):
box = layout.box()
row = box.row(align=True)
col = row.column(align=True)
row = col.row(align=True)
row.alignment = "LEFT"
row.prop(scene, "amaranth_cycles_list_sampling",
icon="%s" % "TRIA_DOWN" if list_sampling else "TRIA_RIGHT",
emboss=False)
if list_sampling:
#if len(scene.render.layers) == 1 and render.layers[0].samples == 0:
if len(scene.render.views) == 1 and render.view_layers[0].samples == 0:
pass
else:
col.separator()
#col.label(text="RenderLayers:", icon="RENDERLAYERS")
col.label(text="View Layers:", icon="RENDERLAYERS")
#for rl in scene.render.layers:
for rl in scene.view_layers:
row = col.row(align=True)
row.label(text=rl.name, icon="BLANK1")
row.prop(
rl, "samples", text="%s" %
"Samples" if rl.samples > 0 else "Automatic (%s)" %
cscene.samples)
if (len(bpy.data.scenes) > 1):
col.separator()
col.label(text="Scenes:", icon="SCENE_DATA")
if utils.cycles_exists():
for s in bpy.data.scenes:
if s != scene:
row = col.row(align=True)
if s.render.engine == "CYCLES":
cscene = s.cycles
#row.label(s.name)
row.label(text=s.name)
row.prop(cscene, "samples", icon="BLANK1")
else:
row.label(
text="Scene: '%s' is not using Cycles" %
s.name)
else:
for s in bpy.data.scenes:
if s != scene:
row = col.row(align=True)
if s.render.engine == "CYCLES":
cscene = s.cycles
row.label(text=s.name, icon="BLANK1")
row.prop(cscene, "aa_samples",
text="AA Samples")
else:
row.label(
text="Scene: '%s' is not using Cycles" %
s.name)
def init():
scene = bpy.types.Scene
if utils.cycles_exists():
scene.amaranth_cycles_list_sampling = bpy.props.BoolProperty(
default=False,
name="Samples Per:")
# Note: add versioning code to address changes introduced in 2.79.1
from cycles import properties as _cycles_props
_cycles_props.CyclesRenderSettings.use_samples_final = BoolProperty(
name="Use Final Render Samples",
description="Use current shader samples as final render samples",
default=False,
)
def clear():
wm = bpy.context.window_manager
for p in ("amarath_cycles_list_sampling", "use_samples_final"):
if p in wm:
del wm[p]
def register():
init()
if utils.cycles_exists():
bpy.types.CYCLES_RENDER_PT_sampling.append(render_cycles_scene_samples)
def unregister():
if utils.cycles_exists():
bpy.types.CYCLES_RENDER_PT_sampling.remove(render_cycles_scene_samples)
clear()