// mel override editor // matt estela 26 nov 2007 // mattestela@thehouseofcurves.com // v0.1 // // workflow to add mel code to layers, handy for several things where layer overrides don't work (eg fur). // inspired by chapmans pass system, some gui code stolen from there... thanks andrew! // // i've added an option to the r.click menu for render layers, otherwise you can just call // // showMelOverrideEditor("layername"); // // or drop this command on a shelf: // // showMelOverrideEditor(`editRenderLayerGlobals -q -currentRenderLayer`) // proc updateOverridesEditor (string $oCode, string $dCode, string $layer, string $window) { if (`objExists ($layer+".enterMel")` == 0) { addAttr -dataType "string" -ln "enterMel" $layer; setAttr -type "string" ($layer+".enterMel") "//insert MEL override code here;"; } string $enterMel = `getAttr ($layer+".enterMel")`; scrollField -edit -ip 1 -text $enterMel $oCode; if (`objExists ($layer+".exitMel")` == 0) { addAttr -dataType "string" -ln "exitMel" $layer; setAttr -type "string" ($layer+".exitMel") "//insert MEL revert code here;"; } string $exitMel = `getAttr ($layer+".exitMel")`; scrollField -edit -ip 1 -text $exitMel $dCode; window -edit -title ("Mel Override for "+$layer) $window; } global proc saveRenderPassOverride(string $oCode, string $dCode, string $layer, string $window, string $status) { string $enterMel = `scrollField -query -text $oCode`; setAttr -type "string" ($layer+".enterMel") $enterMel; string $exitMel = `scrollField -query -text $dCode`; setAttr -type "string" ($layer+".exitMel") $exitMel; if ($status == "close") { deleteUI $window; } print ($layer+" overrides updated."); } global proc showMelOverrideEditor (string $layer) { // if the window already exists, delete and recreate it (until I work out how to dynamically update all vars required) if (`window -exists melOverrideEditorWindow`) { deleteUI melOverrideEditorWindow; } string $window = `window -title ("Mel Override for "+$layer) -topLeftCorner 185 300 -width 750 -height 460 melOverrideEditorWindow`; string $form = `formLayout -numberOfDivisions 100 melOverrideEditorLayout`; string $oCodeFrame = `frameLayout -label "Override MEL Code" -borderStyle "etchedIn" -labelAlign "center" oCodeFrameFrame`; string $oCode = `scrollField -numberOfLines 5 -wordWrap false -editable true -text "" overrideCodeScrollField`; setParent ..; string $dCodeFrame = `frameLayout -label "MEL Code to revert Override" -borderStyle "etchedIn" -labelAlign "center" dCodeFrameFrame`; string $dCode = `scrollField -numberOfLines 5 -wordWrap false -editable true -text "" defaultCodeScrollField`; setParent ..; string $buttons = `formLayout buttonsForm`; string $saveCmd = ("saveRenderPassOverride "+$oCode+" "+$dCode+" "+$layer+" "+$window+" close"); string $applyCmd = ("saveRenderPassOverride "+$oCode+" "+$dCode+" "+$layer+" "+$window+" open"); button -height 31 -label "Save and Close" -c $saveCmd saveButton; button -height 31 -label "Apply" -c $applyCmd applyButton; button -height 31 -label "Cancel and Close" -c ("deleteUI "+$window) cancelButton; setParent ..; formLayout -edit -af saveButton "left" 0 -ap saveButton "right" 0 33 -ap applyButton "left" 0 33 -ap applyButton "right" 0 66 -ap cancelButton "left" 0 66 -af cancelButton "right" 0 $buttons; setParent ..; formLayout -edit -attachForm $oCodeFrame "top" 5 -attachForm $oCodeFrame "left" 5 -attachControl $oCodeFrame "bottom" 5 $dCodeFrame -attachForm $oCodeFrame "right" 5 -attachPosition $dCodeFrame "top" 0 50 -attachForm $dCodeFrame "left" 5 -attachControl $dCodeFrame "bottom" 5 $buttons -attachForm $dCodeFrame "right" 5 -attachForm $buttons "left" 0 -attachForm $buttons "right" 0 -attachForm $buttons "bottom" 0 -aof $buttons "top" -30 $form; showWindow $window; updateOverridesEditor ($oCode, $dCode, $layer, $window); // add the scriptiob to run the overrides if it doesn't exist if (`objExists onLayerChangeScript.before` == 0 ) { // create the script to read the mel overrides scriptNode -scriptType 0 -name onLayerChangeScript -bs "{\nstring $newLayer = `editRenderLayerGlobals -q -currentRenderLayer`;\nstring $oldLayer = `optionVar -q \"gMeLastLayer\"`;\n\nif (`objExists ($oldLayer+\".exitMel\")`) {\n eval(`getAttr ($oldLayer+\".exitMel\")`);\n}\nif (`objExists ($newLayer+\".enterMel\")`) {\n eval(`getAttr ($newLayer+\".enterMel\")`);\n }\noptionVar -sv \"gMeLastLayer\" $newLayer;\n}"; // run the above script in the interactive session when the layer is changed scriptJob -killWithScene -e "renderLayerManagerChange" "eval(getAttr(\"onLayerChangeScript.before\"))"; // create the scriptjob when the scene is opened scriptNode -scriptType 1 -name setupOverrideScriptJob -bs "scriptJob -killWithScene -e \"renderLayerManagerChange\" \"eval(getAttr(\\\"onLayerChangeScript.before\\\"))\""; // run the script in the batch render when it renders a layer setAttr -type "string" defaultRenderGlobals.preRenderLayerMel "eval(getAttr(\"onLayerChangeScript.before\"))"; print "mel override scriptjob initialised."; } }