diff --git a/includes/game/dda.h b/includes/game/dda.h index eab5af4..2388aac 100644 --- a/includes/game/dda.h +++ b/includes/game/dda.h @@ -6,23 +6,22 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/28 13:04:36 by adjoly #+# #+# */ -/* Updated: 2024/10/29 14:15:59 by adjoly ### ########.fr */ +/* Updated: 2024/11/02 15:57:19 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -# ifndef DDA_H +#ifndef DDA_H # define DDA_H # include # include "game.h" -#include "game/vectwo.h" +# include "game/vectwo.h" typedef struct s_dda { bool h; int i; - bool s; t_vec2 map; t_vec2 vert; t_vec2 hori; diff --git a/includes/game/game.h b/includes/game/game.h index 1f4a5f8..bf063bb 100644 --- a/includes/game/game.h +++ b/includes/game/game.h @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/11 16:38:40 by adjoly #+# #+# */ -/* Updated: 2024/10/29 13:56:32 by adjoly ### ########.fr */ +/* Updated: 2024/11/02 15:55:39 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -53,7 +53,6 @@ typedef struct s_render void *texture[4]; } t_render; - /** * @brief This function is used to handle keypress * @@ -64,7 +63,6 @@ typedef struct s_render */ int key_hook(int key, void *param); - /** * @brief This function is here to change the direction of the player * by setting the t_player->direction and check overflow to be @@ -77,7 +75,6 @@ int key_hook(int key, void *param); */ void change_direction(float speed, bool clockwise, t_player *player); - /** * @brief Render a cub3d frame by executing a dda on every ray and * putting the pixel on the window diff --git a/includes/game/settings.h b/includes/game/settings.h index d4709a3..bbf58cc 100644 --- a/includes/game/settings.h +++ b/includes/game/settings.h @@ -6,11 +6,11 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/04 14:06:39 by adjoly #+# #+# */ -/* Updated: 2024/11/02 14:15:03 by adjoly ### ########.fr */ +/* Updated: 2024/11/02 15:55:02 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#ifndef SETTINGS_H +#ifndef SETTINGS_H # define SETTINGS_H // Key code @@ -24,8 +24,8 @@ # define WINDOW_W 1600 # define WINDOW_H 900 -# define PLAYER_ROT_SPEED (2 * M_PI) / 128 -# define PLAYER_SPEED 0.5 +# define PLAYER_ROT_SPEED 0.034906585039887 +# define PLAYER_SPEED 1.5 # define FOV 70 # define CHUNK_SIZE 64 diff --git a/includes/game/utils_math.h b/includes/game/utils_math.h index 1a36bc3..6c102d3 100644 --- a/includes/game/utils_math.h +++ b/includes/game/utils_math.h @@ -6,14 +6,14 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/29 10:07:24 by adjoly #+# #+# */ -/* Updated: 2024/10/29 10:08:04 by adjoly ### ########.fr */ +/* Updated: 2024/11/02 15:54:32 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef UTILS_MATH_H # define UTILS_MATH_H -#include +# include void fix_ang(float *ang); diff --git a/includes/game/vectwo.h b/includes/game/vectwo.h index 1fd0715..e75508e 100644 --- a/includes/game/vectwo.h +++ b/includes/game/vectwo.h @@ -6,13 +6,15 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/28 13:32:14 by adjoly #+# #+# */ -/* Updated: 2024/10/28 14:24:56 by adjoly ### ########.fr */ +/* Updated: 2024/11/02 15:51:49 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef VECTWO_H # define VECTWO_H +# include + typedef struct s_vec2 { float x; @@ -35,4 +37,9 @@ void vec2_add(t_vec2 *first, t_vec2 second); * @brief Just substract second to first */ void vec2_sub(t_vec2 *first, t_vec2 second); + +/** + * @brief Multiply a vec2 by a number n and returns it + */ +t_vec2 vec2_mul_ret(t_vec2 vec, float n); #endif diff --git a/src/raycasting/dda.c b/src/raycasting/dda.c index b46508b..fc0eb1a 100644 --- a/src/raycasting/dda.c +++ b/src/raycasting/dda.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/07 16:55:09 by adjoly #+# #+# */ -/* Updated: 2024/11/02 13:59:41 by adjoly ### ########.fr */ +/* Updated: 2024/11/02 15:58:33 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,7 +20,6 @@ void setup_dda_ver(t_player *play, t_ray *ray, t_dda *dda) { dda->distance.x = 100000; dda->h = false; - dda->s = true; ray->tan = tan(ray->angle); if (cos(ray->angle) < -0.001) { @@ -29,25 +28,18 @@ void setup_dda_ver(t_player *play, t_ray *ray, t_dda *dda) ray->pos.x = (((int)play->coord.x >> 6) << 6) - 0.001; ray->pos.y = (play->coord.x - ray->pos.x) * ray->tan + play->coord.y; } - else if(cos(ray->angle) > 0.001) + else if (cos(ray->angle) > 0.001) { ray->offset.x = CHUNK_SIZE; ray->offset.y = -CHUNK_SIZE * ray->tan; ray->pos.x = (((int)play->coord.x >> 6) << 6) + CHUNK_SIZE; ray->pos.y = (play->coord.x - ray->pos.x) * ray->tan + play->coord.y; } - else - { - ray->pos.x = play->coord.x; - ray->pos.y = play->coord.y; - dda->s = false; - } } void setup_dda_hor(t_player *play, t_ray *ray, t_dda *dda) { dda->distance.y = 100000; - dda->s = true; dda->h = true; ray->tan = 1 / tan(ray->angle); if (sin(ray->angle) < -0.001) @@ -57,29 +49,24 @@ void setup_dda_hor(t_player *play, t_ray *ray, t_dda *dda) ray->pos.y = (((int)play->coord.y >> 6) << 6) + CHUNK_SIZE; ray->pos.x = (play->coord.y - ray->pos.y) * ray->tan + play->coord.x; } - else if(sin(ray->angle) > 0.001) + else if (sin(ray->angle) > 0.001) { ray->offset.y = -CHUNK_SIZE; ray->offset.x = CHUNK_SIZE * ray->tan; ray->pos.y = (((int)play->coord.y >> 6) << 6) - 0.001; ray->pos.x = (play->coord.y - ray->pos.y) * ray->tan + play->coord.x; } - else - { - ray->pos.x = play->coord.x; - ray->pos.y = play->coord.y; - dda->s = false; - } } void dda_loop(t_dda *dda, t_ray *ray, t_map *map, t_player *play) { - while (dda->s && dda->i) + while (dda->i) { dda->map.x = (int)((int)ray->pos.x / 64); dda->map.y = (int)((int)ray->pos.y / 64); - if (dda->map.x >= 0 && dda->map.x < map->size.x && dda->map.y >= 0 && dda->map.y < map->size.y && \ - map->arr[(int)dda->map.y][(int)dda->map.x] == '1') + if (dda->map.x >= 0 && dda->map.x < map->size.x && dda->map.y >= 0 && \ + dda->map.y < map->size.y && \ + map->arr[(int)dda->map.y][(int)dda->map.x] == '1') { dda->i = 0; if (dda->h) @@ -99,18 +86,12 @@ void dda_algo(t_render *render, t_dda *dda, t_ray *ray) { setup_dda_hor(render->player, ray, dda); dda->i = render->world->size.y; - //printf("caca pos = %f, %f\n", ray->pos.x, ray->pos.y); dda_loop(dda, ray, render->world, render->player); - //printf("pipi pos = %f, %f\n", ray->pos.x, ray->pos.y); - dda->hori.x = ray->pos.x; - dda->hori.y = ray->pos.y; + dda->hori = ray->pos; setup_dda_ver(render->player, ray, dda); dda->i = render->world->size.x; - //printf("caca pos = %f, %f\n", ray->pos.x, ray->pos.y); dda_loop(dda, ray, render->world, render->player); - //printf("pipi pos = %f, %f\n", ray->pos.x, ray->pos.y); - dda->vert.x = ray->pos.x; - dda->vert.y = ray->pos.y; + dda->vert = ray->pos; if (dda->distance.y < dda->distance.x) { ray->pos.x = fabsf(dda->hori.x); diff --git a/src/raycasting/key_hook.c b/src/raycasting/key_hook.c index f64ffe7..faa3a56 100644 --- a/src/raycasting/key_hook.c +++ b/src/raycasting/key_hook.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/11 16:37:56 by adjoly #+# #+# */ -/* Updated: 2024/11/02 14:21:14 by adjoly ### ########.fr */ +/* Updated: 2024/11/02 15:50:23 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -33,13 +33,17 @@ int key_hook(int key, void *param) return (mlx_loop_end(render->mlx)); if (key == W_KEY) { - render->player->coord.x += PLAYER_SPEED * cos(render->player->direction); - render->player->coord.y += PLAYER_SPEED * sin(render->player->direction); + render->player->coord.x += PLAYER_SPEED * \ + cos(render->player->direction); + render->player->coord.y += PLAYER_SPEED * \ + -sin(render->player->direction); } else if (key == S_KEY) { - render->player->coord.x -= PLAYER_SPEED * cos(render->player->direction); - render->player->coord.y -= PLAYER_SPEED * sin(render->player->direction); + render->player->coord.x -= PLAYER_SPEED * \ + cos(render->player->direction); + render->player->coord.y -= PLAYER_SPEED * \ + -sin(render->player->direction); } else if (key == D_KEY) change_direction(PLAYER_ROT_SPEED, false, render->player); diff --git a/src/raycasting/renderer.c b/src/raycasting/renderer.c index 19a42c3..85a33f2 100644 --- a/src/raycasting/renderer.c +++ b/src/raycasting/renderer.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/28 15:48:39 by adjoly #+# #+# */ -/* Updated: 2024/11/02 14:14:45 by adjoly ### ########.fr */ +/* Updated: 2024/11/02 16:00:11 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,12 +22,13 @@ void draw_floor(t_render *render) size_t y; y = WINDOW_H / 2; - while(y < WINDOW_H - 1) + while (y < WINDOW_H - 1) { x = 0; while (x < WINDOW_W) { - mlx_set_image_pixel(render->mlx, render->img, x, y, render->world->floor); + mlx_set_image_pixel(render->mlx, render->img, x, y, \ + render->world->floor); x++; } y++; @@ -40,12 +41,13 @@ void draw_celling(t_render *render) size_t y; y = 0; - while(y < WINDOW_H / 2) + while (y < WINDOW_H / 2) { x = 0; while (x < WINDOW_W) { - mlx_set_image_pixel(render->mlx, render->img, x, y, render->world->celling); + mlx_set_image_pixel(render->mlx, render->img, x, y, \ + render->world->celling); x++; } y++; @@ -77,15 +79,18 @@ void render_frame(t_render *render) int i; t_dda dda; t_ray ray; + float ang; i = WINDOW_W; - ray.angle = render->player->direction - (M_PI / 180) / ((float)FOV / 2); + ray.angle = render->player->direction - ((M_PI / 180) * ((float)FOV / 2)); fix_ang(&ray.angle); draw_celling(render); draw_floor(render); - while(i > -1) + while (i > -1) { dda_algo(render, &dda, &ray); + ang = cos(render->player->direction - ray.angle); + ray.distance *= ang; print_line(render, &ray, i); ray.angle += (M_PI / 180) / ((float)WINDOW_W / FOV); fix_ang(&ray.angle); diff --git a/src/raycasting/vectwo.c b/src/raycasting/vectwo.c index a993ad1..c41dfce 100644 --- a/src/raycasting/vectwo.c +++ b/src/raycasting/vectwo.c @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/26 15:47:29 by adjoly #+# #+# */ -/* Updated: 2024/11/02 14:25:24 by adjoly ### ########.fr */ +/* Updated: 2024/11/02 15:42:28 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,14 +24,14 @@ void vec2_add(t_vec2 *first, t_vec2 second) first->x += second.x; first->y += second.y; } - + // to be removed void vec2_sub(t_vec2 *first, t_vec2 second) { first->x -= second.x; first->y -= second.y; } -t_vec2 vec2_mul_ret(t_vec2 vec, uint16_t n) +t_vec2 vec2_mul_ret(t_vec2 vec, float n) { t_vec2 ret;