
package tmcm.xModels;

import java.awt.Color;
import java.util.Vector;


class TransformInfo {

   final static int scale = 0,     // 1, 2, or 3 parameters
                    translate = 1, // 1, 2, or 3 parameters
                    xrotate = 2,   // 1 parameter
                    yrotate = 3,   // 1 parameter
                    zrotate = 4,   // 1 parameter
                    rotateAboutPoint = 5,  // 3 parameters: angle, x, and y
                    rotateAboutLine = 6,   // 4 or 7 parameters
                    xyshear = 7,  // two parameters
                    xskew = 8, // one parameter
                    yskew = 9; // one parameter
                    
   int transformType;
   ParamVal[] data;
   
   TransformInfo(int type, Vector params) {
      transformType = type;
      data = new ParamVal[params.size()];
      for (int i = 0; i < data.length; i++)
         data[i] = (ParamVal)params.elementAt(i);
   }

   void apply(Transform T, int frameNum) {
      double a,b,c,d;
      switch (transformType) {
         case scale:
           a = data[0].getVal(frameNum);
           b = (data.length > 1)? data[1].getVal(frameNum) : a;
           c = (data.length > 2)? data[2].getVal(frameNum) : b;
           T.scale(a,b,c);
           break;
         case translate:
           a = data[0].getVal(frameNum);
           b = (data.length > 1)? data[1].getVal(frameNum) : 0;
           c = (data.length > 2)? data[2].getVal(frameNum) : 0;
           T.translate(a,b,c);
           break;
         case xrotate:
           a = data[0].getVal(frameNum);
           T.rotatex(a);
           break;
         case yrotate:
           a = data[0].getVal(frameNum);
           T.rotatey(a);
           break;
         case zrotate:
           a = data[0].getVal(frameNum);
           T.rotatez(a);
           break;
         case rotateAboutPoint:
           a = data[0].getVal(frameNum);
           b = data[1].getVal(frameNum);
           c = data[2].getVal(frameNum);
           T.translate(b,c,0);
           T.rotatez(a);
           T.translate(-b,-c,0);
           break;
         case rotateAboutLine:
           double e = 0, f = 0, g = 0;
           if (data.length == 7) {
             e = data[4].getVal(frameNum);
             f = data[5].getVal(frameNum);
             g = data[6].getVal(frameNum);
             b = e - data[1].getVal(frameNum);
             c = f - data[2].getVal(frameNum);
             d = g - data[3].getVal(frameNum);
             T.translate(e,f,g);
           }
           else {
              b = data[1].getVal(frameNum);
              c = data[2].getVal(frameNum);
              d = data[3].getVal(frameNum);
           }
           a = data[0].getVal(frameNum);
           T.rotateAboutLine(a,b,c,d);
           if (data.length == 7)
              T.translate(-e,-f,-g);
           break;
         case xyshear:
           a = data[0].getVal(frameNum);
           b = data[1].getVal(frameNum);
           T.xyShear(a,b);
           break;
         case xskew:
           a = data[0].getVal(frameNum);
           T.xSkew(a);
           break;
         case yskew:
           a = data[0].getVal(frameNum);
           T.ySkew(a);
           break;
       }
   }

}  // end of class TransformInfo


