From f5c9e75762a96d588db22b3942e7e74b24e174aa Mon Sep 17 00:00:00 2001 From: Lukas Jiriste Date: Thu, 18 Apr 2024 11:50:33 +0200 Subject: [PATCH] Add color shift in time 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 | 11 ++++-- fractol.h | 6 +++- main.c | 88 ++++++++++++++++++++++-------------------------- 3 files changed, 54 insertions(+), 51 deletions(-) diff --git a/event_handling.c b/event_handling.c index 4cbc294..4b9d22e 100644 --- a/event_handling.c +++ b/event_handling.c @@ -6,7 +6,7 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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); } diff --git a/fractol.h b/fractol.h index 6be8bf9..3666c11 100644 --- a/fractol.h +++ b/fractol.h @@ -6,7 +6,7 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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 9f5071e..0b9c8c8 100644 --- a/main.c +++ b/main.c @@ -6,7 +6,7 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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) -- 2.30.2