From 7109c6ea1a483ed4b95a77e3dec2e379e569a2c2 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Fri, 17 Feb 2023 16:20:26 +0800 Subject: [PATCH] update the naming convention for the render outputs --- openpype/hosts/max/api/lib_renderproducts.py | 8 ++- openpype/hosts/max/api/lib_rendersettings.py | 25 ++++++- .../plugins/publish/submit_3dmax_deadline.py | 66 +++++++++++++++++-- .../plugins/publish/submit_publish_job.py | 5 +- .../defaults/project_settings/deadline.json | 3 +- .../defaults/project_settings/max.json | 2 +- .../schema_project_deadline.json | 5 ++ 7 files changed, 104 insertions(+), 10 deletions(-) diff --git a/openpype/hosts/max/api/lib_renderproducts.py b/openpype/hosts/max/api/lib_renderproducts.py index b54e2513e1..e09934e5de 100644 --- a/openpype/hosts/max/api/lib_renderproducts.py +++ b/openpype/hosts/max/api/lib_renderproducts.py @@ -25,11 +25,17 @@ class RenderProducts(object): def render_product(self, container): folder = rt.maxFilePath + file = rt.maxFileName folder = folder.replace("\\", "/") setting = self._project_settings render_folder = get_default_render_folder(setting) + filename, ext = os.path.splitext(file) + + output_file = os.path.join(folder, + render_folder, + filename, + container) - output_file = os.path.join(folder, render_folder, container) context = get_current_project_asset() startFrame = context["data"].get("frameStart") endFrame = context["data"].get("frameEnd") + 1 diff --git a/openpype/hosts/max/api/lib_rendersettings.py b/openpype/hosts/max/api/lib_rendersettings.py index bc9b02bc77..d4784d9dfb 100644 --- a/openpype/hosts/max/api/lib_rendersettings.py +++ b/openpype/hosts/max/api/lib_rendersettings.py @@ -44,11 +44,15 @@ class RenderSettings(object): def set_renderoutput(self, container): folder = rt.maxFilePath # hard-coded, should be customized in the setting + file = rt.maxFileName folder = folder.replace("\\", "/") # hard-coded, set the renderoutput path setting = self._project_settings render_folder = get_default_render_folder(setting) - output_dir = os.path.join(folder, render_folder) + filename, ext = os.path.splitext(file) + output_dir = os.path.join(folder, + render_folder, + filename) if not os.path.exists(output_dir): os.makedirs(output_dir) # hard-coded, should be customized in the setting @@ -139,3 +143,22 @@ class RenderSettings(object): target, renderpass = str(renderlayer_name).split(":") aov_name = "{0}_{1}..{2}".format(dir, renderpass, ext) render_elem.SetRenderElementFileName(i, aov_name) + + def get_renderoutput(self, container, output_dir): + output = os.path.join(output_dir, container) + img_fmt = self._project_settings["max"]["RenderSettings"]["image_format"] # noqa + outputFilename = "{0}..{1}".format(output, img_fmt) + return outputFilename + + def get_render_element(self): + orig_render_elem = list() + render_elem = rt.maxOps.GetCurRenderElementMgr() + render_elem_num = render_elem.NumRenderElements() + if render_elem_num < 0: + return + + for i in range(render_elem_num): + render_element = render_elem.GetRenderElementFilename(i) + orig_render_elem.append(render_element) + + return orig_render_elem diff --git a/openpype/modules/deadline/plugins/publish/submit_3dmax_deadline.py b/openpype/modules/deadline/plugins/publish/submit_3dmax_deadline.py index dec951da7a..9316e34898 100644 --- a/openpype/modules/deadline/plugins/publish/submit_3dmax_deadline.py +++ b/openpype/modules/deadline/plugins/publish/submit_3dmax_deadline.py @@ -5,8 +5,10 @@ import getpass import requests import pyblish.api - +from pymxs import runtme as rt from openpype.pipeline import legacy_io +from openpype.hosts.max.api.lib import get_current_renderer +from openpype.hosts.max.api.lib_rendersettings import RenderSettings class MaxSubmitRenderDeadline(pyblish.api.InstancePlugin): @@ -26,6 +28,7 @@ class MaxSubmitRenderDeadline(pyblish.api.InstancePlugin): group = None deadline_pool = None deadline_pool_secondary = None + framePerTask = 1 def process(self, instance): context = instance.context @@ -55,10 +58,30 @@ class MaxSubmitRenderDeadline(pyblish.api.InstancePlugin): anatomy_filled = anatomy_data.format(template_data) template_filled = anatomy_filled["publish"]["path"] filepath = os.path.normpath(template_filled) - + filepath = filepath.replace("\\", "/") self.log.info( "Using published scene for render {}".format(filepath) ) + if not os.path.exists(filepath): + self.log.error("published scene does not exist!") + + new_scene = self._clean_name(filepath) + # use the anatomy data for setting up the path of the files + orig_scene = self._clean_name(instance.context.data["currentFile"]) + expected_files = instance.data.get("expectedFiles") + + new_exp = [] + for file in expected_files: + new_file = str(file).replace(orig_scene, new_scene) + new_exp.append(new_file) + + instance.data["expectedFiles"] = new_exp + + metadata_folder = instance.data.get("publishRenderMetadataFolder") + if metadata_folder: + metadata_folder = metadata_folder.replace(orig_scene, + new_scene) + instance.data["publishRenderMetadataFolder"] = metadata_folder payload = { "JobInfo": { @@ -78,7 +101,8 @@ class MaxSubmitRenderDeadline(pyblish.api.InstancePlugin): "Frames": frames, "ChunkSize": self.chunk_size, "Priority": instance.data.get("priority", self.priority), - "Comment": comment + "Comment": comment, + "FramesPerTask": self.framePerTask }, "PluginInfo": { # Input @@ -131,8 +155,37 @@ class MaxSubmitRenderDeadline(pyblish.api.InstancePlugin): self.log.info("Ensuring output directory exists: %s" % dirname) os.makedirs(dirname) + plugin_data = {} + if self.use_published: + old_output_dir = os.path.dirname(expected_files[0]) + output_beauty = RenderSettings().get_renderoutput(instance.name, + old_output_dir) + output_beauty = output_beauty.replace(orig_scene, new_scene) + output_beauty = output_beauty.replace("\\", "/") + plugin_data["RenderOutput"] = output_beauty + + renderer_class = get_current_renderer() + renderer = str(renderer_class).split(":")[0] + if ( + renderer == "ART_Renderer" or + renderer == "Redshift_Renderer" or + renderer == "V_Ray_6_Hotfix_3" or + renderer == "V_Ray_GPU_6_Hotfix_3" or + renderer == "Default_Scanline_Renderer" or + renderer == "Quicksilver_Hardware_Renderer" + ): + render_elem_list = RenderSettings().get_render_element() + for i, render_element in enumerate(render_elem_list): + render_element = render_element.replace(orig_scene, new_scene) + plugin_data["RenderElementOutputFilename%d" % i] = render_element + + self.log.debug("plugin data:{}".format(plugin_data)) + self.log.info("Scene name was switched {} -> {}".format( + orig_scene, new_scene + )) payload["JobInfo"].update(output_data) + payload["PluginInfo"].update(plugin_data) self.submit(instance, payload) @@ -158,8 +211,13 @@ class MaxSubmitRenderDeadline(pyblish.api.InstancePlugin): raise Exception(response.text) # Store output dir for unified publisher (expectedFilesequence) expected_files = instance.data["expectedFiles"] - self.log.info("exp:{}".format(expected_files)) output_dir = os.path.dirname(expected_files[0]) instance.data["toBeRenderedOn"] = "deadline" instance.data["outputDir"] = output_dir instance.data["deadlineSubmissionJob"] = response.json() + + def rename_render_element(self): + pass + + def _clean_name(self, path): + return os.path.splitext(os.path.basename(path))[0] \ No newline at end of file diff --git a/openpype/modules/deadline/plugins/publish/submit_publish_job.py b/openpype/modules/deadline/plugins/publish/submit_publish_job.py index b70301ab7e..34fa8a8c03 100644 --- a/openpype/modules/deadline/plugins/publish/submit_publish_job.py +++ b/openpype/modules/deadline/plugins/publish/submit_publish_job.py @@ -293,8 +293,8 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin): "Group": self.deadline_group, "Pool": instance.data.get("primaryPool"), "SecondaryPool": instance.data.get("secondaryPool"), - - "OutputDirectory0": output_dir + # ensure the outputdirectory with correct slashes + "OutputDirectory0": output_dir.replace("\\", "/") }, "PluginInfo": { "Version": self.plugin_pype_version, @@ -1000,6 +1000,7 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin): "FTRACK_SERVER": os.environ.get("FTRACK_SERVER"), } + submission_type = instance.data["toBeRenderedOn"] if submission_type == "deadline": # get default deadline webservice url from deadline module self.deadline_url = instance.context.data["defaultDeadline"] diff --git a/openpype/settings/defaults/project_settings/deadline.json b/openpype/settings/defaults/project_settings/deadline.json index 0fab284c66..25d2988982 100644 --- a/openpype/settings/defaults/project_settings/deadline.json +++ b/openpype/settings/defaults/project_settings/deadline.json @@ -44,7 +44,8 @@ "chunk_size": 10, "group": "none", "deadline_pool": "", - "deadline_pool_secondary": "" + "deadline_pool_secondary": "", + "framePerTask": 1 }, "NukeSubmitDeadline": { "enabled": true, diff --git a/openpype/settings/defaults/project_settings/max.json b/openpype/settings/defaults/project_settings/max.json index 651a074a08..617e298310 100644 --- a/openpype/settings/defaults/project_settings/max.json +++ b/openpype/settings/defaults/project_settings/max.json @@ -1,6 +1,6 @@ { "RenderSettings": { - "default_render_image_folder": "renders/max", + "default_render_image_folder": "renders/3dsmax", "aov_separator": "underscore", "image_format": "exr" } diff --git a/openpype/settings/entities/schemas/projects_schema/schema_project_deadline.json b/openpype/settings/entities/schemas/projects_schema/schema_project_deadline.json index afefd3266a..f71a253105 100644 --- a/openpype/settings/entities/schemas/projects_schema/schema_project_deadline.json +++ b/openpype/settings/entities/schemas/projects_schema/schema_project_deadline.json @@ -249,6 +249,11 @@ "type": "text", "key": "deadline_pool_secondary", "label": "Deadline pool (secondary)" + }, + { + "type": "number", + "key": "framePerTask", + "label": "Frame Per Task" } ] },