//
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]);
}
}