aboutsummaryrefslogtreecommitdiff
path: root/lib/material.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/material.rb')
-rw-r--r--lib/material.rb31
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