import java.awt.Color;

public class Vertex3D {
    final static int CHUNKSIZE = 10;
    public float x, y, z, w;           // coordinate of vertex
    public float nx, ny, nz;        // vertex normal
    public boolean hasNormal;
    public Point3D normalVectors[];
    public int normalLength;

    public Vertex3D()
    {
        nx = ny = nz = 0;
        hasNormal = false;
	normalVectors = new Point3D[CHUNKSIZE];
	normalLength = 0;
    }

    public Vertex3D(float xval, float yval, float zval)
    {
        x = xval;
        y = yval;
        z = zval;
        w = 1;
        nx = ny = nz = 0;
        hasNormal = false;
	normalVectors = new Point3D[CHUNKSIZE];
	normalLength = 0;
    }
    
    public void copy(Vertex3D v)
    {
        x = v.x;        y = v.y;        z = v.z;    w = v.w;
        nx = v.nx;      ny = v.ny;      nz = v.nz;
        hasNormal = v.hasNormal;
    }

    public void setNormal(float xval, float yval, float zval) {
        float l = (float) (1 / Math.sqrt(xval*xval + yval*yval + zval*zval));
        xval *= l;
        yval *= l;
        zval *= l;
        nx = xval;
        ny = yval;
        nz = zval;
        hasNormal = true;
    }

    public void normalize( )
    {
        if (w != 1) {
            w = 1 / w;
            x *= w;
            y *= w;
            z *= w;
            w = 1;
        }
    }

    public void addNormal(float xval, float yval, float zval) {
      if (normalLength == normalVectors.length) {
	Point3D newList[] = new Point3D[normalVectors.length+CHUNKSIZE];
	System.arraycopy(normalVectors, 0, newList, 0, normalVectors.length);
	normalVectors = newList;
      }
      Point3D p = new Point3D(xval, yval, zval);
      p.normalize();
      normalVectors[normalLength] = p;
      normalLength++;
    }

    public void averageNormals() {
      float normx=0, normy=0, normz=0;
      for (int i=0; i < normalLength ; i++) {
	normx += normalVectors[i].x;
	normy += normalVectors[i].y;
	normz += normalVectors[i].z;
      }
      setNormal(normx, normy, normz);
      normalVectors = null;
      normalLength = 0;
    }

    
    public String toString()
    {
        return new String(" ["+x+", "+y+", "+z+", "+w+"]");
    }
}
