Skip to content

Instantly share code, notes, and snippets.

@draconiansolo
Last active August 29, 2015 13:56
Show Gist options
  • Save draconiansolo/9136639 to your computer and use it in GitHub Desktop.
Save draconiansolo/9136639 to your computer and use it in GitHub Desktop.
PxFck_IErode, A little hack based on PxF_IDefocus to make selective eroding possible.
set cut_paste_input [stack 0]
version 9.0 v3
push 0
push $cut_paste_input
Group {
inputs 2
name PxFck_IErode
help "Variable erode based on a control channel."
knobChanged "\nm = nuke.thisNode() # grabs current node\nkc = nuke.thisKnob() #node that is being changed\n\nif kc.name() in \[\"filter\", \"slices\"]: #if changed knob is filer or slices\n i = nuke.toNode('img') \n i2 = nuke.toNode('Shuffle1')\n o = nuke.toNode('Output1')\n \n for n in nuke.allNodes():\n if \"static\" not in n\['label'].getValue():\n nuke.delete(n)\n \n slices = int(m\['slices'].value())\n step = 1\n ii = i\n for x in range(1,slices+step,step):\n \n k = nuke.nodes.Keyer()\n k.setInput(0, i2)\n k\['operation'].setValue(\"red keyer\")\n k\['range'].setExpression(\"(1/parent.slices*\" + str(x) +\")-1/parent.slices\", 0)\n k\['range'].setExpression(\"(1/parent.slices*\" + str(x-1) + \") + (1/parent.slices*parent.overlap)\", 1)\n k\['range'].setValue(1.0, 2)\n k\['range'].setValue(1.0, 3)\n \n f = m\['filter'].value()\n if f in \[\"box\", \"triangle\", \"quadratic\", \"gaussian\"]:\n d = nuke.nodes.FilterErode()\n d.setInput(0, i)\n d\['channels'].setValue(\"alpha\")\n d\['size'].setSingleValue(False)\n d\['size'].setExpression('parent.size/parent.slices*' + str(x) + \"*parent.aspect\", 0 )\n d\['size'].setExpression('parent.size/parent.slices*' + str(x), 1)\n d\['filter'].setValue(m\['filter'].value())\n\n km = nuke.nodes.Keymix()\n km.setInput(0, ii)\n km.setInput(1, d)\n km.setInput(2, k)\n km\['bbox'].setValue(\"A side\")\n \n ii = km\n \n o.setInput(0, ii)\n\n"
tile_color 0xd6a000ff
selected true
xpos -21856
ypos 3470
mapsize {0.3694810225 1}
addUserKnob {20 IDefocus}
addUserKnob {4 filter t "box, triangle, quadratic, gaussian = Erode filter type" M {box triangle quadratic gaussian "" "" "" ""}}
addUserKnob {7 size t "Maximum amount of defocus (when the control channel is white)." R 0 100}
size -4
addUserKnob {7 aspect t "Aspect ratio of the kernel. Use this to simulate 'oval' bokeh from an anamorphic lens." R 0 4}
aspect 1
addUserKnob {4 controlChannel t "Which channel of the 'map' input used to drive the defocus." M {red green blue alpha "" ""}}
controlChannel alpha
addUserKnob {3 slices t "How many slices are generated from the 'map' image. More slices are more precise, but slower."}
slices 10
addUserKnob {7 overlap t "Normalized overlap between slices. An overlap of 0 means hard slices with no soft transition. "}
overlap 0.5
addUserKnob {7 min t "Minimum value of the control channel. Values lower than this will be clamped to 0." R 0 10}
addUserKnob {7 max t "Maximum value of the control channel. Values above this will be clamped to 1." R 0 10}
max 1
addUserKnob {26 ""}
addUserKnob {26 t l "" +STARTLINE T "PxFck_IErode--- A friendly mod of PxF_IDefocus 1.0.2"}
}
Input {
inputs 0
name map
label static
xpos 3093
ypos -899
number 1
}
Grade {
channels rgba
blackpoint {{parent.min i}}
whitepoint {{parent.max i}}
white_clamp true
name Grade1
label static
xpos 3093
ypos -802
}
Shuffle {
red {{parent.controlChannel+1 i}}
green black
blue black
alpha black
name Shuffle1
label static
xpos 3093
ypos -738
}
set N15b8f040 [stack 0]
Keyer {
operation "red keyer"
range {{(1/parent.slices*10)-1/parent.slices} {"(1/parent.slices*9) + (1/parent.slices*parent.overlap)"} 1 1}
name Keyer10
xpos 3861
ypos -700
}
Input {
inputs 0
name img
label static
xpos 3416
ypos -1096
}
set N3ad0e4e0 [stack 0]
FilterErode {
channels alpha
size {{parent.size/parent.slices*10*parent.aspect} {parent.size/parent.slices*10}}
name FilterErode10
xpos 3848
ypos -1058
}
push $N15b8f040
Keyer {
operation "red keyer"
range {{(1/parent.slices*9)-1/parent.slices} {"(1/parent.slices*8) + (1/parent.slices*parent.overlap)"} 1 1}
name Keyer9
xpos 3813
ypos -700
}
push $N3ad0e4e0
FilterErode {
channels alpha
size {{parent.size/parent.slices*9*parent.aspect} {parent.size/parent.slices*9}}
name FilterErode9
xpos 3800
ypos -1058
}
push $N15b8f040
Keyer {
operation "red keyer"
range {{(1/parent.slices*8)-1/parent.slices} {"(1/parent.slices*7) + (1/parent.slices*parent.overlap)"} 1 1}
name Keyer8
xpos 3765
ypos -700
}
push $N3ad0e4e0
FilterErode {
channels alpha
size {{parent.size/parent.slices*8*parent.aspect} {parent.size/parent.slices*8}}
name FilterErode8
xpos 3752
ypos -1058
}
push $N15b8f040
Keyer {
operation "red keyer"
range {{(1/parent.slices*7)-1/parent.slices} {"(1/parent.slices*6) + (1/parent.slices*parent.overlap)"} 1 1}
name Keyer7
xpos 3717
ypos -700
}
push $N3ad0e4e0
FilterErode {
channels alpha
size {{parent.size/parent.slices*7*parent.aspect} {parent.size/parent.slices*7}}
name FilterErode7
xpos 3704
ypos -1058
}
push $N15b8f040
Keyer {
operation "red keyer"
range {{(1/parent.slices*6)-1/parent.slices} {"(1/parent.slices*5) + (1/parent.slices*parent.overlap)"} 1 1}
name Keyer6
xpos 3333
ypos -700
}
push $N3ad0e4e0
FilterErode {
channels alpha
size {{parent.size/parent.slices*6*parent.aspect} {parent.size/parent.slices*6}}
name FilterErode6
xpos 3656
ypos -1058
}
push $N15b8f040
Keyer {
operation "red keyer"
range {{(1/parent.slices*5)-1/parent.slices} {"(1/parent.slices*4) + (1/parent.slices*parent.overlap)"} 1 1}
name Keyer5
xpos 3285
ypos -700
}
push $N3ad0e4e0
FilterErode {
channels alpha
size {{parent.size/parent.slices*5*parent.aspect} {parent.size/parent.slices*5}}
name FilterErode5
xpos 3608
ypos -1058
}
push $N15b8f040
Keyer {
operation "red keyer"
range {{(1/parent.slices*4)-1/parent.slices} {"(1/parent.slices*3) + (1/parent.slices*parent.overlap)"} 1 1}
name Keyer4
xpos 3237
ypos -700
}
push $N3ad0e4e0
FilterErode {
channels alpha
size {{parent.size/parent.slices*4*parent.aspect} {parent.size/parent.slices*4}}
name FilterErode4
xpos 3560
ypos -1058
}
push $N15b8f040
Keyer {
operation "red keyer"
range {{(1/parent.slices*3)-1/parent.slices} {"(1/parent.slices*2) + (1/parent.slices*parent.overlap)"} 1 1}
name Keyer3
xpos 3189
ypos -700
}
push $N3ad0e4e0
FilterErode {
channels alpha
size {{parent.size/parent.slices*3*parent.aspect} {parent.size/parent.slices*3}}
name FilterErode3
xpos 3512
ypos -1058
}
push $N15b8f040
Keyer {
operation "red keyer"
range {{(1/parent.slices*2)-1/parent.slices} {"(1/parent.slices*1) + (1/parent.slices*parent.overlap)"} 1 1}
name Keyer2
xpos 3141
ypos -700
}
push $N3ad0e4e0
FilterErode {
channels alpha
size {{parent.size/parent.slices*2*parent.aspect} {parent.size/parent.slices*2}}
name FilterErode2
xpos 3464
ypos -1058
}
push $N15b8f040
Keyer {
operation "red keyer"
range {{(1/parent.slices*1)-1/parent.slices} {"(1/parent.slices*0) + (1/parent.slices*parent.overlap)"} 1 1}
name Keyer1
xpos 3093
ypos -694
}
push $N3ad0e4e0
FilterErode {
channels alpha
size {{parent.size/parent.slices*1*parent.aspect} {parent.size/parent.slices*1}}
name FilterErode1
xpos 3416
ypos -1058
}
push $N3ad0e4e0
Keymix {
inputs 3
bbox A
name Keymix1
xpos 3416
ypos -694
}
Keymix {
inputs 3
bbox A
name Keymix2
xpos 3464
ypos -694
}
Keymix {
inputs 3
bbox A
name Keymix3
xpos 3512
ypos -694
}
Keymix {
inputs 3
bbox A
name Keymix4
xpos 3560
ypos -694
}
Keymix {
inputs 3
bbox A
name Keymix5
xpos 3608
ypos -694
}
Keymix {
inputs 3
bbox A
name Keymix6
xpos 3656
ypos -694
}
Keymix {
inputs 3
bbox A
name Keymix7
xpos 3717
ypos -674
}
Keymix {
inputs 3
bbox A
name Keymix8
xpos 3765
ypos -674
}
Keymix {
inputs 3
bbox A
name Keymix9
xpos 3813
ypos -674
}
Keymix {
inputs 3
bbox A
name Keymix10
xpos 3861
ypos -674
}
Output {
name Output1
label static
xpos 3871
ypos 87
}
end_group
string="""
m = nuke.thisNode() # grabs current node
kc = nuke.thisKnob() #node that is being changed
if kc.name() in ["filter", "slices"]: #if changed knob is filer or slices
i = nuke.toNode('img')
i2 = nuke.toNode('Shuffle1')
o = nuke.toNode('Output1')
for n in nuke.allNodes():
if "static" not in n['label'].getValue():
nuke.delete(n)
slices = m['slices'].value()
step = 1
ii = i
for x in range(1,slices+step,step):
k = nuke.nodes.Keyer()
k.setInput(0, i2)
k['operation'].setValue("red keyer")
k['range'].setExpression("(1/parent.slices*" + str(x) +")-1/parent.slices", 0)
k['range'].setExpression("(1/parent.slices*" + str(x-1) + ") + (1/parent.slices*parent.overlap)", 1)
k['range'].setValue(1.0, 2)
k['range'].setValue(1.0, 3)
f = m['filter'].value()
if f in ["box", "triangle", "quadratic", "gaussian"]:
d = nuke.nodes.FilterErode()
d.setInput(0, i)
d['channels'].setValue("alpha")
d['size'].setSingleValue(False)
d['size'].setExpression('parent.size/parent.slices*' + str(x) + "*parent.aspect", 0 )
d['size'].setExpression('parent.size/parent.slices*' + str(x), 1)
d['filter'].setValue(m['filter'].value())
km = nuke.nodes.Keymix()
km.setInput(0, ii)
km.setInput(1, d)
km.setInput(2, k)
km['bbox'].setValue("A side")
ii = km
o.setInput(0, ii)
"""
node["knobChanged"].setValue(string)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment