From f7f92cbaa80626629496eeaa832ace979c9cca87 Mon Sep 17 00:00:00 2001 From: ReverseSky Date: Thu, 3 Oct 2024 17:54:28 +0200 Subject: [PATCH] first part algo --- Makefile | 6 +-- algo.c | 139 ++++++++++++++++++++++++++++++++++++++++++------------- algo.h | 25 ++++++++-- 3 files changed, 132 insertions(+), 38 deletions(-) diff --git a/Makefile b/Makefile index 72fd05f..8ba5229 100644 --- a/Makefile +++ b/Makefile @@ -3,16 +3,16 @@ # ::: :::::::: # # Makefile :+: :+: :+: # # +:+ +:+ +:+ # -# By: grobledo +#+ +:+ +#+ # +# By: greg +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/07/29 13:08:42 by greg #+# #+# # -# Updated: 2024/10/01 18:58:09 by grobledo ### ########.fr # +# Updated: 2024/10/03 17:00:43 by greg ### ########.fr # # # # **************************************************************************** # NAME = cub3d -SRC = +SRC = algo.c OBJS = ${SRC:.c=.o} diff --git a/algo.c b/algo.c index bacfda7..2dc1cbb 100644 --- a/algo.c +++ b/algo.c @@ -3,50 +3,127 @@ /* ::: :::::::: */ /* algo.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: grobledo +#+ +:+ +#+ */ +/* By: greg +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/01 16:24:58 by grobledo #+# #+# */ -/* Updated: 2024/10/01 18:57:51 by grobledo ### ########.fr */ +/* Updated: 2024/10/03 17:42:13 by greg ### ########.fr */ /* */ /* ************************************************************************** */ #include "algo.h" -int algo(struct) +static int initalgo(t_ray *ray) { - double posX; - double posY; //position x et y du joueur sur la map - double dirX; - double dirY; // orientation du joeur sur la map - double planeX; - double planeY;// position de la cam - double currtime; // temps frame actuelle - double oldtime; // temps derniere frame + ray->posX = 2; + ray->posY = 2; + ray->dirX = -1; + ray->dirY = 0; + ray->planeX = 0; + ray->planeY = 0.66; // FOV de 66 degres + ray->currtime = 0; + ray->oldtime = 0; + return (0); +} - posX = 2; - posY = 2; - dirX = -1; - dirY = 0; - planeX = 0; - planeY = 0.66; // FOV de 66 degres - currtime = 0; - oldtime = 0; + +int algo() +{ + t_ray ray; + int x; + double width; + int height; + // quelle box sur la map on est + int mapX; + int mapY; + // wall hit and if yes in wich direction + int hit; + int side; + + initalgo(&ray); + // init image; + + + x = 0; + width = 640; + height = 480; + while (x < w) + { + // 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; + + mapX = (int)ray.posX; + mapY = (int)ray.posY; + + ray.deltadistX = (ray.raydirX == 0) ? 1e30 : fabs(1 / ray.raydirX); + ray.deltadistY = (ray.raydirY == 0) ? 1e30 : fabs(1 / ray.raydirY); + + hit = 0; + + //calculate step and initial sideDist + if (ray.raydirX < 0) + { + ray.stepX = -1; + ray.sidedistX = (ray.posX - mapX) * ray.deltadistX; + } + else + { + ray.stepX = 1; + ray.sidedistX = (mapX + 1.0 - ray.posX) * ray.deltadistX; + } + if (ray.raydirY < 0) + { + ray.stepY = -1; + ray.sidedistY = (ray.posY - mapY) * ray.deltadistY; + } + else + { + ray.stepY = 1; + ray.sidedistY = (mapY + 1.0 - ray.posY) * ray.deltadistY; + } + 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; + mapX += ray.stepX; + side = 0; + } + else + { + ray.sidedistY += ray.deltadistY; + mapY += ray.stepY; + side = 1; + } + //Check if ray has hit a wall + if(worldMap[mapX][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); + lineHeight = (int)(height / ray.perpwalldist); + + //calculate lowest and highest pixel to fill in current stripe + int drawStart; + drawStart = -lineHeight / 2 + height / 2; + if(drawStart < 0) + drawStart = 0; + int drawEnd; + if(drawEnd >= height) + drawEnd = height - 1; + + } + return (0); } -// int initalgo(struct) -// { -// posX = 2; -// posY = 2; -// dirX = -1; -// dirY = 0; -// planeX = 0; -// planeY = 0.66; // FOV de 66 degres -// currtime = 0; -// oldtime = 0; -// return (0); -// } diff --git a/algo.h b/algo.h index 9ed7355..8f89eeb 100644 --- a/algo.h +++ b/algo.h @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* algo.h :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: grobledo +#+ +:+ +#+ */ +/* By: greg +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/30 15:45:59 by grobledo #+# #+# */ -/* Updated: 2024/10/01 18:57:39 by grobledo ### ########.fr */ +/* Updated: 2024/10/03 17:26:27 by greg ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,7 +16,7 @@ #include #include -typedef struct s_player +typedef struct s_ray { // pos player on map double posX; @@ -31,6 +31,23 @@ typedef struct s_player double currtime; // last frame double oldtime; -} t_player; + // camera pos + double cameraX; + // direction rayon + double raydirX; + double raydirY; + // longueur du rayon entre pos actuelle et pos du prochain cote d'une box + double sidedistX; + double sidedistY; + // longueur du rayon entre pos d'un cote d'une box jusqu'a pos du prochain cote d'une box + double deltadistX; + double deltadistY; + // calcul lenght of ray (shortest perpendicular distance between wall and camera plane) + double perpwalldist; + // step direction (can be -1 or +1) + int stepX; + int stepY; + //wall hit? +} t_ray; #endif