-
Notifications
You must be signed in to change notification settings - Fork 1
/
Vec3.cpp
105 lines (85 loc) · 2.18 KB
/
Vec3.cpp
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
93
94
95
96
97
98
99
100
101
102
103
104
105
#include "Utils.h"
#include "Vec3.h"
Vec3
Vec3::ColorBlack()
{
return Vec3(0.0f,0.0f,0.0f);
}
Vec3
operator+(const Vec3 &v1, const Vec3 &v2) {
return Vec3(v1.e[0] + v2.e[0], v1.e[1] + v2.e[1], v1.e[2] + v2.e[2]);
}
Vec3
operator-(const Vec3 &v1, const Vec3 &v2) {
return Vec3(v1.e[0] - v2.e[0], v1.e[1] - v2.e[1], v1.e[2] - v2.e[2]);
}
Vec3
operator*(const Vec3 &v1, const Vec3 &v2) {
return Vec3(v1.e[0] * v2.e[0], v1.e[1] * v2.e[1], v1.e[2] * v2.e[2]);
}
Vec3
operator/(const Vec3 &v1, const Vec3 &v2) {
return Vec3(v1.e[0] / v2.e[0], v1.e[1] / v2.e[1], v1.e[2] / v2.e[2]);
}
Vec3
operator*(float t, const Vec3 &v) {
return Vec3(t*v.e[0], t*v.e[1], t*v.e[2]);
}
Vec3
operator/(const Vec3& v, float t) {
return Vec3(v.e[0]/t, v.e[1]/t, v.e[2]/t);
}
Vec3
operator*(const Vec3 &v, float t) {
return Vec3(t*v.e[0], t*v.e[1], t*v.e[2]);
}
float
dot(const Vec3 &v1, const Vec3 &v2) {
return v1.e[0] *v2.e[0] + v1.e[1] *v2.e[1] + v1.e[2] *v2.e[2];
}
Vec3
cross(const Vec3 &v1, const Vec3 &v2) {
return Vec3( (v1.e[1]*v2.e[2] - v1.e[2]*v2.e[1]),
(-(v1.e[0]*v2.e[2] - v1.e[2]*v2.e[0])),
(v1.e[0]*v2.e[1] - v1.e[1]*v2.e[0]));
}
Vec3
unit_vector(const Vec3& v)
{
return v / v.length();
}
Vec3
random_in_unit_disk(void)
{
Vec3 _point;
do {
_point = 2.0f * Vec3(RANDOM_GEN(), RANDOM_GEN(), RANDOM_GEN()) - Vec3(1.0f, 1.0f, 1.0f);
} while (dot(_point,_point) >= 1.0f);
return _point;
}
Vec3
random_in_unit_disk_2(void)
{
Vec3 _point;
do {
_point = 2.0f * Vec3(RANDOM_GEN(), RANDOM_GEN(), 0.0f) - Vec3(1.0f, 1.0f, 0.0f);
} while (dot(_point,_point) >= 1.0f);
return _point;
}
Vec3
reflect(const Vec3& vector, const Vec3& normal)
{
return vector - 2.0f*dot(vector,normal)*normal;
}
bool
refract(const Vec3& vector, const Vec3& normal, float ni_over_nt, Vec3& refracted)
{
Vec3 _uv = unit_vector(vector);
float _dt = dot(_uv, normal);
float _discriminant = 1.0f - ni_over_nt*ni_over_nt*(1.0f-_dt*_dt);
if (_discriminant > 0.0f) {
refracted = ni_over_nt*(_uv - normal*_dt) - normal*sqrt(_discriminant);
return true;
}
return false;
}