diff --git a/openpype/hosts/nuke/api/plugin.py b/openpype/hosts/nuke/api/plugin.py
index d3f8357f7d..5521db99c0 100644
--- a/openpype/hosts/nuke/api/plugin.py
+++ b/openpype/hosts/nuke/api/plugin.py
@@ -558,9 +558,7 @@ class ExporterReview(object):
self.path_in = self.instance.data.get("path", None)
self.staging_dir = self.instance.data["stagingDir"]
self.collection = self.instance.data.get("collection", None)
- self.data = dict({
- "representations": list()
- })
+ self.data = {"representations": []}
def get_file_info(self):
if self.collection:
@@ -626,7 +624,7 @@ class ExporterReview(object):
nuke_imageio = opnlib.get_nuke_imageio_settings()
# TODO: this is only securing backward compatibility lets remove
- # this once all projects's anotomy are updated to newer config
+ # this once all projects's anatomy are updated to newer config
if "baking" in nuke_imageio.keys():
return nuke_imageio["baking"]["viewerProcess"]
else:
@@ -823,8 +821,41 @@ class ExporterReviewMov(ExporterReview):
add_tags = []
self.publish_on_farm = farm
read_raw = kwargs["read_raw"]
+
+ # TODO: remove this when `reformat_nodes_config`
+ # is changed in settings
reformat_node_add = kwargs["reformat_node_add"]
reformat_node_config = kwargs["reformat_node_config"]
+
+ # TODO: make this required in future
+ reformat_nodes_config = kwargs.get("reformat_nodes_config", {})
+
+ # TODO: remove this once deprecated is removed
+ # make sure only reformat_nodes_config is used in future
+ if reformat_node_add and reformat_nodes_config.get("enabled"):
+ self.log.warning(
+ "`reformat_node_add` is deprecated. "
+ "Please use only `reformat_nodes_config` instead.")
+ reformat_nodes_config = None
+
+ # TODO: reformat code when backward compatibility is not needed
+ # warning if reformat_nodes_config is not set
+ if not reformat_nodes_config:
+ self.log.warning(
+ "Please set `reformat_nodes_config` in settings.")
+ self.log.warning(
+ "Using `reformat_node_config` instead.")
+ reformat_nodes_config = {
+ "enabled": reformat_node_add,
+ "reposition_nodes": [
+ {
+ "node_class": "Reformat",
+ "knobs": reformat_node_config
+ }
+ ]
+ }
+
+
bake_viewer_process = kwargs["bake_viewer_process"]
bake_viewer_input_process_node = kwargs[
"bake_viewer_input_process"]
@@ -846,7 +877,6 @@ class ExporterReviewMov(ExporterReview):
subset = self.instance.data["subset"]
self._temp_nodes[subset] = []
- # ---------- start nodes creation
# Read node
r_node = nuke.createNode("Read")
@@ -860,44 +890,39 @@ class ExporterReviewMov(ExporterReview):
if read_raw:
r_node["raw"].setValue(1)
- # connect
- self._temp_nodes[subset].append(r_node)
- self.previous_node = r_node
- self.log.debug("Read... `{}`".format(self._temp_nodes[subset]))
+ # connect to Read node
+ self._shift_to_previous_node_and_temp(subset, r_node, "Read... `{}`")
# add reformat node
- if reformat_node_add:
+ if reformat_nodes_config["enabled"]:
+ reposition_nodes = reformat_nodes_config["reposition_nodes"]
+ for reposition_node in reposition_nodes:
+ node_class = reposition_node["node_class"]
+ knobs = reposition_node["knobs"]
+ node = nuke.createNode(node_class)
+ set_node_knobs_from_settings(node, knobs)
+
+ # connect in order
+ self._connect_to_above_nodes(
+ node, subset, "Reposition node... `{}`"
+ )
# append reformated tag
add_tags.append("reformated")
- rf_node = nuke.createNode("Reformat")
- set_node_knobs_from_settings(rf_node, reformat_node_config)
-
- # connect
- rf_node.setInput(0, self.previous_node)
- self._temp_nodes[subset].append(rf_node)
- self.previous_node = rf_node
- self.log.debug(
- "Reformat... `{}`".format(self._temp_nodes[subset]))
-
# only create colorspace baking if toggled on
if bake_viewer_process:
if bake_viewer_input_process_node:
# View Process node
ipn = get_view_process_node()
if ipn is not None:
- # connect
- ipn.setInput(0, self.previous_node)
- self._temp_nodes[subset].append(ipn)
- self.previous_node = ipn
- self.log.debug(
- "ViewProcess... `{}`".format(
- self._temp_nodes[subset]))
+ # connect to ViewProcess node
+ self._connect_to_above_nodes(ipn, subset, "ViewProcess... `{}`")
if not self.viewer_lut_raw:
# OCIODisplay
dag_node = nuke.createNode("OCIODisplay")
+ # assign display
display, viewer = get_viewer_config_from_string(
str(baking_view_profile)
)
@@ -907,13 +932,7 @@ class ExporterReviewMov(ExporterReview):
# assign viewer
dag_node["view"].setValue(viewer)
- # connect
- dag_node.setInput(0, self.previous_node)
- self._temp_nodes[subset].append(dag_node)
- self.previous_node = dag_node
- self.log.debug("OCIODisplay... `{}`".format(
- self._temp_nodes[subset]))
-
+ self._connect_to_above_nodes(dag_node, subset, "OCIODisplay... `{}`")
# Write node
write_node = nuke.createNode("Write")
self.log.debug("Path: {}".format(self.path))
@@ -967,6 +986,15 @@ class ExporterReviewMov(ExporterReview):
return self.data
+ def _shift_to_previous_node_and_temp(self, subset, node, message):
+ self._temp_nodes[subset].append(node)
+ self.previous_node = node
+ self.log.debug(message.format(self._temp_nodes[subset]))
+
+ def _connect_to_above_nodes(self, node, subset, message):
+ node.setInput(0, self.previous_node)
+ self._shift_to_previous_node_and_temp(subset, node, message)
+
@deprecated("openpype.hosts.nuke.api.plugin.NukeWriteCreator")
class AbstractWriteRender(OpenPypeCreator):
diff --git a/openpype/settings/defaults/project_settings/nuke.json b/openpype/settings/defaults/project_settings/nuke.json
index d475c337d9..2545411e0a 100644
--- a/openpype/settings/defaults/project_settings/nuke.json
+++ b/openpype/settings/defaults/project_settings/nuke.json
@@ -446,6 +446,41 @@
"value": false
}
],
+ "reformat_nodes_config": {
+ "enabled": false,
+ "reposition_nodes": [
+ {
+ "node_class": "Reformat",
+ "knobs": [
+ {
+ "type": "text",
+ "name": "type",
+ "value": "to format"
+ },
+ {
+ "type": "text",
+ "name": "format",
+ "value": "HD_1080"
+ },
+ {
+ "type": "text",
+ "name": "filter",
+ "value": "Lanczos6"
+ },
+ {
+ "type": "bool",
+ "name": "black_outside",
+ "value": true
+ },
+ {
+ "type": "bool",
+ "name": "pbb",
+ "value": false
+ }
+ ]
+ }
+ ]
+ },
"extension": "mov",
"add_custom_tags": []
}
diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/schema_nuke_publish.json b/openpype/settings/entities/schemas/projects_schema/schemas/schema_nuke_publish.json
index 5b9145e7d9..1c542279fc 100644
--- a/openpype/settings/entities/schemas/projects_schema/schemas/schema_nuke_publish.json
+++ b/openpype/settings/entities/schemas/projects_schema/schemas/schema_nuke_publish.json
@@ -271,6 +271,10 @@
{
"type": "separator"
},
+ {
+ "type": "label",
+ "label": "Currently we are supporting also multiple reposition nodes.
Older single reformat node is still supported
and if it is activated then preference will
be on it. If you want to use multiple reformat
nodes then you need to disable single reformat
node and enable multiple Reformat nodes here."
+ },
{
"type": "boolean",
"key": "reformat_node_add",
@@ -287,6 +291,49 @@
}
]
},
+ {
+ "key": "reformat_nodes_config",
+ "type": "dict",
+ "label": "Reformat Nodes",
+ "collapsible": true,
+ "checkbox_key": "enabled",
+ "children": [
+ {
+ "type": "boolean",
+ "key": "enabled",
+ "label": "Enabled"
+ },
+ {
+ "type": "label",
+ "label": "Reposition knobs supported only.
You can add multiple reformat nodes
and set their knobs. Order of reformat
nodes is important. First reformat node
will be applied first and last reformat
node will be applied last."
+ },
+ {
+ "key": "reposition_nodes",
+ "type": "list",
+ "label": "Reposition nodes",
+ "object_type": {
+ "type": "dict",
+ "children": [
+ {
+ "key": "node_class",
+ "label": "Node class",
+ "type": "text"
+ },
+ {
+ "type": "schema_template",
+ "name": "template_nuke_knob_inputs",
+ "template_data": [
+ {
+ "label": "Node knobs",
+ "key": "knobs"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ },
{
"type": "separator"
},