Add color shift in time
authorLukas Jiriste <ljiriste@student.42prague.com>
Thu, 18 Apr 2024 09:50:33 +0000 (11:50 +0200)
committerLukas Jiriste <ljiriste@student.42prague.com>
Thu, 18 Apr 2024 09:50:33 +0000 (11:50 +0200)
For this I had to create new matrix that holds the same info as did
the image. The image is then constructed from this matrix by adding
a value that changes in time.

event_handling.c
fractol.h
main.c

index 4cbc294536b1e339ae3958b69d1b93434b6dfb75..4b9d22eca59b84b8cb91f9e0ad855c3171e6f26e 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: ljiriste <marvin@42.fr>                    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2023/12/05 19:35:01 by ljiriste          #+#    #+#             */
-/*   Updated: 2024/01/18 10:36:06 by ljiriste         ###   ########.fr       */
+/*   Updated: 2024/04/18 11:47:43 by ljiriste         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -62,10 +62,15 @@ int handle_mouse_press(int button, int x, int y, t_session *s)
  */
 int    no_event_handle(t_session *s)
 {
-       if (s && s->win && s->img.undersample > 1)
+       if (s && s->win)
        {
-               --s->img.undersample;
+               if (s->img.undersample > 1)
+               {
+                       --s->img.undersample;
+                       calculate_base(s);
+               }
                draw_fractal(s);
+               s->view.color_shift += s->view.color_shift_speed;
        }
        return (0);
 }
index 6be8bf9f8329db35f4fb0d4050640250ccdd7de8..3666c111587f2eb5cd81a671e70d3d420c0368f0 100644 (file)
--- a/fractol.h
+++ b/fractol.h
@@ -6,7 +6,7 @@
 /*   By: ljiriste <marvin@42.fr>                    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2023/11/11 18:51:29 by ljiriste          #+#    #+#             */
-/*   Updated: 2024/04/10 14:03:00 by ljiriste         ###   ########.fr       */
+/*   Updated: 2024/04/18 11:44:27 by ljiriste         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -27,6 +27,7 @@ struct s_img
        int             width;
        int             height;
        t_mat   calced;
+       t_mat   base;
        int             undersample;
        int             undersample_max;
 };
@@ -37,6 +38,8 @@ typedef double (*t_fractal)();
 struct s_view
 {
        t_fractal       fractal;
+       double          color_shift;
+       double          color_shift_speed;
        t_color         (*palette)(double);
        t_vect2         window_coord;
        t_vect2         pixel_size;
@@ -78,6 +81,7 @@ int   handle_key_press(int keycode, t_session *s);
 int    handle_mouse_press(int button, int x, int y, t_session *s);
 int    no_event_handle(t_session *s);
 void   process_pixel_group(t_session *s, int x, int y);
+void   calculate_base(t_session *s);
 void   draw_fractal(t_session *s);
 void   change_zoom(t_session *s, t_vect2 invariant, double d_zoom);
 void   move_view(t_session *s, float move_amount_right, float move_amount_up);
diff --git a/main.c b/main.c
index 9f5071e6602e3a64ecb3528694d3ff204d694f50..0b9c8c883ca89faaf40b01a8cf4da031a439d2f3 100644 (file)
--- a/main.c
+++ b/main.c
@@ -6,7 +6,7 @@
 /*   By: ljiriste <marvin@42.fr>                    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2023/10/27 14:29:26 by ljiriste          #+#    #+#             */
