Exemplo n.º 1
0
        public static Color ShadeHit(World w, Computation comps, int remaining = 5)
        {
            var surface = Color.Black;

            foreach (var Light in w.Lights)
            {
                var shadowed = Light.IsShadowed(w, comps.OverPoint);
                surface += Light.Lighting(
                    comps.Object.Material,
                    comps.Object,
                    Light,
                    comps.Point,
                    comps.EyeV,
                    comps.NormalV,
                    shadowed);
            }

            var reflected = w.ReflectedColor(comps, remaining);
            var refracted = w.RefractedColor(comps, remaining);

            var material = comps.Object.Material;

            if (material.Reflective > 0 && material.Transparency > 0)
            {
                var reflectance = comps.Schlick();
                return(surface
                       + reflected * reflectance
                       + refracted * (1 - reflectance));
            }
            else
            {
                return(surface + reflected + refracted);
            }
        }
Exemplo n.º 2
0
        public void LightingWithPatternApplied()
        {
            var m = new RTF.Material
            {
                Pattern  = Pattern.GetStripePattern(RTF.Color.White, RTF.Color.Black),
                Ambient  = 1,
                Diffuse  = 0,
                Specular = 0
            };
            var eyev    = pt.Vector(0, 0, -1);
            var normalv = pt.Vector(0, 0, -1);
            var light   = new RTF.Light(pt.Point(0, 0, -10), RTF.Color.White);

            var c1 = light.Lighting(m, new shapes.Sphere(), pt.Point(0.9, 0, 0), eyev, normalv, false);
            var c2 = light.Lighting(m, new shapes.Sphere(), pt.Point(1.1, 0, 0), eyev, normalv, false);

            Assert.Equal(RTF.Color.White, c1);
            Assert.Equal(RTF.Color.Black, c2);
        }
Exemplo n.º 3
0
        public void LightingWithEyeBehindSurface()
        {
            var m        = new RTF.Material();
            var position = pt.Point(0, 0, 0);

            var eyeVector    = pt.Vector(0, 0, -1);
            var normalVector = pt.Vector(0, 0, -1);

            var light = new RTF.Light
                            (pt.Point(0, 0, 10), new RTF.Color(1, 1, 1));
            var result = light.Lighting(m, new Sphere(), position, eyeVector, normalVector, false);

            Assert.Equal(new RTF.Color(0.1, 0.1, 0.1), result);
        }
Exemplo n.º 4
0
        public void LightingWithEyePathReflection()
        {
            var m        = new RTF.Material();
            var position = pt.Point(0, 0, 0);

            var eyeVector    = pt.Vector(0, -Math.Sqrt(2) / 2, -Math.Sqrt(2) / 2);
            var normalVector = pt.Vector(0, 0, -1);

            var light = new RTF.Light
                            (pt.Point(0, 10, -10), new RTF.Color(1, 1, 1));
            var result = light.Lighting(m, new Sphere(), position, eyeVector, normalVector, false);

            CustomAssert.Equal(new RTF.Color(1.6364, 1.6364, 1.6364), result, 4);
        }
Exemplo n.º 5
0
        public void LightingWithEyeOppositeSurfaceOffset45()
        {
            var m        = new RTF.Material();
            var position = pt.Point(0, 0, 0);

            var eyeVector    = pt.Vector(0, 0, -1);
            var normalVector = pt.Vector(0, 0, -1);

            var light = new RTF.Light
                            (pt.Point(0, 10, -10), new RTF.Color(1, 1, 1));
            var result = light.Lighting(m, new Sphere(), position, eyeVector, normalVector, false);

            CustomAssert.Equal(new RTF.Color(0.7364, 0.7364, 0.7364), result, 4);
        }
Exemplo n.º 6
0
        public void LightingWithEyeBetweenLightSurfaceOffset45()
        {
            var m        = new RTF.Material();
            var position = pt.Point(0, 0, 0);

            var eyeVector    = pt.Vector(0, Math.Sqrt(2) / 2, -Math.Sqrt(2) / 2);
            var normalVector = pt.Vector(0, 0, -1);

            var light = new RTF.Light
                            (pt.Point(0, 0, -10), new RTF.Color(1, 1, 1));
            var result = light.Lighting(m, new Sphere(), position, eyeVector, normalVector, false);

            Assert.Equal(new RTF.Color(1, 1, 1), result);
        }
Exemplo n.º 7
0
        public void LightingSurfaceShadow()
        {
            var m        = new RTF.Material();
            var position = p.Point(0, 0, 0);

            var eyeV     = p.Vector(0, 0, -1);
            var normalV  = p.Vector(0, 0, -1);
            var light    = new RTF.Light(p.Point(0, 0, -10), RTF.Color.White);
            var inShadow = true;


            var result   = light.Lighting(m, new Sphere(), position, eyeV, normalV, inShadow);
            var expected = new RTF.Color(0.1, 0.1, 0.1);

            Assert.Equal(expected, result);
        }