Group { name Perimeter help "Perimeter is an advanced edge matte generation tool. " tile_color 0xff5f00ff selected true xpos -284 ypos -338 addUserKnob {20 perimeter l Perimeter} addUserKnob {26 globalSettings l "Global"} addUserKnob {41 from0 l Source t "Select the Source channel to use for creating the edge matte. By default, it is the alpha channel of the Source input. " T Copy_Source.from0} addUserKnob {41 from0_1 l Mask t "(Optional) Select the Mask channel to use for the mask. By default, it is the alpha channel of the Mask input, if connected. " T Copy_Mask.from0} addUserKnob {7 globalExpand l Expand t "Expand the edge matte both inward and outward at the same time. " R 0 100} globalExpand 1 addUserKnob {6 roundFilter l "Round Filter" t "Apply a Round filter to round out the edges of the matte. " -STARTLINE} addUserKnob {7 globalSoften l Soften t "Soften the matte both inward and outward. " R 0 100} addUserKnob {7 globalOffset l Offset t "Offset the edge matte inward or outward. \n\nNote: Only works as intended when both the Enable Inner and Enable Outer checkboxes are ticked. " R -100 100} addUserKnob {41 bbox l "Set BBox To" t "Control the output bounding box: \n\nB side will output the Source input’s bounding box. \n\nA side will output the edge matte’s bounding box. \n\nUnion will output the union of A and B. " T Copy_Edge_Matte.bbox} addUserKnob {6 cropToFormat l "Crop To Format " t "Crop the bounding box to the Source's format (i.e. not to its bounding box). \n" -STARTLINE} addUserKnob {4 sourceInteraction l "|   Source Interaction" t "Mask or stencil the edge matte by the Source. " -STARTLINE M {None Mask Stencil "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""}} addUserKnob {26 innerEdgeSettings l "Inner Edge"} addUserKnob {20 innerEdgeSettingsDropDown l "" +STARTLINE n 1} innerEdgeSettingsDropDown 0 addUserKnob {7 innerEdge l Expand t "Expand the edge matte inward. " R 0 100} addUserKnob {6 enableInnerEdge l "Enable Inner" t "Enable/disable the inner edge. " -STARTLINE} enableInnerEdge true addUserKnob {7 softenInnerEdge l Soften t "Soften the inner edge. " R 0 100} addUserKnob {6 limitInnerSoften l "Limit To Inside" t "Limit the inner edge softening to the inside, or let it spill over to the outside. " -STARTLINE} limitInnerSoften true addUserKnob {7 mixInner l Mix t "Mix back the opacity of the inner edge. "} mixInner 1 addUserKnob {20 endGroup n -1} addUserKnob {26 outerEdgeSettings l "Outer Edge"} addUserKnob {20 outerEdgeSettingsDropDown l "" +STARTLINE n 1} outerEdgeSettingsDropDown 0 addUserKnob {7 outerEdge l Expand t "Expand the edge matte outward. " R 0 100} addUserKnob {6 enableOuterEdge l "Enable Outer" t "Enable/disable the outer edge. " -STARTLINE} enableOuterEdge true addUserKnob {7 softenOuterEdge l Soften t "Soften the outer edge. " R 0 100} addUserKnob {6 limitOuterSoften l "Limit To Outside" t "Limit the outer edge softening to the outside, or let it spill over to the inside. " -STARTLINE} limitOuterSoften true addUserKnob {7 mixOuter l Mix t "Mix back the opacity of the outer edge. "} mixOuter 1 addUserKnob {20 endGroup_1 l endGroup n -1} addUserKnob {26 info l "" +STARTLINE} addUserKnob {26 creator l "" +STARTLINE T "Kenn Hedin Kalvik"} addUserKnob {26 versioning l "" +STARTLINE T "Perimeter v1.0 | 2022"} addUserKnob {26 website l "" +STARTLINE T "www.keheka.com"} } BackdropNode { inputs 0 name BackdropNode12 tile_color 0x6e6e6eff label "Edge Matte" note_font Verdana note_font_size 200 xpos -3601 ypos -1926 bdwidth 3794 bdheight 4142 } BackdropNode { inputs 0 name BackdropNode4 tile_color 0xa8a8a8ff label "Source \nInput" note_font_size 100 xpos 1229 ypos -2856 bdwidth 481 bdheight 334 } BackdropNode { inputs 0 name BackdropNode5 tile_color 0xa8a8a8ff label Output note_font_size 100 xpos 1203 ypos 5982 bdwidth 481 bdheight 334 } BackdropNode { inputs 0 name BackdropNode7 tile_color 0x6e6e6eff label Mask note_font Verdana note_font_size 200 xpos -160 ypos 2954 bdwidth 1403 bdheight 2232 } BackdropNode { inputs 0 name BackdropNode1 tile_color 0xa8a8a8ff label "Outer Edge" note_font_size 100 xpos -2376 ypos -286 bdwidth 693 bdheight 862 z_order 1 } BackdropNode { inputs 0 name BackdropNode10 tile_color 0xa8a8a8ff label "Select \nMask\nChannel" note_font_size 100 xpos 652 ypos 3922 bdwidth 476 bdheight 382 z_order 1 } BackdropNode { inputs 0 name BackdropNode11 tile_color 0xa8a8a8ff label "Mask \nInput" note_font_size 100 xpos 641 ypos 3103 bdwidth 470 bdheight 290 z_order 1 } BackdropNode { inputs 0 name BackdropNode2 tile_color 0xa8a8a8ff label "Inner Edge" note_font_size 100 xpos -1588 ypos -290 bdwidth 693 bdheight 862 z_order 1 } BackdropNode { inputs 0 name BackdropNode3 tile_color 0xa8a8a8ff label "Input Interaction" note_font_size 100 xpos -1723 ypos 1275 bdwidth 872 bdheight 727 z_order 1 } BackdropNode { inputs 0 name BackdropNode6 tile_color 0xa8a8a8ff label "Source\nError\nHandling" note_font_size 100 xpos -1215 ypos -1729 bdwidth 467 bdheight 427 z_order 1 } BackdropNode { inputs 0 name BackdropNode8 tile_color 0xa8a8a8ff label "Select \nSource\nChannel" note_font_size 100 xpos -1215 ypos -1212 bdwidth 469 bdheight 385 z_order 1 } BackdropNode { inputs 0 name BackdropNode9 tile_color 0xa8a8a8ff label "Mask\nError\nHandling" note_font_size 100 xpos 652 ypos 3450 bdwidth 468 bdheight 406 z_order 1 } Input { inputs 0 name mask xpos 830 ypos 3252 number 1 } AddChannels { channels alpha name AddChannels_Mask xpos 830 ypos 3624 } Dot { name Dot48 xpos 864 ypos 4068 } set N6e361400 [stack 0] Dot { name Dot49 xpos 741 ypos 4068 } Dot { name Dot50 xpos 741 ypos 4157 } push $N6e361400 Copy { inputs 2 from0 rgba.alpha to0 rgba.alpha name Copy_Mask xpos 830 ypos 4147 disable {{error}} } Invert { channels alpha name Invert_Mask xpos 830 ypos 4408 } Clamp { channels alpha name Clamp_Mask xpos 830 ypos 4550 } Dot { name Dot44 xpos 864 ypos 4703 } Input { inputs 0 name source xpos 1408 ypos -2689 } Dot { name Dot4 xpos 1442 ypos -2293 } set N6e38d400 [stack 0] Dot { name Dot39 xpos 1442 ypos 2650 } set N6e38d000 [stack 0] Dot { name Dot41 xpos 198 ypos 2650 } Dot { name Dot42 xpos 198 ypos 4524 } set N6e38c800 [stack 0] Dot { name Dot43 xpos 372 ypos 4524 } Shuffle { in alpha red white green white blue white alpha white name Shuffle_White label "White Alpha" xpos 338 ypos 4599 } ChannelMerge { inputs 2 operation stencil bbox B name ChannelMerge_Mask xpos 338 ypos 4686 disable {{"!(\[exists parent.input1]*clamp(parent.from0_1))"}} } Dot { name Dot38 xpos 372 ypos 4801 } push $N6e38d400 Dot { name Dot45 xpos -1003 ypos -2293 } AddChannels { channels alpha name AddChannels_Source xpos -1037 ypos -1547 } Dot { name Dot6 xpos -1003 ypos -1103 } set N6e3acc00 [stack 0] Dot { name Dot46 xpos -1126 ypos -1103 } Dot { name Dot47 xpos -1126 ypos -1014 } push $N6e3acc00 Copy { inputs 2 from0 rgba.alpha to0 rgba.alpha name Copy_Source xpos -1037 ypos -1024 } Remove { operation keep channels alpha name Remove_Source xpos -1037 ypos -722 } Clamp { channels alpha name Clamp_Source xpos -1037 ypos -606 } Dot { name Dot1 xpos -1003 ypos -423 } set N6e3d3400 [stack 0] Dot { name Dot2 xpos -1845 ypos -423 } set N6e3d3000 [stack 0] Dot { name Dot13 xpos -2700 ypos -423 } set N6e3d2c00 [stack 0] Dot { name Dot8 xpos -3137 ypos -423 } Dot { name Dot37 xpos -3137 ypos 1523 } Dot { name Dot28 xpos -1607 ypos 1523 } set N6e3d2000 [stack 0] Dot { name Dot30 xpos -1607 ypos 1672 } push $N6e3d2c00 Shuffle { in alpha red black green black blue black alpha black name Shuffle_Off label "Black Alpha" xpos -2734 ypos 104 } Dot { name Dot14 xpos -2700 ypos 1093 } push $N6e3d3000 Dot { name Dot9 xpos -1845 ypos -143 } set N6e3f5000 [stack 0] Dot { name Dot19 xpos -2201 ypos -143 } Dot { name Dot25 xpos -2201 ypos -47 } set N6e3f4800 [stack 0] Dot { name Dot26 xpos -1949 ypos -47 } Dot { name Dot21 xpos -1949 ypos 17 } set N6e3f4000 [stack 0] Dot { name Dot15 xpos -2077 ypos 17 } Invert { channels alpha name Invert_Outer xpos -2111 ypos 95 } FilterErode { size -1 name FilterErode_Outer xpos -2111 ypos 175 } Dot { name Dot22 xpos -2077 ypos 255 } push $N6e3f4000 Shuffle { in alpha red white green white blue white alpha white name Shuffle_Outer label "White Alpha" xpos -1983 ypos 96 } Switch { inputs 2 which 1 name Switch_Outer xpos -1983 ypos 251 disable {{!parent.limitOuterSoften}} } Dot { name Dot16 xpos -1949 ypos 325 } push $N6e3f4800 Group { name Erode_Fine_Outer help "Erode an image with fine controls, as opposed to Nuke's default erode node." tile_color 0xef7033ff label "\[value size]" note_font "DejaVu Sans" xpos -2235 ypos 91 disable {{!parent.enableOuterEdge}} addUserKnob {20 erode_fine l "Fine Erode"} addUserKnob {41 channels T NodeWrapper1.channels} addUserKnob {26 ""} addUserKnob {6 round_filter l "Round Filter" t "Erode the image with a round Filter (well, it's more of a dodecagon... but... you know..) instead of a square filter." +STARTLINE} round_filter {{parent.roundFilter}} addUserKnob {7 size l Size t "Amount of erode/dilate. Positive values will grow the image, negative values will shrink it." R -10 10} size {{abs(parent.outerEdge)+abs(parent.globalExpand)+parent.globalOffset}} addUserKnob {26 ""} addUserKnob {41 maskChannelInput l mask T NodeWrapper1.maskChannelInput} addUserKnob {41 inject -STARTLINE T NodeWrapper1.inject} addUserKnob {41 invert_mask l invert -STARTLINE T NodeWrapper1.invert_mask} addUserKnob {41 fringe -STARTLINE T NodeWrapper1.fringe} addUserKnob {41 mix T NodeWrapper1.mix} addUserKnob {26 spin_copyright_div l "" +STARTLINE} addUserKnob {26 spin_copyright l "" t "© SPINVFX\nErode_Fine\nVersion 1.0\n2018" +STARTLINE T "SPINVFX - Version 1.0 - 2018 - Github Page"} } BackdropNode { inputs 0 name BackdropNode1 tile_color 0x75667fff label "round dilate trick" note_font_size 40 xpos 212 ypos -67 bdwidth 299 bdheight 618 } Input { inputs 0 name Inputmask xpos 251 ypos 1257 number 1 } Input { inputs 0 name Input xpos -11 ypos -243 } Dot { name Dot15 tile_color 0xcccccc00 xpos 22 ypos -160 } set N6e43f000 [stack 0] Dot { name Dot3 tile_color 0xcccccc00 xpos 23 ypos 33 } set N6e43ec00 [stack 0] Dot { name Dot1 tile_color 0xcccccc00 xpos 296 ypos 33 } set N6e43e800 [stack 0] Dot { name Dot2 tile_color 0xcccccc00 xpos 415 ypos 33 } AdjBBox { numpixels {{abs(ceil(parent.size)*1.4)+2}} name AdjBBox1 xpos 381 ypos 100 } Dot { name Dot4 tile_color 0xcccccc00 xpos 415 ypos 422 } push $N6e43e800 Dilate { size {{"int(parent.size)//3 + (int(parent.size)%3 >= 1)"}} name Dilate1 label "size \[value size]" xpos 262 ypos 97 } Transform { rotate 30 shutteroffset centred name Transform1 label "\[if \{\[value translate.x] != 0 || \[value translate.y] != 0\} then \{return \"t \[value translate.x] \[value translate.y]\n\"\} else \{return \"\"\}]\[if \{\[value rotate] != 0\} then \{return \"r \[value rotate]\n\"\} else \{return \"\"\}] \[if \{\[value scale] != 1\} then \{return \"s \[value scale]\"\} else \{return \"\"\}]\[if \{\[value skewX] != 0 || \[value skewY] != 0\} then \{return \"sk \[value skewX] \[value skewY]\n\"\} else \{return \"\"\}]\[if \{\[value motionblur] != 0\} then \{return \"mb \[value motionblur] sh \[value shutter] \[value shutteroffset]\n\"\} else \{return \"\"\}]" xpos 262 ypos 149 } Dilate { size {{"int(parent.size)//3 + (int(parent.size)%3 == 2)"}} name Dilate2 label "size \[value size]" xpos 262 ypos 187 } Transform { rotate 30 shutteroffset centred name Transform2 label "\[if \{\[value translate.x] != 0 || \[value translate.y] != 0\} then \{return \"t \[value translate.x] \[value translate.y]\n\"\} else \{return \"\"\}]\[if \{\[value rotate] != 0\} then \{return \"r \[value rotate]\n\"\} else \{return \"\"\}] \[if \{\[value scale] != 1\} then \{return \"s \[value scale]\"\} else \{return \"\"\}]\[if \{\[value skewX] != 0 || \[value skewY] != 0\} then \{return \"sk \[value skewX] \[value skewY]\n\"\} else \{return \"\"\}]\[if \{\[value motionblur] != 0\} then \{return \"mb \[value motionblur] sh \[value shutter] \[value shutteroffset]\n\"\} else \{return \"\"\}]" xpos 262 ypos 235 } Dilate { size {{int(parent.size)//3}} name Dilate3 label "size \[value size]" xpos 262 ypos 273 } Transform { rotate -60 shutteroffset centred name Transform3 label "\[if \{\[value translate.x] != 0 || \[value translate.y] != 0\} then \{return \"t \[value translate.x] \[value translate.y]\n\"\} else \{return \"\"\}]\[if \{\[value rotate] != 0\} then \{return \"r \[value rotate]\n\"\} else \{return \"\"\}] \[if \{\[value scale] != 1\} then \{return \"s \[value scale]\"\} else \{return \"\"\}]\[if \{\[value skewX] != 0 || \[value skewY] != 0\} then \{return \"sk \[value skewX] \[value skewY]\n\"\} else \{return \"\"\}]\[if \{\[value motionblur] != 0\} then \{return \"mb \[value motionblur] sh \[value shutter] \[value shutteroffset]\n\"\} else \{return \"\"\}]" xpos 262 ypos 323 } CopyBBox { inputs 2 name CopyBBox1 xpos 262 ypos 418 } push $N6e43ec00 Dilate { size {{int(parent.size)}} name Dilate4 label "size \[value size]" xpos -11 ypos 97 } Dot { name Dot14 tile_color 0xcccccc00 xpos 23 ypos 491 } set N6e499800 [stack 0] Dissolve { inputs 2 which {{clamp(abs(parent.size))}} name Dissolve1 xpos 262 ypos 481 } Dot { name Dot5 tile_color 0xcccccc00 xpos 296 ypos 539 } push $N6e499800 Switch { inputs 2 which {{parent.round_filter}} name Switch1 xpos -11 ypos 535 } AdjBBox { numpixels 1 name AdjBBox2 xpos -11 ypos 609 } Dot { name Dot6 tile_color 0xcccccc00 xpos 23 ypos 678 } set N6e498400 [stack 0] Dot { name Dot8 tile_color 0xcccccc00 xpos 175 ypos 678 } Transform { translate {{exp.expo(abs(parent.size-int(parent.size))*10)*-1} 0} center {320 240} black_outside false shutteroffset centred name Transform5 label "\[if \{\[value translate.x] != 0 || \[value translate.y] != 0\} then \{return \"t \[value translate.x] \[value translate.y]\n\"\} else \{return \"\"\}]\[if \{\[value rotate] != 0\} then \{return \"r \[value rotate]\n\"\} else \{return \"\"\}] \[if \{\[value scale] != 1\} then \{return \"s \[value scale]\"\} else \{return \"\"\}]\[if \{\[value skewX] != 0 || \[value skewY] != 0\} then \{return \"sk \[value skewX] \[value skewY]\n\"\} else \{return \"\"\}]\[if \{\[value motionblur] != 0\} then \{return \"mb \[value motionblur] sh \[value shutter] \[value shutteroffset]\n\"\} else \{return \"\"\}]" xpos 141 ypos 823 } push $N6e498400 Dot { name Dot7 tile_color 0xcccccc00 xpos -127 ypos 678 } Transform { translate {{exp.expo(abs(parent.size-int(parent.size))*10)} 0} center {320 240} black_outside false shutteroffset centred name Transform4 label "\[if \{\[value translate.x] != 0 || \[value translate.y] != 0\} then \{return \"t \[value translate.x] \[value translate.y]\n\"\} else \{return \"\"\}]\[if \{\[value rotate] != 0\} then \{return \"r \[value rotate]\n\"\} else \{return \"\"\}] \[if \{\[value scale] != 1\} then \{return \"s \[value scale]\"\} else \{return \"\"\}]\[if \{\[value skewX] != 0 || \[value skewY] != 0\} then \{return \"sk \[value skewX] \[value skewY]\n\"\} else \{return \"\"\}]\[if \{\[value motionblur] != 0\} then \{return \"mb \[value motionblur] sh \[value shutter] \[value shutteroffset]\n\"\} else \{return \"\"\}]" xpos -161 ypos 783 } push $N6e498400 Merge2 { inputs 2 operation {{parent.size>0?17:18}} bbox B also_merge all name Merge2 xpos -11 ypos 789 } Merge2 { inputs 2 operation {{parent.size>0?17:18}} bbox B also_merge all name Merge1 xpos -11 ypos 829 } Dot { name Dot9 tile_color 0x4b5ec600 xpos 23 ypos 910 } set N6e4bc800 [stack 0] Dot { name Dot10 tile_color 0x4b5ec600 xpos 175 ypos 910 } Transform { translate {0 {exp.expo(abs(parent.size-int(parent.size))*10)*-1}} center {320 240} black_outside false shutteroffset centred name Transform6 label "\[if \{\[value translate.x] != 0 || \[value translate.y] != 0\} then \{return \"t \[value translate.x] \[value translate.y]\n\"\} else \{return \"\"\}]\[if \{\[value rotate] != 0\} then \{return \"r \[value rotate]\n\"\} else \{return \"\"\}] \[if \{\[value scale] != 1\} then \{return \"s \[value scale]\"\} else \{return \"\"\}]\[if \{\[value skewX] != 0 || \[value skewY] != 0\} then \{return \"sk \[value skewX] \[value skewY]\n\"\} else \{return \"\"\}]\[if \{\[value motionblur] != 0\} then \{return \"mb \[value motionblur] sh \[value shutter] \[value shutteroffset]\n\"\} else \{return \"\"\}]" xpos 141 ypos 1061 } push $N6e4bc800 Dot { name Dot11 tile_color 0x4b5ec600 xpos -127 ypos 910 } Transform { translate {0 {exp.expo(abs(parent.size-int(parent.size))*10)}} center {320 240} black_outside false shutteroffset centred name Transform7 label "\[if \{\[value translate.x] != 0 || \[value translate.y] != 0\} then \{return \"t \[value translate.x] \[value translate.y]\n\"\} else \{return \"\"\}]\[if \{\[value rotate] != 0\} then \{return \"r \[value rotate]\n\"\} else \{return \"\"\}] \[if \{\[value scale] != 1\} then \{return \"s \[value scale]\"\} else \{return \"\"\}]\[if \{\[value skewX] != 0 || \[value skewY] != 0\} then \{return \"sk \[value skewX] \[value skewY]\n\"\} else \{return \"\"\}]\[if \{\[value motionblur] != 0\} then \{return \"mb \[value motionblur] sh \[value shutter] \[value shutteroffset]\n\"\} else \{return \"\"\}]" xpos -161 ypos 1015 } push $N6e4bc800 Merge2 { inputs 2 operation {{parent.size>0?17:18}} bbox B also_merge all name Merge3 xpos -11 ypos 1021 } Merge2 { inputs 2 operation {{parent.size>0?17:18}} bbox B also_merge all name Merge4 xpos -11 ypos 1061 } push $N6e43f000 Dot { name Dot13 tile_color 0xcccccc00 xpos -290 ypos -160 } Dot { name Dot12 tile_color 0xcccccc00 xpos -290 ypos 1261 } NodeWrapper { inputs 2+1 channels alpha name NodeWrapper1 xpos -11 ypos 1257 } Output { name Output1 xpos -11 ypos 1389 } NoOp { inputs 0 name exp label "The growth doesn't look visually linear. \nUsing curves helps a little." xpos 396 ypos 766 addUserKnob {20 User} addUserKnob {7 expo} expo {{parent.size>0?positive_curve:negative_curve}} addUserKnob {7 positive_curve} positive_curve {{curve 0 0.1037476063 0.1683235168 0.2209408283 0.2831250429 0.3357424736 0.3954704404 0.4731256962 0.5778000951 0.762029767 1}} addUserKnob {7 negative_curve} negative_curve {{curve 0 0.2209040523 0.3736710192 0.4841623592 0.5752981992 0.6541623592 0.7271137492 0.8043368459 0.8681262732 0.9249737263 1}} } end_group Blur { inputs 1+1 channels alpha size {{abs(parent.softenOuterEdge)}} name Blur_Outer label "\[value size]" xpos -2235 ypos 308 disable {{!parent.enableOuterEdge}} } Dot { name Dot7 xpos -2201 ypos 465 } push $N6e3f5000 Dissolve { inputs 2 channels alpha which {{clamp(parent.mixOuter)}} name Dissolve_Outer label "\[value which]" xpos -1879 ypos 448 } Dot { name Dot3 xpos -1845 ypos 716 } push $N6e3d3400 Dot { name Dot11 xpos -1003 ypos -143 } set N726f4800 [stack 0] Dot { name Dot20 xpos -1385 ypos -143 } Dot { name Dot23 xpos -1385 ypos -54 } set N726f4000 [stack 0] Dot { name Dot27 xpos -1126 ypos -54 } Dot { name Dot24 xpos -1126 ypos 20 } set N72715800 [stack 0] Dot { name Dot17 xpos -1265 ypos 20 } FilterErode { size -1 name FilterErode_Inner xpos -1299 ypos 94 } Dot { name Dot12 xpos -1265 ypos 233 } push $N72715800 Shuffle { in alpha red white green white blue white alpha white name Shuffle_Inner label "White Alpha" xpos -1160 ypos 95 } Switch { inputs 2 which 1 name Switch_Inner xpos -1160 ypos 229 disable {{!parent.limitInnerSoften}} } Dot { name Dot18 xpos -1126 ypos 328 } push $N726f4000 Group { name Erode_Fine_Inner help "Erode an image with fine controls, as opposed to Nuke's default erode node." tile_color 0xef7033ff label "\[value size]" note_font "DejaVu Sans" xpos -1419 ypos 88 disable {{!parent.enableInnerEdge}} addUserKnob {20 erode_fine l "Fine Erode"} addUserKnob {41 channels T NodeWrapper1.channels} addUserKnob {26 ""} addUserKnob {6 round_filter l "Round Filter" t "Erode the image with a round Filter (well, it's more of a dodecagon... but... you know..) instead of a square filter." +STARTLINE} round_filter {{parent.roundFilter}} addUserKnob {7 size l Size t "Amount of erode/dilate. Positive values will grow the image, negative values will shrink it." R -10 10} size {{-1*(abs(parent.innerEdge)+abs(parent.globalExpand)-parent.globalOffset)}} addUserKnob {26 ""} addUserKnob {41 maskChannelInput l mask T NodeWrapper1.maskChannelInput} addUserKnob {41 inject -STARTLINE T NodeWrapper1.inject} addUserKnob {41 invert_mask l invert -STARTLINE T NodeWrapper1.invert_mask} addUserKnob {41 fringe -STARTLINE T NodeWrapper1.fringe} addUserKnob {41 mix T NodeWrapper1.mix} addUserKnob {26 spin_copyright_div l "" +STARTLINE} addUserKnob {26 spin_copyright l "" t "© SPINVFX\nErode_Fine\nVersion 1.0\n2018" +STARTLINE T "SPINVFX - Version 1.0 - 2018 - Github Page"} } BackdropNode { inputs 0 name BackdropNode1 tile_color 0x75667fff label "round dilate trick" note_font_size 40 xpos 212 ypos -67 bdwidth 299 bdheight 618 } Input { inputs 0 name Inputmask xpos 251 ypos 1257 number 1 } Input { inputs 0 name Input xpos -11 ypos -243 } Dot { name Dot15 tile_color 0xcccccc00 xpos 22 ypos -160 } set N72736c00 [stack 0] Dot { name Dot3 tile_color 0xcccccc00 xpos 23 ypos 33 } set N72736800 [stack 0] Dot { name Dot1 tile_color 0xcccccc00 xpos 296 ypos 33 } set N72736400 [stack 0] Dot { name Dot2 tile_color 0xcccccc00 xpos 415 ypos 33 } AdjBBox { numpixels {{abs(ceil(parent.size)*1.4)+2}} name AdjBBox1 xpos 381 ypos 100 } Dot { name Dot4 tile_color 0xcccccc00 xpos 415 ypos 422 } push $N72736400 Dilate { size {{"int(parent.size)//3 + (int(parent.size)%3 >= 1)"}} name Dilate1 label "size \[value size]" xpos 262 ypos 97 } Transform { rotate 30 shutteroffset centred name Transform1 label "\[if \{\[value translate.x] != 0 || \[value translate.y] != 0\} then \{return \"t \[value translate.x] \[value translate.y]\n\"\} else \{return \"\"\}]\[if \{\[value rotate] != 0\} then \{return \"r \[value rotate]\n\"\} else \{return \"\"\}] \[if \{\[value scale] != 1\} then \{return \"s \[value scale]\"\} else \{return \"\"\}]\[if \{\[value skewX] != 0 || \[value skewY] != 0\} then \{return \"sk \[value skewX] \[value skewY]\n\"\} else \{return \"\"\}]\[if \{\[value motionblur] != 0\} then \{return \"mb \[value motionblur] sh \[value shutter] \[value shutteroffset]\n\"\} else \{return \"\"\}]" xpos 262 ypos 149 } Dilate { size {{"int(parent.size)//3 + (int(parent.size)%3 == 2)"}} name Dilate2 label "size \[value size]" xpos 262 ypos 187 } Transform { rotate 30 shutteroffset centred name Transform2 label "\[if \{\[value translate.x] != 0 || \[value translate.y] != 0\} then \{return \"t \[value translate.x] \[value translate.y]\n\"\} else \{return \"\"\}]\[if \{\[value rotate] != 0\} then \{return \"r \[value rotate]\n\"\} else \{return \"\"\}] \[if \{\[value scale] != 1\} then \{return \"s \[value scale]\"\} else \{return \"\"\}]\[if \{\[value skewX] != 0 || \[value skewY] != 0\} then \{return \"sk \[value skewX] \[value skewY]\n\"\} else \{return \"\"\}]\[if \{\[value motionblur] != 0\} then \{return \"mb \[value motionblur] sh \[value shutter] \[value shutteroffset]\n\"\} else \{return \"\"\}]" xpos 262 ypos 235 } Dilate { size {{int(parent.size)//3}} name Dilate3 label "size \[value size]" xpos 262 ypos 273 } Transform { rotate -60 shutteroffset centred name Transform3 label "\[if \{\[value translate.x] != 0 || \[value translate.y] != 0\} then \{return \"t \[value translate.x] \[value translate.y]\n\"\} else \{return \"\"\}]\[if \{\[value rotate] != 0\} then \{return \"r \[value rotate]\n\"\} else \{return \"\"\}] \[if \{\[value scale] != 1\} then \{return \"s \[value scale]\"\} else \{return \"\"\}]\[if \{\[value skewX] != 0 || \[value skewY] != 0\} then \{return \"sk \[value skewX] \[value skewY]\n\"\} else \{return \"\"\}]\[if \{\[value motionblur] != 0\} then \{return \"mb \[value motionblur] sh \[value shutter] \[value shutteroffset]\n\"\} else \{return \"\"\}]" xpos 262 ypos 323 } CopyBBox { inputs 2 name CopyBBox1 xpos 262 ypos 418 } push $N72736800 Dilate { size {{int(parent.size)}} name Dilate4 label "size \[value size]" xpos -11 ypos 97 } Dot { name Dot14 tile_color 0xcccccc00 xpos 23 ypos 491 } set N7278f400 [stack 0] Dissolve { inputs 2 which {{clamp(abs(parent.size))}} name Dissolve1 xpos 262 ypos 481 } Dot { name Dot5 tile_color 0xcccccc00 xpos 296 ypos 539 } push $N7278f400 Switch { inputs 2 which {{parent.round_filter}} name Switch1 xpos -11 ypos 535 } AdjBBox { numpixels 1 name AdjBBox2 xpos -11 ypos 609 } Dot { name Dot6 tile_color 0xcccccc00 xpos 23 ypos 678 } set N7278e000 [stack 0] Dot { name Dot8 tile_color 0xcccccc00 xpos 175 ypos 678 } Transform { translate {{exp.expo(abs(parent.size-int(parent.size))*10)*-1} 0} center {320 240} black_outside false shutteroffset centred name Transform5 label "\[if \{\[value translate.x] != 0 || \[value translate.y] != 0\} then \{return \"t \[value translate.x] \[value translate.y]\n\"\} else \{return \"\"\}]\[if \{\[value rotate] != 0\} then \{return \"r \[value rotate]\n\"\} else \{return \"\"\}] \[if \{\[value scale] != 1\} then \{return \"s \[value scale]\"\} else \{return \"\"\}]\[if \{\[value skewX] != 0 || \[value skewY] != 0\} then \{return \"sk \[value skewX] \[value skewY]\n\"\} else \{return \"\"\}]\[if \{\[value motionblur] != 0\} then \{return \"mb \[value motionblur] sh \[value shutter] \[value shutteroffset]\n\"\} else \{return \"\"\}]" xpos 141 ypos 823 } push $N7278e000 Dot { name Dot7 tile_color 0xcccccc00 xpos -127 ypos 678 } Transform { translate {{exp.expo(abs(parent.size-int(parent.size))*10)} 0} center {320 240} black_outside false shutteroffset centred name Transform4 label "\[if \{\[value translate.x] != 0 || \[value translate.y] != 0\} then \{return \"t \[value translate.x] \[value translate.y]\n\"\} else \{return \"\"\}]\[if \{\[value rotate] != 0\} then \{return \"r \[value rotate]\n\"\} else \{return \"\"\}] \[if \{\[value scale] != 1\} then \{return \"s \[value scale]\"\} else \{return \"\"\}]\[if \{\[value skewX] != 0 || \[value skewY] != 0\} then \{return \"sk \[value skewX] \[value skewY]\n\"\} else \{return \"\"\}]\[if \{\[value motionblur] != 0\} then \{return \"mb \[value motionblur] sh \[value shutter] \[value shutteroffset]\n\"\} else \{return \"\"\}]" xpos -161 ypos 783 } push $N7278e000 Merge2 { inputs 2 operation {{parent.size>0?17:18}} bbox B also_merge all name Merge2 xpos -11 ypos 789 } Merge2 { inputs 2 operation {{parent.size>0?17:18}} bbox B also_merge all name Merge1 xpos -11 ypos 829 } Dot { name Dot9 tile_color 0x4b5ec600 xpos 23 ypos 910 } set N727b8400 [stack 0] Dot { name Dot10 tile_color 0x4b5ec600 xpos 175 ypos 910 } Transform { translate {0 {exp.expo(abs(parent.size-int(parent.size))*10)*-1}} center {320 240} black_outside false shutteroffset centred name Transform6 label "\[if \{\[value translate.x] != 0 || \[value translate.y] != 0\} then \{return \"t \[value translate.x] \[value translate.y]\n\"\} else \{return \"\"\}]\[if \{\[value rotate] != 0\} then \{return \"r \[value rotate]\n\"\} else \{return \"\"\}] \[if \{\[value scale] != 1\} then \{return \"s \[value scale]\"\} else \{return \"\"\}]\[if \{\[value skewX] != 0 || \[value skewY] != 0\} then \{return \"sk \[value skewX] \[value skewY]\n\"\} else \{return \"\"\}]\[if \{\[value motionblur] != 0\} then \{return \"mb \[value motionblur] sh \[value shutter] \[value shutteroffset]\n\"\} else \{return \"\"\}]" xpos 141 ypos 1061 } push $N727b8400 Dot { name Dot11 tile_color 0x4b5ec600 xpos -127 ypos 910 } Transform { translate {0 {exp.expo(abs(parent.size-int(parent.size))*10)}} center {320 240} black_outside false shutteroffset centred name Transform7 label "\[if \{\[value translate.x] != 0 || \[value translate.y] != 0\} then \{return \"t \[value translate.x] \[value translate.y]\n\"\} else \{return \"\"\}]\[if \{\[value rotate] != 0\} then \{return \"r \[value rotate]\n\"\} else \{return \"\"\}] \[if \{\[value scale] != 1\} then \{return \"s \[value scale]\"\} else \{return \"\"\}]\[if \{\[value skewX] != 0 || \[value skewY] != 0\} then \{return \"sk \[value skewX] \[value skewY]\n\"\} else \{return \"\"\}]\[if \{\[value motionblur] != 0\} then \{return \"mb \[value motionblur] sh \[value shutter] \[value shutteroffset]\n\"\} else \{return \"\"\}]" xpos -161 ypos 1015 } push $N727b8400 Merge2 { inputs 2 operation {{parent.size>0?17:18}} bbox B also_merge all name Merge3 xpos -11 ypos 1021 } Merge2 { inputs 2 operation {{parent.size>0?17:18}} bbox B also_merge all name Merge4 xpos -11 ypos 1061 } push $N72736c00 Dot { name Dot13 tile_color 0xcccccc00 xpos -290 ypos -160 } Dot { name Dot12 tile_color 0xcccccc00 xpos -290 ypos 1261 } NodeWrapper { inputs 2+1 channels alpha name NodeWrapper1 xpos -11 ypos 1257 } Output { name Output1 xpos -11 ypos 1389 } NoOp { inputs 0 name exp label "The growth doesn't look visually linear. \nUsing curves helps a little." xpos 396 ypos 766 addUserKnob {20 User} addUserKnob {7 expo} expo {{parent.size>0?positive_curve:negative_curve}} addUserKnob {7 positive_curve} positive_curve {{curve 0 0.1037476063 0.1683235168 0.2209408283 0.2831250429 0.3357424736 0.3954704404 0.4731256962 0.5778000951 0.762029767 1}} addUserKnob {7 negative_curve} negative_curve {{curve 0 0.2209040523 0.3736710192 0.4841623592 0.5752981992 0.6541623592 0.7271137492 0.8043368459 0.8681262732 0.9249737263 1}} } end_group Blur { inputs 1+1 channels alpha size {{abs(parent.softenInnerEdge)}} name Blur_Inner label "\[value size]" xpos -1419 ypos 311 disable {{!parent.enableInnerEdge}} } Dot { name Dot10 xpos -1385 ypos 461 } push $N726f4800 Dissolve { inputs 2 channels alpha which {{clamp(parent.mixInner)}} name Dissolve_Inner label "\[value which]" xpos -1037 ypos 444 } ChannelMerge { inputs 2 operation xor name ChannelMerge_Edge_Matte xpos -1037 ypos 699 } Blur { channels alpha size {{abs(parent.globalSoften)}} name Blur_Global label "\[value size]" xpos -1037 ypos 883 } Switch { inputs 2 which {{!clamp(parent.enableInnerEdge*clamp(parent.mixInner)+parent.enableOuterEdge*clamp(parent.mixOuter))}} name Switch_Off xpos -1037 ypos 1089 } Dot { name Dot31 xpos -1003 ypos 1411 } set N7284fc00 [stack 0] Dot { name Dot32 xpos -1191 ypos 1411 } set N7284f800 [stack 0] Dot { name Dot33 xpos -1489 ypos 1411 } ChannelMerge { inputs 2 operation stencil bbox B name ChannelMerge_Interaction_Stencil xpos -1523 ypos 1655 } Dot { name Dot29 xpos -1489 ypos 1882 } push $N6e3d2000 Dot { name Dot35 xpos -1301 ypos 1523 } Invert { channels alpha name Invert_Interaction xpos -1335 ypos 1590 } Dot { name Dot36 xpos -1301 ypos 1668 } push $N7284f800 ChannelMerge { inputs 2 operation stencil bbox B name ChannelMerge_Interaction_Mask xpos -1225 ypos 1651 } Dot { name Dot34 xpos -1191 ypos 1780 } push $N7284fc00 Switch { inputs 3 which {{parent.sourceInteraction}} name Switch_Interaction xpos -1037 ypos 1878 } Dot { name Dot40 xpos -1003 ypos 4801 } push $N6e38c800 Shuffle { in alpha red black green black blue black alpha black name Shuffle_Black label "Black Alpha" xpos 164 ypos 4599 } Keymix { inputs 3 channels alpha name Keymix_Edge_Matte xpos 164 ypos 4791 } Clamp { channels alpha name Clamp_Output xpos 164 ypos 5014 } Dot { name Dot5 xpos 198 ypos 5492 } push $N6e38d000 Copy { inputs 2 from0 rgba.alpha to0 rgba.alpha name Copy_Edge_Matte xpos 1408 ypos 5482 } Crop { box {{format.x} {format.y} {format.r} {format.t}} crop false name Crop_To_Format xpos 1408 ypos 5681 disable {{!parent.cropToFormat}} } Output { name Output xpos 1408 ypos 6159 } end_group