Skip to content

Commit

Permalink
Use render targets in a similar fashion to Nuke + set houdini parms a…
Browse files Browse the repository at this point in the history
…ccording to render target value
  • Loading branch information
MustafaJafar committed Apr 2, 2024
1 parent c7e0821 commit bcb1c2a
Show file tree
Hide file tree
Showing 8 changed files with 128 additions and 96 deletions.
30 changes: 14 additions & 16 deletions client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from ayon_core.hosts.houdini.api import plugin
from ayon_core.lib import EnumDef, BoolDef, UISeparatorDef, UILabelDef
from ayon_core.lib import EnumDef


class CreateArnoldRop(plugin.HoudiniCreator):
Expand All @@ -13,8 +13,8 @@ class CreateArnoldRop(plugin.HoudiniCreator):
# Default extension
ext = "exr"

# Default to split export and render jobs
split_render = True
# Default render target
render_target = "farm_split"

def create(self, product_name, instance_data, pre_create_data):
import hou
Expand Down Expand Up @@ -49,7 +49,7 @@ def create(self, product_name, instance_data, pre_create_data):
"ar_exr_half_precision": 1 # half precision
}

if pre_create_data.get("split_render"):
if pre_create_data.get("render_target") == "farm_split":
ass_filepath = \
"{export_dir}{product_name}/{product_name}.$F4.ass".format(
export_dir=hou.text.expandString("$HIP/pyblish/ass/"),
Expand All @@ -69,24 +69,22 @@ def get_instance_attr_defs(self):
"bmp", "cin", "exr", "jpg", "pic", "pic.gz", "png",
"rad", "rat", "rta", "sgi", "tga", "tif",
]
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("farm",
label="Submitting to Farm",
default=True),
BoolDef("split_render",
label="Split export and render jobs",
default=self.split_render),
EnumDef("render_target",
items=render_target_items,
label="Render target",
default=self.render_target),
EnumDef("image_format",
image_format_enum,
default=self.ext,
label="Image Format Options"),
UISeparatorDef(key="2"),
UILabelDef(label="Local Render Options:"),
BoolDef("skip_render",
label="Skip Render",
tooltip="Enable this option to skip render which publish existing frames.",
default=False),
]

def get_pre_create_attr_defs(self):
Expand Down
23 changes: 13 additions & 10 deletions client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
"""Creator plugin to create Karma ROP."""
from ayon_core.hosts.houdini.api import plugin
from ayon_core.lib import BoolDef, EnumDef, NumberDef, UISeparatorDef, UILabelDef
from ayon_core.lib import BoolDef, EnumDef, NumberDef


class CreateKarmaROP(plugin.HoudiniCreator):
Expand All @@ -11,6 +11,9 @@ class CreateKarmaROP(plugin.HoudiniCreator):
product_type = "karma_rop"
icon = "magic"

# Default render target
render_target = "farm"

def create(self, product_name, instance_data, pre_create_data):
import hou # noqa

Expand Down Expand Up @@ -89,11 +92,17 @@ def get_instance_attr_defs(self):
"bmp", "cin", "exr", "jpg", "pic", "pic.gz", "png",
"rad", "rat", "rta", "sgi", "tga", "tif",
]
render_target_items = {

This comment has been minimized.

Copy link
@BigRoy

BigRoy Apr 2, 2024

Collaborator

Can we for consistency stick with the same keys as used in Nuke and Fusion, so local_no_render would be frames. frames isn't necessarily a better key - I agree. But there's something to argue for consistency across all applications ;) especially if a render target might also influence how e.g. other plug-ins (e.g. deadline) wants to behave.

def _get_render_target_enum(self):
rendering_targets = {
"local": "Local machine rendering",
"frames": "Use existing frames"
}
if ("farm_rendering" in self.instance_attributes):
rendering_targets["frames_farm"] = "Use existing frames - farm"
rendering_targets["farm"] = "Farm rendering"

def _get_render_target_enum(self):
rendering_targets = {
"local": "Local machine rendering",
"frames": "Use existing frames",
}
if "farm_rendering" in self.instance_attributes:
rendering_targets["farm"] = "Farm rendering"

Also note how there it's abstracted to a base creator plug-in instead of duplicated code across all render creators. I'd recommend that here too.

"local": "Local machine rendering",
"local_no_render": "Use existing frames (local)",
"farm": "Farm Rendering",
}

