public virtual bool RayIntersection(Ray r, out float t, out Point3D normal) { t = 0; normal = null; Side best_side = null; foreach (Side s in sides) { switch (s.points.Count) { case 3: if (r.IntersectTriangle(s.get_point(0), s.get_point(1), s.get_point(2), out float t1) && (t == 0 || t1 < t)) { t = t1; best_side = s; } break; case 4: if (r.IntersectTriangle(s.get_point(0), s.get_point(1), s.get_point(3), out float t2) && (t == 0 || t2 < t)) { t = t2; best_side = s; } else if (r.IntersectTriangle(s.get_point(3), s.get_point(1), s.get_point(2), out t2) && (t == 0 || t2 < t)) { t = t2; best_side = s; } break; default: break; } } if (best_side != null) { normal = Side.norm(best_side); mat.SetColor(best_side.drawing_pen.Color); return(true); } return(false); }