//////////////////////////////////////////////////////////////////////////////////// // Script: mmInstanceArray 1.0 // // Description: creates an array of instances of a certain // // object. Instance attributes visibility, translateY // // and scaleY can be texture mapped and animated. // // Author: Manuel Macha | www.manuelmacha.de | manuel@manuelmacha.de // //////////////////////////////////////////////////////////////////////////////////// //********************************************************************************** /////////////////////////////////////////////////////////////////////// // create the expression // ////////////////////////////////////////////////////////////////////// global proc mmCreateInstanceArrayExpression() { if (!`objExists "mmInstanceArrayExpression"`) { expression -s "if (`objExists \"mmInstanceArraySettings\"`)\r\n\t{\r\n\r\n\tfloat \t$cubeNoX \t\t= `getAttr mmInstanceArraySettings.noInX`;\r\n\tfloat \t$cubeNoZ\t\t= `getAttr mmInstanceArraySettings.noInZ`;\r\n\r\n\tint \t$cubeX \t\t= `getAttr mmInstanceArraySettings.noInX`;\r\n\tint \t$cubeZ\t\t\t= `getAttr mmInstanceArraySettings.noInZ`;\r\n\r\n\tstring\t$objToInstance\t= `getAttr mmInstanceArraySettings.objToInstance`;\r\n\r\n\tfloat\t$objDimensions[] \t= `getAttr ($objToInstance + \".boundingBoxSize\")`;\r\n\tfloat\t$objTransX\t\t= `getAttr ($objToInstance + \".translateX\")`;\r\n\tfloat\t$objTransY\t\t= `getAttr ($objToInstance + \".translateY\")`;\r\n\tfloat\t$objTransZ\t\t= `getAttr ($objToInstance + \".translateZ\")`;\r\n\r\n\tint\t$noOfObjects\t= $cubeX * $cubeZ;\r\n\r\n\t//*** check if visibility map exists, apply visibility ***//\r\n\r\n\tstring $instVisMap[]\t\t= `listConnections mmInstanceArraySettings.instanceVisibility`;\r\n\tfloat\t$instanceVisibility[];\r\n\tfloat\t$visibilityTreshold\t= `getAttr mmInstanceArraySettings.visibilityTreshold`;\r\n\r\n\tif ($instVisMap[0] == \"\")\r\n\t\t{\r\n\t//\tprint \"Instance Visibility: No map connected.\\n\";\r\n\t\t} else {\r\n\r\n\t\tfor ($i = 1; $i <= $cubeX; $i++)\r\n\t\t\t{\r\n\t\t\tfor ($k = 1; $k <= $cubeZ; $k++)\r\n\t\t\t\t{\r\n\r\n\t\t\t\t$instanceVisibility \t= `colorAtPoint -output \"A\" -coordU ((1 / $cubeNoX) * $i) -coordV ((1 / $cubeNoZ) * $k) $instVisMap[0]`;\r\n\r\n\t\t\t\tif ($instanceVisibility[0] < $visibilityTreshold)\r\n\t\t\t\t\t{\r\n\t\t\t\t\tsetAttr\t($objToInstance + \"InstanceX\" + $i + \"Y\" + $k + \".visibility\") 0;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\tsetAttr\t($objToInstance + \"InstanceX\" + $i + \"Y\" + $k + \".visibility\") 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t//*** if translateY map exists, apply translateY ***//\r\n\r\n\tstring $instTransYMap[]\t\t= `listConnections mmInstanceArraySettings.instanceTranslateY`;\r\n\tfloat\t$instanceTransY[];\r\n\r\n\tif ($instTransYMap[0] == \"\")\r\n\t\t{\r\n\t//\tprint \"Instance TranslateY: No map connected.\\n\";\r\n\t\t} else {\r\n\r\n\t\tfor ($i = 1; $i <= $cubeX; $i++)\r\n\t\t\t{\r\n\t\t\tfor ($k = 1; $k <= $cubeZ; $k++)\r\n\t\t\t\t{\r\n\r\n\t\t\t\t$instanceTransY \t= `colorAtPoint -output \"A\" -coordU ((1 / $cubeNoX) * $i)-coordV ((1 / $cubeNoZ) * $k) $instTransYMap[0]`;\r\n\r\n\t\t\t\tsetAttr\t($objToInstance + \"InstanceX\" + $i + \"Y\" + $k + \".translateY\") $instanceTransY[0];\r\n\t\t\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t//*** if scaleY map exists, apply scaleY ***//\r\n\r\n\tstring $instScaleYMap[]\t\t= `listConnections mmInstanceArraySettings.instanceScaleY`;\r\n\tfloat\t$instanceScaleY[];\r\n\r\n\tif ($instScaleYMap[0] == \"\")\r\n\t\t{\r\n\t//\tprint \"Instance ScaleY: No map connected.\\n\";\r\n\t\t} else {\r\n\r\n\t\tfor ($i = 1; $i <= $cubeX; $i++)\r\n\t\t\t{\r\n\t\t\tfor ($k = 1; $k <= $cubeZ; $k++)\r\n\t\t\t\t{\r\n\r\n\t\t\t\t$instanceScaleY \t= `colorAtPoint -output \"A\" -coordU ((1 / $cubeNoX) * $i)-coordV ((1 / $cubeNoZ) * $k) $instScaleYMap[0]`;\r\n\r\n\t\t\t\tsetAttr\t($objToInstance + \"InstanceX\" + $i + \"Y\" + $k + \".scaleY\") $instanceScaleY[0];\r\n\t\t\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}" -o "" -n "mmInstanceArrayExpression" -ae 1 -uc all ; } } /////////////////////////////////////////////////////////////////////// // create the instances // ////////////////////////////////////////////////////////////////////// global proc mmCreateCubes() { float $cubeNoX = `getAttr mmInstanceArraySettings.noInX`; float $cubeNoZ = `getAttr mmInstanceArraySettings.noInZ`; int $cubeX = `getAttr mmInstanceArraySettings.noInX`; int $cubeZ = `getAttr mmInstanceArraySettings.noInZ`; string $objToInstance = `getAttr mmInstanceArraySettings.objToInstance`; float $objDimensions[] = `getAttr ($objToInstance + ".boundingBoxSize")`; float $objTransX = `getAttr ($objToInstance + ".translateX")`; float $objTransY = `getAttr ($objToInstance + ".translateY")`; float $objTransZ = `getAttr ($objToInstance + ".translateZ")`; string $instanceGroup = `group -empty -name "instanceGroup"`; string $instanceName[]; int $amount = 0; progressWindow -title "Instancing in Progress" -progress $amount -status "Percentage Complete: 0%" -isInterruptable true; //*** create the instances ***// for ($i = 1; $i <= $cubeX; $i++) { for ($k = 1; $k <= $cubeZ; $k++) { //if (`progressWindow -query -isCancelled`) // { // break; // } $instanceName = `instance -name ($objToInstance + "InstanceX" + $i + "Y" + $k) $objToInstance`; setAttr ($instanceName[0] + ".translateX") ($i * abs($objDimensions[0])); setAttr ($instanceName[0] + ".translateZ") ($k * abs($objDimensions[2])); parent $instanceName[0] $instanceGroup; $amount++; int $percent = ceil(($amount / ($cubeNoX * $cubeNoZ))*100); progressWindow -edit -progress $percent -status ("Percentage: " + $percent + "% (" + $amount + " out of " + ($cubeX * $cubeZ) + ")"); } } progressWindow -endProgress; //*** if visibility map exists, apply visibility ***// string $instVisMap[] = `listConnections mmInstanceArraySettings.instanceVisibility`; float $instanceVisibility[]; float $visibilityTreshold = `getAttr mmInstanceArraySettings.visibilityTreshold`; if ($instVisMap[0] == "") { print "Instance Visibility: No map connected.\n"; } else { for ($i = 1; $i <= $cubeX; $i++) { for ($k = 1; $k <= $cubeZ; $k++) { $instanceVisibility = `colorAtPoint -output "A" -coordU ((1 / $cubeNoX) * $i) -coordV ((1 / $cubeNoZ) * $k) $instVisMap[0]`; if ($instanceVisibility[0] < $visibilityTreshold) { setAttr ($objToInstance + "InstanceX" + $i + "Y" + $k + ".visibility") 0; } } } } //*** if translateY map exists, apply translateY ***// string $instTransYMap[] = `listConnections mmInstanceArraySettings.instanceTranslateY`; float $instanceTransY[]; if ($instTransYMap[0] == "") { print "Instance TranslateY: No map connected.\n"; } else { for ($i = 1; $i <= $cubeX; $i++) { for ($k = 1; $k <= $cubeZ; $k++) { $instanceTransY = `colorAtPoint -output "A" -coordU ((1 / $cubeNoX) * $i)-coordV ((1 / $cubeNoZ) * $k) $instTransYMap[0]`; setAttr ($objToInstance + "InstanceX" + $i + "Y" + $k + ".translateY") $instanceTransY[0]; } } } //*** if scaleY map exists, apply scaleY ***// string $instScaleYMap[] = `listConnections mmInstanceArraySettings.instanceScaleY`; float $instanceScaleY[]; if ($instScaleYMap[0] == "") { print "Instance ScaleY: No map connected.\n"; } else { for ($i = 1; $i <= $cubeX; $i++) { for ($k = 1; $k <= $cubeZ; $k++) { $instanceScaleY = `colorAtPoint -output "A" -coordU ((1 / $cubeNoX) * $i)-coordV ((1 / $cubeNoZ) * $k) $instScaleYMap[0]`; setAttr ($objToInstance + "InstanceX" + $i + "Y" + $k + ".scaleY") $instanceScaleY[0]; } } } mmCreateInstanceArrayExpression; } /////////////////////////////////////////////////////////////////////// // select the obj to instance // ////////////////////////////////////////////////////////////////////// global proc mmSelectObjToInstance() { string $objInSelection[] = `ls -selection`; textField -edit -editable false -text $objInSelection[0] mmInstanceArrayObjToInstanceTextField; setAttr -type "string" mmInstanceArraySettings.objToInstance `textField -query -text mmInstanceArrayObjToInstanceTextField`; } /////////////////////////////////////////////////////////////////////// // create the cube settings node // ////////////////////////////////////////////////////////////////////// global proc mmCreateCubeSettingsNode() { if (!`objExists "mmInstanceArraySettings"`) { group -empty -name "mmInstanceArraySettings"; setAttr -lock true -keyable false "mmInstanceArraySettings.tx"; setAttr -lock true -keyable false "mmInstanceArraySettings.ty"; setAttr -lock true -keyable false "mmInstanceArraySettings.tz"; setAttr -lock true -keyable false "mmInstanceArraySettings.rx"; setAttr -lock true -keyable false "mmInstanceArraySettings.ry"; setAttr -lock true -keyable false "mmInstanceArraySettings.rz"; setAttr -lock true -keyable false "mmInstanceArraySettings.sx"; setAttr -lock true -keyable false "mmInstanceArraySettings.sy"; setAttr -lock true -keyable false "mmInstanceArraySettings.sz"; setAttr -lock true -keyable false "mmInstanceArraySettings.v"; addAttr -longName "noInX" -attributeType long -minValue 1 -defaultValue 10 mmInstanceArraySettings; addAttr -longName "noInZ" -attributeType long -minValue 1 -defaultValue 10 mmInstanceArraySettings; addAttr -longName "objToInstance" -dt "string" mmInstanceArraySettings; setAttr -e -lock false -keyable true mmInstanceArraySettings.noInX; setAttr -e -lock false -keyable true mmInstanceArraySettings.noInZ; setAttr -e -lock false -keyable true mmInstanceArraySettings.objToInstance; addAttr -ln instanceVisibility -at double3 mmInstanceArraySettings; addAttr -ln instanceVisibilityX -at double -p instanceVisibility mmInstanceArraySettings; addAttr -ln instanceVisibilityY -at double -p instanceVisibility mmInstanceArraySettings; addAttr -ln instanceVisibilityZ -at double -p instanceVisibility mmInstanceArraySettings; addAttr -ln visibilityTreshold -at double -min 0 -max 1 -dv 0.3 mmInstanceArraySettings; addAttr -ln instanceTranslateY -at double3 mmInstanceArraySettings; addAttr -ln instanceTranslateYX -at double -p instanceTranslateY mmInstanceArraySettings; addAttr -ln instanceTranslateYY -at double -p instanceTranslateY mmInstanceArraySettings; addAttr -ln instanceTranslateYZ -at double -p instanceTranslateY mmInstanceArraySettings; addAttr -ln instanceScaleY -at double3 mmInstanceArraySettings; addAttr -ln instanceScaleYX -at double -p instanceScaleY mmInstanceArraySettings; addAttr -ln instanceScaleYY -at double -p instanceScaleY mmInstanceArraySettings; addAttr -ln instanceScaleYZ -at double -p instanceScaleY mmInstanceArraySettings; setAttr -type double3 mmInstanceArraySettings.instanceVisibility 0 0 0; setAttr -e -keyable true mmInstanceArraySettings.instanceVisibility; setAttr -e -keyable true mmInstanceArraySettings.instanceVisibilityX; setAttr -e -keyable true mmInstanceArraySettings.instanceVisibilityY; setAttr -e -keyable true mmInstanceArraySettings.instanceVisibilityZ; setAttr -e -keyable true mmInstanceArraySettings.instanceTranslateY ; setAttr -e -keyable true mmInstanceArraySettings.instanceTranslateYX; setAttr -e -keyable true mmInstanceArraySettings.instanceTranslateYY; setAttr -e -keyable true mmInstanceArraySettings.instanceTranslateYZ; setAttr -e -keyable true mmInstanceArraySettings.instanceScaleY ; setAttr -e -keyable true mmInstanceArraySettings.instanceScaleYX; setAttr -e -keyable true mmInstanceArraySettings.instanceScaleYY; setAttr -e -keyable true mmInstanceArraySettings.instanceScaleYZ; setAttr -e -keyable true mmInstanceArraySettings.visibilityTreshold; } } /////////////////////////////////////////////////////////////////////// // create the UI // ////////////////////////////////////////////////////////////////////// global proc mmInstanceArray() { if (`window -exists "mmInstanceArrayUI"`) { deleteUI mmInstanceArrayUI; } else { int $width = 400; int $height = 270; window -width ($width + 10) -height $height -sizeable false -resizeToFitChildren true -title "mmInstanceArray" mmInstanceArrayUI; columnLayout -width ($width + 10) -columnAlign "center" mmInstanceArrayMainColumnLayout; frameLayout -width ($width + 10) -height 90 -collapsable true -collapse false -label "1.) Create Instances" mmInstanceArrayFrameLayout1; columnLayout -width $width -columnAlign "center" mmInstanceArrayMainColumnLayout1; rowLayout -numberOfColumns 2 -columnWidth2 ($width * 0.5) ($width * 0.5) -adjustableColumn 2 -columnAlign 1 "center" -columnAttach 1 "both" 0 -columnAttach 2 "both" 0 mmInstanceArrayMainRowLayout3; button -width ($width * 0.5) -label "Object to Instance" -command mmSelectObjToInstance; textField -width ($width * 0.5) -editable false mmInstanceArrayObjToInstanceTextField; setParent ..; rowLayout -numberOfColumns 6 -columnWidth6 ($width * 0.15) ($width * 0.2) ($width * 0.15) ($width * 0.2) ($width * 0.15) ($width * 0.15) -adjustableColumn 6 -columnAlign 1 "right" -columnAlign 3 "right" -columnAlign 5 "right" -columnAttach 1 "both" 0 -columnAttach 2 "both" 0 -columnAttach 3 "both" 0 -columnAttach 4 "both" 0 -columnAttach 5 "both" 0 -columnAttach 6 "both" 0 mmInstanceArrayMainRowLayout1; text -width ($width * 0.15) -label "No. in X " mmInstanceArrayText1; intField -width ($width * 0.2) -minValue 1 -maxValue 320 -value 10 -changeCommand "intField -edit -value ((`intField -query -value mmInstanceArrayIntField1`) * (`intField -query -value mmInstanceArrayIntField2`)) mmInstanceArrayNoOfObjectsIntField" mmInstanceArrayIntField1; text -width ($width * 0.15) -label "No. in Z " mmInstanceArrayText2; intField -width ($width * 0.2) -minValue 1 -maxValue 240 -value 10 -changeCommand "intField -edit -value ((`intField -query -value mmInstanceArrayIntField1`) * (`intField -query -value mmInstanceArrayIntField2`)) mmInstanceArrayNoOfObjectsIntField" mmInstanceArrayIntField2; text -width ($width * 0.15) -label "Total "; intField -width ($width * 0.15) -value ((`intField -query -value mmInstanceArrayIntField1`) * (`intField -query -value mmInstanceArrayIntField2`)) -editable false mmInstanceArrayNoOfObjectsIntField; setParent ..; button -width $width -label "Create" -command mmCreateCubes; setParent ..; setParent ..; mmCreateCubeSettingsNode; frameLayout -width ($width + 10) -height 130 -collapsable true -collapse false -label "2.) Map Attributes" mmInstanceArrayFrameLayout2; columnLayout -width $width -columnAlign "center" mmInstanceArrayMainColumnLayout2; attrNavigationControlGrp -width $width -columnAlign 1 "right" -columnWidth 1 ($width * 0.25) -columnWidth 2 ($width * 0.5) -columnWidth 3 ($width * 0.25) -label "Instance Visibility" -attribute mmInstanceArraySettings.instanceVisibility mmInstanceArrayInstanceVisibilityAttrNavigationControlGrp; floatSliderGrp -width $width -label "Visibility Treshold" -columnAlign 1 "right" -columnWidth 1 ($width * 0.25) -columnWidth 2 ($width * 0.25) -columnWidth 3 ($width * 0.5) -adjustableColumn 3 -field true -minValue 0 -maxValue 1 -fieldMinValue 0 -fieldMaxValue 1 -value .3 -step 0.01 mmInstanceArrayVisibilityTresholdFloatSliderGrp; separator -width $width; attrNavigationControlGrp -width $width -columnAlign 1 "right" -columnWidth 1 ($width * 0.25) -columnWidth 2 ($width * 0.5) -columnWidth 3 ($width * 0.25) -label "Translate Y" -attribute mmInstanceArraySettings.instanceTranslateY mmInstanceArrayInstanceTranslateYAttrNavigationControlGrp; attrNavigationControlGrp -width $width -columnAlign 1 "right" -columnWidth 1 ($width * 0.25) -columnWidth 2 ($width * 0.5) -columnWidth 3 ($width * 0.25) -label "Scale Y" -attribute mmInstanceArraySettings.instanceScaleY mmInstanceArrayInstanceScaleYAttrNavigationControlGrp; setParent ..; setParent ..; button -width $width -height 18 -align "left" -label "mmInstanceArray v1.0 - help and tutorial -> www.manuelmacha.de/scripts" -command "system(\"load http://www.manuelmacha.de/scripts.html\")"; window -edit -width ($width + 10) -height $height -resizeToFitChildren false mmInstanceArrayUI; showWindow mmInstanceArrayUI; } if (`objExists "mmInstanceArraySettings"` && `window -exists "mmInstanceArrayUI"`) { connectControl mmInstanceArrayIntField1 "mmInstanceArraySettings.noInX"; connectControl mmInstanceArrayIntField2 "mmInstanceArraySettings.noInZ"; connectControl mmInstanceArrayObjToInstanceTextField "mmInstanceArraySettings.objToInstance"; connectControl mmInstanceArrayVisibilityTresholdFloatSliderGrp "mmInstanceArraySettings.visibilityTreshold"; intField -edit -value ((`intField -query -value mmInstanceArrayIntField1`) * (`intField -query -value mmInstanceArrayIntField2`)) -editable false mmInstanceArrayNoOfObjectsIntField; textField -edit -text `getAttr mmInstanceArraySettings.objToInstance` -editable false mmInstanceArrayObjToInstanceTextField; } } mmInstanceArray;