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 /src/render.c | |
| parent | 4912a5a3c001fe69b707fdcb69efc2fb163ce107 (diff) | |
| download | fractol-fcd239d3d5b46d72cf99a7c439a72031a0ef3a9c.tar.gz fractol-fcd239d3d5b46d72cf99a7c439a72031a0ef3a9c.tar.bz2 fractol-fcd239d3d5b46d72cf99a7c439a72031a0ef3a9c.zip | |
Added supersampling
Diffstat (limited to 'src/render.c')
| -rw-r--r-- | src/render.c | 59 |
1 files changed, 39 insertions, 20 deletions
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); |
