Advertisement
Guest User

Untitled

a guest
Jun 25th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.86 KB | None | 0 0
  1. /* ************************************************************************** */
  2. /* */
  3. /* ::: :::::::: */
  4. /* raycast.c :+: :+: :+: */
  5. /* +:+ +:+ +:+ */
  6. /* By: cyrillefrouin <cyrillefrouin@student.42.fr>+#+ +:+ +#+ */
  7. /* +#+#+#+#+#+ +#+ */
  8. /* Created: 2018/06/25 15:47:43 by cyrillefrouin #+# #+# */
  9. /* Updated: 2018/06/25 15:47:57 by cyrillefrouin ### ########.fr */
  10. /* */
  11. /* ************************************************************************** */
  12.  
  13. #include "wolf3d.h"
  14.  
  15. int draw_ray(t_data *data)
  16. {
  17. for (int x = 0; x < data->width; x++)
  18. {
  19. double cameraX = 2 * x / (double)data->width - 1;
  20. double rayDirX = data->dir.x + data->plane.x * cameraX;
  21. double rayDirY = data->dir.y + data->dir.y * cameraX;
  22.  
  23. int mapX = (int)data->dir.x;
  24. int mapY = (int)data->dir.y;
  25.  
  26. double sideDistX;
  27. double sideDistY;
  28.  
  29. double deltaDistX = fabs(1 / rayDirX);
  30. double deltaDistY = fabs(1 / rayDirY);
  31. double perpWallDist;
  32.  
  33. int stepX;
  34. int stepY;
  35.  
  36. int hit = 0;
  37. int side;
  38.  
  39. if (rayDirX < 0)
  40. {
  41. stepX = -1;
  42. sideDistX = (data->dir.x - mapX) * deltaDistX;
  43. }
  44. else
  45. {
  46. stepX = 1;
  47. sideDistX = (mapX + 1.0 - data->dir.x) * deltaDistX;
  48. }
  49. if (rayDirY < 0)
  50. {
  51. stepY = -1;
  52. sideDistY = (data->dir.y - mapY) * deltaDistY;
  53. }
  54. else
  55. {
  56. stepY = 1;
  57. sideDistY = (mapY + 1.0 - data->dir.y) * deltaDistY;
  58. }
  59.  
  60. int iter = 0;
  61. while (hit == 0 && iter < 50)
  62. {
  63. if (sideDistX < sideDistY)
  64. {
  65. sideDistX += deltaDistX;
  66. mapX += stepX;
  67. side = 0;
  68. }
  69. else
  70. {
  71. sideDistY += deltaDistY;
  72. mapY += stepY;
  73. side = 1;
  74. }
  75. if (mapX >= 0 && mapY >= 0 && data->map.map[mapX][mapY] > 0) hit = 1;
  76. iter++;
  77. }
  78. if (side == 0) perpWallDist = (mapX - data->pos.x + (1 - stepX) / 2) / rayDirX;
  79. else perpWallDist = (mapY - data->pos.y + (1 - stepY) / 2) / rayDirY;
  80.  
  81. int lineHeight = (int)(data->height / perpWallDist);
  82.  
  83. int drawStart = -lineHeight / 2 + data->height / 2;
  84. if (drawStart < 0) drawStart = 0;
  85. int drawEnd = lineHeight / 2 + data->height / 2;
  86. if (drawEnd >= data->height) drawEnd = data->height - 1;
  87.  
  88. unsigned int color = 0xAAAA00;
  89. if (side == 1)
  90. color /= 2;
  91.  
  92. t_vector_i start = {x, drawStart};
  93. t_vector_i end = {x, drawEnd};
  94. put_line_in_image(data, start, end, color);
  95. // ft_printf("Finished drawing line %d\n", x);
  96. }
  97.  
  98. mlx_put_image_to_window(data->mlx, data->win, data->img, 0, 0);
  99. return (1);
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement