Skip to content

Commit 359afb6

Browse files
committed
Reconcile and groom material.h headers
The material.h header file in each of the projects have drifted apart in random ways. Some have had updates that others have not, there was some reordering of class definitions, and some old code was left in files but ifdef'ed out. In addition, I've made fixes with bad indentation, places where ray times were not preserved, and more.
1 parent b533377 commit 359afb6

File tree

6 files changed

+239
-295
lines changed

6 files changed

+239
-295
lines changed

books/RayTracingInOneWeekend.html

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1566,9 +1566,19 @@
15661566
it could be a mixture of those strategies. For Lambertian materials we get this simple class:
15671567

15681568
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
1569+
vec3 random_unit_vector() {
1570+
auto a = 2*pi * random_double();
1571+
auto z = 2*random_double() - 1;
1572+
auto r = sqrt(1 - z*z);
1573+
return vec3(r*cos(a), r*sin(a), z);
1574+
}
1575+
1576+
...
1577+
15691578
class lambertian : public material {
15701579
public:
15711580
lambertian(const vec3& a) : albedo(a) {}
1581+
15721582
virtual bool scatter(
15731583
const ray& r_in, const hit_record& rec, vec3& attenuation, ray& scattered
15741584
) const {
@@ -1616,6 +1626,7 @@
16161626
class metal : public material {
16171627
public:
16181628
metal(const vec3& a) : albedo(a) {}
1629+
16191630
virtual bool scatter(
16201631
const ray& r_in, const hit_record& rec, vec3& attenuation, ray& scattered
16211632
) const {
@@ -1733,9 +1744,7 @@
17331744
class metal : public material {
17341745
public:
17351746
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight
1736-
metal(const vec3& a, double f) : albedo(a) {
1737-
if (f < 1) fuzz = f; else fuzz = 1;
1738-
}
1747+
metal(const vec3& a, double f) : albedo(a), fuzz(f < 1 ? f : 1) {}
17391748
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
17401749

17411750
virtual bool scatter(
@@ -1815,12 +1824,12 @@
18151824
vec3 uv = unit_vector(v);
18161825
auto dt = dot(uv, n);
18171826
auto discriminant = 1.0 - ni_over_nt*ni_over_nt*(1-dt*dt);
1818-
if (discriminant > 0) {
1819-
refracted = ni_over_nt*(uv - n*dt) - n*sqrt(discriminant);
1820-
return true;
1821-
}
1822-
else
1827+
1828+
if (discriminant <= 0) {
18231829
return false;
1830+
1831+
refracted = ni_over_nt*(uv - n*dt) - n*sqrt(discriminant);
1832+
return true;
18241833
}
18251834
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
18261835
[Listing [refract]: <kbd>[material.h]</kbd> Refraction function]
@@ -1833,6 +1842,7 @@
18331842
class dielectric : public material {
18341843
public:
18351844
dielectric(double ri) : ref_idx(ri) {}
1845+
18361846
virtual bool scatter(
18371847
const ray& r_in, const hit_record& rec, vec3& attenuation, ray& scattered
18381848
) const {
@@ -1845,16 +1855,14 @@
18451855
if (dot(r_in.direction(), rec.normal) > 0) {
18461856
outward_normal = -rec.normal;
18471857
ni_over_nt = ref_idx;
1848-
}
1849-
else {
1858+
} else {
18501859
outward_normal = rec.normal;
18511860
ni_over_nt = 1.0 / ref_idx;
18521861
}
18531862

18541863
if (refract(r_in.direction(), outward_normal, ni_over_nt, refracted)) {
18551864
scattered = ray(rec.p, refracted);
1856-
}
1857-
else {
1865+
} else {
18581866
scattered = ray(rec.p, reflected);
18591867
return false;
18601868
}

books/RayTracingTheNextWeek.html

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -240,9 +240,9 @@
240240
public:
241241
lambertian(const vec3& a) : albedo(a) {}
242242

243-
virtual bool scatter(const ray& r_in, const hit_record& rec,
244-
vec3& attenuation, ray& scattered) const {
245-
243+
virtual bool scatter(
244+
const ray& r_in, const hit_record& rec, vec3& attenuation, ray& scattered
245+
) const {
246246
vec3 target = rec.p + rec.normal + random_unit_vector();
247247
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight
248248
scattered = ray(rec.p, target-rec.p, r_in.time());
@@ -251,7 +251,7 @@
251251
return true;
252252
}
253253

254-
vec3 albedo;
254+
vec3 albedo;
255255
};
256256
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
257257
[Listing [lambertian-animate]: <kbd>[material.h]</kbd> Lambertian matrial for moving objects]
@@ -875,7 +875,7 @@
875875
vec3 target = rec.p + rec.normal + random_unit_vector();
876876
scattered = ray(rec.p, target - rec.p);
877877
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight
878-
attenuation = albedo->value(0, 0, rec.p);
878+
attenuation = albedo->value(rec.u, rec.v, rec.p);
879879
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
880880
return true;
881881
}
@@ -1600,15 +1600,15 @@
16001600
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
16011601
class material {
16021602
public:
1603-
virtual bool scatter(
1604-
const ray& r_in, const hit_record& rec, vec3& attenuation, ray& scattered
1605-
) const = 0;
1606-
16071603
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight
16081604
virtual vec3 emitted(double u, double v, const vec3& p) const {
16091605
return vec3(0,0,0);
16101606
}
1607+
16111608
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
1609+
virtual bool scatter(
1610+
const ray& r_in, const hit_record& rec, vec3& attenuation, ray& scattered
1611+
) const = 0;
16121612
};
16131613
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
16141614
[Listing [matl-emit]: <kbd>[material.h]</kbd> New emitted function in class material]

books/RayTracingTheRestOfYourLife.html

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -806,15 +806,6 @@
806806
public:
807807
lambertian(texture *a) : albedo(a) {}
808808

809-
double scattering_pdf(
810-
const ray& r_in, const hit_record& rec, const ray& scattered
811-
) const {
812-
auto cosine = dot(rec.normal, unit_vector(scattered.direction()));
813-
if (cosine < 0)
814-
return 0;
815-
return cosine / pi;
816-
}
817-
818809
bool scatter(
819810
const ray& r_in, const hit_record& rec, vec3& alb, ray& scattered, double& pdf
820811
) const {
@@ -825,6 +816,13 @@
825816
return true;
826817
}
827818

819+
double scattering_pdf(
820+
const ray& r_in, const hit_record& rec, const ray& scattered
821+
) const {
822+
auto cosine = dot(rec.normal, unit_vector(scattered.direction()));
823+
return cosine < 0 ? 0 : cosine/pi;
824+
}
825+
828826
texture *albedo;
829827
};
830828
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -1755,6 +1753,14 @@
17551753

17561754
class material {
17571755
public:
1756+
virtual vec3 emitted(
1757+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight
1758+
const ray& r_in, const hit_record& rec, double u, double v, const vec3& p
1759+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
1760+
) const {
1761+
return vec3(0,0,0);
1762+
}
1763+
17581764
virtual bool scatter(
17591765
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight
17601766
const ray& r_in, const hit_record& rec, scatter_record& srec
@@ -1768,14 +1774,6 @@
17681774
) const {
17691775
return 0;
17701776
}
1771-
1772-
virtual vec3 emitted(
1773-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight
1774-
const ray& r_in, const hit_record& rec, double u, double v, const vec3& p
1775-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
1776-
) const {
1777-
return vec3(0,0,0);
1778-
}
17791777
};
17801778
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
17811779
[Listing [material-refactor]: <kbd>[material.h]</kbd> Refactoring the material class]
@@ -1787,19 +1785,8 @@
17871785
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
17881786
class lambertian : public material {
17891787
public:
1790-
17911788
lambertian(texture *a) : albedo(a) {}
17921789

1793-
double scattering_pdf(
1794-
const ray& r_in, const hit_record& rec, const ray& scattered
1795-
) const {
1796-
auto cosine = dot(rec.normal, unit_vector(scattered.direction()));
1797-
if (cosine < 0)
1798-
return 0;
1799-
return cosine / pi;
1800-
}
1801-
1802-
18031790
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++ highlight
18041791
bool scatter(const ray& r_in, const hit_record& rec, scatter_record& srec) const {
18051792
srec.is_specular = false;
@@ -1809,6 +1796,13 @@
18091796
}
18101797
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
18111798

1799+
double scattering_pdf(
1800+
const ray& r_in, const hit_record& rec, const ray& scattered
1801+
) const {
1802+
auto cosine = dot(rec.normal, unit_vector(scattered.direction()));
1803+
return cosine < 0 ? 0 : cosine/pi;
1804+
}
1805+
18121806
texture *albedo;
18131807
};
18141808
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -1866,6 +1860,7 @@
18661860
srec.pdf_ptr = 0;
18671861
return true;
18681862
}
1863+
18691864
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
18701865
vec3 albedo;
18711866
double fuzz;

src/InOneWeekend/material.h

Lines changed: 55 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,12 @@ bool refract(const vec3& v, const vec3& n, double ni_over_nt, vec3& refracted) {
2828
vec3 uv = unit_vector(v);
2929
auto dt = dot(uv, n);
3030
auto discriminant = 1.0 - ni_over_nt*ni_over_nt*(1-dt*dt);
31-
if (discriminant > 0) {
32-
refracted = ni_over_nt*(uv - n*dt) - n*sqrt(discriminant);
33-
return true;
34-
}
35-
else
31+
32+
if (discriminant <= 0)
3633
return false;
34+
35+
refracted = ni_over_nt*(uv - n*dt) - n*sqrt(discriminant);
36+
return true;
3737
}
3838

3939

@@ -58,6 +58,7 @@ vec3 random_in_unit_sphere() {
5858
return p;
5959
}
6060

61+
6162
vec3 random_in_hemisphere(const vec3& normal) {
6263
vec3 in_unit_sphere = random_in_unit_sphere();
6364
if (dot(in_unit_sphere, normal) > 0.0) // In the same hemisphere as the normal
@@ -75,9 +76,55 @@ class material {
7576
};
7677

7778

79+
class dielectric : public material {
80+
public:
81+
dielectric(double ri) : ref_idx(ri) {}
82+
83+
virtual bool scatter(
84+
const ray& r_in, const hit_record& rec, vec3& attenuation, ray& scattered
85+
) const {
86+
vec3 outward_normal;
87+
vec3 reflected = reflect(r_in.direction(), rec.normal);
88+
double ni_over_nt;
89+
attenuation = vec3(1.0, 1.0, 1.0);
90+
vec3 refracted;
91+
double reflect_prob;
92+
double cosine;
93+
94+
if (dot(r_in.direction(), rec.normal) > 0) {
95+
outward_normal = -rec.normal;
96+
ni_over_nt = ref_idx;
97+
cosine = dot(r_in.direction(), rec.normal) / r_in.direction().length();
98+
cosine = sqrt(1 - ref_idx*ref_idx*(1-cosine*cosine));
99+
} else {
100+
outward_normal = rec.normal;
101+
ni_over_nt = 1.0 / ref_idx;
102+
cosine = -dot(r_in.direction(), rec.normal) / r_in.direction().length();
103+
}
104+
105+
if (refract(r_in.direction(), outward_normal, ni_over_nt, refracted)) {
106+
reflect_prob = schlick(cosine, ref_idx);
107+
} else {
108+
reflect_prob = 1.0;
109+
}
110+
111+
if (random_double() < reflect_prob) {
112+
scattered = ray(rec.p, reflected);
113+
} else {
114+
scattered = ray(rec.p, refracted);
115+
}
116+
117+
return true;
118+
}
119+
120+
double ref_idx;
121+
};
122+
123+
78124
class lambertian : public material {
79125
public:
80126
lambertian(const vec3& a) : albedo(a) {}
127+
81128
virtual bool scatter(
82129
const ray& r_in, const hit_record& rec, vec3& attenuation, ray& scattered
83130
) const {
@@ -93,7 +140,8 @@ class lambertian : public material {
93140

94141
class metal : public material {
95142
public:
96-
metal(const vec3& a, double f) : albedo(a) { if (f < 1) fuzz = f; else fuzz = 1; }
143+
metal(const vec3& a, double f) : albedo(a), fuzz(f < 1 ? f : 1) {}
144+
97145
virtual bool scatter(
98146
const ray& r_in, const hit_record& rec, vec3& attenuation, ray& scattered
99147
) const {
@@ -102,52 +150,10 @@ class metal : public material {
102150
attenuation = albedo;
103151
return (dot(scattered.direction(), rec.normal) > 0);
104152
}
153+
105154
vec3 albedo;
106155
double fuzz;
107156
};
108157

109158

110-
class dielectric : public material {
111-
public:
112-
dielectric(double ri) : ref_idx(ri) {}
113-
virtual bool scatter(
114-
const ray& r_in, const hit_record& rec, vec3& attenuation, ray& scattered
115-
) const {
116-
vec3 outward_normal;
117-
vec3 reflected = reflect(r_in.direction(), rec.normal);
118-
double ni_over_nt;
119-
attenuation = vec3(1.0, 1.0, 1.0);
120-
vec3 refracted;
121-
double reflect_prob;
122-
double cosine;
123-
if (dot(r_in.direction(), rec.normal) > 0) {
124-
outward_normal = -rec.normal;
125-
ni_over_nt = ref_idx;
126-
// cosine =
127-
// ref_idx * dot(r_in.direction(), rec.normal) / r_in.direction().length();
128-
cosine = dot(r_in.direction(), rec.normal) / r_in.direction().length();
129-
cosine = sqrt(1 - ref_idx*ref_idx*(1-cosine*cosine));
130-
}
131-
else {
132-
outward_normal = rec.normal;
133-
ni_over_nt = 1.0 / ref_idx;
134-
cosine = -dot(r_in.direction(), rec.normal) / r_in.direction().length();
135-
}
136-
137-
if (refract(r_in.direction(), outward_normal, ni_over_nt, refracted))
138-
reflect_prob = schlick(cosine, ref_idx);
139-
else
140-
reflect_prob = 1.0;
141-
142-
if (random_double() < reflect_prob)
143-
scattered = ray(rec.p, reflected);
144-
else
145-
scattered = ray(rec.p, refracted);
146-
147-
return true;
148-
}
149-
150-
double ref_idx;
151-
};
152-
153159
#endif

0 commit comments

Comments
 (0)