// =========================================================================== // Copyright 2018 Autodesk, Inc. All rights reserved. // // Use of this software is subject to the terms of the Autodesk license // agreement provided at the time of installation or download, or which // otherwise accompanies this software in either electronic or hard copy form. // =========================================================================== ///////////////////////////////////////////////////////////////////////////// // Utility methods ///////////////////////////////////////////////////////////////////////////// // This global variable is used for saving preset path for render pass global string $gRenderPassPresetPath[]; global proc setParentToPassesTab() // // Description: // Set the parent layout to be the column layout for the passes tab, // taking into account the crazy multi-tab layout thing for master // layer when layers exist // { // First set the parent to the correct tab layout. // Account for the special "all renderers" master layer layout // when we are using render layers global string $gMasterLayerRendererName; string $renderer = isDisplayingAllRendererTabs() ? $gMasterLayerRendererName : `currentRenderer`; string $tabLayout = rendererTabLayoutName($renderer); setParent $tabLayout; setParent passesTabColumn; } proc string passContOptionMenuName() // // Description: // There is a bug or something in the way menu parenting works for option // menus, so we need to ensure a more globally unique name for the option // menu for the pass conribution map section. This way we can add and // remove items from the correct menu. Always access the menu name // through this method. // { global string $gMasterLayerRendererName; string $prefix = isDisplayingAllRendererTabs() ? $gMasterLayerRendererName : `currentRenderer`; return ($prefix + "passContributionMapOption"); } proc int isRenderPass(string $obj) // // Description: // Does the object exist and is it a renderPass node // { return ($obj != "" && `objExists $obj` && `nodeType $obj` == "renderPass"); } proc int isRenderPassSet(string $obj) // // Description: // Does the object exist and is it a renderPassSet node // { return ($obj != "" && `objExists $obj` && `nodeType $obj` == "renderPassSet"); } proc int isPassContributionMap(string $obj) // // Description: // Does the object exist and is it a passContributionMap node // { return ($obj != "" && `objExists $obj` && `nodeType $obj` == "passContributionMap"); } proc string formattedNodeName(string $node) // // Description: // Nice name for node name, called for all node name display in the tab, // but doesn't necessarily do something for every node. // { string $renderablePostfix = (uiRes("m_createMayaRenderPassTab.kRenderablePostfix")); if ($node == "") { return $node; } else if ($node == "defaultRenderLayer") { return "masterLayer"; } else if (isRenderPassSet($node)) { string $result = (uiRes("m_createMayaRenderPassTab.kSetPrefix")) + $node; if (!`getAttr ($node + ".renderable")`) { $result += $renderablePostfix; } return $result; } else if (isRenderPass($node)) { string $result = $node; if (!`getAttr ($node + ".renderable")`) { $result += $renderablePostfix; } return $result; } else { return $node; } } proc string unformattedNodeName(string $label) // // Description // Given a nice name created by the above function, return the node name // { if ($label == "") { return $label; } else if ($label == "masterLayer") { return "defaultRenderLayer"; } string $setPrefix = (uiRes("m_createMayaRenderPassTab.kSetPrefix")); string $renderablePostfix = (uiRes("m_createMayaRenderPassTab.kRenderablePostfix")); string $node = $label; if (startsWith($node, $setPrefix)) { $node = `substring $node (size($setPrefix)+1) (size($node))`; } if (endsWith($node, $renderablePostfix)) { $node = `substring $node 1 (size($node) - size($renderablePostfix))`; } return $node; } proc string getCurrentLayer() // // Description: // Get the name of the current render layer // { return `editRenderLayerGlobals -q -currentRenderLayer`; } proc string getCurrentPassContributionMap() // // Description: // Get the name of the current pass contribution map based on the state // of the UI // { string $contMapOptionMenuName = passContOptionMenuName(); if (`optionMenu -exists $contMapOptionMenuName ` && `optionMenu -q -numberOfItems $contMapOptionMenuName` > 0) { string $selected = `optionMenu -q -value $contMapOptionMenuName`; string $node = unformattedNodeName($selected); if ($node != "" && isPassContributionMap($node)) { return $node; } } return ""; } proc string findNextValidScrollListSelection(string $scrollList) // // Description // Find the unselected item in a scrolllist that should be selected // after an update in the event that none of the current selection remains // in the list // { string $result = ""; string $selection[] = `textScrollList -q -selectItem $scrollList`; int $numSelection = size($selection); string $allItems[] = `textScrollList -q -allItems $scrollList`; int $numAllItems = size($allItems); if ($numSelection > 0 && $numSelection != $numAllItems) { string $lastSelected = $selection[$numSelection-1]; if ($lastSelected == $allItems[$numAllItems-1]) { // search up for first unselected item since the last item in // the list is also the last selected item for ($i=$numAllItems-1; $i>=0; $i--) { if (!stringArrayContains($allItems[$i], $selection)) { $result = $allItems[$i]; break; } } } else { // search down for last selected and grab item after for ($i=0; $i<$numAllItems; $i++) { if ($allItems[$i] == $lastSelected && $i+1<$numAllItems) { $result = $allItems[$i+1]; break; } } } } return unformattedNodeName($result); } proc restoreScrollListSelection(string $scrollList, string $selection[], string $alternate) // // Description // Restore the selection to the scroll list given in selection, select // alternate if none of the items in selection exist in the list // { textScrollList -edit -deselectAll $scrollList; string $allItems[] = `textScrollList -q -allItems $scrollList`; string $name = ""; int $selectionMade = false; for ($item in $selection) { $name = formattedNodeName($item); if (stringArrayContains($name, $allItems)) { textScrollList -edit -selectItem $name $scrollList; $selectionMade = true; } } if (!$selectionMade) { $name = formattedNodeName($alternate); if (stringArrayContains($name, $allItems)) { textScrollList -edit -selectItem $name $scrollList; } } } proc enablePassesList(int $enable, string $type) // // Description: // Enable/disable a passes list without touching layouts so that // buttons can be enabled independently of the whole thing // { setParentToPassesTab(); string $layoutName = ($type + "PassesListLayout"); if (`layout -exists $layoutName`) { string $controls[] = `layout -q -childArray $layoutName`; string $newLayouts[] = {}; while (size($controls) > 0) { $newLayouts = {}; for ($c in $controls) { if (`layout -exists $c`) { $newLayouts[size($newLayouts)] = $c; } else { control -edit -enable $enable $c; } } $controls = {}; for ($nl in $newLayouts) { string $children[] = `layout -q -childArray $nl`; $controls = stringArrayCatenate($controls, $children); } } } } proc enablePassesListButton(int $enable, string $type, int $buttonIndex) // // Description: // Enable/disable a specific button (1-indexed) in a passes list // { setParentToPassesTab(); string $buttonName = ($type + "PassesListButton" + $buttonIndex); if (`symbolButton -exists $buttonName`) { symbolButton -edit -enable $enable $buttonName; } } proc string[] getSelectedItemsInPassesList(string $type) // // Description: // Retrieve the selected items in the given pass list as node // names rather than nice names. // { string $result[]; string $items[] = `textScrollList -q -selectItem ($type + "PassesList")`; for ($item in $items) { $result[size($result)] = unformattedNodeName($item); } return $result; } ///////////////////////////////////////////////////////////////////////////// // Callbacks ///////////////////////////////////////////////////////////////////////////// global proc renderPassesCreateRenderPassDialogCreateButtonCallback( string $prefixControl, string $suffixControl, string $passSetCheckBoxControl, string $passSetNameControl) // // Description: // Create render pass nodes with presets selected in the text scroll list // { global string $gPassesTabPassSelectionOverride[]; global string $gRenderPassPresetPath[]; string $cmd; string $selected[] = `textScrollList -q -selectItem passesCreateScrollList`; string $passSetName = ""; int $isSetCreate = `checkBoxGrp -q -value1 $passSetCheckBoxControl`; $passSetName = `textFieldGrp -q -text $passSetNameControl`; optionVar -intValue isCreateRenderPassSet $isSetCreate; optionVar -stringValue renderPassSetName $passSetName; if(1 == $isSetCreate){ if("" != $passSetName){ $cmd = "createNode -name " + "\"" + $passSetName + "\" renderPassSet"; $passSetName = evalEcho($cmd); } else{ $cmd = "createNode renderPassSet"; $passSetName = evalEcho($cmd); } $gPassesTabPassSelectionOverride[size($gPassesTabPassSelectionOverride)] = $passSetName; } else { $passSetName = ""; } string $prefix = `textFieldGrp -q -text $prefixControl`; if("" != $prefix){ optionVar -stringValue renderPassNamePrefix $prefix; } else{ optionVar -remove renderPassNamePrefix; } string $suffix = `textFieldGrp -q -text $suffixControl`; if("" != $suffix){ optionVar -stringValue renderPassNameSuffix $suffix; } else{ optionVar -remove renderPassNameSuffix; } int $selectIndexes[] = `textScrollList -q -selectIndexedItem passesCreateScrollList`; string $allItems[] = `textScrollList -q -allItems passesCreateScrollList`; int $numPasses = size($selectIndexes); int $i; for($i = 0; $i < $numPasses; $i++){ $cmd = "shadingNode -asRendering renderPass"; string $passName; $passName = evalEcho($cmd); string $path = $gRenderPassPresetPath[ $selectIndexes[$i] - 1]; if(`filetest -e $path`){ $cmd = "applyAttrPreset \"" + $passName + "\" \"" + $path + "\" 1"; evalEcho($cmd); } else{ string $warn = (uiRes("m_createMayaRenderPassTab.kNoFile")); $warn = `format -stringArg $path $warn`; warning($warn); } string $passID = getAttr ($passName + ".passID"); string $ui = $allItems[ $selectIndexes[$i] - 1]; string $temp = renderPassDefaultName($ui, $passID); string $newName; if("" == $prefix ){ $newName = $temp + $suffix; } else{ $newName = $prefix + `capitalizeString $temp` + $suffix; } if("" != $newName){ $cmd = "rename \"" + $passName + "\" \"" + $newName +"\""; $passName = evalEcho($cmd); } $gPassesTabPassSelectionOverride[size($gPassesTabPassSelectionOverride)] = $passName; //associate render pass to the set if("" != $passSetName){ string $renderPassPlug = $passSetName + ".renderPass"; string $ownerPlug = $passName + ".owner"; $cmd = "connectAttr -nextAvailable \"" + $renderPassPlug + "\" \"" + $ownerPlug + "\""; evalEcho($cmd); } } } global proc renderPassesCreateRenderPassDialogDim(string $parent) // // Description: // Callback to dim button based on selection in scroll list // { setParent $parent; int $enable = (size(`textScrollList -q -selectItem passesCreateScrollList`) > 0); button -edit -enable $enable passesCreateButton; button -edit -enable $enable passesCreateCloseButton; } global proc renderPassesUpdatePresetTextScrollListControl(string $selectItem) { // // Description: // Update text scroll list in render pass creation dialog // $selectItem will be selected // string $presetList[] = getRenderPassPresets(); string $selectItems[] = `textScrollList -q -selectItem passesCreateScrollList`; textScrollList -e -removeAll passesCreateScrollList; for($item in $presetList){ textScrollList -e -append $item passesCreateScrollList; } if("" == $selectItem){ for($item in $selectItems){ if(stringArrayContains($item,$presetList)){ textScrollList -e -selectItem $item passesCreateScrollList; } } } else{ textScrollList -e -deselectAll passesCreateScrollList; textScrollList -e -selectItem $selectItem passesCreateScrollList; } } global proc renderPassesCreateRenderPassDialog() // // Description: // Create the UI for a dialog to create render pass nodes with selected presets // { string $form = `setParent -q`; formLayout -edit -width 450 $form; frameLayout -label (uiRes("m_createMayaRenderPassTab.kPassList")) -collapsable false -collapse false -annotation (uiRes("m_createMayaRenderPassTab.kSelectPassesToCreate")) miRenderPassesListFrame; formLayout mainLayout; textScrollList -height 250 -allowMultiSelection true -selectCommand ("renderPassesCreateRenderPassDialogDim " + $form) passesCreateScrollList; renderPassesUpdatePresetTextScrollListControl(""); formLayout -edit -attachForm passesCreateScrollList "top" 0 -attachForm passesCreateScrollList "bottom" 0 -attachForm passesCreateScrollList "left" 0 -attachForm passesCreateScrollList "right" 0 mainLayout; setParent..; setParent..; frameLayout -label (uiRes("m_createMayaRenderPassTab.kNamePresets")) -collapsable false -collapse false -annotation (uiRes("m_createMayaRenderPassTab.kSetRenderPassName")) miRenderPassesNamePresetsFrame; string $passNameFixLayout = `columnLayout -adj 1`; string $prefixControl = `textFieldGrp -label (uiRes("m_createMayaRenderPassTab.kPassPrefix")) -annotation (uiRes("m_createMayaRenderPassTab.kPrefixForPassName"))`; if (`optionVar -exists renderPassNamePrefix`) { textFieldGrp -e -text `optionVar -query renderPassNamePrefix` $prefixControl; } string $suffixControl = `textFieldGrp -label (uiRes("m_createMayaRenderPassTab.kPassSuffix")) -annotation (uiRes("m_createMayaRenderPassTab.kSuffixForPassName"))`; if (`optionVar -exists renderPassNameSuffix`) { textFieldGrp -e -text `optionVar -query renderPassNameSuffix` $suffixControl; } string $passSetControl = `checkBoxGrp -label "" -label1 (uiRes("m_createMayaRenderPassTab.kCreatePassSet")) -annotation (uiRes("m_createMayaRenderPassTab.kCreateSetAndAssociatePasses"))`; string $passSetNameControl = `textFieldGrp -label (uiRes("m_createMayaRenderPassTab.kPassSetName"))`; if (`optionVar -exists renderPassSetName`) { textFieldGrp -e -text `optionVar -query renderPassSetName` $passSetNameControl; } if (`optionVar -exists isCreateRenderPassSet`) { checkBoxGrp -e -value1 `optionVar -query isCreateRenderPassSet` $passSetControl; textFieldGrp -e -enable `optionVar -query isCreateRenderPassSet` $passSetNameControl; } else { checkBoxGrp -e -value1 0 $passSetControl; textFieldGrp -e -enable 0 $passSetNameControl; } checkBoxGrp -e -onCommand1 ("textFieldGrp -e -enable 1 " + $passSetNameControl) -offCommand1 ("textFieldGrp -e -enable 0 " + $passSetNameControl) $passSetControl; setParent..; setParent..; button -label (uiRes("m_createMayaRenderPassTab.kCreateClosePassesButton")) -enable false -command ("renderPassesCreateRenderPassDialogCreateButtonCallback " + $prefixControl + " " + $suffixControl + " " + $passSetControl + " " + $passSetNameControl + ";layoutDialog -dismiss \"\"") passesCreateCloseButton; button -label (uiRes("m_createMayaRenderPassTab.kCreatePassesButton")) -enable false -command ("renderPassesCreateRenderPassDialogCreateButtonCallback " + $prefixControl + " " + $suffixControl + " " + $passSetControl + " " + $passSetNameControl + ";passesTabUpdateFullRenderPassesControls;") passesCreateButton; button -label (uiRes("m_createMayaRenderPassTab.kCancelCreatePassesButton")) -command "layoutDialog -dismiss \"\"" passesCancelCreateButton; textScrollList -e -doubleClickCommand ("renderPassesCreateRenderPassDialogCreateButtonCallback " + $prefixControl + " " + $suffixControl + " " + $passSetControl + " " + $passSetNameControl + ";layoutDialog -dismiss \"\"") passesCreateScrollList; formLayout -edit -attachForm miRenderPassesListFrame "top" 5 -attachForm miRenderPassesListFrame "left" 5 -attachControl miRenderPassesListFrame "bottom" 5 miRenderPassesNamePresetsFrame -attachForm miRenderPassesListFrame "right" 5 -attachNone miRenderPassesNamePresetsFrame "top" -attachForm miRenderPassesNamePresetsFrame "left" 5 -attachForm miRenderPassesNamePresetsFrame "right" 5 -attachControl miRenderPassesNamePresetsFrame "bottom" 5 passesCreateButton -attachNone passesCreateCloseButton "top" -attachForm passesCreateCloseButton "left" 5 -attachForm passesCreateCloseButton "bottom" 5 -attachPosition passesCreateCloseButton "right" 2 33 -attachNone passesCreateButton "top" -attachPosition passesCreateButton "left" 2 33 -attachForm passesCreateButton "bottom" 5 -attachPosition passesCreateButton "right" 2 67 -attachNone passesCancelCreateButton "top" -attachPosition passesCancelCreateButton "left" 2 67 -attachForm passesCancelCreateButton "bottom" 5 -attachForm passesCancelCreateButton "right" 5 $form; } global proc renderPassesCreateRenderPassNode(int $isSet) // // Description: // Create a render pass set node, or one or more render pass nodes // and set override to ensure newly created nodes are selected in // the pass list on refresh. // { string $newNode = ""; global string $gPassesTabPassSelectionOverride[]; if ($isSet) { $newNode = `createNode renderPassSet`; $gPassesTabPassSelectionOverride[size($gPassesTabPassSelectionOverride)] = $newNode; } else { layoutDialog -title (uiRes("m_createMayaRenderPassTab.kCreateDialogTitle")) -uiScript "renderPassesCreateRenderPassDialog"; } } global proc renderPassesSetRenderable(int $renderable, int $override, string $type) // // Description: // Called on select of an item in the popup menu on the pass list // sets/overrides renderable attribute of selected passes. Both the // renderable and override parameters are three way: -1, 0, 1 where // -1 is set non-renderable/remove override, 0 is leave as is and 1 // is set renderable/add override. // { // Turn off updates of the tab until after we've set all renderable flags // This prevents overupdating of the tab. global int $gUpdateRenderPassesRenderableStateOverride; $gUpdateRenderPassesRenderableStateOverride = 1; // reset override to 0 (do nothing) if this is not the master layer $override = (getCurrentLayer() != "defaultRenderLayer" ? $override : 0); string $selectedItems[] = getSelectedItemsInPassesList($type); for ($node in $selectedItems) { if (isRenderPass($node) || isRenderPassSet($node)) { if ($override == -1) { editRenderLayerAdjustment -remove ($node + ".renderable"); } else if ($override) { editRenderLayerAdjustment ($node + ".renderable"); } if ($renderable == -1) { setAttr ($node + ".renderable") 0; } else if ($renderable) { setAttr ($node + ".renderable") 1; } } } // Call tab update manually passesTabUpdateFullRenderPassesControls(); // remove the override after all of the script jobs have finished string $script = ("global int $gUpdateRenderPassesRenderableStateOverride; " + "$gUpdateRenderPassesRenderableStateOverride = 0;"); evalDeferred -lowestPriority $script; } global proc renderPassesAdjustLayerConnection(int $assign, string $type) // // Description: // Called on press of the arrow buttons to adjust the connection between // passes and layers // { setParentToPassesTab(); string $selectedItems[] = getSelectedItemsInPassesList($type); string $currentLayer = getCurrentLayer(); if ($currentLayer == "" || size($selectedItems) == 0) return; for ($node in $selectedItems) { if (isRenderPass($node) || isRenderPassSet($node)) { if ($assign) { evalEcho("connectAttr -nextAvailable " + $currentLayer + ".renderPass " + $node + ".owner"); } else { evalEcho("disconnectAttr -nextAvailable " + $currentLayer + ".renderPass " + $node + ".owner"); } } } } global proc renderPassesAdjustMapConnection(int $assign, string $type) // // Description: // Called on press of the arrow buttons to adjust the connection between // passes and maps // { setParentToPassesTab(); string $selectedItems[] = getSelectedItemsInPassesList($type); string $currentMap = getCurrentPassContributionMap(); if ($currentMap == "" || size($selectedItems) == 0) return; for ($node in $selectedItems) { if (isRenderPass($node) || isRenderPassSet($node)) { string $connected[] = `listConnections -type "renderPass" ($currentMap + ".renderPass")`; $connected = stringArrayCatenate($connected, `listConnections -type "renderPassSet" ($currentMap + ".renderPass")`); if ($assign) { if (!stringArrayContains($node, $connected)) evalEcho("connectAttr -nextAvailable " + $node + ".message " + $currentMap + ".renderPass"); } else { if (stringArrayContains($node, $connected)) evalEcho("disconnectAttr -nextAvailable " + $node + ".message " + $currentMap + ".renderPass"); } } } } global proc renderPassesDeleteSelected(string $type) // // Description: // Called on press of the Delete button, or when the delete key is // pressed. // { setParentToPassesTab(); string $selectedItems[] = getSelectedItemsInPassesList($type); for ($node in $selectedItems) { if (isRenderPass($node) || isRenderPassSet($node)) { // confirm delete if connected to multiple things int $confirmDelete = true; string $owners[] = `listConnections -type "renderLayer" ($node + ".owner")`; string $maps[] = `listConnections -type "passContributionMap" ($node + ".message")`; if (size($owners) > 1 || size($maps) > 0) { string $title = (uiRes("m_createMayaRenderPassTab.kConfirmPassContDel")); string $confirmString = (uiRes("m_createMayaRenderPassTab.kConfirmDelYes")); string $denyString = (uiRes("m_createMayaRenderPassTab.kConfirmDelNo")); string $message = (uiRes("m_createMayaRenderPassTab.kConfirmDelMsg")); $message = `format -s $node $message`; string $result = `confirmDialog -title $title -button $confirmString -button $denyString -defaultButton $confirmString -messageAlign "center" -message $message`; $confirmDelete = ($result == $confirmString); } if ($confirmDelete) { catch(`evalEcho("delete "+$node)`); } } } } global proc selectAndDisplayRenderPass(string $type) // // Description: // Called on double click of a pass or when the "Edit" button is pressed. // { setParentToPassesTab(); string $selectedItems[] = getSelectedItemsInPassesList($type); string $node = $selectedItems[0]; if (isRenderPass($node) || isRenderPassSet($node)) { select -replace $node; editSelected(); } } global proc createNewPassContMap() // // Description: // Called on press of the new map button, creates a new pass contribution // map and associates it with the current layer. Also sets a global // override to force the new map to become the current map on the refresh // that these actions trigger // { string $newNode = `createNode passContributionMap`; string $currentLayer = getCurrentLayer(); if ($newNode != "" && $currentLayer != "") { // associate node with current layer evalEcho("connectAttr -na " + $currentLayer + ".passContributionMap " + $newNode + ".owner"); // set override for next ui update global string $gPassesTabPassContributionMapSelectionOverride; $gPassesTabPassContributionMapSelectionOverride = formattedNodeName($newNode); } } global proc deleteCurrentPassContMap() // // Description: // Called on press of the delete button for pass contribution maps, delete // after confirmation from user // { setParentToPassesTab(); string $map = getCurrentPassContributionMap(); if (isPassContributionMap($map)) { // confirm delete if connected to multiple things int $confirmDelete = true; string $owners[] = `listConnections -type "renderLayer" ($map + ".owner")`; if (size($owners) > 1) { string $title = (uiRes("m_createMayaRenderPassTab.kConfirmPassContDel")); string $confirmString = (uiRes("m_createMayaRenderPassTab.kConfirmDelYes")); string $denyString = (uiRes("m_createMayaRenderPassTab.kConfirmDelNo")); string $message = (uiRes("m_createMayaRenderPassTab.kConfirmDelMsgMap")); $message = `format -s $map $message`; string $result = `confirmDialog -title $title -button $confirmString -button $denyString -defaultButton $confirmString -messageAlign "center" -message $message`; $confirmDelete = ($result == $confirmString); } if ($confirmDelete) { catch(`evalEcho("delete "+$map)`); } } } global proc selectAndDisplayPassContMap() // // Description: // Called on press of the Edit button for passContributionMap // { setParentToPassesTab(); string $map = getCurrentPassContributionMap(); if (isPassContributionMap($map)) { select -replace $map; editSelected(); } } global proc onPassContributionMapChange() // // Description: // Called on create/delete of a passContributionMap, trigger updates // { updatePassTabScriptJobs(); passesTabUpdatePassContributionControls(); } global proc int renderPassesPrecompFileBrowserCB( string $attr, string $fileName, string $fileType) // // Description: // Called by file browser dialog when the user selectes a file, update the // attribute appropriately. // { setAttr -type "string" $attr $fileName; return true; } global proc renderPassesPrecompFileBrowser(string $cmd) // // Description: // Called on press of the "browse" button for the precomp file // { fileBrowser($cmd, (uiRes("m_createMayaRenderPassTab.kOpen")), "", 0); } global proc int renderPassesFilterPassesNotInLayer(string $node) // // Description: // Filter function, returns true if the pass/passSet node should be // filtered out of the list, based on connectivity with current layer // { string $currentLayer = getCurrentLayer(); // error condition, don't filter the node if ($node == "" || $currentLayer == "") return false; string $type = `nodeType $node`; if ($type == "renderPassSet") { string $passSets[] = `listConnections -type "renderPassSet" ($currentLayer + ".renderPass")`; if (stringArrayContains($node, $passSets)) { return false; } } else if ($type == "renderPass") { string $passes[] = `listConnections -type "renderPass" ($currentLayer + ".renderPass")`; if (stringArrayContains($node, $passes)) { return false; } } // node not found or is not a pass/passSet, thus it should be filtered return true; } global proc int renderPassesFilterPassesInLayer(string $node) // // Description: // Filter function, returns true if the pass/passSet node shoule be // filtered out of the list, this returns the inverse of // renderPassesFilterPassesNotInLayer // { if ($node == "") { // error condition, don't filter the node return false; } else { return !renderPassesFilterPassesNotInLayer($node); } } global proc int renderPassesFilterPassesNotInMap(string $node) // // Description: // Filter function, returns true if the pass/passSet node should be // filtered out of the list, based on connectivity with the current // layer and map // { // error condition, don't filter the node if ($node == "") return false; if (!renderPassesFilterPassesNotInLayer($node)) { string $currentMap = getCurrentPassContributionMap(); if ($currentMap != "") { string $passes[] = `listConnections -type "renderPass" ($currentMap + ".renderPass")`; string $passSets[] = `listConnections -type "renderPassSet" ($currentMap + ".renderPass")`; if (stringArrayContains($node, $passes) || stringArrayContains($node, $passSets)) { return false; } } } return true; } ///////////////////////////////////////////////////////////////////////////// // UI Update methods ///////////////////////////////////////////////////////////////////////////// global proc updatePassTabScriptJobs() // // Description: // Add/replace scriptJobs for layers and passContributionMaps so that // the UI stays in sync with the scene // { setParentToPassesTab(); string $allLayers[] = `listConnections renderLayerManager.renderLayerId`; int $prevReplaced = false; for ($layer in $allLayers) { if ($prevReplaced) { scriptJob -parent passesTabColumn -connectionChange ($layer + ".renderPass") "passesTabUpdateFullRenderPassesControls"; } else { scriptJob -replacePrevious -parent passesTabColumn -connectionChange ($layer + ".renderPass") "passesTabUpdateFullRenderPassesControls"; $prevReplaced = true; } scriptJob -parent passesTabColumn -connectionChange ($layer + ".passContributionMap") "passesTabUpdatePassContributionControls"; } string $allMaps[] = `ls -type passContributionMap`; for ($map in $allMaps) { scriptJob -parent passesTabColumn -disregardIndex -connectionChange ($map + ".renderPass") "passesTabUpdatePassContributionControls"; } string $passes[] = `ls -type renderPass`; string $passSets[] = `ls -type renderPassSet`; string $allNodes[] = stringArrayCatenate($passSets, $passes); for ($node in $allNodes) { scriptJob -parent passesTabColumn -attributeChange ($node + ".renderable") "updateRenderPassesRenderableState"; } } global string $gPassesTabPassSelectionOverride[] = {}; global proc updateRenderPassesList(string $type, string $filterFunction) // // Description: // Update the pass list given by $type filtering out passes using the // $filterFunction // { setParentToPassesTab(); string $listName = ($type + "PassesList"); // save widget size int $width = `textScrollList -q -width $listName`; int $height = `textScrollList -q -height $listName`; // save selctions, override if requested string $selection[]; string $alternate; global string $gPassesTabPassSelectionOverride[]; if (size($gPassesTabPassSelectionOverride) > 0) { $selection = $gPassesTabPassSelectionOverride; $gPassesTabPassSelectionOverride = {}; // clear override } else { $selection = getSelectedItemsInPassesList($type); $alternate = findNextValidScrollListSelection($listName); } // clear list textScrollList -edit -removeAll $listName; // pass sets string $passSets[] = `ls -type renderPassSet`; $passSets = `sort $passSets`; string $passes[] = `ls -type renderPass`; $passes = `sort $passes`; string $allNodes[] = stringArrayCatenate($passSets, $passes); for ($n in $allNodes) { if ($filterFunction == "" || eval($filterFunction + " " + $n) == false) { string $name = formattedNodeName($n); textScrollList -edit -append $name $listName; } } // restore selections restoreScrollListSelection($listName, $selection, $alternate); // On Linux (at least) the lists change size when adding/removing // items. Reset the size so they don't do that. if ($height > 1 && $width > 1) { textScrollList -edit -width $width -height $height $listName; } } global int $gUpdateRenderPassesRenderableStateOverride = 0; global proc updateRenderPassesRenderableState() // // Description: // Wrapper for script job call back on updating the tab when the // the renderable flag of a pass changes. When the user selects a lot // of passes and uses the right click menu to update the renderable // flag there is too much updating. We override that case here. { global int $gUpdateRenderPassesRenderableStateOverride; if (!$gUpdateRenderPassesRenderableStateOverride) { passesTabUpdateFullRenderPassesControls(); } } global proc updateRenderPassesListMenu(string $type, string $menuName) // // Description // Enable/disable menu items in the pass list popup menu // { setParentToPassesTab(); string $listName = ($type + "PassesList"); string $selectedItems[] = getSelectedItemsInPassesList($type); int $selected = (size($selectedItems) > 0); string $currentLayer = getCurrentLayer(); int $override = ($selected && ($currentLayer != "defaultRenderLayer")); setParent -menu $menuName; menuItem -edit -enable $selected ($listName + "SetRenderableItem"); menuItem -edit -enable $selected ($listName + "SetNonRenderableItem"); menuItem -edit -enable $override ($listName + "OverrideRenderableItem"); menuItem -edit -enable $override ($listName + "OverrideNonRenderableItem"); int $enable = false; if ($override) { for ($node in $selectedItems) { if (isRenderPass($node) || isRenderPassSet($node)) { string $connections[] = `listConnections -type "renderLayer" ($node + ".renderable")`; if (stringArrayContains($currentLayer, $connections)) { $enable = true; break; } } } } menuItem -edit -enable $enable ($listName + "RemoveOverrideItem"); } global proc passesTabUpdatePassAssociationButtonState() // // Description: // Enable/disable association buttons // { setParentToPassesTab(); int $enable = (size(`getSelectedItemsInPassesList("scene")`) > 0); nodeIconButton -edit -enable $enable renderPassesButtonsAssociate1; $enable = (size(`getSelectedItemsInPassesList("associated")`) > 0); nodeIconButton -edit -enable $enable renderPassesButtonsDeAssociate1; // enable PCM associate button if passes are selected in the associated // list AND the current PCM is not empty AND the PCM section is enabled string $contMapOptionMenuName = passContOptionMenuName(); string $currMap = getCurrentPassContributionMap(); int $contEnable = (($currMap != "") && `optionMenu -q -enable $contMapOptionMenuName`); nodeIconButton -edit -enable ($contEnable && $enable) renderPassesButtonsAssociate2; $enable = (size(`getSelectedItemsInPassesList("contribution")`) > 0); nodeIconButton -edit -enable ($contEnable && $enable) renderPassesButtonsDeAssociate2; } global proc passesTabUpdateScenePassesButtons() // // Description: // Enable/disable the buttons associated with the "scene" section // { setParentToPassesTab(); int $enable = (size(`getSelectedItemsInPassesList("scene")`) > 0); enablePassesListButton($enable, "scene", 3); enablePassesListButton($enable, "scene", 4); } global proc passesTabUpdatePassLayerControls() // // Description: // Update the scene and associated passes lists // { setParentToPassesTab(); // update lists updateRenderPassesList("scene", "renderPassesFilterPassesInLayer"); updateRenderPassesList("associated", "renderPassesFilterPassesNotInLayer"); // update buttons passesTabUpdateScenePassesButtons(); passesTabUpdatePassAssociationButtonState(); } global proc passesTabUpdatePassContributionControls() // // Description: // Update the Pass Contribution Maps controls in the render passes frame // { setParentToPassesTab(); passesTabUpdatePassContributionMenu(); // update passes list updateRenderPassesList("contribution", "renderPassesFilterPassesNotInMap"); // update enable state of controls updateEnablePassContributionControls(); } global proc updateEnablePassContributionControls() // // Description: // Update the enable/disable state of all PCM controls // { setParentToPassesTab(); // enable all PCM controls if we have some PCMs and if there are passes // associated with the current layer to work with the PCMs string $contMapOptionMenuName = passContOptionMenuName(); string $currLayer = getCurrentLayer(); int $enable = ((`optionMenu -q -numberOfItems $contMapOptionMenuName` > 1) && (size(`listConnections ($currLayer + ".renderPass")`) > 0)); layout -edit -enable $enable renderPassesButtonsLayout2; layout -edit -enable $enable contMapControlContainer; enablePassesList($enable, "contribution"); // always enable create map button enablePassesListButton(1, "contribution", 1); // update association buttons passesTabUpdatePassAssociationButtonState(); // No maps, so no more to do at this point if (!$enable) return; // Maps exist, so we should toggle the edit/delete buttons string $currMap = getCurrentPassContributionMap(); $enable = ($currMap != ""); enablePassesListButton($enable, "contribution", 2); enablePassesListButton($enable, "contribution", 3); } global string $gPassesTabPassContributionMapSelectionOverride = ""; global proc passesTabUpdatePassContributionMenu() // // Description: // Update the pass contribution map selection UI in the render // passes frame // { setParentToPassesTab(); string $contMapOptionMenuName = passContOptionMenuName(); if (!`optionMenu -exists $contMapOptionMenuName`) return; // remove all items from option menu group but save old selection, // override if requested global string $gPassesTabPassContributionMapSelectionOverride; string $oldSelect = $gPassesTabPassContributionMapSelectionOverride; if (`optionMenu -q -numberOfItems $contMapOptionMenuName` > 0) { if ($oldSelect == "") $oldSelect = `optionMenu -q -value $contMapOptionMenuName`; // Don't delete the first item and be sure to select it before // deleting all the others. This is a work around for a refresh // bug in Linux. optionMenu -edit -value (uiRes("m_createMayaRenderPassTab.kSelectPCM")) $contMapOptionMenuName; string $menuItems[] = `optionMenu -q -itemListLong $contMapOptionMenuName`; int $numItems = size($menuItems); for ($i=1; $i<$numItems; $i++) { catch(`deleteUI -mi $menuItems[$i]`); } } // clear override $gPassesTabPassContributionMapSelectionOverride = ""; // get all maps connected to current layer string $currentLayer = getCurrentLayer(); string $maps[] = `listConnections -type "passContributionMap" ($currentLayer + ".passContributionMap")`; // on change optionMenu -edit -changeCommand("updateRenderPassesList \"contribution\" \"renderPassesFilterPassesNotInMap\"; updateEnablePassContributionControls") $contMapOptionMenuName; if (size($maps) > 0) { // populate option menu and reselect previous int $oldSelectFound = false; $maps = `sort $maps`; for ($map in $maps) { string $name = formattedNodeName($map); if ($name == $oldSelect) $oldSelectFound = true; menuItem -parent $contMapOptionMenuName -label $name; } if ($oldSelectFound) { optionMenu -edit -value $oldSelect $contMapOptionMenuName; } } } global proc passesTabUpdateFullRenderPassesControls() // // Description: // Update the "Render Passes" frame of the tab // { // update controls passesTabUpdatePassLayerControls(); passesTabUpdatePassContributionControls(); } global proc passesTabUpdatePrecompControls() // // Description: // Update the "Precomp" frame of the tab // { string $currentLayer = `editRenderLayerGlobals -q -currentRenderLayer`; // update label string $label = (uiRes("m_createMayaRenderPassTab.kPrecomp")); string $nodeNiceName = formattedNodeName($currentLayer); $label = `format -s $nodeNiceName $label`; text -edit -label $label precompTemplateLabel; // keep control connected to correct layer connectControl -index 2 precompTemplateCheckBox -preventOverride 1 ($currentLayer + ".isDefaultPrecompTemplateOverride"); connectControl -fileName precompTemplateField -preventOverride 1 ($currentLayer + ".precompTemplate"); passesTabUpdateDefaultPrecompControls(); // update the browse button callback for the current layer string $command = ("renderPassesPrecompFileBrowserCB " + $currentLayer + ".precompTemplate "); symbolButton -edit -command ("renderPassesPrecompFileBrowser \"" + $command + "\"") precompTemplateButton; } global proc updateMayaRenderPassTab() // // Description: // Update the full render pass tab // { passesTabUpdateFullRenderPassesControls(); passesTabUpdatePrecompControls(); updatePassTabScriptJobs(); } ///////////////////////////////////////////////////////////////////////////// // UI Creation methods ///////////////////////////////////////////////////////////////////////////// proc string passesTabCreateListAndButtons( string $type, int $listWidth, int $listHeight, string $listSelectCmd, string $title, string $buttonImages[], string $buttonAnnotations[], string $buttonCmds[]) // // Description: // Create a textScrollList with title and optional buttons below // { string $layoutName = ($type + "PassesListLayout"); string $subFormLayoutName = ($layoutName + "Form"); string $titleName = ($type + "PassesListTitle"); string $listName = ($type + "PassesList"); string $buttonPrefix = ($type + "PassesListButton"); string $buttonLayout = ($type + "PassesListButtonLayout"); int $numButtons = size($buttonImages); int $spacing = 2; int $margin = 0; columnLayout -columnAlign "left" $layoutName; text -label $title $titleName; formLayout $subFormLayoutName; textScrollList -width $listWidth -height $listHeight -allowMultiSelection true -doubleClickCommand ("selectAndDisplayRenderPass \"" + $type + "\"") -deleteKeyCommand ("renderPassesDeleteSelected \"" + $type + "\"") $listName; if ($listSelectCmd != "") { textScrollList -edit -selectCommand $listSelectCmd $listName; } string $menuName = `popupMenu`; // use full name to get past UI update issues popupMenu -edit -postMenuCommand ("updateRenderPassesListMenu " + $type + " " + $menuName) $menuName; menuItem -label (uiRes("m_createMayaRenderPassTab.kPMSetRenderable")) -command ("renderPassesSetRenderable 1 0 " + $type) ($listName + "SetRenderableItem"); menuItem -label (uiRes("m_createMayaRenderPassTab.kPMSetNonRenderable")) -command ("renderPassesSetRenderable -1 0 " + $type) ($listName + "SetNonRenderableItem"); menuItem -label (uiRes("m_createMayaRenderPassTab.kPMOverrideRenderable")) -command ("renderPassesSetRenderable 1 1 " + $type) ($listName + "OverrideRenderableItem"); menuItem -label (uiRes("m_createMayaRenderPassTab.kPMOverrideNonRenderable")) -command ("renderPassesSetRenderable -1 1 " + $type) ($listName + "OverrideNonRenderableItem"); menuItem -label (uiRes("m_createMayaRenderPassTab.kPMRemoveOverride")) -command ("renderPassesSetRenderable 0 -1 " + $type) ($listName + "RemoveOverrideItem"); setParent -menu ..; for ($i=0; $i<$numButtons; $i++) { symbolButton -image $buttonImages[$i] -annotation $buttonAnnotations[$i] -command $buttonCmds[$i] ($buttonPrefix + ($i+1)); } setParent ..; formLayout -edit -attachForm $listName "top" $margin -attachForm $listName "left" $margin -attachNone $listName "bottom" -attachNone $listName "right" $subFormLayoutName; if ($numButtons > 0) { string $buttonName = ($buttonPrefix + "1"); formLayout -edit -attachForm $buttonName "top" $margin -attachControl $buttonName "left" $spacing $listName -attachNone $buttonName "bottom" -attachNone $buttonName "right" $subFormLayoutName; } for ($i=2; $i<=$numButtons; $i++) { string $buttonName = ($buttonPrefix + $i); formLayout -edit -attachControl $buttonName "top" $spacing ($buttonPrefix + ($i-1)) -attachControl $buttonName "left" $spacing $listName -attachNone $buttonName "bottom" -attachNone $buttonName "right" $subFormLayoutName; } setParent ..; return $layoutName; } global proc passesTabCreateFullRenderPassesControls() // // Description: // Create the controls for the "Render Passes" frame of the tab // { string $parent = `setParent -query`; setUITemplate -pushTemplate DefaultTemplate; int $listHeight = 150; int $listWidth = 380; int $halfListWidth = $listWidth/2; columnLayout -adjustableColumn true -columnAttach "both" 5 -rowSpacing 3 renderPassesPassAssociationLayout; // scene passes section string $scenePassesLayout = passesTabCreateListAndButtons( "scene", $listWidth, $listHeight, "passesTabUpdatePassAssociationButtonState; passesTabUpdateScenePassesButtons", (uiRes("m_createMayaRenderPassTab.kScenePasses")), { "newRenderPass.png", "newRenderPassSet.png", "editRenderPass.png", "deleteRenderPass.png", "passSetRelationEditor.png" }, { (uiRes("m_createMayaRenderPassTab.kNewPassLabelAnn")), (uiRes("m_createMayaRenderPassTab.kNewPassSetLabelAnn")), (uiRes("m_createMayaRenderPassTab.kEditPassLabelAnn")), (uiRes("m_createMayaRenderPassTab.kDeletePassLabelAnn")), (uiRes("m_createMayaRenderPassTab.kPassSetRelationLabelAnn")) }, { "renderPassesCreateRenderPassNode 0", "renderPassesCreateRenderPassNode 1", "selectAndDisplayRenderPass \"scene\"", "renderPassesDeleteSelected \"scene\"", "RenderPassSetEditor" }); // buttons between associated passes and maps rowLayout -numberOfColumns 2 -columnWidth2 $halfListWidth $halfListWidth -columnAttach2 "right" "left" -columnOffset2 1 1 renderPassesButtonsLayout1; nodeIconButton -image "passesUIAssociate.png" -height 25 -annotation (uiRes("m_createMayaRenderPassTab.kAddPassesAnn1")) -command ("renderPassesAdjustLayerConnection 1 \"scene\"") renderPassesButtonsAssociate1; nodeIconButton -image "passesUIDeAssociate.png" -height 25 -annotation (uiRes("m_createMayaRenderPassTab.kRemovePassesAnn1")) -command ("renderPassesAdjustLayerConnection 0 \"associated\"") renderPassesButtonsDeAssociate1; setParent ..; // associated passes section string $asscPassesLayout = passesTabCreateListAndButtons( "associated", $listWidth, $listHeight, // different width since no buttons "passesTabUpdatePassAssociationButtonState", (uiRes("m_createMayaRenderPassTab.kAsscPasses")), {}, {}, {}); // buttons between associated passes and maps rowLayout -numberOfColumns 2 -columnWidth2 $halfListWidth $halfListWidth -columnAttach2 "right" "left" -columnOffset2 1 1 renderPassesButtonsLayout2; nodeIconButton -image "passesUIAssociate.png" -height 25 -annotation (uiRes("m_createMayaRenderPassTab.kAddPassesAnn2")) -command ("renderPassesAdjustMapConnection 1 \"associated\"") renderPassesButtonsAssociate2; nodeIconButton -image "passesUIDeAssociate.png" -height 25 -annotation (uiRes("m_createMayaRenderPassTab.kRemovePassesAnn2")) -command ("renderPassesAdjustMapConnection 0 \"contribution\"") renderPassesButtonsDeAssociate2; setParent ..; // contribution maps section columnLayout passContributionMapControlsLayout; columnLayout contMapControlContainer; text -label (uiRes("m_createMayaRenderPassTab.kAsscPassContMapLabel")); string $contMapOptionMenuName = passContOptionMenuName(); optionMenu $contMapOptionMenuName; menuItem -label (uiRes("m_createMayaRenderPassTab.kSelectPCM")); setParent ..; separator -style "none" -height 5 -width 190 passContMapSpacer; string $passContMapLayout = passesTabCreateListAndButtons( "contribution", $listWidth, $listHeight, "passesTabUpdatePassAssociationButtonState", (uiRes("m_createMayaRenderPassTab.kAsscMapPasses")), { "newPCM.png", "editPCM.png", "deletePCM.png" }, { (uiRes("m_createMayaRenderPassTab.kNewMapLabelAnn")), (uiRes("m_createMayaRenderPassTab.kEditMapLabelAnn")), (uiRes("m_createMayaRenderPassTab.kDeleteMapLabelAnn")) }, { "createNewPassContMap", "selectAndDisplayPassContMap", "deleteCurrentPassContMap" }); setParent ..; setParent ..; setUITemplate -popTemplate; setParent $parent; } global proc passesTabOptionsDefaultLayerTemplateCheckBoxCallBack(int $default) { passesTabUpdateDefaultPrecompControls(); passesTabOptionsDefaultLayerTemplate(); } global proc passesTabUpdateDefaultPrecompControls() { string $currentLayer = `editRenderLayerGlobals -q -currentRenderLayer`; int $override = `getAttr ($currentLayer + ".isDefaultPrecompTemplateOverride")`; if($override == 1 && "defaultRenderLayer" != $currentLayer){ textField -edit -enable 0 precompTemplateField; } else{ textField -edit -enable 1 precompTemplateField; } if("defaultRenderLayer" == $currentLayer){ checkBoxGrp -edit -vis 0 precompTemplateCheckBox; } else{ checkBoxGrp -edit -vis 1 precompTemplateCheckBox; } } global proc passesTabOptionsDefaultLayerTemplate() { string $currentLayer = `editRenderLayerGlobals -q -currentRenderLayer`; if("defaultRenderLayer" == $currentLayer){ passesTabSetDefaultPrecomp(); } else{ int $override = `getAttr ($currentLayer + ".isDefaultPrecompTemplateOverride")`; if(1 == $override){ string $defaultTemplate = `getAttr defaultRenderLayer.precompTemplate`; string $cmd = "setAttr " + $currentLayer + ".precompTemplate -type \"string\" \"" + $defaultTemplate + "\""; evalEcho($cmd); } } } global proc passesTabSetDefaultPrecomp() // // Description: // Set attribute precompTemplate of all layers whose isDefaultPrecompTemplateOverride is true as masterLayer's // { // Maya render setup system is incompatible with legacy render layer // pre-compositing template functionality. if (mayaHasRenderSetup()) { return; } if (!`objExists defaultRenderLayer`) { return; } string $defaultTemplate = `getAttr defaultRenderLayer.precompTemplate`; string $allLayers[] = `listConnections renderLayerManager.renderLayerId`; string $removeItems[] = {"defaultRenderLayer"}; $allLayers = stringArrayRemove($removeItems, $allLayers); for($layer in $allLayers){ if(`getAttr ($layer + ".isDefaultPrecompTemplateOverride")`){ string $cmd = "setAttr " + $layer + ".precompTemplate -type \"string\" \"" + $defaultTemplate + "\""; evalEcho($cmd); } } } global proc passesTabCreatePrecompControls() // // Description: // Create the controls for the "Precomp" frame of the tab // { string $parent = `setParent -query`; // frame for the margins frameLayout -collapsable false -collapse false -borderVisible false -marginHeight 5 -marginWidth 5 -labelVisible false; columnLayout -annotation (uiRes("m_createMayaRenderPassTab.kPrecompAnnot")) precompControlsLayout; text -label (uiRes("m_createMayaRenderPassTab.kPrecomp")) precompTemplateLabel; checkBoxGrp -numberOfCheckBoxes 1 -label1 (uiRes("m_createMayaRenderPassTab.kUseDefaultLayerTemplate")) -cc "passesTabOptionsDefaultLayerTemplateCheckBoxCallBack #1" precompTemplateCheckBox; rowLayout -numberOfColumns 3 -annotation (uiRes("m_createMayaRenderPassTab.kPrecompAnnot")); text -label ""; textField -annotation (uiRes("m_createMayaRenderPassTab.kPrecompAnnot")) -cc passesTabOptionsDefaultLayerTemplate precompTemplateField; symbolButton -annotation (uiRes("m_createMayaRenderPassTab.kPrecompAnnot")) -image "navButtonBrowse.png" precompTemplateButton; setParent ..; setParent ..; setParent ..; setParent $parent; } global proc createMayaRenderPassTab() // // Description: // Create the passes tab // { string $parentForm = `setParent -query`; setParent $parentForm; setUITemplate -pushTemplate attributeEditorTemplate; scrollLayout -horizontalScrollBarThickness 0 passesScrollLayout; columnLayout -adjustableColumn true passesTabColumn; // create controls frameLayout -label (uiRes("m_createMayaRenderPassTab.kFullRenderPasses")) -collapsable true -collapse false -annotation (uiRes("m_createMayaRenderPassTab.kFullRenderPassesAnnot")) miRenderPassesFrame; passesTabCreateFullRenderPassesControls(); setParent ..; frameLayout -label (uiRes("m_createMayaRenderPassTab.kPrecompositing")) -collapsable true -collapse false -annotation (uiRes("m_createMayaRenderPassTab.kPrecompAnnot")) miRenderPassesOverrideFrame; passesTabCreatePrecompControls(); setParent ..; // populate controls updateMayaRenderPassTab(); // set event script jobs scriptJob -parent passesScrollLayout -event renderPassChange "updateMayaRenderPassTab"; scriptJob -parent passesScrollLayout -event renderPassSetChange "updateMayaRenderPassTab"; scriptJob -parent passesScrollLayout -event renderPassSetMembershipChange "updateMayaRenderPassTab"; scriptJob -parent passesScrollLayout -event passContributionMapChange "onPassContributionMapChange"; setUITemplate -popTemplate; setParent $parentForm; formLayout -edit -af passesScrollLayout "top" 0 -af passesScrollLayout "bottom" 0 -af passesScrollLayout "left" 0 -af passesScrollLayout "right" 0 $parentForm; }