/* Hosuk Chang hosok2@naver.com Dec 22, 2006 */ global proc ho_particleFur(){ if(`window -exists ho_particleFur`){ deleteUI -window ho_particleFur; } window -t "ho_particleFur" -rtf 1 ho_particleFur; columnLayout; int $windowWidth = 400; text -l "Fur Instances"; textScrollList -w $windowWidth -h 100 instanceNames; button -l "Submit Fur Objects" -w $windowWidth -c "submitInstances()"; intFieldGrp -l "Number of Fur" -v1 300 numOfFur; checkBox -l "If Nurbs, Make UV Range 1" -v 1 UVNormalize ; button -l "Make Fur" -w $windowWidth -c "makeFur()"; separator -h 20 -w $windowWidth; text -l "Select Fur Particle"; floatSliderGrp -label "Dynamic Force" -field true -v 0.8 -min 0 -max 1 dynamicForce; button -l "Add Fur Dynamic" -w $windowWidth -c "addFurDynamic()"; text -l "hosok2@naver.com"; showWindow; } global proc makeFur(){ string $sel[] = `ls -sl`; //exceptions if(!`textScrollList -q -numberOfItems instanceNames`){ error("Submit Fur Objects."); } if(1 != size($sel)){ error("Select one object."); } //if nurbs, set RangeUV string $selShape[] = `listRelatives -s $sel[0]`; if(`objectType -isType "nurbsSurface" $selShape[0]`){ if(`checkBox -q -v UVNormalize`){ rebuildSurface -ch 1 -kr 0 -kcp 1 -kc 1 $selShape[0]; select -r $sel[0]; } } string $furParticle[]; $furParticle = makeFurParticle(); setGoal($sel[0],$furParticle[0],$furParticle[1]); string $instanceObjs[] = makeInstance($furParticle); makeRotationControlMap($furParticle); makeScaleControlMap($furParticle); makeIndexControlMap($furParticle,size($instanceObjs)); makeAttatchmentMap($furParticle); makeControler($furParticle); makeFurExpression($furParticle); //display error fix select -r $furParticle[1] ; select -r $furParticle[0] ; } global proc makeControler(string $furParticle[]){ addFurAttrs($furParticle[0]); connectControlAttr($furParticle); } global proc connectControlAttr(string $furParticle[]){ connectAttr -f ($furParticle[0]+".numberOfFur") ($furParticle[1]+".maxCount"); } global proc addFurAttrs(string $furParticle){ //remove default attrs setAttr -lock true -keyable false ($furParticle+".tx"); setAttr -lock true -keyable false ($furParticle+".ty"); setAttr -lock true -keyable false ($furParticle+".tz"); setAttr -lock true -keyable false ($furParticle+".rx"); setAttr -lock true -keyable false ($furParticle+".ry"); setAttr -lock true -keyable false ($furParticle+".rz"); setAttr -lock true -keyable false ($furParticle+".sx"); setAttr -lock true -keyable false ($furParticle+".sy"); setAttr -lock true -keyable false ($furParticle+".sz"); setAttr -lock true -keyable false ($furParticle+".v"); //num of fur addAttr -ln numberOfFur -at long -min 0 $furParticle; setAttr -e -keyable true ($furParticle+".numberOfFur"); int $numOfFur = `intFieldGrp -q -v1 numOfFur`; setAttr ($furParticle+".numberOfFur") $numOfFur; //rotation addAttr -ln furRotateX -at double $furParticle; addAttr -ln furRotateY -at double $furParticle; addAttr -ln furRotateZ -at double $furParticle; setAttr -e -keyable true ($furParticle+".furRotateX"); setAttr -e -keyable true ($furParticle+".furRotateY"); setAttr -e -keyable true ($furParticle+".furRotateZ"); //rotation noise addAttr -ln furRotateNoiseX -at double $furParticle; addAttr -ln furRotateNoiseY -at double $furParticle; addAttr -ln furRotateNoiseZ -at double $furParticle; setAttr -e -keyable true ($furParticle+".furRotateNoiseX"); setAttr -e -keyable true ($furParticle+".furRotateNoiseY"); setAttr -e -keyable true ($furParticle+".furRotateNoiseZ"); //rotate noise pharse addAttr -ln furRotateNoisePharseX -at double $furParticle; addAttr -ln furRotateNoisePharseY -at double $furParticle; addAttr -ln furRotateNoisePharseZ -at double $furParticle; setAttr -e -keyable true ($furParticle+".furRotateNoisePharseX"); setAttr -e -keyable true ($furParticle+".furRotateNoisePharseY"); setAttr -e -keyable true ($furParticle+".furRotateNoisePharseZ"); //scale addAttr -ln furScale -at double $furParticle; setAttr -e -keyable true ($furParticle+".furScale"); setAttr ($furParticle+".furScale") 1; //scale Noise addAttr -ln furScaleNoise -at double $furParticle; setAttr -e -keyable true ($furParticle+".furScaleNoise"); } global proc makeFurExpression(string $furParticle[]){ //---------------------------------------------------------- string $radExp = ""; $radExp += ""+ $furParticle[1] +".goalU = "+ $furParticle[1] +".parentU ;\r"; $radExp += ""+ $furParticle[1] +".goalV = "+ $furParticle[1] +".parentV ;\r"; $radExp += "\r"; $radExp += ""+ $furParticle[1] +".furScale = "+ $furParticle[1] +".furScaleRamp * "+ $furParticle[0] +".furScale ;\r"; $radExp += ""+ $furParticle[1] +".furScale += noise("+ $furParticle[1] +".furScaleNoise) * ("+ $furParticle[0] +".furScaleNoise * "+ $furParticle[1] +".furScaleNoiseMaskRamp);\r"; $radExp += "\r"; $radExp += "float $maxAngleX = deg_to_rad(90) ;\r"; $radExp += "float $minAngleX = deg_to_rad(-90) ;\r"; $radExp += "float $maxAngleY = deg_to_rad(90) ;\r"; $radExp += "float $minAngleY = deg_to_rad(-90) ;\r"; $radExp += "float $maxAngleZ = deg_to_rad(90) ;\r"; $radExp += "float $minAngleZ = deg_to_rad(-90) ;\r"; $radExp += "\r"; $radExp += "vector $tmpRotateX = "+ $furParticle[1] +".furRotateXMap ;\r"; $radExp += "vector $tmpRotateY = "+ $furParticle[1] +".furRotateYMap ;\r"; $radExp += "vector $tmpRotateZ = "+ $furParticle[1] +".furRotateZMap ;\r"; $radExp += "\r"; $radExp += "float $furRotateX = ($minAngleX * (1-$tmpRotateX.z)) + ($maxAngleX * $tmpRotateX.z) ;\r"; $radExp += "float $furRotateY = ($minAngleY * (1-$tmpRotateY.z)) + ($maxAngleY * $tmpRotateY.z) ;\r"; $radExp += "float $furRotateZ = ($minAngleZ * (1-$tmpRotateZ.z)) + ($maxAngleZ * $tmpRotateZ.z) ;\r"; $radExp += "\r"; $radExp += "$furRotateX += deg_to_rad( "+ $furParticle[0] +".furRotateX ) ;\r"; $radExp += "$furRotateY += deg_to_rad( "+ $furParticle[0] +".furRotateY ) ;\r"; $radExp += "$furRotateZ += deg_to_rad( "+ $furParticle[0] +".furRotateZ ) ;\r"; $radExp += "\r"; $radExp += "$furRotateX += noise("+ $furParticle[1] +".furRotateNoiseX + "+ $furParticle[0] +".furRotateNoisePharseX) * (deg_to_rad("+ $furParticle[0] +".furRotateNoiseX) * furRotateNoiseMaskRamp ) ;\r"; $radExp += "$furRotateY += noise("+ $furParticle[1] +".furRotateNoiseY + "+ $furParticle[0] +".furRotateNoisePharseY) * (deg_to_rad("+ $furParticle[0] +".furRotateNoiseY) * furRotateNoiseMaskRamp ) ;\r"; $radExp += "$furRotateZ += noise("+ $furParticle[1] +".furRotateNoiseZ + "+ $furParticle[0] +".furRotateNoisePharseZ) * (deg_to_rad("+ $furParticle[0] +".furRotateNoiseZ) * furRotateNoiseMaskRamp ) ;\r"; $radExp += "\r"; $radExp += "vector $newTanU = rot("+ $furParticle[1] +".goalWorldTangentU0PP, "+ $furParticle[1] +".goalWorldTangentV0PP, $furRotateX) ;\r"; $radExp += "vector $newTanV = rot("+ $furParticle[1] +".goalWorldTangentV0PP, "+ $furParticle[1] +".goalWorldTangentU0PP, $furRotateY) ;\r"; $radExp += "\r"; $radExp += ""+ $furParticle[1] +".furAim = cross($newTanU,$newTanV) ;\r"; $radExp += ""+ $furParticle[1] +".furAimUp = rot( "+$furParticle[1]+".goalWorldTangentV0PP, "+ $furParticle[1] +".furAim, $furRotateZ) ;"; //--------------------------------------------------------- string $cExp = ""; $cExp += ""+ $furParticle[1] +".goalU ="+ $furParticle[1] +".parentU ;\r"; $cExp += ""+ $furParticle[1] +".goalV ="+ $furParticle[1] +".parentV ;\r"; $cExp += "\r"; $cExp += ""+ $furParticle[1] +".furScaleNoise = rand(-1, 1) ;\r"; $cExp += "\r"; $cExp += ""+ $furParticle[1] +".furRotateNoiseX = rand(-180,180) ;\r"; $cExp += ""+ $furParticle[1] +".furRotateNoiseY = rand(-180,180) ;\r"; $cExp += ""+ $furParticle[1] +".furRotateNoiseZ = rand(-180,180) ;"; //--------------------------------------------------------- dynExpression -s $cExp -c $furParticle[1]; dynExpression -s $radExp -rad $furParticle[1]; } global proc makeIndexControlMap(string $furParticle[], int $numOfFurObjs){ string $furIndexRamp = `shadingNode -asTexture ramp -n ($furParticle[0]+"_furIndex")`; removeMultiInstance -break true ($furIndexRamp+".colorEntryList[2]"); setAttr ($furIndexRamp+".colorEntryList[0].color") -type double3 0 0 0 ; setAttr ($furIndexRamp+".colorEntryList[1].color") -type double3 1 1 1 ; setAttr ($furIndexRamp+".colorEntryList[1].position") 0 ; setAttr ($furIndexRamp+".colorEntryList[0].position") 1 ; setAttr ($furIndexRamp+".type") 1; string $furIndexArrayMapper[] = `arrayMapper -target $furParticle[1] -destAttr furIndex -inputU goalU -inputV goalV -mapTo $furIndexRamp`; setAttr ($furIndexArrayMapper[0]+".minValue") 0; setAttr ($furIndexArrayMapper[0]+".maxValue") $numOfFurObjs; } global proc makeScaleControlMap(string $furParticle[]){ string $furScaleRamp = `shadingNode -asTexture ramp -n ($furParticle[0]+"_furScale")`; string $furScaleNoiseMaskRamp = `shadingNode -asTexture ramp -n ($furParticle[0]+"_furScaleNoiseMask")`; removeMultiInstance -break true ($furScaleRamp+".colorEntryList[1]"); removeMultiInstance -break true ($furScaleRamp+".colorEntryList[2]"); removeMultiInstance -break true ($furScaleNoiseMaskRamp+".colorEntryList[1]"); removeMultiInstance -break true ($furScaleNoiseMaskRamp+".colorEntryList[2]"); setAttr ($furScaleRamp+".colorEntryList[0].color") -type double3 1 1 1 ; setAttr ($furScaleNoiseMaskRamp+".colorEntryList[0].color") -type double3 1 1 1 ; setAttr ($furScaleRamp+".type") 1; setAttr ($furScaleNoiseMaskRamp+".type") 1; string $furScaleArrayMapper[] = `arrayMapper -target $furParticle[1] -destAttr furScaleRamp -inputU goalU -inputV goalV -mapTo $furScaleRamp`; string $furScaleNoiseMapArrayMapper[] = `arrayMapper -target $furParticle[1] -destAttr furScaleNoiseMaskRamp -inputU goalU -inputV goalV -mapTo $furScaleNoiseMaskRamp`; } global proc setDynamcParticleGoal(string $dynamicParticle[] ,string $furParticle[]){ float $dynamicForce = `floatSliderGrp -q -v dynamicForce`; goal -w $dynamicForce -utr 0 -g $furParticle[0] $dynamicParticle[0]; addAttr -ln goalOffset -dt vectorArray $dynamicParticle; addAttr -ln goalOffset0 -dt vectorArray $dynamicParticle; } global proc makeAttatchmentMap(string $furParticle[]){ addPerParticleGoalPointAttr $furParticle[1] 0 Weight doubleArray; string $furParticleGoalRamp = `shadingNode -asTexture ramp -n ($furParticle[0]+"_attatchment")`; removeMultiInstance -break true ($furParticleGoalRamp+".colorEntryList[1]"); removeMultiInstance -break true ($furParticleGoalRamp+".colorEntryList[2]"); setAttr ($furParticleGoalRamp+".colorEntryList[0].color") -type double3 1 1 1 ; setAttr ($furParticleGoalRamp+".type") 1; string $furParticleGoalArrayMapper[] = `arrayMapper -target $furParticle[1] -destAttr goalWeight0PP -inputU goalU -inputV goalV -mapTo $furParticleGoalRamp`; } global proc makeRotationControlMap(string $furParticle[]){ string $furRotateXRamp = `shadingNode -asTexture ramp -n ($furParticle[0]+"_furRotateX")`; string $furRotateYRamp = `shadingNode -asTexture ramp -n ($furParticle[0]+"_furRotateY")`; string $furRotateZRamp = `shadingNode -asTexture ramp -n ($furParticle[0]+"_furRotateZ")`; string $furRotateNoiseMaskRamp = `shadingNode -asTexture ramp -n ($furParticle[0]+"_furRotateNoiseMask")`; removeMultiInstance -break true ($furRotateXRamp+".colorEntryList[1]"); removeMultiInstance -break true ($furRotateXRamp+".colorEntryList[2]"); removeMultiInstance -break true ($furRotateYRamp+".colorEntryList[1]"); removeMultiInstance -break true ($furRotateYRamp+".colorEntryList[2]"); removeMultiInstance -break true ($furRotateZRamp+".colorEntryList[1]"); removeMultiInstance -break true ($furRotateZRamp+".colorEntryList[2]"); removeMultiInstance -break true ($furRotateNoiseMaskRamp+".colorEntryList[1]"); removeMultiInstance -break true ($furRotateNoiseMaskRamp+".colorEntryList[2]"); setAttr ($furRotateXRamp+".colorEntryList[0].color") -type double3 0.5 0.5 0.5 ; setAttr ($furRotateYRamp+".colorEntryList[0].color") -type double3 0.5 0.5 0.5 ; setAttr ($furRotateZRamp+".colorEntryList[0].color") -type double3 0.5 0.5 0.5 ; setAttr ($furRotateNoiseMaskRamp+".colorEntryList[0].color") -type double3 1 1 1 ; setAttr ($furRotateXRamp+".type") 1; setAttr ($furRotateYRamp+".type") 1; setAttr ($furRotateZRamp+".type") 1; setAttr ($furRotateNoiseMaskRamp+".type") 1; string $furRotationXArrayMapper[] = `arrayMapper -target $furParticle[1] -destAttr furRotateXMap -inputU goalU -inputV goalV -mapTo $furRotateXRamp`; string $furRotationYArrayMapper[] = `arrayMapper -target $furParticle[1] -destAttr furRotateYMap -inputU goalU -inputV goalV -mapTo $furRotateYRamp`; string $furRotationZArrayMapper[] = `arrayMapper -target $furParticle[1] -destAttr furRotateZMap -inputU goalU -inputV goalV -mapTo $furRotateZRamp`; string $furRotationNoiseMaskArrayMapper[] = `arrayMapper -target $furParticle[1] -destAttr furRotateNoiseMaskRamp -inputU goalU -inputV goalV -mapTo $furRotateNoiseMaskRamp`; } global proc string[] makeInstance(string $particle[]){ string $objs[] = `textScrollList -q -allItems instanceNames`; string $objectCommand = ""; for($n = 0 ; $n < size($objs) ; $n ++){ $objectCommand += "-object "+$objs[$n] + " "; } string $furInstance = `eval("particleInstancer -addObject "+$objectCommand+$particle[1]+";")`; //add instance Name attr to furParticle addAttr -ln furInstanceName -dt "string" -hidden 1 $particle[0]; setAttr -type "string" ($particle[0]+".furInstanceName") $furInstance ; particleInstancer -e -name $furInstance -aimDirection furAim $particle[1]; particleInstancer -e -name $furInstance -aimWorldUp furAimUp $particle[1]; particleInstancer -e -name $furInstance -scale furScale $particle[1]; particleInstancer -e -name $furInstance -objectIndex furIndex $particle[1]; return $objs; } global proc string[] makeDynamicFurControlParticle(string $furParticle[]){ string $tmp[] = `emitter -type omni -r 50000 -scaleRateByObjectSize 0 `; string $dynamicFurParicleEmitter = $tmp[0]; string $dynamicParticle[] = `particle`; connectDynamic -em $dynamicFurParicleEmitter $dynamicParticle[0]; connectAttr ($furParticle[1]+".maxCount") ($dynamicParticle[1]+".maxCount"); setDynamcParticleGoal($dynamicParticle ,$furParticle); dynamicFurParticleControl($dynamicParticle); makeDynamicFurParticleExpression($dynamicParticle , $furParticle); return $dynamicParticle; } global proc addFurDynamic(){ string $sel[] = `ls -sl`; string $furParticle[]; $furParticle[0] = $sel[0]; string $tmp[] = `listRelatives -s $furParticle[0]`; $furParticle[1] = $tmp[0] ; addAttr -ln dynamicFurParticlePosition0 -dt vectorArray $furParticle[1]; addAttr -ln dynamicFurParticlePosition -dt vectorArray $furParticle[1]; string $dynamicParticle[] = makeDynamicFurControlParticle($furParticle); string $rbtExp = ""; $rbtExp += ""+ $furParticle[1] +".dynamicFurParticlePosition = "+ $dynamicParticle[1] +".position;"; dynExpression -s $rbtExp -rbd $furParticle[1]; string $furParticleInstance = `getAttr ($furParticle[0]+".furInstanceName")`; particleInstancer -e -name $furParticleInstance -aimDirection "" $furParticle[1]; particleInstancer -e -name $furParticleInstance -aimPosition dynamicFurParticlePosition $furParticle[1]; } global proc dynamicFurParticleControl(string $dynamicParticle[]){ //remove attr setAttr -lock true -keyable false ($dynamicParticle[0]+".tx"); setAttr -lock true -keyable false ($dynamicParticle[0]+".ty"); setAttr -lock true -keyable false ($dynamicParticle[0]+".tz"); setAttr -lock true -keyable false ($dynamicParticle[0]+".rx"); setAttr -lock true -keyable false ($dynamicParticle[0]+".ry"); setAttr -lock true -keyable false ($dynamicParticle[0]+".rz"); setAttr -lock true -keyable false ($dynamicParticle[0]+".sx"); setAttr -lock true -keyable false ($dynamicParticle[0]+".sy"); setAttr -lock true -keyable false ($dynamicParticle[0]+".sz"); //visible off setAttr ($dynamicParticle[0]+".v") 0; //add attr addAttr -ln dynamicForce -at double $dynamicParticle[0]; setAttr -e -keyable true ($dynamicParticle[0]+".dynamicForce"); float $dynamicForce = `floatSliderGrp -q -v dynamicForce`; setAttr ($dynamicParticle[0]+".dynamicForce") $dynamicForce; connectAttr ($dynamicParticle[0]+".dynamicForce") ($dynamicParticle[1]+".goalWeight[0]"); addAttr -ln dynamicDistance -at double $dynamicParticle[0]; setAttr -e -keyable true ($dynamicParticle[0]+".dynamicDistance"); setAttr ($dynamicParticle[0]+".dynamicDistance") 1; } global proc makeDynamicFurParticleExpression(string $dynamicParticle[] ,string $furParticle[]){ string $rbtExp = ""; $rbtExp += ""+ $dynamicParticle[1] +".goalOffset = unit("+ $furParticle[1] +".furAim) * " + $dynamicParticle[0]+ ".dynamicDistance;"; dynExpression -s $rbtExp -rbd $dynamicParticle[1]; } global proc string[] makeFurParticle(){ string $tmp[] = `emitter -type surface -needParentUV 1`; string $furEmiter = $tmp[1]; string $furParticle[] = `particle`; string $textureRateRamp = `shadingNode -asTexture ramp -n ($furParticle[0]+"_emit")`; removeMultiInstance -break true ($textureRateRamp+".colorEntryList[1]"); removeMultiInstance -break true ($textureRateRamp+".colorEntryList[2]"); setAttr ($textureRateRamp+".colorEntryList[0].color") -type double3 1 1 1 ; setAttr ($textureRateRamp+".type") 1; setAttr ( $furEmiter+".enableTextureRate" ) 1; connectAttr ($textureRateRamp+".outColor") ($furEmiter+".textureRate"); int $numOfFur = `intFieldGrp -q -v1 numOfFur`; connectDynamic -em $furEmiter $furParticle[0]; setAttr ($furEmiter+".scaleRateByObjectSize") 0; setAttr ($furEmiter+".rate") ($numOfFur * 30); setAttr ($furParticle[1]+".maxCount") $numOfFur; //add Attr addAttr -ln furAim0 -dt vectorArray $furParticle[1]; addAttr -ln furAim -dt vectorArray $furParticle[1]; addAttr -ln furAimUp0 -dt vectorArray $furParticle[1]; addAttr -ln furAimUp -dt vectorArray $furParticle[1]; addAttr -ln furRotateXMap -dt doubleArray $furParticle[1]; addAttr -ln furRotateYMap -dt doubleArray $furParticle[1]; addAttr -ln furRotateZMap -dt doubleArray $furParticle[1]; addAttr -ln furScale0 -dt doubleArray $furParticle[1]; addAttr -ln furScale -dt doubleArray $furParticle[1]; addAttr -ln furScaleNoise0 -dt doubleArray $furParticle[1]; addAttr -ln furScaleNoise -dt doubleArray $furParticle[1]; addAttr -ln furScaleNoiseMaskRamp0 -dt doubleArray $furParticle[1]; addAttr -ln furScaleNoiseMaskRamp -dt doubleArray $furParticle[1]; addAttr -ln furScaleRamp0 -dt doubleArray $furParticle[1]; addAttr -ln furScaleRamp -dt doubleArray $furParticle[1]; addAttr -ln furIndex0 -dt doubleArray $furParticle[1]; addAttr -ln furIndex -dt doubleArray $furParticle[1]; addAttr -ln furRotateNoiseX0 -dt doubleArray $furParticle[1]; addAttr -ln furRotateNoiseX -dt doubleArray $furParticle[1]; addAttr -ln furRotateNoiseY0 -dt doubleArray $furParticle[1]; addAttr -ln furRotateNoiseY -dt doubleArray $furParticle[1]; addAttr -ln furRotateNoiseZ0 -dt doubleArray $furParticle[1]; addAttr -ln furRotateNoiseZ -dt doubleArray $furParticle[1]; addAttr -ln furRotateNoiseMaskRamp0 -dt doubleArray $furParticle[1]; addAttr -ln furRotateNoiseMaskRamp -dt doubleArray $furParticle[1]; return $furParticle; } global proc setGoal(string $obj, string $particle, string $particleShape){ cycleCheck -e off; goal -w 1 -utr 0 -g $obj $particle; addAttr -ln goalU -dt doubleArray $particleShape; addAttr -ln goalU0 -dt doubleArray $particleShape; addAttr -ln goalV -dt doubleArray $particleShape; addAttr -ln goalV0 -dt doubleArray $particleShape; addAttr -ln parentU -dt doubleArray $particleShape; addAttr -ln parentU0 -dt doubleArray $particleShape; addAttr -ln parentV -dt doubleArray $particleShape; addAttr -ln parentV0 -dt doubleArray $particleShape; //to call addPerParticleGoalPointAttr if(!`exists addPerParticleGoalPointAttr`){ source "AEdynObjectGoalWeightNew.mel"; } addPerParticleGoalPointAttr $particleShape 0 WorldNormal vectorArray; addPerParticleGoalPointAttr $particleShape 0 WorldTangentV vectorArray; addPerParticleGoalPointAttr $particleShape 0 WorldTangentU vectorArray; } global proc submitInstances(){ string $sel[] = `ls -sl`; textScrollList -e -removeAll instanceNames; for($n = 0 ; $n < size($sel) ; $n++){ textScrollList -e -append $sel[$n] instanceNames; } }