OP-6037 - first iteration of Maya to RR

Uses generic logic, probably needs fine tuning.
This commit is contained in:
Petr Kalis 2023-06-09 17:32:11 +02:00
parent 01b5e6b950
commit 644b734585

View file

@ -1,156 +1,42 @@
# -*- coding: utf-8 -*-
"""Submitting render job to RoyalRender."""
# -*- coding: utf-8 -*-
"""Submitting render job to RoyalRender."""
import os
import sys
import platform
from maya.OpenMaya import MGlobal # noqa
import pyblish.api
from openpype.lib import is_running_from_build
from openpype.pipeline.publish.lib import get_published_workfile_instance
from openpype.pipeline.publish import KnownPublishError
from openpype.modules.royalrender.api import Api as rrApi
from openpype.modules.royalrender.rr_job import RRJob, CustomAttribute
from maya.OpenMaya import MGlobal
from openpype.modules.royalrender import lib
from openpype.pipeline.farm.tools import iter_expected_files
class CreateMayaRoyalRenderJob(pyblish.api.InstancePlugin):
class CreateMayaRoyalRenderJob(lib.BaseCreateRoyalRenderJob):
label = "Create Maya Render job in RR"
order = pyblish.api.IntegratorOrder + 0.1
families = ["renderlayer"]
targets = ["local"]
use_published = True
def __init__(self, *args, **kwargs):
self._instance = None
self._rrRoot = None
self.scene_path = None
self.job = None
self.submission_parameters = None
self.rr_api = None
def get_job(self):
"""Prepare job payload.
Returns:
RRJob: RoyalRender job payload.
"""
def get_rr_platform():
if sys.platform.lower() in ["win32", "win64"]:
return "windows"
elif sys.platform.lower() == "darwin":
return "mac"
else:
return "linux"
expected_files = self._instance.data["expectedFiles"]
first_file = next(iter_expected_files(expected_files))
output_dir = os.path.dirname(first_file)
self._instance.data["outputDir"] = output_dir
workspace = self._instance.context.data["workspaceDir"]
default_render_file = (
self._instance.context.data
['project_settings']
['maya']
['RenderSettings']
['default_render_image_folder']
)
# file_name = os.path.basename(self.scene_path)
dir_name = os.path.join(workspace, default_render_file)
layer = self._instance.data["setMembers"] # type: str
layer_name = layer.removeprefix("rs_")
custom_attributes = []
if is_running_from_build():
custom_attributes = [
CustomAttribute(
name="OpenPypeVersion",
value=os.environ.get("OPENPYPE_VERSION"))
]
job = RRJob(
Software="Maya",
Renderer=self._instance.data["renderer"],
SeqStart=int(self._instance.data["frameStartHandle"]),
SeqEnd=int(self._instance.data["frameEndHandle"]),
SeqStep=int(self._instance.data["byFrameStep"]),
SeqFileOffset=0,
Version="{0:.2f}".format(MGlobal.apiVersion() / 10000),
SceneName=self.scene_path,
IsActive=True,
ImageDir=dir_name,
ImageFilename="{}.".format(layer_name),
ImageExtension=os.path.splitext(first_file)[1],
ImagePreNumberLetter=".",
ImageSingleOutputFile=False,
SceneOS=get_rr_platform(),
Camera=self._instance.data["cameras"][0],
Layer=layer_name,
SceneDatabaseDir=workspace,
CustomSHotName=self._instance.context.data["asset"],
CompanyProjectName=self._instance.context.data["projectName"],
ImageWidth=self._instance.data["resolutionWidth"],
ImageHeight=self._instance.data["resolutionHeight"],
CustomAttributes=custom_attributes
)
def update_job_with_host_specific(self, instance, job):
job.Software = "Maya"
job.Version = "{0:.2f}".format(MGlobal.apiVersion() / 10000)
job.Camera = instance.data["cameras"][0],
workspace = instance.context.data["workspaceDir"]
job.SceneDatabaseDir = workspace
return job
def process(self, instance):
"""Plugin entry point."""
self._instance = instance
context = instance.context
super(CreateMayaRoyalRenderJob, self).process(instance)
self._rr_root = self._resolve_rr_path(context, instance.data.get("rrPathName")) # noqa
self.log.debug(self._rr_root)
if not self._rr_root:
raise KnownPublishError(
("Missing RoyalRender root. "
"You need to configure RoyalRender module."))
expected_files = self._instance.data["expectedFiles"]
first_file_path = next(iter_expected_files(expected_files))
output_dir = os.path.dirname(first_file_path)
self._instance.data["outputDir"] = output_dir
self.rr_api = rrApi(self._rr_root)
layer = self._instance.data["setMembers"] # type: str
layer_name = layer.removeprefix("rs_")
file_path = None
if self.use_published:
file_path = get_published_workfile_instance(context)
job = self.get_job(instance, self.scene_path, first_file_path,
layer_name)
job = self.update_job_with_host_specific(instance, job)
# fallback if nothing was set
if not file_path:
self.log.warning("Falling back to workfile")
file_path = context.data["currentFile"]
self.scene_path = file_path
if not self._instance.data.get("rrJobs"):
self._instance.data["rrJobs"] = []
self._instance.data["rrJobs"] += self.get_job()
@staticmethod
def _resolve_rr_path(context, rr_path_name):
# type: (pyblish.api.Context, str) -> str
rr_settings = (
context.data
["system_settings"]
["modules"]
["royalrender"]
)
try:
default_servers = rr_settings["rr_paths"]
project_servers = (
context.data
["project_settings"]
["royalrender"]
["rr_paths"]
)
rr_servers = {
k: default_servers[k]
for k in project_servers
if k in default_servers
}
except (AttributeError, KeyError):
# Handle situation were we had only one url for royal render.
return context.data["defaultRRPath"][platform.system().lower()]
return rr_servers[rr_path_name][platform.system().lower()]
instance.data["rrJobs"] += job