package GfxLib;


public class Point3D {

  public float     x, y, z;  // coordinates of vertex
  public int       argb;
  public float     m_normalLength;
  public boolean   m_hasNormal;
  public Point3D   m_normal;
  private int      m_numSurroundingPolys;
  public float[]   m_intensity;


  public Point3D() 
  {
    x = y = z = 0;
    argb = 0;
    m_normal = null;
    m_hasNormal = false;
    m_numSurroundingPolys = 0;
    m_intensity = new float[3];
  }
  
  public Point3D(float xval, float yval, float zval) 
  {
    x = xval;
    y = yval;
    z = zval;
    m_normal = new Point3D();
    m_numSurroundingPolys = 0;
    m_intensity = new float[3];
  }

  public void addSurroundingNormal(Point3D normal)
  {
    m_normal.x += normal.x;
    m_normal.y += normal.y;
    m_normal.z += normal.z;
    m_numSurroundingPolys++;
  }

  public void averageSurroundingNormals()
  {
    m_normal.x  /= m_numSurroundingPolys;
    m_normal.y  /= m_numSurroundingPolys;
    m_normal.z  /= m_numSurroundingPolys;
    m_hasNormal  = true;
  }

  public final Point3D crossProduct(Point3D pt)
  {
    return new Point3D(y*pt.z - z*pt.y,
		       z*pt.x - x*pt.z,
		       x*pt.y - y*pt.x);
  }

  public final float dotProduct(Point3D pt)
  {
    return x*pt.x + y*pt.y + z*pt.z;
  }
  
   public void computeNormalLength()
   {
    m_normalLength = (float)Math.sqrt(x*x+y*y+z*z);
   }

  public final void normalize()
  {
    float normalizer = (float)Math.sqrt(x*x+y*y+z*z);
    x /= normalizer;
    y /= normalizer;
    z /= normalizer;
  }

  public final Point3D sub(Point3D pt)
  {
    return new Point3D(x-pt.x, y-pt.y, z-pt.z);
  }

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