diff options
| author | Charles <sircharlesaze@gmail.com> | 2020-02-26 12:10:39 +0100 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2020-02-26 13:29:26 +0100 |
| commit | fcd239d3d5b46d72cf99a7c439a72031a0ef3a9c (patch) | |
| tree | ec4200af67ac2726803dbe2756c64a7ff7b81f88 | |
| parent | 4912a5a3c001fe69b707fdcb69efc2fb163ce107 (diff) | |
| download | fractol-fcd239d3d5b46d72cf99a7c439a72031a0ef3a9c.tar.gz fractol-fcd239d3d5b46d72cf99a7c439a72031a0ef3a9c.tar.bz2 fractol-fcd239d3d5b46d72cf99a7c439a72031a0ef3a9c.zip | |
Added supersampling
| -rw-r--r-- | Makefile | 4 | ||||
| -rw-r--r-- | include/fractol.h | 6 | ||||
| -rw-r--r-- | src/event.c | 12 | ||||
| -rw-r--r-- | src/fractals/burningship.c | 4 | ||||
| -rw-r--r-- | src/fractals/mandelbrot.c | 14 | ||||
| -rw-r--r-- | src/render.c | 59 | ||||
| -rw-r--r-- | src/state.c | 5 |
7 files changed, 68 insertions, 36 deletions
@@ -6,7 +6,7 @@ # By: cacharle <marvin@42.fr> +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2020/02/24 09:19:49 by cacharle #+# #+# # -# Updated: 2020/02/25 16:00:56 by cacharle ### ########.fr # +# Updated: 2020/02/26 11:17:06 by cacharle ### ########.fr # # # # **************************************************************************** # @@ -24,7 +24,7 @@ OBJ_DIRS = $(shell find $(SRC_DIR) -type d | sed 's/src/obj/') CC = gcc CCFLAGS = -I$(LIBFT_DIR)/include -I$(MINILIBX_DIR) -I$(INCLUDE_DIR) \ - -Wall -Wextra #-Werror + -O3 -Wall -Wextra #-Werror LDFLAGS = -L$(LIBFT_DIR) -lft \ -L$(MINILIBX_DIR) -lmlx \ -framework OpenGL -framework AppKit -lm -lpthread diff --git a/include/fractol.h b/include/fractol.h index e054086..c46e350 100644 --- a/include/fractol.h +++ b/include/fractol.h @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/24 09:28:16 by cacharle #+# #+# */ -/* Updated: 2020/02/25 18:07:42 by cacharle ### ########.fr */ +/* Updated: 2020/02/26 13:23:33 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -54,6 +54,8 @@ # define MLXK_D 2 # define MLXK_F 3 # define MLXK_S 1 +# define MLXK_E 14 +# define MLXK_R 15 # define MLXK_PLUS 24 # define MLXK_MINUS 27 @@ -119,6 +121,7 @@ typedef struct s_state t_complex c; int iterations; int offsets[WINDOW_HEIGHT]; + double samples; } t_state; typedef struct @@ -126,6 +129,7 @@ typedef struct t_state *state; int offset; t_complex z; + double step_i; } t_render_routine_arg; /* diff --git a/src/event.c b/src/event.c index b701d2f..b4ad067 100644 --- a/src/event.c +++ b/src/event.c @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/24 09:52:35 by cacharle #+# #+# */ -/* Updated: 2020/02/25 18:08:23 by cacharle ### ########.fr */ +/* Updated: 2020/02/26 13:24:24 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,7 +22,7 @@ int event_quit(t_state *state) int event_keydown(int key, t_state *state) { - printf("%d\n", key); + /* printf("%d\n", key); */ if (key == MLXK_ESC) state->running = false; else if (key == MLXK_UP || key == MLXK_K) @@ -51,6 +51,14 @@ int event_keydown(int key, t_state *state) h_zoom_out(state); else if (key == MLXK_S) state_shift_palette(state); + else if (key == MLXK_R) + state->samples += 1.0; + else if (key == MLXK_E) + { + state->samples -= 1.0; + if (state->samples < 1.0) + state->samples = 1.0; + } else return (0); state->updated = false; diff --git a/src/fractals/burningship.c b/src/fractals/burningship.c index 252da15..fb950ed 100644 --- a/src/fractals/burningship.c +++ b/src/fractals/burningship.c @@ -6,14 +6,14 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/24 16:15:49 by cacharle #+# #+# */ -/* Updated: 2020/02/25 07:33:53 by cacharle ### ########.fr */ +/* Updated: 2020/02/26 13:20:36 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ #include "fractol.h" #define BURNING_SHIP_MAX_ITERATION 20 -#define BURNING_SHIP_ESCAPE_RADIUS_SQUARED 100 +#define BURNING_SHIP_ESCAPE_RADIUS_SQUARED 4 int burningship(t_state *state, t_complex z) { diff --git a/src/fractals/mandelbrot.c b/src/fractals/mandelbrot.c index 92079d1..662ea25 100644 --- a/src/fractals/mandelbrot.c +++ b/src/fractals/mandelbrot.c @@ -6,16 +6,16 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/24 11:07:41 by cacharle #+# #+# */ -/* Updated: 2020/02/25 07:33:35 by cacharle ### ########.fr */ +/* Updated: 2020/02/26 13:12:55 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ #include "fractol.h" #define MANDEL_MAX_ITERATION 20 -#define MANDEL_ESCAPE_RADIUS_SQUARED 100 +#define MANDEL_ESCAPE_RADIUS_SQUARED 4 -int mandelbrot(t_state *state, t_complex z) +int mandelbrot(t_state *state, t_complex c) { int n; double zr; @@ -24,8 +24,8 @@ int mandelbrot(t_state *state, t_complex z) double zi_square; (void)state; - zr = z.r; - zi = z.i; + zr = c.r; + zi = c.i; n = -1; while (++n < state->iterations) { @@ -35,8 +35,8 @@ int mandelbrot(t_state *state, t_complex z) break; zi = 2.0 * zr * zi; zr = zr_square - zi_square; - zi += z.i; - zr += z.r; + zi += c.i; + zr += c.r; } return (n); } diff --git a/src/render.c b/src/render.c index a7e9f92..8ef528d 100644 --- a/src/render.c +++ b/src/render.c @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/24 09:54:59 by cacharle #+# #+# */ -/* Updated: 2020/02/25 17:28:08 by cacharle ### ########.fr */ +/* Updated: 2020/02/26 13:29:04 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,33 +14,42 @@ #define SUPERSAMPLE_SIZE 3 -static t_color st_take_sample(t_state *state, t_complex z) +static t_color st_take_sample(t_state *state, t_complex z, double step_r, double step_i) { - int u; - int v; + double u; + double v; t_complex sz; t_color color; t_color tmp; + int r; + int g; + int b; color.hexcode = 0x0; - u = -1; - while (++u < SUPERSAMPLE_SIZE) + r = 0; + g = 0; + b = 0; + u = 0.0; + while (u < state->samples) { - v = -1; - while (++v < SUPERSAMPLE_SIZE) + v = 0.0; + while (v < state->samples) { - sz.r = z.r + (double)v / 3.0; - sz.i = z.i + (double)u / 3.0; + sz.i = z.i + step_i * (u / state->samples); + sz.r = z.r + step_r * (v / state->samples); tmp = state->palette[state->func(state, sz)]; - color.rgb.r += tmp.rgb.r; - color.rgb.g += tmp.rgb.g; - color.rgb.b += tmp.rgb.b; + + r += tmp.rgb.r; + g += tmp.rgb.g; + b += tmp.rgb.b; + v += 1.0; } + u += 1.0; } - - color.rgb.r /= 9; - color.rgb.g /= 9; - color.rgb.b /= 9; + int s = (int)(state->samples * state->samples); + color.rgb.r = r / s; + color.rgb.g = g / s; + color.rgb.b = b / s; return (color); } @@ -51,6 +60,7 @@ static void *st_render_routine(void *void_arg) t_complex z; t_state *state; int offset; + double step_r; t_render_routine_arg *arg; arg = void_arg; @@ -58,11 +68,14 @@ static void *st_render_routine(void *void_arg) z = arg->z; offset = arg->offset; j = -1; + step_r = state->plane.r / (double)WINDOW_WIDTH; + z.r = state->center.r - state->plane.r / 2.0; while (++j < WINDOW_WIDTH) { - z.r = ((double)j / (double)WINDOW_WIDTH) * state->plane.r - (state->plane.r / 2.0) + state->center.r; - ((t_color*)state->window.data)[offset] = state->palette[state->func(state, z)];//st_take_sample(state, z); + ((t_color*)state->window.data)[offset] = state->samples == 1.0 ? + state->palette[state->func(state, z)] : st_take_sample(state, z, step_r, arg->step_i); offset++; + z.r += step_r; } return (NULL); } @@ -72,18 +85,24 @@ static void st_render_fractal(t_state *state) int i; pthread_t threads[WINDOW_HEIGHT]; t_render_routine_arg routine_args[WINDOW_HEIGHT]; + double step_i; + double z_i; + step_i = state->plane.i / (double)WINDOW_HEIGHT; + z_i = state->center.i - state->plane.i / 2.0; i = -1; while (++i < WINDOW_HEIGHT) { routine_args[i].state = state; routine_args[i].offset = i * WINDOW_WIDTH; - routine_args[i].z.i = ((double)i / (double)WINDOW_HEIGHT) * state->plane.i - (state->plane.i / 2.0) + state->center.i; + routine_args[i].z.i = z_i; + routine_args[i].step_i = step_i; if (pthread_create(threads + i, NULL, st_render_routine, routine_args + i) < 0) { state->running = false; break; } + z_i += step_i; } while (i-- > 0) pthread_join(threads[i], NULL); diff --git a/src/state.c b/src/state.c index 4d94075..2aafee6 100644 --- a/src/state.c +++ b/src/state.c @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/24 09:58:01 by cacharle #+# #+# */ -/* Updated: 2020/02/25 18:28:02 by cacharle ### ########.fr */ +/* Updated: 2020/02/26 13:23:18 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -93,8 +93,9 @@ int state_init(t_state *state, char *fractal_name) state->center.i = 0.0; state->plane.r = 4.0; state->plane.i = 4.0; - state->iterations = 50; + state->iterations = 10; state->palette = NULL; + state->samples = 1.0; state_update_palette(state); state->updated = false; return (0); |
