From 0ee60bb2a45b16fe76b0277dec70f19f4c90d6cc Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 4 Jun 2024 22:37:57 +0300 Subject: [PATCH] support render targets for 'usdrender' product type --- .../publish/submit_houdini_render_deadline.py | 4 +- .../plugins/create/create_usdrender.py | 45 ++++++++++++++++--- .../plugins/publish/collect_farm_instances.py | 3 +- .../publish/collect_local_render_instances.py | 3 +- .../publish/collect_render_products.py | 9 +++- .../publish/collect_reviewable_instances.py | 3 +- .../plugins/publish/collect_usd_render.py | 7 +-- .../plugins/publish/extract_render.py | 7 ++- .../publish/validate_usd_render_arnold.py | 2 +- 9 files changed, 64 insertions(+), 19 deletions(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py index 63507a3d98..c00d16af93 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py @@ -97,7 +97,9 @@ class HoudiniSubmitDeadline( "arnold_rop", "mantra_rop", "karma_rop", - "vray_rop"] + "vray_rop", + "usdrender"] + targets = ["local"] use_published = True diff --git a/server_addon/houdini/client/ayon_houdini/plugins/create/create_usdrender.py b/server_addon/houdini/client/ayon_houdini/plugins/create/create_usdrender.py index 2bba71be05..dc18f46831 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/create/create_usdrender.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/create/create_usdrender.py @@ -29,12 +29,22 @@ class CreateUSDRender(plugin.HoudiniCreator): icon = "magic" description = "Create USD Render" - split_render = True default_renderer = "Karma CPU" + # Default render target + render_target = "farm_split" + def create(self, product_name, instance_data, pre_create_data): import hou # noqa + # Transfer settings from pre create to instance + creator_attributes = instance_data.setdefault( + "creator_attributes", dict()) + + for key in ["render_target", "review"]: + if key in pre_create_data: + creator_attributes[key] = pre_create_data[key] + # TODO: Support creation in /stage if wanted by user # pre_create_data["parent"] = "/stage" @@ -67,7 +77,7 @@ class CreateUSDRender(plugin.HoudiniCreator): if self.selected_nodes: parms["loppath"] = self.selected_nodes[0].path() - if pre_create_data.get("split_render", self.split_render): + if pre_create_data.get("render_target") == "farm_split": # Do not trigger the husk render, only trigger the USD export parms["runcommand"] = False # By default, the render ROP writes out the render file to a @@ -103,6 +113,31 @@ class CreateUSDRender(plugin.HoudiniCreator): to_lock = ["productType", "id"] self.lock_parameters(instance_node, to_lock) + def get_instance_attr_defs(self): + """get instance attribute definitions. + + Attributes defined in this method are exposed in + publish tab in the publisher UI. + """ + + render_target_items = { + "local": "Local machine rendering", + "local_no_render": "Use existing frames (local)", + "farm": "Farm Rendering", + "farm_split": "Farm Rendering - Split export & render jobs", + } + + return [ + BoolDef("review", + label="Review", + tooltip="Mark as reviewable", + default=True), + EnumDef("render_target", + items=render_target_items, + label="Render target", + default=self.render_target) + ] + def get_pre_create_attr_defs(self): # Retrieve available renderers and convert default renderer to @@ -123,12 +158,10 @@ class CreateUSDRender(plugin.HoudiniCreator): default_renderer = None attrs = super(CreateUSDRender, self).get_pre_create_attr_defs() - return attrs + [ + attrs += [ EnumDef("renderer", label="Renderer", default=default_renderer, items=renderer_plugin_to_display_name), - BoolDef("split_render", - label="Split export and render jobs", - default=self.split_render), ] + return attrs + self.get_instance_attr_defs() diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_farm_instances.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_farm_instances.py index 8fdae06f90..f14ff65518 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_farm_instances.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_farm_instances.py @@ -10,7 +10,8 @@ class CollectFarmInstances(plugin.HoudiniInstancePlugin): "karma_rop", "redshift_rop", "arnold_rop", - "vray_rop"] + "vray_rop", + "usdrender"] targets = ["local", "remote"] label = "Collect farm instances" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_local_render_instances.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_local_render_instances.py index 259b2378bb..931a79535b 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_local_render_instances.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_local_render_instances.py @@ -21,7 +21,8 @@ class CollectLocalRenderInstances(plugin.HoudiniInstancePlugin): "karma_rop", "redshift_rop", "arnold_rop", - "vray_rop"] + "vray_rop", + "usdrender"] label = "Collect local render instances" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_render_products.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_render_products.py index ac293d2da4..5ce2152624 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_render_products.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_render_products.py @@ -25,7 +25,7 @@ class CollectRenderProducts(plugin.HoudiniInstancePlugin): """ label = "Collect Render Products" - order = pyblish.api.CollectorOrder + 0.4 + order = pyblish.api.CollectorOrder + 0.04 families = ["usdrender"] def process(self, instance): @@ -44,6 +44,7 @@ class CollectRenderProducts(plugin.HoudiniInstancePlugin): filenames = [] files_by_product = {} + stage = node.stage() for prim_path in self.get_render_products(rop_node, stage): prim = stage.GetPrimAtPath(prim_path) @@ -131,12 +132,16 @@ class CollectRenderProducts(plugin.HoudiniInstancePlugin): self.log.debug("Render Product %s%s", aov_label, prim_path) self.log.debug("Product name: %s", filename) + + # As long as we have one AOV then multipartExr should be True. + instance.data["multipartExr"] = len(files_by_product) <= 1 + # Filenames for Deadline instance.data["files"] = filenames instance.data.setdefault("expectedFiles", []).append(files_by_product) def get_aov_identifier(self, render_product): - """Return the AOV identfier for a Render Product + """Return the AOV identifier for a Render Product A Render Product does not really define what 'AOV' it is, it defines the product name (output path) and the render vars to diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_reviewable_instances.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_reviewable_instances.py index 84cd8377a8..1bc797a1c1 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_reviewable_instances.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_reviewable_instances.py @@ -15,7 +15,8 @@ class CollectReviewableInstances(plugin.HoudiniInstancePlugin): "karma_rop", "redshift_rop", "arnold_rop", - "vray_rop"] + "vray_rop", + "usdrender"] def process(self, instance): creator_attribute = instance.data["creator_attributes"] diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_render.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_render.py index e0f149e787..942553772d 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_render.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_render.py @@ -35,10 +35,7 @@ class CollectUsdRender(pyblish.api.InstancePlugin): rop = hou.node(instance.data.get("instance_node")) - # Store whether we are splitting the render job in an export + render - split_render = not rop.parm("runcommand").eval() - instance.data["splitRender"] = split_render - if split_render: + if instance.data["splitRender"]: # USD file output lop_output = evalParmNoFrame( rop, "lopoutput", pad_character="#" @@ -75,7 +72,7 @@ class CollectUsdRender(pyblish.api.InstancePlugin): if "$F" not in export_file: instance.data["splitRenderFrameDependent"] = False - instance.data["farm"] = True # always submit to farm + # instance.data["farm"] = True # always submit to farm # update the colorspace data colorspace_data = get_color_management_preferences() diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_render.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_render.py index 8ff8590650..265602746b 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_render.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_render.py @@ -15,7 +15,8 @@ class ExtractRender(plugin.HoudiniExtractorPlugin): "karma_rop", "redshift_rop", "arnold_rop", - "vray_rop"] + "vray_rop", + "usdrender"] def process(self, instance): creator_attribute = instance.data["creator_attributes"] @@ -32,6 +33,8 @@ class ExtractRender(plugin.HoudiniExtractorPlugin): rop_node.setParms({"RS_archive_enable": 1}) elif product_type == "vray_rop": rop_node.setParms({"render_export_mode": "2"}) + elif product_type == "usdrender": + rop_node.setParms({"runcommand": 0}) else: if product_type == "arnold_rop": rop_node.setParms({"ar_ass_export_enable": 0}) @@ -41,6 +44,8 @@ class ExtractRender(plugin.HoudiniExtractorPlugin): rop_node.setParms({"RS_archive_enable": 0}) elif product_type == "vray_rop": rop_node.setParms({"render_export_mode": "1"}) + elif product_type == "usdrender": + rop_node.setParms({"runcommand": 1}) if instance.data.get("farm"): self.log.debug("Render should be processed on farm, skipping local render.") diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_render_arnold.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_render_arnold.py index 2cfb9aec58..6a56a8f64b 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_render_arnold.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_render_arnold.py @@ -35,7 +35,7 @@ class ValidateUSDRenderSingleFile(pyblish.api.InstancePlugin): ) render_chunk_size = submission_data.get("chunk", 1) export_chunk_size = submission_data.get("export_chunk", 1) - usd_file_per_frame = "$F" in instance.data["ifdFile"] + usd_file_per_frame = instance.data["farm"] frame_start_handle = instance.data["frameStartHandle"] frame_end_handle = instance.data["frameEndHandle"] num_frames = frame_end_handle - frame_start_handle + 1