diff options
Diffstat (limited to 'lib/material.rb')
-rw-r--r-- | lib/material.rb | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/lib/material.rb b/lib/material.rb index c935147..752b85f 100644 --- a/lib/material.rb +++ b/lib/material.rb @@ -36,3 +36,34 @@ class Metal < Material end end end + +class Dielectric < Material + def initialize(ref_index) + @ref_index = ref_index + end + + def attenuation + Colour.new(1.0, 1.0, 1.0) + end + + def scatter(ray, record) + ri = record.front_face ? (1.0 / @ref_index) : @ref_index + unit_dir = ray.direction.unit + costheta = [(-unit_dir).dot(record.normal), 1.0].min + sintheta = (1.0 - costheta ** 2) ** 0.5 + + cannot_refract = ri * sintheta > 1.0 + maybe_reflect_anyway = Dielectric.reflectance(costheta, ri) > rand + + refr = cannot_refract || maybe_reflect_anyway ? + unit_dir.reflect(record.normal) : + unit_dir.refract(record.normal, ri) + + Ray.new(record.point, refr) + end + + def self.reflectance(costheta, ri) + r0 = ((1.0 - ri) / (1.0 + ri)) ** 2 + r0 + (1.0 - r0) * (1.0 - costheta) ** 5 + end +end |