Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bound detection using raycast. #18

Merged
merged 1 commit into from
Jan 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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});
}