@@ -20,8 +20,8 @@ class xy_rect: public hittable {
20
20
xy_rect () {}
21
21
22
22
xy_rect (
23
- double _x0, double _x1, double _y0, double _y1, double _k, shared_ptr<material> mat)
24
- : x0(_x0), x1(_x1), y0(_y0), y1(_y1), k(_k), mp(mat) {};
23
+ double _x0, double _x1, double _y0, double _y1, double _k, shared_ptr<material> mat
24
+ ) : x0(_x0), x1(_x1), y0(_y0), y1(_y1), k(_k), mp(mat) {};
25
25
26
26
virtual bool hit (const ray& r, double t0, double t1, hit_record& rec) const ;
27
27
@@ -40,8 +40,8 @@ class xz_rect: public hittable {
40
40
xz_rect () {}
41
41
42
42
xz_rect (
43
- double _x0, double _x1, double _z0, double _z1, double _k, shared_ptr<material> mat)
44
- : x0(_x0), x1(_x1), z0(_z0), z1(_z1), k(_k), mp(mat) {};
43
+ double _x0, double _x1, double _z0, double _z1, double _k, shared_ptr<material> mat
44
+ ) : x0(_x0), x1(_x1), z0(_z0), z1(_z1), k(_k), mp(mat) {};
45
45
46
46
virtual bool hit (const ray& r, double t0, double t1, hit_record& rec) const ;
47
47
@@ -52,14 +52,14 @@ class xz_rect: public hittable {
52
52
53
53
virtual double pdf_value (const vec3& origin, const vec3& v) const {
54
54
hit_record rec;
55
- if (this ->hit (ray (origin, v), 0.001 , infinity, rec)) {
56
- auto area = (x1-x0)*(z1-z0);
57
- auto distance_squared = rec.t * rec.t * v.length_squared ();
58
- auto cosine = fabs (dot (v, rec.normal ) / v.length ());
59
- return distance_squared / (cosine * area);
60
- }
61
- else
55
+ if (!this ->hit (ray (origin, v), 0.001 , infinity, rec))
62
56
return 0 ;
57
+
58
+ auto area = (x1-x0)*(z1-z0);
59
+ auto distance_squared = rec.t * rec.t * v.length_squared ();
60
+ auto cosine = fabs (dot (v, rec.normal ) / v.length ());
61
+
62
+ return distance_squared / (cosine * area);
63
63
}
64
64
65
65
virtual vec3 random (const vec3& origin) const {
@@ -77,8 +77,8 @@ class yz_rect: public hittable {
77
77
yz_rect () {}
78
78
79
79
yz_rect (
80
- double _y0, double _y1, double _z0, double _z1, double _k, shared_ptr<material> mat)
81
- : y0(_y0), y1(_y1), z0(_z0), z1(_z1), k(_k), mp(mat) {};
80
+ double _y0, double _y1, double _z0, double _z1, double _k, shared_ptr<material> mat
81
+ ) : y0(_y0), y1(_y1), z0(_z0), z1(_z1), k(_k), mp(mat) {};
82
82
83
83
virtual bool hit (const ray& r, double t0, double t1, hit_record& rec) const ;
84
84
@@ -96,53 +96,62 @@ bool xy_rect::hit(const ray& r, double t0, double t1, hit_record& rec) const {
96
96
auto t = (k-r.origin ().z ()) / r.direction ().z ();
97
97
if (t < t0 || t > t1)
98
98
return false ;
99
+
99
100
auto x = r.origin ().x () + t*r.direction ().x ();
100
101
auto y = r.origin ().y () + t*r.direction ().y ();
101
102
if (x < x0 || x > x1 || y < y0 || y > y1)
102
103
return false ;
104
+
103
105
rec.u = (x-x0)/(x1-x0);
104
106
rec.v = (y-y0)/(y1-y0);
105
107
rec.t = t;
106
108
vec3 outward_normal = vec3 (0 , 0 , 1 );
107
109
rec.set_face_normal (r, outward_normal);
108
110
rec.mat_ptr = mp;
109
111
rec.p = r.at (t);
112
+
110
113
return true ;
111
114
}
112
115
113
116
bool xz_rect::hit (const ray& r, double t0, double t1, hit_record& rec) const {
114
117
auto t = (k-r.origin ().y ()) / r.direction ().y ();
115
118
if (t < t0 || t > t1)
116
119
return false ;
120
+
117
121
auto x = r.origin ().x () + t*r.direction ().x ();
118
122
auto z = r.origin ().z () + t*r.direction ().z ();
119
123
if (x < x0 || x > x1 || z < z0 || z > z1)
120
124
return false ;
125
+
121
126
rec.u = (x-x0)/(x1-x0);
122
127
rec.v = (z-z0)/(z1-z0);
123
128
rec.t = t;
124
129
vec3 outward_normal = vec3 (0 , 1 , 0 );
125
130
rec.set_face_normal (r, outward_normal);
126
131
rec.mat_ptr = mp;
127
132
rec.p = r.at (t);
133
+
128
134
return true ;
129
135
}
130
136
131
137
bool yz_rect::hit (const ray& r, double t0, double t1, hit_record& rec) const {
132
138
auto t = (k-r.origin ().x ()) / r.direction ().x ();
133
139
if (t < t0 || t > t1)
134
140
return false ;
141
+
135
142
auto y = r.origin ().y () + t*r.direction ().y ();
136
143
auto z = r.origin ().z () + t*r.direction ().z ();
137
144
if (y < y0 || y > y1 || z < z0 || z > z1)
138
145
return false ;
146
+
139
147
rec.u = (y-y0)/(y1-y0);
140
148
rec.v = (z-z0)/(z1-z0);
141
149
rec.t = t;
142
150
vec3 outward_normal = vec3 (1 , 0 , 0 );
143
151
rec.set_face_normal (r, outward_normal);
144
152
rec.mat_ptr = mp;
145
153
rec.p = r.at (t);
154
+
146
155
return true ;
147
156
}
148
157
0 commit comments