static int ft_shadow(t_th *mlx, t_obj *tmp, t_obj *light, t_vec pos) { t_obj *node; t_vec dist; node = mlx->obj; dist = ft_vectorsub(&light->pos, &pos); mlx->t = sqrtf(ft_vectordot(&dist, &dist)); ft_vectornorm(&dist); while (node != NULL) { if (node != tmp) { if (node->type == 1) mlx->a = ft_inter_cone(mlx, node, dist, pos); else if (node->type == 2) mlx->a = ft_inter_cylinder(mlx, node, dist, pos); else if (node->type == 3) mlx->a = ft_inter_plane(mlx, node, dist, pos); else if (node->type == 4) mlx->a = ft_inter_sphere(mlx, node, dist, pos); if (mlx->a > 0.0001 && mlx->a < mlx->t) return (1); } node = node->next; } return (0); }
static t_obj *ft_ref_inter(t_th *mlx, t_obj *node, t_obj *tmp, t_vec pos) { t_obj *tmp2; double dist; tmp2 = NULL; while (node != NULL) { if (node != tmp) { if (node->type == 1) dist = ft_inter_cone(mlx, node, mlx->ref, pos); else if (node->type == 2) dist = ft_inter_cylinder(mlx, node, mlx->ref, pos); else if (node->type == 3) dist = ft_inter_plane(mlx, node, mlx->ref, pos); else if (node->type == 4) dist = ft_inter_sphere(mlx, node, mlx->ref, pos); if (dist > 0.0001 && dist < mlx->t) { tmp2 = node; mlx->t = dist; } } node = node->next; } return (tmp2); }
double ft_cone(t_obj *obj, t_vector vec, t_scene *sc) { t_eq eq; t_vector rot; rot.x = sc->rot.x + obj->rot.x; rot.y = sc->rot.y + obj->rot.y; rot.z = sc->rot.z + obj->rot.z; vec = ft_rotate(vec, &rot); eq = ft_inter_cone(obj, vec); if (eq.t1 > eq.t2 && eq.t2 > 0) return (eq.t2); else if (eq.t1 < eq.t2 && eq.t1 > 0) return (eq.t1); return (0); }