LightBlur is a tool made by Mark Nettleton and Jason Billington. It creates several blurs from largest to smallest, halving the amount of blur each time. It creates a diffused/glowy feeling.

Expand LightBlur
Group {
inputs 0
name lightBlur
help "Builds a stack of blurs from largest to smallest, halving the kernel each\ntime, then adds them together"
onCreate "\nif nuke.thisNode()\['f_created'].getValue()==True:\n nuke.thisNode()\['f_created'].setValue(False)\n nuke.thisNode().showControlPanel()"
tile_color 0xff7e21ff
note_font "Bitstream Vera Sans"
selected true
xpos 103
ypos -57
addUserKnob {20 LightBlur}
addUserKnob {41 channels T Dissolve_chans.channels}
addUserKnob {14 size l blur t "Blur amount" R 1 100}
addUserKnob {7 bias t "Emphasise large or small blurs" R 0 10}
bias 1
addUserKnob {7 minBlur l "minimum blur" t "Minimum blur used for output" R 0 100}
minBlur 1
addUserKnob {3 steps t "Number of blur steps to use. 10 is max. Removes blur from minimum to maximum."}
steps 10
addUserKnob {6 do_normalize l normalize t "Divide by number of accumulated blurs" +STARTLINE}
addUserKnob {6 clampAlpha l "clamp alpha" t "Clamp the alpha to 1" +STARTLINE}
addUserKnob {41 crop l "crop to format" T masterBlur.crop}
addUserKnob {41 which l mix t "mix between original and lightblurred image" T Dissolve_chans.which}
addUserKnob {6 mask l mask/lightwrap +STARTLINE}
addUserKnob {20 blurTab l Blur}
addUserKnob {41 filter T masterBlur.filter}
addUserKnob {41 quality l "" -STARTLINE T masterBlur.quality}
addUserKnob {20 Version}
addUserKnob {26 "" l Help: T "Light Blur builds a stack of blurs from largest to smallest,\nhalves the kernel each time, and then adds them together."}
addUserKnob {26 ""}
addUserKnob {32 MoreHelp l "More Help" T "start http://lois4/document/nuke-light-blur-gizmo-help/" +STARTLINE}
addUserKnob {26 ""}
addUserKnob {26 VersionRelease l "Version Release:" T 4.0}
addUserKnob {26 re l ReleaseNotes T "Removed mask. Crop on by default."}
addUserKnob {26 "" l Authors: T "Mark Nettleton (mnettleton) and Jason Billington (jbillington)"}
addUserKnob {26 le l "Last Edit by:" T "Mark Nettleton (mnettleton)"}
addUserKnob {26 ReleaseDate l "Release Date:" T 10/17/13}
addUserKnob {6 f_created l "First Created_" +INVISIBLE +STARTLINE}
f_created true
}
Input {
inputs 0
name Input
xpos 304
ypos -899
}
Dot {
name INPUT
label INPUT
note_font_size 16
xpos 332
ypos -723
}
set N461f0800 [stack 0]
add_layer {normalize normalize.red normalize.green normalize.blue normalize.alpha}
Shuffle {
red white
green white
blue white
alpha white
out normalize
name Shuffle1
label "add Normalize"
xpos 73
ypos -727
}
set N461f0100 [stack 0]
Blur {
size {{parent.size.w} {parent.size.h}}
filter {{parent.masterBlur.filter}}
quality {{parent.masterBlur.quality}}
crop {{parent.masterBlur.crop}}
name Blur1
xpos -305
ypos -727
}
set N498f900 [stack 0]
Multiply {
value {{Blur1.size>1?1:0}}
name Multiply1
xpos -415
ypos -727
}
Multiply {
value {{Blur1.size>(parent.minBlur)?1:0}}
name Multiply18
label "Less than Parent.MinBlur = off"
xpos -415
ypos -670
}
Blur {
inputs 0
size 41
name masterBlur
tile_color 0xff0000ff
xpos -628
ypos -631
}
Input {
inputs 0
name mask
xpos -815
ypos 1311
number 1
}
set N498cf00 [stack 0]
Dot {
name Dot4
xpos -552
ypos 1315
}
Invert {
name Invert1
xpos -586
ypos 1369
}
push 0
push $N498cf00
Dot {
name Dot5
xpos -781
ypos 1445
}
Group {
inputs 3
name EdgeOutline1
onCreate "\nif nuke.thisNode()\['f_created'].getValue()==True:\n nuke.thisNode()\['f_created'].setValue(False)\n nuke.thisNode().showControlPanel()"
knobChanged "\nif nuke.thisKnob().name() == \"erode_type\": \n if nuke.thisKnob().getValue() == 0:\n nuke.thisNode().knob('erode_size').setVisible(False)\n nuke.thisNode().knob('dilate_size').setVisible(True)\n if nuke.thisKnob().getValue() == 1:\n nuke.thisNode().knob('dilate_size').setVisible(False)\n nuke.thisNode().knob('erode_size').setVisible(True)\n"
tile_color 0xe5804bff
xpos -586
ypos 1441
addUserKnob {20 User}
addUserKnob {26 author -STARTLINE +INVISIBLE T "Javier Nieto Moncó 2020"}
addUserKnob {41 edgedetector l "edge detector" T EdgeDetect9.edgedetector}
addUserKnob {41 threshold l Threshold T EdgeDetect9.threshold}
addUserKnob {68 erode_type l "Erode Type" t "Choose the erode type you want to use:\n<b> Dilate</b> will use an Erode (fast) node.\n<b> Erode Blur</b> will use an Erode (blur) node." M {Dilate "Erode Blur" "" "" "" "" ""}}
addUserKnob {7 dilate_size l Size t "This knob controls the size of the erode." R -20 20}
dilate_size 2
addUserKnob {7 erode_size l Size t "This knob controls the size of the erode." +HIDDEN R -20 20}
addUserKnob {41 blackpoint l Blackpoint T Grade77.blackpoint}
addUserKnob {41 whitepoint l Whitepoint T Grade77.whitepoint}
addUserKnob {7 edgeBlur_size l "Edge Blur" t "Amount of blur applied to the edge." R 0 100}
edgeBlur_size 3
addUserKnob {7 blur_size l Blur t "This knob controls the general blur applied to the input." R 0 100}
blur_size 25
addUserKnob {26 ""}
addUserKnob {7 mix}
mix 1
addUserKnob {22 removeEnable l "Enable Remove" t "Enables a new input that you can use to cut a portion of the node's result out.\n\nUseful when you just want the effect on the outside for example. You use the matte as this input and it will cut that shape out of the result." +HIDDEN T "nuke.thisNode().knob('removeDisable').setVisible(True)\nnuke.thisNode().knob('removeEnable').setVisible(False)\n\n\n\ndef deselectAll():\n for node in nuke.allNodes():\n node\['selected'].setValue(False)\n\ndeselectAll()\n\nnuke.nodes.Input(name='remove', xpos=146.0, ypos=24.0, selected=True)\nnewInput = nuke.selectedNode()\n\ndeselectAll()\n\nfor node in nuke.allNodes():\n if node\['name'].getValue() == 'REMOVE_REF_DOT':\n node\['selected'].setValue(True)\nnuke.selectedNode().setInput(0, newInput)\n\ndeselectAll()\n\nfor node in nuke.allNodes():\n if node\['name'].getValue() == 'RemoveStencil':\n node\['disable'].setValue(False)" +STARTLINE}
addUserKnob {22 removeDisable l "Disable Remove" t "Disables the remove input." -STARTLINE T "nuke.thisNode().knob('removeEnable').setVisible(True)\nnuke.thisNode().knob('removeDisable').setVisible(False)\n\nfor node in nuke.allNodes():\n node\['selected'].setValue(False)\n if node.Class() == 'Input':\n node\['selected'].setValue(True)\n for inputs in nuke.selectedNodes():\n if not inputs\['name'].getValue() == 'remove':\n inputs\['selected'].setValue(False)\n\n#xPos = nuke.selectedNode()\['xpos'].getValue()\n#yPos = nuke.selectedNode()\['ypos'].getValue()\n\nnukescripts.node_delete(popupOnError=True)\n\nfor node in nuke.allNodes():\n if node\['name'].getValue() == 'RemoveStencil':\n node\['disable'].setValue(True)"}
addUserKnob {6 mask -STARTLINE}
addUserKnob {6 f_created l "First Created?" +INVISIBLE +STARTLINE}
}
Input {
inputs 0
name mask
xpos -403
ypos 217
number 1
}
Dot {
name Dot509
xpos -369
ypos 290
}
Input {
inputs 0
name remove
xpos 146
ypos 24
number 2
}
Dot {
name REMOVE_REF_DOT
xpos 180
ypos 164
}
Input {
inputs 0
name Input
xpos -76
ypos -317
}
Shuffle {
in alpha
name Shuffle151
label "\[value in]"
xpos -76
ypos -277
}
EdgeDetectWrapper {
name EdgeDetect9
xpos -76
ypos -241
}
set N4958100 [stack 0]
Dot {
name Dot1
xpos -227
ypos -232
}
Erode {
channels rgba
size {{parent.erode_size}}
name Erode51
xpos -261
ypos -97
}
push $N4958100
Dilate {
channels rgba
size {{parent.dilate_size}}
name Dilate10
xpos -76
ypos -161
}
Switch {
inputs 2
which {{parent.erode_type}}
name Switch1
xpos -76
ypos -97
}
Grade {
black_clamp false
maskChannelInput -rgba.alpha
unpremult -rgba.alpha
name Grade77
xpos -76
ypos -35
}
Clamp {
maskChannelInput -rgba.alpha
unpremult -rgba.alpha
name Clamp18
xpos -76
ypos -11
}
EdgeBlur {
channels rgba
size {{parent.edgeBlur_size}}
name EdgeBlur21
xpos -76
ypos 25
}
Blur {
channels rgba
size {{parent.blur_size}}
maskChannelInput -rgba.alpha
name Blur148
xpos -76
ypos 61
}
Merge2 {
inputs 2
operation stencil
maskChannelInput -rgba.alpha
name RemoveStencil
xpos -76
ypos 161
}
Merge2 {
inputs 2
operation mask
maskChannelInput -rgba.alpha
name Merge252
xpos -76
ypos 287
disable {{!parent.mask}}
}
Shuffle {
in alpha
name Shuffle152
label "\[value in]"
xpos -76
ypos 345
}
Multiply {
value {{parent.mix}}
maskChannelInput -rgba.alpha
unpremult -rgba.alpha
name Multiply44
label "\[value value]"
xpos -76
ypos 381
}
Output {
name Output1
xpos -76
ypos 497
}
end_group
push $N461f0100
Blur {
size {{"(parent.minBlur - (parent.Blur9.size/2)) >= 0 ? (parent.minBlur - (parent.Blur9.size/2)) + (parent.Blur9.size/2) : abs(parent.minBlur - (parent.Blur9.size/2)) + parent.minBlur"} {"(parent.minBlur - (parent.Blur9.size/2)) >= 0 ? (parent.minBlur - (parent.Blur9.size/2)) + (parent.Blur9.size/2) : abs(parent.minBlur - (parent.Blur9.size/2)) + parent.minBlur"}}
filter {{parent.masterBlur.filter}}
quality {{parent.masterBlur.quality}}
crop {{parent.masterBlur.crop}}
name Blur10
xpos -107
ypos 915
}
Multiply {
value {{Blur10.size>1?1:0}}
name Multiply27
label "BlurSize less than 0 = off"
xpos -107
ypos 962
}
Multiply {
value {{"parent.steps >= \[python nuke.thisNode().input(0).input(0).name()\\\[4:\\]] ? 1 : 0"}}
name Multiply10
label steps
xpos -107
ypos 1019
}
Multiply {
value {{Plus8.mix>1?Plus8.mix:1}}
name Multiply29
label "bias fix"
xpos -195
ypos 1019
}
push $N461f0100
Blur {
size {{"(parent.minBlur - (parent.Blur8.size/2)) >= 0 ? (parent.minBlur - (parent.Blur8.size/2)) + (parent.Blur8.size/2) : abs(parent.minBlur - (parent.Blur8.size/2)) + parent.minBlur"} {"(parent.minBlur - (parent.Blur8.size/2)) >= 0 ? (parent.minBlur - (parent.Blur8.size/2)) + (parent.Blur8.size/2) : abs(parent.minBlur - (parent.Blur8.size/2)) + parent.minBlur"}}
filter {{parent.masterBlur.filter}}
quality {{parent.masterBlur.quality}}
crop {{parent.masterBlur.crop}}
name Blur9
xpos -104
ypos 696
}
Multiply {
value {{Blur9.size>1?1:0}}
name Multiply9
label "BlurSize less than 0 = off"
xpos -104
ypos 734
}
Multiply {
value {{"parent.steps >= \[python nuke.thisNode().input(0).input(0).name()\\\[4:\\]] ? 1 : 0"}}
name Multiply11
label steps
xpos -104
ypos 791
}
Multiply {
value {{Plus7.mix>1?Plus7.mix:1}}
name Multiply26
label "bias fix"
xpos -195
ypos 791
}
push $N461f0100
Blur {
size {{"(parent.minBlur - (parent.Blur7.size/2)) >= 0 ? (parent.minBlur - (parent.Blur7.size/2)) + (parent.Blur7.size/2) : abs(parent.minBlur - (parent.Blur7.size/2)) + parent.minBlur"} {"(parent.minBlur - (parent.Blur7.size/2)) >= 0 ? (parent.minBlur - (parent.Blur7.size/2)) + (parent.Blur7.size/2) : abs(parent.minBlur - (parent.Blur7.size/2)) + parent.minBlur"}}
filter {{parent.masterBlur.filter}}
quality {{parent.masterBlur.quality}}
crop {{parent.masterBlur.crop}}
name Blur8
xpos -105
ypos 471
}
Multiply {
value {{Blur8.size>1?1:0}}
name Multiply8
label "BlurSize less than 0 = off"
xpos -105
ypos 509
}
Multiply {
value {{"parent.steps >= \[python nuke.thisNode().input(0).input(0).name()\\\[4:\\]] ? 1 : 0"}}
name Multiply12
label steps
xpos -105
ypos 566
}
Multiply {
value {{Plus6.mix>1?Plus6.mix:1 i}}
name Multiply25
label "bias fix"
xpos -201
ypos 566
}
push $N461f0100
Blur {
size {{"(parent.minBlur - (parent.Blur6.size/2)) >= 0 ? (parent.minBlur - (parent.Blur6.size/2)) + (parent.Blur6.size/2) : abs(parent.minBlur - (parent.Blur6.size/2)) + parent.minBlur"} {"(parent.minBlur - (parent.Blur6.size/2)) >= 0 ? (parent.minBlur - (parent.Blur6.size/2)) + (parent.Blur6.size/2) : abs(parent.minBlur - (parent.Blur6.size/2)) + parent.minBlur"}}
filter {{parent.masterBlur.filter}}
quality {{parent.masterBlur.quality}}
crop {{parent.masterBlur.crop}}
name Blur7
xpos -105
ypos 288
}
Multiply {
value {{Blur7.size>1?1:0 i}}
name Multiply7
label "BlurSize less than 0 = off"
xpos -105
ypos 326
}
Multiply {
value {{"parent.steps >= \[python nuke.thisNode().input(0).input(0).name()\\\[4:\\]] ? 1 : 0"}}
name Multiply13
label steps
xpos -105
ypos 383
}
Multiply {
value {{Plus5.mix>1?Plus5.mix:1 i}}
name Multiply24
label "bias fix"
xpos -206
ypos 383
}
push $N461f0100
Blur {
size {{"(parent.minBlur - (parent.Blur5.size/2)) >= 0 ? (parent.minBlur - (parent.Blur5.size/2)) + (parent.Blur5.size/2) : abs(parent.minBlur - (parent.Blur5.size/2)) + parent.minBlur"} {"(parent.minBlur - (parent.Blur5.size/2)) >= 0 ? (parent.minBlur - (parent.Blur5.size/2)) + (parent.Blur5.size/2) : abs(parent.minBlur - (parent.Blur5.size/2)) + parent.minBlur"}}
filter {{parent.masterBlur.filter}}
quality {{parent.masterBlur.quality}}
crop {{parent.masterBlur.crop}}
name Blur6
xpos -105
ypos 96
}
Multiply {
value {{Blur6.size>1?1:0 i}}
name Multiply6
label "BlurSize less than 0 = off"
xpos -105
ypos 134
}
Multiply {
value {{"parent.steps >= \[python nuke.thisNode().input(0).input(0).name()\\\[4:\\]] ? 1 : 0"}}
name Multiply14
label steps
xpos -105
ypos 191
}
Multiply {
value {{Plus4.mix>1?Plus4.mix:1 i}}
name Multiply23
label "bias fix"
xpos -200
ypos 191
}
push $N461f0100
Blur {
size {{"(parent.minBlur - (parent.Blur4.size/2)) >= 0 ? (parent.minBlur - (parent.Blur4.size/2)) + (parent.Blur4.size/2) : abs(parent.minBlur - (parent.Blur4.size/2)) + parent.minBlur"} {"(parent.minBlur - (parent.Blur4.size/2)) >= 0 ? (parent.minBlur - (parent.Blur4.size/2)) + (parent.Blur4.size/2) : abs(parent.minBlur - (parent.Blur4.size/2)) + parent.minBlur"}}
filter {{parent.masterBlur.filter}}
quality {{parent.masterBlur.quality}}
crop {{parent.masterBlur.crop}}
name Blur5
xpos -105
ypos -103
}
Multiply {
value {{Blur5.size>1?1:0 i}}
name Multiply5
label "BlurSize less than 0 = off"
xpos -105
ypos -65
}
Multiply {
value {{"parent.steps >= \[python nuke.thisNode().input(0).input(0).name()\\\[4:\\]] ? 1 : 0"}}
name Multiply15
label steps
xpos -105
ypos -8
}
Multiply {
value {{Plus3.mix>1?Plus3.mix:1}}
name Multiply22
label "bias fix"
xpos -203
ypos -8
}
push $N461f0100
Blur {
size {{"(parent.minBlur - (parent.Blur3.size/2)) >= 0 ? (parent.minBlur - (parent.Blur3.size/2)) + (parent.Blur3.size/2) : abs(parent.minBlur - (parent.Blur3.size/2)) + parent.minBlur"} {"(parent.minBlur - (parent.Blur3.size/2)) >= 0 ? (parent.minBlur - (parent.Blur3.size/2)) + (parent.Blur3.size/2) : abs(parent.minBlur - (parent.Blur3.size/2)) + parent.minBlur"}}
filter {{parent.masterBlur.filter}}
quality {{parent.masterBlur.quality}}
crop {{parent.masterBlur.crop}}
name Blur4
xpos -106
ypos -282
}
Multiply {
value {{Blur4.size>1?1:0}}
name Multiply4
label "BlurSize less than 0 = off"
xpos -106
ypos -249
}
Multiply {
value {{"parent.steps >= \[python nuke.thisNode().input(0).input(0).name()\\\[4:\\]] ? 1 : 0"}}
name Multiply16
label steps
xpos -106
ypos -199
}
Multiply {
value {{Plus2.mix>1?Plus2.mix:1 i}}
name Multiply21
label "bias fix"
xpos -205
ypos -201
}
push $N461f0100
Blur {
size {{"(parent.minBlur - (parent.Blur2.size/2)) >= 0 ? (parent.minBlur - (parent.Blur2.size/2)) + (parent.Blur2.size/2) : abs(parent.minBlur - (parent.Blur2.size/2)) + parent.minBlur"} {"(parent.minBlur - (parent.Blur2.size/2)) >= 0 ? (parent.minBlur - (parent.Blur2.size/2)) + (parent.Blur2.size/2) : abs(parent.minBlur - (parent.Blur2.size/2)) + parent.minBlur"}}
filter {{parent.masterBlur.filter}}
quality {{parent.masterBlur.quality}}
crop {{parent.masterBlur.crop}}
name Blur3
xpos -104
ypos -483
}
Multiply {
value {{Blur2.size>1?1:0}}
name Multiply3
label "BlurSize less than 0 = off"
xpos -104
ypos -445
}
Multiply {
value {{"parent.steps >= \[python nuke.thisNode().input(0).input(0).name()\\\[4:\\]] ? 1 : 0"}}
name Multiply17
label steps
xpos -104
ypos -398
}
Multiply {
value {{Plus1.mix>1?Plus1.mix:1}}
name Multiply20
label "bias fix"
xpos -210
ypos -398
}
push $N461f0100
Blur {
size {{"(parent.minBlur - (parent.Blur1.size/2)) >= 0 ? (parent.minBlur - (parent.Blur1.size/2)) + (parent.Blur1.size/2) : abs(parent.minBlur - (parent.Blur1.size/2)) + parent.minBlur"} {"(parent.minBlur - (parent.Blur1.size/2)) >= 0 ? (parent.minBlur - (parent.Blur1.size/2)) + (parent.Blur1.size/2) : abs(parent.minBlur - (parent.Blur1.size/2)) + parent.minBlur"}}
filter {{parent.masterBlur.filter}}
quality {{parent.masterBlur.quality}}
crop {{parent.masterBlur.crop}}
name Blur2
xpos -101
ypos -676
}
Multiply {
value {{Blur2.size>1?1:0}}
name Multiply2
label "BlurSize less than 0 = off"
xpos -101
ypos -638
}
Multiply {
value {{"parent.steps >= \[python nuke.thisNode().input(0).input(0).name()\\\[4:\\]] ? 1 : 0"}}
name Multiply28
label steps
xpos -101
ypos -582
}
Multiply {
value {{Plus.mix>1?Plus.mix:1}}
name Multiply19
label "bias fix"
xpos -202
ypos -582
}
push $N498f900
Merge2 {
inputs 2
operation plus
also_merge normalize
mix {{1/(parent.bias*1)}}
name Plus
xpos -305
ypos -570
}
Merge2 {
inputs 2
operation plus
also_merge normalize
mix {{Plus.mix/parent.bias}}
name Plus1
selected true
xpos -305
ypos -384
}
Merge2 {
inputs 2
operation plus
also_merge normalize
mix {{Plus1.mix/(parent.bias) i}}
name Plus2
xpos -305
ypos -187
}
Merge2 {
inputs 2
operation plus
also_merge normalize
mix {{Plus2.mix/(parent.bias) i}}
name Plus3
xpos -305
ypos 6
}
Merge2 {
inputs 2
operation plus
also_merge normalize
mix {{Plus3.mix/(parent.bias) i}}
name Plus4
xpos -305
ypos 205
}
Merge2 {
inputs 2
operation plus
also_merge normalize
mix {{Plus4.mix/(parent.bias) i}}
name Plus5
xpos -305
ypos 397
}
Merge2 {
inputs 2
operation plus
also_merge normalize
mix {{Plus5.mix/(parent.bias) i}}
name Plus6
xpos -305
ypos 580
}
Merge2 {
inputs 2
operation plus
also_merge normalize
mix {{Plus6.mix/(parent.bias)}}
name Plus7
xpos -305
ypos 803
}
Merge2 {
inputs 2
operation plus
also_merge normalize
mix {{Plus6.mix/(parent.bias)}}
name Plus8
xpos -305
ypos 1031
}
set N49c8800 [stack 0]
Dot {
name Dot3
xpos -196
ypos 1127
}
push $N49c8800
Dot {
name Dot2
xpos -271
ypos 1124
}
Merge2 {
inputs 2
operation divide
Bchannels normalize
name Merge1
label Normalize
xpos -305
ypos 1208
disable {{!parent.do_normalize}}
}
Remove {
channels normalize
name Remove1
xpos -305
ypos 1269
}
Clamp {
channels alpha
name Clamp1
xpos -305
ypos 1337
disable {{parent.clampAlpha-1 i x25 1}}
}
Merge2 {
inputs 2
operation mask
name Merge2
xpos -305
ypos 1441
disable {{!parent.mask}}
}
push $N461f0800
Dot {
name Dot1
xpos 324
ypos 1577
}
Dissolve {
inputs 2
channels rgb
which 1
maskChannelMask none
name Dissolve_chans
label channels_todo
xpos -305
ypos 1567
}
Output {
name Output
xpos -305
ypos 1644
}
end_group