public static Scene Lighting1()
        {
            Scene scene = new Scene(new Color(255, 255, 255));

            Light      sun        = new LightDirectional(new Color(255, 255, 255), new Vector3(1, -1, 1), scene);
            LightGroup lightGroup = new LightGroup();

            lightGroup.addLight(sun);

            SurfaceMaterial diffuseRed   = new SurfaceDiffuse(new Color(255, 50, 50), lightGroup);
            SurfaceMaterial diffuseGreen = new SurfaceDiffuse(new Color(50, 255, 50), lightGroup);
            SurfaceMaterial diffuseBlue  = new SurfaceDiffuse(new Color(50, 50, 255), lightGroup);
            SurfaceMaterial diffuseWhite = new SurfaceDiffuse(new Color(255, 255, 255), lightGroup);

            SurfaceMaterial specular = new SurfaceSpecular(new Color(100, 100, 100), 50, lightGroup);

            SurfaceMaterial red   = new SurfaceMaterialSum(specular, diffuseRed);
            SurfaceMaterial blue  = new SurfaceMaterialSum(specular, diffuseBlue);
            SurfaceMaterial green = new SurfaceMaterialSum(specular, diffuseGreen);
            SurfaceMaterial white = new SurfaceMaterialSum(specular, diffuseWhite);

            scene.addSurface(new Surface(new SurfacePlane(-25 * Vector3.Up, Vector3.Forward, Vector3.Right), white));
            scene.addSurface(new Surface(new SurfaceSphere(new Vector3(-40, 0, 80), 10), red));
            scene.addSurface(new Surface(new SurfaceSphere(new Vector3(0, 0, 80), 10), green));
            scene.addSurface(new Surface(new SurfaceSphere(new Vector3(40, 0, 80), 10), blue));

            return(scene);
        }
        public static Scene Boolean(bool outlines)
        {
            Scene scene = new Scene(new Color(255, 255, 255));

            Light      sun        = new LightDirectional(new Color(255, 255, 255), new Vector3(0, -1, 1), scene, false);
            LightGroup lightGroup = new LightGroup();

            lightGroup.addLight(sun);

            Vector3 center1 = new Vector3(-12, 0, 30);
            Vector3 center2 = new Vector3(-6, 0, 30);
            Vector3 center3 = new Vector3(9, 0, 30);
            Vector3 center4 = new Vector3(9, 1, 27);
            double  radius  = 5;
            double  radius2 = 3;

            SurfaceGeometry surfaceIntersection = new SurfaceIntersection(new VolumeSphere(center1, radius), new VolumeSphere(center2, radius));
            SurfaceGeometry surfaceDifference   = new SurfaceDifference(new VolumeSphere(center3, radius), new VolumeSphere(center4, radius2));

            SurfaceMaterial diffuse    = new SurfaceDiffuse(new Color(255, 255, 255), lightGroup);
            SurfaceMaterial semiopaque = new SurfaceMaterialBlend(new SurfaceTransparent(scene), diffuse, 0.2);

            scene.addSurface(new Surface(surfaceIntersection, diffuse));
            scene.addSurface(new Surface(surfaceDifference, diffuse));
            if (outlines)
            {
                scene.addSurface(new Surface(new SurfaceSphere(center1, radius), semiopaque));
                scene.addSurface(new Surface(new SurfaceSphere(center2, radius), semiopaque));
                scene.addSurface(new Surface(new SurfaceSphere(center3, radius), semiopaque));
                scene.addSurface(new Surface(new SurfaceSphere(center4, radius2), semiopaque));
            }

            return(scene);
        }
        public static Scene Lighting2()
        {
            Scene      scene      = new Scene(new Color(255, 255, 255));
            Light      lightRed   = new LightDirectional(new Color(255, 0, 0), new Vector3(1, -3, 0), scene, true);
            Light      lightGreen = new LightDirectional(new Color(0, 255, 0), new Vector3(-1, -3, 0), scene, true);
            Light      lightBlue  = new LightDirectional(new Color(0, 0, 255), new Vector3(0, -3, 1), scene, true);
            LightGroup lightGroup = new LightGroup();

            lightGroup.addLight(lightRed);
            lightGroup.addLight(lightGreen);
            lightGroup.addLight(lightBlue);

            SurfaceMaterial diffuseWhite = new SurfaceDiffuse(new Color(255, 255, 255), lightGroup);
            SurfaceMaterial specular     = new SurfaceSpecular(new Color(100, 100, 100), 50, lightGroup);
            SurfaceMaterial material     = new SurfaceMaterialSum(specular, diffuseWhite);

            scene.addSurface(new Surface(new SurfacePlane(-25 * Vector3.Up, Vector3.Forward, Vector3.Right), diffuseWhite));
            scene.addSurface(new Surface(new SurfaceSphere(new Vector3(0, 0, 80), 10), material));

            return(scene);
        }
        public static Scene Mesh()
        {
            Scene scene = new Scene(new Color(200, 200, 255));

            Mesh mesh = OBJ.ParseFile(@"..\..\monkey.obj");

            LightGroup lightGroup = new LightGroup();

            lightGroup.addLight(new LightDirectional(new Color(255, 255, 255), new Vector3(0.2, -0.2, 1), scene));

            SurfaceGeometry geometry = new SurfaceMesh(mesh, Vector3.Forward * 10, new Vector3(0, Math.PI, 0), SurfaceMesh.NormalMode.PER_VERTEX);

            SurfaceMaterial diffuse  = new SurfaceDiffuse(new Color(200, 212, 180), lightGroup);
            SurfaceMaterial specular = new SurfaceSpecular(new Color(255, 255, 255), 150, lightGroup);
            SurfaceMaterial material = new SurfaceMaterialSum(diffuse, specular);

            Surface monkey = new Surface(geometry, material);
            //We enclose the monkey in a bounding sphere, which speeds up the rendering over 7 times
            Surface boundedMonkey = new Surface(new SurfaceBoundingVolume(new SurfaceSphere(Vector3.Forward * 10, 2.5), monkey), null);

            scene.addSurface(boundedMonkey);

            return(scene);
        }