From 3ea8425fd5f16450b9beef93413aa69aa98de238 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Mon, 29 May 2023 11:37:13 +0100 Subject: [PATCH 01/41] Support working with single frame renders. --- openpype/plugins/publish/extract_color_transcode.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/openpype/plugins/publish/extract_color_transcode.py b/openpype/plugins/publish/extract_color_transcode.py index 45b10620d1..f7c8af9318 100644 --- a/openpype/plugins/publish/extract_color_transcode.py +++ b/openpype/plugins/publish/extract_color_transcode.py @@ -184,6 +184,11 @@ class ExtractOIIOTranscode(publish.Extractor): if tag == "review": added_review = True + # If there is only 1 file outputted then convert list to + # string, cause that'll indicate that its not a sequence. + if len(new_repre["files"]) == 1: + new_repre["files"] = new_repre["files"][0] + new_representations.append(new_repre) added_representations = True From 4c4eeb29bed247982edad6d402aaf5903996be01 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Thu, 8 Jun 2023 00:04:41 +0800 Subject: [PATCH 02/41] connect custom write node script to the OP setting --- .../hosts/nuke/startup/custom_write_node.py | 99 +++++++++++++++---- 1 file changed, 78 insertions(+), 21 deletions(-) diff --git a/openpype/hosts/nuke/startup/custom_write_node.py b/openpype/hosts/nuke/startup/custom_write_node.py index d9313231d8..f2244b84c5 100644 --- a/openpype/hosts/nuke/startup/custom_write_node.py +++ b/openpype/hosts/nuke/startup/custom_write_node.py @@ -1,6 +1,11 @@ +""" OpenPype custom script for setting up write nodes for non-publish """ import os import nuke -from openpype.hosts.nuke.api.lib import set_node_knobs_from_settings +import nukescripts +from openpype.hosts.nuke.api.lib import ( + set_node_knobs_from_settings, + get_nuke_imageio_settings +) frame_padding = 5 @@ -53,24 +58,76 @@ knobs_setting = { } -def main(): - write_selected_nodes = [ - s for s in nuke.selectedNodes() if s.Class() == "Write"] +class WriteNodeKnobSettingPanel(nukescripts.PythonPanel): + """ Write Node's Knobs Settings Panel """ + def __init__(self): + nukescripts.PythonPanel.__init__(self, "Set Knobs Value(Write Node)") - ext = None - knobs = knobs_setting["knobs"] - for knob in knobs: - if knob["name"] == "file_type": - ext = knob["value"] - for w in write_selected_nodes: - # data for mapping the path - data = { - "work": os.getenv("AVALON_WORKDIR"), - "subset": w["name"].value(), - "frame": "#" * frame_padding, - "ext": ext - } - file_path = temp_rendering_path_template.format(**data) - file_path = file_path.replace("\\", "/") - w["file"].setValue(file_path) - set_node_knobs_from_settings(w, knobs) + knobs_value = self.get_node_knobs_override() + # create knobs + + self.typeKnob = nuke.Enumeration_Knob( + 'override_subsets', 'override subsets', knobs_value) + # add knobs to panel + self.addKnob(self.typeKnob) + + def process(self): + """ Process the panel values. """ + write_selected_nodes = [ + s for s in nuke.selectedNodes() if s.Class() == "Write"] + + node_knobs = self.typeKnob.value() + ext = None + knobs = None + if node_knobs: + knobs = self.get_node_knobs_setting(node_knobs) + if not knobs: + nuke.message("No knobs value found in subset group..\nDefault setting will be used..") # noqa + knobs = knobs_setting["knobs"] + else: + knobs = knobs_setting["knobs"] + + for knob in knobs: + if knob["name"] == "file_type": + ext = knob["value"] + for w in write_selected_nodes: + # data for mapping the path + data = { + "work": os.getenv("AVALON_WORKDIR"), + "subset": w["name"].value(), + "frame": "#" * frame_padding, + "ext": ext + } + file_path = temp_rendering_path_template.format(**data) + file_path = file_path.replace("\\", "/") + w["file"].setValue(file_path) + set_node_knobs_from_settings(w, knobs) + + def get_node_knobs_setting(self, value): + settings = [ + node for node in get_nuke_imageio_settings()["nodes"]["overrideNodes"] + ] + if not settings: + return + for i, setting in enumerate(settings): + if value in settings[i]["subsets"]: + return settings[i]["knobs"] + + def get_node_knobs_override(self): + knobs_value = [] + settings = [ + node for node in get_nuke_imageio_settings()["nodes"]["overrideNodes"] + ] + if not settings: + return + + for setting in settings: + if setting["nukeNodeClass"] == "Write" and setting["subsets"]: + for knob in setting["subsets"]: + knobs_value.append(knob) + return knobs_value + +def main(): + p_ = WriteNodeKnobSettingPanel() + if p_.showModalDialog(): + print(p_.process()) From 5dd066804bbc42e5fc1f1cc722e6bf69fc2643b4 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Thu, 8 Jun 2023 00:07:12 +0800 Subject: [PATCH 03/41] hound fix --- openpype/hosts/nuke/startup/custom_write_node.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/openpype/hosts/nuke/startup/custom_write_node.py b/openpype/hosts/nuke/startup/custom_write_node.py index f2244b84c5..66095409a6 100644 --- a/openpype/hosts/nuke/startup/custom_write_node.py +++ b/openpype/hosts/nuke/startup/custom_write_node.py @@ -105,18 +105,20 @@ class WriteNodeKnobSettingPanel(nukescripts.PythonPanel): def get_node_knobs_setting(self, value): settings = [ - node for node in get_nuke_imageio_settings()["nodes"]["overrideNodes"] + node + for node in get_nuke_imageio_settings()["nodes"]["overrideNodes"] ] if not settings: return - for i, setting in enumerate(settings): + for i, _ in enumerate(settings): if value in settings[i]["subsets"]: return settings[i]["knobs"] def get_node_knobs_override(self): knobs_value = [] settings = [ - node for node in get_nuke_imageio_settings()["nodes"]["overrideNodes"] + node + for node in get_nuke_imageio_settings()["nodes"]["overrideNodes"] ] if not settings: return @@ -127,6 +129,7 @@ class WriteNodeKnobSettingPanel(nukescripts.PythonPanel): knobs_value.append(knob) return knobs_value + def main(): p_ = WriteNodeKnobSettingPanel() if p_.showModalDialog(): From 8958585da07a7ba07fb2d84e8d26efee6f20d68c Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Fri, 9 Jun 2023 15:22:51 +0800 Subject: [PATCH 04/41] oscar's comment --- .../hosts/nuke/startup/custom_write_node.py | 45 +++++++++---------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/openpype/hosts/nuke/startup/custom_write_node.py b/openpype/hosts/nuke/startup/custom_write_node.py index 66095409a6..708f40db27 100644 --- a/openpype/hosts/nuke/startup/custom_write_node.py +++ b/openpype/hosts/nuke/startup/custom_write_node.py @@ -63,7 +63,7 @@ class WriteNodeKnobSettingPanel(nukescripts.PythonPanel): def __init__(self): nukescripts.PythonPanel.__init__(self, "Set Knobs Value(Write Node)") - knobs_value = self.get_node_knobs_override() + knobs_value, _ = self.get_node_knobs_setting() # create knobs self.typeKnob = nuke.Enumeration_Knob( @@ -78,56 +78,51 @@ class WriteNodeKnobSettingPanel(nukescripts.PythonPanel): node_knobs = self.typeKnob.value() ext = None - knobs = None + knobs = knobs_setting["knobs"] + if node_knobs: - knobs = self.get_node_knobs_setting(node_knobs) - if not knobs: + _, node_knobs_settings = self.get_node_knobs_setting(node_knobs) + if not node_knobs_settings: nuke.message("No knobs value found in subset group..\nDefault setting will be used..") # noqa - knobs = knobs_setting["knobs"] - else: - knobs = knobs_setting["knobs"] + else: + knobs = node_knobs_settings for knob in knobs: if knob["name"] == "file_type": ext = knob["value"] - for w in write_selected_nodes: + for write_node in write_selected_nodes: # data for mapping the path data = { "work": os.getenv("AVALON_WORKDIR"), - "subset": w["name"].value(), + "subset": write_node["name"].value(), "frame": "#" * frame_padding, "ext": ext } file_path = temp_rendering_path_template.format(**data) file_path = file_path.replace("\\", "/") - w["file"].setValue(file_path) - set_node_knobs_from_settings(w, knobs) + write_node["file"].setValue(file_path) + set_node_knobs_from_settings(write_node, knobs) - def get_node_knobs_setting(self, value): + def get_node_knobs_setting(self, value=None): + knobs_value = [] + knobs_nodes = [] settings = [ node for node in get_nuke_imageio_settings()["nodes"]["overrideNodes"] ] if not settings: return + for i, _ in enumerate(settings): if value in settings[i]["subsets"]: - return settings[i]["knobs"] - - def get_node_knobs_override(self): - knobs_value = [] - settings = [ - node - for node in get_nuke_imageio_settings()["nodes"]["overrideNodes"] - ] - if not settings: - return + knobs_nodes = settings[i]["knobs"] for setting in settings: if setting["nukeNodeClass"] == "Write" and setting["subsets"]: - for knob in setting["subsets"]: - knobs_value.append(knob) - return knobs_value + for knob in setting["subsets"]: + knobs_value.append(knob) + + return knobs_value, knobs_nodes def main(): From 4b0b06ea4f7201dd274866544de51a750ed30395 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Fri, 9 Jun 2023 15:23:48 +0800 Subject: [PATCH 05/41] hound fix --- openpype/hosts/nuke/startup/custom_write_node.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/nuke/startup/custom_write_node.py b/openpype/hosts/nuke/startup/custom_write_node.py index 708f40db27..d229b6b268 100644 --- a/openpype/hosts/nuke/startup/custom_write_node.py +++ b/openpype/hosts/nuke/startup/custom_write_node.py @@ -119,8 +119,8 @@ class WriteNodeKnobSettingPanel(nukescripts.PythonPanel): for setting in settings: if setting["nukeNodeClass"] == "Write" and setting["subsets"]: - for knob in setting["subsets"]: - knobs_value.append(knob) + for knob in setting["subsets"]: + knobs_value.append(knob) return knobs_value, knobs_nodes From 7c3229db704c8b12529f68e2f6d053a76ae85f51 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Fri, 9 Jun 2023 20:19:04 +0800 Subject: [PATCH 06/41] Jakub's comment --- .../hosts/nuke/startup/custom_write_node.py | 32 +++++++++++++------ 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/openpype/hosts/nuke/startup/custom_write_node.py b/openpype/hosts/nuke/startup/custom_write_node.py index d229b6b268..3edc74ceac 100644 --- a/openpype/hosts/nuke/startup/custom_write_node.py +++ b/openpype/hosts/nuke/startup/custom_write_node.py @@ -2,6 +2,7 @@ import os import nuke import nukescripts +from openpype.pipeline import Anatomy from openpype.hosts.nuke.api.lib import ( set_node_knobs_from_settings, get_nuke_imageio_settings @@ -66,30 +67,43 @@ class WriteNodeKnobSettingPanel(nukescripts.PythonPanel): knobs_value, _ = self.get_node_knobs_setting() # create knobs - self.typeKnob = nuke.Enumeration_Knob( - 'override_subsets', 'override subsets', knobs_value) + self.selected_preset_name = nuke.Enumeration_Knob( + 'preset_selector', 'presets', knobs_value) # add knobs to panel - self.addKnob(self.typeKnob) + self.addKnob(self.selected_preset_name ) def process(self): """ Process the panel values. """ write_selected_nodes = [ s for s in nuke.selectedNodes() if s.Class() == "Write"] - node_knobs = self.typeKnob.value() + node_knobs = self.selected_preset_name.value() ext = None knobs = knobs_setting["knobs"] - - if node_knobs: - _, node_knobs_settings = self.get_node_knobs_setting(node_knobs) + knobs_value, node_knobs_settings = self.get_node_knobs_setting(node_knobs) + if node_knobs and knobs_value: if not node_knobs_settings: nuke.message("No knobs value found in subset group..\nDefault setting will be used..") # noqa else: knobs = node_knobs_settings - for knob in knobs: - if knob["name"] == "file_type": + ext_knob_list = [knob for knob in knobs if knob["name"]== "file_type"] + if not ext_knob_list: + for knob in knobs_setting["knobs"]: ext = knob["value"] + nuke.message("No file type found in the subset's knobs.Default file_type value will be used..") + else: + for knob in ext_knob_list: + ext = knob["value"] + + + anatomy = Anatomy() + + frame_padding = int( + anatomy.templates["render"].get( + "frame_padding" + ) + ) for write_node in write_selected_nodes: # data for mapping the path data = { From 399562d950ab277967ded5c02ed52fbd66771436 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Fri, 9 Jun 2023 20:20:44 +0800 Subject: [PATCH 07/41] hound fix --- openpype/hosts/nuke/startup/custom_write_node.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/openpype/hosts/nuke/startup/custom_write_node.py b/openpype/hosts/nuke/startup/custom_write_node.py index 3edc74ceac..d708b277a6 100644 --- a/openpype/hosts/nuke/startup/custom_write_node.py +++ b/openpype/hosts/nuke/startup/custom_write_node.py @@ -67,10 +67,10 @@ class WriteNodeKnobSettingPanel(nukescripts.PythonPanel): knobs_value, _ = self.get_node_knobs_setting() # create knobs - self.selected_preset_name = nuke.Enumeration_Knob( + self.selected_preset_name = nuke.Enumeration_Knob( 'preset_selector', 'presets', knobs_value) # add knobs to panel - self.addKnob(self.selected_preset_name ) + self.addKnob(self.selected_preset_name) def process(self): """ Process the panel values. """ @@ -80,18 +80,20 @@ class WriteNodeKnobSettingPanel(nukescripts.PythonPanel): node_knobs = self.selected_preset_name.value() ext = None knobs = knobs_setting["knobs"] - knobs_value, node_knobs_settings = self.get_node_knobs_setting(node_knobs) + knobs_value, node_knobs_settings = ( + self.get_node_knobs_setting(node_knobs) + ) if node_knobs and knobs_value: if not node_knobs_settings: nuke.message("No knobs value found in subset group..\nDefault setting will be used..") # noqa else: knobs = node_knobs_settings - ext_knob_list = [knob for knob in knobs if knob["name"]== "file_type"] + ext_knob_list = [knob for knob in knobs if knob["name"] == "file_type"] if not ext_knob_list: for knob in knobs_setting["knobs"]: ext = knob["value"] - nuke.message("No file type found in the subset's knobs.Default file_type value will be used..") + nuke.message("No file type found in the subset's knobs.\nDefault file_type value will be used..") # noqa else: for knob in ext_knob_list: ext = knob["value"] From 1a1afee31957f1c5f12957a313b7c4438de4317c Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Fri, 9 Jun 2023 20:21:57 +0800 Subject: [PATCH 08/41] hound fix --- openpype/hosts/nuke/startup/custom_write_node.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/nuke/startup/custom_write_node.py b/openpype/hosts/nuke/startup/custom_write_node.py index d708b277a6..3e2a6fa652 100644 --- a/openpype/hosts/nuke/startup/custom_write_node.py +++ b/openpype/hosts/nuke/startup/custom_write_node.py @@ -82,7 +82,8 @@ class WriteNodeKnobSettingPanel(nukescripts.PythonPanel): knobs = knobs_setting["knobs"] knobs_value, node_knobs_settings = ( self.get_node_knobs_setting(node_knobs) - ) + ) + if node_knobs and knobs_value: if not node_knobs_settings: nuke.message("No knobs value found in subset group..\nDefault setting will be used..") # noqa @@ -98,7 +99,6 @@ class WriteNodeKnobSettingPanel(nukescripts.PythonPanel): for knob in ext_knob_list: ext = knob["value"] - anatomy = Anatomy() frame_padding = int( From feff57de37708f70e30e602ce0fe0edda3e2a3e0 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Fri, 9 Jun 2023 20:30:50 +0800 Subject: [PATCH 09/41] tell the user no file type in knobs --- openpype/hosts/nuke/startup/custom_write_node.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openpype/hosts/nuke/startup/custom_write_node.py b/openpype/hosts/nuke/startup/custom_write_node.py index 3e2a6fa652..08b11ee0fc 100644 --- a/openpype/hosts/nuke/startup/custom_write_node.py +++ b/openpype/hosts/nuke/startup/custom_write_node.py @@ -92,9 +92,8 @@ class WriteNodeKnobSettingPanel(nukescripts.PythonPanel): ext_knob_list = [knob for knob in knobs if knob["name"] == "file_type"] if not ext_knob_list: - for knob in knobs_setting["knobs"]: - ext = knob["value"] nuke.message("No file type found in the subset's knobs.\nDefault file_type value will be used..") # noqa + break else: for knob in ext_knob_list: ext = knob["value"] From 704620287c479880ad0205772db96112ca8e8dfb Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Fri, 9 Jun 2023 20:31:41 +0800 Subject: [PATCH 10/41] tell the user no file type in knobs and ask them to add one --- openpype/hosts/nuke/startup/custom_write_node.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/nuke/startup/custom_write_node.py b/openpype/hosts/nuke/startup/custom_write_node.py index 08b11ee0fc..2b326d2a64 100644 --- a/openpype/hosts/nuke/startup/custom_write_node.py +++ b/openpype/hosts/nuke/startup/custom_write_node.py @@ -92,8 +92,8 @@ class WriteNodeKnobSettingPanel(nukescripts.PythonPanel): ext_knob_list = [knob for knob in knobs if knob["name"] == "file_type"] if not ext_knob_list: - nuke.message("No file type found in the subset's knobs.\nDefault file_type value will be used..") # noqa - break + nuke.message("No file type found in the subset's knobs.\nPlease add one...") # noqa + return else: for knob in ext_knob_list: ext = knob["value"] From e1b2b723d7bbf2846e1bf5577dc3ed8790187c27 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Fri, 9 Jun 2023 20:33:06 +0800 Subject: [PATCH 11/41] tell the user no file type in knobs and ask them to add one --- openpype/hosts/nuke/startup/custom_write_node.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/nuke/startup/custom_write_node.py b/openpype/hosts/nuke/startup/custom_write_node.py index 2b326d2a64..a221a26424 100644 --- a/openpype/hosts/nuke/startup/custom_write_node.py +++ b/openpype/hosts/nuke/startup/custom_write_node.py @@ -92,7 +92,7 @@ class WriteNodeKnobSettingPanel(nukescripts.PythonPanel): ext_knob_list = [knob for knob in knobs if knob["name"] == "file_type"] if not ext_knob_list: - nuke.message("No file type found in the subset's knobs.\nPlease add one...") # noqa + nuke.message("ERROR: No file type found in the subset's knobs.\nPlease add one to complete setting up the node") # noqa return else: for knob in ext_knob_list: From 97faf90463773c8d6e8ed8323133df18953cf3b1 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Fri, 16 Jun 2023 17:01:47 +0800 Subject: [PATCH 12/41] bug fix arnoldExportAss unable to export selected set members --- .../plugins/publish/collect_arnold_scene_source.py | 9 ++++++++- .../plugins/publish/extract_arnold_scene_source.py | 11 +++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py b/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py index f160a3a0c5..1bacd80f11 100644 --- a/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py +++ b/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py @@ -25,11 +25,18 @@ class CollectArnoldSceneSource(pyblish.api.InstancePlugin): members = cmds.ls(members, long=True) children = get_all_children(members) instance.data["contentMembers"] = children + # TODO: include another instance.data for content members + instance.data["contentMembersTransform"] = members self.log.debug("content members: {}".format(children)) + self.log.debug("content members Transform : {}".format(members)) elif objset.endswith("proxy_SET"): - set_members = get_all_children(cmds.ls(members, long=True)) + proxy_members = cmds.ls(members, long=True) + set_members = get_all_children(proxy_members) instance.data["proxy"] = set_members + instance.data["proxyTransform"] = proxy_members + # TODO: include another instance.data for proxy self.log.debug("proxy members: {}".format(set_members)) + self.log.debug("proxy members Transform: {}".format(proxy_members)) # Use camera in object set if present else default to render globals # camera. diff --git a/openpype/hosts/maya/plugins/publish/extract_arnold_scene_source.py b/openpype/hosts/maya/plugins/publish/extract_arnold_scene_source.py index 14bcc71da6..9ed475e20f 100644 --- a/openpype/hosts/maya/plugins/publish/extract_arnold_scene_source.py +++ b/openpype/hosts/maya/plugins/publish/extract_arnold_scene_source.py @@ -69,9 +69,10 @@ class ExtractArnoldSceneSource(publish.Extractor): "camera": instance.data["camera"], "mask": mask } - + # TODO: dont use instance.data["contentMembers"] + # but use the new instance.data["contentMemberTransforms"] filenames, nodes_by_id = self._extract( - instance.data["contentMembers"], attribute_data, kwargs + instance.data["contentMembersTransform"], attribute_data, kwargs ) if "representations" not in instance.data: @@ -109,8 +110,10 @@ class ExtractArnoldSceneSource(publish.Extractor): return kwargs["filename"] = file_path.replace(".ass", "_proxy.ass") + # TODO: dont use instance.data["proxy"] + # but use the new instance.data["proxyTransforms"] filenames, _ = self._extract( - instance.data["proxy"], attribute_data, kwargs + instance.data["proxyTransform"], attribute_data, kwargs ) representation = { @@ -187,7 +190,7 @@ class ExtractArnoldSceneSource(publish.Extractor): self.log.info( "Extracting ass sequence with: {}".format(kwargs) ) - + # arnoldExportAss -selected needs an active selection or a list of objects exported_files = cmds.arnoldExportAss(**kwargs) for file in exported_files: From e10b228be2a460f7a606dba19044bfed1459f56d Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Fri, 16 Jun 2023 17:07:56 +0800 Subject: [PATCH 13/41] hound fix --- igniter/.ass | 212 ++++++++++++++++++ .../publish/collect_arnold_scene_source.py | 6 +- .../publish/extract_arnold_scene_source.py | 2 +- 3 files changed, 217 insertions(+), 3 deletions(-) create mode 100644 igniter/.ass diff --git a/igniter/.ass b/igniter/.ass new file mode 100644 index 0000000000..599a76d732 --- /dev/null +++ b/igniter/.ass @@ -0,0 +1,212 @@ +### exported: Thu Jun 15 17:07:53 2023 +### from: Arnold 7.1.3.2 [2a385cac] windows clang-10.0.1 oiio-2.4.1 osl-1.12.0 vdb-7.1.1 adlsdk-6.3.1.44 clmhub-2.0.0.235 rlm-14.1.3 optix-6.6.0 2022/09/12 08:50:17 +### host app: MtoA 5.2.1.1 6a048927 (fix-5.2.1) Maya 2023 +### bounds: -1.207354 -0.269835 -1.207354 1.207354 2.144874 1.207354 +### user: Kayla +### render_layer: defaultRenderLayer +### scene: D:/dummy_test/test_Project/test/work/test_v002/test_project_test_test_v002_v070.mb +### meters_per_unit: 0.010000 + + + +options +{ + AA_samples 3 + outputs 4 1 STRING + "RGBA RGBA defaultArnoldFilter/gaussian_filter defaultArnoldDriver/driver_exr.RGBA" + "P VECTOR aiAOVFilter1/closest_filter defaultArnoldDriver/driver_exr.RGBA" + "Pref RGB aiAOVFilter2/closest_filter defaultArnoldDriver/driver_exr.RGBA" + "albedo RGB defaultArnoldFilter/gaussian_filter defaultArnoldDriver/driver_exr.RGBA" + xres 1920 + yres 1080 + texture_per_file_stats on + texture_searchpath "[OPENPYPE_PROJECT_ROOT_WORK];D:/dummy_test/test_Project/test/work/test_v002/sourceimages" + texture_automip off + camera "/camera1/cameraShape1" + color_manager "defaultColorMgtGlobals" + operator "aiMerge1" + meters_per_unit 0.00999999978 + frame 1 + fps 25 + procedural_searchpath "[OPENPYPE_PROJECT_ROOT_WORK];D:/dummy_test/test_Project/test/work/test_v002/" + GI_diffuse_depth 1 + GI_specular_depth 1 + GI_transmission_depth 8 + declare render_layer constant STRING + render_layer "defaultRenderLayer" +} + +gaussian_filter +{ + name defaultArnoldFilter/gaussian_filter +} + +driver_exr +{ + name defaultArnoldDriver/driver_exr.RGBA + filename "D:/dummy_test/test_Project/test/work/test_v002/renders/test_project_test_test_v002_v070/masterLayer/masterLayer.exr" + color_space "" +} + +closest_filter +{ + name aiAOVFilter1/closest_filter +} + +closest_filter +{ + name aiAOVFilter2/closest_filter +} + +merge +{ + name aiMerge1 + inputs "test_01_:string_replace_operator" +} + +string_replace +{ + name test_01_:string_replace_operator + selection "*.(@node=='alembic')" + match "resources/test_project_test_modelMain_v067_proxy.abc" + replace "test_project_test_modelMain_v067.abc" +} + +color_manager_ocio +{ + name defaultColorMgtGlobals + config "D:/maya_config/OCIO-configs/Maya2022-default/config.ocio" + color_space_linear "ACEScg" +} + +polymesh +{ + name /proxy/pSphere/pSphereShape + visibility 255 + sidedness 255 + matrix + 2.41470838 0 0 0 + 0 2.41470838 0 0 + 0 0 2.41470838 0 + 0 0.937519372 0 1 + shader "lambert1" + id 2564139679 + nsides 6 1 UINT +4 4 4 4 4 4 + vidxs 24 1 b85UINT +B$ZuK*%:$$-?2$vMr4%:&UObB$w/J=(3BP? + vlist 8 1 b85VECTOR +aDq99aDq9989+]c89+]caDq9989+]caDq99!89+]c$$$$)aDq9989+]caDq9989+]c89+]c!aDq99$$$$(89+]caDq99aDq99 + nlist 24 1 b85VECTOR +zzyzzyzzyzzyzyzzyzzyzzy!$$$$$$$$$'aRT=dzzaRT=dzzaRT=dzzaRT=dzaRT=dzzaRT=dzzaRT=dzzaRT=dzyzzyzzyzzyzzaRT=dzzaRT=dzzaRT=dzzaRT=dzz + uvlist 14 1 b85VECTOR2 +82:0xz80l$K@wi$mMpJ$pnKs$PHvV$PKhS$rXa4$v$<]$USg@$UVY=$wcQs%&/-G$Z^X*$ZaJ'%'nB]%+9s1$_iHi$_l:f%-$3G%0Dcp$dt9S$dw+P%2/$1$h@,s$j**=$j,q:%79ip%:ZED$o4p'$o7b$%j%8uiM%8x[J%[0T+%^Q/T%>+Z7%>.L4%`;Dj%c[u>%C6Jv%C9%mqVg%ML,J%MNsG%o[l(%s'GQ%RVr4%RYd1%tf\g%x28;%5U-2%WdT\&$qMQ&(=)%%\lS]%\oEZ&*'>;&-Gnd%awDG%b%6D&/2/%&2R_N%g-51%g0'.&4RV8&As1a%vM\D%vPNA&C]Fw&$nOd&&XM.&&[?+&Hh7a&L3h5&+c=m&+f/j&Ms(K&Q>Xt&0n.W&0puT&S(n5&VII^&5xtA&6&f>&X3^t&[T:H&;.e+&;1W(&]>O^&`_+2&@9Uj&@x&jta[&JO7>&JR);&l^vq&p*RE&OZ((&O\o%&qig[&u5C/&Tdmg&Tg_d&vtXE'%@3n&Yo^Q&YrPN''*I/'*K$X&_%O;&_(A8',59n'/UjB&d0@%&d31w'1@*X'4`[,&G.Ox&i=wM'6JpB'9kKk&nEvN&nHhK';Ua,'>vb'VriE'Vu[B($*ai('N/L'\(Z/'\+L,()8Db(,Xu6'a3Jn'a6;X'fA-U(3N&6(6nV_'kI,B'kKs?(8Xku(<$GI'pSr,'pVd)(=c\_(A/83'u^bk'uaTh(BnMI(F:(r'X\ri(%lE>(H$>3(KDn\(*tD?(*w6<(M/.r(PO_F(0*5)(0-'&(R9t\(UZP0(55%h(57le(WDeF(Ze@o(:?kR(:B]O(\OV0(_p1Y(?J\<(?MN9(aZFo(e%wC(DUM&(DX>x(fe7Y(Gv@F(I`=e(Ic/b(kp(C(o;Xl(Nk.O(NmuL(q%n-(tFIV(Sut9(Sxf6(v0^l)$Q:@(Y+dx(Y.Vu)&;OV))\+*(^6Ub(^9G_)+F@@).fpi(cAFL(cD8I)0Q1*)3qaS(hL76(hO)3)5Y/Z)9'R=(mW'u(mYnr):fgS)>2C'(ram_(rd_\)?qX=)C=3f(wl^I(woPF)E'I')HH$P)'wO3)(%A0)J29f)MRj:)--?r)-01o)O=*P)R][$)280\)2:wY)TGp:)WhKc(j6@Z)7Eh/)YRa$)\sc`)Kn9C)Kq+@)n(xv)qITJ)Q$*-)Q&q*)s3i`)vTE4)V.ol)V1ai)x>ZJ)YOc7)[9`V)[Z)toi=)tr[:*B*Sp*EK/D*%%Z'*%(L$*G2RK*JUu.**0Jf**3-M*QK&.*TkVW*4F,:*4Hs7*VUkm*YvGA*9Pr$*9Scv*[`\W*_,8+*>[bc*>^T`*`kMA*d7(j*CfSM*CiEJ*ev>+*iAnT*&dcK*Ht5u*k,.j*nL_>*N'4v*N*&s*p6tT*sWP(*S2%`*S4l]*uAe>*xb@g*Xp+/b7Q+3-h%*g]=]*g`/Z+4m(;*k)1(*lh.G*ljuD+9wn%+=CIN*qrt1*quf.+?-^d+BN:8*w(dp*w+Vm+D8ON+GY*w+'3UZ+'6GW+IC@8+Lcpa+,>FD+,A8A+NN0w+QnaK+1I7.+1L)++SXva+W$R5+6T'm+6Vnj+X`u<+Yj%R+Yj1W+Yj=\+YjIa+YjUf+Yjak+Yjmp+Yk$u+Yk1%+Yk=*+YkI/+YkU4+Yka9+Ykm>+Yl$C+Yl0H+Yl$GoW-$IVb>$IVnF$K>Tg$R08V$SlCg$SlOo$UT6;$\Eo*$^-%;$^-1C$_ild$f[PS$$)E7$)3rI$j*)Y$ka82$/uZ&$0%nh$mMp;$plM,$:6;M$:;,-$rXa($uwb%$DKqs$DP>G$wcQj%&-vs$NaSD$NePa%'nBW%+96l$Xw4j$Y%c&%-$3D%0DKe$c7k;$c:u@%2/$1$j$j?$hC+1$hEr-%5R^`%:ZED$o4p'$o7b$%+Z7%>.L4%`;Dj%c[u>%C6Jv%C9%mqVg%ML,J%MNsG%o[l(%s'GQ%RVr4%RYd1%tf\g%x28;%7<8B%YK_m&&XL\&(=)$%\lS\%\oEZ&*'>;&-Gnd%awDG%b%6D&/2/%&2R_N%g-51%g0'.&4RV8&As1a%vM\D%vPNA&C]Fw&&Ufx&$qMw&$t?s&G,,Q&L3h5&+c=m&+f/j&Ms(K&Q>Xt&0n.W&0puT&S(n5&VII^&5xtA&6&f>&X3^t&[T:H&;.e+&;1W(&]>O^&`_+2&@9Uj&@vb'VriE'Vu[B($*mn(%fm9'\(N,'\+@(()8Db(,Xu6'a3Jn'a6;X'fA-U(3N&6(6nV_'kI,B'kKs?(8Xku(<$GI'pSr,'pVd)(=c\_(A/83'u^bk'uaTh(BnMI(F:(r'ZD)$('SPO(I`=>(KDn[(*tD>(*w6<(M/.r(PO_F(0*5)(0-'&(R9t\(UZP0(55%h(57le(WDeF(Ze@o(:?kR(:B]O(\OV0(_p1Y(?J\<(?MN9(aZFo(e%wC(DUM&(DX>x(fe7Y(I]WZ(H$>Y(H'0U(j3r3(o;Xl(Nk.O(NmuL(q%n-(tFIV(Sut9(Sxf6(v0^l)$Q:@(Y+dx(Y.Vu)&;OV))\+*(^6Ub(^9G_)+F@@).fpi(cAFL(cD8I)0Q1*)3qaS(hL76(hO)3)5Y;_)7@;*(mVpr(mYbn):fgS)>2C'(ram_(rd_\)?qX=)C=3f(wl^I(woPF)E'I')HH$P)'wO3)(%A0)J29f)MRj:)--?r)-01o)O=*P)R][$)280\)2:wY)TGp:)WhKc(krKj)9,s@)[9`/)\sc`)Kn9C)Kq+@)n(xv)qITJ)Q$*-)Q&q*)s3i`)vTE4)V.ol)V1ai)x>ZJ)[7%K)YRaJ)YUSF*&b@$*+j&])`DQ@)`GC=*-T;s*0tlG)eOB*)eR4'*2_,]*6*]1)jZ2i)j]$f*7irG*;5Mp)odxS)ogjP*Z)toi=)tr[:*B*Sp*EK/D*%%Z'*%(L$*G2^P*Hn]p**0>c**30_*L@5D*O`em*/;;P*/>-M*QK&.*TkVW*4F,:*4Hs7*VUkm*YvGA*9Pr$*9Scv*[`\W*_,8+*>[bc*>^T`*`kMA*d7(j*CfSM*CiEJ*ev>+*iAnT*(Kn[*J[A1*lh-u*nL_=*N'4u*N*&s*p6tT*sWP(*S2%`*S4l]*uAe>*xb@g*Xp+/b7Q+3-h%*g]=]*g`/Z+4m(;*leH<*k,/;*k.v7+8;bj+=CIN*qrt1*quf.+?-^d+BN:8*w(dp*w+Vm+D8ON+GY*w+'3UZ+'6GW+IC@8+Lcpa+,>FD+,A8A+NN0w+QnaK+1I7.+1L)++SXva+W$R5+6T'm+6Vnj+Xa,A+Yj%R+Yj1Y+YjUg+Yjmq+Yk1&+YkI0+Yka:+Yl$D+YlHN$N^ls$,R7G$,U5H$PI98$Si]]$1](1$1`&2$UT)w$XtNG$6gmp$6jkq$Z^oa$^*?1$;r^Z$;u\[$_i`K$c5/p$A(OD$A+ME$dtQ5$h?uZ$F3@.$GrI?$kfY4$o2(Y$M%H-$M(F.$pqIs$t'W%&2+G%)ROl$\Eo@$\HmA%++Z8%>.X9%aw\)%eC+N%C6Jw%C9Hx%g-Lh%jMq8%HA;a%HD9b%l8=R%oXaw%ML,K%MO*L%qC.<%tcRa%RVr5%RYp6%vMt&&$nCK%Wabt%Wd`u&&Xde&*$45%\lS^%^V\o&-Jld&0k<4%c^[]%caY^&2U]N&5v,s%hiLG%hlJH&7`N8&;+r]%mt=1%mw;2&w&@6cG%s*-p%s-+q&Av/a&EAT1%x4sZ%x7q[&G+uK&JLDp&(?dD&(BbE&L6f5&OW5Z&/1lB&/4jD&S(n4&VI=Y&4<]-&4?[.&X3^s&[T.C&9GMl&9JKm&]>O]&`^t-&>R>V&>U''3'Al'6Gf<&i;0e&i>.f'822V';RW&&nEvO&nHtP'=xwt'?&uu'bp$e'f;I5'Ek*r'En(t'ib,d'm-Q4'Jup]'Jxn^'nlrN'r8As'P+aG'P._H'swc8'wC2]'U6R1'U9P2($-Sw('MxG'ZABp'ZD@q()8Da(,Xi1'_L3Z'_O1[(.C5K(1cYp'dW$D'dYwE(3N&5(8Uao'kI,C'kL*D(:@.4(=`RY'pSr-'pVp.(?Jss(BkCC'u^bl'ua`m(DUd](Gv4-(%iSV(%lQW(I`UG(M,$l(*tD@(*wBA(NkF1(R6jV(0*5*(0-3+(Sv6p(WA[@(55%i(6t/%(Zh>o(^3c?(<'-h(<*+i(_s/Y(c>T)(A1sR(A4qS(e(uC(hIDh(FVl(r_&<(PREe(PUCf(tIGV(wil&(U]6O(U`4P)$T8@)'t\e(\O>M(\R26w(q%VK(q(TL)?qX<)C='a(v0G5(v3E6)E'I&)HGmK)&;7t)&>5u)J29e)O9uJ)--?s)-0=t)Q$Ad)TDf4)280])2;.^)V/2N)YOVs)7BvG)7EtH)[9x8)^ZG])Xp@)s3R()s6P**B*So*EJx?)x>Bh)xA@i*G5DY*JUi)*(I3R*(L1S*L@5C*O`Yh*-T$<*-Vw=*QK&-*TkJR*2^j&*2ah'*VUkl*Yv;<*7iZe*7lXf*[`\V*_,,&*[8*S2%a*S4xb*w)'R+%IKw*X^&+/_-K*bRLt*d1+.%]Z+.([[+Qq_K+U=.p+4leX+4ocZ+XcgJ+\/6o+9wVC+:%TD+]nX4+a:'Y+?-G-+?0E.+c$Hs+fDmC+D87l+D;5m+h/9]+kO^-+IC(V+IF&W+m:*G+pZNl+NMn@+NPlA+rDp1+ue?V+SX_*+S[]++wO`p,%:P.,&vgC,(^)X,*E@m,,,X-,-hoB,/P1W,17Hl,2s`,,4ZwA,6B9V,8)Pk,9eh+,;M*@,=4AU,>pXj,@Wp*,B?2?,D&IT,Eb`i,H'r1,Id4F,KKK[,M2bp,No%0,PVaQ7[Aa/f5)7xuYSaQ7[Aa794h7l?EtaQ7[Aa9['fzaQ7[Aa:L<8`x/vJaQ7[Aa9['ea/f5'aQ7[Aa794fa794faQ7[Aa/f5&a9['caQ7[A`x/vGa:L<5aQ7[Aza9['caQ7[A7l?Eqa794eaQ7[A7xuYOa/f5%aQ7[A8+HY:`x/vGaQ7[A8-jL7]8wuQaQ7[A8.[`^7l?EmaQ7[A8-jL67xuYLaQ7[A8+HY98+HY8aQ7[A7xuYM8-jL6aQ7[A7l?En8.[`]aQ7[Az85BheaOV5ba+:2Y81k?taOV5ba82J)8,AnSaOV5ba=[pI7tIW-aOV5baA3D9zaOV5baBETaa+:2XaOV5baA3D8a82J'aOV5ba=[pFa=[pEaOV5ba82J&aA3D6aOV5ba+:2UaBET^aOV5bzaA3D6aOV5b7tIW*a=[pDaOV5b8,AnOa82J%aOV5b81k?na+:2UaOV5b85Bh^]@q8xaOV5b86U$17tIW(aOV5b85Bh]8,AnMaOV5b81k?m81k?laOV5b8,AnN85Bh\aOV5b7tIW)86U$/aOV5bz8:_aQaMAiaa/f5)87d&JaMAiaa,;a/f5(aMAiaaFP=%a,8aMAiazaFPcW<8'x-gaJT2f8=h8A84LjgaJT2f8;)%18;)%1aJT2f84Lji8=h8@aJT2f8'x-i8>cW;aJT2fz8@J=naG>,6a794h8=>KTaG>,6aCTVt87d&IaG>,6aI/')8+HY,6aL:nBzaG>,6aMAiga794gaG>,6aL:nAaCTVqaG>,6aI/''aI/'&aG>,6aCTVoaL:n?aG>,6a794eaMAidaG>,6zaL:n?aG>,68+HY:aI/'%aG>,687d&CaCTVnaG>,68=>KNa794eaG>,68@J=g]KmN*aG>,68AQ988+HY7aG>,68@J=g87d&@aG>,68=>KM8=>KMaG>,687d&A8@J=faG>,68+HY88AQ96aG>,6z8BUCkaBETZa8YmK8?.MqaBETZaES@889bdbaBETZaJt)F8,iza-&.3aR7`ga::XDa-&.3aPqK=aG-,<8;MPfzaMAii8.[`bzaQ7[IzzaRT=ha:L<8zaQ7[HaG>,:zaMAifaMAiezaG>,9aQ7[Eza:L<5aRT=fzzaQ7[Ez8.[`_aMAidz8;MPbaG>,8z8AQ98a:L<5z8EG*m]Q*w-z8Fcb:8.[`\z8EG*l8;MP`z8AQ978AQ96z8;MPa8EG*kz8.[`]yzz8E+oj7v5R]a::XE8A:.B7v5R]aG-z7v5R]aR7`ga::XD7v5R]aPqK=aG-KT8;MP`aCTVt87d&I8;MP`aI/')8+HY<8;MP`aL:nBz8;MP`aMAiga794g8;MP`aL:nAaCTVq8;MP`aI/''aI/'&8;MP`aCTVoaL:n?8;MP`a794eaMAid8;MP`zaL:n?8;MP`8+HY:aI/'%8;MP`87d&CaCTVn8;MP`8=>KNa794e8;MP`8@J=g]KmN*8;MP`8AQ988+HY78;MP`8@J=g87d&@8;MP`8=>KM8=>KM8;MP`87d&A8@J=f8;MP`8+HY88AQ968;MP`z8=h8G8>cW;a3h^G8;)%78>cW;a@=FF84Ljp8>cW;aFnUa8'x-p8>cW;aIXhqz8>cW;aJT2la3h^F8>cW;aIXhpa@=FC8>cW;aFnU_aFnU^8>cW;a@=FBaIXhn8>cW;a3h^AaJT2i8>cW;zaIXhn8>cW;8'x-kaFnU^8>cW;84Ljja@=F@8>cW;8;)%2a3h^A8>cW;8=h8A]I*l/8>cW;8>cW<8'x-g8>cW;8=h8A84Ljg8>cW;8;)%18;)%18>cW;84Lji8=h8@8>cW;8'x-i8>cW;8>cW;z8:_aQ8AQ96a/f5)87d&J8AQ96a,;a/f5(8AQ96aFP=%a,88AQ96zaFP8EG*ka/f5)7xuYS8EG*ka794h7l?Et8EG*ka9['fz8EG*ka:L<8`x/vJ8EG*ka9['ea/f5'8EG*ka794fa794f8EG*ka/f5&a9['c8EG*k`x/vGa:L<58EG*kza9['c8EG*k7l?Eqa794e8EG*k7xuYOa/f5%8EG*k8+HY:`x/vG8EG*k8-jL7]8wuQ8EG*k8.[`^7l?Em8EG*k8-jL67xuYL8EG*k8+HY98+HY88EG*k7xuYM8-jL68EG*k7l?En8.[`]8EG*kz7uCHt8FG04`jc&P7rt'w8FG04`wC3.7kRWX8FG04a)dXM7^rJx8FG04a,4$Iz8FG04a-&.?`jc&N8FG04a,4$H`wC3,8FG04a)dXKa)dXJ8FG04`wC3*a,4$F8FG04`jc&Ka-&.=8FG04za,4$F8FG047^rJua)dXJ8FG047kRWS`wC3)8FG047rt's`jc&K8FG047uCHo]+QgX8FG047v5Re7^rJq8FG047uCHn7kRWQ8FG047rt'r7rt'r8FG047kRWR7uCHn8FG047^rJr7v5Rd8FG04zzaRT=dzzyz + nlist 382 1 b85VECTOR +8$sL?aR%6>`p]C(7vj/8aR%6>a($j&8,Oq4aQ$=Ea1Ba1j/2]ZEXpaQ$=Ea;iAh`p]BBaR%6?a0d'ta$guxaQ$=Da:rPna($inaR%6>a-Z`,a1B7dlgqa:rPoaQ$=C7mwEMa-Z_iaR%6?7q49%a8@LcaQ$=C8%Qa:a($iiaR%6@7vj/6a1B7dlgx8/,uEaQ$=A7mwE_8&$SXaR%6@5(Kln8/xfEaQ$=D4n,BY82U=faOAqMa8`53867kIaOAqLa+j;W8,oYWaOAqMa>En;7u$`;aOAqNaB(Fp]^u6:aOAqMaC>G8a+j;saOAqNaB(Fta8`55aOAqLa>En?a>En@aOAqMa8`51aB(FxaOAqMa+j;haC>G@aOAqK4Y^O1aB(G%aOAqK7u$`Fa>EnAaOAqK8,oY]a8`50aOAqL82U=ma+j;kaOAqJ867kP4J,])aOAqJ87Mkl7u$`FaOAqK867kM8,oY\aOAqK82U=k82U=jaOAqJ8,oYb867kOaOAqL7u$`@87MkgaOAqM4i*v)88;[taM-K^a%E_aJ@lva4+;Q84c;FaJ@luaG)&O8(:`VaJ@lsaIjv2]_U%E^]2IK3aJ@lr8>v_'8(:`caJ@lt8>%E]84c;QaJ@lq8;8K%8;8K$aJ@lq84c;K8>%E\aJ@lq8(:`W8>v_'aJ@lq5/=Vk8=HJ&aG,t^aCc,n8@V'DaG,t\a7@i]87rQ>aG,t]aI9%T8+P9HaG,t[aLFWk]hcZA7aG,tY8A]V-8+P9PaG,tY8@V'>87rQFaG,tY8=HJ'8=HJ)aG,tY87rQC8@V'@aG,tY8+P9K8A]V.aG,tY50&a>8?43^aB)a>aEWKc8B\)XaB)a?a8^5`89fp4aB)a@aK$d78,mZJaB)aDaNLZ)]Yd;iaB)aDaO]8ja8^6,aB)aDaNLZ'aEWKeaB)aCaK$d1aK$d5aB)aAaEWK_aNLZ(aB)aBa8^6$aO]8jaB)aG]SCosaNLZ'aB)aF8,mZOaK$d3aB)aD89fp8aEWKaaB)a@8?43_a8^6&aB)a>8B\)S4]4BYaB)a;8Cl]?8,mZTaB)a<8B\)S89fp6aB)a;8?43^8?43`aB)a<89fp78B\)TaB)a>8,mZP8Cl]AaB)a<52v)T8@LmMa:8ZwaFR128D3$9a:8Zwa9\x^8:aUXa:8[$aL=I&8-lHLa:8[&aOxT_]2EE>a:8[$aQ:iJa9]$-a:8ZxaOxT^aFR14a:8[%aL=HvaL=I&a:8[$aFR1/aOxT_a:8Zwa9]$&aQ:iJa:8[']Db/faOxT]a:8[&8-lHRaL=I$a:8Zp8:aU\aFR10a:8Zq8@LmPa9]$$a:8Zu8D3$44e9woa:8Zv8EJ8t8-lHUa:8Zx8D3$38:aU[a:8Zw8@LmN8@LmOa:8Zv8:aU[8D3$4a:8Zt8-lHP8EJ8wa:8Zq53XsU8A:e0a,fiLaG-dd8E,[,68EG*p\jrsaa:L;i8;MP]]I`mKaMAib8.[`S]I`mMaQ7[BzzaRT=da:L<;]I`mPaQ7[@aG>,:]H,4aQ7[A3_-C8a:L<2aRT=c\jrsa3leGaaQ7[?\xUx78.[`_aMAi_z8;MPbaG>,5]FmUA8AQ98a:L<.]LT0e8EG*kzz8Fcb88.[`^\jrsc8EG*k8;MPa\xUx<8AQ978AQ96\jrsc8;MP`8EG*kz8.[`_y3_-C453fkZ8A:e07uv8uaG-dd8E,[<7uv9&a:;,o8;=457uv9(aM+@]8.JQ\7uv9(aPr6cz7uv9$aR8OQa:;-?7uv9%aPr6`aG-dg7uv8waM+@WaM+@\7uv8taG-d`aPr6d7uv8ma:;-6aR8OR7uv8b4%`)+aPr6b7uv8a8.JQcaM+@Z7uv8j8;=49aG-db7uv8t8A:e0a:;-47uv8x8E,[74W=-`7uv9$8FGt&8.JQe7uv9$8E,[68;=487uv8v8A:e/8A:e07uv8w8;=488E,[97uv8t8.JQc8FGt&7uv8x53Dx68@LmM8.H*NaFR138D3$98.H*Na9\x^8:aUX8.H*OaL=I'8-lHL8.H*PaOxT_]2EE>8.H*OaQ:iJa9]$,8.H*NaOxT\aFR138.H*MaL=HvaL=I'8.H*MaFR1/aOxT_8.H*La9]$&aQ:iJ8.H*N]:)QhaOxT_8.H*L8-lHRaL=I$8.H*G8:aU\aFR108.H*F8@LmQa9]$$8.H*J8D3$44eYgJ8.H*K8EJ8t8-lHS8.H*M8D3$28:aU[8.H*M8@LmO8@LmO8.H*K8:aU[8D3$48.H*H8-lHP8EJ8w8.H*I52v;@8?43]8690laEWKc8B\)Y8690ka8^5`89fp48690laK$d68,mZL8690naNLZ*]Yd;i8690naO]8ja8^6+8690oaNLZ'aEWKe8690kaK$d1aK$d68690kaEWK_aNLZ*8690ma8^6&aO]8j8690m]OP%E^8>PPPPPPPPPPPPP%E^]2IK38>Pv_'8(:`c8>P%E]84c;N8>PP%E\8>Pv_(8>PEnF7u$`98CQ@vaB(Fs]`=mC8CQ@xaC>G6a+j;s8CQ@xaB(Foa8`548CQ@wa>En:a>En@8CQ@va8`5-aB(G$8CQ@wa+j;naC>G@8CQ@u4Y^O1aB(Fx8CQ@u7u$`Ua>En@8CQ@v8,oY]a8`518CQ@w82U=ia+j;l8CQ@t867kQ4I`qe8CQ@t87Mkp7u$`H8CQ@u867kP8,oY]8CQ@v82U=k82U=l8CQ@u8,oY`867kL8CQ@t7u$`F87Mkg8CQ@w4piDe8,Oq38E3ama1B=/8/,uC8E3ana$guO8%QaB8E3ala8@Lj7mwE<8E3aoa:rPi]ZEXp8E3aoa;iAaa$guw8E3aoa:rPfa1B0s7_[,H7uNfZ7_[,H8%v5I7_[,H8+HY87_[,H8.1k07_[,H80p((7_[,H83Y9u7_[,H86BKm7_[,H89+]d7_[,H8:Jf`7_[,H8;io\7_[,H8=3xX7_[,H8>S,T7_[,H8?r5P7_[,H8A<>L7_[,H8B[GH7_[,H8D%PD7_[,H8EDY@7_[,H8Fcb:7_[,Hz7m>0s7_[,H!7m>0s$$$$'7uNfZ7m>0s8%v5I7m>0s8+HY87m>0s8.1k07m>0s80p((7m>0s83Y9u7m>0s86BKm7m>0s89+]d7m>0s8:Jf`7m>0s8;io\7m>0s8=3xX7m>0s8>S,T7m>0s8?r5P7m>0s8A<>L7m>0s8B[GH7m>0s8D%PD7m>0s8EDY@7m>0s8Fcb:7m>0sz7uNfZ7_[,H7uNfZ7m>0s!7uNfZ$$$$'8%v5I7uNfZ8+HY87uNfZ8.1k07uNfZ80p((7uNfZ83Y9u7uNfZ86BKm7uNfZ89+]d7uNfZ8:Jf`7uNfZ8;io\7uNfZ8=3xX7uNfZ8>S,T7uNfZ8?r5P7uNfZ8A<>L7uNfZ8B[GH7uNfZ8D%PD7uNfZ8EDY@7uNfZ8Fcb:7uNfZz8%v5I7_[,H8%v5I7m>0s8%v5I7uNfZ!8%v5I$$$$'8+HY88%v5I8.1k08%v5I80p((8%v5I83Y9u8%v5I86BKm8%v5I89+]d8%v5I8:Jf`8%v5I8;io\8%v5I8=3xX8%v5I8>S,T8%v5I8?r5P8%v5I8A<>L8%v5I8B[GH8%v5I8D%PD8%v5I8EDY@8%v5I8Fcb:8%v5Iz8+HY87_[,H8+HY87m>0s8+HY87uNfZ8+HY88%v5I!8+HY8$$$$'8.1k08+HY880p((8+HY883Y9u8+HY886BKm8+HY889+]d8+HY88:Jf`8+HY88;io\8+HY88=3xX8+HY88>S,T8+HY88?r5P8+HY88A<>L8+HY88B[GH8+HY88D%PD8+HY88EDY@8+HY88Fcb:8+HY8z8.1k07_[,H8.1k07m>0s8.1k07uNfZ8.1k08%v5I8.1k08+HY8!8.1k0$$$$'80p((8.1k083Y9u8.1k086BKm8.1k089+]d8.1k08:Jf`8.1k08;io\8.1k08=3xX8.1k08>S,T8.1k08?r5P8.1k08A<>L8.1k08B[GH8.1k08D%PD8.1k08EDY@8.1k08Fcb:8.1k0z80p((7_[,H80p((7m>0s80p((7uNfZ80p((8%v5I80p((8+HY880p((8.1k0!80p(($$$$'83Y9u80p((86BKm80p((89+]d80p((8:Jf`80p((8;io\80p((8=3xX80p((8>S,T80p((8?r5P80p((8A<>L80p((8B[GH80p((8D%PD80p((8EDY@80p((8Fcb:80p((z83Y9u7_[,H83Y9u7m>0s83Y9u7uNfZ83Y9u8%v5I83Y9u8+HY883Y9u8.1k083Y9u80p((83Y9u83Y9u83Y9u86BKm83Y9u89+]d83Y9u8:Jf`83Y9u8;io\83Y9u8=3xX83Y9u8>S,T83Y9u8?r5P83Y9u8A<>L83Y9u8B[GH83Y9u8D%PD83Y9u8EDY@83Y9u8Fcb:83Y9uz86BKm7_[,H86BKm7m>0s86BKm7uNfZ86BKm8%v5I86BKm8+HY886BKm8.1k086BKm80p((86BKm83Y9u!86BKm$$$$'89+]d86BKm8:Jf`86BKm8;io\86BKm8=3xX86BKm8>S,T86BKm8?r5P86BKm8A<>L86BKm8B[GH86BKm8D%PD86BKm8EDY@86BKm8Fcb:86BKmz89+]d7_[,H89+]d7m>0s89+]d7uNfZ89+]d8%v5I89+]d8+HY889+]d8.1k089+]d80p((89+]d83Y9u89+]d86BKm!89+]d$$$$'8:Jf`89+]d8;io\89+]d8=3xX89+]d8>S,T89+]d8?r5P89+]d8A<>L89+]d8B[GH89+]d8D%PD89+]d8EDY@89+]d8Fcb:89+]dz8:Jf`7_[,H8:Jf`7m>0s8:Jf`7uNfZ8:Jf`8%v5I8:Jf`8+HY88:Jf`8.1k08:Jf`80p((8:Jf`83Y9u8:Jf`86BKm8:Jf`89+]d!8:Jf`$$$$'8;io\8:Jf`8=3xX8:Jf`8>S,T8:Jf`8?r5P8:Jf`8A<>L8:Jf`8B[GH8:Jf`8D%PD8:Jf`8EDY@8:Jf`8Fcb:8:Jf`z8;io\7_[,H8;io\7m>0s8;io\7uNfZ8;io\8%v5I8;io\8+HY88;io\8.1k08;io\80p((8;io\83Y9u8;io\86BKm8;io\89+]d8;io\8:Jf`!8;io\$$$$'8=3xX8;io\8>S,T8;io\8?r5P8;io\8A<>L8;io\8B[GH8;io\8D%PD8;io\8EDY@8;io\8Fcb:8;io\z8=3xX7_[,H8=3xX7m>0s8=3xX7uNfZ8=3xX8%v5I8=3xX8+HY88=3xX8.1k08=3xX80p((8=3xX83Y9u8=3xX86BKm8=3xX89+]d8=3xX8:Jf`8=3xX8;io\!8=3xX$$$$'8>S,T8=3xX8?r5P8=3xX8A<>L8=3xX8B[GH8=3xX8D%PD8=3xX8EDY@8=3xX8Fcb:8=3xXz8>S,T7_[,H8>S,T7m>0s8>S,T7uNfZ8>S,T8%v5I8>S,T8+HY88>S,T8.1k08>S,T80p((8>S,T83Y9u8>S,T86BKm8>S,T89+]d8>S,T8:Jf`8>S,T8;io\8>S,T8=3xX!8>S,T$$$$'8?r5P8>S,T8A<>L8>S,T8B[GH8>S,T8D%PD8>S,T8EDY@8>S,T8Fcb:8>S,Tz8?r5P7_[,H8?r5P7m>0s8?r5P7uNfZ8?r5P8%v5I8?r5P8+HY88?r5P8.1k08?r5P80p((8?r5P83Y9u8?r5P86BKm8?r5P89+]d8?r5P8:Jf`8?r5P8;io\8?r5P8=3xX8?r5P8>S,T!8?r5P$$$$'8A<>L8?r5P8B[GH8?r5P8D%PD8?r5P8EDY@8?r5P8Fcb:8?r5Pz8A<>L7_[,H8A<>L7m>0s8A<>L7uNfZ8A<>L8%v5I8A<>L8+HY88A<>L8.1k08A<>L80p((8A<>L83Y9u8A<>L86BKm8A<>L89+]d8A<>L8:Jf`8A<>L8;io\8A<>L8=3xX8A<>L8>S,T8A<>L8?r5P!8A<>L$$$$'8B[GH8A<>L8D%PD8A<>L8EDY@8A<>L8Fcb:8A<>Lz8B[GH7_[,H8B[GH7m>0s8B[GH7uNfZ8B[GH8%v5I8B[GH8+HY88B[GH8.1k08B[GH80p((8B[GH83Y9u8B[GH86BKm8B[GH89+]d8B[GH8:Jf`8B[GH8;io\8B[GH8=3xX8B[GH8>S,T8B[GH8?r5P8B[GH8A<>L!8B[GH$$$$'8D%PD8B[GH8EDY@8B[GH8Fcb:8B[GHz8D%PD7_[,H8D%PD7m>0s8D%PD7uNfZ8D%PD8%v5I8D%PD8+HY88D%PD8.1k08D%PD80p((8D%PD83Y9u8D%PD86BKm8D%PD89+]d8D%PD8:Jf`8D%PD8;io\8D%PD8=3xX8D%PD8>S,T8D%PD8?r5P8D%PD8A<>L8D%PD8B[GH!8D%PD$$$$'8EDY@8D%PD8Fcb:8D%PDz8EDY@7_[,H8EDY@7m>0s8EDY@7uNfZ8EDY@8%v5I8EDY@8+HY88EDY@8.1k08EDY@80p((8EDY@83Y9u8EDY@86BKm8EDY@89+]d8EDY@8:Jf`8EDY@8;io\8EDY@8=3xX8EDY@8>S,T8EDY@8?r5P8EDY@8A<>L8EDY@8B[GH8EDY@8D%PD!8EDY@$$$$'8Fcb:8EDY@7Qx'rz7gkb/z7reTbz7x7xRz8(_GAz8,gb4z8/Pt,z82:0xz84xBpz87aThz89eb6z8;/k2z8 Date: Mon, 19 Jun 2023 16:11:43 +0100 Subject: [PATCH 14/41] Account for multiple descriptions on single geometry. --- openpype/hosts/maya/plugins/publish/collect_xgen.py | 11 ++++++----- openpype/hosts/maya/plugins/publish/extract_xgen.py | 6 ++---- openpype/hosts/maya/plugins/publish/validate_xgen.py | 4 +--- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/collect_xgen.py b/openpype/hosts/maya/plugins/publish/collect_xgen.py index da0549b2d8..a065b6498a 100644 --- a/openpype/hosts/maya/plugins/publish/collect_xgen.py +++ b/openpype/hosts/maya/plugins/publish/collect_xgen.py @@ -30,12 +30,13 @@ class CollectXgen(pyblish.api.InstancePlugin): if data["xgmPalettes"]: data["xgmPalette"] = data["xgmPalettes"][0] - data["xgenConnections"] = {} + data["xgenConnections"] = [] for node in data["xgmSubdPatches"]: - data["xgenConnections"][node] = {} - for attr in ["transform", "geometry"]: - input = get_attribute_input("{}.{}".format(node, attr)) - data["xgenConnections"][node][attr] = input + connected_transform = get_attribute_input( + node + ".transform" + ).split(".")[0] + if connected_transform not in data["xgenConnections"]: + data["xgenConnections"].append(connected_transform) # Collect all files under palette root as resources. import xgenm diff --git a/openpype/hosts/maya/plugins/publish/extract_xgen.py b/openpype/hosts/maya/plugins/publish/extract_xgen.py index fb097ca84a..9b4e5e403d 100644 --- a/openpype/hosts/maya/plugins/publish/extract_xgen.py +++ b/openpype/hosts/maya/plugins/publish/extract_xgen.py @@ -51,11 +51,9 @@ class ExtractXgen(publish.Extractor): with delete_after() as delete_bin: duplicate_nodes = [] # Collect nodes to export. - for _, connections in instance.data["xgenConnections"].items(): - transform_name = connections["transform"].split(".")[0] - + for node in instance.data["xgenConnections"]: # Duplicate_transform subd patch geometry. - duplicate_transform = cmds.duplicate(transform_name)[0] + duplicate_transform = cmds.duplicate(node)[0] delete_bin.append(duplicate_transform) # Discard the children. diff --git a/openpype/hosts/maya/plugins/publish/validate_xgen.py b/openpype/hosts/maya/plugins/publish/validate_xgen.py index 47b24e218c..a44fa56308 100644 --- a/openpype/hosts/maya/plugins/publish/validate_xgen.py +++ b/openpype/hosts/maya/plugins/publish/validate_xgen.py @@ -61,9 +61,7 @@ class ValidateXgen(pyblish.api.InstancePlugin): # We need a namespace else there will be a naming conflict when # extracting because of stripping namespaces and parenting to world. node_names = [instance.data["xgmPalette"]] - for _, connections in instance.data["xgenConnections"].items(): - node_names.append(connections["transform"].split(".")[0]) - + node_names.extend(instance.data["xgenConnections"]) non_namespaced_nodes = [n for n in node_names if ":" not in n] if non_namespaced_nodes: raise PublishValidationError( From 82ae12695b52ae9f6a3de4ed4b7f99f140170238 Mon Sep 17 00:00:00 2001 From: Toke Jepsen Date: Mon, 19 Jun 2023 16:26:57 +0100 Subject: [PATCH 15/41] Update openpype/hosts/maya/plugins/publish/collect_xgen.py Co-authored-by: Roy Nieterau --- openpype/hosts/maya/plugins/publish/collect_xgen.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/maya/plugins/publish/collect_xgen.py b/openpype/hosts/maya/plugins/publish/collect_xgen.py index a065b6498a..d41b87e25b 100644 --- a/openpype/hosts/maya/plugins/publish/collect_xgen.py +++ b/openpype/hosts/maya/plugins/publish/collect_xgen.py @@ -30,7 +30,7 @@ class CollectXgen(pyblish.api.InstancePlugin): if data["xgmPalettes"]: data["xgmPalette"] = data["xgmPalettes"][0] - data["xgenConnections"] = [] + data["xgenConnections"] = set() for node in data["xgmSubdPatches"]: connected_transform = get_attribute_input( node + ".transform" From d2de6f1c7221f74774f1af0e406e4af1d4ca9f17 Mon Sep 17 00:00:00 2001 From: Toke Jepsen Date: Mon, 19 Jun 2023 16:27:04 +0100 Subject: [PATCH 16/41] Update openpype/hosts/maya/plugins/publish/collect_xgen.py Co-authored-by: Roy Nieterau --- openpype/hosts/maya/plugins/publish/collect_xgen.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/maya/plugins/publish/collect_xgen.py b/openpype/hosts/maya/plugins/publish/collect_xgen.py index d41b87e25b..e7c730cbf4 100644 --- a/openpype/hosts/maya/plugins/publish/collect_xgen.py +++ b/openpype/hosts/maya/plugins/publish/collect_xgen.py @@ -36,7 +36,7 @@ class CollectXgen(pyblish.api.InstancePlugin): node + ".transform" ).split(".")[0] if connected_transform not in data["xgenConnections"]: - data["xgenConnections"].append(connected_transform) + data["xgenConnections"].add(connected_transform) # Collect all files under palette root as resources. import xgenm From 33b9e16635fcfad0285d18e6e15fe526cb64df4b Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Mon, 19 Jun 2023 21:11:47 +0100 Subject: [PATCH 17/41] Ensure workspace xgen file is overwritten and update UI. --- openpype/hosts/maya/plugins/load/load_xgen.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/openpype/hosts/maya/plugins/load/load_xgen.py b/openpype/hosts/maya/plugins/load/load_xgen.py index 7e6cabc77c..16f2e8e842 100644 --- a/openpype/hosts/maya/plugins/load/load_xgen.py +++ b/openpype/hosts/maya/plugins/load/load_xgen.py @@ -1,4 +1,5 @@ import os +import shutil import maya.cmds as cmds import xgenm @@ -116,8 +117,8 @@ class XgenLoader(openpype.hosts.maya.api.plugin.ReferenceLoader): def update(self, container, representation): """Workflow for updating Xgen. - - Copy and potentially overwrite the workspace .xgen file. - Export changes to delta file. + - Copy and overwrite the workspace .xgen file. - Set collection attributes to not include delta files. - Update xgen maya file reference. - Apply the delta file changes. @@ -130,6 +131,10 @@ class XgenLoader(openpype.hosts.maya.api.plugin.ReferenceLoader): There is an implicit increment of the xgen and delta files, due to using the workfile basename. """ + # Storing current description to try and maintain later. + current_description = ( + xgenm.xgGlobal.DescriptionEditor.currentDescription() + ) container_node = container["objectName"] members = get_container_members(container_node) @@ -160,6 +165,7 @@ class XgenLoader(openpype.hosts.maya.api.plugin.ReferenceLoader): data_path ) data = {"xgProjectPath": project_path, "xgDataPath": data_path} + shutil.copy(new_xgen_file, xgen_file) write_xgen_file(data, xgen_file) attribute_data = { @@ -171,3 +177,11 @@ class XgenLoader(openpype.hosts.maya.api.plugin.ReferenceLoader): super().update(container, representation) xgenm.applyDelta(xgen_palette.replace("|", ""), xgd_file) + + # Restore current selected description if it exists. + if cmds.objExists(current_description): + xgenm.xgGlobal.DescriptionEditor.setCurrentDescription( + current_description + ) + # Full UI refresh. + xgenm.xgGlobal.DescriptionEditor.refresh("Full") From a72050e71c1de86f7cef5b6707858fdc7bf0c4be Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Tue, 20 Jun 2023 17:53:42 +0800 Subject: [PATCH 18/41] allows both meshes and groups for assexport --- .../publish/collect_arnold_scene_source.py | 38 +++++++++++++++---- .../publish/extract_arnold_scene_source.py | 4 +- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py b/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py index 34db3faa2f..1b8ec27509 100644 --- a/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py +++ b/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py @@ -23,22 +23,44 @@ class CollectArnoldSceneSource(pyblish.api.InstancePlugin): continue if objset.endswith("content_SET"): members = cmds.ls(members, long=True) + members_list = [] + for member in members: + shape = cmds.listRelatives( + member, shapes=True, fullPath=True) + if not shape: + continue + members_list = members + shape + group_name = "|{}".format(member) + if group_name in members_list: + members_list.remove(group_name) + children = get_all_children(members) + + if members_list: + children.extend(members_list) instance.data["contentMembers"] = children - # TODO: include another instance.data for content members - instance.data["contentMembersTransform"] = members self.log.debug("content members: {}".format(children)) - self.log.debug( - "content members transform : {}".format(members)) + elif objset.endswith("proxy_SET"): proxy_members = cmds.ls(members, long=True) + proxy_list = [] + for proxy in proxy_members: + shape = cmds.listRelatives( + proxy, shapes=True, fullPath=True) + if not shape: + continue + proxy_list = proxy_members + shape + group_name = "|{}".format(proxy) + if group_name in proxy_list: + proxy_list.remove(group_name) + set_members = get_all_children(proxy_members) + if proxy_list: + set_members.extend(proxy_list) + instance.data["proxy"] = set_members - instance.data["proxyTransform"] = proxy_members - # TODO: include another instance.data for proxy self.log.debug("proxy members: {}".format(set_members)) - self.log.debug( - "proxy members transform: {}".format(proxy_members)) + # Use camera in object set if present else default to render globals # camera. diff --git a/openpype/hosts/maya/plugins/publish/extract_arnold_scene_source.py b/openpype/hosts/maya/plugins/publish/extract_arnold_scene_source.py index f49d8ece57..8696f5a94b 100644 --- a/openpype/hosts/maya/plugins/publish/extract_arnold_scene_source.py +++ b/openpype/hosts/maya/plugins/publish/extract_arnold_scene_source.py @@ -72,7 +72,7 @@ class ExtractArnoldSceneSource(publish.Extractor): # TODO: dont use instance.data["contentMembers"] # but use the new instance.data["contentMemberTransforms"] filenames, nodes_by_id = self._extract( - instance.data["contentMembersTransform"], attribute_data, kwargs + instance.data["contentMembers"], attribute_data, kwargs ) if "representations" not in instance.data: @@ -113,7 +113,7 @@ class ExtractArnoldSceneSource(publish.Extractor): # TODO: dont use instance.data["proxy"] # but use the new instance.data["proxyTransforms"] filenames, _ = self._extract( - instance.data["proxyTransform"], attribute_data, kwargs + instance.data["proxy"], attribute_data, kwargs ) representation = { From 9b4641de65a1d20a66d4f78b30a9c1b8448a4d2e Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Tue, 20 Jun 2023 17:56:16 +0800 Subject: [PATCH 19/41] rename the setting panel --- openpype/hosts/nuke/startup/custom_write_node.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/nuke/startup/custom_write_node.py b/openpype/hosts/nuke/startup/custom_write_node.py index a221a26424..ef3923f40a 100644 --- a/openpype/hosts/nuke/startup/custom_write_node.py +++ b/openpype/hosts/nuke/startup/custom_write_node.py @@ -62,7 +62,7 @@ knobs_setting = { class WriteNodeKnobSettingPanel(nukescripts.PythonPanel): """ Write Node's Knobs Settings Panel """ def __init__(self): - nukescripts.PythonPanel.__init__(self, "Set Knobs Value(Write Node)") + nukescripts.PythonPanel.__init__(self, "Set Presets(Write Node)") knobs_value, _ = self.get_node_knobs_setting() # create knobs From f0bf7d8c665b23dbd19ae2cda7da47ef233dd741 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Tue, 20 Jun 2023 17:57:45 +0800 Subject: [PATCH 20/41] remove hardcoded frame padding --- openpype/hosts/nuke/startup/custom_write_node.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openpype/hosts/nuke/startup/custom_write_node.py b/openpype/hosts/nuke/startup/custom_write_node.py index ef3923f40a..1db235b71a 100644 --- a/openpype/hosts/nuke/startup/custom_write_node.py +++ b/openpype/hosts/nuke/startup/custom_write_node.py @@ -9,7 +9,6 @@ from openpype.hosts.nuke.api.lib import ( ) -frame_padding = 5 temp_rendering_path_template = ( "{work}/renders/nuke/{subset}/{subset}.{frame}.{ext}") @@ -62,7 +61,7 @@ knobs_setting = { class WriteNodeKnobSettingPanel(nukescripts.PythonPanel): """ Write Node's Knobs Settings Panel """ def __init__(self): - nukescripts.PythonPanel.__init__(self, "Set Presets(Write Node)") + nukescripts.PythonPanel.__init__(self, "Set Preset(Write Node)") knobs_value, _ = self.get_node_knobs_setting() # create knobs From 1ae4cbcdad521fcbda19cf868973b0f0ab470322 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Tue, 20 Jun 2023 17:59:33 +0800 Subject: [PATCH 21/41] use preset name --- openpype/hosts/nuke/startup/custom_write_node.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/openpype/hosts/nuke/startup/custom_write_node.py b/openpype/hosts/nuke/startup/custom_write_node.py index 1db235b71a..9628876d0a 100644 --- a/openpype/hosts/nuke/startup/custom_write_node.py +++ b/openpype/hosts/nuke/startup/custom_write_node.py @@ -61,13 +61,13 @@ knobs_setting = { class WriteNodeKnobSettingPanel(nukescripts.PythonPanel): """ Write Node's Knobs Settings Panel """ def __init__(self): - nukescripts.PythonPanel.__init__(self, "Set Preset(Write Node)") + nukescripts.PythonPanel.__init__(self,"Set Knobs Value(Write Node)") - knobs_value, _ = self.get_node_knobs_setting() + preset_name, _ = self.get_node_knobs_setting() # create knobs self.selected_preset_name = nuke.Enumeration_Knob( - 'preset_selector', 'presets', knobs_value) + 'preset_selector', 'presets', preset_name) # add knobs to panel self.addKnob(self.selected_preset_name) @@ -79,11 +79,11 @@ class WriteNodeKnobSettingPanel(nukescripts.PythonPanel): node_knobs = self.selected_preset_name.value() ext = None knobs = knobs_setting["knobs"] - knobs_value, node_knobs_settings = ( + preset_name, node_knobs_settings = ( self.get_node_knobs_setting(node_knobs) ) - if node_knobs and knobs_value: + if node_knobs and preset_name: if not node_knobs_settings: nuke.message("No knobs value found in subset group..\nDefault setting will be used..") # noqa else: @@ -118,7 +118,7 @@ class WriteNodeKnobSettingPanel(nukescripts.PythonPanel): set_node_knobs_from_settings(write_node, knobs) def get_node_knobs_setting(self, value=None): - knobs_value = [] + preset_name = [] knobs_nodes = [] settings = [ node @@ -134,9 +134,9 @@ class WriteNodeKnobSettingPanel(nukescripts.PythonPanel): for setting in settings: if setting["nukeNodeClass"] == "Write" and setting["subsets"]: for knob in setting["subsets"]: - knobs_value.append(knob) + preset_name.append(knob) - return knobs_value, knobs_nodes + return preset_name, knobs_nodes def main(): From 02db5c6792d7e5a89c6243f73e5b11947ee66688 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Tue, 20 Jun 2023 18:00:11 +0800 Subject: [PATCH 22/41] hound fix --- openpype/hosts/nuke/startup/custom_write_node.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/nuke/startup/custom_write_node.py b/openpype/hosts/nuke/startup/custom_write_node.py index 9628876d0a..ff4a3a41eb 100644 --- a/openpype/hosts/nuke/startup/custom_write_node.py +++ b/openpype/hosts/nuke/startup/custom_write_node.py @@ -61,7 +61,7 @@ knobs_setting = { class WriteNodeKnobSettingPanel(nukescripts.PythonPanel): """ Write Node's Knobs Settings Panel """ def __init__(self): - nukescripts.PythonPanel.__init__(self,"Set Knobs Value(Write Node)") + nukescripts.PythonPanel.__init__(self, "Set Knobs Value(Write Node)") preset_name, _ = self.get_node_knobs_setting() # create knobs From c920b0ac5accb84982e0bf61d903c9ddc06b701a Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Tue, 20 Jun 2023 19:22:28 +0800 Subject: [PATCH 23/41] rename the variable and clean up the code --- .../hosts/nuke/startup/custom_write_node.py | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/openpype/hosts/nuke/startup/custom_write_node.py b/openpype/hosts/nuke/startup/custom_write_node.py index ff4a3a41eb..007971fc27 100644 --- a/openpype/hosts/nuke/startup/custom_write_node.py +++ b/openpype/hosts/nuke/startup/custom_write_node.py @@ -74,24 +74,29 @@ class WriteNodeKnobSettingPanel(nukescripts.PythonPanel): def process(self): """ Process the panel values. """ write_selected_nodes = [ - s for s in nuke.selectedNodes() if s.Class() == "Write"] + selected_nodes for selected_nodes in nuke.selectedNodes() + if selected_nodes.Class() == "Write"] - node_knobs = self.selected_preset_name.value() + selected_preset = self.selected_preset_name.value() ext = None knobs = knobs_setting["knobs"] - preset_name, node_knobs_settings = ( - self.get_node_knobs_setting(node_knobs) + preset_name, node_knobs_presets = ( + self.get_node_knobs_setting(selected_preset) ) - if node_knobs and preset_name: - if not node_knobs_settings: - nuke.message("No knobs value found in subset group..\nDefault setting will be used..") # noqa + if selected_preset and preset_name: + if not node_knobs_presets: + nuke.message( + "No knobs value found in subset group.." + "\nDefault setting will be used..") else: - knobs = node_knobs_settings + knobs = node_knobs_presets ext_knob_list = [knob for knob in knobs if knob["name"] == "file_type"] if not ext_knob_list: - nuke.message("ERROR: No file type found in the subset's knobs.\nPlease add one to complete setting up the node") # noqa + nuke.message( + "ERROR: No file type found in the subset's knobs." + "\nPlease add one to complete setting up the node") return else: for knob in ext_knob_list: @@ -117,24 +122,24 @@ class WriteNodeKnobSettingPanel(nukescripts.PythonPanel): write_node["file"].setValue(file_path) set_node_knobs_from_settings(write_node, knobs) - def get_node_knobs_setting(self, value=None): + def get_node_knobs_setting(self, selected_preset=None): preset_name = [] knobs_nodes = [] settings = [ - node - for node in get_nuke_imageio_settings()["nodes"]["overrideNodes"] + node_settings + for node_settings in get_nuke_imageio_settings()["nodes"]["overrideNodes"] + if node_settings["nukeNodeClass"] == "Write" and node_settings["subsets"] ] if not settings: return for i, _ in enumerate(settings): - if value in settings[i]["subsets"]: + if selected_preset in settings[i]["subsets"]: knobs_nodes = settings[i]["knobs"] for setting in settings: - if setting["nukeNodeClass"] == "Write" and setting["subsets"]: - for knob in setting["subsets"]: - preset_name.append(knob) + for subset in setting["subsets"]: + preset_name.append(subset) return preset_name, knobs_nodes From 3da8dcc7fea93a0b844121acce82ef6803f3f275 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Tue, 20 Jun 2023 19:23:32 +0800 Subject: [PATCH 24/41] hound fix --- openpype/hosts/nuke/startup/custom_write_node.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/nuke/startup/custom_write_node.py b/openpype/hosts/nuke/startup/custom_write_node.py index 007971fc27..2052a5a09e 100644 --- a/openpype/hosts/nuke/startup/custom_write_node.py +++ b/openpype/hosts/nuke/startup/custom_write_node.py @@ -126,8 +126,8 @@ class WriteNodeKnobSettingPanel(nukescripts.PythonPanel): preset_name = [] knobs_nodes = [] settings = [ - node_settings - for node_settings in get_nuke_imageio_settings()["nodes"]["overrideNodes"] + node_settings for node_settings + in get_nuke_imageio_settings()["nodes"]["overrideNodes"] if node_settings["nukeNodeClass"] == "Write" and node_settings["subsets"] ] if not settings: From 7d99e8c8cf8941e6856e669dfe5134e8a71983fc Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Tue, 20 Jun 2023 19:24:41 +0800 Subject: [PATCH 25/41] hound fix --- openpype/hosts/nuke/startup/custom_write_node.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openpype/hosts/nuke/startup/custom_write_node.py b/openpype/hosts/nuke/startup/custom_write_node.py index 2052a5a09e..ea53725834 100644 --- a/openpype/hosts/nuke/startup/custom_write_node.py +++ b/openpype/hosts/nuke/startup/custom_write_node.py @@ -128,7 +128,8 @@ class WriteNodeKnobSettingPanel(nukescripts.PythonPanel): settings = [ node_settings for node_settings in get_nuke_imageio_settings()["nodes"]["overrideNodes"] - if node_settings["nukeNodeClass"] == "Write" and node_settings["subsets"] + if node_settings["nukeNodeClass"] == "Write" + and node_settings["subsets"] ] if not settings: return From 9cc22939794fb1710c43ca7df28e16f81b07617d Mon Sep 17 00:00:00 2001 From: Ondrej Samohel Date: Tue, 20 Jun 2023 14:04:17 +0200 Subject: [PATCH 26/41] :recycle: make code compatible with 3dsmax 2022 python 3.7 in 3dsmax 2022 is not supporting walrus operator --- openpype/hosts/max/api/plugin.py | 4 +++- .../hosts/max/plugins/create/create_render.py | 3 ++- .../publish/validate_camera_contents.py | 3 ++- .../publish/validate_model_contents.py | 3 ++- .../plugins/publish/validate_pointcloud.py | 19 ++++++++++++------- 5 files changed, 21 insertions(+), 11 deletions(-) diff --git a/openpype/hosts/max/api/plugin.py b/openpype/hosts/max/api/plugin.py index 4c1dbb2810..71a0b94e1f 100644 --- a/openpype/hosts/max/api/plugin.py +++ b/openpype/hosts/max/api/plugin.py @@ -207,7 +207,9 @@ class MaxCreator(Creator, MaxCreatorBase): """ for instance in instances: - if instance_node := rt.GetNodeByName(instance.data.get("instance_node")): # noqa + instance_node = rt.GetNodeByName( + instance.data.get("instance_node")) + if instance_node: count = rt.custAttributes.count(instance_node) rt.custAttributes.delete(instance_node, count) rt.Delete(instance_node) diff --git a/openpype/hosts/max/plugins/create/create_render.py b/openpype/hosts/max/plugins/create/create_render.py index 41e49f4620..235046684e 100644 --- a/openpype/hosts/max/plugins/create/create_render.py +++ b/openpype/hosts/max/plugins/create/create_render.py @@ -24,7 +24,8 @@ class CreateRender(plugin.MaxCreator): instance_data, pre_create_data) container_name = instance.data.get("instance_node") - if sel_obj := self.selected_nodes: + sel_obj = self.selected_nodes + if sel_obj: # set viewport camera for rendering(mandatory for deadline) RenderSettings(self.project_settings).set_render_camera(sel_obj) # set output paths for rendering(mandatory for deadline) diff --git a/openpype/hosts/max/plugins/publish/validate_camera_contents.py b/openpype/hosts/max/plugins/publish/validate_camera_contents.py index 85be5d59fa..ab13e5dc05 100644 --- a/openpype/hosts/max/plugins/publish/validate_camera_contents.py +++ b/openpype/hosts/max/plugins/publish/validate_camera_contents.py @@ -18,7 +18,8 @@ class ValidateCameraContent(pyblish.api.InstancePlugin): "$Physical_Camera", "$Target"] def process(self, instance): - if invalid := self.get_invalid(instance): # noqa + invalid = self.get_invalid(instance) + if invalid: raise PublishValidationError(("Camera instance must only include" "camera (and camera target). " f"Invalid content {invalid}")) diff --git a/openpype/hosts/max/plugins/publish/validate_model_contents.py b/openpype/hosts/max/plugins/publish/validate_model_contents.py index 1ec08d9c5f..cfe016f03f 100644 --- a/openpype/hosts/max/plugins/publish/validate_model_contents.py +++ b/openpype/hosts/max/plugins/publish/validate_model_contents.py @@ -18,7 +18,8 @@ class ValidateModelContent(pyblish.api.InstancePlugin): label = "Model Contents" def process(self, instance): - if invalid := self.get_invalid(instance): # noqa + invalid = self.get_invalid(instance) + if invalid: raise PublishValidationError(("Model instance must only include" "Geometry and Editable Mesh. " f"Invalid types on: {invalid}")) diff --git a/openpype/hosts/max/plugins/publish/validate_pointcloud.py b/openpype/hosts/max/plugins/publish/validate_pointcloud.py index e1c2151c9d..1ff6eb126f 100644 --- a/openpype/hosts/max/plugins/publish/validate_pointcloud.py +++ b/openpype/hosts/max/plugins/publish/validate_pointcloud.py @@ -35,12 +35,16 @@ class ValidatePointCloud(pyblish.api.InstancePlugin): """ report = [] - if invalid := self.get_tyflow_object(instance): # noqa - report.append(f"Non tyFlow object found: {invalid}") - if invalid := self.get_tyflow_operator(instance): # noqa - report.append( - f"tyFlow ExportParticle operator not found: {invalid}") + invalid_object = self.get_tyflow_object(instance) + if invalid_object: + report.append(f"Non tyFlow object found: {invalid_object}") + + invalid_operator = self.get_tyflow_operator(instance) + if invalid_operator: + report.append(( + "tyFlow ExportParticle operator not " + f"found: {invalid_operator}")) if self.validate_export_mode(instance): report.append("The export mode is not at PRT") @@ -49,9 +53,10 @@ class ValidatePointCloud(pyblish.api.InstancePlugin): report.append(("tyFlow Partition setting is " "not at the default value")) - if invalid := self.validate_custom_attribute(instance): # noqa + invalid_attribute = self.validate_custom_attribute(instance) + if invalid_attribute: report.append(("Custom Attribute not found " - f":{invalid}")) + f":{invalid_attribute}")) if report: raise PublishValidationError(f"{report}") From b94b7ff5de4af8b27a171bfae5c88c0ea46d4d70 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 20 Jun 2023 16:50:49 +0200 Subject: [PATCH 27/41] backward compatibility fix studio could have set host config paths but those were not resolving to custom config OCIO environment path. Instead it was always falling back to global ocio config paths settings --- openpype/pipeline/colorspace.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/openpype/pipeline/colorspace.py b/openpype/pipeline/colorspace.py index 1999ad3bed..13846e9f5c 100644 --- a/openpype/pipeline/colorspace.py +++ b/openpype/pipeline/colorspace.py @@ -377,6 +377,10 @@ def get_imageio_config( activate_host_color_management = imageio_host.get( "activate_host_color_management", True) + # TODO: remove this in future - backward compatibility + if activate_host_color_management is None: + activate_host_color_management = host_ocio_config.get("enabled", False) + if not activate_host_color_management: # if host settings are disabled return False because # it is expected that no colorspace management is needed From 6f8d47d36bfb948a09bd79891c739d7179579cc3 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 20 Jun 2023 16:52:03 +0200 Subject: [PATCH 28/41] nuke: user prompt if config path changes environment variable cannot be changed dynamically and user should now that settings had been changed and the nuke should be reopened. --- openpype/hosts/nuke/api/lib.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/openpype/hosts/nuke/api/lib.py b/openpype/hosts/nuke/api/lib.py index c05182ce97..e3b34222d4 100644 --- a/openpype/hosts/nuke/api/lib.py +++ b/openpype/hosts/nuke/api/lib.py @@ -2069,6 +2069,35 @@ class WorkfileSettings(object): log.debug("nuke.root()['{}'] changed to: {}".format( knob, value_)) + # set ocio config path + if config_data: + current_ocio_path = os.getenv("OCIO") + if current_ocio_path != config_data["path"]: + message = """ +It seems like there's a mismatch between the OCIO config path set in your Nuke +settings and the actual path set in your OCIO environment. + +To resolve this, please follow these steps: +1. Close Nuke if it's currently open. +2. Reopen Nuke. + +Please note the paths for your reference: + +- The OCIO environment path currently set: + `{env_path}` + +- The path in your current Nuke settings: + `{settings_path}` + +Reopening Nuke should synchronize these paths and resolve any discrepancies. +""" + nuke.message( + message.format( + env_path=current_ocio_path, + settings_path=config_data["path"] + ) + ) + def set_writes_colorspace(self): ''' Adds correct colorspace to write node dict From a5b93a9062dc957b06f1b99e10b0298318bda909 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Tue, 20 Jun 2023 16:30:44 +0100 Subject: [PATCH 29/41] Copy shading assignments. --- openpype/hosts/maya/plugins/publish/extract_xgen.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/openpype/hosts/maya/plugins/publish/extract_xgen.py b/openpype/hosts/maya/plugins/publish/extract_xgen.py index fb097ca84a..17b60e3108 100644 --- a/openpype/hosts/maya/plugins/publish/extract_xgen.py +++ b/openpype/hosts/maya/plugins/publish/extract_xgen.py @@ -88,6 +88,18 @@ class ExtractXgen(publish.Extractor): delete_bin.append(palette) + # Copy shading assignments. + nodes = ( + instance.data["xgmDescriptions"] + + instance.data["xgmSubdPatches"] + ) + for node in nodes: + target_node = node.split(":")[-1] + shading_engine = cmds.listConnections( + node, type="shadingEngine" + )[0] + cmds.sets(target_node, edit=True, forceElement=shading_engine) + # Export duplicated palettes. xgenm.exportPalette(palette, xgen_path) From 8d621f9fbfb962fcde09c97bdc09080f7f0370cd Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Tue, 20 Jun 2023 17:42:34 +0100 Subject: [PATCH 30/41] Fix patches export. --- openpype/hosts/maya/plugins/publish/extract_workfile_xgen.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/maya/plugins/publish/extract_workfile_xgen.py b/openpype/hosts/maya/plugins/publish/extract_workfile_xgen.py index 20e1bd37d8..0d2a97bc4b 100644 --- a/openpype/hosts/maya/plugins/publish/extract_workfile_xgen.py +++ b/openpype/hosts/maya/plugins/publish/extract_workfile_xgen.py @@ -57,7 +57,7 @@ class ExtractWorkfileXgen(publish.Extractor): continue render_start_frame = instance.data["frameStart"] - render_end_frame = instance.data["frameStart"] + render_end_frame = instance.data["frameEnd"] if start_frame is None: start_frame = render_start_frame From b18b44fd984112e9815811b474205a7923d6e7d9 Mon Sep 17 00:00:00 2001 From: Ynbot Date: Wed, 21 Jun 2023 03:25:18 +0000 Subject: [PATCH 31/41] [Automated] Bump version --- openpype/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/version.py b/openpype/version.py index 9c5a60964b..3a218f3a06 100644 --- a/openpype/version.py +++ b/openpype/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring Pype version.""" -__version__ = "3.15.11-nightly.3" +__version__ = "3.15.11-nightly.4" From 588148cb9f92b824d15cd055f93e006c931b8559 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 21 Jun 2023 03:26:01 +0000 Subject: [PATCH 32/41] chore(): update bug report / version --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 2fd2780e55..203ac1df23 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -35,6 +35,7 @@ body: label: Version description: What version are you running? Look to OpenPype Tray options: + - 3.15.11-nightly.4 - 3.15.11-nightly.3 - 3.15.11-nightly.2 - 3.15.11-nightly.1 @@ -134,7 +135,6 @@ body: - 3.14.3 - 3.14.3-nightly.7 - 3.14.3-nightly.6 - - 3.14.3-nightly.5 validations: required: true - type: dropdown From 7dd30b505d267074af625c1b24175e8e8a51df7e Mon Sep 17 00:00:00 2001 From: Toke Jepsen Date: Wed, 21 Jun 2023 08:16:53 +0100 Subject: [PATCH 33/41] Update openpype/hosts/maya/plugins/publish/collect_xgen.py Co-authored-by: Roy Nieterau --- openpype/hosts/maya/plugins/publish/collect_xgen.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/collect_xgen.py b/openpype/hosts/maya/plugins/publish/collect_xgen.py index e7c730cbf4..46968f7d1a 100644 --- a/openpype/hosts/maya/plugins/publish/collect_xgen.py +++ b/openpype/hosts/maya/plugins/publish/collect_xgen.py @@ -35,8 +35,7 @@ class CollectXgen(pyblish.api.InstancePlugin): connected_transform = get_attribute_input( node + ".transform" ).split(".")[0] - if connected_transform not in data["xgenConnections"]: - data["xgenConnections"].add(connected_transform) + data["xgenConnections"].add(connected_transform) # Collect all files under palette root as resources. import xgenm From c18afe974bee2e9e8a4bd59c97fda6098b8910e8 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 21 Jun 2023 16:27:17 +0800 Subject: [PATCH 34/41] remove unused text files --- igniter/.ass | 212 --------------------------------------------------- 1 file changed, 212 deletions(-) delete mode 100644 igniter/.ass diff --git a/igniter/.ass b/igniter/.ass deleted file mode 100644 index 599a76d732..0000000000 --- a/igniter/.ass +++ /dev/null @@ -1,212 +0,0 @@ -### exported: Thu Jun 15 17:07:53 2023 -### from: Arnold 7.1.3.2 [2a385cac] windows clang-10.0.1 oiio-2.4.1 osl-1.12.0 vdb-7.1.1 adlsdk-6.3.1.44 clmhub-2.0.0.235 rlm-14.1.3 optix-6.6.0 2022/09/12 08:50:17 -### host app: MtoA 5.2.1.1 6a048927 (fix-5.2.1) Maya 2023 -### bounds: -1.207354 -0.269835 -1.207354 1.207354 2.144874 1.207354 -### user: Kayla -### render_layer: defaultRenderLayer -### scene: D:/dummy_test/test_Project/test/work/test_v002/test_project_test_test_v002_v070.mb -### meters_per_unit: 0.010000 - - - -options -{ - AA_samples 3 - outputs 4 1 STRING - "RGBA RGBA defaultArnoldFilter/gaussian_filter defaultArnoldDriver/driver_exr.RGBA" - "P VECTOR aiAOVFilter1/closest_filter defaultArnoldDriver/driver_exr.RGBA" - "Pref RGB aiAOVFilter2/closest_filter defaultArnoldDriver/driver_exr.RGBA" - "albedo RGB defaultArnoldFilter/gaussian_filter defaultArnoldDriver/driver_exr.RGBA" - xres 1920 - yres 1080 - texture_per_file_stats on - texture_searchpath "[OPENPYPE_PROJECT_ROOT_WORK];D:/dummy_test/test_Project/test/work/test_v002/sourceimages" - texture_automip off - camera "/camera1/cameraShape1" - color_manager "defaultColorMgtGlobals" - operator "aiMerge1" - meters_per_unit 0.00999999978 - frame 1 - fps 25 - procedural_searchpath "[OPENPYPE_PROJECT_ROOT_WORK];D:/dummy_test/test_Project/test/work/test_v002/" - GI_diffuse_depth 1 - GI_specular_depth 1 - GI_transmission_depth 8 - declare render_layer constant STRING - render_layer "defaultRenderLayer" -} - -gaussian_filter -{ - name defaultArnoldFilter/gaussian_filter -} - -driver_exr -{ - name defaultArnoldDriver/driver_exr.RGBA - filename "D:/dummy_test/test_Project/test/work/test_v002/renders/test_project_test_test_v002_v070/masterLayer/masterLayer.exr" - color_space "" -} - -closest_filter -{ - name aiAOVFilter1/closest_filter -} - -closest_filter -{ - name aiAOVFilter2/closest_filter -} - -merge -{ - name aiMerge1 - inputs "test_01_:string_replace_operator" -} - -string_replace -{ - name test_01_:string_replace_operator - selection "*.(@node=='alembic')" - match "resources/test_project_test_modelMain_v067_proxy.abc" - replace "test_project_test_modelMain_v067.abc" -} - -color_manager_ocio -{ - name defaultColorMgtGlobals - config "D:/maya_config/OCIO-configs/Maya2022-default/config.ocio" - color_space_linear "ACEScg" -} - -polymesh -{ - name /proxy/pSphere/pSphereShape - visibility 255 - sidedness 255 - matrix - 2.41470838 0 0 0 - 0 2.41470838 0 0 - 0 0 2.41470838 0 - 0 0.937519372 0 1 - shader "lambert1" - id 2564139679 - nsides 6 1 UINT -4 4 4 4 4 4 - vidxs 24 1 b85UINT -B$ZuK*%:$$-?2$vMr4%:&UObB$w/J=(3BP? - vlist 8 1 b85VECTOR -aDq99aDq9989+]c89+]caDq9989+]caDq99!89+]c$$$$)aDq9989+]caDq9989+]c89+]c!aDq99$$$$(89+]caDq99aDq99 - nlist 24 1 b85VECTOR -zzyzzyzzyzzyzyzzyzzyzzy!$$$$$$$$$'aRT=dzzaRT=dzzaRT=dzzaRT=dzaRT=dzzaRT=dzzaRT=dzzaRT=dzyzzyzzyzzyzzaRT=dzzaRT=dzzaRT=dzzaRT=dzz - uvlist 14 1 b85VECTOR2 -82:0xz80l$K@wi$mMpJ$pnKs$PHvV$PKhS$rXa4$v$<]$USg@$UVY=$wcQs%&/-G$Z^X*$ZaJ'%'nB]%+9s1$_iHi$_l:f%-$3G%0Dcp$dt9S$dw+P%2/$1$h@,s$j**=$j,q:%79ip%:ZED$o4p'$o7b$%j%8uiM%8x[J%[0T+%^Q/T%>+Z7%>.L4%`;Dj%c[u>%C6Jv%C9%mqVg%ML,J%MNsG%o[l(%s'GQ%RVr4%RYd1%tf\g%x28;%5U-2%WdT\&$qMQ&(=)%%\lS]%\oEZ&*'>;&-Gnd%awDG%b%6D&/2/%&2R_N%g-51%g0'.&4RV8&As1a%vM\D%vPNA&C]Fw&$nOd&&XM.&&[?+&Hh7a&L3h5&+c=m&+f/j&Ms(K&Q>Xt&0n.W&0puT&S(n5&VII^&5xtA&6&f>&X3^t&[T:H&;.e+&;1W(&]>O^&`_+2&@9Uj&@x&jta[&JO7>&JR);&l^vq&p*RE&OZ((&O\o%&qig[&u5C/&Tdmg&Tg_d&vtXE'%@3n&Yo^Q&YrPN''*I/'*K$X&_%O;&_(A8',59n'/UjB&d0@%&d31w'1@*X'4`[,&G.Ox&i=wM'6JpB'9kKk&nEvN&nHhK';Ua,'>vb'VriE'Vu[B($*ai('N/L'\(Z/'\+L,()8Db(,Xu6'a3Jn'a6;X'fA-U(3N&6(6nV_'kI,B'kKs?(8Xku(<$GI'pSr,'pVd)(=c\_(A/83'u^bk'uaTh(BnMI(F:(r'X\ri(%lE>(H$>3(KDn\(*tD?(*w6<(M/.r(PO_F(0*5)(0-'&(R9t\(UZP0(55%h(57le(WDeF(Ze@o(:?kR(:B]O(\OV0(_p1Y(?J\<(?MN9(aZFo(e%wC(DUM&(DX>x(fe7Y(Gv@F(I`=e(Ic/b(kp(C(o;Xl(Nk.O(NmuL(q%n-(tFIV(Sut9(Sxf6(v0^l)$Q:@(Y+dx(Y.Vu)&;OV))\+*(^6Ub(^9G_)+F@@).fpi(cAFL(cD8I)0Q1*)3qaS(hL76(hO)3)5Y/Z)9'R=(mW'u(mYnr):fgS)>2C'(ram_(rd_\)?qX=)C=3f(wl^I(woPF)E'I')HH$P)'wO3)(%A0)J29f)MRj:)--?r)-01o)O=*P)R][$)280\)2:wY)TGp:)WhKc(j6@Z)7Eh/)YRa$)\sc`)Kn9C)Kq+@)n(xv)qITJ)Q$*-)Q&q*)s3i`)vTE4)V.ol)V1ai)x>ZJ)YOc7)[9`V)[Z)toi=)tr[:*B*Sp*EK/D*%%Z'*%(L$*G2RK*JUu.**0Jf**3-M*QK&.*TkVW*4F,:*4Hs7*VUkm*YvGA*9Pr$*9Scv*[`\W*_,8+*>[bc*>^T`*`kMA*d7(j*CfSM*CiEJ*ev>+*iAnT*&dcK*Ht5u*k,.j*nL_>*N'4v*N*&s*p6tT*sWP(*S2%`*S4l]*uAe>*xb@g*Xp+/b7Q+3-h%*g]=]*g`/Z+4m(;*k)1(*lh.G*ljuD+9wn%+=CIN*qrt1*quf.+?-^d+BN:8*w(dp*w+Vm+D8ON+GY*w+'3UZ+'6GW+IC@8+Lcpa+,>FD+,A8A+NN0w+QnaK+1I7.+1L)++SXva+W$R5+6T'm+6Vnj+X`u<+Yj%R+Yj1W+Yj=\+YjIa+YjUf+Yjak+Yjmp+Yk$u+Yk1%+Yk=*+YkI/+YkU4+Yka9+Ykm>+Yl$C+Yl0H+Yl$GoW-$IVb>$IVnF$K>Tg$R08V$SlCg$SlOo$UT6;$\Eo*$^-%;$^-1C$_ild$f[PS$$)E7$)3rI$j*)Y$ka82$/uZ&$0%nh$mMp;$plM,$:6;M$:;,-$rXa($uwb%$DKqs$DP>G$wcQj%&-vs$NaSD$NePa%'nBW%+96l$Xw4j$Y%c&%-$3D%0DKe$c7k;$c:u@%2/$1$j$j?$hC+1$hEr-%5R^`%:ZED$o4p'$o7b$%+Z7%>.L4%`;Dj%c[u>%C6Jv%C9%mqVg%ML,J%MNsG%o[l(%s'GQ%RVr4%RYd1%tf\g%x28;%7<8B%YK_m&&XL\&(=)$%\lS\%\oEZ&*'>;&-Gnd%awDG%b%6D&/2/%&2R_N%g-51%g0'.&4RV8&As1a%vM\D%vPNA&C]Fw&&Ufx&$qMw&$t?s&G,,Q&L3h5&+c=m&+f/j&Ms(K&Q>Xt&0n.W&0puT&S(n5&VII^&5xtA&6&f>&X3^t&[T:H&;.e+&;1W(&]>O^&`_+2&@9Uj&@vb'VriE'Vu[B($*mn(%fm9'\(N,'\+@(()8Db(,Xu6'a3Jn'a6;X'fA-U(3N&6(6nV_'kI,B'kKs?(8Xku(<$GI'pSr,'pVd)(=c\_(A/83'u^bk'uaTh(BnMI(F:(r'ZD)$('SPO(I`=>(KDn[(*tD>(*w6<(M/.r(PO_F(0*5)(0-'&(R9t\(UZP0(55%h(57le(WDeF(Ze@o(:?kR(:B]O(\OV0(_p1Y(?J\<(?MN9(aZFo(e%wC(DUM&(DX>x(fe7Y(I]WZ(H$>Y(H'0U(j3r3(o;Xl(Nk.O(NmuL(q%n-(tFIV(Sut9(Sxf6(v0^l)$Q:@(Y+dx(Y.Vu)&;OV))\+*(^6Ub(^9G_)+F@@).fpi(cAFL(cD8I)0Q1*)3qaS(hL76(hO)3)5Y;_)7@;*(mVpr(mYbn):fgS)>2C'(ram_(rd_\)?qX=)C=3f(wl^I(woPF)E'I')HH$P)'wO3)(%A0)J29f)MRj:)--?r)-01o)O=*P)R][$)280\)2:wY)TGp:)WhKc(krKj)9,s@)[9`/)\sc`)Kn9C)Kq+@)n(xv)qITJ)Q$*-)Q&q*)s3i`)vTE4)V.ol)V1ai)x>ZJ)[7%K)YRaJ)YUSF*&b@$*+j&])`DQ@)`GC=*-T;s*0tlG)eOB*)eR4'*2_,]*6*]1)jZ2i)j]$f*7irG*;5Mp)odxS)ogjP*Z)toi=)tr[:*B*Sp*EK/D*%%Z'*%(L$*G2^P*Hn]p**0>c**30_*L@5D*O`em*/;;P*/>-M*QK&.*TkVW*4F,:*4Hs7*VUkm*YvGA*9Pr$*9Scv*[`\W*_,8+*>[bc*>^T`*`kMA*d7(j*CfSM*CiEJ*ev>+*iAnT*(Kn[*J[A1*lh-u*nL_=*N'4u*N*&s*p6tT*sWP(*S2%`*S4l]*uAe>*xb@g*Xp+/b7Q+3-h%*g]=]*g`/Z+4m(;*leH<*k,/;*k.v7+8;bj+=CIN*qrt1*quf.+?-^d+BN:8*w(dp*w+Vm+D8ON+GY*w+'3UZ+'6GW+IC@8+Lcpa+,>FD+,A8A+NN0w+QnaK+1I7.+1L)++SXva+W$R5+6T'm+6Vnj+Xa,A+Yj%R+Yj1Y+YjUg+Yjmq+Yk1&+YkI0+Yka:+Yl$D+YlHN$N^ls$,R7G$,U5H$PI98$Si]]$1](1$1`&2$UT)w$XtNG$6gmp$6jkq$Z^oa$^*?1$;r^Z$;u\[$_i`K$c5/p$A(OD$A+ME$dtQ5$h?uZ$F3@.$GrI?$kfY4$o2(Y$M%H-$M(F.$pqIs$t'W%&2+G%)ROl$\Eo@$\HmA%++Z8%>.X9%aw\)%eC+N%C6Jw%C9Hx%g-Lh%jMq8%HA;a%HD9b%l8=R%oXaw%ML,K%MO*L%qC.<%tcRa%RVr5%RYp6%vMt&&$nCK%Wabt%Wd`u&&Xde&*$45%\lS^%^V\o&-Jld&0k<4%c^[]%caY^&2U]N&5v,s%hiLG%hlJH&7`N8&;+r]%mt=1%mw;2&w&@6cG%s*-p%s-+q&Av/a&EAT1%x4sZ%x7q[&G+uK&JLDp&(?dD&(BbE&L6f5&OW5Z&/1lB&/4jD&S(n4&VI=Y&4<]-&4?[.&X3^s&[T.C&9GMl&9JKm&]>O]&`^t-&>R>V&>U''3'Al'6Gf<&i;0e&i>.f'822V';RW&&nEvO&nHtP'=xwt'?&uu'bp$e'f;I5'Ek*r'En(t'ib,d'm-Q4'Jup]'Jxn^'nlrN'r8As'P+aG'P._H'swc8'wC2]'U6R1'U9P2($-Sw('MxG'ZABp'ZD@q()8Da(,Xi1'_L3Z'_O1[(.C5K(1cYp'dW$D'dYwE(3N&5(8Uao'kI,C'kL*D(:@.4(=`RY'pSr-'pVp.(?Jss(BkCC'u^bl'ua`m(DUd](Gv4-(%iSV(%lQW(I`UG(M,$l(*tD@(*wBA(NkF1(R6jV(0*5*(0-3+(Sv6p(WA[@(55%i(6t/%(Zh>o(^3c?(<'-h(<*+i(_s/Y(c>T)(A1sR(A4qS(e(uC(hIDh(FVl(r_&<(PREe(PUCf(tIGV(wil&(U]6O(U`4P)$T8@)'t\e(\O>M(\R26w(q%VK(q(TL)?qX<)C='a(v0G5(v3E6)E'I&)HGmK)&;7t)&>5u)J29e)O9uJ)--?s)-0=t)Q$Ad)TDf4)280])2;.^)V/2N)YOVs)7BvG)7EtH)[9x8)^ZG])Xp@)s3R()s6P**B*So*EJx?)x>Bh)xA@i*G5DY*JUi)*(I3R*(L1S*L@5C*O`Yh*-T$<*-Vw=*QK&-*TkJR*2^j&*2ah'*VUkl*Yv;<*7iZe*7lXf*[`\V*_,,&*[8*S2%a*S4xb*w)'R+%IKw*X^&+/_-K*bRLt*d1+.%]Z+.([[+Qq_K+U=.p+4leX+4ocZ+XcgJ+\/6o+9wVC+:%TD+]nX4+a:'Y+?-G-+?0E.+c$Hs+fDmC+D87l+D;5m+h/9]+kO^-+IC(V+IF&W+m:*G+pZNl+NMn@+NPlA+rDp1+ue?V+SX_*+S[]++wO`p,%:P.,&vgC,(^)X,*E@m,,,X-,-hoB,/P1W,17Hl,2s`,,4ZwA,6B9V,8)Pk,9eh+,;M*@,=4AU,>pXj,@Wp*,B?2?,D&IT,Eb`i,H'r1,Id4F,KKK[,M2bp,No%0,PVaQ7[Aa/f5)7xuYSaQ7[Aa794h7l?EtaQ7[Aa9['fzaQ7[Aa:L<8`x/vJaQ7[Aa9['ea/f5'aQ7[Aa794fa794faQ7[Aa/f5&a9['caQ7[A`x/vGa:L<5aQ7[Aza9['caQ7[A7l?Eqa794eaQ7[A7xuYOa/f5%aQ7[A8+HY:`x/vGaQ7[A8-jL7]8wuQaQ7[A8.[`^7l?EmaQ7[A8-jL67xuYLaQ7[A8+HY98+HY8aQ7[A7xuYM8-jL6aQ7[A7l?En8.[`]aQ7[Az85BheaOV5ba+:2Y81k?taOV5ba82J)8,AnSaOV5ba=[pI7tIW-aOV5baA3D9zaOV5baBETaa+:2XaOV5baA3D8a82J'aOV5ba=[pFa=[pEaOV5ba82J&aA3D6aOV5ba+:2UaBET^aOV5bzaA3D6aOV5b7tIW*a=[pDaOV5b8,AnOa82J%aOV5b81k?na+:2UaOV5b85Bh^]@q8xaOV5b86U$17tIW(aOV5b85Bh]8,AnMaOV5b81k?m81k?laOV5b8,AnN85Bh\aOV5b7tIW)86U$/aOV5bz8:_aQaMAiaa/f5)87d&JaMAiaa,;a/f5(aMAiaaFP=%a,8aMAiazaFPcW<8'x-gaJT2f8=h8A84LjgaJT2f8;)%18;)%1aJT2f84Lji8=h8@aJT2f8'x-i8>cW;aJT2fz8@J=naG>,6a794h8=>KTaG>,6aCTVt87d&IaG>,6aI/')8+HY,6aL:nBzaG>,6aMAiga794gaG>,6aL:nAaCTVqaG>,6aI/''aI/'&aG>,6aCTVoaL:n?aG>,6a794eaMAidaG>,6zaL:n?aG>,68+HY:aI/'%aG>,687d&CaCTVnaG>,68=>KNa794eaG>,68@J=g]KmN*aG>,68AQ988+HY7aG>,68@J=g87d&@aG>,68=>KM8=>KMaG>,687d&A8@J=faG>,68+HY88AQ96aG>,6z8BUCkaBETZa8YmK8?.MqaBETZaES@889bdbaBETZaJt)F8,iza-&.3aR7`ga::XDa-&.3aPqK=aG-,<8;MPfzaMAii8.[`bzaQ7[IzzaRT=ha:L<8zaQ7[HaG>,:zaMAifaMAiezaG>,9aQ7[Eza:L<5aRT=fzzaQ7[Ez8.[`_aMAidz8;MPbaG>,8z8AQ98a:L<5z8EG*m]Q*w-z8Fcb:8.[`\z8EG*l8;MP`z8AQ978AQ96z8;MPa8EG*kz8.[`]yzz8E+oj7v5R]a::XE8A:.B7v5R]aG-z7v5R]aR7`ga::XD7v5R]aPqK=aG-KT8;MP`aCTVt87d&I8;MP`aI/')8+HY<8;MP`aL:nBz8;MP`aMAiga794g8;MP`aL:nAaCTVq8;MP`aI/''aI/'&8;MP`aCTVoaL:n?8;MP`a794eaMAid8;MP`zaL:n?8;MP`8+HY:aI/'%8;MP`87d&CaCTVn8;MP`8=>KNa794e8;MP`8@J=g]KmN*8;MP`8AQ988+HY78;MP`8@J=g87d&@8;MP`8=>KM8=>KM8;MP`87d&A8@J=f8;MP`8+HY88AQ968;MP`z8=h8G8>cW;a3h^G8;)%78>cW;a@=FF84Ljp8>cW;aFnUa8'x-p8>cW;aIXhqz8>cW;aJT2la3h^F8>cW;aIXhpa@=FC8>cW;aFnU_aFnU^8>cW;a@=FBaIXhn8>cW;a3h^AaJT2i8>cW;zaIXhn8>cW;8'x-kaFnU^8>cW;84Ljja@=F@8>cW;8;)%2a3h^A8>cW;8=h8A]I*l/8>cW;8>cW<8'x-g8>cW;8=h8A84Ljg8>cW;8;)%18;)%18>cW;84Lji8=h8@8>cW;8'x-i8>cW;8>cW;z8:_aQ8AQ96a/f5)87d&J8AQ96a,;a/f5(8AQ96aFP=%a,88AQ96zaFP8EG*ka/f5)7xuYS8EG*ka794h7l?Et8EG*ka9['fz8EG*ka:L<8`x/vJ8EG*ka9['ea/f5'8EG*ka794fa794f8EG*ka/f5&a9['c8EG*k`x/vGa:L<58EG*kza9['c8EG*k7l?Eqa794e8EG*k7xuYOa/f5%8EG*k8+HY:`x/vG8EG*k8-jL7]8wuQ8EG*k8.[`^7l?Em8EG*k8-jL67xuYL8EG*k8+HY98+HY88EG*k7xuYM8-jL68EG*k7l?En8.[`]8EG*kz7uCHt8FG04`jc&P7rt'w8FG04`wC3.7kRWX8FG04a)dXM7^rJx8FG04a,4$Iz8FG04a-&.?`jc&N8FG04a,4$H`wC3,8FG04a)dXKa)dXJ8FG04`wC3*a,4$F8FG04`jc&Ka-&.=8FG04za,4$F8FG047^rJua)dXJ8FG047kRWS`wC3)8FG047rt's`jc&K8FG047uCHo]+QgX8FG047v5Re7^rJq8FG047uCHn7kRWQ8FG047rt'r7rt'r8FG047kRWR7uCHn8FG047^rJr7v5Rd8FG04zzaRT=dzzyz - nlist 382 1 b85VECTOR -8$sL?aR%6>`p]C(7vj/8aR%6>a($j&8,Oq4aQ$=Ea1Ba1j/2]ZEXpaQ$=Ea;iAh`p]BBaR%6?a0d'ta$guxaQ$=Da:rPna($inaR%6>a-Z`,a1B7dlgqa:rPoaQ$=C7mwEMa-Z_iaR%6?7q49%a8@LcaQ$=C8%Qa:a($iiaR%6@7vj/6a1B7dlgx8/,uEaQ$=A7mwE_8&$SXaR%6@5(Kln8/xfEaQ$=D4n,BY82U=faOAqMa8`53867kIaOAqLa+j;W8,oYWaOAqMa>En;7u$`;aOAqNaB(Fp]^u6:aOAqMaC>G8a+j;saOAqNaB(Fta8`55aOAqLa>En?a>En@aOAqMa8`51aB(FxaOAqMa+j;haC>G@aOAqK4Y^O1aB(G%aOAqK7u$`Fa>EnAaOAqK8,oY]a8`50aOAqL82U=ma+j;kaOAqJ867kP4J,])aOAqJ87Mkl7u$`FaOAqK867kM8,oY\aOAqK82U=k82U=jaOAqJ8,oYb867kOaOAqL7u$`@87MkgaOAqM4i*v)88;[taM-K^a%E_aJ@lva4+;Q84c;FaJ@luaG)&O8(:`VaJ@lsaIjv2]_U%E^]2IK3aJ@lr8>v_'8(:`caJ@lt8>%E]84c;QaJ@lq8;8K%8;8K$aJ@lq84c;K8>%E\aJ@lq8(:`W8>v_'aJ@lq5/=Vk8=HJ&aG,t^aCc,n8@V'DaG,t\a7@i]87rQ>aG,t]aI9%T8+P9HaG,t[aLFWk]hcZA7aG,tY8A]V-8+P9PaG,tY8@V'>87rQFaG,tY8=HJ'8=HJ)aG,tY87rQC8@V'@aG,tY8+P9K8A]V.aG,tY50&a>8?43^aB)a>aEWKc8B\)XaB)a?a8^5`89fp4aB)a@aK$d78,mZJaB)aDaNLZ)]Yd;iaB)aDaO]8ja8^6,aB)aDaNLZ'aEWKeaB)aCaK$d1aK$d5aB)aAaEWK_aNLZ(aB)aBa8^6$aO]8jaB)aG]SCosaNLZ'aB)aF8,mZOaK$d3aB)aD89fp8aEWKaaB)a@8?43_a8^6&aB)a>8B\)S4]4BYaB)a;8Cl]?8,mZTaB)a<8B\)S89fp6aB)a;8?43^8?43`aB)a<89fp78B\)TaB)a>8,mZP8Cl]AaB)a<52v)T8@LmMa:8ZwaFR128D3$9a:8Zwa9\x^8:aUXa:8[$aL=I&8-lHLa:8[&aOxT_]2EE>a:8[$aQ:iJa9]$-a:8ZxaOxT^aFR14a:8[%aL=HvaL=I&a:8[$aFR1/aOxT_a:8Zwa9]$&aQ:iJa:8[']Db/faOxT]a:8[&8-lHRaL=I$a:8Zp8:aU\aFR10a:8Zq8@LmPa9]$$a:8Zu8D3$44e9woa:8Zv8EJ8t8-lHUa:8Zx8D3$38:aU[a:8Zw8@LmN8@LmOa:8Zv8:aU[8D3$4a:8Zt8-lHP8EJ8wa:8Zq53XsU8A:e0a,fiLaG-dd8E,[,68EG*p\jrsaa:L;i8;MP]]I`mKaMAib8.[`S]I`mMaQ7[BzzaRT=da:L<;]I`mPaQ7[@aG>,:]H,4aQ7[A3_-C8a:L<2aRT=c\jrsa3leGaaQ7[?\xUx78.[`_aMAi_z8;MPbaG>,5]FmUA8AQ98a:L<.]LT0e8EG*kzz8Fcb88.[`^\jrsc8EG*k8;MPa\xUx<8AQ978AQ96\jrsc8;MP`8EG*kz8.[`_y3_-C453fkZ8A:e07uv8uaG-dd8E,[<7uv9&a:;,o8;=457uv9(aM+@]8.JQ\7uv9(aPr6cz7uv9$aR8OQa:;-?7uv9%aPr6`aG-dg7uv8waM+@WaM+@\7uv8taG-d`aPr6d7uv8ma:;-6aR8OR7uv8b4%`)+aPr6b7uv8a8.JQcaM+@Z7uv8j8;=49aG-db7uv8t8A:e0a:;-47uv8x8E,[74W=-`7uv9$8FGt&8.JQe7uv9$8E,[68;=487uv8v8A:e/8A:e07uv8w8;=488E,[97uv8t8.JQc8FGt&7uv8x53Dx68@LmM8.H*NaFR138D3$98.H*Na9\x^8:aUX8.H*OaL=I'8-lHL8.H*PaOxT_]2EE>8.H*OaQ:iJa9]$,8.H*NaOxT\aFR138.H*MaL=HvaL=I'8.H*MaFR1/aOxT_8.H*La9]$&aQ:iJ8.H*N]:)QhaOxT_8.H*L8-lHRaL=I$8.H*G8:aU\aFR108.H*F8@LmQa9]$$8.H*J8D3$44eYgJ8.H*K8EJ8t8-lHS8.H*M8D3$28:aU[8.H*M8@LmO8@LmO8.H*K8:aU[8D3$48.H*H8-lHP8EJ8w8.H*I52v;@8?43]8690laEWKc8B\)Y8690ka8^5`89fp48690laK$d68,mZL8690naNLZ*]Yd;i8690naO]8ja8^6+8690oaNLZ'aEWKe8690kaK$d1aK$d68690kaEWK_aNLZ*8690ma8^6&aO]8j8690m]OP%E^8>PPPPPPPPPPPPP%E^]2IK38>Pv_'8(:`c8>P%E]84c;N8>PP%E\8>Pv_(8>PEnF7u$`98CQ@vaB(Fs]`=mC8CQ@xaC>G6a+j;s8CQ@xaB(Foa8`548CQ@wa>En:a>En@8CQ@va8`5-aB(G$8CQ@wa+j;naC>G@8CQ@u4Y^O1aB(Fx8CQ@u7u$`Ua>En@8CQ@v8,oY]a8`518CQ@w82U=ia+j;l8CQ@t867kQ4I`qe8CQ@t87Mkp7u$`H8CQ@u867kP8,oY]8CQ@v82U=k82U=l8CQ@u8,oY`867kL8CQ@t7u$`F87Mkg8CQ@w4piDe8,Oq38E3ama1B=/8/,uC8E3ana$guO8%QaB8E3ala8@Lj7mwE<8E3aoa:rPi]ZEXp8E3aoa;iAaa$guw8E3aoa:rPfa1B0s7_[,H7uNfZ7_[,H8%v5I7_[,H8+HY87_[,H8.1k07_[,H80p((7_[,H83Y9u7_[,H86BKm7_[,H89+]d7_[,H8:Jf`7_[,H8;io\7_[,H8=3xX7_[,H8>S,T7_[,H8?r5P7_[,H8A<>L7_[,H8B[GH7_[,H8D%PD7_[,H8EDY@7_[,H8Fcb:7_[,Hz7m>0s7_[,H!7m>0s$$$$'7uNfZ7m>0s8%v5I7m>0s8+HY87m>0s8.1k07m>0s80p((7m>0s83Y9u7m>0s86BKm7m>0s89+]d7m>0s8:Jf`7m>0s8;io\7m>0s8=3xX7m>0s8>S,T7m>0s8?r5P7m>0s8A<>L7m>0s8B[GH7m>0s8D%PD7m>0s8EDY@7m>0s8Fcb:7m>0sz7uNfZ7_[,H7uNfZ7m>0s!7uNfZ$$$$'8%v5I7uNfZ8+HY87uNfZ8.1k07uNfZ80p((7uNfZ83Y9u7uNfZ86BKm7uNfZ89+]d7uNfZ8:Jf`7uNfZ8;io\7uNfZ8=3xX7uNfZ8>S,T7uNfZ8?r5P7uNfZ8A<>L7uNfZ8B[GH7uNfZ8D%PD7uNfZ8EDY@7uNfZ8Fcb:7uNfZz8%v5I7_[,H8%v5I7m>0s8%v5I7uNfZ!8%v5I$$$$'8+HY88%v5I8.1k08%v5I80p((8%v5I83Y9u8%v5I86BKm8%v5I89+]d8%v5I8:Jf`8%v5I8;io\8%v5I8=3xX8%v5I8>S,T8%v5I8?r5P8%v5I8A<>L8%v5I8B[GH8%v5I8D%PD8%v5I8EDY@8%v5I8Fcb:8%v5Iz8+HY87_[,H8+HY87m>0s8+HY87uNfZ8+HY88%v5I!8+HY8$$$$'8.1k08+HY880p((8+HY883Y9u8+HY886BKm8+HY889+]d8+HY88:Jf`8+HY88;io\8+HY88=3xX8+HY88>S,T8+HY88?r5P8+HY88A<>L8+HY88B[GH8+HY88D%PD8+HY88EDY@8+HY88Fcb:8+HY8z8.1k07_[,H8.1k07m>0s8.1k07uNfZ8.1k08%v5I8.1k08+HY8!8.1k0$$$$'80p((8.1k083Y9u8.1k086BKm8.1k089+]d8.1k08:Jf`8.1k08;io\8.1k08=3xX8.1k08>S,T8.1k08?r5P8.1k08A<>L8.1k08B[GH8.1k08D%PD8.1k08EDY@8.1k08Fcb:8.1k0z80p((7_[,H80p((7m>0s80p((7uNfZ80p((8%v5I80p((8+HY880p((8.1k0!80p(($$$$'83Y9u80p((86BKm80p((89+]d80p((8:Jf`80p((8;io\80p((8=3xX80p((8>S,T80p((8?r5P80p((8A<>L80p((8B[GH80p((8D%PD80p((8EDY@80p((8Fcb:80p((z83Y9u7_[,H83Y9u7m>0s83Y9u7uNfZ83Y9u8%v5I83Y9u8+HY883Y9u8.1k083Y9u80p((83Y9u83Y9u83Y9u86BKm83Y9u89+]d83Y9u8:Jf`83Y9u8;io\83Y9u8=3xX83Y9u8>S,T83Y9u8?r5P83Y9u8A<>L83Y9u8B[GH83Y9u8D%PD83Y9u8EDY@83Y9u8Fcb:83Y9uz86BKm7_[,H86BKm7m>0s86BKm7uNfZ86BKm8%v5I86BKm8+HY886BKm8.1k086BKm80p((86BKm83Y9u!86BKm$$$$'89+]d86BKm8:Jf`86BKm8;io\86BKm8=3xX86BKm8>S,T86BKm8?r5P86BKm8A<>L86BKm8B[GH86BKm8D%PD86BKm8EDY@86BKm8Fcb:86BKmz89+]d7_[,H89+]d7m>0s89+]d7uNfZ89+]d8%v5I89+]d8+HY889+]d8.1k089+]d80p((89+]d83Y9u89+]d86BKm!89+]d$$$$'8:Jf`89+]d8;io\89+]d8=3xX89+]d8>S,T89+]d8?r5P89+]d8A<>L89+]d8B[GH89+]d8D%PD89+]d8EDY@89+]d8Fcb:89+]dz8:Jf`7_[,H8:Jf`7m>0s8:Jf`7uNfZ8:Jf`8%v5I8:Jf`8+HY88:Jf`8.1k08:Jf`80p((8:Jf`83Y9u8:Jf`86BKm8:Jf`89+]d!8:Jf`$$$$'8;io\8:Jf`8=3xX8:Jf`8>S,T8:Jf`8?r5P8:Jf`8A<>L8:Jf`8B[GH8:Jf`8D%PD8:Jf`8EDY@8:Jf`8Fcb:8:Jf`z8;io\7_[,H8;io\7m>0s8;io\7uNfZ8;io\8%v5I8;io\8+HY88;io\8.1k08;io\80p((8;io\83Y9u8;io\86BKm8;io\89+]d8;io\8:Jf`!8;io\$$$$'8=3xX8;io\8>S,T8;io\8?r5P8;io\8A<>L8;io\8B[GH8;io\8D%PD8;io\8EDY@8;io\8Fcb:8;io\z8=3xX7_[,H8=3xX7m>0s8=3xX7uNfZ8=3xX8%v5I8=3xX8+HY88=3xX8.1k08=3xX80p((8=3xX83Y9u8=3xX86BKm8=3xX89+]d8=3xX8:Jf`8=3xX8;io\!8=3xX$$$$'8>S,T8=3xX8?r5P8=3xX8A<>L8=3xX8B[GH8=3xX8D%PD8=3xX8EDY@8=3xX8Fcb:8=3xXz8>S,T7_[,H8>S,T7m>0s8>S,T7uNfZ8>S,T8%v5I8>S,T8+HY88>S,T8.1k08>S,T80p((8>S,T83Y9u8>S,T86BKm8>S,T89+]d8>S,T8:Jf`8>S,T8;io\8>S,T8=3xX!8>S,T$$$$'8?r5P8>S,T8A<>L8>S,T8B[GH8>S,T8D%PD8>S,T8EDY@8>S,T8Fcb:8>S,Tz8?r5P7_[,H8?r5P7m>0s8?r5P7uNfZ8?r5P8%v5I8?r5P8+HY88?r5P8.1k08?r5P80p((8?r5P83Y9u8?r5P86BKm8?r5P89+]d8?r5P8:Jf`8?r5P8;io\8?r5P8=3xX8?r5P8>S,T!8?r5P$$$$'8A<>L8?r5P8B[GH8?r5P8D%PD8?r5P8EDY@8?r5P8Fcb:8?r5Pz8A<>L7_[,H8A<>L7m>0s8A<>L7uNfZ8A<>L8%v5I8A<>L8+HY88A<>L8.1k08A<>L80p((8A<>L83Y9u8A<>L86BKm8A<>L89+]d8A<>L8:Jf`8A<>L8;io\8A<>L8=3xX8A<>L8>S,T8A<>L8?r5P!8A<>L$$$$'8B[GH8A<>L8D%PD8A<>L8EDY@8A<>L8Fcb:8A<>Lz8B[GH7_[,H8B[GH7m>0s8B[GH7uNfZ8B[GH8%v5I8B[GH8+HY88B[GH8.1k08B[GH80p((8B[GH83Y9u8B[GH86BKm8B[GH89+]d8B[GH8:Jf`8B[GH8;io\8B[GH8=3xX8B[GH8>S,T8B[GH8?r5P8B[GH8A<>L!8B[GH$$$$'8D%PD8B[GH8EDY@8B[GH8Fcb:8B[GHz8D%PD7_[,H8D%PD7m>0s8D%PD7uNfZ8D%PD8%v5I8D%PD8+HY88D%PD8.1k08D%PD80p((8D%PD83Y9u8D%PD86BKm8D%PD89+]d8D%PD8:Jf`8D%PD8;io\8D%PD8=3xX8D%PD8>S,T8D%PD8?r5P8D%PD8A<>L8D%PD8B[GH!8D%PD$$$$'8EDY@8D%PD8Fcb:8D%PDz8EDY@7_[,H8EDY@7m>0s8EDY@7uNfZ8EDY@8%v5I8EDY@8+HY88EDY@8.1k08EDY@80p((8EDY@83Y9u8EDY@86BKm8EDY@89+]d8EDY@8:Jf`8EDY@8;io\8EDY@8=3xX8EDY@8>S,T8EDY@8?r5P8EDY@8A<>L8EDY@8B[GH8EDY@8D%PD!8EDY@$$$$'8Fcb:8EDY@7Qx'rz7gkb/z7reTbz7x7xRz8(_GAz8,gb4z8/Pt,z82:0xz84xBpz87aThz89eb6z8;/k2z8 Date: Wed, 21 Jun 2023 16:42:52 +0800 Subject: [PATCH 35/41] toke's comment --- .../publish/collect_arnold_scene_source.py | 49 +++++-------------- 1 file changed, 12 insertions(+), 37 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py b/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py index 1b8ec27509..d93811c23e 100644 --- a/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py +++ b/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py @@ -18,49 +18,24 @@ class CollectArnoldSceneSource(pyblish.api.InstancePlugin): for objset in objsets: objset = str(objset) members = cmds.sets(objset, query=True) + members = cmds.ls(members, long=True) if members is None: self.log.warning("Skipped empty instance: \"%s\" " % objset) continue if objset.endswith("content_SET"): - members = cmds.ls(members, long=True) - members_list = [] - for member in members: - shape = cmds.listRelatives( - member, shapes=True, fullPath=True) - if not shape: - continue - members_list = members + shape - group_name = "|{}".format(member) - if group_name in members_list: - members_list.remove(group_name) - children = get_all_children(members) - - if members_list: - children.extend(members_list) - instance.data["contentMembers"] = children - self.log.debug("content members: {}".format(children)) - + instance.data["contentMembers"] = children + members + self.log.debug( + "content members: {}".format( + instance.data["contentMembers"] + ) + ) elif objset.endswith("proxy_SET"): - proxy_members = cmds.ls(members, long=True) - proxy_list = [] - for proxy in proxy_members: - shape = cmds.listRelatives( - proxy, shapes=True, fullPath=True) - if not shape: - continue - proxy_list = proxy_members + shape - group_name = "|{}".format(proxy) - if group_name in proxy_list: - proxy_list.remove(group_name) - - set_members = get_all_children(proxy_members) - if proxy_list: - set_members.extend(proxy_list) - - instance.data["proxy"] = set_members - self.log.debug("proxy members: {}".format(set_members)) - + children = get_all_children(cmds.ls(members, long=True)) + instance.data["proxy"] = children + members + self.log.debug( + "proxy members: {}".format(instance.data["proxy"]) + ) # Use camera in object set if present else default to render globals # camera. From 1c2955a90aa027b0611197ddaa741dcceb2eaca7 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 21 Jun 2023 16:50:08 +0800 Subject: [PATCH 36/41] remove docstring --- .../maya/plugins/publish/extract_arnold_scene_source.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/extract_arnold_scene_source.py b/openpype/hosts/maya/plugins/publish/extract_arnold_scene_source.py index 8696f5a94b..102f0e46a2 100644 --- a/openpype/hosts/maya/plugins/publish/extract_arnold_scene_source.py +++ b/openpype/hosts/maya/plugins/publish/extract_arnold_scene_source.py @@ -69,8 +69,7 @@ class ExtractArnoldSceneSource(publish.Extractor): "camera": instance.data["camera"], "mask": mask } - # TODO: dont use instance.data["contentMembers"] - # but use the new instance.data["contentMemberTransforms"] + filenames, nodes_by_id = self._extract( instance.data["contentMembers"], attribute_data, kwargs ) @@ -110,8 +109,7 @@ class ExtractArnoldSceneSource(publish.Extractor): return kwargs["filename"] = file_path.replace(".ass", "_proxy.ass") - # TODO: dont use instance.data["proxy"] - # but use the new instance.data["proxyTransforms"] + filenames, _ = self._extract( instance.data["proxy"], attribute_data, kwargs ) From 29c8cfe99236faf3a0723e7b064c34226d19c925 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 21 Jun 2023 18:48:25 +0800 Subject: [PATCH 37/41] roy's comment --- .../publish/collect_arnold_scene_source.py | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py b/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py index d93811c23e..69a07b4aaf 100644 --- a/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py +++ b/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py @@ -23,19 +23,9 @@ class CollectArnoldSceneSource(pyblish.api.InstancePlugin): self.log.warning("Skipped empty instance: \"%s\" " % objset) continue if objset.endswith("content_SET"): - children = get_all_children(members) - instance.data["contentMembers"] = children + members - self.log.debug( - "content members: {}".format( - instance.data["contentMembers"] - ) - ) - elif objset.endswith("proxy_SET"): - children = get_all_children(cmds.ls(members, long=True)) - instance.data["proxy"] = children + members - self.log.debug( - "proxy members: {}".format(instance.data["proxy"]) - ) + instance.data["contentMembers"] = self.get_hierarchy(members) + if objset.endswith("content_SET"): + instance.data["proxy"] = self.get_hierarchy(members) # Use camera in object set if present else default to render globals # camera. @@ -54,3 +44,13 @@ class CollectArnoldSceneSource(pyblish.api.InstancePlugin): self.log.debug("No renderable cameras found.") self.log.debug("data: {}".format(instance.data)) + + def get_hierarchy(self, nodes): + """Return nodes with all their children""" + nodes = cmds.ls(nodes, long=True) + if not nodes: + return [] + children = get_all_children(nodes) + # Make sure nodes merged with children only + # contains unique entries + return list(set(nodes + children)) From 223a3338f3b5a02daf3b7172ab3161a3b95414c4 Mon Sep 17 00:00:00 2001 From: Kayla Man <64118225+moonyuet@users.noreply.github.com> Date: Wed, 21 Jun 2023 19:25:47 +0800 Subject: [PATCH 38/41] Update openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py Co-authored-by: Toke Jepsen --- .../hosts/maya/plugins/publish/collect_arnold_scene_source.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py b/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py index 69a07b4aaf..90079c715a 100644 --- a/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py +++ b/openpype/hosts/maya/plugins/publish/collect_arnold_scene_source.py @@ -24,7 +24,7 @@ class CollectArnoldSceneSource(pyblish.api.InstancePlugin): continue if objset.endswith("content_SET"): instance.data["contentMembers"] = self.get_hierarchy(members) - if objset.endswith("content_SET"): + if objset.endswith("proxy_SET"): instance.data["proxy"] = self.get_hierarchy(members) # Use camera in object set if present else default to render globals From 2d1fc8e72857a63510fb9e6e27fe2ddea85527e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Je=C5=BEek?= Date: Wed, 21 Jun 2023 14:09:29 +0200 Subject: [PATCH 39/41] Update openpype/pipeline/colorspace.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- openpype/pipeline/colorspace.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/pipeline/colorspace.py b/openpype/pipeline/colorspace.py index 13846e9f5c..269825f85f 100644 --- a/openpype/pipeline/colorspace.py +++ b/openpype/pipeline/colorspace.py @@ -375,7 +375,7 @@ def get_imageio_config( # This is for backward compatibility. # TODO: in future rewrite this to be more explicit activate_host_color_management = imageio_host.get( - "activate_host_color_management", True) + "activate_host_color_management") # TODO: remove this in future - backward compatibility if activate_host_color_management is None: From 39d2159ed462e3e84236ba4497277d2a7f65016a Mon Sep 17 00:00:00 2001 From: Simone Barbieri Date: Thu, 22 Jun 2023 10:57:23 +0100 Subject: [PATCH 40/41] Blender: Add support for custom path for app templates (#5137) * Add support for custom path for app templates * Use same env variable as scripts and assure correct path exist --- openpype/hosts/blender/api/lib.py | 21 +++++++++++++++++++++ openpype/hosts/blender/api/pipeline.py | 1 + 2 files changed, 22 insertions(+) diff --git a/openpype/hosts/blender/api/lib.py b/openpype/hosts/blender/api/lib.py index 6526f1fb87..9bb560c364 100644 --- a/openpype/hosts/blender/api/lib.py +++ b/openpype/hosts/blender/api/lib.py @@ -134,6 +134,27 @@ def append_user_scripts(): traceback.print_exc() +def set_app_templates_path(): + # Blender requires the app templates to be in `BLENDER_USER_SCRIPTS`. + # After running Blender, we set that variable to our custom path, so + # that the user can use their custom app templates. + + # We look among the scripts paths for one of the paths that contains + # the app templates. The path must contain the subfolder + # `startup/bl_app_templates_user`. + paths = os.environ.get("OPENPYPE_BLENDER_USER_SCRIPTS").split(os.pathsep) + + app_templates_path = None + for path in paths: + if os.path.isdir( + os.path.join(path, "startup", "bl_app_templates_user")): + app_templates_path = path + break + + if app_templates_path and os.path.isdir(app_templates_path): + os.environ["BLENDER_USER_SCRIPTS"] = app_templates_path + + def imprint(node: bpy.types.bpy_struct_meta_idprop, data: Dict): r"""Write `data` to `node` as userDefined attributes diff --git a/openpype/hosts/blender/api/pipeline.py b/openpype/hosts/blender/api/pipeline.py index 9cc557c01a..0f756d8cb6 100644 --- a/openpype/hosts/blender/api/pipeline.py +++ b/openpype/hosts/blender/api/pipeline.py @@ -60,6 +60,7 @@ def install(): register_creator_plugin_path(str(CREATE_PATH)) lib.append_user_scripts() + lib.set_app_templates_path() register_event_callback("new", on_new) register_event_callback("open", on_open) From 97f3bdf5ec7483932ba4550bfab7c4a75795a831 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 22 Jun 2023 12:02:23 +0200 Subject: [PATCH 41/41] Color Management- added color management support for simple expected files on Deadline (#5122) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * OP-5864 - added color management support for simple expected files Previously implemented only for AOVs. * OP-5864 - fix colorspace query colorspace might be not on instance.data * OP-5864 - refactore name to more descriptive one It is actually instance.data, not proper `instance`. --------- Co-authored-by: Jakub Ježek --- .../plugins/publish/submit_publish_job.py | 43 ++++++++++++------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/openpype/modules/deadline/plugins/publish/submit_publish_job.py b/openpype/modules/deadline/plugins/publish/submit_publish_job.py index 590acf86c2..69e9fb6449 100644 --- a/openpype/modules/deadline/plugins/publish/submit_publish_job.py +++ b/openpype/modules/deadline/plugins/publish/submit_publish_job.py @@ -21,6 +21,7 @@ from openpype.pipeline import ( from openpype.tests.lib import is_in_tests from openpype.pipeline.farm.patterning import match_aov_pattern from openpype.lib import is_running_from_build +from openpype.pipeline import publish def get_resources(project_name, version, extension=None): @@ -79,7 +80,8 @@ def get_resource_files(resources, frame_range=None): return list(res_collection) -class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin): +class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin, + publish.ColormanagedPyblishPluginMixin): """Process Job submitted on farm. These jobs are dependent on a deadline or muster job @@ -598,7 +600,8 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin): self.log.debug("instances:{}".format(instances)) return instances - def _get_representations(self, instance, exp_files, do_not_add_review): + def _get_representations(self, instance_data, exp_files, + do_not_add_review): """Create representations for file sequences. This will return representations of expected files if they are not @@ -606,7 +609,7 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin): most cases, but if not - we create representation from each of them. Arguments: - instance (dict): instance data for which we are + instance_data (dict): instance.data for which we are setting representations exp_files (list): list of expected files do_not_add_review (bool): explicitly skip review @@ -628,9 +631,9 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin): # expected files contains more explicitly and from what # should be review made. # - "review" tag is never added when is set to 'False' - if instance["useSequenceForReview"]: + if instance_data["useSequenceForReview"]: # toggle preview on if multipart is on - if instance.get("multipartExr", False): + if instance_data.get("multipartExr", False): self.log.debug( "Adding preview tag because its multipartExr" ) @@ -655,8 +658,8 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin): " This may cause issues on farm." ).format(staging)) - frame_start = int(instance.get("frameStartHandle")) - if instance.get("slate"): + frame_start = int(instance_data.get("frameStartHandle")) + if instance_data.get("slate"): frame_start -= 1 preview = preview and not do_not_add_review @@ -665,10 +668,10 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin): "ext": ext, "files": [os.path.basename(f) for f in list(collection)], "frameStart": frame_start, - "frameEnd": int(instance.get("frameEndHandle")), + "frameEnd": int(instance_data.get("frameEndHandle")), # If expectedFile are absolute, we need only filenames "stagingDir": staging, - "fps": instance.get("fps"), + "fps": instance_data.get("fps"), "tags": ["review"] if preview else [], } @@ -676,17 +679,17 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin): if ext in self.skip_integration_repre_list: rep["tags"].append("delete") - if instance.get("multipartExr", False): + if instance_data.get("multipartExr", False): rep["tags"].append("multipartExr") # support conversion from tiled to scanline - if instance.get("convertToScanline"): + if instance_data.get("convertToScanline"): self.log.info("Adding scanline conversion.") rep["tags"].append("toScanline") representations.append(rep) - self._solve_families(instance, preview) + self._solve_families(instance_data, preview) # add remainders as representations for remainder in remainders: @@ -717,13 +720,13 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin): preview = preview and not do_not_add_review if preview: rep.update({ - "fps": instance.get("fps"), + "fps": instance_data.get("fps"), "tags": ["review"] }) - self._solve_families(instance, preview) + self._solve_families(instance_data, preview) already_there = False - for repre in instance.get("representations", []): + for repre in instance_data.get("representations", []): # might be added explicitly before by publish_on_farm already_there = repre.get("files") == rep["files"] if already_there: @@ -733,6 +736,13 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin): if not already_there: representations.append(rep) + for rep in representations: + # inject colorspace data + self.set_representation_colorspace( + rep, self.context, + colorspace=instance_data["colorspace"] + ) + return representations def _solve_families(self, instance, preview=False): @@ -861,7 +871,8 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin): "jobBatchName": data.get("jobBatchName", ""), "useSequenceForReview": data.get("useSequenceForReview", True), # map inputVersions `ObjectId` -> `str` so json supports it - "inputVersions": list(map(str, data.get("inputVersions", []))) + "inputVersions": list(map(str, data.get("inputVersions", []))), + "colorspace": instance.data.get("colorspace") } # skip locking version if we are creating v01