(maya) work on new render collector

This commit is contained in:
Ondrej Samohel 2019-12-17 13:28:04 +01:00
parent 68b16b55d1
commit 5b916b7d72
No known key found for this signature in database
GPG key ID: 8A29C663C672C2B7

View file

@ -1,4 +1,9 @@
import re
from maya import cmds
from maya import OpenMaya as om
import maya.app.renderSetup.model.renderSetup as renderSetup
import pyblish.api
@ -15,10 +20,99 @@ class CollectMayaRender(pyblish.api.InstancePlugin):
families = ["render"]
def process(self, instance):
layers = instance.data['setMembers']
self.log.debug('layers: {}'.format(layers))
collected_render_layers = instance.data['setMembers']
self._rs = renderSetup.instance()
maya_render_layers = {l.name(): l for l in self._rs.getRenderLayers()}
self.maya_layers = maya_render_layers
for layer in collected_render_layers:
# every layer in set should start with `LAYER_` prefix
try:
expected_layer_name = re.search(r"^LAYER_(.*)", layer).group(1)
except IndexError:
msg = ("Invalid layer name in set [ {} ]".format(layer))
self.log.warnig(msg)
continue
# check if layer is part of renderSetup
if expected_layer_name not in maya_render_layers:
msg = ("Render layer [ {} ] is not in "
"Render Setup".format(expected_layer_name))
self.log.warning(msg)
continue
# check if layer is renderable
if not maya_render_layers[expected_layer_name].isRenderable():
msg = ("Render layer [ {} ] is not "
"renderable".format(expected_layer_name))
self.log.warning(msg)
continue
for layer in layers:
# test if there are sets (subsets) to attach render to
sets = cmds.ls(layer, long=True, dag=True, sets=True)
sets = cmds.ls(expected_layer_name, long=True, dag=True, sets=True)
self.log.debug(sets)
# Get layer specific settings, might be overrides
data = {
"subset": expected_layer_name,
"setMembers": layer,
"publish": True,
"frameStart": self.get_render_attribute("startFrame",
layer=layer),
"frameEnd": self.get_render_attribute("endFrame",
layer=layer),
"byFrameStep": self.get_render_attribute("byFrameStep",
layer=layer),
"renderer": self.get_render_attribute("currentRenderer",
layer=layer),
# instance subset
"family": "Render Layers",
"families": ["renderlayer"],
"asset": asset,
"time": api.time(),
"author": context.data["user"],
# Add source to allow tracing back to the scene from
# which was submitted originally
"source": filepath
}
# Apply each user defined attribute as data
for attr in cmds.listAttr(layer, userDefined=True) or list():
try:
value = cmds.getAttr("{}.{}".format(layer, attr))
except Exception:
# Some attributes cannot be read directly,
# such as mesh and color attributes. These
# are considered non-essential to this
# particular publishing pipeline.
value = None
data[attr] = value
# Include (optional) global settings
# TODO(marcus): Take into account layer overrides
# Get global overrides and translate to Deadline values
overrides = self.parse_options(render_globals)
data.update(**overrides)
# Define nice label
label = "{0} ({1})".format(layername, data["asset"])
label += " [{0}-{1}]".format(int(data["frameStart"]),
int(data["frameEnd"]))
instance = context.create_instance(layername)
instance.data["label"] = label
instance.data.update(data)
pass
def get_attributes(self, layer, attribute):
pass
def _get_overrides(self, layer):
rset = self.maya_layers[layer].renderSettingsCollectionInstance()
return rset.getOverrides()