Example #1
0
    private static int get_closest_sphere(scene_class scene, double[] position, ref double[] vector, int exclude)
    {
        int    output_sphere = -1;
        double t_previous    = double.MaxValue;
        double t             = 0;

        for (int i = 0; i < scene.sphere.Count; i++)
        {
            if (i != exclude)
            {
                t = intersection_ray_sphere(position, vector, scene.sphere[i]);

                if (t < t_previous)
                {
                    t_previous = t;

                    output_sphere = i;
                }
            }
        }

        if (t_previous < double.MaxValue)
        {
            vector = vector_class.vector_scale(vector, t_previous);
        }

        return(output_sphere);
    }
Example #2
0
    private static double[] sample_image(scene_class scene, System.Random random, int length, System.ComponentModel.BackgroundWorker background_worker)
    {
        double[] output_image = new double[length];
        double[] pixel_color  = new double[3];
        int      i            = 0;

        if (background_worker.CancellationPending)
        {
            return(output_image);
        }

        for (int y = 0; y < scene.image_height; y++)
        {
            for (int x = 0; x < scene.image_width; x++)
            {
                pixel_color = renderer_class.sample_pixel(scene,
                                                          x,
                                                          y,
                                                          random,
                                                          background_worker);

                for (int n = 0; n < 3; n++)
                {
                    output_image[i + n] = pixel_color[2 - n];
                }

                i += 3;
            }

            i += scene.image_width % 4;
        }

        return(output_image);
    }
Example #3
0
    public renderer_class()
    {
        scene = new scene_class();

        output_image_bitmap_data = new System.Drawing.Imaging.BitmapData();
        output_image_pointer     = (System.IntPtr) 0;
        output_image_data_byte   = new byte[0];
        output_image_data_double = new double[0];
        lock_object = new object();
    }
Example #4
0
    private static double[] sample_pixel(scene_class scene, int x, int y, System.Random random, System.ComponentModel.BackgroundWorker background_worker)
    {
        double[] output_pixel = new double[3];

        double[] position = new double[3];
        double[] vector   = new double[3];

        position = scene.camera.position;
        vector   = scene.camera.get_vector(scene, x, y);

        output_pixel = get_total_radiance(scene, x, y, random, position, vector);

        return(output_pixel);

        /*
         * double[][] output_pixel = new double[5][];
         * double[] teh_uber_output_pixel = new double[3];
         * for (int i = 0; i < output_pixel.GetLength (0); i++)
         * {
         *  output_pixel[i] = new double[3];
         * }
         *
         *
         * double[] position = new double[3];
         * double[] vector = new double[3];
         *
         * for (int i = 0; i < output_pixel.GetLength (0); i++)
         * {
         *  position = scene.camera.position;
         *  vector = scene.camera.get_vector (scene, x, y);
         *
         *  output_pixel[i] = get_total_radiance (scene, x, y, random, position, vector);
         * }
         *
         * teh_uber_output_pixel = output_pixel[0];
         * for (int i = 1; i < output_pixel.GetLength (0); i++)
         * {
         *  teh_uber_output_pixel = vector_class.vector_average (teh_uber_output_pixel, output_pixel[i], 1 / ((double)i + 1));
         * }
         *
         * return teh_uber_output_pixel;
         */
    }
Example #5
0
    public double[] get_vector(scene_class scene, int x_pixel, int y_pixel)
    {
        x = (double)x_pixel + random.NextDouble();
        y = (double)y_pixel + random.NextDouble();

        angle_x = (((x - image_width_half)) / image_width_half) * (scene.camera.view_angle_width * pi_180_half);
        angle_y = (((image_height_half - y)) / image_height_half) * (scene.camera.view_angle_height * pi_180_half);

        cos_angle_y = System.Math.Cos(angle_y);

        v_scalar = System.Math.Sin(angle_y);
        u_scalar = System.Math.Sin(angle_x) * cos_angle_y;
        w_scalar = System.Math.Cos(angle_x) * cos_angle_y;

        output_vector = vector_class.vector_add(vector_class.vector_add(vector_class.vector_scale(vector_u, u_scalar),
                                                                        vector_class.vector_scale(vector_v, v_scalar)),
                                                vector_class.vector_scale(vector_look, w_scalar));

        return(output_vector);
    }
