@@ -47,12 +47,8 @@ impl Lambert {
47
47
impl Scatter for Lambert {
48
48
fn scatter ( & self , _ray_in : & Ray , rec : & HitRecord , attenuation : & mut Vec3D , scattered : & mut Ray ) -> bool {
49
49
let target = rec. p + rec. normal + random_in_unit_sphere ( ) ;
50
- let new_scattered = Ray :: new ( rec. p , target - rec. p ) ;
51
- scattered. direction = new_scattered. direction ;
52
- scattered. origin = new_scattered. origin ;
53
- attenuation. x = self . albedo . x ;
54
- attenuation. y = self . albedo . y ;
55
- attenuation. z = self . albedo . z ;
50
+ * scattered = Ray :: new ( rec. p , target - rec. p ) ;
51
+ * attenuation = self . albedo ;
56
52
true
57
53
}
58
54
}
@@ -75,12 +71,8 @@ impl Metal {
75
71
impl Scatter for Metal {
76
72
fn scatter ( & self , ray_in : & Ray , rec : & HitRecord , attenuation : & mut Vec3D , scattered : & mut Ray ) -> bool {
77
73
let reflected = reflect ( ray_in. direction . unit ( ) , rec. normal ) ;
78
- let new_scattered = Ray :: new ( rec. p , reflected + random_in_unit_sphere ( ) * self . fuzz ) ;
79
- scattered. direction = new_scattered. direction ;
80
- scattered. origin = new_scattered. origin ;
81
- attenuation. x = self . albedo . x ;
82
- attenuation. y = self . albedo . y ;
83
- attenuation. z = self . albedo . z ;
74
+ * scattered = Ray :: new ( rec. p , reflected + random_in_unit_sphere ( ) * self . fuzz ) ;
75
+ * attenuation = self . albedo ;
84
76
scattered. direction . dot ( rec. normal ) > 0.0
85
77
}
86
78
}
@@ -102,23 +94,21 @@ impl Scatter for Dielectric {
102
94
fn scatter ( & self , ray_in : & Ray , rec : & HitRecord , attenuation : & mut Vec3D , scattered : & mut Ray ) -> bool {
103
95
let outward_normal: Vec3D ;
104
96
let ni_over_nt: f64 ;
105
- let mut refracted = Vec3D :: new ( 0 .0, 0 .0, 0 .0) ;
97
+ let mut refracted = Vec3D :: new ( 1 .0, 1 .0, 1 .0) ;
106
98
let reflect_prob: f64 ;
107
99
let cosine: f64 ;
108
100
109
- let reflected = reflect ( ray_in. direction . unit ( ) , rec. normal ) ;
110
- attenuation. x = 1.0 ;
111
- attenuation. y = 1.0 ;
112
- attenuation. z = 1.0 ;
101
+ let reflected = reflect ( ray_in. direction , rec. normal ) ;
102
+ * attenuation = Vec3D :: new ( 1.0 , 1.0 , 1.0 ) ;
113
103
114
104
if ray_in. direction . dot ( rec. normal ) > 0.0 {
115
105
outward_normal = rec. normal * -1.0 ;
116
106
ni_over_nt = self . ref_idx ;
117
107
cosine = self . ref_idx * ray_in. direction . dot ( rec. normal ) / ray_in. direction . mag ( ) ;
118
108
} else {
119
- outward_normal = rec. normal ;
109
+ outward_normal = rec. normal * 1.0 ;
120
110
ni_over_nt = 1.0 / self . ref_idx ;
121
- cosine = ray_in. direction . dot ( rec. normal ) * -1.0 / ray_in. direction . mag ( ) ;
111
+ cosine = ( ray_in. direction . dot ( rec. normal ) * -1.0 ) / ray_in. direction . mag ( ) ;
122
112
}
123
113
124
114
if refract ( ray_in. direction , outward_normal, ni_over_nt, & mut refracted) {
@@ -128,13 +118,9 @@ impl Scatter for Dielectric {
128
118
}
129
119
130
120
if rand:: random :: < f64 > ( ) < reflect_prob {
131
- // let new_scattered = Ray::new(rec.p, reflected);
132
- scattered. direction = reflected;
133
- scattered. origin = rec. p ;
121
+ * scattered = Ray :: new ( rec. p , reflected) ;
134
122
} else {
135
- // let new_scattered = Ray::new(rec.p, refracted);
136
- scattered. direction = refracted;
137
- scattered. origin = rec. p ;
123
+ * scattered = Ray :: new ( rec. p , refracted) ;
138
124
}
139
125
140
126
true
0 commit comments