code: public static double intersectRayPlane(Rayd ray, Planed plane, double epsilon) {
          return intersectRayPlane(ray.oX, ray.oY, ray.oZ, ray.dX, ray.dY, ray.dZ, plane.a, plane.b, plane.c, plane.d, epsilon);
      }
docs: Test whether the given ray intersects the given plane, and return the
  value of the parameter <i>t</i> in the ray equation <i>p(t) = origin + t * dir</i> of the intersection point.
  <p>
  This method returns <code>-1.0</code> if the ray does not intersect the plane, because it is either parallel to the plane or its direction points
  away from the plane or the ray's origin is on the <i>negative</i> side of the plane (i.e. the plane's normal points away from the ray's origin).
  <p>
  Reference: <a href="https://www.siggraph.org/education/materials/HyperGraph/raytrace/rayplane_intersection.htm">https://www.siggraph.org/</a>
  
  @param ray
  the ray
  @param plane
  the plane
  @param epsilon
  some small epsilon for when the ray is parallel to the plane
  @return the value of the parameter <i>t</i> in the ray equation <i>p(t) = origin + t * dir</i> of the intersection point, if the ray
  intersects the plane; <code>-1.0</code> otherwise