aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile4
-rw-r--r--include/fractol.h6
-rw-r--r--src/event.c12
-rw-r--r--src/fractals/burningship.c4
-rw-r--r--src/fractals/mandelbrot.c14
-rw-r--r--src/render.c59
-rw-r--r--src/state.c5
7 files changed, 68 insertions, 36 deletions
diff --git a/Makefile b/Makefile
index 76c19f1..eb45987 100644
--- a/Makefile
+++ b/Makefile
@@ -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);