// Path: src/roquen/fake/Vect3f.java
// public class Vect3f {
//   public float x,y,z;
//   
//   /** */
//   private static final int HASH = hashMakeSeed(0);
//   
//   @Override
//   public int hashCode()
//   {
//     return hashComplete(hashAdd(HASH,x,y,z));
//   }
//   
//   public final float dot(Vect3f v)
//   {
//     return x*v.x + y*v.y + z*v.z;
//   }
// }


import roquen.fake.Vect3f;

package roquen.interp;


/**
 * For performing in-order walks of cells on a uniform 3D grid which
 * are crossed by a line segment or ray.  For more details see {@link RayGrid2D}
 */
public class RayGrid3D {
  private double cx,cy,cz;
  private double ax,ay,az;
  private int    ux,uy,uz;
  
  /** Current cell coordinate */
  public int x,y,z;


// Path: src/roquen/fake/Vect3f.java
// public class Vect3f {
//   public float x,y,z;
//   
//   /** */
//   private static final int HASH = hashMakeSeed(0);
//   
//   @Override
//   public int hashCode()
//   {
//     return hashComplete(hashAdd(HASH,x,y,z));
//   }
//   
//   public final float dot(Vect3f v)
//   {
//     return x*v.x + y*v.y + z*v.z;
//   }
// }


// Path: src/roquen/interp/RayGrid3D.java
import roquen.fake.Vect3f;

package roquen.interp;


/**
 * For performing in-order walks of cells on a uniform 3D grid which
 * are crossed by a line segment or ray.  For more details see {@link RayGrid2D}
 */
public class RayGrid3D {
  private double cx,cy,cz;
  private double ax,ay,az;
  private int    ux,uy,uz;
  
  /** Current cell coordinate */
  public int x,y,z;


  public void set(Vect3f p0, Vect3f p1)
