import java.awt.Color;

public class Vertex3D {
  public float x, y, z, w;        // coordinate of vertex
  public float nx, ny, nz;        // vertex normal
  public boolean hasNormal;
  public int numberOfNormals;
  
  public Vertex3D()
  {
    nx = ny = nz = 0;
    hasNormal = false;
    numberOfNormals = 0;
  }
  
  public Vertex3D(float xval, float yval, float zval)
  {
    x = xval;
    y = yval;
    z = zval;
    w = 1;
    nx = ny = nz = 0;
    hasNormal = false;
    numberOfNormals = 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;
    numberOfNormals = v.numberOfNormals;
  }
  
  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;
    numberOfNormals = 1;
  }

  public void normalize( )
  {
    if (w != 1) {
      w = 1 / w;
      x *= w;
      y *= w;
      z *= w;
      w = 1;
    }
  }

  public void addNormal(float nx, float ny, float nz) {
    numberOfNormals ++;
    this.nx += nx;
    this.ny += ny;
    this.nz += nz;
  }

  public void averageNormals() {
    if(numberOfNormals == 0)
      {
	nx = 0.0f;
	ny = 0.0f;
	nz = 0.0f;
	return;
      }
    else {
      nx /= numberOfNormals;
      ny /= numberOfNormals;
      nz /= numberOfNormals;
      hasNormal = true;
      numberOfNormals = 1;
    }
  }
    
  public String toString()
  {
    return new String(" ["+x+", "+y+", "+z+", "+w+"]");
  }
}

