64 lines
1.8 KiB
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);
|
|
}
|