Example #6
0
    private static int get_closest_triangle(scene_class scene, double[] position, ref double[] vector, int exclude)
    {
        int    output_triangle = -1;
        double t_previous      = double.MaxValue;
        double t = 0;

        for (int i = 0; i < scene.triangle.Count; i++)
        {
            if (i != exclude)
            {
                t = intersection_ray_triangle(position, vector, scene.triangle[i]);
                if (t > 0)
                {
                    t = double.PositiveInfinity;
                }
                else
                {
                    t = -t;
                }

                if (t < t_previous)
                {
                    t_previous = t;

                    output_triangle = i;
                }
            }
        }

        if (t_previous < double.MaxValue)
        {
            vector = vector_class.vector_scale(vector, t_previous);
        }

        return(output_triangle);
    }
Example #7
0
    private static double[] get_total_radiance(scene_class scene, int x, int y, System.Random random, double[] position, double[] vector)
    {
        double[] total_color_radiance = new double[3];
        double[] vector_t             = new double[3];
        double[] vector_s             = new double[3];
        double[] multiplier           = new double[3];
        for (int i = 0; i < 3; i++)
        {
            multiplier[i] = 1;
        }
        double medium_refractive_index = 1.0008;
        int    triangle_hit            = -1;
        int    sphere_hit = -1;

        for (int i = 0; i < scene.ray_depth; i++)
        {
            vector_t = vector;
            vector_s = vector;

            triangle_hit = get_closest_triangle(scene, position, ref vector_t, triangle_hit);
            sphere_hit   = get_closest_sphere(scene, position, ref vector_s, sphere_hit);

            if (vector_s != vector &&
                (vector_t == vector ||
                 vector_class.vector_is_larger(vector_t, vector_s)))
            {
                vector       = vector_s;
                triangle_hit = -1;

                if (sphere_hit != -1)
                {
                    for (int n = 0; n < 3; n++)
                    {
                        total_color_radiance[n] += scene.material[scene.sphere[sphere_hit].material_index - 1].color[n].radiance;
                    }

                    if (i != scene.ray_depth - 1)
                    {
                        position = vector_class.vector_add(position, vector_class.vector_scale(vector, 1 - 0.000000001));
                        vector   = scene.material[scene.sphere[sphere_hit].material_index - 1].get_next_direction_sphere(position, vector, scene.sphere[sphere_hit], ref medium_refractive_index, ref multiplier);
                    }
                }
                else
                {
                    for (int n = 0; n < 3; n++)
                    {
                        total_color_radiance[n] += scene.sky_radiance[n];
                    }

                    break;
                }
            }
            else
            {
                vector     = vector_t;
                sphere_hit = -1;

                if (triangle_hit != -1)
                {
                    for (int n = 0; n < 3; n++)
                    {
                        total_color_radiance[n] += scene.material[scene.triangle[triangle_hit].material_index - 1].color[n].radiance;
                    }

                    if (i != scene.ray_depth - 1)
                    {
                        position = vector_class.vector_add(position, vector_class.vector_scale(vector, 1 - 0.000000001));
                        vector   = scene.material[scene.triangle[triangle_hit].material_index - 1].get_next_direction_triangle(vector, scene.triangle[triangle_hit], ref medium_refractive_index, ref multiplier);
                    }
                }
                else
                {
                    for (int n = 0; n < 3; n++)
                    {
                        total_color_radiance[n] += scene.sky_radiance[n];
                    }

                    break;
                }
            }
        }


        for (int i = 0; i < 3; i++)
        {
            total_color_radiance[i] *= multiplier[i];
        }

        return(total_color_radiance);
    }