コード例 #1
0
        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));
        }