rt/src/rt_shadow.c

72 lines
2.4 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* shadow.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: scebula <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/10/01 16:49:56 by scebula #+# #+# */
/* Updated: 2017/01/03 15:58:22 by scebula ### ########.fr */
/* */
/* ************************************************************************** */
#include "rt.h"
void color_add_diffuse(t_color *final_color, t_record *info,
t_color light_color)
{
t_color obj_color;
obj_color = info->color;
color_multiply(&obj_color, light_color);
color_scale(&obj_color, info->cosinus * DIFFUSE);
color_add(final_color, obj_color);
}
void calculate_diffuse_and_specular(t_record *info, t_data *d,
t_color *final_color, t_light *light_list)
{
t_record *shadow_info;
char shadow;
shadow_info = NULL;
shadow = NOT_FOUND;
info->to_light_ray = init_ray(info->n_pos, info->to_light_dir);
shadow_info = find_n(info->to_light_ray, d, info->current_thread);
if (shadow_info)
if (shadow_info->dist <= info->dist_to_light)
shadow = FOUND;
if (shadow == NOT_FOUND)
{
color_add_diffuse(final_color, info, light_list->color);
specular_color(info, final_color, light_list);
}
free_info(shadow_info);
}
t_vect calculate_to_light_dir(t_vect light_pos,
t_vect n_pos)
{
substract_to_vector(&light_pos, n_pos);
light_pos.w = 0;
return (light_pos);
}
void add_diffuse_and_specular(t_record *info, t_data *d,
t_light *light_list, t_color *final_color)
{
t_record *shadow_info;
shadow_info = NULL;
info->to_light_dir = calculate_to_light_dir(light_list->pos,
info->n_pos);
info->dist_to_light = vector_magnitude(info->to_light_dir);
normalize_vector(&(info->to_light_dir));
if (dot_product_vector(info->oldnorm, info->to_light_dir) < 0)
return ;
info->cosinus = dot_product_vector(info->normal, info->to_light_dir);
if (info->cosinus > 0)
calculate_diffuse_and_specular(info, d, final_color, light_list);
free_info(shadow_info);
}