Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* ************************************************************************** */
- /* */
- /* ::: :::::::: */
- /* raycast.c :+: :+: :+: */
- /* +:+ +:+ +:+ */
- /* By: cyrillefrouin <cyrillefrouin@student.42.fr>+#+ +:+ +#+ */
- /* +#+#+#+#+#+ +#+ */
- /* Created: 2018/06/25 15:47:43 by cyrillefrouin #+# #+# */
- /* Updated: 2018/06/25 15:47:57 by cyrillefrouin ### ########.fr */
- /* */
- /* ************************************************************************** */
- #include "wolf3d.h"
- int draw_ray(t_data *data)
- {
- for (int x = 0; x < data->width; x++)
- {
- double cameraX = 2 * x / (double)data->width - 1;
- double rayDirX = data->dir.x + data->plane.x * cameraX;
- double rayDirY = data->dir.y + data->dir.y * cameraX;
- int mapX = (int)data->dir.x;
- int mapY = (int)data->dir.y;
- double sideDistX;
- double sideDistY;
- double deltaDistX = fabs(1 / rayDirX);
- double deltaDistY = fabs(1 / rayDirY);
- double perpWallDist;
- int stepX;
- int stepY;
- int hit = 0;
- int side;
- if (rayDirX < 0)
- {
- stepX = -1;
- sideDistX = (data->dir.x - mapX) * deltaDistX;
- }
- else
- {
- stepX = 1;
- sideDistX = (mapX + 1.0 - data->dir.x) * deltaDistX;
- }
- if (rayDirY < 0)
- {
- stepY = -1;
- sideDistY = (data->dir.y - mapY) * deltaDistY;
- }
- else
- {
- stepY = 1;
- sideDistY = (mapY + 1.0 - data->dir.y) * deltaDistY;
- }
- int iter = 0;
- while (hit == 0 && iter < 50)
- {
- if (sideDistX < sideDistY)
- {
- sideDistX += deltaDistX;
- mapX += stepX;
- side = 0;
- }
- else
- {
- sideDistY += deltaDistY;
- mapY += stepY;
- side = 1;
- }
- if (mapX >= 0 && mapY >= 0 && data->map.map[mapX][mapY] > 0) hit = 1;
- iter++;
- }
- if (side == 0) perpWallDist = (mapX - data->pos.x + (1 - stepX) / 2) / rayDirX;
- else perpWallDist = (mapY - data->pos.y + (1 - stepY) / 2) / rayDirY;
- int lineHeight = (int)(data->height / perpWallDist);
- int drawStart = -lineHeight / 2 + data->height / 2;
- if (drawStart < 0) drawStart = 0;
- int drawEnd = lineHeight / 2 + data->height / 2;
- if (drawEnd >= data->height) drawEnd = data->height - 1;
- unsigned int color = 0xAAAA00;
- if (side == 1)
- color /= 2;
- t_vector_i start = {x, drawStart};
- t_vector_i end = {x, drawEnd};
- put_line_in_image(data, start, end, color);
- // ft_printf("Finished drawing line %d\n", x);
- }
- mlx_put_image_to_window(data->mlx, data->win, data->img, 0, 0);
- return (1);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement