public class Vertex3D extends ColoredPoint3D implements Cloneable {
    public float w;
    public Point3D normal;
    public boolean hasNormal;

    public Vertex3D() {
      super(0,0,0);
      w = 0;
      normal = new Point3D();
      hasNormal = false;
    }

  public Vertex3D(float xval, float yval, float zval) {
    super(xval, yval, zval);
    w = 1;
    normal = new Point3D();
    hasNormal = false;
  }

  public Vertex3D(ColoredPoint3D p) {
    super(p);
    hasNormal = false;
    w = 1;
  }

  public void copy(Vertex3D v) {
    super.copy(v);
    w = v.w;
    normal.copy(v.normal);
    hasNormal = v.hasNormal;
  }

  public void setNormal(float xval, float yval, float zval) {
    normal = new Point3D(xval, yval, zval).unit();
    hasNormal = true;
  }

  public void setNormal(Point3D n) {
    normal = n.unit();
    hasNormal = true;
  }

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

  public Object clone() {
    Vertex3D v = (Vertex3D) super.clone();
    v.w = w;
    if(hasNormal) 
      v.normal = (Point3D) normal.clone();
    v.hasNormal = hasNormal;
    return(v);
  }

  public String toString() {
    String s;

    s  = "[Vertex3D: " + super.toString() + " " + w + "]";
    //    s += "           " + normal.toString() + "]";              
    return(s);
  }
}
