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  }