From a8ad4d01b037c85a02ae15f698dd6f42688db83f Mon Sep 17 00:00:00 2001 From: ReverseSky Date: Mon, 14 Oct 2024 17:06:45 +0200 Subject: [PATCH] manque partie texture --- Makefile | 4 +- algo.c | 172 ++----------------------------------------------------- algo.h | 15 +++-- move.c | 86 ++++++++++++++++++++++++++++ render.c | 138 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 243 insertions(+), 172 deletions(-) create mode 100644 move.c create mode 100644 render.c diff --git a/Makefile b/Makefile index 2e563ef..914e14e 100644 --- a/Makefile +++ b/Makefile @@ -6,13 +6,13 @@ # By: greg +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/07/29 13:08:42 by greg #+# #+# # -# Updated: 2024/10/09 03:07:50 by greg ### ########.fr # +# Updated: 2024/10/14 15:33:53 by greg ### ########.fr # # # # **************************************************************************** # NAME = cub3d -SRC = algo.c +SRC = algo.c move.c render.c OBJS = ${SRC:.c=.o} diff --git a/algo.c b/algo.c index 4c40eb5..fde3b35 100644 --- a/algo.c +++ b/algo.c @@ -6,15 +6,13 @@ /* By: greg +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/01 16:24:58 by grobledo #+# #+# */ -/* Updated: 2024/10/11 05:16:06 by greg ### ########.fr */ +/* Updated: 2024/10/14 16:47:50 by greg ### ########.fr */ /* */ /* ************************************************************************** */ #include "algo.h" -#include -#include -int worldMap[mapWidth][mapHeight]= +int worldMap[mapWidth][mapHeight] = { {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, @@ -42,7 +40,6 @@ int worldMap[mapWidth][mapHeight]= {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} }; - static int initalgo(t_ray *ray) { ray->posX = 13; @@ -53,165 +50,8 @@ static int initalgo(t_ray *ray) ray->planeY = 0.66; // FOV de 66 degres ray->movespeed = 0.1; ray->rotspeed = 0.1; - return (0); -} - -static int render(t_ray *ray) -{ - int x; - double width = 640; - double height = 480; - int hit; - int side; - int *img_data = (int *)mlx_get_data_addr(ray->img_ptr, &(int){32}, &(int){width * 4}, &(int){0}); - - // clear image data - ft_bzero(img_data, width * height * sizeof(int)); - - x = 0; - while (x < width) - { - // position et direction du rayon - ray->cameraX = 2 * x / width - 1; - ray->raydirX = ray->dirX + ray->planeX * ray->cameraX; - ray->raydirY = ray->dirY + ray->planeY * ray->cameraX; - - ray->mapX = (int)ray->posX; - ray->mapY = (int)ray->posY; - - ray->deltadistX = (ray->raydirX == 0) ? 1e30 : fabs(1 / ray->raydirX); - ray->deltadistY = (ray->raydirY == 0) ? 1e30 : fabs(1 / ray->raydirY); - - //calculate step and initial sideDist - if (ray->raydirX < 0) - { - ray->stepX = -1; - ray->sidedistX = (ray->posX - ray->mapX) * ray->deltadistX; - } - else - { - ray->stepX = 1; - ray->sidedistX = (ray->mapX + 1.0 - ray->posX) * ray->deltadistX; - } - if (ray->raydirY < 0) - { - ray->stepY = -1; - ray->sidedistY = (ray->posY - ray->mapY) * ray->deltadistY; - } - else - { - ray->stepY = 1; - ray->sidedistY = (ray->mapY + 1.0 - ray->posY) * ray->deltadistY; - } - - hit = 0; - while(hit == 0) - { - //jump to next map square, either in x-direction, or in y-direction - if(ray->sidedistX < ray->sidedistY) - { - ray->sidedistX += ray->deltadistX; - ray->mapX += ray->stepX; - side = 0; - } - else - { - ray->sidedistY += ray->deltadistY; - ray->mapY += ray->stepY; - side = 1; - } - //Check if ray has hit a wall - if(worldMap[ray->mapX][ray->mapY] == 1) - hit = 1; - } - if(side == 0) - ray->perpwalldist = (ray->sidedistX - ray->deltadistX); - else - ray->perpwalldist = (ray->sidedistY - ray->deltadistY); - //Calculate height of line to draw on screen - int lineHeight = (int)(height / ray->perpwalldist); - - //calculate lowest and highest pixel to fill in current stripe - int drawStart = -lineHeight / 2 + height / 2; - if(drawStart < 0) - drawStart = 0; - int drawEnd = lineHeight / 2 + height / 2; - if(drawEnd >= height) - drawEnd = height - 1; - - // draw vertical line - int y = 0; - while (y <= drawStart) - { - img_data[y * (int)width + x] = 0x29f8ff;; - y++; - } - y = drawStart; - while (y <= drawEnd) - { - img_data[y * (int)width + x] = 0xFF0000; - y++; - } - y++; - while (y <= height) - { - img_data[y * (int)width + x] = 0xFF985C; - y++; - } - - x++; - } - - // put image to window - mlx_put_image_to_window(ray->mlx_ptr, ray->win_ptr, ray->img_ptr, 0, 0); - return (0); -} - -static int keypress(int keycode, t_ray *ray) -{ - //move forward if no wall in front of you - if (keycode == 119) - { - if (worldMap[(int)((ray->posX + ray->dirX * ray->movespeed))][(int)(ray->posY)] != 1) - ray->posX += ray->dirX * ray->movespeed; - if (worldMap[(int)(ray->posX)][(int)(ray->posY + ray->dirY * ray->movespeed)] != 1) - ray->posY += ray->dirY * ray->movespeed; - } - //move backwards if no wall behind you - if (keycode == 115) - { - if (worldMap[(int)(ray->posX - ray->dirX * ray->movespeed)][(int)(ray->posY)] != 1) - ray->posX -= ray->dirX * ray->movespeed; - if (worldMap[(int)(ray->posX)][(int)(ray->posY - ray->dirY * ray->movespeed)] != 1) - ray->posY -= ray->dirY * ray->movespeed; - } - //rotate to the right - if (keycode == 100) - { - //both camera direction and camera plane must be rotated - ray->oldDirX = ray->dirX; - ray->dirX = ray->dirX * cos(-ray->rotspeed) - ray->dirY * sin(-ray->rotspeed); - ray->dirY = ray->oldDirX * sin(-ray->rotspeed) + ray->dirY * cos(-ray->rotspeed); - ray->oldPlaneX = ray->planeX; - ray->planeX = ray->planeX * cos(-ray->rotspeed) - ray->planeY * sin(-ray->rotspeed); - ray->planeY = ray->oldPlaneX * sin(-ray->rotspeed) + ray->planeY * cos(-ray->rotspeed); - } - //rotate to the left - if (keycode == 97) - { - //both camera direction and camera plane must be rotated - ray->oldDirX = ray->dirX; - ray->dirX = ray->dirX * cos(ray->rotspeed) - ray->dirY * sin(ray->rotspeed); - ray->dirY = ray->oldDirX * sin(ray->rotspeed) + ray->dirY * cos(ray->rotspeed); - ray->oldPlaneX = ray->planeX; - ray->planeX = ray->planeX * cos(ray->rotspeed) - ray->planeY * sin(ray->rotspeed); - ray->planeY = ray->oldPlaneX * sin(ray->rotspeed) + ray->planeY * cos(ray->rotspeed); - } - - if (keycode == 65307) - exit(0); - // render the updated frame after key press - render(ray); + ray->width = 1920; + ray->height = 1080; return (0); } @@ -221,8 +61,8 @@ int main(void) // Initialisation ray.mlx_ptr = mlx_init(); - ray.win_ptr = mlx_new_window(ray.mlx_ptr, 640, 480, "cub3d"); - ray.img_ptr = mlx_new_image(ray.mlx_ptr, 640, 480); + ray.win_ptr = mlx_new_window(ray.mlx_ptr, 1920, 1080, "cub3d"); + ray.img_ptr = mlx_new_image(ray.mlx_ptr, 1920, 1080); initalgo(&ray); diff --git a/algo.h b/algo.h index 3b5585c..e0b5081 100644 --- a/algo.h +++ b/algo.h @@ -6,7 +6,7 @@ /* By: greg +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/30 15:45:59 by grobledo #+# #+# */ -/* Updated: 2024/10/11 04:32:39 by greg ### ########.fr */ +/* Updated: 2024/10/14 16:47:36 by greg ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,8 +18,8 @@ #include "Minilibx/mlx.h" #include "Minilibx/mlx_int.h" # include "Libft/libft.h" -#define mapWidth 24 -#define mapHeight 24 +#define mapWidth 24 // TEST +#define mapHeight 24 // TEST typedef struct s_ray { @@ -58,6 +58,13 @@ typedef struct s_ray int *img_data; int mapX; int mapY; + double width; + double height; } t_ray; -#endif + +extern int worldMap[mapWidth][mapHeight]; // TEST +int keypress(int keycode, t_ray *ray); +int render(t_ray *ray); + +#endif \ No newline at end of file diff --git a/move.c b/move.c new file mode 100644 index 0000000..00c7fef --- /dev/null +++ b/move.c @@ -0,0 +1,86 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* move.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: greg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/14 15:03:10 by greg #+# #+# */ +/* Updated: 2024/10/14 16:53:56 by greg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "algo.h" + +static int move_forward(t_ray *ray) +{ + if (worldMap[(int)((ray->posX + ray->dirX * ray->movespeed))][(int)(ray->posY)] != 1) + ray->posX += ray->dirX * ray->movespeed; + if (worldMap[(int)(ray->posX)][(int)(ray->posY + ray->dirY * ray->movespeed)] != 1) + ray->posY += ray->dirY * ray->movespeed; + return(0); +} + +static int move_backward(t_ray *ray) +{ + if (worldMap[(int)(ray->posX - ray->dirX * ray->movespeed)][(int)(ray->posY)] != 1) + ray->posX -= ray->dirX * ray->movespeed; + if (worldMap[(int)(ray->posX)][(int)(ray->posY - ray->dirY * ray->movespeed)] != 1) + ray->posY -= ray->dirY * ray->movespeed; + return(0); +} + +static int move_right(t_ray *ray) +{ + //both camera direction and camera plane must be rotated + ray->oldDirX = ray->dirX; + ray->dirX = ray->dirX * cos(ray->rotspeed) - ray->dirY * sin(ray->rotspeed); + ray->dirY = ray->oldDirX * sin(ray->rotspeed) + ray->dirY * cos(ray->rotspeed); + ray->oldPlaneX = ray->planeX; + ray->planeX = ray->planeX * cos(ray->rotspeed) - ray->planeY * sin(ray->rotspeed); + ray->planeY = ray->oldPlaneX * sin(ray->rotspeed) + ray->planeY * cos(ray->rotspeed); + return(0); +} + +static int move_left(t_ray *ray) +{ + //both camera direction and camera plane must be rotated + ray->oldDirX = ray->dirX; + ray->dirX = ray->dirX * cos(-ray->rotspeed) - ray->dirY * sin(-ray->rotspeed); + ray->dirY = ray->oldDirX * sin(-ray->rotspeed) + ray->dirY * cos(-ray->rotspeed); + ray->oldPlaneX = ray->planeX; + ray->planeX = ray->planeX * cos(-ray->rotspeed) - ray->planeY * sin(-ray->rotspeed); + ray->planeY = ray->oldPlaneX * sin(-ray->rotspeed) + ray->planeY * cos(-ray->rotspeed); + return(0); +} + + + + +int keypress(int keycode, t_ray *ray) +{ + if (keycode == 119) //move forward if no wall in front of you + { + move_forward(ray); + } + if (keycode == 115) //move backwards if no wall behind you + { + move_backward(ray); + } + if (keycode == 100) //rotate to the right + { + move_left(ray); + } + if (keycode == 97) //rotate to the left + { + move_right(ray); + } + if (keycode == 65307) + { + mlx_destroy_window(ray->mlx_ptr, ray->win_ptr); + exit(0); + } + // render the updated frame after key pressd + render(ray); + return (0); +} diff --git a/render.c b/render.c new file mode 100644 index 0000000..89bd1d3 --- /dev/null +++ b/render.c @@ -0,0 +1,138 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* render.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: greg +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/14 14:55:05 by greg #+# #+# */ +/* Updated: 2024/10/14 16:53:21 by greg ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "algo.h" + + +static int init_step(t_ray *ray) +{ + if (ray->raydirX < 0) + { + ray->stepX = -1; + ray->sidedistX = (ray->posX - ray->mapX) * ray->deltadistX; + } + else + { + ray->stepX = 1; + ray->sidedistX = (ray->mapX + 1.0 - ray->posX) * ray->deltadistX; + } + if (ray->raydirY < 0) + { + ray->stepY = -1; + ray->sidedistY = (ray->posY - ray->mapY) * ray->deltadistY; + } + else + { + ray->stepY = 1; + ray->sidedistY = (ray->mapY + 1.0 - ray->posY) * ray->deltadistY; + } + return (0); +} + +static int ray_pos(t_ray *ray, int x) +{ + // position et direction du rayon + ray->cameraX = 2 * x / ray->width - 1; + ray->raydirX = ray->dirX + ray->planeX * ray->cameraX; + ray->raydirY = ray->dirY + ray->planeY * ray->cameraX; + + ray->mapX = (int)ray->posX; + ray->mapY = (int)ray->posY; + + ray->deltadistX = (ray->raydirX == 0) ? 1e30 : fabs(1 / ray->raydirX); + ray->deltadistY = (ray->raydirY == 0) ? 1e30 : fabs(1 / ray->raydirY); + return (0); +} +int draw_img(t_ray *ray, int drawStart, int *img_data, int drawEnd, int x) +{ + // draw vertical line + int y = 0; + while (y <= drawStart) + { + img_data[y * (int)ray->width + x] = 0x29f8ff;; + y++; + } + y = drawStart; + while (y <= drawEnd) + { + img_data[y * (int)ray->width + x] = 0xFF0000; + y++; + } + y++; + while (y <= ray->height) + { + img_data[y * (int)ray->width + x] = 0xFF985C; + y++; + } + return (0); +} + +void find_wall(t_ray *ray) +{ + int side; + int hit; + + hit = 0; + while(hit == 0) + { + if(ray->sidedistX < ray->sidedistY) //jump to next map square, either in x-direction, or in y-direction + { + ray->sidedistX += ray->deltadistX; + ray->mapX += ray->stepX; + side = 0; + } + else + { + ray->sidedistY += ray->deltadistY; + ray->mapY += ray->stepY; + side = 1; + } + if(worldMap[ray->mapX][ray->mapY] == 1) //Check if ray has hit a wall + hit = 1; + } + if(side == 0) + ray->perpwalldist = (ray->sidedistX - ray->deltadistX); + else + ray->perpwalldist = (ray->sidedistY - ray->deltadistY); +} + +int render(t_ray *ray) +{ + int x; + int lineHeight; + int *img_data; + int drawStart; + int drawEnd; + + img_data = (int *)mlx_get_data_addr(ray->img_ptr, &(int){32}, &(int){ray->width * 4}, &(int){0}); + ft_bzero(img_data, ray->width * ray->height * sizeof(int)); // clear image data + x = 0; + while (x++ < ray->width) + { + ray_pos(ray, x); + init_step(ray); //calculate step and initial sideDist + find_wall(ray); + lineHeight = (int)(ray->height / ray->perpwalldist); //Calculate height of line to draw on screen + drawStart = -lineHeight / 2 + ray->height / 2; //calculate lowest and highest pixel to fill in current stripe + if(drawStart < 0) + drawStart = 0; + drawEnd = lineHeight / 2 + ray->height / 2; + if(drawEnd >= ray->height) + drawEnd = ray->height - 1; + draw_img(ray, drawStart, img_data, drawEnd, x); + } + mlx_put_image_to_window(ray->mlx_ptr, ray->win_ptr, ray->img_ptr, 0, 0); + return (0); +} + + +