rt/src/cut_save.c

92 lines
3.0 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* cut_save.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: ntrahy <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/01/02 22:16:41 by ntrahy #+# #+# */
/* Updated: 2017/01/07 14:48:03 by gbrochar ### ########.fr */
/* */
/* ************************************************************************** */
#include "rt.h"
void if_plane_cut_an_object(t_data *d, t_record *info,
t_thread *t)
{
int num;
num = t ? t->num : 0;
if (info->type == PLANE)
{
if (info->obj->solid->plane->cutted_obj[num] != NULL)
{
if (info->TO_PLANE->cut_type == 0)
{
apply_tf(info->obj->solid->plane->cutted_obj[num],
&(info->ray.dir), d, TF_RAY);
apply_tf(info->obj->solid->plane->cutted_obj[num],
&(info->ray.ori), d, TF_RAY);
apply_tf(info->obj->solid->plane->cutted_obj[num],
&(info->n_pos), d, TF_INTERSECTION);
apply_tf(info->obj->solid->plane->cutted_obj[num],
&info->normal, d, TF_NORMAL);
}
info->obj->solid->plane->cutted_obj[num] = NULL;
}
}
}
static void change_dist_zero(t_research *r, t_cut *cut, t_thread *t)
{
r->dist[0] = cut->final_dist;
r->dist[2] = cut->final_dist;
if (t)
r->current_obj->solid->plane->cutted_obj[t->num] = cut->cutted_obj;
else
r->current_obj->solid->plane->cutted_obj[0] = cut->cutted_obj;
}
static void change_dist_one(t_research *r, t_cut *cut)
{
r->dist[0] = cut->final_dist;
r->current_obj = cut->cutted_obj;
}
static void analyze_dist_p_n(t_research *r, t_cut *cut)
{
if (cut->final_dist_p == 0 && cut->final_dist_n == 0)
return ;
else if (cut->final_dist_p > ACC && cut->final_dist_n > ACC
&& cut->final_dist_p < cut->final_dist_n)
save_nothing(r, cut);
else if (cut->final_dist_p > ACC && cut->final_dist_n > ACC
&& cut->final_dist_p > cut->final_dist_n)
select_special_case(r, cut);
else if (cut->final_dist_p == 0)
select_negative_case(r, cut);
else if (cut->final_dist_n == 0)
select_positive_case(r, cut);
}
void save_dist(t_research *r, t_cut *cut, t_thread *t)
{
analyze_dist_p_n(r, cut);
if (cut->final_dist == 0)
return ;
else if (cut->final_dist > r->dist[0])
{
r->dist[1] = cut->final_dist;
r->dist[2] = cut->final_dist;
if (t)
r->current_obj->solid->plane->cutted_obj[t->num] = cut->cutted_obj;
else
r->current_obj->solid->plane->cutted_obj[0] = cut->cutted_obj;
}
else if (cut->final_dist > ACC && cut->final_dist < r->dist[0])
change_dist_zero(r, cut, t);
else
change_dist_one(r, cut);
}