public static Computations Prepare(Intersection hit, Ray ray, List <Intersection> xs) { float n1 = 0; float n2 = 0; var containers = new List <IShape>(); foreach (var i in xs) { if (i == hit) { n1 = !containers.Any() ? 1 : containers.Last().Material.RefractiveIndex; } if (containers.Contains(i.Shape)) { containers.Remove(i.Shape); } else { containers.Add(i.Shape); } if (i == hit) { n2 = !containers.Any() ? 1 : containers.Last().Material.RefractiveIndex; break; } } var point = ray.ComputePosition(hit.T); return(new Computations(hit.T, hit.Shape, point, -ray.Direction, hit.Shape.GetNormalAt(point), n1, n2)); }