diff options
| author | Rudy Bousset <rbousset@z2r4p3.le-101.fr> | 2020-03-09 19:28:45 +0100 | 
|---|---|---|
| committer | Rudy Bousset <rbousset@z2r4p3.le-101.fr> | 2020-03-09 19:28:45 +0100 | 
| commit | 0b14b6447562d2ce7814fc188c988fb1cbf890c2 (patch) | |
| tree | e84889ea7edd1b3b4b6b072544e1a0f672a07243 /src | |
| parent | Merge branch 'shpritz' (diff) | |
| download | 42-cub3d-0b14b6447562d2ce7814fc188c988fb1cbf890c2.tar.gz 42-cub3d-0b14b6447562d2ce7814fc188c988fb1cbf890c2.tar.bz2 42-cub3d-0b14b6447562d2ce7814fc188c988fb1cbf890c2.tar.xz 42-cub3d-0b14b6447562d2ce7814fc188c988fb1cbf890c2.tar.zst 42-cub3d-0b14b6447562d2ce7814fc188c988fb1cbf890c2.zip  | |
Norme is pretty bav
Diffstat (limited to '')
| -rw-r--r-- | src/ft_draw_sprite.c | 161 | ||||
| -rw-r--r-- | src/ft_draw_sprite_extra.c | 68 | ||||
| -rw-r--r-- | src/ft_raycasting.c | 22 | ||||
| -rw-r--r-- | src/ft_tex_init.c | 2 | 
4 files changed, 154 insertions, 99 deletions
diff --git a/src/ft_draw_sprite.c b/src/ft_draw_sprite.c index 1393d38..203c48d 100644 --- a/src/ft_draw_sprite.c +++ b/src/ft_draw_sprite.c @@ -6,126 +6,105 @@  /*   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   */ +/*   Updated: 2020/03/09 18:56:01 by rbousset         ###   ########lyon.fr   */  /*                                                                            */  /* ************************************************************************** */  #include <libft.h>  #include <cub3d.h>  #include <stdint.h> -#include <stdio.h>  #include <stdlib.h>  #include <math.h> -void -  ft_sort_sprites(t_cub *cl) +static void +	ft_sort_sprites_norme(float *dist_tab, int32_t it, t_cub *cl)  { -  float    dist_tab[4096]; -  uint32_t tmp; -  int32_t it; +	uint32_t	tmp; -  it = 0; -  while (it < cl->mlist.sprite_nbr) -  { -    dist_tab[it] = ((cl->plist.pos_x - cl->sprites[it].s_pos_x) * -          (cl->plist.pos_x - cl->sprites[it].s_pos_x) + -          (cl->plist.pos_y - cl->sprites[it].s_pos_y) * -          (cl->plist.pos_y - cl->sprites[it].s_pos_y)); -    cl->mlist.sprite_order[it] = it; -    it++; -  } -  it = 0; -  while (it < cl->mlist.sprite_nbr) -  { -    if (dist_tab[it] > dist_tab[it + 1]) -    { -      tmp = dist_tab[it]; -      dist_tab[it] = dist_tab[it + 1]; -      dist_tab[it + 1] = tmp; -      tmp = cl->mlist.sprite_order[it]; -      cl->mlist.sprite_order[it] = cl->mlist.sprite_order[it + 1]; -      cl->mlist.sprite_order[it + 1] = tmp; -      it = 0; -    } -  } +	tmp = 0; +	if (dist_tab[it] > dist_tab[it + 1]) +	{ +		tmp = dist_tab[it]; +		dist_tab[it] = dist_tab[it + 1]; +		dist_tab[it + 1] = tmp; +		tmp = cl->mlist.sprite_order[it]; +		cl->mlist.sprite_order[it] = cl->mlist.sprite_order[it + 1]; +		cl->mlist.sprite_order[it + 1] = tmp; +		it = 0; +	}  }  void -	ft_sprite_height(t_cub *cl, t_sprite *sprite) +	ft_sort_sprites(t_cub *cl)  { -  sprite->spriteheight = abs((int)(cl->wlist.y_size / (sprite->transformy))); -  sprite->drawstarty = -sprite->spriteheight / 2 + cl->wlist.y_size / 2; -  if(sprite->drawstarty < 0) -    sprite->drawstarty = 0; -  sprite->drawendy = sprite->spriteheight / 2 + cl->wlist.y_size / 2; -  if(sprite->drawendy >= (int)cl->wlist.y_size) -    sprite->drawendy = cl->wlist.y_size - 1; -} +	float		dist_tab[4096]; +	int32_t		it; -void -	ft_sprite_width(t_cub *cl, t_sprite *sprite) -{ -  sprite->spritewidth = abs((int)(cl->wlist.x_size / (sprite->transformy))); -  sprite->drawstartx = -sprite->spritewidth / 2 + sprite->spritescreenx; -  if(sprite->drawstartx < 0) -    sprite->drawstartx = 0; -  sprite->drawendx = sprite->spritewidth / 2 + sprite->spritescreenx; -  if(sprite->drawendx >= (int)cl->wlist.x_size) sprite->drawendx = cl->wlist.x_size - 1; +	it = 0; +	while (it < cl->mlist.sprite_nbr) +	{ +		dist_tab[it] = ((cl->plist.pos_x - cl->sprites[it].s_pos_x) * +				(cl->plist.pos_x - cl->sprites[it].s_pos_x) + +				(cl->plist.pos_y - cl->sprites[it].s_pos_y) * +				(cl->plist.pos_y - cl->sprites[it].s_pos_y)); +		cl->mlist.sprite_order[it] = it; +		it++; +	} +	it = 0; +	while (it < cl->mlist.sprite_nbr) +	{ +		ft_sort_sprites_norme(dist_tab, it, cl); +	}  } -void -	ft_calc_sprite(t_cub *cl) +static void +	ft_put_sprite(t_sprite *sprite, t_cub *cl)  { -	t_sprite sprite; -  int i = 0; +	float		dist; +	float		calc; -  while (i < cl->mlist.sprite_nbr) -  { -    sprite = cl->sprites[i]; -    sprite.spritey = sprite.s_pos_x - (cl->plist.pos_x - 0.5); -    sprite.spritex = sprite.s_pos_y - (cl->plist.pos_y - 0.5); -    sprite.invdet = 1.0 / (cl->plist.plane_x * cl->plist.dir_y - cl->plist.dir_x * cl->plist.plane_y); -    sprite.transformx = sprite.invdet * (cl->plist.dir_y * sprite.spritex- cl->plist.dir_x* sprite.spritey); -    sprite.transformy = sprite.invdet * (-cl->plist.plane_y* sprite.spritex + cl->plist.plane_x * sprite.spritey); -    sprite.spritescreenx = (int)(cl->wlist.x_size / 2) * (1 + sprite.transformx / sprite.transformy); -    ft_sprite_height(cl, &sprite); -    ft_sprite_width(cl, &sprite); -    ft_draw_sprite(cl, &sprite); -    i++; -  } +	if ((dist = cl->rlist.wall_dist_tab[sprite->x]) <= 0) +		dist = 0.0001; +	calc = (dist * 0.1 * cl->mlist.darklvl); +	calc = (calc >= 255) ? (255) : (calc); +	calc = (calc < 1) ? (1) : (calc); +	cl->img.ptr[sprite->x * 4 + (sprite->y * cl->img.sizeline)] = +		(uint8_t)cl->tlist[4].ptr[sprite->tex_x * 4 + 4 * +		cl->tlist[4].img_h * sprite->tex_y] / calc; +	cl->img.ptr[sprite->x * 4 + (sprite->y * cl->img.sizeline) + 1] = +		(uint8_t)cl->tlist[4].ptr[sprite->tex_x * 4 + 4 * +		cl->tlist[4].img_h * sprite->tex_y + 1] / calc; +	cl->img.ptr[sprite->x * 4 + (sprite->y * cl->img.sizeline) + 2] = +		(uint8_t)cl->tlist[4].ptr[sprite->tex_x * 4 + 4 * +		cl->tlist[4].img_h * sprite->tex_y + 2] / calc; +	cl->img.ptr[sprite->x * 4 + cl->wlist.x_size * sprite->y + 3] = (char)0;  }  void  	ft_draw_sprite(t_cub *cl, t_sprite *sprite)  { -	int32_t d; +	int32_t	d;  	sprite->x = sprite->drawstartx;  	while (sprite->x < sprite->drawendx)  	{  		sprite->tex_x = (int32_t)((sprite->x - (-sprite->spritewidth / 2 + -		sprite->spritescreenx)) * cl->tlist[4].img_w / sprite->spritewidth); +			sprite->spritescreenx)) * cl->tlist[4].img_w / sprite->spritewidth);  		sprite->y = sprite->drawstarty; -    while (sprite->y < sprite->drawendy) -    { -      d = sprite->y * 256 - cl->wlist.y_size * 128 + -      sprite->spriteheight * 128; -      sprite->tex_y = ((d * cl->tlist[4].img_h / 2) / -      sprite->spriteheight) / 128; -      if (cl->tlist[4].ptr[sprite->tex_x * 4 + 4 * cl->tlist[4].img_h * sprite->tex_y] -          && cl->rlist.wall_dist_tab[sprite->x] > sprite->transformy) -      { -        cl->img.ptr[sprite->x * 4 + (sprite->y * cl->img.sizeline)] = -        cl->tlist[4].ptr[sprite->tex_x * 4 + 4 * cl->tlist[4].img_h * sprite->tex_y]; -        cl->img.ptr[sprite->x * 4 + (sprite->y * -        cl->img.sizeline) + 1] = -        cl->tlist[4].ptr[sprite->tex_x * 4 + 4 * cl->tlist[4].img_h * sprite->tex_y + 1]; -        cl->img.ptr[sprite->x * 4 + (sprite->y * -        cl->img.sizeline) + 2] = -        cl->tlist[4].ptr[sprite->tex_x * 4 + 4 * cl->tlist[4].img_h * sprite->tex_y + 2]; -      } -      sprite->y++; -    } -  sprite->x++; -  } +		while (sprite->y < sprite->drawendy) +		{ +			d = sprite->y * 256 - cl->wlist.y_size * 128 + +				sprite->spriteheight * 128; +			sprite->tex_y = ((d * cl->tlist[4].img_h / 2) / +					sprite->spriteheight) / 128; +			if (cl->tlist[4].ptr[sprite->tex_x * 4 + 4 * +				cl->tlist[4].img_h * sprite->tex_y] +				&& cl->rlist.wall_dist_tab[sprite->x] > sprite->transformy) +			{ +				ft_put_sprite(sprite, cl); +			} +			sprite->y++; +		} +		sprite->x++; +	}  } diff --git a/src/ft_draw_sprite_extra.c b/src/ft_draw_sprite_extra.c new file mode 100644 index 0000000..73b8959 --- /dev/null +++ b/src/ft_draw_sprite_extra.c @@ -0,0 +1,68 @@ +/* ************************************************************************** */ +/*                                                                            */ +/*                                                        :::      ::::::::   */ +/*   ft_draw_sprite_extra.c                             :+:      :+:    :+:   */ +/*                                                    +:+ +:+         +:+     */ +/*   By: rbousset <marvin@42.fr>                    +#+  +:+       +#+        */ +/*                                                +#+#+#+#+#+   +#+           */ +/*   Created: 2020/02/24 20:22:45 by rbousset          #+#    #+#             */ +/*   Updated: 2020/03/09 18:56:01 by rbousset         ###   ########lyon.fr   */ +/*                                                                            */ +/* ************************************************************************** */ + +#include <libft.h> +#include <cub3d.h> +#include <stdint.h> +#include <stdlib.h> +#include <math.h> + +void +	ft_sprite_height(t_cub *cl, t_sprite *sprite) +{ +	sprite->spriteheight = abs((int)(cl->wlist.y_size / (sprite->transformy))); +	sprite->drawstarty = -sprite->spriteheight / 2 + cl->wlist.y_size / 2; +	if (sprite->drawstarty < 0) +		sprite->drawstarty = 0; +	sprite->drawendy = sprite->spriteheight / 2 + cl->wlist.y_size / 2; +	if (sprite->drawendy >= (int)cl->wlist.y_size) +		sprite->drawendy = cl->wlist.y_size - 1; +} + +void +	ft_sprite_width(t_cub *cl, t_sprite *sprite) +{ +	sprite->spritewidth = abs((int)(cl->wlist.x_size / (sprite->transformy))); +	sprite->drawstartx = -sprite->spritewidth / 2 + sprite->spritescreenx; +	if (sprite->drawstartx < 0) +		sprite->drawstartx = 0; +	sprite->drawendx = sprite->spritewidth / 2 + sprite->spritescreenx; +	if (sprite->drawendx >= (int)cl->wlist.x_size) +		sprite->drawendx = cl->wlist.x_size - 1; +} + +void +	ft_calc_sprite(t_cub *cl) +{ +	t_sprite	sprite; +	int32_t		i; + +	i = 0; +	while (i < cl->mlist.sprite_nbr) +	{ +		sprite = cl->sprites[i]; +		sprite.spritey = sprite.s_pos_x - (cl->plist.pos_x - 0.5); +		sprite.spritex = sprite.s_pos_y - (cl->plist.pos_y - 0.5); +		sprite.invdet = 1.0 / (cl->plist.plane_x * cl->plist.dir_y +			- cl->plist.dir_x * cl->plist.plane_y); +		sprite.transformx = sprite.invdet * (cl->plist.dir_y * sprite.spritex +			- cl->plist.dir_x * sprite.spritey); +		sprite.transformy = sprite.invdet * (-cl->plist.plane_y * sprite.spritex +			+ cl->plist.plane_x * sprite.spritey); +		sprite.spritescreenx = (int)(cl->wlist.x_size / 2) * +			(1 + sprite.transformx / sprite.transformy); +		ft_sprite_height(cl, &sprite); +		ft_sprite_width(cl, &sprite); +		ft_draw_sprite(cl, &sprite); +		i++; +	} +} diff --git a/src/ft_raycasting.c b/src/ft_raycasting.c index 9657b18..3cbd368 100644 --- a/src/ft_raycasting.c +++ b/src/ft_raycasting.c @@ -67,6 +67,19 @@ static void  	}  } +static void +	ft_castray_norme(uint16_t i, t_win *wl, t_cub *cl) +{ +	ft_initray(i, cl); +	cl->rlist.line_h = (int16_t)(wl->y_size / cl->rlist.wall_dist); +	cl->rlist.wall_t = -cl->rlist.line_h / 2 + wl->y_size / 2; +	if (cl->rlist.wall_t < 0) +		cl->rlist.wall_t = 0; +	cl->rlist.wall_b = cl->rlist.line_h / 2 + wl->y_size / 2; +	if (cl->rlist.wall_b >= (float)wl->y_size) +		cl->rlist.wall_b = wl->y_size - 1; +} +  void  	ft_castray(t_cub *cl)  { @@ -85,14 +98,7 @@ void  	i = 0;  	while (i < wl->x_size)  	{ -		ft_initray(i, cl); -		cl->rlist.line_h = (int16_t)(wl->y_size / cl->rlist.wall_dist); -		cl->rlist.wall_t = -cl->rlist.line_h / 2 + wl->y_size / 2; -		if (cl->rlist.wall_t < 0) -			cl->rlist.wall_t = 0; -		cl->rlist.wall_b = cl->rlist.line_h / 2 + wl->y_size / 2; -		if (cl->rlist.wall_b >= (float)wl->y_size) -			cl->rlist.wall_b = wl->y_size - 1; +		ft_castray_norme(i, wl, cl);  		ft_choose_tex(cl);  		ft_calc_tex(cl);  		ft_draw_verline(cl, i, cl->rlist.wall_t, cl->rlist.wall_b); diff --git a/src/ft_tex_init.c b/src/ft_tex_init.c index adc7fd0..38e4c77 100644 --- a/src/ft_tex_init.c +++ b/src/ft_tex_init.c @@ -22,6 +22,8 @@  ** 3 : we  ** 4 : sprite  ** 5 : new level door +** 6 : floor +** 7 : ceil  */  static void  | 
