//
import java.awt.*;

// TEST OF A VERY SIMPLE 3D RENDERER

public class Car extends SimpleRender
{
   public Color myBgColor = new Color(.7f,.7f,1f);

//----- THE INPUT DATA FOR THE SCENE -----

// FOR EACH SHAPE, ITS R,G,B COLOR

   public double[][] myColors = {
      {.2,.2,.2}, {.2,.2,.2}, // REAR WHEELS
      {.2,.2,.2}, {.2,.2,.2}, // FRONT WHEELS
      {2,2,2}, {2,2,2}, // REAR AXLES
      {2,2,2}, {2,2,2}, // FRONT AXLES
      {1,0,0}, {1,0,0}, {1,0,0}, {1,0,0}, // BODY
   };

// FOR EACH SHAPE, DEFINE TRANSLATION X Y Z, ROTATION X Y Z, SCALE X Y Z

   public double[][][] myTransformations = {
      {{-2,0,-2.2}, {0,0,0}, {.5,.5,.2}}, // WHEELS
      {{-2,0, 2.2}, {0,0,0}, {.5,.5,.2}},

      {{ 2,0,-2.2}, {0,0,0}, {.5,.5,.2}}, // WHEELS
      {{ 2,0, 2.2}, {0,0,0}, {.5,.5,.2}},

      {{-2,0,-1.8 }, {0,0,0}, {.1,.1,.2 }}, // AXLES
      {{-2,0, 1.8 }, {0,0,0}, {.1,.1,.2 }},

      {{ 2,0,-1.8 }, {0,0,0}, {.1,.1,.2 }}, // AXLES
      {{ 2,0, 1.8 }, {0,0,0}, {.1,.1,.2 }},

      {{-2,0, 0 }, {0,0,0}, {1 ,.4,1.6}}, // BODY
      {{ 0,0, 0 }, {0,0,0}, {1 ,.4,1.6}},
      {{ 2,0, 0 }, {0,0,0}, {1 ,.4,1.6}},
      {{ 0,.8,0 }, {0,0,0}, {1 ,.4,1.6}},
   };

   final int LENGTH = 0;
   final int WIDTH = 1;
   final int HEIGHT = 2;
   final int RED = 3;
   final int GREEN = 4;
   final int BLUE = 5;
   final int HUE = 6;
   final int SATURATION = 7;
   final int VALUE = 8;

   String[] lineLabels = {"lines on", "lines off"};
   public void initialize() {
      bgColor = myBgColor;
      colors = myColors;
      transformations = myTransformations;
      shape = new Shape[colors.length];
      for (int i = 0 ; i < shape.length ; i++) {
         shape[i] = new Shape();
	 if (i < 8)
	    shape[i].cylinder(20);
      }
      addSlider("length",0,0);
      addSlider("width" ,0,16);
      addSlider("height",0,32);

      addSlider("red"  ,100,0);
      addSlider("green",100,16);
      addSlider("blue" ,100,32);

      addSlider("hue"       ,200,0);
      addSlider("saturation",200,16);
      addSlider("value"     ,200,32);

      addButton(lineLabels,300,0);

      slider[RED].setValue(1);
      slider[GREEN].setValue(0);
      slider[BLUE].setValue(0);
      adjustHSV();
      super.initialize();
   }

   public void update() {
      double L = 0.5 + 2.8 * slider[LENGTH].getValue();
      double W = 0.4 + 2.4 * slider[WIDTH].getValue();
      double H = 0.8 * slider[HEIGHT].getValue();

      if (slider[RED].isDown || slider[GREEN].isDown || slider[BLUE].isDown)
	 adjustHSV();
      else if (slider[HUE].isDown || slider[SATURATION].isDown || slider[VALUE].isDown)
	 adjustRGB();

      for (int i = 8 ; i < 12 ; i++) {
	 colors[i][0] = slider[RED].getValue();
	 colors[i][1] = slider[GREEN].getValue();
	 colors[i][2] = slider[BLUE].getValue();
      }

      double[][][] t = transformations;

      t[0][0][0] = t[1][0][0] = t[4][0][0] = t[5][0][0] = t[8][0][0] = -L;
      t[2][0][0] = t[3][0][0] = t[6][0][0] = t[7][0][0] = t[10][0][0] = L;
      t[8][2][0] = t[9][2][0] = t[10][2][0] = t[11][2][0] = L/2;

      t[0][0][2] = t[2][0][2] = -W-.2;
      t[1][0][2] = t[3][0][2] = W+.2;
      t[4][0][2] = t[6][0][2] = -W+.2;
      t[5][0][2] = t[7][0][2] = W-.2;
      t[8][2][2] = t[9][2][2] = t[10][2][2] = t[11][2][2] = W-.4;

      t[11][0][1] = H+.4;
      t[11][2][1] = H;

      outline = button[0].getValue() == 1;
   }

   private void adjustHSV() {
      double[] rgb = {slider[RED].getValue(),
                      slider[GREEN].getValue(),
                      slider[BLUE].getValue()}, hsv = {0,0,0};

      ColorSpace.rgb2hsv(rgb, hsv);

      slider[HUE].setValue(hsv[0]);
      slider[SATURATION].setValue(hsv[1]);
      slider[VALUE].setValue(hsv[2]);
   }

   private void adjustRGB() {
      double[] hsv = {slider[HUE].getValue(),
                      slider[SATURATION].getValue(),
                      slider[VALUE].getValue()}, rgb = {0,0,0};

      ColorSpace.hsv2rgb(hsv, rgb);

      slider[RED].setValue(rgb[0]);
      slider[GREEN].setValue(rgb[1]);
      slider[BLUE].setValue(rgb[2]);
   }
}