Nuke/Node
Breakdownerizationer.gizmo
르면가게
2024. 12. 17. 18:02
https://github.com/BenMcEwan/nuke_public/blob/master/gizmos/Breakdownerizationer.gizmo
nuke_public/gizmos/Breakdownerizationer.gizmo at master · BenMcEwan/nuke_public
Gizmos / Python Scripts for Nuke. Contribute to BenMcEwan/nuke_public development by creating an account on GitHub.
github.com
set cut_paste_input [stack 0]
version 13.2 v6
push $cut_paste_input
NoOp {
name Breakdownerizationer
knobChanged "if nuke.thisNode().knob(\"type\").value() == \"Wipe Left-to-Right\":\n nuke.thisNode().knob(\"chk_white_line\").setVisible(True)\nelse:\n nuke.thisNode().knob(\"chk_white_line\").setVisible(False)"
selected true
xpos -236
ypos 574
hide_input true
addUserKnob {20 Options}
addUserKnob {26 ""}
addUserKnob {26 spacer l "" -STARTLINE T " "}
addUserKnob {26 instructions_01 l "" -STARTLINE T "<b>Usage</b>\n\n<p>1) Set parameters below.\n<br>2) Select your final comp in your Node Graph, followed by the<br> layers you want to break down, in order.\n<br>3) Press the \"Breakdown this Shot!\" button, and watch the magic happen!\n\n<br>"}
addUserKnob {26 ""}
addUserKnob {4 type l "Breakdown Type" M {"Wipe Left-to-Right" Dissolve "Slide Layer In, Top-to-Bottom"}}
addUserKnob {3 frame l "Frame to Breakdown"}
frame 1001
addUserKnob {3 rewind_speed l "Rewind Speed"}
rewind_speed 4
addUserKnob {26 times_text l "" -STARTLINE T " times"}
addUserKnob {3 ttime l "Transition Duration"}
ttime 12
addUserKnob {26 frames_text l "" -STARTLINE T " frames"}
addUserKnob {3 ptime l "Pause Duration"}
ptime 8
addUserKnob {26 frames_text2 l "" -STARTLINE T " frames"}
addUserKnob {6 chk_white_line l "Show white line on wipes?" +STARTLINE}
chk_white_line true
addUserKnob {26 spacer_01 l "" +STARTLINE T " "}
addUserKnob {22 go_btn l "Breakdown This Shot!" T "def breakdownerizationer_run():\n \n if not nuke.selectedNodes():\n nuke.message(\"Please select some nodes, starting with your final comp first, followed by the nodes you want to break down\")\n return\n\n this_node = nuke.thisNode()\n \n # Store all the Breakdown layers in a list.\n layers = \[]\n \n for i in nuke.selectedNodes():\n layers.append(i)\n \n layers.reverse()\n \n # Get average position of all selected nodes.\n xposlist = \[]\n yposlist = \[]\n \n for nodes in layers:\n xposlist.append(nodes.knob('xpos').value())\n yposlist.append(nodes.knob('ypos').value())\n \n avgxpos = sum(xposlist) / len(xposlist)\n avgypos = sum(yposlist) / len(yposlist)\n \n # Create extra variables to do things later...\n format_value = layers\[0].knob('format').value()\n first_frame = layers\[0].knob('first').value()\n last_frame = layers\[0].knob('last').value()\n frame_range = last_frame - first_frame\n breakdown_start = last_frame + (last_frame - nuke.thisNode().knob('frame').value())\n #+ (int(frame_range / int(this_node.knob('rewind_speed').value())))\n \n # Create breakdown Group node, add knobs.\n grp = nuke.createNode('Group', 'name Breakdownerizationer_Build')\n grp.knob('xpos').setValue(avgxpos)\n grp.knob('ypos').setValue(avgypos + 250)\n \n if this_node.knob('type').value() == \"Wipe Left-to-Right\":\n \n grp.addKnob(nuke.Text_Knob('divider_01', ' '))\n \n grp.addKnob(nuke.Boolean_Knob('b_whiteline', 'Show white line on wipes?'))\n grp.knob('b_whiteline').setValue(int(this_node.knob('chk_white_line').value()))\n \n grp.addKnob(nuke.Int_Knob('b_whiteline_width', 'White line width'))\n grp.knob('b_whiteline_width').setValue(2)\n \n grp.addKnob(nuke.Text_Knob('divider_02', ' '))\n \n breakdown_type_text = \"<b>Breakdown Type:</b> \" + str(this_node.knob('type').value()) + \"\\n\"\n grp.addKnob(nuke.Text_Knob('text_type', ' ', breakdown_type_text))\n grp.addKnob(nuke.Text_Knob('spacer_01', ' ', ' '))\n \n # Add knobs and set their values.\n grp.addKnob(nuke.Int_Knob('num_inputs', 'Number of Inputs'))\n grp.knob('num_inputs').setValue(int(len(layers)))\n \n grp.addKnob(nuke.Int_Knob('b_frame', 'Breakdown Frame'))\n grp.knob('b_frame').setValue(int(this_node.knob('frame').value()))\n \n grp.addKnob(nuke.Int_Knob('b_rSpeed', 'Rewind Speed'))\n grp.knob('b_rSpeed').setValue(int(this_node.knob('rewind_speed').value()))\n \n grp.addKnob(nuke.Int_Knob('b_td', 'Transition Duration'))\n grp.knob('b_td').setValue(int(this_node.knob('ttime').value()))\n \n grp.addKnob(nuke.Int_Knob('b_pause', 'Pause Duration'))\n grp.knob('b_pause').setValue(int(this_node.knob('ptime').value()))\n \n grp.addKnob(nuke.Text_Knob('divider_03', ' '))\n \n # Disable the knobs, as they're just for show.\n grp.knob('num_inputs').setEnabled(False)\n grp.knob('b_frame').setEnabled(False)\n grp.knob('b_rSpeed').setEnabled(False)\n grp.knob('b_td').setEnabled(False)\n grp.knob('b_pause').setEnabled(False)\n \n # Open up the Group to build the dynamic gizmo...\n grp.begin()\n \n # Set variables\n wipe_time = nuke.thisNode().knob('b_td').value()\n pause_time = nuke.thisNode().knob('b_pause').value()\n \n # Create the first input manually, so we can name it.\n comp_input = nuke.createNode('Input', \"name comp\")\n \n # Create the TimeWarp, that reverses the shot.\n reverse_time = nuke.createNode('TimeWarp', 'filter nearest')\n reverse_time_knob = reverse_time.knob('lookup')\n reverse_time_knob.setAnimated(0)\n reverse_time_anim = reverse_time_knob.animations()\[0]\n reverse_time_anim.setKey(last_frame + pause_time, last_frame)\n reverse_time_anim.setKey(last_frame + pause_time + ((last_frame - nuke.thisNode().knob('b_frame').value()) / nuke.thisNode().knob('b_rSpeed').value()), nuke.thisNode().knob('b_frame').value())\n \n # Switch to the TimeWarp at the right time.\n switch_node = nuke.createNode('Switch')\n switch_node.setInput(0, comp_input)\n switch_node.setInput(1, reverse_time)\n switch_node.knob('which').setAnimated(0)\n switchAnim = switch_node.knob('which').animations()\[0]\n switchAnim.setKey(last_frame - 1 + pause_time, 0)\n switchAnim.setKey(last_frame + pause_time, 1)\n \n prev_merge_node = switch_node\n \n if this_node.knob('type').value() == \"Wipe Left-to-Right\":\n \n # Create the rest of the inputs, based off the number of selected Read nodes. Then do all the things.\n for x in range(0, (len(layers) - 1)):\n nuke.createNode('Input')\n reformat_node = nuke.createNode('Reformat', 'format format_value')\n solid_alpha_shuffle = nuke.createNode('Shuffle', 'in alpha out alpha red white')\n framehold_node = nuke.createNode('FrameHold', 'first_frame b_frame')\n crop_node = nuke.createNode('Crop')\n \n # Create white line\n all_alpha_shuffle = nuke.createNode('Shuffle', 'red alpha green alpha blue alpha alpha alpha')\n transform_node = nuke.createNode('Transform')\n transform_node.knob('translate').setExpression('b_whiteline_width*-1', 0)\n \n stencil_node = nuke.createNode('Merge2', 'operation stencil')\n stencil_node.setInput(0, all_alpha_shuffle)\n stencil_node.setInput(1, transform_node)\n \n merge_white_line = nuke.createNode('Merge2', 'operation over')\n merge_white_line.knob('disable').setExpression('!b_whiteline')\n merge_white_line.setInput(0, crop_node)\n merge_white_line.setInput(1, stencil_node)\n \n # Create the wipe animations\n knob = crop_node.knob('box')\n knob.setAnimated(2)\n \n animKnob = knob.animations()\[0]\n animKnob.setKey(1 + pause_time + (last_frame + pause_time + ((last_frame - nuke.thisNode().knob('b_frame').value()) / nuke.thisNode().knob('b_rSpeed').value())) + x * wipe_time + x * pause_time, -0.001 - nuke.thisNode().knob('b_whiteline_width').value())\n animKnob.setKey(pause_time + (last_frame + pause_time + ((last_frame - nuke.thisNode().knob('b_frame').value()) / nuke.thisNode().knob('b_rSpeed').value())) + x * wipe_time + x * pause_time + wipe_time, nuke.root()\['format'].value().width())\n \n animKnob.setExpression('curve+b_whiteline_width')\n \n merge_node = nuke.createNode('Merge2')\n merge_node.setInput(0, prev_merge_node)\n merge_node.setInput(1, merge_white_line)\n \n prev_merge_node = merge_node\n \n \n \n \n \n elif this_node.knob('type').value() == \"Slide Layer In, Top-to-Bottom\":\n \n # Create the rest of the inputs, based off the number of selected Read nodes. Then do all the things.\n for x in range(0, (len(layers) - 1)):\n nuke.createNode('Input')\n reformat_node = nuke.createNode('Reformat', 'format format_value')\n nuke.createNode('Crop')\n framehold_node = nuke.createNode('FrameHold', 'first_frame b_frame')\n transform_node = nuke.createNode('Transform')\n \n # Slide the layers into frame with a transform.\n knob = transform_node.knob('translate')\n knob.setAnimated(1)\n \n animKnob = knob.animations()\[0]\n animKnob.setKey(1 + pause_time + (last_frame + pause_time + ((last_frame - nuke.thisNode().knob('b_frame').value()) / nuke.thisNode().knob('b_rSpeed').value())) + x * wipe_time + x * pause_time, nuke.root()\['format'].value().height())\n animKnob.setKey(pause_time + (last_frame + pause_time + ((last_frame - nuke.thisNode().knob('b_frame').value()) / nuke.thisNode().knob('b_rSpeed').value())) + x * wipe_time + x * pause_time + wipe_time, 0)\n \n merge_node = nuke.createNode('Merge2')\n merge_node.setInput(0, prev_merge_node)\n merge_node.setInput(1, transform_node)\n \n prev_merge_node = merge_node\n \n \n \n elif this_node.knob('type').value() == \"Dissolve\":\n \n # Create the rest of the inputs, based off the number of selected Read nodes. Then do all the things.\n for x in range(0, (len(layers) - 1)):\n nuke.createNode('Input')\n reformat_node = nuke.createNode('Reformat', 'format format_value')\n nuke.createNode('Crop')\n framehold_node = nuke.createNode('FrameHold', 'first_frame b_frame')\n \n # Dissolve the layers.\n dissolve_node = nuke.createNode('Dissolve')\n dissolve_node.setInput(1, prev_merge_node)\n dissolve_node.setInput(0, dissolve_node)\n \n knob = dissolve_node.knob('which')\n knob.setAnimated(0)\n \n animKnob = knob.animations()\[0]\n animKnob.setKey(1 + pause_time + (last_frame + pause_time + ((last_frame - nuke.thisNode().knob('b_frame').value()) / nuke.thisNode().knob('b_rSpeed').value())) + x * wipe_time + x * pause_time, 1)\n animKnob.setKey(pause_time + (last_frame + pause_time + ((last_frame - nuke.thisNode().knob('b_frame').value()) / nuke.thisNode().knob('b_rSpeed').value())) + x * wipe_time + x * pause_time + wipe_time, 0)\n \n prev_merge_node = dissolve_node\n \n \n \n else:\n \n nuke.message(\"Well shit, you've broken it, and I don't know how. Please shoot me an email to support@benmcewan.com and let me know, so I can fix it!\")\n \n breakdown_length = int((last_frame + pause_time + ((last_frame - nuke.thisNode().knob('b_frame').value()) / nuke.thisNode().knob('b_rSpeed').value())) + (len(layers)-1) * wipe_time + (len(layers)-1) * pause_time + wipe_time)\n \n # Play out the remainder of the shot after the last wipe\n playout_node = nuke.createNode('TimeWarp')\n playout_node.setInput(0, comp_input)\n playout_knob = playout_node.knob('lookup')\n playout_knob.setAnimated(0)\n playout_anim = playout_knob.animations()\[0]\n playout_anim.setKey(breakdown_length, grp.knob('b_frame').value())\n playout_anim.setKey(breakdown_length + (last_frame - grp.knob('b_frame').value()), last_frame)\n \n # Switch to the TimeWarp at the right time\n switch_node = nuke.createNode('Switch')\n switch_node.setInput(0, prev_merge_node)\n switch_node.setInput(1, playout_node)\n switch_node.knob('which').setAnimated(0)\n switchAnim = switch_node.knob('which').animations()\[0]\n switchAnim.setKey(breakdown_length - 1, 0)\n switchAnim.setKey(breakdown_length, 1)\n \n # We need an output node so we can view the Group...\n nuke.createNode('Crop')\n nuke.createNode('Output')\n \n # End the adding of stuff to our Group.\n grp.end()\n \n # Connect the newly-created inputs to the relevant read nodes.\n for y in range(0, len(layers)):\n grp.setInput(y, layers\[y])\n \n # Set the frame range in project settings\n nuke.root().knob('last_frame').setValue(breakdown_length + (last_frame - grp.knob('b_frame').value()))\n\nbreakdownerizationer_run()" +STARTLINE}
addUserKnob {26 ""}
addUserKnob {20 info l Info}
addUserKnob {26 ""}
addUserKnob {26 version_info l "" +STARTLINE T "\nCreated by Ben McEwan\nhttp://www.benmcewan.com\n\nVersion 1.0\nLast Updated: September 18th, 2019\n\n"}
addUserKnob {22 btn_bug_report l " Report a Bug " T "import webbrowser\nwebbrowser.open(\"mailto:?to=support@benmcewan.com&subject=I found a bug in Breakdownerizationer v1.0\", new=1)\n" +STARTLINE}
addUserKnob {26 spacer_02 l "" +STARTLINE T " "}
addUserKnob {26 ""}
}