72 lines
2.4 KiB
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);
|
|
}
|