Bases: MayaInstancePlugin
Collect all render layer's AOVs / Render Elements that will render.
This collector is important to be able to Extend Frames.
Technical information: Each renderer uses different logic to work with render passes. VRay - RenderElement Simple node connection to the actual renderLayer node
Arnold - AOV
Uses its own render settings node and connects an aiOAV to it
Redshift - AOV
Uses its own render settings node and RedshiftAOV node. It is not connected but all AOVs are enabled for all render layers by default.
Source code in client/ayon_maya/plugins/publish/collect_render_layer_aovs.py
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95 | class CollectRenderLayerAOVS(plugin.MayaInstancePlugin):
"""Collect all render layer's AOVs / Render Elements that will render.
This collector is important to be able to Extend Frames.
Technical information:
Each renderer uses different logic to work with render passes.
VRay - RenderElement
Simple node connection to the actual renderLayer node
Arnold - AOV:
Uses its own render settings node and connects an aiOAV to it
Redshift - AOV:
Uses its own render settings node and RedshiftAOV node. It is not
connected but all AOVs are enabled for all render layers by default.
"""
order = pyblish.api.CollectorOrder + 0.02
label = "Render Elements / AOVs"
families = ["renderlayer"]
def process(self, instance):
# Check if Extend Frames is toggled
if not instance.data("extendFrames", False):
return
# Get renderer
renderer = instance.data["renderer"]
self.log.debug("Renderer found: {}".format(renderer))
rp_node_types = {"vray": ["VRayRenderElement", "VRayRenderElementSet"],
"arnold": ["aiAOV"],
"redshift": ["RedshiftAOV"]}
if renderer not in rp_node_types.keys():
self.log.error("Unsupported renderer found: '{}'".format(renderer))
return
result = []
# Collect all AOVs / Render Elements
layer = instance.data["renderlayer"]
node_type = rp_node_types[renderer]
render_elements = cmds.ls(type=node_type)
# Check if AOVs / Render Elements are enabled
for element in render_elements:
enabled = lib.get_attr_in_layer("{}.enabled".format(element),
layer=layer)
if not enabled:
continue
pass_name = self.get_pass_name(renderer, element)
render_pass = "%s.%s" % (instance.data["productName"], pass_name)
result.append(render_pass)
self.log.debug("Found {} render elements / AOVs for "
"'{}'".format(len(result), instance.data["productName"]))
instance.data["renderPasses"] = result
def get_pass_name(self, renderer, node):
if renderer == "vray":
# Get render element pass type
vray_node_attr = next(attr for attr in cmds.listAttr(node)
if attr.startswith("vray_name"))
pass_type = vray_node_attr.rsplit("_", 1)[-1]
# Support V-Ray extratex explicit name (if set by user)
if pass_type == "extratex":
explicit_attr = "{}.vray_explicit_name_extratex".format(node)
explicit_name = cmds.getAttr(explicit_attr)
if explicit_name:
return explicit_name
# Node type is in the attribute name but we need to check if value
# of the attribute as it can be changed
return cmds.getAttr("{}.{}".format(node, vray_node_attr))
elif renderer in ["arnold", "redshift"]:
return cmds.getAttr("{}.name".format(node))
else:
raise RuntimeError("Unsupported renderer: '{}'".format(renderer))
|