-/*   Updated: 2024/04/18 09:54:31 by ljiriste         ###   ########.fr       */
+/*   Updated: 2024/04/18 11:49:18 by ljiriste         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -38,30 +38,18 @@ void        free_session(t_session *s)
        return ;
 }
 
-t_color        get_color(t_session *s, int x, int y)
+void   process_pixel_group(t_session *s, int x, int y)
 {
-       double  palette_param;
+       int             i;
+       int             j;
+       double  param;
 
        if (!*(bool *)ft_mat_access(&s->img.calced, y, x))
-       {
-               palette_param = s->view.fractal(&s->set,
+               param = s->view.fractal(&s->set,
                                s->view.window_coord.x + s->view.pixel_size.x * x,
                                s->view.window_coord.y - s->view.pixel_size.y * y);
-               return (s->view.palette(palette_param));
-       }
        else
-       {
-               return (get_img_pixel_color(&s->img, x, y));
-       }
-}
-
-void   process_pixel_group(t_session *s, int x, int y)
-{
-       int     i;
-       int     j;
-       t_color color;
-
-       color = get_color(s, x, y);
+               param = *(double *)ft_mat_access(&s->img.base, y, x);
        i = 0;
        while (i < s->img.undersample && x + i < s->img.width)
        {
@@ -69,7 +57,7 @@ void  process_pixel_group(t_session *s, int x, int y)
                while (j < s->img.undersample && y + j < s->img.height)
                {
                        if (!*(bool *)ft_mat_access(&s->img.calced, y + j, x + i))
-                               ft_putpx_img(&s->img, x + i, y + j, color);
+                               *(double *)ft_mat_access(&s->img.base, y + j, x + i) = param;
                        ++j;
                }
                ++i;
@@ -78,7 +66,7 @@ void  process_pixel_group(t_session *s, int x, int y)
        return ;
 }
 
-void   draw_fractal(t_session *s)
+void   calculate_base(t_session *s)
 {
        int             x;
        int             y;
@@ -94,7 +82,30 @@ void draw_fractal(t_session *s)
                }
                x += s->img.undersample;
        }
+}
+
+void   draw_fractal(t_session *s)
+{
+       int     x;
+       int     y;
+       double  param;
+
+       x = 0;
+       while (x < s->img.width)
+       {
+               y = 0;
+               while (y < s->img.height)
+               {
+                       param = *(double *)ft_mat_access(&s->img.base, y, x);
+                       if (param >= 0)
+                               param = fmod(param + s->view.color_shift, 1.);
+                       ft_putpx_img(&s->img, x, y, s->view.palette(param));
+                       ++y;
+               }
+               ++x;
+       }
        mlx_put_image_to_window(s->mlx, s->win, s->img.img, 0, 0);
+       return ;
 }
 
 void   erase_calced(t_mat *calced)
@@ -131,7 +142,6 @@ void        move_img(t_img *img, int delta_x, int delta_y)
 {
        int             x;
        int             y;
-       t_color color;
 
        x = 0;
        if (delta_x < 0)
@@ -146,8 +156,8 @@ void        move_img(t_img *img, int delta_x, int delta_y)
                        if (0 <= x - delta_x && x - delta_x < img->width &&
                                        0 <= y - delta_y && y - delta_y < img->height)
                        {
-                               color = get_img_pixel_color(img, x, y);
-                               ft_putpx_img(img, x - delta_x, y - delta_y, color);
+                               *(double *)ft_mat_access(&img->base, y - delta_y, x - delta_x)
+                                       = *(double *)ft_mat_access(&img->base, y, x);
                                *(bool *)ft_mat_access(&img->calced, y - delta_y, x - delta_x) =
                                *(bool *)ft_mat_access(&img->calced, y, x);
                        }
@@ -180,28 +190,6 @@ void       move_view(t_session *s, float move_amount_right, float move_amount_up)
        return ;
 }
 
-// Something like this function should be added to Libft
-// with maybe additional argument (void *) of the filler
-t_arr_stat     construct_mat(t_mat *mat, size_t rows, size_t cols)
-{
-       t_vec           filler_vec;
-       bool            filler;
-       size_t          i;
-       t_arr_stat      res;
-
-       filler = false;
-       ft_vec_init(&filler_vec, sizeof(bool));
-       i = 0;
-       while (i < cols)
-       {
-               ft_vec_append(&filler_vec, &filler);
-               ++i;
-       }
-       res = ft_mat_insert_row(mat, &filler_vec, rows - 1);
-       ft_vec_free(&filler_vec, NULL);
-       return (res);
-}
-
 void   init_session(t_session *s)
 {
        s->mlx = mlx_init();
@@ -209,7 +197,9 @@ void        init_session(t_session *s)
        s->img.img = mlx_new_image(s->mlx, s->img.width, s->img.height);
        s->img.addr = mlx_get_data_addr(s->img.img, &s->img.bpp, &s->img.bpl, &s->img.endian);
        ft_mat_init(&s->img.calced, sizeof(bool));
-       construct_mat(&s->img.calced, s->img.height, s->img.width);
+       ft_mat_init(&s->img.base, sizeof(double));
+       ft_mat_zeros(&s->img.calced, s->img.height, s->img.width);
+       ft_mat_zeros(&s->img.base, s->img.height, s->img.width);
        s->img.undersample = s->img.undersample_max;
 }
 
@@ -219,6 +209,8 @@ static void init_view(t_session *s)
        s->view.palette = tri_color;
        s->view.pixel_size.x = 0.01;
        s->view.pixel_size.y = 0.01;
+       s->view.color_shift = 0.7;
+       s->view.color_shift_speed = 0.01;
        s->view.window_coord.x = -s->img.width / 2 * s->view.pixel_size.x;
        s->view.window_coord.y = s->img.height / 2 * s->view.pixel_size.y;
        return ;
@@ -281,8 +273,10 @@ void       print_help(void)
 void   cleanup(t_session *s)
 {
        ft_mat_free(&s->img.calced, NULL);
+       ft_mat_free(&s->img.base, NULL);
        mlx_destroy_image(s->mlx, s->img.img);
        free_session(s);
+       return ;
 }
 
 int    main(int argc, char **argv)