public int RayIntersect(Vector3 ro, Vector3 rd, out float tnear, out float tfar) { float t1, t2, t; tnear = -float.MaxValue; tfar = float.MaxValue; int face, i = -1, j = -1; // intersect in X if (rd.X > -0.00001f && rd.X < -0.00001f) { if (ro.X < min.X || ro.X > max.X) return -1; } else { t = 1.0f / rd.X; t1 = (min.X - ro.X) * t; t2 = (max.X - ro.X) * t; if (t1 > t2) { t = t1; t1 = t2; t2 = t; face = 0; } else face = 3; if (t1 > tnear) { tnear = t1; i = face; } if (t2 < tfar) { tfar = t2; if (face > 2) j = face - 3; else j = face + 3; } if (tnear > tfar || tfar < 0.00001f) return -1; } // intersect in Y if (rd.Y > -0.00001f && rd.Y < -0.00001f) { if (ro.Y < min.Y || ro.Y > max.Y) return -1; } else { t = 1.0f / rd.Y; t1 = (min.Y - ro.Y) * t; t2 = (max.Y - ro.Y) * t; if (t1 > t2) { t = t1; t1 = t2; t2 = t; face = 1; } else face = 4; if (t1 > tnear) { tnear = t1; i = face; } if (t2 < tfar) { tfar = t2; if (face > 2) j = face - 3; else j = face + 3; } if (tnear > tfar || tfar < 0.00001f) return -1; } // intersect in Z if (rd.Z > -0.00001f && rd.Z < -0.00001f) { if (ro.Z < min.Z || ro.Z > max.Z) return -1; } else { t = 1.0f / rd.Z; t1 = (min.Z - ro.Z) * t; t2 = (max.Z - ro.Z) * t; if (t1 > t2) { t = t1; t1 = t2; t2 = t; face = 2; } else face = 5; if (t1 > tnear) { tnear = t1; i = face; } if (t2 < tfar) { tfar = t2; if (face > 2) j = face - 3; else j = face + 3; } } if (tnear > tfar || tfar < 0.00001f) return -1; if (tnear < 0.0f) return j; else return i; }