t_vec3f single_tracer(t_params p, t_ray *ray, t_objects *sp) { int i; t_vec3f trans; t_vec3f tmp; t_vec3f light_dir; t_color scolor; i = 0; if (dot_vec3f(&ray->dir, &p.nhit) > 0) p.nhit = scale_vec3f(&p.nhit, -1); scolor = new_uni_color(0); while (i < sp->top) { if (sp->store[i].type == LIGHT) { light_dir = normalize_vec3f(sub_vec3f(&sp->store[i].pos, &p.phit)); if (sp->store[i].nature == AREA_LIGHT) trans = soft_shadows(p, ray, sp, i); else trans = sharp_shadows(p, ray, sp, light_dir); tmp = phong_shading(trans, ray, p, light_dir, sp->store[i].ecolor); scolor = add_vec3f(&scolor, &tmp); } i++; } return (add_vec3f(&scolor, &p.sphere->ecolor)); }
void throw_ray(t_ray *ray, int calculate_light, t_object *to_ignore, int recursivity) { float tmp_t; t_object *obj; t_ray reflected; obj = env->scene->objects; ray->inter_t = INFINITY; ray->closest = NULL; ray->color.red = 0.0; ray->color.green = 0.0; ray->color.blue = 0.0; while (obj) { if (!to_ignore || obj != to_ignore) { tmp_t = intersection(obj, ray); ray->closest = (tmp_t < ray->inter_t) ? obj : ray->closest; ray->inter_t = (tmp_t < ray->inter_t) ? tmp_t : ray->inter_t; tmp_t = INFINITY; } obj = obj->next; } if (calculate_light && ray->inter_t != INFINITY) { phong_shading(ray); if (ray->closest->reflection > 0.0 && recursivity > 0) { calculate_reflected(ray, &reflected); throw_ray(&reflected, 1, ray->closest, recursivity - 1); ray->color.red *= (1 - ray->closest->reflection); ray->color.green *= (1 - ray->closest->reflection); ray->color.blue *= (1 - ray->closest->reflection); if (reflected.closest) ray->color.r += ray->closest->reflection * reflected.color.r; ray->color.g += ray->closest->reflection * reflected.color.g; ray->color.b += ray->closest->reflection * reflected.color.b; } } }