set cut_paste_input [stack 0] version 10.5 v3 push $cut_paste_input Group { name OpticalZDefocus1 help "OpticalZDefocus is a physically accurate ZDefocus, which controls circle of confusion (coc) size based on lens geometry using the depth of field equation. \n\nSet your lens and film-back characteristics, your focus distance, and adjust the size of your bokeh with the aperture size, just like a real lens." tile_color 0xcc804eef selected true xpos 1219 ypos 73 addUserKnob {20 OpticalZDefocus} addUserKnob {41 channels T _ZDEFOCUS_.channels} addUserKnob {41 useGPUIfAvailable l "Use GPU if available" T _ZDEFOCUS_.useGPUIfAvailable} addUserKnob {26 ""} addUserKnob {41 depth_channel l "depth channel" t "Choose the channel that contains your Z-Depth" T CHANNEL_CHOOSER_DEPTH.Zchan} addUserKnob {26 spacer l "     " -STARTLINE T " "} addUserKnob {6 unpremult_z l "     unpremult by" t "Unpremultiply the depth layer by the selected channel" -STARTLINE} addUserKnob {41 depth_alpha l "" -STARTLINE T CHANNEL_CHOOSER_ALPHA.Zchan} addUserKnob {22 set_z l "Sample Z" t "Sets the focal distance to the Z channel value at the current focal point on the current frame." T "from __future__ import with_statement\n\nn = nuke.thisNode()\ns = n\['s']\nz_coord = n\['sample_z']\n\nwith n:\n ds = nuke.toNode('DepthSampler')\n zsample = ds.sample('red', z_coord.getValue(0), z_coord.getValue(1))\n\nif s.isAnimated():\n s.setValueAt(zsample, nuke.frame())\nelse:\n s.setValue(zsample)" +STARTLINE} addUserKnob {12 sample_z l "          sample position: " t "Allows you to sample the Z channel at a specific 2d position." -STARTLINE} sample_z {3418 1254} addUserKnob {4 depth_unit l "depth unit" t "Set the unit of your zdepth." M {mm cm dm m inch ft}} depth_unit m addUserKnob {26 spacer2 l "" t " " -STARTLINE T " "} addUserKnob {6 show_coc l "show coc" t "Output the calculated direct circle of confusion size map that is used to drive the ZDefocus in direct mode.\n\nUseful for troubleshooting." -STARTLINE} addUserKnob {6 invert_depth l depth=1/z t "Invert the depth if your input is Nuke ScanlineRender style 1/Z" -STARTLINE} addUserKnob {26 divider l " " T " "} addUserKnob {26 ""} addUserKnob {26 dof_control_label l " " T "Depth of Field Control"} addUserKnob {41 constant_defocus l "constant defocus" t "If enabled, depth-varying defocus is disabled and defocus amount is controlled directly by the max defocus slider." T _ghost_whisper_.constant_defocus} addUserKnob {7 s l "focus distance" t "Set the focus distance" R 10 1000} s 15 addUserKnob {7 N l f-stop t "Controls the aperture of your lens.\n\nBigger number = greater depth of field. \n\nSmaller numbers = shallower depth of field." R 0.8 44} N 4 addUserKnob {41 max_size l "max defocus" t "Set the max defocus size allowed" T _ZDEFOCUS_.max_size} addUserKnob {26 ""} addUserKnob {26 lens_geometry_label l " " T "Lens Geometry"} addUserKnob {22 get_selected_camera l "Get Selected Camera" t "Set the parameters using the selected camera." T "from __future__ import with_statement\n\ndef get_camera():\n ozdef = nuke.thisNode()\n with nuke.root():\n root_par = nuke.root().format().pixelAspect()\n cam = nuke.selectedNodes()\n if len(cam) != 1:\n nuke.message('Please select a single camera node.')\n return\n elif len(cam) == 0:\n nuke.message('Please select a single camera node.')\n return\n else:\n cam = cam\[0]\n if 'Camera2' not in cam.Class():\n nuke.message('Please select a camera node.')\n return\n ozdef\['f'].setValue(cam\['focal'].getValue())\n ozdef\['N'].setValue(cam\['fstop'].getValue())\n # Assuming anamorphic shows have physical haperture*2\n ozdef\['haperture'].setValue(cam\['haperture'].getValue()/root_par)\n\nif __name__ == \"__main__\":\n get_camera()" +STARTLINE} addUserKnob {41 use_camera_input l "use camera input" -STARTLINE T _ghost_whisper_.use_camera_input} addUserKnob {7 f l "focal length" t "Set the focal length of the camera" R 0 500} addUserKnob {7 haperture t "Horizontal aperture of the film-back / sensor" R 0 50} addUserKnob {26 ""} addUserKnob {7 min_zdepth l "min zdepth" t "If ZDepth = 0, ZDepth will be set to the specified value.\n\nThe ZDefocus node can be very slow to calculate if you have zero values in your zdepth, for example if you have areas that have transparent alpha. \n\nSet min zdepth to a value slightly smaller than the nearest object in your scene to speed up processing time." R 0 20} min_zdepth 1 addUserKnob {41 autoLayerSpacing l "automatic layer spacing" T _ZDEFOCUS_.autoLayerSpacing} addUserKnob {41 layers l "depth layers" T _ZDEFOCUS_.layers} addUserKnob {41 layerCurve l "layer curve" T _ZDEFOCUS_.layerCurve} addUserKnob {26 ""} addUserKnob {20 Filter} addUserKnob {41 filter_type_1 l "filter type" T _ZDEFOCUS_.filter_type} addUserKnob {7 aspect_ratio R 0 2} aspect_ratio 1 addUserKnob {7 filter_shape} filter_shape 1 addUserKnob {3 blades} blades 9 addUserKnob {7 roundness} roundness 0.2 } ZBlur { inputs 0 channels rgba shape 1 name CHANNEL_CHOOSER_DEPTH xpos -442 ypos 230 disable true } ZBlur { channels rgba Zchan rgba.alpha shape 1 name CHANNEL_CHOOSER_ALPHA xpos -442 ypos 270 disable true } Input { inputs 0 name Input label "\[value number]" xpos -308 ypos -16 } Dot { name _ghost_whisper_ knobChanged "\n\n\nthisknob = nuke.thisKnob()\nnode = nuke.thisNode()\nnuke.root().begin()\nparent_node = nuke.toNode(node.fullName().split('.')\[0])\nparent_node.begin()\n\ndef enable_knobs(enabled=True, caminput=False):\n if caminput:\n knobs = \['get_selected_camera', 'f', 'haperture']\n else:\n knobs = \['min_zdepth', 'get_selected_camera', 'f', 's', 'N', 'haperture']\n for knob in knobs:\n parent_node\[knob].setEnabled(enabled)\n\nif thisknob.name() == 'constant_defocus':\n is_const = node\['constant_defocus'].getValue()\n if is_const:\n enable_knobs(False)\n else:\n enable_knobs()\n\nif thisknob.name() == 'use_camera_input':\n if thisknob.getValue():\n enable_knobs(False, True)\n cam_input = nuke.nodes.Input(name='InputCamera', xpos=228, ypos=-16)\n parent_node\['f'].setExpression('\[topnode input2].focal')\n parent_node\['haperture'].setExpression('\[topnode input2].haperture')\n if not thisknob.getValue():\n if not parent_node\['constant_defocus'].getValue():\n enable_knobs(True, True)\n parent_node.setInput(2, None)\n nuke.delete(nuke.toNode('InputCamera'))\n parent_node\['f'].clearAnimated()\n parent_node\['haperture'].clearAnimated()\n\n\n" tile_color 0x129000ff note_font_size 42 note_font_color 0x7f7f7f01 xpos -274 ypos 114 addUserKnob {20 User} addUserKnob {6 constant_defocus t "Disables depth-varying defocus. \nBokeh size is directly controlled by max defocus." +STARTLINE} addUserKnob {6 use_camera_input l "use camera input" t "Creates a camera input pipe instead so that no user action is required." +STARTLINE} } set N2ff66400 [stack 0] Dot { name Dot7 note_font_size 42 note_font_color 0x7f7f7f01 xpos -542 ypos 114 } AddChannels { channels depth channels2 rgba name AddChannels1 xpos -576 ypos 144 } set N713efc00 [stack 0] push $N713efc00 Copy { inputs 2 from0 {{{CHANNEL_CHOOSER_DEPTH.Zchan}}} to0 rgba.red from1 {{{CHANNEL_CHOOSER_ALPHA.Zchan}}} to1 rgba.alpha bbox B name _CHOOSE_CHANNELS_ xpos -576 ypos 218 disable {{hasError}} } Unpremult { name _UNPREMULT_Z_ xpos -576 ypos 310 disable {{!parent.unpremult_z}} } Expression { temp_name3 max_dist temp_expr3 100000 expr0 "r == 0 ? max_dist : 1/r" channel1 none channel2 none name DepthInvert xpos -576 ypos 350 disable {{!parent.invert_depth}} } set N713ef000 [stack 0] Multiply { channels rgb value {{"parent.depth_unit == 1 ? 10 : parent.depth_unit == 2 ? 100 : parent.depth_unit == 3 ? 1000 : parent.depth_unit == 4 ? 25.4 : parent.depth_unit == 5 ? 304.8 : 1"}} name _UNIT_MULTIPLIER_ xpos -576 ypos 390 addUserKnob {20 User} addUserKnob {7 depth_unit_divider R 0 500} depth_unit_divider {{"parent.depth_unit == 1 ? 10 : parent.depth_unit == 2 ? 100 : parent.depth_unit == 3 ? 1000 : parent.depth_unit == 4 ? 25.4 : parent.depth_unit == 5 ? 304.8 : 1"}} } Expression { temp_name0 zdepth temp_expr0 "r < parent.min_zdepth* _UNIT_MULTIPLIER_.value ? parent.min_zdepth* _UNIT_MULTIPLIER_.value : r" temp_name1 focus_dist temp_expr1 "s * _UNIT_MULTIPLIER_.value" temp_name2 coc temp_expr2 "(fabs(focus_dist - zdepth) * pow(f,2) / (N * zdepth * (focus_dist - f)))" temp_name3 coc_px temp_expr3 "fabs(coc / haperture * input.width / 2)" channel0 rgba expr0 "parent.constant_defocus ? parent.max_size : coc_px" channel1 none name Generate_Direct_Z xpos -576 ypos 430 addUserKnob {20 Optical l "Optical Characteristics"} addUserKnob {7 f l "focal length" R 0 500} f {{parent.f}} addUserKnob {7 N l f-stop R 0 44} N {{parent.N}} addUserKnob {7 haperture R 0 50} haperture {{parent.haperture}} addUserKnob {7 s l "focus distance" R 0 1000} s {{parent.s}} } Dot { name Dot3 note_font_size 42 note_font_color 0x7f7f7f01 xpos -542 ypos 514 } set Nc0f8fc00 [stack 0] Dot { name Dot2 note_font_size 42 note_font_color 0x7f7f7f01 xpos -542 ypos 1034 } Input { inputs 0 name InputFilter label "\[value number]" xpos 94 ypos -16 number 1 } Reformat { type scale scale {1 {1/parent.aspect_ratio}} resize distort name _aspect_ratio_1 xpos 94 ypos 390 } Dot { inputs 0 name Dot1 label " Default Filter Input" note_font "Helvetica Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold" note_font_size 24 note_font_color 0xff000000 xpos 262 ypos 314 } Reformat { type "to box" box_fixed true name Reformat1 xpos 228 ypos 390 } Flare { position {{width/2} {height/2}} radius {75 88 91} inner_color 1 name Flare3 xpos 228 ypos 430 } Reformat { type scale scale {1 {1/parent.aspect_ratio}} resize distort name _aspect_ratio_2 xpos 228 ypos 470 } Shuffle { alpha red name Shuffle1 label "\[value in]" xpos 228 ypos 504 } Switch { inputs 2 which {{"\[exists parent.input1]"}} name Switch3 xpos 94 ypos 510 } Dot { name Dot6 label " " note_font "Helvetica Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold Bold" note_font_size 24 note_font_color 0xff000000 xpos 128 ypos 594 } push $Nc0f8fc00 push $N2ff66400 Dot { name Dot4 label " " note_font "Helvetica Bold Bold Bold Bold Bold" note_font_size 24 note_font_color 0xa5a5a501 xpos -274 ypos 434 } add_layer {opticalzdefocus opticalzdefocus.Z} Copy { inputs 2 from0 rgba.red to0 opticalzdefocus.Z bbox B name _Copy_ZDepth_ xpos -308 ypos 504 } ZDefocus2 { inputs 2 channels rgba z_channel opticalzdefocus.Z math direct focal_point {16540 12700} size 1 max_size 100 legacy_resize_mode false show_legacy_resize_mode false use_input_channels true aspect {{parent.aspect_ratio}} blades {{parent.blades}} roundness {{parent.roundness}} inner_feather 0.28 catadioptric_size 0.375 name _ZDEFOCUS_ xpos -308 ypos 584 } Remove { channels opticalzdefocus name Remove1 xpos -308 ypos 659 } Switch { inputs 2 which {{parent.show_coc}} name _SHOW_COC_ xpos -308 ypos 1030 } Output { name Output1 xpos -308 ypos 1230 } push $N713ef000 NoOp { name DepthSampler xpos -710 ypos 350 addUserKnob {20 User} addUserKnob {7 sval R 0 1000} } end_group # Creation Time=Wed Jun 27 13:26:46 2018 # Creator=ne