// =========================================================================== // 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. // =========================================================================== // // Description: // This procedure will recursively traverse the child // render pass nodes of $nodeName and triger swatch // refreshes for all of them. // proc renderPassSwatchRefresh( string $nodeName ) { string $type = `nodeType $nodeName`; if ($type == "renderLayer" || $type == "renderPassSet") { // recurse string $childList[] = `listConnections ($nodeName + ".renderPass")`; string $child; for ($child in $childList) { renderPassSwatchRefresh($child); } } else { if ($type == "renderPass") { swatchRefresh $nodeName; } } } // // Description: // This procedure is called when an image is to be rendered using // the Uber renderer. // It is assumed that defaultRenderGlobals.renderLayerPreview is set. // Returns: render result // global proc string mayaPreviewRender(int $renderAllLayers, string $editor, string $camera, int $resolution[], int $doShadows, int $doGlowPass, string $global ) { string $result = ""; // Setup render preparation (including saving the assembly // configuration, if required by default render traversal set). prepareRender -setup; // Run preRender traversal of default render traversal set. prepareRender -invokePreRender; //====================================================================== // STEP 1 // execute pre mel script //====================================================================== string $melScript = `getAttr defaultRenderGlobals.preMel`; if( $melScript != "" ) eval $melScript; //====================================================================== // STEP 2 // prep // store current render layer, set comp and blend mode // get list of rendedr layers to render //====================================================================== // store current render layer string $currentLayer = `editRenderLayerGlobals -q -currentRenderLayer`; // get list of render layers string $renderLayers[]; clear($renderLayers); // find render layers to render if( $renderAllLayers == 0 ) { // render current layer only $renderLayers[0] = $currentLayer; } else { // get list of render layers $renderLayers = `listConnections renderLayerManager.renderLayerId`; } int $numLayers = size($renderLayers); // sort by display order $renderLayers = sortLayers($renderLayers); // get comp mode // 0 is comp only, 1 is comp + keep. 2 is keep layers int $compMode = 0; if ( !mayaHasRenderSetup() && `optionVar -exists renderViewRenderLayersMode`) $compMode = `optionVar -q renderViewRenderLayersMode`; // set the comp display mode on render view window if( $compMode == 0 ) // composite renderWindowEditor -e -compDisplay 1 $editor; else if( $compMode == 1 ) // composite and keep renderWindowEditor -e -compDisplay 2 $editor; else // no blending renderWindowEditor -e -compDisplay 0 $editor; // set the blend mode to -1 for the first layer. // so that the first render layer is overwritten renderWindowEditor -e -blendMode -1 $editor; // boolean to check whether anything has bee rendered int $rendered = 0; //============================================================================================= // STEP 3 // iterate through render layers //============================================================================================= for($i=0; $i<$numLayers; $i++) { if( // If "Render All Layers" is off, render the current render layer // regardless of the renderable flag. !$renderAllLayers || // otherwise, render this layer if it is renderable. // do not switch render layer unless it is renderable `getAttr ($renderLayers[$i] + ".renderable")` ) { int $recycled = 0; //===================================================================================== // STEP 4 // recycle the image if applicable //===================================================================================== // We can render the layer or reuse existing image // do not recycle masterLayer. masterLayer will be always rerendered. if( $renderAllLayers && (`getAttr ($renderLayers[$i] + ".identification")` != 0) ) { // has this layer been rendered? int $isRendered = `getAttr ($renderLayers[$i] + ".imageRendered")`; int $toRecycle = `getAttr ($renderLayers[$i] + ".recycleImage")`; string $image = `getAttr ($renderLayers[$i] + ".imageName")`; // ok. we want to recycle this render layer if( $isRendered && $toRecycle && ($image!="") ) { // finally, recycle // First, set the blend mode // if this is the first layer being rendered - ignore the // blend mode, and overwrite.. Ignore also for mode == 2, // where we do NOT want to comp if (( $compMode != 2) && ( $rendered )) { // set the blend mode of the render view renderWindowEditor -e -blendMode `getAttr ($renderLayers[$i] + ".psdBlendMode")` $editor; } else { renderWindowEditor -e -blendMode -1 $editor; } // blend with existing image if( `renderWindowEditor -e -compImageFile $image $editor` ) $recycled = 1; } } //===================================================================================== // STEP 5 // render this render layer //===================================================================================== if( !$recycled ) { // switch render layer if(catch(`editRenderLayerGlobals -currentRenderLayer $renderLayers[$i]`)) { string $msg = (uiRes("m_mayaPreviewRender.kCannotRenderLayer")); string $msgDisp = `format -s $renderLayers[$i] $msg`; warning($msgDisp); continue; } // Run preRenderLayer traversal of default render traversal set. prepareRender -invokePreRenderLayer; // execute pre render layer mel script $melScript = `getAttr defaultRenderGlobals.preRenderLayerMel`; if( $melScript != "" ) eval $melScript; // if this is the first layer being rendered - ignore the // blend mode, and overwrite. // Ignore also for mode == 2, // where we do NOT want the comp'ed image if (( $compMode != 2) && ( $rendered )) { renderWindowEditor -e -blendMode `getAttr ($renderLayers[$i] + ".psdBlendMode")` $editor; } else { renderWindowEditor -e -blendMode -1 $editor; } // request the current renderer to render this layer\ // $result contains the image name in the disk string $option = "\" -layer " + $renderLayers[$i] + "\""; $result = renderWithCurrentRenderer($editor, $camera, $resolution, $doShadows, $doGlowPass, $option); // save the image file name for recycling setAttr ($renderLayers[$i] + ".imageName") -type "string" $result; // execute post render layer mel script $melScript = `getAttr defaultRenderGlobals.postRenderLayerMel`; if( $melScript != "" ) eval $melScript; // Run postRenderLayer traversal of default render traversal // set. prepareRender -invokePostRenderLayer; // If we just want to save the layers, push the image if ( $renderAllLayers && ($compMode == 2 || $compMode == 1) ) { renderWindowMenuCommand "keepImageInRenderView" $editor; } // mark this render layer as rendered setAttr ($renderLayers[$i] + ".imageRendered") 1; // Force refresh of updated swatch images string $rendererName = `currentRenderer`; global string $gRenderViewRenderTarget; if (rendererRenderTargetSupport($rendererName) && $gRenderViewRenderTarget != "" ) { // this was a render target render swatchRefresh $gRenderViewRenderTarget; } else { // this was a regular 3D render swatchRefresh $renderLayers[$i]; renderPassSwatchRefresh($renderLayers[$i]); } } $rendered = 1; } } //============================================================================================= // STEP 6 // Render Layer post processing //============================================================================================= // PSD Layered post processing // int $format = `getAttr defaultRenderGlobals.imageFormat`; if ($rendered && $format == 36) // Layered PSD { string $cmd = "renderLayerPostProcess "; string $sceneName = `file -q -ns`; if ( $sceneName != "" ) { $cmd = $cmd + "-sceneName " + $sceneName; } eval( $cmd ); } //============================================================================================= // STEP 7 // update the renderview for comp mode //============================================================================================= // update the renderWindow caption for the comp mode // replace layer name with "Composite" if( $renderAllLayers && $compMode !=2 && $rendered ) { renderWindowCaption("", 0); string $caption = `renderWindowEditor -q -pca $editor`; string $captionLayer = `editRenderLayerGlobals -q -currentRenderLayer`; $caption = `substitute $captionLayer $caption "Composite"`; renderWindowEditor -e -pca $caption $editor; // delayed comp mode // bring up the comp image in the back buffer if( $compMode == 1 ) { renderWindowEditor -edit -compDisplay 3 $editor; renderWindowRefreshMenu("file", $editor); renderWindowRefreshLayout($editor); } } //============================================================================================= // STEP 8 // clean up //============================================================================================= // disable compositing renderWindowEditor -e -blendMode -1 $editor; renderWindowEditor -e -compDisplay 0 $editor; // recover the currentLayer if( $rendered ) editRenderLayerGlobals -currentRenderLayer $currentLayer; else // there is no renderable layer warning (uiRes("m_mayaPreviewRender.kNoRenderableLayer")); // execute post mel script $melScript = `getAttr defaultRenderGlobals.postMel`; if( $melScript != "" ) eval $melScript; // Run postRender traversal of default render traversal set. prepareRender -invokePostRender; // Clean up after rendering, including restoring the assembly // configuration, if required by default render traversal set. prepareRender -restore; return $result; }