public override Tuple LocalNormalAt(Tuple localPoint, Intersection hit) { return(null); }
public override Tuple LocalNormalAt(Tuple localPoint, Intersection hit) { return(Tuple.Vector(localPoint.X, 0, localPoint.Z)); }
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); }
public static void Intersections(List <Intersection> iList, Intersection i) { iList.Add(i); }
public override Tuple LocalNormalAt(Tuple localPoint, Intersection hit) { return(localPoint - Tuple.Point(0, 0, 0)); }