diff options
Diffstat (limited to '')
-rw-r--r-- | src/ft_draw_sprite.c | 24 | ||||
-rw-r--r-- | src/ft_draw_verline.c | 61 | ||||
-rw-r--r-- | src/ft_raycasting.c | 55 |
3 files changed, 84 insertions, 56 deletions
diff --git a/src/ft_draw_sprite.c b/src/ft_draw_sprite.c index b7b9e5d..9cd7dae 100644 --- a/src/ft_draw_sprite.c +++ b/src/ft_draw_sprite.c @@ -1,3 +1,15 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_draw_sprite.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/24 20:22:45 by rbousset #+# #+# */ +/* Updated: 2020/02/24 20:22:47 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + #include <libft.h> #include <cub3d.h> #include <stdint.h> @@ -11,20 +23,20 @@ void if (cl->tlist[4].tex_x) cl->img.ptr[x * 4 + (cl->img.sizeline * y)] = (char)cl->tlist[4].ptr[cl->tlist[4].tex_x * 4 + 4 * - cl->tlist[4].img_h * tex_y]; + cl->tlist[4].img_h * tex_y]; cl->img.ptr[x * 4 + (cl->img.sizeline * y) + 1] = - (char)cl->tlist[4].ptr[cl->tlist[4].tex_x * 4 + 4 * - cl->tlist[4].img_h * tex_y + 1]; + (char)cl->tlist[4].ptr[cl->tlist[4].tex_x * 4 + 4 * + cl->tlist[4].img_h * tex_y + 1]; cl->img.ptr[x * 4 + (cl->img.sizeline * y) + 2] = - (char)cl->tlist[4].ptr[cl->tlist[4].tex_x * 4 + 4 * - cl->tlist[4].img_h * tex_y + 2]; + (char)cl->tlist[4].ptr[cl->tlist[4].tex_x * 4 + 4 * + cl->tlist[4].img_h * tex_y + 2]; cl->img.ptr[x * 4 + cl->wlist->x_size * y + 3] = (char)0; } void ft_draw_sprite(t_cub *cl, int x) { - int hor_it;/*y*/ + int hor_it; int d; int tex_y; diff --git a/src/ft_draw_verline.c b/src/ft_draw_verline.c index e1bcb16..b0f9880 100644 --- a/src/ft_draw_verline.c +++ b/src/ft_draw_verline.c @@ -37,35 +37,37 @@ static void } } -/* #include <libft.h> */ -/* static void */ -/* ft_draw_ceil_tex(t_cub *cl, int x, int y) */ -/* { */ -/* int16_t i; */ -/* int32_t d; */ -/* int32_t tex_y; */ - -/* i = 0; */ -/* while (i < y) */ -/* { */ -/* d = i * 256 - cl->wlist->y_size * 128 + cl->rlist.line_h * 128; */ -/* d = (d <= 0) ? (-d) : (d); */ -/* ft_printf("%d\n", d); */ -/* tex_y = ((d * cl->tlist[1].img_h) / cl->rlist.line_h) / 256; */ -/* (tex_y <= 0) ? (tex_y = 1) : 0; */ -/* cl->img.ptr[x * 4 + (cl->img.sizeline * i)] = */ -/* (int8_t)cl->tlist[1].ptr[cl->tlist[1].tex_x * 4 + 4 * */ -/* cl->tlist[1].img_h * tex_y]; */ -/* cl->img.ptr[x * 4 + (cl->img.sizeline * i) + 1] = */ -/* (int8_t)cl->tlist[1].ptr[cl->tlist[1].tex_x * 4 + 4 * */ -/* cl->tlist[1].img_h * tex_y + 1]; */ -/* cl->img.ptr[x * 4 + (cl->img.sizeline * i) + 2] = */ -/* (int8_t)cl->tlist[1].ptr[cl->tlist[1].tex_x * 4 + 4 * */ -/* cl->tlist[1].img_h * tex_y + 2]; */ -/* cl->img.ptr[x * 4 + cl->wlist->x_size * i + 3] = (char)0; */ -/* i++; */ -/* } */ -/* } */ +/* +** #include <libft.h> +** static void +** ft_draw_ceil_tex(t_cub *cl, int x, int y) +** { +** int16_t i; +** int32_t d; +** int32_t tex_y; +** +** i = 0; +** while (i < y) +** { +** d = i * 256 - cl->wlist->y_size * 128 + cl->rlist.line_h * 128; +** d = (d <= 0) ? (-d) : (d); +** ft_printf("%d\n", d); +** tex_y = ((d * cl->tlist[1].img_h) / cl->rlist.line_h) / 256; +** (tex_y <= 0) ? (tex_y = 1) : 0; +** cl->img.ptr[x * 4 + (cl->img.sizeline * i)] = +** (int8_t)cl->tlist[1].ptr[cl->tlist[1].tex_x * 4 + 4 * +** cl->tlist[1].img_h * tex_y]; +** cl->img.ptr[x * 4 + (cl->img.sizeline * i) + 1] = +** (int8_t)cl->tlist[1].ptr[cl->tlist[1].tex_x * 4 + 4 * +** cl->tlist[1].img_h * tex_y + 1]; +** cl->img.ptr[x * 4 + (cl->img.sizeline * i) + 2] = +** (int8_t)cl->tlist[1].ptr[cl->tlist[1].tex_x * 4 + 4 * +** cl->tlist[1].img_h * tex_y + 2]; +** cl->img.ptr[x * 4 + cl->wlist->x_size * i + 3] = (char)0; +** i++; +** } +** } +*/ int8_t ft_draw_verline(t_cub *cl, int32_t x, int32_t y, int32_t y2) @@ -77,7 +79,6 @@ int8_t (y2 < 0) ? (y2 = 0) : 0; ft_draw_ceil(cl, y, x); (cl->rlist.line_h <= 0) ? (cl->rlist.line_h = 1) : 0; - /* ft_draw_ceil_tex(cl, y, x); */ while (y < y2) { d = y * 256 - cl->wlist->y_size * 128 + cl->rlist.line_h * 128; diff --git a/src/ft_raycasting.c b/src/ft_raycasting.c index 7bfe82e..d51b77f 100644 --- a/src/ft_raycasting.c +++ b/src/ft_raycasting.c @@ -16,29 +16,44 @@ #include <stdlib.h> #include <math.h> -void +static void + ft_calc_sprite_norme(t_cub *cl) +{ + if (cl->sp_list.s_start_y < 0) + cl->sp_list.s_start_y = 0; + cl->sp_list.s_end_y = cl->sp_list.s_h / 2 + cl->wlist->y_size / 2; + if (cl->sp_list.s_end_y > (int)cl->wlist->y_size) + cl->sp_list.s_end_y = cl->wlist->y_size - 1; + cl->sp_list.s_w = abs((int)(cl->wlist->x_size + * cl->sp_list.sprite_transform_y)); /*sprite width*/ + cl->sp_list.s_start_x = -cl->sp_list.s_w / 2 + cl->sp_list.s_screen_x; + if (cl->sp_list.s_start_x < 0) + cl->sp_list.s_start_y = 0; + cl->sp_list.s_end_x = cl->sp_list.s_w / 2 + cl->wlist->x_size; + if (cl->sp_list.s_end_x < (int)cl->wlist->x_size) + cl->sp_list.s_end_x = cl->wlist->x_size - 1; +} + +static void ft_calc_sprite(t_cub *cl) { cl->sp_list.s_x = cl->sp_list.s_pos_x - cl->plist->pos_x; cl->sp_list.s_y = cl->sp_list.s_pos_y - cl->plist->pos_y; - cl->sp_list.inv_c_m = 1.0 / (cl->plist->plane_x * cl->plist->dir_x - cl->plist->dir_y * cl->plist->plane_y); - cl->sp_list.sprite_transform_x = cl->sp_list.inv_c_m * (cl->plist->dir_y * cl->sp_list.s_x - cl->plist->dir_x * cl->sp_list.s_y); - cl->sp_list.sprite_transform_y = cl->sp_list.inv_c_m * (cl->plist->plane_y * cl->sp_list.s_x - cl->plist->plane_x * cl->sp_list.s_y); - cl->sp_list.s_screen_x = (int)((cl->wlist->y_size / 2) * (1 + cl->sp_list.sprite_transform_x / cl->sp_list.sprite_transform_y)); - cl->sp_list.s_h = abs((int)(cl->wlist->y_size * cl->sp_list.sprite_transform_y)); /*sprite height*/ - cl->sp_list.s_start_y = -cl->sp_list.s_h / 2 + cl->wlist->y_size / 2; - if (cl->sp_list.s_start_y < 0) - cl->sp_list.s_start_y = 0; - cl->sp_list.s_end_y = cl->sp_list.s_h / 2 + cl->wlist->y_size / 2; - if (cl->sp_list.s_end_y > (int)cl->wlist->y_size) - cl->sp_list.s_end_y = cl->wlist->y_size - 1;; - cl->sp_list.s_w = abs((int)(cl->wlist->x_size * cl->sp_list.sprite_transform_y)); /*sprite width*/ - cl->sp_list.s_start_x = -cl->sp_list.s_w / 2 + cl->sp_list.s_screen_x; - if (cl->sp_list.s_start_x < 0) - cl->sp_list.s_start_y = 0; - cl->sp_list.s_end_x = cl->sp_list.s_w / 2 + cl->wlist->x_size; - if (cl->sp_list.s_end_x < (int)cl->wlist->x_size) - cl->sp_list.s_end_x = cl->wlist->x_size - 1; + cl->sp_list.inv_c_m = 1.0 / (cl->plist->plane_x * cl->plist->dir_x + - cl->plist->dir_y * cl->plist->plane_y); + cl->sp_list.sprite_transform_x = cl->sp_list.inv_c_m + * (cl->plist->dir_y * cl->sp_list.s_x + - cl->plist->dir_x * cl->sp_list.s_y); + cl->sp_list.sprite_transform_y = cl->sp_list.inv_c_m + * (cl->plist->plane_y * cl->sp_list.s_x + - cl->plist->plane_x * cl->sp_list.s_y); + cl->sp_list.s_screen_x = (int)((cl->wlist->y_size / 2) + * (1 + cl->sp_list.sprite_transform_x + / cl->sp_list.sprite_transform_y)); + cl->sp_list.s_h = + abs((int)(cl->wlist->y_size * cl->sp_list.sprite_transform_y)); + cl->sp_list.s_start_y = -cl->sp_list.s_h / 2 + cl->wlist->y_size / 2; + ft_calc_sprite_norme(cl); } void @@ -50,7 +65,7 @@ void else clist->rlist.wall_hit_x = (clist->plist->pos_y) + clist->rlist.wall_dist * clist->rlist.x_ray_dir; - clist->rlist.wall_hit_x -= floor(clist->rlist.wall_hit_x); + clist->rlist.wall_hit_x -= floor(clist->rlist.wall_hit_x); clist->tlist[clist->w_side].tex_x = (int)(clist->rlist.wall_hit_x * (double)clist->tlist[clist->w_side].img_w); if (clist->rlist.side == 0 && clist->rlist.x_ray_dir > 0) |