31 lines
708 B
Rust
31 lines
708 B
Rust
use crate::{
|
|
objects::{hit::Hit, materials::traits::Material},
|
|
ray::Ray,
|
|
vec3::Colour,
|
|
};
|
|
|
|
pub struct Dielectric {
|
|
refraction_index: f32,
|
|
}
|
|
|
|
impl Dielectric {
|
|
pub fn new(refraction_index: f32) -> Self {
|
|
Self {
|
|
refraction_index: refraction_index,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl Material for Dielectric {
|
|
fn scatter(&self, hit: &Hit, ray: &Ray) -> Option<(Ray, Colour)> {
|
|
let ri = if hit.front_face() {
|
|
1. / self.refraction_index
|
|
} else {
|
|
self.refraction_index
|
|
};
|
|
let unit = ray.dir().get_unit();
|
|
let refr = unit.refract(hit.n(), ri);
|
|
Some((Ray::new(*hit.p(), refr), Colour::new(1., 1., 1.)))
|
|
}
|
|
}
|