Skip to content

Commit

Permalink
Merge pull request #18 from ys-zm/raycaster
Browse files Browse the repository at this point in the history
Bound detection using raycast.
  • Loading branch information
JopjeKnopje authored Jan 2, 2024
2 parents 72d9000 + 447623b commit 5ca9183
Show file tree
Hide file tree
Showing 10 changed files with 128 additions and 44 deletions.
9 changes: 2 additions & 7 deletions include/meta.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
/* By: jboeve <[email protected]> +#+ */
/* +#+ */
/* Created: 2023/11/01 20:07:37 by jboeve #+# #+# */
/* Updated: 2024/01/02 19:51:20 by joppe ######## odam.nl */
/* Updated: 2024/01/02 21:52:00 by joppe ######## odam.nl */
/* */
/* ************************************************************************** */

Expand Down Expand Up @@ -72,7 +72,7 @@
#define COLOR_PLAYER 0xFFFFFFFF

// #define FOV 0.66
#define FOV 0.80
#define FOV 0.85

typedef bool (t_ray_hitfunc) (void *p, uint32_t x, uint32_t y);
typedef struct s_meta t_meta;
Expand Down Expand Up @@ -174,8 +174,6 @@ void draw_rect(mlx_image_t* image, uint32_t x_pos, uint32_t y_pos, uint32_t widt
void draw_line(mlx_image_t *image, t_vec2i start, t_vec2i end, t_rgba c);
void draw_put_pixel(mlx_image_t* image, uint32_t x, uint32_t y, uint32_t color);

// test_utils.c
void print_cell(t_cell_type cell);

// keys.c
void keys_update(mlx_key_data_t keydata, void *param);
Expand All @@ -187,9 +185,6 @@ void cube_put_pixel(mlx_image_t* image, uint32_t x, uint32_t y, uint32_t color)
// raycaster.c
t_ray raycaster_cast(t_meta *meta, t_vec2d pp, t_vec2d dir, t_ray_hitfunc hit);

// test_utils.c
void print_map(char *map, uint32_t w, uint32_t h);

// colors.c
int32_t set_color(int32_t r, int32_t g, int32_t b, int32_t a);
int32_t find_wall_color(t_side side);
Expand Down
28 changes: 27 additions & 1 deletion include/test_utils.h
Original file line number Diff line number Diff line change
@@ -1 +1,27 @@
void print_map_cell(t_cell_type *level, uint32_t w, uint32_t h);
/* ************************************************************************** */
/* */
/* :::::::: */
/* test_utils.h :+: :+: */
/* +:+ */
/* By: joppe <[email protected]> +#+ */
/* +#+ */
/* Created: 2024/01/02 19:56:05 by joppe #+# #+# */
/* Updated: 2024/01/02 21:08:34 by joppe ######## odam.nl */
/* */
/* ************************************************************************** */



#ifndef TEST_UTILS_H
#define TEST_UTILS_H

#include "meta.h"


// test_utils.c
void print_cell(t_cell_type cell);
void print_map(char *map, uint32_t w, uint32_t h);
void print_map_cell(t_cell_type *level, uint32_t w, uint32_t h);
void print_ray(const char *s, const t_ray *r);

#endif // !TEST_UTILS_H
8 changes: 5 additions & 3 deletions include/vector.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
/* By: joppe <[email protected]> +#+ */
/* +#+ */
/* Created: 2024/01/02 19:07:15 by joppe #+# #+# */
/* Updated: 2024/01/02 19:07:43 by joppe ######## odam.nl */
/* Updated: 2024/01/02 21:26:35 by joppe ######## odam.nl */
/* */
/* ************************************************************************** */

Expand All @@ -33,12 +33,14 @@ typedef struct s_vec2u {


// vec2d_utils.c
t_vec2d vec2d_add(t_vec2d v1, t_vec2d v2);
t_vec2d vec2d_scalar_product(t_vec2d vec, double scalar);
void print_vec2d(char *str, t_vec2d vector);
t_vec2d vec2d_scalar_product(t_vec2d vec, double scalar);
t_vec2d vec2d_rotate(t_vec2d old, double radiant);
t_vec2d vec2d_add(t_vec2d v1, t_vec2d v2);
t_vec2d vec2u_to_vec2d(t_vec2u v);
double deg_to_rad(float deg);
t_vec2d vec2d_mul(t_vec2d v1, t_vec2d v2);
t_vec2d vec2d_normalize(t_vec2d vec);


#endif // !VECTOR_H
2 changes: 1 addition & 1 deletion src/cub3d.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
/* By: jboeve <[email protected]> +#+ */
/* +#+ */
/* Created: 2023/11/07 15:36:26 by jboeve #+# #+# */
/* Updated: 2024/01/02 18:58:50 by joppe ######## odam.nl */
/* Updated: 2024/01/02 21:50:31 by joppe ######## odam.nl */
/* */
/* ************************************************************************** */

Expand Down
3 changes: 2 additions & 1 deletion src/game/game.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
/* By: joppe <[email protected]> +#+ */
/* +#+ */
/* Created: 2023/11/08 22:35:05 by joppe #+# #+# */
/* Updated: 2024/01/02 19:49:20 by joppe ######## odam.nl */
/* Updated: 2024/01/02 20:58:27 by joppe ######## odam.nl */

/* */
/* ************************************************************************** */
Expand All @@ -16,6 +16,7 @@
#include "vector.h"
#include <math.h>
#include <unistd.h>
#include "test_utils.h"

void set_player_start_position(t_player *p, char dir)
{
Expand Down
57 changes: 44 additions & 13 deletions src/game/keys.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,48 +6,79 @@
/* By: jboeve <[email protected]> +#+ */
/* +#+ */
/* Created: 2023/12/15 14:05:30 by jboeve #+# #+# */
/* Updated: 2024/01/02 19:37:53 by joppe ######## odam.nl */
/* Updated: 2024/01/02 22:01:41 by joppe ######## odam.nl */
/* */
/* ************************************************************************** */

#include "MLX42/MLX42.h"
#include "libft.h"
#include "meta.h"
#include "vector.h"
#include <math.h>
#include <stdio.h>

void keys_handle(t_meta *meta, double delta_time)
static void keys_handle_move(t_meta *meta, double delta_time)
{
t_player* const p = &meta->player;
float speed = PLAYER_MOVE_SPEED * delta_time;
float rotate_speed = PLAYER_ROTATE_SPEED * delta_time;
t_vec2d trans;
bool pressed;

pressed = false;
ft_bzero(&trans, sizeof(t_vec2d));
if (mlx_is_key_down(meta->mlx, MLX_KEY_LEFT_SHIFT))
speed *= PLAYER_RUN_MODIFIER;
if (mlx_is_key_down(meta->mlx, MLX_KEY_LEFT_CONTROL))
rotate_speed /= PLAYER_ROTATE_MODIFIER;
if (mlx_is_key_down(meta->mlx, MLX_KEY_ESCAPE))
mlx_close_window(meta->mlx);
if (mlx_is_key_down(meta->mlx, MLX_KEY_W))
player_move(p, (t_vec2d) {p->direction.x * speed, p->direction.y * speed});
{
pressed = true;
trans = vec2d_add(trans, (t_vec2d) {p->direction.x * speed, p->direction.y * speed});
}
if (mlx_is_key_down(meta->mlx, MLX_KEY_S))
player_move(p, (t_vec2d) {p->direction.x * -speed, p->direction.y * -speed});
{
pressed = true;
trans = vec2d_add(trans, (t_vec2d) {p->direction.x * -speed, p->direction.y * -speed});
}
if (mlx_is_key_down(meta->mlx, MLX_KEY_A))
player_move(p, (t_vec2d) {(vec2d_rotate(p->direction, PI / 2).x) * -speed, (vec2d_rotate(p->direction, PI / 2).y) * -speed});
{
pressed = true;
trans = vec2d_add(trans, (t_vec2d) {(vec2d_rotate(p->direction, PI / 2).x) * -speed, (vec2d_rotate(p->direction, PI / 2).y) * -speed});
}
if (mlx_is_key_down(meta->mlx, MLX_KEY_D))
player_move(p, (t_vec2d) {(vec2d_rotate(p->direction, PI / 2).x) * speed, (vec2d_rotate(p->direction, PI / 2).y) * speed});
{
pressed = true;
trans = vec2d_add(trans, (t_vec2d) {(vec2d_rotate(p->direction, PI / 2).x) * speed, (vec2d_rotate(p->direction, PI / 2).y) * speed});
}

if (pressed)
player_move(p, trans);
}

void keys_handle(t_meta *meta, double delta_time)
{
t_player* const p = &meta->player;
float rotate_speed = PLAYER_ROTATE_SPEED * delta_time;

if (mlx_is_key_down(meta->mlx, MLX_KEY_LEFT_CONTROL))
rotate_speed /= PLAYER_ROTATE_MODIFIER;
if (mlx_is_key_down(meta->mlx, MLX_KEY_ESCAPE))
mlx_close_window(meta->mlx);
if (mlx_is_key_down(meta->mlx, MLX_KEY_Q))
player_turn(p, -rotate_speed);
if (mlx_is_key_down(meta->mlx, MLX_KEY_E))
player_turn(p, rotate_speed);
keys_handle_move(meta, delta_time);
}


void mouse_hook(double xpos, double ypos, void *param)
{
t_meta *meta = param;
static double x_old = 0;
const float rotate_speed = 0.200f;
static bool going_right = false;

(void) ypos;

static double time_old = 0;
if (time_old == 0)
time_old = mlx_get_time();
Expand All @@ -67,7 +98,7 @@ void mouse_hook(double xpos, double ypos, void *param)
delta_time = mlx_get_time() - time_old;
speed = delta_time * fabs(x_old - xpos) * rotate_speed;
}
player_turn(meta, speed);
player_turn(&meta->player, speed);
going_right = true;
}
else
Expand All @@ -78,7 +109,7 @@ void mouse_hook(double xpos, double ypos, void *param)
delta_time = mlx_get_time() - time_old;
speed = delta_time * fabs(x_old - xpos) * rotate_speed;
}
player_turn(meta, -speed);
player_turn(&meta->player, -speed);
going_right = false;
}
// printf("delta_time [%lf]\n", delta_time);
Expand Down
13 changes: 9 additions & 4 deletions src/game/player.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,15 @@
/* By: joppe <[email protected]> +#+ */
/* +#+ */
/* Created: 2023/11/10 02:25:34 by joppe #+# #+# */
/* Updated: 2024/01/02 19:37:31 by joppe ######## odam.nl */
/* Updated: 2024/01/02 22:04:30 by joppe ######## odam.nl */
/* */
/* ************************************************************************** */

