From 932ae63de301c3ab034e0167c26418d9627362eb Mon Sep 17 00:00:00 2001 From: aardschok Date: Tue, 15 Aug 2017 14:19:58 +0200 Subject: [PATCH] added collectors for rendering --- .../maya/publish/collect_maya_workspace.py | 30 ++++++ .../maya/publish/collect_renderlayers.py | 101 ++++++++++++++++++ 2 files changed, 131 insertions(+) create mode 100644 colorbleed/plugins/maya/publish/collect_maya_workspace.py create mode 100644 colorbleed/plugins/maya/publish/collect_renderlayers.py diff --git a/colorbleed/plugins/maya/publish/collect_maya_workspace.py b/colorbleed/plugins/maya/publish/collect_maya_workspace.py new file mode 100644 index 0000000000..3feff69362 --- /dev/null +++ b/colorbleed/plugins/maya/publish/collect_maya_workspace.py @@ -0,0 +1,30 @@ +import os + +import pyblish.api + +from maya import cmds + + +class CollectMayaWorkspace(pyblish.api.ContextPlugin): + """Inject the current workspace into context""" + + order = pyblish.api.CollectorOrder - 0.5 + label = "Maya Workspace" + + hosts = ['maya'] + version = (0, 1, 0) + + def process(self, context): + workspace = cmds.workspace(rootDirectory=True, query=True) + if not workspace: + # Project has not been set. Files will + # instead end up next to the working file. + workspace = cmds.workspace(dir=True, query=True) + + # Maya returns forward-slashes by default + normalised = os.path.normpath(workspace) + + context.set_data('workspaceDir', value=normalised) + + # For backwards compatibility + context.set_data('workspace_dir', value=normalised) diff --git a/colorbleed/plugins/maya/publish/collect_renderlayers.py b/colorbleed/plugins/maya/publish/collect_renderlayers.py new file mode 100644 index 0000000000..58340736f8 --- /dev/null +++ b/colorbleed/plugins/maya/publish/collect_renderlayers.py @@ -0,0 +1,101 @@ +import os +from maya import cmds + +import pyblish.api + +from avalon import maya, api + +class CollectMindbenderMayaRenderlayers(pyblish.api.ContextPlugin): + """Gather instances by active render layers""" + + order = pyblish.api.CollectorOrder + hosts = ["maya"] + label = "Render Layers" + + def process(self, context): + + registered_root = api.registered_root() + asset_name = os.environ["AVALON_ASSET"] + + current_file = context.data["currentFile"] + relative_file = current_file.replace(registered_root, "{root}") + source_file = relative_file.replace("\\", "/") + + renderlayers = cmds.ls(type="renderLayer") + for layer in renderlayers: + if layer.endswith("defaultRenderLayer"): + continue + + data = {"family": "Render Layers", + "families": ["colorbleed.renderlayer"], + "publish": cmds.getAttr("{}.renderable".format(layer)), + + "startFrame": self.get_render_attribute("startFrame"), + "endFrame": self.get_render_attribute("endFrame"), + "byFrameStep": self.get_render_attribute("byFrameStep"), + "renderer": self.get_render_attribute("currentRenderer"), + + # instance subset + "asset": asset_name, + "subset": layer, + "setMembers": layer, + + # "time": context.data["time"], + "author": context.data["user"], + "source": source_file} + + # 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 + try: + avalon_globals = maya.lsattr("id", "avalon.renderglobals")[0] + except IndexError: + pass + else: + _globals = maya.read(avalon_globals) + data["renderGlobals"] = self.get_global_overrides(_globals) + + instance = context.create_instance(layer) + instance.data.update(data) + + def get_render_attribute(self, attr): + return cmds.getAttr("defaultRenderGlobals.{}".format(attr)) + + def get_global_overrides(self, globals): + """ + Get all overrides with a value, skip those without + + Here's the kicker. These globals override defaults in the submission + integrator, but an empty value means no overriding is made. + Otherwise, Frames would override the default frames set under globals. + + Args: + globals (dict) collection of render globals + + Returns: + dict: only overrides with values + """ + keys = ["pool", "group", "frames", "priority"] + read_globals = {} + for key in keys: + value = globals[key] + if not value: + continue + read_globals[key.capitalize()] = value + + if not read_globals: + self.log.info("Submitting without overrides") + + return read_globals \ No newline at end of file