update norm
This commit is contained in:
@@ -6,63 +6,71 @@
|
||||
/* By: yantoine <yantoine@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2025/02/17 19:07:07 by yantoine #+# #+# */
|
||||
/* Updated: 2025/02/19 16:30:27 by yantoine ### ########.fr */
|
||||
/* Updated: 2025/02/19 16:37:40 by yantoine ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#include "miniRT.h"
|
||||
|
||||
// Calcule l'éclairage (ambiant, diffus et spéculaire) sur un point d'impact
|
||||
t_vec3 calc_lighting(t_vec3 hitPoint, t_vec3 hitNormal, t_vec3 objColor,
|
||||
t_scene scene)
|
||||
static t_vec3 clamp_color(t_vec3 color)
|
||||
{
|
||||
int i;
|
||||
t_calc calc;
|
||||
if (color.x > 1.0f)
|
||||
color.x = 1.0f;
|
||||
if (color.y > 1.0f)
|
||||
color.y = 1.0f;
|
||||
if (color.z > 1.0f)
|
||||
color.z = 1.0f;
|
||||
return color;
|
||||
}
|
||||
|
||||
calc.color = vec3_scale(objColor, scene.ambient.ratio);
|
||||
i = 0;
|
||||
while (i < scene.numLights)
|
||||
{
|
||||
calc.light = scene.lights[i];
|
||||
calc.l = vec3_normalize(vec3_sub(calc.light.pos, hitPoint));
|
||||
if (!is_in_shadow(hitPoint, calc.light.pos, scene))
|
||||
{
|
||||
calc.diff = fmaxf(0.0f, vec3_dot(hitNormal, calc.l));
|
||||
calc.view_dir = vec3_normalize(vec3_sub(scene.camera.camPos, hitPoint));
|
||||
calc.half_dir = vec3_normalize(vec3_add(calc.l, calc.view_dir));
|
||||
calc.spec = powf(fmaxf(0.0f, vec3_dot(hitNormal, calc.half_dir)), 32.0f);
|
||||
calc.color = vec3_add(calc.color, vec3_scale(vec3_mul(objColor, calc.light.color),
|
||||
calc.diff * calc.light.brightness));
|
||||
calc.color = vec3_add(calc.color, vec3_scale((t_vec3){1, 1, 1}, calc.spec
|
||||
* calc.light.brightness));
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if (calc.color.x > 1.0f)
|
||||
calc.color.x = 1.0f;
|
||||
if (calc.color.y > 1.0f)
|
||||
calc.color.y = 1.0f;
|
||||
if (calc.color.z > 1.0f)
|
||||
calc.color.z = 1.0f;
|
||||
return (calc.color);
|
||||
static t_vec3 calc_light_contribution(t_hit_info hit, t_light light, t_camera camera, t_scene scene)
|
||||
{
|
||||
t_vec3 l = vec3_normalize(vec3_sub(light.pos, hit.point)); // Variable 1
|
||||
if (is_in_shadow(hit.point, light.pos, scene))
|
||||
return (t_vec3){0, 0, 0};
|
||||
float diff = fmaxf(0.0f, vec3_dot(hit.normal, l)); // Variable 2
|
||||
t_vec3 view_dir = vec3_normalize(vec3_sub(camera.camPos, hit.point)); // Variable 3
|
||||
t_vec3 half_dir = vec3_normalize(vec3_add(l, view_dir)); // Variable 4
|
||||
float spec = powf(fmaxf(0.0f, vec3_dot(hit.normal, half_dir)), 32.0f); // Variable 5
|
||||
return vec3_add(
|
||||
vec3_scale(vec3_mul(hit.color, light.color), diff * light.brightness),
|
||||
vec3_scale((t_vec3){1, 1, 1}, spec * light.brightness));
|
||||
}
|
||||
|
||||
t_vec3 calc_lighting(t_vec3 hit_point, t_vec3 hit_normal, t_vec3 obj_color, t_scene scene)
|
||||
{
|
||||
t_vec3 color = vec3_scale(obj_color, scene.ambient.ratio); // Variable 1
|
||||
t_hit_info hit; // Variable 2
|
||||
hit.point = hit_point;
|
||||
hit.normal = hit_normal;
|
||||
hit.color = obj_color;
|
||||
int i = 0; // Variable 3
|
||||
while (i < scene.numLights)
|
||||
{
|
||||
color = vec3_add(color,
|
||||
calc_light_contribution(hit, scene.lights[i], scene.camera, scene));
|
||||
i++;
|
||||
}
|
||||
return clamp_color(color);
|
||||
}
|
||||
|
||||
// Fonction principale de lancer de rayon (trace)
|
||||
t_vec3 trace(t_ray ray, t_scene scene)
|
||||
{
|
||||
float tMin;
|
||||
t_vec3 hitNormal;
|
||||
t_vec3 objColor;
|
||||
t_vec3 hitPoint;
|
||||
float t_min;
|
||||
t_vec3 hit_normal;
|
||||
t_vec3 obj_color;
|
||||
t_vec3 hit_point;
|
||||
|
||||
tMin = 1e9;
|
||||
hitNormal = (t_vec3){0, 0, 0};
|
||||
objColor = (t_vec3){0, 0, 0};
|
||||
t_min = 1e9;
|
||||
hit_normal = (t_vec3){0, 0, 0};
|
||||
obj_color = (t_vec3){0, 0, 0};
|
||||
scene.ray = ray;
|
||||
if (intersect_objects(&tMin, &hitNormal, &objColor, scene))
|
||||
if (intersect_objects(&t_min, &hit_normal, &obj_color, scene))
|
||||
{
|
||||
hitPoint = vec3_add(scene.ray.origin, vec3_scale(scene.ray.dir, tMin));
|
||||
return (calc_lighting(hitPoint, hitNormal, objColor, scene));
|
||||
hit_point = vec3_add(scene.ray.origin, \
|
||||
vec3_scale(scene.ray.dir, t_min));
|
||||
return (calc_lighting(hit_point, hit_normal, obj_color, scene));
|
||||
}
|
||||
return ((t_vec3){0, 0, 0}); // Couleur de fond (ciel)
|
||||
return ((t_vec3){0, 0, 0});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user