return [
BoolDef("farm",
label="Submitting to Farm",
default=True),
EnumDef("render_target",
items=render_target_items,
label="Render target",
default=self.render_target),
EnumDef("image_format",
image_format_enum,
default="exr",
Expand All @@ -109,12 +118,6 @@ def get_instance_attr_defs(self):
BoolDef("cam_res",
label="Camera Resolution",
default=False),
UISeparatorDef(key="2"),
UILabelDef(label="Local Render Options:"),
BoolDef("skip_render",
label="Skip Render",
tooltip="Enable this option to skip render which publish existing frames.",
default=False),
]


Expand Down
37 changes: 14 additions & 23 deletions client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
"""Creator plugin to create Mantra ROP."""
from ayon_core.hosts.houdini.api import plugin
from ayon_core.lib import EnumDef, BoolDef, UISeparatorDef, UILabelDef
from ayon_core.lib import EnumDef, BoolDef


class CreateMantraROP(plugin.HoudiniCreator):
Expand All @@ -11,8 +11,8 @@ class CreateMantraROP(plugin.HoudiniCreator):
product_type = "mantra_rop"
icon = "magic"

# Default to split export and render jobs
split_render = True
# Default render target
render_target = "farm_split"

def create(self, product_name, instance_data, pre_create_data):
import hou # noqa
Expand All @@ -21,10 +21,6 @@ def create(self, product_name, instance_data, pre_create_data):
instance_data.update({"node_type": "ifd"})
# Add chunk size attribute
instance_data["chunkSize"] = 10
# Submit for job publishing
creator_attributes = instance_data.setdefault(
"creator_attributes", dict())
creator_attributes["farm"] = pre_create_data.get("farm")

instance = super(CreateMantraROP, self).create(
product_name,
Expand All @@ -48,7 +44,7 @@ def create(self, product_name, instance_data, pre_create_data):
"vm_picture": filepath,
}

if pre_create_data.get("split_render"):
if pre_create_data.get("render_target") == "farm_split":
ifd_filepath = \
"{export_dir}{product_name}/{product_name}.$F4.ifd".format(
export_dir=hou.text.expandString("$HIP/pyblish/ifd/"),
Expand Down Expand Up @@ -84,9 +80,18 @@ def get_instance_attr_defs(self):
"bmp", "cin", "exr", "jpg", "pic", "pic.gz", "png",
"rad", "rat", "rta", "sgi", "tga", "tif",
]
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 [
UILabelDef(label="Mantra Render Settings:"),
EnumDef("render_target",
items=render_target_items,
label="Render target",
default=self.render_target),
EnumDef("image_format",
image_format_enum,
default="exr",
Expand All @@ -96,20 +101,6 @@ def get_instance_attr_defs(self):
tooltip="Override the current camera "
"resolution, recommended for IPR.",
default=False),
UISeparatorDef(key="1"),
UILabelDef(label="Farm Render Options:"),
BoolDef("farm",
label="Submitting to Farm",
default=True),
BoolDef("split_render",
label="Split export and render jobs",
default=self.split_render),
UISeparatorDef(key="2"),
UILabelDef(label="Local Render Options:"),
BoolDef("skip_render",
label="Skip Render",
tooltip="Enable this option to skip render which publish existing frames.",
default=False),
]

def get_pre_create_attr_defs(self):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from ayon_core.pipeline import CreatorError
from ayon_core.hosts.houdini.api import plugin
from ayon_core.lib import EnumDef, BoolDef, UISeparatorDef, UILabelDef
from ayon_core.lib import EnumDef


class CreateRedshiftROP(plugin.HoudiniCreator):
Expand All @@ -17,8 +17,8 @@ class CreateRedshiftROP(plugin.HoudiniCreator):
ext = "exr"
multi_layered_mode = "No Multi-Layered EXR File"

# Default to split export and render jobs
split_render = True
# Default render target
render_target = "farm_split"

def create(self, product_name, instance_data, pre_create_data):

Expand Down Expand Up @@ -97,7 +97,7 @@ def create(self, product_name, instance_data, pre_create_data):
rs_filepath = f"{export_dir}{product_name}/{product_name}.$F4.rs"
parms["RS_archive_file"] = rs_filepath

if pre_create_data.get("split_render", self.split_render):
if pre_create_data.get("render_target") == "farm_split":
parms["RS_archive_enable"] = 1

instance_node.setParms(parms)
Expand All @@ -124,9 +124,18 @@ def get_instance_attr_defs(self):
"No Multi-Layered EXR File",
"Full Multi-Layered EXR File"
]
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 [
UILabelDef(label="RedShift Render Settings:"),
EnumDef("render_target",
items=render_target_items,
label="Render target",
default=self.render_target),
EnumDef("image_format",
image_format_enum,
default=self.ext,
Expand All @@ -135,20 +144,6 @@ def get_instance_attr_defs(self):
multi_layered_mode,
default=self.multi_layered_mode,
label="Multi-Layered EXR"),
UISeparatorDef(key="1"),
UILabelDef(label="Farm Render Options:"),
BoolDef("farm",
label="Submitting to Farm",
default=True),
BoolDef("split_render",
label="Split export and render jobs",
default=self.split_render),
UISeparatorDef(key="2"),
UILabelDef(label="Local Render Options:"),
BoolDef("skip_render",
label="Skip Render",
tooltip="Enable this option to skip render which publish existing frames.",
default=False),
]

