diff options
| author | Sakarias Johansson <sakarias.johansson@goodbyekansas.com> | 2023-01-16 20:58:55 +0100 |
|---|---|---|
| committer | Sakarias Johansson <sakarias.johansson@goodbyekansas.com> | 2023-01-16 20:58:55 +0100 |
| commit | 03e5a88f9b7da79749370685e8f5afaf03a25b4a (patch) | |
| tree | 9e0fd5e12bcd9739f5292864c9da9084a0030489 /racer-tracer/src/vec3.rs | |
| parent | 3167ec992f1f81b2252a2db3642fff943c4f14bf (diff) | |
| download | racer-tracer-03e5a88f9b7da79749370685e8f5afaf03a25b4a.tar.gz racer-tracer-03e5a88f9b7da79749370685e8f5afaf03a25b4a.tar.xz racer-tracer-03e5a88f9b7da79749370685e8f5afaf03a25b4a.zip | |
🎨 Add dialectric material
Diffstat (limited to 'racer-tracer/src/vec3.rs')
| -rw-r--r-- | racer-tracer/src/vec3.rs | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/racer-tracer/src/vec3.rs b/racer-tracer/src/vec3.rs index 659d3ed..9061eba 100644 --- a/racer-tracer/src/vec3.rs +++ b/racer-tracer/src/vec3.rs @@ -146,6 +146,18 @@ impl ops::Add<Vec3> for Vec3 { } } +impl ops::Add<Vec3> for &Vec3 { + type Output = Vec3; + + fn add(self, rhs: Vec3) -> Self::Output { + Vec3::new( + self.data[0] + rhs.data[0], + self.data[1] + rhs.data[1], + self.data[2] + rhs.data[2], + ) + } +} + impl ops::AddAssign<Vec3> for Vec3 { fn add_assign(&mut self, rhs: Vec3) { self.data[0] += rhs.data[0]; @@ -275,6 +287,14 @@ impl ops::Neg for Vec3 { } } +impl ops::Neg for &Vec3 { + type Output = Vec3; + + fn neg(self) -> Self::Output { + Vec3::new(-self.data[0], -self.data[1], -self.data[2]) + } +} + impl PartialEq for Vec3 { fn eq(&self, other: &Self) -> bool { self.data[0] == other.data[0] @@ -305,6 +325,14 @@ pub fn reflect(v1: &Vec3, v2: &Vec3) -> Vec3 { v1 - 2.0 * v1.dot(v2) * v2 } +pub fn refract(uv: &Vec3, n: &Vec3, etai_over_etat: f64) -> Vec3 { + let cos_theta = f64::min(dot(&-uv, n), 1.0); + + let r_out_perp = etai_over_etat * (uv + (cos_theta * n)); + let r_out_parallel = -f64::sqrt(f64::abs(1.0 - r_out_perp.length_squared())) * n; + r_out_perp + r_out_parallel +} + pub fn random_in_unit_sphere() -> Vec3 { let mut v = Vec3::random_range(-1.0, 1.0); while v.length_squared() >= 1.0 { |
