From fd87751c36dc2c1fe1565dc8d782d8dcd786bf3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Samohel?= Date: Sat, 6 Jan 2024 00:01:14 +0100 Subject: [PATCH 1/9] :art: add split export support for redshift --- .../plugins/publish/collect_redshift_rop.py | 19 +++++++++++++++++++ .../publish/submit_houdini_render_deadline.py | 10 ++++++++++ server_addon/deadline/server/version.py | 2 +- server_addon/houdini/server/version.py | 2 +- 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/houdini/plugins/publish/collect_redshift_rop.py b/openpype/hosts/houdini/plugins/publish/collect_redshift_rop.py index 0acddab011..cd3bb2bb7a 100644 --- a/openpype/hosts/houdini/plugins/publish/collect_redshift_rop.py +++ b/openpype/hosts/houdini/plugins/publish/collect_redshift_rop.py @@ -45,6 +45,25 @@ class CollectRedshiftROPRenderProducts(pyblish.api.InstancePlugin): beauty_suffix = rop.evalParm("RS_outputBeautyAOVSuffix") render_products = [] + # Store whether we are splitting the render job (export + render) + split_render = bool(rop.parm("RS_archive_enable").eval()) + instance.data["splitRender"] = split_render + export_prefix = None + export_products = [] + if split_render: + export_prefix = evalParmNoFrame( + rop, "RS_archive_file", pad_character="0" + ) + beauty_export_product = self.get_render_product_name( + prefix=export_prefix, + suffix=None) + export_products.append(beauty_export_product) + self.log.debug( + "Found export product: {}".format(beauty_export_product) + ) + instance.data["ifdFile"] = beauty_export_product + instance.data["exportFiles"] = list(export_products) + # Default beauty AOV beauty_product = self.get_render_product_name( prefix=default_prefix, suffix=beauty_suffix diff --git a/openpype/modules/deadline/plugins/publish/submit_houdini_render_deadline.py b/openpype/modules/deadline/plugins/publish/submit_houdini_render_deadline.py index c8960185b2..0bfb37ee1c 100644 --- a/openpype/modules/deadline/plugins/publish/submit_houdini_render_deadline.py +++ b/openpype/modules/deadline/plugins/publish/submit_houdini_render_deadline.py @@ -41,6 +41,11 @@ class VrayRenderPluginInfo(): SeparateFilesPerFrame = attr.ib(default=True) +@attr.s +class RedshiftRenderPluginInfo(): + SceneFile = attr.ib(default=None) + Version = attr.ib(default=None) + class HoudiniSubmitDeadline( abstract_submit_deadline.AbstractSubmitDeadline, OpenPypePyblishPluginMixin @@ -262,6 +267,11 @@ class HoudiniSubmitDeadline( plugin_info = VrayRenderPluginInfo( InputFilename=instance.data["ifdFile"], ) + elif family == "redshift_rop": + plugin_info = RedshiftRenderPluginInfo( + SceneFile=instance.data["ifdFile"], + Version=os.getenv("REDSHIFT_VERSION", "3.5.22"), + ) else: self.log.error( "Family '%s' not supported yet to split render job", diff --git a/server_addon/deadline/server/version.py b/server_addon/deadline/server/version.py index 1276d0254f..0a8da88258 100644 --- a/server_addon/deadline/server/version.py +++ b/server_addon/deadline/server/version.py @@ -1 +1 @@ -__version__ = "0.1.5" +__version__ = "0.1.6" diff --git a/server_addon/houdini/server/version.py b/server_addon/houdini/server/version.py index 6232f7ab18..5635676f6b 100644 --- a/server_addon/houdini/server/version.py +++ b/server_addon/houdini/server/version.py @@ -1 +1 @@ -__version__ = "0.2.10" +__version__ = "0.2.11" From 18e1f62ba29ff796e35b6e8da6bba3ce1f113e29 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Mon, 8 Jan 2024 11:27:43 +0200 Subject: [PATCH 2/9] add split setting in redshift rop creator --- .../plugins/create/create_redshift_rop.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/openpype/hosts/houdini/plugins/create/create_redshift_rop.py b/openpype/hosts/houdini/plugins/create/create_redshift_rop.py index 1b8826a932..d790aaa340 100644 --- a/openpype/hosts/houdini/plugins/create/create_redshift_rop.py +++ b/openpype/hosts/houdini/plugins/create/create_redshift_rop.py @@ -15,6 +15,9 @@ class CreateRedshiftROP(plugin.HoudiniCreator): icon = "magic" ext = "exr" + # Default to split export and render jobs + split_render = True + def create(self, subset_name, instance_data, pre_create_data): instance_data.pop("active", None) @@ -76,6 +79,16 @@ class CreateRedshiftROP(plugin.HoudiniCreator): camera = node.path() parms.update({ "RS_renderCamera": camera or ""}) + + if pre_create_data.get("split_render"): + rs_filepath = \ + "{export_dir}{subset_name}/{subset_name}.$F4.rs".format( + export_dir=hou.text.expandString("$HIP/pyblish/rs/"), + subset_name=subset_name, + ) + parms["RS_archive_enable"] = 1 + parms["RS_archive_file"] = rs_filepath + instance_node.setParms(parms) # Lock some Avalon attributes @@ -102,6 +115,9 @@ class CreateRedshiftROP(plugin.HoudiniCreator): BoolDef("farm", label="Submitting to Farm", default=True), + BoolDef("split_render", + label="Split export and render jobs", + default=self.split_render), EnumDef("image_format", image_format_enum, default=self.ext, From 808a2b7031d0ec81516ee170fd3bcef1fa5e3b1c Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Mon, 8 Jan 2024 11:43:04 +0200 Subject: [PATCH 3/9] BigRoy's comments --- .../plugins/create/create_redshift_rop.py | 16 +++++++++------- .../plugins/publish/collect_redshift_rop.py | 1 - 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/openpype/hosts/houdini/plugins/create/create_redshift_rop.py b/openpype/hosts/houdini/plugins/create/create_redshift_rop.py index d790aaa340..097c703283 100644 --- a/openpype/hosts/houdini/plugins/create/create_redshift_rop.py +++ b/openpype/hosts/houdini/plugins/create/create_redshift_rop.py @@ -80,14 +80,16 @@ class CreateRedshiftROP(plugin.HoudiniCreator): parms.update({ "RS_renderCamera": camera or ""}) - if pre_create_data.get("split_render"): - rs_filepath = \ - "{export_dir}{subset_name}/{subset_name}.$F4.rs".format( - export_dir=hou.text.expandString("$HIP/pyblish/rs/"), - subset_name=subset_name, - ) + rs_filepath = \ + "{export_dir}{subset_name}/{subset_name}.$F4.rs".format( + export_dir=hou.text.expandString("$HIP/pyblish/rs/"), + subset_name=subset_name, + ) + parms["RS_archive_file"] = rs_filepath + + if pre_create_data.get("split_render", self.split_render): parms["RS_archive_enable"] = 1 - parms["RS_archive_file"] = rs_filepath + instance_node.setParms(parms) diff --git a/openpype/hosts/houdini/plugins/publish/collect_redshift_rop.py b/openpype/hosts/houdini/plugins/publish/collect_redshift_rop.py index cd3bb2bb7a..056684b3a3 100644 --- a/openpype/hosts/houdini/plugins/publish/collect_redshift_rop.py +++ b/openpype/hosts/houdini/plugins/publish/collect_redshift_rop.py @@ -48,7 +48,6 @@ class CollectRedshiftROPRenderProducts(pyblish.api.InstancePlugin): # Store whether we are splitting the render job (export + render) split_render = bool(rop.parm("RS_archive_enable").eval()) instance.data["splitRender"] = split_render - export_prefix = None export_products = [] if split_render: export_prefix = evalParmNoFrame( From 938d9126a2bf76df4f9a3e5ccde2231dfd6507c3 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Mon, 8 Jan 2024 11:48:23 +0200 Subject: [PATCH 4/9] BigRoy's comment - stick to code style --- .../deadline/plugins/publish/submit_houdini_render_deadline.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openpype/modules/deadline/plugins/publish/submit_houdini_render_deadline.py b/openpype/modules/deadline/plugins/publish/submit_houdini_render_deadline.py index 0bfb37ee1c..8b03f682fc 100644 --- a/openpype/modules/deadline/plugins/publish/submit_houdini_render_deadline.py +++ b/openpype/modules/deadline/plugins/publish/submit_houdini_render_deadline.py @@ -46,6 +46,7 @@ class RedshiftRenderPluginInfo(): SceneFile = attr.ib(default=None) Version = attr.ib(default=None) + class HoudiniSubmitDeadline( abstract_submit_deadline.AbstractSubmitDeadline, OpenPypePyblishPluginMixin From 1e3fad27b0147691a3e535b9473ff330e84cfd51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Samohel?= Date: Mon, 8 Jan 2024 10:57:05 +0100 Subject: [PATCH 5/9] :recycle: some code style changes --- .../plugins/create/create_redshift_rop.py | 25 ++++++++----------- .../plugins/publish/collect_redshift_rop.py | 13 ++++------ .../publish/submit_houdini_render_deadline.py | 1 + 3 files changed, 17 insertions(+), 22 deletions(-) diff --git a/openpype/hosts/houdini/plugins/create/create_redshift_rop.py b/openpype/hosts/houdini/plugins/create/create_redshift_rop.py index 097c703283..b36580f67e 100644 --- a/openpype/hosts/houdini/plugins/create/create_redshift_rop.py +++ b/openpype/hosts/houdini/plugins/create/create_redshift_rop.py @@ -39,12 +39,15 @@ class CreateRedshiftROP(plugin.HoudiniCreator): # Also create the linked Redshift IPR Rop try: ipr_rop = instance_node.parent().createNode( - "Redshift_IPR", node_name=basename + "_IPR" + "Redshift_IPR", node_name=f"{basename}_IPR" ) - except hou.OperationFailed: + except hou.OperationFailed as e: raise plugin.OpenPypeCreatorError( - ("Cannot create Redshift node. Is Redshift " - "installed and enabled?")) + ( + "Cannot create Redshift node. Is Redshift " + "installed and enabled?" + ) + ) from e # Move it to directly under the Redshift ROP ipr_rop.setPosition(instance_node.position() + hou.Vector2(0, -1)) @@ -77,22 +80,16 @@ class CreateRedshiftROP(plugin.HoudiniCreator): for node in self.selected_nodes: if node.type().name() == "cam": camera = node.path() - parms.update({ - "RS_renderCamera": camera or ""}) + parms["RS_renderCamera"] = camera or "" - rs_filepath = \ - "{export_dir}{subset_name}/{subset_name}.$F4.rs".format( - export_dir=hou.text.expandString("$HIP/pyblish/rs/"), - subset_name=subset_name, - ) + export_dir=hou.text.expandString("$HIP/pyblish/rs/") + rs_filepath = f"{export_dir}{subset_name}/{subset_name}.$F4.rs" parms["RS_archive_file"] = rs_filepath + instance_node.setParms(parms) if pre_create_data.get("split_render", self.split_render): parms["RS_archive_enable"] = 1 - - instance_node.setParms(parms) - # Lock some Avalon attributes to_lock = ["family", "id"] self.lock_parameters(instance_node, to_lock) diff --git a/openpype/hosts/houdini/plugins/publish/collect_redshift_rop.py b/openpype/hosts/houdini/plugins/publish/collect_redshift_rop.py index 056684b3a3..aec7e07fbc 100644 --- a/openpype/hosts/houdini/plugins/publish/collect_redshift_rop.py +++ b/openpype/hosts/houdini/plugins/publish/collect_redshift_rop.py @@ -31,7 +31,6 @@ class CollectRedshiftROPRenderProducts(pyblish.api.InstancePlugin): families = ["redshift_rop"] def process(self, instance): - rop = hou.node(instance.data.get("instance_node")) # Collect chunkSize @@ -43,8 +42,6 @@ class CollectRedshiftROPRenderProducts(pyblish.api.InstancePlugin): default_prefix = evalParmNoFrame(rop, "RS_outputFileNamePrefix") beauty_suffix = rop.evalParm("RS_outputBeautyAOVSuffix") - render_products = [] - # Store whether we are splitting the render job (export + render) split_render = bool(rop.parm("RS_archive_enable").eval()) instance.data["splitRender"] = split_render @@ -67,7 +64,7 @@ class CollectRedshiftROPRenderProducts(pyblish.api.InstancePlugin): beauty_product = self.get_render_product_name( prefix=default_prefix, suffix=beauty_suffix ) - render_products.append(beauty_product) + render_products = [beauty_product] files_by_aov = { "_": self.generate_expected_files(instance, beauty_product)} @@ -77,11 +74,11 @@ class CollectRedshiftROPRenderProducts(pyblish.api.InstancePlugin): i = index + 1 # Skip disabled AOVs - if not rop.evalParm("RS_aovEnable_%s" % i): + if not rop.evalParm(f"RS_aovEnable_{i}"): continue - aov_suffix = rop.evalParm("RS_aovSuffix_%s" % i) - aov_prefix = evalParmNoFrame(rop, "RS_aovCustomPrefix_%s" % i) + aov_suffix = rop.evalParm(f"RS_aovSuffix_{i}") + aov_prefix = evalParmNoFrame(rop, f"RS_aovCustomPrefix_{i}") if not aov_prefix: aov_prefix = default_prefix @@ -103,7 +100,7 @@ class CollectRedshiftROPRenderProducts(pyblish.api.InstancePlugin): instance.data["attachTo"] = [] # stub required data if "expectedFiles" not in instance.data: - instance.data["expectedFiles"] = list() + instance.data["expectedFiles"] = [] instance.data["expectedFiles"].append(files_by_aov) # update the colorspace data diff --git a/openpype/modules/deadline/plugins/publish/submit_houdini_render_deadline.py b/openpype/modules/deadline/plugins/publish/submit_houdini_render_deadline.py index 8b03f682fc..fd5e789d0e 100644 --- a/openpype/modules/deadline/plugins/publish/submit_houdini_render_deadline.py +++ b/openpype/modules/deadline/plugins/publish/submit_houdini_render_deadline.py @@ -15,6 +15,7 @@ from openpype.lib import ( NumberDef ) + @attr.s class DeadlinePluginInfo(): SceneFile = attr.ib(default=None) From 3e4b8a152217af7473d38e8de4dd6f11ec84170b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Samohel?= Date: Mon, 8 Jan 2024 11:16:33 +0100 Subject: [PATCH 6/9] :dog: fix hound --- openpype/hosts/houdini/plugins/create/create_redshift_rop.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/houdini/plugins/create/create_redshift_rop.py b/openpype/hosts/houdini/plugins/create/create_redshift_rop.py index b36580f67e..151fd26074 100644 --- a/openpype/hosts/houdini/plugins/create/create_redshift_rop.py +++ b/openpype/hosts/houdini/plugins/create/create_redshift_rop.py @@ -82,7 +82,7 @@ class CreateRedshiftROP(plugin.HoudiniCreator): camera = node.path() parms["RS_renderCamera"] = camera or "" - export_dir=hou.text.expandString("$HIP/pyblish/rs/") + export_dir = hou.text.expandString("$HIP/pyblish/rs/") rs_filepath = f"{export_dir}{subset_name}/{subset_name}.$F4.rs" parms["RS_archive_file"] = rs_filepath From 5d787d3fc3c77b2977f18b6da1ee7161610e4a8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Samohel?= Date: Mon, 8 Jan 2024 11:17:12 +0100 Subject: [PATCH 7/9] :recycle: change how redshift version is passed --- .../plugins/publish/submit_houdini_render_deadline.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/openpype/modules/deadline/plugins/publish/submit_houdini_render_deadline.py b/openpype/modules/deadline/plugins/publish/submit_houdini_render_deadline.py index fd5e789d0e..abcc3378da 100644 --- a/openpype/modules/deadline/plugins/publish/submit_houdini_render_deadline.py +++ b/openpype/modules/deadline/plugins/publish/submit_houdini_render_deadline.py @@ -271,9 +271,11 @@ class HoudiniSubmitDeadline( ) elif family == "redshift_rop": plugin_info = RedshiftRenderPluginInfo( - SceneFile=instance.data["ifdFile"], - Version=os.getenv("REDSHIFT_VERSION", "3.5.22"), + SceneFile=instance.data["ifdFile"] ) + if os.getenv("REDSHIFT_VERSION"): + plugin_info.Version = os.getenv("REDSHIFT_VERSION"), + else: self.log.error( "Family '%s' not supported yet to split render job", From cf17ea8377e21c4820756c83f03cd43f2eafeeeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Samohel?= Date: Mon, 8 Jan 2024 12:09:06 +0100 Subject: [PATCH 8/9] :memo: add comment and warning about unspecified RS version --- .../publish/submit_houdini_render_deadline.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/openpype/modules/deadline/plugins/publish/submit_houdini_render_deadline.py b/openpype/modules/deadline/plugins/publish/submit_houdini_render_deadline.py index abcc3378da..bf7fb45a8b 100644 --- a/openpype/modules/deadline/plugins/publish/submit_houdini_render_deadline.py +++ b/openpype/modules/deadline/plugins/publish/submit_houdini_render_deadline.py @@ -273,8 +273,20 @@ class HoudiniSubmitDeadline( plugin_info = RedshiftRenderPluginInfo( SceneFile=instance.data["ifdFile"] ) + # Note: To use different versions of Redshift on Deadline + # set the `REDSHIFT_VERSION` env variable in the Tools + # settings in the AYON Application plugin. You will also + # need to set that version in `Redshift.param` file + # of the Redshift Deadline plugin: + # [Redshift_Executable_*] + # where * is the version number. if os.getenv("REDSHIFT_VERSION"): - plugin_info.Version = os.getenv("REDSHIFT_VERSION"), + plugin_info.Version = os.getenv("REDSHIFT_VERSION") + else: + self.log.warning(( + "REDSHIFT_VERSION env variable is not set" + " - using version configured in Deadline" + )) else: self.log.error( From 9d8378502436c1188fdb03be0185552cdfae2a92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Samohel?= Date: Mon, 8 Jan 2024 12:41:22 +0100 Subject: [PATCH 9/9] :bug: fix render archive enable flag settings --- openpype/hosts/houdini/plugins/create/create_redshift_rop.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openpype/hosts/houdini/plugins/create/create_redshift_rop.py b/openpype/hosts/houdini/plugins/create/create_redshift_rop.py index 151fd26074..9d1c7bc90d 100644 --- a/openpype/hosts/houdini/plugins/create/create_redshift_rop.py +++ b/openpype/hosts/houdini/plugins/create/create_redshift_rop.py @@ -86,10 +86,11 @@ class CreateRedshiftROP(plugin.HoudiniCreator): rs_filepath = f"{export_dir}{subset_name}/{subset_name}.$F4.rs" parms["RS_archive_file"] = rs_filepath - instance_node.setParms(parms) if pre_create_data.get("split_render", self.split_render): parms["RS_archive_enable"] = 1 + instance_node.setParms(parms) + # Lock some Avalon attributes to_lock = ["family", "id"] self.lock_parameters(instance_node, to_lock)