135 lines
3.2 KiB
C
135 lines
3.2 KiB
C
/* ************************************************************************** */
|
|
/* */
|
|
/* ::: :::::::: */
|
|
/* algo.c :+: :+: :+: */
|
|
/* +:+ +:+ +:+ */
|
|
/* By: greg <greg@student.42.fr> +#+ +:+ +#+ */
|
|
/* +#+#+#+#+#+ +#+ */
|
|
/* Created: 2024/10/01 16:24:58 by grobledo #+# #+# */
|
|
/* Updated: 2024/10/03 17:42:13 by greg ### ########.fr */
|
|
/* */
|
|
/* ************************************************************************** */
|
|
|
|
#include "algo.h"
|
|
|
|
|
|
static int initalgo(t_ray *ray)
|
|
{
|
|
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);
|
|
}
|
|
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// https://github.com/iciamyplant/Cub3d-Linux
|
|
|
|
// https://lodev.org/cgtutor/raycasting.html
|
|
|
|
// https://www.youtube.com/watch?v=js7HW65MmNw&list=PL0H9-oZl_QOHM34HvD3DiGmwmj5X7GvTW
|