//Matrix Generation MEL
//started 9.23.09
//front end for matrix-generating procedures
//by Dave Lewis
//VSFX 705

//================
//declaration of global variables to spread to procs
//================
   global string $rotSlider;
   global string $arcSlider;
   global string $xtranSlider;
   global string $ytranSlider;
   global string $groupList[];
   global string $arcaList[];
   global string $arcbList[];

//================
//matrix-generation proc
//================
global proc makeMatrixType(int $geoType, int $arcs, float $rot){
   global string $groupList[];
   global string $arcaList[];
   global string $arcbList[];

   for ($j=1; $j<=$arcs; $j++) {
      for ($i=1.0; $i<=10; $i++) {
         int $arrayNum= (($j-1)*10)+($i-1);
         if ($geoType == 1){
            polyCone;
         } else if ($geoType == 2){
            polyCube;
         } else if ($geoType == 3){
            polyHelix -c 3 -h 2 -w 2 -r 0.2;
         };
         $arcaList[$arrayNum] = `rename ("arca" + $j + "_" + $i)`;
         rotate -r `rand 0 180` `rand 0 180` `rand 0 180`;
         scale -a (1/$i) ($i/3) (1/$i);
         move -r ((($i/1.5)*($i/1.5))/2) ($i*1.7) 0;
         if ($geoType == 1){
            polyCone;
         } else if ($geoType == 2){
            polyCube;
         } else if ($geoType == 3){
            polyHelix -c 3 -h 2 -w 2 -r 0.2;
         };
         $arcbList[$arrayNum] = `rename ("arcb" + $j + "_" + $i)`;
         rotate -r `rand 0 180` `rand 0 180` `rand 0 180`;
         scale -a (1/$i) ($i/3) (1/$i);
         move -r ((($i/2)*($i/2))/4) ($i*1.7) 0;
      }
      select ("arc*" + $j + "_*");
      $groupList[$j-1] = `group`;
      select "group*";
      xform -piv 0 0 0;
      rotate - p 0 0 0 -r 0 $rot 0;
   }
}

//================
//clear old matrices and array information to prevent conflicts
//================
global proc clearOld(){
   global string $groupList[];
   global string $arcaList[];
   global string $arcbList[];

   select "group*";
   delete;
   clear $groupList;
   clear $arcaList;
   clear $arcbList;
}

//================
//update matrix when rotation slider is updated
//================
global proc updateRot() {
   global string $rotSlider;
   global string $groupList[];

   $numGroups = size($groupList);

   float $rotV =`floatSliderGrp -q -v $rotSlider`;

   select -cl;
   for ($i=0; $i<$numGroups; $i++){
      setAttr ($groupList[$i] + ".rotateY") ($rotV*($i+1));
   }
}

//================
//update matrix when rotation slider is dragged
//================
global proc dragRot(){
   global string $rotSlider;
   global string $groupList[];

   $numGroups = size($groupList);

   float $rotV=`floatSliderGrp -q -v $rotSlider`;

   select -cl;
   for ($i=0; $i<$numGroups; $i++){
      setAttr ($groupList[$i] + ".rotateY") ($rotV*($i+1));
   }
}

//================
//update matrix when x position slider is updated
//================
global proc updateX() {
   global string $xtranSlider;
   global string $arcaList[];
   global string $arcbList[];

   $numArca = size($arcaList);
   $numArcb = size($arcbList);

   float $xtranV =`floatSliderGrp -q -v $xtranSlider`;

   select -cl;
   for ($i=0; $i<$numArca; $i++){
      int $ones = endString ($i, 1);
      setAttr ($arcaList[$i] + ".translateX") ((($ones*$xtranV)*($ones*$xtranV))/32);
}
   select -cl;
   for ($i=0; $i<$numArcb; $i++){
      int $ones = endString ($i, 1);
      setAttr ($arcbList[$i] + ".translateX") ((($ones*$xtranV)*($ones*$xtranV))/64);
   }
}

