mirror of
https://github.com/ynput/ayon-core.git
synced 2026-01-01 16:34:53 +01:00
Merge pull request #1653 from pypeclub/feature/1651-nuke-publish-simplification
This commit is contained in:
commit
a68e23ff46
5 changed files with 51 additions and 138 deletions
|
|
@ -298,18 +298,21 @@ def create_write_node(name, data, input=None, prenodes=None, review=True):
|
||||||
review (bool): adding review knob
|
review (bool): adding review knob
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
prenodes = [(
|
prenodes = [
|
||||||
"NameNode", # string
|
{
|
||||||
"NodeClass", # string
|
"nodeName": {
|
||||||
( # OrderDict: knob and values pairs
|
"class": "" # string
|
||||||
("knobName", "knobValue"),
|
"knobs": [
|
||||||
("knobName", "knobValue")
|
("knobName": value),
|
||||||
),
|
...
|
||||||
( # list outputs
|
],
|
||||||
"firstPostNodeName",
|
"dependent": [
|
||||||
"secondPostNodeName"
|
following_node_01,
|
||||||
)
|
...
|
||||||
)
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
...
|
||||||
]
|
]
|
||||||
|
|
||||||
Return:
|
Return:
|
||||||
|
|
@ -385,35 +388,42 @@ def create_write_node(name, data, input=None, prenodes=None, review=True):
|
||||||
prev_node.hideControlPanel()
|
prev_node.hideControlPanel()
|
||||||
# creating pre-write nodes `prenodes`
|
# creating pre-write nodes `prenodes`
|
||||||
if prenodes:
|
if prenodes:
|
||||||
for name, klass, properties, set_output_to in prenodes:
|
for node in prenodes:
|
||||||
|
# get attributes
|
||||||
|
name = node["name"]
|
||||||
|
klass = node["class"]
|
||||||
|
knobs = node["knobs"]
|
||||||
|
dependent = node["dependent"]
|
||||||
|
|
||||||
# create node
|
# create node
|
||||||
now_node = nuke.createNode(klass, "name {}".format(name))
|
now_node = nuke.createNode(klass, "name {}".format(name))
|
||||||
now_node.hideControlPanel()
|
now_node.hideControlPanel()
|
||||||
|
|
||||||
# add data to knob
|
# add data to knob
|
||||||
for k, v in properties:
|
for _knob in knobs:
|
||||||
|
knob, value = _knob
|
||||||
try:
|
try:
|
||||||
now_node[k].value()
|
now_node[knob].value()
|
||||||
except NameError:
|
except NameError:
|
||||||
log.warning(
|
log.warning(
|
||||||
"knob `{}` does not exist on node `{}`".format(
|
"knob `{}` does not exist on node `{}`".format(
|
||||||
k, now_node["name"].value()
|
knob, now_node["name"].value()
|
||||||
))
|
))
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if k and v:
|
if knob and value:
|
||||||
now_node[k].setValue(str(v))
|
now_node[knob].setValue(value)
|
||||||
|
|
||||||
# connect to previous node
|
# connect to previous node
|
||||||
if set_output_to:
|
if dependent:
|
||||||
if isinstance(set_output_to, (tuple or list)):
|
if isinstance(dependent, (tuple or list)):
|
||||||
for i, node_name in enumerate(set_output_to):
|
for i, node_name in enumerate(dependent):
|
||||||
input_node = nuke.createNode(
|
input_node = nuke.createNode(
|
||||||
"Input", "name {}".format(node_name))
|
"Input", "name {}".format(node_name))
|
||||||
input_node.hideControlPanel()
|
input_node.hideControlPanel()
|
||||||
now_node.setInput(1, input_node)
|
now_node.setInput(1, input_node)
|
||||||
|
|
||||||
elif isinstance(set_output_to, str):
|
elif isinstance(dependent, str):
|
||||||
input_node = nuke.createNode(
|
input_node = nuke.createNode(
|
||||||
"Input", "name {}".format(node_name))
|
"Input", "name {}".format(node_name))
|
||||||
input_node.hideControlPanel()
|
input_node.hideControlPanel()
|
||||||
|
|
|
||||||
|
|
@ -99,10 +99,28 @@ class CreateWriteRender(plugin.PypeCreator):
|
||||||
"fpath_template": ("{work}/renders/nuke/{subset}"
|
"fpath_template": ("{work}/renders/nuke/{subset}"
|
||||||
"/{subset}.{frame}.{ext}")})
|
"/{subset}.{frame}.{ext}")})
|
||||||
|
|
||||||
|
# add crop node to cut off all outside of format bounding box
|
||||||
|
_prenodes = [
|
||||||
|
{
|
||||||
|
"name": "Crop01",
|
||||||
|
"class": "Crop",
|
||||||
|
"knobs": [
|
||||||
|
("box", [
|
||||||
|
0.0,
|
||||||
|
0.0,
|
||||||
|
selected_node.width(),
|
||||||
|
selected_node.height()
|
||||||
|
])
|
||||||
|
],
|
||||||
|
"dependent": None
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
write_node = lib.create_write_node(
|
write_node = lib.create_write_node(
|
||||||
self.data["subset"],
|
self.data["subset"],
|
||||||
write_data,
|
write_data,
|
||||||
input=selected_node)
|
input=selected_node,
|
||||||
|
prenodes=_prenodes)
|
||||||
|
|
||||||
# relinking to collected connections
|
# relinking to collected connections
|
||||||
for i, input in enumerate(inputs):
|
for i, input in enumerate(inputs):
|
||||||
|
|
|
||||||
|
|
@ -1,106 +0,0 @@
|
||||||
import nuke
|
|
||||||
|
|
||||||
import pyblish.api
|
|
||||||
|
|
||||||
|
|
||||||
class RepairNukeBoundingBoxAction(pyblish.api.Action):
|
|
||||||
|
|
||||||
label = "Repair"
|
|
||||||
icon = "wrench"
|
|
||||||
on = "failed"
|
|
||||||
|
|
||||||
def process(self, context, plugin):
|
|
||||||
|
|
||||||
# Get the errored instances
|
|
||||||
failed = []
|
|
||||||
for result in context.data["results"]:
|
|
||||||
if (result["error"] is not None and result["instance"] is not None
|
|
||||||
and result["instance"] not in failed):
|
|
||||||
failed.append(result["instance"])
|
|
||||||
|
|
||||||
# Apply pyblish.logic to get the instances for the plug-in
|
|
||||||
instances = pyblish.api.instances_by_plugin(failed, plugin)
|
|
||||||
|
|
||||||
for instance in instances:
|
|
||||||
crop = instance[0].dependencies()[0]
|
|
||||||
if crop.Class() != "Crop":
|
|
||||||
crop = nuke.nodes.Crop(inputs=[instance[0].input(0)])
|
|
||||||
|
|
||||||
xpos = instance[0].xpos()
|
|
||||||
ypos = instance[0].ypos() - 26
|
|
||||||
|
|
||||||
dependent_ypos = instance[0].dependencies()[0].ypos()
|
|
||||||
if (instance[0].ypos() - dependent_ypos) <= 51:
|
|
||||||
xpos += 110
|
|
||||||
|
|
||||||
crop.setXYpos(xpos, ypos)
|
|
||||||
|
|
||||||
instance[0].setInput(0, crop)
|
|
||||||
|
|
||||||
crop["box"].setValue(
|
|
||||||
(
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
instance[0].input(0).width(),
|
|
||||||
instance[0].input(0).height()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class ValidateNukeWriteBoundingBox(pyblish.api.InstancePlugin):
|
|
||||||
"""Validates write bounding box.
|
|
||||||
|
|
||||||
Ffmpeg does not support bounding boxes outside of the image
|
|
||||||
resolution a crop is needed. This needs to validate all frames, as each
|
|
||||||
rendered exr can break the ffmpeg transcode.
|
|
||||||
"""
|
|
||||||
|
|
||||||
order = pyblish.api.ValidatorOrder
|
|
||||||
optional = True
|
|
||||||
families = ["render", "render.local", "render.farm"]
|
|
||||||
label = "Write Bounding Box"
|
|
||||||
hosts = ["nuke"]
|
|
||||||
actions = [RepairNukeBoundingBoxAction]
|
|
||||||
|
|
||||||
def process(self, instance):
|
|
||||||
|
|
||||||
# Skip bounding box check if a crop node exists.
|
|
||||||
if instance[0].dependencies()[0].Class() == "Crop":
|
|
||||||
return
|
|
||||||
|
|
||||||
msg = "Bounding box is outside the format."
|
|
||||||
assert self.check_bounding_box(instance), msg
|
|
||||||
|
|
||||||
def check_bounding_box(self, instance):
|
|
||||||
node = instance[0]
|
|
||||||
|
|
||||||
first_frame = instance.data["frameStart"]
|
|
||||||
last_frame = instance.data["frameEnd"]
|
|
||||||
|
|
||||||
format_width = node.format().width()
|
|
||||||
format_height = node.format().height()
|
|
||||||
|
|
||||||
# The trick is that we need to execute() some node every time we go to
|
|
||||||
# a next frame, to update the context.
|
|
||||||
# So we create a CurveTool that we can execute() on every frame.
|
|
||||||
temporary_node = nuke.nodes.CurveTool()
|
|
||||||
bbox_check = True
|
|
||||||
for frame in range(first_frame, last_frame + 1):
|
|
||||||
# Workaround to update the tree
|
|
||||||
nuke.execute(temporary_node, frame, frame)
|
|
||||||
|
|
||||||
x = node.bbox().x()
|
|
||||||
y = node.bbox().y()
|
|
||||||
w = node.bbox().w()
|
|
||||||
h = node.bbox().h()
|
|
||||||
|
|
||||||
if x < 0 or (x + w) > format_width:
|
|
||||||
bbox_check = False
|
|
||||||
break
|
|
||||||
|
|
||||||
if y < 0 or (y + h) > format_height:
|
|
||||||
bbox_check = False
|
|
||||||
break
|
|
||||||
|
|
||||||
nuke.delete(temporary_node)
|
|
||||||
return bbox_check
|
|
||||||
|
|
@ -43,11 +43,6 @@
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"active": true
|
"active": true
|
||||||
},
|
},
|
||||||
"ValidateNukeWriteBoundingBox": {
|
|
||||||
"enabled": true,
|
|
||||||
"optional": true,
|
|
||||||
"active": true
|
|
||||||
},
|
|
||||||
"ExtractThumbnail": {
|
"ExtractThumbnail": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"nodes": {
|
"nodes": {
|
||||||
|
|
|
||||||
|
|
@ -64,10 +64,6 @@
|
||||||
{
|
{
|
||||||
"key": "ValidateScript",
|
"key": "ValidateScript",
|
||||||
"label": "Validate script settings"
|
"label": "Validate script settings"
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "ValidateNukeWriteBoundingBox",
|
|
||||||
"label": "Validate and Write Bounding Box"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue