Example #1
0
File: hit.c Project: Elytum/rtv1
int			find_closest(t_data *data, const int get_normal)
{
	data->closest[1] = -1;
	if (get_normal == 1)
	{
		find_closest_sphere(data, data->viewray, &(data->t));
		find_closest_plane(data, data->viewray, &(data->t));
		find_closest_cone(data, data->viewray, &(data->t));
		find_closest_cylinder(data, data->viewray, &(data->t));
		if (data->closest[1] == -1)
			return (0);
		if (data->closest[0] == SPHERE)
			return (sphere_normal(data));
		else if (data->closest[0] == PLANE)
			return (plane_normal(data));
		else if (data->closest[0] == CYLINDER)
			return (cylinder_normal(data));
		else if (data->closest[0] == CONE)
			return (cone_normal(data));
		return (1);
	}
	return (hit_any_sphere(data, data->lightray, data->t) ||
			hit_any_plane(data, data->lightray, data->t) ||
			hit_any_cone(data, data->lightray, data->t) ||
			hit_any_cylinder(data, data->lightray, data->t));
}
Example #2
0
void			cylinder_inter(t_inter *inter, void *obj, t_ray ray,
								t_light *light)
{
	t_cylinder	cylinder;
	double		dist;
	t_ray		temp;

	cylinder = *((t_cylinder *)obj);
	temp = ray;
	change_frame(&ray, cylinder.inv, vector_inverse(cylinder.trans));
	dist = cylinder_distance(ray, cylinder);
	if (dist > EPS && (inter->dist == NULL || dist < *(inter->dist) - EPS))
	{
		if (inter->dist == NULL)
			inter->dist = malloc(sizeof(double));
		free_light_ray_list(inter);
		*(inter->dist) = dist;
		inter->pos = calculate_position(ray, dist);
		inter->normal = cylinder_normal(inter->pos, cylinder);
		if (vector_dot_product(inter->normal, ray.dir) > 0)
			inter->normal = vector_inverse(inter->normal);
		op_inv(cylinder.trans, cylinder.rot, &(inter->normal), &(inter->pos));
		inter->refl = calculate_reflection(temp, inter->normal);
		inter->color = cylinder.color;
		create_light_ray_list(inter, light, inter->pos);
		inter->refl_val = cylinder.refl;
	}
}