-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathft_file2.c
92 lines (81 loc) · 2.47 KB
/
ft_file2.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* ft_file2.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: ymoukhli <[email protected]> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2019/07/11 20:03:43 by ymoukhli #+# #+# */
/* Updated: 2019/07/11 20:24:17 by ymoukhli ### ########.fr */
/* */
/* ************************************************************************** */
#include "rtv1.h"
float ft_inter_cylinder(t_cam cam, t_obj obj, t_val *v)
{
t_vect x;
t_var var;
float t1;
x = vec_sub(cam.pos, obj.pos);
var.a = (vec_dot(cam.ray, cam.ray) - (vec_dot(cam.ray, obj.dir)
* vec_dot(cam.ray, obj.dir)));
var.b = 2 * (vec_dot(cam.ray, x) - (vec_dot(cam.ray, obj.dir)
* vec_dot(x, obj.dir)));
var.c = (vec_dot(x, x) - (vec_dot(x, obj.dir) *
vec_dot(x, obj.dir)) - (obj.rad * obj.rad));
var.d = var.b * var.b - (4 * var.a * var.c);
if (var.d < 0)
return (INFINIT);
var.t1 = (-var.b + sqrtf(var.d)) / (2 * var.a);
var.t2 = (-var.b - sqrtf(var.d)) / (2 * var.a);
if ((var.t1 < 0 && var.t2 < 0))
return (INFINIT);
t1 = ft_min_posi(var.t1, var.t2);
t1 -= 0.2;
if (t1 < v->dis)
v->m = vec_dot(cam.ray, obj.dir) * t1 + (vec_dot(x, obj.dir));
return (ft_min_posi(var.t1, var.t2));
}
void ft_sphere(t_cam cam, t_obj obj, t_val *v, int i)
{
float distance;
distance = ft_inter_sphere(cam, obj);
if (v->dis > distance)
{
v->dis = distance;
if (i == 1)
v->obj = obj;
}
}
void ft_plane(t_cam cam, t_obj obj, t_val *v, int i)
{
float distance;
distance = ft_inter_plane(cam, obj);
if (v->dis > distance)
{
v->dis = distance;
if (i == 1)
v->obj = obj;
}
}
void ft_cone(t_cam cam, t_obj obj, t_val *v, int i)
{
float distance;
distance = ft_inter_cone(cam, obj, v);
if (v->dis > distance)
{
v->dis = distance;
if (i == 1)
v->obj = obj;
}
}
void ft_cylinder(t_cam cam, t_obj obj, t_val *v, int i)
{
float distance;
distance = ft_inter_cylinder(cam, obj, v);
if (v->dis > distance)
{
v->dis = distance;
if (i == 1)
v->obj = obj;
}
}