/************************************************ Written By Collin Tullius; www.collin-tullius.com; Collin@Collin-Tullius.com Based on Brian Smith's "Automatic Multi-plane Projection In Maya" Technique: http://crunchfx.com/2010/01/17/automatic-multi-plane-projection-in-maya/ Based on Neil Blevins' Blended Box Map Technique and MAXScript http://www.neilblevins.com/cg_education/blended_box_mapping/blended_box_mapping.htm Derivitive works or modifications acceptable as long as you provide appropriate credit to myself, Brian Smith, and Neil Blevins If you use this in any way, I would love to see what you make with it. Feel Free to contact me at the above email address. **************************************************/ //Additional Variables string $dir2d = ""; string $projName = ""; string $fileName = ""; string $placeName = ""; string $productName = ""; string $camProductName = ""; string $remapName = ""; string $multDivName = ""; string $Dir = ""; int $camSetExists = 0; global proc rotateProjection( string $placementNode, string $direction ) { if($direction == "PosX") //Left { xform -ro 0 -90 0 $placementNode; } if($direction == "NegX") //Right { xform -ro 0 90 0 $placementNode; } if($direction == "PosY") //Bottom { xform -ro 90 0 0 $placementNode; } if($direction == "NegY") //Top { xform -ro -90 0 0 $placementNode; } //if($direction == "PosZ") No Case: Default Position //Front if($direction == "NegZ") //Back { xform -ro 0 180 0 $placementNode; } } //Makes and Sets up Camera Node Network global proc setupCameraNodes() { if(`objExists "RenBakeCam1"`) { //Makes sure only 1 camera bake network exists to keep everything as clean as it can be. $camSetExists=1; print "Camera Nodes Already Exist \n"; } else{ camera -name "RenBakeCam1" -centerOfInterest 5 -focalLength 35 -lensSqueezeRatio 1 -cameraScale 1 -horizontalFilmAperture 1.41732 -horizontalFilmOffset 0 -verticalFilmAperture 0.94488 -verticalFilmOffset 0 -filmFit Fill -overscan 1 -motionBlur 0 -shutterAngle 144 -nearClipPlane 0.01 -farClipPlane 1000 -orthographic 0 -orthographicWidth 30; objectMoveCommand; cameraMakeNode 1 ""; shadingNode -asUtility "samplerInfo" -name "sampInfo1"; shadingNode -asUtility "vectorProduct" -name "CamVec1"; setAttr CamVec1.operation 3; //sets op type to Vector Matrix Product setAttr CamVec1.normalizeOutput true; //sets normalizeOutput to ON //Connects to Vector Product for Object Normal in World Space connectAttr -f sampInfo1.normalCamera CamVec1.input1; connectAttr -f RenBakeCam1.matrix CamVec1.matrix; print "Camera Node Setup Complete \n"; } } //Generates all nodes needed for the selected number of textures, then links them to the camera and output chains global proc setupTextureNodes(int $numProjections) { //Sets name and number of directions string $DirList[]; global string $PosZ_ProductNode; global string $PosZ_RemapNode; //variables for file attachment global string $TopNode; global string $BottomNode; global string $LeftNode; global string $RightNode; global string $FrontNode; global string $BackNode; //variables for shader output network string $colorSum = `shadingNode -asUtility "plusMinusAverage" -name "ColorSum1"`; string $valueSum = `shadingNode -asUtility "plusMinusAverage" -name "ValueSum1"`; string $remapSum = `shadingNode -asUtility "remapValue" -name "RemapSum1"`; string $finalColor = `shadingNode -asUtility "multiplyDivide" -name "FinalColor1"`; string $shaderName = `shadingNode -asShader "blinn" -name "BlinnName"`; sets -renderable true -noSurfaceShader true -empty -name ($shaderName + "SG"); print $numProjections; if($numProjections == 3) { //$DirList[] = {"PosZ","PosY","PosX"}; $DirList[0] = "PosZ"; $DirList[1] = "PosY"; $DirList[2] = "PosX"; print "Making 3 projections... \n"; } if($numProjections == 6) { //$DirList[] = {"PosZ","NegY","NegZ","PosY","PosX","NegX"}; $DirList[0] = "PosZ"; $DirList[1] = "NegY"; $DirList[2] = "NegZ"; $DirList[3] = "PosY"; $DirList[4] = "PosX"; $DirList[5] = "NegX"; print "Making 6 projections.... \n"; } print $DirList; int $plusMinusInputCounter = 1; //Generates Shader Output chain, and calls Camera creation chain, which may not output if a camera chain already exists. setupCameraNodes(); //Generates nodes for Output Chain //variables named as a result of the operation as more than one output network/shader can exist in a given scene setAttr ($finalColor + ".operation") 2; //sets node to divide connectAttr -f ($colorSum + ".output3D") ($finalColor + ".input1"); connectAttr -f ($valueSum + ".output1D") ($remapSum + ".inputValue"); connectAttr -f ($remapSum + ".outValue") ($finalColor + ".input2X"); connectAttr -f ($remapSum + ".outValue") ($finalColor + ".input2Y"); connectAttr -f ($remapSum + ".outValue") ($finalColor + ".input2Z"); //final color to shader node occurs at end of script print "Output Node Setup Complete \n"; for($Dir in $DirList){ //Sets up name variables for each direction, $Dir taken from For Loop $dir2d = $Dir + "_2d1"; $projName = $Dir + "_Projection1"; $fileName = $Dir + "_File1"; $placeName = $Dir + "_Placement1"; $productName = $Dir + "_Product1"; $camProductName = $Dir + "_CamProduct1"; $remapName = $Dir + "_Remap1"; $multDivName = $Dir + "_colorXRemap1"; //Creates File Projection Network $projName = `shadingNode -asUtility "projection" -name $projName`; $fileName = `shadingNode -asTexture "file" -name $fileName`; //Notes name of file nodes for file assignment switch($Dir) { case "PosZ": //front $FrontNode = $fileName; break; case "PosY": //bottom $BottomNode = $fileName; break; case "PosX": //left $LeftNode = $fileName; break; case "NegZ": //back $BackNode = $fileName; break; case "NegY": //top $TopNode = $fileName; break; case "NegX": //right $RightNode = $fileName; break; default: print ("UNKNOWN DIRECTION, VALUE FOR CAMERA NOT SET, FILE ASSIGNMENT WILL FAIL \n"); break; } $placeName = `shadingNode -asUtility "place3dTexture" -name $placeName`; $dir2d = `shadingNode -asUtility "place2dTexture" -name $dir2d`; //Links nodes together as default projection normally does connectAttr -f ($placeName + ".worldInverseMatrix[0]") ($projName + ".placementMatrix"); connectAttr -f ($fileName + ".outColor") ($projName + ".image"); connectAttr -f ($dir2d + ".coverage") ($fileName + ".coverage"); connectAttr -f ($dir2d + ".translateFrame") ($fileName + ".translateFrame"); connectAttr -f ($dir2d + ".rotateFrame") ($fileName + ".rotateFrame"); connectAttr -f ($dir2d + ".mirrorU") ($fileName + ".mirrorU"); connectAttr -f ($dir2d + ".mirrorV") ($fileName + ".mirrorV"); connectAttr -f ($dir2d + ".stagger") ($fileName + ".stagger"); connectAttr -f ($dir2d + ".wrapU") ($fileName + ".wrapU"); connectAttr -f ($dir2d + ".wrapV") ($fileName + ".wrapV"); connectAttr -f ($dir2d + ".repeatUV") ($fileName + ".repeatUV"); connectAttr -f ($dir2d + ".offset") ($fileName + ".offset"); connectAttr -f ($dir2d + ".rotateUV") ($fileName + ".rotateUV"); connectAttr -f ($dir2d + ".noiseUV") ($fileName + ".noiseUV"); connectAttr -f ($dir2d + ".vertexUvOne") ($fileName + ".vertexUvOne"); connectAttr -f ($dir2d + ".vertexUvTwo") ($fileName + ".vertexUvTwo"); connectAttr -f ($dir2d + ".vertexUvThree") ($fileName + ".vertexUvThree"); connectAttr -f ($dir2d + ".vertexCameraOne") ($fileName + ".vertexCameraOne"); connectAttr -f ($dir2d + ".outUV") ($fileName + ".uv"); connectAttr -f ($dir2d + ".outUvFilterSize") ($fileName + ".uvFilterSize"); /////////////// print ("Projection Node Output Complete for " + $Dir + " \n"); //Function Call to rotate Place3d Node to correct location rotateProjection($placeName , $Dir); //creates and sets nodes for vector functions $productName = `shadingNode -asUtility "vectorProduct" -name $productName`; $camProductName = `shadingNode -asUtility "vectorProduct" -name $camProductName`; $remapName = `shadingNode -asUtility "remapValue" -name $remapName`; $multDivName = `shadingNode -asUtility "multiplyDivide" -name $multDivName`; setAttr ($productName + ".operation") 3; //sets to Vector Matrix Product setAttr ($productName + ".input2Z") -1; setAttr ($camProductName + ".operation") 1; //sets to Dot Product setAttr ($camProductName + ".normalizeOutput") true; //normalizes output setAttr ($remapName + ".value[0].value_Position") 0.244; setAttr ($remapName + ".value[0].value_FloatValue") 0; setAttr ($remapName + ".value[0].value_Interp") 2; //sets to smooth interpolation //connects camera, output, projection and vector chains if( $Dir == "PosZ" ) { //Sets up primary node chain, all other chains have a dependency on the Dir_Product vectorProduct node of this chain connectAttr -f ($projName + ".outColor") ($multDivName + ".input1"); connectAttr -f ($placeName + ".worldMatrix") ($productName + ".matrix"); connectAttr -f ($productName + ".output") ($camProductName + ".input1"); connectAttr -f CamVec1.output ($camProductName + ".input2"); connectAttr -f ($camProductName + ".outputX") ($remapName + ".inputValue"); connectAttr -f ($remapName + ".outValue") ($multDivName + ".input2X"); connectAttr -f ($remapName + ".outValue") ($multDivName + ".input2Y"); connectAttr -f ($remapName + ".outValue") ($multDivName + ".input2Z"); connectAttr -f ($multDivName + ".output") ($colorSum + ".input3D[0]"); connectAttr -f ($remapName + ".outValue") ($valueSum + ".input1D[0]"); $PosZ_ProductNode = $productName; $PosZ_RemapNode = $remapName; setAttr ($productName + ".input1Z") 1; //////// print "Node Chain Complete \n"; } else { //Sets up node chain for all but the first connectAttr -f ($projName + ".outColor") ($multDivName + ".input1"); connectAttr -f ($placeName + ".worldMatrix") ($productName + ".matrix"); //ONLY TRIGGERS ON NON-FIRST RUN connectAttr -f ($PosZ_ProductNode + ".input1") ($productName + ".input1"); connectAttr -f ($PosZ_RemapNode + ".value[0]") ($remapName + ".value[0]"); // connectAttr -f ($productName + ".output") ($camProductName + ".input1"); connectAttr -f CamVec1.output ($camProductName + ".input2"); connectAttr -f ($camProductName + ".outputX") ($remapName + ".inputValue"); connectAttr -f ($remapName + ".outValue") ($multDivName + ".input2X"); connectAttr -f ($remapName + ".outValue") ($multDivName + ".input2Y"); connectAttr -f ($remapName + ".outValue") ($multDivName + ".input2Z"); connectAttr -f ($multDivName + ".output") ($colorSum + ".input3D[" + $plusMinusInputCounter + "]"); connectAttr -f ($remapName + ".outValue") ($valueSum + ".input1D[" + $plusMinusInputCounter + "]"); $plusMinusInputCounter = $plusMinusInputCounter + 1; //////// print "Node Chain Complete \n"; } //end else } //end for //connects into shader node connectAttr -f ($finalColor + ".output") ($shaderName + ".color"); $file1 = `textField -query -text file1Text`; //front $file2 = `textField -query -text file2Text`; //bottom $file3 = `textField -query -text file3Text`; //left $file4 = `textField -query -text file4Text`; //back $file5 = `textField -query -text file5Text`; //top $file6 = `textField -query -text file6Text`; //right //HardLink the texture links from the GUI into the File nodes if($numProjections == 3) { //$DirList[] = {"PosZ","PosY","PosX"}; Front Bottom Left setAttr ($FrontNode + ".fileTextureName") -type "string" $file1; setAttr ($BottomNode + ".fileTextureName") -type "string" $file2; setAttr ($LeftNode + ".fileTextureName") -type "string" $file3; ///////// print "file nodes set \n"; } if($numProjections == 6) { //$DirList[] = {"PosZ","NegY","NegZ","PosY","PosX","NegX"}; Front Top Back Bottom Left Right setAttr ($FrontNode + ".fileTextureName") -type "string" $file1; setAttr ($BottomNode + ".fileTextureName") -type "string" $file2; setAttr ($LeftNode + ".fileTextureName") -type "string" $file3; setAttr ($BackNode + ".fileTextureName") -type "string" $file4; setAttr ($RightNode + ".fileTextureName") -type "string" $file6; setAttr ($TopNode + ".fileTextureName") -type "string" $file5; print "file nodes set \n"; } } //end proc //GUI int $numProjections; //initializes $numProjections if (`window -exists BlendedBoxMapGui`) deleteUI BlendedBoxMapGui; window -widthHeight 370 450 -title "Maya Blended Box Map Maker" BlendedBoxMapGui; frameLayout -width 100 -height 100 -label "Num Projections" RadioFrame; setParent RadioFrame; columnLayout RadioColumn; setParent RadioColumn; radioCollection AllRadioButtons; // radioButton -label "3" -changeCommand "$numProjections = 3" -select RadioButton1; radioButton -label "6" -changeCommand "$numProjections = 6" -select RadioButton2; text -label "Texture Links:"; rowColumnLayout -numberOfColumns 3 -columnAttach 1 "right" 0 -columnWidth 1 150 -columnWidth 2 250 -columnWidth 3 100; text -label "Front"; string $file1 = `textField file1Text`; button -label "Browse" -command "$file1 = `fileDialog`; textField -edit -text $file1 file1Text" BrowseFile1; text -label "Bottom"; string $file2 = `textField file2Text`; button -label "Browse" -command "$file2 = `fileDialog`; textField -edit -text $file2 file2Text" BrowseFile2; text -label "Left"; string $file3 = `textField file3Text`; button -label "Browse" -command "$file3 = `fileDialog`; textField -edit -text $file3 file3Text" BrowseFile3; text -label "Back"; string $file4 = `textField file4Text`; button -label "Browse" -command "$file4 = `fileDialog`; textField -edit -text $file4 file4Text" BrowseFile4; text -label "Top"; string $file5 = `textField file5Text`; button -label "Browse" -command "$file5 = `fileDialog`; textField -edit -text $file5 file5Text" BrowseFile5; text -label "Right"; string $file6 = `textField file6Text`; button -label "Browse" -command "$file6 = `fileDialog`; textField -edit -text $file6 file6Text" BrowseFile6; button -label "Generate Shader Network" -command "setupTextureNodes($numProjections)" goButton; $numProjections = 6; showWindow BlendedBoxMapGui;