boolean intersect(PickInfo pickInfo, PickShape pickShape, int flags, ArrayList geometryList) {

    Transform3D localToVworld = pickInfo.getLocalToVWorldRef();

    Transform3D t3d = new Transform3D();
    t3d.invert(localToVworld);
    PickShape newPS = pickShape.transform(t3d);

    int geomListSize = geometryList.size();
    GeometryRetained geometry;

    if (((flags & PickInfo.CLOSEST_INTERSECTION_POINT) == 0)
        && ((flags & PickInfo.CLOSEST_DISTANCE) == 0)
        && ((flags & PickInfo.CLOSEST_GEOM_INFO) == 0)
        && ((flags & PickInfo.ALL_GEOM_INFO) == 0)) {

      for (int i = 0; i < geomListSize; i++) {
        geometry = (GeometryRetained) geometryList.get(i);
        if (geometry != null) {
          if (geometry.mirrorGeometry != null) {
            geometry = geometry.mirrorGeometry;
          }
          // Need to modify this method
          // if (geometry.intersect(newPS, null, null)) {
          if (geometry.intersect(newPS, null, 0, null, null, 0)) {
            return true;
          }
        }
      }
    } else {
      double distance;
      double minDist = Double.POSITIVE_INFINITY;
      Point3d closestIPnt = new Point3d();
      Point3d iPnt = new Point3d();
      Point3d iPntVW = new Point3d();

      for (int i = 0; i < geomListSize; i++) {
        geometry = (GeometryRetained) geometryList.get(i);
        if (geometry != null) {
          if (geometry.mirrorGeometry != null) {
            geometry = geometry.mirrorGeometry;
          }
          if (geometry.intersect(newPS, pickInfo, flags, iPnt, geometry, i)) {

            iPntVW.set(iPnt);
            localToVworld.transform(iPntVW);
            distance = pickShape.distance(iPntVW);

            if (minDist > distance) {
              minDist = distance;
              closestIPnt.set(iPnt);
            }
          }
        }
      }

      if (minDist < Double.POSITIVE_INFINITY) {
        if ((flags & PickInfo.CLOSEST_DISTANCE) != 0) {
          pickInfo.setClosestDistance(minDist);
        }
        if ((flags & PickInfo.CLOSEST_INTERSECTION_POINT) != 0) {
          pickInfo.setClosestIntersectionPoint(closestIPnt);
        }
        return true;
      }
    }

    return false;
  }