Example #1
0
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));
}
Example #2
0
File: ray_throw.c Project: kube/RT
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;
		}
	}
}