예제 #1
0
파일: CSG.cs 프로젝트: rogebrya/RayTracer2
 public override Tuple LocalNormalAt(Tuple localPoint, Intersection hit)
 {
     return(null);
 }
예제 #2
0
 public override Tuple LocalNormalAt(Tuple localPoint, Intersection hit)
 {
     return(Tuple.Vector(localPoint.X, 0, localPoint.Z));
 }
예제 #3
0
        public static Computations PrepareComputations(Intersection i, Ray r, List <Intersection> xs = null)
        {
            if (xs is null)
            {
                xs = new List <Intersection>();
                xs.Add(i);
            }
            Computations comps = new Computations();

            comps.t       = i.T;
            comps.shape   = i.S;
            comps.point   = r.Position(comps.t);
            comps.eyev    = -r.Direction;
            comps.normalv = comps.shape.NormalAt(comps.point, i);
            if (Tuple.Dot(comps.normalv, comps.eyev) < 0)
            {
                comps.inside  = true;
                comps.normalv = -comps.normalv;
            }
            else
            {
                comps.inside = false;
            }
            comps.reflectv   = Tuple.Reflect(r.Direction, comps.normalv);
            comps.overPoint  = comps.point + comps.normalv * Globals.EPSILON;
            comps.underPoint = comps.point - comps.normalv * Globals.EPSILON;

            List <Shape> containers = new List <Shape>();

            foreach (Intersection j in xs)
            {
                if (Globals.EqualityOfDouble(j.T, i.T) && j.S == i.S)
                {
                    if (containers.Count == 0)
                    {
                        comps.n1 = 1.0;
                    }
                    else
                    {
                        comps.n1 = containers[containers.Count - 1].Material.RefractiveIndex;
                    }
                }
                if (containers.Contains(j.S))
                {
                    containers.Remove(j.S);
                }
                else
                {
                    containers.Add(j.S);
                }
                if (Globals.EqualityOfDouble(j.T, i.T) && j.S == i.S)
                {
                    if (containers.Count == 0)
                    {
                        comps.n2 = 1.0;
                    }
                    else
                    {
                        comps.n2 = containers[containers.Count - 1].Material.RefractiveIndex;
                    }
                    break;
                }
            }
            return(comps);
        }
예제 #4
0
 public static void Intersections(List <Intersection> iList, Intersection i)
 {
     iList.Add(i);
 }
예제 #5
0
 public override Tuple LocalNormalAt(Tuple localPoint, Intersection hit)
 {
     return(localPoint - Tuple.Point(0, 0, 0));
 }