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)); }
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; } }