//<pre>
package wonderlab.graphics.shape;
import wonderlab.graphics.geometry.*;

public class Shape3D {

	protected Vertex [] vertices;
	protected Vertex [] transformedVertices;
	protected int [][] faces;

	protected Matrix3D transformationMatrix;
	protected Matrix3D normTransformationMatrix;
	
	boolean isTriangular;
	
	int[] myColor;
	double x, y, z;
	
	public Shape3D() {

		transformationMatrix = new Matrix3D();
		transformationMatrix.identity();

		normTransformationMatrix = new Matrix3D();
		normTransformationMatrix.identity();

		x = 0;
		y = 0;
		z = 0;
		
		myColor = new int[3];
	}
	
	public void transform( ) {
		//normTransformationMatrix.print();
		for (int i = 0; i < vertices.length; i++) {
			transformedVertices[i] = new Vertex(vertices[i]);
			transformedVertices[i].setPos(transformationMatrix.transform(vertices[i].pos()));
			transformedVertices[i].setNormal(normTransformationMatrix.transform(vertices[i].normal()));
		}
	}	
		
	public int size() {
		return faces.length;
	}
	
	public int numVertices() {
		return vertices.length;
	}
	
	public int[] getColor() {
		return myColor;
	}
	
	public void setColor(double r, double g, double b) {

		for (int i = 0; i < numVertices(); i++) {
			vertices[i].setColor(r, g, b);
		}

	}
	
	public void setColor(Vector3D src) {

		for (int i = 0; i < numVertices(); i++) {
			vertices[i].setColor(src);
		}

	}

	public void setMaterial(Material m) {

		for (int i = 0; i < numVertices(); i++) {
			vertices[i].setMaterial(m);
		}

	}

	public Polygon [] faces() {
	
		Polygon [] temp = new Polygon[faces.length];
		Vertex centroid;
		for (int i = 0; i < faces.length; i++) {
			temp[i] = new Polygon();
			for (int j = 0; j < faces[i].length; j++) {
				temp[i].add(transformedVertices[faces[i][j]]);
			}
//  			centroid = temp[i].centroid();
//  			for (int j = 0; j < faces[i].length; j++) {
//  				temp[i].get(j).setNormal(centroid.normal());
//  			}
			
// 			temp[i].print();			
		}
		return temp;
	}
	
	public void update(Matrix3D newMatrix) {
		transformationMatrix.copy(newMatrix);
		normTransformationMatrix.copy(newMatrix);
		normTransformationMatrix.inverse();
		normTransformationMatrix.transpose();
		this.transform();
	}
	
	public void scale(double a, double b, double c) {
		transformationMatrix.scale(a, b, c);
	}

	public void translate(double a, double b, double c) {
		transformationMatrix.translate(a, b, c);
	}
	
	public void rotateX(double theta) {
		transformationMatrix.rotateX(theta);
	}

	public void rotateY(double theta) {
		transformationMatrix.rotateY(theta);
	}

	public void rotateZ(double theta) {
		transformationMatrix.rotateZ(theta);
	}

	public void print() {

		System.out.println("\n" + faces.length + "faces are...");
		String aFace;
		for (int i = 0; i < faces.length; i++) {
			aFace = "";
			for (int j = 0; j < faces[i].length; j++) {
				aFace = aFace + "\t\t" + faces[i][j];
			}
			System.out.println(aFace);
		}


		System.out.println("<printing complete>");
	}
}