//================
//update matrix when x position slider is dragged
//================
global proc dragX() {
   global string $xtranSlider;
   global string $arcaList[];
   global string $arcbList[];

   $numArca = size($arcaList);
   $numArcb = size($arcbList);

   float $xtranV =`floatSliderGrp -q -v $xtranSlider`;

   select -cl;
   for ($i=0; $i<$numArca; $i++){
      int $ones = endString ($i, 1);
      setAttr ($arcaList[$i] + ".translateX") ((($ones*$xtranV)*($ones*$xtranV))/32);
   }
   select -cl;
   for ($i=0; $i<$numArcb; $i++){
      int $ones = endString ($i, 1);
      setAttr ($arcbList[$i] + ".translateX") ((($ones*$xtranV)*($ones*$xtranV))/64);
   }
}

//================
//update matrix when y position slider is updated
//================
global proc updateY() {
   global string $ytranSlider;
   global string $arcaList[];
   global string $arcbList[];

   $numArca = size($arcaList);
   $numArcb = size($arcbList);

   float $ytranV =`floatSliderGrp -q -v $ytranSlider`;

   select -cl;
   for ($i=0; $i<$numArca; $i++){
      int $ones = endString ($i, 1);
      setAttr ($arcaList[$i] + ".translateY") ($ones*$ytranV);
   }
   select -cl;
   for ($i=0; $i<$numArcb; $i++){
      int $ones = endString ($i, 1);
      setAttr ($arcbList[$i] + ".translateY") ($ones*$ytranV);
   }
}

//================
//update matrix when y position slider is dragged
//================
global proc dragY() {
   global string $ytranSlider;
   global string $arcaList[];
   global string $arcbList[];

   $numArca = size($arcaList);
   $numArcb = size($arcbList);

   float $ytranV =`floatSliderGrp -q -v $ytranSlider`;

   select -cl;
   for ($i=0; $i<$numArca; $i++){
      int $ones = endString ($i, 1);
      setAttr ($arcaList[$i] + ".translateY") ($ones*$ytranV);
   }
   select -cl;
   for ($i=0; $i<$numArcb; $i++){
      int $ones = endString ($i, 1);
      setAttr ($arcbList[$i] + ".translateY") ($ones*$ytranV);
   }
}

//================
//generate window UI with controls
//================
global proc testUI(){
   global string $rotSlider;
   global string $arcSlider;
   global string $xtranSlider;
   global string $ytranSlider;
   global float $rotV;
   global int $buildType = 1;

   if (`window -exists matrixWin`){
      deleteUI -window matrixWin;
   };
   if (`windowPref -exists matrixWin`){
      windowPref -remove matrixWin;
   };

   window -title "Matrix Generation" -rtf 1 -wh 430 160 -s false matrixWin;
   columnLayout;
   $arcSlider = `intSliderGrp
      -label "Arcs"
      -columnAttach 1 "left" 0
      -field true
      -min 1
      -max 20
      -value 12
      -ann "Number of arcs to generate. Not live."`;
   $rotSlider = `floatSliderGrp
      -label "Rotation"
      -columnAttach 1 "left" 0
      -field true
      -min 0.1
      -max 360
      -value 20
      -ann "Rotation value for spread between arcs."
      -changeCommand "updateRot()"
      -dragCommand "dragRot()"`;
   $xtranSlider = `floatSliderGrp
      -label "X Position"
      -columnAttach 1 "left" 0
      -field true
      -min 0.1
      -max 5
      -value 1
      -ann "X position value for spread between shapes."
      -changeCommand "updateX()"
      -dragCommand "dragX()"`;
   $ytranSlider = `floatSliderGrp
      -label "Y Position"
      -columnAttach 1 "left" 0
      -field true
      -min 0.1
      -max 5
      -value 1
      -ann "Y position value for spread between shapes."
      -changeCommand "updateY()"
      -dragCommand "dragY()"`;
   $geoRadio = `radioButtonGrp
      -label "Geometry Type"
      -columnAttach 1 "left" 0
      -nrb 3
      -sl 1
      -la3 "Cone" "Cube" "Helix"
      -on1 "$buildType = 1"
      -on2 "$buildType = 2"
      -on3 "$buildType = 3"
      -ann "Type of geometry primitive used in generation. Not live."`;
   setParent..;
   rowLayout -nc 2;
   button -label "Generate" -command "makeMatrixType($buildType, `intSliderGrp -q -v $arcSlider`, `floatSliderGrp -q -v $rotSlider`)";
   button -label "Clear matricies" -command ("clearOld()");
   setParent..;
   frameLayout -lv false -cll false -w 430 -h 25;
   helpLine;
   showWindow matrixWin;
}

testUI();