def get_pre_create_attr_defs(self):
Expand Down
32 changes: 14 additions & 18 deletions client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from ayon_core.hosts.houdini.api import plugin
from ayon_core.pipeline import CreatorError
from ayon_core.lib import EnumDef, BoolDef, UISeparatorDef, UILabelDef
from ayon_core.lib import EnumDef, BoolDef


class CreateVrayROP(plugin.HoudiniCreator):
Expand All @@ -16,8 +16,8 @@ class CreateVrayROP(plugin.HoudiniCreator):
icon = "magic"
ext = "exr"

# Default to split export and render jobs
split_render = True
# Default render target
render_target = "farm_split"

def create(self, product_name, instance_data, pre_create_data):

Expand Down Expand Up @@ -53,7 +53,7 @@ def create(self, product_name, instance_data, pre_create_data):
"SettingsEXR_bits_per_channel": "16" # half precision
}

if pre_create_data.get("split_render"):
if pre_create_data.get("render_target") == "farm_split":
scene_filepath = \
"{export_dir}{product_name}/{product_name}.$F4.vrscene".format(
export_dir=hou.text.expandString("$HIP/pyblish/vrscene/"),
Expand Down Expand Up @@ -146,8 +146,18 @@ def get_instance_attr_defs(self):
"bmp", "cin", "exr", "jpg", "pic", "pic.gz", "png",
"rad", "rat", "rta", "sgi", "tga", "tif",
]
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 [
EnumDef("render_target",
items=render_target_items,
label="Render target",
default=self.render_target),
EnumDef("image_format",
image_format_enum,
default=self.ext,
Expand All @@ -162,20 +172,6 @@ def get_instance_attr_defs(self):
tooltip="Create Render Element Node "
"if enabled",
default=False),
UISeparatorDef(key="1"),
UILabelDef(label="Farm Render Options:"),
BoolDef("farm",
label="Submitting to Farm",
default=True),
BoolDef("split_render",
label="Split export and render jobs",
default=self.split_render),
UISeparatorDef(key="2"),
UILabelDef(label="Local Render Options:"),
BoolDef("skip_render",
label="Skip Render",
tooltip="Enable this option to skip render which publish existing frames.",
default=False),
]

def get_pre_create_attr_defs(self):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,40 @@ class CollectFarmInstances(pyblish.api.InstancePlugin):
label = "Collect farm instances"

def process(self, instance):
import hou

creator_attribute = instance.data["creator_attributes"]
farm_enabled = creator_attribute["farm"]
instance.data["farm"] = farm_enabled
if not farm_enabled:
product_type = instance.data["productType"]
rop_node = hou.node(instance.data.get("instance_node"))

# Align split parameter value on rop node to the render target.

This comment has been minimized.

Copy link
@BigRoy

BigRoy Apr 2, 2024

Collaborator

A collector should not change the state of the scene and thus should not set parms.
What's the best workflow for this particular case I'll leave up to debate by others.

But publishing should be idempotent - running it again should do basically the exact same thing from the exact same source workfile. It should, as much as possible, not alter the user's workfile.

if creator_attribute.get("render_target") == "farm_split":
if product_type == "arnold_rop":
rop_node.setParms({"ar_ass_export_enable": 1})
elif product_type == "mantra_rop":
rop_node.setParms({"soho_outputmode": 1})
elif product_type == "redshift_rop":
rop_node.setParms({"RS_archive_enable": 1})
elif product_type == "vray_rop":
rop_node.setParms({"render_export_mode": "2"})
else:
if product_type == "arnold_rop":
rop_node.setParms({"ar_ass_export_enable": 0})
elif product_type == "mantra_rop":
rop_node.setParms({"soho_outputmode": 0})
elif product_type == "redshift_rop":
rop_node.setParms({"RS_archive_enable": 0})
elif product_type == "vray_rop":
rop_node.setParms({"render_export_mode": "1"})

# Collect Render Target
if creator_attribute.get("render_target") not in {
"farm_split", "farm"
}:
instance.data["farm"] = False
self.log.debug("Render on farm is disabled. "
"Skipping farm collecting.")
return

instance.data["farm"] = True
instance.data["families"].append("render.farm.hou")
Loading

0 comments on commit bcb1c2a

Please sign in to comment.