From 324929acdd893d3bbc50df31fe722167ef9b56b7 Mon Sep 17 00:00:00 2001 From: djonker Date: Thu, 26 Oct 2023 10:45:19 +0200 Subject: [PATCH] cleared out the fractal stuff --- Makefile | 13 +---- cub3d | Bin 0 -> 132456 bytes cub3d.h | 73 ++---------------------- src/colors.c | 135 ------------------------------------------- src/error.c | 41 ------------- src/fractal.c | 129 ----------------------------------------- src/fractals1.c | 124 ---------------------------------------- src/fractals2.c | 113 ------------------------------------ src/keyhooks.c | 146 ----------------------------------------------- src/main.c | 103 +++++---------------------------- src/mousehooks.c | 44 -------------- src/print.c | 124 ---------------------------------------- src/zoommove.c | 131 ------------------------------------------ 13 files changed, 21 insertions(+), 1155 deletions(-) create mode 100755 cub3d delete mode 100644 src/colors.c delete mode 100644 src/error.c delete mode 100644 src/fractal.c delete mode 100644 src/fractals1.c delete mode 100644 src/fractals2.c delete mode 100644 src/keyhooks.c delete mode 100644 src/mousehooks.c delete mode 100644 src/print.c delete mode 100644 src/zoommove.c diff --git a/Makefile b/Makefile index 45ac9df..cf5fb11 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: djonker // \ \ __| | | \ \/ / # # (| | )|_| |_| |> < # # Created: 2022/11/24 10:12:10 by djonker /'\_ _/`\__|\__,_/_/\_\ # -# Updated: 2023/10/25 14:06:02 by djonker ######## odam.nl # +# Updated: 2023/10/26 10:43:49 by houtworm ######## odam.nl # # # # **************************************************************************** # @@ -17,16 +17,7 @@ HEAD =-I ./include -I $(MLX)/include RM =rm -rf UNAME_S :=$(shell uname -s) LIB =libft/libft.a mlx/build/libmlx42.a -ldl -lglfw -pthread -lm -SRC =src/main.c\ - src/colors.c\ - src/zoommove.c\ - src/keyhooks.c\ - src/mousehooks.c\ - src/print.c\ - src/error.c\ - src/fractal.c\ - src/fractals1.c\ - src/fractals2.c +SRC =src/main.c OBJ =$(SRC:src/%.c=obj/%.o) all: libft libmlx $(NAME) diff --git a/cub3d b/cub3d new file mode 100755 index 0000000000000000000000000000000000000000..45990e2ddf9f7636c2952211e589df80cd764ce0 GIT binary patch literal 132456 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 +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/11/29 03:25:46 by houtworm #+# #+# */ -/* Updated: 2022/12/29 06:29:04 by djonker \___)=(___/ */ +/* Updated: 2023/10/26 10:37:13 by houtworm ######## odam.nl */ /* */ /* ************************************************************************** */ -#ifndef FRACTOL_H -# define FRACTOL_H +#ifndef CUB3D_H +# define CUB3D_H # include # include # include "libft/libft.h" # include "mlx/include/MLX42/MLX42.h" -typedef struct s_cnbr -{ - long double re; //Real Number - long double im; //Imaginary Number -} t_cnbr; - typedef struct s_varlist { mlx_t *mlx; //mlx instance @@ -32,65 +26,6 @@ typedef struct s_varlist mlx_image_t *font[30]; //mlx font image int w; //actual window width used everywhere int h; //actual window height used everywhere - int fontnbr; //number printed strings on the screen - char *fractal; //name of fractal used for title and info - int fractalid; //int id of the fractal to faster compare - char *cscheme; //name of current colorscheme to print - int cschemeid; //id of current colorscheme to compare - int cscale; //scale used to generate colorschemes - int cshi; //used for shifting colors by 1 - int csha; //total amount of colors/shades - int32_t colors[1530]; //colorscheme colors - int iter; //number of iterations to do - long long calc; //Number of calculations per frame - long double xmax; //max number shown on the horizontal numberplane - long double ymax; //max number shown on the vertical numberplane - long double xmin; //min number shown on the horizontal numberplane - long double ymin; //min number shown on the vertical numberplane - long double xscale; //scale of visible numbers horizontal numberplane - long double yscale; //scale of visible numbers vertical numberplane - long double julre; //adjustable c value for x axis - long double julim; //adjustable c value for y axis - int xcur; //current x position of the mouse - int ycur; //current y position of the mouse - int psycho; //psycho mode toggle - int help; //help screen toggle - int info; //info screen toggle - int redraw; //if true then redraw - long double power; //for the mandelpower } t_varlist; -typedef struct s_threads -{ - t_varlist *vl; - int x; - int y; -} t_threads; - -void mousehook(void *param); -void scrollhook(double xdelta, double ydelta, void *param); -void keyhook(mlx_key_data_t keydata, void *param); -void keyhookextra(void *param); -void keyhookmove(void *param); -void keyhookfractal(void *param); -void resizehook(int x, int y, void *param); -void setcolorscheme(t_varlist *vl); -void redrawimage(t_varlist *vl); -void resetfractal(t_varlist *vl); -void ft_error(int r); -void showinfo(t_varlist *vl); -void showhelp(t_varlist *vl); -void justmove(t_varlist *vl, char dir); -void zoomtomouse(t_varlist *vl); -void zoomfrommouse(t_varlist *vl); -void fractal(t_varlist *vl); -void mandelbrot(t_varlist *vl, int x, int y, t_cnbr c); -void mandelcloud(t_varlist *vl, int x, int y, t_cnbr c); -void mandelfeather(t_varlist *vl, int x, int y, t_cnbr c); -void julia(t_varlist *vl, int x, int y, t_cnbr z); -void mandelpower(t_varlist *vl, int x, int y, t_cnbr c); -void burningship(t_varlist *vl, int x, int y, t_cnbr c); -void tricorn(t_varlist *vl, int x, int y, t_cnbr c); -void rorschach(t_varlist *vl, int x, int y, t_cnbr c); -void powerflower(t_varlist *vl, int x, int y, t_cnbr c); #endif diff --git a/src/colors.c b/src/colors.c deleted file mode 100644 index f3ed406..0000000 --- a/src/colors.c +++ /dev/null @@ -1,135 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* colors.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: houtworm +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2022/12/13 07:43:28 by houtworm #+# #+# */ -/* Updated: 2022/12/26 01:37:41 by houtworm ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "../fractol.h" - -void rainbowscale2(t_varlist *vl, int r, int g, int b) -{ - while (g - vl->cscale + 1 >= 0) - { - g = g - vl->cscale + 1; - vl->colors[vl->csha] = (r << 24 | g << 16 | b << 8 | 255); - vl->csha++; - } - while (r + vl->cscale - 1 <= 255) - { - r = r + vl->cscale - 1; - vl->colors[vl->csha] = (r << 24 | g << 16 | b << 8 | 255); - vl->csha++; - } - while (b - vl->cscale + 1 >= 0) - { - b = b - vl->cscale + 1; - vl->colors[vl->csha] = (r << 24 | g << 16 | b << 8 | 255); - vl->csha++; - } -} - -void rainbowscale(t_varlist *vl, int r, int g, int b) -{ - while (g + vl->cscale - 1 <= 255) - { - g = g + vl->cscale - 1; - vl->colors[vl->csha] = (r << 24 | g << 16 | b << 8 | 255); - vl->csha++; - } - while (r - vl->cscale + 1 >= 0) - { - r = r - vl->cscale + 1; - vl->colors[vl->csha] = (r << 24 | g << 16 | b << 8 | 255); - vl->csha++; - } - while (b + vl->cscale - 1 <= 255) - { - b = b + vl->cscale - 1; - vl->colors[vl->csha] = (r << 24 | g << 16 | b << 8 | 255); - vl->csha++; - } - rainbowscale2(vl, r, g, b); -} - -void rgbscale(t_varlist *vl, int red, int green, int blue) -{ - int r; - int g; - int b; - - r = 1; - g = 1; - b = 1; - while (r + red <= 255 && g + green <= 255 && b + blue <= 255) - { - r = r + red; - g = g + green; - b = b + blue; - vl->colors[vl->csha] = (r << 24 | g << 16 | b << 8 | 255); - vl->csha++; - } - while (r != 1 || b != 1 || g != 1) - { - r = r - red; - g = g - green; - b = b - blue; - vl->colors[vl->csha] = (r << 24 | g << 16 | b << 8 | 255); - vl->csha++; - } -} - -void colorschemestring(t_varlist *vl) -{ - vl->cschemeid = vl->cschemeid % 8; - if (vl->cschemeid == 0) - vl->cscheme = "Rainbow"; - if (vl->cschemeid == 1) - vl->cscheme = "Red"; - if (vl->cschemeid == 2) - vl->cscheme = "Green"; - if (vl->cschemeid == 3) - vl->cscheme = "Blue"; - if (vl->cschemeid == 4) - vl->cscheme = "Cyan"; - if (vl->cschemeid == 5) - vl->cscheme = "Magenta"; - if (vl->cschemeid == 6) - vl->cscheme = "Yellow"; - if (vl->cschemeid == 7) - vl->cscheme = "Greyscale"; -} - -void setcolorscheme(t_varlist *vl) -{ - int r; - int g; - int b; - - r = 255; - g = 0; - b = 0; - vl->csha = 0; - colorschemestring(vl); - if (vl->cschemeid == 0) - rainbowscale(vl, r, g, b); - else if (vl->cschemeid == 1) - rgbscale(vl, vl->cscale, 0, 0); - else if (vl->cschemeid == 2) - rgbscale(vl, 0, vl->cscale, 0); - else if (vl->cschemeid == 3) - rgbscale(vl, 0, 0, vl->cscale); - else if (vl->cschemeid == 4) - rgbscale(vl, 0, vl->cscale, vl->cscale); - else if (vl->cschemeid == 5) - rgbscale(vl, vl->cscale, 0, vl->cscale); - else if (vl->cschemeid == 6) - rgbscale(vl, vl->cscale, vl->cscale, 0); - else if (vl->cschemeid == 7) - rgbscale(vl, vl->cscale, vl->cscale, vl->cscale); -} diff --git a/src/error.c b/src/error.c deleted file mode 100644 index d1dc845..0000000 --- a/src/error.c +++ /dev/null @@ -1,41 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* .--. _ */ -/* error.c |o_o || | */ -/* |:_/ || |_ _ ___ __ */ -/* By: djonker // \ \ __| | | \ \/ / */ -/* (| | )|_| |_| |> < */ -/* Created: 2022/12/29 03:26:26 by djonker /'\_ _/`\__|\__,_/_/\_\ */ -/* Updated: 2022/12/29 06:23:51 by djonker \___)=(___/ */ -/* */ -/* ************************************************************************** */ - -#include "../fractol.h" - -void ft_error(int r) -{ - if (r == 1) - ft_putstr_fd("mlx is not happy\n", 2); - if (r == 3) - ft_putstr_fd("pthread error\n", 2); - else if (r == 2) - { - ft_putstr_fd("No or Incorrect parameters\n", 1); - ft_putstr_fd("\nUsage:\n./fract-ol FRACTAL_NAME [ITERATIONS] ", 1); - ft_putstr_fd("[COLORSCHEME]\n", 1); - ft_putstr_fd("\nExamples:\n./fract-ol mandelbrot\n./fract-ol ", 1); - ft_putstr_fd("julia 200\n./fract-ol burningship 300 1\n", 1); - ft_putstr_fd("\nOptions:\nmandelbrot\nmandelcloud\n", 1); - ft_putstr_fd("mandelfeather\nmandelpower\njulia\nburningship\n", 1); - ft_putstr_fd("tricorn\nrorschach\npowerflower\n", 1); - ft_putstr_fd("\nHotkeys:\nKey\t\tAction\nH\t\tShow Help\nScroll\t", 1); - ft_putstr_fd("\tZoom\nArrows\t\tMove\nA/Z\t\t+/- Iterations\n", 1); - ft_putstr_fd("S\t\tShift Colors by 1\nX\t\tNext Colorscheme\n", 1); - ft_putstr_fd("D/C\t\t+/- Colorshades\nI\t\tShow info\nP\t\t", 1); - ft_putstr_fd("Psychedelic Mode\nR\t\tReset Fractal\n1 - 9\t\t", 1); - ft_putstr_fd("Select Fractal\nF/V\t\tChange C value on X axis\n", 1); - ft_putstr_fd("G/B\t\tChange C value on Y axis\nClick\t\tSet C ", 1); - ft_putstr_fd("value on X and Y axis\nN\t\tIncrease Power by 1\n", 1); - } - exit(EXIT_FAILURE); -} diff --git a/src/fractal.c b/src/fractal.c deleted file mode 100644 index 5877621..0000000 --- a/src/fractal.c +++ /dev/null @@ -1,129 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* fractal.c |o_o || | */ -/* +:+ +:+ +:+ */ -/* By: houtworm +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2022/12/13 08:03:26 by houtworm #+# #+# */ -/* Updated: 2023/03/09 09:55:01 by djonker \___)=(___/ */ -/* */ -/* ************************************************************************** */ - -#include "../fractol.h" - -void setfractalname(t_varlist *vl) -{ - if (vl->fractalid == 1) - vl->fractal = "mandelbrot"; - else if (vl->fractalid == 2) - vl->fractal = "mandelcloud"; - else if (vl->fractalid == 3) - vl->fractal = "mandelfeather"; - else if (vl->fractalid == 4) - vl->fractal = "julia"; - else if (vl->fractalid == 5) - vl->fractal = "mandelpower"; - else if (vl->fractalid == 6) - vl->fractal = "burningship"; - else if (vl->fractalid == 7) - vl->fractal = "tricorn"; - else if (vl->fractalid == 8) - vl->fractal = "rorschach"; - else if (vl->fractalid == 11) - vl->fractal = "powerflower"; -} - -void selectfractal(t_varlist *vl, int x, int y, t_cnbr c) -{ - setfractalname(vl); - if (vl->fractalid == 1) - mandelbrot(vl, x, y, c); - else if (vl->fractalid == 2) - mandelcloud(vl, x, y, c); - else if (vl->fractalid == 3) - mandelfeather(vl, x, y, c); - else if (vl->fractalid == 4) - julia(vl, x, y, c); - else if (vl->fractalid == 5) - mandelpower(vl, x, y, c); - else if (vl->fractalid == 6) - burningship(vl, x, y, c); - else if (vl->fractalid == 7) - tricorn(vl, x, y, c); - else if (vl->fractalid == 8) - rorschach(vl, x, y, c); - else if (vl->fractalid == 9) - powerflower(vl, x, y, c); - else - ft_error(2); -} - -void fractal(t_varlist *vl) -{ - int y; - int x; - t_cnbr c; - - y = 1; - while (vl->h > y) - { - x = 1; - while (vl->w > x) - { - c.re = vl->xmin + (long double)x * (vl->xmax - vl->xmin) / vl->w; - c.im = vl->ymin + (long double)y * (vl->ymax - vl->ymin) / vl->h; - selectfractal(vl, x, y, c); - x++; - } - y++; - } -} - -void redrawimage(t_varlist *vl) -{ - vl->redraw = 0; - while (vl->fontnbr > 0) - { - mlx_delete_image(vl->mlx, vl->font[vl->fontnbr - 1]); - vl->fontnbr--; - } - mlx_delete_image(vl->mlx, vl->img); - vl->calc = 0; - vl->img = mlx_new_image(vl->mlx, vl->w, vl->h); - fractal(vl); - if (!vl->img || (mlx_image_to_window(vl->mlx, vl->img, 0, 0) < 0)) - ft_error(1); - if (vl->info % 2) - showinfo(vl); - if (vl->help % 2) - showhelp(vl); -} - -void resetfractal(t_varlist *vl) -{ - vl->xmin = -4; - vl->ymin = -4; - vl->xmax = 4; - vl->ymax = 4; - if (vl->w > vl->h) - { - vl->ymax = vl->ymin + (vl->xmax - vl->xmin) * vl->h / vl->w; - vl->ymin = vl->ymin + (vl->w / vl->h); - vl->ymax = vl->ymax + (vl->w / vl->h); - } - if (vl->w < vl->h) - { - vl->xmax = vl->xmin + (vl->ymax - vl->ymin) * vl->w / vl->h; - vl->xmin = vl->xmin + (vl->h / vl->w); - vl->xmax = vl->xmax + (vl->h / vl->w); - } - vl->psycho = 0; - vl->cshi = 0; - vl->iter = 128; - vl->xscale = 8; - vl->yscale = 8; - vl->julre = 0; - vl->julim = 0; - vl->power = 1; -} diff --git a/src/fractals1.c b/src/fractals1.c deleted file mode 100644 index b3719cf..0000000 --- a/src/fractals1.c +++ /dev/null @@ -1,124 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* fractals1.c |o_o || | */ -/* +:+ +:+ +:+ */ -/* By: houtworm +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2022/12/13 08:03:09 by houtworm #+# #+# */ -/* Updated: 2022/12/29 06:51:10 by djonker \___)=(___/ */ -/* */ -/* ************************************************************************** */ - -#include "../fractol.h" - -void mandelfeather(t_varlist *vl, int x, int y, t_cnbr c) -{ - t_cnbr z; - t_cnbr t; - int i; - - i = 0; - z = c; - while (vl->iter > i && ((z.re < 2 && z.re > -2) || (z.im < 2 && z.im > -2))) - { - t.re = z.re * z.re - z.im * z.im + c.re; - t.im = 2 * z.im * z.re + c.im; - z = t; - i++; - } - if (vl->iter == i) - mlx_put_pixel(vl->img, x, y, 0x000000FF); - else - mlx_put_pixel(vl->img, x, y, vl->colors[(i + vl->cshi) % vl->csha]); -} - -void mandelcloud(t_varlist *vl, int x, int y, t_cnbr c) -{ - t_cnbr z; - t_cnbr t; - int i; - - i = 0; - z = c; - while (vl->iter > i && ((z.re < 2 && z.re > -2) && (z.im < 2 && z.im > -2))) - { - t.re = z.re * z.re - z.im * z.im + c.re; - t.im = 2 * z.im * z.re + c.im; - z = t; - i++; - } - if (vl->iter == i) - mlx_put_pixel(vl->img, x, y, 0x000000FF); - else - mlx_put_pixel(vl->img, x, y, vl->colors[(i + vl->cshi) % vl->csha]); -} - -void mandelbrot(t_varlist *vl, int x, int y, t_cnbr c) -{ - t_cnbr z; - t_cnbr t; - int i; - - i = 0; - z = c; - while (vl->iter > i && (z.re * z.re + z.im * z.im < 100)) - { - t.re = z.re * z.re - z.im * z.im + c.re; - t.im = 2 * z.im * z.re + c.im; - z = t; - i++; - vl->calc++; - } - vl->calc++; - if (vl->iter == i) - mlx_put_pixel(vl->img, x, y, 0x000000FF); - else - mlx_put_pixel(vl->img, x, y, vl->colors[(i + vl->cshi) % vl->csha]); -} - -void julia(t_varlist *vl, int x, int y, t_cnbr z) -{ - t_cnbr t; - int i; - - i = 0; - while (vl->iter > i && (z.re * z.re + z.im * z.im < 100)) - { - t.re = z.re * z.re - z.im * z.im; - z.im = 2 * z.im * z.re + vl->julim; - z.re = t.re + vl->julre; - i++; - vl->calc++; - } - vl->calc++; - if (vl->iter == i) - mlx_put_pixel(vl->img, x, y, 0x000000FF); - else - mlx_put_pixel(vl->img, x, y, vl->colors[(i + vl->cshi) % vl->csha]); -} - -void burningship(t_varlist *vl, int x, int y, t_cnbr c) -{ - t_cnbr t; - t_cnbr z; - int i; - - i = 0; - z = c; - while (vl->iter > i && (z.re * z.re + z.im * z.im < 100)) - { - t.re = z.re * z.re - z.im * z.im + c.re; - t.im = fabs(2 * (double)z.im * (double)z.re) + c.im; - if (t.im < 0) - t.im = t.im * -1; - z = t; - i++; - vl->calc++; - } - vl->calc++; - if (vl->iter == i) - mlx_put_pixel(vl->img, x, y, 0x000000FF); - else - mlx_put_pixel(vl->img, x, y, vl->colors[(i + vl->cshi) % vl->csha]); -} diff --git a/src/fractals2.c b/src/fractals2.c deleted file mode 100644 index f8ca365..0000000 --- a/src/fractals2.c +++ /dev/null @@ -1,113 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* fractals2.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: houtworm +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2022/12/26 22:05:33 by houtworm #+# #+# */ -/* Updated: 2022/12/29 18:38:12 by houtworm ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "../fractol.h" - -void mandelpower(t_varlist *vl, int x, int y, t_cnbr c) -{ - t_cnbr z; - t_cnbr t; - t_cnbr r; - int i; - - i = 0; - z = c; - while (vl->iter > i && (z.re * z.re + z.im * z.im < 100)) - { - r.re = sqrt(z.re * z.re + z.im * z.im); - r.im = atan2(z.im, z.re); - r.re = powl(r.re, vl->power); - r.im = vl->power * r.im; - t.re = r.re * cos(r.im) + c.re; - t.im = r.re * sin(r.im) + c.im; - z = t; - i++; - vl->calc++; - } - vl->calc++; - if (vl->iter == i) - mlx_put_pixel(vl->img, x, y, 0x000000FF); - else - mlx_put_pixel(vl->img, x, y, vl->colors[(i + vl->cshi) % vl->csha]); -} - -void tricorn(t_varlist *vl, int x, int y, t_cnbr c) -{ - t_cnbr z; - t_cnbr t; - int i; - - i = 0; - z = c; - while (vl->iter > i && (z.re * z.re + z.im * z.im < 100)) - { - t.re = z.re * z.re - z.im * z.im + c.re; - t.im = -2 * z.re * z.im + c.im; - z = t; - i++; - vl->calc++; - } - vl->calc++; - if (vl->iter == i) - mlx_put_pixel(vl->img, x, y, 0x000000FF); - else - mlx_put_pixel(vl->img, x, y, vl->colors[(i + vl->cshi) % vl->csha]); -} - -void rorschach(t_varlist *vl, int x, int y, t_cnbr c) -{ - t_cnbr z; - t_cnbr t; - int i; - - i = 0; - z = c; - while (vl->iter > i && (z.re * z.re + z.im * z.im < 100)) - { - t.re = fabsl(z.re); - z.re = z.re * z.re - z.im * z.im - c.re; - z.im = 2 * z.im * t.re - c.im; - i++; - vl->calc++; - } - vl->calc++; - if (vl->iter == i) - mlx_put_pixel(vl->img, x, y, 0x000000FF); - else - mlx_put_pixel(vl->img, x, y, vl->colors[(i + vl->cshi) % vl->csha]); -} - -void powerflower(t_varlist *vl, int x, int y, t_cnbr z) -{ - t_cnbr t; - t_cnbr r; - int i; - - i = 0; - while (vl->iter > i && (z.re * z.re + z.im * z.im < 100)) - { - r.re = sqrt(z.re * z.re + z.im * z.im); - r.im = atan2(z.im, z.re); - r.re = powl(r.re, vl->power); - r.im = vl->power * r.im; - t.re = (r.re + vl->julre) * cos(r.im); - t.im = (r.re + vl->julim) * sin(r.im); - z = t; - i++; - vl->calc++; - } - vl->calc++; - if (vl->iter == i) - mlx_put_pixel(vl->img, x, y, 0x000000FF); - else - mlx_put_pixel(vl->img, x, y, vl->colors[(i + vl->cshi) % vl->csha]); -} diff --git a/src/keyhooks.c b/src/keyhooks.c deleted file mode 100644 index b11673a..0000000 --- a/src/keyhooks.c +++ /dev/null @@ -1,146 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* keyhooks.c |o_o || | */ -/* +:+ +:+ +:+ */ -/* By: houtworm +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2022/12/13 08:32:24 by houtworm #+# #+# */ -/* Updated: 2022/12/29 03:51:56 by djonker \___)=(___/ */ -/* */ -/* ************************************************************************** */ - -#include "../fractol.h" - -void keyhookmove(void *param) -{ - t_varlist *vl; - - vl = param; - if (mlx_is_key_down(vl->mlx, MLX_KEY_LEFT) && vl->xmin > -32) - { - justmove(vl, 'l'); - vl->redraw = 1; - } - if (mlx_is_key_down(vl->mlx, MLX_KEY_RIGHT) && vl->xmax < 32) - { - justmove(vl, 'r'); - vl->redraw = 1; - } - if (mlx_is_key_down(vl->mlx, MLX_KEY_UP) && vl->ymin > -32) - { - justmove(vl, 'u'); - vl->redraw = 1; - } - if (mlx_is_key_down(vl->mlx, MLX_KEY_DOWN) && vl->ymax < 32) - { - justmove(vl, 'd'); - vl->redraw = 1; - } -} - -void keyhook(mlx_key_data_t kd, void *param) -{ - t_varlist *vl; - - vl = param; - if (kd.key == MLX_KEY_S && kd.action == MLX_PRESS) - vl->cshi++; - else if (mlx_is_key_down(vl->mlx, MLX_KEY_R)) - resetfractal(vl); - else if (kd.key == MLX_KEY_P && kd.action == MLX_PRESS) - vl->psycho++; - else if (kd.key == MLX_KEY_I && kd.action == MLX_PRESS) - vl->info++; - else if (kd.key == MLX_KEY_H && kd.action == MLX_PRESS) - vl->help++; - else if (kd.key == MLX_KEY_X && kd.action == MLX_PRESS) - vl->cschemeid++; - else if (mlx_is_key_down(vl->mlx, MLX_KEY_N)) - vl->power = vl->power + 1; - else if (kd.key == MLX_KEY_C && kd.action == MLX_PRESS && vl->cscale != 128) - vl->cscale = (vl->cscale) * 2; - else if (kd.key == MLX_KEY_D && kd.action == MLX_PRESS && vl->cscale != 2) - vl->cscale = (vl->cscale) / 2; - else - return ; - setcolorscheme(vl); - redrawimage(vl); -} - -void resizehook(int x, int y, void *param) -{ - t_varlist *vl; - - vl = param; - vl->h = y; - vl->w = x; - vl->mlx->height = y; - vl->mlx->width = x; - if (vl->w > vl->h) - { - vl->xmax = vl->xmin + (vl->ymax - vl->ymin) * vl->w / vl->h; - } - else - { - vl->ymax = vl->ymin + (vl->xmax - vl->xmin) * vl->h / vl->w; - } - redrawimage(vl); -} - -void keyhookfractal(void *param) -{ - t_varlist *vl; - - vl = param; - if (mlx_is_key_down(vl->mlx, MLX_KEY_1)) - vl->fractalid = 1; - else if (mlx_is_key_down(vl->mlx, MLX_KEY_2)) - vl->fractalid = 2; - else if (mlx_is_key_down(vl->mlx, MLX_KEY_3)) - vl->fractalid = 3; - else if (mlx_is_key_down(vl->mlx, MLX_KEY_4)) - vl->fractalid = 4; - else if (mlx_is_key_down(vl->mlx, MLX_KEY_5)) - vl->fractalid = 5; - else if (mlx_is_key_down(vl->mlx, MLX_KEY_6)) - vl->fractalid = 6; - else if (mlx_is_key_down(vl->mlx, MLX_KEY_7)) - vl->fractalid = 7; - else if (mlx_is_key_down(vl->mlx, MLX_KEY_8)) - vl->fractalid = 8; - else if (mlx_is_key_down(vl->mlx, MLX_KEY_9)) - vl->fractalid = 9; - else - return ; - redrawimage(vl); -} - -void keyhookextra(void *param) -{ - t_varlist *vl; - - vl = param; - if (mlx_is_key_down(vl->mlx, MLX_KEY_ESCAPE)) - { - mlx_close_window(vl->mlx); - return ; - } - else if (mlx_is_key_down(vl->mlx, MLX_KEY_A)) - vl->iter++; - else if (mlx_is_key_down(vl->mlx, MLX_KEY_Z) && vl->iter > 0) - vl->iter--; - else if (mlx_is_key_down(vl->mlx, MLX_KEY_F) && vl->julre < 4) - vl->julre = vl->julre + 0.01; - else if (mlx_is_key_down(vl->mlx, MLX_KEY_V) && vl->julre > -4) - vl->julre = vl->julre - 0.01; - else if (mlx_is_key_down(vl->mlx, MLX_KEY_G) && vl->julim < 4) - vl->julim = vl->julim + 0.01; - else if (mlx_is_key_down(vl->mlx, MLX_KEY_B) && vl->julim > -4) - vl->julim = vl->julim - 0.01; - else if (vl->psycho % 2) - vl->cshi++; - else if (vl->redraw == 0) - return ; - redrawimage(vl); -} diff --git a/src/main.c b/src/main.c index 79954ce..fdcfed1 100644 --- a/src/main.c +++ b/src/main.c @@ -1,116 +1,43 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* main.c |o_o || | */ +/* main.c :+: :+: */ /* +:+ +:+ +:+ */ /* By: houtworm +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/13 08:03:00 by houtworm #+# #+# */ -/* Updated: 2022/12/29 06:35:31 by djonker \___)=(___/ */ +/* Updated: 2023/10/26 10:44:41 by houtworm ######## odam.nl */ /* */ /* ************************************************************************** */ -#include "../fractol.h" +#include "../cub3d.h" -int charactercheck(char *argument) -{ - int i; - - i = 0; - while (argument[i] != '\0') - { - if (argument[i] < '0' || argument[i] > '9') - return (1); - i++; - if (i > 7) - return (1); - } - return (0); -} - -void parseargs2(t_varlist *vl, char **argv) -{ - if (argv[2] != NULL) - { - if (charactercheck(argv[2])) - ft_error(2); - else - vl->iter = ft_atol(argv[2]); - if (argv[3] != NULL) - { - if (charactercheck(argv[3])) - ft_error(2); - else - vl->cschemeid = ft_atol(argv[3]); - } - } -} - -void parseargs(t_varlist *vl, char **argv) -{ - if (ft_strncmp("mandelbrot", vl->fractal, 10) == 0) - vl->fractalid = 1; - if (ft_strncmp("mandelcloud", vl->fractal, 11) == 0) - vl->fractalid = 2; - if (ft_strncmp("mandelfeather", vl->fractal, 13) == 0) - vl->fractalid = 3; - if (ft_strncmp("julia", vl->fractal, 5) == 0) - vl->fractalid = 4; - if (ft_strncmp("mandelpower", vl->fractal, 11) == 0) - vl->fractalid = 5; - if (ft_strncmp("burningship", vl->fractal, 11) == 0) - vl->fractalid = 6; - if (ft_strncmp("tricorn", vl->fractal, 7) == 0) - vl->fractalid = 7; - if (ft_strncmp("rorschach", vl->fractal, 9) == 0) - vl->fractalid = 8; - if (ft_strncmp("powerjulia", vl->fractal, 10) == 0) - vl->fractalid = 9; - parseargs2(vl, argv); -} - -t_varlist initvarlist(char **argv) +t_varlist initvarlist(void) { t_varlist vl; - char *title; - vl.fontnbr = 0; vl.w = 600; vl.h = 600; - vl.cschemeid = 0; - vl.fractal = argv[1]; - resetfractal(&vl); - parseargs(&vl, argv); - title = "Fractol - "; - title = ft_strjoin(title, argv[1]); - vl.mlx = mlx_init(vl.w, vl.h, title, true); + vl.mlx = mlx_init(vl.w, vl.h, "Cub3D", true); if (!vl.mlx) - ft_error(1); + exit(1); vl.img = mlx_new_image(vl.mlx, vl.w, vl.h); - vl.cscale = 16; - free (title); return (vl); } -int32_t main(int argc, char **argv) +void redrawimage(t_varlist *vl) +{ + mlx_delete_image(vl->mlx, vl->img); + vl->img = mlx_new_image(vl->mlx, vl->w, vl->h); +} + +int32_t main(void) { t_varlist vl; - if (argc > 4 || argc < 2) - ft_error(2); - vl = initvarlist(argv); - setcolorscheme(&vl); - fractal(&vl); + vl = initvarlist(); if (!vl.img || (mlx_image_to_window(vl.mlx, vl.img, 0, 0) < 0)) - ft_error(1); - showhelp(&vl); - mlx_key_hook(vl.mlx, &keyhook, &vl); - mlx_scroll_hook(vl.mlx, &scrollhook, &vl); - mlx_resize_hook(vl.mlx, &resizehook, &vl); - mlx_loop_hook(vl.mlx, &mousehook, &vl); - mlx_loop_hook(vl.mlx, &keyhookmove, &vl); - mlx_loop_hook(vl.mlx, &keyhookextra, &vl); - mlx_loop_hook(vl.mlx, &keyhookfractal, &vl); + exit (1); mlx_loop(vl.mlx); mlx_delete_image(vl.mlx, vl.img); mlx_terminate(vl.mlx); diff --git a/src/mousehooks.c b/src/mousehooks.c deleted file mode 100644 index 9bab00f..0000000 --- a/src/mousehooks.c +++ /dev/null @@ -1,44 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* mousehooks.c |o_o || | */ -/* +:+ +:+ +:+ */ -/* By: houtworm +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2022/12/25 10:29:26 by houtworm #+# #+# */ -/* Updated: 2022/12/29 00:02:44 by djonker \___)=(___/ */ -/* */ -/* ************************************************************************** */ - -#include "../fractol.h" - -void scrollhook(double xdelta, double ydelta, void *param) -{ - t_varlist *vl; - - vl = param; - xdelta++; - if (ydelta > 0) - if (vl->xscale > 0.00000000000000001) - if (vl->yscale > 0.00000000000000001) - zoomtomouse(vl); - if (ydelta < 0 && vl->xscale < 32) - zoomfrommouse(vl); - redrawimage(vl); -} - -void mousehook(void *param) -{ - t_varlist *vl; - int32_t x; - int32_t y; - - vl = param; - if (mlx_is_mouse_down(vl->mlx, MLX_MOUSE_BUTTON_LEFT)) - { - mlx_get_mouse_pos(vl->mlx, &x, &y); - vl->julre = vl->xmin + (long double)x * (vl->xmax - vl->xmin) / vl->w; - vl->julim = vl->ymin + (long double)y * (vl->ymax - vl->ymin) / vl->h; - vl->redraw = 1; - } -} diff --git a/src/print.c b/src/print.c deleted file mode 100644 index 15c2f29..0000000 --- a/src/print.c +++ /dev/null @@ -1,124 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* print.c |o_o || | */ -/* +:+ +:+ +:+ */ -/* By: houtworm +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2022/12/13 08:03:05 by houtworm #+# #+# */ -/* Updated: 2022/12/29 06:15:16 by djonker \___)=(___/ */ -/* */ -/* ************************************************************************** */ - -#include "../fractol.h" - -void freeprint(t_varlist *vl, char *s, int y, int f) -{ - vl->fontnbr++; - vl->font[vl->fontnbr - 1] = mlx_put_string(vl->mlx, s, 10, y); - if (f == 1) - free(s); -} - -void showinfo3(t_varlist *vl, char *temp, char *print) -{ - if (vl->fractalid == 4 || vl->fractalid == 9) - { - temp = ft_lftoa(vl->julre); - print = ft_strjoin("CX value: ", temp); - freeprint(vl, print, 190, 1); - free(temp); - temp = ft_lftoa(vl->julim); - print = ft_strjoin("CY value: ", temp); - freeprint(vl, print, 210, 1); - free(temp); - } - if (vl->fractalid == 5) - { - temp = ft_itoa(vl->power); - print = ft_strjoin("Power: ", temp); - freeprint(vl, print, 190, 1); - free(temp); - } - if (vl->fractalid == 9) - { - temp = ft_itoa(vl->power); - print = ft_strjoin("Power: ", temp); - freeprint(vl, print, 230, 1); - free(temp); - } -} - -void showinfo2(t_varlist *vl, char *temp, char *print) -{ - temp = ft_itoa(vl->csha); - if (vl->cschemeid == 0) - print = ft_strjoin("Colors: ", temp); - if (vl->cschemeid > 0) - print = ft_strjoin("Shades: ", temp); - freeprint(vl, print, 110, 1); - free(temp); - temp = ft_itoa(vl->w); - print = ft_strjoin("Width: ", temp); - freeprint(vl, print, 130, 1); - free(temp); - temp = ft_itoa(vl->h); - print = ft_strjoin("Height: ", temp); - freeprint(vl, print, 150, 1); - free(temp); - print = ft_strjoin("Fractal: ", vl->fractal); - freeprint(vl, print, 170, 1); - showinfo3(vl, "empty", "empty"); -} - -void showinfo(t_varlist *vl) -{ - char *print; - char *temp; - - temp = ft_lftoa(vl->xscale); - print = ft_strjoin("X Scale: ", temp); - freeprint(vl, print, 10, 1); - free(temp); - temp = ft_lftoa(vl->yscale); - print = ft_strjoin("Y Scale: ", temp); - freeprint(vl, print, 30, 1); - free(temp); - temp = ft_ltoa(vl->calc); - print = ft_strjoin("Calculations: ", temp); - freeprint(vl, print, 50, 1); - free(temp); - temp = ft_itoa(vl->iter); - print = ft_strjoin("Iterations: ", temp); - freeprint(vl, print, 70, 1); - free(temp); - print = ft_strjoin("Scheme: ", vl->cscheme); - freeprint(vl, print, 90, 1); - showinfo2(vl, "empty", "empty"); -} - -void showhelp(t_varlist *vl) -{ - if (vl->fractalid == 4 || vl->fractalid == 9) - { - freeprint(vl, "F/V +/- C on the X axis", vl->h - 310, 0); - freeprint(vl, "G/B +/- C on the Y axis", vl->h - 290, 0); - freeprint(vl, "Click Set C on the X and Y axis", vl->h - 270, 0); - } - if (vl->fractalid == 5) - freeprint(vl, "N Increase Power by 1", vl->h - 270, 0); - if (vl->fractalid == 9) - freeprint(vl, "N Increase Power by 1", vl->h - 330, 0); - freeprint(vl, "Scroll Zoom in/out", vl->h - 250, 0); - freeprint(vl, "Arrows Move Around", vl->h - 230, 0); - freeprint(vl, "A/Z +/- Iterations", vl->h - 210, 0); - freeprint(vl, "X Next Color Scheme", vl->h - 190, 0); - freeprint(vl, "S Shift Colors by 1", vl->h - 170, 0); - freeprint(vl, "D/C Change Colorscale", vl->h - 150, 0); - freeprint(vl, "P Psychedelic Mode", vl->h - 130, 0); - freeprint(vl, "H Show Help Screen", vl->h - 110, 0); - freeprint(vl, "I Show Info Screen", vl->h - 90, 0); - freeprint(vl, "1 - 9 Select Fractal", vl->h - 70, 0); - freeprint(vl, "R Reset Fractal", vl->h - 50, 0); - freeprint(vl, "Esc Quit Program", vl->h - 30, 0); -} diff --git a/src/zoommove.c b/src/zoommove.c deleted file mode 100644 index f7cc2c4..0000000 --- a/src/zoommove.c +++ /dev/null @@ -1,131 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* zoommove.c |o_o || | */ -/* +:+ +:+ +:+ */ -/* By: houtworm +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2022/12/25 11:14:13 by houtworm #+# #+# */ -/* Updated: 2023/03/09 20:30:01 by djonker \___)=(___/ */ -/* */ -/* ************************************************************************** */ - -#include "../fractol.h" - -void justmove(t_varlist *vl, char dir) -{ - if (dir == 'l') - { - vl->xmin = vl->xmin + vl->xscale * -1 / 100; - vl->xmax = vl->xmax + vl->xscale * -1 / 100; - } - if (dir == 'r') - { - vl->xmin = vl->xmin - vl->xscale * -1 / 100; - vl->xmax = vl->xmax - vl->xscale * -1 / 100; - } - if (dir == 'u') - { - vl->ymin = vl->ymin + vl->yscale * -1 / 100; - vl->ymax = vl->ymax + vl->yscale * -1 / 100; - } - if (dir == 'd') - { - vl->ymin = vl->ymin - vl->yscale * -1 / 100; - vl->ymax = vl->ymax - vl->yscale * -1 / 100; - } -} - -void moveout(t_varlist *vl, long double zoomx, long double zoomy) -{ - if (vl->xcur < 0) - { - vl->xmin = vl->xmin + zoomx * ((long double)vl->xcur * -1 / vl->w); - vl->xmax = vl->xmax + zoomx * ((long double)vl->xcur * -1 / vl->w); - } - else - { - vl->xmin = vl->xmin - zoomx * ((long double)vl->xcur / vl->w); - vl->xmax = vl->xmax - zoomx * ((long double)vl->xcur / vl->w); - } - if (vl->ycur < 0) - { - vl->ymin = vl->ymin + zoomy * ((long double)vl->ycur * -1 / vl->w); - vl->ymax = vl->ymax + zoomy * ((long double)vl->ycur * -1 / vl->w); - } - else - { - vl->ymin = vl->ymin - zoomy * ((long double)vl->ycur / vl->w); - vl->ymax = vl->ymax - zoomy * ((long double)vl->ycur / vl->w); - } -} - -void movein(t_varlist *vl, long double zoomx, long double zoomy) -{ - if (vl->xcur < 0) - { - vl->xmin = vl->xmin - zoomx * ((long double)vl->xcur * -1 / vl->w); - vl->xmax = vl->xmax - zoomx * ((long double)vl->xcur * -1 / vl->w); - } - else - { - vl->xmin = vl->xmin + zoomx * ((long double)vl->xcur / vl->w); - vl->xmax = vl->xmax + zoomx * ((long double)vl->xcur / vl->w); - } - if (vl->ycur < 0) - { - vl->ymin = vl->ymin - zoomy * ((long double)vl->ycur * -1 / vl->w); - vl->ymax = vl->ymax - zoomy * ((long double)vl->ycur * -1 / vl->w); - } - else - { - vl->ymin = vl->ymin + zoomy * ((long double)vl->ycur / vl->w); - vl->ymax = vl->ymax + zoomy * ((long double)vl->ycur / vl->w); - } -} - -void zoomtomouse(t_varlist *vl) -{ - long double zoomx; - long double zoomy; - - vl->xscale = vl->xmin - vl->xmax; - vl->yscale = vl->ymax - vl->ymin; - zoomx = 0.9 * vl->xscale; - zoomy = 0.9 * vl->yscale; - vl->xmax = vl->xmax + (vl->xscale - zoomx) / 2; - vl->xmin = vl->xmax + zoomx; - vl->ymin = vl->ymin + (vl->yscale - zoomy) / 2; - vl->ymax = vl->ymin + zoomy; - mlx_get_mouse_pos(vl->mlx, &vl->xcur, &vl->ycur); - vl->xcur = vl->xcur - (vl->w / 2); - vl->ycur = vl->ycur - (vl->h / 2); - vl->xscale = vl->xmax - vl->xmin; - vl->yscale = vl->ymax - vl->ymin; - zoomx = 0.1111111111111111111111111111111111111111 * vl->xscale; - zoomy = 0.1111111111111111111111111111111111111111 * vl->yscale; - movein(vl, zoomx, zoomy); -} - -void zoomfrommouse(t_varlist *vl) -{ - long double zoomx; - long double zoomy; - - vl->xscale = vl->xmin - vl->xmax; - vl->yscale = vl->ymax - vl->ymin; - zoomx = 1.1 * vl->xscale; - zoomy = 1.1 * vl->yscale; - vl->xmax = vl->xmax + (vl->xscale - zoomx) / 2; - vl->xmin = vl->xmax + zoomx; - vl->ymin = vl->ymin + (vl->yscale - zoomy) / 2; - vl->ymax = vl->ymin + zoomy; - mlx_get_mouse_pos(vl->mlx, &vl->xcur, &vl->ycur); - vl->xcur = vl->xcur - vl->w / 2; - vl->ycur = vl->ycur - vl->h / 2; - vl->xscale = vl->xmax - vl->xmin; - vl->yscale = vl->ymax - vl->ymin; - zoomx = 0.0909090909090909090909090909090909090909 * vl->xscale; - zoomy = 0.0909090909090909090909090909090909090909 * vl->yscale; - moveout(vl, zoomx, zoomy); -}