public void ColorWhenRayHits() { var w = World.Default(); var r = new Ray(new Point(0, 0, -5), new Vector(0, 0, 1)); var c = PhongShading.ColorAt(w, r); c.Should().Be(new Color(0.38066f, 0.47583f, 0.2855f)); }
public void ColorWhenRayMissesIsBlack() { var w = World.Default(); var r = new Ray(new Point(0, 0, -5), new Vector(0, 1, 0)); var c = PhongShading.ColorAt(w, r); c.Should().Be(new Color(0, 0, 0)); }
public void ColorWithIntersectionBehind() { var w = World.Default(); w.Objects[0].Material.Ambient = 1f; w.Objects[1].Material.Ambient = 1f; var r = new Ray(new Point(0, 0, 0.75f), new Vector(0, 0, -1)); var c = PhongShading.ColorAt(w, r); c.Should().Be(w.Objects[1].Material.Texture.LocalColorAt(Point.Zero)); }
public void HandleParallelReflectiveSurfaces() { var w = new World(); w.SetLights(new PointLight(new Point(0, 0, 0), Colors.White)); var lower = new Plane { Material = { Reflective = 1f } }; lower.SetTransform(Transform.Translate(0, -1, 0)); var upper = new Plane { Material = { Reflective = 1f } }; upper.SetTransform(Transform.Translate(0, 1, 0)); w.SetObjects(lower, upper); var r = new Ray(new Point(0, 0, 0), new Vector(0, 1, 0)); // Test to ensure an infinite loop is not hit. PhongShading.ColorAt(w, r).Should().NotBe(new Color(1, 0, 0)); }