#include "MLX42/MLX42.h"
#include "libft.h"
#include "test_utils.h"
#include "meta.h"
#include "vector.h"
#include <math.h>
#include <stddef.h>
#include <stdint.h>
Expand All @@ -32,12 +34,15 @@ bool bound_check(void *param, uint32_t x, uint32_t y)

void player_move(t_player *p, t_vec2d transform)
{
t_vec2d new_position;
t_vec2d new_position;

new_position.x = (p->position.x + (transform.x));
new_position.y = (p->position.y + (transform.y));
// TODO Use raycast to check if we can move.
if (!bound_check(p->meta, new_position.x, new_position.y))

t_ray r = raycaster_cast(p->meta, p->position, vec2d_normalize(transform), bound_check);
// print_ray("bound_ray", &r);

if (r.length > .5)
{
p->position.x += transform.x;
p->position.y += transform.y;
Expand Down
22 changes: 16 additions & 6 deletions src/game/raycaster.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,13 @@
/* By: jboeve <[email protected]> +#+ */
/* +#+ */
/* Created: 2023/12/15 15:20:09 by jboeve #+# #+# */
/* Updated: 2024/01/02 18:55:06 by joppe ######## odam.nl */
/* Updated: 2024/01/02 22:07:46 by joppe ######## odam.nl */
/* */
/* ************************************************************************** */

#include "meta.h"
#include <math.h>
#include <stddef.h>

inline static t_vec2d calculate_delta_dist(t_vec2d ray_direction)
{
Expand Down Expand Up @@ -65,18 +66,18 @@ inline static double calculate_ray_length(t_side hit_side, \
}

inline static t_side ray_move(t_vec2d *side_dist, t_vec2d *delta_dist, \
t_vec2d *step_size, t_vec2d *map_pos)
t_vec2d step_size, t_vec2d *map_pos)
{
if (side_dist->x < side_dist->y)
{
side_dist->x += delta_dist->x;
map_pos->x += step_size->x;
map_pos->x += step_size.x;
return (HIT_NS);
}
else
{
side_dist->y += delta_dist->y;
map_pos->y += step_size->y;
map_pos->y += step_size.y;
return (HIT_EW);
}
}
Expand All @@ -94,12 +95,21 @@ t_ray raycaster_cast(t_meta *meta, t_vec2d pp, t_vec2d dir, t_ray_hitfunc hit)
delta_dist = calculate_delta_dist(dir);
side_dist = calculate_side_dist(dir, pp, map_pos, delta_dist);
step_size = calculate_step_size(dir);
while (1)
size_t limit = 25;
while (limit)
{
ray.hit_side = ray_move(&side_dist, &delta_dist, &step_size, &map_pos);
ray.hit_side = ray_move(&side_dist, &delta_dist, step_size, &map_pos);
// print_vec2d("side_dist", side_dist);
if (hit(meta, map_pos.x, map_pos.y))
{
// TODO Get hit angle.
break;
}
limit--;
}
if (!limit)
UNIMPLEMENTED("Raycaster limit reached!");
ray.length = calculate_ray_length(ray.hit_side, side_dist, delta_dist);
ray.direction = dir;
return (ray);
}
11 changes: 10 additions & 1 deletion src/test_utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
/* By: joppe <[email protected]> +#+ */
/* +#+ */
/* Created: 2023/11/10 16:32:18 by joppe #+# #+# */
/* Updated: 2023/12/20 18:34:36 by jboeve ######## odam.nl */
/* Updated: 2024/01/02 21:23:42 by joppe ######## odam.nl */
/* */
/* ************************************************************************** */

Expand All @@ -22,6 +22,15 @@ const char *CELL_NAMES[] = {
[MAP_SPACE] = "MAP_SPACE",
};

void print_ray(const char *s, const t_ray *r)
{
char *side_text;
if (r->hit_side == HIT_NS)
side_text = "NS";
else
side_text = "EW";
printf("[%s] | ray_direction [%lf][%lf] | length [%lf] | hit_side [%s]\n", s, r->direction.x, r->direction.y, r->length, side_text);
}

void print_cell(t_cell_type cell)
{
Expand Down
19 changes: 12 additions & 7 deletions src/utils/vec2d_utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@
/* By: jboeve <[email protected]> +#+ */
/* +#+ */
/* Created: 2023/12/14 18:30:23 by jboeve #+# #+# */
/* Updated: 2024/01/02 17:43:51 by joppe ######## odam.nl */
/* Updated: 2024/01/02 21:26:28 by joppe ######## odam.nl */
/* */
/* ************************************************************************** */

#include "meta.h"
#include "vector.h"
#include <math.h>

t_vec2d vec2d_add(t_vec2d v1, t_vec2d v2)
Expand All @@ -27,6 +28,11 @@ t_vec2d vec2d_scalar_product(t_vec2d vec, double scalar)
return ((t_vec2d){vec.x * scalar, vec.y * scalar});
}

t_vec2d vec2d_mul(t_vec2d v1, t_vec2d v2)
{
return ((t_vec2d){v1.x * v2.x, v1.y * v2.y});
}

void print_vec2d(char *str, t_vec2d vector)
{
printf("%s X: %lf | Y: %lf\n", str, vector.x, vector.y);
Expand All @@ -51,9 +57,8 @@ double deg_to_rad(float deg)
return deg * (PI / 180);
}


// t_vec2f vec2f_normalize(t_vec2f vec)
// {
// float m = sqrt(vec[VEC_X] * vec[VEC_X] + vec[VEC_Y] * vec[VEC_Y]);
// return (vec / m);
// }
t_vec2d vec2d_normalize(t_vec2d vec)
{
float m = sqrt(vec.x * vec.x + vec.y * vec.y);
return ((t_vec2d) {vec.x / m, vec.y / m});
}

0 comments on commit 5ca9183

Please sign in to comment.