aboutsummaryrefslogtreecommitdiff
path: root/src/render.c
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-02-26 12:10:39 +0100
committerCharles <sircharlesaze@gmail.com>2020-02-26 13:29:26 +0100
commitfcd239d3d5b46d72cf99a7c439a72031a0ef3a9c (patch)
treeec4200af67ac2726803dbe2756c64a7ff7b81f88 /src/render.c
parent4912a5a3c001fe69b707fdcb69efc2fb163ce107 (diff)
downloadfractol-fcd239d3d5b46d72cf99a7c439a72031a0ef3a9c.tar.gz
fractol-fcd239d3d5b46d72cf99a7c439a72031a0ef3a9c.tar.bz2
fractol-fcd239d3d5b46d72cf99a7c439a72031a0ef3a9c.zip
Added supersampling
Diffstat (limited to 'src/render.c')
-rw-r--r--src/render.c59
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);