rtv1/src/raytrace.c

64 lines
1.8 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* raytrace.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: gbrochar <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2019/02/07 15:35:45 by gbrochar #+# #+# */
/* Updated: 2019/02/13 18:57:43 by gbrochar ### ########.fr */
/* */
/* ************************************************************************** */
#include "rtv1.h"
t_obj_list *intersect_ray(t_env *e, t_ray r)
{
t_obj_list *browser;
t_obj_list *closest_obj;
closest_obj = NULL;
browser = e->objs;
while (browser)
{
browser->t = e->func.intersect_obj[browser->type](browser->obj, r);
browser = browser->next;
}
browser = e->objs;
while (browser)
{
if (browser->t > 0 && (!closest_obj || browser->t < closest_obj->t))
closest_obj = browser;
browser = browser->next;
}
return (closest_obj);
}
void raytrace_pixel(t_env *e, int x, int y)
{
t_ray r;
t_obj_list *closest_object;
r = set_ray(e, x, y);
closest_object = intersect_ray(e, r);
if (closest_object)
put_pixel(e, x, y, phong(e, r, closest_object));
else
put_pixel(e, x, y, color(0, 0, 0));
}
void raytrace(t_env *e)
{
int x;
int y;
y = -1;
while (++y < WINY)
{
x = -1;
while (++x < WINX)
raytrace_pixel(e, x, y);
}
mlx_put_image_to_window(e->mlx.ptr, e->mlx.win, e->mlx.img, 0, 0);
}