ray.c
1 /* ************************************************************************** */ 2 /* */ 3 /* ::: :::::::: */ 4 /* ray.c :+: :+: :+: */ 5 /* +:+ +:+ +:+ */ 6 /* By: gychoi <gychoi@student.42seoul.kr> +#+ +:+ +#+ */ 7 /* +#+#+#+#+#+ +#+ */ 8 /* Created: 2023/05/04 16:00:11 by gychoi #+# #+# */ 9 /* Updated: 2023/05/07 22:51:44 by gychoi ### ########.fr */ 10 /* */ 11 /* ************************************************************************** */ 12 13 #include "header.h" 14 15 t_ray ray(t_point3 origin, t_vec3 direction) 16 { 17 t_ray ray; 18 19 ray.origin = origin; 20 ray.direction = direction; 21 return (ray); 22 } 23 24 t_point3 ray_at(t_ray ray, double t) 25 { 26 t_point3 at; 27 28 at = vadd_v(ray.origin, vmul_d(ray.direction, t)); 29 return (at); 30 } 31 32 t_ray ray_primary(t_camera cam, double u, double v) 33 { 34 t_ray ray; 35 36 ray.origin = cam.origin; 37 ray.direction = \ 38 vunit( \ 39 vsub_v( \ 40 vadd_v( \ 41 vadd_v( \ 42 cam.left_bottom, vmul_d(cam.horizontal, u) \ 43 ), \ 44 vmul_d(cam.vertical, v) \ 45 ), cam.origin) \ 46 ); 47 return (ray); 48 } 49 50 t_hit_record record_init(void) 51 { 52 t_hit_record record; 53 54 record.tmin = EPSILON; 55 record.tmax = INFINITY; 56 return (record); 57 } 58 59 t_color3 ray_color(t_scene *scene) 60 { 61 double t; 62 t_vec3 n; 63 t_hit_record rec; 64 65 scene->rec = record_init(); 66 if (hit(scene->world, scene->ray, &scene->rec)) 67 return (phong_lighting(scene)); 68 t = 0.5 * (scene->ray.direction.y + 1.0); 69 return (vadd_v \ 70 (vmul_d(color3(1, 1, 1), 1.0 - t), vmul_d(color3(0.5, 0.7, 1.0), t) \ 71 )); 72 }