mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-24 21:04:40 +01:00
OP-6037 - first iteration of Maya to RR
Uses generic logic, probably needs fine tuning.
This commit is contained in:
parent
01b5e6b950
commit
644b734585
1 changed files with 23 additions and 137 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue